summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKim van der Riet <kpvdr@apache.org>2012-05-04 15:39:19 +0000
committerKim van der Riet <kpvdr@apache.org>2012-05-04 15:39:19 +0000
commit633c33f224f3196f3f9bd80bd2e418d8143fea06 (patch)
tree1391da89470593209466df68c0b40b89c14963b1
parentc73f9286ebff93a6c8dbc29cf05e258c4b55c976 (diff)
downloadqpid-python-633c33f224f3196f3f9bd80bd2e418d8143fea06.tar.gz
QPID-3858: Updated branch - merged from trunk r.1333987
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/asyncstore@1334037 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--QPID_VERSION.txt2
-rwxr-xr-xbin/install-cpp-python76
-rw-r--r--cc/LICENSE206
-rw-r--r--cc/NOTICE8
-rw-r--r--cc/README.txt84
-rw-r--r--cc/config.properties25
-rw-r--r--cc/config.xml37
-rw-r--r--cc/config/bdbstore-cpp-trunk.xml54
-rw-r--r--cc/config/cpp-perftests.xml63
-rw-r--r--cc/config/cpp-trunk.xml59
-rw-r--r--cc/config/dotnet-trunk.xml63
-rw-r--r--cc/config/example-automation.xml58
-rw-r--r--cc/config/java-jmstck.xml63
-rw-r--r--cc/config/java-perftests.xml72
-rw-r--r--cc/config/java-trunk.xml142
-rw-r--r--cc/config/java/cpp.noprefetch.testprofile22
-rw-r--r--cc/config/java/cpp.testprofile21
-rw-r--r--cc/config/java/jndi.properties42
-rw-r--r--cc/dashboard-config.xml31
-rwxr-xr-xcc/scripts/bdbstorecppbuild.sh24
-rw-r--r--cc/scripts/build.xml30
-rwxr-xr-xcc/scripts/check_examples.sh69
-rwxr-xr-xcc/scripts/cppbuild-perftests.sh23
-rwxr-xr-xcc/scripts/cppbuild.sh21
-rw-r--r--cc/scripts/dotnetbuild.sh21
-rwxr-xr-xcc/scripts/javaconfig.sh27
-rw-r--r--cc/scripts/javajmstck.sh80
-rwxr-xr-xcc/scripts/javareport.sh25
-rw-r--r--cc/scripts/runbroker.sh42
-rw-r--r--cc/scripts/stopbroker.sh31
-rwxr-xr-xcc/scripts/verify100
-rwxr-xr-xcc/scripts/verify_all166
-rw-r--r--cpp/bindings/qmf/ruby/qmf.rb26
-rwxr-xr-xcpp/bindings/qmf/tests/run_interop_tests3
-rw-r--r--cpp/bindings/qpid/Makefile.am2
-rw-r--r--cpp/bindings/qpid/dotnet/Makefile.am2
-rw-r--r--cpp/bindings/qpid/python/python.i42
-rw-r--r--cpp/bindings/qpid/ruby/README.rdoc2
-rw-r--r--cpp/bindings/qpid/ruby/Rakefile4
-rw-r--r--cpp/bindings/qpid/ruby/features/step_definitions/address_steps.rb19
-rw-r--r--cpp/bindings/qpid/ruby/features/step_definitions/connection_steps.rb19
-rw-r--r--cpp/bindings/qpid/ruby/features/step_definitions/receiver_steps.rb19
-rw-r--r--cpp/bindings/qpid/ruby/features/step_definitions/sender_steps.rb19
-rw-r--r--cpp/bindings/qpid/ruby/features/step_definitions/session_steps.rb19
-rw-r--r--cpp/bindings/qpid/ruby/lib/qpid/encoding.rb6
-rw-r--r--cpp/bindings/qpid/ruby/lib/qpid/version.rb2
-rw-r--r--cpp/bindings/swig_python_typemaps.i6
-rw-r--r--cpp/configure.ac75
-rw-r--r--cpp/design_docs/new-ha-design.txt93
-rw-r--r--cpp/etc/Makefile.am25
-rw-r--r--cpp/etc/cluster.conf-example.xml.in70
-rwxr-xr-xcpp/etc/qpidd118
-rwxr-xr-xcpp/etc/qpidd-primary.in102
-rwxr-xr-xcpp/etc/qpidd.in119
-rw-r--r--cpp/include/qpid/Options.h4
-rw-r--r--cpp/include/qpid/Url.h6
-rw-r--r--cpp/include/qpid/framing/Array.h22
-rw-r--r--cpp/include/qpid/framing/FieldTable.h56
-rw-r--r--cpp/include/qpid/framing/SequenceNumber.h6
-rw-r--r--cpp/include/qpid/framing/SequenceSet.h6
-rw-r--r--cpp/include/qpid/types/Variant.h4
-rw-r--r--cpp/managementgen/qmfgen/management-types.xml2
-rwxr-xr-xcpp/managementgen/qmfgen/schema.py14
-rw-r--r--cpp/managementgen/qmfgen/templates/Class.h59
-rw-r--r--cpp/managementgen/qmfgen/templates/Event.h13
-rw-r--r--cpp/managementgen/qmfgen/templates/Package.h5
-rwxr-xr-xcpp/rubygen/framing.0-10/structs.rb26
-rw-r--r--cpp/src/CMakeLists.txt52
-rw-r--r--cpp/src/Makefile.am25
-rw-r--r--cpp/src/acl.mk2
-rw-r--r--cpp/src/config.h.cmake1
-rw-r--r--cpp/src/ha.mk16
-rw-r--r--cpp/src/posix/QpiddBroker.cpp17
-rw-r--r--cpp/src/qmf.mk1
-rw-r--r--cpp/src/qmf/BrokerImportExport.h42
-rw-r--r--cpp/src/qpid/Options.cpp7
-rw-r--r--cpp/src/qpid/Url.cpp17
-rw-r--r--cpp/src/qpid/UrlArray.cpp2
-rw-r--r--cpp/src/qpid/UrlArray.h1
-rw-r--r--cpp/src/qpid/acl/Acl.cpp183
-rw-r--r--cpp/src/qpid/acl/Acl.h75
-rw-r--r--cpp/src/qpid/acl/AclConnectionCounter.cpp214
-rw-r--r--cpp/src/qpid/acl/AclConnectionCounter.h81
-rw-r--r--cpp/src/qpid/acl/AclData.cpp572
-rw-r--r--cpp/src/qpid/acl/AclData.h89
-rw-r--r--cpp/src/qpid/acl/AclPlugin.cpp4
-rw-r--r--cpp/src/qpid/acl/AclReader.cpp222
-rw-r--r--cpp/src/qpid/acl/AclReader.h80
-rw-r--r--cpp/src/qpid/acl/AclValidator.cpp61
-rw-r--r--cpp/src/qpid/acl/AclValidator.h24
-rw-r--r--cpp/src/qpid/acl/management-schema.xml34
-rw-r--r--cpp/src/qpid/agent/ManagementAgentImpl.cpp11
-rw-r--r--cpp/src/qpid/broker/AclModule.h191
-rw-r--r--cpp/src/qpid/broker/Bridge.cpp15
-rw-r--r--cpp/src/qpid/broker/Bridge.h13
-rw-r--r--cpp/src/qpid/broker/Broker.cpp7
-rw-r--r--cpp/src/qpid/broker/Broker.h87
-rw-r--r--cpp/src/qpid/broker/Connection.cpp16
-rw-r--r--cpp/src/qpid/broker/Connection.h5
-rw-r--r--cpp/src/qpid/broker/ConnectionHandler.cpp1
-rw-r--r--cpp/src/qpid/broker/ConnectionHandler.h1
-rw-r--r--cpp/src/qpid/broker/DirectExchange.cpp3
-rw-r--r--cpp/src/qpid/broker/DirectExchange.h4
-rw-r--r--cpp/src/qpid/broker/DtxManager.cpp29
-rw-r--r--cpp/src/qpid/broker/DtxManager.h3
-rw-r--r--cpp/src/qpid/broker/DtxWorkRecord.cpp11
-rw-r--r--cpp/src/qpid/broker/Exchange.cpp28
-rw-r--r--cpp/src/qpid/broker/Exchange.h2
-rw-r--r--cpp/src/qpid/broker/ExchangeRegistry.cpp3
-rw-r--r--cpp/src/qpid/broker/ExchangeRegistry.h6
-rw-r--r--cpp/src/qpid/broker/Fairshare.cpp1
-rw-r--r--cpp/src/qpid/broker/FanOutExchange.cpp2
-rw-r--r--cpp/src/qpid/broker/FanOutExchange.h4
-rw-r--r--cpp/src/qpid/broker/HeadersExchange.cpp3
-rw-r--r--cpp/src/qpid/broker/HeadersExchange.h4
-rw-r--r--cpp/src/qpid/broker/LegacyLVQ.cpp29
-rw-r--r--cpp/src/qpid/broker/LegacyLVQ.h1
-rw-r--r--cpp/src/qpid/broker/Link.cpp263
-rw-r--r--cpp/src/qpid/broker/Link.h58
-rw-r--r--cpp/src/qpid/broker/LinkRegistry.cpp31
-rw-r--r--cpp/src/qpid/broker/LinkRegistry.h110
-rw-r--r--cpp/src/qpid/broker/Message.cpp8
-rw-r--r--cpp/src/qpid/broker/MessageDeque.cpp20
-rw-r--r--cpp/src/qpid/broker/MessageDeque.h7
-rw-r--r--cpp/src/qpid/broker/MessageGroupManager.cpp92
-rw-r--r--cpp/src/qpid/broker/MessageGroupManager.h19
-rw-r--r--cpp/src/qpid/broker/MessageMap.cpp78
-rw-r--r--cpp/src/qpid/broker/MessageMap.h2
-rw-r--r--cpp/src/qpid/broker/PriorityQueue.cpp118
-rw-r--r--cpp/src/qpid/broker/PriorityQueue.h27
-rw-r--r--cpp/src/qpid/broker/Queue.cpp667
-rw-r--r--cpp/src/qpid/broker/Queue.h147
-rw-r--r--cpp/src/qpid/broker/QueueListeners.cpp4
-rw-r--r--cpp/src/qpid/broker/QueueListeners.h7
-rw-r--r--cpp/src/qpid/broker/QueuedMessage.cpp34
-rw-r--r--cpp/src/qpid/broker/QueuedMessage.h3
-rw-r--r--cpp/src/qpid/broker/SaslAuthenticator.cpp1
-rw-r--r--cpp/src/qpid/broker/SemanticState.cpp4
-rw-r--r--cpp/src/qpid/broker/SemanticState.h65
-rw-r--r--cpp/src/qpid/broker/SessionAdapter.cpp51
-rw-r--r--cpp/src/qpid/broker/SessionAdapter.h4
-rw-r--r--cpp/src/qpid/broker/SessionHandler.cpp5
-rw-r--r--cpp/src/qpid/broker/SessionHandler.h10
-rw-r--r--cpp/src/qpid/broker/TopicExchange.cpp3
-rw-r--r--cpp/src/qpid/broker/TopicExchange.h4
-rw-r--r--cpp/src/qpid/broker/windows/SaslAuthenticator.cpp1
-rw-r--r--cpp/src/qpid/client/Connection.cpp2
-rw-r--r--cpp/src/qpid/client/ConnectionHandler.cpp10
-rw-r--r--cpp/src/qpid/client/ConnectionImpl.cpp4
-rw-r--r--cpp/src/qpid/client/LoadPlugins.cpp6
-rw-r--r--cpp/src/qpid/client/SessionImpl.cpp2
-rw-r--r--cpp/src/qpid/client/SslConnector.cpp4
-rw-r--r--cpp/src/qpid/client/TCPConnector.cpp8
-rw-r--r--cpp/src/qpid/client/amqp0_10/AddressResolution.cpp1
-rw-r--r--cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp3
-rw-r--r--cpp/src/qpid/cluster/Cluster.cpp28
-rw-r--r--cpp/src/qpid/cluster/ClusterMap.cpp4
-rw-r--r--cpp/src/qpid/cluster/ClusterTimer.cpp2
-rw-r--r--cpp/src/qpid/cluster/Connection.cpp49
-rw-r--r--cpp/src/qpid/cluster/Connection.h2
-rw-r--r--cpp/src/qpid/cluster/CredentialsExchange.cpp3
-rw-r--r--cpp/src/qpid/cluster/CredentialsExchange.h2
-rw-r--r--cpp/src/qpid/cluster/FailoverExchange.cpp2
-rw-r--r--cpp/src/qpid/cluster/FailoverExchange.h2
-rw-r--r--cpp/src/qpid/cluster/InitialStatusMap.cpp2
-rw-r--r--cpp/src/qpid/cluster/UpdateClient.cpp11
-rw-r--r--cpp/src/qpid/cluster/UpdateDataExchange.cpp4
-rw-r--r--cpp/src/qpid/cluster/UpdateDataExchange.h3
-rw-r--r--cpp/src/qpid/framing/AMQFrame.h3
-rw-r--r--cpp/src/qpid/framing/BodyHandler.cpp56
-rw-r--r--cpp/src/qpid/framing/BodyHandler.h56
-rw-r--r--cpp/src/qpid/framing/FieldTable.cpp219
-rw-r--r--cpp/src/qpid/framing/FrameSet.cpp5
-rw-r--r--cpp/src/qpid/framing/FrameSet.h1
-rw-r--r--cpp/src/qpid/framing/MethodContent.h2
-rw-r--r--cpp/src/qpid/framing/TransferContent.cpp2
-rw-r--r--cpp/src/qpid/framing/TransferContent.h2
-rw-r--r--cpp/src/qpid/framing/amqp_framing.h1
-rw-r--r--cpp/src/qpid/ha/Backup.cpp36
-rw-r--r--cpp/src/qpid/ha/Backup.h4
-rw-r--r--cpp/src/qpid/ha/BrokerReplicator.cpp190
-rw-r--r--cpp/src/qpid/ha/BrokerReplicator.h16
-rw-r--r--cpp/src/qpid/ha/HaBroker.cpp95
-rw-r--r--cpp/src/qpid/ha/HaBroker.h8
-rw-r--r--cpp/src/qpid/ha/HaPlugin.cpp28
-rw-r--r--cpp/src/qpid/ha/QueueReplicator.cpp62
-rw-r--r--cpp/src/qpid/ha/QueueReplicator.h5
-rw-r--r--cpp/src/qpid/ha/ReplicateLevel.cpp72
-rw-r--r--cpp/src/qpid/ha/ReplicateLevel.h52
-rw-r--r--cpp/src/qpid/ha/ReplicatingSubscription.cpp71
-rw-r--r--cpp/src/qpid/ha/ReplicatingSubscription.h4
-rw-r--r--cpp/src/qpid/ha/Settings.h7
-rw-r--r--cpp/src/qpid/ha/management-schema.xml35
-rw-r--r--cpp/src/qpid/log/Statement.cpp44
-rw-r--r--cpp/src/qpid/log/posix/SinkOptions.cpp8
-rw-r--r--cpp/src/qpid/management/ManagementAgent.cpp79
-rw-r--r--cpp/src/qpid/management/ManagementAgent.h4
-rw-r--r--cpp/src/qpid/management/ManagementDirectExchange.cpp8
-rw-r--r--cpp/src/qpid/management/ManagementDirectExchange.h4
-rw-r--r--cpp/src/qpid/management/ManagementTopicExchange.cpp8
-rw-r--r--cpp/src/qpid/management/ManagementTopicExchange.h4
-rw-r--r--cpp/src/qpid/replication/ReplicatingEventListener.cpp4
-rw-r--r--cpp/src/qpid/replication/ReplicationExchange.cpp11
-rw-r--r--cpp/src/qpid/replication/ReplicationExchange.h2
-rw-r--r--cpp/src/qpid/store/MessageStorePlugin.cpp6
-rw-r--r--cpp/src/qpid/store/ms-clfs/MessageLog.cpp8
-rw-r--r--cpp/src/qpid/store/ms-clfs/Transaction.h1
-rw-r--r--cpp/src/qpid/store/ms-clfs/TransactionLog.cpp8
-rw-r--r--cpp/src/qpid/sys/MemStat.h (renamed from cpp/include/qpid/sys/MemStat.h)0
-rw-r--r--cpp/src/qpid/sys/Probes.h65
-rw-r--r--cpp/src/qpid/sys/apr/APRBase.cpp89
-rw-r--r--cpp/src/qpid/sys/apr/APRBase.h74
-rw-r--r--cpp/src/qpid/sys/apr/APRPool.cpp41
-rw-r--r--cpp/src/qpid/sys/apr/APRPool.h50
-rw-r--r--cpp/src/qpid/sys/apr/Condition.h84
-rw-r--r--cpp/src/qpid/sys/apr/Mutex.h124
-rw-r--r--cpp/src/qpid/sys/apr/Shlib.cpp49
-rw-r--r--cpp/src/qpid/sys/apr/Socket.cpp114
-rw-r--r--cpp/src/qpid/sys/apr/Thread.cpp34
-rw-r--r--cpp/src/qpid/sys/apr/Thread.h106
-rw-r--r--cpp/src/qpid/sys/apr/Time.cpp36
-rw-r--r--cpp/src/qpid/sys/posix/AsynchIO.cpp38
-rw-r--r--cpp/src/qpid/sys/posix/PollableCondition.cpp5
-rw-r--r--cpp/src/qpid/sys/ssl/SslIo.cpp7
-rw-r--r--cpp/src/qpid/sys/windows/AsynchIO.cpp100
-rw-r--r--cpp/src/qpid/sys/windows/PollableCondition.cpp5
-rw-r--r--cpp/src/qpid/sys/windows/Socket.cpp10
-rw-r--r--cpp/src/qpid/sys/windows/SslAsynchIO.cpp8
-rw-r--r--cpp/src/qpid/xml/XmlExchange.cpp4
-rw-r--r--cpp/src/qpid/xml/XmlExchange.h2
-rw-r--r--cpp/src/qpidd.cpp4
-rw-r--r--cpp/src/qpidd.h4
-rw-r--r--cpp/src/tests/Array.cpp4
-rw-r--r--cpp/src/tests/CMakeLists.txt25
-rw-r--r--cpp/src/tests/ExchangeTest.cpp46
-rw-r--r--cpp/src/tests/FieldTable.cpp4
-rw-r--r--cpp/src/tests/Frame.cpp1
-rw-r--r--cpp/src/tests/FramingTest.cpp1
-rw-r--r--cpp/src/tests/Makefile.am23
-rw-r--r--cpp/src/tests/MessagingSessionTests.cpp7
-rw-r--r--cpp/src/tests/QueueFlowLimitTest.cpp1
-rw-r--r--cpp/src/tests/QueueTest.cpp52
-rw-r--r--cpp/src/tests/RefCounted.cpp6
-rw-r--r--cpp/src/tests/SessionState.cpp1
-rw-r--r--cpp/src/tests/StringUtils.cpp6
-rw-r--r--cpp/src/tests/Uuid.cpp2
-rwxr-xr-xcpp/src/tests/acl.py957
-rwxr-xr-xcpp/src/tests/ais_check34
-rw-r--r--cpp/src/tests/amqp_0_10/Map.cpp98
-rw-r--r--cpp/src/tests/amqp_0_10/ProxyTemplate.cpp49
-rw-r--r--cpp/src/tests/amqp_0_10/apply.cpp99
-rw-r--r--cpp/src/tests/amqp_0_10/handlers.cpp125
-rw-r--r--cpp/src/tests/amqp_0_10/serialize.cpp429
-rw-r--r--cpp/src/tests/brokertest.py56
-rwxr-xr-xcpp/src/tests/cli_tests.py139
-rw-r--r--cpp/src/tests/cluster.cmake2
-rw-r--r--cpp/src/tests/cluster.mk11
-rwxr-xr-xcpp/src/tests/cluster_failover19
-rwxr-xr-xcpp/src/tests/cluster_python_tests3
-rwxr-xr-xcpp/src/tests/cluster_read_credit4
-rwxr-xr-xcpp/src/tests/cluster_test_logs.py6
-rwxr-xr-xcpp/src/tests/cluster_tests.py122
-rwxr-xr-xcpp/src/tests/clustered_replication_test27
-rwxr-xr-xcpp/src/tests/cpg_check.sh.in38
-rwxr-xr-xcpp/src/tests/federated_cluster_test35
-rwxr-xr-xcpp/src/tests/ha_tests.py523
-rw-r--r--cpp/src/tests/install_env.sh.in2
-rwxr-xr-xcpp/src/tests/ipv6_test9
-rw-r--r--cpp/src/tests/logging.cpp9
-rw-r--r--cpp/src/tests/python_tests.ps15
-rwxr-xr-xcpp/src/tests/qpid-cluster-benchmark29
-rwxr-xr-xcpp/src/tests/qpid-cpp-benchmark69
-rw-r--r--cpp/src/tests/qpid-perftest.cpp12
-rw-r--r--cpp/src/tests/qpid-ping.cpp27
-rw-r--r--cpp/src/tests/qpid-send.cpp67
-rw-r--r--cpp/src/tests/qpid-txtest.cpp5
-rw-r--r--cpp/src/tests/qpidd-empty.conf3
-rw-r--r--cpp/src/tests/queue_flow_limit_tests.py2
-rwxr-xr-xcpp/src/tests/reliable_replication_test6
-rwxr-xr-xcpp/src/tests/replication_test34
-rwxr-xr-xcpp/src/tests/ring_queue_test2
-rwxr-xr-xcpp/src/tests/run_acl_tests24
-rw-r--r--cpp/src/tests/run_acl_tests.ps15
-rwxr-xr-xcpp/src/tests/run_cli_tests4
-rwxr-xr-xcpp/src/tests/run_cluster_authentication_soak3
-rwxr-xr-xcpp/src/tests/run_cluster_authentication_test3
-rwxr-xr-xcpp/src/tests/run_cluster_test3
-rwxr-xr-xcpp/src/tests/run_cluster_tests4
-rwxr-xr-xcpp/src/tests/run_failover_soak3
-rwxr-xr-xcpp/src/tests/run_federation_sys_tests8
-rwxr-xr-xcpp/src/tests/run_federation_tests15
-rw-r--r--cpp/src/tests/run_federation_tests.ps13
-rw-r--r--cpp/src/tests/run_header_test.ps13
-rwxr-xr-xcpp/src/tests/run_msg_group_tests8
-rwxr-xr-xcpp/src/tests/run_msg_group_tests_soak4
-rw-r--r--cpp/src/tests/run_store_tests.ps19
-rw-r--r--cpp/src/tests/run_test.ps15
-rw-r--r--cpp/src/tests/sasl.mk21
-rwxr-xr-xcpp/src/tests/sasl_fed16
-rwxr-xr-xcpp/src/tests/sasl_fed_ex12
-rwxr-xr-xcpp/src/tests/sasl_fed_ex_dynamic_cluster4
-rwxr-xr-xcpp/src/tests/sasl_fed_ex_link_cluster3
-rwxr-xr-xcpp/src/tests/sasl_fed_ex_queue_cluster3
-rwxr-xr-xcpp/src/tests/sasl_fed_ex_route_cluster3
-rwxr-xr-xcpp/src/tests/ssl_test13
-rwxr-xr-xcpp/src/tests/start_cluster3
-rw-r--r--cpp/src/tests/test_env.ps1.in78
-rw-r--r--cpp/src/tests/test_env.sh.in2
-rw-r--r--cpp/src/tests/testagent.cpp11
-rw-r--r--cpp/src/tests/testlib.py4
-rw-r--r--cpp/src/tests/windows/DisableWin32ErrorWindows.cpp6
-rw-r--r--cpp/src/windows/QpiddBroker.cpp12
-rw-r--r--cpp/src/windows/SCM.cpp664
-rw-r--r--cpp/xml/cluster.xml6
-rw-r--r--doc/book/Makefile37
-rw-r--r--doc/book/README.txt118
-rwxr-xr-xdoc/book/build-book.sh63
-rwxr-xr-xdoc/book/build-chapter.sh44
-rwxr-xr-xdoc/book/build.sh40
-rw-r--r--doc/book/build.xml193
-rw-r--r--doc/book/src/AMQP-Messaging-Broker-CPP-Book.xml76
-rw-r--r--doc/book/src/AMQP-Messaging-Broker-CPP.xml70
-rw-r--r--doc/book/src/AMQP-Messaging-Broker-Java.xml72
-rw-r--r--doc/book/src/Broker-Configuration-Guide.xml28
-rw-r--r--doc/book/src/How-to-Use-JNDI.xml175
-rw-r--r--doc/book/src/LVQ.xml182
-rw-r--r--doc/book/src/Makefile.inc63
-rw-r--r--doc/book/src/Management-Console-Security.xml252
-rw-r--r--doc/book/src/Managing-CPP-Broker.xml462
-rw-r--r--doc/book/src/Programming-In-Apache-Qpid.xml6500
-rw-r--r--doc/book/src/Qpid-JMX-Management-Console-User-Guide.xml793
-rw-r--r--doc/book/src/Security.xml1217
-rw-r--r--doc/book/src/Starting-a-cluster.xml561
-rw-r--r--doc/book/src/amqp-advanced-message-queueing-protocol.html237
-rw-r--r--doc/book/src/common/css/style.css279
-rw-r--r--doc/book/src/cpp-broker/AMQP-Compatibility.xml (renamed from doc/book/src/AMQP-Compatibility.xml)0
-rw-r--r--doc/book/src/cpp-broker/AMQP-Messaging-Broker-CPP-Book.xml75
-rw-r--r--doc/book/src/cpp-broker/Active-Active-Cluster.xml561
-rw-r--r--doc/book/src/cpp-broker/Active-Passive-Cluster.xml661
-rw-r--r--doc/book/src/cpp-broker/Cheat-Sheet-for-configuring-Exchange-Options.xml (renamed from doc/book/src/Cheat-Sheet-for-configuring-Exchange-Options.xml)0
-rw-r--r--doc/book/src/cpp-broker/Cheat-Sheet-for-configuring-Queue-Options.xml (renamed from doc/book/src/Cheat-Sheet-for-configuring-Queue-Options.xml)0
-rw-r--r--doc/book/src/cpp-broker/HA-Queue-Replication.xml54
-rw-r--r--doc/book/src/cpp-broker/LVQ.xml181
-rw-r--r--doc/book/src/cpp-broker/Makefile20
-rw-r--r--doc/book/src/cpp-broker/Managing-CPP-Broker.xml485
-rw-r--r--doc/book/src/cpp-broker/QMF-Python-Console-Tutorial.xml (renamed from doc/book/src/QMF-Python-Console-Tutorial.xml)0
-rw-r--r--doc/book/src/cpp-broker/Qpid-Interoperability-Documentation.xml (renamed from doc/book/src/Qpid-Interoperability-Documentation.xml)0
-rw-r--r--doc/book/src/cpp-broker/Qpid-Management-Framework.xml (renamed from doc/book/src/Qpid-Management-Framework.xml)0
-rw-r--r--doc/book/src/cpp-broker/Running-CPP-Broker.xml (renamed from doc/book/src/Running-CPP-Broker.xml)0
-rw-r--r--doc/book/src/cpp-broker/Security.xml1258
-rw-r--r--doc/book/src/cpp-broker/Using-Broker-Federation.xml (renamed from doc/book/src/Using-Broker-Federation.xml)0
-rw-r--r--doc/book/src/cpp-broker/Using-message-groups.xml (renamed from doc/book/src/Using-message-groups.xml)0
-rw-r--r--doc/book/src/cpp-broker/producer-flow-control.xml (renamed from doc/book/src/producer-flow-control.xml)0
-rw-r--r--doc/book/src/cpp-broker/queue-state-replication.xml (renamed from doc/book/src/queue-state-replication.xml)0
-rw-r--r--doc/book/src/css/style.css129
-rw-r--r--doc/book/src/java-broker/AMQP-Messaging-Broker-Java-Book.xml (renamed from doc/book/src/AMQP-Messaging-Broker-Java-Book.xml)0
-rw-r--r--doc/book/src/java-broker/Add-New-Users.xml (renamed from doc/book/src/Add-New-Users.xml)0
-rw-r--r--doc/book/src/java-broker/Broker-Configuration-Guide.xml28
-rw-r--r--doc/book/src/java-broker/Configure-ACLs.xml (renamed from doc/book/src/Configure-ACLs.xml)0
-rw-r--r--doc/book/src/java-broker/Configure-Java-Qpid-to-use-a-SSL-connection.xml (renamed from doc/book/src/Configure-Java-Qpid-to-use-a-SSL-connection.xml)0
-rw-r--r--doc/book/src/java-broker/Configure-Log4j-CompositeRolling-Appender.xml (renamed from doc/book/src/Configure-Log4j-CompositeRolling-Appender.xml)0
-rw-r--r--doc/book/src/java-broker/Configure-the-Broker-via-config.xml.xml (renamed from doc/book/src/Configure-the-Broker-via-config.xml.xml)0
-rw-r--r--doc/book/src/java-broker/Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml (renamed from doc/book/src/Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml)0
-rw-r--r--doc/book/src/java-broker/Configuring-Management-Users.xml (renamed from doc/book/src/Configuring-Management-Users.xml)0
-rw-r--r--doc/book/src/java-broker/Configuring-Qpid-JMX-Management-Console.xml (renamed from doc/book/src/Configuring-Qpid-JMX-Management-Console.xml)0
-rw-r--r--doc/book/src/java-broker/Debug-using-log4j.xml (renamed from doc/book/src/Debug-using-log4j.xml)0
-rw-r--r--doc/book/src/java-broker/How-to-Tune-M3-Java-Broker-Performance.xml (renamed from doc/book/src/How-to-Tune-M3-Java-Broker-Performance.xml)0
-rw-r--r--doc/book/src/java-broker/How-to-Use-SlowConsumerDisconnect.xml (renamed from doc/book/src/How-to-Use-SlowConsumerDisconnect.xml)0
-rw-r--r--doc/book/src/java-broker/Java-Broker-Feature-Guide.xml (renamed from doc/book/src/Java-Broker-Feature-Guide.xml)0
-rw-r--r--doc/book/src/java-broker/Java-Environment-Variables.xml (renamed from doc/book/src/Java-Environment-Variables.xml)0
-rw-r--r--doc/book/src/java-broker/Makefile20
-rw-r--r--doc/book/src/java-broker/Management-Console-Security.xml251
-rw-r--r--doc/book/src/java-broker/MessageStore-Tool.xml (renamed from doc/book/src/MessageStore-Tool.xml)0
-rw-r--r--doc/book/src/java-broker/Qpid-JMX-Management-Console-FAQ.xml (renamed from doc/book/src/Qpid-JMX-Management-Console-FAQ.xml)0
-rw-r--r--doc/book/src/java-broker/Qpid-JMX-Management-Console-User-Guide.xml793
-rw-r--r--doc/book/src/java-broker/Qpid-JMX-Management-Console.xml (renamed from doc/book/src/Qpid-JMX-Management-Console.xml)0
-rw-r--r--doc/book/src/java-broker/Qpid-Java-Broker-Management-CLI.xml (renamed from doc/book/src/Qpid-Java-Broker-Management-CLI.xml)0
-rw-r--r--doc/book/src/java-broker/Qpid-Java-Build-How-To.xml (renamed from doc/book/src/Qpid-Java-Build-How-To.xml)0
-rw-r--r--doc/book/src/java-broker/Qpid-Java-FAQ.xml (renamed from doc/book/src/Qpid-Java-FAQ.xml)0
-rw-r--r--doc/book/src/java-broker/Qpid-Management-Features.xml (renamed from doc/book/src/Qpid-Management-Features.xml)0
-rw-r--r--doc/book/src/java-broker/Qpid-Troubleshooting-Guide.xml (renamed from doc/book/src/Qpid-Troubleshooting-Guide.xml)0
-rw-r--r--doc/book/src/java-broker/Topic-Configuration.xml (renamed from doc/book/src/java/broker/configuration/Topic-Configuration.xml)0
-rw-r--r--doc/book/src/java-broker/Use-Priority-Queues.xml (renamed from doc/book/src/Use-Priority-Queues.xml)0
-rw-r--r--doc/book/src/java-broker/images/3113098.png (renamed from doc/book/src/images/jmx_console/3113098.png)bin9805 -> 9805 bytes
-rw-r--r--doc/book/src/java-broker/images/3113099.png (renamed from doc/book/src/images/jmx_console/3113099.png)bin12882 -> 12882 bytes
-rw-r--r--doc/book/src/java-broker/images/3113100.png (renamed from doc/book/src/images/jmx_console/3113100.png)bin38529 -> 38529 bytes
-rw-r--r--doc/book/src/java-broker/images/3113101.png (renamed from doc/book/src/images/jmx_console/3113101.png)bin45933 -> 45933 bytes
-rw-r--r--doc/book/src/java-broker/images/3113102.png (renamed from doc/book/src/images/jmx_console/3113102.png)bin7126 -> 7126 bytes
-rw-r--r--doc/book/src/java-broker/images/3113103.png (renamed from doc/book/src/images/jmx_console/3113103.png)bin34693 -> 34693 bytes
-rw-r--r--doc/book/src/java-broker/images/3113104.png (renamed from doc/book/src/images/jmx_console/3113104.png)bin61810 -> 61810 bytes
-rw-r--r--doc/book/src/java-broker/images/3113105.png (renamed from doc/book/src/images/jmx_console/3113105.png)bin26365 -> 26365 bytes
-rw-r--r--doc/book/src/java-broker/images/3113106.png (renamed from doc/book/src/images/jmx_console/3113106.png)bin45911 -> 45911 bytes
-rw-r--r--doc/book/src/java-broker/images/3113107.png (renamed from doc/book/src/images/jmx_console/3113107.png)bin31789 -> 31789 bytes
-rw-r--r--doc/book/src/java-broker/images/3113108.png (renamed from doc/book/src/images/jmx_console/3113108.png)bin39198 -> 39198 bytes
-rw-r--r--doc/book/src/java-broker/images/3113109.png (renamed from doc/book/src/images/jmx_console/3113109.png)bin13295 -> 13295 bytes
-rw-r--r--doc/book/src/java-broker/images/3113110.png (renamed from doc/book/src/images/jmx_console/3113110.png)bin38715 -> 38715 bytes
-rw-r--r--doc/book/src/java-broker/images/3113111.png (renamed from doc/book/src/images/jmx_console/3113111.png)bin52694 -> 52694 bytes
-rw-r--r--doc/book/src/java-broker/images/3113112.png (renamed from doc/book/src/images/jmx_console/3113112.png)bin39276 -> 39276 bytes
-rw-r--r--doc/book/src/java-broker/images/3113113.png (renamed from doc/book/src/images/jmx_console/3113113.png)bin46459 -> 46459 bytes
-rw-r--r--doc/book/src/java-broker/images/3113114.png (renamed from doc/book/src/images/jmx_console/3113114.png)bin64661 -> 64661 bytes
-rw-r--r--doc/book/src/java-broker/images/3113115.png (renamed from doc/book/src/images/jmx_console/3113115.png)bin38902 -> 38902 bytes
-rw-r--r--doc/book/src/java-broker/images/3113116.png (renamed from doc/book/src/images/jmx_console/3113116.png)bin9252 -> 9252 bytes
-rw-r--r--doc/book/src/java-broker/images/3113117.png (renamed from doc/book/src/images/jmx_console/3113117.png)bin40855 -> 40855 bytes
-rw-r--r--doc/book/src/java-broker/images/3113118.png (renamed from doc/book/src/images/jmx_console/3113118.png)bin13796 -> 13796 bytes
-rw-r--r--doc/book/src/java-broker/images/3113119.png (renamed from doc/book/src/images/jmx_console/3113119.png)bin39115 -> 39115 bytes
-rw-r--r--doc/book/src/old/ACL.xml (renamed from doc/book/src/ACL.xml)0
-rw-r--r--doc/book/src/old/AMQP-.NET-Messaging-Client.xml (renamed from doc/book/src/AMQP-.NET-Messaging-Client.xml)0
-rw-r--r--doc/book/src/old/AMQP-C++-Messaging-Client.xml (renamed from doc/book/src/AMQP-C++-Messaging-Client.xml)0
-rw-r--r--doc/book/src/old/AMQP-Java-JMS-Messaging-Client.xml (renamed from doc/book/src/AMQP-Java-JMS-Messaging-Client.xml)0
-rw-r--r--doc/book/src/old/AMQP-Messaging-Broker-CPP.xml70
-rw-r--r--doc/book/src/old/AMQP-Python-Messaging-Client.xml (renamed from doc/book/src/AMQP-Python-Messaging-Client.xml)0
-rw-r--r--doc/book/src/old/AMQP-Ruby-Messaging-Client.xml (renamed from doc/book/src/AMQP-Ruby-Messaging-Client.xml)0
-rw-r--r--doc/book/src/old/AMQP.xml (renamed from doc/book/src/AMQP.xml)0
-rw-r--r--doc/book/src/old/Binding-URL-Format.xml (renamed from doc/book/src/Binding-URL-Format.xml)0
-rw-r--r--doc/book/src/old/Book-Info.xml (renamed from doc/book/src/Book-Info.xml)0
-rw-r--r--doc/book/src/old/Book.xml (renamed from doc/book/src/Book.xml)0
-rw-r--r--doc/book/src/old/Broker-CPP.xml (renamed from doc/book/src/Broker-CPP.xml)0
-rw-r--r--doc/book/src/old/Broker-Java.xml (renamed from doc/book/src/Broker-Java.xml)0
-rw-r--r--doc/book/src/old/Clients.xml (renamed from doc/book/src/Clients.xml)0
-rw-r--r--doc/book/src/old/Connection-URL-Format.xml (renamed from doc/book/src/Connection-URL-Format.xml)0
-rw-r--r--doc/book/src/old/Download.xml (renamed from doc/book/src/Download.xml)0
-rw-r--r--doc/book/src/old/Excel-AddIn.xml (renamed from doc/book/src/Excel-AddIn.xml)0
-rw-r--r--doc/book/src/old/FAQ.xml (renamed from doc/book/src/FAQ.xml)0
-rw-r--r--doc/book/src/old/Getting-Started.xml (renamed from doc/book/src/Getting-Started.xml)0
-rw-r--r--doc/book/src/old/How-to-Use-JNDI.xml175
-rw-r--r--doc/book/src/old/InfoPlugin.xml (renamed from doc/book/src/InfoPlugin.xml)0
-rw-r--r--doc/book/src/old/Introduction.xml (renamed from doc/book/src/Introduction.xml)0
-rw-r--r--doc/book/src/old/Java-Broker-StatusLogMessages.xml (renamed from doc/book/src/Java-Broker-StatusLogMessages.xml)0
-rw-r--r--doc/book/src/old/Java-JMS-Selector-Syntax.xml (renamed from doc/book/src/Java-JMS-Selector-Syntax.xml)0
-rw-r--r--doc/book/src/old/Management-Design-notes.xml (renamed from doc/book/src/Management-Design-notes.xml)0
-rw-r--r--doc/book/src/old/NET-User-Guide.xml (renamed from doc/book/src/NET-User-Guide.xml)0
-rw-r--r--doc/book/src/old/PythonBrokerTest.xml (renamed from doc/book/src/PythonBrokerTest.xml)0
-rw-r--r--doc/book/src/old/QMan-Qpid-Management-bridge.xml (renamed from doc/book/src/QMan-Qpid-Management-bridge.xml)0
-rw-r--r--doc/book/src/old/Qpid-ACLs.xml (renamed from doc/book/src/Qpid-ACLs.xml)0
-rw-r--r--doc/book/src/old/Qpid-Book.xml (renamed from doc/book/src/Qpid-Book.xml)0
-rw-r--r--doc/book/src/old/Qpid-Compatibility-And-Interoperability-Book.xml (renamed from doc/book/src/Qpid-Compatibility-And-Interoperability-Book.xml)0
-rw-r--r--doc/book/src/old/SASL-Compatibility.xml (renamed from doc/book/src/SASL-Compatibility.xml)0
-rw-r--r--doc/book/src/old/SSL.xml (renamed from doc/book/src/SSL.xml)0
-rw-r--r--doc/book/src/old/Security-Plugins.xml (renamed from doc/book/src/Security-Plugins.xml)0
-rw-r--r--doc/book/src/old/System-Properties.xml (renamed from doc/book/src/System-Properties.xml)0
-rw-r--r--doc/book/src/old/Using-Qpid-with-other-JNDI-Providers.xml (renamed from doc/book/src/Using-Qpid-with-other-JNDI-Providers.xml)0
-rw-r--r--doc/book/src/old/WCF.xml (renamed from doc/book/src/WCF.xml)0
-rw-r--r--doc/book/src/old/schemas.xml102
-rw-r--r--doc/book/src/programming/Makefile20
-rw-r--r--doc/book/src/programming/Message-Groups-Guide.xml (renamed from doc/book/src/Message-Groups-Guide.xml)0
-rw-r--r--doc/book/src/programming/Programming-In-Apache-Qpid-Book.xml6500
-rw-r--r--doc/book/src/qmf/QmfBook.xml (renamed from doc/book/src/QmfBook.xml)0
-rw-r--r--doc/book/src/qmf/QmfIntroduction.xml (renamed from doc/book/src/QmfIntroduction.xml)0
-rw-r--r--doc/book/src/schemas.xml101
-rw-r--r--doc/book/xsl/html-custom.xsl188
-rwxr-xr-xextras/qmf/setup.py2
-rw-r--r--extras/qmf/src/py/qmf/console.py2
-rw-r--r--java/.gitignore2
-rw-r--r--java/amqp-1-0-client-jms/build.xml29
-rw-r--r--java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/Hello.java178
-rw-r--r--java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/hello.properties28
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/AmqpMessage.java32
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/BytesMessage.java26
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Connection.java37
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionFactory.java31
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionMetaData.java28
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Destination.java28
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/JavaSerializable.java24
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MapMessage.java37
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Message.java178
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageConsumer.java36
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageProducer.java27
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ObjectMessage.java27
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Queue.java26
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueBrowser.java30
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueConnection.java30
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueReceiver.java29
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSender.java29
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSession.java42
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Session.java75
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/StreamMessage.java26
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryDestination.java33
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryQueue.java26
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryTopic.java26
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TextMessage.java26
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Topic.java26
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicConnection.java30
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicPublisher.java26
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSession.java43
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSubscriber.java29
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/AmqpMessageImpl.java78
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/BytesMessageImpl.java538
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java173
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java329
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionMetaDataImpl.java105
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/DestinationImpl.java85
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MapMessageImpl.java444
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageConsumerImpl.java447
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageFactory.java191
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageImpl.java1209
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageProducerImpl.java362
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ObjectMessageImpl.java143
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueBrowserImpl.java138
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueConnectionImpl.java48
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueImpl.java56
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueReceiverImpl.java57
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSenderImpl.java36
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSessionImpl.java56
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java898
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/StreamMessageImpl.java466
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryQueueImpl.java105
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryTopicImpl.java110
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TextMessageImpl.java93
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicConnectionImpl.java48
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicImpl.java56
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicPublisherImpl.java36
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSessionImpl.java55
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSubscriberImpl.java133
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/NameParserImpl.java37
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/PropertiesFileInitialContextFactory.java230
-rw-r--r--java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/ReadOnlyContext.java527
-rw-r--r--java/amqp-1-0-client/build.xml29
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/AcknowledgeMode.java28
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Command.java43
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Connection.java481
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Demo.java407
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Dump.java116
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filereceiver.java327
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filesender.java276
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Message.java148
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/ReadBytes.java77
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receive.java246
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receiver.java561
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Request.java249
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Respond.java347
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Send.java244
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SendBytes.java331
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Sender.java392
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Session.java354
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Transaction.java49
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TransactionController.java194
-rw-r--r--java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Util.java529
-rw-r--r--java/amqp-1-0-common/build.xml27
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractDescribedTypeWriter.java188
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractListWriter.java41
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractMapWriter.java95
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayTypeConstructor.java113
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayWriter.java82
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryString.java68
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryTypeConstructor.java80
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryWriter.java75
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanConstructor.java80
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanWriter.java70
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteArrayWriter.java66
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteBufferWriter.java75
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteTypeConstructor.java59
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteWriter.java90
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharTypeConstructor.java67
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharWriter.java53
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeAssembler.java36
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeConstructor.java192
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundWriter.java420
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DecimalConstructor.java230
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DefaultDescribedTypeConstructor.java70
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DelegatingValueWriter.java52
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedType.java85
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructor.java41
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructorRegistry.java35
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleTypeConstructor.java58
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleWriter.java54
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/Encoder.java85
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedEightWriter.java108
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedFourWriter.java122
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedOneWriter.java79
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedSixteenWriter.java150
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedTwoWriter.java96
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatTypeConstructor.java58
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatWriter.java54
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FrameWriter.java245
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntTypeConstructor.java58
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntegerWriter.java106
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ListWriter.java172
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongTypeConstructor.java58
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongWriter.java111
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/MapWriter.java102
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullTypeConstructor.java44
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullWriter.java70
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHandler.java30
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHeaderHandler.java146
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/RestrictedTypeValueWriter.java55
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortTypeConstructor.java58
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortWriter.java55
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SimpleVariableWidthWriter.java68
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallIntConstructor.java58
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallLongConstructor.java58
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallUIntConstructor.java58
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallULongConstructor.java59
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringTypeConstructor.java132
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringWriter.java146
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolArrayWriter.java170
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolTypeConstructor.java109
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolWriter.java102
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampTypeConstructor.java60
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampWriter.java57
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TypeConstructor.java32
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UByteTypeConstructor.java59
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UIntTypeConstructor.java59
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ULongTypeConstructor.java61
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UShortTypeConstructor.java60
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDTypeConstructor.java62
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDWriter.java63
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedByteWriter.java92
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedIntegerWriter.java148
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedLongWriter.java152
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedShortWriter.java56
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueHandler.java159
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueProducingProtocolHandler.java31
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueWriter.java58
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthTypeConstructor.java48
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthWriter.java169
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/WrapperTypeValueWriter.java55
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroListConstructor.java46
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroUIntConstructor.java45
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroULongConstructor.java45
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQFrame.java68
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQPProtocolHeaderHandler.java85
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/ConnectionHandler.java559
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameHandler.java329
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameParsingError.java34
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameTypeHandler.java31
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/OversizeFrameException.java42
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrame.java42
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrameHandler.java311
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLProtocolHeaderHandler.java86
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/TransportFrame.java51
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/MessageAttributes.java27
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoder.java35
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoderImpl.java62
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoder.java34
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoderImpl.java111
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPFrameTransport.java179
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPTransport.java170
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesProcessor.java27
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesTransport.java38
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CallbackHandlerSource.java28
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CircularBytesBuffer.java174
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEndpoint.java934
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEventListener.java43
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionState.java31
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Container.java79
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Delivery.java95
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/DeliveryStateHandler.java28
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ErrorHandler.java9
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameOutputHandler.java36
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameTransport.java37
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEndpoint.java542
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEventListener.java31
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Node.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ProtocolHeaderTransport.java134
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkEndpoint.java438
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkListener.java43
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingSessionHalfEndpoint.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpoint.java39
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpointImpl.java291
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLFrameTransport.java78
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLTransport.java85
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkEndpoint.java214
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkListener.java43
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingSessionHalfEndpoint.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SequenceNumber.java110
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionAttachment.java92
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEndpoint.java781
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEventListener.java47
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionHalfEndpoint.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionState.java34
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/StateChangeListener.java25
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/UnsettledTransfer.java53
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/AmqpErrorException.java54
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Binary.java161
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DeliveryState.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DistributionMode.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/ErrorCondition.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/FrameBody.java29
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/GlobalTxId.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/LifetimePolicy.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Outcome.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/RestrictedType.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/SaslFrameBody.java27
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Section.java27
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Source.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Symbol.java90
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Target.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnCapability.java26
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnId.java23
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedByte.java134
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedInteger.java149
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedLong.java162
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedShort.java132
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/WrapperType.java27
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java389
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Accepted.java46
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpSequence.java70
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpValue.java66
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ApplicationProperties.java64
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Data.java68
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnClose.java46
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinks.java46
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinksOrMessages.java46
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoMessages.java46
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeliveryAnnotations.java64
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ExactSubjectFilter.java82
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Filter.java28
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Footer.java70
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Header.java161
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/JMSSelectorFilter.java77
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MatchingSubjectFilter.java81
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MessageAnnotations.java64
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Modified.java112
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/NoLocalFilter.java45
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Properties.java333
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Received.java88
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Rejected.java70
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Released.java46
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Source.java280
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/StdDistMode.java95
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Target.java196
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusDurability.java107
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusExpiryPolicy.java119
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedConstructor.java72
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedWriter.java151
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceConstructor.java68
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceWriter.java80
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueConstructor.java65
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueWriter.java80
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesConstructor.java68
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesWriter.java80
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataConstructor.java65
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataWriter.java80
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseConstructor.java72
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseWriter.java142
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksConstructor.java72
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesConstructor.java72
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesWriter.java142
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksWriter.java142
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesConstructor.java72
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesWriter.java142
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsConstructor.java68
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsWriter.java80
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterConstructor.java64
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterWriter.java78
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterConstructor.java68
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterWriter.java80
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderConstructor.java207
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderWriter.java182
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterConstructor.java66
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterWriter.java79
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterConstructor.java65
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterWriter.java79
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsConstructor.java68
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsWriter.java80
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedConstructor.java154
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedWriter.java166
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterConstructor.java56
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterWriter.java89
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesConstructor.java424
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesWriter.java246
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedConstructor.java126
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedWriter.java158
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedConstructor.java99
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedWriter.java150
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedConstructor.java72
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedWriter.java142
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceConstructor.java384
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceWriter.java230
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetConstructor.java269
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetWriter.java198
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslChallenge.java74
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslCode.java131
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslInit.java116
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslMechanisms.java74
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslOutcome.java95
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslResponse.java74
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeConstructor.java99
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeWriter.java150
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitConstructor.java153
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitWriter.java166
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsConstructor.java106
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsWriter.java150
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeConstructor.java126
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeWriter.java158
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseConstructor.java99
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseWriter.java150
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Coordinator.java70
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declare.java66
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declared.java67
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Discharge.java87
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionErrors.java107
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionalState.java88
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapabilities.java144
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapability.java131
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorConstructor.java117
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorWriter.java150
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareConstructor.java99
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareWriter.java150
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredConstructor.java99
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredWriter.java150
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeConstructor.java126
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeWriter.java158
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateConstructor.java126
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateWriter.java158
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/AmqpError.java227
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Attach.java365
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Begin.java239
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Close.java89
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ConnectionError.java107
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Detach.java131
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Disposition.java194
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/End.java89
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Error.java111
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Flow.java302
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/LinkError.java131
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Open.java281
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ReceiverSettleMode.java95
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Role.java95
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SenderSettleMode.java107
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SessionError.java119
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Transfer.java299
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachConstructor.java465
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachWriter.java254
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginConstructor.java303
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginWriter.java206
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseConstructor.java99
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseWriter.java150
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachConstructor.java153
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachWriter.java166
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionConstructor.java234
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionWriter.java190
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndConstructor.java99
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndWriter.java150
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorConstructor.java169
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorWriter.java166
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowConstructor.java370
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowWriter.java230
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenConstructor.java371
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenWriter.java222
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferConstructor.java369
-rw-r--r--java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferWriter.java230
-rwxr-xr-xjava/bdbstore/bin/backup.sh2
-rwxr-xr-xjava/bdbstore/bin/storeUpgrade.sh41
-rw-r--r--java/bdbstore/build.xml9
-rwxr-xr-xjava/bdbstore/etc/scripts/bdbtest.sh43
-rw-r--r--java/bdbstore/src/main/java/BDBStoreUpgrade.log4j.xml52
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AMQShortStringEncoding.java2
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AMQShortStringTB.java49
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java1825
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java2152
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreFactory.java40
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBStoreUpgrade.java1299
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/ContentTB.java52
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/DatabaseVisitor.java49
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/ExchangeTB.java59
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/MessageContentKey.java42
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/QueueEntryKey.java49
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StringMapBinding.java61
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/UUIDTupleBinding.java50
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/PreparedTransaction.java46
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/QueueEntryKey.java45
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/Xid.java52
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/keys/MessageContentKey_4.java44
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/keys/MessageContentKey_5.java44
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/records/BindingRecord.java62
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/records/ExchangeRecord.java53
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/records/QueueRecord.java66
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBinding.java37
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ContentBinding.java52
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java77
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/PreparedTransactionBinding.java127
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java59
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/StringMapBinding.java59
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/UUIDTupleBinding.java48
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/XidBinding.java70
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/BindingTuple.java25
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/BindingTupleBindingFactory.java45
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/BindingTuple_4.java76
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageContentKeyTB_4.java47
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageContentKeyTB_5.java46
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageContentKeyTupleBindingFactory.java45
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageMetaDataTB_4.java170
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageMetaDataTB_5.java67
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageMetaDataTupleBindingFactory.java43
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueEntryTB.java46
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTuple.java25
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTupleBindingFactory.java46
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTuple_4.java70
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTuple_5.java73
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/TupleBindingFactory.java40
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractStoreUpgrade.java77
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/CursorOperation.java89
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/CursorTemplate.java75
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseCallable.java29
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseEntryCallback.java30
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseRunnable.java30
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseTemplate.java114
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/StoreUpgrade.java31
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4To5.java915
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6.java1207
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeInteractionHandler.java37
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeInteractionResponse.java28
-rw-r--r--java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/Upgrader.java177
-rw-r--r--java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreConfigurationTest.java14
-rw-r--r--java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java211
-rw-r--r--java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBStoreUpgradeTestPreparer.java63
-rw-r--r--java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBUpgradeTest.java324
-rw-r--r--java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBindingTest.java61
-rw-r--r--java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractUpgradeTestCase.java153
-rw-r--r--java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseTemplateTest.java83
-rw-r--r--java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4to5Test.java299
-rw-r--r--java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6Test.java395
-rw-r--r--java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgraderTest.java138
-rw-r--r--java/bdbstore/src/test/resources/upgrade/bdbstore-to-upgrade/test-store/00000000.jdbbin1346092 -> 0 bytes
-rw-r--r--java/bdbstore/src/test/resources/upgrade/bdbstore-v4/test-store/00000000.jdbbin0 -> 1357197 bytes
-rw-r--r--java/bdbstore/src/test/resources/upgrade/bdbstore-v5/readme.txt5
-rw-r--r--java/bdbstore/src/test/resources/upgrade/bdbstore-v5/test-store/00000000.jdbbin0 -> 1357227 bytes
-rw-r--r--java/bdbstore/src/test/resources/upgrade/bdbstore-v5/test-store/00000001.jdbbin0 -> 1332881 bytes
-rw-r--r--java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java1
-rw-r--r--java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java9
-rw-r--r--java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java6
-rw-r--r--java/broker-plugins/experimental/info/MANIFEST.MF16
-rw-r--r--java/broker-plugins/experimental/info/build.properties31
-rw-r--r--java/broker-plugins/experimental/info/build.xml39
-rw-r--r--java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Activator.java212
-rw-r--r--java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/AppInfo.java96
-rw-r--r--java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Info.java143
-rw-r--r--java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoService.java30
-rw-r--r--java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoServiceImpl.java66
-rw-r--r--java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/SystemInfo.java95
-rw-r--r--java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/HttpPoster.java130
-rw-r--r--java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/IniFileReader.java193
-rw-r--r--java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/SoapClient.java155
-rw-r--r--java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/XMLWriter.java102
-rw-r--r--java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/systest/InfoPluginTest.java277
-rw-r--r--java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/HttpPosterTest.java107
-rw-r--r--java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoServiceImplTest.java63
-rw-r--r--java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoServlet.java57
-rw-r--r--java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoTest.java114
-rw-r--r--java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/IniFileReaderTest.java137
-rw-r--r--java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SoapClientTest.java209
-rw-r--r--java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SystemInfoTest.java57
-rw-r--r--java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/XMLWriterTest.java133
-rwxr-xr-xjava/broker-plugins/experimental/shutdown/src/main/java/shutdown.bnd2
-rw-r--r--java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchange.java10
-rw-r--r--java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchangeType.java6
-rw-r--r--java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchange.java7
-rw-r--r--java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchangeType.java6
-rw-r--r--java/broker/bin/create-example-ssl-stores.bat36
-rwxr-xr-xjava/broker/bin/create-example-ssl-stores.sh38
-rw-r--r--java/broker/build.xml2
-rw-r--r--java/broker/etc/config.xml3
-rw-r--r--java/broker/etc/virtualhosts.xml12
-rwxr-xr-xjava/broker/src/main/java/broker.bnd2
-rw-r--r--java/broker/src/main/java/org/apache/qpid/qmf/ManagementExchange.java22
-rw-r--r--java/broker/src/main/java/org/apache/qpid/qmf/QMFService.java5
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java74
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java92
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/Broker.java147
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java3
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/Main.java7
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/ProtocolExclusion.java3
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/binding/Binding.java2
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/binding/BindingFactory.java94
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java13
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/configuration/ServerNetworkTransportConfiguration.java18
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfig.java2
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java30
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/connection/ConnectionRegistry.java12
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/connection/IConnectionRegistry.java9
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java27
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java27
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java53
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java11
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/Exchange.java6
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java7
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeInitialiser.java5
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java7
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeType.java4
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java10
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersBinding.java42
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersExchange.java42
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java216
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/federation/Bridge.java10
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java4
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java6
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionOpenMethodHandler.java9
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/handler/ExchangeDeclareHandler.java29
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/handler/QueueBindHandler.java2
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java12
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeleteHandler.java2
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/logging/actors/CurrentActor.java16
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/logging/messages/ConfigStore_logmessages.properties3
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/logging/messages/MessageStore_logmessages.properties6
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/logging/messages/TransactionLog_logmessages.properties9
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/logging/subjects/BindingLogSubject.java3
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubject.java8
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/management/AbstractAMQManagedConnectionObject.java20
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/management/JMXManagedObjectRegistry.java4
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_0_10.java11
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_1_0.java522
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/model/Binding.java75
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/model/ConfigurationChangeListener.java38
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java229
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/model/Consumer.java73
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/model/Exchange.java91
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/model/IllegalStateTransitionException.java43
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/model/LifetimePolicy.java27
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/model/Publisher.java25
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/model/Queue.java146
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/model/State.java30
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/model/Statistics.java25
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java54
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java8
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/AMQSessionModel.java8
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/AmqpProtocolVersion.java2
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java64
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java394
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java449
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java98
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Destination.java28
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ExchangeDestination.java108
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/LinkRegistry.java59
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Link_1_0.java26
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java172
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/QueueDestination.java100
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingDestination.java35
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLinkAttachment.java51
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLink_1_0.java305
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingDestination.java27
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLinkAttachment.java44
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java648
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java446
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Subscription_1_0.java634
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/TxnCoordinatorLink_1_0.java195
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/UnsettledAction.java8
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/AMQPriorityQueue.java9
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueue.java6
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java58
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueMBean.java12
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueue.java13
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/DefaultQueueRegistry.java38
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/IncomingMessage.java41
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/OutOfOrderQueue.java29
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/PriorityQueueList.java50
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/queue/QueueContext.java9
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java17
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryVisitor.java22
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/QueueRegistry.java5
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/SimpleAMQQueue.java223
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/SimpleQueueEntryList.java25
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java11
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java60
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/registry/BrokerConfigAdapter.java1
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/registry/ConfigurationFileApplicationRegistry.java18
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationManager.java3
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/PrincipalDatabaseAuthenticationManager.java5
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/anonymous/AnonymousSaslServerFactory.java2
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/plain/PlainSaslServer.java63
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/AbstractMessageStore.java43
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/store/ConfigurationRecoveryHandler.java15
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectHelper.java183
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectRecord.java65
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/DerbyMessageStore.java2363
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java29
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/Event.java32
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/EventListener.java25
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/EventManager.java55
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java185
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStoreFactory.java37
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/store/MessageMetaDataType.java5
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java110
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreConstants.java27
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreFactory.java27
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java146
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/OperationalLoggingListener.java73
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/State.java38
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/StateManager.java151
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/StoreFuture.java40
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/store/StoredMemoryMessage.java4
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/store/StoredMessage.java2
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/Transaction.java81
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/store/TransactionLogRecoveryHandler.java13
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/store/TransactionLogResource.java4
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java2449
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStoreFactory.java40
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription.java8
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/subscription/SubscriptionImpl.java14
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription_0_10.java35
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/transport/ServerConnectionDelegate.java24
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java194
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java446
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/txn/AlreadyKnownDtxException.java32
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/txn/AsyncAutoCommitTransaction.java35
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/txn/AutoCommitTransaction.java11
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/txn/DistributedTransaction.java247
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/txn/DtxBranch.java349
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/txn/DtxException.java44
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/txn/DtxNotSelectedException.java30
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/txn/DtxRegistry.java333
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/txn/IncorrectDtxStateException.java32
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/txn/JoinAndResumeDtxException.java32
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/txn/LocalTransaction.java3
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/txn/NotAssociatedDtxException.java32
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/txn/RollbackOnlyDtxException.java32
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/txn/ServerTransaction.java5
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/txn/SuspendAndFailDtxException.java32
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/txn/TimeoutDtxException.java32
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/txn/UnknownDtxBranchException.java32
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/util/MapJsonSerializer.java69
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/virtualhost/State.java29
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java21
-rwxr-xr-xjava/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostConfigRecoveryHandler.java259
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java650
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/AMQBrokerManagerMBeanTest.java3
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/AMQChannelTest.java52
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/configuration/MockConnectionConfig.java20
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/configuration/VirtualHostConfigurationTest.java3
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/exchange/AbstractHeadersExchangeTestBase.java57
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java13
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java2
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/logging/messages/MessageStoreMessagesTest.java58
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubjectTest.java4
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/plugins/OsgiSystemPackageUtilTest.java4
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBeanTest.java4
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/protocol/InternalTestProtocolSession.java5
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactoryTest.java18
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueAlertTest.java39
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueFactoryTest.java5
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueMBeanTest.java19
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/queue/AckTest.java13
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/queue/MockAMQQueue.java5
-rwxr-xr-xjava/broker/src/test/java/org/apache/qpid/server/queue/MockStoredMessage.java6
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/queue/PriorityQueueListTest.java117
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/queue/QueueEntryListTestBase.java33
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/queue/SimpleAMQQueueTest.java59
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java20
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryListTest.java19
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java16
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/registry/ApplicationRegistryShutdownTest.java5
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/security/auth/rmi/RMIPasswordAuthenticatorTest.java30
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/security/auth/sasl/SaslServerTestCase.java2
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/store/DurableConfigurationStoreTest.java377
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/store/EventManagerTest.java72
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTest.java16
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/store/OperationalLoggingListenerTest.java181
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/store/ReferenceCountingTest.java4
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/store/SkeletonMessageStore.java157
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/store/StateManagerTest.java195
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/store/TestMemoryMessageStore.java98
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStore.java57
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStoreFactory.java37
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/subscription/MockSubscription.java4
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/transport/ServerSessionTest.java67
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/txn/MockStoreTransaction.java54
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/util/InternalBrokerBaseCase.java7
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/util/MapJsonSerializerTest.java53
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java26
-rw-r--r--java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java84
-rw-r--r--java/build.deps43
-rw-r--r--java/build.xml20
-rwxr-xr-xjava/client/src/main/java/client.bnd2
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/AMQBrokerDetails.java8
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/AMQConnection.java29
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java2
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/AMQQueueBrowser.java68
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/AMQSession.java141
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java64
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/AMQSession_0_8.java19
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java18
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer.java222
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_10.java4
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_8.java8
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/Closeable.java7
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/XAResourceImpl.java25
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/XASessionImpl.java16
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl.java4
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/message/FieldTableSupport.java7
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java3
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolSession.java15
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/util/BlockingWaiter.java39
-rw-r--r--java/client/src/main/java/org/apache/qpid/jndi/PropertiesFileInitialContextFactory.java62
-rw-r--r--java/client/src/test/java/org/apache/qpid/jndi/JNDITest.properties (renamed from java/client/src/test/java/org/apache/qpid/test/unit/jndi/JNDITest.properties)0
-rw-r--r--java/client/src/test/java/org/apache/qpid/jndi/PropertiesFileInitialContextFactoryTest.java95
-rw-r--r--java/client/src/test/java/org/apache/qpid/jndi/hello.properties27
-rw-r--r--java/client/src/test/java/org/apache/qpid/test/unit/jndi/JNDIPropertyFileTest.java88
-rw-r--r--java/client/src/test/java/org/apache/qpid/test/unit/message/TestAMQSession.java2
-rw-r--r--java/common.xml2
-rwxr-xr-xjava/common/src/main/java/common.bnd2
-rw-r--r--java/common/src/main/java/org/apache/qpid/codec/MarkableDataInput.java20
-rw-r--r--java/common/src/main/java/org/apache/qpid/common/AMQPFilterTypes.java4
-rw-r--r--java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java5
-rw-r--r--java/common/src/main/java/org/apache/qpid/framing/ByteArrayDataInput.java20
-rw-r--r--java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java11
-rw-r--r--java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java3
-rw-r--r--java/common/src/main/java/org/apache/qpid/framing/ExtendedDataInput.java20
-rw-r--r--java/common/src/main/java/org/apache/qpid/properties/ConnectionStartProperties.java21
-rw-r--r--java/common/src/main/java/org/apache/qpid/transport/Connection.java1
-rw-r--r--java/common/src/main/java/org/apache/qpid/transport/NetworkTransportConfiguration.java4
-rw-r--r--java/common/src/main/java/org/apache/qpid/transport/Range.java5
-rw-r--r--java/common/src/main/java/org/apache/qpid/transport/RangeSet.java2
-rw-r--r--java/common/src/main/java/org/apache/qpid/transport/RangeSetImpl.java62
-rw-r--r--java/common/src/main/java/org/apache/qpid/transport/ServerDelegate.java8
-rw-r--r--java/common/src/main/java/org/apache/qpid/transport/Session.java16
-rw-r--r--java/common/src/main/java/org/apache/qpid/transport/codec/AbstractEncoder.java2
-rw-r--r--java/common/src/main/java/org/apache/qpid/transport/network/Assembler.java2
-rw-r--r--java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java2
-rw-r--r--java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java18
-rw-r--r--java/common/src/test/java/org/apache/qpid/transport/RangeSetTest.java114
-rwxr-xr-xjava/genpom34
-rw-r--r--java/integrationtests/README.txt13
-rwxr-xr-xjava/integrationtests/bin/interoptests.py180
-rw-r--r--java/integrationtests/build.xml28
-rw-r--r--java/integrationtests/docs/RunningSustainedTests.txt17
-rw-r--r--java/integrationtests/jar-with-dependencies.xml47
-rw-r--r--java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase1DummyRun.java135
-rw-r--r--java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase2BasicP2P.java209
-rw-r--r--java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase3BasicPubSub.java239
-rw-r--r--java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase4P2PMessageSize.java214
-rw-r--r--java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase5PubSubMessageSize.java243
-rw-r--r--java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase1DummyRun.java84
-rw-r--r--java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase2BasicP2P.java90
-rw-r--r--java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase3BasicPubSub.java88
-rw-r--r--java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase4P2PMessageSize.java193
-rw-r--r--java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase5PubSubMessageSize.java193
-rw-r--r--java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedClientTestCase.java906
-rw-r--r--java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedTestCase.java126
-rw-r--r--java/integrationtests/src/resources/sustained-log4j.xml69
-rw-r--r--java/ivy.xml2
-rw-r--r--java/jca/.gitignore1
-rw-r--r--java/jca/README.txt127
-rw-r--r--java/jca/example/.gitignore19
-rw-r--r--java/jca/example/README-EXAMPLE.txt235
-rw-r--r--java/jca/example/README-GERONIMO.txt69
-rw-r--r--java/jca/example/README-GLASSFISH.txt84
-rw-r--r--java/jca/example/README-JBOSS.txt107
-rw-r--r--java/jca/example/README-JBOSS7.txt116
-rw-r--r--java/jca/example/README.txt277
-rw-r--r--java/jca/example/build-geronimo-properties.xml21
-rw-r--r--java/jca/example/build-glassfish-properties.xml135
-rw-r--r--java/jca/example/build-jboss-properties.xml7
-rw-r--r--java/jca/example/build-jboss7-properties.xml133
-rw-r--r--java/jca/example/build.xml25
-rw-r--r--java/jca/example/conf/geronimo-application.xml2
-rw-r--r--java/jca/example/conf/geronimo-ra.xml40
-rw-r--r--java/jca/example/conf/glassfish-ejb-jar.xml70
-rw-r--r--java/jca/example/conf/glassfish-resources.xml74
-rw-r--r--java/jca/example/conf/glassfish-web.xml26
-rw-r--r--java/jca/example/conf/jboss-ejb-client.properties12
-rw-r--r--java/jca/example/conf/jboss-web.xml5
-rw-r--r--java/jca/example/conf/log4j.properties18
-rw-r--r--java/jca/example/conf/qpid-jca-ds.xml27
-rw-r--r--java/jca/example/conf/qpid-standalone.xml422
-rw-r--r--java/jca/example/conf/web.xml11
-rw-r--r--java/jca/example/qpid-jca-example-properties.xml15
-rw-r--r--java/jca/example/src/main/java/org/apache/qpid/jca/example/client/QpidRequestResponseClient.java2
-rw-r--r--java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeListenerBean.java2
-rw-r--r--java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeSubscriberBean.java3
-rw-r--r--java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloListenerBean.java4
-rw-r--r--java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloSubscriberBean.java5
-rw-r--r--java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidJMSResponderBean.java13
-rw-r--r--java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidTestBean.java4
-rw-r--r--java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidRequestResponseServlet.java283
-rw-r--r--java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidTestServlet.java47
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/ConnectionFactoryProperties.java6
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/QpidRAConnectionRequestInfo.java36
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnection.java109
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java4
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/QpidRAProperties.java48
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/QpidRASession.java2
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactory.java2
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactoryImpl.java12
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionImpl.java2
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/QpidResourceAdapter.java140
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/admin/QpidConnectionFactoryProxy.java27
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/admin/QpidQueueImpl.java25
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidActivation.java501
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidActivationSpec.java29
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidExceptionHandler.java339
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidMessageHandler.java139
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/tm/GlassfishTransactionManagerLocator.java63
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/tm/JBoss7TransactionManagerLocator.java20
-rw-r--r--java/jca/src/main/java/org/apache/qpid/ra/tm/WLSTransactionManagerLocator.java64
-rwxr-xr-xjava/jca/src/main/resources/META-INF/ra.xml42
-rw-r--r--java/jca/src/test/java/org/apache/qpid/ra/QpidActivationSpecTest.java45
-rw-r--r--java/jca/src/test/java/org/apache/qpid/ra/QpidResourceAdapterTest.java78
-rw-r--r--java/junit-toolkit/build.xml26
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/DefaultThreadFactory.java48
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/PossibleDeadlockException.java46
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/TestRunnable.java239
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestCoordinator.java486
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestExample.java145
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/package.html28
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestCase.java303
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestDecorator.java173
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BaseThrottle.java98
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BatchedThrottle.java94
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/DurationTestDecorator.java205
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/InstrumentedTest.java66
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/NullResultPrinter.java92
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ParameterVariationTestDecorator.java175
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ScaledTestDecorator.java391
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskAware.java55
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskHandler.java92
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ShutdownHookable.java42
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SleepThrottle.java81
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestResult.java654
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestRunner.java694
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestRunnerImprovedErrorHandling.java131
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestThreadAware.java54
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/Throttle.java73
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingController.java198
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingControllerAware.java43
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/WrappedSuiteTestDecorator.java134
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/CSVTestListener.java572
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/ConsoleTestListener.java274
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/TKTestListener.java142
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/XMLTestListener.java410
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/package.html27
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/package.html33
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/CommandLineParser.java787
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ContextualProperties.java494
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/MathUtils.java428
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ParsedProperties.java390
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/SizeOf.java94
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/StackQueue.java131
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestContextProperties.java202
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestUtils.java54
-rw-r--r--java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/package.html27
-rw-r--r--java/lib/gson-2.0.jarbin0 -> 202952 bytes
-rw-r--r--java/lib/jackson-core-asl-1.9.0.jarbin0 -> 228286 bytes
-rw-r--r--java/lib/jackson-mapper-asl-1.9.0.jarbin0 -> 764075 bytes
-rw-r--r--java/lib/jetty-6.1.14.jarbin516429 -> 0 bytes
-rw-r--r--java/lib/jetty-servlet-tester-6.1.14.jarbin9206 -> 0 bytes
-rw-r--r--java/lib/jetty-util-6.1.14.jarbin163122 -> 0 bytes
-rw-r--r--java/lib/mockito-all-1.9.0.jarbin0 -> 1495219 bytes
-rw-r--r--java/lib/org.apache.felix.main-2.0.5.jar (renamed from java/lib/org.apache.felix.framework-2.0.5.jar)bin391763 -> 391763 bytes
-rw-r--r--java/lib/poms/commons-digester-1.8.1.xml6
-rw-r--r--java/lib/poms/jackson-core-asl-1.9.0.xml22
-rw-r--r--java/lib/poms/jackson-mapper-asl-1.9.0.xml22
-rw-r--r--java/lib/poms/org.apache.felix.framework-2.0.5.xml22
-rw-r--r--java/lib/poms/org.apache.felix.main-2.0.5.xml40
-rw-r--r--java/lib/poms/org.osgi.core-1.0.0.xml22
-rw-r--r--java/lib/poms/xalan-2.7.0.xml8
-rw-r--r--java/lib/servlet-api.jarbin88224 -> 0 bytes
-rw-r--r--java/management/common/src/main/java/management-common.bnd2
-rw-r--r--java/management/eclipse-plugin/META-INF/MANIFEST.MF2
-rw-r--r--java/management/eclipse-plugin/src/test/java/org/apache/qpid/management/ui/ManagementConsoleTest.java4
-rw-r--r--java/module.xml6
-rw-r--r--java/perftests/RunningPerformanceTests.txt141
-rwxr-xr-xjava/perftests/bin/monitoring/monitor-broker.sh221
-rwxr-xr-xjava/perftests/bin/monitoring/runTests.sh148
-rwxr-xr-xjava/perftests/bin/monitoring/stop-monitored-broker.sh124
-rwxr-xr-xjava/perftests/bin/processing/process.sh388
-rwxr-xr-xjava/perftests/bin/processing/processAll.sh58
-rwxr-xr-xjava/perftests/bin/processing/processTests.py850
-rwxr-xr-xjava/perftests/bin/run_many.sh30
-rwxr-xr-xjava/perftests/bin/topicListener.sh32
-rwxr-xr-xjava/perftests/bin/topicPublisher.sh31
-rw-r--r--java/perftests/build.xml318
-rw-r--r--java/perftests/dist-zip.xml45
-rw-r--r--java/perftests/etc/chartdefs/AcknowledgementModesAutoAck.chartdef28
-rw-r--r--java/perftests/etc/chartdefs/AcknowledgementModesTransacted.chartdef28
-rw-r--r--java/perftests/etc/chartdefs/BatchSize.chartdef28
-rw-r--r--java/perftests/etc/chartdefs/MessageSizeNonPersistent.chartdef27
-rw-r--r--java/perftests/etc/chartdefs/MessageSizePersistent.chartdef29
-rw-r--r--java/perftests/etc/chartdefs/QueueTypes.chartdef28
-rw-r--r--java/perftests/etc/chartdefs/VaryingNumberOfConsumers.chartdef35
-rw-r--r--java/perftests/etc/chartdefs/VaryingNumberOfProducers.chartdef35
-rw-r--r--java/perftests/etc/jndi/activemq.properties20
-rw-r--r--java/perftests/etc/jndi/failovertest.properties19
-rw-r--r--java/perftests/etc/jndi/perftests.properties19
-rw-r--r--java/perftests/etc/jndi/swiftmq.properties20
-rw-r--r--java/perftests/etc/log4j.properties28
-rw-r--r--java/perftests/etc/perftests-jndi.properties26
-rw-r--r--java/perftests/etc/perftests.log4j46
-rwxr-xr-xjava/perftests/etc/scripts/CTQ-Qpid-1.sh21
-rwxr-xr-xjava/perftests/etc/scripts/CTQ-Qpid-2.sh21
-rwxr-xr-xjava/perftests/etc/scripts/CTQ-Qpid-3.sh21
-rwxr-xr-xjava/perftests/etc/scripts/CTQ-Qpid-4.sh21
-rwxr-xr-xjava/perftests/etc/scripts/CTQ-Qpid-5.sh21
-rwxr-xr-xjava/perftests/etc/scripts/CTQ-Qpid-6.sh21
-rwxr-xr-xjava/perftests/etc/scripts/Connections.sh20
-rwxr-xr-xjava/perftests/etc/scripts/JobQueue.sh20
-rwxr-xr-xjava/perftests/etc/scripts/Latency.sh21
-rwxr-xr-xjava/perftests/etc/scripts/MessageSize.sh20
-rwxr-xr-xjava/perftests/etc/scripts/PT-Qpid-13.sh42
-rwxr-xr-xjava/perftests/etc/scripts/PT-Qpid-14.sh41
-rwxr-xr-xjava/perftests/etc/scripts/Reliability.sh20
-rwxr-xr-xjava/perftests/etc/scripts/RunAll.sh23
-rwxr-xr-xjava/perftests/etc/scripts/RunCore.sh22
-rw-r--r--java/perftests/etc/scripts/Test-ActiveMQ.sh32
-rw-r--r--java/perftests/etc/scripts/Test-SwiftMQ.sh30
-rwxr-xr-xjava/perftests/etc/scripts/Throughput.sh20
-rwxr-xr-xjava/perftests/etc/scripts/drainBroker.sh41
-rwxr-xr-xjava/perftests/etc/scripts/extractResults.sh34
-rwxr-xr-xjava/perftests/etc/scripts/extractThroughputResults.sh51
-rwxr-xr-xjava/perftests/etc/scripts/fillBroker.sh41
-rwxr-xr-xjava/perftests/etc/scripts/sendAndWaitClient.sh22
-rwxr-xr-xjava/perftests/etc/scripts/testWithPreFill.sh41
-rw-r--r--java/perftests/etc/testdefs/short/AcknowledgementModes.json138
-rw-r--r--java/perftests/etc/testdefs/short/BatchSize.json84
-rw-r--r--java/perftests/etc/testdefs/short/MessageSize.json213
-rw-r--r--java/perftests/etc/testdefs/short/QueueTypes.json16198
-rw-r--r--java/perftests/etc/testdefs/short/VaryingNumberOfParticipants.json2981
-rw-r--r--java/perftests/etc/testdefs/standard/AcknowledgementModes.json138
-rw-r--r--java/perftests/etc/testdefs/standard/BatchSize.json84
-rw-r--r--java/perftests/etc/testdefs/standard/MessageSize.json213
-rw-r--r--java/perftests/etc/testdefs/standard/QueueTypes.json16205
-rw-r--r--java/perftests/etc/testdefs/standard/QueuesWithSelectors.json2036
-rw-r--r--java/perftests/etc/testdefs/standard/VaryingNumberOfParticipants.json2981
-rw-r--r--java/perftests/example/PQBT-AA-Qpid-01.json795
-rw-r--r--java/perftests/example/TQBT-TX-Qpid-01.json843
-rw-r--r--java/perftests/example/brokerconfig/log4j.xml125
-rw-r--r--java/perftests/example/brokerconfig/passwd23
-rw-r--r--java/perftests/example/brokerconfig/virtualhosts.xml67
-rw-r--r--java/perftests/example/config-one-test.json55
-rw-r--r--java/perftests/example/config-stress-testing-manyp-c1-with-psfc.json162
-rw-r--r--java/perftests/example/config-stress-testing.json84
-rw-r--r--java/perftests/example/config-two-tests.json117
-rw-r--r--java/perftests/example/log4j-client.properties29
-rw-r--r--java/perftests/example/log4j.properties35
-rw-r--r--java/perftests/example/perftests-jndi.properties26
-rwxr-xr-xjava/perftests/example/run-client.sh21
-rwxr-xr-xjava/perftests/example/run.sh22
-rw-r--r--java/perftests/generate-scripts74
-rw-r--r--java/perftests/jar-with-dependencies.xml91
-rw-r--r--java/perftests/scripts.xml328
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/client/message/TestMessageFactory.java117
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/config/AMQConnectionFactoryInitialiser.java47
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/config/AbstractConfig.java69
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/config/ConnectionFactoryInitialiser.java29
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/config/Connector.java43
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/config/ConnectorConfig.java28
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/config/JBossConnectionFactoryInitialiser.java112
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/AbstractRunner.java74
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/ArgumentParser.java44
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/ClientRunner.java94
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java238
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestConstants.java33
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestException.java66
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/Visitor.java76
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/Client.java208
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientCommandVisitor.java98
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientState.java25
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/ConsumerParticipant.java251
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/MessageProvider.java212
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/Participant.java31
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutor.java136
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutorRegistry.java45
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantResultFactory.java100
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/ProducerParticipant.java174
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertySupport.java68
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertyValue.java27
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/property/ListPropertyValue.java122
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/property/NumericGeneratedPropertySupport.java179
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValue.java27
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValueFactory.java46
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RandomPropertyValue.java47
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RangePropertyValue.java129
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/client/property/SimplePropertyValue.java79
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/ClientRegistry.java96
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandForClient.java46
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandListener.java31
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/Controller.java228
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/ParticipatingClients.java94
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/ResultsForAllTests.java49
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestResult.java70
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunner.java342
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunnerFactory.java31
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ClientConfig.java113
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/Config.java81
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConfigReader.java52
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConnectionConfig.java91
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConsumerConfig.java65
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/IterationValue.java86
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/MessageProviderConfig.java60
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ParticipantConfig.java64
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ProducerConfig.java90
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/QueueConfig.java69
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/SessionConfig.java114
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestConfig.java117
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestInstance.java102
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/jms/ClientJmsDelegate.java592
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/jms/ControllerJmsDelegate.java210
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/jms/JmsMessageAdaptor.java124
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/jms/QpidQueueCreator.java97
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/jms/QueueCreator.java31
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/json/JsonHandler.java43
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/json/PropertyValueAdapter.java147
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/Command.java56
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/CommandType.java39
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/ConsumerParticipantResult.java118
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConnectionCommand.java58
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConsumerCommand.java108
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateMessageProviderCommand.java54
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateParticpantCommand.java103
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateProducerCommand.java106
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateResponderCommand.java28
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateSessionCommand.java62
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/NoOpCommand.java30
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/OutputAttribute.java35
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttribute.java70
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttributeExtractor.java89
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantResult.java272
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/ProducerParticipantResult.java100
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/RegisterClientCommand.java43
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/Response.java80
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/StartTestCommand.java29
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/StopClientCommand.java28
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/message/TearDownTestCommand.java29
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/AggregatedTestResult.java97
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/Aggregator.java49
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ITestResult.java36
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregator.java143
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregator.java106
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVFormater.java89
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparator.java55
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/oldtopic/Config.java243
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/oldtopic/Listener.java141
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/oldtopic/MessageFactory.java153
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/oldtopic/Publisher.java178
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/ping/PingAsyncTestPerf.java323
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/ping/PingClient.java112
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/ping/PingDurableClient.java452
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/ping/PingLatencyTestPerf.java311
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/ping/PingSendOnlyClient.java93
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/ping/PingTestPerf.java281
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongBouncer.java453
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongProducer.java1818
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongTestPerf.java251
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/topic/Config.java326
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/topic/Listener.java303
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/topic/MessageFactory.java157
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/topic/Publisher.java186
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/topic/TopicWithSelectorsTransientVolumeTest.java344
-rw-r--r--java/perftests/src/main/java/org/apache/qpid/topic/topicselectors.properties24
-rw-r--r--java/perftests/src/main/resources/perftests.properties20
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/ArgumentParserTest.java96
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/ConfigFileHelper.java48
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/VisitorTest.java92
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientCommandVisitorTest.java108
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientTest.java159
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/ConsumerParticipantTest.java180
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/MessageProviderTest.java107
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantExecutorTest.java183
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantRegistryTest.java55
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantResultFactoryTest.java183
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantTestHelper.java83
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/ProducerParticipantTest.java219
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/property/ListPropertyValueTest.java88
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/property/PropertyValueFactoryTest.java73
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RandomPropertyValueTest.java76
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RangePropertyValueTest.java153
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/client/property/SimplePropertyValueTest.java30
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/ClientRegistryTest.java99
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/ControllerTest.java198
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/ParticipatingClientsTest.java144
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/TestRunnerTest.java253
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ClientConfigTest.java111
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigReaderTest.java113
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTest.java56
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTestUtils.java56
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConnectionConfigTest.java94
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConsumerConfigTest.java79
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/IterationValueTest.java78
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/MessageProviderConfigTest.java51
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ProducerConfigTest.java89
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/SessionConfigTest.java93
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestConfigTest.java113
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestInstanceTest.java102
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/sampleConfig.json72
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/jms/JmsMessageAdaptorTest.java40
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/message/JsonHandlerTest.java183
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/message/ParticipantResultTest.java162
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/AggregatorTest.java61
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregatorTest.java272
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregatorTest.java152
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVFormaterTest.java144
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparatorTest.java89
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/expectedOutput.csv2
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/DistributedTestSystemTestBase.java72
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/QpidQueueCreatorTest.java116
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/SystemTestConstants.java28
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/BasicDistributedClientTest.java186
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ConsumerParticipantTest.java156
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ControllerQueue.java90
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/DistributedClientTest.java323
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/MessageProviderTest.java119
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ProducerParticipantTest.java132
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/ControllerAndClientTest.java249
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/iteratingFeature.json63
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/produceClient.json41
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndConsumerInSeparateClients.json55
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndThreeConsumersInSeparateClients.json77
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/testWithTwoTests.json107
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/DistributedControllerTest.java157
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/distributedControllerTest.json17
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/EndToEndTest.java95
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/endtoend.json65
-rw-r--r--java/perftests/src/test/java/org/apache/qpid/systest/disttest/perftests.systests.properties26
-rw-r--r--java/perftests/visualisation-jfc/build.xml142
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartType.java26
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingException.java46
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingUtil.java135
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/BarChartBuilder.java47
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilder.java30
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactory.java40
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataPointCallback.java27
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataSetBasedChartBuilder.java68
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/LineChartBuilder.java45
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilder.java133
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinition.java85
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreator.java140
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinition.java50
-rw-r--r--java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreator.java60
-rw-r--r--java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactoryTest.java40
-rw-r--r--java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilderTest.java90
-rw-r--r--java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreatorTest.java149
-rw-r--r--java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreatorTest.java113
-rw-r--r--java/systests/build.xml6
-rwxr-xr-xjava/systests/etc/bin/testclients.sh23
-rw-r--r--java/systests/etc/virtualhosts-systests-bdb-settings.xml6
-rw-r--r--java/systests/etc/virtualhosts-systests-derby-settings.xml8
-rw-r--r--java/systests/etc/virtualhosts-systests-firewall-2.xml4
-rw-r--r--java/systests/etc/virtualhosts-systests-firewall-3.xml4
-rw-r--r--java/systests/src/main/java/org/apache/qpid/client/AsynchMessageListenerTest.java362
-rw-r--r--java/systests/src/main/java/org/apache/qpid/client/DispatcherTest.java233
-rw-r--r--java/systests/src/main/java/org/apache/qpid/client/MessageListenerMultiConsumerImmediatePrefetch.java44
-rw-r--r--java/systests/src/main/java/org/apache/qpid/client/MessageListenerMultiConsumerTest.java252
-rw-r--r--java/systests/src/main/java/org/apache/qpid/client/MessageListenerTest.java258
-rw-r--r--java/systests/src/main/java/org/apache/qpid/client/ResetMessageListenerTest.java228
-rw-r--r--java/systests/src/main/java/org/apache/qpid/client/SessionCreateTest.java7
-rw-r--r--java/systests/src/main/java/org/apache/qpid/client/SynchReceiveTest.java133
-rw-r--r--java/systests/src/main/java/org/apache/qpid/client/redelivered/RedeliveredMessageTest.java20
-rw-r--r--java/systests/src/main/java/org/apache/qpid/jms/xa/XAResourceTest.java17
-rw-r--r--java/systests/src/main/java/org/apache/qpid/management/jmx/ManagedQueueMBeanTest.java256
-rw-r--r--java/systests/src/main/java/org/apache/qpid/ra/QpidRAConnectionTest.java89
-rw-r--r--java/systests/src/main/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java3
-rw-r--r--java/systests/src/main/java/org/apache/qpid/server/exchange/MessagingTestConfigProperties.java300
-rw-r--r--java/systests/src/main/java/org/apache/qpid/server/exchange/ReturnUnroutableMandatoryMessageTest.java2
-rw-r--r--java/systests/src/main/java/org/apache/qpid/server/logging/DerbyMessageStoreLoggingTest.java573
-rw-r--r--java/systests/src/main/java/org/apache/qpid/server/logging/MemoryMessageStoreLoggingTest.java186
-rw-r--r--java/systests/src/main/java/org/apache/qpid/server/logging/SubscriptionLoggingTest.java5
-rw-r--r--java/systests/src/main/java/org/apache/qpid/server/persistent/NoLocalAfterRecoveryTest.java78
-rw-r--r--java/systests/src/main/java/org/apache/qpid/server/queue/PriorityQueueTest.java100
-rw-r--r--java/systests/src/main/java/org/apache/qpid/server/queue/ProducerFlowControlTest.java36
-rw-r--r--java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java70
-rw-r--r--java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStoreFactory.java37
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/client/CancelTest.java101
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/client/ImmediateAndMandatoryPublishingTest.java98
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/client/QueueBrowserAutoAckTest.java28
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/client/timeouts/SyncWaitDelayTest.java2
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/AMQPPublisher.java54
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/Assertion.java39
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/AssertionBase.java66
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/BrokerLifecycleAware.java70
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailure.java42
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailureUserPrompt.java63
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/Circuit.java109
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEnd.java95
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEndBase.java156
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/DropInTest.java51
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/ExceptionMonitor.java204
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkBaseCase.java299
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkTestContext.java48
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/LocalAMQPCircuitFactory.java173
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/LocalCircuitFactory.java320
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/MessageIdentityVector.java167
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/MessageMonitor.java104
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/MessagingTestConfigProperties.java684
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/NotApplicableAssertion.java112
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/Publisher.java74
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/Receiver.java92
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/TestCaseVector.java88
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/TestClientDetails.java86
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/TestUtils.java200
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchFailureException.java45
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchThread.java124
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchronizer.java69
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/LocalClockSynchronizer.java73
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockReference.java169
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockSynchronizer.java468
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedCircuitImpl.java472
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedPublisherImpl.java94
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedReceiverImpl.java94
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/TestClientCircuitEnd.java333
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/Coordinator.java546
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/DistributedTestDecorator.java164
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/FanOutTestDecorator.java241
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/InteropTestDecorator.java210
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/OptOutTestCase.java69
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClient.java510
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClientControlledTest.java107
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/listeners/XMLTestListener.java414
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalAMQPPublisherImpl.java137
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalCircuitImpl.java313
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalPublisherImpl.java176
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalReceiverImpl.java149
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/package.html43
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/BaseCircuitFactory.java136
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/CircuitFactory.java101
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/FanOutCircuitFactory.java200
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/InteropCircuitFactory.java154
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/unit/ack/AcknowledgeTest.java18
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/unit/basic/BytesMessageTest.java43
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/unit/basic/ReceiveTest.java82
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/BrokerClosesClientConnectionTest.java17
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/unit/close/CloseBeforeAckTest.java140
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/unit/close/MessageConsumerCloseTest.java77
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/unit/ct/DurableSubscriberTest.java19
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/unit/topic/DurableSubscriptionTest.java2
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/unit/transacted/TransactionTimeoutTest.java35
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/unit/xa/FaultTest.java2
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/unit/xa/QueueTest.java6
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/unit/xa/TopicTest.java72
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/utils/JMXTestUtils.java10
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java52
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java2
-rwxr-xr-xjava/test-profiles/CPPExcludes10
-rw-r--r--java/test-profiles/CPPPrefetchExcludes4
-rw-r--r--java/test-profiles/Excludes4
-rwxr-xr-xjava/test-profiles/Java010Excludes3
-rw-r--r--java/test-profiles/JavaBDBExcludes1
-rw-r--r--java/test-profiles/JavaDerbyExcludes4
-rw-r--r--java/test-profiles/JavaExcludes4
-rw-r--r--java/test-profiles/JavaPre010Excludes16
-rw-r--r--java/test-profiles/JavaTransientExcludes13
-rw-r--r--java/test-profiles/java-bdb-spawn.0-10.testprofile2
-rw-r--r--java/test-profiles/java-bdb-spawn.0-8.testprofile6
-rw-r--r--java/test-profiles/java-bdb-spawn.0-9-1.testprofile6
-rw-r--r--java/test-profiles/java-bdb-spawn.0-9.testprofile6
-rw-r--r--java/test-profiles/java-bdb.0-10.testprofile2
-rw-r--r--java/test-profiles/java-bdb.0-8.testprofile6
-rw-r--r--java/test-profiles/java-bdb.0-9-1.testprofile6
-rw-r--r--java/test-profiles/java-bdb.0-9.testprofile6
-rw-r--r--java/test-profiles/java-dby-spawn.0-10.testprofile2
-rw-r--r--java/test-profiles/java-dby-spawn.0-8.testprofile6
-rw-r--r--java/test-profiles/java-dby-spawn.0-9-1.testprofile6
-rw-r--r--java/test-profiles/java-dby-spawn.0-9.testprofile6
-rw-r--r--java/test-profiles/java-dby.0-10.testprofile2
-rw-r--r--java/test-profiles/java-dby.0-8.testprofile6
-rw-r--r--java/test-profiles/java-dby.0-9-1.testprofile6
-rw-r--r--java/test-profiles/java-dby.0-9.testprofile6
-rw-r--r--java/test-profiles/java-mms-spawn.0-8.testprofile4
-rw-r--r--java/test-profiles/java-mms-spawn.0-9-1.testprofile4
-rw-r--r--java/test-profiles/java-mms-spawn.0-9.testprofile4
-rw-r--r--java/test-profiles/java-mms.0-8.testprofile4
-rw-r--r--java/test-profiles/java-mms.0-9-1.testprofile4
-rw-r--r--java/test-profiles/java-mms.0-9.testprofile4
-rw-r--r--java/test-profiles/python_tests/Java010PythonExcludes59
-rw-r--r--java/test-profiles/testprofile.defaults4
-rw-r--r--java/testkit/README.txt6
-rw-r--r--java/testkit/bin/run_soak_client.sh70
-rw-r--r--java/testkit/bin/soak_report.sh161
-rw-r--r--java/testkit/build.xml27
-rw-r--r--java/testkit/src/main/java/org/apache/qpid/testkit/soak/ResourceLeakTest.java180
-rwxr-xr-xjava/tools/bin/jms-quick-perf-report (renamed from java/tools/bin/perf-report)0
-rw-r--r--java/tools/bin/mercury-controller (renamed from java/tools/bin/controller)0
-rw-r--r--java/tools/bin/mercury-start-consumers (renamed from java/tools/bin/start-consumers)0
-rw-r--r--java/tools/bin/mercury-start-producers (renamed from java/tools/bin/start-producers)0
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/Clock.java2
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/JVMArgConfiguration.java411
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/LatencyTest.java349
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/MercuryBase.java191
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/MercuryConsumerController.java231
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/MercuryProducerController.java210
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/MercuryTestController.java450
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/PerfBase.java226
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/PerfConsumer.java325
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/PerfProducer.java358
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/PerfTestController.java442
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/QpidReceive.java181
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/QpidSend.java291
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/TestConfiguration.java126
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/TestParams.java214
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/report/BasicReporter.java113
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/report/MercuryReporter.java167
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/report/Reporter.java40
-rw-r--r--java/tools/src/main/java/org/apache/qpid/tools/report/Statistics.java139
-rw-r--r--packaging/windows/INSTALL_NOTES.html8
-rw-r--r--packaging/windows/installer.proj2
-rw-r--r--python/qpid/connection.py13
-rw-r--r--python/qpid/messaging/driver.py6
-rw-r--r--python/qpid/testlib.py12
-rw-r--r--python/qpid/tests/messaging/endpoints.py10
-rwxr-xr-xpython/setup.py2
-rw-r--r--specs/amqp.xsl534
-rw-r--r--specs/apache-filters.xml228
-rw-r--r--specs/management-schema.xml11
-rwxr-xr-xtests/setup.py2
-rw-r--r--tests/src/py/qpid_tests/broker_0_10/management.py43
-rw-r--r--tests/src/py/qpid_tests/broker_0_10/msg_groups.py72
-rw-r--r--tests/src/py/qpid_tests/broker_0_10/new_api.py5
-rwxr-xr-xtools/setup.py23
-rwxr-xr-xtools/src/py/qmf-tool2
-rwxr-xr-xtools/src/py/qpid-config199
-rwxr-xr-xtools/src/py/qpid-ha153
-rwxr-xr-xtools/src/py/qpid-ha-tool183
-rwxr-xr-xtools/src/py/qpid-route10
-rwxr-xr-xtools/src/py/qpid-stat195
-rw-r--r--tools/src/py/qpidtoollibs/__init__.py4
-rw-r--r--tools/src/py/qpidtoollibs/broker.py168
-rw-r--r--tools/src/py/qpidtoollibs/disp.py41
-rw-r--r--wcf/src/Apache/Qpid/DtcPlugin/DtcPlugin.cpp7
1806 files changed, 160012 insertions, 68956 deletions
diff --git a/QPID_VERSION.txt b/QPID_VERSION.txt
index 2856407c03..50653ad0a6 100644
--- a/QPID_VERSION.txt
+++ b/QPID_VERSION.txt
@@ -1 +1 @@
-0.15
+0.17
diff --git a/bin/install-cpp-python b/bin/install-cpp-python
new file mode 100755
index 0000000000..d43e8e4899
--- /dev/null
+++ b/bin/install-cpp-python
@@ -0,0 +1,76 @@
+#!/bin/sh
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+
+#
+# Install C++ build and python tools to the standard places in a Unix buld
+# WARNING: Will destroy any existing installation!
+#
+
+# NOTE: build must be configured like this:
+# ../qpid/cpp/configure --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64
+# NOTE: Must run as root.
+
+usage() {
+ cat <<EOF
+Usage $0 -pc <cpp-build-directory>
+-p <prefix> : Prefix to install python
+-s : Skip C++ installation
+EOF
+
+ exit 1
+}
+
+fail() { echo $*; exit 1; }
+
+while getopts "ps" opt; do
+ case $opt in
+ p) PY_PREFIX="--prefix $OPTARG";;
+ s) SKIP_CPP=1;;
+ *) usage;;
+ esac
+done
+shift `expr $OPTIND - 1`
+BUILD=$1
+SRC=$(dirname $0)/..
+
+# Install python
+cd $SRC || fail "No such directory: $SRC"
+for d in python tools extras/qmf; do
+ (
+ cd $d || fail "No such directory: $(pwd)/$d"
+ ./setup.py install || fail Python install failed in $(pwd)
+ )
+done
+
+if test $SKIP_CPP; then exit; fi
+
+test -n "$BUILD" || { echo "No build directory."; usage; }
+test -d "$BUILD" || fail "No such directory: $BUILD"
+SRC=$(dirname $BUILD)
+
+ # Install C++
+cd $BUILD
+make -j1 install || fail "C++ install failed in $BUILD"
+
+# NOTE: setup.py does not uninstall, but you can get a list of files installed with:
+# setup.py install --record <output-file>
+
+
diff --git a/cc/LICENSE b/cc/LICENSE
deleted file mode 100644
index bc46b77047..0000000000
--- a/cc/LICENSE
+++ /dev/null
@@ -1,206 +0,0 @@
-=========================================================================
-== Apache License ==
-=========================================================================
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
diff --git a/cc/NOTICE b/cc/NOTICE
deleted file mode 100644
index 05f39ba176..0000000000
--- a/cc/NOTICE
+++ /dev/null
@@ -1,8 +0,0 @@
-// ------------------------------------------------------------------
-// NOTICE file corresponding to the section 4d of The Apache License,
-// Version 2.0, in this case for Qpid bin scripts
-// ------------------------------------------------------------------
-
-Apache Qpid
-Copyright 2006-2008 Apache Software Foundation
-
diff --git a/cc/README.txt b/cc/README.txt
deleted file mode 100644
index 8d1286f6d7..0000000000
--- a/cc/README.txt
+++ /dev/null
@@ -1,84 +0,0 @@
-******************
-Prerequisites
-******************
-Check out the source
-see http://cwiki.apache.org/qpid/building.html
-
-******************
-Install CruiseControl
-******************
-
-Download CruiseControl from: http://cruisecontrol.sourceforge.net/
-
- * Unzip the release to a directory, for example ~/cruisecontrol-bin-2.7.2
- * Check that the scripts cruisecontrol-bin-2.7.2/cruisecontrol.sh and cruisecontrol-bin-2.7.2/apache-ant-1.7.0/bin/ant have execution permission.
- * Make sure your directory ~/.ant/lib contains the following jars:
- o The ant jar files that can be found in cruisecontrol-bin-2.7.2/apache-ant-1.7.0/lib/
- o xalan-2.7.0.jar
-
-******************
-Set system variables
-******************
-
-Prior to use CruiseControl you'll need to set three system variables:
-Variable Value
-CC_HOME path to your qpid project, for example /home/foo/projects/qpid
-CPPSTORE_HOME path to your C++ store, for example /home/foo/projects/bdbstore-cpp
-NANT_HOME path to the nant directory -- only required for .net client --
- (nant can be downloaded from http://nant.sourceforge.net/)
-
-Edit the file CC_HOME/config.properties and set the properties so to match your system requirements.
-Notes
- * the cpp store can be checked out from: https://svn.jboss.org/repos/rhmessaging/store/trunk/cpp
- * Only unix scrips are currently provided
- *
-
-
-******************
-Installing Mono
-******************
-For building the .net client on a Linux platform you need to install Mono.
-Mono website is: http://www.mono-project.com/Main_Page
-Here are the instruction for a RHEL5 platform:
-
-Create the file "/etc/yum.repos.d/mono.repo" and add the following lines:
-
-[Mono]
-name=Mono Stack (RHEL_5)
-type=rpm-md
-baseurl=http://download.opensuse.org/repositories/Mono/RHEL_5/
-gpgcheck=1
-gpgkey=http://download.opensuse.org/repositories/Mono/RHEL_5/repodata/repomd.xml.key
-enabled=1
-
-Enter the following command to install Mono:
-
-# yum install mono-complete
-
-
-******************
-Running CruiseControl
-******************
-
-Run cruisecontrol-bin-2.7.2/cruisecontrol.sh from CC_HOME/cc
-
-******************
-Running the Sun java TCK
-******************
-
-If you wish to run the Sun JMS TCK, follow those two steps:
-* Extract the TCK
-* (As required by the TCK) Set TS_HOME to the location where the JMS TCK has been installed.
-
-******************
-Projects
-******************
-
-Project Description
-qpid-cpp-trunk Builds and tests the C++ broker
-qpid-cpp-trunk-perftests Runs the C++ performance tests
-qpid-java-trunk Builds and runs the Java tests with an 0.8 inVM broker, a c++ broker without prefetch and a c++ broker with pre-fetch
-bdbstore-cpp-trunk Builds the C++ store (required for the Java tests)
-example-automation Runs all the example combinations for python, C++ and java
-java-perftests Runs the java performance tests
-java-jmstck Runs the java jms tck (see running the tck) \ No newline at end of file
diff --git a/cc/config.properties b/cc/config.properties
deleted file mode 100644
index 82329722cc..0000000000
--- a/cc/config.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-mail.subject=CC Report for
-mail.host=localhost
-mail.returnaddress=my-email
-mail.list=list
diff --git a/cc/config.xml b/cc/config.xml
deleted file mode 100644
index ba89acc511..0000000000
--- a/cc/config.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<cruisecontrol>
- <!-- Load environment variables -->
- <property environment="env" toupper="true"/>
-
- <!-- Set a collection of global properties from the properties file "config.properties" -->
- <property file="${env.CC_HOME}/cc/config.properties"/>
-
- <include.projects file="./config/cpp-trunk.xml"/>
- <include.projects file="./config/java-trunk.xml"/>
- <include.projects file="./config/dotnet-trunk.xml"/>
- <include.projects file="./config/bdbstore-cpp-trunk.xml"/>
- <include.projects file="./config/cpp-perftests.xml"/>
- <include.projects file="./config/example-automation.xml"/>
- <include.projects file="./config/java-perftests.xml"/>
- <include.projects file="./config/java-jmstck.xml"/>
-</cruisecontrol>
-
-
diff --git a/cc/config/bdbstore-cpp-trunk.xml b/cc/config/bdbstore-cpp-trunk.xml
deleted file mode 100644
index 254af62170..0000000000
--- a/cc/config/bdbstore-cpp-trunk.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<cruisecontrol>
- <project name="bdbstore-cpp-trunk"
- buildafterfailed="false">
-
- <listeners>
- <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
- </listeners>
-
- <bootstrappers>
- <svnbootstrapper localWorkingCopy="${env.CPPSTORE_HOME}"/>
- </bootstrappers>
-
- <modificationset quietperiod="30">
- <buildstatus logdir="${env.CC_HOME}/cc/logs/qpid-cpp-trunk/"/>
- <svn localWorkingCopy="${env.CPPSTORE_HOME}"/>
- </modificationset>
-
- <schedule interval="3600">
- <exec timeout="1800"
- command="/bin/bash"
- args="${env.CC_HOME}/cc/scripts/bdbstorecppbuild.sh"
- workingdir="${env.CPPSTORE_HOME}"/>
- </schedule>
-
- <publishers>
- <email subjectprefix="${mail.subject}: ${project.name}" mailhost="${mail.host}"
- returnaddress="${mail.returnaddress}"
- buildresultsurl="http://${env.HOSTNAME}:8080/buildresults/${project.name}"
- skipusers="false"
- reportsuccess="fixes"
- spamwhilebroken="true">
- <always address="${mail.list}"/>
- </email>
- </publishers>
- </project>
-</cruisecontrol>
diff --git a/cc/config/cpp-perftests.xml b/cc/config/cpp-perftests.xml
deleted file mode 100644
index 8a5079b60b..0000000000
--- a/cc/config/cpp-perftests.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<cruisecontrol>
-
- <project name="qpid-cpp-trunk-perftests"
- buildafterfailed="false">
-
- <listeners>
- <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
- </listeners>
-
- <bootstrappers>
- <svnbootstrapper localWorkingCopy="../cpp" />
- <svnbootstrapper localWorkingCopy="../specs" />
- <svnbootstrapper localWorkingCopy="../python" />
- </bootstrappers>
-
- <modificationset quietperiod="30">
- <alwaysbuild />
- </modificationset>
-
- <schedule>
- <ant target="cpp-perftests"
- uselogger="false"
- time="0000"
- timeout="3600"
- antworkingdir="scripts">
- </ant>
- </schedule>
-
- <publishers>
- <!--
- <email subjectprefix="CC report fro ${project.name}" mailhost="localhost"
- returnaddress="my_email"
- buildresultsurl="http://my_host:8080/buildresults/${project.name}"
- skipusers="false"
- reportsuccess="fixes"
- spamwhilebroken="true">
- <always address="email"/>
- <map alias="name" address="email"/>
- </email>
- -->
- </publishers>
-
- </project>
-</cruisecontrol>
diff --git a/cc/config/cpp-trunk.xml b/cc/config/cpp-trunk.xml
deleted file mode 100644
index 56e1d2bb54..0000000000
--- a/cc/config/cpp-trunk.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<cruisecontrol>
- <project name="qpid-cpp-trunk"
- buildafterfailed="false">
-
- <listeners>
- <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
- </listeners>
-
- <bootstrappers>
- <svnbootstrapper localWorkingCopy="../bin" />
- <svnbootstrapper localWorkingCopy="../cpp" />
- <svnbootstrapper localWorkingCopy="../specs" />
- <svnbootstrapper localWorkingCopy="../python" />
- </bootstrappers>
-
- <modificationset quietperiod="30">
- <svn localWorkingCopy="../bin"/>
- <svn localWorkingCopy="../cpp"/>
- <svn localWorkingCopy="../specs"/>
- <svn localWorkingCopy="../python"/>
- </modificationset>
-
- <schedule interval="3600">
- <exec timeout="1800"
- command="/bin/bash"
- args="../cc/scripts/cppbuild.sh"
- workingdir="../cpp" />
- </schedule>
-
- <publishers>
- <email subjectprefix="${mail.subject}: ${project.name}" mailhost="${mail.host}"
- returnaddress="${mail.returnaddress}"
- buildresultsurl="http://${env.HOSTNAME}:8080/buildresults/${project.name}"
- skipusers="false"
- reportsuccess="fixes"
- spamwhilebroken="true">
- <always address="${mail.list}"/>
- </email>
- </publishers>
- </project>
-</cruisecontrol>
diff --git a/cc/config/dotnet-trunk.xml b/cc/config/dotnet-trunk.xml
deleted file mode 100644
index 0d922967e4..0000000000
--- a/cc/config/dotnet-trunk.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<cruisecontrol>
- <project name="qpid-dotnet-trunk"
- buildafterfailed="false">
-
- <listeners>
- <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
- </listeners>
-
- <bootstrappers>
- <svnbootstrapper localWorkingCopy="../bin" />
- <svnbootstrapper localWorkingCopy="../dotnet/client-010" />
- <svnbootstrapper localWorkingCopy="../specs" />
- </bootstrappers>
-
- <modificationset quietperiod="30">
- <svn localWorkingCopy="../bin"/>
- <svn localWorkingCopy="../dotnet/client-010"/>
- <svn localWorkingCopy="../specs"/>
- </modificationset>
-
- <schedule interval="3600">
- <!-- generates code from specs -->
- <ant target="build"
- uselogger="false"
- antworkingdir="../dotnet/client-010/gentool">
- </ant>
-
- <exec timeout="1800"
- command="/bin/bash"
- args="../cc/scripts/dotnetbuild.sh"
- workingdir="../dotnet/client-010" />
- </schedule>
-
- <publishers>
- <email subjectprefix="${mail.subject}: ${project.name}" mailhost="${mail.host}"
- returnaddress="${mail.returnaddress}"
- buildresultsurl="http://${env.HOSTNAME}:8080/buildresults/${project.name}"
- skipusers="false"
- reportsuccess="fixes"
- spamwhilebroken="true">
- <always address="${mail.list}"/>
- </email>
- </publishers>
- </project>
-</cruisecontrol>
diff --git a/cc/config/example-automation.xml b/cc/config/example-automation.xml
deleted file mode 100644
index 52dd135c24..0000000000
--- a/cc/config/example-automation.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<cruisecontrol>
- <project name="qpid-example-automation"
- buildafterfailed="false">
-
- <listeners>
- <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
- </listeners>
-
- <modificationset quietperiod="30">
- <buildstatus logdir="logs/qpid-cpp-trunk/"/>
- <buildstatus logdir="logs/qpid-java-trunk/"/>
- <buildstatus logdir="logs/bdbstore-cpp-trunk/"/>
- </modificationset>
-
- <schedule interval="3600">
- <exec timeout="1800"
- command="/bin/bash"
- args="${env.CC_HOME}/cc/scripts/check_examples.sh"
- errorstr="FAILED"
- workingdir="./"/>
- </schedule>
-
- <publishers>
- <artifactspublisher dest="artifacts/${project.name}"
- file="${env.CC_HOME}/broker.log"/>
- <artifactspublisher dest="artifacts/${project.name}"
- file="${env.CC_HOME}/script.log"/>
-
-
- <email subjectprefix="${mail.subject}: ${project.name}" mailhost="${mail.host}"
- returnaddress="${mail.returnaddress}"
- buildresultsurl="http://${env.HOSTNAME}:8080/buildresults/${project.name}"
- skipusers="false"
- reportsuccess="fixes"
- spamwhilebroken="true">
- <always address="${mail.list}"/>
- </email>
- </publishers>
- </project>
-</cruisecontrol>
diff --git a/cc/config/java-jmstck.xml b/cc/config/java-jmstck.xml
deleted file mode 100644
index 2b10b0c5b5..0000000000
--- a/cc/config/java-jmstck.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<cruisecontrol>
- <project name="qpid-java-jmstck"
- buildafterfailed="false">
-
- <listeners>
- <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
- </listeners>
-
- <modificationset quietperiod="30">
- <buildstatus logdir="logs/qpid-cpp-trunk/"/>
- <buildstatus logdir="logs/qpid-java-trunk/"/>
- </modificationset>
-
- <schedule>
- <ant target="tck"
- uselogger="false"
- time="0000"
- timeout="3600"
- antworkingdir="scripts">
- </ant>
- </schedule>
-
- <publishers>
- <artifactspublisher dest="artifacts/${project.name}"
- file="${env.TS_HOME}/tck1.log"/>
- <artifactspublisher dest="artifacts/${project.name}"
- file="${env.TS_HOME}/tck2.log"/>
-
- <onfailure>
- <artifactspublisher dest="artifacts/${project.name}"
- file="${env.CC_HOME}/jmstck-broker.log"/>
- </onfailure>
-
- <email subjectprefix="RHEL5/64" mailhost="localhost"
- returnaddress="qpid-test-cruisecontrol@qpid-test.lab.bos.redhat.com"
- buildresultsurl="http://qpid-test.lab.bos.redhat.com:8080/buildresults/${project.name}"
- skipusers="false"
- reportsuccess="fixes"
- spamwhilebroken="true">
- <always address="amqp-list@redhat.com"/>
- </email>
- </publishers>
- </project>
-</cruisecontrol>
diff --git a/cc/config/java-perftests.xml b/cc/config/java-perftests.xml
deleted file mode 100644
index 45e1b14b9f..0000000000
--- a/cc/config/java-perftests.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<cruisecontrol>
- <project name="qpid-java-perftests"
- buildafterfailed="false">
-
- <listeners>
- <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
- </listeners>
-
- <bootstrappers>
- <svnbootstrapper localWorkingCopy="../java/perftests"/>
- </bootstrappers>
-
- <modificationset quietperiod="30">
- <buildstatus logdir="logs/qpid-cpp-trunk/"/>
- <buildstatus logdir="logs/qpid-java-trunk/"/>
- <svn localWorkingCopy="../java/perftests"/>
- </modificationset>
-
- <schedule interval="3600">
- <composite>
- <!-- 0.10 C++ broker -->
- <exec timeout="1800"
- command="/bin/bash"
- args="../cc/scripts/runbroker.sh"
- workingdir="../java"/>
- <ant target="all-tests"
- uselogger="false"
- antworkingdir="../java/perftests">
- <jvmarg arg="-Xmx1024m"/>
- </ant>
- <exec timeout="1800"
- command="/bin/bash"
- args="../cc/scripts/stopbroker.sh"
- workingdir="../java"/>
- </composite>
- </schedule>
-
- <publishers>
- <artifactspublisher dest="artifacts/${project.name}"
- subdirectory="results"
- dir="../java/perftests/results"/>
-
- <email subjectprefix="${mail.subject}: ${project.name}" mailhost="${mail.host}"
- returnaddress="${mail.returnaddress}"
- buildresultsurl="http://${env.HOSTNAME}:8080/buildresults/${project.name}"
- skipusers="false"
- reportsuccess="fixes"
- spamwhilebroken="true">
- <always address="${mail.list}"/>
- </email>
- </publishers>
- </project>
-</cruisecontrol>
diff --git a/cc/config/java-trunk.xml b/cc/config/java-trunk.xml
deleted file mode 100644
index 99f469725b..0000000000
--- a/cc/config/java-trunk.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<cruisecontrol>
- <project name="qpid-java-trunk"
- buildafterfailed="false">
-
- <listeners>
- <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
- </listeners>
-
- <bootstrappers>
- <svnbootstrapper localWorkingCopy="../java"/>
- <svnbootstrapper localWorkingCopy="../gentools"/>
- </bootstrappers>
-
- <modificationset quietperiod="30">
- <buildstatus logdir="logs/qpid-cpp-trunk/"/>
- <buildstatus logdir="logs/bdbstore-cpp-trunk/"/>
- <svn localWorkingCopy="../java"/>
- <svn localWorkingCopy="../gentools"/>
- </modificationset>
-
- <schedule interval="3600">
- <composite>
-
- <exec timeout="1800"
- command="/bin/bash"
- args="../cc/scripts/javaconfig.sh"
- workingdir="../java"/>
- <!-- in VM 0.8 -->
- <ant target="clean test"
- uselogger="false"
- antworkingdir="../java">
- <jvmarg arg="-Xmx1024m"/>
- </ant>
-
- <ant target="report"
- uselogger="false"
- antworkingdir="../java">
- <jvmarg arg="-Xmx1024m"/>
- </ant>
- <exec timeout="1800"
- command="/bin/bash"
- args="../cc/scripts/javareport.sh 08"
- workingdir="../java"/>
-
- <!-- cpp -->
- <ant target="test"
- uselogger="false"
- antworkingdir="../java">
- <jvmarg arg="-Xmx1024m"/>
- <property name="profile" value="cpp"/>
- </ant>
- <ant target="report"
- uselogger="false"
- antworkingdir="../java">
- <jvmarg arg="-Xmx1024m"/>
- </ant>
- <exec timeout="1800"
- command="/bin/bash"
- args="../cc/scripts/javareport.sh cpp"
- workingdir="../java"/>
-
- <!-- cpp no prefetch -->
- <ant target="test"
- uselogger="false"
- antworkingdir="../java">
- <jvmarg arg="-Xmx1024m"/>
- <property name="profile" value="cpp.noprefetch"/>
- </ant>
- <ant target="report"
- uselogger="false"
- antworkingdir="../java">
- <jvmarg arg="-Xmx1024m"/>
- </ant>
- <exec timeout="1800"
- command="/bin/bash"
- args="../cc/scripts/javareport.sh cpp-noprefetch"
- workingdir="../java"/>
-
- <!-- make the release
- <ant target="release"
- uselogger="false"
- antworkingdir="../java">
- <jvmarg arg="-Xmx1024m"/>
- </ant>
- -->
- </composite>
- </schedule>
-
- <publishers>
- <onfailure>
- <antpublisher target="report"
- uselogger="false"
- antworkingdir="../java">
- <jvmarg arg="-Xmx1024m"/>
- </antpublisher>
- </onfailure>
- <artifactspublisher dest="artifacts/${project.name}"
- subdirectory="report_08"
- dir="../java/build/report_08"/>
-
- <artifactspublisher dest="artifacts/${project.name}"
- subdirectory="report_cpp"
- dir="../java/build/report_cpp"/>
-
- <artifactspublisher dest="artifacts/${project.name}"
- subdirectory="report_cpp-noprefetch"
- dir="../java/build/report_cpp-noprefetch"/>
-
- <artifactspublisher dest="artifacts/${project.name}"
- subdirectory="report-fault"
- dir="../java/build/report"/>
-
- <email subjectprefix="${mail.subject}: ${project.name}" mailhost="${mail.host}"
- returnaddress="${mail.returnaddress}"
- buildresultsurl="http://${env.HOSTNAME}:8080/buildresults/${project.name}"
- skipusers="false"
- reportsuccess="fixes"
- spamwhilebroken="true">
- <always address="${mail.list}"/>
- </email>
- </publishers>
- </project>
-</cruisecontrol>
diff --git a/cc/config/java/cpp.noprefetch.testprofile b/cc/config/java/cpp.noprefetch.testprofile
deleted file mode 100644
index 07c158dd4e..0000000000
--- a/cc/config/java/cpp.noprefetch.testprofile
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-broker.version=0-10
-broker=${project.root}/../cpp/src/qpidd --data-dir ${build.data} -t --load-module store_home/lib/.libs/libbdbstore.so --auth no --no-module-dir
-max_prefetch=0
-test.excludesfile=${project.root}/010ExcludeList-noPrefetch
diff --git a/cc/config/java/cpp.testprofile b/cc/config/java/cpp.testprofile
deleted file mode 100644
index 28361c6b40..0000000000
--- a/cc/config/java/cpp.testprofile
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-broker.version=0-10
-broker=${project.root}/../cpp/src/qpidd --data-dir ${build.data} -t --load-module store_home/lib/.libs/libbdbstore.so --auth no --no-module-dir
-test.excludesfile=${project.root}/010ExcludeList-store
diff --git a/cc/config/java/jndi.properties b/cc/config/java/jndi.properties
deleted file mode 100644
index 9340163622..0000000000
--- a/cc/config/java/jndi.properties
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
-
-connectionfactory.QueueConnectionFactory = amqp://username:password@topicClientid/test?brokerlist='tcp://localhost:qpid_port'
-connectionfactory.TopicConnectionFactory = amqp://username:password@topicClientid/test?brokerlist='tcp://localhost:qpid_port'
-connectionfactory.jms/DURABLE_SUB_CONNECTION_FACTORY = amqp://username:password@duralbeTopicClientid/test?brokerlist='tcp://localhost:qpid_port'
-connectionfactory.jms/MyTopicConnectionFactory = amqp://username:password@myTopicClientid/test?brokerlist='tcp://localhost:qpid_port'
-connectionfactory.jms/TopicConnectionFactory = amqp://username:password@jmsTopicClientid/test?brokerlist='tcp://localhost:qpid_port'
-
-queue.MY_QUEUE=MY_QUEUE
-queue.MY_QUEUE2=MY_QUEUE2
-queue.testQ0=testQ0
-queue.testQ1=testQ1
-queue.testQ2=testQ2
-queue.testQueue2=testQueue2
-queue.Q2=Q2
-
-topic.MY_TOPIC=MY_TOPIC
-topic.MY_TOPIC1=MY_TOPIC1
-
-destination.direct = direct://amq.direct//directQueue
-
diff --git a/cc/dashboard-config.xml b/cc/dashboard-config.xml
deleted file mode 100644
index 9304322853..0000000000
--- a/cc/dashboard-config.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
- <dashboard>
- <buildloop
- logsdir="logs/"
- artifactsdir="artifacts" />
- <features allowforcebuild="true"/>
- <trackingtool projectname="cc" baseurl="http://localhost:8080/" keywords="QPID"/>
- <subtabs>
- <subtab class="net.sourceforge.cruisecontrol.dashboard.widgets.ErrorsAndWarningsMessagesWidget" />
- </subtabs>
-</dashboard>
-
diff --git a/cc/scripts/bdbstorecppbuild.sh b/cc/scripts/bdbstorecppbuild.sh
deleted file mode 100755
index 3385c8d2f4..0000000000
--- a/cc/scripts/bdbstorecppbuild.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-###########################################################
-#Licensed to the Apache Software Foundation (ASF) under one
-#or more contributor license agreements. See the NOTICE file
-#distributed with this work for additional information
-#regarding copyright ownership. The ASF licenses this file
-#to you under the Apache License, Version 2.0 (the
-#"License"); you may not use this file except in compliance
-#with the License. You may obtain a copy of the License at
-#
-#http://www.apache.org/licenses/LICENSE-2.0
-#
-#Unless required by applicable law or agreed to in writing,
-#software distributed under the License is distributed on an
-#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#KIND, either express or implied. See the License for the
-#specific language governing permissions and limitations
-#under the License.
-###########################################################
-
-if [ -f Makefile ]; then
- make distclean
-fi
- ./bootstrap && ./configure CXXFLAGS="-O3 -DNDEBUG" --with-qpid-checkout=$CC_HOME && make
diff --git a/cc/scripts/build.xml b/cc/scripts/build.xml
deleted file mode 100644
index 2144020017..0000000000
--- a/cc/scripts/build.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<project name="run-tests" default="cpp-perftests" basedir=".">
-
- <target name="cpp-perftests">
- <exec executable="./cppbuild-perftests.sh" failonerror="true"/>
- </target>
-
- <target name="tck">
- <exec executable="./javajmstck.sh"/>
- </target>
-
-</project>
diff --git a/cc/scripts/check_examples.sh b/cc/scripts/check_examples.sh
deleted file mode 100755
index c10936b36c..0000000000
--- a/cc/scripts/check_examples.sh
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/bash
-###########################################################
-#Licensed to the Apache Software Foundation (ASF) under one
-#or more contributor license agreements. See the NOTICE file
-#distributed with this work for additional information
-#regarding copyright ownership. The ASF licenses this file
-#to you under the Apache License, Version 2.0 (the
-#"License"); you may not use this file except in compliance
-#with the License. You may obtain a copy of the License at
-#
-#http://www.apache.org/licenses/LICENSE-2.0
-#
-#Unless required by applicable law or agreed to in writing,
-#software distributed under the License is distributed on an
-#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#KIND, either express or implied. See the License for the
-#specific language governing permissions and limitations
-#under the License.
-###########################################################
-
-runVerifyScript()
-{
- echo "-----------<Run verify scripts>-------------"
- $CC_HOME/cc/scripts/verify_all
- echo "-----------</Run verify scripts>------------"
- echo ""
-}
-
-cleanup()
-{
-rm -f $CC_HOME/script.log
-rm -f $CC_HOME/status.log
-rm -f $CC_HOME/broker.log
-}
-
-checkErrors()
-{
-if test `cat $CC_HOME/script.log | grep -c 'FAIL'` -gt 0
-then
- echo "FAILED"
- printErrors > $CC_HOME/status.log
-fi
-}
-
-printErrors(){
- echo "<desc>The following scripts had failures"
- cat CC_HOME/script.log | awk '{
- script = ""
- while ((getline) == 1)
- {
- if ($1 == "script:")
- {
- script = $0
- }
- if ($1 == "FAIL")
- {
- print substr(script,9)
- }
- }}'
- echo "</desc>"
-}
-
-echo "*************************************"
-echo "Example Automation "
-echo ""
-cleanup
-runVerifyScript
-checkErrors
-echo "*************************************"
diff --git a/cc/scripts/cppbuild-perftests.sh b/cc/scripts/cppbuild-perftests.sh
deleted file mode 100755
index 782a472175..0000000000
--- a/cc/scripts/cppbuild-perftests.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-###########################################################
-#Licensed to the Apache Software Foundation (ASF) under one
-#or more contributor license agreements. See the NOTICE file
-#distributed with this work for additional information
-#regarding copyright ownership. The ASF licenses this file
-#to you under the Apache License, Version 2.0 (the
-#"License"); you may not use this file except in compliance
-#with the License. You may obtain a copy of the License at
-#
-#http://www.apache.org/licenses/LICENSE-2.0
-#
-#Unless required by applicable law or agreed to in writing,
-#software distributed under the License is distributed on an
-#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#KIND, either express or implied. See the License for the
-#specific language governing permissions and limitations
-#under the License.
-###########################################################
-
-cd $CC_HOME/cpp
-svn stat --no-ignore | awk '/^[I?]/{print $2}' | xargs rm -r
-./bootstrap && ./configure CXXFLAGS="-O3 -DNDEBUG" && make -j4 all && cd src/tests && make -j4 check
diff --git a/cc/scripts/cppbuild.sh b/cc/scripts/cppbuild.sh
deleted file mode 100755
index b63feb7141..0000000000
--- a/cc/scripts/cppbuild.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash -x
-###########################################################
-#Licensed to the Apache Software Foundation (ASF) under one
-#or more contributor license agreements. See the NOTICE file
-#distributed with this work for additional information
-#regarding copyright ownership. The ASF licenses this file
-#to you under the Apache License, Version 2.0 (the
-#"License"); you may not use this file except in compliance
-#with the License. You may obtain a copy of the License at
-#
-#http://www.apache.org/licenses/LICENSE-2.0
-#
-#Unless required by applicable law or agreed to in writing,
-#software distributed under the License is distributed on an
-#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#KIND, either express or implied. See the License for the
-#specific language governing permissions and limitations
-#under the License.
-###########################################################
-
-make distclean && ./bootstrap && ./configure && make \ No newline at end of file
diff --git a/cc/scripts/dotnetbuild.sh b/cc/scripts/dotnetbuild.sh
deleted file mode 100644
index 51d2110757..0000000000
--- a/cc/scripts/dotnetbuild.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash -x
-###########################################################
-#Licensed to the Apache Software Foundation (ASF) under one
-#or more contributor license agreements. See the NOTICE file
-#distributed with this work for additional information
-#regarding copyright ownership. The ASF licenses this file
-#to you under the Apache License, Version 2.0 (the
-#"License"); you may not use this file except in compliance
-#with the License. You may obtain a copy of the License at
-#
-#http://www.apache.org/licenses/LICENSE-2.0
-#
-#Unless required by applicable law or agreed to in writing,
-#software distributed under the License is distributed on an
-#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#KIND, either express or implied. See the License for the
-#specific language governing permissions and limitations
-#under the License.
-###########################################################
-
-mono $NANT_HOME/bin/NAnt.exe test \ No newline at end of file
diff --git a/cc/scripts/javaconfig.sh b/cc/scripts/javaconfig.sh
deleted file mode 100755
index 7a1a3a1a7d..0000000000
--- a/cc/scripts/javaconfig.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/bash
-###########################################################
-#Licensed to the Apache Software Foundation (ASF) under one
-#or more contributor license agreements. See the NOTICE file
-#distributed with this work for additional information
-#regarding copyright ownership. The ASF licenses this file
-#to you under the Apache License, Version 2.0 (the
-#"License"); you may not use this file except in compliance
-#with the License. You may obtain a copy of the License at
-#
-#http://www.apache.org/licenses/LICENSE-2.0
-#
-#Unless required by applicable law or agreed to in writing,
-#software distributed under the License is distributed on an
-#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#KIND, either express or implied. See the License for the
-#specific language governing permissions and limitations
-#under the License.
-###########################################################
-
-# copy the profiles
-sed "s#store_home#$CPPSTORE_HOME#g" $CC_HOME/cc/config/java/cpp.noprefetch.testprofile > "$CC_HOME/java/"/cpp.noprefetch.testprofile
-sed "s#store_home#$CPPSTORE_HOME#g" $CC_HOME/cc/config/java/cpp.testprofile > "$CC_HOME/java"/cpp.testprofile
-QPID_JARS=`find "$CC_HOME/java/build/lib" -name '*.jar' | tr '\n' ":"`
-QPID_JARS=local.classes=$QPID_JARS
-sed "s#local.classes=.*#$QPID_JARS#g" $TS_HOME/bin/build.properties > "$TS_HOME/bin"/build.properties-new
-mv $TS_HOME/bin/build.properties-new $TS_HOME/bin/build.properties \ No newline at end of file
diff --git a/cc/scripts/javajmstck.sh b/cc/scripts/javajmstck.sh
deleted file mode 100644
index 9d279ed38e..0000000000
--- a/cc/scripts/javajmstck.sh
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-cleanup(){
- echo "kill any existing broker instance"
- stopBroker
- rm -rf $CC_HOME/jmstck-data/*
-}
-
-runBroker(){
- echo "******************************************************"
- echo "Starting C++ broker"
- ulimit -c unlimited
- $CC_HOME/cpp/src/qpidd -t -d --data-dir $CC_HOME/jmstck-data --load-module=$CPPSTORE_HOME/lib/.libs/libbdbstore.so --port 0 --auth no --log-output $CC_HOME/jmstck-broker.log --no-module-dir
- export QPID_PORT=`grep "Listening on TCP port" $CC_HOME/jmstck-broker.log | tail -n 1 | awk '{print $8}'`
- echo " broker running on port: " $QPID_PORT
- echo "******************************************************"
- sed "s/qpid_port/$QPID_PORT/g" $CC_HOME/cc/config/java/jndi.properties > "$TS_HOME/classes"/jndi.properties
-}
-
-runTck(){
- echo "******************************************************"
- echo "Starting the TCK for the $1 iteration"
- echo "******************************************************"
- cd $TS_HOME/bin
- $TS_HOME/bin/tsant runclient -Dwork.dir=work -Dreport.dir=report 2&>1 > $TS_HOME/tck$1.log
- echo "******************************************************"
- echo "TCK finished the $1 iteration"
- echo "******************************************************"
-}
-
-printResults(){
- TESTS_STR=`grep -a "\[java\] Completed running [0-9]* tests" $TS_HOME/tck$1.log`
- PASSED_STR=`grep -a "\[java\] Number of Tests Passed =" $TS_HOME/tck$1.log`
- FAILED_STR=`grep -a "Some tests did not pass" $TS_HOME/tck$1.log`
- echo "-----------------------------------------"
- echo "TCK run #$1 results:"
- echo $TESTS_STR
- echo $PASSED_STR
- echo $FAILED_STR
- if [ "$FAILED_STR" != "" ]; then
- echo "SOME TCK FAILURES DETECTED: "
- fi
- echo "------------------------------------------"
-}
-
-stopBroker(){
- echo "************************"
- echo "Stopping the C++ broker"
- echo "************************"
- $CC_HOME/cpp/src/qpidd -q -p $QPID_PORT
-}
-
-cleanup
-counter=0
-runBroker
-for j in 1 2
-do
- counter=`expr $counter + 1`
- runTck $counter
- printResults $counter
-done
-cleanup
diff --git a/cc/scripts/javareport.sh b/cc/scripts/javareport.sh
deleted file mode 100755
index 2b2469d31d..0000000000
--- a/cc/scripts/javareport.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-###########################################################
-#Licensed to the Apache Software Foundation (ASF) under one
-#or more contributor license agreements. See the NOTICE file
-#distributed with this work for additional information
-#regarding copyright ownership. The ASF licenses this file
-#to you under the Apache License, Version 2.0 (the
-#"License"); you may not use this file except in compliance
-#with the License. You may obtain a copy of the License at
-#
-#http://www.apache.org/licenses/LICENSE-2.0
-#
-#Unless required by applicable law or agreed to in writing,
-#software distributed under the License is distributed on an
-#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#KIND, either express or implied. See the License for the
-#specific language governing permissions and limitations
-#under the License.
-###########################################################
-cd "$CC_HOME/java/build"
-pwd
-if [[ -d report_$1 ]]; then rm -fr report_$1; fi
-if [[ -d report ]]; then mv report report_$1; fi
-rm -rf ./results/*
-rm -rf ./data/* \ No newline at end of file
diff --git a/cc/scripts/runbroker.sh b/cc/scripts/runbroker.sh
deleted file mode 100644
index 43d9b39056..0000000000
--- a/cc/scripts/runbroker.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/sh
-###########################################################
-#Licensed to the Apache Software Foundation (ASF) under one
-#or more contributor license agreements. See the NOTICE file
-#distributed with this work for additional information
-#regarding copyright ownership. The ASF licenses this file
-#to you under the Apache License, Version 2.0 (the
-#"License"); you may not use this file except in compliance
-#with the License. You may obtain a copy of the License at
-#
-#http://www.apache.org/licenses/LICENSE-2.0
-#
-#Unless required by applicable law or agreed to in writing,
-#software distributed under the License is distributed on an
-#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#KIND, either express or implied. See the License for the
-#specific language governing permissions and limitations
-#under the License.
-###########################################################
-
-cleanup()
-{
- echo "******************************************************"
- echo "Cleanup"
- echo "******************************************************"
- for PID in `ps aux | grep 'qpidd'|grep 'broker.log'|grep -v 'grep'|awk '{ print $2 }'`
- do
- kill -9 $PID
- done
-}
-
-run_broker()
-{
- echo "******************************************************"
- echo "Starting C++ broker"
- echo "******************************************************"
- echo ""
- $CC_HOME/cpp/src/qpidd -t -d --auth no --no-data-dir --log-output $CC_HOME/broker.log
-}
-
-cleanup
-run_broker \ No newline at end of file
diff --git a/cc/scripts/stopbroker.sh b/cc/scripts/stopbroker.sh
deleted file mode 100644
index f5839e141f..0000000000
--- a/cc/scripts/stopbroker.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/sh
-###########################################################
-#Licensed to the Apache Software Foundation (ASF) under one
-#or more contributor license agreements. See the NOTICE file
-#distributed with this work for additional information
-#regarding copyright ownership. The ASF licenses this file
-#to you under the Apache License, Version 2.0 (the
-#"License"); you may not use this file except in compliance
-#with the License. You may obtain a copy of the License at
-#
-#http://www.apache.org/licenses/LICENSE-2.0
-#
-#Unless required by applicable law or agreed to in writing,
-#software distributed under the License is distributed on an
-#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#KIND, either express or implied. See the License for the
-#specific language governing permissions and limitations
-#under the License.
-###########################################################
-
-
-stop_broker()
-{
- echo "******************************************************"
- echo "Stopping the C++ broker"
- echo "******************************************************"
- echo ""
- $CC_HOME/cpp/src/qpidd -q
-}
-
-stop_broker \ No newline at end of file
diff --git a/cc/scripts/verify b/cc/scripts/verify
deleted file mode 100755
index 35191b17c9..0000000000
--- a/cc/scripts/verify
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/bin/sh
-###########################################################
-#Licensed to the Apache Software Foundation (ASF) under one
-#or more contributor license agreements. See the NOTICE file
-#distributed with this work for additional information
-#regarding copyright ownership. The ASF licenses this file
-#to you under the Apache License, Version 2.0 (the
-#"License"); you may not use this file except in compliance
-#with the License. You may obtain a copy of the License at
-#
-#http://www.apache.org/licenses/LICENSE-2.0
-#
-#Unless required by applicable law or agreed to in writing,
-#software distributed under the License is distributed on an
-#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#KIND, either express or implied. See the License for the
-#specific language governing permissions and limitations
-#under the License.
-###########################################################
-
-export DOTNET_EXAMPLES=$CC_HOME/dotnet/client-010/bin/mono-2.0/debug
-export CLASSPATH=`find "$CC_HOME/java/build/lib" -name '*.jar' | tr '\n' ":"`
-export CPP=$CC_HOME/cpp/examples
-export JAVA=$CC_HOME/java/client/example/src/main/java
-export PYTHONPATH=$CC_HOME/python/
-export PYTHON_EXAMPLES=$CC_HOME/python/examples
-
-cleanup() {
- test -n "$QPIDD" && $QPIDD -q # Private broker
- kill %% > /dev/null 2>&1 # Leftover background jobs
-}
-
-trap cleanup EXIT
-
-ARGS="${QPID_HOST:-localhost} $QPID_PORT"
-
-outfile() {
- file=$1
- while [ -f $file.out ]; do file="${file}X"; done
- echo $file.out
- }
-
-fail() { test -n "$*" && echo $* 1>&2 ; FAIL=1; return 1; }
-
-client()
-{
- "$@" $ARGS > `outfile $*` || fail;
-}
-
-clients() { for cmd in "$@"; do client $cmd; done; }
-
-waitfor() { until grep -a -l "$2" $1 >/dev/null 2>&1 ; do sleep 1 ; done ; }
-
-background() {
- pattern=$1; shift
- out=`outfile $*`
- eval "$* $ARGS > $out &" || { fail; return 1; }
- waitfor $out "$pattern"
-}
-
-name() {
- for x in $*; do name="$name `basename $x`"; done
- echo $name;
-}
-
-outputs() {
- wait 2> /dev/null # Wait for all backgroud processes to complete
- rm -f $script.out
- for f in "$@"; do
- { echo "==== `name $f`"; eval "cat $f"; } >> $script.out || fail
- rm -rf `echo $f| awk '{ print $1 }'`
- done
-}
-
-verify() {
- FAIL=
- if [ -d $1 ]; then dir=$1; script=verify;
- else dir=`dirname $1`; script=`basename $1`; fi
- cd $dir || return 1
- rm -f *.out
- echo "Running: $dir/$script"
- { source ./$script && diff -ac $script.out $script.in ; } || fail
- test -z "$FAIL" && rm -f *.out
- return $FAIL
-}
-
-HEX="[a-fA-F0-9]"
-remove_uuid() {
- sed "s/$HEX\{8\}-$HEX\{4\}-$HEX\{4\}-$HEX\{4\}-$HEX\{12\}//g" $*
-}
-remove_uuid64() {
- sed 's/[-A-Za-z0-9_]\{22\}==//g' $*
-}
-
-
-for example in "$@"; do
- echo "Running: $example "
- if ( verify $example; ) then echo "PASS"; else echo "FAIL"; RET=1; fi
- done
-exit $RET
diff --git a/cc/scripts/verify_all b/cc/scripts/verify_all
deleted file mode 100755
index 8d3ec669a7..0000000000
--- a/cc/scripts/verify_all
+++ /dev/null
@@ -1,166 +0,0 @@
-#!/bin/sh
-###########################################################
-#Licensed to the Apache Software Foundation (ASF) under one
-#or more contributor license agreements. See the NOTICE file
-#distributed with this work for additional information
-#regarding copyright ownership. The ASF licenses this file
-#to you under the Apache License, Version 2.0 (the
-#"License"); you may not use this file except in compliance
-#with the License. You may obtain a copy of the License at
-#
-#http://www.apache.org/licenses/LICENSE-2.0
-#
-#Unless required by applicable law or agreed to in writing,
-#software distributed under the License is distributed on an
-#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#KIND, either express or implied. See the License for the
-#specific language governing permissions and limitations
-#under the License.
-###########################################################
-
-cleanup()
-{
- echo "******************************************************"
- echo "Cleanup"
- echo "******************************************************"
- for PID in `ps aux | grep 'qpidd'|grep 'broker.log'|grep -v 'grep'|awk '{ print $2 }'`
- do
- kill -9 $PID
- done
-}
-
-run_broker()
-{
- echo "******************************************************"
- echo "Starting C++ broker"
- echo "******************************************************"
- echo ""
- $CC_HOME/cpp/src/qpidd -t -d --auth no --no-data-dir --log-to-file $CC_HOME/broker.log
-}
-
-stop_broker()
-{
- echo "******************************************************"
- echo "Stopping the C++ broker"
- echo "******************************************************"
- echo ""
- $CC_HOME/cpp/src/qpidd -q
-}
-
-verify()
-{
- #echo "arg " $2 " path: " $1
- for dir in $(find $1 -mindepth 1 -maxdepth 1 -type d -not -name '*.svn' -not -name $3 )
- do
- echo $dir
- for script in $(find $dir -mindepth 1 -maxdepth 1 -type f -name $2 -not -name '*.*')
- do
- # echo "script:" $script
- cleanup
- run_broker
- $CC_HOME/cc/scripts/verify $script >> $CC_HOME/script.log 2>&1
- killall 'verify'
- stop_broker
- done
-done
-}
-
-run_python_python()
-{
-echo "-----------<Running Python/Python combination>---------"
-verify $CC_HOME/python/examples "verify" "xml-exchange"
-echo "-----------</Running Python/Python combination>---------"
-echo ""
-}
-
-
-run_cpp_cpp()
-{
-echo "-----------<Running C++/C++ combination>---------"
-verify $CC_HOME/cpp/examples "verify" "*.svn"
-echo "-----------</Running C++/C++ combination>--------"
-echo ""
-}
-
-run_python_cpp_comb()
-{
-echo "-----------<Running Python/C++ combination>---------"
-verify $CC_HOME/cpp/examples "verify_cpp_python" "*.svn"
-verify $CC_HOME/cpp/examples "verify_python_cpp" "*.svn"
-echo "-----------</Running Python/C++ combination>--------"
-echo ""
-}
-
-
-run_java_java()
-{
-echo "-----------<Running Java/Java combination>---------"
-verify $CC_HOME/java/client/example/src/main/java/org/apache/qpid/example/jmsexample "verify" "*.svn"
-echo "-----------</Running Java/Java combination>--------"
-echo ""
-}
-
-run_java_cpp_comb()
-{
-echo "-----------<Running Java/C++ combination>---------"
-verify $CC_HOME/java/client/example/src/main/java/org/apache/qpid/example/jmsexample "verify_java_cpp" "*.svn"
-verify $CC_HOME/java/client/example/src/main/java/org/apache/qpid/example/jmsexample "verify_cpp_java" "*.svn"
-echo "-----------</Running Java/C++ combination>--------"
-echo ""
-}
-
-run_java_python_comb()
-{
-echo "-----------<Running Java/Python combination>---------"
-verify $CC_HOME/java/client/example/src/main/java/org/apache/qpid/example/jmsexample "verify_java_python" "*.svn"
-verify $CC_HOME/java/client/example/src/main/java/org/apache/qpid/example/jmsexample "verify_python_java" "*.svn"
-echo "-----------</Running Java/Python combination>--------"
-echo ""
-}
-
-run_dotnet_dotnet()
-{
-echo "-----------<Running .Net/.Net combination>---------"
-verify $CC_HOME/dotnet/client-010/examples/ "verify" "*.svn"
-echo "-----------</Running .Net/.Net combination>--------"
-echo ""
-}
-
-run_cpp_dotnet()
-{
-echo "-----------<Running C++/.Net combination>---------"
-verify $CC_HOME/dotnet/client-010/examples/ "verify_cpp_dotnet" "*.svn"
-verify $CC_HOME/dotnet/client-010/examples/ "verify_dotnet_cpp" "*.svn"
-echo "-----------</Running C++/.Net combination>--------"
-echo ""
-}
-
-run_java_dotnet()
-{
-echo "-----------<Running Java/.Net combination>---------"
-verify $CC_HOME/dotnet/client-010/examples/ "verify_java_dotnet" "*.svn"
-verify $CC_HOME/dotnet/client-010/examples/ "verify_dotnet_java" "*.svn"
-echo "-----------</Running Java/.Net combination>--------"
-echo ""
-}
-
-run_python_dotnet()
-{
-echo "-----------<Running Python/.Net combination>---------"
-verify $CC_HOME/dotnet/client-010/examples/ "verify_python_dotnet" "*.svn"
-verify $CC_HOME/dotnet/client-010/examples/ "verify_dotnet_python" "*.svn"
-echo "-----------</Running Python/.Net combination>--------"
-echo ""
-}
-
-
-run_python_python
-run_python_cpp_comb
-run_cpp_cpp
-run_java_java
-run_java_cpp_comb
-run_java_python_comb
-run_dotnet_dotnet
-run_cpp_dotnet
-run_java_dotnet
-run_python_dotnet \ No newline at end of file
diff --git a/cpp/bindings/qmf/ruby/qmf.rb b/cpp/bindings/qmf/ruby/qmf.rb
index 34d3255d8d..9fbd50cbf6 100644
--- a/cpp/bindings/qmf/ruby/qmf.rb
+++ b/cpp/bindings/qmf/ruby/qmf.rb
@@ -26,18 +26,28 @@ module Qmf
# Pull all the TYPE_* constants into Qmf namespace. Maybe there's an easier way?
Qmfengine.constants.each do |c|
+ c = c.to_s
if c.index('TYPE_') == 0 or c.index('ACCESS_') == 0 or c.index('DIR_') == 0 or
c.index('CLASS_') == 0 or c.index('SEV_') == 0
const_set(c, Qmfengine.const_get(c))
end
end
+ module StringHelpers
+ def ensure_encoding(str)
+ enc = (Encoding.default_external.name || "UTF-8" rescue "UTF-8")
+ str.respond_to?(:force_encoding) ? str.force_encoding(enc) : str
+ end
+ end
+
class Util
+ include StringHelpers
+
def qmf_to_native(val)
case val.getType
when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.asUint
when TYPE_UINT64 then val.asUint64
- when TYPE_SSTR, TYPE_LSTR then val.asString
+ when TYPE_SSTR, TYPE_LSTR then ensure_encoding(val.asString)
when TYPE_ABSTIME then val.asInt64
when TYPE_DELTATIME then val.asUint64
when TYPE_REF then ObjectId.new(val.asObjectId)
@@ -161,6 +171,7 @@ module Qmf
##==============================================================================
class ConnectionSettings
+ include StringHelpers
attr_reader :impl
def initialize(url = nil)
@@ -192,7 +203,7 @@ module Qmf
def get_attr(key)
_v = @impl.getAttr(key)
if _v.isString()
- return _v.asString()
+ return ensure_encoding(_v.asString())
elsif _v.isUint()
return _v.asUint()
elsif _v.isBool()
@@ -348,7 +359,7 @@ module Qmf
@broker = kwargs[:broker] if kwargs.include?(:broker)
@allow_sets = :true
- if cls:
+ if cls
@event_class = cls
@impl = Qmfengine::Event.new(@event_class.impl)
elsif kwargs.include?(:impl)
@@ -434,7 +445,7 @@ module Qmf
@allow_sets = :false
@broker = kwargs[:broker] if kwargs.include?(:broker)
- if cls:
+ if cls
@object_class = cls
@impl = Qmfengine::Object.new(@object_class.impl)
elsif kwargs.include?(:impl)
@@ -707,6 +718,8 @@ module Qmf
end
class MethodResponse
+ include StringHelpers
+
def initialize(impl)
@impl = Qmfengine::MethodResponse.new(impl)
end
@@ -720,7 +733,7 @@ module Qmf
end
def text
- exception.asString
+ ensure_encoding(exception.asString)
end
def args
@@ -885,6 +898,7 @@ module Qmf
end
class SchemaClassKey
+ include StringHelpers
attr_reader :impl
def initialize(i)
@impl = Qmfengine::SchemaClassKey.new(i)
@@ -899,7 +913,7 @@ module Qmf
end
def to_s
- @impl.asString
+ ensure_encoding(@impl.asString)
end
end
diff --git a/cpp/bindings/qmf/tests/run_interop_tests b/cpp/bindings/qmf/tests/run_interop_tests
index 83e7f2593b..c370f211af 100755
--- a/cpp/bindings/qmf/tests/run_interop_tests
+++ b/cpp/bindings/qmf/tests/run_interop_tests
@@ -24,6 +24,7 @@ MY_DIR=`dirname \`which $0\``
QPID_DIR=${MY_DIR}/../../../..
BUILD_DIR=../../..
PYTHON_DIR=${QPID_DIR}/python
+TOOLS_PY_DIR=${QPID_DIR}/tools/src/py
QMF_DIR=${QPID_DIR}/extras/qmf
QMF_DIR_PY=${QMF_DIR}/src/py
BROKER_DIR=${BUILD_DIR}/src
@@ -68,7 +69,7 @@ TESTS_FAILED=0
if test -d ${PYTHON_DIR} ; then
start_broker
echo "Running qmf interop tests using broker on port $BROKER_PORT"
- PYTHONPATH=${PYTHON_DIR}:${QMF_DIR_PY}:${MY_DIR}
+ PYTHONPATH=${PYTHON_DIR}:${QMF_DIR_PY}:${MY_DIR}:${TOOLS_PY_DIR}
export PYTHONPATH
if test -d ${PYTHON_LIB_DIR} ; then
diff --git a/cpp/bindings/qpid/Makefile.am b/cpp/bindings/qpid/Makefile.am
index eaf45c2076..ae81696f27 100644
--- a/cpp/bindings/qpid/Makefile.am
+++ b/cpp/bindings/qpid/Makefile.am
@@ -35,7 +35,7 @@ if HAVE_PERL_DEVEL
INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/src -I$(top_builddir)/src -I$(PERL_INC)
-EXTRA_DIST += perl/perl.i
+EXTRA_DIST += perl/perl.i perl/CMakeLists.txt
BUILT_SOURCES = perl/cqpid_perl.cpp
SWIG_FLAGS = -w362,401
diff --git a/cpp/bindings/qpid/dotnet/Makefile.am b/cpp/bindings/qpid/dotnet/Makefile.am
index f212a37bbe..82ae315578 100644
--- a/cpp/bindings/qpid/dotnet/Makefile.am
+++ b/cpp/bindings/qpid/dotnet/Makefile.am
@@ -80,7 +80,6 @@ EXTRA_DIST = configure-windows.ps1 \
examples/msvc9/csharp.map.callback.sender/csharp.map.callback.sender.csproj \
examples/msvc9/csharp.map.receiver/csharp.map.receiver.csproj \
examples/msvc9/csharp.map.sender/csharp.map.sender.csproj \
- extra_dist.txt \
Makefile.am \
msvc10/org.apache.qpid.messaging.sessionreceiver.sln \
msvc10/org.apache.qpid.messaging.sln \
@@ -93,7 +92,6 @@ EXTRA_DIST = configure-windows.ps1 \
src/AssemblyInfo.cpp \
src/Connection.cpp \
src/Connection.h \
- src/Duration.cpp \
src/Duration.h \
src/FailoverUpdates.cpp \
src/FailoverUpdates.h \
diff --git a/cpp/bindings/qpid/python/python.i b/cpp/bindings/qpid/python/python.i
index 9d45bf54ee..a53cf3b853 100644
--- a/cpp/bindings/qpid/python/python.i
+++ b/cpp/bindings/qpid/python/python.i
@@ -132,7 +132,10 @@ static PyObject* pTransportFailure;
# equivalent in C++, so we will translate them to sasl_mechanism
# when possible.
def __init__(self, url=None, **options):
- args = [url] if url else []
+ if url:
+ args = [url]
+ else:
+ args = []
if options :
if "sasl_mechanisms" in options :
if ' ' in options.get("sasl_mechanisms",'') :
@@ -196,7 +199,7 @@ static PyObject* pTransportFailure;
self._acknowledge_all(sync)
__swig_getmethods__["connection"] = getConnection
- if _newclass: connection = _swig_property(getConnection)
+ if _newclass: connection = property(getConnection)
%}
}
@@ -205,10 +208,10 @@ static PyObject* pTransportFailure;
%pythoncode %{
__swig_getmethods__["capacity"] = getCapacity
__swig_setmethods__["capacity"] = setCapacity
- if _newclass: capacity = _swig_property(getCapacity, setCapacity)
+ if _newclass: capacity = property(getCapacity, setCapacity)
__swig_getmethods__["session"] = getSession
- if _newclass: session = _swig_property(getSession)
+ if _newclass: session = property(getSession)
%}
%pythoncode %{
@@ -233,10 +236,10 @@ static PyObject* pTransportFailure;
__swig_getmethods__["capacity"] = getCapacity
__swig_setmethods__["capacity"] = setCapacity
- if _newclass: capacity = _swig_property(getCapacity, setCapacity)
+ if _newclass: capacity = property(getCapacity, setCapacity)
__swig_getmethods__["session"] = getSession
- if _newclass: session = _swig_property(getSession)
+ if _newclass: session = property(getSession)
%}
}
@@ -298,24 +301,23 @@ static PyObject* pTransportFailure;
self.setContent(content)
__swig_getmethods__["content"] = _get_content
__swig_setmethods__["content"] = _set_content
- if _newclass: content = _swig_property(_get_content, _set_content)
+ if _newclass: content = property(_get_content, _set_content)
__swig_getmethods__["content_type"] = getContentType
__swig_setmethods__["content_type"] = setContentType
- if _newclass: content_type = _swig_property(getContentType,
- setContentType)
+ if _newclass: content_type = property(getContentType, setContentType)
__swig_getmethods__["id"] = getMessageId
__swig_setmethods__["id"] = setMessageId
- if _newclass: id = _swig_property(getMessageId, setMessageId)
+ if _newclass: id = property(getMessageId, setMessageId)
__swig_getmethods__["subject"] = getSubject
__swig_setmethods__["subject"] = setSubject
- if _newclass: subject = _swig_property(getSubject, setSubject)
+ if _newclass: subject = property(getSubject, setSubject)
__swig_getmethods__["priority"] = getPriority
__swig_setmethods__["priority"] = setPriority
- if _newclass: priority = _swig_property(getPriority, setPriority)
+ if _newclass: priority = property(getPriority, setPriority)
def getTtl(self) :
return self._getTtl().getMilliseconds()/1000.0
@@ -323,28 +325,26 @@ static PyObject* pTransportFailure;
self._setTtl(Duration(int(1000*duration)))
__swig_getmethods__["ttl"] = getTtl
__swig_setmethods__["ttl"] = setTtl
- if _newclass: ttl = _swig_property(getTtl, setTtl)
+ if _newclass: ttl = property(getTtl, setTtl)
__swig_getmethods__["user_id"] = getUserId
__swig_setmethods__["user_id"] = setUserId
- if _newclass: user_id = _swig_property(getUserId, setUserId)
+ if _newclass: user_id = property(getUserId, setUserId)
__swig_getmethods__["correlation_id"] = getCorrelationId
__swig_setmethods__["correlation_id"] = setCorrelationId
- if _newclass: correlation_id = _swig_property(getCorrelationId,
- setCorrelationId)
+ if _newclass: correlation_id = property(getCorrelationId, setCorrelationId)
__swig_getmethods__["redelivered"] = getRedelivered
__swig_setmethods__["redelivered"] = setRedelivered
- if _newclass: redelivered = _swig_property(getRedelivered,
- setRedelivered)
+ if _newclass: redelivered = property(getRedelivered, setRedelivered)
__swig_getmethods__["durable"] = getDurable
__swig_setmethods__["durable"] = setDurable
- if _newclass: durable = _swig_property(getDurable, setDurable)
+ if _newclass: durable = property(getDurable, setDurable)
__swig_getmethods__["properties"] = getProperties
- if _newclass: properties = _swig_property(getProperties)
+ if _newclass: properties = property(getProperties)
def getReplyTo(self) :
return self._getReplyTo().str()
@@ -352,7 +352,7 @@ static PyObject* pTransportFailure;
self._setReplyTo(Address(address_str))
__swig_getmethods__["reply_to"] = getReplyTo
__swig_setmethods__["reply_to"] = setReplyTo
- if _newclass: reply_to = _swig_property(getReplyTo, setReplyTo)
+ if _newclass: reply_to = property(getReplyTo, setReplyTo)
def __repr__(self):
args = []
diff --git a/cpp/bindings/qpid/ruby/README.rdoc b/cpp/bindings/qpid/ruby/README.rdoc
index 0ae7e5cbed..478fc939d9 100644
--- a/cpp/bindings/qpid/ruby/README.rdoc
+++ b/cpp/bindings/qpid/ruby/README.rdoc
@@ -2,7 +2,7 @@
Qpid is an cross-platform enterprise messaging system.
-Version :: 0.10.0.alpha.0
+Version :: 0.17.0
= Links
diff --git a/cpp/bindings/qpid/ruby/Rakefile b/cpp/bindings/qpid/ruby/Rakefile
index df0b3970b6..99c3e13c83 100644
--- a/cpp/bindings/qpid/ruby/Rakefile
+++ b/cpp/bindings/qpid/ruby/Rakefile
@@ -120,7 +120,9 @@ spec = Gem::Specification.new do |s|
"lib/**/*.rb",
"test/**/*.rb",
"examples/**/*.rb",
- "ext/**/*"]
+ "ext/**/*",
+ "features/**/*",
+ "spec/**/*"]
end
Gem::PackageTask.new(spec) do |pkg|
diff --git a/cpp/bindings/qpid/ruby/features/step_definitions/address_steps.rb b/cpp/bindings/qpid/ruby/features/step_definitions/address_steps.rb
index e5071ca4e6..845cc2b116 100644
--- a/cpp/bindings/qpid/ruby/features/step_definitions/address_steps.rb
+++ b/cpp/bindings/qpid/ruby/features/step_definitions/address_steps.rb
@@ -1,3 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
Given /^an Address with the name "([^"]*)" and subject "([^"]*)" and option "([^"]*)" set to "([^"]*)"$/ do |name, subject, key, value|
options = Hash.new
options["#{key}"] = "#{value}"
diff --git a/cpp/bindings/qpid/ruby/features/step_definitions/connection_steps.rb b/cpp/bindings/qpid/ruby/features/step_definitions/connection_steps.rb
index b4146ac1fb..3fe3e6941f 100644
--- a/cpp/bindings/qpid/ruby/features/step_definitions/connection_steps.rb
+++ b/cpp/bindings/qpid/ruby/features/step_definitions/connection_steps.rb
@@ -1,3 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
# close all connections
After do
@connection.close if @connection
diff --git a/cpp/bindings/qpid/ruby/features/step_definitions/receiver_steps.rb b/cpp/bindings/qpid/ruby/features/step_definitions/receiver_steps.rb
index 8157fb7735..a8c8aa4a43 100644
--- a/cpp/bindings/qpid/ruby/features/step_definitions/receiver_steps.rb
+++ b/cpp/bindings/qpid/ruby/features/step_definitions/receiver_steps.rb
@@ -1,3 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
Given /^an existing receiver for "([^"]*)"$/ do |address|
steps %Q{
Given an open session
diff --git a/cpp/bindings/qpid/ruby/features/step_definitions/sender_steps.rb b/cpp/bindings/qpid/ruby/features/step_definitions/sender_steps.rb
index 3ff081c7d2..93dbd2d5c0 100644
--- a/cpp/bindings/qpid/ruby/features/step_definitions/sender_steps.rb
+++ b/cpp/bindings/qpid/ruby/features/step_definitions/sender_steps.rb
@@ -1,3 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
Given /^the message "([^"]*)" is sent$/ do |content|
@sender.send Qpid::Messaging::Message.new :content => "#{content}"
end
diff --git a/cpp/bindings/qpid/ruby/features/step_definitions/session_steps.rb b/cpp/bindings/qpid/ruby/features/step_definitions/session_steps.rb
index f97e423ee9..cf775d917d 100644
--- a/cpp/bindings/qpid/ruby/features/step_definitions/session_steps.rb
+++ b/cpp/bindings/qpid/ruby/features/step_definitions/session_steps.rb
@@ -1,3 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
Given /^a closed session/ do
steps %Q{
Given an open connection
diff --git a/cpp/bindings/qpid/ruby/lib/qpid/encoding.rb b/cpp/bindings/qpid/ruby/lib/qpid/encoding.rb
index 7b9130156d..2f20fab18e 100644
--- a/cpp/bindings/qpid/ruby/lib/qpid/encoding.rb
+++ b/cpp/bindings/qpid/ruby/lib/qpid/encoding.rb
@@ -45,8 +45,10 @@ module Qpid
content_type = message.content_type unless content_type
case content_type
- when "amqp/map": Cqpid.decodeMap message.message_impl
- when "amqp/list": Cqpid.decodeList message.message_impl
+ when "amqp/map"
+ Cqpid.decodeMap message.message_impl
+ when "amqp/list"
+ Cqpid.decodeList message.message_impl
end
message.content
diff --git a/cpp/bindings/qpid/ruby/lib/qpid/version.rb b/cpp/bindings/qpid/ruby/lib/qpid/version.rb
index f387ba98dc..39524e428f 100644
--- a/cpp/bindings/qpid/ruby/lib/qpid/version.rb
+++ b/cpp/bindings/qpid/ruby/lib/qpid/version.rb
@@ -22,7 +22,7 @@ module Qpid
module Version
NUMBERS = [MAJOR = 0,
- MINOR = 13,
+ MINOR = 17,
BUILD = 0]
end
diff --git a/cpp/bindings/swig_python_typemaps.i b/cpp/bindings/swig_python_typemaps.i
index e99ce65254..25a4e46b18 100644
--- a/cpp/bindings/swig_python_typemaps.i
+++ b/cpp/bindings/swig_python_typemaps.i
@@ -25,7 +25,11 @@ static PyObject* pUuidModule;
%}
%init %{
- pUuidModule = PyImport_ImportModule("uuid");
+ /* Instead of directly referencing the uuid module (which is not available
+ * on older versions of Python), reference the wrapper defined in
+ * qpid.datatypes.
+ */
+ pUuidModule = PyImport_ImportModule("qpid.datatypes");
/* Although it is not required, we'll publish the uuid module in our
* module, as if this module was a python module and we called
diff --git a/cpp/configure.ac b/cpp/configure.ac
index 8729ace169..c68fed932e 100644
--- a/cpp/configure.ac
+++ b/cpp/configure.ac
@@ -27,7 +27,7 @@ AC_PROG_CC_STDC
AM_PROG_CC_C_O
AC_PROG_CXX
AC_USE_SYSTEM_EXTENSIONS
-AC_LANG([C++])
+AC_LANG([C++])
# Check for optional use of help2man
AC_CHECK_PROG([HELP2MAN], [help2man], [help2man])
@@ -83,14 +83,14 @@ if test x$GXX = xyes; then
gl_COMPILER_FLAGS(-Wvolatile-register-var)
gl_COMPILER_FLAGS(-Winvalid-pch)
gl_COMPILER_FLAGS(-Wno-system-headers)
- gl_COMPILER_FLAGS(-Woverloaded-virtual)
+ gl_COMPILER_FLAGS(-Woverloaded-virtual)
AC_SUBST([WARNING_CFLAGS], [$COMPILER_FLAGS])
AC_DEFINE([lint], 1, [Define to 1 if the compiler is checking for lint.])
COMPILER_FLAGS=
fi
else
AC_CHECK_DECL([__SUNPRO_CC], [SUNCC=yes], [SUNCC=no])
-
+
# Set up for sun CC compiler
if test x$SUNCC = xyes; then
if test "${enableval}" = yes; then
@@ -118,7 +118,7 @@ LIBS=$gl_saved_libs
gl_CLOCK_TIME
-# Enable Valgrind
+# Enable Valgrind
AC_ARG_ENABLE([valgrind],
[AS_HELP_STRING([--enable-valgrind],
[run valgrind memory checker on tests, if available (default yes)])],
@@ -203,13 +203,26 @@ AM_CONDITIONAL([HAVE_RUBY_DEVEL], [test -f $RUBY_INC/ruby.h && test -n "$SWIG"])
# Python bindings: To build python wrappers, the python-devel files must be present.
AM_PATH_PYTHON()
AS_IF([test -n "$PYTHON"], [
- PKG_CHECK_MODULES([PYTHON], [python], [have_python_dev=yes],[
+ PKG_CHECK_MODULES([PYTHON], [python-$PYTHON_VERSION], [have_python_dev=yes],[
+ # We didn't find pkg-config information for python-2.7 this
+ # may mean we have an earlier python version:
+ # Try to find the include and library files directly in the default
+ # location
+ AC_MSG_WARN([Didn't find Python 2.7 developer libs - looking for older version])
+ PYTHON_INC=$($PYTHON -c 'import distutils.sysconfig; print distutils.sysconfig.get_python_inc()')
+ AC_CHECK_LIB([python$PYTHON_VERSION],[Py_Initialize])
+ AC_CHECK_FILE(["$PYTHON_INC/Python.h"],[
+ PYTHON_CFLAGS="-I$PYTHON_INC"
+ PYTHON_LIBS="-lpython$PYTHON_VERSION"
+ have_python_dev=yes
+ ],[
if test yes = "$with_python" ; then
AC_MSG_ERROR([Couldn't find Python developer libs - you probably need to install a python-dev or python-devel package])
else
AC_MSG_WARN([Couldn't find Python developer libs - you probably don't have a python-dev or python-devel package installed])
fi
])
+ ])
AC_SUBST(PYTHON_CFLAGS)
AC_SUBST(PYTHON_LIBS)
])
@@ -249,7 +262,7 @@ tmp_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS -L/usr/lib/openais -L/usr/lib64/openais -L/usr/lib/corosync -L/usr/lib64/corosync"
AC_CHECK_LIB([cpg],[cpg_local_get],[have_libcpg=yes],)
AC_CHECK_HEADERS([openais/cpg.h corosync/cpg.h],[have_cpg_h=yes],)
-AC_ARG_WITH([cpg],
+AC_ARG_WITH([cpg],
[AS_HELP_STRING([--with-cpg], [Build with CPG support for clustering.])],
[case "${withval}" in
yes) # yes - require dependencies
@@ -257,7 +270,7 @@ AC_ARG_WITH([cpg],
test x$have_cpg_h = xyes || AC_MSG_ERROR([cpg.h not found, install openais-devel or corosync-devel])
with_cpg=yes
;;
- no) with_cpg=no ;;
+ no) with_cpg=no ;;
*) AC_MSG_ERROR([Bad value ${withval} for --with-cpg option]) ;;
esac],
[ # not specified - use if present
@@ -265,12 +278,14 @@ AC_ARG_WITH([cpg],
]
)
AM_CONDITIONAL([HAVE_LIBCPG], [test x$with_cpg = xyes])
+AC_SUBST(USE_CPG, [$with_cpg])
+
# Clean up unnceccassary flags if we don't use clustering
AS_IF([test ! x$with_cpg = xyes], [LDFLAGS=$tmp_LDFLAGS])
AC_CHECK_LIB([cman],[cman_is_quorate],have_libcman=yes,)
AC_CHECK_HEADERS([libcman.h],have_libcman_h=yes,)
-AC_ARG_WITH([libcman],
+AC_ARG_WITH([libcman],
[AS_HELP_STRING([--with-libcman], [Integration with libcman quorum service.])],
[case "${withval}" in
yes) # yes - require dependencies
@@ -278,7 +293,7 @@ AC_ARG_WITH([libcman],
test x$have_libcman_h = xyes || AC_MSG_ERROR([libcman.h not found, install cman-devel or cmanlib-devel])
with_libcman=yes
;;
- no) with_libcman=no ;;
+ no) with_libcman=no ;;
*) AC_MSG_ERROR([Bad value ${withval} for --with-libcman option]) ;;
esac],
[ # not specified - use if present and we're using with_cpg
@@ -430,9 +445,9 @@ AC_ARG_WITH([ssl],
[
with_SSL=yes
AC_PATH_PROG([NSPR_CONFIG], [nspr-config])
- AS_IF([test x$NSPR_CONFIG = x], [with_SSL=no],
+ AS_IF([test x$NSPR_CONFIG = x], [with_SSL=no],
[AC_PATH_PROG([NSS_CONFIG], [nss-config])
- AS_IF([test x$NSS_CONFIG = x], [with_SSL=no],
+ AS_IF([test x$NSS_CONFIG = x], [with_SSL=no],
[SSL_CFLAGS="`$NSPR_CONFIG --cflags` `$NSS_CONFIG --cflags`"
SSL_LDFLAGS="`$NSPR_CONFIG --libs` `$NSS_CONFIG --libs`"])])
]
@@ -448,7 +463,7 @@ AC_ARG_WITH([poller],
[AS_HELP_STRING([--with-poller], [The low level poller implementation: poll/solaris-ecf/epoll])],
[case ${withval} in
poll)
- AC_CHECK_HEADERS([sys/poll.h],[poller=no],[AC_MSG_ERROR([Can't find poll.h header file for poll])])
+ AC_CHECK_HEADERS([sys/poll.h],[poller=poll],[AC_MSG_ERROR([Can't find poll.h header file for poll])])
;;
solaris-ecf)
AC_CHECK_HEADERS([port.h],[poller=solaris-ecf],[AC_MSG_ERROR([Can't find port.h header file for solaris-ecf])])
@@ -458,14 +473,17 @@ AC_ARG_WITH([poller],
;;
esac],
[
- AC_CHECK_HEADERS([sys/poll.h],[poller=no],)
- AC_CHECK_HEADERS([port.h],[poller=solaris-ecf],)
+ # We check for poll first so that it is overridden
+ AC_CHECK_HEADERS([sys/poll.h],[poller=poll],)
+ # Not currently supported - WIP
+ #AC_CHECK_HEADERS([port.h],[poller=solaris-ecf],)
AC_CHECK_HEADERS([sys/epoll.h],[poller=epoll],)
]
)
-AM_CONDITIONAL([HAVE_ECF], [test x$poller = xsolaris-ecf])
-AM_CONDITIONAL([HAVE_EPOLL], [test x$poller = xepoll])
+AM_CONDITIONAL([USE_ECF], [test x$poller = xsolaris-ecf])
+AM_CONDITIONAL([USE_POLL], [test x$poller = xpoll])
+AM_CONDITIONAL([USE_EPOLL], [test x$poller = xepoll])
#Filter not implemented or invalid mechanisms
if test $poller = xno; then
@@ -480,12 +498,30 @@ case "$host" in
esac
AM_CONDITIONAL([SUNOS], [test x$arch = xsolaris])
+# Check whether we've got the header for dtrace static probes
+AC_ARG_WITH([probes],
+ [AS_HELP_STRING([--with-probes], [Build with dtrace/systemtap static probes])],
+ [case ${withval} in
+ yes)
+ AC_CHECK_HEADERS([sys/sdt.h])
+ ;;
+ no)
+ ;;
+ *)
+ AC_MSG_ERROR([Bad value for --with-probes: ${withval}])
+ ;;
+ esac],
+ [
+ AC_CHECK_HEADERS([sys/sdt.h])
+ ]
+)
+
# Check for some syslog capabilities not present in all systems
-AC_TRY_COMPILE([#include <sys/syslog.h>],
+AC_TRY_COMPILE([#include <sys/syslog.h>],
[int v = LOG_AUTHPRIV;],
[AC_DEFINE([HAVE_LOG_AUTHPRIV], [1], [Set to 1 whether LOG_AUTHPRIV is supported.])],)
-AC_TRY_COMPILE([#include <sys/syslog.h>],
+AC_TRY_COMPILE([#include <sys/syslog.h>],
[int v = LOG_FTP;],
[AC_DEFINE([HAVE_LOG_FTP], [1], [Set to 1 whether LOG_FTP is supported.])],)
@@ -503,8 +539,6 @@ AC_CHECK_LIB([nsl],[getipnodebyname],[NSL_LIB="-lnsl"],[NSL_LIB=""],[])
SOCKLIBS="$SOCKET_LIB $NSL_LIB"
AC_SUBST([SOCKLIBS])
-AM_PATH_PYTHON()
-
# Used by env scripts to find libraries in cmake or autoconf builds.
builddir_lib_suffix="/.libs"
AC_SUBST([builddir_lib_suffix])
@@ -539,6 +573,7 @@ AC_CONFIG_FILES([
managementgen/Makefile
etc/Makefile
src/Makefile
+ src/tests/cpg_check.sh
src/tests/Makefile
src/tests/test_env.sh
src/tests/install_env.sh
diff --git a/cpp/design_docs/new-ha-design.txt b/cpp/design_docs/new-ha-design.txt
index 3272b1315f..acca1720b4 100644
--- a/cpp/design_docs/new-ha-design.txt
+++ b/cpp/design_docs/new-ha-design.txt
@@ -257,20 +257,24 @@ Broker startup with store:
- When connecting as backup, check UUID matches primary, shut down if not.
- Empty: start ok, no UUID check with primary.
-** Current Limitations
+* Current Limitations
(In no particular order at present)
For message replication:
-LM1 - The re-synchronisation does not handle the case where a newly elected
-primary is *behind* one of the other backups. To address this I propose
-a new event for restting the sequence that the new primary would send
-out on detecting that a replicating browser is ahead of it, requesting
-that the replica revert back to a particular sequence number. The
-replica on receiving this event would then discard (i.e. dequeue) all
-the messages ahead of that sequence number and reset the counter to
-correctly sequence any subsequently delivered messages.
+LM1a - On failover, backups delete their queues and download the full queue state from the
+primary. There was code to use messags already on the backup for re-synchronisation, it
+was removed in early development (r1214490) to simplify the logic while getting basic
+replication working. It needs to be re-introduced.
+
+LM1b - This re-synchronisation does not handle the case where a newly elected primary is *behind*
+one of the other backups. To address this I propose a new event for restting the sequence
+that the new primary would send out on detecting that a replicating browser is ahead of
+it, requesting that the replica revert back to a particular sequence number. The replica
+on receiving this event would then discard (i.e. dequeue) all the messages ahead of that
+sequence number and reset the counter to correctly sequence any subsequently delivered
+messages.
LM2 - There is a need to handle wrap-around of the message sequence to avoid
confusing the resynchronisation where a replica has been disconnected
@@ -288,12 +292,12 @@ confirmed to the publisher before they are replicated, leaving them
vulnerable to a loss of the new primary before they are replicated.
LM6 - persistence: In the event of a total cluster failure there are
-no tools to automatically identify the "latest" store. Once this
-is manually identfied, all other stores belonging to cluster members
-must be erased and the latest node must started as primary.
+no tools to automatically identify the "latest" store.
-LM6 - persistence: In the event of a single node failure, that nodes
-store must be erased before it can re-join the cluster.
+LM7 - persistence: In the event of a persistent broker being
+re-started (due to failure or admin) it should be able to use its
+stored messages to reduce the download required from the
+primary. This means storing message IDs persistently.
For configuration propagation:
@@ -349,6 +353,12 @@ LC6 - The events and query responses are not fully synchronized.
It is not possible to miss a create event and yet not to have
the object in question in the query response however.
+LC7 Federated links from the primary will be lost in failover, they will not be re-connected on
+the new primary. Federation links to the primary can fail over.
+
+LC8 Only plain FIFO queues can be replicated. LVQs and ring queues are not yet supported.
+
+LC9 The "last man standing" feature of the old cluster is not available.
* Benefits compared to previous cluster implementation.
@@ -359,58 +369,3 @@ LC6 - The events and query responses are not fully synchronized.
- Can take advantage of resource manager features, e.g. virtual IP addresses.
- Fewer inconsistent errors (store failures) that can be handled without killing brokers.
- Improved performance
-* User Documentation Notes
-
-Notes to seed initial user documentation. Loosely tracking the implementation,
-some points mentioned in the doc may not be implemented yet.
-
-** High Availability Overview
-
-HA is implemented using a 'hot standby' approach. Clients are directed
-to a single "primary" broker. The primary executes client requests and
-also replicates them to one or more "backup" brokers. If the primary
-fails, one of the backups takes over the role of primary carrying on
-from where the primary left off. Clients will fail over to the new
-primary automatically and continue their work.
-
-TODO: at least once, deduplication.
-
-** Enabling replication on the client.
-
-To enable replication set the qpid.replicate argument when creating a
-queue or exchange.
-
-This can have one of 3 values
-- none: the object is not replicated
-- configuration: queues, exchanges and bindings are replicated but messages are not.
-- messages: configuration and messages are replicated.
-
-TODO: examples
-TODO: more options for default value of qpid.replicate
-
-A HA client connection has multiple addresses, one for each broker. If
-the it fails to connect to an address, or the connection breaks,
-it will automatically fail-over to another address.
-
-Only the primary broker accepts connections, the backup brokers
-redirect connection attempts to the primary. If the primary fails, one
-of the backups is promoted to primary and clients fail-over to the new
-primary.
-
-TODO: using multiple-address connections, examples c++, python, java.
-
-TODO: dynamic cluster addressing?
-
-TODO: need de-duplication.
-
-** Enabling replication on the broker.
-
-Network topology: backup links, separate client/broker networks.
-Describe failover mechanisms.
-- Client view: URLs, failover, exclusion & discovery.
-- Broker view: similar.
-Role of rmganager
-
-** Configuring rgmanager
-
-** Configuring qpidd
diff --git a/cpp/etc/Makefile.am b/cpp/etc/Makefile.am
index 1e4db561a7..b154a105d4 100644
--- a/cpp/etc/Makefile.am
+++ b/cpp/etc/Makefile.am
@@ -20,9 +20,10 @@ SASL_CONF = sasl2/qpidd.conf
EXTRA_DIST = \
$(SASL_CONF) \
- qpidd qpidd.conf qpidc.conf CMakeLists.txt
+ qpidd qpidd-primary qpidd.conf qpidc.conf CMakeLists.txt \
+ cluster.conf-example.xml
-confdir=$(sysconfdir)/qpid
+confdir = $(sysconfdir)/qpid
nobase_conf_DATA=\
qpidc.conf
@@ -32,5 +33,23 @@ nobase_sysconf_DATA = \
if HAVE_SASL
nobase_sysconf_DATA += \
$(SASL_CONF)
-
endif
+
+# Substitute values for directories in init scripts.
+#
+# We can't use autoconf substitution directly because it leaves
+# ${prefix} and ${exec_prefix} unexpanded. Substitute with sed
+# scripts.
+SUBST="s|!!sysconfdir!!|${sysconfdir}|;s|!!sbindir!!|${sbindir}|;s|!!bindir!!|${bindir}|"
+qpidd: qpidd.in
+ sed $(SUBST) $< > $@
+qpidd-primary: qpidd-primary.in
+ sed $(SUBST) $< > $@
+cluster.conf-example.xml: cluster.conf-example.xml.in
+ sed $(SUBST) $< > $@
+
+CLEANFILES = qpidd qpidd-primary cluster.conf-example.xml
+
+initddir = $(sysconfdir)/init.d
+nobase_initd_SCRIPTS = qpidd qpidd-primary
+
diff --git a/cpp/etc/cluster.conf-example.xml.in b/cpp/etc/cluster.conf-example.xml.in
new file mode 100644
index 0000000000..14b961a363
--- /dev/null
+++ b/cpp/etc/cluster.conf-example.xml.in
@@ -0,0 +1,70 @@
+<?xml version="1.0"?>
+<!--
+This is an example of a cluster.conf file to run qpidd HA under rgmanager.
+This example assumes a 3 node cluster, with nodes named node1, node2 and node3.
+
+NOTE: fencing is not shown, it should be configured in a real cluster configuration.
+-->
+
+<cluster name="qpid-test" config_version="18">
+ <!-- The cluster has 3 nodes. Each has a unique nodid and one vote
+ for quorum. -->
+ <clusternodes>
+ <clusternode name="node1.example.com" nodeid="1"/>
+ <clusternode name="node2.example.com" nodeid="2"/>
+ <clusternode name="node3.example.com" nodeid="3"/>
+ </clusternodes>
+ <!-- Resouce Manager configuration. -->
+ <rm>
+ <!--
+ There is a failoverdomain for each node containing just that node.
+ This lets us stipulate that the qpidd service should always run on each node.
+ -->
+ <failoverdomains>
+ <failoverdomain name="node1-domain" restricted="1">
+ <failoverdomainnode name="node1.example.com"/>
+ </failoverdomain>
+ <failoverdomain name="node2-domain" restricted="1">
+ <failoverdomainnode name="node2.example.com"/>
+ </failoverdomain>
+ <failoverdomain name="node3-domain" restricted="1">
+ <failoverdomainnode name="node3.example.com"/>
+ </failoverdomain>
+ </failoverdomains>
+
+ <resources>
+ <!-- This script starts a qpidd broker acting as a backup. -->
+ <script file="!!sysconfdir!!/init.d/qpidd" name="qpidd"/>
+
+ <!-- This script promotes the qpidd broker on this node to primary. -->
+ <script file="!!sysconfdir!!/init.d/qpidd-primary" name="qpidd-primary"/>
+
+ <!-- This is a virtual IP address for broker replication traffic. -->
+ <ip address="20.0.10.200" monitor_link="1"/>
+
+ <!-- This is a virtual IP address on a seprate network for client traffic. -->
+ <ip address="20.0.20.200" monitor_link="1"/>
+ </resources>
+
+ <!-- There is a qpidd service on each node, it should be restarted if it fails. -->
+ <service name="node1-qpidd-service" domain="node1-domain" recovery="restart">
+ <script ref="qpidd"/>
+ </service>
+ <service name="node2-qpidd-service" domain="node2-domain" recovery="restart">
+ <script ref="qpidd"/>
+ </service>
+ <service name="node3-qpidd-service" domain="node3-domain" recovery="restart">
+ <script ref="qpidd"/>
+ </service>
+
+ <!-- There should always be a single qpidd-primary service, it can run on any node. -->
+ <service name="qpidd-primary-service" autostart="1" exclusive="0" recovery="relocate">
+ <script ref="qpidd-primary"/>
+ <!-- The primary has the IP addresses for brokers and clients to connect. -->
+ <ip ref="20.0.10.200"/>
+ <ip ref="20.0.20.200"/>
+ </service>
+ </rm>
+ <fencedevices/>
+ <fence_daemon clean_start="0" post_fail_delay="0" post_join_delay="3"/>
+</cluster>
diff --git a/cpp/etc/qpidd b/cpp/etc/qpidd
deleted file mode 100755
index 07cbb825d5..0000000000
--- a/cpp/etc/qpidd
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-# qpidd Startup script for the Qpid messaging daemon.
-#
-
-### BEGIN INIT INFO
-# Provides: qpidd
-# Required-Start: $local_fs
-# Required-Stop: $local_fs
-# Default-Start: 2 3 4 5
-# Default-Stop: 0 1 6
-# Short-Description: start or stop qpidd
-# Description: Qpidd is an AMQP broker. It receives, stores, routes and forwards messages using the AMQP protcol.
-### END INIT INFO
-
-# chkconfig: - 85 15
-# description: Qpidd is an AMQP broker. It receives, stores, routes and forwards messages using the AMQP protcol.
-# processname: qpidd
-
-prog=qpidd
-lockfile=/var/lock/subsys/$prog
-pidfile=/var/run/qpidd.pid
-
-# Source function library.
-. /etc/rc.d/init.d/functions
-
-if [ -f /etc/sysconfig/$prog ] ; then
- . /etc/sysconfig/$prog
-fi
-
-RETVAL=0
-
-#ensure binary is present and executable
-if [[ !(-x /usr/sbin/$prog) ]] ; then
- echo "/usr/sbin/$prog not found or not executable"
- exit 5
-fi
-
-#ensure user has sufficient permissions
-runuser -s /bin/sh qpidd -c "echo x > /dev/null" 2> /dev/null || RETVAL=4
-if [ $RETVAL = 4 ]; then
- echo "user had insufficient privilege";
- exit $RETVAL
-fi
-
-start() {
- [[ $QPID_DATA_DIR ]] || QPID_DATA_DIR=/var/lib/qpidd
- echo -n $"Starting Qpid AMQP daemon: "
- daemon --pidfile $pidfile --check $prog --user qpidd /usr/sbin/$prog --data-dir $QPID_DATA_DIR --daemon $QPIDD_OPTIONS
- RETVAL=$?
- echo
- [ $RETVAL = 0 ] && touch $lockfile
- if [ $RETVAL = 0 ]; then
- touch $pidfile
- chown qpidd.qpidd $pidfile
- [ -x /sbin/restorecon ] && /sbin/restorecon $pidfile
- runuser - -s /bin/sh qpidd -c "/usr/sbin/$prog --check > $pidfile"
- fi
- return $RETVAL
-}
-
-stop() {
- echo -n $"Stopping Qpid AMQP daemon: "
- killproc -p ${pidfile} $prog
- RETVAL=$?
- echo
- [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
-}
-
-reload() {
- echo 1>&2 $"$0: reload not supported"
- exit 3
-}
-
-restart() {
- stop
- start
-}
-
-# See how we were called.
-case "$1" in
- start|stop|restart|reload)
- $1
- ;;
- status)
- status $prog
- RETVAL=$?
- ;;
- force-reload)
- restart
- ;;
- try-restart|condrestart)
- [ -e $lockfile ] && restart || :
- ;;
- *)
- echo 1>&2 $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|force-reload}"
- exit 2
-esac
-
-exit $RETVAL
diff --git a/cpp/etc/qpidd-primary.in b/cpp/etc/qpidd-primary.in
new file mode 100755
index 0000000000..39700bead3
--- /dev/null
+++ b/cpp/etc/qpidd-primary.in
@@ -0,0 +1,102 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#
+# qpidd Startup script for the Qpid messaging daemon.
+#
+
+### BEGIN INIT INFO
+# Provides: qpidd-primary
+# Required-Start: $qpidd
+# Required-Stop: $qpidd
+# Default-Start:
+# Default-Stop: 0 1 2 3 4 5 6
+# Short-Description: promote qpidd to cluster primary
+# Description: Qpidd can be run in an active/passive cluster. Promote a running qpidd to primary.
+### END INIT INFO
+
+# chkconfig: - 85 15
+# description: Qpidd can be run in an active/passive cluster. Promote a running qpidd to primary.
+# processname: qpidd
+
+prog=qpidd
+
+# Source function library.
+. /etc/rc.d/init.d/functions
+
+if [ -f !!sysconfdir!!/sysconfig/$prog ] ; then
+ . !!sysconfdir!!/sysconfig/$prog
+fi
+
+# The following variables can be overridden in !!sysconfdir!!/sysconfig/$prog
+[[ $QPID_PORT ]] || QPID_PORT=5672
+[[ $QPID_HA ]] || QPID_HA=!!bindir!!/qpid-ha
+export QPID_PORT
+
+RETVAL=0
+
+#ensure binary is present and executable
+if [[ !(-x $QPID_HA) ]]; then
+ echo "qpid-ha executable not found or not executable"
+fi
+
+status() {
+ if $QPID_HA -b localhost:$QPID_PORT status --expect=primary ; then
+ echo "qpidd is primary"
+ else
+ echo "qpidd is not primary"
+ return 1
+ fi
+}
+
+start() {
+ service qpidd start
+ echo -n $"Promoting qpid daemon to cluster primary: "
+ $QPID_HA -b localhost:$QPID_PORT promote
+ [ "$?" -eq 0 ] && success || failure
+}
+
+stop() {
+ service qpidd stop
+}
+
+reload() {
+ echo 1>&2 $"$0: reload not supported"
+ exit 3
+}
+
+restart() {
+ service qpidd restart && start
+}
+
+# See how we were called.
+case "$1" in
+ start|stop|status|restart|reload)
+ $1
+ RETVAL=$?
+ ;;
+ force-reload)
+ restart
+ ;;
+ *)
+ echo 1>&2 $"Usage: $0 {start|stop|status|restart|force-reload}"
+ exit 2
+esac
+
+exit $RETVAL
diff --git a/cpp/etc/qpidd.in b/cpp/etc/qpidd.in
new file mode 100755
index 0000000000..2b43625b7d
--- /dev/null
+++ b/cpp/etc/qpidd.in
@@ -0,0 +1,119 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#
+# qpidd Startup script for the Qpid messaging daemon.
+#
+
+### BEGIN INIT INFO
+# Provides: qpidd
+# Required-Start: $local_fs
+# Required-Stop: $local_fs
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: start or stop qpidd
+# Description: Qpidd is an AMQP broker. It receives, stores, routes and forwards messages using the AMQP protcol.
+### END INIT INFO
+
+# chkconfig: - 85 15
+# description: Qpidd is an AMQP broker. It receives, stores, routes and forwards messages using the AMQP protcol.
+# processname: qpidd
+
+prog=qpidd
+lockfile=/var/lock/subsys/$prog
+pidfile=/var/run/qpidd.pid
+
+# Source configuration
+if [ -f !!sysconfdir!!/sysconfig/$prog ] ; then
+ . !!sysconfdir!!/sysconfig/$prog
+fi
+
+# Source function library.
+. /etc/rc.d/init.d/functions
+
+RETVAL=0
+
+#ensure binary is present and executable
+if [[ !(-x !!sbindir!!/$prog) ]] ; then
+ echo "!!sbindir!!/$prog not found or not executable"
+ exit 5
+fi
+
+#ensure user has sufficient permissions
+runuser -s /bin/sh qpidd -c "echo x > /dev/null" 2> /dev/null || RETVAL=4
+if [ $RETVAL = 4 ]; then
+ echo "user had insufficient privilege";
+ exit $RETVAL
+fi
+
+start() {
+ [[ $QPID_DATA_DIR ]] || QPID_DATA_DIR=/var/lib/qpidd
+ echo -n $"Starting Qpid AMQP daemon: "
+ daemon --pidfile $pidfile --check $prog --user qpidd !!sbindir!!/$prog --data-dir $QPID_DATA_DIR --daemon $QPIDD_OPTIONS
+ RETVAL=$?
+ echo
+ [ $RETVAL = 0 ] && touch $lockfile
+ if [ $RETVAL = 0 ]; then
+ touch $pidfile
+ chown qpidd.qpidd $pidfile
+ [ -x /sbin/restorecon ] && /sbin/restorecon $pidfile
+ runuser - -s /bin/sh qpidd -c "!!sbindir!!/$prog --check > $pidfile"
+ fi
+ return $RETVAL
+}
+
+stop() {
+ echo -n $"Stopping Qpid AMQP daemon: "
+ killproc -p ${pidfile} $prog
+ RETVAL=$?
+ echo
+ [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
+}
+
+reload() {
+ echo 1>&2 $"$0: reload not supported"
+ exit 3
+}
+
+restart() {
+ stop
+ start
+}
+
+# See how we were called.
+case "$1" in
+ start|stop|restart|reload)
+ $1
+ ;;
+ status)
+ status $prog
+ RETVAL=$?
+ ;;
+ force-reload)
+ restart
+ ;;
+ try-restart|condrestart)
+ [ -e $lockfile ] && restart || :
+ ;;
+ *)
+ echo 1>&2 $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|force-reload}"
+ exit 2
+esac
+
+exit $RETVAL
diff --git a/cpp/include/qpid/Options.h b/cpp/include/qpid/Options.h
index 63d91c2d72..9860076195 100644
--- a/cpp/include/qpid/Options.h
+++ b/cpp/include/qpid/Options.h
@@ -163,10 +163,12 @@ struct Options : public po::options_description {
*/
struct CommonOptions : public Options {
QPID_COMMON_EXTERN CommonOptions(const std::string& name=std::string(),
- const std::string& configfile=std::string());
+ const std::string& configfile=std::string(),
+ const std::string& clientConfigFile=std::string());
bool help;
bool version;
std::string config;
+ std::string clientConfig;
};
diff --git a/cpp/include/qpid/Url.h b/cpp/include/qpid/Url.h
index 915b08ac5f..b3ff9576e2 100644
--- a/cpp/include/qpid/Url.h
+++ b/cpp/include/qpid/Url.h
@@ -39,7 +39,7 @@ struct Url : public std::vector<Address> {
* on a multi-homed host. */
QPID_COMMON_EXTERN static Url getIpAddressesUrl(uint16_t port);
- struct Invalid : public Exception { Invalid(const std::string& s); };
+ struct Invalid : public Exception { QPID_COMMON_EXTERN Invalid(const std::string& s); };
/** Convert to string form. */
QPID_COMMON_EXTERN std::string str() const;
@@ -52,6 +52,8 @@ struct Url : public std::vector<Address> {
/** Parse url, throw Invalid if invalid. */
explicit Url(const std::string& url) { parse(url.c_str()); }
+ /** Parse url, throw Invalid if invalid. */
+ explicit Url(const std::string& url, const std::string& defaultProtocol) { parse(url.c_str(), defaultProtocol); }
/** Parse url, throw Invalid if invalid. */
explicit Url(const char* url) { parse(url); }
@@ -66,10 +68,12 @@ struct Url : public std::vector<Address> {
*@exception Invalid if the url is invalid.
*/
QPID_COMMON_EXTERN void parse(const char* url);
+ QPID_COMMON_EXTERN void parse(const char* url, const std::string& defaultProtocol);
QPID_COMMON_INLINE_EXTERN void parse(const std::string& url) { parse(url.c_str()); }
/** Replace contesnts with parsed URL. Replace with empty URL if invalid. */
QPID_COMMON_EXTERN void parseNoThrow(const char* url);
+ QPID_COMMON_EXTERN void parseNoThrow(const char* url, const std::string& defaultProtocol);
/** Add a protocol tag to be recognzed in URLs.
* Only for use by protcol plug-in initializers.
diff --git a/cpp/include/qpid/framing/Array.h b/cpp/include/qpid/framing/Array.h
index 1e97be3bb4..4f82d4dbf0 100644
--- a/cpp/include/qpid/framing/Array.h
+++ b/cpp/include/qpid/framing/Array.h
@@ -1,3 +1,6 @@
+#ifndef QPID_FRAMING_ARRAY_H
+#define QPID_FRAMING_ARRAY_H
+
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -18,21 +21,22 @@
* under the License.
*
*/
+
#include "qpid/framing/amqp_types.h"
-#include "qpid/framing/FieldValue.h"
#include "qpid/framing/TypeCode.h"
+
#include <boost/shared_ptr.hpp>
+
#include <iostream>
#include <vector>
-#include "qpid/CommonImportExport.h"
-#ifndef _Array_
-#define _Array_
+#include "qpid/CommonImportExport.h"
namespace qpid {
namespace framing {
class Buffer;
+class FieldValue;
class QPID_COMMON_CLASS_EXTERN Array
{
@@ -75,12 +79,10 @@ class QPID_COMMON_CLASS_EXTERN Array
// Non-std interface
QPID_COMMON_INLINE_EXTERN void add(ValuePtr value) { push_back(value); }
- template <class T>
- void collect(std::vector<T>& out) const
- {
- for (ValueVector::const_iterator i = values.begin(); i != values.end(); ++i) {
- out.push_back((*i)->get<T>());
- }
+ // For use in standard algorithms
+ template <typename R, typename V>
+ static R get(const V& v) {
+ return v->get<R>();
}
private:
diff --git a/cpp/include/qpid/framing/FieldTable.h b/cpp/include/qpid/framing/FieldTable.h
index bdcef6d7fd..1986a72d10 100644
--- a/cpp/include/qpid/framing/FieldTable.h
+++ b/cpp/include/qpid/framing/FieldTable.h
@@ -1,3 +1,6 @@
+#ifndef _FieldTable_
+#define _FieldTable_
+
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -18,15 +21,17 @@
* under the License.
*
*/
-#include <iostream>
-#include <vector>
+
+#include "qpid/framing/amqp_types.h"
+#include "qpid/sys/Mutex.h"
+
#include <boost/shared_ptr.hpp>
+#include <boost/shared_array.hpp>
+
+#include <iosfwd>
#include <map>
-#include "qpid/framing/amqp_types.h"
-#include "qpid/CommonImportExport.h"
-#ifndef _FieldTable_
-#define _FieldTable_
+#include "qpid/CommonImportExport.h"
namespace qpid {
/**
@@ -56,10 +61,10 @@ class FieldTable
typedef ValueMap::reference reference;
typedef ValueMap::value_type value_type;
- QPID_COMMON_INLINE_EXTERN FieldTable() {};
- QPID_COMMON_EXTERN FieldTable(const FieldTable& ft);
- QPID_COMMON_EXTERN ~FieldTable();
- QPID_COMMON_EXTERN FieldTable& operator=(const FieldTable& ft);
+ QPID_COMMON_EXTERN FieldTable();
+ QPID_COMMON_EXTERN FieldTable(const FieldTable&);
+ QPID_COMMON_EXTERN FieldTable& operator=(const FieldTable&);
+ // Compiler default destructor fine
QPID_COMMON_EXTERN uint32_t encodedSize() const;
QPID_COMMON_EXTERN void encode(Buffer& buffer) const;
QPID_COMMON_EXTERN void decode(Buffer& buffer);
@@ -91,32 +96,35 @@ class FieldTable
QPID_COMMON_EXTERN bool getArray(const std::string& name, Array& value) const;
QPID_COMMON_EXTERN bool getFloat(const std::string& name, float& value) const;
QPID_COMMON_EXTERN bool getDouble(const std::string& name, double& value) const;
- //bool getTimestamp(const std::string& name, uint64_t& value) const;
- //bool getDecimal(string& name, xxx& value);
+ //QPID_COMMON_EXTERN bool getTimestamp(const std::string& name, uint64_t& value) const;
+ //QPID_COMMON_EXTERN bool getDecimal(string& name, xxx& value);
QPID_COMMON_EXTERN void erase(const std::string& name);
QPID_COMMON_EXTERN bool operator==(const FieldTable& other) const;
// Map-like interface.
- ValueMap::const_iterator begin() const { return values.begin(); }
- ValueMap::const_iterator end() const { return values.end(); }
- ValueMap::const_iterator find(const std::string& s) const { return values.find(s); }
+ QPID_COMMON_EXTERN ValueMap::const_iterator begin() const;
+ QPID_COMMON_EXTERN ValueMap::const_iterator end() const;
+ QPID_COMMON_EXTERN ValueMap::const_iterator find(const std::string& s) const;
- ValueMap::iterator begin() { return values.begin(); }
- ValueMap::iterator end() { return values.end(); }
- ValueMap::iterator find(const std::string& s) { return values.find(s); }
+ QPID_COMMON_EXTERN ValueMap::iterator begin();
+ QPID_COMMON_EXTERN ValueMap::iterator end();
+ QPID_COMMON_EXTERN ValueMap::iterator find(const std::string& s);
QPID_COMMON_EXTERN std::pair <ValueMap::iterator, bool> insert(const ValueMap::value_type&);
QPID_COMMON_EXTERN ValueMap::iterator insert(ValueMap::iterator, const ValueMap::value_type&);
- void clear() { values.clear(); }
-
- // ### Hack Alert
-
- ValueMap::iterator getValues() { return values.begin(); }
+ QPID_COMMON_EXTERN void clear();
private:
- ValueMap values;
+ void realDecode() const;
+ void flushRawCache();
+
+ mutable qpid::sys::Mutex lock;
+ mutable ValueMap values;
+ mutable boost::shared_array<uint8_t> cachedBytes;
+ mutable uint32_t cachedSize; // if = 0 then non cached size as 0 is not a legal size
+ mutable bool newBytes;
QPID_COMMON_EXTERN friend std::ostream& operator<<(std::ostream& out, const FieldTable& body);
};
diff --git a/cpp/include/qpid/framing/SequenceNumber.h b/cpp/include/qpid/framing/SequenceNumber.h
index eed15a4b75..dd85d97a52 100644
--- a/cpp/include/qpid/framing/SequenceNumber.h
+++ b/cpp/include/qpid/framing/SequenceNumber.h
@@ -52,9 +52,9 @@ boost::equality_comparable<
uint32_t getValue() const { return uint32_t(value); }
operator uint32_t() const { return uint32_t(value); }
- void encode(Buffer& buffer) const;
- void decode(Buffer& buffer);
- uint32_t encodedSize() const;
+ QPID_COMMON_EXTERN void encode(Buffer& buffer) const;
+ QPID_COMMON_EXTERN void decode(Buffer& buffer);
+ QPID_COMMON_EXTERN uint32_t encodedSize() const;
template <class S> void serialize(S& s) { s(value); }
diff --git a/cpp/include/qpid/framing/SequenceSet.h b/cpp/include/qpid/framing/SequenceSet.h
index 0a78e418ba..827c8999b3 100644
--- a/cpp/include/qpid/framing/SequenceSet.h
+++ b/cpp/include/qpid/framing/SequenceSet.h
@@ -38,9 +38,9 @@ class QPID_COMMON_CLASS_EXTERN SequenceSet : public RangeSet<SequenceNumber> {
SequenceSet(const SequenceNumber& start, const SequenceNumber finish) { add(start,finish); }
- void encode(Buffer& buffer) const;
- void decode(Buffer& buffer);
- uint32_t encodedSize() const;
+ QPID_COMMON_EXTERN void encode(Buffer& buffer) const;
+ QPID_COMMON_EXTERN void decode(Buffer& buffer);
+ QPID_COMMON_EXTERN uint32_t encodedSize() const;
QPID_COMMON_EXTERN bool contains(const SequenceNumber& s) const;
QPID_COMMON_EXTERN void add(const SequenceNumber& s);
diff --git a/cpp/include/qpid/types/Variant.h b/cpp/include/qpid/types/Variant.h
index 3feba4a0ec..3493559777 100644
--- a/cpp/include/qpid/types/Variant.h
+++ b/cpp/include/qpid/types/Variant.h
@@ -60,9 +60,9 @@ enum VariantType {
VAR_UUID
};
-std::string getTypeName(VariantType type);
+QPID_TYPES_EXTERN std::string getTypeName(VariantType type);
-bool isIntegerType(VariantType type);
+QPID_TYPES_EXTERN bool isIntegerType(VariantType type);
class VariantImpl;
diff --git a/cpp/managementgen/qmfgen/management-types.xml b/cpp/managementgen/qmfgen/management-types.xml
index c88f0caeae..efa8322806 100644
--- a/cpp/managementgen/qmfgen/management-types.xml
+++ b/cpp/managementgen/qmfgen/management-types.xml
@@ -35,7 +35,7 @@
<type name="int16" base="S16" cpp="int16_t" encode="@.putInt16(#)" decode="# = @.getInt16()" stream="#" size="2" accessor="direct" init="0"/>
<type name="int32" base="S32" cpp="int32_t" encode="@.putInt32(#)" decode="# = @.getInt32()" stream="#" size="4" accessor="direct" init="0"/>
<type name="int64" base="S64" cpp="int64_t" encode="@.putInt64(#)" decode="# = @.getInt64()" stream="#" size="8" accessor="direct" init="0"/>
-<type name="bool" base="BOOL" cpp="bool" encode="@.putOctet(#?1:0)" decode="# = @.getOctet()==1" stream="#" size="1" accessor="direct" init="0"/>
+<type name="bool" base="BOOL" cpp="bool" encode="@.putOctet(#?1:0)" decode="# = @.getOctet()==1" stream="#" size="1" accessor="direct" init="false"/>
<type name="sstr" base="SSTR" cpp="std::string" encode="@.putShortString(#)" decode="@.getShortString(#)" stream="#" size="(1 + #.length())" accessor="direct" init='""' byRef="y" unmap="(#).getString()"/>
<type name="lstr" base="LSTR" cpp="std::string" encode="@.putMediumString(#)" decode="@.getMediumString(#)" stream="#" size="(2 + #.length())" accessor="direct" init='""' byRef="y" unmap="(#).getString()"/>
<type name="absTime" base="ABSTIME" cpp="int64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" stream="#" size="8" accessor="direct" init="0"/>
diff --git a/cpp/managementgen/qmfgen/schema.py b/cpp/managementgen/qmfgen/schema.py
index b8a1d26fb0..dc8ffae446 100755
--- a/cpp/managementgen/qmfgen/schema.py
+++ b/cpp/managementgen/qmfgen/schema.py
@@ -225,8 +225,7 @@ class SchemaType:
def genRead (self, stream, varName, indent=" "):
stream.write(indent + self.decode.replace("@", "buf").replace("#", varName) + ";\n")
- def genUnmap (self, stream, varName, indent=" ", key=None, mapName="_map",
- _optional=False):
+ def genUnmap (self, stream, varName, indent=" ", key=None, mapName="_map", _optional=False, _default=None):
if key is None:
key = varName
stream.write(indent + "if ((_i = " + mapName + ".find(\"" + key + "\")) != " + mapName + ".end()) {\n")
@@ -234,6 +233,11 @@ class SchemaType:
self.unmap.replace("#", "_i->second") + ";\n")
if _optional:
stream.write(indent + " _found = true;\n")
+ stream.write(indent + "} else {\n")
+ default = _default
+ if not default:
+ default = self.init
+ stream.write(indent + " " + varName + " = " + default + ";\n")
stream.write(indent + "}\n")
def genWrite (self, stream, varName, indent=" "):
@@ -1405,7 +1409,9 @@ class SchemaClass:
"ioArgs." + arg.dir.lower () + "_" + arg.name,
" ",
arg.name,
- "inMap")
+ "inMap",
+ False,
+ arg.default)
stream.write (" bool allow = coreObject->AuthorizeMethod(METHOD_" +\
method.getName().upper() + ", ioArgs, userId);\n")
@@ -1471,7 +1477,7 @@ class SchemaClass:
def genMethodIdDeclarations (self, stream, variables):
number = 1
for method in self.methods:
- stream.write (" static const uint32_t METHOD_" + method.getName().upper() +\
+ stream.write (" QPID_BROKER_EXTERN static const uint32_t METHOD_" + method.getName().upper() +\
" = %d;\n" % number)
number = number + 1
diff --git a/cpp/managementgen/qmfgen/templates/Class.h b/cpp/managementgen/qmfgen/templates/Class.h
index 90f1b4dd4a..95939f3d03 100644
--- a/cpp/managementgen/qmfgen/templates/Class.h
+++ b/cpp/managementgen/qmfgen/templates/Class.h
@@ -24,6 +24,7 @@
/*MGEN:Root.Disclaimer*/
#include "qpid/management/ManagementObject.h"
+#include "qmf/BrokerImportExport.h"
namespace qpid {
namespace management {
@@ -34,7 +35,7 @@ namespace qpid {
namespace qmf {
/*MGEN:Class.OpenNamespaces*/
-class /*MGEN:Class.NameCap*/ : public ::qpid::management::ManagementObject
+QPID_BROKER_CLASS_EXTERN class /*MGEN:Class.NameCap*/ : public ::qpid::management::ManagementObject
{
private:
@@ -52,9 +53,12 @@ class /*MGEN:Class.NameCap*/ : public ::qpid::management::ManagementObject
/*MGEN:Class.InstDeclarations*/
/*MGEN:IF(Class.ExistPerThreadStats)*/
// Per-Thread Statistics
+
+ public:
struct PerThreadStats {
/*MGEN:Class.PerThreadDeclarations*/
};
+ private:
struct PerThreadStats** perThreadStatsArray;
@@ -72,25 +76,25 @@ class /*MGEN:Class.NameCap*/ : public ::qpid::management::ManagementObject
void aggregatePerThreadStats(struct PerThreadStats*) const;
/*MGEN:ENDIF*/
public:
- static void writeSchema(std::string& schema);
- void mapEncodeValues(::qpid::types::Variant::Map& map,
- bool includeProperties=true,
- bool includeStatistics=true);
- void mapDecodeValues(const ::qpid::types::Variant::Map& map);
- void doMethod(std::string& methodName,
- const ::qpid::types::Variant::Map& inMap,
- ::qpid::types::Variant::Map& outMap,
- const std::string& userId);
- std::string getKey() const;
+ QPID_BROKER_EXTERN static void writeSchema(std::string& schema);
+ QPID_BROKER_EXTERN void mapEncodeValues(::qpid::types::Variant::Map& map,
+ bool includeProperties=true,
+ bool includeStatistics=true);
+ QPID_BROKER_EXTERN void mapDecodeValues(const ::qpid::types::Variant::Map& map);
+ QPID_BROKER_EXTERN void doMethod(std::string& methodName,
+ const ::qpid::types::Variant::Map& inMap,
+ ::qpid::types::Variant::Map& outMap,
+ const std::string& userId);
+ QPID_BROKER_EXTERN std::string getKey() const;
/*MGEN:IF(Root.GenQMFv1)*/
- uint32_t writePropertiesSize() const;
- void readProperties(const std::string& buf);
- void writeProperties(std::string& buf) const;
- void writeStatistics(std::string& buf, bool skipHeaders = false);
- void doMethod(std::string& methodName,
- const std::string& inBuf,
- std::string& outBuf,
- const std::string& userId);
+ QPID_BROKER_EXTERN uint32_t writePropertiesSize() const;
+ QPID_BROKER_EXTERN void readProperties(const std::string& buf);
+ QPID_BROKER_EXTERN void writeProperties(std::string& buf) const;
+ QPID_BROKER_EXTERN void writeStatistics(std::string& buf, bool skipHeaders = false);
+ QPID_BROKER_EXTERN void doMethod(std::string& methodName,
+ const std::string& inBuf,
+ std::string& outBuf,
+ const std::string& userId);
/*MGEN:ENDIF*/
writeSchemaCall_t getWriteSchemaCall() { return writeSchema; }
@@ -100,13 +104,17 @@ class /*MGEN:Class.NameCap*/ : public ::qpid::management::ManagementObject
bool hasInst() { return false; }
/*MGEN:ENDIF*/
- /*MGEN:Class.NameCap*/(::qpid::management::ManagementAgent* agent,
- ::qpid::management::Manageable* coreObject/*MGEN:Class.ParentArg*//*MGEN:Class.ConstructorArgs*/);
- ~/*MGEN:Class.NameCap*/();
+ QPID_BROKER_EXTERN /*MGEN:Class.NameCap*/(
+ ::qpid::management::ManagementAgent* agent,
+ ::qpid::management::Manageable* coreObject/*MGEN:Class.ParentArg*//*MGEN:Class.ConstructorArgs*/);
+
+ QPID_BROKER_EXTERN ~/*MGEN:Class.NameCap*/();
/*MGEN:Class.SetGeneralReferenceDeclaration*/
- static void registerSelf(::qpid::management::ManagementAgent* agent);
+ QPID_BROKER_EXTERN static void registerSelf(
+ ::qpid::management::ManagementAgent* agent);
+
std::string& getPackageName() const { return packageName; }
std::string& getClassName() const { return className; }
uint8_t* getMd5Sum() const { return md5Sum; }
@@ -115,6 +123,11 @@ class /*MGEN:Class.NameCap*/ : public ::qpid::management::ManagementObject
/*MGEN:Class.MethodIdDeclarations*/
// Accessor Methods
/*MGEN:Class.AccessorMethods*/
+
+/*MGEN:IF(Class.ExistPerThreadStats)*/
+ struct PerThreadStats* getStatistics() { return getThreadStats(); }
+ void statisticsUpdated() { instChanged = true; }
+/*MGEN:ENDIF*/
};
}/*MGEN:Class.CloseNamespaces*/
diff --git a/cpp/managementgen/qmfgen/templates/Event.h b/cpp/managementgen/qmfgen/templates/Event.h
index 5fa5f8e576..592ae08c73 100644
--- a/cpp/managementgen/qmfgen/templates/Event.h
+++ b/cpp/managementgen/qmfgen/templates/Event.h
@@ -24,11 +24,12 @@
/*MGEN:Root.Disclaimer*/
#include "qpid/management/ManagementEvent.h"
+#include "qmf/BrokerImportExport.h"
namespace qmf {
/*MGEN:Event.OpenNamespaces*/
-class Event/*MGEN:Event.NameCap*/ : public ::qpid::management::ManagementEvent
+QPID_BROKER_CLASS_EXTERN class Event/*MGEN:Event.NameCap*/ : public ::qpid::management::ManagementEvent
{
private:
static void writeSchema (std::string& schema);
@@ -41,18 +42,18 @@ class Event/*MGEN:Event.NameCap*/ : public ::qpid::management::ManagementEvent
public:
writeSchemaCall_t getWriteSchemaCall(void) { return writeSchema; }
- Event/*MGEN:Event.NameCap*/(/*MGEN:Event.ConstructorArgs*/);
- ~Event/*MGEN:Event.NameCap*/() {};
+ QPID_BROKER_EXTERN Event/*MGEN:Event.NameCap*/(/*MGEN:Event.ConstructorArgs*/);
+ QPID_BROKER_EXTERN ~Event/*MGEN:Event.NameCap*/() {};
static void registerSelf(::qpid::management::ManagementAgent* agent);
std::string& getPackageName() const { return packageName; }
std::string& getEventName() const { return eventName; }
uint8_t* getMd5Sum() const { return md5Sum; }
uint8_t getSeverity() const { return /*MGEN:Event.Severity*/; }
- void encode(std::string& buffer) const;
- void mapEncode(::qpid::types::Variant::Map& map) const;
+ QPID_BROKER_EXTERN void encode(std::string& buffer) const;
+ QPID_BROKER_EXTERN void mapEncode(::qpid::types::Variant::Map& map) const;
- static bool match(const std::string& evt, const std::string& pkg);
+ QPID_BROKER_EXTERN static bool match(const std::string& evt, const std::string& pkg);
};
}/*MGEN:Event.CloseNamespaces*/
diff --git a/cpp/managementgen/qmfgen/templates/Package.h b/cpp/managementgen/qmfgen/templates/Package.h
index 569c7cfb33..3a42f12f9d 100644
--- a/cpp/managementgen/qmfgen/templates/Package.h
+++ b/cpp/managementgen/qmfgen/templates/Package.h
@@ -24,6 +24,7 @@
/*MGEN:Root.Disclaimer*/
#include "qpid//*MGEN:Class.AgentHeaderLocation*//ManagementAgent.h"
+#include "qmf/BrokerImportExport.h"
namespace qmf {
/*MGEN:Class.OpenNamespaces*/
@@ -31,8 +32,8 @@ namespace qmf {
class Package
{
public:
- Package (::qpid::management::ManagementAgent* agent);
- ~Package () {}
+ QPID_BROKER_EXTERN Package (::qpid::management::ManagementAgent* agent);
+ QPID_BROKER_EXTERN ~Package () {}
};
}/*MGEN:Class.CloseNamespaces*/
diff --git a/cpp/rubygen/framing.0-10/structs.rb b/cpp/rubygen/framing.0-10/structs.rb
index 62b33ce773..f93742e57e 100755
--- a/cpp/rubygen/framing.0-10/structs.rb
+++ b/cpp/rubygen/framing.0-10/structs.rb
@@ -185,6 +185,13 @@ class StructGen < CppGen
end
end
+ def check_field(f)
+ if (size = StringSizeMap[f.cpptype.encoded] and size < 4)
+ limit = 2 ** (size * 8)
+ genl "if (#{f.cppname}.size() >= #{limit}) throw IllegalArgumentException(\"Value for #{f.cppname} is too large\");"
+ end
+ end
+
def process_packed_fields(s)
s.fields.each { |f| yield f, s.fields.index(f) }
end
@@ -260,11 +267,16 @@ EOS
indent {
process_packed_fields(s) { |f, i| genl "set#{f.name.caps}(_#{f.cppname});" if f.type_ == "bit"}
process_packed_fields(s) { |f, i| genl "flags |= #{flag_mask(s, i)};" unless f.type_ == "bit"}
+ s.fields.each { |f| check_field(f) }
}
genl "}"
else
indent { gen s.fields.collect { |f| " #{f.cppname}(_#{f.cppname})" }.join(",\n") }
- genl "{}"
+ genl "{"
+ indent {
+ s.fields.each { |f| check_field(f) }
+ }
+ genl "}"
end
end
#default constructors:
@@ -298,6 +310,7 @@ EOS
indent {
genl "#{f.cppname} = _#{f.cppname};"
genl "flags |= #{flag_mask(s, i)};"
+ check_field(f)
}
genl "}"
genl "#{f.cpptype.ret} #{s.cppname}::get#{f.name.caps}() const { return #{f.cppname}; }"
@@ -329,6 +342,7 @@ EOS
indent {
genl "#{f.cppname} = _#{f.cppname};"
genl "flags |= #{flag_mask(s, i)};"
+ check_field(f)
}
genl "}"
genl "#{f.cpptype.ret} #{s.body_name}::get#{f.name.caps}() const { return #{f.cppname}; }"
@@ -364,7 +378,12 @@ EOS
end
def define_accessors(f)
- genl "void set#{f.name.caps}(#{f.cpptype.param} _#{f.cppname}) { #{f.cppname} = _#{f.cppname}; }"
+ genl "void set#{f.name.caps}(#{f.cpptype.param} _#{f.cppname}) {"
+ indent {
+ genl "#{f.cppname} = _#{f.cppname};"
+ check_field(f)
+ }
+ genl "}"
genl "#{f.cpptype.ret} get#{f.name.caps}() const { return #{f.cppname}; }"
if (f.cpptype.name == "FieldTable")
genl "#{f.cpptype.name}& get#{f.name.caps}() { return #{f.cppname}; }"
@@ -401,6 +420,7 @@ EOS
#include <ostream>
#include "qpid/framing/amqp_types_full.h"
+#include "qpid/framing/reply_exceptions.h"
#include "qpid/CommonImportExport.h"
namespace qpid {
@@ -465,7 +485,7 @@ EOS
end
gen <<EOS
#include "qpid/framing/#{classname}.h"
-#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/Buffer.h"
using namespace qpid::framing;
diff --git a/cpp/src/CMakeLists.txt b/cpp/src/CMakeLists.txt
index 805e1bb9af..ecca265e08 100644
--- a/cpp/src/CMakeLists.txt
+++ b/cpp/src/CMakeLists.txt
@@ -354,6 +354,7 @@ endif (NOT Boost_REGEX_LIBRARY)
# Boost on Windows can use automatic linking to pick up the correct
# Boost libs based on compile-time touching of the headers. Since we don't
# really need to add them to the link lines, set the names to blanks.
+option(QPID_LINK_BOOST_DYNAMIC "Link with dynamic Boost libs (OFF to link static)" ON)
if (MSVC)
install (PROGRAMS
${Boost_DATE_TIME_LIBRARY_DEBUG} ${Boost_DATE_TIME_LIBRARY_RELEASE}
@@ -371,7 +372,6 @@ if (MSVC)
COMPONENT ${QPID_COMPONENT_COMMON})
endif (NOT Boost_VERSION LESS 103500)
- option(QPID_LINK_BOOST_DYNAMIC "Link with dynamic Boost libs (OFF to link static)" ON)
if (QPID_LINK_BOOST_DYNAMIC)
add_definitions( /D BOOST_ALL_DYN_LINK)
string (REPLACE .lib .dll
@@ -477,6 +477,29 @@ else (NOT CLOCK_GETTIME_IN_RT)
set(QPID_HAS_CLOCK_GETTIME YES CACHE BOOL "Platform has clock_gettime")
endif (NOT CLOCK_GETTIME_IN_RT)
+# Check for header file for dtrace static probes
+check_include_files(sys/sdt.h HAVE_SYS_SDT_H)
+if (HAVE_SYS_SDT_H)
+ set(probes_default ON)
+endif (HAVE_SYS_SDT_H)
+option(BUILD_PROBES "Build with DTrace/systemtap static probes" ${probes_default})
+if (NOT BUILD_PROBES)
+ set (HAVE_SYS_SDT_H 0)
+endif (NOT BUILD_PROBES)
+
+# Check for poll/epoll header files
+check_include_files(sys/poll.h HAVE_POLL)
+check_include_files(sys/epoll.h HAVE_EPOLL)
+
+# Set default poller implementation (check from general to specific to allow overriding)
+if (HAVE_POLL)
+ set(poller_default poll)
+endif (HAVE_POLL)
+if (HAVE_EPOLL)
+ set(poller_default epoll)
+endif (HAVE_EPOLL)
+set(POLLER ${poller_default} CACHE STRING "Poller implementation (poll/epoll)")
+
# If not windows ensure that we have uuid library
if (NOT CMAKE_SYSTEM_NAME STREQUAL Windows)
CHECK_LIBRARY_EXISTS (uuid uuid_compare "" HAVE_UUID)
@@ -571,6 +594,8 @@ if (BUILD_ACL)
set (acl_SOURCES
qpid/acl/Acl.cpp
qpid/acl/Acl.h
+ qpid/acl/AclConnectionCounter.cpp
+ qpid/acl/AclConnectionCounter.h
qpid/acl/AclData.cpp
qpid/acl/AclData.h
qpid/acl/AclPlugin.cpp
@@ -609,6 +634,8 @@ if (BUILD_HA)
qpid/ha/Settings.h
qpid/ha/QueueReplicator.h
qpid/ha/QueueReplicator.cpp
+ qpid/ha/ReplicateLevel.h
+ qpid/ha/ReplicateLevel.cpp
qpid/ha/ReplicatingSubscription.h
qpid/ha/ReplicatingSubscription.cpp
qpid/ha/BrokerReplicator.cpp
@@ -619,7 +646,7 @@ if (BUILD_HA)
add_library (ha MODULE ${ha_SOURCES})
set_target_properties (ha PROPERTIES PREFIX "")
- target_link_libraries (ha qpidbroker ${Boost_PROGRAM_OPTIONS_LIBRARY})
+ target_link_libraries (ha qpidcommon qpidbroker ${Boost_PROGRAM_OPTIONS_LIBRARY})
if (CMAKE_COMPILER_IS_GNUCXX)
set_target_properties (ha PROPERTIES
PREFIX ""
@@ -740,9 +767,18 @@ else (CMAKE_SYSTEM_NAME STREQUAL Windows)
# POSIX (Non-Windows) platforms have a lot of overlap in sources; the only
# major difference is the poller module.
- if (CMAKE_SYSTEM_NAME STREQUAL Linux)
+ if (POLLER STREQUAL poll)
+ set (qpid_poller_module
+ qpid/sys/posix/PosixPoller.cpp
+ )
+ elseif (POLLER STREQUAL epoll)
set (qpid_poller_module
qpid/sys/epoll/EpollPoller.cpp
+ )
+ endif (POLLER STREQUAL poll)
+
+ if (CMAKE_SYSTEM_NAME STREQUAL Linux)
+ set (qpid_system_module
qpid/sys/posix/SystemInfo.cpp
)
add_definitions(-pthread)
@@ -754,13 +790,12 @@ else (CMAKE_SYSTEM_NAME STREQUAL Windows)
set (qpidtypes_platform_SOURCES)
set (qpidtypes_platform_LIBS
- uuid
- ${Boost_SYSTEM_LIBRARY}
+ uuid
+ ${Boost_SYSTEM_LIBRARY}
)
if (CMAKE_SYSTEM_NAME STREQUAL SunOS)
- set (qpid_poller_module
- qpid/sys/posix/PosixPoller.cpp
+ set (qpid_system_module
qpid/sys/solaris/SystemInfo.cpp
)
# On Sun we want -lpthread -lthread as the 2nd last and last libs passed to linker
@@ -789,6 +824,7 @@ else (CMAKE_SYSTEM_NAME STREQUAL Windows)
qpid/sys/posix/Time.cpp
qpid/SaslFactory.cpp
+ ${qpid_system_module}
${qpid_poller_module}
)
set (qpidcommon_platform_LIBS
@@ -842,7 +878,6 @@ set (qpidcommon_SOURCES
qpid/framing/AMQHeaderBody.cpp
qpid/framing/AMQHeartbeatBody.cpp
qpid/framing/Array.cpp
- qpid/framing/BodyHandler.cpp
qpid/framing/Buffer.cpp
qpid/framing/Endian.cpp
qpid/framing/FieldTable.cpp
@@ -1082,6 +1117,7 @@ set (qpidbroker_SOURCES
qpid/broker/NameGenerator.cpp
qpid/broker/NullMessageStore.cpp
qpid/broker/QueueBindings.cpp
+ qpid/broker/QueuedMessage.cpp
qpid/broker/QueueEvents.cpp
qpid/broker/QueuePolicy.cpp
qpid/broker/QueueRegistry.cpp
diff --git a/cpp/src/Makefile.am b/cpp/src/Makefile.am
index 7162245c53..43e491a229 100644
--- a/cpp/src/Makefile.am
+++ b/cpp/src/Makefile.am
@@ -102,15 +102,16 @@ $(srcdir)/rubygen.cmake: $(rgen_generator) $(specs)
# Management generator.
mgen_dir=$(top_srcdir)/managementgen
-mgen_cmd=$(mgen_dir)/qmf-gen -m $(srcdir)/managementgen.mk \
- -c $(srcdir)/managementgen.cmake -q -b -o qmf \
- $(top_srcdir)/../specs/management-schema.xml \
+mgen_xml=$(top_srcdir)/../specs/management-schema.xml \
$(srcdir)/qpid/acl/management-schema.xml \
$(srcdir)/qpid/cluster/management-schema.xml \
$(srcdir)/qpid/ha/management-schema.xml
+mgen_cmd=$(mgen_dir)/qmf-gen -m $(srcdir)/managementgen.mk \
+ -c $(srcdir)/managementgen.cmake -q -b -o qmf \
+ $(mgen_xml)
$(srcdir)/managementgen.mk $(mgen_broker_cpp) $(dist_qpid_management_HEADERS): mgen.timestamp
-mgen.timestamp: $(mgen_generator)
+mgen.timestamp: $(mgen_generator) $(mgen_xml)
$(mgen_cmd); touch $@
$(mgen_generator):
@@ -139,7 +140,7 @@ tmoduleexec_LTLIBRARIES=
AM_CXXFLAGS += -DBOOST_FILESYSTEM_VERSION=2
## Automake macros to build libraries and executables.
-qpidd_CXXFLAGS = $(AM_CXXFLAGS) -DQPIDD_MODULE_DIR=\"$(dmoduleexecdir)\" -DQPIDD_CONF_FILE=\"$(sysconfdir)/qpidd.conf\"
+qpidd_CXXFLAGS = $(AM_CXXFLAGS) -DQPIDD_MODULE_DIR=\"$(dmoduleexecdir)\" -DQPIDD_CONF_FILE=\"$(sysconfdir)/qpidd.conf\" -DQPIDC_CONF_FILE=\"$(confdir)/qpidc.conf\"
libqpidclient_la_CXXFLAGS = $(AM_CXXFLAGS) -DQPIDC_MODULE_DIR=\"$(cmoduleexecdir)\" -DQPIDC_CONF_FILE=\"$(confdir)/qpidc.conf\"
qpidd_LDADD = \
@@ -183,11 +184,15 @@ nobase_include_HEADERS += \
../include/qpid/sys/posix/Time.h \
../include/qpid/sys/posix/check.h
-if HAVE_EPOLL
+if USE_EPOLL
poller = qpid/sys/epoll/EpollPoller.cpp
endif
-if HAVE_ECF
+if USE_POLL
+ poller = qpid/sys/posix/PosixPoller.cpp
+endif
+
+if USE_ECF
poller = qpid/sys/solaris/ECFPoller.cpp
endif
@@ -393,8 +398,6 @@ libqpidcommon_la_SOURCES += \
qpid/framing/AccumulatedAck.h \
qpid/framing/Array.cpp \
qpid/framing/BodyFactory.h \
- qpid/framing/BodyHandler.cpp \
- qpid/framing/BodyHandler.h \
qpid/framing/Buffer.cpp \
qpid/framing/ResizableBuffer.h \
qpid/framing/ChannelHandler.h \
@@ -481,12 +484,14 @@ libqpidcommon_la_SOURCES += \
qpid/sys/Fork.h \
qpid/sys/LockFile.h \
qpid/sys/LockPtr.h \
+ qpid/sys/MemStat.h \
qpid/sys/OutputControl.h \
qpid/sys/OutputTask.h \
qpid/sys/PipeHandle.h \
qpid/sys/PollableCondition.h \
qpid/sys/PollableQueue.h \
qpid/sys/Poller.h \
+ qpid/sys/Probes.h \
qpid/sys/ProtocolFactory.h \
qpid/sys/Runnable.cpp \
qpid/sys/ScopedIncrement.h \
@@ -632,10 +637,10 @@ libqpidbroker_la_SOURCES = \
qpid/broker/QueuePolicy.h \
qpid/broker/QueueRegistry.cpp \
qpid/broker/QueueRegistry.h \
+ qpid/broker/QueuedMessage.cpp \
qpid/broker/QueuedMessage.h \
qpid/broker/QueueFlowLimit.h \
qpid/broker/QueueFlowLimit.cpp \
- qpid/broker/RateFlowcontrol.h \
qpid/broker/RecoverableConfig.h \
qpid/broker/RecoverableExchange.h \
qpid/broker/RecoverableMessage.h \
diff --git a/cpp/src/acl.mk b/cpp/src/acl.mk
index b8e2ff0e13..0301f8c754 100644
--- a/cpp/src/acl.mk
+++ b/cpp/src/acl.mk
@@ -24,6 +24,8 @@ dmoduleexec_LTLIBRARIES += acl.la
acl_la_SOURCES = \
qpid/acl/Acl.cpp \
qpid/acl/Acl.h \
+ qpid/acl/AclConnectionCounter.cpp \
+ qpid/acl/AclConnectionCounter.h \
qpid/acl/AclData.cpp \
qpid/acl/AclData.h \
qpid/acl/AclPlugin.cpp \
diff --git a/cpp/src/config.h.cmake b/cpp/src/config.h.cmake
index 2bb84c6e47..f55f68afde 100644
--- a/cpp/src/config.h.cmake
+++ b/cpp/src/config.h.cmake
@@ -60,6 +60,7 @@
#cmakedefine HAVE_OPENAIS_CPG_H ${HAVE_OPENAIS_CPG_H}
#cmakedefine HAVE_COROSYNC_CPG_H ${HAVE_COROSYNC_CPG_H}
#cmakedefine HAVE_LIBCMAN_H ${HAVE_LIBCMAN_H}
+#cmakedefine HAVE_SYS_SDT_H ${HAVE_SYS_SDT_H}
#cmakedefine HAVE_LOG_AUTHPRIV
#cmakedefine HAVE_LOG_FTP
diff --git a/cpp/src/ha.mk b/cpp/src/ha.mk
index 8a2cee30c7..be1fb73e89 100644
--- a/cpp/src/ha.mk
+++ b/cpp/src/ha.mk
@@ -25,18 +25,20 @@ dmoduleexec_LTLIBRARIES += ha.la
ha_la_SOURCES = \
qpid/ha/Backup.cpp \
qpid/ha/Backup.h \
+ qpid/ha/BrokerReplicator.cpp \
+ qpid/ha/BrokerReplicator.h \
+ qpid/ha/ConnectionExcluder.cpp \
+ qpid/ha/ConnectionExcluder.h \
qpid/ha/HaBroker.cpp \
qpid/ha/HaBroker.h \
qpid/ha/HaPlugin.cpp \
- qpid/ha/Settings.h \
- qpid/ha/QueueReplicator.h \
qpid/ha/QueueReplicator.cpp \
- qpid/ha/ReplicatingSubscription.h \
+ qpid/ha/QueueReplicator.h \
+ qpid/ha/ReplicateLevel.cpp \
+ qpid/ha/ReplicateLevel.h \
qpid/ha/ReplicatingSubscription.cpp \
- qpid/ha/BrokerReplicator.cpp \
- qpid/ha/BrokerReplicator.h \
- qpid/ha/ConnectionExcluder.cpp \
- qpid/ha/ConnectionExcluder.h
+ qpid/ha/ReplicatingSubscription.h \
+ qpid/ha/Settings.h
ha_la_LIBADD = libqpidbroker.la
ha_la_LDFLAGS = $(PLUGINLDFLAGS)
diff --git a/cpp/src/posix/QpiddBroker.cpp b/cpp/src/posix/QpiddBroker.cpp
index 1cebcfc3ac..fd2fb6184f 100644
--- a/cpp/src/posix/QpiddBroker.cpp
+++ b/cpp/src/posix/QpiddBroker.cpp
@@ -31,14 +31,15 @@
#include <unistd.h>
#include <sys/utsname.h>
-using namespace std;
-using namespace qpid;
-using qpid::broker::Broker;
-using qpid::broker::Daemon;
+using std::cout;
+using std::endl;
+
+namespace qpid {
+namespace broker {
BootstrapOptions::BootstrapOptions(const char* argv0)
: qpid::Options("Options"),
- common("", QPIDD_CONF_FILE),
+ common("", QPIDD_CONF_FILE, QPIDC_CONF_FILE),
module(QPIDD_MODULE_DIR),
log(argv0)
{
@@ -90,7 +91,7 @@ struct QpiddPosixOptions : public QpiddOptionsPrivate {
QpiddOptions::QpiddOptions(const char* argv0)
: qpid::Options("Options"),
- common("", QPIDD_CONF_FILE),
+ common("", QPIDD_CONF_FILE, QPIDC_CONF_FILE),
module(QPIDD_MODULE_DIR),
log(argv0)
{
@@ -197,7 +198,9 @@ int QpiddBroker::execute (QpiddOptions *options) {
return 0;
}
+}} // namespace qpid::Broker
+
int main(int argc, char* argv[])
{
- return run_broker(argc, argv);
+ return qpid::broker::run_broker(argc, argv);
}
diff --git a/cpp/src/qmf.mk b/cpp/src/qmf.mk
index 95d3d5c9b0..9b5df6c808 100644
--- a/cpp/src/qmf.mk
+++ b/cpp/src/qmf.mk
@@ -96,6 +96,7 @@ libqmf2_la_SOURCES = \
qmf/AgentSessionImpl.h \
qmf/AgentSubscription.cpp \
qmf/AgentSubscription.h \
+ qmf/BrokerImportExport.h \
qmf/ConsoleEvent.cpp \
qmf/ConsoleEventImpl.h \
qmf/ConsoleSession.cpp \
diff --git a/cpp/src/qmf/BrokerImportExport.h b/cpp/src/qmf/BrokerImportExport.h
new file mode 100644
index 0000000000..ee05788063
--- /dev/null
+++ b/cpp/src/qmf/BrokerImportExport.h
@@ -0,0 +1,42 @@
+#ifndef QPID_BROKER_IMPORT_EXPORT_H
+#define QPID_BROKER_IMPORT_EXPORT_H
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#if defined(WIN32) && !defined(QPID_DECLARE_STATIC)
+# if defined(BROKER_EXPORT) || defined (qpidbroker_EXPORTS)
+# define QPID_BROKER_EXTERN __declspec(dllexport)
+# else
+# define QPID_BROKER_EXTERN __declspec(dllimport)
+# endif
+# ifdef _MSC_VER
+# define QPID_BROKER_CLASS_EXTERN
+# define QPID_BROKER_INLINE_EXTERN QPID_BROKER_EXTERN
+# else
+# define QPID_BROKER_CLASS_EXTERN QPID_BROKER_EXTERN
+# define QPID_BROKER_INLINE_EXTERN
+# endif
+#else
+# define QPID_BROKER_EXTERN
+# define QPID_BROKER_CLASS_EXTERN
+# define QPID_BROKER_INLINE_EXTERN
+#endif
+
+#endif
diff --git a/cpp/src/qpid/Options.cpp b/cpp/src/qpid/Options.cpp
index 4b13e349f5..35787aa8f3 100644
--- a/cpp/src/qpid/Options.cpp
+++ b/cpp/src/qpid/Options.cpp
@@ -186,13 +186,14 @@ void Options::parse(int argc, char const* const* argv, const std::string& config
}
}
-CommonOptions::CommonOptions(const string& name, const string& configfile)
- : Options(name), config(configfile)
+CommonOptions::CommonOptions(const string& name, const string& configfile, const string& clientfile)
+ : Options(name), config(configfile), clientConfig(clientfile)
{
addOptions()
("help,h", optValue(help), "Displays the help message")
("version,v", optValue(version), "Displays version information")
- ("config", optValue(config, "FILE"), "Reads configuration from FILE");
+ ("config", optValue(config, "FILE"), "Reads configuration from FILE")
+ ("client-config", optValue(clientConfig, "FILE"), "Reads client configuration from FILE (for cluster interconnect)");
}
diff --git a/cpp/src/qpid/Url.cpp b/cpp/src/qpid/Url.cpp
index 2061499ec3..840f46e928 100644
--- a/cpp/src/qpid/Url.cpp
+++ b/cpp/src/qpid/Url.cpp
@@ -111,7 +111,8 @@ ssl_addr = "ssl:" host [":" port]
*/
class UrlParser {
public:
- UrlParser(Url& u, const char* s) : url(u), text(s), end(s+strlen(s)), i(s) {}
+ UrlParser(Url& u, const char* s, const std::string& defaultProtocol_=Address::TCP) : url(u), text(s), end(s+strlen(s)), i(s),
+ defaultProtocol(defaultProtocol_) {}
bool parse() {
literal("amqp:"); // Optional
userPass(); // Optional
@@ -135,7 +136,7 @@ class UrlParser {
bool comma() { return literal(","); }
bool protocolAddr() {
- Address addr(Address::TCP, "", Address::AMQP_PORT); // Set up defaults
+ Address addr(defaultProtocol, "", Address::AMQP_PORT); // Set up defaults
protocolTag(addr.protocol); // Optional
bool ok = (host(addr.host) &&
(literal(":") ? port(addr.port) : true));
@@ -244,20 +245,28 @@ class UrlParser {
const char* text;
const char* end;
const char* i;
+ const std::string defaultProtocol;
};
const string UrlParser::LOCALHOST("127.0.0.1");
void Url::parse(const char* url) {
- parseNoThrow(url);
+ parse(url, Address::TCP);
+}
+void Url::parse(const char* url, const std::string& defaultProtocol) {
+ parseNoThrow(url, defaultProtocol);
if (empty())
throw Url::Invalid(QPID_MSG("Invalid URL: " << url));
}
void Url::parseNoThrow(const char* url) {
+ parseNoThrow(url, Address::TCP);
+}
+
+void Url::parseNoThrow(const char* url, const std::string& defaultProtocol) {
clear();
cache.clear();
- if (!UrlParser(*this, url).parse())
+ if (!UrlParser(*this, url, defaultProtocol).parse())
clear();
}
diff --git a/cpp/src/qpid/UrlArray.cpp b/cpp/src/qpid/UrlArray.cpp
index 489309c8ad..9ebacbd945 100644
--- a/cpp/src/qpid/UrlArray.cpp
+++ b/cpp/src/qpid/UrlArray.cpp
@@ -20,6 +20,8 @@
*/
#include "UrlArray.h"
+#include <qpid/framing/FieldValue.h>
+
namespace qpid {
std::vector<Url> urlArrayToVector(const framing::Array& array) {
diff --git a/cpp/src/qpid/UrlArray.h b/cpp/src/qpid/UrlArray.h
index 8b11df5c73..ce9e42f248 100644
--- a/cpp/src/qpid/UrlArray.h
+++ b/cpp/src/qpid/UrlArray.h
@@ -23,7 +23,6 @@
*/
#include "qpid/framing/Array.h"
-#include "qpid/framing/FieldValue.h"
#include "qpid/Url.h"
#include <vector>
diff --git a/cpp/src/qpid/acl/Acl.cpp b/cpp/src/qpid/acl/Acl.cpp
index 12bf13018c..917c2e3398 100644
--- a/cpp/src/qpid/acl/Acl.cpp
+++ b/cpp/src/qpid/acl/Acl.cpp
@@ -17,6 +17,7 @@
*/
#include "qpid/acl/Acl.h"
+#include "qpid/acl/AclConnectionCounter.h"
#include "qpid/acl/AclData.h"
#include "qpid/acl/AclValidator.h"
#include "qpid/sys/Mutex.h"
@@ -26,8 +27,11 @@
#include "qpid/Options.h"
#include "qpid/log/Logger.h"
#include "qpid/types/Variant.h"
+#include "qmf/org/apache/qpid/acl/ArgsAclLookup.h"
+#include "qmf/org/apache/qpid/acl/ArgsAclLookupPublish.h"
#include "qmf/org/apache/qpid/acl/Package.h"
#include "qmf/org/apache/qpid/acl/EventAllow.h"
+#include "qmf/org/apache/qpid/acl/EventConnectionDeny.h"
#include "qmf/org/apache/qpid/acl/EventDeny.h"
#include "qmf/org/apache/qpid/acl/EventFileLoaded.h"
#include "qmf/org/apache/qpid/acl/EventFileLoadFailed.h"
@@ -35,7 +39,6 @@
#include <map>
#include <boost/shared_ptr.hpp>
-#include <boost/utility/in_place_factory.hpp>
using namespace std;
using namespace qpid::acl;
@@ -47,7 +50,8 @@ using qpid::management::Manageable;
using qpid::management::Args;
namespace _qmf = qmf::org::apache::qpid::acl;
-Acl::Acl (AclValues& av, Broker& b): aclValues(av), broker(&b), transferAcl(false), mgmtObject(0)
+Acl::Acl (AclValues& av, Broker& b): aclValues(av), broker(&b), transferAcl(false), mgmtObject(0),
+ connectionCounter(new ConnectionCounter(*this, aclValues.aclMaxConnectPerUser, aclValues.aclMaxConnectPerIp))
{
agent = broker->getManagementAgent();
@@ -62,14 +66,30 @@ Acl::Acl (AclValues& av, Broker& b): aclValues(av), broker(&b), transferAcl(fals
throw Exception("Could not read ACL file " + errorString);
if (mgmtObject!=0) mgmtObject->set_enforcingAcl(0);
}
+ broker->getConnectionObservers().add(connectionCounter);
QPID_LOG(info, "ACL Plugin loaded");
if (mgmtObject!=0) mgmtObject->set_enforcingAcl(1);
}
-bool Acl::authorise(const std::string& id, const Action& action, const ObjectType& objType, const std::string& name, std::map<Property, std::string>* params)
+
+void Acl::reportConnectLimit(const std::string user, const std::string addr)
+{
+ if (mgmtObject!=0)
+ mgmtObject->inc_connectionDenyCount();
+
+ agent->raiseEvent(_qmf::EventConnectionDeny(user, addr));
+}
+
+
+bool Acl::authorise(
+ const std::string& id,
+ const Action& action,
+ const ObjectType& objType,
+ const std::string& name,
+ std::map<Property, std::string>* params)
{
boost::shared_ptr<AclData> dataLocal;
- {
+ {
Mutex::ScopedLock locker(dataLock);
dataLocal = data; //rcu copy
}
@@ -81,7 +101,12 @@ bool Acl::authorise(const std::string& id, const Action& action, const ObjectTyp
return result(aclreslt, id, action, objType, name);
}
-bool Acl::authorise(const std::string& id, const Action& action, const ObjectType& objType, const std::string& ExchangeName, const std::string& RoutingKey)
+bool Acl::authorise(
+ const std::string& id,
+ const Action& action,
+ const ObjectType& objType,
+ const std::string& ExchangeName,
+ const std::string& RoutingKey)
{
boost::shared_ptr<AclData> dataLocal;
{
@@ -96,31 +121,50 @@ bool Acl::authorise(const std::string& id, const Action& action, const ObjectTyp
}
-bool Acl::result(const AclResult& aclreslt, const std::string& id, const Action& action, const ObjectType& objType, const std::string& name)
+bool Acl::result(
+ const AclResult& aclreslt,
+ const std::string& id,
+ const Action& action,
+ const ObjectType& objType,
+ const std::string& name)
{
+ bool result(false);
+
switch (aclreslt)
{
case ALLOWLOG:
- QPID_LOG(info, "ACL Allow id:" << id <<" action:" << AclHelper::getActionStr(action) <<
- " ObjectType:" << AclHelper::getObjectTypeStr(objType) << " Name:" << name );
+ QPID_LOG(info, "ACL Allow id:" << id
+ << " action:" << AclHelper::getActionStr(action)
+ << " ObjectType:" << AclHelper::getObjectTypeStr(objType)
+ << " Name:" << name );
agent->raiseEvent(_qmf::EventAllow(id, AclHelper::getActionStr(action),
- AclHelper::getObjectTypeStr(objType),
- name, types::Variant::Map()));
+ AclHelper::getObjectTypeStr(objType),
+ name, types::Variant::Map()));
+ // FALLTHROUGH
case ALLOW:
- return true;
- case DENY:
- if (mgmtObject!=0) mgmtObject->inc_aclDenyCount();
- return false;
+ result = true;
+ break;
+
case DENYLOG:
- if (mgmtObject!=0) mgmtObject->inc_aclDenyCount();
- default:
- QPID_LOG(info, "ACL Deny id:" << id << " action:" << AclHelper::getActionStr(action) << " ObjectType:" << AclHelper::getObjectTypeStr(objType) << " Name:" << name);
+ QPID_LOG(info, "ACL Deny id:" << id
+ << " action:" << AclHelper::getActionStr(action)
+ << " ObjectType:" << AclHelper::getObjectTypeStr(objType)
+ << " Name:" << name);
agent->raiseEvent(_qmf::EventDeny(id, AclHelper::getActionStr(action),
- AclHelper::getObjectTypeStr(objType),
- name, types::Variant::Map()));
- return false;
+ AclHelper::getObjectTypeStr(objType),
+ name, types::Variant::Map()));
+ // FALLTHROUGH
+ case DENY:
+ if (mgmtObject!=0)
+ mgmtObject->inc_aclDenyCount();
+ result = false;
+ break;
+
+ default:
+ assert (false);
}
- return false;
+
+ return result;
}
bool Acl::readAclFile(std::string& errorText)
@@ -129,7 +173,7 @@ bool Acl::readAclFile(std::string& errorText)
return readAclFile(aclValues.aclFile, errorText);
}
-bool Acl::readAclFile(std::string& aclFile, std::string& errorText) {
+bool Acl::readAclFile(std::string& aclFile, std::string& errorText) {
boost::shared_ptr<AclData> d(new AclData);
AclReader ar;
if (ar.read(aclFile, d)){
@@ -142,17 +186,17 @@ bool Acl::readAclFile(std::string& aclFile, std::string& errorText) {
AclValidator validator;
validator.validate(d);
- {
+ {
Mutex::ScopedLock locker(dataLock);
data = d;
}
transferAcl = data->transferAcl; // any transfer ACL
if (data->transferAcl){
- QPID_LOG(debug,"Transfer ACL is Enabled!");
+ QPID_LOG(debug,"ACL: Transfer ACL is Enabled!");
}
- data->aclSource = aclFile;
+ data->aclSource = aclFile;
if (mgmtObject!=0){
mgmtObject->set_transferAcl(transferAcl?1:0);
mgmtObject->set_policyFile(aclFile);
@@ -164,17 +208,92 @@ bool Acl::readAclFile(std::string& aclFile, std::string& errorText) {
return true;
}
-Acl::~Acl(){}
+
+//
+// management lookup function performs general query on acl engine
+//
+Manageable::status_t Acl::lookup(qpid::management::Args& args, std::string& text)
+{
+ _qmf::ArgsAclLookup& ioArgs = (_qmf::ArgsAclLookup&) args;
+ Manageable::status_t result(STATUS_USER);
+
+ try {
+ ObjectType objType = AclHelper::getObjectType(ioArgs.i_object);
+ Action action = AclHelper::getAction( ioArgs.i_action);
+ std::map<Property, std::string> propertyMap;
+ for (::qpid::types::Variant::Map::const_iterator
+ iMapIter = ioArgs.i_propertyMap.begin();
+ iMapIter != ioArgs.i_propertyMap.end();
+ iMapIter++)
+ {
+ Property property = AclHelper::getProperty(iMapIter->first);
+ propertyMap.insert(make_pair(property, iMapIter->second));
+ }
+
+ boost::shared_ptr<AclData> dataLocal;
+ {
+ Mutex::ScopedLock locker(dataLock);
+ dataLocal = data; //rcu copy
+ }
+ AclResult aclResult = dataLocal->lookup(
+ ioArgs.i_userId,
+ action,
+ objType,
+ ioArgs.i_objectName,
+ &propertyMap);
+
+ ioArgs.o_result = AclHelper::getAclResultStr(aclResult);
+ result = STATUS_OK;
+
+ } catch (const std::exception& e) {
+ std::ostringstream oss;
+ oss << "AclLookup invalid name : " << e.what();
+ ioArgs.o_result = oss.str();
+ text = oss.str();
+ }
+
+ return result;
+}
+
+
+//
+// management lookupPublish function performs fastpath
+// PUBLISH EXCHANGE query on acl engine
+//
+Manageable::status_t Acl::lookupPublish(qpid::management::Args& args, std::string& /*text*/)
+{
+ _qmf::ArgsAclLookupPublish& ioArgs = (_qmf::ArgsAclLookupPublish&) args;
+ boost::shared_ptr<AclData> dataLocal;
+ {
+ Mutex::ScopedLock locker(dataLock);
+ dataLocal = data; //rcu copy
+ }
+ AclResult aclResult = dataLocal->lookup(
+ ioArgs.i_userId,
+ ACT_PUBLISH,
+ OBJ_EXCHANGE,
+ ioArgs.i_exchangeName,
+ ioArgs.i_routingKey);
+
+ ioArgs.o_result = AclHelper::getAclResultStr(aclResult);
+
+ return STATUS_OK;
+}
+
+
+Acl::~Acl(){
+ broker->getConnectionObservers().remove(connectionCounter);
+}
ManagementObject* Acl::GetManagementObject(void) const
{
return (ManagementObject*) mgmtObject;
}
-Manageable::status_t Acl::ManagementMethod (uint32_t methodId, Args& /*args*/, string& text)
+Manageable::status_t Acl::ManagementMethod (uint32_t methodId, Args& args, string& text)
{
Manageable::status_t status = Manageable::STATUS_UNKNOWN_METHOD;
- QPID_LOG (debug, "Queue::ManagementMethod [id=" << methodId << "]");
+ QPID_LOG (debug, "ACL: Queue::ManagementMethod [id=" << methodId << "]");
switch (methodId)
{
@@ -185,6 +304,14 @@ Manageable::status_t Acl::ManagementMethod (uint32_t methodId, Args& /*args*/, s
else
status = Manageable::STATUS_USER;
break;
+
+ case _qmf::Acl::METHOD_LOOKUP :
+ status = lookup(args, text);
+ break;
+
+ case _qmf::Acl::METHOD_LOOKUPPUBLISH :
+ status = lookupPublish(args, text);
+ break;
}
return status;
diff --git a/cpp/src/qpid/acl/Acl.h b/cpp/src/qpid/acl/Acl.h
index 77f43838de..c3451018ef 100644
--- a/cpp/src/qpid/acl/Acl.h
+++ b/cpp/src/qpid/acl/Acl.h
@@ -30,6 +30,7 @@
#include "qmf/org/apache/qpid/acl/Acl.h"
#include "qpid/sys/Mutex.h"
+#include <boost/shared_ptr.hpp>
#include <map>
#include <string>
@@ -40,9 +41,12 @@ class Broker;
}
namespace acl {
+class ConnectionCounter;
struct AclValues {
- std::string aclFile;
+ std::string aclFile;
+ uint32_t aclMaxConnectPerUser;
+ uint32_t aclMaxConnectPerIp;
};
@@ -50,37 +54,56 @@ class Acl : public broker::AclModule, public RefCounted, public management::Mana
{
private:
- acl::AclValues aclValues;
- broker::Broker* broker;
- bool transferAcl;
- boost::shared_ptr<AclData> data;
- qmf::org::apache::qpid::acl::Acl* mgmtObject; // mgnt owns lifecycle
- qpid::management::ManagementAgent* agent;
- mutable qpid::sys::Mutex dataLock;
+ acl::AclValues aclValues;
+ broker::Broker* broker;
+ bool transferAcl;
+ boost::shared_ptr<AclData> data;
+ qmf::org::apache::qpid::acl::Acl* mgmtObject; // mgnt owns lifecycle
+ qpid::management::ManagementAgent* agent;
+ mutable qpid::sys::Mutex dataLock;
+ boost::shared_ptr<ConnectionCounter> connectionCounter;
public:
- Acl (AclValues& av, broker::Broker& b);
-
- void initialize();
-
- inline virtual bool doTransferAcl() {return transferAcl;};
-
- // create specilied authorise methods for cases that need faster matching as needed.
- virtual bool authorise(const std::string& id, const Action& action, const ObjectType& objType, const std::string& name, std::map<Property, std::string>* params=0);
- virtual bool authorise(const std::string& id, const Action& action, const ObjectType& objType, const std::string& ExchangeName,const std::string& RoutingKey);
-
- virtual ~Acl();
+ Acl (AclValues& av, broker::Broker& b);
+
+ void reportConnectLimit(const std::string user, const std::string addr);
+
+ inline virtual bool doTransferAcl() {
+ return transferAcl;
+ };
+
+// create specilied authorise methods for cases that need faster matching as needed.
+ virtual bool authorise(
+ const std::string& id,
+ const Action& action,
+ const ObjectType& objType,
+ const std::string& name,
+ std::map<Property, std::string>* params=0);
+
+ virtual bool authorise(
+ const std::string& id,
+ const Action& action,
+ const ObjectType& objType,
+ const std::string& ExchangeName,
+ const std::string& RoutingKey);
+
+ virtual ~Acl();
private:
- bool result(const AclResult& aclreslt, const std::string& id, const Action& action, const ObjectType& objType, const std::string& name);
- bool readAclFile(std::string& errorText);
- bool readAclFile(std::string& aclFile, std::string& errorText);
- virtual qpid::management::ManagementObject* GetManagementObject(void) const;
- virtual management::Manageable::status_t ManagementMethod (uint32_t methodId, management::Args& args, std::string& text);
+ bool result(
+ const AclResult& aclreslt,
+ const std::string& id,
+ const Action& action,
+ const ObjectType& objType,
+ const std::string& name);
+ bool readAclFile(std::string& errorText);
+ bool readAclFile(std::string& aclFile, std::string& errorText);
+ Manageable::status_t lookup (management::Args& args, std::string& text);
+ Manageable::status_t lookupPublish(management::Args& args, std::string& text);
+ virtual qpid::management::ManagementObject* GetManagementObject(void) const;
+ virtual management::Manageable::status_t ManagementMethod (uint32_t methodId, management::Args& args, std::string& text);
};
-
-
}} // namespace qpid::acl
#endif // QPID_ACL_ACL_H
diff --git a/cpp/src/qpid/acl/AclConnectionCounter.cpp b/cpp/src/qpid/acl/AclConnectionCounter.cpp
new file mode 100644
index 0000000000..5d4e3c1544
--- /dev/null
+++ b/cpp/src/qpid/acl/AclConnectionCounter.cpp
@@ -0,0 +1,214 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include "AclConnectionCounter.h"
+#include "Acl.h"
+#include "qpid/broker/Connection.h"
+#include "qpid/log/Statement.h"
+#include "qpid/sys/Mutex.h"
+#include <assert.h>
+#include <sstream>
+
+using namespace qpid::sys;
+
+namespace qpid {
+namespace acl {
+
+//
+// This module instantiates a broker::ConnectionObserver and limits client
+// connections by counting connections per user name and per client IP address.
+//
+
+
+//
+//
+//
+ConnectionCounter::ConnectionCounter(Acl& a, uint32_t nl, uint32_t hl) :
+ acl(a), nameLimit(nl), hostLimit(hl) {}
+
+ConnectionCounter::~ConnectionCounter() {}
+
+
+//
+// limitCheckLH
+//
+// Increment the name's count in map and return a comparison against the limit.
+// called with dataLock already taken
+//
+bool ConnectionCounter::limitCheckLH(
+ connectCountsMap_t& theMap, const std::string& theName, uint32_t theLimit) {
+
+ bool result(true);
+ if (theLimit > 0) {
+ connectCountsMap_t::iterator eRef = theMap.find(theName);
+ if (eRef != theMap.end()) {
+ uint32_t count = (uint32_t)(*eRef).second + 1;
+ (*eRef).second = count;
+ result = count <= theLimit;
+ } else {
+ theMap[theName] = 1;
+ }
+ }
+ return result;
+}
+
+
+//
+// releaseLH
+//
+// Decrement the name's count in map.
+// called with dataLock already taken
+//
+void ConnectionCounter::releaseLH(
+ connectCountsMap_t& theMap, const std::string& theName, uint32_t theLimit) {
+
+ if (theLimit > 0) {
+ connectCountsMap_t::iterator eRef = theMap.find(theName);
+ if (eRef != theMap.end()) {
+ uint32_t count = (uint32_t) (*eRef).second;
+ assert (count > 0);
+ if (1 == count) {
+ theMap.erase (eRef);
+ } else {
+ (*eRef).second = count - 1;
+ }
+ } else {
+ // User had no connections.
+ QPID_LOG(notice, "ACL ConnectionCounter Connection for '" << theName
+ << "' not found in connection count pool");
+ }
+ }
+}
+
+
+//
+// connection - called during Connection's constructor
+//
+void ConnectionCounter::connection(broker::Connection& connection) {
+ QPID_LOG(trace, "ACL ConnectionCounter connection IP:" << connection.getMgmtId()
+ << ", userId:" << connection.getUserId());
+
+ Mutex::ScopedLock locker(dataLock);
+
+ connectProgressMap[connection.getMgmtId()] = C_CREATED;
+}
+
+
+//
+// opened - called when first AMQP frame is received over Connection
+//
+void ConnectionCounter::opened(broker::Connection& connection) {
+ QPID_LOG(trace, "ACL ConnectionCounter Opened IP:" << connection.getMgmtId()
+ << ", userId:" << connection.getUserId());
+
+ Mutex::ScopedLock locker(dataLock);
+
+ const std::string& userName( connection.getUserId());
+ const std::string& hostName(getClientHost(connection.getMgmtId()));
+
+ // Bump state from CREATED to OPENED
+ (void) limitCheckLH(connectProgressMap, connection.getMgmtId(), C_OPENED);
+
+ bool nameOk = limitCheckLH(connectByNameMap, userName, nameLimit);
+ bool hostOk = limitCheckLH(connectByHostMap, hostName, hostLimit);
+
+ if (!nameOk) {
+ // User has too many
+ acl.reportConnectLimit(userName, hostName);
+ QPID_LOG(notice, "ACL ConnectionCounter User '" << userName
+ << "' exceeded maximum allowed connections");
+ throw Exception(
+ QPID_MSG("User '" << userName
+ << "' exceeded maximum allowed connections"));
+ }
+
+ if (!hostOk) {
+ // Host has too many
+ acl.reportConnectLimit(userName, hostName);
+ QPID_LOG(notice, "ACL ConnectionCounter Client host '" << hostName
+ << "' exceeded maximum allowed connections");
+ throw Exception(
+ QPID_MSG("Client host '" << hostName
+ << "' exceeded maximum allowed connections"));
+ }
+}
+
+
+//
+// closed - called during Connection's destructor
+//
+void ConnectionCounter::closed(broker::Connection& connection) {
+ QPID_LOG(trace, "ACL ConnectionCounter Closed IP:" << connection.getMgmtId()
+ << ", userId:" << connection.getUserId());
+
+ Mutex::ScopedLock locker(dataLock);
+
+ connectCountsMap_t::iterator eRef = connectProgressMap.find(connection.getMgmtId());
+ if (eRef != connectProgressMap.end()) {
+ if ((*eRef).second == C_OPENED){
+ // Normal case: connection was created and opened.
+ // Decrement in-use counts
+ releaseLH(connectByNameMap,
+ connection.getUserId(),
+ nameLimit);
+
+ releaseLH(connectByHostMap,
+ getClientHost(connection.getMgmtId()),
+ hostLimit);
+ } else {
+ // Connection was created but not opened.
+ // Don't decrement any connection counts.
+ }
+ connectProgressMap.erase(eRef);
+
+ } else {
+ // connection not found in progress map
+ QPID_LOG(notice, "ACL ConnectionCounter info for '" << connection.getMgmtId()
+ << "' not found in connection state pool");
+ }
+}
+
+
+//
+// getClientIp - given a connection's mgmtId return the client host part.
+//
+// TODO: Ideally this would be a method of the connection itself.
+//
+std::string ConnectionCounter::getClientHost(const std::string mgmtId)
+{
+ size_t hyphen = mgmtId.find('-');
+ if (std::string::npos != hyphen) {
+ size_t colon = mgmtId.find_last_of(':');
+ if (std::string::npos != colon) {
+ // trailing colon found
+ return mgmtId.substr(hyphen+1, colon - hyphen - 1);
+ } else {
+ // colon not found - use everything after hyphen
+ return mgmtId.substr(hyphen+1);
+ }
+ }
+
+ // no hyphen found - use whole string
+ assert(false);
+ return mgmtId;
+}
+
+}} // namespace qpid::ha
diff --git a/cpp/src/qpid/acl/AclConnectionCounter.h b/cpp/src/qpid/acl/AclConnectionCounter.h
new file mode 100644
index 0000000000..31d11540fd
--- /dev/null
+++ b/cpp/src/qpid/acl/AclConnectionCounter.h
@@ -0,0 +1,81 @@
+#ifndef QPID_ACL_CONNECTIONCOUNTER_H
+#define QPID_ACL_CONNECTIONCOUNTER_H
+
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include "qpid/broker/ConnectionObserver.h"
+#include "qpid/sys/Mutex.h"
+#include <boost/iterator/iterator_concepts.hpp>
+
+#include <map>
+
+namespace qpid {
+
+namespace broker {
+class Connection;
+}
+
+namespace acl {
+class Acl;
+
+ /**
+ * Terminate client connections when a user tries to create 'too many'.
+ * Terminate hostIp connections when an IP host tries to create 'too many'.
+ */
+class ConnectionCounter : public broker::ConnectionObserver
+{
+private:
+ typedef std::map<std::string, uint32_t> connectCountsMap_t;
+ enum CONNECTION_PROGRESS { C_CREATED=1, C_OPENED=2 };
+
+ Acl& acl;
+ uint32_t nameLimit;
+ uint32_t hostLimit;
+ qpid::sys::Mutex dataLock;
+
+ connectCountsMap_t connectProgressMap;
+ connectCountsMap_t connectByNameMap;
+ connectCountsMap_t connectByHostMap;
+
+ std::string getClientHost(const std::string mgmtId);
+
+ bool limitCheckLH(connectCountsMap_t& theMap,
+ const std::string& theName,
+ uint32_t theLimit);
+
+ void releaseLH(connectCountsMap_t& theMap,
+ const std::string& theName,
+ uint32_t theLimit);
+
+public:
+ ConnectionCounter(Acl& acl, uint32_t nl, uint32_t hl);
+ ~ConnectionCounter();
+
+ void connection(broker::Connection& connection);
+ void opened(broker::Connection& connection);
+ void closed(broker::Connection& connection);
+
+};
+
+}} // namespace qpid::ha
+
+#endif /*!QPID_ACL_CONNECTIONCOUNTER_H*/
diff --git a/cpp/src/qpid/acl/AclData.cpp b/cpp/src/qpid/acl/AclData.cpp
index 06fc223a73..da7f240a9b 100644
--- a/cpp/src/qpid/acl/AclData.cpp
+++ b/cpp/src/qpid/acl/AclData.cpp
@@ -24,152 +24,302 @@
namespace qpid {
namespace acl {
- AclData::AclData():decisionMode(qpid::acl::DENY),transferAcl(false),aclSource("UNKNOWN")
+ //
+ // constructor
+ //
+ AclData::AclData():
+ decisionMode(qpid::acl::DENY),
+ transferAcl(false),
+ aclSource("UNKNOWN")
{
- for (unsigned int cnt=0; cnt< qpid::acl::ACTIONSIZE; cnt++){
+ for (unsigned int cnt=0; cnt< qpid::acl::ACTIONSIZE; cnt++)
+ {
actionList[cnt]=0;
}
-
}
+
+ //
+ // clear
+ //
void AclData::clear ()
{
- for (unsigned int cnt=0; cnt< qpid::acl::ACTIONSIZE; cnt++){
- if (actionList[cnt]){
+ for (unsigned int cnt=0; cnt< qpid::acl::ACTIONSIZE; cnt++)
+ {
+ if (actionList[cnt])
+ {
for (unsigned int cnt1=0; cnt1< qpid::acl::OBJECTSIZE; cnt1++)
- delete actionList[cnt][cnt1];
+ delete actionList[cnt][cnt1];
}
delete[] actionList[cnt];
}
-
}
- bool AclData::matchProp(const std::string & src, const std::string& src1)
+
+ //
+ // matchProp
+ //
+ // Compare a rule's property name with a lookup name,
+ // The rule's name may contain a trailing '*' to specify a wildcard match.
+ //
+ bool AclData::matchProp(const std::string& ruleStr,
+ const std::string& lookupStr)
{
- // allow wildcard on the end of strings...
- if (src.data()[src.size()-1]=='*') {
- return (src.compare(0, src.size()-1, src1, 0,src.size()-1 ) == 0);
- } else {
- return (src.compare(src1)==0) ;
+ // allow wildcard on the end of rule strings...
+ if (ruleStr.data()[ruleStr.size()-1]=='*')
+ {
+ return ruleStr.compare(0,
+ ruleStr.size()-1,
+ lookupStr,
+ 0,
+ ruleStr.size()-1 ) == 0;
+ }
+ else
+ {
+ return ruleStr.compare(lookupStr) == 0;
}
}
- AclResult AclData::lookup(const std::string& id, const Action& action, const ObjectType& objType,
- const std::string& name, std::map<Property, std::string>* params) {
-
- QPID_LOG(debug, "ACL: Lookup for id:" << id << " action:" << AclHelper::getActionStr((Action) action)
- << " objectType:" << AclHelper::getObjectTypeStr((ObjectType) objType) << " name:" << name
- << " with params " << AclHelper::propertyMapToString(params));
-
- AclResult aclresult = decisionMode;
- if (actionList[action] && actionList[action][objType]) {
- AclData::actObjItr itrRule = actionList[action][objType]->find(id);
- if (itrRule == actionList[action][objType]->end())
- itrRule = actionList[action][objType]->find("*");
-
- if (itrRule != actionList[action][objType]->end()) {
-
- QPID_LOG(debug, "ACL: checking the following rules for : " << itrRule->first );
-
- //loop the vector
- for (ruleSetItr i = itrRule->second.begin(); i < itrRule->second.end(); i++) {
- QPID_LOG(debug, "ACL: checking rule " << i->toString());
- // loop the names looking for match
- bool match = true;
- for (propertyMapItr pMItr = i->props.begin(); (pMItr != i->props.end()) && match; pMItr++) {
- //match name is exists first
- if (pMItr->first == acl::PROP_NAME) {
- if (matchProp(pMItr->second, name)){
- QPID_LOG(debug, "ACL: name '" << name << "' matched with name '"
- << pMItr->second << "' given in the rule");
- }else{
+
+ //
+ // lookup
+ //
+ // The ACL main business logic function of matching rules and declaring
+ // an allow or deny result.
+ //
+ AclResult AclData::lookup(
+ const std::string& id,
+ const Action& action,
+ const ObjectType& objType,
+ const std::string& name,
+ std::map<Property, std::string>* params)
+ {
+ QPID_LOG(debug, "ACL: Lookup for id:" << id
+ << " action:" << AclHelper::getActionStr((Action) action)
+ << " objectType:" << AclHelper::getObjectTypeStr((ObjectType) objType)
+ << " name:" << name
+ << " with params " << AclHelper::propertyMapToString(params));
+
+ // A typical log looks like:
+ // ACL: Lookup for id:bob@QPID action:create objectType:queue name:q2
+ // with params { durable=false passive=false autodelete=false
+ // exclusive=false alternate= policytype= maxqueuesize=0
+ // maxqueuecount=0 }
+
+ // Default result is blanket decision mode for the entire ACL list.
+ AclResult aclresult = decisionMode;
+
+ // Test for lists of rules at the intersection of the Action & Object
+ if (actionList[action] && actionList[action][objType])
+ {
+ // Find the list of rules for this actorId
+ AclData::actObjItr itrRule = actionList[action][objType]->find(id);
+
+ // If individual actorId not found then find a rule set for '*'.
+ if (itrRule == actionList[action][objType]->end())
+ itrRule = actionList[action][objType]->find("*");
+
+ if (itrRule != actionList[action][objType]->end())
+ {
+ // A list of rules exists for this actor/action/object tuple.
+ // Iterate the rule set to search for a matching rule.
+ ruleSetItr rsItr = itrRule->second.end();
+ for (int cnt = itrRule->second.size(); cnt != 0; cnt--)
+ {
+ rsItr--;
+
+ QPID_LOG(debug, "ACL: checking rule " << rsItr->toString());
+
+ bool match = true;
+ bool limitChecked = true;
+
+ // Iterate this rule's properties. A 'match' is true when
+ // all of the rule's properties are found to be satisfied
+ // in the lookup param list. The lookup may specify things
+ // (they usually do) that are not in the rule properties but
+ // these things don't interfere with the rule match.
+
+ for (specPropertyMapItr rulePropMapItr = rsItr->props.begin();
+ (rulePropMapItr != rsItr->props.end()) && match;
+ rulePropMapItr++)
+ {
+ // The rule property map's NAME property is given in
+ // the calling args and not in the param map.
+ if (rulePropMapItr->first == acl::SPECPROP_NAME)
+ {
+ if (matchProp(rulePropMapItr->second, name))
+ {
+ QPID_LOG(debug, "ACL: lookup name '" << name
+ << "' matched with rule name '"
+ << rulePropMapItr->second << "'");
+ }
+ else
+ {
+ match = false;
+ QPID_LOG(debug, "ACL: lookup name '" << name
+ << "' didn't match with rule name '"
+ << rulePropMapItr->second << "'");
+ }
+ }
+ else
+ {
+ if (params)
+ {
+ // The rule's property map non-NAME properties
+ // found in the lookup's params list.
+ // In some cases the param's index is not the same
+ // as rule's index.
+ propertyMapItr lookupParamItr;
+ switch (rulePropMapItr->first)
+ {
+ case acl::SPECPROP_MAXQUEUECOUNTUPPERLIMIT:
+ case acl::SPECPROP_MAXQUEUECOUNTLOWERLIMIT:
+ lookupParamItr = params->find(PROP_MAXQUEUECOUNT);
+ break;
+
+ case acl::SPECPROP_MAXQUEUESIZEUPPERLIMIT:
+ case acl::SPECPROP_MAXQUEUESIZELOWERLIMIT:
+ lookupParamItr = params->find(PROP_MAXQUEUESIZE);
+ break;
+
+ default:
+ lookupParamItr = params->find((Property)rulePropMapItr->first);
+ break;
+ };
+
+ if (lookupParamItr == params->end())
+ {
+ // Now the rule has a specified property
+ // that does not exist in the caller's
+ // lookup params list.
+ // This rule does not match.
match = false;
- QPID_LOG(debug, "ACL: name '" << name << "' didn't match with name '"
- << pMItr->second << "' given in the rule");
+ QPID_LOG(debug, "ACL: lookup parameter map doesn't contain the rule property '"
+ << AclHelper::getPropertyStr(rulePropMapItr->first) << "'");
}
- } else if (params) { //match pMItr against params
- propertyMapItr paramItr = params->find(pMItr->first);
- if (paramItr == params->end()) {
- match = false;
- QPID_LOG(debug, "ACL: the given parameter map in lookup doesn't contain the property '"
- << AclHelper::getPropertyStr(pMItr->first) << "'");
- }else if ( pMItr->first == acl::PROP_MAXQUEUECOUNT || pMItr->first == acl::PROP_MAXQUEUESIZE ) {
- if ( pMItr->first == paramItr->first ) {
-
- uint64_t aclMax = 0;
- uint64_t paramMax = 0;
-
- try{
- aclMax = boost::lexical_cast<uint64_t>(pMItr->second);
- }catch(const boost::bad_lexical_cast&){
- match = false;
- QPID_LOG(error,"Error evaluating rule. " <<
- "Illegal value given in ACL source <" << aclSource <<
- "> for property '" <<
- AclHelper::getPropertyStr(pMItr->first) << "' : " <<
- boost::lexical_cast<std::string>(pMItr->second));
- break;
- }
-
- try{
- paramMax = boost::lexical_cast<uint64_t>(paramItr->second);
- }catch(const boost::bad_lexical_cast&){
+ else
+ {
+ // Now account for the business of rules
+ // whose property indexes are mismatched.
+ switch (rulePropMapItr->first)
+ {
+ case acl::SPECPROP_MAXQUEUECOUNTUPPERLIMIT:
+ case acl::SPECPROP_MAXQUEUESIZEUPPERLIMIT:
+ limitChecked &=
+ compareIntMax(
+ rulePropMapItr->first,
+ boost::lexical_cast<std::string>(rulePropMapItr->second),
+ boost::lexical_cast<std::string>(lookupParamItr->second));
+ break;
+
+ case acl::SPECPROP_MAXQUEUECOUNTLOWERLIMIT:
+ case acl::SPECPROP_MAXQUEUESIZELOWERLIMIT:
+ limitChecked &=
+ compareIntMin(
+ rulePropMapItr->first,
+ boost::lexical_cast<std::string>(rulePropMapItr->second),
+ boost::lexical_cast<std::string>(lookupParamItr->second));
+ break;
+
+ default:
+ if (matchProp(rulePropMapItr->second, lookupParamItr->second))
+ {
+ QPID_LOG(debug, "ACL: the pair("
+ << AclHelper::getPropertyStr(lookupParamItr->first)
+ << "," << lookupParamItr->second
+ << ") given in lookup matched the pair("
+ << AclHelper::getPropertyStr(rulePropMapItr->first) << ","
+ << rulePropMapItr->second
+ << ") given in the rule");
+ }
+ else
+ {
match = false;
- QPID_LOG(error,"Error evaluating rule. " <<
- "Illegal value given in lookup for property '" <<
- AclHelper::getPropertyStr(pMItr->first) << "' : " <<
- boost::lexical_cast<std::string>(paramItr->second));
- break;
- }
-
- QPID_LOG(debug, "ACL: Numeric comparison for property " <<
- AclHelper::getPropertyStr(paramItr->first) <<
- " (value given in lookup = " <<
- boost::lexical_cast<std::string>(paramItr->second) <<
- ", value give in rule = " <<
- boost::lexical_cast<std::string>(pMItr->second) << " )");
-
- if (( aclMax ) && ( paramMax == 0 || paramMax > aclMax)){
- match = decisionMode == qpid::acl::ALLOW ;
- QPID_LOG(debug, "ACL: Limit exceeded and match=" <<
- (match ? "true": "false") <<
- " as decision mode is " << AclHelper::getAclResultStr(decisionMode));
+ QPID_LOG(debug, "ACL: the pair("
+ << AclHelper::getPropertyStr(lookupParamItr->first)
+ << "," << lookupParamItr->second
+ << ") given in lookup doesn't match the pair("
+ << AclHelper::getPropertyStr(rulePropMapItr->first)
+ << "," << rulePropMapItr->second
+ << ") given in the rule");
}
- }
- }else if (matchProp(pMItr->second, paramItr->second)) {
- QPID_LOG(debug, "ACL: the pair("
- << AclHelper::getPropertyStr(paramItr->first) << "," << paramItr->second
- << ") given in lookup matched the pair("
- << AclHelper::getPropertyStr(pMItr->first) << "," << pMItr->second << ") given in the rule");
- } else {
- QPID_LOG(debug, "ACL: the pair("
- << AclHelper::getPropertyStr(paramItr->first) << "," << paramItr->second
- << ") given in lookup doesn't match the pair("
- << AclHelper::getPropertyStr(pMItr->first) << "," << pMItr->second << ") given in the rule");
- match = false;
- }
+ break;
+ };
+ }
+ }
+ else
+ {
+ // params don't exist.
}
}
- if (match)
+ }
+ if (match)
+ {
+ aclresult = rsItr->ruleMode;
+ if (!limitChecked)
{
- aclresult = getACLResult(i->logOnly, i->log);
- QPID_LOG(debug,"Successful match, the decision is:" << AclHelper::getAclResultStr(aclresult));
- return aclresult;
+ // Now a lookup matched all rule properties but one
+ // of the numeric limit checks has failed.
+ // Demote allow rules to corresponding deny rules.
+ switch (aclresult)
+ {
+ case acl::ALLOW:
+ aclresult = acl::DENY;
+ break;
+ case acl::ALLOWLOG:
+ aclresult = acl::DENYLOG;
+ break;
+ default:
+ break;
+ };
}
+ QPID_LOG(debug,"ACL: Successful match, the decision is:"
+ << AclHelper::getAclResultStr(aclresult));
+ return aclresult;
+ }
+ else
+ {
+ // This rule did not match the requested lookup and
+ // does not contribute to an ACL decision.
}
}
}
+ else
+ {
+ // The Action-Object list has entries but not for this actorId
+ // nor for *.
+ }
+ }
+ else
+ {
+ // The Action-Object list has no entries.
+ }
- QPID_LOG(debug,"No successful match, defaulting to the decision mode " << AclHelper::getAclResultStr(aclresult));
- return aclresult;
+ QPID_LOG(debug,"ACL: No successful match, defaulting to the decision mode "
+ << AclHelper::getAclResultStr(aclresult));
+ return aclresult;
}
- AclResult AclData::lookup(const std::string& id, const Action& action, const ObjectType& objType, const std::string& /*Exchange*/ name, const std::string& RoutingKey)
+
+ //
+ // lookup
+ //
+ // The ACL main business logic function of matching rules and declaring
+ // an allow or deny result.
+ //
+ AclResult AclData::lookup(
+ const std::string& id,
+ const Action& action,
+ const ObjectType& objType,
+ const std::string& /*Exchange*/ name,
+ const std::string& routingKey)
{
- QPID_LOG(debug, "ACL: Lookup for id:" << id << " action:" << AclHelper::getActionStr((Action) action)
- << " objectType:" << AclHelper::getObjectTypeStr((ObjectType) objType) << " exchange name:" << name
- << " with routing key " << RoutingKey);
+ QPID_LOG(debug, "ACL: Lookup for id:" << id
+ << " action:" << AclHelper::getActionStr((Action) action)
+ << " objectType:" << AclHelper::getObjectTypeStr((ObjectType) objType)
+ << " exchange name:" << name
+ << " with routing key " << routingKey);
AclResult aclresult = decisionMode;
@@ -179,83 +329,183 @@ namespace acl {
if (itrRule == actionList[action][objType]->end())
itrRule = actionList[action][objType]->find("*");
- if (itrRule != actionList[action][objType]->end() ) {
-
- QPID_LOG(debug, "ACL: checking the following rules for : " << itrRule->first );
-
+ if (itrRule != actionList[action][objType]->end() )
+ {
//loop the vector
- for (ruleSetItr i=itrRule->second.begin(); i<itrRule->second.end(); i++) {
- QPID_LOG(debug, "ACL: checking rule " << i->toString());
+ ruleSetItr rsItr = itrRule->second.end();
+ for (int cnt = itrRule->second.size(); cnt != 0; cnt--)
+ {
+ rsItr--;
+
+ QPID_LOG(debug, "ACL: checking rule " << rsItr->toString());
// loop the names looking for match
bool match =true;
- for (propertyMapItr pMItr = i->props.begin(); (pMItr != i->props.end()) && match; pMItr++)
+ for (specPropertyMapItr pMItr = rsItr->props.begin();
+ (pMItr != rsItr->props.end()) && match;
+ pMItr++)
{
//match name is exists first
- if (pMItr->first == acl::PROP_NAME){
- if (matchProp(pMItr->second, name)){
- QPID_LOG(debug, "ACL: name '" << name << "' matched with name '"
- << pMItr->second << "' given in the rule");
+ switch (pMItr->first)
+ {
+ case acl::SPECPROP_NAME:
+ if (matchProp(pMItr->second, name))
+ {
+ QPID_LOG(debug, "ACL: lookup exchange name '"
+ << name << "' matched with rule name '"
+ << pMItr->second << "'");
- }else{
+ }
+ else
+ {
match= false;
- QPID_LOG(debug, "ACL: name '" << name << "' didn't match with name '"
- << pMItr->second << "' given in the rule");
- }
- }else if (pMItr->first == acl::PROP_ROUTINGKEY){
- if (matchProp(pMItr->second, RoutingKey)){
- QPID_LOG(debug, "ACL: name '" << name << "' matched with routing_key '"
- << pMItr->second << "' given in the rule");
- }else{
+ QPID_LOG(debug, "ACL: lookup exchange name '"
+ << name << "' did not match with rule name '"
+ << pMItr->second << "'");
+ }
+ break;
+
+ case acl::SPECPROP_ROUTINGKEY:
+ if (matchProp(pMItr->second, routingKey))
+ {
+ QPID_LOG(debug, "ACL: lookup key name '"
+ << routingKey << "' matched with rule routing key '"
+ << pMItr->second << "'");
+ }
+ else
+ {
match= false;
- QPID_LOG(debug, "ACL: name '" << name << "' didn't match with routing_key '"
- << pMItr->second << "' given in the rule");
- }
- }
+ QPID_LOG(debug, "ACL: lookup key name '"
+ << routingKey << "' did not match with rule routing key '"
+ << pMItr->second << "'");
+ }
+ break;
+
+ default:
+ // Don't care
+ break;
+ };
}
if (match){
- aclresult = getACLResult(i->logOnly, i->log);
- QPID_LOG(debug,"Successful match, the decision is:" << AclHelper::getAclResultStr(aclresult));
+ aclresult = rsItr->ruleMode;
+ QPID_LOG(debug,"ACL: Successful match, the decision is:"
+ << AclHelper::getAclResultStr(aclresult));
return aclresult;
}
}
}
}
- QPID_LOG(debug,"No successful match, defaulting to the decision mode " << AclHelper::getAclResultStr(aclresult));
+ QPID_LOG(debug,"ACL: No successful match, defaulting to the decision mode "
+ << AclHelper::getAclResultStr(aclresult));
return aclresult;
}
- AclResult AclData::getACLResult(bool logOnly, bool log)
+ //
+ //
+ //
+ AclData::~AclData()
+ {
+ clear();
+ }
+
+
+ //
+ // Limit check a MAX int limit
+ //
+ bool AclData::compareIntMax(const qpid::acl::SpecProperty theProperty,
+ const std::string theAclValue,
+ const std::string theLookupValue)
{
- switch (decisionMode)
+ uint64_t aclMax (0);
+ uint64_t paramMax (0);
+
+ try
{
- case qpid::acl::ALLOWLOG:
- case qpid::acl::ALLOW:
- if (logOnly) return qpid::acl::ALLOWLOG;
- if (log)
- return qpid::acl::DENYLOG;
- else
- return qpid::acl::DENY;
+ aclMax = boost::lexical_cast<uint64_t>(theAclValue);
+ }
+ catch(const boost::bad_lexical_cast&)
+ {
+ assert (false);
+ return false;
+ }
+
+ try
+ {
+ paramMax = boost::lexical_cast<uint64_t>(theLookupValue);
+ }
+ catch(const boost::bad_lexical_cast&)
+ {
+ QPID_LOG(error,"ACL: Error evaluating rule. "
+ << "Illegal value given in lookup for property '"
+ << AclHelper::getPropertyStr(theProperty)
+ << "' : " << theLookupValue);
+ return false;
+ }
+ QPID_LOG(debug, "ACL: Numeric greater-than comparison for property "
+ << AclHelper::getPropertyStr(theProperty)
+ << " (value given in lookup = " << theLookupValue
+ << ", value give in rule = " << theAclValue << " )");
- case qpid::acl::DENYLOG:
- case qpid::acl::DENY:
- if (logOnly) return qpid::acl::DENYLOG;
- if (log)
- return qpid::acl::ALLOWLOG;
- else
- return qpid::acl::ALLOW;
+ if (( aclMax ) && ( paramMax == 0 || paramMax > aclMax))
+ {
+ QPID_LOG(debug, "ACL: Max limit exceeded for property '"
+ << AclHelper::getPropertyStr(theProperty) << "'");
+ return false;
}
- QPID_LOG(error, "ACL Decision Failed, setting DENY");
- return qpid::acl::DENY;
+ return true;
}
- AclData::~AclData()
+
+ //
+ // limit check a MIN int limit
+ //
+ bool AclData::compareIntMin(const qpid::acl::SpecProperty theProperty,
+ const std::string theAclValue,
+ const std::string theLookupValue)
{
- clear();
+ uint64_t aclMin (0);
+ uint64_t paramMin (0);
+
+ try
+ {
+ aclMin = boost::lexical_cast<uint64_t>(theAclValue);
+ }
+ catch(const boost::bad_lexical_cast&)
+ {
+ assert (false);
+ return false;
+ }
+
+ try
+ {
+ paramMin = boost::lexical_cast<uint64_t>(theLookupValue);
+ }
+ catch(const boost::bad_lexical_cast&)
+ {
+ QPID_LOG(error,"ACL: Error evaluating rule. "
+ << "Illegal value given in lookup for property '"
+ << AclHelper::getPropertyStr(theProperty)
+ << "' : " << theLookupValue);
+ return false;
+ }
+
+ QPID_LOG(debug, "ACL: Numeric less-than comparison for property "
+ << AclHelper::getPropertyStr(theProperty)
+ << " (value given in lookup = " << theLookupValue
+ << ", value give in rule = " << theAclValue << " )");
+
+ if (( aclMin ) && ( paramMin == 0 || paramMin < aclMin))
+ {
+ QPID_LOG(debug, "ACL: Min limit exceeded for property '"
+ << AclHelper::getPropertyStr(theProperty) << "'");
+ return false;
+ }
+
+ return true;
}
-}}
+}}
diff --git a/cpp/src/qpid/acl/AclData.h b/cpp/src/qpid/acl/AclData.h
index 81125fdcbc..1c1cb3e9c6 100644
--- a/cpp/src/qpid/acl/AclData.h
+++ b/cpp/src/qpid/acl/AclData.h
@@ -33,50 +33,91 @@ class AclData {
public:
typedef std::map<qpid::acl::Property, std::string> propertyMap;
- typedef propertyMap::const_iterator propertyMapItr;
+ typedef propertyMap::const_iterator propertyMapItr;
+
+ typedef std::map<qpid::acl::SpecProperty, std::string> specPropertyMap;
+ typedef specPropertyMap::const_iterator specPropertyMapItr;
+
+ //
+ // rule
+ //
+ // Created by AclReader and stored in a ruleSet vector for subsequent
+ // run-time lookup matching and allow/deny decisions.
+ // RuleSet vectors are indexed by Action-Object-actorId so these
+ // attributes are not part of a rule.
+ // A single ACL file entry may create many rule entries in
+ // many ruleset vectors.
+ //
struct rule {
- bool log;
- bool logOnly; // this is a rule is to log only
+ int rawRuleNum; // rule number in ACL file
+ qpid::acl::AclResult ruleMode; // combined allow/deny log/nolog
+ specPropertyMap props; //
- // key value map
- //??
- propertyMap props;
-
- rule (propertyMap& p):log(false),logOnly(false),props(p) {};
+ rule (int ruleNum, qpid::acl::AclResult res, specPropertyMap& p) :
+ rawRuleNum(ruleNum),
+ ruleMode(res),
+ props(p)
+ {};
std::string toString () const {
std::ostringstream ruleStr;
- ruleStr << "[log=" << log << ", logOnly=" << logOnly << " props{";
- for (propertyMapItr pMItr = props.begin(); pMItr != props.end(); pMItr++) {
- ruleStr << " " << AclHelper::getPropertyStr((Property) pMItr-> first) << "=" << pMItr->second;
+ ruleStr << "[rule " << rawRuleNum
+ << " ruleMode = " << AclHelper::getAclResultStr(ruleMode)
+ << " props{";
+ for (specPropertyMapItr pMItr = props.begin();
+ pMItr != props.end();
+ pMItr++) {
+ ruleStr << " "
+ << AclHelper::getPropertyStr((SpecProperty) pMItr-> first)
+ << "=" << pMItr->second;
}
ruleStr << " }]";
return ruleStr.str();
}
};
- typedef std::vector<rule> ruleSet;
- typedef ruleSet::const_iterator ruleSetItr;
- typedef std::map<std::string, ruleSet > actionObject; // user
- typedef actionObject::iterator actObjItr;
- typedef actionObject* aclAction;
- // Action*[] -> Object*[] -> map<user -> set<Rule> >
- aclAction* actionList[qpid::acl::ACTIONSIZE];
- qpid::acl::AclResult decisionMode; // determines if the rule set is a deny or allow mode.
- bool transferAcl;
- std::string aclSource;
+ typedef std::vector<rule> ruleSet;
+ typedef ruleSet::const_iterator ruleSetItr;
+ typedef std::map<std::string, ruleSet > actionObject; // user
+ typedef actionObject::iterator actObjItr;
+ typedef actionObject* aclAction;
- AclResult lookup(const std::string& id, const Action& action, const ObjectType& objType, const std::string& name, std::map<Property, std::string>* params=0);
- AclResult lookup(const std::string& id, const Action& action, const ObjectType& objType, const std::string& ExchangeName, const std::string& RoutingKey);
- AclResult getACLResult(bool logOnly, bool log);
+ // Action*[] -> Object*[] -> map<user -> set<Rule> >
+ aclAction* actionList[qpid::acl::ACTIONSIZE];
+ qpid::acl::AclResult decisionMode; // allow/deny[-log] if no matching rule found
+ bool transferAcl;
+ std::string aclSource;
+
+ AclResult lookup(
+ const std::string& id, // actor id
+ const Action& action,
+ const ObjectType& objType,
+ const std::string& name, // object name
+ std::map<Property, std::string>* params=0);
+
+ AclResult lookup(
+ const std::string& id, // actor id
+ const Action& action,
+ const ObjectType& objType,
+ const std::string& ExchangeName,
+ const std::string& RoutingKey);
bool matchProp(const std::string & src, const std::string& src1);
void clear ();
AclData();
virtual ~AclData();
+
+private:
+ bool compareIntMax(const qpid::acl::SpecProperty theProperty,
+ const std::string theAclValue,
+ const std::string theLookupValue);
+
+ bool compareIntMin(const qpid::acl::SpecProperty theProperty,
+ const std::string theAclValue,
+ const std::string theLookupValue);
};
}} // namespace qpid::acl
diff --git a/cpp/src/qpid/acl/AclPlugin.cpp b/cpp/src/qpid/acl/AclPlugin.cpp
index d611797c49..6c18cd2749 100644
--- a/cpp/src/qpid/acl/AclPlugin.cpp
+++ b/cpp/src/qpid/acl/AclPlugin.cpp
@@ -40,7 +40,9 @@ struct AclOptions : public Options {
AclOptions(AclValues& v) : Options("ACL Options"), values(v) {
addOptions()
- ("acl-file", optValue(values.aclFile, "FILE"), "The policy file to load from, loaded from data dir");
+ ("acl-file", optValue(values.aclFile, "FILE"), "The policy file to load from, loaded from data dir")
+ ("acl-max-connect-per-user", optValue(values.aclMaxConnectPerUser, "N"), "The maximum number of connections allowed per user")
+ ("acl-max-connect-per-ip" , optValue(values.aclMaxConnectPerIp, "N"), "The maximum number of connections allowed per host IP address");
}
};
diff --git a/cpp/src/qpid/acl/AclReader.cpp b/cpp/src/qpid/acl/AclReader.cpp
index 74358a20c1..80debf1bd1 100644
--- a/cpp/src/qpid/acl/AclReader.cpp
+++ b/cpp/src/qpid/acl/AclReader.cpp
@@ -49,7 +49,7 @@ namespace acl {
objStatus = ALL;
}
- bool AclReader::aclRule::addProperty(const Property p, const std::string v) {
+ bool AclReader::aclRule::addProperty(const SpecProperty p, const std::string v) {
return props.insert(propNvPair(p, v)).second;
}
@@ -85,146 +85,108 @@ namespace acl {
void AclReader::loadDecisionData(boost::shared_ptr<AclData> d) {
d->clear();
- QPID_LOG(debug, "ACL Load Rules");
- int cnt = rules.size();
+ QPID_LOG(debug, "ACL: Load Rules");
bool foundmode = false;
- for (rlCitr i = rules.end(); cnt; cnt--) {
+ rlCitr i = rules.end();
+ for (int cnt = rules.size(); cnt; cnt--) {
i--;
- QPID_LOG(debug, "ACL Processing " << std::setfill(' ') << std::setw(2)
+ QPID_LOG(debug, "ACL: Processing " << std::setfill(' ') << std::setw(2)
<< cnt << " " << (*i)->toString());
if (!foundmode && (*i)->actionAll && (*i)->names.size() == 1
&& (*((*i)->names.begin())).compare("*") == 0) {
d->decisionMode = (*i)->res;
- QPID_LOG(debug, "ACL FoundMode "
+ QPID_LOG(debug, "ACL: FoundMode "
<< AclHelper::getAclResultStr(d->decisionMode));
foundmode = true;
} else {
- AclData::rule rule((*i)->props);
- bool addrule = true;
-
- switch ((*i)->res) {
- case qpid::acl::ALLOWLOG:
- rule.log = true;
- if (d->decisionMode == qpid::acl::ALLOW ||
- d->decisionMode == qpid::acl::ALLOWLOG)
- rule.logOnly = true;
- break;
- case qpid::acl::ALLOW:
- if (d->decisionMode == qpid::acl::ALLOW ||
- d->decisionMode == qpid::acl::ALLOWLOG)
- addrule = false;
- break;
- case qpid::acl::DENYLOG:
- rule.log = true;
- if (d->decisionMode == qpid::acl::DENY ||
- d->decisionMode == qpid::acl::DENYLOG)
- rule.logOnly = true;
- break;
- case qpid::acl::DENY:
- if (d->decisionMode == qpid::acl::DENY ||
- d->decisionMode == qpid::acl::DENYLOG)
- addrule = false;
- break;
- default:
- throw Exception("Invalid ACL Result loading rules.");
- }
+ AclData::rule rule(cnt, (*i)->res, (*i)->props);
// Action -> Object -> map<user -> set<Rule> >
- if (addrule) {
- std::ostringstream actionstr;
- for (int acnt = ((*i)->actionAll ? 0 : (*i)->action);
- acnt < acl::ACTIONSIZE;
- (*i)->actionAll ? acnt++ : acnt = acl::ACTIONSIZE) {
-
- if (acnt == acl::ACT_PUBLISH)
- d->transferAcl = true; // we have transfer ACL
-
- actionstr << AclHelper::getActionStr((Action) acnt) << ",";
-
- //find the Action, create if not exist
- if (d->actionList[acnt] == NULL) {
- d->actionList[acnt] =
- new AclData::aclAction[qpid::acl::OBJECTSIZE];
- for (int j = 0; j < qpid::acl::OBJECTSIZE; j++)
- d->actionList[acnt][j] = NULL;
- }
-
- // optimize this loop to limit to valid options only!!
- for (int ocnt = ((*i)->objStatus != aclRule::VALUE ? 0
- : (*i)->object);
- ocnt < acl::OBJECTSIZE;
- (*i)->objStatus != aclRule::VALUE ? ocnt++ : ocnt = acl::OBJECTSIZE) {
-
- //find the Object, create if not exist
- if (d->actionList[acnt][ocnt] == NULL)
- d->actionList[acnt][ocnt] =
- new AclData::actionObject;
-
- // add users and Rule to object set
- bool allNames = false;
- // check to see if names.begin is '*'
- if ((*(*i)->names.begin()).compare("*") == 0)
- allNames = true;
-
- for (nsCitr itr = (allNames ? names.begin()
- : (*i)->names.begin());
- itr != (allNames ? names.end() : (*i)->names.end());
- itr++) {
-
- AclData::actObjItr itrRule =
- d->actionList[acnt][ocnt]->find(*itr);
-
- if (itrRule == d->actionList[acnt][ocnt]->end()) {
- AclData::ruleSet rSet;
- rSet.push_back(rule);
- d->actionList[acnt][ocnt]->insert
- (make_pair(std::string(*itr), rSet));
- } else {
- // TODO add code to check for dead rules
- // allow peter create queue name=tmp <-- dead rule!!
- // allow peter create queue
-
- itrRule->second.push_back(rule);
- }
- }
-
- }
+ std::ostringstream actionstr;
+ for (int acnt = ((*i)->actionAll ? 0 : (*i)->action);
+ acnt < acl::ACTIONSIZE;
+ (*i)->actionAll ? acnt++ : acnt = acl::ACTIONSIZE) {
+
+ if (acnt == acl::ACT_PUBLISH)
+ d->transferAcl = true; // we have transfer ACL
+
+ actionstr << AclHelper::getActionStr((Action) acnt) << ",";
+
+ //find the Action, create if not exist
+ if (d->actionList[acnt] == NULL) {
+ d->actionList[acnt] =
+ new AclData::aclAction[qpid::acl::OBJECTSIZE];
+ for (int j = 0; j < qpid::acl::OBJECTSIZE; j++)
+ d->actionList[acnt][j] = NULL;
}
- std::ostringstream objstr;
- for (int ocnt = ((*i)->objStatus != aclRule::VALUE ? 0 : (*i)->object);
+ // TODO: optimize this loop to limit to valid options only!!
+ for (int ocnt = ((*i)->objStatus != aclRule::VALUE ? 0
+ : (*i)->object);
ocnt < acl::OBJECTSIZE;
- (*i)->objStatus != aclRule::VALUE ? ocnt++ : ocnt = acl::OBJECTSIZE) {
- objstr << AclHelper::getObjectTypeStr((ObjectType) ocnt) << ",";
+ (*i)->objStatus != aclRule::VALUE ? ocnt++ : ocnt = acl::OBJECTSIZE) {
+
+ //find the Object, create if not exist
+ if (d->actionList[acnt][ocnt] == NULL)
+ d->actionList[acnt][ocnt] =
+ new AclData::actionObject;
+
+ // add users and Rule to object set
+ bool allNames = false;
+ // check to see if names.begin is '*'
+ if ((*(*i)->names.begin()).compare("*") == 0)
+ allNames = true;
+
+ for (nsCitr itr = (allNames ? names.begin() : (*i)->names.begin());
+ itr != (allNames ? names.end() : (*i)->names.end());
+ itr++) {
+ AclData::actObjItr itrRule =
+ d->actionList[acnt][ocnt]->find(*itr);
+
+ if (itrRule == d->actionList[acnt][ocnt]->end()) {
+ AclData::ruleSet rSet;
+ rSet.push_back(rule);
+ d->actionList[acnt][ocnt]->insert
+ (make_pair(std::string(*itr), rSet));
+ } else {
+ // TODO add code to check for dead rules
+ // allow peter create queue name=tmp <-- dead rule!!
+ // allow peter create queue
+
+ itrRule->second.push_back(rule);
+ }
+ }
}
+ }
- bool allNames = ((*(*i)->names.begin()).compare("*") == 0);
- std::ostringstream userstr;
- for (nsCitr itr = (allNames ? names.begin() : (*i)->names.begin());
- itr != (allNames ? names.end() : (*i)->names.end());
- itr++) {
- userstr << *itr << ",";
- }
+ std::ostringstream objstr;
+ for (int ocnt = ((*i)->objStatus != aclRule::VALUE ? 0 : (*i)->object);
+ ocnt < acl::OBJECTSIZE;
+ (*i)->objStatus != aclRule::VALUE ? ocnt++ : ocnt = acl::OBJECTSIZE) {
+ objstr << AclHelper::getObjectTypeStr((ObjectType) ocnt) << ",";
+ }
- QPID_LOG(debug, "ACL: Adding actions {" <<
- actionstr.str().substr(0,actionstr.str().length()-1)
- << "} to objects {" <<
- objstr.str().substr(0,objstr.str().length()-1)
- << "} with props " <<
- AclHelper::propertyMapToString(&rule.props)
- << " for users {" <<
- userstr.str().substr(0,userstr.str().length()-1)
- << "}" );
- } else {
- QPID_LOG(debug, "ACL Skipping based on Mode:"
- << AclHelper::getAclResultStr(d->decisionMode));
+ bool allNames = ((*(*i)->names.begin()).compare("*") == 0);
+ std::ostringstream userstr;
+ for (nsCitr itr = (allNames ? names.begin() : (*i)->names.begin());
+ itr != (allNames ? names.end() : (*i)->names.end());
+ itr++) {
+ userstr << *itr << ",";
}
- }
+ QPID_LOG(debug, "ACL: Adding actions {" <<
+ actionstr.str().substr(0,actionstr.str().length()-1)
+ << "} to objects {" <<
+ objstr.str().substr(0,objstr.str().length()-1)
+ << "} with props " <<
+ AclHelper::propertyMapToString(&rule.props)
+ << " for users {" <<
+ userstr.str().substr(0,userstr.str().length()-1)
+ << "}" );
+ }
}
-
}
@@ -277,7 +239,7 @@ namespace acl {
}
ifs.close();
if (err) return -3;
- QPID_LOG(notice, "Read ACL file \"" << fn << "\"");
+ QPID_LOG(notice, "ACL: Read file \"" << fn << "\"");
} catch (const std::exception& e) {
errorStream << "Unable to read ACL file \"" << fn << "\": " << e.what();
ifs.close();
@@ -410,8 +372,8 @@ namespace acl {
// Debug aid
void AclReader::printNames() const {
- QPID_LOG(debug, "Group list: " << groups.size() << " groups found:" );
- std::string tmp;
+ QPID_LOG(debug, "ACL: Group list: " << groups.size() << " groups found:" );
+ std::string tmp("ACL: ");
for (gmCitr i=groups.begin(); i!= groups.end(); i++) {
tmp += " \"";
tmp += i->first;
@@ -421,10 +383,10 @@ namespace acl {
tmp += *j;
}
QPID_LOG(debug, tmp);
- tmp.clear();
+ tmp = "ACL: ";
}
- QPID_LOG(debug, "Name list: " << names.size() << " names found:" );
- tmp.clear();
+ QPID_LOG(debug, "ACL: name list: " << names.size() << " names found:" );
+ tmp = "ACL: ";
for (nsCitr k=names.begin(); k!=names.end(); k++) {
tmp += " ";
tmp += *k;
@@ -501,9 +463,9 @@ namespace acl {
<< propNvp.first << "\". (Must be name=value)";
return false;
}
- Property prop;
+ SpecProperty prop;
try {
- prop = AclHelper::getProperty(propNvp.first);
+ prop = AclHelper::getSpecProperty(propNvp.first);
} catch (...) {
errorStream << ACL_FORMAT_ERR_LOG_PREFIX << "Line : " << lineNumber
<< ", Unknown property \"" << propNvp.first << "\".";
@@ -532,10 +494,10 @@ namespace acl {
// Debug aid
void AclReader::printRules() const {
- QPID_LOG(debug, "Rule list: " << rules.size() << " ACL rules found:");
- int cnt = 0;
+ QPID_LOG(debug, "ACL: Rule list: " << rules.size() << " ACL rules found:");
+ int cnt = 1;
for (rlCitr i=rules.begin(); i<rules.end(); i++,cnt++) {
- QPID_LOG(debug, " " << std::setfill(' ') << std::setw(2) << cnt << " " << (*i)->toString());
+ QPID_LOG(debug, "ACL: " << std::setfill(' ') << std::setw(2) << cnt << " " << (*i)->toString());
}
}
diff --git a/cpp/src/qpid/acl/AclReader.h b/cpp/src/qpid/acl/AclReader.h
index 62c6f38f37..730013f4ed 100644
--- a/cpp/src/qpid/acl/AclReader.h
+++ b/cpp/src/qpid/acl/AclReader.h
@@ -33,65 +33,71 @@ namespace qpid {
namespace acl {
class AclReader {
- typedef std::set<std::string> nameSet;
- typedef nameSet::const_iterator nsCitr;
- typedef boost::shared_ptr<nameSet> nameSetPtr;
-
- typedef std::pair<std::string, nameSetPtr> groupPair;
- typedef std::map<std::string, nameSetPtr> groupMap;
- typedef groupMap::const_iterator gmCitr;
- typedef std::pair<gmCitr, bool> gmRes;
-
- typedef std::pair<Property, std::string> propNvPair;
- typedef std::map<Property, std::string> propMap;
- typedef propMap::const_iterator pmCitr;
-
+ typedef std::set<std::string> nameSet;
+ typedef nameSet::const_iterator nsCitr;
+ typedef boost::shared_ptr<nameSet> nameSetPtr;
+
+ typedef std::pair<std::string, nameSetPtr> groupPair;
+ typedef std::map<std::string, nameSetPtr> groupMap;
+ typedef groupMap::const_iterator gmCitr;
+ typedef std::pair<gmCitr, bool> gmRes;
+
+ typedef std::pair<SpecProperty, std::string> propNvPair;
+ typedef std::map<SpecProperty, std::string> propMap;
+ typedef propMap::const_iterator pmCitr;
+
+ //
+ // aclRule
+ //
+ // A temporary rule created during ACL file processing.
+ //
class aclRule {
public:
enum objectStatus {NONE, VALUE, ALL};
- AclResult res;
- nameSet names;
- bool actionAll; // True if action is set to keyword "all"
- Action action; // Ignored if action is set to keyword "all"
- objectStatus objStatus;
- ObjectType object; // Ignored for all status values except VALUE
- propMap props;
+
+ AclResult res;
+ nameSet names;
+ bool actionAll; // True if action is set to keyword "all"
+ Action action; // Ignored if action is set to keyword "all"
+ objectStatus objStatus;
+ ObjectType object; // Ignored for all status values except VALUE
+ propMap props;
public:
aclRule(const AclResult r, const std::string n, const groupMap& groups); // action = "all"
aclRule(const AclResult r, const std::string n, const groupMap& groups, const Action a);
void setObjectType(const ObjectType o);
void setObjectTypeAll();
- bool addProperty(const Property p, const std::string v);
+ bool addProperty(const SpecProperty p, const std::string v);
bool validate(const AclHelper::objectMapPtr& validationMap);
std::string toString(); // debug aid
private:
void processName(const std::string& name, const groupMap& groups);
};
- typedef boost::shared_ptr<aclRule> aclRulePtr;
- typedef std::vector<aclRulePtr> ruleList;
- typedef ruleList::const_iterator rlCitr;
+ typedef boost::shared_ptr<aclRule> aclRulePtr;
+ typedef std::vector<aclRulePtr> ruleList;
+ typedef ruleList::const_iterator rlCitr;
- typedef std::vector<std::string> tokList;
- typedef tokList::const_iterator tlCitr;
+ typedef std::vector<std::string> tokList;
+ typedef tokList::const_iterator tlCitr;
- typedef std::set<std::string> keywordSet;
- typedef keywordSet::const_iterator ksCitr;
+ typedef std::set<std::string> keywordSet;
+ typedef keywordSet::const_iterator ksCitr;
typedef std::pair<std::string, std::string> nvPair; // Name-Value pair
- std::string fileName;
- int lineNumber;
- bool contFlag;
- std::string groupName;
- nameSet names;
- groupMap groups;
- ruleList rules;
+ std::string fileName;
+ int lineNumber;
+ bool contFlag;
+ std::string groupName;
+ nameSet names;
+ groupMap groups;
+ ruleList rules;
AclHelper::objectMapPtr validationMap;
- std::ostringstream errorStream;
+ std::ostringstream errorStream;
public:
AclReader();
virtual ~AclReader();
- int read(const std::string& fn, boost::shared_ptr<AclData> d);
+ int read(const std::string& fn, boost::shared_ptr<AclData> d); // return=0 for success
std::string getError();
private:
diff --git a/cpp/src/qpid/acl/AclValidator.cpp b/cpp/src/qpid/acl/AclValidator.cpp
index d5a00b005b..49bb65db4b 100644
--- a/cpp/src/qpid/acl/AclValidator.cpp
+++ b/cpp/src/qpid/acl/AclValidator.cpp
@@ -29,7 +29,7 @@
namespace qpid {
namespace acl {
- AclValidator::IntPropertyType::IntPropertyType(int64_t i,int64_t j) : min(i), max(j){
+ AclValidator::IntPropertyType::IntPropertyType(int64_t i,int64_t j) : min(i), max(j){
}
bool AclValidator::IntPropertyType::validate(const std::string& val) {
@@ -49,12 +49,12 @@ namespace acl {
}
std::string AclValidator::IntPropertyType::allowedValues() {
- return "values should be between " +
+ return "values should be between " +
boost::lexical_cast<std::string>(min) + " and " +
boost::lexical_cast<std::string>(max);
}
- AclValidator::EnumPropertyType::EnumPropertyType(std::vector<std::string>& allowed): values(allowed){
+ AclValidator::EnumPropertyType::EnumPropertyType(std::vector<std::string>& allowed): values(allowed){
}
bool AclValidator::EnumPropertyType::validate(const std::string& val) {
@@ -78,24 +78,27 @@ namespace acl {
}
AclValidator::AclValidator(){
- validators.insert(Validator(acl::PROP_MAXQUEUESIZE,
- boost::shared_ptr<PropertyType>(
- new IntPropertyType(0,std::numeric_limits<int64_t>::max()))
- )
- );
-
- validators.insert(Validator(acl::PROP_MAXQUEUECOUNT,
- boost::shared_ptr<PropertyType>(
- new IntPropertyType(0,std::numeric_limits<int64_t>::max()))
- )
- );
+ validators.insert(Validator(acl::SPECPROP_MAXQUEUESIZELOWERLIMIT,
+ boost::shared_ptr<PropertyType>(
+ new IntPropertyType(0,std::numeric_limits<int64_t>::max()))));
+
+ validators.insert(Validator(acl::SPECPROP_MAXQUEUESIZEUPPERLIMIT,
+ boost::shared_ptr<PropertyType>(
+ new IntPropertyType(0,std::numeric_limits<int64_t>::max()))));
+
+ validators.insert(Validator(acl::SPECPROP_MAXQUEUECOUNTLOWERLIMIT,
+ boost::shared_ptr<PropertyType>(
+ new IntPropertyType(0,std::numeric_limits<int64_t>::max()))));
+
+ validators.insert(Validator(acl::SPECPROP_MAXQUEUECOUNTUPPERLIMIT,
+ boost::shared_ptr<PropertyType>(
+ new IntPropertyType(0,std::numeric_limits<int64_t>::max()))));
std::string policyTypes[] = {"ring", "ring_strict", "flow_to_disk", "reject"};
std::vector<std::string> v(policyTypes, policyTypes + sizeof(policyTypes) / sizeof(std::string));
- validators.insert(Validator(acl::PROP_POLICYTYPE,
- boost::shared_ptr<PropertyType>(new EnumPropertyType(v))
- )
- );
+ validators.insert(Validator(acl::SPECPROP_POLICYTYPE,
+ boost::shared_ptr<PropertyType>(
+ new EnumPropertyType(v))));
}
@@ -114,9 +117,9 @@ namespace acl {
if (d->actionList[cnt][cnt1]){
std::for_each(d->actionList[cnt][cnt1]->begin(),
- d->actionList[cnt][cnt1]->end(),
- boost::bind(&AclValidator::validateRuleSet, this, _1));
- }//if
+ d->actionList[cnt][cnt1]->end(),
+ boost::bind(&AclValidator::validateRuleSet, this, _1));
+ }//if
}//for
}//if
}//for
@@ -125,25 +128,29 @@ namespace acl {
void AclValidator::validateRuleSet(std::pair<const std::string, qpid::acl::AclData::ruleSet>& rules){
std::for_each(rules.second.begin(),
rules.second.end(),
- boost::bind(&AclValidator::validateRule, this, _1));
+ boost::bind(&AclValidator::validateRule, this, _1));
}
void AclValidator::validateRule(qpid::acl::AclData::rule& rule){
std::for_each(rule.props.begin(),
rule.props.end(),
- boost::bind(&AclValidator::validateProperty, this, _1));
+ boost::bind(&AclValidator::validateProperty, this, _1));
}
- void AclValidator::validateProperty(std::pair<const qpid::acl::Property, std::string>& prop){
+ void AclValidator::validateProperty(std::pair<const qpid::acl::SpecProperty, std::string>& prop){
ValidatorItr itr = validators.find(prop.first);
if (itr != validators.end()){
- QPID_LOG(debug,"Found validator for property " << itr->second->allowedValues());
+ QPID_LOG(debug,"ACL: Found validator for property '" << acl::AclHelper::getPropertyStr(itr->first)
+ << "'. " << itr->second->allowedValues());
if (!itr->second->validate(prop.second)){
- throw Exception( prop.second + " is not a valid value for '" +
+ QPID_LOG(debug, "ACL: Property failed validation. '" << prop.second << "' is not a valid value for '"
+ << AclHelper::getPropertyStr(prop.first) << "'");
+
+ throw Exception( prop.second + " is not a valid value for '" +
AclHelper::getPropertyStr(prop.first) + "', " +
itr->second->allowedValues());
- }
+ }
}
}
diff --git a/cpp/src/qpid/acl/AclValidator.h b/cpp/src/qpid/acl/AclValidator.h
index 966e5d326b..f85c241b06 100644
--- a/cpp/src/qpid/acl/AclValidator.h
+++ b/cpp/src/qpid/acl/AclValidator.h
@@ -33,18 +33,18 @@ namespace acl {
class AclValidator {
/* Base Property */
- class PropertyType{
-
+ class PropertyType{
+
public:
virtual ~PropertyType(){};
virtual bool validate(const std::string& val)=0;
virtual std::string allowedValues()=0;
};
- class IntPropertyType : public PropertyType{
+ class IntPropertyType : public PropertyType{
int64_t min;
int64_t max;
-
+
public:
IntPropertyType(int64_t min,int64_t max);
virtual ~IntPropertyType (){};
@@ -53,7 +53,7 @@ class AclValidator {
};
class EnumPropertyType : public PropertyType{
- std::vector<std::string> values;
+ std::vector<std::string> values;
public:
EnumPropertyType(std::vector<std::string>& allowed);
@@ -61,23 +61,23 @@ class AclValidator {
virtual bool validate(const std::string& val);
virtual std::string allowedValues();
};
-
- typedef std::pair<acl::Property,boost::shared_ptr<PropertyType> > Validator;
- typedef std::map<acl::Property,boost::shared_ptr<PropertyType> > ValidatorMap;
+
+ typedef std::pair<acl::SpecProperty,boost::shared_ptr<PropertyType> > Validator;
+ typedef std::map<acl::SpecProperty,boost::shared_ptr<PropertyType> > ValidatorMap;
typedef ValidatorMap::iterator ValidatorItr;
-
+
ValidatorMap validators;
public:
void validateRuleSet(std::pair<const std::string, qpid::acl::AclData::ruleSet>& rules);
void validateRule(qpid::acl::AclData::rule& rule);
- void validateProperty(std::pair<const qpid::acl::Property, std::string>& prop);
- void validate(boost::shared_ptr<AclData> d);
+ void validateProperty(std::pair<const qpid::acl::SpecProperty, std::string>& prop);
+ void validate(boost::shared_ptr<AclData> d);
AclValidator();
~AclValidator();
};
-
+
}} // namespace qpid::acl
#endif // QPID_ACL_ACLVALIDATOR_H
diff --git a/cpp/src/qpid/acl/management-schema.xml b/cpp/src/qpid/acl/management-schema.xml
index 7f48a9be34..19fe37333c 100644
--- a/cpp/src/qpid/acl/management-schema.xml
+++ b/cpp/src/qpid/acl/management-schema.xml
@@ -23,8 +23,40 @@
<property name="transferAcl" type="bool" access="RO" desc="Any transfer ACL rules in force"/>
<property name="lastAclLoad" type="absTime" access="RO" desc="Timestamp of last successful load of ACL"/>
<statistic name="aclDenyCount" type="count64" unit="request" desc="Number of ACL requests denied"/>
+ <statistic name="connectionDenyCount" type="count64" unit="connection" desc="Number of connections denied"/>
<method name="reloadACLFile" desc="Reload the ACL file"/>
+
+ <!--
+ Lookup is a general object lookup
+ User Name
+ Action
+ Object
+ Object Name
+ Property Map consisting of <"name" "value"> string pairs.
+ -->
+ <method name="Lookup" desc="Lookup: user action object [objectName [propertyMap]]">
+ <arg name="userId" dir="I" type="lstr"/>
+ <arg name="action" dir="I" type="lstr"/>
+ <arg name="object" dir="I" type="lstr"/>
+ <arg name="objectName" dir="I" type="lstr"/>
+ <arg name="propertyMap" dir="I" type="map"/>
+ <arg name="result" dir="O" type="lstr"/>
+ </method>
+
+ <!--
+ LookupPublish is a specific lookup for a PUBLISH EXCHANGE fastpath
+ User Name
+ Exchange Name
+ Routing Key
+ -->
+ <method name="LookupPublish" desc="Lookup PUBLISH EXCHANGE: user exchangeName routingKey">
+ <arg name="userId" dir="I" type="lstr"/>
+ <arg name="exchangeName" dir="I" type="lstr"/>
+ <arg name="routingKey" dir="I" type="lstr"/>
+ <arg name="result" dir="O" type="lstr"/>
+ </method>
+
</class>
<eventArguments>
@@ -34,10 +66,12 @@
<arg name="objectType" type="sstr"/>
<arg name="reason" type="lstr"/>
<arg name="userId" type="sstr"/>
+ <arg name="clientAddr" type="sstr"/>
</eventArguments>
<event name="allow" sev="inform" args="userId, action, objectType, objectName, arguments"/>
<event name="deny" sev="notice" args="userId, action, objectType, objectName, arguments"/>
+ <event name="connectionDeny" sev="notice" args="userId, clientAddr"/>
<event name="fileLoaded" sev="inform" args="userId"/>
<event name="fileLoadFailed" sev="error" args="userId, reason"/>
diff --git a/cpp/src/qpid/agent/ManagementAgentImpl.cpp b/cpp/src/qpid/agent/ManagementAgentImpl.cpp
index f183ff8e0c..09b7fa58e9 100644
--- a/cpp/src/qpid/agent/ManagementAgentImpl.cpp
+++ b/cpp/src/qpid/agent/ManagementAgentImpl.cpp
@@ -31,9 +31,11 @@
#include <fstream>
#include <boost/lexical_cast.hpp>
+namespace qpid {
+namespace management {
+
using namespace qpid::client;
using namespace qpid::framing;
-using namespace qpid::management;
using namespace qpid::sys;
using namespace std;
using std::stringstream;
@@ -1260,7 +1262,7 @@ void ManagementAgentImpl::ConnectionThread::run()
int totalSleep = 0;
do {
sys::Mutex::ScopedUnlock _unlock(connLock);
- ::sleep(delayMin);
+ qpid::sys::sleep(delayMin);
totalSleep += delayMin;
} while (totalSleep < delay && !shutdown);
sleeping = false;
@@ -1396,8 +1398,11 @@ void ManagementAgentImpl::PublishThread::run()
sleepTime = 1;
while (totalSleep < agent.getInterval() && !shutdown) {
- ::sleep(sleepTime);
+ qpid::sys::sleep(sleepTime);
totalSleep += sleepTime;
}
}
}
+
+}}
+
diff --git a/cpp/src/qpid/broker/AclModule.h b/cpp/src/qpid/broker/AclModule.h
index e32ff266b9..ff9281b6fc 100644
--- a/cpp/src/qpid/broker/AclModule.h
+++ b/cpp/src/qpid/broker/AclModule.h
@@ -22,6 +22,7 @@
#include "qpid/RefCounted.h"
+#include "qpid/Exception.h"
#include <boost/shared_ptr.hpp>
#include <map>
#include <set>
@@ -32,17 +33,81 @@ namespace qpid {
namespace acl {
- enum ObjectType {OBJ_QUEUE, OBJ_EXCHANGE, OBJ_BROKER, OBJ_LINK,
- OBJ_METHOD, OBJECTSIZE}; // OBJECTSIZE must be last in list
- enum Action {ACT_CONSUME, ACT_PUBLISH, ACT_CREATE, ACT_ACCESS, ACT_BIND,
- ACT_UNBIND, ACT_DELETE, ACT_PURGE, ACT_UPDATE,
- ACTIONSIZE}; // ACTIONSIZE must be last in list
- enum Property {PROP_NAME, PROP_DURABLE, PROP_OWNER, PROP_ROUTINGKEY,
- PROP_PASSIVE, PROP_AUTODELETE, PROP_EXCLUSIVE, PROP_TYPE,
- PROP_ALTERNATE, PROP_QUEUENAME, PROP_SCHEMAPACKAGE,
- PROP_SCHEMACLASS, PROP_POLICYTYPE, PROP_MAXQUEUESIZE,
- PROP_MAXQUEUECOUNT};
- enum AclResult {ALLOW, ALLOWLOG, DENY, DENYLOG};
+ // Interface enumerations.
+ // These enumerations define enum lists and implied text strings
+ // to match. They are used in two areas:
+ // 1. In the ACL specifications in the ACL file, file parsing, and
+ // internal rule storage.
+ // 2. In the authorize interface in the rest of the broker where
+ // code requests the ACL module to authorize an action.
+
+ // ObjectType shared between ACL spec and ACL authorise interface
+ enum ObjectType {
+ OBJ_QUEUE,
+ OBJ_EXCHANGE,
+ OBJ_BROKER,
+ OBJ_LINK,
+ OBJ_METHOD,
+ OBJECTSIZE }; // OBJECTSIZE must be last in list
+
+ // Action shared between ACL spec and ACL authorise interface
+ enum Action {
+ ACT_CONSUME,
+ ACT_PUBLISH,
+ ACT_CREATE,
+ ACT_ACCESS,
+ ACT_BIND,
+ ACT_UNBIND,
+ ACT_DELETE,
+ ACT_PURGE,
+ ACT_UPDATE,
+ ACTIONSIZE }; // ACTIONSIZE must be last in list
+
+ // Property used in ACL authorize interface
+ enum Property {
+ PROP_NAME,
+ PROP_DURABLE,
+ PROP_OWNER,
+ PROP_ROUTINGKEY,
+ PROP_AUTODELETE,
+ PROP_EXCLUSIVE,
+ PROP_TYPE,
+ PROP_ALTERNATE,
+ PROP_QUEUENAME,
+ PROP_SCHEMAPACKAGE,
+ PROP_SCHEMACLASS,
+ PROP_POLICYTYPE,
+ PROP_MAXQUEUESIZE,
+ PROP_MAXQUEUECOUNT };
+
+ // Property used in ACL spec file
+ // Note for properties common to file processing/rule storage and to
+ // broker rule lookups the identical enum values are used.
+ enum SpecProperty {
+ SPECPROP_NAME = PROP_NAME,
+ SPECPROP_DURABLE = PROP_DURABLE,
+ SPECPROP_OWNER = PROP_OWNER,
+ SPECPROP_ROUTINGKEY = PROP_ROUTINGKEY,
+ SPECPROP_AUTODELETE = PROP_AUTODELETE,
+ SPECPROP_EXCLUSIVE = PROP_EXCLUSIVE,
+ SPECPROP_TYPE = PROP_TYPE,
+ SPECPROP_ALTERNATE = PROP_ALTERNATE,
+ SPECPROP_QUEUENAME = PROP_QUEUENAME,
+ SPECPROP_SCHEMAPACKAGE = PROP_SCHEMAPACKAGE,
+ SPECPROP_SCHEMACLASS = PROP_SCHEMACLASS,
+ SPECPROP_POLICYTYPE = PROP_POLICYTYPE,
+
+ SPECPROP_MAXQUEUESIZELOWERLIMIT,
+ SPECPROP_MAXQUEUESIZEUPPERLIMIT,
+ SPECPROP_MAXQUEUECOUNTLOWERLIMIT,
+ SPECPROP_MAXQUEUECOUNTUPPERLIMIT };
+
+// AclResult shared between ACL spec and ACL authorise interface
+ enum AclResult {
+ ALLOW,
+ ALLOWLOG,
+ DENY,
+ DENYLOG };
} // namespace acl
@@ -54,14 +119,25 @@ namespace broker {
public:
- // effienty turn off ACL on message transfer.
+ // Some ACLs are invoked on every message transfer.
+ // doTransferAcl pervents time consuming ACL calls on a per-message basis.
virtual bool doTransferAcl()=0;
- virtual bool authorise(const std::string& id, const acl::Action& action, const acl::ObjectType& objType, const std::string& name,
+ virtual bool authorise(
+ const std::string& id,
+ const acl::Action& action,
+ const acl::ObjectType& objType,
+ const std::string& name,
std::map<acl::Property, std::string>* params=0)=0;
- virtual bool authorise(const std::string& id, const acl::Action& action, const acl::ObjectType& objType, const std::string& ExchangeName,
- const std::string& RoutingKey)=0;
- // create specilied authorise methods for cases that need faster matching as needed.
+
+ virtual bool authorise(
+ const std::string& id,
+ const acl::Action& action,
+ const acl::ObjectType& objType,
+ const std::string& ExchangeName,
+ const std::string& RoutingKey)=0;
+
+ // Add specialized authorise() methods as required.
virtual ~AclModule() {};
};
@@ -79,7 +155,7 @@ namespace acl {
if (str.compare("broker") == 0) return OBJ_BROKER;
if (str.compare("link") == 0) return OBJ_LINK;
if (str.compare("method") == 0) return OBJ_METHOD;
- throw str;
+ throw qpid::Exception(str);
}
static inline std::string getObjectTypeStr(const ObjectType o) {
switch (o) {
@@ -102,7 +178,7 @@ namespace acl {
if (str.compare("delete") == 0) return ACT_DELETE;
if (str.compare("purge") == 0) return ACT_PURGE;
if (str.compare("update") == 0) return ACT_UPDATE;
- throw str;
+ throw qpid::Exception(str);
}
static inline std::string getActionStr(const Action a) {
switch (a) {
@@ -124,7 +200,6 @@ namespace acl {
if (str.compare("durable") == 0) return PROP_DURABLE;
if (str.compare("owner") == 0) return PROP_OWNER;
if (str.compare("routingkey") == 0) return PROP_ROUTINGKEY;
- if (str.compare("passive") == 0) return PROP_PASSIVE;
if (str.compare("autodelete") == 0) return PROP_AUTODELETE;
if (str.compare("exclusive") == 0) return PROP_EXCLUSIVE;
if (str.compare("type") == 0) return PROP_TYPE;
@@ -134,8 +209,8 @@ namespace acl {
if (str.compare("schemaclass") == 0) return PROP_SCHEMACLASS;
if (str.compare("policytype") == 0) return PROP_POLICYTYPE;
if (str.compare("maxqueuesize") == 0) return PROP_MAXQUEUESIZE;
- if (str.compare("maxqueuecount") == 0) return PROP_MAXQUEUECOUNT;
- throw str;
+ if (str.compare("maxqueuecount") == 0) return PROP_MAXQUEUECOUNT;
+ throw qpid::Exception(str);
}
static inline std::string getPropertyStr(const Property p) {
switch (p) {
@@ -143,7 +218,6 @@ namespace acl {
case PROP_DURABLE: return "durable";
case PROP_OWNER: return "owner";
case PROP_ROUTINGKEY: return "routingkey";
- case PROP_PASSIVE: return "passive";
case PROP_AUTODELETE: return "autodelete";
case PROP_EXCLUSIVE: return "exclusive";
case PROP_TYPE: return "type";
@@ -153,17 +227,61 @@ namespace acl {
case PROP_SCHEMACLASS: return "schemaclass";
case PROP_POLICYTYPE: return "policytype";
case PROP_MAXQUEUESIZE: return "maxqueuesize";
- case PROP_MAXQUEUECOUNT: return "maxqueuecount";
+ case PROP_MAXQUEUECOUNT: return "maxqueuecount";
default: assert(false); // should never get here
}
return "";
}
+ static inline SpecProperty getSpecProperty(const std::string& str) {
+ if (str.compare("name") == 0) return SPECPROP_NAME;
+ if (str.compare("durable") == 0) return SPECPROP_DURABLE;
+ if (str.compare("owner") == 0) return SPECPROP_OWNER;
+ if (str.compare("routingkey") == 0) return SPECPROP_ROUTINGKEY;
+ if (str.compare("autodelete") == 0) return SPECPROP_AUTODELETE;
+ if (str.compare("exclusive") == 0) return SPECPROP_EXCLUSIVE;
+ if (str.compare("type") == 0) return SPECPROP_TYPE;
+ if (str.compare("alternate") == 0) return SPECPROP_ALTERNATE;
+ if (str.compare("queuename") == 0) return SPECPROP_QUEUENAME;
+ if (str.compare("schemapackage") == 0) return SPECPROP_SCHEMAPACKAGE;
+ if (str.compare("schemaclass") == 0) return SPECPROP_SCHEMACLASS;
+ if (str.compare("policytype") == 0) return SPECPROP_POLICYTYPE;
+ if (str.compare("queuemaxsizelowerlimit") == 0) return SPECPROP_MAXQUEUESIZELOWERLIMIT;
+ if (str.compare("queuemaxsizeupperlimit") == 0) return SPECPROP_MAXQUEUESIZEUPPERLIMIT;
+ if (str.compare("queuemaxcountlowerlimit") == 0) return SPECPROP_MAXQUEUECOUNTLOWERLIMIT;
+ if (str.compare("queuemaxcountupperlimit") == 0) return SPECPROP_MAXQUEUECOUNTUPPERLIMIT;
+ // Allow old names in ACL file as aliases for newly-named properties
+ if (str.compare("maxqueuesize") == 0) return SPECPROP_MAXQUEUESIZEUPPERLIMIT;
+ if (str.compare("maxqueuecount") == 0) return SPECPROP_MAXQUEUECOUNTUPPERLIMIT;
+ throw qpid::Exception(str);
+ }
+ static inline std::string getPropertyStr(const SpecProperty p) {
+ switch (p) {
+ case SPECPROP_NAME: return "name";
+ case SPECPROP_DURABLE: return "durable";
+ case SPECPROP_OWNER: return "owner";
+ case SPECPROP_ROUTINGKEY: return "routingkey";
+ case SPECPROP_AUTODELETE: return "autodelete";
+ case SPECPROP_EXCLUSIVE: return "exclusive";
+ case SPECPROP_TYPE: return "type";
+ case SPECPROP_ALTERNATE: return "alternate";
+ case SPECPROP_QUEUENAME: return "queuename";
+ case SPECPROP_SCHEMAPACKAGE: return "schemapackage";
+ case SPECPROP_SCHEMACLASS: return "schemaclass";
+ case SPECPROP_POLICYTYPE: return "policytype";
+ case SPECPROP_MAXQUEUESIZELOWERLIMIT: return "queuemaxsizelowerlimit";
+ case SPECPROP_MAXQUEUESIZEUPPERLIMIT: return "queuemaxsizeupperlimit";
+ case SPECPROP_MAXQUEUECOUNTLOWERLIMIT: return "queuemaxcountlowerlimit";
+ case SPECPROP_MAXQUEUECOUNTUPPERLIMIT: return "queuemaxcountupperlimit";
+ default: assert(false); // should never get here
+ }
+ return "";
+ }
static inline AclResult getAclResult(const std::string& str) {
if (str.compare("allow") == 0) return ALLOW;
if (str.compare("allow-log") == 0) return ALLOWLOG;
if (str.compare("deny") == 0) return DENY;
if (str.compare("deny-log") == 0) return DENYLOG;
- throw str;
+ throw qpid::Exception(str);
}
static inline std::string getAclResultStr(const AclResult r) {
switch (r) {
@@ -187,8 +305,11 @@ namespace acl {
typedef boost::shared_ptr<objectMap> objectMapPtr;
typedef std::map<Property, std::string> propMap;
typedef propMap::const_iterator propMapItr;
+ typedef std::map<SpecProperty, std::string> specPropMap;
+ typedef specPropMap::const_iterator specPropMapItr;
- // This map contains the legal combinations of object/action/properties found in an ACL file
+ // This map contains the legal combinations of object/action/properties
+ // found in an ACL file
static void loadValidationMap(objectMapPtr& map) {
if (!map.get()) return;
map->clear();
@@ -199,7 +320,6 @@ namespace acl {
propSetPtr p1(new propSet);
p1->insert(PROP_TYPE);
p1->insert(PROP_ALTERNATE);
- p1->insert(PROP_PASSIVE);
p1->insert(PROP_DURABLE);
propSetPtr p2(new propSet);
@@ -224,7 +344,6 @@ namespace acl {
propSetPtr p4(new propSet);
p4->insert(PROP_ALTERNATE);
- p4->insert(PROP_PASSIVE);
p4->insert(PROP_DURABLE);
p4->insert(PROP_EXCLUSIVE);
p4->insert(PROP_AUTODELETE);
@@ -260,21 +379,31 @@ namespace acl {
map->insert(objectPair(OBJ_METHOD, a4));
}
- static std::string propertyMapToString(const std::map<Property, std::string>* params) {
+ //
+ // properyMapToString
+ //
+ template <typename T>
+ static std::string propertyMapToString(
+ const std::map<T, std::string>* params)
+ {
std::ostringstream ss;
ss << "{";
if (params)
{
- for (propMapItr pMItr = params->begin(); pMItr != params->end(); pMItr++) {
- ss << " " << getPropertyStr((Property) pMItr-> first) << "=" << pMItr->second;
+ for (typename std::map<T, std::string>::const_iterator
+ pMItr = params->begin(); pMItr != params->end(); pMItr++)
+ {
+ ss << " " << getPropertyStr((T) pMItr-> first)
+ << "=" << pMItr->second;
}
}
ss << " }";
return ss.str();
}
+
};
-
+
}} // namespace qpid::acl
#endif // QPID_ACLMODULE_ACL_H
diff --git a/cpp/src/qpid/broker/Bridge.cpp b/cpp/src/qpid/broker/Bridge.cpp
index 9a1f4be468..5b531e4636 100644
--- a/cpp/src/qpid/broker/Bridge.cpp
+++ b/cpp/src/qpid/broker/Bridge.cpp
@@ -62,7 +62,7 @@ Bridge::Bridge(Link* _link, framing::ChannelId _id, CancellationListener l,
InitializeCallback init) :
link(_link), id(_id), args(_args), mgmtObject(0),
listener(l), name(Uuid(true).str()), queueName("qpid.bridge_queue_"), persistenceId(0),
- initialize(init)
+ initialize(init), detached(false)
{
std::stringstream title;
title << id << "_" << name;
@@ -85,11 +85,14 @@ Bridge::~Bridge()
void Bridge::create(Connection& c)
{
+ detached = false; // Reset detached in case we are recovering.
connState = &c;
conn = &c;
FieldTable options;
if (args.i_sync) options.setInt("qpid.sync_frequency", args.i_sync);
SessionHandler& sessionHandler = c.getChannel(id);
+ sessionHandler.setDetachedCallback(
+ boost::bind(&Bridge::sessionDetached, shared_from_this()));
if (args.i_srcIsLocal) {
if (args.i_dynamic)
throw Exception("Dynamic routing not supported for push routes");
@@ -179,12 +182,6 @@ void Bridge::destroy()
listener(this);
}
-bool Bridge::isSessionReady() const
-{
- SessionHandler& sessionHandler = conn->getChannel(id);
- return sessionHandler.ready();
-}
-
void Bridge::setPersistenceId(uint64_t pId) const
{
persistenceId = pId;
@@ -336,4 +333,8 @@ const string& Bridge::getLocalTag() const
return link->getBroker()->getFederationTag();
}
+void Bridge::sessionDetached() {
+ detached = true;
+}
+
}}
diff --git a/cpp/src/qpid/broker/Bridge.h b/cpp/src/qpid/broker/Bridge.h
index b849b11ba8..32b9fd1781 100644
--- a/cpp/src/qpid/broker/Bridge.h
+++ b/cpp/src/qpid/broker/Bridge.h
@@ -33,6 +33,7 @@
#include "qmf/org/apache/qpid/broker/Bridge.h"
#include <boost/function.hpp>
+#include <boost/enable_shared_from_this.hpp>
#include <memory>
namespace qpid {
@@ -44,7 +45,10 @@ class Link;
class LinkRegistry;
class SessionHandler;
-class Bridge : public PersistableConfig, public management::Manageable, public Exchange::DynamicBridge
+class Bridge : public PersistableConfig,
+ public management::Manageable,
+ public Exchange::DynamicBridge,
+ public boost::enable_shared_from_this<Bridge>
{
public:
typedef boost::shared_ptr<Bridge> shared_ptr;
@@ -63,7 +67,7 @@ public:
void destroy();
bool isDurable() { return args.i_durable; }
- bool isSessionReady() const;
+ bool isDetached() const { return detached; }
management::ManagementObject* GetManagementObject() const;
management::Manageable::status_t ManagementMethod(uint32_t methodId,
@@ -90,6 +94,9 @@ public:
const qmf::org::apache::qpid::broker::ArgsLinkBridge& getArgs() { return args; }
private:
+ // Callback when the bridge's session is detached.
+ void sessionDetached();
+
struct PushHandler : framing::FrameHandler {
PushHandler(Connection* c) { conn = c; }
void handle(framing::AMQFrame& frame);
@@ -112,7 +119,7 @@ private:
ConnectionState* connState;
Connection* conn;
InitializeCallback initialize;
-
+ bool detached; // Set when session is detached.
bool resetProxy();
};
diff --git a/cpp/src/qpid/broker/Broker.cpp b/cpp/src/qpid/broker/Broker.cpp
index 0fd31580f6..f20cce18a2 100644
--- a/cpp/src/qpid/broker/Broker.cpp
+++ b/cpp/src/qpid/broker/Broker.cpp
@@ -111,6 +111,7 @@ Broker::Options::Options(const std::string& name) :
maxConnections(500),
connectionBacklog(10),
enableMgmt(1),
+ mgmtPublish(1),
mgmtPubInterval(10),
queueCleanInterval(60*10),//10 minutes
auth(SaslAuthenticator::available()),
@@ -148,6 +149,7 @@ Broker::Options::Options(const std::string& name) :
("max-connections", optValue(maxConnections, "N"), "Sets the maximum allowed connections")
("connection-backlog", optValue(connectionBacklog, "N"), "Sets the connection backlog limit for the server socket")
("mgmt-enable,m", optValue(enableMgmt,"yes|no"), "Enable Management")
+ ("mgmt-publish", optValue(mgmtPublish,"yes|no"), "Enable Publish of Management Data ('no' implies query-only)")
("mgmt-qmf2", optValue(qmf2Support,"yes|no"), "Enable broadcast of management information over QMF v2")
("mgmt-qmf1", optValue(qmf1Support,"yes|no"), "Enable broadcast of management information over QMF v1")
// FIXME aconway 2012-02-13: consistent treatment of values in SECONDS
@@ -213,7 +215,7 @@ Broker::Broker(const Broker::Options& conf) :
try {
if (conf.enableMgmt) {
QPID_LOG(info, "Management enabled");
- managementAgent->configure(dataDir.isEnabled() ? dataDir.getPath() : string(),
+ managementAgent->configure(dataDir.isEnabled() ? dataDir.getPath() : string(), conf.mgmtPublish,
conf.mgmtPubInterval, this, conf.workerThreads + 3);
managementAgent->setName("apache.org", "qpidd");
_qmf::Package packageInitializer(managementAgent.get());
@@ -228,6 +230,7 @@ Broker::Broker(const Broker::Options& conf) :
mgmtObject->set_maxConns(conf.maxConnections);
mgmtObject->set_connBacklog(conf.connectionBacklog);
mgmtObject->set_mgmtPubInterval(conf.mgmtPubInterval);
+ mgmtObject->set_mgmtPublish(conf.mgmtPublish);
mgmtObject->set_version(qpid::version);
if (dataDir.isEnabled())
mgmtObject->set_dataDir(dataDir.getPath());
@@ -885,7 +888,6 @@ std::pair<boost::shared_ptr<Queue>, bool> Broker::createQueue(
if (acl) {
std::map<acl::Property, std::string> params;
params.insert(make_pair(acl::PROP_ALTERNATE, alternateExchange));
- params.insert(make_pair(acl::PROP_PASSIVE, _FALSE));
params.insert(make_pair(acl::PROP_DURABLE, durable ? _TRUE : _FALSE));
params.insert(make_pair(acl::PROP_EXCLUSIVE, owner ? _TRUE : _FALSE));
params.insert(make_pair(acl::PROP_AUTODELETE, autodelete ? _TRUE : _FALSE));
@@ -956,7 +958,6 @@ std::pair<Exchange::shared_ptr, bool> Broker::createExchange(
std::map<acl::Property, std::string> params;
params.insert(make_pair(acl::PROP_TYPE, type));
params.insert(make_pair(acl::PROP_ALTERNATE, alternateExchange));
- params.insert(make_pair(acl::PROP_PASSIVE, _FALSE));
params.insert(make_pair(acl::PROP_DURABLE, durable ? _TRUE : _FALSE));
if (!acl->authorise(userId,acl::ACT_CREATE,acl::OBJ_EXCHANGE,name,&params) )
throw framing::UnauthorizedAccessException(QPID_MSG("ACL denied exchange create request from " << userId));
diff --git a/cpp/src/qpid/broker/Broker.h b/cpp/src/qpid/broker/Broker.h
index cff38eecdd..135b9340f9 100644
--- a/cpp/src/qpid/broker/Broker.h
+++ b/cpp/src/qpid/broker/Broker.h
@@ -106,6 +106,7 @@ public:
int maxConnections;
int connectionBacklog;
bool enableMgmt;
+ bool mgmtPublish;
uint16_t mgmtPubInterval;
uint16_t queueCleanInterval;
bool auth;
@@ -206,7 +207,7 @@ public:
ConsumerFactories consumerFactories;
public:
- virtual ~Broker();
+ QPID_BROKER_EXTERN virtual ~Broker();
QPID_BROKER_EXTERN Broker(const Options& configuration);
static QPID_BROKER_EXTERN boost::intrusive_ptr<Broker> create(const Options& configuration);
@@ -218,16 +219,16 @@ public:
* port, which will be different if the configured port is
* 0.
*/
- virtual uint16_t getPort(const std::string& name) const;
+ QPID_BROKER_EXTERN virtual uint16_t getPort(const std::string& name) const;
/**
* Run the broker. Implements Runnable::run() so the broker
* can be run in a separate thread.
*/
- virtual void run();
+ QPID_BROKER_EXTERN virtual void run();
/** Shut down the broker */
- virtual void shutdown();
+ QPID_BROKER_EXTERN virtual void shutdown();
QPID_BROKER_EXTERN void setStore (boost::shared_ptr<MessageStore>& store);
void setAsyncStore(boost::shared_ptr<AsyncStore>& asyncStore);
@@ -248,14 +249,14 @@ public:
SessionManager& getSessionManager() { return sessionManager; }
const std::string& getFederationTag() const { return federationTag; }
- management::ManagementObject* GetManagementObject (void) const;
- management::Manageable* GetVhostObject (void) const;
- management::Manageable::status_t ManagementMethod (uint32_t methodId,
- management::Args& args,
- std::string& text);
+ QPID_BROKER_EXTERN management::ManagementObject* GetManagementObject() const;
+ QPID_BROKER_EXTERN management::Manageable* GetVhostObject() const;
+ QPID_BROKER_EXTERN management::Manageable::status_t ManagementMethod(
+ uint32_t methodId, management::Args& args, std::string& text);
/** Add to the broker's protocolFactorys */
- void registerProtocolFactory(const std::string& name, boost::shared_ptr<sys::ProtocolFactory>);
+ QPID_BROKER_EXTERN void registerProtocolFactory(
+ const std::string& name, boost::shared_ptr<sys::ProtocolFactory>);
/** Accept connections */
QPID_BROKER_EXTERN void accept();
@@ -273,15 +274,17 @@ public:
/** Move messages from one queue to another.
A zero quantity means to move all messages
*/
- uint32_t queueMoveMessages( const std::string& srcQueue,
- const std::string& destQueue,
- uint32_t qty,
- const qpid::types::Variant::Map& filter);
+ QPID_BROKER_EXTERN uint32_t queueMoveMessages(
+ const std::string& srcQueue,
+ const std::string& destQueue,
+ uint32_t qty,
+ const qpid::types::Variant::Map& filter);
- boost::shared_ptr<sys::ProtocolFactory> getProtocolFactory(const std::string& name = TCP_TRANSPORT) const;
+ QPID_BROKER_EXTERN boost::shared_ptr<sys::ProtocolFactory> getProtocolFactory(
+ const std::string& name = TCP_TRANSPORT) const;
/** Expose poller so plugins can register their descriptors. */
- boost::shared_ptr<sys::Poller> getPoller();
+ QPID_BROKER_EXTERN boost::shared_ptr<sys::Poller> getPoller();
boost::shared_ptr<sys::ConnectionCodec::Factory> getConnectionFactory() { return factory; }
void setConnectionFactory(boost::shared_ptr<sys::ConnectionCodec::Factory> f) { factory = f; }
@@ -291,7 +294,7 @@ public:
/** Timer for tasks that must be synchronized if we are in a cluster */
sys::Timer& getClusterTimer() { return clusterTimer.get() ? *clusterTimer : timer; }
- void setClusterTimer(std::auto_ptr<sys::Timer>);
+ QPID_BROKER_EXTERN void setClusterTimer(std::auto_ptr<sys::Timer>);
boost::function<std::vector<Url> ()> getKnownBrokers;
@@ -322,15 +325,14 @@ public:
* context.
*@return true if delivery of a message should be deferred.
*/
- boost::function<bool (const std::string& queue,
- const boost::intrusive_ptr<Message>& msg)> deferDelivery;
+ boost::function<bool (const std::string& queue, const boost::intrusive_ptr<Message>& msg)> deferDelivery;
bool isAuthenticating ( ) { return config.auth; }
bool isTimestamping() { return config.timestampRcvMsgs; }
typedef boost::function1<void, boost::shared_ptr<Queue> > QueueFunctor;
- std::pair<boost::shared_ptr<Queue>, bool> createQueue(
+ QPID_BROKER_EXTERN std::pair<boost::shared_ptr<Queue>, bool> createQueue(
const std::string& name,
bool durable,
bool autodelete,
@@ -339,30 +341,39 @@ public:
const qpid::framing::FieldTable& arguments,
const std::string& userId,
const std::string& connectionId);
- void deleteQueue(const std::string& name,
- const std::string& userId,
- const std::string& connectionId,
- QueueFunctor check = QueueFunctor());
- std::pair<Exchange::shared_ptr, bool> createExchange(
+
+ QPID_BROKER_EXTERN void deleteQueue(
+ const std::string& name,
+ const std::string& userId,
+ const std::string& connectionId,
+ QueueFunctor check = QueueFunctor());
+
+ QPID_BROKER_EXTERN std::pair<Exchange::shared_ptr, bool> createExchange(
const std::string& name,
const std::string& type,
bool durable,
const std::string& alternateExchange,
const qpid::framing::FieldTable& args,
const std::string& userId, const std::string& connectionId);
- void deleteExchange(const std::string& name, const std::string& userId,
- const std::string& connectionId);
- void bind(const std::string& queue,
- const std::string& exchange,
- const std::string& key,
- const qpid::framing::FieldTable& arguments,
- const std::string& userId,
- const std::string& connectionId);
- void unbind(const std::string& queue,
- const std::string& exchange,
- const std::string& key,
- const std::string& userId,
- const std::string& connectionId);
+
+ QPID_BROKER_EXTERN void deleteExchange(
+ const std::string& name, const std::string& userId,
+ const std::string& connectionId);
+
+ QPID_BROKER_EXTERN void bind(
+ const std::string& queue,
+ const std::string& exchange,
+ const std::string& key,
+ const qpid::framing::FieldTable& arguments,
+ const std::string& userId,
+ const std::string& connectionId);
+
+ QPID_BROKER_EXTERN void unbind(
+ const std::string& queue,
+ const std::string& exchange,
+ const std::string& key,
+ const std::string& userId,
+ const std::string& connectionId);
ConsumerFactories& getConsumerFactories() { return consumerFactories; }
ConnectionObservers& getConnectionObservers() { return connectionObservers; }
diff --git a/cpp/src/qpid/broker/Connection.cpp b/cpp/src/qpid/broker/Connection.cpp
index 1e6aab217c..5e339cec03 100644
--- a/cpp/src/qpid/broker/Connection.cpp
+++ b/cpp/src/qpid/broker/Connection.cpp
@@ -185,11 +185,13 @@ void Connection::recordFromServer(const framing::AMQFrame& frame)
// Don't record management stats in cluster-unsafe contexts
if (mgmtObject != 0 && isClusterSafe())
{
- mgmtObject->inc_framesToClient();
- mgmtObject->inc_bytesToClient(frame.encodedSize());
+ qmf::org::apache::qpid::broker::Connection::PerThreadStats *cStats = mgmtObject->getStatistics();
+ cStats->framesToClient += 1;
+ cStats->bytesToClient += frame.encodedSize();
if (isMessage(frame.getMethod())) {
- mgmtObject->inc_msgsToClient();
+ cStats->msgsToClient += 1;
}
+ mgmtObject->statisticsUpdated();
}
}
@@ -198,11 +200,13 @@ void Connection::recordFromClient(const framing::AMQFrame& frame)
// Don't record management stats in cluster-unsafe contexts
if (mgmtObject != 0 && isClusterSafe())
{
- mgmtObject->inc_framesFromClient();
- mgmtObject->inc_bytesFromClient(frame.encodedSize());
+ qmf::org::apache::qpid::broker::Connection::PerThreadStats *cStats = mgmtObject->getStatistics();
+ cStats->framesFromClient += 1;
+ cStats->bytesFromClient += frame.encodedSize();
if (isMessage(frame.getMethod())) {
- mgmtObject->inc_msgsFromClient();
+ cStats->msgsFromClient += 1;
}
+ mgmtObject->statisticsUpdated();
}
}
diff --git a/cpp/src/qpid/broker/Connection.h b/cpp/src/qpid/broker/Connection.h
index 858ab6f7f4..1b8bd83139 100644
--- a/cpp/src/qpid/broker/Connection.h
+++ b/cpp/src/qpid/broker/Connection.h
@@ -113,15 +113,20 @@ class Connection : public sys::ConnectionInputHandler,
void requestIOProcessing (boost::function0<void>);
void recordFromServer (const framing::AMQFrame& frame);
void recordFromClient (const framing::AMQFrame& frame);
+
+ // gets for configured federation links
std::string getAuthMechanism();
std::string getAuthCredentials();
std::string getUsername();
std::string getPassword();
std::string getHost();
uint16_t getPort();
+
void notifyConnectionForced(const std::string& text);
void setUserId(const std::string& uid);
void raiseConnectEvent();
+
+ // credentials for connected client
const std::string& getUserId() const { return ConnectionState::getUserId(); }
const std::string& getMgmtId() const { return mgmtId; }
management::ManagementAgent* getAgent() const { return agent; }
diff --git a/cpp/src/qpid/broker/ConnectionHandler.cpp b/cpp/src/qpid/broker/ConnectionHandler.cpp
index f1d43c5cdb..6894324117 100644
--- a/cpp/src/qpid/broker/ConnectionHandler.cpp
+++ b/cpp/src/qpid/broker/ConnectionHandler.cpp
@@ -28,6 +28,7 @@
#include "qpid/framing/AllInvoker.h"
#include "qpid/framing/ConnectionStartOkBody.h"
#include "qpid/framing/enum.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/log/Statement.h"
#include "qpid/sys/SecurityLayer.h"
#include "qpid/broker/AclModule.h"
diff --git a/cpp/src/qpid/broker/ConnectionHandler.h b/cpp/src/qpid/broker/ConnectionHandler.h
index 05c5f00c57..2e25543308 100644
--- a/cpp/src/qpid/broker/ConnectionHandler.h
+++ b/cpp/src/qpid/broker/ConnectionHandler.h
@@ -35,7 +35,6 @@
#include "qpid/framing/ProtocolInitiation.h"
#include "qpid/framing/ProtocolVersion.h"
#include "qpid/Exception.h"
-#include "qpid/broker/AclModule.h"
#include "qpid/sys/SecurityLayer.h"
diff --git a/cpp/src/qpid/broker/DirectExchange.cpp b/cpp/src/qpid/broker/DirectExchange.cpp
index 5591539853..5d9aea7509 100644
--- a/cpp/src/qpid/broker/DirectExchange.cpp
+++ b/cpp/src/qpid/broker/DirectExchange.cpp
@@ -153,8 +153,9 @@ bool DirectExchange::unbind(Queue::shared_ptr queue, const string& routingKey, c
return true;
}
-void DirectExchange::route(Deliverable& msg, const string& routingKey, const FieldTable* /*args*/)
+void DirectExchange::route(Deliverable& msg)
{
+ const string& routingKey = msg.getMessage().getRoutingKey();
PreRoute pr(msg, this);
ConstBindingList b;
{
diff --git a/cpp/src/qpid/broker/DirectExchange.h b/cpp/src/qpid/broker/DirectExchange.h
index a6f9cf91af..833be52c1c 100644
--- a/cpp/src/qpid/broker/DirectExchange.h
+++ b/cpp/src/qpid/broker/DirectExchange.h
@@ -57,9 +57,7 @@ public:
const std::string& routingKey,
const qpid::framing::FieldTable* args);
virtual bool unbind(boost::shared_ptr<Queue> queue, const std::string& routingKey, const qpid::framing::FieldTable* args);
- QPID_BROKER_EXTERN virtual void route(Deliverable& msg,
- const std::string& routingKey,
- const qpid::framing::FieldTable* args);
+ QPID_BROKER_EXTERN virtual void route(Deliverable& msg);
QPID_BROKER_EXTERN virtual bool isBound(boost::shared_ptr<Queue> queue,
const std::string* const routingKey,
const qpid::framing::FieldTable* const args);
diff --git a/cpp/src/qpid/broker/DtxManager.cpp b/cpp/src/qpid/broker/DtxManager.cpp
index febd547478..d482c2c327 100644
--- a/cpp/src/qpid/broker/DtxManager.cpp
+++ b/cpp/src/qpid/broker/DtxManager.cpp
@@ -21,6 +21,7 @@
#include "qpid/broker/DtxManager.h"
#include "qpid/broker/DtxTimeout.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/StructHelper.h"
#include "qpid/log/Statement.h"
#include "qpid/sys/Timer.h"
#include "qpid/ptr_map.h"
@@ -55,7 +56,7 @@ void DtxManager::recover(const std::string& xid, std::auto_ptr<TPCTransactionCon
bool DtxManager::prepare(const std::string& xid)
{
- QPID_LOG(debug, "preparing: " << xid);
+ QPID_LOG(debug, "preparing: " << convert(xid));
try {
return getWork(xid)->prepare();
} catch (DtxTimeoutException& e) {
@@ -66,7 +67,7 @@ bool DtxManager::prepare(const std::string& xid)
bool DtxManager::commit(const std::string& xid, bool onePhase)
{
- QPID_LOG(debug, "committing: " << xid);
+ QPID_LOG(debug, "committing: " << convert(xid));
try {
bool result = getWork(xid)->commit(onePhase);
remove(xid);
@@ -79,7 +80,7 @@ bool DtxManager::commit(const std::string& xid, bool onePhase)
void DtxManager::rollback(const std::string& xid)
{
- QPID_LOG(debug, "rolling back: " << xid);
+ QPID_LOG(debug, "rolling back: " << convert(xid));
try {
getWork(xid)->rollback();
remove(xid);
@@ -94,7 +95,7 @@ DtxWorkRecord* DtxManager::getWork(const std::string& xid)
Mutex::ScopedLock locker(lock);
WorkMap::iterator i = work.find(xid);
if (i == work.end()) {
- throw NotFoundException(QPID_MSG("Unrecognised xid " << xid));
+ throw NotFoundException(QPID_MSG("Unrecognised xid " << convert(xid)));
}
return ptr_map_ptr(i);
}
@@ -109,7 +110,7 @@ void DtxManager::remove(const std::string& xid)
Mutex::ScopedLock locker(lock);
WorkMap::iterator i = work.find(xid);
if (i == work.end()) {
- throw NotFoundException(QPID_MSG("Unrecognised xid " << xid));
+ throw NotFoundException(QPID_MSG("Unrecognised xid " << convert(xid)));
} else {
work.erase(i);
}
@@ -120,7 +121,7 @@ DtxWorkRecord* DtxManager::createWork(const std::string& xid)
Mutex::ScopedLock locker(lock);
WorkMap::iterator i = work.find(xid);
if (i != work.end()) {
- throw NotAllowedException(QPID_MSG("Xid " << xid << " is already known (use 'join' to add work to an existing xid)"));
+ throw NotAllowedException(QPID_MSG("Xid " << convert(xid) << " is already known (use 'join' to add work to an existing xid)"));
} else {
std::string ncxid = xid; // Work around const correctness problems in ptr_map.
return ptr_map_ptr(work.insert(ncxid, new DtxWorkRecord(ncxid, store)).first);
@@ -175,3 +176,19 @@ void DtxManager::setStore (TransactionalStore* _store)
{
store = _store;
}
+
+std::string DtxManager::convert(const qpid::framing::Xid& xid)
+{
+ qpid::framing::StructHelper helper;
+ std::string encoded;
+ helper.encode(xid, encoded);
+ return encoded;
+}
+
+qpid::framing::Xid DtxManager::convert(const std::string& xid)
+{
+ qpid::framing::StructHelper helper;
+ qpid::framing::Xid decoded;
+ helper.decode(decoded, xid);
+ return decoded;
+}
diff --git a/cpp/src/qpid/broker/DtxManager.h b/cpp/src/qpid/broker/DtxManager.h
index 11895695a3..6f03189f66 100644
--- a/cpp/src/qpid/broker/DtxManager.h
+++ b/cpp/src/qpid/broker/DtxManager.h
@@ -26,6 +26,7 @@
#include "qpid/broker/DtxWorkRecord.h"
#include "qpid/broker/TransactionalStore.h"
#include "qpid/framing/amqp_types.h"
+#include "qpid/framing/Xid.h"
#include "qpid/sys/Mutex.h"
#include "qpid/ptr_map.h"
@@ -74,6 +75,8 @@ public:
}
DtxWorkRecord* getWork(const std::string& xid);
bool exists(const std::string& xid);
+ static std::string convert(const framing::Xid& xid);
+ static framing::Xid convert(const std::string& xid);
};
}
diff --git a/cpp/src/qpid/broker/DtxWorkRecord.cpp b/cpp/src/qpid/broker/DtxWorkRecord.cpp
index a413fe418d..2c26fec49f 100644
--- a/cpp/src/qpid/broker/DtxWorkRecord.cpp
+++ b/cpp/src/qpid/broker/DtxWorkRecord.cpp
@@ -19,6 +19,7 @@
*
*/
#include "qpid/broker/DtxWorkRecord.h"
+#include "qpid/broker/DtxManager.h"
#include "qpid/framing/reply_exceptions.h"
#include <boost/format.hpp>
#include <boost/mem_fn.hpp>
@@ -73,7 +74,7 @@ bool DtxWorkRecord::commit(bool onePhase)
if (prepared) {
//already prepared i.e. 2pc
if (onePhase) {
- throw IllegalStateException(QPID_MSG("Branch with xid " << xid << " has been prepared, one-phase option not valid!"));
+ throw IllegalStateException(QPID_MSG("Branch with xid " << DtxManager::convert(xid) << " has been prepared, one-phase option not valid!"));
}
store->commit(*txn);
@@ -84,7 +85,7 @@ bool DtxWorkRecord::commit(bool onePhase)
} else {
//1pc commit optimisation, don't need a 2pc transaction context:
if (!onePhase) {
- throw IllegalStateException(QPID_MSG("Branch with xid " << xid << " has not been prepared, one-phase option required!"));
+ throw IllegalStateException(QPID_MSG("Branch with xid " << DtxManager::convert(xid) << " has not been prepared, one-phase option required!"));
}
std::auto_ptr<TransactionContext> localtxn = store->begin();
if (prepare(localtxn.get())) {
@@ -116,10 +117,10 @@ void DtxWorkRecord::add(DtxBuffer::shared_ptr ops)
{
Mutex::ScopedLock locker(lock);
if (expired) {
- throw DtxTimeoutException(QPID_MSG("Branch with xid " << xid << " has timed out."));
+ throw DtxTimeoutException(QPID_MSG("Branch with xid " << DtxManager::convert(xid) << " has timed out."));
}
if (completed) {
- throw CommandInvalidException(QPID_MSG("Branch with xid " << xid << " has been completed!"));
+ throw CommandInvalidException(QPID_MSG("Branch with xid " << DtxManager::convert(xid) << " has been completed!"));
}
work.push_back(ops);
}
@@ -133,7 +134,7 @@ bool DtxWorkRecord::check()
//iterate through all DtxBuffers and ensure they are all ended
for (Work::iterator i = work.begin(); i != work.end(); i++) {
if (!(*i)->isEnded()) {
- throw IllegalStateException(QPID_MSG("Branch with xid " << xid << " not completed!"));
+ throw IllegalStateException(QPID_MSG("Branch with xid " << DtxManager::convert(xid) << " not completed!"));
} else if ((*i)->isRollbackOnly()) {
rolledback = true;
}
diff --git a/cpp/src/qpid/broker/Exchange.cpp b/cpp/src/qpid/broker/Exchange.cpp
index ecaa492903..8d20b0df81 100644
--- a/cpp/src/qpid/broker/Exchange.cpp
+++ b/cpp/src/qpid/broker/Exchange.cpp
@@ -32,7 +32,9 @@
#include "qpid/sys/ExceptionHolder.h"
#include <stdexcept>
-using namespace qpid::broker;
+namespace qpid {
+namespace broker {
+
using namespace qpid::framing;
using qpid::framing::Buffer;
using qpid::framing::FieldTable;
@@ -135,20 +137,23 @@ void Exchange::doRoute(Deliverable& msg, ConstBindingList b)
if (mgmtExchange != 0)
{
- mgmtExchange->inc_msgReceives ();
- mgmtExchange->inc_byteReceives (msg.contentSize ());
+ qmf::org::apache::qpid::broker::Exchange::PerThreadStats *eStats = mgmtExchange->getStatistics();
+ uint64_t contentSize = msg.contentSize();
+
+ eStats->msgReceives += 1;
+ eStats->byteReceives += contentSize;
if (count == 0)
{
//QPID_LOG(warning, "Exchange " << getName() << " could not route message; no matching binding found");
- mgmtExchange->inc_msgDrops ();
- mgmtExchange->inc_byteDrops (msg.contentSize ());
+ eStats->msgDrops += 1;
+ eStats->byteDrops += contentSize;
if (brokerMgmtObject)
brokerMgmtObject->inc_discardsNoRoute();
}
else
{
- mgmtExchange->inc_msgRoutes (count);
- mgmtExchange->inc_byteRoutes (count * msg.contentSize ());
+ eStats->msgRoutes += count;
+ eStats->byteRoutes += count * contentSize;
}
}
}
@@ -156,7 +161,7 @@ void Exchange::doRoute(Deliverable& msg, ConstBindingList b)
void Exchange::routeIVE(){
if (ive && lastMsg.get()){
DeliverableMessage dmsg(lastMsg);
- route(dmsg, lastMsg->getRoutingKey(), lastMsg->getApplicationHeaders());
+ route(dmsg);
}
}
@@ -399,9 +404,12 @@ void Exchange::setProperties(const boost::intrusive_ptr<Message>& msg) {
bool Exchange::routeWithAlternate(Deliverable& msg)
{
- route(msg, msg.getMessage().getRoutingKey(), msg.getMessage().getApplicationHeaders());
+ route(msg);
if (!msg.delivered && alternate) {
- alternate->route(msg, msg.getMessage().getRoutingKey(), msg.getMessage().getApplicationHeaders());
+ alternate->route(msg);
}
return msg.delivered;
}
+
+}}
+
diff --git a/cpp/src/qpid/broker/Exchange.h b/cpp/src/qpid/broker/Exchange.h
index 9179dd5c7c..7376f814ed 100644
--- a/cpp/src/qpid/broker/Exchange.h
+++ b/cpp/src/qpid/broker/Exchange.h
@@ -196,7 +196,7 @@ public:
virtual bool unbind(boost::shared_ptr<Queue> queue, const std::string& routingKey, const qpid::framing::FieldTable* args) = 0;
virtual bool isBound(boost::shared_ptr<Queue> queue, const std::string* const routingKey, const qpid::framing::FieldTable* const args) = 0;
QPID_BROKER_EXTERN virtual void setProperties(const boost::intrusive_ptr<Message>&);
- virtual void route(Deliverable& msg, const std::string& routingKey, const qpid::framing::FieldTable* args) = 0;
+ virtual void route(Deliverable& msg) = 0;
//PersistableExchange:
QPID_BROKER_EXTERN void setPersistenceId(uint64_t id) const;
diff --git a/cpp/src/qpid/broker/ExchangeRegistry.cpp b/cpp/src/qpid/broker/ExchangeRegistry.cpp
index fca77f7ddd..43d7268dfb 100644
--- a/cpp/src/qpid/broker/ExchangeRegistry.cpp
+++ b/cpp/src/qpid/broker/ExchangeRegistry.cpp
@@ -24,6 +24,7 @@
#include "qpid/broker/FanOutExchange.h"
#include "qpid/broker/HeadersExchange.h"
#include "qpid/broker/TopicExchange.h"
+#include "qpid/broker/Link.h"
#include "qpid/management/ManagementDirectExchange.h"
#include "qpid/management/ManagementTopicExchange.h"
#include "qpid/framing/reply_exceptions.h"
@@ -58,6 +59,8 @@ pair<Exchange::shared_ptr, bool> ExchangeRegistry::declare(const string& name, c
exchange = Exchange::shared_ptr(new ManagementDirectExchange(name, durable, args, parent, broker));
}else if (type == ManagementTopicExchange::typeName) {
exchange = Exchange::shared_ptr(new ManagementTopicExchange(name, durable, args, parent, broker));
+ }else if (type == Link::exchangeTypeName) {
+ exchange = Link::linkExchangeFactory(name);
}else{
FunctionMap::iterator i = factory.find(type);
if (i == factory.end()) {
diff --git a/cpp/src/qpid/broker/ExchangeRegistry.h b/cpp/src/qpid/broker/ExchangeRegistry.h
index 90ef81b49e..27b705fbe5 100644
--- a/cpp/src/qpid/broker/ExchangeRegistry.h
+++ b/cpp/src/qpid/broker/ExchangeRegistry.h
@@ -54,7 +54,7 @@ class ExchangeRegistry{
bool durable,
const qpid::framing::FieldTable& args = framing::FieldTable());
QPID_BROKER_EXTERN void destroy(const std::string& name);
- Exchange::shared_ptr getDefault();
+ QPID_BROKER_EXTERN Exchange::shared_ptr getDefault();
/**
* Find the named exchange. Return 0 if not found.
@@ -75,7 +75,7 @@ class ExchangeRegistry{
/** Register an exchange instance.
*@return true if registered, false if exchange with same name is already registered.
*/
- bool registerExchange(const Exchange::shared_ptr&);
+ QPID_BROKER_EXTERN bool registerExchange(const Exchange::shared_ptr&);
QPID_BROKER_EXTERN void registerType(const std::string& type, FactoryFunction);
@@ -85,7 +85,7 @@ class ExchangeRegistry{
for (ExchangeMap::const_iterator i = exchanges.begin(); i != exchanges.end(); ++i)
f(i->second);
}
-
+
private:
typedef std::map<std::string, Exchange::shared_ptr> ExchangeMap;
typedef std::map<std::string, FactoryFunction > FunctionMap;
diff --git a/cpp/src/qpid/broker/Fairshare.cpp b/cpp/src/qpid/broker/Fairshare.cpp
index 313aa746f1..7cdad1a44f 100644
--- a/cpp/src/qpid/broker/Fairshare.cpp
+++ b/cpp/src/qpid/broker/Fairshare.cpp
@@ -21,6 +21,7 @@
#include "qpid/broker/Fairshare.h"
#include "qpid/broker/QueuedMessage.h"
#include "qpid/framing/FieldTable.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/log/Statement.h"
#include <boost/format.hpp>
#include <boost/lexical_cast.hpp>
diff --git a/cpp/src/qpid/broker/FanOutExchange.cpp b/cpp/src/qpid/broker/FanOutExchange.cpp
index 5879fa0892..2bce99b6fe 100644
--- a/cpp/src/qpid/broker/FanOutExchange.cpp
+++ b/cpp/src/qpid/broker/FanOutExchange.cpp
@@ -101,7 +101,7 @@ bool FanOutExchange::unbind(Queue::shared_ptr queue, const string& /*key*/, cons
return true;
}
-void FanOutExchange::route(Deliverable& msg, const string& /*routingKey*/, const FieldTable* /*args*/)
+void FanOutExchange::route(Deliverable& msg)
{
PreRoute pr(msg, this);
doRoute(msg, bindings.snapshot());
diff --git a/cpp/src/qpid/broker/FanOutExchange.h b/cpp/src/qpid/broker/FanOutExchange.h
index 1a7d486796..c979fdca25 100644
--- a/cpp/src/qpid/broker/FanOutExchange.h
+++ b/cpp/src/qpid/broker/FanOutExchange.h
@@ -54,9 +54,7 @@ class FanOutExchange : public virtual Exchange {
virtual bool unbind(Queue::shared_ptr queue, const std::string& routingKey, const qpid::framing::FieldTable* args);
- QPID_BROKER_EXTERN virtual void route(Deliverable& msg,
- const std::string& routingKey,
- const qpid::framing::FieldTable* args);
+ QPID_BROKER_EXTERN virtual void route(Deliverable& msg);
QPID_BROKER_EXTERN virtual bool isBound(Queue::shared_ptr queue,
const std::string* const routingKey,
diff --git a/cpp/src/qpid/broker/HeadersExchange.cpp b/cpp/src/qpid/broker/HeadersExchange.cpp
index 142c23f276..6648ae0422 100644
--- a/cpp/src/qpid/broker/HeadersExchange.cpp
+++ b/cpp/src/qpid/broker/HeadersExchange.cpp
@@ -191,8 +191,9 @@ bool HeadersExchange::unbind(Queue::shared_ptr queue, const string& bindingKey,
}
-void HeadersExchange::route(Deliverable& msg, const string& /*routingKey*/, const FieldTable* args)
+void HeadersExchange::route(Deliverable& msg)
{
+ const FieldTable* args = msg.getMessage().getApplicationHeaders();
if (!args) {
//can't match if there were no headers passed in
if (mgmtExchange != 0) {
diff --git a/cpp/src/qpid/broker/HeadersExchange.h b/cpp/src/qpid/broker/HeadersExchange.h
index 3b939d6851..d10892b9cc 100644
--- a/cpp/src/qpid/broker/HeadersExchange.h
+++ b/cpp/src/qpid/broker/HeadersExchange.h
@@ -98,9 +98,7 @@ class HeadersExchange : public virtual Exchange {
virtual bool unbind(Queue::shared_ptr queue, const std::string& routingKey, const qpid::framing::FieldTable* args);
- QPID_BROKER_EXTERN virtual void route(Deliverable& msg,
- const std::string& routingKey,
- const qpid::framing::FieldTable* args);
+ QPID_BROKER_EXTERN virtual void route(Deliverable& msg);
QPID_BROKER_EXTERN virtual bool isBound(Queue::shared_ptr queue,
const std::string* const routingKey,
diff --git a/cpp/src/qpid/broker/LegacyLVQ.cpp b/cpp/src/qpid/broker/LegacyLVQ.cpp
index 49c0a32c19..f1deddf4c8 100644
--- a/cpp/src/qpid/broker/LegacyLVQ.cpp
+++ b/cpp/src/qpid/broker/LegacyLVQ.cpp
@@ -28,16 +28,26 @@ namespace broker {
LegacyLVQ::LegacyLVQ(const std::string& k, bool b, Broker* br) : MessageMap(k), noBrowse(b), broker(br) {}
void LegacyLVQ::setNoBrowse(bool b)
-{
+{
noBrowse = b;
}
+bool LegacyLVQ::deleted(const QueuedMessage& message)
+{
+ Ordering::iterator i = messages.find(message.position);
+ if (i != messages.end() && i->second.payload == message.payload) {
+ erase(i);
+ return true;
+ } else {
+ return false;
+ }
+}
bool LegacyLVQ::acquire(const framing::SequenceNumber& position, QueuedMessage& message)
{
Ordering::iterator i = messages.find(position);
- if (i != messages.end() && i->second.payload == message.payload) {
+ if (i != messages.end() && i->second.payload == message.payload && i->second.status == QueuedMessage::AVAILABLE) {
+ i->second.status = QueuedMessage::ACQUIRED;
message = i->second;
- erase(i);
return true;
} else {
return false;
@@ -66,12 +76,17 @@ bool LegacyLVQ::push(const QueuedMessage& added, QueuedMessage& removed)
}
const QueuedMessage& LegacyLVQ::replace(const QueuedMessage& original, const QueuedMessage& update)
-{
+{
//add the new message into the original position of the replaced message
Ordering::iterator i = messages.find(original.position);
- i->second = update;
- i->second.position = original.position;
- return i->second;
+ if (i != messages.end()) {
+ i->second = update;
+ i->second.position = original.position;
+ return i->second;
+ } else {
+ QPID_LOG(error, "Failed to replace message at " << original.position);
+ return update;
+ }
}
void LegacyLVQ::removeIf(Predicate p)
diff --git a/cpp/src/qpid/broker/LegacyLVQ.h b/cpp/src/qpid/broker/LegacyLVQ.h
index 695e51131d..9355069f37 100644
--- a/cpp/src/qpid/broker/LegacyLVQ.h
+++ b/cpp/src/qpid/broker/LegacyLVQ.h
@@ -40,6 +40,7 @@ class LegacyLVQ : public MessageMap
{
public:
LegacyLVQ(const std::string& key, bool noBrowse = false, Broker* broker = 0);
+ bool deleted(const QueuedMessage&);
bool acquire(const framing::SequenceNumber&, QueuedMessage&);
bool browse(const framing::SequenceNumber&, QueuedMessage&, bool);
bool push(const QueuedMessage& added, QueuedMessage& removed);
diff --git a/cpp/src/qpid/broker/Link.cpp b/cpp/src/qpid/broker/Link.cpp
index 4af1e6d6bd..f21c861149 100644
--- a/cpp/src/qpid/broker/Link.cpp
+++ b/cpp/src/qpid/broker/Link.cpp
@@ -31,6 +31,8 @@
#include "qpid/framing/enum.h"
#include "qpid/framing/reply_exceptions.h"
#include "qpid/broker/AclModule.h"
+#include "qpid/broker/Exchange.h"
+#include "qpid/UrlArray.h"
namespace qpid {
namespace broker {
@@ -48,6 +50,13 @@ using std::stringstream;
using std::string;
namespace _qmf = ::qmf::org::apache::qpid::broker;
+
+namespace {
+ const std::string FAILOVER_EXCHANGE("amq.failover");
+ const std::string FAILOVER_HEADER_KEY("amq.failover");
+}
+
+
struct LinkTimerTask : public sys::TimerTask {
LinkTimerTask(Link& l, sys::Timer& t)
: TimerTask(int64_t(l.getBroker()->getOptions().linkMaintenanceInterval*
@@ -65,6 +74,57 @@ struct LinkTimerTask : public sys::TimerTask {
sys::Timer& timer;
};
+
+
+/** LinkExchange is used by the link to subscribe to the remote broker's amq.failover exchange.
+ */
+class LinkExchange : public broker::Exchange
+{
+public:
+ LinkExchange(const std::string& name) : Exchange(name), link(0) {}
+ ~LinkExchange() {};
+ std::string getType() const { return Link::exchangeTypeName; }
+
+ // Exchange methods - set up to prevent binding/unbinding etc from clients!
+ bool bind(boost::shared_ptr<broker::Queue>, const std::string&, const framing::FieldTable*) { return false; }
+ bool unbind(boost::shared_ptr<broker::Queue>, const std::string&, const framing::FieldTable*) { return false; }
+ bool isBound(boost::shared_ptr<broker::Queue>, const std::string* const, const framing::FieldTable* const) {return false;}
+
+ // Process messages sent from the remote's amq.failover exchange by extracting the failover URLs
+ // and saving them should the Link need to reconnect.
+ void route(broker::Deliverable& msg)
+ {
+ if (!link) return;
+ const framing::FieldTable* headers = msg.getMessage().getApplicationHeaders();
+ framing::Array addresses;
+ if (headers && headers->getArray(FAILOVER_HEADER_KEY, addresses)) {
+ // convert the Array of addresses to a single Url container for used with setUrl():
+ std::vector<Url> urlVec;
+ Url urls;
+ urlVec = urlArrayToVector(addresses);
+ for(size_t i = 0; i < urlVec.size(); ++i)
+ urls.insert(urls.end(), urlVec[i].begin(), urlVec[i].end());
+ QPID_LOG(debug, "Remote broker has provided these failover addresses= " << urls);
+ link->setUrl(urls);
+ }
+ }
+
+ void setLink(Link *_link)
+ {
+ assert(!link);
+ link = _link;
+ }
+
+private:
+ Link *link;
+};
+
+
+boost::shared_ptr<Exchange> Link::linkExchangeFactory( const std::string& _name )
+{
+ return Exchange::shared_ptr(new LinkExchange(_name));
+}
+
Link::Link(LinkRegistry* _links,
MessageStore* _store,
const string& _host,
@@ -76,8 +136,9 @@ Link::Link(LinkRegistry* _links,
const string& _password,
Broker* _broker,
Manageable* parent)
- : links(_links), store(_store), host(_host), port(_port),
- transport(_transport),
+ : links(_links), store(_store),
+ configuredTransport(_transport), configuredHost(_host), configuredPort(_port),
+ host(_host), port(_port), transport(_transport),
durable(_durable),
authMechanism(_authMechanism), username(_username), password(_password),
persistenceId(0), mgmtObject(0), broker(_broker), state(0),
@@ -88,7 +149,8 @@ Link::Link(LinkRegistry* _links,
channelCounter(1),
connection(0),
agent(0),
- timerTask(new LinkTimerTask(*this, broker->getTimer()))
+ timerTask(new LinkTimerTask(*this, broker->getTimer())),
+ failoverChannel(0)
{
if (parent != 0 && broker != 0)
{
@@ -106,15 +168,26 @@ Link::Link(LinkRegistry* _links,
startConnectionLH();
}
broker->getTimer().add(timerTask);
+
+ stringstream _name;
+ _name << "qpid.link." << transport << ":" << host << ":" << port;
+ std::pair<Exchange::shared_ptr, bool> rc = broker->getExchanges().declare(_name.str(),
+ exchangeTypeName);
+ failoverExchange = boost::static_pointer_cast<LinkExchange>(rc.first);
+ assert(failoverExchange);
+ failoverExchange->setLink(this);
}
Link::~Link ()
{
- if (state == STATE_OPERATIONAL && connection != 0)
- connection->close(CLOSE_CODE_CONNECTION_FORCED, "closed by management");
+ if (state == STATE_OPERATIONAL && connection != 0) {
+ closeConnection("closed by management");
+ }
if (mgmtObject != 0)
mgmtObject->resourceDestroy ();
+
+ broker->getExchanges().destroy(failoverExchange->getName());
}
void Link::setStateLH (int newState)
@@ -180,11 +253,21 @@ void Link::established(Connection* c)
void Link::setUrl(const Url& u) {
+ QPID_LOG(info, "Setting remote broker failover addresses for link '" << getName() << "' to these urls: " << u);
Mutex::ScopedLock mutex(lock);
url = u;
reconnectNext = 0;
}
+
+namespace {
+ /** invoked when session used to subscribe to remote's amq.failover exchange detaches */
+ void sessionDetached(Link *link) {
+ QPID_LOG(debug, "detached from 'amq.failover' for link: " << link->getName());
+ }
+}
+
+
void Link::opened() {
Mutex::ScopedLock mutex(lock);
if (!connection) return;
@@ -198,37 +281,74 @@ void Link::opened() {
reconnectNext = 0;
QPID_LOG(debug, "Known hosts for peer of inter-broker link: " << url);
}
+
+ //
+ // attempt to subscribe to failover exchange for updates from remote
+ //
+
+ const std::string queueName = "qpid.link." + framing::Uuid(true).str();
+ failoverChannel = nextChannel();
+
+ SessionHandler& sessionHandler = connection->getChannel(failoverChannel);
+ sessionHandler.setDetachedCallback( boost::bind(&sessionDetached, this) );
+ failoverSession = queueName;
+ sessionHandler.attachAs(failoverSession);
+
+ framing::AMQP_ServerProxy remoteBroker(sessionHandler.out);
+
+ remoteBroker.getQueue().declare(queueName,
+ "", // alt-exchange
+ false, // passive
+ false, // durable
+ true, // exclusive
+ true, // auto-delete
+ FieldTable());
+ remoteBroker.getExchange().bind(queueName,
+ FAILOVER_EXCHANGE,
+ "", // no key
+ FieldTable());
+ remoteBroker.getMessage().subscribe(queueName,
+ failoverExchange->getName(),
+ 1, // implied-accept mode
+ 0, // pre-acquire mode
+ false, // exclusive
+ "", // resume-id
+ 0, // resume-ttl
+ FieldTable());
+ remoteBroker.getMessage().flow(failoverExchange->getName(), 0, 0xFFFFFFFF);
+ remoteBroker.getMessage().flow(failoverExchange->getName(), 1, 0xFFFFFFFF);
}
void Link::closed(int, std::string text)
{
- Mutex::ScopedLock mutex(lock);
- QPID_LOG (info, "Inter-broker link disconnected from " << host << ":" << port << " " << text);
-
- connection = 0;
+ bool isClosing = false;
+ {
+ Mutex::ScopedLock mutex(lock);
+ QPID_LOG (info, "Inter-broker link disconnected from " << host << ":" << port << " " << text);
- if (state == STATE_OPERATIONAL) {
- stringstream addr;
- addr << host << ":" << port;
- QPID_LOG(warning, "Inter-broker link disconnected from " << addr.str());
- if (!hideManagement() && agent)
- agent->raiseEvent(_qmf::EventBrokerLinkDown(addr.str()));
- }
+ connection = 0;
+ if (state == STATE_OPERATIONAL) {
+ stringstream addr;
+ addr << host << ":" << port;
+ if (!hideManagement() && agent)
+ agent->raiseEvent(_qmf::EventBrokerLinkDown(addr.str()));
+ }
- for (Bridges::iterator i = active.begin(); i != active.end(); i++) {
- (*i)->closed();
- created.push_back(*i);
- }
- active.clear();
+ for (Bridges::iterator i = active.begin(); i != active.end(); i++) {
+ (*i)->closed();
+ created.push_back(*i);
+ }
+ active.clear();
- if (state != STATE_FAILED && state != STATE_PASSIVE)
- {
- setStateLH(STATE_WAITING);
- if (!hideManagement())
- mgmtObject->set_lastError (text);
+ if (state != STATE_FAILED && state != STATE_PASSIVE)
+ {
+ setStateLH(STATE_WAITING);
+ if (!hideManagement())
+ mgmtObject->set_lastError (text);
+ }
}
-
- if (closing)
+ // Call destroy outside of the lock, don't want to be deleted with lock held.
+ if (isClosing)
destroy();
}
@@ -239,10 +359,8 @@ void Link::destroy ()
{
Mutex::ScopedLock mutex(lock);
- QPID_LOG (info, "Inter-broker link to " << host << ":" << port << " removed by management");
- if (connection)
- connection->close(CLOSE_CODE_CONNECTION_FORCED, "closed by management");
- connection = 0;
+ QPID_LOG (info, "Inter-broker link to " << configuredHost << ":" << configuredPort << " removed by management");
+ closeConnection("closed by management");
setStateLH(STATE_CLOSED);
// Move the bridges to be deleted into a local vector so there is no
@@ -263,7 +381,7 @@ void Link::destroy ()
for (Bridges::iterator i = toDelete.begin(); i != toDelete.end(); i++)
(*i)->destroy();
toDelete.clear();
- links->destroy (host, port);
+ links->destroy (configuredHost, configuredPort);
}
void Link::add(Bridge::shared_ptr bridge)
@@ -311,7 +429,7 @@ void Link::ioThreadProcessing()
// check for bridge session errors and recover
if (!active.empty()) {
Bridges::iterator removed = std::remove_if(
- active.begin(), active.end(), !boost::bind(&Bridge::isSessionReady, _1));
+ active.begin(), active.end(), boost::bind(&Bridge::isDetached, _1));
for (Bridges::iterator i = removed; i != active.end(); ++i) {
Bridge::shared_ptr bridge = *i;
bridge->closed();
@@ -398,14 +516,14 @@ bool Link::hideManagement() const {
uint Link::nextChannel()
{
Mutex::ScopedLock mutex(lock);
-
+ if (channelCounter >= framing::CHANNEL_MAX)
+ channelCounter = 1;
return channelCounter++;
}
void Link::notifyConnectionForced(const string text)
{
Mutex::ScopedLock mutex(lock);
-
setStateLH(STATE_FAILED);
if (!hideManagement())
mgmtObject->set_lastError(text);
@@ -418,7 +536,7 @@ void Link::setPersistenceId(uint64_t id) const
const string& Link::getName() const
{
- return host;
+ return configuredHost;
}
Link::shared_ptr Link::decode(LinkRegistry& links, Buffer& buffer)
@@ -444,9 +562,9 @@ Link::shared_ptr Link::decode(LinkRegistry& links, Buffer& buffer)
void Link::encode(Buffer& buffer) const
{
buffer.putShortString(string("link"));
- buffer.putShortString(host);
- buffer.putShort(port);
- buffer.putShortString(transport);
+ buffer.putShortString(configuredHost);
+ buffer.putShort(configuredPort);
+ buffer.putShortString(configuredTransport);
buffer.putOctet(durable ? 1 : 0);
buffer.putShortString(authMechanism);
buffer.putShortString(username);
@@ -455,10 +573,10 @@ void Link::encode(Buffer& buffer) const
uint32_t Link::encodedSize() const
{
- return host.size() + 1 // short-string (host)
+ return configuredHost.size() + 1 // short-string (host)
+ 5 // short-string ("link")
+ 2 // port
- + transport.size() + 1 // short-string(transport)
+ + configuredTransport.size() + 1 // short-string(transport)
+ 1 // durable
+ authMechanism.size() + 1
+ username.size() + 1
@@ -513,7 +631,7 @@ Manageable::status_t Link::ManagementMethod (uint32_t op, Args& args, string& te
}
std::pair<Bridge::shared_ptr, bool> result =
- links->declare (host, port, iargs.i_durable, iargs.i_src,
+ links->declare (configuredHost, configuredPort, iargs.i_durable, iargs.i_src,
iargs.i_dest, iargs.i_key, iargs.i_srcIsQueue,
iargs.i_srcIsLocal, iargs.i_tag, iargs.i_excludes,
iargs.i_dynamic, iargs.i_sync);
@@ -542,4 +660,63 @@ void Link::setPassive(bool passive)
}
}
+
+/** utility to clean up connection resources correctly */
+void Link::closeConnection( const std::string& reason)
+{
+ if (connection != 0) {
+ // cancel our subscription to the failover exchange
+ SessionHandler& sessionHandler = connection->getChannel(failoverChannel);
+ if (sessionHandler.getSession()) {
+ framing::AMQP_ServerProxy remoteBroker(sessionHandler.out);
+ remoteBroker.getMessage().cancel(failoverExchange->getName());
+ remoteBroker.getSession().detach(failoverSession);
+ }
+ connection->close(CLOSE_CODE_CONNECTION_FORCED, reason);
+ connection = 0;
+ }
+}
+
+/** returns the current remote's address, and connection state */
+bool Link::getRemoteAddress(qpid::Address& addr) const
+{
+ addr.protocol = transport;
+ addr.host = host;
+ addr.port = port;
+
+ return state == STATE_OPERATIONAL;
+}
+
+
+// FieldTable keys for internal state data
+namespace {
+ const std::string FAILOVER_ADDRESSES("failover-addresses");
+ const std::string FAILOVER_INDEX("failover-index");
+}
+
+void Link::getState(framing::FieldTable& state) const
+{
+ state.clear();
+ Mutex::ScopedLock mutex(lock);
+ if (!url.empty()) {
+ state.setString(FAILOVER_ADDRESSES, url.str());
+ state.setInt(FAILOVER_INDEX, reconnectNext);
+ }
+}
+
+void Link::setState(const framing::FieldTable& state)
+{
+ Mutex::ScopedLock mutex(lock);
+ if (state.isSet(FAILOVER_ADDRESSES)) {
+ Url failovers(state.getAsString(FAILOVER_ADDRESSES));
+ setUrl(failovers);
+ }
+ if (state.isSet(FAILOVER_INDEX)) {
+ reconnectNext = state.getAsInt(FAILOVER_INDEX);
+ }
+}
+
+
+const std::string Link::exchangeTypeName("qpid.LinkExchange");
+
}} // namespace qpid::broker
diff --git a/cpp/src/qpid/broker/Link.h b/cpp/src/qpid/broker/Link.h
index 4085c3bfcf..a97fa48664 100644
--- a/cpp/src/qpid/broker/Link.h
+++ b/cpp/src/qpid/broker/Link.h
@@ -24,9 +24,11 @@
#include <boost/shared_ptr.hpp>
#include "qpid/Url.h"
+#include "qpid/broker/BrokerImportExport.h"
#include "qpid/broker/MessageStore.h"
#include "qpid/broker/PersistableConfig.h"
#include "qpid/broker/Bridge.h"
+#include "qpid/broker/BrokerImportExport.h"
#include "qpid/sys/Mutex.h"
#include "qpid/framing/FieldTable.h"
#include "qpid/management/Manageable.h"
@@ -45,15 +47,23 @@ namespace broker {
class LinkRegistry;
class Broker;
class Connection;
+class LinkExchange;
class Link : public PersistableConfig, public management::Manageable {
private:
- sys::Mutex lock;
+ mutable sys::Mutex lock;
LinkRegistry* links;
MessageStore* store;
- std::string host;
- uint16_t port;
- std::string transport;
+
+ // these remain constant across failover - used to identify this link
+ const std::string configuredTransport;
+ const std::string configuredHost;
+ const uint16_t configuredPort;
+ // these reflect the current address of remote - will change during failover
+ std::string host;
+ uint16_t port;
+ std::string transport;
+
bool durable;
std::string authMechanism;
std::string username;
@@ -75,8 +85,10 @@ class Link : public PersistableConfig, public management::Manageable {
uint channelCounter;
Connection* connection;
management::ManagementAgent* agent;
-
boost::intrusive_ptr<sys::TimerTask> timerTask;
+ boost::shared_ptr<broker::LinkExchange> failoverExchange; // subscribed to remote's amq.failover exchange
+ uint failoverChannel;
+ std::string failoverSession;
static const int STATE_WAITING = 1;
static const int STATE_CONNECTING = 2;
@@ -94,6 +106,14 @@ class Link : public PersistableConfig, public management::Manageable {
bool tryFailoverLH(); // Called during maintenance visit
bool hideManagement() const;
+ void established(Connection*); // Called when connection is create
+ void opened(); // Called when connection is open (after create)
+ void closed(int, std::string); // Called when connection goes away
+ void reconnectLH(const Address&); //called by LinkRegistry
+ void closeConnection(const std::string& reason);
+
+ friend class LinkRegistry; // to call established, opened, closed
+
public:
typedef boost::shared_ptr<Link> shared_ptr;
@@ -110,22 +130,25 @@ class Link : public PersistableConfig, public management::Manageable {
management::Manageable* parent = 0);
virtual ~Link();
- std::string getHost() { return host; }
- uint16_t getPort() { return port; }
- std::string getTransport() { return transport; }
+ /** these return the *configured* transport/host/port, which does not change over the
+ lifetime of the Link */
+ std::string getHost() const { return configuredHost; }
+ uint16_t getPort() const { return configuredPort; }
+ std::string getTransport() const { return configuredTransport; }
+
+ /** returns the current address of the remote, which may be different from the
+ configured transport/host/port due to failover. Returns true if connection is
+ active */
+ bool getRemoteAddress(qpid::Address& addr) const;
bool isDurable() { return durable; }
void maintenanceVisit ();
uint nextChannel();
void add(Bridge::shared_ptr);
void cancel(Bridge::shared_ptr);
- void setUrl(const Url&); // Set URL for reconnection.
- void established(Connection*); // Called when connection is create
- void opened(); // Called when connection is open (after create)
- void closed(int, std::string); // Called when connection goes away
- void reconnectLH(const Address&); //called by LinkRegistry
- void close(); // Close the link from within the broker.
+ QPID_BROKER_EXTERN void setUrl(const Url&); // Set URL for reconnection.
+ QPID_BROKER_EXTERN void close(); // Close the link from within the broker.
std::string getAuthMechanism() { return authMechanism; }
std::string getUsername() { return username; }
@@ -148,6 +171,13 @@ class Link : public PersistableConfig, public management::Manageable {
management::ManagementObject* GetManagementObject(void) const;
management::Manageable::status_t ManagementMethod(uint32_t, management::Args&, std::string&);
+ // manage the exchange owned by this link
+ static const std::string exchangeTypeName;
+ static boost::shared_ptr<Exchange> linkExchangeFactory(const std::string& name);
+
+ // replicate internal state of this Link for clustering
+ void getState(framing::FieldTable& state) const;
+ void setState(const framing::FieldTable& state);
};
}
}
diff --git a/cpp/src/qpid/broker/LinkRegistry.cpp b/cpp/src/qpid/broker/LinkRegistry.cpp
index bb602bb953..d89f220d1b 100644
--- a/cpp/src/qpid/broker/LinkRegistry.cpp
+++ b/cpp/src/qpid/broker/LinkRegistry.cpp
@@ -25,7 +25,9 @@
#include <iostream>
#include <boost/format.hpp>
-using namespace qpid::broker;
+namespace qpid {
+namespace broker {
+
using namespace qpid::sys;
using std::string;
using std::pair;
@@ -45,16 +47,15 @@ LinkRegistry::LinkRegistry () :
{
}
-namespace {
-struct ConnectionObserverImpl : public ConnectionObserver {
+class LinkRegistryConnectionObserver : public ConnectionObserver {
LinkRegistry& links;
- ConnectionObserverImpl(LinkRegistry& l) : links(l) {}
+ public:
+ LinkRegistryConnectionObserver(LinkRegistry& l) : links(l) {}
void connection(Connection& c) { links.notifyConnection(c.getMgmtId(), &c); }
void opened(Connection& c) { links.notifyOpened(c.getMgmtId()); }
void closed(Connection& c) { links.notifyClosed(c.getMgmtId()); }
void forced(Connection& c, const string& text) { links.notifyConnectionForced(c.getMgmtId(), text); }
};
-}
LinkRegistry::LinkRegistry (Broker* _broker) :
broker(_broker),
@@ -62,7 +63,7 @@ LinkRegistry::LinkRegistry (Broker* _broker) :
realm(broker->getOptions().realm)
{
broker->getConnectionObservers().add(
- boost::shared_ptr<ConnectionObserver>(new ConnectionObserverImpl(*this)));
+ boost::shared_ptr<ConnectionObserver>(new LinkRegistryConnectionObserver(*this)));
}
LinkRegistry::~LinkRegistry() {}
@@ -298,22 +299,29 @@ std::string LinkRegistry::getUsername(const std::string& key)
return link->getUsername();
}
+/** note: returns the current remote host (may be different from the host originally
+ configured for the Link due to failover) */
std::string LinkRegistry::getHost(const std::string& key)
{
- Link::shared_ptr link = findLink(key);
- if (!link)
- return string();
+ Link::shared_ptr link = findLink(key);
+ if (!link)
+ return string();
- return link->getHost();
+ qpid::Address addr;
+ link->getRemoteAddress(addr);
+ return addr.host;
}
+/** returns the current remote port (ditto above) */
uint16_t LinkRegistry::getPort(const std::string& key)
{
Link::shared_ptr link = findLink(key);
if (!link)
return 0;
- return link->getPort();
+ qpid::Address addr;
+ link->getRemoteAddress(addr);
+ return addr.port;
}
std::string LinkRegistry::getPassword(const std::string& key)
@@ -368,3 +376,4 @@ void LinkRegistry::eachBridge(boost::function<void(boost::shared_ptr<Bridge>)> f
for (BridgeMap::iterator i = bridges.begin(); i != bridges.end(); ++i) f(i->second);
}
+}} // namespace qpid::broker
diff --git a/cpp/src/qpid/broker/LinkRegistry.h b/cpp/src/qpid/broker/LinkRegistry.h
index 753f6bfe9e..8e9d2f4b0d 100644
--- a/cpp/src/qpid/broker/LinkRegistry.h
+++ b/cpp/src/qpid/broker/LinkRegistry.h
@@ -23,6 +23,7 @@
*/
#include <map>
+#include "qpid/broker/BrokerImportExport.h"
#include "qpid/broker/Bridge.h"
#include "qpid/broker/MessageStore.h"
#include "qpid/Address.h"
@@ -56,43 +57,50 @@ namespace broker {
static std::string createKey(const Address& address);
static std::string createKey(const std::string& host, uint16_t port);
+ // Methods called by the connection observer.
+ void notifyConnection (const std::string& key, Connection* c);
+ void notifyOpened (const std::string& key);
+ void notifyClosed (const std::string& key);
+ void notifyConnectionForced (const std::string& key, const std::string& text);
+ friend class LinkRegistryConnectionObserver;
+
public:
- LinkRegistry (); // Only used in store tests
- LinkRegistry (Broker* _broker);
- ~LinkRegistry();
-
- std::pair<boost::shared_ptr<Link>, bool>
- declare(const std::string& host,
- uint16_t port,
- const std::string& transport,
- bool durable,
- const std::string& authMechanism,
- const std::string& username,
- const std::string& password);
-
- std::pair<Bridge::shared_ptr, bool>
- declare(const std::string& host,
- uint16_t port,
- bool durable,
- const std::string& src,
- const std::string& dest,
- const std::string& key,
- bool isQueue,
- bool isLocal,
- const std::string& id,
- const std::string& excludes,
- bool dynamic,
- uint16_t sync,
- Bridge::InitializeCallback=0
- );
-
- void destroy(const std::string& host, const uint16_t port);
-
- void destroy(const std::string& host,
- const uint16_t port,
- const std::string& src,
- const std::string& dest,
- const std::string& key);
+ QPID_BROKER_EXTERN LinkRegistry (); // Only used in store tests
+ QPID_BROKER_EXTERN LinkRegistry (Broker* _broker);
+ QPID_BROKER_EXTERN ~LinkRegistry();
+
+ QPID_BROKER_EXTERN std::pair<boost::shared_ptr<Link>, bool>
+ declare(const std::string& host,
+ uint16_t port,
+ const std::string& transport,
+ bool durable,
+ const std::string& authMechanism,
+ const std::string& username,
+ const std::string& password);
+
+ QPID_BROKER_EXTERN std::pair<Bridge::shared_ptr, bool>
+ declare(const std::string& host,
+ uint16_t port,
+ bool durable,
+ const std::string& src,
+ const std::string& dest,
+ const std::string& key,
+ bool isQueue,
+ bool isLocal,
+ const std::string& id,
+ const std::string& excludes,
+ bool dynamic,
+ uint16_t sync,
+ Bridge::InitializeCallback=0
+ );
+
+ QPID_BROKER_EXTERN void destroy(const std::string& host, const uint16_t port);
+
+ QPID_BROKER_EXTERN void destroy(const std::string& host,
+ const uint16_t port,
+ const std::string& src,
+ const std::string& dest,
+ const std::string& key);
/**
* Register the manageable parent for declared queues
@@ -102,24 +110,20 @@ namespace broker {
/**
* Set the store to use. May only be called once.
*/
- void setStore (MessageStore*);
+ QPID_BROKER_EXTERN void setStore (MessageStore*);
/**
* Return the message store used.
*/
- MessageStore* getStore() const;
+ QPID_BROKER_EXTERN MessageStore* getStore() const;
- void notifyConnection (const std::string& key, Connection* c);
- void notifyOpened (const std::string& key);
- void notifyClosed (const std::string& key);
- void notifyConnectionForced (const std::string& key, const std::string& text);
- std::string getAuthMechanism (const std::string& key);
- std::string getAuthCredentials (const std::string& key);
- std::string getAuthIdentity (const std::string& key);
- std::string getUsername (const std::string& key);
- std::string getPassword (const std::string& key);
- std::string getHost (const std::string& key);
- uint16_t getPort (const std::string& key);
+ QPID_BROKER_EXTERN std::string getAuthMechanism (const std::string& key);
+ QPID_BROKER_EXTERN std::string getAuthCredentials (const std::string& key);
+ QPID_BROKER_EXTERN std::string getAuthIdentity (const std::string& key);
+ QPID_BROKER_EXTERN std::string getUsername (const std::string& key);
+ QPID_BROKER_EXTERN std::string getPassword (const std::string& key);
+ QPID_BROKER_EXTERN std::string getHost (const std::string& key);
+ QPID_BROKER_EXTERN uint16_t getPort (const std::string& key);
/**
* Called by links failing over to new address
@@ -132,13 +136,13 @@ namespace broker {
* updated but links won't actually establish connections and
* bridges won't therefore pull or push any messages.
*/
- void setPassive(bool);
- bool isPassive() { return passive; }
+ QPID_BROKER_EXTERN void setPassive(bool);
+ QPID_BROKER_EXTERN bool isPassive() { return passive; }
/** Iterate over each link in the registry. Used for cluster updates. */
- void eachLink(boost::function<void(boost::shared_ptr<Link>)> f);
+ QPID_BROKER_EXTERN void eachLink(boost::function<void(boost::shared_ptr<Link>)> f);
/** Iterate over each bridge in the registry. Used for cluster updates. */
- void eachBridge(boost::function<void(boost::shared_ptr< Bridge>)> f);
+ QPID_BROKER_EXTERN void eachBridge(boost::function<void(boost::shared_ptr< Bridge>)> f);
};
}
}
diff --git a/cpp/src/qpid/broker/Message.cpp b/cpp/src/qpid/broker/Message.cpp
index ae4503328a..40dfba39f4 100644
--- a/cpp/src/qpid/broker/Message.cpp
+++ b/cpp/src/qpid/broker/Message.cpp
@@ -131,6 +131,7 @@ uint32_t Message::getRequiredCredit()
void Message::encode(framing::Buffer& buffer) const
{
+ sys::Mutex::ScopedLock l(lock);
//encode method and header frames
EncodeFrame f1(buffer);
frames.map_if(f1, TypeFilter2<METHOD_BODY, HEADER_BODY>());
@@ -142,6 +143,7 @@ void Message::encode(framing::Buffer& buffer) const
void Message::encodeContent(framing::Buffer& buffer) const
{
+ sys::Mutex::ScopedLock l(lock);
//encode the payload of each content frame
EncodeBody f2(buffer);
frames.map_if(f2, TypeFilter<CONTENT_BODY>());
@@ -154,11 +156,13 @@ uint32_t Message::encodedSize() const
uint32_t Message::encodedContentSize() const
{
+ sys::Mutex::ScopedLock l(lock);
return frames.getContentSize();
}
uint32_t Message::encodedHeaderSize() const
{
+ sys::Mutex::ScopedLock l(lock); // prevent modifications while computing size
//add up the size for all method and header frames in the frameset
SumFrameSize sum;
frames.map_if(sum, TypeFilter2<METHOD_BODY, HEADER_BODY>());
@@ -218,8 +222,9 @@ void Message::releaseContent()
store->stage(pmsg);
staged = true;
}
- //ensure required credit is cached before content frames are released
+ //ensure required credit and size is cached before content frames are released
getRequiredCredit();
+ contentSize();
//remove any content frames from the frameset
frames.remove(TypeFilter<CONTENT_BODY>());
setContentReleased();
@@ -354,6 +359,7 @@ public:
AMQHeaderBody* Message::getHeaderBody()
{
+ // expects lock to be held
if (copyHeaderOnWrite) {
CloneHeaderBody f;
frames.map_if(f, TypeFilter<HEADER_BODY>());
diff --git a/cpp/src/qpid/broker/MessageDeque.cpp b/cpp/src/qpid/broker/MessageDeque.cpp
index 709d99876b..f70c996975 100644
--- a/cpp/src/qpid/broker/MessageDeque.cpp
+++ b/cpp/src/qpid/broker/MessageDeque.cpp
@@ -21,6 +21,7 @@
#include "qpid/broker/MessageDeque.h"
#include "qpid/broker/QueuedMessage.h"
#include "qpid/log/Statement.h"
+#include "assert.h"
namespace qpid {
namespace broker {
@@ -39,7 +40,7 @@ size_t MessageDeque::index(const framing::SequenceNumber& position)
bool MessageDeque::deleted(const QueuedMessage& m)
{
size_t i = index(m.position);
- if (i < messages.size()) {
+ if (i < messages.size() && messages[i].status != QueuedMessage::DELETED) {
messages[i].status = QueuedMessage::DELETED;
clean();
return true;
@@ -53,7 +54,7 @@ size_t MessageDeque::size()
return available;
}
-void MessageDeque::release(const QueuedMessage& message)
+QueuedMessage* MessageDeque::releasePtr(const QueuedMessage& message)
{
size_t i = index(message.position);
if (i < messages.size()) {
@@ -62,12 +63,17 @@ void MessageDeque::release(const QueuedMessage& message)
if (head > i) head = i;
m.status = QueuedMessage::AVAILABLE;
++available;
+ return &messages[i];
}
} else {
+ assert(0);
QPID_LOG(error, "Failed to release message at " << message.position << " " << message.payload->getFrames().getContent() << "; no such message (index=" << i << ", size=" << messages.size() << ")");
}
+ return 0;
}
+void MessageDeque::release(const QueuedMessage& message) { releasePtr(message); }
+
bool MessageDeque::acquire(const framing::SequenceNumber& position, QueuedMessage& message)
{
if (position < messages.front().position) return false;
@@ -129,8 +135,7 @@ QueuedMessage padding(uint32_t pos) {
}
} // namespace
-bool MessageDeque::push(const QueuedMessage& added, QueuedMessage& /*not needed*/)
-{
+QueuedMessage* MessageDeque::pushPtr(const QueuedMessage& added) {
//add padding to prevent gaps in sequence, which break the index
//calculation (needed for queue replication)
while (messages.size() && (added.position - messages.back().position) > 1)
@@ -139,7 +144,12 @@ bool MessageDeque::push(const QueuedMessage& added, QueuedMessage& /*not needed*
messages.back().status = QueuedMessage::AVAILABLE;
if (head >= messages.size()) head = messages.size() - 1;
++available;
- return false;//adding a message never causes one to be removed for deque
+ return &messages.back();
+}
+
+bool MessageDeque::push(const QueuedMessage& added, QueuedMessage& /*not needed*/) {
+ pushPtr(added);
+ return false; // adding a message never causes one to be removed for deque
}
void MessageDeque::updateAcquired(const QueuedMessage& acquired)
diff --git a/cpp/src/qpid/broker/MessageDeque.h b/cpp/src/qpid/broker/MessageDeque.h
index bb5943b09b..9b53716d4e 100644
--- a/cpp/src/qpid/broker/MessageDeque.h
+++ b/cpp/src/qpid/broker/MessageDeque.h
@@ -48,6 +48,12 @@ class MessageDeque : public Messages
void foreach(Functor);
void removeIf(Predicate);
+ // For use by other Messages implementations that use MessageDeque as a FIFO index
+ // and keep pointers to its elements in their own indexing strctures.
+ void clean();
+ QueuedMessage* releasePtr(const QueuedMessage&);
+ QueuedMessage* pushPtr(const QueuedMessage& added);
+
private:
typedef std::deque<QueuedMessage> Deque;
Deque messages;
@@ -55,7 +61,6 @@ class MessageDeque : public Messages
size_t head;
size_t index(const framing::SequenceNumber&);
- void clean();
};
}} // namespace qpid::broker
diff --git a/cpp/src/qpid/broker/MessageGroupManager.cpp b/cpp/src/qpid/broker/MessageGroupManager.cpp
index 5f450cd556..15cd56a676 100644
--- a/cpp/src/qpid/broker/MessageGroupManager.cpp
+++ b/cpp/src/qpid/broker/MessageGroupManager.cpp
@@ -19,11 +19,13 @@
*
*/
+#include "qpid/broker/MessageGroupManager.h"
+
+#include "qpid/broker/Queue.h"
#include "qpid/framing/FieldTable.h"
-#include "qpid/types/Variant.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/log/Statement.h"
-#include "qpid/broker/Queue.h"
-#include "qpid/broker/MessageGroupManager.h"
+#include "qpid/types/Variant.h"
using namespace qpid::broker;
@@ -43,9 +45,18 @@ const std::string MessageGroupManager::qpidSharedGroup("qpid.shared_msg_group");
const std::string MessageGroupManager::qpidMessageGroupTimestamp("qpid.group_timestamp");
+/** return an iterator to the message at position, or members.end() if not found */
+MessageGroupManager::GroupState::MessageFifo::iterator
+MessageGroupManager::GroupState::findMsg(const qpid::framing::SequenceNumber &position)
+{
+ MessageState mState(position);
+ MessageFifo::iterator found = std::lower_bound(members.begin(), members.end(), mState);
+ return (found->position == position) ? found : members.end();
+}
+
void MessageGroupManager::unFree( const GroupState& state )
{
- GroupFifo::iterator pos = freeGroups.find( state.members.front() );
+ GroupFifo::iterator pos = freeGroups.find( state.members.front().position );
assert( pos != freeGroups.end() && pos->second == &state );
freeGroups.erase( pos );
}
@@ -60,8 +71,8 @@ void MessageGroupManager::disown( GroupState& state )
{
state.owner.clear();
assert(state.members.size());
- assert(freeGroups.find(state.members.front()) == freeGroups.end());
- freeGroups[state.members.front()] = &state;
+ assert(freeGroups.find(state.members.front().position) == freeGroups.end());
+ freeGroups[state.members.front().position] = &state;
}
MessageGroupManager::GroupState& MessageGroupManager::findGroup( const QueuedMessage& qm )
@@ -106,7 +117,8 @@ void MessageGroupManager::enqueued( const QueuedMessage& qm )
// @todo KAG optimization - store reference to group state in QueuedMessage
// issue: const-ness??
GroupState& state = findGroup(qm);
- state.members.push_back(qm.position);
+ GroupState::MessageState mState(qm.position);
+ state.members.push_back(mState);
uint32_t total = state.members.size();
QPID_LOG( trace, "group queue " << qName <<
": added message to group id=" << state.group << " total=" << total );
@@ -123,7 +135,9 @@ void MessageGroupManager::acquired( const QueuedMessage& qm )
// @todo KAG avoid lookup: retrieve direct reference to group state from QueuedMessage
// issue: const-ness??
GroupState& state = findGroup(qm);
- assert(state.members.size()); // there are msgs present
+ GroupState::MessageFifo::iterator m = state.findMsg(qm.position);
+ assert(m != state.members.end());
+ m->acquired = true;
state.acquired += 1;
QPID_LOG( trace, "group queue " << qName <<
": acquired message in group id=" << state.group << " acquired=" << state.acquired );
@@ -137,6 +151,9 @@ void MessageGroupManager::requeued( const QueuedMessage& qm )
GroupState& state = findGroup(qm);
assert( state.acquired != 0 );
state.acquired -= 1;
+ GroupState::MessageFifo::iterator m = state.findMsg(qm.position);
+ assert(m != state.members.end());
+ m->acquired = false;
if (state.acquired == 0 && state.owned()) {
QPID_LOG( trace, "group queue " << qName <<
": consumer name=" << state.owner << " released group id=" << state.group);
@@ -152,13 +169,17 @@ void MessageGroupManager::dequeued( const QueuedMessage& qm )
// @todo KAG avoid lookup: retrieve direct reference to group state from QueuedMessage
// issue: const-ness??
GroupState& state = findGroup(qm);
- assert( state.members.size() != 0 );
- assert( state.acquired != 0 );
- state.acquired -= 1;
+ GroupState::MessageFifo::iterator m = state.findMsg(qm.position);
+ assert(m != state.members.end());
+ if (m->acquired) {
+ assert( state.acquired != 0 );
+ state.acquired -= 1;
+ }
- // likely to be at or near begin() if dequeued in order
+ // special case if qm is first (oldest) message in the group:
+ // may need to re-insert it back on the freeGroups list, as the index will change
bool reFreeNeeded = false;
- if (state.members.front() == qm.position) {
+ if (m == state.members.begin()) {
if (!state.owned()) {
// will be on the freeGroups list if mgmt is dequeueing rather than a consumer!
// if on freelist, it is indexed by first member, which is about to be removed!
@@ -167,15 +188,7 @@ void MessageGroupManager::dequeued( const QueuedMessage& qm )
}
state.members.pop_front();
} else {
- GroupState::PositionFifo::iterator pos = state.members.begin() + 1;
- GroupState::PositionFifo::iterator end = state.members.end();
- while (pos != end) {
- if (*pos == qm.position) {
- state.members.erase(pos);
- break;
- }
- ++pos;
- }
+ state.members.erase(m);
}
uint32_t total = state.members.size();
@@ -220,11 +233,11 @@ bool MessageGroupManager::nextConsumableMessage( Consumer::shared_ptr& c, Queued
GroupState& group = findGroup(next);
if (!group.owned()) {
//TODO: make acquire more efficient when we already have the message in question
- if (group.members.front() == next.position && messages.acquire(next.position, next)) { // only take from head!
+ if (group.members.front().position == next.position && messages.acquire(next.position, next)) { // only take from head!
return true;
}
QPID_LOG(debug, "Skipping " << next.position << " since group " << group.group
- << "'s head message still pending. pos=" << group.members.front());
+ << "'s head message still pending. pos=" << group.members.front().position);
} else if (group.owner == c->getName() && messages.acquire(next.position, next)) {
return true;
}
@@ -284,7 +297,7 @@ void MessageGroupManager::query(qpid::types::Variant::Map& status) const
info[GROUP_TIMESTAMP] = 0;
if (g->second.members.size() != 0) {
QueuedMessage qm;
- if (messages.find(g->second.members.front(), qm) &&
+ if (messages.find(g->second.members.front().position, qm) &&
qm.payload &&
qm.payload->hasProperties<framing::DeliveryProperties>()) {
info[GROUP_TIMESTAMP] = qm.payload->getProperties<framing::DeliveryProperties>()->getTimestamp();
@@ -353,6 +366,7 @@ namespace {
const std::string GROUP_OWNER("owner");
const std::string GROUP_ACQUIRED_CT("acquired-ct");
const std::string GROUP_POSITIONS("positions");
+ const std::string GROUP_ACQUIRED_MSGS("acquired-msgs");
const std::string GROUP_STATE("group-state");
}
@@ -371,10 +385,14 @@ void MessageGroupManager::getState(qpid::framing::FieldTable& state ) const
group.setString(GROUP_OWNER, g->second.owner);
group.setInt(GROUP_ACQUIRED_CT, g->second.acquired);
framing::Array positions(TYPE_CODE_UINT32);
- for (GroupState::PositionFifo::const_iterator p = g->second.members.begin();
- p != g->second.members.end(); ++p)
- positions.push_back(framing::Array::ValuePtr(new IntegerValue( *p )));
+ framing::Array acquiredMsgs(TYPE_CODE_BOOLEAN);
+ for (GroupState::MessageFifo::const_iterator p = g->second.members.begin();
+ p != g->second.members.end(); ++p) {
+ positions.push_back(framing::Array::ValuePtr(new IntegerValue( p->position )));
+ acquiredMsgs.push_back(framing::Array::ValuePtr(new BoolValue( p->acquired )));
+ }
group.setArray(GROUP_POSITIONS, positions);
+ group.setArray(GROUP_ACQUIRED_MSGS, acquiredMsgs);
groupState.push_back(framing::Array::ValuePtr(new FieldTableValue(group)));
}
state.setArray(GROUP_STATE, groupState);
@@ -425,13 +443,25 @@ void MessageGroupManager::setState(const qpid::framing::FieldTable& state)
qName << "\": position encoding error!");
return;
}
+ framing::Array acquiredMsgs(TYPE_CODE_BOOLEAN);
+ ok = group.getArray(GROUP_ACQUIRED_MSGS, acquiredMsgs);
+ if (!ok || positions.count() != acquiredMsgs.count()) {
+ QPID_LOG(error, "Invalid message group state information for queue \"" <<
+ qName << "\": acquired flag encoding error!");
+ return;
+ }
+
+ Array::const_iterator a = acquiredMsgs.begin();
+ for (Array::const_iterator p = positions.begin(); p != positions.end(); ++p) {
+ GroupState::MessageState mState((*p)->getIntegerValue<uint32_t, 4>());
+ mState.acquired = (*a++)->getIntegerValue<bool>();
+ state.members.push_back(mState);
+ }
- for (Array::const_iterator p = positions.begin(); p != positions.end(); ++p)
- state.members.push_back((*p)->getIntegerValue<uint32_t, 4>());
messageGroups[state.group] = state;
if (!state.owned()) {
assert(state.members.size());
- freeGroups[state.members.front()] = &messageGroups[state.group];
+ freeGroups[state.members.front().position] = &messageGroups[state.group];
}
}
diff --git a/cpp/src/qpid/broker/MessageGroupManager.h b/cpp/src/qpid/broker/MessageGroupManager.h
index f4bffc4760..2dd97ea2ff 100644
--- a/cpp/src/qpid/broker/MessageGroupManager.h
+++ b/cpp/src/qpid/broker/MessageGroupManager.h
@@ -28,11 +28,14 @@
#include "qpid/broker/MessageDistributor.h"
#include "qpid/sys/unordered_map.h"
+#include <deque>
+
namespace qpid {
namespace broker {
class QueueObserver;
class MessageDistributor;
+class Messages;
class MessageGroupManager : public StatefulQueueObserver, public MessageDistributor
{
@@ -45,19 +48,29 @@ class MessageGroupManager : public StatefulQueueObserver, public MessageDistribu
struct GroupState {
// note: update getState()/setState() when changing this object's state implementation
- typedef std::deque<framing::SequenceNumber> PositionFifo;
+
+ // track which messages are in this group, and if they have been acquired
+ struct MessageState {
+ qpid::framing::SequenceNumber position;
+ bool acquired;
+ MessageState() : acquired(false) {}
+ MessageState(const qpid::framing::SequenceNumber& p) : position(p), acquired(false) {}
+ bool operator<(const MessageState& b) const { return position < b.position; }
+ };
+ typedef std::deque<MessageState> MessageFifo;
std::string group; // group identifier
std::string owner; // consumer with outstanding acquired messages
uint32_t acquired; // count of outstanding acquired messages
- PositionFifo members; // msgs belonging to this group
+ MessageFifo members; // msgs belonging to this group, in enqueue order
GroupState() : acquired(0) {}
bool owned() const {return !owner.empty();}
+ MessageFifo::iterator findMsg(const qpid::framing::SequenceNumber &);
};
typedef sys::unordered_map<std::string, struct GroupState> GroupMap;
- typedef std::map<framing::SequenceNumber, struct GroupState *> GroupFifo;
+ typedef std::map<qpid::framing::SequenceNumber, struct GroupState *> GroupFifo;
GroupMap messageGroups; // index: group name
GroupFifo freeGroups; // ordered by oldest free msg
diff --git a/cpp/src/qpid/broker/MessageMap.cpp b/cpp/src/qpid/broker/MessageMap.cpp
index 048df45434..9b164d4e5c 100644
--- a/cpp/src/qpid/broker/MessageMap.cpp
+++ b/cpp/src/qpid/broker/MessageMap.cpp
@@ -20,6 +20,7 @@
*/
#include "qpid/broker/MessageMap.h"
#include "qpid/broker/QueuedMessage.h"
+#include "qpid/log/Statement.h"
namespace qpid {
namespace broker {
@@ -27,7 +28,16 @@ namespace {
const std::string EMPTY;
}
-bool MessageMap::deleted(const QueuedMessage&) { return true; }
+bool MessageMap::deleted(const QueuedMessage& message)
+{
+ Ordering::iterator i = messages.find(message.position);
+ if (i != messages.end()) {
+ erase(i);
+ return true;
+ } else {
+ return false;
+ }
+}
std::string MessageMap::getKey(const QueuedMessage& message)
{
@@ -38,30 +48,32 @@ std::string MessageMap::getKey(const QueuedMessage& message)
size_t MessageMap::size()
{
- return messages.size();
+ size_t count(0);
+ for (Ordering::iterator i = messages.begin(); i != messages.end(); ++i) {
+ if (i->second.status == QueuedMessage::AVAILABLE) ++count;
+ }
+ return count;
}
bool MessageMap::empty()
{
- return messages.empty();
+ return size() == 0;//TODO: more efficient implementation
}
void MessageMap::release(const QueuedMessage& message)
{
- std::string key = getKey(message);
- Index::iterator i = index.find(key);
- if (i == index.end()) {
- index[key] = message;
- messages[message.position] = message;
- } //else message has already been replaced
+ Ordering::iterator i = messages.find(message.position);
+ if (i != messages.end() && i->second.status == QueuedMessage::ACQUIRED) {
+ i->second.status = QueuedMessage::AVAILABLE;
+ }
}
bool MessageMap::acquire(const framing::SequenceNumber& position, QueuedMessage& message)
{
Ordering::iterator i = messages.find(position);
- if (i != messages.end()) {
+ if (i != messages.end() && i->second.status == QueuedMessage::AVAILABLE) {
+ i->second.status = QueuedMessage::ACQUIRED;
message = i->second;
- erase(i);
return true;
} else {
return false;
@@ -71,7 +83,7 @@ bool MessageMap::acquire(const framing::SequenceNumber& position, QueuedMessage&
bool MessageMap::find(const framing::SequenceNumber& position, QueuedMessage& message)
{
Ordering::iterator i = messages.find(position);
- if (i != messages.end()) {
+ if (i != messages.end() && i->second.status == QueuedMessage::AVAILABLE) {
message = i->second;
return true;
} else {
@@ -79,10 +91,10 @@ bool MessageMap::find(const framing::SequenceNumber& position, QueuedMessage& me
}
}
-bool MessageMap::browse(const framing::SequenceNumber& position, QueuedMessage& message, bool)
+bool MessageMap::browse(const framing::SequenceNumber& position, QueuedMessage& message, bool unacquired)
{
Ordering::iterator i = messages.lower_bound(position+1);
- if (i != messages.end()) {
+ if (i != messages.end() && (i->second.status == QueuedMessage::AVAILABLE || (!unacquired && i->second.status == QueuedMessage::ACQUIRED))) {
message = i->second;
return true;
} else {
@@ -92,14 +104,14 @@ bool MessageMap::browse(const framing::SequenceNumber& position, QueuedMessage&
bool MessageMap::consume(QueuedMessage& message)
{
- Ordering::iterator i = messages.begin();
- if (i != messages.end()) {
- message = i->second;
- erase(i);
- return true;
- } else {
- return false;
+ for (Ordering::iterator i = messages.begin(); i != messages.end(); ++i) {
+ if (i->second.status == QueuedMessage::AVAILABLE) {
+ i->second.status = QueuedMessage::ACQUIRED;
+ message = i->second;
+ return true;
+ }
}
+ return false;
}
const QueuedMessage& MessageMap::replace(const QueuedMessage& original, const QueuedMessage& update)
@@ -115,12 +127,17 @@ bool MessageMap::push(const QueuedMessage& added, QueuedMessage& removed)
if (result.second) {
//there was no previous message for this key; nothing needs to
//be removed, just add the message into its correct position
- messages[added.position] = added;
+ QueuedMessage& a = messages[added.position];
+ a = added;
+ a.status = QueuedMessage::AVAILABLE;
+ QPID_LOG(debug, "Added message at " << a.position);
return false;
} else {
//there is already a message with that key which needs to be replaced
removed = result.first->second;
result.first->second = replace(result.first->second, added);
+ result.first->second.status = QueuedMessage::AVAILABLE;
+ QPID_LOG(debug, "Displaced message at " << removed.position << " with " << result.first->second.position << ": " << result.first->first);
return true;
}
}
@@ -128,15 +145,24 @@ bool MessageMap::push(const QueuedMessage& added, QueuedMessage& removed)
void MessageMap::foreach(Functor f)
{
for (Ordering::iterator i = messages.begin(); i != messages.end(); ++i) {
- f(i->second);
+ if (i->second.status == QueuedMessage::AVAILABLE) f(i->second);
}
}
void MessageMap::removeIf(Predicate p)
{
- for (Ordering::iterator i = messages.begin(); i != messages.end(); i++) {
- if (p(i->second)) {
- erase(i);
+ for (Ordering::iterator i = messages.begin(); i != messages.end();) {
+ if (i->second.status == QueuedMessage::AVAILABLE && p(i->second)) {
+ index.erase(getKey(i->second));
+ //Note: Removing from messages means that the subsequent
+ //call to deleted() for the same message will return
+ //false. At present that is not a problem. If this were
+ //changed to hold onto the message until dequeued
+ //(e.g. with REMOVED state), then the erase() below would
+ //need to take that into account.
+ messages.erase(i++);
+ } else {
+ ++i;
}
}
}
diff --git a/cpp/src/qpid/broker/MessageMap.h b/cpp/src/qpid/broker/MessageMap.h
index d1b8217f9b..a668450250 100644
--- a/cpp/src/qpid/broker/MessageMap.h
+++ b/cpp/src/qpid/broker/MessageMap.h
@@ -43,7 +43,7 @@ class MessageMap : public Messages
size_t size();
bool empty();
- bool deleted(const QueuedMessage&);
+ virtual bool deleted(const QueuedMessage&);
void release(const QueuedMessage&);
virtual bool acquire(const framing::SequenceNumber&, QueuedMessage&);
bool find(const framing::SequenceNumber&, QueuedMessage&);
diff --git a/cpp/src/qpid/broker/PriorityQueue.cpp b/cpp/src/qpid/broker/PriorityQueue.cpp
index d807ef22b1..ab5ec7235a 100644
--- a/cpp/src/qpid/broker/PriorityQueue.cpp
+++ b/cpp/src/qpid/broker/PriorityQueue.cpp
@@ -3,13 +3,13 @@
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
+ * regarding copyright ownersip. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -22,96 +22,87 @@
#include "qpid/broker/Queue.h"
#include "qpid/broker/QueuedMessage.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/log/Statement.h"
#include <cmath>
namespace qpid {
namespace broker {
-PriorityQueue::PriorityQueue(int l) :
+PriorityQueue::PriorityQueue(int l) :
levels(l),
messages(levels, Deque()),
frontLevel(0), haveFront(false), cached(false) {}
-bool PriorityQueue::deleted(const QueuedMessage&) { return true; }
+bool PriorityQueue::deleted(const QueuedMessage& qm) {
+ bool deleted = fifo.deleted(qm);
+ if (deleted) erase(qm);
+ return deleted;
+}
size_t PriorityQueue::size()
{
- size_t total(0);
- for (int i = 0; i < levels; ++i) {
- total += messages[i].size();
- }
- return total;
+ return fifo.size();
+}
+
+namespace {
+bool before(QueuedMessage* a, QueuedMessage* b) { return *a < *b; }
}
void PriorityQueue::release(const QueuedMessage& message)
{
- uint p = getPriorityLevel(message);
- messages[p].insert(lower_bound(messages[p].begin(), messages[p].end(), message), message);
- clearCache();
+ QueuedMessage* qm = fifo.releasePtr(message);
+ if (qm) {
+ uint p = getPriorityLevel(message);
+ messages[p].insert(
+ lower_bound(messages[p].begin(), messages[p].end(), qm, before), qm);
+ clearCache();
+ }
}
-bool PriorityQueue::find(const framing::SequenceNumber& position, QueuedMessage& message, bool remove)
-{
- QueuedMessage comp;
- comp.position = position;
- for (int i = 0; i < levels; ++i) {
- if (!messages[i].empty()) {
- unsigned long diff = position.getValue() - messages[i].front().position.getValue();
- long maxEnd = diff < messages[i].size() ? diff : messages[i].size();
- Deque::iterator l = lower_bound(messages[i].begin(),messages[i].begin()+maxEnd,comp);
- if (l != messages[i].end() && l->position == position) {
- message = *l;
- if (remove) {
- messages[i].erase(l);
- clearCache();
- }
- return true;
- }
+
+void PriorityQueue::erase(const QueuedMessage& qm) {
+ size_t i = getPriorityLevel(qm);
+ if (!messages[i].empty()) {
+ long diff = qm.position.getValue() - messages[i].front()->position.getValue();
+ if (diff < 0) return;
+ long maxEnd = std::min(size_t(diff), messages[i].size());
+ QueuedMessage mutableQm = qm; // need non-const qm for lower_bound
+ Deque::iterator l =
+ lower_bound(messages[i].begin(),messages[i].begin()+maxEnd, &mutableQm, before);
+ if (l != messages[i].end() && (*l)->position == qm.position) {
+ messages[i].erase(l);
+ clearCache();
+ return;
}
}
- return false;
}
bool PriorityQueue::acquire(const framing::SequenceNumber& position, QueuedMessage& message)
{
- return find(position, message, true);
+ bool acquired = fifo.acquire(position, message);
+ if (acquired) erase(message); // No longer available
+ return acquired;
}
bool PriorityQueue::find(const framing::SequenceNumber& position, QueuedMessage& message)
{
- return find(position, message, false);
+ return fifo.find(position, message);
}
-bool PriorityQueue::browse(const framing::SequenceNumber& position, QueuedMessage& message, bool)
+bool PriorityQueue::browse(
+ const framing::SequenceNumber& position, QueuedMessage& message, bool unacquired)
{
- QueuedMessage match;
- match.position = position+1;
- Deque::iterator lowest;
- bool found = false;
- for (int i = 0; i < levels; ++i) {
- Deque::iterator m = lower_bound(messages[i].begin(), messages[i].end(), match);
- if (m != messages[i].end()) {
- if (m->position == match.position) {
- message = *m;
- return true;
- } else if (!found || m->position < lowest->position) {
- lowest = m;
- found = true;
- }
- }
- }
- if (found) {
- message = *lowest;
- }
- return found;
+ return fifo.browse(position, message, unacquired);
}
bool PriorityQueue::consume(QueuedMessage& message)
{
if (checkFront()) {
- message = messages[frontLevel].front();
+ QueuedMessage* pm = messages[frontLevel].front();
messages[frontLevel].pop_front();
clearCache();
+ pm->status = QueuedMessage::ACQUIRED; // Updates FIFO index
+ message = *pm;
return true;
} else {
return false;
@@ -120,23 +111,27 @@ bool PriorityQueue::consume(QueuedMessage& message)
bool PriorityQueue::push(const QueuedMessage& added, QueuedMessage& /*not needed*/)
{
- messages[getPriorityLevel(added)].push_back(added);
+ QueuedMessage* qmp = fifo.pushPtr(added);
+ messages[getPriorityLevel(added)].push_back(qmp);
clearCache();
- return false;//adding a message never causes one to be removed for deque
+ return false; // Adding a message never causes one to be removed for deque
+}
+
+void PriorityQueue::updateAcquired(const QueuedMessage& acquired) {
+ fifo.updateAcquired(acquired);
}
void PriorityQueue::foreach(Functor f)
{
- for (int i = 0; i < levels; ++i) {
- std::for_each(messages[i].begin(), messages[i].end(), f);
- }
+ fifo.foreach(f);
}
void PriorityQueue::removeIf(Predicate p)
{
for (int priority = 0; priority < levels; ++priority) {
for (Deque::iterator i = messages[priority].begin(); i != messages[priority].end();) {
- if (p(*i)) {
+ if (p(**i)) {
+ (*i)->status = QueuedMessage::DELETED; // Updates fifo index
i = messages[priority].erase(i);
clearCache();
} else {
@@ -144,6 +139,7 @@ void PriorityQueue::removeIf(Predicate p)
}
}
}
+ fifo.clean();
}
uint PriorityQueue::getPriorityLevel(const QueuedMessage& m) const
diff --git a/cpp/src/qpid/broker/PriorityQueue.h b/cpp/src/qpid/broker/PriorityQueue.h
index 67c31468d2..8628745db1 100644
--- a/cpp/src/qpid/broker/PriorityQueue.h
+++ b/cpp/src/qpid/broker/PriorityQueue.h
@@ -10,9 +10,9 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -21,7 +21,7 @@
* under the License.
*
*/
-#include "qpid/broker/Messages.h"
+#include "qpid/broker/MessageDeque.h"
#include "qpid/sys/IntegerTypes.h"
#include <deque>
#include <vector>
@@ -32,7 +32,10 @@ namespace broker {
/**
* Basic priority queue with a configurable number of recognised
* priority levels. This is implemented as a separate deque per
- * priority level. Browsing is FIFO not priority order.
+ * priority level.
+ *
+ * Browsing is FIFO not priority order. There is a MessageDeque
+ * for fast browsing.
*/
class PriorityQueue : public Messages
{
@@ -48,23 +51,31 @@ class PriorityQueue : public Messages
bool browse(const framing::SequenceNumber&, QueuedMessage&, bool);
bool consume(QueuedMessage&);
bool push(const QueuedMessage& added, QueuedMessage& removed);
-
+ void updateAcquired(const QueuedMessage& acquired);
void foreach(Functor);
void removeIf(Predicate);
+
static uint getPriority(const QueuedMessage&);
+
protected:
- typedef std::deque<QueuedMessage> Deque;
+ typedef std::deque<QueuedMessage*> Deque;
typedef std::vector<Deque> PriorityLevels;
virtual bool findFrontLevel(uint& p, PriorityLevels&);
const int levels;
+
private:
+ /** Available messages separated by priority and sorted in priority order.
+ * Holds pointers to the QueuedMessages in fifo
+ */
PriorityLevels messages;
+ /** FIFO index of all messsagse (including acquired messages) for fast browsing and indexing */
+ MessageDeque fifo;
uint frontLevel;
bool haveFront;
bool cached;
-
- bool find(const framing::SequenceNumber&, QueuedMessage&, bool remove);
+
+ void erase(const QueuedMessage&);
uint getPriorityLevel(const QueuedMessage&) const;
void clearCache();
bool checkFront();
diff --git a/cpp/src/qpid/broker/Queue.cpp b/cpp/src/qpid/broker/Queue.cpp
index 015957927f..e7305c021d 100644
--- a/cpp/src/qpid/broker/Queue.cpp
+++ b/cpp/src/qpid/broker/Queue.cpp
@@ -19,8 +19,9 @@
*
*/
-#include "qpid/broker/Broker.h"
#include "qpid/broker/Queue.h"
+
+#include "qpid/broker/Broker.h"
#include "qpid/broker/QueueEvents.h"
#include "qpid/broker/Exchange.h"
#include "qpid/broker/Fairshare.h"
@@ -41,6 +42,7 @@
#include "qpid/management/ManagementAgent.h"
#include "qpid/framing/reply_exceptions.h"
#include "qpid/framing/FieldTable.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/sys/ClusterSafe.h"
#include "qpid/sys/Monitor.h"
#include "qpid/sys/Time.h"
@@ -56,7 +58,9 @@
#include <boost/intrusive_ptr.hpp>
-using namespace qpid::broker;
+namespace qpid {
+namespace broker {
+
using namespace qpid::sys;
using namespace qpid::framing;
using qpid::management::ManagementAgent;
@@ -88,8 +92,57 @@ const std::string qpidInsertSequenceNumbers("qpid.insert_sequence_numbers");
const int ENQUEUE_ONLY=1;
const int ENQUEUE_AND_DEQUEUE=2;
+
+inline void mgntEnqStats(const boost::intrusive_ptr<Message>& msg,
+ _qmf::Queue* mgmtObject,
+ _qmf::Broker* brokerMgmtObject)
+{
+ if (mgmtObject != 0) {
+ _qmf::Queue::PerThreadStats *qStats = mgmtObject->getStatistics();
+ _qmf::Broker::PerThreadStats *bStats = brokerMgmtObject->getStatistics();
+
+ uint64_t contentSize = msg->contentSize();
+ qStats->msgTotalEnqueues +=1;
+ bStats->msgTotalEnqueues += 1;
+ qStats->byteTotalEnqueues += contentSize;
+ bStats->byteTotalEnqueues += contentSize;
+ if (msg->isPersistent ()) {
+ qStats->msgPersistEnqueues += 1;
+ bStats->msgPersistEnqueues += 1;
+ qStats->bytePersistEnqueues += contentSize;
+ bStats->bytePersistEnqueues += contentSize;
+ }
+ mgmtObject->statisticsUpdated();
+ brokerMgmtObject->statisticsUpdated();
+ }
+}
+
+inline void mgntDeqStats(const boost::intrusive_ptr<Message>& msg,
+ _qmf::Queue* mgmtObject,
+ _qmf::Broker* brokerMgmtObject)
+{
+ if (mgmtObject != 0){
+ _qmf::Queue::PerThreadStats *qStats = mgmtObject->getStatistics();
+ _qmf::Broker::PerThreadStats *bStats = brokerMgmtObject->getStatistics();
+ uint64_t contentSize = msg->contentSize();
+
+ qStats->msgTotalDequeues += 1;
+ bStats->msgTotalDequeues += 1;
+ qStats->byteTotalDequeues += contentSize;
+ bStats->byteTotalDequeues += contentSize;
+ if (msg->isPersistent ()){
+ qStats->msgPersistDequeues += 1;
+ bStats->msgPersistDequeues += 1;
+ qStats->bytePersistDequeues += contentSize;
+ bStats->bytePersistDequeues += contentSize;
+ }
+ mgmtObject->statisticsUpdated();
+ brokerMgmtObject->statisticsUpdated();
+ }
}
+} // namespace
+
Queue::Queue(const string& _name, bool _autodelete,
MessageStore* const _store,
const OwnershipToken* const _owner,
@@ -101,6 +154,7 @@ Queue::Queue(const string& _name, bool _autodelete,
store(_store),
owner(_owner),
consumerCount(0),
+ browserCount(0),
exclusive(0),
noLocal(false),
persistLastNode(false),
@@ -166,7 +220,7 @@ void Queue::deliver(boost::intrusive_ptr<Message> msg){
if (msg->isImmediate() && getConsumerCount() == 0) {
if (alternateExchange) {
DeliverableMessage deliverable(msg);
- alternateExchange->route(deliverable, msg->getRoutingKey(), msg->getApplicationHeaders());
+ alternateExchange->route(deliverable);
}
} else if (isLocal(msg)) {
//drop message
@@ -183,11 +237,16 @@ void Queue::deliver(boost::intrusive_ptr<Message> msg){
void Queue::recoverPrepared(boost::intrusive_ptr<Message>& msg)
{
+ Mutex::ScopedLock locker(messageLock);
if (policy.get()) policy->recoverEnqueued(msg);
}
-void Queue::recover(boost::intrusive_ptr<Message>& msg){
- if (policy.get()) policy->recoverEnqueued(msg);
+void Queue::recover(boost::intrusive_ptr<Message>& msg)
+{
+ {
+ Mutex::ScopedLock locker(messageLock);
+ if (policy.get()) policy->recoverEnqueued(msg);
+ }
push(msg, true);
if (store){
@@ -209,11 +268,16 @@ void Queue::recover(boost::intrusive_ptr<Message>& msg){
void Queue::process(boost::intrusive_ptr<Message>& msg){
push(msg);
if (mgmtObject != 0){
- mgmtObject->inc_msgTxnEnqueues ();
- mgmtObject->inc_byteTxnEnqueues (msg->contentSize ());
+ _qmf::Queue::PerThreadStats *qStats = mgmtObject->getStatistics();
+ const uint64_t contentSize = msg->contentSize();
+ qStats->msgTxnEnqueues += 1;
+ qStats->byteTxnEnqueues += contentSize;
+ mgmtObject->statisticsUpdated();
if (brokerMgmtObject) {
- brokerMgmtObject->inc_msgTxnEnqueues ();
- brokerMgmtObject->inc_byteTxnEnqueues (msg->contentSize ());
+ _qmf::Broker::PerThreadStats *bStats = brokerMgmtObject->getStatistics();
+ bStats->msgTxnEnqueues += 1;
+ bStats->byteTxnEnqueues += contentSize;
+ brokerMgmtObject->statisticsUpdated();
}
}
}
@@ -222,7 +286,6 @@ void Queue::requeue(const QueuedMessage& msg){
assertClusterSafe();
QueueListeners::NotificationSet copy;
{
- Mutex::ScopedLock locker(messageLock);
if (!isEnqueued(msg)) return;
if (deleted) {
//
@@ -238,10 +301,20 @@ void Queue::requeue(const QueuedMessage& msg){
if (brokerMgmtObject)
brokerMgmtObject->inc_abandoned();
}
- mgntDeqStats(msg.payload);
+ mgntDeqStats(msg.payload, mgmtObject, brokerMgmtObject);
} else {
- messages->release(msg);
- listeners.populate(copy);
+ {
+ Mutex::ScopedLock locker(messageLock);
+ messages->release(msg);
+ observeRequeue(msg, locker);
+ listeners.populate(copy);
+ }
+
+ if (mgmtObject) {
+ mgmtObject->inc_releases();
+ if (brokerMgmtObject)
+ brokerMgmtObject->inc_releases();
+ }
// for persistLastNode - don't force a message twice to disk, but force it if no force before
if(inLastNodeFailure && persistLastNode && !msg.payload->isStoredOnQueue(shared_from_this())) {
@@ -251,7 +324,6 @@ void Queue::requeue(const QueuedMessage& msg){
enqueue(0, payload);
}
}
- observeRequeue(msg, locker);
}
}
copy.notify();
@@ -259,10 +331,9 @@ void Queue::requeue(const QueuedMessage& msg){
bool Queue::acquireMessageAt(const SequenceNumber& position, QueuedMessage& message)
{
- Mutex::ScopedLock locker(messageLock);
assertClusterSafe();
QPID_LOG(debug, "Attempting to acquire message at " << position);
- if (acquire(position, message, locker)) {
+ if (acquire(position, message)) {
QPID_LOG(debug, "Acquired message at " << position << " from " << name);
return true;
} else {
@@ -273,17 +344,20 @@ bool Queue::acquireMessageAt(const SequenceNumber& position, QueuedMessage& mess
bool Queue::acquire(const QueuedMessage& msg, const std::string& consumer)
{
- Mutex::ScopedLock locker(messageLock);
assertClusterSafe();
QPID_LOG(debug, consumer << " attempting to acquire message at " << msg.position);
-
- if (!allocator->allocate( consumer, msg )) {
+ bool ok;
+ {
+ Mutex::ScopedLock locker(messageLock);
+ ok = allocator->allocate( consumer, msg );
+ }
+ if (!ok) {
QPID_LOG(debug, "Not permitted to acquire msg at " << msg.position << " from '" << name);
return false;
}
QueuedMessage copy(msg);
- if (acquire( msg.position, copy, locker)) {
+ if (acquire( msg.position, copy)) {
QPID_LOG(debug, "Acquired message at " << msg.position << " from " << name);
return true;
}
@@ -325,59 +399,73 @@ bool Queue::getNextMessage(QueuedMessage& m, Consumer::shared_ptr& c)
Queue::ConsumeCode Queue::consumeNextMessage(QueuedMessage& m, Consumer::shared_ptr& c)
{
while (true) {
- Mutex::ScopedLock locker(messageLock);
QueuedMessage msg;
- if (allocator->nextConsumableMessage(c, msg)) {
- if (msg.payload->hasExpired()) {
- QPID_LOG(debug, "Message expired from queue '" << name << "'");
- c->setPosition(msg.position);
- dequeue(0, msg);
- if (mgmtObject) {
- mgmtObject->inc_discardsTtl();
- if (brokerMgmtObject)
- brokerMgmtObject->inc_discardsTtl();
- }
+ bool found;
+ {
+ Mutex::ScopedLock locker(messageLock);
+ found = allocator->nextConsumableMessage(c, msg);
+ if (!found) listeners.addListener(c);
+ }
+ if (!found) {
+ QPID_LOG(debug, "No messages to dispatch on queue '" << name << "'");
+ return NO_MESSAGES;
+ }
- continue;
+ if (msg.payload->hasExpired()) {
+ QPID_LOG(debug, "Message expired from queue '" << name << "'");
+ c->setPosition(msg.position);
+ dequeue(0, msg);
+ if (mgmtObject) {
+ mgmtObject->inc_discardsTtl();
+ if (brokerMgmtObject)
+ brokerMgmtObject->inc_discardsTtl();
}
+ continue;
+ }
- if (c->filter(msg.payload)) {
- if (c->accept(msg.payload)) {
+ if (c->filter(msg.payload)) {
+ if (c->accept(msg.payload)) {
+ {
+ Mutex::ScopedLock locker(messageLock);
bool ok = allocator->allocate( c->getName(), msg ); // inform allocator
(void) ok; assert(ok);
observeAcquire(msg, locker);
- m = msg;
- return CONSUMED;
- } else {
- //message(s) are available but consumer hasn't got enough credit
- QPID_LOG(debug, "Consumer can't currently accept message from '" << name << "'");
- messages->release(msg);
- return CANT_CONSUME;
}
+ if (mgmtObject) {
+ mgmtObject->inc_acquires();
+ if (brokerMgmtObject)
+ brokerMgmtObject->inc_acquires();
+ }
+ m = msg;
+ return CONSUMED;
} else {
- //consumer will never want this message
- QPID_LOG(debug, "Consumer doesn't want message from '" << name << "'");
- messages->release(msg);
- return CANT_CONSUME;
+ //message(s) are available but consumer hasn't got enough credit
+ QPID_LOG(debug, "Consumer can't currently accept message from '" << name << "'");
}
} else {
- QPID_LOG(debug, "No messages to dispatch on queue '" << name << "'");
- listeners.addListener(c);
- return NO_MESSAGES;
+ //consumer will never want this message
+ QPID_LOG(debug, "Consumer doesn't want message from '" << name << "'");
}
+
+ Mutex::ScopedLock locker(messageLock);
+ messages->release(msg);
+ return CANT_CONSUME;
}
}
bool Queue::browseNextMessage(QueuedMessage& m, Consumer::shared_ptr& c)
{
while (true) {
- Mutex::ScopedLock locker(messageLock);
QueuedMessage msg;
-
- if (!allocator->nextBrowsableMessage(c, msg)) { // no next available
+ bool found;
+ {
+ Mutex::ScopedLock locker(messageLock);
+ found = allocator->nextBrowsableMessage(c, msg);
+ if (!found) listeners.addListener(c);
+ }
+ if (!found) { // no next available
QPID_LOG(debug, "No browsable messages available for consumer " <<
c->getName() << " on queue '" << name << "'");
- listeners.addListener(c);
return false;
}
@@ -435,60 +523,67 @@ bool Queue::find(SequenceNumber pos, QueuedMessage& msg) const {
void Queue::consume(Consumer::shared_ptr c, bool requestExclusive){
assertClusterSafe();
{
- Mutex::ScopedLock locker(consumerLock);
- if(exclusive) {
- throw ResourceLockedException(
- QPID_MSG("Queue " << getName() << " has an exclusive consumer. No more consumers allowed."));
- } else if(requestExclusive) {
- if(consumerCount) {
+ Mutex::ScopedLock locker(messageLock);
+ // NOTE: consumerCount is actually a count of all
+ // subscriptions, both acquiring and non-acquiring (browsers).
+ // Check for exclusivity of acquiring consumers.
+ size_t acquiringConsumers = consumerCount - browserCount;
+ if (c->preAcquires()) {
+ if(exclusive) {
throw ResourceLockedException(
- QPID_MSG("Queue " << getName() << " already has consumers. Exclusive access denied."));
- } else {
- exclusive = c->getSession();
+ QPID_MSG("Queue " << getName()
+ << " has an exclusive consumer. No more consumers allowed."));
+ } else if(requestExclusive) {
+ if(acquiringConsumers) {
+ throw ResourceLockedException(
+ QPID_MSG("Queue " << getName()
+ << " already has consumers. Exclusive access denied."));
+ } else {
+ exclusive = c->getSession();
+ }
}
}
+ else
+ browserCount++;
consumerCount++;
- if (mgmtObject != 0)
- mgmtObject->inc_consumerCount ();
//reset auto deletion timer if necessary
if (autoDeleteTimeout && autoDeleteTask) {
autoDeleteTask->cancel();
}
+ observeConsumerAdd(*c, locker);
}
- Mutex::ScopedLock locker(messageLock);
- for (Observers::const_iterator i = observers.begin(); i != observers.end(); ++i) {
- try{
- (*i)->consumerAdded(*c);
- } catch (const std::exception& e) {
- QPID_LOG(warning, "Exception on notification of new consumer for queue " << getName() << ": " << e.what());
- }
- }
+ if (mgmtObject != 0)
+ mgmtObject->inc_consumerCount ();
}
void Queue::cancel(Consumer::shared_ptr c){
removeListener(c);
{
- Mutex::ScopedLock locker(consumerLock);
+ Mutex::ScopedLock locker(messageLock);
consumerCount--;
+ if (!c->preAcquires()) browserCount--;
if(exclusive) exclusive = 0;
- if (mgmtObject != 0)
- mgmtObject->dec_consumerCount ();
- }
- Mutex::ScopedLock locker(messageLock);
- for (Observers::const_iterator i = observers.begin(); i != observers.end(); ++i) {
- try{
- (*i)->consumerRemoved(*c);
- } catch (const std::exception& e) {
- QPID_LOG(warning, "Exception on notification of removed consumer for queue " << getName() << ": " << e.what());
- }
+ observeConsumerRemove(*c, locker);
}
+ if (mgmtObject != 0)
+ mgmtObject->dec_consumerCount ();
}
QueuedMessage Queue::get(){
- Mutex::ScopedLock locker(messageLock);
QueuedMessage msg(this);
- if (messages->consume(msg))
- observeAcquire(msg, locker);
+ bool ok;
+ {
+ Mutex::ScopedLock locker(messageLock);
+ ok = messages->consume(msg);
+ if (ok) observeAcquire(msg, locker);
+ }
+
+ if (ok && mgmtObject) {
+ mgmtObject->inc_acquires();
+ if (brokerMgmtObject)
+ brokerMgmtObject->inc_acquires();
+ }
+
return msg;
}
@@ -520,22 +615,26 @@ void Queue::purgeExpired(qpid::sys::Duration lapse)
messages->removeIf(boost::bind(&collect_if_expired, boost::ref(expired), _1));
}
- //
- // Report the count of discarded-by-ttl messages
- //
- if (mgmtObject && !expired.empty()) {
- mgmtObject->inc_discardsTtl(expired.size());
- if (brokerMgmtObject)
- brokerMgmtObject->inc_discardsTtl(expired.size());
- }
+ if (!expired.empty()) {
+ if (mgmtObject) {
+ mgmtObject->inc_acquires(expired.size());
+ mgmtObject->inc_discardsTtl(expired.size());
+ if (brokerMgmtObject) {
+ brokerMgmtObject->inc_acquires(expired.size());
+ brokerMgmtObject->inc_discardsTtl(expired.size());
+ }
+ }
- for (std::deque<QueuedMessage>::const_iterator i = expired.begin();
- i != expired.end(); ++i) {
- {
- Mutex::ScopedLock locker(messageLock);
- observeAcquire(*i, locker);
+ for (std::deque<QueuedMessage>::const_iterator i = expired.begin();
+ i != expired.end(); ++i) {
+ {
+ // KAG: should be safe to retake lock after the removeIf, since
+ // no other thread can touch these messages after the removeIf() call
+ Mutex::ScopedLock locker(messageLock);
+ observeAcquire(*i, locker);
+ }
+ dequeue( 0, *i );
}
- dequeue( 0, *i );
}
}
}
@@ -661,32 +760,46 @@ uint32_t Queue::purge(const uint32_t purge_request, boost::shared_ptr<Exchange>
std::auto_ptr<MessageFilter> mf(MessageFilter::create(filter));
Collector c(*mf.get(), purge_request);
- Mutex::ScopedLock locker(messageLock);
- messages->removeIf( boost::bind<bool>(boost::ref(c), _1) );
+ {
+ Mutex::ScopedLock locker(messageLock);
+ messages->removeIf( boost::bind<bool>(boost::ref(c), _1) );
+ }
- if (mgmtObject && !c.matches.empty()) {
- if (dest.get()) {
- mgmtObject->inc_reroutes(c.matches.size());
- if (brokerMgmtObject)
- brokerMgmtObject->inc_reroutes(c.matches.size());
- } else {
- mgmtObject->inc_discardsPurge(c.matches.size());
- if (brokerMgmtObject)
- brokerMgmtObject->inc_discardsPurge(c.matches.size());
+ if (!c.matches.empty()) {
+ if (mgmtObject) {
+ mgmtObject->inc_acquires(c.matches.size());
+ if (dest.get()) {
+ mgmtObject->inc_reroutes(c.matches.size());
+ if (brokerMgmtObject) {
+ brokerMgmtObject->inc_acquires(c.matches.size());
+ brokerMgmtObject->inc_reroutes(c.matches.size());
+ }
+ } else {
+ mgmtObject->inc_discardsPurge(c.matches.size());
+ if (brokerMgmtObject) {
+ brokerMgmtObject->inc_acquires(c.matches.size());
+ brokerMgmtObject->inc_discardsPurge(c.matches.size());
+ }
+ }
}
- }
- for (std::deque<QueuedMessage>::iterator qmsg = c.matches.begin();
- qmsg != c.matches.end(); ++qmsg) {
- // Update observers and message state:
- observeAcquire(*qmsg, locker);
- dequeue(0, *qmsg);
- QPID_LOG(debug, "Purged message at " << qmsg->position << " from " << getName());
- // now reroute if necessary
- if (dest.get()) {
- assert(qmsg->payload);
- DeliverableMessage dmsg(qmsg->payload);
- dest->routeWithAlternate(dmsg);
+ for (std::deque<QueuedMessage>::iterator qmsg = c.matches.begin();
+ qmsg != c.matches.end(); ++qmsg) {
+
+ {
+ // KAG: should be safe to retake lock after the removeIf, since
+ // no other thread can touch these messages after the removeIf call
+ Mutex::ScopedLock locker(messageLock);
+ observeAcquire(*qmsg, locker);
+ }
+ dequeue(0, *qmsg);
+ QPID_LOG(debug, "Purged message at " << qmsg->position << " from " << getName());
+ // now reroute if necessary
+ if (dest.get()) {
+ assert(qmsg->payload);
+ DeliverableMessage dmsg(qmsg->payload);
+ dest->routeWithAlternate(dmsg);
+ }
}
}
return c.matches.size();
@@ -698,27 +811,51 @@ uint32_t Queue::move(const Queue::shared_ptr destq, uint32_t qty,
std::auto_ptr<MessageFilter> mf(MessageFilter::create(filter));
Collector c(*mf.get(), qty);
- Mutex::ScopedLock locker(messageLock);
- messages->removeIf( boost::bind<bool>(boost::ref(c), _1) );
+ {
+ Mutex::ScopedLock locker(messageLock);
+ messages->removeIf( boost::bind<bool>(boost::ref(c), _1) );
+ }
+
- for (std::deque<QueuedMessage>::iterator qmsg = c.matches.begin();
- qmsg != c.matches.end(); ++qmsg) {
+ if (!c.matches.empty()) {
// Update observers and message state:
- observeAcquire(*qmsg, locker);
- dequeue(0, *qmsg);
- // and move to destination Queue.
- assert(qmsg->payload);
- destq->deliver(qmsg->payload);
+
+ if (mgmtObject) {
+ mgmtObject->inc_acquires(c.matches.size());
+ if (brokerMgmtObject)
+ brokerMgmtObject->inc_acquires(c.matches.size());
+ }
+
+ for (std::deque<QueuedMessage>::iterator qmsg = c.matches.begin();
+ qmsg != c.matches.end(); ++qmsg) {
+ {
+ Mutex::ScopedLock locker(messageLock);
+ observeAcquire(*qmsg, locker);
+ }
+ dequeue(0, *qmsg);
+ // and move to destination Queue.
+ assert(qmsg->payload);
+ destq->deliver(qmsg->payload);
+ }
}
return c.matches.size();
}
/** Acquire the message at the given position, return true and msg if acquire succeeds */
-bool Queue::acquire(const qpid::framing::SequenceNumber& position, QueuedMessage& msg,
- const Mutex::ScopedLock& locker)
+bool Queue::acquire(const qpid::framing::SequenceNumber& position, QueuedMessage& msg)
{
- if (messages->acquire(position, msg)) {
- observeAcquire(msg, locker);
+ bool ok;
+ {
+ Mutex::ScopedLock locker(messageLock);
+ ok = messages->acquire(position, msg);
+ if (ok) observeAcquire(msg, locker);
+ }
+ if (ok) {
+ if (mgmtObject) {
+ mgmtObject->inc_acquires();
+ if (brokerMgmtObject)
+ brokerMgmtObject->inc_acquires();
+ }
++dequeueSincePurge;
return true;
}
@@ -728,35 +865,43 @@ bool Queue::acquire(const qpid::framing::SequenceNumber& position, QueuedMessage
void Queue::push(boost::intrusive_ptr<Message>& msg, bool isRecovery){
assertClusterSafe();
QueueListeners::NotificationSet copy;
- QueuedMessage removed;
+ QueuedMessage removed, qm(this, msg);
bool dequeueRequired = false;
{
Mutex::ScopedLock locker(messageLock);
- QueuedMessage qm(this, msg, ++sequence);
- if (insertSeqNo) msg->insertCustomProperty(seqNoKey, sequence);
-
- dequeueRequired = messages->push(qm, removed);
- if (dequeueRequired) {
+ qm.position = ++sequence;
+ if (messages->push(qm, removed)) {
+ dequeueRequired = true;
observeAcquire(removed, locker);
- if (mgmtObject) {
- mgmtObject->inc_discardsLvq();
- if (brokerMgmtObject)
- brokerMgmtObject->inc_discardsLvq();
- }
}
- listeners.populate(copy);
observeEnqueue(qm, locker);
+ if (policy.get()) {
+ policy->enqueued(qm);
+ }
+ listeners.populate(copy);
}
- copy.notify();
+ if (insertSeqNo) msg->insertCustomProperty(seqNoKey, qm.position);
+
+ mgntEnqStats(msg, mgmtObject, brokerMgmtObject);
+
if (dequeueRequired) {
+ if (mgmtObject) {
+ mgmtObject->inc_acquires();
+ mgmtObject->inc_discardsLvq();
+ if (brokerMgmtObject)
+ brokerMgmtObject->inc_acquires();
+ brokerMgmtObject->inc_discardsLvq();
+ }
if (isRecovery) {
//can't issue new requests for the store until
//recovery is complete
+ Mutex::ScopedLock locker(messageLock);
pendingDequeues.push_back(removed);
} else {
dequeue(0, removed);
}
}
+ copy.notify();
}
void isEnqueueComplete(uint32_t* result, const QueuedMessage& message)
@@ -767,8 +912,8 @@ void isEnqueueComplete(uint32_t* result, const QueuedMessage& message)
/** function only provided for unit tests, or code not in critical message path */
uint32_t Queue::getEnqueueCompleteMessageCount() const
{
- Mutex::ScopedLock locker(messageLock);
uint32_t count = 0;
+ Mutex::ScopedLock locker(messageLock);
messages->foreach(boost::bind(&isEnqueueComplete, &count, _1));
return count;
}
@@ -781,13 +926,13 @@ uint32_t Queue::getMessageCount() const
uint32_t Queue::getConsumerCount() const
{
- Mutex::ScopedLock locker(consumerLock);
+ Mutex::ScopedLock locker(messageLock);
return consumerCount;
}
bool Queue::canAutoDelete() const
{
- Mutex::ScopedLock locker(consumerLock);
+ Mutex::ScopedLock locker(messageLock);
return autodelete && !consumerCount && !owner;
}
@@ -894,14 +1039,20 @@ bool Queue::dequeue(TransactionContext* ctxt, const QueuedMessage& msg)
{
ScopedUse u(barrier);
if (!u.acquired) return false;
-
{
Mutex::ScopedLock locker(messageLock);
if (!isEnqueued(msg)) return false;
if (!ctxt) {
+ if (policy.get()) policy->dequeued(msg);
+ messages->deleted(msg);
observeDequeue(msg, locker);
}
}
+
+ if (!ctxt) {
+ mgntDeqStats(msg.payload, mgmtObject, brokerMgmtObject);
+ }
+
// This check prevents messages which have been forced persistent on one queue from dequeuing
// from another on which no forcing has taken place and thus causing a store error.
bool fp = msg.payload->isForcedPersistent();
@@ -918,14 +1069,24 @@ bool Queue::dequeue(TransactionContext* ctxt, const QueuedMessage& msg)
void Queue::dequeueCommitted(const QueuedMessage& msg)
{
- Mutex::ScopedLock locker(messageLock);
- observeDequeue(msg, locker);
+ {
+ Mutex::ScopedLock locker(messageLock);
+ if (policy.get()) policy->dequeued(msg);
+ messages->deleted(msg);
+ observeDequeue(msg, locker);
+ }
+ mgntDeqStats(msg.payload, mgmtObject, brokerMgmtObject);
if (mgmtObject != 0) {
- mgmtObject->inc_msgTxnDequeues();
- mgmtObject->inc_byteTxnDequeues(msg.payload->contentSize());
+ _qmf::Queue::PerThreadStats *qStats = mgmtObject->getStatistics();
+ const uint64_t contentSize = msg.payload->contentSize();
+ qStats->msgTxnDequeues += 1;
+ qStats->byteTxnDequeues += contentSize;
+ mgmtObject->statisticsUpdated();
if (brokerMgmtObject) {
- brokerMgmtObject->inc_msgTxnDequeues();
- brokerMgmtObject->inc_byteTxnDequeues(msg.payload->contentSize());
+ _qmf::Broker::PerThreadStats *bStats = brokerMgmtObject->getStatistics();
+ bStats->msgTxnDequeues += 1;
+ bStats->byteTxnDequeues += contentSize;
+ brokerMgmtObject->statisticsUpdated();
}
}
}
@@ -934,10 +1095,20 @@ void Queue::dequeueCommitted(const QueuedMessage& msg)
* Removes the first (oldest) message from the in-memory delivery queue as well dequeing
* it from the logical (and persistent if applicable) queue
*/
-bool Queue::popAndDequeue(QueuedMessage& msg, const Mutex::ScopedLock& locker)
+bool Queue::popAndDequeue(QueuedMessage& msg)
{
- if (messages->consume(msg)) {
- observeAcquire(msg, locker);
+ bool popped;
+ {
+ Mutex::ScopedLock locker(messageLock);
+ popped = messages->consume(msg);
+ if (popped) observeAcquire(msg, locker);
+ }
+ if (popped) {
+ if (mgmtObject) {
+ mgmtObject->inc_acquires();
+ if (brokerMgmtObject)
+ brokerMgmtObject->inc_acquires();
+ }
dequeue(0, msg);
return true;
} else {
@@ -947,13 +1118,10 @@ bool Queue::popAndDequeue(QueuedMessage& msg, const Mutex::ScopedLock& locker)
/**
* Updates policy and management when a message has been dequeued,
- * expects messageLock to be held
+ * Requires messageLock be held by caller.
*/
-void Queue::observeDequeue(const QueuedMessage& msg, const Mutex::ScopedLock&)
+void Queue::observeDequeue(const QueuedMessage& msg, const qpid::sys::Mutex::ScopedLock&)
{
- mgntDeqStats(msg.payload);
- if (policy.get()) policy->dequeued(msg);
- messages->deleted(msg);
for (Observers::const_iterator i = observers.begin(); i != observers.end(); ++i) {
try{
(*i)->dequeued(msg);
@@ -963,17 +1131,11 @@ void Queue::observeDequeue(const QueuedMessage& msg, const Mutex::ScopedLock&)
}
}
-/** updates queue observers when a message has become unavailable for transfer,
- * expects messageLock to be held
+/** updates queue observers when a message has become unavailable for transfer.
+ * Requires messageLock be held by caller.
*/
-void Queue::observeAcquire(const QueuedMessage& msg, const Mutex::ScopedLock&)
+void Queue::observeAcquire(const QueuedMessage& msg, const qpid::sys::Mutex::ScopedLock&)
{
- if (mgmtObject) {
- mgmtObject->inc_acquires();
- if (brokerMgmtObject)
- brokerMgmtObject->inc_acquires();
- }
-
for (Observers::const_iterator i = observers.begin(); i != observers.end(); ++i) {
try{
(*i)->acquired(msg);
@@ -983,17 +1145,11 @@ void Queue::observeAcquire(const QueuedMessage& msg, const Mutex::ScopedLock&)
}
}
-/** updates queue observers when a message has become re-available for transfer,
- * expects messageLock to be held
+/** updates queue observers when a message has become re-available for transfer
+ * Requires messageLock be held by caller.
*/
-void Queue::observeRequeue(const QueuedMessage& msg, const Mutex::ScopedLock&)
+void Queue::observeRequeue(const QueuedMessage& msg, const qpid::sys::Mutex::ScopedLock&)
{
- if (mgmtObject) {
- mgmtObject->inc_releases();
- if (brokerMgmtObject)
- brokerMgmtObject->inc_releases();
- }
-
for (Observers::const_iterator i = observers.begin(); i != observers.end(); ++i) {
try{
(*i)->requeued(msg);
@@ -1003,6 +1159,33 @@ void Queue::observeRequeue(const QueuedMessage& msg, const Mutex::ScopedLock&)
}
}
+/** updates queue observers when a new consumer has subscribed to this queue.
+ */
+void Queue::observeConsumerAdd( const Consumer& c, const qpid::sys::Mutex::ScopedLock&)
+{
+ for (Observers::const_iterator i = observers.begin(); i != observers.end(); ++i) {
+ try{
+ (*i)->consumerAdded(c);
+ } catch (const std::exception& e) {
+ QPID_LOG(warning, "Exception on notification of new consumer for queue " << getName() << ": " << e.what());
+ }
+ }
+}
+
+/** updates queue observers when a consumer has unsubscribed from this queue.
+ */
+void Queue::observeConsumerRemove( const Consumer& c, const qpid::sys::Mutex::ScopedLock&)
+{
+ for (Observers::const_iterator i = observers.begin(); i != observers.end(); ++i) {
+ try{
+ (*i)->consumerRemoved(c);
+ } catch (const std::exception& e) {
+ QPID_LOG(warning, "Exception on notification of removed consumer for queue " << getName() << ": " << e.what());
+ }
+ }
+}
+
+
void Queue::create(const FieldTable& _settings)
{
settings = _settings;
@@ -1150,23 +1333,21 @@ void Queue::configureImpl(const FieldTable& _settings)
void Queue::destroyed()
{
unbind(broker->getExchanges());
- {
- Mutex::ScopedLock locker(messageLock);
- QueuedMessage m;
- while(popAndDequeue(m, locker)) {
- DeliverableMessage msg(m.payload);
- if (alternateExchange.get()) {
- if (brokerMgmtObject)
- brokerMgmtObject->inc_abandonedViaAlt();
- alternateExchange->routeWithAlternate(msg);
- } else {
- if (brokerMgmtObject)
- brokerMgmtObject->inc_abandoned();
- }
+
+ QueuedMessage m;
+ while(popAndDequeue(m)) {
+ DeliverableMessage msg(m.payload);
+ if (alternateExchange.get()) {
+ if (brokerMgmtObject)
+ brokerMgmtObject->inc_abandonedViaAlt();
+ alternateExchange->routeWithAlternate(msg);
+ } else {
+ if (brokerMgmtObject)
+ brokerMgmtObject->inc_abandoned();
}
- if (alternateExchange.get())
- alternateExchange->decAlternateUsers();
}
+ if (alternateExchange.get())
+ alternateExchange->decAlternateUsers();
if (store) {
barrier.destroy();
@@ -1177,7 +1358,7 @@ void Queue::destroyed()
if (autoDeleteTask) autoDeleteTask = boost::intrusive_ptr<TimerTask>();
notifyDeleted();
{
- Mutex::ScopedLock locker(messageLock);
+ Mutex::ScopedLock lock(messageLock);
observers.clear();
}
}
@@ -1187,8 +1368,8 @@ void Queue::notifyDeleted()
QueueListeners::ListenerSet set;
{
Mutex::ScopedLock locker(messageLock);
- listeners.snapshot(set);
deleted = true;
+ listeners.snapshot(set);
}
set.notifyAll();
}
@@ -1206,6 +1387,7 @@ void Queue::unbind(ExchangeRegistry& exchanges)
void Queue::setPolicy(std::auto_ptr<QueuePolicy> _policy)
{
+ Mutex::ScopedLock locker(messageLock);
policy = _policy;
if (policy.get())
policy->setQueue(this);
@@ -1213,6 +1395,7 @@ void Queue::setPolicy(std::auto_ptr<QueuePolicy> _policy)
const QueuePolicy* Queue::getPolicy()
{
+ Mutex::ScopedLock locker(messageLock);
return policy.get();
}
@@ -1302,7 +1485,7 @@ struct AutoDeleteTask : qpid::sys::TimerTask
Queue::shared_ptr queue;
AutoDeleteTask(Broker& b, Queue::shared_ptr q, AbsTime fireTime)
- : qpid::sys::TimerTask(fireTime, "DelayedAutoDeletion"), broker(b), queue(q) {}
+ : qpid::sys::TimerTask(fireTime, "DelayedAutoDeletion:"+q->getName()), broker(b), queue(q) {}
void fire()
{
@@ -1388,11 +1571,15 @@ void Queue::countRejected() const
void Queue::countFlowedToDisk(uint64_t size) const
{
if (mgmtObject) {
- mgmtObject->inc_msgFtdEnqueues();
- mgmtObject->inc_byteFtdEnqueues(size);
+ _qmf::Queue::PerThreadStats *qStats = mgmtObject->getStatistics();
+ qStats->msgFtdEnqueues += 1;
+ qStats->byteFtdEnqueues += size;
+ mgmtObject->statisticsUpdated();
if (brokerMgmtObject) {
- brokerMgmtObject->inc_msgFtdEnqueues();
- brokerMgmtObject->inc_byteFtdEnqueues(size);
+ _qmf::Broker::PerThreadStats *bStats = brokerMgmtObject->getStatistics();
+ bStats->msgFtdEnqueues += 1;
+ bStats->byteFtdEnqueues += size;
+ brokerMgmtObject->statisticsUpdated();
}
}
}
@@ -1400,11 +1587,15 @@ void Queue::countFlowedToDisk(uint64_t size) const
void Queue::countLoadedFromDisk(uint64_t size) const
{
if (mgmtObject) {
- mgmtObject->inc_msgFtdDequeues();
- mgmtObject->inc_byteFtdDequeues(size);
+ _qmf::Queue::PerThreadStats *qStats = mgmtObject->getStatistics();
+ qStats->msgFtdDequeues += 1;
+ qStats->byteFtdDequeues += size;
+ mgmtObject->statisticsUpdated();
if (brokerMgmtObject) {
- brokerMgmtObject->inc_msgFtdDequeues();
- brokerMgmtObject->inc_byteFtdDequeues(size);
+ _qmf::Broker::PerThreadStats *bStats = brokerMgmtObject->getStatistics();
+ bStats->msgFtdDequeues += 1;
+ bStats->byteFtdDequeues += size;
+ brokerMgmtObject->statisticsUpdated();
}
}
}
@@ -1434,9 +1625,14 @@ Manageable::status_t Queue::ManagementMethod (uint32_t methodId, Args& args, str
{
_qmf::ArgsQueueReroute& rerouteArgs = (_qmf::ArgsQueueReroute&) args;
boost::shared_ptr<Exchange> dest;
- if (rerouteArgs.i_useAltExchange)
+ if (rerouteArgs.i_useAltExchange) {
+ if (!alternateExchange) {
+ status = Manageable::STATUS_PARAMETER_INVALID;
+ etext = "No alternate-exchange defined";
+ break;
+ }
dest = alternateExchange;
- else {
+ } else {
try {
dest = broker->getExchanges().get(rerouteArgs.i_exchange);
} catch(const std::exception&) {
@@ -1486,8 +1682,12 @@ void Queue::recoveryComplete(ExchangeRegistry& exchanges)
<< "\": exchange does not exist.");
}
//process any pending dequeues
- for_each(pendingDequeues.begin(), pendingDequeues.end(), boost::bind(&Queue::dequeue, this, (TransactionContext*) 0, _1));
- pendingDequeues.clear();
+ std::deque<QueuedMessage> pd;
+ {
+ Mutex::ScopedLock locker(messageLock);
+ pendingDequeues.swap(pd);
+ }
+ for_each(pd.begin(), pd.end(), boost::bind(&Queue::dequeue, this, (TransactionContext*) 0, _1));
}
void Queue::insertSequenceNumbers(const std::string& key)
@@ -1497,10 +1697,10 @@ void Queue::insertSequenceNumbers(const std::string& key)
QPID_LOG(debug, "Inserting sequence numbers as " << key);
}
-/** updates queue observers and state when a message has become available for transfer,
- * expects messageLock to be held
+/** updates queue observers and state when a message has become available for transfer
+ * Requires messageLock be held by caller.
*/
-void Queue::observeEnqueue(const QueuedMessage& m, const Mutex::ScopedLock&)
+void Queue::observeEnqueue(const QueuedMessage& m, const qpid::sys::Mutex::ScopedLock&)
{
for (Observers::iterator i = observers.begin(); i != observers.end(); ++i) {
try {
@@ -1509,10 +1709,6 @@ void Queue::observeEnqueue(const QueuedMessage& m, const Mutex::ScopedLock&)
QPID_LOG(warning, "Exception on notification of enqueue for queue " << getName() << ": " << e.what());
}
}
- if (policy.get()) {
- policy->enqueued(m);
- }
- mgntEnqStats(m.payload);
}
void Queue::updateEnqueued(const QueuedMessage& m)
@@ -1520,12 +1716,16 @@ void Queue::updateEnqueued(const QueuedMessage& m)
if (m.payload) {
boost::intrusive_ptr<Message> payload = m.payload;
enqueue(0, payload, true);
- messages->updateAcquired(m);
- if (policy.get()) {
- policy->recoverEnqueued(payload);
+ {
+ Mutex::ScopedLock locker(messageLock);
+ messages->updateAcquired(m);
+ observeEnqueue(m, locker);
+ if (policy.get()) {
+ policy->recoverEnqueued(payload);
+ policy->enqueued(m);
+ }
}
- Mutex::ScopedLock locker(messageLock);
- observeEnqueue(m, locker);
+ mgntEnqStats(m.payload, mgmtObject, brokerMgmtObject);
} else {
QPID_LOG(warning, "Queue informed of enqueued message that has no payload");
}
@@ -1533,10 +1733,16 @@ void Queue::updateEnqueued(const QueuedMessage& m)
bool Queue::isEnqueued(const QueuedMessage& msg)
{
+ Mutex::ScopedLock locker(messageLock);
return !policy.get() || policy->isEnqueued(msg);
}
+// Note: accessing listeners outside of lock is dangerous. Caller must ensure the queue's
+// state is not changed while listeners is referenced.
QueueListeners& Queue::getListeners() { return listeners; }
+
+// Note: accessing messages outside of lock is dangerous. Caller must ensure the queue's
+// state is not changed while messages is referenced.
Messages& Queue::getMessages() { return *messages; }
const Messages& Queue::getMessages() const { return *messages; }
@@ -1549,13 +1755,13 @@ void Queue::checkNotDeleted(const Consumer::shared_ptr& c)
void Queue::addObserver(boost::shared_ptr<QueueObserver> observer)
{
- Mutex::ScopedLock locker(messageLock);
+ Mutex::ScopedLock lock(messageLock);
observers.insert(observer);
}
void Queue::removeObserver(boost::shared_ptr<QueueObserver> observer)
{
- Mutex::ScopedLock locker(messageLock);
+ Mutex::ScopedLock lock(messageLock);
observers.erase(observer);
}
@@ -1618,7 +1824,7 @@ Queue::UsageBarrier::UsageBarrier(Queue& q) : parent(q), count(0) {}
bool Queue::UsageBarrier::acquire()
{
- Monitor::ScopedLock l(parent.messageLock);
+ Monitor::ScopedLock l(parent.messageLock); /** @todo: use a dedicated lock instead of messageLock */
if (parent.deleted) {
return false;
} else {
@@ -1639,3 +1845,6 @@ void Queue::UsageBarrier::destroy()
parent.deleted = true;
while (count) parent.messageLock.wait();
}
+
+}}
+
diff --git a/cpp/src/qpid/broker/Queue.h b/cpp/src/qpid/broker/Queue.h
index e8573c17cc..9869a698c1 100644
--- a/cpp/src/qpid/broker/Queue.h
+++ b/cpp/src/qpid/broker/Queue.h
@@ -97,7 +97,8 @@ class Queue : public boost::enable_shared_from_this<Queue>,
const bool autodelete;
MessageStore* store;
const OwnershipToken* owner;
- uint32_t consumerCount;
+ uint32_t consumerCount; // Actually a count of all subscriptions, acquiring or not.
+ uint32_t browserCount; // Count of non-acquiring subscriptions.
OwnershipToken* exclusive;
bool noLocal;
bool persistLastNode;
@@ -107,7 +108,22 @@ class Queue : public boost::enable_shared_from_this<Queue>,
QueueListeners listeners;
std::auto_ptr<Messages> messages;
std::deque<QueuedMessage> pendingDequeues;//used to avoid dequeuing during recovery
- mutable qpid::sys::Mutex consumerLock;
+ /** messageLock is used to keep the Queue's state consistent while processing message
+ * events, such as message dispatch, enqueue, acquire, and dequeue. It must be held
+ * while updating certain members in order to keep these members consistent with
+ * each other:
+ * o messages
+ * o sequence
+ * o policy
+ * o listeners
+ * o allocator
+ * o observeXXX() methods
+ * o observers
+ * o pendingDequeues (TBD: move under separate lock)
+ * o exclusive OwnershipToken (TBD: move under separate lock)
+ * o consumerCount (TBD: move under separate lock)
+ * o Queue::UsageBarrier (TBD: move under separate lock)
+ */
mutable qpid::sys::Monitor messageLock;
mutable qpid::sys::Mutex ownershipLock;
mutable uint64_t persistenceId;
@@ -143,52 +159,20 @@ class Queue : public boost::enable_shared_from_this<Queue>,
bool isExcluded(boost::intrusive_ptr<Message>& msg);
- /** update queue observers, stats, policy, etc when the messages' state changes. Lock
- * must be held by caller */
+ /** update queue observers, stats, policy, etc when the messages' state changes.
+ * messageLock is held by caller */
void observeEnqueue(const QueuedMessage& msg, const sys::Mutex::ScopedLock& lock);
void observeAcquire(const QueuedMessage& msg, const sys::Mutex::ScopedLock& lock);
void observeRequeue(const QueuedMessage& msg, const sys::Mutex::ScopedLock& lock);
void observeDequeue(const QueuedMessage& msg, const sys::Mutex::ScopedLock& lock);
- bool popAndDequeue(QueuedMessage&, const sys::Mutex::ScopedLock& lock);
- // acquire message @ position, return true and set msg if acquire succeeds
- bool acquire(const qpid::framing::SequenceNumber& position, QueuedMessage& msg,
- const sys::Mutex::ScopedLock& held);
+ void observeConsumerAdd( const Consumer&, const sys::Mutex::ScopedLock& lock);
+ void observeConsumerRemove( const Consumer&, const sys::Mutex::ScopedLock& lock);
+ bool popAndDequeue(QueuedMessage&);
+ bool acquire(const qpid::framing::SequenceNumber& position, QueuedMessage& msg);
void forcePersistent(QueuedMessage& msg);
int getEventMode();
void configureImpl(const qpid::framing::FieldTable& settings);
-
- inline void mgntEnqStats(const boost::intrusive_ptr<Message>& msg)
- {
- if (mgmtObject != 0) {
- mgmtObject->inc_msgTotalEnqueues ();
- mgmtObject->inc_byteTotalEnqueues (msg->contentSize ());
- brokerMgmtObject->inc_msgTotalEnqueues ();
- brokerMgmtObject->inc_byteTotalEnqueues (msg->contentSize ());
- if (msg->isPersistent ()) {
- mgmtObject->inc_msgPersistEnqueues ();
- mgmtObject->inc_bytePersistEnqueues (msg->contentSize ());
- brokerMgmtObject->inc_msgPersistEnqueues ();
- brokerMgmtObject->inc_bytePersistEnqueues (msg->contentSize ());
- }
- }
- }
- inline void mgntDeqStats(const boost::intrusive_ptr<Message>& msg)
- {
- if (mgmtObject != 0){
- mgmtObject->inc_msgTotalDequeues ();
- mgmtObject->inc_byteTotalDequeues (msg->contentSize());
- brokerMgmtObject->inc_msgTotalDequeues ();
- brokerMgmtObject->inc_byteTotalDequeues (msg->contentSize());
- if (msg->isPersistent ()){
- mgmtObject->inc_msgPersistDequeues ();
- mgmtObject->inc_bytePersistDequeues (msg->contentSize());
- brokerMgmtObject->inc_msgPersistDequeues ();
- brokerMgmtObject->inc_bytePersistDequeues (msg->contentSize());
- }
- }
- }
-
void checkNotDeleted(const Consumer::shared_ptr& c);
void notifyDeleted();
@@ -235,8 +219,9 @@ class Queue : public boost::enable_shared_from_this<Queue>,
/**
* Bind self to specified exchange, and record that binding for unbinding on delete.
*/
- bool bind(boost::shared_ptr<Exchange> exchange, const std::string& key,
- const qpid::framing::FieldTable& arguments=qpid::framing::FieldTable());
+ QPID_BROKER_EXTERN bool bind(
+ boost::shared_ptr<Exchange> exchange, const std::string& key,
+ const qpid::framing::FieldTable& arguments=qpid::framing::FieldTable());
/** Acquire the message at the given position if it is available for acquire. Not to
* be used by clients, but used by the broker for queue management.
@@ -271,28 +256,29 @@ class Queue : public boost::enable_shared_from_this<Queue>,
bool exclusive = false);
QPID_BROKER_EXTERN void cancel(Consumer::shared_ptr c);
- uint32_t purge(const uint32_t purge_request=0, //defaults to all messages
+ QPID_BROKER_EXTERN uint32_t purge(const uint32_t purge_request=0, //defaults to all messages
boost::shared_ptr<Exchange> dest=boost::shared_ptr<Exchange>(),
const ::qpid::types::Variant::Map *filter=0);
QPID_BROKER_EXTERN void purgeExpired(sys::Duration);
//move qty # of messages to destination Queue destq
- uint32_t move(const Queue::shared_ptr destq, uint32_t qty,
- const qpid::types::Variant::Map *filter=0);
+ QPID_BROKER_EXTERN uint32_t move(
+ const Queue::shared_ptr destq, uint32_t qty,
+ const qpid::types::Variant::Map *filter=0);
QPID_BROKER_EXTERN uint32_t getMessageCount() const;
QPID_BROKER_EXTERN uint32_t getEnqueueCompleteMessageCount() const;
QPID_BROKER_EXTERN uint32_t getConsumerCount() const;
inline const std::string& getName() const { return name; }
- bool isExclusiveOwner(const OwnershipToken* const o) const;
- void releaseExclusiveOwnership();
- bool setExclusiveOwner(const OwnershipToken* const o);
- bool hasExclusiveConsumer() const;
- bool hasExclusiveOwner() const;
+ QPID_BROKER_EXTERN bool isExclusiveOwner(const OwnershipToken* const o) const;
+ QPID_BROKER_EXTERN void releaseExclusiveOwnership();
+ QPID_BROKER_EXTERN bool setExclusiveOwner(const OwnershipToken* const o);
+ QPID_BROKER_EXTERN bool hasExclusiveConsumer() const;
+ QPID_BROKER_EXTERN bool hasExclusiveOwner() const;
inline bool isDurable() const { return store != 0; }
inline const framing::FieldTable& getSettings() const { return settings; }
inline bool isAutoDelete() const { return autodelete; }
- bool canAutoDelete() const;
+ QPID_BROKER_EXTERN bool canAutoDelete() const;
const QueueBindings& getBindings() const { return bindings; }
/**
@@ -301,8 +287,8 @@ class Queue : public boost::enable_shared_from_this<Queue>,
QPID_BROKER_EXTERN void setLastNodeFailure();
QPID_BROKER_EXTERN void clearLastNodeFailure();
- bool enqueue(TransactionContext* ctxt, boost::intrusive_ptr<Message>& msg, bool suppressPolicyCheck = false);
- void enqueueAborted(boost::intrusive_ptr<Message> msg);
+ QPID_BROKER_EXTERN bool enqueue(TransactionContext* ctxt, boost::intrusive_ptr<Message>& msg, bool suppressPolicyCheck = false);
+ QPID_BROKER_EXTERN void enqueueAborted(boost::intrusive_ptr<Message> msg);
/**
* dequeue from store (only done once messages is acknowledged)
*/
@@ -311,7 +297,7 @@ class Queue : public boost::enable_shared_from_this<Queue>,
* Inform the queue that a previous transactional dequeue
* committed.
*/
- void dequeueCommitted(const QueuedMessage& msg);
+ QPID_BROKER_EXTERN void dequeueCommitted(const QueuedMessage& msg);
/**
* Inform queue of messages that were enqueued, have since
@@ -319,7 +305,7 @@ class Queue : public boost::enable_shared_from_this<Queue>,
* thus are still logically on the queue) - used in
* clustered broker.
*/
- void updateEnqueued(const QueuedMessage& msg);
+ QPID_BROKER_EXTERN void updateEnqueued(const QueuedMessage& msg);
/**
* Test whether the specified message (identified by its
@@ -328,7 +314,7 @@ class Queue : public boost::enable_shared_from_this<Queue>,
* have been delievered to a subscriber who has not yet
* accepted it).
*/
- bool isEnqueued(const QueuedMessage& msg);
+ QPID_BROKER_EXTERN bool isEnqueued(const QueuedMessage& msg);
/**
* Acquires the next available (oldest) message
@@ -338,17 +324,17 @@ class Queue : public boost::enable_shared_from_this<Queue>,
/** Get the message at position pos, returns true if found and sets msg */
QPID_BROKER_EXTERN bool find(framing::SequenceNumber pos, QueuedMessage& msg ) const;
- const QueuePolicy* getPolicy();
+ QPID_BROKER_EXTERN const QueuePolicy* getPolicy();
- void setAlternateExchange(boost::shared_ptr<Exchange> exchange);
- boost::shared_ptr<Exchange> getAlternateExchange();
- bool isLocal(boost::intrusive_ptr<Message>& msg);
+ QPID_BROKER_EXTERN void setAlternateExchange(boost::shared_ptr<Exchange> exchange);
+ QPID_BROKER_EXTERN boost::shared_ptr<Exchange> getAlternateExchange();
+ QPID_BROKER_EXTERN bool isLocal(boost::intrusive_ptr<Message>& msg);
//PersistableQueue support:
- uint64_t getPersistenceId() const;
- void setPersistenceId(uint64_t persistenceId) const;
- void encode(framing::Buffer& buffer) const;
- uint32_t encodedSize() const;
+ QPID_BROKER_EXTERN uint64_t getPersistenceId() const;
+ QPID_BROKER_EXTERN void setPersistenceId(uint64_t persistenceId) const;
+ QPID_BROKER_EXTERN void encode(framing::Buffer& buffer) const;
+ QPID_BROKER_EXTERN uint32_t encodedSize() const;
/**
* Restores a queue from encoded data (used in recovery)
@@ -362,15 +348,15 @@ class Queue : public boost::enable_shared_from_this<Queue>,
virtual void setExternalQueueStore(ExternalQueueStore* inst);
// Increment the rejected-by-consumer counter.
- void countRejected() const;
- void countFlowedToDisk(uint64_t size) const;
- void countLoadedFromDisk(uint64_t size) const;
+ QPID_BROKER_EXTERN void countRejected() const;
+ QPID_BROKER_EXTERN void countFlowedToDisk(uint64_t size) const;
+ QPID_BROKER_EXTERN void countLoadedFromDisk(uint64_t size) const;
// Manageable entry points
- management::ManagementObject* GetManagementObject (void) const;
+ QPID_BROKER_EXTERN management::ManagementObject* GetManagementObject (void) const;
management::Manageable::status_t
- ManagementMethod (uint32_t methodId, management::Args& args, std::string& text);
- void query(::qpid::types::Variant::Map&) const;
+ QPID_BROKER_EXTERN ManagementMethod (uint32_t methodId, management::Args& args, std::string& text);
+ QPID_BROKER_EXTERN void query(::qpid::types::Variant::Map&) const;
/** Apply f to each Message on the queue. */
template <class F> void eachMessage(F f) {
@@ -385,6 +371,7 @@ class Queue : public boost::enable_shared_from_this<Queue>,
/** Apply f to each Observer on the queue */
template <class F> void eachObserver(F f) {
+ sys::Mutex::ScopedLock l(messageLock);
std::for_each<Observers::iterator, F>(observers.begin(), observers.end(), f);
}
@@ -396,31 +383,31 @@ class Queue : public boost::enable_shared_from_this<Queue>,
/** return current position sequence number for the next message on the queue.
*/
QPID_BROKER_EXTERN framing::SequenceNumber getPosition();
- void addObserver(boost::shared_ptr<QueueObserver>);
- void removeObserver(boost::shared_ptr<QueueObserver>);
+ QPID_BROKER_EXTERN void addObserver(boost::shared_ptr<QueueObserver>);
+ QPID_BROKER_EXTERN void removeObserver(boost::shared_ptr<QueueObserver>);
QPID_BROKER_EXTERN void insertSequenceNumbers(const std::string& key);
/**
* Notify queue that recovery has completed.
*/
- void recoveryComplete(ExchangeRegistry& exchanges);
+ QPID_BROKER_EXTERN void recoveryComplete(ExchangeRegistry& exchanges);
// For cluster update
- QueueListeners& getListeners();
- Messages& getMessages();
- const Messages& getMessages() const;
+ QPID_BROKER_EXTERN QueueListeners& getListeners();
+ QPID_BROKER_EXTERN Messages& getMessages();
+ QPID_BROKER_EXTERN const Messages& getMessages() const;
/**
* Reserve space in policy for an enqueued message that
* has been recovered in the prepared state (dtx only)
*/
- void recoverPrepared(boost::intrusive_ptr<Message>& msg);
+ QPID_BROKER_EXTERN void recoverPrepared(boost::intrusive_ptr<Message>& msg);
- void flush();
+ QPID_BROKER_EXTERN void flush();
- Broker* getBroker();
+ QPID_BROKER_EXTERN Broker* getBroker();
uint32_t getDequeueSincePurge() { return dequeueSincePurge.get(); }
- void setDequeueSincePurge(uint32_t value);
+ QPID_BROKER_EXTERN void setDequeueSincePurge(uint32_t value);
};
}
}
diff --git a/cpp/src/qpid/broker/QueueListeners.cpp b/cpp/src/qpid/broker/QueueListeners.cpp
index 32c208b073..0338a674cf 100644
--- a/cpp/src/qpid/broker/QueueListeners.cpp
+++ b/cpp/src/qpid/broker/QueueListeners.cpp
@@ -79,10 +79,6 @@ void QueueListeners::NotificationSet::notify()
std::for_each(browsers.begin(), browsers.end(), boost::mem_fn(&Consumer::notify));
}
-bool QueueListeners::contains(Consumer::shared_ptr c) const {
- return c->inListeners;
-}
-
void QueueListeners::ListenerSet::notifyAll()
{
std::for_each(listeners.begin(), listeners.end(), boost::mem_fn(&Consumer::notify));
diff --git a/cpp/src/qpid/broker/QueueListeners.h b/cpp/src/qpid/broker/QueueListeners.h
index 0659499253..ca844fd47e 100644
--- a/cpp/src/qpid/broker/QueueListeners.h
+++ b/cpp/src/qpid/broker/QueueListeners.h
@@ -30,7 +30,7 @@ namespace broker {
/**
* Track and notify components that wish to be notified of messages
* that become available on a queue.
- *
+ *
* None of the methods defined here are protected by locking. However
* the populate method allows a 'snapshot' to be taken of the
* listeners to be notified. NotificationSet::notify() may then be
@@ -61,11 +61,10 @@ class QueueListeners
friend class QueueListeners;
};
- void addListener(Consumer::shared_ptr);
- void removeListener(Consumer::shared_ptr);
+ void addListener(Consumer::shared_ptr);
+ void removeListener(Consumer::shared_ptr);
void populate(NotificationSet&);
void snapshot(ListenerSet&);
- bool contains(Consumer::shared_ptr c) const;
void notifyAll();
template <class F> void eachListener(F f) {
diff --git a/cpp/src/qpid/broker/QueuedMessage.cpp b/cpp/src/qpid/broker/QueuedMessage.cpp
new file mode 100644
index 0000000000..d40cc901ff
--- /dev/null
+++ b/cpp/src/qpid/broker/QueuedMessage.cpp
@@ -0,0 +1,34 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#include "QueuedMessage.h"
+#include "Queue.h"
+#include <iostream>
+
+namespace qpid {
+namespace broker {
+
+std::ostream& operator<<(std::ostream& o, const QueuedMessage& qm) {
+ o << (qm.queue ? qm.queue->getName() : std::string()) << "[" << qm.position <<"]";
+ return o;
+}
+
+
+}} // namespace qpid::broker
diff --git a/cpp/src/qpid/broker/QueuedMessage.h b/cpp/src/qpid/broker/QueuedMessage.h
index 806da8e720..9d008193a0 100644
--- a/cpp/src/qpid/broker/QueuedMessage.h
+++ b/cpp/src/qpid/broker/QueuedMessage.h
@@ -22,6 +22,8 @@
#define _QueuedMessage_
#include "qpid/broker/Message.h"
+#include "BrokerImportExport.h"
+#include <iosfwd>
namespace qpid {
namespace broker {
@@ -47,6 +49,7 @@ inline bool operator<(const QueuedMessage& a, const QueuedMessage& b) {
return a.position < b.position;
}
+QPID_BROKER_EXTERN std::ostream& operator<<(std::ostream&, const QueuedMessage&);
}}
diff --git a/cpp/src/qpid/broker/SaslAuthenticator.cpp b/cpp/src/qpid/broker/SaslAuthenticator.cpp
index d7adbd68ab..80fa5e1c0e 100644
--- a/cpp/src/qpid/broker/SaslAuthenticator.cpp
+++ b/cpp/src/qpid/broker/SaslAuthenticator.cpp
@@ -26,6 +26,7 @@
#include "qpid/broker/Connection.h"
#include "qpid/log/Statement.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/sys/SecuritySettings.h"
#include <boost/format.hpp>
diff --git a/cpp/src/qpid/broker/SemanticState.cpp b/cpp/src/qpid/broker/SemanticState.cpp
index e7d2259c80..64924bdd4c 100644
--- a/cpp/src/qpid/broker/SemanticState.cpp
+++ b/cpp/src/qpid/broker/SemanticState.cpp
@@ -489,14 +489,14 @@ void SemanticState::route(intrusive_ptr<Message> msg, Deliverable& strategy) {
exchangeName << " with routing-key " << msg->getRoutingKey()));
}
- cacheExchange->route(strategy, msg->getRoutingKey(), msg->getApplicationHeaders());
+ cacheExchange->route(strategy);
if (!strategy.delivered) {
//TODO:if discard-unroutable, just drop it
//TODO:else if accept-mode is explicit, reject it
//else route it to alternate exchange
if (cacheExchange->getAlternate()) {
- cacheExchange->getAlternate()->route(strategy, msg->getRoutingKey(), msg->getApplicationHeaders());
+ cacheExchange->getAlternate()->route(strategy);
}
if (!strategy.delivered) {
msg->destroy();
diff --git a/cpp/src/qpid/broker/SemanticState.h b/cpp/src/qpid/broker/SemanticState.h
index 5a83fd0fb3..e5e1d2da16 100644
--- a/cpp/src/qpid/broker/SemanticState.h
+++ b/cpp/src/qpid/broker/SemanticState.h
@@ -22,6 +22,7 @@
*
*/
+#include "qpid/broker/BrokerImportExport.h"
#include "qpid/broker/Consumer.h"
#include "qpid/broker/Credit.h"
#include "qpid/broker/Deliverable.h"
@@ -39,7 +40,6 @@
#include "qpid/sys/AggregateOutput.h"
#include "qpid/sys/Mutex.h"
#include "qpid/sys/AtomicValue.h"
-#include "qpid/broker/AclModule.h"
#include "qmf/org/apache/qpid/broker/Subscription.h"
#include <list>
@@ -99,42 +99,44 @@ class SemanticState : private boost::noncopyable {
bool haveCredit();
protected:
- virtual bool doDispatch();
+ QPID_BROKER_EXTERN virtual bool doDispatch();
size_t unacked() { return parent->unacked.size(); }
public:
typedef boost::shared_ptr<ConsumerImpl> shared_ptr;
- ConsumerImpl(SemanticState* parent,
- const std::string& name, boost::shared_ptr<Queue> queue,
- bool ack, bool acquire, bool exclusive,
- const std::string& tag, const std::string& resumeId, uint64_t resumeTtl, const framing::FieldTable& arguments);
- virtual ~ConsumerImpl();
- OwnershipToken* getSession();
- virtual bool deliver(QueuedMessage& msg);
- bool filter(boost::intrusive_ptr<Message> msg);
- bool accept(boost::intrusive_ptr<Message> msg);
- void cancel() {}
-
- void disableNotify();
- void enableNotify();
- void notify();
- bool isNotifyEnabled() const;
-
- void requestDispatch();
-
- void setWindowMode();
- void setCreditMode();
- void addByteCredit(uint32_t value);
- void addMessageCredit(uint32_t value);
- void flush();
- void stop();
- void complete(DeliveryRecord&);
+ QPID_BROKER_EXTERN ConsumerImpl(
+ SemanticState* parent,
+ const std::string& name, boost::shared_ptr<Queue> queue,
+ bool ack, bool acquire, bool exclusive,
+ const std::string& tag, const std::string& resumeId, uint64_t resumeTtl,
+ const framing::FieldTable& arguments);
+ QPID_BROKER_EXTERN virtual ~ConsumerImpl();
+ QPID_BROKER_EXTERN OwnershipToken* getSession();
+ QPID_BROKER_EXTERN virtual bool deliver(QueuedMessage& msg);
+ QPID_BROKER_EXTERN bool filter(boost::intrusive_ptr<Message> msg);
+ QPID_BROKER_EXTERN bool accept(boost::intrusive_ptr<Message> msg);
+ QPID_BROKER_EXTERN void cancel() {}
+
+ QPID_BROKER_EXTERN void disableNotify();
+ QPID_BROKER_EXTERN void enableNotify();
+ QPID_BROKER_EXTERN void notify();
+ QPID_BROKER_EXTERN bool isNotifyEnabled() const;
+
+ QPID_BROKER_EXTERN void requestDispatch();
+
+ QPID_BROKER_EXTERN void setWindowMode();
+ QPID_BROKER_EXTERN void setCreditMode();
+ QPID_BROKER_EXTERN void addByteCredit(uint32_t value);
+ QPID_BROKER_EXTERN void addMessageCredit(uint32_t value);
+ QPID_BROKER_EXTERN void flush();
+ QPID_BROKER_EXTERN void stop();
+ QPID_BROKER_EXTERN void complete(DeliveryRecord&);
boost::shared_ptr<Queue> getQueue() const { return queue; }
bool isBlocked() const { return blocked; }
bool setBlocked(bool set) { std::swap(set, blocked); return set; }
- bool doOutput();
+ QPID_BROKER_EXTERN bool doOutput();
Credit& getCredit() { return credit; }
const Credit& getCredit() const { return credit; }
@@ -152,8 +154,11 @@ class SemanticState : private boost::noncopyable {
void acknowledged(const broker::QueuedMessage&) {}
// manageable entry points
- management::ManagementObject* GetManagementObject (void) const;
- management::Manageable::status_t ManagementMethod (uint32_t methodId, management::Args& args, std::string& text);
+ QPID_BROKER_EXTERN management::ManagementObject*
+ GetManagementObject(void) const;
+
+ QPID_BROKER_EXTERN management::Manageable::status_t
+ ManagementMethod(uint32_t methodId, management::Args& args, std::string& text);
};
typedef std::map<std::string, DtxBuffer::shared_ptr> DtxBufferMap;
diff --git a/cpp/src/qpid/broker/SessionAdapter.cpp b/cpp/src/qpid/broker/SessionAdapter.cpp
index 4aad46f782..78f2e43ce0 100644
--- a/cpp/src/qpid/broker/SessionAdapter.cpp
+++ b/cpp/src/qpid/broker/SessionAdapter.cpp
@@ -21,8 +21,9 @@
#include "qpid/Exception.h"
#include "qpid/framing/reply_exceptions.h"
#include "qpid/framing/enum.h"
-#include "qpid/log/Statement.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/framing/SequenceSet.h"
+#include "qpid/log/Statement.h"
#include "qpid/management/ManagementAgent.h"
#include "qpid/broker/SessionState.h"
#include "qmf/org/apache/qpid/broker/EventExchangeDeclare.h"
@@ -73,18 +74,12 @@ void SessionAdapter::ExchangeHandlerImpl::declare(const string& exchange, const
if(passive){
AclModule* acl = getBroker().getAcl();
if (acl) {
- //TODO: why does a passive declare require create
- //permission? The purpose of the passive flag is to state
- //that the exchange should *not* created. For
- //authorisation a passive declare is similar to
- //exchange-query.
std::map<acl::Property, std::string> params;
params.insert(make_pair(acl::PROP_TYPE, type));
params.insert(make_pair(acl::PROP_ALTERNATE, alternateExchange));
- params.insert(make_pair(acl::PROP_PASSIVE, _TRUE));
params.insert(make_pair(acl::PROP_DURABLE, durable ? _TRUE : _FALSE));
- if (!acl->authorise(getConnection().getUserId(),acl::ACT_CREATE,acl::OBJ_EXCHANGE,exchange,&params) )
- throw framing::UnauthorizedAccessException(QPID_MSG("ACL denied exchange create request from " << getConnection().getUserId()));
+ if (!acl->authorise(getConnection().getUserId(),acl::ACT_ACCESS,acl::OBJ_EXCHANGE,exchange,&params) )
+ throw framing::UnauthorizedAccessException(QPID_MSG("ACL denied exchange access request from " << getConnection().getUserId()));
}
Exchange::shared_ptr actual(getBroker().getExchanges().get(exchange));
checkType(actual, type);
@@ -274,22 +269,16 @@ void SessionAdapter::QueueHandlerImpl::declare(const string& name, const string&
if (passive && !name.empty()) {
AclModule* acl = getBroker().getAcl();
if (acl) {
- //TODO: why does a passive declare require create
- //permission? The purpose of the passive flag is to state
- //that the queue should *not* created. For
- //authorisation a passive declare is similar to
- //queue-query (or indeed a qmf query).
std::map<acl::Property, std::string> params;
params.insert(make_pair(acl::PROP_ALTERNATE, alternateExchange));
- params.insert(make_pair(acl::PROP_PASSIVE, _TRUE));
params.insert(make_pair(acl::PROP_DURABLE, std::string(durable ? _TRUE : _FALSE)));
params.insert(make_pair(acl::PROP_EXCLUSIVE, std::string(exclusive ? _TRUE : _FALSE)));
params.insert(make_pair(acl::PROP_AUTODELETE, std::string(autoDelete ? _TRUE : _FALSE)));
params.insert(make_pair(acl::PROP_POLICYTYPE, arguments.getAsString("qpid.policy_type")));
params.insert(make_pair(acl::PROP_MAXQUEUECOUNT, boost::lexical_cast<string>(arguments.getAsInt("qpid.max_count"))));
params.insert(make_pair(acl::PROP_MAXQUEUESIZE, boost::lexical_cast<string>(arguments.getAsInt64("qpid.max_size"))));
- if (!acl->authorise(getConnection().getUserId(),acl::ACT_CREATE,acl::OBJ_QUEUE,name,&params) )
- throw UnauthorizedAccessException(QPID_MSG("ACL denied queue create request from " << getConnection().getUserId()));
+ if (!acl->authorise(getConnection().getUserId(),acl::ACT_ACCESS,acl::OBJ_QUEUE,name,&params) )
+ throw UnauthorizedAccessException(QPID_MSG("ACL denied queue access request from " << getConnection().getUserId()));
}
queue = getQueue(name);
//TODO: check alternate-exchange is as expected
@@ -409,6 +398,7 @@ SessionAdapter::MessageHandlerImpl::subscribe(const string& queueName,
if(!destination.empty() && state.exists(destination))
throw NotAllowedException(QPID_MSG("Consumer tags must be unique"));
+ // We allow browsing (acquireMode == 1) of exclusive queues, this is required by HA.
if (queue->hasExclusiveOwner() && !queue->isExclusiveOwner(&session) && acquireMode == 0)
throw ResourceLockedException(QPID_MSG("Cannot subscribe to exclusive queue "
<< queue->getName()));
@@ -548,13 +538,6 @@ void SessionAdapter::TxHandlerImpl::rollback()
state.rollback();
}
-std::string SessionAdapter::DtxHandlerImpl::convert(const framing::Xid& xid)
-{
- std::string encoded;
- encode(xid, encoded);
- return encoded;
-}
-
void SessionAdapter::DtxHandlerImpl::select()
{
state.selectDtx();
@@ -566,7 +549,7 @@ XaResult SessionAdapter::DtxHandlerImpl::end(const Xid& xid,
{
try {
if (fail) {
- state.endDtx(convert(xid), true);
+ state.endDtx(DtxManager::convert(xid), true);
if (suspend) {
throw CommandInvalidException(QPID_MSG("End and suspend cannot both be set."));
} else {
@@ -574,9 +557,9 @@ XaResult SessionAdapter::DtxHandlerImpl::end(const Xid& xid,
}
} else {
if (suspend) {
- state.suspendDtx(convert(xid));
+ state.suspendDtx(DtxManager::convert(xid));
} else {
- state.endDtx(convert(xid), false);
+ state.endDtx(DtxManager::convert(xid), false);
}
return XaResult(XA_STATUS_XA_OK);
}
@@ -594,9 +577,9 @@ XaResult SessionAdapter::DtxHandlerImpl::start(const Xid& xid,
}
try {
if (resume) {
- state.resumeDtx(convert(xid));
+ state.resumeDtx(DtxManager::convert(xid));
} else {
- state.startDtx(convert(xid), getBroker().getDtxManager(), join);
+ state.startDtx(DtxManager::convert(xid), getBroker().getDtxManager(), join);
}
return XaResult(XA_STATUS_XA_OK);
} catch (const DtxTimeoutException& /*e*/) {
@@ -607,7 +590,7 @@ XaResult SessionAdapter::DtxHandlerImpl::start(const Xid& xid,
XaResult SessionAdapter::DtxHandlerImpl::prepare(const Xid& xid)
{
try {
- bool ok = getBroker().getDtxManager().prepare(convert(xid));
+ bool ok = getBroker().getDtxManager().prepare(DtxManager::convert(xid));
return XaResult(ok ? XA_STATUS_XA_OK : XA_STATUS_XA_RBROLLBACK);
} catch (const DtxTimeoutException& /*e*/) {
return XaResult(XA_STATUS_XA_RBTIMEOUT);
@@ -618,7 +601,7 @@ XaResult SessionAdapter::DtxHandlerImpl::commit(const Xid& xid,
bool onePhase)
{
try {
- bool ok = getBroker().getDtxManager().commit(convert(xid), onePhase);
+ bool ok = getBroker().getDtxManager().commit(DtxManager::convert(xid), onePhase);
return XaResult(ok ? XA_STATUS_XA_OK : XA_STATUS_XA_RBROLLBACK);
} catch (const DtxTimeoutException& /*e*/) {
return XaResult(XA_STATUS_XA_RBTIMEOUT);
@@ -629,7 +612,7 @@ XaResult SessionAdapter::DtxHandlerImpl::commit(const Xid& xid,
XaResult SessionAdapter::DtxHandlerImpl::rollback(const Xid& xid)
{
try {
- getBroker().getDtxManager().rollback(convert(xid));
+ getBroker().getDtxManager().rollback(DtxManager::convert(xid));
return XaResult(XA_STATUS_XA_OK);
} catch (const DtxTimeoutException& /*e*/) {
return XaResult(XA_STATUS_XA_RBTIMEOUT);
@@ -659,7 +642,7 @@ void SessionAdapter::DtxHandlerImpl::forget(const Xid& xid)
DtxGetTimeoutResult SessionAdapter::DtxHandlerImpl::getTimeout(const Xid& xid)
{
- uint32_t timeout = getBroker().getDtxManager().getTimeout(convert(xid));
+ uint32_t timeout = getBroker().getDtxManager().getTimeout(DtxManager::convert(xid));
return DtxGetTimeoutResult(timeout);
}
@@ -667,7 +650,7 @@ DtxGetTimeoutResult SessionAdapter::DtxHandlerImpl::getTimeout(const Xid& xid)
void SessionAdapter::DtxHandlerImpl::setTimeout(const Xid& xid,
uint32_t timeout)
{
- getBroker().getDtxManager().setTimeout(convert(xid), timeout);
+ getBroker().getDtxManager().setTimeout(DtxManager::convert(xid), timeout);
}
diff --git a/cpp/src/qpid/broker/SessionAdapter.h b/cpp/src/qpid/broker/SessionAdapter.h
index 8987c4812f..bc056538b1 100644
--- a/cpp/src/qpid/broker/SessionAdapter.h
+++ b/cpp/src/qpid/broker/SessionAdapter.h
@@ -226,10 +226,8 @@ class Queue;
void rollback();
};
- class DtxHandlerImpl : public DtxHandler, public HandlerHelper, private framing::StructHelper
+ class DtxHandlerImpl : public DtxHandler, public HandlerHelper
{
- std::string convert(const framing::Xid& xid);
-
public:
DtxHandlerImpl(SemanticState& session) : HandlerHelper(session) {}
diff --git a/cpp/src/qpid/broker/SessionHandler.cpp b/cpp/src/qpid/broker/SessionHandler.cpp
index 752fa55535..b58c7c01c5 100644
--- a/cpp/src/qpid/broker/SessionHandler.cpp
+++ b/cpp/src/qpid/broker/SessionHandler.cpp
@@ -64,6 +64,7 @@ void SessionHandler::handleDetach() {
if (session.get())
connection.getBroker().getSessionManager().detach(session);
assert(!session.get());
+ if (detachedCallback) detachedCallback();
connection.closeChannel(channel.get());
}
@@ -117,4 +118,8 @@ void SessionHandler::attached(const std::string& name)
}
}
+void SessionHandler::setDetachedCallback(boost::function<void()> cb) {
+ detachedCallback = cb;
+}
+
}} // namespace qpid::broker
diff --git a/cpp/src/qpid/broker/SessionHandler.h b/cpp/src/qpid/broker/SessionHandler.h
index 8cd5072574..4e2cfaa963 100644
--- a/cpp/src/qpid/broker/SessionHandler.h
+++ b/cpp/src/qpid/broker/SessionHandler.h
@@ -10,9 +10,9 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -25,6 +25,7 @@
#include "qpid/amqp_0_10/SessionHandler.h"
#include "qpid/broker/SessionHandler.h"
#include "qpid/framing/AMQP_ClientProxy.h"
+#include <boost/function.hpp>
namespace qpid {
class SessionState;
@@ -61,7 +62,7 @@ class SessionHandler : public amqp_0_10::SessionHandler {
* This proxy is for sending such commands. In a clustered broker it will take steps
* to synchronize command order across the cluster. In a stand-alone broker
* it is just a synonym for getProxy()
- */
+ */
framing::AMQP_ClientProxy& getClusterOrderProxy() {
return clusterOrderProxy.get() ? *clusterOrderProxy : proxy;
}
@@ -70,6 +71,8 @@ class SessionHandler : public amqp_0_10::SessionHandler {
void attached(const std::string& name);//used by 'pushing' inter-broker bridges
void attachAs(const std::string& name);//used by 'pulling' inter-broker bridges
+ void setDetachedCallback(boost::function<void()> cb);
+
protected:
virtual void setState(const std::string& sessionName, bool force);
virtual qpid::SessionState* getState();
@@ -91,6 +94,7 @@ class SessionHandler : public amqp_0_10::SessionHandler {
framing::AMQP_ClientProxy proxy;
std::auto_ptr<SessionState> session;
std::auto_ptr<SetChannelProxy> clusterOrderProxy;
+ boost::function<void ()> detachedCallback;
};
}} // namespace qpid::broker
diff --git a/cpp/src/qpid/broker/TopicExchange.cpp b/cpp/src/qpid/broker/TopicExchange.cpp
index 644a3d628e..dd3ec13019 100644
--- a/cpp/src/qpid/broker/TopicExchange.cpp
+++ b/cpp/src/qpid/broker/TopicExchange.cpp
@@ -350,8 +350,9 @@ TopicExchange::BindingKey *TopicExchange::getQueueBinding(Queue::shared_ptr queu
return (q != qv.end()) ? bk : 0;
}
-void TopicExchange::route(Deliverable& msg, const string& routingKey, const FieldTable* /*args*/)
+void TopicExchange::route(Deliverable& msg)
{
+ const string& routingKey = msg.getMessage().getRoutingKey();
// Note: PERFORMANCE CRITICAL!!!
BindingList b;
std::map<std::string, BindingList>::iterator it;
diff --git a/cpp/src/qpid/broker/TopicExchange.h b/cpp/src/qpid/broker/TopicExchange.h
index 636918f8a1..cc24e1411e 100644
--- a/cpp/src/qpid/broker/TopicExchange.h
+++ b/cpp/src/qpid/broker/TopicExchange.h
@@ -185,9 +185,7 @@ class TopicExchange : public virtual Exchange {
virtual bool unbind(Queue::shared_ptr queue, const std::string& routingKey, const qpid::framing::FieldTable* args);
- QPID_BROKER_EXTERN virtual void route(Deliverable& msg,
- const std::string& routingKey,
- const qpid::framing::FieldTable* args);
+ QPID_BROKER_EXTERN virtual void route(Deliverable& msg);
QPID_BROKER_EXTERN virtual bool isBound(Queue::shared_ptr queue,
const std::string* const routingKey,
diff --git a/cpp/src/qpid/broker/windows/SaslAuthenticator.cpp b/cpp/src/qpid/broker/windows/SaslAuthenticator.cpp
index 2acc09cded..a38e6ac12a 100644
--- a/cpp/src/qpid/broker/windows/SaslAuthenticator.cpp
+++ b/cpp/src/qpid/broker/windows/SaslAuthenticator.cpp
@@ -25,6 +25,7 @@
#include "qpid/broker/Connection.h"
#include "qpid/log/Statement.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/FieldValue.h"
#include <windows.h>
diff --git a/cpp/src/qpid/client/Connection.cpp b/cpp/src/qpid/client/Connection.cpp
index 2882ef5d42..83a4a35b53 100644
--- a/cpp/src/qpid/client/Connection.cpp
+++ b/cpp/src/qpid/client/Connection.cpp
@@ -75,7 +75,7 @@ void Connection::open(const Url& url, const ConnectionSettings& settings) {
i++;
try {
ConnectionSettings cs(settings);
- cs.protocol = addr.protocol;
+ if (addr.protocol.size()) cs.protocol = addr.protocol;
cs.host = addr.host;
cs.port = addr.port;
open(cs);
diff --git a/cpp/src/qpid/client/ConnectionHandler.cpp b/cpp/src/qpid/client/ConnectionHandler.cpp
index ab0d8e0700..94561f8079 100644
--- a/cpp/src/qpid/client/ConnectionHandler.cpp
+++ b/cpp/src/qpid/client/ConnectionHandler.cpp
@@ -28,10 +28,13 @@
#include "qpid/framing/all_method_bodies.h"
#include "qpid/framing/ClientInvoker.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/log/Helpers.h"
#include "qpid/log/Statement.h"
#include "qpid/sys/SystemInfo.h"
+#include <algorithm>
+
using namespace qpid::client;
using namespace qpid::framing;
using namespace qpid::framing::connection;
@@ -238,15 +241,16 @@ void ConnectionHandler::start(const FieldTable& /*serverProps*/, const Array& me
);
std::vector<std::string> mechlist;
+ mechlist.reserve(mechanisms.size());
if (mechanism.empty()) {
//mechlist is simply what the server offers
- mechanisms.collect(mechlist);
+ std::transform(mechanisms.begin(), mechanisms.end(), std::back_inserter(mechlist), Array::get<std::string, Array::ValuePtr>);
} else {
//mechlist is the intersection of those indicated by user and
//those supported by server, in the order listed by user
std::vector<std::string> allowed = split(mechanism, " ");
- std::vector<std::string> supported;
- mechanisms.collect(supported);
+ std::vector<std::string> supported(mechanisms.size());
+ std::transform(mechanisms.begin(), mechanisms.end(), std::back_inserter(supported), Array::get<std::string, Array::ValuePtr>);
intersection(allowed, supported, mechlist);
if (mechlist.empty()) {
throw Exception(QPID_MSG("Desired mechanism(s) not valid: " << mechanism << " (supported: " << join(supported) << ")"));
diff --git a/cpp/src/qpid/client/ConnectionImpl.cpp b/cpp/src/qpid/client/ConnectionImpl.cpp
index db97f1e0f4..85b0e8303e 100644
--- a/cpp/src/qpid/client/ConnectionImpl.cpp
+++ b/cpp/src/qpid/client/ConnectionImpl.cpp
@@ -115,8 +115,10 @@ public:
ioThreads(0),
connections(0)
{
+ CommonOptions common("", "", QPIDC_CONF_FILE);
IOThreadOptions options(c);
- options.parse(0, 0, QPIDC_CONF_FILE, true);
+ common.parse(0, 0, common.clientConfig, true);
+ options.parse(0, 0, common.clientConfig, true);
maxIOThreads = (options.maxIOThreads != -1) ?
options.maxIOThreads : 1;
}
diff --git a/cpp/src/qpid/client/LoadPlugins.cpp b/cpp/src/qpid/client/LoadPlugins.cpp
index 246eb60c67..d76e1d458e 100644
--- a/cpp/src/qpid/client/LoadPlugins.cpp
+++ b/cpp/src/qpid/client/LoadPlugins.cpp
@@ -39,10 +39,12 @@ namespace {
struct LoadtimeInitialise {
LoadtimeInitialise() {
+ CommonOptions common("", "", QPIDC_CONF_FILE);
qpid::ModuleOptions moduleOptions(QPIDC_MODULE_DIR);
string defaultPath (moduleOptions.loadDir);
- moduleOptions.parse (0, 0, QPIDC_CONF_FILE, true);
-
+ common.parse(0, 0, common.clientConfig, true);
+ moduleOptions.parse (0, 0, common.clientConfig, true);
+
for (vector<string>::iterator iter = moduleOptions.load.begin();
iter != moduleOptions.load.end();
iter++)
diff --git a/cpp/src/qpid/client/SessionImpl.cpp b/cpp/src/qpid/client/SessionImpl.cpp
index 9ac5323a53..3f3ad617f4 100644
--- a/cpp/src/qpid/client/SessionImpl.cpp
+++ b/cpp/src/qpid/client/SessionImpl.cpp
@@ -324,7 +324,7 @@ struct MethodContentAdaptor : MethodContent
MethodContentAdaptor(const FrameSet& f) : header(*f.getHeaders()), content(f.getContent()) {}
- AMQHeaderBody getHeader() const
+ const AMQHeaderBody& getHeader() const
{
return header;
}
diff --git a/cpp/src/qpid/client/SslConnector.cpp b/cpp/src/qpid/client/SslConnector.cpp
index 6b6bf884ec..ab0c5c4957 100644
--- a/cpp/src/qpid/client/SslConnector.cpp
+++ b/cpp/src/qpid/client/SslConnector.cpp
@@ -148,8 +148,10 @@ namespace {
struct StaticInit {
StaticInit() {
try {
+ CommonOptions common("", "", QPIDC_CONF_FILE);
SslOptions options;
- options.parse (0, 0, QPIDC_CONF_FILE, true);
+ common.parse(0, 0, common.clientConfig, true);
+ options.parse (0, 0, common.clientConfig, true);
if (options.certDbPath.empty()) {
QPID_LOG(info, "SSL connector not enabled, you must set QPID_SSL_CERT_DB to enable it.");
} else {
diff --git a/cpp/src/qpid/client/TCPConnector.cpp b/cpp/src/qpid/client/TCPConnector.cpp
index 51eacf77e8..4660a41c07 100644
--- a/cpp/src/qpid/client/TCPConnector.cpp
+++ b/cpp/src/qpid/client/TCPConnector.cpp
@@ -97,7 +97,7 @@ void TCPConnector::connect(const std::string& host, const std::string& port) {
boost::bind(&TCPConnector::connected, this, _1),
boost::bind(&TCPConnector::connectFailed, this, _3));
closed = false;
- identifier = str(format("[%1%]") % socket.getFullAddress());
+
connector->start(poller);
}
@@ -120,6 +120,8 @@ void TCPConnector::start(sys::AsynchIO* aio_) {
for (int i = 0; i < 4; i++) {
aio->queueReadBuffer(new Buff(maxFrameSize));
}
+
+ identifier = str(format("[%1%]") % socket.getFullAddress());
}
void TCPConnector::initAmqp() {
@@ -129,7 +131,7 @@ void TCPConnector::initAmqp() {
void TCPConnector::connectFailed(const std::string& msg) {
connector = 0;
- QPID_LOG(warning, "Connect failed: " << msg << " " << identifier);
+ QPID_LOG(warning, "Connect failed: " << msg);
socket.close();
if (!closed)
closed = true;
@@ -183,7 +185,7 @@ sys::ShutdownHandler* TCPConnector::getShutdownHandler() const {
return shutdownHandler;
}
-const std::string& TCPConnector::getIdentifier() const {
+const std::string& TCPConnector::getIdentifier() const {
return identifier;
}
diff --git a/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp b/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp
index 5924e30dd8..a8f4fb5237 100644
--- a/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp
+++ b/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp
@@ -32,6 +32,7 @@
#include "qpid/framing/ExchangeBoundResult.h"
#include "qpid/framing/ExchangeQueryResult.h"
#include "qpid/framing/FieldTable.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/framing/QueueQueryResult.h"
#include "qpid/framing/ReplyTo.h"
#include "qpid/framing/reply_exceptions.h"
diff --git a/cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp b/cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp
index 3cfd2e37f2..2ea4dc0c61 100644
--- a/cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp
+++ b/cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp
@@ -41,6 +41,7 @@ using qpid::framing::Uuid;
namespace {
+const std::string TCP("tcp");
double FOREVER(std::numeric_limits<double>::max());
// Time values in seconds can be specified as integer or floating point values.
@@ -290,7 +291,7 @@ bool ConnectionImpl::tryConnect()
for (std::vector<std::string>::const_iterator i = urls.begin(); i != urls.end(); ++i) {
try {
QPID_LOG(info, "Trying to connect to " << *i << "...");
- Url url(*i);
+ Url url(*i, settings.protocol.size() ? settings.protocol : TCP);
if (url.getUser().size()) settings.username = url.getUser();
if (url.getPass().size()) settings.password = url.getPass();
connection.open(url, settings);
diff --git a/cpp/src/qpid/cluster/Cluster.cpp b/cpp/src/qpid/cluster/Cluster.cpp
index 3c1d23c842..34aaf3d341 100644
--- a/cpp/src/qpid/cluster/Cluster.cpp
+++ b/cpp/src/qpid/cluster/Cluster.cpp
@@ -131,6 +131,7 @@
#include "qpid/cluster/UpdateExchange.h"
#include "qpid/cluster/ClusterTimer.h"
#include "qpid/cluster/CredentialsExchange.h"
+#include "qpid/cluster/UpdateClient.h"
#include "qpid/assert.h"
#include "qmf/org/apache/qpid/cluster/ArgsClusterStopClusterNode.h"
@@ -202,7 +203,7 @@ namespace arg=client::arg;
* Currently use SVN revision to avoid clashes with versions from
* different branches.
*/
-const uint32_t Cluster::CLUSTER_VERSION = 1207877;
+const uint32_t Cluster::CLUSTER_VERSION = 1332342;
struct ClusterDispatcher : public framing::AMQP_AllOperations::ClusterHandler {
qpid::cluster::Cluster& cluster;
@@ -269,7 +270,6 @@ Cluster::Cluster(const ClusterSettings& set, broker::Broker& b) :
"Error delivering frames",
poller),
failoverExchange(new FailoverExchange(broker.GetVhostObject(), &broker)),
- updateDataExchange(new UpdateDataExchange(*this)),
credentialsExchange(new CredentialsExchange(*this)),
quorum(boost::bind(&Cluster::leave, this)),
decoder(boost::bind(&Cluster::deliverFrame, this, _1)),
@@ -295,15 +295,6 @@ Cluster::Cluster(const ClusterSettings& set, broker::Broker& b) :
// Failover exchange provides membership updates to clients.
broker.getExchanges().registerExchange(failoverExchange);
- // Update exchange is used during updates to replicate messages
- // without modifying delivery-properties.exchange.
- broker.getExchanges().registerExchange(
- boost::shared_ptr<broker::Exchange>(new UpdateExchange(this)));
-
- // Update-data exchange is used for passing data that may be too large
- // for single control frame.
- broker.getExchanges().registerExchange(updateDataExchange);
-
// CredentialsExchange is used to authenticate new cluster members
broker.getExchanges().registerExchange(credentialsExchange);
@@ -680,6 +671,17 @@ void Cluster::initMapCompleted(Lock& l) {
authenticate();
broker.setRecovery(false); // Ditch my current store.
broker.setClusterUpdatee(true);
+
+ // Update exchange is used during updates to replicate messages
+ // without modifying delivery-properties.exchange.
+ broker.getExchanges().registerExchange(
+ boost::shared_ptr<broker::Exchange>(new UpdateExchange(this)));
+
+ // Update-data exchange is used during update for passing data that
+ // may be too large for single control frame.
+ updateDataExchange.reset(new UpdateDataExchange(*this));
+ broker.getExchanges().registerExchange(updateDataExchange);
+
if (mAgent) mAgent->suppress(true); // Suppress mgmt output during update.
state = JOINER;
mcast.mcastControl(ClusterUpdateRequestBody(ProtocolVersion(), myUrl.str()), self);
@@ -999,6 +1001,10 @@ void Cluster::checkUpdateIn(Lock& l) {
boost::ref(broker.getExchanges())));
enableClusterSafe(); // Enable cluster-safe assertions
deliverEventQueue.start();
+ // FIXME aconway 2012-04-04: unregister/delete Update[Data]Exchange
+ updateDataExchange.reset();
+ broker.getExchanges().destroy(UpdateDataExchange::EXCHANGE_NAME);
+ broker.getExchanges().destroy(UpdateClient::UPDATE);
}
else if (updateRetracted) { // Update was retracted, request another update
updateRetracted = false;
diff --git a/cpp/src/qpid/cluster/ClusterMap.cpp b/cpp/src/qpid/cluster/ClusterMap.cpp
index a8389095c9..d9817db35f 100644
--- a/cpp/src/qpid/cluster/ClusterMap.cpp
+++ b/cpp/src/qpid/cluster/ClusterMap.cpp
@@ -21,6 +21,7 @@
#include "qpid/cluster/ClusterMap.h"
#include "qpid/Url.h"
#include "qpid/framing/FieldTable.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/log/Statement.h"
#include <boost/bind.hpp>
#include <algorithm>
@@ -29,7 +30,8 @@
#include <ostream>
using namespace std;
-using namespace boost;
+using boost::ref;
+using boost::optional;
namespace qpid {
using namespace framing;
diff --git a/cpp/src/qpid/cluster/ClusterTimer.cpp b/cpp/src/qpid/cluster/ClusterTimer.cpp
index b4f7d00f38..90e4fa9d4d 100644
--- a/cpp/src/qpid/cluster/ClusterTimer.cpp
+++ b/cpp/src/qpid/cluster/ClusterTimer.cpp
@@ -24,6 +24,7 @@
#include "qpid/log/Statement.h"
#include "qpid/framing/ClusterTimerWakeupBody.h"
#include "qpid/framing/ClusterTimerDropBody.h"
+#include "qpid/sys/ClusterSafe.h"
namespace qpid {
namespace cluster {
@@ -107,6 +108,7 @@ void ClusterTimer::drop(intrusive_ptr<TimerTask> t) {
// Deliver thread
void ClusterTimer::deliverWakeup(const std::string& name) {
QPID_LOG(trace, "Cluster timer wakeup delivered for " << name);
+ qpid::sys::assertClusterSafe();
Map::iterator i = map.find(name);
if (i == map.end())
throw Exception(QPID_MSG("Cluster timer wakeup non-existent task " << name));
diff --git a/cpp/src/qpid/cluster/Connection.cpp b/cpp/src/qpid/cluster/Connection.cpp
index fc6ada096f..512e0f03cb 100644
--- a/cpp/src/qpid/cluster/Connection.cpp
+++ b/cpp/src/qpid/cluster/Connection.cpp
@@ -47,6 +47,7 @@
#include "qpid/framing/ClusterConnectionAnnounceBody.h"
#include "qpid/framing/ConnectionCloseBody.h"
#include "qpid/framing/ConnectionCloseOkBody.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/log/Statement.h"
#include "qpid/sys/ClusterSafe.h"
#include "qpid/types/Variant.h"
@@ -796,6 +797,54 @@ void Connection::config(const std::string& encoded) {
else throw Exception(QPID_MSG("Update failed, invalid kind of config: " << kind));
}
+namespace {
+ // find a Link that matches the given Address
+ class LinkFinder {
+ qpid::Address id;
+ boost::shared_ptr<broker::Link> link;
+ public:
+ LinkFinder(const qpid::Address& _id) : id(_id) {}
+ boost::shared_ptr<broker::Link> getLink() { return link; }
+ void operator() (boost::shared_ptr<broker::Link> l)
+ {
+ if (!link) {
+ qpid::Address addr(l->getTransport(), l->getHost(), l->getPort());
+ if (id == addr) {
+ link = l;
+ }
+ }
+ }
+ };
+}
+
+void Connection::internalState(const std::string& type,
+ const std::string& name,
+ const framing::FieldTable& state)
+{
+ if (type == "link") {
+ // name is the string representation of the Link's _configured_ destination address
+ Url dest;
+ try {
+ dest = name;
+ } catch(...) {
+ throw Exception(QPID_MSG("Update failed, invalid format for Link destination address: " << name));
+ }
+ assert(dest.size());
+ LinkFinder finder(dest[0]);
+ cluster.getBroker().getLinks().eachLink(boost::ref(finder));
+ if (finder.getLink()) {
+ try {
+ finder.getLink()->setState(state);
+ } catch(...) {
+ throw Exception(QPID_MSG("Update failed, invalid state for Link " << name << ", state: " << state));
+ }
+ QPID_LOG(debug, cluster << " updated link " << dest[0] << " with state: " << state);
+ } else throw Exception(QPID_MSG("Update failed, unable to find Link named: " << name));
+ }
+ else throw Exception(QPID_MSG("Update failed, invalid object type for internal state replication: " << type));
+}
+
+
void Connection::doCatchupIoCallbacks() {
// We need to process IO callbacks during the catch-up phase in
// order to service asynchronous completions for messages
diff --git a/cpp/src/qpid/cluster/Connection.h b/cpp/src/qpid/cluster/Connection.h
index 920c4937db..26514c76e2 100644
--- a/cpp/src/qpid/cluster/Connection.h
+++ b/cpp/src/qpid/cluster/Connection.h
@@ -200,6 +200,8 @@ class Connection :
const std::string& instance);
void config(const std::string& encoded);
+ void internalState(const std::string& type, const std::string& name,
+ const framing::FieldTable& state);
void setSecureConnection ( broker::SecureConnection * sc );
diff --git a/cpp/src/qpid/cluster/CredentialsExchange.cpp b/cpp/src/qpid/cluster/CredentialsExchange.cpp
index 0fafc521cd..416a3636e9 100644
--- a/cpp/src/qpid/cluster/CredentialsExchange.cpp
+++ b/cpp/src/qpid/cluster/CredentialsExchange.cpp
@@ -62,7 +62,8 @@ bool CredentialsExchange::check(MemberId member) {
return valid;
}
-void CredentialsExchange::route(broker::Deliverable& msg, const string& /*routingKey*/, const framing::FieldTable* args) {
+void CredentialsExchange::route(broker::Deliverable& msg) {
+ const framing::FieldTable* args = msg.getMessage().getApplicationHeaders();
sys::Mutex::ScopedLock l(lock);
const broker::ConnectionState* connection =
static_cast<const broker::ConnectionState*>(msg.getMessage().getPublisher());
diff --git a/cpp/src/qpid/cluster/CredentialsExchange.h b/cpp/src/qpid/cluster/CredentialsExchange.h
index 90fd188271..74cf8350a6 100644
--- a/cpp/src/qpid/cluster/CredentialsExchange.h
+++ b/cpp/src/qpid/cluster/CredentialsExchange.h
@@ -50,7 +50,7 @@ class CredentialsExchange : public broker::Exchange
bool check(MemberId member);
/** Throw an exception if the calling connection is not the cluster user. Store credentials in msg. */
- void route(broker::Deliverable& msg, const std::string& routingKey, const framing::FieldTable* args);
+ void route(broker::Deliverable& msg);
// Exchange overrides
std::string getType() const;
diff --git a/cpp/src/qpid/cluster/FailoverExchange.cpp b/cpp/src/qpid/cluster/FailoverExchange.cpp
index 43ec27cf2c..87202a887c 100644
--- a/cpp/src/qpid/cluster/FailoverExchange.cpp
+++ b/cpp/src/qpid/cluster/FailoverExchange.cpp
@@ -80,7 +80,7 @@ bool FailoverExchange::isBound(Queue::shared_ptr queue, const string* const, con
return queues.find(queue) != queues.end();
}
-void FailoverExchange::route(Deliverable&, const string& , const framing::FieldTable* ) {
+void FailoverExchange::route(Deliverable&) {
QPID_LOG(warning, "Message received by exchange " << typeName << " ignoring");
}
diff --git a/cpp/src/qpid/cluster/FailoverExchange.h b/cpp/src/qpid/cluster/FailoverExchange.h
index c3e50c6929..5ac734a7ac 100644
--- a/cpp/src/qpid/cluster/FailoverExchange.h
+++ b/cpp/src/qpid/cluster/FailoverExchange.h
@@ -54,7 +54,7 @@ class FailoverExchange : public broker::Exchange
bool bind(boost::shared_ptr<broker::Queue> queue, const std::string& routingKey, const framing::FieldTable* args);
bool unbind(boost::shared_ptr<broker::Queue> queue, const std::string& routingKey, const framing::FieldTable* args);
bool isBound(boost::shared_ptr<broker::Queue> queue, const std::string* const routingKey, const framing::FieldTable* const args);
- void route(broker::Deliverable& msg, const std::string& routingKey, const framing::FieldTable* args);
+ void route(broker::Deliverable& msg);
private:
void sendUpdate(const boost::shared_ptr<broker::Queue>&);
diff --git a/cpp/src/qpid/cluster/InitialStatusMap.cpp b/cpp/src/qpid/cluster/InitialStatusMap.cpp
index eb65005a9e..fc53d1076b 100644
--- a/cpp/src/qpid/cluster/InitialStatusMap.cpp
+++ b/cpp/src/qpid/cluster/InitialStatusMap.cpp
@@ -30,9 +30,9 @@ namespace qpid {
namespace cluster {
using namespace std;
-using namespace boost;
using namespace framing::cluster;
using namespace framing;
+using boost::optional;
InitialStatusMap::InitialStatusMap(const MemberId& self_, size_t size_)
: self(self_), completed(), resendNeeded(), size(size_)
diff --git a/cpp/src/qpid/cluster/UpdateClient.cpp b/cpp/src/qpid/cluster/UpdateClient.cpp
index 95c64ff060..20684fd8a7 100644
--- a/cpp/src/qpid/cluster/UpdateClient.cpp
+++ b/cpp/src/qpid/cluster/UpdateClient.cpp
@@ -57,6 +57,7 @@
#include "qpid/framing/ClusterConnectionShadowReadyBody.h"
#include "qpid/framing/ClusterConnectionSessionStateBody.h"
#include "qpid/framing/ClusterConnectionConsumerStateBody.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/framing/enum.h"
#include "qpid/framing/ProtocolVersion.h"
#include "qpid/framing/TypeCode.h"
@@ -687,7 +688,15 @@ void UpdateClient::updateLinks() {
void UpdateClient::updateLink(const boost::shared_ptr<broker::Link>& link) {
QPID_LOG(debug, *this << " updating link "
<< link->getHost() << ":" << link->getPort());
- ClusterConnectionProxy(session).config(encode(*link));
+ ClusterConnectionProxy(session).config(encode(*link)); // push the configuration
+ // now push the current state
+ framing::FieldTable state;
+ link->getState(state);
+ std::ostringstream os;
+ os << qpid::Address(link->getTransport(), link->getHost(), link->getPort());
+ ClusterConnectionProxy(session).internalState(std::string("link"),
+ os.str(),
+ state);
}
void UpdateClient::updateBridge(const boost::shared_ptr<broker::Bridge>& bridge) {
diff --git a/cpp/src/qpid/cluster/UpdateDataExchange.cpp b/cpp/src/qpid/cluster/UpdateDataExchange.cpp
index e5cd82e3d3..31d96c67ca 100644
--- a/cpp/src/qpid/cluster/UpdateDataExchange.cpp
+++ b/cpp/src/qpid/cluster/UpdateDataExchange.cpp
@@ -40,9 +40,9 @@ UpdateDataExchange::UpdateDataExchange(Cluster& cluster) :
Exchange(EXCHANGE_NAME, &cluster)
{}
-void UpdateDataExchange::route(broker::Deliverable& msg, const std::string& routingKey,
- const qpid::framing::FieldTable* )
+void UpdateDataExchange::route(broker::Deliverable& msg)
{
+ const std::string& routingKey = msg.getMessage().getRoutingKey();
std::string data = msg.getMessage().getFrames().getContent();
if (routingKey == MANAGEMENT_AGENTS_KEY) managementAgents = data;
else if (routingKey == MANAGEMENT_SCHEMAS_KEY) managementSchemas = data;
diff --git a/cpp/src/qpid/cluster/UpdateDataExchange.h b/cpp/src/qpid/cluster/UpdateDataExchange.h
index d2f6c35ad0..f79430f111 100644
--- a/cpp/src/qpid/cluster/UpdateDataExchange.h
+++ b/cpp/src/qpid/cluster/UpdateDataExchange.h
@@ -50,8 +50,7 @@ class UpdateDataExchange : public broker::Exchange
UpdateDataExchange(Cluster& parent);
- void route(broker::Deliverable& msg, const std::string& routingKey,
- const framing::FieldTable* args);
+ void route(broker::Deliverable& msg);
// Not implemented
std::string getType() const { return EXCHANGE_TYPE; }
diff --git a/cpp/src/qpid/framing/AMQFrame.h b/cpp/src/qpid/framing/AMQFrame.h
index 4f6faf4199..19675ce6ff 100644
--- a/cpp/src/qpid/framing/AMQFrame.h
+++ b/cpp/src/qpid/framing/AMQFrame.h
@@ -43,8 +43,7 @@ class QPID_COMMON_CLASS_EXTERN AMQFrame : public AMQDataBlock
ChannelId getChannel() const { return channel; }
void setChannel(ChannelId c) { channel = c; }
- AMQBody* getBody() { return body.get(); }
- const AMQBody* getBody() const { return body.get(); }
+ AMQBody* getBody() const { return body.get(); }
AMQMethodBody* getMethod() { return getBody() ? getBody()->getMethod() : 0; }
const AMQMethodBody* getMethod() const { return getBody() ? getBody()->getMethod() : 0; }
diff --git a/cpp/src/qpid/framing/BodyHandler.cpp b/cpp/src/qpid/framing/BodyHandler.cpp
deleted file mode 100644
index db302b1e4c..0000000000
--- a/cpp/src/qpid/framing/BodyHandler.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-#include "qpid/framing/BodyHandler.h"
-#include "qpid/framing/AMQMethodBody.h"
-#include "qpid/framing/AMQHeaderBody.h"
-#include "qpid/framing/AMQContentBody.h"
-#include "qpid/framing/AMQHeartbeatBody.h"
-#include <boost/cast.hpp>
-#include "qpid/framing/reply_exceptions.h"
-#include "qpid/Msg.h"
-
-using namespace qpid::framing;
-using namespace boost;
-
-BodyHandler::~BodyHandler() {}
-
-// TODO aconway 2007-08-13: Replace with visitor.
-void BodyHandler::handleBody(AMQBody* body) {
- switch(body->type())
- {
- case METHOD_BODY:
- handleMethod(polymorphic_downcast<AMQMethodBody*>(body));
- break;
- case HEADER_BODY:
- handleHeader(polymorphic_downcast<AMQHeaderBody*>(body));
- break;
- case CONTENT_BODY:
- handleContent(polymorphic_downcast<AMQContentBody*>(body));
- break;
- case HEARTBEAT_BODY:
- handleHeartbeat(polymorphic_downcast<AMQHeartbeatBody*>(body));
- break;
- default:
- throw FramingErrorException(
- QPID_MSG("Invalid frame type " << body->type()));
- }
-}
-
diff --git a/cpp/src/qpid/framing/BodyHandler.h b/cpp/src/qpid/framing/BodyHandler.h
deleted file mode 100644
index 9ded737195..0000000000
--- a/cpp/src/qpid/framing/BodyHandler.h
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef _BodyHandler_
-#define _BodyHandler_
-
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include <boost/shared_ptr.hpp>
-
-namespace qpid {
-namespace framing {
-class AMQBody;
-class AMQMethodBody;
-class AMQHeaderBody;
-class AMQContentBody;
-class AMQHeartbeatBody;
-
-// TODO aconway 2007-08-10: rework using Visitor pattern?
-
-/**
- * Interface to handle incoming frame bodies.
- * Derived classes provide logic for each frame type.
- */
-class BodyHandler {
- public:
- virtual ~BodyHandler();
- virtual void handleBody(AMQBody* body);
-
- protected:
- virtual void handleMethod(AMQMethodBody*) = 0;
- virtual void handleHeader(AMQHeaderBody*) = 0;
- virtual void handleContent(AMQContentBody*) = 0;
- virtual void handleHeartbeat(AMQHeartbeatBody*) = 0;
-};
-
-}}
-
-
-#endif
diff --git a/cpp/src/qpid/framing/FieldTable.cpp b/cpp/src/qpid/framing/FieldTable.cpp
index f80d2f9fb1..0f7140b627 100644
--- a/cpp/src/qpid/framing/FieldTable.cpp
+++ b/cpp/src/qpid/framing/FieldTable.cpp
@@ -28,29 +28,93 @@
#include "qpid/Msg.h"
#include <assert.h>
+// The locking rationale in the FieldTable seems a little odd, but it
+// maintains the concurrent guarantees and requirements that were in
+// place before the cachedBytes/cachedSize were added:
+//
+// The FieldTable client code needs to make sure that they call no write
+// operation in parallel with any other operation on the FieldTable.
+// However multiple parallel read operations are safe.
+//
+// To this end the only code that is locked is code that can transparently
+// change the state of the FieldTable during a read only operation.
+// (In other words the code that required the mutable members in the class
+// definition!)
+//
namespace qpid {
+
+using sys::Mutex;
+using sys::ScopedLock;
+
namespace framing {
+FieldTable::FieldTable() :
+ cachedSize(0),
+ newBytes(false)
+{
+}
+
FieldTable::FieldTable(const FieldTable& ft)
{
- *this = ft;
+ ScopedLock<Mutex> l(ft.lock); // lock _source_ FieldTable
+
+ cachedBytes = ft.cachedBytes;
+ cachedSize = ft.cachedSize;
+ newBytes = ft.newBytes;
+
+ // Only copy the values if we have no raw data
+ // - copying the map is expensive and we can
+ // reconstruct it if necessary from the raw data
+ if (cachedBytes) {
+ newBytes = true;
+ return;
+ }
+ // In practice Encoding the source field table and only copying
+ // the encoded bytes is faster than copying the whole value map.
+ // (Because we nearly always copy a field table internally before
+ // encoding it to send, but don't change it after the copy)
+ if (!ft.values.empty()) {
+ // Side effect of getting encoded size will cache it in ft.cachedSize
+ ft.cachedBytes = boost::shared_array<uint8_t>(new uint8_t[ft.encodedSize()]);
+
+ Buffer buffer((char*)&ft.cachedBytes[0], ft.cachedSize);
+
+ // Cut and paste ahead...
+ buffer.putLong(ft.encodedSize() - 4);
+ buffer.putLong(ft.values.size());
+ for (ValueMap::const_iterator i = ft.values.begin(); i!=ft.values.end(); ++i) {
+ buffer.putShortString(i->first);
+ i->second->encode(buffer);
+ }
+
+ cachedBytes = ft.cachedBytes;
+ cachedSize = ft.cachedSize;
+ newBytes = true;
+ }
}
FieldTable& FieldTable::operator=(const FieldTable& ft)
{
- clear();
- values = ft.values;
- return *this;
+ FieldTable nft(ft);
+ values.swap(nft.values);
+ cachedBytes.swap(nft.cachedBytes);
+ cachedSize = nft.cachedSize;
+ newBytes = nft.newBytes;
+ return (*this);
}
-FieldTable::~FieldTable() {}
-
uint32_t FieldTable::encodedSize() const {
+ ScopedLock<Mutex> l(lock);
+
+ if (cachedSize != 0) {
+ return cachedSize;
+ }
uint32_t len(4/*size field*/ + 4/*count field*/);
for(ValueMap::const_iterator i = values.begin(); i != values.end(); ++i) {
// shortstr_len_byte + key size + value size
- len += 1 + (i->first).size() + (i->second)->encodedSize();
+ len += 1 + (i->first).size() + (i->second)->encodedSize();
}
+ cachedSize = len;
return len;
}
@@ -66,6 +130,7 @@ std::ostream& operator<<(std::ostream& out, const FieldTable::ValueMap::value_ty
}
std::ostream& operator<<(std::ostream& out, const FieldTable& t) {
+ t.realDecode();
out << "{";
FieldTable::ValueMap::const_iterator i = t.begin();
if (i != t.end()) out << *i++;
@@ -77,48 +142,70 @@ std::ostream& operator<<(std::ostream& out, const FieldTable& t) {
}
void FieldTable::set(const std::string& name, const ValuePtr& value){
+ realDecode();
values[name] = value;
+ flushRawCache();
}
void FieldTable::setString(const std::string& name, const std::string& value){
+ realDecode();
values[name] = ValuePtr(new Str16Value(value));
+ flushRawCache();
}
void FieldTable::setInt(const std::string& name, const int value){
+ realDecode();
values[name] = ValuePtr(new IntegerValue(value));
+ flushRawCache();
}
void FieldTable::setInt64(const std::string& name, const int64_t value){
+ realDecode();
values[name] = ValuePtr(new Integer64Value(value));
+ flushRawCache();
}
void FieldTable::setTimestamp(const std::string& name, const uint64_t value){
+ realDecode();
values[name] = ValuePtr(new TimeValue(value));
+ flushRawCache();
}
void FieldTable::setUInt64(const std::string& name, const uint64_t value){
+ realDecode();
values[name] = ValuePtr(new Unsigned64Value(value));
+ flushRawCache();
}
void FieldTable::setTable(const std::string& name, const FieldTable& value)
{
+ realDecode();
values[name] = ValuePtr(new FieldTableValue(value));
+ flushRawCache();
}
void FieldTable::setArray(const std::string& name, const Array& value)
{
+ realDecode();
values[name] = ValuePtr(new ArrayValue(value));
+ flushRawCache();
}
void FieldTable::setFloat(const std::string& name, const float value){
+ realDecode();
values[name] = ValuePtr(new FloatValue(value));
+ flushRawCache();
}
void FieldTable::setDouble(const std::string& name, double value){
+ realDecode();
values[name] = ValuePtr(new DoubleValue(value));
+ flushRawCache();
}
FieldTable::ValuePtr FieldTable::get(const std::string& name) const
{
+ // Ensure we have any values we're trying to read
+ realDecode();
ValuePtr value;
ValueMap::const_iterator i = values.find(name);
if ( i!=values.end() )
@@ -188,37 +275,82 @@ bool FieldTable::getDouble(const std::string& name, double& value) const {
//}
void FieldTable::encode(Buffer& buffer) const {
- buffer.putLong(encodedSize() - 4);
- buffer.putLong(values.size());
- for (ValueMap::const_iterator i = values.begin(); i!=values.end(); ++i) {
- buffer.putShortString(i->first);
- i->second->encode(buffer);
+ // If we've still got the input field table
+ // we can just copy it directly to the output
+ if (cachedBytes) {
+ ScopedLock<Mutex> l(lock);
+ buffer.putRawData(&cachedBytes[0], cachedSize);
+ } else {
+ buffer.putLong(encodedSize() - 4);
+ buffer.putLong(values.size());
+ for (ValueMap::const_iterator i = values.begin(); i!=values.end(); ++i) {
+ buffer.putShortString(i->first);
+ i->second->encode(buffer);
+ }
}
}
+// Decode lazily - just record the raw bytes until we need them
void FieldTable::decode(Buffer& buffer){
- clear();
if (buffer.available() < 4)
throw IllegalArgumentException(QPID_MSG("Not enough data for field table."));
+ uint32_t p = buffer.getPosition();
uint32_t len = buffer.getLong();
if (len) {
uint32_t available = buffer.available();
if ((available < len) || (available < 4))
throw IllegalArgumentException(QPID_MSG("Not enough data for field table."));
+ }
+ ScopedLock<Mutex> l(lock);
+ // Throw away previous stored values
+ values.clear();
+ // Copy data into our buffer
+ cachedBytes = boost::shared_array<uint8_t>(new uint8_t[len + 4]);
+ cachedSize = len + 4;
+ newBytes = true;
+ buffer.setPosition(p);
+ buffer.getRawData(&cachedBytes[0], cachedSize);
+}
+
+void FieldTable::realDecode() const
+{
+ ScopedLock<Mutex> l(lock);
+
+ // If we've got no raw data stored up then nothing to do
+ if (!newBytes)
+ return;
+
+ Buffer buffer((char*)&cachedBytes[0], cachedSize);
+ uint32_t len = buffer.getLong();
+ if (len) {
+ uint32_t available = buffer.available();
uint32_t count = buffer.getLong();
uint32_t leftover = available - len;
while(buffer.available() > leftover && count--){
std::string name;
ValuePtr value(new FieldValue);
-
+
buffer.getShortString(name);
value->decode(buffer);
values[name] = ValuePtr(value);
- }
+ }
}
+ newBytes = false;
+}
+
+void FieldTable::flushRawCache()
+{
+ ScopedLock<Mutex> l(lock);
+ // We can only flush the cache if there are no cached bytes to decode
+ assert(newBytes==false);
+ // Avoid recreating shared array unless we actually have one.
+ if (cachedBytes) cachedBytes.reset();
+ cachedSize = 0;
}
bool FieldTable::operator==(const FieldTable& x) const {
+ realDecode();
+ x.realDecode();
if (values.size() != x.values.size()) return false;
for (ValueMap::const_iterator i = values.begin(); i != values.end(); ++i) {
ValueMap::const_iterator j = x.values.find(i->first);
@@ -230,20 +362,73 @@ bool FieldTable::operator==(const FieldTable& x) const {
void FieldTable::erase(const std::string& name)
{
- if (values.find(name) != values.end())
+ realDecode();
+ if (values.find(name) != values.end()) {
values.erase(name);
+ flushRawCache();
+ }
+}
+
+void FieldTable::clear()
+{
+ values.clear();
+ newBytes = false;
+ flushRawCache();
+}
+
+// Map-like interface.
+FieldTable::ValueMap::const_iterator FieldTable::begin() const
+{
+ realDecode();
+ return values.begin();
+}
+
+FieldTable::ValueMap::const_iterator FieldTable::end() const
+{
+ realDecode();
+ return values.end();
+}
+
+FieldTable::ValueMap::const_iterator FieldTable::find(const std::string& s) const
+{
+ realDecode();
+ return values.find(s);
+}
+
+FieldTable::ValueMap::iterator FieldTable::begin()
+{
+ realDecode();
+ flushRawCache();
+ return values.begin();
+}
+
+FieldTable::ValueMap::iterator FieldTable::end()
+{
+ realDecode();
+ flushRawCache();
+ return values.end();
+}
+
+FieldTable::ValueMap::iterator FieldTable::find(const std::string& s)
+{
+ realDecode();
+ flushRawCache();
+ return values.find(s);
}
std::pair<FieldTable::ValueMap::iterator, bool> FieldTable::insert(const ValueMap::value_type& value)
{
+ realDecode();
+ flushRawCache();
return values.insert(value);
}
FieldTable::ValueMap::iterator FieldTable::insert(ValueMap::iterator position, const ValueMap::value_type& value)
{
+ realDecode();
+ flushRawCache();
return values.insert(position, value);
}
-
}
}
diff --git a/cpp/src/qpid/framing/FrameSet.cpp b/cpp/src/qpid/framing/FrameSet.cpp
index 255aaf6e6b..9aee7b98b9 100644
--- a/cpp/src/qpid/framing/FrameSet.cpp
+++ b/cpp/src/qpid/framing/FrameSet.cpp
@@ -26,7 +26,6 @@
#include "qpid/framing/TypeFilter.h"
using namespace qpid::framing;
-using namespace boost;
FrameSet::FrameSet(const SequenceNumber& _id) : id(_id),contentSize(0),recalculateSize(true) { }
FrameSet::FrameSet(const FrameSet& original) : id(original.id), contentSize(0), recalculateSize(true)
@@ -103,3 +102,7 @@ std::string FrameSet::getContent() const {
getContent(out);
return out;
}
+
+bool FrameSet::hasContent() const {
+ return parts.size() >= 3;
+}
diff --git a/cpp/src/qpid/framing/FrameSet.h b/cpp/src/qpid/framing/FrameSet.h
index cae75e5ec8..3b9f60950b 100644
--- a/cpp/src/qpid/framing/FrameSet.h
+++ b/cpp/src/qpid/framing/FrameSet.h
@@ -54,6 +54,7 @@ public:
QPID_COMMON_EXTERN void getContent(std::string&) const;
QPID_COMMON_EXTERN std::string getContent() const;
+ QPID_COMMON_EXTERN bool hasContent() const;
bool isContentBearing() const;
diff --git a/cpp/src/qpid/framing/MethodContent.h b/cpp/src/qpid/framing/MethodContent.h
index b290a0c140..58c9143cfa 100644
--- a/cpp/src/qpid/framing/MethodContent.h
+++ b/cpp/src/qpid/framing/MethodContent.h
@@ -32,7 +32,7 @@ class MethodContent
public:
virtual ~MethodContent() {}
//TODO: rethink this interface
- virtual AMQHeaderBody getHeader() const = 0;
+ virtual const AMQHeaderBody& getHeader() const = 0;
virtual const std::string& getData() const = 0;
};
diff --git a/cpp/src/qpid/framing/TransferContent.cpp b/cpp/src/qpid/framing/TransferContent.cpp
index 837d7d346a..d997b24304 100644
--- a/cpp/src/qpid/framing/TransferContent.cpp
+++ b/cpp/src/qpid/framing/TransferContent.cpp
@@ -30,7 +30,7 @@ TransferContent::TransferContent(const std::string& data, const std::string& key
}
-AMQHeaderBody TransferContent::getHeader() const
+const AMQHeaderBody& TransferContent::getHeader() const
{
return header;
}
diff --git a/cpp/src/qpid/framing/TransferContent.h b/cpp/src/qpid/framing/TransferContent.h
index 9a698a1823..32663d7020 100644
--- a/cpp/src/qpid/framing/TransferContent.h
+++ b/cpp/src/qpid/framing/TransferContent.h
@@ -40,7 +40,7 @@ public:
QPID_COMMON_EXTERN TransferContent(const std::string& data = std::string(), const std::string& key=std::string());
///@internal
- QPID_COMMON_EXTERN AMQHeaderBody getHeader() const;
+ QPID_COMMON_EXTERN const AMQHeaderBody& getHeader() const;
QPID_COMMON_EXTERN void setData(const std::string&);
QPID_COMMON_EXTERN const std::string& getData() const;
diff --git a/cpp/src/qpid/framing/amqp_framing.h b/cpp/src/qpid/framing/amqp_framing.h
index 3a8b39afb5..2e58922364 100644
--- a/cpp/src/qpid/framing/amqp_framing.h
+++ b/cpp/src/qpid/framing/amqp_framing.h
@@ -21,7 +21,6 @@
#include "qpid/framing/amqp_types.h"
#include "qpid/framing/AMQFrame.h"
#include "qpid/framing/AMQBody.h"
-#include "qpid/framing/BodyHandler.h"
#include "qpid/framing/AMQMethodBody.h"
#include "qpid/framing/AMQHeaderBody.h"
#include "qpid/framing/AMQContentBody.h"
diff --git a/cpp/src/qpid/ha/Backup.cpp b/cpp/src/qpid/ha/Backup.cpp
index 5acbfb9d5f..3f3fa87a01 100644
--- a/cpp/src/qpid/ha/Backup.cpp
+++ b/cpp/src/qpid/ha/Backup.cpp
@@ -19,10 +19,11 @@
*
*/
#include "Backup.h"
-#include "Settings.h"
#include "BrokerReplicator.h"
-#include "ReplicatingSubscription.h"
#include "ConnectionExcluder.h"
+#include "HaBroker.h"
+#include "ReplicatingSubscription.h"
+#include "Settings.h"
#include "qpid/Url.h"
#include "qpid/amqp_0_10/Codecs.h"
#include "qpid/broker/Bridge.h"
@@ -43,37 +44,44 @@ using namespace broker;
using types::Variant;
using std::string;
-Backup::Backup(broker::Broker& b, const Settings& s) :
- broker(b), settings(s), excluder(new ConnectionExcluder())
+Backup::Backup(HaBroker& hb, const Settings& s) :
+ haBroker(hb), broker(hb.getBroker()), settings(s), excluder(new ConnectionExcluder())
{
+ // Exclude client connections before starting the link to avoid self-connection.
+ broker.getConnectionObservers().add(excluder);
// Empty brokerUrl means delay initialization until setUrl() is called.
if (!s.brokerUrl.empty()) initialize(Url(s.brokerUrl));
}
void Backup::initialize(const Url& url) {
- assert(!url.empty());
- QPID_LOG(notice, "Ha: Backup started: " << url);
+ if (url.empty()) throw Url::Invalid("HA broker URL is empty");
+ QPID_LOG(notice, "HA: Backup initialized: " << url);
string protocol = url[0].protocol.empty() ? "tcp" : url[0].protocol;
// Declare the link
std::pair<Link::shared_ptr, bool> result = broker.getLinks().declare(
url[0].host, url[0].port, protocol,
false, // durable
settings.mechanism, settings.username, settings.password);
- assert(result.second); // FIXME aconway 2011-11-23: error handling
link = result.first;
link->setUrl(url);
-
- replicator.reset(new BrokerReplicator(link));
+ replicator.reset(new BrokerReplicator(haBroker, link));
broker.getExchanges().registerExchange(replicator);
- broker.getConnectionObservers().add(excluder);
}
+Backup::~Backup() {
+ if (link) link->close();
+ if (replicator.get()) broker.getExchanges().destroy(replicator->getName());
+ replicator.reset();
+ broker.getConnectionObservers().remove(excluder); // This allows client connections.
+}
+
+
void Backup::setBrokerUrl(const Url& url) {
// Ignore empty URLs seen during start-up for some tests.
if (url.empty()) return;
sys::Mutex::ScopedLock l(lock);
if (link) { // URL changed after we initialized.
- QPID_LOG(info, "HA: Backup failover URL set to " << url);
+ QPID_LOG(info, "HA: Backup broker URL set to " << url);
link->setUrl(url);
}
else {
@@ -81,10 +89,4 @@ void Backup::setBrokerUrl(const Url& url) {
}
}
-Backup::~Backup() {
- if (link) link->close();
- if (replicator.get()) broker.getExchanges().destroy(replicator->getName());
- broker.getConnectionObservers().remove(excluder); // This allows client connections.
-}
-
}} // namespace qpid::ha
diff --git a/cpp/src/qpid/ha/Backup.h b/cpp/src/qpid/ha/Backup.h
index 526b238b82..6c36996914 100644
--- a/cpp/src/qpid/ha/Backup.h
+++ b/cpp/src/qpid/ha/Backup.h
@@ -38,6 +38,7 @@ namespace ha {
class Settings;
class ConnectionExcluder;
class BrokerReplicator;
+class HaBroker;
/**
* State associated with a backup broker. Manages connections to primary.
@@ -47,7 +48,7 @@ class BrokerReplicator;
class Backup
{
public:
- Backup(broker::Broker&, const Settings&);
+ Backup(HaBroker&, const Settings&);
~Backup();
void setBrokerUrl(const Url&);
@@ -55,6 +56,7 @@ class Backup
void initialize(const Url&);
sys::Mutex lock;
+ HaBroker& haBroker;
broker::Broker& broker;
Settings settings;
boost::shared_ptr<broker::Link> link;
diff --git a/cpp/src/qpid/ha/BrokerReplicator.cpp b/cpp/src/qpid/ha/BrokerReplicator.cpp
index a8f05c1fe3..d0c99cbdb6 100644
--- a/cpp/src/qpid/ha/BrokerReplicator.cpp
+++ b/cpp/src/qpid/ha/BrokerReplicator.cpp
@@ -19,6 +19,7 @@
*
*/
#include "BrokerReplicator.h"
+#include "HaBroker.h"
#include "QueueReplicator.h"
#include "qpid/broker/Broker.h"
#include "qpid/broker/Queue.h"
@@ -37,6 +38,7 @@
#include "qmf/org/apache/qpid/broker/EventQueueDelete.h"
#include "qmf/org/apache/qpid/broker/EventSubscribe.h"
#include <algorithm>
+#include <sstream>
namespace qpid {
namespace ha {
@@ -87,6 +89,7 @@ const string QUEUE("queue");
const string RHOST("rhost");
const string TYPE("type");
const string USER("user");
+const string HA_BROKER("habroker");
const string AGENT_IND_EVENT_ORG_APACHE_QPID_BROKER("agent.ind.event.org_apache_qpid_broker.#");
const string QMF2("qmf2");
@@ -100,6 +103,7 @@ const string _PACKAGE_NAME("_package_name");
const string _SCHEMA_ID("_schema_id");
const string OBJECT("OBJECT");
const string ORG_APACHE_QPID_BROKER("org.apache.qpid.broker");
+const string ORG_APACHE_QPID_HA("org.apache.qpid.ha");
const string QMF_DEFAULT_DIRECT("qmf.default.direct");
const string _QUERY_REQUEST("_query_request");
const string BROKER("broker");
@@ -113,36 +117,13 @@ template <class T> bool match(Variant::Map& schema) {
return T::match(schema[CLASS_NAME], schema[PACKAGE_NAME]);
}
-enum ReplicateLevel { RL_NONE=0, RL_CONFIGURATION, RL_MESSAGES };
-const string S_NONE="none";
-const string S_CONFIGURATION="configuration";
-const string S_MESSAGES="messages";
-
-ReplicateLevel replicateLevel(const string& level) {
- if (level == S_NONE) return RL_NONE;
- if (level == S_CONFIGURATION) return RL_CONFIGURATION;
- if (level == S_MESSAGES) return RL_MESSAGES;
- throw Exception("Invalid value for "+QPID_REPLICATE+": "+level);
-}
-
-ReplicateLevel replicateLevel(const framing::FieldTable& f) {
- if (f.isSet(QPID_REPLICATE)) return replicateLevel(f.getAsString(QPID_REPLICATE));
- else return RL_NONE;
-}
-
-ReplicateLevel replicateLevel(const Variant::Map& m) {
- Variant::Map::const_iterator i = m.find(QPID_REPLICATE);
- if (i != m.end()) return replicateLevel(i->second.asString());
- else return RL_NONE;
-}
-
-void sendQuery(const string className, const string& queueName, SessionHandler& sessionHandler) {
+void sendQuery(const string& packageName, const string& className, const string& queueName, SessionHandler& sessionHandler) {
framing::AMQP_ServerProxy peer(sessionHandler.out);
Variant::Map request;
request[_WHAT] = OBJECT;
Variant::Map schema;
schema[_CLASS_NAME] = className;
- schema[_PACKAGE_NAME] = ORG_APACHE_QPID_BROKER;
+ schema[_PACKAGE_NAME] = packageName;
request[_SCHEMA_ID] = schema;
AMQFrame method((MessageTransferBody(ProtocolVersion(), QMF_DEFAULT_DIRECT, 0, 0)));
@@ -181,13 +162,34 @@ Variant::Map asMapVoid(const Variant& value) {
} // namespace
+
+ReplicateLevel BrokerReplicator::replicateLevel(const std::string& str) {
+ ReplicateLevel rl;
+ if (qpid::ha::replicateLevel(str, rl)) return rl;
+ else return haBroker.getSettings().replicateDefault;
+}
+
+ReplicateLevel BrokerReplicator::replicateLevel(const framing::FieldTable& f) {
+ if (f.isSet(QPID_REPLICATE))
+ return replicateLevel(f.getAsString(QPID_REPLICATE));
+ else
+ return haBroker.getSettings().replicateDefault;
+}
+
+ReplicateLevel BrokerReplicator::replicateLevel(const Variant::Map& m) {
+ Variant::Map::const_iterator i = m.find(QPID_REPLICATE);
+ if (i != m.end())
+ return replicateLevel(i->second.asString());
+ else
+ return haBroker.getSettings().replicateDefault;
+}
+
BrokerReplicator::~BrokerReplicator() {}
-BrokerReplicator::BrokerReplicator(const boost::shared_ptr<Link>& l)
- : Exchange(QPID_CONFIGURATION_REPLICATOR), broker(*l->getBroker()), link(l)
+BrokerReplicator::BrokerReplicator(HaBroker& hb, const boost::shared_ptr<Link>& l)
+ : Exchange(QPID_CONFIGURATION_REPLICATOR),
+ haBroker(hb), broker(hb.getBroker()), link(l)
{
- QPID_LOG(info, "HA: Backup replicating from " <<
- link->getTransport() << ":" << link->getHost() << ":" << link->getPort());
broker.getLinks().declare(
link->getHost(), link->getPort(),
false, // durable
@@ -211,22 +213,26 @@ void BrokerReplicator::initializeBridge(Bridge& bridge, SessionHandler& sessionH
const qmf::org::apache::qpid::broker::ArgsLinkBridge& args(bridge.getArgs());
//declare and bind an event queue
- peer.getQueue().declare(queueName, "", false, false, true, true, FieldTable());
+ FieldTable declareArgs;
+ declareArgs.setString(QPID_REPLICATE, str(RL_NONE));
+ peer.getQueue().declare(queueName, "", false, false, true, true, declareArgs);
peer.getExchange().bind(queueName, QMF_DEFAULT_TOPIC, AGENT_IND_EVENT_ORG_APACHE_QPID_BROKER, FieldTable());
//subscribe to the queue
peer.getMessage().subscribe(queueName, args.i_dest, 1, 0, false, "", 0, FieldTable());
peer.getMessage().flow(args.i_dest, 0, 0xFFFFFFFF);
peer.getMessage().flow(args.i_dest, 1, 0xFFFFFFFF);
- //issue a query request for queues and another for exchanges using event queue as the reply-to address
- sendQuery(QUEUE, queueName, sessionHandler);
- sendQuery(EXCHANGE, queueName, sessionHandler);
- sendQuery(BINDING, queueName, sessionHandler);
- QPID_LOG(debug, "HA: Backup activated configuration bridge: " << queueName);
+ // Issue a query request for queues, exchanges, bindings and the habroker
+ // using event queue as the reply-to address
+ sendQuery(ORG_APACHE_QPID_HA, HA_BROKER, queueName, sessionHandler);
+ sendQuery(ORG_APACHE_QPID_BROKER, QUEUE, queueName, sessionHandler);
+ sendQuery(ORG_APACHE_QPID_BROKER, EXCHANGE, queueName, sessionHandler);
+ sendQuery(ORG_APACHE_QPID_BROKER, BINDING, queueName, sessionHandler);
+ QPID_LOG(debug, "HA: Backup configuration bridge: " << queueName);
}
-// FIXME aconway 2011-12-02: error handling in route.
-void BrokerReplicator::route(Deliverable& msg, const string& /*key*/, const framing::FieldTable* headers) {
+void BrokerReplicator::route(Deliverable& msg) {
+ const framing::FieldTable* headers = msg.getMessage().getApplicationHeaders();
Variant::List list;
try {
if (!isQMFv2(msg.getMessage()) || !headers)
@@ -238,6 +244,7 @@ void BrokerReplicator::route(Deliverable& msg, const string& /*key*/, const fram
if (headers->getAsString(QMF_CONTENT) == EVENT) {
for (Variant::List::iterator i = list.begin(); i != list.end(); ++i) {
Variant::Map& map = i->asMap();
+ QPID_LOG(trace, "HA: Backup received event: " << map);
Variant::Map& schema = map[SCHEMA_ID].asMap();
Variant::Map& values = map[VALUES].asMap();
if (match<EventQueueDeclare>(schema)) doEventQueueDeclare(values);
@@ -249,19 +256,22 @@ void BrokerReplicator::route(Deliverable& msg, const string& /*key*/, const fram
}
} else if (headers->getAsString(QMF_OPCODE) == QUERY_RESPONSE) {
for (Variant::List::iterator i = list.begin(); i != list.end(); ++i) {
- string type = i->asMap()[SCHEMA_ID].asMap()[CLASS_NAME];
- Variant::Map& values = i->asMap()[VALUES].asMap();
+ Variant::Map& map = i->asMap();
+ QPID_LOG(trace, "HA: Backup received event: " << map);
+ string type = map[SCHEMA_ID].asMap()[CLASS_NAME];
+ Variant::Map& values = map[VALUES].asMap();
framing::FieldTable args;
amqp_0_10::translate(asMapVoid(values[ARGUMENTS]), args);
if (type == QUEUE) doResponseQueue(values);
else if (type == EXCHANGE) doResponseExchange(values);
else if (type == BINDING) doResponseBind(values);
- else QPID_LOG(error, "HA: Backup received unknown response type=" << type
- << " values=" << values);
+ else if (type == HA_BROKER) doResponseHaBroker(values);
}
- } else QPID_LOG(error, "HA: Backup received unexpected message: " << *headers);
+ }
} catch (const std::exception& e) {
- QPID_LOG(error, "HA: Backup replication error: " << e.what() << ": while handling: " << list);
+ QPID_LOG(critical, "HA: Backup configuration failed: " << e.what()
+ << ": while handling: " << list);
+ throw;
}
}
@@ -282,15 +292,13 @@ void BrokerReplicator::doEventQueueDeclare(Variant::Map& values) {
values[USER].asString(),
values[RHOST].asString());
if (result.second) {
- // FIXME aconway 2011-11-22: should delete old queue and
- // re-create from event.
- // Events are always up to date, whereas responses may be
- // out of date.
- QPID_LOG(debug, "HA: Backup created queue: " << name);
+ QPID_LOG(debug, "HA: Backup queue declare event: " << name);
startQueueReplicator(result.first);
} else {
// FIXME aconway 2011-12-02: what's the right way to handle this?
- QPID_LOG(warning, "HA: Backup queue already exists: " << name);
+ // Should we delete the old & re-create form the event? Responses
+ // may be old but events are always up-to-date.
+ QPID_LOG(warning, "HA: Backup queue declare event, already exists: " << name);
}
}
}
@@ -300,8 +308,11 @@ void BrokerReplicator::doEventQueueDelete(Variant::Map& values) {
// sessions may be closed by a "queue deleted" exception.
string name = values[QNAME].asString();
boost::shared_ptr<Queue> queue = broker.getQueues().find(name);
- if (queue && replicateLevel(queue->getSettings())) {
- QPID_LOG(debug, "HA: Backup deleting queue: " << name);
+ if (!queue) {
+ QPID_LOG(warning, "HA: Backup queue delete event, does not exist: " << name);
+ } else if (!replicateLevel(queue->getSettings())) {
+ QPID_LOG(warning, "HA: Backup queue delete event, not replicated: " << name);
+ } else {
string rname = QueueReplicator::replicatorName(name);
boost::shared_ptr<broker::Exchange> ex = broker.getExchanges().find(rname);
boost::shared_ptr<QueueReplicator> qr = boost::dynamic_pointer_cast<QueueReplicator>(ex);
@@ -310,6 +321,7 @@ void BrokerReplicator::doEventQueueDelete(Variant::Map& values) {
// actually be destroyed, deleting the exhange
broker.getExchanges().destroy(rname);
broker.deleteQueue(name, values[USER].asString(), values[RHOST].asString());
+ QPID_LOG(debug, "HA: Backup queue delete event: " << name);
}
}
@@ -328,27 +340,29 @@ void BrokerReplicator::doEventExchangeDeclare(Variant::Map& values) {
values[USER].asString(),
values[RHOST].asString()).second)
{
- QPID_LOG(debug, "HA: Backup created exchange: " << name);
+ QPID_LOG(debug, "HA: Backup exchange declare event: " << name);
} else {
- // FIXME aconway 2011-11-22: should delete pre-exisitng exchange
+ // FIXME aconway 2011-11-22: should delete pre-existing exchange
// and re-create from event. See comment in doEventQueueDeclare.
- QPID_LOG(warning, "HA: Backup exchange already exists: " << name);
+ QPID_LOG(debug, "HA: Backup exchange declare event, already exists: " << name);
}
}
}
void BrokerReplicator::doEventExchangeDelete(Variant::Map& values) {
string name = values[EXNAME].asString();
- try {
- boost::shared_ptr<Exchange> exchange = broker.getExchanges().find(name);
- if (exchange && replicateLevel(exchange->getArgs())) {
- QPID_LOG(debug, "HA: Backup deleting exchange:" << name);
- broker.deleteExchange(
- name,
- values[USER].asString(),
- values[RHOST].asString());
- }
- } catch (const framing::NotFoundException&) {}
+ boost::shared_ptr<Exchange> exchange = broker.getExchanges().find(name);
+ if (!exchange) {
+ QPID_LOG(warning, "HA: Backup exchange delete event, does not exist: " << name);
+ } else if (!replicateLevel(exchange->getArgs())) {
+ QPID_LOG(warning, "HA: Backup exchange delete event, not replicated: " << name);
+ } else {
+ QPID_LOG(debug, "HA: Backup exchange delete event:" << name);
+ broker.deleteExchange(
+ name,
+ values[USER].asString(),
+ values[RHOST].asString());
+ }
}
void BrokerReplicator::doEventBind(Variant::Map& values) {
@@ -364,10 +378,10 @@ void BrokerReplicator::doEventBind(Variant::Map& values) {
framing::FieldTable args;
amqp_0_10::translate(asMapVoid(values[ARGS]), args);
string key = values[KEY].asString();
- QPID_LOG(debug, "HA: Backup replicated binding exchange=" << exchange->getName()
+ exchange->bind(queue, key, &args);
+ QPID_LOG(debug, "HA: Backup bind event: exchange=" << exchange->getName()
<< " queue=" << queue->getName()
<< " key=" << key);
- exchange->bind(queue, key, &args);
}
}
@@ -384,15 +398,14 @@ void BrokerReplicator::doEventUnbind(Variant::Map& values) {
framing::FieldTable args;
amqp_0_10::translate(asMapVoid(values[ARGS]), args);
string key = values[KEY].asString();
- QPID_LOG(debug, "HA: Backup replicated unbinding exchange=" << exchange->getName()
+ exchange->unbind(queue, key, &args);
+ QPID_LOG(debug, "HA: Backup unbind event: exchange=" << exchange->getName()
<< " queue=" << queue->getName()
<< " key=" << key);
- exchange->unbind(queue, key, &args);
}
}
void BrokerReplicator::doResponseQueue(Variant::Map& values) {
- // FIXME aconway 2011-11-22: more flexible ways & defaults to indicate replication
Variant::Map argsMap(asMapVoid(values[ARGUMENTS]));
if (!replicateLevel(argsMap)) return;
framing::FieldTable args;
@@ -409,12 +422,12 @@ void BrokerReplicator::doResponseQueue(Variant::Map& values) {
""/*TODO: who is the user?*/,
""/*TODO: what should we use as connection id?*/);
if (result.second) {
- QPID_LOG(debug, "HA: Backup created catch-up queue: " << values[NAME]);
+ QPID_LOG(debug, "HA: Backup queue response: " << name);
startQueueReplicator(result.first);
} else {
// FIXME aconway 2011-11-22: Normal to find queue already
// exists if we're failing over.
- QPID_LOG(warning, "HA: Backup catch-up queue already exists: " << name);
+ QPID_LOG(warning, "HA: Backup queue response, already exists: " << name);
}
}
@@ -432,9 +445,10 @@ void BrokerReplicator::doResponseExchange(Variant::Map& values) {
""/*TODO: who is the user?*/,
""/*TODO: what should we use as connection id?*/).second)
{
- QPID_LOG(debug, "HA: Backup catch-up exchange: " << values[NAME]);
+ QPID_LOG(debug, "HA: Backup exchange response: " << values[NAME].asString());
} else {
- QPID_LOG(warning, "HA: Backup catch-up exchange already exists: " << values[QNAME]);
+ QPID_LOG(warning, "HA: Backup exchange query, already exists: " <<
+ values[QNAME].asString());
}
}
@@ -464,7 +478,6 @@ void BrokerReplicator::doResponseBind(Variant::Map& values) {
std::string qName = getRefName(QUEUE_REF_PREFIX, values[QUEUE_REF]);
boost::shared_ptr<Exchange> exchange = broker.getExchanges().find(exName);
boost::shared_ptr<Queue> queue = broker.getQueues().find(qName);
- // FIXME aconway 2011-11-24: more flexible configuration for binding replication.
// Automatically replicate binding if queue and exchange exist and are replicated
if (exchange && replicateLevel(exchange->getArgs()) &&
@@ -474,16 +487,39 @@ void BrokerReplicator::doResponseBind(Variant::Map& values) {
amqp_0_10::translate(asMapVoid(values[ARGUMENTS]), args);
string key = values[KEY].asString();
exchange->bind(queue, key, &args);
- QPID_LOG(debug, "HA: Backup catch-up binding: exchange=" << exchange->getName()
+ QPID_LOG(debug, "HA: Backup bind response: exchange=" << exchange->getName()
<< " queue=" << queue->getName()
<< " key=" << key);
}
}
+namespace {
+const string REPLICATE_DEFAULT="replicateDefault";
+}
+
+// Received the ha-broker configuration object for the primary broker.
+void BrokerReplicator::doResponseHaBroker(Variant::Map& values) {
+ try {
+ ReplicateLevel mine = haBroker.getSettings().replicateDefault;
+ ReplicateLevel primary = replicateLevel(values[REPLICATE_DEFAULT].asString());
+ if (mine != primary) {
+ std::ostringstream os;
+ os << "Replicate default on backup (" << mine
+ << ") does not match primary (" << primary << ")";
+ haBroker.shutdown(os.str());
+ }
+ } catch (const std::exception& e) {
+ std::ostringstream os;
+ os << "Received invalid replicate default from primary: " << e.what();
+ haBroker.shutdown(os.str());
+ }
+}
+
void BrokerReplicator::startQueueReplicator(const boost::shared_ptr<Queue>& queue) {
- if (replicateLevel(queue->getSettings()) == RL_MESSAGES) {
+ if (replicateLevel(queue->getSettings()) == RL_ALL) {
boost::shared_ptr<QueueReplicator> qr(new QueueReplicator(queue, link));
- broker.getExchanges().registerExchange(qr);
+ if (!broker.getExchanges().registerExchange(qr))
+ throw Exception(QPID_MSG("Duplicate queue replicator " << qr->getName()));
qr->activate();
}
}
diff --git a/cpp/src/qpid/ha/BrokerReplicator.h b/cpp/src/qpid/ha/BrokerReplicator.h
index cfb6cf9a28..c9d7b9f74c 100644
--- a/cpp/src/qpid/ha/BrokerReplicator.h
+++ b/cpp/src/qpid/ha/BrokerReplicator.h
@@ -22,6 +22,7 @@
*
*/
+#include "ReplicateLevel.h"
#include "qpid/broker/Exchange.h"
#include "qpid/types/Variant.h"
#include <boost/shared_ptr.hpp>
@@ -35,7 +36,12 @@ class Bridge;
class SessionHandler;
}
+namespace framing {
+class FieldTable;
+}
+
namespace ha {
+class HaBroker;
/**
* Replicate configuration on a backup broker.
@@ -51,19 +57,23 @@ namespace ha {
class BrokerReplicator : public broker::Exchange
{
public:
- BrokerReplicator(const boost::shared_ptr<broker::Link>&);
+ BrokerReplicator(HaBroker&, const boost::shared_ptr<broker::Link>&);
~BrokerReplicator();
std::string getType() const;
// Exchange methods
bool bind(boost::shared_ptr<broker::Queue>, const std::string&, const framing::FieldTable*);
bool unbind(boost::shared_ptr<broker::Queue>, const std::string&, const framing::FieldTable*);
- void route(broker::Deliverable&, const std::string&, const framing::FieldTable*);
+ void route(broker::Deliverable&);
bool isBound(boost::shared_ptr<broker::Queue>, const std::string* const, const framing::FieldTable* const);
private:
void initializeBridge(broker::Bridge&, broker::SessionHandler&);
+ ReplicateLevel replicateLevel(const std::string&);
+ ReplicateLevel replicateLevel(const framing::FieldTable& args);
+ ReplicateLevel replicateLevel(const types::Variant::Map& args);
+
void doEventQueueDeclare(types::Variant::Map& values);
void doEventQueueDelete(types::Variant::Map& values);
void doEventExchangeDeclare(types::Variant::Map& values);
@@ -74,9 +84,11 @@ class BrokerReplicator : public broker::Exchange
void doResponseQueue(types::Variant::Map& values);
void doResponseExchange(types::Variant::Map& values);
void doResponseBind(types::Variant::Map& values);
+ void doResponseHaBroker(types::Variant::Map& values);
void startQueueReplicator(const boost::shared_ptr<broker::Queue>&);
+ HaBroker& haBroker;
broker::Broker& broker;
boost::shared_ptr<broker::Link> link;
};
diff --git a/cpp/src/qpid/ha/HaBroker.cpp b/cpp/src/qpid/ha/HaBroker.cpp
index 0d3bd51439..7d82fb63bd 100644
--- a/cpp/src/qpid/ha/HaBroker.cpp
+++ b/cpp/src/qpid/ha/HaBroker.cpp
@@ -25,10 +25,15 @@
#include "ReplicatingSubscription.h"
#include "qpid/Exception.h"
#include "qpid/broker/Broker.h"
+#include "qpid/broker/Link.h"
+#include "qpid/broker/Queue.h"
+#include "qpid/broker/SignalHandler.h"
#include "qpid/management/ManagementAgent.h"
#include "qmf/org/apache/qpid/ha/Package.h"
-#include "qmf/org/apache/qpid/ha/ArgsHaBrokerSetClientAddresses.h"
-#include "qmf/org/apache/qpid/ha/ArgsHaBrokerSetBrokerAddresses.h"
+#include "qmf/org/apache/qpid/ha/ArgsHaBrokerReplicate.h"
+#include "qmf/org/apache/qpid/ha/ArgsHaBrokerSetBrokers.h"
+#include "qmf/org/apache/qpid/ha/ArgsHaBrokerSetPublicBrokers.h"
+#include "qmf/org/apache/qpid/ha/ArgsHaBrokerSetExpectedBackups.h"
#include "qpid/log/Statement.h"
namespace qpid {
@@ -40,8 +45,10 @@ using namespace std;
namespace {
-const std::string PRIMARY="primary";
+const std::string STANDALONE="standalone";
+const std::string CATCH_UP="catch-up";
const std::string BACKUP="backup";
+const std::string PRIMARY="primary";
} // namespace
@@ -49,7 +56,6 @@ const std::string BACKUP="backup";
HaBroker::HaBroker(broker::Broker& b, const Settings& s)
: broker(b),
settings(s),
- backup(new Backup(b, s)),
mgmtObject(0)
{
// Register a factory for replicating subscriptions.
@@ -62,15 +68,20 @@ HaBroker::HaBroker(broker::Broker& b, const Settings& s)
ManagementAgent* ma = broker.getManagementAgent();
if (!ma)
throw Exception("Cannot start HA: management is disabled");
- if (ma) {
- _qmf::Package packageInit(ma);
- mgmtObject = new _qmf::HaBroker(ma, this, "ha-broker");
- mgmtObject->set_status(BACKUP);
- ma->addObject(mgmtObject);
- }
+ _qmf::Package packageInit(ma);
+ mgmtObject = new _qmf::HaBroker(ma, this, "ha-broker");
+ mgmtObject->set_status(settings.cluster ? BACKUP : STANDALONE);
+ mgmtObject->set_replicateDefault(str(settings.replicateDefault));
+ ma->addObject(mgmtObject);
+
+ // NOTE: lock is not needed in a constructor but we created it just to pass
+ // to the set functions.
sys::Mutex::ScopedLock l(lock);
if (!settings.clientUrl.empty()) setClientUrl(Url(settings.clientUrl), l);
if (!settings.brokerUrl.empty()) setBrokerUrl(Url(settings.brokerUrl), l);
+
+ // If we are in a cluster, we start in backup mode.
+ if (settings.cluster) backup.reset(new Backup(*this, s));
}
HaBroker::~HaBroker() {}
@@ -80,26 +91,47 @@ Manageable::status_t HaBroker::ManagementMethod (uint32_t methodId, Args& args,
switch (methodId) {
case _qmf::HaBroker::METHOD_PROMOTE: {
if (backup.get()) { // I am a backup
- // FIXME aconway 2012-01-26: create primary state before resetting backup
- // as that allows client connections.
+ // NOTE: resetting backup allows client connections, so any
+ // primary state should be set up here before backup.reset()
backup.reset();
- QPID_LOG(notice, "HA: Primary promoted from backup");
+ QPID_LOG(notice, "HA: Promoted to primary");
mgmtObject->set_status(PRIMARY);
}
break;
}
- case _qmf::HaBroker::METHOD_SETCLIENTADDRESSES: {
- setClientUrl(
- Url(dynamic_cast<_qmf::ArgsHaBrokerSetClientAddresses&>(args).
- i_clientAddresses), l);
+ case _qmf::HaBroker::METHOD_SETBROKERS: {
+ setBrokerUrl(Url(dynamic_cast<_qmf::ArgsHaBrokerSetBrokers&>(args).i_url), l);
+ break;
+ }
+ case _qmf::HaBroker::METHOD_SETPUBLICBROKERS: {
+ setClientUrl(Url(dynamic_cast<_qmf::ArgsHaBrokerSetPublicBrokers&>(args).i_url), l);
break;
}
- case _qmf::HaBroker::METHOD_SETBROKERADDRESSES: {
- setBrokerUrl(
- Url(dynamic_cast<_qmf::ArgsHaBrokerSetBrokerAddresses&>(args)
- .i_brokerAddresses), l);
+ case _qmf::HaBroker::METHOD_SETEXPECTEDBACKUPS: {
+ setExpectedBackups(dynamic_cast<_qmf::ArgsHaBrokerSetExpectedBackups&>(args).i_expectedBackups, l);
+ break;
+ }
+ case _qmf::HaBroker::METHOD_REPLICATE: {
+ _qmf::ArgsHaBrokerReplicate& bq_args =
+ dynamic_cast<_qmf::ArgsHaBrokerReplicate&>(args);
+ QPID_LOG(debug, "HA replicating individual queue "<< bq_args.i_queue << " from " << bq_args.i_broker);
+
+ boost::shared_ptr<broker::Queue> queue = broker.getQueues().get(bq_args.i_queue);
+ Url url(bq_args.i_broker);
+ string protocol = url[0].protocol.empty() ? "tcp" : url[0].protocol;
+ std::pair<broker::Link::shared_ptr, bool> result = broker.getLinks().declare(
+ url[0].host, url[0].port, protocol,
+ false, // durable
+ settings.mechanism, settings.username, settings.password);
+ boost::shared_ptr<broker::Link> link = result.first;
+ link->setUrl(url);
+ // Create a queue replicator
+ boost::shared_ptr<QueueReplicator> qr(new QueueReplicator(queue, link));
+ qr->activate();
+ broker.getExchanges().registerExchange(qr);
break;
}
+
default:
return Manageable::STATUS_UNKNOWN_METHOD;
}
@@ -114,24 +146,35 @@ void HaBroker::setClientUrl(const Url& url, const sys::Mutex::ScopedLock& l) {
void HaBroker::updateClientUrl(const sys::Mutex::ScopedLock&) {
Url url = clientUrl.empty() ? brokerUrl : clientUrl;
- assert(!url.empty());
- mgmtObject->set_clientAddresses(url.str());
+ if (url.empty()) throw Url::Invalid("HA client URL is empty");
+ mgmtObject->set_publicBrokers(url.str());
knownBrokers.clear();
knownBrokers.push_back(url);
- QPID_LOG(debug, "HA: Setting client known-brokers to: " << url);
+ QPID_LOG(debug, "HA: Setting client URL to: " << url);
}
void HaBroker::setBrokerUrl(const Url& url, const sys::Mutex::ScopedLock& l) {
- if (url.empty()) throw Exception("Invalid empty URL for HA broker failover");
+ if (url.empty()) throw Url::Invalid("HA broker URL is empty");
+ QPID_LOG(debug, "HA: Setting broker URL to: " << url);
brokerUrl = url;
- mgmtObject->set_brokerAddresses(brokerUrl.str());
+ mgmtObject->set_brokers(brokerUrl.str());
if (backup.get()) backup->setBrokerUrl(brokerUrl);
// Updating broker URL also updates defaulted client URL:
if (clientUrl.empty()) updateClientUrl(l);
}
+void HaBroker::setExpectedBackups(size_t n, const sys::Mutex::ScopedLock&) {
+ expectedBackups = n;
+ mgmtObject->set_expectedBackups(n);
+}
+
std::vector<Url> HaBroker::getKnownBrokers() const {
return knownBrokers;
}
+void HaBroker::shutdown(const std::string& message) {
+ QPID_LOG(critical, "Shutting down: " << message);
+ broker.shutdown();
+}
+
}} // namespace qpid::ha
diff --git a/cpp/src/qpid/ha/HaBroker.h b/cpp/src/qpid/ha/HaBroker.h
index 835a47c749..99b30fd36b 100644
--- a/cpp/src/qpid/ha/HaBroker.h
+++ b/cpp/src/qpid/ha/HaBroker.h
@@ -52,9 +52,16 @@ class HaBroker : public management::Manageable
management::Manageable::status_t ManagementMethod (
uint32_t methodId, management::Args& args, std::string& text);
+ broker::Broker& getBroker() { return broker; }
+ const Settings& getSettings() const { return settings; }
+
+ // Log a critical error message and shut down the broker.
+ void shutdown(const std::string& message);
+
private:
void setClientUrl(const Url&, const sys::Mutex::ScopedLock&);
void setBrokerUrl(const Url&, const sys::Mutex::ScopedLock&);
+ void setExpectedBackups(size_t, const sys::Mutex::ScopedLock&);
void updateClientUrl(const sys::Mutex::ScopedLock&);
bool isPrimary(const sys::Mutex::ScopedLock&) { return !backup.get(); }
std::vector<Url> getKnownBrokers() const;
@@ -67,6 +74,7 @@ class HaBroker : public management::Manageable
qmf::org::apache::qpid::ha::HaBroker* mgmtObject;
Url clientUrl, brokerUrl;
std::vector<Url> knownBrokers;
+ size_t expectedBackups;
};
}} // namespace qpid::ha
diff --git a/cpp/src/qpid/ha/HaPlugin.cpp b/cpp/src/qpid/ha/HaPlugin.cpp
index fc9e48411d..4da3b0d7d2 100644
--- a/cpp/src/qpid/ha/HaPlugin.cpp
+++ b/cpp/src/qpid/ha/HaPlugin.cpp
@@ -31,12 +31,23 @@ struct Options : public qpid::Options {
Settings& settings;
Options(Settings& s) : qpid::Options("HA Options"), settings(s) {
addOptions()
- ("ha-enable", optValue(settings.enabled, "yes|no"), "Enable High Availability features")
- ("ha-client-url", optValue(settings.clientUrl,"URL"), "URL that clients use to connect and fail over.")
- ("ha-broker-url", optValue(settings.brokerUrl,"URL"), "URL that backup brokers use to connect and fail over.")
- ("ha-username", optValue(settings.username, "USER"), "Username for connections between brokers")
- ("ha-password", optValue(settings.password, "PASS"), "Password for connections between brokers")
- ("ha-mechanism", optValue(settings.mechanism, "MECH"), "Authentication mechanism for connections between brokers")
+ ("ha-cluster", optValue(settings.cluster, "yes|no"),
+ "Join a HA active/passive cluster.")
+ ("ha-brokers", optValue(settings.brokerUrl,"URL"),
+ "URL that backup brokers use to connect and fail over.")
+ ("ha-public-brokers", optValue(settings.clientUrl,"URL"),
+ "URL that clients use to connect and fail over, defaults to ha-brokers.")
+ ("ha-replicate",
+ optValue(settings.replicateDefault, "LEVEL"),
+ "Replication level for creating queues and exchanges if there is no qpid.replicate argument supplied. LEVEL is 'none', 'configuration' or 'all'")
+ ("ha-expected-backups", optValue(settings.expectedBackups, "N"),
+ "Number of backups expected to be active in the HA cluster.")
+ ("ha-username", optValue(settings.username, "USER"),
+ "Username for connections between HA brokers")
+ ("ha-password", optValue(settings.password, "PASS"),
+ "Password for connections between HA brokers")
+ ("ha-mechanism", optValue(settings.mechanism, "MECH"),
+ "Authentication mechanism for connections between HA brokers")
;
}
};
@@ -55,10 +66,7 @@ struct HaPlugin : public Plugin {
void initialize(Plugin::Target& target) {
broker::Broker* broker = dynamic_cast<broker::Broker*>(&target);
- if (broker && settings.enabled) {
- haBroker.reset(new ha::HaBroker(*broker, settings));
- } else
- QPID_LOG(notice, "HA: Disabled");
+ if (broker) haBroker.reset(new ha::HaBroker(*broker, settings));
}
};
diff --git a/cpp/src/qpid/ha/QueueReplicator.cpp b/cpp/src/qpid/ha/QueueReplicator.cpp
index 0017cc82cd..633619be13 100644
--- a/cpp/src/qpid/ha/QueueReplicator.cpp
+++ b/cpp/src/qpid/ha/QueueReplicator.cpp
@@ -30,8 +30,8 @@
#include "qpid/framing/SequenceSet.h"
#include "qpid/framing/FieldTable.h"
#include "qpid/log/Statement.h"
+#include "qpid/Msg.h"
#include <boost/shared_ptr.hpp>
-#include <sstream>
namespace {
const std::string QPID_REPLICATOR_("qpid.replicator-");
@@ -54,10 +54,8 @@ std::string QueueReplicator::replicatorName(const std::string& queueName) {
QueueReplicator::QueueReplicator(boost::shared_ptr<Queue> q, boost::shared_ptr<Link> l)
: Exchange(replicatorName(q->getName()), 0, q->getBroker()), queue(q), link(l)
{
- std::stringstream ss;
- ss << "HA: Backup " << queue->getName() << ": ";
- logPrefix = ss.str();
- QPID_LOG(info, logPrefix << "Created, settings: " << q->getSettings());
+ logPrefix = "HA: Backup of " + queue->getName() + ": ";
+ QPID_LOG(info, logPrefix << "Created");
}
// This must be separate from the constructor so we can call shared_from_this.
@@ -77,7 +75,7 @@ void QueueReplicator::activate() {
0, // sync?
// Include shared_ptr to self to ensure we are not deleted
// before initializeBridge is called.
- boost::bind(&QueueReplicator::initializeBridge, this, _1, _2, shared_from_this())
+ boost::bind(&QueueReplicator::initializeBridge, shared_from_this(), _1, _2)
);
}
@@ -91,9 +89,7 @@ void QueueReplicator::deactivate() {
}
// Called in a broker connection thread when the bridge is created.
-// shared_ptr to self ensures we are not deleted before initializeBridge is called.
-void QueueReplicator::initializeBridge(Bridge& bridge, SessionHandler& sessionHandler,
- boost::shared_ptr<QueueReplicator> /*self*/) {
+void QueueReplicator::initializeBridge(Bridge& bridge, SessionHandler& sessionHandler) {
sys::Mutex::ScopedLock l(lock);
bridgeName = bridge.getName();
framing::AMQP_ServerProxy peer(sessionHandler.out);
@@ -141,27 +137,35 @@ void QueueReplicator::dequeue(SequenceNumber n, const sys::Mutex::ScopedLock&)
}
// Called in connection thread of the queues bridge to primary.
-void QueueReplicator::route(Deliverable& msg, const std::string& key, const FieldTable*)
+void QueueReplicator::route(Deliverable& msg)
{
- sys::Mutex::ScopedLock l(lock);
- if (key == DEQUEUE_EVENT_KEY) {
- SequenceSet dequeues = decodeContent<SequenceSet>(msg.getMessage());
- QPID_LOG(trace, logPrefix << "Dequeue: " << dequeues);
- //TODO: should be able to optimise the following
- for (SequenceSet::iterator i = dequeues.begin(); i != dequeues.end(); i++)
- dequeue(*i, l);
- } else if (key == POSITION_EVENT_KEY) {
- SequenceNumber position = decodeContent<SequenceNumber>(msg.getMessage());
- QPID_LOG(trace, logPrefix << "Position moved from " << queue->getPosition()
- << " to " << position);
- assert(queue->getPosition() <= position);
- //TODO aconway 2011-12-14: Optimize this?
- for (SequenceNumber i = queue->getPosition(); i < position; ++i)
- dequeue(i,l);
- queue->setPosition(position);
- } else {
- msg.deliverTo(queue);
- QPID_LOG(trace, logPrefix << "Enqueued message " << queue->getPosition());
+ try {
+ const std::string& key = msg.getMessage().getRoutingKey();
+ sys::Mutex::ScopedLock l(lock);
+ if (key == DEQUEUE_EVENT_KEY) {
+ SequenceSet dequeues = decodeContent<SequenceSet>(msg.getMessage());
+ QPID_LOG(trace, logPrefix << "Dequeue: " << dequeues);
+ //TODO: should be able to optimise the following
+ for (SequenceSet::iterator i = dequeues.begin(); i != dequeues.end(); i++)
+ dequeue(*i, l);
+ } else if (key == POSITION_EVENT_KEY) {
+ SequenceNumber position = decodeContent<SequenceNumber>(msg.getMessage());
+ QPID_LOG(trace, logPrefix << "Position moved from " << queue->getPosition()
+ << " to " << position);
+ if (queue->getPosition() > position) {
+ throw Exception(
+ QPID_MSG(logPrefix << "Invalid position update from "
+ << queue->getPosition() << " to " << position));
+ }
+ queue->setPosition(position);
+ } else {
+ msg.deliverTo(queue);
+ QPID_LOG(trace, logPrefix << "Enqueued message " << queue->getPosition());
+ }
+ }
+ catch (const std::exception& e) {
+ QPID_LOG(critical, logPrefix << "Replication failed: " << e.what());
+ throw;
}
}
diff --git a/cpp/src/qpid/ha/QueueReplicator.h b/cpp/src/qpid/ha/QueueReplicator.h
index 9de7dd480c..bcbac988fa 100644
--- a/cpp/src/qpid/ha/QueueReplicator.h
+++ b/cpp/src/qpid/ha/QueueReplicator.h
@@ -66,12 +66,11 @@ class QueueReplicator : public broker::Exchange,
bool bind(boost::shared_ptr<broker::Queue
>, const std::string&, const framing::FieldTable*);
bool unbind(boost::shared_ptr<broker::Queue>, const std::string&, const framing::FieldTable*);
- void route(broker::Deliverable&, const std::string&, const framing::FieldTable*);
+ void route(broker::Deliverable&);
bool isBound(boost::shared_ptr<broker::Queue>, const std::string* const, const framing::FieldTable* const);
private:
- void initializeBridge(broker::Bridge& bridge, broker::SessionHandler& sessionHandler,
- boost::shared_ptr<QueueReplicator> self);
+ void initializeBridge(broker::Bridge& bridge, broker::SessionHandler& sessionHandler);
void dequeue(framing::SequenceNumber, const sys::Mutex::ScopedLock&);
std::string logPrefix;
diff --git a/cpp/src/qpid/ha/ReplicateLevel.cpp b/cpp/src/qpid/ha/ReplicateLevel.cpp
new file mode 100644
index 0000000000..4981577225
--- /dev/null
+++ b/cpp/src/qpid/ha/ReplicateLevel.cpp
@@ -0,0 +1,72 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#include "ReplicateLevel.h"
+#include "qpid/Exception.h"
+#include "qpid/Msg.h"
+#include <iostream>
+#include <assert.h>
+
+namespace qpid {
+namespace ha {
+
+using namespace std;
+
+// Note replicateLevel is called during plugin-initialization which
+// happens in the static construction phase so these constants need
+// to be POD, they can't be class objects
+//
+namespace {
+const char* S_NONE="none";
+const char* S_CONFIGURATION="configuration";
+const char* S_ALL="all";
+}
+
+bool replicateLevel(const string& level, ReplicateLevel& out) {
+ if (level == S_NONE) { out = RL_NONE; return true; }
+ if (level == S_CONFIGURATION) { out = RL_CONFIGURATION; return true; }
+ if (level == S_ALL) { out = RL_ALL; return true; }
+ return false;
+}
+
+ReplicateLevel replicateLevel(const string& level) {
+ ReplicateLevel rl;
+ if (!replicateLevel(level, rl))
+ throw Exception("Invalid value for replication level: "+level);
+ return rl;
+}
+
+string str(ReplicateLevel l) {
+ const char* names[] = { S_NONE, S_CONFIGURATION, S_ALL };
+ if (l > RL_ALL)
+ throw Exception(QPID_MSG("Invalid value for replication level: " << l));
+ return names[l];
+}
+
+ostream& operator<<(ostream& o, ReplicateLevel rl) { return o << str(rl); }
+
+istream& operator>>(istream& i, ReplicateLevel& rl) {
+ string str;
+ i >> str;
+ rl = replicateLevel(str);
+ return i;
+}
+
+}} // namespace qpid::ha
diff --git a/cpp/src/qpid/ha/ReplicateLevel.h b/cpp/src/qpid/ha/ReplicateLevel.h
new file mode 100644
index 0000000000..c11e03f0ce
--- /dev/null
+++ b/cpp/src/qpid/ha/ReplicateLevel.h
@@ -0,0 +1,52 @@
+#ifndef QPID_HA_REPLICATELEVEL_H
+#define QPID_HA_REPLICATELEVEL_H
+
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include <string>
+#include <iosfwd>
+
+namespace qpid {
+namespace ha {
+
+enum ReplicateLevel { RL_NONE, RL_CONFIGURATION, RL_ALL };
+
+/**
+ * If str is a valid replicate level, set out and return true.
+ */
+bool replicateLevel(const std::string& str, ReplicateLevel& out);
+
+/**
+ *@return enum corresponding to string level.
+ *@throw qpid::Exception if level is not a valid replication level.
+ */
+ReplicateLevel replicateLevel(const std::string& level);
+
+/**@return string form of replicate level */
+std::string str(ReplicateLevel l);
+
+std::ostream& operator<<(std::ostream&, ReplicateLevel);
+std::istream& operator>>(std::istream&, ReplicateLevel&);
+
+}} // namespaces qpid::ha
+
+#endif /*!QPID_HA_REPLICATELEVEL_H*/
diff --git a/cpp/src/qpid/ha/ReplicatingSubscription.cpp b/cpp/src/qpid/ha/ReplicatingSubscription.cpp
index af6180305d..91a4538bc4 100644
--- a/cpp/src/qpid/ha/ReplicatingSubscription.cpp
+++ b/cpp/src/qpid/ha/ReplicatingSubscription.cpp
@@ -87,10 +87,13 @@ ReplicatingSubscription::ReplicatingSubscription(
events(new Queue(mask(name))),
consumer(new DelegatingConsumer(*this))
{
+ // Separate the remote part from a "local-remote" address.
+ string address = parent->getSession().getConnection().getUrl();
+ size_t i = address.find('-');
+ if (i != string::npos) address = address.substr(i+1);
+ logPrefix = "HA: Primary ";
stringstream ss;
- ss << "HA: Primary: " << getQueue()->getName() << " at "
- << parent->getSession().getConnection().getUrl() << ": ";
- logPrefix = ss.str();
+ logSuffix = " (" + address + ")";
// FIXME aconway 2011-12-09: Failover optimization removed.
// There was code here to re-use messages already on the backup
@@ -99,7 +102,7 @@ ReplicatingSubscription::ReplicatingSubscription(
// can be re-introduced later. Last revision with the optimization:
// r1213258 | QPID-3603: Fix QueueReplicator subscription parameters.
- QPID_LOG(debug, logPrefix << "Created backup subscription " << getName());
+ QPID_LOG(debug, logPrefix << "created backup subscription " << getName() << logSuffix);
// FIXME aconway 2011-12-15: ConsumerImpl::position is left at 0
// so we will start consuming from the lowest numbered message.
@@ -109,23 +112,36 @@ ReplicatingSubscription::ReplicatingSubscription(
// Message is delivered in the subscription's connection thread.
bool ReplicatingSubscription::deliver(QueuedMessage& m) {
- // Add position events for the subscribed queue, not for the internal event queue.
- if (m.queue && m.queue == getQueue().get()) {
- sys::Mutex::ScopedLock l(lock);
- assert(position == m.position);
- // m.position is the position of the newly enqueued m on the local queue.
- // backupPosition is latest position on the backup queue (before enqueueing m.)
- assert(m.position > backupPosition);
- if (m.position - backupPosition > 1) {
- // Position has advanced because of messages dequeued ahead of us.
- SequenceNumber send(m.position);
- --send; // Send the position before m was enqueued.
- sendPositionEvent(send, l);
+ try {
+ // Add position events for the subscribed queue, not for the internal event queue.
+ if (m.queue && m.queue == getQueue().get()) {
+ sys::Mutex::ScopedLock l(lock);
+ if (position != m.position)
+ throw Exception(
+ QPID_MSG("Expected position " << position
+ << " but got " << m.position));
+ // m.position is the position of the newly enqueued m on the local queue.
+ // backupPosition is latest position on the backup queue (before enqueueing m.)
+ if (m.position <= backupPosition)
+ throw Exception(
+ QPID_MSG("Expected position > " << backupPosition
+ << " but got " << m.position));
+
+ if (m.position - backupPosition > 1) {
+ // Position has advanced because of messages dequeued ahead of us.
+ SequenceNumber send(m.position);
+ --send; // Send the position before m was enqueued.
+ sendPositionEvent(send, l);
+ }
+ backupPosition = m.position;
+ QPID_LOG(trace, logPrefix << "replicating " << m << logSuffix);
}
- backupPosition = m.position;
- QPID_LOG(trace, logPrefix << "Replicating message " << m.position);
+ return ConsumerImpl::deliver(m);
+ } catch (const std::exception& e) {
+ QPID_LOG(critical, logPrefix << "error replicating " << getQueue()->getName()
+ << logSuffix << ": " << e.what());
+ throw;
}
- return ConsumerImpl::deliver(m);
}
ReplicatingSubscription::~ReplicatingSubscription() {}
@@ -139,7 +155,7 @@ void ReplicatingSubscription::complete(
{
// Handle completions for the subscribed queue, not the internal event queue.
if (qm.queue && qm.queue == getQueue().get()) {
- QPID_LOG(trace, logPrefix << "Completed message " << qm.position);
+ QPID_LOG(trace, logPrefix << "completed " << qm << logSuffix);
Delayed::iterator i= delayed.find(qm.position);
// The same message can be completed twice, by acknowledged and
// dequeued, remove it from the set so it only gets completed
@@ -157,7 +173,7 @@ void ReplicatingSubscription::complete(
void ReplicatingSubscription::enqueued(const QueuedMessage& qm) {
sys::Mutex::ScopedLock l(lock);
// Delay completion
- QPID_LOG(trace, logPrefix << "Delaying completion of message " << qm.position);
+ QPID_LOG(trace, logPrefix << "delaying completion of " << qm << logSuffix);
qm.payload->getIngressCompletion().startCompleter();
assert(delayed.find(qm.position) == delayed.end());
delayed[qm.position] = qm;
@@ -168,7 +184,7 @@ void ReplicatingSubscription::enqueued(const QueuedMessage& qm) {
void ReplicatingSubscription::cancelComplete(
const Delayed::value_type& v, const sys::Mutex::ScopedLock&)
{
- QPID_LOG(trace, logPrefix << "Cancel completed message " << v.second.position);
+ QPID_LOG(trace, logPrefix << "cancel completed " << v.second << logSuffix);
v.second.payload->getIngressCompletion().finishCompleter();
}
@@ -179,7 +195,7 @@ void ReplicatingSubscription::cancel()
boost::dynamic_pointer_cast<QueueObserver>(shared_from_this()));
{
sys::Mutex::ScopedLock l(lock);
- QPID_LOG(debug, logPrefix <<"Cancelled backup subscription " << getName());
+ QPID_LOG(debug, logPrefix << "cancel backup subscription " << getName() << logSuffix);
for_each(delayed.begin(), delayed.end(),
boost::bind(&ReplicatingSubscription::cancelComplete, this, _1, boost::ref(l)));
delayed.clear();
@@ -201,7 +217,8 @@ bool ReplicatingSubscription::hideDeletedError() { return true; }
// Called with lock held. Called in subscription's connection thread.
void ReplicatingSubscription::sendDequeueEvent(const sys::Mutex::ScopedLock& l)
{
- QPID_LOG(trace, logPrefix << "Sending dequeues " << dequeues);
+ QPID_LOG(trace, logPrefix << "sending dequeues " << dequeues
+ << " from " << getQueue()->getName() << logSuffix);
string buf(dequeues.encodedSize(),'\0');
framing::Buffer buffer(&buf[0], buf.size());
dequeues.encode(buffer);
@@ -216,7 +233,7 @@ void ReplicatingSubscription::dequeued(const QueuedMessage& qm)
{
{
sys::Mutex::ScopedLock l(lock);
- QPID_LOG(trace, logPrefix << "Dequeued message " << qm.position);
+ QPID_LOG(trace, logPrefix << "dequeued " << qm << logSuffix);
dequeues.add(qm.position);
// If we have not yet sent this message to the backup, then
// complete it now as it will never be accepted.
@@ -229,8 +246,8 @@ void ReplicatingSubscription::dequeued(const QueuedMessage& qm)
void ReplicatingSubscription::sendPositionEvent(
SequenceNumber position, const sys::Mutex::ScopedLock&l )
{
- QPID_LOG(trace, logPrefix << "Sending position " << position
- << ", was " << backupPosition);
+ QPID_LOG(trace, logPrefix << "sending position " << position
+ << ", was " << backupPosition << logSuffix);
string buf(backupPosition.encodedSize(),'\0');
framing::Buffer buffer(&buf[0], buf.size());
position.encode(buffer);
diff --git a/cpp/src/qpid/ha/ReplicatingSubscription.h b/cpp/src/qpid/ha/ReplicatingSubscription.h
index e311f9505a..f9176915f6 100644
--- a/cpp/src/qpid/ha/ReplicatingSubscription.h
+++ b/cpp/src/qpid/ha/ReplicatingSubscription.h
@@ -33,7 +33,7 @@ namespace qpid {
namespace broker {
class Message;
class Queue;
-class QueuedMessage;
+struct QueuedMessage;
class OwnershipToken;
}
@@ -94,7 +94,7 @@ class ReplicatingSubscription : public broker::SemanticState::ConsumerImpl,
bool doDispatch();
private:
typedef std::map<framing::SequenceNumber, broker::QueuedMessage> Delayed;
- std::string logPrefix;
+ std::string logPrefix, logSuffix;
boost::shared_ptr<broker::Queue> events;
boost::shared_ptr<broker::Consumer> consumer;
Delayed delayed;
diff --git a/cpp/src/qpid/ha/Settings.h b/cpp/src/qpid/ha/Settings.h
index 049c873b9f..bf70c3f3f7 100644
--- a/cpp/src/qpid/ha/Settings.h
+++ b/cpp/src/qpid/ha/Settings.h
@@ -22,6 +22,7 @@
*
*/
+#include "ReplicateLevel.h"
#include <string>
namespace qpid {
@@ -33,10 +34,12 @@ namespace ha {
class Settings
{
public:
- Settings() : enabled(false) {}
- bool enabled;
+ Settings() : cluster(false), expectedBackups(0), replicateDefault(RL_NONE) {}
+ bool cluster; // True if we are a cluster member.
std::string clientUrl;
std::string brokerUrl;
+ size_t expectedBackups;
+ ReplicateLevel replicateDefault;
std::string username, password, mechanism;
private:
};
diff --git a/cpp/src/qpid/ha/management-schema.xml b/cpp/src/qpid/ha/management-schema.xml
index fe4a14d111..363dff61fb 100644
--- a/cpp/src/qpid/ha/management-schema.xml
+++ b/cpp/src/qpid/ha/management-schema.xml
@@ -22,16 +22,39 @@
<!-- Monitor and control HA status of a broker. -->
<class name="HaBroker">
<property name="name" type="sstr" access="RC" index="y" desc="Primary Key"/>
+
<property name="status" type="sstr" desc="HA status: primary or backup"/>
- <property name="clientAddresses" type="sstr" desc="List of addresses used by clients to connect to the HA cluster."/>
- <property name="brokerAddresses" type="sstr" desc="List of addresses used by HA brokers to connect to each other."/>
+
+ <property name="brokers" type="sstr"
+ desc="Multiple-address URL used by HA brokers to connect to each other."/>
+
+ <property name="publicBrokers" type="sstr"
+ desc="Multiple-address URL used by clients to connect to the HA brokers."/>
+
+ <property name="expectedBackups" type="uint16"
+ desc="Number of HA backup brokers expected."/>
+
+ <property
+ name="replicateDefault" type="sstr"
+ desc="Replicate value for queues/exchanges without a qpid.replicate argument"/>
<method name="promote" desc="Promote a backup broker to primary."/>
- <method name="setClientAddresses" desc="Set HA client addresses">
- <arg name="clientAddresses" type="sstr" dir="I"/>
+
+ <method name="setBrokers" desc="Set URL for HA brokers to connect to each other.">
+ <arg name="url" type="sstr" dir="I"/>
</method>
- <method name="setBrokerAddresses" desc="Set HA broker addresses">
- <arg name="brokerAddresses" type="sstr" dir="I"/>
+
+ <method name="setPublicBrokers" desc="Set URL for clients to connect to HA brokers">
+ <arg name="url" type="sstr" dir="I"/>
+ </method>
+
+ <method name="setExpectedBackups" desc="Set number of backups expected">
+ <arg name="expectedBackups" type="uint16" dir="I"/>
+ </method>
+
+ <method name="replicate" desc="Replicate individual queue from remote broker.">
+ <arg name="broker" type="sstr" dir="I"/>
+ <arg name="queue" type="sstr" dir="I"/>
</method>
</class>
diff --git a/cpp/src/qpid/log/Statement.cpp b/cpp/src/qpid/log/Statement.cpp
index 7dfdf08703..79f7a28100 100644
--- a/cpp/src/qpid/log/Statement.cpp
+++ b/cpp/src/qpid/log/Statement.cpp
@@ -55,6 +55,50 @@ void Statement::log(const std::string& message) {
}
Statement::Initializer::Initializer(Statement& s) : statement(s) {
+ // QPID-3891
+ // From the given BOOST_CURRENT_FUNCTION name extract only the
+ // namespace-qualified-functionName, skipping return and calling args.
+ // Given:
+ // <possible return value type> qpid::name::space::Function(args)
+ // Return:
+ // "qpid::name::space::Function".
+ if (s.function != NULL) {
+ bool foundOParen(false);
+ const char * opPtr;
+ for (opPtr = s.function; *opPtr != '\0'; opPtr++) {
+ if (*opPtr == '(') {
+ foundOParen = true;
+ break;
+ }
+ }
+
+ if (foundOParen) {
+ const char * bPtr = opPtr;
+ for (bPtr = opPtr; bPtr > s.function; bPtr--) {
+ if (bPtr[-1] == ' ') {
+ break;
+ }
+ }
+
+ size_t nStoreSize = opPtr - bPtr;
+ if (nStoreSize > 0) {
+ // Note: the struct into which this name is stored
+ // is static and is never deleted.
+ char * nStore = new char[nStoreSize + 1];
+ std::copy (bPtr, opPtr, nStore);
+ nStore[nStoreSize] = '\0';
+
+ s.function = nStore;
+ } else {
+ // Ignore zero length name
+ }
+ } else {
+ // No name found - do nothing
+ }
+ } else {
+ // no function-name pointer to process
+ }
+
Logger::instance().add(s);
}
diff --git a/cpp/src/qpid/log/posix/SinkOptions.cpp b/cpp/src/qpid/log/posix/SinkOptions.cpp
index ffa7633e3b..8459938e5c 100644
--- a/cpp/src/qpid/log/posix/SinkOptions.cpp
+++ b/cpp/src/qpid/log/posix/SinkOptions.cpp
@@ -30,6 +30,10 @@
using std::string;
using qpid::Exception;
+namespace qpid {
+namespace log {
+namespace posix {
+
namespace {
// SyslogFacilities maps from syslog values to the text equivalents.
@@ -110,10 +114,6 @@ std::string basename(const std::string path) {
} // namespace
-namespace qpid {
-namespace log {
-namespace posix {
-
std::ostream& operator<<(std::ostream& o, const SyslogFacility& f) {
return o << SyslogFacilities().name(f.value);
}
diff --git a/cpp/src/qpid/management/ManagementAgent.cpp b/cpp/src/qpid/management/ManagementAgent.cpp
index 741ef442b0..062a530706 100644
--- a/cpp/src/qpid/management/ManagementAgent.cpp
+++ b/cpp/src/qpid/management/ManagementAgent.cpp
@@ -30,6 +30,7 @@
#include "qpid/log/Statement.h"
#include <qpid/broker/Message.h>
#include "qpid/framing/MessageTransferBody.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/sys/Time.h"
#include "qpid/sys/Thread.h"
#include "qpid/broker/ConnectionState.h"
@@ -44,14 +45,15 @@
#include <sstream>
#include <typeinfo>
+namespace qpid {
+namespace management {
+
using boost::intrusive_ptr;
using qpid::framing::Uuid;
using qpid::types::Variant;
using qpid::amqp_0_10::MapCodec;
using qpid::amqp_0_10::ListCodec;
-using qpid::sys::Mutex;
using namespace qpid::framing;
-using namespace qpid::management;
using namespace qpid::broker;
using namespace qpid;
using namespace std;
@@ -117,7 +119,7 @@ ManagementAgent::RemoteAgent::~RemoteAgent ()
}
ManagementAgent::ManagementAgent (const bool qmfV1, const bool qmfV2) :
- threadPoolSize(1), interval(10), broker(0), timer(0),
+ threadPoolSize(1), publish(true), interval(10), broker(0), timer(0),
startTime(sys::now()),
suppressed(false), disallowAllV1Methods(false),
vendorNameKey(defaultVendorName), productNameKey(defaultProductName),
@@ -164,10 +166,11 @@ ManagementAgent::~ManagementAgent ()
}
}
-void ManagementAgent::configure(const string& _dataDir, uint16_t _interval,
+void ManagementAgent::configure(const string& _dataDir, bool _publish, uint16_t _interval,
qpid::broker::Broker* _broker, int _threads)
{
dataDir = _dataDir;
+ publish = _publish;
interval = _interval;
broker = _broker;
threadPoolSize = _threads;
@@ -428,16 +431,17 @@ void ManagementAgent::raiseEvent(const ManagementEvent& event, severity_t severi
}
ManagementAgent::Periodic::Periodic (ManagementAgent& _agent, uint32_t _seconds)
- : TimerTask (sys::Duration((_seconds ? _seconds : 1) * sys::TIME_SEC),
- "ManagementAgent::periodicProcessing"),
+ : TimerTask(sys::Duration((_seconds ? _seconds : 1) * sys::TIME_SEC),
+ "ManagementAgent::periodicProcessing"),
agent(_agent) {}
-ManagementAgent::Periodic::~Periodic () {}
+ManagementAgent::Periodic::~Periodic() {}
-void ManagementAgent::Periodic::fire ()
+void ManagementAgent::Periodic::fire()
{
- agent.timer->add (new Periodic (agent, agent.interval));
- agent.periodicProcessing ();
+ setupNextFire();
+ agent.timer->add(this);
+ agent.periodicProcessing();
}
void ManagementAgent::clientAdded (const string& routingKey)
@@ -562,7 +566,7 @@ void ManagementAgent::sendBufferLH(Buffer& buf,
DeliverableMessage deliverable (msg);
try {
- exchange->route(deliverable, routingKey, 0);
+ exchange->route(deliverable);
} catch(exception&) {}
}
buf.reset();
@@ -639,7 +643,7 @@ void ManagementAgent::sendBufferLH(const string& data,
DeliverableMessage deliverable (msg);
try {
- exchange->route(deliverable, routingKey, 0);
+ exchange->route(deliverable);
} catch(exception&) {}
}
}
@@ -719,11 +723,16 @@ void ManagementAgent::periodicProcessing (void)
string routingKey;
string sBuf;
- uint64_t uptime = sys::Duration(startTime, sys::now());
- static_cast<_qmf::Broker*>(broker->GetManagementObject())->set_uptime(uptime);
-
moveNewObjectsLH();
- qpid::sys::MemStat::loadMemInfo(memstat);
+
+ //
+ // If we're publishing updates, get the latest memory statistics and uptime now
+ //
+ if (publish) {
+ uint64_t uptime = sys::Duration(startTime, sys::now());
+ static_cast<_qmf::Broker*>(broker->GetManagementObject())->set_uptime(uptime);
+ qpid::sys::MemStat::loadMemInfo(memstat);
+ }
//
// Clear the been-here flag on all objects in the map.
@@ -747,6 +756,14 @@ void ManagementAgent::periodicProcessing (void)
// would incorrectly think the object was deleted. See QPID-2997
//
bool objectsDeleted = moveDeletedObjectsLH();
+
+ //
+ // If we are not publishing updates, just clear the pending deletes. There's no
+ // need to tell anybody.
+ //
+ if (!publish)
+ pendingDeletedObjs.clear();
+
if (!pendingDeletedObjs.empty()) {
// use a temporary copy of the pending deletes so dropping the lock when
// the buffer is sent is safe.
@@ -867,7 +884,9 @@ void ManagementAgent::periodicProcessing (void)
// sendBuffer(). This allows the managementObjects map to be altered during the
// sendBuffer() call, so always restart the search after a sendBuffer() call
//
- while (1) {
+ // If publish is disabled, don't send any updates.
+ //
+ while (publish) {
msgBuffer.reset();
Variant::List list_;
uint32_t pcount;
@@ -1023,10 +1042,9 @@ void ManagementAgent::periodicProcessing (void)
if (objectsDeleted) deleteOrphanedAgentsLH();
- // heartbeat generation
+ // heartbeat generation. Note that heartbeats need to be sent even if publish is disabled.
if (qmf1Support) {
-#define BUFSIZE 65536
uint32_t contentSize;
char msgChars[BUFSIZE];
Buffer msgBuffer(msgChars, BUFSIZE);
@@ -1087,7 +1105,7 @@ void ManagementAgent::deleteObjectNowLH(const ObjectId& oid)
Variant::List list_;
stringstream v1key, v2key;
- if (qmf1Support) {
+ if (publish && qmf1Support) {
string sBuf;
v1key << "console.obj.1.0." << object->getPackageName() << "." << object->getClassName();
@@ -1096,7 +1114,7 @@ void ManagementAgent::deleteObjectNowLH(const ObjectId& oid)
msgBuffer.putRawData(sBuf);
}
- if (qmf2Support) {
+ if (publish && qmf2Support) {
Variant::Map map_;
Variant::Map values;
@@ -1121,14 +1139,14 @@ void ManagementAgent::deleteObjectNowLH(const ObjectId& oid)
// object deleted, ok to drop lock now.
- if (qmf1Support) {
+ if (publish && qmf1Support) {
uint32_t contentSize = msgBuffer.getPosition();
msgBuffer.reset();
sendBufferLH(msgBuffer, contentSize, mExchange, v1key.str());
QPID_LOG(debug, "SEND Immediate(delete) ContentInd to=" << v1key.str());
}
- if (qmf2Support) {
+ if (publish && qmf2Support) {
Variant::Map headers;
headers["method"] = "indication";
headers["qmf.opcode"] = "_data_indication";
@@ -1841,6 +1859,12 @@ void ManagementAgent::handleGetQueryLH(Buffer& inBuffer, const string& replyToKe
if (className == "memory")
qpid::sys::MemStat::loadMemInfo(memstat);
+ if (className == "broker") {
+ uint64_t uptime = sys::Duration(startTime, sys::now());
+ static_cast<_qmf::Broker*>(broker->GetManagementObject())->set_uptime(uptime);
+ }
+
+
// build up a set of all objects to be dumped
for (ManagementObjectMap::iterator iter = managementObjects.begin();
iter != managementObjects.end();
@@ -1956,6 +1980,11 @@ void ManagementAgent::handleGetQueryLH(const string& body, const string& rte, co
if (className == "memory")
qpid::sys::MemStat::loadMemInfo(memstat);
+ if (className == "broker") {
+ uint64_t uptime = sys::Duration(startTime, sys::now());
+ static_cast<_qmf::Broker*>(broker->GetManagementObject())->set_uptime(uptime);
+ }
+
/*
* Unpack the _object_id element of the query if it is present. If it is present, find that one
* object and return it. If it is not present, send a class-based result.
@@ -2934,9 +2963,6 @@ bool ManagementAgent::moveDeletedObjectsLH() {
return !deleteList.empty();
}
-namespace qpid {
-namespace management {
-
namespace {
QPID_TSS const qpid::broker::ConnectionState* executionContext = 0;
}
@@ -2951,3 +2977,4 @@ const qpid::broker::ConnectionState* getManagementExecutionContext()
}
}}
+
diff --git a/cpp/src/qpid/management/ManagementAgent.h b/cpp/src/qpid/management/ManagementAgent.h
index f68bfe0577..c7e830dcf5 100644
--- a/cpp/src/qpid/management/ManagementAgent.h
+++ b/cpp/src/qpid/management/ManagementAgent.h
@@ -36,7 +36,6 @@
#include "qpid/sys/MemStat.h"
#include "qpid/types/Variant.h"
#include <qpid/framing/AMQFrame.h>
-#include <qpid/framing/FieldValue.h>
#include <qpid/framing/ResizableBuffer.h>
#include <memory>
#include <string>
@@ -72,7 +71,7 @@ public:
virtual ~ManagementAgent ();
/** Called before plugins are initialized */
- void configure (const std::string& dataDir, uint16_t interval,
+ void configure (const std::string& dataDir, bool publish, uint16_t interval,
qpid::broker::Broker* broker, int threadPoolSize);
/** Called after plugins are initialized. */
void pluginsInitialized();
@@ -300,6 +299,7 @@ private:
qpid::broker::Exchange::shared_ptr v2Topic;
qpid::broker::Exchange::shared_ptr v2Direct;
std::string dataDir;
+ bool publish;
uint16_t interval;
qpid::broker::Broker* broker;
qpid::sys::Timer* timer;
diff --git a/cpp/src/qpid/management/ManagementDirectExchange.cpp b/cpp/src/qpid/management/ManagementDirectExchange.cpp
index 1d5f8bbd6b..312eacf462 100644
--- a/cpp/src/qpid/management/ManagementDirectExchange.cpp
+++ b/cpp/src/qpid/management/ManagementDirectExchange.cpp
@@ -40,17 +40,17 @@ ManagementDirectExchange::ManagementDirectExchange(const std::string& _name,
DirectExchange(_name, _durable, _args, _parent, b),
managementAgent(0) {}
-void ManagementDirectExchange::route(Deliverable& msg,
- const string& routingKey,
- const FieldTable* args)
+void ManagementDirectExchange::route(Deliverable& msg)
{
bool routeIt = true;
+ const string& routingKey = msg.getMessage().getRoutingKey();
+ const FieldTable* args = msg.getMessage().getApplicationHeaders();
if (managementAgent)
routeIt = managementAgent->dispatchCommand(msg, routingKey, args, false, qmfVersion);
if (routeIt)
- DirectExchange::route(msg, routingKey, args);
+ DirectExchange::route(msg);
}
void ManagementDirectExchange::setManagmentAgent(ManagementAgent* agent, int qv)
diff --git a/cpp/src/qpid/management/ManagementDirectExchange.h b/cpp/src/qpid/management/ManagementDirectExchange.h
index 7507179c06..582354d723 100644
--- a/cpp/src/qpid/management/ManagementDirectExchange.h
+++ b/cpp/src/qpid/management/ManagementDirectExchange.h
@@ -43,9 +43,7 @@ class ManagementDirectExchange : public virtual DirectExchange
virtual std::string getType() const { return typeName; }
- virtual void route(Deliverable& msg,
- const std::string& routingKey,
- const qpid::framing::FieldTable* args);
+ virtual void route(Deliverable& msg);
void setManagmentAgent(management::ManagementAgent* agent, int qmfVersion);
diff --git a/cpp/src/qpid/management/ManagementTopicExchange.cpp b/cpp/src/qpid/management/ManagementTopicExchange.cpp
index ee8657646f..587cc660df 100644
--- a/cpp/src/qpid/management/ManagementTopicExchange.cpp
+++ b/cpp/src/qpid/management/ManagementTopicExchange.cpp
@@ -39,18 +39,18 @@ ManagementTopicExchange::ManagementTopicExchange(const std::string& _name,
TopicExchange(_name, _durable, _args, _parent, b),
managementAgent(0) {}
-void ManagementTopicExchange::route(Deliverable& msg,
- const string& routingKey,
- const FieldTable* args)
+void ManagementTopicExchange::route(Deliverable& msg)
{
bool routeIt = true;
+ const string& routingKey = msg.getMessage().getRoutingKey();
+ const FieldTable* args = msg.getMessage().getApplicationHeaders();
// Intercept management agent commands
if (managementAgent)
routeIt = managementAgent->dispatchCommand(msg, routingKey, args, true, qmfVersion);
if (routeIt)
- TopicExchange::route(msg, routingKey, args);
+ TopicExchange::route(msg);
}
bool ManagementTopicExchange::bind(Queue::shared_ptr queue,
diff --git a/cpp/src/qpid/management/ManagementTopicExchange.h b/cpp/src/qpid/management/ManagementTopicExchange.h
index 232300265e..eff01a8552 100644
--- a/cpp/src/qpid/management/ManagementTopicExchange.h
+++ b/cpp/src/qpid/management/ManagementTopicExchange.h
@@ -43,9 +43,7 @@ class ManagementTopicExchange : public virtual TopicExchange
virtual std::string getType() const { return typeName; }
- virtual void route(Deliverable& msg,
- const std::string& routingKey,
- const qpid::framing::FieldTable* args);
+ virtual void route(Deliverable& msg);
virtual bool bind(Queue::shared_ptr queue,
const std::string& routingKey,
diff --git a/cpp/src/qpid/replication/ReplicatingEventListener.cpp b/cpp/src/qpid/replication/ReplicatingEventListener.cpp
index 0ced4d9161..9284bda388 100644
--- a/cpp/src/qpid/replication/ReplicatingEventListener.cpp
+++ b/cpp/src/qpid/replication/ReplicatingEventListener.cpp
@@ -80,7 +80,7 @@ void ReplicatingEventListener::route(boost::intrusive_ptr<qpid::broker::Message>
try {
if (exchange) {
DeliverableMessage deliverable(msg);
- exchange->route(deliverable, msg->getRoutingKey(), msg->getApplicationHeaders());
+ exchange->route(deliverable);
} else if (queue) {
queue->deliver(msg);
} else {
@@ -131,7 +131,7 @@ boost::intrusive_ptr<Message> ReplicatingEventListener::cloneMessage(Queue& queu
//cloned body:
AMQFrame header(*original->getFrames().getHeaders());
header.setBof(false);
- header.setEof(!original->getFrames().getContentSize());//if there is any content then the header is not the end of the frameset
+ header.setEof(!original->getFrames().hasContent());//if there are any content frames then the header is not the end of the frameset
header.setBos(true);
header.setEos(true);
handler.handle(header);
diff --git a/cpp/src/qpid/replication/ReplicationExchange.cpp b/cpp/src/qpid/replication/ReplicationExchange.cpp
index 89a2bf516d..66f4f14d0c 100644
--- a/cpp/src/qpid/replication/ReplicationExchange.cpp
+++ b/cpp/src/qpid/replication/ReplicationExchange.cpp
@@ -50,8 +50,9 @@ ReplicationExchange::ReplicationExchange(const std::string& name, bool durable,
std::string ReplicationExchange::getType() const { return typeName; }
-void ReplicationExchange::route(Deliverable& msg, const std::string& /*routingKey*/, const FieldTable* args)
+void ReplicationExchange::route(Deliverable& msg)
{
+ const FieldTable* args = msg.getMessage().getApplicationHeaders();
if (mgmtExchange != 0) {
mgmtExchange->inc_msgReceives();
mgmtExchange->inc_byteReceives(msg.contentSize());
@@ -59,7 +60,13 @@ void ReplicationExchange::route(Deliverable& msg, const std::string& /*routingKe
if (args) {
int eventType = args->getAsInt(REPLICATION_EVENT_TYPE);
if (eventType) {
- if (isDuplicate(args)) return;
+ if (isDuplicate(args)) {
+ if (mgmtExchange != 0) {
+ mgmtExchange->inc_msgDrops();
+ mgmtExchange->inc_byteDrops(msg.contentSize());
+ }
+ return;
+ }
switch (eventType) {
case ENQUEUE:
handleEnqueueEvent(args, msg);
diff --git a/cpp/src/qpid/replication/ReplicationExchange.h b/cpp/src/qpid/replication/ReplicationExchange.h
index 4b34e0df13..ff0a98c48e 100644
--- a/cpp/src/qpid/replication/ReplicationExchange.h
+++ b/cpp/src/qpid/replication/ReplicationExchange.h
@@ -52,7 +52,7 @@ class ReplicationExchange : public qpid::broker::Exchange
std::string getType() const;
- void route(qpid::broker::Deliverable& msg, const std::string& routingKey, const qpid::framing::FieldTable* args);
+ void route(qpid::broker::Deliverable& msg);
bool bind(boost::shared_ptr<broker::Queue> queue, const std::string& routingKey, const qpid::framing::FieldTable* args);
bool unbind(boost::shared_ptr<broker::Queue> queue, const std::string& routingKey, const qpid::framing::FieldTable* args);
diff --git a/cpp/src/qpid/store/MessageStorePlugin.cpp b/cpp/src/qpid/store/MessageStorePlugin.cpp
index 2a8d971987..20231bf910 100644
--- a/cpp/src/qpid/store/MessageStorePlugin.cpp
+++ b/cpp/src/qpid/store/MessageStorePlugin.cpp
@@ -28,6 +28,9 @@
#include "qpid/DataDir.h"
#include "qpid/log/Statement.h"
+namespace qpid {
+namespace store {
+
/*
* The MessageStore pointer given to the Broker points to static storage.
* Thus, it cannot be deleted, especially by the broker. To prevent deletion,
@@ -42,9 +45,6 @@ namespace {
};
}
-namespace qpid {
-namespace store {
-
static MessageStorePlugin static_instance_registers_plugin;
diff --git a/cpp/src/qpid/store/ms-clfs/MessageLog.cpp b/cpp/src/qpid/store/ms-clfs/MessageLog.cpp
index 14d63a4cd4..849a0a44e8 100644
--- a/cpp/src/qpid/store/ms-clfs/MessageLog.cpp
+++ b/cpp/src/qpid/store/ms-clfs/MessageLog.cpp
@@ -32,6 +32,10 @@
#include "MessageLog.h"
#include "Lsn.h"
+namespace qpid {
+namespace store {
+namespace ms_clfs {
+
namespace {
// Structures that hold log records. Each has a type field at the start.
@@ -97,10 +101,6 @@ struct MessageDequeue {
} // namespace
-namespace qpid {
-namespace store {
-namespace ms_clfs {
-
void
MessageLog::initialize()
{
diff --git a/cpp/src/qpid/store/ms-clfs/Transaction.h b/cpp/src/qpid/store/ms-clfs/Transaction.h
index fd07f2fb2e..499b01d503 100644
--- a/cpp/src/qpid/store/ms-clfs/Transaction.h
+++ b/cpp/src/qpid/store/ms-clfs/Transaction.h
@@ -27,6 +27,7 @@
#include <boost/enable_shared_from_this.hpp>
#include <boost/shared_ptr.hpp>
#include <string>
+#include <vector>
#include "TransactionLog.h"
diff --git a/cpp/src/qpid/store/ms-clfs/TransactionLog.cpp b/cpp/src/qpid/store/ms-clfs/TransactionLog.cpp
index 04780e83e8..0ef046d7c8 100644
--- a/cpp/src/qpid/store/ms-clfs/TransactionLog.cpp
+++ b/cpp/src/qpid/store/ms-clfs/TransactionLog.cpp
@@ -33,6 +33,10 @@
#include "Transaction.h"
#include "Lsn.h"
+namespace qpid {
+namespace store {
+namespace ms_clfs {
+
namespace {
// Structures that hold log records. Each has a type field at the start.
@@ -95,10 +99,6 @@ struct TransactionDelete {
} // namespace
-namespace qpid {
-namespace store {
-namespace ms_clfs {
-
void
TransactionLog::initialize()
{
diff --git a/cpp/include/qpid/sys/MemStat.h b/cpp/src/qpid/sys/MemStat.h
index d855786cd5..d855786cd5 100644
--- a/cpp/include/qpid/sys/MemStat.h
+++ b/cpp/src/qpid/sys/MemStat.h
diff --git a/cpp/src/qpid/sys/Probes.h b/cpp/src/qpid/sys/Probes.h
new file mode 100644
index 0000000000..d30181c357
--- /dev/null
+++ b/cpp/src/qpid/sys/Probes.h
@@ -0,0 +1,65 @@
+#ifndef _sys_Probes
+#define _sys_Probes
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include "config.h"
+
+#ifdef HAVE_SYS_SDT_H
+#include <sys/sdt.h>
+#endif
+
+// Pragmatically it seems that Linux and Solaris versions of sdt.h which support
+// user static probes define up to DTRACE_PROBE8, but FreeBSD 8 which doesn't
+// support usdt only defines up to DTRACE_PROBE4 - FreeBSD 9 which does support usdt
+// defines up to DTRACE_PROBE5.
+
+#ifdef DTRACE_PROBE5
+// Versions for Linux Systemtap/Solaris/FreeBSD 9
+#define QPID_PROBE(probe) DTRACE_PROBE(qpid, probe)
+#define QPID_PROBE1(probe, p1) DTRACE_PROBE1(qpid, probe, p1)
+#define QPID_PROBE2(probe, p1, p2) DTRACE_PROBE2(qpid, probe, p1, p2)
+#define QPID_PROBE3(probe, p1, p2, p3) DTRACE_PROBE3(qpid, probe, p1, p2, p3)
+#define QPID_PROBE4(probe, p1, p2, p3, p4) DTRACE_PROBE4(qpid, probe, p1, p2, p3, p4)
+#define QPID_PROBE5(probe, p1, p2, p3, p4, p5) DTRACE_PROBE5(qpid, probe, p1, p2, p3, p4, p5)
+#else
+// FreeBSD 8
+#define QPID_PROBE(probe)
+#define QPID_PROBE1(probe, p1)
+#define QPID_PROBE2(probe, p1, p2)
+#define QPID_PROBE3(probe, p1, p2, p3)
+#define QPID_PROBE4(probe, p1, p2, p3, p4)
+#define QPID_PROBE5(probe, p1, p2, p3, p4, p5)
+#endif
+
+#ifdef DTRACE_PROBE8
+// Versions for Linux Systemtap
+#define QPID_PROBE6(probe, p1, p2, p3, p4, p5, p6) DTRACE_PROBE6(qpid, probe, p1, p2, p3, p4, p5, p6)
+#define QPID_PROBE7(probe, p1, p2, p3, p4, p5, p6, p7) DTRACE_PROBE7(qpid, probe, p1, p2, p3, p4, p5, p6, p7)
+#define QPID_PROBE8(probe, p1, p2, p3, p4, p5, p6, p7, p8) DTRACE_PROBE8(qpid, probe, p1, p2, p3, p4, p5, p6, p7, p8)
+#else
+// Versions for Solaris/FreeBSD
+#define QPID_PROBE6(probe, p1, p2, p3, p4, p5, p6)
+#define QPID_PROBE7(probe, p1, p2, p3, p4, p5, p6, p7)
+#define QPID_PROBE8(probe, p1, p2, p3, p4, p5, p6, p7, p8)
+#endif
+
+#endif // _sys_Probes
diff --git a/cpp/src/qpid/sys/apr/APRBase.cpp b/cpp/src/qpid/sys/apr/APRBase.cpp
deleted file mode 100644
index 8bdba66bdc..0000000000
--- a/cpp/src/qpid/sys/apr/APRBase.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-#include <iostream>
-#include "qpid/log/Statement.h"
-#include "qpid/sys/apr/APRBase.h"
-
-using namespace qpid::sys;
-
-APRBase* APRBase::instance = 0;
-
-APRBase* APRBase::getInstance(){
- if(instance == 0){
- instance = new APRBase();
- }
- return instance;
-}
-
-
-APRBase::APRBase() : count(0){
- apr_initialize();
- CHECK_APR_SUCCESS(apr_pool_create(&pool, 0));
- CHECK_APR_SUCCESS(apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_NESTED, pool));
-}
-
-APRBase::~APRBase(){
- CHECK_APR_SUCCESS(apr_thread_mutex_destroy(mutex));
- apr_pool_destroy(pool);
- apr_terminate();
-}
-
-bool APRBase::_increment(){
- bool deleted(false);
- CHECK_APR_SUCCESS(apr_thread_mutex_lock(mutex));
- if(this == instance){
- count++;
- }else{
- deleted = true;
- }
- CHECK_APR_SUCCESS(apr_thread_mutex_unlock(mutex));
- return !deleted;
-}
-
-void APRBase::_decrement(){
- APRBase* copy = 0;
- CHECK_APR_SUCCESS(apr_thread_mutex_lock(mutex));
- if(--count == 0){
- copy = instance;
- instance = 0;
- }
- CHECK_APR_SUCCESS(apr_thread_mutex_unlock(mutex));
- if(copy != 0){
- delete copy;
- }
-}
-
-void APRBase::increment(){
- int count = 0;
- while(count++ < 2 && !getInstance()->_increment())
- QPID_LOG(warning, "APR initialization triggered concurrently with termination.");
-}
-
-void APRBase::decrement(){
- getInstance()->_decrement();
-}
-
-std::string qpid::sys::get_desc(apr_status_t status){
- const int size = 50;
- char tmp[size];
- return std::string(apr_strerror(status, tmp, size));
-}
-
diff --git a/cpp/src/qpid/sys/apr/APRBase.h b/cpp/src/qpid/sys/apr/APRBase.h
deleted file mode 100644
index 7b5644a129..0000000000
--- a/cpp/src/qpid/sys/apr/APRBase.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-#ifndef _APRBase_
-#define _APRBase_
-
-#include <string>
-#include <apr_thread_mutex.h>
-#include <apr_errno.h>
-
-namespace qpid {
-namespace sys {
-
- /**
- * Use of APR libraries necessitates explicit init and terminate
- * calls. Any class using APR libs should obtain the reference to
- * this singleton and increment on construction, decrement on
- * destruction. This class can then correctly initialise apr
- * before the first use and terminate after the last use.
- */
- class APRBase{
- static APRBase* instance;
- apr_pool_t* pool;
- apr_thread_mutex_t* mutex;
- int count;
-
- APRBase();
- ~APRBase();
- static APRBase* getInstance();
- bool _increment();
- void _decrement();
- public:
- static void increment();
- static void decrement();
- };
-
- //this is also a convenient place for a helper function for error checking:
- void check(apr_status_t status, const char* file, const int line);
- std::string get_desc(apr_status_t status);
-
-#define CHECK_APR_SUCCESS(A) qpid::sys::check(A, __FILE__, __LINE__);
-
-}
-}
-
-// Inlined as it is called *a lot*
-void inline qpid::sys::check(apr_status_t status, const char* file, const int line){
- if (status != APR_SUCCESS){
- char tmp[256];
- throw Exception(QPID_MSG(apr_strerror(status, tmp, size)))
- }
-}
-
-
-
-
-#endif
diff --git a/cpp/src/qpid/sys/apr/APRPool.cpp b/cpp/src/qpid/sys/apr/APRPool.cpp
deleted file mode 100644
index e221bfc2f1..0000000000
--- a/cpp/src/qpid/sys/apr/APRPool.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "qpid/sys/apr/APRPool.h"
-#include "qpid/sys/apr/APRBase.h"
-#include <boost/pool/detail/singleton.hpp>
-
-using namespace qpid::sys;
-
-APRPool::APRPool(){
- APRBase::increment();
- CHECK_APR_SUCCESS(apr_pool_create(&pool, NULL));
-}
-
-APRPool::~APRPool(){
- apr_pool_destroy(pool);
- APRBase::decrement();
-}
-
-apr_pool_t* APRPool::get() {
- return boost::details::pool::singleton_default<APRPool>::instance().pool;
-}
-
diff --git a/cpp/src/qpid/sys/apr/APRPool.h b/cpp/src/qpid/sys/apr/APRPool.h
deleted file mode 100644
index da7661fcfa..0000000000
--- a/cpp/src/qpid/sys/apr/APRPool.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef _APRPool_
-#define _APRPool_
-
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-#include <boost/noncopyable.hpp>
-#include <apr_pools.h>
-
-namespace qpid {
-namespace sys {
-/**
- * Singleton APR memory pool.
- */
-class APRPool : private boost::noncopyable {
- public:
- APRPool();
- ~APRPool();
-
- /** Get singleton instance */
- static apr_pool_t* get();
-
- private:
- apr_pool_t* pool;
-};
-
-}}
-
-
-
-
-
-#endif /*!_APRPool_*/
diff --git a/cpp/src/qpid/sys/apr/Condition.h b/cpp/src/qpid/sys/apr/Condition.h
deleted file mode 100644
index 66d465ca75..0000000000
--- a/cpp/src/qpid/sys/apr/Condition.h
+++ /dev/null
@@ -1,84 +0,0 @@
-#ifndef _sys_apr_Condition_h
-#define _sys_apr_Condition_h
-
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "qpid/sys/apr/APRPool.h"
-#include "qpid/sys/Mutex.h"
-#include "qpid/sys/Time.h"
-
-#include <sys/errno.h>
-#include <boost/noncopyable.hpp>
-#include <apr_thread_cond.h>
-
-namespace qpid {
-namespace sys {
-
-/**
- * A condition variable for thread synchronization.
- */
-class Condition
-{
- public:
- inline Condition();
- inline ~Condition();
- inline void wait(Mutex&);
- inline bool wait(Mutex&, const AbsTime& absoluteTime);
- inline void notify();
- inline void notifyAll();
-
- private:
- apr_thread_cond_t* condition;
-};
-
-
-Condition::Condition() {
- CHECK_APR_SUCCESS(apr_thread_cond_create(&condition, APRPool::get()));
-}
-
-Condition::~Condition() {
- CHECK_APR_SUCCESS(apr_thread_cond_destroy(condition));
-}
-
-void Condition::wait(Mutex& mutex) {
- CHECK_APR_SUCCESS(apr_thread_cond_wait(condition, mutex.mutex));
-}
-
-bool Condition::wait(Mutex& mutex, const AbsTime& absoluteTime){
- // APR uses microseconds.
- apr_status_t status =
- apr_thread_cond_timedwait(
- condition, mutex.mutex, Duration(now(), absoluteTime)/TIME_USEC);
- if(status != APR_TIMEUP) CHECK_APR_SUCCESS(status);
- return status == 0;
-}
-
-void Condition::notify(){
- CHECK_APR_SUCCESS(apr_thread_cond_signal(condition));
-}
-
-void Condition::notifyAll(){
- CHECK_APR_SUCCESS(apr_thread_cond_broadcast(condition));
-}
-
-}}
-#endif /*!_sys_apr_Condition_h*/
diff --git a/cpp/src/qpid/sys/apr/Mutex.h b/cpp/src/qpid/sys/apr/Mutex.h
deleted file mode 100644
index cb75f5b339..0000000000
--- a/cpp/src/qpid/sys/apr/Mutex.h
+++ /dev/null
@@ -1,124 +0,0 @@
-#ifndef _sys_apr_Mutex_h
-#define _sys_apr_Mutex_h
-
-/*
- *
- * Copyright (c) 2006 The Apache Software Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include "qpid/sys/apr/APRBase.h"
-#include "qpid/sys/apr/APRPool.h"
-
-#include <boost/noncopyable.hpp>
-#include <apr_thread_mutex.h>
-
-namespace qpid {
-namespace sys {
-
-class Condition;
-
-/**
- * Mutex lock.
- */
-class Mutex : private boost::noncopyable {
- public:
- typedef ScopedLock<Mutex> ScopedLock;
- typedef ScopedUnlock<Mutex> ScopedUnlock;
-
- inline Mutex();
- inline ~Mutex();
- inline void lock();
- inline void unlock();
- inline bool trylock();
-
- protected:
- apr_thread_mutex_t* mutex;
- friend class Condition;
-};
-
-Mutex::Mutex() {
- CHECK_APR_SUCCESS(apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_NESTED, APRPool::get()));
-}
-
-Mutex::~Mutex(){
- CHECK_APR_SUCCESS(apr_thread_mutex_destroy(mutex));
-}
-
-void Mutex::lock() {
- CHECK_APR_SUCCESS(apr_thread_mutex_lock(mutex));
-}
-void Mutex::unlock() {
- CHECK_APR_SUCCESS(apr_thread_mutex_unlock(mutex));
-}
-
-bool Mutex::trylock() {
- return apr_thread_mutex_trylock(mutex) == 0;
-}
-
-
-/**
- * RW lock.
- */
-class RWlock : private boost::noncopyable {
- friend class Condition;
-
-public:
- typedef ScopedRlock<RWlock> ScopedRlock;
- typedef ScopedWlock<RWlock> ScopedWlock;
-
- inline RWlock();
- inline ~RWlock();
- inline void wlock(); // will write-lock
- inline void rlock(); // will read-lock
- inline void unlock();
- inline bool trywlock(); // will write-try
- inline bool tryrlock(); // will read-try
-
- protected:
- apr_thread_mutex_t* mutex;
-};
-
-RWlock::RWlock() {
- CHECK_APR_SUCCESS(apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_NESTED, APRPool::get()));
-}
-
-RWlock::~RWlock(){
- CHECK_APR_SUCCESS(apr_thread_mutex_destroy(mutex));
-}
-
-void RWlock::wlock() {
- CHECK_APR_SUCCESS(apr_thread_mutex_lock(mutex));
-}
-
-void RWlock::rlock() {
- CHECK_APR_SUCCESS(apr_thread_mutex_lock(mutex));
-}
-
-void RWlock::unlock() {
- CHECK_APR_SUCCESS(apr_thread_mutex_unlock(mutex));
-}
-
-bool RWlock::trywlock() {
- return apr_thread_mutex_trylock(mutex) == 0;
-}
-
-bool RWlock::tryrlock() {
- return apr_thread_mutex_trylock(mutex) == 0;
-}
-
-
-}}
-#endif /*!_sys_apr_Mutex_h*/
diff --git a/cpp/src/qpid/sys/apr/Shlib.cpp b/cpp/src/qpid/sys/apr/Shlib.cpp
deleted file mode 100644
index b7ee13a03b..0000000000
--- a/cpp/src/qpid/sys/apr/Shlib.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "qpid/sys/Shlib.h"
-#include "qpid/sys/apr/APRBase.h"
-#include "qpid/sys/apr/APRPool.h"
-#include <apr_dso.h>
-
-namespace qpid {
-namespace sys {
-
-void Shlib::load(const char* libname) {
- apr_dso_handle_t* aprHandle;
- CHECK_APR_SUCCESS(
- apr_dso_load(&aprHandle, libname, APRPool::get()));
- handle=aprHandle;
-}
-
-void Shlib::unload() {
- CHECK_APR_SUCCESS(
- apr_dso_unload(static_cast<apr_dso_handle_t*>(handle)));
-}
-
-void* Shlib::getSymbol(const char* name) {
- apr_dso_handle_sym_t symbol;
- CHECK_APR_SUCCESS(apr_dso_sym(&symbol,
- static_cast<apr_dso_handle_t*>(handle),
- name));
- return (void*) symbol;
-}
-
-}} // namespace qpid::sys
diff --git a/cpp/src/qpid/sys/apr/Socket.cpp b/cpp/src/qpid/sys/apr/Socket.cpp
deleted file mode 100644
index d9024d11c1..0000000000
--- a/cpp/src/qpid/sys/apr/Socket.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-
-#include "qpid/sys/Socket.h"
-
-#include "qpid/sys/apr/APRBase.h"
-#include "qpid/sys/apr/APRPool.h"
-
-#include <apr_network_io.h>
-
-namespace qpid {
-namespace sys {
-
-class SocketPrivate {
-public:
- SocketPrivate(apr_socket_t* s = 0) :
- socket(s)
- {}
-
- apr_socket_t* socket;
-};
-
-Socket::Socket() :
- impl(new SocketPrivate)
-{
- createTcp();
-}
-
-Socket::Socket(SocketPrivate* sp) :
- impl(sp)
-{}
-
-Socket::~Socket() {
- delete impl;
-}
-
-void Socket::createTcp() const {
- apr_socket_t*& socket = impl->socket;
- apr_socket_t* s;
- CHECK_APR_SUCCESS(
- apr_socket_create(
- &s, APR_INET, SOCK_STREAM, APR_PROTO_TCP,
- APRPool::get()));
- socket = s;
-}
-
-void Socket::setTimeout(const Duration& interval) const {
- apr_socket_t*& socket = impl->socket;
- apr_socket_timeout_set(socket, interval/TIME_USEC);
-}
-
-void Socket::connect(const std::string& host, int port) const {
- apr_socket_t*& socket = impl->socket;
- apr_sockaddr_t* address;
- CHECK_APR_SUCCESS(
- apr_sockaddr_info_get(
- &address, host.c_str(), APR_UNSPEC, port, APR_IPV4_ADDR_OK,
- APRPool::get()));
- CHECK_APR_SUCCESS(apr_socket_connect(socket, address));
-}
-
-void Socket::close() const {
- apr_socket_t*& socket = impl->socket;
- if (socket == 0) return;
- CHECK_APR_SUCCESS(apr_socket_close(socket));
- socket = 0;
-}
-
-ssize_t Socket::send(const void* data, size_t size) const
-{
- apr_socket_t*& socket = impl->socket;
- apr_size_t sent = size;
- apr_status_t status =
- apr_socket_send(socket, reinterpret_cast<const char*>(data), &sent);
- if (APR_STATUS_IS_TIMEUP(status)) return SOCKET_TIMEOUT;
- if (APR_STATUS_IS_EOF(status)) return SOCKET_EOF;
- CHECK_APR_SUCCESS(status);
- return sent;
-}
-
-ssize_t Socket::recv(void* data, size_t size) const
-{
- apr_socket_t*& socket = impl->socket;
- apr_size_t received = size;
- apr_status_t status =
- apr_socket_recv(socket, reinterpret_cast<char*>(data), &received);
- if (APR_STATUS_IS_TIMEUP(status))
- return SOCKET_TIMEOUT;
- if (APR_STATUS_IS_EOF(status))
- return SOCKET_EOF;
- CHECK_APR_SUCCESS(status);
- return received;
-}
-
-}} // namespace qpid::sys
diff --git a/cpp/src/qpid/sys/apr/Thread.cpp b/cpp/src/qpid/sys/apr/Thread.cpp
deleted file mode 100644
index b52d0e6ace..0000000000
--- a/cpp/src/qpid/sys/apr/Thread.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "qpid/sys/apr/Thread.h"
-#include "qpid/sys/Runnable.h"
-
-using namespace qpid::sys;
-using qpid::sys::Runnable;
-
-void* APR_THREAD_FUNC Thread::runRunnable(apr_thread_t* thread, void *data) {
- reinterpret_cast<Runnable*>(data)->run();
- CHECK_APR_SUCCESS(apr_thread_exit(thread, APR_SUCCESS));
- return NULL;
-}
-
-
diff --git a/cpp/src/qpid/sys/apr/Thread.h b/cpp/src/qpid/sys/apr/Thread.h
deleted file mode 100644
index 6cc63db5c9..0000000000
--- a/cpp/src/qpid/sys/apr/Thread.h
+++ /dev/null
@@ -1,106 +0,0 @@
-#ifndef _sys_apr_Thread_h
-#define _sys_apr_Thread_h
-
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "qpid/sys/apr/APRPool.h"
-#include "qpid/sys/apr/APRBase.h"
-
-#include <apr_thread_proc.h>
-#include <apr_portable.h>
-
-namespace qpid {
-namespace sys {
-
-class Runnable;
-
-class Thread
-{
- public:
- inline static Thread current();
-
- /** ID of current thread for logging.
- * Workaround for broken Thread::current() in APR
- */
- inline static long logId();
-
- inline static void yield();
-
- inline Thread();
- inline explicit Thread(qpid::sys::Runnable*);
- inline explicit Thread(qpid::sys::Runnable&);
-
- inline void join();
-
- inline long id();
-
- private:
- static void* APR_THREAD_FUNC runRunnable(apr_thread_t* thread, void *data);
- inline Thread(apr_thread_t* t);
- apr_thread_t* thread;
-};
-
-Thread::Thread() : thread(0) {}
-
-Thread::Thread(Runnable* runnable) {
- CHECK_APR_SUCCESS(
- apr_thread_create(&thread, 0, runRunnable, runnable, APRPool::get()));
-}
-
-Thread::Thread(Runnable& runnable) {
- CHECK_APR_SUCCESS(
- apr_thread_create(&thread, 0, runRunnable, &runnable, APRPool::get()));
-}
-
-void Thread::join(){
- apr_status_t status;
- if (thread != 0)
- CHECK_APR_SUCCESS(apr_thread_join(&status, thread));
-}
-
-long Thread::id() {
- return long(thread);
-}
-
-/** ID of current thread for logging.
- * Workaround for broken Thread::current() in APR
- */
-long Thread::logId() {
- return static_cast<long>(apr_os_thread_current());
-}
-
-Thread::Thread(apr_thread_t* t) : thread(t) {}
-
-Thread Thread::current(){
- apr_thread_t* thr;
- apr_os_thread_t osthr = apr_os_thread_current();
- CHECK_APR_SUCCESS(apr_os_thread_put(&thr, &osthr, APRPool::get()));
- return Thread(thr);
-}
-
-void Thread::yield()
-{
- apr_thread_yield();
-}
-
-}}
-#endif /*!_sys_apr_Thread_h*/
diff --git a/cpp/src/qpid/sys/apr/Time.cpp b/cpp/src/qpid/sys/apr/Time.cpp
deleted file mode 100644
index 34e740b144..0000000000
--- a/cpp/src/qpid/sys/apr/Time.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "qpid/sys/Time.h"
-
-#include <apr_time.h>
-
-namespace qpid {
-namespace sys {
-
-AbsTime AbsTime::now() {
- AbsTime time_now;
- time_now.time_ns = apr_time_now() * TIME_USEC;
- return time_now;
-}
-
-}}
-
diff --git a/cpp/src/qpid/sys/posix/AsynchIO.cpp b/cpp/src/qpid/sys/posix/AsynchIO.cpp
index a1c161b596..01ff8b6bfa 100644
--- a/cpp/src/qpid/sys/posix/AsynchIO.cpp
+++ b/cpp/src/qpid/sys/posix/AsynchIO.cpp
@@ -23,6 +23,7 @@
#include "qpid/sys/Socket.h"
#include "qpid/sys/SocketAddress.h"
#include "qpid/sys/Poller.h"
+#include "qpid/sys/Probes.h"
#include "qpid/sys/DispatchHandle.h"
#include "qpid/sys/Time.h"
#include "qpid/log/Statement.h"
@@ -40,7 +41,9 @@
#include <boost/bind.hpp>
#include <boost/lexical_cast.hpp>
-using namespace qpid::sys;
+namespace qpid {
+namespace sys {
+namespace posix {
namespace {
@@ -70,10 +73,6 @@ __thread int64_t threadMaxIoTimeNs = 2 * 1000000; // start at 2ms
/*
* Asynch Acceptor
*/
-namespace qpid {
-namespace sys {
-namespace posix {
-
class AsynchAcceptor : public qpid::sys::AsynchAcceptor {
public:
AsynchAcceptor(const Socket& s, AsynchAcceptor::Callback callback);
@@ -423,9 +422,12 @@ AsynchIO::BufferBase* AsynchIO::getQueuedBuffer() {
void AsynchIO::readable(DispatchHandle& h) {
if (readingStopped) {
// We have been flow controlled.
+ QPID_PROBE1(asynchio_read_flowcontrolled, &h);
return;
}
AbsTime readStartTime = AbsTime::now();
+ size_t total = 0;
+ int readCalls = 0;
do {
// (Try to) get a buffer
if (!bufferQueue.empty()) {
@@ -436,23 +438,29 @@ void AsynchIO::readable(DispatchHandle& h) {
errno = 0;
int readCount = buff->byteCount-buff->dataCount;
int rc = socket.read(buff->bytes + buff->dataCount, readCount);
+ int64_t duration = Duration(readStartTime, AbsTime::now());
+ ++readCalls;
if (rc > 0) {
buff->dataCount += rc;
threadReadTotal += rc;
+ total += rc;
readCallback(*this, buff);
if (readingStopped) {
// We have been flow controlled.
+ QPID_PROBE4(asynchio_read_finished_flowcontrolled, &h, duration, total, readCalls);
break;
}
if (rc != readCount) {
// If we didn't fill the read buffer then time to stop reading
+ QPID_PROBE4(asynchio_read_finished_done, &h, duration, total, readCalls);
break;
}
// Stop reading if we've overrun our timeslot
- if (Duration(readStartTime, AbsTime::now()) > threadMaxIoTimeNs) {
+ if ( duration > threadMaxIoTimeNs) {
+ QPID_PROBE4(asynchio_read_finished_maxtime, &h, duration, total, readCalls);
break;
}
@@ -461,6 +469,7 @@ void AsynchIO::readable(DispatchHandle& h) {
bufferQueue.push_front(buff);
assert(buff);
+ QPID_PROBE5(asynchio_read_finished_error, &h, duration, total, readCalls, errno);
// Eof or other side has gone away
if (rc == 0 || errno == ECONNRESET) {
eofCallback(*this);
@@ -486,6 +495,7 @@ void AsynchIO::readable(DispatchHandle& h) {
// If we still have no buffers we can't do anything more
if (bufferQueue.empty()) {
h.unwatchRead();
+ QPID_PROBE4(asynchio_read_finished_nobuffers, &h, Duration(readStartTime, AbsTime::now()), total, readCalls);
break;
}
@@ -501,6 +511,8 @@ void AsynchIO::readable(DispatchHandle& h) {
*/
void AsynchIO::writeable(DispatchHandle& h) {
AbsTime writeStartTime = AbsTime::now();
+ size_t total = 0;
+ int writeCalls = 0;
do {
// See if we've got something to write
if (!writeQueue.empty()) {
@@ -510,14 +522,18 @@ void AsynchIO::writeable(DispatchHandle& h) {
errno = 0;
assert(buff->dataStart+buff->dataCount <= buff->byteCount);
int rc = socket.write(buff->bytes+buff->dataStart, buff->dataCount);
+ int64_t duration = Duration(writeStartTime, AbsTime::now());
+ ++writeCalls;
if (rc >= 0) {
threadWriteTotal += rc;
+ total += rc;
// If we didn't write full buffer put rest back
if (rc != buff->dataCount) {
buff->dataStart += rc;
buff->dataCount -= rc;
writeQueue.push_back(buff);
+ QPID_PROBE4(asynchio_write_finished_done, &h, duration, total, writeCalls);
break;
}
@@ -525,12 +541,15 @@ void AsynchIO::writeable(DispatchHandle& h) {
queueReadBuffer(buff);
// Stop writing if we've overrun our timeslot
- if (Duration(writeStartTime, AbsTime::now()) > threadMaxIoTimeNs) {
+ if (duration > threadMaxIoTimeNs) {
+ QPID_PROBE4(asynchio_write_finished_maxtime, &h, duration, total, writeCalls);
break;
}
} else {
// Put buffer back
writeQueue.push_back(buff);
+ QPID_PROBE5(asynchio_write_finished_error, &h, duration, total, writeCalls, errno);
+
if (errno == ECONNRESET || errno == EPIPE) {
// Just stop watching for write here - we'll get a
// disconnect callback soon enough
@@ -548,9 +567,13 @@ void AsynchIO::writeable(DispatchHandle& h) {
}
}
} else {
+ int64_t duration = Duration(writeStartTime, AbsTime::now());
+ (void) duration; // force duration to be used if no probes are compiled
+
// If we're waiting to close the socket then can do it now as there is nothing to write
if (queuedClose) {
close(h);
+ QPID_PROBE4(asynchio_write_finished_closed, &h, duration, total, writeCalls);
break;
}
// Fd is writable, but nothing to write
@@ -567,6 +590,7 @@ void AsynchIO::writeable(DispatchHandle& h) {
// desired rewatchWrite so we correct that here
if (writePending)
h.rewatchWrite();
+ QPID_PROBE4(asynchio_write_finished_nodata, &h, duration, total, writeCalls);
break;
}
}
diff --git a/cpp/src/qpid/sys/posix/PollableCondition.cpp b/cpp/src/qpid/sys/posix/PollableCondition.cpp
index b22a615a54..abff8a5be8 100644
--- a/cpp/src/qpid/sys/posix/PollableCondition.cpp
+++ b/cpp/src/qpid/sys/posix/PollableCondition.cpp
@@ -1,6 +1,3 @@
-#ifndef QPID_SYS_LINUX_POLLABLECONDITION_CPP
-#define QPID_SYS_LINUX_POLLABLECONDITION_CPP
-
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -120,5 +117,3 @@ void PollableCondition::set() { impl->set(); }
void PollableCondition::clear() { impl->clear(); }
}} // namespace qpid::sys
-
-#endif /*!QPID_SYS_LINUX_POLLABLECONDITION_CPP*/
diff --git a/cpp/src/qpid/sys/ssl/SslIo.cpp b/cpp/src/qpid/sys/ssl/SslIo.cpp
index 73f15617dc..2a7cf16923 100644
--- a/cpp/src/qpid/sys/ssl/SslIo.cpp
+++ b/cpp/src/qpid/sys/ssl/SslIo.cpp
@@ -37,8 +37,9 @@
#include <boost/bind.hpp>
-using namespace qpid::sys;
-using namespace qpid::sys::ssl;
+namespace qpid {
+namespace sys {
+namespace ssl {
namespace {
@@ -448,3 +449,5 @@ SecuritySettings SslIO::getSecuritySettings() {
settings.authid = socket.getClientAuthId();
return settings;
}
+
+}}}
diff --git a/cpp/src/qpid/sys/windows/AsynchIO.cpp b/cpp/src/qpid/sys/windows/AsynchIO.cpp
index 30378d4c5f..ae53414e52 100644
--- a/cpp/src/qpid/sys/windows/AsynchIO.cpp
+++ b/cpp/src/qpid/sys/windows/AsynchIO.cpp
@@ -291,6 +291,8 @@ private:
volatile LONG opsInProgress;
// Is there a write in progress?
volatile bool writeInProgress;
+ // Or a read?
+ volatile bool readInProgress;
// Deletion requested, but there are callbacks in progress.
volatile bool queuedDelete;
// Socket close requested, but there are operations in progress.
@@ -344,6 +346,11 @@ private:
* Called when there's a completion to process.
*/
void completion(AsynchIoResult *result);
+
+ /**
+ * Helper function to facilitate the close operation
+ */
+ void cancelRead();
};
// This is used to encapsulate pure callbacks into a handle
@@ -372,6 +379,7 @@ AsynchIO::AsynchIO(const Socket& s,
socket(s),
opsInProgress(0),
writeInProgress(false),
+ readInProgress(false),
queuedDelete(false),
queuedClose(false),
working(false) {
@@ -389,21 +397,24 @@ AsynchIO::~AsynchIO() {
}
void AsynchIO::queueForDeletion() {
- queuedDelete = true;
- if (opsInProgress > 0) {
- QPID_LOG(info, "Delete AsynchIO queued; ops in progress");
- // AsynchIOHandler calls this then deletes itself; don't do any more
- // callbacks.
- readCallback = 0;
- eofCallback = 0;
- disCallback = 0;
- closedCallback = 0;
- emptyCallback = 0;
- idleCallback = 0;
- }
- else {
- delete this;
+ {
+ ScopedLock<Mutex> l(completionLock);
+ assert(!queuedDelete);
+ queuedDelete = true;
+ if (working || opsInProgress > 0) {
+ QPID_LOG(info, "Delete AsynchIO queued; ops in progress");
+ // AsynchIOHandler calls this then deletes itself; don't do any more
+ // callbacks.
+ readCallback = 0;
+ eofCallback = 0;
+ disCallback = 0;
+ closedCallback = 0;
+ emptyCallback = 0;
+ idleCallback = 0;
+ return;
+ }
}
+ delete this;
}
void AsynchIO::start(Poller::shared_ptr poller0) {
@@ -451,9 +462,14 @@ void AsynchIO::notifyPendingWrite() {
}
void AsynchIO::queueWriteClose() {
- queuedClose = true;
- if (!writeInProgress)
- notifyPendingWrite();
+ {
+ ScopedLock<Mutex> l(completionLock);
+ queuedClose = true;
+ if (working || writeInProgress)
+ // no need to summon an IO thread
+ return;
+ }
+ notifyPendingWrite();
}
bool AsynchIO::writeQueueEmpty() {
@@ -466,7 +482,7 @@ bool AsynchIO::writeQueueEmpty() {
* called when the read is complete and data is available.
*/
void AsynchIO::startReading() {
- if (queuedDelete)
+ if (queuedDelete || queuedClose)
return;
// (Try to) get a buffer; look on the front since there may be an
@@ -489,6 +505,7 @@ void AsynchIO::startReading() {
readCount);
DWORD bytesReceived = 0, flags = 0;
InterlockedIncrement(&opsInProgress);
+ readInProgress = true;
int status = WSARecv(toSocketHandle(socket),
const_cast<LPWSABUF>(result->getWSABUF()), 1,
&bytesReceived,
@@ -616,17 +633,19 @@ void AsynchIO::close(void) {
void AsynchIO::readComplete(AsynchReadResult *result) {
int status = result->getStatus();
size_t bytes = result->getTransferred();
+ readInProgress = false;
if (status == 0 && bytes > 0) {
- bool restartRead = true; // May not if receiver doesn't want more
if (readCallback)
readCallback(*this, result->getBuff());
- if (restartRead)
- startReading();
+ startReading();
}
else {
// No data read, so put the buffer back. It may be partially filled,
// so "unread" it back to the front of the queue.
unread(result->getBuff());
+ if (queuedClose) {
+ return; // Expected from cancelRead()
+ }
notifyEof();
if (status != 0)
{
@@ -682,6 +701,8 @@ void AsynchIO::writeComplete(AsynchWriteResult *result) {
}
void AsynchIO::completion(AsynchIoResult *result) {
+ bool closing = false;
+ bool deleting = false;
{
ScopedLock<Mutex> l(completionLock);
if (working) {
@@ -713,6 +734,8 @@ void AsynchIO::completion(AsynchIoResult *result) {
delete result;
result = 0;
InterlockedDecrement(&opsInProgress);
+ if (queuedClose && opsInProgress == 1 && readInProgress)
+ cancelRead();
}
// Lock is held again.
if (completionQueue.empty())
@@ -721,17 +744,40 @@ void AsynchIO::completion(AsynchIoResult *result) {
completionQueue.pop();
}
working = false;
+ if (opsInProgress == 0) {
+ closing = queuedClose;
+ deleting = queuedDelete;
+ }
}
// Lock released; ok to close if ops are done and close requested.
// Layer above will call back to queueForDeletion() if it hasn't
// already been done. If it already has, go ahead and delete.
- if (opsInProgress == 0) {
- if (queuedClose)
- // close() may cause a delete; don't trust 'this' on return
- close();
- else if (queuedDelete)
- delete this;
+ if (deleting)
+ delete this;
+ else if (closing)
+ // close() may cause a delete; don't trust 'this' on return
+ close();
+}
+
+/*
+ * NOTE - this method must be called in the same context as other completions,
+ * so that the resulting readComplete, and final AsynchIO::close() is serialized
+ * after this method returns.
+ */
+void AsynchIO::cancelRead() {
+ if (queuedDelete)
+ return; // socket already deleted
+ else {
+ ScopedLock<Mutex> l(completionLock);;
+ if (!completionQueue.empty())
+ return; // process it; come back later if necessary
}
+ // Cancel outstanding read and force to completion. Otherwise, on a faulty
+ // physical link, the pending read can remain uncompleted indefinitely.
+ // Draining the pending read will result in the official close (and
+ // notifyClosed). CancelIoEX() is the natural choice, but not available in
+ // XP, so we make do with closesocket().
+ socket.close();
}
} // namespace windows
diff --git a/cpp/src/qpid/sys/windows/PollableCondition.cpp b/cpp/src/qpid/sys/windows/PollableCondition.cpp
index 6a1d9045b4..bb637be0a6 100644
--- a/cpp/src/qpid/sys/windows/PollableCondition.cpp
+++ b/cpp/src/qpid/sys/windows/PollableCondition.cpp
@@ -1,6 +1,3 @@
-#ifndef QPID_SYS_WINDOWS_POLLABLECONDITION_CPP
-#define QPID_SYS_WINDOWS_POLLABLECONDITION_CPP
-
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -110,5 +107,3 @@ void PollableCondition::clear() {
}
}} // namespace qpid::sys
-
-#endif /*!QPID_SYS_WINDOWS_POLLABLECONDITION_CPP*/
diff --git a/cpp/src/qpid/sys/windows/Socket.cpp b/cpp/src/qpid/sys/windows/Socket.cpp
index 1fa4768329..b085f67539 100644
--- a/cpp/src/qpid/sys/windows/Socket.cpp
+++ b/cpp/src/qpid/sys/windows/Socket.cpp
@@ -32,6 +32,9 @@
#include <winsock2.h>
+namespace qpid {
+namespace sys {
+
// Need to initialize WinSock. Ideally, this would be a singleton or embedded
// in some one-time initialization function. I tried boost singleton and could
// not get it to compile (and others located in google had the same problem).
@@ -76,13 +79,6 @@ protected:
static WinSockSetup setup;
-} /* namespace */
-
-namespace qpid {
-namespace sys {
-
-namespace {
-
std::string getName(SOCKET fd, bool local)
{
::sockaddr_storage name_s; // big enough for any socket address
diff --git a/cpp/src/qpid/sys/windows/SslAsynchIO.cpp b/cpp/src/qpid/sys/windows/SslAsynchIO.cpp
index 11a3389e45..25cc94b290 100644
--- a/cpp/src/qpid/sys/windows/SslAsynchIO.cpp
+++ b/cpp/src/qpid/sys/windows/SslAsynchIO.cpp
@@ -38,6 +38,10 @@
#include <queue>
#include <boost/bind.hpp>
+namespace qpid {
+namespace sys {
+namespace windows {
+
namespace {
/*
@@ -66,10 +70,6 @@ namespace {
};
}
-namespace qpid {
-namespace sys {
-namespace windows {
-
SslAsynchIO::SslAsynchIO(const qpid::sys::Socket& s,
CredHandle hCred,
ReadCallback rCb,
diff --git a/cpp/src/qpid/xml/XmlExchange.cpp b/cpp/src/qpid/xml/XmlExchange.cpp
index b7ff5d211d..01770e22a6 100644
--- a/cpp/src/qpid/xml/XmlExchange.cpp
+++ b/cpp/src/qpid/xml/XmlExchange.cpp
@@ -283,8 +283,10 @@ bool XmlExchange::matches(Query& query, Deliverable& msg, const qpid::framing::F
// But for very large messages, if all these queries are on the first part of the data,
// it could still be a big win.
-void XmlExchange::route(Deliverable& msg, const string& routingKey, const FieldTable* args)
+void XmlExchange::route(Deliverable& msg)
{
+ const string& routingKey = msg.getMessage().getRoutingKey();
+ const FieldTable* args = msg.getMessage().getApplicationHeaders();
PreRoute pr(msg, this);
try {
XmlBinding::vector::ConstPtr p;
diff --git a/cpp/src/qpid/xml/XmlExchange.h b/cpp/src/qpid/xml/XmlExchange.h
index 958bad4931..9ef389d9bf 100644
--- a/cpp/src/qpid/xml/XmlExchange.h
+++ b/cpp/src/qpid/xml/XmlExchange.h
@@ -82,7 +82,7 @@ class XmlExchange : public virtual Exchange {
virtual bool unbind(Queue::shared_ptr queue, const std::string& routingKey, const qpid::framing::FieldTable* args);
- virtual void route(Deliverable& msg, const std::string& routingKey, const qpid::framing::FieldTable* args);
+ virtual void route(Deliverable& msg);
virtual bool isBound(Queue::shared_ptr queue, const std::string* const routingKey, const qpid::framing::FieldTable* const args);
diff --git a/cpp/src/qpidd.cpp b/cpp/src/qpidd.cpp
index a0e329ca9d..b5686c6ab8 100644
--- a/cpp/src/qpidd.cpp
+++ b/cpp/src/qpidd.cpp
@@ -29,6 +29,9 @@
#include <memory>
using namespace std;
+namespace qpid {
+namespace broker {
+
auto_ptr<QpiddOptions> options;
// Broker real entry; various system-invoked entrypoints call here.
@@ -87,3 +90,4 @@ int run_broker(int argc, char *argv[], bool hidden)
}
return 1;
}
+}}
diff --git a/cpp/src/qpidd.h b/cpp/src/qpidd.h
index a3150a2737..f7f84d11da 100644
--- a/cpp/src/qpidd.h
+++ b/cpp/src/qpidd.h
@@ -26,6 +26,9 @@
#include <memory>
+namespace qpid {
+namespace broker {
+
// BootstrapOptions is a minimal subset of options used for a pre-parse
// of the command line to discover which plugin modules need to be loaded.
// The pre-parse is necessary because plugin modules may supply their own
@@ -70,4 +73,5 @@ public:
// Broker real entry; various system-invoked entrypoints call here.
int run_broker(int argc, char *argv[], bool hidden = false);
+}}
#endif /*!QPID_H*/
diff --git a/cpp/src/tests/Array.cpp b/cpp/src/tests/Array.cpp
index 7622b89d15..8ce7615162 100644
--- a/cpp/src/tests/Array.cpp
+++ b/cpp/src/tests/Array.cpp
@@ -58,7 +58,7 @@ QPID_AUTO_TEST_CASE(testEncodeDecode)
BOOST_CHECK_EQUAL(a, b);
std::vector<std::string> data2;
- b.collect(data2);
+ std::transform(b.begin(), b.end(), std::back_inserter(data2), Array::get<std::string, Array::ValuePtr>);
//BOOST_CHECK_EQUAL(data, data2);
BOOST_CHECK(data == data2);
}
@@ -74,7 +74,7 @@ QPID_AUTO_TEST_CASE(testArrayAssignment)
BOOST_CHECK_EQUAL(a, b);
}
std::vector<std::string> data2;
- b.collect(data2);
+ std::transform(b.begin(), b.end(), std::back_inserter(data2), Array::get<std::string, Array::ValuePtr>);
//BOOST_CHECK_EQUAL(data, data2);
BOOST_CHECK(data == data2);
}
diff --git a/cpp/src/tests/CMakeLists.txt b/cpp/src/tests/CMakeLists.txt
index 75ecffe866..5979ce42ae 100644
--- a/cpp/src/tests/CMakeLists.txt
+++ b/cpp/src/tests/CMakeLists.txt
@@ -23,7 +23,11 @@ include (CTest)
# Make sure that everything get built before the tests
# Need to create a var with all the necessary top level targets
-add_definitions(-DBOOST_TEST_DYN_LINK)
+# If we're linking Boost for DLLs, turn that on for the unit test too.
+if (QPID_LINK_BOOST_DYNAMIC)
+ add_definitions(-DBOOST_TEST_DYN_LINK)
+endif (QPID_LINK_BOOST_DYNAMIC)
+
include_directories( ${CMAKE_CURRENT_SOURCE_DIR} )
include (FindPythonInterp)
@@ -34,8 +38,14 @@ set (abs_builddir ${CMAKE_CURRENT_BINARY_DIR})
set (abs_top_srcdir ${CMAKE_SOURCE_DIR})
set (abs_top_builddir ${CMAKE_BINARY_DIR})
set (builddir_lib_suffix "")
-configure_file (${CMAKE_CURRENT_SOURCE_DIR}/test_env.sh.in
- ${CMAKE_CURRENT_BINARY_DIR}/test_env.sh)
+
+if (CMAKE_SYSTEM_NAME STREQUAL Windows)
+ configure_file (${CMAKE_CURRENT_SOURCE_DIR}/test_env.ps1.in
+ ${CMAKE_CURRENT_BINARY_DIR}/test_env.ps1)
+else (CMAKE_SYSTEM_NAME STREQUAL Windows)
+ configure_file (${CMAKE_CURRENT_SOURCE_DIR}/test_env.sh.in
+ ${CMAKE_CURRENT_BINARY_DIR}/test_env.sh)
+endif (CMAKE_SYSTEM_NAME STREQUAL Windows)
# If valgrind is selected in the configuration step, set up the path to it
@@ -145,13 +155,6 @@ set(unit_tests_to_build
mark_as_advanced(unit_tests_to_build)
-# Disabled till we move to amqp_0_10 codec.
-# amqp_0_10/serialize.cpp allSegmentTypes.h \
-# amqp_0_10/ProxyTemplate.cpp \
-# amqp_0_10/apply.cpp \
-# amqp_0_10/Map.cpp \
-# amqp_0_10/handlers.cpp
-
add_executable (unit_test unit_test
${unit_tests_to_build} ${platform_test_additions})
target_link_libraries (unit_test
@@ -320,7 +323,7 @@ if (BUILD_MSSQL)
add_test (store_tests ${shell} ${CMAKE_CURRENT_SOURCE_DIR}/run_store_tests${test_script_suffix} MSSQL)
endif (BUILD_MSSQL)
if (BUILD_MSCLFS)
- add_test (store_tests ${shell} ${CMAKE_CURRENT_SOURCE_DIR}/run_store_tests${test_script_suffix} MSSQL-CLFS)
+ add_test (store_tests_clfs ${shell} ${CMAKE_CURRENT_SOURCE_DIR}/run_store_tests${test_script_suffix} MSSQL-CLFS)
endif (BUILD_MSCLFS)
endif (PYTHON_EXECUTABLE)
diff --git a/cpp/src/tests/ExchangeTest.cpp b/cpp/src/tests/ExchangeTest.cpp
index fe72f42a46..2fb284741a 100644
--- a/cpp/src/tests/ExchangeTest.cpp
+++ b/cpp/src/tests/ExchangeTest.cpp
@@ -60,10 +60,10 @@ QPID_AUTO_TEST_CASE(testMe)
queue.reset();
queue2.reset();
- intrusive_ptr<Message> msgPtr(MessageUtils::createMessage("exchange", "key", false, "id"));
+ intrusive_ptr<Message> msgPtr(MessageUtils::createMessage("exchange", "abc", false, "id"));
DeliverableMessage msg(msgPtr);
- topic.route(msg, "abc", 0);
- direct.route(msg, "abc", 0);
+ topic.route(msg);
+ direct.route(msg);
}
@@ -187,17 +187,17 @@ QPID_AUTO_TEST_CASE(testSequenceOptions)
{
DirectExchange direct("direct1", false, args);
- intrusive_ptr<Message> msg1 = cmessage("e", "A");
- intrusive_ptr<Message> msg2 = cmessage("e", "B");
- intrusive_ptr<Message> msg3 = cmessage("e", "C");
+ intrusive_ptr<Message> msg1 = cmessage("e", "abc");
+ intrusive_ptr<Message> msg2 = cmessage("e", "abc");
+ intrusive_ptr<Message> msg3 = cmessage("e", "abc");
DeliverableMessage dmsg1(msg1);
DeliverableMessage dmsg2(msg2);
DeliverableMessage dmsg3(msg3);
- direct.route(dmsg1, "abc", 0);
- direct.route(dmsg2, "abc", 0);
- direct.route(dmsg3, "abc", 0);
+ direct.route(dmsg1);
+ direct.route(dmsg2);
+ direct.route(dmsg3);
BOOST_CHECK_EQUAL(1, msg1->getApplicationHeaders()->getAsInt64("qpid.msg_sequence"));
BOOST_CHECK_EQUAL(2, msg2->getApplicationHeaders()->getAsInt64("qpid.msg_sequence"));
@@ -208,22 +208,24 @@ QPID_AUTO_TEST_CASE(testSequenceOptions)
TopicExchange topic ("topic1", false, args);
// check other exchanges, that they preroute
- intrusive_ptr<Message> msg4 = cmessage("e", "A");
- intrusive_ptr<Message> msg5 = cmessage("e", "B");
- intrusive_ptr<Message> msg6 = cmessage("e", "C");
+ intrusive_ptr<Message> msg4 = cmessage("e", "abc");
+ intrusive_ptr<Message> msg5 = cmessage("e", "abc");
+
+ // Need at least empty header for the HeadersExchange to route at all
+ msg5->insertCustomProperty("", "");
+ intrusive_ptr<Message> msg6 = cmessage("e", "abc");
DeliverableMessage dmsg4(msg4);
DeliverableMessage dmsg5(msg5);
DeliverableMessage dmsg6(msg6);
- fanout.route(dmsg4, "abc", 0);
+ fanout.route(dmsg4);
BOOST_CHECK_EQUAL(1, msg4->getApplicationHeaders()->getAsInt64("qpid.msg_sequence"));
- FieldTable headers;
- header.route(dmsg5, "abc", &headers);
+ header.route(dmsg5);
BOOST_CHECK_EQUAL(1, msg5->getApplicationHeaders()->getAsInt64("qpid.msg_sequence"));
- topic.route(dmsg6, "abc", 0);
+ topic.route(dmsg6);
BOOST_CHECK_EQUAL(1, msg6->getApplicationHeaders()->getAsInt64("qpid.msg_sequence"));
direct.encode(buffer);
}
@@ -233,9 +235,9 @@ QPID_AUTO_TEST_CASE(testSequenceOptions)
buffer.reset();
DirectExchange::shared_ptr exch_dec = Exchange::decode(exchanges, buffer);
- intrusive_ptr<Message> msg1 = cmessage("e", "A");
+ intrusive_ptr<Message> msg1 = cmessage("e", "abc");
DeliverableMessage dmsg1(msg1);
- exch_dec->route(dmsg1, "abc", 0);
+ exch_dec->route(dmsg1);
BOOST_CHECK_EQUAL(4, msg1->getApplicationHeaders()->getAsInt64("qpid.msg_sequence"));
@@ -260,10 +262,10 @@ QPID_AUTO_TEST_CASE(testIVEOption)
args2.setString("x-match", "any");
args2.setString("a", "abc");
- direct.route(dmsg1, "abc", 0);
- fanout.route(dmsg1, "abc", 0);
- header.route(dmsg1, "abc", &args2);
- topic.route(dmsg1, "abc", 0);
+ direct.route(dmsg1);
+ fanout.route(dmsg1);
+ header.route(dmsg1);
+ topic.route(dmsg1);
Queue::shared_ptr queue(new Queue("queue", true));
Queue::shared_ptr queue1(new Queue("queue1", true));
Queue::shared_ptr queue2(new Queue("queue2", true));
diff --git a/cpp/src/tests/FieldTable.cpp b/cpp/src/tests/FieldTable.cpp
index fe2a14ec03..c79d110ae4 100644
--- a/cpp/src/tests/FieldTable.cpp
+++ b/cpp/src/tests/FieldTable.cpp
@@ -19,11 +19,11 @@
*
*/
#include <iostream>
+#include <algorithm>
#include "qpid/framing/Array.h"
#include "qpid/framing/FieldTable.h"
#include "qpid/framing/FieldValue.h"
#include "qpid/framing/List.h"
-#include "qpid/sys/alloca.h"
#include "unit_test.h"
@@ -127,7 +127,7 @@ QPID_AUTO_TEST_CASE(testNestedValues)
BOOST_CHECK(string("B") == b.getAsString("id"));
a.getArray("C", c);
std::vector<std::string> items;
- c.collect(items);
+ std::transform(c.begin(), c.end(), std::back_inserter(items), Array::get<std::string, Array::ValuePtr>);
BOOST_CHECK((uint) 2 == items.size());
BOOST_CHECK(string("one") == items[0]);
BOOST_CHECK(string("two") == items[1]);
diff --git a/cpp/src/tests/Frame.cpp b/cpp/src/tests/Frame.cpp
index 1270eabba3..cfcfde04a7 100644
--- a/cpp/src/tests/Frame.cpp
+++ b/cpp/src/tests/Frame.cpp
@@ -30,7 +30,6 @@ QPID_AUTO_TEST_SUITE(FrameTestSuite)
using namespace std;
using namespace qpid::framing;
-using namespace boost;
QPID_AUTO_TEST_CASE(testContentBody) {
Frame f(42, AMQContentBody("foobar"));
diff --git a/cpp/src/tests/FramingTest.cpp b/cpp/src/tests/FramingTest.cpp
index f8795316cc..2392b6fec4 100644
--- a/cpp/src/tests/FramingTest.cpp
+++ b/cpp/src/tests/FramingTest.cpp
@@ -25,6 +25,7 @@
#include "qpid/framing/all_method_bodies.h"
#include "qpid/framing/amqp_framing.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/FieldValue.h"
#include "unit_test.h"
#include <boost/bind.hpp>
diff --git a/cpp/src/tests/Makefile.am b/cpp/src/tests/Makefile.am
index 325019fb22..66d2cdd5d5 100644
--- a/cpp/src/tests/Makefile.am
+++ b/cpp/src/tests/Makefile.am
@@ -149,7 +149,7 @@ endif
# Test programs that are installed and therefore built as part of make, not make check
-qpidexectest_SCRIPTS += qpid-cpp-benchmark install_env.sh
+qpidexectest_SCRIPTS += qpid-cpp-benchmark qpid-cluster-benchmark install_env.sh
EXTRA_DIST += qpid-cpp-benchmark install_env.sh
qpidexectest_PROGRAMS += receiver
@@ -320,7 +320,7 @@ EXTRA_DIST += \
header_test.py \
ssl_test \
config.null \
- ais_check \
+ cpg_check.sh.in \
run_federation_tests \
run_federation_sys_tests \
run_long_federation_sys_tests \
@@ -351,7 +351,9 @@ EXTRA_DIST += \
topictest.ps1 \
run_queue_flow_limit_tests \
run_msg_group_tests \
- ipv6_test
+ ipv6_test \
+ ha_tests.py \
+ test_env.ps1.in
check_LTLIBRARIES += libdlclose_noop.la
libdlclose_noop_la_LDFLAGS = -module -rpath $(abs_builddir)
@@ -366,9 +368,15 @@ LONG_TESTS+=start_broker \
fanout_perftest shared_perftest multiq_perftest topic_perftest run_ring_queue_test \
run_msg_group_tests_soak \
stop_broker \
- run_long_federation_sys_tests \
- run_failover_soak reliable_replication_test \
- federated_cluster_test_with_node_failure
+ run_long_federation_sys_tests
+
+if HAVE_LIBCPG
+
+LONG_TESTS+= federated_cluster_test_with_node_failure \
+ run_failover_soak \
+ reliable_replication_test
+
+endif HAVE_LIBCPG
EXTRA_DIST+= \
fanout_perftest \
@@ -379,7 +387,8 @@ EXTRA_DIST+= \
reliable_replication_test \
federated_cluster_test_with_node_failure \
sasl_test_setup.sh \
- run_msg_group_tests_soak
+ run_msg_group_tests_soak \
+ qpidd-empty.conf
check-long:
$(MAKE) check TESTS="$(LONG_TESTS)" VALGRIND=
diff --git a/cpp/src/tests/MessagingSessionTests.cpp b/cpp/src/tests/MessagingSessionTests.cpp
index 313e8b3132..968d55fd45 100644
--- a/cpp/src/tests/MessagingSessionTests.cpp
+++ b/cpp/src/tests/MessagingSessionTests.cpp
@@ -1139,6 +1139,13 @@ QPID_AUTO_TEST_CASE(testHeadersExchange)
}
}
+QPID_AUTO_TEST_CASE(testLargeRoutingKey)
+{
+ MessagingFixture fix;
+ std::string address = "amq.direct/" + std::string(300, 'x');//routing/binding key can be at most 225 chars in 0-10
+ BOOST_CHECK_THROW(fix.session.createReceiver(address), qpid::messaging::MessagingException);
+}
+
QPID_AUTO_TEST_SUITE_END()
}} // namespace qpid::tests
diff --git a/cpp/src/tests/QueueFlowLimitTest.cpp b/cpp/src/tests/QueueFlowLimitTest.cpp
index 8a6923fb09..bd868398f8 100644
--- a/cpp/src/tests/QueueFlowLimitTest.cpp
+++ b/cpp/src/tests/QueueFlowLimitTest.cpp
@@ -27,6 +27,7 @@
#include "qpid/broker/QueueFlowLimit.h"
#include "qpid/sys/Time.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/FieldValue.h"
#include "MessageUtils.h"
#include "BrokerFixture.h"
diff --git a/cpp/src/tests/QueueTest.cpp b/cpp/src/tests/QueueTest.cpp
index bb4f7b9f4b..0058aa5133 100644
--- a/cpp/src/tests/QueueTest.cpp
+++ b/cpp/src/tests/QueueTest.cpp
@@ -254,8 +254,8 @@ QPID_AUTO_TEST_CASE(testBound){
//ensure the remaining exchanges don't still have the queue bound to them:
FailOnDeliver deliverable;
- exchange1->route(deliverable, key, &args);
- exchange3->route(deliverable, key, &args);
+ exchange1->route(deliverable);
+ exchange3->route(deliverable);
}
QPID_AUTO_TEST_CASE(testPersistLastNodeStanding){
@@ -1151,7 +1151,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg01 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
DeliverableMessage dmsg01(msg01);
- sbtFanout1.route(dmsg01, "", 0); // Brings queue 1 to capacity limit
+ sbtFanout1.route(dmsg01); // Brings queue 1 to capacity limit
msg01->tryReleaseContent();
BOOST_CHECK_EQUAL(msg01->isContentReleased(), false);
BOOST_CHECK_EQUAL(1u, tq1->getMessageCount());
@@ -1160,7 +1160,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
DeliverableMessage dmsg02(msg02);
{
ScopedSuppressLogging sl; // suppress expected error messages.
- BOOST_CHECK_THROW(sbtFanout1.route(dmsg02, "", 0), ResourceLimitExceededException);
+ BOOST_CHECK_THROW(sbtFanout1.route(dmsg02), ResourceLimitExceededException);
}
msg02->tryReleaseContent();
BOOST_CHECK_EQUAL(msg02->isContentReleased(), false);
@@ -1170,7 +1170,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
DeliverableMessage dmsg03(msg03);
{
ScopedSuppressLogging sl; // suppress expected error messages.
- BOOST_CHECK_THROW(sbtFanout1.route(dmsg03, "", 0), ResourceLimitExceededException);
+ BOOST_CHECK_THROW(sbtFanout1.route(dmsg03), ResourceLimitExceededException);
}
msg03->tryReleaseContent();
BOOST_CHECK_EQUAL(msg03->isContentReleased(), false);
@@ -1180,7 +1180,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
DeliverableMessage dmsg04(msg04);
{
ScopedSuppressLogging sl; // suppress expected error messages.
- BOOST_CHECK_THROW(sbtFanout1.route(dmsg04, "", 0), ResourceLimitExceededException);
+ BOOST_CHECK_THROW(sbtFanout1.route(dmsg04), ResourceLimitExceededException);
}
msg04->tryReleaseContent();
BOOST_CHECK_EQUAL(msg04->isContentReleased(), false);
@@ -1190,7 +1190,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
DeliverableMessage dmsg05(msg05);
{
ScopedSuppressLogging sl; // suppress expected error messages.
- BOOST_CHECK_THROW(sbtFanout1.route(dmsg05, "", 0), ResourceLimitExceededException);
+ BOOST_CHECK_THROW(sbtFanout1.route(dmsg05), ResourceLimitExceededException);
}
msg05->tryReleaseContent();
BOOST_CHECK_EQUAL(msg05->isContentReleased(), false);
@@ -1205,35 +1205,35 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg06 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
DeliverableMessage dmsg06(msg06);
- sbdFanout2.route(dmsg06, "", 0); // Brings queue 2 to capacity limit
+ sbdFanout2.route(dmsg06); // Brings queue 2 to capacity limit
msg06->tryReleaseContent();
BOOST_CHECK_EQUAL(msg06->isContentReleased(), false);
BOOST_CHECK_EQUAL(1u, dq2->getMessageCount());
intrusive_ptr<Message> msg07 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
DeliverableMessage dmsg07(msg07);
- sbdFanout2.route(dmsg07, "", 0);
+ sbdFanout2.route(dmsg07);
msg07->tryReleaseContent();
BOOST_CHECK_EQUAL(msg07->isContentReleased(), true);
BOOST_CHECK_EQUAL(2u, dq2->getMessageCount());
intrusive_ptr<Message> msg08 = mkMsg(testStore, std::string(5, 'X'), true); // durable w/ content
DeliverableMessage dmsg08(msg08);
- sbdFanout2.route(dmsg08, "", 0);
+ sbdFanout2.route(dmsg08);
msg08->tryReleaseContent();
BOOST_CHECK_EQUAL(msg08->isContentReleased(), true);
BOOST_CHECK_EQUAL(3u, dq2->getMessageCount());
intrusive_ptr<Message> msg09 = mkMsg(testStore); // transient no content
DeliverableMessage dmsg09(msg09);
- sbdFanout2.route(dmsg09, "", 0);
+ sbdFanout2.route(dmsg09);
msg09->tryReleaseContent();
BOOST_CHECK_EQUAL(msg09->isContentReleased(), true);
BOOST_CHECK_EQUAL(4u, dq2->getMessageCount());
intrusive_ptr<Message> msg10 = mkMsg(testStore, "", true); // durable no content
DeliverableMessage dmsg10(msg10);
- sbdFanout2.route(dmsg10, "", 0);
+ sbdFanout2.route(dmsg10);
msg10->tryReleaseContent();
BOOST_CHECK_EQUAL(msg10->isContentReleased(), true);
BOOST_CHECK_EQUAL(5u, dq2->getMessageCount());
@@ -1253,7 +1253,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg11 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
DeliverableMessage dmsg11(msg11);
- mbdFanout3.route(dmsg11, "", 0); // Brings queues 3 and 4 to capacity limit
+ mbdFanout3.route(dmsg11); // Brings queues 3 and 4 to capacity limit
msg11->tryReleaseContent();
BOOST_CHECK_EQUAL(msg11->isContentReleased(), false);
BOOST_CHECK_EQUAL(1u, dq3->getMessageCount());
@@ -1262,7 +1262,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg12 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
DeliverableMessage dmsg12(msg12);
- mbdFanout3.route(dmsg12, "", 0);
+ mbdFanout3.route(dmsg12);
msg12->tryReleaseContent();
BOOST_CHECK_EQUAL(msg12->isContentReleased(), false); // XXXX - consequence of transient msg multi-queue ftd policy-handling limitations, fix in broker at some point!
BOOST_CHECK_EQUAL(2u, dq3->getMessageCount());
@@ -1271,7 +1271,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg13 = mkMsg(testStore, std::string(5, 'X'), true); // durable w/ content
DeliverableMessage dmsg13(msg13);
- mbdFanout3.route(dmsg13, "", 0);
+ mbdFanout3.route(dmsg13);
msg13->tryReleaseContent();
BOOST_CHECK_EQUAL(msg13->isContentReleased(), true);
BOOST_CHECK_EQUAL(3u, dq3->getMessageCount());
@@ -1280,7 +1280,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg14 = mkMsg(testStore); // transient no content
DeliverableMessage dmsg14(msg14);
- mbdFanout3.route(dmsg14, "", 0);
+ mbdFanout3.route(dmsg14);
msg14->tryReleaseContent();
BOOST_CHECK_EQUAL(msg14->isContentReleased(), false); // XXXX - consequence of transient msg multi-queue ftd policy-handling limitations, fix in broker at some point!
BOOST_CHECK_EQUAL(4u, dq3->getMessageCount());
@@ -1289,7 +1289,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg15 = mkMsg(testStore, "", true); // durable no content
DeliverableMessage dmsg15(msg15);
- mbdFanout3.route(dmsg15, "", 0);
+ mbdFanout3.route(dmsg15);
msg15->tryReleaseContent();
BOOST_CHECK_EQUAL(msg15->isContentReleased(), true);
BOOST_CHECK_EQUAL(5u, dq3->getMessageCount());
@@ -1307,7 +1307,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg16 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
DeliverableMessage dmsg16(msg16);
- mbdFanout3.route(dmsg16, "", 0);
+ mbdFanout3.route(dmsg16);
msg16->tryReleaseContent();
BOOST_CHECK_EQUAL(msg16->isContentReleased(), false);
BOOST_CHECK_EQUAL(6u, dq3->getMessageCount());
@@ -1316,7 +1316,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg17 = mkMsg(testStore, std::string(5, 'X'), true); // durable w/ content
DeliverableMessage dmsg17(msg17);
- mbdFanout3.route(dmsg17, "", 0);
+ mbdFanout3.route(dmsg17);
msg17->tryReleaseContent();
BOOST_CHECK_EQUAL(msg17->isContentReleased(), false);
BOOST_CHECK_EQUAL(7u, dq3->getMessageCount());
@@ -1325,7 +1325,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg18 = mkMsg(testStore); // transient no content
DeliverableMessage dmsg18(msg18);
- mbdFanout3.route(dmsg18, "", 0);
+ mbdFanout3.route(dmsg18);
msg18->tryReleaseContent();
BOOST_CHECK_EQUAL(msg18->isContentReleased(), false);
BOOST_CHECK_EQUAL(8u, dq3->getMessageCount());
@@ -1334,7 +1334,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg19 = mkMsg(testStore, "", true); // durable no content
DeliverableMessage dmsg19(msg19);
- mbdFanout3.route(dmsg19, "", 0);
+ mbdFanout3.route(dmsg19);
msg19->tryReleaseContent();
BOOST_CHECK_EQUAL(msg19->isContentReleased(), false);
BOOST_CHECK_EQUAL(9u, dq3->getMessageCount());
@@ -1357,7 +1357,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg20 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
DeliverableMessage dmsg20(msg20);
- mbmFanout4.route(dmsg20, "", 0); // Brings queue 7 to capacity limit
+ mbmFanout4.route(dmsg20); // Brings queue 7 to capacity limit
msg20->tryReleaseContent();
BOOST_CHECK_EQUAL(msg20->isContentReleased(), false);
BOOST_CHECK_EQUAL(1u, dq7->getMessageCount());
@@ -1366,7 +1366,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg21 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
DeliverableMessage dmsg21(msg21);
- mbmFanout4.route(dmsg21, "", 0);
+ mbmFanout4.route(dmsg21);
msg21->tryReleaseContent();
BOOST_CHECK_EQUAL(msg21->isContentReleased(), false);
BOOST_CHECK_EQUAL(2u, dq7->getMessageCount()); // over limit
@@ -1375,7 +1375,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg22 = mkMsg(testStore, std::string(5, 'X'), true); // durable w/ content
DeliverableMessage dmsg22(msg22);
- mbmFanout4.route(dmsg22, "", 0);
+ mbmFanout4.route(dmsg22);
msg22->tryReleaseContent();
BOOST_CHECK_EQUAL(msg22->isContentReleased(), false);
BOOST_CHECK_EQUAL(3u, dq7->getMessageCount()); // over limit
@@ -1384,7 +1384,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg23 = mkMsg(testStore); // transient no content
DeliverableMessage dmsg23(msg23);
- mbmFanout4.route(dmsg23, "", 0);
+ mbmFanout4.route(dmsg23);
msg23->tryReleaseContent();
BOOST_CHECK_EQUAL(msg23->isContentReleased(), false);
BOOST_CHECK_EQUAL(4u, dq7->getMessageCount()); // over limit
@@ -1393,7 +1393,7 @@ QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
intrusive_ptr<Message> msg24 = mkMsg(testStore, "", true); // durable no content
DeliverableMessage dmsg24(msg24);
- mbmFanout4.route(dmsg24, "", 0);
+ mbmFanout4.route(dmsg24);
msg24->tryReleaseContent();
BOOST_CHECK_EQUAL(msg24->isContentReleased(), false);
BOOST_CHECK_EQUAL(5u, dq7->getMessageCount()); // over limit
diff --git a/cpp/src/tests/RefCounted.cpp b/cpp/src/tests/RefCounted.cpp
index e4c1da5696..3ac3895322 100644
--- a/cpp/src/tests/RefCounted.cpp
+++ b/cpp/src/tests/RefCounted.cpp
@@ -21,15 +21,15 @@
#include "unit_test.h"
+namespace qpid {
+namespace tests {
+
QPID_AUTO_TEST_SUITE(RefCountedTestSuiteTestSuite)
using boost::intrusive_ptr;
using namespace std;
using namespace qpid;
-namespace qpid {
-namespace tests {
-
struct CountMe : public RefCounted {
static int instances;
CountMe() { ++instances; }
diff --git a/cpp/src/tests/SessionState.cpp b/cpp/src/tests/SessionState.cpp
index 3be9bb0cbc..1cf3415484 100644
--- a/cpp/src/tests/SessionState.cpp
+++ b/cpp/src/tests/SessionState.cpp
@@ -34,7 +34,6 @@ namespace tests {
QPID_AUTO_TEST_SUITE(SessionStateTestSuite)
using namespace std;
-using namespace boost;
using namespace qpid::framing;
// ================================================================
diff --git a/cpp/src/tests/StringUtils.cpp b/cpp/src/tests/StringUtils.cpp
index 6a19119288..c50287a4f4 100644
--- a/cpp/src/tests/StringUtils.cpp
+++ b/cpp/src/tests/StringUtils.cpp
@@ -23,9 +23,11 @@
#include "unit_test.h"
+namespace qpid {
+namespace tests {
+
QPID_AUTO_TEST_SUITE(StringUtilsTestSuite)
-using namespace qpid;
using std::string;
QPID_AUTO_TEST_CASE(testSplit_general)
@@ -75,3 +77,5 @@ QPID_AUTO_TEST_CASE(testSplit_empty)
}
QPID_AUTO_TEST_SUITE_END()
+
+}}
diff --git a/cpp/src/tests/Uuid.cpp b/cpp/src/tests/Uuid.cpp
index 0195455ca3..f85a297adc 100644
--- a/cpp/src/tests/Uuid.cpp
+++ b/cpp/src/tests/Uuid.cpp
@@ -48,7 +48,7 @@ QPID_AUTO_TEST_CASE(testUuidCtor) {
for_each(uuids.begin(), uuids.end(), unique);
}
-boost::array<uint8_t, 16> sample = {{'\x1b', '\x4e', '\x28', '\xba', '\x2f', '\xa1', '\x11', '\xd2', '\x88', '\x3f', '\xb9', '\xa7', '\x61', '\xbd', '\xe3', '\xfb'}};
+boost::array<uint8_t, 16> sample = {{0x1b, 0x4e, 0x28, 0xba, 0x2f, 0xa1, 0x11, 0xd2, 0x88, 0x3f, 0xb9, 0xa7, 0x61, 0xbd, 0xe3, 0xfb}};
const string sampleStr("1b4e28ba-2fa1-11d2-883f-b9a761bde3fb");
const string zeroStr("00000000-0000-0000-0000-000000000000");
diff --git a/cpp/src/tests/acl.py b/cpp/src/tests/acl.py
index 65d5242e51..720b3b4216 100755
--- a/cpp/src/tests/acl.py
+++ b/cpp/src/tests/acl.py
@@ -7,9 +7,9 @@
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
-#
+#
# http://www.apache.org/licenses/LICENSE-2.0
-#
+#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -31,13 +31,13 @@ import qpid.messaging
class ACLFile:
def __init__(self, policy='data_dir/policy.acl'):
self.f = open(policy,'w')
-
+
def write(self,line):
self.f.write(line)
-
+
def close(self):
self.f.close()
-
+
class ACLTests(TestBase010):
def get_session(self, user, passwd):
@@ -47,9 +47,44 @@ class ACLTests(TestBase010):
connection.start()
return connection.session(str(uuid4()))
+ def port_i(self):
+ return int(self.defines["port-i"])
+
+ def port_u(self):
+ return int(self.defines["port-u"])
+
+ def get_session_by_port(self, user, passwd, byPort):
+ socket = connect(self.broker.host, byPort)
+ connection = Connection (sock=socket, username=user, password=passwd,
+ mechanism="PLAIN")
+ connection.start()
+ return connection.session(str(uuid4()))
+
def reload_acl(self):
- acl = self.qmf.getObjects(_class="acl")[0]
- return acl.reloadACLFile()
+ result = None
+ try:
+ self.broker_access.reloadAclFile()
+ except Exception, e:
+ result = str(e)
+ return result
+
+ def acl_lookup(self, userName, action, aclObj, aclObjName, propMap):
+ result = {}
+ try:
+ result = self.broker_access.acl_lookup(userName, action, aclObj, aclObjName, propMap)
+ except Exception, e:
+ result['text'] = str(e)
+ result['result'] = str(e)
+ return result
+
+ def acl_lookupPublish(self, userName, exchange, key):
+ result = {}
+ try:
+ result = self.broker_access.acl_lookupPublish(userName, exchange, key)
+ except Exception, e:
+ result['text'] = str(e)
+ result['result'] = str(e)
+ return result
def get_acl_file(self):
return ACLFile(self.config.defines.get("policy-file", "data_dir/policy.acl"))
@@ -59,7 +94,7 @@ class ACLTests(TestBase010):
aclf.write('acl allow all all\n')
aclf.close()
TestBase010.setUp(self)
- self.startQmf()
+ self.startBrokerAccess()
self.reload_acl()
def tearDown(self):
@@ -69,10 +104,41 @@ class ACLTests(TestBase010):
self.reload_acl()
TestBase010.tearDown(self)
+
+ def Lookup(self, userName, action, aclObj, aclObjName, propMap, expectedResult):
+ result = self.acl_lookup(userName, action, aclObj, aclObjName, propMap)
+ if (result['result'] != expectedResult):
+ suffix = ', [ERROR: Expected= ' + expectedResult
+ if (result['result'] is None):
+ suffix = suffix + ', Exception= ' + result['text'] + ']'
+ else:
+ suffix = suffix + ', Actual= ' + result['result'] + ']'
+ self.fail('Lookup: name=' + userName + ', action=' + action + ', aclObj=' + aclObj + ', aclObjName=' + aclObjName + ', propertyMap=' + str(propMap) + suffix)
+
+
+ def LookupPublish(self, userName, exchName, keyName, expectedResult):
+ result = self.acl_lookupPublish(userName, exchName, keyName)
+ if (result['result'] != expectedResult):
+ if (result['result'] is None):
+ suffix = suffix + ', Exception= ' + result['text'] + ']'
+ else:
+ suffix = suffix + ', Actual= ' + result['result'] + ']'
+ self.fail('LookupPublish: name=' + userName + ', exchange=' + exchName + ', key=' + keyName + suffix)
+
+ def AllBut(self, allList, removeList):
+ tmpList = allList[:]
+ for item in removeList:
+ try:
+ tmpList.remove(item)
+ except Exception, e:
+ self.fail("ERROR in AllBut() \nallList = %s \nremoveList = %s \nerror = %s " \
+ % (allList, removeList, e))
+ return tmpList
+
#=====================================
# ACL general tests
- #=====================================
-
+ #=====================================
+
def test_deny_mode(self):
"""
Test the deny all mode
@@ -81,12 +147,12 @@ class ACLTests(TestBase010):
aclf.write('acl allow anonymous all all\n')
aclf.write('acl allow bob@QPID create queue\n')
aclf.write('acl deny all all')
- aclf.close()
-
+ aclf.close()
+
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
+ if (result):
+ self.fail(result)
+
session = self.get_session('bob','bob')
try:
session.queue_declare(queue="deny_queue")
@@ -94,13 +160,13 @@ class ACLTests(TestBase010):
if (403 == e.args[0].error_code):
self.fail("ACL should allow queue create request");
self.fail("Error during queue create request");
-
+
try:
session.exchange_bind(exchange="amq.direct", queue="deny_queue", binding_key="routing_key")
self.fail("ACL should deny queue bind request");
except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
-
+ self.assertEqual(403,e.args[0].error_code)
+
def test_allow_mode(self):
"""
Test the allow all mode
@@ -108,12 +174,12 @@ class ACLTests(TestBase010):
aclf = self.get_acl_file()
aclf.write('acl deny bob@QPID bind exchange\n')
aclf.write('acl allow all all')
- aclf.close()
-
+ aclf.close()
+
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
+ if (result):
+ self.fail(result)
+
session = self.get_session('bob','bob')
try:
session.queue_declare(queue="allow_queue")
@@ -121,18 +187,42 @@ class ACLTests(TestBase010):
if (403 == e.args[0].error_code):
self.fail("ACL should allow queue create request");
self.fail("Error during queue create request");
-
+
try:
session.exchange_bind(exchange="amq.direct", queue="allow_queue", binding_key="routing_key")
self.fail("ACL should deny queue bind request");
except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
-
-
+ self.assertEqual(403,e.args[0].error_code)
+
+
+ def test_allow_mode_with_specfic_allow_override(self):
+ """
+ Specific allow overrides a general deny
+ """
+ aclf = self.get_acl_file()
+ aclf.write('group admins bob@QPID joe@QPID \n')
+ aclf.write('acl allow bob@QPID create queue \n')
+ aclf.write('acl deny admins create queue \n')
+ aclf.write('acl allow all all')
+ aclf.close()
+
+ result = self.reload_acl()
+ if (result):
+ self.fail(result)
+
+ session = self.get_session('bob','bob')
+
+ try:
+ session.queue_declare(queue='zed')
+ except qpid.session.SessionException, e:
+ if (403 == e.args[0].error_code):
+ self.fail("ACL should allow create queue request");
+
+
#=====================================
# ACL file format tests
- #=====================================
-
+ #=====================================
+
def test_empty_groups(self):
"""
Test empty groups
@@ -141,11 +231,11 @@ class ACLTests(TestBase010):
aclf.write('acl group\n')
aclf.write('acl group admins bob@QPID joe@QPID\n')
aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("Insufficient tokens for acl definition",0,len(result.text)) == -1):
- self.fail("ACL Reader should reject the acl file due to empty group name")
+ aclf.close()
+
+ result = self.reload_acl()
+ if (result.find("Insufficient tokens for acl definition",0,len(result)) == -1):
+ self.fail("ACL Reader should reject the acl file due to empty group name")
def test_illegal_acl_formats(self):
"""
@@ -155,31 +245,31 @@ class ACLTests(TestBase010):
aclf.write('acl group admins bob@QPID joe@QPID\n')
aclf.write('acl allow all all')
aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("Unknown ACL permission",0,len(result.text)) == -1):
- self.fail(result)
-
+
+ result = self.reload_acl()
+ if (result.find("Unknown ACL permission",0,len(result)) == -1):
+ self.fail(result)
+
def test_illegal_extension_lines(self):
"""
Test illegal extension lines
"""
-
+
aclf = self.get_acl_file()
aclf.write('group admins bob@QPID \n')
aclf.write(' \ \n')
aclf.write('joe@QPID \n')
aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("contains an illegal extension",0,len(result.text)) == -1):
+ aclf.close()
+
+ result = self.reload_acl()
+ if (result.find("contains an illegal extension",0,len(result)) == -1):
self.fail(result)
- if (result.text.find("Non-continuation line must start with \"group\" or \"acl\"",0,len(result.text)) == -1):
+ if (result.find("Non-continuation line must start with \"group\" or \"acl\"",0,len(result)) == -1):
self.fail(result)
- def test_llegal_extension_lines(self):
+ def test_illegal_extension_lines(self):
"""
Test proper extention lines
"""
@@ -190,9 +280,9 @@ class ACLTests(TestBase010):
aclf.write('host/123.example.com@TEST.COM\n') # should be allowed
aclf.write('acl allow all all')
aclf.close()
-
+
result = self.reload_acl()
- if (result.text.find("ACL format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
def test_user_realm(self):
@@ -205,9 +295,9 @@ class ACLTests(TestBase010):
aclf.write('acl deny admin bind exchange\n')
aclf.write('acl allow all all')
aclf.close()
-
+
result = self.reload_acl()
- if (result.text.find("Username 'bob' must contain a realm",0,len(result.text)) == -1):
+ if (result.find("Username 'bob' must contain a realm",0,len(result)) == -1):
self.fail(result)
def test_allowed_chars_for_username(self):
@@ -221,18 +311,18 @@ class ACLTests(TestBase010):
aclf.write('group test4 host/somemachine.example.com@EXAMPLE.COM\n') # should be allowed
aclf.write('acl allow all all')
aclf.close()
-
+
result = self.reload_acl()
- if (result.text.find("ACL format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
aclf = self.get_acl_file()
aclf.write('group test1 joe$H@EXAMPLE.com\n') # shouldn't be allowed
aclf.write('acl allow all all')
- aclf.close()
+ aclf.close()
result = self.reload_acl()
- if (result.text.find("Username \"joe$H@EXAMPLE.com\" contains illegal characters",0,len(result.text)) == -1):
+ if (result.find("Username \"joe$H@EXAMPLE.com\" contains illegal characters",0,len(result)) == -1):
self.fail(result)
#=====================================
@@ -243,118 +333,238 @@ class ACLTests(TestBase010):
"""
Test illegal queue policy
"""
-
+
aclf = self.get_acl_file()
aclf.write('acl deny bob@QPID create queue name=q2 exclusive=true policytype=ding\n')
aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
+ aclf.close()
+
+ result = self.reload_acl()
expected = "ding is not a valid value for 'policytype', possible values are one of" \
- " { 'ring' 'ring_strict' 'flow_to_disk' 'reject' }";
- if (result.text != expected):
- self.fail(result)
+ " { 'ring' 'ring_strict' 'flow_to_disk' 'reject' }";
+ if (result.find(expected) == -1):
+ self.fail(result)
- def test_illegal_queue_size(self):
+ def test_illegal_queuemaxsize_upper_limit_spec(self):
"""
Test illegal queue policy
"""
-
+ #
+ # Use maxqueuesize
+ #
aclf = self.get_acl_file()
aclf.write('acl deny bob@QPID create queue name=q2 maxqueuesize=-1\n')
aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- expected = "-1 is not a valid value for 'maxqueuesize', " \
- "values should be between 0 and 9223372036854775807";
- if (result.text != expected):
- self.fail(result)
+ aclf.close()
+
+ result = self.reload_acl()
+ expected = "-1 is not a valid value for 'queuemaxsizeupperlimit', " \
+ "values should be between 0 and 9223372036854775807";
+ if (result.find(expected) == -1):
+ self.fail(result)
aclf = self.get_acl_file()
aclf.write('acl deny bob@QPID create queue name=q2 maxqueuesize=9223372036854775808\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- expected = "9223372036854775808 is not a valid value for 'maxqueuesize', " \
+ aclf.write('acl allow all all')
+ aclf.close()
+
+ result = self.reload_acl()
+ expected = "9223372036854775808 is not a valid value for 'queuemaxsizeupperlimit', " \
"values should be between 0 and 9223372036854775807";
- if (result.text != expected):
- self.fail(result)
+ if (result.find(expected) == -1):
+ self.fail(result)
+
+ #
+ # Use queuemaxsizeupperlimit
+ #
+ aclf = self.get_acl_file()
+ aclf.write('acl deny bob@QPID create queue name=q2 queuemaxsizeupperlimit=-1\n')
+ aclf.write('acl allow all all')
+ aclf.close()
+ result = self.reload_acl()
+ expected = "-1 is not a valid value for 'queuemaxsizeupperlimit', " \
+ "values should be between 0 and 9223372036854775807";
+ if (result.find(expected) == -1):
+ self.fail(result)
- def test_illegal_queue_count(self):
+ aclf = self.get_acl_file()
+ aclf.write('acl deny bob@QPID create queue name=q2 queuemaxsizeupperlimit=9223372036854775808\n')
+ aclf.write('acl allow all all')
+ aclf.close()
+
+ result = self.reload_acl()
+ expected = "9223372036854775808 is not a valid value for 'queuemaxsizeupperlimit', " \
+ "values should be between 0 and 9223372036854775807";
+ if (result.find(expected) == -1):
+ self.fail(result)
+
+
+
+ def test_illegal_queuemaxcount_upper_limit_spec(self):
"""
Test illegal queue policy
"""
-
+ #
+ # Use maxqueuecount
+ #
+
aclf = self.get_acl_file()
aclf.write('acl deny bob@QPID create queue name=q2 maxqueuecount=-1\n')
aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- expected = "-1 is not a valid value for 'maxqueuecount', " \
- "values should be between 0 and 9223372036854775807";
- if (result.text != expected):
- self.fail(result)
+ aclf.close()
+
+ result = self.reload_acl()
+ expected = "-1 is not a valid value for 'queuemaxcountupperlimit', " \
+ "values should be between 0 and 9223372036854775807";
+ if (result.find(expected) == -1):
+ self.fail(result)
aclf = self.get_acl_file()
aclf.write('acl deny bob@QPID create queue name=q2 maxqueuecount=9223372036854775808\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- expected = "9223372036854775808 is not a valid value for 'maxqueuecount', " \
+ aclf.write('acl allow all all')
+ aclf.close()
+
+ result = self.reload_acl()
+ expected = "9223372036854775808 is not a valid value for 'queuemaxcountupperlimit', " \
"values should be between 0 and 9223372036854775807";
- if (result.text != expected):
- self.fail(result)
+ if (result.find(expected) == -1):
+ self.fail(result)
+
+ #
+ # use maxqueuecountupperlimit
+ #
+ aclf = self.get_acl_file()
+ aclf.write('acl deny bob@QPID create queue name=q2 queuemaxcountupperlimit=-1\n')
+ aclf.write('acl allow all all')
+ aclf.close()
+
+ result = self.reload_acl()
+ expected = "-1 is not a valid value for 'queuemaxcountupperlimit', " \
+ "values should be between 0 and 9223372036854775807";
+ if (result.find(expected) == -1):
+ self.fail(result)
+
+ aclf = self.get_acl_file()
+ aclf.write('acl deny bob@QPID create queue name=q2 queuemaxcountupperlimit=9223372036854775808\n')
+ aclf.write('acl allow all all')
+ aclf.close()
+
+ result = self.reload_acl()
+ expected = "9223372036854775808 is not a valid value for 'queuemaxcountupperlimit', " \
+ "values should be between 0 and 9223372036854775807";
+ if (result.find(expected) == -1):
+ self.fail(result)
+
+
+ def test_illegal_queuemaxsize_lower_limit_spec(self):
+ """
+ Test illegal queue policy
+ """
+ aclf = self.get_acl_file()
+ aclf.write('acl deny bob@QPID create queue name=q2 queuemaxsizelowerlimit=-1\n')
+ aclf.write('acl allow all all')
+ aclf.close()
+
+ result = self.reload_acl()
+ expected = "-1 is not a valid value for 'queuemaxsizelowerlimit', " \
+ "values should be between 0 and 9223372036854775807";
+ if (result.find(expected) == -1):
+ self.fail(result)
+
+ aclf = self.get_acl_file()
+ aclf.write('acl deny bob@QPID create queue name=q2 queuemaxsizelowerlimit=9223372036854775808\n')
+ aclf.write('acl allow all all')
+ aclf.close()
+
+ result = self.reload_acl()
+ expected = "9223372036854775808 is not a valid value for 'queuemaxsizelowerlimit', " \
+ "values should be between 0 and 9223372036854775807";
+ if (result.find(expected) == -1):
+ self.fail(result)
+
+
+
+ def test_illegal_queuemaxcount_lower_limit_spec(self):
+ """
+ Test illegal queue policy
+ """
+
+ aclf = self.get_acl_file()
+ aclf.write('acl deny bob@QPID create queue name=q2 queuemaxcountlowerlimit=-1\n')
+ aclf.write('acl allow all all')
+ aclf.close()
+
+ result = self.reload_acl()
+ expected = "-1 is not a valid value for 'queuemaxcountlowerlimit', " \
+ "values should be between 0 and 9223372036854775807";
+ if (result.find(expected) == -1):
+ self.fail(result)
+
+ aclf = self.get_acl_file()
+ aclf.write('acl deny bob@QPID create queue name=q2 queuemaxcountlowerlimit=9223372036854775808\n')
+ aclf.write('acl allow all all')
+ aclf.close()
+
+ result = self.reload_acl()
+ expected = "9223372036854775808 is not a valid value for 'queuemaxcountlowerlimit', " \
+ "values should be between 0 and 9223372036854775807";
+ if (result.find(expected) == -1):
+ self.fail(result)
#=====================================
# ACL queue tests
#=====================================
-
+
def test_queue_allow_mode(self):
"""
Test cases for queue acl in allow mode
"""
aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID create queue name=q1 durable=true passive=true\n')
+ aclf.write('acl deny bob@QPID access queue name=q1\n')
+ aclf.write('acl deny bob@QPID create queue name=q1 durable=true\n')
aclf.write('acl deny bob@QPID create queue name=q2 exclusive=true policytype=ring\n')
aclf.write('acl deny bob@QPID access queue name=q3\n')
aclf.write('acl deny bob@QPID purge queue name=q3\n')
- aclf.write('acl deny bob@QPID delete queue name=q4\n')
- aclf.write('acl deny bob@QPID create queue name=q5 maxqueuesize=1000 maxqueuecount=100\n')
+ aclf.write('acl deny bob@QPID delete queue name=q4\n')
+ aclf.write('acl deny bob@QPID create queue name=q5 maxqueuesize=1000 maxqueuecount=100\n')
aclf.write('acl allow all all')
- aclf.close()
-
+ aclf.close()
+
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
+ if (result):
+ self.fail(result)
+
session = self.get_session('bob','bob')
-
+
+ try:
+ session.queue_declare(queue="q1", durable=True)
+ self.fail("ACL should deny queue create request with name=q1 durable=true");
+ except qpid.session.SessionException, e:
+ self.assertEqual(403,e.args[0].error_code)
+ session = self.get_session('bob','bob')
+
try:
session.queue_declare(queue="q1", durable=True, passive=True)
- self.fail("ACL should deny queue create request with name=q1 durable=true passive=true");
+ self.fail("ACL should deny queue passive declare request with name=q1 durable=true");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
queue_options = {}
- queue_options["qpid.policy_type"] = "ring"
+ queue_options["qpid.policy_type"] = "ring"
session.queue_declare(queue="q2", exclusive=True, arguments=queue_options)
self.fail("ACL should deny queue create request with name=q2 exclusive=true qpid.policy_type=ring");
except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
+ self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
queue_options = {}
- queue_options["qpid.policy_type"] = "ring_strict"
- session.queue_declare(queue="q2", exclusive=True, arguments=queue_options)
+ queue_options["qpid.policy_type"] = "ring_strict"
+ session.queue_declare(queue="q2", exclusive=True, arguments=queue_options)
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow queue create request with name=q2 exclusive=true qpid.policy_type=ring_strict");
@@ -362,17 +572,17 @@ class ACLTests(TestBase010):
try:
queue_options = {}
queue_options["qpid.max_count"] = 200
- queue_options["qpid.max_size"] = 500
+ queue_options["qpid.max_size"] = 500
session.queue_declare(queue="q5", exclusive=True, arguments=queue_options)
self.fail("ACL should deny queue create request with name=q2, qpid.max_size=500 and qpid.max_count=200");
except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
+ self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
try:
queue_options = {}
queue_options["qpid.max_count"] = 200
- queue_options["qpid.max_size"] = 100
+ queue_options["qpid.max_size"] = 100
session.queue_declare(queue="q2", exclusive=True, arguments=queue_options)
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
@@ -390,63 +600,71 @@ class ACLTests(TestBase010):
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
session.queue_purge(queue="q3")
self.fail("ACL should deny queue purge request for q3");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
session.queue_purge(queue="q4")
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow queue purge request for q4");
-
+
try:
session.queue_delete(queue="q4")
self.fail("ACL should deny queue delete request for q4");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
session.queue_delete(queue="q3")
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow queue delete request for q3");
-
+
def test_queue_deny_mode(self):
"""
Test cases for queue acl in deny mode
"""
aclf = self.get_acl_file()
- aclf.write('acl allow bob@QPID create queue name=q1 durable=true passive=true\n')
+ aclf.write('acl allow bob@QPID access queue name=q1\n')
+ aclf.write('acl allow bob@QPID create queue name=q1 durable=true\n')
aclf.write('acl allow bob@QPID create queue name=q2 exclusive=true policytype=ring\n')
aclf.write('acl allow bob@QPID access queue name=q3\n')
aclf.write('acl allow bob@QPID purge queue name=q3\n')
- aclf.write('acl allow bob@QPID create queue name=q3\n')
- aclf.write('acl allow bob@QPID create queue name=q4\n')
- aclf.write('acl allow bob@QPID delete queue name=q4\n')
- aclf.write('acl allow bob@QPID create queue name=q5 maxqueuesize=1000 maxqueuecount=100\n')
+ aclf.write('acl allow bob@QPID create queue name=q3\n')
+ aclf.write('acl allow bob@QPID create queue name=q4\n')
+ aclf.write('acl allow bob@QPID delete queue name=q4\n')
+ aclf.write('acl allow bob@QPID create queue name=q5 maxqueuesize=1000 maxqueuecount=100\n')
+ aclf.write('acl allow bob@QPID create queue name=q6 queuemaxsizelowerlimit=50 queuemaxsizeupperlimit=100 queuemaxcountlowerlimit=50 queuemaxcountupperlimit=100\n')
aclf.write('acl allow anonymous all all\n')
aclf.write('acl deny all all')
- aclf.close()
-
+ aclf.close()
+
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
+ if (result):
+ self.fail(result)
+
session = self.get_session('bob','bob')
-
+
+ try:
+ session.queue_declare(queue="q1", durable=True)
+ except qpid.session.SessionException, e:
+ if (403 == e.args[0].error_code):
+ self.fail("ACL should allow queue create request with name=q1 durable=true");
+
try:
session.queue_declare(queue="q1", durable=True, passive=True)
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue create request with name=q1 durable=true passive=true");
-
+ self.fail("ACL should allow queue passive declare request with name=q1 durable=true passive=true");
+
try:
session.queue_declare(queue="q1", durable=False, passive=False)
self.fail("ACL should deny queue create request with name=q1 durable=true passive=false");
@@ -458,32 +676,81 @@ class ACLTests(TestBase010):
session.queue_declare(queue="q2", exclusive=False)
self.fail("ACL should deny queue create request with name=q2 exclusive=false");
except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
+ self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
queue_options = {}
queue_options["qpid.max_count"] = 200
- queue_options["qpid.max_size"] = 500
+ queue_options["qpid.max_size"] = 500
session.queue_declare(queue="q5", arguments=queue_options)
- self.fail("ACL should deny queue create request with name=q2 maxqueuesize=500 maxqueuecount=200");
+ self.fail("ACL should deny queue create request with name=q5 maxqueuesize=500 maxqueuecount=200");
except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
+ self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
try:
queue_options = {}
queue_options["qpid.max_count"] = 100
- queue_options["qpid.max_size"] = 500
- session.queue_declare(queue="q5", arguments=queue_options)
+ queue_options["qpid.max_size"] = 500
+ session.queue_declare(queue="q5", arguments=queue_options)
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue create request with name=q2 maxqueuesize=500 maxqueuecount=200");
+ self.fail("ACL should allow queue create request with name=q5 maxqueuesize=500 maxqueuecount=200");
+
+ try:
+ queue_options = {}
+ queue_options["qpid.max_count"] = 49
+ queue_options["qpid.max_size"] = 100
+ session.queue_declare(queue="q6", arguments=queue_options)
+ self.fail("ACL should deny queue create request with name=q6 maxqueuesize=100 maxqueuecount=49");
+ except qpid.session.SessionException, e:
+ self.assertEqual(403,e.args[0].error_code)
+ session = self.get_session('bob','bob')
+
+ try:
+ queue_options = {}
+ queue_options["qpid.max_count"] = 101
+ queue_options["qpid.max_size"] = 100
+ session.queue_declare(queue="q6", arguments=queue_options)
+ self.fail("ACL should allow queue create request with name=q6 maxqueuesize=100 maxqueuecount=101");
+ except qpid.session.SessionException, e:
+ self.assertEqual(403,e.args[0].error_code)
+ session = self.get_session('bob','bob')
+
+ try:
+ queue_options = {}
+ queue_options["qpid.max_count"] = 100
+ queue_options["qpid.max_size"] = 49
+ session.queue_declare(queue="q6", arguments=queue_options)
+ self.fail("ACL should deny queue create request with name=q6 maxqueuesize=49 maxqueuecount=100");
+ except qpid.session.SessionException, e:
+ self.assertEqual(403,e.args[0].error_code)
+ session = self.get_session('bob','bob')
+
+ try:
+ queue_options = {}
+ queue_options["qpid.max_count"] = 100
+ queue_options["qpid.max_size"] =101
+ session.queue_declare(queue="q6", arguments=queue_options)
+ self.fail("ACL should deny queue create request with name=q6 maxqueuesize=101 maxqueuecount=100");
+ except qpid.session.SessionException, e:
+ self.assertEqual(403,e.args[0].error_code)
+ session = self.get_session('bob','bob')
+
+ try:
+ queue_options = {}
+ queue_options["qpid.max_count"] = 50
+ queue_options["qpid.max_size"] = 50
+ session.queue_declare(queue="q6", arguments=queue_options)
+ except qpid.session.SessionException, e:
+ if (403 == e.args[0].error_code):
+ self.fail("ACL should allow queue create request with name=q6 maxqueuesize=50 maxqueuecount=50");
try:
queue_options = {}
queue_options["qpid.policy_type"] = "ring"
- session.queue_declare(queue="q2", exclusive=True, arguments=queue_options)
+ session.queue_declare(queue="q2", exclusive=True, arguments=queue_options)
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow queue create request for q2 with exclusive=true policytype=ring");
@@ -501,14 +768,14 @@ class ACLTests(TestBase010):
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
session.queue_purge(queue="q4")
self.fail("ACL should deny queue purge request for q4");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
session.queue_purge(queue="q3")
except qpid.session.SessionException, e:
@@ -520,14 +787,14 @@ class ACLTests(TestBase010):
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow queue query request for q3");
-
+
try:
session.queue_delete(queue="q3")
self.fail("ACL should deny queue delete request for q3");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
session.queue_delete(queue="q4")
except qpid.session.SessionException, e:
@@ -537,54 +804,62 @@ class ACLTests(TestBase010):
#=====================================
# ACL exchange tests
#=====================================
-
+
def test_exchange_acl_allow_mode(self):
- session = self.get_session('bob','bob')
+ session = self.get_session('bob','bob')
session.queue_declare(queue="baz")
"""
Test cases for exchange acl in allow mode
"""
aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID create exchange name=testEx durable=true passive=true\n')
+ aclf.write('acl deny bob@QPID access exchange name=testEx\n')
+ aclf.write('acl deny bob@QPID create exchange name=testEx durable=true\n')
aclf.write('acl deny bob@QPID create exchange name=ex1 type=direct\n')
aclf.write('acl deny bob@QPID access exchange name=myEx queuename=q1 routingkey=rk1.*\n')
aclf.write('acl deny bob@QPID bind exchange name=myEx queuename=q1 routingkey=rk1\n')
aclf.write('acl deny bob@QPID unbind exchange name=myEx queuename=q1 routingkey=rk1\n')
aclf.write('acl deny bob@QPID delete exchange name=myEx\n')
aclf.write('acl allow all all')
- aclf.close()
-
+ aclf.close()
+
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
+ if (result):
+ self.fail(result)
+
session = self.get_session('bob','bob')
session.queue_declare(queue='q1')
session.queue_declare(queue='q2')
session.exchange_declare(exchange='myEx', type='direct')
try:
+ session.exchange_declare(exchange='testEx', durable=True)
+ self.fail("ACL should deny exchange create request with name=testEx durable=true");
+ except qpid.session.SessionException, e:
+ self.assertEqual(403,e.args[0].error_code)
+ session = self.get_session('bob','bob')
+
+ try:
session.exchange_declare(exchange='testEx', durable=True, passive=True)
- self.fail("ACL should deny exchange create request with name=testEx durable=true passive=true");
+ self.fail("ACL should deny passive exchange declare request with name=testEx durable=true passive=true");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
- session.exchange_declare(exchange='testEx', type='direct', durable=True, passive=False)
+ session.exchange_declare(exchange='testEx', type='direct', durable=False)
except qpid.session.SessionException, e:
print e
if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange create request for testEx with any parameter other than durable=true and passive=true");
-
+ self.fail("ACL should allow exchange create request for testEx with any parameter other than durable=true");
+
try:
session.exchange_declare(exchange='ex1', type='direct')
self.fail("ACL should deny exchange create request with name=ex1 type=direct");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
+ except qpid.session.SessionException, e:
+ self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
session.exchange_declare(exchange='myXml', type='direct')
except qpid.session.SessionException, e:
@@ -606,13 +881,13 @@ class ACLTests(TestBase010):
session = self.get_session('bob','bob')
try:
- session.exchange_query(name='amq.topic')
+ session.exchange_query(name='amq.topic')
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow exchange query request for exchange='amq.topic'");
-
+
try:
- session.exchange_bound(exchange='myEx', queue='q1', binding_key='rk2.*')
+ session.exchange_bound(exchange='myEx', queue='q1', binding_key='rk2.*')
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow exchange bound request for myEx with queuename=q1 and binding_key='rk2.*'");
@@ -621,12 +896,12 @@ class ACLTests(TestBase010):
session.exchange_bind(exchange='myEx', queue='q1', binding_key='rk1')
self.fail("ACL should deny exchange bind request with exchange='myEx' queuename='q1' bindingkey='rk1'");
except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
+ self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
try:
session.exchange_bind(exchange='myEx', queue='q1', binding_key='x')
- except qpid.session.SessionException, e:
+ except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow exchange bind request for exchange='myEx', queue='q1', binding_key='x'");
@@ -640,7 +915,7 @@ class ACLTests(TestBase010):
session.exchange_unbind(exchange='myEx', queue='q1', binding_key='rk1')
self.fail("ACL should deny exchange unbind request with exchange='myEx' queuename='q1' bindingkey='rk1'");
except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
+ self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
try:
@@ -654,20 +929,20 @@ class ACLTests(TestBase010):
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow exchange unbind request for exchange='myEx', queue='q2', binding_key='rk1'");
-
+
try:
session.exchange_delete(exchange='myEx')
self.fail("ACL should deny exchange delete request for myEx");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
session.exchange_delete(exchange='myXml')
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow exchange delete request for myXml");
-
+
def test_exchange_acl_deny_mode(self):
session = self.get_session('bob','bob')
@@ -677,19 +952,19 @@ class ACLTests(TestBase010):
Test cases for exchange acl in deny mode
"""
aclf = self.get_acl_file()
- aclf.write('acl allow bob@QPID create exchange name=myEx durable=true passive=false\n')
- aclf.write('acl allow bob@QPID bind exchange name=amq.topic queuename=bar routingkey=foo.*\n')
+ aclf.write('acl allow bob@QPID create exchange name=myEx durable=true\n')
+ aclf.write('acl allow bob@QPID bind exchange name=amq.topic queuename=bar routingkey=foo.*\n')
aclf.write('acl allow bob@QPID unbind exchange name=amq.topic queuename=bar routingkey=foo.*\n')
aclf.write('acl allow bob@QPID access exchange name=myEx queuename=q1 routingkey=rk1.*\n')
aclf.write('acl allow bob@QPID delete exchange name=myEx\n')
- aclf.write('acl allow anonymous all all\n')
+ aclf.write('acl allow anonymous all all\n')
aclf.write('acl deny all all')
- aclf.close()
-
+ aclf.close()
+
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
+ if (result):
+ self.fail(result)
+
session = self.get_session('bob','bob')
try:
@@ -697,14 +972,14 @@ class ACLTests(TestBase010):
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow exchange create request for myEx with durable=true and passive=false");
-
+
try:
session.exchange_declare(exchange='myEx', type='direct', durable=False)
self.fail("ACL should deny exchange create request with name=myEx durable=false");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
session.exchange_bind(exchange='amq.topic', queue='bar', binding_key='foo.bar')
except qpid.session.SessionException, e:
@@ -759,13 +1034,13 @@ class ACLTests(TestBase010):
session = self.get_session('bob','bob')
try:
- session.exchange_query(name='myEx')
+ session.exchange_query(name='myEx')
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow exchange query request for exchange='myEx'");
-
+
try:
- session.exchange_bound(exchange='myEx', queue='q1', binding_key='rk1.*')
+ session.exchange_bound(exchange='myEx', queue='q1', binding_key='rk1.*')
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow exchange bound request for myEx with queuename=q1 and binding_key='rk1.*'");
@@ -776,7 +1051,7 @@ class ACLTests(TestBase010):
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
session.exchange_delete(exchange='myEx')
except qpid.session.SessionException, e:
@@ -805,7 +1080,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
bob = BrokerAdmin(self.config.broker, "bob", "bob")
@@ -832,24 +1107,24 @@ class ACLTests(TestBase010):
#=====================================
# ACL consume tests
#=====================================
-
+
def test_consume_allow_mode(self):
"""
Test cases for consume in allow mode
"""
aclf = self.get_acl_file()
aclf.write('acl deny bob@QPID consume queue name=q1\n')
- aclf.write('acl deny bob@QPID consume queue name=q2\n')
+ aclf.write('acl deny bob@QPID consume queue name=q2\n')
aclf.write('acl allow all all')
- aclf.close()
-
+ aclf.close()
+
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
+ if (result):
+ self.fail(result)
+
session = self.get_session('bob','bob')
-
-
+
+
try:
session.queue_declare(queue='q1')
session.queue_declare(queue='q2')
@@ -857,27 +1132,27 @@ class ACLTests(TestBase010):
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
self.fail("ACL should allow create queue request");
-
+
try:
session.message_subscribe(queue='q1', destination='myq1')
self.fail("ACL should deny subscription for queue='q1'");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
session.message_subscribe(queue='q2', destination='myq1')
self.fail("ACL should deny subscription for queue='q2'");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
session.message_subscribe(queue='q3', destination='myq1')
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
- self.fail("ACL should allow subscription for q3");
-
+ self.fail("ACL should allow subscription for q3");
+
def test_consume_deny_mode(self):
"""
@@ -886,18 +1161,18 @@ class ACLTests(TestBase010):
aclf = self.get_acl_file()
aclf.write('acl allow bob@QPID consume queue name=q1\n')
aclf.write('acl allow bob@QPID consume queue name=q2\n')
- aclf.write('acl allow bob@QPID create queue\n')
- aclf.write('acl allow anonymous all\n')
+ aclf.write('acl allow bob@QPID create queue\n')
+ aclf.write('acl allow anonymous all\n')
aclf.write('acl deny all all')
- aclf.close()
-
+ aclf.close()
+
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
+ if (result):
+ self.fail(result)
+
session = self.get_session('bob','bob')
-
-
+
+
try:
session.queue_declare(queue='q1')
session.queue_declare(queue='q2')
@@ -911,20 +1186,20 @@ class ACLTests(TestBase010):
session.message_subscribe(queue='q2', destination='myq2')
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
- self.fail("ACL should allow subscription for q1 and q2");
-
+ self.fail("ACL should allow subscription for q1 and q2");
+
try:
session.message_subscribe(queue='q3', destination='myq3')
self.fail("ACL should deny subscription for queue='q3'");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
#=====================================
# ACL publish tests
#=====================================
-
+
def test_publish_acl_allow_mode(self):
"""
Test various publish acl
@@ -932,40 +1207,40 @@ class ACLTests(TestBase010):
aclf = self.get_acl_file()
aclf.write('acl deny bob@QPID publish exchange name=amq.direct routingkey=rk1\n')
aclf.write('acl deny bob@QPID publish exchange name=amq.topic\n')
- aclf.write('acl deny bob@QPID publish exchange name=myEx routingkey=rk2\n')
+ aclf.write('acl deny bob@QPID publish exchange name=myEx routingkey=rk2\n')
aclf.write('acl allow all all')
- aclf.close()
-
+ aclf.close()
+
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
+ if (result):
+ self.fail(result)
+
session = self.get_session('bob','bob')
-
+
props = session.delivery_properties(routing_key="rk1")
-
- try:
+
+ try:
session.message_transfer(destination="amq.direct", message=Message(props,"Test"))
self.fail("ACL should deny message transfer to name=amq.direct routingkey=rk1");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
+ session = self.get_session('bob','bob')
+
try:
session.message_transfer(destination="amq.topic", message=Message(props,"Test"))
self.fail("ACL should deny message transfer to name=amq.topic");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
-
+
try:
session.exchange_declare(exchange='myEx', type='direct', durable=False)
session.message_transfer(destination="myEx", message=Message(props,"Test"))
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
- self.fail("ACL should allow message transfer to exchange myEx with routing key rk1");
-
-
+ self.fail("ACL should allow message transfer to exchange myEx with routing key rk1");
+
+
props = session.delivery_properties(routing_key="rk2")
try:
session.message_transfer(destination="amq.direct", message=Message(props,"Test"))
@@ -982,39 +1257,39 @@ class ACLTests(TestBase010):
aclf.write('acl allow bob@QPID publish exchange name=amq.direct routingkey=rk1\n')
aclf.write('acl allow bob@QPID publish exchange name=amq.topic\n')
aclf.write('acl allow bob@QPID publish exchange name=myEx routingkey=rk2\n')
- aclf.write('acl allow bob@QPID create exchange\n')
- aclf.write('acl allow anonymous all all \n')
+ aclf.write('acl allow bob@QPID create exchange\n')
+ aclf.write('acl allow anonymous all all \n')
aclf.write('acl deny all all')
- aclf.close()
-
+ aclf.close()
+
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
+ if (result):
+ self.fail(result)
+
session = self.get_session('bob','bob')
-
+
props = session.delivery_properties(routing_key="rk2")
-
- try:
+
+ try:
session.message_transfer(destination="amq.direct", message=Message(props,"Test"))
self.fail("ACL should deny message transfer to name=amq.direct routingkey=rk2");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
+ session = self.get_session('bob','bob')
+
try:
session.message_transfer(destination="amq.topic", message=Message(props,"Test"))
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
- self.fail("ACL should allow message transfer to exchange amq.topic with any routing key");
-
+ self.fail("ACL should allow message transfer to exchange amq.topic with any routing key");
+
try:
session.exchange_declare(exchange='myEx', type='direct', durable=False)
session.message_transfer(destination="myEx", message=Message(props,"Test"))
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
- self.fail("ACL should allow message transfer to exchange myEx with routing key=rk2");
-
+ self.fail("ACL should allow message transfer to exchange myEx with routing key=rk2");
+
props = session.delivery_properties(routing_key="rk1")
try:
@@ -1022,7 +1297,7 @@ class ACLTests(TestBase010):
self.fail("ACL should deny message transfer to name=myEx routingkey=rk1");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
+ session = self.get_session('bob','bob')
try:
session.message_transfer(destination="amq.direct", message=Message(props,"Test"))
@@ -1056,7 +1331,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
ts = None
@@ -1088,6 +1363,200 @@ class ACLTests(TestBase010):
admin.set_timestamp_cfg(ts) #should pass
+
+ #=====================================
+ # QMF Functional tests
+ #=====================================
+
+ def test_qmf_functional_tests(self):
+ """
+ Test using QMF method hooks into ACL logic
+ """
+ aclf = self.get_acl_file()
+ aclf.write('group admins moe@COMPANY.COM \\\n')
+ aclf.write(' larry@COMPANY.COM \\\n')
+ aclf.write(' curly@COMPANY.COM \\\n')
+ aclf.write(' shemp@COMPANY.COM\n')
+ aclf.write('group auditors aaudit@COMPANY.COM baudit@COMPANY.COM caudit@COMPANY.COM \\\n')
+ aclf.write(' daudit@COMPANY.COM eaduit@COMPANY.COM eaudit@COMPANY.COM\n')
+ aclf.write('group tatunghosts tatung01@COMPANY.COM \\\n')
+ aclf.write(' tatung02/x86.build.company.com@COMPANY.COM \\\n')
+ aclf.write(' tatung03/x86.build.company.com@COMPANY.COM \\\n')
+ aclf.write(' tatung04/x86.build.company.com@COMPANY.COM \n')
+ aclf.write('group publishusers publish@COMPANY.COM x-pubs@COMPANY.COM\n')
+ aclf.write('acl allow-log admins all all\n')
+ aclf.write('# begin hack alert: allow anonymous to access the lookup debug functions\n')
+ aclf.write('acl allow-log anonymous create queue\n')
+ aclf.write('acl allow-log anonymous all exchange name=qmf.*\n')
+ aclf.write('acl allow-log anonymous all exchange name=amq.direct\n')
+ aclf.write('acl allow-log anonymous all exchange name=qpid.management\n')
+ aclf.write('acl allow-log anonymous access method name=*\n')
+ aclf.write('# end hack alert\n')
+ aclf.write('acl allow-log auditors all exchange name=company.topic routingkey=private.audit.*\n')
+ aclf.write('acl allow-log tatunghosts publish exchange name=company.topic routingkey=tatung.*\n')
+ aclf.write('acl allow-log tatunghosts publish exchange name=company.direct routingkey=tatung-service-queue\n')
+ aclf.write('acl allow-log publishusers create queue\n')
+ aclf.write('acl allow-log publishusers publish exchange name=qpid.management routingkey=broker\n')
+ aclf.write('acl allow-log publishusers publish exchange name=qmf.default.topic routingkey=*\n')
+ aclf.write('acl allow-log publishusers publish exchange name=qmf.default.direct routingkey=*\n')
+ aclf.write('acl allow-log all bind exchange name=company.topic routingkey=tatung.*\n')
+ aclf.write('acl allow-log all bind exchange name=company.direct routingkey=tatung-service-queue\n')
+ aclf.write('acl allow-log all consume queue\n')
+ aclf.write('acl allow-log all access exchange\n')
+ aclf.write('acl allow-log all access queue\n')
+ aclf.write('acl allow-log all create queue name=tmp.* durable=false autodelete=true exclusive=true policytype=ring\n')
+ aclf.write('acl allow mrQ create queue queuemaxsizelowerlimit=100 queuemaxsizeupperlimit=200 queuemaxcountlowerlimit=300 queuemaxcountupperlimit=400\n')
+ aclf.write('acl deny-log all all\n')
+ aclf.close()
+
+ result = self.reload_acl()
+ if (result):
+ self.fail(result)
+
+ #
+ # define some group lists
+ #
+ g_admins = ['moe@COMPANY.COM', \
+ 'larry@COMPANY.COM', \
+ 'curly@COMPANY.COM', \
+ 'shemp@COMPANY.COM']
+
+ g_auditors = [ 'aaudit@COMPANY.COM','baudit@COMPANY.COM','caudit@COMPANY.COM', \
+ 'daudit@COMPANY.COM','eaduit@COMPANY.COM','eaudit@COMPANY.COM']
+
+ g_tatunghosts = ['tatung01@COMPANY.COM', \
+ 'tatung02/x86.build.company.com@COMPANY.COM', \
+ 'tatung03/x86.build.company.com@COMPANY.COM', \
+ 'tatung04/x86.build.company.com@COMPANY.COM']
+
+ g_publishusers = ['publish@COMPANY.COM', 'x-pubs@COMPANY.COM']
+
+ g_public = ['jpublic@COMPANY.COM', 'me@yahoo.com']
+
+ g_all = g_admins + g_auditors + g_tatunghosts + g_publishusers + g_public
+
+ action_all = ['consume','publish','create','access','bind','unbind','delete','purge','update']
+
+ #
+ # Run some tests verifying against users who are in and who are out of given groups.
+ #
+
+ for u in g_admins:
+ self.Lookup(u, "create", "queue", "anything", {"durable":"true"}, "allow-log")
+
+ uInTest = g_auditors + g_admins
+ uOutTest = self.AllBut(g_all, uInTest)
+
+ for u in uInTest:
+ self.LookupPublish(u, "company.topic", "private.audit.This", "allow-log")
+
+ for u in uInTest:
+ for a in action_all:
+ self.Lookup(u, a, "exchange", "company.topic", {"routingkey":"private.audit.This"}, "allow-log")
+
+ for u in uOutTest:
+ self.LookupPublish(u, "company.topic", "private.audit.This", "deny-log")
+ self.Lookup(u, "bind", "exchange", "company.topic", {"routingkey":"private.audit.This"}, "deny-log")
+
+ uInTest = g_admins + g_tatunghosts
+ uOutTest = self.AllBut(g_all, uInTest)
+
+ for u in uInTest:
+ self.LookupPublish(u, "company.topic", "tatung.this2", "allow-log")
+ self.LookupPublish(u, "company.direct", "tatung-service-queue", "allow-log")
+
+ for u in uOutTest:
+ self.LookupPublish(u, "company.topic", "tatung.this2", "deny-log")
+ self.LookupPublish(u, "company.direct", "tatung-service-queue", "deny-log")
+
+ for u in uOutTest:
+ for a in ["bind", "access"]:
+ self.Lookup(u, a, "exchange", "company.topic", {"routingkey":"tatung.this2"}, "allow-log")
+ self.Lookup(u, a, "exchange", "company.direct", {"routingkey":"tatung-service-queue"}, "allow-log")
+
+ uInTest = g_admins + g_publishusers
+ uOutTest = self.AllBut(g_all, uInTest)
+
+ for u in uInTest:
+ self.LookupPublish(u, "qpid.management", "broker", "allow-log")
+ self.LookupPublish(u, "qmf.default.topic", "this3", "allow-log")
+ self.LookupPublish(u, "qmf.default.direct", "this4", "allow-log")
+
+ for u in uOutTest:
+ self.LookupPublish(u, "qpid.management", "broker", "deny-log")
+ self.LookupPublish(u, "qmf.default.topic", "this3", "deny-log")
+ self.LookupPublish(u, "qmf.default.direct", "this4", "deny-log")
+
+ for u in uOutTest:
+ for a in ["bind"]:
+ self.Lookup(u, a, "exchange", "qpid.management", {"routingkey":"broker"}, "deny-log")
+ self.Lookup(u, a, "exchange", "qmf.default.topic", {"routingkey":"this3"}, "deny-log")
+ self.Lookup(u, a, "exchange", "qmf.default.direct", {"routingkey":"this4"}, "deny-log")
+ for a in ["access"]:
+ self.Lookup(u, a, "exchange", "qpid.management", {"routingkey":"broker"}, "allow-log")
+ self.Lookup(u, a, "exchange", "qmf.default.topic", {"routingkey":"this3"}, "allow-log")
+ self.Lookup(u, a, "exchange", "qmf.default.direct", {"routingkey":"this4"}, "allow-log")
+
+ # Test against queue size limits
+
+ self.Lookup('mrQ', 'create', 'queue', 'abc', {"maxqueuesize":"150", "maxqueuecount":"350"}, "allow")
+ self.Lookup('mrQ', 'create', 'queue', 'def', {"maxqueuesize":"99", "maxqueuecount":"350"}, "deny")
+ self.Lookup('mrQ', 'create', 'queue', 'uvw', {"maxqueuesize":"201", "maxqueuecount":"350"}, "deny")
+ self.Lookup('mrQ', 'create', 'queue', 'xyz', {"maxqueuesize":"150", "maxqueuecount":"299"}, "deny")
+ self.Lookup('mrQ', 'create', 'queue', '', {"maxqueuesize":"150", "maxqueuecount":"401"}, "deny")
+ self.Lookup('mrQ', 'create', 'queue', '', {"maxqueuesize":"0", "maxqueuecount":"401"}, "deny")
+ self.Lookup('mrQ', 'create', 'queue', '', {"maxqueuesize":"150", "maxqueuecount":"0" }, "deny")
+
+
+ #=====================================
+ # Connection limits
+ #=====================================
+
+ def test_connection_limits(self):
+ """
+ Test ACL control connection limits
+ """
+ # By username should be able to connect twice per user
+ try:
+ sessiona1 = self.get_session_by_port('alice','alice', self.port_u())
+ sessiona2 = self.get_session_by_port('alice','alice', self.port_u())
+ except Exception, e:
+ self.fail("Could not create two connections for user alice: " + str(e))
+
+ # Third session should fail
+ try:
+ sessiona3 = self.get_session_by_port('alice','alice', self.port_u())
+ self.fail("Should not be able to create third connection for user alice")
+ except Exception, e:
+ result = None
+
+ try:
+ sessionb1 = self.get_session_by_port('bob','bob', self.port_u())
+ sessionb2 = self.get_session_by_port('bob','bob', self.port_u())
+ except Exception, e:
+ self.fail("Could not create two connections for user bob: " + str(e))
+
+ try:
+ sessionb3 = self.get_session_by_port('bob','bob', self.port_u())
+ self.fail("Should not be able to create third connection for user bob")
+ except Exception, e:
+ result = None
+
+ # By IP address should be able to connect twice per client address
+ try:
+ sessionb1 = self.get_session_by_port('alice','alice', self.port_i())
+ sessionb2 = self.get_session_by_port('bob','bob', self.port_i())
+ except Exception, e:
+ self.fail("Could not create two connections for client address: " + str(e))
+
+ # Third session should fail
+ try:
+ sessionb3 = self.get_session_by_port('charlie','charlie', self.port_i())
+ self.fail("Should not be able to create third connection for client address")
+ except Exception, e:
+ result = None
+
+
class BrokerAdmin:
def __init__(self, broker, username=None, password=None):
self.connection = qpid.messaging.Connection(broker)
diff --git a/cpp/src/tests/ais_check b/cpp/src/tests/ais_check
deleted file mode 100755
index a865260543..0000000000
--- a/cpp/src/tests/ais_check
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-srcdir=`dirname $0`
-
-# Check AIS requirements and run tests if found.
-ps -u root | grep 'aisexec\|corosync' >/dev/null || {
- echo WARNING: Skipping cluster tests, the aisexec or corosync daemon is not running.
- exit 0; # A warning, not a failure.
-}
-
-# Execute command with the ais group set if user is a member.
-with_ais_group() {
- if id -nG | grep '\<ais\>' >/dev/null; then sg ais -c "$*"
- else "$@"
- fi
-}
diff --git a/cpp/src/tests/amqp_0_10/Map.cpp b/cpp/src/tests/amqp_0_10/Map.cpp
deleted file mode 100644
index ffb235829e..0000000000
--- a/cpp/src/tests/amqp_0_10/Map.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-#include "amqp_0_10/unit_test.h"
-#include "qpid/amqp_0_10/Map.h"
-#include "qpid/amqp_0_10/Array.h"
-#include "qpid/amqp_0_10/Struct32.h"
-#include "qpid/amqp_0_10/UnknownType.h"
-#include "qpid/amqp_0_10/Codec.h"
-#include <iostream>
-
-using namespace qpid::amqp_0_10;
-using namespace std;
-
-QPID_AUTO_TEST_SUITE(MapTestSuite)
-
- QPID_AUTO_TEST_CASE(testGetSet) {
- MapValue v;
- v = Str8("foo");
- BOOST_CHECK(v.get<Str8>());
- BOOST_CHECK(!v.get<uint8_t>());
- BOOST_CHECK_EQUAL(*v.get<Str8>(), "foo");
-
- v = uint8_t(42);
- BOOST_CHECK(!v.get<Str8>());
- BOOST_CHECK(v.get<uint8_t>());
- BOOST_CHECK_EQUAL(*v.get<uint8_t>(), 42);
-
- v = uint16_t(12);
- BOOST_CHECK(v.get<uint16_t>());
- BOOST_CHECK_EQUAL(*v.get<uint16_t>(), 12);
-}
-
-template <class R> struct TestVisitor : public MapValue::Visitor<R> {
- template <class T> R operator()(const T&) const { throw MapValue::BadTypeException(); }
- R operator()(const R& r) const { return r; }
-};
-
-QPID_AUTO_TEST_CASE(testVisit) {
- MapValue v;
- v = Str8("foo");
- BOOST_CHECK_EQUAL(v.apply_visitor(TestVisitor<Str8>()), "foo");
- v = Uint16(42);
- BOOST_CHECK_EQUAL(v.apply_visitor(TestVisitor<Uint16>()), 42);
- try {
- v.apply_visitor(TestVisitor<bool>());
- BOOST_FAIL("Expecting exception");
- }
- catch(const MapValue::BadTypeException&) {}
-}
-
-
-QPID_AUTO_TEST_CASE(testEncodeMapValue) {
- MapValue mv;
- std::string data;
- mv = Str8("hello");
- Codec::encode(back_inserter(data))(mv);
- BOOST_CHECK_EQUAL(data.size(), Codec::size(mv));
- MapValue mv2;
- Codec::decode(data.begin())(mv2);
- BOOST_CHECK_EQUAL(mv2.getCode(), 0x85);
- BOOST_REQUIRE(mv2.get<Str8>());
- BOOST_CHECK_EQUAL(*mv2.get<Str8>(), "hello");
-}
-
-QPID_AUTO_TEST_CASE(testEncode) {
- Map map;
- std::string data;
- map["A"] = true;
- map["b"] = Str8("hello");
- Codec::encode(back_inserter(data))(map);
- BOOST_CHECK_EQUAL(Codec::size(map), data.size());
- Map map2;
- Codec::decode(data.begin())(map2);
- BOOST_CHECK_EQUAL(map.size(), 2u);
- BOOST_CHECK(map["A"].get<bool>());
- BOOST_CHECK_EQUAL(*map["b"].get<Str8>(), "hello");
-}
-
-
-QPID_AUTO_TEST_SUITE_END()
diff --git a/cpp/src/tests/amqp_0_10/ProxyTemplate.cpp b/cpp/src/tests/amqp_0_10/ProxyTemplate.cpp
deleted file mode 100644
index f54ee0da22..0000000000
--- a/cpp/src/tests/amqp_0_10/ProxyTemplate.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "amqp_0_10/unit_test.h"
-#include "qpid/amqp_0_10/ProxyTemplate.h"
-#include <boost/any.hpp>
-
-QPID_AUTO_TEST_SUITE(ProxyTemplateTestSuite)
-
-using namespace qpid::amqp_0_10;
-
-struct ToAny {
- template <class T>
- boost::any operator()(const T& t) { return boost::any(t); }
-};
-
-struct AnyProxy : public ProxyTemplate<ToAny, boost::any> {};
-
-QPID_AUTO_TEST_CASE(testAnyProxy) {
- AnyProxy p;
- boost::any a=p.connectionTune(1,2,3,4);
- BOOST_CHECK_EQUAL(a.type().name(), typeid(connection::Tune).name());
- connection::Tune* tune=boost::any_cast<connection::Tune>(&a);
- BOOST_REQUIRE(tune);
- BOOST_CHECK_EQUAL(tune->channelMax, 1u);
- BOOST_CHECK_EQUAL(tune->maxFrameSize, 2u);
- BOOST_CHECK_EQUAL(tune->heartbeatMin, 3u);
- BOOST_CHECK_EQUAL(tune->heartbeatMax, 4u);
-}
-
-QPID_AUTO_TEST_SUITE_END()
diff --git a/cpp/src/tests/amqp_0_10/apply.cpp b/cpp/src/tests/amqp_0_10/apply.cpp
deleted file mode 100644
index 0aa4421791..0000000000
--- a/cpp/src/tests/amqp_0_10/apply.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-#include "amqp_0_10/unit_test.h"
-#include "qpid/amqp_0_10/specification.h"
-#include "qpid/amqp_0_10/ApplyControl.h"
-
-QPID_AUTO_TEST_SUITE(VisitorTestSuite)
-
-using namespace qpid::amqp_0_10;
-
-struct GetCode : public ApplyFunctor<uint8_t> {
- template <class T> uint8_t operator()(const T&) const { return T::CODE; }
-};
-
-struct SetChannelMax : ApplyFunctor<void> {
- template <class T> void operator()(T&) const { BOOST_FAIL(""); }
- void operator()(connection::Tune& t) const { t.channelMax=42; }
-};
-
-struct TestFunctor {
- typedef bool result_type;
- bool operator()(const connection::Tune& tune) {
- BOOST_CHECK_EQUAL(tune.channelMax, 1u);
- BOOST_CHECK_EQUAL(tune.maxFrameSize, 2u);
- BOOST_CHECK_EQUAL(tune.heartbeatMin, 3u);
- BOOST_CHECK_EQUAL(tune.heartbeatMax, 4u);
- return true;
- }
- template <class T>
- bool operator()(const T&) { return false; }
-};
-
-QPID_AUTO_TEST_CASE(testApply) {
- connection::Tune tune(1,2,3,4);
- Control* p = &tune;
-
- // boost oddity - without the cast we get undefined symbol errors.
- BOOST_CHECK_EQUAL(apply(GetCode(), *p), (uint8_t)connection::Tune::CODE);
-
- TestFunctor tf;
- BOOST_CHECK(apply(tf, *p));
-
- connection::Start start;
- p = &start;
- BOOST_CHECK(!apply(tf, *p));
-
- apply(SetChannelMax(), tune);
- BOOST_CHECK_EQUAL(tune.channelMax, 42);
-}
-
-struct VoidTestFunctor {
- typedef void result_type;
-
- int code;
- VoidTestFunctor() : code() {}
-
- void operator()(const connection::Tune& tune) {
- BOOST_CHECK_EQUAL(tune.channelMax, 1u);
- BOOST_CHECK_EQUAL(tune.maxFrameSize, 2u);
- BOOST_CHECK_EQUAL(tune.heartbeatMin, 3u);
- BOOST_CHECK_EQUAL(tune.heartbeatMax, 4u);
- code=connection::Tune::CODE;
- }
- template <class T>
- void operator()(const T&) { code=0xFF; }
-};
-
-QPID_AUTO_TEST_CASE(testApplyVoid) {
- connection::Tune tune(1,2,3,4);
- Control* p = &tune;
- VoidTestFunctor tf;
- apply(tf, *p);
- BOOST_CHECK_EQUAL(uint8_t(connection::Tune::CODE), tf.code);
-
- connection::Start start;
- p = &start;
- apply(tf, *p);
- BOOST_CHECK_EQUAL(0xFF, tf.code);
-}
-
-QPID_AUTO_TEST_SUITE_END()
diff --git a/cpp/src/tests/amqp_0_10/handlers.cpp b/cpp/src/tests/amqp_0_10/handlers.cpp
deleted file mode 100644
index 91bb304a17..0000000000
--- a/cpp/src/tests/amqp_0_10/handlers.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "amqp_0_10/unit_test.h"
-#include "qpid/Exception.h"
-#include "qpid/amqp_0_10/Unit.h"
-#include "qpid/amqp_0_10/ControlHolder.h"
-#include "qpid/amqp_0_10/CommandHolder.h"
-#include "qpid/amqp_0_10/handlers.h"
-#include "qpid/amqp_0_10/specification.h"
-
-QPID_AUTO_TEST_SUITE(handler_tests)
-
-using namespace qpid::amqp_0_10;
-using namespace std;
-
-string called; // Set by called handler function
-
-// Note on handlers:
-//
-// Control and Command handlers are separate, both behave the same way,
-// so substitute "control or command" for command in the following.
-//
-// Command handlers derive from CommandHandler and implement functions
-// for all the commands they handle. Handling an unimplemented command
-// will raise NotImplementedException.
-//
-// Using virtual inheritance from CommandHandler allows multiple
-// handlers to be aggregated into one with multiple inheritance,
-// See test code for example.
-//
-// E.g. the existing broker model would have two control handlers:
-// - ConnectionHandler: ControlHandler for connection controls.
-// - SessionHandler: ControlHandler for session controls.
-// It would have class-command handlers for each AMQP class:
-// - QueueHandler, MessageHandler etc.. handle each class.
-// And an aggregate handler in place of BrokerAdapter
-// - BrokerCommandHandler: public QueueHandler, MessageHandler ...
-//
-// In other applications (e.g. cluster) any combination of commands
-// can be handled by a given handler. It _might_ simplify the code
-// to collaps ConnectionHandler and SessionHandler into a single
-// ControlHandler (or it might not.)
-
-struct TestExecutionHandler : public virtual CommandHandler {
- void executionSync() { called = "executionSync"; }
- // ... etc. for all execution commands
-};
-
-struct TestMessageHandler : public virtual CommandHandler {
- void messageCancel(const Str8&) { called="messageCancel"; }
- // ... etc.
-};
-
-// Aggregate handler for all recognised commands.
-struct TestCommandHandler :
- public TestExecutionHandler,
- public TestMessageHandler
- // ... etc. handlers for all command classes.
-{}; // Nothing to do.
-
-
-// Sample unit handler, written as a static_visitor.
-// Note it could equally be written with if/else statements
-// in handle.
-//
-struct TestUnitHandler : public boost::static_visitor<void> {
- TestCommandHandler handler;
- void handle(const Unit& u) { u.applyVisitor(*this); }
-
- void operator()(const Body&) { called="Body"; }
- void operator()(const Header&) { called="Header"; }
- void operator()(const ControlHolder&) { throw qpid::Exception("I don't do controls."); }
- void operator()(const CommandHolder& c) { c.invoke(handler); }
-};
-
-QPID_AUTO_TEST_CASE(testHandlers) {
- TestUnitHandler handler;
- Unit u;
-
- u = Body();
- handler.handle(u);
- BOOST_CHECK_EQUAL("Body", called);
-
- u = Header();
- handler.handle(u);
- BOOST_CHECK_EQUAL("Header", called);
-
- // in_place<Foo>(...) is equivalent to Foo(...) but
- // constructs Foo directly in the holder, avoiding
- // a copy.
-
- u = CommandHolder(in_place<execution::Sync>());
- handler.handle(u);
- BOOST_CHECK_EQUAL("executionSync", called);
-
- u = ControlHolder(in_place<connection::Start>(Map(), Str16Array(), Str16Array()));
- try {
- handler.handle(u);
- } catch (const qpid::Exception&) {}
-
- u = CommandHolder(in_place<message::Cancel>(Str8()));
- handler.handle(u);
- BOOST_CHECK_EQUAL("messageCancel", called);
-}
-
-QPID_AUTO_TEST_SUITE_END()
diff --git a/cpp/src/tests/amqp_0_10/serialize.cpp b/cpp/src/tests/amqp_0_10/serialize.cpp
deleted file mode 100644
index 975d6206ec..0000000000
--- a/cpp/src/tests/amqp_0_10/serialize.cpp
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "amqp_0_10/unit_test.h"
-#include "amqp_0_10/allSegmentTypes.h"
-
-#include "qpid/framing/AMQFrame.h"
-#include "qpid/framing/Buffer.h"
-
-#include "qpid/amqp_0_10/Packer.h"
-#include "qpid/amqp_0_10/built_in_types.h"
-#include "qpid/amqp_0_10/Codec.h"
-#include "qpid/amqp_0_10/specification.h"
-#include "qpid/amqp_0_10/ControlHolder.h"
-#include "qpid/amqp_0_10/Struct32.h"
-#include "qpid/amqp_0_10/FrameHeader.h"
-#include "qpid/amqp_0_10/Map.h"
-#include "qpid/amqp_0_10/Unit.h"
-#include "allSegmentTypes.h"
-
-#include <boost/test/test_case_template.hpp>
-#include <boost/type_traits/is_arithmetic.hpp>
-#include <boost/utility/enable_if.hpp>
-#include <boost/optional.hpp>
-#include <boost/mpl/vector.hpp>
-#include <boost/mpl/back_inserter.hpp>
-#include <boost/mpl/copy.hpp>
-#include <boost/mpl/empty_sequence.hpp>
-#include <boost/current_function.hpp>
-#include <iterator>
-#include <string>
-#include <sstream>
-#include <iostream>
-#include <netinet/in.h>
-
-// Missing operators needed for tests.
-namespace boost {
-template <class T, size_t N>
-std::ostream& operator<<(std::ostream& out, const array<T,N>& a) {
- std::ostream_iterator<T> o(out, " ");
- std::copy(a.begin(), a.end(), o);
- return out;
-}
-} // boost
-
-QPID_AUTO_TEST_SUITE(SerializeTestSuite)
-
-using namespace std;
-namespace mpl=boost::mpl;
-using namespace qpid::amqp_0_10;
-using qpid::framing::in_place;
-
-template <class A, class B> struct concat2 { typedef typename mpl::copy<B, typename mpl::back_inserter<A> >::type type; };
-template <class A, class B, class C> struct concat3 { typedef typename concat2<A, typename concat2<B, C>::type>::type type; };
-template <class A, class B, class C, class D> struct concat4 { typedef typename concat2<A, typename concat3<B, C, D>::type>::type type; };
-
-typedef mpl::vector<Boolean, Char, Int32, Int64, Int8, Uint16, CharUtf32, Uint32, Uint64, Bin8, Uint8>::type IntegralTypes;
-typedef mpl::vector<Bin1024, Bin128, Bin16, Bin256, Bin32, Bin40, Bin512, Bin64, Bin72>::type BinTypes;
-typedef mpl::vector<Double, Float>::type FloatTypes;
-typedef mpl::vector<SequenceNo, Uuid, Datetime, Dec32, Dec64> FixedSizeClassTypes;
-typedef mpl::vector<Map, Vbin8, Str8Latin, Str8, Str8Utf16, Vbin16, Str16Latin, Str16, Str16Utf16, Vbin32> VariableSizeTypes;
-
-typedef concat4<IntegralTypes, BinTypes, FloatTypes, FixedSizeClassTypes>::type FixedSizeTypes;
-typedef concat2<FixedSizeTypes, VariableSizeTypes>::type AllTypes;
-
-// TODO aconway 2008-02-20: should test 64 bit integrals for order also.
-QPID_AUTO_TEST_CASE(testNetworkByteOrder) {
- string data;
-
- uint32_t l = 0x11223344;
- Codec::encode(std::back_inserter(data))(l);
- uint32_t enc=reinterpret_cast<const uint32_t&>(*data.data());
- uint32_t l2 = ntohl(enc);
- BOOST_CHECK_EQUAL(l, l2);
-
- data.clear();
- uint16_t s = 0x1122;
- Codec::encode(std::back_inserter(data))(s);
- uint32_t s2 = ntohs(*reinterpret_cast<const uint32_t*>(data.data()));
- BOOST_CHECK_EQUAL(s, s2);
-}
-
-QPID_AUTO_TEST_CASE(testSetLimit) {
- typedef Codec::Encoder<back_insert_iterator<string> > Encoder;
- string data;
- Encoder encode(back_inserter(data), 3);
- encode('1')('2')('3');
- try {
- encode('4');
- BOOST_FAIL("Expected exception");
- } catch (...) {} // FIXME aconway 2008-04-03: catch proper exception
- BOOST_CHECK_EQUAL(data, "123");
-}
-
-QPID_AUTO_TEST_CASE(testScopedLimit) {
- typedef Codec::Encoder<back_insert_iterator<string> > Encoder;
- string data;
- Encoder encode(back_inserter(data), 10);
- encode(Str8("123")); // 4 bytes
- {
- Encoder::ScopedLimit l(encode, 3);
- encode('a')('b')('c');
- try {
- encode('d');
- BOOST_FAIL("Expected exception");
- } catch(...) {} // FIXME aconway 2008-04-03: catch proper exception
- }
- BOOST_CHECK_EQUAL(data, "\003123abc");
- encode('x')('y')('z');
- try {
- encode('!');
- BOOST_FAIL("Expected exception");
- } catch(...) {} // FIXME aconway 2008-04-03: catch proper exception
- BOOST_CHECK_EQUAL(data.size(), 10u);
-}
-
-// Assign test values to the various types.
-void testValue(bool& b) { b = true; }
-void testValue(Bit&) { }
-template <class T> typename boost::enable_if<boost::is_arithmetic<T> >::type testValue(T& n) { n=42; }
-void testValue(CharUtf32& c) { c = 43; }
-void testValue(long long& l) { l = 0x012345; }
-void testValue(Datetime& dt) { dt = qpid::sys::now(); }
-void testValue(Uuid& uuid) { uuid=Uuid(true); }
-template <class E, class M> void testValue(Decimal<E,M>& d) { d.exponent=2; d.mantissa=0x1122; }
-void testValue(SequenceNo& s) { s = 42; }
-template <size_t N> void testValue(Bin<N>& a) { a.assign(42); }
-template <class T, class S, int Unique> void testValue(SerializableString<T, S, Unique>& s) {
- char msg[]="foobar";
- s.assign(msg, msg+sizeof(msg));
-}
-void testValue(Str16& s) { s = "the quick brown fox jumped over the lazy dog"; }
-void testValue(Str8& s) { s = "foobar"; }
-void testValue(Map& m) { m["s"] = Str8("foobar"); m["b"] = true; m["c"] = uint16_t(42); }
-
-//typedef mpl::vector<Str8, Str16>::type TestTypes;
-/*BOOST_AUTO_TEST_CASE_TEMPLATE(testEncodeDecode, T, AllTypes)
-{
- string data;
- T t;
- testValue(t);
- Codec::encode(std::back_inserter(data))(t);
-
- BOOST_CHECK_EQUAL(Codec::size(t), data.size());
-
- T t2;
- Codec::decode(data.begin())(t2);
- BOOST_CHECK_EQUAL(t,t2);
-}
-*/
-
-struct TestMe {
- bool encoded, decoded;
- char value;
- TestMe(char v) : encoded(), decoded(), value(v) {}
- template <class S> void encode(S& s) const {
- const_cast<TestMe*>(this)->encoded=true; s(value);
- }
- template <class S> void decode(S& s) { decoded=true; s(value); }
- template <class S> void serialize(S& s) { s.split(*this); }
-};
-
-QPID_AUTO_TEST_CASE(testSplit) {
- string data;
- TestMe t1('x');
- Codec::encode(std::back_inserter(data))(t1);
- BOOST_CHECK(t1.encoded);
- BOOST_CHECK(!t1.decoded);
- BOOST_CHECK_EQUAL(data, "x");
-
- TestMe t2('y');
- Codec::decode(data.begin())(t2);
- BOOST_CHECK(!t2.encoded);
- BOOST_CHECK(t2.decoded);
- BOOST_CHECK_EQUAL(t2.value, 'x');
-}
-
-QPID_AUTO_TEST_CASE(testControlEncodeDecode) {
- string data;
- Control::Holder h(in_place<connection::Tune>(1,2,3,4));
- Codec::encode(std::back_inserter(data))(h);
-
- BOOST_CHECK_EQUAL(data.size(), Codec::size(h));
-
- Codec::Decoder<string::iterator> decode(data.begin());
- Control::Holder h2;
- decode(h2);
-
- BOOST_REQUIRE(h2.get());
- BOOST_CHECK_EQUAL(h2.get()->getClassCode(), connection::CODE);
- BOOST_CHECK_EQUAL(h2.get()->getCode(), uint8_t(connection::Tune::CODE));
- connection::Tune& tune=static_cast<connection::Tune&>(*h2.get());
- BOOST_CHECK_EQUAL(tune.channelMax, 1u);
- BOOST_CHECK_EQUAL(tune.maxFrameSize, 2u);
- BOOST_CHECK_EQUAL(tune.heartbeatMin, 3u);
- BOOST_CHECK_EQUAL(tune.heartbeatMax, 4u);
-}
-
-QPID_AUTO_TEST_CASE(testStruct32) {
- message::DeliveryProperties dp;
- dp.priority=message::MEDIUM;
- dp.routingKey="foo";
- Struct32 s(dp);
- string data;
- Codec::encode(back_inserter(data))(s);
-
- uint32_t structSize; // Starts with size
- Codec::decode(data.begin())(structSize);
- BOOST_CHECK_EQUAL(structSize, Codec::size(dp) + 2); // +2 for code
- BOOST_CHECK_EQUAL(structSize, data.size()-4); // encoded body
-
- BOOST_CHECK_EQUAL(data.size(), Codec::size(s));
- Struct32 s2;
- Codec::decode(data.begin())(s2);
- message::DeliveryProperties* dp2 = s2.getIf<message::DeliveryProperties>();
- BOOST_REQUIRE(dp2);
- BOOST_CHECK_EQUAL(dp2->priority, message::MEDIUM);
- BOOST_CHECK_EQUAL(dp2->routingKey, "foo");
-}
-
-QPID_AUTO_TEST_CASE(testStruct32Unknown) {
- // Verify we can recode an unknown struct unchanged.
- Struct32 s;
- string data;
- Codec::encode(back_inserter(data))(uint32_t(10));
- data.append(10, 'X');
- Codec::decode(data.begin())(s);
- string data2;
- Codec::encode(back_inserter(data2))(s);
- BOOST_CHECK_EQUAL(data.size(), data2.size());
- BOOST_CHECK_EQUAL(data, data2);
-}
-
-struct DummyPacked {
- static const uint8_t PACK=1;
- boost::optional<char> i, j;
- char k;
- Bit l,m;
- DummyPacked(char a=0, char b=0, char c=0) : i(a), j(b), k(c), l(), m() {}
- template <class S> void serialize(S& s) { s(i)(j)(k)(l)(m); }
-};
-
-Packer<DummyPacked> serializable(DummyPacked& d) { return Packer<DummyPacked>(d); }
-
-QPID_AUTO_TEST_CASE(testPackBits) {
- DummyPacked d('a','b','c');
- BOOST_CHECK_EQUAL(packBits(d), 7u);
- d.j = boost::none;
- BOOST_CHECK_EQUAL(packBits(d), 5u);
- d.m = true;
- BOOST_CHECK_EQUAL(packBits(d), 0x15u);
-}
-
-
-QPID_AUTO_TEST_CASE(testPacked) {
- string data;
-
- Codec::encode(back_inserter(data))('a')(boost::optional<char>('b'))(boost::optional<char>())('c');
- BOOST_CHECK_EQUAL(data, "abc");
- data.clear();
-
- DummyPacked dummy('a','b','c');
-
- Codec::encode(back_inserter(data))(dummy);
- BOOST_CHECK_EQUAL(data.size(), 4u);
- BOOST_CHECK_EQUAL(data, string("\007abc"));
- data.clear();
-
- dummy.i = boost::none;
- Codec::encode(back_inserter(data))(dummy);
- BOOST_CHECK_EQUAL(data, string("\6bc"));
- data.clear();
-
- const char* missing = "\5xy";
- Codec::decode(missing)(dummy);
- BOOST_CHECK(dummy.i);
- BOOST_CHECK_EQUAL(*dummy.i, 'x');
- BOOST_CHECK(!dummy.j);
- BOOST_CHECK_EQUAL(dummy.k, 'y');
-}
-
-QPID_AUTO_TEST_CASE(testUnitControl) {
- string data;
- Control::Holder h(in_place<connection::Tune>(1,2,3,4));
- Codec::encode(std::back_inserter(data))(h);
-
- Unit unit(FrameHeader(FIRST_FRAME|LAST_FRAME, CONTROL));
- Codec::decode(data.begin())(unit);
-
- BOOST_REQUIRE(unit.get<ControlHolder>());
-
- string data2;
- Codec::encode(back_inserter(data2))(unit);
-
- BOOST_CHECK_EQUAL(data, data2);
-}
-
-QPID_AUTO_TEST_CASE(testArray) {
- ArrayDomain<char> a;
- a.resize(3, 'x');
- string data;
- Codec::encode(back_inserter(data))(a);
-
- ArrayDomain<char> b;
- Codec::decode(data.begin())(b);
- BOOST_CHECK_EQUAL(b.size(), 3u);
- string data3;
- Codec::encode(back_inserter(data3))(a);
- BOOST_CHECK_EQUAL(data, data3);
-
- Array x;
- Codec::decode(data.begin())(x);
- BOOST_CHECK_EQUAL(x.size(), 3u);
- BOOST_CHECK_EQUAL(x[0].size(), 1u);
- BOOST_CHECK_EQUAL(*x[0].begin(), 'x');
- BOOST_CHECK_EQUAL(*x[2].begin(), 'x');
-
- string data2;
- Codec::encode(back_inserter(data2))(x);
- BOOST_CHECK_EQUAL(data,data2);
-}
-
-QPID_AUTO_TEST_CASE(testStruct) {
- string data;
-
- message::DeliveryProperties dp;
- BOOST_CHECK(!dp.discardUnroutable);
- dp.immediate = true;
- dp.redelivered = false;
- dp.priority = message::MEDIUM;
- dp.exchange = "foo";
-
- Codec::encode(back_inserter(data))(dp);
- // Skip 4 bytes size, little-endian decode for pack bits.
- uint16_t encodedBits=uint8_t(data[5]);
- encodedBits <<= 8;
- encodedBits += uint8_t(data[4]);
- BOOST_CHECK_EQUAL(encodedBits, packBits(dp));
-
- data.clear();
- Struct32 h(dp);
- Codec::encode(back_inserter(data))(h);
-
- Struct32 h2;
- Codec::decode(data.begin())(h2);
- BOOST_CHECK_EQUAL(h2.getClassCode(), Uint8(message::DeliveryProperties::CLASS_CODE));
- BOOST_CHECK_EQUAL(h2.getCode(), Uint8(message::DeliveryProperties::CODE));
- message::DeliveryProperties* dp2 =
- dynamic_cast<message::DeliveryProperties*>(h2.get());
- BOOST_CHECK(dp2);
- BOOST_CHECK(!dp2->discardUnroutable);
- BOOST_CHECK(dp2->immediate);
- BOOST_CHECK(!dp2->redelivered);
- BOOST_CHECK_EQUAL(dp2->priority, message::MEDIUM);
- BOOST_CHECK_EQUAL(dp2->exchange, "foo");
-}
-
-struct RecodeUnit {
- template <class T>
- void operator() (const T& t) {
- BOOST_MESSAGE(BOOST_CURRENT_FUNCTION << " called with: " << t);
- using qpid::framing::Buffer;
- using qpid::framing::AMQFrame;
-
- session::Header sh;
- BOOST_CHECK_EQUAL(Codec::size(sh), 2u);
-
- // Encode unit.
- Unit u(t);
- string data;
- Codec::encode(back_inserter(data))(u.getHeader())(u);
- data.push_back(char(0xCE)); // Preview end-of-frame
-
- // Decode AMQFrame
- Buffer buf(&data[0], data.size());
- AMQFrame f;
- f.decode(buf);
- BOOST_MESSAGE("AMQFrame decoded: " << f);
- // Encode AMQFrame
- string data2(f.size(), ' ');
- Buffer buf2(&data2[0], data.size());
- f.encode(buf2);
-
- // Verify encoded by unit == encoded by AMQFrame
- BOOST_CHECK_MESSAGE(data == data2, BOOST_CURRENT_FUNCTION);
-
- // Decode unit
- // FIXME aconway 2008-04-15: must set limit to decode a header.
- Codec::Decoder<string::iterator> decode(data2.begin(), data2.size()-1);
-
- FrameHeader h;
- decode(h);
- BOOST_CHECK_EQUAL(u.getHeader(), h);
- Unit u2(h);
- decode(u2);
-
- // Re-encode unit
- string data3;
- Codec::encode(back_inserter(data3))(u2.getHeader())(u2);
- data3.push_back(char(0xCE)); // Preview end-of-frame
-
- BOOST_CHECK_MESSAGE(data3 == data2, BOOST_CURRENT_FUNCTION);
- }
-};
-
-QPID_AUTO_TEST_CASE(testSerializeAllSegmentTypes) {
- RecodeUnit recode;
- allSegmentTypes(recode);
-}
-
-QPID_AUTO_TEST_SUITE_END()
diff --git a/cpp/src/tests/brokertest.py b/cpp/src/tests/brokertest.py
index 3207a51b79..8255fbe9ac 100644
--- a/cpp/src/tests/brokertest.py
+++ b/cpp/src/tests/brokertest.py
@@ -436,6 +436,35 @@ class Cluster:
def __getitem__(self,index): return self._brokers[index]
def __iter__(self): return self._brokers.__iter__()
+
+def browse(session, queue, timeout=0, transform=lambda m: m.content):
+ """Return a list with the contents of each message on queue."""
+ r = session.receiver("%s;{mode:browse}"%(queue))
+ r.capacity = 100
+ try:
+ contents = []
+ try:
+ while True: contents.append(transform(r.fetch(timeout=timeout)))
+ except messaging.Empty: pass
+ finally: r.close()
+ return contents
+
+def assert_browse(session, queue, expect_contents, timeout=0, transform=lambda m: m.content, msg="browse failed"):
+ """Assert that the contents of messages on queue (as retrieved
+ using session and timeout) exactly match the strings in
+ expect_contents"""
+ actual_contents = browse(session, queue, timeout, transform=transform)
+ if msg: msg = "%s: %r != %r"%(msg, expect_contents, actual_contents)
+ assert expect_contents == actual_contents, msg
+
+def assert_browse_retry(session, queue, expect_contents, timeout=1, delay=.01, transform=lambda m:m.content, msg="browse failed"):
+ """Wait up to timeout for contents of queue to match expect_contents"""
+ test = lambda: browse(session, queue, 0, transform=transform) == expect_contents
+ retry(test, timeout, delay)
+ actual_contents = browse(session, queue, 0, transform=transform)
+ if msg: msg = "%s: %r != %r"%(msg, expect_contents, actual_contents)
+ assert expect_contents == actual_contents, msg
+
class BrokerTest(TestCase):
"""
Tracks processes started by test and kills at end of test.
@@ -501,30 +530,9 @@ class BrokerTest(TestCase):
cluster = Cluster(self, count, args, expect=expect, wait=wait, show_cmd=show_cmd)
return cluster
- def browse(self, session, queue, timeout=0, transform=lambda m: m.content):
- """Return a list with the contents of each message on queue."""
- r = session.receiver("%s;{mode:browse}"%(queue))
- r.capacity = 100
- try:
- contents = []
- try:
- while True: contents.append(transform(r.fetch(timeout=timeout)))
- except messaging.Empty: pass
- finally: r.close()
- return contents
-
- def assert_browse(self, session, queue, expect_contents, timeout=0, transform=lambda m: m.content):
- """Assert that the contents of messages on queue (as retrieved
- using session and timeout) exactly match the strings in
- expect_contents"""
- actual_contents = self.browse(session, queue, timeout, transform=transform)
- self.assertEqual(expect_contents, actual_contents)
-
- def assert_browse_retry(self, session, queue, expect_contents, timeout=1, delay=.01, transform=lambda m:m.content):
- """Wait up to timeout for contents of queue to match expect_contents"""
- test = lambda: self.browse(session, queue, 0, transform=transform) == expect_contents
- retry(test, timeout, delay)
- self.assertEqual(expect_contents, self.browse(session, queue, 0, transform=transform))
+ def browse(self, *args, **kwargs): browse(*args, **kwargs)
+ def assert_browse(self, *args, **kwargs): assert_browse(*args, **kwargs)
+ def assert_browse_retry(self, *args, **kwargs): assert_browse_retry(*args, **kwargs)
def join(thread, timeout=10):
thread.join(timeout)
diff --git a/cpp/src/tests/cli_tests.py b/cpp/src/tests/cli_tests.py
index 6c75927461..7ac5b1deed 100755
--- a/cpp/src/tests/cli_tests.py
+++ b/cpp/src/tests/cli_tests.py
@@ -22,7 +22,6 @@ import sys
import os
import imp
from qpid.testlib import TestBase010
-# from brokertest import import_script, checkenv
from qpid.datatypes import Message
from qpid.queue import Empty
from time import sleep
@@ -61,14 +60,13 @@ class CliTests(TestBase010):
ret = os.system(self.qpid_config_command(" add queue " + qname + " " + arguments))
self.assertEqual(ret, 0)
- queues = self.qmf.getObjects(_class="queue")
- for queue in queues:
- if queue.name == qname:
- return queue
+ queue = self.broker_access.getQueue(qname)
+ if queue:
+ return queue
assert False
def test_queue_params(self):
- self.startQmf()
+ self.startBrokerAccess()
queue1 = self.makeQueue("test_queue_params1", "--limit-policy none")
queue2 = self.makeQueue("test_queue_params2", "--limit-policy reject")
queue3 = self.makeQueue("test_queue_params3", "--limit-policy flow-to-disk")
@@ -82,29 +80,21 @@ class CliTests(TestBase010):
self.assertEqual(queue4.arguments[LIMIT], "ring")
self.assertEqual(queue5.arguments[LIMIT], "ring_strict")
- queue6 = self.makeQueue("test_queue_params6", "--order fifo")
- queue7 = self.makeQueue("test_queue_params7", "--order lvq")
- queue8 = self.makeQueue("test_queue_params8", "--order lvq-no-browse")
-
- LVQ = "qpid.last_value_queue"
- LVQNB = "qpid.last_value_queue_no_browse"
-
- assert LVQ not in queue6.arguments
- assert LVQ in queue7.arguments
- assert LVQ not in queue8.arguments
+ queue6 = self.makeQueue("test_queue_params6", "--lvq-key lkey")
- assert LVQNB not in queue6.arguments
- assert LVQNB not in queue7.arguments
- assert LVQNB in queue8.arguments
+ LVQKEY = "qpid.last_value_queue_key"
+ assert LVQKEY not in queue5.arguments
+ assert LVQKEY in queue6.arguments
+ assert queue6.arguments[LVQKEY] == "lkey"
def test_queue_params_api(self):
- self.startQmf()
- queue1 = self.makeQueue("test_queue_params1", "--limit-policy none", True)
- queue2 = self.makeQueue("test_queue_params2", "--limit-policy reject", True)
- queue3 = self.makeQueue("test_queue_params3", "--limit-policy flow-to-disk", True)
- queue4 = self.makeQueue("test_queue_params4", "--limit-policy ring", True)
- queue5 = self.makeQueue("test_queue_params5", "--limit-policy ring-strict", True)
+ self.startBrokerAccess()
+ queue1 = self.makeQueue("test_queue_params_api1", "--limit-policy none", True)
+ queue2 = self.makeQueue("test_queue_params_api2", "--limit-policy reject", True)
+ queue3 = self.makeQueue("test_queue_params_api3", "--limit-policy flow-to-disk", True)
+ queue4 = self.makeQueue("test_queue_params_api4", "--limit-policy ring", True)
+ queue5 = self.makeQueue("test_queue_params_api5", "--limit-policy ring-strict", True)
LIMIT = "qpid.policy_type"
assert LIMIT not in queue1.arguments
@@ -113,30 +103,22 @@ class CliTests(TestBase010):
self.assertEqual(queue4.arguments[LIMIT], "ring")
self.assertEqual(queue5.arguments[LIMIT], "ring_strict")
- queue6 = self.makeQueue("test_queue_params6", "--order fifo", True)
- queue7 = self.makeQueue("test_queue_params7", "--order lvq", True)
- queue8 = self.makeQueue("test_queue_params8", "--order lvq-no-browse", True)
+ queue6 = self.makeQueue("test_queue_params_api6", "--lvq-key lkey")
- LVQ = "qpid.last_value_queue"
- LVQNB = "qpid.last_value_queue_no_browse"
+ LVQKEY = "qpid.last_value_queue_key"
- assert LVQ not in queue6.arguments
- assert LVQ in queue7.arguments
- assert LVQ not in queue8.arguments
-
- assert LVQNB not in queue6.arguments
- assert LVQNB not in queue7.arguments
- assert LVQNB in queue8.arguments
+ assert LVQKEY not in queue5.arguments
+ assert LVQKEY in queue6.arguments
+ assert queue6.arguments[LVQKEY] == "lkey"
def test_qpid_config(self):
- self.startQmf();
- qmf = self.qmf
+ self.startBrokerAccess();
qname = "test_qpid_config"
ret = os.system(self.qpid_config_command(" add queue " + qname))
self.assertEqual(ret, 0)
- queues = qmf.getObjects(_class="queue")
+ queues = self.broker_access.getAllQueues()
found = False
for queue in queues:
if queue.name == qname:
@@ -146,7 +128,7 @@ class CliTests(TestBase010):
ret = os.system(self.qpid_config_command(" del queue " + qname))
self.assertEqual(ret, 0)
- queues = qmf.getObjects(_class="queue")
+ queues = self.broker_access.getAllQueues()
found = False
for queue in queues:
if queue.name == qname:
@@ -154,13 +136,12 @@ class CliTests(TestBase010):
self.assertEqual(found, False)
def test_qpid_config_api(self):
- self.startQmf();
- qmf = self.qmf
+ self.startBrokerAccess();
qname = "test_qpid_config_api"
ret = self.qpid_config_api(" add queue " + qname)
self.assertEqual(ret, 0)
- queues = qmf.getObjects(_class="queue")
+ queues = self.broker_access.getAllQueues()
found = False
for queue in queues:
if queue.name == qname:
@@ -170,7 +151,7 @@ class CliTests(TestBase010):
ret = self.qpid_config_api(" del queue " + qname)
self.assertEqual(ret, 0)
- queues = qmf.getObjects(_class="queue")
+ queues = self.broker_access.getAllQueues()
found = False
for queue in queues:
if queue.name == qname:
@@ -179,25 +160,23 @@ class CliTests(TestBase010):
def test_qpid_config_sasl_plain_expect_succeed(self):
- self.startQmf();
- qmf = self.qmf
+ self.startBrokerAccess();
qname = "test_qpid_config_sasl_plain_expect_succeed"
- cmd = " --sasl-mechanism PLAIN -a guest/guest@localhost:"+str(self.broker.port) + " add queue " + qname
+ cmd = " --sasl-mechanism PLAIN -b guest/guest@localhost:"+str(self.broker.port) + " add queue " + qname
ret = self.qpid_config_api(cmd)
self.assertEqual(ret, 0)
def test_qpid_config_sasl_plain_expect_fail(self):
"""Fails because no user name and password is supplied"""
- self.startQmf();
- qmf = self.qmf
- qname = "test_qpid_config_sasl_plain_expect_succeed"
- cmd = " --sasl-mechanism PLAIN -a localhost:"+str(self.broker.port) + " add queue " + qname
+ self.startBrokerAccess();
+ qname = "test_qpid_config_sasl_plain_expect_fail"
+ cmd = " --sasl-mechanism PLAIN -b localhost:"+str(self.broker.port) + " add queue " + qname
ret = self.qpid_config_api(cmd)
assert ret != 0
# helpers for some of the test methods
def helper_find_exchange(self, xchgname, typ, expected=True):
- xchgs = self.qmf.getObjects(_class = "exchange")
+ xchgs = self.broker_access.getAllExchanges()
found = False
for xchg in xchgs:
if xchg.name == xchgname:
@@ -221,7 +200,7 @@ class CliTests(TestBase010):
self.helper_find_exchange(xchgname, False, expected=False)
def helper_find_queue(self, qname, expected=True):
- queues = self.qmf.getObjects(_class="queue")
+ queues = self.broker_access.getAllQueues()
found = False
for queue in queues:
if queue.name == qname:
@@ -246,8 +225,7 @@ class CliTests(TestBase010):
# test the bind-queue-to-header-exchange functionality
def test_qpid_config_headers(self):
- self.startQmf();
- qmf = self.qmf
+ self.startBrokerAccess();
qname = "test_qpid_config"
xchgname = "test_xchg"
@@ -277,8 +255,7 @@ class CliTests(TestBase010):
def test_qpid_config_xml(self):
- self.startQmf();
- qmf = self.qmf
+ self.startBrokerAccess();
qname = "test_qpid_config"
xchgname = "test_xchg"
@@ -306,13 +283,12 @@ class CliTests(TestBase010):
self.helper_destroy_exchange(xchgname)
def test_qpid_config_durable(self):
- self.startQmf();
- qmf = self.qmf
+ self.startBrokerAccess();
qname = "test_qpid_config"
ret = os.system(self.qpid_config_command(" add queue --durable " + qname))
self.assertEqual(ret, 0)
- queues = qmf.getObjects(_class="queue")
+ queues = self.broker_access.getAllQueues()
found = False
for queue in queues:
if queue.name == qname:
@@ -322,7 +298,7 @@ class CliTests(TestBase010):
ret = os.system(self.qpid_config_command(" del queue " + qname))
self.assertEqual(ret, 0)
- queues = qmf.getObjects(_class="queue")
+ queues = self.broker_access.getAllQueues()
found = False
for queue in queues:
if queue.name == qname:
@@ -330,8 +306,7 @@ class CliTests(TestBase010):
self.assertEqual(found, False)
def test_qpid_config_altex(self):
- self.startQmf();
- qmf = self.qmf
+ self.startBrokerAccess();
exName = "testalt"
qName = "testqalt"
altName = "amq.direct"
@@ -339,7 +314,7 @@ class CliTests(TestBase010):
ret = os.system(self.qpid_config_command(" add exchange topic %s --alternate-exchange=%s" % (exName, altName)))
self.assertEqual(ret, 0)
- exchanges = qmf.getObjects(_class="exchange")
+ exchanges = self.broker_access.getAllExchanges()
found = False
for exchange in exchanges:
if exchange.name == altName:
@@ -349,20 +324,23 @@ class CliTests(TestBase010):
found = True
if not exchange.altExchange:
self.fail("Alternate exchange not set")
- self.assertEqual(exchange._altExchange_.name, altName)
+ self.assertEqual(exchange.altExchange, altName)
self.assertEqual(found, True)
ret = os.system(self.qpid_config_command(" add queue %s --alternate-exchange=%s" % (qName, altName)))
self.assertEqual(ret, 0)
- queues = qmf.getObjects(_class="queue")
+ ret = os.system(self.qpid_config_command(" queues"))
+ self.assertEqual(ret, 0)
+
+ queues = self.broker_access.getAllQueues()
found = False
for queue in queues:
if queue.name == qName:
found = True
if not queue.altExchange:
self.fail("Alternate exchange not set")
- self.assertEqual(queue._altExchange_.name, altName)
+ self.assertEqual(queue.altExchange, altName)
self.assertEqual(found, True)
def test_qpid_config_list_queues_arguments(self):
@@ -371,8 +349,7 @@ class CliTests(TestBase010):
actually a string (though still a valid value), it does not
upset qpid-config
"""
- self.startQmf();
- qmf = self.qmf
+ self.startBrokerAccess();
names = ["queue_capacity%s" % (i) for i in range(1, 6)]
for name in names:
@@ -386,15 +363,14 @@ class CliTests(TestBase010):
assert name in queues, "%s not in %s" % (name, queues)
def test_qpid_route(self):
- self.startQmf();
- qmf = self.qmf
+ self.startBrokerAccess();
command = self.cli_dir() + "/qpid-route dynamic add guest/guest@localhost:%d %s:%d amq.topic" %\
(self.broker.port, self.remote_host(), self.remote_port())
ret = os.system(command)
self.assertEqual(ret, 0)
- links = qmf.getObjects(_class="link")
+ links = self.broker_access.getAllLinks()
found = False
for link in links:
if link.port == self.remote_port():
@@ -402,8 +378,7 @@ class CliTests(TestBase010):
self.assertEqual(found, True)
def test_qpid_route_api(self):
- self.startQmf();
- qmf = self.qmf
+ self.startBrokerAccess();
ret = self.qpid_route_api("dynamic add "
+ "guest/guest@localhost:"+str(self.broker.port) + " "
@@ -412,7 +387,7 @@ class CliTests(TestBase010):
self.assertEqual(ret, 0)
- links = qmf.getObjects(_class="link")
+ links = self.broker_access.getAllLinks()
found = False
for link in links:
if link.port == self.remote_port():
@@ -421,8 +396,7 @@ class CliTests(TestBase010):
def test_qpid_route_api(self):
- self.startQmf();
- qmf = self.qmf
+ self.startBrokerAccess();
ret = self.qpid_route_api("dynamic add "
+ " --client-sasl-mechanism PLAIN "
@@ -432,7 +406,7 @@ class CliTests(TestBase010):
self.assertEqual(ret, 0)
- links = qmf.getObjects(_class="link")
+ links = self.broker_access.getAllLinks()
found = False
for link in links:
if link.port == self.remote_port():
@@ -440,8 +414,7 @@ class CliTests(TestBase010):
self.assertEqual(found, True)
def test_qpid_route_api_expect_fail(self):
- self.startQmf();
- qmf = self.qmf
+ self.startBrokerAccess();
ret = self.qpid_route_api("dynamic add "
+ " --client-sasl-mechanism PLAIN "
@@ -463,11 +436,11 @@ class CliTests(TestBase010):
return None
def qpid_config_command(self, arg = ""):
- return self.cli_dir() + "/qpid-config -a localhost:%d" % self.broker.port + " " + arg
+ return self.cli_dir() + "/qpid-config -b localhost:%d" % self.broker.port + " " + arg
def qpid_config_api(self, arg = ""):
script = import_script(checkenv("QPID_CONFIG_EXEC"))
- broker = ["-a", "localhost:"+str(self.broker.port)]
+ broker = ["-b", "localhost:"+str(self.broker.port)]
return script.main(broker + arg.split())
def qpid_route_api(self, arg = ""):
diff --git a/cpp/src/tests/cluster.cmake b/cpp/src/tests/cluster.cmake
index 3471173e97..31e2d337d1 100644
--- a/cpp/src/tests/cluster.cmake
+++ b/cpp/src/tests/cluster.cmake
@@ -55,7 +55,7 @@ add_test (clustered_replication_test ${CMAKE_CURRENT_SOURCE_DIR}/clustered_repli
# CLEANFILES += cluster_test.acl cluster.ports
# EXTRA_DIST += \
-# ais_check \
+# cpg_check.sh.in \
# run_cluster_test \
# cluster_read_credit \
# test_watchdog \
diff --git a/cpp/src/tests/cluster.mk b/cpp/src/tests/cluster.mk
index 199d1e7b57..852b2dda8c 100644
--- a/cpp/src/tests/cluster.mk
+++ b/cpp/src/tests/cluster.mk
@@ -25,12 +25,11 @@
CLUSTER_TEST_SCRIPTS_LIST= \
allhosts rsynchosts \
qpid-build-rinstall qpid-src-rinstall \
- qpid-test-cluster \
- qpid-cluster-benchmark
+ qpid-test-cluster
EXTRA_DIST += \
$(CLUSTER_TEST_SCRIPTS_LIST) \
- ais_check \
+ cpg_check.sh.in \
run_cluster_test \
cluster_read_credit \
test_watchdog \
@@ -55,14 +54,12 @@ if HAVE_LIBCPG
#
# Cluster tests makefile fragment, to be included in Makefile.am
-#
+#
# NOTE: Programs using the openais library must be run with gid=ais
# You should do "newgrp ais" before running the tests to run these.
-#
-
+#
-# ais_check checks pre-requisites for cluster tests and runs them if ok.
TESTS += \
run_cluster_test \
cluster_read_credit \
diff --git a/cpp/src/tests/cluster_failover b/cpp/src/tests/cluster_failover
new file mode 100755
index 0000000000..43170c731a
--- /dev/null
+++ b/cpp/src/tests/cluster_failover
@@ -0,0 +1,19 @@
+#!/bin/sh
+# A simple manual failover test, sends a stream of numbered messages.
+# You can kill the connected broker and verify that the clients reconnect
+# and no messages are lost.
+
+URL=$1
+test -n "$URL" || { echo Usage: $0 URL ; exit 1; }
+SEND=$(mktemp /tmp/send.XXXXXXXXXX)
+RECV=$(mktemp /tmp/recv.XXXXXXXXXX)
+echo $SEND $RECV
+
+seq 1000000 > $SEND
+
+qpid-send -a 'cluster_failover;{create:always}' -b $URL --connection-options "{reconnect:true}" --send-rate 10 --content-stdin < $SEND &
+
+while msg=$(qpid-receive -m1 -f -a 'cluster_failover;{create:always}' -b $URL --connection-options "{reconnect:true,heartbeat:1}"); do
+ echo -n $msg; date
+done
+wait
diff --git a/cpp/src/tests/cluster_python_tests b/cpp/src/tests/cluster_python_tests
index 8e17ffc8bc..25c7889246 100755
--- a/cpp/src/tests/cluster_python_tests
+++ b/cpp/src/tests/cluster_python_tests
@@ -20,7 +20,8 @@
#
# Skip if cluster services not running.
-. `dirname $0`/ais_check
+. cpg_check.sh
+cpg_enabled || exit 0
FAILING=`dirname $0`/cluster_python_tests_failing.txt
source `dirname $0`/python_tests
diff --git a/cpp/src/tests/cluster_read_credit b/cpp/src/tests/cluster_read_credit
index fb3b72fbaf..552ffee53b 100755
--- a/cpp/src/tests/cluster_read_credit
+++ b/cpp/src/tests/cluster_read_credit
@@ -21,7 +21,9 @@
# Regression test for http://issues.apache.org/jira/browse/QPID-2086
srcdir=`dirname $0`
-. $srcdir/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
+
$srcdir/start_cluster 1 --cluster-read-max=2 || exit 1
trap $srcdir/stop_cluster EXIT
seq 1 10000 | ./sender --port `cat cluster.ports` --routing-key no-such-queue
diff --git a/cpp/src/tests/cluster_test_logs.py b/cpp/src/tests/cluster_test_logs.py
index 3c7e8e8020..003d82c619 100755
--- a/cpp/src/tests/cluster_test_logs.py
+++ b/cpp/src/tests/cluster_test_logs.py
@@ -60,11 +60,13 @@ def filter_log(log):
'task late',
'task overran',
'warning CLOSING .* unsent data',
- 'Inter-broker link ',
+ 'Inter-broker link ', # ignore link state changes
+ 'Updated link key from ', # ignore link state changes
'Running in a cluster, marking store',
'debug Sending keepalive signal to watchdog', # Watchdog timer thread
'last broker standing joined by 1 replicas, updating queue policies.',
- 'Connection .* timed out: closing' # heartbeat connection close
+ 'Connection .* timed out: closing', # heartbeat connection close
+ "org.apache.qpid.broker:bridge:" # ignore bridge index
])
# Regex to match a UUID
uuid='\w\w\w\w\w\w\w\w-\w\w\w\w-\w\w\w\w-\w\w\w\w-\w\w\w\w\w\w\w\w\w\w\w\w'
diff --git a/cpp/src/tests/cluster_tests.py b/cpp/src/tests/cluster_tests.py
index cbc3df4a6b..8952f5de7b 100755
--- a/cpp/src/tests/cluster_tests.py
+++ b/cpp/src/tests/cluster_tests.py
@@ -277,7 +277,7 @@ acl deny all all
QMF-based tools - regression test for BZ615300."""
broker1 = self.cluster(1)[0]
broker2 = self.cluster(1)[0]
- qs = subprocess.Popen(["qpid-stat", "-e", broker1.host_port()], stdout=subprocess.PIPE)
+ qs = subprocess.Popen(["qpid-stat", "-e", "-b", broker1.host_port()], stdout=subprocess.PIPE)
out = qs.communicate()[0]
assert out.find("amq.failover") > 0
@@ -767,6 +767,124 @@ acl deny all all
cluster.start()
fetch(cluster[2])
+
+ def test_federation_failover(self):
+ """
+ Verify that federation operates across failures occuring in a cluster.
+ Specifically:
+ 1) Destination cluster learns of membership changes in the source
+ cluster
+ 2) Destination cluster replicates the current state of the source
+ cluster to newly-added members
+ """
+
+ TIMEOUT = 30
+ def verify(src_broker, src, dst_broker, dst, timeout=TIMEOUT):
+ """ Prove that traffic can pass from source fed broker to
+ destination fed broker
+ """
+ tot_time = 0
+ active = False
+ send_session = src_broker.connect().session()
+ sender = send_session.sender(src)
+ receive_session = dst_broker.connect().session()
+ receiver = receive_session.receiver(dst)
+ while not active and tot_time < timeout:
+ sender.send(Message("Hello from Source!"))
+ try:
+ receiver.fetch(timeout = 1)
+ receive_session.acknowledge()
+ # Get this far without Empty exception, and the link is good!
+ active = True
+ while True:
+ # Keep receiving msgs, as several may have accumulated
+ receiver.fetch(timeout = 1)
+ receive_session.acknowledge()
+ except Empty:
+ if not active:
+ tot_time += 1
+ receiver.close()
+ receive_session.close()
+ sender.close()
+ send_session.close()
+ self.assertTrue(active, "Bridge failed to become active")
+
+
+ # 2 node cluster source, 2 node cluster destination
+ src_cluster = self.cluster(2, expect=EXPECT_EXIT_FAIL)
+ src_cluster.ready();
+ dst_cluster = self.cluster(2, expect=EXPECT_EXIT_FAIL)
+ dst_cluster.ready();
+
+ cmd = self.popen(["qpid-config",
+ "--broker", src_cluster[0].host_port(),
+ "add", "queue", "srcQ"], EXPECT_EXIT_OK)
+ cmd.wait()
+
+ cmd = self.popen(["qpid-config",
+ "--broker", dst_cluster[0].host_port(),
+ "add", "exchange", "fanout", "destX"], EXPECT_EXIT_OK)
+ cmd.wait()
+
+ cmd = self.popen(["qpid-config",
+ "--broker", dst_cluster[0].host_port(),
+ "add", "queue", "destQ"], EXPECT_EXIT_OK)
+ cmd.wait()
+
+ cmd = self.popen(["qpid-config",
+ "--broker", dst_cluster[0].host_port(),
+ "bind", "destX", "destQ"], EXPECT_EXIT_OK)
+ cmd.wait()
+
+ # federate the srcQ to the destination exchange
+ dst_cluster[0].startQmf()
+ dst_broker = dst_cluster[0].qmf_session.getObjects(_class="broker")[0]
+ result = dst_broker.connect(src_cluster[0].host(), src_cluster[0].port(), False, "PLAIN",
+ "guest", "guest", "tcp")
+ self.assertEqual(result.status, 0, result);
+
+ link = dst_cluster[0].qmf_session.getObjects(_class="link")[0]
+ result = link.bridge(False, "srcQ", "destX", "", "", "", True, False, False, 10)
+ self.assertEqual(result.status, 0, result)
+
+ # check that traffic passes
+ verify(src_cluster[0], "srcQ", dst_cluster[0], "destQ")
+
+ # add src[2] broker to source cluster
+ src_cluster.start(expect=EXPECT_EXIT_FAIL);
+ src_cluster.ready();
+ verify(src_cluster[2], "srcQ", dst_cluster[0], "destQ")
+
+ # Kill src[0]. dst[0] should fail over to src[1]
+ src_cluster[0].kill()
+ for b in src_cluster[1:]: b.ready()
+ verify(src_cluster[1], "srcQ", dst_cluster[0], "destQ")
+
+ # Kill src[1], dst[0] should fail over to src[2]
+ src_cluster[1].kill()
+ for b in src_cluster[2:]: b.ready()
+ verify(src_cluster[2], "srcQ", dst_cluster[0], "destQ")
+
+ # Kill dest[0], force failover to dest[1]
+ dst_cluster[0].kill()
+ for b in dst_cluster[1:]: b.ready()
+ verify(src_cluster[2], "srcQ", dst_cluster[1], "destQ")
+
+ # Add dest[2]
+ # dest[1] syncs dest[2] to current remote state
+ dst_cluster.start(expect=EXPECT_EXIT_FAIL);
+ for b in dst_cluster[1:]: b.ready()
+ verify(src_cluster[2], "srcQ", dst_cluster[1], "destQ")
+
+ # Kill dest[1], force failover to dest[2]
+ dst_cluster[1].kill()
+ for b in dst_cluster[2:]: b.ready()
+ verify(src_cluster[2], "srcQ", dst_cluster[2], "destQ")
+
+ for i in range(2, len(src_cluster)): src_cluster[i].kill()
+ for i in range(2, len(dst_cluster)): dst_cluster[i].kill()
+
+
# Some utility code for transaction tests
XA_RBROLLBACK = 1
XA_RBTIMEOUT = 2
@@ -1160,7 +1278,7 @@ class LongTests(BrokerTest):
def start_mclients(broker):
"""Start management clients that make multiple connections."""
- cmd = ["qpid-stat", "-b", "localhost:%s" %(broker.port())]
+ cmd = ["qpid-cluster", "-C", "localhost:%s" %(broker.port())]
mclients.append(ClientLoop(broker, cmd))
endtime = time.time() + self.duration()
diff --git a/cpp/src/tests/clustered_replication_test b/cpp/src/tests/clustered_replication_test
index 4a57502f39..5a9f143eb4 100755
--- a/cpp/src/tests/clustered_replication_test
+++ b/cpp/src/tests/clustered_replication_test
@@ -8,9 +8,9 @@
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
-#
+#
# http://www.apache.org/licenses/LICENSE-2.0
-#
+#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -34,11 +34,11 @@ stop_brokers() {
if [[ $PRIMARY1 ]] ; then
$QPIDD_EXEC --no-module-dir -q --port $PRIMARY1
unset PRIMARY1
- fi
+ fi
if [[ $PRIMARY2 ]] ; then
$QPIDD_EXEC --no-module-dir -q --port $PRIMARY2
unset PRIMARY2
- fi
+ fi
if [[ $DR1 ]] ; then
$QPIDD_EXEC --no-module-dir -q --port $DR1
unset DR1
@@ -50,7 +50,8 @@ stop_brokers() {
}
if test -d $PYTHON_DIR; then
- . $srcdir/ais_check
+ . cpg_check.sh
+ cpg_enabled || exit 0
#todo: these cluster names need to be unique to prevent clashes
PRIMARY_CLUSTER=PRIMARY_$(hostname)_$$
@@ -65,8 +66,8 @@ if test -d $PYTHON_DIR; then
#start first node of primary cluster and set up test queue
echo Starting primary cluster
PRIMARY1=$(with_ais_group $QPIDD_EXEC $GENERAL_OPTS $PRIMARY_OPTS --log-to-file repl.primary.1.tmp) || fail "Could not start PRIMARY1"
- $PYTHON_COMMANDS/qpid-config -a "localhost:$PRIMARY1" add queue test-queue --generate-queue-events 2
- $PYTHON_COMMANDS/qpid-config -a "localhost:$PRIMARY1" add queue control-queue --generate-queue-events 1
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$PRIMARY1" add queue test-queue --generate-queue-events 2
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$PRIMARY1" add queue control-queue --generate-queue-events 1
#send 10 messages, consume 5 of them
for i in `seq 1 10`; do echo Message$i; done | ./sender --port $PRIMARY1
@@ -81,28 +82,28 @@ if test -d $PYTHON_DIR; then
DR1=$(with_ais_group $QPIDD_EXEC $GENERAL_OPTS $DR_OPTS --log-to-file repl.dr.1.tmp) || fail "Could not start DR1"
DR2=$(with_ais_group $QPIDD_EXEC $GENERAL_OPTS $DR_OPTS --log-to-file repl.dr.2.tmp) || fail "Could not start DR2"
- $PYTHON_COMMANDS/qpid-config -a "localhost:$DR1" add queue test-queue
- $PYTHON_COMMANDS/qpid-config -a "localhost:$DR1" add queue control-queue
- $PYTHON_COMMANDS/qpid-config -a "localhost:$DR1" add exchange replication REPLICATION_EXCHANGE
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$DR1" add queue test-queue
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$DR1" add queue control-queue
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$DR1" add exchange replication REPLICATION_EXCHANGE
$PYTHON_COMMANDS/qpid-route queue add localhost:$DR2 localhost:$PRIMARY2 REPLICATION_EXCHANGE REPLICATION_QUEUE || fail "Could not add route."
#send more messages to primary
for i in `seq 11 20`; do echo Message$i; done | ./sender --port $PRIMARY1 --send-eos 1
- #wait for replication events to all be processed:
+ #wait for replication events to all be processed:
echo Waiting for replication to complete
echo Done | ./sender --port $PRIMARY1 --routing-key control-queue --send-eos 1
./receiver --queue control-queue --port $DR1 > /dev/null
#verify contents of test queue on dr cluster:
- echo Verifying...
+ echo Verifying...
./receiver --port $DR2 > repl.out.tmp
for i in `seq 6 20`; do echo Message$i; done | diff repl.out.tmp - || FAIL=1
if [[ $FAIL ]]; then
echo Clustered replication test failed: expectations not met!
exit 1
- else
+ else
echo Clustered replication test passed
rm -f repl*.tmp
fi
diff --git a/cpp/src/tests/cpg_check.sh.in b/cpp/src/tests/cpg_check.sh.in
new file mode 100755
index 0000000000..ed97776218
--- /dev/null
+++ b/cpp/src/tests/cpg_check.sh.in
@@ -0,0 +1,38 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+QPID_USE_CPG=${QPID_USE_CPG:-@USE_CPG@}
+
+# Check if CPG is enabled
+cpg_enabled() {
+ test x$QPID_USE_CPG = xyes || return 1 # disabled
+ ps -u root | grep 'aisexec\|corosync' >/dev/null || {
+ echo WARNING: Skip cluster tests, aisexec or corosync daemon is not running.
+ return 1; # A warning, not a failure.
+ }
+ return 0
+}
+
+# Execute command with the ais group set if user is a member.
+with_ais_group() {
+ if id -nG | grep '\<ais\>' >/dev/null; then sg ais -c "$*"
+ else "$@"
+ fi
+}
diff --git a/cpp/src/tests/federated_cluster_test b/cpp/src/tests/federated_cluster_test
index b32455259e..f42b7501b8 100755
--- a/cpp/src/tests/federated_cluster_test
+++ b/cpp/src/tests/federated_cluster_test
@@ -8,9 +8,9 @@
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
-#
+#
# http://www.apache.org/licenses/LICENSE-2.0
-#
+#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -35,7 +35,7 @@ stop_brokers() {
if [[ $BROKER_A ]] ; then
../qpidd --no-module-dir -q --port $BROKER_A
unset BROKER_A
- fi
+ fi
if [[ $NODE_1 ]] ; then
../qpidd --no-module-dir -q --port $NODE_1
unset NODE_1
@@ -63,20 +63,20 @@ start_brokers() {
setup() {
#create exchange on both cluster and single broker
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add exchange direct test-exchange
- $PYTHON_COMMANDS/qpid-config -a "localhost:$NODE_1" add exchange direct test-exchange
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_A" add exchange direct test-exchange
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$NODE_1" add exchange direct test-exchange
#create dynamic routes for test exchange
$PYTHON_COMMANDS/qpid-route dynamic add "localhost:$NODE_2" "localhost:$BROKER_A" test-exchange
$PYTHON_COMMANDS/qpid-route dynamic add "localhost:$BROKER_A" "localhost:$NODE_2" test-exchange
#create test queue on cluster and bind it to the test exchange
- $PYTHON_COMMANDS/qpid-config -a "localhost:$NODE_1" add queue test-queue
- $PYTHON_COMMANDS/qpid-config -a "localhost:$NODE_1" bind test-exchange test-queue to-cluster
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$NODE_1" add queue test-queue
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$NODE_1" bind test-exchange test-queue to-cluster
#create test queue on single broker and bind it to the test exchange
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue test-queue
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" bind test-exchange test-queue from-cluster
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_A" add queue test-queue
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_A" bind test-exchange test-queue from-cluster
}
run_test_pull_to_cluster_two_consumers() {
@@ -92,7 +92,7 @@ run_test_pull_to_cluster_two_consumers() {
wait
sort -g -k 2 fed1.out.tmp fed2.out.tmp > fed.out.tmp
diff fed.in.tmp fed.out.tmp || fail "federated link to cluster failed: expectations not met!"
-
+
rm -f fed*.tmp #cleanup
}
@@ -106,7 +106,7 @@ run_test_pull_to_cluster() {
#verify all messages are received
diff fed.in.tmp fed.out.tmp || fail "federated link to cluster failed: expectations not met!"
-
+
rm -f fed*.tmp #cleanup
}
@@ -121,22 +121,23 @@ run_test_pull_from_cluster() {
#verify all messages are received
wait
diff fed.in.tmp fed.out.tmp || fail "federated link from cluster failed: expectations not met!"
-
+
rm -f fed*.tmp #cleanup
}
if test -d ${PYTHON_DIR}; then
- . $srcdir/ais_check
+ . cpg_check.sh
+ cpg_enabled || exit 0
rm -f fed*.tmp #cleanup any files left from previous run
start_brokers
echo "brokers started"
setup
echo "setup completed"
- run_test_pull_to_cluster_two_consumers
+ run_test_pull_to_cluster_two_consumers
echo "federated link to cluster verified"
- run_test_pull_from_cluster
+ run_test_pull_from_cluster
echo "federated link from cluster verified"
if [[ $TEST_NODE_FAILURE ]] ; then
#kill first cluster node and retest
@@ -146,7 +147,7 @@ if test -d ${PYTHON_DIR}; then
echo "retesting..."
run_test_pull_to_cluster
echo "federated link to cluster verified"
- run_test_pull_from_cluster
- echo "federated link from cluster verified"
+ run_test_pull_from_cluster
+ echo "federated link from cluster verified"
fi
fi
diff --git a/cpp/src/tests/ha_tests.py b/cpp/src/tests/ha_tests.py
index 97de0d1f77..827cb7dca9 100755
--- a/cpp/src/tests/ha_tests.py
+++ b/cpp/src/tests/ha_tests.py
@@ -18,71 +18,125 @@
# under the License.
#
-import os, signal, sys, time, imp, re, subprocess, glob, random, logging, shutil
-from qpid.messaging import Message, NotFound, ConnectionError, Connection
+import os, signal, sys, time, imp, re, subprocess, glob, random, logging, shutil, math
+from qpid.messaging import Message, NotFound, ConnectionError, ReceiverError, Connection
+from qpid.datatypes import uuid4
from brokertest import *
from threading import Thread, Lock, Condition
from logging import getLogger, WARN, ERROR, DEBUG
+from qpidtoollibs import BrokerAgent
-
-log = getLogger("qpid.ha-tests")
+log = getLogger(__name__)
class HaBroker(Broker):
- def __init__(self, test, args=[], broker_url=None, **kwargs):
+ def __init__(self, test, args=[], broker_url=None, ha_cluster=True,
+ ha_replicate="all", **kwargs):
assert BrokerTest.ha_lib, "Cannot locate HA plug-in"
- args=["--load-module", BrokerTest.ha_lib,
- # FIXME aconway 2012-02-13: workaround slow link failover.
- "--link-maintenace-interval=0.1",
- "--ha-enable=yes"]
- if broker_url: args += [ "--ha-broker-url", broker_url ]
+ args = copy(args)
+ args += ["--load-module", BrokerTest.ha_lib,
+ "--log-enable=info+", "--log-enable=debug+:ha::",
+ # FIXME aconway 2012-02-13: workaround slow link failover.
+ "--link-maintenace-interval=0.1",
+ "--ha-cluster=%s"%ha_cluster]
+ if ha_replicate is not None:
+ args += [ "--ha-replicate=%s"%ha_replicate ]
+ if broker_url: args.extend([ "--ha-brokers", broker_url ])
Broker.__init__(self, test, args, **kwargs)
+ self.commands=os.getenv("PYTHON_COMMANDS")
+ assert os.path.isdir(self.commands)
+ getLogger().setLevel(ERROR) # Hide expected WARNING log messages from failover.
def promote(self):
- assert os.system("qpid-ha-tool --promote %s"%(self.host_port())) == 0
+ assert os.system("%s/qpid-ha promote -b %s"%(self.commands, self.host_port())) == 0
def set_client_url(self, url):
assert os.system(
- "qpid-ha-tool --client-addresses=%s %s"%(url,self.host_port())) == 0
+ "%s/qpid-ha set --public-brokers=%s -b %s"%(self.commands, url,self.host_port())) == 0
def set_broker_url(self, url):
assert os.system(
- "qpid-ha-tool --broker-addresses=%s %s"%(url, self.host_port())) == 0
-
-
-class ShortTests(BrokerTest):
- """Short HA functionality tests."""
-
- # Wait for an address to become valid.
- def wait(self, session, address):
- def check():
- try:
- session.sender(address)
- return True
- except NotFound: return False
- assert retry(check), "Timed out waiting for %s"%(address)
-
- # Wait for address to become valid on a backup broker.
- def wait_backup(self, backup, address):
- bs = self.connect_admin(backup).session()
- self.wait(bs, address)
- bs.connection.close()
-
- # Combines wait_backup and assert_browse_retry
- def assert_browse_backup(self, backup, queue, expected, **kwargs):
- bs = self.connect_admin(backup).session()
- self.wait(bs, queue)
- self.assert_browse_retry(bs, queue, expected, **kwargs)
- bs.connection.close()
-
- def assert_missing(self, session, address):
+ "%s/qpid-ha set --brokers=%s -b %s"%(self.commands, url, self.host_port())) == 0
+
+ def replicate(self, from_broker, queue):
+ assert os.system(
+ "%s/qpid-ha replicate -b %s %s %s"%(self.commands, self.host_port(), from_broker, queue)) == 0
+
+ def config_replicate(self, from_broker, queue):
+ assert os.system(
+ "%s/qpid-config --broker=%s add queue --start-replica %s %s"%(self.commands, self.host_port(), from_broker, queue)) == 0
+
+ def config_declare(self, queue, replication):
+ assert os.system(
+ "%s/qpid-config --broker=%s add queue %s --replicate %s"%(self.commands, self.host_port(), queue, replication)) == 0
+
+ def connect_admin(self, **kwargs):
+ return Broker.connect(self, client_properties={"qpid.ha-admin":1}, **kwargs)
+
+ def wait_backup(self, address):
+ """Wait for address to become valid on a backup broker."""
+ bs = self.connect_admin().session()
+ try: wait_address(bs, address)
+ finally: bs.connection.close()
+
+ def assert_browse_backup(self, queue, expected, **kwargs):
+ """Combines wait_backup and assert_browse_retry."""
+ bs = self.connect_admin().session()
try:
- session.receiver(address)
- self.fail("Should not have been replicated: %s"%(address))
- except NotFound: pass
+ wait_address(bs, queue)
+ assert_browse_retry(bs, queue, expected, **kwargs)
+ finally: bs.connection.close()
+
+class HaCluster(object):
+ _cluster_count = 0
+
+ def __init__(self, test, n, **kwargs):
+ """Start a cluster of n brokers"""
+ self.test = test
+ self._brokers = [ HaBroker(test, name="broker%s-%s"%(HaCluster._cluster_count, i), **kwargs) for i in xrange(n)]
+ HaCluster._cluster_count += 1
+ self.url = ",".join([b.host_port() for b in self])
+ for b in self: b.set_broker_url(self.url)
+ self[0].promote()
+
+ def connect(self, i):
+ """Connect with reconnect_urls"""
+ return self[i].connect(reconnect=True, reconnect_urls=self.url.split(","))
+
+ def kill(self, i):
+ """Kill broker i, promote broker i+1"""
+ self[i].kill()
+ self[i].expect = EXPECT_EXIT_FAIL
+ self[(i+1) % len(self)].promote()
+
+ def bounce(self, i):
+ """Stop and restart a broker in a cluster."""
+ self.kill(i)
+ b = self[i]
+ self._brokers[i] = HaBroker(self.test, name=b.name, port=b.port(), broker_url=self.url)
+
+ # Behave like a list of brokers.
+ def __len__(self): return len(self._brokers)
+ def __getitem__(self,index): return self._brokers[index]
+ def __iter__(self): return self._brokers.__iter__()
+
+def wait_address(session, address):
+ """Wait for an address to become valid."""
+ def check():
+ try:
+ session.sender(address)
+ return True
+ except NotFound: return False
+ assert retry(check), "Timed out waiting for address %s"%(address)
+
+def assert_missing(session, address):
+ """Assert that the address is _not_ valid"""
+ try:
+ session.receiver(address)
+ self.fail("Expected NotFound: %s"%(address))
+ except NotFound: pass
- def connect_admin(self, backup, **kwargs):
- """Connect to a backup broker as an admin connection"""
- return backup.connect(client_properties={"qpid.ha-admin":1}, **kwargs)
+class ReplicationTests(BrokerTest):
+ """Correctness tests for HA replication."""
def test_replication(self):
"""Test basic replication of configuration and messages before and
@@ -95,21 +149,21 @@ class ShortTests(BrokerTest):
return"%s;{create:always,node:{type:topic,x-declare:{arguments:{'qpid.replicate':%s}, type:'fanout'},x-bindings:[{exchange:'%s',queue:'%s'}]}}"%(name, replicate, name, bindq)
def setup(p, prefix, primary):
"""Create config, send messages on the primary p"""
- s = p.sender(queue(prefix+"q1", "messages"))
+ s = p.sender(queue(prefix+"q1", "all"))
for m in ["a", "b", "1"]: s.send(Message(m))
# Test replication of dequeue
self.assertEqual(p.receiver(prefix+"q1").fetch(timeout=0).content, "a")
p.acknowledge()
p.sender(queue(prefix+"q2", "configuration")).send(Message("2"))
p.sender(queue(prefix+"q3", "none")).send(Message("3"))
- p.sender(exchange(prefix+"e1", "messages", prefix+"q1")).send(Message("4"))
- p.sender(exchange(prefix+"e2", "messages", prefix+"q2")).send(Message("5"))
+ p.sender(exchange(prefix+"e1", "all", prefix+"q1")).send(Message("4"))
+ p.sender(exchange(prefix+"e2", "all", prefix+"q2")).send(Message("5"))
# Test unbind
- p.sender(queue(prefix+"q4", "messages")).send(Message("6"))
- s3 = p.sender(exchange(prefix+"e4", "messages", prefix+"q4"))
+ p.sender(queue(prefix+"q4", "all")).send(Message("6"))
+ s3 = p.sender(exchange(prefix+"e4", "all", prefix+"q4"))
s3.send(Message("7"))
# Use old connection to unbind
- us = primary.connect_old().session(str(qpid.datatypes.uuid4()))
+ us = primary.connect_old().session(str(uuid4()))
us.exchange_unbind(exchange=prefix+"e4", binding_key="", queue=prefix+"q4")
p.sender(prefix+"e4").send(Message("drop1")) # Should be dropped
# Need a marker so we can wait till sync is done.
@@ -117,9 +171,8 @@ class ShortTests(BrokerTest):
def verify(b, prefix, p):
"""Verify setup was replicated to backup b"""
-
# Wait for configuration to replicate.
- self.wait(b, prefix+"x");
+ wait_address(b, prefix+"x");
self.assert_browse_retry(b, prefix+"q1", ["b", "1", "4"])
self.assertEqual(p.receiver(prefix+"q1").fetch(timeout=0).content, "b")
@@ -127,7 +180,7 @@ class ShortTests(BrokerTest):
self.assert_browse_retry(b, prefix+"q1", ["1", "4"])
self.assert_browse_retry(b, prefix+"q2", []) # configuration only
- self.assert_missing(b, prefix+"q3")
+ assert_missing(b, prefix+"q3")
b.sender(prefix+"e1").send(Message(prefix+"e1")) # Verify binds with replicate=all
self.assert_browse_retry(b, prefix+"q1", ["1", "4", prefix+"e1"])
b.sender(prefix+"e2").send(Message(prefix+"e2")) # Verify binds with replicate=configuration
@@ -147,12 +200,12 @@ class ShortTests(BrokerTest):
setup(p, "2", primary)
# Verify the data on the backup
- b = self.connect_admin(backup).session()
+ b = backup.connect_admin().session()
verify(b, "1", p)
verify(b, "2", p)
# Test a series of messages, enqueue all then dequeue all.
- s = p.sender(queue("foo","messages"))
- self.wait(b, "foo")
+ s = p.sender(queue("foo","all"))
+ wait_address(b, "foo")
msgs = [str(i) for i in range(10)]
for m in msgs: s.send(Message(m))
self.assert_browse_retry(p, "foo", msgs)
@@ -173,16 +226,11 @@ class ShortTests(BrokerTest):
self.assert_browse_retry(p, "foo", msgs[i+1:])
self.assert_browse_retry(b, "foo", msgs[i+1:])
- def qpid_replicate(self, value="messages"):
- return "node:{x-declare:{arguments:{'qpid.replicate':%s}}}" % value
-
def test_sync(self):
- def queue(name, replicate):
- return "%s;{create:always,%s}"%(name, self.qpid_replicate(replicate))
primary = HaBroker(self, name="primary")
primary.promote()
p = primary.connect().session()
- s = p.sender(queue("q","messages"))
+ s = p.sender("q;{create:always}")
for m in [str(i) for i in range(0,10)]: s.send(m)
s.sync()
backup1 = HaBroker(self, name="backup1", broker_url=primary.host_port())
@@ -193,49 +241,39 @@ class ShortTests(BrokerTest):
s.sync()
msgs = [str(i) for i in range(30)]
- b1 = self.connect_admin(backup1).session()
- self.wait(b1, "q");
+ b1 = backup1.connect_admin().session()
+ wait_address(b1, "q");
self.assert_browse_retry(b1, "q", msgs)
- b2 = self.connect_admin(backup2).session()
- self.wait(b2, "q");
+ b2 = backup2.connect_admin().session()
+ wait_address(b2, "q");
self.assert_browse_retry(b2, "q", msgs)
def test_send_receive(self):
"""Verify sequence numbers of messages sent by qpid-send"""
- primary = HaBroker(self, name="primary")
- primary.promote()
- backup1 = HaBroker(self, name="backup1", broker_url=primary.host_port())
- backup2 = HaBroker(self, name="backup2", broker_url=primary.host_port())
+ brokers = HaCluster(self, 3)
sender = self.popen(
["qpid-send",
- "--broker", primary.host_port(),
- "--address", "q;{create:always,%s}"%(self.qpid_replicate("messages")),
+ "--broker", brokers[0].host_port(),
+ "--address", "q;{create:always}",
"--messages=1000",
"--content-string=x"
])
receiver = self.popen(
["qpid-receive",
- "--broker", primary.host_port(),
- "--address", "q;{create:always,%s}"%(self.qpid_replicate("messages")),
+ "--broker", brokers[0].host_port(),
+ "--address", "q;{create:always}",
"--messages=990",
"--timeout=10"
])
- try:
- self.assertEqual(sender.wait(), 0)
- self.assertEqual(receiver.wait(), 0)
- expect = [long(i) for i in range(991, 1001)]
- sn = lambda m: m.properties["sn"]
- self.assert_browse_retry(self.connect_admin(backup1).session(), "q", expect, transform=sn)
- self.assert_browse_retry(self.connect_admin(backup2).session(), "q", expect, transform=sn)
- except:
- print self.browse(primary.connect().session(), "q", transform=sn)
- print self.browse(self.connect_admin(backup1).session(), "q", transform=sn)
- print self.browse(self.connect_admin(backup2).session(), "q", transform=sn)
- raise
+ self.assertEqual(sender.wait(), 0)
+ self.assertEqual(receiver.wait(), 0)
+ expect = [long(i) for i in range(991, 1001)]
+ sn = lambda m: m.properties["sn"]
+ brokers[1].assert_browse_backup("q", expect, transform=sn)
+ brokers[2].assert_browse_backup("q", expect, transform=sn)
def test_failover_python(self):
"""Verify that backups rejects connections and that fail-over works in python client"""
- getLogger().setLevel(ERROR) # Disable WARNING log messages due to failover messages
primary = HaBroker(self, name="primary", expect=EXPECT_EXIT_FAIL)
primary.promote()
backup = HaBroker(self, name="backup", broker_url=primary.host_port())
@@ -245,13 +283,13 @@ class ShortTests(BrokerTest):
self.fail("Expected connection to backup to fail")
except ConnectionError: pass
# Check that admin connections are allowed to backup.
- self.connect_admin(backup).close()
+ backup.connect_admin().close()
# Test discovery: should connect to primary after reject by backup
c = backup.connect(reconnect_urls=[primary.host_port(), backup.host_port()], reconnect=True)
s = c.session()
- sender = s.sender("q;{create:always,%s}"%(self.qpid_replicate()))
- self.wait_backup(backup, "q")
+ sender = s.sender("q;{create:always}")
+ backup.wait_backup("q")
sender.send("foo")
primary.kill()
assert retry(lambda: not is_running(primary.pid))
@@ -265,14 +303,14 @@ class ShortTests(BrokerTest):
primary.promote()
backup = HaBroker(self, name="backup", broker_url=primary.host_port())
url="%s,%s"%(primary.host_port(), backup.host_port())
- primary.connect().session().sender("q;{create:always,%s}"%(self.qpid_replicate()))
- self.wait_backup(backup, "q")
+ primary.connect().session().sender("q;{create:always}")
+ backup.wait_backup("q")
sender = NumberedSender(primary, url=url, queue="q", failover_updates = False)
receiver = NumberedReceiver(primary, url=url, queue="q", failover_updates = False)
receiver.start()
sender.start()
- self.wait_backup(backup, "q")
+ backup.wait_backup("q")
assert retry(lambda: receiver.received > 10) # Wait for some messages to get thru
primary.kill()
@@ -284,19 +322,276 @@ class ShortTests(BrokerTest):
receiver.stop()
def test_backup_failover(self):
- brokers = [ HaBroker(self, name=name, expect=EXPECT_EXIT_FAIL)
- for name in ["a","b","c"] ]
- url = ",".join([b.host_port() for b in brokers])
- for b in brokers: b.set_broker_url(url)
- brokers[0].promote()
- brokers[0].connect().session().sender(
- "q;{create:always,%s}"%(self.qpid_replicate())).send("a")
- for b in brokers[1:]: self.assert_browse_backup(b, "q", ["a"])
- brokers[0].kill()
- brokers[2].promote() # c must fail over to b.
- brokers[2].connect().session().sender("q").send("b")
- self.assert_browse_backup(brokers[1], "q", ["a","b"])
- for b in brokers[1:]: b.kill()
+ """Verify that a backup broker fails over and recovers queue state"""
+ brokers = HaCluster(self, 3)
+ brokers[0].connect().session().sender("q;{create:always}").send("a")
+ for b in brokers[1:]: b.assert_browse_backup("q", ["a"], msg=b)
+ brokers[0].expect = EXPECT_EXIT_FAIL
+ brokers.kill(0)
+ brokers[1].connect().session().sender("q").send("b")
+ brokers[2].assert_browse_backup("q", ["a","b"])
+ s = brokers[1].connect().session()
+ self.assertEqual("a", s.receiver("q").fetch().content)
+ s.acknowledge()
+ brokers[2].assert_browse_backup("q", ["b"])
+
+ def test_qpid_config_replication(self):
+ """Set up replication via qpid-config"""
+ brokers = HaCluster(self,2)
+ brokers[0].config_declare("q","all")
+ brokers[0].connect().session().sender("q").send("foo")
+ brokers[1].assert_browse_backup("q", ["foo"])
+
+ def test_standalone_queue_replica(self):
+ """Test replication of individual queues outside of cluster mode"""
+ primary = HaBroker(self, name="primary", ha_cluster=False)
+ pc = primary.connect()
+ ps = pc.session().sender("q;{create:always}")
+ pr = pc.session().receiver("q;{create:always}")
+ backup = HaBroker(self, name="backup", ha_cluster=False)
+ br = backup.connect().session().receiver("q;{create:always}")
+
+ # Set up replication with qpid-ha
+ backup.replicate(primary.host_port(), "q")
+ ps.send("a")
+ backup.assert_browse_backup("q", ["a"])
+ ps.send("b")
+ backup.assert_browse_backup("q", ["a", "b"])
+ self.assertEqual("a", pr.fetch().content)
+ pr.session.acknowledge()
+ backup.assert_browse_backup("q", ["b"])
+
+ # Set up replication with qpid-config
+ ps2 = pc.session().sender("q2;{create:always}")
+ backup.config_replicate(primary.host_port(), "q2");
+ ps2.send("x")
+ backup.assert_browse_backup("q2", ["x"])
+
+
+ def test_queue_replica_failover(self):
+ """Test individual queue replication from a cluster to a standalone backup broker, verify it fails over."""
+ cluster = HaCluster(self, 2)
+ primary = cluster[0]
+ pc = cluster.connect(0)
+ ps = pc.session().sender("q;{create:always}")
+ pr = pc.session().receiver("q;{create:always}")
+ backup = HaBroker(self, name="backup", ha_cluster=False)
+ br = backup.connect().session().receiver("q;{create:always}")
+ backup.replicate(cluster.url, "q")
+ ps.send("a")
+ backup.assert_browse_backup("q", ["a"])
+ cluster.bounce(0)
+ backup.assert_browse_backup("q", ["a"])
+ ps.send("b")
+ backup.assert_browse_backup("q", ["a", "b"])
+ cluster.bounce(1)
+ self.assertEqual("a", pr.fetch().content)
+ pr.session.acknowledge()
+ backup.assert_browse_backup("q", ["b"])
+
+ def test_lvq(self):
+ """Verify that we replicate to an LVQ correctly"""
+ primary = HaBroker(self, name="primary")
+ primary.promote()
+ backup = HaBroker(self, name="backup", broker_url=primary.host_port())
+ s = primary.connect().session().sender("lvq; {create:always, node:{x-declare:{arguments:{'qpid.last_value_queue_key':lvq-key}}}}")
+ def send(key,value): s.send(Message(content=value,properties={"lvq-key":key}))
+ for kv in [("a","a-1"),("b","b-1"),("a","a-2"),("a","a-3"),("c","c-1"),("c","c-2")]:
+ send(*kv)
+ backup.assert_browse_backup("lvq", ["b-1", "a-3", "c-2"])
+ send("b","b-2")
+ backup.assert_browse_backup("lvq", ["a-3", "c-2", "b-2"])
+ send("c","c-3")
+ backup.assert_browse_backup("lvq", ["a-3", "b-2", "c-3"])
+ send("d","d-1")
+ backup.assert_browse_backup("lvq", ["a-3", "b-2", "c-3", "d-1"])
+
+ def test_ring(self):
+ """Test replication with the ring queue policy"""
+ primary = HaBroker(self, name="primary")
+ primary.promote()
+ backup = HaBroker(self, name="backup", broker_url=primary.host_port())
+ s = primary.connect().session().sender("q; {create:always, node:{x-declare:{arguments:{'qpid.policy_type':ring, 'qpid.max_count':5}}}}")
+ for i in range(10): s.send(Message(str(i)))
+ backup.assert_browse_backup("q", [str(i) for i in range(5,10)])
+
+ def test_reject(self):
+ """Test replication with the reject queue policy"""
+ primary = HaBroker(self, name="primary")
+ primary.promote()
+ backup = HaBroker(self, name="backup", broker_url=primary.host_port())
+ s = primary.connect().session().sender("q; {create:always, node:{x-declare:{arguments:{'qpid.policy_type':reject, 'qpid.max_count':5}}}}")
+ try:
+ for i in range(10): s.send(Message(str(i)), sync=False)
+ except qpid.messaging.exceptions.TargetCapacityExceeded: pass
+ backup.assert_browse_backup("q", [str(i) for i in range(0,5)])
+
+ def test_priority(self):
+ """Verify priority queues replicate correctly"""
+ primary = HaBroker(self, name="primary")
+ primary.promote()
+ backup = HaBroker(self, name="backup", broker_url=primary.host_port())
+ session = primary.connect().session()
+ s = session.sender("priority-queue; {create:always, node:{x-declare:{arguments:{'qpid.priorities':10}}}}")
+ priorities = [8,9,5,1,2,2,3,4,9,7,8,9,9,2]
+ for p in priorities: s.send(Message(priority=p))
+ # Can't use browse_backup as browser sees messages in delivery order not priority.
+ backup.wait_backup("priority-queue")
+ r = backup.connect_admin().session().receiver("priority-queue")
+ received = [r.fetch().priority for i in priorities]
+ self.assertEqual(sorted(priorities, reverse=True), received)
+
+ def test_priority_fairshare(self):
+ """Verify priority queues replicate correctly"""
+ primary = HaBroker(self, name="primary")
+ primary.promote()
+ backup = HaBroker(self, name="backup", broker_url=primary.host_port())
+ session = primary.connect().session()
+ levels = 8
+ priorities = [4,5,3,7,8,8,2,8,2,8,8,16,6,6,6,6,6,6,8,3,5,8,3,5,5,3,3,8,8,3,7,3,7,7,7,8,8,8,2,3]
+ limits={7:0,6:4,5:3,4:2,3:2,2:2,1:2}
+ limit_policy = ",".join(["'qpid.fairshare':5"] + ["'qpid.fairshare-%s':%s"%(i[0],i[1]) for i in limits.iteritems()])
+ s = session.sender("priority-queue; {create:always, node:{x-declare:{arguments:{'qpid.priorities':%s, %s}}}}"%(levels,limit_policy))
+ messages = [Message(content=str(uuid4()), priority = p) for p in priorities]
+ for m in messages: s.send(m)
+ backup.wait_backup(s.target)
+ r = backup.connect_admin().session().receiver("priority-queue")
+ received = [r.fetch().content for i in priorities]
+ sort = sorted(messages, key=lambda m: priority_level(m.priority, levels), reverse=True)
+ fair = [m.content for m in fairshare(sort, lambda l: limits.get(l,0), levels)]
+ self.assertEqual(received, fair)
+
+ def test_priority_ring(self):
+ primary = HaBroker(self, name="primary")
+ primary.promote()
+ backup = HaBroker(self, name="backup", broker_url=primary.host_port())
+ s = primary.connect().session().sender("q; {create:always, node:{x-declare:{arguments:{'qpid.policy_type':ring, 'qpid.max_count':5, 'qpid.priorities':10}}}}")
+ priorities = [8,9,5,1,2,2,3,4,9,7,8,9,9,2]
+ for p in priorities: s.send(Message(priority=p))
+
+ # FIXME aconway 2012-02-22: there is a bug in priority ring
+ # queues that allows a low priority message to displace a high
+ # one. The following commented-out assert_browse is for the
+ # correct result, the uncommented one is for the actualy buggy
+ # result. See https://issues.apache.org/jira/browse/QPID-3866
+ #
+ # backup.assert_browse_backup("q", sorted(priorities,reverse=True)[0:5], transform=lambda m: m.priority)
+ backup.assert_browse_backup("q", [9,9,9,9,2], transform=lambda m: m.priority)
+
+ def test_backup_acquired(self):
+ """Verify that acquired messages are backed up, for all queue types."""
+ class Test:
+ def __init__(self, queue, arguments, expect):
+ self.queue = queue
+ self.address = "%s;{create:always,node:{x-declare:{arguments:{%s}}}}"%(
+ self.queue, ",".join(arguments + ["'qpid.replicate':all"]))
+ self.expect = [str(i) for i in expect]
+
+ def send(self, connection):
+ """Send messages, then acquire one but don't acknowledge"""
+ s = connection.session()
+ for m in range(10): s.sender(self.address).send(str(m))
+ s.receiver(self.address).fetch()
+
+ def wait(self, brokertest, backup):
+ backup.wait_backup(self.queue)
+
+ def verify(self, brokertest, backup):
+ backup.assert_browse_backup(self.queue, self.expect, msg=self.queue)
+
+ tests = [
+ Test("plain",[],range(10)),
+ Test("ring", ["'qpid.policy_type':ring", "'qpid.max_count':5"], range(5,10)),
+ Test("priority",["'qpid.priorities':10"], range(10)),
+ Test("fairshare", ["'qpid.priorities':10,'qpid.fairshare':5"], range(10)),
+ Test("lvq", ["'qpid.last_value_queue_key':lvq-key"], [9])
+ ]
+
+ primary = HaBroker(self, name="primary")
+ primary.promote()
+ backup1 = HaBroker(self, name="backup1", broker_url=primary.host_port())
+ c = primary.connect()
+ for t in tests: t.send(c) # Send messages, leave one unacknowledged.
+
+ backup2 = HaBroker(self, name="backup2", broker_url=primary.host_port())
+ # Wait for backups to catch up.
+ for t in tests:
+ t.wait(self, backup1)
+ t.wait(self, backup2)
+ # Verify acquired message was replicated
+ for t in tests: t.verify(self, backup1)
+ for t in tests: t.verify(self, backup2)
+
+ def test_replicate_default(self):
+ """Make sure we don't replicate if ha-replicate is unspecified or none"""
+ cluster1 = HaCluster(self, 2, ha_replicate=None)
+ c1 = cluster1[0].connect().session().sender("q;{create:always}")
+ cluster2 = HaCluster(self, 2, ha_replicate="none")
+ cluster2[0].connect().session().sender("q;{create:always}")
+ time.sleep(.1) # Give replication a chance.
+ try:
+ cluster1[1].connect_admin().session().receiver("q")
+ self.fail("Excpected no-such-queue exception")
+ except NotFound: pass
+ try:
+ cluster2[1].connect_admin().session().receiver("q")
+ self.fail("Excpected no-such-queue exception")
+ except NotFound: pass
+
+ def test_invalid_default(self):
+ """Verify that a queue with an invalid qpid.replicate gets default treatment"""
+ cluster = HaCluster(self, 2, ha_replicate="all")
+ c = cluster[0].connect().session().sender("q;{create:always, node:{x-declare:{arguments:{'qpid.replicate':XXinvalidXX}}}}")
+ cluster[1].wait_backup("q")
+
+ def test_exclusive_queue(self):
+ """Ensure that we can back-up exclusive queues, i.e. the replicating
+ subscriptions are exempt from the exclusivity"""
+ cluster = HaCluster(self, 2)
+ def test(addr):
+ c = cluster[0].connect()
+ q = addr.split(";")[0]
+ r = c.session().receiver(addr)
+ try: c.session().receiver(addr); self.fail("Expected exclusive exception")
+ except ReceiverError: pass
+ s = c.session().sender(q).send(q)
+ cluster[1].assert_browse_backup(q, [q])
+ test("excl_sub;{create:always, link:{x-subscribe:{exclusive:True}}}");
+ test("excl_queue;{create:always, node:{x-declare:{exclusive:True}}}")
+
+def fairshare(msgs, limit, levels):
+ """
+ Generator to return prioritised messages in expected order for a given fairshare limit
+ """
+ count = 0
+ last_priority = None
+ postponed = []
+ while msgs or postponed:
+ if not msgs:
+ msgs = postponed
+ count = 0
+ last_priority = None
+ postponed = []
+ msg = msgs.pop(0)
+ if last_priority and priority_level(msg.priority, levels) == last_priority:
+ count += 1
+ else:
+ last_priority = priority_level(msg.priority, levels)
+ count = 1
+ l = limit(last_priority)
+ if (l and count > l):
+ postponed.append(msg)
+ else:
+ yield msg
+ return
+
+def priority_level(value, levels):
+ """
+ Method to determine which of a distinct number of priority levels
+ a given value falls into.
+ """
+ offset = 5-math.ceil(levels/2.0)
+ return min(max(value - offset, 0), levels-1)
class LongTests(BrokerTest):
"""Tests that can run for a long time if -DDURATION=<minutes> is set"""
@@ -311,7 +606,7 @@ class LongTests(BrokerTest):
"""Test failover with continuous send-receive"""
# FIXME aconway 2012-02-03: fails due to dropped messages,
# known issue: sending messages to new primary before
- # backups are ready.
+ # backups are ready. Enable when fixed.
# Start a cluster, all members will be killed during the test.
brokers = [ HaBroker(self, name=name, expect=EXPECT_EXIT_FAIL)
@@ -352,4 +647,10 @@ class LongTests(BrokerTest):
if __name__ == "__main__":
shutil.rmtree("brokertest.tmp", True)
- os.execvp("qpid-python-test", ["qpid-python-test", "-m", "ha_tests"] + sys.argv[1:])
+ qpid_ha = os.getenv("QPID_HA_EXEC")
+ if qpid_ha and os.path.exists(qpid_ha):
+ os.execvp("qpid-python-test",
+ ["qpid-python-test", "-m", "ha_tests"] + sys.argv[1:])
+ else:
+ print "Skipping ha_tests, qpid_ha not available"
+
diff --git a/cpp/src/tests/install_env.sh.in b/cpp/src/tests/install_env.sh.in
index 2231954cb8..d29a23930d 100644
--- a/cpp/src/tests/install_env.sh.in
+++ b/cpp/src/tests/install_env.sh.in
@@ -23,4 +23,4 @@ prefix=`absdir @prefix@`
export QPID_INSTALL_PREFIX=$prefix
export PATH=$prefix/bin:$prefix/sbin:$prefix/libexec/qpid/tests:$PATH
export LD_LIBRARY_PATH=$prefix/lib:$LD_LIBRARY_PATH
-export PYTHONPATH=$prefix/lib/python2.4/site-packages:$PYTHONPATH
+export PYTHONPATH=$prefix/lib/python2.6/site-packages:$PYTHONPATH
diff --git a/cpp/src/tests/ipv6_test b/cpp/src/tests/ipv6_test
index d75d50fd0a..6becfd8c96 100755
--- a/cpp/src/tests/ipv6_test
+++ b/cpp/src/tests/ipv6_test
@@ -93,10 +93,10 @@ else
BROKER1="[::1]:${PORTS[1]}"
TEST_QUEUE=ipv6-fed-test
- $QPID_CONFIG_EXEC -a $BROKER0 add queue $TEST_QUEUE
- $QPID_CONFIG_EXEC -a $BROKER1 add queue $TEST_QUEUE
+ $QPID_CONFIG_EXEC -b $BROKER0 add queue $TEST_QUEUE
+ $QPID_CONFIG_EXEC -b $BROKER1 add queue $TEST_QUEUE
$QPID_ROUTE_EXEC dynamic add $BROKER1 $BROKER0 amq.direct
- $QPID_CONFIG_EXEC -a $BROKER1 bind amq.direct $TEST_QUEUE $TEST_QUEUE
+ $QPID_CONFIG_EXEC -b $BROKER1 bind amq.direct $TEST_QUEUE $TEST_QUEUE
$QPID_ROUTE_EXEC route map $BROKER1
./datagen --count 100 | tee rdata-in |
@@ -113,7 +113,8 @@ fi
test -z $CLUSTER_LIB && exit 0 # Exit if cluster not supported.
## Test failover in a cluster using IPv6 only
-. $srcdir/ais_check # Will exit if clustering not enabled.
+. cpg_check.sh
+cpg_enabled || exit 0
pick_port() {
# We need a fixed port to set --cluster-url. Use qpidd to pick a free port.
diff --git a/cpp/src/tests/logging.cpp b/cpp/src/tests/logging.cpp
index fc55d642c3..5d5bb1feef 100644
--- a/cpp/src/tests/logging.cpp
+++ b/cpp/src/tests/logging.cpp
@@ -29,6 +29,7 @@
#endif
#include <boost/test/floating_point_comparison.hpp>
+#include <boost/algorithm/string/predicate.hpp>
#include <boost/format.hpp>
#include "unit_test.h"
@@ -43,8 +44,10 @@ namespace tests {
QPID_AUTO_TEST_SUITE(loggingTestSuite)
using namespace std;
-using namespace boost;
using namespace qpid::log;
+using boost::ends_with;
+using boost::contains;
+using boost::format;
QPID_AUTO_TEST_CASE(testStatementInit) {
Statement s=QPID_LOG_STATEMENT_INIT(debug); int line=__LINE__;
@@ -176,7 +179,9 @@ QPID_AUTO_TEST_CASE(testLoggerFormat) {
l.format(Logger::FUNCTION);
QPID_LOG(critical, "foo");
- BOOST_CHECK_EQUAL(string(BOOST_CURRENT_FUNCTION) + ": foo\n", out->last());
+ BOOST_CHECK( ends_with( out->last(), ": foo\n"));
+ string name = out->last().substr(0, out->last().length() - 6);
+ BOOST_CHECK( contains( string(BOOST_CURRENT_FUNCTION), name));
l.format(Logger::LEVEL);
QPID_LOG(critical, "foo");
diff --git a/cpp/src/tests/python_tests.ps1 b/cpp/src/tests/python_tests.ps1
index 9f8b9890c4..f7caa8f75a 100644
--- a/cpp/src/tests/python_tests.ps1
+++ b/cpp/src/tests/python_tests.ps1
@@ -26,8 +26,7 @@ if (!(Test-Path $PYTHON_DIR -pathType Container)) {
exit 1
}
-$PYTHON_TEST_DIR = "$srcdir\..\..\..\tests\src\py"
-$QMF_LIB = "$srcdir\..\..\..\extras\qmf\src\py"
+. .\test_env.ps1
if (Test-Path env:FAILING) {
$fails = "-I $env:FAILING"
@@ -39,7 +38,5 @@ else {
$tests = "$args"
}
-#cd $PYTHON_DIR
-$env:PYTHONPATH="$PYTHON_DIR;$PYTHON_TEST_DIR;$env:PYTHONPATH;$QMF_LIB"
python $PYTHON_DIR/qpid-python-test -m qpid_tests.broker_0_10 -m qpid.tests -b localhost:$env:QPID_PORT $fails $tests
exit $LASTEXITCODE
diff --git a/cpp/src/tests/qpid-cluster-benchmark b/cpp/src/tests/qpid-cluster-benchmark
index d836ed709c..610beacebd 100755
--- a/cpp/src/tests/qpid-cluster-benchmark
+++ b/cpp/src/tests/qpid-cluster-benchmark
@@ -22,38 +22,45 @@
# Default options
MESSAGES="-m 10000"
-FLOW="--flow-control 100" # Flow control limit on queue depth for latency.
REPEAT="--repeat 10"
QUEUES="-q 6"
SENDERS="-s 3"
RECEIVERS="-r 3"
BROKERS= # Local broker
CLIENT_HOSTS= # No ssh, all clients are local
+# Connection options
+TCP_NODELAY=false
+RECONNECT=true
+HEARTBEAT=1
-while getopts "m:f:n:b:q:s:r:c:txyv-" opt; do
+while getopts "m:f:n:b:q:s:r:c:h:i:txyv-" opt; do
case $opt in
+ b) BROKERS="-b $OPTARG";;
+ c) CLIENT_HOSTS="-c $OPTARG";;
+ h) HEARTBEAT=$OPTARG;;
+ i) RECONNECT=$OPTARG;;
m) MESSAGES="-m $OPTARG";;
- f) FLOW="--flow-control $OPTARG";;
n) REPEAT="--repeat $OPTARG";;
- b) BROKERS="-b $OPTARG";;
q) QUEUES="-q $OPTARG";;
- s) SENDERS="-s $OPTARG";;
r) RECEIVERS="-r $OPTARG";;
- c) CLIENT_HOSTS="-c $OPTARG";;
- t) TCP_NODELAY="--connection-options {tcp-nodelay:true}";;
+ s) SENDERS="-s $OPTARG";;
+ t) TCP_NODELAY=true;;
+ v) OPTS="--verbose";;
x) SAVE_RECEIVED="--save-received";;
y) NO_DELETE="--no-delete";;
- v) OPTS="--verbose";;
-) break ;;
*) echo "Unknown option"; exit 1;;
esac
done
shift $(($OPTIND-1))
-REPLICATE="node:{x-declare:{arguments:{'qpid.replicate':all}}}"
+CONNECTION_OPTIONS="--connection-options {tcp-nodelay:$TCP_NODELAY,reconnect:$RECONNECT,heartbeat:$HEARTBEAT}"
+CREATE_OPTIONS="node:{x-declare:{arguments:{'qpid.replicate':all}}}"
+
BROKER=$(echo $BROKERS | sed s/,.*//)
run_test() { echo $*; shift; "$@"; echo; echo; echo; }
-OPTS="$OPTS $REPEAT $BROKERS --summarize $QUEUES $SENDERS $RECEIVERS $MESSAGES $CLIENT_HOSTS $SAVE_RECEIVED $TCP_NODELAY $NO_DELETE"
-OPTS="$OPTS --create-option $REPLICATE"
+OPTS="$OPTS $REPEAT $BROKERS --summarize $QUEUES $SENDERS $RECEIVERS $MESSAGES $CLIENT_HOSTS $SAVE_RECEIVED $CONNECTION_OPTIONS $NO_DELETE"
+OPTS="$OPTS --create-option $CREATE_OPTIONS"
+
run_test "Benchmark:" qpid-cpp-benchmark $OPTS "$@"
diff --git a/cpp/src/tests/qpid-cpp-benchmark b/cpp/src/tests/qpid-cpp-benchmark
index 19c01dd08a..d5ad5191ca 100755
--- a/cpp/src/tests/qpid-cpp-benchmark
+++ b/cpp/src/tests/qpid-cpp-benchmark
@@ -37,7 +37,7 @@ op.add_option("-r", "--receivers", default=1, type="int", metavar="N",
op.add_option("-m", "--messages", default=100000, type="int", metavar="N",
help="send N messages per sender (default %default)")
op.add_option("--queue-name", default="benchmark", metavar="NAME",
- help="base name for queues (default %default)")
+ help="base name for queues (default %default)")
op.add_option("--send-rate", default=0, metavar="N",
help="send rate limited to N messages/second, 0 means no limit (default %default)")
op.add_option("--receive-rate", default=0, metavar="N",
@@ -67,18 +67,16 @@ op.add_option("--sequence", dest="sequence", default=False,
action="store_true", help="add a sequence number to each message")
op.add_option("--connection-options", type="str",
help="Connection options for senders & receivers")
-op.add_option("--flow-control", default=0, type="int", metavar="N",
- help="Flow control each sender to limit queue depth to 2*N. 0 means no flow control.")
op.add_option("--durable", default=False, action="store_true",
help="Use durable queues and messages")
op.add_option("--save-received", default=False, action="store_true",
help="Save received message content to files <queuename>-receiver-<n>.msg")
-op.add_option("--group-receivers", default=False, action="store_true",
- help="Run receivers for the same queue on the same host.")
op.add_option("--verbose", default=False, action="store_true",
help="Show commands executed")
op.add_option("--no-delete", default=False, action="store_true",
help="Don't delete the test queues.")
+op.add_option("--fill-drain", default=False, action="store_true",
+ help="First fill the queues, then drain them")
single_quote_re = re.compile("'")
def posix_quote(string):
@@ -150,7 +148,6 @@ def start_send(queue, opts, broker, host):
"--report-header=no",
"--timestamp=%s"%(opts.timestamp and "yes" or "no"),
"--sequence=%s"%(opts.sequence and "yes" or "no"),
- "--flow-control", str(opts.flow_control),
"--durable", str(opts.durable)
]
command += opts.send_arg
@@ -169,18 +166,6 @@ def first_line(p):
raise Exception("Process exit %d: %s"%(p.returncode, error_msg(out,err)))
return out.split("\n")[0]
-def queue_exists(queue,broker):
- c = qpid.messaging.Connection(broker)
- c.open()
- try:
- s = c.session()
- try:
- s.sender(queue)
- return True
- except qpid.messaging.exceptions.NotFound:
- return False
- finally: c.close()
-
def recreate_queues(queues, brokers, no_delete, opts):
c = qpid.messaging.Connection(brokers[0])
c.open()
@@ -189,15 +174,9 @@ def recreate_queues(queues, brokers, no_delete, opts):
if not no_delete:
try: s.sender("%s;{delete:always}"%(q)).close()
except qpid.messaging.exceptions.NotFound: pass
- # FIXME aconway 2011-05-04: new cluster async wiring, wait for changes to propagate
- for b in brokers:
- while queue_exists(q,b): time.sleep(0.1);
address = "%s;{%s}"%(q, ",".join(opts.create_option + ["create:always"]))
if opts.verbose: print "Creating", address
s.sender(address)
- # FIXME aconway 2011-05-04: new cluster async wiring, wait for changes to propagate
- for b in brokers:
- while not queue_exists(q,b): time.sleep(0.1);
c.close()
def print_header(timestamp):
@@ -295,24 +274,32 @@ def main():
recreate_queues(queues, opts.broker, opts.no_delete, opts)
ready_receiver = ReadyReceiver(ready_queue, opts.broker[0])
- if opts.group_receivers: # Run receivers for same queue against same broker.
- receivers = []
- for q in queues:
- b = brokers.next()
- for j in xrange(opts.receivers):
- receivers.append(
- start_receive(q, j, opts, ready_queue, b, client_hosts.next()))
- else: # Don't group receivers
- receivers = [start_receive(q, j, opts, ready_queue,
- brokers.next(), client_hosts.next())
- for q in queues for j in xrange(opts.receivers)]
-
- ready_receiver.wait(filter(None, receivers)) # Wait for receivers to be ready.
- start = time.time()
- senders = [start_send(q, opts,brokers.next(), client_hosts.next())
- for q in queues for j in xrange(opts.senders)]
+ def start_receivers():
+ return [ start_receive(q, j, opts, ready_queue, brokers.next(), client_hosts.next())
+ for q in queues for j in xrange(opts.receivers) ]
+
+
+ def start_senders():
+ return [ start_send(q, opts,brokers.next(), client_hosts.next())
+ for q in queues for j in xrange(opts.senders) ]
+
if opts.report_header and i == 0: print_header(opts.timestamp)
- for p in senders + receivers: p.wait()
+
+ if opts.fill_drain:
+ # First fill the queues, then drain them
+ start = time.time()
+ senders = start_senders()
+ for p in senders: p.wait()
+ receivers = start_receivers()
+ for p in receivers: p.wait()
+ else:
+ # Run senders and receivers in parallel
+ receivers = start_receivers()
+ ready_receiver.wait(filter(None, receivers)) # Wait for receivers ready
+ start = time.time()
+ senders = start_senders()
+ for p in senders + receivers: p.wait()
+
total_sent = opts.queues * opts.senders * opts.messages
total_tp = total_sent / (time.time()-start)
send_stats=parse_senders(senders)
diff --git a/cpp/src/tests/qpid-perftest.cpp b/cpp/src/tests/qpid-perftest.cpp
index 664f0cf877..c28bdfe5f8 100644
--- a/cpp/src/tests/qpid-perftest.cpp
+++ b/cpp/src/tests/qpid-perftest.cpp
@@ -85,6 +85,7 @@ struct Opts : public TestOptions {
size_t pubs;
size_t count ;
size_t size;
+ size_t headers;
bool confirm;
bool durable;
bool uniqueData;
@@ -112,7 +113,7 @@ struct Opts : public TestOptions {
Opts() :
TestOptions(helpText),
setup(false), control(false), publish(false), subscribe(false), baseName("qpid-perftest"),
- pubs(1), count(500000), size(1024), confirm(true), durable(false), uniqueData(false), syncPub(false),
+ pubs(1), count(500000), size(1024), headers(0), confirm(true), durable(false), uniqueData(false), syncPub(false),
subs(1), ack(0),
qt(1),singleConnect(false), iterations(1), mode(SHARED), summary(false),
intervalSub(0), intervalPub(0), tx(0), txPub(0), txSub(0), commitAsync(false)
@@ -131,6 +132,7 @@ struct Opts : public TestOptions {
("npubs", optValue(pubs, "N"), "Create N publishers.")
("count", optValue(count, "N"), "Each publisher sends N messages.")
("size", optValue(size, "BYTES"), "Size of messages in bytes.")
+ ("headers", optValue(headers, "N"), "Number of headers to add to each message.")
("pub-confirm", optValue(confirm, "yes|no"), "Publisher use confirm-mode.")
("durable", optValue(durable, "yes|no"), "Publish messages as durable.")
("unique-data", optValue(uniqueData, "yes|no"), "Make data for each message unique.")
@@ -503,7 +505,13 @@ struct PublishThread : public Client {
Message msg(data, routingKey);
if (opts.durable)
msg.getDeliveryProperties().setDeliveryMode(framing::PERSISTENT);
-
+ if (opts.headers) {
+ for (size_t i = 0; i < opts.headers; ++i) {
+ std::stringstream h;
+ h << "hdr" << i;
+ msg.getMessageProperties().getApplicationHeaders().setString(h.str(), h.str());
+ }
+ }
if (opts.txPub){
session.txSelect();
diff --git a/cpp/src/tests/qpid-ping.cpp b/cpp/src/tests/qpid-ping.cpp
index 0cb4afa0ee..52331499e7 100644
--- a/cpp/src/tests/qpid-ping.cpp
+++ b/cpp/src/tests/qpid-ping.cpp
@@ -32,11 +32,20 @@
#include <string>
#include <iostream>
-using namespace std;
-using namespace qpid::sys;
-using namespace qpid::framing;
-using namespace qpid::client;
-using namespace qpid;
+using std::cerr;
+using std::cout;
+using std::endl;
+using std::exception;
+using std::string;
+using namespace qpid::client::arg; // For keyword args
+using qpid::client::AsyncSession;
+using qpid::client::Connection;
+using qpid::client::Message;
+using qpid::client::SubscriptionManager;
+using qpid::framing::Uuid;
+
+namespace qpid {
+namespace tests {
struct PingOptions : public qpid::TestOptions {
int timeout; // Timeout in seconds.
@@ -48,9 +57,11 @@ struct PingOptions : public qpid::TestOptions {
}
};
+}} // namespace qpid::tests
+
int main(int argc, char** argv) {
try {
- PingOptions opts;
+ qpid::tests::PingOptions opts;
opts.parse(argc, argv);
opts.con.heartbeat = (opts.timeout+1)/2;
Connection connection;
@@ -58,8 +69,8 @@ int main(int argc, char** argv) {
if (!opts.quiet) cout << "Opened connection." << endl;
AsyncSession s = connection.newSession();
string qname(Uuid(true).str());
- s.queueDeclare(arg::queue=qname,arg::autoDelete=true,arg::exclusive=true);
- s.messageTransfer(arg::content=Message("hello", qname));
+ s.queueDeclare(queue=qname, autoDelete=true, exclusive=true);
+ s.messageTransfer(content=Message("hello", qname));
if (!opts.quiet) cout << "Sent message." << endl;
SubscriptionManager subs(s);
subs.get(qname);
diff --git a/cpp/src/tests/qpid-send.cpp b/cpp/src/tests/qpid-send.cpp
index b1213a484f..b1c4f2be38 100644
--- a/cpp/src/tests/qpid-send.cpp
+++ b/cpp/src/tests/qpid-send.cpp
@@ -36,15 +36,26 @@
#include <iostream>
#include <memory>
-using namespace std;
-using namespace qpid::messaging;
-using namespace qpid::types;
-
-typedef std::vector<std::string> string_vector;
+using std::string;
+using std::ios_base;
+
+using qpid::messaging::Address;
+using qpid::messaging::Connection;
+using qpid::messaging::Duration;
+using qpid::messaging::FailoverUpdates;
+using qpid::messaging::Message;
+using qpid::messaging::Receiver;
+using qpid::messaging::Session;
+using qpid::messaging::Sender;
+using qpid::types::Exception;
+using qpid::types::Uuid;
+using qpid::types::Variant;
namespace qpid {
namespace tests {
+typedef std::vector<std::string> string_vector;
+
struct Options : public qpid::Options
{
bool help;
@@ -74,7 +85,6 @@ struct Options : public qpid::Options
uint reportEvery;
bool reportHeader;
uint sendRate;
- uint flowControl;
bool sequence;
bool timestamp;
std::string groupKey;
@@ -104,7 +114,6 @@ struct Options : public qpid::Options
reportEvery(0),
reportHeader(true),
sendRate(0),
- flowControl(0),
sequence(true),
timestamp(true),
groupPrefix("GROUP-"),
@@ -138,7 +147,6 @@ struct Options : public qpid::Options
("report-every", qpid::optValue(reportEvery,"N"), "Report throughput statistics every N messages")
("report-header", qpid::optValue(reportHeader, "yes|no"), "Headers on report.")
("send-rate", qpid::optValue(sendRate,"N"), "Send at rate of N messages/second. 0 means send as fast as possible.")
- ("flow-control", qpid::optValue(flowControl,"N"), "Do end to end flow control to limit queue depth to 2*N. 0 means no flow control.")
("sequence", qpid::optValue(sequence, "yes|no"), "Add a sequence number messages property (required for duplicate/lost message detection)")
("timestamp", qpid::optValue(timestamp, "yes|no"), "Add a time stamp messages property (required for latency measurement)")
("group-key", qpid::optValue(groupKey, "KEY"), "Generate groups of messages using message header 'KEY' to hold the group identifier")
@@ -223,10 +231,6 @@ const string EOS("eos");
const string SN("sn");
const string TS("ts");
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
class ContentGenerator {
public:
virtual ~ContentGenerator() {}
@@ -329,6 +333,20 @@ public:
}
};
+}} // namespace qpid::tests
+
+using qpid::tests::Options;
+using qpid::tests::Reporter;
+using qpid::tests::Throughput;
+using qpid::tests::ContentGenerator;
+using qpid::tests::GroupGenerator;
+using qpid::tests::GetlineContentGenerator;
+using qpid::tests::MapContentGenerator;
+using qpid::tests::FixedContentGenerator;
+using qpid::tests::SN;
+using qpid::tests::TS;
+using qpid::tests::EOS;
+
int main(int argc, char ** argv)
{
Connection connection;
@@ -350,8 +368,6 @@ int main(int argc, char ** argv)
msg.setPriority(opts.priority);
}
if (!opts.replyto.empty()) {
- if (opts.flowControl)
- throw Exception("Can't use reply-to and flow-control together");
msg.setReplyTo(Address(opts.replyto));
}
if (!opts.userid.empty()) msg.setUserId(opts.userid);
@@ -385,26 +401,10 @@ int main(int argc, char ** argv)
int64_t interval = 0;
if (opts.sendRate) interval = qpid::sys::TIME_SEC/opts.sendRate;
- Receiver flowControlReceiver;
- Address flowControlAddress("flow-"+Uuid(true).str()+";{create:always,delete:always}");
- uint flowSent = 0;
- if (opts.flowControl) {
- flowControlReceiver = session.createReceiver(flowControlAddress);
- flowControlReceiver.setCapacity(2);
- }
-
while (contentGen->setContent(msg)) {
++sent;
if (opts.sequence)
msg.getProperties()[SN] = sent;
- if (opts.flowControl) {
- if ((sent % opts.flowControl) == 0) {
- msg.setReplyTo(flowControlAddress);
- ++flowSent;
- }
- else
- msg.setReplyTo(Address()); // Clear the reply address.
- }
if (groupGen.get())
groupGen->setGroupInfo(msg);
@@ -423,19 +423,12 @@ int main(int argc, char ** argv)
}
if (opts.messages && sent >= opts.messages) break;
- if (opts.flowControl && flowSent == 2) {
- flowControlReceiver.get(Duration::SECOND);
- --flowSent;
- }
-
if (opts.sendRate) {
qpid::sys::AbsTime waitTill(start, sent*interval);
int64_t delay = qpid::sys::Duration(qpid::sys::now(), waitTill);
if (delay > 0) qpid::sys::usleep(delay/qpid::sys::TIME_USEC);
}
}
- for ( ; flowSent>0; --flowSent)
- flowControlReceiver.get(Duration::SECOND);
if (opts.reportTotal) reporter.report();
for (uint i = opts.sendEos; i > 0; --i) {
if (opts.sequence)
diff --git a/cpp/src/tests/qpid-txtest.cpp b/cpp/src/tests/qpid-txtest.cpp
index d0ba2f1245..6e7d46802c 100644
--- a/cpp/src/tests/qpid-txtest.cpp
+++ b/cpp/src/tests/qpid-txtest.cpp
@@ -33,6 +33,7 @@
#include "qpid/client/SubscriptionManager.h"
#include "qpid/framing/Array.h"
#include "qpid/framing/Buffer.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/framing/Uuid.h"
#include "qpid/sys/Thread.h"
@@ -245,10 +246,10 @@ struct Controller : public Client
// Recover DTX transactions (if any)
if (opts.dtx) {
- std::vector<std::string> inDoubtXids;
framing::DtxRecoverResult dtxRes = session.dtxRecover().get();
const framing::Array& xidArr = dtxRes.getInDoubt();
- xidArr.collect(inDoubtXids);
+ std::vector<std::string> inDoubtXids(xidArr.size());
+ std::transform(xidArr.begin(), xidArr.end(), inDoubtXids.begin(), framing::Array::get<std::string, framing::Array::ValuePtr>);
if (inDoubtXids.size()) {
if (!opts.quiet) std::cout << "Recovering DTX in-doubt transaction(s):" << std::endl;
diff --git a/cpp/src/tests/qpidd-empty.conf b/cpp/src/tests/qpidd-empty.conf
new file mode 100644
index 0000000000..bbf52bf446
--- /dev/null
+++ b/cpp/src/tests/qpidd-empty.conf
@@ -0,0 +1,3 @@
+# An empty configuration file.
+# Used when running tests to avoid picking up configuration
+# installed in the default place.
diff --git a/cpp/src/tests/queue_flow_limit_tests.py b/cpp/src/tests/queue_flow_limit_tests.py
index dec7cfb3af..d51b26a821 100644
--- a/cpp/src/tests/queue_flow_limit_tests.py
+++ b/cpp/src/tests/queue_flow_limit_tests.py
@@ -117,7 +117,7 @@ class QueueFlowLimitTests(TestBase010):
tool = environ.get("QPID_CONFIG_EXEC")
if tool:
command = tool + \
- " --broker-addr=%s:%s " % (self.broker.host, self.broker.port) \
+ " --broker=%s:%s " % (self.broker.host, self.broker.port) \
+ "add queue test01 --flow-stop-count=999" \
+ " --flow-resume-count=55 --flow-stop-size=5000000" \
+ " --flow-resume-size=100000"
diff --git a/cpp/src/tests/reliable_replication_test b/cpp/src/tests/reliable_replication_test
index 1f1dac5f2d..c660f751e5 100755
--- a/cpp/src/tests/reliable_replication_test
+++ b/cpp/src/tests/reliable_replication_test
@@ -47,12 +47,12 @@ setup() {
echo "Testing replication from port $BROKER_A to port $BROKER_B"
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add exchange replication replication
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_B" add exchange replication replication
$PYTHON_COMMANDS/qpid-route --ack 500 queue add "localhost:$BROKER_B" "localhost:$BROKER_A" replication replication
#create test queue (only replicate enqueues for this test):
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-a --generate-queue-events 1
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-a
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_A" add queue queue-a --generate-queue-events 1
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_B" add queue queue-a
}
send() {
diff --git a/cpp/src/tests/replication_test b/cpp/src/tests/replication_test
index 8c37568875..f8b2136396 100755
--- a/cpp/src/tests/replication_test
+++ b/cpp/src/tests/replication_test
@@ -46,21 +46,21 @@ if test -d ${PYTHON_DIR} && test -f "$REPLICATING_LISTENER_LIB" && test -f "$REP
BROKER_B=`cat qpidd.port`
echo "Running replication test between localhost:$BROKER_A and localhost:$BROKER_B"
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add exchange replication replication
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_B" add exchange replication replication
$PYTHON_COMMANDS/qpid-route --ack 5 queue add "localhost:$BROKER_B" "localhost:$BROKER_A" replication replication
#create test queues
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-a --generate-queue-events 2
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-b --generate-queue-events 2
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-c --generate-queue-events 1
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-d --generate-queue-events 2
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-e --generate-queue-events 1
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_A" add queue queue-a --generate-queue-events 2
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_A" add queue queue-b --generate-queue-events 2
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_A" add queue queue-c --generate-queue-events 1
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_A" add queue queue-d --generate-queue-events 2
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_A" add queue queue-e --generate-queue-events 1
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-a
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-b
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-c
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-e
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_B" add queue queue-a
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_B" add queue queue-b
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_B" add queue queue-c
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_B" add queue queue-e
#queue-d deliberately not declared on DR; this error case should be handled
#publish and consume from test queues on broker A:
@@ -124,13 +124,13 @@ if test -d ${PYTHON_DIR} && test -f "$REPLICATING_LISTENER_LIB" && test -f "$REP
$QPIDD_EXEC --daemon --port 0 --no-data-dir --no-module-dir --auth no --load-module $REPLICATION_EXCHANGE_LIB --log-enable info+ --log-to-file replication-dest.log --log-to-stderr 0 > qpidd.port
BROKER_B=`cat qpidd.port`
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add exchange replication replication
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_B" add exchange replication replication
$PYTHON_COMMANDS/qpid-route --ack 5 queue add "localhost:$BROKER_B" "localhost:$BROKER_A" replication replication
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-e --generate-queue-events 2
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-e
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-d --generate-queue-events 1
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-d
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_A" add queue queue-e --generate-queue-events 2
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_B" add queue queue-e
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_A" add queue queue-d --generate-queue-events 1
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_B" add queue queue-d
i=1
while [ $i -le 10 ]; do
@@ -152,8 +152,8 @@ if test -d ${PYTHON_DIR} && test -f "$REPLICATING_LISTENER_LIB" && test -f "$REP
$QPIDD_EXEC --daemon --port 0 --no-data-dir --no-module-dir --auth no --load-module $REPLICATION_EXCHANGE_LIB --log-enable info+ --log-to-file replication-dest.log --log-to-stderr 0 > qpidd.port
BROKER_B=`cat qpidd.port`
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-e
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add exchange replication replication
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_B" add queue queue-e
+ $PYTHON_COMMANDS/qpid-config -b "localhost:$BROKER_B" add exchange replication replication
$PYTHON_COMMANDS/qpid-route --ack 5 queue add "localhost:$BROKER_B" "localhost:$BROKER_A" replication replication
# now send another 15
i=11
diff --git a/cpp/src/tests/ring_queue_test b/cpp/src/tests/ring_queue_test
index 553746eb49..271b46183e 100755
--- a/cpp/src/tests/ring_queue_test
+++ b/cpp/src/tests/ring_queue_test
@@ -28,7 +28,7 @@ MESSAGES=10000
SENDERS=1
RECEIVERS=1
CONCURRENT=0
-BROKER_URL="-a ${QPID_BROKER:-localhost}:${QPID_PORT:-5672}"
+BROKER_URL="-b ${QPID_BROKER:-localhost}:${QPID_PORT:-5672}"
setup() {
if [[ $DURABLE -gt 0 ]]; then
diff --git a/cpp/src/tests/run_acl_tests b/cpp/src/tests/run_acl_tests
index 41f41e20e1..3a8c03eda6 100755
--- a/cpp/src/tests/run_acl_tests
+++ b/cpp/src/tests/run_acl_tests
@@ -22,23 +22,31 @@
# Run the acl tests. $srcdir is set by the Makefile.
source ./test_env.sh
DATA_DIR=`pwd`/data_dir
+DATA_DIRI=`pwd`/data_diri
+DATA_DIRU=`pwd`/data_diru
trap stop_brokers INT TERM QUIT
start_brokers() {
- ../qpidd --daemon --port 0 --no-module-dir --data-dir $DATA_DIR --load-module $ACL_LIB --acl-file policy.acl --auth no > qpidd.port
+ ../qpidd --daemon --port 0 --no-module-dir --data-dir $DATA_DIR --load-module $ACL_LIB --acl-file policy.acl --auth no --log-to-file local.log > qpidd.port
LOCAL_PORT=`cat qpidd.port`
+ ../qpidd --daemon --port 0 --no-module-dir --data-dir $DATA_DIRI --load-module $ACL_LIB --acl-file policy.acl --auth no --acl-max-connect-per-ip 2 --log-to-file locali.log > qpiddi.port
+ LOCAL_PORTI=`cat qpiddi.port`
+ ../qpidd --daemon --port 0 --no-module-dir --data-dir $DATA_DIRU --load-module $ACL_LIB --acl-file policy.acl --auth no --acl-max-connect-per-user 2 --log-to-file localu.log > qpiddu.port
+ LOCAL_PORTU=`cat qpiddu.port`
}
stop_brokers() {
$QPIDD_EXEC --no-module-dir -q --port $LOCAL_PORT
+ $QPIDD_EXEC --no-module-dir -q --port $LOCAL_PORTI
+ $QPIDD_EXEC --no-module-dir -q --port $LOCAL_PORTU
}
test_loading_acl_from_absolute_path(){
POLICY_FILE=$srcdir/policy.acl
rm -f temp.log
PORT=`../qpidd --daemon --port 0 --no-module-dir --no-data-dir --auth no --load-module $ACL_LIB --acl-file $POLICY_FILE -t --log-to-file temp.log 2>/dev/null`
- ACL_FILE=`grep "notice Read ACL file" temp.log | sed 's/^.*Read ACL file //'`
+ ACL_FILE=`grep "notice ACL: Read file" temp.log | sed 's/^.*Read file //'`
$QPIDD_EXEC --no-module-dir -q --port $PORT
if test "$ACL_FILE" != "\"$POLICY_FILE\""; then
echo "unable to load policy file from an absolute path";
@@ -49,14 +57,22 @@ test_loading_acl_from_absolute_path(){
if test -d ${PYTHON_DIR} ; then
rm -rf $DATA_DIR
+ rm -rf $DATA_DIRI
+ rm -rf $DATA_DIRU
mkdir -p $DATA_DIR
+ mkdir -p $DATA_DIRI
+ mkdir -p $DATA_DIRU
cp $srcdir/policy.acl $DATA_DIR
+ cp $srcdir/policy.acl $DATA_DIRI
+ cp $srcdir/policy.acl $DATA_DIRU
start_brokers
- echo "Running acl tests using brokers on ports $LOCAL_PORT"
- $QPID_PYTHON_TEST -b localhost:$LOCAL_PORT -m acl || EXITCODE=1
+ echo "Running acl tests using brokers on ports $LOCAL_PORT, $LOCAL_PORTI, and $LOCAL_PORTU"
+ $QPID_PYTHON_TEST -b localhost:$LOCAL_PORT -m acl -Dport-i=$LOCAL_PORTI -Dport-u=$LOCAL_PORTU || EXITCODE=1
stop_brokers || EXITCODE=1
test_loading_acl_from_absolute_path || EXITCODE=1
rm -rf $DATA_DIR
+ rm -rf $DATA_DIRI
+ rm -rf $DATA_DIRU
exit $EXITCODE
fi
diff --git a/cpp/src/tests/run_acl_tests.ps1 b/cpp/src/tests/run_acl_tests.ps1
index 46e070477f..8279d87e54 100644
--- a/cpp/src/tests/run_acl_tests.ps1
+++ b/cpp/src/tests/run_acl_tests.ps1
@@ -20,15 +20,12 @@
# Run the acl tests.
$srcdir = Split-Path $myInvocation.InvocationName
-$PYTHON_DIR = "$srcdir\..\..\..\python"
+. .\test_env.ps1
if (!(Test-Path $PYTHON_DIR -pathType Container)) {
"Skipping acl tests as python libs not found"
exit 1
}
-$PYTHON_TEST_DIR = "$srcdir\..\..\..\tests\src\py"
-$QMF_LIB = "$srcdir\..\..\..\extras\qmf\src\py"
-$env:PYTHONPATH="$PYTHON_DIR;$srcdir;$PYTHON_TEST_DIR;$QMF_LIB"
$Global:BROKER_EXE = ""
Function start_broker($acl_options)
diff --git a/cpp/src/tests/run_cli_tests b/cpp/src/tests/run_cli_tests
index ec5c71b646..ea44437c0d 100755
--- a/cpp/src/tests/run_cli_tests
+++ b/cpp/src/tests/run_cli_tests
@@ -56,9 +56,9 @@ start_brokers() {
targs="--ignore=*xml*"
fi
- ../qpidd --daemon --port 0 --no-data-dir --no-module-dir --auth no $xargs > qpidd.port
+ ../qpidd --daemon --port 0 --no-data-dir --no-module-dir --mgmt-publish no --auth no $xargs > qpidd.port
LOCAL_PORT=`cat qpidd.port`
- ../qpidd --daemon --port 0 --no-data-dir --no-module-dir --auth no $xargs > qpidd.port
+ ../qpidd --daemon --port 0 --no-data-dir --no-module-dir --mgmt-publish no --auth no $xargs > qpidd.port
REMOTE_PORT=`cat qpidd.port`
}
diff --git a/cpp/src/tests/run_cluster_authentication_soak b/cpp/src/tests/run_cluster_authentication_soak
index 7bc406c4ca..24befa28ba 100755
--- a/cpp/src/tests/run_cluster_authentication_soak
+++ b/cpp/src/tests/run_cluster_authentication_soak
@@ -19,8 +19,9 @@
source ./test_env.sh
-source $srcdir/ais_check
source sasl_test_setup.sh
+source cpg_check.sh
+cpg_enabled || exit 0
with_ais_group ./cluster_authentication_soak 500
diff --git a/cpp/src/tests/run_cluster_authentication_test b/cpp/src/tests/run_cluster_authentication_test
index 647200b869..844807a857 100755
--- a/cpp/src/tests/run_cluster_authentication_test
+++ b/cpp/src/tests/run_cluster_authentication_test
@@ -19,8 +19,9 @@
source ./test_env.sh
-source $srcdir/ais_check
source sasl_test_setup.sh
+source cpg_check.sh
+cpg_enabled || exit 0
with_ais_group ./cluster_authentication_soak
diff --git a/cpp/src/tests/run_cluster_test b/cpp/src/tests/run_cluster_test
index c022eea1fe..11df3d63a3 100755
--- a/cpp/src/tests/run_cluster_test
+++ b/cpp/src/tests/run_cluster_test
@@ -22,5 +22,6 @@
# Run the tests
srcdir=`dirname $0`
-. $srcdir/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
with_ais_group $srcdir/run_test ./cluster_test
diff --git a/cpp/src/tests/run_cluster_tests b/cpp/src/tests/run_cluster_tests
index e136d3810a..a5cea5ff6e 100755
--- a/cpp/src/tests/run_cluster_tests
+++ b/cpp/src/tests/run_cluster_tests
@@ -20,7 +20,9 @@
#
source ./test_env.sh
-source $srcdir/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
+
test -x $QPID_PYTHON_TEST || { echo Skipping test, $QPID_PYTHON_TEST not found; exit 0; }
diff --git a/cpp/src/tests/run_failover_soak b/cpp/src/tests/run_failover_soak
index 4c2e8cc188..2c56bf7d6b 100755
--- a/cpp/src/tests/run_failover_soak
+++ b/cpp/src/tests/run_failover_soak
@@ -20,7 +20,8 @@
#
source ./test_env.sh
-. $srcdir/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
host=127.0.0.1
diff --git a/cpp/src/tests/run_federation_sys_tests b/cpp/src/tests/run_federation_sys_tests
index f5f772d72e..76da176914 100755
--- a/cpp/src/tests/run_federation_sys_tests
+++ b/cpp/src/tests/run_federation_sys_tests
@@ -26,12 +26,8 @@ source ./test_env.sh
MODULENAME=federation_sys
# Test for clustering
-ps -u root | grep 'aisexec\|corosync' > /dev/null
-if (( $? == 0 )); then
- CLUSTERING_ENABLED=1
-else
- echo "WARNING: No clustering detected; tests using it will be ignored."
-fi
+source cpg_check.sh
+if cpg_enabled; then CLUSTERING_ENABLED=1; fi
# Test for long test
if [[ "$1" == "LONG_TEST" ]]; then
diff --git a/cpp/src/tests/run_federation_tests b/cpp/src/tests/run_federation_tests
index b71fa14c47..7735b559cf 100755
--- a/cpp/src/tests/run_federation_tests
+++ b/cpp/src/tests/run_federation_tests
@@ -33,16 +33,13 @@ else
SKIPTESTS='-i *_xml' # note: single quotes prevent expansion of *
fi
+QPIDD_CMD="../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no --log-enable=info+ --log-enable=debug+:Bridge --log-to-file"
start_brokers() {
- ../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no > qpidd.port
- LOCAL_PORT=`cat qpidd.port`
- ../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no > qpidd.port
- REMOTE_PORT=`cat qpidd.port`
-
- ../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no > qpidd.port
- REMOTE_B1=`cat qpidd.port`
- ../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no > qpidd.port
- REMOTE_B2=`cat qpidd.port`
+ rm -f fed_local.log fed_remote.log fed_b1.log fed_b2.log
+ LOCAL_PORT=$($QPIDD_CMD fed_local.log)
+ REMOTE_PORT=$($QPIDD_CMD fed_remote.log)
+ REMOTE_B1=$($QPIDD_CMD fed_b1.log)
+ REMOTE_B2=$($QPIDD_CMD fed_b2.log)
}
stop_brokers() {
diff --git a/cpp/src/tests/run_federation_tests.ps1 b/cpp/src/tests/run_federation_tests.ps1
index 35353a870f..803b3eef6f 100644
--- a/cpp/src/tests/run_federation_tests.ps1
+++ b/cpp/src/tests/run_federation_tests.ps1
@@ -26,8 +26,7 @@ if (!(Test-Path $PYTHON_DIR -pathType Container)) {
exit 1
}
-$PYTHON_TEST_DIR = "$srcdir\..\..\..\tests\src\py"
-$QMF_LIB = "$srcdir\..\..\..\extras\qmf\src\py"
+. .\test_env.ps1
# Test runs from the tests directory but the broker executable is one level
# up, and most likely in a subdirectory from there based on what build type.
diff --git a/cpp/src/tests/run_header_test.ps1 b/cpp/src/tests/run_header_test.ps1
index 7d3e43a30f..344fac9cf9 100644
--- a/cpp/src/tests/run_header_test.ps1
+++ b/cpp/src/tests/run_header_test.ps1
@@ -28,6 +28,8 @@ if (!(Test-Path $PYTHON_DIR -pathType Container)) {
exit 0
}
+. .\test_env.ps1
+
if (Test-Path qpidd.port) {
set-item -path env:QPID_PORT -value (get-content -path qpidd.port -totalcount 1)
}
@@ -42,6 +44,5 @@ if (!(Test-Path $prog)) {
}
Invoke-Expression "$prog -p $env:QPID_PORT" | Write-Output
-$env:PYTHONPATH="$PYTHON_DIR;$env:PYTHONPATH"
Invoke-Expression "python $srcdir/header_test.py localhost $env:QPID_PORT" | Write-Output
exit $LASTEXITCODE
diff --git a/cpp/src/tests/run_msg_group_tests b/cpp/src/tests/run_msg_group_tests
index 5a6da546f3..4e82759866 100755
--- a/cpp/src/tests/run_msg_group_tests
+++ b/cpp/src/tests/run_msg_group_tests
@@ -44,19 +44,19 @@ run_test() {
declare -i i=0
declare -a tests
-tests=("qpid-config -a $BROKER_URL add queue $QUEUE_NAME --group-header=${GROUP_KEY} --shared-groups"
+tests=("qpid-config -b $BROKER_URL add queue $QUEUE_NAME --group-header=${GROUP_KEY} --shared-groups"
"msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 103 --group-size 13 --receivers 2 --senders 3 --capacity 3 --ack-frequency 7 --randomize-group-size --interleave 3"
"msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 103 --group-size 13 --receivers 2 --senders 3 --capacity 7 --ack-frequency 7 --randomize-group-size"
- "qpid-config -a $BROKER_URL add queue ${QUEUE_NAME}-two --group-header=${GROUP_KEY} --shared-groups"
+ "qpid-config -b $BROKER_URL add queue ${QUEUE_NAME}-two --group-header=${GROUP_KEY} --shared-groups"
"msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 103 --group-size 13 --receivers 2 --senders 3 --capacity 7 --ack-frequency 3 --randomize-group-size"
"msg_group_test -b $BROKER_URL -a ${QUEUE_NAME}-two --group-key $GROUP_KEY --messages 103 --group-size 13 --receivers 2 --senders 3 --capacity 3 --ack-frequency 7 --randomize-group-size --interleave 5"
"msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 59 --group-size 5 --receivers 2 --senders 3 --capacity 1 --ack-frequency 3 --randomize-group-size"
- "qpid-config -a $BROKER_URL del queue ${QUEUE_NAME}-two --force"
+ "qpid-config -b $BROKER_URL del queue ${QUEUE_NAME}-two --force"
"msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 59 --group-size 3 --receivers 2 --senders 3 --capacity 1 --ack-frequency 1 --randomize-group-size"
"msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 211 --group-size 13 --receivers 2 --senders 3 --capacity 47 --ack-frequency 79 --interleave 53"
"msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 10000 --group-size 1 --receivers 0 --senders 1"
"msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 10000 --receivers 5 --senders 0"
- "qpid-config -a $BROKER_URL del queue $QUEUE_NAME --force")
+ "qpid-config -b $BROKER_URL del queue $QUEUE_NAME --force")
while [ -n "${tests[i]}" ]; do
run_test ${tests[i]}
diff --git a/cpp/src/tests/run_msg_group_tests_soak b/cpp/src/tests/run_msg_group_tests_soak
index 44995423cc..2ebbaf4efd 100755
--- a/cpp/src/tests/run_msg_group_tests_soak
+++ b/cpp/src/tests/run_msg_group_tests_soak
@@ -44,13 +44,13 @@ run_test() {
declare -i i=0
declare -a tests
-tests=("qpid-config -a $BROKER_URL add queue $QUEUE_NAME --group-header=${GROUP_KEY} --shared-groups"
+tests=("qpid-config -b $BROKER_URL add queue $QUEUE_NAME --group-header=${GROUP_KEY} --shared-groups"
"msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 10007 --receivers 3 --senders 5 --group-size 211 --randomize-group-size --capacity 47 --ack-frequency 97"
"msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 10007 --receivers 3 --senders 5 --group-size 211 --randomize-group-size --capacity 79 --ack-frequency 79"
"msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 10007 --receivers 3 --senders 5 --group-size 211 --randomize-group-size --capacity 97 --ack-frequency 47"
"msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 40000 --receivers 0 --senders 5 --group-size 13 --randomize-group-size"
"msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 200000 --receivers 3 --senders 0 --capacity 23 --ack-frequency 7"
- "qpid-config -a $BROKER_URL del queue $QUEUE_NAME --force")
+ "qpid-config -b $BROKER_URL del queue $QUEUE_NAME --force")
while [ -n "${tests[i]}" ]; do
run_test ${tests[i]}
diff --git a/cpp/src/tests/run_store_tests.ps1 b/cpp/src/tests/run_store_tests.ps1
index b2f0b1ccd8..0683892393 100644
--- a/cpp/src/tests/run_store_tests.ps1
+++ b/cpp/src/tests/run_store_tests.ps1
@@ -30,14 +30,14 @@ if ($test_store -ne "MSSQL" -and $test_store -ne "MSSQL-CLFS") {
}
$srcdir = Split-Path $myInvocation.InvocationName
-$PYTHON_DIR = "$srcdir\..\..\..\python"
+
+. .\test_env.ps1
+
if (!(Test-Path $PYTHON_DIR -pathType Container)) {
"Skipping store tests as python libs not found"
exit 1
}
-$QMF_LIB = "$srcdir\..\..\..\extras\qmf\src\py"
-
# Test runs from the tests directory but the broker executable is one level
# up, and most likely in a subdirectory from there based on what build type.
# Look around for it before trying to start it.
@@ -97,7 +97,7 @@ set-item -path env:QPID_PORT -value (get-content -path qpidd-store.port -totalco
Remove-Item qpidd-store.port
$PYTHON_TEST_DIR = "$srcdir\..\..\..\tests\src\py\qpid_tests\broker_0_10"
-$env:PYTHONPATH="$PYTHON_DIR;$PYTHON_TEST_DIR;$env:PYTHONPATH;$QMF_LIB"
+$env:PYTHONPATH="$PYTHON_TEST_DIR;$srcdir;$env:PYTHONPATH"
python $PYTHON_DIR/qpid-python-test -m dtx -m persistence -b localhost:$env:QPID_PORT $fails $tests
$RETCODE=$LASTEXITCODE
if ($RETCODE -ne 0) {
@@ -111,7 +111,6 @@ Invoke-Expression "$prog --quit --port $env:QPID_PORT" | Write-Output
# Test 2... store.py starts/stops/restarts its own brokers
$tests = "*"
-$env:PYTHONPATH="$PYTHON_DIR;$QMF_LIB;$srcdir"
$env:QPIDD_EXEC="$prog"
$env:STORE_LIB="$store_dir\store$suffix.dll"
if ($test_store -eq "MSSQL") {
diff --git a/cpp/src/tests/run_test.ps1 b/cpp/src/tests/run_test.ps1
index ca990bc057..872e1dddb1 100644
--- a/cpp/src/tests/run_test.ps1
+++ b/cpp/src/tests/run_test.ps1
@@ -20,8 +20,7 @@
$srcdir = Split-Path $myInvocation.InvocationName
# Set up environment and run a test executable or script.
-$env:QPID_DATA_DIR = ""
-$env:BOOST_TEST_SHOW_PROGRESS = "yes"
+. .\test_env.ps1
# The test exe is probably not in the current binary dir - it's usually
# placed in a subdirectory based on the configuration built in Visual Studio.
@@ -30,7 +29,7 @@ $env:BOOST_TEST_SHOW_PROGRESS = "yes"
# one level up.
$prog = $args[0]
$is_script = $prog -match ".ps1$"
-if (!$is_script) {
+if (!$is_script -and !(Test-Path "$prog")) {
. $srcdir\find_prog.ps1 $prog
$args[0] = $prog
$env:QPID_LIB_DIR = "..\$sub"
diff --git a/cpp/src/tests/sasl.mk b/cpp/src/tests/sasl.mk
index 69b24c3f8a..11731dcf40 100644
--- a/cpp/src/tests/sasl.mk
+++ b/cpp/src/tests/sasl.mk
@@ -20,18 +20,37 @@
# Test that are only relevant if SASL is enabled.
if HAVE_SASL
+if HAVE_LIBCPG
check_PROGRAMS+=cluster_authentication_soak
cluster_authentication_soak_INCLUDES=$(PUBLIC_INCLUDES)
cluster_authentication_soak_SOURCES=cluster_authentication_soak.cpp ForkedBroker.h ForkedBroker.cpp
cluster_authentication_soak_LDADD=$(lib_client) $(lib_broker)
+endif HAVE_LIBCPG
# Note: sasl_version is not a test -- it is a tool used by tests.
check_PROGRAMS+=sasl_version
sasl_version_SOURCES=sasl_version.cpp
sasl_version_LDADD=$(lib_client)
-TESTS += run_cluster_authentication_test sasl_fed sasl_fed_ex_dynamic sasl_fed_ex_link sasl_fed_ex_queue sasl_fed_ex_route sasl_fed_ex_route_cluster sasl_fed_ex_link_cluster sasl_fed_ex_queue_cluster sasl_fed_ex_dynamic_cluster sasl_no_dir
+TESTS += sasl_fed
+ sasl_fed_ex_dynamic
+ sasl_fed_ex_link
+ sasl_fed_ex_queue
+ sasl_fed_ex_route
+ sasl_no_dir
+
+if HAVE_LIBCPG
+
+TESTS += run_cluster_authentication_test \
+ sasl_fed_ex_route_cluster \
+ sasl_fed_ex_link_cluster \
+ sasl_fed_ex_queue_cluster \
+ sasl_fed_ex_dynamic_cluster
+
LONG_TESTS += run_cluster_authentication_soak
+
+endif HAVE_LIBCPG
+
EXTRA_DIST += run_cluster_authentication_test \
sasl_fed \
sasl_fed_ex \
diff --git a/cpp/src/tests/sasl_fed b/cpp/src/tests/sasl_fed
index 884c44177c..9dc2dd46e2 100755
--- a/cpp/src/tests/sasl_fed
+++ b/cpp/src/tests/sasl_fed
@@ -90,23 +90,23 @@ EXCHANGE_NAME=sasl_fedex
#--------------------------------------------------
#echo " add exchanges"
#--------------------------------------------------
-$QPID_CONFIG_EXEC -a localhost:$broker_1_port add exchange direct $EXCHANGE_NAME
-$QPID_CONFIG_EXEC -a localhost:$broker_2_port add exchange direct $EXCHANGE_NAME
+$QPID_CONFIG_EXEC -b localhost:$broker_1_port add exchange direct $EXCHANGE_NAME
+$QPID_CONFIG_EXEC -b localhost:$broker_2_port add exchange direct $EXCHANGE_NAME
#--------------------------------------------------
#echo " add queues"
#--------------------------------------------------
-$QPID_CONFIG_EXEC -a localhost:$broker_1_port add queue $QUEUE_NAME
-$QPID_CONFIG_EXEC -a localhost:$broker_2_port add queue $QUEUE_NAME
+$QPID_CONFIG_EXEC -b localhost:$broker_1_port add queue $QUEUE_NAME
+$QPID_CONFIG_EXEC -b localhost:$broker_2_port add queue $QUEUE_NAME
sleep 5
#--------------------------------------------------
#echo " create bindings"
#--------------------------------------------------
-$QPID_CONFIG_EXEC -a localhost:$broker_1_port bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY
-$QPID_CONFIG_EXEC -a localhost:$broker_2_port bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY
+$QPID_CONFIG_EXEC -b localhost:$broker_1_port bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY
+$QPID_CONFIG_EXEC -b localhost:$broker_2_port bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY
sleep 5
@@ -130,13 +130,13 @@ sleep 5
#--------------------------------------------------
#echo " Examine Broker $broker_1_port"
#--------------------------------------------------
-broker_1_message_count=`$PYTHON_COMMANDS/qpid-stat -q localhost:$broker_1_port | grep sasl_fed_queue | awk '{print $2}'`
+broker_1_message_count=`$PYTHON_COMMANDS/qpid-stat -q -b localhost:$broker_1_port | grep sasl_fed_queue | awk '{print $2}'`
#echo " "
#--------------------------------------------------
#echo " Examine Broker $broker_2_port"
#--------------------------------------------------
-broker_2_message_count=`$PYTHON_COMMANDS/qpid-stat -q localhost:$broker_2_port | grep sasl_fed_queue | awk '{print $2}'`
+broker_2_message_count=`$PYTHON_COMMANDS/qpid-stat -q -b localhost:$broker_2_port | grep sasl_fed_queue | awk '{print $2}'`
#echo " "
#--------------------------------------------------
diff --git a/cpp/src/tests/sasl_fed_ex b/cpp/src/tests/sasl_fed_ex
index 716a806874..cc5b310067 100755
--- a/cpp/src/tests/sasl_fed_ex
+++ b/cpp/src/tests/sasl_fed_ex
@@ -280,18 +280,18 @@ EXCHANGE_NAME=sasl_fedex
print "add exchanges"
-$QPID_CONFIG_EXEC -a localhost:${SRC_TCP_PORT} add exchange direct $EXCHANGE_NAME
-$QPID_CONFIG_EXEC -a localhost:${DST_TCP_PORT} add exchange direct $EXCHANGE_NAME
+$QPID_CONFIG_EXEC -b localhost:${SRC_TCP_PORT} add exchange direct $EXCHANGE_NAME
+$QPID_CONFIG_EXEC -b localhost:${DST_TCP_PORT} add exchange direct $EXCHANGE_NAME
print "add queues"
-$QPID_CONFIG_EXEC -a localhost:${SRC_TCP_PORT} add queue $QUEUE_NAME
-$QPID_CONFIG_EXEC -a localhost:${DST_TCP_PORT} add queue $QUEUE_NAME
+$QPID_CONFIG_EXEC -b localhost:${SRC_TCP_PORT} add queue $QUEUE_NAME
+$QPID_CONFIG_EXEC -b localhost:${DST_TCP_PORT} add queue $QUEUE_NAME
print "create bindings"
-$QPID_CONFIG_EXEC -a localhost:${SRC_TCP_PORT} bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY
-$QPID_CONFIG_EXEC -a localhost:${DST_TCP_PORT} bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY
+$QPID_CONFIG_EXEC -b localhost:${SRC_TCP_PORT} bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY
+$QPID_CONFIG_EXEC -b localhost:${DST_TCP_PORT} bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY
#
diff --git a/cpp/src/tests/sasl_fed_ex_dynamic_cluster b/cpp/src/tests/sasl_fed_ex_dynamic_cluster
index b0cceccecb..fd6b72a4f2 100755
--- a/cpp/src/tests/sasl_fed_ex_dynamic_cluster
+++ b/cpp/src/tests/sasl_fed_ex_dynamic_cluster
@@ -21,7 +21,9 @@
source ./test_env.sh
-source $srcdir/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
+
with_ais_group ${srcdir}/sasl_fed_ex dynamic cluster
diff --git a/cpp/src/tests/sasl_fed_ex_link_cluster b/cpp/src/tests/sasl_fed_ex_link_cluster
index 4139300b12..34b2aa4a5f 100755
--- a/cpp/src/tests/sasl_fed_ex_link_cluster
+++ b/cpp/src/tests/sasl_fed_ex_link_cluster
@@ -21,7 +21,8 @@
source ./test_env.sh
-source $srcdir/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
with_ais_group ${srcdir}/sasl_fed_ex link cluster
diff --git a/cpp/src/tests/sasl_fed_ex_queue_cluster b/cpp/src/tests/sasl_fed_ex_queue_cluster
index f251420e08..14f36f6fc4 100755
--- a/cpp/src/tests/sasl_fed_ex_queue_cluster
+++ b/cpp/src/tests/sasl_fed_ex_queue_cluster
@@ -21,7 +21,8 @@
source ./test_env.sh
-source ${srcdir}/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
with_ais_group ${srcdir}/sasl_fed_ex queue cluster
diff --git a/cpp/src/tests/sasl_fed_ex_route_cluster b/cpp/src/tests/sasl_fed_ex_route_cluster
index a5d1542def..756476056e 100755
--- a/cpp/src/tests/sasl_fed_ex_route_cluster
+++ b/cpp/src/tests/sasl_fed_ex_route_cluster
@@ -21,7 +21,8 @@
source ./test_env.sh
-source ${srcdir}/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
with_ais_group ${srcdir}/sasl_fed_ex route cluster
diff --git a/cpp/src/tests/ssl_test b/cpp/src/tests/ssl_test
index 4dbb7df392..91ff8eec1e 100755
--- a/cpp/src/tests/ssl_test
+++ b/cpp/src/tests/ssl_test
@@ -100,8 +100,10 @@ start_ssl_mux_broker() {
PORTS=( ${PORTS[@]} $1 )
}
+sasl_config_dir=$builddir/sasl_config
+
start_authenticating_broker() {
- start_brokers 1 "--transport ssl --ssl-port 0 --require-encryption --ssl-sasl-no-dict --ssl-require-client-authentication --auth yes"
+ start_brokers 1 "--transport ssl --ssl-port 0 --require-encryption --ssl-sasl-no-dict --ssl-require-client-authentication --auth yes --sasl-config=${sasl_config_dir}"
}
ssl_cluster_broker() { # $1 = port
@@ -140,6 +142,12 @@ URL=amqp:ssl:$TEST_HOSTNAME:$PORT
MSG=`./qpid-receive -b $URL -a "foo;{create:always}" --messages 1`
test "$MSG" = "hello" || { echo "receive failed '$MSG' != 'hello'"; exit 1; }
+## Test connection with a combination of URL and connection options (in messaging API)
+URL=$TEST_HOSTNAME:$PORT
+./qpid-send -b $URL --connection-options '{transport:ssl,heartbeat:2}' --content-string='hello again' -a "foo;{create:always}"
+MSG=`./qpid-receive -b $URL --connection-options '{transport:ssl,heartbeat:2}' -a "foo;{create:always}" --messages 1`
+test "$MSG" = "hello again" || { echo "receive failed '$MSG' != 'hello again'"; exit 1; }
+
#### Client Authentication tests
start_authenticating_broker
@@ -184,7 +192,8 @@ stop_brokers
test -z $CLUSTER_LIB && exit 0 # Exit if cluster not supported.
## Test failover in a cluster using SSL only
-. $srcdir/ais_check # Will exit if clustering not enabled.
+source cpg_check.sh
+cpg_enabled || exit 0
PORT1=`pick_port`; ssl_cluster_broker $PORT1
echo "Running SSL cluster broker on port $PORT1"
diff --git a/cpp/src/tests/start_cluster b/cpp/src/tests/start_cluster
index 84f98b3b2d..78fd104d9c 100755
--- a/cpp/src/tests/start_cluster
+++ b/cpp/src/tests/start_cluster
@@ -24,7 +24,8 @@
# Execute command with the ais group set.
source ./test_env.sh
-. `dirname $0`/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
rm -f cluster*.log cluster.ports qpidd.port
diff --git a/cpp/src/tests/test_env.ps1.in b/cpp/src/tests/test_env.ps1.in
new file mode 100644
index 0000000000..60ba4305a5
--- /dev/null
+++ b/cpp/src/tests/test_env.ps1.in
@@ -0,0 +1,78 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# Environment variables substituted by configure/cmake.
+$srcdir="@abs_srcdir@"
+$builddir="@abs_builddir@"
+$top_srcdir="@abs_top_srcdir@"
+$top_builddir="@abs_top_builddir@"
+$moduledir="$top_builddir\src@builddir_lib_suffix@"
+$testmoduledir="$builddir@builddir_lib_suffix@"
+
+# Python paths and directories
+$PYTHON_DIR="$builddir\python"
+$QPID_PYTHON_TEST="$PYTHON_DIR\commands\qpid-python-test"
+if ( !(Test-Path "$PYTHON_DIR") -and (Test-Path "$top_srcdir\..\python")) {
+ $PYTHON_DIR="$top_srcdir\..\python"
+ $QPID_PYTHON_TEST="$PYTHON_DIR\qpid-python-test"
+}
+$QPID_TESTS="$top_srcdir\..\tests"
+$QPID_TESTS_PY="$QPID_TESTS\src\py"
+$QPID_TOOLS="$top_srcdir\..\tools"
+$QPID_TOOLS_LIBS="$QPID_TOOLS\src\py"
+$QMF_LIB="$top_srcdir\..\extras\qmf\src\py"
+$PYTHON_COMMANDS="$QPID_TOOLS\src\py"
+$env:PYTHONPATH="$srcdir;$PYTHON_DIR;$PYTHON_COMMANDS;$QPID_TESTS_PY;$QPID_TOOLS_LIBS;$QMF_LIB;$env:PYTHONPATH"
+$QPID_CONFIG_EXEC="$PYTHON_COMMANDS\qpid-config"
+$QPID_ROUTE_EXEC="$PYTHON_COMMANDS\qpid-route"
+$QPID_CLUSTER_EXEC="$PYTHON_COMMANDS\qpid-cluster"
+$QPID_HA_TOOL_EXEC="$PYTHON_COMMANDS\qpid-ha-tool"
+
+# Executables
+$env:QPIDD_EXEC="$top_builddir\src\qpidd"
+$env:QPID_WATCHDOG_EXEC="$top_builddir\src\qpidd_watchdog"
+
+# Test executables
+$QPID_TEST_EXEC_DIR="$builddir"
+$RECEIVER_EXEC="$QPID_TEST_EXEC_DIR\receiver"
+$SENDER_EXEC="$QPID_TEST_EXEC_DIR\sender"
+
+# Path
+$env:PATH="$top_builddir\src;$builddir;$srcdir;$PYTHON_COMMANDS;$QPID_TEST_EXEC_DIR;$env:PATH"
+
+# Modules
+$env:TEST_STORE_LIB="$testmoduledir\test_store.so"
+
+#exportmodule() { test -f $moduledir/$2 && eval "export $1=$moduledir/$2"; }
+#exportmodule ACL_LIB acl.so
+#exportmodule CLUSTER_LIB cluster.so
+#exportmodule REPLICATING_LISTENER_LIB replicating_listener.so
+#exportmodule REPLICATION_EXCHANGE_LIB replication_exchange.so
+#exportmodule SSLCONNECTOR_LIB sslconnector.so
+#exportmodule SSL_LIB ssl.so
+#exportmodule WATCHDOG_LIB watchdog.so
+#exportmodule XML_LIB xml.so
+
+# Qpid options
+$env:QPID_NO_MODULE_DIR="1" # Don't accidentally load installed modules
+$env:QPID_DATA_DIR= # Default to no data dir, not ~/.qpidd
+
+# Options for boost test framework
+$env:BOOST_TEST_SHOW_PROGRESS="yes"
+$env:BOOST_TEST_CATCH_SYSTEM_ERRORS="no"
diff --git a/cpp/src/tests/test_env.sh.in b/cpp/src/tests/test_env.sh.in
index 0cd658bd80..cee36843ae 100644
--- a/cpp/src/tests/test_env.sh.in
+++ b/cpp/src/tests/test_env.sh.in
@@ -44,6 +44,7 @@ export PYTHONPATH=$srcdir:$PYTHON_DIR:$PYTHON_COMMANDS:$QPID_TESTS_PY:$QMF_LIB:$
export QPID_CONFIG_EXEC=$PYTHON_COMMANDS/qpid-config
export QPID_ROUTE_EXEC=$PYTHON_COMMANDS/qpid-route
export QPID_CLUSTER_EXEC=$PYTHON_COMMANDS/qpid-cluster
+export QPID_HA_EXEC=$PYTHON_COMMANDS/qpid-ha
# Executables
export QPIDD_EXEC=$top_builddir/src/qpidd
@@ -74,6 +75,7 @@ exportmodule XML_LIB xml.so
# Qpid options
export QPID_NO_MODULE_DIR=1 # Don't accidentally load installed modules
export QPID_DATA_DIR=
+export QPID_CONFIG=$srcdir/qpidd-empty.conf
# Use temporary directory if $HOME does not exist
if [ ! -e "$HOME" ]; then
diff --git a/cpp/src/tests/testagent.cpp b/cpp/src/tests/testagent.cpp
index 98520b424a..e6010a8e00 100644
--- a/cpp/src/tests/testagent.cpp
+++ b/cpp/src/tests/testagent.cpp
@@ -36,9 +36,12 @@
#include <sstream>
+namespace qpid {
+namespace tests {
+
static bool running = true;
-using namespace std;
+using std::string;
using qpid::management::ManagementAgent;
using qpid::management::ManagementObject;
using qpid::management::Manageable;
@@ -191,12 +194,14 @@ int main_int(int argc, char** argv)
return 0;
}
+}} // namespace qpid::tests
+
int main(int argc, char** argv)
{
try {
- return main_int(argc, argv);
+ return qpid::tests::main_int(argc, argv);
} catch(std::exception& e) {
- cerr << "Top Level Exception: " << e.what() << endl;
+ std::cerr << "Top Level Exception: " << e.what() << std::endl;
return 1;
}
}
diff --git a/cpp/src/tests/testlib.py b/cpp/src/tests/testlib.py
index fe57a84a81..71ad59e5c1 100644
--- a/cpp/src/tests/testlib.py
+++ b/cpp/src/tests/testlib.py
@@ -348,8 +348,8 @@ class TestBaseCluster(TestBase):
def _qpidConfig(self, nodeNumber, clusterName, action):
"""Configure some aspect of a qpid broker using the qpid_config executable"""
port = self.getNodeTuple(nodeNumber, clusterName)[self.PORT]
- #print "%s -a localhost:%d %s" % (self._qpidConfigExec, port, action)
- ret = os.spawnl(os.P_WAIT, self._qpidConfigExec, self._qpidConfigExec, "-a", "localhost:%d" % port, *action.split())
+ #print "%s -b localhost:%d %s" % (self._qpidConfigExec, port, action)
+ ret = os.spawnl(os.P_WAIT, self._qpidConfigExec, self._qpidConfigExec, "-b", "localhost:%d" % port, *action.split())
if ret != 0:
raise Exception("_qpidConfig(): cluster=\"%s\" nodeNumber=%d port=%d action=\"%s\" returned %d" % \
(clusterName, nodeNumber, port, action, ret))
diff --git a/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp b/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp
index 024f20b147..14f1e46606 100644
--- a/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp
+++ b/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp
@@ -32,7 +32,9 @@
#include <windows.h>
#include <iostream>
-namespace {
+namespace qpid {
+namespace tests {
+namespace windows {
// Instead of popping up a window for exceptions, just print something out
LONG _stdcall UnhandledExceptionFilter (PEXCEPTION_POINTERS pExceptionInfo)
@@ -73,4 +75,4 @@ redirect_errors_to_stderr::redirect_errors_to_stderr()
SetUnhandledExceptionFilter (&UnhandledExceptionFilter);
}
-} // namespace
+}}} // namespace
diff --git a/cpp/src/windows/QpiddBroker.cpp b/cpp/src/windows/QpiddBroker.cpp
index 42ba97bdb1..89a8945d00 100644
--- a/cpp/src/windows/QpiddBroker.cpp
+++ b/cpp/src/windows/QpiddBroker.cpp
@@ -32,11 +32,12 @@
#include <iostream>
#include <windows.h>
-using namespace qpid::broker;
+namespace qpid {
+namespace broker {
BootstrapOptions::BootstrapOptions(const char* argv0)
: qpid::Options("Options"),
- common("", QPIDD_CONF_FILE),
+ common("", QPIDD_CONF_FILE, QPIDC_CONF_FILE),
module(QPIDD_MODULE_DIR),
log(argv0)
{
@@ -314,7 +315,7 @@ struct QpiddWindowsOptions : public QpiddOptionsPrivate {
QpiddOptions::QpiddOptions(const char* argv0)
: qpid::Options("Options"),
- common("", QPIDD_CONF_FILE),
+ common("", QPIDD_CONF_FILE, QPIDC_CONF_FILE),
module(QPIDD_MODULE_DIR),
log(argv0)
{
@@ -451,6 +452,7 @@ int QpiddBroker::execute (QpiddOptions *options) {
return 0;
}
+}} // namespace qpid::broker
int main(int argc, char* argv[])
{
@@ -459,13 +461,13 @@ int main(int argc, char* argv[])
// the service is stopped.
SERVICE_TABLE_ENTRY dispatchTable[] =
{
- { "", (LPSERVICE_MAIN_FUNCTION)ServiceMain },
+ { "", (LPSERVICE_MAIN_FUNCTION)qpid::broker::ServiceMain },
{ NULL, NULL }
};
if (!StartServiceCtrlDispatcher(dispatchTable)) {
DWORD err = ::GetLastError();
if (err == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) // Run as console
- return run_broker(argc, argv);
+ return qpid::broker::run_broker(argc, argv);
throw QPID_WINDOWS_ERROR(err);
}
return 0;
diff --git a/cpp/src/windows/SCM.cpp b/cpp/src/windows/SCM.cpp
index 232bb04c17..2eeb143427 100644
--- a/cpp/src/windows/SCM.cpp
+++ b/cpp/src/windows/SCM.cpp
@@ -1,332 +1,332 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "qpid/log/Statement.h"
-#include "qpid/sys/windows/check.h"
-#include "SCM.h"
-
-#pragma comment(lib, "advapi32.lib")
-
-namespace {
-
-// Container that will close a SC_HANDLE upon destruction.
-class AutoServiceHandle {
-public:
- AutoServiceHandle(SC_HANDLE h_ = NULL) : h(h_) {}
- ~AutoServiceHandle() { if (h != NULL) ::CloseServiceHandle(h); }
- void release() { h = NULL; }
- void reset(SC_HANDLE newHandle)
- {
- if (h != NULL)
- ::CloseServiceHandle(h);
- h = newHandle;
- }
- operator SC_HANDLE() const { return h; }
-
-private:
- SC_HANDLE h;
-};
-
-}
-
-namespace qpid {
-namespace windows {
-
-SCM::SCM() : scmHandle(NULL)
-{
-}
-
-SCM::~SCM()
-{
- if (NULL != scmHandle)
- ::CloseServiceHandle(scmHandle);
-}
-
-/**
- * Install this executable as a service
- */
-void SCM::install(const string& serviceName,
- const string& serviceDesc,
- const string& args,
- DWORD startType,
- const string& account,
- const string& password,
- const string& depends)
-{
- // Handle dependent service name list; Windows wants a set of nul-separated
- // names ending with a double nul.
- string depends2 = depends;
- if (!depends2.empty()) {
- // CDL to null delimiter w/ trailing double null
- size_t p = 0;
- while ((p = depends2.find_first_of( ',', p)) != string::npos)
- depends2.replace(p, 1, 1, '\0');
- depends2.push_back('\0');
- depends2.push_back('\0');
- }
-
-#if 0
- // I'm nervous about adding a user/password check here. Is this a
- // potential attack vector, letting users check passwords without
- // control? -Steve Huston, Feb 24, 2011
-
- // Validate account, password
- HANDLE hToken = NULL;
- bool logStatus = false;
- if (!account.empty() && !password.empty() &&
- !(logStatus = ::LogonUserA(account.c_str(),
- "",
- password.c_str(),
- LOGON32_LOGON_NETWORK,
- LOGON32_PROVIDER_DEFAULT,
- &hToken ) != 0))
- std::cout << "warning: supplied account & password failed with LogonUser." << std::endl;
- if (logStatus)
- ::CloseHandle(hToken);
-#endif
-
- // Get fully qualified .exe name
- char myPath[MAX_PATH];
- DWORD myPathLength = ::GetModuleFileName(NULL, myPath, MAX_PATH);
- QPID_WINDOWS_CHECK_NOT(myPathLength, 0);
- string imagePath(myPath, myPathLength);
- if (!args.empty())
- imagePath += " " + args;
-
- // Ensure there's a handle to the SCM database.
- openSvcManager();
-
- // Create the service
- SC_HANDLE svcHandle;
- svcHandle = ::CreateService(scmHandle, // SCM database
- serviceName.c_str(), // name of service
- serviceDesc.c_str(), // name to display
- SERVICE_ALL_ACCESS, // desired access
- SERVICE_WIN32_OWN_PROCESS, // service type
- startType, // start type
- SERVICE_ERROR_NORMAL, // error cntrl type
- imagePath.c_str(), // path to service's binary w/ optional arguments
- NULL, // no load ordering group
- NULL, // no tag identifier
- depends2.empty() ? NULL : depends2.c_str(),
- account.empty() ? NULL : account.c_str(), // account name, or NULL for LocalSystem
- password.empty() ? NULL : password.c_str()); // password, or NULL for none
- QPID_WINDOWS_CHECK_NULL(svcHandle);
- ::CloseServiceHandle(svcHandle);
- QPID_LOG(info, "Service installed successfully");
-}
-
-/**
- *
- */
-void SCM::uninstall(const string& serviceName)
-{
- // Ensure there's a handle to the SCM database.
- openSvcManager();
- AutoServiceHandle svc(::OpenService(scmHandle,
- serviceName.c_str(),
- DELETE));
- QPID_WINDOWS_CHECK_NULL((SC_HANDLE)svc);
- QPID_WINDOWS_CHECK_NOT(::DeleteService(svc), 0);
- QPID_LOG(info, "Service deleted successfully.");
-}
-
-/**
- * Attempt to start the service.
- */
-void SCM::start(const string& serviceName)
-{
- // Ensure we have a handle to the SCM database.
- openSvcManager();
-
- // Get a handle to the service.
- AutoServiceHandle svc(::OpenService(scmHandle,
- serviceName.c_str(),
- SERVICE_ALL_ACCESS));
- QPID_WINDOWS_CHECK_NULL(svc);
-
- // Check the status in case the service is not stopped.
- DWORD state = waitForStateChangeFrom(svc, SERVICE_STOP_PENDING);
- if (state == SERVICE_STOP_PENDING)
- throw qpid::Exception("Timed out waiting for running service to stop.");
-
- // Attempt to start the service.
- QPID_WINDOWS_CHECK_NOT(::StartService(svc, 0, NULL), 0);
-
- QPID_LOG(info, "Service start pending...");
-
- // Check the status until the service is no longer start pending.
- state = waitForStateChangeFrom(svc, SERVICE_START_PENDING);
- // Determine whether the service is running.
- if (state == SERVICE_RUNNING) {
- QPID_LOG(info, "Service started successfully");
- }
- else {
- throw qpid::Exception(QPID_MSG("Service not yet running; state now " << state));
- }
-}
-
-/**
- *
- */
-void SCM::stop(const string& serviceName)
-{
- // Ensure a handle to the SCM database.
- openSvcManager();
-
- // Get a handle to the service.
- AutoServiceHandle svc(::OpenService(scmHandle,
- serviceName.c_str(),
- SERVICE_STOP | SERVICE_QUERY_STATUS |
- SERVICE_ENUMERATE_DEPENDENTS));
- QPID_WINDOWS_CHECK_NULL(svc);
-
- // Make sure the service is not already stopped; if it's stop-pending,
- // wait for it to finalize.
- DWORD state = waitForStateChangeFrom(svc, SERVICE_STOP_PENDING);
- if (state == SERVICE_STOPPED) {
- QPID_LOG(info, "Service is already stopped");
- return;
- }
-
- // If the service is running, dependencies must be stopped first.
- std::auto_ptr<ENUM_SERVICE_STATUS> deps;
- DWORD numDeps = getDependentServices(svc, deps);
- for (DWORD i = 0; i < numDeps; i++)
- stop(deps.get()[i].lpServiceName);
-
- // Dependents stopped; send a stop code to the service.
- SERVICE_STATUS_PROCESS ssp;
- if (!::ControlService(svc, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS)&ssp))
- throw qpid::Exception(QPID_MSG("Stopping " << serviceName << ": " <<
- qpid::sys::strError(::GetLastError())));
-
- // Wait for the service to stop.
- state = waitForStateChangeFrom(svc, SERVICE_STOP_PENDING);
- if (state == SERVICE_STOPPED)
- QPID_LOG(info, QPID_MSG("Service " << serviceName <<
- " stopped successfully."));
-}
-
-/**
- *
- */
-void SCM::openSvcManager()
-{
- if (NULL != scmHandle)
- return;
-
- scmHandle = ::OpenSCManager(NULL, // local computer
- NULL, // ServicesActive database
- SC_MANAGER_ALL_ACCESS); // Rights
- QPID_WINDOWS_CHECK_NULL(scmHandle);
-}
-
-DWORD SCM::waitForStateChangeFrom(SC_HANDLE svc, DWORD originalState)
-{
- SERVICE_STATUS_PROCESS ssStatus;
- DWORD bytesNeeded;
- DWORD waitTime;
- if (!::QueryServiceStatusEx(svc, // handle to service
- SC_STATUS_PROCESS_INFO, // information level
- (LPBYTE)&ssStatus, // address of structure
- sizeof(ssStatus), // size of structure
- &bytesNeeded)) // size needed if buffer is too small
- throw QPID_WINDOWS_ERROR(::GetLastError());
-
- // Save the tick count and initial checkpoint.
- DWORD startTickCount = ::GetTickCount();
- DWORD oldCheckPoint = ssStatus.dwCheckPoint;
-
- // Wait for the service to change out of the noted state.
- while (ssStatus.dwCurrentState == originalState) {
- // Do not wait longer than the wait hint. A good interval is
- // one-tenth of the wait hint but not less than 1 second
- // and not more than 10 seconds.
- waitTime = ssStatus.dwWaitHint / 10;
- if (waitTime < 1000)
- waitTime = 1000;
- else if (waitTime > 10000)
- waitTime = 10000;
-
- ::Sleep(waitTime);
-
- // Check the status until the service is no longer stop pending.
- if (!::QueryServiceStatusEx(svc,
- SC_STATUS_PROCESS_INFO,
- (LPBYTE) &ssStatus,
- sizeof(ssStatus),
- &bytesNeeded))
- throw QPID_WINDOWS_ERROR(::GetLastError());
-
- if (ssStatus.dwCheckPoint > oldCheckPoint) {
- // Continue to wait and check.
- startTickCount = ::GetTickCount();
- oldCheckPoint = ssStatus.dwCheckPoint;
- } else {
- if ((::GetTickCount() - startTickCount) > ssStatus.dwWaitHint)
- break;
- }
- }
- return ssStatus.dwCurrentState;
-}
-
-/**
- * Get the services that depend on @arg svc. All dependent service info
- * is returned in an array of ENUM_SERVICE_STATUS structures via @arg deps.
- *
- * @retval The number of dependent services.
- */
-DWORD SCM::getDependentServices(SC_HANDLE svc,
- std::auto_ptr<ENUM_SERVICE_STATUS>& deps)
-{
- DWORD bytesNeeded;
- DWORD numEntries;
-
- // Pass a zero-length buffer to get the required buffer size.
- if (::EnumDependentServices(svc,
- SERVICE_ACTIVE,
- 0,
- 0,
- &bytesNeeded,
- &numEntries)) {
- // If the Enum call succeeds, then there are no dependent
- // services, so do nothing.
- return 0;
- }
-
- if (::GetLastError() != ERROR_MORE_DATA)
- throw QPID_WINDOWS_ERROR((::GetLastError()));
-
- // Allocate a buffer for the dependencies.
- deps.reset((LPENUM_SERVICE_STATUS)(new char[bytesNeeded]));
- // Enumerate the dependencies.
- if (!::EnumDependentServices(svc,
- SERVICE_ACTIVE,
- deps.get(),
- bytesNeeded,
- &bytesNeeded,
- &numEntries))
- throw QPID_WINDOWS_ERROR((::GetLastError()));
- return numEntries;
-}
-
-} } // namespace qpid::windows
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include "qpid/log/Statement.h"
+#include "qpid/sys/windows/check.h"
+#include "SCM.h"
+
+#pragma comment(lib, "advapi32.lib")
+
+namespace qpid {
+namespace windows {
+
+namespace {
+
+// Container that will close a SC_HANDLE upon destruction.
+class AutoServiceHandle {
+public:
+ AutoServiceHandle(SC_HANDLE h_ = NULL) : h(h_) {}
+ ~AutoServiceHandle() { if (h != NULL) ::CloseServiceHandle(h); }
+ void release() { h = NULL; }
+ void reset(SC_HANDLE newHandle)
+ {
+ if (h != NULL)
+ ::CloseServiceHandle(h);
+ h = newHandle;
+ }
+ operator SC_HANDLE() const { return h; }
+
+private:
+ SC_HANDLE h;
+};
+
+}
+
+SCM::SCM() : scmHandle(NULL)
+{
+}
+
+SCM::~SCM()
+{
+ if (NULL != scmHandle)
+ ::CloseServiceHandle(scmHandle);
+}
+
+/**
+ * Install this executable as a service
+ */
+void SCM::install(const string& serviceName,
+ const string& serviceDesc,
+ const string& args,
+ DWORD startType,
+ const string& account,
+ const string& password,
+ const string& depends)
+{
+ // Handle dependent service name list; Windows wants a set of nul-separated
+ // names ending with a double nul.
+ string depends2 = depends;
+ if (!depends2.empty()) {
+ // CDL to null delimiter w/ trailing double null
+ size_t p = 0;
+ while ((p = depends2.find_first_of( ',', p)) != string::npos)
+ depends2.replace(p, 1, 1, '\0');
+ depends2.push_back('\0');
+ depends2.push_back('\0');
+ }
+
+#if 0
+ // I'm nervous about adding a user/password check here. Is this a
+ // potential attack vector, letting users check passwords without
+ // control? -Steve Huston, Feb 24, 2011
+
+ // Validate account, password
+ HANDLE hToken = NULL;
+ bool logStatus = false;
+ if (!account.empty() && !password.empty() &&
+ !(logStatus = ::LogonUserA(account.c_str(),
+ "",
+ password.c_str(),
+ LOGON32_LOGON_NETWORK,
+ LOGON32_PROVIDER_DEFAULT,
+ &hToken ) != 0))
+ std::cout << "warning: supplied account & password failed with LogonUser." << std::endl;
+ if (logStatus)
+ ::CloseHandle(hToken);
+#endif
+
+ // Get fully qualified .exe name
+ char myPath[MAX_PATH];
+ DWORD myPathLength = ::GetModuleFileName(NULL, myPath, MAX_PATH);
+ QPID_WINDOWS_CHECK_NOT(myPathLength, 0);
+ string imagePath(myPath, myPathLength);
+ if (!args.empty())
+ imagePath += " " + args;
+
+ // Ensure there's a handle to the SCM database.
+ openSvcManager();
+
+ // Create the service
+ SC_HANDLE svcHandle;
+ svcHandle = ::CreateService(scmHandle, // SCM database
+ serviceName.c_str(), // name of service
+ serviceDesc.c_str(), // name to display
+ SERVICE_ALL_ACCESS, // desired access
+ SERVICE_WIN32_OWN_PROCESS, // service type
+ startType, // start type
+ SERVICE_ERROR_NORMAL, // error cntrl type
+ imagePath.c_str(), // path to service's binary w/ optional arguments
+ NULL, // no load ordering group
+ NULL, // no tag identifier
+ depends2.empty() ? NULL : depends2.c_str(),
+ account.empty() ? NULL : account.c_str(), // account name, or NULL for LocalSystem
+ password.empty() ? NULL : password.c_str()); // password, or NULL for none
+ QPID_WINDOWS_CHECK_NULL(svcHandle);
+ ::CloseServiceHandle(svcHandle);
+ QPID_LOG(info, "Service installed successfully");
+}
+
+/**
+ *
+ */
+void SCM::uninstall(const string& serviceName)
+{
+ // Ensure there's a handle to the SCM database.
+ openSvcManager();
+ AutoServiceHandle svc(::OpenService(scmHandle,
+ serviceName.c_str(),
+ DELETE));
+ QPID_WINDOWS_CHECK_NULL((SC_HANDLE)svc);
+ QPID_WINDOWS_CHECK_NOT(::DeleteService(svc), 0);
+ QPID_LOG(info, "Service deleted successfully.");
+}
+
+/**
+ * Attempt to start the service.
+ */
+void SCM::start(const string& serviceName)
+{
+ // Ensure we have a handle to the SCM database.
+ openSvcManager();
+
+ // Get a handle to the service.
+ AutoServiceHandle svc(::OpenService(scmHandle,
+ serviceName.c_str(),
+ SERVICE_ALL_ACCESS));
+ QPID_WINDOWS_CHECK_NULL(svc);
+
+ // Check the status in case the service is not stopped.
+ DWORD state = waitForStateChangeFrom(svc, SERVICE_STOP_PENDING);
+ if (state == SERVICE_STOP_PENDING)
+ throw qpid::Exception("Timed out waiting for running service to stop.");
+
+ // Attempt to start the service.
+ QPID_WINDOWS_CHECK_NOT(::StartService(svc, 0, NULL), 0);
+
+ QPID_LOG(info, "Service start pending...");
+
+ // Check the status until the service is no longer start pending.
+ state = waitForStateChangeFrom(svc, SERVICE_START_PENDING);
+ // Determine whether the service is running.
+ if (state == SERVICE_RUNNING) {
+ QPID_LOG(info, "Service started successfully");
+ }
+ else {
+ throw qpid::Exception(QPID_MSG("Service not yet running; state now " << state));
+ }
+}
+
+/**
+ *
+ */
+void SCM::stop(const string& serviceName)
+{
+ // Ensure a handle to the SCM database.
+ openSvcManager();
+
+ // Get a handle to the service.
+ AutoServiceHandle svc(::OpenService(scmHandle,
+ serviceName.c_str(),
+ SERVICE_STOP | SERVICE_QUERY_STATUS |
+ SERVICE_ENUMERATE_DEPENDENTS));
+ QPID_WINDOWS_CHECK_NULL(svc);
+
+ // Make sure the service is not already stopped; if it's stop-pending,
+ // wait for it to finalize.
+ DWORD state = waitForStateChangeFrom(svc, SERVICE_STOP_PENDING);
+ if (state == SERVICE_STOPPED) {
+ QPID_LOG(info, "Service is already stopped");
+ return;
+ }
+
+ // If the service is running, dependencies must be stopped first.
+ std::auto_ptr<ENUM_SERVICE_STATUS> deps;
+ DWORD numDeps = getDependentServices(svc, deps);
+ for (DWORD i = 0; i < numDeps; i++)
+ stop(deps.get()[i].lpServiceName);
+
+ // Dependents stopped; send a stop code to the service.
+ SERVICE_STATUS_PROCESS ssp;
+ if (!::ControlService(svc, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS)&ssp))
+ throw qpid::Exception(QPID_MSG("Stopping " << serviceName << ": " <<
+ qpid::sys::strError(::GetLastError())));
+
+ // Wait for the service to stop.
+ state = waitForStateChangeFrom(svc, SERVICE_STOP_PENDING);
+ if (state == SERVICE_STOPPED)
+ QPID_LOG(info, QPID_MSG("Service " << serviceName <<
+ " stopped successfully."));
+}
+
+/**
+ *
+ */
+void SCM::openSvcManager()
+{
+ if (NULL != scmHandle)
+ return;
+
+ scmHandle = ::OpenSCManager(NULL, // local computer
+ NULL, // ServicesActive database
+ SC_MANAGER_ALL_ACCESS); // Rights
+ QPID_WINDOWS_CHECK_NULL(scmHandle);
+}
+
+DWORD SCM::waitForStateChangeFrom(SC_HANDLE svc, DWORD originalState)
+{
+ SERVICE_STATUS_PROCESS ssStatus;
+ DWORD bytesNeeded;
+ DWORD waitTime;
+ if (!::QueryServiceStatusEx(svc, // handle to service
+ SC_STATUS_PROCESS_INFO, // information level
+ (LPBYTE)&ssStatus, // address of structure
+ sizeof(ssStatus), // size of structure
+ &bytesNeeded)) // size needed if buffer is too small
+ throw QPID_WINDOWS_ERROR(::GetLastError());
+
+ // Save the tick count and initial checkpoint.
+ DWORD startTickCount = ::GetTickCount();
+ DWORD oldCheckPoint = ssStatus.dwCheckPoint;
+
+ // Wait for the service to change out of the noted state.
+ while (ssStatus.dwCurrentState == originalState) {
+ // Do not wait longer than the wait hint. A good interval is
+ // one-tenth of the wait hint but not less than 1 second
+ // and not more than 10 seconds.
+ waitTime = ssStatus.dwWaitHint / 10;
+ if (waitTime < 1000)
+ waitTime = 1000;
+ else if (waitTime > 10000)
+ waitTime = 10000;
+
+ ::Sleep(waitTime);
+
+ // Check the status until the service is no longer stop pending.
+ if (!::QueryServiceStatusEx(svc,
+ SC_STATUS_PROCESS_INFO,
+ (LPBYTE) &ssStatus,
+ sizeof(ssStatus),
+ &bytesNeeded))
+ throw QPID_WINDOWS_ERROR(::GetLastError());
+
+ if (ssStatus.dwCheckPoint > oldCheckPoint) {
+ // Continue to wait and check.
+ startTickCount = ::GetTickCount();
+ oldCheckPoint = ssStatus.dwCheckPoint;
+ } else {
+ if ((::GetTickCount() - startTickCount) > ssStatus.dwWaitHint)
+ break;
+ }
+ }
+ return ssStatus.dwCurrentState;
+}
+
+/**
+ * Get the services that depend on @arg svc. All dependent service info
+ * is returned in an array of ENUM_SERVICE_STATUS structures via @arg deps.
+ *
+ * @retval The number of dependent services.
+ */
+DWORD SCM::getDependentServices(SC_HANDLE svc,
+ std::auto_ptr<ENUM_SERVICE_STATUS>& deps)
+{
+ DWORD bytesNeeded;
+ DWORD numEntries;
+
+ // Pass a zero-length buffer to get the required buffer size.
+ if (::EnumDependentServices(svc,
+ SERVICE_ACTIVE,
+ 0,
+ 0,
+ &bytesNeeded,
+ &numEntries)) {
+ // If the Enum call succeeds, then there are no dependent
+ // services, so do nothing.
+ return 0;
+ }
+
+ if (::GetLastError() != ERROR_MORE_DATA)
+ throw QPID_WINDOWS_ERROR((::GetLastError()));
+
+ // Allocate a buffer for the dependencies.
+ deps.reset((LPENUM_SERVICE_STATUS)(new char[bytesNeeded]));
+ // Enumerate the dependencies.
+ if (!::EnumDependentServices(svc,
+ SERVICE_ACTIVE,
+ deps.get(),
+ bytesNeeded,
+ &bytesNeeded,
+ &numEntries))
+ throw QPID_WINDOWS_ERROR((::GetLastError()));
+ return numEntries;
+}
+
+} } // namespace qpid::windows
diff --git a/cpp/xml/cluster.xml b/cpp/xml/cluster.xml
index 7b3f2fe63b..f9b8caf185 100644
--- a/cpp/xml/cluster.xml
+++ b/cpp/xml/cluster.xml
@@ -326,6 +326,12 @@
<field name="dequeueSincePurge" type="uint32"/>
</control>
+ <!-- Replicate the internal state for an object - e.g. Links, bridges, etc -->
+ <control name="internal-state" code="0x42">
+ <field name="type" type="str8"/> <!-- The type of object the state is for (e.g. 'link') -->
+ <field name="name" type="str8"/> <!-- Identifies the particular object to be updated -->
+ <field name="state" type="map"/> <!-- The internal state for the object -->
+ </control>
</class>
diff --git a/doc/book/Makefile b/doc/book/Makefile
index db160ac6f8..8a3d4974db 100644
--- a/doc/book/Makefile
+++ b/doc/book/Makefile
@@ -17,37 +17,22 @@
# under the License.
#
-#
-# This Makefile requires the following:
-#
-# Apache FOP, version 0.95 or higher
-# Docbook 4.5
-# Docbook XSL stylesheets - tested with xsl-stylesheets (1.75.2 and 1.65.1-2)
-# xsltproc
-# xmllint
-#
-
-all: cpp java programming
+DIRS = src/java-broker src/cpp-broker src/programming
-cpp: build/AMQP-Messaging-Broker-CPP-Book
-java: build/AMQP-Messaging-Broker-Java-Book
+.PHONY: all $(DIRS)
-programming: build/Programming-In-Apache-Qpid
+all: $(DIRS)
-qmf: build/QmfBook
-
-build/AMQP-Messaging-Broker-CPP-Book:
- ./build-book.sh AMQP-Messaging-Broker-CPP-Book
+clean:
+ rm -rf build
-build/AMQP-Messaging-Broker-Java-Book:
- ./build-book.sh AMQP-Messaging-Broker-Java-Book
+html: TARGET = html
+html: all
-build/Programming-In-Apache-Qpid:
- ./build-book.sh Programming-In-Apache-Qpid
+pdf: TARGET = pdf
+pdf: all
-build/QmfBook: src/QmfBook.xml src/QmfIntroduction.xml
- ./build-book.sh QmfBook
+$(DIRS):
+ $(MAKE) -C $@ $(TARGET) OUTPUTDIR=../../build/
-clean:
- rm -rf build
diff --git a/doc/book/README.txt b/doc/book/README.txt
deleted file mode 100644
index 1fc99c94a0..0000000000
--- a/doc/book/README.txt
+++ /dev/null
@@ -1,118 +0,0 @@
-The documentation in this directory is written in DocBook 4.5. The
-original content was taken from the Apache Qpid Wiki.
-
-1. Building the Documentation
-
-You need the following to build the documentation:
-
-- Apache FOP, version 0.95 or higher
-- Docbook 4.5
-- Docbook XSL stylesheets - Tested with xsl-stylesheets (1.75.2 & 1.65.1-2)
-- xsltproc
-- xmllint
-
-On many Linux machines, these can usually be installed from standard
-repos. For instance, on Fedora they can be installed as follows:
-
-$ sudo yum install fop docbook-dtds docbook-style-xsl libxslt libxml2
-
-After installing, use make to build the documentation:
-
-$ make
-
-The Makefile supports the following targets:
-
-all Builds the cpp, java, and programming targets.
-cpp Build html+pdf for the C++ broker.
-java Build html+pdf for the Java broker.
-programming Build html+pdf for Programming In Apache Qpid.
-clean Delete the build directory
-
-
-You will see quite a few error messages. Many of these are due to
-unresolved links, and these should go away. Many are due to the
-verbosity of Apache FOP, which generates many warnings.
-
-2. Editing Tools
-
-For Emacs, I like nxml-mode, especially if you learn how to use tag
-completion, outlining, etc. This is described in some detail in
-http://www.dpawson.co.uk/relaxng/nxml/info.html.
-
-For vi, the macros described in this Linux Journal article may be
-helpful: http://www.linuxjournal.com/article/7737.
-
-Commercial XML editors provide good support for DocBook. On Windows, I
-like Stylus Studio (http://www.stylusstudio.com/). On Linux, I like
-Oxygen (http://www.oxygenxml.com/).
-
-Here's a page on authoring tools for DocBook:
-http://wiki.docbook.org/topic/DocBookAuthoringTools
-
-
-3. File Structure
-
-The source files are in qpid/doc/book/src.
-
-The following XInclude tree shows the organization of files in the
-document.
-
-Book.xml
- Book-Info.xml
- Introduction.xml
- AMQP.xml
- Getting-Started.xml
- Download.xml
- AMQP-Messaging-Broker-CPP.xml
- Running-CPP-Broker.xml
- Cheat-Sheet-for-configuring-Queue-Options.xml
- Cheat-Sheet-for-configuring-Exchange-Options.xml
- Using-Broker-Federation.xml
- SSL.xml
- LVQ.xml
- queue-state-replication.xml
- Starting-a-cluster.xml
- ACL.xml
- Managing-CPP-Broker.xml
- QMan-Qpid-Management-bridge.xml
- Qpid-Management-Framework.xml
- Management-Design-notes.xml
- QMF-Python-Console-Tutorial.xml
- AMQP-Messaging-Broker-Java.xml
- Java-Broker-Feature-Guide.xml
- Qpid-Java-FAQ.xml
- Java-Environment-Variables.xml
- Qpid-Troubleshooting-Guide.xml
- Add-New-Users.xml
- Configure-ACLs.xml
- Configure-Java-Qpid-to-use-a-SSL-connection.xml
- Configure-Log4j-CompositeRolling-Appender.xml
- Configure-the-Broker-via-config.xml.xml
- Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml
- Debug-using-log4j.xml
- How-to-Tune-M3-Java-Broker-Performance.xml
- Qpid-Java-Build-How-To.xml
- Use-Priority-Queues.xml
- Qpid-JMX-Management-Console.xml
- Configuring-Management-Users.xml
- Configuring-Qpid-JMX-Management-Console.xml
- Management-Console-Security.xml
- Qpid-JMX-Management-Console-FAQ.xml
- Qpid-JMX-Management-Console-User-Guide.xml
- Qpid-Management-Features.xml
- MessageStore-Tool.xml
- Qpid-Java-Broker-Management-CLI.xml
- AMQP-Java-JMS-Messaging-Client.xml
- System-Properties.xml
- Connection-URL-Format.xml
- Binding-URL-Format.xml
- AMQP-C++-Messaging-Client.xml
- AMQP-.NET-Messaging-Client.xml
- NET-User-Guide.xml
- Excel-AddIn.xml
- WCF.xml
- AMQP-Python-Messaging-Client.xml
- PythonBrokerTest.xml
- AMQP-Ruby-Messaging-Client.xml
- AMQP-Compatibility.xml
- Qpid-Interoperability-Documentation.xml
diff --git a/doc/book/build-book.sh b/doc/book/build-book.sh
deleted file mode 100755
index 5cc02b9fd8..0000000000
--- a/doc/book/build-book.sh
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/bin/bash -ex
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-########################################################################
-#
-# Build a PDF and HTML for a single chapter or section
-#
-# Specify the name of the XML file on the command line, omitting
-# the file extension, e.g.:
-#
-# $ ./build-chapter.sh src/High-Level-API
-#
-########################################################################
-
-# DOCBOOK XSL STYLESHEET LOCATION
-# Fedora, RHEL:
-DOCBOOK_XSL=/usr/share/sgml/docbook/xsl-stylesheets
-# Ubuntu:
-# DOCBOOK_XSL=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh
-# Ubuntu 10.4 installed it here:
-# DOCBOOK_XSL=/usr/share/xml/docbook/stylesheet/docbook-xsl-ns
-
-rm -rf build/$1
-mkdir -p build/$1
-mkdir -p build/$1/html-single
-mkdir -p build/$1/html
-mkdir -p build/$1/pdf
-cp -r src/images build/$1/html-single
-cp -r src/images build/$1/html
-cp -r src/css build/$1/html-single
-cp -r src/css build/$1/html
-
-# Create single-page .html
-xsltproc --xinclude --stringparam section.autolabel 1 --stringparam callout.graphics 0 --stringparam callout.unicode 0 --stringparam section.label.includes.component.label 1 ${DOCBOOK_XSL}/html/docbook.xsl src/$1.xml >build/$1/html-single/$1.html
-
-# Create chunked .html
-INFILE=$(readlink -f src/$1.xml)
-pushd build/$1/html
-xsltproc --xinclude --stringparam chunk.section.depth 1 --stringparam section.autolabel 1 --stringparam callout.graphics 0 --stringparam callout.unicode 0 --stringparam section.label.includes.component.label 1 --stringparam use.id.as.filename 1 --stringparam html.stylesheet css/style.css --stringparam section.autolabel.max.depth 3 --stringparam toc.section.depth 2 --stringparam chunker.output.encoding UTF-8 ${DOCBOOK_XSL}/html/chunk.xsl $INFILE
-popd
-
-# Create the .fo
-xsltproc --xinclude --stringparam section.autolabel 1 --stringparam callout.graphics 0 --stringparam callout.unicode 0 --stringparam section.label.includes.component.label 1 ${DOCBOOK_XSL}/fo/docbook.xsl src/$1.xml >build/$1/pdf/$1.fo
-
-# Use Apache FOP to create the PDF
-fop build/$1/pdf/$1.fo build/$1/pdf/$1.pdf
diff --git a/doc/book/build-chapter.sh b/doc/book/build-chapter.sh
deleted file mode 100755
index a2c2ad3b0c..0000000000
--- a/doc/book/build-chapter.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/bash -ex
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-########################################################################
-#
-# Build a PDF and HTML for a single chapter or section
-#
-# Specify the name of the XML file on the command line, omitting
-# the file extension, e.g.:
-#
-# $ ./build-chapter.sh src/High-Level-API
-#
-########################################################################
-
-rm -rf build
-mkdir -p build
-mkdir -p pdf
-
-
-# Create the .html
-xsltproc --stringparam section.autolabel 1 /usr/share/sgml/docbook/xsl-stylesheets/html/docbook.xsl src/$1.xml >build/$1.html
-
-# Create the .fo
-xsltproc --stringparam section.autolabel 1 /usr/share/sgml/docbook/xsl-stylesheets/fo/docbook.xsl src/$1.xml >build/$1.fo
-
-# Use Apache FOP to create the PDF
-fop build/$1.fo pdf/$1.pdf
diff --git a/doc/book/build.sh b/doc/book/build.sh
deleted file mode 100755
index 249d2c7439..0000000000
--- a/doc/book/build.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash -ex
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-########################################################################
-#
-# Build a PDF from Docbook XML
-#
-# The Makefile is cleaner ....
-#
-########################################################################
-
-rm -rf build
-mkdir -p build
-mkdir -p pdf
-
-# Assemble all documents using XInclude
-xmllint --xinclude src/Book.xml >build/qpid-book.xml
-
-# Create the .fo
-xsltproc /usr/share/sgml/docbook/xsl-stylesheets/fo/docbook.xsl build/qpid-book.xml >build/qpid-book.fo
-
-# Use Apache FOP to create the PDF
-fop build/qpid-book.fo pdf/qpid-book.pdf
diff --git a/doc/book/build.xml b/doc/book/build.xml
deleted file mode 100644
index 5acd97f982..0000000000
--- a/doc/book/build.xml
+++ /dev/null
@@ -1,193 +0,0 @@
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
- - or more contributor license agreements. See the NOTICE file
- - distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
- -->
-<!--
- Build Apache Qpid documentation.
-
- For documentation on using XSLT in ant, see http://ant.apache.org/manual/CoreTasks/style.html
-
- For documentation on using Apache FOP in ant, see http://xmlgraphics.apache.org/fop/0.94/anttask.html
-
- Note: Validation is currently off by default, too many dangling references. We will tighten this up as soon as we can.
- -->
-
-<project
- name="generate"
- basedir="."
- default="pdf">
-
- <property name="Qpid" value="http://qpid.apache.org"/>
-
-
-<!--
-###########################################################################
-#
-# Directories
-#
-# Change the directory paths in this section to the correct paths for
-# your machine.
-#
-###########################################################################
--->
-
- <property name="src.dir" location="src"/>
- <property name="build.dir" location="build"/>
- <property name="out.dir" location="out"/>
-
- <!-- Docbook schemas and stylesheets -->
- <property name="schema.dir" location="docbook"/>
- <property name="style.dir" location="docbook-xsl"/>
- <property name="fo.stylesheet" location="${style.dir}/fo/docbook.xsl" />
- <property name="html.stylesheet" location="${style.dir}/html/docbook.xsl" />
-
- <!-- ${lib.dir} has subdirectories for saxon and fop -->
- <property name="lib.dir" location="lib"/>
-
- <property name="xmllint" location="/usr/bin/xmllint"/>
-
-<!--
-###########################################################################
-#
-# Setting up tasks
-#
-# You shouldn't need to change anything in this section or following sections.
-#
-###########################################################################
--->
-
- <path id="saxon6.classpath">
- <pathelement location="${lib.dir}/saxon/resolver.jar"/>
- <pathelement location="${lib.dir}/saxon/xml-apis.jar"/>
- <pathelement location="${lib.dir}/saxon/xercesImpl.jar"/>
- <pathelement location="${lib.dir}/saxon/saxon.jar"/>
- </path>
-
-<taskdef name="fop"
- classname="org.apache.fop.tools.anttasks.Fop">
- <classpath>
- <fileset dir="${lib.dir}/fop-0.95/lib">
- <include name="*.jar"/>
- </fileset>
- <fileset dir="${lib.dir}/fop-0.95/build">
- <include name="fop.jar"/>
- <include name="fop-hyph.jar" />
- </fileset>
- </classpath>
-</taskdef>
-
-<!--
-###########################################################################
-#
-# Tasks
-#
-###########################################################################
--->
-
-<!--
- init
--->
-
-<target name="init">
- <mkdir dir="${build.dir}"/>
- <mkdir dir="${out.dir}"/>
-</target>
-
-<!--
- XInclude
--->
-
-<target name="xinclude" depends="init">
- <exec executable="${xmllint}">
- <arg value="-o"/>
- <arg value="${build.dir}/xinclude.xml"/>
- <arg value="--xinclude"/>
- <arg value="${src.dir}/Book.xml"/>
- </exec>
-</target>
-
-
-
-<!--
- FO
--->
-
- <target name="fo" depends="xinclude" description="Generates qpid-book.fo, which is needed to create a PDF">
-
- <xslt in="${build.dir}/xinclude.xml" out="${build.dir}/qpid-book.fo"
- style="${fo.stylesheet}" classpathref="saxon6.classpath">
- <param name="specdoc" expression="${spec.code}"/>
- <param name="uri" expression="${spec.uri}"/>
- </xslt>
- </target>
-
-
-<!--
- PDF
--->
-
-<target name="pdf" depends="fo" description="Generates qpid-book.pdf">
- <fop format="application/pdf"
- fofile="${build.dir}/qpid-book.fo"
- outfile="${out.dir}/qpid-book.pdf"/>
-</target
->
-<!--
- HTML
--->
-
- <target name="html" depends="xinclude" description="Generates qpid-book.html">
- <xslt in="${build.dir}/xinclude.xml" out="${out.dir}/qpid-book.html"
- style="${html.stylesheet}" classpathref="saxon6.classpath">
- </xslt>
- </target>
-
-<!--
- Validate
--->
-
-<target name="validate" depends="xinclude">
- <xmlvalidate file="${build.dir}/xinclude.xml" warn="true">
- <dtd publicId="-//OASIS//DTD DocBook V4.5//EN"
- location="docbook/docbook.dtd"/>
- </xmlvalidate>
-</target>
-
-<!--
- Clean
--->
-
-<target name="clean">
- <delete dir="${build.dir}"/>
-</target>
-
-<!--
- Check
--->
-
-<target name="check" depends="xinclude">
- <xmlvalidate file="${build.dir}/xinclude.xml" warn="false">
- <dtd publicId="-//OASIS//DTD DocBook V4.5//EN"
- location="docbook/docbook.dtd"/>
- </xmlvalidate>
-</target>
-
-
-</project>
-
diff --git a/doc/book/src/AMQP-Messaging-Broker-CPP-Book.xml b/doc/book/src/AMQP-Messaging-Broker-CPP-Book.xml
deleted file mode 100644
index 10d83ec887..0000000000
--- a/doc/book/src/AMQP-Messaging-Broker-CPP-Book.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<book>
- <title>AMQP Messaging Broker (Implemented in C++)</title>
- <preface>
- <title>Introduction</title>
-
- <para>Qpid provides two AMQP messaging brokers:</para>
-
- <itemizedlist>
- <listitem><para>Implemented in C++ - high performance, low latency, and RDMA support.</para></listitem>
- <listitem><para>Implemented in Java - Fully JMS compliant, runs on any Java platform.</para></listitem>
- </itemizedlist>
-
- <para>Both AMQP messaging brokers support clients in multiple
- languages, as long as the messaging client and the messaging
- broker use the same version of AMQP. See <link
- linkend="AMQP-Compatibility">AMQP Compatibility</link> to see
- which messaging clients work with each broker.</para>
-
- <para>This manual contains information specific to the broker that is implemented in C++.</para>
- </preface>
-
-<chapter>
- <title>
- Running the AMQP Messaging Broker
- </title>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Running-CPP-Broker.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Cheat-Sheet-for-configuring-Queue-Options.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Cheat-Sheet-for-configuring-Exchange-Options.xml"/>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Using-Broker-Federation.xml"/>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Security.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="LVQ.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="queue-state-replication.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Starting-a-cluster.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="producer-flow-control.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="AMQP-Compatibility.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-Interoperability-Documentation.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Using-message-groups.xml"/>
-
-</chapter>
-
-
-<chapter id="chapter-Managing-CPP-Broker">
- <title>
- Managing the AMQP Messaging Broker
- </title>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Managing-CPP-Broker.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-Management-Framework.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="QMF-Python-Console-Tutorial.xml"/>
-</chapter>
-</book>
diff --git a/doc/book/src/AMQP-Messaging-Broker-CPP.xml b/doc/book/src/AMQP-Messaging-Broker-CPP.xml
deleted file mode 100644
index 92b474b0c0..0000000000
--- a/doc/book/src/AMQP-Messaging-Broker-CPP.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<part>
- <title>AMQP Messaging Broker (Implemented in C++)</title>
- <partintro>
- <para>Qpid provides two AMQP messaging brokers:</para>
-
- <itemizedlist>
- <listitem><para>Implemented in C++ - high performance, low latency, and RDMA support.</para></listitem>
- <listitem><para>Implemented in Java - Fully JMS compliant, runs on any Java platform.</para></listitem>
- </itemizedlist>
-
- <para>Both AMQP messaging brokers support clients in multiple languages, as long as the messaging client and the messaging broker use the same version of AMQP. See <link linkend="AMQP-Compatibility"/> to see which messaging clients work with each broker.</para>
-
- <para>This section contains information specific to the broker that is implemented in C++.</para>
- </partintro>
-
-<chapter>
- <title>
- Running the AMQP Messaging Broker
- </title>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Running-CPP-Broker.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Cheat-Sheet-for-configuring-Queue-Options.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Cheat-Sheet-for-configuring-Exchange-Options.xml"/>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Using-Broker-Federation.xml"/>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="SSL.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="LVQ.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="queue-state-replication.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Starting-a-cluster.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="ACL.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="producer-flow-control.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Using-message-groups.xml"/>
-</chapter>
-
-
-<chapter id="chapter-Managing-CPP-Broker">
- <title>
- Managing the AMQP Messaging Broker
- </title>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Managing-CPP-Broker.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="QMan-Qpid-Management-bridge.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-Management-Framework.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Management-Design-notes.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="QMF-Python-Console-Tutorial.xml"/>
-</chapter>
-</part>
diff --git a/doc/book/src/AMQP-Messaging-Broker-Java.xml b/doc/book/src/AMQP-Messaging-Broker-Java.xml
deleted file mode 100644
index 6cd7ce915e..0000000000
--- a/doc/book/src/AMQP-Messaging-Broker-Java.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<part id="Java-Broker">
- <title>AMQP Messaging Broker (Implemented in Java)</title>
- <partintro>
- <para>Qpid provides two AMQP messaging brokers:</para>
-
- <itemizedlist>
- <listitem><para>Implemented in C++ - high performance, low latency, and RDMA support.</para></listitem>
- <listitem><para>Implemented in Java - Fully JMS compliant, runs on any Java platform.</para></listitem>
- </itemizedlist>
-
- <para>Both AMQP messaging brokers support clients in multiple languages, as long as the messaging client and the messaging broker use the same version of AMQP. See <link linkend="AMQP-Compatibility"/> to see which messaging clients work with each broker.</para>
-
- <para>This section contains information specific to the broker that is implemented in Java.</para>
- </partintro>
-
-<chapter id="Java-General-User-Guides">
- <title>General User Guides</title>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Java-Broker-Feature-Guide.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-Java-FAQ.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Java-Environment-Variables.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-Troubleshooting-Guide.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Broker-Configuration-Guide.xml"/>
-</chapter>
-
-<chapter id="Qpid-Java-Broker-HowTos">
-<title>How Tos</title>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Add-New-Users.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Configure-ACLs.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Configure-Java-Qpid-to-use-a-SSL-connection.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Configure-Log4j-CompositeRolling-Appender.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Configure-the-Broker-via-config.xml.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Debug-using-log4j.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="How-to-Tune-M3-Java-Broker-Performance.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-Java-Build-How-To.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Use-Priority-Queues.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="How-to-Use-SlowConsumerDisconnect.xml"/>
-</chapter>
-
-
-<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-JMX-Management-Console.xml"/>
-
-<chapter id="QpidJavaBroker-ManagementTools">
-<title>Management Tools</title>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="MessageStore-Tool.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-Java-Broker-Management-CLI.xml"/>
-</chapter>
-</part>
diff --git a/doc/book/src/Broker-Configuration-Guide.xml b/doc/book/src/Broker-Configuration-Guide.xml
deleted file mode 100644
index 63d2748eee..0000000000
--- a/doc/book/src/Broker-Configuration-Guide.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<section id="Java-Broker-Configuration-Guide">
- <title>Broker Configuration Guide </title>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
- href="java/broker/configuration/Topic-Configuration.xml"/>
-</section>
diff --git a/doc/book/src/How-to-Use-JNDI.xml b/doc/book/src/How-to-Use-JNDI.xml
deleted file mode 100644
index 74506dde0f..0000000000
--- a/doc/book/src/How-to-Use-JNDI.xml
+++ /dev/null
@@ -1,175 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<chapter id="How-to-Use-JNDI">
- <title>
- How to Use JNDI
- </title>
- <section role="h2" id="HowtoUseJNDI-HowtousethePropertiesFileInitialContextFactory">
- <title>
- How to use the PropertiesFileInitialContextFactory
- </title>
-
- <para>
- This ContextFactory uses a java properties formatted file to
- setup initial values.
- </para>
- <section role="h3" id="HowtoUseJNDI-JNDIPropertysetup">
- <title>
- JNDI Property setup
- </title>
- <para>
- By setting the JNDI Initial Context Factory and URL as
- below it is possible to load any File from the locally
- mounted file system to use for JNDI purposes. The format
- of the file is described in the next section.
- </para>
- <programlisting>
-java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
-java.naming.provider.url = &lt;path to JNDI File&gt;
-</programlisting>
- <para>
- By simply setting these two system properties you can jump
- straight to the InitialContext creation in your code.
- </para>
- </section>
- <section role="h3" id="HowtoUseJNDI-Examplepropertiesfile">
- <title>
- Example properties file </title>
- <para>
- This is the example properties file.
- </para>
- <programlisting>
-# register some connection factories
-# connectionfactory.[jndiname] = [ConnectionURL]
-connectionfactory.local = amqp://guest:guest@clientid/testpath?brokerlist='vm://:1'
-
-# register some queues in JNDI using the form
-# queue.[jndiName] = [physicalName]
-queue.MyQueue = example.MyQueue
-
-# register some topics in JNDI using the form
-# topic.[jndiName] = [physicalName]
-topic.ibmStocks = stocks.nyse.ibm
-
-# Register an AMQP destination in JNDI
-# NOTE: Qpid currently only supports direct,topics and headers
-# destination.[jniName] = [BindingURL]
-destination.direct = direct://amq.direct//directQueue
-</programlisting>
- <para>
- The property file allows a number of queues to be defined that
- can then be discovered via JNDI. There are four properties used
- by the PFICFactory.
- <emphasis>connectionfactory.&lt;jndiname&gt;</emphasis> this is the <xref linkend="Connection-URL-Format"/> that the connection
- factory will use to perform connections.
- <emphasis>queue.&lt;jndiname&gt;</emphasis> this defines a jms queue or in
- amqp a amq.direct exchange
- <emphasis>topic.&lt;jndiname&gt;</emphasis> this defines a jms topic or in
- amqp a amq.topic exchange
- <emphasis>destination.&lt;jndiname&gt;</emphasis> this takes a <xref linkend="BindingURLFormat"/>
- and so can be used for defining all amq destinations, queues,
- topics and header matching.
- </para><para>
- In all of these properties the <emphasis>&lt;jndiname&gt;</emphasis> is the
- string value that would be given when performing a lookup.
- </para><para>
- <emphasis>NOTE</emphasis>: This does not create the queue on the broker. You
- should ensure that you have created the queue before publishing
- to it. Queues can be declared in the virtualhosts.xml file so
- that they are created on broker startup, or created dynamically
- by consuming clients. Topics and other destinations that use
- temporary queues cannot be created in this way, so a consumer
- must be created first before publishing messages with mandatory
- routing.
- </para>
- </section>
- <section role="h3" id="HowtoUseJNDI-Examplelookupcode">
- <title>
- Example lookup code
- </title><!--h3-->
-
- <para>
- The <emphasis>bindingValue</emphasis> is the String that would be placed in
- <emphasis>&lt;jndiname&gt;</emphasis> above.
- </para>
-
- <example>
- <title>Simple JNDI lookup using files</title>
- <programlisting>
-//Ensure you have your system properties set
-final String INITIAL_CONTEXT_FACTORY = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory";
-
-System.setProperty(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
-System.setProperty(Context.PROVIDER_URL, _JNDIFile);
-
-// Create the initial context
-Context ctx = new InitialContext();
-
-// Perform the binds
-object = ctx.lookup(bindingValue);
-
-// Close the context when we're done
-ctx.close();
-</programlisting>
-</example>
-
-<example>
-<title>Simple JNDI lookup using properties</title>
-
- <programlisting>
-
-final String INITIAL_CONTEXT_FACTORY = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory";
-
-final String CONNECTION_JNDI_NAME = "local";
-final String CONNECTION_NAME = "amqp://guest:guest@clientid/testpath?brokerlist='vm://:1'";
-
-final String QUEUE_JNDI_NAME = "queue";
-final String QUEUE_NAME = "example.MyQueue";
-
-// Set the properties ...
-Properties properties = new Properties();
-properties.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
-properties.put("connectionfactory."+CONNECTION_JNDI_NAME , CONNECTION_NAME);
-properties.put("queue."+QUEUE_JNDI_NAME , QUEUE_NAME);
-
-// Create the initial context
-Context ctx = new InitialContext(properties);
-
-// Perform the lookups
-ConnectionFactory factory = (ConnectionFactory)ctx.lookup(CONNECTION_JNDI_NAME);
-Queue queue = (Queue)ctx.lookup(QUEUE_JNDI_NAME);
-
-// Close the context when we're done
-ctx.close();
-</programlisting>
-</example>
- </section>
-
- <section>
- <title>Using Qpid with Other JNDI Providers</title>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Using Qpid with other JNDI Providers.xml"/>
- </section>
-<!--h2-->
- </section>
-
-</chapter>
diff --git a/doc/book/src/LVQ.xml b/doc/book/src/LVQ.xml
deleted file mode 100644
index 4e818881ad..0000000000
--- a/doc/book/src/LVQ.xml
+++ /dev/null
@@ -1,182 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<section>
- <title>LVQ - Last Value Queue</title>
-
- <section role="h2" id="LVQ-UnderstandingLVQ">
- <title>Understanding LVQ</title>
- <para>
- A Last Value Queue is configured with the name of a message header that
- is used as a key. The queue behaves as a normal FIFO queue with the
- exception that when a message is enqueued, any other message in the
- queue with the same value in the key header is removed and discarded.
- Thus, for any given key value, the queue holds only the most recent
- message.
- </para>
- <para>
- The following example illustrates the operation of a Last Value Queue.
- The example shows an empty queue with no consumers and a sequence of
- produced messages. The numbers represent the key for each message.
- </para>
- <programlisting>
- &lt;empty queue&gt;
- 1 =>
- 1
- 2 =>
- 1 2
- 3 =>
- 1 2 3
- 4 =>
- 1 2 3 4
- 2 =>
- 1 3 4 2
- 1 =>
- 3 4 2 1
- </programlisting>
- <para>
- Note that the first four messages are enqueued normally in FIFO order.
- The fifth message has key '2' and is also enqueued on the tail of the
- queue. However the message already in the queue with the same key is
- discarded.
- <note>
- <para>
- If the set of keys used in the messages in a LVQ is constrained, the
- number of messages in the queue shall not exceed the number of
- distinct keys in use.
- </para>
- </note>
- </para>
- <section role="h3" id="LVQ-UnderstandingLVQ-UseCases">
- <title>Common Use-Cases</title>
- <itemizedlist>
- <listitem>
- <para>
- LVQ with zero or one consuming subscriptions - In this case, if
- the consumer drops momentarily or is slower than the producer(s),
- it will only receive current information relative to the message
- keys.
- </para>
- </listitem>
- <listitem>
- <para>
- LVQ with zero or more browsing subscriptions - A browsing consumer
- can subscribe to the LVQ and get an immediate dump of all of the
- "current" messages and track updates thereafter. Any number of
- independent browsers can subscribe to the same LVQ with the same
- effect. Since messages are never consumed, they only disappear
- when replaced with a newer message with the same key or when their
- TTL expires.
- </para>
- </listitem>
- </itemizedlist>
- </section>
- </section>
-
- <section role="h2" id="LVQ-Creating">
- <title>Creating a Last Value Queue</title>
- <section role="h3" id="LVQ-Creating-Address">
- <title>Using Addressing Syntax</title>
- <para>
- A LVQ may be created using directives in the API's address syntax.
- The important argument is "qpid.last_value_queue_key". The following
- Python example shows how a producer of stock price updates can create
- a LVQ to hold the latest stock prices for each ticker symbol. The
- message header used to hold the ticker symbol is called "ticker".
- </para>
- <programlisting>
- conn = Connection(url)
- conn.open()
- sess = conn.session()
- tx = sess.sender("prices;{create:always, node:{type:queue, x-declare:{arguments:{'qpid.last_value_queue_key':'ticker'}}}}")
- </programlisting>
- </section>
- <section role="h3" id="LVQ-Creating-Tool">
- <title>Using qpid-config</title>
- <para>
- The same LVQ as shown in the previous example can be created using the
- qpid-config utility:
- </para>
- <programlisting>
- $ qpid-config add queue prices --argument qpid.last_value_queue_key=ticker
- </programlisting>
- </section>
- </section>
-
- <section role="h2" id="LVQ-Example">
- <title>LVQ Example</title>
-
- <section role="h3" id="LVQ-Example-Sender">
- <title>LVQ Sender</title>
- <programlisting>
- from qpid.messaging import Connection, Message
-
- def send(sender, key, message):
- message.properties["key"] = key
- sender.send(message)
-
- conn = Connection("localhost")
- conn.open()
- sess = conn.session()
- tx = sess.sender("topic;{create:always, node:{type:queue,x-declare:{arguments:{'qpid.last_value_queue_key':key}}}}")
-
- msg = Message("Content")
- send(tx, "key1", msg);
- send(tx, "key2", msg);
- send(tx, "key3", msg);
- send(tx, "key4", msg);
- send(tx, "key2", msg);
- send(tx, "key1", msg);
-
- conn.close()
- </programlisting>
- </section>
-
- <section role="h3" id="LVQ-Example-Receiver">
- <title>LVQ Browsing Receiver</title>
- <programlisting>
- from qpid.messaging import Connection, Message
- from time import sleep
-
- conn = Connection("localhost")
- conn.open()
- sess = conn.session()
- rx = sess.receiver("topic;{mode:browse}")
-
- while True:
- msg = rx.fetch()
- sess.acknowledge()
- print msg
- </programlisting>
- </section>
- </section>
-
- <section role="h2" id="LVQ-Deprecated">
- <title>Deprecated LVQ Modes</title>
- <para>
- There are two legacy modes (still implemented as of Qpid 0.14)
- controlled by the qpid.last_value_queue and
- qpid.last_value_queue_no_browse argument values. These modes are
- intended to be deprecated and should not be used.
- </para>
- </section>
-</section>
diff --git a/doc/book/src/Makefile.inc b/doc/book/src/Makefile.inc
new file mode 100644
index 0000000000..12cab54f8a
--- /dev/null
+++ b/doc/book/src/Makefile.inc
@@ -0,0 +1,63 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+BOOK=$(wildcard *Book.xml)
+XML=$(wildcard *.xml) $(wildcard ../common/*.xml)
+IMAGES=$(wildcard images/*.png)
+CSS=$(wilcard ../common/css/*.css)
+
+OUTPUTDIR=output
+OUTPUT= $(BOOK:%.xml=$(OUTPUTDIR)/%/)
+
+all: html pdf
+
+pdf: $(OUTPUT)/pdf $(BOOK:%.xml=$(OUTPUT)/pdf/%.pdf)
+
+html: $(OUTPUT)/html $(BOOK:%.xml=$(OUTPUT)/html/index.html)
+
+$(OUTPUT)/html/images: $(IMAGES)
+ -mkdir -p $(OUTPUT)/html/images
+ -cp images/*.png $(OUTPUT)/html/images/
+
+$(OUTPUT)/html/css: $(CSS)
+ -mkdir -p $(OUTPUT)/html/css
+ -cp ../common/css/*.css $(OUTPUT)/html/css
+
+$(OUTPUT)/html:
+ -mkdir -p $(OUTPUT)/html
+
+$(OUTPUT)/pdf:
+ -mkdir -p $(OUTPUT)/pdf
+
+$(OUTPUT)/html/index.html: $(BOOK) $(OUTPUT)/html/css $(OUTPUT)/html/images $(XML)
+ xsltproc -o $(OUTPUT)/html/ --xinclude --stringparam chunk.section.depth 1 --stringparam section.autolabel 1 --stringparam callout.graphics 0 --stringparam callout.unicode 0 --stringparam section.label.includes.component.label 1 --stringparam use.id.as.filename 1 --stringparam html.stylesheet css/style.css --stringparam section.autolabel.max.depth 3 --stringparam toc.section.depth 2 --stringparam chunker.output.encoding UTF-8 --stringparam css.decoration 0 ../../xsl/html-custom.xsl $<
+
+%.fo: %.xml
+ xsltproc --xinclude --stringparam section.autolabel 1 --stringparam callout.graphics 0 --stringparam callout.unicode 0 --stringparam section.label.includes.component.label 1 http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl $< > $@
+
+
+%.pdf: %.fo
+ fop $< $@
+
+$(OUTPUT)/pdf/%.pdf: %.pdf
+ @mv $< $@
+
+clean:
+ -rm -rf $(OUTPUT) *.fo
+
diff --git a/doc/book/src/Management-Console-Security.xml b/doc/book/src/Management-Console-Security.xml
deleted file mode 100644
index aa7bebb09e..0000000000
--- a/doc/book/src/Management-Console-Security.xml
+++ /dev/null
@@ -1,252 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<section><title>
- Management Console Security
- </title><section role="h1" id="ManagementConsoleSecurity-ManagementConsoleSecurity"><title>
- Management
- Console Security
- </title>
- <itemizedlist>
- <listitem><para>
- <xref linkend="ManagementConsoleSecurity-SSLencryptedRMI-280.5andabove-29"/>
- </para></listitem>
- <listitem><para>
- <xref linkend="ManagementConsoleSecurity-JMXMP-28M4andprevious-29"/>
- </para></listitem>
- <listitem><para>
- <xref linkend="ManagementConsoleSecurity-UserAccounts-26AccessRights"/>
- </para></listitem>
- </itemizedlist>
- <section role="h2" id="ManagementConsoleSecurity-SSLencryptedRMI-280.5andabove-29"><title>
- SSL
- encrypted RMI (0.5 and above)
- </title>
- <para>
- Current versions of the broker make use of SSL encryption to
- secure their RMI based JMX ConnectorServer for security purposes.
- This ships enabled by default, although the test SSL keystore
- used during development is not provided for security reasons
- (using this would provide no security as anyone could have access
- to it).
- </para><section role="h3" id="ManagementConsoleSecurity-BrokerConfiguration"><title>
- Broker
- Configuration
- </title>
-
- <para>
- The broker configuration must be updated before the broker will
- start. This can be done either by disabling the SSL support,
- utilizing a purchased SSL certificate to create a keystore of
- your own, or using the example 'create-example-ssl-stores' script
- in the brokers bin/ directory to generate a self-signed keystore.
- </para><para>
- The broker must be configured with a keystore containing the
- private and public keys associated with its SSL certificate. This
- is accomplished by setting the Java environment properties
- <emphasis>javax.net.ssl.keyStore</emphasis> and
- <emphasis>javax.net.ssl.keyStorePassword</emphasis> respectively with the
- location and password of an appropriate SSL keystore. Entries for
- these properties exist in the brokers main configuration file
- alongside the other management settings (see below), although the
- command line options will still work and take precedence over the
- configuration file.
- </para>
- <programlisting>
-&lt;management&gt;
- &lt;ssl&gt;
- &lt;enabled&gt;true&lt;/enabled&gt;
- &lt;!-- Update below path to your keystore location, eg ${conf}/qpid.keystore --&gt;
- &lt;keyStorePath&gt;${prefix}/../test_resources/ssl/keystore.jks&lt;/keyStorePath&gt;
- &lt;keyStorePassword&gt;password&lt;/keyStorePassword&gt;
- &lt;/ssl&gt;
-&lt;/management&gt;
-</programlisting>
-<!--h3--></section>
-
- <section role="h3" id="ManagementConsoleSecurity-JMXManagementConsoleConfiguration"><title>
- JMX
- Management Console Configuration
- </title>
-
- <para>
- If the broker makes use of an SSL certificate signed by a known
- signing CA (Certification Authority), the management console
- needs no extra configuration, and will make use of Java's
- built-in CA
- truststore for certificate verification (you may however have to
- update the system-wide default truststore if your CA is not
- already present in it).
- </para><para>
- If however you wish to use a self-signed SSL certificate, then
- the management console must be provided with an SSL truststore
- containing a record for the SSL certificate so that it is able to
- validate it when presented by the broker. This is performed by
- setting the <emphasis>javax.net.ssl.trustStore</emphasis> and
- <emphasis>javax.net.ssl.trustStorePassword</emphasis> environment variables
- when starting the console. This can be done at the command line,
- or alternatively an example configuration has been made within
- the console's qpidmc.ini launcher configuration file that may
- pre-configured in advance for repeated usage. See the <xref linkend="Qpid-JMX-Management-Console-User-Guide"/> for more
- information on this configuration process.
- </para>
-<!--h3--></section>
-
- <section role="h3" id="ManagementConsoleSecurity-JConsoleConfiguration"><title>
- JConsole
- Configuration
- </title>
-
- <para>
- As with the JMX Management Console above, if the broker is using
- a self-signed SSL certificate then in order to connect remotely
- using JConsole, an appropriate trust store must be provided at
- startup. See <xref linkend="qpid_JConsole"/> for further details on configuration.
- </para>
-<!--h3--></section>
-
- <section role="h3" id="ManagementConsoleSecurity-AdditionalInformation"><title>
- Additional
- Information
- </title>
-
- <para>
- More information on Java's handling of SSL certificate
- verification and customizing the keystores can be found in the
- <ulink url="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores">http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores</ulink>.
- </para>
-<!--h3--></section>
-<!--h2--></section>
-
-
-
- <section role="h2" id="ManagementConsoleSecurity-JMXMP-28M4andprevious-29"><title>
- JMXMP
- (M4 and previous)
- </title>
-
- <para>
- In previous releases of Qpid (M4 and below) the broker, can make
- use of Sun's Java Management Extensions Messaging Protocol
- (JMXMP) to provide encryption of the JMX connection, offering
- increased security over the default unencrypted RMI based JMX
- connection.
- </para><section role="h3" id="ManagementConsoleSecurity-DownloadandInstall"><title>
- Download and
- Install
- </title>
-
- <para>
- This is possible by adding the jmxremote_optional.jar as provided
- by Sun. This jar is covered by the Sun Binary Code License and is
- not compatible with the Apache License which is why this
- component is not bundled with Qpid.
- </para><para>
- Download the JMX Remote API 1.0.1_04 Reference Implementation
- from <xref linkend="qpid_download.jsp"/>. The included
- 'jmxremote-1_0_1-bin\lib\jmxremote_optional.jar' file must be
- added to the broker classpath:
- </para><para>
- First set your classpath to something like this:
- </para>
- <programlisting>
-CLASSPATH=jmxremote_optional.jar
-</programlisting>
- <para>
- Then, run qpid-server passing the following additional flag:
- </para>
- <programlisting>
-qpid-server -run:external-classpath=first
-</programlisting>
- <para>
- Following this the configuration option can be updated to enabled
- use of the JMXMP based JMXConnectorServer.
- </para>
-<!--h3--></section>
-
- <section role="h3" id="ManagementConsoleSecurity-BrokerConfiguration2"><title>
- Broker
- Configuration
- </title>
-
- <para>
- To enabled this security option change the
- <emphasis>security-enabled</emphasis> value in your broker configuration
- file.
- </para>
- <programlisting>
- &lt;management&gt;
- &lt;security-enabled&gt;true&lt;/security-enabled&gt;
- &lt;/management&gt;
-</programlisting>
- <para>
- You may also (for M2 and earlier) need to set the following
- system properties using the environment variable QPID_OPTS:
- </para><para>
- QPID_OPTS="-Dcom.sun.management.jmxremote
- -Dcom.sun.management.jmxremote.port=8999
- -Dcom.sun.management.jmxremote.authenticate=false
- -Dcom.sun.management.jmxremote.ssl=false"
- </para>
-<!--h3--></section>
-
- <section role="h3" id="ManagementConsoleSecurity-JMXManagementConsoleConfiguration-2"><title>
- JMX
- Management Console Configuration
- </title>
-
- <para>
- If you wish to connect to a broker configured to use JMXMP then
- the console also requires provision of the Optional sections of
- the JMX Remote API that are not included within the JavaSE
- platform.
- </para><para>
- In order to make it available to the console, place the
- 'jmxremote_optional.jar' (rename the file if any additional
- information is present in the file name) jar file within the
- 'plugins/jmxremote.sasl_1.0.1/' folder of the console release (on
- Mac OS X you will need to select 'Show package contents' from the
- context menu whilst selecting the management console bundle in
- order to reveal the inner file tree).
- </para><para>
- Following the the console will automatically load the JMX Remote
- Optional classes and attempt the JMXMP connection when connecting
- to a JMXMP enabled broker.
- </para>
-<!--h3--></section>
-<!--h2--></section>
-
- <section role="h2" id="ManagementConsoleSecurity-UserAccounts-26AccessRights"><title>
- User
- Accounts &amp; Access Rights
- </title>
-
- <para>
- In order to access the management operations via JMX, users must
- have an account and have been assigned appropriate access rights.
- See <xref linkend="qpid_Configuring-Management-Users"/>
- </para>
-<!--h2--></section>
-<!--h1--></section>
-
-
-</section>
diff --git a/doc/book/src/Managing-CPP-Broker.xml b/doc/book/src/Managing-CPP-Broker.xml
deleted file mode 100644
index 2cb4def764..0000000000
--- a/doc/book/src/Managing-CPP-Broker.xml
+++ /dev/null
@@ -1,462 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<section id="section-Managing-CPP-Broker">
- <title> Managing the C++ Broker </title>
- <para>
- There are quite a few ways to interact with the C++ broker. The
- command line tools
- include:
- </para><itemizedlist>
- <listitem><para>qpid-route - used to configure federation (a set of federated
- brokers)
- </para></listitem>
- <listitem><para>qpid-config - used to configure queues, exchanges, bindings
- and list them etc
- </para></listitem>
- <listitem><para>qpid-tool - used to view management information/statistics
- and call any management actions on the broker
- </para></listitem>
- <listitem><para>qpid-printevents - used to receive and print QMF events
- </para></listitem>
- </itemizedlist>
-
- <section role="h3" id="MgmtC-2B-2B-Usingqpidconfig"><title>
- Using qpid-config
- </title>
- <para>
- This utility can be used to create queues exchanges and bindings,
- both durable and transient. Always check for latest options by
- running --help command.
- </para>
- <programlisting>
-$ qpid-config --help
-Usage: qpid-config [OPTIONS]
- qpid-config [OPTIONS] exchanges [filter-string]
- qpid-config [OPTIONS] queues [filter-string]
- qpid-config [OPTIONS] add exchange &lt;type&gt; &lt;name&gt; [AddExchangeOptions]
- qpid-config [OPTIONS] del exchange &lt;name&gt;
- qpid-config [OPTIONS] add queue &lt;name&gt; [AddQueueOptions]
- qpid-config [OPTIONS] del queue &lt;name&gt;
- qpid-config [OPTIONS] bind &lt;exchange-name&gt; &lt;queue-name&gt; [binding-key]
- qpid-config [OPTIONS] unbind &lt;exchange-name&gt; &lt;queue-name&gt; [binding-key]
-
-Options:
- -b [ --bindings ] Show bindings in queue or exchange list
- -a [ --broker-addr ] Address (localhost) Address of qpidd broker
- broker-addr is in the form: [username/password@] hostname | ip-address [:&lt;port&gt;]
- ex: localhost, 10.1.1.7:10000, broker-host:10000, guest/guest@localhost
-
-Add Queue Options:
- --durable Queue is durable
- --cluster-durable Queue becomes durable if there is only one functioning cluster node
- --file-count N (8) Number of files in queue's persistence journal
- --file-size N (24) File size in pages (64Kib/page)
- --max-queue-size N Maximum in-memory queue size as bytes
- --max-queue-count N Maximum in-memory queue size as a number of messages
- --limit-policy [none | reject | flow-to-disk | ring | ring-strict]
- Action taken when queue limit is reached:
- none (default) - Use broker's default policy
- reject - Reject enqueued messages
- flow-to-disk - Page messages to disk
- ring - Replace oldest unacquired message with new
- ring-strict - Replace oldest message, reject if oldest is acquired
- --order [fifo | lvq | lvq-no-browse]
- Set queue ordering policy:
- fifo (default) - First in, first out
- lvq - Last Value Queue ordering, allows queue browsing
- lvq-no-browse - Last Value Queue ordering, browsing clients may lose data
- --generate-queue-events N
- If set to 1, every enqueue will generate an event that can be processed by
- registered listeners (e.g. for replication). If set to 2, events will be
- generated for enqueues and dequeues
-
-Add Exchange Options:
- --durable Exchange is durable
- --sequence Exchange will insert a 'qpid.msg_sequence' field in the message header
- with a value that increments for each message forwarded.
- --ive Exchange will behave as an 'initial-value-exchange', keeping a reference
- to the last message forwarded and enqueuing that message to newly bound
- queues.
-</programlisting>
- <para>
- Get the summary page
- </para>
- <programlisting>
-$ qpid-config
-Total Exchanges: 6
- topic: 2
- headers: 1
- fanout: 1
- direct: 2
- Total Queues: 7
- durable: 0
- non-durable: 7
-</programlisting>
- <para>
- List the queues
- </para>
- <programlisting>
-$ qpid-config queues
-Queue Name Attributes
-=================================================================
-pub_start
-pub_done
-sub_ready
-sub_done
-perftest0 --durable
-reply-dhcp-100-18-254.bos.redhat.com.20713 auto-del excl
-topic-dhcp-100-18-254.bos.redhat.com.20713 auto-del excl
-
-</programlisting>
- <para>
- List the exchanges with bindings
- </para>
- <programlisting>
-$ ./qpid-config -b exchanges
-Exchange '' (direct)
- bind pub_start =&gt; pub_start
- bind pub_done =&gt; pub_done
- bind sub_ready =&gt; sub_ready
- bind sub_done =&gt; sub_done
- bind perftest0 =&gt; perftest0
- bind mgmt-3206ff16-fb29-4a30-82ea-e76f50dd7d15 =&gt; mgmt-3206ff16-fb29-4a30-82ea-e76f50dd7d15
- bind repl-3206ff16-fb29-4a30-82ea-e76f50dd7d15 =&gt; repl-3206ff16-fb29-4a30-82ea-e76f50dd7d15
-Exchange 'amq.direct' (direct)
- bind repl-3206ff16-fb29-4a30-82ea-e76f50dd7d15 =&gt; repl-3206ff16-fb29-4a30-82ea-e76f50dd7d15
- bind repl-df06c7a6-4ce7-426a-9f66-da91a2a6a837 =&gt; repl-df06c7a6-4ce7-426a-9f66-da91a2a6a837
- bind repl-c55915c2-2fda-43ee-9410-b1c1cbb3e4ae =&gt; repl-c55915c2-2fda-43ee-9410-b1c1cbb3e4ae
-Exchange 'amq.topic' (topic)
-Exchange 'amq.fanout' (fanout)
-Exchange 'amq.match' (headers)
-Exchange 'qpid.management' (topic)
- bind mgmt.# =&gt; mgmt-3206ff16-fb29-4a30-82ea-e76f50dd7d15
-</programlisting>
-<!--h3--></section>
-
- <section role="h3" id="MgmtC-2B-2B-Usingqpidroute"><title>
- Using qpid-route
- </title>
- <para>
- This utility is to create federated networks of brokers, This
- allows you for forward messages between brokers in a network.
- Messages can be routed statically (using "qpid-route route add")
- where the bindings that control message forwarding are supplied
- in the route. Message routing can also be dynamic (using
- "qpid-route dynamic add") where the messages are automatically
- forwarded to clients based on their bindings to the local broker.
- </para>
- <programlisting>
-$ qpid-route
-Usage: qpid-route [OPTIONS] dynamic add &lt;dest-broker&gt; &lt;src-broker&gt; &lt;exchange&gt; [tag] [exclude-list]
- qpid-route [OPTIONS] dynamic del &lt;dest-broker&gt; &lt;src-broker&gt; &lt;exchange&gt;
-
- qpid-route [OPTIONS] route add &lt;dest-broker&gt; &lt;src-broker&gt; &lt;exchange&gt; &lt;routing-key&gt; [tag] [exclude-list]
- qpid-route [OPTIONS] route del &lt;dest-broker&gt; &lt;src-broker&gt; &lt;exchange&gt; &lt;routing-key&gt;
- qpid-route [OPTIONS] queue add &lt;dest-broker&gt; &lt;src-broker&gt; &lt;exchange&gt; &lt;queue&gt;
- qpid-route [OPTIONS] queue del &lt;dest-broker&gt; &lt;src-broker&gt; &lt;exchange&gt; &lt;queue&gt;
- qpid-route [OPTIONS] route list [&lt;dest-broker&gt;]
- qpid-route [OPTIONS] route flush [&lt;dest-broker&gt;]
- qpid-route [OPTIONS] route map [&lt;broker&gt;]
-
- qpid-route [OPTIONS] link add &lt;dest-broker&gt; &lt;src-broker&gt;
- qpid-route [OPTIONS] link del &lt;dest-broker&gt; &lt;src-broker&gt;
- qpid-route [OPTIONS] link list [&lt;dest-broker&gt;]
-
-Options:
- -v [ --verbose ] Verbose output
- -q [ --quiet ] Quiet output, don't print duplicate warnings
- -d [ --durable ] Added configuration shall be durable
- -e [ --del-empty-link ] Delete link after deleting last route on the link
- -s [ --src-local ] Make connection to source broker (push route)
- -t &lt;transport&gt; [ --transport &lt;transport&gt;]
- Specify transport to use for links, defaults to tcp
-
- dest-broker and src-broker are in the form: [username/password@] hostname | ip-address [:&lt;port&gt;]
- ex: localhost, 10.1.1.7:10000, broker-host:10000, guest/guest@localhost
-</programlisting>
- <para>
- A few examples:
- </para>
- <programlisting>
-qpid-route dynamic add host1 host2 fed.topic
-qpid-route dynamic add host2 host1 fed.topic
-
-qpid-route -v route add host1 host2 hub1.topic hub2.topic.stock.buy
-qpid-route -v route add host1 host2 hub1.topic hub2.topic.stock.sell
-qpid-route -v route add host1 host2 hub1.topic 'hub2.topic.stock.#'
-qpid-route -v route add host1 host2 hub1.topic 'hub2.#'
-qpid-route -v route add host1 host2 hub1.topic 'hub2.topic.#'
-qpid-route -v route add host1 host2 hub1.topic 'hub2.global.#'
-</programlisting>
- <para>
- The link map feature can be used to display the entire federated
- network configuration by supplying a single broker as an entry
- point:
- </para>
- <programlisting>
-$ qpid-route route map localhost:10001
-
-Finding Linked Brokers:
- localhost:10001... Ok
- localhost:10002... Ok
- localhost:10003... Ok
- localhost:10004... Ok
- localhost:10005... Ok
- localhost:10006... Ok
- localhost:10007... Ok
- localhost:10008... Ok
-
-Dynamic Routes:
-
- Exchange fed.topic:
- localhost:10002 &lt;=&gt; localhost:10001
- localhost:10003 &lt;=&gt; localhost:10002
- localhost:10004 &lt;=&gt; localhost:10002
- localhost:10005 &lt;=&gt; localhost:10002
- localhost:10006 &lt;=&gt; localhost:10005
- localhost:10007 &lt;=&gt; localhost:10006
- localhost:10008 &lt;=&gt; localhost:10006
-
- Exchange fed.direct:
- localhost:10002 =&gt; localhost:10001
- localhost:10004 =&gt; localhost:10003
- localhost:10003 =&gt; localhost:10002
- localhost:10001 =&gt; localhost:10004
-
-Static Routes:
-
- localhost:10003(ex=amq.direct) &lt;= localhost:10005(ex=amq.direct) key=rkey
- localhost:10003(ex=amq.direct) &lt;= localhost:10005(ex=amq.direct) key=rkey2
-</programlisting>
-<!--h3--></section>
-
- <section role="h3" id="MgmtC-2B-2B-Usingqpidtool"><title>
- Using qpid-tool
- </title>
- <para>
- This utility provided a telnet style interface to be able to
- view, list all stats and action
- all the methods. Simple capture below. Best to just play with it
- and mail the list if you have
- questions or want features added.
- </para>
- <programlisting>
-qpid:
-qpid: help
-Management Tool for QPID
-Commands:
- list - Print summary of existing objects by class
- list &lt;className&gt; - Print list of objects of the specified class
- list &lt;className&gt; all - Print contents of all objects of specified class
- list &lt;className&gt; active - Print contents of all non-deleted objects of specified class
- list &lt;list-of-IDs&gt; - Print contents of one or more objects (infer className)
- list &lt;className&gt; &lt;list-of-IDs&gt; - Print contents of one or more objects
- list is space-separated, ranges may be specified (i.e. 1004-1010)
- call &lt;ID&gt; &lt;methodName&gt; &lt;args&gt; - Invoke a method on an object
- schema - Print summary of object classes seen on the target
- schema &lt;className&gt; - Print details of an object class
- set time-format short - Select short timestamp format (default)
- set time-format long - Select long timestamp format
- quit or ^D - Exit the program
-qpid: list
-Management Object Types:
- ObjectType Active Deleted
- ================================
- qpid.binding 21 0
- qpid.broker 1 0
- qpid.client 1 0
- qpid.exchange 6 0
- qpid.queue 13 0
- qpid.session 4 0
- qpid.system 1 0
- qpid.vhost 1 0
-qpid: list qpid.system
-Objects of type qpid.system
- ID Created Destroyed Index
- ==================================
- 1000 21:00:02 - host
-qpid: list 1000
-Object of type qpid.system: (last sample time: 21:26:02)
- Type Element 1000
- =======================================================
- config sysId host
- config osName Linux
- config nodeName localhost.localdomain
- config release 2.6.24.4-64.fc8
- config version #1 SMP Sat Mar 29 09:15:49 EDT 2008
- config machine x86_64
-qpid: schema queue
-Schema for class 'qpid.queue':
- Element Type Unit Access Notes Description
- ===================================================================================================================
- vhostRef reference ReadCreate index
- name short-string ReadCreate index
- durable boolean ReadCreate
- autoDelete boolean ReadCreate
- exclusive boolean ReadCreate
- arguments field-table ReadOnly Arguments supplied in queue.declare
- storeRef reference ReadOnly Reference to persistent queue (if durable)
- msgTotalEnqueues uint64 message Total messages enqueued
- msgTotalDequeues uint64 message Total messages dequeued
- msgTxnEnqueues uint64 message Transactional messages enqueued
- msgTxnDequeues uint64 message Transactional messages dequeued
- msgPersistEnqueues uint64 message Persistent messages enqueued
- msgPersistDequeues uint64 message Persistent messages dequeued
- msgDepth uint32 message Current size of queue in messages
- msgDepthHigh uint32 message Current size of queue in messages (High)
- msgDepthLow uint32 message Current size of queue in messages (Low)
- byteTotalEnqueues uint64 octet Total messages enqueued
- byteTotalDequeues uint64 octet Total messages dequeued
- byteTxnEnqueues uint64 octet Transactional messages enqueued
- byteTxnDequeues uint64 octet Transactional messages dequeued
- bytePersistEnqueues uint64 octet Persistent messages enqueued
- bytePersistDequeues uint64 octet Persistent messages dequeued
- byteDepth uint32 octet Current size of queue in bytes
- byteDepthHigh uint32 octet Current size of queue in bytes (High)
- byteDepthLow uint32 octet Current size of queue in bytes (Low)
- enqueueTxnStarts uint64 transaction Total enqueue transactions started
- enqueueTxnCommits uint64 transaction Total enqueue transactions committed
- enqueueTxnRejects uint64 transaction Total enqueue transactions rejected
- enqueueTxnCount uint32 transaction Current pending enqueue transactions
- enqueueTxnCountHigh uint32 transaction Current pending enqueue transactions (High)
- enqueueTxnCountLow uint32 transaction Current pending enqueue transactions (Low)
- dequeueTxnStarts uint64 transaction Total dequeue transactions started
- dequeueTxnCommits uint64 transaction Total dequeue transactions committed
- dequeueTxnRejects uint64 transaction Total dequeue transactions rejected
- dequeueTxnCount uint32 transaction Current pending dequeue transactions
- dequeueTxnCountHigh uint32 transaction Current pending dequeue transactions (High)
- dequeueTxnCountLow uint32 transaction Current pending dequeue transactions (Low)
- consumers uint32 consumer Current consumers on queue
- consumersHigh uint32 consumer Current consumers on queue (High)
- consumersLow uint32 consumer Current consumers on queue (Low)
- bindings uint32 binding Current bindings
- bindingsHigh uint32 binding Current bindings (High)
- bindingsLow uint32 binding Current bindings (Low)
- unackedMessages uint32 message Messages consumed but not yet acked
- unackedMessagesHigh uint32 message Messages consumed but not yet acked (High)
- unackedMessagesLow uint32 message Messages consumed but not yet acked (Low)
- messageLatencySamples delta-time nanosecond Broker latency through this queue (Samples)
- messageLatencyMin delta-time nanosecond Broker latency through this queue (Min)
- messageLatencyMax delta-time nanosecond Broker latency through this queue (Max)
- messageLatencyAverage delta-time nanosecond Broker latency through this queue (Average)
-Method 'purge' Discard all messages on queue
-qpid: list queue
-Objects of type qpid.queue
- ID Created Destroyed Index
- ===========================================================================
- 1012 21:08:13 - 1002.pub_start
- 1014 21:08:13 - 1002.pub_done
- 1016 21:08:13 - 1002.sub_ready
- 1018 21:08:13 - 1002.sub_done
- 1020 21:08:13 - 1002.perftest0
- 1038 21:09:08 - 1002.mgmt-3206ff16-fb29-4a30-82ea-e76f50dd7d15
- 1040 21:09:08 - 1002.repl-3206ff16-fb29-4a30-82ea-e76f50dd7d15
- 1046 21:09:32 - 1002.mgmt-df06c7a6-4ce7-426a-9f66-da91a2a6a837
- 1048 21:09:32 - 1002.repl-df06c7a6-4ce7-426a-9f66-da91a2a6a837
- 1054 21:10:01 - 1002.mgmt-c55915c2-2fda-43ee-9410-b1c1cbb3e4ae
- 1056 21:10:01 - 1002.repl-c55915c2-2fda-43ee-9410-b1c1cbb3e4ae
- 1063 21:26:00 - 1002.mgmt-8d621997-6356-48c3-acab-76a37081d0f3
- 1065 21:26:00 - 1002.repl-8d621997-6356-48c3-acab-76a37081d0f3
-qpid: list 1020
-Object of type qpid.queue: (last sample time: 21:26:02)
- Type Element 1020
- ==========================================================================
- config vhostRef 1002
- config name perftest0
- config durable False
- config autoDelete False
- config exclusive False
- config arguments {'qpid.max_size': 0, 'qpid.max_count': 0}
- config storeRef NULL
- inst msgTotalEnqueues 500000 messages
- inst msgTotalDequeues 500000
- inst msgTxnEnqueues 0
- inst msgTxnDequeues 0
- inst msgPersistEnqueues 0
- inst msgPersistDequeues 0
- inst msgDepth 0
- inst msgDepthHigh 0
- inst msgDepthLow 0
- inst byteTotalEnqueues 512000000 octets
- inst byteTotalDequeues 512000000
- inst byteTxnEnqueues 0
- inst byteTxnDequeues 0
- inst bytePersistEnqueues 0
- inst bytePersistDequeues 0
- inst byteDepth 0
- inst byteDepthHigh 0
- inst byteDepthLow 0
- inst enqueueTxnStarts 0 transactions
- inst enqueueTxnCommits 0
- inst enqueueTxnRejects 0
- inst enqueueTxnCount 0
- inst enqueueTxnCountHigh 0
- inst enqueueTxnCountLow 0
- inst dequeueTxnStarts 0
- inst dequeueTxnCommits 0
- inst dequeueTxnRejects 0
- inst dequeueTxnCount 0
- inst dequeueTxnCountHigh 0
- inst dequeueTxnCountLow 0
- inst consumers 0 consumers
- inst consumersHigh 0
- inst consumersLow 0
- inst bindings 1 binding
- inst bindingsHigh 1
- inst bindingsLow 1
- inst unackedMessages 0 messages
- inst unackedMessagesHigh 0
- inst unackedMessagesLow 0
- inst messageLatencySamples 0
- inst messageLatencyMin 0
- inst messageLatencyMax 0
- inst messageLatencyAverage 0
-qpid:
-</programlisting>
-<!--h3--></section>
-
- <section role="h3" id="MgmtC-2B-2B-Usingqpidprintevents"><title>
- Using
- qpid-printevents
- </title>
- <para>
- This utility connects to one or more brokers and collects events,
- printing out a line per event.
- </para>
- <programlisting>
-$ qpid-printevents --help
-Usage: qpid-printevents [options] [broker-addr]...
-
-Collect and print events from one or more Qpid message brokers. If no broker-
-addr is supplied, qpid-printevents will connect to 'localhost:5672'. broker-
-addr is of the form: [username/password@] hostname | ip-address [:&lt;port&gt;] ex:
-localhost, 10.1.1.7:10000, broker-host:10000, guest/guest@localhost
-
-Options:
- -h, --help show this help message and exit
-</programlisting>
- <para>
- You get the idea... have fun!
- </para>
-<!--h3--></section>
-</section>
diff --git a/doc/book/src/Programming-In-Apache-Qpid.xml b/doc/book/src/Programming-In-Apache-Qpid.xml
deleted file mode 100644
index adcac6aab3..0000000000
--- a/doc/book/src/Programming-In-Apache-Qpid.xml
+++ /dev/null
@@ -1,6500 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
-
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
- -->
-
-<book id="client-api-tutorial">
- <title>Programming in Apache Qpid</title>
- <subtitle>Cross-Platform AMQP Messaging in Java JMS, .NET, C++, and Python</subtitle>
-
- <chapter>
- <title>Introduction</title>
-
- <para>Apache Qpid is a reliable, asynchronous messaging system that
- supports the AMQP messaging protocol in several common programming
- languages. Qpid is supported on most common platforms.
- </para>
-
- <itemizedlist>
- <listitem>
- <para>
- On the Java platform, Qpid uses the
- established <ulink url="http://java.sun.com/products/jms/">Java JMS
- API</ulink>.
- </para>
- </listitem>
- <listitem>
- <para>
- For Python, C++, and .NET, Qpid defines its own messaging API, the
- <firstterm>Qpid Messaging API</firstterm>, which is
- conceptually similar in each.
- </para>
- <para>
- On the .NET platform, Qpid also provides a WCF binding.
- </para>
- </listitem>
- <listitem>
- <para>
- Ruby will also use the Qpid Messaging API, which will soon
- be implemented. (Ruby currently uses an API that is closely
- tied to the AMQP version).
- </para>
- </listitem>
- </itemizedlist>
-
- </chapter>
-
- <chapter>
- <title>Using the Qpid Messaging API</title>
-
- <para>The Qpid Messaging API is quite simple, consisting of only a
- handful of core classes.
- </para>
-
- <itemizedlist>
-
- <listitem>
- <para>
- A <firstterm>message</firstterm> consists of a standard set
- of fields (e.g. <literal>subject</literal>,
- <literal>reply-to</literal>), an application-defined set of
- properties, and message content (the main body of the
- message).
- </para>
- </listitem>
-
- <listitem>
- <para>
- A <firstterm>connection</firstterm> represents a network
- connection to a remote endpoint.
- </para>
- </listitem>
-
- <listitem>
- <para>
- A <firstterm>session</firstterm> provides a sequentially
- ordered context for sending and receiving
- <emphasis>messages</emphasis>. A session is obtained from a
- connection.
- </para>
- </listitem>
-
- <listitem>
- <para>
- A <firstterm>sender</firstterm> sends messages to a target
- using the <literal>sender.send</literal> method. A sender is
- obtained from a session for a given target address.
- </para>
- </listitem>
-
- <listitem>
- <para>
- A <firstterm>receiver</firstterm> receives messages from a
- source using the <literal>receiver.fetch</literal> method.
- A receiver is obtained from a session for a given source
- address.
- </para>
- </listitem>
-
- </itemizedlist>
-
- <para>
- The following sections show how to use these classes in a
- simple messaging program.
- </para>
-
- <section>
- <title>A Simple Messaging Program in C++</title>
-
- <para>The following C++ program shows how to create a connection,
- create a session, send messages using a sender, and receive
- messages using a receiver.</para>
-
- <example>
- <title>"Hello world!" in C++</title>
- <programlisting lang="c++"><![CDATA[
-#include <qpid/messaging/Connection.h>
-#include <qpid/messaging/Message.h>
-#include <qpid/messaging/Receiver.h>
-#include <qpid/messaging/Sender.h>
-#include <qpid/messaging/Session.h>
-
-#include <iostream>]]>
-
-using namespace qpid::messaging;
-
-int main(int argc, char** argv) {
- std::string broker = argc > 1 ? argv[1] : "localhost:5672";
- std::string address = argc > 2 ? argv[2] : "amq.topic";
- std::string connectionOptions = argc > 3 ? argv[3] : "";
-
- Connection connection(broker, connectionOptions);
- try {
- connection.open(); <co id="hello-cpp-open" linkends="callout-cpp-open"/>
- Session session = connection.createSession(); <co id="hello-cpp-session" linkends="callout-cpp-session"/>
-
- Receiver receiver = session.createReceiver(address); <co id="hello-cpp-receiver" linkends="callout-cpp-receiver"/>
- Sender sender = session.createSender(address); <co id="hello-cpp-sender" linkends="callout-cpp-sender"/>
-
- sender.send(Message("Hello world!"));
-
- Message message = receiver.fetch(Duration::SECOND * 1); <co id="hello-cpp-fetch" linkends="callout-cpp-fetch"/>
- <![CDATA[std::cout << message.getContent() << std::endl;]]>
- session.acknowledge(); <co id="hello-cpp-acknowledge" linkends="callout-cpp-acknowledge"/>
-
- connection.close(); <co id="hello-cpp-close" linkends="callout-cpp-close"/>
- return 0;
- } catch(const std::exception&amp; error) {
- <![CDATA[std::cerr << error.what() << std::endl;]]>
- connection.close();
- return 1;
- }
-}</programlisting>
-
- <calloutlist>
- <callout id="callout-cpp-open" arearefs="hello-cpp-open">
- <para>Establishes the connection with the messaging broker.</para>
- </callout>
- <callout id="callout-cpp-session" arearefs="hello-cpp-session">
- <para>Creates a session object on which messages will be sent and received.</para>
- </callout>
- <callout id="callout-cpp-receiver" arearefs="hello-cpp-receiver">
- <para>Creates a receiver that receives messages from the given address.</para>
- </callout>
- <callout id="callout-cpp-sender" arearefs="hello-cpp-sender">
- <para>Creates a sender that sends to the given address.</para>
- </callout>
- <callout id="callout-cpp-fetch" arearefs="hello-cpp-fetch">
- <para>Receives the next message. The duration is optional, if omitted, will wait indefinitely for the next message.</para>
- </callout>
- <callout id="callout-cpp-acknowledge" arearefs="hello-cpp-acknowledge">
- <para>Acknowledges receipt of all fetched messages on the
- session. This informs the broker that the messages were
- transferred and processed by the client successfully.</para>
- </callout>
- <callout id="callout-cpp-close" arearefs="hello-cpp-close">
- <para>Closes the connection, all sessions managed by the connection, and all senders and receivers managed by each session.</para>
- </callout>
- </calloutlist>
- </example>
-
-
- </section>
-
- <section>
- <title>A Simple Messaging Program in Python</title>
-
- <para>The following Python program shows how to create a
- connection, create a session, send messages using a sender, and
- receive messages using a receiver.</para>
-
- <example>
- <title>"Hello world!" in Python</title>
- <programlisting lang="python"><![CDATA[
-import sys
-from qpid.messaging import *
-
-broker = "localhost:5672" if len(sys.argv)<2 else sys.argv[1]
-address = "amq.topic" if len(sys.argv)<3 else sys.argv[2]]]>
-
-connection = Connection(broker)
-
-try:
- connection.open() <co id="hello-python-open" linkends="callout-python-open"/>
- session = connection.session() <co id="hello-python-session" linkends="callout-python-session"/>
-
- sender = session.sender(address) <co id="hello-python-sender" linkends="callout-python-sender"/>
- receiver = session.receiver(address) <co id="hello-python-receiver" linkends="callout-python-receiver"/>
-
- sender.send(Message("Hello world!"));
-
- message = receiver.fetch(timeout=1) <co id="hello-python-fetch" linkends="callout-python-fetch"/>
- print message.content
- session.acknowledge() <co id="hello-python-acknowledge" linkends="callout-python-acknowledge"/>
-
-except MessagingError,m:
- print m
-finally:
- connection.close() <co id="hello-python-close" linkends="callout-python-close"/>
-</programlisting>
-
- <calloutlist>
- <callout id="callout-python-open" arearefs="hello-python-open">
- <para>Establishes the connection with the messaging broker.</para>
- </callout>
- <callout id="callout-python-session" arearefs="hello-python-session">
- <para>Creates a session object on which messages will be sent and received.</para>
- </callout>
- <callout id="callout-python-receiver" arearefs="hello-python-receiver">
- <para>Creates a receiver that receives messages from the given address.</para>
- </callout>
- <callout id="callout-python-sender" arearefs="hello-python-sender">
- <para>Creates a sender that sends to the given address.</para>
- </callout>
- <callout id="callout-python-fetch" arearefs="hello-python-fetch">
- <para>Receives the next message. The duration is optional, if omitted, will wait indefinitely for the next message.</para>
- </callout>
- <callout id="callout-python-acknowledge" arearefs="hello-python-acknowledge">
- <para>Acknowledges receipt of all fetched messages on
- the session. This informs the broker that the messages were
- transfered and processed by the client successfully.</para>
- </callout>
- <callout id="callout-python-close" arearefs="hello-python-close">
- <para>Closes the connection, all sessions managed by the connection, and all senders and receivers managed by each session.</para>
- </callout>
- </calloutlist>
-
- </example>
-
- </section>
-
-
-
-
- <section>
- <title>A Simple Messaging Program in .NET C#</title>
-
- <para>The following .NET C#
- <footnote>
- <para>
- The .NET binding for the Qpid C++ Messaging API
- applies to all .NET Framework managed code languages. C# was chosen
- for illustration purposes only.
- </para>
- </footnote>
- program shows how to create a connection,
- create a session, send messages using a sender, and receive
- messages using a receiver.
- </para>
-
- <example>
- <title>"Hello world!" in .NET C#</title>
- <programlisting lang="c++">
-using System;
-using Org.Apache.Qpid.Messaging; <co id="hello-csharp-using" linkends="callout-csharp-using"/>
-
-namespace Org.Apache.Qpid.Messaging {
- class Program {
- static void Main(string[] args) {
- String broker = args.Length > 0 ? args[0] : "localhost:5672";
- String address = args.Length > 1 ? args[1] : "amq.topic";
-
- Connection connection = null;
- try {
- connection = new Connection(broker);
- connection.Open(); <co id="hello-csharp-open" linkends="callout-csharp-open"/>
- Session session = connection.CreateSession(); <co id="hello-csharp-session" linkends="callout-csharp-session"/>
-
- Receiver receiver = session.CreateReceiver(address); <co id="hello-csharp-receiver" linkends="callout-csharp-receiver"/>
- Sender sender = session.CreateSender(address); <co id="hello-csharp-sender" linkends="callout-csharp-sender"/>
-
- sender.Send(new Message("Hello world!"));
-
- Message message = new Message();
- message = receiver.Fetch(DurationConstants.SECOND * 1); <co id="hello-csharp-fetch" linkends="callout-csharp-fetch"/>
- Console.WriteLine("{0}", message.GetContent());
- session.Acknowledge(); <co id="hello-csharp-acknowledge" linkends="callout-csharp-acknowledge"/>
-
- connection.Close(); <co id="hello-csharp-close" linkends="callout-csharp-close"/>
- } catch (Exception e) {
- Console.WriteLine("Exception {0}.", e);
- if (null != connection)
- connection.Close();
- }
- }
- }
-}
-
-</programlisting>
-
- <calloutlist>
- <callout id="callout-csharp-using" arearefs="hello-csharp-using">
- <para> Permits use of Org.Apache.Qpid.Messaging types and methods without explicit namespace qualification. Any .NET project must have a project reference to the assembly file <literal>Org.Apache.Qpid.Messaging.dll</literal> in order to obtain the definitions of the .NET Binding for Qpid Messaging namespace.</para>
- </callout>
- <callout id="callout-csharp-open" arearefs="hello-csharp-open">
- <para>Establishes the connection with the messaging broker.</para>
- </callout>
- <callout id="callout-csharp-session" arearefs="hello-csharp-session">
- <para>Creates a session object on which messages will be sent and received.</para>
- </callout>
- <callout id="callout-csharp-receiver" arearefs="hello-csharp-receiver">
- <para>Creates a receiver that receives messages from the given address.</para>
- </callout>
- <callout id="callout-csharp-sender" arearefs="hello-csharp-sender">
- <para>Creates a sender that sends to the given address.</para>
- </callout>
- <callout id="callout-csharp-fetch" arearefs="hello-csharp-fetch">
- <para>Receives the next message. The duration is optional, if omitted, will wait indefinitely for the next message.</para>
- </callout>
- <callout id="callout-csharp-acknowledge" arearefs="hello-csharp-acknowledge">
- <para>Acknowledges receipt of all fetched messages on the
- session. This informs the broker that the messages were
- transfered and processed by the client successfully.</para>
- </callout>
- <callout id="callout-csharp-close" arearefs="hello-csharp-close">
- <para>Closes the connection, all sessions managed by the connection, and all senders and receivers managed by each session.</para>
- </callout>
- </calloutlist>
- </example>
-
-
- </section>
-
-
-
-
-
-
- <section id="section-addresses">
- <title>Addresses</title>
-
- <para>An <firstterm>address</firstterm> is the name of a message
- target or message source.
-
- <footnote><para>In the programs we have just seen, we used
- <literal>amq.topic</literal> as the default address if none is
- passed in. This is the name of a standard exchange that always
- exists on an AMQP 0-10 messaging broker.</para></footnote>
-
- The methods that create senders and receivers require an
- address. The details of sending to a particular target or
- receiving from a particular source are then handled by the
- sender or receiver. A different target or source can be used
- simply by using a different address.
- </para>
-
- <para>An address resolves to a <firstterm>node</firstterm>. The
- Qpid Messaging API recognises two kinds of nodes,
- <firstterm>queues</firstterm> and <firstterm>topics</firstterm>
-
- <footnote><para>The terms <emphasis>queue</emphasis> and
- <emphasis>topic</emphasis> here were chosen to align with
- their meaning in JMS. These two addressing 'patterns',
- queue and topic, are sometimes refered as point-to-point
- and publish-subscribe. AMQP 0-10 has an exchange type
- called a <emphasis>topic exchange</emphasis>. When the term
- <emphasis>topic</emphasis> occurs alone, it refers to a
- Messaging API topic, not the topic
- exchange.</para></footnote>.
-
- A queue stores each message until it has been received and
- acknowledged, and only one receiver can receive a given message
-
- <footnote><para>There are exceptions to this rule; for instance,
- a receiver can use <literal>browse</literal> mode, which leaves
- messages on the queue for other receivers to
- read.</para></footnote>.
-
- A topic immediately delivers a message to all eligible
- receivers; if there are no eligible receivers, it discards the
- message. In the AMQP 0-10 implementation of the API,
-
- <footnote><para>The AMQP 0-10 implementation is the only one
- that currently exists.</para></footnote>
-
- queues map to AMQP queues, and topics map to AMQP exchanges.
-
- <footnote><para>In AMQP 0-10, messages are sent to
- exchanges, and read from queues. The Messaging API also
- allows a sender to send messages to a queue; internally,
- Qpid implements this by sending the message to the default
- exchange, with the name of the queue as the routing key. The
- Messaging API also allows a receiver to receive messages
- from a topic; internally, Qpid implements this by setting up
- a private subscription queue for the receiver and binding
- the subscription queue to the exchange that corresponds to
- the topic.</para></footnote>
- </para>
-
- <para>In the rest of this tutorial, we present many examples
- using two programs that take an address as a command line
- parameter. <command>spout</command> sends messages to the
- target address, <command>drain</command> receives messages from
- the source address. The source code is available in C++, Python, and
- .NET C# and can be found in the examples directory for each
- language. These programs can use any address string as a source
- or a destination, and have many command line options to
- configure behavior&mdash;use the <command>-h</command> option
- for documentation on these options.
-
- <footnote><para>Currently, the C++, Python, and .NET C#
- implementations of <command>drain</command> and
- <command>spout</command> have slightly different
- options. This tutorial uses the C++ implementation. The
- options will be reconciled in the near
- future.</para></footnote>
-
-
- The examples in this tutorial also use the
- <command>qpid-config</command> utility to configure AMQP 0-10
- queues and exchanges on a Qpid broker.
- </para>
-
-
- <example>
- <title>Queues</title>
-
- <para>Create a queue with <command>qpid-config</command>, send a message using
- <command>spout</command>, and read it using <command>drain</command>:</para>
-
- <screen>
-$ qpid-config add queue hello-world
-$ ./spout hello-world
-$ ./drain hello-world
-
-Message(properties={spout-id:c877e622-d57b-4df2-bf3e-6014c68da0ea:0}, content='')
- </screen>
-
- <para>The queue stored the message sent by <command>spout</command> and delivered
- it to <command>drain</command> when requested.</para>
-
- <para>Once the message has been delivered and and acknowledged
- by <command>drain</command>, it is no longer available on the queue. If we run
- <command>drain</command> one more time, no messages will be retrieved.</para>
-
- <screen>
-$ ./drain hello-world
-$
- </screen>
-
- </example>
-
- <example>
- <title>Topics</title>
-
- <para>This example is similar to the previous example, but it
- uses a topic instead of a queue.</para>
-
- <para>First, use <command>qpid-config</command> to remove the queue
- and create an exchange with the same name:</para>
-
- <screen>
-$ qpid-config del queue hello-world
-$ qpid-config add exchange topic hello-world
- </screen>
-
- <para>Now run <command>drain</command> and <command>spout</command> the same way we did in the previous example:</para>
-
- <screen>
-$ ./spout hello-world
-$ ./drain hello-world
-$
- </screen>
-
- <para>Topics deliver messages immediately to any interested
- receiver, and do not store messages. Because there were no
- receivers at the time <command>spout</command> sent the
- message, it was simply discarded. When we ran
- <command>drain</command>, there were no messages to
- receive.</para>
-
- <para>Now let's run <command>drain</command> first, using the
- <literal>-t</literal> option to specify a timeout in seconds.
- While <command>drain</command> is waiting for messages,
- run <command>spout</command> in another window.</para>
-
- <para><emphasis>First Window:</emphasis></para>
-
- <screen>
-$ ./drain -t 30 hello-word
- </screen>
-
-
- <para><emphasis>Second Window:</emphasis></para>
-
- <screen>
-$ ./spout hello-word
- </screen>
-
- <para>Once <command>spout</command> has sent a message, return
- to the first window to see the output from
- <command>drain</command>:</para>
-
- <screen>
-Message(properties={spout-id:7da2d27d-93e6-4803-8a61-536d87b8d93f:0}, content='')
- </screen>
-
- <para>You can run <command>drain</command> in several separate
- windows; each creates a subscription for the exchange, and
- each receives all messages sent to the exchange.</para>
-
- </example>
-
- <section>
- <title>Address Strings</title>
-
- <para>So far, our examples have used address strings that
- contain only the name of a node. An <firstterm>address
- string</firstterm> can also contain a
- <firstterm>subject</firstterm> and
- <firstterm>options</firstterm>.</para>
-
- <para>The syntax for an address string is:</para>
-
- <programlisting><![CDATA[
-address_string ::= <address> [ / <subject> ] [ ; <options> ]
-options ::= { <key> : <value>, ... }
-]]></programlisting>
-
- <para>Addresses, subjects, and keys are strings. Values can
- be numbers, strings (with optional single or double quotes),
- maps, or lists. A complete BNF for address strings appears in
- <xref linkend="section-address-string-bnf"/>.</para>
-
-
- <para>So far, the address strings in this tutorial have only
- used simple names. The following sections show how to use
- subjects and options.</para>
-
- </section>
-
- <section>
- <title>Subjects</title>
-
-
- <para>Every message has a property called
- <firstterm>subject</firstterm>, which is analogous to the
- subject on an email message. If no subject is specified, the
- message's subject is null. For convenience, address strings
- also allow a subject. If a sender's address contains a
- subject, it is used as the default subject for the messages
- it sends.
-
- If a receiver's address contains a subject, it is used to
- select only messages that match the subject&mdash;the matching
- algorithm depends on the message source.
- </para>
-
- <para>
- In AMQP 0-10, each exchange type has its own matching
- algorithm. This is discussed in
- <xref linkend="section-amqp0-10-mapping"/>.
- </para>
-
- <note>
- <para>
- Currently, a receiver bound to a queue ignores subjects,
- receiving messages from the queue without filtering. Support
- for subject filtering on queues will be implemented soon.
- </para>
- </note>
-
-
- <example>
- <title>Using subjects</title>
-
- <para>In this example we show how subjects affect message
- flow.</para>
-
- <para>First, let's use <command>qpid-config</command> to create a topic exchange.</para>
-
- <screen>
-$ qpid-config add exchange topic news-service
- </screen>
-
- <para>Now we use drain to receive messages from <literal>news-service</literal> that match the subject <literal>sports</literal>.</para>
- <para><emphasis>First Window:</emphasis></para>
- <screen>
-$ ./drain -t 30 news-service/sports
- </screen>
-
- <para>In a second window, let's send messages to <literal>news-service</literal> using two different subjects:</para>
-
- <para><emphasis>Second Window:</emphasis></para>
- <screen>
-$ ./spout news-service/sports
-$ ./spout news-service/news
- </screen>
-
- <para>Now look at the first window, the message with the
- subject <literal>sports</literal> has been received, but not
- the message with the subject <literal>news</literal>:</para>
-
- <screen>
-Message(properties={qpid.subject:sports, spout-id:9441674e-a157-4780-a78e-f7ccea998291:0}, content='')
- </screen>
-
- <para>If you run <command>drain</command> in multiple
- windows using the same subject, all instances of
- <command>drain</command> receive the messages for that
- subject.</para>
- </example>
-
-
- <para>The AMQP exchange type we are using here,
- <literal>amq.topic</literal>, can also do more sophisticated
- matching.
-
- A sender's subject can contain multiple words separated by a
- <quote>.</quote> delimiter. For instance, in a news
- application, the sender might use subjects like
- <literal>usa.news</literal>, <literal>usa.weather</literal>,
- <literal>europe.news</literal>, or
- <literal>europe.weather</literal>.
-
- The receiver's subject can include wildcard characters&mdash;
- <quote>#</quote> matches one or more words in the message's
- subject, <quote>*</quote> matches a single word.
-
- For instance, if the subject in the source address is
- <literal>*.news</literal>, it matches messages with the
- subject <literal>europe.news</literal> or
- <literal>usa.news</literal>; if it is
- <literal>europe.#</literal>, it matches messages with subjects
- like <literal>europe.news</literal> or
- <literal>europe.pseudo.news</literal>.</para>
-
- <example>
- <title>Subjects with multi-word keys</title>
-
- <para>This example uses drain and spout to demonstrate the
- use of subjects with two-word keys.</para>
-
- <para>Let's use <command>drain</command> with the subject
- <literal>*.news</literal> to listen for messages in which
- the second word of the key is
- <literal>news</literal>.</para>
-
- <para><emphasis>First Window:</emphasis></para>
-
- <screen>
-$ ./drain -t 30 news-service/*.news
- </screen>
-
- <para>Now let's send messages using several different
- two-word keys:</para>
-
- <para><emphasis>Second Window:</emphasis></para>
-
- <screen>
-$ ./spout news-service/usa.news
-$ ./spout news-service/usa.sports
-$ ./spout news-service/europe.sports
-$ ./spout news-service/europe.news
- </screen>
-
- <para>In the first window, the messages with
- <literal>news</literal> in the second word of the key have
- been received:</para>
-
- <screen>
-Message(properties={qpid.subject:usa.news, spout-id:73fc8058-5af6-407c-9166-b49a9076097a:0}, content='')
-Message(properties={qpid.subject:europe.news, spout-id:f72815aa-7be4-4944-99fd-c64c9747a876:0}, content='')
- </screen>
-
-
- <para>Next, let's use <command>drain</command> with the
- subject <literal>#.news</literal> to match any sequence of
- words that ends with <literal>news</literal>.</para>
-
- <para><emphasis>First Window:</emphasis></para>
-
- <screen>
-$ ./drain -t 30 news-service/#.news
- </screen>
-
- <para>In the second window, let's send messages using a
- variety of different multi-word keys:</para>
-
- <para><emphasis>Second Window:</emphasis></para>
-
- <screen>
-$ ./spout news-service/news
-$ ./spout news-service/sports
-$ ./spout news-service/usa.news
-$ ./spout news-service/usa.sports
-$ ./spout news-service/usa.faux.news
-$ ./spout news-service/usa.faux.sports
- </screen>
-
- <para>In the first window, messages with
- <literal>news</literal> in the last word of the key have been
- received:</para>
-
- <screen>
-Message(properties={qpid.subject:news, spout-id:cbd42b0f-c87b-4088-8206-26d7627c9640:0}, content='')
-Message(properties={qpid.subject:usa.news, spout-id:234a78d7-daeb-4826-90e1-1c6540781eac:0}, content='')
-Message(properties={qpid.subject:usa.faux.news, spout-id:6029430a-cfcb-4700-8e9b-cbe4a81fca5f:0}, content='')
- </screen>
- </example>
-
- </section>
-
- <section>
- <title>Address String Options</title>
-
- <para>
- The options in an address string can contain additional
- information for the senders or receivers created for it,
- including:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Policies for assertions about the node to which an address
- refers.
- </para>
- <para>
- For instance, in the address string <literal>my-queue;
- {assert: always, node:{ type: queue }}</literal>, the node
- named <literal>my-queue</literal> must be a queue; if not,
- the address does not resolve to a node, and an exception
- is raised.
- </para>
- </listitem>
- <listitem>
- <para>
- Policies for automatically creating or deleting the node to which an address refers.
- </para>
- <para>
- For instance, in the address string <literal>xoxox ; {create: always}</literal>,
- the queue <literal>xoxox</literal> is created, if it does
- not exist, before the address is resolved.
- </para>
- </listitem>
- <listitem>
- <para>
- Extension points that can be used for sender/receiver configuration.
- </para>
- <para>
- For instance, if the address for a receiver is
- <literal>my-queue; {mode: browse}</literal>, the receiver
- works in <literal>browse</literal> mode, leaving messages
- on the queue so other receivers can receive them.
- </para>
- </listitem>
- <listitem>
- <para>
- Extension points providing more direct control over the underlying protocol.
- </para>
- <para>
- For instance, the <literal>x-bindings</literal> property
- allows greater control over the AMQP 0-10 binding process
- when an address is resolved.
- </para>
- </listitem>
- </itemizedlist>
-
-
- <para>
- Let's use some examples to show how these different kinds of
- address string options affect the behavior of senders and
- receives.
- </para>
-
- <section>
- <title>assert</title>
- <para>
- In this section, we use the <literal>assert</literal> option
- to ensure that the address resolves to a node of the required
- type.
- </para>
-
-
- <example>
- <title>Assertions on Nodes</title>
-
- <para>Let's use <command>qpid-config</command> to create a
- queue and a topic.</para>
-
- <screen>
-$ qpid-config add queue my-queue
-$ qpid-config add exchange topic my-topic
- </screen>
-
- <para>
- We can now use the address specified to drain to assert that it is
- of a particular type:
- </para>
-
- <screen>
-$ ./drain 'my-queue; {assert: always, node:{ type: queue }}'
-$ ./drain 'my-queue; {assert: always, node:{ type: topic }}'
-2010-04-20 17:30:46 warning Exception received from broker: not-found: not-found: Exchange not found: my-queue (../../src/qpid/broker/ExchangeRegistry.cpp:92) [caused by 2 \x07:\x01]
-Exchange my-queue does not exist
- </screen>
-
- <para>
- The first attempt passed without error as my-queue is indeed a
- queue. The second attempt however failed; my-queue is not a
- topic.
- </para>
-
- <para>
- We can do the same thing for my-topic:
- </para>
-
- <screen>
-$ ./drain 'my-topic; {assert: always, node:{ type: topic }}'
-$ ./drain 'my-topic; {assert: always, node:{ type: queue }}'
-2010-04-20 17:31:01 warning Exception received from broker: not-found: not-found: Queue not found: my-topic (../../src/qpid/broker/SessionAdapter.cpp:754) [caused by 1 \x08:\x01]
-Queue my-topic does not exist
- </screen>
- </example>
-
- <para>Now let's use the <literal>create</literal> option to
- create the queue <literal>xoxox</literal> if it does not already
- exist:</para>
-
- </section>
-
- <section>
- <title>create</title>
-
- <para>In previous examples, we created the queue before
- listening for messages on it. Using <literal>create:
- always</literal>, the queue is automatically created if it
- does not exist.</para>
-
- <example>
- <title>Creating a Queue Automatically</title>
-
- <para><emphasis>First Window:</emphasis></para>
- <screen>$ ./drain -t 30 "xoxox ; {create: always}"</screen>
-
-
- <para>Now we can send messages to this queue:</para>
-
- <para><emphasis>Second Window:</emphasis></para>
- <screen>$ ./spout "xoxox ; {create: always}"</screen>
-
- <para>Returning to the first window, we see that <command>drain</command> has received this message:</para>
-
- <screen>Message(properties={spout-id:1a1a3842-1a8b-4f88-8940-b4096e615a7d:0}, content='')</screen>
- </example>
- <para>The details of the node thus created can be controlled by further options within the node. See <xref linkend="table-node-properties"/> for details.</para>
- </section>
-
- <section>
- <title>browse</title>
- <para>Some options specify message transfer semantics; for
- instance, they may state whether messages should be consumed or
- read in browsing mode, or specify reliability
- characteristics. The following example uses the
- <literal>browse</literal> option to receive messages without
- removing them from a queue.</para>
-
- <example>
- <title>Browsing a Queue</title>
- <para>
- Let's use the browse mode to receive messages without
- removing them from the queue. First we send three messages to the
- queue:
- </para>
- <screen>
-$ ./spout my-queue --content one
-$ ./spout my-queue --content two
-$ ./spout my-queue --content three
- </screen>
-
- <para>Now we use drain to get those messages, using the browse option:</para>
- <screen>
-$ ./drain 'my-queue; {mode: browse}'
-Message(properties={spout-id:fbb93f30-0e82-4b6d-8c1d-be60eb132530:0}, content='one')
-Message(properties={spout-id:ab9e7c31-19b0-4455-8976-34abe83edc5f:0}, content='two')
-Message(properties={spout-id:ea75d64d-ea37-47f9-96a9-d38e01c97925:0}, content='three')
- </screen>
-
- <para>We can confirm the messages are still on the queue by repeating the drain:</para>
- <screen>
-$ ./drain 'my-queue; {mode: browse}'
-Message(properties={spout-id:fbb93f30-0e82-4b6d-8c1d-be60eb132530:0}, content='one')
-Message(properties={spout-id:ab9e7c31-19b0-4455-8976-34abe83edc5f:0}, content='two')
-Message(properties={spout-id:ea75d64d-ea37-47f9-96a9-d38e01c97925:0}, content='three')
- </screen>
- </example>
- </section>
-
- <section>
- <title>x-bindings</title>
-
- <para>Greater control over the AMQP 0-10 binding process can
- be achieved by including an <literal>x-bindings</literal>
- option in an address string.
-
- For instance, the XML Exchange is an AMQP 0-10 custom exchange
- provided by the Apache Qpid C++ broker. It allows messages to
- be filtered using XQuery; queries can address either message
- properties or XML content in the body of the message. The
- xquery is specified in the arguments field of the AMQP 0-10
- command. When using the messaging API an xquery can be
- specified in and address that resolves to an XML exchange by
- using the x-bindings property.</para>
-
-
- <para>An instance of the XML Exchange must be added before it
- can be used:</para>
-
- <programlisting>
-$ qpid-config add exchange xml xml
- </programlisting>
-
- <para>When using the XML Exchange, a receiver provides an
- XQuery as an x-binding argument. If the query contains a
- context item (a path starting with <quote>.</quote>), then it
- is applied to the content of the message, which must be
- well-formed XML. For instance, <literal>./weather</literal> is
- a valid XQuery, which matches any message in which the root
- element is named <literal>weather</literal>. Here is an
- address string that contains this query:</para>
-
- <programlisting><![CDATA[
-xml; {
- link: {
- x-bindings: [{exchange:xml, key:weather, arguments:{xquery:"./weather"} }]
- }
-}
- ]]></programlisting>
-
- <para>When using longer queries with <command>drain</command>,
- it is often useful to place the query in a file, and use
- <command>cat</command> in the command line. We do this in the
- following example.</para>
-
- <example>
- <title>Using the XML Exchange</title>
-
- <para>This example uses an x-binding that contains queries, which filter based on the content of XML messages. Here is an XQuery that we will use in this example:</para>
-
- <programlisting>
- <![CDATA[
-let $w := ./weather
-return $w/station = 'Raleigh-Durham International Airport (KRDU)'
- and $w/temperature_f > 50
- and $w/temperature_f - $w/dewpoint > 5
- and $w/wind_speed_mph > 7
- and $w/wind_speed_mph < 20 ]]>
- </programlisting>
-
- <para>We can specify this query in an x-binding to listen to messages that meet the criteria specified by the query:</para>
-
- <para><emphasis>First Window:</emphasis></para>
-
- <screen>
-$ ./drain -f "xml; {link:{x-bindings:[{key:'weather',
-arguments:{xquery:\"$(cat rdu.xquery )\"}}]}}"
- </screen>
-
- <para>In another window, let's create an XML message that meets the criteria in the query, and place it in the file <filename>rdu.xml</filename>:</para>
-
- <programlisting>
-<![CDATA[
-<weather>
- <station>Raleigh-Durham International Airport (KRDU)</station>
- <wind_speed_mph>16</wind_speed_mph>
- <temperature_f>70</temperature_f>
- <dewpoint>35</dewpoint>
-</weather>
- ]]></programlisting>
-
- <para>Now let's use <command>spout</command> to send this message to the XML exchange:</para>
-
- <para><emphasis>Second Window:</emphasis></para>
- <screen>
-spout --content "$(cat rdu.xml)" xml/weather
- </screen>
-
- <para>Returning to the first window, we see that the message has been received:</para>
-
- <screen><![CDATA[$ ./drain -f "xml; {link:{x-bindings:[{exchange:'xml', key:'weather', arguments:{xquery:\"$(cat rdu.xquery )\"}}]}}"
-Message(properties={qpid.subject:weather, spout-id:31c431de-593f-4bec-a3dd-29717bd945d3:0},
-content='<weather>
- <station>Raleigh-Durham International Airport (KRDU)</station>
- <wind_speed_mph>16</wind_speed_mph>
- <temperature_f>40</temperature_f>
- <dewpoint>35</dewpoint>
-</weather>') ]]>
- </screen>
- </example>
- </section>
-
-<!--
- <para>When sending data using <command>cat</command> to provide arguments to <command>spout</command>, you can use <command>sed</command> to change the values that are sent:</para>
-
- <screen>
-spout - -content "$(cat rdu.xml | sed -e 's/70/45/')" xml/weather
- </screen>
--->
-
- <!--
- TODO: Add some reliability option examples
- -->
-
- <section>
- <title>Address String Options - Reference</title>
-
- <table pgwide="1">
- <title>Address String Options</title>
- <tgroup cols="3">
- <thead>
- <colspec colnum="1" colwidth="1*"/>
- <colspec colnum="2" colwidth="3*"/>
- <colspec colnum="3" colwidth="3*"/>
- <row>
- <entry>option</entry>
- <entry>value</entry>
- <entry>semantics</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>
- assert
- </entry>
- <entry>
- one of: always, never, sender or receiver
- </entry>
- <entry>
- Asserts that the properties specified in the node option
- match whatever the address resolves to. If they do not,
- resolution fails and an exception is raised. <!-- ###
- Which exception -->
- </entry>
- </row>
-
- <row>
- <entry>
- create
- </entry>
- <entry>
- one of: always, never, sender or receiver
- </entry>
- <entry>
- Creates the node to which an address refers if it does
- not exist. No error is raised if the node does
- exist. The details of the node may be specified in the
- node option.
- </entry>
- </row>
- <row>
- <entry>
- delete
- </entry>
- <entry>
- one of: always, never, sender or receiver
- </entry>
- <entry>
- Delete the node when the sender or receiver is closed.
- </entry>
- </row>
- <row>
- <entry>
- node
- </entry>
- <entry>
- A nested map containing the entries shown in <xref linkend="table-node-properties"/>.
- </entry>
- <entry>
- Specifies properties of the node to which the address
- refers. These are used in conjunction with the assert or
- create options.
- </entry>
- </row>
- <row>
- <entry>
- link
- </entry>
- <entry>
- A nested map containing the entries shown in <xref linkend="table-link-properties"/>.
- </entry>
- <entry>
- Used to control the establishment of a conceptual link
- from the client application to or from the target/source
- address.
- </entry>
- </row>
- <row>
- <entry>
- mode
- </entry>
- <entry>
- one of: browse, consume
- </entry>
- <entry>
- This option is only of relevance for source addresses
- that resolve to a queue. If browse is specified the
- messages delivered to the receiver are left on the queue
- rather than being removed. If consume is specified the
- normal behaviour applies; messages are removed from the
- queue once the client acknowledges their receipt.
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
-
- <table id="table-node-properties" pgwide="1">
- <title>Node Properties</title>
- <tgroup cols="3">
- <thead>
- <colspec colnum="1" colwidth="1*"/>
- <colspec colnum="2" colwidth="3*"/>
- <colspec colnum="3" colwidth="3*"/>
- <row>
- <entry>property</entry>
- <entry>value</entry>
- <entry>semantics</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>
- type
- </entry>
- <entry>
- topic, queue
- </entry>
- <entry>
- Indicates the type of the node.
- </entry>
- </row>
- <row>
- <entry>
- durable
- </entry>
- <entry>
- True, False
- </entry>
- <entry>
- Indicates whether the node survives a loss of
- volatile storage e.g. if the broker is restarted.
- </entry>
- </row>
- <row>
- <entry>
- x-declare
- </entry>
- <entry>
- A nested map whose values correspond to the valid fields
- on an AMQP 0-10 queue-declare or exchange-declare
- command.
- </entry>
- <entry>
- These values are used to fine tune the creation or
- assertion process. Note however that they are protocol
- specific.
- </entry>
- </row>
- <row>
- <entry>
- x-bindings
- </entry>
- <entry>
- A nested list in which each binding is represented by
- a map. The entries of the map for a binding contain
- the fields that describe an AMQP 0-10 binding. Here is
- the format for x-bindings:
-
-<programlisting><![CDATA[
-[
- {
- exchange: <exchange>,
- queue: <queue>,
- key: <key>,
- arguments: {
- <key_1>: <value_1>,
- ...,
- <key_n>: <value_n> }
- },
- ...
-]
-]]></programlisting>
- </entry>
- <entry>
- In conjunction with the create option, each of these
- bindings is established as the address is resolved. In
- conjunction with the assert option, the existence of
- each of these bindings is verified during
- resolution. Again, these are protocol specific.
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table id="table-link-properties" pgwide="1">
- <title>Link Properties</title>
- <tgroup cols="3">
- <thead>
- <colspec colnum="1" colwidth="1*"/>
- <colspec colnum="2" colwidth="3*"/>
- <colspec colnum="3" colwidth="3*"/>
- <row>
- <entry>option</entry>
- <entry>value</entry>
- <entry>semantics</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>
- reliability
- </entry>
- <entry>
- one of: unreliable, at-least-once, at-most-once, exactly-once
- </entry>
- <entry>
- Reliability indicates the level of reliability that
- the sender or receiver. <literal>unreliable</literal>
- and <literal>at-most-once</literal> are currently
- treated as synonyms, and allow messages to be lost if
- a broker crashes or the connection to a broker is
- lost. <literal>at-least-once</literal> guarantees that
- a message is not lost, but duplicates may be
- received. <literal>exactly-once</literal> guarantees
- that a message is not lost, and is delivered precisely
- once. Currently only <literal>unreliable</literal>
- and <literal>at-least-once</literal> are supported.
- <footnote><para>If at-most-once is requested,
- unreliable will be used and for durable messages on
- durable queues there is the possibility that messages
- will be redelivered; if exactly-once is requested,
- at-most-once will be used and the application needs to
- be able to deal with duplicates.</para></footnote>
- </entry>
- </row>
- <row>
- <entry>
- durable
- </entry>
- <entry>
- True, False
- </entry>
- <entry>
- Indicates whether the link survives a loss of
- volatile storage e.g. if the broker is restarted.
- </entry>
- </row>
- <row>
- <entry>
- x-declare
- </entry>
- <entry>
- A nested map whose values correspond to the valid fields
- of an AMQP 0-10 queue-declare command.
- </entry>
- <entry>
- These values can be used to customise the subscription
- queue in the case of receiving from an exchange. Note
- however that they are protocol specific.
- </entry>
- </row>
- <row>
- <entry>
- x-subscribe
- </entry>
- <entry>
- A nested map whose values correspond to the valid fields
- of an AMQP 0-10 message-subscribe command.
- </entry>
- <entry>
- These values can be used to customise the subscription.
- </entry>
- </row>
- <row>
- <entry>
- x-bindings
- </entry>
- <entry>
- A nested list each of whose entries is a map that may
- contain fields (queue, exchange, key and arguments)
- describing an AMQP 0-10 binding.
- </entry>
- <entry>
- These bindings are established during resolution
- independent of the create option. They are considered
- logically part of the linking process rather than of
- node creation.
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- </section>
- </section>
-
- <section id="section-address-string-bnf">
- <title>Address String Grammar</title>
-
- <para>This section provides a formal grammar for address strings.</para>
-
- <formalpara>
- <title>Tokens</title>
- <para>The following regular expressions define the tokens used
- to parse address strings:</para></formalpara>
-<programlisting><![CDATA[
-LBRACE: \\{
-RBRACE: \\}
-LBRACK: \\[
-RBRACK: \\]
-COLON: :
-SEMI: ;
-SLASH: /
-COMMA: ,
-NUMBER: [+-]?[0-9]*\\.?[0-9]+
-ID: [a-zA-Z_](?:[a-zA-Z0-9_-]*[a-zA-Z0-9_])?
-STRING: "(?:[^\\\\"]|\\\\.)*"|\'(?:[^\\\\\']|\\\\.)*\'
-ESC: \\\\[^ux]|\\\\x[0-9a-fA-F][0-9a-fA-F]|\\\\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]
-SYM: [.#*%@$^!+-]
-WSPACE: [ \\n\\r\\t]+
-]]></programlisting>
-
- <formalpara>
- <title>Grammar</title>
- <para>The formal grammar for addresses is given below:</para>
- </formalpara>
-
- <programlisting><![CDATA[
-address := name [ SLASH subject ] [ ";" options ]
- name := ( part | quoted )+
-subject := ( part | quoted | SLASH )*
- quoted := STRING / ESC
- part := LBRACE / RBRACE / COLON / COMMA / NUMBER / ID / SYM
-options := map
- map := "{" ( keyval ( "," keyval )* )? "}"
- keyval "= ID ":" value
- value := NUMBER / STRING / ID / map / list
- list := "[" ( value ( "," value )* )? "]"
- ]]></programlisting>
-
-
- <formalpara>
- <title>Address String Options</title>
- <para>The address string options map supports the following parameters:</para>
- </formalpara>
-
- <programlisting><![CDATA[
-<name> [ / <subject> ] ; {
- create: always | sender | receiver | never,
- delete: always | sender | receiver | never,
- assert: always | sender | receiver | never,
- mode: browse | consume,
- node: {
- type: queue | topic,
- durable: True | False,
- x-declare: { ... <declare-overrides> ... },
- x-bindings: [<binding_1>, ... <binding_n>]
- },
- link: {
- name: <link-name>,
- durable: True | False,
- reliability: unreliable | at-most-once | at-least-once | exactly-once,
- x-declare: { ... <declare-overrides> ... },
- x-bindings: [<binding_1>, ... <binding_n>],
- x-subscribe: { ... <subscribe-overrides> ... }
- }
-}
-]]></programlisting>
-
-
- <itemizedlist>
- <title>Create, Delete, and Assert Policies</title>
- <para>The create, delete, and assert policies specify who should
- perfom the associated action:</para>
- <listitem><para><emphasis>always</emphasis>: the action is performed by any messaging client</para></listitem>
- <listitem><para><emphasis>sender</emphasis>: the action is only performed by a sender</para></listitem>
- <listitem><para><emphasis>receiver</emphasis>: the action is only performed by a receiver</para></listitem>
- <listitem><para><emphasis>never</emphasis>: the action is never performed (this is the default)</para></listitem>
- </itemizedlist>
-
- <itemizedlist>
- <title>Node-Type</title>
- <para>The node-type is one of:</para>
- <listitem><para><emphasis>topic</emphasis>: in the AMQP 0-10
- mapping, a topic node defaults to the topic exchange, x-declare
- may be used to specify other exchange types</para></listitem>
- <listitem><para><emphasis>queue</emphasis>: this is the default node-type</para></listitem>
- </itemizedlist>
- </section>
-
-
-</section>
-
-<section id="replay">
- <title>Sender Capacity and Replay</title>
-
- <para>The send method of a sender has an optional second parameter
- that controls whether the send call is synchronous or not. A
- synchronous send call will block until the broker has confirmed
- receipt of the message. An asynchronous send call will return
- before the broker confirms receipt of the message, allowing for
- example further send calls to be made without waiting for a
- roundtrip to the broker for each message. This is desirable where
- increased throughput is important.</para>
-
- <para>The sender maintains a list of sent messages whose receipt
- has yet to be confirmed by the broker. The maximum number of such
- messages that it will hold is defined by the capacity of the
- sender, which can be set by the application. If an application
- tries to send with a sender whose capacity is already fully used
- up, the send call will block waiting for capacity regardless of
- the value of the sync flag.</para>
-
- <para>The sender can be queried for the available space (i.e. the
- unused capacity), and for the current count of unsettled messages
- (i.e. those held in the replay list pending confirmation by the
- server). When the unsettled count is zero, all messages on that
- sender have been successfully sent.</para>
-
- <para>If the connection fails and is transparently reconnected
- (see <xref linkend="connection-options"/> for details on how to control
- this feature), the unsettled messages for each sender over that
- connection will be re-transmitted. This provides a transparent
- level of reliability. This feature can be controlled through the
- link's reliability as defined in the address (see
- <xref linkend="table-link-properties"/>). At present only
- at-least-once guarantees are offered. </para>
-</section>
-
-<section id="prefetch">
- <title>Receiver Capacity (Prefetch)</title>
-
- <para>By default, a receiver requests the next message from the
- server in response to each fetch call, resulting in messages being
- sent to the receiver one at a time. As in the case of sending, it
- is often desirable to avoid this roundtrip for each message. This
- can be achieved by allowing the receiver
- to <firstterm>prefetch</firstterm> messages in anticipation of
- fetch calls being made. The receiver needs to be able to store
- these prefetched messages, the number it can hold is controlled by
- the receivers capacity.</para>
-
-</section>
-
-<section id="acknowledgements">
- <title>Acknowledging Received Messages</title>
-
- <para>Applications that receive messages should acknowledge their
- receipt by calling the session's acknowledge method. As in the
- case of sending messages, acknowledged transfer of messages to
- receivers provides at-least-once reliability, which means that the
- loss of the connection or a client crash does not result in lost
- messages; durable messages are not lost even if the broker is
- restarted.
-
- Some cases may not require this however and the reliability can be
- controlled through a link property in the address options (see
- <xref linkend="table-link-properties"/>).</para>
-
- <para>The acknowledge call acknowledges all messages received on
- the session (i.e. all message that have been returned from a fetch
- call on a receiver created on that session).</para>
-
- <para>The acknowledge call also support an optional parameter
- controlling whether the call is synchronous or not. A synchronous
- acknowledge will block until the server has confirmed that it has
- received the acknowledgement. In the asynchronous case, when the
- call returns there is not yet any guarantee that the server has
- received and processed the acknowledgement. The session may be
- queried for the number of unsettled acknowledgements; when that
- count is zero all acknowledgements made for received messages have
- been successful.</para>
-
-</section>
-
-
- <section>
- <title>Receiving Messages from Multiple Sources</title>
-
- <para>A receiver can only read from one source, but many
- programs need to be able to read messages from many sources. In
- the Qpid Messaging API, a program can ask a session for
- the <quote>next receiver</quote>; that is, the receiver that is
- responsible for the next available message. The following
- examples show how this is done in C++, Python, and .NET C#.
- </para>
-
- <para>Note that to use this pattern you must enable prefetching
- for each receiver of interest so that the broker will send
- messages before a fetch call is made. See
- <xref linkend="prefetch"/> for more on this.</para>
-
- <example>
- <title>Receiving Messages from Multiple Sources</title>
-
- <para>C++:</para>
-
- <programlisting><![CDATA[
-Receiver receiver1 = session.createReceiver(address1);
-receiver1.setCapacity(10);
-Receiver receiver2 = session.createReceiver(address2);
-receiver2.setCapacity(10);
-
-Message message = session.nextReceiver().fetch();
-std::cout << message.getContent() << std::endl;
-session.acknowledge(); // acknowledge message receipt
-]]> </programlisting>
-
- <para>Python:</para>
- <programlisting><![CDATA[
-receiver1 = session.receiver(address1)
-receiver1.capacity = 10
-receiver2 = session.receiver(address)
-receiver2.capacity = 10
-message = session.next_receiver().fetch()
-print message.content
-session.acknowledge()
-]]> </programlisting>
-
- <para>.NET C#:</para>
- <programlisting><![CDATA[
-Receiver receiver1 = session.CreateReceiver(address1);
-receiver1.Capacity = 10;
-Receiver receiver2 = session.CreateReceiver(address2);
-receiver2.Capacity = 10;
-
-Message message = new Message();
-message = session.NextReceiver().Fetch();
-Console.WriteLine("{0}", message.GetContent());
-session.Acknowledge();
-]]> </programlisting>
-
- </example>
- </section>
-
- <section>
- <title>Transactions</title>
-
- <para>Sometimes it is useful to be able to group messages
- transfers - sent and/or received - on a session into atomic
- grouping. This can be done be creating the session as
- transactional. On a transactional session sent messages only
- become available at the target address on commit. Likewise any
- received and acknowledged messages are only discarded at their
- source on commit
-
- <footnote><para>Note that this currently is only true for
- messages received using a reliable mode
- e.g. at-least-once. Messages sent by a broker to a receiver in
- unreliable receiver will be discarded immediately regardless of
- transctionality.</para></footnote>
-
- .</para>
-
- <example>
- <title>Transactions</title>
- <para>C++:</para>
- <programlisting><![CDATA[
-Connection connection(broker);
-Session session = connection.createTransactionalSession();
-...
-if (smellsOk())
- session.commit();
-else
- session.rollback();
- ]]></programlisting>
- <para>
- .NET C#:
- </para>
-
-<programlisting>
-Connection connection = new Connection(broker);
-Session session = connection.CreateTransactionalSession();
-...
-if (smellsOk())
- session.Commit();
-else
- session.Rollback();
-</programlisting>
-<!--
- <para>Python</para>
- <programlisting><![CDATA[
-### TODO
- ]]></programlisting>
--->
- </example>
-
- </section>
-
- <section id="connection-options">
- <title>Connection Options</title>
-
- <para>
- Aspects of the connections behaviour can be controlled through
- specifying connection options. For example, connections can be
- configured to automatically reconnect if the connection to a
- broker is lost.
- </para>
-
- <example>
- <title>Specifying Connection Options in C++, Python, and .NET</title>
-
- <para>In C++, these options can be set using <function>Connection::setOption()</function> or by passing in a set of options to the constructor. The options can be passed in as a map or in string form:</para>
-
- <programlisting><![CDATA[
-Connection connection("localhost:5672", "{reconnect: true}");
-try {
- connection.open();
- !!! SNIP !!!
- ]]></programlisting>
-
-<para>or</para>
-
- <programlisting><![CDATA[
-Connection connection("localhost:5672");
-connection.setOption("reconnect", true);
-try {
- connection.open();
- !!! SNIP !!!
- ]]></programlisting>
-
- <para>In Python, these options can be set as attributes of the connection or using named arguments in
- the <function>Connection</function> constructor:</para>
-
- <programlisting><![CDATA[
-connection = Connection("localhost:5672", reconnect=True)
-try:
- connection.open()
- !!! SNIP !!!
- ]]></programlisting>
-
-<para>or</para>
-
- <programlisting><![CDATA[
-connection = Connection("localhost:5672")
-connection.reconnect = True
-try:
- connection.open()
- !!! SNIP !!!
- ]]></programlisting>
- <para>
- In .NET, these options can be set using <function>Connection.SetOption()</function> or by passing in a set of options to the constructor. The options can be passed in as a map or in string form:
- </para>
-
-<programlisting>
-Connection connection= new Connection(&#34;localhost:5672&#34;, &#34;{reconnect: true}&#34;);
-try {
- connection.Open();
- !!! SNIP !!!
-</programlisting>
- <para>
- or
- </para>
-
-<programlisting>
-Connection connection = new Connection(&#34;localhost:5672&#34;);
-connection.SetOption(&#34;reconnect&#34;, true);
-try {
- connection.Open();
- !!! SNIP !!!
-</programlisting>
-
- <para>See the reference documentation for details in each language.</para>
- </example>
-
- <para>The following table lists the supported connection options.</para>
-
- <table pgwide="1">
- <title>Connection Options</title>
- <tgroup cols="3">
- <thead>
- <colspec colnum="1" colwidth="1*"/>
- <colspec colnum="2" colwidth="1*"/>
- <colspec colnum="3" colwidth="3*"/>
- <row>
- <entry>option name</entry>
- <entry>value type</entry>
- <entry>semantics</entry>
- </row>
- </thead>
- <tbody>
-
- <row>
- <entry>
- <literal>username</literal>
- </entry>
- <entry>
- string
- </entry>
- <entry>
- The username to use when authenticating to the broker.
- </entry>
- </row>
- <row>
- <entry>
- <literal>password</literal>
- </entry>
- <entry>
- string
- </entry>
- <entry>
- The password to use when authenticating to the broker.
- </entry>
- </row>
- <row>
- <entry>
- <literal>sasl_mechanisms</literal>
- </entry>
- <entry>
- string
- </entry>
- <entry>
- The specific SASL mechanisms to use with the python
- client when authenticating to the broker. The value
- is a space separated list.
- </entry>
- </row>
-
-
- <row>
- <entry>
- <literal>reconnect</literal>
- </entry>
- <entry>
- boolean
- </entry>
- <entry>
- Transparently reconnect if the connection is lost.
- </entry>
- </row>
- <row>
- <entry>
- <literal>reconnect_timeout</literal>
- </entry>
- <entry>
- integer
- </entry>
- <entry>
- Total number of seconds to continue reconnection attempts before giving up and raising an exception.
- </entry>
- </row>
- <row>
- <entry>
- <literal>reconnect_limit</literal>
- </entry>
- <entry>
- integer
- </entry>
- <entry>
- Maximum number of reconnection attempts before giving up and raising an exception.
- </entry>
- </row>
- <row>
- <entry>
- <literal>reconnect_interval_min</literal>
- </entry>
- <entry>
- integer representing time in seconds
- </entry>
- <entry>
- Minimum number of seconds between reconnection attempts. The first reconnection attempt is made immediately; if that fails, the first reconnection delay is set to the value of <literal>reconnect_interval_min</literal>; if that attempt fails, the reconnect interval increases exponentially until a reconnection attempt succeeds or <literal>reconnect_interval_max</literal> is reached.
- </entry>
- </row>
- <row>
- <entry>
- <literal>reconnect_interval_max</literal>
- </entry>
- <entry>
- integer representing time in seconds
- </entry>
- <entry>
- Maximum reconnect interval.
- </entry>
- </row>
- <row>
- <entry>
- <literal>reconnect_interval</literal>
- </entry>
- <entry>
- integer representing time in seconds
- </entry>
- <entry>
- Sets both <literal>reconnection_interval_min</literal> and <literal>reconnection_interval_max</literal> to the same value.
- </entry>
- </row>
-
- <row>
- <entry>
- <literal>heartbeat</literal>
- </entry>
- <entry>
- integer representing time in seconds
- </entry>
- <entry>
- Requests that heartbeats be sent every N seconds. If two
- successive heartbeats are missed the connection is
- considered to be lost.
- </entry>
- </row>
- <row>
- <entry>
- <literal>protocol</literal>
- </entry>
- <entry>
- string
- </entry>
- <entry>
- Sets the underlying protocol used. The default option is 'tcp'. To enable ssl, set to 'ssl'. The C++ client additionally supports 'rdma'.
- </entry>
- </row>
- <row>
- <entry>
- <literal>tcp-nodelay</literal>
- </entry>
- <entry>
- boolean
- </entry>
- <entry>
- Set tcp no-delay, i.e. disable Nagle algorithm. [C++ only]
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- </section>
-
- <section id="section-Maps">
- <title>Maps and Lists in Message Content</title>
-
- <para>Many messaging applications need to exchange data across
- languages and platforms, using the native datatypes of each
- programming language.</para>
-
- <para>The Qpid Messaging API supports <classname>map</classname> and <classname>list</classname> in message content.
-
- <footnote><para>Unlike JMS, there is not a specific message type for
- map messages.</para></footnote>
-
- <footnote>
- <para>
- Note that the Qpid JMS client supports MapMessages whose values can be nested maps or lists. This is not standard JMS behaviour.
- </para>
- </footnote>
- Specific language support for <classname>map</classname> and <classname>list</classname> objects are shown in the following table.
- </para>
- <table id="tabl-Programming_in_Apache_Qpid-Qpid_Maps_in_Message_Content">
- <title>Map and List Representation in Supported Languages</title>
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Language</entry>
- <entry>map</entry>
- <entry>list</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>Python</entry>
- <entry><classname>dict</classname></entry>
- <entry><classname>list</classname></entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry><classname>Variant::Map</classname></entry>
- <entry><classname>Variant::List</classname></entry>
- </row>
- <row>
- <entry>Java</entry>
- <entry><classname>MapMessage</classname></entry>
- <entry><classname>&nbsp;</classname></entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry><classname>Dictionary&#60;string, object&#62;</classname></entry>
- <entry><classname>Collection&#60;object&#62;</classname></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <para>
- In all languages, messages are encoded using AMQP&#39;s portable datatypes.
- </para>
-
- <tip>
- <para>Because of the differences in type systems among
- languages, the simplest way to provide portable messages is to
- rely on maps, lists, strings, 64 bit signed integers, and
- doubles for messages that need to be exchanged across languages
- and platforms.</para>
- </tip>
-
- <section id="section-Python-Maps">
- <title>Qpid Maps and Lists in Python</title>
-
- <para>In Python, Qpid supports the <classname>dict</classname> and <classname>list</classname> types directly in message content. The following code shows how to send these structures in a message:</para>
-
- <example>
- <title>Sending Qpid Maps and Lists in Python</title>
- <programlisting><![CDATA[
-from qpid.messaging import *
-# !!! SNIP !!!
-
-content = {'Id' : 987654321, 'name' : 'Widget', 'percent' : 0.99}
-content['colours'] = ['red', 'green', 'white']
-content['dimensions'] = {'length' : 10.2, 'width' : 5.1,'depth' : 2.0};
-content['parts'] = [ [1,2,5], [8,2,5] ]
-content['specs'] = {'colors' : content['colours'],
- 'dimensions' : content['dimensions'],
- 'parts' : content['parts'] }
-message = Message(content=content)
-sender.send(message)
- ]]> </programlisting>
- </example>
-
-
- <para>The following table shows the datatypes that can be sent in a Python map message,
- and the corresponding datatypes that will be received by clients in Java or C++.</para>
-
-
- <table id="table-Python-Maps" >
- <title>Python Datatypes in Maps</title>
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Python Datatype</entry>
- <entry>&rarr; C++</entry>
- <entry>&rarr; Java</entry>
- </row>
- </thead>
- <tbody>
- <row><entry>bool</entry><entry>bool</entry><entry>boolean</entry></row>
- <row><entry>int</entry><entry>int64</entry><entry>long</entry></row>
- <row><entry>long</entry><entry>int64</entry><entry>long</entry></row>
- <row><entry>float</entry><entry>double</entry><entry>double</entry></row>
- <row><entry>unicode</entry><entry>string</entry><entry>java.lang.String</entry></row>
- <row><entry>uuid</entry><entry>qpid::types::Uuid</entry><entry>java.util.UUID</entry></row>
- <row><entry>dict</entry><entry>Variant::Map</entry><entry>java.util.Map</entry></row>
- <row><entry>list</entry><entry>Variant::List</entry><entry>java.util.List</entry></row>
- </tbody>
- </tgroup>
- </table>
-
- </section>
-
-
-
-
- <section id="section-cpp-Maps">
- <title>Qpid Maps and Lists in C++</title>
-
-
- <para>In C++, Qpid defines the the
- <classname>Variant::Map</classname> and
- <classname>Variant::List</classname> types, which can be
- encoded into message content. The following code shows how to
- send these structures in a message:</para>
-
- <example>
- <title>Sending Qpid Maps and Lists in C++</title>
- <programlisting><![CDATA[
-using namespace qpid::types;
-
-// !!! SNIP !!!
-
-Message message;
-Variant::Map content;
-content["id"] = 987654321;
-content["name"] = "Widget";
-content["percent"] = 0.99;
-Variant::List colours;
-colours.push_back(Variant("red"));
-colours.push_back(Variant("green"));
-colours.push_back(Variant("white"));
-content["colours"] = colours;
-
-Variant::Map dimensions;
-dimensions["length"] = 10.2;
-dimensions["width"] = 5.1;
-dimensions["depth"] = 2.0;
-content["dimensions"]= dimensions;
-
-Variant::List part1;
-part1.push_back(Variant(1));
-part1.push_back(Variant(2));
-part1.push_back(Variant(5));
-
-Variant::List part2;
-part2.push_back(Variant(8));
-part2.push_back(Variant(2));
-part2.push_back(Variant(5));
-
-Variant::List parts;
-parts.push_back(part1);
-parts.push_back(part2);
-content["parts"]= parts;
-
-Variant::Map specs;
-specs["colours"] = colours;
-specs["dimensions"] = dimensions;
-specs["parts"] = parts;
-content["specs"] = specs;
-
-encode(content, message);
-sender.send(message, true);
-]]> </programlisting>
- </example>
-
- <para>The following table shows the datatypes that can be sent
- in a C++ map message, and the corresponding datatypes that
- will be received by clients in Java and Python.</para>
-
- <table id="table-cpp-Maps">
- <title>C++ Datatypes in Maps</title>
- <tgroup cols="3">
- <thead>
- <row>
- <entry>C++ Datatype</entry>
- <entry>&rarr; Python</entry>
- <entry>&rarr; Java</entry>
- </row>
- </thead>
- <tbody>
- <row><entry>bool</entry><entry>bool</entry><entry>boolean</entry></row>
- <row><entry>uint16</entry><entry>int | long</entry><entry>short</entry></row>
- <row><entry>uint32</entry><entry>int | long</entry><entry>int</entry></row>
- <row><entry>uint64</entry><entry>int | long</entry><entry>long</entry></row>
- <row><entry>int16</entry><entry>int | long</entry><entry>short</entry></row>
- <row><entry>int32</entry><entry>int | long</entry><entry>int</entry></row>
- <row><entry>int64</entry><entry>int | long</entry><entry>long</entry></row>
- <row><entry>float</entry><entry>float</entry><entry>float</entry></row>
- <row><entry>double</entry><entry>float</entry><entry>double</entry></row>
- <row><entry>string</entry><entry>unicode</entry><entry>java.lang.String</entry></row>
- <row><entry>qpid::types::Uuid</entry><entry>uuid</entry><entry>java.util.UUID</entry></row>
- <row><entry>Variant::Map</entry><entry>dict</entry><entry>java.util.Map</entry></row>
- <row><entry>Variant::List</entry><entry>list</entry><entry>java.util.List</entry></row>
- </tbody>
- </tgroup>
- </table>
- </section>
-
- <section id="section-dotnet-Maps">
- <title>Qpid Maps and Lists in .NET</title>
-
-
- <para>
- The .NET binding for the Qpid Messaging API binds .NET managed data types
- to C++ <classname>Variant</classname> data types. The following code shows how to
- send Map and List structures in a message:
- </para>
-
- <example>
- <?dbfo keep-together="auto" ?>
- <title>Sending Qpid Maps and Lists in .NET C#</title>
- <programlisting><![CDATA[
-using System;
-using Org.Apache.Qpid.Messaging;
-
-// !!! SNIP !!!
-
-Dictionary<string, object> content = new Dictionary<string, object>();
-Dictionary<string, object> subMap = new Dictionary<string, object>();
-Collection<object> colors = new Collection<object>();
-
-// add simple types
-content["id"] = 987654321;
-content["name"] = "Widget";
-content["percent"] = 0.99;
-
-// add nested amqp/map
-subMap["name"] = "Smith";
-subMap["number"] = 354;
-content["nestedMap"] = subMap;
-
-// add an amqp/list
-colors.Add("red");
-colors.Add("green");
-colors.Add("white");
-content["colorsList"] = colors;
-
-// add one of each supported amqp data type
-bool mybool = true;
-content["mybool"] = mybool;
-
-byte mybyte = 4;
-content["mybyte"] = mybyte;
-
-UInt16 myUInt16 = 5;
-content["myUInt16"] = myUInt16;
-
-UInt32 myUInt32 = 6;
-content["myUInt32"] = myUInt32;
-
-UInt64 myUInt64 = 7;
-content["myUInt64"] = myUInt64;
-
-char mychar = 'h';
-content["mychar"] = mychar;
-
-Int16 myInt16 = 9;
-content["myInt16"] = myInt16;
-
-Int32 myInt32 = 10;
-content["myInt32"] = myInt32;
-
-Int64 myInt64 = 11;
-content["myInt64"] = myInt64;
-
-Single mySingle = (Single)12.12;
-content["mySingle"] = mySingle;
-
-Double myDouble = 13.13;
-content["myDouble"] = myDouble;
-
-Guid myGuid = new Guid("000102030405060708090a0b0c0d0e0f");
-content["myGuid"] = myGuid;
-
-Message message = new Message(content);
-Send(message, true);
-]]> </programlisting>
- </example>
-
- <para>
- The following table shows the mapping between datatypes in .NET and C++.
- </para>
-
- <table id="table-dotnet-Maps">
- <title>Datatype Mapping between C++ and .NET binding</title>
- <tgroup cols="2">
- <thead>
- <row>
- <entry>C++ Datatype</entry>
- <entry>&rarr; .NET binding</entry>
- </row>
- </thead>
- <tbody>
- <row><entry>void</entry><entry>nullptr</entry></row>
- <row><entry>bool</entry><entry>bool</entry></row>
- <row><entry>uint8</entry><entry>byte</entry></row>
- <row><entry>uint16</entry><entry>UInt16</entry></row>
- <row><entry>uint32</entry><entry>UInt32</entry></row>
- <row><entry>uint64</entry><entry>UInt64</entry></row>
- <row><entry>uint8</entry><entry>char</entry></row>
- <row><entry>int16</entry><entry>Int16</entry></row>
- <row><entry>int32</entry><entry>Int32</entry></row>
- <row><entry>int64</entry><entry>Int64</entry></row>
- <row><entry>float</entry><entry>Single</entry></row>
- <row><entry>double</entry><entry>Double</entry></row>
- <row><entry>string</entry><entry>string
- <footnote id="callout-dotnet-string">
- <para>Strings are currently interpreted only with UTF-8 encoding.</para>
- </footnote></entry></row>
- <row><entry>qpid::types::Uuid</entry><entry>Guid</entry></row>
- <row><entry>Variant::Map</entry><entry><![CDATA[Dictionary<string, object>]]>
- <footnoteref linkend="callout-dotnet-string"/></entry></row>
- <row><entry>Variant::List</entry><entry><![CDATA[Collection<object>]]>
- <footnoteref linkend="callout-dotnet-string"/></entry></row>
- </tbody>
- </tgroup>
- </table>
-
-
- </section>
-
-
-</section>
-
- <section>
- <title>The Request / Response Pattern</title>
- <para>Request / Response applications use the reply-to property,
- described in <xref
- linkend="table-amqp0-10-message-properties"/>, to allow a server
- to respond to the client that sent a message. A server sets up a
- service queue, with a name known to clients. A client creates a
- private queue for the server's response, creates a message for a
- request, sets the request's reply-to property to the address of
- the client's response queue, and sends the request to the
- service queue. The server sends the response to the address
- specified in the request's reply-to property.
- </para>
- <example>
- <title>Request / Response Applications in C++</title>
-
- <para>This example shows the C++ code for a client and server
- that use the request / response pattern.</para>
-
- <para>The server creates a service queue and waits for a
- message to arrive. If it receives a message, it sends a
- message back to the sender.</para>
-
- <programlisting><![CDATA[Receiver receiver = session.createReceiver("service_queue; {create: always}");
-
-Message request = receiver.fetch();
-const Address&amp; address = request.getReplyTo(); // Get "reply-to" from request ...
-if (address) {
- Sender sender = session.createSender(address); // ... send response to "reply-to"
- Message response("pong!");
- sender.send(response);
- session.acknowledge();
-}
- ]]></programlisting>
-
- <para>The client creates a sender for the service queue, and
- also creates a response queue that is deleted when the
- client closes the receiver for the response queue. In the C++
- client, if the address starts with the character
- <literal>#</literal>, it is given a unique name.</para>
-
- <programlisting><![CDATA[
-Sender sender = session.createSender("service_queue");
-
-Address responseQueue("#response-queue; {create:always, delete:always}");
-Receiver receiver = session.createReceiver(responseQueue);
-
-Message request;
-request.setReplyTo(responseQueue);
-request.setContent("ping");
-sender.send(request);
-Message response = receiver.fetch();
-std::cout << request.getContent() << " -> " << response.getContent() << std::endl;
-]]> </programlisting>
-
- <para>The client sends the string <literal>ping</literal> to
- the server. The server sends the response
- <literal>pong</literal> back to the same client, using the
- <varname>replyTo</varname> property.</para>
-
- </example>
-<!--
- <example>
- <title>Request / Response Applications in Python</title>
- <programlisting>### TODO</programlisting>
- </example>
--->
- </section>
-
-
- <section>
- <title>Performance Tips</title>
-
- <itemizedlist>
- <listitem>
- <para>Consider prefetching messages for receivers (see
- <xref linkend="prefetch"/>). This helps eliminate roundtrips
- and increases throughput. Prefetch is disabled by default,
- and enabling it is the most effective means of improving
- throughput of received messages.</para>
- </listitem>
- <listitem>
- <para>Send messages asynchronously. Again, this helps
- eliminate roundtrips and increases throughput. The C++ and
- .NET clients send asynchronously by default, however the
- python client defaults to synchronous sends. </para>
- </listitem>
- <listitem>
- <para>Acknowledge messages in batches (see
- <xref linkend="acknowledgements"/>). Rather than
- acknowledging each message individually, consider issuing
- acknowledgements after n messages and/or after a particular
- duration has elapsed.</para>
- </listitem>
- <listitem>
- <para>Tune the sender capacity (see
- <xref linkend="replay"/>). If the capacity is too low the
- sender may block waiting for the broker to confirm receipt
- of messages, before it can free up more capacity.</para>
- </listitem>
- <listitem>
- <para>If you are setting a reply-to address on messages
- being sent by the c++ client, make sure the address type is
- set to either queue or topic as appropriate. This avoids the
- client having to determine which type of node is being
- refered to, which is required when hanling reply-to in AMQP
- 0-10. </para>
- </listitem>
- <listitem>
- <para>For latency sensitive applications, setting tcp-nodelay
- on qpidd and on client connections can help reduce the
- latency.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section>
- <title>Cluster Failover</title>
-
- <para>The messaging broker can be run in clustering mode, which provides high reliability through replicating state between brokers in the cluster. If one broker in a cluster fails, clients can choose another broker in the cluster and continue their work. Each broker in the cluster also advertises the addresses of all known brokers
-
-<footnote><para>This is done via the amq.failover exchange in AMQP 0-10</para></footnote>
-
-. A client can use this information to dynamically keep the list of reconnection urls up to date.</para>
-
- <para>In C++, the <classname>FailoverUpdates</classname> class provides this functionality:</para>
-
- <example>
- <title>Tracking cluster membership</title>
-
- <para>In C++:</para>
-
- <programlisting><![CDATA[
-#include <qpid/messaging/FailoverUpdates.h>
-...
-Connection connection("localhost:5672");
-connection.setOption("reconnect", true);
-try {
- connection.open();
- std::auto_ptr<FailoverUpdates> updates(new FailoverUpdates(connection));
-]]>
- </programlisting>
-
- <para>In python:</para>
-
- <programlisting><![CDATA[
-import qpid.messaging.util
-...
-connection = Connection("localhost:5672")
-connection.reconnect = True
-try:
- connection.open()
- auto_fetch_reconnect_urls(connection)
-]]>
- </programlisting>
- <para>
- In .NET C#:
- </para>
-
-<programlisting>
-using Org.Apache.Qpid.Messaging;
-...
-connection = new Connection(&#34;localhost:5672&#34;);
-connection.SetOption("reconnect", true);
-try {
- connection.Open();
- FailoverUpdates failover = new FailoverUpdates(connection);
-
-</programlisting>
-
-
- </example>
- </section>
-
-
-
-<section>
- <title>Logging</title>
-
- <para>To simplify debugging, Qpid provides a logging facility
- that prints out messaging events.</para>
-
- <section>
- <title>Logging in C++</title>
- <para>
- The Qpidd broker and C++ clients can both use environment variables to enable logging. Linux and Windows systems use the same named environment variables and values.
- </para>
- <para>Use QPID_LOG_ENABLE to set the level of logging you are interested in (trace, debug, info, notice, warning, error, or critical):
- </para>
-
-<screen>
-export QPID_LOG_ENABLE=&#34;warning+&#34;
-</screen>
- <para>
- The Qpidd broker and C++ clients use QPID_LOG_OUTPUT to determine where logging output should be sent. This is either a file name or the special values stderr, stdout, or syslog:
- </para>
-
-<screen>
-export QPID_LOG_TO_FILE=&#34;/tmp/myclient.out&#34;
-</screen>
-
- <para>
- From a Windows command prompt, use the following command format to set the environment variables:
- </para>
-
-<screen>
-set QPID_LOG_ENABLE=warning+
-set QPID_LOG_TO_FILE=D:\tmp\myclient.out
-</screen>
- </section>
-
- <section>
- <title>Logging in Python</title>
- <para>
- The Python client library supports logging using the standard Python logging module. The easiest way to do logging is to use the <command>basicConfig()</command>, which reports all warnings and errors:
- </para>
-
-<programlisting>from logging import basicConfig
-basicConfig()
-</programlisting>
- <para>
- Qpidd also provides a convenience method that makes it easy to specify the level of logging desired. For instance, the following code enables logging at the <command>DEBUG</command> level:
- </para>
-
-<programlisting>from qpid.log import enable, DEBUG
-enable("qpid.messaging.io", DEBUG)
-</programlisting>
- <para>
- For more information on Python logging, see <ulink url="http://docs.python.org/lib/node425.html">http://docs.python.org/lib/node425.html</ulink>. For more information on Qpid logging, use <command>$ pydoc qpid.log</command>.
- </para>
- </section>
-</section>
-
-
-
- <section id="section-amqp0-10-mapping">
- <title>The AMQP 0-10 mapping</title>
-
- <para>
- This section describes the AMQP 0-10 mapping for the Qpid
- Messaging API.
- </para>
- <para>
- The interaction with the broker triggered by creating a sender
- or receiver depends on what the specified address resolves
- to. Where the node type is not specified in the address, the
- client queries the broker to determine whether it refers to a
- queue or an exchange.
- </para>
- <para>
- When sending to a queue, the queue's name is set as the
- routing key and the message is transfered to the default (or
- nameless) exchange. When sending to an exchange, the message
- is transfered to that exchange and the routing key is set to
- the message subject if one is specified. A default subject may
- be specified in the target address. The subject may also be
- set on each message individually to override the default if
- required. In each case any specified subject is also added as
- a qpid.subject entry in the application-headers field of the
- message-properties.
- </para>
- <para>
- When receiving from a queue, any subject in the source address
- is currently ignored. The client sends a message-subscribe
- request for the queue in question. The accept-mode is
- determined by the reliability option in the link properties;
- for unreliable links the accept-mode is none, for reliable
- links it is explicit. The default for a queue is reliable. The
- acquire-mode is determined by the value of the mode option. If
- the mode is set to browse the acquire mode is not-acquired,
- otherwise it is set to pre-acquired. The exclusive and
- arguments fields in the message-subscribe command can be
- controlled using the x-subscribe map.
- </para>
- <para>
- When receiving from an exchange, the client creates a
- subscription queue and binds that to the exchange. The
- subscription queue's arguments can be specified using the
- x-declare map within the link properties. The reliability
- option determines most of the other parameters. If the
- reliability is set to unreliable then an auto-deleted,
- exclusive queue is used meaning that if the client or
- connection fails messages may be lost. For exactly-once the
- queue is not set to be auto-deleted. The durability of the
- subscription queue is determined by the durable option in the
- link properties. The binding process depends on the type of
- the exchange the source address resolves to.
- </para>
-
- <itemizedlist>
- <listitem>
- <para>
- For a topic exchange, if no subject is specified and no
- x-bindings are defined for the link, the subscription
- queue is bound using a wildcard matching any routing key
- (thus satisfying the expectation that any message sent to
- that address will be received from it). If a subject is
- specified in the source address however, it is used for
- the binding key (this means that the subject in the source
- address may be a binding pattern including wildcards).
- </para>
- </listitem>
- <listitem>
- <para>
- For a fanout exchange the binding key is irrelevant to
- matching. A receiver created from a source address that
- resolves to a fanout exchange receives all messages
- sent to that exchange regardless of any subject the source
- address may contain. An x-bindings element in the link
- properties should be used if there is any need to set the
- arguments to the bind.
- </para>
- </listitem>
- <listitem>
- <para>
- For a direct exchange, the subject is used as the binding
- key. If no subject is specified an empty string is used as
- the binding key.
- </para>
- </listitem>
- <listitem>
- <para>
- For a headers exchange, if no subject is specified the
- binding arguments simply contain an x-match entry and no
- other entries, causing all messages to match. If a subject
- is specified then the binding arguments contain an x-match
- entry set to all and an entry for qpid.subject whose value
- is the subject in the source address (this means the
- subject in the source address must match the message
- subject exactly). For more control the x-bindings element
- in the link properties must be used.
- </para>
- </listitem>
- <listitem>
- <para>
- For the XML exchange,<footnote><para>Note that the XML
- exchange is not a standard AMQP exchange type. It is a
- Qpid extension and is currently only supported by the C++
- broker.</para></footnote> if a subject is specified it is
- used as the binding key and an XQuery is defined that
- matches any message with that value for
- qpid.subject. Again this means that only messages whose
- subject exactly match that specified in the source address
- are received. If no subject is specified then the empty
- string is used as the binding key with an xquery that will
- match any message (this means that only messages with an
- empty string as the routing key will be received). For more
- control the x-bindings element in the link properties must
- be used. A source address that resolves to the XML
- exchange must contain either a subject or an x-bindings
- element in the link properties as there is no way at
- present to receive any message regardless of routing key.
- </para>
- </listitem>
- </itemizedlist>
-
- <para>
- If an x-bindings list is present in the link options a binding
- is created for each element within that list. Each element is
- a nested map that may contain values named queue, exchange,
- key or arguments. If the queue value is absent the queue name
- the address resolves to is implied. If the exchange value is
- absent the exchange name the address resolves to is implied.
- </para>
-
- <para>The following table shows how Qpid Messaging API message
- properties are mapped to AMQP 0-10 message properties and
- delivery properties. In this table <varname>msg</varname>
- refers to the Message class defined in the Qpid Messaging API,
- <varname>mp</varname> refers to an AMQP 0-10
- <varname>message-properties</varname> struct, and
- <varname>dp</varname> refers to an AMQP 0-10
- <varname>delivery-properties</varname> struct.</para>
-
- <table id="table-amqp0-10-message-properties" pgwide="1">
- <title>Mapping to AMQP 0-10 Message Properties</title>
- <tgroup cols="3">
- <thead>
- <colspec colnum="1" colname="Python API" colwidth="3*"/>
- <colspec colnum="2" colname="C++ API" colwidth="3*"/>
- <colspec colnum="3" colname="AMPQ 0-10 Property" colwidth="6*"/>
- <row>
- <entry>Python API</entry>
- <entry>C++ API
- <footnote>
- <para>
- The .NET Binding for C++ Messaging provides all the
- message and delivery properties described in the C++ API.
- See <xref linkend="table-Dotnet-Binding-Message" /> .
- </para>
- </footnote>
- </entry>
- <entry>AMQP 0-10 Property<footnote><para>In these entries, <literal>mp</literal> refers to an AMQP message property, and <literal>dp</literal> refers to an AMQP delivery property.</para></footnote></entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>msg.id</entry><entry>msg.{get,set}MessageId()</entry><entry>mp.message_id</entry>
- </row>
- <row>
- <entry>msg.subject</entry><entry>msg.{get,set}Subject()</entry><entry>mp.application_headers["qpid.subject"]</entry>
- </row>
- <row>
- <entry>msg.user_id</entry><entry>msg.{get,set}UserId()</entry><entry>mp.user_id</entry>
- </row>
- <row>
- <entry>msg.reply_to</entry><entry>msg.{get,set}ReplyTo()</entry><entry>mp.reply_to<footnote><para>The reply_to is converted from the protocol representation into an address.</para></footnote></entry>
- </row>
- <row>
- <entry>msg.correlation_id</entry><entry>msg.{get,set}CorrelationId()</entry><entry>mp.correlation_id</entry>
- </row>
- <row>
- <entry>msg.durable</entry><entry>msg.{get,set}Durable()</entry><entry>dp.delivery_mode == delivery_mode.persistent<footnote><para>Note that msg.durable is a boolean, not an enum.</para></footnote></entry>
- </row>
- <row>
- <entry>msg.priority</entry><entry>msg.{get,set}Priority()</entry><entry>dp.priority</entry>
- </row>
- <row>
- <entry>msg.ttl</entry><entry>msg.{get,set}Ttl()</entry><entry>dp.ttl</entry>
- </row>
- <row>
- <entry>msg.redelivered</entry><entry>msg.{get,set}Redelivered()</entry><entry>dp.redelivered</entry>
- </row>
- <row><entry>msg.properties</entry><entry>msg.getProperties()/msg.setProperty()</entry><entry>mp.application_headers</entry>
- </row>
- <row>
- <entry>msg.content_type</entry><entry>msg.{get,set}ContentType()</entry><entry>mp.content_type</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <section role="h3" id="section-amqp0-10-message-props">
- <title>0-10 Message Property Keys</title>
- <para>
- The QPID Messaging API also recognises special message property keys and
- automatically provides a mapping to their corresponding AMQP 0-10 definitions.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- When sending a message, if the properties contain an entry for
- <literal>x-amqp-0-10.app-id</literal>, its value will be used to set the
- <literal>message-properties.app-id</literal> property in the outgoing
- message. Likewise, if an incoming message has
- <literal>message-properties.app-id</literal> set, its value can be accessed
- via the <literal>x-amqp-0-10.app-id</literal> message property key.
- </para>
- </listitem>
- <listitem>
- <para>
- When sending a message, if the properties contain an entry for
- <literal>x-amqp-0-10.content-encoding</literal>, its value will be used to
- set the <literal>message-properties.content-encoding</literal> property in
- the outgoing message. Likewise, if an incoming message has
- <literal>message-properties.content-encoding</literal> set, its value can be
- accessed via the <literal>x-amqp-0-10.content-encoding</literal> message
- property key.
- </para>
- </listitem>
- <listitem>
- <para>
- The routing key (<literal>delivery-properties.routing-key</literal>) in an
- incoming messages can be accessed via the
- <literal>x-amqp-0-10.routing-key</literal> message property.
- </para>
- </listitem>
- <listitem>
- <para>
- If the timestamp delivery property is set in an incoming message
- (<literal>delivery-properties.timestamp</literal>), the timestamp value will
- be made available via the <literal>x-amqp-0-10.timestamp</literal> message
- property.
- <footnote>
- <para>
- This special property is currently not supported by the Qpid JMS client.
- </para>
- </footnote>
- </para>
- </listitem>
- </itemizedlist>
- <example>
- <title>Accessing the AMQP 0-10 Message Timestamp in Python</title>
- <para>
- The following code fragment checks for and extracts the message timestamp from
- a received message.
- </para>
- <programlisting lang="python">
-try:
- msg = receiver.fetch(timeout=1)
- if "x-amqp-0-10.timestamp" in msg.properties:
- print("Timestamp=%s" % str(msg.properties["x-amqp-0-10.timestamp"]))
-except Empty:
- pass
- </programlisting>
- </example>
- <example>
- <title>Accessing the AMQP 0-10 Message Timestamp in C++</title>
- <para>
- The same example, except in C++.
- </para>
- <programlisting lang="c++">
-messaging::Message msg;
-if (receiver.fetch(msg, messaging::Duration::SECOND*1)) {
- if (msg.getProperties().find("x-amqp-0-10.timestamp") != msg.getProperties().end()) {
- <![CDATA[std::cout << "Timestamp=" << msg.getProperties()["x-amqp-0-10.timestamp"].asString() << std::endl;]]>
- }
-}
- </programlisting>
- </example>
- </section>
- </section>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Message-Groups-Guide.xml"/>
-
- </chapter>
-
-
- <chapter id="QpidJMS">
- <title>Using the Qpid JMS client</title>
- <section>
- <title>A Simple Messaging Program in Java JMS</title>
-
- <para>The following program shows how to send and receive a
- message using the Qpid JMS client. JMS programs typically use
- JNDI to obtain connection factory and destination objects which
- the application needs. In this way the configuration is kept
- separate from the application code itself.</para>
-
- <para>In this example, we create a JNDI context using a
- properties file, use the context to lookup a connection factory,
- create and start a connection, create a session, and lookup a
- destination from the JNDI context. Then we create a producer and
- a consumer, send a message with the producer and receive it with
- the consumer. This code should be straightforward for anyone
- familiar with Java JMS.</para>
-
- <example>
- <title>"Hello world!" in Java</title>
- <programlisting lang="java">
-package org.apache.qpid.example.jmsexample.hello;
-
-import javax.jms.*;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import java.util.Properties;
-
-public class Hello {
-
- public Hello() {
- }
-
- public static void main(String[] args) {
- Hello producer = new Hello();
- producer.runTest();
- }
-
- private void runTest() {
- try {
- Properties properties = new Properties();
- properties.load(this.getClass().getResourceAsStream("hello.properties")); <co id="hello-java-properties" linkends="callout-java-properties"/>
- Context context = new InitialContext(properties); <co id="hello-java-context" linkends="callout-java-context"/>
-
- ConnectionFactory connectionFactory
- = (ConnectionFactory) context.lookup("qpidConnectionfactory"); <co id="hello-java-connection-factory" linkends="callout-java-connection-factory"/>
- Connection connection = connectionFactory.createConnection(); <co id="hello-java-connection" linkends="callout-java-connection"/>
- connection.start(); <co id="hello-java-start" linkends="callout-java-start"/>
-
- Session session=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);<co id="hello-java-session" linkends="callout-java-session"/>
- Destination destination = (Destination) context.lookup("topicExchange"); <co id="hello-java-destination" linkends="callout-java-destination"/>
-
- MessageProducer messageProducer = session.createProducer(destination); <co id="hello-java-producer" linkends="callout-java-producer"/>
- MessageConsumer messageConsumer = session.createConsumer(destination); <co id="hello-java-consumer" linkends="callout-java-consumer"/>
-
- TextMessage message = session.createTextMessage("Hello world!");
- messageProducer.send(message);
-
- message = (TextMessage)messageConsumer.receive(); <co id="hello-java-receive" linkends="callout-java-receive"/>
- System.out.println(message.getText());
-
- connection.close(); <co id="hello-java-close" linkends="callout-java-close"/>
- context.close(); <co id="hello-java-jndi-close" linkends="callout-java-jndi-close"/>
- }
- catch (Exception exp) {
- exp.printStackTrace();
- }
- }
-}
- </programlisting>
- </example>
-
- <calloutlist>
- <callout id="callout-java-properties" arearefs="hello-java-properties">
- <para>Loads the JNDI properties file, which specifies connection properties, queues, topics, and addressing options. See <xref linkend="QpidJNDI"/> for details.</para>
- </callout>
- <callout id="callout-java-context" arearefs="hello-java-context">
- <para>Creates the JNDI initial context.</para>
- </callout>
- <callout id="callout-java-connection-factory" arearefs="hello-java-connection-factory">
- <para>Creates a JMS connection factory for Qpid.</para>
- </callout>
- <callout id="callout-java-connection" arearefs="hello-java-connection">
- <para>Creates a JMS connection.</para>
- </callout>
- <callout id="callout-java-start" arearefs="hello-java-start">
- <para>Activates the connection.</para>
- </callout>
- <callout id="callout-java-session" arearefs="hello-java-session">
- <para>Creates a session. This session is not transactional (transactions='false'), and messages are automatically acknowledged.</para>
- </callout>
- <callout id="callout-java-destination" arearefs="hello-java-destination">
- <para>Creates a destination for the topic exchange, so senders and receivers can use it.</para>
- </callout>
- <callout id="callout-java-producer" arearefs="hello-java-producer">
- <para>Creates a producer that sends messages to the topic exchange.</para>
- </callout>
- <callout id="callout-java-consumer" arearefs="hello-java-consumer">
- <para>Creates a consumer that reads messages from the topic exchange.</para>
- </callout>
- <callout id="callout-java-receive" arearefs="hello-java-receive">
- <para>Reads the next available message.</para>
- </callout>
- <callout id="callout-java-close" arearefs="hello-java-close">
- <para>Closes the connection, all sessions managed by the connection, and all senders and receivers managed by each session.</para>
- </callout>
- <callout id="callout-java-jndi-close" arearefs="hello-java-jndi-close">
- <para>Closes the JNDI context.</para>
- </callout>
- </calloutlist>
-
- <para>The contents of the hello.properties file are shown below.</para>
-
- <example>
- <title>JNDI Properties File for "Hello world!" example</title>
- <programlisting>
-java.naming.factory.initial
- = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
-
-# connectionfactory.[jndiname] = [ConnectionURL]
-connectionfactory.qpidConnectionfactory
- = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672' <co id="hello-properties-connectionfactory" linkends="callout-hello-properties-connectionfactory"/>
-# destination.[jndiname] = [address_string]
-destination.topicExchange = amq.topic <co id="hello-properties-destination" linkends="callout-hello-properties-destination"/>
- </programlisting>
- </example>
-
- <calloutlist>
- <callout id="callout-hello-properties-connectionfactory" arearefs="hello-properties-connectionfactory">
- <para>Defines a connection factory from which connections
- can be created. The syntax of a ConnectionURL is given in
- <xref linkend="QpidJNDI"/>.</para>
- </callout>
- <callout id="callout-hello-properties-destination" arearefs="hello-properties-destination">
- <para>Defines a destination for which MessageProducers
- and/or MessageConsumers can be created to send and receive
- messages. The value for the destination in the properties
- file is an address string as described in
- <xref linkend="section-addresses"/>. In the JMS
- implementation MessageProducers are analogous to senders in
- the Qpid Message API, and MessageConsumers are analogous to
- receivers.</para>
- </callout>
- </calloutlist>
-
- </section>
-
- <section id="QpidJNDI">
- <title>Apache Qpid JNDI Properties for AMQP Messaging</title>
-
-
- <para>
- Apache Qpid defines JNDI properties that can be used to specify JMS Connections and Destinations. Here is a typical JNDI properties file:
- </para>
-
- <example>
- <title>JNDI Properties File</title>
- <programlisting><![CDATA[
-java.naming.factory.initial
- = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
-
-# connectionfactory.[jndiname] = [ConnectionURL]
-connectionfactory.qpidConnectionfactory
- = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
-# destination.[jndiname] = [address_string]
-destination.topicExchange = amq.topic
-]]></programlisting>
- </example>
-
- <para>The following sections describe the JNDI properties that Qpid uses.</para>
-
-
- <section>
- <title>JNDI Properties for Apache Qpid</title>
- <para>
- Apache Qpid supports the properties shown in the following table:
- </para>
- <table>
- <title>JNDI Properties supported by Apache Qpid</title>
- <tgroup cols="2">
- <thead>
- <row>
- <entry>
- Property
- </entry>
- <entry>
- Purpose
- </entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>
- connectionfactory.&lt;jndiname&gt;
- </entry>
- <entry>
- <para>
- The Connection URL that the connection factory uses to perform connections.
- </para>
- </entry>
- </row>
- <row>
- <entry>
- queue.&lt;jndiname&gt;
- </entry>
- <entry>
- <para>
- A JMS queue, which is implemented as an amq.direct exchange in Apache Qpid.
- </para>
- </entry>
- </row>
- <row>
- <entry>
- topic.&lt;jndiname&gt;
- </entry>
- <entry>
- <para>
- A JMS topic, which is implemented as an amq.topic exchange in Apache Qpid.
- </para>
- </entry>
- </row>
- <row>
- <entry>
- destination.&lt;jndiname&gt;
- </entry>
- <entry>
- <para>
- Can be used for defining all amq destinations,
- queues, topics and header matching, using an
- address string.
-
- <footnote><para>Binding URLs, which were used in
- earlier versions of the Qpid Java JMS client, can
- still be used instead of address
- strings.</para></footnote>
- </para>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
-
- <section id="section-jms-connection-url">
- <title>Connection URLs</title>
- <para>
- In JNDI properties, a Connection URL specifies properties for a connection. The format for a Connection URL is:
- </para>
-
- <programlisting>amqp://[&lt;user&gt;:&lt;pass&gt;@][&lt;clientid&gt;]&lt;virtualhost&gt;[?&lt;option&gt;=&#39;&lt;value&gt;&#39;[&amp;&lt;option&gt;=&#39;&lt;value&gt;&#39;]]
- </programlisting>
- <para>
- For instance, the following Connection URL specifies a user name, a password, a client ID, a virtual host ("test"), a broker list with a single broker, and a TCP host with the host name <quote>localhost</quote> using port 5672:
- </para>
-
- <programlisting>amqp://username:password@clientid/test?brokerlist=&#39;tcp://localhost:5672&#39;
- </programlisting>
- <para>
- Apache Qpid supports the following properties in Connection URLs:
- </para>
- <table pgwide="1">
- <title>Connection URL Properties</title>
- <tgroup cols="3">
- <thead>
- <row>
- <entry>
- Option
- </entry>
- <entry>
- Type
- </entry>
- <entry>
- Description
- </entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>
- brokerlist
- </entry>
- <entry>
- see below
- </entry>
- <entry>
- List of one or more broker addresses.
- </entry>
- </row>
- <row>
- <entry>
- maxprefetch
- </entry>
- <entry>
- integer
- </entry>
- <entry>
- <para>
- The maximum number of pre-fetched messages per consumer. If not specified, default value of 500 is used.
- </para>
- <para>
- Note: You can also set the default per-consumer prefetch value on a client-wide basis by configuring the client using <link linkend="client-jvm-properties">Java system properties.</link>
- </para>
- </entry>
- </row>
- <row>
- <entry>
- sync_publish
- </entry>
- <entry>
- {'persistent' | 'all'}
- </entry>
- <entry>
- A sync command is sent after every persistent message to guarantee that it has been received; if the value is 'persistent', this is done only for persistent messages.
- </entry>
- </row>
- <row>
- <entry>
- sync_ack
- </entry>
- <entry>
- Boolean
- </entry>
- <entry>
- A sync command is sent after every acknowledgement to guarantee that it has been received.
- </entry>
- </row>
- <row>
- <entry>
- use_legacy_map_msg_format
- </entry>
- <entry>
- Boolean
- </entry>
- <entry>
- If you are using JMS Map messages and deploying a new client with any JMS client older than 0.8 release, you must set this to true to ensure the older clients can understand the map message encoding.
- </entry>
- </row>
- <row>
- <entry>
- failover
- </entry>
- <entry>
- {'singlebroker' | 'roundrobin' | 'failover_exchange' | 'nofailover' | '&lt;class&gt;'}
- </entry>
- <entry>
- <para>
- This option controls failover behaviour. The method <literal>singlebroker</literal> uses only the first broker in the list,
- <literal>roundrobin</literal> will try each broker given in the broker list until a connection is established,
- <literal>failover_exchange</literal> connects to the initial broker given in the broker URL and will receive membership updates
- via the failover exchange. <literal>nofailover</literal> disables all retry and failover logic. Any other value is interpreted as a
- classname which must implement the <literal>org.apache.qpid.jms.failover.FailoverMethod</literal> interface.
- </para>
- <para>
- The broker list options <literal>retries</literal> and <literal>connectdelay</literal> (described below) determine the number of times a
- connection to a broker will be retried and the the length of time to wait between successive connection attempts before moving on to
- the next broker in the list. The failover option <literal>cyclecount</literal> controls the number of times to loop through the list of
- available brokers before finally giving up.
- </para>
- <para>
- Defaults to <literal>roundrobin</literal> if the brokerlist contains multiple brokers, or <literal>singlebroker</literal> otherwise.
- </para>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <para>
- Broker lists are specified using a URL in this format:
- </para>
-
- <programlisting>brokerlist=&lt;transport&gt;://&lt;host&gt;[:&lt;port&gt;](?&lt;param>='&lt;value>')(&amp;&lt;param>='&lt;value>')*</programlisting>
- <para>
- For instance, this is a typical broker list:
- </para>
-
- <programlisting>brokerlist=&#39;tcp://localhost:5672&#39;
- </programlisting>
-
- <para>
- A broker list can contain more than one broker address; if so, the connection is made to the first broker in the list that is available. In general, it is better to use the failover exchange when using multiple brokers, since it allows applications to fail over if a broker goes down.
- </para>
-
- <example>
- <title>Broker Lists</title>
- <para>A broker list can specify properties to be used when connecting to the broker, such as security options. This broker list specifies options for a Kerberos connection using GSSAPI:</para>
- <programlisting><![CDATA[
-amqp://guest:guest@test/test?sync_ack='true'
- &brokerlist='tcp://ip1:5672?sasl_mechs='GSSAPI''
- ]]></programlisting>
-
- <para>This broker list specifies SSL options:</para>
-
- <programlisting><![CDATA[
-amqp://guest:guest@test/test?sync_ack='true'
- &brokerlist='tcp://ip1:5672?ssl='true'&ssl_cert_alias='cert1''
- ]]></programlisting>
-
- <para>
- This broker list specifies two brokers using the connectdelay and retries broker options. It also illustrates the failover connection URL
- property.
- </para>
-
- <programlisting><![CDATA[
-
-amqp://guest:guest@/test?failover='roundrobin?cyclecount='2''
- &brokerlist='tcp://ip1:5672?retries='5'&connectdelay='2000';tcp://ip2:5672?retries='5'&connectdelay='2000''
- ]]></programlisting>
- </example>
-
- <para>The following broker list options are supported.</para>
-
- <table pgwide="1">
- <title>Broker List Options</title>
- <tgroup cols="3">
- <thead>
- <row>
- <entry>
- Option
- </entry>
- <entry>
- Type
- </entry>
- <entry>
- Description
- </entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>
- heartbeat
- </entry>
- <entry>
- integer
- </entry>
- <entry>
- frequency of heartbeat messages (in seconds)
- </entry>
- </row>
- <row>
- <entry>
- sasl_mechs
- </entry>
- <entry>
- --
- </entry>
- <entry>
- For secure applications, we suggest CRAM-MD5,
- DIGEST-MD5, or GSSAPI. The ANONYMOUS method is not
- secure. The PLAIN method is secure only when used
- together with SSL. For Kerberos, sasl_mechs must be
- set to GSSAPI, sasl_protocol must be set to the
- principal for the qpidd broker, e.g. qpidd/, and
- sasl_server must be set to the host for the SASL
- server, e.g. sasl.com. SASL External is supported
- using SSL certification, e.g.
- <literal>ssl='true'&amp;sasl_mechs='EXTERNAL'</literal>
- </entry>
- </row>
- <row>
- <entry>
- sasl_encryption
- </entry>
- <entry>
- Boolean
- </entry>
- <entry>
- If <literal>sasl_encryption='true'</literal>, the JMS client attempts to negotiate a security layer with the broker using GSSAPI to encrypt the connection. Note that for this to happen, GSSAPI must be selected as the sasl_mech.
- </entry>
- </row>
- <row>
- <entry>
- sasl_protocol
- </entry>
- <entry>
- --
- </entry>
- <entry>
- Used only for
- Kerberos. <literal>sasl_protocol</literal> must be
- set to the principal for the qpidd broker,
- e.g. <literal>qpidd/</literal>
- </entry>
- </row>
- <row>
- <entry>
- sasl_server
- </entry>
- <entry>
- --
- </entry>
- <entry>
- For Kerberos, sasl_mechs must be set to GSSAPI,
- sasl_server must be set to the host for the SASL
- server, e.g. <literal>sasl.com</literal>.
- </entry>
- </row>
- <row>
- <entry>
- trust_store
- </entry>
- <entry>
- --
- </entry>
- <entry>
- path to trust store
- </entry>
- </row>
- <row>
- <entry>
- trust_store_password
- </entry>
- <entry>
- </entry>
- <entry>
- Trust store password
- </entry>
- </row>
- <row>
- <entry>
- key_store
- </entry>
- <entry>
- </entry>
- <entry>
- path to key store
- </entry>
- </row>
- <row>
- <entry>
- key_store_password
- </entry>
- <entry>
- --
- </entry>
- <entry>
- key store password
- </entry>
- </row>
- <row>
- <entry>
- ssl
- </entry>
- <entry>
- Boolean
- </entry>
- <entry>
- If <literal>ssl='true'</literal>, the JMS client will encrypt the connection using SSL.
- </entry>
- </row>
- <row>
- <entry>
- ssl_verify_hostname
- </entry>
- <entry>
- Boolean
- </entry>
- <entry>
- When using SSL you can enable hostname verification
- by using <literal>ssl_verify_hostname='true'</literal> in the broker
- URL.
- </entry>
- </row>
- <row>
- <entry>
- ssl_cert_alias
- </entry>
- <entry>
-
- </entry>
- <entry>
- If multiple certificates are present in the keystore, the alias will be used to extract the correct certificate.
- </entry>
- </row>
- <row>
- <entry>
- retries
- </entry>
- <entry>
- integer
- </entry>
- <entry>
- The number of times to retry connection to each broker in the broker list. Defaults to 1.
- </entry>
- </row>
- <row>
- <entry>
- connectdelay
- </entry>
- <entry>
- integer
- </entry>
- <entry>
- Length of time to wait before attempting to reconnect (in milliseconds). Defaults to 0.
- </entry>
- </row>
- <row>
- <entry>
- connecttimeout
- </entry>
- <entry>
- integer
- </entry>
- <entry>
- Length of time to wait for the connection to succeed (in milliseconds). Defaults to 30000.
- </entry>
- </row>
- <row>
- <entry>
- tcp_nodelay
- </entry>
- <entry>
- Boolean
- </entry>
- <entry>
- If <literal>tcp_nodelay='true'</literal>, TCP packet
- batching is disabled. Defaults to true since Qpid 0.14.
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- </section>
-
- <section>
- <title>Java JMS Message Properties</title>
-
- <para>The following table shows how Qpid Messaging API message
- properties are mapped to AMQP 0-10 message properties and
- delivery properties. In this table <varname>msg</varname>
- refers to the Message class defined in the Qpid Messaging API,
- <varname>mp</varname> refers to an AMQP 0-10
- <varname>message-properties</varname> struct, and
- <varname>dp</varname> refers to an AMQP 0-10
- <varname>delivery-properties</varname> struct.</para>
-
- <table >
- <title>Java JMS Mapping to AMQP 0-10 Message Properties</title>
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Java JMS Message Property</entry>
- <entry>AMQP 0-10 Property<footnote><para>In these entries, <literal>mp</literal> refers to an AMQP message property, and <literal>dp</literal> refers to an AMQP delivery property.</para></footnote></entry>
-
- </row>
- </thead>
- <tbody>
- <row>
- <entry>JMSMessageID</entry><entry>mp.message_id</entry>
- </row>
- <row>
- <entry>qpid.subject<footnote><para>This is a custom JMS property, set automatically by the Java JMS client implementation.</para></footnote></entry><entry>mp.application_headers["qpid.subject"]</entry>
- </row>
- <row>
- <entry>JMSXUserID</entry><entry>mp.user_id</entry>
- </row>
- <row>
- <entry>JMSReplyTo</entry><entry>mp.reply_to<footnote><para>The reply_to is converted from the protocol representation into an address.</para></footnote></entry>
- </row>
- <row>
- <entry>JMSCorrelationID</entry><entry>mp.correlation_id</entry>
- </row>
- <row>
- <entry>JMSDeliveryMode</entry><entry>dp.delivery_mode</entry>
- </row>
- <row>
- <entry>JMSPriority</entry><entry>dp.priority</entry>
- </row>
- <row>
- <entry>JMSExpiration</entry><entry>dp.ttl<footnote><para>JMSExpiration = dp.ttl + currentTime</para></footnote></entry>
- </row>
- <row>
- <entry>JMSRedelivered</entry><entry>dp.redelivered</entry>
- </row>
- <row>
- <entry>JMS Properties</entry><entry>mp.application_headers</entry>
- </row>
- <row>
- <entry>JMSType</entry><entry>mp.content_type</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- </section>
-
- <section id="section-JMS-MapMessage">
- <title>JMS MapMessage Types</title>
-
- <para>Qpid supports the Java JMS <classname>MapMessage</classname> interface, which provides support for maps in messages. The following code shows how to send a <classname>MapMessage</classname> in Java JMS.</para>
-
- <example>
- <title>Sending a Java JMS MapMessage</title>
- <programlisting><![CDATA[
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.MapMessage;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-import java.util.Arrays;
-
-// !!! SNIP !!!
-
-MessageProducer producer = session.createProducer(queue);
-
-MapMessage m = session.createMapMessage();
-m.setIntProperty("Id", 987654321);
-m.setStringProperty("name", "Widget");
-m.setDoubleProperty("price", 0.99);
-
-List<String> colors = new ArrayList<String>();
-colors.add("red");
-colors.add("green");
-colors.add("white");
-m.setObject("colours", colors);
-
-Map<String,Double> dimensions = new HashMap<String,Double>();
-dimensions.put("length",10.2);
-dimensions.put("width",5.1);
-dimensions.put("depth",2.0);
-m.setObject("dimensions",dimensions);
-
-List<List<Integer>> parts = new ArrayList<List<Integer>>();
-parts.add(Arrays.asList(new Integer[] {1,2,5}));
-parts.add(Arrays.asList(new Integer[] {8,2,5}));
-m.setObject("parts", parts);
-
-Map<String,Object> specs = new HashMap<String,Object>();
-specs.put("colours", colors);
-specs.put("dimensions", dimensions);
-specs.put("parts", parts);
-m.setObject("specs",specs);
-
-producer.send(m);
- ]]></programlisting>
- </example>
-
- <para>The following table shows the datatypes that can be sent in a <classname>MapMessage</classname>, and the corresponding datatypes that will be received by clients in Python or C++.</para>
-
- <table id="table-Java-Maps">
- <title>Java Datatypes in Maps</title>
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Java Datatype</entry>
- <entry>&rarr; Python</entry>
- <entry>&rarr; C++</entry>
- </row>
- </thead>
- <tbody>
- <row><entry>boolean</entry><entry>bool</entry><entry>bool</entry></row>
- <row><entry>short</entry><entry>int | long</entry><entry>int16</entry></row>
- <row><entry>int</entry><entry>int | long</entry><entry>int32</entry></row>
- <row><entry>long</entry><entry>int | long</entry><entry>int64</entry></row>
- <row><entry>float</entry><entry>float</entry><entry>float</entry></row>
- <row><entry>double</entry><entry>float</entry><entry>double</entry></row>
- <row><entry>java.lang.String</entry><entry>unicode</entry><entry>std::string</entry></row>
- <row><entry>java.util.UUID</entry><entry>uuid</entry><entry>qpid::types::Uuid</entry></row>
- <row><entry>java.util.Map<footnote><para>In Qpid, maps can nest. This goes beyond the functionality required by the JMS specification.</para></footnote></entry><entry>dict</entry><entry>Variant::Map</entry></row>
- <row><entry>java.util.List</entry><entry>list</entry><entry>Variant::List</entry></row>
- </tbody>
- </tgroup>
- </table>
-
- </section>
-
- <section id="section-JMS-Logging">
- <title>JMS Client Logging</title>
- <para>The JMS Client logging is handled using the Simple Logging Facade for Java (<ulink url="http://www.slf4j.org/">SLF4J</ulink>). As the name implies, slf4j is a facade that delegates to other logging systems like log4j or JDK 1.4 logging. For more information on how to configure slf4j for specific logging systems, please consult the slf4j documentation.</para>
-
- <para>When using the log4j binding, please set the log level for org.apache.qpid explicitly. Otherwise log4j will default to DEBUG which will degrade performance considerably due to excessive logging. The recommended logging level for production is <literal>WARN</literal>.</para>
-
- <para>The following example shows the logging properties used to configure client logging for slf4j using the log4j binding. These properties can be placed in a log4j.properties file and placed in the <varname>CLASSPATH</varname>, or they can be set explicitly using the <literal>-Dlog4j.configuration</literal> property.</para>
-
- <example>
- <title>log4j Logging Properties</title>
-
- <programlisting><![CDATA[
-log4j.logger.org.apache.qpid=WARN, console
-log4j.additivity.org.apache.qpid=false
-
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-log4j.appender.console.Threshold=all
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern=%t %d %p [%c{4}] %m%n
-]]></programlisting>
- </example>
-
- </section>
-
- <section>
- <title>Configuring the JMS Client</title>
-
- <para>The Qpid JMS Client allows several configuration options to customize it's behaviour at different levels of granualarity.</para>
-
- <itemizedlist>
- <listitem>
- <para>
- JVM level using JVM arguments : Configuration that affects all connections, sessions, consumers and producers created within that JVM.
- </para>
- <para>Ex. <varname>-Dmax_prefetch=1000</varname> property specifies the message credits to use.</para>
- </listitem>
-
- <listitem>
- <para>
- Connection level using Connection/Broker properties : Affects the respective connection and sessions, consumers and produces created by that connection.
- </para>
- <para>Ex. <varname>amqp://guest:guest@test/test?max_prefetch='1000'
- &amp;brokerlist='tcp://localhost:5672'
-</varname> property specifies the message credits to use. This overrides any value specified via the JVM argument <varname>max_prefetch</varname>.</para>
- <para>Please refer to the <xref linkend="section-jms-connection-url"/> section for a complete list of all properties and how to use them.</para>
- </listitem>
-
- <listitem>
- <para>
- Destination level using Addressing options : Affects the producer(s) and consumer(s) created using the respective destination.
- </para>
- <para>Ex. <varname>my-queue; {create: always, link:{capacity: 10}}</varname>, where <varname>capacity</varname> option specifies the message credits to use. This overrides any connection level configuration.</para>
- <para>Please refer to the <xref linkend="section-addresses"/> section for a complete understanding of addressing and it's various options.</para>
- </listitem>
- </itemizedlist>
-
-<para>Some of these config options are available at all three levels (Ex. <varname>max_prefetch</varname>), while others are available only at JVM or connection level.</para>
-
- <section id="client-jvm-properties">
- <title>Qpid JVM Arguments</title>
-
- <table >
- <title>Config Options For Connection Behaviour</title>
- <tgroup cols="4">
- <thead>
- <row>
- <entry>Property Name</entry>
- <entry>Type</entry>
- <entry>Default Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>qpid.amqp.version</entry>
- <entry>string</entry>
- <entry>0-10</entry>
- <entry><para>Sets the AMQP version to be used - currently supports one of {0-8,0-9,0-91,0-10}.</para><para>The client will begin negotiation at the specified version and only negotiate downwards if the Broker does not support the specified version.</para></entry>
- </row>
- <row>
- <entry>qpid.heartbeat</entry>
- <entry>int</entry>
- <entry>120 (secs)</entry>
- <entry>The heartbeat interval in seconds. Two consective misssed heartbeats will result in the connection timing out.<para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
- </row>
-
- <row>
- <entry>ignore_setclientID</entry>
- <entry>boolean</entry>
- <entry>false</entry>
- <entry>If a client ID is specified in the connection URL it's used or else an ID is generated. If an ID is specified after it's been set Qpid will throw an exception. <para>Setting this property to 'true' will disable that check and allow you to set a client ID of your choice later on.</para></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
-
- <table >
- <title>Config Options For Session Behaviour</title>
- <tgroup cols="4">
- <thead>
- <row>
- <entry>Property Name</entry>
- <entry>Type</entry>
- <entry>Default Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>qpid.session.command_limit</entry>
- <entry>int</entry>
- <entry>65536</entry>
- <entry>Limits the # of unacked commands</entry>
- </row>
-
- <row>
- <entry>qpid.session.byte_limit</entry>
- <entry>int</entry>
- <entry>1048576</entry>
- <entry>Limits the # of unacked commands in terms of bytes</entry>
- </row>
-
- <row>
- <entry>qpid.use_legacy_map_message</entry>
- <entry>boolean</entry>
- <entry>false</entry>
- <entry><para>If set will use the old map message encoding. By default the Map messages are encoded using the 0-10 map encoding.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
- </row>
-
- <row>
- <entry>qpid.jms.daemon.dispatcher</entry>
- <entry>boolean</entry>
- <entry>false</entry>
- <entry><para>Controls whether the Session dispatcher thread is a daemon thread or not. If this system property is set to true then the Session dispatcher threads will be created as daemon threads. This setting is introduced in version 0.16.</para></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table >
- <title>Config Options For Consumer Behaviour</title>
- <tgroup cols="4">
- <thead>
- <row>
- <entry>Property Name</entry>
- <entry>Type</entry>
- <entry>Default Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>max_prefetch</entry>
- <entry>int</entry>
- <entry>500</entry>
- <entry>Maximum number of pre-fetched messages per consumer. <para>This can also be defaulted for consumers created on a particular connection using the <link linkend="section-jms-connection-url">Connection URL</link> options, or per destination (see the <varname>capacity</varname> option under link properties in addressing)</para></entry>
- </row>
-
- <row>
- <entry>qpid.session.max_ack_delay</entry>
- <entry>long</entry>
- <entry>1000 (ms)</entry>
- <entry><para>Timer interval to flush message acks in buffer when using AUTO_ACK and DUPS_OK.</para> <para>When using the above ack modes, message acks are batched and sent if one of the following conditions are met (which ever happens first).
- <itemizedlist>
- <listitem><para>When the ack timer fires.</para></listitem>
- <listitem><para>if un_acked_msg_count > max_prefetch/2.</para></listitem>
- </itemizedlist>
- </para>
- <para>The ack timer can be disabled by setting it to 0.</para>
- </entry>
- </row>
-
- <row>
- <entry>sync_ack</entry>
- <entry>boolean</entry>
- <entry>false</entry>
- <entry><para>If set, each message will be acknowledged synchronously. When using AUTO_ACK mode, you need to set this to "true", in order to get the correct behaviour as described by the JMS spec.</para><para>This is set to false by default for performance reasons, therefore by default AUTO_ACK behaves similar to DUPS_OK.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table >
- <title>Config Options For Producer Behaviour</title>
- <tgroup cols="4">
- <thead>
- <row>
- <entry>Property Name</entry>
- <entry>Type</entry>
- <entry>Default Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>sync_publish</entry>
- <entry>string</entry>
- <entry>"" (disabled)</entry>
- <entry><para>If one of {persistent|all} is set then persistent messages or all messages will be sent synchronously.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table >
- <title>Config Options For Threading</title>
- <tgroup cols="4">
- <thead>
- <row>
- <entry>Property Name</entry>
- <entry>Type</entry>
- <entry>Default Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>qpid.thread_factory</entry>
- <entry>string</entry>
- <entry>org.apache.qpid.thread.DefaultThreadFactory</entry>
- <entry><para>Specifies the thread factory to use.</para><para>If using a real time JVM, you need to set the above property to <varname>org.apache.qpid.thread.RealtimeThreadFactory</varname>.</para></entry>
- </row>
-
- <row>
- <entry>qpid.rt_thread_priority</entry>
- <entry>int</entry>
- <entry>20</entry>
- <entry><para>Specifies the priority (1-99) for Real time threads created by the real time thread factory.</para></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table >
- <title>Config Options For I/O</title>
- <tgroup cols="4">
- <thead>
- <row>
- <entry>Property Name</entry>
- <entry>Type</entry>
- <entry>Default Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>qpid.transport</entry>
- <entry>string</entry>
- <entry>org.apache.qpid.transport.network.io.IoNetworkTransport</entry>
- <entry><para>The transport implementation to be used.</para><para>A user could specify an alternative transport mechanism that implements the interface <varname>org.apache.qpid.transport.network.OutgoingNetworkTransport</varname>.</para></entry>
- </row>
- <row>
- <entry>qpid.sync_op_timeout</entry>
- <entry>long</entry>
- <entry>60000</entry>
- <entry><para>The length of time (in milliseconds) to wait for a synchronous operation to complete.</para><para>For compatibility with older clients, the synonym <varname>amqj.default_syncwrite_timeout</varname> is supported.</para></entry>
- </row>
- <row>
- <entry>qpid.tcp_nodelay</entry>
- <entry>boolean</entry>
- <entry>true</entry>
- <entry>
- <para>Sets the TCP_NODELAY property of the underlying socket. The default was changed to true as of Qpid 0.14.</para>
- <para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para>
- <para>For compatibility with older clients, the synonym <varname>amqj.tcp_nodelay</varname> is supported.</para>
- </entry>
- </row>
- <row>
- <entry>qpid.send_buffer_size</entry>
- <entry>integer</entry>
- <entry>65535</entry>
- <entry>
- <para>Sets the SO_SNDBUF property of the underlying socket. Added in Qpid 0.16.</para>
- <para>For compatibility with older clients, the synonym <varname>amqj.sendBufferSize</varname> is supported.</para>
- </entry>
- </row>
- <row>
- <entry>qpid.receive_buffer_size</entry>
- <entry>integer</entry>
- <entry>65535</entry>
- <entry>
- <para>Sets the SO_RCVBUF property of the underlying socket. Added in Qpid 0.16.</para>
- <para>For compatibility with older clients, the synonym <varname>amqj.receiveBufferSize</varname> is supported.</para>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table >
- <title>Config Options For Security</title>
- <tgroup cols="4">
- <thead>
- <row>
- <entry>Property Name</entry>
- <entry>Type</entry>
- <entry>Default Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>qpid.sasl_mechs</entry>
- <entry>string</entry>
- <entry>PLAIN</entry>
- <entry><para>The SASL mechanism to be used. More than one could be specified as a comma separated list.</para><para>We currently support the following mechanisms {PLAIN | GSSAPI | EXTERNAL}.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
- </row>
-
- <row>
- <entry>qpid.sasl_protocol</entry>
- <entry>string</entry>
- <entry>AMQP</entry>
- <entry><para>When using GSSAPI as the SASL mechanism, <varname>sasl_protocol</varname> must be set to the principal for the qpidd broker, e.g. <varname>qpidd</varname>.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
- </row>
-
- <row>
- <entry>qpid.sasl_server_name</entry>
- <entry>string</entry>
- <entry>localhost</entry>
- <entry><para>When using GSSAPI as the SASL mechanism, <varname>sasl_server</varname> must be set to the host for the SASL server, e.g. <varname>example.com</varname>.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table>
- <title>Config Options For Security - Standard JVM properties needed when using GSSAPI as the SASL mechanism.<footnote><para>Please refer to the Java security documentation for a complete understanding of the above properties.</para></footnote></title>
- <tgroup cols="4">
- <thead>
- <row>
- <entry>Property Name</entry>
- <entry>Type</entry>
- <entry>Default Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>javax.security.auth.useSubjectCredsOnly</entry>
- <entry>boolean</entry>
- <entry>true</entry>
- <entry><para>If set to 'false', forces the SASL GASSPI client to obtain the kerberos credentials explicitly instead of obtaining from the "subject" that owns the current thread.</para></entry>
- </row>
-
- <row>
- <entry>java.security.auth.login.config</entry>
- <entry>string</entry>
- <entry></entry>
- <entry><para>Specifies the jass configuration file.</para><para><varname>Ex-Djava.security.auth.login.config=myjas.conf</varname>
-</para><para>Here is the sample myjas.conf JASS configuration file: <programlisting><![CDATA[
-
- com.sun.security.jgss.initiate {
- com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;
- };
-
-]]></programlisting></para></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table>
- <title>Config Options For Security - Using SSL for securing connections or using EXTERNAL as the SASL mechanism.</title>
- <tgroup cols="4">
- <thead>
- <row>
- <entry>Property Name</entry>
- <entry>Type</entry>
- <entry>Default Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>qpid.ssl_timeout</entry>
- <entry>long</entry>
- <entry>60000</entry>
- <entry><para>Timeout value used by the Java SSL engine when waiting on operations.</para></entry>
- </row>
-
- <row>
- <entry>qpid.ssl.KeyManagerFactory.algorithm</entry>
- <entry>string</entry>
- <entry>-</entry>
- <entry>
- <para>The key manager factory algorithm name. If not set, defaults to the value returned from the Java runtime call <literal>KeyManagerFactory.getDefaultAlgorithm()</literal></para>
- <para>For compatibility with older clients, the synonym <varname>qpid.ssl.keyStoreCertType</varname> is supported.</para>
- </entry>
- </row>
-
- <row>
- <entry>qpid.ssl.TrustManagerFactory.algorithm</entry>
- <entry>string</entry>
- <entry>-</entry>
- <entry>
- <para>The trust manager factory algorithm name. If not set, defaults to the value returned from the Java runtime call <literal>TrustManagerFactory.getDefaultAlgorithm()</literal></para>
- <para>For compatibility with older clients, the synonym <varname>qpid.ssl.trustStoreCertType</varname> is supported.</para>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table>
- <title>Config Options For Security - Standard JVM properties needed when Using SSL for securing connections or using EXTERNAL as the SASL mechanism.<footnote><para>Qpid allows you to have per connection key and trust stores if required. If specified per connection, the JVM arguments are ignored.</para></footnote></title>
- <tgroup cols="4">
- <thead>
- <row>
- <entry>Property Name</entry>
- <entry>Type</entry>
- <entry>Default Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>javax.net.ssl.keyStore</entry>
- <entry>string</entry>
- <entry>jvm default</entry>
- <entry><para>Specifies the key store path.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
- </row>
-
- <row>
- <entry>javax.net.ssl.keyStorePassword</entry>
- <entry>string</entry>
- <entry>jvm default</entry>
- <entry><para>Specifies the key store password.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
- </row>
-
- <row>
- <entry>javax.net.ssl.trustStore</entry>
- <entry>string</entry>
- <entry>jvm default</entry>
- <entry><para>Specifies the trust store path.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
- </row>
-
- <row>
- <entry>javax.net.ssl.trustStorePassword</entry>
- <entry>string</entry>
- <entry>jvm default</entry>
- <entry><para>Specifies the trust store password.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- </section>
-
- </chapter>
-
- <chapter id="QpidWCF">
- <title>Using the Qpid WCF client</title>
- <section>
- <title>XML and Binary Bindings</title>
-
- <para>The Qpid WCF client provides two bindings, each with support for
- Windows .NET transactions.</para>
-
- <para>The AmqpBinding is suitable for communication between two WCF
- applications. By default it uses the WCF binary .NET XML encoder
- (BinaryMessageEncodingBindingElement) for efficient message
- transmission, but it can also use the text and Message Transmission
- Optimization Mechanism (MTOM) encoders. Here is a traditional service
- model sample program using the AmqpBinding. It assumes that the queue
- "hello_service_node" has been created and configured on the AMQP
- broker.</para>
-
- <example><?dbfo keep-together="auto" ?>
- <title>Traditional service model "Hello world!" example</title>
- <programlisting><![CDATA[
-namespace Apache.Qpid.Documentation.HelloService
-{
- using System;
- using System.ServiceModel;
- using System.ServiceModel.Channels;
- using System.Threading;
- using Apache.Qpid.Channel;
-
- [ServiceContract]
- public interface IHelloService
- {
- [OperationContract(IsOneWay = true, Action = "*")]
- void SayHello(string greeting);
- }
-
- public class HelloService : IHelloService
- {
- private static int greetingCount;
-
- public static int GreetingCount
- {
- get { return greetingCount; }
- }
-
- public void SayHello(string greeting)
- {
- Console.WriteLine("Service received: " + greeting);
- greetingCount++;
- }]]></programlisting>
-
- <programlisting><![CDATA[
- static void Main(string[] args)
- {
- try
- {
- AmqpBinding amqpBinding = new AmqpBinding();
- amqpBinding.BrokerHost = "localhost";
- amqpBinding.BrokerPort = 5672;
-
- ServiceHost serviceHost = new ServiceHost(typeof(HelloService));
- serviceHost.AddServiceEndpoint(typeof(IHelloService),
- amqpBinding, "amqp:hello_service_node");
- serviceHost.Open();
-
- // Send the service a test greeting
- Uri amqpClientUri=new Uri("amqp:amq.direct?routingkey=hello_service_node");
- EndpointAddress clientEndpoint = new EndpointAddress(amqpClientUri);
- ChannelFactory<IHelloService> channelFactory =
- new ChannelFactory<IHelloService>(amqpBinding, clientEndpoint);
- IHelloService clientProxy = channelFactory.CreateChannel();
-
- clientProxy.SayHello("Greetings from WCF client");
-
- // wait for service to process the greeting
- while (HelloService.GreetingCount == 0)
- {
- Thread.Sleep(100);
- }
- channelFactory.Close();
- serviceHost.Close();
- }
- catch (Exception e)
- {
- Console.WriteLine("Exception: {0}", e);
- }
- }
- }
-}
- ]]></programlisting>
- </example>
-
- <para>The second binding, AmqpBinaryBinding, is suitable for WCF
- applications that need to inter-operate with non-WCF clients or that
- wish to have direct access to the raw wire representation of the
- message body. It relies on a custom encoder to read and write raw
- (binary) content which operates similarly to the ByteStream encoder
- (introduced in .NET 4.0). The encoder presents an abstract XML
- infoset view of the raw message content on input. On output, the
- encoder does the reverse and peels away the XML infoset layer exposing
- the raw content to the wire representation of the message body. The
- application must do the inverse of what the encoder does to allow the
- XML infoset wrapper to cancel properly. This is demonstrated in the
- following sample code (using the channel programming model) which
- directly manipulates or provides callbacks to the WCF message readers
- and writers when the content is consumed. In contrast to the
- AmqpBinding sample where the simple greeting is encapsulated in a
- compressed SOAP envelope, the wire representation of the message
- contains the raw content and is identical and fully interoperable with
- the Qpid C++ "Hello world!" example.</para>
-
- <example><?dbfo keep-together="auto" ?>
- <title>Binary "Hello world!" example using the channel model</title>
- <programlisting><![CDATA[
-namespace Apache.Qpid.Samples.Channel.HelloWorld
-{
- using System;
- using System.ServiceModel;
- using System.ServiceModel.Channels;
- using System.ServiceModel.Description;
- using System.Text;
- using System.Xml;
- using Apache.Qpid.Channel;
-
- public class HelloWorld
- {
- static void Main(string[] args)
- {
- String broker = "localhost";
- int port = 5672;
- String target = "amq.topic";
- String source = "my_topic_node";
-
- if (args.Length > 0)
- {
- broker = args[0];
- }
-
- if (args.Length > 1)
- {
- port = int.Parse(args[1]);
- }
-
- if (args.Length > 2)
- {
- target = args[2];
- }
-
- if (args.Length > 3)
- {
- source = args[3];
- }
-
- AmqpBinaryBinding binding = new AmqpBinaryBinding();
- binding.BrokerHost = broker;
- binding.BrokerPort = port;
-
- IChannelFactory<IInputChannel> receiverFactory = binding.BuildChannelFactory<IInputChannel>();
- receiverFactory.Open();
- IInputChannel receiver = receiverFactory.CreateChannel(new EndpointAddress("amqp:" + source));
- receiver.Open();
-
- IChannelFactory<IOutputChannel> senderFactory = binding.BuildChannelFactory<IOutputChannel>();
- senderFactory.Open();
- IOutputChannel sender = senderFactory.CreateChannel(new EndpointAddress("amqp:" + target));
- sender.Open();
-
- sender.Send(Message.CreateMessage(MessageVersion.None, "", new HelloWorldBinaryBodyWriter()));
-
- Message message = receiver.Receive();
- XmlDictionaryReader reader = message.GetReaderAtBodyContents();
- while (!reader.HasValue)
- {
- reader.Read();
- }
-
- byte[] binaryContent = reader.ReadContentAsBase64();
- string text = Encoding.UTF8.GetString(binaryContent);
-
- Console.WriteLine(text);
-
- senderFactory.Close();
- receiverFactory.Close();
- }
- }
-
- public class HelloWorldBinaryBodyWriter : BodyWriter
- {
- public HelloWorldBinaryBodyWriter() : base (true) {}
-
- protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
- {
- byte[] binaryContent = Encoding.UTF8.GetBytes("Hello world!");
-
- // wrap the content:
- writer.WriteStartElement("Binary");
- writer.WriteBase64(binaryContent, 0, binaryContent.Length);
- }
- }
-}
-]]></programlisting>
- </example>
-
- <para>Bindings define ChannelFactories and ChannelListeners associated with
- an AMQP Broker. WCF will frequently automatically create and manage
- the life cycle of a these and the resulting IChannel objects used in
- message transfer. The binding parameters that can be set are:</para>
-
- <table pgwide="1">
- <title>WCF Binding Parameters</title>
- <tgroup cols="3">
- <thead>
- <colspec colnum="1" colwidth="1*"/>
- <colspec colnum="2" colwidth="3*"/>
- <colspec colnum="3" colwidth="3*"/>
- <row>
- <entry>Parameter</entry>
- <entry>Default</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>
- BrokerHost
- </entry>
- <entry>
- localhost
- </entry>
- <entry>
- The broker's server name. Currently the WCF channel
- only supports connections with a single broker.
- Failover to multiple brokers will be provided in the
- future.
- </entry>
- </row>
-
- <row>
- <entry>
- BrokerPort
- </entry>
- <entry>
- 5672
- </entry>
- <entry>
- The port the broker is listening on.
- </entry>
- </row>
-
- <row>
- <entry>
- PrefetchLimit
- </entry>
- <entry>
- 0
- </entry>
- <entry>
- The number of messages to prefetch from the amqp
- broker before the application actually consumes them.
- Increasing this number can dramatically increase the
- read performance in some circumstances.
- </entry>
- </row>
-
- <row>
- <entry>
- Shared
- </entry>
- <entry>
- false
- </entry>
- <entry>
- Indicates if separate channels to the same broker can
- share an underlying AMQP tcp connection (provided they
- also share the same authentication credentials).
- </entry>
- </row>
-
- <row>
- <entry>
- TransferMode
- </entry>
- <entry>
- buffered
- </entry>
- <entry>
- Indicates whether the channel's encoder uses the WCF
- BufferManager cache to temporarily store message
- content during the encoding/decoding phase. For small
- to medium sized SOAP based messages, buffered is
- usually the preferred choice. For binary messages,
- streamed TransferMode is the more efficient mode.
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
-
- <section>
- <title>Endpoints</title>
-
- <para>In Qpid 0.6 the WCF Endpoints map to simple AMQP 0-10
- exchanges (IOutputChannel) or AMQP 0-10 queues (IInputChannel).
- The format for an IOutputChannel is</para>
-
- <programlisting><![CDATA[
- "amqp:amq.direct" or "amqp:my_exchange?routingkey=my_routing_key"
-]]></programlisting>
-
- <para>and for an IInputChannel is</para>
-
- <programlisting><![CDATA[
- "amqp:my_queue"
-]]></programlisting>
-
- <para>The routing key is in fact a default value associated with
- the particular channel. Outgoing messages can always have their
- routing key uniquely set.</para>
-
- <para>If the respective queue or exchange doesn't exist, an exception
- is thrown when opening the channel. Queues and exchanges can be
- created and configured using qpid-config.</para>
-
- </section>
-
- <section>
- <title>Message Headers</title>
-
- <para>AMQP specific message headers can be set on or retrieved
- from the ServiceModel.Channels.Message using the AmqpProperties
- type.</para>
-
- <para>For example, on output:</para>
-
- <programlisting><![CDATA[
-AmqpProperties props = new AmqpProperties();
-props.Durable = true;
-props.PropertyMap.Add("my_custom_header", new AmqpString("a custom value"));
-Message msg = Message.CreateMessage(args);
-msg.Properties.Add("AmqpProperties", amqpProperties);
-outputChannel.Send(msg);
-]]></programlisting>
-
- <para>On input the headers can be accessed from the Message or extracted
- from the operation context</para>
-
- <programlisting><![CDATA[
-public void SayHello(string greeting)
-{
- AmqpProperties props = (AmqpProperties) OperationContext.
- Current.IncomingMessageProperties["AmqpProperties"];
- AmqpString extra = (AmqpString) props.PropertyMap["my_custom_header"];
- Console.WriteLine("Service received: {0} and {1}", greeting, extra);
-}
-]]></programlisting>
-
- </section>
-
- <section>
- <title>Security</title>
-
- <para>To engage TLS/SSL:</para>
-
- <programlisting><![CDATA[
-binding.Security.Mode = AmqpSecurityMode.Transport;
-binding.Security.Transport.UseSSL = true;
-binding.BrokerPort = 5671;
-]]></programlisting>
-
- <para>Currently the WCF client only provides SASL PLAIN (i.e. username and
- password) authentication. To provide a username and password, you can
- set the DefaultAmqpCredential value in the binding. This value can be
- overridden or set for a binding's channel factories and listeners,
- either by setting the ClientCredentials as a binding parameter, or by
- using an AmqpCredential as a binding parameter. The search order for
- credentials is the AmqpCredential binding parameter, followed by the
- ClientCredentials (unless IgnoreEndpointClientCredentials has been
- set), and finally defaulting to the DefaultAmqpCredential of the
- binding itself. Here is a sample using ClientCredentials:</para>
-
- <programlisting><![CDATA[
-ClientCredentials credentials = new ClientCredentials();
-credentials.UserName.UserName = "guest";
-credentials.UserName.Password = "guest";
-bindingParameters = new BindingParameterCollection();
-bindingParameters.Add(credentials);
-readerFactory = binding.BuildChannelFactory<IInputChannel>(bindingParameters);
-]]></programlisting>
-
- </section>
-
- <section>
- <title>Transactions</title>
-
- <para>The WCF channel provides a transaction resource manager
- module and a recovery module that together provide distributed
- transaction support with one-phase optimization. Some
- configuration is required on Windows machines to enable
- transaction support (see your installation notes or top level
- ReadMe.txt file for instructions). Once properly configured,
- the Qpid WCF channel acts as any other System.Transactions aware
- resource, capable of participating in explicit or implicit
- transactions.</para>
-
- <para>Server code:</para>
-
- <programlisting><![CDATA[
-[OperationBehavior(TransactionScopeRequired = true,
- TransactionAutoComplete = true)]
-
-public void SayHello(string greeting)
-{
- // increment ExactlyOnceReceived counter on DB
-
- // Success: transaction auto completes:
-}
-]]></programlisting>
-
- <para>Because this operation involves two transaction resources, the
- database and the AMQP message broker, this operates as a full two
- phase commit transaction managed by the Distributed Transaction
- Coordinator service. If the transaction proceeds without error,
- both ExactlyOnceReceived is incremented in the database and the AMQP
- message is consumed from the broker. Otherwise, ExactlyOnceReceived is
- unchanged and AMQP message is returned to its queue on the broker.</para>
-
- <para>For the client code a few changes are made to the non-transacted
- example. For "exactly once" semantics, we set the AMQP "Durable"
- message property and enclose the transacted activities in a
- TransactionScope:</para>
-
- <programlisting><![CDATA[
-AmqpProperties myDefaults = new AmqpProperties();
-myDefaults.Durable = true;
-amqpBinding.DefaultMessageProperties = myDefaults;
-ChannelFactory<IHelloService> channelFactory =
-new ChannelFactory<IHelloService>(amqpBinding, clientEndpoint);
-IHelloService clientProxy = channelFactory.CreateChannel();
-
-using (TransactionScope ts = new TransactionScope())
-{
- AmqpProperties amqpProperties = new AmqpProperties();
- clientProxy.SayHello("Greetings from WCF client");
- // increment ExactlyOnceSent counter on DB
- ts.Complete();
-}
-]]></programlisting>
-
- </section>
- </chapter>
-
- <chapter>
- <title>The .NET Binding for the C++ Messaging Client</title>
- <para>
- The .NET Binding for the C++ Qpid Messaging Client is a library that gives
- any .NET program access to Qpid C++ Messaging objects and methods.
- </para>
- <section>
- <title>.NET Binding for the C++ Messaging Client Component Architecture</title>
-
- <programlisting><![CDATA[
- +----------------------------+
- | Dotnet examples |
- | Managed C# |
- +------+---------------+-----+
- | |
- V |
- +---------------------------+ |
- | .NET Managed Callback | |
- | org.apache.qpid.messaging.| |
- | sessionreceiver.dll | |
- +----------------------+----+ |
- | |
-managed V V
-(.NET) +--------------------------------+
-:::::::::::::::::::::::| .NET Binding Library |::::::::::::
-unmanaged | org.apache.qpid.messaging.dll |
-(Native Win32/64) +---------------+----------------+
- |
- |
- +----------------+ |
- | Native examples| |
- | Unmanaged C++ | |
- +--------+-------+ |
- | |
- V V
- +----------------------------------+
- | QPID Messaging C++ Libraries |
- | qpid*.dll qmf*.dll |
- +--------+--------------+----------+
-]]></programlisting>
-
-
-<para>This diagram illustrates the code and library components of the binding
-and the hierarchical relationships between them.</para>
-
- <table id="table-Dotnet-Binding-Component-Architecture" >
- <title>.NET Binding for the C++ Messaging Client Component Architecture</title>
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Component Name</entry>
- <entry>Component Function</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>QPID Messaging C++ Libraries</entry>
- <entry>The QPID Messaging C++ core run time system</entry>
- </row>
- <row>
- <entry>Unmanaged C++ Example Source Programs</entry>
- <entry>Ordinary C++ programs that illustrate using qpid/cpp Messaging directly
- in a native Windows environment.</entry>
- </row>
- <row>
- <entry>.NET Messaging Binding Library</entry>
- <entry>The .NET Messaging Binding library provides interoprability between
- managed .NET programs and the unmanaged, native Qpid Messaging C++ core
- run time system. .NET programs create a Reference to this library thereby
- exposing all of the native C++ Messaging functionality to programs
- written in any .NET language.</entry>
- </row>
- <row>
- <entry>.NET Messaging Managed Callback Library</entry>
- <entry>An extension of the .NET Messaging Binding Library that provides message
- callbacks in a managed .NET environment.</entry>
- </row>
- <row>
- <entry>Managed C# .NET Example Source Programs</entry>
- <entry>Various C# example programs that illustrate using .NET Binding for C++ Messaging in the .NET environment.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
-
- <section>
- <title>.NET Binding for the C++ Messaging Client Examples</title>
-
- <para>This chapter describes the various sample programs that
- are available to illustrate common Qpid Messaging usage.</para>
-
- <table id="table-Dotnet-Binding-Example-Client-Server">
- <title>Example : Client - Server</title>
- <tgroup cols="2">
- <colspec colname="c1"/>
- <colspec colname="c2"/>
- <thead>
- <row>
- <entry>Example Name</entry>
- <entry>Example Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>csharp.example.server</entry>
- <entry>Creates a Receiver and listens for messages.
- Upon message reception the message content is converted to upper case
- and forwarded to the received message's ReplyTo address.</entry>
- </row>
- <row>
- <entry>csharp.example.client</entry>
- <entry>Sends a series of messages to the Server and prints the original message
- content and the received message content.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table id="table-Dotnet-Binding-Example-MapSender-MapReceiver">
- <title>Example : Map Sender – Map Receiver</title>
- <tgroup cols="2">
- <colspec colname="c1"/>
- <colspec colname="c2"/>
- <thead>
- <row>
- <entry>Example Name</entry>
- <entry>Example Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>csharp.map.receiver</entry>
- <entry>Creates a Receiver and listens for a map message.
- Upon message reception the message is decoded and displayed on the console.</entry>
- </row>
- <row>
- <entry>csharp.map.sender</entry>
- <entry>Creates a map message and sends it to map.receiver.
- The map message contains values for every supported .NET Messaging
- Binding data type.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table id="table-Dotnet-Binding-Example-Spout-Drain">
- <title>Example : Spout - Drain</title>
- <tgroup cols="2">
- <colspec colname="c1"/>
- <colspec colname="c2"/>
- <thead>
- <row>
- <entry>Example Name</entry>
- <entry>Example Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>csharp.example.spout</entry>
- <entry>Spout is a more complex example of code that generates a series of messages
- and sends them to peer program Drain. Flexible command line arguments allow
- the user to specify a variety of message and program options.</entry>
- </row>
- <row>
- <entry>csharp.example.drain</entry>
- <entry>Drain is a more complex example of code that receives a series of messages
- and displays their contents on the console.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table id="table-Dotnet-Binding-Example-CallbackSender-CallbackReceiver">
- <title>Example : Map Callback Sender – Map Callback Receiver</title>
- <tgroup cols="2">
- <colspec colname="c1"/>
- <colspec colname="c2"/>
- <thead>
- <row>
- <entry>Example Name</entry>
- <entry>Example Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>csharp.map.callback.receiver</entry>
- <entry>Creates a Receiver and listens for a map message.
- Upon message reception the message is decoded and displayed on the console.
- This example illustrates the use of the C# managed code callback mechanism
- provided by .NET Messaging Binding Managed Callback Library.</entry>
- </row>
- <row>
- <entry>csharp.map.callback.sender</entry>
- <entry>Creates a map message and sends it to map_receiver.
- The map message contains values for every supported .NET Messaging
- Binding data type.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table id="table-Dotnet-Binding-Example-DeclareQueues">
- <title>Example - Declare Queues</title>
- <tgroup cols="2">
- <colspec colname="c1"/>
- <colspec colname="c2"/>
- <thead>
- <row>
- <entry>Example Name</entry>
- <entry>Example Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>csharp.example.declare_queues</entry>
- <entry>A program to illustrate creating objects on a broker.
- This program creates a queue used by spout and drain.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table id="table-Dotnet-Binding-Example-DirectSender-DirectReceiver">
- <title>Example: Direct Sender - Direct Receiver</title>
- <tgroup cols="2">
- <colspec colname="c1"/>
- <colspec colname="c2"/>
- <thead>
- <row>
- <entry>Example Name</entry>
- <entry>Example Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>csharp.direct.receiver</entry>
- <entry>Creates a Receiver and listens for a messages.
- Upon message reception the message is decoded and displayed on the console.</entry>
- </row>
- <row>
- <entry>csharp.direct.sender</entry>
- <entry> Creates a series of messages and sends them to csharp.direct.receiver.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <table id="table-Dotnet-Binding-Example-Helloworld">
- <title>Example: Hello World</title>
- <tgroup cols="2">
- <colspec colname="c1"/>
- <colspec colname="c2"/>
- <thead>
- <row>
- <entry>Example Name</entry>
- <entry>Example Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>csharp.example.helloworld</entry>
- <entry>A program to send a message and to receive the same message.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- </section>
-
- <section>
- <title>.NET Binding Class Mapping to Underlying C++ Messaging API</title>
-
- <para>This chapter describes the specific mappings between
- classes in the .NET Binding and the underlying C++ Messaging
- API.</para>
-
- <section>
- <title>.NET Binding for the C++ Messaging API Class: Address</title>
- <table id="table-Dotnet-Binding-Address">
- <title>.NET Binding for the C++ Messaging API Class: Address</title>
- <tgroup cols="2">
- <colspec colname="c1" colwidth="1*"/>
- <colspec colname="c2" colwidth="7*"/>
- <thead>
- <row>
- <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Address</entry>
- </row>
- <row>
- <entry>Language</entry>
- <entry>Syntax</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>C++</entry>
- <entry>class Address</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public ref class Address</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Address();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Address();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Address(const std::string&amp; address);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Address(string address);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Address(const std::string&amp; name, const std::string&amp; subject, const qpid::types::Variant::Map&amp; options, const std::string&amp; type = "");</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Address(string name, string subject, Dictionary&lt;string, object&gt; options);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Address(string name, string subject, Dictionary&lt;string, object&gt; options, string type);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Copy constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Address(const Address&amp; address);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Address(Address address);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Destructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>~Address();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>~Address();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>!Address();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Copy assignment operator</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Address&amp; operator=(const Address&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Address op_Assign(Address rhs);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Name</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>const std::string&amp; getName() const;</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setName(const std::string&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string Name { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Subject</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>const std::string&amp; getSubject() const;</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setSubject(const std::string&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string Subject { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Options</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>const qpid::types::Variant::Map&amp; getOptions() const;</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>qpid::types::Variant::Map&amp; getOptions();</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setOptions(const qpid::types::Variant::Map&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Dictionary&lt;string, object&gt; Options { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Type</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>std::string getType() const;</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setType(const std::string&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string Type { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Miscellaneous</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>std::string str() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string ToStr();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Miscellaneous</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>operator bool() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Miscellaneous</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>bool operator !() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>n/a</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>.NET Binding for the C++ Messaging API Class: Connection</title>
- <table id="table-Dotnet-Binding-Connection">
- <title>.NET Binding for the C++ Messaging API Class: Connection</title>
- <tgroup cols="2">
- <colspec colname="c1" colwidth="1*"/>
- <colspec colname="c2" colwidth="7*"/>
- <thead>
- <row>
- <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Connection</entry>
- </row>
- <row>
- <entry>Language</entry>
- <entry>Syntax</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>C++</entry>
- <entry>class Connection : public qpid::messaging::Handle&lt;ConnectionImpl&gt;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public ref class Connection</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Connection(ConnectionImpl* impl);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Connection();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Connection(const std::string&amp; url, const qpid::types::Variant::Map&amp; options = qpid::types::Variant::Map());</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Connection(string url);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Connection(string url, Dictionary&lt;string, object&gt; options);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Connection(const std::string&amp; url, const std::string&amp; options);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Connection(string url, string options); </entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Copy Constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Connection(const Connection&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Connection(Connection connection);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Destructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>~Connection();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>~Connection();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>!Connection();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Copy assignment operator</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Connection&amp; operator=(const Connection&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Connection op_Assign(Connection rhs);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: SetOption</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setOption(const std::string&amp; name, const qpid::types::Variant&amp; value);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void SetOption(string name, object value);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: open</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void open();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Open();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: isOpen</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>bool isOpen();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public bool IsOpen { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: close</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void close();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Close();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: createTransactionalSession</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Session createTransactionalSession(const std::string&amp; name = std::string());</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Session CreateTransactionalSession();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Session CreateTransactionalSession(string name);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: createSession</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Session createSession(const std::string&amp; name = std::string());</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Session CreateSession();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Session CreateSession(string name);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: getSession</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Session getSession(const std::string&amp; name) const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Session GetSession(string name);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: AuthenticatedUsername</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>std::string getAuthenticatedUsername();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string GetAuthenticatedUsername();</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>.NET Binding for the C++ Messaging API Class: Duration</title>
- <table id="table-Dotnet-Binding-Duration">
- <title>.NET Binding for the C++ Messaging API Class: Duration</title>
- <tgroup cols="2">
- <colspec colname="c1" colwidth="1*"/>
- <colspec colname="c2" colwidth="7*"/>
- <thead>
- <row>
- <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Duration</entry>
- </row>
- <row>
- <entry>Language</entry>
- <entry>Syntax</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>C++</entry>
- <entry>class Duration</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public ref class Duration</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>explicit Duration(uint64_t milliseconds);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Duration(ulong mS);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Copy constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Duration(Duration rhs);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Destructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>default</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>default</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>default</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Milliseconds</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>uint64_t getMilliseconds() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public ulong Milliseconds { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Operator: *</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Duration operator*(const Duration&amp; duration, uint64_t multiplier);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public static Duration operator *(Duration dur, ulong multiplier);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public static Duration Multiply(Duration dur, ulong multiplier);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Duration operator*(uint64_t multiplier, const Duration&amp; duration);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public static Duration operator *(ulong multiplier, Duration dur);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public static Duration Multiply(ulong multiplier, Duration dur);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constants</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>static const Duration FOREVER;</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>static const Duration IMMEDIATE;</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>static const Duration SECOND;</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>static const Duration MINUTE;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public sealed class DurationConstants</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public static Duration FORVER;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public static Duration IMMEDIATE;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public static Duration MINUTE;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public static Duration SECOND;</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>.NET Binding for the C++ Messaging API Class: FailoverUpdates</title>
- <table id="table-Dotnet-Binding-FailoverUpdates">
- <title>.NET Binding for the C++ Messaging API Class: FailoverUpdates</title>
- <tgroup cols="2">
- <colspec colname="c1" colwidth="1*"/>
- <colspec colname="c2" colwidth="7*"/>
- <thead>
- <row>
- <entry namest="c1" nameend="c2" align="center">.NET Binding Class: FailoverUpdates</entry>
- </row>
- <row>
- <entry>Language</entry>
- <entry>Syntax</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>C++</entry>
- <entry>class FailoverUpdates</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public ref class FailoverUpdates</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>FailoverUpdates(Connection&amp; connection);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public FailoverUpdates(Connection connection);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Destructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>~FailoverUpdates();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>~FailoverUpdates();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>!FailoverUpdates();</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>.NET Binding for the C++ Messaging API Class: Message</title>
- <table id="table-Dotnet-Binding-Message">
- <title>.NET Binding for the C++ Messaging API Class: Message</title>
- <tgroup cols="2">
- <colspec colname="c1" colwidth="1*"/>
- <colspec colname="c2" colwidth="7*"/>
- <thead>
- <row>
- <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Message</entry>
- </row>
- <row>
- <entry>Language</entry>
- <entry>Syntax</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>C++</entry>
- <entry>class Message</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public ref class Message</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Message(const std::string&amp; bytes = std::string());</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>Message();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>Message(System::String ^ theStr);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>Message(System::Object ^ theValue);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>Message(array&lt;System::Byte&gt; ^ bytes);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Message(const char*, size_t);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Message(byte[] bytes, int offset, int size);</entry>
- </row>
- <row>
- <entry> </entry>
- <entry>Copy constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Message(const Message&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Message(Message message);</entry>
- </row>
- <row>
- <entry> </entry>
- <entry>Copy assignment operator</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Message&amp; operator=(const Message&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Message op_Assign(Message rhs);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Destructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>~Message();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>~Message();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>!Message()</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: ReplyTo</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setReplyTo(const Address&amp;);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>const Address&amp; getReplyTo() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Address ReplyTo { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Subject</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setSubject(const std::string&amp;);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>const std::string&amp; getSubject() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string Subject { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: ContentType</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setContentType(const std::string&amp;);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>const std::string&amp; getContentType() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string ContentType { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: MessageId</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setMessageId(const std::string&amp;);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>const std::string&amp; getMessageId() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string MessageId { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: UserId</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setUserId(const std::string&amp;);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>const std::string&amp; getUserId() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string UserId { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: CorrelationId</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setCorrelationId(const std::string&amp;);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>const std::string&amp; getCorrelationId() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string CorrelationId { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Priority</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setPriority(uint8_t);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>uint8_t getPriority() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public byte Priority { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Ttl</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setTtl(Duration ttl);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Duration getTtl() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Duration Ttl { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Durable</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setDurable(bool durable);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>bool getDurable() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public bool Durable { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Redelivered</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>bool getRedelivered() const;</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setRedelivered(bool);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public bool Redelivered { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: SetProperty</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setProperty(const std::string&amp;, const qpid::types::Variant&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void SetProperty(string name, object value);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Properties</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>const qpid::types::Variant::Map&amp; getProperties() const;</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>qpid::types::Variant::Map&amp; getProperties();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Dictionary&lt;string, object&gt; Properties { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: SetContent</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setContent(const std::string&amp;);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setContent(const char* chars, size_t count);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void SetContent(byte[] bytes);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void SetContent(string content);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void SetContent(byte[] bytes, int offset, int size);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: GetContent</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>std::string getContent() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string GetContent();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void GetContent(byte[] arr);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void GetContent(Collection&lt;object&gt; __p1);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void GetContent(Dictionary&lt;string, object&gt; dict);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: GetContentPtr</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>const char* getContentPtr() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: ContentSize</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>size_t getContentSize() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public ulong ContentSize { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Struct: EncodingException</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>struct EncodingException : qpid::types::Exception</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: decode</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void decode(const Message&amp; message, qpid::types::Variant::Map&amp; map, const std::string&amp; encoding = std::string());</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void decode(const Message&amp; message, qpid::types::Variant::List&amp; list, const std::string&amp; encoding = std::string());</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: encode</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void encode(const qpid::types::Variant::Map&amp; map, Message&amp; message, const std::string&amp; encoding = std::string());</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void encode(const qpid::types::Variant::List&amp; list, Message&amp; message, const std::string&amp; encoding = std::string());</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: AsString</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string AsString(object obj);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string ListAsString(Collection&lt;object&gt; list);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string MapAsString(Dictionary&lt;string, object&gt; dict);</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>.NET Binding for the C++ Messaging API Class: Receiver</title>
- <table id="table-Dotnet-Binding-Receiver">
- <title>.NET Binding for the C++ Messaging API Class: Receiver</title>
- <tgroup cols="2">
- <colspec colname="c1" colwidth="1*"/>
- <colspec colname="c2" colwidth="7*"/>
- <thead>
- <row>
- <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Receiver</entry>
- </row>
- <row>
- <entry>Language</entry>
- <entry>Syntax</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>C++</entry>
- <entry>class Receiver</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public ref class Receiver</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>Constructed object is returned by Session.CreateReceiver</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Copy constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Receiver(const Receiver&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Receiver(Receiver receiver);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Destructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>~Receiver();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>~Receiver();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>!Receiver()</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Copy assignment operator</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Receiver&amp; operator=(const Receiver&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Receiver op_Assign(Receiver rhs);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Get</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>bool get(Message&amp; message, Duration timeout=Duration::FOREVER);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public bool Get(Message mmsgp);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public bool Get(Message mmsgp, Duration durationp);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Get</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Message get(Duration timeout=Duration::FOREVER);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Message Get();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Message Get(Duration durationp);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Fetch</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>bool fetch(Message&amp; message, Duration timeout=Duration::FOREVER);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public bool Fetch(Message mmsgp);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public bool Fetch(Message mmsgp, Duration duration);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Fetch</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Message fetch(Duration timeout=Duration::FOREVER);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Message Fetch();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Message Fetch(Duration durationp);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Capacity</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setCapacity(uint32_t);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>uint32_t getCapacity();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public uint Capacity { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Available</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>uint32_t getAvailable();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public uint Available { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Unsettled</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>uint32_t getUnsettled();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public uint Unsettled { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Close</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void close();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Close();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: IsClosed</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>bool isClosed() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public bool IsClosed { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Name</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>const std::string&amp; getName() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string Name { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Session</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Session getSession() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Session Session { get; }</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>.NET Binding for the C++ Messaging API Class: Sender</title>
- <table id="table-Dotnet-Binding-Sender">
- <title>.NET Binding for the C++ Messaging API Class: Sender</title>
- <tgroup cols="2">
- <colspec colname="c1" colwidth="1*"/>
- <colspec colname="c2" colwidth="7*"/>
- <thead>
- <row>
- <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Sender</entry>
- </row>
- <row>
- <entry>Language</entry>
- <entry>Syntax</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>C++</entry>
- <entry>class Sender</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public ref class Sender</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>Constructed object is returned by Session.CreateSender</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Copy constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Sender(const Sender&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Sender(Sender sender);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Destructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>~Sender();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>~Sender();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>!Sender()</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Copy assignment operator</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Sender&amp; operator=(const Sender&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Sender op_Assign(Sender rhs);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Send</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void send(const Message&amp; message, bool sync=false);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Send(Message mmsgp);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Send(Message mmsgp, bool sync);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Close</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void close();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Close();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Capacity</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void setCapacity(uint32_t);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>uint32_t getCapacity();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public uint Capacity { get; set; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Available</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>uint32_t getAvailable();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public uint Available { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Unsettled</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>uint32_t getUnsettled();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public uint Unsettled { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Name</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>const std::string&amp; getName() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public string Name { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Session</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Session getSession() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Session Session { get; }</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>.NET Binding for the C++ Messaging API Class: Session</title>
- <table id="table-Dotnet-Binding-Session">
- <title>.NET Binding for the C++ Messaging API Class: Session</title>
- <tgroup cols="2">
- <colspec colname="c1" colwidth="1*"/>
- <colspec colname="c2" colwidth="7*"/>
- <thead>
- <row>
- <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Session</entry>
- </row>
- <row>
- <entry>Language</entry>
- <entry>Syntax</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>C++</entry>
- <entry>class Session</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public ref class Session</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Constructor</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>Constructed object is returned by Connection.CreateSession</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Copy constructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Session(const Session&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Session(Session session);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Destructor</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>~Session();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>~Session();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>n/a</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>!Session()</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Copy assignment operator</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Session&amp; operator=(const Session&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Session op_Assign(Session rhs);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Close</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void close();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Close();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Commit</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void commit();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Commit();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Rollback</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void rollback();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Rollback();</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Acknowledge</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void acknowledge(bool sync=false);</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void acknowledge(Message&amp;, bool sync=false);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Acknowledge();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Acknowledge(bool sync);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Acknowledge(Message __p1);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Acknowledge(Message __p1, bool __p2);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Reject</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void reject(Message&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Reject(Message __p1);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Release</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void release(Message&amp;);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Release(Message __p1);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: Sync</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void sync(bool block=true);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Sync();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void Sync(bool block);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Receivable</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>uint32_t getReceivable();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public uint Receivable { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: UnsettledAcks</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>uint32_t getUnsettledAcks();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public uint UnsetledAcks { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: NextReceiver</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>bool nextReceiver(Receiver&amp;, Duration timeout=Duration::FOREVER);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public bool NextReceiver(Receiver rcvr);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public bool NextReceiver(Receiver rcvr, Duration timeout);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: NextReceiver</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Receiver nextReceiver(Duration timeout=Duration::FOREVER);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Receiver NextReceiver();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Receiver NextReceiver(Duration timeout);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: CreateSender</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Sender createSender(const Address&amp; address);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Sender CreateSender(Address address);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: CreateSender</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Sender createSender(const std::string&amp; address);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Sender CreateSender(string address);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: CreateReceiver</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Receiver createReceiver(const Address&amp; address);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Receiver CreateReceiver(Address address);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: CreateReceiver</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Receiver createReceiver(const std::string&amp; address);</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Receiver CreateReceiver(string address);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: GetSender</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Sender getSender(const std::string&amp; name) const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Sender GetSender(string name);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: GetReceiver</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Receiver getReceiver(const std::string&amp; name) const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Receiver GetReceiver(string name);</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: Connection</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>Connection getConnection() const;</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public Connection Connection { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Property: HasError</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>bool hasError();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public bool HasError { get; }</entry>
- </row>
- <row>
- <entry namest="c1" nameend="c2" align="center">Method: CheckError</entry>
- </row>
- <row>
- <entry>C++</entry>
- <entry>void checkError();</entry>
- </row>
- <row>
- <entry>.NET</entry>
- <entry>public void CheckError();</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <section>
- <title>.NET Binding Class: SessionReceiver</title>
- <para>
- The SessionReceiver class provides a convenient callback
- mechanism for Messages received by all Receivers on a given
- Session.
- </para>
- <para>
- <programlisting><![CDATA[
-using Org.Apache.Qpid.Messaging;
-using System;
-
-namespace Org.Apache.Qpid.Messaging.SessionReceiver
-{
- public interface ISessionReceiver
- {
- void SessionReceiver(Receiver receiver, Message message);
- }
-
- public class CallbackServer
- {
- public CallbackServer(Session session, ISessionReceiver callback);
-
- public void Close();
- }
-}
-]]>
- </programlisting>
- </para>
- <para>
- To use this class a client program includes references to both
- Org.Apache.Qpid.Messaging and Org.Apache.Qpid.Messaging.SessionReceiver.
- The calling program creates a function that implements the
- ISessionReceiver interface. This function will be called whenever
- message is received by the session. The callback process is started
- by creating a CallbackServer and will continue to run until the
- client program calls the CallbackServer.Close function.
- </para>
- <para>
- A complete operating example of using the SessionReceiver callback
- is contained in cpp/bindings/qpid/dotnet/examples/csharp.map.callback.receiver.
- </para>
- </section>
- </section>
- </chapter>
-</book>
-
-<!--
- - client code remains exactly the same, but routing behavior
- changes
- - exchanges drop messages if nobody is listening, so we need to
- start drain first
- - drain will exit immediately if the source is empty (note that
- this is actually a semantic guarantee provided by the API, we
- know for a fact that the source is empty when drain/fetch
- reports it, no fudge factor timeout is required [this assumes
- nobody is concurrently publishing of course])
- - drain -f invokes blocking fetch (you could use a timeout here also)
- -->
diff --git a/doc/book/src/Qpid-JMX-Management-Console-User-Guide.xml b/doc/book/src/Qpid-JMX-Management-Console-User-Guide.xml
deleted file mode 100644
index 55e1f8e829..0000000000
--- a/doc/book/src/Qpid-JMX-Management-Console-User-Guide.xml
+++ /dev/null
@@ -1,793 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<section id="Qpid-JMX-Management-Console-User-Guide"><title>
- Qpid JMX Management Console User Guide
- </title><section role="h1" id="QpidJMXManagementConsoleUserGuide-QpidJMXManagementConsoleUserGuide"><title>
- Qpid JMX Management Console User Guide
- </title>
-
-
- <para>
-
- The Qpid JMX Management Console is a standalone Eclipse RCP
- application for managing and monitoring the Qpid Java server
- utilising its JMX management interfaces.
- </para><para>
- This guide will give an overview of configuring the console, the
- features supported by it, and how to make use of the console in
- managing the various JMX Management Beans (MBeans) offered by the
- Qpid Java server.
- </para>
-<!--h1--></section>
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-Startup-26Configuration"><title>
-
- Startup &amp; Configuration
- </title>
-
- <para>
-
- </para>
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-Startup"><title>
- Startup
- </title>
-
- <para>
-
- The console can be started in the following way, depending on
- platform:
- </para><itemizedlist>
- <listitem><para>
- <emphasis>Windows:</emphasis> by running the <emphasis>qpidmc.exe</emphasis> executable
- file.
- </para></listitem>
- <listitem><para>
- <emphasis>Linux:</emphasis> by running the <emphasis>qpidmc</emphasis> executable.
- </para></listitem>
- <listitem><para>
- <emphasis>Mac OS X:</emphasis> by launching the <emphasis>Qpid Management
- Console.app</emphasis> application bundle.
- </para></listitem>
- </itemizedlist><para>
-
- </para>
- </section>
-
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-SSLconfiguration"><title>
- SSL
- configuration
- </title>
-
- <para>
-
- Newer Qpid Java servers can protect their JMX connections with
- SSL, and this is enabled by default. When attempting to connect
- to a server with this enabled, the console must be able to verify
- the SSL certificate presented to it by the server or the
- connection will fail.
- </para><para>
- If the server makes use of an SSL certificate signed by a known
- Signing CA (Certification Authority) then the console needs no
- extra configuration, and will make use of Java's default
- system-wide CA TrustStore for certificate verification (you may
- however have to update the system-wide default CA TrustStore if
- your certified is signed by a less common CA that is not already
- present in it).
- </para><para>
- If however the server is equipped with a self-signed SSL
- certificate, then the management console must be provided with an
- appropriate SSL TrustStore containing the public key for the SSL
- certificate, so that it is able to validate it when presented by
- the server. The server ships with a script to create an example
- self-signed SSL certificate, and store the relevant entries in a
- KeyStore and matching TrustStore. This script can serve as a
- guide on how to use the Java Keytool security utility to
- manipulate your own stores, and more information can be found in
- the JSSE Reference Guide:
- <ulink url="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores">http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores</ulink>.
- </para><para>
- Supplying the necessary details to the console is performed by
- setting the <emphasis>javax.net.ssl.trustStore</emphasis> and
- <emphasis>javax.net.ssl.trustStorePassword</emphasis> environment variables
- when starting it. This can be done at the command line, but the
- preferred option is to set the configuration within the
- <emphasis>qpidmc.ini</emphasis> launcher configuration file for repeated
- usage. This file is equipped with a template to ease
- configuration, this should be uncommented and edited to suit your
- needs. It can be found in the root of the console releases for
- Windows, and Linux. For Mac OS X the file is located within the
- consoles <emphasis>.app</emphasis> application bundle, and to locate and edit
- it you must select <emphasis>'Show Package Contents'</emphasis> when
- accessing the context menu of the application, then browse to the
- <emphasis>Contents/MacOS</emphasis> sub folder to locate the file.
- </para>
-<!--h2--></section>
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-JMXMPconfiguration"><title>
- JMXMP
- configuration
- </title>
-
- <para>
-
- Older releases of the Qpid Java server can make use of the Java
- Management Extensions Messaging Protocol (JMXMP) to provide
- protection for their JMX connections. This occurs when the server
- has its main configuration set with the management
- <emphasis>'security-enabled'</emphasis> property set to true.
- </para><para>
- In order to connect to this configuration of server, the console
- needs an additional library that is not included within the Java
- SE platform and cannot be distributed with the console due to
- licensing restrictions.
- </para><para>
- You can download the JMX Remote API 1.0.1_04 Reference
- Implementation from the Sun website <xref linkend="qpid_download.jsp"/>. The included
- <emphasis>jmxremote-1_0_1-bin/lib/jmxremote_optional.jar</emphasis> file must
- be added to the <emphasis>plugins/jmxremote.sasl_1.0.1</emphasis> folder of
- the console release (again, in Mac OS X you will need to select
- <emphasis>'Show package contents'</emphasis> from the context menu whilst
- selecting the management console bundle in order to reveal the
- inner file tree).
- </para><para>
- Following this the console will automatically load the JMX Remote
- Optional classes and negotiate the SASL authentication profile
- type when encountering a JMXMP enabled Qpid Java server.
- </para>
-<!--h2--></section>
-<!--h1--></section>
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingServerConnections"><title>
-
- Managing Server Connections
- </title>
-
- <para>
-
- </para>
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-MainToolbar"><title>
- Main Toolbar
- </title>
-
- <para>
-
- The main toolbar of the console can be seen in the image below.
- The left most buttons respectively allow for adding a new server
- connection, reconnecting to an existing server selected in the
- connection tree, disconnecting the selected server connection,
- and removing the server from the connection tree.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113098.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
-
-
- Beside these buttons is a combo for selecting the refresh
- interval; that is, how often the console requests updated
- information to display for the currently open area in the main
- view. Finally, the right-most button enables an immediate update.
- </para>
- </section>
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-Connectingtoanewserver"><title>
- Connecting
- to a new server
- </title>
-
- <para>
-
- To connect to a new server, press the <emphasis>Add New Server</emphasis>
- toolbar button, or select the <emphasis>Qpid Manager -&gt; Add New
- Connection</emphasis> menu item. At this point a dialog box will be
- displayed requesting the server details, namely the server
- hostname, management port, and a username and password. An
- example is shown below:
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113099.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
-
- Once all the required details are entered, pressing Connect will
- initiate a connection attempt to the server. It the attempt fails
- a reason will be shown and the server will not be added to the
- connection tree. If the attempt is successful the server will be
- added to the connections list and the entry expanded to show the
- initial administration MBeans the user has access to and any
- VirtualHosts present on the server, as can be seen in the figure
- below.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113100.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
-
- If the server supports a newer management API than the console in
- use, once connected this initial screen will contain a message on
- the right, indicating an upgraded console should be sought by the
- user to ensure all management functionality supported by the
- server is being utilised.
- </para>
-<!--h2--></section>
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-Reconnectingtoaserver"><title>
- Reconnecting
- to a server
- </title>
-
- <para>
-
- If a server has been connected to previously, it will be saved as
- an entry in the connection tree for further use. On subsequent
- connections the server can simply be selected from the tree and
- using the <emphasis>Reconnect</emphasis> toolbar button or <emphasis>Qpid Manager
- -&gt; Reconnect</emphasis> menu item. At this stage the console will
- prompt simply for the username and password with which the user
- wishes to connect, and following a successful connection the
- screen will appear as shown previously above.
- </para>
-<!--h2--></section>
-
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-Disconnectingfromaserver"><title>
- Disconnecting
- from a server
- </title>
-
- <para>
-
- To disconnect from a server, select the connection tree node for
- the server and press the <emphasis>Disconnect</emphasis> toolbar button, or
- use the <emphasis>Qpid Manager -&gt; Disconnect</emphasis> menu option.
- </para>
-<!--h2--></section>
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-Removingaserver"><title>
- Removing a
- server
- </title>
-
- <para>
-
- To remove a server from the connection list, select the
- connection tree node for the server and press the <emphasis>Remove</emphasis>
- toolbar button, or use the <emphasis>Qpid Manager -&gt; Remove
- Connection</emphasis> menu option.
- </para>
-<!--h2--></section>
-<!--h1--></section>
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-Navigatingaconnectedserver"><title>
- Navigating a connected server
- </title>
-
- <para>
-
- Once connected to a server, the various areas available for
- administration are accessed using the Qpid Connections tree at
- the left side of the application. To open a particular MBean from
- the tree for viewing, simply select it in the tree and it will be
- opened in the main view.
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113101.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- As there may be vast numbers of Queues, Connections, and
- Exchanges on the server these MBeans are not automatically added
- to the tree along with the general administration MBeans.
- Instead, dedicated selection areas are provided to allow users to
- select which Queue/Connection/Exchange they wish to view or add
- to the tree. These areas can be found by clicking on the
- Connections, Exchanges, and Queues nodes in the tree under each
- VirtualHost, as shown in the figure above. One or more MBeans may
- be selected and added to the tree as Favourites using the button
- provided. These settings are saved for future use, and each time
- the console connects to the server it will check for the presence
- of the MBean previously in the tree and add them if they are
- still present. Queue/Connection/Exchange MBeans can be removed
- from the tree by right clicking on them to expose a context menu
- allowing deletion.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113102.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- As an alternative way to open a particular MBean for viewing,
- without first adding it to the tree, you can simply double click
- an entry in the table within the Queue/Connection/Exchange
- selection areas to open it immediately. It is also possible to
- open some MBeans like this whilst viewing certain other MBeans.
- When opening an MBean in either of these ways, a Back button is
- enabled in the top right corner of the main view. Using this
- button will return you to the selection area or MBean you were
- previously viewing. The history resets each time the tree is used
- to open a new area or MBean.
- </para>
-<!--h1--></section>
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-ConfigurationManagementMBean"><title>
-
- ConfigurationManagement MBean
- </title>
-
- <para>
-
- The ConfigurationManagement MBean is available on newer servers,
- to users with admin level management rights. It offers the
- ability to perform a live reload of the <emphasis>Security</emphasis>
- sections defined in the main server configuration file (e.g.
- defaults to: <emphasis>etc/config.xml</emphasis>). This is mainly to allow
- updating the server Firewall configuration to new settings
- without a restart, and can be performed by clicking the Execute
- button and confirming the prompt which follows.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113103.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para>
-<!--h1--></section>
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-LoggingManagementMBean"><title>
-
- LoggingManagement MBean
- </title>
-
- <para>
-
- The LoggingManagement MBean is available on newer servers, and
- accessible by admin level users. It allows live alteration of the
- logging behaviour, both at a Runtime-only level and at the
- configuration file level. The latter can optionally affect the
- Runtime configuration, either through use of the servers
- automated LogWatch ability which detects changes to the
- configuration file and reloads it, or by manually requesting a
- reload. This functionality is split across two management tabs,
- Runtime Options and ConfigurationFile Options.
- </para>
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-RuntimeOptions"><title>
- Runtime
- Options
- </title>
-
- <para>
-
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113104.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- The Runtime Options tab allows manipulation of the logging
- settings without affecting the configuration files (this means
- the changes will be lost when the server restarts), and gives
- individual access to every Logger active within the server.
- </para><para>
- As shown in the figure above, the table in this tab presents the
- Effective Level of each Logger. This is because the Loggers form
- a hierarchy in which those without an explicitly defined (in the
- logging configuration file) Level will inherit the Level of their
- immediate parent; that is, the Logger whose full name is a prefix
- of their own, or if none satisfy that condition then the
- RootLogger is their parent. As example, take the
- <emphasis>org.apache.qpid</emphasis> Logger. It is parent to all those below
- it which begin with <emphasis>org.apache.qpid</emphasis> and unless they have
- a specific Level of their own, they will inherit its Level. This
- can be seen in the figure, whereby all the children Loggers
- visible have a level of WARN just like their parent, but the
- RootLogger Level is INFO; the children have inherited the WARN
- level from <emphasis>org.apache.qpid</emphasis> rather than INFO from the
- RootLogger.
- </para><para>
- To aid with this distinction, the Logger Levels that are
- currently defined in the configuration file are highlighted in
- the List. Changing these levels at runtime will also change the
- Level of all their children which haven't been set their own
- Level using the runtime options. In the latest versions of the
- LoggingManagement MBean, it is possible to restore a child logger
- that has had an explicit level se, to inheriting that of its
- parent by setting it to an INHERITED level that removes any
- previously set Level of its own.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113105.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- In order to set one of more Loggers to a new Level, they should
- be selected in the table (or double click an individual Logger to
- modify it) and the <emphasis>Edit Selected Logger(s)</emphasis> button
- pressed to load the dialog shown above. At this point, any of the
- available Levels supported by the server can be applied to the
- Loggers selected and they will immediately update, as will any
- child Loggers without their own specific Level.
- </para><para>
- The RootLogger can be similarly edited using the button at the
- bottom left of the window.
- </para>
-<!--h2--></section>
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-ConfigurationFileOptions"><title>
- ConfigurationFile
- Options
- </title>
-
- <para>
-
- The ConfigurationFile Options tab allows alteration of the Level
- settings for the Loggers defined in the configuration file,
- allowing changes to persist following a restart of the server.
- Changes made to the configuration file are only applied
- automatically while the sever is running if it was configured to
- enable the LogWatch capability, meaning it will monitor the
- configuration file for changes and apply the new configuration
- when the change is detected. If this was not enabled, the changes
- will be picked up when the server is restarted. The status of the
- LogWatch feature is shown at the bottom of the tab.
- Alternatively, in the latest versions of the LoggingManagement
- MBean it is possible to reload the logging configuration file on
- demand.
- </para><para>
- Manipulating the Levels is as on the Runtime Options tab, either
- double-click an individual Logger entry or select multiple
- Loggers and use the button to load the dialog to set the new
- Level.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113106.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- One issue to note of when reloading the configuration file
- settings, either automatically using LogWatch or manually, is
- that any Logger set to a specific Level using the Runtime Options
- tab that is not defined in the configuration file will maintain
- that Level when the configuration file is reloaded. In other
- words, if a Logger is defined in the configuration file, then the
- configuration file will take precedence at reload, otherwise the
- Runtime options take precedence.
- </para><para>
- This situation will be immediately obvious by examining the
- Runtime Options tab to see the effective Level of each Logger
- – unless it has been altered with the RuntimeOptions or
- specifically set in the configuration file, a Logger Level should
- match that of its parent. In the latest versions of the
- LoggingManagement MBean, it is possible to use the RuntimeOptions
- to restore a child logger to inheriting from its parent by
- setting it with an INHERITED level that removes any previously
- set Level of its own.
-
- </para>
-<!--h2--></section>
-<!--h1--></section>
-
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-ServerInformationMBean"><title>
- ServerInformation MBean
- </title>
-
- <para>
-
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113107.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- The ServerInformation MBean currently only conveys various pieces
- of version information to allow precise identification of the
- server version and its management capabilities. In future it is
- likely to convey additional server-wide details and/or
- functionality.
- </para>
-<!--h1--></section>
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-UserManagementMBean"><title>
-
- UserManagement MBean
- </title>
-
- <para>
-
- The UserManagement MBean is accessible by admin level users, and
- allows manipulation of existing user accounts and creation of new
- user accounts.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113108.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
-
- To add a new user, press the <emphasis>Add New User</emphasis> button, which
- will load the dialog shown below.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113109.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- Here you may enter the new users Username, Password, and select
- their JMX Management Rights. This controls whether or not they
- have access to the management interface, and if so what
- capabilities are accessible. <emphasis>Read Only</emphasis> access allows
- undertaking any operations that do not alter the server state,
- such as viewing messages. <emphasis>Read + Write</emphasis> access allows use
- of all operations which are not deemed admin-only (such as those
- in the UserManagement MBean itself). <emphasis>Admin</emphasis> access allows
- a user to utilize any operation, and view the admin-only MBeans
- (currently these are ConfigurationManagement, LoggingManagement,
- and UserManagement).
- </para><para>
- One or more users at a time may be deleted by selecting them in
- the table and clicking the <emphasis>Delete User(s)</emphasis> button. The
- console will then prompt for confirmation before undertaking the
- removals. Similarly, the access rights for one or more users may
- be updated by selecting them in the table and clicking the
- <emphasis>Set Rights</emphasis> button. The console will then display a
- dialog enabling selection of the new access level and
- confirmation to undertake the update.
- </para><para>
- An individual user password may be updated by selecting the user
- in the table in and clicking the <emphasis>Set Password</emphasis> button.
- The console will then display a dialog enabling input of the new
- password and confirmation to undertake the update.
- </para><para>
-
- The server caches the user details in memory to aid performance.
- If may sometimes be necessary to externally modify the password
- and access right files on disk. In order for these changes to be
- known to the server without a restart, it must be instructed to
- reload the file contents. This can be done using the provided
- <emphasis>Reload User Details</emphasis> button (on older servers, only the
- management rights file is reloaded, on newer servers both files
- are. The description on screen will indicate the behaviour).
- After pressing this button the console will seek confirmation
- before proceeding.
- </para>
-<!--h1--></section>
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-VirtualHostManagerMBean"><title>
-
- VirtualHostManager MBean
- </title>
-
- <para>
-
- Each VirtualHost in the server has an associated
- VirtualHostManager MBean. This allows viewing, creation, and
- deletion of Queues and Exchanges within the VirtualHost.
- </para><para>
- Clicking the <emphasis>Create</emphasis> button in the Queue section will
- open a dialog allowing specification of the Name, Owner
- (optional), and durability properties of the new Queue, and
- confirmation of the operation.
- </para><para>
- One or more Queues may be deleted by selecting them in the table
- and clicking the <emphasis>Delete</emphasis> button. This will unregister the
- Queue bindings, remove the subscriptions and delete the Queue(s).
- The console will prompt for confirmation before undertaking the
- operation.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113110.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- Clicking the <emphasis>Create</emphasis> button in the Exchange section will
- open a dialog allowing specification of the Name, Type, and
- Durable attributes of the new Exchange, and confirmation of the
- operation.
- </para><para>
- One or more Exchanges may be deleted by selecting them in the
- table and clicking the <emphasis>Delete</emphasis> button. This will
- unregister all the related channels and Queue bindings then
- delete the Exchange(s). The console will prompt for confirmation
- before undertaking the operation.
- </para><para>
-
- Double-clicking on a particular Queue or Exchange name in the
- tables will open the MBean representing it.
- </para>
-<!--h1--></section>
-
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-Notifications"><title>
-
- Notifications
- </title>
-
- <para>
-
- MBeans on the server can potentially send Notifications that
- users may subscribe to. When managing an individual MBean that
- offers Notifications types for subscription, the console supplies
- a Notifications tab to allow (un)subscription to the
- Notifications if desired and viewing any that are received
- following subscription.
- </para><para>
- In order to provide quicker access to/awareness of any received
- Notifications, each VirtualHost area in the connection tree has a
- Notifications area that aggregates all received Notifications for
- MBeans in that VirtualHost. An example of this can be seen in the
- figure below.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113111.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- All received Notifications will be displayed until such time as
- the user removes them, either in this aggregated view, or in the
- Notifications area of the individual MBean that generated the
- Notification.
- </para><para>
- They may be cleared selectively or all at once. To clear
- particular Notifications, they should be selected in the table
- before pressing the <emphasis>Clear</emphasis> button. To clear all
- Notifications, simply press the <emphasis>Clear</emphasis> button without
- anything selected in the table, at which point the console will
- request confirmation of this clear-all action.
- </para>
-<!--h1--></section>
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingQueues"><title>
- Managing
- Queues
- </title>
-
- <para>
-
- As mentioned in earlier discussion of Navigation, Queue MBeans
- can be opened either by double clicking an entry in the Queues
- selection area, or adding a queue to the tree as a favourite and
- clicking on its tree node. Unique to the Queue selection screen
- is the ability to view additional attributes beyond just that of
- the Queue Name. This is helpful for determining which Queues
- satisfy a particular condition, e.g. having &lt;X&gt; messages on
- the queue. The example below shows the selection view with
- additional attributes <emphasis>Consumer Count, Durable, MessageCount,
- and QueueDepth</emphasis> (selected using the <emphasis>Select
- Attributes</emphasis> button at the bottom right corner of the
- table)<emphasis>.</emphasis>
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113112.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- Upon opening a Queue MBean, the Attributes tab is displayed, as
- shown below. This allows viewing the value all attributes,
- editing those which are writable values (highlighted in blue) if
- the users management permissions allow, viewing descriptions of
- their purpose, and graphing certain numerical attribute values as
- they change over time.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113113.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- The next tab contains the operations that can be performed on the
- queue. The main table serves as a means of viewing the messages
- on the queue, and later for selecting specific messages to
- operate upon. It is possible to view any desired range of
- messages on the queue by specifying the visible range using the
- fields at the top and pressing the <emphasis>Set</emphasis> button. Next to
- this there are helper buttons to enable faster browsing through
- the messages on the queue; these allow moving forward and back by
- whatever number of messages is made visible by the viewing range
- set. The Queue Position column indicates the position of each
- message on the queue, but is only present when connected to newer
- servers as older versions cannot provide the necessary
- information to show this (unless only a single message position
- is requested).
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113114.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- Upon selecting a message in the table, its header properties and
- redelivery status are updated in the area below the table. Double
- clicking a message in the table (or using the <emphasis>View Message
- Content</emphasis> button to its right) will open a dialog window
- displaying the contents of the message.
- </para><para>
- One or more messages can be selected in the table and moved to
- another queue in the VirtualHost by using the <emphasis>Move
- Message(s)</emphasis> button, which opens a dialog to enable selection
- of the destination and confirmation of the operation. Newer
- servers support the ability to similarly copy the selected
- messages to another queue in a similar fashion, or delete the
- selected messages from the queue after prompting for
- confirmation.
- </para><para>
- Finally, all messages (that have not been acquired by consumers)
- on the queue can be deleted using the <emphasis>Clear Queue</emphasis>
- button, which will generate a prompt for confirmation. On newer
- servers, the status bar at the lower left of the application will
- report the number of messages actually removed.
- </para>
-<!--h1--></section>
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingExchanges"><title>
-
- Managing Exchanges
- </title>
-
- <para>
- Exchange MBeans are opened for management operations in similar
- fashion as described for Queues, again showing an Attributes tab
- initially, with the Operations tab next:
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113115.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- Of the four default Exchange Types <emphasis>(direct, fanout, headers,
- and topic)</emphasis> all but <emphasis>headers</emphasis> have their bindings
- presented in the format shown above. The left table provides the
- binding/routing keys present in the exchange. Selecting one of
- these entries in the table prompts the right table to display all
- the queues associated with this key. Pressing the <emphasis>Create</emphasis>
- button opens a dialog allowing association of an existing queue
- with the entered Binding.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113116.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- The <emphasis>headers</emphasis> Exchange type (default instantiation
- <emphasis>amq.match or amq.headers</emphasis>) is presented as below:
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113117.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- In the previous figure, the left table indicates the binding
- number, and the Queue associated with the binding. Selecting one
- of these entries in the table prompts the right table to display
- the header values that control when the binding matches an
- incoming message.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113118.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- Pressing the <emphasis>Create</emphasis> button when managing a
- <emphasis>headers</emphasis> Exchange opens a dialog allowing creation of a
- new binding, associating an existing Queue with a particular set
- of header keys and values. The <emphasis>x-match</emphasis> key is required,
- and instructs the server whether to match the binding with
- incoming messages based on ANY or ALL of the further key-value
- pairs entered. If it is desired to enter more than 4 pairs, you
- may press the <emphasis>Add additional field</emphasis> button to create a
- new row as many times as is required.
-
- When managing a <emphasis>headers</emphasis> Exchange, double clicking an
- entry in the left-hand table will open the MBean for the Queue
- specified in the binding properties.
- </para><para>
- When managing another Exchange Type, double clicking the Queue
- Name in the right-hand table will open the MBean of the Queue
- specified.
- </para>
-<!--h1--></section>
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingConnections"><title>
-
- Managing Connections
- </title>
-
- <para>
-
- Exchange MBeans are opened for management operations in similar
- fashion as described for Queues, again showing an Attributes tab
- initially, with the Operations tab next, and finally a
- Notifications tab allowing subscription and viewing of
- Notifications. The Operations tab can be seen in the figure
- below.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113119.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- The main table shows the properties of all the Channels that are
- present on the Connection, including whether they are
- <emphasis>Transactional</emphasis>, the <emphasis>Number of Unacked Messages</emphasis>
- on them, and the <emphasis>Default Queue</emphasis> if there is one (or
- <emphasis>null</emphasis> if there is not).
- </para><para>
- The main operations supported on a connection are Commiting and
- Rolling Back of Transactions on a particular Channel, if the
- Channel is Transactional. This can be done by selecting a
- particular Channel in the table and pressing the <emphasis>Commit
- Transactions</emphasis> or <emphasis>Rollback Transactions</emphasis> buttons at
- the lower right corner of the table, at which point the console
- will prompt for confirmation of the action. These buttons are
- only active when the selected Channel in the table is
- Transactional.
- </para><para>
- The final operation supported is closing the Connection. After
- pressing the <emphasis>Close Connection</emphasis> button, the console will
- prompt for confirmation of the action. If this is carried out,
- the MBean for the Connection being managed will be removed from
- the server. The console will be notified of this by the server
- and display an information dialog to that effect, as it would if
- any other MBean were to be unregistered whilst being viewed.
- </para><para>
- Double clicking a row in the table will open the MBean of the
- associated <emphasis>Default Queue</emphasis> if there is one.
- </para>
-
-<!--h1--></section>
-</section>
diff --git a/doc/book/src/Security.xml b/doc/book/src/Security.xml
deleted file mode 100644
index 49abfbebca..0000000000
--- a/doc/book/src/Security.xml
+++ /dev/null
@@ -1,1217 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-<section id="chap-Messaging_User_Guide-Security">
- <title>Security</title>
- <para>
- This chapter describes how authentication, rule-based authorization, encryption, and digital signing can be accomplished using Qpid. Authentication is the process of verifying the identity of a user; in Qpid, this is done using the SASL framework. Rule-based authorization is a mechanism for specifying the actions that each user is allowed to perform; in Qpid, this is done using an Access Control List (ACL) that is part of the Qpid broker. Encryption is used to ensure that data is not transferred in a plain-text format that could be intercepted and read. Digital signatures provide proof that a given message was sent by a known sender. Encryption and signing are done using SSL (they can also be done using SASL, but SSL provides stronger encryption).
- </para>
- <section id="sect-Messaging_User_Guide-Security-User_Authentication">
- <title>User Authentication</title>
- <para>
- AMQP uses Simple Authentication and Security Layer (SASL) to authenticate client connections to the broker. SASL is a framework that supports a variety of authentication methods. For secure applications, we suggest <command>CRAM-MD5</command>, <command>DIGEST-MD5</command>, or <command>GSSAPI</command>. The <command>ANONYMOUS</command> method is not secure. The <command>PLAIN</command> method is secure only when used together with SSL.
- </para>
- <para>
- Both the Qpid broker and Qpid clients use the <ulink url="http://cyrusimap.web.cmu.edu/">Cyrus SASL library</ulink>, a full-featured authentication framework, which offers many configuration options. This section shows how to configure users for authentication with SASL, which is sufficient when using <command>SASL PLAIN</command>. If you are not using SSL, you should configure SASL to use <command>CRAM-MD5</command>, <command>DIGEST-MD5</command>, or <command>GSSAPI</command> (which provides Kerberos authentication). For information on configuring these and other options in SASL, see the Cyrus SASL documentation<!-- at <filename>/usr/share/doc/cyrus-sasl-lib-2.1.22/index.html</filename> for &RHEL5; or <filename>/usr/share/doc/cyrus-sasl-2.1.19/index.html</filename> for &RHEL4;-->.
- </para>
- <important>
- <title>Important</title>
- <para>
- The <command>SASL PLAIN</command> method sends passwords in cleartext, and is vulnerable to man-in-the-middle attacks unless SSL (Secure Socket Layer) is also used (see <xref linkend="sect-Messaging_User_Guide-Security-Encryption_using_SSL" />).
- </para>
- <para>
- If you are not using SSL, we recommend that you disable <command>PLAIN</command> authentication in the broker.
- </para>
-
- </important>
- <para>
- The Qpid broker uses the <command>auth yes|no</command> option to determine whether to use SASL authentication. Turn on authentication by setting <command>auth</command> to <command>yes</command> in <filename>/etc/qpidd.conf</filename>:
- </para>
-
-<programlisting>
-# /etc/qpidd.conf
-#
-# Set auth to &#39;yes&#39; or &#39;no&#39;
-
-auth=yes
-</programlisting>
- <section id="sect-Messaging_User_Guide-User_Authentication-Configuring_SASL">
- <title>Configuring SASL</title>
- <para>
- On Linux systems, the SASL configuration file is generally found in <filename>/etc/sasl2/qpidd.conf</filename> <!-- for &RHEL5; and-->or <filename>/usr/lib/sasl2/qpidd.conf</filename><!-- for &RHEL4;-->.
- </para>
- <para>
- The SASL database contains user names and passwords for SASL. In SASL, a user may be associated with a <firstterm>realm</firstterm>. The Qpid broker authenticates users in the <command>QPID</command> realm by default, but it can be set to a different realm using the <command>realm</command> option:
- </para>
-
-<programlisting>
-# /etc/qpidd.conf
-#
-# Set the SASL realm using &#39;realm=&#39;
-
-auth=yes
-realm=QPID
-</programlisting>
- <para>
- The SASL database is installed at <filename>/var/lib/qpidd/qpidd.sasldb</filename>; initially, it has one user named <command>guest</command> in the <command>QPID</command> realm, and the password for this user is <command>guest</command>.
- </para>
- <note>
- <title>Note</title>
- <para>
- The user database is readable only by the <systemitem class="username">qpidd</systemitem> user. When run as a daemon, Qpid always runs as the <systemitem class="username">qpidd</systemitem> user. If you start the broker from a user other than the <systemitem class="username">qpidd</systemitem> user, you will need to either reconfigure SASL or turn authentication off.
- </para>
-
- </note>
- <important>
- <title>Important</title>
- <para>
- The SASL database stores user names and passwords in plain text. If it is compromised so are all of the passwords that it stores. This is the reason that the <systemitem class="username">qpidd</systemitem> user is the only user that can read the database. If you modify permissions, be careful not to expose the SASL database.
- </para>
-
- </important>
- <para>
- Add new users to the database by using the <command>saslpasswd2</command> command, which specifies a realm and a user ID. A user ID takes the form <command><replaceable>user-id</replaceable>@<replaceable>domain</replaceable>.</command>.
- </para>
-
-<screen># saslpasswd2 -f /var/lib/qpidd/qpidd.sasldb -u <replaceable>realm</replaceable> <replaceable>new_user_name</replaceable></screen>
- <para>
- To list the users in the SASL database, use <command>sasldblistusers2</command>:
- </para>
-
-<screen># sasldblistusers2 -f /var/lib/qpidd/qpidd.sasldb
-</screen>
- <para>
- If you are using <command>PLAIN</command> authentication, users who are in the database can now connect with their user name and password. This is secure only if you are using SSL. If you are using a more secure form of authentication, please consult your SASL documentation for information on configuring the options you need.
- </para>
-
- </section>
-
- <section id="sect-Messaging_User_Guide-User_Authentication-Kerberos">
- <title>Kerberos</title>
- <para>
- Both the Qpid broker and Qpid users are &#39;principals&#39; of the Kerberos server, which means that they are both clients of the Kerberos authentication services.
- </para>
- <para>
- To use Kerberos, both the Qpid broker and each Qpid user must be authenticated on the Kerberos server:
- </para>
- <procedure>
- <step>
- <para>
- Install the Kerberos workstation software and Cyrus SASL GSSAPI on each machine that runs a qpidd broker or a qpidd messaging client:
- </para>
-
-<screen>$ sudo yum install cyrus-sasl-gssapi krb5-workstation</screen>
-
- </step>
- <step>
- <para>
- Make sure that the Qpid broker is registered in the Kerberos database.
- </para>
- <para>
- Traditionally, a Kerberos principal is divided into three parts: the primary, the instance, and the realm. A typical Kerberos V5 has the format <literal>primary/instance@REALM</literal>. For a Qpid broker, the primary is <literal>qpidd</literal>, the instance is the fully qualified domain name, which you can obtain using <command>hostname --fqdn</command>, and the REALM is the Kerberos domain realm. By default, this realm is <literal>QPID</literal>, but a different realm can be specified in qpid.conf, e.g.:
-<screen>realm=EXAMPLE.COM</screen>
-
- </para>
- <para>
- For instance, if the fully qualified domain name is <literal>dublduck.example.com</literal> and the Kerberos domain realm is <literal>EXAMPLE.COM</literal>, then the principal name is <literal>qpidd/dublduck.example.com@EXAMPLE.COM</literal>.
- </para>
- <para>
- The following script creates a principal for qpidd:
- </para>
-
-<programlisting>
-FDQN=`hostname --fqdn`
-REALM=&#34;EXAMPLE.COM&#34;
-kadmin -r $REALM -q &#34;addprinc -randkey -clearpolicy qpidd/$FQDN&#34;
-</programlisting>
- <para>
- Now create a Kerberos keytab file for the Qpid broker. The Qpid broker must have read access to the keytab file. The following script creates a keytab file and allows the broker read access:
- </para>
-
-<programlisting>
-QPIDD_GROUP=&#34;qpidd&#34;
-kadmin -r $REALM -q &#34;ktadd -k /etc/qpidd.keytab qpidd/$FQDN@$REALM&#34;
-chmod g+r /etc/qpidd.keytab
-chgrp $QPIDD_GROUP /etc/qpidd.keytab
-</programlisting>
- <para>
- The default location for the keytab file is <filename>/etc/krb5.keytab</filename>. If a different keytab file is used, the KRB5_KTNAME environment variable must contain the name of the file, e.g.:
- </para>
-
-<programlisting>
-export KRB5_KTNAME=/etc/qpidd.keytab
-</programlisting>
- <para>
- If this is correctly configured, you can now enable kerberos support on the Qpid broker by setting the <varname>auth</varname> and <varname>realm</varname> options in <filename>/etc/qpidd.conf</filename>:
- </para>
-
-<programlisting>
-# /etc/qpidd.conf
-auth=yes
-realm=EXAMPLE.COM
-</programlisting>
- <para>
- Restart the broker to activate these settings.
- </para>
-
- </step>
- <step>
- <para>
- Make sure that each Qpid user is registered in the Kerberos database, and that Kerberos is correctly configured on the client machine. The Qpid user is the account from which a Qpid messaging client is run. If it is correctly configured, the following command should succeed:
- </para>
-
-<screen>$ kinit user@REALM.COM</screen>
-
- </step>
-
- </procedure>
-
- <para>
- Java JMS clients require a few additional steps.
- </para>
- <procedure>
- <step>
- <para>
- The Java JVM must be run with the following arguments:
- </para>
- <variablelist>
- <varlistentry>
- <term>-Djavax.security.auth.useSubjectCredsOnly=false</term>
- <listitem>
- <para>
- Forces the SASL GASSPI client to obtain the kerberos credentials explicitly instead of obtaining from the &#34;subject&#34; that owns the current thread.
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term>-Djava.security.auth.login.config=myjas.conf</term>
- <listitem>
- <para>
- Specifies the jass configuration file. Here is a sample JASS configuration file:
- </para>
-
-<programlisting>
-com.sun.security.jgss.initiate {
- com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;
-};
-</programlisting>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term>-Dsun.security.krb5.debug=true</term>
- <listitem>
- <para>
- Enables detailed debug info for troubleshooting
- </para>
-
- </listitem>
-
- </varlistentry>
-
- </variablelist>
-
- </step>
- <step>
- <para>
- The client&#39;s Connection URL must specify the following Kerberos-specific broker properties:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <varname>sasl_mechs</varname> must be set to <literal>GSSAPI</literal>.
- </para>
-
- </listitem>
- <listitem>
- <para>
- <varname>sasl_protocol</varname> must be set to the principal for the qpidd broker, e.g. <literal>qpidd</literal>/
- </para>
-
- </listitem>
- <listitem>
- <para>
- <varname>sasl_server</varname> must be set to the host for the SASL server, e.g. <literal>sasl.com</literal>.
- </para>
-
- </listitem>
-
- </itemizedlist>
- <para>
- Here is a sample connection URL for a Kerberos connection:
- </para>
-
-<screen>amqp://guest@clientid/testpath?brokerlist=&#39;tcp://localhost:5672?sasl_mechs=&#39;GSSAPI&#39;&amp;sasl_protocol=&#39;qpidd&#39;&amp;sasl_server=&#39;&#60;server-host-name&#62;&#39;&#39;</screen>
-
- </step>
-
- </procedure>
-<!--
- <para>
- Please refer to the following documentation for more detail on using Kerberos:
- </para>
- <variablelist>
- <varlistentry>
- <term>RHEL5</term>
- <listitem>
- <para>
- <ulink url="http://www.redhat.com/docs/manuals/enterprise/RHEL-5-manual/Deployment_Guide-en-US/ch-kerberos.html"> Red Hat Enterprise Linux 5: Deployment Guide </ulink>
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term>RHEL4</term>
- <listitem>
- <para>
- <ulink url="http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/ref-guide/ch-kerberos.html"> Red Hat Enterprise Linux 4: Reference Guide </ulink>
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term>Java</term>
- <listitem>
- <para>
- <ulink url="http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/index.html"> Introduction to JAAS and Java GSS-API Tutorials </ulink>
- </para>
-
- </listitem>
-
- </varlistentry>
-
- </variablelist>
- -->
-
- </section>
-
-
- </section>
-
- <!-- ################################################### --> <section id="sect-Messaging_User_Guide-Security-Authorization">
- <title>Authorization</title>
- <para>
- In Qpid, Authorization specifies which actions can be performed by each authenticated user using an Access Control List (ACL). Use the <command>--acl-file</command> command to load the access control list. The filename should have a <filename>.acl</filename> extension:
- </para>
-
-<screen>
-$ qpidd --acl-file <replaceable>./aclfilename.acl</replaceable></screen>
- <para>
- Each line in an ACL file grants or denies specific rights to a user. If the last line in an ACL file is <literal>acl deny all all</literal>, the ACL uses <firstterm>deny mode</firstterm>, and only those rights that are explicitly allowed are granted:
- </para>
-
-<programlisting>
-acl allow rajith@QPID all all
-acl deny all all
-</programlisting>
- <para>
- On this server, <literal>rajith@QPID</literal> can perform any action, but nobody else can. Deny mode is the default, so the previous example is equivalent to the following ACL file:
- </para>
-
-<programlisting>
-acl allow rajith@QPID all all
-</programlisting>
- <para>
- In deny mode, denying rights to an action is redundant and has no effect.
- </para>
-
-<programlisting>
-acl allow rajith@QPID all all
-acl deny jonathan@QPID all all # This rule is redundant, and has no effect
-acl deny all all
-</programlisting>
- <para>
- If the last line in an ACL file is <literal>acl allow all all</literal>, ACL uses <firstterm>allow mode</firstterm>, and all rights are granted except those that are explicitly denied. The following ACL file allows everyone else to perform any action, but denies <literal>jonathan@QPID</literal> all permissions.
- </para>
-
-<programlisting>
-acl deny jonathan@QPID all all
-acl allow all all
-</programlisting>
- <para>
- In allow mode, allowing rights to an action is redundant and has no effect.
- </para>
-
-<programlisting>
-acl allow rajith@QPID all all # This rule is redundant, and has no effect
-acl deny jonathan@QPID all all
-acl allow all all
-</programlisting>
- <important>
- <title>Important</title>
- <para>
- ACL processing ends when one of the following lines is encountered:
- </para>
-
-<programlisting>
-acl allow all all
-</programlisting>
-
-<programlisting>
-acl deny all all
-</programlisting>
- <para>
- Any lines that occur after one of these statements will be ignored:
- </para>
-
-<programlisting>
-acl allow all all
-acl deny jonathan@QPID all all # This line is ignored !!!
-</programlisting>
-
- </important>
- <para>
- ACL syntax allows fine-grained access rights for specific actions:
- </para>
-
-<programlisting>
-acl allow carlt@QPID create exchange name=carl.*
-acl allow fred@QPID create all
-acl allow all consume queue
-acl allow all bind exchange
-acl deny all all
-</programlisting>
- <para>
- An ACL file can define user groups, and assign permissions to them:
- </para>
-
-<programlisting>
-group admin ted@QPID martin@QPID
-acl allow admin create all
-acl deny all all
-</programlisting>
- <!-- ######## --> <section id="sect-Messaging_User_Guide-Authorization-ACL_Syntax">
- <title>ACL Syntax</title>
- <para>
- ACL rules must be on a single line and follow this syntax:
-<programlisting>acl permission {&#60;group-name&#62;|&#60;user-name&#62;|&#34;all&#34;} {action|&#34;all&#34;} [object|&#34;all&#34;] [property=&#60;property-value&#62;]
-</programlisting>
- ACL rules can also include a single object name (or the keyword <parameter>all</parameter>) and one or more property name value pairs in the form <command>property=value</command>
- </para>
- <para>
- The following tables show the possible values for <command>permission</command>, <command>action</command>, <command>object</command>, and <command>property</command> in an ACL rules file.
- </para>
- <table id="tabl-Messaging_User_Guide-ACL_Syntax-ACL_Rules_permission">
- <title>ACL Rules: permission</title>
- <tgroup cols="2">
- <tbody>
- <row>
- <entry>
- <command>allow</command>
- </entry>
- <entry>
- <para>
- Allow the action <!-- ### rule => the action -->
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>allow-log</command>
- </entry>
- <entry>
- <para>
- Allow the action and log the action in the event log
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>deny</command>
- </entry>
- <entry>
- <para>
- Deny the action
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>deny-log</command>
- </entry>
- <entry>
- <para>
- Deny the action and log the action in the event log
- </para>
-
- </entry>
-
- </row>
-
- </tbody>
-
- </tgroup>
-
- </table>
- <!-- Actions --> <table id="tabl-Messaging_User_Guide-ACL_Syntax-ACL_Rulesaction">
- <title>ACL Rules:action</title>
- <tgroup cols="2">
- <tbody>
- <row>
- <entry>
- <command>consume</command>
- </entry>
- <entry>
- <para>
- Applied when subscriptions are created
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>publish</command>
- </entry>
- <entry>
- <para>
- Applied on a per message basis on publish message transfers, this rule consumes the most resources
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>create</command>
- </entry>
- <entry>
- <para>
- Applied when an object is created, such as bindings, queues, exchanges, links
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>access</command>
- </entry>
- <entry>
- <para>
- Applied when an object is read or accessed
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>bind</command>
- </entry>
- <entry>
- <para>
- Applied when objects are bound together
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>unbind</command>
- </entry>
- <entry>
- <para>
- Applied when objects are unbound
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>delete</command>
- </entry>
- <entry>
- <para>
- Applied when objects are deleted
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>purge</command>
- </entry>
- <entry>
- <para>
- Similar to delete but the action is performed on more than one object
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>update</command>
- </entry>
- <entry>
- <para>
- Applied when an object is updated
- </para>
-
- </entry>
-
- </row>
-
- </tbody>
-
- </tgroup>
-
- </table>
- <!-- object types --> <table id="tabl-Messaging_User_Guide-ACL_Syntax-ACL_Rulesobject">
- <title>ACL Rules:object</title>
- <tgroup cols="2">
- <tbody>
- <row>
- <entry>
- <command>queue</command>
- </entry>
- <entry>
- <para>
- A queue
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>exchange</command>
- </entry>
- <entry>
- <para>
- An exchange
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>broker</command>
- </entry>
- <entry>
- <para>
- The broker
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>link</command>
- </entry>
- <entry>
- <para>
- A federation or inter-broker link
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>method</command>
- </entry>
- <entry>
- <para>
- Management or agent or broker method
- </para>
-
- </entry>
-
- </row>
-
- </tbody>
-
- </tgroup>
-
- </table>
- <!--
- <para>
- Wild cards can be used on properties that are a string. The following properties are supported: --> <table id="tabl-Messaging_User_Guide-ACL_Syntax-ACL_Rulesproperty">
- <title>ACL Rules:property</title>
- <tgroup cols="2">
- <tbody>
- <row>
- <entry>
- <command>name</command>
- </entry>
- <entry>
- <para>
- String. Object name, such as a queue name or exchange name.
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>durable</command>
- </entry>
- <entry>
- <para>
- Boolean. Indicates the object is durable
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>routingkey</command>
- </entry>
- <entry>
- <para>
- Sring. Specifies routing key
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>passive</command>
- </entry>
- <entry>
- <para>
- Boolean. Indicates the presence of a <parameter>passive</parameter> flag
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>autodelete</command>
- </entry>
- <entry>
- <para>
- Boolean. Indicates whether or not the object gets deleted when the connection is closed
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>exclusive</command>
- </entry>
- <entry>
- <para>
- Boolean. Indicates the presence of an <parameter>exclusive</parameter> flag
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>type</command>
- </entry>
- <entry>
- <para>
- String. Type of object, such as topic, fanout, or xml
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>alternate</command>
- </entry>
- <entry>
- <para>
- String. Name of the alternate exchange
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>queuename</command>
- </entry>
- <entry>
- <para>
- String. Name of the queue (used only when the object is something other than <parameter>queue</parameter>
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>schemapackage</command>
- </entry>
- <entry>
- <para>
- String. QMF schema package name
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>schemaclass</command>
- </entry>
- <entry>
- <para>
- String. QMF schema class name
- </para>
-
- </entry>
-
- </row>
-
- </tbody>
-
- </tgroup>
-
- </table>
-
- </section>
-
- <section id="sect-Messaging_User_Guide-Authorization-ACL_Syntactic_Conventions">
- <title>ACL Syntactic Conventions</title>
- <para>
- In ACL files, the following syntactic conventions apply:
- <itemizedlist>
- <listitem>
- <para>
- A line starting with the <command>#</command> character is considered a comment and is ignored.
- </para>
-
- </listitem>
- <listitem>
- <para>
- Empty lines and lines that contain only whitespace are ignored
- </para>
-
- </listitem>
- <listitem>
- <para>
- All tokens are case sensitive. <parameter>name1</parameter> is not the same as <parameter>Name1</parameter> and <parameter>create</parameter> is not the same as <parameter>CREATE</parameter>
- </para>
-
- </listitem>
- <listitem>
- <para>
- Group lists can be extended to the following line by terminating the line with the <command>\</command> character
- </para>
-
- </listitem>
- <listitem>
- <para>
- Additional whitespace - that is, where there is more than one whitespace character - between and after tokens is ignored. Group and ACL definitions must start with either <command>group</command> or <command>acl</command> and with no preceding whitespace.
- </para>
-
- </listitem>
- <listitem>
- <para>
- All ACL rules are limited to a single line
- </para>
-
- </listitem>
- <listitem>
- <para>
- Rules are interpreted from the top of the file down until the name match is obtained; at which point processing stops.
- </para>
-
- </listitem>
- <listitem>
- <para>
- The keyword <parameter>all</parameter> matches all individuals, groups and actions
- </para>
-
- </listitem>
- <listitem>
- <para>
- The last line of the file - whether present or not - will be assumed to be <command>acl deny all all</command>. If present in the file, all lines below it are ignored.
- </para>
-
- </listitem>
- <listitem>
- <para>
- Names and group names may contain only <parameter>a-z</parameter>, <parameter>A-Z</parameter>, <parameter>0-9</parameter>, <parameter>-</parameter> and <parameter>_</parameter>
- </para>
-
- </listitem>
- <listitem>
- <para>
- Rules must be preceded by any group definitions they can use. Any name not defined as a group will be assumed to be that of an individual.
- </para>
-
- </listitem>
-
- </itemizedlist>
-
- </para>
-
- </section>
-
- <section id="sect-Messaging_User_Guide-Authorization-Specifying_ACL_Permissions">
- <title>Specifying ACL Permissions</title>
- <para>
- Now that we have seen the ACL syntax, we will provide representative examples and guidelines for ACL files.
- </para>
- <para>
- Most ACL files begin by defining groups:
- </para>
-
-<programlisting>
-group admin ted@QPID martin@QPID
-group user-consume martin@QPID ted@QPID
-group group2 kim@QPID user-consume rob@QPID
-group publisher group2 \
-tom@QPID andrew@QPID debbie@QPID
-</programlisting>
- <para>
- Rules in an ACL file grant or deny specific permissions to users or groups:
- </para>
-
-<programlisting>
-acl allow carlt@QPID create exchange name=carl.*
-acl allow rob@QPID create queue
-acl allow guest@QPID bind exchange name=amq.topic routingkey=stocks.rht.#
-acl allow user-consume create queue name=tmp.*
-
-acl allow publisher publish all durable=false
-acl allow publisher create queue name=RequestQueue
-acl allow consumer consume queue durable=true
-acl allow fred@QPID create all
-acl allow bob@QPID all queue
-acl allow admin all
-acl allow all consume queue
-acl allow all bind exchange
-acl deny all all
-</programlisting>
- <para>
- In the previous example, the last line, <literal>acl deny all all</literal>, denies all authorizations that have not been specifically granted. This is the default, but it is useful to include it explicitly on the last line for the sake of clarity. If you want to grant all rights by default, you can specify <literal>acl allow all all</literal> in the last line.
- </para>
- <para>
- Do not allow <parameter>guest</parameter> to access and log QMF management methods that could cause security breaches:
- </para>
-
-<programlisting>
-group allUsers guest@QPID
-....
-acl deny-log allUsers create link
-acl deny-log allUsers access method name=connect
-acl deny-log allUsers access method name=echo
-acl allow all all
-</programlisting>
-
- </section>
-
-
- </section>
-
- <!-- ########################### --> <section id="sect-Messaging_User_Guide-Security-Encryption_using_SSL">
- <title>Encryption using SSL</title>
- <para>
- Encryption and certificate management for <command>qpidd</command> is provided by Mozilla&#39;s Network Security Services Library (NSS).
- </para>
- <orderedlist id="orde-Messaging_User_Guide-Encryption_using_SSL-Enabling_SSL_for_the_RHM_broker">
- <title>Enabling SSL for the Qpid broker</title>
- <listitem>
- <para>
- You will need a certificate that has been signed by a Certification Authority (CA). This certificate will also need to be trusted by your client. If you require client authentication in addition to server authentication, the client&#39;s certificate will also need to be signed by a CA and trusted by the broker.
- </para>
- <para>
- In the broker, SSL is provided through the <command>ssl.so</command> module. This module is installed and loaded by default in Qpid. To enable the module, you need to specify the location of the database containing the certificate and key to use. This is done using the <command>ssl-cert-db</command> option.
- </para>
- <para>
- The certificate database is created and managed by the Mozilla Network Security Services (NSS) <command>certutil</command> tool. Information on this utility can be found on the <ulink url="http://www.mozilla.org/projects/security/pki/nss/tools/certutil.html">Mozilla website</ulink>, including tutorials on setting up and testing SSL connections. The certificate database will generally be password protected. The safest way to specify the password is to place it in a protected file, use the password file when creating the database, and specify the password file with the <command>ssl-cert-password-file</command> option when starting the broker.
- </para>
- <para>
- The following script shows how to create a certificate database using certutil:
- </para>
- <!-- TODO: improve description -->
-<programlisting>
-mkdir ${CERT_DIR}
-certutil -N -d ${CERT_DIR} -f ${CERT_PW_FILE}
-certutil -S -d ${CERT_DIR} -n ${NICKNAME} -s &#34;CN=${NICKNAME}&#34; -t &#34;CT,,&#34; -x -f ${CERT_PW_FILE} -z /usr/bin/certutil
-</programlisting>
- <para>
- When starting the broker, set <command>ssl-cert-password-file</command> to the value of <command>${CERT_PW_FILE}</command>, set <command>ssl-cert-db</command> to the value of <command>${CERT_DIR}</command>, and set <command>ssl-cert-name</command> to the value of <command>${NICKNAME}</command>.
- </para>
-
- </listitem>
- <!-- SSL options --> <listitem>
- <para>
- The following SSL options can be used when starting the broker:
- <variablelist>
- <varlistentry>
- <term><command>--ssl-use-export-policy</command></term>
- <listitem>
- <para>
- Use NSS export policy
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term><command>--ssl-cert-password-file <replaceable>PATH</replaceable></command></term>
- <listitem>
- <para>
- Required. Plain-text file containing password to use for accessing certificate database.
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term><command>--ssl-cert-db <replaceable>PATH</replaceable></command></term>
- <listitem>
- <para>
- Required. Path to directory containing certificate database.
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term><command>--ssl-cert-name <replaceable>NAME</replaceable></command></term>
- <listitem>
- <para>
- Name of the certificate to use. Default is <literal>localhost.localdomain</literal>.
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term><command>--ssl-port <replaceable>NUMBER</replaceable></command></term>
- <listitem>
- <para>
- Port on which to listen for SSL connections. If no port is specified, port 5671 is used.
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term><command>--ssl-require-client-authentication</command></term>
- <listitem>
- <para>
- Require SSL client authentication (i.e. verification of a client certificate) during the SSL handshake. This occurs before SASL authentication, and is independent of SASL.
- </para>
- <para>
- This option enables the <literal>EXTERNAL</literal> SASL mechanism for SSL connections. If the client chooses the <literal>EXTERNAL</literal> mechanism, the client&#39;s identity is taken from the validated SSL certificate, using the <literal>CN</literal>literal&#62;, and appending any <literal>DC</literal>literal&#62;s to create the domain. For instance, if the certificate contains the properties <literal>CN=bob</literal>, <literal>DC=acme</literal>, <literal>DC=com</literal>, the client&#39;s identity is <literal>bob@acme.com</literal>.
- </para>
- <para>
- If the client chooses a different SASL mechanism, the identity take from the client certificate will be replaced by that negotiated during the SASL handshake.
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term><command>--ssl-sasl-no-dict</command></term>
- <listitem>
- <para>
- Do not accept SASL mechanisms that can be compromised by dictionary attacks. This prevents a weaker mechanism being selected instead of <literal>EXTERNAL</literal>, which is not vulnerable to dictionary attacks.
- </para>
-
- </listitem>
-
- </varlistentry>
-
- </variablelist>
- Also relevant is the <command>--require-encryption</command> broker option. This will cause <command>qpidd</command> to only accept encrypted connections.
- </para>
-
- </listitem>
-
- </orderedlist>
- <!-- --> <variablelist id="vari-Messaging_User_Guide-Encryption_using_SSL-Enabling_SSL_in_Clients">
- <title>Enabling SSL in Clients</title>
- <varlistentry>
- <term>C++ clients:</term>
- <listitem>
- <para>
- <orderedlist>
- <listitem>
- <para>
- In C++ clients, SSL is implemented in the <command>sslconnector.so</command> module. This module is installed and loaded by default in Qpid.
- </para>
- <para>
- The following options can be specified for C++ clients using environment variables:
- </para>
- <table frame="all" id="tabl-Messaging_User_Guide-Enabling_SSL_in_Clients-SSL_Client_Environment_Variables_for_C_clients">
- <title>SSL Client Environment Variables for C++ clients</title>
- <tgroup align="left" cols="2" colsep="1" rowsep="1">
- <colspec colname="c1"></colspec>
- <colspec colname="c2"></colspec>
- <thead>
- <row>
- <entry align="center" nameend="c2" namest="c1">
- SSL Client Options for C++ clients
- </entry>
-
- </row>
-
- </thead>
- <tbody>
- <row>
- <entry>
- <command>QPID_SSL_USE_EXPORT_POLICY</command>
- </entry>
- <entry>
- Use NSS export policy
- </entry>
-
- </row>
- <row>
- <entry>
- <command>QPID_SSL_CERT_PASSWORD_FILE <replaceable>PATH</replaceable></command>
- </entry>
- <entry>
- File containing password to use for accessing certificate database
- </entry>
-
- </row>
- <row>
- <entry>
- <command>QPID_SSL_CERT_DB <replaceable>PATH</replaceable></command>
- </entry>
- <entry>
- Path to directory containing certificate database
- </entry>
-
- </row>
- <row>
- <entry>
- <command>QPID_SSL_CERT_NAME <replaceable>NAME</replaceable></command>
- </entry>
- <entry>
- Name of the certificate to use. When SSL client authentication is enabled, a certificate name should normally be provided.
- </entry>
-
- </row>
-
- </tbody>
-
- </tgroup>
-
- </table>
- <!-- ######## -->
- </listitem>
- <listitem>
- <para>
- When using SSL connections, clients must specify the location of the certificate database, a directory that contains the client&#39;s certificate and the public key of the Certificate Authority. This can be done by setting the environment variable <command>QPID_SSL_CERT_DB</command> to the full pathname of the directory. If a connection uses SSL client authentication, the client&#39;s password is also needed&mdash;the password should be placed in a protected file, and the <command>QPID_SSL_CERT_PASSWORD_FILE</command> variable should be set to the location of the file containing this password.
- </para>
-
- </listitem>
- <listitem>
- <para>
- To open an SSL enabled connection in the Qpid Messaging API, set the <parameter>protocol</parameter> connection option to <parameter>ssl</parameter>.
- </para>
-
- </listitem>
-
- </orderedlist>
-
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term>Java clients:</term>
- <listitem>
- <para>
- <orderedlist>
- <listitem>
- <para>
- For both server and client authentication, import the trusted CA to your trust store and keystore and generate keys for them. Create a certificate request using the generated keys and then create a certificate using the request. You can then import the signed certificate into your keystore. Pass the following arguments to the Java JVM when starting your client:
-<programlisting>
--Djavax.net.ssl.keyStore=/home/bob/ssl_test/keystore.jks
--Djavax.net.ssl.keyStorePassword=password
--Djavax.net.ssl.trustStore=/home/bob/ssl_test/certstore.jks
--Djavax.net.ssl.trustStorePassword=password
-</programlisting>
-
- </para>
-
- </listitem>
- <listitem>
- <para>
- For server side authentication only, import the trusted CA to your trust store and pass the following arguments to the Java JVM when starting your client:
-<programlisting>
--Djavax.net.ssl.trustStore=/home/bob/ssl_test/certstore.jks
--Djavax.net.ssl.trustStorePassword=password
-</programlisting>
-
- </para>
-
- </listitem>
- <listitem>
- <para>
- Java clients must use the SSL option in the connection URL to enable SSL encryption, e.g.
- </para>
-
-<programlisting>amqp://username:password@clientid/test?brokerlist=&#39;tcp://localhost:5672?ssl=&#39;true&#39;&#39;
-</programlisting>
-
- </listitem>
- <listitem>
- <para>
- If you need to debug problems in an SSL connection, enable Java&#39;s SSL debugging by passing the argument <literal>-Djavax.net.debug=ssl</literal> to the Java JVM when starting your client.
- </para>
-
- </listitem>
-
- </orderedlist>
-
- </para>
-
- </listitem>
-
- </varlistentry>
-
- </variablelist>
-
- </section>
-
-
-</section>
-
diff --git a/doc/book/src/Starting-a-cluster.xml b/doc/book/src/Starting-a-cluster.xml
deleted file mode 100644
index 036e571649..0000000000
--- a/doc/book/src/Starting-a-cluster.xml
+++ /dev/null
@@ -1,561 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<section id="chap-Messaging_User_Guide-High_Availability_Messaging_Clusters">
- <title>High Availability Messaging Clusters</title>
- <para>
- High Availability Messaging Clusters provide fault tolerance by ensuring that every broker in a <firstterm>cluster</firstterm> has the same queues, exchanges, messages, and bindings, and allowing a client to <firstterm>fail over</firstterm> to a new broker and continue without any loss of messages if the current broker fails or becomes unavailable. Because all brokers are automatically kept in a consistent state, clients can connect to and use any broker in a cluster. Any number of messaging brokers can be run as one <firstterm>cluster</firstterm>, and brokers can be added to or removed from a cluster while it is in use.
- </para>
- <para>
- High Availability Messaging Clusters are implemented using using the <ulink url="http://www.openais.org/">OpenAIS Cluster Framework</ulink>.
- </para>
- <para>
- An OpenAIS daemon runs on every machine in the cluster, and these daemons communicate using multicast on a particular address. Every qpidd process in a cluster joins a named group that is automatically synchronized using OpenAIS Closed Process Groups (CPG) — the qpidd processes multicast events to the named group, and CPG ensures that each qpidd process receives all the events in the same sequence. All members get an identical sequence of events, so they can all update their state consistently.
- </para>
- <para>
- Two messaging brokers are in the same cluster if
- <orderedlist>
- <listitem>
- <para>
- They run on hosts in the same OpenAIS cluster; that is, OpenAIS is configured with the same mcastaddr, mcastport and bindnetaddr, and
- </para>
-
- </listitem>
- <listitem>
- <para>
- They use the same cluster name.
- </para>
-
- </listitem>
-
- </orderedlist>
-
- </para>
- <para>
- High Availability Clustering has a cost: in order to allow each broker in a cluster to continue the work of any other broker, a cluster must replicate state for all brokers in the cluster. Because of this, the brokers in a cluster should normally be on a LAN; there should be fast and reliable connections between brokers. Even on a LAN, using multiple brokers in a cluster is somewhat slower than using a single broker without clustering. This may be counter-intuitive for people who are used to clustering in the context of High Performance Computing or High Throughput Computing, where clustering increases performance or throughput.
- </para>
-
- <para>
- High Availability Messaging Clusters should be used together with Red Hat Clustering Services (RHCS); without RHCS, clusters are vulnerable to the &#34;split-brain&#34; condition, in which a network failure splits the cluster into two sub-clusters that cannot communicate with each other. See the documentation on the <command>--cluster-cman</command> option for details on running using RHCS with High Availability Messaging Clusters. See the <ulink url="http://sources.redhat.com/cluster/wiki">CMAN Wiki</ulink> for more detail on CMAN and split-brain conditions. Use the <command>--cluster-cman</command> option to enable RHCS when starting the broker.
- </para>
- <section id="sect-Messaging_User_Guide-High_Availability_Messaging_Clusters-Starting_a_Broker_in_a_Cluster">
- <title>Starting a Broker in a Cluster</title>
- <para>
- Clustering is implemented using the <filename>cluster.so</filename> module, which is loaded by default when you start a broker. To run brokers in a cluster, make sure they all use the same OpenAIS mcastaddr, mcastport, and bindnetaddr. All brokers in a cluster must also have the same cluster name — specify the cluster name in <filename>qpidd.conf</filename>:
- </para>
-
-<screen>cluster-name=&#34;local_test_cluster&#34;
-</screen>
- <para>
- On RHEL6, you must create the file <filename>/etc/corosync/uidgid.d/qpidd</filename> to tell Corosync the name of the user running the broker.By default, the user is qpidd:
- </para>
-
-<programlisting>
-uidgid {
- uid: qpidd
- gid: qpidd
-}
-</programlisting>
- <para>
- On RHEL5, the primary group for the process running qpidd must be the ais group. If you are running qpidd as a service, it is run as the <command>qpidd</command> user, which is already in the ais group. If you are running the broker from the command line, you must ensure that the primary group for the user running qpidd is ais. You can set the primary group using <command>newgrp</command>:
- </para>
-
-<screen>$ newgrp ais
-</screen>
- <para>
- You can then run the broker from the command line, specifying the cluster name as an option.
- </para>
-
-<screen>[jonathan@localhost]$ qpidd --cluster-name=&#34;local_test_cluster&#34;
-</screen>
- <para>
- All brokers in a cluster must have identical configuration, with a few exceptions noted below. They must load the same set of plug-ins, and have matching configuration files and command line arguments. The should also have identical ACL files and SASL databases if these are used. If one broker uses persistence, all must use persistence — a mix of transient and persistent brokers is not allowed. Differences in configuration can cause brokers to exit the cluster. For instance, if different ACL settings allow a client to access a queue on broker A but not on broker B, then publishing to the queue will succeed on A and fail on B, so B will exit the cluster to prevent inconsistency.
- </para>
- <para>
- The following settings can differ for brokers on a given cluster:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- logging options
- </para>
-
- </listitem>
- <listitem>
- <para>
- cluster-url — if set, it will be different for each broker.
- </para>
-
- </listitem>
- <listitem>
- <para>
- port — brokers can listen on different ports.
- </para>
-
- </listitem>
-
- </itemizedlist>
- <para>
- The qpid log contains entries that record significant clustering events, e.g. when a broker becomes a member of a cluster, the membership of a cluster is changed, or an old journal is moved out of the way. For instance, the following message states that a broker has been added to a cluster as the first node:
- </para>
-
-<screen>
-2009-07-09 18:13:41 info 127.0.0.1:1410(READY) member update: 127.0.0.1:1410(member)
-2009-07-09 18:13:41 notice 127.0.0.1:1410(READY) first in cluster
-</screen>
- <note>
- <para>
- If you are using SELinux, the qpidd process and OpenAIS must have the same SELinux context, or else SELinux must be set to permissive mode. If both qpidd and OpenAIS are run as services, they have the same SELinux context. If both OpenAIS and qpidd are run as user processes, they have the same SELinux context. If one is run as a service, and the other is run as a user process, they have different SELinux contexts.
- </para>
-
- </note>
- <para>
- The following options are available for clustering:
- </para>
- <table frame="all" id="tabl-Messaging_User_Guide-Starting_a_Broker_in_a_Cluster-Options_for_High_Availability_Messaging_Cluster">
- <title>Options for High Availability Messaging Cluster</title>
- <tgroup align="left" cols="2" colsep="1" rowsep="1">
- <colspec colname="c1" colwidth="1*"></colspec>
- <colspec colname="c2" colwidth="4*"></colspec>
- <thead>
- <row>
- <entry align="center" nameend="c2" namest="c1">
- Options for High Availability Messaging Cluster
- </entry>
-
- </row>
-
- </thead>
- <tbody>
- <row>
- <entry>
- <command>--cluster-name <replaceable>NAME</replaceable></command>
- </entry>
- <entry>
- Name of the Messaging Cluster to join. A Messaging Cluster consists of all brokers started with the same cluster-name and openais configuration.
- </entry>
-
- </row>
- <row>
- <entry>
- <command>--cluster-size <replaceable>N</replaceable></command>
- </entry>
- <entry>
- Wait for at least N initial members before completing cluster initialization and serving clients. Use this option in a persistent cluster so all brokers in a persistent cluster can exchange the status of their persistent store and do consistency checks before serving clients.
- </entry>
-
- </row>
- <row>
- <entry>
- <command>--cluster-url <replaceable>URL</replaceable></command>
- </entry>
- <entry>
- An AMQP URL containing the local address that the broker advertizes to clients for fail-over connections. This is different for each host. By default, all local addresses for the broker are advertized. You only need to set this if
- <orderedlist>
- <listitem>
- <para>
- Your host has more than one active network interface, and
- </para>
-
- </listitem>
- <listitem>
- <para>
- You want to restrict client fail-over to a specific interface or interfaces.
- </para>
-
- </listitem>
-
- </orderedlist>
- <para>Each broker in the cluster is specified using the following form:</para>
-
-<programlisting>url = [&#34;amqp:&#34;][ user [&#34;/&#34; password] &#34;@&#34; ] protocol_addr
- (&#34;,&#34; protocol_addr)*
-protocol_addr = tcp_addr / rmda_addr / ssl_addr / ...
-tcp_addr = [&#34;tcp:&#34;] host [&#34;:&#34; port]
-rdma_addr = &#34;rdma:&#34; host [&#34;:&#34; port]
-ssl_addr = &#34;ssl:&#34; host [&#34;:&#34; port]</programlisting>
-
- <para>In most cases, only one address is advertized, but more than one address can be specified in if the machine running the broker has more than one network interface card, and you want to allow clients to connect using multiple network interfaces. Use a comma delimiter (&#34;,&#34;) to separate brokers in the URL. Examples:</para>
- <itemizedlist>
- <listitem>
- <para>
- <command>amqp:tcp:192.168.1.103:5672</command> advertizes a single address to the broker for failover.
- </para>
-
- </listitem>
- <listitem>
- <para>
- <command>amqp:tcp:192.168.1.103:5672,tcp:192.168.1.105:5672</command> advertizes two different addresses to the broker for failover, on two different network interfaces.
- </para>
-
- </listitem>
-
- </itemizedlist>
-
- </entry>
-
- </row>
- <row>
- <entry>
- <command>--cluster-cman</command>
- </entry>
- <entry>
- <para>
- CMAN protects against the &#34;split-brain&#34; condition, in which a network failure splits the cluster into two sub-clusters that cannot communicate with each other. When &#34;split-brain&#34; occurs, each of the sub-clusters can access shared resources without knowledge of the other sub-cluster, resulting in corrupted cluster integrity.
- </para>
- <para>
- To avoid &#34;split-brain&#34;, CMAN uses the notion of a &#34;quorum&#34;. If more than half the cluster nodes are active, the cluster has quorum and can act. If half (or fewer) nodes are active, the cluster does not have quorum, and all cluster activity is stopped. There are other ways to define the quorum for particular use cases (e.g. a cluster of only 2 members), see the <ulink url="http://sources.redhat.com/cluster/wiki">CMAN Wiki</ulink>
-for more detail.
- </para>
- <para>
- When enabled, the broker will wait until it belongs to a quorate cluster before accepting client connections. It continually monitors the quorum status and shuts down immediately if the node it runs on loses touch with the quorum.
- </para>
-
- </entry>
-
- </row>
- <row>
- <entry>
- --cluster-username
- </entry>
- <entry>
- SASL username for connections between brokers.
- </entry>
-
- </row>
- <row>
- <entry>
- --cluster-password
- </entry>
- <entry>
- SASL password for connections between brokers.
- </entry>
-
- </row>
- <row>
- <entry>
- --cluster-mechanism
- </entry>
- <entry>
- SASL authentication mechanism for connections between brokers
- </entry>
-
- </row>
-
- </tbody>
-
- </tgroup>
-
- </table>
- <para>
- If a broker is unable to establish a connection to another broker in the cluster, the log will contain SASL errors, e.g:
- </para>
-
-<screen>2009-aug-04 10:17:37 info SASL: Authentication failed: SASL(-13): user not found: Password verification failed
-</screen>
- <para>
- You can set the SASL user name and password used to connect to other brokers using the <command>cluster-username</command> and <command>cluster-password</command> properties when you start the broker. In most environment, it is easiest to create an account with the same user name and password on each broker in the cluster, and use these as the <command>cluster-username</command> and <command>cluster-password</command>. You can also set the SASL mode using <command>cluster-mechanism</command>. Remember that any mechanism you enable for broker-to-broker communication can also be used by a client, so do not enable <command>cluster-mechanism=ANONYMOUS</command> in a secure environment.
- </para>
- <para>
- Once the cluster is running, run <command>qpid-cluster</command> to make sure that the brokers are running as one cluster. See the following section for details.
- </para>
- <para>
- If the cluster is correctly configured, queues and messages are replicated to all brokers in the cluster, so an easy way to test the cluster is to run a program that routes messages to a queue on one broker, then connect to a different broker in the same cluster and read the messages to make sure they have been replicated. The <command>drain</command> and <command>spout</command> programs can be used for this test.
- </para>
-
- </section>
-
- <section id="sect-Messaging_User_Guide-High_Availability_Messaging_Clusters-qpid_cluster">
- <title>qpid-cluster</title>
- <para>
- <command>qpid-cluster</command> is a command-line utility that allows you to view information on a cluster and its brokers, disconnect a client connection, shut down a broker in a cluster, or shut down the entire cluster. You can see the options using the <command>--help</command> option:
- </para>
-
-<screen>$ ./qpid-cluster --help
-</screen>
-
-<screen>Usage: qpid-cluster [OPTIONS] [broker-addr]
-
- broker-addr is in the form: [username/password@] hostname | ip-address [:&#60;port&#62;]
- ex: localhost, 10.1.1.7:10000, broker-host:10000, guest/guest@localhost
-
-Options:
- -C [--all-connections] View client connections to all cluster members
- -c [--connections] ID View client connections to specified member
- -d [--del-connection] HOST:PORT
- Disconnect a client connection
- -s [--stop] ID Stop one member of the cluster by its ID
- -k [--all-stop] Shut down the whole cluster
- -f [--force] Suppress the &#39;are-you-sure?&#39; prompt
- -n [--numeric] Don&#39;t resolve names
-</screen>
- <para>
- Let&#39;s connect to a cluster and display basic information about the cluser and its brokers. When you connect to the cluster using <command>qpid-tool</command>, you can use the host and port for any broker in the cluster. For instance, if a broker in the cluster is running on <filename>localhost</filename> on port 6664, you can start <command>qpid-tool</command> like this:
- </para>
-
-<screen>
-$ qpid-cluster localhost:6664
-</screen>
- <para>
- Here is the output:
- </para>
-
-<screen>
- Cluster Name: local_test_cluster
-Cluster Status: ACTIVE
- Cluster Size: 3
- Members: ID=127.0.0.1:13143 URL=amqp:tcp:192.168.1.101:6664,tcp:192.168.122.1:6664,tcp:10.16.10.62:6664
- : ID=127.0.0.1:13167 URL=amqp:tcp:192.168.1.101:6665,tcp:192.168.122.1:6665,tcp:10.16.10.62:6665
- : ID=127.0.0.1:13192 URL=amqp:tcp:192.168.1.101:6666,tcp:192.168.122.1:6666,tcp:10.16.10.62:6666
-</screen>
- <para>
- The ID for each broker in cluster is given on the left. For instance, the ID for the first broker in the cluster is <command>127.0.0.1:13143</command>. The URL in the output is the broker&#39;s advertized address. Let&#39;s use the ID to shut the broker down using the <command>--stop</command> command:
- </para>
-
-<screen>$ ./qpid-cluster localhost:6664 --stop 127.0.0.1:13143
-</screen>
-
- </section>
-
- <section id="sect-Messaging_User_Guide-High_Availability_Messaging_Clusters-Failover_in_Clients">
- <title>Failover in Clients</title>
- <para>
- If a client is connected to a broker, the connection fails if the broker crashes or is killed. If heartbeat is enabled for the connection, a connection also fails if the broker hangs, the machine the broker is running on fails, or the network connection to the broker is lost — the connection fails no later than twice the heartbeat interval.
- </para>
- <para>
- When a client&#39;s connection to a broker fails, any sent messages that have been acknowledged to the sender will have been replicated to all brokers in the cluster, any received messages that have not yet been acknowledged by the receiving client requeued to all brokers, and the client API notifies the application of the failure by throwing an exception.
- </para>
- <para>
- Clients can be configured to automatically reconnect to another broker when it receives such an exception. Any messages that have been sent by the client, but not yet acknowledged as delivered, are resent. Any messages that have been read by the client, but not acknowledged, are delivered to the client.
- </para>
- <para>
- TCP is slow to detect connection failures. A client can configure a connection to use a heartbeat to detect connection failure, and can specify a time interval for the heartbeat. If heartbeats are in use, failures will be detected no later than twice the heartbeat interval. The Java JMS client enables hearbeat by default. See the sections on Failover in Java JMS Clients and Failover in C++ Clients for the code to enable heartbeat.
- </para>
- <section id="sect-Messaging_User_Guide-Failover_in_Clients-Failover_in_Java_JMS_Clients">
- <title>Failover in Java JMS Clients</title>
- <para>
- In Java JMS clients, client failover is handled automatically if it is enabled in the connection. Any messages that have been sent by the client, but not yet acknowledged as delivered, are resent. Any messages that have been read by the client, but not acknowledged, are sent to the client.
- </para>
- <para>
- You can configure a connection to use failover using the <command>failover</command> property:
- </para>
-
-<screen>
-connectionfactory.qpidConnectionfactory = amqp://guest:guest@clientid/test?brokerlist=&#39;tcp://localhost:5672&#39;&amp;failover=&#39;failover_exchange&#39;
-</screen>
- <para>
- This property can take three values:
- </para>
- <variablelist id="vari-Messaging_User_Guide-Failover_in_Java_JMS_Clients-Failover_Modes">
- <title>Failover Modes</title>
- <varlistentry>
- <term>failover_exchange</term>
- <listitem>
- <para>
- If the connection fails, fail over to any other broker in the cluster.
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term>roundrobin</term>
- <listitem>
- <para>
- If the connection fails, fail over to one of the brokers specified in the <command>brokerlist</command>.
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term>singlebroker</term>
- <listitem>
- <para>
- Failover is not supported; the connection is to a single broker only.
- </para>
-
- </listitem>
-
- </varlistentry>
-
- </variablelist>
- <para>
- In a Connection URL, heartbeat is set using the <command>idle_timeout</command> property, which is an integer corresponding to the heartbeat period in seconds. For instance, the following line from a JNDI properties file sets the heartbeat time out to 3 seconds:
- </para>
-
-<screen>
-connectionfactory.qpidConnectionfactory = amqp://guest:guest@clientid/test?brokerlist=&#39;tcp://localhost:5672&#39;,idle_timeout=3
-</screen>
-
- </section>
-
- <section id="sect-Messaging_User_Guide-Failover_in_Clients-Failover_and_the_Qpid_Messaging_API">
- <title>Failover and the Qpid Messaging API</title>
- <para>
- The Qpid Messaging API also supports automatic reconnection in the event a connection fails. . Senders can also be configured to replay any in-doubt messages (i.e. messages whice were sent but not acknowleged by the broker. See &#34;Connection Options&#34; and &#34;Sender Capacity and Replay&#34; in <citetitle>Programming in Apache Qpid</citetitle> for details.
- </para>
- <para>
- In C++ and python clients, heartbeats are disabled by default. You can enable them by specifying a heartbeat interval (in seconds) for the connection via the &#39;heartbeat&#39; option.
- </para>
- <para>
- See &#34;Cluster Failover&#34; in <citetitle>Programming in Apache Qpid</citetitle> for details on how to keep the client aware of cluster membership.
- </para>
-
- </section>
-
-
- </section>
-
- <section id="sect-Messaging_User_Guide-High_Availability_Messaging_Clusters-Error_handling_in_Clusters">
- <title>Error handling in Clusters</title>
- <para>
- If a broker crashes or is killed, or a broker machine failure, broker connection failure, or a broker hang is detected, the other brokers in the cluster are notified that it is no longer a member of the cluster. If a new broker is joined to the cluster, it synchronizes with an active broker to obtain the current cluster state; if this synchronization fails, the new broker exit the cluster and aborts.
- </para>
- <para>
- If a broker becomes extremely busy and stops responding, it stops accepting incoming work. All other brokers continue processing, and the non-responsive node caches all AIS traffic. When it resumes, the broker completes processes all cached AIS events, then accepts further incoming work. <!-- If a broker is non-responsive for too long, it is assumed to be hanging, and treated as described in the previous paragraph. -->
- </para>
- <para>
- Broker hangs are only detected if the watchdog plugin is loaded and the <command>--watchdog-interval</command> option is set. The watchdog plug-in kills the qpidd broker process if it becomes stuck for longer than the watchdog interval. In some cases, e.g. certain phases of error resolution, it is possible for a stuck process to hang other cluster members that are waiting for it to send a message. Using the watchdog, the stuck process is terminated and removed from the cluster, allowing other members to continue and clients of the stuck process to fail over to other members.
- </para>
- <para>
- Redundancy can also be achieved directly in the AIS network by specifying more than one network interface in the AIS configuration file. This causes Totem to use a redundant ring protocol, which makes failure of a single network transparent.
- </para>
- <para>
- Redundancy can be achieved at the operating system level by using NIC bonding, which combines multiple network ports into a single group, effectively aggregating the bandwidth of multiple interfaces into a single connection. This provides both network load balancing and fault tolerance.
- </para>
- <para>
- If any broker encounters an error, the brokers compare notes to see if they all received the same error. If not, the broker removes itself from the cluster and shuts itself down to ensure that all brokers in the cluster have consistent state. For instance, a broker may run out of disk space; if this happens, the broker shuts itself down. Examining the broker&#39;s log can help determine the error and suggest ways to prevent it from occuring in the future.
- </para>
- <!-- "Bad case" for cluster matrix - things we will fix, or things users may encounter long term? -->
- </section>
-
- <section id="sect-Messaging_User_Guide-High_Availability_Messaging_Clusters-Persistence_in_High_Availability_Message_Clusters">
- <title>Persistence in High Availability Message Clusters</title>
- <para>
- Persistence and clustering are two different ways to provide reliability. Most systems that use a cluster do not enable persistence, but you can do so if you want to ensure that messages are not lost even if the last broker in a cluster fails. A cluster must have all transient or all persistent members, mixed clusters are not allowed. Each broker in a persistent cluster has it&#39;s own independent replica of the cluster&#39;s state it its store.
- </para>
- <section id="sect-Messaging_User_Guide-Persistence_in_High_Availability_Message_Clusters-Clean_and_Dirty_Stores">
- <title>Clean and Dirty Stores</title>
- <para>
- When a broker is an active member of a cluster, its store is marked &#34;dirty&#34; because it may be out of date compared to other brokers in the cluster. If a broker leaves a running cluster because it is stopped, it crashes or the host crashes, its store continues to be marked &#34;dirty&#34;.
- </para>
- <para>
- If the cluster is reduced to a single broker, its store is marked &#34;clean&#34; since it is the only broker making updates. If the cluster is shut down with the command <literal>qpid-cluster -k</literal> then all the stores are marked clean.
- </para>
- <para>
- When a cluster is initially formed, brokers with clean stores read from their stores. Brokers with dirty stores, or brokers that join after the cluster is running, discard their old stores and initialize a new store with an update from one of the running brokers. The <command>--truncate</command> option can be used to force a broker to discard all existing stores even if they are clean. (A dirty store is discarded regardless.)
- </para>
- <para>
- Discarded stores are copied to a back up directory. The active store is in &#60;data-dir&#62;/rhm. Back-up stores are in &#60;data-dir&#62;/_cluster.bak.&#60;nnnn&#62;/rhm, where &#60;nnnn&#62; is a 4 digit number. A higher number means a more recent backup.
- </para>
-
- </section>
-
- <section id="sect-Messaging_User_Guide-Persistence_in_High_Availability_Message_Clusters-Starting_a_persistent_cluster">
- <title>Starting a persistent cluster</title>
- <para>
- When starting a persistent cluster broker, set the cluster-size option to the number of brokers in the cluster. This allows the brokers to wait until the entire cluster is running so that they can synchronize their stored state.
- </para>
- <para>
- The cluster can start if:
- </para>
- <para>
- <itemizedlist>
- <listitem>
- <para>
- all members have empty stores, or
- </para>
-
- </listitem>
- <listitem>
- <para>
- at least one member has a clean store
- </para>
-
- </listitem>
-
- </itemizedlist>
-
- </para>
- <para>
- All members of the new cluster will be initialized with the state from a clean store.
- </para>
-
- </section>
-
- <section id="sect-Messaging_User_Guide-Persistence_in_High_Availability_Message_Clusters-Stopping_a_persistent_cluster">
- <title>Stopping a persistent cluster</title>
- <para>
- To cleanly shut down a persistent cluster use the command <command>qpid-cluster -k</command>. This causes all brokers to synchronize their state and mark their stores as &#34;clean&#34; so they can be used when the cluster restarts.
- </para>
-
- </section>
-
- <section id="sect-Messaging_User_Guide-Persistence_in_High_Availability_Message_Clusters-Starting_a_persistent_cluster_with_no_clean_store">
- <title>Starting a persistent cluster with no clean store</title>
- <para>
- If the cluster has previously had a total failure and there are no clean stores then the brokers will fail to start with the log message <literal>Cannot recover, no clean store.</literal> If this happens you can start the cluster by marking one of the stores &#34;clean&#34; as follows:
- </para>
- <procedure>
- <step>
- <para>
- Move the latest store backup into place in the brokers data-directory. The backups end in a 4 digit number, the latest backup is the highest number.
- </para>
-
-<screen>
- cd &#60;data-dir&#62;
- mv rhm rhm.bak
- cp -a _cluster.bak.&#60;nnnn&#62;/rhm .
-</screen>
-
- </step>
- <step>
- <para>
- Mark the store as clean:
-<screen>qpid-cluster-store -c &#60;data-dir&#62;</screen>
-
- </para>
-
- </step>
-
- </procedure>
-
- <para>
- Now you can start the cluster, all members will be initialized from the store you marked as clean.
- </para>
-
- </section>
-
- <section id="sect-Messaging_User_Guide-Persistence_in_High_Availability_Message_Clusters-Isolated_failures_in_a_persistent_cluster">
- <title>Isolated failures in a persistent cluster</title>
- <para>
- A broker in a persistent cluster may encounter errors that other brokers in the cluster do not; if this happens, the broker shuts itself down to avoid making the cluster state inconsistent. For example a disk failure on one node will result in that node shutting down. Running out of storage capacity can also cause a node to shut down because because the brokers may not run out of storage at exactly the same point, even if they have similar storage configuration. To avoid unnecessary broker shutdowns, make sure the queue policy size of each durable queue is less than the capacity of the journal for the queue.
- </para>
-
- </section>
-
-
- </section>
-
-
-</section>
diff --git a/doc/book/src/amqp-advanced-message-queueing-protocol.html b/doc/book/src/amqp-advanced-message-queueing-protocol.html
deleted file mode 100644
index 9d46429d03..0000000000
--- a/doc/book/src/amqp-advanced-message-queueing-protocol.html
+++ /dev/null
@@ -1,237 +0,0 @@
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
- <HEAD>
- <LINK type="text/css" rel="stylesheet" href="resources/space.css">
- <STYLE type="text/css">
- .footer {
- background-image: url('http://cwiki.apache.org/confluence/images/border/border_bottom.gif');
- background-repeat: repeat-x;
- background-position: left top;
- padding-top: 4px;
- color: #666;
- clear: both;
- }
- .left {
- padding-top: 5px;
- float : left;
- width : 15em;
- }
- .pagecontent {
- float: left;
- width: 70%;
- }
- </STYLE>
- <SCRIPT type="text/javascript" language="javascript">
- var hide = null;
- var show = null;
- var children = null;
-
- function init() {
- /* Search form initialization */
- var form = document.forms['search'];
- if (form != null) {
- form.elements['domains'].value = location.hostname;
- form.elements['sitesearch'].value = location.hostname;
- }
-
- /* Children initialization */
- hide = document.getElementById('hide');
- show = document.getElementById('show');
- children = document.all != null ?
- document.all['children'] :
- document.getElementById('children');
- if (children != null) {
- children.style.display = 'none';
- show.style.display = 'inline';
- hide.style.display = 'none';
- }
- }
-
- function showChildren() {
- children.style.display = 'block';
- show.style.display = 'none';
- hide.style.display = 'inline';
- }
-
- function hideChildren() {
- children.style.display = 'none';
- show.style.display = 'inline';
- hide.style.display = 'none';
- }
- </SCRIPT>
- <TITLE>Apache Qpid: Open Source AMQP Messaging - AMQP (Advanced Message Queueing Protocol)</TITLE>
- <META http-equiv="Content-Type" content="text/html;charset=UTF-8"></HEAD>
- <BODY onload="init()">
- <TABLE border="0" cellpadding="2" cellspacing="0" width="100%">
- <TR class="topBar">
- <TD align="left" valign="middle" class="topBarDiv" align="left" nowrap="">
- &nbsp;<A href="index.html" title="Apache Qpid">Apache Qpid</A>&nbsp;&gt;&nbsp;<A href="index.html" title="Index">Index</A>&nbsp;&gt;&nbsp;<A href="" title="AMQP (Advanced Message Queueing Protocol)">AMQP (Advanced Message Queueing Protocol)</A>
- </TD>
- <TD align="right" valign="middle" nowrap="">
- <FORM name="search" action="http://www.google.com/search" method="get">
- <INPUT type="hidden" name="ie" value="UTF-8">
- <INPUT type="hidden" name="oe" value="UTF-8">
- <INPUT type="hidden" name="domains" value="">
- <INPUT type="hidden" name="sitesearch" value="">
- <INPUT type="text" name="q" maxlength="255" value="">
- <INPUT type="submit" name="btnG" value="Google Search">
- </FORM>
- </TD>
- </TR>
- </TABLE>
-
- <DIV id="PageContent">
- <DIV class="pageheader" style="padding: 6px 0px 0px 0px;">
-<DIV>
-<TABLE border="0" width="90%">
-<TR>
-<TD align="left">
-<A href="http://qpid.apache.org/">
-<IMG src="http://qpid.apache.org/images/qpid-logo.png" height="69" width="225" border="0"></A>
-</TD>
-<TD>
-</TD>
-<TD align="right"> <A href="http://www.apache.org/">
- <IMG src="http://qpid.apache.org/images/asf-logo.png" height="69" width="225" border="0"></A></TD>
-</TR>
-</TABLE>
-</DIV>
-
- </DIV>
-
-<!--
-
-
- <div class="pagesubheading" style="margin: 0px 10px 0px 10px;">
- Added by <a href="/confluence/display/~jonathan.robie@redhat.com">Jonathan Robie</a>, last edited by <a href="/confluence/display/~jonathan.robie@redhat.com">Jonathan Robie</a> on Feb 18, 2009
- &nbsp;(<a class="noprint" href="/confluence/pages/diffpages.action?pageId=110693&originalId=110695">view change</a>)
-
- </div>
--->
-
- <DIV class="left">
-
-
-
-
- <DIV class="panel" style="background-color: E0E0FF;border-color: #202080;border-style: solid;border-width: 1px;"><DIV class="panelContent" style="background-color: E0E0FF;">
-<H3><A name="Navigation-ApacheQpid"></A>Apache Qpid</H3>
-<P> <A href="index.html" title="Index">Home</A><BR>
- <A href="download.html" title="Download">Download</A><BR>
- <A href="getting-started.html" title="Getting Started">Getting Started</A> <BR>
- <A href="documentation.html" title="Documentation">Documentation</A><BR>
- <A href="mailing-lists.html" title="Mailing Lists">Mailing Lists</A><BR>
- <A href="http://issues.apache.org/jira/browse/qpid" rel="nofollow">Issue Reporting</A><BR>
- <A href="faq.html" title="FAQ">FAQ/How to</A></P>
-
-<H3><A name="Navigation-Resources"></A>Resources</H3>
-<P> <A href="getting-involved.html" title="Getting Involved">Getting Involved</A><BR>
- <A href="qpid-integrations.html" title="Qpid Integrations">Qpid Integrated with..</A><BR>
- <A href="source-repository.html" title="Source Repository">Source Repository</A><BR>
- <A href="building.html" title="Building">Building Qpid</A><BR>
- <A href="developer-pages.html" title="Developer Pages">Developer Pages</A><BR>
- <A href="qpid-management-framework.html" title="Qpid Management Framework">QMF</A></P>
-
-<H3><A name="Navigation-AboutQpid"></A>About Qpid</H3>
-<P> <A href="people.html" title="People">People</A><BR>
- <A href="license.html" title="License">License</A><BR>
- <A href="project-status.html" title="Project Status">Project Status</A><BR>
- <A href="acknowledgments.html" title="Acknowledgments">Acknowledgments</A></P>
-
-<H3><A name="Navigation-AboutAMQP"></A>About AMQP</H3>
-<P> <A href="" title="AMQP (Advanced Message Queueing Protocol)">What is AMQP ?</A><BR>
- <A href="" title="AMQP (Advanced Message Queueing Protocol)">AMQP Specification Download</A></P>
-
-<P><IMG src="navigation.data/AMQP_logo_71px-small.jpg" align="absmiddle" border="0"></P>
-</DIV></DIV>
- </DIV>
-
- <DIV class="pagecontent">
- <DIV class="wiki-content">
- <H2><A name="AMQP%28AdvancedMessageQueueingProtocol%29-WhatisAMQP%3F"></A>What is AMQP?</H2>
-
-<P>AMQP <A href="http://www.amqp.org/" rel="nofollow">Advanced Message Queuing Protocol</A> is an open standard designed to support reliable, high-performance messaging over the Internet. AMQP can be used for any distributed or business application, and supports common messaging paradigms like point-to-point, fanout, publish-subscribe, and request-response.</P>
-
-<P>Apache Qpid implements AMQP, including transaction management, queuing, clustering, federation, security, management and multi-platform support.</P>
-
-
-<P>Apache Qpid implements the latest AMQP specification, providing transaction management, queuing, distribution, security, management, clustering, federation and heterogeneous multi-platform support and a lot more. </P>
-
-<P>Apache Qpid is highly optimized, and <A href="amqp-compatibility.html" title="AMQP compatibility">aims to be 100% AMQP Compliant</A>.</P>
-
-<H2><A name="AMQP%28AdvancedMessageQueueingProtocol%29-DownloadtheAMQPSpecifications"></A>Download the AMQP Specifications</H2>
-
-<H3><A name="AMQP%28AdvancedMessageQueueingProtocol%29-AMQPversion010"></A>AMQP version 0-10</H3>
-
-
-<UL>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp.0-10.pdf?version=1" rel="nofollow">AMQP 0-10 Specification (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp.0-10.xml?version=1" rel="nofollow">AMQP 0-10 Protocol Definition XML </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp.0-10.dfd?version=1" rel="nofollow">AMQP 0-10 Protocol Definition DTD </A></LI>
-</UL>
-
-
-<H3><A name="AMQP%28AdvancedMessageQueueingProtocol%29-AMQPversion091"></A>AMQP version 0-9-1</H3>
-
-<UL>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-9-1.pdf?version=1" rel="nofollow">AMQP 0-9-1 Specification (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-9-1.xml?version=1" rel="nofollow">AMQP 0-9-1 Protocol Documentation (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-9-1.dtd?version=1" rel="nofollow">AMQP 0-9-1 Protocol Definitions (XML) </A></LI>
-</UL>
-
-
-<H3><A name="AMQP%28AdvancedMessageQueueingProtocol%29-AMQPversion09"></A>AMQP version 0-9</H3>
-
-<UL>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-9.pdf?version=1" rel="nofollow">AMQP 0-9 Specification (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-9.xml?version=1" rel="nofollow">AMQP 0-9 Protocol Documentation (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-9.dtd?version=1" rel="nofollow">AMQP 0-9 Protocol Definitions (XML) </A></LI>
-</UL>
-
-
-<H3><A name="AMQP%28AdvancedMessageQueueingProtocol%29-AMQPversion08"></A>AMQP version 0-8</H3>
-
-<UL>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-8.pdf?version=1" rel="nofollow">AMQP 0-8 Specification (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-8.dtd?version=1" rel="nofollow">AMQP 0-8 Protocol Documentation (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-8.xml?version=1" rel="nofollow">AMQP 0-8 Protocol Definitions (XML) </A></LI>
-</UL>
-
- </DIV>
-
-<!--
- -->
-
- </DIV>
-
- <DIV class="footer">
- Apache Qpid, Enterprise AMQP Messaging
- &nbsp;
- &copy; 2004-2008 The Apache Software Foundation.
- &nbsp;
- (<A href="http://cwiki.apache.org/confluence/pages/editpage.action?pageId=110693">edit this page</A>)
- </DIV>
- </BODY>
-</HTML>
diff --git a/doc/book/src/common/css/style.css b/doc/book/src/common/css/style.css
new file mode 100644
index 0000000000..c681596592
--- /dev/null
+++ b/doc/book/src/common/css/style.css
@@ -0,0 +1,279 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+ul {
+ list-style-type:square;
+}
+
+th {
+ font-weight: bold;
+}
+
+.navfooter td {
+ font-size:10pt;
+}
+
+.navheader td {
+ font-size:10pt;
+}
+
+body {
+ margin:0;
+ background:#FFFFFF;
+ font-family:"Verdana", sans-serif;
+ font-size:10pt;
+}
+
+.container {
+ width:950px;
+ margin:0 auto;
+}
+
+body a {
+ color:#000000;
+}
+
+
+div.book {
+ margin-left:10pt;
+ margin-right:10pt;
+}
+
+div.preface {
+ margin-left:10pt;
+ margin-right:10pt;
+}
+
+div.chapter {
+ margin-left:10pt;
+ margin-right:10pt;
+}
+
+div.section {
+ margin-left:10pt;
+ margin-right:10pt;
+}
+
+div.titlepage {
+ margin-left:-10pt;
+ margin-right:-10pt;
+}
+
+.calloutlist td {
+ font-size:10pt;
+}
+
+.table-contents table {
+ border-spacing: 0px;
+}
+
+.table-contents td {
+ font-size:10pt;
+ padding-left:6px;
+ padding-right:6px;
+}
+
+div.breadcrumbs {
+ font-size:9pt;
+ margin-right:10pt;
+ padding-bottom:16px;
+}
+
+.chapter h2.title {
+ font-size:20pt;
+ color:#0c3b82;
+}
+
+.chapter .section h2.title {
+ font-size:18pt;
+ color:#0c3b82;
+}
+
+.section h2.title {
+ font-size:16pt;
+ color:#0c3b82;
+}
+
+.section h3.title {
+ font-size:14pt;
+ color:#0c3b82;
+}
+
+.section h4.title {
+ font-size:12pt;
+ color:#0c3b82;
+}
+
+.section h5.title {
+ font-size:12pt;
+ color:#0c3b82;
+}
+
+.section h6.title {
+ font-size:12pt;
+ color:#0c3b82;
+}
+
+.toc a {
+ font-size:9pt;
+}
+
+.header {
+ height:100px;
+ width:950px;
+ background:url(http://qpid.apache.org/images/header.png)
+}
+
+.logo {
+ text-align:center;
+ font-weight:600;
+ padding:0 0 0 0;
+ font-size:14px;
+ font-family:"Verdana", cursive;
+}
+
+.logo a {
+ color:#000000;
+ text-decoration:none;
+}
+
+.main_text_area {
+ margin-left:200px;
+}
+
+.main_text_area_top {
+ height:14px;
+ font-size:1px;
+}
+
+.main_text_area_bottom {
+ display:none;
+/* height:14px;
+ margin-bottom:4px;*/
+}
+
+.main_text_area_body {
+ padding:5px 24px;
+}
+
+.main_text_area_body p {
+ text-align:justify;
+}
+
+.main_text_area br {
+ line-height:10px;
+}
+
+.main_text_area h1 {
+ font-size:28px;
+ font-weight:600;
+ margin:0 0 24px 0;
+ color:#0c3b82;
+ font-family:"Verdana", Times, serif;
+}
+
+.main_text_area h2 {
+ font-size:24px;
+ font-weight:600;
+ margin:24px 0 8px 0;
+ color:#0c3b82;
+ font-family:"Verdana",Times, serif;
+}
+
+.main_text_area ol, .main_text_area ul {
+ padding:0;
+ margin:10px 0;
+ margin-left:20px;
+}
+
+.main_text_area li {
+/* margin-left:40px; */
+}
+
+.main_text_area, .menu_box {
+ font-size:13px;
+ line-height:17px;
+ color:#000000;
+}
+
+.main_text_area {
+ font-size:14px;
+}
+
+.main_text_area a {
+ color:#000000;
+}
+
+.main_text_area a:hover {
+ color:#000000;
+}
+
+.menu_box {
+ width:196px;
+ float:left;
+ margin-left:4px;
+}
+
+.menu_box_top {
+ background:url(http://qpid.apache.org/images/menu_top.png) no-repeat;
+ height:14px;
+ font-size:1px;
+}
+
+.menu_box_body {
+ background:url(http://qpid.apache.org/images/menu_body.png) repeat-y;
+ padding:5px 24px 5px 24px;
+}
+
+.menu_box_bottom {
+ background:url(http://qpid.apache.org/images/menu_bottom.png) no-repeat;
+ height:14px;
+ font-size:1px;
+ margin-bottom:1px;
+}
+
+.menu_box h3 {
+ font-size:20px;
+ font-weight:500;
+ margin:0 0 8px 0;
+ color:#0c3b82;
+ font-family:"Verdana",Times, serif;
+}
+
+.menu_box ul {
+ margin:12px;
+ padding:0px;
+}
+
+.menu_box li {
+ list-style:square;
+}
+
+.menu_box a {
+ color:#000000;
+ text-decoration:none;
+}
+
+.menu_box a:hover {
+ color:#000000;
+ text-decoration:underline;
+}
+
+
diff --git a/doc/book/src/AMQP-Compatibility.xml b/doc/book/src/cpp-broker/AMQP-Compatibility.xml
index e5aa98cf96..e5aa98cf96 100644
--- a/doc/book/src/AMQP-Compatibility.xml
+++ b/doc/book/src/cpp-broker/AMQP-Compatibility.xml
diff --git a/doc/book/src/cpp-broker/AMQP-Messaging-Broker-CPP-Book.xml b/doc/book/src/cpp-broker/AMQP-Messaging-Broker-CPP-Book.xml
new file mode 100644
index 0000000000..228c6a5e15
--- /dev/null
+++ b/doc/book/src/cpp-broker/AMQP-Messaging-Broker-CPP-Book.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+<book xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>AMQP Messaging Broker (Implemented in C++)</title>
+ <preface>
+ <title>Introduction</title>
+
+ <para>Qpid provides two AMQP messaging brokers:</para>
+
+ <itemizedlist>
+ <listitem><para>Implemented in C++ - high performance, low latency, and RDMA support.</para></listitem>
+ <listitem><para>Implemented in Java - Fully JMS compliant, runs on any Java platform.</para></listitem>
+ </itemizedlist>
+
+ <para>Both AMQP messaging brokers support clients in multiple
+ languages, as long as the messaging client and the messaging
+ broker use the same version of AMQP. See <link
+ linkend="AMQP-Compatibility">AMQP Compatibility</link> to see
+ which messaging clients work with each broker.</para>
+
+ <para>This manual contains information specific to the broker that is implemented in C++.</para>
+ </preface>
+
+<chapter>
+ <title>
+ Running the AMQP Messaging Broker
+ </title>
+
+ <xi:include href="Running-CPP-Broker.xml"/>
+ <xi:include href="Cheat-Sheet-for-configuring-Queue-Options.xml"/>
+ <xi:include href="Cheat-Sheet-for-configuring-Exchange-Options.xml"/>
+ <xi:include href="Using-Broker-Federation.xml"/>
+ <xi:include href="Security.xml"/>
+ <xi:include href="LVQ.xml"/>
+ <xi:include href="queue-state-replication.xml"/>
+ <xi:include href="Active-Active-Cluster.xml"/>
+ <xi:include href="producer-flow-control.xml"/>
+ <xi:include href="AMQP-Compatibility.xml"/>
+ <xi:include href="Qpid-Interoperability-Documentation.xml"/>
+ <xi:include href="Using-message-groups.xml"/>
+ <xi:include href="Active-Passive-Cluster.xml"/>
+ <xi:include href="HA-Queue-Replication.xml"/>
+</chapter>
+
+
+<chapter id="chapter-Managing-CPP-Broker">
+ <title>
+ Managing the AMQP Messaging Broker
+ </title>
+
+ <xi:include href="Managing-CPP-Broker.xml"/>
+ <xi:include href="Qpid-Management-Framework.xml"/>
+ <xi:include href="QMF-Python-Console-Tutorial.xml"/>
+</chapter>
+</book>
diff --git a/doc/book/src/cpp-broker/Active-Active-Cluster.xml b/doc/book/src/cpp-broker/Active-Active-Cluster.xml
new file mode 100644
index 0000000000..28db3876e2
--- /dev/null
+++ b/doc/book/src/cpp-broker/Active-Active-Cluster.xml
@@ -0,0 +1,561 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+
+-->
+
+<section id="chap-Messaging_User_Guide-Active_Active_Cluster">
+ <title>Active-active Messaging Clusters</title>
+ <para>
+ Active-active Messaging Clusters provide fault tolerance by ensuring that every broker in a <firstterm>cluster</firstterm> has the same queues, exchanges, messages, and bindings, and allowing a client to <firstterm>fail over</firstterm> to a new broker and continue without any loss of messages if the current broker fails or becomes unavailable. <firstterm>Active-active</firstterm> refers to the fact that all brokers in the cluster can actively serve clients. Because all brokers are automatically kept in a consistent state, clients can connect to and use any broker in a cluster. Any number of messaging brokers can be run as one <firstterm>cluster</firstterm>, and brokers can be added to or removed from a cluster while it is in use.
+ </para>
+ <para>
+ High Availability Messaging Clusters are implemented using using the <ulink url="http://www.openais.org/">OpenAIS Cluster Framework</ulink>.
+ </para>
+ <para>
+ An OpenAIS daemon runs on every machine in the cluster, and these daemons communicate using multicast on a particular address. Every qpidd process in a cluster joins a named group that is automatically synchronized using OpenAIS Closed Process Groups (CPG) — the qpidd processes multicast events to the named group, and CPG ensures that each qpidd process receives all the events in the same sequence. All members get an identical sequence of events, so they can all update their state consistently.
+ </para>
+ <para>
+ Two messaging brokers are in the same cluster if
+ <orderedlist>
+ <listitem>
+ <para>
+ They run on hosts in the same OpenAIS cluster; that is, OpenAIS is configured with the same mcastaddr, mcastport and bindnetaddr, and
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ They use the same cluster name.
+ </para>
+
+ </listitem>
+
+ </orderedlist>
+
+ </para>
+ <para>
+ High Availability Clustering has a cost: in order to allow each broker in a cluster to continue the work of any other broker, a cluster must replicate state for all brokers in the cluster. Because of this, the brokers in a cluster should normally be on a LAN; there should be fast and reliable connections between brokers. Even on a LAN, using multiple brokers in a cluster is somewhat slower than using a single broker without clustering. This may be counter-intuitive for people who are used to clustering in the context of High Performance Computing or High Throughput Computing, where clustering increases performance or throughput.
+ </para>
+
+ <para>
+ High Availability Messaging Clusters should be used together with Red Hat Clustering Services (RHCS); without RHCS, clusters are vulnerable to the &#34;split-brain&#34; condition, in which a network failure splits the cluster into two sub-clusters that cannot communicate with each other. See the documentation on the <command>--cluster-cman</command> option for details on running using RHCS with High Availability Messaging Clusters. See the <ulink url="http://sources.redhat.com/cluster/wiki">CMAN Wiki</ulink> for more detail on CMAN and split-brain conditions. Use the <command>--cluster-cman</command> option to enable RHCS when starting the broker.
+ </para>
+ <section id="sect-Messaging_User_Guide-High_Availability_Messaging_Clusters-Starting_a_Broker_in_a_Cluster">
+ <title>Starting a Broker in a Cluster</title>
+ <para>
+ Clustering is implemented using the <filename>cluster.so</filename> module, which is loaded by default when you start a broker. To run brokers in a cluster, make sure they all use the same OpenAIS mcastaddr, mcastport, and bindnetaddr. All brokers in a cluster must also have the same cluster name — specify the cluster name in <filename>qpidd.conf</filename>:
+ </para>
+
+ <screen>cluster-name=&#34;local_test_cluster&#34;
+ </screen>
+ <para>
+ On RHEL6, you must create the file <filename>/etc/corosync/uidgid.d/qpidd</filename> to tell Corosync the name of the user running the broker.By default, the user is qpidd:
+ </para>
+
+ <programlisting>
+ uidgid {
+ uid: qpidd
+ gid: qpidd
+ }
+ </programlisting>
+ <para>
+ On RHEL5, the primary group for the process running qpidd must be the ais group. If you are running qpidd as a service, it is run as the <command>qpidd</command> user, which is already in the ais group. If you are running the broker from the command line, you must ensure that the primary group for the user running qpidd is ais. You can set the primary group using <command>newgrp</command>:
+ </para>
+
+ <screen>$ newgrp ais
+ </screen>
+ <para>
+ You can then run the broker from the command line, specifying the cluster name as an option.
+ </para>
+
+ <screen>[jonathan@localhost]$ qpidd --cluster-name=&#34;local_test_cluster&#34;
+ </screen>
+ <para>
+ All brokers in a cluster must have identical configuration, with a few exceptions noted below. They must load the same set of plug-ins, and have matching configuration files and command line arguments. The should also have identical ACL files and SASL databases if these are used. If one broker uses persistence, all must use persistence — a mix of transient and persistent brokers is not allowed. Differences in configuration can cause brokers to exit the cluster. For instance, if different ACL settings allow a client to access a queue on broker A but not on broker B, then publishing to the queue will succeed on A and fail on B, so B will exit the cluster to prevent inconsistency.
+ </para>
+ <para>
+ The following settings can differ for brokers on a given cluster:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ logging options
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ cluster-url — if set, it will be different for each broker.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ port — brokers can listen on different ports.
+ </para>
+
+ </listitem>
+
+ </itemizedlist>
+ <para>
+ The qpid log contains entries that record significant clustering events, e.g. when a broker becomes a member of a cluster, the membership of a cluster is changed, or an old journal is moved out of the way. For instance, the following message states that a broker has been added to a cluster as the first node:
+ </para>
+
+ <screen>
+ 2009-07-09 18:13:41 info 127.0.0.1:1410(READY) member update: 127.0.0.1:1410(member)
+ 2009-07-09 18:13:41 notice 127.0.0.1:1410(READY) first in cluster
+ </screen>
+ <note>
+ <para>
+ If you are using SELinux, the qpidd process and OpenAIS must have the same SELinux context, or else SELinux must be set to permissive mode. If both qpidd and OpenAIS are run as services, they have the same SELinux context. If both OpenAIS and qpidd are run as user processes, they have the same SELinux context. If one is run as a service, and the other is run as a user process, they have different SELinux contexts.
+ </para>
+
+ </note>
+ <para>
+ The following options are available for clustering:
+ </para>
+ <table frame="all" id="tabl-Messaging_User_Guide-Starting_a_Broker_in_a_Cluster-Options_for_High_Availability_Messaging_Cluster">
+ <title>Options for High Availability Messaging Cluster</title>
+ <tgroup align="left" cols="2" colsep="1" rowsep="1">
+ <colspec colname="c1" colwidth="1*"></colspec>
+ <colspec colname="c2" colwidth="4*"></colspec>
+ <thead>
+ <row>
+ <entry align="center" nameend="c2" namest="c1">
+ Options for High Availability Messaging Cluster
+ </entry>
+
+ </row>
+
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <command>--cluster-name <replaceable>NAME</replaceable></command>
+ </entry>
+ <entry>
+ Name of the Messaging Cluster to join. A Messaging Cluster consists of all brokers started with the same cluster-name and openais configuration.
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>--cluster-size <replaceable>N</replaceable></command>
+ </entry>
+ <entry>
+ Wait for at least N initial members before completing cluster initialization and serving clients. Use this option in a persistent cluster so all brokers in a persistent cluster can exchange the status of their persistent store and do consistency checks before serving clients.
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>--cluster-url <replaceable>URL</replaceable></command>
+ </entry>
+ <entry>
+ An AMQP URL containing the local address that the broker advertizes to clients for fail-over connections. This is different for each host. By default, all local addresses for the broker are advertized. You only need to set this if
+ <orderedlist>
+ <listitem>
+ <para>
+ Your host has more than one active network interface, and
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ You want to restrict client fail-over to a specific interface or interfaces.
+ </para>
+
+ </listitem>
+
+ </orderedlist>
+ <para>Each broker in the cluster is specified using the following form:</para>
+
+ <programlisting>url = [&#34;amqp:&#34;][ user [&#34;/&#34; password] &#34;@&#34; ] protocol_addr
+ (&#34;,&#34; protocol_addr)*
+ protocol_addr = tcp_addr / rmda_addr / ssl_addr / ...
+ tcp_addr = [&#34;tcp:&#34;] host [&#34;:&#34; port]
+ rdma_addr = &#34;rdma:&#34; host [&#34;:&#34; port]
+ ssl_addr = &#34;ssl:&#34; host [&#34;:&#34; port]</programlisting>
+
+ <para>In most cases, only one address is advertized, but more than one address can be specified in if the machine running the broker has more than one network interface card, and you want to allow clients to connect using multiple network interfaces. Use a comma delimiter (&#34;,&#34;) to separate brokers in the URL. Examples:</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <command>amqp:tcp:192.168.1.103:5672</command> advertizes a single address to the broker for failover.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ <command>amqp:tcp:192.168.1.103:5672,tcp:192.168.1.105:5672</command> advertizes two different addresses to the broker for failover, on two different network interfaces.
+ </para>
+
+ </listitem>
+
+ </itemizedlist>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>--cluster-cman</command>
+ </entry>
+ <entry>
+ <para>
+ CMAN protects against the &#34;split-brain&#34; condition, in which a network failure splits the cluster into two sub-clusters that cannot communicate with each other. When &#34;split-brain&#34; occurs, each of the sub-clusters can access shared resources without knowledge of the other sub-cluster, resulting in corrupted cluster integrity.
+ </para>
+ <para>
+ To avoid &#34;split-brain&#34;, CMAN uses the notion of a &#34;quorum&#34;. If more than half the cluster nodes are active, the cluster has quorum and can act. If half (or fewer) nodes are active, the cluster does not have quorum, and all cluster activity is stopped. There are other ways to define the quorum for particular use cases (e.g. a cluster of only 2 members), see the <ulink url="http://sources.redhat.com/cluster/wiki">CMAN Wiki</ulink>
+ for more detail.
+ </para>
+ <para>
+ When enabled, the broker will wait until it belongs to a quorate cluster before accepting client connections. It continually monitors the quorum status and shuts down immediately if the node it runs on loses touch with the quorum.
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ --cluster-username
+ </entry>
+ <entry>
+ SASL username for connections between brokers.
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ --cluster-password
+ </entry>
+ <entry>
+ SASL password for connections between brokers.
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ --cluster-mechanism
+ </entry>
+ <entry>
+ SASL authentication mechanism for connections between brokers
+ </entry>
+
+ </row>
+
+ </tbody>
+
+ </tgroup>
+
+ </table>
+ <para>
+ If a broker is unable to establish a connection to another broker in the cluster, the log will contain SASL errors, e.g:
+ </para>
+
+ <screen>2009-aug-04 10:17:37 info SASL: Authentication failed: SASL(-13): user not found: Password verification failed
+ </screen>
+ <para>
+ You can set the SASL user name and password used to connect to other brokers using the <command>cluster-username</command> and <command>cluster-password</command> properties when you start the broker. In most environment, it is easiest to create an account with the same user name and password on each broker in the cluster, and use these as the <command>cluster-username</command> and <command>cluster-password</command>. You can also set the SASL mode using <command>cluster-mechanism</command>. Remember that any mechanism you enable for broker-to-broker communication can also be used by a client, so do not enable <command>cluster-mechanism=ANONYMOUS</command> in a secure environment.
+ </para>
+ <para>
+ Once the cluster is running, run <command>qpid-cluster</command> to make sure that the brokers are running as one cluster. See the following section for details.
+ </para>
+ <para>
+ If the cluster is correctly configured, queues and messages are replicated to all brokers in the cluster, so an easy way to test the cluster is to run a program that routes messages to a queue on one broker, then to a different broker in the same cluster and read the messages to make sure they have been replicated. The <command>drain</command> and <command>spout</command> programs can be used for this test.
+ </para>
+
+ </section>
+
+ <section id="sect-Messaging_User_Guide-High_Availability_Messaging_Clusters-qpid_cluster">
+ <title>qpid-cluster</title>
+ <para>
+ <command>qpid-cluster</command> is a command-line utility that allows you to view information on a cluster and its brokers, disconnect a client connection, shut down a broker in a cluster, or shut down the entire cluster. You can see the options using the <command>--help</command> option:
+ </para>
+
+ <screen>$ ./qpid-cluster --help
+ </screen>
+
+ <screen>Usage: qpid-cluster [OPTIONS] [broker-addr]
+
+ broker-addr is in the form: [username/password@] hostname | ip-address [:&#60;port&#62;]
+ ex: localhost, 10.1.1.7:10000, broker-host:10000, guest/guest@localhost
+
+ Options:
+ -C [--all-connections] View client connections to all cluster members
+ -c [--connections] ID View client connections to specified member
+ -d [--del-connection] HOST:PORT
+ Disconnect a client connection
+ -s [--stop] ID Stop one member of the cluster by its ID
+ -k [--all-stop] Shut down the whole cluster
+ -f [--force] Suppress the &#39;are-you-sure?&#39; prompt
+ -n [--numeric] Don&#39;t resolve names
+ </screen>
+ <para>
+ Let&#39;s connect to a cluster and display basic information about the cluser and its brokers. When you connect to the cluster using <command>qpid-tool</command>, you can use the host and port for any broker in the cluster. For instance, if a broker in the cluster is running on <filename>localhost</filename> on port 6664, you can start <command>qpid-tool</command> like this:
+ </para>
+
+ <screen>
+ $ qpid-cluster localhost:6664
+ </screen>
+ <para>
+ Here is the output:
+ </para>
+
+ <screen>
+ Cluster Name: local_test_cluster
+ Cluster Status: ACTIVE
+ Cluster Size: 3
+ Members: ID=127.0.0.1:13143 URL=amqp:tcp:192.168.1.101:6664,tcp:192.168.122.1:6664,tcp:10.16.10.62:6664
+ : ID=127.0.0.1:13167 URL=amqp:tcp:192.168.1.101:6665,tcp:192.168.122.1:6665,tcp:10.16.10.62:6665
+ : ID=127.0.0.1:13192 URL=amqp:tcp:192.168.1.101:6666,tcp:192.168.122.1:6666,tcp:10.16.10.62:6666
+ </screen>
+ <para>
+ The ID for each broker in cluster is given on the left. For instance, the ID for the first broker in the cluster is <command>127.0.0.1:13143</command>. The URL in the output is the broker&#39;s advertized address. Let&#39;s use the ID to shut the broker down using the <command>--stop</command> command:
+ </para>
+
+ <screen>$ ./qpid-cluster localhost:6664 --stop 127.0.0.1:13143
+ </screen>
+
+ </section>
+
+ <section id="sect-Messaging_User_Guide-High_Availability_Messaging_Clusters-Failover_in_Clients">
+ <title>Failover in Clients</title>
+ <para>
+ If a client is connected to a broker, the connection fails if the broker crashes or is killed. If heartbeat is enabled for the connection, a connection also fails if the broker hangs, the machine the broker is running on fails, or the network connection to the broker is lost — the connection fails no later than twice the heartbeat interval.
+ </para>
+ <para>
+ When a client&#39;s connection to a broker fails, any sent messages that have been acknowledged to the sender will have been replicated to all brokers in the cluster, any received messages that have not yet been acknowledged by the receiving client requeued to all brokers, and the client API notifies the application of the failure by throwing an exception.
+ </para>
+ <para>
+ Clients can be configured to automatically reconnect to another broker when it receives such an exception. Any messages that have been sent by the client, but not yet acknowledged as delivered, are resent. Any messages that have been read by the client, but not acknowledged, are delivered to the client.
+ </para>
+ <para>
+ TCP is slow to detect connection failures. A client can configure a connection to use a heartbeat to detect connection failure, and can specify a time interval for the heartbeat. If heartbeats are in use, failures will be detected no later than twice the heartbeat interval. The Java JMS client enables hearbeat by default. See the sections on Failover in Java JMS Clients and Failover in C++ Clients for the code to enable heartbeat.
+ </para>
+ <section id="sect-Messaging_User_Guide-Failover_in_Clients-Failover_in_Java_JMS_Clients">
+ <title>Failover in Java JMS Clients</title>
+ <para>
+ In Java JMS clients, client failover is handled automatically if it is enabled in the connection. Any messages that have been sent by the client, but not yet acknowledged as delivered, are resent. Any messages that have been read by the client, but not acknowledged, are sent to the client.
+ </para>
+ <para>
+ You can configure a connection to use failover using the <command>failover</command> property:
+ </para>
+
+ <screen>
+ connectionfactory.qpidConnectionfactory = amqp://guest:guest@clientid/test?brokerlist=&#39;tcp://localhost:5672&#39;&amp;failover=&#39;failover_exchange&#39;
+ </screen>
+ <para>
+ This property can take three values:
+ </para>
+ <variablelist id="vari-Messaging_User_Guide-Failover_in_Java_JMS_Clients-Failover_Modes">
+ <title>Failover Modes</title>
+ <varlistentry>
+ <term>failover_exchange</term>
+ <listitem>
+ <para>
+ If the connection fails, fail over to any other broker in the cluster.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term>roundrobin</term>
+ <listitem>
+ <para>
+ If the connection fails, fail over to one of the brokers specified in the <command>brokerlist</command>.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term>singlebroker</term>
+ <listitem>
+ <para>
+ Failover is not supported; the connection is to a single broker only.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+
+ </variablelist>
+ <para>
+ In a Connection URL, heartbeat is set using the <command>idle_timeout</command> property, which is an integer corresponding to the heartbeat period in seconds. For instance, the following line from a JNDI properties file sets the heartbeat time out to 3 seconds:
+ </para>
+
+ <screen>
+ connectionfactory.qpidConnectionfactory = amqp://guest:guest@clientid/test?brokerlist=&#39;tcp://localhost:5672&#39;,idle_timeout=3
+ </screen>
+
+ </section>
+
+ <section id="sect-Messaging_User_Guide-Failover_in_Clients-Failover_and_the_Qpid_Messaging_API">
+ <title>Failover and the Qpid Messaging API</title>
+ <para>
+ The Qpid Messaging API also supports automatic reconnection in the event a connection fails. . Senders can also be configured to replay any in-doubt messages (i.e. messages whice were sent but not acknowleged by the broker. See &#34;Connection Options&#34; and &#34;Sender Capacity and Replay&#34; in <citetitle>Programming in Apache Qpid</citetitle> for details.
+ </para>
+ <para>
+ In C++ and python clients, heartbeats are disabled by default. You can enable them by specifying a heartbeat interval (in seconds) for the connection via the &#39;heartbeat&#39; option.
+ </para>
+ <para>
+ See &#34;Cluster Failover&#34; in <citetitle>Programming in Apache Qpid</citetitle> for details on how to keep the client aware of cluster membership.
+ </para>
+
+ </section>
+
+
+ </section>
+
+ <section id="sect-Messaging_User_Guide-High_Availability_Messaging_Clusters-Error_handling_in_Clusters">
+ <title>Error handling in Clusters</title>
+ <para>
+ If a broker crashes or is killed, or a broker machine failure, broker connection failure, or a broker hang is detected, the other brokers in the cluster are notified that it is no longer a member of the cluster. If a new broker is joined to the cluster, it synchronizes with an active broker to obtain the current cluster state; if this synchronization fails, the new broker exit the cluster and aborts.
+ </para>
+ <para>
+ If a broker becomes extremely busy and stops responding, it stops accepting incoming work. All other brokers continue processing, and the non-responsive node caches all AIS traffic. When it resumes, the broker completes processes all cached AIS events, then accepts further incoming work. <!-- If a broker is non-responsive for too long, it is assumed to be hanging, and treated as described in the previous paragraph. -->
+ </para>
+ <para>
+ Broker hangs are only detected if the watchdog plugin is loaded and the <command>--watchdog-interval</command> option is set. The watchdog plug-in kills the qpidd broker process if it becomes stuck for longer than the watchdog interval. In some cases, e.g. certain phases of error resolution, it is possible for a stuck process to hang other cluster members that are waiting for it to send a message. Using the watchdog, the stuck process is terminated and removed from the cluster, allowing other members to continue and clients of the stuck process to fail over to other members.
+ </para>
+ <para>
+ Redundancy can also be achieved directly in the AIS network by specifying more than one network interface in the AIS configuration file. This causes Totem to use a redundant ring protocol, which makes failure of a single network transparent.
+ </para>
+ <para>
+ Redundancy can be achieved at the operating system level by using NIC bonding, which combines multiple network ports into a single group, effectively aggregating the bandwidth of multiple interfaces into a single connection. This provides both network load balancing and fault tolerance.
+ </para>
+ <para>
+ If any broker encounters an error, the brokers compare notes to see if they all received the same error. If not, the broker removes itself from the cluster and shuts itself down to ensure that all brokers in the cluster have consistent state. For instance, a broker may run out of disk space; if this happens, the broker shuts itself down. Examining the broker&#39;s log can help determine the error and suggest ways to prevent it from occuring in the future.
+ </para>
+ <!-- "Bad case" for cluster matrix - things we will fix, or things users may encounter long term? -->
+ </section>
+
+ <section id="sect-Messaging_User_Guide-High_Availability_Messaging_Clusters-Persistence_in_High_Availability_Message_Clusters">
+ <title>Persistence in High Availability Message Clusters</title>
+ <para>
+ Persistence and clustering are two different ways to provide reliability. Most systems that use a cluster do not enable persistence, but you can do so if you want to ensure that messages are not lost even if the last broker in a cluster fails. A cluster must have all transient or all persistent members, mixed clusters are not allowed. Each broker in a persistent cluster has it&#39;s own independent replica of the cluster&#39;s state it its store.
+ </para>
+ <section id="sect-Messaging_User_Guide-Persistence_in_High_Availability_Message_Clusters-Clean_and_Dirty_Stores">
+ <title>Clean and Dirty Stores</title>
+ <para>
+ When a broker is an active member of a cluster, its store is marked &#34;dirty&#34; because it may be out of date compared to other brokers in the cluster. If a broker leaves a running cluster because it is stopped, it crashes or the host crashes, its store continues to be marked &#34;dirty&#34;.
+ </para>
+ <para>
+ If the cluster is reduced to a single broker, its store is marked &#34;clean&#34; since it is the only broker making updates. If the cluster is shut down with the command <literal>qpid-cluster -k</literal> then all the stores are marked clean.
+ </para>
+ <para>
+ When a cluster is initially formed, brokers with clean stores read from their stores. Brokers with dirty stores, or brokers that join after the cluster is running, discard their old stores and initialize a new store with an update from one of the running brokers. The <command>--truncate</command> option can be used to force a broker to discard all existing stores even if they are clean. (A dirty store is discarded regardless.)
+ </para>
+ <para>
+ Discarded stores are copied to a back up directory. The active store is in &#60;data-dir&#62;/rhm. Back-up stores are in &#60;data-dir&#62;/_cluster.bak.&#60;nnnn&#62;/rhm, where &#60;nnnn&#62; is a 4 digit number. A higher number means a more recent backup.
+ </para>
+
+ </section>
+
+ <section id="sect-Messaging_User_Guide-Persistence_in_High_Availability_Message_Clusters-Starting_a_persistent_cluster">
+ <title>Starting a persistent cluster</title>
+ <para>
+ When starting a persistent cluster broker, set the cluster-size option to the number of brokers in the cluster. This allows the brokers to wait until the entire cluster is running so that they can synchronize their stored state.
+ </para>
+ <para>
+ The cluster can start if:
+ </para>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ all members have empty stores, or
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ at least one member has a clean store
+ </para>
+
+ </listitem>
+
+ </itemizedlist>
+
+ </para>
+ <para>
+ All members of the new cluster will be initialized with the state from a clean store.
+ </para>
+
+ </section>
+
+ <section id="sect-Messaging_User_Guide-Persistence_in_High_Availability_Message_Clusters-Stopping_a_persistent_cluster">
+ <title>Stopping a persistent cluster</title>
+ <para>
+ To cleanly shut down a persistent cluster use the command <command>qpid-cluster -k</command>. This causes all brokers to synchronize their state and mark their stores as &#34;clean&#34; so they can be used when the cluster restarts.
+ </para>
+
+ </section>
+
+ <section id="sect-Messaging_User_Guide-Persistence_in_High_Availability_Message_Clusters-Starting_a_persistent_cluster_with_no_clean_store">
+ <title>Starting a persistent cluster with no clean store</title>
+ <para>
+ If the cluster has previously had a total failure and there are no clean stores then the brokers will fail to start with the log message <literal>Cannot recover, no clean store.</literal> If this happens you can start the cluster by marking one of the stores &#34;clean&#34; as follows:
+ </para>
+ <procedure>
+ <step>
+ <para>
+ Move the latest store backup into place in the brokers data-directory. The backups end in a 4 digit number, the latest backup is the highest number.
+ </para>
+
+ <screen>
+ cd &#60;data-dir&#62;
+ mv rhm rhm.bak
+ cp -a _cluster.bak.&#60;nnnn&#62;/rhm .
+ </screen>
+
+ </step>
+ <step>
+ <para>
+ Mark the store as clean:
+ <screen>qpid-cluster-store -c &#60;data-dir&#62;</screen>
+
+ </para>
+
+ </step>
+
+ </procedure>
+
+ <para>
+ Now you can start the cluster, all members will be initialized from the store you marked as clean.
+ </para>
+
+ </section>
+
+ <section id="sect-Messaging_User_Guide-Persistence_in_High_Availability_Message_Clusters-Isolated_failures_in_a_persistent_cluster">
+ <title>Isolated failures in a persistent cluster</title>
+ <para>
+ A broker in a persistent cluster may encounter errors that other brokers in the cluster do not; if this happens, the broker shuts itself down to avoid making the cluster state inconsistent. For example a disk failure on one node will result in that node shutting down. Running out of storage capacity can also cause a node to shut down because because the brokers may not run out of storage at exactly the same point, even if they have similar storage configuration. To avoid unnecessary broker shutdowns, make sure the queue policy size of each durable queue is less than the capacity of the journal for the queue.
+ </para>
+
+ </section>
+
+
+ </section>
+
+
+</section>
diff --git a/doc/book/src/cpp-broker/Active-Passive-Cluster.xml b/doc/book/src/cpp-broker/Active-Passive-Cluster.xml
new file mode 100644
index 0000000000..5f5823bdd2
--- /dev/null
+++ b/doc/book/src/cpp-broker/Active-Passive-Cluster.xml
@@ -0,0 +1,661 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+h"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+
+-->
+
+<section id="chap-Messaging_User_Guide-Active_Passive_Cluster">
+
+ <title>Active-passive Messaging Clusters (Preview)</title>
+
+ <section>
+ <title>Overview</title>
+ <para>
+ This release provides a preview of a new module for High Availability (HA). The new module is
+ not yet complete or ready for production use. It being made available so that users can
+ experiment with the new approach and provide feedback early in the development process.
+ Feedback should go to <ulink url="mailto:user@qpid.apache.org">dev@qpid.apache.org</ulink>.
+ </para>
+ <para>
+ The old cluster module takes an <firstterm>active-active</firstterm> approach, i.e. all the
+ brokers in a cluster are able to handle client requests simultaneously. The new HA module
+ takes an <firstterm>active-passive</firstterm>, <firstterm>hot-standby</firstterm> approach.
+ </para>
+ <para>
+ In an active-passive cluster only one broker, known as the <firstterm>primary</firstterm>, is
+ active and serving clients at a time. The other brokers are standing by as
+ <firstterm>backups</firstterm>. Changes on the primary are immediately replicated to all the
+ backups so they are always up-to-date or "hot". If the primary fails, one of the backups is
+ promoted to take over as the new primary. Clients fail-over to the new primary
+ automatically. If there are multiple backups, the backups also fail-over to become backups of
+ the new primary. Backup brokers reject connection attempts, to enforce the requirement that
+ only the primary be active.
+ </para>
+ <para>
+ This approach depends on an external <firstterm>cluster resource manager</firstterm> to detect
+ failures and choose the primary. <ulink
+ url="https://fedorahosted.org/cluster/wiki/RGManager">Rgmanager</ulink> is supported
+ initially, but others may be supported in the future.
+ </para>
+ <section>
+ <title>Why the new approach?</title>
+ <para>
+ The new active-passive approach has several advantages compared to the
+ existing active-active cluster module.
+ <itemizedlist>
+ <listitem>
+ It does not depend directly on openais or corosync. It does not use multicast
+ which simplifies deployment.
+ </listitem>
+ <listitem>
+ It is more portable: in environments that don't support corosync, it can be
+ integrated with a resource manager available in that environment.
+ </listitem>
+ <listitem>
+ Replication to a <firstterm>disaster recovery</firstterm> site can be handled as
+ simply another node in the cluster, it does not require a separate replication
+ mechanism.
+ </listitem>
+ <listitem>
+ It can take advantage of features provided by the resource manager, for example
+ virtual IP addresses.
+ </listitem>
+ <listitem>
+ Improved performance and scalability due to better use of multiple CPU s
+ </listitem>
+ </itemizedlist>
+ </para>
+ </section>
+ <section>
+ <title>Limitations</title>
+
+ <para>
+ There are a number of known limitations in the current preview implementation. These
+ will be fixed in the production versions.
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ Transactional changes to queue state are not replicated atomically. If the primary crashes
+ during a transaction, it is possible that the backup could contain only part of the
+ changes introduced by a transaction.
+ </listitem>
+ <listitem>
+ During a fail-over one backup is promoted to primary and any other backups switch to
+ the new primary. Messages sent to the new primary before all the backups have
+ switched could be lost if the new primary itself fails before all the backups have
+ switched.
+ </listitem>
+ <listitem>
+ Acknowledgments are confirmed to clients before the message has been dequeued
+ from replicas or indeed from the local store if that is asynchronous.
+ </listitem>
+ <listitem>
+ When used with a persistent store: if the entire cluster fails, there are no tools to help
+ identify the most recent store.
+ </listitem>
+ <listitem>
+ A persistent broker must have its store erased before joining an existing cluster.
+ In the production version a persistent broker will be able to load its store and
+ avoid downloading messages that are in the store from the primary.
+ </listitem>
+ <listitem>
+ Configuration changes (creating or deleting queues, exchanges and bindings) are
+ replicated asynchronously. Management tools used to make changes will consider the
+ change complete when it is complete on the primary, it may not yet be replicated
+ to all the backups.
+ </listitem>
+ <listitem>
+ Deletions made immediately after a failure (before all the backups are ready) may
+ be lost on a backup. Queues, exchange or bindings that were deleted on the primary could
+ re-appear if that backup is promoted to primary on a subsequent failure.
+ </listitem>
+ <listitem>
+ Better control is needed over which queues/exchanges are replicated and which are not.
+ </listitem>
+ <listitem>
+ There are some known issues affecting performance, both the throughput of
+ replication and the time taken for backups to fail-over. Performance will improve
+ in the production version.
+ </listitem>
+ <listitem>
+ Federated links from the primary will be lost in fail over, they will not be
+ re-connected on the new primary. Federation links to the primary can fail over.
+ </listitem>
+ <listitem>
+ Only plain FIFO queues can be replicated. LVQ and ring queues are not yet supported.
+ </listitem>
+ </itemizedlist>
+ </section>
+ </section>
+
+ <section>
+ <title>Virtual IP Addresses</title>
+ <para>
+ Some resource managers (including <command>rgmanager</command>) support
+ <firstterm>virtual IP addresses</firstterm>. A virtual IP address is an IP
+ address that can be relocated to any of the nodes in a cluster. The
+ resource manager associates this address with the primary node in the
+ cluster, and relocates it to the new primary when there is a failure. This
+ simplifies configuration as you can publish a single IP address rather
+ than a list.
+ </para>
+ <para>
+ A virtual IP address can be used by clients and backup brokers to connect
+ to the primary. The following sections will explain how to configure
+ virtual IP addresses for clients or brokers.
+ </para>
+ </section>
+
+ <section>
+ <title>Configuring the Brokers</title>
+ <para>
+ The broker must load the <filename>ha</filename> module, it is loaded by
+ default. The following broker options are available for the HA module.
+ </para>
+ <table frame="all" id="ha-broker-options">
+ <title>Options for High Availability Messaging Cluster</title>
+ <tgroup align="left" cols="2" colsep="1" rowsep="1">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="3*"/>
+ <thead>
+ <row>
+ <entry align="center" nameend="c2" namest="c1">
+ Options for High Availability Messaging Cluster
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <literal>--ha-cluster <replaceable>yes|no</replaceable></literal>
+ </entry>
+ <entry>
+ Set to "yes" to have the broker join a cluster.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>--ha-brokers <replaceable>URL</replaceable></literal>
+ </entry>
+ <entry>
+ <para>
+ The URL
+ <footnote>
+ <para>
+ The full format of the URL is given by this grammar:
+ <programlisting>
+ url = ["amqp:"][ user ["/" password] "@" ] addr ("," addr)*
+ addr = tcp_addr / rmda_addr / ssl_addr / ...
+ tcp_addr = ["tcp:"] host [":" port]
+ rdma_addr = "rdma:" host [":" port]
+ ssl_addr = "ssl:" host [":" port]'
+ </programlisting>
+ </para>
+ </footnote>
+ used by brokers to connect to each other. If you use a virtual IP address
+ then this is a single address, for example
+ <literal>amqp:20.0.20.200</literal>. If you do not use a virtual IP
+ address then the URL must list all the addresses of brokers in the
+ cluster, for example <literal>amqp:node1,node2,node3</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry><literal>--ha-public-brokers <replaceable>URL</replaceable></literal> </entry>
+ <entry>
+ <para>
+ The URL used by clients to connect to the brokers. This has the same
+ format as the <literal>--ha-brokers</literal> URL above.
+ </para>
+ <para>
+ If this option is not set, clients will use the same URL as brokers.
+ This option allows you to put client traffic on a different network from
+ broker traffic, which is recommended.
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry><literal>--ha-replicate</literal></entry>
+ <foo/>
+ <entry>
+ <para>
+ Specifies whether queues and exchanges are replicated by default.
+ For details see <xref linkend="creating-replicated"/>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><literal>--ha-username <replaceable>USER</replaceable></literal></para>
+ <para><literal>--ha-password <replaceable>PASS</replaceable></literal></para>
+ <para><literal>--ha-mechanism <replaceable>MECH</replaceable></literal></para>
+ </entry>
+ <entry>
+ Authentication settings used by brokers to connect to each other.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>
+ To configure a HA cluster you must set at least <literal>ha-cluster</literal> and
+ <literal>ha-brokers</literal>.
+ </para>
+ </section>
+
+ <section>
+ <title>The Cluster Resource Manager</title>
+ <para>
+ Broker fail-over is managed by a <firstterm>cluster resource
+ manager</firstterm>. An integration with <ulink
+ url="https://fedorahosted.org/cluster/wiki/RGManager">rgmanager</ulink> is
+ provided, but it is possible to integrate with other resource managers.
+ </para>
+ <para>
+ The resource manager is responsible for starting the <command>qpidd</command> broker
+ on each node in the cluster. The resource manager <firstterm>promotes</firstterm>
+ one of the brokers to be the primary. The other brokers connect to the primary as
+ backups, using the URL provided in the <literal>ha-brokers</literal> configuration
+ option.
+ </para>
+ <para>
+ Once connected, the backup brokers synchronize their state with the
+ primary. When a backup is synchronized, or "hot", it is ready to take
+ over if the primary fails. Backup brokers continually receive updates
+ from the primary in order to stay synchronized.
+ </para>
+ <para>
+ If the primary fails, backup brokers go into fail-over mode. The resource
+ manager must detect the failure and promote one of the backups to be the
+ new primary. The other backups connect to the new primary and synchronize
+ their state with it.
+ </para>
+ <para>
+ The resource manager is also responsible for protecting the cluster from
+ <firstterm>split-brain</firstterm> conditions resulting from a network partition. A
+ network partition divide a cluster into two sub-groups which cannot see each other.
+ Usually a <firstterm>quorum</firstterm> voting algorithm is used that disables nodes
+ in the inquorate sub-group.
+ </para>
+ </section>
+
+ <section>
+ <title>Configuring <command>rgmanager</command> as resource manager</title>
+ <para>
+ This section assumes that you are already familiar with setting up and configuring
+ clustered services using <command>cman</command> and
+ <command>rgmanager</command>. It will show you how to configure an active-passive,
+ hot-standby <command>qpidd</command> HA cluster with <command>rgmanager</command>.
+ </para>
+ <para>
+ You must provide a <literal>cluster.conf</literal> file to configure
+ <command>cman</command> and <command>rgmanager</command>. Here is
+ an example <literal>cluster.conf</literal> file for a cluster of 3 nodes named
+ node1, node2 and node3. We will go through the configuration step-by-step.
+ </para>
+ <programlisting>
+ <![CDATA[
+<?xml version="1.0"?>
+<!--
+This is an example of a cluster.conf file to run qpidd HA under rgmanager.
+This example assumes a 3 node cluster, with nodes named node1, node2 and node3.
+
+NOTE: fencing is not shown, you must configure fencing appropriately for your cluster.
+-->
+
+<cluster name="qpid-test" config_version="18">
+ <!-- The cluster has 3 nodes. Each has a unique nodid and one vote
+ for quorum. -->
+ <clusternodes>
+ <clusternode name="node1.example.com" nodeid="1"/>
+ <clusternode name="node2.example.com" nodeid="2"/>
+ <clusternode name="node3.example.com" nodeid="3"/>
+ </clusternodes>
+ <!-- Resouce Manager configuration. -->
+ <rm>
+ <!--
+ There is a failoverdomain for each node containing just that node.
+ This lets us stipulate that the qpidd service should always run on each node.
+ -->
+ <failoverdomains>
+ <failoverdomain name="node1-domain" restricted="1">
+ <failoverdomainnode name="node1.example.com"/>
+ </failoverdomain>
+ <failoverdomain name="node2-domain" restricted="1">
+ <failoverdomainnode name="node2.example.com"/>
+ </failoverdomain>
+ <failoverdomain name="node3-domain" restricted="1">
+ <failoverdomainnode name="node3.example.com"/>
+ </failoverdomain>
+ </failoverdomains>
+
+ <resources>
+ <!-- This script starts a qpidd broker acting as a backup. -->
+ <script file="/etc/init.d/qpidd" name="qpidd"/>
+
+ <!-- This script promotes the qpidd broker on this node to primary. -->
+ <script file="/etc/init.d/qpidd-primary" name="qpidd-primary"/>
+
+ <!-- This is a virtual IP address for broker replication traffic. -->
+ <ip address="20.0.10.200" monitor_link="1"/>
+
+ <!-- This is a virtual IP address on a seprate network for client traffic. -->
+ <ip address="20.0.20.200" monitor_link="1"/>
+ </resources>
+
+ <!-- There is a qpidd service on each node, it should be restarted if it fails. -->
+ <service name="node1-qpidd-service" domain="node1-domain" recovery="restart">
+ <script ref="qpidd"/>
+ </service>
+ <service name="node2-qpidd-service" domain="node2-domain" recovery="restart">
+ <script ref="qpidd"/>
+ </service>
+ <service name="node3-qpidd-service" domain="node3-domain" recovery="restart">
+ <script ref="qpidd"/>
+ </service>
+
+ <!-- There should always be a single qpidd-primary service, it can run on any node. -->
+ <service name="qpidd-primary-service" autostart="1" exclusive="0" recovery="relocate">
+ <script ref="qpidd-primary"/>
+ <!-- The primary has the IP addresses for brokers and clients to connect. -->
+ <ip ref="20.0.10.200"/>
+ <ip ref="20.0.20.200"/>
+ </service>
+ </rm>
+</cluster>
+ ]]>
+ </programlisting>
+
+ <para>
+ There is a <literal>failoverdomain</literal> for each node containing just that
+ one node. This lets us stipulate that the qpidd service should always run on all
+ nodes.
+ </para>
+ <para>
+ The <literal>resources</literal> section defines the <command>qpidd</command>
+ script used to start the <command>qpidd</command> service. It also defines the
+ <command>qpid-primary</command> script which does not
+ actually start a new service, rather it promotes the existing
+ <command>qpidd</command> broker to primary status.
+ </para>
+ <para>
+ The <literal>resources</literal> section also defines a pair of virtual IP
+ addresses on different sub-nets. One will be used for broker-to-broker
+ communication, the other for client-to-broker.
+ </para>
+ <para>
+ To take advantage of the virtual IP addresses, <filename>qpidd.conf</filename>
+ should contain these lines:
+ </para>
+ <programlisting>
+ ha-cluster=yes
+ ha-brokers=20.0.20.200
+ ha-public-brokers=20.0.10.200
+ </programlisting>
+ <para>
+ This configuration specifies that backup brokers will use 20.0.20.200
+ to connect to the primary and will advertise 20.0.10.200 to clients.
+ Clients should connect to 20.0.10.200.
+ </para>
+ <para>
+ The <literal>service</literal> section defines 3 <literal>qpidd</literal>
+ services, one for each node. Each service is in a restricted fail-over
+ domain containing just that node, and has the <literal>restart</literal>
+ recovery policy. The effect of this is that rgmanager will run
+ <command>qpidd</command> on each node, restarting if it fails.
+ </para>
+ <para>
+ There is a single <literal>qpidd-primary-service</literal> using the
+ <command>qpidd-primary</command> script which is not restricted to a
+ domain and has the <literal>relocate</literal> recovery policy. This means
+ rgmanager will start <command>qpidd-primary</command> on one of the nodes
+ when the cluster starts and will relocate it to another node if the
+ original node fails. Running the <literal>qpidd-primary</literal> script
+ does not start a new broker process, it promotes the existing broker to
+ become the primary.
+ </para>
+ </section>
+
+ <section>
+ <title>Broker Administration Tools</title>
+ <para>
+ Normally, clients are not allowed to connect to a backup broker. However management tools are
+ allowed to connect to a backup brokers. If you use these tools you <emphasis>must
+ not</emphasis> add or remove messages from replicated queues, or delete replicated queues or
+ exchanges as this will corrupt the replication process and may cause message loss.
+ </para>
+ <para>
+ <command>qpid-ha</command> allows you to view and change HA configuration settings.
+ </para>
+ <para>
+ The tools <command>qpid-config</command>, <command>qpid-route</command> and
+ <command>qpid-stat</command> will connect to a backup if you pass the flag <command>--ha-admin</command> on the
+ command line.
+ </para>
+ </section>
+
+ <section id="ha-creating-replicated">
+ <title>Creating replicated queues and exchanges</title>
+ <para>
+ By default, queues and exchanges are not replicated automatically. You can change
+ the default behavior by setting the <literal>ha-replicate</literal> configuration
+ option. It has one of the following values:
+ <itemizedlist>
+ <listitem>
+ <firstterm>all</firstterm>: Replicate everything automatically: queues, exchanges, bindings and messages.
+ </listitem>
+ <listitem>
+ <firstterm>configuration</firstterm>: Replicate the existence of queues,
+ exchange and bindings but don't replicate messages.
+ </listitem>
+ <listitem>
+ <firstterm>none</firstterm>: Don't replicate anything, this is the default.
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ You can over-ride the default for a particular queue or exchange by passing the
+ argument <literal>qpid.replicate</literal> when creating the queue or exchange. It
+ takes the same values as <literal>ha-replicate</literal>
+ </para>
+ <para>
+ Bindings are automatically replicated if the queue and exchange being bound both
+ have replication <literal>all</literal> or <literal>configuration</literal>, they
+ are not replicated otherwise.
+ </para>
+ <para>
+ You can create replicated queues and exchanges with the
+ <command>qpid-config</command> management tool like this:
+ </para>
+ <programlisting>
+ qpid-config add queue myqueue --replicate all
+ </programlisting>
+ <para>
+ To create replicated queues and exchanges via the client API, add a
+ <literal>node</literal> entry to the address like this:
+ </para>
+ <programlisting>
+ "myqueue;{create:always,node:{x-declare:{arguments:{'qpid.replicate':all}}}}"
+ </programlisting>
+ </section>
+
+ <section>
+ <title>Client Connection and Fail-over</title>
+ <para>
+ Clients can only connect to the primary broker. Backup brokers
+ automatically reject any connection attempt by a client.
+ </para>
+ <para>
+ Clients are configured with the URL for the cluster (details below for
+ each type of client). There are two possibilities
+ <itemizedlist>
+ <listitem>
+ The URL contains multiple addresses, one for each broker in the cluster.
+ </listitem>
+ <listitem>
+ The URL contains a single <firstterm>virtual IP address</firstterm>
+ that is assigned to the primary broker by the resource manager.
+ <footnote><para>Only if the resource manager supports virtual IP addresses</para></footnote>
+ </listitem>
+ </itemizedlist>
+ In the first case, clients will repeatedly re-try each address in the URL
+ until they successfully connect to the primary. In the second case the
+ resource manager will assign the virtual IP address to the primary broker,
+ so clients only need to re-try on a single address.
+ </para>
+ <para>
+ When the primary broker fails, clients re-try all known cluster addresses
+ until they connect to the new primary. The client re-sends any messages
+ that were previously sent but not acknowledged by the broker at the time
+ of the failure. Similarly messages that have been sent by the broker, but
+ not acknowledged by the client, are re-queued.
+ </para>
+ <para>
+ TCP can be slow to detect connection failures. A client can configure a
+ connection to use a <firstterm>heartbeat</firstterm> to detect connection
+ failure, and can specify a time interval for the heartbeat. If heartbeats
+ are in use, failures will be detected no later than twice the heartbeat
+ interval. The following sections explain how to enable heartbeat in each
+ client.
+ </para>
+ <para>
+ See &#34;Cluster Failover&#34; in <citetitle>Programming in Apache
+ Qpid</citetitle> for details on how to keep the client aware of cluster
+ membership.
+ </para>
+ <para>
+ Suppose your cluster has 3 nodes: <literal>node1</literal>, <literal>node2</literal>
+ and <literal>node3</literal> all using the default AMQP port. To connect a client you
+ need to specify the address(es) and set the <literal>reconnect</literal> property to
+ <literal>true</literal>. Here's how to connect each type of client:
+ </para>
+ <section>
+ <title>C++ clients</title>
+ <para>
+ With the C++ client, you specify multiple cluster addresses in a single URL
+ <footnote>
+ <para>
+ The full grammar for the URL is:
+ </para>
+ <programlisting>
+ url = ["amqp:"][ user ["/" password] "@" ] addr ("," addr)*
+ addr = tcp_addr / rmda_addr / ssl_addr / ...
+ tcp_addr = ["tcp:"] host [":" port]
+ rdma_addr = "rdma:" host [":" port]
+ ssl_addr = "ssl:" host [":" port]'
+ </programlisting>
+ </footnote>
+ You also need to specify the connection option
+ <literal>reconnect</literal> to be true. For example:
+ </para>
+ <programlisting>
+ qpid::messaging::Connection c("node1,node2,node3","{reconnect:true}");
+ </programlisting>
+ <para>
+ Heartbeats are disabled by default. You can enable them by specifying a
+ heartbeat interval (in seconds) for the connection via the
+ <literal>heartbeat</literal> option. For example:
+ <programlisting>
+ qpid::messaging::Connection c("node1,node2,node3","{reconnect:true,heartbeat:10}");
+ </programlisting>
+ </para>
+ </section>
+ <section>
+ <title>Python clients</title>
+ <para>
+ With the python client, you specify <literal>reconnect=True</literal>
+ and a list of <replaceable>host:port</replaceable> addresses as
+ <literal>reconnect_urls</literal> when calling
+ <literal>Connection.establish</literal> or
+ <literal>Connection.open</literal>
+ </para>
+ <programlisting>
+ connection = qpid.messaging.Connection.establish("node1", reconnect=True, reconnect_urls=["node1", "node2", "node3"])
+ </programlisting>
+ <para>
+ Heartbeats are disabled by default. You can
+ enable them by specifying a heartbeat interval (in seconds) for the
+ connection via the &#39;heartbeat&#39; option. For example:
+ </para>
+ <programlisting>
+ connection = qpid.messaging.Connection.establish("node1", reconnect=True, reconnect_urls=["node1", "node2", "node3"], heartbeat=10)
+ </programlisting>
+ </section>
+ <section>
+ <title>Java JMS Clients</title>
+ <para>
+ In Java JMS clients, client fail-over is handled automatically if it is
+ enabled in the connection. You can configure a connection to use
+ fail-over using the <command>failover</command> property:
+ </para>
+
+ <screen>
+ connectionfactory.qpidConnectionfactory = amqp://guest:guest@clientid/test?brokerlist=&#39;tcp://localhost:5672&#39;&amp;failover=&#39;failover_exchange&#39;
+ </screen>
+ <para>
+ This property can take three values:
+ </para>
+ <variablelist>
+ <title>Fail-over Modes</title>
+ <varlistentry>
+ <term>failover_exchange</term>
+ <listitem>
+ <para>
+ If the connection fails, fail over to any other broker in the cluster.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term>roundrobin</term>
+ <listitem>
+ <para>
+ If the connection fails, fail over to one of the brokers specified in the <command>brokerlist</command>.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term>singlebroker</term>
+ <listitem>
+ <para>
+ Fail-over is not supported; the connection is to a single broker only.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+
+ </variablelist>
+ <para>
+ In a Connection URL, heartbeat is set using the <command>idle_timeout</command> property, which is an integer corresponding to the heartbeat period in seconds. For instance, the following line from a JNDI properties file sets the heartbeat time out to 3 seconds:
+ </para>
+
+ <screen>
+ connectionfactory.qpidConnectionfactory = amqp://guest:guest@clientid/test?brokerlist=&#39;tcp://localhost:5672&#39;,idle_timeout=3
+ </screen>
+ </section>
+ </section>
+</section>
+
+<!-- LocalWords: scalability rgmanager multicast RGManager mailto LVQ qpidd IP dequeued Transactional username
+-->
diff --git a/doc/book/src/Cheat-Sheet-for-configuring-Exchange-Options.xml b/doc/book/src/cpp-broker/Cheat-Sheet-for-configuring-Exchange-Options.xml
index fccdae1b9a..fccdae1b9a 100644
--- a/doc/book/src/Cheat-Sheet-for-configuring-Exchange-Options.xml
+++ b/doc/book/src/cpp-broker/Cheat-Sheet-for-configuring-Exchange-Options.xml
diff --git a/doc/book/src/Cheat-Sheet-for-configuring-Queue-Options.xml b/doc/book/src/cpp-broker/Cheat-Sheet-for-configuring-Queue-Options.xml
index d50948e0cc..d50948e0cc 100644
--- a/doc/book/src/Cheat-Sheet-for-configuring-Queue-Options.xml
+++ b/doc/book/src/cpp-broker/Cheat-Sheet-for-configuring-Queue-Options.xml
diff --git a/doc/book/src/cpp-broker/HA-Queue-Replication.xml b/doc/book/src/cpp-broker/HA-Queue-Replication.xml
new file mode 100644
index 0000000000..b7c533e4cb
--- /dev/null
+++ b/doc/book/src/cpp-broker/HA-Queue-Replication.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+
+-->
+
+<section>
+ <title>Queue Replication with the HA module</title>
+ <para>
+ As well as support for an active-passive cluster, the <filename>ha</filename> module
+ also allows you to replicate individual queues. The <firstterm>original</firstterm>
+ queue is used as normal. The <firstterm>replica</firstterm> queue is updated
+ automatically as messages are added to or removed from the original queue.
+ </para>
+ <para>
+ To create a replica you need the HA module to be loaded on both the orignal and replica
+ brokers. Note that it is not safe to modify the replica queue other than via the
+ automatic updates from the original. Adding or removing messages on the replica queue
+ will make replication inconsistent and may cause message loss. The HA module does
+ <emphasis>not</emphasis> enforce restricted access to the replica queue (as it does in
+ the case of a cluster) so it is up to the application to ensure the replca is not used
+ until it has been disconnected from the original.
+ </para>
+ <para>
+ Suppose that <command>myqueue</command> is a queue on <command>node1</command> and
+ we want to create a replica of <command>myqueue</command> on <command>node2</command>
+ (where both brokers are using the default AMQP port.) This is accomplished by the command:
+ <programlisting>
+ qpid-config --broker=node2 add queue --start-replica node1 myqueue
+ </programlisting>
+ </para>
+ <para>
+ If <command>myqueue</command> already exists on the replica broker you can start replication from the original queue like this:
+ <programlisting>
+ qpid-ha replicate -b node2 node1 myqueue
+ </programlisting>
+ </para>
+</section>
diff --git a/doc/book/src/cpp-broker/LVQ.xml b/doc/book/src/cpp-broker/LVQ.xml
new file mode 100644
index 0000000000..b57c6268be
--- /dev/null
+++ b/doc/book/src/cpp-broker/LVQ.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+<section>
+ <title>LVQ - Last Value Queue</title>
+
+ <section role="h2" id="LVQ-UnderstandingLVQ">
+ <title>Understanding LVQ</title>
+ <para>
+ A Last Value Queue is configured with the name of a message header that
+ is used as a key. The queue behaves as a normal FIFO queue with the
+ exception that when a message is enqueued, any other message in the
+ queue with the same value in the key header is removed and discarded.
+ Thus, for any given key value, the queue holds only the most recent
+ message.
+ </para>
+ <para>
+ The following example illustrates the operation of a Last Value Queue.
+ The example shows an empty queue with no consumers and a sequence of
+ produced messages. The numbers represent the key for each message.
+ </para>
+ <programlisting>
+ &lt;empty queue&gt;
+ 1 =>
+ 1
+ 2 =>
+ 1 2
+ 3 =>
+ 1 2 3
+ 4 =>
+ 1 2 3 4
+ 2 =>
+ 1 3 4 2
+ 1 =>
+ 3 4 2 1
+ </programlisting>
+ <para>
+ Note that the first four messages are enqueued normally in FIFO order.
+ The fifth message has key '2' and is also enqueued on the tail of the
+ queue. However the message already in the queue with the same key is
+ discarded.
+ <note>
+ <para>
+ If the set of keys used in the messages in a LVQ is constrained, the
+ number of messages in the queue shall not exceed the number of
+ distinct keys in use.
+ </para>
+ </note>
+ </para>
+ <section role="h3" id="LVQ-UnderstandingLVQ-UseCases">
+ <title>Common Use-Cases</title>
+ <itemizedlist>
+ <listitem>
+ <para>
+ LVQ with zero or one consuming subscriptions - In this case, if
+ the consumer drops momentarily or is slower than the producer(s),
+ it will only receive current information relative to the message
+ keys.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ LVQ with zero or more browsing subscriptions - A browsing consumer
+ can subscribe to the LVQ and get an immediate dump of all of the
+ "current" messages and track updates thereafter. Any number of
+ independent browsers can subscribe to the same LVQ with the same
+ effect. Since messages are never consumed, they only disappear
+ when replaced with a newer message with the same key or when their
+ TTL expires.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ </section>
+
+ <section role="h2" id="LVQ-Creating">
+ <title>Creating a Last Value Queue</title>
+ <section role="h3" id="LVQ-Creating-Address">
+ <title>Using Addressing Syntax</title>
+ <para>
+ A LVQ may be created using directives in the API's address syntax.
+ The important argument is "qpid.last_value_queue_key". The following
+ Python example shows how a producer of stock price updates can create
+ a LVQ to hold the latest stock prices for each ticker symbol. The
+ message header used to hold the ticker symbol is called "ticker".
+ </para>
+ <programlisting>
+ conn = Connection(url)
+ conn.open()
+ sess = conn.session()
+ tx = sess.sender("prices;{create:always, node:{type:queue, x-declare:{arguments:{'qpid.last_value_queue_key':'ticker'}}}}")
+ </programlisting>
+ </section>
+ <section role="h3" id="LVQ-Creating-Tool">
+ <title>Using qpid-config</title>
+ <para>
+ The same LVQ as shown in the previous example can be created using the
+ qpid-config utility:
+ </para>
+ <programlisting>
+ $ qpid-config add queue prices --lvq-key ticker
+ </programlisting>
+ </section>
+ </section>
+
+ <section role="h2" id="LVQ-Example">
+ <title>LVQ Example</title>
+
+ <section role="h3" id="LVQ-Example-Sender">
+ <title>LVQ Sender</title>
+ <programlisting>
+ from qpid.messaging import Connection, Message
+
+ def send(sender, key, message):
+ message.properties["ticker"] = key
+ sender.send(message)
+
+ conn = Connection("localhost")
+ conn.open()
+ sess = conn.session()
+ tx = sess.sender("prices;{create:always, node:{type:queue,x-declare:{arguments:{'qpid.last_value_queue_key':ticker}}}}")
+
+ msg = Message("Content")
+ send(tx, "key1", msg);
+ send(tx, "key2", msg);
+ send(tx, "key3", msg);
+ send(tx, "key4", msg);
+ send(tx, "key2", msg);
+ send(tx, "key1", msg);
+
+ conn.close()
+ </programlisting>
+ </section>
+
+ <section role="h3" id="LVQ-Example-Receiver">
+ <title>LVQ Browsing Receiver</title>
+ <programlisting>
+ from qpid.messaging import Connection, Message
+
+ conn = Connection("localhost")
+ conn.open()
+ sess = conn.session()
+ rx = sess.receiver("prices;{mode:browse}")
+
+ while True:
+ msg = rx.fetch()
+ sess.acknowledge()
+ print msg
+ </programlisting>
+ </section>
+ </section>
+
+ <section role="h2" id="LVQ-Deprecated">
+ <title>Deprecated LVQ Modes</title>
+ <para>
+ There are two legacy modes (still implemented as of Qpid 0.14)
+ controlled by the qpid.last_value_queue and
+ qpid.last_value_queue_no_browse argument values. These modes are
+ deprecated and should not be used.
+ </para>
+ </section>
+</section>
diff --git a/doc/book/src/cpp-broker/Makefile b/doc/book/src/cpp-broker/Makefile
new file mode 100644
index 0000000000..0266a0f54d
--- /dev/null
+++ b/doc/book/src/cpp-broker/Makefile
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+include ../Makefile.inc
diff --git a/doc/book/src/cpp-broker/Managing-CPP-Broker.xml b/doc/book/src/cpp-broker/Managing-CPP-Broker.xml
new file mode 100644
index 0000000000..d2abea4296
--- /dev/null
+++ b/doc/book/src/cpp-broker/Managing-CPP-Broker.xml
@@ -0,0 +1,485 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+<section id="section-Managing-CPP-Broker">
+ <title> Managing the C++ Broker </title>
+ <para>
+ There are quite a few ways to interact with the C++ broker. The
+ command line tools
+ include:
+ </para><itemizedlist>
+ <listitem><para>qpid-route - used to configure federation (a set of federated
+ brokers)
+ </para></listitem>
+ <listitem><para>qpid-config - used to configure queues, exchanges, bindings
+ and list them etc
+ </para></listitem>
+ <listitem><para>qpid-tool - used to view management information/statistics
+ and call any management actions on the broker
+ </para></listitem>
+ <listitem><para>qpid-printevents - used to receive and print QMF events
+ </para></listitem>
+ <listitem><para>qpid-ha - used to interact with the High Availability module
+ </para></listitem>
+ </itemizedlist>
+
+ <section role="h3" id="MgmtC-2B-2B-Usingqpidconfig"><title>
+ Using qpid-config
+ </title>
+ <para>
+ This utility can be used to create queues exchanges and bindings,
+ both durable and transient. Always check for latest options by
+ running --help command.
+ </para>
+ <programlisting>
+$ qpid-config --help
+Usage: qpid-config [OPTIONS]
+ qpid-config [OPTIONS] exchanges [filter-string]
+ qpid-config [OPTIONS] queues [filter-string]
+ qpid-config [OPTIONS] add exchange &lt;type&gt; &lt;name&gt; [AddExchangeOptions]
+ qpid-config [OPTIONS] del exchange &lt;name&gt;
+ qpid-config [OPTIONS] add queue &lt;name&gt; [AddQueueOptions]
+ qpid-config [OPTIONS] del queue &lt;name&gt;
+ qpid-config [OPTIONS] bind &lt;exchange-name&gt; &lt;queue-name&gt; [binding-key]
+ qpid-config [OPTIONS] unbind &lt;exchange-name&gt; &lt;queue-name&gt; [binding-key]
+
+Options:
+ -b [ --bindings ] Show bindings in queue or exchange list
+ -a [ --broker-addr ] Address (localhost) Address of qpidd broker
+ broker-addr is in the form: [username/password@] hostname | ip-address [:&lt;port&gt;]
+ ex: localhost, 10.1.1.7:10000, broker-host:10000, guest/guest@localhost
+
+Add Queue Options:
+ --durable Queue is durable
+ --cluster-durable Queue becomes durable if there is only one functioning cluster node
+ --file-count N (8) Number of files in queue's persistence journal
+ --file-size N (24) File size in pages (64Kib/page)
+ --max-queue-size N Maximum in-memory queue size as bytes
+ --max-queue-count N Maximum in-memory queue size as a number of messages
+ --limit-policy [none | reject | flow-to-disk | ring | ring-strict]
+ Action taken when queue limit is reached:
+ none (default) - Use broker's default policy
+ reject - Reject enqueued messages
+ flow-to-disk - Page messages to disk
+ ring - Replace oldest unacquired message with new
+ ring-strict - Replace oldest message, reject if oldest is acquired
+ --order [fifo | lvq | lvq-no-browse]
+ Set queue ordering policy:
+ fifo (default) - First in, first out
+ lvq - Last Value Queue ordering, allows queue browsing
+ lvq-no-browse - Last Value Queue ordering, browsing clients may lose data
+ --generate-queue-events N
+ If set to 1, every enqueue will generate an event that can be processed by
+ registered listeners (e.g. for replication). If set to 2, events will be
+ generated for enqueues and dequeues
+
+Add Exchange Options:
+ --durable Exchange is durable
+ --sequence Exchange will insert a 'qpid.msg_sequence' field in the message header
+ with a value that increments for each message forwarded.
+ --ive Exchange will behave as an 'initial-value-exchange', keeping a reference
+ to the last message forwarded and enqueuing that message to newly bound
+ queues.
+</programlisting>
+ <para>
+ Get the summary page
+ </para>
+ <programlisting>
+$ qpid-config
+Total Exchanges: 6
+ topic: 2
+ headers: 1
+ fanout: 1
+ direct: 2
+ Total Queues: 7
+ durable: 0
+ non-durable: 7
+</programlisting>
+ <para>
+ List the queues
+ </para>
+ <programlisting>
+$ qpid-config queues
+Queue Name Attributes
+=================================================================
+pub_start
+pub_done
+sub_ready
+sub_done
+perftest0 --durable
+reply-dhcp-100-18-254.bos.redhat.com.20713 auto-del excl
+topic-dhcp-100-18-254.bos.redhat.com.20713 auto-del excl
+
+</programlisting>
+ <para>
+ List the exchanges with bindings
+ </para>
+ <programlisting>
+$ ./qpid-config -b exchanges
+Exchange '' (direct)
+ bind pub_start =&gt; pub_start
+ bind pub_done =&gt; pub_done
+ bind sub_ready =&gt; sub_ready
+ bind sub_done =&gt; sub_done
+ bind perftest0 =&gt; perftest0
+ bind mgmt-3206ff16-fb29-4a30-82ea-e76f50dd7d15 =&gt; mgmt-3206ff16-fb29-4a30-82ea-e76f50dd7d15
+ bind repl-3206ff16-fb29-4a30-82ea-e76f50dd7d15 =&gt; repl-3206ff16-fb29-4a30-82ea-e76f50dd7d15
+Exchange 'amq.direct' (direct)
+ bind repl-3206ff16-fb29-4a30-82ea-e76f50dd7d15 =&gt; repl-3206ff16-fb29-4a30-82ea-e76f50dd7d15
+ bind repl-df06c7a6-4ce7-426a-9f66-da91a2a6a837 =&gt; repl-df06c7a6-4ce7-426a-9f66-da91a2a6a837
+ bind repl-c55915c2-2fda-43ee-9410-b1c1cbb3e4ae =&gt; repl-c55915c2-2fda-43ee-9410-b1c1cbb3e4ae
+Exchange 'amq.topic' (topic)
+Exchange 'amq.fanout' (fanout)
+Exchange 'amq.match' (headers)
+Exchange 'qpid.management' (topic)
+ bind mgmt.# =&gt; mgmt-3206ff16-fb29-4a30-82ea-e76f50dd7d15
+</programlisting>
+<!--h3--></section>
+
+ <section role="h3" id="MgmtC-2B-2B-Usingqpidroute"><title>
+ Using qpid-route
+ </title>
+ <para>
+ This utility is to create federated networks of brokers, This
+ allows you for forward messages between brokers in a network.
+ Messages can be routed statically (using "qpid-route route add")
+ where the bindings that control message forwarding are supplied
+ in the route. Message routing can also be dynamic (using
+ "qpid-route dynamic add") where the messages are automatically
+ forwarded to clients based on their bindings to the local broker.
+ </para>
+ <programlisting>
+$ qpid-route
+Usage: qpid-route [OPTIONS] dynamic add &lt;dest-broker&gt; &lt;src-broker&gt; &lt;exchange&gt; [tag] [exclude-list]
+ qpid-route [OPTIONS] dynamic del &lt;dest-broker&gt; &lt;src-broker&gt; &lt;exchange&gt;
+
+ qpid-route [OPTIONS] route add &lt;dest-broker&gt; &lt;src-broker&gt; &lt;exchange&gt; &lt;routing-key&gt; [tag] [exclude-list]
+ qpid-route [OPTIONS] route del &lt;dest-broker&gt; &lt;src-broker&gt; &lt;exchange&gt; &lt;routing-key&gt;
+ qpid-route [OPTIONS] queue add &lt;dest-broker&gt; &lt;src-broker&gt; &lt;exchange&gt; &lt;queue&gt;
+ qpid-route [OPTIONS] queue del &lt;dest-broker&gt; &lt;src-broker&gt; &lt;exchange&gt; &lt;queue&gt;
+ qpid-route [OPTIONS] route list [&lt;dest-broker&gt;]
+ qpid-route [OPTIONS] route flush [&lt;dest-broker&gt;]
+ qpid-route [OPTIONS] route map [&lt;broker&gt;]
+
+ qpid-route [OPTIONS] link add &lt;dest-broker&gt; &lt;src-broker&gt;
+ qpid-route [OPTIONS] link del &lt;dest-broker&gt; &lt;src-broker&gt;
+ qpid-route [OPTIONS] link list [&lt;dest-broker&gt;]
+
+Options:
+ -v [ --verbose ] Verbose output
+ -q [ --quiet ] Quiet output, don't print duplicate warnings
+ -d [ --durable ] Added configuration shall be durable
+ -e [ --del-empty-link ] Delete link after deleting last route on the link
+ -s [ --src-local ] Make connection to source broker (push route)
+ -t &lt;transport&gt; [ --transport &lt;transport&gt;]
+ Specify transport to use for links, defaults to tcp
+
+ dest-broker and src-broker are in the form: [username/password@] hostname | ip-address [:&lt;port&gt;]
+ ex: localhost, 10.1.1.7:10000, broker-host:10000, guest/guest@localhost
+</programlisting>
+ <para>
+ A few examples:
+ </para>
+ <programlisting>
+qpid-route dynamic add host1 host2 fed.topic
+qpid-route dynamic add host2 host1 fed.topic
+
+qpid-route -v route add host1 host2 hub1.topic hub2.topic.stock.buy
+qpid-route -v route add host1 host2 hub1.topic hub2.topic.stock.sell
+qpid-route -v route add host1 host2 hub1.topic 'hub2.topic.stock.#'
+qpid-route -v route add host1 host2 hub1.topic 'hub2.#'
+qpid-route -v route add host1 host2 hub1.topic 'hub2.topic.#'
+qpid-route -v route add host1 host2 hub1.topic 'hub2.global.#'
+</programlisting>
+ <para>
+ The link map feature can be used to display the entire federated
+ network configuration by supplying a single broker as an entry
+ point:
+ </para>
+ <programlisting>
+$ qpid-route route map localhost:10001
+
+Finding Linked Brokers:
+ localhost:10001... Ok
+ localhost:10002... Ok
+ localhost:10003... Ok
+ localhost:10004... Ok
+ localhost:10005... Ok
+ localhost:10006... Ok
+ localhost:10007... Ok
+ localhost:10008... Ok
+
+Dynamic Routes:
+
+ Exchange fed.topic:
+ localhost:10002 &lt;=&gt; localhost:10001
+ localhost:10003 &lt;=&gt; localhost:10002
+ localhost:10004 &lt;=&gt; localhost:10002
+ localhost:10005 &lt;=&gt; localhost:10002
+ localhost:10006 &lt;=&gt; localhost:10005
+ localhost:10007 &lt;=&gt; localhost:10006
+ localhost:10008 &lt;=&gt; localhost:10006
+
+ Exchange fed.direct:
+ localhost:10002 =&gt; localhost:10001
+ localhost:10004 =&gt; localhost:10003
+ localhost:10003 =&gt; localhost:10002
+ localhost:10001 =&gt; localhost:10004
+
+Static Routes:
+
+ localhost:10003(ex=amq.direct) &lt;= localhost:10005(ex=amq.direct) key=rkey
+ localhost:10003(ex=amq.direct) &lt;= localhost:10005(ex=amq.direct) key=rkey2
+</programlisting>
+<!--h3--></section>
+
+ <section role="h3" id="MgmtC-2B-2B-Usingqpidtool"><title>
+ Using qpid-tool
+ </title>
+ <para>
+ This utility provided a telnet style interface to be able to
+ view, list all stats and action
+ all the methods. Simple capture below. Best to just play with it
+ and mail the list if you have
+ questions or want features added.
+ </para>
+ <programlisting>
+qpid:
+qpid: help
+Management Tool for QPID
+Commands:
+ list - Print summary of existing objects by class
+ list &lt;className&gt; - Print list of objects of the specified class
+ list &lt;className&gt; all - Print contents of all objects of specified class
+ list &lt;className&gt; active - Print contents of all non-deleted objects of specified class
+ list &lt;list-of-IDs&gt; - Print contents of one or more objects (infer className)
+ list &lt;className&gt; &lt;list-of-IDs&gt; - Print contents of one or more objects
+ list is space-separated, ranges may be specified (i.e. 1004-1010)
+ call &lt;ID&gt; &lt;methodName&gt; &lt;args&gt; - Invoke a method on an object
+ schema - Print summary of object classes seen on the target
+ schema &lt;className&gt; - Print details of an object class
+ set time-format short - Select short timestamp format (default)
+ set time-format long - Select long timestamp format
+ quit or ^D - Exit the program
+qpid: list
+Management Object Types:
+ ObjectType Active Deleted
+ ================================
+ qpid.binding 21 0
+ qpid.broker 1 0
+ qpid.client 1 0
+ qpid.exchange 6 0
+ qpid.queue 13 0
+ qpid.session 4 0
+ qpid.system 1 0
+ qpid.vhost 1 0
+qpid: list qpid.system
+Objects of type qpid.system
+ ID Created Destroyed Index
+ ==================================
+ 1000 21:00:02 - host
+qpid: list 1000
+Object of type qpid.system: (last sample time: 21:26:02)
+ Type Element 1000
+ =======================================================
+ config sysId host
+ config osName Linux
+ config nodeName localhost.localdomain
+ config release 2.6.24.4-64.fc8
+ config version #1 SMP Sat Mar 29 09:15:49 EDT 2008
+ config machine x86_64
+qpid: schema queue
+Schema for class 'qpid.queue':
+ Element Type Unit Access Notes Description
+ ===================================================================================================================
+ vhostRef reference ReadCreate index
+ name short-string ReadCreate index
+ durable boolean ReadCreate
+ autoDelete boolean ReadCreate
+ exclusive boolean ReadCreate
+ arguments field-table ReadOnly Arguments supplied in queue.declare
+ storeRef reference ReadOnly Reference to persistent queue (if durable)
+ msgTotalEnqueues uint64 message Total messages enqueued
+ msgTotalDequeues uint64 message Total messages dequeued
+ msgTxnEnqueues uint64 message Transactional messages enqueued
+ msgTxnDequeues uint64 message Transactional messages dequeued
+ msgPersistEnqueues uint64 message Persistent messages enqueued
+ msgPersistDequeues uint64 message Persistent messages dequeued
+ msgDepth uint32 message Current size of queue in messages
+ msgDepthHigh uint32 message Current size of queue in messages (High)
+ msgDepthLow uint32 message Current size of queue in messages (Low)
+ byteTotalEnqueues uint64 octet Total messages enqueued
+ byteTotalDequeues uint64 octet Total messages dequeued
+ byteTxnEnqueues uint64 octet Transactional messages enqueued
+ byteTxnDequeues uint64 octet Transactional messages dequeued
+ bytePersistEnqueues uint64 octet Persistent messages enqueued
+ bytePersistDequeues uint64 octet Persistent messages dequeued
+ byteDepth uint32 octet Current size of queue in bytes
+ byteDepthHigh uint32 octet Current size of queue in bytes (High)
+ byteDepthLow uint32 octet Current size of queue in bytes (Low)
+ enqueueTxnStarts uint64 transaction Total enqueue transactions started
+ enqueueTxnCommits uint64 transaction Total enqueue transactions committed
+ enqueueTxnRejects uint64 transaction Total enqueue transactions rejected
+ enqueueTxnCount uint32 transaction Current pending enqueue transactions
+ enqueueTxnCountHigh uint32 transaction Current pending enqueue transactions (High)
+ enqueueTxnCountLow uint32 transaction Current pending enqueue transactions (Low)
+ dequeueTxnStarts uint64 transaction Total dequeue transactions started
+ dequeueTxnCommits uint64 transaction Total dequeue transactions committed
+ dequeueTxnRejects uint64 transaction Total dequeue transactions rejected
+ dequeueTxnCount uint32 transaction Current pending dequeue transactions
+ dequeueTxnCountHigh uint32 transaction Current pending dequeue transactions (High)
+ dequeueTxnCountLow uint32 transaction Current pending dequeue transactions (Low)
+ consumers uint32 consumer Current consumers on queue
+ consumersHigh uint32 consumer Current consumers on queue (High)
+ consumersLow uint32 consumer Current consumers on queue (Low)
+ bindings uint32 binding Current bindings
+ bindingsHigh uint32 binding Current bindings (High)
+ bindingsLow uint32 binding Current bindings (Low)
+ unackedMessages uint32 message Messages consumed but not yet acked
+ unackedMessagesHigh uint32 message Messages consumed but not yet acked (High)
+ unackedMessagesLow uint32 message Messages consumed but not yet acked (Low)
+ messageLatencySamples delta-time nanosecond Broker latency through this queue (Samples)
+ messageLatencyMin delta-time nanosecond Broker latency through this queue (Min)
+ messageLatencyMax delta-time nanosecond Broker latency through this queue (Max)
+ messageLatencyAverage delta-time nanosecond Broker latency through this queue (Average)
+Method 'purge' Discard all messages on queue
+qpid: list queue
+Objects of type qpid.queue
+ ID Created Destroyed Index
+ ===========================================================================
+ 1012 21:08:13 - 1002.pub_start
+ 1014 21:08:13 - 1002.pub_done
+ 1016 21:08:13 - 1002.sub_ready
+ 1018 21:08:13 - 1002.sub_done
+ 1020 21:08:13 - 1002.perftest0
+ 1038 21:09:08 - 1002.mgmt-3206ff16-fb29-4a30-82ea-e76f50dd7d15
+ 1040 21:09:08 - 1002.repl-3206ff16-fb29-4a30-82ea-e76f50dd7d15
+ 1046 21:09:32 - 1002.mgmt-df06c7a6-4ce7-426a-9f66-da91a2a6a837
+ 1048 21:09:32 - 1002.repl-df06c7a6-4ce7-426a-9f66-da91a2a6a837
+ 1054 21:10:01 - 1002.mgmt-c55915c2-2fda-43ee-9410-b1c1cbb3e4ae
+ 1056 21:10:01 - 1002.repl-c55915c2-2fda-43ee-9410-b1c1cbb3e4ae
+ 1063 21:26:00 - 1002.mgmt-8d621997-6356-48c3-acab-76a37081d0f3
+ 1065 21:26:00 - 1002.repl-8d621997-6356-48c3-acab-76a37081d0f3
+qpid: list 1020
+Object of type qpid.queue: (last sample time: 21:26:02)
+ Type Element 1020
+ ==========================================================================
+ config vhostRef 1002
+ config name perftest0
+ config durable False
+ config autoDelete False
+ config exclusive False
+ config arguments {'qpid.max_size': 0, 'qpid.max_count': 0}
+ config storeRef NULL
+ inst msgTotalEnqueues 500000 messages
+ inst msgTotalDequeues 500000
+ inst msgTxnEnqueues 0
+ inst msgTxnDequeues 0
+ inst msgPersistEnqueues 0
+ inst msgPersistDequeues 0
+ inst msgDepth 0
+ inst msgDepthHigh 0
+ inst msgDepthLow 0
+ inst byteTotalEnqueues 512000000 octets
+ inst byteTotalDequeues 512000000
+ inst byteTxnEnqueues 0
+ inst byteTxnDequeues 0
+ inst bytePersistEnqueues 0
+ inst bytePersistDequeues 0
+ inst byteDepth 0
+ inst byteDepthHigh 0
+ inst byteDepthLow 0
+ inst enqueueTxnStarts 0 transactions
+ inst enqueueTxnCommits 0
+ inst enqueueTxnRejects 0
+ inst enqueueTxnCount 0
+ inst enqueueTxnCountHigh 0
+ inst enqueueTxnCountLow 0
+ inst dequeueTxnStarts 0
+ inst dequeueTxnCommits 0
+ inst dequeueTxnRejects 0
+ inst dequeueTxnCount 0
+ inst dequeueTxnCountHigh 0
+ inst dequeueTxnCountLow 0
+ inst consumers 0 consumers
+ inst consumersHigh 0
+ inst consumersLow 0
+ inst bindings 1 binding
+ inst bindingsHigh 1
+ inst bindingsLow 1
+ inst unackedMessages 0 messages
+ inst unackedMessagesHigh 0
+ inst unackedMessagesLow 0
+ inst messageLatencySamples 0
+ inst messageLatencyMin 0
+ inst messageLatencyMax 0
+ inst messageLatencyAverage 0
+qpid:
+</programlisting>
+<!--h3--></section>
+
+ <section role="h3" id="MgmtC-2B-2B-Usingqpidprintevents"><title>
+ Using
+ qpid-printevents
+ </title>
+ <para>
+ This utility connects to one or more brokers and collects events,
+ printing out a line per event.
+ </para>
+ <programlisting>
+$ qpid-printevents --help
+Usage: qpid-printevents [options] [broker-addr]...
+
+Collect and print events from one or more Qpid message brokers. If no broker-
+addr is supplied, qpid-printevents will connect to 'localhost:5672'. broker-
+addr is of the form: [username/password@] hostname | ip-address [:&lt;port&gt;] ex:
+localhost, 10.1.1.7:10000, broker-host:10000, guest/guest@localhost
+
+Options:
+ -h, --help show this help message and exit
+</programlisting>
+ <para>
+ You get the idea... have fun!
+ </para>
+<!--h3--></section>
+<section>
+ <title>Using qpid-ha</title>
+ <para>This utility lets you monitor and control the activity of the clustering behavior provided by the HA module.
+ </para>
+ <programlisting>
+ <![CDATA[
+qpid-ha --help
+usage: qpid-ha <command> [<arguments>]
+
+Commands are:
+
+ ready Test if a backup broker is ready.
+ query Print HA configuration settings.
+ set Set HA configuration settings.
+ promote Promote broker from backup to primary.
+ replicate Set up replication from <queue> on <remote-broker> to <queue> on the current broker.
+
+For help with a command type: qpid-ha <command> --help
+]]>
+ </programlisting>
+</section>
+</section>
diff --git a/doc/book/src/QMF-Python-Console-Tutorial.xml b/doc/book/src/cpp-broker/QMF-Python-Console-Tutorial.xml
index 2cb802671b..2cb802671b 100644
--- a/doc/book/src/QMF-Python-Console-Tutorial.xml
+++ b/doc/book/src/cpp-broker/QMF-Python-Console-Tutorial.xml
diff --git a/doc/book/src/Qpid-Interoperability-Documentation.xml b/doc/book/src/cpp-broker/Qpid-Interoperability-Documentation.xml
index 74546693df..74546693df 100644
--- a/doc/book/src/Qpid-Interoperability-Documentation.xml
+++ b/doc/book/src/cpp-broker/Qpid-Interoperability-Documentation.xml
diff --git a/doc/book/src/Qpid-Management-Framework.xml b/doc/book/src/cpp-broker/Qpid-Management-Framework.xml
index 89bfe9d95e..89bfe9d95e 100644
--- a/doc/book/src/Qpid-Management-Framework.xml
+++ b/doc/book/src/cpp-broker/Qpid-Management-Framework.xml
diff --git a/doc/book/src/Running-CPP-Broker.xml b/doc/book/src/cpp-broker/Running-CPP-Broker.xml
index 7dba5b41ce..7dba5b41ce 100644
--- a/doc/book/src/Running-CPP-Broker.xml
+++ b/doc/book/src/cpp-broker/Running-CPP-Broker.xml
diff --git a/doc/book/src/cpp-broker/Security.xml b/doc/book/src/cpp-broker/Security.xml
new file mode 100644
index 0000000000..f28b72c71d
--- /dev/null
+++ b/doc/book/src/cpp-broker/Security.xml
@@ -0,0 +1,1258 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<section id="chap-Messaging_User_Guide-Security">
+ <title>Security</title>
+ <para>
+ This chapter describes how authentication, rule-based authorization, encryption, and digital signing can be accomplished using Qpid. Authentication is the process of verifying the identity of a user; in Qpid, this is done using the SASL framework. Rule-based authorization is a mechanism for specifying the actions that each user is allowed to perform; in Qpid, this is done using an Access Control List (ACL) that is part of the Qpid broker. Encryption is used to ensure that data is not transferred in a plain-text format that could be intercepted and read. Digital signatures provide proof that a given message was sent by a known sender. Encryption and signing are done using SSL (they can also be done using SASL, but SSL provides stronger encryption).
+ </para>
+ <section id="sect-Messaging_User_Guide-Security-User_Authentication">
+ <title>User Authentication</title>
+ <para>
+ AMQP uses Simple Authentication and Security Layer (SASL) to authenticate client connections to the broker. SASL is a framework that supports a variety of authentication methods. For secure applications, we suggest <command>CRAM-MD5</command>, <command>DIGEST-MD5</command>, or <command>GSSAPI</command>. The <command>ANONYMOUS</command> method is not secure. The <command>PLAIN</command> method is secure only when used together with SSL.
+ </para>
+ <para>
+ Both the Qpid broker and Qpid clients use the <ulink url="http://cyrusimap.web.cmu.edu/">Cyrus SASL library</ulink>, a full-featured authentication framework, which offers many configuration options. This section shows how to configure users for authentication with SASL, which is sufficient when using <command>SASL PLAIN</command>. If you are not using SSL, you should configure SASL to use <command>CRAM-MD5</command>, <command>DIGEST-MD5</command>, or <command>GSSAPI</command> (which provides Kerberos authentication). For information on configuring these and other options in SASL, see the Cyrus SASL documentation<!-- at <filename>/usr/share/doc/cyrus-sasl-lib-2.1.22/index.html</filename> for &RHEL5; or <filename>/usr/share/doc/cyrus-sasl-2.1.19/index.html</filename> for &RHEL4;-->.
+ </para>
+ <important>
+ <title>Important</title>
+ <para>
+ The <command>SASL PLAIN</command> method sends passwords in cleartext, and is vulnerable to man-in-the-middle attacks unless SSL (Secure Socket Layer) is also used (see <xref linkend="sect-Messaging_User_Guide-Security-Encryption_using_SSL" />).
+ </para>
+ <para>
+ If you are not using SSL, we recommend that you disable <command>PLAIN</command> authentication in the broker.
+ </para>
+
+ </important>
+ <para>
+ The Qpid broker uses the <command>auth yes|no</command> option to determine whether to use SASL authentication. Turn on authentication by setting <command>auth</command> to <command>yes</command> in <filename>/etc/qpidd.conf</filename>:
+ </para>
+
+<programlisting>
+# /etc/qpidd.conf
+#
+# Set auth to &#39;yes&#39; or &#39;no&#39;
+
+auth=yes
+</programlisting>
+ <section id="sect-Messaging_User_Guide-User_Authentication-Configuring_SASL">
+ <title>Configuring SASL</title>
+ <para>
+ On Linux systems, the SASL configuration file is generally found in <filename>/etc/sasl2/qpidd.conf</filename> <!-- for &RHEL5; and-->or <filename>/usr/lib/sasl2/qpidd.conf</filename><!-- for &RHEL4;-->.
+ </para>
+ <para>
+ The SASL database contains user names and passwords for SASL. In SASL, a user may be associated with a <firstterm>realm</firstterm>. The Qpid broker authenticates users in the <command>QPID</command> realm by default, but it can be set to a different realm using the <command>realm</command> option:
+ </para>
+
+<programlisting>
+# /etc/qpidd.conf
+#
+# Set the SASL realm using &#39;realm=&#39;
+
+auth=yes
+realm=QPID
+</programlisting>
+ <para>
+ The SASL database is installed at <filename>/var/lib/qpidd/qpidd.sasldb</filename>; initially, it has one user named <command>guest</command> in the <command>QPID</command> realm, and the password for this user is <command>guest</command>.
+ </para>
+ <note>
+ <title>Note</title>
+ <para>
+ The user database is readable only by the <systemitem class="username">qpidd</systemitem> user. When run as a daemon, Qpid always runs as the <systemitem class="username">qpidd</systemitem> user. If you start the broker from a user other than the <systemitem class="username">qpidd</systemitem> user, you will need to either reconfigure SASL or turn authentication off.
+ </para>
+
+ </note>
+ <important>
+ <title>Important</title>
+ <para>
+ The SASL database stores user names and passwords in plain text. If it is compromised so are all of the passwords that it stores. This is the reason that the <systemitem class="username">qpidd</systemitem> user is the only user that can read the database. If you modify permissions, be careful not to expose the SASL database.
+ </para>
+
+ </important>
+ <para>
+ Add new users to the database by using the <command>saslpasswd2</command> command, which specifies a realm and a user ID. A user ID takes the form <command><replaceable>user-id</replaceable>@<replaceable>domain</replaceable>.</command>.
+ </para>
+
+<screen># saslpasswd2 -f /var/lib/qpidd/qpidd.sasldb -u <replaceable>realm</replaceable> <replaceable>new_user_name</replaceable></screen>
+ <para>
+ To list the users in the SASL database, use <command>sasldblistusers2</command>:
+ </para>
+
+<screen># sasldblistusers2 -f /var/lib/qpidd/qpidd.sasldb
+</screen>
+ <para>
+ If you are using <command>PLAIN</command> authentication, users who are in the database can now connect with their user name and password. This is secure only if you are using SSL. If you are using a more secure form of authentication, please consult your SASL documentation for information on configuring the options you need.
+ </para>
+
+ </section>
+
+ <section id="sect-Messaging_User_Guide-User_Authentication-Kerberos">
+ <title>Kerberos</title>
+ <para>
+ Both the Qpid broker and Qpid users are &#39;principals&#39; of the Kerberos server, which means that they are both clients of the Kerberos authentication services.
+ </para>
+ <para>
+ To use Kerberos, both the Qpid broker and each Qpid user must be authenticated on the Kerberos server:
+ </para>
+ <procedure>
+ <step>
+ <para>
+ Install the Kerberos workstation software and Cyrus SASL GSSAPI on each machine that runs a qpidd broker or a qpidd messaging client:
+ </para>
+
+<screen>$ sudo yum install cyrus-sasl-gssapi krb5-workstation</screen>
+
+ </step>
+ <step>
+ <para>
+ Make sure that the Qpid broker is registered in the Kerberos database.
+ </para>
+ <para>
+ Traditionally, a Kerberos principal is divided into three parts: the primary, the instance, and the realm. A typical Kerberos V5 has the format <literal>primary/instance@REALM</literal>. For a Qpid broker, the primary is <literal>qpidd</literal>, the instance is the fully qualified domain name, which you can obtain using <command>hostname --fqdn</command>, and the REALM is the Kerberos domain realm. By default, this realm is <literal>QPID</literal>, but a different realm can be specified in qpid.conf, e.g.:
+<screen>realm=EXAMPLE.COM</screen>
+
+ </para>
+ <para>
+ For instance, if the fully qualified domain name is <literal>dublduck.example.com</literal> and the Kerberos domain realm is <literal>EXAMPLE.COM</literal>, then the principal name is <literal>qpidd/dublduck.example.com@EXAMPLE.COM</literal>.
+ </para>
+ <para>
+ The following script creates a principal for qpidd:
+ </para>
+
+<programlisting>
+FDQN=`hostname --fqdn`
+REALM=&#34;EXAMPLE.COM&#34;
+kadmin -r $REALM -q &#34;addprinc -randkey -clearpolicy qpidd/$FQDN&#34;
+</programlisting>
+ <para>
+ Now create a Kerberos keytab file for the Qpid broker. The Qpid broker must have read access to the keytab file. The following script creates a keytab file and allows the broker read access:
+ </para>
+
+<programlisting>
+QPIDD_GROUP=&#34;qpidd&#34;
+kadmin -r $REALM -q &#34;ktadd -k /etc/qpidd.keytab qpidd/$FQDN@$REALM&#34;
+chmod g+r /etc/qpidd.keytab
+chgrp $QPIDD_GROUP /etc/qpidd.keytab
+</programlisting>
+ <para>
+ The default location for the keytab file is <filename>/etc/krb5.keytab</filename>. If a different keytab file is used, the KRB5_KTNAME environment variable must contain the name of the file, e.g.:
+ </para>
+
+<programlisting>
+export KRB5_KTNAME=/etc/qpidd.keytab
+</programlisting>
+ <para>
+ If this is correctly configured, you can now enable kerberos support on the Qpid broker by setting the <varname>auth</varname> and <varname>realm</varname> options in <filename>/etc/qpidd.conf</filename>:
+ </para>
+
+<programlisting>
+# /etc/qpidd.conf
+auth=yes
+realm=EXAMPLE.COM
+</programlisting>
+ <para>
+ Restart the broker to activate these settings.
+ </para>
+
+ </step>
+ <step>
+ <para>
+ Make sure that each Qpid user is registered in the Kerberos database, and that Kerberos is correctly configured on the client machine. The Qpid user is the account from which a Qpid messaging client is run. If it is correctly configured, the following command should succeed:
+ </para>
+
+<screen>$ kinit user@REALM.COM</screen>
+
+ </step>
+
+ </procedure>
+
+ <para>
+ Java JMS clients require a few additional steps.
+ </para>
+ <procedure>
+ <step>
+ <para>
+ The Java JVM must be run with the following arguments:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>-Djavax.security.auth.useSubjectCredsOnly=false</term>
+ <listitem>
+ <para>
+ Forces the SASL GASSPI client to obtain the kerberos credentials explicitly instead of obtaining from the &#34;subject&#34; that owns the current thread.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term>-Djava.security.auth.login.config=myjas.conf</term>
+ <listitem>
+ <para>
+ Specifies the jass configuration file. Here is a sample JASS configuration file:
+ </para>
+
+<programlisting>
+com.sun.security.jgss.initiate {
+ com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;
+};
+</programlisting>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term>-Dsun.security.krb5.debug=true</term>
+ <listitem>
+ <para>
+ Enables detailed debug info for troubleshooting
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+
+ </variablelist>
+
+ </step>
+ <step>
+ <para>
+ The client&#39;s Connection URL must specify the following Kerberos-specific broker properties:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <varname>sasl_mechs</varname> must be set to <literal>GSSAPI</literal>.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ <varname>sasl_protocol</varname> must be set to the principal for the qpidd broker, e.g. <literal>qpidd</literal>/
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ <varname>sasl_server</varname> must be set to the host for the SASL server, e.g. <literal>sasl.com</literal>.
+ </para>
+
+ </listitem>
+
+ </itemizedlist>
+ <para>
+ Here is a sample connection URL for a Kerberos connection:
+ </para>
+
+<screen>amqp://guest@clientid/testpath?brokerlist=&#39;tcp://localhost:5672?sasl_mechs=&#39;GSSAPI&#39;&amp;sasl_protocol=&#39;qpidd&#39;&amp;sasl_server=&#39;&#60;server-host-name&#62;&#39;&#39;</screen>
+
+ </step>
+
+ </procedure>
+<!--
+ <para>
+ Please refer to the following documentation for more detail on using Kerberos:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>RHEL5</term>
+ <listitem>
+ <para>
+ <ulink url="http://www.redhat.com/docs/manuals/enterprise/RHEL-5-manual/Deployment_Guide-en-US/ch-kerberos.html"> Red Hat Enterprise Linux 5: Deployment Guide </ulink>
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term>RHEL4</term>
+ <listitem>
+ <para>
+ <ulink url="http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/ref-guide/ch-kerberos.html"> Red Hat Enterprise Linux 4: Reference Guide </ulink>
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term>Java</term>
+ <listitem>
+ <para>
+ <ulink url="http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/index.html"> Introduction to JAAS and Java GSS-API Tutorials </ulink>
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+
+ </variablelist>
+ -->
+
+ </section>
+
+
+ </section>
+
+ <!-- ################################################### --> <section id="sect-Messaging_User_Guide-Security-Authorization">
+ <title>Authorization</title>
+ <para>
+ In Qpid, Authorization specifies which actions can be performed by each authenticated user using an Access Control List (ACL). Use the <command>--acl-file</command> command to load the access control list. The filename should have a <filename>.acl</filename> extension:
+ </para>
+
+<screen>
+$ qpidd --acl-file <replaceable>./aclfilename.acl</replaceable></screen>
+ <para>
+ Each line in an ACL file grants or denies specific rights to a user. If the last line in an ACL file is <literal>acl deny all all</literal>, the ACL uses <firstterm>deny mode</firstterm>, and only those rights that are explicitly allowed are granted:
+ </para>
+
+<programlisting>
+acl allow rajith@QPID all all
+acl deny all all
+</programlisting>
+ <para>
+ On this server, <literal>rajith@QPID</literal> can perform any action, but nobody else can. Deny mode is the default, so the previous example is equivalent to the following ACL file:
+ </para>
+
+<programlisting>
+acl allow rajith@QPID all all
+</programlisting>
+ <para>
+ ACL syntax allows fine-grained access rights for specific actions:
+ </para>
+
+<programlisting>
+acl allow carlt@QPID create exchange name=carl.*
+acl allow fred@QPID create all
+acl allow all consume queue
+acl allow all bind exchange
+acl deny all all
+</programlisting>
+ <para>
+ An ACL file can define user groups, and assign permissions to them:
+ </para>
+
+<programlisting>
+group admin ted@QPID martin@QPID
+acl allow admin create all
+acl deny all all
+</programlisting>
+ <!-- ######## --> <section id="sect-Messaging_User_Guide-Authorization-ACL_Syntax">
+ <title>ACL Syntax</title>
+ <para>
+ ACL rules must be on a single line and follow this syntax:
+<programlisting><![CDATA[
+user = username[/domain[@realm]]
+user-list = user1 user2 user3 ...
+group-name-list = group1 group2 group3 ...
+
+group <group-name> = [user-list] [group-name-list]
+
+permission = [allow|allow-log|deny|deny-log]
+action = [consume|publish|create|access|bind|unbind|delete|purge|update]
+object = [virtualhost|queue|exchange|broker|link|route|method]
+property = [name|durable|owner|routingkey|autodelete|exclusive|
+ type|alternate|queuename|schemapackage|schemaclass|
+ queuemaxsizelowerlimit|queuemaxsizeupperlimit|
+ queuemaxcountlowerlimit|queuemaxcountupperlimit]
+
+acl permission {<group-name>|<user-name>|"all"} {action|"all"} [object|"all"
+ [property=<property-value> ...]]
+]]></programlisting>
+
+ ACL rules can also include a single object name (or the keyword <parameter>all</parameter>) and one or more property name value pairs in the form <command>property=value</command>
+ </para>
+ <para>
+ The following tables show the possible values for <command>permission</command>, <command>action</command>, <command>object</command>, and <command>property</command> in an ACL rules file.
+ </para>
+ <table id="tabl-Messaging_User_Guide-ACL_Syntax-ACL_Rules_permission">
+ <title>ACL Rules: permission</title>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>
+ <command>allow</command>
+ </entry>
+ <entry>
+ <para>
+ Allow the action <!-- ### rule => the action -->
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>allow-log</command>
+ </entry>
+ <entry>
+ <para>
+ Allow the action and log the action in the event log
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>deny</command>
+ </entry>
+ <entry>
+ <para>
+ Deny the action
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>deny-log</command>
+ </entry>
+ <entry>
+ <para>
+ Deny the action and log the action in the event log
+ </para>
+
+ </entry>
+
+ </row>
+
+ </tbody>
+
+ </tgroup>
+
+ </table>
+ <!-- Actions --> <table id="tabl-Messaging_User_Guide-ACL_Syntax-ACL_Rulesaction">
+ <title>ACL Rules:action</title>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>
+ <command>consume</command>
+ </entry>
+ <entry>
+ <para>
+ Applied when subscriptions are created
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>publish</command>
+ </entry>
+ <entry>
+ <para>
+ Applied on a per message basis on publish message transfers, this rule consumes the most resources
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>create</command>
+ </entry>
+ <entry>
+ <para>
+ Applied when an object is created, such as bindings, queues, exchanges, links
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>access</command>
+ </entry>
+ <entry>
+ <para>
+ Applied when an object is read or accessed
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>bind</command>
+ </entry>
+ <entry>
+ <para>
+ Applied when objects are bound together
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>unbind</command>
+ </entry>
+ <entry>
+ <para>
+ Applied when objects are unbound
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>delete</command>
+ </entry>
+ <entry>
+ <para>
+ Applied when objects are deleted
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>purge</command>
+ </entry>
+ <entry>
+ <para>
+ Similar to delete but the action is performed on more than one object
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>update</command>
+ </entry>
+ <entry>
+ <para>
+ Applied when an object is updated
+ </para>
+
+ </entry>
+
+ </row>
+
+ </tbody>
+
+ </tgroup>
+
+ </table>
+ <!-- object types --> <table id="tabl-Messaging_User_Guide-ACL_Syntax-ACL_Rulesobject">
+ <title>ACL Rules:object</title>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>
+ <command>queue</command>
+ </entry>
+ <entry>
+ <para>
+ A queue
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>exchange</command>
+ </entry>
+ <entry>
+ <para>
+ An exchange
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>broker</command>
+ </entry>
+ <entry>
+ <para>
+ The broker
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>link</command>
+ </entry>
+ <entry>
+ <para>
+ A federation or inter-broker link
+ </para>
+
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>method</command>
+ </entry>
+ <entry>
+ <para>
+ Management or agent or broker method
+ </para>
+
+ </entry>
+
+ </row>
+
+ </tbody>
+
+ </tgroup>
+
+ </table>
+ <!--
+ <para>
+ Wild cards can be used on properties that are a string. The following properties are supported: --> <table id="tabl-Messaging_User_Guide-ACL_Syntax-ACL_Rulesproperty">
+ <title>ACL Rules:property</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property</entry>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ <entry>Usage</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry> <command>name</command> </entry>
+ <entry>String</entry>
+ <entry>Object name, such as a queue name or exchange name.</entry>
+ <entry>.</entry>
+ </row>
+ <row>
+ <entry> <command>durable</command> </entry>
+ <entry>Boolean</entry>
+ <entry>Indicates the object is durable</entry>
+ <entry>CREATE QUEUE, CREATE EXCHANGE</entry>
+ </row>
+ <row>
+ <entry> <command>routingkey</command> </entry>
+ <entry>String</entry>
+ <entry>Specifies routing key</entry>
+ <entry>BIND EXCHANGE, UNBIND EXCHANGE, ACCESS EXCHANGE</entry>
+ </row>
+ <row>
+ <entry> <command>autodelete</command> </entry>
+ <entry>Boolean</entry>
+ <entry>Indicates whether or not the object gets deleted when the connection is closed</entry>
+ <entry>CREATE QUEUE</entry>
+ </row>
+ <row>
+ <entry> <command>exclusive</command> </entry>
+ <entry>Boolean</entry>
+ <entry>Indicates the presence of an <parameter>exclusive</parameter> flag</entry>
+ <entry>CREATE QUEUE</entry>
+ </row>
+ <row>
+ <entry> <command>type</command> </entry>
+ <entry>String</entry>
+ <entry>Type of exchange, such as topic, fanout, or xml</entry>
+ <entry>CREATE EXCHANGE</entry>
+ </row>
+ <row>
+ <entry> <command>alternate</command> </entry>
+ <entry>String</entry>
+ <entry>Name of the alternate exchange</entry>
+ <entry>CREATE EXCHANGE, CREATE QUEUE</entry>
+ </row>
+ <row>
+ <entry> <command>queuename</command> </entry>
+ <entry>String</entry>
+ <entry>Name of the queue</entry>
+ <entry>ACCESS EXCHANGE</entry>
+ </row>
+ <row>
+ <entry> <command>schemapackage</command> </entry>
+ <entry>String</entry>
+ <entry>QMF schema package name</entry>
+ <entry>ACCESS METHOD</entry>
+ </row>
+ <row>
+ <entry> <command>schemaclass</command> </entry>
+ <entry>String</entry>
+ <entry>QMF schema class name</entry>
+ <entry>ACCESS METHOD</entry>
+ </row>
+ <row>
+ <entry> <command>queuemaxsizelowerlimit</command> </entry>
+ <entry>Integer</entry>
+ <entry>Minimum value for queue.max_size</entry>
+ <entry>CREATE QUEUE</entry>
+ </row>
+ <row>
+ <entry> <command>queuemaxsizeupperlimit</command> </entry>
+ <entry>Integer</entry>
+ <entry>Maximum value for queue.max_size</entry>
+ <entry>CREATE QUEUE</entry>
+ </row>
+ <row>
+ <entry> <command>queuemaxcountlowerlimit</command> </entry>
+ <entry>Integer</entry>
+ <entry>Minimum value for queue.max_count</entry>
+ <entry>CREATE QUEUE</entry>
+ </row>
+ <row>
+ <entry> <command>queuemaxcountupperlimit</command> </entry>
+ <entry>Integer</entry>
+ <entry>Maximum value for queue.max_count</entry>
+ <entry>CREATE QUEUE</entry>
+ </row>
+
+ </tbody>
+
+ </tgroup>
+
+ </table>
+
+ </section>
+
+ <section id="sect-Messaging_User_Guide-Authorization-ACL_Syntactic_Conventions">
+ <title>ACL Syntactic Conventions</title>
+ <para>
+ In ACL files, the following syntactic conventions apply:
+ <itemizedlist>
+ <listitem>
+ <para>
+ A line starting with the <command>#</command> character is considered a comment and is ignored.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ Empty lines and lines that contain only whitespace (' ', '\f', '\n', '\r', '\t', '\v') are ignored.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ All tokens are case sensitive. <parameter>name1</parameter> is not the same as <parameter>Name1</parameter> and <parameter>create</parameter> is not the same as <parameter>CREATE</parameter>.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ Group lists can be extended to the following line by terminating the line with the <command>\</command> character.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ Additional whitespace - that is, where there is more than one whitespace character - between and after tokens is ignored. Group and ACL definitions must start with either <command>group</command> or <command>acl</command> and with no preceding whitespace.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ All ACL rules are limited to a single line of at most 1024 characters.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ Rules are interpreted from the top of the file down until a matching rule is obtained. The matching rule then controls the allow or deny decision.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ The keyword <parameter>all</parameter> is reserved and may be used in ACL rules to match all individuals and groups, all actions, or all objects.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ By default ACL files are in 'Deny Mode' and deny all actions by all users. That is, there is an implicit <parameter>acl deny all all</parameter> rule appended to the ACL rule list.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ Group names may contain only <parameter>a-z</parameter>, <parameter>A-Z</parameter>, <parameter>0-9</parameter>, <parameter>- hyphen</parameter> and <parameter>_ underscore</parameter>.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ Individual user names may contain only <parameter>a-z</parameter>, <parameter>A-Z</parameter>, <parameter>0-9</parameter>, <parameter>- hyphen</parameter>, <parameter>_ underscore</parameter>, <parameter>. period</parameter>, <parameter>@ ampersand</parameter>, and <parameter>/ slash</parameter>.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ Rules must be preceded by any group definitions they can use. Any name not defined as a group will be assumed to be that of an individual.
+ </para>
+
+ </listitem>
+
+ </itemizedlist>
+
+ </para>
+
+ </section>
+
+ <section id="sect-Messaging_User_Guide-Authorization-ACL_Rule_Matching">
+ <title>ACL Rule Matching</title>
+ <para>
+ The minimum matching criteria for ACL rules are:
+ <itemizedlist>
+ <listitem>An actor (individually named or group member)</listitem>
+ <listitem>An action</listitem>
+ <listitem>An object</listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ If a rule does not match the minimum criteria then that rule does not control the ACL allow or deny decision.
+ </para>
+ <para>
+ ACL rules optionally specify object names and property name=value pairs. If an ACL rule specifies an object name or property values than all of them must match to cause the rule to match.
+ </para>
+ <para>
+ The following illustration shows how ACL rules are processed to find matching rules.
+<programlisting><![CDATA[
+# Example of rule matching
+#
+# Using this ACL file content:
+
+(1) acl deny bob create exchange name=test durable=true passive=true
+(2) acl deny bob create exchange name=myEx type=direct
+(3) acl allow all all
+
+#
+# Lookup 1. id:bob action:create objectType:exchange name=test
+# {durable=false passive=false type=direct alternate=}
+#
+# ACL Match Processing:
+# 1. Rule 1 passes minimum criteria with user bob, action create,
+# and object exchange.
+# 2. Rule 1 matches name=test.
+# 3. Rule 1 does not match the rule's durable=true with the requested
+# lookup of durable=false.
+# 4. Rule 1 does not control the decision and processing continues
+# to Rule 2.
+# 5. Rule 2 passes minimum criteria with user bob, action create,
+# and object exchange.
+# 6. Rule 2 does not match the rule's name=myEx with the requested
+# lookup of name=test.
+# 7. Rule 2 does not control the decision and processing continues
+# to Rule 3.
+# 8. Rule 3 matches everything and the decision is 'allow'.
+#
+# Lookup 2. id:bob action:create objectType:exchange name=myEx
+# {durable=true passive=true type=direct alternate=}
+#
+# ACL Match Processing:
+# 1. Rule 1 passes minimum criteria with user bob, action create,
+# and object exchange.
+# 6. Rule 1 does not match the rule's name=test with the requested
+# lookup of name=myEx.
+# 4. Rule 1 does not control the decision and processing continues
+# to Rule 2.
+# 5. Rule 2 passes minimum criteria with user bob, action create,
+# and object exchange.
+# 2. Rule 2 matches name=myEx.
+# 3. Rule 2 matches the rule's type=direct with the requested
+# lookup of type=direct.
+# 8. Rule 2 is the matching rule and the decision is 'deny'.
+#
+]]></programlisting>
+ </para>
+
+ </section>
+
+ <section id="sect-Messaging_User_Guide-Authorization-Specifying_ACL_Permissions">
+ <title>Specifying ACL Permissions</title>
+ <para>
+ Now that we have seen the ACL syntax, we will provide representative examples and guidelines for ACL files.
+ </para>
+ <para>
+ Most ACL files begin by defining groups:
+ </para>
+
+<programlisting>
+group admin ted@QPID martin@QPID
+group user-consume martin@QPID ted@QPID
+group group2 kim@QPID user-consume rob@QPID
+group publisher group2 \
+tom@QPID andrew@QPID debbie@QPID
+</programlisting>
+ <para>
+ Rules in an ACL file grant or deny specific permissions to users or groups:
+ </para>
+
+<programlisting>
+acl allow carlt@QPID create exchange name=carl.*
+acl allow rob@QPID create queue
+acl allow guest@QPID bind exchange name=amq.topic routingkey=stocks.rht.#
+acl allow user-consume create queue name=tmp.*
+
+acl allow publisher publish all durable=false
+acl allow publisher create queue name=RequestQueue
+acl allow consumer consume queue durable=true
+acl allow fred@QPID create all
+acl allow bob@QPID all queue
+acl allow admin all
+acl allow all consume queue
+acl allow all bind exchange
+acl deny all all
+</programlisting>
+ <para>
+ In the previous example, the last line, <literal>acl deny all all</literal>, denies all authorizations that have not been specifically granted. This is the default, but it is useful to include it explicitly on the last line for the sake of clarity. If you want to grant all rights by default, you can specify <literal>acl allow all all</literal> in the last line.
+ </para>
+ <para>
+ ACL allows specification of conflicting rules. Be sure to specify the most specific rules first followed by more general rules. Here is an example:
+ </para>
+ <para>
+<programlisting>
+group users alice@QPID bob@QPID charlie@QPID
+acl deny charlie@QPID create queue
+acl allow users create queue
+acl deny all all
+</programlisting>
+ </para>
+ <para>
+ In this example users alice and bob would be able to create queues due to their membership in the users group. However, user charlie is denied from creating a queue despite his membership in the users group because a deny rule for him is stated before the allow rule for the users group.
+ </para>
+ <para>
+ Do not allow <parameter>guest</parameter> to access and log QMF management methods that could cause security breaches:
+ </para>
+
+<programlisting>
+group allUsers guest@QPID
+....
+acl deny-log allUsers create link
+acl deny-log allUsers access method name=connect
+acl deny-log allUsers access method name=echo
+acl allow all all
+</programlisting>
+
+ </section>
+
+ <section id="sect-Messaging_User_Guide-Authorization-Specifying_ACL_Connection_Limits">
+ <title>Specifying ACL Connection Limits</title>
+ <para>
+ The ACL module creates two broker command line switches that set limits on the number of connections allowed per user or per client host address. These settings are not specified in the ACL file.
+ </para>
+ <para>
+<programlisting>
+--acl-max-connect-per-user N_USER
+--acl-max-connect-per-ip N_IP
+</programlisting>
+ </para>
+ <para>
+ If either of these switches is not specified or the value specified is zero then the corresponding connection limit is not enforced.
+ </para>
+ <para>
+ If a limit is set for user connections then all users are limited to that number of connections regardless of the client IP address the users are coming from.
+ </para>
+ <para>
+ If a limit is set for IP connections then connections for a given IP address are limited regardless of the user credentials presented with the connection.
+ </para>
+ <para>
+ Note that addresses using different transports are counted separately even though the host is actually the same physical machine. In the setting illustrated above a host would allow N_IP connections from [::1] IPv6 transport localhost and another N_IP connections from [127.0.0.1] IPv4 transport localhost.
+ </para>
+ </section>
+
+ </section>
+
+ <!-- ########################### --> <section id="sect-Messaging_User_Guide-Security-Encryption_using_SSL">
+ <title>Encryption using SSL</title>
+ <para>
+ Encryption and certificate management for <command>qpidd</command> is provided by Mozilla&#39;s Network Security Services Library (NSS).
+ </para>
+ <orderedlist id="orde-Messaging_User_Guide-Encryption_using_SSL-Enabling_SSL_for_the_RHM_broker">
+ <title>Enabling SSL for the Qpid broker</title>
+ <listitem>
+ <para>
+ You will need a certificate that has been signed by a Certification Authority (CA). This certificate will also need to be trusted by your client. If you require client authentication in addition to server authentication, the client&#39;s certificate will also need to be signed by a CA and trusted by the broker.
+ </para>
+ <para>
+ In the broker, SSL is provided through the <command>ssl.so</command> module. This module is installed and loaded by default in Qpid. To enable the module, you need to specify the location of the database containing the certificate and key to use. This is done using the <command>ssl-cert-db</command> option.
+ </para>
+ <para>
+ The certificate database is created and managed by the Mozilla Network Security Services (NSS) <command>certutil</command> tool. Information on this utility can be found on the <ulink url="http://www.mozilla.org/projects/security/pki/nss/tools/certutil.html">Mozilla website</ulink>, including tutorials on setting up and testing SSL connections. The certificate database will generally be password protected. The safest way to specify the password is to place it in a protected file, use the password file when creating the database, and specify the password file with the <command>ssl-cert-password-file</command> option when starting the broker.
+ </para>
+ <para>
+ The following script shows how to create a certificate database using certutil:
+ </para>
+ <!-- TODO: improve description -->
+<programlisting>
+mkdir ${CERT_DIR}
+certutil -N -d ${CERT_DIR} -f ${CERT_PW_FILE}
+certutil -S -d ${CERT_DIR} -n ${NICKNAME} -s &#34;CN=${NICKNAME}&#34; -t &#34;CT,,&#34; -x -f ${CERT_PW_FILE} -z /usr/bin/certutil
+</programlisting>
+ <para>
+ When starting the broker, set <command>ssl-cert-password-file</command> to the value of <command>${CERT_PW_FILE}</command>, set <command>ssl-cert-db</command> to the value of <command>${CERT_DIR}</command>, and set <command>ssl-cert-name</command> to the value of <command>${NICKNAME}</command>.
+ </para>
+
+ </listitem>
+ <!-- SSL options --> <listitem>
+ <para>
+ The following SSL options can be used when starting the broker:
+ <variablelist>
+ <varlistentry>
+ <term><command>--ssl-use-export-policy</command></term>
+ <listitem>
+ <para>
+ Use NSS export policy
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term><command>--ssl-cert-password-file <replaceable>PATH</replaceable></command></term>
+ <listitem>
+ <para>
+ Required. Plain-text file containing password to use for accessing certificate database.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term><command>--ssl-cert-db <replaceable>PATH</replaceable></command></term>
+ <listitem>
+ <para>
+ Required. Path to directory containing certificate database.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term><command>--ssl-cert-name <replaceable>NAME</replaceable></command></term>
+ <listitem>
+ <para>
+ Name of the certificate to use. Default is <literal>localhost.localdomain</literal>.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term><command>--ssl-port <replaceable>NUMBER</replaceable></command></term>
+ <listitem>
+ <para>
+ Port on which to listen for SSL connections. If no port is specified, port 5671 is used.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term><command>--ssl-require-client-authentication</command></term>
+ <listitem>
+ <para>
+ Require SSL client authentication (i.e. verification of a client certificate) during the SSL handshake. This occurs before SASL authentication, and is independent of SASL.
+ </para>
+ <para>
+ This option enables the <literal>EXTERNAL</literal> SASL mechanism for SSL connections. If the client chooses the <literal>EXTERNAL</literal> mechanism, the client&#39;s identity is taken from the validated SSL certificate, using the <literal>CN</literal>literal&#62;, and appending any <literal>DC</literal>literal&#62;s to create the domain. For instance, if the certificate contains the properties <literal>CN=bob</literal>, <literal>DC=acme</literal>, <literal>DC=com</literal>, the client&#39;s identity is <literal>bob@acme.com</literal>.
+ </para>
+ <para>
+ If the client chooses a different SASL mechanism, the identity take from the client certificate will be replaced by that negotiated during the SASL handshake.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term><command>--ssl-sasl-no-dict</command></term>
+ <listitem>
+ <para>
+ Do not accept SASL mechanisms that can be compromised by dictionary attacks. This prevents a weaker mechanism being selected instead of <literal>EXTERNAL</literal>, which is not vulnerable to dictionary attacks.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+
+ </variablelist>
+ Also relevant is the <command>--require-encryption</command> broker option. This will cause <command>qpidd</command> to only accept encrypted connections.
+ </para>
+
+ </listitem>
+
+ </orderedlist>
+ <!-- --> <variablelist id="vari-Messaging_User_Guide-Encryption_using_SSL-Enabling_SSL_in_Clients">
+ <title>Enabling SSL in Clients</title>
+ <varlistentry>
+ <term>C++ clients:</term>
+ <listitem>
+ <para>
+ <orderedlist>
+ <listitem>
+ <para>
+ In C++ clients, SSL is implemented in the <command>sslconnector.so</command> module. This module is installed and loaded by default in Qpid.
+ </para>
+ <para>
+ The following options can be specified for C++ clients using environment variables:
+ </para>
+ <table frame="all" id="tabl-Messaging_User_Guide-Enabling_SSL_in_Clients-SSL_Client_Environment_Variables_for_C_clients">
+ <title>SSL Client Environment Variables for C++ clients</title>
+ <tgroup align="left" cols="2" colsep="1" rowsep="1">
+ <colspec colname="c1"></colspec>
+ <colspec colname="c2"></colspec>
+ <thead>
+ <row>
+ <entry align="center" nameend="c2" namest="c1">
+ SSL Client Options for C++ clients
+ </entry>
+
+ </row>
+
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <command>QPID_SSL_USE_EXPORT_POLICY</command>
+ </entry>
+ <entry>
+ Use NSS export policy
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>QPID_SSL_CERT_PASSWORD_FILE <replaceable>PATH</replaceable></command>
+ </entry>
+ <entry>
+ File containing password to use for accessing certificate database
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>QPID_SSL_CERT_DB <replaceable>PATH</replaceable></command>
+ </entry>
+ <entry>
+ Path to directory containing certificate database
+ </entry>
+
+ </row>
+ <row>
+ <entry>
+ <command>QPID_SSL_CERT_NAME <replaceable>NAME</replaceable></command>
+ </entry>
+ <entry>
+ Name of the certificate to use. When SSL client authentication is enabled, a certificate name should normally be provided.
+ </entry>
+
+ </row>
+
+ </tbody>
+
+ </tgroup>
+
+ </table>
+ <!-- ######## -->
+ </listitem>
+ <listitem>
+ <para>
+ When using SSL connections, clients must specify the location of the certificate database, a directory that contains the client&#39;s certificate and the public key of the Certificate Authority. This can be done by setting the environment variable <command>QPID_SSL_CERT_DB</command> to the full pathname of the directory. If a connection uses SSL client authentication, the client&#39;s password is also needed&mdash;the password should be placed in a protected file, and the <command>QPID_SSL_CERT_PASSWORD_FILE</command> variable should be set to the location of the file containing this password.
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ To open an SSL enabled connection in the Qpid Messaging API, set the <parameter>protocol</parameter> connection option to <parameter>ssl</parameter>.
+ </para>
+
+ </listitem>
+
+ </orderedlist>
+
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term>Java clients:</term>
+ <listitem>
+ <para>
+ <orderedlist>
+ <listitem>
+ <para>
+ For both server and client authentication, import the trusted CA to your trust store and keystore and generate keys for them. Create a certificate request using the generated keys and then create a certificate using the request. You can then import the signed certificate into your keystore. Pass the following arguments to the Java JVM when starting your client:
+<programlisting>
+-Djavax.net.ssl.keyStore=/home/bob/ssl_test/keystore.jks
+-Djavax.net.ssl.keyStorePassword=password
+-Djavax.net.ssl.trustStore=/home/bob/ssl_test/certstore.jks
+-Djavax.net.ssl.trustStorePassword=password
+</programlisting>
+
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ For server side authentication only, import the trusted CA to your trust store and pass the following arguments to the Java JVM when starting your client:
+<programlisting>
+-Djavax.net.ssl.trustStore=/home/bob/ssl_test/certstore.jks
+-Djavax.net.ssl.trustStorePassword=password
+</programlisting>
+
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>
+ Java clients must use the SSL option in the connection URL to enable SSL encryption, e.g.
+ </para>
+
+<programlisting>amqp://username:password@clientid/test?brokerlist=&#39;tcp://localhost:5672?ssl=&#39;true&#39;&#39;
+</programlisting>
+
+ </listitem>
+ <listitem>
+ <para>
+ If you need to debug problems in an SSL connection, enable Java&#39;s SSL debugging by passing the argument <literal>-Djavax.net.debug=ssl</literal> to the Java JVM when starting your client.
+ </para>
+
+ </listitem>
+
+ </orderedlist>
+
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+
+ </variablelist>
+
+ </section>
+
+
+</section>
+
diff --git a/doc/book/src/Using-Broker-Federation.xml b/doc/book/src/cpp-broker/Using-Broker-Federation.xml
index f5fedf814c..f5fedf814c 100644
--- a/doc/book/src/Using-Broker-Federation.xml
+++ b/doc/book/src/cpp-broker/Using-Broker-Federation.xml
diff --git a/doc/book/src/Using-message-groups.xml b/doc/book/src/cpp-broker/Using-message-groups.xml
index 9b904d9f18..9b904d9f18 100644
--- a/doc/book/src/Using-message-groups.xml
+++ b/doc/book/src/cpp-broker/Using-message-groups.xml
diff --git a/doc/book/src/producer-flow-control.xml b/doc/book/src/cpp-broker/producer-flow-control.xml
index fd44f51e81..fd44f51e81 100644
--- a/doc/book/src/producer-flow-control.xml
+++ b/doc/book/src/cpp-broker/producer-flow-control.xml
diff --git a/doc/book/src/queue-state-replication.xml b/doc/book/src/cpp-broker/queue-state-replication.xml
index 3ffac805eb..3ffac805eb 100644
--- a/doc/book/src/queue-state-replication.xml
+++ b/doc/book/src/cpp-broker/queue-state-replication.xml
diff --git a/doc/book/src/css/style.css b/doc/book/src/css/style.css
deleted file mode 100644
index 2a1bee8623..0000000000
--- a/doc/book/src/css/style.css
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-ul {
- list-style-type:square;
-}
-
-th {
- font-weight: bold;
-}
-
-.navfooter td {
- font-size:10pt;
-}
-
-.navheader td {
- font-size:10pt;
-}
-
-body {
- width:950px;
- margin-left:100px;
- margin-top:40px;
-
- background:#FFFFFF;
- font-family:"Verdana", sans-serif;
- font-size:10pt;
-}
-
-body a {
- color:#000000;
-}
-
-
-div.book {
- margin-left:10pt;
- margin-right:10pt;
-}
-
-div.preface {
- margin-left:10pt;
- margin-right:10pt;
-}
-
-div.chapter {
- margin-left:10pt;
- margin-right:10pt;
-}
-
-div.section {
- margin-left:10pt;
- margin-right:10pt;
-}
-
-div.titlepage {
- margin-left:-10pt;
- margin-right:-10pt;
-}
-
-.calloutlist td {
- font-size:10pt;
-}
-
-.table-contents table {
- border-spacing: 0px;
-}
-
-.table-contents td {
- font-size:10pt;
- padding-left:6px;
- padding-right:6px;
-}
-
-.chapter h2.title {
- font-size:20pt;
- color:#0c3b82;
-}
-
-.chapter .section h2.title {
- font-size:18pt;
- color:#0c3b82;
-}
-
-.section h2.title {
- font-size:16pt;
- color:#0c3b82;
-}
-
-.section h3.title {
- font-size:14pt;
- color:#0c3b82;
-}
-
-.section h4.title {
- font-size:12pt;
- color:#0c3b82;
-}
-
-.section h5.title {
- font-size:12pt;
- color:#0c3b82;
-}
-
-.section h6.title {
- font-size:12pt;
- color:#0c3b82;
-}
-
-.toc a {
- font-size:9pt;
-}
-
diff --git a/doc/book/src/AMQP-Messaging-Broker-Java-Book.xml b/doc/book/src/java-broker/AMQP-Messaging-Broker-Java-Book.xml
index 0bb40052cd..0bb40052cd 100644
--- a/doc/book/src/AMQP-Messaging-Broker-Java-Book.xml
+++ b/doc/book/src/java-broker/AMQP-Messaging-Broker-Java-Book.xml
diff --git a/doc/book/src/Add-New-Users.xml b/doc/book/src/java-broker/Add-New-Users.xml
index dc34bcc5c9..dc34bcc5c9 100644
--- a/doc/book/src/Add-New-Users.xml
+++ b/doc/book/src/java-broker/Add-New-Users.xml
diff --git a/doc/book/src/java-broker/Broker-Configuration-Guide.xml b/doc/book/src/java-broker/Broker-Configuration-Guide.xml
new file mode 100644
index 0000000000..28a2e9f2d3
--- /dev/null
+++ b/doc/book/src/java-broker/Broker-Configuration-Guide.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+<section id="Java-Broker-Configuration-Guide">
+ <title>Broker Configuration Guide </title>
+
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
+ href="Topic-Configuration.xml"/>
+</section>
diff --git a/doc/book/src/Configure-ACLs.xml b/doc/book/src/java-broker/Configure-ACLs.xml
index e82f2a86d0..e82f2a86d0 100644
--- a/doc/book/src/Configure-ACLs.xml
+++ b/doc/book/src/java-broker/Configure-ACLs.xml
diff --git a/doc/book/src/Configure-Java-Qpid-to-use-a-SSL-connection.xml b/doc/book/src/java-broker/Configure-Java-Qpid-to-use-a-SSL-connection.xml
index 838b899337..838b899337 100644
--- a/doc/book/src/Configure-Java-Qpid-to-use-a-SSL-connection.xml
+++ b/doc/book/src/java-broker/Configure-Java-Qpid-to-use-a-SSL-connection.xml
diff --git a/doc/book/src/Configure-Log4j-CompositeRolling-Appender.xml b/doc/book/src/java-broker/Configure-Log4j-CompositeRolling-Appender.xml
index f52bc55399..f52bc55399 100644
--- a/doc/book/src/Configure-Log4j-CompositeRolling-Appender.xml
+++ b/doc/book/src/java-broker/Configure-Log4j-CompositeRolling-Appender.xml
diff --git a/doc/book/src/Configure-the-Broker-via-config.xml.xml b/doc/book/src/java-broker/Configure-the-Broker-via-config.xml.xml
index 6a7729acd8..6a7729acd8 100644
--- a/doc/book/src/Configure-the-Broker-via-config.xml.xml
+++ b/doc/book/src/java-broker/Configure-the-Broker-via-config.xml.xml
diff --git a/doc/book/src/Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml b/doc/book/src/java-broker/Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml
index 804970b923..804970b923 100644
--- a/doc/book/src/Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml
+++ b/doc/book/src/java-broker/Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml
diff --git a/doc/book/src/Configuring-Management-Users.xml b/doc/book/src/java-broker/Configuring-Management-Users.xml
index a2a8d46d88..a2a8d46d88 100644
--- a/doc/book/src/Configuring-Management-Users.xml
+++ b/doc/book/src/java-broker/Configuring-Management-Users.xml
diff --git a/doc/book/src/Configuring-Qpid-JMX-Management-Console.xml b/doc/book/src/java-broker/Configuring-Qpid-JMX-Management-Console.xml
index 72e4ba8969..72e4ba8969 100644
--- a/doc/book/src/Configuring-Qpid-JMX-Management-Console.xml
+++ b/doc/book/src/java-broker/Configuring-Qpid-JMX-Management-Console.xml
diff --git a/doc/book/src/Debug-using-log4j.xml b/doc/book/src/java-broker/Debug-using-log4j.xml
index 615fd9e560..615fd9e560 100644
--- a/doc/book/src/Debug-using-log4j.xml
+++ b/doc/book/src/java-broker/Debug-using-log4j.xml
diff --git a/doc/book/src/How-to-Tune-M3-Java-Broker-Performance.xml b/doc/book/src/java-broker/How-to-Tune-M3-Java-Broker-Performance.xml
index f7fffbaceb..f7fffbaceb 100644
--- a/doc/book/src/How-to-Tune-M3-Java-Broker-Performance.xml
+++ b/doc/book/src/java-broker/How-to-Tune-M3-Java-Broker-Performance.xml
diff --git a/doc/book/src/How-to-Use-SlowConsumerDisconnect.xml b/doc/book/src/java-broker/How-to-Use-SlowConsumerDisconnect.xml
index 4e0ce0f7e0..4e0ce0f7e0 100644
--- a/doc/book/src/How-to-Use-SlowConsumerDisconnect.xml
+++ b/doc/book/src/java-broker/How-to-Use-SlowConsumerDisconnect.xml
diff --git a/doc/book/src/Java-Broker-Feature-Guide.xml b/doc/book/src/java-broker/Java-Broker-Feature-Guide.xml
index bbc2a1aaf0..bbc2a1aaf0 100644
--- a/doc/book/src/Java-Broker-Feature-Guide.xml
+++ b/doc/book/src/java-broker/Java-Broker-Feature-Guide.xml
diff --git a/doc/book/src/Java-Environment-Variables.xml b/doc/book/src/java-broker/Java-Environment-Variables.xml
index 12703190f2..12703190f2 100644
--- a/doc/book/src/Java-Environment-Variables.xml
+++ b/doc/book/src/java-broker/Java-Environment-Variables.xml
diff --git a/doc/book/src/java-broker/Makefile b/doc/book/src/java-broker/Makefile
new file mode 100644
index 0000000000..0266a0f54d
--- /dev/null
+++ b/doc/book/src/java-broker/Makefile
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+include ../Makefile.inc
diff --git a/doc/book/src/java-broker/Management-Console-Security.xml b/doc/book/src/java-broker/Management-Console-Security.xml
new file mode 100644
index 0000000000..31f63c70da
--- /dev/null
+++ b/doc/book/src/java-broker/Management-Console-Security.xml
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+<section><title>
+ Management Console Security
+ </title><section role="h1" id="ManagementConsoleSecurity-ManagementConsoleSecurity"><title>
+ Management
+ Console Security
+ </title>
+ <itemizedlist>
+ <listitem><para>
+ <xref linkend="ManagementConsoleSecurity-SSLencryptedRMI-280.5andabove-29"/>
+ </para></listitem>
+ <listitem><para>
+ <xref linkend="ManagementConsoleSecurity-JMXMP-28M4andprevious-29"/>
+ </para></listitem>
+ <listitem><para>
+ <xref linkend="ManagementConsoleSecurity-UserAccounts-26AccessRights"/>
+ </para></listitem>
+ </itemizedlist>
+ <section role="h2" id="ManagementConsoleSecurity-SSLencryptedRMI-280.5andabove-29"><title>
+ SSL
+ encrypted RMI (0.5 and above)
+ </title>
+ <para>
+ Current versions of the broker make use of SSL encryption to
+ secure their RMI based JMX ConnectorServer for security purposes.
+ This ships enabled by default, although the test SSL keystore
+ used during development is not provided for security reasons
+ (using this would provide no security as anyone could have access
+ to it).
+ </para><section role="h3" id="ManagementConsoleSecurity-BrokerConfiguration"><title>
+ Broker
+ Configuration
+ </title>
+
+ <para>
+ The broker configuration must be updated before the broker will
+ start. This can be done either by disabling the SSL support,
+ utilizing a purchased SSL certificate to create a keystore of
+ your own, or generating a self-signed keystore.
+ </para><para>
+ The broker must be configured with a keystore containing the
+ private and public keys associated with its SSL certificate. This
+ is accomplished by setting the Java environment properties
+ <emphasis>javax.net.ssl.keyStore</emphasis> and
+ <emphasis>javax.net.ssl.keyStorePassword</emphasis> respectively with the
+ location and password of an appropriate SSL keystore. Entries for
+ these properties exist in the brokers main configuration file
+ alongside the other management settings (see below), although the
+ command line options will still work and take precedence over the
+ configuration file.
+ </para>
+ <programlisting>
+&lt;management&gt;
+ &lt;ssl&gt;
+ &lt;enabled&gt;true&lt;/enabled&gt;
+ &lt;!-- Update below path to your keystore location, eg ${conf}/qpid.keystore --&gt;
+ &lt;keyStorePath&gt;${conf}/qpid.keystore&lt;/keyStorePath&gt;
+ &lt;keyStorePassword&gt;password&lt;/keyStorePassword&gt;
+ &lt;/ssl&gt;
+&lt;/management&gt;
+</programlisting>
+<!--h3--></section>
+
+ <section role="h3" id="ManagementConsoleSecurity-JMXManagementConsoleConfiguration"><title>
+ JMX
+ Management Console Configuration
+ </title>
+
+ <para>
+ If the broker makes use of an SSL certificate signed by a known
+ signing CA (Certification Authority), the management console
+ needs no extra configuration, and will make use of Java's
+ built-in CA
+ truststore for certificate verification (you may however have to
+ update the system-wide default truststore if your CA is not
+ already present in it).
+ </para><para>
+ If however you wish to use a self-signed SSL certificate, then
+ the management console must be provided with an SSL truststore
+ containing a record for the SSL certificate so that it is able to
+ validate it when presented by the broker. This is performed by
+ setting the <emphasis>javax.net.ssl.trustStore</emphasis> and
+ <emphasis>javax.net.ssl.trustStorePassword</emphasis> environment variables
+ when starting the console. This can be done at the command line,
+ or alternatively an example configuration has been made within
+ the console's qpidmc.ini launcher configuration file that may
+ pre-configured in advance for repeated usage. See the <xref linkend="Qpid-JMX-Management-Console-User-Guide"/> for more
+ information on this configuration process.
+ </para>
+<!--h3--></section>
+
+ <section role="h3" id="ManagementConsoleSecurity-JConsoleConfiguration"><title>
+ JConsole
+ Configuration
+ </title>
+
+ <para>
+ As with the JMX Management Console above, if the broker is using
+ a self-signed SSL certificate then in order to connect remotely
+ using JConsole, an appropriate trust store must be provided at
+ startup. See <xref linkend="qpid_JConsole"/> for further details on configuration.
+ </para>
+<!--h3--></section>
+
+ <section role="h3" id="ManagementConsoleSecurity-AdditionalInformation"><title>
+ Additional
+ Information
+ </title>
+
+ <para>
+ More information on Java's handling of SSL certificate
+ verification and customizing the keystores can be found in the
+ <ulink url="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores">http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores</ulink>.
+ </para>
+<!--h3--></section>
+<!--h2--></section>
+
+
+
+ <section role="h2" id="ManagementConsoleSecurity-JMXMP-28M4andprevious-29"><title>
+ JMXMP
+ (M4 and previous)
+ </title>
+
+ <para>
+ In previous releases of Qpid (M4 and below) the broker, can make
+ use of Sun's Java Management Extensions Messaging Protocol
+ (JMXMP) to provide encryption of the JMX connection, offering
+ increased security over the default unencrypted RMI based JMX
+ connection.
+ </para><section role="h3" id="ManagementConsoleSecurity-DownloadandInstall"><title>
+ Download and
+ Install
+ </title>
+
+ <para>
+ This is possible by adding the jmxremote_optional.jar as provided
+ by Sun. This jar is covered by the Sun Binary Code License and is
+ not compatible with the Apache License which is why this
+ component is not bundled with Qpid.
+ </para><para>
+ Download the JMX Remote API 1.0.1_04 Reference Implementation
+ from <xref linkend="qpid_download.jsp"/>. The included
+ 'jmxremote-1_0_1-bin\lib\jmxremote_optional.jar' file must be
+ added to the broker classpath:
+ </para><para>
+ First set your classpath to something like this:
+ </para>
+ <programlisting>
+CLASSPATH=jmxremote_optional.jar
+</programlisting>
+ <para>
+ Then, run qpid-server passing the following additional flag:
+ </para>
+ <programlisting>
+qpid-server -run:external-classpath=first
+</programlisting>
+ <para>
+ Following this the configuration option can be updated to enabled
+ use of the JMXMP based JMXConnectorServer.
+ </para>
+<!--h3--></section>
+
+ <section role="h3" id="ManagementConsoleSecurity-BrokerConfiguration2"><title>
+ Broker
+ Configuration
+ </title>
+
+ <para>
+ To enabled this security option change the
+ <emphasis>security-enabled</emphasis> value in your broker configuration
+ file.
+ </para>
+ <programlisting>
+ &lt;management&gt;
+ &lt;security-enabled&gt;true&lt;/security-enabled&gt;
+ &lt;/management&gt;
+</programlisting>
+ <para>
+ You may also (for M2 and earlier) need to set the following
+ system properties using the environment variable QPID_OPTS:
+ </para><para>
+ QPID_OPTS="-Dcom.sun.management.jmxremote
+ -Dcom.sun.management.jmxremote.port=8999
+ -Dcom.sun.management.jmxremote.authenticate=false
+ -Dcom.sun.management.jmxremote.ssl=false"
+ </para>
+<!--h3--></section>
+
+ <section role="h3" id="ManagementConsoleSecurity-JMXManagementConsoleConfiguration-2"><title>
+ JMX
+ Management Console Configuration
+ </title>
+
+ <para>
+ If you wish to connect to a broker configured to use JMXMP then
+ the console also requires provision of the Optional sections of
+ the JMX Remote API that are not included within the JavaSE
+ platform.
+ </para><para>
+ In order to make it available to the console, place the
+ 'jmxremote_optional.jar' (rename the file if any additional
+ information is present in the file name) jar file within the
+ 'plugins/jmxremote.sasl_1.0.1/' folder of the console release (on
+ Mac OS X you will need to select 'Show package contents' from the
+ context menu whilst selecting the management console bundle in
+ order to reveal the inner file tree).
+ </para><para>
+ Following the the console will automatically load the JMX Remote
+ Optional classes and attempt the JMXMP connection when connecting
+ to a JMXMP enabled broker.
+ </para>
+<!--h3--></section>
+<!--h2--></section>
+
+ <section role="h2" id="ManagementConsoleSecurity-UserAccounts-26AccessRights"><title>
+ User
+ Accounts &amp; Access Rights
+ </title>
+
+ <para>
+ In order to access the management operations via JMX, users must
+ have an account and have been assigned appropriate access rights.
+ See <xref linkend="qpid_Configuring-Management-Users"/>
+ </para>
+<!--h2--></section>
+<!--h1--></section>
+
+
+</section>
diff --git a/doc/book/src/MessageStore-Tool.xml b/doc/book/src/java-broker/MessageStore-Tool.xml
index fdcb3cd560..fdcb3cd560 100644
--- a/doc/book/src/MessageStore-Tool.xml
+++ b/doc/book/src/java-broker/MessageStore-Tool.xml
diff --git a/doc/book/src/Qpid-JMX-Management-Console-FAQ.xml b/doc/book/src/java-broker/Qpid-JMX-Management-Console-FAQ.xml
index 1806ab01b1..1806ab01b1 100644
--- a/doc/book/src/Qpid-JMX-Management-Console-FAQ.xml
+++ b/doc/book/src/java-broker/Qpid-JMX-Management-Console-FAQ.xml
diff --git a/doc/book/src/java-broker/Qpid-JMX-Management-Console-User-Guide.xml b/doc/book/src/java-broker/Qpid-JMX-Management-Console-User-Guide.xml
new file mode 100644
index 0000000000..35bb5dfbe8
--- /dev/null
+++ b/doc/book/src/java-broker/Qpid-JMX-Management-Console-User-Guide.xml
@@ -0,0 +1,793 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+<section id="Qpid-JMX-Management-Console-User-Guide"><title>
+ Qpid JMX Management Console User Guide
+ </title><section role="h1" id="QpidJMXManagementConsoleUserGuide-QpidJMXManagementConsoleUserGuide"><title>
+ Qpid JMX Management Console User Guide
+ </title>
+
+
+ <para>
+
+ The Qpid JMX Management Console is a standalone Eclipse RCP
+ application for managing and monitoring the Qpid Java server
+ utilising its JMX management interfaces.
+ </para><para>
+ This guide will give an overview of configuring the console, the
+ features supported by it, and how to make use of the console in
+ managing the various JMX Management Beans (MBeans) offered by the
+ Qpid Java server.
+ </para>
+<!--h1--></section>
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-Startup-26Configuration"><title>
+
+ Startup &amp; Configuration
+ </title>
+
+ <para>
+
+ </para>
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-Startup"><title>
+ Startup
+ </title>
+
+ <para>
+
+ The console can be started in the following way, depending on
+ platform:
+ </para><itemizedlist>
+ <listitem><para>
+ <emphasis>Windows:</emphasis> by running the <emphasis>qpidmc.exe</emphasis> executable
+ file.
+ </para></listitem>
+ <listitem><para>
+ <emphasis>Linux:</emphasis> by running the <emphasis>qpidmc</emphasis> executable.
+ </para></listitem>
+ <listitem><para>
+ <emphasis>Mac OS X:</emphasis> by launching the <emphasis>Qpid Management
+ Console.app</emphasis> application bundle.
+ </para></listitem>
+ </itemizedlist><para>
+
+ </para>
+ </section>
+
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-SSLconfiguration"><title>
+ SSL
+ configuration
+ </title>
+
+ <para>
+
+ Newer Qpid Java servers can protect their JMX connections with
+ SSL, and this is enabled by default. When attempting to connect
+ to a server with this enabled, the console must be able to verify
+ the SSL certificate presented to it by the server or the
+ connection will fail.
+ </para><para>
+ If the server makes use of an SSL certificate signed by a known
+ Signing CA (Certification Authority) then the console needs no
+ extra configuration, and will make use of Java's default
+ system-wide CA TrustStore for certificate verification (you may
+ however have to update the system-wide default CA TrustStore if
+ your certified is signed by a less common CA that is not already
+ present in it).
+ </para><para>
+ If however the server is equipped with a self-signed SSL
+ certificate, then the management console must be provided with an
+ appropriate SSL TrustStore containing the public key for the SSL
+ certificate, so that it is able to validate it when presented by
+ the server. The server ships with a script to create an example
+ self-signed SSL certificate, and store the relevant entries in a
+ KeyStore and matching TrustStore. This script can serve as a
+ guide on how to use the Java Keytool security utility to
+ manipulate your own stores, and more information can be found in
+ the JSSE Reference Guide:
+ <ulink url="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores">http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores</ulink>.
+ </para><para>
+ Supplying the necessary details to the console is performed by
+ setting the <emphasis>javax.net.ssl.trustStore</emphasis> and
+ <emphasis>javax.net.ssl.trustStorePassword</emphasis> environment variables
+ when starting it. This can be done at the command line, but the
+ preferred option is to set the configuration within the
+ <emphasis>qpidmc.ini</emphasis> launcher configuration file for repeated
+ usage. This file is equipped with a template to ease
+ configuration, this should be uncommented and edited to suit your
+ needs. It can be found in the root of the console releases for
+ Windows, and Linux. For Mac OS X the file is located within the
+ consoles <emphasis>.app</emphasis> application bundle, and to locate and edit
+ it you must select <emphasis>'Show Package Contents'</emphasis> when
+ accessing the context menu of the application, then browse to the
+ <emphasis>Contents/MacOS</emphasis> sub folder to locate the file.
+ </para>
+<!--h2--></section>
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-JMXMPconfiguration"><title>
+ JMXMP
+ configuration
+ </title>
+
+ <para>
+
+ Older releases of the Qpid Java server can make use of the Java
+ Management Extensions Messaging Protocol (JMXMP) to provide
+ protection for their JMX connections. This occurs when the server
+ has its main configuration set with the management
+ <emphasis>'security-enabled'</emphasis> property set to true.
+ </para><para>
+ In order to connect to this configuration of server, the console
+ needs an additional library that is not included within the Java
+ SE platform and cannot be distributed with the console due to
+ licensing restrictions.
+ </para><para>
+ You can download the JMX Remote API 1.0.1_04 Reference
+ Implementation from the Sun website <xref linkend="qpid_download.jsp"/>. The included
+ <emphasis>jmxremote-1_0_1-bin/lib/jmxremote_optional.jar</emphasis> file must
+ be added to the <emphasis>plugins/jmxremote.sasl_1.0.1</emphasis> folder of
+ the console release (again, in Mac OS X you will need to select
+ <emphasis>'Show package contents'</emphasis> from the context menu whilst
+ selecting the management console bundle in order to reveal the
+ inner file tree).
+ </para><para>
+ Following this the console will automatically load the JMX Remote
+ Optional classes and negotiate the SASL authentication profile
+ type when encountering a JMXMP enabled Qpid Java server.
+ </para>
+<!--h2--></section>
+<!--h1--></section>
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingServerConnections"><title>
+
+ Managing Server Connections
+ </title>
+
+ <para>
+
+ </para>
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-MainToolbar"><title>
+ Main Toolbar
+ </title>
+
+ <para>
+
+ The main toolbar of the console can be seen in the image below.
+ The left most buttons respectively allow for adding a new server
+ connection, reconnecting to an existing server selected in the
+ connection tree, disconnecting the selected server connection,
+ and removing the server from the connection tree.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113098.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+
+
+ Beside these buttons is a combo for selecting the refresh
+ interval; that is, how often the console requests updated
+ information to display for the currently open area in the main
+ view. Finally, the right-most button enables an immediate update.
+ </para>
+ </section>
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-Connectingtoanewserver"><title>
+ Connecting
+ to a new server
+ </title>
+
+ <para>
+
+ To connect to a new server, press the <emphasis>Add New Server</emphasis>
+ toolbar button, or select the <emphasis>Qpid Manager -&gt; Add New
+ Connection</emphasis> menu item. At this point a dialog box will be
+ displayed requesting the server details, namely the server
+ hostname, management port, and a username and password. An
+ example is shown below:
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113099.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+
+ Once all the required details are entered, pressing Connect will
+ initiate a connection attempt to the server. It the attempt fails
+ a reason will be shown and the server will not be added to the
+ connection tree. If the attempt is successful the server will be
+ added to the connections list and the entry expanded to show the
+ initial administration MBeans the user has access to and any
+ VirtualHosts present on the server, as can be seen in the figure
+ below.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113100.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+
+ If the server supports a newer management API than the console in
+ use, once connected this initial screen will contain a message on
+ the right, indicating an upgraded console should be sought by the
+ user to ensure all management functionality supported by the
+ server is being utilised.
+ </para>
+<!--h2--></section>
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-Reconnectingtoaserver"><title>
+ Reconnecting
+ to a server
+ </title>
+
+ <para>
+
+ If a server has been connected to previously, it will be saved as
+ an entry in the connection tree for further use. On subsequent
+ connections the server can simply be selected from the tree and
+ using the <emphasis>Reconnect</emphasis> toolbar button or <emphasis>Qpid Manager
+ -&gt; Reconnect</emphasis> menu item. At this stage the console will
+ prompt simply for the username and password with which the user
+ wishes to connect, and following a successful connection the
+ screen will appear as shown previously above.
+ </para>
+<!--h2--></section>
+
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-Disconnectingfromaserver"><title>
+ Disconnecting
+ from a server
+ </title>
+
+ <para>
+
+ To disconnect from a server, select the connection tree node for
+ the server and press the <emphasis>Disconnect</emphasis> toolbar button, or
+ use the <emphasis>Qpid Manager -&gt; Disconnect</emphasis> menu option.
+ </para>
+<!--h2--></section>
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-Removingaserver"><title>
+ Removing a
+ server
+ </title>
+
+ <para>
+
+ To remove a server from the connection list, select the
+ connection tree node for the server and press the <emphasis>Remove</emphasis>
+ toolbar button, or use the <emphasis>Qpid Manager -&gt; Remove
+ Connection</emphasis> menu option.
+ </para>
+<!--h2--></section>
+<!--h1--></section>
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-Navigatingaconnectedserver"><title>
+ Navigating a connected server
+ </title>
+
+ <para>
+
+ Once connected to a server, the various areas available for
+ administration are accessed using the Qpid Connections tree at
+ the left side of the application. To open a particular MBean from
+ the tree for viewing, simply select it in the tree and it will be
+ opened in the main view.
+ <mediaobject><imageobject><imagedata fileref="images/3113101.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ As there may be vast numbers of Queues, Connections, and
+ Exchanges on the server these MBeans are not automatically added
+ to the tree along with the general administration MBeans.
+ Instead, dedicated selection areas are provided to allow users to
+ select which Queue/Connection/Exchange they wish to view or add
+ to the tree. These areas can be found by clicking on the
+ Connections, Exchanges, and Queues nodes in the tree under each
+ VirtualHost, as shown in the figure above. One or more MBeans may
+ be selected and added to the tree as Favourites using the button
+ provided. These settings are saved for future use, and each time
+ the console connects to the server it will check for the presence
+ of the MBean previously in the tree and add them if they are
+ still present. Queue/Connection/Exchange MBeans can be removed
+ from the tree by right clicking on them to expose a context menu
+ allowing deletion.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113102.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ As an alternative way to open a particular MBean for viewing,
+ without first adding it to the tree, you can simply double click
+ an entry in the table within the Queue/Connection/Exchange
+ selection areas to open it immediately. It is also possible to
+ open some MBeans like this whilst viewing certain other MBeans.
+ When opening an MBean in either of these ways, a Back button is
+ enabled in the top right corner of the main view. Using this
+ button will return you to the selection area or MBean you were
+ previously viewing. The history resets each time the tree is used
+ to open a new area or MBean.
+ </para>
+<!--h1--></section>
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-ConfigurationManagementMBean"><title>
+
+ ConfigurationManagement MBean
+ </title>
+
+ <para>
+
+ The ConfigurationManagement MBean is available on newer servers,
+ to users with admin level management rights. It offers the
+ ability to perform a live reload of the <emphasis>Security</emphasis>
+ sections defined in the main server configuration file (e.g.
+ defaults to: <emphasis>etc/config.xml</emphasis>). This is mainly to allow
+ updating the server Firewall configuration to new settings
+ without a restart, and can be performed by clicking the Execute
+ button and confirming the prompt which follows.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113103.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para>
+<!--h1--></section>
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-LoggingManagementMBean"><title>
+
+ LoggingManagement MBean
+ </title>
+
+ <para>
+
+ The LoggingManagement MBean is available on newer servers, and
+ accessible by admin level users. It allows live alteration of the
+ logging behaviour, both at a Runtime-only level and at the
+ configuration file level. The latter can optionally affect the
+ Runtime configuration, either through use of the servers
+ automated LogWatch ability which detects changes to the
+ configuration file and reloads it, or by manually requesting a
+ reload. This functionality is split across two management tabs,
+ Runtime Options and ConfigurationFile Options.
+ </para>
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-RuntimeOptions"><title>
+ Runtime
+ Options
+ </title>
+
+ <para>
+
+ <mediaobject><imageobject><imagedata fileref="images/3113104.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ The Runtime Options tab allows manipulation of the logging
+ settings without affecting the configuration files (this means
+ the changes will be lost when the server restarts), and gives
+ individual access to every Logger active within the server.
+ </para><para>
+ As shown in the figure above, the table in this tab presents the
+ Effective Level of each Logger. This is because the Loggers form
+ a hierarchy in which those without an explicitly defined (in the
+ logging configuration file) Level will inherit the Level of their
+ immediate parent; that is, the Logger whose full name is a prefix
+ of their own, or if none satisfy that condition then the
+ RootLogger is their parent. As example, take the
+ <emphasis>org.apache.qpid</emphasis> Logger. It is parent to all those below
+ it which begin with <emphasis>org.apache.qpid</emphasis> and unless they have
+ a specific Level of their own, they will inherit its Level. This
+ can be seen in the figure, whereby all the children Loggers
+ visible have a level of WARN just like their parent, but the
+ RootLogger Level is INFO; the children have inherited the WARN
+ level from <emphasis>org.apache.qpid</emphasis> rather than INFO from the
+ RootLogger.
+ </para><para>
+ To aid with this distinction, the Logger Levels that are
+ currently defined in the configuration file are highlighted in
+ the List. Changing these levels at runtime will also change the
+ Level of all their children which haven't been set their own
+ Level using the runtime options. In the latest versions of the
+ LoggingManagement MBean, it is possible to restore a child logger
+ that has had an explicit level se, to inheriting that of its
+ parent by setting it to an INHERITED level that removes any
+ previously set Level of its own.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113105.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ In order to set one of more Loggers to a new Level, they should
+ be selected in the table (or double click an individual Logger to
+ modify it) and the <emphasis>Edit Selected Logger(s)</emphasis> button
+ pressed to load the dialog shown above. At this point, any of the
+ available Levels supported by the server can be applied to the
+ Loggers selected and they will immediately update, as will any
+ child Loggers without their own specific Level.
+ </para><para>
+ The RootLogger can be similarly edited using the button at the
+ bottom left of the window.
+ </para>
+<!--h2--></section>
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-ConfigurationFileOptions"><title>
+ ConfigurationFile
+ Options
+ </title>
+
+ <para>
+
+ The ConfigurationFile Options tab allows alteration of the Level
+ settings for the Loggers defined in the configuration file,
+ allowing changes to persist following a restart of the server.
+ Changes made to the configuration file are only applied
+ automatically while the sever is running if it was configured to
+ enable the LogWatch capability, meaning it will monitor the
+ configuration file for changes and apply the new configuration
+ when the change is detected. If this was not enabled, the changes
+ will be picked up when the server is restarted. The status of the
+ LogWatch feature is shown at the bottom of the tab.
+ Alternatively, in the latest versions of the LoggingManagement
+ MBean it is possible to reload the logging configuration file on
+ demand.
+ </para><para>
+ Manipulating the Levels is as on the Runtime Options tab, either
+ double-click an individual Logger entry or select multiple
+ Loggers and use the button to load the dialog to set the new
+ Level.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113106.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ One issue to note of when reloading the configuration file
+ settings, either automatically using LogWatch or manually, is
+ that any Logger set to a specific Level using the Runtime Options
+ tab that is not defined in the configuration file will maintain
+ that Level when the configuration file is reloaded. In other
+ words, if a Logger is defined in the configuration file, then the
+ configuration file will take precedence at reload, otherwise the
+ Runtime options take precedence.
+ </para><para>
+ This situation will be immediately obvious by examining the
+ Runtime Options tab to see the effective Level of each Logger
+ – unless it has been altered with the RuntimeOptions or
+ specifically set in the configuration file, a Logger Level should
+ match that of its parent. In the latest versions of the
+ LoggingManagement MBean, it is possible to use the RuntimeOptions
+ to restore a child logger to inheriting from its parent by
+ setting it with an INHERITED level that removes any previously
+ set Level of its own.
+
+ </para>
+<!--h2--></section>
+<!--h1--></section>
+
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-ServerInformationMBean"><title>
+ ServerInformation MBean
+ </title>
+
+ <para>
+
+ <mediaobject><imageobject><imagedata fileref="images/3113107.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ The ServerInformation MBean currently only conveys various pieces
+ of version information to allow precise identification of the
+ server version and its management capabilities. In future it is
+ likely to convey additional server-wide details and/or
+ functionality.
+ </para>
+<!--h1--></section>
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-UserManagementMBean"><title>
+
+ UserManagement MBean
+ </title>
+
+ <para>
+
+ The UserManagement MBean is accessible by admin level users, and
+ allows manipulation of existing user accounts and creation of new
+ user accounts.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113108.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+
+ To add a new user, press the <emphasis>Add New User</emphasis> button, which
+ will load the dialog shown below.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113109.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ Here you may enter the new users Username, Password, and select
+ their JMX Management Rights. This controls whether or not they
+ have access to the management interface, and if so what
+ capabilities are accessible. <emphasis>Read Only</emphasis> access allows
+ undertaking any operations that do not alter the server state,
+ such as viewing messages. <emphasis>Read + Write</emphasis> access allows use
+ of all operations which are not deemed admin-only (such as those
+ in the UserManagement MBean itself). <emphasis>Admin</emphasis> access allows
+ a user to utilize any operation, and view the admin-only MBeans
+ (currently these are ConfigurationManagement, LoggingManagement,
+ and UserManagement).
+ </para><para>
+ One or more users at a time may be deleted by selecting them in
+ the table and clicking the <emphasis>Delete User(s)</emphasis> button. The
+ console will then prompt for confirmation before undertaking the
+ removals. Similarly, the access rights for one or more users may
+ be updated by selecting them in the table and clicking the
+ <emphasis>Set Rights</emphasis> button. The console will then display a
+ dialog enabling selection of the new access level and
+ confirmation to undertake the update.
+ </para><para>
+ An individual user password may be updated by selecting the user
+ in the table in and clicking the <emphasis>Set Password</emphasis> button.
+ The console will then display a dialog enabling input of the new
+ password and confirmation to undertake the update.
+ </para><para>
+
+ The server caches the user details in memory to aid performance.
+ If may sometimes be necessary to externally modify the password
+ and access right files on disk. In order for these changes to be
+ known to the server without a restart, it must be instructed to
+ reload the file contents. This can be done using the provided
+ <emphasis>Reload User Details</emphasis> button (on older servers, only the
+ management rights file is reloaded, on newer servers both files
+ are. The description on screen will indicate the behaviour).
+ After pressing this button the console will seek confirmation
+ before proceeding.
+ </para>
+<!--h1--></section>
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-VirtualHostManagerMBean"><title>
+
+ VirtualHostManager MBean
+ </title>
+
+ <para>
+
+ Each VirtualHost in the server has an associated
+ VirtualHostManager MBean. This allows viewing, creation, and
+ deletion of Queues and Exchanges within the VirtualHost.
+ </para><para>
+ Clicking the <emphasis>Create</emphasis> button in the Queue section will
+ open a dialog allowing specification of the Name, Owner
+ (optional), and durability properties of the new Queue, and
+ confirmation of the operation.
+ </para><para>
+ One or more Queues may be deleted by selecting them in the table
+ and clicking the <emphasis>Delete</emphasis> button. This will unregister the
+ Queue bindings, remove the subscriptions and delete the Queue(s).
+ The console will prompt for confirmation before undertaking the
+ operation.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113110.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ Clicking the <emphasis>Create</emphasis> button in the Exchange section will
+ open a dialog allowing specification of the Name, Type, and
+ Durable attributes of the new Exchange, and confirmation of the
+ operation.
+ </para><para>
+ One or more Exchanges may be deleted by selecting them in the
+ table and clicking the <emphasis>Delete</emphasis> button. This will
+ unregister all the related channels and Queue bindings then
+ delete the Exchange(s). The console will prompt for confirmation
+ before undertaking the operation.
+ </para><para>
+
+ Double-clicking on a particular Queue or Exchange name in the
+ tables will open the MBean representing it.
+ </para>
+<!--h1--></section>
+
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-Notifications"><title>
+
+ Notifications
+ </title>
+
+ <para>
+
+ MBeans on the server can potentially send Notifications that
+ users may subscribe to. When managing an individual MBean that
+ offers Notifications types for subscription, the console supplies
+ a Notifications tab to allow (un)subscription to the
+ Notifications if desired and viewing any that are received
+ following subscription.
+ </para><para>
+ In order to provide quicker access to/awareness of any received
+ Notifications, each VirtualHost area in the connection tree has a
+ Notifications area that aggregates all received Notifications for
+ MBeans in that VirtualHost. An example of this can be seen in the
+ figure below.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113111.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ All received Notifications will be displayed until such time as
+ the user removes them, either in this aggregated view, or in the
+ Notifications area of the individual MBean that generated the
+ Notification.
+ </para><para>
+ They may be cleared selectively or all at once. To clear
+ particular Notifications, they should be selected in the table
+ before pressing the <emphasis>Clear</emphasis> button. To clear all
+ Notifications, simply press the <emphasis>Clear</emphasis> button without
+ anything selected in the table, at which point the console will
+ request confirmation of this clear-all action.
+ </para>
+<!--h1--></section>
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingQueues"><title>
+ Managing
+ Queues
+ </title>
+
+ <para>
+
+ As mentioned in earlier discussion of Navigation, Queue MBeans
+ can be opened either by double clicking an entry in the Queues
+ selection area, or adding a queue to the tree as a favourite and
+ clicking on its tree node. Unique to the Queue selection screen
+ is the ability to view additional attributes beyond just that of
+ the Queue Name. This is helpful for determining which Queues
+ satisfy a particular condition, e.g. having &lt;X&gt; messages on
+ the queue. The example below shows the selection view with
+ additional attributes <emphasis>Consumer Count, Durable, MessageCount,
+ and QueueDepth</emphasis> (selected using the <emphasis>Select
+ Attributes</emphasis> button at the bottom right corner of the
+ table)<emphasis>.</emphasis>
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113112.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ Upon opening a Queue MBean, the Attributes tab is displayed, as
+ shown below. This allows viewing the value all attributes,
+ editing those which are writable values (highlighted in blue) if
+ the users management permissions allow, viewing descriptions of
+ their purpose, and graphing certain numerical attribute values as
+ they change over time.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113113.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ The next tab contains the operations that can be performed on the
+ queue. The main table serves as a means of viewing the messages
+ on the queue, and later for selecting specific messages to
+ operate upon. It is possible to view any desired range of
+ messages on the queue by specifying the visible range using the
+ fields at the top and pressing the <emphasis>Set</emphasis> button. Next to
+ this there are helper buttons to enable faster browsing through
+ the messages on the queue; these allow moving forward and back by
+ whatever number of messages is made visible by the viewing range
+ set. The Queue Position column indicates the position of each
+ message on the queue, but is only present when connected to newer
+ servers as older versions cannot provide the necessary
+ information to show this (unless only a single message position
+ is requested).
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113114.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ Upon selecting a message in the table, its header properties and
+ redelivery status are updated in the area below the table. Double
+ clicking a message in the table (or using the <emphasis>View Message
+ Content</emphasis> button to its right) will open a dialog window
+ displaying the contents of the message.
+ </para><para>
+ One or more messages can be selected in the table and moved to
+ another queue in the VirtualHost by using the <emphasis>Move
+ Message(s)</emphasis> button, which opens a dialog to enable selection
+ of the destination and confirmation of the operation. Newer
+ servers support the ability to similarly copy the selected
+ messages to another queue in a similar fashion, or delete the
+ selected messages from the queue after prompting for
+ confirmation.
+ </para><para>
+ Finally, all messages (that have not been acquired by consumers)
+ on the queue can be deleted using the <emphasis>Clear Queue</emphasis>
+ button, which will generate a prompt for confirmation. On newer
+ servers, the status bar at the lower left of the application will
+ report the number of messages actually removed.
+ </para>
+<!--h1--></section>
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingExchanges"><title>
+
+ Managing Exchanges
+ </title>
+
+ <para>
+ Exchange MBeans are opened for management operations in similar
+ fashion as described for Queues, again showing an Attributes tab
+ initially, with the Operations tab next:
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113115.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ Of the four default Exchange Types <emphasis>(direct, fanout, headers,
+ and topic)</emphasis> all but <emphasis>headers</emphasis> have their bindings
+ presented in the format shown above. The left table provides the
+ binding/routing keys present in the exchange. Selecting one of
+ these entries in the table prompts the right table to display all
+ the queues associated with this key. Pressing the <emphasis>Create</emphasis>
+ button opens a dialog allowing association of an existing queue
+ with the entered Binding.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113116.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ The <emphasis>headers</emphasis> Exchange type (default instantiation
+ <emphasis>amq.match or amq.headers</emphasis>) is presented as below:
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113117.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ In the previous figure, the left table indicates the binding
+ number, and the Queue associated with the binding. Selecting one
+ of these entries in the table prompts the right table to display
+ the header values that control when the binding matches an
+ incoming message.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113118.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ Pressing the <emphasis>Create</emphasis> button when managing a
+ <emphasis>headers</emphasis> Exchange opens a dialog allowing creation of a
+ new binding, associating an existing Queue with a particular set
+ of header keys and values. The <emphasis>x-match</emphasis> key is required,
+ and instructs the server whether to match the binding with
+ incoming messages based on ANY or ALL of the further key-value
+ pairs entered. If it is desired to enter more than 4 pairs, you
+ may press the <emphasis>Add additional field</emphasis> button to create a
+ new row as many times as is required.
+
+ When managing a <emphasis>headers</emphasis> Exchange, double clicking an
+ entry in the left-hand table will open the MBean for the Queue
+ specified in the binding properties.
+ </para><para>
+ When managing another Exchange Type, double clicking the Queue
+ Name in the right-hand table will open the MBean of the Queue
+ specified.
+ </para>
+<!--h1--></section>
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingConnections"><title>
+
+ Managing Connections
+ </title>
+
+ <para>
+
+ Exchange MBeans are opened for management operations in similar
+ fashion as described for Queues, again showing an Attributes tab
+ initially, with the Operations tab next, and finally a
+ Notifications tab allowing subscription and viewing of
+ Notifications. The Operations tab can be seen in the figure
+ below.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113119.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ The main table shows the properties of all the Channels that are
+ present on the Connection, including whether they are
+ <emphasis>Transactional</emphasis>, the <emphasis>Number of Unacked Messages</emphasis>
+ on them, and the <emphasis>Default Queue</emphasis> if there is one (or
+ <emphasis>null</emphasis> if there is not).
+ </para><para>
+ The main operations supported on a connection are Commiting and
+ Rolling Back of Transactions on a particular Channel, if the
+ Channel is Transactional. This can be done by selecting a
+ particular Channel in the table and pressing the <emphasis>Commit
+ Transactions</emphasis> or <emphasis>Rollback Transactions</emphasis> buttons at
+ the lower right corner of the table, at which point the console
+ will prompt for confirmation of the action. These buttons are
+ only active when the selected Channel in the table is
+ Transactional.
+ </para><para>
+ The final operation supported is closing the Connection. After
+ pressing the <emphasis>Close Connection</emphasis> button, the console will
+ prompt for confirmation of the action. If this is carried out,
+ the MBean for the Connection being managed will be removed from
+ the server. The console will be notified of this by the server
+ and display an information dialog to that effect, as it would if
+ any other MBean were to be unregistered whilst being viewed.
+ </para><para>
+ Double clicking a row in the table will open the MBean of the
+ associated <emphasis>Default Queue</emphasis> if there is one.
+ </para>
+
+<!--h1--></section>
+</section>
diff --git a/doc/book/src/Qpid-JMX-Management-Console.xml b/doc/book/src/java-broker/Qpid-JMX-Management-Console.xml
index fb46f4a01a..fb46f4a01a 100644
--- a/doc/book/src/Qpid-JMX-Management-Console.xml
+++ b/doc/book/src/java-broker/Qpid-JMX-Management-Console.xml
diff --git a/doc/book/src/Qpid-Java-Broker-Management-CLI.xml b/doc/book/src/java-broker/Qpid-Java-Broker-Management-CLI.xml
index 84c4b7b7a4..84c4b7b7a4 100644
--- a/doc/book/src/Qpid-Java-Broker-Management-CLI.xml
+++ b/doc/book/src/java-broker/Qpid-Java-Broker-Management-CLI.xml
diff --git a/doc/book/src/Qpid-Java-Build-How-To.xml b/doc/book/src/java-broker/Qpid-Java-Build-How-To.xml
index 9f3625760a..9f3625760a 100644
--- a/doc/book/src/Qpid-Java-Build-How-To.xml
+++ b/doc/book/src/java-broker/Qpid-Java-Build-How-To.xml
diff --git a/doc/book/src/Qpid-Java-FAQ.xml b/doc/book/src/java-broker/Qpid-Java-FAQ.xml
index 845c343350..845c343350 100644
--- a/doc/book/src/Qpid-Java-FAQ.xml
+++ b/doc/book/src/java-broker/Qpid-Java-FAQ.xml
diff --git a/doc/book/src/Qpid-Management-Features.xml b/doc/book/src/java-broker/Qpid-Management-Features.xml
index c90d7e97c6..c90d7e97c6 100644
--- a/doc/book/src/Qpid-Management-Features.xml
+++ b/doc/book/src/java-broker/Qpid-Management-Features.xml
diff --git a/doc/book/src/Qpid-Troubleshooting-Guide.xml b/doc/book/src/java-broker/Qpid-Troubleshooting-Guide.xml
index 0920f18798..0920f18798 100644
--- a/doc/book/src/Qpid-Troubleshooting-Guide.xml
+++ b/doc/book/src/java-broker/Qpid-Troubleshooting-Guide.xml
diff --git a/doc/book/src/java/broker/configuration/Topic-Configuration.xml b/doc/book/src/java-broker/Topic-Configuration.xml
index 1f73bbd7a4..1f73bbd7a4 100644
--- a/doc/book/src/java/broker/configuration/Topic-Configuration.xml
+++ b/doc/book/src/java-broker/Topic-Configuration.xml
diff --git a/doc/book/src/Use-Priority-Queues.xml b/doc/book/src/java-broker/Use-Priority-Queues.xml
index 466d958d43..466d958d43 100644
--- a/doc/book/src/Use-Priority-Queues.xml
+++ b/doc/book/src/java-broker/Use-Priority-Queues.xml
diff --git a/doc/book/src/images/jmx_console/3113098.png b/doc/book/src/java-broker/images/3113098.png
index 7de85030c6..7de85030c6 100644
--- a/doc/book/src/images/jmx_console/3113098.png
+++ b/doc/book/src/java-broker/images/3113098.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113099.png b/doc/book/src/java-broker/images/3113099.png
index fb6fc65d73..fb6fc65d73 100644
--- a/doc/book/src/images/jmx_console/3113099.png
+++ b/doc/book/src/java-broker/images/3113099.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113100.png b/doc/book/src/java-broker/images/3113100.png
index a7d727b854..a7d727b854 100644
--- a/doc/book/src/images/jmx_console/3113100.png
+++ b/doc/book/src/java-broker/images/3113100.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113101.png b/doc/book/src/java-broker/images/3113101.png
index 30731277c2..30731277c2 100644
--- a/doc/book/src/images/jmx_console/3113101.png
+++ b/doc/book/src/java-broker/images/3113101.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113102.png b/doc/book/src/java-broker/images/3113102.png
index f150a21b10..f150a21b10 100644
--- a/doc/book/src/images/jmx_console/3113102.png
+++ b/doc/book/src/java-broker/images/3113102.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113103.png b/doc/book/src/java-broker/images/3113103.png
index a91efb4306..a91efb4306 100644
--- a/doc/book/src/images/jmx_console/3113103.png
+++ b/doc/book/src/java-broker/images/3113103.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113104.png b/doc/book/src/java-broker/images/3113104.png
index c5ef12d8b1..c5ef12d8b1 100644
--- a/doc/book/src/images/jmx_console/3113104.png
+++ b/doc/book/src/java-broker/images/3113104.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113105.png b/doc/book/src/java-broker/images/3113105.png
index b155f9d9a1..b155f9d9a1 100644
--- a/doc/book/src/images/jmx_console/3113105.png
+++ b/doc/book/src/java-broker/images/3113105.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113106.png b/doc/book/src/java-broker/images/3113106.png
index 22bcdd084e..22bcdd084e 100644
--- a/doc/book/src/images/jmx_console/3113106.png
+++ b/doc/book/src/java-broker/images/3113106.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113107.png b/doc/book/src/java-broker/images/3113107.png
index cf5dd97e89..cf5dd97e89 100644
--- a/doc/book/src/images/jmx_console/3113107.png
+++ b/doc/book/src/java-broker/images/3113107.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113108.png b/doc/book/src/java-broker/images/3113108.png
index c0e5eafde2..c0e5eafde2 100644
--- a/doc/book/src/images/jmx_console/3113108.png
+++ b/doc/book/src/java-broker/images/3113108.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113109.png b/doc/book/src/java-broker/images/3113109.png
index 139d81d849..139d81d849 100644
--- a/doc/book/src/images/jmx_console/3113109.png
+++ b/doc/book/src/java-broker/images/3113109.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113110.png b/doc/book/src/java-broker/images/3113110.png
index 2207f15cd7..2207f15cd7 100644
--- a/doc/book/src/images/jmx_console/3113110.png
+++ b/doc/book/src/java-broker/images/3113110.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113111.png b/doc/book/src/java-broker/images/3113111.png
index 5737f41caf..5737f41caf 100644
--- a/doc/book/src/images/jmx_console/3113111.png
+++ b/doc/book/src/java-broker/images/3113111.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113112.png b/doc/book/src/java-broker/images/3113112.png
index d9ee094ab4..d9ee094ab4 100644
--- a/doc/book/src/images/jmx_console/3113112.png
+++ b/doc/book/src/java-broker/images/3113112.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113113.png b/doc/book/src/java-broker/images/3113113.png
index e80812f83c..e80812f83c 100644
--- a/doc/book/src/images/jmx_console/3113113.png
+++ b/doc/book/src/java-broker/images/3113113.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113114.png b/doc/book/src/java-broker/images/3113114.png
index b237181150..b237181150 100644
--- a/doc/book/src/images/jmx_console/3113114.png
+++ b/doc/book/src/java-broker/images/3113114.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113115.png b/doc/book/src/java-broker/images/3113115.png
index 84ad42b567..84ad42b567 100644
--- a/doc/book/src/images/jmx_console/3113115.png
+++ b/doc/book/src/java-broker/images/3113115.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113116.png b/doc/book/src/java-broker/images/3113116.png
index 18b979792f..18b979792f 100644
--- a/doc/book/src/images/jmx_console/3113116.png
+++ b/doc/book/src/java-broker/images/3113116.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113117.png b/doc/book/src/java-broker/images/3113117.png
index 3b33ef67ac..3b33ef67ac 100644
--- a/doc/book/src/images/jmx_console/3113117.png
+++ b/doc/book/src/java-broker/images/3113117.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113118.png b/doc/book/src/java-broker/images/3113118.png
index 60451f88cf..60451f88cf 100644
--- a/doc/book/src/images/jmx_console/3113118.png
+++ b/doc/book/src/java-broker/images/3113118.png
Binary files differ
diff --git a/doc/book/src/images/jmx_console/3113119.png b/doc/book/src/java-broker/images/3113119.png
index 16ded074bd..16ded074bd 100644
--- a/doc/book/src/images/jmx_console/3113119.png
+++ b/doc/book/src/java-broker/images/3113119.png
Binary files differ
diff --git a/doc/book/src/ACL.xml b/doc/book/src/old/ACL.xml
index ceb7cecb23..ceb7cecb23 100644
--- a/doc/book/src/ACL.xml
+++ b/doc/book/src/old/ACL.xml
diff --git a/doc/book/src/AMQP-.NET-Messaging-Client.xml b/doc/book/src/old/AMQP-.NET-Messaging-Client.xml
index 1d4001942b..1d4001942b 100644
--- a/doc/book/src/AMQP-.NET-Messaging-Client.xml
+++ b/doc/book/src/old/AMQP-.NET-Messaging-Client.xml
diff --git a/doc/book/src/AMQP-C++-Messaging-Client.xml b/doc/book/src/old/AMQP-C++-Messaging-Client.xml
index 73a2cd6c0b..73a2cd6c0b 100644
--- a/doc/book/src/AMQP-C++-Messaging-Client.xml
+++ b/doc/book/src/old/AMQP-C++-Messaging-Client.xml
diff --git a/doc/book/src/AMQP-Java-JMS-Messaging-Client.xml b/doc/book/src/old/AMQP-Java-JMS-Messaging-Client.xml
index 8c14d67e14..8c14d67e14 100644
--- a/doc/book/src/AMQP-Java-JMS-Messaging-Client.xml
+++ b/doc/book/src/old/AMQP-Java-JMS-Messaging-Client.xml
diff --git a/doc/book/src/old/AMQP-Messaging-Broker-CPP.xml b/doc/book/src/old/AMQP-Messaging-Broker-CPP.xml
new file mode 100644
index 0000000000..b4e0deb13d
--- /dev/null
+++ b/doc/book/src/old/AMQP-Messaging-Broker-CPP.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+<part>
+ <title>AMQP Messaging Broker (Implemented in C++)</title>
+ <partintro>
+ <para>Qpid provides two AMQP messaging brokers:</para>
+
+ <itemizedlist>
+ <listitem><para>Implemented in C++ - high performance, low latency, and RDMA support.</para></listitem>
+ <listitem><para>Implemented in Java - Fully JMS compliant, runs on any Java platform.</para></listitem>
+ </itemizedlist>
+
+ <para>Both AMQP messaging brokers support clients in multiple languages, as long as the messaging client and the messaging broker use the same version of AMQP. See <link linkend="AMQP-Compatibility"/> to see which messaging clients work with each broker.</para>
+
+ <para>This section contains information specific to the broker that is implemented in C++.</para>
+ </partintro>
+
+<chapter>
+ <title>
+ Running the AMQP Messaging Broker
+ </title>
+
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Running-CPP-Broker.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Cheat-Sheet-for-configuring-Queue-Options.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Cheat-Sheet-for-configuring-Exchange-Options.xml"/>
+
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Using-Broker-Federation.xml"/>
+
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="SSL.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="LVQ.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="queue-state-replication.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Active-Active-Cluster.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="ACL.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="producer-flow-control.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Using-message-groups.xml"/>
+</chapter>
+
+
+<chapter id="chapter-Managing-CPP-Broker">
+ <title>
+ Managing the AMQP Messaging Broker
+ </title>
+
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Managing-CPP-Broker.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="QMan-Qpid-Management-bridge.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-Management-Framework.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Management-Design-notes.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="QMF-Python-Console-Tutorial.xml"/>
+</chapter>
+</part>
diff --git a/doc/book/src/AMQP-Python-Messaging-Client.xml b/doc/book/src/old/AMQP-Python-Messaging-Client.xml
index 15baf214ec..15baf214ec 100644
--- a/doc/book/src/AMQP-Python-Messaging-Client.xml
+++ b/doc/book/src/old/AMQP-Python-Messaging-Client.xml
diff --git a/doc/book/src/AMQP-Ruby-Messaging-Client.xml b/doc/book/src/old/AMQP-Ruby-Messaging-Client.xml
index 45318c0beb..45318c0beb 100644
--- a/doc/book/src/AMQP-Ruby-Messaging-Client.xml
+++ b/doc/book/src/old/AMQP-Ruby-Messaging-Client.xml
diff --git a/doc/book/src/AMQP.xml b/doc/book/src/old/AMQP.xml
index 1a609649bb..1a609649bb 100644
--- a/doc/book/src/AMQP.xml
+++ b/doc/book/src/old/AMQP.xml
diff --git a/doc/book/src/Binding-URL-Format.xml b/doc/book/src/old/Binding-URL-Format.xml
index 3d938b740a..3d938b740a 100644
--- a/doc/book/src/Binding-URL-Format.xml
+++ b/doc/book/src/old/Binding-URL-Format.xml
diff --git a/doc/book/src/Book-Info.xml b/doc/book/src/old/Book-Info.xml
index 2e02fbe8ea..2e02fbe8ea 100644
--- a/doc/book/src/Book-Info.xml
+++ b/doc/book/src/old/Book-Info.xml
diff --git a/doc/book/src/Book.xml b/doc/book/src/old/Book.xml
index ee69532152..ee69532152 100644
--- a/doc/book/src/Book.xml
+++ b/doc/book/src/old/Book.xml
diff --git a/doc/book/src/Broker-CPP.xml b/doc/book/src/old/Broker-CPP.xml
index 99584be23d..99584be23d 100644
--- a/doc/book/src/Broker-CPP.xml
+++ b/doc/book/src/old/Broker-CPP.xml
diff --git a/doc/book/src/Broker-Java.xml b/doc/book/src/old/Broker-Java.xml
index f8ce89b185..f8ce89b185 100644
--- a/doc/book/src/Broker-Java.xml
+++ b/doc/book/src/old/Broker-Java.xml
diff --git a/doc/book/src/Clients.xml b/doc/book/src/old/Clients.xml
index 3dc2d38e86..3dc2d38e86 100644
--- a/doc/book/src/Clients.xml
+++ b/doc/book/src/old/Clients.xml
diff --git a/doc/book/src/Connection-URL-Format.xml b/doc/book/src/old/Connection-URL-Format.xml
index cb772487cd..cb772487cd 100644
--- a/doc/book/src/Connection-URL-Format.xml
+++ b/doc/book/src/old/Connection-URL-Format.xml
diff --git a/doc/book/src/Download.xml b/doc/book/src/old/Download.xml
index 7bc08143ac..7bc08143ac 100644
--- a/doc/book/src/Download.xml
+++ b/doc/book/src/old/Download.xml
diff --git a/doc/book/src/Excel-AddIn.xml b/doc/book/src/old/Excel-AddIn.xml
index e38f620bd8..e38f620bd8 100644
--- a/doc/book/src/Excel-AddIn.xml
+++ b/doc/book/src/old/Excel-AddIn.xml
diff --git a/doc/book/src/FAQ.xml b/doc/book/src/old/FAQ.xml
index 5647f18f69..5647f18f69 100644
--- a/doc/book/src/FAQ.xml
+++ b/doc/book/src/old/FAQ.xml
diff --git a/doc/book/src/Getting-Started.xml b/doc/book/src/old/Getting-Started.xml
index 216a52170e..216a52170e 100644
--- a/doc/book/src/Getting-Started.xml
+++ b/doc/book/src/old/Getting-Started.xml
diff --git a/doc/book/src/old/How-to-Use-JNDI.xml b/doc/book/src/old/How-to-Use-JNDI.xml
new file mode 100644
index 0000000000..0d6315c2a3
--- /dev/null
+++ b/doc/book/src/old/How-to-Use-JNDI.xml
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+<chapter id="How-to-Use-JNDI">
+ <title>
+ How to Use JNDI
+ </title>
+ <section role="h2" id="HowtoUseJNDI-HowtousethePropertiesFileInitialContextFactory">
+ <title>
+ How to use the PropertiesFileInitialContextFactory
+ </title>
+
+ <para>
+ This ContextFactory uses a java properties formatted file to
+ setup initial values.
+ </para>
+ <section role="h3" id="HowtoUseJNDI-JNDIPropertysetup">
+ <title>
+ JNDI Property setup
+ </title>
+ <para>
+ By setting the JNDI Initial Context Factory and URL as
+ below it is possible to load any File from the locally
+ mounted file system to use for JNDI purposes. The format
+ of the file is described in the next section.
+ </para>
+ <programlisting>
+java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+java.naming.provider.url = &lt;path to JNDI File&gt;
+</programlisting>
+ <para>
+ By simply setting these two system properties you can jump
+ straight to the InitialContext creation in your code.
+ </para>
+ </section>
+ <section role="h3" id="HowtoUseJNDI-Examplepropertiesfile">
+ <title>
+ Example properties file </title>
+ <para>
+ This is the example properties file.
+ </para>
+ <programlisting>
+# register some connection factories
+# connectionfactory.[jndiname] = [ConnectionURL]
+connectionfactory.local = amqp://guest:guest@clientid/testpath?brokerlist='vm://:1'
+
+# register some queues in JNDI using the form
+# queue.[jndiName] = [physicalName]
+queue.MyQueue = example.MyQueue
+
+# register some topics in JNDI using the form
+# topic.[jndiName] = [physicalName]
+topic.ibmStocks = stocks.nyse.ibm
+
+# Register an AMQP destination in JNDI
+# NOTE: Qpid currently only supports direct,topics and headers
+# destination.[jniName] = [BindingURL]
+destination.direct = direct://amq.direct//directQueue
+</programlisting>
+ <para>
+ The property file allows a number of queues to be defined that
+ can then be discovered via JNDI. There are four properties used
+ by the PFICFactory.
+ <emphasis>connectionfactory.&lt;jndiname&gt;</emphasis> this is the <xref linkend="Connection-URL-Format"/> that the connection
+ factory will use to perform connections.
+ <emphasis>queue.&lt;jndiname&gt;</emphasis> this defines a jms queue or in
+ amqp a amq.direct exchange
+ <emphasis>topic.&lt;jndiname&gt;</emphasis> this defines a jms topic or in
+ amqp a amq.topic exchange
+ <emphasis>destination.&lt;jndiname&gt;</emphasis> this takes a <xref linkend="BindingURLFormat"/>
+ and so can be used for defining all amq destinations, queues,
+ topics and header matching.
+ </para><para>
+ In all of these properties the <emphasis>&lt;jndiname&gt;</emphasis> is the
+ string value that would be given when performing a lookup.
+ </para><para>
+ <emphasis>NOTE</emphasis>: This does not create the queue on the broker. You
+ should ensure that you have created the queue before publishing
+ to it. Queues can be declared in the virtualhosts.xml file so
+ that they are created on broker startup, or created dynamically
+ by consuming clients. Topics and other destinations that use
+ temporary queues cannot be created in this way, so a consumer
+ must be created first before publishing messages with mandatory
+ routing.
+ </para>
+ </section>
+ <section role="h3" id="HowtoUseJNDI-Examplelookupcode">
+ <title>
+ Example lookup code
+ </title><!--h3-->
+
+ <para>
+ The <emphasis>bindingValue</emphasis> is the String that would be placed in
+ <emphasis>&lt;jndiname&gt;</emphasis> above.
+ </para>
+
+ <example>
+ <title>Simple JNDI lookup using files</title>
+ <programlisting>
+//Ensure you have your system properties set
+final String INITIAL_CONTEXT_FACTORY = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory";
+
+System.setProperty(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
+System.setProperty(Context.PROVIDER_URL, _JNDIFile);
+
+// Create the initial context
+Context ctx = new InitialContext();
+
+// Perform the binds
+object = ctx.lookup(bindingValue);
+
+// Close the context when we're done
+ctx.close();
+</programlisting>
+</example>
+
+<example>
+<title>Simple JNDI lookup using properties</title>
+
+ <programlisting>
+
+final String INITIAL_CONTEXT_FACTORY = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory";
+
+final String CONNECTION_JNDI_NAME = "local";
+final String CONNECTION_NAME = "amqp://guest:guest@clientid/testpath?brokerlist='vm://:1'";
+
+final String QUEUE_JNDI_NAME = "queue";
+final String QUEUE_NAME = "example.MyQueue";
+
+// Set the properties ...
+Properties properties = new Properties();
+properties.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
+properties.put("connectionfactory."+CONNECTION_JNDI_NAME , CONNECTION_NAME);
+properties.put("queue."+QUEUE_JNDI_NAME , QUEUE_NAME);
+
+// Create the initial context
+Context ctx = new InitialContext(properties);
+
+// Perform the lookups
+ConnectionFactory factory = (ConnectionFactory)ctx.lookup(CONNECTION_JNDI_NAME);
+Queue queue = (Queue)ctx.lookup(QUEUE_JNDI_NAME);
+
+// Close the context when we're done
+ctx.close();
+</programlisting>
+</example>
+ </section>
+
+ <section>
+ <title>Using Qpid with Other JNDI Providers</title>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Using-Qpid-with-other-JNDI-Providers.xml"/>
+ </section>
+<!--h2-->
+ </section>
+
+</chapter>
diff --git a/doc/book/src/InfoPlugin.xml b/doc/book/src/old/InfoPlugin.xml
index aebcd08c02..aebcd08c02 100644
--- a/doc/book/src/InfoPlugin.xml
+++ b/doc/book/src/old/InfoPlugin.xml
diff --git a/doc/book/src/Introduction.xml b/doc/book/src/old/Introduction.xml
index 8f92c207cf..8f92c207cf 100644
--- a/doc/book/src/Introduction.xml
+++ b/doc/book/src/old/Introduction.xml
diff --git a/doc/book/src/Java-Broker-StatusLogMessages.xml b/doc/book/src/old/Java-Broker-StatusLogMessages.xml
index 98f876e532..98f876e532 100644
--- a/doc/book/src/Java-Broker-StatusLogMessages.xml
+++ b/doc/book/src/old/Java-Broker-StatusLogMessages.xml
diff --git a/doc/book/src/Java-JMS-Selector-Syntax.xml b/doc/book/src/old/Java-JMS-Selector-Syntax.xml
index 870e277b66..870e277b66 100644
--- a/doc/book/src/Java-JMS-Selector-Syntax.xml
+++ b/doc/book/src/old/Java-JMS-Selector-Syntax.xml
diff --git a/doc/book/src/Management-Design-notes.xml b/doc/book/src/old/Management-Design-notes.xml
index 76f0dac926..76f0dac926 100644
--- a/doc/book/src/Management-Design-notes.xml
+++ b/doc/book/src/old/Management-Design-notes.xml
diff --git a/doc/book/src/NET-User-Guide.xml b/doc/book/src/old/NET-User-Guide.xml
index 7bfa20b8c8..7bfa20b8c8 100644
--- a/doc/book/src/NET-User-Guide.xml
+++ b/doc/book/src/old/NET-User-Guide.xml
diff --git a/doc/book/src/PythonBrokerTest.xml b/doc/book/src/old/PythonBrokerTest.xml
index ae7edade40..ae7edade40 100644
--- a/doc/book/src/PythonBrokerTest.xml
+++ b/doc/book/src/old/PythonBrokerTest.xml
diff --git a/doc/book/src/QMan-Qpid-Management-bridge.xml b/doc/book/src/old/QMan-Qpid-Management-bridge.xml
index f2c366dcbb..f2c366dcbb 100644
--- a/doc/book/src/QMan-Qpid-Management-bridge.xml
+++ b/doc/book/src/old/QMan-Qpid-Management-bridge.xml
diff --git a/doc/book/src/Qpid-ACLs.xml b/doc/book/src/old/Qpid-ACLs.xml
index a2b64061c3..a2b64061c3 100644
--- a/doc/book/src/Qpid-ACLs.xml
+++ b/doc/book/src/old/Qpid-ACLs.xml
diff --git a/doc/book/src/Qpid-Book.xml b/doc/book/src/old/Qpid-Book.xml
index ee69532152..ee69532152 100644
--- a/doc/book/src/Qpid-Book.xml
+++ b/doc/book/src/old/Qpid-Book.xml
diff --git a/doc/book/src/Qpid-Compatibility-And-Interoperability-Book.xml b/doc/book/src/old/Qpid-Compatibility-And-Interoperability-Book.xml
index f382f390c7..f382f390c7 100644
--- a/doc/book/src/Qpid-Compatibility-And-Interoperability-Book.xml
+++ b/doc/book/src/old/Qpid-Compatibility-And-Interoperability-Book.xml
diff --git a/doc/book/src/SASL-Compatibility.xml b/doc/book/src/old/SASL-Compatibility.xml
index ad223792b5..ad223792b5 100644
--- a/doc/book/src/SASL-Compatibility.xml
+++ b/doc/book/src/old/SASL-Compatibility.xml
diff --git a/doc/book/src/SSL.xml b/doc/book/src/old/SSL.xml
index a9a5cb953a..a9a5cb953a 100644
--- a/doc/book/src/SSL.xml
+++ b/doc/book/src/old/SSL.xml
diff --git a/doc/book/src/Security-Plugins.xml b/doc/book/src/old/Security-Plugins.xml
index bf5cb726b3..bf5cb726b3 100644
--- a/doc/book/src/Security-Plugins.xml
+++ b/doc/book/src/old/Security-Plugins.xml
diff --git a/doc/book/src/System-Properties.xml b/doc/book/src/old/System-Properties.xml
index 40b823185f..40b823185f 100644
--- a/doc/book/src/System-Properties.xml
+++ b/doc/book/src/old/System-Properties.xml
diff --git a/doc/book/src/Using-Qpid-with-other-JNDI-Providers.xml b/doc/book/src/old/Using-Qpid-with-other-JNDI-Providers.xml
index 2bd7d761ef..2bd7d761ef 100644
--- a/doc/book/src/Using-Qpid-with-other-JNDI-Providers.xml
+++ b/doc/book/src/old/Using-Qpid-with-other-JNDI-Providers.xml
diff --git a/doc/book/src/WCF.xml b/doc/book/src/old/WCF.xml
index aaf54463db..aaf54463db 100644
--- a/doc/book/src/WCF.xml
+++ b/doc/book/src/old/WCF.xml
diff --git a/doc/book/src/old/schemas.xml b/doc/book/src/old/schemas.xml
new file mode 100644
index 0000000000..6102e65f07
--- /dev/null
+++ b/doc/book/src/old/schemas.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0"?>
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+
+-->
+
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+ <uri resource="foo.xml" typeId="DocBook"/>
+ <uri resource="foo.xml" typeId="DocBook"/>
+ <uri resource="Programming-In-Apache-Qpid.xml" typeId="DocBook"/>
+ <uri resource="queue-state-replication.xml" typeId="DocBook"/>
+ <uri resource="AMQP-Messaging-Broker-Java-Book.xml" typeId="DocBook"/>
+ <uri resource="AMQP-Messaging-Broker-CPP-Book.xml" typeId="DocBook"/>
+ <uri resource="High-Level-API.xml" typeId="DocBook"/>
+ <uri resource="High-Level-API.xml" typeId="DocBook"/>
+ <uri resource="Java-JMS-Selector-Syntax.xml" typeId="DocBook"/>
+ <uri resource="ACL.xml" typeId="DocBook"/>
+ <uri resource="Add-New-Users.xml" typeId="DocBook"/>
+ <uri resource="AMQP-C++-Messaging-Client.xml" typeId="DocBook"/>
+ <uri resource="AMQP-Compatibility.xml" typeId="DocBook"/>
+ <uri resource="AMQP-Java-JMS-Messaging-Client.xml" typeId="DocBook"/>
+ <uri resource="AMQP-Messaging-Broker-CPP.xml" typeId="DocBook"/>
+ <uri resource="AMQP-Messaging-Broker-Java.xml" typeId="DocBook"/>
+ <uri resource="AMQP-.NET-Messaging-Client.xml" typeId="DocBook"/>
+ <uri resource="AMQP-Python-Messaging-Client.xml" typeId="DocBook"/>
+ <uri resource="AMQP-Ruby-Messaging-Client.xml" typeId="DocBook"/>
+ <uri resource="AMQP.xml" typeId="DocBook"/>
+ <uri resource="Binding-URL-Format.xml" typeId="DocBook"/>
+ <uri resource="Book-Info.xml" typeId="DocBook"/>
+ <uri resource="Book.xml" typeId="DocBook"/>
+ <uri resource="Broker-CPP.xml" typeId="DocBook"/>
+ <uri resource="Broker-Java.xml" typeId="DocBook"/>
+ <uri resource="Cheat-Sheet-for-configuring-Exchange-Options.xml" typeId="DocBook"/>
+ <uri resource="Cheat-Sheet-for-configuring-Queue-Options.xml" typeId="DocBook"/>
+ <uri resource="Clients.xml" typeId="DocBook"/>
+ <uri resource="Configure-ACLs.xml" typeId="DocBook"/>
+ <uri resource="Configure-Java-Qpid-to-use-a-SSL-connection.xml" typeId="DocBook"/>
+ <uri resource="Configure-Log4j-CompositeRolling-Appender.xml" typeId="DocBook"/>
+ <uri resource="Configure-the-Broker-via-config.xml.xml" typeId="DocBook"/>
+ <uri resource="Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml" typeId="DocBook"/>
+ <uri resource="Configuring-Management-Users.xml" typeId="DocBook"/>
+ <uri resource="Configuring-Qpid-JMX-Management-Console.xml" typeId="DocBook"/>
+ <uri resource="Connection-URL-Format.xml" typeId="DocBook"/>
+ <uri resource="Debug-using-log4j.xml" typeId="DocBook"/>
+ <uri resource="Download.xml" typeId="DocBook"/>
+ <uri resource="Excel-AddIn.xml" typeId="DocBook"/>
+ <uri resource="FAQ.xml" typeId="DocBook"/>
+ <uri resource="foo.xml" typeId="DocBook"/>
+ <uri resource="f.xml" typeId="DocBook"/>
+ <uri resource="Getting-Started.xml" typeId="DocBook"/>
+ <uri resource="How-to-Tune-M3-Java-Broker-Performance.xml" typeId="DocBook"/>
+ <uri resource="How-to-Use-JNDI.xml" typeId="DocBook"/>
+ <uri resource="Introduction.xml" typeId="DocBook"/>
+ <uri resource="Java-Broker-Feature-Guide.xml" typeId="DocBook"/>
+ <uri resource="Java-Environment-Variables.xml" typeId="DocBook"/>
+ <uri resource="LVQ.xml" typeId="DocBook"/>
+ <uri resource="Management-Console-Security.xml" typeId="DocBook"/>
+ <uri resource="Management-Design-notes.xml" typeId="DocBook"/>
+ <uri resource="Managing-CPP-Broker.xml" typeId="DocBook"/>
+ <uri resource="MessageStore-Tool.xml" typeId="DocBook"/>
+ <uri resource="NET-User-Guide.xml" typeId="DocBook"/>
+ <uri resource="PythonBrokerTest.xml" typeId="DocBook"/>
+ <uri resource="QMan-Qpid-Management-bridge.xml" typeId="DocBook"/>
+ <uri resource="QMF-Python-Console-Tutorial.xml" typeId="DocBook"/>
+ <uri resource="Qpid-ACLs.xml" typeId="DocBook"/>
+ <uri resource="Qpid-Interoperability-Documentation.xml" typeId="DocBook"/>
+ <uri resource="Qpid-Java-Broker-Management-CLI.xml" typeId="DocBook"/>
+ <uri resource="Qpid-Java-Build-How-To.xml" typeId="DocBook"/>
+ <uri resource="Qpid-Java-FAQ.xml" typeId="DocBook"/>
+ <uri resource="Qpid-JMX-Management-Console-FAQ.xml" typeId="DocBook"/>
+ <uri resource="Qpid-JMX-Management-Console-User-Guide.xml" typeId="DocBook"/>
+ <uri resource="Qpid-JMX-Management-Console.xml" typeId="DocBook"/>
+ <uri resource="Qpid-Management-Features.xml" typeId="DocBook"/>
+ <uri resource="Qpid-Management-Framework.xml" typeId="DocBook"/>
+ <uri resource="Qpid-Troubleshooting-Guide.xml" typeId="DocBook"/>
+ <uri resource="queue-state-replication.xml" typeId="DocBook"/>
+ <uri resource="Running-CPP-Broker.xml" typeId="DocBook"/>
+ <uri resource="SASL-Compatibility.xml" typeId="DocBook"/>
+ <uri resource="SSL.xml" typeId="DocBook"/>
+ <uri resource="Active-Active-Cluster.xml" typeId="DocBook"/>
+ <uri resource="System-Properties.xml" typeId="DocBook"/>
+ <uri resource="Use-Priority-Queues.xml" typeId="DocBook"/>
+ <uri resource="Using-Broker-Federation.xml" typeId="DocBook"/>
+ <uri resource="Using-Qpid-with-other-JNDI-Providers.xml" typeId="DocBook"/>
+ <uri resource="WCF.xml" typeId="DocBook"/>
+</locatingRules>
diff --git a/doc/book/src/programming/Makefile b/doc/book/src/programming/Makefile
new file mode 100644
index 0000000000..0266a0f54d
--- /dev/null
+++ b/doc/book/src/programming/Makefile
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+include ../Makefile.inc
diff --git a/doc/book/src/Message-Groups-Guide.xml b/doc/book/src/programming/Message-Groups-Guide.xml
index 3e5c549ff9..3e5c549ff9 100644
--- a/doc/book/src/Message-Groups-Guide.xml
+++ b/doc/book/src/programming/Message-Groups-Guide.xml
diff --git a/doc/book/src/programming/Programming-In-Apache-Qpid-Book.xml b/doc/book/src/programming/Programming-In-Apache-Qpid-Book.xml
new file mode 100644
index 0000000000..3052e2acc1
--- /dev/null
+++ b/doc/book/src/programming/Programming-In-Apache-Qpid-Book.xml
@@ -0,0 +1,6500 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+
+-->
+
+<book id="client-api-tutorial">
+ <title>Programming in Apache Qpid</title>
+ <subtitle>Cross-Platform AMQP Messaging in Java JMS, .NET, C++, and Python</subtitle>
+
+ <chapter>
+ <title>Introduction</title>
+
+ <para>Apache Qpid is a reliable, asynchronous messaging system that
+ supports the AMQP messaging protocol in several common programming
+ languages. Qpid is supported on most common platforms.
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ On the Java platform, Qpid uses the
+ established <ulink url="http://java.sun.com/products/jms/">Java JMS
+ API</ulink>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ For Python, C++, and .NET, Qpid defines its own messaging API, the
+ <firstterm>Qpid Messaging API</firstterm>, which is
+ conceptually similar in each.
+ </para>
+ <para>
+ On the .NET platform, Qpid also provides a WCF binding.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Ruby will also use the Qpid Messaging API, which will soon
+ be implemented. (Ruby currently uses an API that is closely
+ tied to the AMQP version).
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ </chapter>
+
+ <chapter>
+ <title>Using the Qpid Messaging API</title>
+
+ <para>The Qpid Messaging API is quite simple, consisting of only a
+ handful of core classes.
+ </para>
+
+ <itemizedlist>
+
+ <listitem>
+ <para>
+ A <firstterm>message</firstterm> consists of a standard set
+ of fields (e.g. <literal>subject</literal>,
+ <literal>reply-to</literal>), an application-defined set of
+ properties, and message content (the main body of the
+ message).
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ A <firstterm>connection</firstterm> represents a network
+ connection to a remote endpoint.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ A <firstterm>session</firstterm> provides a sequentially
+ ordered context for sending and receiving
+ <emphasis>messages</emphasis>. A session is obtained from a
+ connection.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ A <firstterm>sender</firstterm> sends messages to a target
+ using the <literal>sender.send</literal> method. A sender is
+ obtained from a session for a given target address.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ A <firstterm>receiver</firstterm> receives messages from a
+ source using the <literal>receiver.fetch</literal> method.
+ A receiver is obtained from a session for a given source
+ address.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+
+ <para>
+ The following sections show how to use these classes in a
+ simple messaging program.
+ </para>
+
+ <section>
+ <title>A Simple Messaging Program in C++</title>
+
+ <para>The following C++ program shows how to create a connection,
+ create a session, send messages using a sender, and receive
+ messages using a receiver.</para>
+
+ <example>
+ <title>"Hello world!" in C++</title>
+ <programlisting lang="c++"><![CDATA[
+ #include <qpid/messaging/Connection.h>
+ #include <qpid/messaging/Message.h>
+ #include <qpid/messaging/Receiver.h>
+ #include <qpid/messaging/Sender.h>
+ #include <qpid/messaging/Session.h>
+
+ #include <iostream>]]>
+
+ using namespace qpid::messaging;
+
+ int main(int argc, char** argv) {
+ std::string broker = argc > 1 ? argv[1] : "localhost:5672";
+ std::string address = argc > 2 ? argv[2] : "amq.topic";
+ std::string connectionOptions = argc > 3 ? argv[3] : "";
+
+ Connection connection(broker, connectionOptions);
+ try {
+ connection.open(); <co id="hello-cpp-open" linkends="callout-cpp-open"/>
+ Session session = connection.createSession(); <co id="hello-cpp-session" linkends="callout-cpp-session"/>
+
+ Receiver receiver = session.createReceiver(address); <co id="hello-cpp-receiver" linkends="callout-cpp-receiver"/>
+ Sender sender = session.createSender(address); <co id="hello-cpp-sender" linkends="callout-cpp-sender"/>
+
+ sender.send(Message("Hello world!"));
+
+ Message message = receiver.fetch(Duration::SECOND * 1); <co id="hello-cpp-fetch" linkends="callout-cpp-fetch"/>
+ <![CDATA[std::cout << message.getContent() << std::endl;]]>
+ session.acknowledge(); <co id="hello-cpp-acknowledge" linkends="callout-cpp-acknowledge"/>
+
+ connection.close(); <co id="hello-cpp-close" linkends="callout-cpp-close"/>
+ return 0;
+ } catch(const std::exception&amp; error) {
+ <![CDATA[std::cerr << error.what() << std::endl;]]>
+ connection.close();
+ return 1;
+ }
+ }</programlisting>
+
+ <calloutlist>
+ <callout id="callout-cpp-open" arearefs="hello-cpp-open">
+ <para>Establishes the connection with the messaging broker.</para>
+ </callout>
+ <callout id="callout-cpp-session" arearefs="hello-cpp-session">
+ <para>Creates a session object on which messages will be sent and received.</para>
+ </callout>
+ <callout id="callout-cpp-receiver" arearefs="hello-cpp-receiver">
+ <para>Creates a receiver that receives messages from the given address.</para>
+ </callout>
+ <callout id="callout-cpp-sender" arearefs="hello-cpp-sender">
+ <para>Creates a sender that sends to the given address.</para>
+ </callout>
+ <callout id="callout-cpp-fetch" arearefs="hello-cpp-fetch">
+ <para>Receives the next message. The duration is optional, if omitted, will wait indefinitely for the next message.</para>
+ </callout>
+ <callout id="callout-cpp-acknowledge" arearefs="hello-cpp-acknowledge">
+ <para>Acknowledges receipt of all fetched messages on the
+ session. This informs the broker that the messages were
+ transferred and processed by the client successfully.</para>
+ </callout>
+ <callout id="callout-cpp-close" arearefs="hello-cpp-close">
+ <para>Closes the connection, all sessions managed by the connection, and all senders and receivers managed by each session.</para>
+ </callout>
+ </calloutlist>
+ </example>
+
+
+ </section>
+
+ <section>
+ <title>A Simple Messaging Program in Python</title>
+
+ <para>The following Python program shows how to create a
+ connection, create a session, send messages using a sender, and
+ receive messages using a receiver.</para>
+
+ <example>
+ <title>"Hello world!" in Python</title>
+ <programlisting lang="python"><![CDATA[
+ import sys
+ from qpid.messaging import *
+
+ broker = "localhost:5672" if len(sys.argv)<2 else sys.argv[1]
+ address = "amq.topic" if len(sys.argv)<3 else sys.argv[2]]]>
+
+ connection = Connection(broker)
+
+ try:
+ connection.open() <co id="hello-python-open" linkends="callout-python-open"/>
+ session = connection.session() <co id="hello-python-session" linkends="callout-python-session"/>
+
+ sender = session.sender(address) <co id="hello-python-sender" linkends="callout-python-sender"/>
+ receiver = session.receiver(address) <co id="hello-python-receiver" linkends="callout-python-receiver"/>
+
+ sender.send(Message("Hello world!"));
+
+ message = receiver.fetch(timeout=1) <co id="hello-python-fetch" linkends="callout-python-fetch"/>
+ print message.content
+ session.acknowledge() <co id="hello-python-acknowledge" linkends="callout-python-acknowledge"/>
+
+ except MessagingError,m:
+ print m
+ finally:
+ connection.close() <co id="hello-python-close" linkends="callout-python-close"/>
+ </programlisting>
+
+ <calloutlist>
+ <callout id="callout-python-open" arearefs="hello-python-open">
+ <para>Establishes the connection with the messaging broker.</para>
+ </callout>
+ <callout id="callout-python-session" arearefs="hello-python-session">
+ <para>Creates a session object on which messages will be sent and received.</para>
+ </callout>
+ <callout id="callout-python-receiver" arearefs="hello-python-receiver">
+ <para>Creates a receiver that receives messages from the given address.</para>
+ </callout>
+ <callout id="callout-python-sender" arearefs="hello-python-sender">
+ <para>Creates a sender that sends to the given address.</para>
+ </callout>
+ <callout id="callout-python-fetch" arearefs="hello-python-fetch">
+ <para>Receives the next message. The duration is optional, if omitted, will wait indefinitely for the next message.</para>
+ </callout>
+ <callout id="callout-python-acknowledge" arearefs="hello-python-acknowledge">
+ <para>Acknowledges receipt of all fetched messages on
+ the session. This informs the broker that the messages were
+ transfered and processed by the client successfully.</para>
+ </callout>
+ <callout id="callout-python-close" arearefs="hello-python-close">
+ <para>Closes the connection, all sessions managed by the connection, and all senders and receivers managed by each session.</para>
+ </callout>
+ </calloutlist>
+
+ </example>
+
+ </section>
+
+
+
+
+ <section>
+ <title>A Simple Messaging Program in .NET C#</title>
+
+ <para>The following .NET C#
+ <footnote>
+ <para>
+ The .NET binding for the Qpid C++ Messaging API
+ applies to all .NET Framework managed code languages. C# was chosen
+ for illustration purposes only.
+ </para>
+ </footnote>
+ program shows how to create a connection,
+ create a session, send messages using a sender, and receive
+ messages using a receiver.
+ </para>
+
+ <example>
+ <title>"Hello world!" in .NET C#</title>
+ <programlisting lang="c++">
+ using System;
+ using Org.Apache.Qpid.Messaging; <co id="hello-csharp-using" linkends="callout-csharp-using"/>
+
+ namespace Org.Apache.Qpid.Messaging {
+ class Program {
+ static void Main(string[] args) {
+ String broker = args.Length > 0 ? args[0] : "localhost:5672";
+ String address = args.Length > 1 ? args[1] : "amq.topic";
+
+ Connection connection = null;
+ try {
+ connection = new Connection(broker);
+ connection.Open(); <co id="hello-csharp-open" linkends="callout-csharp-open"/>
+ Session session = connection.CreateSession(); <co id="hello-csharp-session" linkends="callout-csharp-session"/>
+
+ Receiver receiver = session.CreateReceiver(address); <co id="hello-csharp-receiver" linkends="callout-csharp-receiver"/>
+ Sender sender = session.CreateSender(address); <co id="hello-csharp-sender" linkends="callout-csharp-sender"/>
+
+ sender.Send(new Message("Hello world!"));
+
+ Message message = new Message();
+ message = receiver.Fetch(DurationConstants.SECOND * 1); <co id="hello-csharp-fetch" linkends="callout-csharp-fetch"/>
+ Console.WriteLine("{0}", message.GetContent());
+ session.Acknowledge(); <co id="hello-csharp-acknowledge" linkends="callout-csharp-acknowledge"/>
+
+ connection.Close(); <co id="hello-csharp-close" linkends="callout-csharp-close"/>
+ } catch (Exception e) {
+ Console.WriteLine("Exception {0}.", e);
+ if (null != connection)
+ connection.Close();
+ }
+ }
+ }
+ }
+
+ </programlisting>
+
+ <calloutlist>
+ <callout id="callout-csharp-using" arearefs="hello-csharp-using">
+ <para> Permits use of Org.Apache.Qpid.Messaging types and methods without explicit namespace qualification. Any .NET project must have a project reference to the assembly file <literal>Org.Apache.Qpid.Messaging.dll</literal> in order to obtain the definitions of the .NET Binding for Qpid Messaging namespace.</para>
+ </callout>
+ <callout id="callout-csharp-open" arearefs="hello-csharp-open">
+ <para>Establishes the connection with the messaging broker.</para>
+ </callout>
+ <callout id="callout-csharp-session" arearefs="hello-csharp-session">
+ <para>Creates a session object on which messages will be sent and received.</para>
+ </callout>
+ <callout id="callout-csharp-receiver" arearefs="hello-csharp-receiver">
+ <para>Creates a receiver that receives messages from the given address.</para>
+ </callout>
+ <callout id="callout-csharp-sender" arearefs="hello-csharp-sender">
+ <para>Creates a sender that sends to the given address.</para>
+ </callout>
+ <callout id="callout-csharp-fetch" arearefs="hello-csharp-fetch">
+ <para>Receives the next message. The duration is optional, if omitted, will wait indefinitely for the next message.</para>
+ </callout>
+ <callout id="callout-csharp-acknowledge" arearefs="hello-csharp-acknowledge">
+ <para>Acknowledges receipt of all fetched messages on the
+ session. This informs the broker that the messages were
+ transfered and processed by the client successfully.</para>
+ </callout>
+ <callout id="callout-csharp-close" arearefs="hello-csharp-close">
+ <para>Closes the connection, all sessions managed by the connection, and all senders and receivers managed by each session.</para>
+ </callout>
+ </calloutlist>
+ </example>
+
+
+ </section>
+
+
+
+
+
+
+ <section id="section-addresses">
+ <title>Addresses</title>
+
+ <para>An <firstterm>address</firstterm> is the name of a message
+ target or message source.
+
+ <footnote><para>In the programs we have just seen, we used
+ <literal>amq.topic</literal> as the default address if none is
+ passed in. This is the name of a standard exchange that always
+ exists on an AMQP 0-10 messaging broker.</para></footnote>
+
+ The methods that create senders and receivers require an
+ address. The details of sending to a particular target or
+ receiving from a particular source are then handled by the
+ sender or receiver. A different target or source can be used
+ simply by using a different address.
+ </para>
+
+ <para>An address resolves to a <firstterm>node</firstterm>. The
+ Qpid Messaging API recognises two kinds of nodes,
+ <firstterm>queues</firstterm> and <firstterm>topics</firstterm>
+
+ <footnote><para>The terms <emphasis>queue</emphasis> and
+ <emphasis>topic</emphasis> here were chosen to align with
+ their meaning in JMS. These two addressing 'patterns',
+ queue and topic, are sometimes refered as point-to-point
+ and publish-subscribe. AMQP 0-10 has an exchange type
+ called a <emphasis>topic exchange</emphasis>. When the term
+ <emphasis>topic</emphasis> occurs alone, it refers to a
+ Messaging API topic, not the topic
+ exchange.</para></footnote>.
+
+ A queue stores each message until it has been received and
+ acknowledged, and only one receiver can receive a given message
+
+ <footnote><para>There are exceptions to this rule; for instance,
+ a receiver can use <literal>browse</literal> mode, which leaves
+ messages on the queue for other receivers to
+ read.</para></footnote>.
+
+ A topic immediately delivers a message to all eligible
+ receivers; if there are no eligible receivers, it discards the
+ message. In the AMQP 0-10 implementation of the API,
+
+ <footnote><para>The AMQP 0-10 implementation is the only one
+ that currently exists.</para></footnote>
+
+ queues map to AMQP queues, and topics map to AMQP exchanges.
+
+ <footnote><para>In AMQP 0-10, messages are sent to
+ exchanges, and read from queues. The Messaging API also
+ allows a sender to send messages to a queue; internally,
+ Qpid implements this by sending the message to the default
+ exchange, with the name of the queue as the routing key. The
+ Messaging API also allows a receiver to receive messages
+ from a topic; internally, Qpid implements this by setting up
+ a private subscription queue for the receiver and binding
+ the subscription queue to the exchange that corresponds to
+ the topic.</para></footnote>
+ </para>
+
+ <para>In the rest of this tutorial, we present many examples
+ using two programs that take an address as a command line
+ parameter. <command>spout</command> sends messages to the
+ target address, <command>drain</command> receives messages from
+ the source address. The source code is available in C++, Python, and
+ .NET C# and can be found in the examples directory for each
+ language. These programs can use any address string as a source
+ or a destination, and have many command line options to
+ configure behavior&mdash;use the <command>-h</command> option
+ for documentation on these options.
+
+ <footnote><para>Currently, the C++, Python, and .NET C#
+ implementations of <command>drain</command> and
+ <command>spout</command> have slightly different
+ options. This tutorial uses the C++ implementation. The
+ options will be reconciled in the near
+ future.</para></footnote>
+
+
+ The examples in this tutorial also use the
+ <command>qpid-config</command> utility to configure AMQP 0-10
+ queues and exchanges on a Qpid broker.
+ </para>
+
+
+ <example>
+ <title>Queues</title>
+
+ <para>Create a queue with <command>qpid-config</command>, send a message using
+ <command>spout</command>, and read it using <command>drain</command>:</para>
+
+ <screen>
+ $ qpid-config add queue hello-world
+ $ ./spout hello-world
+ $ ./drain hello-world
+
+ Message(properties={spout-id:c877e622-d57b-4df2-bf3e-6014c68da0ea:0}, content='')
+ </screen>
+
+ <para>The queue stored the message sent by <command>spout</command> and delivered
+ it to <command>drain</command> when requested.</para>
+
+ <para>Once the message has been delivered and and acknowledged
+ by <command>drain</command>, it is no longer available on the queue. If we run
+ <command>drain</command> one more time, no messages will be retrieved.</para>
+
+ <screen>
+ $ ./drain hello-world
+ $
+ </screen>
+
+ </example>
+
+ <example>
+ <title>Topics</title>
+
+ <para>This example is similar to the previous example, but it
+ uses a topic instead of a queue.</para>
+
+ <para>First, use <command>qpid-config</command> to remove the queue
+ and create an exchange with the same name:</para>
+
+ <screen>
+ $ qpid-config del queue hello-world
+ $ qpid-config add exchange topic hello-world
+ </screen>
+
+ <para>Now run <command>drain</command> and <command>spout</command> the same way we did in the previous example:</para>
+
+ <screen>
+ $ ./spout hello-world
+ $ ./drain hello-world
+ $
+ </screen>
+
+ <para>Topics deliver messages immediately to any interested
+ receiver, and do not store messages. Because there were no
+ receivers at the time <command>spout</command> sent the
+ message, it was simply discarded. When we ran
+ <command>drain</command>, there were no messages to
+ receive.</para>
+
+ <para>Now let's run <command>drain</command> first, using the
+ <literal>-t</literal> option to specify a timeout in seconds.
+ While <command>drain</command> is waiting for messages,
+ run <command>spout</command> in another window.</para>
+
+ <para><emphasis>First Window:</emphasis></para>
+
+ <screen>
+ $ ./drain -t 30 hello-word
+ </screen>
+
+
+ <para><emphasis>Second Window:</emphasis></para>
+
+ <screen>
+ $ ./spout hello-word
+ </screen>
+
+ <para>Once <command>spout</command> has sent a message, return
+ to the first window to see the output from
+ <command>drain</command>:</para>
+
+ <screen>
+ Message(properties={spout-id:7da2d27d-93e6-4803-8a61-536d87b8d93f:0}, content='')
+ </screen>
+
+ <para>You can run <command>drain</command> in several separate
+ windows; each creates a subscription for the exchange, and
+ each receives all messages sent to the exchange.</para>
+
+ </example>
+
+ <section>
+ <title>Address Strings</title>
+
+ <para>So far, our examples have used address strings that
+ contain only the name of a node. An <firstterm>address
+ string</firstterm> can also contain a
+ <firstterm>subject</firstterm> and
+ <firstterm>options</firstterm>.</para>
+
+ <para>The syntax for an address string is:</para>
+
+ <programlisting><![CDATA[
+ address_string ::= <address> [ / <subject> ] [ ; <options> ]
+ options ::= { <key> : <value>, ... }
+ ]]></programlisting>
+
+ <para>Addresses, subjects, and keys are strings. Values can
+ be numbers, strings (with optional single or double quotes),
+ maps, or lists. A complete BNF for address strings appears in
+ <xref linkend="section-address-string-bnf"/>.</para>
+
+
+ <para>So far, the address strings in this tutorial have only
+ used simple names. The following sections show how to use
+ subjects and options.</para>
+
+ </section>
+
+ <section>
+ <title>Subjects</title>
+
+
+ <para>Every message has a property called
+ <firstterm>subject</firstterm>, which is analogous to the
+ subject on an email message. If no subject is specified, the
+ message's subject is null. For convenience, address strings
+ also allow a subject. If a sender's address contains a
+ subject, it is used as the default subject for the messages
+ it sends.
+
+ If a receiver's address contains a subject, it is used to
+ select only messages that match the subject&mdash;the matching
+ algorithm depends on the message source.
+ </para>
+
+ <para>
+ In AMQP 0-10, each exchange type has its own matching
+ algorithm. This is discussed in
+ <xref linkend="section-amqp0-10-mapping"/>.
+ </para>
+
+ <note>
+ <para>
+ Currently, a receiver bound to a queue ignores subjects,
+ receiving messages from the queue without filtering. Support
+ for subject filtering on queues will be implemented soon.
+ </para>
+ </note>
+
+
+ <example>
+ <title>Using subjects</title>
+
+ <para>In this example we show how subjects affect message
+ flow.</para>
+
+ <para>First, let's use <command>qpid-config</command> to create a topic exchange.</para>
+
+ <screen>
+ $ qpid-config add exchange topic news-service
+ </screen>
+
+ <para>Now we use drain to receive messages from <literal>news-service</literal> that match the subject <literal>sports</literal>.</para>
+ <para><emphasis>First Window:</emphasis></para>
+ <screen>
+ $ ./drain -t 30 news-service/sports
+ </screen>
+
+ <para>In a second window, let's send messages to <literal>news-service</literal> using two different subjects:</para>
+
+ <para><emphasis>Second Window:</emphasis></para>
+ <screen>
+ $ ./spout news-service/sports
+ $ ./spout news-service/news
+ </screen>
+
+ <para>Now look at the first window, the message with the
+ subject <literal>sports</literal> has been received, but not
+ the message with the subject <literal>news</literal>:</para>
+
+ <screen>
+ Message(properties={qpid.subject:sports, spout-id:9441674e-a157-4780-a78e-f7ccea998291:0}, content='')
+ </screen>
+
+ <para>If you run <command>drain</command> in multiple
+ windows using the same subject, all instances of
+ <command>drain</command> receive the messages for that
+ subject.</para>
+ </example>
+
+
+ <para>The AMQP exchange type we are using here,
+ <literal>amq.topic</literal>, can also do more sophisticated
+ matching.
+
+ A sender's subject can contain multiple words separated by a
+ <quote>.</quote> delimiter. For instance, in a news
+ application, the sender might use subjects like
+ <literal>usa.news</literal>, <literal>usa.weather</literal>,
+ <literal>europe.news</literal>, or
+ <literal>europe.weather</literal>.
+
+ The receiver's subject can include wildcard characters&mdash;
+ <quote>#</quote> matches one or more words in the message's
+ subject, <quote>*</quote> matches a single word.
+
+ For instance, if the subject in the source address is
+ <literal>*.news</literal>, it matches messages with the
+ subject <literal>europe.news</literal> or
+ <literal>usa.news</literal>; if it is
+ <literal>europe.#</literal>, it matches messages with subjects
+ like <literal>europe.news</literal> or
+ <literal>europe.pseudo.news</literal>.</para>
+
+ <example>
+ <title>Subjects with multi-word keys</title>
+
+ <para>This example uses drain and spout to demonstrate the
+ use of subjects with two-word keys.</para>
+
+ <para>Let's use <command>drain</command> with the subject
+ <literal>*.news</literal> to listen for messages in which
+ the second word of the key is
+ <literal>news</literal>.</para>
+
+ <para><emphasis>First Window:</emphasis></para>
+
+ <screen>
+ $ ./drain -t 30 news-service/*.news
+ </screen>
+
+ <para>Now let's send messages using several different
+ two-word keys:</para>
+
+ <para><emphasis>Second Window:</emphasis></para>
+
+ <screen>
+ $ ./spout news-service/usa.news
+ $ ./spout news-service/usa.sports
+ $ ./spout news-service/europe.sports
+ $ ./spout news-service/europe.news
+ </screen>
+
+ <para>In the first window, the messages with
+ <literal>news</literal> in the second word of the key have
+ been received:</para>
+
+ <screen>
+ Message(properties={qpid.subject:usa.news, spout-id:73fc8058-5af6-407c-9166-b49a9076097a:0}, content='')
+ Message(properties={qpid.subject:europe.news, spout-id:f72815aa-7be4-4944-99fd-c64c9747a876:0}, content='')
+ </screen>
+
+
+ <para>Next, let's use <command>drain</command> with the
+ subject <literal>#.news</literal> to match any sequence of
+ words that ends with <literal>news</literal>.</para>
+
+ <para><emphasis>First Window:</emphasis></para>
+
+ <screen>
+ $ ./drain -t 30 news-service/#.news
+ </screen>
+
+ <para>In the second window, let's send messages using a
+ variety of different multi-word keys:</para>
+
+ <para><emphasis>Second Window:</emphasis></para>
+
+ <screen>
+ $ ./spout news-service/news
+ $ ./spout news-service/sports
+ $ ./spout news-service/usa.news
+ $ ./spout news-service/usa.sports
+ $ ./spout news-service/usa.faux.news
+ $ ./spout news-service/usa.faux.sports
+ </screen>
+
+ <para>In the first window, messages with
+ <literal>news</literal> in the last word of the key have been
+ received:</para>
+
+ <screen>
+ Message(properties={qpid.subject:news, spout-id:cbd42b0f-c87b-4088-8206-26d7627c9640:0}, content='')
+ Message(properties={qpid.subject:usa.news, spout-id:234a78d7-daeb-4826-90e1-1c6540781eac:0}, content='')
+ Message(properties={qpid.subject:usa.faux.news, spout-id:6029430a-cfcb-4700-8e9b-cbe4a81fca5f:0}, content='')
+ </screen>
+ </example>
+
+ </section>
+
+ <section>
+ <title>Address String Options</title>
+
+ <para>
+ The options in an address string can contain additional
+ information for the senders or receivers created for it,
+ including:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Policies for assertions about the node to which an address
+ refers.
+ </para>
+ <para>
+ For instance, in the address string <literal>my-queue;
+ {assert: always, node:{ type: queue }}</literal>, the node
+ named <literal>my-queue</literal> must be a queue; if not,
+ the address does not resolve to a node, and an exception
+ is raised.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Policies for automatically creating or deleting the node to which an address refers.
+ </para>
+ <para>
+ For instance, in the address string <literal>xoxox ; {create: always}</literal>,
+ the queue <literal>xoxox</literal> is created, if it does
+ not exist, before the address is resolved.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Extension points that can be used for sender/receiver configuration.
+ </para>
+ <para>
+ For instance, if the address for a receiver is
+ <literal>my-queue; {mode: browse}</literal>, the receiver
+ works in <literal>browse</literal> mode, leaving messages
+ on the queue so other receivers can receive them.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Extension points providing more direct control over the underlying protocol.
+ </para>
+ <para>
+ For instance, the <literal>x-bindings</literal> property
+ allows greater control over the AMQP 0-10 binding process
+ when an address is resolved.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+
+ <para>
+ Let's use some examples to show how these different kinds of
+ address string options affect the behavior of senders and
+ receives.
+ </para>
+
+ <section>
+ <title>assert</title>
+ <para>
+ In this section, we use the <literal>assert</literal> option
+ to ensure that the address resolves to a node of the required
+ type.
+ </para>
+
+
+ <example>
+ <title>Assertions on Nodes</title>
+
+ <para>Let's use <command>qpid-config</command> to create a
+ queue and a topic.</para>
+
+ <screen>
+ $ qpid-config add queue my-queue
+ $ qpid-config add exchange topic my-topic
+ </screen>
+
+ <para>
+ We can now use the address specified to drain to assert that it is
+ of a particular type:
+ </para>
+
+ <screen>
+ $ ./drain 'my-queue; {assert: always, node:{ type: queue }}'
+ $ ./drain 'my-queue; {assert: always, node:{ type: topic }}'
+ 2010-04-20 17:30:46 warning Exception received from broker: not-found: not-found: Exchange not found: my-queue (../../src/qpid/broker/ExchangeRegistry.cpp:92) [caused by 2 \x07:\x01]
+ Exchange my-queue does not exist
+ </screen>
+
+ <para>
+ The first attempt passed without error as my-queue is indeed a
+ queue. The second attempt however failed; my-queue is not a
+ topic.
+ </para>
+
+ <para>
+ We can do the same thing for my-topic:
+ </para>
+
+ <screen>
+ $ ./drain 'my-topic; {assert: always, node:{ type: topic }}'
+ $ ./drain 'my-topic; {assert: always, node:{ type: queue }}'
+ 2010-04-20 17:31:01 warning Exception received from broker: not-found: not-found: Queue not found: my-topic (../../src/qpid/broker/SessionAdapter.cpp:754) [caused by 1 \x08:\x01]
+ Queue my-topic does not exist
+ </screen>
+ </example>
+
+ <para>Now let's use the <literal>create</literal> option to
+ create the queue <literal>xoxox</literal> if it does not already
+ exist:</para>
+
+ </section>
+
+ <section>
+ <title>create</title>
+
+ <para>In previous examples, we created the queue before
+ listening for messages on it. Using <literal>create:
+ always</literal>, the queue is automatically created if it
+ does not exist.</para>
+
+ <example>
+ <title>Creating a Queue Automatically</title>
+
+ <para><emphasis>First Window:</emphasis></para>
+ <screen>$ ./drain -t 30 "xoxox ; {create: always}"</screen>
+
+
+ <para>Now we can send messages to this queue:</para>
+
+ <para><emphasis>Second Window:</emphasis></para>
+ <screen>$ ./spout "xoxox ; {create: always}"</screen>
+
+ <para>Returning to the first window, we see that <command>drain</command> has received this message:</para>
+
+ <screen>Message(properties={spout-id:1a1a3842-1a8b-4f88-8940-b4096e615a7d:0}, content='')</screen>
+ </example>
+ <para>The details of the node thus created can be controlled by further options within the node. See <xref linkend="table-node-properties"/> for details.</para>
+ </section>
+
+ <section>
+ <title>browse</title>
+ <para>Some options specify message transfer semantics; for
+ instance, they may state whether messages should be consumed or
+ read in browsing mode, or specify reliability
+ characteristics. The following example uses the
+ <literal>browse</literal> option to receive messages without
+ removing them from a queue.</para>
+
+ <example>
+ <title>Browsing a Queue</title>
+ <para>
+ Let's use the browse mode to receive messages without
+ removing them from the queue. First we send three messages to the
+ queue:
+ </para>
+ <screen>
+ $ ./spout my-queue --content one
+ $ ./spout my-queue --content two
+ $ ./spout my-queue --content three
+ </screen>
+
+ <para>Now we use drain to get those messages, using the browse option:</para>
+ <screen>
+ $ ./drain 'my-queue; {mode: browse}'
+ Message(properties={spout-id:fbb93f30-0e82-4b6d-8c1d-be60eb132530:0}, content='one')
+ Message(properties={spout-id:ab9e7c31-19b0-4455-8976-34abe83edc5f:0}, content='two')
+ Message(properties={spout-id:ea75d64d-ea37-47f9-96a9-d38e01c97925:0}, content='three')
+ </screen>
+
+ <para>We can confirm the messages are still on the queue by repeating the drain:</para>
+ <screen>
+ $ ./drain 'my-queue; {mode: browse}'
+ Message(properties={spout-id:fbb93f30-0e82-4b6d-8c1d-be60eb132530:0}, content='one')
+ Message(properties={spout-id:ab9e7c31-19b0-4455-8976-34abe83edc5f:0}, content='two')
+ Message(properties={spout-id:ea75d64d-ea37-47f9-96a9-d38e01c97925:0}, content='three')
+ </screen>
+ </example>
+ </section>
+
+ <section>
+ <title>x-bindings</title>
+
+ <para>Greater control over the AMQP 0-10 binding process can
+ be achieved by including an <literal>x-bindings</literal>
+ option in an address string.
+
+ For instance, the XML Exchange is an AMQP 0-10 custom exchange
+ provided by the Apache Qpid C++ broker. It allows messages to
+ be filtered using XQuery; queries can address either message
+ properties or XML content in the body of the message. The
+ xquery is specified in the arguments field of the AMQP 0-10
+ command. When using the messaging API an xquery can be
+ specified in and address that resolves to an XML exchange by
+ using the x-bindings property.</para>
+
+
+ <para>An instance of the XML Exchange must be added before it
+ can be used:</para>
+
+ <programlisting>
+ $ qpid-config add exchange xml xml
+ </programlisting>
+
+ <para>When using the XML Exchange, a receiver provides an
+ XQuery as an x-binding argument. If the query contains a
+ context item (a path starting with <quote>.</quote>), then it
+ is applied to the content of the message, which must be
+ well-formed XML. For instance, <literal>./weather</literal> is
+ a valid XQuery, which matches any message in which the root
+ element is named <literal>weather</literal>. Here is an
+ address string that contains this query:</para>
+
+ <programlisting><![CDATA[
+ xml; {
+ link: {
+ x-bindings: [{exchange:xml, key:weather, arguments:{xquery:"./weather"} }]
+ }
+ }
+ ]]></programlisting>
+
+ <para>When using longer queries with <command>drain</command>,
+ it is often useful to place the query in a file, and use
+ <command>cat</command> in the command line. We do this in the
+ following example.</para>
+
+ <example>
+ <title>Using the XML Exchange</title>
+
+ <para>This example uses an x-binding that contains queries, which filter based on the content of XML messages. Here is an XQuery that we will use in this example:</para>
+
+ <programlisting>
+ <![CDATA[
+ let $w := ./weather
+ return $w/station = 'Raleigh-Durham International Airport (KRDU)'
+ and $w/temperature_f > 50
+ and $w/temperature_f - $w/dewpoint > 5
+ and $w/wind_speed_mph > 7
+ and $w/wind_speed_mph < 20 ]]>
+ </programlisting>
+
+ <para>We can specify this query in an x-binding to listen to messages that meet the criteria specified by the query:</para>
+
+ <para><emphasis>First Window:</emphasis></para>
+
+ <screen>
+ $ ./drain -f "xml; {link:{x-bindings:[{key:'weather',
+ arguments:{xquery:\"$(cat rdu.xquery )\"}}]}}"
+ </screen>
+
+ <para>In another window, let's create an XML message that meets the criteria in the query, and place it in the file <filename>rdu.xml</filename>:</para>
+
+ <programlisting>
+ <![CDATA[
+ <weather>
+ <station>Raleigh-Durham International Airport (KRDU)</station>
+ <wind_speed_mph>16</wind_speed_mph>
+ <temperature_f>70</temperature_f>
+ <dewpoint>35</dewpoint>
+ </weather>
+ ]]></programlisting>
+
+ <para>Now let's use <command>spout</command> to send this message to the XML exchange:</para>
+
+ <para><emphasis>Second Window:</emphasis></para>
+ <screen>
+ spout --content "$(cat rdu.xml)" xml/weather
+ </screen>
+
+ <para>Returning to the first window, we see that the message has been received:</para>
+
+ <screen><![CDATA[$ ./drain -f "xml; {link:{x-bindings:[{exchange:'xml', key:'weather', arguments:{xquery:\"$(cat rdu.xquery )\"}}]}}"
+ Message(properties={qpid.subject:weather, spout-id:31c431de-593f-4bec-a3dd-29717bd945d3:0},
+ content='<weather>
+ <station>Raleigh-Durham International Airport (KRDU)</station>
+ <wind_speed_mph>16</wind_speed_mph>
+ <temperature_f>40</temperature_f>
+ <dewpoint>35</dewpoint>
+ </weather>') ]]>
+ </screen>
+ </example>
+ </section>
+
+ <!--
+ <para>When sending data using <command>cat</command> to provide arguments to <command>spout</command>, you can use <command>sed</command> to change the values that are sent:</para>
+
+<screen>
+spout - -content "$(cat rdu.xml | sed -e 's/70/45/')" xml/weather
+</screen>
+ -->
+
+ <!--
+ TODO: Add some reliability option examples
+ -->
+
+ <section>
+ <title>Address String Options - Reference</title>
+
+ <table pgwide="1">
+ <title>Address String Options</title>
+ <tgroup cols="3">
+ <thead>
+ <colspec colnum="1" colwidth="1*"/>
+ <colspec colnum="2" colwidth="3*"/>
+ <colspec colnum="3" colwidth="3*"/>
+ <row>
+ <entry>option</entry>
+ <entry>value</entry>
+ <entry>semantics</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ assert
+ </entry>
+ <entry>
+ one of: always, never, sender or receiver
+ </entry>
+ <entry>
+ Asserts that the properties specified in the node option
+ match whatever the address resolves to. If they do not,
+ resolution fails and an exception is raised. <!-- ###
+ Which exception -->
+ </entry>
+ </row>
+
+ <row>
+ <entry>
+ create
+ </entry>
+ <entry>
+ one of: always, never, sender or receiver
+ </entry>
+ <entry>
+ Creates the node to which an address refers if it does
+ not exist. No error is raised if the node does
+ exist. The details of the node may be specified in the
+ node option.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ delete
+ </entry>
+ <entry>
+ one of: always, never, sender or receiver
+ </entry>
+ <entry>
+ Delete the node when the sender or receiver is closed.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ node
+ </entry>
+ <entry>
+ A nested map containing the entries shown in <xref linkend="table-node-properties"/>.
+ </entry>
+ <entry>
+ Specifies properties of the node to which the address
+ refers. These are used in conjunction with the assert or
+ create options.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ link
+ </entry>
+ <entry>
+ A nested map containing the entries shown in <xref linkend="table-link-properties"/>.
+ </entry>
+ <entry>
+ Used to control the establishment of a conceptual link
+ from the client application to or from the target/source
+ address.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ mode
+ </entry>
+ <entry>
+ one of: browse, consume
+ </entry>
+ <entry>
+ This option is only of relevance for source addresses
+ that resolve to a queue. If browse is specified the
+ messages delivered to the receiver are left on the queue
+ rather than being removed. If consume is specified the
+ normal behaviour applies; messages are removed from the
+ queue once the client acknowledges their receipt.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+
+ <table id="table-node-properties" pgwide="1">
+ <title>Node Properties</title>
+ <tgroup cols="3">
+ <thead>
+ <colspec colnum="1" colwidth="1*"/>
+ <colspec colnum="2" colwidth="3*"/>
+ <colspec colnum="3" colwidth="3*"/>
+ <row>
+ <entry>property</entry>
+ <entry>value</entry>
+ <entry>semantics</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ type
+ </entry>
+ <entry>
+ topic, queue
+ </entry>
+ <entry>
+ Indicates the type of the node.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ durable
+ </entry>
+ <entry>
+ True, False
+ </entry>
+ <entry>
+ Indicates whether the node survives a loss of
+ volatile storage e.g. if the broker is restarted.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ x-declare
+ </entry>
+ <entry>
+ A nested map whose values correspond to the valid fields
+ on an AMQP 0-10 queue-declare or exchange-declare
+ command.
+ </entry>
+ <entry>
+ These values are used to fine tune the creation or
+ assertion process. Note however that they are protocol
+ specific.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ x-bindings
+ </entry>
+ <entry>
+ A nested list in which each binding is represented by
+ a map. The entries of the map for a binding contain
+ the fields that describe an AMQP 0-10 binding. Here is
+ the format for x-bindings:
+
+ <programlisting><![CDATA[
+ [
+ {
+ exchange: <exchange>,
+ queue: <queue>,
+ key: <key>,
+ arguments: {
+ <key_1>: <value_1>,
+ ...,
+ <key_n>: <value_n> }
+ },
+ ...
+ ]
+ ]]></programlisting>
+ </entry>
+ <entry>
+ In conjunction with the create option, each of these
+ bindings is established as the address is resolved. In
+ conjunction with the assert option, the existence of
+ each of these bindings is verified during
+ resolution. Again, these are protocol specific.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table id="table-link-properties" pgwide="1">
+ <title>Link Properties</title>
+ <tgroup cols="3">
+ <thead>
+ <colspec colnum="1" colwidth="1*"/>
+ <colspec colnum="2" colwidth="3*"/>
+ <colspec colnum="3" colwidth="3*"/>
+ <row>
+ <entry>option</entry>
+ <entry>value</entry>
+ <entry>semantics</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ reliability
+ </entry>
+ <entry>
+ one of: unreliable, at-least-once, at-most-once, exactly-once
+ </entry>
+ <entry>
+ Reliability indicates the level of reliability that
+ the sender or receiver. <literal>unreliable</literal>
+ and <literal>at-most-once</literal> are currently
+ treated as synonyms, and allow messages to be lost if
+ a broker crashes or the connection to a broker is
+ lost. <literal>at-least-once</literal> guarantees that
+ a message is not lost, but duplicates may be
+ received. <literal>exactly-once</literal> guarantees
+ that a message is not lost, and is delivered precisely
+ once. Currently only <literal>unreliable</literal>
+ and <literal>at-least-once</literal> are supported.
+ <footnote><para>If at-most-once is requested,
+ unreliable will be used and for durable messages on
+ durable queues there is the possibility that messages
+ will be redelivered; if exactly-once is requested,
+ at-most-once will be used and the application needs to
+ be able to deal with duplicates.</para></footnote>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ durable
+ </entry>
+ <entry>
+ True, False
+ </entry>
+ <entry>
+ Indicates whether the link survives a loss of
+ volatile storage e.g. if the broker is restarted.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ x-declare
+ </entry>
+ <entry>
+ A nested map whose values correspond to the valid fields
+ of an AMQP 0-10 queue-declare command.
+ </entry>
+ <entry>
+ These values can be used to customise the subscription
+ queue in the case of receiving from an exchange. Note
+ however that they are protocol specific.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ x-subscribe
+ </entry>
+ <entry>
+ A nested map whose values correspond to the valid fields
+ of an AMQP 0-10 message-subscribe command.
+ </entry>
+ <entry>
+ These values can be used to customise the subscription.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ x-bindings
+ </entry>
+ <entry>
+ A nested list each of whose entries is a map that may
+ contain fields (queue, exchange, key and arguments)
+ describing an AMQP 0-10 binding.
+ </entry>
+ <entry>
+ These bindings are established during resolution
+ independent of the create option. They are considered
+ logically part of the linking process rather than of
+ node creation.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ </section>
+ </section>
+
+ <section id="section-address-string-bnf">
+ <title>Address String Grammar</title>
+
+ <para>This section provides a formal grammar for address strings.</para>
+
+ <formalpara>
+ <title>Tokens</title>
+ <para>The following regular expressions define the tokens used
+ to parse address strings:</para></formalpara>
+ <programlisting><![CDATA[
+ LBRACE: \\{
+ RBRACE: \\}
+ LBRACK: \\[
+ RBRACK: \\]
+ COLON: :
+ SEMI: ;
+ SLASH: /
+ COMMA: ,
+ NUMBER: [+-]?[0-9]*\\.?[0-9]+
+ ID: [a-zA-Z_](?:[a-zA-Z0-9_-]*[a-zA-Z0-9_])?
+ STRING: "(?:[^\\\\"]|\\\\.)*"|\'(?:[^\\\\\']|\\\\.)*\'
+ ESC: \\\\[^ux]|\\\\x[0-9a-fA-F][0-9a-fA-F]|\\\\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]
+ SYM: [.#*%@$^!+-]
+ WSPACE: [ \\n\\r\\t]+
+ ]]></programlisting>
+
+ <formalpara>
+ <title>Grammar</title>
+ <para>The formal grammar for addresses is given below:</para>
+ </formalpara>
+
+ <programlisting><![CDATA[
+ address := name [ SLASH subject ] [ ";" options ]
+ name := ( part | quoted )+
+ subject := ( part | quoted | SLASH )*
+ quoted := STRING / ESC
+ part := LBRACE / RBRACE / COLON / COMMA / NUMBER / ID / SYM
+ options := map
+ map := "{" ( keyval ( "," keyval )* )? "}"
+ keyval "= ID ":" value
+ value := NUMBER / STRING / ID / map / list
+ list := "[" ( value ( "," value )* )? "]"
+ ]]></programlisting>
+
+
+ <formalpara>
+ <title>Address String Options</title>
+ <para>The address string options map supports the following parameters:</para>
+ </formalpara>
+
+ <programlisting><![CDATA[
+ <name> [ / <subject> ] ; {
+ create: always | sender | receiver | never,
+ delete: always | sender | receiver | never,
+ assert: always | sender | receiver | never,
+ mode: browse | consume,
+ node: {
+ type: queue | topic,
+ durable: True | False,
+ x-declare: { ... <declare-overrides> ... },
+ x-bindings: [<binding_1>, ... <binding_n>]
+ },
+ link: {
+ name: <link-name>,
+ durable: True | False,
+ reliability: unreliable | at-most-once | at-least-once | exactly-once,
+ x-declare: { ... <declare-overrides> ... },
+ x-bindings: [<binding_1>, ... <binding_n>],
+ x-subscribe: { ... <subscribe-overrides> ... }
+ }
+ }
+ ]]></programlisting>
+
+
+ <itemizedlist>
+ <title>Create, Delete, and Assert Policies</title>
+ <para>The create, delete, and assert policies specify who should
+ perfom the associated action:</para>
+ <listitem><para><emphasis>always</emphasis>: the action is performed by any messaging client</para></listitem>
+ <listitem><para><emphasis>sender</emphasis>: the action is only performed by a sender</para></listitem>
+ <listitem><para><emphasis>receiver</emphasis>: the action is only performed by a receiver</para></listitem>
+ <listitem><para><emphasis>never</emphasis>: the action is never performed (this is the default)</para></listitem>
+ </itemizedlist>
+
+ <itemizedlist>
+ <title>Node-Type</title>
+ <para>The node-type is one of:</para>
+ <listitem><para><emphasis>topic</emphasis>: in the AMQP 0-10
+ mapping, a topic node defaults to the topic exchange, x-declare
+ may be used to specify other exchange types</para></listitem>
+ <listitem><para><emphasis>queue</emphasis>: this is the default node-type</para></listitem>
+ </itemizedlist>
+ </section>
+
+
+ </section>
+
+ <section id="replay">
+ <title>Sender Capacity and Replay</title>
+
+ <para>The send method of a sender has an optional second parameter
+ that controls whether the send call is synchronous or not. A
+ synchronous send call will block until the broker has confirmed
+ receipt of the message. An asynchronous send call will return
+ before the broker confirms receipt of the message, allowing for
+ example further send calls to be made without waiting for a
+ roundtrip to the broker for each message. This is desirable where
+ increased throughput is important.</para>
+
+ <para>The sender maintains a list of sent messages whose receipt
+ has yet to be confirmed by the broker. The maximum number of such
+ messages that it will hold is defined by the capacity of the
+ sender, which can be set by the application. If an application
+ tries to send with a sender whose capacity is already fully used
+ up, the send call will block waiting for capacity regardless of
+ the value of the sync flag.</para>
+
+ <para>The sender can be queried for the available space (i.e. the
+ unused capacity), and for the current count of unsettled messages
+ (i.e. those held in the replay list pending confirmation by the
+ server). When the unsettled count is zero, all messages on that
+ sender have been successfully sent.</para>
+
+ <para>If the connection fails and is transparently reconnected
+ (see <xref linkend="connection-options"/> for details on how to control
+ this feature), the unsettled messages for each sender over that
+ connection will be re-transmitted. This provides a transparent
+ level of reliability. This feature can be controlled through the
+ link's reliability as defined in the address (see
+ <xref linkend="table-link-properties"/>). At present only
+ at-least-once guarantees are offered. </para>
+ </section>
+
+ <section id="prefetch">
+ <title>Receiver Capacity (Prefetch)</title>
+
+ <para>By default, a receiver requests the next message from the
+ server in response to each fetch call, resulting in messages being
+ sent to the receiver one at a time. As in the case of sending, it
+ is often desirable to avoid this roundtrip for each message. This
+ can be achieved by allowing the receiver
+ to <firstterm>prefetch</firstterm> messages in anticipation of
+ fetch calls being made. The receiver needs to be able to store
+ these prefetched messages, the number it can hold is controlled by
+ the receivers capacity.</para>
+
+ </section>
+
+ <section id="acknowledgements">
+ <title>Acknowledging Received Messages</title>
+
+ <para>Applications that receive messages should acknowledge their
+ receipt by calling the session's acknowledge method. As in the
+ case of sending messages, acknowledged transfer of messages to
+ receivers provides at-least-once reliability, which means that the
+ loss of the connection or a client crash does not result in lost
+ messages; durable messages are not lost even if the broker is
+ restarted.
+
+ Some cases may not require this however and the reliability can be
+ controlled through a link property in the address options (see
+ <xref linkend="table-link-properties"/>).</para>
+
+ <para>The acknowledge call acknowledges all messages received on
+ the session (i.e. all message that have been returned from a fetch
+ call on a receiver created on that session).</para>
+
+ <para>The acknowledge call also support an optional parameter
+ controlling whether the call is synchronous or not. A synchronous
+ acknowledge will block until the server has confirmed that it has
+ received the acknowledgement. In the asynchronous case, when the
+ call returns there is not yet any guarantee that the server has
+ received and processed the acknowledgement. The session may be
+ queried for the number of unsettled acknowledgements; when that
+ count is zero all acknowledgements made for received messages have
+ been successful.</para>
+
+ </section>
+
+
+ <section>
+ <title>Receiving Messages from Multiple Sources</title>
+
+ <para>A receiver can only read from one source, but many
+ programs need to be able to read messages from many sources. In
+ the Qpid Messaging API, a program can ask a session for
+ the <quote>next receiver</quote>; that is, the receiver that is
+ responsible for the next available message. The following
+ examples show how this is done in C++, Python, and .NET C#.
+ </para>
+
+ <para>Note that to use this pattern you must enable prefetching
+ for each receiver of interest so that the broker will send
+ messages before a fetch call is made. See
+ <xref linkend="prefetch"/> for more on this.</para>
+
+ <example>
+ <title>Receiving Messages from Multiple Sources</title>
+
+ <para>C++:</para>
+
+ <programlisting><![CDATA[
+ Receiver receiver1 = session.createReceiver(address1);
+ receiver1.setCapacity(10);
+ Receiver receiver2 = session.createReceiver(address2);
+ receiver2.setCapacity(10);
+
+ Message message = session.nextReceiver().fetch();
+ std::cout << message.getContent() << std::endl;
+ session.acknowledge(); // acknowledge message receipt
+ ]]> </programlisting>
+
+ <para>Python:</para>
+ <programlisting><![CDATA[
+ receiver1 = session.receiver(address1)
+ receiver1.capacity = 10
+ receiver2 = session.receiver(address)
+ receiver2.capacity = 10
+ message = session.next_receiver().fetch()
+ print message.content
+ session.acknowledge()
+ ]]> </programlisting>
+
+ <para>.NET C#:</para>
+ <programlisting><![CDATA[
+ Receiver receiver1 = session.CreateReceiver(address1);
+ receiver1.Capacity = 10;
+ Receiver receiver2 = session.CreateReceiver(address2);
+ receiver2.Capacity = 10;
+
+ Message message = new Message();
+ message = session.NextReceiver().Fetch();
+ Console.WriteLine("{0}", message.GetContent());
+ session.Acknowledge();
+ ]]> </programlisting>
+
+ </example>
+ </section>
+
+ <section>
+ <title>Transactions</title>
+
+ <para>Sometimes it is useful to be able to group messages
+ transfers - sent and/or received - on a session into atomic
+ grouping. This can be done be creating the session as
+ transactional. On a transactional session sent messages only
+ become available at the target address on commit. Likewise any
+ received and acknowledged messages are only discarded at their
+ source on commit
+
+ <footnote><para>Note that this currently is only true for
+ messages received using a reliable mode
+ e.g. at-least-once. Messages sent by a broker to a receiver in
+ unreliable receiver will be discarded immediately regardless of
+ transctionality.</para></footnote>
+
+ .</para>
+
+ <example>
+ <title>Transactions</title>
+ <para>C++:</para>
+ <programlisting><![CDATA[
+ Connection connection(broker);
+ Session session = connection.createTransactionalSession();
+ ...
+ if (smellsOk())
+ session.commit();
+ else
+ session.rollback();
+ ]]></programlisting>
+ <para>
+ .NET C#:
+ </para>
+
+ <programlisting>
+ Connection connection = new Connection(broker);
+ Session session = connection.CreateTransactionalSession();
+ ...
+ if (smellsOk())
+ session.Commit();
+ else
+ session.Rollback();
+ </programlisting>
+ <!--
+ <para>Python</para>
+ <programlisting><![CDATA[
+ ### TODO
+ ]]></programlisting>
+ -->
+ </example>
+
+ </section>
+
+ <section id="connection-options">
+ <title>Connection Options</title>
+
+ <para>
+ Aspects of the connections behaviour can be controlled through
+ specifying connection options. For example, connections can be
+ configured to automatically reconnect if the connection to a
+ broker is lost.
+ </para>
+
+ <example>
+ <title>Specifying Connection Options in C++, Python, and .NET</title>
+
+ <para>In C++, these options can be set using <function>Connection::setOption()</function> or by passing in a set of options to the constructor. The options can be passed in as a map or in string form:</para>
+
+ <programlisting><![CDATA[
+ Connection connection("localhost:5672", "{reconnect: true}");
+ try {
+ connection.open();
+ !!! SNIP !!!
+ ]]></programlisting>
+
+ <para>or</para>
+
+ <programlisting><![CDATA[
+ Connection connection("localhost:5672");
+ connection.setOption("reconnect", true);
+ try {
+ connection.open();
+ !!! SNIP !!!
+ ]]></programlisting>
+
+ <para>In Python, these options can be set as attributes of the connection or using named arguments in
+ the <function>Connection</function> constructor:</para>
+
+ <programlisting><![CDATA[
+ connection = Connection("localhost:5672", reconnect=True)
+ try:
+ connection.open()
+ !!! SNIP !!!
+ ]]></programlisting>
+
+ <para>or</para>
+
+ <programlisting><![CDATA[
+ connection = Connection("localhost:5672")
+ connection.reconnect = True
+ try:
+ connection.open()
+ !!! SNIP !!!
+ ]]></programlisting>
+ <para>
+ In .NET, these options can be set using <function>Connection.SetOption()</function> or by passing in a set of options to the constructor. The options can be passed in as a map or in string form:
+ </para>
+
+ <programlisting>
+ Connection connection= new Connection(&#34;localhost:5672&#34;, &#34;{reconnect: true}&#34;);
+ try {
+ connection.Open();
+ !!! SNIP !!!
+ </programlisting>
+ <para>
+ or
+ </para>
+
+ <programlisting>
+ Connection connection = new Connection(&#34;localhost:5672&#34;);
+ connection.SetOption(&#34;reconnect&#34;, true);
+ try {
+ connection.Open();
+ !!! SNIP !!!
+ </programlisting>
+
+ <para>See the reference documentation for details in each language.</para>
+ </example>
+
+ <para>The following table lists the supported connection options.</para>
+
+ <table pgwide="1">
+ <title>Connection Options</title>
+ <tgroup cols="3">
+ <thead>
+ <colspec colnum="1" colwidth="1*"/>
+ <colspec colnum="2" colwidth="1*"/>
+ <colspec colnum="3" colwidth="3*"/>
+ <row>
+ <entry>option name</entry>
+ <entry>value type</entry>
+ <entry>semantics</entry>
+ </row>
+ </thead>
+ <tbody>
+
+ <row>
+ <entry>
+ <literal>username</literal>
+ </entry>
+ <entry>
+ string
+ </entry>
+ <entry>
+ The username to use when authenticating to the broker.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>password</literal>
+ </entry>
+ <entry>
+ string
+ </entry>
+ <entry>
+ The password to use when authenticating to the broker.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>sasl_mechanisms</literal>
+ </entry>
+ <entry>
+ string
+ </entry>
+ <entry>
+ The specific SASL mechanisms to use with the python
+ client when authenticating to the broker. The value
+ is a space separated list.
+ </entry>
+ </row>
+
+
+ <row>
+ <entry>
+ <literal>reconnect</literal>
+ </entry>
+ <entry>
+ boolean
+ </entry>
+ <entry>
+ Transparently reconnect if the connection is lost.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>reconnect_timeout</literal>
+ </entry>
+ <entry>
+ integer
+ </entry>
+ <entry>
+ Total number of seconds to continue reconnection attempts before giving up and raising an exception.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>reconnect_limit</literal>
+ </entry>
+ <entry>
+ integer
+ </entry>
+ <entry>
+ Maximum number of reconnection attempts before giving up and raising an exception.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>reconnect_interval_min</literal>
+ </entry>
+ <entry>
+ integer representing time in seconds
+ </entry>
+ <entry>
+ Minimum number of seconds between reconnection attempts. The first reconnection attempt is made immediately; if that fails, the first reconnection delay is set to the value of <literal>reconnect_interval_min</literal>; if that attempt fails, the reconnect interval increases exponentially until a reconnection attempt succeeds or <literal>reconnect_interval_max</literal> is reached.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>reconnect_interval_max</literal>
+ </entry>
+ <entry>
+ integer representing time in seconds
+ </entry>
+ <entry>
+ Maximum reconnect interval.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>reconnect_interval</literal>
+ </entry>
+ <entry>
+ integer representing time in seconds
+ </entry>
+ <entry>
+ Sets both <literal>reconnection_interval_min</literal> and <literal>reconnection_interval_max</literal> to the same value.
+ </entry>
+ </row>
+
+ <row>
+ <entry>
+ <literal>heartbeat</literal>
+ </entry>
+ <entry>
+ integer representing time in seconds
+ </entry>
+ <entry>
+ Requests that heartbeats be sent every N seconds. If two
+ successive heartbeats are missed the connection is
+ considered to be lost.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>protocol</literal>
+ </entry>
+ <entry>
+ string
+ </entry>
+ <entry>
+ Sets the underlying protocol used. The default option is 'tcp'. To enable ssl, set to 'ssl'. The C++ client additionally supports 'rdma'.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>tcp-nodelay</literal>
+ </entry>
+ <entry>
+ boolean
+ </entry>
+ <entry>
+ Set tcp no-delay, i.e. disable Nagle algorithm. [C++ only]
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ </section>
+
+ <section id="section-Maps">
+ <title>Maps and Lists in Message Content</title>
+
+ <para>Many messaging applications need to exchange data across
+ languages and platforms, using the native datatypes of each
+ programming language.</para>
+
+ <para>The Qpid Messaging API supports <classname>map</classname> and <classname>list</classname> in message content.
+
+ <footnote><para>Unlike JMS, there is not a specific message type for
+ map messages.</para></footnote>
+
+ <footnote>
+ <para>
+ Note that the Qpid JMS client supports MapMessages whose values can be nested maps or lists. This is not standard JMS behaviour.
+ </para>
+ </footnote>
+ Specific language support for <classname>map</classname> and <classname>list</classname> objects are shown in the following table.
+ </para>
+ <table id="tabl-Programming_in_Apache_Qpid-Qpid_Maps_in_Message_Content">
+ <title>Map and List Representation in Supported Languages</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Language</entry>
+ <entry>map</entry>
+ <entry>list</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Python</entry>
+ <entry><classname>dict</classname></entry>
+ <entry><classname>list</classname></entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry><classname>Variant::Map</classname></entry>
+ <entry><classname>Variant::List</classname></entry>
+ </row>
+ <row>
+ <entry>Java</entry>
+ <entry><classname>MapMessage</classname></entry>
+ <entry><classname>&nbsp;</classname></entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry><classname>Dictionary&#60;string, object&#62;</classname></entry>
+ <entry><classname>Collection&#60;object&#62;</classname></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>
+ In all languages, messages are encoded using AMQP&#39;s portable datatypes.
+ </para>
+
+ <tip>
+ <para>Because of the differences in type systems among
+ languages, the simplest way to provide portable messages is to
+ rely on maps, lists, strings, 64 bit signed integers, and
+ doubles for messages that need to be exchanged across languages
+ and platforms.</para>
+ </tip>
+
+ <section id="section-Python-Maps">
+ <title>Qpid Maps and Lists in Python</title>
+
+ <para>In Python, Qpid supports the <classname>dict</classname> and <classname>list</classname> types directly in message content. The following code shows how to send these structures in a message:</para>
+
+ <example>
+ <title>Sending Qpid Maps and Lists in Python</title>
+ <programlisting><![CDATA[
+ from qpid.messaging import *
+ # !!! SNIP !!!
+
+ content = {'Id' : 987654321, 'name' : 'Widget', 'percent' : 0.99}
+ content['colours'] = ['red', 'green', 'white']
+ content['dimensions'] = {'length' : 10.2, 'width' : 5.1,'depth' : 2.0};
+ content['parts'] = [ [1,2,5], [8,2,5] ]
+ content['specs'] = {'colors' : content['colours'],
+ 'dimensions' : content['dimensions'],
+ 'parts' : content['parts'] }
+ message = Message(content=content)
+ sender.send(message)
+ ]]> </programlisting>
+ </example>
+
+
+ <para>The following table shows the datatypes that can be sent in a Python map message,
+ and the corresponding datatypes that will be received by clients in Java or C++.</para>
+
+
+ <table id="table-Python-Maps" >
+ <title>Python Datatypes in Maps</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Python Datatype</entry>
+ <entry>&rarr; C++</entry>
+ <entry>&rarr; Java</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row><entry>bool</entry><entry>bool</entry><entry>boolean</entry></row>
+ <row><entry>int</entry><entry>int64</entry><entry>long</entry></row>
+ <row><entry>long</entry><entry>int64</entry><entry>long</entry></row>
+ <row><entry>float</entry><entry>double</entry><entry>double</entry></row>
+ <row><entry>unicode</entry><entry>string</entry><entry>java.lang.String</entry></row>
+ <row><entry>uuid</entry><entry>qpid::types::Uuid</entry><entry>java.util.UUID</entry></row>
+ <row><entry>dict</entry><entry>Variant::Map</entry><entry>java.util.Map</entry></row>
+ <row><entry>list</entry><entry>Variant::List</entry><entry>java.util.List</entry></row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ </section>
+
+
+
+
+ <section id="section-cpp-Maps">
+ <title>Qpid Maps and Lists in C++</title>
+
+
+ <para>In C++, Qpid defines the the
+ <classname>Variant::Map</classname> and
+ <classname>Variant::List</classname> types, which can be
+ encoded into message content. The following code shows how to
+ send these structures in a message:</para>
+
+ <example>
+ <title>Sending Qpid Maps and Lists in C++</title>
+ <programlisting><![CDATA[
+ using namespace qpid::types;
+
+ // !!! SNIP !!!
+
+ Message message;
+ Variant::Map content;
+ content["id"] = 987654321;
+ content["name"] = "Widget";
+ content["percent"] = 0.99;
+ Variant::List colours;
+ colours.push_back(Variant("red"));
+ colours.push_back(Variant("green"));
+ colours.push_back(Variant("white"));
+ content["colours"] = colours;
+
+ Variant::Map dimensions;
+ dimensions["length"] = 10.2;
+ dimensions["width"] = 5.1;
+ dimensions["depth"] = 2.0;
+ content["dimensions"]= dimensions;
+
+ Variant::List part1;
+ part1.push_back(Variant(1));
+ part1.push_back(Variant(2));
+ part1.push_back(Variant(5));
+
+ Variant::List part2;
+ part2.push_back(Variant(8));
+ part2.push_back(Variant(2));
+ part2.push_back(Variant(5));
+
+ Variant::List parts;
+ parts.push_back(part1);
+ parts.push_back(part2);
+ content["parts"]= parts;
+
+ Variant::Map specs;
+ specs["colours"] = colours;
+ specs["dimensions"] = dimensions;
+ specs["parts"] = parts;
+ content["specs"] = specs;
+
+ encode(content, message);
+ sender.send(message, true);
+ ]]> </programlisting>
+ </example>
+
+ <para>The following table shows the datatypes that can be sent
+ in a C++ map message, and the corresponding datatypes that
+ will be received by clients in Java and Python.</para>
+
+ <table id="table-cpp-Maps">
+ <title>C++ Datatypes in Maps</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>C++ Datatype</entry>
+ <entry>&rarr; Python</entry>
+ <entry>&rarr; Java</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row><entry>bool</entry><entry>bool</entry><entry>boolean</entry></row>
+ <row><entry>uint16</entry><entry>int | long</entry><entry>short</entry></row>
+ <row><entry>uint32</entry><entry>int | long</entry><entry>int</entry></row>
+ <row><entry>uint64</entry><entry>int | long</entry><entry>long</entry></row>
+ <row><entry>int16</entry><entry>int | long</entry><entry>short</entry></row>
+ <row><entry>int32</entry><entry>int | long</entry><entry>int</entry></row>
+ <row><entry>int64</entry><entry>int | long</entry><entry>long</entry></row>
+ <row><entry>float</entry><entry>float</entry><entry>float</entry></row>
+ <row><entry>double</entry><entry>float</entry><entry>double</entry></row>
+ <row><entry>string</entry><entry>unicode</entry><entry>java.lang.String</entry></row>
+ <row><entry>qpid::types::Uuid</entry><entry>uuid</entry><entry>java.util.UUID</entry></row>
+ <row><entry>Variant::Map</entry><entry>dict</entry><entry>java.util.Map</entry></row>
+ <row><entry>Variant::List</entry><entry>list</entry><entry>java.util.List</entry></row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+
+ <section id="section-dotnet-Maps">
+ <title>Qpid Maps and Lists in .NET</title>
+
+
+ <para>
+ The .NET binding for the Qpid Messaging API binds .NET managed data types
+ to C++ <classname>Variant</classname> data types. The following code shows how to
+ send Map and List structures in a message:
+ </para>
+
+ <example>
+ <?dbfo keep-together="auto" ?>
+ <title>Sending Qpid Maps and Lists in .NET C#</title>
+ <programlisting><![CDATA[
+ using System;
+ using Org.Apache.Qpid.Messaging;
+
+ // !!! SNIP !!!
+
+ Dictionary<string, object> content = new Dictionary<string, object>();
+ Dictionary<string, object> subMap = new Dictionary<string, object>();
+ Collection<object> colors = new Collection<object>();
+
+ // add simple types
+ content["id"] = 987654321;
+ content["name"] = "Widget";
+ content["percent"] = 0.99;
+
+ // add nested amqp/map
+ subMap["name"] = "Smith";
+ subMap["number"] = 354;
+ content["nestedMap"] = subMap;
+
+ // add an amqp/list
+ colors.Add("red");
+ colors.Add("green");
+ colors.Add("white");
+ content["colorsList"] = colors;
+
+ // add one of each supported amqp data type
+ bool mybool = true;
+ content["mybool"] = mybool;
+
+ byte mybyte = 4;
+ content["mybyte"] = mybyte;
+
+ UInt16 myUInt16 = 5;
+ content["myUInt16"] = myUInt16;
+
+ UInt32 myUInt32 = 6;
+ content["myUInt32"] = myUInt32;
+
+ UInt64 myUInt64 = 7;
+ content["myUInt64"] = myUInt64;
+
+ char mychar = 'h';
+ content["mychar"] = mychar;
+
+ Int16 myInt16 = 9;
+ content["myInt16"] = myInt16;
+
+ Int32 myInt32 = 10;
+ content["myInt32"] = myInt32;
+
+ Int64 myInt64 = 11;
+ content["myInt64"] = myInt64;
+
+ Single mySingle = (Single)12.12;
+ content["mySingle"] = mySingle;
+
+ Double myDouble = 13.13;
+ content["myDouble"] = myDouble;
+
+ Guid myGuid = new Guid("000102030405060708090a0b0c0d0e0f");
+ content["myGuid"] = myGuid;
+
+ Message message = new Message(content);
+ Send(message, true);
+ ]]> </programlisting>
+ </example>
+
+ <para>
+ The following table shows the mapping between datatypes in .NET and C++.
+ </para>
+
+ <table id="table-dotnet-Maps">
+ <title>Datatype Mapping between C++ and .NET binding</title>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>C++ Datatype</entry>
+ <entry>&rarr; .NET binding</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row><entry>void</entry><entry>nullptr</entry></row>
+ <row><entry>bool</entry><entry>bool</entry></row>
+ <row><entry>uint8</entry><entry>byte</entry></row>
+ <row><entry>uint16</entry><entry>UInt16</entry></row>
+ <row><entry>uint32</entry><entry>UInt32</entry></row>
+ <row><entry>uint64</entry><entry>UInt64</entry></row>
+ <row><entry>uint8</entry><entry>char</entry></row>
+ <row><entry>int16</entry><entry>Int16</entry></row>
+ <row><entry>int32</entry><entry>Int32</entry></row>
+ <row><entry>int64</entry><entry>Int64</entry></row>
+ <row><entry>float</entry><entry>Single</entry></row>
+ <row><entry>double</entry><entry>Double</entry></row>
+ <row><entry>string</entry><entry>string
+ <footnote id="callout-dotnet-string">
+ <para>Strings are currently interpreted only with UTF-8 encoding.</para>
+ </footnote></entry></row>
+ <row><entry>qpid::types::Uuid</entry><entry>Guid</entry></row>
+ <row><entry>Variant::Map</entry><entry><![CDATA[Dictionary<string, object>]]>
+ <footnoteref linkend="callout-dotnet-string"/></entry></row>
+ <row><entry>Variant::List</entry><entry><![CDATA[Collection<object>]]>
+ <footnoteref linkend="callout-dotnet-string"/></entry></row>
+ </tbody>
+ </tgroup>
+ </table>
+
+
+ </section>
+
+
+ </section>
+
+ <section>
+ <title>The Request / Response Pattern</title>
+ <para>Request / Response applications use the reply-to property,
+ described in <xref
+ linkend="table-amqp0-10-message-properties"/>, to allow a server
+ to respond to the client that sent a message. A server sets up a
+ service queue, with a name known to clients. A client creates a
+ private queue for the server's response, creates a message for a
+ request, sets the request's reply-to property to the address of
+ the client's response queue, and sends the request to the
+ service queue. The server sends the response to the address
+ specified in the request's reply-to property.
+ </para>
+ <example>
+ <title>Request / Response Applications in C++</title>
+
+ <para>This example shows the C++ code for a client and server
+ that use the request / response pattern.</para>
+
+ <para>The server creates a service queue and waits for a
+ message to arrive. If it receives a message, it sends a
+ message back to the sender.</para>
+
+ <programlisting><![CDATA[Receiver receiver = session.createReceiver("service_queue; {create: always}");
+
+ Message request = receiver.fetch();
+ const Address&amp; address = request.getReplyTo(); // Get "reply-to" from request ...
+ if (address) {
+ Sender sender = session.createSender(address); // ... send response to "reply-to"
+ Message response("pong!");
+ sender.send(response);
+ session.acknowledge();
+ }
+ ]]></programlisting>
+
+ <para>The client creates a sender for the service queue, and
+ also creates a response queue that is deleted when the
+ client closes the receiver for the response queue. In the C++
+ client, if the address starts with the character
+ <literal>#</literal>, it is given a unique name.</para>
+
+ <programlisting><![CDATA[
+ Sender sender = session.createSender("service_queue");
+
+ Address responseQueue("#response-queue; {create:always, delete:always}");
+ Receiver receiver = session.createReceiver(responseQueue);
+
+ Message request;
+ request.setReplyTo(responseQueue);
+ request.setContent("ping");
+ sender.send(request);
+ Message response = receiver.fetch();
+ std::cout << request.getContent() << " -> " << response.getContent() << std::endl;
+ ]]> </programlisting>
+
+ <para>The client sends the string <literal>ping</literal> to
+ the server. The server sends the response
+ <literal>pong</literal> back to the same client, using the
+ <varname>replyTo</varname> property.</para>
+
+ </example>
+ <!--
+ <example>
+ <title>Request / Response Applications in Python</title>
+ <programlisting>### TODO</programlisting>
+ </example>
+ -->
+ </section>
+
+
+ <section>
+ <title>Performance Tips</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Consider prefetching messages for receivers (see
+ <xref linkend="prefetch"/>). This helps eliminate roundtrips
+ and increases throughput. Prefetch is disabled by default,
+ and enabling it is the most effective means of improving
+ throughput of received messages.</para>
+ </listitem>
+ <listitem>
+ <para>Send messages asynchronously. Again, this helps
+ eliminate roundtrips and increases throughput. The C++ and
+ .NET clients send asynchronously by default, however the
+ python client defaults to synchronous sends. </para>
+ </listitem>
+ <listitem>
+ <para>Acknowledge messages in batches (see
+ <xref linkend="acknowledgements"/>). Rather than
+ acknowledging each message individually, consider issuing
+ acknowledgements after n messages and/or after a particular
+ duration has elapsed.</para>
+ </listitem>
+ <listitem>
+ <para>Tune the sender capacity (see
+ <xref linkend="replay"/>). If the capacity is too low the
+ sender may block waiting for the broker to confirm receipt
+ of messages, before it can free up more capacity.</para>
+ </listitem>
+ <listitem>
+ <para>If you are setting a reply-to address on messages
+ being sent by the c++ client, make sure the address type is
+ set to either queue or topic as appropriate. This avoids the
+ client having to determine which type of node is being
+ refered to, which is required when hanling reply-to in AMQP
+ 0-10. </para>
+ </listitem>
+ <listitem>
+ <para>For latency sensitive applications, setting tcp-nodelay
+ on qpidd and on client connections can help reduce the
+ latency.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>Cluster Failover</title>
+
+ <para>The messaging broker can be run in clustering mode, which provides high reliability through replicating state between brokers in the cluster. If one broker in a cluster fails, clients can choose another broker in the cluster and continue their work. Each broker in the cluster also advertises the addresses of all known brokers
+
+ <footnote><para>This is done via the amq.failover exchange in AMQP 0-10</para></footnote>
+
+ . A client can use this information to dynamically keep the list of reconnection urls up to date.</para>
+
+ <para>In C++, the <classname>FailoverUpdates</classname> class provides this functionality:</para>
+
+ <example>
+ <title>Tracking cluster membership</title>
+
+ <para>In C++:</para>
+
+ <programlisting><![CDATA[
+ #include <qpid/messaging/FailoverUpdates.h>
+ ...
+ Connection connection("localhost:5672");
+ connection.setOption("reconnect", true);
+ try {
+ connection.open();
+ std::auto_ptr<FailoverUpdates> updates(new FailoverUpdates(connection));
+ ]]>
+ </programlisting>
+
+ <para>In python:</para>
+
+ <programlisting><![CDATA[
+ import qpid.messaging.util
+ ...
+ connection = Connection("localhost:5672")
+ connection.reconnect = True
+ try:
+ connection.open()
+ auto_fetch_reconnect_urls(connection)
+ ]]>
+ </programlisting>
+ <para>
+ In .NET C#:
+ </para>
+
+ <programlisting>
+ using Org.Apache.Qpid.Messaging;
+ ...
+ connection = new Connection(&#34;localhost:5672&#34;);
+ connection.SetOption("reconnect", true);
+ try {
+ connection.Open();
+ FailoverUpdates failover = new FailoverUpdates(connection);
+
+ </programlisting>
+
+
+ </example>
+ </section>
+
+
+
+ <section>
+ <title>Logging</title>
+
+ <para>To simplify debugging, Qpid provides a logging facility
+ that prints out messaging events.</para>
+
+ <section>
+ <title>Logging in C++</title>
+ <para>
+ The Qpidd broker and C++ clients can both use environment variables to enable logging. Linux and Windows systems use the same named environment variables and values.
+ </para>
+ <para>Use QPID_LOG_ENABLE to set the level of logging you are interested in (trace, debug, info, notice, warning, error, or critical):
+ </para>
+
+ <screen>
+ export QPID_LOG_ENABLE=&#34;warning+&#34;
+ </screen>
+ <para>
+ The Qpidd broker and C++ clients use QPID_LOG_OUTPUT to determine where logging output should be sent. This is either a file name or the special values stderr, stdout, or syslog:
+ </para>
+
+ <screen>
+ export QPID_LOG_TO_FILE=&#34;/tmp/myclient.out&#34;
+ </screen>
+
+ <para>
+ From a Windows command prompt, use the following command format to set the environment variables:
+ </para>
+
+ <screen>
+ set QPID_LOG_ENABLE=warning+
+ set QPID_LOG_TO_FILE=D:\tmp\myclient.out
+ </screen>
+ </section>
+
+ <section>
+ <title>Logging in Python</title>
+ <para>
+ The Python client library supports logging using the standard Python logging module. The easiest way to do logging is to use the <command>basicConfig()</command>, which reports all warnings and errors:
+ </para>
+
+ <programlisting>from logging import basicConfig
+ basicConfig()
+ </programlisting>
+ <para>
+ Qpidd also provides a convenience method that makes it easy to specify the level of logging desired. For instance, the following code enables logging at the <command>DEBUG</command> level:
+ </para>
+
+ <programlisting>from qpid.log import enable, DEBUG
+ enable("qpid.messaging.io", DEBUG)
+ </programlisting>
+ <para>
+ For more information on Python logging, see <ulink url="http://docs.python.org/lib/node425.html">http://docs.python.org/lib/node425.html</ulink>. For more information on Qpid logging, use <command>$ pydoc qpid.log</command>.
+ </para>
+ </section>
+ </section>
+
+
+
+ <section id="section-amqp0-10-mapping">
+ <title>The AMQP 0-10 mapping</title>
+
+ <para>
+ This section describes the AMQP 0-10 mapping for the Qpid
+ Messaging API.
+ </para>
+ <para>
+ The interaction with the broker triggered by creating a sender
+ or receiver depends on what the specified address resolves
+ to. Where the node type is not specified in the address, the
+ client queries the broker to determine whether it refers to a
+ queue or an exchange.
+ </para>
+ <para>
+ When sending to a queue, the queue's name is set as the
+ routing key and the message is transfered to the default (or
+ nameless) exchange. When sending to an exchange, the message
+ is transfered to that exchange and the routing key is set to
+ the message subject if one is specified. A default subject may
+ be specified in the target address. The subject may also be
+ set on each message individually to override the default if
+ required. In each case any specified subject is also added as
+ a qpid.subject entry in the application-headers field of the
+ message-properties.
+ </para>
+ <para>
+ When receiving from a queue, any subject in the source address
+ is currently ignored. The client sends a message-subscribe
+ request for the queue in question. The accept-mode is
+ determined by the reliability option in the link properties;
+ for unreliable links the accept-mode is none, for reliable
+ links it is explicit. The default for a queue is reliable. The
+ acquire-mode is determined by the value of the mode option. If
+ the mode is set to browse the acquire mode is not-acquired,
+ otherwise it is set to pre-acquired. The exclusive and
+ arguments fields in the message-subscribe command can be
+ controlled using the x-subscribe map.
+ </para>
+ <para>
+ When receiving from an exchange, the client creates a
+ subscription queue and binds that to the exchange. The
+ subscription queue's arguments can be specified using the
+ x-declare map within the link properties. The reliability
+ option determines most of the other parameters. If the
+ reliability is set to unreliable then an auto-deleted,
+ exclusive queue is used meaning that if the client or
+ connection fails messages may be lost. For exactly-once the
+ queue is not set to be auto-deleted. The durability of the
+ subscription queue is determined by the durable option in the
+ link properties. The binding process depends on the type of
+ the exchange the source address resolves to.
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ For a topic exchange, if no subject is specified and no
+ x-bindings are defined for the link, the subscription
+ queue is bound using a wildcard matching any routing key
+ (thus satisfying the expectation that any message sent to
+ that address will be received from it). If a subject is
+ specified in the source address however, it is used for
+ the binding key (this means that the subject in the source
+ address may be a binding pattern including wildcards).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ For a fanout exchange the binding key is irrelevant to
+ matching. A receiver created from a source address that
+ resolves to a fanout exchange receives all messages
+ sent to that exchange regardless of any subject the source
+ address may contain. An x-bindings element in the link
+ properties should be used if there is any need to set the
+ arguments to the bind.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ For a direct exchange, the subject is used as the binding
+ key. If no subject is specified an empty string is used as
+ the binding key.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ For a headers exchange, if no subject is specified the
+ binding arguments simply contain an x-match entry and no
+ other entries, causing all messages to match. If a subject
+ is specified then the binding arguments contain an x-match
+ entry set to all and an entry for qpid.subject whose value
+ is the subject in the source address (this means the
+ subject in the source address must match the message
+ subject exactly). For more control the x-bindings element
+ in the link properties must be used.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ For the XML exchange,<footnote><para>Note that the XML
+ exchange is not a standard AMQP exchange type. It is a
+ Qpid extension and is currently only supported by the C++
+ broker.</para></footnote> if a subject is specified it is
+ used as the binding key and an XQuery is defined that
+ matches any message with that value for
+ qpid.subject. Again this means that only messages whose
+ subject exactly match that specified in the source address
+ are received. If no subject is specified then the empty
+ string is used as the binding key with an xquery that will
+ match any message (this means that only messages with an
+ empty string as the routing key will be received). For more
+ control the x-bindings element in the link properties must
+ be used. A source address that resolves to the XML
+ exchange must contain either a subject or an x-bindings
+ element in the link properties as there is no way at
+ present to receive any message regardless of routing key.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ If an x-bindings list is present in the link options a binding
+ is created for each element within that list. Each element is
+ a nested map that may contain values named queue, exchange,
+ key or arguments. If the queue value is absent the queue name
+ the address resolves to is implied. If the exchange value is
+ absent the exchange name the address resolves to is implied.
+ </para>
+
+ <para>The following table shows how Qpid Messaging API message
+ properties are mapped to AMQP 0-10 message properties and
+ delivery properties. In this table <varname>msg</varname>
+ refers to the Message class defined in the Qpid Messaging API,
+ <varname>mp</varname> refers to an AMQP 0-10
+ <varname>message-properties</varname> struct, and
+ <varname>dp</varname> refers to an AMQP 0-10
+ <varname>delivery-properties</varname> struct.</para>
+
+ <table id="table-amqp0-10-message-properties" pgwide="1">
+ <title>Mapping to AMQP 0-10 Message Properties</title>
+ <tgroup cols="3">
+ <thead>
+ <colspec colnum="1" colname="Python API" colwidth="3*"/>
+ <colspec colnum="2" colname="C++ API" colwidth="3*"/>
+ <colspec colnum="3" colname="AMPQ 0-10 Property" colwidth="6*"/>
+ <row>
+ <entry>Python API</entry>
+ <entry>C++ API
+ <footnote>
+ <para>
+ The .NET Binding for C++ Messaging provides all the
+ message and delivery properties described in the C++ API.
+ See <xref linkend="table-Dotnet-Binding-Message" /> .
+ </para>
+ </footnote>
+ </entry>
+ <entry>AMQP 0-10 Property<footnote><para>In these entries, <literal>mp</literal> refers to an AMQP message property, and <literal>dp</literal> refers to an AMQP delivery property.</para></footnote></entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>msg.id</entry><entry>msg.{get,set}MessageId()</entry><entry>mp.message_id</entry>
+ </row>
+ <row>
+ <entry>msg.subject</entry><entry>msg.{get,set}Subject()</entry><entry>mp.application_headers["qpid.subject"]</entry>
+ </row>
+ <row>
+ <entry>msg.user_id</entry><entry>msg.{get,set}UserId()</entry><entry>mp.user_id</entry>
+ </row>
+ <row>
+ <entry>msg.reply_to</entry><entry>msg.{get,set}ReplyTo()</entry><entry>mp.reply_to<footnote><para>The reply_to is converted from the protocol representation into an address.</para></footnote></entry>
+ </row>
+ <row>
+ <entry>msg.correlation_id</entry><entry>msg.{get,set}CorrelationId()</entry><entry>mp.correlation_id</entry>
+ </row>
+ <row>
+ <entry>msg.durable</entry><entry>msg.{get,set}Durable()</entry><entry>dp.delivery_mode == delivery_mode.persistent<footnote><para>Note that msg.durable is a boolean, not an enum.</para></footnote></entry>
+ </row>
+ <row>
+ <entry>msg.priority</entry><entry>msg.{get,set}Priority()</entry><entry>dp.priority</entry>
+ </row>
+ <row>
+ <entry>msg.ttl</entry><entry>msg.{get,set}Ttl()</entry><entry>dp.ttl</entry>
+ </row>
+ <row>
+ <entry>msg.redelivered</entry><entry>msg.{get,set}Redelivered()</entry><entry>dp.redelivered</entry>
+ </row>
+ <row><entry>msg.properties</entry><entry>msg.getProperties()/msg.setProperty()</entry><entry>mp.application_headers</entry>
+ </row>
+ <row>
+ <entry>msg.content_type</entry><entry>msg.{get,set}ContentType()</entry><entry>mp.content_type</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <section role="h3" id="section-amqp0-10-message-props">
+ <title>0-10 Message Property Keys</title>
+ <para>
+ The QPID Messaging API also recognises special message property keys and
+ automatically provides a mapping to their corresponding AMQP 0-10 definitions.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ When sending a message, if the properties contain an entry for
+ <literal>x-amqp-0-10.app-id</literal>, its value will be used to set the
+ <literal>message-properties.app-id</literal> property in the outgoing
+ message. Likewise, if an incoming message has
+ <literal>message-properties.app-id</literal> set, its value can be accessed
+ via the <literal>x-amqp-0-10.app-id</literal> message property key.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ When sending a message, if the properties contain an entry for
+ <literal>x-amqp-0-10.content-encoding</literal>, its value will be used to
+ set the <literal>message-properties.content-encoding</literal> property in
+ the outgoing message. Likewise, if an incoming message has
+ <literal>message-properties.content-encoding</literal> set, its value can be
+ accessed via the <literal>x-amqp-0-10.content-encoding</literal> message
+ property key.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The routing key (<literal>delivery-properties.routing-key</literal>) in an
+ incoming messages can be accessed via the
+ <literal>x-amqp-0-10.routing-key</literal> message property.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ If the timestamp delivery property is set in an incoming message
+ (<literal>delivery-properties.timestamp</literal>), the timestamp value will
+ be made available via the <literal>x-amqp-0-10.timestamp</literal> message
+ property.
+ <footnote>
+ <para>
+ This special property is currently not supported by the Qpid JMS client.
+ </para>
+ </footnote>
+ </para>
+ </listitem>
+ </itemizedlist>
+ <example>
+ <title>Accessing the AMQP 0-10 Message Timestamp in Python</title>
+ <para>
+ The following code fragment checks for and extracts the message timestamp from
+ a received message.
+ </para>
+ <programlisting lang="python">
+ try:
+ msg = receiver.fetch(timeout=1)
+ if "x-amqp-0-10.timestamp" in msg.properties:
+ print("Timestamp=%s" % str(msg.properties["x-amqp-0-10.timestamp"]))
+ except Empty:
+ pass
+ </programlisting>
+ </example>
+ <example>
+ <title>Accessing the AMQP 0-10 Message Timestamp in C++</title>
+ <para>
+ The same example, except in C++.
+ </para>
+ <programlisting lang="c++">
+ messaging::Message msg;
+ if (receiver.fetch(msg, messaging::Duration::SECOND*1)) {
+ if (msg.getProperties().find("x-amqp-0-10.timestamp") != msg.getProperties().end()) {
+ <![CDATA[std::cout << "Timestamp=" << msg.getProperties()["x-amqp-0-10.timestamp"].asString() << std::endl;]]>
+ }
+ }
+ </programlisting>
+ </example>
+ </section>
+ </section>
+
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Message-Groups-Guide.xml"/>
+
+ </chapter>
+
+
+ <chapter id="QpidJMS">
+ <title>Using the Qpid JMS client</title>
+ <section>
+ <title>A Simple Messaging Program in Java JMS</title>
+
+ <para>The following program shows how to send and receive a
+ message using the Qpid JMS client. JMS programs typically use
+ JNDI to obtain connection factory and destination objects which
+ the application needs. In this way the configuration is kept
+ separate from the application code itself.</para>
+
+ <para>In this example, we create a JNDI context using a
+ properties file, use the context to lookup a connection factory,
+ create and start a connection, create a session, and lookup a
+ destination from the JNDI context. Then we create a producer and
+ a consumer, send a message with the producer and receive it with
+ the consumer. This code should be straightforward for anyone
+ familiar with Java JMS.</para>
+
+ <example>
+ <title>"Hello world!" in Java</title>
+ <programlisting lang="java">
+ package org.apache.qpid.example.jmsexample.hello;
+
+ import javax.jms.*;
+ import javax.naming.Context;
+ import javax.naming.InitialContext;
+ import java.util.Properties;
+
+ public class Hello {
+
+ public Hello() {
+ }
+
+ public static void main(String[] args) {
+ Hello producer = new Hello();
+ producer.runTest();
+ }
+
+ private void runTest() {
+ try {
+ Properties properties = new Properties();
+ properties.load(this.getClass().getResourceAsStream("hello.properties")); <co id="hello-java-properties" linkends="callout-java-properties"/>
+ Context context = new InitialContext(properties); <co id="hello-java-context" linkends="callout-java-context"/>
+
+ ConnectionFactory connectionFactory
+ = (ConnectionFactory) context.lookup("qpidConnectionfactory"); <co id="hello-java-connection-factory" linkends="callout-java-connection-factory"/>
+ Connection connection = connectionFactory.createConnection(); <co id="hello-java-connection" linkends="callout-java-connection"/>
+ connection.start(); <co id="hello-java-start" linkends="callout-java-start"/>
+
+ Session session=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);<co id="hello-java-session" linkends="callout-java-session"/>
+ Destination destination = (Destination) context.lookup("topicExchange"); <co id="hello-java-destination" linkends="callout-java-destination"/>
+
+ MessageProducer messageProducer = session.createProducer(destination); <co id="hello-java-producer" linkends="callout-java-producer"/>
+ MessageConsumer messageConsumer = session.createConsumer(destination); <co id="hello-java-consumer" linkends="callout-java-consumer"/>
+
+ TextMessage message = session.createTextMessage("Hello world!");
+ messageProducer.send(message);
+
+ message = (TextMessage)messageConsumer.receive(); <co id="hello-java-receive" linkends="callout-java-receive"/>
+ System.out.println(message.getText());
+
+ connection.close(); <co id="hello-java-close" linkends="callout-java-close"/>
+ context.close(); <co id="hello-java-jndi-close" linkends="callout-java-jndi-close"/>
+ }
+ catch (Exception exp) {
+ exp.printStackTrace();
+ }
+ }
+ }
+ </programlisting>
+ </example>
+
+ <calloutlist>
+ <callout id="callout-java-properties" arearefs="hello-java-properties">
+ <para>Loads the JNDI properties file, which specifies connection properties, queues, topics, and addressing options. See <xref linkend="QpidJNDI"/> for details.</para>
+ </callout>
+ <callout id="callout-java-context" arearefs="hello-java-context">
+ <para>Creates the JNDI initial context.</para>
+ </callout>
+ <callout id="callout-java-connection-factory" arearefs="hello-java-connection-factory">
+ <para>Creates a JMS connection factory for Qpid.</para>
+ </callout>
+ <callout id="callout-java-connection" arearefs="hello-java-connection">
+ <para>Creates a JMS connection.</para>
+ </callout>
+ <callout id="callout-java-start" arearefs="hello-java-start">
+ <para>Activates the connection.</para>
+ </callout>
+ <callout id="callout-java-session" arearefs="hello-java-session">
+ <para>Creates a session. This session is not transactional (transactions='false'), and messages are automatically acknowledged.</para>
+ </callout>
+ <callout id="callout-java-destination" arearefs="hello-java-destination">
+ <para>Creates a destination for the topic exchange, so senders and receivers can use it.</para>
+ </callout>
+ <callout id="callout-java-producer" arearefs="hello-java-producer">
+ <para>Creates a producer that sends messages to the topic exchange.</para>
+ </callout>
+ <callout id="callout-java-consumer" arearefs="hello-java-consumer">
+ <para>Creates a consumer that reads messages from the topic exchange.</para>
+ </callout>
+ <callout id="callout-java-receive" arearefs="hello-java-receive">
+ <para>Reads the next available message.</para>
+ </callout>
+ <callout id="callout-java-close" arearefs="hello-java-close">
+ <para>Closes the connection, all sessions managed by the connection, and all senders and receivers managed by each session.</para>
+ </callout>
+ <callout id="callout-java-jndi-close" arearefs="hello-java-jndi-close">
+ <para>Closes the JNDI context.</para>
+ </callout>
+ </calloutlist>
+
+ <para>The contents of the hello.properties file are shown below.</para>
+
+ <example>
+ <title>JNDI Properties File for "Hello world!" example</title>
+ <programlisting>
+ java.naming.factory.initial
+ = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+
+ # connectionfactory.[jndiname] = [ConnectionURL]
+ connectionfactory.qpidConnectionfactory
+ = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672' <co id="hello-properties-connectionfactory" linkends="callout-hello-properties-connectionfactory"/>
+ # destination.[jndiname] = [address_string]
+ destination.topicExchange = amq.topic <co id="hello-properties-destination" linkends="callout-hello-properties-destination"/>
+ </programlisting>
+ </example>
+
+ <calloutlist>
+ <callout id="callout-hello-properties-connectionfactory" arearefs="hello-properties-connectionfactory">
+ <para>Defines a connection factory from which connections
+ can be created. The syntax of a ConnectionURL is given in
+ <xref linkend="QpidJNDI"/>.</para>
+ </callout>
+ <callout id="callout-hello-properties-destination" arearefs="hello-properties-destination">
+ <para>Defines a destination for which MessageProducers
+ and/or MessageConsumers can be created to send and receive
+ messages. The value for the destination in the properties
+ file is an address string as described in
+ <xref linkend="section-addresses"/>. In the JMS
+ implementation MessageProducers are analogous to senders in
+ the Qpid Message API, and MessageConsumers are analogous to
+ receivers.</para>
+ </callout>
+ </calloutlist>
+
+ </section>
+
+ <section id="QpidJNDI">
+ <title>Apache Qpid JNDI Properties for AMQP Messaging</title>
+
+
+ <para>
+ Apache Qpid defines JNDI properties that can be used to specify JMS Connections and Destinations. Here is a typical JNDI properties file:
+ </para>
+
+ <example>
+ <title>JNDI Properties File</title>
+ <programlisting><![CDATA[
+ java.naming.factory.initial
+ = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+
+ # connectionfactory.[jndiname] = [ConnectionURL]
+ connectionfactory.qpidConnectionfactory
+ = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
+ # destination.[jndiname] = [address_string]
+ destination.topicExchange = amq.topic
+ ]]></programlisting>
+ </example>
+
+ <para>The following sections describe the JNDI properties that Qpid uses.</para>
+
+
+ <section>
+ <title>JNDI Properties for Apache Qpid</title>
+ <para>
+ Apache Qpid supports the properties shown in the following table:
+ </para>
+ <table>
+ <title>JNDI Properties supported by Apache Qpid</title>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>
+ Property
+ </entry>
+ <entry>
+ Purpose
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ connectionfactory.&lt;jndiname&gt;
+ </entry>
+ <entry>
+ <para>
+ The Connection URL that the connection factory uses to perform connections.
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ queue.&lt;jndiname&gt;
+ </entry>
+ <entry>
+ <para>
+ A JMS queue, which is implemented as an amq.direct exchange in Apache Qpid.
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ topic.&lt;jndiname&gt;
+ </entry>
+ <entry>
+ <para>
+ A JMS topic, which is implemented as an amq.topic exchange in Apache Qpid.
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ destination.&lt;jndiname&gt;
+ </entry>
+ <entry>
+ <para>
+ Can be used for defining all amq destinations,
+ queues, topics and header matching, using an
+ address string.
+
+ <footnote><para>Binding URLs, which were used in
+ earlier versions of the Qpid Java JMS client, can
+ still be used instead of address
+ strings.</para></footnote>
+ </para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+
+ <section id="section-jms-connection-url">
+ <title>Connection URLs</title>
+ <para>
+ In JNDI properties, a Connection URL specifies properties for a connection. The format for a Connection URL is:
+ </para>
+
+ <programlisting>amqp://[&lt;user&gt;:&lt;pass&gt;@][&lt;clientid&gt;]&lt;virtualhost&gt;[?&lt;option&gt;=&#39;&lt;value&gt;&#39;[&amp;&lt;option&gt;=&#39;&lt;value&gt;&#39;]]
+ </programlisting>
+ <para>
+ For instance, the following Connection URL specifies a user name, a password, a client ID, a virtual host ("test"), a broker list with a single broker, and a TCP host with the host name <quote>localhost</quote> using port 5672:
+ </para>
+
+ <programlisting>amqp://username:password@clientid/test?brokerlist=&#39;tcp://localhost:5672&#39;
+ </programlisting>
+ <para>
+ Apache Qpid supports the following properties in Connection URLs:
+ </para>
+ <table pgwide="1">
+ <title>Connection URL Properties</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>
+ Option
+ </entry>
+ <entry>
+ Type
+ </entry>
+ <entry>
+ Description
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ brokerlist
+ </entry>
+ <entry>
+ see below
+ </entry>
+ <entry>
+ List of one or more broker addresses.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ maxprefetch
+ </entry>
+ <entry>
+ integer
+ </entry>
+ <entry>
+ <para>
+ The maximum number of pre-fetched messages per consumer. If not specified, default value of 500 is used.
+ </para>
+ <para>
+ Note: You can also set the default per-consumer prefetch value on a client-wide basis by configuring the client using <link linkend="client-jvm-properties">Java system properties.</link>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ sync_publish
+ </entry>
+ <entry>
+ {'persistent' | 'all'}
+ </entry>
+ <entry>
+ A sync command is sent after every persistent message to guarantee that it has been received; if the value is 'persistent', this is done only for persistent messages.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ sync_ack
+ </entry>
+ <entry>
+ Boolean
+ </entry>
+ <entry>
+ A sync command is sent after every acknowledgement to guarantee that it has been received.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ use_legacy_map_msg_format
+ </entry>
+ <entry>
+ Boolean
+ </entry>
+ <entry>
+ If you are using JMS Map messages and deploying a new client with any JMS client older than 0.8 release, you must set this to true to ensure the older clients can understand the map message encoding.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ failover
+ </entry>
+ <entry>
+ {'singlebroker' | 'roundrobin' | 'failover_exchange' | 'nofailover' | '&lt;class&gt;'}
+ </entry>
+ <entry>
+ <para>
+ This option controls failover behaviour. The method <literal>singlebroker</literal> uses only the first broker in the list,
+ <literal>roundrobin</literal> will try each broker given in the broker list until a connection is established,
+ <literal>failover_exchange</literal> connects to the initial broker given in the broker URL and will receive membership updates
+ via the failover exchange. <literal>nofailover</literal> disables all retry and failover logic. Any other value is interpreted as a
+ classname which must implement the <literal>org.apache.qpid.jms.failover.FailoverMethod</literal> interface.
+ </para>
+ <para>
+ The broker list options <literal>retries</literal> and <literal>connectdelay</literal> (described below) determine the number of times a
+ connection to a broker will be retried and the the length of time to wait between successive connection attempts before moving on to
+ the next broker in the list. The failover option <literal>cyclecount</literal> controls the number of times to loop through the list of
+ available brokers before finally giving up.
+ </para>
+ <para>
+ Defaults to <literal>roundrobin</literal> if the brokerlist contains multiple brokers, or <literal>singlebroker</literal> otherwise.
+ </para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>
+ Broker lists are specified using a URL in this format:
+ </para>
+
+ <programlisting>brokerlist=&lt;transport&gt;://&lt;host&gt;[:&lt;port&gt;](?&lt;param>='&lt;value>')(&amp;&lt;param>='&lt;value>')*</programlisting>
+ <para>
+ For instance, this is a typical broker list:
+ </para>
+
+ <programlisting>brokerlist=&#39;tcp://localhost:5672&#39;
+ </programlisting>
+
+ <para>
+ A broker list can contain more than one broker address; if so, the connection is made to the first broker in the list that is available. In general, it is better to use the failover exchange when using multiple brokers, since it allows applications to fail over if a broker goes down.
+ </para>
+
+ <example>
+ <title>Broker Lists</title>
+ <para>A broker list can specify properties to be used when connecting to the broker, such as security options. This broker list specifies options for a Kerberos connection using GSSAPI:</para>
+ <programlisting><![CDATA[
+ amqp://guest:guest@test/test?sync_ack='true'
+ &brokerlist='tcp://ip1:5672?sasl_mechs='GSSAPI''
+ ]]></programlisting>
+
+ <para>This broker list specifies SSL options:</para>
+
+ <programlisting><![CDATA[
+ amqp://guest:guest@test/test?sync_ack='true'
+ &brokerlist='tcp://ip1:5672?ssl='true'&ssl_cert_alias='cert1''
+ ]]></programlisting>
+
+ <para>
+ This broker list specifies two brokers using the connectdelay and retries broker options. It also illustrates the failover connection URL
+ property.
+ </para>
+
+ <programlisting><![CDATA[
+
+ amqp://guest:guest@/test?failover='roundrobin?cyclecount='2''
+ &brokerlist='tcp://ip1:5672?retries='5'&connectdelay='2000';tcp://ip2:5672?retries='5'&connectdelay='2000''
+ ]]></programlisting>
+ </example>
+
+ <para>The following broker list options are supported.</para>
+
+ <table pgwide="1">
+ <title>Broker List Options</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>
+ Option
+ </entry>
+ <entry>
+ Type
+ </entry>
+ <entry>
+ Description
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ heartbeat
+ </entry>
+ <entry>
+ integer
+ </entry>
+ <entry>
+ frequency of heartbeat messages (in seconds)
+ </entry>
+ </row>
+ <row>
+ <entry>
+ sasl_mechs
+ </entry>
+ <entry>
+ --
+ </entry>
+ <entry>
+ For secure applications, we suggest CRAM-MD5,
+ DIGEST-MD5, or GSSAPI. The ANONYMOUS method is not
+ secure. The PLAIN method is secure only when used
+ together with SSL. For Kerberos, sasl_mechs must be
+ set to GSSAPI, sasl_protocol must be set to the
+ principal for the qpidd broker, e.g. qpidd/, and
+ sasl_server must be set to the host for the SASL
+ server, e.g. sasl.com. SASL External is supported
+ using SSL certification, e.g.
+ <literal>ssl='true'&amp;sasl_mechs='EXTERNAL'</literal>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ sasl_encryption
+ </entry>
+ <entry>
+ Boolean
+ </entry>
+ <entry>
+ If <literal>sasl_encryption='true'</literal>, the JMS client attempts to negotiate a security layer with the broker using GSSAPI to encrypt the connection. Note that for this to happen, GSSAPI must be selected as the sasl_mech.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ sasl_protocol
+ </entry>
+ <entry>
+ --
+ </entry>
+ <entry>
+ Used only for
+ Kerberos. <literal>sasl_protocol</literal> must be
+ set to the principal for the qpidd broker,
+ e.g. <literal>qpidd/</literal>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ sasl_server
+ </entry>
+ <entry>
+ --
+ </entry>
+ <entry>
+ For Kerberos, sasl_mechs must be set to GSSAPI,
+ sasl_server must be set to the host for the SASL
+ server, e.g. <literal>sasl.com</literal>.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ trust_store
+ </entry>
+ <entry>
+ --
+ </entry>
+ <entry>
+ path to trust store
+ </entry>
+ </row>
+ <row>
+ <entry>
+ trust_store_password
+ </entry>
+ <entry>
+ </entry>
+ <entry>
+ Trust store password
+ </entry>
+ </row>
+ <row>
+ <entry>
+ key_store
+ </entry>
+ <entry>
+ </entry>
+ <entry>
+ path to key store
+ </entry>
+ </row>
+ <row>
+ <entry>
+ key_store_password
+ </entry>
+ <entry>
+ --
+ </entry>
+ <entry>
+ key store password
+ </entry>
+ </row>
+ <row>
+ <entry>
+ ssl
+ </entry>
+ <entry>
+ Boolean
+ </entry>
+ <entry>
+ If <literal>ssl='true'</literal>, the JMS client will encrypt the connection using SSL.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ ssl_verify_hostname
+ </entry>
+ <entry>
+ Boolean
+ </entry>
+ <entry>
+ When using SSL you can enable hostname verification
+ by using <literal>ssl_verify_hostname='true'</literal> in the broker
+ URL.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ ssl_cert_alias
+ </entry>
+ <entry>
+
+ </entry>
+ <entry>
+ If multiple certificates are present in the keystore, the alias will be used to extract the correct certificate.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ retries
+ </entry>
+ <entry>
+ integer
+ </entry>
+ <entry>
+ The number of times to retry connection to each broker in the broker list. Defaults to 1.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ connectdelay
+ </entry>
+ <entry>
+ integer
+ </entry>
+ <entry>
+ Length of time to wait before attempting to reconnect (in milliseconds). Defaults to 0.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ connecttimeout
+ </entry>
+ <entry>
+ integer
+ </entry>
+ <entry>
+ Length of time to wait for the connection to succeed (in milliseconds). Defaults to 30000.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ tcp_nodelay
+ </entry>
+ <entry>
+ Boolean
+ </entry>
+ <entry>
+ If <literal>tcp_nodelay='true'</literal>, TCP packet
+ batching is disabled. Defaults to true since Qpid 0.14.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ </section>
+
+ <section>
+ <title>Java JMS Message Properties</title>
+
+ <para>The following table shows how Qpid Messaging API message
+ properties are mapped to AMQP 0-10 message properties and
+ delivery properties. In this table <varname>msg</varname>
+ refers to the Message class defined in the Qpid Messaging API,
+ <varname>mp</varname> refers to an AMQP 0-10
+ <varname>message-properties</varname> struct, and
+ <varname>dp</varname> refers to an AMQP 0-10
+ <varname>delivery-properties</varname> struct.</para>
+
+ <table >
+ <title>Java JMS Mapping to AMQP 0-10 Message Properties</title>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Java JMS Message Property</entry>
+ <entry>AMQP 0-10 Property<footnote><para>In these entries, <literal>mp</literal> refers to an AMQP message property, and <literal>dp</literal> refers to an AMQP delivery property.</para></footnote></entry>
+
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>JMSMessageID</entry><entry>mp.message_id</entry>
+ </row>
+ <row>
+ <entry>qpid.subject<footnote><para>This is a custom JMS property, set automatically by the Java JMS client implementation.</para></footnote></entry><entry>mp.application_headers["qpid.subject"]</entry>
+ </row>
+ <row>
+ <entry>JMSXUserID</entry><entry>mp.user_id</entry>
+ </row>
+ <row>
+ <entry>JMSReplyTo</entry><entry>mp.reply_to<footnote><para>The reply_to is converted from the protocol representation into an address.</para></footnote></entry>
+ </row>
+ <row>
+ <entry>JMSCorrelationID</entry><entry>mp.correlation_id</entry>
+ </row>
+ <row>
+ <entry>JMSDeliveryMode</entry><entry>dp.delivery_mode</entry>
+ </row>
+ <row>
+ <entry>JMSPriority</entry><entry>dp.priority</entry>
+ </row>
+ <row>
+ <entry>JMSExpiration</entry><entry>dp.ttl<footnote><para>JMSExpiration = dp.ttl + currentTime</para></footnote></entry>
+ </row>
+ <row>
+ <entry>JMSRedelivered</entry><entry>dp.redelivered</entry>
+ </row>
+ <row>
+ <entry>JMS Properties</entry><entry>mp.application_headers</entry>
+ </row>
+ <row>
+ <entry>JMSType</entry><entry>mp.content_type</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ </section>
+
+ <section id="section-JMS-MapMessage">
+ <title>JMS MapMessage Types</title>
+
+ <para>Qpid supports the Java JMS <classname>MapMessage</classname> interface, which provides support for maps in messages. The following code shows how to send a <classname>MapMessage</classname> in Java JMS.</para>
+
+ <example>
+ <title>Sending a Java JMS MapMessage</title>
+ <programlisting><![CDATA[
+ import java.util.ArrayList;
+ import java.util.HashMap;
+ import java.util.List;
+ import java.util.Map;
+
+ import javax.jms.Connection;
+ import javax.jms.Destination;
+ import javax.jms.MapMessage;
+ import javax.jms.MessageProducer;
+ import javax.jms.Session;
+
+ import java.util.Arrays;
+
+ // !!! SNIP !!!
+
+ MessageProducer producer = session.createProducer(queue);
+
+ MapMessage m = session.createMapMessage();
+ m.setIntProperty("Id", 987654321);
+ m.setStringProperty("name", "Widget");
+ m.setDoubleProperty("price", 0.99);
+
+ List<String> colors = new ArrayList<String>();
+ colors.add("red");
+ colors.add("green");
+ colors.add("white");
+ m.setObject("colours", colors);
+
+ Map<String,Double> dimensions = new HashMap<String,Double>();
+ dimensions.put("length",10.2);
+ dimensions.put("width",5.1);
+ dimensions.put("depth",2.0);
+ m.setObject("dimensions",dimensions);
+
+ List<List<Integer>> parts = new ArrayList<List<Integer>>();
+ parts.add(Arrays.asList(new Integer[] {1,2,5}));
+ parts.add(Arrays.asList(new Integer[] {8,2,5}));
+ m.setObject("parts", parts);
+
+ Map<String,Object> specs = new HashMap<String,Object>();
+ specs.put("colours", colors);
+ specs.put("dimensions", dimensions);
+ specs.put("parts", parts);
+ m.setObject("specs",specs);
+
+ producer.send(m);
+ ]]></programlisting>
+ </example>
+
+ <para>The following table shows the datatypes that can be sent in a <classname>MapMessage</classname>, and the corresponding datatypes that will be received by clients in Python or C++.</para>
+
+ <table id="table-Java-Maps">
+ <title>Java Datatypes in Maps</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Java Datatype</entry>
+ <entry>&rarr; Python</entry>
+ <entry>&rarr; C++</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row><entry>boolean</entry><entry>bool</entry><entry>bool</entry></row>
+ <row><entry>short</entry><entry>int | long</entry><entry>int16</entry></row>
+ <row><entry>int</entry><entry>int | long</entry><entry>int32</entry></row>
+ <row><entry>long</entry><entry>int | long</entry><entry>int64</entry></row>
+ <row><entry>float</entry><entry>float</entry><entry>float</entry></row>
+ <row><entry>double</entry><entry>float</entry><entry>double</entry></row>
+ <row><entry>java.lang.String</entry><entry>unicode</entry><entry>std::string</entry></row>
+ <row><entry>java.util.UUID</entry><entry>uuid</entry><entry>qpid::types::Uuid</entry></row>
+ <row><entry>java.util.Map<footnote><para>In Qpid, maps can nest. This goes beyond the functionality required by the JMS specification.</para></footnote></entry><entry>dict</entry><entry>Variant::Map</entry></row>
+ <row><entry>java.util.List</entry><entry>list</entry><entry>Variant::List</entry></row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ </section>
+
+ <section id="section-JMS-Logging">
+ <title>JMS Client Logging</title>
+ <para>The JMS Client logging is handled using the Simple Logging Facade for Java (<ulink url="http://www.slf4j.org/">SLF4J</ulink>). As the name implies, slf4j is a facade that delegates to other logging systems like log4j or JDK 1.4 logging. For more information on how to configure slf4j for specific logging systems, please consult the slf4j documentation.</para>
+
+ <para>When using the log4j binding, please set the log level for org.apache.qpid explicitly. Otherwise log4j will default to DEBUG which will degrade performance considerably due to excessive logging. The recommended logging level for production is <literal>WARN</literal>.</para>
+
+ <para>The following example shows the logging properties used to configure client logging for slf4j using the log4j binding. These properties can be placed in a log4j.properties file and placed in the <varname>CLASSPATH</varname>, or they can be set explicitly using the <literal>-Dlog4j.configuration</literal> property.</para>
+
+ <example>
+ <title>log4j Logging Properties</title>
+
+ <programlisting><![CDATA[
+ log4j.logger.org.apache.qpid=WARN, console
+ log4j.additivity.org.apache.qpid=false
+
+ log4j.appender.console=org.apache.log4j.ConsoleAppender
+ log4j.appender.console.Threshold=all
+ log4j.appender.console.layout=org.apache.log4j.PatternLayout
+ log4j.appender.console.layout.ConversionPattern=%t %d %p [%c{4}] %m%n
+ ]]></programlisting>
+ </example>
+
+ </section>
+
+ <section>
+ <title>Configuring the JMS Client</title>
+
+ <para>The Qpid JMS Client allows several configuration options to customize it's behaviour at different levels of granualarity.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ JVM level using JVM arguments : Configuration that affects all connections, sessions, consumers and producers created within that JVM.
+ </para>
+ <para>Ex. <varname>-Dmax_prefetch=1000</varname> property specifies the message credits to use.</para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Connection level using Connection/Broker properties : Affects the respective connection and sessions, consumers and produces created by that connection.
+ </para>
+ <para>Ex. <varname>amqp://guest:guest@test/test?max_prefetch='1000'
+ &amp;brokerlist='tcp://localhost:5672'
+ </varname> property specifies the message credits to use. This overrides any value specified via the JVM argument <varname>max_prefetch</varname>.</para>
+ <para>Please refer to the <xref linkend="section-jms-connection-url"/> section for a complete list of all properties and how to use them.</para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Destination level using Addressing options : Affects the producer(s) and consumer(s) created using the respective destination.
+ </para>
+ <para>Ex. <varname>my-queue; {create: always, link:{capacity: 10}}</varname>, where <varname>capacity</varname> option specifies the message credits to use. This overrides any connection level configuration.</para>
+ <para>Please refer to the <xref linkend="section-addresses"/> section for a complete understanding of addressing and it's various options.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Some of these config options are available at all three levels (Ex. <varname>max_prefetch</varname>), while others are available only at JVM or connection level.</para>
+
+ <section id="client-jvm-properties">
+ <title>Qpid JVM Arguments</title>
+
+ <table >
+ <title>Config Options For Connection Behaviour</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>qpid.amqp.version</entry>
+ <entry>string</entry>
+ <entry>0-10</entry>
+ <entry><para>Sets the AMQP version to be used - currently supports one of {0-8,0-9,0-91,0-10}.</para><para>The client will begin negotiation at the specified version and only negotiate downwards if the Broker does not support the specified version.</para></entry>
+ </row>
+ <row>
+ <entry>qpid.heartbeat</entry>
+ <entry>int</entry>
+ <entry>120 (secs)</entry>
+ <entry>The heartbeat interval in seconds. Two consective misssed heartbeats will result in the connection timing out.<para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
+ </row>
+
+ <row>
+ <entry>ignore_setclientID</entry>
+ <entry>boolean</entry>
+ <entry>false</entry>
+ <entry>If a client ID is specified in the connection URL it's used or else an ID is generated. If an ID is specified after it's been set Qpid will throw an exception. <para>Setting this property to 'true' will disable that check and allow you to set a client ID of your choice later on.</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+
+ <table >
+ <title>Config Options For Session Behaviour</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>qpid.session.command_limit</entry>
+ <entry>int</entry>
+ <entry>65536</entry>
+ <entry>Limits the # of unacked commands</entry>
+ </row>
+
+ <row>
+ <entry>qpid.session.byte_limit</entry>
+ <entry>int</entry>
+ <entry>1048576</entry>
+ <entry>Limits the # of unacked commands in terms of bytes</entry>
+ </row>
+
+ <row>
+ <entry>qpid.use_legacy_map_message</entry>
+ <entry>boolean</entry>
+ <entry>false</entry>
+ <entry><para>If set will use the old map message encoding. By default the Map messages are encoded using the 0-10 map encoding.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
+ </row>
+
+ <row>
+ <entry>qpid.jms.daemon.dispatcher</entry>
+ <entry>boolean</entry>
+ <entry>false</entry>
+ <entry><para>Controls whether the Session dispatcher thread is a daemon thread or not. If this system property is set to true then the Session dispatcher threads will be created as daemon threads. This setting is introduced in version 0.16.</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table >
+ <title>Config Options For Consumer Behaviour</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>max_prefetch</entry>
+ <entry>int</entry>
+ <entry>500</entry>
+ <entry>Maximum number of pre-fetched messages per consumer. <para>This can also be defaulted for consumers created on a particular connection using the <link linkend="section-jms-connection-url">Connection URL</link> options, or per destination (see the <varname>capacity</varname> option under link properties in addressing)</para></entry>
+ </row>
+
+ <row>
+ <entry>qpid.session.max_ack_delay</entry>
+ <entry>long</entry>
+ <entry>1000 (ms)</entry>
+ <entry><para>Timer interval to flush message acks in buffer when using AUTO_ACK and DUPS_OK.</para> <para>When using the above ack modes, message acks are batched and sent if one of the following conditions are met (which ever happens first).
+ <itemizedlist>
+ <listitem><para>When the ack timer fires.</para></listitem>
+ <listitem><para>if un_acked_msg_count > max_prefetch/2.</para></listitem>
+ </itemizedlist>
+ </para>
+ <para>The ack timer can be disabled by setting it to 0.</para>
+ </entry>
+ </row>
+
+ <row>
+ <entry>sync_ack</entry>
+ <entry>boolean</entry>
+ <entry>false</entry>
+ <entry><para>If set, each message will be acknowledged synchronously. When using AUTO_ACK mode, you need to set this to "true", in order to get the correct behaviour as described by the JMS spec.</para><para>This is set to false by default for performance reasons, therefore by default AUTO_ACK behaves similar to DUPS_OK.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table >
+ <title>Config Options For Producer Behaviour</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>sync_publish</entry>
+ <entry>string</entry>
+ <entry>"" (disabled)</entry>
+ <entry><para>If one of {persistent|all} is set then persistent messages or all messages will be sent synchronously.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table >
+ <title>Config Options For Threading</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>qpid.thread_factory</entry>
+ <entry>string</entry>
+ <entry>org.apache.qpid.thread.DefaultThreadFactory</entry>
+ <entry><para>Specifies the thread factory to use.</para><para>If using a real time JVM, you need to set the above property to <varname>org.apache.qpid.thread.RealtimeThreadFactory</varname>.</para></entry>
+ </row>
+
+ <row>
+ <entry>qpid.rt_thread_priority</entry>
+ <entry>int</entry>
+ <entry>20</entry>
+ <entry><para>Specifies the priority (1-99) for Real time threads created by the real time thread factory.</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table >
+ <title>Config Options For I/O</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>qpid.transport</entry>
+ <entry>string</entry>
+ <entry>org.apache.qpid.transport.network.io.IoNetworkTransport</entry>
+ <entry><para>The transport implementation to be used.</para><para>A user could specify an alternative transport mechanism that implements the interface <varname>org.apache.qpid.transport.network.OutgoingNetworkTransport</varname>.</para></entry>
+ </row>
+ <row>
+ <entry>qpid.sync_op_timeout</entry>
+ <entry>long</entry>
+ <entry>60000</entry>
+ <entry><para>The length of time (in milliseconds) to wait for a synchronous operation to complete.</para><para>For compatibility with older clients, the synonym <varname>amqj.default_syncwrite_timeout</varname> is supported.</para></entry>
+ </row>
+ <row>
+ <entry>qpid.tcp_nodelay</entry>
+ <entry>boolean</entry>
+ <entry>true</entry>
+ <entry>
+ <para>Sets the TCP_NODELAY property of the underlying socket. The default was changed to true as of Qpid 0.14.</para>
+ <para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para>
+ <para>For compatibility with older clients, the synonym <varname>amqj.tcp_nodelay</varname> is supported.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>qpid.send_buffer_size</entry>
+ <entry>integer</entry>
+ <entry>65535</entry>
+ <entry>
+ <para>Sets the SO_SNDBUF property of the underlying socket. Added in Qpid 0.16.</para>
+ <para>For compatibility with older clients, the synonym <varname>amqj.sendBufferSize</varname> is supported.</para>
+ </entry>
+ </row>
+ <row>
+ <entry>qpid.receive_buffer_size</entry>
+ <entry>integer</entry>
+ <entry>65535</entry>
+ <entry>
+ <para>Sets the SO_RCVBUF property of the underlying socket. Added in Qpid 0.16.</para>
+ <para>For compatibility with older clients, the synonym <varname>amqj.receiveBufferSize</varname> is supported.</para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table >
+ <title>Config Options For Security</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>qpid.sasl_mechs</entry>
+ <entry>string</entry>
+ <entry>PLAIN</entry>
+ <entry><para>The SASL mechanism to be used. More than one could be specified as a comma separated list.</para><para>We currently support the following mechanisms {PLAIN | GSSAPI | EXTERNAL}.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
+ </row>
+
+ <row>
+ <entry>qpid.sasl_protocol</entry>
+ <entry>string</entry>
+ <entry>AMQP</entry>
+ <entry><para>When using GSSAPI as the SASL mechanism, <varname>sasl_protocol</varname> must be set to the principal for the qpidd broker, e.g. <varname>qpidd</varname>.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
+ </row>
+
+ <row>
+ <entry>qpid.sasl_server_name</entry>
+ <entry>string</entry>
+ <entry>localhost</entry>
+ <entry><para>When using GSSAPI as the SASL mechanism, <varname>sasl_server</varname> must be set to the host for the SASL server, e.g. <varname>example.com</varname>.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table>
+ <title>Config Options For Security - Standard JVM properties needed when using GSSAPI as the SASL mechanism.<footnote><para>Please refer to the Java security documentation for a complete understanding of the above properties.</para></footnote></title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>javax.security.auth.useSubjectCredsOnly</entry>
+ <entry>boolean</entry>
+ <entry>true</entry>
+ <entry><para>If set to 'false', forces the SASL GASSPI client to obtain the kerberos credentials explicitly instead of obtaining from the "subject" that owns the current thread.</para></entry>
+ </row>
+
+ <row>
+ <entry>java.security.auth.login.config</entry>
+ <entry>string</entry>
+ <entry></entry>
+ <entry><para>Specifies the jass configuration file.</para><para><varname>Ex-Djava.security.auth.login.config=myjas.conf</varname>
+ </para><para>Here is the sample myjas.conf JASS configuration file: <programlisting><![CDATA[
+
+ com.sun.security.jgss.initiate {
+ com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;
+ };
+
+ ]]></programlisting></para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table>
+ <title>Config Options For Security - Using SSL for securing connections or using EXTERNAL as the SASL mechanism.</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>qpid.ssl_timeout</entry>
+ <entry>long</entry>
+ <entry>60000</entry>
+ <entry><para>Timeout value used by the Java SSL engine when waiting on operations.</para></entry>
+ </row>
+
+ <row>
+ <entry>qpid.ssl.KeyManagerFactory.algorithm</entry>
+ <entry>string</entry>
+ <entry>-</entry>
+ <entry>
+ <para>The key manager factory algorithm name. If not set, defaults to the value returned from the Java runtime call <literal>KeyManagerFactory.getDefaultAlgorithm()</literal></para>
+ <para>For compatibility with older clients, the synonym <varname>qpid.ssl.keyStoreCertType</varname> is supported.</para>
+ </entry>
+ </row>
+
+ <row>
+ <entry>qpid.ssl.TrustManagerFactory.algorithm</entry>
+ <entry>string</entry>
+ <entry>-</entry>
+ <entry>
+ <para>The trust manager factory algorithm name. If not set, defaults to the value returned from the Java runtime call <literal>TrustManagerFactory.getDefaultAlgorithm()</literal></para>
+ <para>For compatibility with older clients, the synonym <varname>qpid.ssl.trustStoreCertType</varname> is supported.</para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table>
+ <title>Config Options For Security - Standard JVM properties needed when Using SSL for securing connections or using EXTERNAL as the SASL mechanism.<footnote><para>Qpid allows you to have per connection key and trust stores if required. If specified per connection, the JVM arguments are ignored.</para></footnote></title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Property Name</entry>
+ <entry>Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>javax.net.ssl.keyStore</entry>
+ <entry>string</entry>
+ <entry>jvm default</entry>
+ <entry><para>Specifies the key store path.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
+ </row>
+
+ <row>
+ <entry>javax.net.ssl.keyStorePassword</entry>
+ <entry>string</entry>
+ <entry>jvm default</entry>
+ <entry><para>Specifies the key store password.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
+ </row>
+
+ <row>
+ <entry>javax.net.ssl.trustStore</entry>
+ <entry>string</entry>
+ <entry>jvm default</entry>
+ <entry><para>Specifies the trust store path.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
+ </row>
+
+ <row>
+ <entry>javax.net.ssl.trustStorePassword</entry>
+ <entry>string</entry>
+ <entry>jvm default</entry>
+ <entry><para>Specifies the trust store password.</para><para>This can also be set per connection using the <link linkend="section-jms-connection-url">Connection URL</link> options.</para></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ </section>
+
+ </chapter>
+
+ <chapter id="QpidWCF">
+ <title>Using the Qpid WCF client</title>
+ <section>
+ <title>XML and Binary Bindings</title>
+
+ <para>The Qpid WCF client provides two bindings, each with support for
+ Windows .NET transactions.</para>
+
+ <para>The AmqpBinding is suitable for communication between two WCF
+ applications. By default it uses the WCF binary .NET XML encoder
+ (BinaryMessageEncodingBindingElement) for efficient message
+ transmission, but it can also use the text and Message Transmission
+ Optimization Mechanism (MTOM) encoders. Here is a traditional service
+ model sample program using the AmqpBinding. It assumes that the queue
+ "hello_service_node" has been created and configured on the AMQP
+ broker.</para>
+
+ <example><?dbfo keep-together="auto" ?>
+ <title>Traditional service model "Hello world!" example</title>
+ <programlisting><![CDATA[
+ namespace Apache.Qpid.Documentation.HelloService
+ {
+ using System;
+ using System.ServiceModel;
+ using System.ServiceModel.Channels;
+ using System.Threading;
+ using Apache.Qpid.Channel;
+
+ [ServiceContract]
+ public interface IHelloService
+ {
+ [OperationContract(IsOneWay = true, Action = "*")]
+ void SayHello(string greeting);
+ }
+
+ public class HelloService : IHelloService
+ {
+ private static int greetingCount;
+
+ public static int GreetingCount
+ {
+ get { return greetingCount; }
+ }
+
+ public void SayHello(string greeting)
+ {
+ Console.WriteLine("Service received: " + greeting);
+ greetingCount++;
+ }]]></programlisting>
+
+ <programlisting><![CDATA[
+ static void Main(string[] args)
+ {
+ try
+ {
+ AmqpBinding amqpBinding = new AmqpBinding();
+ amqpBinding.BrokerHost = "localhost";
+ amqpBinding.BrokerPort = 5672;
+
+ ServiceHost serviceHost = new ServiceHost(typeof(HelloService));
+ serviceHost.AddServiceEndpoint(typeof(IHelloService),
+ amqpBinding, "amqp:hello_service_node");
+ serviceHost.Open();
+
+ // Send the service a test greeting
+ Uri amqpClientUri=new Uri("amqp:amq.direct?routingkey=hello_service_node");
+ EndpointAddress clientEndpoint = new EndpointAddress(amqpClientUri);
+ ChannelFactory<IHelloService> channelFactory =
+ new ChannelFactory<IHelloService>(amqpBinding, clientEndpoint);
+ IHelloService clientProxy = channelFactory.CreateChannel();
+
+ clientProxy.SayHello("Greetings from WCF client");
+
+ // wait for service to process the greeting
+ while (HelloService.GreetingCount == 0)
+ {
+ Thread.Sleep(100);
+ }
+ channelFactory.Close();
+ serviceHost.Close();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Exception: {0}", e);
+ }
+ }
+ }
+ }
+ ]]></programlisting>
+ </example>
+
+ <para>The second binding, AmqpBinaryBinding, is suitable for WCF
+ applications that need to inter-operate with non-WCF clients or that
+ wish to have direct access to the raw wire representation of the
+ message body. It relies on a custom encoder to read and write raw
+ (binary) content which operates similarly to the ByteStream encoder
+ (introduced in .NET 4.0). The encoder presents an abstract XML
+ infoset view of the raw message content on input. On output, the
+ encoder does the reverse and peels away the XML infoset layer exposing
+ the raw content to the wire representation of the message body. The
+ application must do the inverse of what the encoder does to allow the
+ XML infoset wrapper to cancel properly. This is demonstrated in the
+ following sample code (using the channel programming model) which
+ directly manipulates or provides callbacks to the WCF message readers
+ and writers when the content is consumed. In contrast to the
+ AmqpBinding sample where the simple greeting is encapsulated in a
+ compressed SOAP envelope, the wire representation of the message
+ contains the raw content and is identical and fully interoperable with
+ the Qpid C++ "Hello world!" example.</para>
+
+ <example><?dbfo keep-together="auto" ?>
+ <title>Binary "Hello world!" example using the channel model</title>
+ <programlisting><![CDATA[
+ namespace Apache.Qpid.Samples.Channel.HelloWorld
+ {
+ using System;
+ using System.ServiceModel;
+ using System.ServiceModel.Channels;
+ using System.ServiceModel.Description;
+ using System.Text;
+ using System.Xml;
+ using Apache.Qpid.Channel;
+
+ public class HelloWorld
+ {
+ static void Main(string[] args)
+ {
+ String broker = "localhost";
+ int port = 5672;
+ String target = "amq.topic";
+ String source = "my_topic_node";
+
+ if (args.Length > 0)
+ {
+ broker = args[0];
+ }
+
+ if (args.Length > 1)
+ {
+ port = int.Parse(args[1]);
+ }
+
+ if (args.Length > 2)
+ {
+ target = args[2];
+ }
+
+ if (args.Length > 3)
+ {
+ source = args[3];
+ }
+
+ AmqpBinaryBinding binding = new AmqpBinaryBinding();
+ binding.BrokerHost = broker;
+ binding.BrokerPort = port;
+
+ IChannelFactory<IInputChannel> receiverFactory = binding.BuildChannelFactory<IInputChannel>();
+ receiverFactory.Open();
+ IInputChannel receiver = receiverFactory.CreateChannel(new EndpointAddress("amqp:" + source));
+ receiver.Open();
+
+ IChannelFactory<IOutputChannel> senderFactory = binding.BuildChannelFactory<IOutputChannel>();
+ senderFactory.Open();
+ IOutputChannel sender = senderFactory.CreateChannel(new EndpointAddress("amqp:" + target));
+ sender.Open();
+
+ sender.Send(Message.CreateMessage(MessageVersion.None, "", new HelloWorldBinaryBodyWriter()));
+
+ Message message = receiver.Receive();
+ XmlDictionaryReader reader = message.GetReaderAtBodyContents();
+ while (!reader.HasValue)
+ {
+ reader.Read();
+ }
+
+ byte[] binaryContent = reader.ReadContentAsBase64();
+ string text = Encoding.UTF8.GetString(binaryContent);
+
+ Console.WriteLine(text);
+
+ senderFactory.Close();
+ receiverFactory.Close();
+ }
+ }
+
+ public class HelloWorldBinaryBodyWriter : BodyWriter
+ {
+ public HelloWorldBinaryBodyWriter() : base (true) {}
+
+ protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
+ {
+ byte[] binaryContent = Encoding.UTF8.GetBytes("Hello world!");
+
+ // wrap the content:
+ writer.WriteStartElement("Binary");
+ writer.WriteBase64(binaryContent, 0, binaryContent.Length);
+ }
+ }
+ }
+ ]]></programlisting>
+ </example>
+
+ <para>Bindings define ChannelFactories and ChannelListeners associated with
+ an AMQP Broker. WCF will frequently automatically create and manage
+ the life cycle of a these and the resulting IChannel objects used in
+ message transfer. The binding parameters that can be set are:</para>
+
+ <table pgwide="1">
+ <title>WCF Binding Parameters</title>
+ <tgroup cols="3">
+ <thead>
+ <colspec colnum="1" colwidth="1*"/>
+ <colspec colnum="2" colwidth="3*"/>
+ <colspec colnum="3" colwidth="3*"/>
+ <row>
+ <entry>Parameter</entry>
+ <entry>Default</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ BrokerHost
+ </entry>
+ <entry>
+ localhost
+ </entry>
+ <entry>
+ The broker's server name. Currently the WCF channel
+ only supports connections with a single broker.
+ Failover to multiple brokers will be provided in the
+ future.
+ </entry>
+ </row>
+
+ <row>
+ <entry>
+ BrokerPort
+ </entry>
+ <entry>
+ 5672
+ </entry>
+ <entry>
+ The port the broker is listening on.
+ </entry>
+ </row>
+
+ <row>
+ <entry>
+ PrefetchLimit
+ </entry>
+ <entry>
+ 0
+ </entry>
+ <entry>
+ The number of messages to prefetch from the amqp
+ broker before the application actually consumes them.
+ Increasing this number can dramatically increase the
+ read performance in some circumstances.
+ </entry>
+ </row>
+
+ <row>
+ <entry>
+ Shared
+ </entry>
+ <entry>
+ false
+ </entry>
+ <entry>
+ Indicates if separate channels to the same broker can
+ share an underlying AMQP tcp connection (provided they
+ also share the same authentication credentials).
+ </entry>
+ </row>
+
+ <row>
+ <entry>
+ TransferMode
+ </entry>
+ <entry>
+ buffered
+ </entry>
+ <entry>
+ Indicates whether the channel's encoder uses the WCF
+ BufferManager cache to temporarily store message
+ content during the encoding/decoding phase. For small
+ to medium sized SOAP based messages, buffered is
+ usually the preferred choice. For binary messages,
+ streamed TransferMode is the more efficient mode.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+
+ <section>
+ <title>Endpoints</title>
+
+ <para>In Qpid 0.6 the WCF Endpoints map to simple AMQP 0-10
+ exchanges (IOutputChannel) or AMQP 0-10 queues (IInputChannel).
+ The format for an IOutputChannel is</para>
+
+ <programlisting><![CDATA[
+ "amqp:amq.direct" or "amqp:my_exchange?routingkey=my_routing_key"
+]]></programlisting>
+
+ <para>and for an IInputChannel is</para>
+
+ <programlisting><![CDATA[
+ "amqp:my_queue"
+]]></programlisting>
+
+ <para>The routing key is in fact a default value associated with
+ the particular channel. Outgoing messages can always have their
+ routing key uniquely set.</para>
+
+ <para>If the respective queue or exchange doesn't exist, an exception
+ is thrown when opening the channel. Queues and exchanges can be
+ created and configured using qpid-config.</para>
+
+ </section>
+
+ <section>
+ <title>Message Headers</title>
+
+ <para>AMQP specific message headers can be set on or retrieved
+ from the ServiceModel.Channels.Message using the AmqpProperties
+ type.</para>
+
+ <para>For example, on output:</para>
+
+ <programlisting><![CDATA[
+AmqpProperties props = new AmqpProperties();
+props.Durable = true;
+props.PropertyMap.Add("my_custom_header", new AmqpString("a custom value"));
+Message msg = Message.CreateMessage(args);
+msg.Properties.Add("AmqpProperties", amqpProperties);
+outputChannel.Send(msg);
+]]></programlisting>
+
+ <para>On input the headers can be accessed from the Message or extracted
+ from the operation context</para>
+
+ <programlisting><![CDATA[
+public void SayHello(string greeting)
+{
+ AmqpProperties props = (AmqpProperties) OperationContext.
+ Current.IncomingMessageProperties["AmqpProperties"];
+ AmqpString extra = (AmqpString) props.PropertyMap["my_custom_header"];
+ Console.WriteLine("Service received: {0} and {1}", greeting, extra);
+}
+]]></programlisting>
+
+ </section>
+
+ <section>
+ <title>Security</title>
+
+ <para>To engage TLS/SSL:</para>
+
+ <programlisting><![CDATA[
+binding.Security.Mode = AmqpSecurityMode.Transport;
+binding.Security.Transport.UseSSL = true;
+binding.BrokerPort = 5671;
+]]></programlisting>
+
+ <para>Currently the WCF client only provides SASL PLAIN (i.e. username and
+ password) authentication. To provide a username and password, you can
+ set the DefaultAmqpCredential value in the binding. This value can be
+ overridden or set for a binding's channel factories and listeners,
+ either by setting the ClientCredentials as a binding parameter, or by
+ using an AmqpCredential as a binding parameter. The search order for
+ credentials is the AmqpCredential binding parameter, followed by the
+ ClientCredentials (unless IgnoreEndpointClientCredentials has been
+ set), and finally defaulting to the DefaultAmqpCredential of the
+ binding itself. Here is a sample using ClientCredentials:</para>
+
+ <programlisting><![CDATA[
+ClientCredentials credentials = new ClientCredentials();
+credentials.UserName.UserName = "guest";
+credentials.UserName.Password = "guest";
+bindingParameters = new BindingParameterCollection();
+bindingParameters.Add(credentials);
+readerFactory = binding.BuildChannelFactory<IInputChannel>(bindingParameters);
+]]></programlisting>
+
+ </section>
+
+ <section>
+ <title>Transactions</title>
+
+ <para>The WCF channel provides a transaction resource manager
+ module and a recovery module that together provide distributed
+ transaction support with one-phase optimization. Some
+ configuration is required on Windows machines to enable
+ transaction support (see your installation notes or top level
+ ReadMe.txt file for instructions). Once properly configured,
+ the Qpid WCF channel acts as any other System.Transactions aware
+ resource, capable of participating in explicit or implicit
+ transactions.</para>
+
+ <para>Server code:</para>
+
+ <programlisting><![CDATA[
+[OperationBehavior(TransactionScopeRequired = true,
+ TransactionAutoComplete = true)]
+
+public void SayHello(string greeting)
+{
+ // increment ExactlyOnceReceived counter on DB
+
+ // Success: transaction auto completes:
+}
+]]></programlisting>
+
+ <para>Because this operation involves two transaction resources, the
+ database and the AMQP message broker, this operates as a full two
+ phase commit transaction managed by the Distributed Transaction
+ Coordinator service. If the transaction proceeds without error,
+ both ExactlyOnceReceived is incremented in the database and the AMQP
+ message is consumed from the broker. Otherwise, ExactlyOnceReceived is
+ unchanged and AMQP message is returned to its queue on the broker.</para>
+
+ <para>For the client code a few changes are made to the non-transacted
+ example. For "exactly once" semantics, we set the AMQP "Durable"
+ message property and enclose the transacted activities in a
+ TransactionScope:</para>
+
+ <programlisting><![CDATA[
+AmqpProperties myDefaults = new AmqpProperties();
+myDefaults.Durable = true;
+amqpBinding.DefaultMessageProperties = myDefaults;
+ChannelFactory<IHelloService> channelFactory =
+new ChannelFactory<IHelloService>(amqpBinding, clientEndpoint);
+IHelloService clientProxy = channelFactory.CreateChannel();
+
+using (TransactionScope ts = new TransactionScope())
+{
+ AmqpProperties amqpProperties = new AmqpProperties();
+ clientProxy.SayHello("Greetings from WCF client");
+ // increment ExactlyOnceSent counter on DB
+ ts.Complete();
+}
+]]></programlisting>
+
+ </section>
+ </chapter>
+
+ <chapter>
+ <title>The .NET Binding for the C++ Messaging Client</title>
+ <para>
+ The .NET Binding for the C++ Qpid Messaging Client is a library that gives
+ any .NET program access to Qpid C++ Messaging objects and methods.
+ </para>
+ <section>
+ <title>.NET Binding for the C++ Messaging Client Component Architecture</title>
+
+ <programlisting><![CDATA[
+ +----------------------------+
+ | Dotnet examples |
+ | Managed C# |
+ +------+---------------+-----+
+ | |
+ V |
+ +---------------------------+ |
+ | .NET Managed Callback | |
+ | org.apache.qpid.messaging.| |
+ | sessionreceiver.dll | |
+ +----------------------+----+ |
+ | |
+managed V V
+(.NET) +--------------------------------+
+:::::::::::::::::::::::| .NET Binding Library |::::::::::::
+unmanaged | org.apache.qpid.messaging.dll |
+(Native Win32/64) +---------------+----------------+
+ |
+ |
+ +----------------+ |
+ | Native examples| |
+ | Unmanaged C++ | |
+ +--------+-------+ |
+ | |
+ V V
+ +----------------------------------+
+ | QPID Messaging C++ Libraries |
+ | qpid*.dll qmf*.dll |
+ +--------+--------------+----------+
+]]></programlisting>
+
+
+<para>This diagram illustrates the code and library components of the binding
+and the hierarchical relationships between them.</para>
+
+ <table id="table-Dotnet-Binding-Component-Architecture" >
+ <title>.NET Binding for the C++ Messaging Client Component Architecture</title>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Component Name</entry>
+ <entry>Component Function</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>QPID Messaging C++ Libraries</entry>
+ <entry>The QPID Messaging C++ core run time system</entry>
+ </row>
+ <row>
+ <entry>Unmanaged C++ Example Source Programs</entry>
+ <entry>Ordinary C++ programs that illustrate using qpid/cpp Messaging directly
+ in a native Windows environment.</entry>
+ </row>
+ <row>
+ <entry>.NET Messaging Binding Library</entry>
+ <entry>The .NET Messaging Binding library provides interoprability between
+ managed .NET programs and the unmanaged, native Qpid Messaging C++ core
+ run time system. .NET programs create a Reference to this library thereby
+ exposing all of the native C++ Messaging functionality to programs
+ written in any .NET language.</entry>
+ </row>
+ <row>
+ <entry>.NET Messaging Managed Callback Library</entry>
+ <entry>An extension of the .NET Messaging Binding Library that provides message
+ callbacks in a managed .NET environment.</entry>
+ </row>
+ <row>
+ <entry>Managed C# .NET Example Source Programs</entry>
+ <entry>Various C# example programs that illustrate using .NET Binding for C++ Messaging in the .NET environment.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+
+ <section>
+ <title>.NET Binding for the C++ Messaging Client Examples</title>
+
+ <para>This chapter describes the various sample programs that
+ are available to illustrate common Qpid Messaging usage.</para>
+
+ <table id="table-Dotnet-Binding-Example-Client-Server">
+ <title>Example : Client - Server</title>
+ <tgroup cols="2">
+ <colspec colname="c1"/>
+ <colspec colname="c2"/>
+ <thead>
+ <row>
+ <entry>Example Name</entry>
+ <entry>Example Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>csharp.example.server</entry>
+ <entry>Creates a Receiver and listens for messages.
+ Upon message reception the message content is converted to upper case
+ and forwarded to the received message's ReplyTo address.</entry>
+ </row>
+ <row>
+ <entry>csharp.example.client</entry>
+ <entry>Sends a series of messages to the Server and prints the original message
+ content and the received message content.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table id="table-Dotnet-Binding-Example-MapSender-MapReceiver">
+ <title>Example : Map Sender – Map Receiver</title>
+ <tgroup cols="2">
+ <colspec colname="c1"/>
+ <colspec colname="c2"/>
+ <thead>
+ <row>
+ <entry>Example Name</entry>
+ <entry>Example Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>csharp.map.receiver</entry>
+ <entry>Creates a Receiver and listens for a map message.
+ Upon message reception the message is decoded and displayed on the console.</entry>
+ </row>
+ <row>
+ <entry>csharp.map.sender</entry>
+ <entry>Creates a map message and sends it to map.receiver.
+ The map message contains values for every supported .NET Messaging
+ Binding data type.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table id="table-Dotnet-Binding-Example-Spout-Drain">
+ <title>Example : Spout - Drain</title>
+ <tgroup cols="2">
+ <colspec colname="c1"/>
+ <colspec colname="c2"/>
+ <thead>
+ <row>
+ <entry>Example Name</entry>
+ <entry>Example Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>csharp.example.spout</entry>
+ <entry>Spout is a more complex example of code that generates a series of messages
+ and sends them to peer program Drain. Flexible command line arguments allow
+ the user to specify a variety of message and program options.</entry>
+ </row>
+ <row>
+ <entry>csharp.example.drain</entry>
+ <entry>Drain is a more complex example of code that receives a series of messages
+ and displays their contents on the console.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table id="table-Dotnet-Binding-Example-CallbackSender-CallbackReceiver">
+ <title>Example : Map Callback Sender – Map Callback Receiver</title>
+ <tgroup cols="2">
+ <colspec colname="c1"/>
+ <colspec colname="c2"/>
+ <thead>
+ <row>
+ <entry>Example Name</entry>
+ <entry>Example Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>csharp.map.callback.receiver</entry>
+ <entry>Creates a Receiver and listens for a map message.
+ Upon message reception the message is decoded and displayed on the console.
+ This example illustrates the use of the C# managed code callback mechanism
+ provided by .NET Messaging Binding Managed Callback Library.</entry>
+ </row>
+ <row>
+ <entry>csharp.map.callback.sender</entry>
+ <entry>Creates a map message and sends it to map_receiver.
+ The map message contains values for every supported .NET Messaging
+ Binding data type.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table id="table-Dotnet-Binding-Example-DeclareQueues">
+ <title>Example - Declare Queues</title>
+ <tgroup cols="2">
+ <colspec colname="c1"/>
+ <colspec colname="c2"/>
+ <thead>
+ <row>
+ <entry>Example Name</entry>
+ <entry>Example Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>csharp.example.declare_queues</entry>
+ <entry>A program to illustrate creating objects on a broker.
+ This program creates a queue used by spout and drain.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table id="table-Dotnet-Binding-Example-DirectSender-DirectReceiver">
+ <title>Example: Direct Sender - Direct Receiver</title>
+ <tgroup cols="2">
+ <colspec colname="c1"/>
+ <colspec colname="c2"/>
+ <thead>
+ <row>
+ <entry>Example Name</entry>
+ <entry>Example Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>csharp.direct.receiver</entry>
+ <entry>Creates a Receiver and listens for a messages.
+ Upon message reception the message is decoded and displayed on the console.</entry>
+ </row>
+ <row>
+ <entry>csharp.direct.sender</entry>
+ <entry> Creates a series of messages and sends them to csharp.direct.receiver.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table id="table-Dotnet-Binding-Example-Helloworld">
+ <title>Example: Hello World</title>
+ <tgroup cols="2">
+ <colspec colname="c1"/>
+ <colspec colname="c2"/>
+ <thead>
+ <row>
+ <entry>Example Name</entry>
+ <entry>Example Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>csharp.example.helloworld</entry>
+ <entry>A program to send a message and to receive the same message.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ </section>
+
+ <section>
+ <title>.NET Binding Class Mapping to Underlying C++ Messaging API</title>
+
+ <para>This chapter describes the specific mappings between
+ classes in the .NET Binding and the underlying C++ Messaging
+ API.</para>
+
+ <section>
+ <title>.NET Binding for the C++ Messaging API Class: Address</title>
+ <table id="table-Dotnet-Binding-Address">
+ <title>.NET Binding for the C++ Messaging API Class: Address</title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="7*"/>
+ <thead>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Address</entry>
+ </row>
+ <row>
+ <entry>Language</entry>
+ <entry>Syntax</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>C++</entry>
+ <entry>class Address</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public ref class Address</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Address();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Address();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Address(const std::string&amp; address);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Address(string address);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Address(const std::string&amp; name, const std::string&amp; subject, const qpid::types::Variant::Map&amp; options, const std::string&amp; type = "");</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Address(string name, string subject, Dictionary&lt;string, object&gt; options);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Address(string name, string subject, Dictionary&lt;string, object&gt; options, string type);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Copy constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Address(const Address&amp; address);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Address(Address address);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Destructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>~Address();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>~Address();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>!Address();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Copy assignment operator</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Address&amp; operator=(const Address&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Address op_Assign(Address rhs);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Name</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>const std::string&amp; getName() const;</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setName(const std::string&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string Name { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Subject</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>const std::string&amp; getSubject() const;</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setSubject(const std::string&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string Subject { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Options</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>const qpid::types::Variant::Map&amp; getOptions() const;</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>qpid::types::Variant::Map&amp; getOptions();</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setOptions(const qpid::types::Variant::Map&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Dictionary&lt;string, object&gt; Options { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Type</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>std::string getType() const;</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setType(const std::string&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string Type { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Miscellaneous</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>std::string str() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string ToStr();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Miscellaneous</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>operator bool() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Miscellaneous</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>bool operator !() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>n/a</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ <section>
+ <title>.NET Binding for the C++ Messaging API Class: Connection</title>
+ <table id="table-Dotnet-Binding-Connection">
+ <title>.NET Binding for the C++ Messaging API Class: Connection</title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="7*"/>
+ <thead>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Connection</entry>
+ </row>
+ <row>
+ <entry>Language</entry>
+ <entry>Syntax</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>C++</entry>
+ <entry>class Connection : public qpid::messaging::Handle&lt;ConnectionImpl&gt;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public ref class Connection</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Connection(ConnectionImpl* impl);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Connection();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Connection(const std::string&amp; url, const qpid::types::Variant::Map&amp; options = qpid::types::Variant::Map());</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Connection(string url);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Connection(string url, Dictionary&lt;string, object&gt; options);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Connection(const std::string&amp; url, const std::string&amp; options);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Connection(string url, string options); </entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Copy Constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Connection(const Connection&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Connection(Connection connection);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Destructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>~Connection();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>~Connection();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>!Connection();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Copy assignment operator</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Connection&amp; operator=(const Connection&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Connection op_Assign(Connection rhs);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: SetOption</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setOption(const std::string&amp; name, const qpid::types::Variant&amp; value);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void SetOption(string name, object value);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: open</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void open();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Open();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: isOpen</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>bool isOpen();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public bool IsOpen { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: close</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void close();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Close();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: createTransactionalSession</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Session createTransactionalSession(const std::string&amp; name = std::string());</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Session CreateTransactionalSession();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Session CreateTransactionalSession(string name);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: createSession</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Session createSession(const std::string&amp; name = std::string());</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Session CreateSession();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Session CreateSession(string name);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: getSession</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Session getSession(const std::string&amp; name) const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Session GetSession(string name);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: AuthenticatedUsername</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>std::string getAuthenticatedUsername();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string GetAuthenticatedUsername();</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ <section>
+ <title>.NET Binding for the C++ Messaging API Class: Duration</title>
+ <table id="table-Dotnet-Binding-Duration">
+ <title>.NET Binding for the C++ Messaging API Class: Duration</title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="7*"/>
+ <thead>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Duration</entry>
+ </row>
+ <row>
+ <entry>Language</entry>
+ <entry>Syntax</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>C++</entry>
+ <entry>class Duration</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public ref class Duration</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>explicit Duration(uint64_t milliseconds);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Duration(ulong mS);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Copy constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Duration(Duration rhs);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Destructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>default</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>default</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>default</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Milliseconds</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>uint64_t getMilliseconds() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public ulong Milliseconds { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Operator: *</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Duration operator*(const Duration&amp; duration, uint64_t multiplier);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public static Duration operator *(Duration dur, ulong multiplier);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public static Duration Multiply(Duration dur, ulong multiplier);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Duration operator*(uint64_t multiplier, const Duration&amp; duration);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public static Duration operator *(ulong multiplier, Duration dur);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public static Duration Multiply(ulong multiplier, Duration dur);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constants</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>static const Duration FOREVER;</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>static const Duration IMMEDIATE;</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>static const Duration SECOND;</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>static const Duration MINUTE;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public sealed class DurationConstants</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public static Duration FORVER;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public static Duration IMMEDIATE;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public static Duration MINUTE;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public static Duration SECOND;</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ <section>
+ <title>.NET Binding for the C++ Messaging API Class: FailoverUpdates</title>
+ <table id="table-Dotnet-Binding-FailoverUpdates">
+ <title>.NET Binding for the C++ Messaging API Class: FailoverUpdates</title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="7*"/>
+ <thead>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">.NET Binding Class: FailoverUpdates</entry>
+ </row>
+ <row>
+ <entry>Language</entry>
+ <entry>Syntax</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>C++</entry>
+ <entry>class FailoverUpdates</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public ref class FailoverUpdates</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>FailoverUpdates(Connection&amp; connection);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public FailoverUpdates(Connection connection);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Destructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>~FailoverUpdates();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>~FailoverUpdates();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>!FailoverUpdates();</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ <section>
+ <title>.NET Binding for the C++ Messaging API Class: Message</title>
+ <table id="table-Dotnet-Binding-Message">
+ <title>.NET Binding for the C++ Messaging API Class: Message</title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="7*"/>
+ <thead>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Message</entry>
+ </row>
+ <row>
+ <entry>Language</entry>
+ <entry>Syntax</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>C++</entry>
+ <entry>class Message</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public ref class Message</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Message(const std::string&amp; bytes = std::string());</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>Message();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>Message(System::String ^ theStr);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>Message(System::Object ^ theValue);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>Message(array&lt;System::Byte&gt; ^ bytes);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Message(const char*, size_t);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Message(byte[] bytes, int offset, int size);</entry>
+ </row>
+ <row>
+ <entry> </entry>
+ <entry>Copy constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Message(const Message&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Message(Message message);</entry>
+ </row>
+ <row>
+ <entry> </entry>
+ <entry>Copy assignment operator</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Message&amp; operator=(const Message&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Message op_Assign(Message rhs);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Destructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>~Message();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>~Message();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>!Message()</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: ReplyTo</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setReplyTo(const Address&amp;);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>const Address&amp; getReplyTo() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Address ReplyTo { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Subject</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setSubject(const std::string&amp;);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>const std::string&amp; getSubject() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string Subject { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: ContentType</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setContentType(const std::string&amp;);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>const std::string&amp; getContentType() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string ContentType { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: MessageId</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setMessageId(const std::string&amp;);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>const std::string&amp; getMessageId() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string MessageId { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: UserId</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setUserId(const std::string&amp;);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>const std::string&amp; getUserId() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string UserId { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: CorrelationId</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setCorrelationId(const std::string&amp;);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>const std::string&amp; getCorrelationId() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string CorrelationId { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Priority</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setPriority(uint8_t);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>uint8_t getPriority() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public byte Priority { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Ttl</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setTtl(Duration ttl);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Duration getTtl() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Duration Ttl { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Durable</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setDurable(bool durable);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>bool getDurable() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public bool Durable { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Redelivered</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>bool getRedelivered() const;</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setRedelivered(bool);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public bool Redelivered { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: SetProperty</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setProperty(const std::string&amp;, const qpid::types::Variant&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void SetProperty(string name, object value);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Properties</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>const qpid::types::Variant::Map&amp; getProperties() const;</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>qpid::types::Variant::Map&amp; getProperties();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Dictionary&lt;string, object&gt; Properties { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: SetContent</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setContent(const std::string&amp;);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setContent(const char* chars, size_t count);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void SetContent(byte[] bytes);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void SetContent(string content);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void SetContent(byte[] bytes, int offset, int size);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: GetContent</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>std::string getContent() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string GetContent();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void GetContent(byte[] arr);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void GetContent(Collection&lt;object&gt; __p1);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void GetContent(Dictionary&lt;string, object&gt; dict);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: GetContentPtr</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>const char* getContentPtr() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: ContentSize</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>size_t getContentSize() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public ulong ContentSize { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Struct: EncodingException</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>struct EncodingException : qpid::types::Exception</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: decode</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void decode(const Message&amp; message, qpid::types::Variant::Map&amp; map, const std::string&amp; encoding = std::string());</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void decode(const Message&amp; message, qpid::types::Variant::List&amp; list, const std::string&amp; encoding = std::string());</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: encode</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void encode(const qpid::types::Variant::Map&amp; map, Message&amp; message, const std::string&amp; encoding = std::string());</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void encode(const qpid::types::Variant::List&amp; list, Message&amp; message, const std::string&amp; encoding = std::string());</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: AsString</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string AsString(object obj);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string ListAsString(Collection&lt;object&gt; list);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string MapAsString(Dictionary&lt;string, object&gt; dict);</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ <section>
+ <title>.NET Binding for the C++ Messaging API Class: Receiver</title>
+ <table id="table-Dotnet-Binding-Receiver">
+ <title>.NET Binding for the C++ Messaging API Class: Receiver</title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="7*"/>
+ <thead>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Receiver</entry>
+ </row>
+ <row>
+ <entry>Language</entry>
+ <entry>Syntax</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>C++</entry>
+ <entry>class Receiver</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public ref class Receiver</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>Constructed object is returned by Session.CreateReceiver</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Copy constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Receiver(const Receiver&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Receiver(Receiver receiver);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Destructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>~Receiver();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>~Receiver();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>!Receiver()</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Copy assignment operator</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Receiver&amp; operator=(const Receiver&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Receiver op_Assign(Receiver rhs);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Get</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>bool get(Message&amp; message, Duration timeout=Duration::FOREVER);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public bool Get(Message mmsgp);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public bool Get(Message mmsgp, Duration durationp);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Get</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Message get(Duration timeout=Duration::FOREVER);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Message Get();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Message Get(Duration durationp);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Fetch</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>bool fetch(Message&amp; message, Duration timeout=Duration::FOREVER);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public bool Fetch(Message mmsgp);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public bool Fetch(Message mmsgp, Duration duration);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Fetch</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Message fetch(Duration timeout=Duration::FOREVER);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Message Fetch();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Message Fetch(Duration durationp);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Capacity</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setCapacity(uint32_t);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>uint32_t getCapacity();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public uint Capacity { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Available</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>uint32_t getAvailable();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public uint Available { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Unsettled</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>uint32_t getUnsettled();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public uint Unsettled { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Close</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void close();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Close();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: IsClosed</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>bool isClosed() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public bool IsClosed { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Name</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>const std::string&amp; getName() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string Name { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Session</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Session getSession() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Session Session { get; }</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ <section>
+ <title>.NET Binding for the C++ Messaging API Class: Sender</title>
+ <table id="table-Dotnet-Binding-Sender">
+ <title>.NET Binding for the C++ Messaging API Class: Sender</title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="7*"/>
+ <thead>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Sender</entry>
+ </row>
+ <row>
+ <entry>Language</entry>
+ <entry>Syntax</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>C++</entry>
+ <entry>class Sender</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public ref class Sender</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>Constructed object is returned by Session.CreateSender</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Copy constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Sender(const Sender&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Sender(Sender sender);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Destructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>~Sender();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>~Sender();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>!Sender()</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Copy assignment operator</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Sender&amp; operator=(const Sender&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Sender op_Assign(Sender rhs);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Send</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void send(const Message&amp; message, bool sync=false);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Send(Message mmsgp);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Send(Message mmsgp, bool sync);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Close</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void close();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Close();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Capacity</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void setCapacity(uint32_t);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>uint32_t getCapacity();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public uint Capacity { get; set; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Available</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>uint32_t getAvailable();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public uint Available { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Unsettled</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>uint32_t getUnsettled();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public uint Unsettled { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Name</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>const std::string&amp; getName() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public string Name { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Session</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Session getSession() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Session Session { get; }</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ <section>
+ <title>.NET Binding for the C++ Messaging API Class: Session</title>
+ <table id="table-Dotnet-Binding-Session">
+ <title>.NET Binding for the C++ Messaging API Class: Session</title>
+ <tgroup cols="2">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="7*"/>
+ <thead>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">.NET Binding Class: Session</entry>
+ </row>
+ <row>
+ <entry>Language</entry>
+ <entry>Syntax</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>C++</entry>
+ <entry>class Session</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public ref class Session</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Constructor</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>Constructed object is returned by Connection.CreateSession</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Copy constructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Session(const Session&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Session(Session session);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Destructor</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>~Session();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>~Session();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Finalizer</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>n/a</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>!Session()</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Copy assignment operator</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Session&amp; operator=(const Session&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Session op_Assign(Session rhs);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Close</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void close();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Close();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Commit</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void commit();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Commit();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Rollback</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void rollback();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Rollback();</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Acknowledge</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void acknowledge(bool sync=false);</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void acknowledge(Message&amp;, bool sync=false);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Acknowledge();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Acknowledge(bool sync);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Acknowledge(Message __p1);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Acknowledge(Message __p1, bool __p2);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Reject</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void reject(Message&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Reject(Message __p1);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Release</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void release(Message&amp;);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Release(Message __p1);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: Sync</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void sync(bool block=true);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Sync();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void Sync(bool block);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Receivable</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>uint32_t getReceivable();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public uint Receivable { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: UnsettledAcks</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>uint32_t getUnsettledAcks();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public uint UnsetledAcks { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: NextReceiver</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>bool nextReceiver(Receiver&amp;, Duration timeout=Duration::FOREVER);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public bool NextReceiver(Receiver rcvr);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public bool NextReceiver(Receiver rcvr, Duration timeout);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: NextReceiver</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Receiver nextReceiver(Duration timeout=Duration::FOREVER);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Receiver NextReceiver();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Receiver NextReceiver(Duration timeout);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: CreateSender</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Sender createSender(const Address&amp; address);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Sender CreateSender(Address address);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: CreateSender</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Sender createSender(const std::string&amp; address);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Sender CreateSender(string address);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: CreateReceiver</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Receiver createReceiver(const Address&amp; address);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Receiver CreateReceiver(Address address);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: CreateReceiver</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Receiver createReceiver(const std::string&amp; address);</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Receiver CreateReceiver(string address);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: GetSender</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Sender getSender(const std::string&amp; name) const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Sender GetSender(string name);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: GetReceiver</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Receiver getReceiver(const std::string&amp; name) const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Receiver GetReceiver(string name);</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: Connection</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>Connection getConnection() const;</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public Connection Connection { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Property: HasError</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>bool hasError();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public bool HasError { get; }</entry>
+ </row>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Method: CheckError</entry>
+ </row>
+ <row>
+ <entry>C++</entry>
+ <entry>void checkError();</entry>
+ </row>
+ <row>
+ <entry>.NET</entry>
+ <entry>public void CheckError();</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+ <section>
+ <title>.NET Binding Class: SessionReceiver</title>
+ <para>
+ The SessionReceiver class provides a convenient callback
+ mechanism for Messages received by all Receivers on a given
+ Session.
+ </para>
+ <para>
+ <programlisting><![CDATA[
+using Org.Apache.Qpid.Messaging;
+using System;
+
+namespace Org.Apache.Qpid.Messaging.SessionReceiver
+{
+ public interface ISessionReceiver
+ {
+ void SessionReceiver(Receiver receiver, Message message);
+ }
+
+ public class CallbackServer
+ {
+ public CallbackServer(Session session, ISessionReceiver callback);
+
+ public void Close();
+ }
+}
+]]>
+ </programlisting>
+ </para>
+ <para>
+ To use this class a client program includes references to both
+ Org.Apache.Qpid.Messaging and Org.Apache.Qpid.Messaging.SessionReceiver.
+ The calling program creates a function that implements the
+ ISessionReceiver interface. This function will be called whenever
+ message is received by the session. The callback process is started
+ by creating a CallbackServer and will continue to run until the
+ client program calls the CallbackServer.Close function.
+ </para>
+ <para>
+ A complete operating example of using the SessionReceiver callback
+ is contained in cpp/bindings/qpid/dotnet/examples/csharp.map.callback.receiver.
+ </para>
+ </section>
+ </section>
+ </chapter>
+</book>
+
+<!--
+ - client code remains exactly the same, but routing behavior
+ changes
+ - exchanges drop messages if nobody is listening, so we need to
+ start drain first
+ - drain will exit immediately if the source is empty (note that
+ this is actually a semantic guarantee provided by the API, we
+ know for a fact that the source is empty when drain/fetch
+ reports it, no fudge factor timeout is required [this assumes
+ nobody is concurrently publishing of course])
+ - drain -f invokes blocking fetch (you could use a timeout here also)
+ -->
diff --git a/doc/book/src/QmfBook.xml b/doc/book/src/qmf/QmfBook.xml
index 64a6545fb5..64a6545fb5 100644
--- a/doc/book/src/QmfBook.xml
+++ b/doc/book/src/qmf/QmfBook.xml
diff --git a/doc/book/src/QmfIntroduction.xml b/doc/book/src/qmf/QmfIntroduction.xml
index db7b8949a5..db7b8949a5 100644
--- a/doc/book/src/QmfIntroduction.xml
+++ b/doc/book/src/qmf/QmfIntroduction.xml
diff --git a/doc/book/src/schemas.xml b/doc/book/src/schemas.xml
deleted file mode 100644
index d0bec81aed..0000000000
--- a/doc/book/src/schemas.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
- <uri resource="foo.xml" typeId="DocBook"/>
- <uri resource="foo.xml" typeId="DocBook"/>
- <uri resource="Programming-In-Apache-Qpid.xml" typeId="DocBook"/>
- <uri resource="queue-state-replication.xml" typeId="DocBook"/>
- <uri resource="AMQP-Messaging-Broker-Java-Book.xml" typeId="DocBook"/>
- <uri resource="High-Level-API.xml" typeId="DocBook"/>
- <uri resource="High-Level-API.xml" typeId="DocBook"/>
- <uri resource="Java-JMS-Selector-Syntax.xml" typeId="DocBook"/>
- <uri resource="ACL.xml" typeId="DocBook"/>
- <uri resource="Add-New-Users.xml" typeId="DocBook"/>
- <uri resource="AMQP-C++-Messaging-Client.xml" typeId="DocBook"/>
- <uri resource="AMQP-Compatibility.xml" typeId="DocBook"/>
- <uri resource="AMQP-Java-JMS-Messaging-Client.xml" typeId="DocBook"/>
- <uri resource="AMQP-Messaging-Broker-CPP.xml" typeId="DocBook"/>
- <uri resource="AMQP-Messaging-Broker-Java.xml" typeId="DocBook"/>
- <uri resource="AMQP-.NET-Messaging-Client.xml" typeId="DocBook"/>
- <uri resource="AMQP-Python-Messaging-Client.xml" typeId="DocBook"/>
- <uri resource="AMQP-Ruby-Messaging-Client.xml" typeId="DocBook"/>
- <uri resource="AMQP.xml" typeId="DocBook"/>
- <uri resource="Binding-URL-Format.xml" typeId="DocBook"/>
- <uri resource="Book-Info.xml" typeId="DocBook"/>
- <uri resource="Book.xml" typeId="DocBook"/>
- <uri resource="Broker-CPP.xml" typeId="DocBook"/>
- <uri resource="Broker-Java.xml" typeId="DocBook"/>
- <uri resource="Cheat-Sheet-for-configuring-Exchange-Options.xml" typeId="DocBook"/>
- <uri resource="Cheat-Sheet-for-configuring-Queue-Options.xml" typeId="DocBook"/>
- <uri resource="Clients.xml" typeId="DocBook"/>
- <uri resource="Configure-ACLs.xml" typeId="DocBook"/>
- <uri resource="Configure-Java-Qpid-to-use-a-SSL-connection.xml" typeId="DocBook"/>
- <uri resource="Configure-Log4j-CompositeRolling-Appender.xml" typeId="DocBook"/>
- <uri resource="Configure-the-Broker-via-config.xml.xml" typeId="DocBook"/>
- <uri resource="Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml" typeId="DocBook"/>
- <uri resource="Configuring-Management-Users.xml" typeId="DocBook"/>
- <uri resource="Configuring-Qpid-JMX-Management-Console.xml" typeId="DocBook"/>
- <uri resource="Connection-URL-Format.xml" typeId="DocBook"/>
- <uri resource="Debug-using-log4j.xml" typeId="DocBook"/>
- <uri resource="Download.xml" typeId="DocBook"/>
- <uri resource="Excel-AddIn.xml" typeId="DocBook"/>
- <uri resource="FAQ.xml" typeId="DocBook"/>
- <uri resource="foo.xml" typeId="DocBook"/>
- <uri resource="f.xml" typeId="DocBook"/>
- <uri resource="Getting-Started.xml" typeId="DocBook"/>
- <uri resource="How-to-Tune-M3-Java-Broker-Performance.xml" typeId="DocBook"/>
- <uri resource="How-to-Use-JNDI.xml" typeId="DocBook"/>
- <uri resource="Introduction.xml" typeId="DocBook"/>
- <uri resource="Java-Broker-Feature-Guide.xml" typeId="DocBook"/>
- <uri resource="Java-Environment-Variables.xml" typeId="DocBook"/>
- <uri resource="LVQ.xml" typeId="DocBook"/>
- <uri resource="Management-Console-Security.xml" typeId="DocBook"/>
- <uri resource="Management-Design-notes.xml" typeId="DocBook"/>
- <uri resource="Managing-CPP-Broker.xml" typeId="DocBook"/>
- <uri resource="MessageStore-Tool.xml" typeId="DocBook"/>
- <uri resource="NET-User-Guide.xml" typeId="DocBook"/>
- <uri resource="PythonBrokerTest.xml" typeId="DocBook"/>
- <uri resource="QMan-Qpid-Management-bridge.xml" typeId="DocBook"/>
- <uri resource="QMF-Python-Console-Tutorial.xml" typeId="DocBook"/>
- <uri resource="Qpid-ACLs.xml" typeId="DocBook"/>
- <uri resource="Qpid-Interoperability-Documentation.xml" typeId="DocBook"/>
- <uri resource="Qpid-Java-Broker-Management-CLI.xml" typeId="DocBook"/>
- <uri resource="Qpid-Java-Build-How-To.xml" typeId="DocBook"/>
- <uri resource="Qpid-Java-FAQ.xml" typeId="DocBook"/>
- <uri resource="Qpid-JMX-Management-Console-FAQ.xml" typeId="DocBook"/>
- <uri resource="Qpid-JMX-Management-Console-User-Guide.xml" typeId="DocBook"/>
- <uri resource="Qpid-JMX-Management-Console.xml" typeId="DocBook"/>
- <uri resource="Qpid-Management-Features.xml" typeId="DocBook"/>
- <uri resource="Qpid-Management-Framework.xml" typeId="DocBook"/>
- <uri resource="Qpid-Troubleshooting-Guide.xml" typeId="DocBook"/>
- <uri resource="queue-state-replication.xml" typeId="DocBook"/>
- <uri resource="Running-CPP-Broker.xml" typeId="DocBook"/>
- <uri resource="SASL-Compatibility.xml" typeId="DocBook"/>
- <uri resource="SSL.xml" typeId="DocBook"/>
- <uri resource="Starting-a-cluster.xml" typeId="DocBook"/>
- <uri resource="System-Properties.xml" typeId="DocBook"/>
- <uri resource="Use-Priority-Queues.xml" typeId="DocBook"/>
- <uri resource="Using-Broker-Federation.xml" typeId="DocBook"/>
- <uri resource="Using-Qpid-with-other-JNDI-Providers.xml" typeId="DocBook"/>
- <uri resource="WCF.xml" typeId="DocBook"/>
-</locatingRules>
diff --git a/doc/book/xsl/html-custom.xsl b/doc/book/xsl/html-custom.xsl
new file mode 100644
index 0000000000..94ba3b67f9
--- /dev/null
+++ b/doc/book/xsl/html-custom.xsl
@@ -0,0 +1,188 @@
+<?xml version='1.0'?>
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ -->
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl"/>
+
+<xsl:template name="chunk-element-content">
+ <xsl:param name="prev"/>
+ <xsl:param name="next"/>
+ <xsl:param name="nav.context"/>
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:call-template name="user.preroot"/>
+
+ <html>
+ <xsl:call-template name="html.head">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <body>
+<div class="container">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:call-template name="user.header.navigation"/>
+
+ <xsl:call-template name="header.navigation">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/>
+ </xsl:call-template>
+
+<div class="main_text_area">
+ <div class="main_text_area_top">
+ </div>
+ <div class="main_text_area_body">
+ <xsl:call-template name="user.header.content"/>
+ <xsl:copy-of select="$content"/>
+
+ <xsl:call-template name="user.footer.content"/>
+ </div>
+ <xsl:call-template name="footer.navigation">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="user.footer.navigation"/>
+ <div class="main_text_area_bottom">
+ </div>
+</div>
+</div>
+ </body>
+ </html>
+ <xsl:value-of select="$chunk.append"/>
+</xsl:template>
+
+<xsl:template name="breadcrumbs">
+ <xsl:param name="this.node" select="."/>
+ <DIV class="breadcrumbs">
+ <xsl:for-each select="$this.node/ancestor::*">
+ <span class="breadcrumb-link">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ <xsl:with-param name="context" select="$this.node"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </a>
+ </span>
+ <xsl:text> &gt; </xsl:text>
+ </xsl:for-each>
+ <!-- And display the current node, but not as a link -->
+ <span class="breadcrumb-node">
+ <xsl:apply-templates select="$this.node" mode="title.markup"/>
+ </span>
+ </DIV>
+</xsl:template>
+
+<xsl:template name="header.navigation">
+ <DIV class="header">
+ <DIV class="logo">
+ <H1>Apache Qpid&#8482;</H1>
+ <H2>Open Source AMQP Messaging</H2>
+ </DIV>
+ </DIV>
+
+ <DIV class="menu_box">
+ <DIV class="menu_box_top"></DIV>
+ <DIV class="menu_box_body">
+ <H3>Apache Qpid</H3>
+ <UL>
+ <LI><A href="http://qpid.apache.org/index.html">Home</A></LI>
+ <LI><A href="http://qpid.apache.org/download.html">Download</A></LI>
+ <LI><A href="http://qpid.apache.org/getting_started.html">Getting Started</A></LI>
+ <LI><A href="http://www.apache.org/licenses/">License</A></LI>
+ <LI><A href="https://cwiki.apache.org/qpid/faq.html">FAQ</A></LI>
+ </UL>
+ </DIV>
+ <DIV class="menu_box_bottom"></DIV>
+
+ <DIV class="menu_box_top"></DIV>
+ <DIV class="menu_box_body">
+ <H3>Documentation</H3>
+ <UL>
+ <LI><A href="http://qpid.apache.org/documentation.html#doc-release">0.14 Release</A></LI>
+ <LI><A href="http://qpid.apache.org/documentation.html#doc-trunk">Trunk</A></LI>
+ <LI><A href="http://qpid.apache.org/documentation.html#doc-archives">Archive</A></LI>
+ </UL>
+ </DIV>
+ <DIV class="menu_box_bottom"></DIV>
+
+ <DIV class="menu_box_top"></DIV>
+ <DIV class="menu_box_body">
+ <H3>Community</H3>
+ <UL>
+ <LI><A href="http://qpid.apache.org/getting_involved.html">Getting Involved</A></LI>
+ <LI><A href="http://qpid.apache.org/source_repository.html">Source Repository</A></LI>
+ <LI><A href="http://qpid.apache.org/mailing_lists.html">Mailing Lists</A></LI>
+ <LI><A href="https://cwiki.apache.org/qpid/">Wiki</A></LI>
+ <LI><A href="https://issues.apache.org/jira/browse/qpid">Issue Reporting</A></LI>
+ <LI><A href="http://qpid.apache.org/people.html">People</A></LI>
+ <LI><A href="http://qpid.apache.org/acknowledgements.html">Acknowledgements</A></LI>
+ </UL>
+ </DIV>
+ <DIV class="menu_box_bottom"></DIV>
+
+ <DIV class="menu_box_top"></DIV>
+ <DIV class="menu_box_body">
+ <H3>Developers</H3>
+ <UL>
+ <LI><A href="https://cwiki.apache.org/qpid/building.html">Building Qpid</A></LI>
+ <LI><A href="https://cwiki.apache.org/qpid/developer-pages.html">Developer Pages</A></LI>
+ </UL>
+ </DIV>
+ <DIV class="menu_box_bottom"></DIV>
+
+ <DIV class="menu_box_top"></DIV>
+ <DIV class="menu_box_body">
+ <H3>About AMQP</H3>
+ <UL>
+ <LI><A href="http://qpid.apache.org/amqp.html">What is AMQP?</A></LI>
+ </UL>
+ </DIV>
+ <DIV class="menu_box_bottom"></DIV>
+
+ <DIV class="menu_box_top"></DIV>
+ <DIV class="menu_box_body">
+ <H3>About Apache</H3>
+ <UL>
+ <LI><A href="http://www.apache.org">Home</A></LI>
+ <LI><A href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</A></LI>
+ <LI><A href="http://www.apache.org/foundation/thanks.html">Thanks</A></LI>
+ <LI><A href="http://www.apache.org/security/">Security</A></LI>
+ </UL>
+ </DIV>
+ <DIV class="menu_box_bottom"></DIV>
+ </DIV>
+
+</xsl:template>
+
+<xsl:template name="user.header.content">
+ <xsl:call-template name="breadcrumbs"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/extras/qmf/setup.py b/extras/qmf/setup.py
index f11546fe84..ac0910f78f 100755
--- a/extras/qmf/setup.py
+++ b/extras/qmf/setup.py
@@ -20,7 +20,7 @@
from distutils.core import setup
setup(name="qpid-qmf",
- version="0.15",
+ version="0.17",
author="Apache Qpid",
author_email="dev@qpid.apache.org",
packages=["qmf"],
diff --git a/extras/qmf/src/py/qmf/console.py b/extras/qmf/src/py/qmf/console.py
index ef7deb1d68..bd1ddb2833 100644
--- a/extras/qmf/src/py/qmf/console.py
+++ b/extras/qmf/src/py/qmf/console.py
@@ -3948,7 +3948,7 @@ class Event:
return "<uninterpretable>"
out = strftime("%c", gmtime(self.timestamp / 1000000000))
out += " " + self._sevName() + " " + self.classKey.getPackageName() + ":" + self.classKey.getClassName()
- out += " broker=" + self.broker.getUrl()
+ out += " broker=" + str(self.broker.getUrl())
for arg in self.schema.arguments:
disp = self.session._displayValue(self.arguments[arg.name], arg.type).encode("utf8")
if " " in disp:
diff --git a/java/.gitignore b/java/.gitignore
new file mode 100644
index 0000000000..36097e3820
--- /dev/null
+++ b/java/.gitignore
@@ -0,0 +1,2 @@
+*.swp
+eclipse-projects/*
diff --git a/java/amqp-1-0-client-jms/build.xml b/java/amqp-1-0-client-jms/build.xml
new file mode 100644
index 0000000000..4a685d7106
--- /dev/null
+++ b/java/amqp-1-0-client-jms/build.xml
@@ -0,0 +1,29 @@
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ -->
+<project name="AMQP 1.0 JMS Client" default="build">
+
+ <property name="module.genpom" value="true"/>
+ <property name="module.depends" value="amqp-1-0-common amqp-1-0-client"/>
+
+
+ <import file="../module.xml"/>
+
+</project>
diff --git a/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/Hello.java b/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/Hello.java
new file mode 100644
index 0000000000..61317e7f37
--- /dev/null
+++ b/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/Hello.java
@@ -0,0 +1,178 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms.example;
+
+import javax.jms.*;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Properties;
+
+
+public class Hello
+{
+
+ public Hello()
+ {
+ }
+
+ public static void main(String[] args)
+ {
+ try
+ {
+ Class.forName("org.apache.qpid.amqp_1_0.jms.jndi.PropertiesFileInitialContextFactory");
+
+ Hashtable env = new Hashtable();
+ env.put("java.naming.provider.url", "hello.properties");
+ env.put("java.naming.factory.initial", "org.apache.qpid.amqp_1_0.jms.jndi.PropertiesFileInitialContextFactory");
+
+ Context context = new InitialContext(env);
+
+ ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("localhost");
+ Connection connection = connectionFactory.createConnection();
+
+ Session producersession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ Queue queue = (Queue) context.lookup("queue");
+
+
+ Session consumerSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageConsumer messageConsumer = consumerSession.createConsumer(queue, "hello='true' and 7");
+
+ messageConsumer.setMessageListener(new MessageListener()
+ {
+ public void onMessage(final Message message)
+ {
+ try
+ {
+
+ if(message instanceof TextMessage)
+ {
+ System.out.println("Received text Message:");
+ System.out.println("======================");
+ System.out.println(((TextMessage) message).getText());
+ }
+ else if(message instanceof MapMessage)
+ {
+ System.out.println("Received Map Message:");
+ System.out.println("=====================");
+
+
+ MapMessage mapmessage = (MapMessage) message;
+
+ Enumeration names = mapmessage.getMapNames();
+
+ while(names.hasMoreElements())
+ {
+ String name = (String) names.nextElement();
+ System.out.println(name + " -> " + mapmessage.getObject(name));
+ }
+
+ }
+ else if(message instanceof BytesMessage)
+ {
+ System.out.println("Received Bytes Message:");
+ System.out.println("=======================");
+ System.out.println(((BytesMessage) message).readUTF());
+ }
+ else if(message instanceof StreamMessage)
+ {
+ System.out.println("Received Stream Message:");
+ System.out.println("========================");
+ StreamMessage streamMessage = (StreamMessage)message;
+ Object o = streamMessage.readObject();
+ System.out.println(o.getClass().getName() + ": " + o);
+ o = streamMessage.readObject();
+ System.out.println(o.getClass().getName() + ": " + o);
+ o = streamMessage.readObject();
+ System.out.println(o.getClass().getName() + ": " + o);
+
+ }
+ else if(message instanceof ObjectMessage)
+ {
+ System.out.println("Received Object Message:");
+ System.out.println("========================");
+ ObjectMessage objectMessage = (ObjectMessage)message;
+ Object o = objectMessage.getObject();
+ System.out.println(o.getClass().getName() + ": " + o);
+ }
+ else
+ {
+ System.out.println("Received Message " + message.getClass().getName());
+ }
+ }
+ catch (JMSException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+
+ }
+ });
+
+ connection.start();
+
+
+ MessageProducer messageProducer = producersession.createProducer(queue);
+ TextMessage message = producersession.createTextMessage("Hello world!");
+ message.setJMSType("Hello");
+ message.setStringProperty("hello","true");
+ messageProducer.send(message);
+ /*
+ MapMessage mapmessage = producersession.createMapMessage();
+ mapmessage.setBoolean("mybool", true);
+ mapmessage.setString("mystring", "hello");
+ mapmessage.setLong("mylong", -25L);
+
+
+ messageProducer.send(mapmessage);
+
+ BytesMessage bytesMessage = producersession.createBytesMessage();
+ bytesMessage.writeUTF("This is a bytes message");
+
+ messageProducer.send(bytesMessage);
+
+ ObjectMessage objectMessage = producersession.createObjectMessage();
+ objectMessage.setObject(new Double("3.14159265358979323846264338327950288"));
+
+ messageProducer.send(objectMessage);
+
+/* StreamMessage streamMessage = producersession.createStreamMessage();
+ streamMessage.writeBoolean(true);
+ streamMessage.writeLong(18031974L);
+ streamMessage.writeString("this is a stream Message");
+ streamMessage.writeChar('£');
+ messageProducer.send(streamMessage);
+*/
+ Thread.sleep(50000L);
+
+ connection.close();
+ context.close();
+ }
+ catch (Exception exp)
+ {
+ exp.printStackTrace();
+ }
+ }
+}
diff --git a/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/hello.properties b/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/hello.properties
new file mode 100644
index 0000000000..930c2c15cc
--- /dev/null
+++ b/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/hello.properties
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+java.naming.factory.initial = org.apache.qpid.amqp_1_0.jms.jndi.PropertiesFileInitialContextFactory
+
+# register some connection factories
+# connectionfactory.[jndiname] = [ConnectionURL]
+connectionfactory.localhost = http://guest:guest@localhost/test?cliendId='test-client'
+
+
+# Register an AMQP destination in JNDI
+# destination.[jniName] = [Address Format]
+queue.queue = queue
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/AmqpMessage.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/AmqpMessage.java
new file mode 100644
index 0000000000..de42b36ef2
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/AmqpMessage.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms;
+
+import org.apache.qpid.amqp_1_0.type.Section;
+
+import java.util.ListIterator;
+
+public interface AmqpMessage extends Message
+{
+ int getSectionCount();
+
+ Section getSection(int position);
+
+ ListIterator<Section> sectionIterator();
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/BytesMessage.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/BytesMessage.java
new file mode 100644
index 0000000000..3475319fe4
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/BytesMessage.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface BytesMessage extends Message, javax.jms.BytesMessage
+{
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Connection.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Connection.java
new file mode 100644
index 0000000000..97447917f6
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Connection.java
@@ -0,0 +1,37 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+
+public interface Connection extends javax.jms.Connection
+{
+
+ ConnectionMetaData getMetaData() throws JMSException;
+
+ Session createSession(boolean transacted, int acknowledgeMode) throws JMSException;
+
+ Session createSession(Session.AcknowledgeMode acknowledgeMode) throws JMSException;
+
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionFactory.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionFactory.java
new file mode 100644
index 0000000000..752993b229
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionFactory.java
@@ -0,0 +1,31 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.jms;
+
+
+import javax.jms.JMSException;
+
+public interface ConnectionFactory extends javax.jms.ConnectionFactory
+{
+ Connection createConnection() throws JMSException;
+
+ Connection createConnection(String username, String password) throws JMSException;
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionMetaData.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionMetaData.java
new file mode 100644
index 0000000000..3802d6e416
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionMetaData.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface ConnectionMetaData extends javax.jms.ConnectionMetaData
+{
+ int getAMQPMajorVersion();
+
+ int getAMQPMinorVersion();
+
+ int getAMQPRevisionVersion();
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Destination.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Destination.java
new file mode 100644
index 0000000000..0b467b3c99
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Destination.java
@@ -0,0 +1,28 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface Destination extends javax.jms.Destination
+{
+ public String getAddress();
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/JavaSerializable.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/JavaSerializable.java
new file mode 100644
index 0000000000..0c9179bc2b
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/JavaSerializable.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface JavaSerializable
+{
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MapMessage.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MapMessage.java
new file mode 100644
index 0000000000..81754ecc93
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MapMessage.java
@@ -0,0 +1,37 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+import java.util.Set;
+
+public interface MapMessage extends Message, javax.jms.MapMessage
+{
+ public Object get(Object key) throws JMSException;
+
+ public Object put(Object key, Object val) throws JMSException;
+
+ public boolean itemExists(Object key) throws JMSException;
+
+ Set<Object> keySet() throws JMSException;
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Message.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Message.java
new file mode 100644
index 0000000000..1481c54ee1
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Message.java
@@ -0,0 +1,178 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import org.apache.qpid.amqp_1_0.messaging.MessageAttributes;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedByte;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
+
+import javax.jms.JMSException;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+public interface Message extends javax.jms.Message
+{
+
+ Destination getJMSReplyTo() throws JMSException;
+
+ Destination getJMSDestination() throws JMSException;
+
+ // properties can be keyed by any valid apache.qpid.amqp_1_0 datatype, not just strings
+
+ boolean propertyExists(Object name) throws JMSException;
+
+ boolean getBooleanProperty(Object name) throws JMSException;
+
+ byte getByteProperty(Object name) throws JMSException;
+
+ short getShortProperty(Object name) throws JMSException;
+
+ int getIntProperty(Object name) throws JMSException;
+
+ long getLongProperty(Object name) throws JMSException;
+
+ float getFloatProperty(Object name) throws JMSException;
+
+ double getDoubleProperty(Object name) throws JMSException;
+
+ String getStringProperty(Object name) throws JMSException;
+
+ Object getObjectProperty(Object name) throws JMSException;
+
+ // apache.qpid.amqp_1_0 allows for lists, maps, and unsigned integral data types
+
+ List<Object> getListProperty(Object name) throws JMSException;
+
+ Map<Object,Object> getMapProperty(Object name) throws JMSException;
+
+ UnsignedByte getUnsignedByteProperty(Object name) throws JMSException;
+
+ UnsignedShort getUnsignedShortProperty(Object name) throws JMSException;
+
+ UnsignedInteger getUnsignedIntProperty(Object name) throws JMSException;
+
+ UnsignedLong getUnsignedLongProperty(Object name) throws JMSException;
+
+ // properties can be keyed by any valid apache.qpid.amqp_1_0 datatype, not just strings
+
+ void setBooleanProperty(Object name, boolean b) throws JMSException;
+
+ void setByteProperty(Object name, byte b) throws JMSException;
+
+ void setShortProperty(Object name, short i) throws JMSException;
+
+ void setIntProperty(Object name, int i) throws JMSException;
+
+ void setLongProperty(Object name, long l) throws JMSException;
+
+ void setFloatProperty(Object name, float v) throws JMSException;
+
+ void setDoubleProperty(Object name, double v) throws JMSException;
+
+ void setStringProperty(Object name, String s1) throws JMSException;
+
+ void setObjectProperty(Object name, Object o) throws JMSException;
+
+ // apache.qpid.amqp_1_0 allows for lists, maps, and unsigned integral data types
+
+ void setListProperty(Object name, List<Object> list) throws JMSException;
+
+ void setMapProperty(Object name, Map<Object,Object> map) throws JMSException;
+
+ void setUnsignedByteProperty(Object name, UnsignedByte b) throws JMSException;
+
+ void setUnsignedShortProperty(Object name, UnsignedShort s) throws JMSException;
+
+ void setUnsignedIntProperty(Object name, UnsignedInteger i) throws JMSException;
+
+ void setUnsignedLongProperty(Object name, UnsignedLong l) throws JMSException;
+
+ // delegation accessors for Header section
+
+ UnsignedInteger getDeliveryFailures();
+
+ void setDeliveryFailures(UnsignedInteger failures);
+
+ MessageAttributes getHeaderMessageAttrs();
+
+ void setHeaderMessageAttrs(MessageAttributes messageAttrs);
+
+ MessageAttributes getHeaderDeliveryAttrs();
+
+ void setHeaderDeliveryAttrs(MessageAttributes deliveryAttrs);
+
+ Boolean getDurable();
+
+ void setDurable(Boolean durable);
+
+ UnsignedByte getPriority();
+
+ void setPriority(UnsignedByte priority);
+
+ Date getTransmitTime();
+
+ void setTransmitTime(Date transmitTime);
+
+ UnsignedInteger getTtl();
+
+ void setTtl(UnsignedInteger ttl);
+
+ UnsignedInteger getFormerAcquirers();
+
+ void setFormerAcquirers(UnsignedInteger formerAcquirers);
+
+ // delegation accessors for Properties section
+
+ Object getMessageId();
+
+ void setMessageId(Object messageId);
+
+ Binary getUserId();
+
+ void setUserId(Binary userId);
+
+ String getTo();
+
+ void setTo(String to);
+
+ String getSubject();
+
+ void setSubject(String subject);
+
+ String getReplyTo();
+
+ void setReplyTo(String replyTo);
+
+ Object getCorrelationId();
+
+ void setCorrelationId(Binary correlationId);
+
+ Symbol getContentType();
+
+ void setContentType(Symbol contentType);
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageConsumer.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageConsumer.java
new file mode 100644
index 0000000000..fe235f098f
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageConsumer.java
@@ -0,0 +1,36 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+
+public interface MessageConsumer extends javax.jms.MessageConsumer
+{
+
+ Message receive() throws JMSException;
+
+ Message receive(long l) throws JMSException;
+
+ Message receiveNoWait() throws JMSException;
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageProducer.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageProducer.java
new file mode 100644
index 0000000000..98987c2409
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageProducer.java
@@ -0,0 +1,27 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+
+public interface MessageProducer extends javax.jms.MessageProducer
+{
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ObjectMessage.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ObjectMessage.java
new file mode 100644
index 0000000000..8b59aa284a
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ObjectMessage.java
@@ -0,0 +1,27 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface ObjectMessage extends Message, javax.jms.ObjectMessage
+{
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Queue.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Queue.java
new file mode 100644
index 0000000000..40beac08d1
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Queue.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface Queue extends Destination, javax.jms.Queue
+{
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueBrowser.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueBrowser.java
new file mode 100644
index 0000000000..5bb88569a1
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueBrowser.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+public interface QueueBrowser extends javax.jms.QueueBrowser
+{
+ Queue getQueue() throws JMSException;
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueConnection.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueConnection.java
new file mode 100644
index 0000000000..1375f1c5f2
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueConnection.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+public interface QueueConnection extends javax.jms.QueueConnection, Connection
+{
+ QueueSession createQueueSession(boolean b, int i) throws JMSException;
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueReceiver.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueReceiver.java
new file mode 100644
index 0000000000..9cc1a36ca7
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueReceiver.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+public interface QueueReceiver extends MessageConsumer, javax.jms.QueueReceiver
+{
+ Queue getQueue() throws JMSException;
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSender.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSender.java
new file mode 100644
index 0000000000..824e48364c
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSender.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+public interface QueueSender extends MessageProducer, javax.jms.QueueSender
+{
+ Queue getQueue() throws JMSException;
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSession.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSession.java
new file mode 100644
index 0000000000..28d30f60c5
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSession.java
@@ -0,0 +1,42 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+
+public interface QueueSession extends Session, javax.jms.QueueSession
+{
+ Queue createQueue(String s) throws JMSException;
+
+ QueueReceiver createReceiver(javax.jms.Queue queue) throws JMSException;
+
+ QueueReceiver createReceiver(javax.jms.Queue queue, String s) throws JMSException;
+
+ QueueSender createSender(javax.jms.Queue queue) throws JMSException;
+
+ QueueBrowser createBrowser(javax.jms.Queue queue) throws JMSException;
+
+ QueueBrowser createBrowser(javax.jms.Queue queue, String s) throws JMSException;
+
+ TemporaryQueue createTemporaryQueue() throws JMSException;
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Session.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Session.java
new file mode 100644
index 0000000000..0ce9baecea
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Session.java
@@ -0,0 +1,75 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Queue;
+import javax.jms.Topic;
+
+
+import java.io.Serializable;
+
+public interface Session extends javax.jms.Session
+{
+ static enum AcknowledgeMode { SESSION_TRANSACTED, AUTO_ACKNOWLEDGE, CLIENT_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE };
+
+ BytesMessage createBytesMessage() throws JMSException;
+
+ MapMessage createMapMessage() throws JMSException;
+
+ Message createMessage() throws JMSException;
+
+ ObjectMessage createObjectMessage() throws JMSException;
+
+ ObjectMessage createObjectMessage(Serializable serializable) throws JMSException;
+
+ StreamMessage createStreamMessage() throws JMSException;
+
+ TextMessage createTextMessage() throws JMSException;
+
+ TextMessage createTextMessage(String s) throws JMSException;
+
+ AmqpMessage createAmqpMessage() throws JMSException;
+
+ MessageProducer createProducer(Destination destination) throws JMSException;
+
+ MessageConsumer createConsumer(Destination destination) throws JMSException;
+
+ MessageConsumer createConsumer(Destination destination, String s) throws JMSException;
+
+ MessageConsumer createConsumer(Destination destination, String s, boolean b) throws JMSException;
+
+ TopicSubscriber createDurableSubscriber(Topic topic, String s) throws JMSException;
+
+ TopicSubscriber createDurableSubscriber(Topic topic, String s, String s1, boolean b)
+ throws JMSException;
+
+ QueueBrowser createBrowser(Queue queue) throws JMSException;
+
+ QueueBrowser createBrowser(Queue queue, String s) throws JMSException;
+
+ TemporaryQueue createTemporaryQueue() throws JMSException;
+
+ TemporaryTopic createTemporaryTopic() throws JMSException;
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/StreamMessage.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/StreamMessage.java
new file mode 100644
index 0000000000..d207a708c9
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/StreamMessage.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface StreamMessage extends Message, javax.jms.StreamMessage
+{
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryDestination.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryDestination.java
new file mode 100644
index 0000000000..025a1af806
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryDestination.java
@@ -0,0 +1,33 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface TemporaryDestination
+{
+ Session getSession();
+
+ boolean isDeleted();
+
+ void addConsumer(MessageConsumer consumer);
+
+ void removeConsumer(MessageConsumer consumer);
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryQueue.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryQueue.java
new file mode 100644
index 0000000000..182f9a4c85
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryQueue.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface TemporaryQueue extends Queue, TemporaryDestination, javax.jms.TemporaryQueue
+{
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryTopic.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryTopic.java
new file mode 100644
index 0000000000..277681079b
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryTopic.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface TemporaryTopic extends Topic, TemporaryDestination, javax.jms.TemporaryTopic
+{
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TextMessage.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TextMessage.java
new file mode 100644
index 0000000000..1dbcd5f84f
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TextMessage.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface TextMessage extends Message, javax.jms.TextMessage
+{
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Topic.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Topic.java
new file mode 100644
index 0000000000..755d698a04
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Topic.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface Topic extends Destination, javax.jms.Topic
+{
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicConnection.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicConnection.java
new file mode 100644
index 0000000000..1431c7d2cb
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicConnection.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+public interface TopicConnection extends Connection, javax.jms.TopicConnection
+{
+ TopicSession createTopicSession(boolean b, int i) throws JMSException;
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicPublisher.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicPublisher.java
new file mode 100644
index 0000000000..dde6c8b606
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicPublisher.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface TopicPublisher extends MessageProducer, javax.jms.TopicPublisher
+{
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSession.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSession.java
new file mode 100644
index 0000000000..2c02ff199e
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSession.java
@@ -0,0 +1,43 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+
+public interface TopicSession extends Session,javax.jms.TopicSession
+{
+ Topic createTopic(String s) throws JMSException;
+
+ TopicSubscriber createSubscriber(javax.jms.Topic topic) throws JMSException;
+
+ TopicSubscriber createSubscriber(javax.jms.Topic topic, String s, boolean b) throws JMSException;
+
+ TopicSubscriber createDurableSubscriber(javax.jms.Topic topic, String s) throws JMSException;
+
+ TopicSubscriber createDurableSubscriber(javax.jms.Topic topic, String s, String s1, boolean b)
+ throws JMSException;
+
+ TopicPublisher createPublisher(javax.jms.Topic topic) throws JMSException;
+
+ TemporaryTopic createTemporaryTopic() throws JMSException;
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSubscriber.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSubscriber.java
new file mode 100644
index 0000000000..00e5e9aca9
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSubscriber.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+public interface TopicSubscriber extends MessageConsumer, javax.jms.TopicSubscriber
+{
+ Topic getTopic() throws JMSException;
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/AmqpMessageImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/AmqpMessageImpl.java
new file mode 100644
index 0000000000..0ca629db7e
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/AmqpMessageImpl.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.AmqpMessage;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+import org.apache.qpid.amqp_1_0.type.messaging.Footer;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.MessageAnnotations;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import java.util.*;
+
+public class AmqpMessageImpl extends MessageImpl implements AmqpMessage
+{
+ private List<Section> _sections;
+
+ protected AmqpMessageImpl(Header header, MessageAnnotations messageAnnotations, Properties properties, ApplicationProperties appProperties, List<Section> sections,
+ Footer footer, SessionImpl session)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, session);
+ _sections = sections;
+ }
+
+ protected AmqpMessageImpl(final SessionImpl session)
+ {
+ super(new Header(), new MessageAnnotations(new HashMap()), new Properties(), new ApplicationProperties(new HashMap()), new Footer(Collections.EMPTY_MAP),
+ session);
+ _sections = new ArrayList<Section>();
+ }
+
+ public int getSectionCount()
+ {
+ return _sections.size();
+ }
+
+ public Section getSection(final int position)
+ {
+ return _sections.get(position);
+ }
+
+ public ListIterator<Section> sectionIterator()
+ {
+ return _sections.listIterator();
+ }
+
+ @Override Collection<Section> getSections()
+ {
+ List<Section> sections = new ArrayList<Section>();
+ sections.add(getHeader());
+ if(getMessageAnnotations() != null && getMessageAnnotations().getValue() != null && !getMessageAnnotations().getValue().isEmpty())
+ {
+ sections.add(getMessageAnnotations());
+ }
+ sections.add(getProperties());
+ sections.add(getApplicationProperties());
+ sections.addAll(_sections);
+ sections.add(getFooter());
+ return sections;
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/BytesMessageImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/BytesMessageImpl.java
new file mode 100644
index 0000000000..83cc8eafb5
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/BytesMessageImpl.java
@@ -0,0 +1,538 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.BytesMessage;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import javax.jms.JMSException;
+import javax.jms.MessageEOFException;
+import javax.jms.MessageFormatException;
+import java.io.*;
+import java.util.*;
+
+public class BytesMessageImpl extends MessageImpl implements BytesMessage
+{
+ private DataInputStream _dataAsInput;
+ private DataOutputStream _dataAsOutput;
+ private ByteArrayOutputStream _bytesOut;
+ private Data _dataIn;
+
+ // message created for reading
+ protected BytesMessageImpl(Header header, MessageAnnotations messageAnnotations, Properties properties, ApplicationProperties appProperties, Data data,
+ Footer footer, SessionImpl session)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, session);
+ _dataIn = data;
+ final Binary dataBuffer = data.getValue();
+ _dataAsInput = new DataInputStream(new ByteArrayInputStream(dataBuffer.getArray(),dataBuffer.getArrayOffset(),dataBuffer.getLength()));
+
+ }
+
+ // message created to be sent
+ protected BytesMessageImpl(final SessionImpl session)
+ {
+ super(new Header(),
+ new MessageAnnotations(new HashMap()),
+ new Properties(),
+ new ApplicationProperties(new HashMap()),
+ new Footer(Collections.EMPTY_MAP),
+ session);
+
+ _bytesOut = new ByteArrayOutputStream();
+ _dataAsOutput = new DataOutputStream(_bytesOut);
+ }
+
+
+ private Data getDataSection()
+ {
+ if(_bytesOut != null)
+ {
+ return new Data(new Binary(_bytesOut.toByteArray()));
+ }
+ else
+ {
+ return _dataIn;
+ }
+ }
+
+ @Override
+ protected boolean isReadOnly()
+ {
+ return _dataIn != null;
+ }
+
+ public long getBodyLength() throws JMSException
+ {
+ checkReadable();
+ return getDataSection().getValue().getLength();
+ }
+
+ public boolean readBoolean() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readBoolean();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+
+ public byte readByte() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readByte();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public int readUnsignedByte() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readUnsignedByte();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public short readShort() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readShort();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public int readUnsignedShort() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readUnsignedShort();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public char readChar() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readChar();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public int readInt() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readInt();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public long readLong() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readLong();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public float readFloat() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readFloat();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public double readDouble() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readDouble();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public String readUTF() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readUTF();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public int readBytes(byte[] bytes) throws JMSException
+ {
+
+ return readBytes(bytes, bytes.length);
+ }
+
+ public int readBytes(byte[] bytes, int length) throws JMSException
+ {
+ checkReadable();
+
+ try
+ {
+ int offset = 0;
+ while(offset < length)
+ {
+ int read = _dataAsInput.read(bytes, offset, length - offset);
+ if(read < 0)
+ {
+ break;
+ }
+ offset += read;
+ }
+
+ if(offset == 0 && length != 0)
+ {
+ return -1;
+ }
+ else
+ {
+ return offset;
+ }
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public void writeBoolean(boolean b) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeBoolean(b);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+
+ }
+
+ public void writeByte(byte b) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeByte(b);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeShort(short i) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeShort(i);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeChar(char c) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeChar(c);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeInt(int i) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeInt(i);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeLong(long l) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeLong(l);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeFloat(float v) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeFloat(v);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeDouble(double v) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeDouble(v);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeUTF(String s) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeUTF(s);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeBytes(byte[] bytes) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.write(bytes);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeBytes(byte[] bytes, int off, int len) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.write(bytes, off, len);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeObject(Object o) throws JMSException
+ {
+ checkWritable();
+ if(o == null)
+ {
+ throw new NullPointerException("Value passed to BytesMessage.writeObject() must be non null");
+ }
+ else if (o instanceof Boolean)
+ {
+ writeBoolean((Boolean)o);
+ }
+ else if (o instanceof Byte)
+ {
+ writeByte((Byte)o);
+ }
+ else if (o instanceof Short)
+ {
+ writeShort((Short)o);
+ }
+ else if (o instanceof Character)
+ {
+ writeChar((Character)o);
+ }
+ else if (o instanceof Integer)
+ {
+ writeInt((Integer)o);
+ }
+ else if(o instanceof Long)
+ {
+ writeLong((Long)o);
+ }
+ else if(o instanceof Float)
+ {
+ writeFloat((Float) o);
+ }
+ else if(o instanceof Double)
+ {
+ writeDouble((Double) o);
+ }
+ else if(o instanceof String)
+ {
+ writeUTF((String) o);
+ }
+ else if(o instanceof byte[])
+ {
+ writeBytes((byte[])o);
+ }
+ else
+ {
+ throw new MessageFormatException("Value passed to BytesMessage.writeObject() must be of primitive type. Type passed was " + o.getClass().getName());
+ }
+ }
+
+ public void reset() throws JMSException
+ {
+ if(_bytesOut != null)
+ {
+ byte[] data = _bytesOut.toByteArray();
+ _dataIn = new Data(new Binary(data));
+ _dataAsInput = new DataInputStream(new ByteArrayInputStream(data));
+ _dataAsOutput = null;
+ _bytesOut = null;
+ }
+ else
+ {
+
+ final Binary dataBuffer = _dataIn.getValue();
+ _dataAsInput = new DataInputStream(new ByteArrayInputStream(dataBuffer.getArray(),dataBuffer.getArrayOffset(),dataBuffer.getLength()));
+
+ }
+ }
+
+ private JMSException handleInputException(final IOException e)
+ {
+ JMSException ex;
+ if(e instanceof EOFException)
+ {
+ ex = new MessageEOFException(e.getMessage());
+ }
+ else
+ {
+ ex = new MessageFormatException(e.getMessage());
+ }
+ ex.initCause(e);
+ ex.setLinkedException(e);
+ return ex;
+ }
+
+ private JMSException handleOutputException(final IOException e)
+ {
+ JMSException ex = new JMSException(e.getMessage());
+ ex.initCause(e);
+ ex.setLinkedException(e);
+ return ex;
+ }
+
+ @Override
+ public void clearBody() throws JMSException
+ {
+ super.clearBody();
+ _bytesOut = new ByteArrayOutputStream();
+ _dataAsOutput = new DataOutputStream(_bytesOut);
+ _dataAsInput = null;
+ _dataIn = null;
+ }
+
+ @Override Collection<Section> getSections()
+ {
+ List<Section> sections = new ArrayList<Section>();
+ sections.add(getHeader());
+ if(getMessageAnnotations() != null && getMessageAnnotations().getValue() != null && !getMessageAnnotations().getValue().isEmpty())
+ {
+ sections.add(getMessageAnnotations());
+ }
+ sections.add(getProperties());
+ sections.add(getApplicationProperties());
+ sections.add(getDataSection());
+ sections.add(getFooter());
+ return sections;
+ }
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java
new file mode 100644
index 0000000000..d9e6dfe36d
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java
@@ -0,0 +1,173 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import javax.jms.JMSException;
+import javax.jms.QueueConnection;
+import javax.jms.QueueConnectionFactory;
+import javax.jms.TopicConnection;
+import javax.jms.TopicConnectionFactory;
+import org.apache.qpid.amqp_1_0.jms.ConnectionFactory;
+
+public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnectionFactory, QueueConnectionFactory
+{
+ private String _host;
+ private int _port;
+ private String _username;
+ private String _password;
+ private String _clientId;
+ private String _remoteHost;
+ private boolean _ssl;
+
+
+ public ConnectionFactoryImpl(final String host,
+ final int port,
+ final String username,
+ final String password)
+ {
+ this(host,port,username,password,null,false);
+ }
+
+ public ConnectionFactoryImpl(final String host,
+ final int port,
+ final String username,
+ final String password,
+ final String clientId)
+ {
+ this(host,port,username,password,clientId,false);
+ }
+
+ public ConnectionFactoryImpl(final String host,
+ final int port,
+ final String username,
+ final String password,
+ final String clientId,
+ final boolean ssl)
+ {
+ this(host,port,username,password,clientId,null,ssl);
+ }
+
+ public ConnectionFactoryImpl(final String host,
+ final int port,
+ final String username,
+ final String password,
+ final String clientId,
+ final String remoteHost,
+ final boolean ssl)
+ {
+ _host = host;
+ _port = port;
+ _username = username;
+ _password = password;
+ _clientId = clientId;
+ _remoteHost = remoteHost;
+ _ssl = ssl;
+ }
+
+ public ConnectionImpl createConnection() throws JMSException
+ {
+ return new ConnectionImpl(_host, _port, _username, _password, _clientId, _remoteHost, _ssl);
+ }
+
+ public ConnectionImpl createConnection(final String username, final String password) throws JMSException
+ {
+ return new ConnectionImpl(_host, _port, username, password, _clientId, _remoteHost, _ssl);
+ }
+
+ public static ConnectionFactoryImpl createFromURL(final String urlString) throws MalformedURLException
+ {
+ URL url = new URL(urlString);
+ String host = url.getHost();
+ int port = url.getPort();
+ if(port == -1)
+ {
+ port = 5672;
+ }
+ String userInfo = url.getUserInfo();
+ String username = null;
+ String password = null;
+ String clientId = null;
+ String remoteHost = null;
+ boolean ssl = false;
+ if(userInfo != null)
+ {
+ String[] components = userInfo.split(":",2);
+ username = components[0];
+ if(components.length == 2)
+ {
+ password = components[1];
+ }
+ }
+ String query = url.getQuery();
+ if(query != null)
+ {
+ for(String param : query.split("&"))
+ {
+ String[] keyValuePair = param.split("=",2);
+ if(keyValuePair[0].equalsIgnoreCase("clientid"))
+ {
+ clientId = keyValuePair[1];
+ }
+ else if(keyValuePair[0].equalsIgnoreCase("ssl"))
+ {
+ ssl = Boolean.valueOf(keyValuePair[1]);
+ }
+ else if(keyValuePair[0].equalsIgnoreCase("remote-host"))
+ {
+ remoteHost = keyValuePair[1];
+ }
+ }
+ }
+
+ return new ConnectionFactoryImpl(host, port, username, password, clientId, remoteHost, ssl);
+
+ }
+
+ public QueueConnection createQueueConnection() throws JMSException
+ {
+ final ConnectionImpl connection = createConnection();
+ connection.setQueueConnection(true);
+ return connection;
+ }
+
+ public QueueConnection createQueueConnection(final String username, final String password) throws JMSException
+ {
+ final ConnectionImpl connection = createConnection(username, password);
+ connection.setQueueConnection(true);
+ return connection;
+ }
+
+ public TopicConnection createTopicConnection() throws JMSException
+ {
+ final ConnectionImpl connection = createConnection();
+ connection.setTopicConnection(true);
+ return connection;
+ }
+
+ public TopicConnection createTopicConnection(final String username, final String password) throws JMSException
+ {
+ final ConnectionImpl connection = createConnection(username, password);
+ connection.setTopicConnection(true);
+ return connection;
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..587b12b51a
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java
@@ -0,0 +1,329 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.Connection;
+import org.apache.qpid.amqp_1_0.jms.ConnectionMetaData;
+import org.apache.qpid.amqp_1_0.jms.Session;
+import org.apache.qpid.amqp_1_0.transport.Container;
+
+import javax.jms.*;
+import javax.jms.IllegalStateException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class ConnectionImpl implements Connection, QueueConnection, TopicConnection
+{
+
+ private ConnectionMetaData _connectionMetaData;
+ private volatile ExceptionListener _exceptionListener;
+
+ private final List<SessionImpl> _sessions = new ArrayList<SessionImpl>();
+
+ private final Object _lock = new Object();
+
+ private org.apache.qpid.amqp_1_0.client.Connection _conn;
+ private boolean _isQueueConnection;
+ private boolean _isTopicConnection;
+ private final Collection<CloseTask> _closeTasks = new ArrayList<CloseTask>();
+
+
+ private static enum State
+ {
+ STOPPED,
+ STARTED,
+ CLOSED
+ }
+
+ private volatile State _state = State.STOPPED;
+
+ public ConnectionImpl(String host, int port, String username, String password, String clientId) throws JMSException
+ {
+ this(host,port,username,password,clientId,false);
+ }
+
+ public ConnectionImpl(String host, int port, String username, String password, String clientId, boolean ssl) throws JMSException
+ {
+ this(host,port,username,password,clientId,null,ssl);
+ }
+
+ public ConnectionImpl(String host, int port, String username, String password, String clientId, String remoteHost, boolean ssl) throws JMSException
+ {
+ Container container = clientId == null ? new Container() : new Container(clientId);
+ // TODO - authentication, containerId, clientId, ssl?, etc
+ try
+ {
+ _conn = new org.apache.qpid.amqp_1_0.client.Connection(host, port, username, password, container, remoteHost, ssl);
+ // TODO - retrieve negotiated AMQP version
+ _connectionMetaData = new ConnectionMetaDataImpl(1,0,0);
+ }
+ catch (org.apache.qpid.amqp_1_0.client.Connection.ConnectionException e)
+ {
+ JMSException jmsEx = new JMSException(e.getMessage());
+ jmsEx.setLinkedException(e);
+ jmsEx.initCause(e);
+ throw jmsEx;
+ }
+ }
+
+ public SessionImpl createSession(final boolean transacted, final int acknowledgeMode) throws JMSException
+ {
+ Session.AcknowledgeMode ackMode;
+
+ try
+ {
+ ackMode = transacted ? Session.AcknowledgeMode.SESSION_TRANSACTED
+ : Session.AcknowledgeMode.values()[acknowledgeMode];
+ }
+ catch (IndexOutOfBoundsException e)
+ {
+ JMSException jmsEx = new JMSException("Unknown acknowledgement mode " + acknowledgeMode);
+ jmsEx.setLinkedException(e);
+ jmsEx.initCause(e);
+ throw jmsEx;
+ }
+
+ return createSession(ackMode);
+ }
+
+ public SessionImpl createSession(final Session.AcknowledgeMode acknowledgeMode) throws JMSException
+ {
+ synchronized(_lock)
+ {
+ if(_state == State.CLOSED)
+ {
+ throw new IllegalStateException("Cannot create a session on a closed connection");
+ }
+
+ SessionImpl session = new SessionImpl(this, acknowledgeMode);
+ session.setQueueSession(_isQueueConnection);
+ session.setTopicSession(_isTopicConnection);
+ _sessions.add(session);
+
+ return session;
+ }
+
+ }
+
+ public String getClientID() throws JMSException
+ {
+ checkClosed();
+ return _conn.getEndpoint().getContainer().getId();
+ }
+
+ public void setClientID(final String s) throws JMSException
+ {
+ throw new IllegalStateException("Cannot set client-id to \""
+ + s
+ + "\"; client-id must be set on connection creation");
+ }
+
+ public ConnectionMetaData getMetaData() throws JMSException
+ {
+ checkClosed();
+ return _connectionMetaData;
+ }
+
+ public ExceptionListener getExceptionListener() throws JMSException
+ {
+ checkClosed();
+ return _exceptionListener;
+ }
+
+ public void setExceptionListener(final ExceptionListener exceptionListener) throws JMSException
+ {
+ checkClosed();
+ _exceptionListener = exceptionListener;
+ }
+
+ public void start() throws JMSException
+ {
+ synchronized(_lock)
+ {
+ checkClosed();
+ if(_state == State.STOPPED)
+ {
+ // TODO
+
+ _state = State.STARTED;
+
+ for(SessionImpl session : _sessions)
+ {
+ session.start();
+ }
+
+ }
+
+ _lock.notifyAll();
+ }
+
+ }
+
+ public void stop() throws JMSException
+ {
+ synchronized(_lock)
+ {
+ switch(_state)
+ {
+ case STARTED:
+ for(SessionImpl session : _sessions)
+ {
+ session.stop();
+ }
+ _state = State.STOPPED;
+ break;
+ case CLOSED:
+ throw new javax.jms.IllegalStateException("Closed");
+ }
+
+ _lock.notifyAll();
+ }
+ }
+
+
+ static interface CloseTask
+ {
+ public void onClose() throws JMSException;
+ }
+
+ void addOnCloseTask(CloseTask task)
+ {
+ synchronized (_lock)
+ {
+ _closeTasks.add(task);
+ }
+ }
+
+
+ void removeOnCloseTask(CloseTask task)
+ {
+ synchronized (_lock)
+ {
+ _closeTasks.remove(task);
+ }
+ }
+
+ public void close() throws JMSException
+ {
+ synchronized(_lock)
+ {
+ if(_state != State.CLOSED)
+ {
+ stop();
+ for(SessionImpl session : _sessions)
+ {
+ session.close();
+ }
+ for(CloseTask task : _closeTasks)
+ {
+ task.onClose();
+ }
+ _conn.close();
+ _state = State.CLOSED;
+ }
+
+ _lock.notifyAll();
+ }
+ }
+
+ private void checkClosed() throws IllegalStateException
+ {
+ if(_state == State.CLOSED)
+ throw new IllegalStateException("Closed");
+ }
+
+ public ConnectionConsumer createConnectionConsumer(final Destination destination,
+ final String s,
+ final ServerSessionPool serverSessionPool,
+ final int i) throws JMSException
+ {
+ checkClosed();
+ return null; //TODO
+ }
+
+ public TopicSession createTopicSession(final boolean transacted, final int acknowledgeMode) throws JMSException
+ {
+ checkClosed();
+ SessionImpl session = createSession(transacted, acknowledgeMode);
+ session.setTopicSession(true);
+ return session;
+ }
+
+ public ConnectionConsumer createConnectionConsumer(final Topic topic,
+ final String s,
+ final ServerSessionPool serverSessionPool,
+ final int i) throws JMSException
+ {
+ checkClosed();
+ return null; //TODO
+ }
+
+ public ConnectionConsumer createDurableConnectionConsumer(final Topic topic,
+ final String s,
+ final String s1,
+ final ServerSessionPool serverSessionPool,
+ final int i) throws JMSException
+ {
+ checkClosed();
+ return null; //TODO
+ }
+
+ public QueueSession createQueueSession(final boolean transacted, final int acknowledgeMode) throws JMSException
+ {
+ checkClosed();
+ SessionImpl session = createSession(transacted, acknowledgeMode);
+ session.setQueueSession(true);
+ return session;
+ }
+
+ public ConnectionConsumer createConnectionConsumer(final Queue queue,
+ final String s,
+ final ServerSessionPool serverSessionPool,
+ final int i) throws JMSException
+ {
+ checkClosed();
+ return null; //TODO
+ }
+
+
+
+ protected org.apache.qpid.amqp_1_0.client.Connection getClientConnection()
+ {
+ return _conn;
+ }
+
+ public boolean isStarted()
+ {
+ synchronized (_lock)
+ {
+ return _state == State.STARTED;
+ }
+ }
+
+ void setQueueConnection(final boolean queueConnection)
+ {
+ _isQueueConnection = queueConnection;
+ }
+
+ void setTopicConnection(final boolean topicConnection)
+ {
+ _isTopicConnection = topicConnection;
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionMetaDataImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionMetaDataImpl.java
new file mode 100644
index 0000000000..8159c7116b
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionMetaDataImpl.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.ConnectionMetaData;
+
+import javax.jms.JMSException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+
+public class ConnectionMetaDataImpl implements ConnectionMetaData
+{
+ private static final int JMS_MAJOR_VERSION = 1;
+ private static final int JMS_MINOR_VERSION = 1;
+
+ private static final int PROVIDER_MAJOR_VERSION = 1;
+ private static final int PROVIDER_MINOR_VERSION = 0;
+
+
+ private final int _amqpMajorVersion;
+ private final int _amqpMinorVersion;
+ private final int _amqpRevisionVersion;
+ private static final Collection<String> _jmsxProperties = Arrays.asList("JMSXGroupID", "JMSXGroupSeq");
+
+ public ConnectionMetaDataImpl(final int amqpMajorVersion, final int amqpMinorVersion, final int amqpRevisionVersion)
+ {
+ _amqpMajorVersion = amqpMajorVersion;
+ _amqpMinorVersion = amqpMinorVersion;
+ _amqpRevisionVersion = amqpRevisionVersion;
+ }
+
+ public String getJMSVersion() throws JMSException
+ {
+ return getJMSMajorVersion() + "." + getJMSMinorVersion();
+ }
+
+ public int getJMSMajorVersion() throws JMSException
+ {
+ return JMS_MAJOR_VERSION;
+ }
+
+ public int getJMSMinorVersion() throws JMSException
+ {
+ return JMS_MINOR_VERSION;
+ }
+
+ public String getJMSProviderName() throws JMSException
+ {
+ return "AMQP.ORG";
+ }
+
+ public String getProviderVersion() throws JMSException
+ {
+ return getProviderMajorVersion() + "." + getProviderMinorVersion();
+ }
+
+ public int getProviderMajorVersion() throws JMSException
+ {
+ return PROVIDER_MAJOR_VERSION;
+ }
+
+ public int getProviderMinorVersion() throws JMSException
+ {
+ return PROVIDER_MINOR_VERSION;
+ }
+
+ public Enumeration getJMSXPropertyNames() throws JMSException
+ {
+
+ return Collections.enumeration(_jmsxProperties);
+ }
+
+ public int getAMQPMajorVersion()
+ {
+ return _amqpMajorVersion;
+ }
+
+ public int getAMQPMinorVersion()
+ {
+ return _amqpMinorVersion;
+ }
+
+ public int getAMQPRevisionVersion()
+ {
+ return _amqpRevisionVersion;
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/DestinationImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/DestinationImpl.java
new file mode 100644
index 0000000000..b4ca2c6302
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/DestinationImpl.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.Destination;
+import org.apache.qpid.amqp_1_0.jms.Queue;
+import org.apache.qpid.amqp_1_0.jms.Topic;
+
+import javax.jms.JMSException;
+import java.util.WeakHashMap;
+
+public class DestinationImpl implements Destination, Queue, Topic
+{
+ private static final WeakHashMap<String, DestinationImpl> DESTINATION_CACHE =
+ new WeakHashMap<String, DestinationImpl>();
+
+ private final String _address;
+
+ protected DestinationImpl(String address)
+ {
+ _address = address;
+ }
+
+ public String getAddress()
+ {
+ return _address;
+ }
+
+ public static DestinationImpl valueOf(String address)
+ {
+ return address == null ? null : createDestination(address);
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _address.hashCode();
+ }
+
+ @Override
+ public boolean equals(final Object obj)
+ {
+ return obj != null
+ && obj.getClass() == getClass()
+ && _address.equals(((DestinationImpl)obj)._address);
+ }
+
+ public static synchronized DestinationImpl createDestination(final String address)
+ {
+ DestinationImpl destination = DESTINATION_CACHE.get(address);
+ if(destination == null)
+ {
+ destination = new DestinationImpl(address);
+ DESTINATION_CACHE.put(address, destination);
+ }
+ return destination;
+ }
+
+ public String getQueueName() throws JMSException
+ {
+ return getAddress();
+ }
+
+ public String getTopicName() throws JMSException
+ {
+ return getAddress();
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MapMessageImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MapMessageImpl.java
new file mode 100644
index 0000000000..47811a0f5a
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MapMessageImpl.java
@@ -0,0 +1,444 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.MapMessage;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import javax.jms.JMSException;
+import javax.jms.MessageFormatException;
+import java.util.*;
+
+public class MapMessageImpl extends MessageImpl implements MapMessage
+{
+ private Map _map;
+
+ public MapMessageImpl(Header header, MessageAnnotations messageAnnotations, Properties properties, ApplicationProperties appProperties, Map map,
+ Footer footer,
+ SessionImpl session)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, session);
+ _map = map;
+ }
+
+ MapMessageImpl(final SessionImpl session)
+ {
+ super(new Header(), new MessageAnnotations(new HashMap()),
+ new Properties(), new ApplicationProperties(new HashMap()), new Footer(Collections.EMPTY_MAP),
+ session);
+ _map = new HashMap();
+ }
+
+ public boolean getBoolean(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Boolean)
+ {
+ return ((Boolean) value).booleanValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Boolean.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to boolean.");
+ }
+ }
+
+ public byte getByte(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Byte)
+ {
+ return ((Byte) value).byteValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Byte.valueOf((String) value).byteValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to byte.");
+ } }
+
+ public short getShort(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Short)
+ {
+ return ((Short) value).shortValue();
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte) value).shortValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Short.valueOf((String) value).shortValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to short.");
+ } }
+
+ public char getChar(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (!itemExists(name))
+ {
+ throw new MessageFormatException("Property " + name + " not present");
+ }
+ else if (value instanceof Character)
+ {
+ return ((Character) value).charValue();
+ }
+ else if (value == null)
+ {
+ throw new NullPointerException("Property " + name + " has null value and therefore cannot "
+ + "be converted to char.");
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to boolan.");
+ } }
+
+ public int getInt(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Integer)
+ {
+ return ((Integer) value).intValue();
+ }
+ else if (value instanceof Short)
+ {
+ return ((Short) value).intValue();
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte) value).intValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Integer.valueOf((String) value).intValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to int.");
+ }
+ }
+
+ public long getLong(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Long)
+ {
+ return ((Long) value).longValue();
+ }
+ else if (value instanceof Integer)
+ {
+ return ((Integer) value).longValue();
+ }
+
+ if (value instanceof Short)
+ {
+ return ((Short) value).longValue();
+ }
+
+ if (value instanceof Byte)
+ {
+ return ((Byte) value).longValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Long.valueOf((String) value).longValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to long.");
+ }
+ }
+
+ public float getFloat(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Float)
+ {
+ return ((Float) value).floatValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Float.valueOf((String) value).floatValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to float.");
+ }
+ }
+
+ public double getDouble(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Double)
+ {
+ return ((Double) value).doubleValue();
+ }
+ else if (value instanceof Float)
+ {
+ return ((Float) value).doubleValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Double.valueOf((String) value).doubleValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to double.");
+ }
+ }
+
+ public String getString(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if ((value instanceof String) || (value == null))
+ {
+ return (String) value;
+ }
+ else if (value instanceof byte[] || value instanceof Binary)
+ {
+ throw new MessageFormatException("Property " + name + " of type byte[] " + "cannot be converted to String.");
+ }
+ else
+ {
+ return value.toString();
+ }
+ }
+
+ public byte[] getBytes(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (!itemExists(name))
+ {
+ throw new MessageFormatException("Property " + name + " not present");
+ }
+ else if ((value instanceof byte[]) || (value == null))
+ {
+ return (byte[]) value;
+ }
+ else if(value instanceof Binary)
+ {
+ return ((Binary)value).getArray();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to byte[].");
+ } }
+
+ public Object getObject(String s) throws JMSException
+ {
+ Object val = get(s);
+ return val instanceof Binary ? ((Binary)val).getArray() : val;
+ }
+
+ public Enumeration getMapNames() throws JMSException
+ {
+ return Collections.enumeration(keySet());
+ }
+
+ public void setBoolean(String name, boolean val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setByte(String name, byte val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setShort(String name, short val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setChar(String name, char val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setInt(String name, int val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setLong(String name, long val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setFloat(String name, float val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setDouble(String name, double val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setString(String name, String val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setBytes(String name, byte[] val) throws JMSException
+ {
+ setBytes(name, val, 0, val == null ? 0 : val.length);
+ }
+
+ public void setBytes(String name, byte[] bytes, int offset, int length) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ byte[] val;
+
+ if(bytes == null)
+ {
+ val = null;
+ }
+ else
+ {
+ val = new byte[length];
+ System.arraycopy(bytes,offset,val,0,length);
+ }
+
+ put(name, new Binary(val));
+ }
+
+ public void setObject(String name, Object value) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ if ((value instanceof Boolean) || (value instanceof Byte) || (value instanceof Short) || (value instanceof Integer)
+ || (value instanceof Long) || (value instanceof Character) || (value instanceof Float)
+ || (value instanceof Double) || (value instanceof String) || (value instanceof byte[]) || (value == null))
+ {
+ put(name, value);
+ }
+ else
+ {
+ throw new MessageFormatException("Cannot set property " + name + " to value " + value + "of type "
+ + value.getClass().getName() + ".");
+ } }
+
+ public boolean itemExists(String s)
+ {
+ return _map.containsKey(s);
+ }
+
+ public Object get(final Object key)
+ {
+ return _map.get(key);
+ }
+
+ public Object put(final Object key, final Object val)
+ {
+ return _map.put(key, val);
+ }
+
+ public boolean itemExists(final Object key)
+ {
+ return _map.containsKey(key);
+ }
+
+ public Set<Object> keySet()
+ {
+ return _map.keySet();
+ }
+
+ @Override
+ public void clearBody() throws JMSException
+ {
+ super.clearBody();
+ _map.clear();
+ }
+
+ private void checkPropertyName(String propName)
+ {
+ if ((propName == null) || propName.equals(""))
+ {
+ throw new IllegalArgumentException("Property name cannot be null, or the empty String.");
+ }
+ }
+
+ @Override Collection<Section> getSections()
+ {
+ List<Section> sections = new ArrayList<Section>();
+ sections.add(getHeader());
+ if(getMessageAnnotations() != null && getMessageAnnotations().getValue() != null && !getMessageAnnotations().getValue().isEmpty())
+ {
+ sections.add(getMessageAnnotations());
+ }
+ sections.add(getProperties());
+ sections.add(getApplicationProperties());
+ sections.add(new AmqpValue(_map));
+ sections.add(getFooter());
+ return sections;
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageConsumerImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageConsumerImpl.java
new file mode 100644
index 0000000000..e0402cd0a7
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageConsumerImpl.java
@@ -0,0 +1,447 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.AcknowledgeMode;
+import org.apache.qpid.amqp_1_0.client.Message;
+import org.apache.qpid.amqp_1_0.client.Receiver;
+import org.apache.qpid.amqp_1_0.client.Transaction;
+import org.apache.qpid.amqp_1_0.jms.MessageConsumer;
+import org.apache.qpid.amqp_1_0.jms.QueueReceiver;
+import org.apache.qpid.amqp_1_0.jms.Queue;
+import org.apache.qpid.amqp_1_0.jms.Session;
+import org.apache.qpid.amqp_1_0.jms.TemporaryDestination;
+import org.apache.qpid.amqp_1_0.jms.Topic;
+import org.apache.qpid.amqp_1_0.jms.TopicSubscriber;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.messaging.Filter;
+import org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter;
+import org.apache.qpid.amqp_1_0.type.messaging.Modified;
+import org.apache.qpid.amqp_1_0.type.messaging.NoLocalFilter;
+import org.apache.qpid.amqp_1_0.type.transport.AmqpError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+
+import javax.jms.Destination;
+import javax.jms.IllegalStateException;
+import javax.jms.InvalidDestinationException;
+import javax.jms.InvalidSelectorException;
+import javax.jms.JMSException;
+import javax.jms.MessageListener;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MessageConsumerImpl implements MessageConsumer, QueueReceiver, TopicSubscriber
+{
+ private static final Symbol NO_LOCAL_FILTER_NAME = Symbol.valueOf("no-local");
+ private static final Symbol JMS_SELECTOR_FILTER_NAME = Symbol.valueOf("jms-selector");
+ private String _selector;
+ private boolean _noLocal;
+ private DestinationImpl _destination;
+ private SessionImpl _session;
+ private Receiver _receiver;
+ private Binary _lastUnackedMessage;
+ MessageListener _messageListener;
+
+ private boolean _isQueueConsumer;
+ private boolean _isTopicSubscriber;
+
+ private boolean _closed = false;
+ private String _linkName;
+ private boolean _durable;
+ private Collection<Binary> _txnMsgs = Collections.synchronizedCollection(new ArrayList<Binary>());
+ private Binary _lastTxnUpdate;
+ private final List<Message> _recoverReplayMessages = new ArrayList<Message>();
+ private final List<Message> _replaymessages = new ArrayList<Message>();
+
+ MessageConsumerImpl(final Destination destination,
+ final SessionImpl session,
+ final String selector,
+ final boolean noLocal) throws JMSException
+ {
+ this(destination,session,selector,noLocal,null,false);
+ }
+
+ MessageConsumerImpl(final Destination destination,
+ final SessionImpl session,
+ final String selector,
+ final boolean noLocal,
+ final String linkName,
+ final boolean durable) throws JMSException
+ {
+ _selector = selector;
+ _noLocal = noLocal;
+ _linkName = linkName;
+ _durable = durable;
+ if(destination instanceof DestinationImpl)
+ {
+ _destination = (DestinationImpl) destination;
+ if(destination instanceof javax.jms.Queue)
+ {
+ _isQueueConsumer = true;
+ }
+ else if(destination instanceof javax.jms.Topic)
+ {
+ _isTopicSubscriber = true;
+ }
+ if(destination instanceof TemporaryDestination)
+ {
+ ((TemporaryDestination)destination).addConsumer(this);
+ }
+ }
+ else
+ {
+ throw new InvalidDestinationException("Invalid destination class " + destination.getClass().getName());
+ }
+ _session = session;
+
+ _receiver = createClientReceiver();
+
+
+ }
+
+ protected Receiver createClientReceiver() throws JMSException
+ {
+ try
+ {
+ return _session.getClientSession(). createReceiver(_destination.getAddress(), AcknowledgeMode.ALO,
+ _linkName, _durable, getFilters(), null);
+ }
+ catch (AmqpErrorException e)
+ {
+ Error error = e.getError();
+ if(AmqpError.INVALID_FIELD.equals(error.getCondition()))
+ {
+ throw new InvalidSelectorException(e.getMessage());
+ }
+ else
+ {
+ throw new JMSException(e.getMessage(), error.getCondition().getValue().toString());
+
+ }
+ }
+ }
+
+ Map<Symbol, Filter> getFilters()
+ {
+ if(_selector == null || _selector.trim().equals(""))
+ {
+ if(_noLocal)
+ {
+ return Collections.singletonMap(NO_LOCAL_FILTER_NAME, (Filter) NoLocalFilter.INSTANCE);
+ }
+ else
+ {
+ return null;
+
+ }
+ }
+ else if(_noLocal)
+ {
+ Map<Symbol, Filter> filters = new HashMap<Symbol, Filter>();
+ filters.put(NO_LOCAL_FILTER_NAME, NoLocalFilter.INSTANCE);
+ filters.put(JMS_SELECTOR_FILTER_NAME, new JMSSelectorFilter(_selector));
+ return filters;
+ }
+ else
+ {
+ return Collections.singletonMap(JMS_SELECTOR_FILTER_NAME, (Filter)new JMSSelectorFilter(_selector));
+ }
+
+
+ }
+
+ public String getMessageSelector() throws JMSException
+ {
+ checkClosed();
+ return _selector;
+ }
+
+ public MessageListener getMessageListener() throws IllegalStateException
+ {
+ checkClosed();
+ return _messageListener;
+ }
+
+ public void setMessageListener(final MessageListener messageListener) throws JMSException
+ {
+ checkClosed();
+ _messageListener = messageListener;
+ _session.messageListenerSet( this );
+ _receiver.setMessageArrivalListener(new Receiver.MessageArrivalListener()
+ {
+
+ public void messageArrived(final Receiver receiver)
+ {
+ _session.messageArrived(MessageConsumerImpl.this);
+ }
+ });
+ }
+
+ public MessageImpl receive() throws JMSException
+ {
+ checkClosed();
+ return receiveImpl(-1L);
+ }
+
+ public MessageImpl receive(final long timeout) throws JMSException
+ {
+ checkClosed();
+ // TODO - validate timeout > 0
+
+ return receiveImpl(timeout);
+ }
+
+ public MessageImpl receiveNoWait() throws JMSException
+ {
+ checkClosed();
+ return receiveImpl(0L);
+ }
+
+ private MessageImpl receiveImpl(long timeout) throws IllegalStateException
+ {
+ org.apache.qpid.amqp_1_0.client.Message msg;
+ boolean redelivery;
+ if(_replaymessages.isEmpty())
+ {
+ msg = receive0(timeout);
+ redelivery = false;
+ }
+ else
+ {
+ msg = _replaymessages.remove(0);
+ redelivery = true;
+ }
+
+ if(msg != null)
+ {
+ preReceiveAction(msg);
+ }
+ return createJMSMessage(msg, redelivery);
+ }
+
+ Message receive0(final long timeout)
+ {
+ Message message = _receiver.receive(timeout);
+ if(_session.getAckModeEnum() == Session.AcknowledgeMode.CLIENT_ACKNOWLEDGE)
+ {
+ _recoverReplayMessages.add(message);
+ }
+ return message;
+ }
+
+
+ void acknowledge(final org.apache.qpid.amqp_1_0.client.Message msg)
+ {
+ _receiver.acknowledge(msg.getDeliveryTag(), _session.getTxn());
+ }
+
+ MessageImpl createJMSMessage(final Message msg, boolean redelivery)
+ {
+ if(msg != null)
+ {
+ MessageFactory factory = _session.getMessageFactory();
+ final MessageImpl message = factory.createMessage(_destination, msg);
+ message.setFromQueue(_isQueueConsumer);
+ message.setFromTopic(_isTopicSubscriber);
+ if(redelivery)
+ {
+ if(!message.getJMSRedelivered())
+ {
+ message.setJMSRedelivered(true);
+ }
+ }
+
+ return message;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public void close() throws JMSException
+ {
+ if(!_closed)
+ {
+ _closed = true;
+
+ closeUnderlyingReceiver(_receiver);
+
+ if(_destination instanceof TemporaryDestination)
+ {
+ ((TemporaryDestination)_destination).removeConsumer(this);
+ }
+ }
+ }
+
+ protected void closeUnderlyingReceiver(Receiver receiver)
+ {
+ receiver.close();
+ }
+
+ private void checkClosed() throws IllegalStateException
+ {
+ if(_closed)
+ {
+ throw new javax.jms.IllegalStateException("Closed");
+ }
+ }
+
+ void setLastUnackedMessage(final Binary deliveryTag)
+ {
+ _lastUnackedMessage = deliveryTag;
+ }
+
+ void preReceiveAction(final org.apache.qpid.amqp_1_0.client.Message msg) throws IllegalStateException
+ {
+ final int acknowledgeMode = _session.getAcknowledgeMode();
+
+ if(acknowledgeMode == Session.AUTO_ACKNOWLEDGE
+ || acknowledgeMode == Session.DUPS_OK_ACKNOWLEDGE
+ || acknowledgeMode == Session.SESSION_TRANSACTED)
+ {
+ acknowledge(msg);
+ if(acknowledgeMode == Session.SESSION_TRANSACTED)
+ {
+ _txnMsgs.add(msg.getDeliveryTag());
+ }
+ }
+ else if(acknowledgeMode == Session.CLIENT_ACKNOWLEDGE)
+ {
+ setLastUnackedMessage(msg.getDeliveryTag());
+ }
+ }
+
+ void acknowledgeAll()
+ {
+ if(_lastUnackedMessage != null)
+ {
+ Transaction txn = _session.getTxn();
+ _receiver.acknowledgeAll(_lastUnackedMessage, txn, null);
+ if(txn != null)
+ {
+ _lastTxnUpdate = _lastUnackedMessage;
+ }
+ _lastUnackedMessage = null;
+
+ }
+ _recoverReplayMessages.clear();
+ if(!_replaymessages.isEmpty())
+ {
+ _recoverReplayMessages.addAll(_replaymessages);
+ }
+ }
+
+ void postRollback()
+ {
+ if(_lastTxnUpdate != null)
+ {
+ final Modified outcome = new Modified();
+ outcome.setDeliveryFailed(true);
+ _receiver.updateAll(outcome, _lastTxnUpdate);
+ _lastTxnUpdate = null;
+ }
+ for(Binary tag : _txnMsgs)
+ {
+ _receiver.modified(tag);
+ }
+ _txnMsgs.clear();
+ }
+
+ void postCommit()
+ {
+ _lastTxnUpdate = null;
+ _txnMsgs.clear();
+ }
+
+ public DestinationImpl getDestination() throws IllegalStateException
+ {
+ checkClosed();
+ return _destination;
+ }
+
+
+ public SessionImpl getSession() throws IllegalStateException
+ {
+ checkClosed();
+ return _session;
+ }
+
+ public boolean getNoLocal() throws IllegalStateException
+ {
+ checkClosed();
+ return _noLocal;
+ }
+
+ public void start()
+ {
+ _receiver.setCredit(UnsignedInteger.valueOf(100), true);
+ }
+
+ public Queue getQueue() throws JMSException
+ {
+ return (Queue) getDestination();
+ }
+
+ public Topic getTopic() throws JMSException
+ {
+ return (Topic) getDestination();
+ }
+
+ void setQueueConsumer(final boolean queueConsumer)
+ {
+ _isQueueConsumer = queueConsumer;
+ }
+
+ void setTopicSubscriber(final boolean topicSubscriber)
+ {
+ _isTopicSubscriber = topicSubscriber;
+ }
+
+ String getLinkName()
+ {
+ return _linkName;
+ }
+
+ boolean isDurable()
+ {
+ return _durable;
+ }
+
+ void doRecover()
+ {
+ _replaymessages.clear();
+ if(!_recoverReplayMessages.isEmpty())
+ {
+ _replaymessages.addAll(_recoverReplayMessages);
+ for(Message msg : _replaymessages)
+ {
+ _session.messageArrived(this);
+ }
+ }
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageFactory.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageFactory.java
new file mode 100644
index 0000000000..216107e53e
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageFactory.java
@@ -0,0 +1,191 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.Message;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.Serializable;
+import java.util.*;
+
+class MessageFactory
+{
+ private final SessionImpl _session;
+
+
+ MessageFactory(final SessionImpl session)
+ {
+ _session = session;
+ }
+
+ public MessageImpl createMessage(final DestinationImpl destination, final Message msg)
+ {
+ MessageImpl message;
+ List<Section> payload = msg.getPayload();
+ Header header = null;
+ MessageAnnotations messageAnnotations = null;
+
+ Properties properties = null;
+ ApplicationProperties appProperties = null;
+ Footer footer;
+
+ Iterator<Section> iter = payload.iterator();
+ List<Section> body = new ArrayList<Section>();
+
+ Section section = iter.hasNext() ? iter.next() : null;
+
+ if(section instanceof Header)
+ {
+ header = (Header) section;
+ section = iter.hasNext() ? iter.next() : null;
+ }
+
+ if(section instanceof MessageAnnotations)
+ {
+ messageAnnotations = (MessageAnnotations) section;
+ section = iter.hasNext() ? iter.next() : null;
+ }
+
+ if(section instanceof Properties)
+ {
+ properties = (Properties) section;
+ section = iter.hasNext() ? iter.next() : null;
+ }
+
+ if(section instanceof ApplicationProperties)
+ {
+ appProperties = (ApplicationProperties) section;
+ section = iter.hasNext() ? iter.next() : null;
+ }
+
+ while(section != null && !(section instanceof Footer))
+ {
+ body.add(section);
+ section = iter.hasNext() ? iter.next() : null;
+ }
+
+ footer = (Footer) section;
+
+ if(body.size() == 1)
+ {
+ Section bodySection = body.get(0);
+ if(bodySection instanceof AmqpValue && ((AmqpValue)bodySection).getValue() instanceof Map)
+ {
+ message = new MapMessageImpl(header, messageAnnotations, properties, appProperties, (Map) ((AmqpValue)bodySection).getValue(), footer, _session);
+ }
+ else if(bodySection instanceof AmqpValue && ((AmqpValue)bodySection).getValue() instanceof List)
+ {
+ message = new StreamMessageImpl(header, messageAnnotations, properties, appProperties,
+ (List) ((AmqpValue)bodySection).getValue(), footer, _session);
+ }
+ else if(bodySection instanceof AmqpValue && ((AmqpValue)bodySection).getValue() instanceof String)
+ {
+ message = new TextMessageImpl(header, messageAnnotations, properties, appProperties,
+ (String) ((AmqpValue)bodySection).getValue(), footer, _session);
+ }
+ else if(bodySection instanceof AmqpValue && ((AmqpValue)bodySection).getValue() instanceof Binary)
+ {
+
+ Binary value = (Binary) ((AmqpValue) bodySection).getValue();
+ message = new BytesMessageImpl(header, messageAnnotations, properties, appProperties,
+ new Data(value), footer, _session);
+ }
+ else if(bodySection instanceof Data)
+ {
+ if(properties != null && ObjectMessageImpl.CONTENT_TYPE.equals(properties.getContentType()))
+ {
+
+
+ message = new ObjectMessageImpl(header, messageAnnotations, properties, appProperties,
+ (Data) bodySection,
+ footer,
+ _session);
+ }
+ else
+ {
+ message = new BytesMessageImpl(header, messageAnnotations, properties, appProperties, (Data) bodySection, footer, _session);
+ }
+ }
+ else if(bodySection instanceof AmqpSequence)
+ {
+ message = new StreamMessageImpl(header, messageAnnotations, properties, appProperties, ((AmqpSequence) bodySection).getValue(), footer, _session);
+ }
+
+ /*else if(bodySection instanceof AmqpDataSection)
+ {
+ AmqpDataSection dataSection = (AmqpDataSection) bodySection;
+
+ List<Object> data = new ArrayList<Object>();
+
+ ListIterator<Object> dataIter = dataSection.iterator();
+
+ while(dataIter.hasNext())
+ {
+ data.add(dataIter.next());
+ }
+
+ if(data.size() == 1)
+ {
+ final Object obj = data.get(0);
+ if( obj instanceof String)
+ {
+ message = new TextMessageImpl(header,properties,appProperties,(String) data.get(0),footer, _session);
+ }
+ else if(obj instanceof JavaSerializable)
+ {
+ // TODO - ObjectMessage
+ message = new AmqpMessageImpl(header,properties,appProperties,body,footer, _session);
+ }
+ else if(obj instanceof Serializable)
+ {
+ message = new ObjectMessageImpl(header,properties,footer,appProperties,(Serializable)obj, _session);
+ }
+ else
+ {
+ message = new AmqpMessageImpl(header,properties,appProperties,body,footer, _session);
+ }
+ }
+ else
+ {
+ // not a text message
+ message = new AmqpMessageImpl(header,properties,appProperties,body,footer, _session);
+ }
+ }*/
+ else
+ {
+ message = new AmqpMessageImpl(header,messageAnnotations, properties,appProperties,body,footer, _session);
+ }
+ }
+ else
+ {
+ message = new AmqpMessageImpl(header,messageAnnotations, properties,appProperties,body,footer, _session);
+ }
+
+ message.setReadOnly();
+
+ return message;
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageImpl.java
new file mode 100644
index 0000000000..f1056b94fd
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageImpl.java
@@ -0,0 +1,1209 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.Message;
+import org.apache.qpid.amqp_1_0.messaging.MessageAttributes;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedByte;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+import org.apache.qpid.amqp_1_0.type.messaging.Footer;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.MessageAnnotations;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import javax.jms.DeliveryMode;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.MessageFormatException;
+import javax.jms.MessageNotReadableException;
+import javax.jms.MessageNotWriteableException;
+import java.nio.charset.Charset;
+import java.util.*;
+
+public abstract class MessageImpl implements Message
+{
+ static final Set<Class> _supportedClasses =
+ new HashSet<Class>(Arrays.asList(Boolean.class, Byte.class, Short.class, Integer.class, Long.class,
+ Float.class, Double.class, Character.class, String.class, byte[].class));
+ private static final Symbol JMS_TYPE = Symbol.valueOf("x-opt-jms-type");
+
+ private Header _header;
+ private Properties _properties;
+ private ApplicationProperties _applicationProperties;
+ private Footer _footer;
+ public static final Charset UTF_8_CHARSET = Charset.forName("UTF-8");
+ private SessionImpl _sessionImpl;
+ private boolean _readOnly;
+ private MessageAnnotations _messageAnnotations;
+
+ private boolean _isFromQueue;
+ private boolean _isFromTopic;
+ private long _expiration;
+
+ protected MessageImpl(Header header,
+ MessageAnnotations messageAnnotations,
+ Properties properties,
+ ApplicationProperties appProperties,
+ Footer footer,
+ SessionImpl session)
+ {
+ _header = header == null ? new Header() : header;
+ _properties = properties == null ? new Properties() : properties;
+ _messageAnnotations = messageAnnotations == null ? new MessageAnnotations(new HashMap()) : messageAnnotations;
+ _footer = footer == null ? new Footer(Collections.EMPTY_MAP) : footer;
+ _applicationProperties = appProperties == null ? new ApplicationProperties(new HashMap()) : appProperties;
+ _sessionImpl = session;
+ }
+
+ public String getJMSMessageID() throws JMSException
+ {
+ Object messageId = getMessageId();
+
+ return messageId == null ? null : "ID:"+messageId.toString();
+ }
+
+ public void setJMSMessageID(String messageId) throws InvalidJMSMEssageIdException
+ {
+ if(messageId == null)
+ {
+ setMessageId(null);
+ }
+ else if(messageId.startsWith("ID:"))
+ {
+ setMessageId(messageId.substring(3));
+ }
+ else
+ {
+ throw new InvalidJMSMEssageIdException(messageId);
+ }
+ }
+
+ public long getJMSTimestamp() throws JMSException
+ {
+ Date transmitTime = getTransmitTime();
+ return transmitTime == null ? 0 : transmitTime.getTime();
+ }
+
+ public void setJMSTimestamp(long l) throws JMSException
+ {
+ setTransmitTime(new Date(l));
+ if(_expiration != 0l)
+ {
+ setTtl(UnsignedInteger.valueOf(_expiration-getTransmitTime().getTime()));
+ }
+ }
+
+ public byte[] getJMSCorrelationIDAsBytes() throws JMSException
+ {
+
+ Object o = getCorrelationId();
+ if(o instanceof Binary)
+ {
+ Binary correlationIdBinary = (Binary) o;
+ byte[] correlationId = new byte[correlationIdBinary.getLength()];
+ correlationIdBinary.asByteBuffer().get(correlationId);
+ return correlationId;
+ }
+ else
+ {
+ return o == null ? null : o.toString().getBytes();
+ }
+
+ }
+
+ public void setJMSCorrelationIDAsBytes(byte[] correlationId) throws JMSException
+ {
+ if(correlationId == null)
+ {
+ setCorrelationId(null);
+ }
+ else
+ {
+ byte[] dup = new byte[correlationId.length];
+ System.arraycopy(correlationId,0,dup,0,correlationId.length);
+ setCorrelationId(new Binary(dup));
+ }
+ }
+
+ public void setJMSCorrelationID(String s) throws JMSException
+ {
+ getProperties().setCorrelationId(s);
+ }
+
+ public String getJMSCorrelationID() throws JMSException
+ {
+ Object o = getProperties().getCorrelationId();
+ if(o instanceof Binary)
+ {
+ Binary id = (Binary) o;
+ return new String(id.getArray(), id.getArrayOffset(), id.getLength());
+ }
+ else
+ {
+ return o == null ? null : o.toString();
+ }
+ }
+
+ public DestinationImpl getJMSReplyTo() throws JMSException
+ {
+ return DestinationImpl.valueOf(getReplyTo());
+ }
+
+ public void setJMSReplyTo(Destination destination) throws NonAMQPDestinationException
+ {
+ if(destination == null)
+ {
+ setReplyTo(null);
+ }
+ else if (destination instanceof org.apache.qpid.amqp_1_0.jms.Destination)
+ {
+ setReplyTo(((org.apache.qpid.amqp_1_0.jms.Destination)destination).getAddress());
+ }
+ else
+ {
+ throw new NonAMQPDestinationException(destination);
+ }
+ }
+
+ public DestinationImpl getJMSDestination() throws JMSException
+ {
+ return _isFromQueue ? QueueImpl.valueOf(getTo())
+ : _isFromTopic ? TopicImpl.valueOf(getTo())
+ : DestinationImpl.valueOf(getTo());
+ }
+
+ public void setJMSDestination(Destination destination) throws NonAMQPDestinationException
+ {
+ if(destination == null)
+ {
+ setTo(null);
+ }
+ else if (destination instanceof org.apache.qpid.amqp_1_0.jms.Destination)
+ {
+ setTo(((org.apache.qpid.amqp_1_0.jms.Destination)destination).getAddress());
+ }
+ else
+ {
+ throw new NonAMQPDestinationException(destination);
+ }
+ }
+
+ public int getJMSDeliveryMode() throws JMSException
+ {
+ if(Boolean.FALSE.equals(getDurable()))
+ {
+ return DeliveryMode.NON_PERSISTENT;
+ }
+ else
+ {
+ return DeliveryMode.PERSISTENT;
+ }
+ }
+
+ public void setJMSDeliveryMode(int deliveryMode) throws JMSException
+ {
+ switch(deliveryMode)
+ {
+ case DeliveryMode.NON_PERSISTENT:
+ setDurable(false);
+ break;
+ case DeliveryMode.PERSISTENT:
+ setDurable(true);
+ break;
+ default:
+ //TODO
+ }
+ }
+
+ public boolean getJMSRedelivered()
+ {
+ UnsignedInteger failures = getDeliveryFailures();
+ return failures != null && (failures.intValue() != 0);
+ }
+
+ public void setJMSRedelivered(boolean redelivered)
+ {
+ UnsignedInteger failures = getDeliveryFailures();
+ if(redelivered)
+ {
+ if(failures == null || UnsignedInteger.ZERO.equals(failures))
+ {
+ setDeliveryFailures(UnsignedInteger.ONE);
+ }
+ }
+ else
+ {
+ setDeliveryFailures(null);
+ }
+ }
+
+ public String getJMSType() throws JMSException
+ {
+ Map messageAttrs = _messageAnnotations == null ? null : _messageAnnotations.getValue();
+ final Object attrValue = messageAttrs == null ? null : messageAttrs.get(JMS_TYPE);
+
+ return attrValue instanceof String ? attrValue.toString() : null;
+ }
+
+ public void setJMSType(String s) throws JMSException
+ {
+ Map messageAttrs = _messageAnnotations == null ? null : _messageAnnotations.getValue();
+ if(messageAttrs == null)
+ {
+ messageAttrs = new HashMap();
+ _messageAnnotations = new MessageAnnotations(messageAttrs);
+ }
+
+ messageAttrs.put(JMS_TYPE, s);
+ }
+
+ public long getJMSExpiration() throws JMSException
+ {
+ final UnsignedInteger ttl = getTtl();
+ return ttl == null || ttl.longValue() == 0 ? 0 : getJMSTimestamp() + ttl.longValue();
+ }
+
+ public void setJMSExpiration(long l) throws JMSException
+ {
+ _expiration = l;
+ if(l == 0)
+ {
+ setTtl(UnsignedInteger.ZERO);
+ }
+ else
+ {
+ if(getTransmitTime() == null)
+ {
+ setTransmitTime(new Date());
+ }
+ setTtl(UnsignedInteger.valueOf(l - getTransmitTime().getTime()));
+ }
+ }
+
+ public int getJMSPriority() throws JMSException
+ {
+ UnsignedByte priority = getPriority();
+ return priority == null ? DEFAULT_PRIORITY : priority.intValue();
+ }
+
+ public void setJMSPriority(int i) throws InvalidJMSPriorityException
+ {
+ if(i >= 0 && i <= 255)
+ {
+ setPriority(UnsignedByte.valueOf((byte)i));
+ }
+ else
+ {
+ throw new InvalidJMSPriorityException(i);
+ }
+ }
+
+ public void clearProperties() throws JMSException
+ {
+ _applicationProperties.getValue().clear();
+ }
+
+ public boolean propertyExists(final String s) throws JMSException
+ {
+ return propertyExists((Object) s);
+ }
+
+ public boolean getBooleanProperty(final String s) throws JMSException
+ {
+ return getBooleanProperty((Object) s);
+ }
+
+ public byte getByteProperty(final String s) throws JMSException
+ {
+ return getByteProperty((Object)s);
+ }
+
+ public short getShortProperty(final String s) throws JMSException
+ {
+ return getShortProperty((Object)s);
+ }
+
+ public int getIntProperty(final String s) throws JMSException
+ {
+ return getIntProperty((Object)s);
+ }
+
+ public long getLongProperty(final String s) throws JMSException
+ {
+ return getLongProperty((Object)s);
+ }
+
+ public float getFloatProperty(final String s) throws JMSException
+ {
+ return getFloatProperty((Object)s);
+ }
+
+ public double getDoubleProperty(final String s) throws JMSException
+ {
+ return getDoubleProperty((Object)s);
+ }
+
+ public String getStringProperty(final String s) throws JMSException
+ {
+ return getStringProperty((Object)s);
+ }
+
+ public Object getObjectProperty(final String s) throws JMSException
+ {
+ return getObjectProperty((Object)s);
+ }
+
+ public boolean propertyExists(Object name) throws JMSException
+ {
+ return _applicationProperties.getValue().containsKey(name);
+ }
+
+ public boolean getBooleanProperty(Object name) throws JMSException
+ {
+
+ Object value = getProperty(name);
+
+ if (value instanceof Boolean)
+ {
+ return ((Boolean) value).booleanValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Boolean.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to boolean.");
+ }
+ }
+
+ public byte getByteProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Byte)
+ {
+ return ((Byte) value).byteValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Byte.valueOf((String) value).byteValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to byte.");
+ }
+ }
+
+ public short getShortProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Short)
+ {
+ return ((Short) value).shortValue();
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte) value).shortValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Short.valueOf((String) value).shortValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to short.");
+ }
+ }
+
+ private Object getProperty(final Object name)
+ {
+ return _applicationProperties.getValue().get(name);
+ }
+
+ public int getIntProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Integer)
+ {
+ return ((Integer) value).intValue();
+ }
+ else if (value instanceof Short)
+ {
+ return ((Short) value).intValue();
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte) value).intValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Integer.valueOf((String) value).intValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to int.");
+ }
+ }
+
+ public long getLongProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Long)
+ {
+ return ((Long) value).longValue();
+ }
+ else if (value instanceof Integer)
+ {
+ return ((Integer) value).longValue();
+ }
+
+ if (value instanceof Short)
+ {
+ return ((Short) value).longValue();
+ }
+
+ if (value instanceof Byte)
+ {
+ return ((Byte) value).longValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Long.valueOf((String) value).longValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to long.");
+ }
+ }
+
+ public float getFloatProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Float)
+ {
+ return ((Float) value).floatValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Float.valueOf((String) value).floatValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to float.");
+ }
+ }
+
+ public double getDoubleProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Double)
+ {
+ return ((Double) value).doubleValue();
+ }
+ else if (value instanceof Float)
+ {
+ return ((Float) value).doubleValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Double.valueOf((String) value).doubleValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to double.");
+ }
+ }
+
+ public String getStringProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if ((value instanceof String) || (value == null))
+ {
+ return (String) value;
+ }
+ else if (value instanceof byte[])
+ {
+ throw new MessageFormatException("Property " + name + " of type byte[] " + "cannot be converted to String.");
+ }
+ else
+ {
+ return value.toString();
+ }
+ }
+
+ public Object getObjectProperty(Object name) throws JMSException
+ {
+ return getProperty(name);
+ }
+
+ public List<Object> getListProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+ if(value instanceof List || value == null)
+ {
+ return (List<Object>)value;
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to List.");
+ }
+ }
+
+ public Map<Object, Object> getMapProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+ if(value instanceof Map || value == null)
+ {
+ return (Map<Object,Object>)value;
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to Map.");
+ }
+ }
+
+ public UnsignedByte getUnsignedByteProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof UnsignedByte)
+ {
+ return (UnsignedByte) value;
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return UnsignedByte.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to UnsignedByte.");
+ }
+ }
+
+ public UnsignedShort getUnsignedShortProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof UnsignedShort)
+ {
+ return (UnsignedShort) value;
+ }
+ else if (value instanceof UnsignedByte)
+ {
+ return UnsignedShort.valueOf(((UnsignedByte)value).shortValue());
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return UnsignedShort.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to UnsignedShort.");
+ }
+ }
+
+ public UnsignedInteger getUnsignedIntProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof UnsignedInteger)
+ {
+ return (UnsignedInteger) value;
+ }
+ else if (value instanceof UnsignedByte)
+ {
+ return UnsignedInteger.valueOf(((UnsignedByte)value).intValue());
+ }
+ else if (value instanceof UnsignedShort)
+ {
+ return UnsignedInteger.valueOf(((UnsignedShort)value).intValue());
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return UnsignedInteger.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to UnsignedShort.");
+ }
+ }
+
+ public UnsignedLong getUnsignedLongProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof UnsignedLong)
+ {
+ return (UnsignedLong) value;
+ }
+ else if (value instanceof UnsignedByte)
+ {
+ return UnsignedLong.valueOf(((UnsignedByte)value).longValue());
+ }
+ else if (value instanceof UnsignedShort)
+ {
+ return UnsignedLong.valueOf(((UnsignedShort)value).longValue());
+ }
+ else if (value instanceof UnsignedInteger)
+ {
+ return UnsignedLong.valueOf(((UnsignedInteger)value).longValue());
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return UnsignedLong.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to UnsignedShort.");
+ }
+ }
+
+ public Enumeration getPropertyNames() throws JMSException
+ {
+ final Collection<String> names = new ArrayList<String>();
+ for(Object key : _applicationProperties.getValue().keySet())
+ {
+ if(key instanceof String)
+ {
+ names.add((String)key);
+ }
+ }
+ return Collections.enumeration(names);
+ }
+
+ public void setBooleanProperty(final String s, final boolean b) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+ setBooleanProperty((Object)s, b);
+ }
+
+ protected void checkPropertyName(CharSequence propertyName)
+ {
+ if (propertyName == null)
+ {
+ throw new IllegalArgumentException("Property name must not be null");
+ }
+ else if (propertyName.length() == 0)
+ {
+ throw new IllegalArgumentException("Property name must not be the empty string");
+ }
+
+ checkIdentiferFormat(propertyName);
+ }
+
+ protected void checkIdentiferFormat(CharSequence propertyName)
+ {
+// JMS requirements 3.5.1 Property Names
+// Identifiers:
+// - An identifier is an unlimited-length character sequence that must begin
+// with a Java identifier start character; all following characters must be Java
+// identifier part characters. An identifier start character is any character for
+// which the method Character.isJavaIdentifierStart returns true. This includes
+// '_' and '$'. An identifier part character is any character for which the
+// method Character.isJavaIdentifierPart returns true.
+// - Identifiers cannot be the names NULL, TRUE, or FALSE.
+// Identifiers cannot be NOT, AND, OR, BETWEEN, LIKE, IN, IS, or
+// ESCAPE.
+// Identifiers are either header field references or property references. The
+// type of a property value in a message selector corresponds to the type
+// used to set the property. If a property that does not exist in a message is
+// referenced, its value is NULL. The semantics of evaluating NULL values
+// in a selector are described in Section 3.8.1.2, Null Values.
+// The conversions that apply to the get methods for properties do not
+// apply when a property is used in a message selector expression. For
+// example, suppose you set a property as a string value, as in the
+// following:
+// myMessage.setStringProperty("NumberOfOrders", "2")
+// The following expression in a message selector would evaluate to false,
+// because a string cannot be used in an arithmetic expression:
+// "NumberOfOrders > 1"
+// Identifiers are case sensitive.
+// Message header field references are restricted to JMSDeliveryMode,
+// JMSPriority, JMSMessageID, JMSTimestamp, JMSCorrelationID, and
+// JMSType. JMSMessageID, JMSCorrelationID, and JMSType values may be
+// null and if so are treated as a NULL value.
+
+ // JMS start character
+ if (!(Character.isJavaIdentifierStart(propertyName.charAt(0))))
+ {
+ throw new IllegalArgumentException("Identifier '" + propertyName + "' does not start with a valid JMS identifier start character");
+ }
+
+ // JMS part character
+ int length = propertyName.length();
+ for (int c = 1; c < length; c++)
+ {
+ if (!(Character.isJavaIdentifierPart(propertyName.charAt(c))))
+ {
+ throw new IllegalArgumentException("Identifier '" + propertyName + "' contains an invalid JMS identifier character");
+ }
+ }
+
+ // JMS invalid names
+ if ((propertyName.equals("NULL")
+ || propertyName.equals("TRUE")
+ || propertyName.equals("FALSE")
+ || propertyName.equals("NOT")
+ || propertyName.equals("AND")
+ || propertyName.equals("OR")
+ || propertyName.equals("BETWEEN")
+ || propertyName.equals("LIKE")
+ || propertyName.equals("IN")
+ || propertyName.equals("IS")
+ || propertyName.equals("ESCAPE")))
+ {
+ throw new IllegalArgumentException("Identifier '" + propertyName + "' is not allowed in JMS");
+ }
+
+ }
+
+ public void setByteProperty(final String s, final byte b) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setByteProperty((Object)s, b);
+ }
+
+ public void setShortProperty(final String s, final short i) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setShortProperty((Object)s, i);
+ }
+
+ public void setIntProperty(final String s, final int i) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setIntProperty((Object)s, i);
+ }
+
+ public void setLongProperty(final String s, final long l) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setLongProperty((Object)s, l);
+ }
+
+ public void setFloatProperty(final String s, final float v) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setFloatProperty((Object) s, v);
+ }
+
+ public void setDoubleProperty(final String s, final double v) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setDoubleProperty((Object)s, v);
+ }
+
+ public void setStringProperty(final String s, final String s1) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setStringProperty((Object)s, s1);
+ }
+
+ public void setObjectProperty(final String s, final Object o) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ if(o != null && (_supportedClasses.contains(o.getClass())))
+ {
+ setObjectProperty((Object)s, o);
+ }
+ else
+ {
+ throw new MessageFormatException("Cannot call setObjectProperty with a value of " + ((o == null) ? "null" : " class "+o.getClass().getName()) + ".");
+ }
+ }
+
+ public void setBooleanProperty(Object name, boolean b) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, b);
+ }
+
+ public void setByteProperty(Object name, byte b) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, b);
+ }
+
+ public void setShortProperty(Object name, short i) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, i);
+ }
+
+ public void setIntProperty(Object name, int i) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, i);
+ }
+
+ public void setLongProperty(Object name, long l) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, l);
+ }
+
+ public void setFloatProperty(Object name, float v) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, v);
+ }
+
+ public void setDoubleProperty(Object name, double v) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, v);
+ }
+
+ public void setStringProperty(Object name, String value) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, value);
+ }
+
+ public void setObjectProperty(Object name, Object value) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, value);
+ }
+
+ public void setListProperty(final Object name, final List<Object> list) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, list);
+ }
+
+ public void setMapProperty(final Object name, final Map<Object, Object> map) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, map);
+ }
+
+ public void setUnsignedByteProperty(final Object name, final UnsignedByte b) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, b);
+ }
+
+ public void setUnsignedShortProperty(final Object name, final UnsignedShort s) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, s);
+ }
+
+ public void setUnsignedIntProperty(final Object name, final UnsignedInteger i) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, i);
+ }
+
+ public void setUnsignedLongProperty(final Object name, final UnsignedLong l) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, l);
+ }
+
+ public UnsignedInteger getDeliveryFailures()
+ {
+ return _header.getDeliveryCount();
+ }
+
+ public void setDeliveryFailures(UnsignedInteger failures)
+ {
+ _header.setDeliveryCount(failures);
+ }
+
+ public MessageAttributes getHeaderMessageAttrs()
+ {
+ // TODO
+ return null ; // _header.getMessageAttrs();
+ }
+
+ public void setHeaderMessageAttrs(final MessageAttributes messageAttrs)
+ {
+ // TODO
+ }
+
+ public MessageAttributes getHeaderDeliveryAttrs()
+ {
+ // TODO
+ return null ; //_header.getDeliveryAttrs();
+ }
+
+ public void setHeaderDeliveryAttrs(final MessageAttributes deliveryAttrs)
+ {
+ //TODO
+ }
+
+ public Boolean getDurable()
+ {
+ return _header.getDurable();
+ }
+
+ public void setDurable(final Boolean durable)
+ {
+ _header.setDurable(durable);
+ }
+
+ public UnsignedByte getPriority()
+ {
+ return _header.getPriority();
+ }
+
+ public void setPriority(final UnsignedByte priority)
+ {
+ _header.setPriority(priority);
+ }
+
+ public Date getTransmitTime()
+ {
+ return _properties.getCreationTime();
+ }
+
+ public void setTransmitTime(final Date transmitTime)
+ {
+ _properties.setCreationTime(transmitTime);
+ }
+
+ public UnsignedInteger getTtl()
+ {
+ return _header.getTtl();
+ }
+
+ public void setTtl(final UnsignedInteger ttl)
+ {
+ _header.setTtl(ttl);
+ }
+
+ public UnsignedInteger getFormerAcquirers()
+ {
+ return _header.getDeliveryCount();
+ }
+
+ public void setFormerAcquirers(final UnsignedInteger formerAcquirers)
+ {
+ _header.setDeliveryCount(formerAcquirers);
+ }
+
+ public Object getMessageId()
+ {
+ return _properties.getMessageId();
+ }
+
+ public void setMessageId(final Object messageId)
+ {
+ _properties.setMessageId(messageId);
+ }
+
+ public Binary getUserId()
+ {
+ return _properties.getUserId();
+ }
+
+ public void setUserId(final Binary userId)
+ {
+ _properties.setUserId(userId);
+ }
+
+ public String getTo()
+ {
+ return _properties.getTo();
+ }
+
+ public void setTo(final String to)
+ {
+ _properties.setTo(to);
+ }
+
+ public String getSubject()
+ {
+ return _properties.getSubject();
+ }
+
+ public void setSubject(final String subject)
+ {
+ _properties.setSubject(subject);
+ }
+
+ public String getReplyTo()
+ {
+ return _properties.getReplyTo();
+ }
+
+ public void setReplyTo(final String replyTo)
+ {
+ _properties.setReplyTo(replyTo);
+ }
+
+ public Object getCorrelationId()
+ {
+ return _properties.getCorrelationId();
+ }
+
+ public void setCorrelationId(final Binary correlationId)
+ {
+ _properties.setCorrelationId(correlationId);
+ }
+
+ public Symbol getContentType()
+ {
+ return _properties.getContentType();
+ }
+
+ public void setContentType(final Symbol contentType)
+ {
+ _properties.setContentType(contentType);
+ }
+
+ public void acknowledge() throws JMSException
+ {
+ _sessionImpl.acknowledgeAll();
+ }
+
+ public void clearBody() throws JMSException
+ {
+ _readOnly = false;
+ }
+
+ protected boolean isReadOnly()
+ {
+ return _readOnly;
+ }
+
+ protected void checkReadable() throws MessageNotReadableException
+ {
+ if (!isReadOnly())
+ {
+ throw new MessageNotReadableException("You need to call reset() to make the message readable");
+ }
+ }
+
+ protected void checkWritable() throws MessageNotWriteableException
+ {
+ if (isReadOnly())
+ {
+ throw new MessageNotWriteableException("You need to call clearBody() to make the message writable");
+ }
+ }
+
+ public void setReadOnly()
+ {
+ _readOnly = true;
+ }
+
+ private static class InvalidJMSMEssageIdException extends JMSException
+ {
+ public InvalidJMSMEssageIdException(String messageId)
+ {
+ super("Invalid JMSMessageID: '" + messageId + "', JMSMessageID MUST start with 'ID:'");
+ }
+ }
+
+ private class NonAMQPDestinationException extends JMSException
+ {
+ public NonAMQPDestinationException(Destination destination)
+ {
+ super("Destinations not a valid AMQP Destination, class of type: '"
+ + destination.getClass().getName()
+ + "', require '"
+ + org.apache.qpid.amqp_1_0.jms.Destination.class.getName() + "'.");
+ }
+ }
+
+ private class InvalidJMSPriorityException extends JMSException
+ {
+ public InvalidJMSPriorityException(int priority)
+ {
+ super("The provided priority: " + priority + " is not valid in AMQP, valid values are from 0 to 255");
+ }
+ }
+
+ Header getHeader()
+ {
+ return _header;
+ }
+
+ Properties getProperties()
+ {
+ return _properties;
+ }
+
+
+ Footer getFooter()
+ {
+ return _footer;
+ }
+
+ MessageAnnotations getMessageAnnotations()
+ {
+ return _messageAnnotations;
+ }
+
+ public ApplicationProperties getApplicationProperties()
+ {
+ return _applicationProperties;
+ }
+
+ public void reset() throws JMSException
+ {
+ _readOnly = true;
+ }
+
+ void setFromQueue(final boolean fromQueue)
+ {
+ _isFromQueue = fromQueue;
+ }
+
+ void setFromTopic(final boolean fromTopic)
+ {
+ _isFromTopic = fromTopic;
+ }
+
+ abstract Collection<Section> getSections();
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageProducerImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageProducerImpl.java
new file mode 100644
index 0000000000..5bb8845eb7
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageProducerImpl.java
@@ -0,0 +1,362 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.Sender;
+import org.apache.qpid.amqp_1_0.jms.MessageProducer;
+import org.apache.qpid.amqp_1_0.jms.Queue;
+import org.apache.qpid.amqp_1_0.jms.QueueSender;
+import org.apache.qpid.amqp_1_0.jms.TemporaryDestination;
+import org.apache.qpid.amqp_1_0.jms.TopicPublisher;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+
+import javax.jms.*;
+import javax.jms.IllegalStateException;
+import java.util.UUID;
+
+public class MessageProducerImpl implements MessageProducer, QueueSender, TopicPublisher
+{
+ private boolean _disableMessageID;
+ private boolean _disableMessageTimestamp;
+ private int _deliveryMode = Message.DEFAULT_DELIVERY_MODE;
+ private int _priority = Message.DEFAULT_PRIORITY;
+ private long _timeToLive;
+
+ private DestinationImpl _destination;
+ private SessionImpl _session;
+ private Sender _sender;
+ private boolean _closed;
+
+ protected MessageProducerImpl(final Destination destination,
+ final SessionImpl session) throws JMSException
+ {
+ if(destination instanceof DestinationImpl)
+ {
+ _destination = (DestinationImpl) destination;
+ }
+ else if(destination != null)
+ {
+ throw new InvalidDestinationException("Invalid Destination Class" + destination.getClass().getName());
+ }
+ _session = session;
+
+ if(_destination != null)
+ {
+ try
+ {
+ _sender = _session.getClientSession().createSender(_destination.getAddress());
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ // TODO - refine exception
+ JMSException jmsEx = new JMSException(e.getMessage());
+ jmsEx.initCause(e);
+ jmsEx.setLinkedException(e);
+ throw jmsEx;
+ }
+ }
+ }
+
+ private void checkClosed() throws IllegalStateException
+ {
+ if(_closed)
+ {
+ throw new javax.jms.IllegalStateException("Producer closed");
+ }
+ }
+
+ public boolean getDisableMessageID() throws IllegalStateException
+ {
+ checkClosed();
+ return _disableMessageID;
+ }
+
+ public void setDisableMessageID(final boolean disableMessageID) throws IllegalStateException
+ {
+ checkClosed();
+ _disableMessageID = disableMessageID;
+ }
+
+ public boolean getDisableMessageTimestamp() throws IllegalStateException
+ {
+ checkClosed();
+ return _disableMessageTimestamp;
+ }
+
+ public void setDisableMessageTimestamp(final boolean disableMessageTimestamp) throws IllegalStateException
+ {
+ checkClosed();
+ _disableMessageTimestamp = disableMessageTimestamp;
+ }
+
+ public int getDeliveryMode() throws IllegalStateException
+ {
+ checkClosed();
+ return _deliveryMode;
+ }
+
+ public void setDeliveryMode(final int deliveryMode) throws IllegalStateException
+ {
+ checkClosed();
+ _deliveryMode = deliveryMode;
+ }
+
+ public int getPriority() throws IllegalStateException
+ {
+ checkClosed();
+ return _priority;
+ }
+
+ public void setPriority(final int priority) throws IllegalStateException
+ {
+ checkClosed();
+ _priority = priority;
+ }
+
+ public long getTimeToLive() throws IllegalStateException
+ {
+ checkClosed();
+ return _timeToLive;
+ }
+
+ public void setTimeToLive(final long timeToLive) throws IllegalStateException
+ {
+ checkClosed();
+ _timeToLive = timeToLive;
+ }
+
+ public DestinationImpl getDestination() throws JMSException
+ {
+ checkClosed();
+ return _destination;
+ }
+
+ public void close() throws JMSException
+ {
+ try
+ {
+ if(!_closed)
+ {
+ _closed = true;
+ if(_sender != null)
+ {
+ _sender.close();
+ }
+ }
+
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ final JMSException jmsException = new JMSException("error closing");
+ jmsException.setLinkedException(e);
+ throw jmsException;
+ }
+ }
+
+ public void send(final Message message) throws JMSException
+ {
+ send(message, getDeliveryMode(), getPriority(), getTimeToLive());
+ }
+
+ public void send(final Message message, final int deliveryMode, final int priority, final long ttl) throws JMSException
+ {
+ if(_sender == null)
+ {
+ throw new UnsupportedOperationException("No Destination provided");
+ }
+ if(_destination instanceof TemporaryDestination && ((TemporaryDestination)_destination).isDeleted())
+ {
+ throw new IllegalStateException("Destination is deleted");
+ }
+
+
+ //TODO
+ MessageImpl msg;
+ if(message instanceof org.apache.qpid.amqp_1_0.jms.Message)
+ {
+ msg = (MessageImpl) message;
+ }
+ else
+ {
+ msg = _session.convertMessage(message);
+ }
+
+
+
+ msg.setJMSDeliveryMode(deliveryMode);
+ msg.setJMSPriority(priority);
+
+ msg.setJMSDestination(_destination);
+
+ long timestamp = 0l;
+
+ if(!getDisableMessageTimestamp() || ttl != 0)
+ {
+ timestamp = System.currentTimeMillis();
+ msg.setJMSTimestamp(timestamp);
+
+ }
+ if(ttl != 0)
+ {
+ msg.setTtl(UnsignedInteger.valueOf(ttl));
+ }
+ else
+ {
+ msg.setTtl(null);
+ }
+
+ if(!getDisableMessageID() && msg.getMessageId() == null)
+ {
+ final Binary messageId = generateMessageId();
+ msg.setMessageId(messageId);
+
+ }
+
+ if(message != msg)
+ {
+ message.setJMSTimestamp(msg.getJMSTimestamp());
+ message.setJMSMessageID(msg.getJMSMessageID());
+ message.setJMSDeliveryMode(msg.getJMSDeliveryMode());
+ message.setJMSPriority(msg.getJMSPriority());
+ message.setJMSExpiration(msg.getJMSExpiration());
+ }
+
+
+ final org.apache.qpid.amqp_1_0.client.Message clientMessage = new org.apache.qpid.amqp_1_0.client.Message(msg.getSections());
+
+ _sender.send(clientMessage, _session.getTxn());
+
+ if(getDestination() != null)
+ {
+ message.setJMSDestination(getDestination());
+ }
+ }
+
+ public void send(final javax.jms.Queue queue, final Message message) throws JMSException
+ {
+ send((Destination)queue, message);
+ }
+
+ public void send(final javax.jms.Queue queue, final Message message, final int deliveryMode, final int priority, final long ttl)
+ throws JMSException
+ {
+ send((Destination)queue, message, deliveryMode, priority, ttl);
+ }
+
+ private Binary generateMessageId()
+ {
+ UUID uuid = UUID.randomUUID();
+ return new Binary(uuid.toString().getBytes());
+ }
+
+ public void send(final Destination destination, final Message message) throws JMSException
+ {
+ send(destination, message, getDeliveryMode(), getPriority(), getTimeToLive());
+ }
+
+ public void send(final Destination destination, final Message message, final int deliveryMode, final int priority, final long ttl)
+ throws JMSException
+ {
+
+ checkClosed();
+ if(destination == null)
+ {
+ send(message, deliveryMode, priority, ttl);
+ }
+ else
+ {
+ if(_destination != null)
+ {
+ throw new UnsupportedOperationException("Cannot use explicit destination pon non-anonymous producer");
+ }
+ else if(!(destination instanceof DestinationImpl))
+ {
+ throw new InvalidDestinationException("Invalid Destination Class" + destination.getClass().getName());
+ }
+ else if(destination instanceof TemporaryDestination && ((TemporaryDestination)destination).isDeleted())
+ {
+ throw new IllegalStateException("Destination has been deleted");
+ }
+ try
+ {
+ _destination = (DestinationImpl) destination;
+ _sender = _session.getClientSession().createSender(_destination.getAddress());
+
+ send(message, deliveryMode, priority, ttl);
+
+ _sender.close();
+
+
+
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ // TODO - refine exception
+ JMSException jmsEx = new JMSException(e.getMessage());
+ jmsEx.initCause(e);
+ jmsEx.setLinkedException(e);
+ throw jmsEx;
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ JMSException jmsEx = new JMSException(e.getMessage());
+ jmsEx.initCause(e);
+ jmsEx.setLinkedException(e);
+ throw jmsEx;
+ }
+ finally
+ {
+ _sender = null;
+ _destination = null;
+ }
+ }
+ }
+
+ public QueueImpl getQueue() throws JMSException
+ {
+ return (QueueImpl) getDestination();
+ }
+
+ public TopicImpl getTopic() throws JMSException
+ {
+ return (TopicImpl) getDestination();
+ }
+
+ public void publish(final Message message) throws JMSException
+ {
+ send(message);
+ }
+
+ public void publish(final Message message, final int deliveryMode, final int priority, final long ttl) throws JMSException
+ {
+ send(message, deliveryMode, priority, ttl);
+ }
+
+ public void publish(final Topic topic, final Message message) throws JMSException
+ {
+ send(topic, message);
+ }
+
+ public void publish(final Topic topic, final Message message, final int deliveryMode, final int priority, final long ttl)
+ throws JMSException
+ {
+ send(topic, message, deliveryMode, priority, ttl);
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ObjectMessageImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ObjectMessageImpl.java
new file mode 100644
index 0000000000..2a52b0557a
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ObjectMessageImpl.java
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.ObjectMessage;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import javax.jms.JMSException;
+import javax.jms.MessageNotWriteableException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.*;
+
+public class ObjectMessageImpl extends MessageImpl implements ObjectMessage
+{
+ static final Symbol CONTENT_TYPE = Symbol.valueOf("application/x-java-serialized-object");
+
+ private Data _objectData;
+
+ protected ObjectMessageImpl(Header header,
+ MessageAnnotations messageAnnotations,
+ Properties properties,
+ ApplicationProperties appProperties,
+ Data dataSection,
+ Footer footer,
+ SessionImpl session)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, session);
+ getProperties().setContentType(CONTENT_TYPE);
+ Serializable serializable = null;
+ _objectData = dataSection;
+
+ }
+
+ protected ObjectMessageImpl(final SessionImpl session)
+ {
+ super(new Header(), new MessageAnnotations(new HashMap()),
+ new Properties(), new ApplicationProperties(new HashMap()), new Footer(Collections.EMPTY_MAP),
+ session);
+ getProperties().setContentType(CONTENT_TYPE);
+ }
+
+ public void setObject(final Serializable serializable) throws MessageNotWriteableException
+ {
+ checkWritable();
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ try
+ {
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+ oos.writeObject(serializable);
+ oos.flush();
+ oos.close();
+
+ _objectData = new Data(new Binary(baos.toByteArray()));
+
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+ }
+
+ public Serializable getObject() throws JMSException
+ {
+
+ if(_objectData == null)
+ {
+ return null;
+ }
+
+ Binary data = _objectData.getValue();
+
+ try
+ {
+ ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data.getArray(), data.getArrayOffset(), data.getLength()));
+ return (Serializable) ois.readObject();
+ }
+ catch (IOException e)
+ {
+ JMSException jmsException = new JMSException(e.getMessage());
+ jmsException.setLinkedException(e);
+ throw jmsException;
+ }
+ catch (ClassNotFoundException e)
+ {
+
+ JMSException jmsException = new JMSException(e.getMessage());
+ jmsException.setLinkedException(e);
+ throw jmsException;
+ }
+
+ }
+
+ @Override
+ public void clearBody() throws JMSException
+ {
+ super.clearBody();
+ _objectData = null;
+ }
+
+ @Override Collection<Section> getSections()
+ {
+ List<Section> sections = new ArrayList<Section>();
+ sections.add(getHeader());
+ if(getMessageAnnotations() != null && getMessageAnnotations().getValue() != null && !getMessageAnnotations().getValue().isEmpty())
+ {
+ sections.add(getMessageAnnotations());
+ }
+ sections.add(getProperties());
+ sections.add(getApplicationProperties());
+
+ sections.add(_objectData);
+
+ sections.add(getFooter());
+ return sections;
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueBrowserImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueBrowserImpl.java
new file mode 100644
index 0000000000..527e82eaed
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueBrowserImpl.java
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Map;
+import javax.jms.InvalidSelectorException;
+import javax.jms.JMSException;
+import org.apache.qpid.amqp_1_0.client.AcknowledgeMode;
+import org.apache.qpid.amqp_1_0.client.Message;
+import org.apache.qpid.amqp_1_0.client.Receiver;
+import org.apache.qpid.amqp_1_0.jms.QueueBrowser;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.messaging.Filter;
+import org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter;
+import org.apache.qpid.amqp_1_0.type.messaging.StdDistMode;
+import org.apache.qpid.amqp_1_0.type.transport.AmqpError;
+
+public class QueueBrowserImpl implements QueueBrowser
+{
+ private static final String JMS_SELECTOR = "jms-selector";
+ private QueueImpl _queue;
+ private String _selector;
+ private Receiver _receiver;
+ private Message _nextElement;
+ private MessageEnumeration _enumeration;
+
+ QueueBrowserImpl(final QueueImpl queue, final String selector, SessionImpl session) throws JMSException
+ {
+ _queue = queue;
+ _selector = selector;
+
+
+ Map<Symbol, Filter> filters;
+ if(selector == null || selector.trim().equals(""))
+ {
+ filters = null;
+ }
+ else
+ {
+ filters = Collections.singletonMap(Symbol.valueOf(JMS_SELECTOR),(Filter) new JMSSelectorFilter(_selector));
+ }
+
+
+ try
+ {
+ _receiver = session.getClientSession().createReceiver(queue.getAddress(),
+ StdDistMode.COPY,
+ AcknowledgeMode.AMO,null,
+ false,
+ filters, null);
+ _nextElement = _receiver.receive(0L);
+ _enumeration = new MessageEnumeration();
+ }
+ catch(AmqpErrorException e)
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = e.getError();
+ if(AmqpError.INVALID_FIELD.equals(error.getCondition()))
+ {
+ throw new InvalidSelectorException(e.getMessage());
+ }
+ else
+ {
+ throw new JMSException(e.getMessage(), error.getCondition().getValue().toString());
+ }
+
+ }
+ }
+
+ public QueueImpl getQueue()
+ {
+ return _queue;
+ }
+
+ public String getMessageSelector()
+ {
+ return _selector;
+ }
+
+ public Enumeration getEnumeration() throws JMSException
+ {
+ if(_enumeration == null)
+ {
+ throw new IllegalStateException("Browser has been closed");
+ }
+ return _enumeration;
+ }
+
+ public void close() throws JMSException
+ {
+ _receiver.close();
+ _enumeration = null;
+ }
+
+ private final class MessageEnumeration implements Enumeration<Message>
+ {
+
+ @Override
+ public boolean hasMoreElements()
+ {
+ return _nextElement != null;
+ }
+
+ @Override
+ public Message nextElement()
+ {
+
+ Message message = _nextElement;
+ if(message == null)
+ {
+ message = _receiver.receive(0l);
+ }
+ if(message != null)
+ {
+ _nextElement = _receiver.receive(0l);
+ }
+ return message;
+ }
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueConnectionImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueConnectionImpl.java
new file mode 100644
index 0000000000..657efd80a3
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueConnectionImpl.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.QueueConnection;
+
+import javax.jms.ConnectionConsumer;
+import javax.jms.JMSException;
+import javax.jms.Queue;
+import javax.jms.ServerSessionPool;
+
+public class QueueConnectionImpl extends ConnectionImpl implements QueueConnection
+{
+ QueueConnectionImpl(String host, int port, String username, String password, String clientId)
+ throws JMSException
+ {
+ super(host, port, username, password, clientId);
+ }
+
+ public QueueSessionImpl createQueueSession(final boolean b, final int i) throws JMSException
+ {
+ return null; //TODO
+ }
+
+ public ConnectionConsumer createConnectionConsumer(final Queue queue,
+ final String s,
+ final ServerSessionPool serverSessionPool,
+ final int i) throws JMSException
+ {
+ return null; //TODO
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueImpl.java
new file mode 100644
index 0000000000..c88bd8268c
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueImpl.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.Queue;
+
+import java.util.WeakHashMap;
+
+public class QueueImpl extends DestinationImpl implements Queue
+{
+ private static final WeakHashMap<String, QueueImpl> QUEUE_CACHE =
+ new WeakHashMap<String, QueueImpl>();
+
+ public QueueImpl(String address)
+ {
+ super(address);
+ }
+
+ public String getQueueName()
+ {
+ return getAddress();
+ }
+
+ public static synchronized QueueImpl createQueue(final String address)
+ {
+ QueueImpl queue = QUEUE_CACHE.get(address);
+ if(queue == null)
+ {
+ queue = new QueueImpl(address);
+ QUEUE_CACHE.put(address, queue);
+ }
+ return queue;
+ }
+
+ public static QueueImpl valueOf(String address)
+ {
+ return address == null ? null : createQueue(address);
+ }
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueReceiverImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueReceiverImpl.java
new file mode 100644
index 0000000000..d46ed7183f
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueReceiverImpl.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.Receiver;
+import org.apache.qpid.amqp_1_0.jms.Queue;
+import org.apache.qpid.amqp_1_0.jms.QueueReceiver;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+import javax.jms.*;
+
+public class QueueReceiverImpl extends MessageConsumerImpl implements QueueReceiver
+{
+ QueueReceiverImpl(final QueueImpl destination,
+ final SessionImpl session,
+ final String selector,
+ final boolean noLocal)
+ throws JMSException
+ {
+ super(destination, session, selector, noLocal);
+ setQueueConsumer(true);
+ }
+
+ protected Receiver createClientReceiver() throws JMSException
+ {
+ try
+ {
+ return getSession().getClientSession().createMovingReceiver(getDestination().getAddress());
+ }
+ catch (AmqpErrorException e)
+ {
+ throw new JMSException(e.getMessage(), e.getError().getCondition().toString());
+ }
+ }
+
+ public Queue getQueue() throws JMSException
+ {
+ return (QueueImpl) getDestination();
+ }
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSenderImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSenderImpl.java
new file mode 100644
index 0000000000..b3db43801a
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSenderImpl.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.QueueSender;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+
+public class QueueSenderImpl extends MessageProducerImpl implements QueueSender
+{
+ protected QueueSenderImpl(final Destination destination, final SessionImpl session)
+ throws JMSException
+ {
+ super(destination, session);
+ }
+
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSessionImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSessionImpl.java
new file mode 100644
index 0000000000..e5ed8b3b3d
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSessionImpl.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.QueueSession;
+
+import javax.jms.JMSException;
+import javax.jms.Queue;
+
+public class QueueSessionImpl extends SessionImpl implements QueueSession
+{
+ protected QueueSessionImpl(final ConnectionImpl connection, final AcknowledgeMode acknowledgeMode)
+ {
+ super(connection, acknowledgeMode);
+ setQueueSession(true);
+ }
+
+ public QueueReceiverImpl createReceiver(final Queue queue) throws JMSException
+ {
+ return createReceiver(queue, null);
+ }
+
+ public QueueReceiverImpl createReceiver(final Queue queue, final String selector) throws JMSException
+ {
+ // TODO - assert queue is a queueimpl and throw relevant JMS Exception
+ final QueueReceiverImpl messageConsumer;
+ synchronized(getClientSession().getEndpoint().getLock())
+ {
+ messageConsumer = new QueueReceiverImpl((QueueImpl)queue, this, selector, false);
+ addConsumer(messageConsumer);
+ }
+ return messageConsumer;
+
+ }
+
+ public QueueSenderImpl createSender(final Queue queue) throws JMSException
+ {
+ return null; //TODO
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java
new file mode 100644
index 0000000000..e321245a0e
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java
@@ -0,0 +1,898 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.UUID;
+import javax.jms.BytesMessage;
+import javax.jms.Destination;
+import javax.jms.IllegalStateException;
+import javax.jms.InvalidDestinationException;
+import javax.jms.JMSException;
+import javax.jms.MapMessage;
+import javax.jms.MessageEOFException;
+import javax.jms.MessageListener;
+import javax.jms.ObjectMessage;
+import javax.jms.Queue;
+import javax.jms.StreamMessage;
+import javax.jms.TextMessage;
+import javax.jms.Topic;
+import org.apache.qpid.amqp_1_0.client.Connection;
+import org.apache.qpid.amqp_1_0.client.Message;
+import org.apache.qpid.amqp_1_0.client.Receiver;
+import org.apache.qpid.amqp_1_0.client.Sender;
+import org.apache.qpid.amqp_1_0.client.Transaction;
+import org.apache.qpid.amqp_1_0.jms.QueueReceiver;
+import org.apache.qpid.amqp_1_0.jms.QueueSender;
+import org.apache.qpid.amqp_1_0.jms.QueueSession;
+import org.apache.qpid.amqp_1_0.jms.Session;
+import org.apache.qpid.amqp_1_0.jms.TemporaryDestination;
+import org.apache.qpid.amqp_1_0.jms.TopicPublisher;
+import org.apache.qpid.amqp_1_0.jms.TopicSession;
+import org.apache.qpid.amqp_1_0.jms.TopicSubscriber;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+import org.apache.qpid.amqp_1_0.type.transport.AmqpError;
+
+public class SessionImpl implements Session, QueueSession, TopicSession
+{
+ private ConnectionImpl _connection;
+ private AcknowledgeMode _acknowledgeMode;
+ private org.apache.qpid.amqp_1_0.client.Session _session;
+ private MessageFactory _messageFactory;
+ private List<MessageConsumerImpl> _consumers = new ArrayList<MessageConsumerImpl>();
+ private List<MessageProducerImpl> _producers = new ArrayList<MessageProducerImpl>();
+
+ private MessageListener _messageListener;
+ private Dispatcher _dispatcher = new Dispatcher();
+ private Thread _dispatcherThread;
+
+ private boolean _closed;
+
+ private boolean _isQueueSession;
+ private boolean _isTopicSession;
+ private Transaction _txn;
+
+ protected SessionImpl(final ConnectionImpl connection, final AcknowledgeMode acknowledgeMode)
+ {
+ _connection = connection;
+ _acknowledgeMode = acknowledgeMode;
+ Connection clientConn = _connection.getClientConnection();
+ _session = clientConn.createSession();
+ if(_acknowledgeMode == AcknowledgeMode.SESSION_TRANSACTED)
+ {
+ _txn = _session.createSessionLocalTransaction();
+ }
+
+ _messageFactory = new MessageFactory(this);
+
+ _dispatcherThread = new Thread(_dispatcher);
+ _dispatcherThread.start();
+ }
+
+ public BytesMessageImpl createBytesMessage() throws IllegalStateException
+ {
+ checkClosed();
+ return new BytesMessageImpl(this);
+
+ }
+
+ public MapMessageImpl createMapMessage() throws JMSException
+ {
+ checkClosed();
+ return new MapMessageImpl(this);
+ }
+
+ public MessageImpl createMessage() throws IllegalStateException
+ {
+ return createAmqpMessage();
+ }
+
+ public ObjectMessageImpl createObjectMessage() throws JMSException
+ {
+ checkClosed();
+ return new ObjectMessageImpl(this);
+ }
+
+ public ObjectMessageImpl createObjectMessage(final Serializable serializable) throws JMSException
+ {
+ checkClosed();
+ ObjectMessageImpl msg = new ObjectMessageImpl(this);
+ msg.setObject(serializable);
+ return msg;
+ }
+
+ public StreamMessageImpl createStreamMessage() throws JMSException
+ {
+ checkClosed();
+ return new StreamMessageImpl(this);
+ }
+
+ public TextMessageImpl createTextMessage() throws JMSException
+ {
+ return createTextMessage("");
+ }
+
+ public TextMessageImpl createTextMessage(final String s) throws JMSException
+ {
+ checkClosed();
+ TextMessageImpl msg = new TextMessageImpl(this);
+ msg.setText(s);
+ return msg;
+ }
+
+ public AmqpMessageImpl createAmqpMessage() throws IllegalStateException
+ {
+ checkClosed();
+ return new AmqpMessageImpl(this);
+ }
+
+ public boolean getTransacted() throws JMSException
+ {
+ checkClosed();
+ return _acknowledgeMode == AcknowledgeMode.SESSION_TRANSACTED;
+ }
+
+ public int getAcknowledgeMode() throws IllegalStateException
+ {
+ checkClosed();
+ return _acknowledgeMode.ordinal();
+ }
+
+ AcknowledgeMode getAckModeEnum()
+ {
+ return _acknowledgeMode;
+ }
+
+ public void commit() throws JMSException
+ {
+ checkClosed();
+ checkTransactional();
+
+ _txn.commit();
+ for(MessageConsumerImpl consumer : _consumers)
+ {
+ consumer.postCommit();
+ }
+
+ _txn = _session.createSessionLocalTransaction();
+ //TODO
+ }
+
+ public void rollback() throws JMSException
+ {
+ checkClosed();
+ checkTransactional();
+
+ _txn.rollback();
+
+ for(MessageConsumerImpl consumer : _consumers)
+ {
+ consumer.postRollback();
+ }
+
+ _txn = _session.createSessionLocalTransaction();
+
+ //TODO
+ }
+
+ private void checkTransactional() throws JMSException
+ {
+ if(!getTransacted())
+ {
+ throw new IllegalStateException("Session must be transacted in order to perform this operation");
+ }
+ }
+
+ public void close() throws JMSException
+ {
+ if(!_closed)
+ {
+ _closed = true;
+ _dispatcher.close();
+ for(MessageConsumerImpl consumer : _consumers)
+ {
+ consumer.close();
+ }
+ for(MessageProducerImpl producer : _producers)
+ {
+ producer.close();
+ }
+ _session.close();
+ }
+ }
+
+ private void checkClosed() throws IllegalStateException
+ {
+ if(_closed)
+ {
+ throw new IllegalStateException("Closed");
+ }
+ }
+
+ public void recover() throws JMSException
+ {
+ checkClosed();
+ checkNotTransactional();
+
+ if(_acknowledgeMode == AcknowledgeMode.CLIENT_ACKNOWLEDGE)
+ {
+ synchronized(_session.getEndpoint().getLock())
+ {
+ for(MessageConsumerImpl consumer : _consumers)
+ {
+ consumer.doRecover();
+ }
+ }
+ }
+ else
+ {
+ if(Thread.currentThread() == _dispatcherThread)
+ {
+ _dispatcher.doRecover();
+ }
+ }
+
+ }
+
+ private void checkNotTransactional() throws JMSException
+ {
+
+ if(getTransacted())
+ {
+ throw new IllegalStateException("This operation cannot be carried out on a transacted session");
+ }
+ }
+
+ public MessageListener getMessageListener() throws JMSException
+ {
+ return _messageListener;
+ }
+
+ public void setMessageListener(final MessageListener messageListener) throws JMSException
+ {
+ if(_messageListener != null)
+ {
+ // TODO
+ }
+ else
+ {
+ _messageListener = messageListener;
+ }
+ }
+
+ public void run()
+ {
+ //TODO
+ }
+
+ public MessageProducerImpl createProducer(final Destination destination) throws JMSException
+ {
+ checkClosed();
+
+ final MessageProducerImpl messageProducer = new MessageProducerImpl(destination, this);
+
+ _producers.add(messageProducer);
+
+ return messageProducer;
+ }
+
+ public MessageConsumerImpl createConsumer(final Destination destination) throws JMSException
+ {
+ checkClosed();
+ return createConsumer(destination, null, false);
+ }
+
+ public MessageConsumerImpl createConsumer(final Destination destination, final String selector) throws JMSException
+ {
+ checkClosed();
+ return createConsumer(destination, selector, false);
+ }
+
+ public MessageConsumerImpl createConsumer(final Destination destination, final String selector, final boolean noLocal)
+ throws JMSException
+ {
+ checkClosed();
+ checkValidDestination(destination);
+ if(destination instanceof TemporaryDestination)
+ {
+ TemporaryDestination temporaryDestination = (TemporaryDestination) destination;
+ if(temporaryDestination.getSession() != this)
+ {
+ throw new JMSException("Cannot consume from a temporary destination created on another session");
+ }
+ if(temporaryDestination.isDeleted())
+ {
+ throw new IllegalStateException("Destination is deleted");
+ }
+ }
+ final MessageConsumerImpl messageConsumer;
+ synchronized(_session.getEndpoint().getLock())
+ {
+ messageConsumer = new MessageConsumerImpl(destination, this, selector, noLocal);
+ addConsumer(messageConsumer);
+ if(_connection.isStarted())
+ {
+ messageConsumer.start();
+ }
+ }
+ return messageConsumer;
+ }
+
+ private void checkValidDestination(Destination destination) throws InvalidDestinationException
+ {
+ if (destination == null || !(destination instanceof DestinationImpl))
+ {
+ throw new InvalidDestinationException("Invalid Destination");
+ }
+ }
+
+
+ protected void addConsumer(final MessageConsumerImpl messageConsumer)
+ {
+ _consumers.add(messageConsumer);
+ }
+
+ public QueueImpl createQueue(final String s) throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ return new QueueImpl(s);
+ }
+
+ public QueueReceiver createReceiver(final Queue queue) throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ return createConsumer(queue);
+ }
+
+ public QueueReceiver createReceiver(final Queue queue, final String selector) throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ return createConsumer(queue, selector);
+ }
+
+ public QueueSender createSender(final Queue queue) throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ return createProducer(queue);
+ }
+
+ public TopicImpl createTopic(final String s) throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ return new TopicImpl(s);
+ }
+
+ public TopicSubscriber createSubscriber(final Topic topic) throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ return createConsumer(topic);
+ }
+
+ public TopicSubscriber createSubscriber(final Topic topic, final String selector, final boolean noLocal) throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ return createConsumer(topic, selector, noLocal);
+ }
+
+ public TopicSubscriberImpl createDurableSubscriber(final Topic topic, final String name) throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ return createDurableSubscriber(topic, name, null, false);
+ }
+
+ private void checkNotQueueSession() throws IllegalStateException
+ {
+ if(_isQueueSession)
+ {
+ throw new IllegalStateException("Cannot perform this operation on a QueueSession");
+ }
+ }
+
+
+ private void checkNotTopicSession() throws IllegalStateException
+ {
+ if(_isTopicSession)
+ {
+ throw new IllegalStateException("Cannot perform this operation on a TopicSession");
+ }
+ }
+
+ public TopicSubscriberImpl createDurableSubscriber(final Topic topic, final String name, final String selector, final boolean noLocal)
+ throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ if(!(topic instanceof TopicImpl))
+ {
+ throw new InvalidDestinationException("invalid destination " + topic);
+ }
+ final TopicSubscriberImpl messageConsumer;
+ synchronized(_session.getEndpoint().getLock())
+ {
+ messageConsumer = new TopicSubscriberImpl(name, true, (org.apache.qpid.amqp_1_0.jms.Topic) topic, this,
+ selector,
+ noLocal);
+ addConsumer(messageConsumer);
+ if(_connection.isStarted())
+ {
+ messageConsumer.start();
+ }
+ }
+ return messageConsumer;
+ }
+
+ public TopicPublisher createPublisher(final Topic topic) throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ return createProducer(topic);
+ }
+
+ public QueueBrowserImpl createBrowser(final Queue queue) throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ checkValidDestination(queue);
+ return createBrowser(queue, null);
+ }
+
+ public QueueBrowserImpl createBrowser(final Queue queue, final String selector) throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ checkValidDestination(queue);
+
+ return new QueueBrowserImpl((QueueImpl) queue, selector, this);
+
+ }
+
+ public TemporaryQueueImpl createTemporaryQueue() throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ try
+ {
+ Sender send = _session.createTemporaryQueueSender();
+
+ TemporaryQueueImpl tempQ = new TemporaryQueueImpl(((Target)send.getTarget()).getAddress(), send, this);
+ return tempQ;
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ throw new JMSException("Unable to create temporary queue");
+ }
+ }
+
+ public TemporaryTopicImpl createTemporaryTopic() throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ try
+ {
+ Sender send = _session.createTemporaryQueueSender();
+
+ TemporaryTopicImpl tempQ = new TemporaryTopicImpl(((Target)send.getTarget()).getAddress(), send, this);
+ return tempQ;
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ throw new JMSException("Unable to create temporary queue");
+ }
+ }
+
+ public void unsubscribe(final String s) throws JMSException
+ {
+ checkClosed();
+
+ checkNotQueueSession();
+
+ Target target = new Target();
+ target.setAddress(UUID.randomUUID().toString());
+
+ try
+ {
+ Receiver receiver = new Receiver(getClientSession(), s, target, null,
+ org.apache.qpid.amqp_1_0.client.AcknowledgeMode.ALO, false);
+
+ final org.apache.qpid.amqp_1_0.type.Source receiverSource = receiver.getSource();
+ if(receiverSource instanceof Source)
+ {
+ Source source = (Source) receiverSource;
+ receiver.close();
+ receiver = new Receiver(getClientSession(), s, target, source,
+ org.apache.qpid.amqp_1_0.client.AcknowledgeMode.ALO, false);
+
+ }
+ receiver.close();
+ }
+ catch(AmqpErrorException e)
+ {
+ if(e.getError().getCondition() == AmqpError.NOT_FOUND)
+ {
+ throw new InvalidDestinationException(s);
+ }
+ else
+ {
+ JMSException jmsException = new JMSException(e.getMessage());
+ jmsException.setLinkedException(e);
+ throw jmsException;
+ }
+ }
+
+ //TODO
+ }
+
+ void stop()
+ {
+ //TODO
+ }
+
+ void start()
+ {
+ _dispatcher.start();
+ for(MessageConsumerImpl consumer : _consumers)
+ {
+ consumer.start();
+ }
+ }
+
+ org.apache.qpid.amqp_1_0.client.Session getClientSession()
+ {
+ return _session;
+ }
+
+ public MessageFactory getMessageFactory()
+ {
+ return _messageFactory;
+ }
+
+ void acknowledgeAll() throws IllegalStateException
+ {
+ synchronized(_session.getEndpoint().getLock())
+ {
+ checkClosed();
+ for(MessageConsumerImpl consumer : _consumers)
+ {
+ consumer.acknowledgeAll();
+ }
+ }
+ }
+
+ void messageListenerSet(final MessageConsumerImpl messageConsumer)
+ {
+ _dispatcher.updateMessageListener(messageConsumer);
+ }
+
+ public void messageArrived(final MessageConsumerImpl messageConsumer)
+ {
+ _dispatcher.messageArrivedAtConsumer(messageConsumer);
+ }
+
+ MessageImpl convertMessage(final javax.jms.Message message) throws JMSException
+ {
+ MessageImpl replacementMessage;
+
+ if(message instanceof BytesMessage)
+ {
+ replacementMessage = convertBytesMessage((BytesMessage) message);
+ }
+ else
+ {
+ if(message instanceof MapMessage)
+ {
+ replacementMessage = convertMapMessage((MapMessage) message);
+ }
+ else
+ {
+ if(message instanceof ObjectMessage)
+ {
+ replacementMessage = convertObjectMessage((ObjectMessage) message);
+ }
+ else
+ {
+ if(message instanceof StreamMessage)
+ {
+ replacementMessage = convertStreamMessage((StreamMessage) message);
+ }
+ else
+ {
+ if(message instanceof TextMessage)
+ {
+ replacementMessage = convertTextMessage((TextMessage) message);
+ }
+ else
+ {
+ replacementMessage = createMessage();
+ }
+ }
+ }
+ }
+ }
+
+ convertMessageProperties(message, replacementMessage);
+
+ return replacementMessage;
+ }
+
+
+ private void convertMessageProperties(final javax.jms.Message message, final MessageImpl replacementMessage)
+ throws JMSException
+ {
+ Enumeration propertyNames = message.getPropertyNames();
+ while (propertyNames.hasMoreElements())
+ {
+ String propertyName = String.valueOf(propertyNames.nextElement());
+ // TODO: Shouldn't need to check for JMS properties here as don't think getPropertyNames() should return them
+ if (!propertyName.startsWith("JMSX_"))
+ {
+ Object value = message.getObjectProperty(propertyName);
+ replacementMessage.setObjectProperty(propertyName, value);
+ }
+ }
+
+
+ replacementMessage.setJMSDeliveryMode(message.getJMSDeliveryMode());
+
+ if (message.getJMSReplyTo() != null)
+ {
+ replacementMessage.setJMSReplyTo(message.getJMSReplyTo());
+ }
+
+ replacementMessage.setJMSType(message.getJMSType());
+
+ replacementMessage.setJMSCorrelationID(message.getJMSCorrelationID());
+ }
+
+ private MessageImpl convertMapMessage(final MapMessage message) throws JMSException
+ {
+ MapMessageImpl mapMessage = createMapMessage();
+
+ Enumeration mapNames = message.getMapNames();
+ while (mapNames.hasMoreElements())
+ {
+ String name = (String) mapNames.nextElement();
+ mapMessage.setObject(name, message.getObject(name));
+ }
+
+ return mapMessage;
+ }
+
+ private MessageImpl convertBytesMessage(final BytesMessage message) throws JMSException
+ {
+ BytesMessageImpl bytesMessage = createBytesMessage();
+
+ message.reset();
+
+ byte[] buf = new byte[1024];
+
+ int len;
+
+ while ((len = message.readBytes(buf)) != -1)
+ {
+ bytesMessage.writeBytes(buf, 0, len);
+ }
+
+ return bytesMessage;
+ }
+
+ private MessageImpl convertObjectMessage(final ObjectMessage message) throws JMSException
+ {
+ ObjectMessageImpl objectMessage = createObjectMessage();
+ objectMessage.setObject(message.getObject());
+ return objectMessage;
+ }
+
+ private MessageImpl convertStreamMessage(final StreamMessage message) throws JMSException
+ {
+ StreamMessageImpl streamMessage = createStreamMessage();
+
+ try
+ {
+ message.reset();
+ while (true)
+ {
+ streamMessage.writeObject(message.readObject());
+ }
+ }
+ catch (MessageEOFException e)
+ {
+ // we're at the end so don't mind the exception
+ }
+
+ return streamMessage;
+ }
+
+ private MessageImpl convertTextMessage(final TextMessage message) throws JMSException
+ {
+ return createTextMessage(message.getText());
+ }
+
+ ConnectionImpl getConnection()
+ {
+ return _connection;
+ }
+
+ Transaction getTxn()
+ {
+ return _txn;
+ }
+
+
+ private class Dispatcher implements Runnable
+ {
+
+ private final List<MessageConsumerImpl> _messageConsumerList = new ArrayList<MessageConsumerImpl>();
+
+ private boolean _closed;
+ private boolean _started;
+
+ private Message _recoveredMessage;
+ private MessageConsumerImpl _recoveredConsumer;
+ private MessageConsumerImpl _currentConsumer;
+ private Message _currentMessage;
+
+ public void run()
+ {
+ synchronized(getLock())
+ {
+ while(!_closed)
+ {
+ while(!_started || (_recoveredMessage == null && _messageConsumerList.isEmpty()))
+ {
+ try
+ {
+ getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ return;
+ }
+ }
+ while(_started && (_recoveredMessage != null || !_messageConsumerList.isEmpty()))
+ {
+ Message msg;
+
+ MessageConsumerImpl consumer;
+
+ boolean recoveredMessage = _recoveredMessage != null;
+ if(recoveredMessage)
+ {
+ consumer = _recoveredConsumer;
+ msg = _recoveredMessage;
+ _recoveredMessage = null;
+ _recoveredConsumer = null;
+ }
+ else
+ {
+ consumer = _messageConsumerList.remove(0);
+ msg = consumer.receive0(0L);
+ }
+
+
+ MessageListener listener = consumer._messageListener;
+
+ MessageImpl message = consumer.createJMSMessage(msg, recoveredMessage);
+
+ if(message != null)
+ {
+ _currentConsumer = consumer;
+ _currentMessage = msg;
+ try
+ {
+ listener.onMessage(message);
+ }
+ finally
+ {
+ _currentConsumer = null;
+ _currentMessage = null;
+ }
+
+ if((_recoveredMessage == null) && (_acknowledgeMode == AcknowledgeMode.AUTO_ACKNOWLEDGE
+ || _acknowledgeMode == AcknowledgeMode.DUPS_OK_ACKNOWLEDGE))
+ {
+ consumer.acknowledge(msg);
+ }
+ }
+
+ }
+
+
+ }
+ }
+ }
+
+ private Object getLock()
+ {
+ return _session.getEndpoint().getLock();
+ }
+
+ public void messageArrivedAtConsumer(MessageConsumerImpl impl)
+ {
+ synchronized (getLock())
+ {
+ _messageConsumerList.add(impl);
+ getLock().notifyAll();
+ }
+ }
+
+ public void close()
+ {
+ synchronized (getLock())
+ {
+ _closed = true;
+ getLock().notifyAll();
+ }
+ }
+
+ public void updateMessageListener(final MessageConsumerImpl messageConsumer)
+ {
+ synchronized (getLock())
+ {
+ getLock().notifyAll();
+ }
+ }
+
+ public void start()
+ {
+ synchronized (getLock())
+ {
+ _started = true;
+ getLock().notifyAll();
+ }
+ }
+
+ public void stop()
+ {
+ synchronized (getLock())
+ {
+ _started = false;
+ getLock().notifyAll();
+ }
+ }
+
+ public void doRecover()
+ {
+ _recoveredConsumer = _currentConsumer;
+ _recoveredMessage = _currentMessage;
+ }
+ }
+
+ void setQueueSession(final boolean queueSession)
+ {
+ _isQueueSession = queueSession;
+ }
+
+ void setTopicSession(final boolean topicSession)
+ {
+ _isTopicSession = topicSession;
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/StreamMessageImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/StreamMessageImpl.java
new file mode 100644
index 0000000000..8275de884e
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/StreamMessageImpl.java
@@ -0,0 +1,466 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.StreamMessage;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import javax.jms.JMSException;
+import javax.jms.MessageEOFException;
+import javax.jms.MessageFormatException;
+import java.io.EOFException;
+import java.util.*;
+
+public class StreamMessageImpl extends MessageImpl implements StreamMessage
+{
+ private List _list;
+ private boolean _readOnly;
+ private int _position = -1;
+ private int _offset = -1;
+
+
+
+ protected StreamMessageImpl(Header header, MessageAnnotations messageAnnotations, Properties properties, ApplicationProperties appProperties, List list,
+ Footer footer, SessionImpl session)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, session);
+ _list = list;
+ }
+
+ StreamMessageImpl(final SessionImpl session)
+ {
+ super(new Header(), new MessageAnnotations(new HashMap()), new Properties(),
+ new ApplicationProperties(new HashMap()), new Footer(Collections.EMPTY_MAP),
+ session);
+ _list = new ArrayList();
+ }
+
+ public StreamMessageImpl(final Header header,
+ final MessageAnnotations messageAnnotations,
+ final Properties properties,
+ final ApplicationProperties appProperties,
+ final List amqpListSection, final Footer footer)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, null);
+ _list = amqpListSection;
+ }
+
+ public boolean readBoolean() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Boolean)
+ {
+ return (Boolean) obj;
+ }
+ if(obj instanceof String || obj == null)
+ {
+ return Boolean.valueOf((String)obj);
+ }
+ else
+ {
+ throw new MessageFormatException("Cannot read " + obj.getClass().getName() + " as boolean");
+ }
+ }
+
+ @Override
+ public void clearBody() throws JMSException
+ {
+ super.clearBody();
+ _list.clear();
+ _position = -1;
+ _offset = -1;
+ }
+
+ public byte readByte() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Byte)
+ {
+ return (Byte) obj;
+ }
+ else if(obj instanceof String || obj == null)
+ {
+ try
+ {
+ return Byte.valueOf((String)obj);
+ }
+ catch(RuntimeException e)
+ {
+ backup();
+ throw e;
+ }
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ }
+
+ private void backup()
+ {
+ _position--;
+ }
+
+ public short readShort() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Short)
+ {
+ return (Short) obj;
+ }
+ else if(obj instanceof Byte)
+ {
+ return (Byte) obj;
+ }
+ else if(obj instanceof String || obj == null)
+ {
+ try
+ {
+ return Short.valueOf((String)obj);
+ }
+ catch(RuntimeException e)
+ {
+ backup();
+ throw e;
+ }
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+
+ }
+
+ public char readChar() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Character)
+ {
+ return (Character) obj;
+ }
+ if(obj == null)
+ {
+ backup();
+ throw new NullPointerException();
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot read " + obj.getClass().getName() + " as boolean");
+ }
+
+ }
+
+ public int readInt() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Integer)
+ {
+ return (Integer) obj;
+ }
+ else if(obj instanceof Short)
+ {
+ return (Short) obj;
+ }
+ else if(obj instanceof Byte)
+ {
+ return (Byte) obj;
+ }
+ else if(obj instanceof String || obj == null)
+ {
+ try
+ {
+ return Integer.valueOf((String)obj);
+ }
+ catch (RuntimeException e)
+ {
+ backup();
+ throw e;
+ }
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ }
+
+ public long readLong() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Long)
+ {
+ return (Long) obj;
+ }
+ else if(obj instanceof Integer)
+ {
+ return (Integer) obj;
+ }
+ else if(obj instanceof Short)
+ {
+ return (Short) obj;
+ }
+ else if(obj instanceof Byte)
+ {
+ return (Byte) obj;
+ }
+ else if(obj instanceof String || obj == null)
+ {
+ try
+ {
+ return Long.valueOf((String)obj);
+ }
+ catch (RuntimeException e)
+ {
+ backup();
+ throw e;
+ }
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ }
+
+ public float readFloat() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Float)
+ {
+ return (Float) obj;
+ }
+ else if(obj instanceof String || obj == null)
+ {
+ try
+ {
+ return Float.valueOf((String)obj);
+ }
+ catch (RuntimeException e)
+ {
+ backup();
+ throw e;
+ }
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ }
+
+ public double readDouble() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Double)
+ {
+ return (Double) obj;
+ }
+ else if(obj instanceof Float)
+ {
+ return (Float) obj;
+ }
+ else if(obj instanceof String || obj == null)
+ {
+ try
+ {
+ return Double.valueOf((String)obj);
+ }
+ catch (RuntimeException e)
+ {
+ backup();
+ throw e;
+ }
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ }
+
+ public String readString() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Binary)
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ return String.valueOf(obj);
+ }
+
+ public int readBytes(final byte[] bytes) throws JMSException
+ {
+ Object obj = readObject();
+ if(!(obj instanceof Binary))
+ {
+ backup();
+ if(_position > -1 && _list.get(_position) instanceof Binary)
+ {
+ return -1;
+ }
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ Binary binary = (Binary) obj;
+ if(bytes.length >= binary.getLength())
+ {
+ System.arraycopy(binary.getArray(),binary.getArrayOffset(),bytes,0,binary.getLength());
+ return binary.getLength();
+ }
+ return -1;
+ }
+
+ public Object readObject() throws JMSException
+ {
+ checkReadable();
+ if(_offset == -1)
+ {
+ try
+ {
+ return _list.get(++_position);
+ }
+ catch (IndexOutOfBoundsException e)
+ {
+ throw new MessageEOFException("No more data in message stream");
+ }
+ }
+ else
+ {
+ return null; //TODO
+ }
+ }
+
+ public void writeBoolean(final boolean b) throws JMSException
+ {
+ checkWritable();
+ _list.add(b);
+ }
+
+ public void writeByte(final byte b) throws JMSException
+ {
+ checkWritable();
+ _list.add(b);
+ }
+
+ public void writeShort(final short i) throws JMSException
+ {
+ checkWritable();
+ _list.add(i);
+ }
+
+ public void writeChar(final char c) throws JMSException
+ {
+ checkWritable();
+ _list.add(c);
+ }
+
+ public void writeInt(final int i) throws JMSException
+ {
+ checkWritable();
+ _list.add(i);
+ }
+
+ public void writeLong(final long l) throws JMSException
+ {
+ checkWritable();
+ _list.add(l);
+ }
+
+ public void writeFloat(final float v) throws JMSException
+ {
+ checkWritable();
+ _list.add(v);
+ }
+
+ public void writeDouble(final double v) throws JMSException
+ {
+ checkWritable();
+ _list.add(v);
+ }
+
+ public void writeString(final String s) throws JMSException
+ {
+ checkWritable();
+ _list.add(s);
+ }
+
+ public void writeBytes(final byte[] bytes) throws JMSException
+ {
+ checkWritable();
+ writeBytes(bytes, 0, bytes.length);
+ }
+
+ public void writeBytes(final byte[] bytes, final int offset, final int size) throws JMSException
+ {
+ checkWritable();
+
+ if(!_list.isEmpty() && _list.get(_list.size()-1) instanceof byte[])
+ {
+ Binary oldVal = (Binary) _list.get(_list.size()-1);
+ byte[] allBytes = new byte[oldVal.getLength() + size];
+ System.arraycopy(oldVal.getArray(),oldVal.getArrayOffset(),allBytes,0,oldVal.getLength());
+ System.arraycopy(bytes, offset, allBytes, oldVal.getLength(), size);
+ _list.set(_list.size()-1, allBytes);
+ }
+ else
+ {
+ byte[] dup = new byte[size];
+ System.arraycopy(bytes,offset,dup,0,size);
+ _list.add(new Binary(dup));
+ }
+ }
+
+ public void writeObject(final Object o) throws JMSException
+ {
+ checkWritable();
+ if(o == null || _supportedClasses.contains(o.getClass()))
+ {
+ _list.add(o);
+ }
+ }
+
+ public void reset() throws JMSException
+ {
+ super.reset();
+ _position = -1;
+ _offset = -1;
+ }
+
+ @Override Collection<Section> getSections()
+ {
+ List<Section> sections = new ArrayList<Section>();
+ sections.add(getHeader());
+ if(getMessageAnnotations() != null && getMessageAnnotations().getValue() != null && !getMessageAnnotations().getValue().isEmpty())
+ {
+ sections.add(getMessageAnnotations());
+ }
+ sections.add(getProperties());
+ sections.add(getApplicationProperties());
+ sections.add(new AmqpValue(_list));
+ sections.add(getFooter());
+ return sections;
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryQueueImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryQueueImpl.java
new file mode 100644
index 0000000000..76608c421b
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryQueueImpl.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.Sender;
+import org.apache.qpid.amqp_1_0.jms.MessageConsumer;
+import org.apache.qpid.amqp_1_0.jms.TemporaryQueue;
+
+import javax.jms.IllegalStateException;
+import javax.jms.JMSException;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public class TemporaryQueueImpl extends QueueImpl implements TemporaryQueue
+{
+ private Sender _sender;
+ private SessionImpl _session;
+ private final Set<MessageConsumer> _consumers =
+ Collections.synchronizedSet(new HashSet<MessageConsumer>());
+
+ protected TemporaryQueueImpl(String address, Sender sender, SessionImpl session)
+ {
+ super(address);
+ _sender = sender;
+ _session = session;
+ _session.getConnection().addOnCloseTask(new ConnectionImpl.CloseTask()
+ {
+ public void onClose() throws JMSException
+ {
+ synchronized (TemporaryQueueImpl.this)
+ {
+ close();
+ }
+ }
+ });
+ }
+
+ public synchronized void delete() throws JMSException
+ {
+ if(_consumers.isEmpty())
+ {
+ close();
+ }
+ else
+ {
+ throw new IllegalStateException("Cannot delete destination as it has consumers");
+ }
+ }
+
+ private void close() throws JMSException
+ {
+ if(_sender != null)
+ {
+ try
+ {
+ _sender.close();
+ _sender = null;
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ final JMSException jmsException = new JMSException(e.getMessage());
+ jmsException.setLinkedException(e);
+ throw jmsException;
+ }
+ }
+
+ }
+
+ public SessionImpl getSession()
+ {
+ return _session;
+ }
+
+ public void addConsumer(MessageConsumer consumer)
+ {
+ _consumers.add(consumer);
+ }
+
+ public void removeConsumer(MessageConsumer consumer)
+ {
+ _consumers.remove(consumer);
+ }
+
+ public boolean isDeleted()
+ {
+ return _sender == null;
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryTopicImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryTopicImpl.java
new file mode 100644
index 0000000000..8e0d07e78b
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryTopicImpl.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.Sender;
+import org.apache.qpid.amqp_1_0.jms.MessageConsumer;
+import org.apache.qpid.amqp_1_0.jms.TemporaryTopic;
+
+import javax.jms.IllegalStateException;
+import javax.jms.JMSException;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public class TemporaryTopicImpl extends TopicImpl implements TemporaryTopic
+{
+ private Sender _sender;
+ private SessionImpl _session;
+ private final Set<MessageConsumer> _consumers =
+ Collections.synchronizedSet(new HashSet<MessageConsumer>());
+
+ protected TemporaryTopicImpl(String address, Sender sender, SessionImpl session)
+ {
+ super(address);
+ _sender = sender;
+ _session = session;
+
+ _session.getConnection().addOnCloseTask(new ConnectionImpl.CloseTask()
+ {
+ public void onClose() throws JMSException
+ {
+ synchronized (TemporaryTopicImpl.this)
+ {
+ close();
+ }
+ }
+ });
+ }
+
+ public void delete() throws JMSException
+ {
+ if(_consumers.isEmpty())
+ {
+ close();
+ }
+ else
+ {
+ throw new IllegalStateException("Cannot delete destination as it has consumers");
+ }
+
+ }
+
+
+ private void close() throws JMSException
+ {
+ if(_sender != null)
+ {
+ try
+ {
+
+ _sender.close();
+ _sender = null;
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ final JMSException jmsException = new JMSException(e.getMessage());
+ jmsException.setLinkedException(e);
+ throw jmsException;
+ }
+ }
+
+ }
+
+ public SessionImpl getSession()
+ {
+ return _session;
+ }
+
+
+ public void addConsumer(MessageConsumer consumer)
+ {
+ _consumers.add(consumer);
+ }
+
+ public void removeConsumer(MessageConsumer consumer)
+ {
+ _consumers.remove(consumer);
+ }
+
+ public boolean isDeleted()
+ {
+ return _sender == null;
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TextMessageImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TextMessageImpl.java
new file mode 100644
index 0000000000..5d9172229c
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TextMessageImpl.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.TextMessage;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import javax.jms.JMSException;
+import javax.jms.MessageNotWriteableException;
+import java.util.*;
+
+public class TextMessageImpl extends MessageImpl implements TextMessage
+{
+ private String _text;
+
+ protected TextMessageImpl(Header header,
+ MessageAnnotations messageAnnotations,
+ Properties properties,
+ ApplicationProperties appProperties,
+ String text,
+ Footer footer,
+ SessionImpl session)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, session);
+ _text = text;
+ }
+
+ protected TextMessageImpl(final SessionImpl session)
+ {
+ super(new Header(), new MessageAnnotations(new HashMap()),
+ new Properties(), new ApplicationProperties(new HashMap()), new Footer(Collections.EMPTY_MAP),
+ session);
+ }
+
+ public void setText(final String text) throws MessageNotWriteableException
+ {
+ if(isReadOnly())
+ {
+ throw new MessageNotWriteableException("Cannot set object, message is in read only mode");
+ }
+
+ _text = text;
+ }
+
+ public String getText() throws JMSException
+ {
+ return _text;
+ }
+
+ @Override
+ public void clearBody() throws JMSException
+ {
+ super.clearBody();
+ _text = null;
+ }
+
+ @Override Collection<Section> getSections()
+ {
+ List<Section> sections = new ArrayList<Section>();
+ sections.add(getHeader());
+ if(getMessageAnnotations() != null && getMessageAnnotations().getValue() != null && !getMessageAnnotations().getValue().isEmpty())
+ {
+ sections.add(getMessageAnnotations());
+ }
+ sections.add(getProperties());
+ sections.add(getApplicationProperties());
+ AmqpValue section = new AmqpValue(_text);
+ sections.add(section);
+ sections.add(getFooter());
+ return sections;
+ }
+
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicConnectionImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicConnectionImpl.java
new file mode 100644
index 0000000000..de456532cb
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicConnectionImpl.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.TopicConnection;
+
+import javax.jms.ConnectionConsumer;
+import javax.jms.JMSException;
+import javax.jms.ServerSessionPool;
+import javax.jms.Topic;
+
+public class TopicConnectionImpl extends ConnectionImpl implements TopicConnection
+{
+ TopicConnectionImpl(String host, int port, String username, String password, String clientId)
+ throws JMSException
+ {
+ super(host, port, username, password, clientId);
+ }
+
+ public TopicSessionImpl createTopicSession(final boolean b, final int i) throws JMSException
+ {
+ return null; //TODO
+ }
+
+ public ConnectionConsumer createConnectionConsumer(final Topic topic,
+ final String s,
+ final ServerSessionPool serverSessionPool,
+ final int i) throws JMSException
+ {
+ return null; //TODO
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicImpl.java
new file mode 100644
index 0000000000..e54a660963
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicImpl.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.Topic;
+
+import java.util.WeakHashMap;
+
+public class TopicImpl extends DestinationImpl implements Topic
+{
+ private static final WeakHashMap<String, TopicImpl> TOPIC_CACHE =
+ new WeakHashMap<String, TopicImpl>();
+
+
+ public TopicImpl(String address)
+ {
+ super(address);
+ }
+
+ public String getTopicName()
+ {
+ return getAddress();
+ }
+
+ public static synchronized TopicImpl createTopic(final String address)
+ {
+ TopicImpl topic = TOPIC_CACHE.get(address);
+ if(topic == null)
+ {
+ topic = new TopicImpl(address);
+ TOPIC_CACHE.put(address, topic);
+ }
+ return topic;
+ }
+
+ public static TopicImpl valueOf(String address)
+ {
+ return address == null ? null : createTopic(address);
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicPublisherImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicPublisherImpl.java
new file mode 100644
index 0000000000..a2d2f34043
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicPublisherImpl.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.TopicPublisher;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Topic;
+
+public class TopicPublisherImpl extends MessageProducerImpl implements TopicPublisher
+{
+ protected TopicPublisherImpl(final Destination destination, final SessionImpl session)
+ throws JMSException
+ {
+ super(destination, session);
+ }
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSessionImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSessionImpl.java
new file mode 100644
index 0000000000..052a3f2a6b
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSessionImpl.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.TopicSession;
+
+import javax.jms.JMSException;
+import javax.jms.Topic;
+
+public class TopicSessionImpl extends SessionImpl implements TopicSession
+{
+ protected TopicSessionImpl(final ConnectionImpl connection, final AcknowledgeMode acknowledgeMode)
+ {
+ super(connection, acknowledgeMode);
+ setTopicSession(true);
+ }
+
+ public TopicSubscriberImpl createSubscriber(final Topic topic) throws JMSException
+ {
+ return createSubscriber(topic,null, false);
+ }
+
+ public TopicSubscriberImpl createSubscriber(final Topic topic, final String selector, final boolean noLocal) throws JMSException
+ {
+
+ final TopicSubscriberImpl messageConsumer;
+ synchronized(getClientSession().getEndpoint().getLock())
+ {
+ messageConsumer = new TopicSubscriberImpl((TopicImpl) topic, this, selector, noLocal);
+ addConsumer(messageConsumer);
+ }
+ return messageConsumer;
+ }
+
+ public TopicPublisherImpl createPublisher(final Topic topic) throws JMSException
+ {
+ return null; //TODO
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSubscriberImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSubscriberImpl.java
new file mode 100644
index 0000000000..52d8c412ec
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSubscriberImpl.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.AcknowledgeMode;
+import org.apache.qpid.amqp_1_0.client.Receiver;
+import org.apache.qpid.amqp_1_0.jms.Topic;
+import org.apache.qpid.amqp_1_0.jms.TopicSubscriber;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.messaging.Filter;
+import org.apache.qpid.amqp_1_0.type.messaging.StdDistMode;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+import javax.jms.*;
+import java.util.Map;
+
+public class TopicSubscriberImpl extends MessageConsumerImpl implements TopicSubscriber
+{
+
+ TopicSubscriberImpl(String name,
+ boolean durable,
+ final Topic destination,
+ final SessionImpl session,
+ final String selector,
+ final boolean noLocal)
+ throws JMSException
+ {
+ super(destination, session, selector, noLocal, name, durable);
+ setTopicSubscriber(true);
+ }
+
+ TopicSubscriberImpl(final Topic destination,
+ final SessionImpl session,
+ final String selector,
+ final boolean noLocal)
+ throws JMSException
+ {
+ super(destination, session, selector, noLocal);
+ setTopicSubscriber(true);
+ }
+
+ public TopicImpl getTopic() throws JMSException
+ {
+ return (TopicImpl) getDestination();
+ }
+
+
+ protected Receiver createClientReceiver() throws JMSException
+ {
+ try
+ {
+ String address = getDestination().getAddress();
+ Receiver receiver = getSession().getClientSession().createReceiver(address,
+ StdDistMode.COPY, AcknowledgeMode.ALO,
+ getLinkName(), isDurable(), getFilters(),
+ null);
+ String actualAddress = receiver.getAddress();
+
+ @SuppressWarnings("unchecked")
+ Map<Symbol, Filter> actualFilters = (Map<Symbol, Filter>) receiver.getFilter();
+
+ if(!address.equals(actualAddress) || !filtersEqual(getFilters(), actualFilters))
+ {
+ receiver.close();
+ if(isDurable())
+ {
+ receiver = getSession().getClientSession().createReceiver(address,
+ StdDistMode.COPY, AcknowledgeMode.ALO,
+ getLinkName(), false, getFilters(),
+ null);
+ receiver.close();
+ }
+ receiver = getSession().getClientSession().createReceiver(address,
+ StdDistMode.COPY, AcknowledgeMode.ALO,
+ getLinkName(), isDurable(), getFilters(),
+ null);
+ }
+
+
+ return receiver;
+ }
+ catch (AmqpErrorException e)
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = e.getError();
+ if(AmqpError.INVALID_FIELD.equals(error.getCondition()))
+ {
+ throw new InvalidSelectorException(e.getMessage());
+ }
+ else
+ {
+ throw new JMSException(e.getMessage(), error.getCondition().getValue().toString());
+
+ }
+
+ }
+ }
+
+ private boolean filtersEqual(Map<Symbol, Filter> filters, Map<Symbol, Filter> actualFilters)
+ {
+ if(filters == null || filters.isEmpty())
+ {
+ return actualFilters == null || actualFilters.isEmpty();
+ }
+ else
+ {
+ return actualFilters != null && filters.equals(actualFilters);
+ }
+
+ }
+
+
+ protected void closeUnderlyingReceiver(Receiver receiver)
+ {
+ receiver.close();
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/NameParserImpl.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/NameParserImpl.java
new file mode 100644
index 0000000000..7c3857f6c9
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/NameParserImpl.java
@@ -0,0 +1,37 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.jndi;
+
+import javax.naming.CompositeName;
+import javax.naming.Name;
+import javax.naming.NameParser;
+import javax.naming.NamingException;
+
+/**
+ * A default implementation of {@link NameParser}
+ * <p/>
+ * Based on class from ActiveMQ.
+ */
+public class NameParserImpl implements NameParser
+{
+ public Name parse(String name) throws NamingException
+ {
+ return new CompositeName(name);
+ }
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/PropertiesFileInitialContextFactory.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/PropertiesFileInitialContextFactory.java
new file mode 100644
index 0000000000..31030a7d30
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/PropertiesFileInitialContextFactory.java
@@ -0,0 +1,230 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.jms.jndi;
+
+import org.apache.qpid.amqp_1_0.jms.impl.ConnectionFactoryImpl;
+import org.apache.qpid.amqp_1_0.jms.impl.DestinationImpl;
+import org.apache.qpid.amqp_1_0.jms.impl.QueueImpl;
+import org.apache.qpid.amqp_1_0.jms.impl.TopicImpl;
+
+import java.io.BufferedInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.Queue;
+import javax.jms.Topic;
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.spi.InitialContextFactory;
+
+
+public class PropertiesFileInitialContextFactory implements InitialContextFactory
+{
+
+ private String CONNECTION_FACTORY_PREFIX = "connectionfactory.";
+ private String DESTINATION_PREFIX = "destination.";
+ private String QUEUE_PREFIX = "queue.";
+ private String TOPIC_PREFIX = "topic.";
+
+ public Context getInitialContext(Hashtable environment) throws NamingException
+ {
+ Map data = new ConcurrentHashMap();
+
+ String file = null;
+ try
+ {
+
+
+ if (environment.containsKey(Context.PROVIDER_URL))
+ {
+ file = (String) environment.get(Context.PROVIDER_URL);
+ }
+ else
+ {
+ file = System.getProperty(Context.PROVIDER_URL);
+ }
+
+ if (file != null)
+ {
+
+ // Load the properties specified
+ BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));
+ Properties p = new Properties();
+ try
+ {
+ p.load(inputStream);
+ }
+ finally
+ {
+ inputStream.close();
+ }
+
+
+ for (Map.Entry me : p.entrySet())
+ {
+ String key = (String) me.getKey();
+ String value = (String) me.getValue();
+ environment.put(key, value);
+ if (System.getProperty(key) == null)
+ {
+ System.setProperty(key, value);
+ }
+ }
+ }
+ else
+ {
+ throw new NamingException("No Provider URL specified.");
+ }
+ }
+ catch (IOException ioe)
+ {
+ NamingException ne = new NamingException("Unable to load property file:" + file +".");
+ ne.setRootCause(ioe);
+ throw ne;
+ }
+
+ try
+ {
+ createConnectionFactories(data, environment);
+ }
+ catch (MalformedURLException e)
+ {
+ NamingException ne = new NamingException();
+ ne.setRootCause(e);
+ throw ne;
+ }
+
+ createDestinations(data, environment);
+
+ createQueues(data, environment);
+
+ createTopics(data, environment);
+
+ return createContext(data, environment);
+ }
+
+ protected ReadOnlyContext createContext(Map data, Hashtable environment)
+ {
+ return new ReadOnlyContext(environment, data);
+ }
+
+ protected void createConnectionFactories(Map data, Hashtable environment) throws MalformedURLException
+ {
+ for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();)
+ {
+ Map.Entry entry = (Map.Entry) iter.next();
+ String key = entry.getKey().toString();
+ if (key.startsWith(CONNECTION_FACTORY_PREFIX))
+ {
+ String jndiName = key.substring(CONNECTION_FACTORY_PREFIX.length());
+ ConnectionFactory cf = createFactory(entry.getValue().toString().trim());
+ if (cf != null)
+ {
+ data.put(jndiName, cf);
+ }
+ }
+ }
+ }
+
+ protected void createDestinations(Map data, Hashtable environment)
+ {
+ for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();)
+ {
+ Map.Entry entry = (Map.Entry) iter.next();
+ String key = entry.getKey().toString();
+ if (key.startsWith(DESTINATION_PREFIX))
+ {
+ String jndiName = key.substring(DESTINATION_PREFIX.length());
+ Destination dest = createDestination(entry.getValue().toString().trim());
+ if (dest != null)
+ {
+ data.put(jndiName, dest);
+ }
+ }
+ }
+ }
+
+ protected void createQueues(Map data, Hashtable environment)
+ {
+ for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();)
+ {
+ Map.Entry entry = (Map.Entry) iter.next();
+ String key = entry.getKey().toString();
+ if (key.startsWith(QUEUE_PREFIX))
+ {
+ String jndiName = key.substring(QUEUE_PREFIX.length());
+ Queue q = createQueue(entry.getValue().toString().trim());
+ if (q != null)
+ {
+ data.put(jndiName, q);
+ }
+ }
+ }
+ }
+
+ protected void createTopics(Map data, Hashtable environment)
+ {
+ for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();)
+ {
+ Map.Entry entry = (Map.Entry) iter.next();
+ String key = entry.getKey().toString();
+ if (key.startsWith(TOPIC_PREFIX))
+ {
+ String jndiName = key.substring(TOPIC_PREFIX.length());
+ Topic t = createTopic(entry.getValue().toString().trim());
+ if (t != null)
+ {
+ data.put(jndiName, t);
+ }
+ }
+ }
+ }
+
+
+ private ConnectionFactory createFactory(String url) throws MalformedURLException
+ {
+ return ConnectionFactoryImpl.createFromURL(url);
+ }
+
+ private DestinationImpl createDestination(String str)
+ {
+ return DestinationImpl.createDestination(str);
+ }
+
+ private QueueImpl createQueue(String address)
+ {
+ return QueueImpl.createQueue(address);
+ }
+
+ private TopicImpl createTopic(String address)
+ {
+ return TopicImpl.createTopic(address);
+ }
+
+}
diff --git a/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/ReadOnlyContext.java b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/ReadOnlyContext.java
new file mode 100644
index 0000000000..4e0f994b94
--- /dev/null
+++ b/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/ReadOnlyContext.java
@@ -0,0 +1,527 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.jms.jndi;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.naming.Binding;
+import javax.naming.CompositeName;
+import javax.naming.Context;
+import javax.naming.LinkRef;
+import javax.naming.Name;
+import javax.naming.NameClassPair;
+import javax.naming.NameNotFoundException;
+import javax.naming.NameParser;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.NotContextException;
+import javax.naming.OperationNotSupportedException;
+import javax.naming.Reference;
+import javax.naming.spi.NamingManager;
+
+/**
+ * Based on class from ActiveMQ.
+ * A read-only Context
+ * <p/>
+ * This version assumes it and all its subcontext are read-only and any attempt
+ * to modify (e.g. through bind) will result in an OperationNotSupportedException.
+ * Each Context in the tree builds a cache of the entries in all sub-contexts
+ * to optimise the performance of lookup.
+ * </p>
+ * <p>This implementation is intended to optimise the performance of lookup(String)
+ * to about the level of a HashMap get. It has been observed that the scheme
+ * resolution phase performed by the JVM takes considerably longer, so for
+ * optimum performance lookups should be coded like:</p>
+ * <code>
+ * Context componentContext = (Context)new InitialContext().lookup("java:comp");
+ * String envEntry = (String) componentContext.lookup("env/myEntry");
+ * String envEntry2 = (String) componentContext.lookup("env/myEntry2");
+ * </code>
+ */
+public class ReadOnlyContext implements Context, Serializable
+{
+ private static final long serialVersionUID = -5754338187296859149L;
+ protected static final NameParser nameParser = new NameParserImpl();
+
+ protected final Hashtable environment; // environment for this context
+ protected final Map bindings; // bindings at my level
+ protected final Map treeBindings; // all bindings under me
+
+ private boolean frozen = false;
+ private String nameInNamespace = "";
+ public static final String SEPARATOR = "/";
+
+ public ReadOnlyContext()
+ {
+ environment = new Hashtable();
+ bindings = new HashMap();
+ treeBindings = new HashMap();
+ }
+
+ public ReadOnlyContext(Hashtable env)
+ {
+ if (env == null)
+ {
+ this.environment = new Hashtable();
+ }
+ else
+ {
+ this.environment = new Hashtable(env);
+ }
+
+ this.bindings = Collections.EMPTY_MAP;
+ this.treeBindings = Collections.EMPTY_MAP;
+ }
+
+ public ReadOnlyContext(Hashtable environment, Map bindings)
+ {
+ if (environment == null)
+ {
+ this.environment = new Hashtable();
+ }
+ else
+ {
+ this.environment = new Hashtable(environment);
+ }
+
+ this.bindings = bindings;
+ treeBindings = new HashMap();
+ frozen = true;
+ }
+
+ public ReadOnlyContext(Hashtable environment, Map bindings, String nameInNamespace)
+ {
+ this(environment, bindings);
+ this.nameInNamespace = nameInNamespace;
+ }
+
+ protected ReadOnlyContext(ReadOnlyContext clone, Hashtable env)
+ {
+ this.bindings = clone.bindings;
+ this.treeBindings = clone.treeBindings;
+ this.environment = new Hashtable(env);
+ }
+
+ protected ReadOnlyContext(ReadOnlyContext clone, Hashtable env, String nameInNamespace)
+ {
+ this(clone, env);
+ this.nameInNamespace = nameInNamespace;
+ }
+
+ public void freeze()
+ {
+ frozen = true;
+ }
+
+ boolean isFrozen()
+ {
+ return frozen;
+ }
+
+ /**
+ * internalBind is intended for use only during setup or possibly by suitably synchronized superclasses.
+ * It binds every possible lookup into a map in each context. To do this, each context
+ * strips off one name segment and if necessary creates a new context for it. Then it asks that context
+ * to bind the remaining name. It returns a map containing all the bindings from the next context, plus
+ * the context it just created (if it in fact created it). (the names are suitably extended by the segment
+ * originally lopped off).
+ *
+ * @param name
+ * @param value
+ * @return
+ * @throws javax.naming.NamingException
+ */
+ protected Map internalBind(String name, Object value) throws NamingException
+ {
+ assert (name != null) && (name.length() > 0);
+ assert !frozen;
+
+ Map newBindings = new HashMap();
+ int pos = name.indexOf('/');
+ if (pos == -1)
+ {
+ if (treeBindings.put(name, value) != null)
+ {
+ throw new NamingException("Something already bound at " + name);
+ }
+
+ bindings.put(name, value);
+ newBindings.put(name, value);
+ }
+ else
+ {
+ String segment = name.substring(0, pos);
+ assert segment != null;
+ assert !segment.equals("");
+ Object o = treeBindings.get(segment);
+ if (o == null)
+ {
+ o = newContext();
+ treeBindings.put(segment, o);
+ bindings.put(segment, o);
+ newBindings.put(segment, o);
+ }
+ else if (!(o instanceof ReadOnlyContext))
+ {
+ throw new NamingException("Something already bound where a subcontext should go");
+ }
+
+ ReadOnlyContext readOnlyContext = (ReadOnlyContext) o;
+ String remainder = name.substring(pos + 1);
+ Map subBindings = readOnlyContext.internalBind(remainder, value);
+ for (Iterator iterator = subBindings.entrySet().iterator(); iterator.hasNext();)
+ {
+ Map.Entry entry = (Map.Entry) iterator.next();
+ String subName = segment + "/" + (String) entry.getKey();
+ Object bound = entry.getValue();
+ treeBindings.put(subName, bound);
+ newBindings.put(subName, bound);
+ }
+ }
+
+ return newBindings;
+ }
+
+ protected ReadOnlyContext newContext()
+ {
+ return new ReadOnlyContext();
+ }
+
+ public Object addToEnvironment(String propName, Object propVal) throws NamingException
+ {
+ return environment.put(propName, propVal);
+ }
+
+ public Hashtable getEnvironment() throws NamingException
+ {
+ return (Hashtable) environment.clone();
+ }
+
+ public Object removeFromEnvironment(String propName) throws NamingException
+ {
+ return environment.remove(propName);
+ }
+
+ public Object lookup(String name) throws NamingException
+ {
+ if (name.length() == 0)
+ {
+ return this;
+ }
+
+ Object result = treeBindings.get(name);
+ if (result == null)
+ {
+ result = bindings.get(name);
+ }
+
+ if (result == null)
+ {
+ int pos = name.indexOf(':');
+ if (pos > 0)
+ {
+ String scheme = name.substring(0, pos);
+ Context ctx = NamingManager.getURLContext(scheme, environment);
+ if (ctx == null)
+ {
+ throw new NamingException("scheme " + scheme + " not recognized");
+ }
+
+ return ctx.lookup(name);
+ }
+ else
+ {
+ // Split out the first name of the path
+ // and look for it in the bindings map.
+ CompositeName path = new CompositeName(name);
+
+ if (path.size() == 0)
+ {
+ return this;
+ }
+ else
+ {
+ String first = path.get(0);
+ Object obj = bindings.get(first);
+ if (obj == null)
+ {
+ throw new NameNotFoundException(name);
+ }
+ else if ((obj instanceof Context) && (path.size() > 1))
+ {
+ Context subContext = (Context) obj;
+ obj = subContext.lookup(path.getSuffix(1));
+ }
+
+ return obj;
+ }
+ }
+ }
+
+ if (result instanceof LinkRef)
+ {
+ LinkRef ref = (LinkRef) result;
+ result = lookup(ref.getLinkName());
+ }
+
+ if (result instanceof Reference)
+ {
+ try
+ {
+ result = NamingManager.getObjectInstance(result, null, null, this.environment);
+ }
+ catch (NamingException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ throw (NamingException) new NamingException("could not look up : " + name).initCause(e);
+ }
+ }
+
+ if (result instanceof ReadOnlyContext)
+ {
+ String prefix = getNameInNamespace();
+ if (prefix.length() > 0)
+ {
+ prefix = prefix + SEPARATOR;
+ }
+
+ result = new ReadOnlyContext((ReadOnlyContext) result, environment, prefix + name);
+ }
+
+ return result;
+ }
+
+ public Object lookup(Name name) throws NamingException
+ {
+ return lookup(name.toString());
+ }
+
+ public Object lookupLink(String name) throws NamingException
+ {
+ return lookup(name);
+ }
+
+ public Name composeName(Name name, Name prefix) throws NamingException
+ {
+ Name result = (Name) prefix.clone();
+ result.addAll(name);
+
+ return result;
+ }
+
+ public String composeName(String name, String prefix) throws NamingException
+ {
+ CompositeName result = new CompositeName(prefix);
+ result.addAll(new CompositeName(name));
+
+ return result.toString();
+ }
+
+ public NamingEnumeration list(String name) throws NamingException
+ {
+ Object o = lookup(name);
+ if (o == this)
+ {
+ return new ListEnumeration();
+ }
+ else if (o instanceof Context)
+ {
+ return ((Context) o).list("");
+ }
+ else
+ {
+ throw new NotContextException();
+ }
+ }
+
+ public NamingEnumeration listBindings(String name) throws NamingException
+ {
+ Object o = lookup(name);
+ if (o == this)
+ {
+ return new ListBindingEnumeration();
+ }
+ else if (o instanceof Context)
+ {
+ return ((Context) o).listBindings("");
+ }
+ else
+ {
+ throw new NotContextException();
+ }
+ }
+
+ public Object lookupLink(Name name) throws NamingException
+ {
+ return lookupLink(name.toString());
+ }
+
+ public NamingEnumeration list(Name name) throws NamingException
+ {
+ return list(name.toString());
+ }
+
+ public NamingEnumeration listBindings(Name name) throws NamingException
+ {
+ return listBindings(name.toString());
+ }
+
+ public void bind(Name name, Object obj) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void bind(String name, Object obj) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void close() throws NamingException
+ {
+ // ignore
+ }
+
+ public Context createSubcontext(Name name) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public Context createSubcontext(String name) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void destroySubcontext(Name name) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void destroySubcontext(String name) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public String getNameInNamespace() throws NamingException
+ {
+ return nameInNamespace;
+ }
+
+ public NameParser getNameParser(Name name) throws NamingException
+ {
+ return nameParser;
+ }
+
+ public NameParser getNameParser(String name) throws NamingException
+ {
+ return nameParser;
+ }
+
+ public void rebind(Name name, Object obj) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void rebind(String name, Object obj) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void rename(Name oldName, Name newName) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void rename(String oldName, String newName) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void unbind(Name name) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void unbind(String name) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ private abstract class LocalNamingEnumeration implements NamingEnumeration
+ {
+ private Iterator i = bindings.entrySet().iterator();
+
+ public boolean hasMore() throws NamingException
+ {
+ return i.hasNext();
+ }
+
+ public boolean hasMoreElements()
+ {
+ return i.hasNext();
+ }
+
+ protected Map.Entry getNext()
+ {
+ return (Map.Entry) i.next();
+ }
+
+ public void close() throws NamingException
+ { }
+ }
+
+ private class ListEnumeration extends LocalNamingEnumeration
+ {
+ public Object next() throws NamingException
+ {
+ return nextElement();
+ }
+
+ public Object nextElement()
+ {
+ Map.Entry entry = getNext();
+
+ return new NameClassPair((String) entry.getKey(), entry.getValue().getClass().getName());
+ }
+ }
+
+ private class ListBindingEnumeration extends LocalNamingEnumeration
+ {
+ public Object next() throws NamingException
+ {
+ return nextElement();
+ }
+
+ public Object nextElement()
+ {
+ Map.Entry entry = getNext();
+
+ return new Binding((String) entry.getKey(), entry.getValue());
+ }
+ }
+}
diff --git a/java/amqp-1-0-client/build.xml b/java/amqp-1-0-client/build.xml
new file mode 100644
index 0000000000..173d7540d4
--- /dev/null
+++ b/java/amqp-1-0-client/build.xml
@@ -0,0 +1,29 @@
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ -->
+<project name="AMQP 1.0 Client" default="build">
+
+ <property name="module.genpom" value="true"/>
+ <property name="module.depends" value="amqp-1-0-common"/>
+
+
+ <import file="../module.xml"/>
+
+</project>
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/AcknowledgeMode.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/AcknowledgeMode.java
new file mode 100644
index 0000000000..05d176bc35
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/AcknowledgeMode.java
@@ -0,0 +1,28 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+public enum AcknowledgeMode
+{
+ AMO,
+ ALO,
+ EO
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Command.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Command.java
new file mode 100644
index 0000000000..3bb26744c4
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Command.java
@@ -0,0 +1,43 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import java.lang.reflect.InvocationTargetException;
+
+public class Command
+{
+ public static void main(String[] args) throws
+ ClassNotFoundException,
+ NoSuchMethodException,
+ InvocationTargetException,
+ IllegalAccessException,
+ InstantiationException
+ {
+ String name = args[0];
+ String[] cmdArgs = new String[args.length-1];
+ System.arraycopy(args,1,cmdArgs,0,args.length-1);
+ name = "org.apache.qpid.amqp_1_0.client." + String.valueOf(name.charAt(0)).toUpperCase() + name.substring(1).toLowerCase();
+ Class<Util> clazz = (Class<Util>) Class.forName(name);
+ Util util = clazz.getDeclaredConstructor(String[].class).newInstance((Object)cmdArgs);
+ util.run();
+
+ }
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Connection.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Connection.java
new file mode 100644
index 0000000000..e3d56fae09
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Connection.java
@@ -0,0 +1,481 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.framing.ConnectionHandler;
+import org.apache.qpid.amqp_1_0.transport.AMQPTransport;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+import org.apache.qpid.amqp_1_0.transport.Container;
+import org.apache.qpid.amqp_1_0.transport.StateChangeListener;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+import org.apache.qpid.amqp_1_0.type.SaslFrameBody;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.nio.ByteBuffer;
+import java.security.Principal;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class Connection
+{
+ private static final Logger RAW_LOGGER = Logger.getLogger("RAW");
+ private static final int MAX_FRAME_SIZE = 65536;
+
+ private String _address;
+ private ConnectionEndpoint _conn;
+ private int _sessionCount;
+
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password) throws ConnectionException
+ {
+ this(address, port, username, password, MAX_FRAME_SIZE);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password, String remoteHostname) throws ConnectionException
+ {
+ this(address, port, username, password, MAX_FRAME_SIZE,new Container(),remoteHostname);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final int maxFrameSize) throws ConnectionException
+ {
+ this(address,port,username,password,maxFrameSize,new Container());
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final Container container) throws ConnectionException
+ {
+ this(address,port,username,password,MAX_FRAME_SIZE,container);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final int maxFrameSize,
+ final Container container) throws ConnectionException
+ {
+ this(address,port,username,password,maxFrameSize,container, null);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final int maxFrameSize,
+ final Container container,
+ final String remoteHostname) throws ConnectionException
+ {
+ this(address,port,username,password,maxFrameSize,container,remoteHostname,false);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final Container container,
+ final boolean ssl) throws ConnectionException
+ {
+ this(address, port, username, password, MAX_FRAME_SIZE,container,null,ssl);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final String remoteHost,
+ final boolean ssl) throws ConnectionException
+ {
+ this(address, port, username, password, MAX_FRAME_SIZE,new Container(),remoteHost,ssl);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final Container container,
+ final String remoteHost,
+ final boolean ssl) throws ConnectionException
+ {
+ this(address, port, username, password, MAX_FRAME_SIZE,container,remoteHost,ssl);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final int maxFrameSize,
+ final Container container,
+ final String remoteHostname, boolean ssl) throws ConnectionException
+ {
+
+ _address = address;
+
+ try
+ {
+ final Socket s;
+ if(ssl)
+ {
+ s = SSLSocketFactory.getDefault().createSocket(address, port);
+ }
+ else
+ {
+ s = new Socket(address, port);
+ }
+
+
+ Principal principal = username == null ? null : new Principal()
+ {
+
+ public String getName()
+ {
+ return username;
+ }
+ };
+ _conn = new ConnectionEndpoint(container, principal, password);
+ _conn.setDesiredMaxFrameSize(UnsignedInteger.valueOf(maxFrameSize));
+ _conn.setRemoteAddress(s.getRemoteSocketAddress());
+ _conn.setRemoteHostname(remoteHostname);
+
+
+
+ ConnectionHandler.FrameOutput<FrameBody> out = new ConnectionHandler.FrameOutput<FrameBody>(_conn);
+
+
+ final OutputStream outputStream = s.getOutputStream();
+
+ ConnectionHandler.BytesSource src;
+
+ if(_conn.requiresSASL())
+ {
+ ConnectionHandler.FrameOutput<SaslFrameBody> saslOut = new ConnectionHandler.FrameOutput<SaslFrameBody>(_conn);
+
+ src = new ConnectionHandler.SequentialBytesSource(new ConnectionHandler.HeaderBytesSource(_conn, (byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte)3,
+ (byte)1,
+ (byte)0,
+ (byte)0),
+ new ConnectionHandler.FrameToBytesSourceAdapter(saslOut,_conn.getDescribedTypeRegistry()),
+ new ConnectionHandler.HeaderBytesSource(_conn, (byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte)0,
+ (byte)1,
+ (byte)0,
+ (byte)0),
+ new ConnectionHandler.FrameToBytesSourceAdapter(out,_conn.getDescribedTypeRegistry())
+ );
+
+ _conn.setSaslFrameOutput(saslOut);
+ }
+ else
+ {
+ src = new ConnectionHandler.SequentialBytesSource(new ConnectionHandler.HeaderBytesSource(_conn,(byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte)0,
+ (byte)1,
+ (byte)0,
+ (byte)0),
+ new ConnectionHandler.FrameToBytesSourceAdapter(out,_conn.getDescribedTypeRegistry())
+ );
+ }
+
+
+ //ConnectionHandler.OutputHandler outputHandler = new ConnectionHandler.OutputHandler(outputStream, out, _conn.getDescribedTypeRegistry());
+ ConnectionHandler.BytesOutputHandler outputHandler = new ConnectionHandler.BytesOutputHandler(outputStream, src, _conn);
+ Thread outputThread = new Thread(outputHandler);
+ outputThread.setDaemon(true);
+ outputThread.start();
+ _conn.setFrameOutputHandler(out);
+
+
+
+ final ConnectionHandler handler = new ConnectionHandler(_conn);
+ final InputStream inputStream = s.getInputStream();
+
+ //final AMQPTransport transport = new AMQPTransport(new AMQPFrameTransport(_conn));
+
+ Thread inputThread = new Thread(new Runnable()
+ {
+
+ public void run()
+ {
+ try
+ {
+ doRead(handler, inputStream);
+// doRead(transport, inputStream);
+ }
+ finally
+ {
+ if(_conn.closedForInput() && _conn.closedForOutput())
+ {
+ try
+ {
+ s.close();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+ }
+ });
+
+ inputThread.setDaemon(true);
+ inputThread.start();
+
+/*
+ Thread outputThread = new Thread(new Runnable()
+ {
+
+ private int _lastWrite;
+
+ public void run()
+ {
+ try
+ {
+// doRead(handler, inputStream);
+ final Object lock = new Object();
+ transport.setOutputStateChangeListener(new StateChangeListener()
+ {
+
+ public void onStateChange(final boolean active)
+ {
+ synchronized (lock)
+ {
+ lock.notifyAll();
+ }
+ }
+ });
+
+ synchronized(lock)
+ {
+ while(transport.isOpenForOutput())
+ {
+ _lastWrite = 0;
+ transport.getNextBytes(new BytesProcessor()
+ {
+
+ public void processBytes(final ByteBuffer buf)
+ {
+ _lastWrite = buf.remaining();
+ try
+ {
+ outputStream.write(buf.array(),
+ buf.arrayOffset() + buf.position(),
+ buf.limit() - buf.position());
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ });
+ if(_lastWrite == 0 && transport.isOpenForOutput())
+ {
+ try
+ {
+ lock.wait(1000);
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+ }
+ }
+ finally
+ {
+ if(_conn.closedForInput() && _conn.closedForOutput())
+ {
+ try
+ {
+ s.close();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+ }
+ });
+*/
+
+ _conn.open();
+
+ }
+ catch (IOException e)
+ {
+ throw new ConnectionException(e);
+ }
+
+
+ }
+
+
+
+ private void doRead(final AMQPTransport transport, final InputStream inputStream)
+ {
+ byte[] buf = new byte[2<<15];
+ ByteBuffer bbuf = ByteBuffer.wrap(buf);
+ final Object lock = new Object();
+ transport.setInputStateChangeListener(new StateChangeListener(){
+
+ public void onStateChange(final boolean active)
+ {
+ synchronized(lock)
+ {
+ lock.notifyAll();
+ }
+ }
+ });
+
+ try
+ {
+ int read;
+ while((read = inputStream.read(buf)) != -1)
+ {
+ bbuf.position(0);
+ bbuf.limit(read);
+
+ while(bbuf.hasRemaining() && transport.isOpenForInput())
+ {
+ transport.processBytes(bbuf);
+ }
+
+
+ }
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+
+ }
+
+ public Session createSession()
+ {
+ Session session = new Session(this,String.valueOf(_sessionCount++));
+ return session;
+ }
+
+ public ConnectionEndpoint getEndpoint()
+ {
+ return _conn;
+ }
+
+ private void doRead(final ConnectionHandler handler, final InputStream inputStream)
+ {
+ byte[] buf = new byte[2<<15];
+
+
+ try
+ {
+ int read;
+ boolean done = false;
+ while(!done && (read = inputStream.read(buf)) != -1)
+ {
+ ByteBuffer bbuf = ByteBuffer.wrap(buf, 0, read);
+ Binary b = new Binary(buf,0,read);
+
+ if(RAW_LOGGER.isLoggable(Level.FINE))
+ {
+ RAW_LOGGER.fine("RECV [" + _conn.getRemoteAddress() + "] : " + b.toString());
+ }
+ /*System.err.println(b);
+ System.err.println("XXX: " + bbuf.hasRemaining() + "; " + handler.isDone());
+ if(handler.isDone())
+ {
+ System.err.println(handler.getClass().getName() + "IS DONE!");
+ } */
+ while(bbuf.hasRemaining() && !handler.isDone())
+ {
+ handler.parse(bbuf);
+ }
+
+
+ }
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+
+ public void close()
+ {
+ _conn.close();
+
+ synchronized (_conn.getLock())
+ {
+ while(!_conn.closedForInput())
+ {
+ try
+ {
+ _conn.getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+
+ }
+ }
+ }
+ }
+
+
+ public static class ConnectionException extends Exception
+ {
+ public ConnectionException(Throwable cause)
+ {
+ super(cause);
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Demo.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Demo.java
new file mode 100644
index 0000000000..b58ce6bfe5
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Demo.java
@@ -0,0 +1,407 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Options;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Demo extends Util
+{
+ private static final String USAGE_STRING = "demo [options] <vendor> [<content> ...]\n\nOptions:";
+ private static final String OPCODE = "opcode";
+ private static final String ACTION = "action";
+ private static final String MESSAGE_ID = "message-id";
+ private static final String VENDOR = "vendor";
+ private static final String LOG = "log";
+ private static final String RECEIVED = "received";
+ private static final String TEST = "test";
+ private static final String APACHE = "apache";
+ private static final String SENT = "sent";
+ private static final String LINK_REF = "link-ref";
+ private static final String HOST = "host";
+ private static final String PORT = "port";
+ private static final String SASL_USER = "sasl-user";
+ private static final String SASL_PASSWORD = "sasl-password";
+ private static final String ROLE = "role";
+ private static final String ADDRESS = "address";
+ private static final String SENDER = "sender";
+ private static final String SEND_MESSAGE = "send-message";
+ private static final String ANNOUNCE = "announce";
+ private static final String MESSAGE_VENDOR = "message-vendor";
+ private static final String CREATE_LINK = "create-link";
+
+ public static void main(String[] args)
+ {
+ new Demo(args).run();
+ }
+
+ public Demo(String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasWindowSizeOption()
+ {
+ return false;
+ }
+
+ public void run()
+ {
+
+ try
+ {
+
+ final String vendor = getArgs()[0];
+ final String queue = "control";
+
+ String message = "";
+
+ Connection conn = newConnection();
+ Session session = conn.createSession();
+
+
+ Receiver responseReceiver;
+
+ responseReceiver = session.createTemporaryQueueReceiver();
+
+
+
+
+ responseReceiver.setCredit(UnsignedInteger.valueOf(getWindowSize()), true);
+
+
+
+ Sender s = session.createSender(queue, getWindowSize(), getMode());
+
+
+ Properties properties = new Properties();
+ properties.setMessageId(java.util.UUID.randomUUID());
+ properties.setReplyTo(responseReceiver.getAddress());
+
+ HashMap appPropMap = new HashMap();
+ ApplicationProperties appProperties = new ApplicationProperties(appPropMap);
+
+ appPropMap.put(OPCODE, ANNOUNCE);
+ appPropMap.put(VENDOR, vendor);
+ appPropMap.put(ADDRESS,responseReceiver.getAddress());
+
+ AmqpValue amqpValue = new AmqpValue(message);
+ Section[] sections = { properties, appProperties, amqpValue};
+ final Message message1 = new Message(Arrays.asList(sections));
+
+ s.send(message1);
+
+ Map<Object, Sender> sendingLinks = new HashMap<Object, Sender>();
+ Map<Object, Receiver> receivingLinks = new HashMap<Object, Receiver>();
+
+
+ boolean done = false;
+
+ while(!done)
+ {
+ boolean wait = true;
+ Message m = responseReceiver.receive(false);
+ if(m != null)
+ {
+ List<Section> payload = m.getPayload();
+ wait = false;
+ ApplicationProperties props = m.getApplicationProperties();
+ Map map = props.getValue();
+ String op = (String) map.get(OPCODE);
+ if("reset".equals(op))
+ {
+ for(Sender sender : sendingLinks.values())
+ {
+ try
+ {
+ sender.close();
+ Session session1 = sender.getSession();
+ session1.close();
+ session1.getConnection().close();
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ for(Receiver receiver : receivingLinks.values())
+ {
+ try
+ {
+ receiver.close();
+ receiver.getSession().close();
+ receiver.getSession().getConnection().close();
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ sendingLinks.clear();
+ receivingLinks.clear();
+ }
+ else if(CREATE_LINK.equals(op))
+ {
+ Object linkRef = map.get(LINK_REF);
+ String host = (String) map.get(HOST);
+ Object o = map.get(PORT);
+ int port = Integer.parseInt(String.valueOf(o));
+ String user = (String) map.get(SASL_USER);
+ String password = (String) map.get(SASL_PASSWORD);
+ String role = (String) map.get(ROLE);
+ String address = (String) map.get(ADDRESS);
+ System.err.println("Host: " + host + "\tPort: " + port + "\t user: " + user +"\t password: " + password);
+ try{
+
+
+ Connection conn2 = new Connection(host, port, user, password, host);
+ Session session2 = conn2.createSession();
+ if(sendingLinks.containsKey(linkRef))
+ {
+ try
+ {
+ sendingLinks.remove(linkRef).close();
+ }
+ catch (Exception e)
+ {
+
+ }
+ }
+ if(receivingLinks.containsKey(linkRef))
+ {
+ try
+ {
+ receivingLinks.remove(linkRef).close();
+ }
+ catch (Exception e)
+ {
+
+ }
+ }
+ if(SENDER.equals(role))
+ {
+
+ System.err.println("%%% Creating sender (" + linkRef + ")");
+ Sender sender = session2.createSender(address);
+ sendingLinks.put(linkRef, sender);
+ }
+ else
+ {
+
+ System.err.println("%%% Creating receiver (" + linkRef + ")");
+ Receiver receiver2 = session2.createReceiver(address);
+ receiver2.setCredit(UnsignedInteger.valueOf(getWindowSize()), true);
+
+ receivingLinks.put(linkRef, receiver2);
+ }
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ else if(SEND_MESSAGE.equals(op))
+ {
+ Sender sender = sendingLinks.get(map.get(LINK_REF));
+ Properties m2props = new Properties();
+ Object messageId = map.get(MESSAGE_ID);
+ m2props.setMessageId(messageId);
+ Map m2propmap = new HashMap();
+ m2propmap.put(OPCODE, TEST);
+ m2propmap.put(VENDOR, vendor);
+ ApplicationProperties m2appProps = new ApplicationProperties(m2propmap);
+ Message m2 = new Message(Arrays.asList(m2props, m2appProps, new AmqpValue("AMQP-"+messageId)));
+ sender.send(m2);
+
+ Map m3propmap = new HashMap();
+ m3propmap.put(OPCODE, LOG);
+ m3propmap.put(ACTION, SENT);
+ m3propmap.put(MESSAGE_ID, messageId);
+ m3propmap.put(VENDOR, vendor);
+ m3propmap.put(MESSAGE_VENDOR, vendor);
+
+
+ Message m3 = new Message(Arrays.asList(new ApplicationProperties(m3propmap),
+ new AmqpValue("AMQP-"+messageId)));
+ s.send(m3);
+
+ }
+
+ responseReceiver.acknowledge(m);
+ }
+ else
+ {
+ for(Map.Entry<Object, Receiver> entry : receivingLinks.entrySet())
+ {
+ m = entry.getValue().receive(false);
+ if(m != null)
+ {
+ wait = false;
+
+ System.err.println("%%% Received message from " + entry.getKey());
+
+ Properties mp = m.getProperties();
+ ApplicationProperties ap = m.getApplicationProperties();
+
+ Map m3propmap = new HashMap();
+ m3propmap.put(OPCODE, LOG);
+ m3propmap.put(ACTION, RECEIVED);
+ m3propmap.put(MESSAGE_ID, mp.getMessageId());
+ m3propmap.put(VENDOR, vendor);
+ m3propmap.put(MESSAGE_VENDOR, ap.getValue().get(VENDOR));
+
+ Message m3 = new Message(Arrays.asList(new ApplicationProperties(m3propmap),
+ new AmqpValue("AMQP-"+mp.getMessageId())));
+ s.send(m3);
+
+ entry.getValue().acknowledge(m);
+ }
+
+ }
+ }
+
+ if(wait)
+ {
+ try
+ {
+ Thread.sleep(500l);
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ }
+
+ }
+
+
+
+
+
+
+
+
+
+ s.close();
+ session.close();
+ conn.close();
+
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+
+ }
+
+ protected boolean hasSingleLinkPerConnectionMode()
+ {
+ return false;
+ }
+
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+ }
+
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Dump.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Dump.java
new file mode 100644
index 0000000000..f61fd64a61
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Dump.java
@@ -0,0 +1,116 @@
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.commons.cli.Options;
+
+public class Dump extends Util
+{
+ private static final String USAGE_STRING = "dump [options] <address>\n\nOptions:";
+
+
+ protected Dump(String[] args)
+ {
+ super(args);
+ }
+
+ public static void main(String[] args)
+ {
+ new Dump(args).run();
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected void printUsage(Options options)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected void run()
+ {
+ final String queue = getArgs()[0];
+
+ try
+ {
+ Connection conn = newConnection();
+
+ Session session = conn.createSession();
+
+
+ Sender s = session.createSender(queue, 10);
+
+ Message message = new Message("dump me");
+ message.setDeliveryTag(new Binary("dump".getBytes()));
+
+ s.send(message);
+
+ s.close();
+ session.close();
+ conn.close();
+
+ } catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ } catch (Sender.SenderClosingException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filereceiver.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filereceiver.java
new file mode 100644
index 0000000000..43ddd6ca25
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filereceiver.java
@@ -0,0 +1,327 @@
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Options;
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.util.*;
+
+public class Filereceiver extends Util
+{
+ private static final String USAGE_STRING = "filereceiver [options] <address> <directory>\n\nOptions:";
+
+ protected Filereceiver(String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+
+ }
+
+ @Override
+ protected void run()
+ {
+ final String queue = getArgs()[0];
+ final String directoryName = getArgs()[1];
+
+ try
+ {
+ Connection conn = newConnection();
+
+ Session session = conn.createSession();
+
+ final File directory = new File(directoryName);
+ if(directory.isDirectory() && directory.canWrite())
+ {
+ File tmpDirectory = new File(directoryName, ".tmp");
+ if(!tmpDirectory.exists())
+ {
+ tmpDirectory.mkdir();
+ }
+
+ String[] unsettledFiles = tmpDirectory.list();
+
+ Map<Binary, Outcome> unsettled = new HashMap<Binary, Outcome>();
+ final Map<Binary, String> unsettledFileNames = new HashMap<Binary, String>();
+
+ Accepted accepted = new Accepted();
+
+ for(String fileName : unsettledFiles)
+ {
+ File theFile = new File(tmpDirectory, fileName);
+ if(theFile.isFile())
+ {
+ if(fileName.startsWith("~") && fileName.endsWith("~"))
+ {
+ theFile.delete();
+ }
+ else
+ {
+ int splitPoint = fileName.indexOf(".");
+ String deliveryTagStr = fileName.substring(0,splitPoint);
+ String actualFileName = fileName.substring(splitPoint+1);
+
+ byte[] bytes = new byte[deliveryTagStr.length()/2];
+
+
+ for(int i = 0; i < bytes.length; i++)
+ {
+ char c = deliveryTagStr.charAt(2*i);
+ char d = deliveryTagStr.charAt(1+(2*i));
+
+ bytes[i] = (byte) (((c <= '9' ? c - '0' : c - 'W') << 4)
+ | (d <= '9' ? d - '0' : d - 'W'));
+
+ }
+ Binary deliveryTag = new Binary(bytes);
+ unsettled.put(deliveryTag, accepted);
+ unsettledFileNames.put(deliveryTag, fileName);
+ }
+ }
+
+ }
+
+ Receiver r = session.createReceiver(queue, AcknowledgeMode.EO, getLinkName(), isDurableLink(),
+ unsettled);
+
+ Map<Binary, Outcome> remoteUnsettled = r.getRemoteUnsettled();
+
+ for(Map.Entry<Binary, String> entry : unsettledFileNames.entrySet())
+ {
+ if(remoteUnsettled == null || !remoteUnsettled.containsKey(entry.getKey()))
+ {
+
+ File tmpFile = new File(tmpDirectory, entry.getValue());
+ final File dest = new File(directory,
+ entry.getValue().substring(entry.getValue().indexOf(".") + 1));
+ if(dest.exists())
+ {
+ System.err.println("Duplicate detected - filename " + dest.getName());
+ }
+
+ tmpFile.renameTo(dest);
+ }
+ }
+
+
+ int credit = 10;
+
+ r.setCredit(UnsignedInteger.valueOf(credit), true);
+
+
+ int received = 0;
+ Message m = null;
+ do
+ {
+ m = isBlock() && received == 0 ? r.receive() : r.receive(10000);
+ if(m != null)
+ {
+ if(m.isResume() && unsettled.containsKey(m.getDeliveryTag()))
+ {
+ final String tmpFileName = unsettledFileNames.get(m.getDeliveryTag());
+ final File unsettledFile = new File(tmpDirectory,
+ tmpFileName);
+ r.acknowledge(m, new Receiver.SettledAction()
+ {
+ public void onSettled(final Binary deliveryTag)
+ {
+ int splitPoint = tmpFileName.indexOf(".");
+
+ String fileName = tmpFileName.substring(splitPoint+1);
+
+ final File dest = new File(directory, fileName);
+ if(dest.exists())
+ {
+ System.err.println("Duplicate detected - filename " + dest.getName());
+ }
+ unsettledFile.renameTo(dest);
+ unsettledFileNames.remove(deliveryTag);
+ }
+ });
+ }
+ else
+ {
+ received++;
+ List<Section> sections = m.getPayload();
+ Binary deliveryTag = m.getDeliveryTag();
+ StringBuilder tagNameBuilder = new StringBuilder();
+
+ ByteBuffer dtbuf = deliveryTag.asByteBuffer();
+ while(dtbuf.hasRemaining())
+ {
+ tagNameBuilder.append(String.format("%02x", dtbuf.get()));
+ }
+
+
+ ApplicationProperties properties = null;
+ List<Binary> data = new ArrayList<Binary>();
+ int totalSize = 0;
+ for(Section section : sections)
+ {
+ if(section instanceof ApplicationProperties)
+ {
+ properties = (ApplicationProperties) section;
+ }
+ else if(section instanceof AmqpValue)
+ {
+ AmqpValue value = (AmqpValue) section;
+ if(value.getValue() instanceof Binary)
+ {
+ Binary binary = (Binary) value.getValue();
+ data.add(binary);
+ totalSize += binary.getLength();
+
+ }
+ else
+ {
+ // TODO exception
+ }
+ }
+ else if(section instanceof Data)
+ {
+ Data value = (Data) section;
+ Binary binary = value.getValue();
+ data.add(binary);
+ totalSize += binary.getLength();
+
+ }
+ }
+ if(properties != null)
+ {
+ final String fileName = (String) properties.getValue().get("filename");
+ byte[] fileData = new byte[totalSize];
+ ByteBuffer buf = ByteBuffer.wrap(fileData);
+ int offset = 0;
+ for(Binary bin : data)
+ {
+ buf.put(bin.asByteBuffer());
+ }
+ File outputFile = new File(tmpDirectory, "~"+fileName+"~");
+ if(outputFile.exists())
+ {
+ outputFile.delete();
+ }
+ FileOutputStream fos = new FileOutputStream(outputFile);
+ fos.write(fileData);
+ fos.flush();
+ fos.close();
+
+ final File unsettledFile = new File(tmpDirectory, tagNameBuilder.toString() + "." +
+ fileName);
+ outputFile.renameTo(unsettledFile);
+ r.acknowledge(m, new Receiver.SettledAction()
+ {
+ public void onSettled(final Binary deliveryTag)
+ {
+ final File dest = new File(directory, fileName);
+ if(dest.exists())
+ {
+ System.err.println("Duplicate detected - filename " + dest.getName());
+ }
+ unsettledFile.renameTo(dest);
+
+ }
+ });
+
+ }
+ }
+ }
+ }
+ while(m != null);
+
+
+ r.close();
+ }
+ else
+ {
+ System.err.println("No such directory: " + directoryName);
+ }
+ session.close();
+ conn.close();
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace();
+ }
+ catch (FileNotFoundException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+
+ }
+
+ public static void main(String[] args)
+ {
+ new Filereceiver(args).run();
+ }
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filesender.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filesender.java
new file mode 100644
index 0000000000..83b305ac03
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filesender.java
@@ -0,0 +1,276 @@
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Outcome;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Options;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+
+public class Filesender extends Util
+{
+ private static final String USAGE_STRING = "filesender [options] <address> <directory>\n\nOptions:";
+
+ protected Filesender(String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+
+ }
+
+ @Override
+ protected void run()
+ {
+ final String queue = getArgs()[0];
+ final String directoryName = getArgs()[1];
+
+ try
+ {
+ MessageDigest md5 = MessageDigest.getInstance("MD5");
+ Connection conn = newConnection();
+
+ Session session = conn.createSession();
+
+ File directory = new File(directoryName);
+ if(directory.isDirectory() && directory.canWrite())
+ {
+
+ File tmpDirectory = new File(directoryName, ".tmp");
+ if(!tmpDirectory.exists())
+ {
+ tmpDirectory.mkdir();
+ }
+
+ String[] unsettledFiles = tmpDirectory.list();
+
+
+
+ Map<Binary, Outcome> unsettled = new HashMap<Binary, Outcome>();
+ Map<Binary, String> unsettledFileNames = new HashMap<Binary, String>();
+ for(String fileName : unsettledFiles)
+ {
+ File aFile = new File(tmpDirectory, fileName);
+ if(aFile.canRead() && aFile.canWrite())
+ {
+ Binary deliveryTag = new Binary(md5.digest(fileName.getBytes()));
+ unsettled.put(deliveryTag, null);
+ unsettledFileNames.put(deliveryTag, fileName);
+ }
+ }
+
+
+ Sender s = session.createSender(queue, 10, AcknowledgeMode.EO, getLinkName(), isDurableLink(),
+ unsettled);
+
+ Map<Binary, DeliveryState> remoteUnsettled = s.getRemoteUnsettled();
+
+ for(Map.Entry<Binary, String> entry: unsettledFileNames.entrySet())
+ {
+ if(remoteUnsettled == null || !remoteUnsettled.containsKey(entry.getKey()))
+ {
+ (new File(tmpDirectory, entry.getValue())).renameTo(new File(directory, entry.getValue()));
+ }
+ }
+
+ if(remoteUnsettled != null)
+ {
+ for(Map.Entry<Binary, DeliveryState> entry : remoteUnsettled.entrySet())
+ {
+ if(entry.getValue() instanceof Accepted)
+ {
+ final String fileName = unsettledFileNames.get(entry.getKey());
+ if(fileName != null)
+ {
+
+ Message resumed = new Message();
+ resumed.setDeliveryTag(entry.getKey());
+ resumed.setDeliveryState(entry.getValue());
+ resumed.setResume(Boolean.TRUE);
+ resumed.setSettled(Boolean.TRUE);
+
+
+
+ final File unsettledFile = new File(tmpDirectory, fileName);
+ unsettledFile.delete();
+
+ s.send(resumed);
+
+ }
+
+ }
+ else if(entry.getValue() instanceof Received || entry.getValue() == null)
+ {
+ final File unsettledFile = new File(tmpDirectory, unsettledFileNames.get(entry.getKey()));
+ Message resumed = createMessageFromFile(md5, unsettledFileNames.get(entry.getKey()), unsettledFile);
+ resumed.setResume(Boolean.TRUE);
+ Sender.OutcomeAction action = new Sender.OutcomeAction()
+ {
+ public void onOutcome(Binary deliveryTag, Outcome outcome)
+ {
+ if(outcome instanceof Accepted)
+ {
+ unsettledFile.delete();
+ }
+ }
+ };
+ s.send(resumed, action);
+
+ }
+ }
+ }
+
+
+
+ String[] files = directory.list();
+
+ for(String fileName : files)
+ {
+ final File file = new File(directory, fileName);
+
+ if(file.canRead() && file.canWrite() && !file.isDirectory())
+ {
+ Message message = createMessageFromFile(md5, fileName, file);
+
+ final File unsettledFile = new File(tmpDirectory, fileName);
+
+ Sender.OutcomeAction action = new Sender.OutcomeAction()
+ {
+ public void onOutcome(Binary deliveryTag, Outcome outcome)
+ {
+ if(outcome instanceof Accepted)
+ {
+ unsettledFile.delete();
+ }
+ }
+ };
+
+ file.renameTo(unsettledFile);
+
+ s.send(message, action);
+ }
+ }
+
+ s.close();
+ }
+ else
+ {
+ System.err.println("No such directory: " + directory);
+ }
+ session.close();
+ conn.close();
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace();
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ e.printStackTrace();
+ } catch (FileNotFoundException e)
+ {
+ e.printStackTrace();
+ } catch (IOException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ } catch (NoSuchAlgorithmException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ } catch (Sender.SenderClosingException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+
+ }
+
+ private Message createMessageFromFile(MessageDigest md5, String fileName, File file) throws IOException
+ {
+ FileInputStream fis = new FileInputStream(file);
+ byte[] data = new byte[(int) file.length()];
+
+ int read = fis.read(data);
+
+ fis.close();
+
+ Section applicationProperties = new ApplicationProperties(Collections.singletonMap("filename", fileName));
+ Section amqpValue = new Data(new Binary(data));
+ Message message = new Message(Arrays.asList(applicationProperties, amqpValue));
+ Binary deliveryTag = new Binary(md5.digest(fileName.getBytes()));
+ message.setDeliveryTag(deliveryTag);
+ md5.reset();
+ return message;
+ }
+
+ public static void main(String[] args)
+ {
+ new Filesender(args).run();
+ }
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Message.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Message.java
new file mode 100644
index 0000000000..7c1172898b
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Message.java
@@ -0,0 +1,148 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+public class Message
+{
+ private Binary _deliveryTag;
+ private List<Section> _payload = new ArrayList<Section>();
+ private Boolean _resume;
+ private boolean _settled;
+ private DeliveryState _deliveryState;
+ private Receiver _receiver;
+
+
+ public Message()
+ {
+ }
+
+ public Message(Collection<Section> sections)
+ {
+ _payload.addAll(sections);
+ }
+
+ public Message(Section section)
+ {
+ this(Collections.singletonList(section));
+ }
+
+ public Message(String message)
+ {
+ this(new AmqpValue(message));
+ }
+
+
+ public Binary getDeliveryTag()
+ {
+ return _deliveryTag;
+ }
+
+ public void setDeliveryTag(Binary deliveryTag)
+ {
+ _deliveryTag = deliveryTag;
+ }
+
+ public List<Section> getPayload()
+ {
+ return Collections.unmodifiableList(_payload);
+ }
+
+ private <T extends Section> T getSection(Class<T> clazz)
+ {
+ for(Section s : _payload)
+ {
+ if(clazz.isAssignableFrom(s.getClass()))
+ {
+ return (T) s;
+ }
+ }
+ return null;
+ }
+
+ public ApplicationProperties getApplicationProperties()
+ {
+ return getSection(ApplicationProperties.class);
+ }
+
+ public Properties getProperties()
+ {
+ return getSection(Properties.class);
+ }
+
+ public Header getHeader()
+ {
+ return getSection(Header.class);
+ }
+
+
+ public void setResume(final Boolean resume)
+ {
+ _resume = resume;
+ }
+
+ public boolean isResume()
+ {
+ return Boolean.TRUE.equals(_resume);
+ }
+
+ public void setDeliveryState(DeliveryState state)
+ {
+ _deliveryState = state;
+ }
+
+ public DeliveryState getDeliveryState()
+ {
+ return _deliveryState;
+ }
+
+ public void setSettled(boolean settled)
+ {
+ _settled = settled;
+ }
+
+ public boolean getSettled()
+ {
+ return _settled;
+ }
+
+ public void setReceiver(final Receiver receiver)
+ {
+ _receiver = receiver;
+ }
+
+ public Receiver getReceiver()
+ {
+ return _receiver;
+ }
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/ReadBytes.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/ReadBytes.java
new file mode 100644
index 0000000000..07ae54b54f
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/ReadBytes.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+
+public class ReadBytes
+{
+
+ public static void main(String[] args) throws IOException, AmqpErrorException
+ {
+
+ if(args.length == 0)
+ {
+ readBytes(System.in);
+ }
+ else
+ {
+ for(String fileName : args)
+ {
+ System.out.println("=========================== " + fileName + " ===========================");
+ final FileInputStream fis = new FileInputStream(fileName);
+ readBytes(fis);
+ fis.close();
+ }
+ }
+
+ }
+
+ private static void readBytes(final InputStream inputStream) throws IOException, AmqpErrorException
+ {
+ byte[] bytes = new byte[4096];
+
+ ValueHandler valueHandler = new ValueHandler(AMQPDescribedTypeRegistry.newInstance());
+
+ int count;
+
+ while((count = inputStream.read(bytes))!=-1)
+ {
+ ByteBuffer buf = ByteBuffer.wrap(bytes);
+ buf.limit(count);
+ while(buf.hasRemaining())
+ {
+
+ final Object value = valueHandler.parse(buf);
+ System.out.print((value == null ? "" : value.getClass().getName() + ":") +value +"\n");
+
+ }
+ }
+
+ }
+
+
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receive.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receive.java
new file mode 100644
index 0000000000..0da9dc3fb7
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receive.java
@@ -0,0 +1,246 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.commons.cli.*;
+import org.apache.qpid.amqp_1_0.type.messaging.ExactSubjectFilter;
+import org.apache.qpid.amqp_1_0.type.messaging.Filter;
+import org.apache.qpid.amqp_1_0.type.messaging.MatchingSubjectFilter;
+
+import java.util.Collections;
+
+public class Receive extends Util
+{
+ private static final String USAGE_STRING = "receive [options] <address> \n\nOptions:";
+ private static final UnsignedLong UNSIGNED_LONG_ONE = UnsignedLong.valueOf(1L);
+ private UnsignedLong _lastCorrelationId;
+
+ public static void main(String[] args)
+ {
+ new Receive(args).run();
+ }
+
+
+ public Receive(final String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasWindowSizeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasFilterOption()
+ {
+ return true;
+ }
+
+ protected void run()
+ {
+
+ try
+ {
+ final String queue = getArgs()[0];
+
+ String message = "";
+
+ Connection conn = newConnection();
+
+
+ Session session = conn.createSession();
+
+ Filter filter = null;
+ if(getFilter() != null)
+ {
+ String[] filterParts = getFilter().split("=",2);
+ if("exact-subject".equals(filterParts[0]))
+ {
+ filter = new ExactSubjectFilter(filterParts[1]);
+ }
+ else if("matching-subject".equals(filterParts[0]))
+ {
+ filter = new MatchingSubjectFilter(filterParts[1]);
+ }
+ else
+ {
+ System.err.println("Unknown filter type: " + filterParts[0]);
+ }
+ }
+
+ Receiver r =
+ filter == null
+ ? session.createReceiver(queue, getMode(), getLinkName(), isDurableLink())
+ : session.createReceiver(queue, getMode(), getLinkName(), isDurableLink(), Collections.singletonMap(Symbol.valueOf("filter"), filter), null);
+ Transaction txn = null;
+
+ int credit = 0;
+ int receivedCount = 0;
+
+ if(!useStdIn())
+ {
+ if(getArgs().length <= 2)
+ {
+
+ Transaction txn2 = null;
+ if(useTran())
+ {
+ txn = session.createSessionLocalTransaction();
+ txn2 = session.createSessionLocalTransaction();
+ }
+
+ for(int i = 0; i < getCount(); i++)
+ {
+
+ if(credit == 0)
+ {
+ if(getCount() - i <= getWindowSize())
+ {
+ credit = getCount() - i;
+
+ }
+ else
+ {
+ credit = getWindowSize();
+
+ }
+
+ {
+ r.setCredit(UnsignedInteger.valueOf(credit), false);
+ }
+ if(!isBlock())
+ r.drain();
+ }
+
+ Message m = isBlock() ? r.receive() : r.receive(1000L);
+ credit--;
+ if(m==null)
+ {
+ break;
+ }
+
+
+
+ r.acknowledge(m.getDeliveryTag(),txn);
+
+ receivedCount++;
+
+ System.out.println("Received Message : " + m.getPayload());
+ }
+
+ if(useTran())
+ {
+ txn.commit();
+ }
+ }
+ else
+ {
+ // TODO
+ }
+ }
+ else
+ {
+ // TODO
+ }
+ r.close();
+ session.close();
+ conn.close();
+ System.out.println("Total Messages Received: " + receivedCount);
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+
+ }
+
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+ }
+
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receiver.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receiver.java
new file mode 100644
index 0000000000..ad390fd498
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receiver.java
@@ -0,0 +1,561 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoder;
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.LinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkListener;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+import java.util.*;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+public class Receiver implements DeliveryStateHandler
+{
+ private ReceivingLinkEndpoint _endpoint;
+ private int _id;
+ private static final UnsignedInteger DEFAULT_INITIAL_CREDIT = UnsignedInteger.valueOf(100);
+ private Session _session;
+
+ private Queue<Transfer> _prefetchQueue = new ConcurrentLinkedQueue<Transfer>();
+ private Map<Binary, SettledAction> _unsettledMap = new HashMap<Binary, SettledAction>();
+ private MessageArrivalListener _messageArrivalListener;
+ private org.apache.qpid.amqp_1_0.type.transport.Error _error;
+
+ public Receiver(final Session session,
+ final String linkName,
+ final Target target,
+ final Source source,
+ final AcknowledgeMode ackMode) throws AmqpErrorException
+ {
+ this(session, linkName, target, source, ackMode, false);
+ }
+
+ public Receiver(final Session session,
+ final String linkName,
+ final Target target,
+ final Source source,
+ final AcknowledgeMode ackMode,
+ boolean isDurable) throws AmqpErrorException
+ {
+ this(session,linkName,target,source,ackMode,isDurable,null);
+ }
+
+ public Receiver(final Session session,
+ final String linkName,
+ final Target target,
+ final Source source,
+ final AcknowledgeMode ackMode,
+ final boolean isDurable,
+ final Map<Binary,Outcome> unsettled) throws AmqpErrorException
+ {
+
+ _session = session;
+ if(isDurable)
+ {
+ source.setDurable(TerminusDurability.UNSETTLED_STATE);
+ source.setExpiryPolicy(TerminusExpiryPolicy.NEVER);
+ }
+ else if(source != null)
+ {
+ source.setDurable(TerminusDurability.NONE);
+ source.setExpiryPolicy(TerminusExpiryPolicy.LINK_DETACH);
+ }
+ _endpoint = session.getEndpoint().createReceivingLinkEndpoint(linkName, target, source,
+ UnsignedInteger.ZERO);
+
+ _endpoint.setDeliveryStateHandler(this);
+
+ switch(ackMode)
+ {
+ case ALO:
+ _endpoint.setSendingSettlementMode(SenderSettleMode.UNSETTLED);
+ _endpoint.setReceivingSettlementMode(ReceiverSettleMode.FIRST);
+ break;
+ case AMO:
+ _endpoint.setSendingSettlementMode(SenderSettleMode.SETTLED);
+ _endpoint.setReceivingSettlementMode(ReceiverSettleMode.FIRST);
+ break;
+ case EO:
+ _endpoint.setSendingSettlementMode(SenderSettleMode.UNSETTLED);
+ _endpoint.setReceivingSettlementMode(ReceiverSettleMode.SECOND);
+ break;
+
+ }
+
+ _endpoint.setLinkEventListener(new ReceivingLinkListener.DefaultLinkEventListener()
+ {
+ @Override public void messageTransfer(final Transfer xfr)
+ {
+ _prefetchQueue.add(xfr);
+ postPrefetchAction();
+ }
+
+ @Override
+ public void remoteDetached(final LinkEndpoint endpoint, final Detach detach)
+ {
+ _error = detach.getError();
+ super.remoteDetached(endpoint, detach);
+ }
+ });
+
+ _endpoint.setLocalUnsettled(unsettled);
+ _endpoint.attach();
+
+ synchronized(_endpoint.getLock())
+ {
+ while(!_endpoint.isAttached() && !_endpoint.isDetached())
+ {
+ try
+ {
+ _endpoint.getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+
+ if(_endpoint.getSource() == null)
+ {
+ synchronized(_endpoint.getLock())
+ {
+ while(!_endpoint.isDetached())
+ {
+ try
+ {
+ _endpoint.getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+ throw new AmqpErrorException(getError());
+ }
+ else
+ {
+
+ }
+ }
+
+ private void postPrefetchAction()
+ {
+ if(_messageArrivalListener != null)
+ {
+ _messageArrivalListener.messageArrived(this);
+ }
+ }
+
+ public void setCredit(UnsignedInteger credit, boolean window)
+ {
+ _endpoint.setLinkCredit(credit);
+ _endpoint.setCreditWindow(window);
+
+ }
+
+
+ public String getAddress()
+ {
+ return ((Source)_endpoint.getSource()).getAddress();
+ }
+
+ public Map getFilter()
+ {
+ return ((Source)_endpoint.getSource()).getFilter();
+ }
+
+ public Message receive()
+ {
+ return receive(-1L);
+ }
+
+ public Message receive(boolean wait)
+ {
+ return receive(wait ? -1L : 0L);
+ }
+
+ // 0 means no wait, -1 wait forever
+ public Message receive(long wait)
+ {
+ Message m = null;
+ Transfer xfr;
+ long endTime = wait > 0L ? System.currentTimeMillis() + wait : 0L;
+
+ while((xfr = receiveFromPrefetch(wait)) != null )
+ {
+
+ if(!Boolean.TRUE.equals(xfr.getAborted()))
+ {
+ Binary deliveryTag = xfr.getDeliveryTag();
+ Boolean resume = xfr.getResume();
+
+ List<Section> sections = new ArrayList<Section>();
+ List<ByteBuffer> payloads = new ArrayList<ByteBuffer>();
+ int totalSize = 0;
+
+ boolean hasMore;
+ do
+ {
+ hasMore = Boolean.TRUE.equals(xfr.getMore());
+
+ ByteBuffer buf = xfr.getPayload();
+
+ if(buf != null)
+ {
+
+ totalSize += buf.remaining();
+
+ payloads.add(buf);
+ }
+ if(hasMore)
+ {
+ xfr = receiveFromPrefetch(0L);
+ if(xfr== null)
+ {
+ // TODO - this is wrong!!!!
+ System.out.println("eeek");
+ }
+ }
+ }
+ while(hasMore && !Boolean.TRUE.equals(xfr.getAborted()));
+
+ if(!Boolean.TRUE.equals(xfr.getAborted()))
+ {
+ ByteBuffer allPayload = ByteBuffer.allocate(totalSize);
+ for(ByteBuffer payload : payloads)
+ {
+ allPayload.put(payload);
+ }
+ allPayload.flip();
+ SectionDecoder decoder = _session.getSectionDecoder();
+
+ try
+ {
+ sections = decoder.parseAll(allPayload);
+ }
+ catch (AmqpErrorException e)
+ {
+ // todo - throw a sensible error
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ m = new Message(sections);
+ m.setDeliveryTag(deliveryTag);
+ m.setResume(resume);
+ m.setReceiver(this);
+ break;
+ }
+ }
+
+ if(wait > 0L)
+ {
+ wait = endTime - System.currentTimeMillis();
+ if(wait <=0L)
+ {
+ break;
+ }
+ }
+ }
+
+
+ return m;
+
+ }
+
+ private Transfer receiveFromPrefetch(long wait)
+ {
+ long endTime = ((wait >0L) ? (System.currentTimeMillis() + wait) : 0L);
+ final Object lock = _endpoint.getLock();
+ synchronized(lock)
+ {
+ Transfer xfr;
+ while(((xfr = _prefetchQueue.peek()) == null) && !_endpoint.isDrained() && !_endpoint.isDetached()
+ && wait != 0)
+ {
+ try
+ {
+ if(wait>0L)
+ {
+ lock.wait(wait);
+ }
+ else if(wait<0L)
+ {
+ lock.wait();
+ }
+ }
+ catch (InterruptedException e)
+ {
+ return null;
+ }
+ if(wait > 0L)
+ {
+ wait = endTime - System.currentTimeMillis();
+ if(wait <= 0L)
+ {
+ break;
+ }
+ }
+
+ }
+ if(xfr != null)
+ {
+ _prefetchQueue.poll();
+
+ }
+
+ return xfr;
+ }
+
+ }
+
+
+ public void release(final Message m)
+ {
+ release(m.getDeliveryTag());
+ }
+
+ public void release(Binary deliveryTag)
+ {
+ update(new Released(), deliveryTag, null, null);
+ }
+
+
+ public void modified(Binary tag)
+ {
+ final Modified outcome = new Modified();
+ outcome.setDeliveryFailed(true);
+
+ update(outcome, tag, null, null);
+ }
+
+ public void acknowledge(final Message m)
+ {
+ acknowledge(m.getDeliveryTag());
+ }
+
+ public void acknowledge(final Message m, SettledAction a)
+ {
+ acknowledge(m.getDeliveryTag(), a);
+ }
+
+
+ public void acknowledge(final Message m, Transaction txn)
+ {
+ acknowledge(m.getDeliveryTag(), txn);
+ }
+
+
+ public void acknowledge(final Binary deliveryTag)
+ {
+ acknowledge(deliveryTag, null, null);
+ }
+
+
+ public void acknowledge(final Binary deliveryTag, SettledAction a)
+ {
+ acknowledge(deliveryTag, null, a);
+ }
+
+ public void acknowledge(final Binary deliveryTag, final Transaction txn)
+ {
+ acknowledge(deliveryTag, txn, null);
+ }
+
+ public void acknowledge(final Binary deliveryTag, final Transaction txn, SettledAction action)
+ {
+ update(new Accepted(), deliveryTag, txn, action);
+ }
+
+ public void update(Outcome outcome, final Binary deliveryTag, final Transaction txn, SettledAction action)
+ {
+
+ DeliveryState state;
+ if(txn != null)
+ {
+ TransactionalState txnState = new TransactionalState();
+ txnState.setOutcome(outcome);
+ txnState.setTxnId(txn.getTxnId());
+ state = txnState;
+ }
+ else
+ {
+ state = (DeliveryState) outcome;
+ }
+ boolean settled = txn == null && !ReceiverSettleMode.SECOND.equals(_endpoint.getReceivingSettlementMode());
+
+ if(!(settled || action == null))
+ {
+ _unsettledMap.put(deliveryTag, action);
+ }
+
+ _endpoint.updateDisposition(deliveryTag,state, settled);
+ }
+
+ public Error getError()
+ {
+ return _error;
+ }
+
+ public void acknowledgeAll(Message m)
+ {
+ acknowledgeAll(m.getDeliveryTag());
+ }
+
+ public void acknowledgeAll(Binary deliveryTag)
+ {
+ acknowledgeAll(deliveryTag, null, null);
+ }
+
+ public void acknowledgeAll(Binary deliveryTag, final Transaction txn, SettledAction action)
+ {
+ updateAll(new Accepted(), deliveryTag, txn, action);
+ }
+
+ public void updateAll(Outcome outcome, Binary deliveryTag)
+ {
+ updateAll(outcome, deliveryTag, null, null);
+ }
+
+ public void updateAll(Outcome outcome, Binary deliveryTag, final Transaction txn, SettledAction action)
+ {
+ DeliveryState state;
+
+ if(txn != null)
+ {
+ TransactionalState txnState = new TransactionalState();
+ txnState.setOutcome(outcome);
+ txnState.setTxnId(txn.getTxnId());
+ state = txnState;
+ }
+ else
+ {
+ state = (DeliveryState) outcome;
+ }
+ boolean settled = txn == null && !ReceiverSettleMode.SECOND.equals(_endpoint.getReceivingSettlementMode());
+
+ if(!(settled || action == null))
+ {
+ _unsettledMap.put(deliveryTag, action);
+ }
+ _endpoint.updateAllDisposition(deliveryTag, state, settled);
+ }
+
+
+
+ public void close()
+ {
+ _endpoint.setTarget(null);
+ _endpoint.close();
+ Message msg;
+ while((msg = receive(-1l)) != null)
+ {
+ release(msg);
+ }
+
+ }
+
+
+ public void detach()
+ {
+ _endpoint.setTarget(null);
+ _endpoint.detach();
+ Message msg;
+ while((msg = receive(-1l)) != null)
+ {
+ release(msg);
+ }
+
+ }
+
+ public void drain()
+ {
+ _endpoint.drain();
+ }
+
+ public void setCreditWithTransaction(final UnsignedInteger credit, final Transaction txn)
+ {
+ _endpoint.setLinkCredit(credit);
+ _endpoint.setTransactionId(txn == null ? null : txn.getTxnId());
+ _endpoint.setCreditWindow(false);
+
+ }
+
+ public void handle(final Binary deliveryTag, final DeliveryState state, final Boolean settled)
+ {
+ if(Boolean.TRUE.equals(settled))
+ {
+ SettledAction action = _unsettledMap.remove(deliveryTag);
+ if(action != null)
+ {
+ action.onSettled(deliveryTag);
+ }
+ }
+ }
+
+ public Map<Binary, Outcome> getRemoteUnsettled()
+ {
+ return _endpoint.getInitialUnsettledMap();
+ }
+
+
+ public void setMessageArrivalListener(final MessageArrivalListener messageArrivalListener)
+ {
+ synchronized(_endpoint.getLock())
+ {
+ _messageArrivalListener = messageArrivalListener;
+ }
+ }
+
+ public Session getSession()
+ {
+ return _session;
+ }
+
+ public org.apache.qpid.amqp_1_0.type.Source getSource()
+ {
+ return _endpoint.getSource();
+ }
+
+ public static interface SettledAction
+ {
+ public void onSettled(Binary deliveryTag);
+ }
+
+
+ public interface MessageArrivalListener
+ {
+ void messageArrived(Receiver receiver);
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Request.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Request.java
new file mode 100644
index 0000000000..6e1d15376c
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Request.java
@@ -0,0 +1,249 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+import org.apache.commons.cli.*;
+
+import java.util.Arrays;
+
+public class Request extends Util
+{
+ private static final String USAGE_STRING = "request [options] <address> [<content> ...]\n\nOptions:";
+
+ public static void main(String[] args)
+ {
+ new Request(args).run();
+ }
+
+ public Request(String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasWindowSizeOption()
+ {
+ return true;
+ }
+
+ public void run()
+ {
+
+ try
+ {
+
+
+ final String queue = getArgs()[0];
+
+ String message = "";
+
+ Connection conn = newConnection();
+ Session session = conn.createSession();
+
+ Connection conn2;
+ Session session2;
+ Receiver responseReceiver;
+
+ if(isUseMultipleConnections())
+ {
+ conn2 = newConnection();
+ session2 = conn2.createSession();
+ responseReceiver = session2.createTemporaryQueueReceiver();
+ }
+ else
+ {
+ conn2 = null;
+ session2 = null;
+ responseReceiver = session.createTemporaryQueueReceiver();
+ }
+
+
+
+
+ responseReceiver.setCredit(UnsignedInteger.valueOf(getWindowSize()), true);
+
+
+
+ Sender s = session.createSender(queue, getWindowSize(), getMode());
+
+ Transaction txn = null;
+
+ if(useTran())
+ {
+ txn = session.createSessionLocalTransaction();
+ }
+
+ int received = 0;
+
+ if(getArgs().length >= 2)
+ {
+ message = getArgs()[1];
+ if(message.length() < getMessageSize())
+ {
+ StringBuilder builder = new StringBuilder(getMessageSize());
+ builder.append(message);
+ for(int x = message.length(); x < getMessageSize(); x++)
+ {
+ builder.append('.');
+ }
+ message = builder.toString();
+ }
+
+ for(int i = 0; i < getCount(); i++)
+ {
+ Properties properties = new Properties();
+ properties.setMessageId(UnsignedLong.valueOf(i));
+ properties.setReplyTo(responseReceiver.getAddress());
+
+ AmqpValue amqpValue = new AmqpValue(message);
+ Section[] sections = { new Header() , properties, amqpValue};
+ final Message message1 = new Message(Arrays.asList(sections));
+
+ s.send(message1, txn);
+
+ Message responseMessage = responseReceiver.receive(false);
+ if(responseMessage != null)
+ {
+ responseReceiver.acknowledge(responseMessage.getDeliveryTag(),txn);
+ received++;
+ }
+ }
+ }
+
+ if(txn != null)
+ {
+ txn.commit();
+ }
+
+
+ while(received < getCount())
+ {
+ Message responseMessage = responseReceiver.receive();
+ responseReceiver.acknowledge(responseMessage.getDeliveryTag());
+ received++;
+ }
+
+
+
+
+ s.close();
+ session.close();
+ conn.close();
+
+ if(session2 != null)
+ {
+ session2.close();
+ conn2.close();
+ }
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+
+ }
+
+ protected boolean hasSingleLinkPerConnectionMode()
+ {
+ return true;
+ }
+
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+ }
+
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Respond.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Respond.java
new file mode 100644
index 0000000000..8d9de4893f
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Respond.java
@@ -0,0 +1,347 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+import org.apache.commons.cli.*;
+
+import java.util.*;
+
+public class Respond extends Util
+{
+ private static final String USAGE_STRING = "respond [options] <address>\n\nOptions:";
+ private Connection _conn;
+ private Session _session;
+ private Receiver _receiver;
+ private Transaction _txn;
+ private Map<String,Sender> _senders;
+ private UnsignedLong _responseMsgId = UnsignedLong.ZERO;
+ private Connection _conn2;
+ private Session _session2;
+
+ public Respond(final String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasSingleLinkPerConnectionMode()
+ {
+ return true;
+ }
+
+
+ @Override
+ protected boolean hasWindowSizeOption()
+ {
+ return true;
+ }
+
+ public static void main(String[] args)
+ {
+ new Respond(args).run();
+ }
+
+ public void run()
+ {
+ try
+ {
+
+ _senders = new HashMap<String, Sender>();
+
+ final String queue = getArgs()[0];
+
+ String message = "";
+
+ _conn = newConnection();
+
+
+
+ if(isUseMultipleConnections())
+ {
+ _conn2 = newConnection();
+ _session2 = _conn2.createSession();
+ }
+
+
+ _session = _conn.createSession();
+
+
+ _receiver = _session.createReceiver(queue, getMode());
+ _txn = null;
+
+ int credit = 0;
+ int receivedCount = 0;
+ _responseMsgId = UnsignedLong.ZERO;
+
+ Random random = null;
+ int batch = 0;
+ List<Message> txnMessages = null;
+ if(useTran())
+ {
+ if(getRollbackRatio() != 0)
+ {
+ random = new Random();
+ }
+ batch = getBatchSize();
+ _txn = _session.createSessionLocalTransaction();
+ txnMessages = new ArrayList<Message>(batch);
+ }
+
+
+ for(int i = 0; receivedCount < getCount(); i++)
+ {
+
+ if(credit == 0)
+ {
+ if(getCount() - i <= getWindowSize())
+ {
+ credit = getCount() - i;
+
+ }
+ else
+ {
+ credit = getWindowSize();
+
+ }
+
+ _receiver.setCredit(UnsignedInteger.valueOf(credit), false);
+
+ if(!isBlock())
+ _receiver.drain();
+ }
+
+ Message m = isBlock() ? (receivedCount == 0 ? _receiver.receive() : _receiver.receive(10000L)) : _receiver.receive(1000L);
+ credit--;
+ if(m==null)
+ {
+ if(useTran() && batch != getBatchSize())
+ {
+ _txn.commit();
+ }
+ break;
+ }
+
+ System.out.println("Received Message: " + m.getPayload());
+
+ respond(m);
+
+
+
+ if(useTran())
+ {
+
+ txnMessages.add(m);
+
+ if(--batch == 0)
+ {
+
+ if(getRollbackRatio() == 0 || random.nextDouble() >= getRollbackRatio())
+ {
+ _txn.commit();
+ txnMessages.clear();
+ receivedCount += getBatchSize();
+ }
+ else
+ {
+ System.out.println("Random Rollback");
+ _txn.rollback();
+ double result;
+ do
+ {
+ _txn = _session.createSessionLocalTransaction();
+
+ for(Message msg : txnMessages)
+ {
+ respond(msg);
+ }
+
+ result = random.nextDouble();
+ if(result<getRollbackRatio())
+ {
+ _txn.rollback();
+ }
+ else
+ {
+ _txn.commit();
+ txnMessages.clear();
+ receivedCount += getBatchSize();
+ }
+ }
+ while(result < getRollbackRatio());
+ }
+ _txn = _session.createSessionLocalTransaction();
+
+ batch = getBatchSize();
+ }
+ }
+ else
+ {
+ receivedCount++;
+ }
+
+ }
+
+
+ for(Sender s : _senders.values())
+ {
+ s.close();
+ }
+
+ _receiver.close();
+ _session.close();
+ _conn.close();
+ System.out.println("Received: " + receivedCount);
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ }
+
+ private void respond(Message m) throws Sender.SenderCreationException
+ {
+ List<Section> sections = m.getPayload();
+ String replyTo = null;
+ Object correlationId = null;
+ for(Section section : sections)
+ {
+ if(section instanceof Properties)
+ {
+ replyTo = getResponseQueue() == null ? ((Properties)section).getReplyTo() : getResponseQueue();
+ correlationId = ((Properties) section).getMessageId();
+ break;
+ }
+ }
+
+ if(replyTo != null)
+ {
+ Sender s = _senders.get(replyTo);
+ if(s == null)
+ {
+ s = (isUseMultipleConnections() ? _session2 : _session).createSender(replyTo,getWindowSize());
+ _senders.put(replyTo, s);
+ }
+
+ List<Section> replySections = new ArrayList<Section>(sections);
+
+ ListIterator<Section> sectionIterator = replySections.listIterator();
+
+ while(sectionIterator.hasNext())
+ {
+ Section section = sectionIterator.next();
+ if(section instanceof Properties)
+ {
+ Properties newProps = new Properties();
+ newProps.setTo(replyTo);
+ newProps.setCorrelationId(correlationId);
+ newProps.setMessageId(_responseMsgId);
+ _responseMsgId = _responseMsgId.add(UnsignedLong.ONE);
+ sectionIterator.set(newProps);
+ }
+ }
+
+ Message replyMessage = new Message(replySections);
+ System.out.println("Sent Message: " + replySections);
+ s.send(replyMessage, _txn);
+
+ }
+ _receiver.acknowledge(m.getDeliveryTag(), _txn);
+ }
+
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+ }
+
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Send.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Send.java
new file mode 100644
index 0000000000..6f6575e083
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Send.java
@@ -0,0 +1,244 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.util.Arrays;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+import org.apache.qpid.amqp_1_0.type.messaging.Data;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+import org.apache.commons.cli.*;
+
+public class Send extends Util
+{
+ private static final String USAGE_STRING = "send [options] <address> [<content> ...]\n\nOptions:";
+ private static final char[] HEX = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
+
+
+ public static void main(String[] args) throws Sender.SenderCreationException, Sender.SenderClosingException, Connection.ConnectionException
+ {
+ new Send(args).run();
+ }
+
+
+ public Send(final String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasWindowSizeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasSubjectOption()
+ {
+ return true;
+ }
+
+ public void run()
+ {
+
+ final String queue = getArgs()[0];
+
+ String message = "";
+
+ try
+ {
+ Connection conn = newConnection();
+
+ Session session = conn.createSession();
+
+
+ Sender s = session.createSender(queue, getWindowSize(), getMode(), getLinkName());
+
+ Transaction txn = null;
+
+ if(useTran())
+ {
+ txn = session.createSessionLocalTransaction();
+ }
+
+ if(!useStdIn())
+ {
+ if(getArgs().length <= 2)
+ {
+ if(getArgs().length == 2)
+ {
+ message = getArgs()[1];
+ }
+ for(int i = 0; i < getCount(); i++)
+ {
+
+ Properties properties = new Properties();
+ properties.setMessageId(UnsignedLong.valueOf(i));
+ if(getSubject() != null)
+ {
+ properties.setSubject(getSubject());
+ }
+ Section bodySection;
+ byte[] bytes = (message + " " + i).getBytes();
+ if(bytes.length < getMessageSize())
+ {
+ byte[] origBytes = bytes;
+ bytes = new byte[getMessageSize()];
+ System.arraycopy(origBytes,0,bytes,0,origBytes.length);
+ for(int x = origBytes.length; x < bytes.length; x++)
+ {
+ bytes[x] = (byte) '.';
+ }
+ bodySection = new Data(new Binary(bytes));
+ }
+ else
+ {
+ bodySection = new AmqpValue(message + " " + i);
+ }
+
+ Section[] sections = {properties, bodySection};
+ final Message message1 = new Message(Arrays.asList(sections));
+
+ s.send(message1, txn);
+ }
+ }
+ else
+ {
+ for(int i = 1; i < getArgs().length; i++)
+ {
+ s.send(new Message(getArgs()[i]), txn);
+ }
+
+ }
+ }
+ else
+ {
+ LineNumberReader buf = new LineNumberReader(new InputStreamReader(System.in));
+
+
+ try
+ {
+ while((message = buf.readLine()) != null)
+ {
+ s.send(new Message(message), txn);
+ }
+ }
+ catch (IOException e)
+ {
+ // TODO
+ e.printStackTrace();
+ }
+ }
+
+ if(txn != null)
+ {
+ txn.commit();
+ }
+
+ s.close();
+
+ session.close();
+ conn.close();
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+
+
+ }
+
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+ }
+
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SendBytes.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SendBytes.java
new file mode 100644
index 0000000000..6f97ecd810
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SendBytes.java
@@ -0,0 +1,331 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.codec.FrameWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedByte;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+import org.apache.qpid.amqp_1_0.type.messaging.Footer;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+import org.apache.qpid.amqp_1_0.type.transport.Flow;
+
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class SendBytes
+{
+
+ public static void main(String[] args) throws
+ Sender.SenderCreationException,
+ Sender.SenderClosingException,
+ Connection.ConnectionException,
+ IOException, ParseException
+ {
+ Transfer xfr = new Transfer();
+ Flow fs = new Flow();
+ fs.setIncomingWindow(UnsignedInteger.valueOf(1024));
+ fs.setDeliveryCount(UnsignedInteger.valueOf(2));
+ fs.setLinkCredit(UnsignedInteger.valueOf(18));
+ fs.setAvailable(UnsignedInteger.valueOf(0));
+ fs.setDrain(false);
+
+ xfr.setHandle(UnsignedInteger.valueOf(0));
+ xfr.setDeliveryTag(new Binary("\"queue\"<-6ec024a7-d98e-4196-9348-15f6026c32ca:0".getBytes()));
+ //xfr.setDeliveryTag(new Binary(new byte[] {0}));
+ xfr.setDeliveryId(UnsignedInteger.valueOf(0));
+ xfr.setSettled(true);
+
+
+ Header h = new Header();
+ Properties p = new Properties();
+ p.setTo("queue");
+ //p.setMessageId(new Binary(UUID.randomUUID().toString().getBytes()));
+
+ Footer f = new Footer(Collections.EMPTY_MAP);
+
+ Section[] sections = new Section[] { h,p,f};
+ //Section[] sections = new Section[] { b };
+ //Section[] sections = { h,p, b};
+/*
+ Fragment[] fragments = new Fragment[5];
+
+ final AMQPDescribedTypeRegistry typeRegistry = AMQPDescribedTypeRegistry.newInstance().registerTransportLayer().registerMessagingLayer();
+
+ SectionEncoderImpl encoder = new SectionEncoderImpl(typeRegistry);
+
+ int num = 0;
+ int i = 0;
+ for(Section s : sections)
+ {
+ Fragment frag = new Fragment();
+
+ frag.setPayload(s.encode(encoder));
+ frag.setFirst(true);
+ frag.setLast(true);
+ frag.setSectionCode(s.getSectionCode());
+ frag.setSectionNumber(UnsignedInteger.valueOf(num++));
+ frag.setSectionOffset(UnsignedLong.valueOf(0L));
+ fragments[i++] =frag;
+ }
+
+ xfr.setFragments(fragments);
+*/
+
+ encodeTypes("xfr",xfr);
+
+ final byte[] result;
+ final Object input = xfr;
+/*
+ result = encode(1024, input);
+
+ boolean ok = true;
+
+ for(int j = 10; ok && j < 400; j++)
+ {
+
+ byte[] result2 = encode(j,input);
+
+ for(int i = 0; i <400; i++)
+ {
+ if(result[i] != result2[i])
+ {
+ System.out.println("result differs at " + i + " Splitting at " + j+ " [" + result[i] + " - " + result2[i] + "]");
+ //break;
+ //ok = false;
+
+ }
+ }
+ }*/
+ //System.out.println(Arrays.equals(result, result2));
+
+ //doEncodes();
+ /*OutputStream out = System.out;
+ if(args.length > 0)
+ {
+ out = new FileOutputStream(args[0]);
+ }
+
+ Transfer xfr = new Transfer();
+ fs.setSessionCredit(UnsignedInteger.valueOf(1024));
+ fs.setTransferCount(UnsignedInteger.valueOf(2));
+ fs.setLinkCredit(UnsignedInteger.valueOf(18));
+ fs.setAvailable(UnsignedInteger.valueOf(0));
+ fs.setDrain(false);
+
+ xfr.setHandle(UnsignedInteger.valueOf(0));
+ //xfr.setDeliveryTag(new Binary("\"queue\"<-6ec024a7-d98e-4196-9348-15f6026c32ca:0".getBytes()));
+ xfr.setDeliveryTag(new Binary(new byte[] {0}));
+ xfr.setTransferId(UnsignedInteger.valueOf(0));
+ xfr.setSettled(true);
+ xfr.setFlowState(fs);
+
+ Header h = new Header();
+ h.setTransmitTime(new Date(System.currentTimeMillis()));
+ Properties p = new Properties();
+ p.setTo(new Address("queue"));
+ //p.setMessageId(new Binary(UUID.randomUUID().toString().getBytes()));
+ AmqpMapSection m = new AmqpMapSection();
+ DataSection b = new DataSection("Hello World!".getBytes());
+
+ Footer f = new Footer();
+
+ Section[] sections = new Section[] { h,p,m,b,f};
+ //Section[] sections = new Section[] { b };
+ //Section[] sections = { h,p, b};
+ List<Fragment> fragments = new ArrayList<Fragment>(5);
+
+ final AMQPDescribedTypeRegistry typeRegistry = AMQPDescribedTypeRegistry.newInstance();
+
+ SectionEncoderImpl encoder = new SectionEncoderImpl(typeRegistry);
+
+ for(Section s : sections)
+ {
+ Fragment frag = new Fragment();
+
+ frag.setPayload(s.encode(encoder));
+ frag.setFirst(true);
+ frag.setLast(true);
+ frag.setFormatCode(s.getSectionCode());
+ frag.setFragmentOffset(null);
+ fragments.add(frag);
+ }
+
+ xfr.setFragments(fragments);
+
+
+ Object[] objectsToWrite = new Object[] { xfr };
+ ByteBuffer buf = ByteBuffer.allocate(4096);
+
+
+ for(Object obj : objectsToWrite)
+ {
+ ValueWriter writer = typeRegistry.getValueWriter(obj);
+
+ int count;
+
+
+ do
+ {
+ count = writer.writeToBuffer(buf);
+ out.write(buf.array(), buf.arrayOffset(), count);
+ buf.clear();
+ } while (!writer.isComplete());
+
+ }
+
+ out.flush();
+ out.close();*/
+
+ }
+
+ public static void doEncodes() throws IOException, ParseException
+ {
+ encodeTypes("boolean", Boolean.TRUE, Boolean.FALSE);
+ encodeTypes("ubyte", UnsignedByte.valueOf((byte)0), UnsignedByte.valueOf((byte)1 ),UnsignedByte.valueOf((byte)3), UnsignedByte.valueOf((byte)42), UnsignedByte.valueOf("255"));
+ encodeTypes("byte", Byte.valueOf((byte)0), Byte.valueOf( (byte)1), Byte.valueOf((byte) 3), Byte.valueOf((byte) 42), Byte.valueOf((byte) 127), Byte.valueOf((byte) -1), Byte.valueOf((byte) -3), Byte.valueOf((byte) -42), Byte.valueOf( (byte)-128));
+ encodeTypes("ushort", UnsignedShort.valueOf((short)0), UnsignedShort.valueOf((short)1), UnsignedShort.valueOf((short)3), UnsignedShort.valueOf((short)42), UnsignedShort.valueOf("65535"));
+ encodeTypes("short", Short.valueOf((short)0), Short.valueOf((short)1), Short.valueOf((short)3), Short.valueOf((short)42), Short.valueOf((short)32767), Short.valueOf((short)-1), Short.valueOf((short)-3), Short.valueOf((short)-42), Short.valueOf((short)-32768));
+ encodeTypes("uint",UnsignedInteger.valueOf(0), UnsignedInteger.valueOf(1), UnsignedInteger.valueOf(3), UnsignedInteger.valueOf(42), UnsignedInteger.valueOf("4294967295"));
+ encodeTypes("int", 0, 1, 3, 42, 2147483647, -1, -3, -42, -2147483648);
+ encodeTypes("ulong", UnsignedLong.valueOf(0), UnsignedLong.valueOf(1), UnsignedLong.valueOf(3), UnsignedLong.valueOf(42), UnsignedLong.valueOf("18446744073709551615"));
+ encodeTypes("long", 0l, 1l, 3l, 42l, 9223372036854775807l, -1l, -3l, -42l, -9223372036854775808l);
+ encodeTypes("float", 3.14159);
+ encodeTypes("double", Double.valueOf(3.14159265359));
+ encodeTypes("char", '?');
+
+ SimpleDateFormat df = new SimpleDateFormat("HHa z MMM d yyyy");
+
+ encodeTypes("timestamp", df.parse("9AM PST Dec 6 2010"), df.parse("9AM PST Dec 6 1910"));
+ encodeTypes("uuid", UUID.fromString("f275ea5e-0c57-4ad7-b11a-b20c563d3b71"));
+ encodeTypes("binary", new Binary( new byte[] {(byte)0xDE, (byte)0xAD, (byte)0xBE, (byte)0xEF}), new Binary(new byte[] { (byte)0xCA,(byte)0xFE, (byte)0xBA, (byte)0xBE}));
+ encodeTypes("string", "The quick brown fox jumped over the lazy cow.");
+ encodeTypes("symbol", Symbol.valueOf("connectathon"));
+ encodeTypes("list", Arrays.asList(new Object[] {Long.valueOf(1), "two", Double.valueOf(3.14159265359), null, Boolean.FALSE}));
+ Map map = new HashMap();
+ map.put("one", Long.valueOf(1));
+ map.put("two", Long.valueOf(2));
+ map.put("pi", Double.valueOf(3.14159265359));
+ map.put("list:", Arrays.asList(new Object[] {Long.valueOf(1), "two", Double.valueOf(3.14159265359), null, Boolean.FALSE}));
+ map.put(null, Boolean.TRUE);
+ encodeTypes("map", map);
+ encodeTypes("null", null);
+
+ }
+
+ static void encodeTypes(String name, Object... vals ) throws IOException
+ {
+ FileOutputStream out = new FileOutputStream("/home/rob/"+name+".out");
+ ByteBuffer buf = ByteBuffer.allocate(4096);
+ final AMQPDescribedTypeRegistry typeRegistry = AMQPDescribedTypeRegistry.newInstance();
+
+ if(vals != null)
+ {
+ for(Object obj : vals)
+ {
+ ValueWriter writer = typeRegistry.getValueWriter(obj);
+
+ int count;
+
+
+ do
+ {
+ count = writer.writeToBuffer(buf);
+ out.write(buf.array(), buf.arrayOffset(), count);
+ buf.clear();
+ } while (!writer.isComplete());
+
+ }
+ }
+ else
+ {
+ ValueWriter writer = typeRegistry.getValueWriter(null);
+
+ int count;
+
+
+ do
+ {
+ count = writer.writeToBuffer(buf);
+ out.write(buf.array(), buf.arrayOffset(), count);
+ buf.clear();
+ } while (!writer.isComplete());
+
+ }
+ out.flush();
+ out.close();
+
+ }
+
+ static byte[] encode(int size, Object... vals)
+ {
+ byte[] result = new byte[10000];
+ int pos = 0;
+
+ final AMQPDescribedTypeRegistry typeRegistry = AMQPDescribedTypeRegistry.newInstance();
+ AMQFrame frame = AMQFrame.createAMQFrame((short) 0, (FrameBody) vals[0]);
+ FrameWriter writer = new FrameWriter(typeRegistry);
+ /*for(Object obj : vals)
+ {
+ final AMQPDescribedTypeRegistry typeRegistry = AMQPDescribedTypeRegistry.newInstance();
+ ValueWriter writer = typeRegistry.getValueWriter(obj);
+*/
+ int count;
+
+ ByteBuffer buf = ByteBuffer.wrap(result, pos, size);
+
+ do
+ {
+
+ writer.writeToBuffer(buf);
+ pos = buf.position();
+ buf = ByteBuffer.wrap(result, pos, size);
+ if(!writer.isComplete())
+ {
+ count = 3;
+ }
+
+ } while (!writer.isComplete());
+/*
+
+ }
+*/
+
+ return result;
+
+ }
+
+
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Sender.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Sender.java
new file mode 100644
index 0000000000..c20eec6c8e
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Sender.java
@@ -0,0 +1,392 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.Source;
+import org.apache.qpid.amqp_1_0.type.Target;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+import java.nio.ByteBuffer;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Sender implements DeliveryStateHandler
+{
+ private SendingLinkEndpoint _endpoint;
+ private int _id;
+ private Session _session;
+ private int _windowSize;
+ private Map<Binary, OutcomeAction> _outcomeActions = Collections.synchronizedMap(new HashMap<Binary, OutcomeAction>());
+ private boolean _closed;
+
+ public Sender(final Session session, final String linkName, final String targetAddr, final String sourceAddr)
+ throws SenderCreationException
+ {
+ this(session, linkName, targetAddr, sourceAddr, false);
+ }
+
+ public Sender(final Session session, final String linkName, final String targetAddr, final String sourceAddr,
+ boolean synchronous)
+ throws SenderCreationException
+ {
+ this(session, linkName, targetAddr, sourceAddr, synchronous ? 1 : 0);
+ }
+
+ public Sender(final Session session, final String linkName, final String targetAddr, final String sourceAddr,
+ int window) throws SenderCreationException
+ {
+ this(session, linkName, targetAddr, sourceAddr, window, AcknowledgeMode.ALO);
+ }
+
+
+ public Sender(final Session session, final String linkName, final org.apache.qpid.amqp_1_0.type.messaging.Target target, final org.apache.qpid.amqp_1_0.type.messaging.Source source,
+ int window) throws SenderCreationException
+ {
+ this(session, linkName, target, source, window, AcknowledgeMode.ALO);
+ }
+
+ public Sender(final Session session, final String linkName, final String targetAddr, final String sourceAddr,
+ int window, AcknowledgeMode mode)
+ throws SenderCreationException
+ {
+ this(session, linkName, targetAddr, sourceAddr, window, mode, null);
+ }
+
+ public Sender(final Session session, final String linkName, final org.apache.qpid.amqp_1_0.type.messaging.Target target, final org.apache.qpid.amqp_1_0.type.messaging.Source source,
+ int window, AcknowledgeMode mode)
+ throws SenderCreationException
+ {
+ this(session, linkName, target, source, window, mode, null);
+ }
+
+ public Sender(final Session session, final String linkName, final String targetAddr, final String sourceAddr,
+ int window, AcknowledgeMode mode, Map<Binary, Outcome> unsettled)
+ throws SenderCreationException
+ {
+ this(session, linkName, targetAddr, sourceAddr, window, mode, false, unsettled);
+ }
+
+ public Sender(final Session session, final String linkName, final String targetAddr, final String sourceAddr,
+ int window, AcknowledgeMode mode, boolean isDurable, Map<Binary, Outcome> unsettled)
+ throws SenderCreationException
+ {
+ this(session, linkName, createTarget(targetAddr, isDurable), createSource(sourceAddr), window, mode, unsettled);
+ }
+
+ private static org.apache.qpid.amqp_1_0.type.messaging.Source createSource(final String sourceAddr)
+ {
+ org.apache.qpid.amqp_1_0.type.messaging.Source source = new org.apache.qpid.amqp_1_0.type.messaging.Source();
+ source.setAddress(sourceAddr);
+ return source;
+ }
+
+ private static org.apache.qpid.amqp_1_0.type.messaging.Target createTarget(final String targetAddr, final boolean isDurable)
+ {
+ org.apache.qpid.amqp_1_0.type.messaging.Target target = new org.apache.qpid.amqp_1_0.type.messaging.Target();
+ target.setAddress(targetAddr);
+ if(isDurable)
+ {
+ target.setDurable(TerminusDurability.UNSETTLED_STATE);
+ target.setExpiryPolicy(TerminusExpiryPolicy.NEVER);
+ }
+ return target;
+ }
+
+ public Sender(final Session session, final String linkName, final org.apache.qpid.amqp_1_0.type.messaging.Target target, final org.apache.qpid.amqp_1_0.type.messaging.Source source,
+ int window, AcknowledgeMode mode, Map<Binary, Outcome> unsettled)
+ throws SenderCreationException
+ {
+
+ _session = session;
+ _endpoint = session.getEndpoint().createSendingLinkEndpoint(linkName,
+ source, target, unsettled);
+
+
+ switch(mode)
+ {
+ case ALO:
+ _endpoint.setSendingSettlementMode(SenderSettleMode.UNSETTLED);
+ _endpoint.setReceivingSettlementMode(ReceiverSettleMode.FIRST);
+ break;
+ case AMO:
+ _endpoint.setSendingSettlementMode(SenderSettleMode.SETTLED);
+ break;
+ case EO:
+ _endpoint.setSendingSettlementMode(SenderSettleMode.UNSETTLED);
+ _endpoint.setReceivingSettlementMode(ReceiverSettleMode.SECOND);
+ break;
+
+ }
+ _endpoint.setDeliveryStateHandler(this);
+ _endpoint.attach();
+ _windowSize = window;
+
+ synchronized(_endpoint.getLock())
+ {
+ while(!(_endpoint.isAttached() || _endpoint.isDetached()))
+ {
+ try
+ {
+ _endpoint.getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ throw new SenderCreationException(e);
+ }
+ }
+ if(_endpoint.getTarget()== null)
+ {
+ throw new SenderCreationException("Peer did not create remote endpoint for link, target: " + target.getAddress());
+ };
+ }
+ }
+
+ public Source getSource()
+ {
+ return _endpoint.getSource();
+ }
+
+ public Target getTarget()
+ {
+ return _endpoint.getTarget();
+ }
+
+ public void send(Message message)
+ {
+ send(message, null, null);
+ }
+
+ public void send(Message message, final OutcomeAction action)
+ {
+ send(message, null, action);
+ }
+
+ public void send(Message message, final Transaction txn)
+ {
+ send(message, txn, null);
+ }
+
+ public void send(Message message, final Transaction txn, OutcomeAction action)
+ {
+
+ List<Section> sections = message.getPayload();
+
+ Transfer xfr = new Transfer();
+
+ if(sections != null && !sections.isEmpty())
+ {
+ SectionEncoder encoder = _session.getSectionEncoder();
+ encoder.reset();
+
+ int sectionNumber = 0;
+ for(Section section : sections)
+ {
+ encoder.encodeObject(section);
+ }
+
+
+ Binary encoding = encoder.getEncoding();
+ ByteBuffer payload = encoding.asByteBuffer();
+ xfr.setPayload(payload);
+ }
+ if(message.getDeliveryTag() == null)
+ {
+ message.setDeliveryTag(new Binary(String.valueOf(_id++).getBytes()));
+ }
+ if(message.isResume())
+ {
+ xfr.setResume(Boolean.TRUE);
+ }
+ if(message.getDeliveryState() != null)
+ {
+ xfr.setState(message.getDeliveryState());
+ }
+
+ xfr.setDeliveryTag(message.getDeliveryTag());
+ //xfr.setSettled(_windowSize ==0);
+ if(txn != null)
+ {
+ xfr.setSettled(false);
+ TransactionalState deliveryState = new TransactionalState();
+ deliveryState.setTxnId(txn.getTxnId());
+ xfr.setState(deliveryState);
+ }
+ else
+ {
+ xfr.setSettled(message.getSettled() || _endpoint.getSendingSettlementMode() == SenderSettleMode.SETTLED);
+ }
+ final Object lock = _endpoint.getLock();
+ synchronized(lock)
+ {
+ while(!_endpoint.hasCreditToSend())
+ {
+ try
+ {
+ lock.wait();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ if(action != null)
+ {
+ _outcomeActions.put(message.getDeliveryTag(), action);
+ }
+ _endpoint.transfer(xfr);
+ //TODO - rationalise sending of flows
+ // _endpoint.sendFlow();
+ }
+
+ if(_windowSize != 0)
+ {
+ synchronized(lock)
+ {
+
+
+ while(_endpoint.getUnsettledCount() >= _windowSize)
+ {
+ try
+ {
+ lock.wait();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+
+ }
+
+
+ }
+
+ public void close() throws SenderClosingException
+ {
+
+ if(_windowSize != 0)
+ {
+ synchronized(_endpoint.getLock())
+ {
+
+
+ while(_endpoint.getUnsettledCount() > 0)
+ {
+ try
+ {
+ _endpoint.getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+
+ }
+ _session.removeSender(this);
+ _endpoint.setSource(null);
+ _endpoint.detach();
+ _closed = true;
+
+ synchronized(_endpoint.getLock())
+ {
+ while(!_endpoint.isDetached())
+ {
+ try
+ {
+ _endpoint.getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ throw new SenderClosingException(e);
+ }
+ }
+ }
+ }
+
+ public boolean isClosed()
+ {
+ return _closed;
+ }
+
+ public void handle(Binary deliveryTag, DeliveryState state, Boolean settled)
+ {
+ if(state instanceof Outcome)
+ {
+ OutcomeAction action;
+ if((action = _outcomeActions.remove(deliveryTag)) != null)
+ {
+ action.onOutcome(deliveryTag, (Outcome) state);
+ }
+ if(!Boolean.TRUE.equals(settled))
+ {
+ _endpoint.updateDisposition(deliveryTag, state, true);
+ }
+ }
+ }
+
+ public Map<Binary, DeliveryState> getRemoteUnsettled()
+ {
+ return _endpoint.getInitialUnsettledMap();
+ }
+
+ public Session getSession()
+ {
+ return _session;
+ }
+
+ public class SenderCreationException extends Exception
+ {
+ public SenderCreationException(Throwable e)
+ {
+ super(e);
+ }
+
+ public SenderCreationException(String e)
+ {
+ super(e);
+
+ }
+ }
+
+ public class SenderClosingException extends Exception
+ {
+ public SenderClosingException(Throwable e)
+ {
+ super(e);
+ }
+ }
+
+ public static interface OutcomeAction
+ {
+ public void onOutcome(Binary deliveryTag, Outcome outcome);
+ }
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Session.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Session.java
new file mode 100644
index 0000000000..5e1e1b1d7c
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Session.java
@@ -0,0 +1,354 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoder;
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoderImpl;
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoderImpl;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SessionEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SessionState;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Filter;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.StdDistMode;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+import org.apache.qpid.amqp_1_0.type.transaction.TxnCapability;
+import org.apache.qpid.amqp_1_0.type.transport.ReceiverSettleMode;
+import org.apache.qpid.amqp_1_0.type.transport.SenderSettleMode;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+public class Session
+{
+ private SessionEndpoint _endpoint;
+ private List<Receiver> _receivers = new ArrayList<Receiver>();
+ private List<Sender> _senders = new ArrayList<Sender>();
+ private SectionEncoder _sectionEncoder;
+ private SectionDecoder _sectionDecoder;
+ private TransactionController _sessionLocalTC;
+ private Connection _connection;
+
+ public Session(final Connection connection, String name)
+ {
+ _connection = connection;
+ _endpoint = connection.getEndpoint().createSession(name);
+ _sectionEncoder = new SectionEncoderImpl(connection.getEndpoint().getDescribedTypeRegistry());
+ _sectionDecoder = new SectionDecoderImpl(connection.getEndpoint().getDescribedTypeRegistry());
+ }
+
+
+ public synchronized Sender createSender(final String targetName) throws Sender.SenderCreationException
+ {
+ return createSender(targetName, false);
+ }
+
+ public synchronized Sender createSender(final String targetName, boolean synchronous) throws Sender.SenderCreationException
+ {
+
+ final String sourceName = UUID.randomUUID().toString();
+ return new Sender(this, targetName+"<-"+sourceName, targetName, sourceName, synchronous);
+
+ }
+
+ public synchronized Sender createSender(final String targetName, int window) throws Sender.SenderCreationException
+ {
+ final String sourceName = UUID.randomUUID().toString();
+ return new Sender(this, targetName+"<-"+sourceName, targetName, sourceName, window);
+
+ }
+
+ public Sender createSender(String targetName, int window, AcknowledgeMode mode) throws Sender.SenderCreationException
+ {
+
+ return createSender(targetName, window, mode, null);
+ }
+
+ public Sender createSender(String targetName, int window, AcknowledgeMode mode, String linkName) throws Sender.SenderCreationException
+ {
+ return createSender(targetName, window, mode, linkName, null);
+ }
+ public Sender createSender(String targetName, int window, AcknowledgeMode mode, String linkName, Map<Binary, Outcome> unsettled) throws Sender.SenderCreationException
+ {
+ return createSender(targetName, window, mode, linkName, false, unsettled);
+ }
+
+ public Sender createSender(String targetName, int window, AcknowledgeMode mode, String linkName,
+ boolean isDurable, Map<Binary, Outcome> unsettled) throws Sender.SenderCreationException
+ {
+ return new Sender(this, linkName == null ? "->" + targetName + '(' + UUID.randomUUID().toString()+')': linkName,
+ targetName, null, window, mode, isDurable, unsettled);
+
+ }
+
+
+ public Receiver createReceiver(final String sourceAddr) throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, null, AcknowledgeMode.ALO);
+ }
+
+
+ public Receiver createReceiver(final String queue, final AcknowledgeMode mode) throws AmqpErrorException
+ {
+ return createReceiver(queue, null, mode);
+ }
+
+ public Receiver createReceiver(final String queue, final AcknowledgeMode mode, String linkName)
+ throws AmqpErrorException
+ {
+ return createReceiver(queue, null, mode, linkName);
+ }
+
+ public Receiver createReceiver(final String queue, final AcknowledgeMode mode, String linkName, boolean isDurable)
+ throws AmqpErrorException
+ {
+ return createReceiver(queue, null, mode, linkName, isDurable);
+ }
+
+ public Receiver createReceiver(final String queue, final AcknowledgeMode mode, String linkName, boolean isDurable,
+ Map<Symbol, Filter> filters, Map<Binary, Outcome> unsettled)
+ throws AmqpErrorException
+ {
+ return createReceiver(queue, null, mode, linkName, isDurable, filters, unsettled);
+ }
+
+
+ public Receiver createReceiver(final String queue, final AcknowledgeMode mode, String linkName,
+ boolean isDurable, Map<Binary, Outcome> unsettled) throws AmqpErrorException
+ {
+ return createReceiver(queue, null, mode, linkName, isDurable, unsettled);
+ }
+
+
+ private synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode)
+ throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, mode, AcknowledgeMode.ALO);
+ }
+
+ private synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode, String linkName)
+ throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, mode, AcknowledgeMode.ALO, linkName);
+ }
+
+
+ private synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode,
+ final AcknowledgeMode ackMode) throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, mode, ackMode, null);
+ }
+
+ private synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode,
+ final AcknowledgeMode ackMode, String linkName) throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr,mode, ackMode, linkName, false);
+ }
+
+ private synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode,
+ final AcknowledgeMode ackMode, String linkName, boolean isDurable)
+ throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, mode, ackMode, linkName, isDurable, null);
+ }
+
+ private synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode,
+ final AcknowledgeMode ackMode, String linkName, boolean isDurable,
+ Map<Binary, Outcome> unsettled) throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr,mode,ackMode, linkName, isDurable, null, unsettled);
+ }
+
+ public synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode,
+ final AcknowledgeMode ackMode, String linkName, boolean isDurable,
+ Map<Symbol, Filter> filters, Map<Binary, Outcome> unsettled)
+ throws AmqpErrorException
+ {
+
+ final Target target = new Target();
+ final Source source = new Source();
+ source.setAddress(sourceAddr);
+ source.setDistributionMode(mode);
+ source.setFilter(filters);
+
+ if(linkName == null)
+ {
+ linkName = sourceAddr + "-> (" + UUID.randomUUID().toString() + ")";
+ }
+
+ final Receiver receiver =
+ new Receiver(this, linkName,
+ target, source, ackMode, isDurable, unsettled);
+ _receivers.add(receiver);
+
+ return receiver;
+
+ }
+
+ public synchronized Receiver createCopyingReceiver(final String sourceAddr) throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, StdDistMode.COPY);
+ }
+
+ public synchronized Receiver createMovingReceiver(final String sourceAddr) throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, StdDistMode.MOVE);
+ }
+
+ public Receiver createTemporaryQueueReceiver() throws AmqpErrorException
+ {
+ Source source = new Source();
+ source.setDynamic(true);
+
+ final Receiver receiver = new Receiver(this, "tempSender"+UUID.randomUUID().toString(), new Target(),
+ source, AcknowledgeMode.ALO);
+ _receivers.add(receiver);
+ return receiver;
+ }
+
+ public Sender createTemporaryQueueSender() throws Sender.SenderCreationException
+ {
+ Target target = new Target();
+ target.setDynamic(true);
+
+ final Sender sender;
+ sender = new Sender(this, "tempSender"+ UUID.randomUUID().toString(), target,
+ new Source(), 0, AcknowledgeMode.ALO);
+ _senders.add(sender);
+ return sender;
+ }
+
+
+
+ public SessionEndpoint getEndpoint()
+ {
+ return _endpoint;
+ }
+
+ public synchronized void close()
+ {
+ try
+ {
+ for(Sender sender : new ArrayList<Sender>(_senders))
+ {
+ sender.close();
+ }
+ for(Receiver receiver : new ArrayList<Receiver>(_receivers))
+ {
+ receiver.detach();
+ }
+ if(_sessionLocalTC != null)
+ {
+ _sessionLocalTC.close();
+ }
+ _endpoint.end();
+ }
+ catch (Sender.SenderClosingException e)
+ {
+// TODO
+ e.printStackTrace();
+ }
+
+ //TODO
+
+ }
+
+ void removeSender(Sender sender)
+ {
+ _senders.remove(sender);
+ }
+
+ void removeReceiver(Receiver receiver)
+ {
+ _receivers.remove(receiver);
+ }
+
+ public SectionEncoder getSectionEncoder()
+ {
+ return _sectionEncoder;
+ }
+
+ public SectionDecoder getSectionDecoder()
+ {
+ return _sectionDecoder;
+ }
+
+
+ public Transaction createSessionLocalTransaction()
+ {
+ TransactionController localController = getSessionLocalTransactionController();
+ return localController.beginTransaction();
+ }
+
+ private TransactionController getSessionLocalTransactionController()
+ {
+ if(_sessionLocalTC == null)
+ {
+ _sessionLocalTC = createSessionLocalTransactionController();
+ }
+ return _sessionLocalTC;
+ }
+
+ private TransactionController createSessionLocalTransactionController()
+ {
+ String name = "txnControllerLink";
+ SendingLinkEndpoint tcLinkEndpoint = _endpoint.createTransactionController(name, TxnCapability.LOCAL_TXN,
+ TxnCapability.MULTI_TXNS_PER_SSN);
+ tcLinkEndpoint.setReceivingSettlementMode(ReceiverSettleMode.FIRST);
+ tcLinkEndpoint.setSendingSettlementMode(SenderSettleMode.UNSETTLED);
+ tcLinkEndpoint.attach();
+ return new TransactionController(this, tcLinkEndpoint);
+ }
+
+
+ public Message receive()
+ {
+ while(getEndpoint().getState() == SessionState.ACTIVE)
+ {
+ synchronized (getEndpoint().getLock())
+ {
+ try
+ {
+ for(Receiver r : _receivers)
+ {
+ Message m = r.receive(false);
+ if(m != null)
+ return m;
+ }
+ wait();
+ }
+ catch (InterruptedException e)
+ {
+ }
+ }
+ }
+ return null;
+ }
+
+ public Connection getConnection()
+ {
+ return _connection;
+ }
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Transaction.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Transaction.java
new file mode 100644
index 0000000000..a379463710
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Transaction.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+
+public class Transaction
+{
+ private TransactionController _transactionController;
+ private Binary _txnId;
+
+ Transaction(final TransactionController transactionController, Binary txnId)
+ {
+ _transactionController = transactionController;
+ _txnId = txnId;
+ }
+
+ public void commit()
+ {
+ _transactionController.commit(this);
+ }
+
+ public void rollback()
+ {
+ _transactionController.rollback(this);
+ }
+
+ public Binary getTxnId()
+ {
+ return _txnId;
+ }
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TransactionController.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TransactionController.java
new file mode 100644
index 0000000000..9f2c76bc72
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TransactionController.java
@@ -0,0 +1,194 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+import org.apache.qpid.amqp_1_0.type.transaction.Declare;
+import org.apache.qpid.amqp_1_0.type.transaction.Declared;
+import org.apache.qpid.amqp_1_0.type.transaction.Discharge;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+
+public class TransactionController implements DeliveryStateHandler
+{
+ private static final Binary DELIVERY_TAG = new Binary(new byte[]{(byte) 0});
+ private SendingLinkEndpoint _endpoint;
+ private Session _session;
+ private volatile DeliveryState _state;
+ private boolean _received;
+
+ public TransactionController(Session session, SendingLinkEndpoint tcLinkEndpoint)
+ {
+ _session = session;
+ _endpoint = tcLinkEndpoint;
+ _endpoint.setDeliveryStateHandler(this);
+ }
+
+ public Transaction beginTransaction()
+ {
+
+
+ Binary txnId = declare();
+ return new Transaction(this, txnId);
+ }
+
+ private Binary declare()
+ {
+ SectionEncoder encoder = _session.getSectionEncoder();
+
+
+ AmqpValue section = new AmqpValue(new Declare());
+
+
+ Transfer transfer = new Transfer();
+ transfer.setPayload(section.encode(encoder).asByteBuffer());
+ transfer.setDeliveryTag(DELIVERY_TAG);
+ transfer.setSettled(Boolean.FALSE);
+ final Object lock = _endpoint.getLock();
+ synchronized(lock)
+ {
+ while(!_endpoint.hasCreditToSend())
+ {
+ try
+ {
+ lock.wait();
+ }
+ catch (InterruptedException e)
+ {
+
+ }
+ }
+ _state = null;
+ _received = false;
+ _endpoint.transfer(transfer);
+
+ //TODO - rationalise sending of flows
+ // _endpoint.sendFlow();
+ }
+ synchronized (this)
+ {
+ while(!_received)
+ {
+ try
+ {
+ wait();
+ }
+ catch (InterruptedException e)
+ {
+
+ }
+ }
+ }
+
+
+ return ((Declared) _state).getTxnId();
+ }
+
+
+ public void commit(final Transaction transaction)
+ {
+ discharge(transaction.getTxnId(), false);
+ }
+
+ public void rollback(final Transaction transaction)
+ {
+ discharge(transaction.getTxnId(), true);
+ }
+
+ private void discharge(final Binary txnId, final boolean fail)
+ {
+ Discharge discharge = new Discharge();
+ discharge.setTxnId(txnId);
+ discharge.setFail(fail);
+ SectionEncoder encoder = _session.getSectionEncoder();
+
+
+ AmqpValue section = new AmqpValue(discharge);
+
+ Transfer transfer = new Transfer();
+ transfer.setPayload(section.encode(encoder).asByteBuffer());
+ transfer.setDeliveryTag(DELIVERY_TAG);
+ transfer.setSettled(Boolean.FALSE);
+
+ final Object lock = _endpoint.getLock();
+ synchronized(lock)
+ {
+ while(!_endpoint.hasCreditToSend())
+ {
+ try
+ {
+ lock.wait();
+ }
+ catch (InterruptedException e)
+ {
+
+ }
+ }
+ _state = null;
+ _received = false;
+ _endpoint.transfer(transfer);
+
+ //TODO - rationalise sending of flows
+ // _endpoint.sendFlow();
+ }
+ synchronized (this)
+ {
+ while(!_received)
+ {
+ try
+ {
+ wait();
+ }
+ catch (InterruptedException e)
+ {
+
+ }
+ }
+ }
+
+
+ }
+
+ public void handle(final Binary deliveryTag, final DeliveryState state, final Boolean settled)
+ {
+ synchronized(this)
+ {
+ _state = state;
+ _received = true;
+
+ if(!Boolean.TRUE.equals(settled))
+ {
+ _endpoint.updateDisposition(deliveryTag, state, true);
+ }
+
+ notifyAll();
+ }
+ }
+
+ public void close()
+ {
+ _endpoint.close();
+ }
+}
diff --git a/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Util.java b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Util.java
new file mode 100644
index 0000000000..6fe2a6d510
--- /dev/null
+++ b/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Util.java
@@ -0,0 +1,529 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.transport.Container;
+import org.apache.commons.cli.*;
+
+import java.util.logging.*;
+
+public abstract class Util
+{
+
+ private static final Logger FRAME_LOGGER = Logger.getLogger("FRM");
+ private static final Logger RAW_LOGGER = Logger.getLogger("RAW");
+ private String _host;
+ private String _username;
+ private String _password;
+ private int _port;
+ private int _count;
+ private boolean _useStdIn;
+ private boolean _useTran;
+ private String[] _args;
+ private AcknowledgeMode _mode;
+ private boolean _block;
+ private int _frameSize;
+ private int _messageSize;
+ private String _responseQueue;
+ private int _batchSize;
+ private double _rollbackRatio;
+ private String _linkName;
+ private String _containerName;
+ private boolean _durableLink;
+ private boolean _useMultipleConnections;
+ private int _windowSize = 100;
+ private String _subject;
+ private String _filter;
+ private String _remoteHost;
+ private boolean _useSSL;
+
+ protected Util(String[] args)
+ {
+ CommandLineParser cmdLineParse = new PosixParser();
+
+ Options options = new Options();
+ options.addOption("h","help",false,"show this help message and exit");
+ options.addOption(OptionBuilder.withLongOpt("host")
+ .withDescription( "host to connect to (default 0.0.0.0)" )
+ .hasArg(true)
+ .withArgName("HOST")
+ .create('H'));
+ options.addOption(OptionBuilder.withLongOpt("username")
+ .withDescription( "username to use for authentication" )
+ .hasArg(true)
+ .withArgName("USERNAME")
+ .create('u'));
+ options.addOption(OptionBuilder.withLongOpt("password")
+ .withDescription( "password to use for authentication" )
+ .hasArg(true)
+ .withArgName("PASSWORD")
+ .create('w'));
+ options.addOption(OptionBuilder.withLongOpt("port")
+ .withDescription( "port to connect to (default 5672)" )
+ .hasArg(true)
+ .withArgName("PORT")
+ .create('p'));
+ options.addOption(OptionBuilder.withLongOpt("frame-size")
+ .withDescription( "specify the maximum frame size" )
+ .hasArg(true)
+ .withArgName("FRAME_SIZE")
+ .create('f'));
+ options.addOption(OptionBuilder.withLongOpt("container-name")
+ .withDescription( "Container name" )
+ .hasArg(true)
+ .withArgName("CONTAINER_NAME")
+ .create('C'));
+
+ options.addOption(OptionBuilder.withLongOpt("ssl")
+ .withDescription("Use SSL")
+ .create('S'));
+
+ options.addOption(OptionBuilder.withLongOpt("remote-hostname")
+ .withDescription( "hostname to supply in the open frame" )
+ .hasArg(true)
+ .withArgName("HOST")
+ .create('O'));
+
+ if(hasBlockOption())
+ options.addOption(OptionBuilder.withLongOpt("block")
+ .withDescription("block until messages arrive")
+ .create('b'));
+
+ if(hasCountOption())
+ options.addOption(OptionBuilder.withLongOpt("count")
+ .withDescription( "number of messages to send (default 1)" )
+ .hasArg(true)
+ .withArgName("COUNT")
+ .create('c'));
+ if(hasModeOption())
+ options.addOption(OptionBuilder.withLongOpt("acknowledge-mode")
+ .withDescription( "acknowledgement mode: AMO|ALO|EO (At Least Once, At Most Once, Exactly Once" )
+ .hasArg(true)
+ .withArgName("MODE")
+ .create('k'));
+
+ if(hasSubjectOption())
+ options.addOption(OptionBuilder.withLongOpt("subject")
+ .withDescription( "subject message property" )
+ .hasArg(true)
+ .withArgName("SUBJECT")
+ .create('s'));
+
+
+ if(hasSingleLinkPerConnectionMode())
+ options.addOption(OptionBuilder.withLongOpt("single-link-per-connection")
+ .withDescription("acknowledgement mode: AMO|ALO|EO (At Least Once, At Most Once, Exactly Once")
+ .hasArg(false)
+ .create('Z'));
+
+ if(hasFilterOption())
+ options.addOption(OptionBuilder.withLongOpt("filter")
+ .withDescription("filter, e.g. exact-subject=hello; matching-subject=%.a.#")
+ .hasArg(true)
+ .withArgName("<TYPE>=<VALUE>")
+ .create('F'));
+
+
+ if(hasTxnOption())
+ {
+ options.addOption("x","txn",false,"use transactions");
+ options.addOption(OptionBuilder.withLongOpt("batch-size")
+ .withDescription( "transaction batch size (default: 1)" )
+ .hasArg(true)
+ .withArgName("BATCH-SIZE")
+ .create('B'));
+ options.addOption(OptionBuilder.withLongOpt("rollback-ratio")
+ .withDescription( "rollback ratio - must be between 0 and 1 (default: 0)" )
+ .hasArg(true)
+ .withArgName("RATIO")
+ .create('R'));
+ }
+
+ if(hasLinkDurableOption())
+ {
+ options.addOption("d","durable-link",false,"use a durable link");
+ }
+
+ if(hasStdInOption())
+ options.addOption("i","stdin",false,"read messages from stdin (one message per line)");
+
+ options.addOption(OptionBuilder.withLongOpt("trace")
+ .withDescription("trace logging specified categories: RAW, FRM")
+ .hasArg(true)
+ .withArgName("TRACE")
+ .create('t'));
+ if(hasSizeOption())
+ options.addOption(OptionBuilder.withLongOpt("message-size")
+ .withDescription( "size to pad outgoing messages to" )
+ .hasArg(true)
+ .withArgName("SIZE")
+ .create('z'));
+
+ if(hasResponseQueueOption())
+ options.addOption(OptionBuilder.withLongOpt("response-queue")
+ .withDescription( "response queue to reply to" )
+ .hasArg(true)
+ .withArgName("RESPONSE_QUEUE")
+ .create('r'));
+
+ if(hasLinkNameOption())
+ {
+ options.addOption(OptionBuilder.withLongOpt("link")
+ .withDescription( "link name" )
+ .hasArg(true)
+ .withArgName("LINK")
+ .create('l'));
+ }
+
+ if(hasWindowSizeOption())
+ {
+ options.addOption(OptionBuilder.withLongOpt("window-size")
+ .withDescription("credit window size")
+ .hasArg(true)
+ .withArgName("WINDOW-SIZE")
+ .create('W'));
+ }
+
+ CommandLine cmdLine = null;
+ try
+ {
+ cmdLine = cmdLineParse.parse(options, args);
+
+ }
+ catch (ParseException e)
+ {
+ printUsage(options);
+ System.exit(-1);
+ }
+
+ if(cmdLine.hasOption('h') || cmdLine.getArgList().isEmpty())
+ {
+ printUsage(options);
+ System.exit(0);
+ }
+ _host = cmdLine.getOptionValue('H',"0.0.0.0");
+ _remoteHost = cmdLine.getOptionValue('O',null);
+ String portStr = cmdLine.getOptionValue('p',"5672");
+ String countStr = cmdLine.getOptionValue('c',"1");
+
+ _useSSL = cmdLine.hasOption('S');
+
+ if(hasWindowSizeOption())
+ {
+ String windowSizeStr = cmdLine.getOptionValue('W',"100");
+ _windowSize = Integer.parseInt(windowSizeStr);
+ }
+
+ if(hasSubjectOption())
+ {
+ _subject = cmdLine.getOptionValue('s');
+ }
+
+ if(cmdLine.hasOption('u'))
+ {
+ _username = cmdLine.getOptionValue('u');
+ }
+
+ if(cmdLine.hasOption('w'))
+ {
+ _password = cmdLine.getOptionValue('w');
+ }
+
+ if(cmdLine.hasOption('F'))
+ {
+ _filter = cmdLine.getOptionValue('F');
+ }
+
+ _port = Integer.parseInt(portStr);
+
+ _containerName = cmdLine.getOptionValue('C');
+
+ if(hasBlockOption())
+ _block = cmdLine.hasOption('b');
+
+ if(hasLinkNameOption())
+ _linkName = cmdLine.getOptionValue('l');
+
+
+ if(hasLinkDurableOption())
+ _durableLink = cmdLine.hasOption('d');
+
+ if(hasCountOption())
+ _count = Integer.parseInt(countStr);
+
+ if(hasStdInOption())
+ _useStdIn = cmdLine.hasOption('i');
+
+ if(hasSingleLinkPerConnectionMode())
+ _useMultipleConnections = cmdLine.hasOption('Z');
+
+ if(hasTxnOption())
+ {
+ _useTran = cmdLine.hasOption('x');
+ _batchSize = Integer.parseInt(cmdLine.getOptionValue('B',"1"));
+ _rollbackRatio = Double.parseDouble(cmdLine.getOptionValue('R',"0"));
+ }
+
+ if(hasModeOption())
+ {
+ _mode = AcknowledgeMode.ALO;
+
+ if(cmdLine.hasOption('k'))
+ {
+ _mode = AcknowledgeMode.valueOf(cmdLine.getOptionValue('k'));
+ }
+ }
+
+ if(hasResponseQueueOption())
+ {
+ _responseQueue = cmdLine.getOptionValue('r');
+ }
+
+ _frameSize = Integer.parseInt(cmdLine.getOptionValue('f',"65536"));
+
+ if(hasSizeOption())
+ {
+ _messageSize = Integer.parseInt(cmdLine.getOptionValue('z',"-1"));
+ }
+
+ String categoriesList = cmdLine.getOptionValue('t');
+ String[]categories = categoriesList == null ? new String[0] : categoriesList.split("[, ]");
+ for(String cat : categories)
+ {
+ if(cat.equalsIgnoreCase("FRM"))
+ {
+ FRAME_LOGGER.setLevel(Level.FINE);
+ Formatter formatter = new Formatter()
+ {
+ @Override
+ public String format(final LogRecord record)
+ {
+ return "[" + record.getMillis() + " FRM]\t" + record.getMessage() + "\n";
+ }
+ };
+ for(Handler handler : FRAME_LOGGER.getHandlers())
+ {
+ FRAME_LOGGER.removeHandler(handler);
+ }
+ Handler handler = new ConsoleHandler();
+ handler.setLevel(Level.FINE);
+ handler.setFormatter(formatter);
+ FRAME_LOGGER.addHandler(handler);
+ }
+ else if (cat.equalsIgnoreCase("RAW"))
+ {
+ RAW_LOGGER.setLevel(Level.FINE);
+ Formatter formatter = new Formatter()
+ {
+ @Override
+ public String format(final LogRecord record)
+ {
+ return "[" + record.getMillis() + " RAW]\t" + record.getMessage() + "\n";
+ }
+ };
+ for(Handler handler : RAW_LOGGER.getHandlers())
+ {
+ RAW_LOGGER.removeHandler(handler);
+ }
+ Handler handler = new ConsoleHandler();
+ handler.setLevel(Level.FINE);
+ handler.setFormatter(formatter);
+ RAW_LOGGER.addHandler(handler);
+ }
+ }
+
+
+ _args = cmdLine.getArgs();
+
+ }
+
+ protected boolean hasFilterOption()
+ {
+ return false;
+ }
+
+ protected boolean hasSubjectOption()
+ {
+ return false;
+ }
+
+ protected boolean hasWindowSizeOption()
+ {
+ return false;
+ }
+
+ protected boolean hasSingleLinkPerConnectionMode()
+ {
+ return false;
+ }
+
+ protected abstract boolean hasLinkDurableOption();
+
+ protected abstract boolean hasLinkNameOption();
+
+ protected abstract boolean hasResponseQueueOption();
+
+ protected abstract boolean hasSizeOption();
+
+ protected abstract boolean hasBlockOption();
+
+ protected abstract boolean hasStdInOption();
+
+ protected abstract boolean hasTxnOption();
+
+ protected abstract boolean hasModeOption();
+
+ protected abstract boolean hasCountOption();
+
+ public String getHost()
+ {
+ return _host;
+ }
+
+ public String getUsername()
+ {
+ return _username;
+ }
+
+ public String getPassword()
+ {
+ return _password;
+ }
+
+ public int getPort()
+ {
+ return _port;
+ }
+
+ public int getCount()
+ {
+ return _count;
+ }
+
+ public boolean useStdIn()
+ {
+ return _useStdIn;
+ }
+
+ public boolean useTran()
+ {
+ return _useTran;
+ }
+
+ public AcknowledgeMode getMode()
+ {
+ return _mode;
+ }
+
+ public boolean isBlock()
+ {
+ return _block;
+ }
+
+ public String[] getArgs()
+ {
+ return _args;
+ }
+
+ public int getMessageSize()
+ {
+ return _messageSize;
+ }
+
+ public String getResponseQueue()
+ {
+ return _responseQueue;
+ }
+
+ public int getBatchSize()
+ {
+ return _batchSize;
+ }
+
+ public double getRollbackRatio()
+ {
+ return _rollbackRatio;
+ }
+
+ public String getLinkName()
+ {
+ return _linkName;
+ }
+
+ public boolean isDurableLink()
+ {
+ return _durableLink;
+ }
+
+ public boolean isUseMultipleConnections()
+ {
+ return _useMultipleConnections;
+ }
+
+ public void setUseMultipleConnections(boolean useMultipleConnections)
+ {
+ _useMultipleConnections = useMultipleConnections;
+ }
+
+ public String getSubject()
+ {
+ return _subject;
+ }
+
+ public void setSubject(String subject)
+ {
+ _subject = subject;
+ }
+
+ protected abstract void printUsage(final Options options);
+
+ protected abstract void run();
+
+
+ public Connection newConnection() throws Connection.ConnectionException
+ {
+ Container container = getContainerName() == null ? new Container() : new Container(getContainerName());
+ return getUsername() == null ? new Connection(getHost(), getPort(), null, null, _frameSize, container,
+ _remoteHost == null ? getHost() : _remoteHost, _useSSL)
+ : new Connection(getHost(), getPort(), getUsername(), getPassword(), _frameSize,
+ container, _remoteHost == null ? getHost() : _remoteHost, _useSSL);
+ }
+
+ public String getContainerName()
+ {
+ return _containerName;
+ }
+
+ public int getWindowSize()
+ {
+ return _windowSize;
+ }
+
+ public void setWindowSize(int windowSize)
+ {
+ _windowSize = windowSize;
+ }
+
+ public String getFilter()
+ {
+ return _filter;
+ }
+}
diff --git a/java/amqp-1-0-common/build.xml b/java/amqp-1-0-common/build.xml
new file mode 100644
index 0000000000..20b8b731b0
--- /dev/null
+++ b/java/amqp-1-0-common/build.xml
@@ -0,0 +1,27 @@
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ -->
+<project name="AMQP 1.0 Common" default="build">
+
+ <property name="module.genpom" value="true"/>
+
+ <import file="../module.xml"/>
+
+</project>
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractDescribedTypeWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractDescribedTypeWriter.java
new file mode 100644
index 0000000000..6977a40902
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractDescribedTypeWriter.java
@@ -0,0 +1,188 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class AbstractDescribedTypeWriter<V> implements ValueWriter<V>
+{
+ private int _length;
+ private Registry _registry;
+ private static final int LARGE_COMPOUND_THRESHOLD_COUNT = 10;
+ private ValueWriter _delegate;
+ private static final byte DESCRIBED_TYPE = (byte)0;
+
+ public AbstractDescribedTypeWriter(final Registry registry)
+ {
+ _registry = registry;
+ }
+
+ enum State {
+ FORMAT_CODE,
+ DESCRIPTOR,
+ DESCRIBED,
+ DONE
+ }
+
+ private State _state = State.FORMAT_CODE;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+ final int length = _length;
+
+ if(length == -1)
+ {
+ writeFirstPass(buffer);
+ }
+ else
+ {
+
+ State state = _state;
+
+ switch(state)
+ {
+ case FORMAT_CODE:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(DESCRIBED_TYPE);
+ state = State.DESCRIPTOR;
+ _delegate = createDescriptorWriter();
+ }
+ else
+ {
+ break;
+ }
+
+ case DESCRIPTOR:
+ if(buffer.hasRemaining())
+ {
+ _delegate.writeToBuffer(buffer);
+ if(_delegate.isComplete())
+ {
+ state = State.DESCRIBED;
+ _delegate = createDescribedWriter();
+ }
+ else
+ {
+ break;
+ }
+ }
+ case DESCRIBED:
+ if(buffer.hasRemaining())
+ {
+ _delegate.writeToBuffer(buffer);
+ if(_delegate.isComplete())
+ {
+ state = State.DONE;
+ _delegate = null;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ }
+
+ _state = state;
+
+ }
+
+ return _length;
+ }
+
+ private void writeFirstPass(ByteBuffer buffer)
+ {
+
+ int length = 1;
+ State state = State.FORMAT_CODE;
+
+ ValueWriter descriptorWriter = createDescriptorWriter();
+ if(buffer.hasRemaining())
+ {
+ buffer.put(DESCRIBED_TYPE);
+ state = State.DESCRIPTOR;
+ _delegate = descriptorWriter;
+ }
+ length += descriptorWriter.writeToBuffer(buffer);
+
+ ValueWriter describedWriter = createDescribedWriter();
+
+ if(descriptorWriter.isComplete())
+ {
+ state = State.DESCRIBED;
+ _delegate = describedWriter;
+ }
+
+ length += describedWriter.writeToBuffer(buffer);
+
+ if(describedWriter.isComplete())
+ {
+ _delegate = null;
+ state = State.DONE;
+ }
+
+ _state = state;
+ _length = length;
+ }
+
+ public void setValue(V value)
+ {
+ _length = -1;
+ _delegate = null;
+ _state = State.FORMAT_CODE;
+ onSetValue(value);
+ }
+
+ public void setRegistry(Registry registry)
+ {
+ _registry = registry;
+ }
+
+ protected Registry getRegistry()
+ {
+ return _registry;
+ }
+
+ protected abstract void onSetValue(final V value);
+
+ protected abstract void clear();
+
+ protected abstract ValueWriter createDescribedWriter();
+
+ protected abstract Object getDescriptor();
+
+ protected final ValueWriter createDescriptorWriter()
+ {
+ return getRegistry().getValueWriter(getDescriptor());
+ }
+
+ public boolean isComplete()
+ {
+ return _state == State.DONE;
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractListWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractListWriter.java
new file mode 100644
index 0000000000..655b1f2164
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractListWriter.java
@@ -0,0 +1,41 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+public abstract class AbstractListWriter<V> extends CompoundWriter<V>
+{
+ public AbstractListWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return (byte)0xd0;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return (byte)0xc0;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractMapWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractMapWriter.java
new file mode 100644
index 0000000000..0fa29b5210
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractMapWriter.java
@@ -0,0 +1,95 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public abstract class AbstractMapWriter<V> extends CompoundWriter<V>
+{
+ private boolean onKey;
+
+ public AbstractMapWriter(Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return (byte)0xd1;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return (byte)0xc1;
+ }
+
+ @Override
+ protected final int getCount()
+ {
+ return 2 * getMapCount();
+ }
+
+ protected abstract int getMapCount();
+
+ @Override
+ protected final boolean hasNext()
+ {
+ return onKey || hasMapNext();
+ }
+
+ protected abstract boolean hasMapNext();
+
+ @Override
+ protected final Object next()
+ {
+ if(onKey = !onKey)
+ {
+ return nextKey();
+ }
+ else
+ {
+ return nextValue();
+ }
+ }
+
+ protected abstract Object nextValue();
+
+ protected abstract Object nextKey();
+
+ @Override
+ protected final void clear()
+ {
+ onKey = false;
+ onClear();
+ }
+
+ protected abstract void onClear();
+
+ @Override
+ protected final void reset()
+ {
+ onKey = false;
+ onReset();
+ }
+
+ protected abstract void onReset();
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayTypeConstructor.java
new file mode 100644
index 0000000000..68239ad143
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayTypeConstructor.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.AmqpError;
+
+import java.lang.reflect.Array;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class ArrayTypeConstructor implements TypeConstructor<Object[]>
+{
+
+
+
+ public Object[] construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ int size = read(in);
+ if(in.remaining() < size)
+ {
+ throw new AmqpErrorException(AmqpError.DECODE_ERROR,
+ "Insufficient data to decode array - requires %d octects, only %d remaining.",
+ size, in.remaining());
+ }
+ ByteBuffer dup = in.slice();
+ dup.limit(size);
+ in.position(in.position()+size);
+ int count = read(dup);
+ TypeConstructor t = handler.readConstructor(dup);
+ List rval = new ArrayList(count);
+ for(int i = 0; i < count; i++)
+ {
+ rval.add(t.construct(dup, handler));
+ }
+ if(dup.hasRemaining())
+ {
+ throw new AmqpErrorException(AmqpError.DECODE_ERROR,
+ "Array incorrectly encoded, %d bytes remaining after decoding %d elements",
+ dup.remaining(), count);
+ }
+ if(rval.size() == 0)
+ {
+ return null;
+ }
+ else
+ {
+
+
+ return rval.toArray((Object[])Array.newInstance(rval.get(0).getClass(), rval.size()));
+ }
+ }
+
+
+ abstract int read(ByteBuffer in) throws AmqpErrorException;
+
+
+ private static final ArrayTypeConstructor ONE_BYTE_SIZE_ARRAY = new ArrayTypeConstructor()
+ {
+
+ @Override int read(final ByteBuffer in) throws AmqpErrorException
+ {
+ if(!in.hasRemaining())
+ {
+ throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Insufficient data to decode array");
+ }
+ return ((int)in.get()) & 0xff;
+ }
+
+ };
+
+ private static final ArrayTypeConstructor FOUR_BYTE_SIZE_ARRAY = new ArrayTypeConstructor()
+ {
+
+ @Override int read(final ByteBuffer in) throws AmqpErrorException
+ {
+ if(in.remaining()<4)
+ {
+ throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Insufficient data to decode array");
+ }
+ return in.getInt();
+ }
+
+ };
+
+ public static ArrayTypeConstructor getOneByteSizeTypeConstructor()
+ {
+ return ONE_BYTE_SIZE_ARRAY;
+ }
+
+ public static ArrayTypeConstructor getFourByteSizeTypeConstructor()
+ {
+ return FOUR_BYTE_SIZE_ARRAY;
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayWriter.java
new file mode 100644
index 0000000000..7766a486f0
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayWriter.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class ArrayWriter implements ValueWriter<Object[]>
+{
+ private Object[] _list;
+ private int _position = 0;
+ private final Registry _registry;
+ private ValueWriter valueWriter;
+
+ public ArrayWriter(final Registry registry)
+ {
+ _registry = registry;
+ }
+
+
+ protected void onSetValue(final Object[] value)
+ {
+
+ Class clazz = value.getClass().getComponentType();
+ //valueWriter = _registry.getValueWriterByClass(clazz);
+
+
+ }
+
+
+
+
+ private static Factory<Object[]> FACTORY = new Factory<Object[]>()
+ {
+
+ public ValueWriter<Object[]> newInstance(Registry registry)
+ {
+ return new ArrayWriter(registry);
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ //registry.register(List.class, FACTORY);
+ }
+
+ public int writeToBuffer(final ByteBuffer buffer)
+ {
+ return 0; //TODO change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void setValue(final Object[] frameBody)
+ {
+ //TODO change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public boolean isComplete()
+ {
+ return false; //TODO change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public boolean isCacheable()
+ {
+ return false; //TODO change body of implemented methods use File | Settings | File Templates.
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryString.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryString.java
new file mode 100644
index 0000000000..76bdac8ed7
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryString.java
@@ -0,0 +1,68 @@
+package org.apache.qpid.amqp_1_0.codec;
+
+
+final class BinaryString
+{
+
+ private byte[] _data;
+ private int _offset;
+ private int _size;
+ private int _hashCode;
+
+ BinaryString(final byte[] data, final int offset, final int size)
+ {
+
+ setData(data, offset, size);
+ }
+
+ BinaryString()
+ {
+ }
+
+ void setData(byte[] data, int offset, int size)
+ {
+ _data = data;
+ _offset = offset;
+ _size = size;
+ int hc = 0;
+ for (int i = 0; i < size; i++)
+ {
+ hc = 31*hc + (0xFF & data[offset + i]);
+ }
+ _hashCode = hc;
+ }
+
+
+ public final int hashCode()
+ {
+ return _hashCode;
+ }
+
+ public final boolean equals(Object o)
+ {
+ BinaryString buf = (BinaryString) o;
+ final int size = _size;
+ if (size != buf._size)
+ {
+ return false;
+ }
+
+ final byte[] myData = _data;
+ final byte[] theirData = buf._data;
+ int myOffset = _offset;
+ int theirOffset = buf._offset;
+ final int myLimit = myOffset + size;
+
+ while(myOffset < myLimit)
+ {
+ if (myData[myOffset++] != theirData[theirOffset++])
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryTypeConstructor.java
new file mode 100644
index 0000000000..e83718d88d
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryTypeConstructor.java
@@ -0,0 +1,80 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Binary;
+
+import java.nio.ByteBuffer;
+
+public class BinaryTypeConstructor extends VariableWidthTypeConstructor
+{
+ private static final BinaryTypeConstructor INSTANCE_1 = new BinaryTypeConstructor(1);
+ private static final BinaryTypeConstructor INSTANCE_4 = new BinaryTypeConstructor(4);
+
+ public static BinaryTypeConstructor getInstance(int i)
+ {
+ return i == 1 ? INSTANCE_1 : INSTANCE_4;
+ }
+
+
+ private BinaryTypeConstructor(int size)
+ {
+ super(size);
+ }
+
+ @Override
+ public Object construct(final ByteBuffer in, boolean isCopy, ValueHandler handler) throws AmqpErrorException
+ {
+ int size;
+
+ if(getSize() == 1)
+ {
+ size = in.get() & 0xFF;
+ }
+ else
+ {
+ size = in.getInt();
+ }
+
+ ByteBuffer inDup = in.slice();
+ inDup.limit(inDup.position()+size);
+
+ Binary binary;
+/* if(isCopy && inDup.hasArray())
+ {
+ binary= new Binary(inDup.array(), inDup.arrayOffset()+inDup.position(),size);
+ }
+ else
+ {*/
+ byte[] buf = new byte[size];
+ inDup.get(buf);
+ binary = new Binary(buf);
+ /* }*/
+
+ in.position(in.position()+size);
+
+
+ return binary;
+
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryWriter.java
new file mode 100644
index 0000000000..8ab4569646
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryWriter.java
@@ -0,0 +1,75 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+
+public class BinaryWriter extends SimpleVariableWidthWriter<Binary>
+{
+ private int _offset;
+ private int _length;
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return (byte)0xb0;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return (byte)0xa0;
+ }
+
+ @Override
+ protected byte[] getByteArray(Binary value)
+ {
+ _offset = value.getArrayOffset();
+ _length = value.getLength();
+ return value.getArray();
+ }
+
+ @Override
+ protected int getOffset()
+ {
+ return _offset;
+ }
+
+ @Override protected int getLength()
+ {
+ return _length;
+ }
+
+ private static Factory<Binary> FACTORY = new Factory<Binary>()
+ {
+
+ public ValueWriter<Binary> newInstance(Registry registry)
+ {
+ return new BinaryWriter();
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ registry.register(Binary.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanConstructor.java
new file mode 100644
index 0000000000..5cad87cbd8
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanConstructor.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class BooleanConstructor
+{
+ private static final TypeConstructor<Boolean> TRUE_INSTANCE = new TypeConstructor<Boolean>()
+ {
+ public Boolean construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return Boolean.TRUE;
+ }
+ };
+
+ private static final TypeConstructor<Boolean> FALSE_INSTANCE = new TypeConstructor<Boolean>()
+ {
+ public Boolean construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return Boolean.FALSE;
+ }
+ };
+ private static final TypeConstructor<Boolean> BYTE_INSTANCE = new TypeConstructor<Boolean>()
+ {
+ public Boolean construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ byte b = in.get();
+ return b != (byte) 0;
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct boolean: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+ };
+
+
+ public static TypeConstructor<Boolean> getTrueInstance()
+ {
+ return TRUE_INSTANCE;
+ }
+
+ public static TypeConstructor<Boolean> getFalseInstance()
+ {
+ return FALSE_INSTANCE;
+ }
+
+ public static TypeConstructor<Boolean> getByteInstance()
+ {
+ return BYTE_INSTANCE;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanWriter.java
new file mode 100644
index 0000000000..fb4449fb2c
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanWriter.java
@@ -0,0 +1,70 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class BooleanWriter implements ValueWriter<Boolean>
+{
+ private boolean _complete = true;
+ private boolean _value;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+ if(!_complete & buffer.hasRemaining())
+ {
+ buffer.put(_value ? (byte)0x41 : (byte)0x42);
+ _complete = true;
+ }
+ return 1;
+ }
+
+ public void setValue(Boolean value)
+ {
+ _complete = false;
+ _value = value.booleanValue();
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public boolean isComplete()
+ {
+ return _complete;
+ }
+
+ private static Factory<Boolean> FACTORY = new Factory<Boolean>()
+ {
+
+ public ValueWriter<Boolean> newInstance(Registry registry)
+ {
+ return new BooleanWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Boolean.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteArrayWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteArrayWriter.java
new file mode 100644
index 0000000000..662b4085db
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteArrayWriter.java
@@ -0,0 +1,66 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public class ByteArrayWriter extends SimpleVariableWidthWriter<byte[]>
+{
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return (byte)0xb0;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return (byte)0xa0;
+ }
+
+ @Override
+ protected byte[] getByteArray(byte[] value)
+ {
+ return value;
+ }
+
+
+ @Override
+ protected int getOffset()
+ {
+ return 0;
+ }
+
+ private static Factory<byte[]> FACTORY = new Factory<byte[]>()
+ {
+
+ public ValueWriter<byte[]> newInstance(Registry registry)
+ {
+ return new ByteArrayWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(byte[].class, FACTORY);
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteBufferWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteBufferWriter.java
new file mode 100644
index 0000000000..41bd20c0a2
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteBufferWriter.java
@@ -0,0 +1,75 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class ByteBufferWriter extends SimpleVariableWidthWriter<ByteBuffer>
+{
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return (byte)0xb0;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return (byte)0xa0;
+ }
+
+ @Override
+ protected byte[] getByteArray(ByteBuffer value)
+ {
+ if(value.hasArray() && value.arrayOffset() == 0 && value.remaining() == value.array().length)
+ {
+ return value.array();
+ }
+ else
+ {
+ byte[] copy = new byte[value.remaining()];
+ value.duplicate().get(copy);
+ return copy;
+ }
+ }
+
+ @Override
+ protected int getOffset()
+ {
+ return 0;
+ }
+
+ private static Factory<ByteBuffer> FACTORY = new Factory<ByteBuffer>()
+ {
+
+ public ValueWriter<ByteBuffer> newInstance(Registry registry)
+ {
+ return new ByteBufferWriter();
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ registry.register(ByteBuffer.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteTypeConstructor.java
new file mode 100644
index 0000000000..03db2c568c
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteTypeConstructor.java
@@ -0,0 +1,59 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class ByteTypeConstructor implements TypeConstructor
+{
+ private static final ByteTypeConstructor INSTANCE = new ByteTypeConstructor();
+
+ public static ByteTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private ByteTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ return in.get();
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct byte: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteWriter.java
new file mode 100644
index 0000000000..6155de4d2a
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteWriter.java
@@ -0,0 +1,90 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class ByteWriter implements ValueWriter<Byte>
+{
+ private int _written = 2;
+ private byte _value;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ switch(_written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)0x51);
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(_value);
+ _written = 2;
+ }
+ else
+ {
+ _written = 1;
+ }
+
+ }
+
+ return 2;
+ }
+
+ public void setValue(Byte value)
+ {
+ _written = 0;
+ _value = value.byteValue();
+ }
+
+ public boolean isComplete()
+ {
+ return _written == 2;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ private static Factory<Byte> FACTORY = new Factory<Byte>()
+ {
+
+ public ValueWriter<Byte> newInstance(Registry registry)
+ {
+ return new ByteWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Byte.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharTypeConstructor.java
new file mode 100644
index 0000000000..6a2ce2d725
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharTypeConstructor.java
@@ -0,0 +1,67 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+import java.nio.ByteBuffer;
+
+public class CharTypeConstructor implements TypeConstructor
+{
+ private static final CharTypeConstructor INSTANCE = new CharTypeConstructor();
+
+
+ public static CharTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private CharTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=4)
+ {
+ int codePoint = in.getInt();
+ char[] chars = Character.toChars(codePoint);
+ if(chars.length == 1)
+ {
+ return chars[0];
+ }
+ else
+ {
+ return chars;
+ }
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct char: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharWriter.java
new file mode 100644
index 0000000000..05f6e28d2f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharWriter.java
@@ -0,0 +1,53 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public class CharWriter extends FixedFourWriter<Character>
+{
+ private static final byte FORMAT_CODE = (byte)0x73;
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ @Override
+ int convertValueToInt(Character value)
+ {
+ return (int) value.charValue();
+ }
+
+ private static Factory<Character> FACTORY = new Factory<Character>()
+ {
+
+ public ValueWriter<Character> newInstance(Registry registry)
+ {
+ return new CharWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Character.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeAssembler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeAssembler.java
new file mode 100644
index 0000000000..5625797f74
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeAssembler.java
@@ -0,0 +1,36 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+public interface CompoundTypeAssembler
+{
+
+ public static interface Factory
+ {
+ CompoundTypeAssembler newInstance();
+ }
+
+ void init(int count) throws AmqpErrorException;
+ void addItem(Object obj) throws AmqpErrorException;
+ Object complete() throws AmqpErrorException;
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeConstructor.java
new file mode 100644
index 0000000000..fc4fcdf9ee
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeConstructor.java
@@ -0,0 +1,192 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Formatter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class CompoundTypeConstructor extends VariableWidthTypeConstructor
+{
+ private final CompoundTypeAssembler.Factory _assemblerFactory;
+
+ public static final CompoundTypeAssembler.Factory LIST_ASSEMBLER_FACTORY =
+ new CompoundTypeAssembler.Factory()
+ {
+
+ public CompoundTypeAssembler newInstance()
+ {
+ return new ListAssembler();
+ }
+ };
+
+
+
+ private static class ListAssembler implements CompoundTypeAssembler
+ {
+ private List _list;
+
+ public void init(final int count) throws AmqpErrorException
+ {
+ _list = new ArrayList(count);
+ }
+
+ public void addItem(final Object obj) throws AmqpErrorException
+ {
+ _list.add(obj);
+ }
+
+ public Object complete() throws AmqpErrorException
+ {
+ return _list;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "ListAssembler{" +
+ "_list=" + _list +
+ '}';
+ }
+ }
+
+
+ public static final CompoundTypeAssembler.Factory MAP_ASSEMBLER_FACTORY =
+ new CompoundTypeAssembler.Factory()
+ {
+
+ public CompoundTypeAssembler newInstance()
+ {
+ return new MapAssembler();
+ }
+ };
+
+ private static class MapAssembler implements CompoundTypeAssembler
+ {
+ private Map _map;
+ private Object _lastKey;
+ private static final Object NOT_A_KEY = new Object();
+
+
+ public void init(final int count) throws AmqpErrorException
+ {
+ // Can't have an odd number of elements in a map
+ if((count & 0x1) == 1)
+ {
+ Error error = new Error();
+ error.setCondition(AmqpError.DECODE_ERROR);
+ Formatter formatter = new Formatter();
+ formatter.format("map cannot have odd number of elements: %d", count);
+ error.setDescription(formatter.toString());
+ throw new AmqpErrorException(error);
+ }
+ _map = new HashMap(count);
+ _lastKey = NOT_A_KEY;
+ }
+
+ public void addItem(final Object obj) throws AmqpErrorException
+ {
+ if(_lastKey != NOT_A_KEY)
+ {
+ if(_map.put(_lastKey, obj) != null)
+ {
+ Error error = new Error();
+ error.setCondition(AmqpError.DECODE_ERROR);
+ Formatter formatter = new Formatter();
+ formatter.format("map cannot have duplicate keys: %s has values (%s, %s)", _lastKey, _map.get(_lastKey), obj);
+ error.setDescription(formatter.toString());
+
+ throw new AmqpErrorException(error);
+ }
+ _lastKey = NOT_A_KEY;
+ }
+ else
+ {
+ _lastKey = obj;
+ }
+
+ }
+
+ public Object complete() throws AmqpErrorException
+ {
+ return _map;
+ }
+ }
+
+
+ public static CompoundTypeConstructor getInstance(int i,
+ CompoundTypeAssembler.Factory assemblerFactory)
+ {
+ return new CompoundTypeConstructor(i, assemblerFactory);
+ }
+
+
+ private CompoundTypeConstructor(int size,
+ final CompoundTypeAssembler.Factory assemblerFactory)
+ {
+ super(size);
+ _assemblerFactory = assemblerFactory;
+ }
+
+ @Override
+ public Object construct(final ByteBuffer in, boolean isCopy, ValueHandler delegate) throws AmqpErrorException
+ {
+ int size;
+ int count;
+
+ if(getSize() == 1)
+ {
+ size = in.get() & 0xFF;
+ count = in.get() & 0xFF;
+ }
+ else
+ {
+ size = in.getInt();
+ count = in.getInt();
+ }
+
+ ByteBuffer data;
+ ByteBuffer inDup = in.slice();
+
+ inDup.limit(size-getSize());
+
+ CompoundTypeAssembler assembler = _assemblerFactory.newInstance();
+
+ assembler.init(count);
+
+ for(int i = 0; i < count; i++)
+ {
+ assembler.addItem(delegate.parse(in));
+ }
+
+ return assembler.complete();
+
+ }
+
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundWriter.java
new file mode 100644
index 0000000000..39dce2b448
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundWriter.java
@@ -0,0 +1,420 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class CompoundWriter<V> implements ValueWriter<V>
+{
+ private int _length;
+ private Registry _registry;
+ private static final int LARGE_COMPOUND_THRESHOLD_COUNT = 25;
+ private ValueWriter _delegate;
+ private Map<Class, ValueWriter> _writerCache = new HashMap<Class, ValueWriter>();
+
+ public CompoundWriter(final Registry registry)
+ {
+ _registry = registry;
+ }
+
+ enum State {
+ FORMAT_CODE,
+ SIZE_0,
+ SIZE_1,
+ SIZE_2,
+ SIZE_3,
+ COUNT_0,
+ COUNT_1,
+ COUNT_2,
+ COUNT_3,
+ DELEGATING,
+ DONE
+ }
+
+ private State _state = State.FORMAT_CODE;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+ return writeToBuffer(buffer, false);
+ }
+
+ public int writeToBuffer(ByteBuffer buffer, boolean large)
+ {
+ final int length = _length;
+
+ if(length == -1)
+ {
+ writeFirstPass(buffer, (large || getCount() > LARGE_COMPOUND_THRESHOLD_COUNT) ? 4 : 1);
+ if(_delegate != null && _delegate.isComplete())
+ {
+ _delegate = null;
+ }
+ }
+ else
+ {
+ //
+
+ final int size = (length & 0xFFFFFF00) == 0 ? 1 : 4;
+ final int count = getCount();
+ final int typeLength = length - (1+size);
+
+ State state = _state;
+
+ switch(state)
+ {
+ case FORMAT_CODE:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(size == 1 ? getSingleOctetEncodingCode(): getFourOctetEncodingCode());
+ state = State.SIZE_0;
+ }
+ else
+ {
+ break;
+ }
+
+ case SIZE_0:
+ if(size == 4)
+ {
+ if(buffer.remaining()>=4)
+ {
+ buffer.putInt(typeLength);
+ state = State.COUNT_0;
+ }
+ }
+ else if(size == 1)
+ {
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)(typeLength));
+ state = State.COUNT_0;
+ }
+ else
+ {
+ break;
+ }
+
+ }
+ case SIZE_1:
+ case SIZE_2:
+ if(state != State.COUNT_0 && buffer.remaining() >= 2)
+ {
+ buffer.putShort((short)(((typeLength) >> ((3-state.ordinal())<<3)) & 0xFFFF ));
+ state = (state == State.SIZE_0)
+ ? State.SIZE_2
+ : (state == State.SIZE_1)
+ ? State.SIZE_3
+ : State.COUNT_0;
+ }
+ case SIZE_3:
+ if(state != State.COUNT_0 && buffer.hasRemaining())
+ {
+ buffer.put((byte)(((typeLength) >> ((4-state.ordinal())<<3)) & 0xFF ));
+ state = (state == State.SIZE_0)
+ ? State.SIZE_1
+ : (state == State.SIZE_1)
+ ? State.SIZE_2
+ : (state == State.SIZE_2)
+ ? State.SIZE_3
+ : State.COUNT_0;
+ }
+ case COUNT_0:
+ if(size == 4)
+ {
+ if(buffer.remaining()>=4)
+ {
+ buffer.putInt(count);
+ state = State.DELEGATING;
+ }
+ }
+ else if(size == 1)
+ {
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)count);
+ state = State.DELEGATING;
+ }
+ else
+ {
+ break;
+ }
+
+ }
+
+ case COUNT_1:
+ case COUNT_2:
+ if(state != State.DELEGATING && buffer.remaining() >= 2)
+ {
+ buffer.putShort((short)((count >> ((7-state.ordinal())<<3)) & 0xFFFF ));
+ state = state == State.COUNT_0
+ ? State.COUNT_2
+ : state == State.COUNT_1
+ ? State.COUNT_3
+ : State.DELEGATING;
+ }
+ case COUNT_3:
+ if(state != State.DELEGATING && buffer.hasRemaining())
+ {
+ buffer.put((byte)((count >> ((8-state.ordinal())<<3)) & 0xFF ));
+ state = state == State.COUNT_0
+ ? State.COUNT_1
+ : state == State.COUNT_1
+ ? State.COUNT_2
+ : state == State.COUNT_2
+ ? State.COUNT_3
+ : State.DELEGATING;
+ }
+ case DELEGATING:
+ while(state == State.DELEGATING && buffer.hasRemaining())
+ {
+ if(_delegate == null || _delegate.isComplete())
+ {
+ if(hasNext())
+ {
+ Object val = next();
+ _delegate = _registry.getValueWriter(val);
+ }
+ else
+ {
+ state = State.DONE;
+ break;
+ }
+ }
+ _delegate.writeToBuffer(buffer);
+ }
+ }
+
+ _state = state;
+
+ }
+
+ return _length;
+ }
+
+ private void writeFirstPass(ByteBuffer buffer, int size)
+ {
+
+ State state = State.FORMAT_CODE;
+ /*ByteBuffer origBuffer = buffer;
+ buffer = buffer.duplicate();*/
+ int origPosition = buffer.position();
+ int length ;
+
+
+ if(size == 4)
+ {
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getFourOctetEncodingCode());
+
+ // Skip the size - we will come back and patch this
+ if(buffer.remaining() >= 4 )
+ {
+ buffer.position(buffer.position()+4);
+ state = State.COUNT_0;
+ }
+ else
+ {
+ state = State.values()[buffer.remaining()+1];
+ buffer.position(buffer.limit());
+ }
+
+
+ switch(buffer.remaining())
+ {
+ case 0:
+ break;
+ case 1:
+ buffer.put((byte)((getCount() >> 24) & 0xFF));
+ state = State.COUNT_1;
+ break;
+ case 2:
+ buffer.putShort((short)((getCount() >> 16) & 0xFFFF));
+ state = State.COUNT_2;
+ break;
+ case 3:
+ buffer.putShort((short)((getCount() >> 16) & 0xFFFF));
+ buffer.put((byte)((getCount() >> 8) & 0xFF));
+ state = State.COUNT_3;
+ break;
+ default:
+ buffer.putInt(getCount());
+ state = State.DELEGATING;
+ }
+
+
+
+ }
+ length = 9;
+
+
+
+ }
+ else
+ {
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getSingleOctetEncodingCode());
+ if(buffer.hasRemaining())
+ {
+ // Size - we will come back and patch this
+ buffer.put((byte) 0);
+
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)getCount());
+ state = State.DELEGATING;
+ }
+ else
+ {
+ state = State.COUNT_0;
+ }
+ }
+ else
+ {
+ state = State.SIZE_0;
+ }
+ }
+ length = 3;
+
+ }
+
+
+ int iterPos = -1;
+ for(int i = 0; i < getCount(); i++)
+ {
+ Object val = next();
+ ValueWriter writer = _registry.getValueWriter(val, _writerCache);
+ if(writer == null)
+ {
+ // TODO
+ System.out.println("no writer for " + val);
+ }
+ length += writer.writeToBuffer(buffer);
+ if(iterPos == -1 && !writer.isComplete())
+ {
+ iterPos = i;
+ _delegate = writer;
+ }
+
+ if(size == 1 && length > 255)
+ {
+ reset();
+ buffer.position(origPosition);
+ writeFirstPass(buffer, 4);
+ return;
+ }
+
+ }
+
+ // TODO - back-patch size
+ if(buffer.limit() - origPosition >= 2)
+ {
+ buffer.position(origPosition+1);
+ if(size == 1)
+ {
+ buffer.put((byte)((length & 0xFF)-2));
+ }
+ else
+ {
+ switch(buffer.remaining())
+ {
+ case 1:
+ buffer.put((byte)(((length-5) >> 24) & 0xFF));
+ break;
+ case 2:
+ buffer.putShort((short)(((length-5) >> 16) & 0xFFFF));
+ break;
+ case 3:
+ buffer.putShort((short)(((length-5) >> 16) & 0xFFFF));
+ buffer.put((byte)(((length-5) >> 8) & 0xFF));
+ break;
+ default:
+ buffer.putInt(length-5);
+ }
+ }
+ }
+
+ if(buffer.limit() - origPosition >= length)
+ {
+ buffer.position(origPosition+length);
+ state = State.DONE;
+ }
+ else
+ {
+ reset();
+ while(iterPos-- >= 0)
+ {
+ next();
+ }
+ buffer.position(buffer.limit());
+ }
+ _state = state;
+ _length = length;
+ }
+
+ protected abstract byte getFourOctetEncodingCode();
+
+ protected abstract byte getSingleOctetEncodingCode();
+
+ public void setValue(V value)
+ {
+ _length = -1;
+ _delegate = null;
+ _state = State.FORMAT_CODE;
+ onSetValue(value);
+ }
+
+ public void setRegistry(Registry registry)
+ {
+ _registry = registry;
+ }
+
+ public Registry getRegistry()
+ {
+ return _registry;
+ }
+
+ protected abstract void onSetValue(final V value);
+
+ protected abstract int getCount();
+
+ protected abstract boolean hasNext();
+
+ protected abstract Object next();
+
+ protected abstract void clear();
+
+ protected abstract void reset();
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+ public boolean isComplete()
+ {
+ return _state == State.DONE;
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DecimalConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DecimalConstructor.java
new file mode 100644
index 0000000000..6c3b64aa25
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DecimalConstructor.java
@@ -0,0 +1,230 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.math.BigDecimal;
+import java.nio.ByteBuffer;
+
+public abstract class DecimalConstructor implements TypeConstructor<BigDecimal>
+{
+
+ private static final DecimalConstructor DECIMAL_32 = new DecimalConstructor()
+ {
+
+ public BigDecimal construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+
+
+ int val;
+
+ if(in.remaining()>=4)
+ {
+ val = in.getInt();
+ }
+ else
+ {
+ throw new AmqpErrorException(ConnectionError.FRAMING_ERROR, "Cannot construct decimal32: insufficient input data");
+ }
+
+ return constructFrom32(val);}
+
+ };
+
+
+ private static final DecimalConstructor DECIMAL_64 = new DecimalConstructor()
+ {
+
+ public BigDecimal construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ long val;
+
+ if(in.remaining()>=8)
+ {
+ val = in.getLong();
+ }
+ else
+ {
+ throw new AmqpErrorException(ConnectionError.FRAMING_ERROR, "Cannot construct decimal64: insufficient input data");
+ }
+
+ return constructFrom64(val);
+
+ }
+
+ };
+
+
+ private static final DecimalConstructor DECIMAL_128 = new DecimalConstructor()
+ {
+
+ public BigDecimal construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ long high;
+ long low;
+
+ if(in.remaining()>=16)
+ {
+ high = in.getLong();
+ low = in.getLong();
+ }
+ else
+ {
+ throw new AmqpErrorException(ConnectionError.FRAMING_ERROR, "Cannot construct decimal128: insufficient input data");
+ }
+
+ return constructFrom128(high, low);
+
+ }
+
+ };
+
+ private static final BigDecimal TWO_TO_THE_SIXTY_FOUR = new BigDecimal(2).pow(64);
+
+ private static BigDecimal constructFrom128(long high, long low)
+ {
+ int sign = ((high & 0x8000000000000000l) == 0) ? 1 : -1;
+
+ int exponent = 0;
+ long significand = high;
+
+ if((high & 0x6000000000000000l) != 0x6000000000000000l)
+ {
+ exponent = ((int) ((high & 0x7FFE000000000000l) >> 49)) - 6176;
+ significand = high & 0x0001ffffffffffffl;
+ }
+ else if((high & 0x7800000000000000l) != 0x7800000000000000l)
+ {
+ exponent = ((int)((high & 0x1fff800000000000l)>>47)) - 6176;
+ significand = (0x00007fffffffffffl & high) | 0x0004000000000000l;
+ }
+ else
+ {
+ // NaN or infinite
+ return null;
+ }
+
+
+ BigDecimal bigDecimal = new BigDecimal(significand).multiply(TWO_TO_THE_SIXTY_FOUR);
+ if(low >=0)
+ {
+ bigDecimal = bigDecimal.add(new BigDecimal(low));
+ }
+ else
+ {
+ bigDecimal = bigDecimal.add(TWO_TO_THE_SIXTY_FOUR.add(new BigDecimal(low)));
+ }
+ if(((high & 0x8000000000000000l) != 0))
+ {
+ bigDecimal = bigDecimal.negate();
+ }
+ bigDecimal = bigDecimal.scaleByPowerOfTen(exponent);
+ return bigDecimal;
+ }
+
+
+ private static BigDecimal constructFrom64(final long val)
+ {
+ int sign = ((val & 0x8000000000000000l) == 0) ? 1 : -1;
+
+ int exponent = 0;
+ long significand = val;
+
+ if((val & 0x6000000000000000l) != 0x6000000000000000l)
+ {
+ exponent = ((int) ((val & 0x7FE0000000000000l) >> 53)) - 398;
+ significand = val & 0x001fffffffffffffl;
+ }
+ else if((val & 0x7800000000000000l) != 0x7800000000000000l)
+ {
+ exponent = ((int)((val & 0x1ff8000000000000l)>>51)) - 398;
+ significand = (0x0007ffffffffffffl & val) | 0x0020000000000000l;
+ }
+ else
+ {
+ // NaN or infinite
+ return null;
+ }
+
+ BigDecimal bigDecimal = new BigDecimal(sign * significand);
+ bigDecimal = bigDecimal.scaleByPowerOfTen(exponent);
+ return bigDecimal;
+ }
+
+ private static BigDecimal constructFrom32(final int val)
+ {
+ int sign = ((val & 0x80000000) == 0) ? 1 : -1;
+
+ int exponent = 0;
+ int significand = val;
+
+ if((val & 0x60000000) != 0x60000000)
+ {
+ exponent = ((int) ((val & 0x7F800000) >> 23)) - 101;
+ significand = val & 0x007fffffff;
+ }
+ else if((val & 0x78000000) != 0x78000000)
+ {
+ exponent = ((int)((val & 0x1fe00000)>>21)) - 101;
+ significand = (0x001fffff & val) | 0x00800000;
+ }
+ else
+ {
+ // NaN or infinite
+ return null;
+ }
+
+ BigDecimal bigDecimal = new BigDecimal(sign * significand);
+ bigDecimal = bigDecimal.scaleByPowerOfTen(exponent);
+ return bigDecimal;
+ }
+
+/*
+
+ public static void main(String[] args)
+ {
+ System.out.println(constructFrom128(0l,0l));
+ System.out.println(constructFrom128(0x3041ED09BEAD87C0l,0x378D8E63FFFFFFFFl));
+ System.out.println(constructFrom64(0l));
+ System.out.println(constructFrom64(0x5fe0000000000001l));
+ System.out.println(constructFrom64(0xec7386F26FC0FFFFl));
+ System.out.println(constructFrom32(0));
+ System.out.println(constructFrom32(0x6cb8967f));
+
+ }
+*/
+
+ public static TypeConstructor getDecimal32Instance()
+ {
+ return DECIMAL_32;
+ }
+
+ public static TypeConstructor getDecimal64Instance()
+ {
+ return DECIMAL_64;
+ }
+
+ public static TypeConstructor getDecimal128Instance()
+ {
+ return DECIMAL_128;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DefaultDescribedTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DefaultDescribedTypeConstructor.java
new file mode 100644
index 0000000000..48b2045298
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DefaultDescribedTypeConstructor.java
@@ -0,0 +1,70 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class DefaultDescribedTypeConstructor extends DescribedTypeConstructor
+{
+ private Object _descriptor;
+
+ public DefaultDescribedTypeConstructor(final Object descriptor)
+ {
+ _descriptor = descriptor;
+ }
+
+ public Object construct(final Object underlying)
+ {
+ return new DescribedType(_descriptor, underlying);
+ }
+
+
+ public static void main(String[] args) throws IOException, ParseException
+ {
+ LineNumberReader reader = new LineNumberReader(new InputStreamReader(System.in));
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");
+ String line;
+ Pattern pattern = Pattern.compile("^\\d+ (\\d{4}-\\d{2}-\\d{2} \\d\\d:\\d\\d:\\d\\d,\\d\\d\\d)");
+
+ long prevTime = Long.MAX_VALUE;
+
+ while((line = reader.readLine()) != null)
+ {
+ Matcher m = pattern.matcher(line);
+ if(m.matches())
+ {
+ String timeStr = m.group(1);
+ long time = df.parse(timeStr).getTime();
+ if(time - prevTime > 20000)
+ {
+ System.out.println(df.format(prevTime) + " - " + df.format(time));
+ }
+ prevTime = time;
+ }
+ }
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DelegatingValueWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DelegatingValueWriter.java
new file mode 100644
index 0000000000..b11530d94f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DelegatingValueWriter.java
@@ -0,0 +1,52 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class DelegatingValueWriter<V> implements ValueWriter<V>
+{
+ private ValueWriter _delegate;
+ private Registry _registry;
+
+
+ protected DelegatingValueWriter(final Registry registry)
+ {
+ _registry = registry;
+ }
+
+ public int writeToBuffer(final ByteBuffer buffer)
+ {
+ return _delegate.writeToBuffer(buffer);
+ }
+
+ public void setValue(final V frameBody)
+ {
+ _delegate = _registry.getValueWriter(getUnderlyingValue(frameBody));
+ }
+
+ protected abstract Object getUnderlyingValue(final V frameBody);
+
+ public boolean isComplete()
+ {
+ return _delegate.isComplete();
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedType.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedType.java
new file mode 100644
index 0000000000..2f171c49b2
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedType.java
@@ -0,0 +1,85 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+public class DescribedType
+{
+ private final Object _descriptor;
+ private final Object _described;
+
+ public DescribedType(final Object descriptor, final Object described)
+ {
+ _descriptor = descriptor;
+ _described = described;
+ }
+
+ public Object getDescriptor()
+ {
+ return _descriptor;
+ }
+
+ public Object getDescribed()
+ {
+ return _described;
+ }
+
+ @Override
+ public boolean equals(final Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ final DescribedType that = (DescribedType) o;
+
+ if (_described != null ? !_described.equals(that._described) : that._described != null)
+ {
+ return false;
+ }
+ if (_descriptor != null ? !_descriptor.equals(that._descriptor) : that._descriptor != null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ int result = _descriptor != null ? _descriptor.hashCode() : 0;
+ result = 31 * result + (_described != null ? _described.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "DescribedType{"+ _descriptor +
+ ", " + _described +
+ '}';
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructor.java
new file mode 100644
index 0000000000..4093583441
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructor.java
@@ -0,0 +1,41 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+import java.nio.ByteBuffer;
+
+public abstract class DescribedTypeConstructor<T extends Object>
+{
+ public TypeConstructor<T> construct(final TypeConstructor describedConstructor) throws AmqpErrorException
+ {
+ return new TypeConstructor<T>()
+ {
+ public T construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return DescribedTypeConstructor.this.construct(describedConstructor.construct(in, handler));
+ }
+ };
+ }
+
+ public abstract T construct(Object underlying);
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructorRegistry.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructorRegistry.java
new file mode 100644
index 0000000000..38cfa0f5a7
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructorRegistry.java
@@ -0,0 +1,35 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public interface DescribedTypeConstructorRegistry
+{
+ public static interface Source
+ {
+ public DescribedTypeConstructorRegistry getDescribedTypeRegistry();
+ }
+
+ void register(Object descriptor, DescribedTypeConstructor constructor);
+
+ DescribedTypeConstructor getConstructor(Object descriptor);
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleTypeConstructor.java
new file mode 100644
index 0000000000..439ad73875
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleTypeConstructor.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class DoubleTypeConstructor implements TypeConstructor
+{
+ private static final DoubleTypeConstructor INSTANCE = new DoubleTypeConstructor();
+
+
+ public static DoubleTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private DoubleTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=8)
+ {
+ return in.getDouble();
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct double: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleWriter.java
new file mode 100644
index 0000000000..372e739a51
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleWriter.java
@@ -0,0 +1,54 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public class DoubleWriter extends FixedEightWriter<Double>
+{
+ private static final byte FORMAT_CODE = (byte) 0x82;
+
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ @Override
+ long convertValueToLong(Double value)
+ {
+ return Double.doubleToLongBits(value.doubleValue());
+ }
+
+ private static Factory<Double> FACTORY = new Factory<Double>()
+ {
+
+ public ValueWriter<Double> newInstance(Registry registry)
+ {
+ return new DoubleWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Double.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/Encoder.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/Encoder.java
new file mode 100644
index 0000000000..9b2a654f10
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/Encoder.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedByte;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
+
+import java.nio.ByteBuffer;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface Encoder
+{
+
+ public boolean writeNull();
+
+ public boolean writeBoolean(boolean b);
+
+ public boolean writeByte(byte b);
+
+ public boolean writeUnsignedByte(ByteBuffer buf, UnsignedByte ub);
+
+ public boolean writeShort(ByteBuffer buf, short s);
+
+ public boolean writeUnsignedShort(UnsignedShort s);
+
+ public boolean writeInt(int i);
+
+ public boolean writeUnsignedInt(UnsignedInteger i);
+
+ public boolean writeLong(long l);
+
+ public boolean writeUnsignedLong(UnsignedLong l);
+
+ public boolean writeFloat(float f);
+
+ public boolean writeDouble(double d);
+
+ public boolean writeChar(char c);
+
+ public boolean writeTimestamp(Date d);
+
+ public boolean writeSymbol(Symbol s);
+
+ public boolean writeString(String s);
+
+ public boolean writeBytes(byte[] bytes);
+
+ public boolean writeBytes(Binary bin);
+
+ public boolean writeList(List l);
+
+ public boolean writeMap(Map m);
+
+ public boolean writeEncodable(EncodableValue o);
+
+ public boolean writeDescribedType(EncodableValue descriptor, EncodableValue described);
+
+ interface EncodableValue
+ {
+ void encode(Encoder encoder);
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedEightWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedEightWriter.java
new file mode 100644
index 0000000000..c9cc0b72c3
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedEightWriter.java
@@ -0,0 +1,108 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class FixedEightWriter<T extends Object> implements ValueWriter<T>
+{
+ private int _written = 9;
+ private long _value;
+
+ public final int writeToBuffer(ByteBuffer buffer)
+ {
+ int remaining = buffer.remaining();
+ int written = _written;
+ switch(written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getFormatCode());
+ remaining--;
+ written = 1;
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(remaining>=8)
+ {
+ buffer.putLong(_value);
+ written = 9;
+ break;
+ }
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ if(remaining >= 4)
+ {
+ buffer.putInt((int)((_value >> ((5-written)<<3)) & 0xFFFFFFFF ));
+ remaining-=4;
+ written+=4;
+ }
+ case 6:
+ case 7:
+ if(remaining >= 2 && written <= 7)
+ {
+ buffer.putShort((short)((_value >> ((7-written)<<3)) & 0xFFFF ));
+ remaining -= 2;
+ written += 2;
+ }
+ case 8:
+ if(remaining >=1 && written != 9)
+ {
+ buffer.put((byte)((_value >> ((8-written)<<3)) & 0xFF ));
+ written++;
+ }
+
+
+ }
+ _written = written;
+
+ return 9;
+ }
+
+ abstract byte getFormatCode();
+
+ public final void setValue(T value)
+ {
+ _written = 0;
+ _value = convertValueToLong(value);
+ }
+
+ abstract long convertValueToLong(T value);
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public final boolean isComplete()
+ {
+ return _written == 9;
+ }
+
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedFourWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedFourWriter.java
new file mode 100644
index 0000000000..164a869299
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedFourWriter.java
@@ -0,0 +1,122 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class FixedFourWriter<T extends Object> implements ValueWriter<T>
+{
+ private int _written = 5;
+ private int _value;
+
+ public final int writeToBuffer(ByteBuffer buffer)
+ {
+ int remaining = buffer.remaining();
+ int written = _written;
+ switch(written)
+ {
+ case 0:
+ if(remaining-- != 0)
+ {
+ buffer.put(getFormatCode());
+ written = 1;
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(remaining>=4)
+ {
+ buffer.putInt(_value);
+ written = 5;
+ break;
+ }
+ else if(remaining-- != 0)
+ {
+ buffer.put((byte)((_value >> 24)&0xFF));
+ written = 2;
+ }
+ else
+ {
+ break;
+ }
+ case 2:
+ if(remaining-- != 0)
+ {
+ buffer.put((byte)((_value >> 16)&0xFF));
+ written = 3;
+ }
+ else
+ {
+ break;
+ }
+ case 3:
+ if(remaining-- != 0)
+ {
+ buffer.put((byte)((_value >> 8)&0xFF));
+ written = 4;
+ }
+ else
+ {
+ break;
+ }
+ case 4:
+ if(remaining-- != 0)
+ {
+ buffer.put((byte)(_value&0xFF));
+ written = 5;
+ }
+
+ }
+ _written = written;
+
+ return 5;
+ }
+
+ abstract byte getFormatCode();
+
+ public final void setValue(T value)
+ {
+ if(_written==1)
+ {
+ // TODO - remove
+ System.out.println("Remove");
+ }
+ _written = 0;
+ _value = convertValueToInt(value);
+ }
+
+ abstract int convertValueToInt(T value);
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public final boolean isComplete()
+ {
+ return _written == 5;
+ }
+
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedOneWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedOneWriter.java
new file mode 100644
index 0000000000..805b0743a4
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedOneWriter.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+
+public abstract class FixedOneWriter<T> implements ValueWriter<T>
+{
+ protected int _written = 2;
+ protected byte _value;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ switch(_written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getFormatCode());
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(_value);
+ _written = 2;
+ }
+ else
+ {
+ _written = 1;
+ }
+
+ }
+
+ return 2;
+ }
+
+ protected abstract byte getFormatCode();
+
+ public boolean isComplete()
+ {
+ return _written == 2;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public void setValue(final T value)
+ {
+ _written = 0;
+ _value = convertToByte(value);
+ }
+
+ protected abstract byte convertToByte(final T value);
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedSixteenWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedSixteenWriter.java
new file mode 100644
index 0000000000..20334595db
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedSixteenWriter.java
@@ -0,0 +1,150 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class FixedSixteenWriter<T extends Object> implements ValueWriter<T>
+{
+ private int _written = 17;
+ private long _msb;
+ private long _lsb;
+
+ public final int writeToBuffer(ByteBuffer buffer)
+ {
+ int remaining = buffer.remaining();
+ int written = _written;
+ switch(written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getFormatCode());
+ remaining--;
+ written = 1;
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(remaining>=8)
+ {
+ buffer.putLong(_msb);
+ written = 9;
+ break;
+ }
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ if(remaining >= 4)
+ {
+ buffer.putInt((int)((_msb >> ((5-written)<<3)) & 0xFFFFFFFF ));
+ remaining-=4;
+ written+=4;
+ }
+ case 6:
+ case 7:
+ if(remaining >= 2 && written <= 7)
+ {
+ buffer.putShort((short)((_msb >> ((7-written)<<3)) & 0xFFFF ));
+ remaining -= 2;
+ written += 2;
+ }
+ case 8:
+ if(remaining >=1 && written != 9)
+ {
+ buffer.put((byte)((_msb >> ((8-written)<<3)) & 0xFF ));
+ written++;
+ }
+
+
+ }
+ if(remaining != 0)
+ {
+ switch(written)
+ {
+ case 9:
+ if(remaining>=8)
+ {
+ buffer.putLong(_lsb);
+ written = 17;
+ break;
+ }
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ if(remaining >= 4)
+ {
+ buffer.putInt((int)((_lsb >> ((13-written)<<3)) & 0xFFFFFFFF ));
+ remaining-=4;
+ written+=4;
+ }
+ case 14:
+ case 15:
+ if(remaining >= 2 && written <= 15)
+ {
+ buffer.putShort((short)((_lsb >> ((15-written)<<3)) & 0xFFFF ));
+ remaining -= 2;
+ written += 2;
+ }
+ case 16:
+ if(remaining >=1 && written != 17)
+ {
+ buffer.put((byte)((_msb >> ((16-written)<<3)) & 0xFF ));
+ written++;
+ }
+ }
+
+ }
+
+ _written = written;
+
+ return 17;
+ }
+
+ abstract byte getFormatCode();
+
+ public final void setValue(T value)
+ {
+ _written = 0;
+ _msb = convertValueToMSB(value);
+ _lsb = convertValueToLSB(value);
+ }
+
+ abstract long convertValueToMSB(T value);
+ abstract long convertValueToLSB(T value);
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public final boolean isComplete()
+ {
+ return _written == 17;
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedTwoWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedTwoWriter.java
new file mode 100644
index 0000000000..f6da0490a6
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedTwoWriter.java
@@ -0,0 +1,96 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class FixedTwoWriter <T extends Object> implements ValueWriter<T>
+{
+ private int _written = 3;
+ private short _value;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ switch(_written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getFormatCode());
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+
+ if(buffer.remaining()>1)
+ {
+ buffer.putShort(_value);
+ _written = 3;
+ }
+ else if(buffer.hasRemaining())
+ {
+ buffer.put((byte) (0xFF & (_value >> 8)));
+ _written = 2;
+ }
+ else
+ {
+ _written = 1;
+ }
+ break;
+ case 2:
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)(0xFF & _value));
+ }
+
+
+ }
+
+ return 3;
+ }
+
+
+ public final void setValue(T value)
+ {
+ _written = 0;
+ _value = convertValueToShort(value);
+ }
+
+ abstract short convertValueToShort(T value);
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public boolean isComplete()
+ {
+ return _written == 3;
+ }
+
+ abstract byte getFormatCode();
+
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatTypeConstructor.java
new file mode 100644
index 0000000000..200fead74e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatTypeConstructor.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class FloatTypeConstructor implements TypeConstructor
+{
+ private static final FloatTypeConstructor INSTANCE = new FloatTypeConstructor();
+
+
+ public static FloatTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private FloatTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=4)
+ {
+ return in.getFloat();
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct float: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatWriter.java
new file mode 100644
index 0000000000..823e33c3f8
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatWriter.java
@@ -0,0 +1,54 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public class FloatWriter extends FixedFourWriter<Float>
+{
+ private static final byte FORMAT_CODE = (byte)0x72;
+
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ @Override
+ int convertValueToInt(Float value)
+ {
+ return Float.floatToIntBits(value.floatValue());
+ }
+
+ private static Factory<Float> FACTORY = new Factory<Float>()
+ {
+
+ public ValueWriter<Float> newInstance(Registry registry)
+ {
+ return new FloatWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Float.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FrameWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FrameWriter.java
new file mode 100644
index 0000000000..dbf9306366
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FrameWriter.java
@@ -0,0 +1,245 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+
+import java.nio.ByteBuffer;
+
+public class FrameWriter implements ValueWriter<AMQFrame>
+{
+ private Registry _registry;
+ private AMQFrame _frame;
+ private State _state = State.DONE;
+ private ValueWriter _typeWriter;
+ private int _size = -1;
+ private static final byte[] EMPTY_BYTE_ARRAY = new byte[] {};
+ private ByteBuffer _payload;
+
+ enum State
+ {
+ SIZE_0,
+ SIZE_1,
+ SIZE_2,
+ SIZE_3,
+ DOFF,
+ TYPE,
+ CHANNEL_0,
+ CHANNEL_1,
+ DELEGATE,
+ PAYLOAD,
+ DONE
+ }
+
+ public FrameWriter(final Registry registry)
+ {
+ _registry = registry;
+ }
+
+ public boolean isComplete()
+ {
+ return _state == State.DONE;
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+ int remaining;
+
+
+
+ while((remaining = buffer.remaining()) != 0 && _state != State.DONE)
+ {
+ switch(_state)
+ {
+ case SIZE_0:
+
+ _typeWriter.setValue(_frame.getFrameBody());
+
+ int payloadLength = _payload == null ? 0 : _payload.remaining();
+
+ _size = _typeWriter.writeToBuffer(remaining > 8
+ ? (ByteBuffer)buffer.duplicate().position(buffer.position()+8)
+ : ByteBuffer.wrap(EMPTY_BYTE_ARRAY)) + 8 + payloadLength;
+ if(remaining >= 4)
+ {
+ buffer.putInt(_size);
+
+ if(remaining >= 8)
+ {
+ buffer.put((byte)2); // DOFF
+ buffer.put(_frame.getFrameType()); // AMQP Frame Type
+ buffer.putShort(_frame.getChannel());
+
+ if(_size - payloadLength > remaining)
+ {
+ buffer.position(buffer.limit());
+ _state = State.DELEGATE;
+ }
+ else if(_size > remaining )
+ {
+ buffer.position(buffer.position()+_size-8-payloadLength);
+ if(payloadLength > 0)
+ {
+
+ ByteBuffer dup = _payload.slice();
+ int payloadUsed = buffer.remaining();
+ dup.limit(payloadUsed);
+ buffer.put(dup);
+ _payload.position(_payload.position()+payloadUsed);
+ }
+ _state = State.PAYLOAD;
+ }
+ else
+ {
+
+ buffer.position(buffer.position()+_size-8-payloadLength);
+ if(payloadLength > 0)
+ {
+ buffer.put(_payload);
+ }
+ _state = State.DONE;
+ }
+
+ }
+ else
+ {
+ _state = State.DOFF;
+ }
+ break;
+ }
+ else
+ {
+ buffer.put((byte)((_size >> 24) & 0xFF));
+ if(!buffer.hasRemaining())
+ {
+ _state = State.SIZE_1;
+ break;
+ }
+ }
+
+ case SIZE_1:
+ buffer.put((byte)((_size >> 16) & 0xFF));
+ if(!buffer.hasRemaining())
+ {
+ _state = State.SIZE_2;
+ break;
+ }
+ case SIZE_2:
+ buffer.put((byte)((_size >> 8) & 0xFF));
+ if(!buffer.hasRemaining())
+ {
+ _state = State.SIZE_3;
+ break;
+ }
+ case SIZE_3:
+ buffer.put((byte)(_size & 0xFF));
+ if(!buffer.hasRemaining())
+ {
+ _state = State.DOFF;
+ break;
+ }
+ case DOFF:
+ buffer.put((byte)2); // Always 2 (8 bytes)
+ if(!buffer.hasRemaining())
+ {
+ _state = State.TYPE;
+ break;
+ }
+ case TYPE:
+ buffer.put((byte)0);
+ if(!buffer.hasRemaining())
+ {
+ _state = State.CHANNEL_0;
+ break;
+ }
+ case CHANNEL_0:
+ buffer.put((byte)((_frame.getChannel() >> 8) & 0xFF));
+ if(!buffer.hasRemaining())
+ {
+ _state = State.CHANNEL_1;
+ break;
+ }
+ case CHANNEL_1:
+ buffer.put((byte)(_frame.getChannel() & 0xFF));
+ if(!buffer.hasRemaining())
+ {
+ _state = State.DELEGATE;
+ break;
+ }
+ case DELEGATE:
+ _typeWriter.writeToBuffer(buffer);
+ if(_typeWriter.isComplete())
+ {
+ _state = State.PAYLOAD;
+ _frame = null;
+ _typeWriter = null;
+ }
+ else
+ {
+ break;
+ }
+ case PAYLOAD:
+ if(_payload == null || _payload.remaining() == 0)
+ {
+ _state = State.DONE;
+ _frame = null;
+ _typeWriter = null;
+ _payload = null;
+
+ }
+ else if(buffer.hasRemaining())
+ {
+ buffer.put(_payload);
+ if(_payload.remaining() == 0)
+ {
+ _state = State.DONE;
+ _frame = null;
+ _typeWriter = null;
+ _payload = null;
+ }
+ }
+
+ }
+ }
+ if(_size == -1)
+ {
+ _size = _typeWriter.writeToBuffer(ByteBuffer.wrap(EMPTY_BYTE_ARRAY)) + 8 + (_payload == null ? 0 : _payload.remaining());
+ }
+ return _size;
+ }
+
+ public void setValue(AMQFrame frame)
+ {
+ _frame = frame;
+ _state = State.SIZE_0;
+ _size = -1;
+ _payload = null;
+ final Object frameBody = frame.getFrameBody();
+ _typeWriter = _registry.getValueWriter(frameBody);
+ _payload = frame.getPayload() == null ? null : frame.getPayload().duplicate();
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntTypeConstructor.java
new file mode 100644
index 0000000000..b3e774de5c
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntTypeConstructor.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class IntTypeConstructor implements TypeConstructor
+{
+ private static final IntTypeConstructor INSTANCE = new IntTypeConstructor();
+
+
+ public static IntTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private IntTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=4)
+ {
+ return in.getInt();
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct int: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntegerWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntegerWriter.java
new file mode 100644
index 0000000000..91c3151494
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntegerWriter.java
@@ -0,0 +1,106 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class IntegerWriter implements ValueWriter<Integer>
+{
+ private static final byte EIGHT_BYTE_FORMAT_CODE = (byte)0x71;
+ private static final byte ONE_BYTE_FORMAT_CODE = (byte) 0x54;
+
+ private ValueWriter<Integer> _delegate;
+
+ private final FixedFourWriter<Integer> _eightByteWriter = new FixedFourWriter<Integer>()
+ {
+
+ @Override
+ byte getFormatCode()
+ {
+ return EIGHT_BYTE_FORMAT_CODE;
+ }
+
+ @Override
+ int convertValueToInt(Integer value)
+ {
+ return value.intValue();
+ }
+ };
+
+ private final ValueWriter<Integer> _oneByteWriter = new FixedOneWriter<Integer>()
+ {
+
+ @Override protected byte getFormatCode()
+ {
+ return ONE_BYTE_FORMAT_CODE;
+ }
+
+ @Override protected byte convertToByte(final Integer value)
+ {
+ return value.byteValue();
+ }
+ };
+
+
+ public int writeToBuffer(final ByteBuffer buffer)
+ {
+ return _delegate.writeToBuffer(buffer);
+ }
+
+ public void setValue(final Integer i)
+ {
+ if(i >= -128 && i <= 127)
+ {
+ _delegate = _oneByteWriter;
+ }
+ else
+ {
+ _delegate = _eightByteWriter;
+ }
+ _delegate.setValue(i);
+ }
+
+ public boolean isComplete()
+ {
+ return _delegate.isComplete();
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+
+ private static Factory<Integer> FACTORY = new Factory<Integer>()
+ {
+
+ public ValueWriter<Integer> newInstance(Registry registry)
+ {
+ return new IntegerWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Integer.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ListWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ListWriter.java
new file mode 100644
index 0000000000..3e0164705f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ListWriter.java
@@ -0,0 +1,172 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+import java.util.List;
+
+public class ListWriter implements ValueWriter<List>
+{
+ private static class NonEmptyListWriter extends AbstractListWriter<List>
+ {
+ private List _list;
+ private int _position = 0;
+
+ public NonEmptyListWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final List value)
+ {
+ _list = value;
+ _position = 0;
+
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _list.size();
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _position < getCount();
+ }
+
+ @Override
+ protected Object next()
+ {
+ return _list.get(_position++);
+ }
+
+ @Override
+ protected void clear()
+ {
+ _list = null;
+ _position = 0;
+ }
+
+ @Override
+ protected void reset()
+ {
+ _position = 0;
+ }
+
+ }
+
+ private final NonEmptyListWriter _nonEmptyListWriter;
+ private static final byte ZERO_BYTE_FORMAT_CODE = (byte) 0x45;
+
+ private final ValueWriter<List> _emptyListWriter = new EmptyListValueWriter();
+
+
+ private ValueWriter<List> _delegate;
+
+ public ListWriter(final Registry registry)
+ {
+ _nonEmptyListWriter = new NonEmptyListWriter(registry);
+
+ }
+
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+ return _delegate.writeToBuffer(buffer);
+ }
+
+ public void setValue(List frameBody)
+ {
+ if(frameBody.isEmpty())
+ {
+ _delegate = _emptyListWriter;
+ }
+ else
+ {
+ _delegate = _nonEmptyListWriter;
+ }
+ _delegate.setValue(frameBody);
+ }
+
+ public boolean isComplete()
+ {
+ return _delegate.isComplete();
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+
+
+ private static Factory<List> FACTORY = new Factory<List>()
+ {
+
+ public ValueWriter<List> newInstance(Registry registry)
+ {
+ return new ListWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(List.class, FACTORY);
+ }
+
+ public static class EmptyListValueWriter implements ValueWriter<List>
+ {
+ private boolean _complete;
+
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ if(!_complete && buffer.hasRemaining())
+ {
+ buffer.put(ZERO_BYTE_FORMAT_CODE);
+ _complete = true;
+ }
+
+ return 1;
+ }
+
+ public void setValue(List list)
+ {
+ _complete = false;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public boolean isComplete()
+ {
+ return _complete;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongTypeConstructor.java
new file mode 100644
index 0000000000..b9a4509a04
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongTypeConstructor.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class LongTypeConstructor implements TypeConstructor
+{
+ private static final LongTypeConstructor INSTANCE = new LongTypeConstructor();
+
+
+ public static LongTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private LongTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=8)
+ {
+ return in.getLong();
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct long: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongWriter.java
new file mode 100644
index 0000000000..984775cc74
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongWriter.java
@@ -0,0 +1,111 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class LongWriter implements ValueWriter<Long>
+{
+ private static final byte EIGHT_BYTE_FORMAT_CODE = (byte) 0x81;
+
+
+ private static final byte ONE_BYTE_FORMAT_CODE = (byte) 0x55;
+
+ private ValueWriter<Long> _delegate;
+
+ private final FixedEightWriter<Long> _eightByteWriter = new FixedEightWriter<Long>()
+ {
+
+ @Override
+ byte getFormatCode()
+ {
+ return EIGHT_BYTE_FORMAT_CODE;
+ }
+
+ @Override
+ long convertValueToLong(Long value)
+ {
+ return value;
+ }
+
+ };
+
+ private final ValueWriter<Long> _oneByteWriter = new FixedOneWriter<Long>()
+ {
+
+ @Override protected byte getFormatCode()
+ {
+ return ONE_BYTE_FORMAT_CODE;
+ }
+
+ @Override protected byte convertToByte(final Long value)
+ {
+ return value.byteValue();
+ }
+ };
+
+ public int writeToBuffer(final ByteBuffer buffer)
+ {
+ return _delegate.writeToBuffer(buffer);
+ }
+
+ public void setValue(final Long l)
+ {
+ if(l >= -128 && l <= 127)
+ {
+ _delegate = _oneByteWriter;
+ }
+ else
+ {
+ _delegate = _eightByteWriter;
+ }
+ _delegate.setValue(l);
+ }
+
+ public boolean isComplete()
+ {
+ return _delegate.isComplete();
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+
+
+
+ private static Factory<Long> FACTORY = new Factory<Long>()
+ {
+
+ public ValueWriter<Long> newInstance(Registry registry)
+ {
+ return new LongWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Long.class, FACTORY);
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/MapWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/MapWriter.java
new file mode 100644
index 0000000000..b239d4a397
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/MapWriter.java
@@ -0,0 +1,102 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.util.Iterator;
+import java.util.Map;
+
+public class MapWriter extends AbstractMapWriter<Map>
+{
+ private Map _map;
+ private Object _value;
+ private Iterator<Map.Entry> _iterator;
+
+ public MapWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Map value)
+ {
+ _map = value;
+ _iterator = value.entrySet().iterator();
+ }
+
+ @Override
+ protected int getMapCount()
+ {
+ return _map.size();
+ }
+
+ @Override
+ protected boolean hasMapNext()
+ {
+ return _iterator.hasNext();
+ }
+
+ @Override
+ protected Object nextKey()
+ {
+ Map.Entry entry = _iterator.next();
+ _value = entry.getValue();
+ return entry.getKey();
+ }
+ @Override
+ protected Object nextValue()
+ {
+ Object value = _value;
+ _value = null;
+ return value;
+ }
+
+
+ @Override
+ protected void onClear()
+ {
+ _map = null;
+ _iterator = null;
+ _value = null;
+ }
+
+ @Override
+ protected void onReset()
+ {
+ _iterator = _map.entrySet().iterator();
+ _value = null;
+ }
+
+
+ private static Factory<Map> FACTORY = new Factory<Map>()
+ {
+
+ public ValueWriter<Map> newInstance(Registry registry)
+ {
+ return new MapWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Map.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullTypeConstructor.java
new file mode 100644
index 0000000000..6b46895708
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullTypeConstructor.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+import java.nio.ByteBuffer;
+
+class NullTypeConstructor implements TypeConstructor<Void>
+{
+ private static final NullTypeConstructor INSTANCE = new NullTypeConstructor();
+
+ NullTypeConstructor()
+ {
+ }
+
+ public Void construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return null;
+ }
+
+ public static NullTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullWriter.java
new file mode 100644
index 0000000000..690a2222ab
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullWriter.java
@@ -0,0 +1,70 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class NullWriter implements ValueWriter<Void>
+{
+ private boolean _complete = true;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ if(!_complete && buffer.hasRemaining())
+ {
+ buffer.put((byte)0x40);
+ _complete = true;
+ }
+
+ return 1;
+ }
+
+ public void setValue(Void frameBody)
+ {
+ _complete = false;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public boolean isComplete()
+ {
+ return _complete;
+ }
+
+ private static Factory<Void> FACTORY = new Factory<Void>()
+ {
+
+ public ValueWriter<Void> newInstance(Registry registry)
+ {
+ return new NullWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Void.TYPE, FACTORY);
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHandler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHandler.java
new file mode 100644
index 0000000000..a954c6db50
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHandler.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public interface ProtocolHandler
+{
+ ProtocolHandler parse(ByteBuffer in);
+
+ boolean isDone();
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHeaderHandler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHeaderHandler.java
new file mode 100644
index 0000000000..f72fea56b2
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHeaderHandler.java
@@ -0,0 +1,146 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.framing.AMQPProtocolHeaderHandler;
+import org.apache.qpid.amqp_1_0.framing.SASLProtocolHeaderHandler;
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+import java.nio.ByteBuffer;
+
+public class ProtocolHeaderHandler implements ProtocolHandler
+{
+ private final ConnectionEndpoint _connection;
+ private ProtocolHandler[] _protocolHandlers = new ProtocolHandler[4];
+ private boolean _done;
+
+ enum State {
+ AWAITING_A,
+ AWAITING_M,
+ AWAITING_Q,
+ AWAITING_P,
+ AWAITING_PROTOCOL_ID,
+ ERROR
+ }
+
+ private State _state = State.AWAITING_A;
+
+ public ProtocolHeaderHandler(final ConnectionEndpoint connection)
+ {
+ _connection = connection;
+ _protocolHandlers[0] = new AMQPProtocolHeaderHandler(connection);
+ _protocolHandlers[1] = null ; // historic apache.qpid.amqp_1_0
+ _protocolHandlers[2] = null ; // TLS
+ _protocolHandlers[3] = new SASLProtocolHeaderHandler(connection); // SASL
+
+
+ }
+
+ public ProtocolHandler parse(final ByteBuffer in)
+ {
+ if(!in.hasRemaining())
+ {
+ return this;
+ }
+
+ switch(_state)
+ {
+ case AWAITING_A:
+ if(transition(in, (byte)'A', State.AWAITING_M))
+ {
+ break;
+ }
+ case AWAITING_M:
+ if(transition(in, (byte)'M', State.AWAITING_Q))
+ {
+ break;
+ }
+ case AWAITING_Q:
+ if(transition(in, (byte)'Q', State.AWAITING_P))
+ {
+ break;
+ }
+
+ case AWAITING_P:
+ if(transition(in, (byte)'P', State.AWAITING_PROTOCOL_ID))
+ {
+ break;
+ }
+ case AWAITING_PROTOCOL_ID:
+ int protocolId = ((int) in.get()) & 0xff;
+ ProtocolHandler delegate;
+
+ try
+ {
+ delegate = _protocolHandlers[protocolId];
+ }
+ catch(IndexOutOfBoundsException e)
+ {
+ delegate = null;
+ }
+
+ if(delegate == null)
+ {
+ _state = State.ERROR;
+ }
+ else
+ {
+ return delegate.parse(in);
+ }
+ }
+ if(_state == State.ERROR)
+ {
+ _connection.invalidHeaderReceived();
+ _done = true;
+ }
+ return this;
+
+ }
+
+ boolean transition(ByteBuffer in, byte expected, State next)
+ {
+ byte b = in.get();
+ if(b == expected)
+ {
+ if(!in.hasRemaining())
+ {
+ _state = next;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ _state = State.ERROR;
+ return true;
+ }
+ }
+
+
+ public boolean isDone()
+ {
+ return _done;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/RestrictedTypeValueWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/RestrictedTypeValueWriter.java
new file mode 100644
index 0000000000..cbc8277dc8
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/RestrictedTypeValueWriter.java
@@ -0,0 +1,55 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.RestrictedType;
+
+public class RestrictedTypeValueWriter<V> extends DelegatingValueWriter<RestrictedType<V>>
+{
+ public RestrictedTypeValueWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected Object getUnderlyingValue(final RestrictedType<V> restrictedType)
+ {
+ return restrictedType.getValue();
+ }
+
+ private static Factory FACTORY = new Factory()
+ {
+
+ public ValueWriter newInstance(Registry registry)
+ {
+ return new RestrictedTypeValueWriter(registry);
+ }
+ };
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public static void register(ValueWriter.Registry registry, Class clazz)
+ {
+ registry.register(clazz, FACTORY);
+ }}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortTypeConstructor.java
new file mode 100644
index 0000000000..648ed36c69
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortTypeConstructor.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class ShortTypeConstructor implements TypeConstructor
+{
+ private static final ShortTypeConstructor INSTANCE = new ShortTypeConstructor();
+
+
+ public static ShortTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private ShortTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=2)
+ {
+ return in.getShort();
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct short: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortWriter.java
new file mode 100644
index 0000000000..52ec577c3e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortWriter.java
@@ -0,0 +1,55 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public class ShortWriter extends FixedTwoWriter<Short>
+{
+
+ private static final byte FORMAT_CODE = (byte)0x61;
+
+
+ @Override
+ short convertValueToShort(Short value)
+ {
+ return value.shortValue();
+ }
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ private static Factory<Short> FACTORY = new Factory<Short>()
+ {
+
+ public ValueWriter<Short> newInstance(Registry registry)
+ {
+ return new ShortWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Short.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SimpleVariableWidthWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SimpleVariableWidthWriter.java
new file mode 100644
index 0000000000..bd14483361
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SimpleVariableWidthWriter.java
@@ -0,0 +1,68 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class SimpleVariableWidthWriter<V> extends VariableWidthWriter<V>
+{
+ private byte[] _buf;
+
+
+ public void setValue(V value)
+ {
+ _buf = getByteArray(value);
+ super.setValue(value);
+ }
+
+ protected int getLength()
+ {
+ return _buf.length;
+ }
+
+ protected void writeBytes(ByteBuffer buf, int offset, int length)
+ {
+ buf.put(_buf, getOffset()+offset, length);
+ }
+
+ @Override
+ protected void clearValue()
+ {
+ _buf = null;
+ }
+
+ @Override
+ protected boolean hasValue()
+ {
+ return _buf != null;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ protected abstract byte[] getByteArray(V value);
+
+ protected abstract int getOffset();
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallIntConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallIntConstructor.java
new file mode 100644
index 0000000000..07fa853dce
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallIntConstructor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class SmallIntConstructor implements TypeConstructor
+{
+ private static final SmallIntConstructor INSTANCE = new SmallIntConstructor();
+
+
+ public static SmallIntConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private SmallIntConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ byte b = in.get();
+ return (int) b;
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct int: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallLongConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallLongConstructor.java
new file mode 100644
index 0000000000..013b9bef64
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallLongConstructor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class SmallLongConstructor implements TypeConstructor
+{
+ private static final SmallLongConstructor INSTANCE = new SmallLongConstructor();
+
+
+ public static SmallLongConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private SmallLongConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ byte b = in.get();
+ return (long) b;
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct long: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallUIntConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallUIntConstructor.java
new file mode 100644
index 0000000000..b3a9e3ef19
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallUIntConstructor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class SmallUIntConstructor implements TypeConstructor
+{
+ private static final SmallUIntConstructor INSTANCE = new SmallUIntConstructor();
+
+
+ public static SmallUIntConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private SmallUIntConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ byte b = in.get();
+ return UnsignedInteger.valueOf(((int) b) & 0xff);
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct uint: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallULongConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallULongConstructor.java
new file mode 100644
index 0000000000..38cd0b65ac
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallULongConstructor.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class SmallULongConstructor implements TypeConstructor
+{
+ private static final SmallULongConstructor INSTANCE = new SmallULongConstructor();
+
+
+ public static SmallULongConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private SmallULongConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ byte b = in.get();
+ return UnsignedLong.valueOf(((long) b) & 0xffL);
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct ulong: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringTypeConstructor.java
new file mode 100644
index 0000000000..73b85d4163
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringTypeConstructor.java
@@ -0,0 +1,132 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class StringTypeConstructor extends VariableWidthTypeConstructor
+{
+ private Charset _charSet;
+
+ private BinaryString _defaultBinaryString = new BinaryString();
+ private ValueCache<BinaryString, String> _cachedValues = new ValueCache<BinaryString, String>(10);
+
+ private static final class ValueCache<K,V> extends LinkedHashMap<K,V>
+ {
+ private final int _cacheSize;
+
+ public ValueCache(int cacheSize)
+ {
+ _cacheSize = cacheSize;
+ }
+
+ @Override
+ protected boolean removeEldestEntry(Map.Entry<K, V> eldest)
+ {
+ return size() > _cacheSize;
+ }
+
+ public boolean isFull()
+ {
+ return size() == _cacheSize;
+ }
+ }
+
+
+ public static StringTypeConstructor getInstance(int i, Charset c)
+ {
+ return new StringTypeConstructor(i, c);
+ }
+
+
+ private StringTypeConstructor(int size, Charset c)
+ {
+ super(size);
+ _charSet = c;
+ }
+
+ @Override
+ public Object construct(final ByteBuffer in, boolean isCopy, ValueHandler handler) throws AmqpErrorException
+ {
+ int size;
+
+ if(getSize() == 1)
+ {
+ size = in.get() & 0xFF;
+ }
+ else
+ {
+ size = in.getInt();
+ }
+
+ int origPosition = in.position();
+ _defaultBinaryString.setData(in.array(), in.arrayOffset()+ origPosition, size);
+
+ BinaryString binaryStr = _defaultBinaryString;
+
+ boolean isFull = _cachedValues.isFull();
+
+ String str = isFull ? _cachedValues.remove(binaryStr) : _cachedValues.get(binaryStr);
+
+ if(str == null)
+ {
+
+ ByteBuffer dup = in.duplicate();
+ try
+ {
+ dup.limit(dup.position()+size);
+ }
+ catch(IllegalArgumentException e)
+ {
+ throw new IllegalArgumentException("position: " + dup.position() + "size: " + size + " capacity: " + dup.capacity());
+ }
+ CharBuffer charBuf = _charSet.decode(dup);
+
+ str = charBuf.toString();
+
+ byte[] data = new byte[size];
+ in.get(data);
+ binaryStr = new BinaryString(data, 0, size);
+
+ _cachedValues.put(binaryStr, str);
+ }
+ else if(isFull)
+ {
+ byte[] data = new byte[size];
+ in.get(data);
+ binaryStr = new BinaryString(data, 0, size);
+
+ _cachedValues.put(binaryStr, str);
+ }
+
+ in.position(origPosition+size);
+
+ return str;
+
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringWriter.java
new file mode 100644
index 0000000000..39f759e54d
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringWriter.java
@@ -0,0 +1,146 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class StringWriter extends SimpleVariableWidthWriter<String>
+{
+ private static final Charset ENCODING_CHARSET;
+ private static final byte ONE_BYTE_CODE;
+ private static final byte FOUR_BYTE_CODE;
+ static
+ {
+ Charset defaultCharset = Charset.defaultCharset();
+ if(defaultCharset.name().equals("UTF-16") || defaultCharset.name().equals("UTF-16BE"))
+ {
+ ENCODING_CHARSET = defaultCharset;
+ ONE_BYTE_CODE = (byte) 0xa2;
+ FOUR_BYTE_CODE = (byte) 0xb2;
+ }
+ else
+ {
+ ENCODING_CHARSET = Charset.forName("UTF-8");
+ ONE_BYTE_CODE = (byte) 0xa1;
+ FOUR_BYTE_CODE = (byte) 0xb1;
+ }
+ }
+
+ private static final class ValueCache<K,V> extends LinkedHashMap<K,V>
+ {
+ private final int _cacheSize;
+
+ public ValueCache(int cacheSize)
+ {
+ _cacheSize = cacheSize;
+ }
+
+ @Override
+ protected boolean removeEldestEntry(Map.Entry<K, V> eldest)
+ {
+ return size() > _cacheSize;
+ }
+
+ public boolean isFull()
+ {
+ return size() == _cacheSize;
+ }
+ }
+
+ private final ValueCache<String, byte[]> _cachedEncodings = new ValueCache<String, byte[]>(10);
+
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return FOUR_BYTE_CODE;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return ONE_BYTE_CODE;
+ }
+
+ @Override
+ protected byte[] getByteArray(String value)
+ {
+
+ byte[] encoding;
+ boolean isFull = _cachedEncodings.isFull();
+ if(isFull)
+ {
+ encoding = _cachedEncodings.remove(value);
+ }
+ else
+ {
+ encoding = _cachedEncodings.get(value);
+ }
+
+
+ if(encoding == null)
+ {
+ ByteBuffer buf = ENCODING_CHARSET.encode(value);
+ if(buf.hasArray() && buf.arrayOffset() == 0 && buf.limit()==buf.capacity())
+ {
+ encoding = buf.array();
+ }
+ else
+ {
+ byte[] bufArray = new byte[buf.limit()-buf.position()];
+ buf.get(bufArray);
+ encoding = bufArray;
+ }
+ _cachedEncodings.put(value,encoding);
+
+ }
+ else if(isFull)
+ {
+ _cachedEncodings.put(value,encoding);
+ }
+
+ return encoding;
+ }
+
+ @Override
+ protected int getOffset()
+ {
+ return 0;
+ }
+
+ private static Factory<String> FACTORY = new Factory<String>()
+ {
+
+ public ValueWriter<String> newInstance(Registry registry)
+ {
+ return new StringWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(String.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolArrayWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolArrayWriter.java
new file mode 100644
index 0000000000..234a6afe24
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolArrayWriter.java
@@ -0,0 +1,170 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.Symbol;
+
+import java.nio.ByteBuffer;
+
+public class SymbolArrayWriter extends VariableWidthWriter<Symbol[]>
+{
+
+ private int _length;
+ private byte[] _encodedVal;
+
+ @Override protected void clearValue()
+ {
+ _encodedVal = null;
+ }
+
+ @Override protected boolean hasValue()
+ {
+ return _encodedVal != null;
+ }
+
+ @Override protected byte getFourOctetEncodingCode()
+ {
+ return (byte) 0xf0;
+ }
+
+ @Override protected byte getSingleOctetEncodingCode()
+ {
+ return (byte) 0xe0;
+ }
+
+ @Override protected int getLength()
+ {
+ return _length;
+ }
+
+ @Override protected void writeBytes(final ByteBuffer buf, final int offset, final int length)
+ {
+ buf.put(_encodedVal,offset,length);
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+ public void setValue(final Symbol[] value)
+ {
+
+ boolean useSmallConstructor = useSmallConstructor(value);
+ boolean isSmall = useSmallConstructor && canFitInSmall(value);
+ if(isSmall)
+ {
+ _length = 2;
+ }
+ else
+ {
+ _length = 5;
+ }
+ for(Symbol symbol : value)
+ {
+ _length += symbol.length() ;
+ }
+ _length += value.length * (useSmallConstructor ? 1 : 4);
+
+
+ _encodedVal = new byte[_length];
+
+ ByteBuffer buf = ByteBuffer.wrap(_encodedVal);
+ if(isSmall)
+ {
+ buf.put((byte)value.length);
+ buf.put(SymbolWriter.SMALL_ENCODING_CODE);
+ }
+ else
+ {
+ buf.putInt(value.length);
+ buf.put(SymbolWriter.LARGE_ENCODING_CODE);
+ }
+
+ for(Symbol symbol : value)
+ {
+ if(isSmall)
+ {
+ buf.put((byte)symbol.length());
+ }
+ else
+ {
+ buf.putInt(symbol.length());
+ }
+
+
+ for(int i = 0; i < symbol.length(); i++)
+ {
+ buf.put((byte)symbol.charAt(i));
+ }
+ }
+
+
+
+ super.setValue(value);
+ }
+
+ private boolean useSmallConstructor(final Symbol[] value)
+ {
+ for(Symbol sym : value)
+ {
+ if(sym.length()>255)
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean canFitInSmall(final Symbol[] value)
+ {
+ if(value.length>=127)
+ {
+ return false;
+ }
+
+ int remaining = 253 - value.length;
+ for(Symbol symbol : value)
+ {
+
+ if((remaining -= symbol.length()) < 0)
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+
+ private static Factory<Symbol[]> FACTORY = new Factory<Symbol[]>()
+ {
+
+ public ValueWriter<Symbol[]> newInstance(Registry registry)
+ {
+ return new SymbolArrayWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Symbol[].class, FACTORY);
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolTypeConstructor.java
new file mode 100644
index 0000000000..ce0f5cb26b
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolTypeConstructor.java
@@ -0,0 +1,109 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class SymbolTypeConstructor extends VariableWidthTypeConstructor
+{
+ private static final Charset ASCII = Charset.forName("US-ASCII");
+
+ private BinaryString _defaultBinaryString = new BinaryString();
+
+ private static final ConcurrentHashMap<BinaryString, Symbol> SYMBOL_MAP =
+ new ConcurrentHashMap<BinaryString, Symbol>(2048);
+
+ public static SymbolTypeConstructor getInstance(int i)
+ {
+ return new SymbolTypeConstructor(i);
+ }
+
+
+ private SymbolTypeConstructor(int size)
+ {
+ super(size);
+ }
+
+ @Override
+ public Object construct(final ByteBuffer in, boolean isCopy, ValueHandler handler) throws AmqpErrorException
+ {
+ int size;
+
+ if(getSize() == 1)
+ {
+ size = in.get() & 0xFF;
+ }
+ else
+ {
+ size = in.getInt();
+ }
+
+ _defaultBinaryString.setData(in.array(), in.arrayOffset()+in.position(), size);
+
+ BinaryString binaryStr = _defaultBinaryString;
+
+ Symbol symbolVal = SYMBOL_MAP.get(binaryStr);
+ if(symbolVal == null)
+ {
+ ByteBuffer dup = in.duplicate();
+ try
+ {
+ dup.limit(in.position()+size);
+ }
+ catch (IllegalArgumentException e)
+ {
+ System.err.println("in.position(): " + in.position());
+ System.err.println("size: " + size);
+ System.err.println("dup.position(): " + dup.position());
+ System.err.println("dup.capacity(): " + dup.capacity());
+ System.err.println("dup.limit(): " + dup.limit());
+ throw e;
+
+ }
+ CharBuffer charBuf = ASCII.decode(dup);
+
+
+ symbolVal = Symbol.getSymbol(charBuf.toString());
+
+
+
+
+ byte[] data = new byte[size];
+ in.get(data);
+ binaryStr = new BinaryString(data, 0, size);
+ SYMBOL_MAP.putIfAbsent(binaryStr, symbolVal);
+ }
+ else
+ {
+ in.position(in.position()+size);
+ }
+
+ return symbolVal;
+
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolWriter.java
new file mode 100644
index 0000000000..ae43c7ebd2
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolWriter.java
@@ -0,0 +1,102 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.Symbol;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+
+public class SymbolWriter extends VariableWidthWriter<Symbol>
+{
+ private static final Charset ENCODING_CHARSET = Charset.forName("US-ASCII");
+ public static final byte LARGE_ENCODING_CODE = (byte) 0xb3;
+ public static final byte SMALL_ENCODING_CODE = (byte) 0xa3;
+ private Symbol _value;
+
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return LARGE_ENCODING_CODE;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return SMALL_ENCODING_CODE;
+ }
+
+ @Override
+ public void setValue(Symbol value)
+ {
+ _value = value;
+ super.setValue(value);
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ @Override
+ protected void clearValue()
+ {
+ _value = null;
+ }
+
+ @Override
+ protected boolean hasValue()
+ {
+ return _value != null;
+ }
+
+ @Override
+ protected int getLength()
+ {
+ return _value.length();
+ }
+
+ @Override
+ protected void writeBytes(ByteBuffer buf, int offset, int length)
+ {
+ int end = offset + length;
+ for(int i = offset; i < end; i++)
+ {
+ buf.put((byte)_value.charAt(i));
+ }
+ }
+
+ private static Factory<Symbol> FACTORY = new Factory<Symbol>()
+ {
+
+ public ValueWriter<Symbol> newInstance(Registry registry)
+ {
+ return new SymbolWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Symbol.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampTypeConstructor.java
new file mode 100644
index 0000000000..d826e0ee56
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampTypeConstructor.java
@@ -0,0 +1,60 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+import java.util.Date;
+
+public class TimestampTypeConstructor implements TypeConstructor
+{
+ private static final TimestampTypeConstructor INSTANCE = new TimestampTypeConstructor();
+
+
+ public static TimestampTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private TimestampTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=8)
+ {
+ long l = in.getLong();
+ return new Date(l);
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct timestamp: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampWriter.java
new file mode 100644
index 0000000000..153c51b7c7
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampWriter.java
@@ -0,0 +1,57 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.util.Date;
+
+public class TimestampWriter extends FixedEightWriter<Date>
+{
+ private static final byte FORMAT_CODE = (byte) 0x83;
+
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ @Override
+ long convertValueToLong(Date value)
+ {
+ return value.getTime();
+ }
+
+ private static Factory<Date> FACTORY = new Factory<Date>()
+ {
+
+ public ValueWriter<Date> newInstance(Registry registry)
+ {
+ return new TimestampWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Date.class, FACTORY);
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TypeConstructor.java
new file mode 100644
index 0000000000..8b433e4b20
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TypeConstructor.java
@@ -0,0 +1,32 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+public interface TypeConstructor<T>
+{
+
+ public T construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException;
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UByteTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UByteTypeConstructor.java
new file mode 100644
index 0000000000..7ff5abc558
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UByteTypeConstructor.java
@@ -0,0 +1,59 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class UByteTypeConstructor implements TypeConstructor
+{
+ private static final UByteTypeConstructor INSTANCE = new UByteTypeConstructor();
+
+
+ public static UByteTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private UByteTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ byte b = in.get();
+ return UnsignedByte.valueOf(b);
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct ubyte: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UIntTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UIntTypeConstructor.java
new file mode 100644
index 0000000000..fc0c433d7c
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UIntTypeConstructor.java
@@ -0,0 +1,59 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class UIntTypeConstructor implements TypeConstructor
+{
+ private static final UIntTypeConstructor INSTANCE = new UIntTypeConstructor();
+
+
+ public static UIntTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private UIntTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=4)
+ {
+ final int i = in.getInt();
+ return UnsignedInteger.valueOf(i);
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct uint: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ULongTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ULongTypeConstructor.java
new file mode 100644
index 0000000000..550a61b4fa
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ULongTypeConstructor.java
@@ -0,0 +1,61 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class ULongTypeConstructor implements TypeConstructor
+{
+ private static final ULongTypeConstructor INSTANCE = new ULongTypeConstructor();
+
+
+ public static ULongTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private ULongTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=8)
+ {
+ long l = in.getLong();
+
+ return UnsignedLong.valueOf(l);
+
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct ulong: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UShortTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UShortTypeConstructor.java
new file mode 100644
index 0000000000..6cf7cb5dca
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UShortTypeConstructor.java
@@ -0,0 +1,60 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class UShortTypeConstructor implements TypeConstructor
+{
+ private static final UShortTypeConstructor INSTANCE = new UShortTypeConstructor();
+
+
+ public static UShortTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private UShortTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=2)
+ {
+ short s = in.getShort();
+ return UnsignedShort.valueOf(s);
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct ushort: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDTypeConstructor.java
new file mode 100644
index 0000000000..c34a8fca65
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDTypeConstructor.java
@@ -0,0 +1,62 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+public class UUIDTypeConstructor implements TypeConstructor
+{
+ private static final UUIDTypeConstructor INSTANCE = new UUIDTypeConstructor();
+
+
+ public static UUIDTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private UUIDTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=16)
+ {
+ long msb = in.getLong();
+ long lsb = in.getLong();
+ return new UUID(msb, lsb);
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct UUID: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDWriter.java
new file mode 100644
index 0000000000..b900fd63ce
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDWriter.java
@@ -0,0 +1,63 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.util.UUID;
+
+public class UUIDWriter extends FixedSixteenWriter<UUID>
+{
+ private static final byte FORMAT_CODE = (byte) 0x98;
+
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ @Override
+ long convertValueToMSB(UUID value)
+ {
+ return value.getMostSignificantBits();
+ }
+
+ @Override
+ long convertValueToLSB(UUID value)
+ {
+ return value.getLeastSignificantBits();
+ }
+
+ private static Factory<UUID> FACTORY = new Factory<UUID>()
+ {
+
+ public ValueWriter<UUID> newInstance(Registry registry)
+ {
+ return new UUIDWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(UUID.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedByteWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedByteWriter.java
new file mode 100644
index 0000000000..aedf3811d9
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedByteWriter.java
@@ -0,0 +1,92 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedByte;
+
+import java.nio.ByteBuffer;
+
+public class UnsignedByteWriter implements ValueWriter<UnsignedByte>
+{
+ private int _written;
+ private byte _value;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ switch(_written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)0x50);
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(_value);
+ _written = 2;
+ }
+ else
+ {
+ _written = 1;
+ }
+
+ }
+
+ return 2;
+ }
+
+ public void setValue(UnsignedByte value)
+ {
+ _written = 0;
+ _value = value.byteValue();
+ }
+
+ public boolean isComplete()
+ {
+ return _written == 2;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ private static Factory<UnsignedByte> FACTORY = new Factory<UnsignedByte>()
+ {
+
+ public ValueWriter<UnsignedByte> newInstance(Registry registry)
+ {
+ return new UnsignedByteWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(UnsignedByte.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedIntegerWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedIntegerWriter.java
new file mode 100644
index 0000000000..9517bd9c6e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedIntegerWriter.java
@@ -0,0 +1,148 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+
+import java.nio.ByteBuffer;
+
+public class UnsignedIntegerWriter implements ValueWriter<UnsignedInteger>
+{
+ private static final byte EIGHT_BYTE_FORMAT_CODE = (byte)0x70;
+ private static final byte ONE_BYTE_FORMAT_CODE = (byte) 0x52;
+ private static final byte ZERO_BYTE_FORMAT_CODE = (byte) 0x43;
+
+ private ValueWriter<UnsignedInteger> _delegate;
+
+ private final FixedFourWriter<UnsignedInteger> _eightByteWriter = new FixedFourWriter<UnsignedInteger>()
+ {
+
+ @Override
+ byte getFormatCode()
+ {
+ return EIGHT_BYTE_FORMAT_CODE;
+ }
+
+ @Override
+ int convertValueToInt(UnsignedInteger value)
+ {
+ return value.intValue();
+ }
+ };
+
+ private final ValueWriter<UnsignedInteger> _oneByteWriter = new FixedOneWriter<UnsignedInteger>()
+ {
+
+ @Override protected byte getFormatCode()
+ {
+ return ONE_BYTE_FORMAT_CODE;
+ }
+
+ @Override protected byte convertToByte(final UnsignedInteger value)
+ {
+ return value.byteValue();
+ }
+ };
+
+ private final ValueWriter<UnsignedInteger> _zeroByteWriter = new ValueWriter<UnsignedInteger>()
+ {
+ private boolean _complete;
+
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ if(!_complete && buffer.hasRemaining())
+ {
+ buffer.put(ZERO_BYTE_FORMAT_CODE);
+ _complete = true;
+ }
+
+ return 1;
+ }
+
+ public void setValue(UnsignedInteger uint)
+ {
+ _complete = false;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public boolean isComplete()
+ {
+ return _complete;
+ }
+
+ };
+
+
+
+ public int writeToBuffer(final ByteBuffer buffer)
+ {
+ return _delegate.writeToBuffer(buffer);
+ }
+
+ public void setValue(final UnsignedInteger uint)
+ {
+ if(uint.equals(UnsignedInteger.ZERO))
+ {
+ _delegate = _zeroByteWriter;
+ }
+ else if(uint.compareTo(UnsignedInteger.valueOf(256))<0)
+ {
+ _delegate = _oneByteWriter;
+ }
+ else
+ {
+ _delegate = _eightByteWriter;
+ }
+ _delegate.setValue(uint);
+ }
+
+ public boolean isComplete()
+ {
+ return _delegate.isComplete();
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+
+ private static Factory<UnsignedInteger> FACTORY = new Factory<UnsignedInteger>()
+ {
+
+ public ValueWriter<UnsignedInteger> newInstance(Registry registry)
+ {
+ return new UnsignedIntegerWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(UnsignedInteger.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedLongWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedLongWriter.java
new file mode 100644
index 0000000000..4345187d61
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedLongWriter.java
@@ -0,0 +1,152 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+
+import java.nio.ByteBuffer;
+
+public class UnsignedLongWriter implements ValueWriter<UnsignedLong>
+{
+
+
+ private static final byte EIGHT_BYTE_FORMAT_CODE = (byte) 0x80;
+ private static final byte ONE_BYTE_FORMAT_CODE = (byte) 0x53;
+ private static final byte ZERO_BYTE_FORMAT_CODE = (byte) 0x44;
+
+ private ValueWriter<UnsignedLong> _delegate;
+
+ private final FixedEightWriter<UnsignedLong> _eightByteWriter = new FixedEightWriter<UnsignedLong>()
+ {
+
+ @Override
+ byte getFormatCode()
+ {
+ return EIGHT_BYTE_FORMAT_CODE;
+ }
+
+ @Override
+ long convertValueToLong(UnsignedLong value)
+ {
+ return value.longValue();
+ }
+
+ };
+
+ private final ValueWriter<UnsignedLong> _oneByteWriter = new FixedOneWriter<UnsignedLong>()
+ {
+
+ @Override protected byte getFormatCode()
+ {
+ return ONE_BYTE_FORMAT_CODE;
+ }
+
+ @Override protected byte convertToByte(final UnsignedLong value)
+ {
+ return value.byteValue();
+ }
+ };
+
+ private final ValueWriter<UnsignedLong> _zeroByteWriter = new ValueWriter<UnsignedLong>()
+ {
+ private boolean _complete;
+
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ if(!_complete && buffer.hasRemaining())
+ {
+ buffer.put(ZERO_BYTE_FORMAT_CODE);
+ _complete = true;
+ }
+
+ return 1;
+ }
+
+ public void setValue(UnsignedLong ulong)
+ {
+ _complete = false;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public boolean isComplete()
+ {
+ return _complete;
+ }
+
+ };
+
+
+
+ private static Factory<UnsignedLong> FACTORY = new Factory<UnsignedLong>()
+ {
+
+ public ValueWriter<UnsignedLong> newInstance(Registry registry)
+ {
+ return new UnsignedLongWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(UnsignedLong.class, FACTORY);
+ }
+
+ public int writeToBuffer(final ByteBuffer buffer)
+ {
+ return _delegate.writeToBuffer(buffer);
+ }
+
+ public void setValue(final UnsignedLong ulong)
+ {
+ if(ulong.equals(UnsignedLong.ZERO))
+ {
+ _delegate = _zeroByteWriter;
+ }
+ else if(ulong.compareTo(UnsignedLong.valueOf(256))<0)
+ {
+ _delegate = _oneByteWriter;
+ }
+ else
+ {
+ _delegate = _eightByteWriter;
+ }
+
+ _delegate.setValue(ulong);
+ }
+
+ public boolean isComplete()
+ {
+ return _delegate.isComplete();
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedShortWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedShortWriter.java
new file mode 100644
index 0000000000..63d8bf0d7b
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedShortWriter.java
@@ -0,0 +1,56 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
+
+public class UnsignedShortWriter extends FixedTwoWriter<UnsignedShort>
+{
+ private static final byte FORMAT_CODE = (byte)0x60;
+
+
+ @Override
+ short convertValueToShort(UnsignedShort value)
+ {
+ return value.shortValue();
+ }
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ private static Factory<UnsignedShort> FACTORY = new Factory<UnsignedShort>()
+ {
+
+ public ValueWriter<UnsignedShort> newInstance(Registry registry)
+ {
+ return new UnsignedShortWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(UnsignedShort.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueHandler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueHandler.java
new file mode 100644
index 0000000000..57351a91d7
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueHandler.java
@@ -0,0 +1,159 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.AmqpError;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+
+public class ValueHandler implements DescribedTypeConstructorRegistry.Source
+{
+ private static final byte DESCRIBED_TYPE = (byte)0;
+
+ private final DescribedTypeConstructorRegistry _describedTypeConstructorRegistry;
+
+
+ private static final TypeConstructor[][] TYPE_CONSTRUCTORS =
+ {
+ {},
+ {},
+ {},
+ {},
+ { NullTypeConstructor.getInstance(), BooleanConstructor.getTrueInstance(),
+ BooleanConstructor.getFalseInstance(), ZeroUIntConstructor.getInstance(),
+ ZeroULongConstructor.getInstance(), ZeroListConstructor.getInstance() },
+ { UByteTypeConstructor.getInstance(), ByteTypeConstructor.getInstance(),
+ SmallUIntConstructor.getInstance(), SmallULongConstructor.getInstance(),
+ SmallIntConstructor.getInstance(), SmallLongConstructor.getInstance(),
+ BooleanConstructor.getByteInstance()},
+ { UShortTypeConstructor.getInstance(), ShortTypeConstructor.getInstance() },
+ { UIntTypeConstructor.getInstance(), IntTypeConstructor.getInstance(),
+ FloatTypeConstructor.getInstance(), CharTypeConstructor.getInstance(),
+ DecimalConstructor.getDecimal32Instance()},
+ { ULongTypeConstructor.getInstance(), LongTypeConstructor.getInstance(),
+ DoubleTypeConstructor.getInstance(), TimestampTypeConstructor.getInstance(),
+ DecimalConstructor.getDecimal64Instance()},
+ { null, null,
+ null, null,
+ DecimalConstructor.getDecimal128Instance(), null,
+ null, null,
+ UUIDTypeConstructor.getInstance() },
+ { BinaryTypeConstructor.getInstance(1),
+ StringTypeConstructor.getInstance(1, Charset.forName("UTF8")),
+ StringTypeConstructor.getInstance(1, Charset.forName("UTF16")),
+ SymbolTypeConstructor.getInstance(1) },
+ { BinaryTypeConstructor.getInstance(4),
+ StringTypeConstructor.getInstance(4, Charset.forName("UTF8")),
+ StringTypeConstructor.getInstance(4, Charset.forName("UTF16")),
+ SymbolTypeConstructor.getInstance(4) },
+ { CompoundTypeConstructor.getInstance(1, CompoundTypeConstructor.LIST_ASSEMBLER_FACTORY),
+ CompoundTypeConstructor.getInstance(1, CompoundTypeConstructor.MAP_ASSEMBLER_FACTORY) },
+ { CompoundTypeConstructor.getInstance(4, CompoundTypeConstructor.LIST_ASSEMBLER_FACTORY),
+ CompoundTypeConstructor.getInstance(4, CompoundTypeConstructor.MAP_ASSEMBLER_FACTORY) },
+ {
+ ArrayTypeConstructor.getOneByteSizeTypeConstructor()
+ },
+ {
+ ArrayTypeConstructor.getFourByteSizeTypeConstructor()
+ }
+ };
+
+
+ public ValueHandler(DescribedTypeConstructorRegistry registry)
+ {
+ _describedTypeConstructorRegistry = registry;
+ }
+
+ public Object parse(final ByteBuffer in) throws AmqpErrorException
+ {
+ TypeConstructor constructor = readConstructor(in);
+ return constructor.construct(in, this);
+ }
+
+
+ public TypeConstructor readConstructor(ByteBuffer in) throws AmqpErrorException
+ {
+ if(!in.hasRemaining())
+ {
+ throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Insufficient data - expected type, no data remaining");
+ }
+ byte formatCode = in.get();
+
+ if(formatCode == DESCRIBED_TYPE)
+ {
+ Object descriptor = parse(in);
+ DescribedTypeConstructor describedTypeConstructor = _describedTypeConstructorRegistry.getConstructor(descriptor);
+ if(describedTypeConstructor==null)
+ {
+ describedTypeConstructor=new DefaultDescribedTypeConstructor(descriptor);
+ }
+ TypeConstructor typeConstructor = readConstructor(in);
+
+ return describedTypeConstructor.construct(typeConstructor);
+
+ }
+ else
+ {
+ int subCategory = (formatCode >> 4) & 0x0F;
+ int subtype = formatCode & 0x0F;
+
+ TypeConstructor tc;
+ try
+ {
+ tc = TYPE_CONSTRUCTORS[subCategory][subtype];
+ }
+ catch(IndexOutOfBoundsException e)
+ {
+ tc = null;
+ }
+
+ if(tc == null)
+ {
+ throw new AmqpErrorException(ConnectionError.FRAMING_ERROR,"Unknown type format-code 0x%02x", formatCode);
+ }
+
+ return tc;
+ }
+ }
+
+
+
+
+
+ @Override
+ public String toString()
+ {
+ return "ValueHandler{" +
+ ", _describedTypeConstructorRegistry=" + _describedTypeConstructorRegistry +
+ '}';
+ }
+
+
+ public DescribedTypeConstructorRegistry getDescribedTypeRegistry()
+ {
+ return _describedTypeConstructorRegistry;
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueProducingProtocolHandler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueProducingProtocolHandler.java
new file mode 100644
index 0000000000..48db222aa0
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueProducingProtocolHandler.java
@@ -0,0 +1,31 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+public interface ValueProducingProtocolHandler extends ProtocolHandler
+{
+ Object getValue();
+ public boolean hasError();
+ public Error getError();
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueWriter.java
new file mode 100644
index 0000000000..7918397994
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueWriter.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+import java.util.Map;
+
+public interface ValueWriter<T extends Object>
+{
+
+
+
+ public static interface Factory<V extends Object>
+ {
+ ValueWriter<V> newInstance(Registry registry);
+ }
+
+ public static interface Registry
+ {
+ public static interface Source
+ {
+ public Registry getDescribedTypeRegistry();
+ }
+
+ <V extends Object> ValueWriter<V> getValueWriter(V value);
+ <V extends Object> ValueWriter<V> getValueWriter(V value, Map<Class, ValueWriter> localCache);
+ <V extends Object> ValueWriter<V> register(Class<V> clazz, ValueWriter.Factory<V> writer);
+
+ }
+
+
+ int writeToBuffer(ByteBuffer buffer);
+
+ void setValue(T frameBody);
+
+ boolean isComplete();
+
+ boolean isCacheable();
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthTypeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthTypeConstructor.java
new file mode 100644
index 0000000000..35ce253623
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthTypeConstructor.java
@@ -0,0 +1,48 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+import java.nio.ByteBuffer;
+
+public abstract class VariableWidthTypeConstructor implements TypeConstructor
+{
+ protected int _size;
+
+ public VariableWidthTypeConstructor(int size)
+ {
+ _size = size;
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ return construct(in, false, handler);
+ }
+
+ public int getSize()
+ {
+ return _size;
+ }
+
+ public abstract Object construct(ByteBuffer in, boolean isCopy, ValueHandler handler) throws AmqpErrorException;
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthWriter.java
new file mode 100644
index 0000000000..93b2b5e6d8
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthWriter.java
@@ -0,0 +1,169 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class VariableWidthWriter<V> implements ValueWriter<V>
+{
+ private int _written;
+ private int _size;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ int written = _written;
+ final int length = getLength();
+ boolean singleOctetSize = _size == 1;
+ if(singleOctetSize)
+ {
+ switch(written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getSingleOctetEncodingCode());
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)length);
+ written = 2;
+ }
+ else
+ {
+ written = 1;
+ break;
+ }
+ default:
+
+ final int toWrite = 2 + length - written;
+ if(buffer.remaining() >= toWrite)
+ {
+ writeBytes(buffer, written-2,toWrite);
+ written = length + 2;
+ clearValue();
+ }
+ else
+ {
+ final int remaining = buffer.remaining();
+
+ writeBytes(buffer, written-2, remaining);
+ written += remaining;
+ }
+
+ }
+ }
+ else
+ {
+
+ int remaining = buffer.remaining();
+
+ switch(written)
+ {
+
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getFourOctetEncodingCode());
+ remaining--;
+ written = 1;
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(remaining >= 4)
+ {
+ buffer.putInt(length);
+ remaining-=4;
+ written+=4;
+ }
+ case 2:
+ case 3:
+ if(remaining >= 2 && written <= 3)
+ {
+ buffer.putShort((short)((length >> ((3-written)<<3)) & 0xFFFF ));
+ remaining -= 2;
+ written += 2;
+ }
+ case 4:
+ if(remaining >=1 && written <=4)
+ {
+ buffer.put((byte)((length>> ((4-written)<<3)) & 0xFF ));
+ written++;
+ }
+
+ default:
+
+ final int toWrite = 5 + length - written;
+ if(buffer.remaining() >= toWrite)
+ {
+ writeBytes(buffer, written-5,toWrite);
+ written = length + 5;
+ clearValue();
+ }
+ else if(buffer.hasRemaining())
+ {
+ written += buffer.remaining();
+ writeBytes(buffer, written-5, buffer.remaining());
+ }
+
+ }
+
+ }
+
+ _written = written;
+ return 1 + _size + length;
+ }
+
+ protected abstract void clearValue();
+
+ protected abstract boolean hasValue();
+
+ protected abstract byte getFourOctetEncodingCode();
+
+ protected abstract byte getSingleOctetEncodingCode();
+
+ public void setValue(V value)
+ {
+ _written = 0;
+ _size = (getLength() & 0xFFFFFF00) == 0 ? 1 : 4;
+ }
+
+ protected abstract int getLength();
+
+ protected abstract void writeBytes(ByteBuffer buf, int offset, int length);
+
+
+ public boolean isComplete()
+ {
+ return !hasValue() || _written == getLength() + _size + 1;
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/WrapperTypeValueWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/WrapperTypeValueWriter.java
new file mode 100644
index 0000000000..85a3196f6c
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/WrapperTypeValueWriter.java
@@ -0,0 +1,55 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.WrapperType;
+
+public class WrapperTypeValueWriter extends DelegatingValueWriter<WrapperType>
+{
+ public WrapperTypeValueWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected Object getUnderlyingValue(final WrapperType wrapperType)
+ {
+ return wrapperType.getValue();
+ }
+
+ private static Factory FACTORY = new Factory()
+ {
+
+ public ValueWriter newInstance(Registry registry)
+ {
+ return new WrapperTypeValueWriter(registry);
+ }
+ };
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public static void register(Registry registry, Class<? extends WrapperType> clazz)
+ {
+ registry.register(clazz, FACTORY);
+ }}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroListConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroListConstructor.java
new file mode 100644
index 0000000000..b9d6a50425
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroListConstructor.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+import java.nio.ByteBuffer;
+import java.util.Collections;
+import java.util.List;
+
+class ZeroListConstructor implements TypeConstructor<List>
+{
+ private static final ZeroListConstructor INSTANCE = new ZeroListConstructor();
+
+ ZeroListConstructor()
+ {
+ }
+
+ public List construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return Collections.EMPTY_LIST;
+ }
+
+ public static ZeroListConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroUIntConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroUIntConstructor.java
new file mode 100644
index 0000000000..b3c57ceaf7
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroUIntConstructor.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+
+import java.nio.ByteBuffer;
+
+class ZeroUIntConstructor implements TypeConstructor<UnsignedInteger>
+{
+ private static final ZeroUIntConstructor INSTANCE = new ZeroUIntConstructor();
+
+ ZeroUIntConstructor()
+ {
+ }
+
+ public UnsignedInteger construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return UnsignedInteger.ZERO;
+ }
+
+ public static ZeroUIntConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroULongConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroULongConstructor.java
new file mode 100644
index 0000000000..b2ab2a4158
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroULongConstructor.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+
+import java.nio.ByteBuffer;
+
+class ZeroULongConstructor implements TypeConstructor<UnsignedLong>
+{
+ private static final ZeroULongConstructor INSTANCE = new ZeroULongConstructor();
+
+ ZeroULongConstructor()
+ {
+ }
+
+ public UnsignedLong construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return UnsignedLong.ZERO;
+ }
+
+ public static ZeroULongConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQFrame.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQFrame.java
new file mode 100644
index 0000000000..769fe13d29
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQFrame.java
@@ -0,0 +1,68 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+
+import java.nio.ByteBuffer;
+
+public abstract class AMQFrame<T>
+{
+ private T _frameBody;
+ private ByteBuffer _payload;
+
+ AMQFrame(T frameBody)
+ {
+ _frameBody = frameBody;
+ }
+
+ protected AMQFrame(T frameBody, ByteBuffer payload)
+ {
+ _frameBody = frameBody;
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+ public static TransportFrame createAMQFrame(short channel, FrameBody frameBody)
+ {
+ return createAMQFrame(channel, frameBody, null);
+ }
+
+ public static TransportFrame createAMQFrame(short channel, FrameBody frameBody, ByteBuffer payload)
+ {
+ return new TransportFrame(channel, frameBody, payload);
+ }
+
+ abstract public short getChannel();
+
+ abstract public byte getFrameType();
+
+ public T getFrameBody()
+ {
+ return _frameBody;
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQPProtocolHeaderHandler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQPProtocolHeaderHandler.java
new file mode 100644
index 0000000000..007df77f55
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQPProtocolHeaderHandler.java
@@ -0,0 +1,85 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+import java.nio.ByteBuffer;
+
+public class AMQPProtocolHeaderHandler implements ProtocolHandler
+{
+ private ConnectionEndpoint _connection;
+ private static final byte MAJOR_VERSION = (byte) 1;
+ private static final byte MINOR_VERSION = (byte) 0;
+
+ enum State {
+ AWAITING_MAJOR,
+ AWAITING_MINOR,
+ AWAITING_REVISION,
+ ERROR
+ }
+
+ private State _state = State.AWAITING_MAJOR;
+
+ public AMQPProtocolHeaderHandler(final ConnectionEndpoint connection)
+ {
+ _connection = connection;
+ }
+
+ public ProtocolHandler parse(final ByteBuffer in)
+ {
+ while(in.hasRemaining() && _state != State.ERROR)
+ {
+ switch(_state)
+ {
+ case AWAITING_MAJOR:
+ _state = in.get() == MAJOR_VERSION ? State.AWAITING_MINOR : State.ERROR;
+ if(!in.hasRemaining())
+ {
+ break;
+ }
+ case AWAITING_MINOR:
+ _state = in.get() == MINOR_VERSION ? State.AWAITING_MINOR : State.ERROR;
+ if(!in.hasRemaining())
+ {
+ break;
+ }
+ case AWAITING_REVISION:
+ byte revision = in.get();
+ _connection.protocolHeaderReceived(MAJOR_VERSION, MINOR_VERSION, revision);
+ ProtocolHandler handler = new FrameHandler(_connection);
+ return handler.parse(in);
+ }
+ }
+ if(_state == State.ERROR)
+ {
+ _connection.invalidHeaderReceived();
+ }
+ return this;
+
+ }
+
+ public boolean isDone()
+ {
+ return _state != State.ERROR && !_connection.closedForInput();
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/ConnectionHandler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/ConnectionHandler.java
new file mode 100644
index 0000000000..78bed8a71e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/ConnectionHandler.java
@@ -0,0 +1,559 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.codec.FrameWriter;
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+import org.apache.qpid.amqp_1_0.codec.ProtocolHeaderHandler;
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.transport.BytesProcessor;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+import org.apache.qpid.amqp_1_0.transport.FrameOutputHandler;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.transport.Open;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class ConnectionHandler
+{
+ private final ConnectionEndpoint _connection;
+ private ProtocolHandler _delegate;
+
+ private static final Logger FRAME_LOGGER = Logger.getLogger("FRM");
+ private static final Logger RAW_LOGGER = Logger.getLogger("RAW");
+
+ public ConnectionHandler(final ConnectionEndpoint connection)
+ {
+ _connection = connection;
+ _delegate = new ProtocolHeaderHandler(connection);
+ }
+
+
+ public boolean parse(ByteBuffer in)
+ {
+
+ while(in.hasRemaining() && !isDone())
+ {
+ _delegate = _delegate.parse(in);
+
+ }
+ return isDone();
+ }
+
+ public boolean isDone()
+ {
+ return _delegate.isDone();
+ }
+
+
+ // ----------------------------------------------------------------
+
+ public static class FrameOutput<T> implements FrameOutputHandler<T>, FrameSource
+ {
+
+ private static final ByteBuffer EMPTY_BYTEBUFFER = ByteBuffer.wrap(new byte[0]);
+ private final BlockingQueue<AMQFrame<T>> _queue = new ArrayBlockingQueue<AMQFrame<T>>(100);
+ private ConnectionEndpoint _conn;
+
+ private final AMQFrame<T> _endOfFrameMarker = new AMQFrame<T>(null)
+ {
+ @Override public short getChannel()
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override public byte getFrameType()
+ {
+ throw new UnsupportedOperationException();
+ }
+ };
+
+ private boolean _setForClose;
+ private boolean _closed;
+
+ public FrameOutput(final ConnectionEndpoint conn)
+ {
+ _conn = conn;
+ }
+
+ public boolean canSend()
+ {
+ return _queue.remainingCapacity() != 0;
+ }
+
+ public void send(AMQFrame<T> frame)
+ {
+ send(frame, null);
+ }
+
+ public void send(final AMQFrame<T> frame, final ByteBuffer payload)
+ {
+ synchronized(_conn.getLock())
+ {
+ try
+ {
+// TODO HACK - check frame length
+ int size = _conn.getDescribedTypeRegistry()
+ .getValueWriter(frame.getFrameBody()).writeToBuffer(EMPTY_BYTEBUFFER) + 8;
+
+ if(size > _conn.getMaxFrameSize())
+ {
+ throw new OversizeFrameException(frame, size);
+ }
+
+ while(!_queue.offer(frame))
+ {
+ _conn.getLock().wait(1000L);
+
+ }
+ _conn.getLock().notifyAll();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+
+
+ public void close()
+ {
+ synchronized (_conn.getLock())
+ {
+ if(!_queue.offer(_endOfFrameMarker))
+ {
+ _setForClose = true;
+ }
+ _conn.getLock().notifyAll();
+ }
+ }
+
+ public AMQFrame<T> getNextFrame(final boolean wait)
+ {
+ synchronized(_conn.getLock())
+ {
+ try
+ {
+ AMQFrame frame = null;
+ while(!closed() && (frame = _queue.poll()) == null && wait)
+ {
+ _conn.getLock().wait();
+ }
+
+ if(frame == _endOfFrameMarker)
+ {
+ _closed = true;
+ frame = null;
+ }
+ else if(_setForClose && frame != null)
+ {
+ _setForClose = !_queue.offer(_endOfFrameMarker);
+ }
+
+
+ if(frame != null && FRAME_LOGGER.isLoggable(Level.FINE))
+ {
+ FRAME_LOGGER.fine("SEND[" + _conn.getRemoteAddress() + "|" + frame.getChannel() + "] : " + frame.getFrameBody());
+ }
+
+ _conn.getLock().notifyAll();
+
+ return frame;
+ }
+ catch (InterruptedException e)
+ {
+ _conn.setClosedForOutput(true);
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ return null;
+ }
+ }
+ }
+
+ public boolean closed()
+ {
+ return _closed;
+ }
+ }
+
+ public static interface FrameSource<T>
+ {
+ AMQFrame<T> getNextFrame(boolean wait);
+ boolean closed();
+ }
+
+
+ public static interface BytesSource
+ {
+ void getBytes(BytesProcessor processor, boolean wait);
+ boolean closed();
+ }
+
+ public static class FrameToBytesSourceAdapter implements BytesSource
+ {
+
+ private final FrameSource _frameSource;
+ private final FrameWriter _writer;
+ private static final int BUF_SIZE = 1<<16;
+ private final byte[] _bytes = new byte[BUF_SIZE];
+ private final ByteBuffer _buffer = ByteBuffer.wrap(_bytes);
+
+ public FrameToBytesSourceAdapter(final FrameSource frameSource, ValueWriter.Registry registry)
+ {
+ _frameSource = frameSource;
+ _writer = new FrameWriter(registry);
+ }
+
+ public void getBytes(final BytesProcessor processor, final boolean wait)
+ {
+
+ AMQFrame frame;
+
+ if(_buffer.position() == 0 && !_frameSource.closed())
+ {
+ if(!_writer.isComplete())
+ {
+ _writer.writeToBuffer(_buffer);
+ }
+
+ while(_buffer.hasRemaining())
+ {
+
+ if((frame = _frameSource.getNextFrame(wait && _buffer.position()==0)) != null)
+ {
+ _writer.setValue(frame);
+
+ try
+ {
+ _writer.writeToBuffer(_buffer);
+ }
+ catch(RuntimeException e)
+ {
+ e.printStackTrace();
+ throw e;
+ }
+ catch(Error e)
+ {
+ e.printStackTrace();
+ throw e;
+ }
+
+
+ }
+ else
+ {
+ break;
+ }
+ }
+ _buffer.flip();
+ }
+ if(_buffer.limit() != 0)
+ {
+ processor.processBytes(_buffer);
+ if(_buffer.remaining() == 0)
+ {
+ _buffer.clear();
+ }
+ }
+ }
+
+ public boolean closed()
+ {
+ return _buffer.position() == 0 && _frameSource.closed();
+ }
+ }
+
+
+ public static class HeaderBytesSource implements BytesSource
+ {
+
+ private final ByteBuffer _buffer;
+ private ConnectionEndpoint _conn;
+
+ public HeaderBytesSource(ConnectionEndpoint conn, byte... headerBytes)
+ {
+ _conn = conn;
+ _buffer = ByteBuffer.wrap(headerBytes);
+ }
+
+ public void getBytes(final BytesProcessor processor, final boolean wait)
+ {
+ if(!_conn.closedForOutput())
+ {
+ processor.processBytes(_buffer);
+ }
+ }
+
+ public boolean closed()
+ {
+ return !_conn.closedForOutput() && !_buffer.hasRemaining();
+ }
+ }
+
+ public static class SequentialBytesSource implements BytesSource
+ {
+ private Queue<BytesSource> _sources = new LinkedList<BytesSource>();
+
+ public SequentialBytesSource(BytesSource... sources)
+ {
+ _sources.addAll(Arrays.asList(sources));
+ }
+
+ public synchronized void addSource(BytesSource source)
+ {
+ _sources.add(source);
+ }
+
+ public synchronized void getBytes(final BytesProcessor processor, final boolean wait)
+ {
+ BytesSource src = _sources.peek();
+ while (src != null && src.closed())
+ {
+ _sources.poll();
+ src = _sources.peek();
+ }
+
+ if(src != null)
+ {
+ src.getBytes(processor, wait);
+ }
+ }
+
+ public boolean closed()
+ {
+ return _sources.isEmpty();
+ }
+ }
+
+
+ public static class BytesOutputHandler implements Runnable, BytesProcessor
+ {
+
+ private final OutputStream _outputStream;
+ private BytesSource _bytesSource;
+ private boolean _closed;
+ private ConnectionEndpoint _conn;
+
+ public BytesOutputHandler(OutputStream outputStream, BytesSource source, ConnectionEndpoint conn)
+ {
+ _outputStream = outputStream;
+ _bytesSource = source;
+ _conn = conn;
+ }
+
+ public void run()
+ {
+
+ final BytesSource bytesSource = _bytesSource;
+
+ while(!(_closed || bytesSource.closed()))
+ {
+ _bytesSource.getBytes(this, true);
+ }
+
+ }
+
+ public void processBytes(final ByteBuffer buf)
+ {
+ try
+ {
+ if(RAW_LOGGER.isLoggable(Level.FINE))
+ {
+ Binary bin = new Binary(buf.array(),buf.arrayOffset()+buf.position(), buf.limit()-buf.position());
+ RAW_LOGGER.fine("SEND["+ _conn.getRemoteAddress() +"] : " + bin.toString());
+ }
+ _outputStream.write(buf.array(),buf.arrayOffset()+buf.position(), buf.limit()-buf.position());
+ buf.position(buf.limit());
+ }
+ catch (IOException e)
+ {
+ _closed = true;
+ e.printStackTrace(); //TODO
+ }
+ }
+ }
+
+
+ public static class OutputHandler implements Runnable
+ {
+
+
+
+ private final OutputStream _outputStream;
+ private FrameSource _frameSource;
+
+ private static final int BUF_SIZE = 1<<16;
+ private ValueWriter.Registry _registry;
+
+
+ public OutputHandler(OutputStream outputStream, FrameSource source, ValueWriter.Registry registry)
+ {
+ _outputStream = outputStream;
+ _frameSource = source;
+ _registry = registry;
+ }
+
+ public void run()
+ {
+ int i=0;
+
+
+ try
+ {
+
+ byte[] buffer = new byte[BUF_SIZE];
+ ByteBuffer buf = ByteBuffer.wrap(buffer);
+
+ buf.put((byte)'A');
+ buf.put((byte)'M');
+ buf.put((byte)'Q');
+ buf.put((byte)'P');
+ buf.put((byte) 0);
+ buf.put((byte) 1);
+ buf.put((byte) 0);
+ buf.put((byte) 0);
+
+
+
+ final FrameSource frameSource = _frameSource;
+
+ AMQFrame frame;
+ FrameWriter writer = new FrameWriter(_registry);
+
+ while(!frameSource.closed())
+ {
+
+ if(!writer.isComplete())
+ {
+ writer.writeToBuffer(buf);
+ }
+
+ while(buf.hasRemaining())
+ {
+
+ if((frame = frameSource.getNextFrame(buf.position()==0)) != null)
+ {
+ writer.setValue(frame);
+
+ int size = writer.writeToBuffer(buf);
+
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ if(buf.limit() != 0)
+ {
+ _outputStream.write(buffer,0, buf.position());
+ buf.clear();
+ }
+ }
+
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+
+ }
+ }
+
+ public static void main(String[] args) throws AmqpErrorException
+ {
+ byte[] buffer = new byte[76];
+ ByteBuffer buf = ByteBuffer.wrap(buffer);
+ AMQPDescribedTypeRegistry registry = AMQPDescribedTypeRegistry.newInstance()
+ .registerTransportLayer()
+ .registerMessagingLayer()
+ .registerTransactionLayer();
+
+ Open open = new Open();
+ // Open(container_id="venture", channel_max=10, hostname="foo", offered_capabilities=[Symbol("one"), Symbol("two"), Symbol("three")])
+ open.setContainerId("venture");
+ open.setChannelMax(UnsignedShort.valueOf((short) 10));
+ open.setHostname("foo");
+ open.setOfferedCapabilities(new Symbol[] {Symbol.valueOf("one"),Symbol.valueOf("two"),Symbol.valueOf("three")});
+
+ ValueWriter<Open> writer = registry.getValueWriter(open);
+
+ System.out.println("------ Encode (time in ms for 1 million opens)");
+ Long myLong = Long.valueOf(32);
+ ValueWriter<Long> writer2 = registry.getValueWriter(myLong);
+ Double myDouble = Double.valueOf(3.14159265359);
+ ValueWriter<Double> writer3 = registry.getValueWriter(myDouble);
+ for(int n = 0; n < 1/*00*/; n++)
+ {
+ long startTime = System.currentTimeMillis();
+ for(int i = 1/*000000*/; i !=0; i--)
+ {
+ buf.position(0);
+ writer.setValue(open);
+ writer.writeToBuffer(buf);
+ writer2.setValue(myLong);
+ writer.writeToBuffer(buf);
+ writer3.setValue(myDouble);
+ writer3.writeToBuffer(buf);
+
+
+ }
+ long midTime = System.currentTimeMillis();
+ System.out.println((midTime - startTime));
+
+ }
+
+
+ ValueHandler handler = new ValueHandler(registry);
+ System.out.println("------ Decode (time in ms for 1 million opens)");
+ for(int n = 0; n < 100; n++)
+ {
+ long startTime = System.currentTimeMillis();
+ for(int i = 1000000; i !=0; i--)
+ {
+ buf.flip();
+ handler.parse(buf);
+ handler.parse(buf);
+ handler.parse(buf);
+
+ }
+ long midTime = System.currentTimeMillis();
+ System.out.println((midTime - startTime));
+ }
+
+
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameHandler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameHandler.java
new file mode 100644
index 0000000000..76a28d23e9
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameHandler.java
@@ -0,0 +1,329 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.codec.BinaryWriter;
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.ErrorCondition;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+import java.nio.ByteBuffer;
+import java.util.Formatter;
+
+public class FrameHandler implements ProtocolHandler
+{
+ private ConnectionEndpoint _connection;
+ private ValueHandler _typeHandler;
+
+ enum State {
+ SIZE_0,
+ SIZE_1,
+ SIZE_2,
+ SIZE_3,
+ PRE_PARSE,
+ BUFFERING,
+ PARSING,
+ ERROR
+ }
+
+ private State _state = State.SIZE_0;
+ private int _size;
+
+ private ByteBuffer _buffer;
+
+
+
+ public FrameHandler(final ConnectionEndpoint connection)
+ {
+ _connection = connection;
+ _typeHandler = new ValueHandler(connection.getDescribedTypeRegistry());
+
+ }
+
+ public ProtocolHandler parse(ByteBuffer in)
+ {
+ try
+ {
+ Error frameParsingError = null;
+ int size = _size;
+ State state = _state;
+ ByteBuffer oldIn = null;
+
+ while(in.hasRemaining() && state != State.ERROR)
+ {
+
+ final int remaining = in.remaining();
+ if(remaining == 0)
+ {
+ return this;
+ }
+
+
+ switch(state)
+ {
+ case SIZE_0:
+ if(remaining >= 4)
+ {
+ size = in.getInt();
+ state = State.PRE_PARSE;
+ break;
+ }
+ else
+ {
+ size = (in.get() << 24) & 0xFF000000;
+ if(!in.hasRemaining())
+ {
+ state = State.SIZE_1;
+ break;
+ }
+ }
+ case SIZE_1:
+ size |= (in.get() << 16) & 0xFF0000;
+ if(!in.hasRemaining())
+ {
+ state = State.SIZE_2;
+ break;
+ }
+ case SIZE_2:
+ size |= (in.get() << 8) & 0xFF00;
+ if(!in.hasRemaining())
+ {
+ state = State.SIZE_3;
+ break;
+ }
+ case SIZE_3:
+ size |= in.get() & 0xFF;
+ state = State.PRE_PARSE;
+
+ case PRE_PARSE:
+
+ if(size < 8)
+ {
+ frameParsingError = createFramingError("specified frame size %d smaller than minimum frame header size %d", _size, 8);
+ state = State.ERROR;
+ break;
+ }
+
+ else if(size > _connection.getMaxFrameSize())
+ {
+ frameParsingError = createFramingError("specified frame size %d larger than maximum frame header size %d", size, _connection.getMaxFrameSize());
+ state = State.ERROR;
+ break;
+ }
+
+ if(in.remaining() < size-4)
+ {
+ _buffer = ByteBuffer.allocate(size-4);
+ _buffer.put(in);
+ state = State.BUFFERING;
+ break;
+ }
+ case BUFFERING:
+ if(_buffer != null)
+ {
+ if(in.remaining() < _buffer.remaining())
+ {
+ _buffer.put(in);
+ break;
+ }
+ else
+ {
+ ByteBuffer dup = in.duplicate();
+ dup.limit(dup.position()+_buffer.remaining());
+ int i = _buffer.remaining();
+ int d = dup.remaining();
+ in.position(in.position()+_buffer.remaining());
+ _buffer.put(dup);
+ oldIn = in;
+ _buffer.flip();
+ in = _buffer;
+ state = State.PARSING;
+ }
+ }
+
+ case PARSING:
+
+ int dataOffset = (in.get() << 2) & 0x3FF;
+
+ if(dataOffset < 8)
+ {
+ frameParsingError = createFramingError("specified frame data offset %d smaller than minimum frame header size %d", dataOffset, 8);
+ state = State.ERROR;
+ break;
+ }
+ else if(dataOffset > size)
+ {
+ frameParsingError = createFramingError("specified frame data offset %d larger than the frame size %d", dataOffset, _size);
+ state = State.ERROR;
+ break;
+ }
+
+ // type
+
+ int type = in.get() & 0xFF;
+ int channel = in.getShort() & 0xFF;
+
+ if(type != 0 && type != 1)
+ {
+ frameParsingError = createFramingError("unknown frame type: %d", type);
+ state = State.ERROR;
+ break;
+ }
+
+ // channel
+
+ /*if(channel > _connection.getChannelMax())
+ {
+ frameParsingError = createError(AmqpError.DECODE_ERROR,
+ "frame received on invalid channel %d above channel-max %d",
+ channel, _connection.getChannelMax());
+
+ state = State.ERROR;
+ }
+*/
+ // ext header
+ if(dataOffset!=8)
+ {
+ in.position(in.position()+dataOffset-8);
+ }
+
+ // oldIn null iff not working on duplicated buffer
+ if(oldIn == null)
+ {
+ oldIn = in;
+ in = in.duplicate();
+ final int endPos = in.position() + size - dataOffset;
+ in.limit(endPos);
+ oldIn.position(endPos);
+
+ }
+
+ int inPos = in.position();
+ int inLimit = in.limit();
+ // PARSE HERE
+ try
+ {
+ Object val = _typeHandler.parse(in);
+
+ if(in.hasRemaining())
+ {
+ if(val instanceof Transfer)
+ {
+ ByteBuffer buf = ByteBuffer.allocate(in.remaining());
+ buf.put(in);
+ buf.flip();
+ ((Transfer)val).setPayload(buf);
+ }
+ }
+
+ _connection.receive((short)channel,val);
+ reset();
+ in = oldIn;
+ oldIn = null;
+ _buffer = null;
+ state = State.SIZE_0;
+ break;
+
+
+ }
+ catch (AmqpErrorException ex)
+ {
+ state = State.ERROR;
+ frameParsingError = ex.getError();
+ }
+ catch (RuntimeException e)
+ {
+ in.position(inPos);
+ in.limit(inLimit);
+ System.err.println(toHex(in));
+ throw e;
+ }
+ }
+
+ }
+
+ _state = state;
+ _size = size;
+
+ if(_state == State.ERROR)
+ {
+ _connection.handleError(frameParsingError);
+ }
+ return this;
+ }
+ catch(RuntimeException e)
+ {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+ private static String toHex(ByteBuffer in)
+ {
+ Formatter formatter = new Formatter();
+ int count = 0;
+ while(in.hasRemaining())
+ {
+ formatter.format("%02x ", in.get() & 0xFF);
+ if(count++ == 16)
+ {
+ formatter.format("\n");
+ count = 0;
+ }
+
+ }
+ return formatter.toString();
+ }
+
+ private Error createFramingError(String description, Object... args)
+ {
+ return createError(ConnectionError.FRAMING_ERROR, description, args);
+ }
+
+ private Error createError(final ErrorCondition framingError,
+ final String description,
+ final Object... args)
+ {
+ Error error = new Error();
+ error.setCondition(framingError);
+ Formatter formatter = new Formatter();
+ error.setDescription(formatter.format(description, args).toString());
+ return error;
+ }
+
+
+ private void reset()
+ {
+ _size = 0;
+ _state = State.SIZE_0;
+ }
+
+
+ public boolean isDone()
+ {
+ return _state == State.ERROR || _connection.closedForInput();
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameParsingError.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameParsingError.java
new file mode 100644
index 0000000000..e8bd462b87
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameParsingError.java
@@ -0,0 +1,34 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+public enum FrameParsingError
+{
+ UNDERSIZED_FRAME_HEADER,
+ OVERSIZED_FRAME_HEADER,
+ DATA_OFFSET_IN_HEADER,
+ DATA_OFFSET_TOO_LARGE,
+ UNKNOWN_FRAME_TYPE,
+ CHANNEL_ID_BEYOND_MAX,
+ SPARE_OCTETS_IN_FRAME_BODY,
+ INSUFFICIENT_OCTETS_IN_FRAME_BODY,
+ UNKNOWN_TYPE_CODE, UNPARSABLE_TYPE;
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameTypeHandler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameTypeHandler.java
new file mode 100644
index 0000000000..6d680c8b02
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameTypeHandler.java
@@ -0,0 +1,31 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+
+public interface FrameTypeHandler extends ProtocolHandler
+{
+ void setExtHeaderRemaining(int size);
+
+ void setBodySize(int size);
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/OversizeFrameException.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/OversizeFrameException.java
new file mode 100644
index 0000000000..37897d9cb5
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/OversizeFrameException.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.framing;
+
+public class OversizeFrameException extends RuntimeException
+{
+ private final AMQFrame _frame;
+ private int _size;
+
+ public OversizeFrameException(final AMQFrame frame, final int size)
+ {
+ _frame = frame;
+ _size = size;
+ }
+
+ public AMQFrame getFrame()
+ {
+ return _frame;
+ }
+
+ public int getSize()
+ {
+ return _size;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrame.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrame.java
new file mode 100644
index 0000000000..4155b605c4
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrame.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.type.SaslFrameBody;
+
+public final class SASLFrame extends AMQFrame<SaslFrameBody>
+{
+
+ public SASLFrame(SaslFrameBody frameBody)
+ {
+ super(frameBody);
+ }
+
+ @Override public short getChannel()
+ {
+ return (short)0;
+ }
+
+ @Override public byte getFrameType()
+ {
+ return (byte)1;
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrameHandler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrameHandler.java
new file mode 100644
index 0000000000..be7023bfdc
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrameHandler.java
@@ -0,0 +1,311 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+import org.apache.qpid.amqp_1_0.codec.ProtocolHeaderHandler;
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.ErrorCondition;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+import java.util.Formatter;
+
+public class SASLFrameHandler implements ProtocolHandler
+{
+ private ConnectionEndpoint _connection;
+ private ValueHandler _typeHandler;
+
+ enum State {
+ SIZE_0,
+ SIZE_1,
+ SIZE_2,
+ SIZE_3,
+ PRE_PARSE,
+ BUFFERING,
+ PARSING,
+ ERROR
+ }
+
+ private State _state = State.SIZE_0;
+ private int _size;
+
+ private ByteBuffer _buffer;
+
+
+
+ public SASLFrameHandler(final ConnectionEndpoint connection)
+ {
+ _connection = connection;
+ _typeHandler = new ValueHandler(connection.getDescribedTypeRegistry());
+
+ }
+
+ public ProtocolHandler parse(ByteBuffer in)
+ {
+ try
+ {
+ Error frameParsingError = null;
+ int size = _size;
+ State state = _state;
+ ByteBuffer oldIn = null;
+
+ while(in.hasRemaining() && !_connection.isSASLComplete() && state != State.ERROR)
+ {
+
+ final int remaining = in.remaining();
+ if(remaining == 0)
+ {
+ return this;
+ }
+
+
+ switch(state)
+ {
+ case SIZE_0:
+ if(remaining >= 4)
+ {
+ size = in.getInt();
+ state = State.PRE_PARSE;
+ break;
+ }
+ else
+ {
+ size = (in.get() << 24) & 0xFF000000;
+ if(!in.hasRemaining())
+ {
+ state = State.SIZE_1;
+ break;
+ }
+ }
+ case SIZE_1:
+ size |= (in.get() << 16) & 0xFF0000;
+ if(!in.hasRemaining())
+ {
+ state = State.SIZE_2;
+ break;
+ }
+ case SIZE_2:
+ size |= (in.get() << 8) & 0xFF00;
+ if(!in.hasRemaining())
+ {
+ state = State.SIZE_3;
+ break;
+ }
+ case SIZE_3:
+ size |= in.get() & 0xFF;
+ state = State.PRE_PARSE;
+
+ case PRE_PARSE:
+
+ if(size < 8)
+ {
+ frameParsingError = createFramingError("specified frame size %d smaller than minimum frame header size %d", _size, 8);
+ state = State.ERROR;
+ break;
+ }
+
+ else if(size > _connection.getMaxFrameSize())
+ {
+ frameParsingError = createFramingError("specified frame size %d larger than maximum frame header size %d", size, _connection.getMaxFrameSize());
+ state = State.ERROR;
+ break;
+ }
+
+ if(in.remaining() < size-4)
+ {
+ _buffer = ByteBuffer.allocate(size-4);
+ _buffer.put(in);
+ state = State.BUFFERING;
+ break;
+ }
+ case BUFFERING:
+ if(_buffer != null)
+ {
+ if(in.remaining() < _buffer.remaining())
+ {
+ _buffer.put(in);
+ break;
+ }
+ else
+ {
+ ByteBuffer dup = in.duplicate();
+ dup.limit(dup.position()+_buffer.remaining());
+ int i = _buffer.remaining();
+ int d = dup.remaining();
+ in.position(in.position()+_buffer.remaining());
+ _buffer.put(dup);
+ oldIn = in;
+ _buffer.flip();
+ in = _buffer;
+ state = State.PARSING;
+ }
+ }
+
+ case PARSING:
+
+ int dataOffset = (in.get() << 2) & 0x3FF;
+
+ if(dataOffset < 8)
+ {
+ frameParsingError = createFramingError("specified frame data offset %d smaller than minimum frame header size %d", dataOffset, 8);
+ state = State.ERROR;
+ break;
+ }
+ else if(dataOffset > size)
+ {
+ frameParsingError = createFramingError("specified frame data offset %d larger than the frame size %d", dataOffset, _size);
+ state = State.ERROR;
+ break;
+ }
+
+ // type
+
+ int type = in.get() & 0xFF;
+ int channel = in.getShort() & 0xFF;
+
+ if(type != 0 && type != 1)
+ {
+ frameParsingError = createFramingError("unknown frame type: %d", type);
+ state = State.ERROR;
+ break;
+ }
+
+ if(type != 1)
+ {
+ System.err.println("Wrong frame type for SASL Frame");
+ }
+
+ // channel
+
+ /*if(channel > _connection.getChannelMax())
+ {
+ frameParsingError = createError(AmqpError.DECODE_ERROR,
+ "frame received on invalid channel %d above channel-max %d",
+ channel, _connection.getChannelMax());
+
+ state = State.ERROR;
+ }
+*/
+ // ext header
+ if(dataOffset!=8)
+ {
+ in.position(in.position()+dataOffset-8);
+ }
+
+ // oldIn null iff not working on duplicated buffer
+ if(oldIn == null)
+ {
+ oldIn = in;
+ in = in.duplicate();
+ final int endPos = in.position() + size - dataOffset;
+ in.limit(endPos);
+ oldIn.position(endPos);
+
+ }
+
+
+ // PARSE HERE
+ try
+ {
+ Object val = _typeHandler.parse(in);
+
+ if(in.hasRemaining())
+ {
+ state = State.ERROR;
+ frameParsingError = createFramingError("Frame length %d larger than contained frame body %s.", size, val);
+
+ }
+ else
+ {
+ _connection.receive((short)channel,val);
+ reset();
+ in = oldIn;
+ oldIn = null;
+ _buffer = null;
+ state = State.SIZE_0;
+ break;
+ }
+
+
+ }
+ catch (AmqpErrorException ex)
+ {
+ state = State.ERROR;
+ frameParsingError = ex.getError();
+ }
+ }
+
+ }
+
+ _state = state;
+ _size = size;
+
+ if(_state == State.ERROR)
+ {
+ _connection.handleError(frameParsingError);
+ }
+ if(_connection.isSASLComplete())
+ {
+ return new ProtocolHeaderHandler(_connection);
+ }
+ else
+ {
+ return this;
+ }
+ }
+ catch(RuntimeException e)
+ {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+ private Error createFramingError(String description, Object... args)
+ {
+ return createError(ConnectionError.FRAMING_ERROR, description, args);
+ }
+
+ private Error createError(final ErrorCondition framingError,
+ final String description,
+ final Object... args)
+ {
+ Error error = new Error();
+ error.setCondition(framingError);
+ Formatter formatter = new Formatter();
+ error.setDescription(formatter.format(description, args).toString());
+ return error;
+ }
+
+
+ private void reset()
+ {
+ _size = 0;
+ _state = State.SIZE_0;
+ }
+
+
+ public boolean isDone()
+ {
+ return _state == State.ERROR || _connection.closedForInput();
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLProtocolHeaderHandler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLProtocolHeaderHandler.java
new file mode 100644
index 0000000000..4ab90df92a
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLProtocolHeaderHandler.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+import java.nio.ByteBuffer;
+
+public class SASLProtocolHeaderHandler implements ProtocolHandler
+{
+ private ConnectionEndpoint _connection;
+ private static final byte MAJOR_VERSION = (byte) 1;
+ private static final byte MINOR_VERSION = (byte) 0;
+
+ enum State {
+ AWAITING_MAJOR,
+ AWAITING_MINOR,
+ AWAITING_REVISION,
+ ERROR
+ }
+
+ private State _state = State.AWAITING_MAJOR;
+
+
+
+ public SASLProtocolHeaderHandler(final ConnectionEndpoint connection)
+ {
+ _connection = connection;
+ }
+
+ public ProtocolHandler parse(final ByteBuffer in)
+ {
+ while(in.hasRemaining() && _state != State.ERROR)
+ {
+ switch(_state)
+ {
+ case AWAITING_MAJOR:
+ _state = in.get() == MAJOR_VERSION ? State.AWAITING_MINOR : State.ERROR;
+ if(!in.hasRemaining())
+ {
+ break;
+ }
+ case AWAITING_MINOR:
+ _state = in.get() == MINOR_VERSION ? State.AWAITING_MINOR : State.ERROR;
+ if(!in.hasRemaining())
+ {
+ break;
+ }
+ case AWAITING_REVISION:
+ byte revision = in.get();
+ _connection.protocolHeaderReceived(MAJOR_VERSION, MINOR_VERSION, revision);
+ ProtocolHandler handler = new SASLFrameHandler(_connection);
+ return handler.parse(in);
+ }
+ }
+ if(_state == State.ERROR)
+ {
+ _connection.invalidHeaderReceived();
+ }
+ return this;
+
+ }
+
+ public boolean isDone()
+ {
+ return _state != State.ERROR && !_connection.closedForInput();
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/TransportFrame.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/TransportFrame.java
new file mode 100644
index 0000000000..b66d36ebeb
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/TransportFrame.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+
+import java.nio.ByteBuffer;
+
+public final class TransportFrame extends AMQFrame<FrameBody>
+{
+
+ private final short _channel;
+
+ TransportFrame(short channel, FrameBody frameBody)
+ {
+ super(frameBody);
+ _channel = channel;
+ }
+
+ public TransportFrame(short channel, FrameBody frameBody, ByteBuffer payload)
+ {
+ super(frameBody, payload);
+ _channel = channel;
+ }
+
+ @Override public short getChannel()
+ {
+ return _channel;
+ }
+
+ @Override public byte getFrameType()
+ {
+ return (byte)0;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/MessageAttributes.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/MessageAttributes.java
new file mode 100644
index 0000000000..7c1c62388d
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/MessageAttributes.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.messaging;
+
+import org.apache.qpid.amqp_1_0.type.Symbol;
+
+import java.util.Map;
+
+public interface MessageAttributes extends Map<Symbol, Object>
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoder.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoder.java
new file mode 100644
index 0000000000..f72d5848b6
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoder.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.messaging;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Section;
+
+import java.nio.ByteBuffer;
+import java.util.List;
+
+
+public interface SectionDecoder
+{
+
+ public List<Section> parseAll(ByteBuffer buf) throws AmqpErrorException;
+ public Section readSection(ByteBuffer buf) throws AmqpErrorException;
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoderImpl.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoderImpl.java
new file mode 100644
index 0000000000..ed2b0094f9
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoderImpl.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.messaging;
+
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+public class SectionDecoderImpl implements SectionDecoder
+{
+
+ private ValueHandler _valueHandler;
+
+
+ public SectionDecoderImpl(final AMQPDescribedTypeRegistry describedTypeRegistry)
+ {
+ _valueHandler = new ValueHandler(describedTypeRegistry);
+ }
+
+ public List<Section> parseAll(ByteBuffer buf) throws AmqpErrorException
+ {
+
+ List<Section> obj = new ArrayList<Section>();
+ while(buf.hasRemaining())
+ {
+ Section section = (Section) _valueHandler.parse(buf);
+ obj.add(section);
+ }
+
+ return obj;
+ }
+
+ public Section readSection(ByteBuffer buf) throws AmqpErrorException
+ {
+ return (Section) _valueHandler.parse(buf);
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoder.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoder.java
new file mode 100644
index 0000000000..bcb9112d14
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoder.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.messaging;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+
+
+public interface SectionEncoder
+{
+ void reset();
+
+ Binary getEncoding();
+
+ void encodeObject(Object obj);
+
+ void encodeRaw(byte[] data);
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoderImpl.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoderImpl.java
new file mode 100644
index 0000000000..9636dea4b7
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoderImpl.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.messaging;
+
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+public class SectionEncoderImpl implements SectionEncoder
+{
+ private static final ByteBuffer EMPTY_BYTE_BUFFER = ByteBuffer.wrap(new byte[0]);
+ private ValueWriter.Registry _registry;
+
+ private int _totalSize = 0;
+
+ private List<byte[]> _output = new ArrayList<byte[]>();
+ private static final int DEFAULT_BUFFER_SIZE = 64 * 1024;
+ private ByteBuffer _current;
+
+ public SectionEncoderImpl(final AMQPDescribedTypeRegistry describedTypeRegistry)
+ {
+ _registry = describedTypeRegistry;
+ reset();
+ }
+
+ public void reset()
+ {
+ _totalSize = 0;
+ _output.clear();
+ _current = null;
+
+ }
+
+ public Binary getEncoding()
+ {
+ byte[] data = new byte[_totalSize];
+ int offset = 0;
+ for(byte[] src : _output)
+ {
+ int length = src.length;
+ System.arraycopy(src, 0, data, offset, _totalSize - offset < length ? _totalSize - offset : length);
+ offset+= length;
+ }
+ return new Binary(data);
+ }
+
+ public void encodeObject(Object obj)
+ {
+ final ValueWriter<Object> valueWriter = _registry.getValueWriter(obj);
+ valueWriter.setValue(obj);
+ int size = valueWriter.writeToBuffer(EMPTY_BYTE_BUFFER);
+
+ byte[] data = new byte[size];
+ _current = ByteBuffer.wrap(data);
+ valueWriter.writeToBuffer(_current);
+ _output.add(data);
+
+
+ _totalSize += size;
+
+
+ }
+
+ public void encodeRaw(byte[] data)
+ {
+ if(_current == null)
+ {
+ byte[] buf = new byte[data.length];
+ _current = ByteBuffer.wrap(buf);
+ _output.add(buf);
+ }
+ int remaining = _current.remaining();
+ int length = data.length;
+
+ if(remaining < length)
+ {
+ _current.put(data,0,remaining);
+ byte[] dst = new byte[length-remaining];
+ _output.add(dst);
+ _current = ByteBuffer.wrap(dst).put(data,remaining,length-remaining);
+ }
+ else
+ {
+ _current.put(data);
+ }
+ _totalSize += data.length;
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPFrameTransport.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPFrameTransport.java
new file mode 100644
index 0000000000..7cb10b923f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPFrameTransport.java
@@ -0,0 +1,179 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+
+
+public class AMQPFrameTransport implements FrameTransport<AMQFrame<FrameBody>>, FrameOutputHandler<FrameBody>
+{
+ private final Object _inputLock = new Object();
+ private final Object _outputLock = new Object();
+
+ private volatile boolean _inputOpen = true;
+ private volatile boolean _outputOpen = true;
+
+ private final ConnectionEndpoint _endpoint;
+ private final BlockingQueue<AMQFrame<FrameBody>> _queue = new ArrayBlockingQueue<AMQFrame<FrameBody>>(100);
+ private StateChangeListener _inputListener;
+ private StateChangeListener _outputListener;
+
+
+ public AMQPFrameTransport(final ConnectionEndpoint endpoint)
+ {
+ _endpoint = endpoint;
+
+ _endpoint.setFrameOutputHandler(this);
+ }
+
+ public boolean isOpenForInput()
+ {
+ return _inputOpen;
+ }
+
+ public void closeForInput()
+ {
+ synchronized(_inputLock)
+ {
+ _inputOpen = false;
+ _inputLock.notifyAll();
+ }
+ }
+
+ public void processIncomingFrame(final AMQFrame<FrameBody> frame)
+ {
+ frame.getFrameBody().invoke(frame.getChannel(), _endpoint);
+ }
+
+
+ public boolean canSend()
+ {
+ return _queue.remainingCapacity() != 0;
+ }
+
+ public void send(AMQFrame<FrameBody> frame)
+ {
+ send(frame, null);
+ }
+
+
+ public void send(final AMQFrame<FrameBody> frame, final ByteBuffer payload)
+ {
+ synchronized(_endpoint.getLock())
+ {
+ boolean empty = _queue.isEmpty();
+ try
+ {
+
+ while(!_queue.offer(frame))
+ {
+ _endpoint.getLock().wait(1000L);
+
+ }
+ if(empty && _outputListener != null)
+ {
+ _outputListener.onStateChange(true);
+ }
+
+ _endpoint.getLock().notifyAll();
+ }
+ catch (InterruptedException e)
+ {
+
+ }
+ }
+ }
+
+ public void close()
+ {
+ synchronized (_endpoint.getLock())
+ {
+ _endpoint.getLock().notifyAll();
+ }
+ }
+
+ public AMQFrame<FrameBody> getNextFrame()
+ {
+ synchronized(_endpoint.getLock())
+ {
+ AMQFrame<FrameBody> frame = null;
+ if(isOpenForOutput())
+ {
+ frame = _queue.poll();
+ }
+ return frame;
+ }
+ }
+
+ public void closeForOutput()
+ {
+ synchronized (_outputLock)
+ {
+ _outputOpen = false;
+ _outputLock.notifyAll();
+ }
+ }
+
+ public boolean isOpenForOutput()
+ {
+ return _outputOpen;
+ }
+
+ public ValueWriter.Registry getRegistry()
+ {
+ return _endpoint.getDescribedTypeRegistry();
+ }
+
+ public void setInputStateChangeListener(final StateChangeListener listener)
+ {
+ _inputListener = listener;
+ }
+
+ public void setOutputStateChangeListener(final StateChangeListener listener)
+ {
+ _outputListener = listener;
+ }
+
+ public void setVersion(final byte major, final byte minor, final byte revision)
+ {
+
+ }
+
+ public byte getMajorVersion()
+ {
+ return _endpoint.getMajorVersion();
+ }
+
+ public byte getMinorVersion()
+ {
+ return _endpoint.getMinorVersion();
+ }
+
+ public byte getRevision()
+ {
+ return _endpoint.getRevision();
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPTransport.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPTransport.java
new file mode 100644
index 0000000000..8327cf6f26
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPTransport.java
@@ -0,0 +1,170 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.codec.FrameWriter;
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+import org.apache.qpid.amqp_1_0.framing.TransportFrame;
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+
+import java.nio.ByteBuffer;
+
+public class AMQPTransport implements BytesTransport
+{
+ private volatile boolean _inputOpen = true;
+ private volatile boolean _outputOpen = true;
+
+ private static final int INPUT_BUFFER_SIZE = 1 << 16;
+ private static final int OUTPUT_BUFFER_SIZE = 1 << 16;
+
+
+ private final CircularBytesBuffer _inputBuffer = new CircularBytesBuffer(INPUT_BUFFER_SIZE);
+ private TransportFrame _currentInputFrame;
+ private boolean _readingFrames;
+
+
+ private final CircularBytesBuffer _outputBuffer = new CircularBytesBuffer(OUTPUT_BUFFER_SIZE);
+
+ private AMQFrame<FrameBody> _currentOutputFrame;
+
+
+ private AMQPFrameTransport _frameTransport;
+
+ private FrameWriter _frameWriter;
+
+ private final BytesProcessor _frameWriterProcessor = new BytesProcessor()
+ {
+ public void processBytes(final ByteBuffer buf)
+ {
+ _frameWriter.writeToBuffer(buf);
+
+ if(_frameWriter.isComplete())
+ {
+ _currentOutputFrame = null;
+ }
+ }
+ };
+
+ private StateChangeListener _inputListener;
+ private StateChangeListener _outputListener;
+
+
+ public AMQPTransport(AMQPFrameTransport frameTransport)
+ {
+ _frameTransport = frameTransport;
+ _frameWriter = new FrameWriter(_frameTransport.getRegistry());
+ _outputBuffer.put( ByteBuffer.wrap( new byte[] { (byte) 'A',
+ (byte) 'M',
+ (byte) 'Q',
+ (byte) 'P',
+ (byte) 0,
+ _frameTransport.getMajorVersion(),
+ _frameTransport.getMajorVersion(),
+ _frameTransport.getRevision(),
+ } ) );
+
+
+ }
+
+ public boolean isOpenForInput()
+ {
+ return _inputOpen;
+ }
+
+ public void inputClosed()
+ {
+ _inputOpen = false;
+ }
+
+ public void processBytes(final ByteBuffer buf)
+ {
+ _inputBuffer.put(buf);
+
+ if(!_readingFrames)
+ {
+ if(_inputBuffer.size()>=8)
+ {
+ final byte[] incomingHeader = new byte[8];
+ _inputBuffer.get(new BytesProcessor()
+ {
+ public void processBytes(final ByteBuffer buf)
+ {
+ buf.get(incomingHeader);
+ }
+ });
+ _frameTransport.setVersion(incomingHeader[5], incomingHeader[6], incomingHeader[7]);
+ _readingFrames = true;
+ }
+ }
+ else
+ {
+
+ }
+
+
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void setInputStateChangeListener(final StateChangeListener listener)
+ {
+ _inputListener = listener;
+ _frameTransport.setInputStateChangeListener(listener);
+ }
+
+ public void getNextBytes(final BytesProcessor processor)
+ {
+ // First try to fill the buffer as much as possible with frames
+ while(!_outputBuffer.isFull())
+ {
+ if(_currentOutputFrame == null)
+ {
+ _currentOutputFrame = _frameTransport.getNextFrame();
+ _frameWriter.setValue(_currentOutputFrame);
+ }
+
+ if(_currentOutputFrame == null)
+ {
+ break;
+ }
+
+
+ _outputBuffer.put(_frameWriterProcessor);
+
+
+
+ }
+
+ }
+
+ public void outputClosed()
+ {
+ _outputOpen = false;
+ }
+
+ public boolean isOpenForOutput()
+ {
+ return _outputOpen;
+ }
+
+ public void setOutputStateChangeListener(final StateChangeListener listener)
+ {
+ _outputListener = listener;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesProcessor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesProcessor.java
new file mode 100644
index 0000000000..d26eda302f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesProcessor.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import java.nio.ByteBuffer;
+
+public interface BytesProcessor
+{
+ void processBytes(ByteBuffer buf);
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesTransport.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesTransport.java
new file mode 100644
index 0000000000..6932e7628b
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesTransport.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+
+import java.nio.ByteBuffer;
+
+public interface BytesTransport extends BytesProcessor
+{
+
+ boolean isOpenForInput();
+ void inputClosed();
+ void processBytes(ByteBuffer buf);
+ void setInputStateChangeListener(StateChangeListener listener);
+
+ void getNextBytes(BytesProcessor processor);
+ void outputClosed();
+ boolean isOpenForOutput();
+ void setOutputStateChangeListener(StateChangeListener listener);
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CallbackHandlerSource.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CallbackHandlerSource.java
new file mode 100644
index 0000000000..604279a21f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CallbackHandlerSource.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+
+import javax.security.auth.callback.CallbackHandler;
+
+public interface CallbackHandlerSource
+{
+ CallbackHandler getHandler(String mechanism);
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CircularBytesBuffer.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CircularBytesBuffer.java
new file mode 100644
index 0000000000..e71eedd1e1
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CircularBytesBuffer.java
@@ -0,0 +1,174 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import java.nio.ByteBuffer;
+
+public class CircularBytesBuffer
+{
+
+ private final byte[] _buffer;
+ private final int _mask;
+ private final ByteBuffer _inputBuffer;
+ private final ByteBuffer _outputBuffer;
+
+ private volatile int _start;
+ private volatile int _size;
+
+ public CircularBytesBuffer(int size)
+ {
+ size = calculateSize(size);
+ _buffer = new byte[size];
+ _mask = size - 1;
+ _inputBuffer = ByteBuffer.wrap(_buffer);
+ _outputBuffer = ByteBuffer.wrap(_buffer);
+
+ }
+
+
+ public int size()
+ {
+ return _size;
+ }
+
+ public boolean isFull()
+ {
+ return _size == _buffer.length;
+ }
+
+ public boolean isEmpty()
+ {
+ return _size == 0;
+ }
+
+ public void put(ByteBuffer buffer)
+ {
+ if(!isFull())
+ {
+ int start;
+ int size;
+
+ synchronized(this)
+ {
+ start = _start;
+ size = _size;
+ }
+
+ int pos = (start + size) & _mask;
+ int length = ((_buffer.length - pos) > size ? start : _buffer.length) - pos;
+ int remaining = length > buffer.remaining() ? buffer.remaining() : length;
+ buffer.get(_buffer, pos, remaining);
+
+ synchronized(this)
+ {
+ _size += remaining;
+ }
+
+ // We may still have space left if we have to wrap from the end to the start of the buffer
+ if(buffer.hasRemaining())
+ {
+ put(buffer);
+ }
+ }
+ }
+
+ public synchronized void put(BytesProcessor processor)
+ {
+ if(!isFull())
+ {
+ int start;
+ int size;
+
+ synchronized(this)
+ {
+ start = _start;
+ size = _size;
+ }
+ int pos = (start + size) & _mask;
+ int length = ((_buffer.length - pos) > size ? start : _buffer.length) - pos;
+ _outputBuffer.position(pos);
+ _outputBuffer.limit(pos+length);
+ processor.processBytes(_outputBuffer);
+
+ synchronized (this)
+ {
+ _size += length - _outputBuffer.remaining();
+ }
+
+ if(_outputBuffer.remaining() == 0)
+ {
+ put(processor);
+ }
+ }
+ }
+
+ public synchronized void get(BytesProcessor processor)
+ {
+ if(!isEmpty())
+ {
+ int start;
+ int size;
+
+ synchronized(this)
+ {
+ start = _start;
+ size = _size;
+ }
+
+
+ int length = start + size > _buffer.length ? _buffer.length - start : size;
+
+ _inputBuffer.position(start);
+ _inputBuffer.limit(start+length);
+ processor.processBytes(_inputBuffer);
+ final int consumed = length - _inputBuffer.remaining();
+
+ synchronized(this)
+ {
+ _start += consumed;
+ _size -= consumed;
+ }
+
+ if(!_inputBuffer.hasRemaining())
+ {
+ get(processor);
+ }
+ }
+ }
+
+ private int calculateSize(int size)
+ {
+ int n = 0;
+ int s = size;
+ do
+ {
+ s>>=1;
+ n++;
+ }
+ while(s > 0);
+
+ s = 1 << n;
+ if(s < size)
+ {
+ s<<= 1;
+ }
+ return s;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEndpoint.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEndpoint.java
new file mode 100644
index 0000000000..4ad8b4196e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEndpoint.java
@@ -0,0 +1,934 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+import org.apache.qpid.amqp_1_0.framing.SASLFrame;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.security.SaslChallenge;
+import org.apache.qpid.amqp_1_0.type.security.SaslCode;
+import org.apache.qpid.amqp_1_0.type.security.SaslInit;
+import org.apache.qpid.amqp_1_0.type.security.SaslMechanisms;
+import org.apache.qpid.amqp_1_0.type.security.SaslOutcome;
+import org.apache.qpid.amqp_1_0.type.security.SaslResponse;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+
+
+import javax.security.sasl.Sasl;
+import javax.security.sasl.SaslException;
+import javax.security.sasl.SaslServer;
+import javax.security.sasl.SaslServerFactory;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+
+public class ConnectionEndpoint implements DescribedTypeConstructorRegistry.Source, ValueWriter.Registry.Source,
+ ErrorHandler, SASLEndpoint
+
+{
+ private static final short CONNECTION_CONTROL_CHANNEL = (short) 0;
+ private static final ByteBuffer EMPTY_BYTE_BUFFER = ByteBuffer.wrap(new byte[0]);
+
+ private final Container _container;
+ private Principal _user;
+
+ private static final short DEFAULT_CHANNEL_MAX = 255;
+ private static final int DEFAULT_MAX_FRAME = Integer.getInteger("amqp.max_frame_size",1<<15);
+
+
+ private ConnectionState _state = ConnectionState.UNOPENED;
+ private short _channelMax;
+ private int _maxFrameSize = 4096;
+ private String _remoteContainerId;
+
+ private SocketAddress _remoteAddress;
+
+ // positioned by the *outgoing* channel
+ private SessionEndpoint[] _sendingSessions = new SessionEndpoint[DEFAULT_CHANNEL_MAX+1];
+
+ // positioned by the *incoming* channel
+ private SessionEndpoint[] _receivingSessions = new SessionEndpoint[DEFAULT_CHANNEL_MAX+1];
+ private boolean _closedForInput;
+ private boolean _closedForOutput;
+
+ private AMQPDescribedTypeRegistry _describedTypeRegistry = AMQPDescribedTypeRegistry.newInstance()
+ .registerTransportLayer()
+ .registerMessagingLayer()
+ .registerTransactionLayer()
+ .registerSecurityLayer();
+
+ private FrameOutputHandler<FrameBody> _frameOutputHandler;
+
+ private byte _majorVersion;
+ private byte _minorVersion;
+ private byte _revision;
+ private UnsignedInteger _handleMax = UnsignedInteger.MAX_VALUE;
+ private ConnectionEventListener _connectionEventListener = ConnectionEventListener.DEFAULT;
+ private String _password;
+ private final boolean _requiresSASLClient;
+ private final boolean _requiresSASLServer;
+
+
+ private FrameOutputHandler<SaslFrameBody> _saslFrameOutput;
+
+ private boolean _saslComplete;
+
+ private UnsignedInteger _desiredMaxFrameSize = UnsignedInteger.valueOf(DEFAULT_MAX_FRAME);
+ private Runnable _onSaslCompleteTask;
+
+ private CallbackHandlerSource _callbackHandlersource;
+ private SaslServer _saslServer;
+ private boolean _authenticated;
+ private String _remoteHostname;
+
+ public ConnectionEndpoint(Container container, CallbackHandlerSource cbs)
+ {
+ _container = container;
+ _callbackHandlersource = cbs;
+ _requiresSASLClient = false;
+ _requiresSASLServer = cbs != null;
+ }
+
+ public ConnectionEndpoint(Container container, Principal user, String password)
+ {
+ _container = container;
+ _user = user;
+ _password = password;
+ _requiresSASLClient = user != null;
+ _requiresSASLServer = false;
+ }
+
+
+ public synchronized void open()
+ {
+ if(_requiresSASLClient)
+ {
+ synchronized (getLock())
+ {
+ while(!_saslComplete)
+ {
+ try
+ {
+ getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+ if(!_authenticated)
+ {
+ throw new RuntimeException("Could not connect - authentication error");
+ }
+ }
+ if(_state == ConnectionState.UNOPENED)
+ {
+ sendOpen(DEFAULT_CHANNEL_MAX, DEFAULT_MAX_FRAME);
+ _state = ConnectionState.AWAITING_OPEN;
+ }
+ }
+
+ public void setFrameOutputHandler(final FrameOutputHandler<FrameBody> frameOutputHandler)
+ {
+ _frameOutputHandler = frameOutputHandler;
+ }
+
+ public synchronized SessionEndpoint createSession(String name)
+ {
+ // todo assert connection state
+ SessionEndpoint endpoint = new SessionEndpoint(this);
+ short channel = getFirstFreeChannel();
+ if(channel != -1)
+ {
+ _sendingSessions[channel] = endpoint;
+ endpoint.setSendingChannel(channel);
+ Begin begin = new Begin();
+ begin.setNextOutgoingId(endpoint.getNextOutgoingId());
+ begin.setOutgoingWindow(endpoint.getOutgoingWindowSize());
+ begin.setIncomingWindow(endpoint.getIncomingWindowSize());
+
+ begin.setHandleMax(_handleMax);
+ send(channel, begin);
+
+ }
+ else
+ {
+ // todo error
+ }
+ return endpoint;
+ }
+
+
+ public Container getContainer()
+ {
+ return _container;
+ }
+
+ public Principal getUser()
+ {
+ return _user;
+ }
+
+ public short getChannelMax()
+ {
+ return _channelMax;
+ }
+
+ public int getMaxFrameSize()
+ {
+ return _maxFrameSize;
+ }
+
+ public String getRemoteContainerId()
+ {
+ return _remoteContainerId;
+ }
+
+ private void sendOpen(final short channelMax, final int maxFrameSize)
+ {
+ Open open = new Open();
+
+ open.setChannelMax(UnsignedShort.valueOf(DEFAULT_CHANNEL_MAX));
+ open.setContainerId(_container.getId());
+ open.setMaxFrameSize(getDesiredMaxFrameSize());
+ open.setHostname(getRemoteHostname());
+
+
+ send(CONNECTION_CONTROL_CHANNEL, open);
+ }
+
+ public UnsignedInteger getDesiredMaxFrameSize()
+ {
+ return _desiredMaxFrameSize;
+ }
+
+
+ public void setDesiredMaxFrameSize(UnsignedInteger size)
+ {
+ _desiredMaxFrameSize = size;
+ }
+
+
+
+
+ private void closeSender()
+ {
+ setClosedForOutput(true);
+ _frameOutputHandler.close();
+ }
+
+
+ short getFirstFreeChannel()
+ {
+ for(int i = 0; i<_sendingSessions.length;i++)
+ {
+ if(_sendingSessions[i]==null)
+ {
+ return (short) i;
+ }
+ }
+ return -1;
+ }
+
+ private SessionEndpoint getSession(final short channel)
+ {
+ // TODO assert existence, check channel state
+ return _receivingSessions[channel];
+ }
+
+
+ public synchronized void receiveOpen(short channel, Open open)
+ {
+
+ _channelMax = open.getChannelMax() == null ? DEFAULT_CHANNEL_MAX
+ : open.getChannelMax().shortValue() < DEFAULT_CHANNEL_MAX
+ ? DEFAULT_CHANNEL_MAX
+ : open.getChannelMax().shortValue();
+
+ UnsignedInteger remoteDesiredMaxFrameSize = open.getMaxFrameSize() == null ? UnsignedInteger.valueOf(DEFAULT_MAX_FRAME) : open.getMaxFrameSize();
+
+ _maxFrameSize = (remoteDesiredMaxFrameSize.compareTo(_desiredMaxFrameSize) < 0 ? remoteDesiredMaxFrameSize : _desiredMaxFrameSize).intValue();
+
+ _remoteContainerId = open.getContainerId();
+
+ switch(_state)
+ {
+ case UNOPENED:
+ sendOpen(_channelMax, _maxFrameSize);
+ case AWAITING_OPEN:
+ _state = ConnectionState.OPEN;
+ default:
+ // TODO bad stuff (connection already open)
+
+ }
+ /*if(_state == ConnectionState.AWAITING_OPEN)
+ {
+ _state = ConnectionState.OPEN;
+ }
+*/
+ }
+
+ public synchronized void receiveClose(short channel, Close close)
+ {
+ setClosedForInput(true);
+ _connectionEventListener.closeReceived();
+ switch(_state)
+ {
+ case UNOPENED:
+ case AWAITING_OPEN:
+ Error error = new Error();
+ error.setCondition(ConnectionError.CONNECTION_FORCED);
+ error.setDescription("Connection close sent before connection was opened");
+ connectionError(error);
+ break;
+ case OPEN:
+ sendClose(new Close());
+ break;
+ case CLOSE_SENT:
+ default:
+ }
+ }
+
+ protected synchronized void connectionError(Error error)
+ {
+ Close close = new Close();
+ close.setError(error);
+ switch(_state)
+ {
+ case UNOPENED:
+ _state = ConnectionState.CLOSED;
+ break;
+ case AWAITING_OPEN:
+ case OPEN:
+ sendClose(close);
+ _state = ConnectionState.CLOSE_SENT;
+ case CLOSE_SENT:
+ case CLOSED:
+ // already sent our close - too late to do anything more
+ break;
+ default:
+ // TODO Unknown state
+ }
+ }
+
+ public synchronized void inputClosed()
+ {
+ if(!_closedForInput)
+ {
+ _closedForInput = true;
+ for(int i = 0; i < _receivingSessions.length; i++)
+ {
+ if(_receivingSessions[i] != null)
+ {
+ _receivingSessions[i].end();
+ _receivingSessions[i]=null;
+
+ }
+ }
+ }
+ notifyAll();
+ }
+
+ private void sendClose(Close closeToSend)
+ {
+ send(CONNECTION_CONTROL_CHANNEL, closeToSend);
+ closeSender();
+ }
+
+ private synchronized void setClosedForInput(boolean closed)
+ {
+ _closedForInput = closed;
+
+ notifyAll();
+ }
+
+ public synchronized void receiveBegin(short channel, Begin begin)
+ {
+ short myChannelId;
+
+
+
+ if(begin.getRemoteChannel() != null)
+ {
+ myChannelId = begin.getRemoteChannel().shortValue();
+ SessionEndpoint endpoint;
+ try
+ {
+ endpoint = _sendingSessions[myChannelId];
+ }
+ catch(IndexOutOfBoundsException e)
+ {
+ final Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("BEGIN received on channel " + channel + " with given remote-channel "
+ + begin.getRemoteChannel() + " which is outside the valid range of 0 to "
+ + _channelMax + ".");
+ connectionError(error);
+ return;
+ }
+ if(endpoint != null)
+ {
+ if(_receivingSessions[channel] == null)
+ {
+ _receivingSessions[channel] = endpoint;
+ endpoint.setReceivingChannel(channel);
+ endpoint.setNextIncomingId(begin.getNextOutgoingId());
+ endpoint.setOutgoingSessionCredit(begin.getIncomingWindow());
+ }
+ else
+ {
+ final Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("BEGIN received on channel " + channel + " which is already in use.");
+ connectionError(error);
+ }
+ }
+ else
+ {
+ final Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("BEGIN received on channel " + channel + " with given remote-channel "
+ + begin.getRemoteChannel() + " which is not known as a begun session.");
+ connectionError(error);
+ }
+
+
+ }
+ else // Peer requesting session creation
+ {
+
+ myChannelId = getFirstFreeChannel();
+ if(myChannelId == -1)
+ {
+ // close any half open channel
+ myChannelId = getFirstFreeChannel();
+
+ }
+
+ if(_receivingSessions[channel] == null)
+ {
+ SessionEndpoint endpoint = new SessionEndpoint(this,begin);
+
+ _receivingSessions[channel] = endpoint;
+ _sendingSessions[myChannelId] = endpoint;
+
+ Begin beginToSend = new Begin();
+
+ endpoint.setReceivingChannel(channel);
+ endpoint.setSendingChannel(myChannelId);
+ beginToSend.setRemoteChannel(UnsignedShort.valueOf(channel));
+ beginToSend.setNextOutgoingId(endpoint.getNextOutgoingId());
+ beginToSend.setOutgoingWindow(endpoint.getOutgoingWindowSize());
+ beginToSend.setIncomingWindow(endpoint.getIncomingWindowSize());
+ send(myChannelId, beginToSend);
+
+ _connectionEventListener.remoteSessionCreation(endpoint);
+ }
+ else
+ {
+ final Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("BEGIN received on channel " + channel + " which is already in use.");
+ connectionError(error);
+ }
+
+ }
+
+
+
+ }
+
+
+
+ public synchronized void receiveEnd(short channel, End end)
+ {
+ SessionEndpoint endpoint = _receivingSessions[channel];
+ if(endpoint != null)
+ {
+ _receivingSessions[channel] = null;
+
+ endpoint.end(end);
+ }
+ else
+ {
+ // TODO error
+ }
+
+ }
+
+
+ public synchronized void sendEnd(short channel, End end)
+ {
+ send(channel, end);
+ _sendingSessions[channel] = null;
+ }
+
+ public synchronized void receiveAttach(short channel, Attach attach)
+ {
+ SessionEndpoint endPoint = getSession(channel);
+ endPoint.receiveAttach(attach);
+ }
+
+
+ public synchronized void receiveDetach(short channel, Detach detach)
+ {
+ SessionEndpoint endPoint = getSession(channel);
+ endPoint.receiveDetach(detach);
+ }
+
+ public synchronized void receiveTransfer(short channel, Transfer transfer)
+ {
+ SessionEndpoint endPoint = getSession(channel);
+ endPoint.receiveTransfer(transfer);
+ }
+
+ public synchronized void receiveDisposition(short channel, Disposition disposition)
+ {
+ SessionEndpoint endPoint = getSession(channel);
+ endPoint.receiveDisposition(disposition);
+ }
+
+ public synchronized void receiveFlow(short channel, Flow flow)
+ {
+ SessionEndpoint endPoint = getSession(channel);
+ endPoint.receiveFlow(flow);
+ }
+
+
+ public synchronized void send(short channel, FrameBody body)
+ {
+ send(channel, body, null);
+ }
+
+
+ public synchronized int send(short channel, FrameBody body, ByteBuffer payload)
+ {
+ if(!_closedForOutput)
+ {
+ ValueWriter<FrameBody> writer = _describedTypeRegistry.getValueWriter(body);
+ int size = writer.writeToBuffer(EMPTY_BYTE_BUFFER);
+ ByteBuffer payloadDup = payload == null ? null : payload.duplicate();
+ int payloadSent = getMaxFrameSize() - (size + 9);
+ if(payloadSent < (payload == null ? 0 : payload.remaining()))
+ {
+
+ if(body instanceof Transfer)
+ {
+ ((Transfer)body).setMore(Boolean.TRUE);
+ }
+
+ writer = _describedTypeRegistry.getValueWriter(body);
+ size = writer.writeToBuffer(EMPTY_BYTE_BUFFER);
+ payloadSent = getMaxFrameSize() - (size + 9);
+
+ try
+ {
+ payloadDup.limit(payloadDup.position()+payloadSent);
+ }
+ catch(NullPointerException npe)
+ {
+ throw npe;
+ }
+ }
+ else
+ {
+ payloadSent = payload == null ? 0 : payload.remaining();
+ }
+ _frameOutputHandler.send(AMQFrame.createAMQFrame(channel, body, payloadDup));
+ return payloadSent;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+
+
+
+ public void invalidHeaderReceived()
+ {
+ // TODO
+ _closedForInput = true;
+ }
+
+ public synchronized boolean closedForInput()
+ {
+ return _closedForInput;
+ }
+
+ public synchronized void protocolHeaderReceived(final byte major, final byte minorVersion, final byte revision)
+ {
+ if(_requiresSASLServer && _state != ConnectionState.UNOPENED)
+ {
+ // TODO - bad stuff
+ }
+
+ _majorVersion = major;
+ _minorVersion = minorVersion;
+ _revision = revision;
+ }
+
+ public synchronized void handleError(final Error error)
+ {
+ if(!closedForOutput())
+ {
+ Close close = new Close();
+ close.setError(error);
+ send((short) 0, close);
+ }
+ _closedForInput = true;
+ }
+
+ private final Logger _logger = Logger.getLogger("FRM");
+
+ public synchronized void receive(final short channel, final Object frame)
+ {
+ if(_logger.isLoggable(Level.FINE))
+ {
+ _logger.fine("RECV["+ _remoteAddress + "|"+channel+"] : " + frame);
+ }
+ if(frame instanceof FrameBody)
+ {
+ ((FrameBody)frame).invoke(channel, this);
+ }
+ else if(frame instanceof SaslFrameBody)
+ {
+ ((SaslFrameBody)frame).invoke(this);
+ }
+ }
+
+ public AMQPDescribedTypeRegistry getDescribedTypeRegistry()
+ {
+ return _describedTypeRegistry;
+ }
+
+ public synchronized void setClosedForOutput(boolean b)
+ {
+ _closedForOutput = true;
+ notifyAll();
+ }
+
+ public synchronized boolean closedForOutput()
+ {
+ return _closedForOutput;
+ }
+
+
+ public Object getLock()
+ {
+ return this;
+ }
+
+ public synchronized void close()
+ {
+ switch(_state)
+ {
+ case AWAITING_OPEN:
+ case OPEN:
+ Close closeToSend = new Close();
+ sendClose(closeToSend);
+ _state = ConnectionState.CLOSE_SENT;
+ break;
+ case CLOSE_SENT:
+ default:
+ }
+
+ }
+
+ public void setConnectionEventListener(final ConnectionEventListener connectionEventListener)
+ {
+ _connectionEventListener = connectionEventListener;
+ }
+
+ public ConnectionEventListener getConnectionEventListener()
+ {
+ return _connectionEventListener;
+ }
+
+ public byte getMinorVersion()
+ {
+ return _minorVersion;
+ }
+
+ public byte getRevision()
+ {
+ return _revision;
+ }
+
+ public byte getMajorVersion()
+ {
+ return _majorVersion;
+ }
+
+ public void receiveSaslInit(final SaslInit saslInit)
+ {
+ Symbol mechanism = saslInit.getMechanism();
+ final Binary initialResponse = saslInit.getInitialResponse();
+ byte[] response = initialResponse == null ? new byte[0] : initialResponse.getArray();
+
+
+ try
+ {
+ _saslServer = Sasl.createSaslServer(mechanism.toString(),
+ "AMQP",
+ "localhost",
+ null,
+ _callbackHandlersource.getHandler(mechanism.toString()));
+
+ // Process response from the client
+ byte[] challenge = _saslServer.evaluateResponse(response != null ? response : new byte[0]);
+
+ if (_saslServer.isComplete())
+ {
+ SaslOutcome outcome = new SaslOutcome();
+
+ outcome.setCode(SaslCode.OK);
+ _saslFrameOutput.send(new SASLFrame(outcome), null);
+ synchronized (getLock())
+ {
+ _saslComplete = true;
+ _authenticated = true;
+ getLock().notifyAll();
+ }
+
+ if(_onSaslCompleteTask != null)
+ {
+ _onSaslCompleteTask.run();
+ }
+
+ }
+ else
+ {
+ SaslChallenge challengeBody = new SaslChallenge();
+ challengeBody.setChallenge(new Binary(challenge));
+ _saslFrameOutput.send(new SASLFrame(challengeBody), null);
+
+ }
+ }
+ catch (SaslException e)
+ {
+ SaslOutcome outcome = new SaslOutcome();
+
+ outcome.setCode(SaslCode.AUTH);
+ _saslFrameOutput.send(new SASLFrame(outcome), null);
+ synchronized (getLock())
+ {
+ _saslComplete = true;
+ _authenticated = false;
+ getLock().notifyAll();
+ }
+ if(_onSaslCompleteTask != null)
+ {
+ _onSaslCompleteTask.run();
+ }
+
+ }
+ }
+
+ public void receiveSaslMechanisms(final SaslMechanisms saslMechanisms)
+ {
+ if(Arrays.asList(saslMechanisms.getSaslServerMechanisms()).contains(Symbol.valueOf("PLAIN")))
+ {
+ SaslInit init = new SaslInit();
+ init.setMechanism(Symbol.valueOf("PLAIN"));
+ init.setHostname(_remoteHostname);
+ byte[] usernameBytes = _user.getName().getBytes(Charset.forName("UTF-8"));
+ byte[] passwordBytes = _password.getBytes(Charset.forName("UTF-8"));
+ byte[] initResponse = new byte[usernameBytes.length+passwordBytes.length+2];
+ System.arraycopy(usernameBytes,0,initResponse,1,usernameBytes.length);
+ System.arraycopy(passwordBytes,0,initResponse,usernameBytes.length+2,passwordBytes.length);
+ init.setInitialResponse(new Binary(initResponse));
+ _saslFrameOutput.send(new SASLFrame(init),null);
+ }
+ }
+
+ public void receiveSaslChallenge(final SaslChallenge saslChallenge)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void receiveSaslResponse(final SaslResponse saslResponse)
+ {
+ final Binary responseBinary = saslResponse.getResponse();
+ byte[] response = responseBinary == null ? new byte[0] : responseBinary.getArray();
+
+
+ try
+ {
+
+ // Process response from the client
+ byte[] challenge = _saslServer.evaluateResponse(response != null ? response : new byte[0]);
+
+ if (_saslServer.isComplete())
+ {
+ SaslOutcome outcome = new SaslOutcome();
+
+ outcome.setCode(SaslCode.OK);
+ _saslFrameOutput.send(new SASLFrame(outcome),null);
+ synchronized (getLock())
+ {
+ _saslComplete = true;
+ _authenticated = true;
+ getLock().notifyAll();
+ }
+ if(_onSaslCompleteTask != null)
+ {
+ _onSaslCompleteTask.run();
+ }
+
+ }
+ else
+ {
+ SaslChallenge challengeBody = new SaslChallenge();
+ challengeBody.setChallenge(new Binary(challenge));
+ _saslFrameOutput.send(new SASLFrame(challengeBody), null);
+
+ }
+ }
+ catch (SaslException e)
+ {
+ SaslOutcome outcome = new SaslOutcome();
+
+ outcome.setCode(SaslCode.AUTH);
+ _saslFrameOutput.send(new SASLFrame(outcome),null);
+ synchronized (getLock())
+ {
+ _saslComplete = true;
+ _authenticated = false;
+ getLock().notifyAll();
+ }
+ if(_onSaslCompleteTask != null)
+ {
+ _onSaslCompleteTask.run();
+ }
+
+ }
+ }
+
+ public void receiveSaslOutcome(final SaslOutcome saslOutcome)
+ {
+ if(saslOutcome.getCode() == SaslCode.OK)
+ {
+ _saslFrameOutput.close();
+ synchronized (getLock())
+ {
+ _saslComplete = true;
+ _authenticated = true;
+ getLock().notifyAll();
+ }
+ if(_onSaslCompleteTask != null)
+ {
+ _onSaslCompleteTask.run();
+ }
+ }
+ else
+ {
+ synchronized (getLock())
+ {
+ _saslComplete = true;
+ _authenticated = false;
+ getLock().notifyAll();
+ }
+ setClosedForInput(true);
+ _saslFrameOutput.close();
+ }
+ }
+
+ public boolean requiresSASL()
+ {
+ return _requiresSASLClient || _requiresSASLServer;
+ }
+
+ public void setSaslFrameOutput(final FrameOutputHandler<SaslFrameBody> saslFrameOutput)
+ {
+ _saslFrameOutput = saslFrameOutput;
+ }
+
+ public void setOnSaslComplete(Runnable task)
+ {
+ _onSaslCompleteTask = task;
+
+ }
+
+ public boolean isAuthenticated()
+ {
+ return _authenticated;
+ }
+
+ public void initiateSASL()
+ {
+ SaslMechanisms mechanisms = new SaslMechanisms();
+ final Enumeration<SaslServerFactory> saslServerFactories = Sasl.getSaslServerFactories();
+
+ SaslServerFactory f;
+ ArrayList<Symbol> mechanismsList = new ArrayList<Symbol>();
+ while(saslServerFactories.hasMoreElements())
+ {
+ f = saslServerFactories.nextElement();
+ final String[] mechanismNames = f.getMechanismNames(null);
+ for(String name : mechanismNames)
+ {
+ mechanismsList.add(Symbol.valueOf(name));
+ }
+
+ }
+ mechanisms.setSaslServerMechanisms(mechanismsList.toArray(new Symbol[mechanismsList.size()]));
+ _saslFrameOutput.send(new SASLFrame(mechanisms), null);
+ }
+
+ public boolean isSASLComplete()
+ {
+ return _saslComplete;
+ }
+
+ public SocketAddress getRemoteAddress()
+ {
+ return _remoteAddress;
+ }
+
+ public void setRemoteAddress(SocketAddress remoteAddress)
+ {
+ _remoteAddress = remoteAddress;
+ }
+
+ public String getRemoteHostname()
+ {
+ return _remoteHostname;
+ }
+
+ public void setRemoteHostname(final String remoteHostname)
+ {
+ _remoteHostname = remoteHostname;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEventListener.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEventListener.java
new file mode 100644
index 0000000000..17163598d2
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEventListener.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public interface ConnectionEventListener
+{
+ class DefaultConnectionEventListener implements ConnectionEventListener
+ {
+ public void remoteSessionCreation(final SessionEndpoint endpoint)
+ {
+ endpoint.end();
+ }
+
+ public void closeReceived()
+ {
+
+ }
+ }
+
+ public static final ConnectionEventListener DEFAULT = new DefaultConnectionEventListener();
+
+ void remoteSessionCreation(SessionEndpoint endpoint);
+
+ public void closeReceived();
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionState.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionState.java
new file mode 100644
index 0000000000..a46526b58f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionState.java
@@ -0,0 +1,31 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public enum ConnectionState
+{
+ UNOPENED,
+ AWAITING_OPEN,
+ OPEN,
+ CLOSE_SENT,
+ CLOSED
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Container.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Container.java
new file mode 100644
index 0000000000..2e7e2fe2ea
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Container.java
@@ -0,0 +1,79 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import java.lang.management.ManagementFactory;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class Container
+{
+
+ private static final AtomicInteger CONTAINER_ID = new AtomicInteger(0);
+
+ private String _id;
+
+ public Container()
+ {
+ String hostname;
+ try
+ {
+ InetAddress addr = InetAddress.getLocalHost();
+
+
+ // Get hostname
+ hostname = addr.getHostName();
+ }
+ catch (UnknownHostException e)
+ {
+ hostname="127.0.0.1";
+ }
+
+ String pid;
+ String hackForPid = ManagementFactory.getRuntimeMXBean().getName();
+ if(hackForPid != null && hackForPid.contains("@"))
+ {
+ pid = hackForPid.split("@")[0];
+ }
+ else
+ {
+ pid = "unknown";
+ }
+
+ _id = hostname + '(' + pid + ')' + ':' + CONTAINER_ID.incrementAndGet();
+
+ }
+
+
+ public Container(String id)
+ {
+ _id = id;
+ }
+
+ public String getId()
+ {
+ return _id;
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Delivery.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Delivery.java
new file mode 100644
index 0000000000..4135199045
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Delivery.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Delivery
+{
+ private boolean _complete;
+ private boolean _settled;
+ private final List<Transfer> _transfers = new ArrayList<Transfer>(1);
+ private final UnsignedInteger _deliveryId;
+ private final Binary _deliveryTag;
+ private final LinkEndpoint _linkEndpoint;
+
+ public Delivery(Transfer transfer, final LinkEndpoint endpoint)
+ {
+ _settled = Boolean.TRUE.equals(transfer.getSettled());
+ _deliveryId = transfer.getDeliveryId();
+ _deliveryTag = transfer.getDeliveryTag();
+ _linkEndpoint = endpoint;
+ addTransfer(transfer);
+ }
+
+ public boolean isComplete()
+ {
+ return _complete;
+ }
+
+ public void setComplete(final boolean complete)
+ {
+ _complete = complete;
+ }
+
+ public boolean isSettled()
+ {
+ return _settled;
+ }
+
+ public void setSettled(final boolean settled)
+ {
+ _settled = settled;
+ }
+
+ public void addTransfer(Transfer transfer)
+ {
+ _transfers.add(transfer);
+ if(Boolean.TRUE.equals(transfer.getAborted()) || !Boolean.TRUE.equals(transfer.getMore()))
+ {
+ setComplete(true);
+ }
+ }
+
+ public List<Transfer> getTransfers()
+ {
+ return _transfers;
+ }
+
+ public UnsignedInteger getDeliveryId()
+ {
+ return _deliveryId;
+ }
+
+ public LinkEndpoint getLinkEndpoint()
+ {
+ return _linkEndpoint;
+ }
+
+ public Binary getDeliveryTag()
+ {
+ return _deliveryTag;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/DeliveryStateHandler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/DeliveryStateHandler.java
new file mode 100644
index 0000000000..95a16d375f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/DeliveryStateHandler.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+
+public interface DeliveryStateHandler
+{
+ public void handle(final Binary deliveryTag, final DeliveryState state, final Boolean settled);
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ErrorHandler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ErrorHandler.java
new file mode 100644
index 0000000000..e3bd37b225
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ErrorHandler.java
@@ -0,0 +1,9 @@
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+
+public interface ErrorHandler
+{
+ void handleError(org.apache.qpid.amqp_1_0.type.transport.Error error);
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameOutputHandler.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameOutputHandler.java
new file mode 100644
index 0000000000..77933702ba
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameOutputHandler.java
@@ -0,0 +1,36 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+
+import java.nio.ByteBuffer;
+
+public interface FrameOutputHandler<T>
+{
+ boolean canSend();
+
+ void send(AMQFrame<T> frame);
+ void send(AMQFrame<T> frame, ByteBuffer payload);
+
+ void close();
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameTransport.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameTransport.java
new file mode 100644
index 0000000000..0f9cc8f5e8
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameTransport.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+
+public interface FrameTransport<T extends AMQFrame>
+{
+ boolean isOpenForInput();
+ void closeForInput();
+ void processIncomingFrame(T frame);
+
+ T getNextFrame();
+ void closeForOutput();
+ boolean isOpenForOutput();
+
+ void setInputStateChangeListener(StateChangeListener listener);
+ void setOutputStateChangeListener(StateChangeListener listener);
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEndpoint.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEndpoint.java
new file mode 100644
index 0000000000..60c1427e10
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEndpoint.java
@@ -0,0 +1,542 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class LinkEndpoint<T extends LinkEventListener>
+{
+
+ private T _linkEventListener;
+ private DeliveryStateHandler _deliveryStateHandler;
+ private Object _flowTransactionId;
+ private SenderSettleMode _sendingSettlementMode;
+ private ReceiverSettleMode _receivingSettlementMode;
+ private Map _initialUnsettledMap;
+ private Map _localUnsettled;
+ private UnsignedInteger _lastSentCreditLimit;
+
+
+ private enum State
+ {
+ DETACHED,
+ ATTACH_SENT,
+ ATTACH_RECVD,
+ ATTACHED,
+ DETACH_SENT,
+ DETACH_RECVD
+ };
+
+ private final String _name;
+
+ private SessionEndpoint _session;
+
+
+ private volatile State _state = State.DETACHED;
+
+ private Source _source;
+ private Target _target;
+ private UnsignedInteger _deliveryCount;
+ private UnsignedInteger _linkCredit;
+ private UnsignedInteger _available;
+ private Boolean _drain;
+ private UnsignedInteger _localHandle;
+ private UnsignedLong _maxMessageSize;
+
+ private Map<Binary,Delivery> _unsettledTransfers = new HashMap<Binary,Delivery>();
+
+ LinkEndpoint(final SessionEndpoint sessionEndpoint, String name, Map<Binary, Outcome> unsettled)
+ {
+ _name = name;
+ _session = sessionEndpoint;
+ _linkCredit = UnsignedInteger.valueOf(0);
+ _drain = Boolean.FALSE;
+ _localUnsettled = unsettled;
+
+ }
+
+ LinkEndpoint(final SessionEndpoint sessionEndpoint,final Attach attach)
+ {
+ _session = sessionEndpoint;
+
+ _name = attach.getName();
+ _initialUnsettledMap = attach.getUnsettled();
+
+ _state = State.ATTACH_RECVD;
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public abstract Role getRole();
+
+ public Source getSource()
+ {
+ return _source;
+ }
+
+ public void setSource(final Source source)
+ {
+ _source = source;
+ }
+
+ public Target getTarget()
+ {
+ return _target;
+ }
+
+ public void setTarget(final Target target)
+ {
+ _target = target;
+ }
+
+ public void setDeliveryCount(final UnsignedInteger deliveryCount)
+ {
+ _deliveryCount = deliveryCount;
+ }
+
+ public void setLinkCredit(final UnsignedInteger linkCredit)
+ {
+ _linkCredit = linkCredit;
+ }
+
+ public void setAvailable(final UnsignedInteger available)
+ {
+ _available = available;
+ }
+
+ public void setDrain(final Boolean drain)
+ {
+ _drain = drain;
+ }
+
+ public UnsignedInteger getDeliveryCount()
+ {
+ return _deliveryCount;
+ }
+
+ public UnsignedInteger getAvailable()
+ {
+ return _available;
+ }
+
+ public Boolean getDrain()
+ {
+ return _drain;
+ }
+
+ public UnsignedInteger getLinkCredit()
+ {
+ return _linkCredit;
+ }
+
+ public void remoteDetached(Detach detach)
+ {
+ synchronized (getLock())
+ {
+ switch(_state)
+ {
+ case DETACH_SENT:
+ _state = State.DETACHED;
+ break;
+ case ATTACHED:
+ _state = State.DETACH_RECVD;
+ _linkEventListener.remoteDetached(this, detach);
+ break;
+ }
+ getLock().notifyAll();
+ }
+ }
+
+ public void receiveTransfer(final Transfer transfer, final Delivery delivery)
+ {
+ // TODO
+ }
+
+ public void settledByPeer(final Binary deliveryTag)
+ {
+ // TODO
+ }
+
+ public void receiveFlow(final Flow flow)
+ {
+ }
+
+ public void addUnsettled(final Delivery unsettled)
+ {
+ synchronized(getLock())
+ {
+ _unsettledTransfers.put(unsettled.getDeliveryTag(), unsettled);
+ getLock().notifyAll();
+ }
+ }
+
+ public void receiveDeliveryState(final Delivery unsettled,
+ final DeliveryState state,
+ final Boolean settled)
+ {
+ // TODO
+ synchronized(getLock())
+ {
+ if(_deliveryStateHandler != null)
+ {
+ _deliveryStateHandler.handle(unsettled.getDeliveryTag(), state, settled);
+ }
+
+ if(settled)
+ {
+ settle(unsettled.getDeliveryTag());
+ }
+
+ getLock().notifyAll();
+ }
+
+ }
+
+ public void settle(final Binary deliveryTag)
+ {
+ Delivery delivery = _unsettledTransfers.remove(deliveryTag);
+ if(delivery != null)
+ {
+ getSession().settle(getRole(),delivery.getDeliveryId());
+ }
+
+ }
+
+ public int getUnsettledCount()
+ {
+ synchronized(getLock())
+ {
+ return _unsettledTransfers.size();
+ }
+ }
+
+ public void setLocalHandle(final UnsignedInteger localHandle)
+ {
+ _localHandle = localHandle;
+ }
+
+ public void receiveAttach(final Attach attach)
+ {
+ synchronized(getLock())
+ {
+ switch(_state)
+ {
+ case ATTACH_SENT:
+ {
+
+ _state = State.ATTACHED;
+ getLock().notifyAll();
+
+ _initialUnsettledMap = attach.getUnsettled();
+ /* TODO - don't yet handle:
+
+ attach.getUnsettled();
+ attach.getProperties();
+ attach.getDurable();
+ attach.getExpiryPolicy();
+ attach.getTimeout();
+ */
+
+ break;
+ }
+
+ case DETACHED:
+ {
+ _state = State.ATTACHED;
+ getLock().notifyAll();
+ }
+
+
+ }
+
+ if(attach.getRole() == Role.SENDER)
+ {
+ _source = attach.getSource();
+ }
+ else
+ {
+ _target = attach.getTarget();
+ }
+
+ if(getRole() == Role.SENDER)
+ {
+ _maxMessageSize = attach.getMaxMessageSize();
+ }
+
+ }
+ }
+
+ public synchronized boolean isAttached()
+ {
+ return _state == State.ATTACHED;
+ }
+
+ public synchronized boolean isDetached()
+ {
+ return _state == State.DETACHED;
+ }
+
+ public SessionEndpoint getSession()
+ {
+ return _session;
+ }
+
+ public UnsignedInteger getLocalHandle()
+ {
+ return _localHandle;
+ }
+
+ public Object getLock()
+ {
+ return _session.getLock();
+ }
+
+ public void attach()
+ {
+ synchronized(getLock())
+ {
+ Attach attachToSend = new Attach();
+ attachToSend.setName(getName());
+ attachToSend.setRole(getRole());
+ attachToSend.setHandle(getLocalHandle());
+ attachToSend.setSource(getSource());
+ attachToSend.setTarget(getTarget());
+ attachToSend.setSndSettleMode(getSendingSettlementMode());
+ attachToSend.setRcvSettleMode(getReceivingSettlementMode());
+ attachToSend.setUnsettled(_localUnsettled);
+
+ if(getRole() == Role.SENDER)
+ {
+ attachToSend.setInitialDeliveryCount(_deliveryCount);
+ }
+
+ switch(_state)
+ {
+ case DETACHED:
+ _state = State.ATTACH_SENT;
+ break;
+ case ATTACH_RECVD:
+ _state = State.ATTACHED;
+ break;
+ default:
+ // TODO ERROR
+ }
+
+ getSession().sendAttach(attachToSend);
+
+ getLock().notifyAll();
+
+ }
+
+ }
+
+
+ public void detach()
+ {
+ detach(null, false);
+ }
+
+ public void close()
+ {
+ detach(null, true);
+ }
+
+ public void close(Error error)
+ {
+ detach(error, true);
+ }
+
+ public void detach(Error error)
+ {
+ detach(error, false);
+ }
+
+ private void detach(Error error, boolean close)
+ {
+ synchronized(getLock())
+ {
+ //TODO
+ switch(_state)
+ {
+ case ATTACHED:
+ _state = State.DETACH_SENT;
+ break;
+ case DETACH_RECVD:
+ _state = State.DETACHED;
+ break;
+ default:
+ return;
+ }
+
+ Detach detach = new Detach();
+ detach.setHandle(getLocalHandle());
+ if(close)
+ detach.setClosed(close);
+ detach.setError(error);
+
+ getSession().sendDetach(detach);
+
+ getLock().notifyAll();
+ }
+
+ }
+
+
+
+
+ public void setTransactionId(final Object txnId)
+ {
+ _flowTransactionId = txnId;
+ }
+
+ public void sendFlowConditional()
+ {
+ if(_lastSentCreditLimit != null)
+ {
+ UnsignedInteger clientsCredit = _lastSentCreditLimit.subtract(_deliveryCount);
+ int i = _linkCredit.subtract(clientsCredit).compareTo(clientsCredit);
+ if(i >=0)
+ {
+ sendFlow(_flowTransactionId != null);
+ }
+ else
+ {
+ getSession().sendFlowConditional();
+ }
+ }
+ else
+ {
+ sendFlow(_flowTransactionId != null);
+ }
+ }
+
+
+ public void sendFlow()
+ {
+ sendFlow(_flowTransactionId != null);
+ }
+
+ public void sendFlow(boolean setTransactionId)
+ {
+ if(_state == State.ATTACHED || _state == State.ATTACH_SENT)
+ {
+ Flow flow = new Flow();
+ flow.setLinkCredit(_linkCredit);
+ flow.setDeliveryCount(_deliveryCount);
+ _lastSentCreditLimit = _linkCredit.add(_deliveryCount);
+ flow.setAvailable(_available);
+ flow.setDrain(_drain);
+ if(setTransactionId)
+ {
+ flow.setProperties(Collections.singletonMap(Symbol.valueOf("txn-id"), _flowTransactionId));
+ }
+ flow.setHandle(getLocalHandle());
+ getSession().sendFlow(flow);
+ }
+ }
+
+ public T getLinkEventListener()
+ {
+ return _linkEventListener;
+ }
+
+ public void setLinkEventListener(final T linkEventListener)
+ {
+ synchronized(getLock())
+ {
+ _linkEventListener = linkEventListener;
+ }
+ }
+
+ public DeliveryStateHandler getDeliveryStateHandler()
+ {
+ return _deliveryStateHandler;
+ }
+
+ public void setDeliveryStateHandler(final DeliveryStateHandler deliveryStateHandler)
+ {
+ synchronized(getLock())
+ {
+ _deliveryStateHandler = deliveryStateHandler;
+ }
+ }
+
+ public void setSendingSettlementMode(SenderSettleMode sendingSettlementMode)
+ {
+ _sendingSettlementMode = sendingSettlementMode;
+ }
+
+ public SenderSettleMode getSendingSettlementMode()
+ {
+ return _sendingSettlementMode;
+ }
+
+ public ReceiverSettleMode getReceivingSettlementMode()
+ {
+ return _receivingSettlementMode;
+ }
+
+ public void setReceivingSettlementMode(ReceiverSettleMode receivingSettlementMode)
+ {
+ _receivingSettlementMode = receivingSettlementMode;
+ }
+
+ public Map getInitialUnsettledMap()
+ {
+ return _initialUnsettledMap;
+ }
+
+
+ public abstract void flowStateChanged();
+
+ public void setLocalUnsettled(Map unsettled)
+ {
+ _localUnsettled = unsettled;
+ }
+
+ @Override public String toString()
+ {
+ return "LinkEndpoint{" +
+ "_name='" + _name + '\'' +
+ ", _session=" + _session +
+ ", _state=" + _state +
+ ", _role=" + getRole() +
+ ", _source=" + _source +
+ ", _target=" + _target +
+ ", _transferCount=" + _deliveryCount +
+ ", _linkCredit=" + _linkCredit +
+ ", _available=" + _available +
+ ", _drain=" + _drain +
+ ", _localHandle=" + _localHandle +
+ ", _maxMessageSize=" + _maxMessageSize +
+ '}';
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEventListener.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEventListener.java
new file mode 100644
index 0000000000..c56a227e31
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEventListener.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.transport.Detach;
+
+public interface LinkEventListener
+{
+
+
+ void remoteDetached(final LinkEndpoint endpoint, Detach detach);
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Node.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Node.java
new file mode 100644
index 0000000000..fb2270b51b
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Node.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.transport;
+
+public class Node
+{
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ProtocolHeaderTransport.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ProtocolHeaderTransport.java
new file mode 100644
index 0000000000..f9abbeb832
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ProtocolHeaderTransport.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+
+import java.nio.ByteBuffer;
+import java.util.Map;
+
+public class ProtocolHeaderTransport implements BytesTransport
+{
+ private final Object _inputLock = new Object();
+ private final Object _outputLock = new Object();
+
+ private volatile boolean _inputOpen;
+ private volatile boolean _outputOpen;
+
+ private final Map<Binary,BytesTransport> _headersMap;
+
+ private BytesTransport _delegate;
+ private ByteBuffer _bytesToSend;
+
+ private byte[] _header = new byte[8];
+ private int _received;
+ private ByteBuffer _outputBuffer;
+
+ public ProtocolHeaderTransport(Map<Binary, BytesTransport> validHeaders)
+ {
+ _headersMap = validHeaders;
+
+ // if only one valid header then we can send, else we have to wait
+ }
+
+ public boolean isOpenForInput()
+ {
+ return _inputOpen;
+ }
+
+ public void inputClosed()
+ {
+ synchronized(_inputLock)
+ {
+ _inputOpen = false;
+ _inputLock.notifyAll();
+ }
+ }
+
+ public void processBytes(final ByteBuffer buf)
+ {
+ if(_delegate != null)
+ {
+ _delegate.processBytes(buf);
+ }
+ else
+ {
+
+ while( _received < 8 && buf.hasRemaining())
+ {
+ _header[_received++] = buf.get();
+ }
+ if(_received == 8)
+ {
+ Binary header = new Binary(_header);
+ _delegate = _headersMap.get(header);
+ if(_delegate != null)
+ {
+ _delegate.processBytes(ByteBuffer.wrap(_header));
+ _delegate.processBytes(buf);
+ }
+ else
+ {
+ inputClosed();
+ _outputBuffer = _headersMap.keySet().iterator().next().asByteBuffer();
+ }
+ }
+ }
+ }
+
+ public void setInputStateChangeListener(final StateChangeListener listener)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+
+ public void getNextBytes(final BytesProcessor processor)
+ {
+ if(_bytesToSend != null && _bytesToSend.hasRemaining())
+ {
+ processor.processBytes(_bytesToSend);
+ }
+ else if(_delegate != null)
+ {
+ _delegate.getNextBytes(processor);
+ }
+
+ }
+
+ public void outputClosed()
+ {
+ synchronized (_outputLock)
+ {
+ _outputOpen = false;
+ _outputLock.notifyAll();
+ }
+ }
+
+ public boolean isOpenForOutput()
+ {
+ return _outputOpen;
+ }
+
+ public void setOutputStateChangeListener(final StateChangeListener listener)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkEndpoint.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkEndpoint.java
new file mode 100644
index 0000000000..bd9244c858
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkEndpoint.java
@@ -0,0 +1,438 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+
+import java.util.*;
+
+public class ReceivingLinkEndpoint extends LinkEndpoint<ReceivingLinkListener>
+{
+
+
+ private static class TransientState
+ {
+
+ UnsignedInteger _deliveryId;
+ int _credit = 1;
+ boolean _settled;
+
+ private TransientState(final UnsignedInteger transferId)
+ {
+ _deliveryId = transferId;
+ }
+
+ void incrementCredit()
+ {
+ _credit++;
+ }
+
+ public int getCredit()
+ {
+ return _credit;
+ }
+
+ public UnsignedInteger getDeliveryId()
+ {
+ return _deliveryId;
+ }
+
+ public boolean isSettled()
+ {
+ return _settled;
+ }
+
+ public void setSettled(boolean settled)
+ {
+ _settled = settled;
+ }
+ }
+
+ private Map<Binary, Object> _unsettledMap = new LinkedHashMap<Binary, Object>();
+ private Map<Binary, TransientState> _unsettledIds = new LinkedHashMap<Binary, TransientState>();
+ private boolean _creditWindow;
+ private boolean _remoteDrain;
+ private UnsignedInteger _remoteTransferCount;
+ private UnsignedInteger _drainLimit;
+
+
+ public ReceivingLinkEndpoint(final SessionEndpoint session, String name)
+ {
+ this(session,name,null);
+ }
+
+ public ReceivingLinkEndpoint(final SessionEndpoint session, String name, Map<Binary, Outcome> unsettledMap)
+ {
+ super(session, name, unsettledMap);
+ setDeliveryCount(UnsignedInteger.valueOf(0));
+ setLinkEventListener(ReceivingLinkListener.DEFAULT);
+ }
+
+ public ReceivingLinkEndpoint(final SessionEndpoint session, final Attach attach)
+ {
+ super(session, attach);
+ setDeliveryCount(attach.getInitialDeliveryCount());
+ setLinkEventListener(ReceivingLinkListener.DEFAULT);
+ setSendingSettlementMode(attach.getSndSettleMode());
+ setReceivingSettlementMode(attach.getRcvSettleMode());
+ }
+
+
+ @Override public Role getRole()
+ {
+ return Role.RECEIVER;
+ }
+
+ @Override
+ public void receiveTransfer(final Transfer transfer, final Delivery delivery)
+ {
+ synchronized (getLock())
+ {
+ TransientState transientState;
+ boolean existingState = _unsettledMap.containsKey(transfer.getDeliveryTag());
+ _unsettledMap.put(transfer.getDeliveryTag(), transfer.getState());
+ if(!existingState)
+ {
+ transientState = new TransientState(transfer.getDeliveryId());
+ if(Boolean.TRUE.equals(transfer.getSettled()))
+ {
+ transientState.setSettled(true);
+ }
+ _unsettledIds.put(transfer.getDeliveryTag(), transientState);
+ setLinkCredit(getLinkCredit().subtract(UnsignedInteger.ONE));
+ setDeliveryCount(getDeliveryCount().add(UnsignedInteger.ONE));
+
+ }
+ else
+ {
+ transientState = _unsettledIds.get(transfer.getDeliveryTag());
+ transientState.incrementCredit();
+ if(Boolean.TRUE.equals(transfer.getSettled()))
+ {
+ transientState.setSettled(true);
+ }
+ }
+
+ if(transientState.isSettled())
+ {
+ _unsettledMap.remove(transfer.getDeliveryTag());
+ }
+ getLinkEventListener().messageTransfer(transfer);
+
+
+ getLock().notifyAll();
+ }
+ }
+
+ @Override public void receiveFlow(final Flow flow)
+ {
+ synchronized (getLock())
+ {
+ super.receiveFlow(flow);
+ _remoteDrain = Boolean.TRUE.equals((Boolean)flow.getDrain());
+ setAvailable(flow.getAvailable());
+ _remoteTransferCount = flow.getDeliveryCount();
+ getLock().notifyAll();
+ }
+ }
+
+
+ public boolean isDrained()
+ {
+ return getDrain() && getDeliveryCount().equals(getDrainLimit());
+ }
+
+ @Override
+ public void settledByPeer(final Binary deliveryTag)
+ {
+ synchronized (getLock())
+ {
+ // TODO XXX : need to do anything about the window here?
+ if(settled(deliveryTag) && _creditWindow)
+ {
+ sendFlowConditional();
+ }
+ }
+ }
+
+ public boolean settled(final Binary deliveryTag)
+ {
+ synchronized(getLock())
+ {
+ boolean deleted;
+ if(deleted = (_unsettledIds.remove(deliveryTag) != null))
+ {
+ _unsettledMap.remove(deliveryTag);
+
+ getLock().notifyAll();
+ }
+
+ return deleted;
+ }
+ }
+
+ public void updateDisposition(final Binary deliveryTag, DeliveryState state, boolean settled)
+ {
+ synchronized(getLock())
+ {
+ if(_unsettledMap.containsKey(deliveryTag))
+ {
+ boolean outcomeUpdate = false;
+ Outcome outcome=null;
+ if(state instanceof Outcome)
+ {
+ outcome = (Outcome)state;
+ }
+ else if(state instanceof TransactionalState)
+ {
+ // TODO? Is this correct
+ outcome = ((TransactionalState)state).getOutcome();
+ }
+
+ if(outcome != null)
+ {
+ Object oldOutcome = _unsettledMap.put(deliveryTag, outcome);
+ outcomeUpdate = !outcome.equals(oldOutcome);
+ }
+
+
+
+
+ TransientState transientState = _unsettledIds.get(deliveryTag);
+ if(outcomeUpdate || settled)
+ {
+
+ final UnsignedInteger transferId = transientState.getDeliveryId();
+
+ getSession().updateDisposition(getRole(), transferId, transferId, state, settled);
+ }
+
+
+ if(settled)
+ {
+
+ if(settled(deliveryTag))
+ {
+ if(!isDetached() && _creditWindow)
+ {
+ setLinkCredit(getLinkCredit().add(UnsignedInteger.ONE));
+ sendFlowConditional();
+ }
+ else
+ {
+ getSession().sendFlowConditional();
+ }
+ }
+ }
+ getLock().notifyAll();
+ }
+ else
+ {
+ TransientState transientState = _unsettledIds.get(deliveryTag);
+ if(_creditWindow)
+ {
+ setLinkCredit(getLinkCredit().add(UnsignedInteger.ONE));
+ sendFlowConditional();
+ }
+
+ }
+ }
+
+ }
+
+
+ public void setCreditWindow()
+ {
+ setCreditWindow(true);
+ }
+ public void setCreditWindow(boolean window)
+ {
+
+ _creditWindow = window;
+ sendFlowConditional();
+
+ }
+
+ public void drain()
+ {
+ synchronized (getLock())
+ {
+ setDrain(true);
+ _creditWindow = false;
+ _drainLimit = getDeliveryCount().add(getLinkCredit());
+ sendFlow();
+ getLock().notifyAll();
+ }
+ }
+
+ @Override
+ public void receiveDeliveryState(final Delivery unsettled, final DeliveryState state, final Boolean settled)
+ {
+ super.receiveDeliveryState(unsettled, state, settled);
+ if(_creditWindow)
+ {
+ if(Boolean.TRUE.equals(settled))
+ {
+ setLinkCredit(getLinkCredit().add(UnsignedInteger.ONE));
+ sendFlowConditional();
+ }
+ }
+ }
+
+ public void requestTransactionalSend(Object txnId)
+ {
+ synchronized (getLock())
+ {
+ setDrain(true);
+ _creditWindow = false;
+ setTransactionId(txnId);
+ sendFlow();
+ getLock().notifyAll();
+ }
+ }
+
+ private void sendFlow(final Object transactionId)
+ {
+ sendFlow();
+ }
+
+
+ public void clearDrain()
+ {
+ synchronized (getLock())
+ {
+ setDrain(false);
+ sendFlow();
+ getLock().notifyAll();
+ }
+ }
+
+ public void updateAllDisposition(Binary deliveryTag, DeliveryState deliveryState, boolean settled)
+ {
+ synchronized(getLock())
+ {
+ if(!_unsettledIds.isEmpty())
+ {
+ Binary firstTag = _unsettledIds.keySet().iterator().next();
+ Binary lastTag = deliveryTag;
+ updateDispositions(firstTag, lastTag, deliveryState, settled);
+ }
+ }
+ }
+
+ private void updateDispositions(Binary firstTag, Binary lastTag, DeliveryState state, boolean settled)
+ {
+ SortedMap<UnsignedInteger, UnsignedInteger> ranges = new TreeMap<UnsignedInteger,UnsignedInteger>();
+
+ synchronized(getLock())
+ {
+
+ Iterator<Binary> iter = _unsettledIds.keySet().iterator();
+ List<Binary> tagsToUpdate = new ArrayList<Binary>();
+ Binary tag = null;
+
+ while(iter.hasNext() && !(tag = iter.next()).equals(firstTag));
+
+ if(firstTag.equals(tag))
+ {
+ tagsToUpdate.add(tag);
+
+ UnsignedInteger deliveryId = _unsettledIds.get(firstTag).getDeliveryId();
+
+ UnsignedInteger first = deliveryId;
+ UnsignedInteger last = first;
+
+ while(iter.hasNext())
+ {
+ tag = iter.next();
+ tagsToUpdate.add(tag);
+
+ deliveryId = _unsettledIds.get(firstTag).getDeliveryId();
+
+ if(deliveryId.equals(last.add(UnsignedInteger.ONE)))
+ {
+ last = deliveryId;
+ }
+ else
+ {
+ ranges.put(first,last);
+ first = last = deliveryId;
+ }
+
+ if(tag.equals(lastTag))
+ {
+ break;
+ }
+ }
+
+ ranges.put(first,last);
+ }
+
+ if(settled)
+ {
+
+ for(Binary deliveryTag : tagsToUpdate)
+ {
+ if(settled(deliveryTag) && _creditWindow)
+ {
+ setLinkCredit(getLinkCredit().add(UnsignedInteger.valueOf(1)));
+ }
+ }
+ sendFlowConditional();
+ }
+
+
+
+ for(Map.Entry<UnsignedInteger,UnsignedInteger> range : ranges.entrySet())
+ {
+ getSession().updateDisposition(getRole(), range.getKey(), range.getValue(), state, settled);
+ }
+
+
+ getLock().notifyAll();
+ }
+
+ }
+
+ @Override
+ public void settle(Binary deliveryTag)
+ {
+ super.settle(deliveryTag);
+ if(_creditWindow)
+ {
+ sendFlowConditional();
+ }
+
+ }
+
+ public void flowStateChanged()
+ {
+ }
+
+ public UnsignedInteger getDrainLimit()
+ {
+ return _drainLimit;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkListener.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkListener.java
new file mode 100644
index 0000000000..c0464fbff6
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkListener.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+public interface ReceivingLinkListener extends LinkEventListener
+{
+ void messageTransfer(Transfer xfr);
+
+ class DefaultLinkEventListener implements org.apache.qpid.amqp_1_0.transport.ReceivingLinkListener
+ {
+ public void messageTransfer(final Transfer xfr)
+ {
+
+ }
+
+ public void remoteDetached(final LinkEndpoint endpoint, final Detach detach)
+ {
+ endpoint.detach();
+ }
+ }
+
+ public static final org.apache.qpid.amqp_1_0.transport.ReceivingLinkListener DEFAULT = new DefaultLinkEventListener();
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingSessionHalfEndpoint.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingSessionHalfEndpoint.java
new file mode 100644
index 0000000000..d4b8e500d9
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingSessionHalfEndpoint.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public class ReceivingSessionHalfEndpoint extends SessionHalfEndpoint
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpoint.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpoint.java
new file mode 100644
index 0000000000..21c33d848d
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpoint.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.security.SaslChallenge;
+import org.apache.qpid.amqp_1_0.type.security.SaslInit;
+import org.apache.qpid.amqp_1_0.type.security.SaslMechanisms;
+import org.apache.qpid.amqp_1_0.type.security.SaslOutcome;
+import org.apache.qpid.amqp_1_0.type.security.SaslResponse;
+
+public interface SASLEndpoint
+{
+ void receiveSaslInit(SaslInit saslInit);
+
+ void receiveSaslMechanisms(SaslMechanisms saslMechanisms);
+
+ void receiveSaslChallenge(SaslChallenge saslChallenge);
+
+ void receiveSaslResponse(SaslResponse saslResponse);
+
+ void receiveSaslOutcome(SaslOutcome saslOutcome);
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpointImpl.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpointImpl.java
new file mode 100644
index 0000000000..b371b1217c
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpointImpl.java
@@ -0,0 +1,291 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.SaslFrameBody;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+import org.apache.qpid.amqp_1_0.type.security.SaslChallenge;
+import org.apache.qpid.amqp_1_0.type.security.SaslInit;
+import org.apache.qpid.amqp_1_0.type.security.SaslMechanisms;
+import org.apache.qpid.amqp_1_0.type.security.SaslOutcome;
+import org.apache.qpid.amqp_1_0.type.security.SaslResponse;
+
+
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.sasl.Sasl;
+import javax.security.sasl.SaslClient;
+import javax.security.sasl.SaslException;
+import javax.security.sasl.SaslServer;
+import java.io.PrintWriter;
+import java.util.Arrays;
+
+
+public class SASLEndpointImpl
+ implements DescribedTypeConstructorRegistry.Source, ValueWriter.Registry.Source, SASLEndpoint
+{
+ private static final short SASL_CONTROL_CHANNEL = (short) 0;
+
+ private static final byte[] EMPTY_CHALLENGE = new byte[0];
+
+ private FrameTransport _transport;
+
+
+ private static enum State
+ {
+ BEGIN_SERVER,
+ BEGIN_CLIENT,
+ SENT_MECHANISMS,
+ SENT_INIT,
+ SENT_REPSONSE,
+ SENT_CHALLENGE,
+ SENT_OUTCOME
+ };
+
+
+ public PrintWriter _out;
+
+
+ private State _state;
+
+ private SaslClient _saslClient;
+ private SaslServer _saslServer;
+
+ private boolean _isReadable;
+ private boolean _isWritable;
+ private boolean _closedForInput;
+ private boolean _closedForOutput;
+
+ private AMQPDescribedTypeRegistry _describedTypeRegistry = AMQPDescribedTypeRegistry.newInstance().registerSecurityLayer();
+
+ private FrameOutputHandler _frameOutputHandler;
+
+ private byte _majorVersion;
+ private byte _minorVersion;
+ private byte _revision;
+ private UnsignedInteger _handleMax = UnsignedInteger.MAX_VALUE;
+ private ConnectionEventListener _connectionEventListener = ConnectionEventListener.DEFAULT;
+ private Symbol[] _mechanisms;
+ private Symbol _mechanism;
+
+
+ private SASLEndpointImpl(FrameTransport transport, State initialState, Symbol... mechanisms)
+ {
+ _transport = transport;
+ _state = initialState;
+ _mechanisms = mechanisms;
+ }
+
+
+ public void setFrameOutputHandler(final FrameOutputHandler frameOutputHandler)
+ {
+ _frameOutputHandler = frameOutputHandler;
+ if(_state == State.BEGIN_SERVER)
+ {
+ sendMechanisms();
+ }
+ }
+
+ private synchronized void sendMechanisms()
+ {
+ SaslMechanisms saslMechanisms = new SaslMechanisms();
+
+ saslMechanisms.setSaslServerMechanisms(_mechanisms);
+
+ _state = State.SENT_MECHANISMS;
+
+ send(saslMechanisms);
+ }
+
+ public boolean isReadable()
+ {
+ return _isReadable;
+ }
+
+ public boolean isWritable()
+ {
+ return _isWritable;
+ }
+
+
+ public synchronized void send(SaslFrameBody body)
+ {
+ if(!_closedForOutput)
+ {
+ if(_out != null)
+ {
+ _out.println("SEND : " + body);
+ _out.flush();
+ }
+ //_frameOutputHandler.send(new SASLFrame(body));
+ }
+ }
+
+
+
+ public void invalidHeaderReceived()
+ {
+ // TODO
+ _closedForInput = true;
+ }
+
+ public synchronized boolean closedForInput()
+ {
+ return _closedForInput;
+ }
+
+ public synchronized void protocolHeaderReceived(final byte major, final byte minorVersion, final byte revision)
+ {
+ _majorVersion = major;
+ _minorVersion = minorVersion;
+ _revision = revision;
+ }
+
+
+ public synchronized void receive(final short channel, final Object frame)
+ {
+ if(_out != null)
+ {
+ _out.println( "RECV["+channel+"] : " + frame);
+ _out.flush();
+ }
+ if(frame instanceof SaslFrameBody)
+ {
+ ((SaslFrameBody)frame).invoke(this);
+ }
+ else
+ {
+ // TODO
+ }
+ }
+
+ public AMQPDescribedTypeRegistry getDescribedTypeRegistry()
+ {
+ return _describedTypeRegistry;
+ }
+
+ public synchronized void setClosedForOutput(boolean b)
+ {
+ _closedForOutput = true;
+ notifyAll();
+ }
+
+ public synchronized boolean closedForOutput()
+ {
+ return _closedForOutput;
+ }
+
+
+ public Object getLock()
+ {
+ return this;
+ }
+
+
+ public byte getMajorVersion()
+ {
+ return _majorVersion;
+ }
+
+
+ public byte getMinorVersion()
+ {
+ return _minorVersion;
+ }
+
+ public byte getRevision()
+ {
+ return _revision;
+ }
+
+
+ public void receiveSaslInit(final SaslInit saslInit)
+ {
+ _mechanism = saslInit.getMechanism();
+ try
+ {
+ _saslServer = Sasl.createSaslServer(_mechanism.toString(), "AMQP", "localhost", null, createServerCallbackHandler(_mechanism));
+ }
+ catch (SaslException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+ }
+
+ private CallbackHandler createServerCallbackHandler(final Symbol mechanism)
+ {
+ return null; //TODO
+ }
+
+ public synchronized void receiveSaslMechanisms(final SaslMechanisms saslMechanisms)
+ {
+ Symbol[] serverMechanisms = saslMechanisms.getSaslServerMechanisms();
+ for(Symbol mechanism : _mechanisms)
+ {
+ if(Arrays.asList(serverMechanisms).contains(mechanism))
+ {
+ _mechanism = mechanism;
+ break;
+ }
+ }
+ // TODO - no matching mechanism
+ try
+ {
+ _saslClient = Sasl.createSaslClient(new String[] { _mechanism.toString() }, null, "AMQP", "localhost", null,
+ createClientCallbackHandler(_mechanism));
+ SaslInit init = new SaslInit();
+ init.setMechanism(_mechanism);
+ init.setInitialResponse(_saslClient.hasInitialResponse() ? new Binary(_saslClient.evaluateChallenge(EMPTY_CHALLENGE)) : null);
+ send(init);
+ }
+ catch (SaslException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+ }
+
+ private CallbackHandler createClientCallbackHandler(final Symbol mechanism)
+ {
+ return null; //TODO
+ }
+
+ public void receiveSaslChallenge(final SaslChallenge saslChallenge)
+ {
+ //TODO
+ }
+
+ public void receiveSaslResponse(final SaslResponse saslResponse)
+ {
+ //TODO
+ }
+
+
+ public void receiveSaslOutcome(final SaslOutcome saslOutcome)
+ {
+ //TODO
+ }
+
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLFrameTransport.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLFrameTransport.java
new file mode 100644
index 0000000000..8299cddfbe
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLFrameTransport.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.framing.SASLFrame;
+
+public class SASLFrameTransport implements FrameTransport<SASLFrame>
+{
+ private final Object _inputLock = new Object();
+ private final Object _outputLock = new Object();
+
+ private volatile boolean _inputOpen;
+ private volatile boolean _outputOpen;
+
+ public boolean isOpenForInput()
+ {
+ return _inputOpen;
+ }
+
+ public void closeForInput()
+ {
+ synchronized(_inputLock)
+ {
+ _inputOpen = false;
+ _inputLock.notifyAll();
+ }
+ }
+ public void processIncomingFrame(final SASLFrame frame)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public SASLFrame getNextFrame()
+ {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void closeForOutput()
+ {
+ synchronized (_outputLock)
+ {
+ _outputOpen = false;
+ _outputLock.notifyAll();
+ }
+ }
+
+ public boolean isOpenForOutput()
+ {
+ return _outputOpen;
+ }
+
+ public void setInputStateChangeListener(final StateChangeListener listener)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void setOutputStateChangeListener(final StateChangeListener listener)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLTransport.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLTransport.java
new file mode 100644
index 0000000000..e140e3acd7
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLTransport.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+
+import java.nio.ByteBuffer;
+
+public class SASLTransport implements BytesTransport
+{
+ private final Object _inputLock = new Object();
+ private final Object _outputLock = new Object();
+
+ private volatile boolean _inputOpen;
+ private volatile boolean _outputOpen;
+
+ private AMQPDescribedTypeRegistry _describedTypeRegistry = AMQPDescribedTypeRegistry.newInstance()
+ .registerSecurityLayer();
+
+ public boolean isOpenForInput()
+ {
+ return _inputOpen;
+ }
+
+ public void inputClosed()
+ {
+ synchronized(_inputLock)
+ {
+ _inputOpen = false;
+ _inputLock.notifyAll();
+ }
+ }
+
+ public void processBytes(final ByteBuffer buf)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void setInputStateChangeListener(final StateChangeListener listener)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void getNextBytes(final BytesProcessor processor)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void outputClosed()
+ {
+ synchronized (_outputLock)
+ {
+ _outputOpen = false;
+ _outputLock.notifyAll();
+ }
+ }
+
+ public boolean isOpenForOutput()
+ {
+ return _outputOpen;
+ }
+
+ public void setOutputStateChangeListener(final StateChangeListener listener)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkEndpoint.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkEndpoint.java
new file mode 100644
index 0000000000..a53b3661be
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkEndpoint.java
@@ -0,0 +1,214 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.Attach;
+import org.apache.qpid.amqp_1_0.type.transport.Flow;
+import org.apache.qpid.amqp_1_0.type.transport.Role;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class SendingLinkEndpoint extends LinkEndpoint<SendingLinkListener>
+{
+
+ private UnsignedInteger _lastDeliveryId;
+ private Binary _lastDeliveryTag;
+ private Map<Binary, UnsignedInteger> _unsettledMap = new HashMap<Binary, UnsignedInteger>();
+ private Binary _transactionId;
+
+ public SendingLinkEndpoint(final SessionEndpoint sessionEndpoint, String name)
+ {
+ this(sessionEndpoint, name, null);
+ }
+
+ public SendingLinkEndpoint(final SessionEndpoint sessionEndpoint, String name, Map<Binary, Outcome> unsettled)
+ {
+ super(sessionEndpoint, name, unsettled);
+ init();
+ }
+
+ public SendingLinkEndpoint(final SessionEndpoint sessionEndpoint, final Attach attach)
+ {
+ super(sessionEndpoint, attach);
+ setSendingSettlementMode(attach.getSndSettleMode());
+ setReceivingSettlementMode(attach.getRcvSettleMode());
+ init();
+ }
+
+ private void init()
+ {
+ setDeliveryCount(UnsignedInteger.valueOf(0));
+ setAvailable(UnsignedInteger.valueOf(0));
+ setLinkEventListener(SendingLinkListener.DEFAULT);
+ }
+
+ @Override public Role getRole()
+ {
+ return Role.SENDER;
+ }
+
+ public boolean transfer(final Transfer xfr)
+ {
+ SessionEndpoint s = getSession();
+ int transferCount;
+ transferCount = _lastDeliveryTag == null ? 1 : 1;
+ xfr.setMessageFormat(UnsignedInteger.ZERO);
+ synchronized(getLock())
+ {
+
+ final int currentCredit = getLinkCredit().intValue() - transferCount;
+
+ if(currentCredit < 0)
+ {
+ return false;
+ }
+ else
+ {
+ setLinkCredit(UnsignedInteger.valueOf((int)currentCredit));
+ }
+
+ setDeliveryCount(UnsignedInteger.valueOf((getDeliveryCount().intValue() + transferCount)));
+
+ xfr.setHandle(getLocalHandle());
+
+ s.sendTransfer(xfr, this, !xfr.getDeliveryTag().equals(_lastDeliveryTag));
+
+ if(!Boolean.TRUE.equals(xfr.getSettled()))
+ {
+ _unsettledMap.put(xfr.getDeliveryTag(), xfr.getDeliveryId());
+ }
+ }
+
+ if(Boolean.TRUE.equals(xfr.getMore()))
+ {
+ _lastDeliveryTag = xfr.getDeliveryTag();
+ }
+ else
+ {
+ _lastDeliveryTag = null;
+ }
+
+ return true;
+ }
+
+
+ public void drained()
+ {
+ synchronized (getLock())
+ {
+ setDeliveryCount(getDeliveryCount().add(getLinkCredit()));
+ setLinkCredit(UnsignedInteger.ZERO);
+ sendFlow();
+ }
+ }
+
+ @Override
+ public void receiveFlow(final Flow flow)
+ {
+ super.receiveFlow(flow);
+ UnsignedInteger t = flow.getDeliveryCount();
+ UnsignedInteger c = flow.getLinkCredit();
+ setDrain(flow.getDrain());
+
+ Map options;
+ if((options = flow.getProperties()) != null)
+ {
+ _transactionId = (Binary) options.get(Symbol.valueOf("txn-id"));
+ }
+
+ if(t == null)
+ {
+ setLinkCredit(c);
+ }
+ else
+ {
+ UnsignedInteger limit = t.add(c);
+ if(limit.compareTo(getDeliveryCount())<=0)
+ {
+ setLinkCredit(UnsignedInteger.valueOf(0));
+ }
+ else
+ {
+ setLinkCredit(limit.subtract(getDeliveryCount()));
+ }
+ }
+ getLinkEventListener().flowStateChanged();
+
+ }
+
+ @Override
+ public void flowStateChanged()
+ {
+ getLinkEventListener().flowStateChanged();
+ }
+
+ public boolean hasCreditToSend()
+ {
+ UnsignedInteger linkCredit = getLinkCredit();
+ return linkCredit != null && (linkCredit.compareTo(UnsignedInteger.valueOf(0)) > 0)
+ && getSession().hasCreditToSend();
+ }
+
+ public void receiveDeliveryState(final Delivery unsettled,
+ final DeliveryState state,
+ final Boolean settled)
+ {
+ super.receiveDeliveryState(unsettled, state, settled);
+ if(settled)
+ {
+ _unsettledMap.remove(unsettled.getDeliveryTag());
+ }
+ }
+
+ public UnsignedInteger getLastDeliveryId()
+ {
+ return _lastDeliveryId;
+ }
+
+ public void setLastDeliveryId(final UnsignedInteger deliveryId)
+ {
+ _lastDeliveryId = deliveryId;
+ }
+
+ public void updateDisposition(final Binary deliveryTag, DeliveryState state, boolean settled)
+ {
+ synchronized(getLock())
+ {
+ UnsignedInteger deliveryId;
+ if(settled && (deliveryId = _unsettledMap.remove(deliveryTag))!=null)
+ {
+ settle(deliveryTag);
+ getSession().updateDisposition(getRole(), deliveryId, deliveryId, state, settled);
+ }
+
+ }
+ }
+
+ public Binary getTransactionId()
+ {
+ return _transactionId;
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkListener.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkListener.java
new file mode 100644
index 0000000000..09a99f1ba1
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkListener.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+public interface SendingLinkListener extends LinkEventListener
+{
+ void flowStateChanged();
+
+ class DefaultLinkEventListener implements org.apache.qpid.amqp_1_0.transport.SendingLinkListener
+ {
+
+ public void remoteDetached(final LinkEndpoint endpoint, final org.apache.qpid.amqp_1_0.type.transport.Detach detach)
+ {
+ endpoint.detach();
+ }
+
+ public void flowStateChanged()
+ {
+
+ }
+ }
+
+ public static final org.apache.qpid.amqp_1_0.transport.SendingLinkListener DEFAULT = new DefaultLinkEventListener();
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingSessionHalfEndpoint.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingSessionHalfEndpoint.java
new file mode 100644
index 0000000000..2bc9a42dc5
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingSessionHalfEndpoint.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public class SendingSessionHalfEndpoint extends SessionHalfEndpoint
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SequenceNumber.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SequenceNumber.java
new file mode 100644
index 0000000000..3f6490c2aa
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SequenceNumber.java
@@ -0,0 +1,110 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public class SequenceNumber implements Comparable<SequenceNumber>, Cloneable
+{
+ private int _seqNo;
+
+ public SequenceNumber(int seqNo)
+ {
+ _seqNo = seqNo;
+ }
+
+ public SequenceNumber incr()
+ {
+ _seqNo++;
+ return this;
+ }
+
+ public SequenceNumber decr()
+ {
+ _seqNo--;
+ return this;
+ }
+
+ public static SequenceNumber add(SequenceNumber a, int i)
+ {
+ return a.clone().add(i);
+ }
+
+ public static SequenceNumber subtract(SequenceNumber a, int i)
+ {
+ return a.clone().add(-i);
+ }
+
+ private SequenceNumber add(int i)
+ {
+ _seqNo+=i;
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ SequenceNumber that = (SequenceNumber) o;
+
+ if (_seqNo != that._seqNo)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _seqNo;
+ }
+
+ public int compareTo(SequenceNumber o)
+ {
+ return _seqNo - o._seqNo;
+ }
+
+ @Override
+ public SequenceNumber clone()
+ {
+ return new SequenceNumber(_seqNo);
+ }
+
+ @Override
+ public String toString()
+ {
+ return "SN{" + _seqNo + '}';
+ }
+
+ public int intValue()
+ {
+ return _seqNo;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionAttachment.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionAttachment.java
new file mode 100644
index 0000000000..6bb1e922e5
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionAttachment.java
@@ -0,0 +1,92 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public class SessionAttachment
+{
+ private final SessionEndpoint _sessionEndpoint;
+ private final ConnectionEndpoint _connectionEndpoint;
+ private final short _channel;
+
+ public SessionAttachment(SessionEndpoint sessionEndpoint, ConnectionEndpoint connectionEndpoint, short channel)
+ {
+ _sessionEndpoint = sessionEndpoint;
+ _connectionEndpoint = connectionEndpoint;
+ _channel = channel;
+ }
+
+ public SessionEndpoint getSessionEndpoint()
+ {
+ return _sessionEndpoint;
+ }
+
+ public ConnectionEndpoint getConnectionEndpoint()
+ {
+ return _connectionEndpoint;
+ }
+
+ public short getChannel()
+ {
+ return _channel;
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ SessionAttachment that = (SessionAttachment) o;
+
+ if (_channel != that._channel)
+ {
+ return false;
+ }
+ if (_connectionEndpoint != null
+ ? !_connectionEndpoint.equals(that._connectionEndpoint)
+ : that._connectionEndpoint != null)
+ {
+ return false;
+ }
+ if (_sessionEndpoint != null ? !_sessionEndpoint.equals(that._sessionEndpoint) : that._sessionEndpoint != null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ int result = _sessionEndpoint != null ? _sessionEndpoint.hashCode() : 0;
+ result = 31 * result + (_connectionEndpoint != null ? _connectionEndpoint.hashCode() : 0);
+ result = 31 * result + (int) _channel;
+ return result;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEndpoint.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEndpoint.java
new file mode 100644
index 0000000000..4b8bf82a4a
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEndpoint.java
@@ -0,0 +1,781 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.framing.OversizeFrameException;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+import org.apache.qpid.amqp_1_0.type.messaging.TerminusDurability;
+import org.apache.qpid.amqp_1_0.type.messaging.TerminusExpiryPolicy;
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.TxnCapability;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+
+import java.nio.ByteBuffer;
+import java.util.*;
+
+public class SessionEndpoint
+{
+ private SessionState _state = SessionState.INACTIVE;
+
+ private final Map<String, LinkEndpoint> _linkMap = new HashMap<String, LinkEndpoint>();
+ private final Map<LinkEndpoint, UnsignedInteger> _localLinkEndpoints = new HashMap<LinkEndpoint, UnsignedInteger>();
+ private final Map<UnsignedInteger, LinkEndpoint> _remoteLinkEndpoints = new HashMap<UnsignedInteger, LinkEndpoint>();
+
+ private long _timeout;
+
+
+ private ConnectionEndpoint _connection;
+ private long _lastAttachedTime;
+
+ private short _receivingChannel;
+ private short _sendingChannel;
+
+ private LinkedHashMap<UnsignedInteger,Delivery> _outgoingUnsettled;
+ private LinkedHashMap<UnsignedInteger,Delivery> _incomingUnsettled;
+
+ // has to be a power of two
+ private static final int DEFAULT_SESSION_BUFFER_SIZE = 1 << 11;
+ private static final int BUFFER_SIZE_MASK = DEFAULT_SESSION_BUFFER_SIZE - 1;
+
+ private SequenceNumber _nextIncomingTransferId;
+ private SequenceNumber _nextOutgoingTransferId;
+
+ private int _nextOutgoingDeliveryId;
+
+ //private SequenceNumber _incomingLWM;
+ //private SequenceNumber _outgoingLWM;
+
+ private UnsignedInteger _outgoingSessionCredit;
+
+
+
+ private UnsignedInteger _initialOutgoingId;
+
+ private SessionEventListener _sessionEventListener = SessionEventListener.DEFAULT;
+
+ private int _availableIncomingCredit;
+ private int _availableOutgoingCredit;
+ private UnsignedInteger _lastSentIncomingLimit;
+
+ public SessionEndpoint(final ConnectionEndpoint connectionEndpoint)
+ {
+ this(connectionEndpoint, UnsignedInteger.valueOf(0));
+ }
+
+ public SessionEndpoint(final ConnectionEndpoint connectionEndpoint, Begin begin)
+ {
+ this(connectionEndpoint, UnsignedInteger.valueOf(0));
+ _state = SessionState.BEGIN_RECVD;
+ _nextIncomingTransferId = new SequenceNumber(begin.getNextOutgoingId().intValue());
+ }
+
+
+ public SessionEndpoint(final ConnectionEndpoint connectionEndpoint, UnsignedInteger nextOutgoingId)
+ {
+ _connection = connectionEndpoint;
+
+ _initialOutgoingId = nextOutgoingId;
+ _nextOutgoingTransferId = new SequenceNumber(nextOutgoingId.intValue());
+
+ _outgoingUnsettled = new LinkedHashMap<UnsignedInteger,Delivery>(DEFAULT_SESSION_BUFFER_SIZE);
+ _incomingUnsettled = new LinkedHashMap<UnsignedInteger, Delivery>(DEFAULT_SESSION_BUFFER_SIZE);
+ _availableIncomingCredit = DEFAULT_SESSION_BUFFER_SIZE;
+ _availableOutgoingCredit = DEFAULT_SESSION_BUFFER_SIZE;
+ }
+
+
+ public void setReceivingChannel(final short receivingChannel)
+ {
+ _receivingChannel = receivingChannel;
+ switch(_state)
+ {
+ case INACTIVE:
+ _state = SessionState.BEGIN_RECVD;
+ break;
+ case BEGIN_SENT:
+ _state = SessionState.ACTIVE;
+ break;
+ default:
+ // TODO error
+
+ }
+ }
+
+
+ public void setSendingChannel(final short sendingChannel)
+ {
+ _sendingChannel = sendingChannel;
+ switch(_state)
+ {
+ case INACTIVE:
+ _state = SessionState.BEGIN_SENT;
+ break;
+ case BEGIN_RECVD:
+ _state = SessionState.ACTIVE;
+ break;
+ default:
+ // TODO error
+
+ }
+ }
+
+ public SessionState getState()
+ {
+ return _state;
+ }
+
+ public void end()
+ {
+ end(null);
+ }
+
+ public void end(final End end)
+ {
+ synchronized(getLock())
+ {
+ switch(_state)
+ {
+ case END_SENT:
+ _state = SessionState.ENDED;
+ break;
+ case ACTIVE:
+ detachLinks();
+ _sessionEventListener.remoteEnd(end);
+ short sendChannel = getSendingChannel();
+ _connection.sendEnd(sendChannel, new End());
+ _state = end == null ? SessionState.END_SENT : SessionState.ENDED;
+ break;
+ default:
+ sendChannel = getSendingChannel();
+ End reply = new End();
+ Error error = new Error();
+ error.setCondition(AmqpError.ILLEGAL_STATE);
+ error.setDescription("END called on Session which has not been opened");
+ reply.setError(error);
+ _connection.sendEnd(sendChannel, reply);
+ break;
+
+
+ }
+ getLock().notifyAll();
+ }
+ }
+
+ private void detachLinks()
+ {
+ Collection<UnsignedInteger> handles = new ArrayList<UnsignedInteger>(_remoteLinkEndpoints.keySet());
+ for(UnsignedInteger handle : handles)
+ {
+ detach(handle, null);
+ }
+ }
+
+ public short getSendingChannel()
+ {
+ return _sendingChannel;
+ }
+
+
+ public void receiveAttach(final Attach attach)
+ {
+ if(_state == SessionState.ACTIVE)
+ {
+ UnsignedInteger handle = attach.getHandle();
+ if(_remoteLinkEndpoints.containsKey(handle))
+ {
+ // TODO - Error - handle busy?
+ }
+ else
+ {
+ LinkEndpoint endpoint = getLinkMap().get(attach.getName());
+ if(endpoint == null)
+ {
+ endpoint = attach.getRole() == Role.RECEIVER
+ ? new SendingLinkEndpoint(this, attach)
+ : new ReceivingLinkEndpoint(this, attach);
+
+ // TODO : fix below - distinguish between local and remote owned
+ endpoint.setSource(attach.getSource());
+ endpoint.setTarget(attach.getTarget());
+
+
+ }
+
+ if(attach.getRole() == Role.SENDER)
+ {
+ endpoint.setDeliveryCount(attach.getInitialDeliveryCount());
+ }
+
+ _remoteLinkEndpoints.put(handle, endpoint);
+
+ if(!_localLinkEndpoints.containsKey(endpoint))
+ {
+ UnsignedInteger localHandle = findNextAvailableHandle();
+ endpoint.setLocalHandle(localHandle);
+ _localLinkEndpoints.put(endpoint, localHandle);
+
+ _sessionEventListener.remoteLinkCreation(endpoint);
+
+
+ }
+ else
+ {
+ endpoint.receiveAttach(attach);
+ }
+ }
+ }
+ }
+
+ private void send(final FrameBody frameBody)
+ {
+ _connection.send(this.getSendingChannel(), frameBody);
+ }
+
+
+ private int send(final FrameBody frameBody, ByteBuffer payload)
+ {
+ return _connection.send(this.getSendingChannel(), frameBody, payload);
+ }
+
+ private UnsignedInteger findNextAvailableHandle()
+ {
+ int i = 0;
+ do
+ {
+ if(!_localLinkEndpoints.containsValue(UnsignedInteger.valueOf(i)))
+ {
+ return UnsignedInteger.valueOf(i);
+ }
+ } while(++i != 0);
+
+ // TODO
+ throw new RuntimeException();
+ }
+
+ public void receiveDetach(final Detach detach)
+ {
+ UnsignedInteger handle = detach.getHandle();
+ detach(handle, detach);
+ }
+
+ private void detach(UnsignedInteger handle, Detach detach)
+ {
+ if(_remoteLinkEndpoints.containsKey(handle))
+ {
+ LinkEndpoint endpoint = _remoteLinkEndpoints.remove(handle);
+
+ endpoint.remoteDetached(detach);
+
+ _localLinkEndpoints.remove(endpoint);
+
+
+ }
+ else
+ {
+ // TODO
+ }
+ }
+
+ public void receiveTransfer(final Transfer transfer)
+ {
+ synchronized(getLock())
+ {
+ _nextIncomingTransferId.incr();
+/*
+ _availableIncomingCredit--;
+*/
+
+ UnsignedInteger handle = transfer.getHandle();
+
+
+
+ LinkEndpoint endpoint = _remoteLinkEndpoints.get(handle);
+
+ if(endpoint == null)
+ {
+ //TODO - error unknown link
+ System.err.println("Unknown endpoint " + transfer);
+
+ }
+
+ Delivery delivery = _incomingUnsettled.get(transfer.getDeliveryId());
+ if(delivery == null)
+ {
+ delivery = new Delivery(transfer, endpoint);
+ _incomingUnsettled.put(transfer.getDeliveryId(),delivery);
+ if(delivery.isSettled() || Boolean.TRUE.equals(transfer.getAborted()))
+ {
+/*
+ _availableIncomingCredit++;
+*/
+ }
+ }
+ else
+ {
+ if(delivery.getDeliveryId().equals(transfer.getDeliveryId()))
+ {
+ delivery.addTransfer(transfer);
+ if(delivery.isSettled())
+ {
+/*
+ _availableIncomingCredit++;
+*/
+ }
+ else if(Boolean.TRUE.equals(transfer.getAborted()))
+ {
+/*
+ _availableIncomingCredit += delivery.getTransfers().size();
+*/
+ }
+ }
+ else
+ {
+ // TODO - error
+ System.err.println("Incorrect transfer id " + transfer);
+ }
+ }
+
+ if(endpoint != null)
+ {
+ endpoint.receiveTransfer(transfer, delivery);
+ }
+
+ if((delivery.isComplete() && delivery.isSettled() || Boolean.TRUE.equals(transfer.getAborted())))
+ {
+ _incomingUnsettled.remove(transfer.getDeliveryId());
+ }
+ }
+ }
+
+ public void receiveFlow(final Flow flow)
+ {
+
+ synchronized(getLock())
+ {
+ UnsignedInteger handle = flow.getHandle();
+ LinkEndpoint endpoint = handle == null ? null : _remoteLinkEndpoints.get(handle);
+
+ final UnsignedInteger nextOutgoingId = flow.getNextIncomingId() == null ? _initialOutgoingId : flow.getNextIncomingId();
+ int limit = (nextOutgoingId.intValue() + flow.getIncomingWindow().intValue());
+ _outgoingSessionCredit = UnsignedInteger.valueOf(limit - _nextOutgoingTransferId.intValue());
+
+ if(endpoint != null)
+ {
+ endpoint.receiveFlow( flow );
+ }
+ else
+ {
+ for(LinkEndpoint le : _remoteLinkEndpoints.values())
+ {
+ le.flowStateChanged();
+ }
+ }
+
+ getLock().notifyAll();
+ }
+
+
+ }
+
+ public void receiveDisposition(final Disposition disposition)
+ {
+ Role dispositionRole = disposition.getRole();
+
+ LinkedHashMap<UnsignedInteger, Delivery> unsettledTransfers;
+
+ if(dispositionRole == Role.RECEIVER)
+ {
+ unsettledTransfers = _outgoingUnsettled;
+ }
+ else
+ {
+ unsettledTransfers = _incomingUnsettled;
+
+ }
+
+ UnsignedInteger deliveryId = disposition.getFirst();
+ UnsignedInteger last = disposition.getLast();
+ if(last == null)
+ {
+ last = deliveryId;
+ }
+
+
+ while(deliveryId.compareTo(last)<=0)
+ {
+
+ Delivery delivery = unsettledTransfers.get(deliveryId);
+ if(delivery != null)
+ {
+ delivery.getLinkEndpoint().receiveDeliveryState(delivery,
+ disposition.getState(),
+ disposition.getSettled());
+ }
+ deliveryId = deliveryId.add(UnsignedInteger.ONE);
+ }
+ if(disposition.getSettled())
+ {
+ checkSendFlow();
+ }
+
+ }
+
+ private void checkSendFlow()
+ {
+ //TODO
+ }
+
+ public SendingLinkEndpoint createSendingLinkEndpoint(final String name, final String targetAddr, final String sourceAddr)
+ {
+ return createSendingLinkEndpoint(name, targetAddr, sourceAddr, null);
+ }
+
+ public SendingLinkEndpoint createSendingLinkEndpoint(final String name, final String targetAddr, final String sourceAddr, Map<Binary, Outcome> unsettled)
+ {
+ return createSendingLinkEndpoint(name, targetAddr, sourceAddr, false, unsettled);
+ }
+
+ public SendingLinkEndpoint createSendingLinkEndpoint(final String name, final String targetAddr,
+ final String sourceAddr, boolean durable,
+ Map<Binary, Outcome> unsettled)
+ {
+
+ Source source = new Source();
+ source.setAddress(sourceAddr);
+ Target target = new Target();
+ target.setAddress(targetAddr);
+ if(durable)
+ {
+ target.setDurable(TerminusDurability.UNSETTLED_STATE);
+ target.setExpiryPolicy(TerminusExpiryPolicy.NEVER);
+ }
+
+ return createSendingLinkEndpoint(name, source, target, unsettled);
+
+ }
+
+ public SendingLinkEndpoint createSendingLinkEndpoint(final String name, final Source source, final org.apache.qpid.amqp_1_0.type.Target target)
+ {
+ return createSendingLinkEndpoint(name, source, target, null);
+ }
+
+ public SendingLinkEndpoint createSendingLinkEndpoint(final String name, final Source source, final org.apache.qpid.amqp_1_0.type.Target target, Map<Binary, Outcome> unsettled)
+ {
+ SendingLinkEndpoint endpoint = new SendingLinkEndpoint(this, name, unsettled);
+ endpoint.setSource(source);
+ endpoint.setTarget(target);
+ UnsignedInteger handle = findNextAvailableHandle();
+ _localLinkEndpoints.put(endpoint, handle);
+ endpoint.setLocalHandle(handle);
+ getLinkMap().put(name, endpoint);
+
+ return endpoint;
+ }
+
+ public void sendAttach(Attach attach)
+ {
+ send(attach);
+ }
+
+ public void sendTransfer(final Transfer xfr, SendingLinkEndpoint endpoint, boolean newDelivery)
+ {
+ _nextOutgoingTransferId.incr();
+ UnsignedInteger deliveryId;
+ if(newDelivery)
+ {
+ deliveryId = UnsignedInteger.valueOf(_nextOutgoingDeliveryId++);
+ endpoint.setLastDeliveryId(deliveryId);
+ }
+ else
+ {
+ deliveryId = endpoint.getLastDeliveryId();
+ }
+ xfr.setDeliveryId(deliveryId);
+
+ if(!Boolean.TRUE.equals(xfr.getSettled()))
+ {
+ Delivery delivery;
+ if((delivery = _outgoingUnsettled.get(deliveryId))== null)
+ {
+ delivery = new Delivery(xfr, endpoint);
+ _outgoingUnsettled.put(deliveryId, delivery);
+
+ }
+ else
+ {
+ delivery.addTransfer(xfr);
+ }
+ _outgoingSessionCredit = _outgoingSessionCredit.subtract(UnsignedInteger.ONE);
+ endpoint.addUnsettled(delivery);
+
+ }
+
+ try
+ {
+ ByteBuffer payload = xfr.getPayload();
+ int payloadSent = send(xfr, payload);
+
+ if(payload != null && payloadSent < payload.remaining())
+ {
+ payload = payload.duplicate();
+try
+{
+ payload.position(payload.position()+payloadSent);
+}
+catch(IllegalArgumentException e)
+{
+ System.err.println("UNEXPECTED");
+ System.err.println("Payload Position: " + payload.position());
+ System.err.println("Payload Sent: " + payloadSent);
+ System.err.println("Payload Remaining: " + payload.remaining());
+ throw e;
+
+}
+
+ Transfer secondTransfer = new Transfer();
+
+ secondTransfer.setDeliveryTag(xfr.getDeliveryTag());
+ secondTransfer.setHandle(xfr.getHandle());
+ secondTransfer.setSettled(xfr.getSettled());
+ secondTransfer.setState(xfr.getState());
+ secondTransfer.setMessageFormat(xfr.getMessageFormat());
+ secondTransfer.setPayload(payload);
+
+ sendTransfer(secondTransfer, endpoint, false);
+
+ }
+ }
+ catch(OversizeFrameException e)
+ {
+ e.printStackTrace();
+ }
+
+ }
+
+ public Object getLock()
+ {
+ return _connection.getLock();
+ }
+
+ public ReceivingLinkEndpoint createReceivingLinkEndpoint(final String name,
+ String targetAddr,
+ String sourceAddr,
+ UnsignedInteger initialCredit,
+ final DistributionMode distributionMode)
+ {
+ Source source = new Source();
+ source.setAddress(sourceAddr);
+ source.setDistributionMode(distributionMode);
+ Target target = new Target();
+ target.setAddress(targetAddr);
+
+ return createReceivingLinkEndpoint(name, target, source, initialCredit);
+ }
+
+ public ReceivingLinkEndpoint createReceivingLinkEndpoint(final String name,
+ Target target,
+ Source source,
+ UnsignedInteger initialCredit)
+ {
+ ReceivingLinkEndpoint endpoint = new ReceivingLinkEndpoint(this, name);
+ endpoint.setLinkCredit(initialCredit);
+ endpoint.setSource(source);
+ endpoint.setTarget(target);
+ UnsignedInteger handle = findNextAvailableHandle();
+ _localLinkEndpoints.put(endpoint, handle);
+ endpoint.setLocalHandle(handle);
+ getLinkMap().put(name, endpoint);
+
+ return endpoint;
+
+ }
+
+ public void updateDisposition(final Role role,
+ final UnsignedInteger first,
+ final UnsignedInteger last,
+ final DeliveryState state,
+ final boolean settled)
+ {
+
+
+ Disposition disposition = new Disposition();
+ disposition.setRole(role);
+ disposition.setFirst(first);
+ disposition.setLast(last);
+ disposition.setSettled(settled);
+
+ disposition.setState(state);
+
+
+ if(settled)
+ {
+ if(role == Role.RECEIVER)
+ {
+ SequenceNumber pos = new SequenceNumber(first.intValue());
+ SequenceNumber end = new SequenceNumber(last.intValue());
+ while(pos.compareTo(end)<=0)
+ {
+ Delivery d = _incomingUnsettled.remove(new UnsignedInteger(pos.intValue()));
+
+/*
+ _availableIncomingCredit += d.getTransfers().size();
+*/
+
+ pos.incr();
+ }
+ }
+ }
+
+ send(disposition);
+ checkSendFlow();
+ }
+
+ public void settle(Role role, final UnsignedInteger deliveryId)
+ {
+ if(role == Role.RECEIVER)
+ {
+ Delivery d = _incomingUnsettled.remove(deliveryId);
+ if(d != null)
+ {
+/*
+ _availableIncomingCredit += d.getTransfers().size();
+*/
+ }
+ }
+ else
+ {
+ Delivery d = _outgoingUnsettled.remove(deliveryId);
+/* if(d != null)
+ {
+ _availableOutgoingCredit += d.getTransfers().size();
+
+ }*/
+ }
+
+ }
+
+ public void sendFlow()
+ {
+ sendFlow(new Flow());
+ }
+ public void sendFlow(final Flow flow)
+ {
+ final int nextIncomingId = _nextIncomingTransferId.intValue();
+ flow.setNextIncomingId(UnsignedInteger.valueOf(nextIncomingId));
+ flow.setIncomingWindow(UnsignedInteger.valueOf(_availableIncomingCredit));
+ _lastSentIncomingLimit = UnsignedInteger.valueOf(nextIncomingId + _availableIncomingCredit);
+
+ flow.setNextOutgoingId(UnsignedInteger.valueOf(_nextOutgoingTransferId.intValue()));
+ flow.setOutgoingWindow(UnsignedInteger.valueOf(_availableOutgoingCredit));
+ send(flow);
+ }
+
+ public void sendFlowConditional()
+ {
+ UnsignedInteger clientsCredit = _lastSentIncomingLimit.subtract(UnsignedInteger.valueOf(_nextIncomingTransferId.intValue()));
+ int i = UnsignedInteger.valueOf(_availableIncomingCredit).subtract(clientsCredit).compareTo(clientsCredit);
+ if(i >=0)
+ {
+ sendFlow();
+ }
+
+ }
+
+ public void sendDetach(Detach detach)
+ {
+ send(detach);
+
+ }
+
+ void doEnd(End end)
+ {
+ }
+
+ public void setNextIncomingId(final UnsignedInteger nextIncomingId)
+ {
+ _nextIncomingTransferId = new SequenceNumber(nextIncomingId.intValue());
+
+ }
+
+ public void setOutgoingSessionCredit(final UnsignedInteger outgoingSessionCredit)
+ {
+ _outgoingSessionCredit = outgoingSessionCredit;
+ }
+
+ public UnsignedInteger getNextOutgoingId()
+ {
+ return UnsignedInteger.valueOf(_nextOutgoingTransferId.intValue());
+ }
+
+ public UnsignedInteger getOutgoingWindowSize()
+ {
+ return UnsignedInteger.valueOf(_availableOutgoingCredit);
+ }
+
+ public boolean hasCreditToSend()
+ {
+ boolean b = _outgoingSessionCredit != null && _outgoingSessionCredit.intValue() > 0;
+ boolean b1 = getOutgoingWindowSize() != null && getOutgoingWindowSize().compareTo(UnsignedInteger.ZERO) > 0;
+ return b && b1;
+ }
+
+ public UnsignedInteger getIncomingWindowSize()
+ {
+ return UnsignedInteger.valueOf(_availableIncomingCredit);
+ }
+
+ public SessionEventListener getSessionEventListener()
+ {
+ return _sessionEventListener;
+ }
+
+ public void setSessionEventListener(final SessionEventListener sessionEventListener)
+ {
+ _sessionEventListener = sessionEventListener;
+ }
+
+ public ConnectionEndpoint getConnection()
+ {
+ return _connection;
+ }
+
+ public SendingLinkEndpoint createTransactionController(String name, TxnCapability... capabilities)
+ {
+ Coordinator coordinator = new Coordinator();
+ coordinator.setCapabilities(capabilities);
+
+ Source src = new Source();
+
+ return createSendingLinkEndpoint(name, src, coordinator);
+ }
+
+ Map<String, LinkEndpoint> getLinkMap()
+ {
+ return _linkMap;
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEventListener.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEventListener.java
new file mode 100644
index 0000000000..81d51b5908
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEventListener.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.transport.End;
+
+public interface SessionEventListener
+{
+ class DefaultSessionEventListener implements SessionEventListener
+ {
+ public void remoteLinkCreation(final LinkEndpoint endpoint)
+ {
+ endpoint.attach();
+ endpoint.detach();
+ }
+
+ public void remoteEnd(End end)
+ {
+
+ }
+
+ }
+
+ public static final SessionEventListener DEFAULT = new DefaultSessionEventListener();
+
+ void remoteLinkCreation(LinkEndpoint endpoint);
+
+ void remoteEnd(End end);
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionHalfEndpoint.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionHalfEndpoint.java
new file mode 100644
index 0000000000..fce1ce021f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionHalfEndpoint.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public class SessionHalfEndpoint
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionState.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionState.java
new file mode 100644
index 0000000000..b09e27d980
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionState.java
@@ -0,0 +1,34 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public enum SessionState
+{
+ ACTIVE,
+ INACTIVE,
+ BEGIN_SENT,
+ BEGIN_RECVD,
+ END_SENT,
+ END_RECVD,
+ ENDED;
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/StateChangeListener.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/StateChangeListener.java
new file mode 100644
index 0000000000..a02e110d8b
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/StateChangeListener.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public interface StateChangeListener
+{
+ void onStateChange(boolean active);
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/UnsettledTransfer.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/UnsettledTransfer.java
new file mode 100644
index 0000000000..7a39fd9a54
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/UnsettledTransfer.java
@@ -0,0 +1,53 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+public class UnsettledTransfer
+{
+ private final Transfer _transfer;
+ private final LinkEndpoint _linkEndpoint;
+
+ public UnsettledTransfer(final Transfer transfer, final LinkEndpoint linkEndpoint)
+ {
+ _transfer = transfer;
+ _linkEndpoint = linkEndpoint;
+ }
+
+ public Transfer getTransfer()
+ {
+ return _transfer;
+ }
+
+ public LinkEndpoint getLinkEndpoint()
+ {
+ return _linkEndpoint;
+ }
+
+ @Override public String toString()
+ {
+ return "UnsettledTransfer{" +
+ "_transfer=" + _transfer +
+ ", _linkEndpoint=" + _linkEndpoint +
+ '}';
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/AmqpErrorException.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/AmqpErrorException.java
new file mode 100644
index 0000000000..74ae7de470
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/AmqpErrorException.java
@@ -0,0 +1,54 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.type;
+
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.util.Formatter;
+
+public class AmqpErrorException extends Exception
+{
+ private final Error _error;
+
+
+ public AmqpErrorException(final Error error)
+ {
+ _error = error;
+ }
+
+ public AmqpErrorException(ErrorCondition condition)
+ {
+ _error = new Error();
+ _error.setCondition(condition);
+ }
+
+ public AmqpErrorException(ErrorCondition condition, String format, Object... args)
+ {
+ _error = new Error();
+ _error.setCondition(condition);
+ _error.setDescription((new Formatter()).format(format, args).toString());
+ }
+
+ public Error getError()
+ {
+ return _error;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Binary.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Binary.java
new file mode 100644
index 0000000000..0c8dc3444a
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Binary.java
@@ -0,0 +1,161 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.type;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+
+import static java.lang.Math.min;
+
+public class Binary
+{
+
+ private final byte[] _data;
+ private final int _offset;
+ private final int _length;
+ private final int _hashCode;
+
+ public Binary(final byte[] data)
+ {
+ this(data, 0, data.length);
+ }
+
+ public Binary(final byte[] data, final int offset, final int length)
+ {
+
+ _data = data;
+ _offset = offset;
+ _length = length;
+ int hc = 0;
+ for (int i = 0; i < length; i++)
+ {
+ hc = 31*hc + (0xFF & data[offset + i]);
+ }
+ _hashCode = hc;
+ }
+
+ public ByteBuffer asByteBuffer()
+ {
+ return ByteBuffer.wrap(_data, _offset, _length);
+ }
+
+ public final int hashCode()
+ {
+ return _hashCode;
+ }
+
+ public final boolean equals(Object o)
+ {
+ Binary buf = (Binary) o;
+ if(o == null)
+ {
+ return false;
+ }
+ final int size = _length;
+ if (size != buf._length)
+ {
+ return false;
+ }
+
+ final byte[] myData = _data;
+ final byte[] theirData = buf._data;
+ int myOffset = _offset;
+ int theirOffset = buf._offset;
+ final int myLimit = myOffset + size;
+
+ while(myOffset < myLimit)
+ {
+ if (myData[myOffset++] != theirData[theirOffset++])
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+
+ public int getArrayOffset()
+ {
+ return _offset;
+ }
+
+ public byte[] getArray()
+ {
+ return _data;
+ }
+
+ public int getLength()
+ {
+ return _length;
+ }
+
+ public String toString()
+ {
+ StringBuilder str = new StringBuilder();
+
+
+ for (int i = _offset; i < _length; i++)
+ {
+ byte c = _data[i];
+
+ if (c > 31 && c < 127 && c != '\\')
+ {
+ str.append((char)c);
+ }
+ else
+ {
+ str.append(String.format("\\x%02x", c));
+ }
+ }
+
+ return str.toString();
+
+ }
+
+ public static Binary combine(final Collection<Binary> binaries)
+ {
+
+ if(binaries.size() == 1)
+ {
+ return binaries.iterator().next();
+ }
+
+ int size = 0;
+ for(Binary binary : binaries)
+ {
+ size += binary.getLength();
+ }
+ byte[] data = new byte[size];
+ int offset = 0;
+ for(Binary binary : binaries)
+ {
+ System.arraycopy(binary._data, binary._offset, data, offset, binary._length);
+ offset += binary._length;
+ }
+ return new Binary(data);
+ }
+
+ public Binary subBinary(final int offset, final int length)
+ {
+ return new Binary(_data, _offset+offset, length);
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DeliveryState.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DeliveryState.java
new file mode 100644
index 0000000000..a16cc46729
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DeliveryState.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface DeliveryState
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DistributionMode.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DistributionMode.java
new file mode 100644
index 0000000000..751bdd1406
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DistributionMode.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface DistributionMode
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/ErrorCondition.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/ErrorCondition.java
new file mode 100644
index 0000000000..a9f8115784
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/ErrorCondition.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.type;
+
+public interface ErrorCondition
+{
+ public Symbol getValue();
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/FrameBody.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/FrameBody.java
new file mode 100644
index 0000000000..0312378019
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/FrameBody.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+public interface FrameBody
+{
+ public void invoke(short channel, ConnectionEndpoint conn);
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/GlobalTxId.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/GlobalTxId.java
new file mode 100644
index 0000000000..f17a8648c6
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/GlobalTxId.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public class GlobalTxId
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/LifetimePolicy.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/LifetimePolicy.java
new file mode 100644
index 0000000000..af13cdaffe
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/LifetimePolicy.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface LifetimePolicy
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Outcome.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Outcome.java
new file mode 100644
index 0000000000..0741ebdf70
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Outcome.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface Outcome
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/RestrictedType.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/RestrictedType.java
new file mode 100644
index 0000000000..9bcfc752a1
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/RestrictedType.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.type;
+
+public interface RestrictedType<V>
+{
+ V getValue();
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/SaslFrameBody.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/SaslFrameBody.java
new file mode 100644
index 0000000000..cb4332f020
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/SaslFrameBody.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+import org.apache.qpid.amqp_1_0.transport.SASLEndpoint;
+
+public interface SaslFrameBody
+{
+ public void invoke(SASLEndpoint conn);
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Section.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Section.java
new file mode 100644
index 0000000000..1e2872b66a
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Section.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.type;
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+public interface Section
+{
+
+ Binary encode(SectionEncoder encoder);
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Source.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Source.java
new file mode 100644
index 0000000000..c033ed4d55
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Source.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface Source
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Symbol.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Symbol.java
new file mode 100644
index 0000000000..6efcdcf952
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Symbol.java
@@ -0,0 +1,90 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public final class Symbol implements Comparable<Symbol>, CharSequence
+{
+ private final String _underlying;
+ private static final ConcurrentHashMap<String, Symbol> _symbols = new ConcurrentHashMap<String, Symbol>(2048);
+
+ private Symbol(String underlying)
+ {
+ _underlying = underlying;
+ }
+
+ public int length()
+ {
+ return _underlying.length();
+ }
+
+ public int compareTo(Symbol o)
+ {
+ return _underlying.compareTo(o._underlying);
+ }
+
+ public char charAt(int index)
+ {
+ return _underlying.charAt(index);
+ }
+
+ public CharSequence subSequence(int beginIndex, int endIndex)
+ {
+ return _underlying.subSequence(beginIndex, endIndex);
+ }
+
+ @Override
+ public String toString()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _underlying.hashCode();
+ }
+
+ public static Symbol valueOf(String symbolVal)
+ {
+ return getSymbol(symbolVal);
+ }
+
+ public static Symbol getSymbol(String symbolVal)
+ {
+ Symbol symbol = _symbols.get(symbolVal);
+ if(symbol == null)
+ {
+ symbolVal = symbolVal.intern();
+ symbol = new Symbol(symbolVal);
+ Symbol existing;
+ if((existing = _symbols.putIfAbsent(symbolVal, symbol)) != null)
+ {
+ symbol = existing;
+ }
+ }
+ return symbol;
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Target.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Target.java
new file mode 100644
index 0000000000..345f6c418f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Target.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface Target
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnCapability.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnCapability.java
new file mode 100644
index 0000000000..3d7d2137a6
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnCapability.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface TxnCapability
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnId.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnId.java
new file mode 100644
index 0000000000..eef6b3a32f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnId.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.type;
+
+public interface TxnId
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedByte.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedByte.java
new file mode 100644
index 0000000000..07739e068e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedByte.java
@@ -0,0 +1,134 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+public final class UnsignedByte extends Number implements Comparable<UnsignedByte>
+{
+ private final byte _underlying;
+ private static final UnsignedByte[] cachedValues = new UnsignedByte[256];
+
+ static
+ {
+ for(int i = 0; i<256; i++)
+ {
+ cachedValues[i] = new UnsignedByte((byte)i);
+ }
+ }
+
+ public UnsignedByte(byte underlying)
+ {
+ _underlying = underlying;
+ }
+
+ @Override
+ public byte byteValue()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public short shortValue()
+ {
+ return (short) intValue();
+ }
+
+ @Override
+ public int intValue()
+ {
+ return ((int)_underlying) & 0xFF;
+ }
+
+ @Override
+ public long longValue()
+ {
+ return ((long) _underlying) & 0xFFl;
+ }
+
+ @Override
+ public float floatValue()
+ {
+ return (float) longValue();
+ }
+
+ @Override
+ public double doubleValue()
+ {
+ return (double) longValue();
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ UnsignedByte that = (UnsignedByte) o;
+
+ if (_underlying != that._underlying)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int compareTo(UnsignedByte o)
+ {
+ return Integer.signum(intValue() - o.intValue());
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.valueOf(intValue());
+ }
+
+ public static UnsignedByte valueOf(byte underlying)
+ {
+ final int index = ((int) underlying) & 0xFF;
+ return cachedValues[index];
+ }
+
+ public static UnsignedByte valueOf(final String value)
+ throws NumberFormatException
+ {
+ int intVal = Integer.parseInt(value);
+ if(intVal < 0 || intVal >= (1<<8))
+ {
+ throw new NumberFormatException("Value \""+value+"\" lies outside the range [" + 0 + "-" + (1<<8) +").");
+ }
+ return valueOf((byte)intVal);
+ }
+
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedInteger.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedInteger.java
new file mode 100644
index 0000000000..f9a8f96868
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedInteger.java
@@ -0,0 +1,149 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+public final class UnsignedInteger extends Number implements Comparable<UnsignedInteger>
+{
+ private final int _underlying;
+ private static final UnsignedInteger[] cachedValues = new UnsignedInteger[256];
+
+ static
+ {
+ for(int i = 0; i < 256; i++)
+ {
+ cachedValues[i] = new UnsignedInteger(i);
+ }
+ }
+
+ public static final UnsignedInteger ZERO = cachedValues[0];
+ public static final UnsignedInteger ONE = cachedValues[1];
+ public static final UnsignedInteger MAX_VALUE = new UnsignedInteger(0xffffffff);
+
+
+ public UnsignedInteger(int underlying)
+ {
+ _underlying = underlying;
+ }
+
+ @Override
+ public int intValue()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public long longValue()
+ {
+ return ((long) _underlying) & 0xFFFFFFFFl;
+ }
+
+ @Override
+ public float floatValue()
+ {
+ return (float) longValue();
+ }
+
+ @Override
+ public double doubleValue()
+ {
+ return (double) longValue();
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ UnsignedInteger that = (UnsignedInteger) o;
+
+ if (_underlying != that._underlying)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int compareTo(UnsignedInteger o)
+ {
+ return Long.signum(longValue() - o.longValue());
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.valueOf(longValue());
+ }
+
+ public static UnsignedInteger valueOf(int underlying)
+ {
+ if((underlying & 0xFFFFFF00) == 0)
+ {
+ return cachedValues[underlying];
+ }
+ else
+ {
+ return new UnsignedInteger(underlying);
+ }
+ }
+
+ public UnsignedInteger add(final UnsignedInteger i)
+ {
+ int val = _underlying + i._underlying;
+ return UnsignedInteger.valueOf(val);
+ }
+
+ public UnsignedInteger subtract(final UnsignedInteger i)
+ {
+ int val = _underlying - i._underlying;
+ return UnsignedInteger.valueOf(val);
+ }
+
+ public static UnsignedInteger valueOf(final String value)
+ {
+ long longVal = Long.parseLong(value);
+ return valueOf(longVal);
+ }
+
+ public static UnsignedInteger valueOf(final long longVal)
+ {
+ if(longVal < 0L || longVal >= (1L<<32))
+ {
+ throw new NumberFormatException("Value \""+longVal+"\" lies outside the range [" + 0L + "-" + (1L<<32) +").");
+ }
+ return valueOf((int)longVal);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedLong.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedLong.java
new file mode 100644
index 0000000000..0586423fe0
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedLong.java
@@ -0,0 +1,162 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+import java.math.BigInteger;
+
+public final class UnsignedLong extends Number implements Comparable<UnsignedLong>
+{
+ private static final BigInteger TWO_TO_THE_SIXTY_FOUR = new BigInteger( new byte[] { (byte) 1, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0 });
+ private static final BigInteger LONG_MAX_VALUE = BigInteger.valueOf(Long.MAX_VALUE);
+
+ private static final UnsignedLong[] cachedValues = new UnsignedLong[256];
+
+ static
+ {
+ for(int i = 0; i<256; i++)
+ {
+ cachedValues[i] = new UnsignedLong(i);
+ }
+ }
+
+ public static final UnsignedLong ZERO = cachedValues[0];
+ public static final UnsignedLong ONE = cachedValues[1];
+
+ private final long _underlying;
+
+
+
+ public UnsignedLong(long underlying)
+ {
+ _underlying = underlying;
+ }
+
+ @Override
+ public int intValue()
+ {
+ return (int) _underlying;
+ }
+
+ @Override
+ public long longValue()
+ {
+ return _underlying;
+ }
+
+ public BigInteger bigIntegerValue()
+ {
+ if(_underlying >= 0L)
+ {
+ return BigInteger.valueOf(_underlying);
+ }
+ else
+ {
+ return TWO_TO_THE_SIXTY_FOUR.add(BigInteger.valueOf(_underlying));
+ }
+ }
+
+ @Override
+ public float floatValue()
+ {
+ return (float) longValue();
+ }
+
+ @Override
+ public double doubleValue()
+ {
+ return (double) longValue();
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ UnsignedLong that = (UnsignedLong) o;
+
+ if (_underlying != that._underlying)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int compareTo(UnsignedLong o)
+ {
+ return bigIntegerValue().compareTo(o.bigIntegerValue());
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return (int)(_underlying ^ (_underlying >>> 32));
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.valueOf(bigIntegerValue());
+ }
+
+ public static UnsignedLong valueOf(long underlying)
+ {
+ if((underlying & 0xFFL) == underlying)
+ {
+ return cachedValues[(int)underlying];
+ }
+ else
+ {
+ return new UnsignedLong(underlying);
+ }
+ }
+
+ public static UnsignedLong valueOf(final String value)
+ {
+ BigInteger bigInt = new BigInteger(value);
+ if(bigInt.signum() == -1 || bigInt.bitCount()>64)
+ {
+ throw new NumberFormatException("Value \""+value+"\" lies outside the range [" + 0L + "- 2^64).");
+ }
+ else if(bigInt.compareTo(LONG_MAX_VALUE)>=0)
+ {
+ return UnsignedLong.valueOf(bigInt.longValue());
+ }
+ else
+ {
+ return UnsignedLong.valueOf(TWO_TO_THE_SIXTY_FOUR.subtract(bigInt).negate().longValue());
+ }
+
+ }
+
+ public UnsignedLong add(UnsignedLong unsignedLong)
+ {
+ return UnsignedLong.valueOf(_underlying + unsignedLong._underlying);
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedShort.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedShort.java
new file mode 100644
index 0000000000..01c72ac159
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedShort.java
@@ -0,0 +1,132 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+public final class UnsignedShort extends Number implements Comparable<UnsignedShort>
+{
+ private final short _underlying;
+ private static final UnsignedShort[] cachedValues = new UnsignedShort[256];
+
+ static
+ {
+ for(short i = 0; i < 256; i++)
+ {
+ cachedValues[i] = new UnsignedShort(i);
+ }
+ }
+
+ public UnsignedShort(short underlying)
+ {
+ _underlying = underlying;
+ }
+
+ public short shortValue()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public int intValue()
+ {
+ return _underlying & 0xFFFF;
+ }
+
+ @Override
+ public long longValue()
+ {
+ return ((long) _underlying) & 0xFFFFl;
+ }
+
+ @Override
+ public float floatValue()
+ {
+ return (float) intValue();
+ }
+
+ @Override
+ public double doubleValue()
+ {
+ return (double) intValue();
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ UnsignedShort that = (UnsignedShort) o;
+
+ if (_underlying != that._underlying)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int compareTo(UnsignedShort o)
+ {
+ return Integer.signum(intValue() - o.intValue());
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.valueOf(longValue());
+ }
+
+ public static UnsignedShort valueOf(short underlying)
+ {
+ if((underlying & 0xFF00) == 0)
+ {
+ return cachedValues[underlying];
+ }
+ else
+ {
+ return new UnsignedShort(underlying);
+ }
+ }
+
+ public static UnsignedShort valueOf(final String value)
+ {
+ int intVal = Integer.parseInt(value);
+ if(intVal < 0 || intVal >= (1<<16))
+ {
+ throw new NumberFormatException("Value \""+value+"\" lies outside the range [" + 0 + "-" + (1<<16) +").");
+ }
+ return valueOf((short)intVal);
+
+ }
+} \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/WrapperType.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/WrapperType.java
new file mode 100644
index 0000000000..359926d9d4
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/WrapperType.java
@@ -0,0 +1,27 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface WrapperType
+{
+ Object getValue();
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java
new file mode 100644
index 0000000000..5ffa96e094
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java
@@ -0,0 +1,389 @@
+
+
+package org.apache.qpid.amqp_1_0.type.codec;
+
+import org.apache.qpid.amqp_1_0.codec.BinaryWriter;
+import org.apache.qpid.amqp_1_0.codec.BooleanWriter;
+import org.apache.qpid.amqp_1_0.codec.ByteWriter;
+import org.apache.qpid.amqp_1_0.codec.CharWriter;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.codec.DoubleWriter;
+import org.apache.qpid.amqp_1_0.codec.FloatWriter;
+import org.apache.qpid.amqp_1_0.codec.IntegerWriter;
+import org.apache.qpid.amqp_1_0.codec.ListWriter;
+import org.apache.qpid.amqp_1_0.codec.LongWriter;
+import org.apache.qpid.amqp_1_0.codec.MapWriter;
+import org.apache.qpid.amqp_1_0.codec.NullWriter;
+import org.apache.qpid.amqp_1_0.codec.RestrictedTypeValueWriter;
+import org.apache.qpid.amqp_1_0.codec.ShortWriter;
+import org.apache.qpid.amqp_1_0.codec.StringWriter;
+import org.apache.qpid.amqp_1_0.codec.SymbolWriter;
+import org.apache.qpid.amqp_1_0.codec.SymbolArrayWriter;
+import org.apache.qpid.amqp_1_0.codec.TimestampWriter;
+import org.apache.qpid.amqp_1_0.codec.TypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.UUIDWriter;
+import org.apache.qpid.amqp_1_0.codec.UnsignedByteWriter;
+import org.apache.qpid.amqp_1_0.codec.UnsignedIntegerWriter;
+import org.apache.qpid.amqp_1_0.codec.UnsignedLongWriter;
+import org.apache.qpid.amqp_1_0.codec.UnsignedShortWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+
+import org.apache.qpid.amqp_1_0.type.RestrictedType;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.codec.*;
+
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.codec.*;
+
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.codec.*;
+
+import org.apache.qpid.amqp_1_0.type.security.*;
+import org.apache.qpid.amqp_1_0.type.security.codec.*;
+
+import java.lang.reflect.Array;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class AMQPDescribedTypeRegistry implements DescribedTypeConstructorRegistry, ValueWriter.Registry
+{
+
+ private final Map<Object, DescribedTypeConstructor> _constructorRegistry = new HashMap<Object, DescribedTypeConstructor>();
+
+ public void register(Object descriptor, DescribedTypeConstructor constructor)
+ {
+ _constructorRegistry.put(descriptor, constructor);
+ }
+
+ public void register(Object descriptor, DescribedTypeConstructor constructor, TypeConstructor describedConstructor)
+ {
+ _constructorRegistry.put(descriptor, constructor);
+ }
+
+ public DescribedTypeConstructor getConstructor(Object descriptor)
+ {
+ return _constructorRegistry.get(descriptor);
+ }
+
+ private AMQPDescribedTypeRegistry()
+ {
+ }
+
+ public AMQPDescribedTypeRegistry registerTransportLayer()
+ {
+ registerTransportConstructors(this);
+ registerTransportWriters(this);
+ return this;
+ }
+
+ public AMQPDescribedTypeRegistry registerMessagingLayer()
+ {
+ registerMessagingConstructors(this);
+ registerMessagingWriters(this);
+ return this;
+ }
+
+ public AMQPDescribedTypeRegistry registerTransactionLayer()
+ {
+ registerTransactionsConstructors(this);
+ registerTransactionsWriters(this);
+ return this;
+ }
+
+ public AMQPDescribedTypeRegistry registerSecurityLayer()
+ {
+ registerSecurityConstructors(this);
+ registerSecurityWriters(this);
+ return this;
+ }
+
+ public static AMQPDescribedTypeRegistry newInstance()
+ {
+ AMQPDescribedTypeRegistry registry = new AMQPDescribedTypeRegistry();
+
+ NullWriter.register(registry);
+ BooleanWriter.register(registry);
+ ByteWriter.register(registry);
+ UnsignedByteWriter.register(registry);
+ ShortWriter.register(registry);
+ UnsignedShortWriter.register(registry);
+ IntegerWriter.register(registry);
+ UnsignedIntegerWriter.register(registry);
+ CharWriter.register(registry);
+ FloatWriter.register(registry);
+ LongWriter.register(registry);
+ UnsignedLongWriter.register(registry);
+ DoubleWriter.register(registry);
+ TimestampWriter.register(registry);
+ UUIDWriter.register(registry);
+ StringWriter.register(registry);
+ SymbolWriter.register(registry);
+ BinaryWriter.register(registry);
+ ListWriter.register(registry);
+ MapWriter.register(registry);
+
+ SymbolArrayWriter.register(registry);
+
+ return registry;
+ }
+
+
+
+ private static void registerTransportWriters(final AMQPDescribedTypeRegistry registry)
+ {
+
+ OpenWriter.register(registry);
+ BeginWriter.register(registry);
+ AttachWriter.register(registry);
+ FlowWriter.register(registry);
+ TransferWriter.register(registry);
+ DispositionWriter.register(registry);
+ DetachWriter.register(registry);
+ EndWriter.register(registry);
+ CloseWriter.register(registry);
+ RestrictedTypeValueWriter.register(registry,Role.class);
+ RestrictedTypeValueWriter.register(registry,SenderSettleMode.class);
+ RestrictedTypeValueWriter.register(registry,ReceiverSettleMode.class);
+ ErrorWriter.register(registry);
+ RestrictedTypeValueWriter.register(registry,AmqpError.class);
+ RestrictedTypeValueWriter.register(registry,ConnectionError.class);
+ RestrictedTypeValueWriter.register(registry,SessionError.class);
+ RestrictedTypeValueWriter.register(registry,LinkError.class);
+ }
+
+ private static void registerMessagingWriters(final AMQPDescribedTypeRegistry registry)
+ {
+
+ HeaderWriter.register(registry);
+ DeliveryAnnotationsWriter.register(registry);
+ MessageAnnotationsWriter.register(registry);
+ PropertiesWriter.register(registry);
+ ApplicationPropertiesWriter.register(registry);
+ DataWriter.register(registry);
+ AmqpSequenceWriter.register(registry);
+ AmqpValueWriter.register(registry);
+ FooterWriter.register(registry);
+ ReceivedWriter.register(registry);
+ AcceptedWriter.register(registry);
+ RejectedWriter.register(registry);
+ ReleasedWriter.register(registry);
+ ModifiedWriter.register(registry);
+ SourceWriter.register(registry);
+ TargetWriter.register(registry);
+ RestrictedTypeValueWriter.register(registry,TerminusDurability.class);
+ RestrictedTypeValueWriter.register(registry,TerminusExpiryPolicy.class);
+ RestrictedTypeValueWriter.register(registry,StdDistMode.class);
+ DeleteOnCloseWriter.register(registry);
+ DeleteOnNoLinksWriter.register(registry);
+ DeleteOnNoMessagesWriter.register(registry);
+ DeleteOnNoLinksOrMessagesWriter.register(registry);
+
+
+ ExactSubjectFilterWriter.register(registry);
+ MatchingSubjectFilterWriter.register(registry);
+ JMSSelectorFilterWriter.register(registry);
+ NoLocalFilterWriter.register(registry);
+ }
+
+ private static void registerTransactionsWriters(final AMQPDescribedTypeRegistry registry)
+ {
+
+ CoordinatorWriter.register(registry);
+ DeclareWriter.register(registry);
+ DischargeWriter.register(registry);
+ DeclaredWriter.register(registry);
+ TransactionalStateWriter.register(registry);
+ RestrictedTypeValueWriter.register(registry,TxnCapability.class);
+ RestrictedTypeValueWriter.register(registry,TransactionErrors.class);
+ }
+
+ private static void registerSecurityWriters(final AMQPDescribedTypeRegistry registry)
+ {
+
+ SaslMechanismsWriter.register(registry);
+ SaslInitWriter.register(registry);
+ SaslChallengeWriter.register(registry);
+ SaslResponseWriter.register(registry);
+ SaslOutcomeWriter.register(registry);
+ RestrictedTypeValueWriter.register(registry,SaslCode.class);
+ }
+
+ private static void registerTransportConstructors(final AMQPDescribedTypeRegistry registry)
+ {
+
+ OpenConstructor.register(registry);
+ BeginConstructor.register(registry);
+ AttachConstructor.register(registry);
+ FlowConstructor.register(registry);
+ TransferConstructor.register(registry);
+ DispositionConstructor.register(registry);
+ DetachConstructor.register(registry);
+ EndConstructor.register(registry);
+ CloseConstructor.register(registry);
+ ErrorConstructor.register(registry);
+ }
+
+ private static void registerMessagingConstructors(final AMQPDescribedTypeRegistry registry)
+ {
+
+ HeaderConstructor.register(registry);
+ DeliveryAnnotationsConstructor.register(registry);
+ MessageAnnotationsConstructor.register(registry);
+ PropertiesConstructor.register(registry);
+ ApplicationPropertiesConstructor.register(registry);
+ DataConstructor.register(registry);
+ AmqpSequenceConstructor.register(registry);
+ AmqpValueConstructor.register(registry);
+ FooterConstructor.register(registry);
+ ReceivedConstructor.register(registry);
+ AcceptedConstructor.register(registry);
+ RejectedConstructor.register(registry);
+ ReleasedConstructor.register(registry);
+ ModifiedConstructor.register(registry);
+ SourceConstructor.register(registry);
+ TargetConstructor.register(registry);
+ DeleteOnCloseConstructor.register(registry);
+ DeleteOnNoLinksConstructor.register(registry);
+ DeleteOnNoMessagesConstructor.register(registry);
+ DeleteOnNoLinksOrMessagesConstructor.register(registry);
+
+ ExactSubjectFilterConstructor.register(registry);
+ MatchingSubjectFilterConstructor.register(registry);
+ JMSSelectorFilterConstructor.register(registry);
+ NoLocalFilterConstructor.register(registry);
+ }
+
+ private static void registerTransactionsConstructors(final AMQPDescribedTypeRegistry registry)
+ {
+
+ CoordinatorConstructor.register(registry);
+ DeclareConstructor.register(registry);
+ DischargeConstructor.register(registry);
+ DeclaredConstructor.register(registry);
+ TransactionalStateConstructor.register(registry);
+ }
+
+ private static void registerSecurityConstructors(final AMQPDescribedTypeRegistry registry)
+ {
+
+ SaslMechanismsConstructor.register(registry);
+ SaslInitConstructor.register(registry);
+ SaslChallengeConstructor.register(registry);
+ SaslResponseConstructor.register(registry);
+ SaslOutcomeConstructor.register(registry);
+ }
+
+
+ private final Map<Class, ValueWriter.Factory> _writerMap = new HashMap<Class, ValueWriter.Factory>();
+ private final Map<Class, ValueWriter> _cachedWriters = new HashMap<Class,ValueWriter>();
+
+ public <V extends Object> ValueWriter<V> getValueWriter(V value, Map<Class, ValueWriter> localCache)
+ {
+ Class<? extends Object> clazz = value == null ? Void.TYPE : value.getClass();
+ ValueWriter writer = null; // TODO localCache.get(clazz);
+ if(writer == null || !writer.isComplete())
+ {
+ writer = getValueWriter(value);
+ localCache.put(clazz, writer);
+ }
+ else
+ {
+ writer.setValue(value);
+ }
+
+
+ return writer;
+ }
+
+
+ public <V extends Object> ValueWriter<V> getValueWriter(V value)
+ {
+
+ Class<? extends Object> clazz = value == null ? Void.TYPE : value.getClass();
+
+ ValueWriter writer = null; // TODO _cachedWriters.get(clazz);
+ if(writer == null || !writer.isComplete())
+ {
+ ValueWriter.Factory<V> factory = (ValueWriter.Factory<V>) (_writerMap.get(clazz));
+
+ if(factory == null)
+ {
+ if(value instanceof List)
+ {
+ factory = _writerMap.get(List.class);
+ _writerMap.put(value.getClass(), factory);
+ writer = factory.newInstance(this);
+ if(writer.isCacheable())
+ {
+ _cachedWriters.put(clazz, writer);
+ }
+ writer.setValue(value);
+
+ }
+ else if(value instanceof Map)
+ {
+ factory = _writerMap.get(Map.class);
+ _writerMap.put(value.getClass(), factory);
+ writer = factory.newInstance(this);
+ if(writer.isCacheable())
+ {
+ _cachedWriters.put(clazz, writer);
+ }
+ writer.setValue(value);
+
+ }
+ else if(value.getClass().isArray())
+ {
+ if(RestrictedType.class.isAssignableFrom(value.getClass().getComponentType()))
+ {
+ RestrictedType[] restrictedTypes = (RestrictedType[]) value;
+ Object[] newVals = (Object[]) Array.newInstance(restrictedTypes[0].getValue().getClass(),
+ restrictedTypes.length);
+ for(int i = 0; i < restrictedTypes.length; i++)
+ {
+ newVals[i] = restrictedTypes[i].getValue();
+ }
+ return (ValueWriter<V>) getValueWriter(newVals);
+ }
+ // TODO primitive array types
+ factory = _writerMap.get(List.class);
+ writer = factory.newInstance(this);
+ writer.setValue(Arrays.asList((Object[])value));
+
+ }
+ else
+ {
+ return null;
+ }
+ }
+ else
+ {
+ writer = factory.newInstance(this);
+ if(writer.isCacheable())
+ {
+ _cachedWriters.put(clazz, writer);
+ }
+ writer.setValue(value);
+ }
+ }
+ else
+ {
+ writer.setValue(value);
+ }
+
+ return writer;
+
+ }
+
+ public <V extends Object> ValueWriter<V> register(Class<V> clazz, ValueWriter.Factory<V> writer)
+ {
+ return (ValueWriter<V>) _writerMap.put(clazz, writer);
+ }
+
+}
+
+ \ No newline at end of file
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Accepted.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Accepted.java
new file mode 100644
index 0000000000..aede9df82e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Accepted.java
@@ -0,0 +1,46 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Accepted
+ implements org.apache.qpid.amqp_1_0.type.DeliveryState, Outcome
+ {
+
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Accepted{");
+ final int origLength = builder.length();
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpSequence.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpSequence.java
new file mode 100644
index 0000000000..72531f3acc
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpSequence.java
@@ -0,0 +1,70 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import java.util.List;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class AmqpSequence
+ implements Section
+ {
+
+
+
+ private final List _value;
+
+ public AmqpSequence(List value)
+ {
+ _value = value;
+ }
+
+ public List getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+ @Override
+ public String toString()
+ {
+ return "AmqpSequence{" +
+ _value +
+ '}';
+ }
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpValue.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpValue.java
new file mode 100644
index 0000000000..22723decca
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpValue.java
@@ -0,0 +1,66 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class AmqpValue
+ implements Section
+ {
+
+
+
+ private final Object _value;
+
+ public AmqpValue(Object value)
+ {
+ _value = value;
+ }
+
+ public Object getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ @Override
+ public String toString()
+ {
+ return "AmqpValue{(" + _value.getClass().getName() + ')' + _value + '}';
+ }
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ApplicationProperties.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ApplicationProperties.java
new file mode 100644
index 0000000000..fb9200ecb6
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ApplicationProperties.java
@@ -0,0 +1,64 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class ApplicationProperties
+ implements Section
+ {
+
+
+
+ private final Map _value;
+
+ public ApplicationProperties(Map value)
+ {
+ _value = value;
+ }
+
+ public Map getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Data.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Data.java
new file mode 100644
index 0000000000..f4b8b78264
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Data.java
@@ -0,0 +1,68 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Data
+ implements Section
+ {
+
+
+
+ private final Binary _value;
+
+ public Data(Binary value)
+ {
+ _value = value;
+ }
+
+ public Binary getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ @Override
+ public String toString()
+ {
+ return "Data{" +
+ _value +
+ '}';
+ }
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnClose.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnClose.java
new file mode 100644
index 0000000000..aab5cf8a27
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnClose.java
@@ -0,0 +1,46 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class DeleteOnClose
+ implements LifetimePolicy
+ {
+
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("DeleteOnClose{");
+ final int origLength = builder.length();
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinks.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinks.java
new file mode 100644
index 0000000000..ab0043ea5b
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinks.java
@@ -0,0 +1,46 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class DeleteOnNoLinks
+ implements LifetimePolicy
+ {
+
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("DeleteOnNoLinks{");
+ final int origLength = builder.length();
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinksOrMessages.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinksOrMessages.java
new file mode 100644
index 0000000000..591597c655
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinksOrMessages.java
@@ -0,0 +1,46 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class DeleteOnNoLinksOrMessages
+ implements LifetimePolicy
+ {
+
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("DeleteOnNoLinksOrMessages{");
+ final int origLength = builder.length();
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoMessages.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoMessages.java
new file mode 100644
index 0000000000..9e44061928
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoMessages.java
@@ -0,0 +1,46 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class DeleteOnNoMessages
+ implements LifetimePolicy
+ {
+
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("DeleteOnNoMessages{");
+ final int origLength = builder.length();
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeliveryAnnotations.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeliveryAnnotations.java
new file mode 100644
index 0000000000..bde1da090e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeliveryAnnotations.java
@@ -0,0 +1,64 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class DeliveryAnnotations
+ implements Section
+ {
+
+
+
+ private final Map _value;
+
+ public DeliveryAnnotations(Map value)
+ {
+ _value = value;
+ }
+
+ public Map getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ExactSubjectFilter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ExactSubjectFilter.java
new file mode 100644
index 0000000000..3d01a26485
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ExactSubjectFilter.java
@@ -0,0 +1,82 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+
+public class ExactSubjectFilter implements Filter
+{
+
+
+
+ private final String _value;
+
+ public ExactSubjectFilter(String value)
+ {
+ _value = value;
+ }
+
+ public String getValue()
+ {
+ return _value;
+ }
+
+
+ @Override
+ public String toString()
+ {
+ return "ExactSubjectFilter{" + _value + '}';
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if(this == o)
+ {
+ return true;
+ }
+ if(o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ ExactSubjectFilter that = (ExactSubjectFilter) o;
+
+ if(_value != null ? !_value.equals(that._value) : that._value != null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _value != null ? _value.hashCode() : 0;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Filter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Filter.java
new file mode 100644
index 0000000000..46f391bf4d
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Filter.java
@@ -0,0 +1,28 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+public interface Filter
+{
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Footer.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Footer.java
new file mode 100644
index 0000000000..25cf04763e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Footer.java
@@ -0,0 +1,70 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Footer
+ implements Section
+ {
+
+
+
+ private final Map _value;
+
+ public Footer(Map value)
+ {
+ _value = value;
+ }
+
+ public Map getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ @Override
+ public String toString()
+ {
+ return "Footer{" + _value +
+ '}';
+ }
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Header.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Header.java
new file mode 100644
index 0000000000..02b4810196
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Header.java
@@ -0,0 +1,161 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Header
+ implements Section
+ {
+
+
+ private Boolean _durable;
+
+ private UnsignedByte _priority;
+
+ private UnsignedInteger _ttl;
+
+ private Boolean _firstAcquirer;
+
+ private UnsignedInteger _deliveryCount;
+
+ public Boolean getDurable()
+ {
+ return _durable;
+ }
+
+ public void setDurable(Boolean durable)
+ {
+ _durable = durable;
+ }
+
+ public UnsignedByte getPriority()
+ {
+ return _priority;
+ }
+
+ public void setPriority(UnsignedByte priority)
+ {
+ _priority = priority;
+ }
+
+ public UnsignedInteger getTtl()
+ {
+ return _ttl;
+ }
+
+ public void setTtl(UnsignedInteger ttl)
+ {
+ _ttl = ttl;
+ }
+
+ public Boolean getFirstAcquirer()
+ {
+ return _firstAcquirer;
+ }
+
+ public void setFirstAcquirer(Boolean firstAcquirer)
+ {
+ _firstAcquirer = firstAcquirer;
+ }
+
+ public UnsignedInteger getDeliveryCount()
+ {
+ return _deliveryCount;
+ }
+
+ public void setDeliveryCount(UnsignedInteger deliveryCount)
+ {
+ _deliveryCount = deliveryCount;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Header{");
+ final int origLength = builder.length();
+
+ if(_durable != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("durable=").append(_durable);
+ }
+
+ if(_priority != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("priority=").append(_priority);
+ }
+
+ if(_ttl != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("ttl=").append(_ttl);
+ }
+
+ if(_firstAcquirer != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("firstAcquirer=").append(_firstAcquirer);
+ }
+
+ if(_deliveryCount != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("deliveryCount=").append(_deliveryCount);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/JMSSelectorFilter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/JMSSelectorFilter.java
new file mode 100644
index 0000000000..a6317c42bf
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/JMSSelectorFilter.java
@@ -0,0 +1,77 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+public class JMSSelectorFilter implements Filter
+{
+
+
+
+ private final String _value;
+
+ public JMSSelectorFilter(String value)
+ {
+ _value = value;
+ }
+
+ public String getValue()
+ {
+ return _value;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "JMSSelector{" + _value + '}';
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if(this == o)
+ {
+ return true;
+ }
+ if(o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ JMSSelectorFilter that = (JMSSelectorFilter) o;
+
+ if(_value != null ? !_value.equals(that._value) : that._value != null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _value != null ? _value.hashCode() : 0;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MatchingSubjectFilter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MatchingSubjectFilter.java
new file mode 100644
index 0000000000..9504a658a9
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MatchingSubjectFilter.java
@@ -0,0 +1,81 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+
+public class MatchingSubjectFilter implements Filter
+{
+
+
+
+ private final String _value;
+
+ public MatchingSubjectFilter(String value)
+ {
+ _value = value;
+ }
+
+ public String getValue()
+ {
+ return _value;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "MatchingSubjectFilter{" + _value + '}';
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if(this == o)
+ {
+ return true;
+ }
+ if(o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ MatchingSubjectFilter that = (MatchingSubjectFilter) o;
+
+ if(_value != null ? !_value.equals(that._value) : that._value != null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _value != null ? _value.hashCode() : 0;
+ }
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MessageAnnotations.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MessageAnnotations.java
new file mode 100644
index 0000000000..265beb7213
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MessageAnnotations.java
@@ -0,0 +1,64 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class MessageAnnotations
+ implements Section
+ {
+
+
+
+ private final Map _value;
+
+ public MessageAnnotations(Map value)
+ {
+ _value = value;
+ }
+
+ public Map getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Modified.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Modified.java
new file mode 100644
index 0000000000..d466cbf2b1
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Modified.java
@@ -0,0 +1,112 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Modified
+ implements org.apache.qpid.amqp_1_0.type.DeliveryState, Outcome
+ {
+
+
+ private Boolean _deliveryFailed;
+
+ private Boolean _undeliverableHere;
+
+ private Map _messageAnnotations;
+
+ public Boolean getDeliveryFailed()
+ {
+ return _deliveryFailed;
+ }
+
+ public void setDeliveryFailed(Boolean deliveryFailed)
+ {
+ _deliveryFailed = deliveryFailed;
+ }
+
+ public Boolean getUndeliverableHere()
+ {
+ return _undeliverableHere;
+ }
+
+ public void setUndeliverableHere(Boolean undeliverableHere)
+ {
+ _undeliverableHere = undeliverableHere;
+ }
+
+ public Map getMessageAnnotations()
+ {
+ return _messageAnnotations;
+ }
+
+ public void setMessageAnnotations(Map messageAnnotations)
+ {
+ _messageAnnotations = messageAnnotations;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Modified{");
+ final int origLength = builder.length();
+
+ if(_deliveryFailed != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("deliveryFailed=").append(_deliveryFailed);
+ }
+
+ if(_undeliverableHere != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("undeliverableHere=").append(_undeliverableHere);
+ }
+
+ if(_messageAnnotations != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("messageAnnotations=").append(_messageAnnotations);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/NoLocalFilter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/NoLocalFilter.java
new file mode 100644
index 0000000000..73f175e6fa
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/NoLocalFilter.java
@@ -0,0 +1,45 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+public final class NoLocalFilter implements Filter
+{
+
+
+ public static final NoLocalFilter INSTANCE = new NoLocalFilter();
+
+ private NoLocalFilter()
+ {
+ }
+
+
+ @Override
+ public String toString()
+ {
+ return "NoLocalFilter{}";
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Properties.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Properties.java
new file mode 100644
index 0000000000..bcab361a8e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Properties.java
@@ -0,0 +1,333 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import java.util.Date;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Properties
+ implements Section
+ {
+
+
+ private Object _messageId;
+
+ private Binary _userId;
+
+ private String _to;
+
+ private String _subject;
+
+ private String _replyTo;
+
+ private Object _correlationId;
+
+ private Symbol _contentType;
+
+ private Symbol _contentEncoding;
+
+ private Date _absoluteExpiryTime;
+
+ private Date _creationTime;
+
+ private String _groupId;
+
+ private UnsignedInteger _groupSequence;
+
+ private String _replyToGroupId;
+
+ public Object getMessageId()
+ {
+ return _messageId;
+ }
+
+ public void setMessageId(Object messageId)
+ {
+ _messageId = messageId;
+ }
+
+ public Binary getUserId()
+ {
+ return _userId;
+ }
+
+ public void setUserId(Binary userId)
+ {
+ _userId = userId;
+ }
+
+ public String getTo()
+ {
+ return _to;
+ }
+
+ public void setTo(String to)
+ {
+ _to = to;
+ }
+
+ public String getSubject()
+ {
+ return _subject;
+ }
+
+ public void setSubject(String subject)
+ {
+ _subject = subject;
+ }
+
+ public String getReplyTo()
+ {
+ return _replyTo;
+ }
+
+ public void setReplyTo(String replyTo)
+ {
+ _replyTo = replyTo;
+ }
+
+ public Object getCorrelationId()
+ {
+ return _correlationId;
+ }
+
+ public void setCorrelationId(Object correlationId)
+ {
+ _correlationId = correlationId;
+ }
+
+ public Symbol getContentType()
+ {
+ return _contentType;
+ }
+
+ public void setContentType(Symbol contentType)
+ {
+ _contentType = contentType;
+ }
+
+ public Symbol getContentEncoding()
+ {
+ return _contentEncoding;
+ }
+
+ public void setContentEncoding(Symbol contentEncoding)
+ {
+ _contentEncoding = contentEncoding;
+ }
+
+ public Date getAbsoluteExpiryTime()
+ {
+ return _absoluteExpiryTime;
+ }
+
+ public void setAbsoluteExpiryTime(Date absoluteExpiryTime)
+ {
+ _absoluteExpiryTime = absoluteExpiryTime;
+ }
+
+ public Date getCreationTime()
+ {
+ return _creationTime;
+ }
+
+ public void setCreationTime(Date creationTime)
+ {
+ _creationTime = creationTime;
+ }
+
+ public String getGroupId()
+ {
+ return _groupId;
+ }
+
+ public void setGroupId(String groupId)
+ {
+ _groupId = groupId;
+ }
+
+ public UnsignedInteger getGroupSequence()
+ {
+ return _groupSequence;
+ }
+
+ public void setGroupSequence(UnsignedInteger groupSequence)
+ {
+ _groupSequence = groupSequence;
+ }
+
+ public String getReplyToGroupId()
+ {
+ return _replyToGroupId;
+ }
+
+ public void setReplyToGroupId(String replyToGroupId)
+ {
+ _replyToGroupId = replyToGroupId;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Properties{");
+ final int origLength = builder.length();
+
+ if(_messageId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("messageId=").append(_messageId);
+ }
+
+ if(_userId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("userId=").append(_userId);
+ }
+
+ if(_to != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("to=").append(_to);
+ }
+
+ if(_subject != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("subject=").append(_subject);
+ }
+
+ if(_replyTo != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("replyTo=").append(_replyTo);
+ }
+
+ if(_correlationId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("correlationId=").append(_correlationId);
+ }
+
+ if(_contentType != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("contentType=").append(_contentType);
+ }
+
+ if(_contentEncoding != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("contentEncoding=").append(_contentEncoding);
+ }
+
+ if(_absoluteExpiryTime != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("absoluteExpiryTime=").append(_absoluteExpiryTime);
+ }
+
+ if(_creationTime != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("creationTime=").append(_creationTime);
+ }
+
+ if(_groupId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("groupId=").append(_groupId);
+ }
+
+ if(_groupSequence != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("groupSequence=").append(_groupSequence);
+ }
+
+ if(_replyToGroupId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("replyToGroupId=").append(_replyToGroupId);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Received.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Received.java
new file mode 100644
index 0000000000..2e398063b8
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Received.java
@@ -0,0 +1,88 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Received
+ implements org.apache.qpid.amqp_1_0.type.DeliveryState
+ {
+
+
+ private UnsignedInteger _sectionNumber;
+
+ private UnsignedLong _sectionOffset;
+
+ public UnsignedInteger getSectionNumber()
+ {
+ return _sectionNumber;
+ }
+
+ public void setSectionNumber(UnsignedInteger sectionNumber)
+ {
+ _sectionNumber = sectionNumber;
+ }
+
+ public UnsignedLong getSectionOffset()
+ {
+ return _sectionOffset;
+ }
+
+ public void setSectionOffset(UnsignedLong sectionOffset)
+ {
+ _sectionOffset = sectionOffset;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Received{");
+ final int origLength = builder.length();
+
+ if(_sectionNumber != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("sectionNumber=").append(_sectionNumber);
+ }
+
+ if(_sectionOffset != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("sectionOffset=").append(_sectionOffset);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Rejected.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Rejected.java
new file mode 100644
index 0000000000..c895074131
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Rejected.java
@@ -0,0 +1,70 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Rejected
+ implements org.apache.qpid.amqp_1_0.type.DeliveryState, Outcome
+ {
+
+
+ private Error _error;
+
+ public Error getError()
+ {
+ return _error;
+ }
+
+ public void setError(Error error)
+ {
+ _error = error;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Rejected{");
+ final int origLength = builder.length();
+
+ if(_error != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("error=").append(_error);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Released.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Released.java
new file mode 100644
index 0000000000..ad54b6ff04
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Released.java
@@ -0,0 +1,46 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Released
+ implements org.apache.qpid.amqp_1_0.type.DeliveryState, Outcome
+ {
+
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Released{");
+ final int origLength = builder.length();
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Source.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Source.java
new file mode 100644
index 0000000000..b634542fd6
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Source.java
@@ -0,0 +1,280 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Source
+ implements org.apache.qpid.amqp_1_0.type.Source
+ {
+
+
+ private String _address;
+
+ private TerminusDurability _durable;
+
+ private TerminusExpiryPolicy _expiryPolicy;
+
+ private UnsignedInteger _timeout;
+
+ private Boolean _dynamic;
+
+ private Map _dynamicNodeProperties;
+
+ private DistributionMode _distributionMode;
+
+ private Map _filter;
+
+ private Outcome _defaultOutcome;
+
+ private Symbol[] _outcomes;
+
+ private Symbol[] _capabilities;
+
+ public String getAddress()
+ {
+ return _address;
+ }
+
+ public void setAddress(String address)
+ {
+ _address = address;
+ }
+
+ public TerminusDurability getDurable()
+ {
+ return _durable;
+ }
+
+ public void setDurable(TerminusDurability durable)
+ {
+ _durable = durable;
+ }
+
+ public TerminusExpiryPolicy getExpiryPolicy()
+ {
+ return _expiryPolicy;
+ }
+
+ public void setExpiryPolicy(TerminusExpiryPolicy expiryPolicy)
+ {
+ _expiryPolicy = expiryPolicy;
+ }
+
+ public UnsignedInteger getTimeout()
+ {
+ return _timeout;
+ }
+
+ public void setTimeout(UnsignedInteger timeout)
+ {
+ _timeout = timeout;
+ }
+
+ public Boolean getDynamic()
+ {
+ return _dynamic;
+ }
+
+ public void setDynamic(Boolean dynamic)
+ {
+ _dynamic = dynamic;
+ }
+
+ public Map getDynamicNodeProperties()
+ {
+ return _dynamicNodeProperties;
+ }
+
+ public void setDynamicNodeProperties(Map dynamicNodeProperties)
+ {
+ _dynamicNodeProperties = dynamicNodeProperties;
+ }
+
+ public DistributionMode getDistributionMode()
+ {
+ return _distributionMode;
+ }
+
+ public void setDistributionMode(DistributionMode distributionMode)
+ {
+ _distributionMode = distributionMode;
+ }
+
+ public Map getFilter()
+ {
+ return _filter;
+ }
+
+ public void setFilter(Map filter)
+ {
+ _filter = filter;
+ }
+
+ public Outcome getDefaultOutcome()
+ {
+ return _defaultOutcome;
+ }
+
+ public void setDefaultOutcome(Outcome defaultOutcome)
+ {
+ _defaultOutcome = defaultOutcome;
+ }
+
+ public Symbol[] getOutcomes()
+ {
+ return _outcomes;
+ }
+
+ public void setOutcomes(Symbol[] outcomes)
+ {
+ _outcomes = outcomes;
+ }
+
+ public Symbol[] getCapabilities()
+ {
+ return _capabilities;
+ }
+
+ public void setCapabilities(Symbol[] capabilities)
+ {
+ _capabilities = capabilities;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Source{");
+ final int origLength = builder.length();
+
+ if(_address != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("address=").append(_address);
+ }
+
+ if(_durable != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("durable=").append(_durable);
+ }
+
+ if(_expiryPolicy != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("expiryPolicy=").append(_expiryPolicy);
+ }
+
+ if(_timeout != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("timeout=").append(_timeout);
+ }
+
+ if(_dynamic != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("dynamic=").append(_dynamic);
+ }
+
+ if(_dynamicNodeProperties != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("dynamicNodeProperties=").append(_dynamicNodeProperties);
+ }
+
+ if(_distributionMode != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("distributionMode=").append(_distributionMode);
+ }
+
+ if(_filter != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("filter=").append(_filter);
+ }
+
+ if(_defaultOutcome != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("defaultOutcome=").append(_defaultOutcome);
+ }
+
+ if(_outcomes != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("outcomes=").append(_outcomes);
+ }
+
+ if(_capabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("capabilities=").append(_capabilities);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/StdDistMode.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/StdDistMode.java
new file mode 100644
index 0000000000..a3fba6fe46
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/StdDistMode.java
@@ -0,0 +1,95 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class StdDistMode
+ implements DistributionMode, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final StdDistMode MOVE = new StdDistMode(Symbol.valueOf("move"));
+
+ public static final StdDistMode COPY = new StdDistMode(Symbol.valueOf("copy"));
+
+
+
+ private StdDistMode(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == MOVE)
+ {
+ return "move";
+ }
+
+ if(this == COPY)
+ {
+ return "copy";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static StdDistMode valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(MOVE._val.equals(val))
+ {
+ return MOVE;
+ }
+
+ if(COPY._val.equals(val))
+ {
+ return COPY;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Target.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Target.java
new file mode 100644
index 0000000000..ea9319d31d
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Target.java
@@ -0,0 +1,196 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Target
+ implements org.apache.qpid.amqp_1_0.type.Target
+ {
+
+
+ private String _address;
+
+ private TerminusDurability _durable;
+
+ private TerminusExpiryPolicy _expiryPolicy;
+
+ private UnsignedInteger _timeout;
+
+ private Boolean _dynamic;
+
+ private Map _dynamicNodeProperties;
+
+ private Symbol[] _capabilities;
+
+ public String getAddress()
+ {
+ return _address;
+ }
+
+ public void setAddress(String address)
+ {
+ _address = address;
+ }
+
+ public TerminusDurability getDurable()
+ {
+ return _durable;
+ }
+
+ public void setDurable(TerminusDurability durable)
+ {
+ _durable = durable;
+ }
+
+ public TerminusExpiryPolicy getExpiryPolicy()
+ {
+ return _expiryPolicy;
+ }
+
+ public void setExpiryPolicy(TerminusExpiryPolicy expiryPolicy)
+ {
+ _expiryPolicy = expiryPolicy;
+ }
+
+ public UnsignedInteger getTimeout()
+ {
+ return _timeout;
+ }
+
+ public void setTimeout(UnsignedInteger timeout)
+ {
+ _timeout = timeout;
+ }
+
+ public Boolean getDynamic()
+ {
+ return _dynamic;
+ }
+
+ public void setDynamic(Boolean dynamic)
+ {
+ _dynamic = dynamic;
+ }
+
+ public Map getDynamicNodeProperties()
+ {
+ return _dynamicNodeProperties;
+ }
+
+ public void setDynamicNodeProperties(Map dynamicNodeProperties)
+ {
+ _dynamicNodeProperties = dynamicNodeProperties;
+ }
+
+ public Symbol[] getCapabilities()
+ {
+ return _capabilities;
+ }
+
+ public void setCapabilities(Symbol[] capabilities)
+ {
+ _capabilities = capabilities;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Target{");
+ final int origLength = builder.length();
+
+ if(_address != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("address=").append(_address);
+ }
+
+ if(_durable != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("durable=").append(_durable);
+ }
+
+ if(_expiryPolicy != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("expiryPolicy=").append(_expiryPolicy);
+ }
+
+ if(_timeout != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("timeout=").append(_timeout);
+ }
+
+ if(_dynamic != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("dynamic=").append(_dynamic);
+ }
+
+ if(_dynamicNodeProperties != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("dynamicNodeProperties=").append(_dynamicNodeProperties);
+ }
+
+ if(_capabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("capabilities=").append(_capabilities);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusDurability.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusDurability.java
new file mode 100644
index 0000000000..b08c416b4a
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusDurability.java
@@ -0,0 +1,107 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class TerminusDurability
+ implements RestrictedType<UnsignedInteger>
+
+ {
+
+
+
+ private final UnsignedInteger _val;
+
+
+ public static final TerminusDurability NONE = new TerminusDurability(UnsignedInteger.valueOf(0));
+
+ public static final TerminusDurability CONFIGURATION = new TerminusDurability(UnsignedInteger.valueOf(1));
+
+ public static final TerminusDurability UNSETTLED_STATE = new TerminusDurability(UnsignedInteger.valueOf(2));
+
+
+
+ private TerminusDurability(UnsignedInteger val)
+ {
+ _val = val;
+ }
+
+ public UnsignedInteger getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == NONE)
+ {
+ return "none";
+ }
+
+ if(this == CONFIGURATION)
+ {
+ return "configuration";
+ }
+
+ if(this == UNSETTLED_STATE)
+ {
+ return "unsettled-state";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static TerminusDurability valueOf(Object obj)
+ {
+ UnsignedInteger val = (UnsignedInteger) obj;
+
+ if(NONE._val.equals(val))
+ {
+ return NONE;
+ }
+
+ if(CONFIGURATION._val.equals(val))
+ {
+ return CONFIGURATION;
+ }
+
+ if(UNSETTLED_STATE._val.equals(val))
+ {
+ return UNSETTLED_STATE;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusExpiryPolicy.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusExpiryPolicy.java
new file mode 100644
index 0000000000..7ed2f84532
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusExpiryPolicy.java
@@ -0,0 +1,119 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class TerminusExpiryPolicy
+ implements RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final TerminusExpiryPolicy LINK_DETACH = new TerminusExpiryPolicy(Symbol.valueOf("link-detach"));
+
+ public static final TerminusExpiryPolicy SESSION_END = new TerminusExpiryPolicy(Symbol.valueOf("session-end"));
+
+ public static final TerminusExpiryPolicy CONNECTION_CLOSE = new TerminusExpiryPolicy(Symbol.valueOf("connection-close"));
+
+ public static final TerminusExpiryPolicy NEVER = new TerminusExpiryPolicy(Symbol.valueOf("never"));
+
+
+
+ private TerminusExpiryPolicy(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == LINK_DETACH)
+ {
+ return "link-detach";
+ }
+
+ if(this == SESSION_END)
+ {
+ return "session-end";
+ }
+
+ if(this == CONNECTION_CLOSE)
+ {
+ return "connection-close";
+ }
+
+ if(this == NEVER)
+ {
+ return "never";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static TerminusExpiryPolicy valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(LINK_DETACH._val.equals(val))
+ {
+ return LINK_DETACH;
+ }
+
+ if(SESSION_END._val.equals(val))
+ {
+ return SESSION_END;
+ }
+
+ if(CONNECTION_CLOSE._val.equals(val))
+ {
+ return CONNECTION_CLOSE;
+ }
+
+ if(NEVER._val.equals(val))
+ {
+ return NEVER;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedConstructor.java
new file mode 100644
index 0000000000..8000853a4d
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedConstructor.java
@@ -0,0 +1,72 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Accepted;
+
+
+import java.util.List;
+
+public class AcceptedConstructor extends DescribedTypeConstructor<Accepted>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:accepted:list"),UnsignedLong.valueOf(0x0000000000000024L),
+ };
+
+ private static final AcceptedConstructor INSTANCE = new AcceptedConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Accepted construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Accepted obj = new Accepted();
+ int position = 0;
+ final int size = list.size();
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedWriter.java
new file mode 100644
index 0000000000..862b678b59
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedWriter.java
@@ -0,0 +1,151 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Accepted;
+
+public class AcceptedWriter extends AbstractDescribedTypeWriter<Accepted>
+{
+ private Accepted _value;
+ private int _count = -1;
+
+ public AcceptedWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Accepted value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000024L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ if(_count != 0)
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+ else
+ {
+ return new ListWriter.EmptyListValueWriter();
+ }
+
+ }
+
+ private class Writer extends AbstractListWriter<Accepted>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Accepted value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Accepted> FACTORY = new Factory<Accepted>()
+ {
+
+ public ValueWriter<Accepted> newInstance(Registry registry)
+ {
+ return new AcceptedWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Accepted.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceConstructor.java
new file mode 100644
index 0000000000..7304a50b18
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceConstructor.java
@@ -0,0 +1,68 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpSequence;
+
+
+import java.util.List;
+
+public class AmqpSequenceConstructor extends DescribedTypeConstructor<AmqpSequence>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:amqp-sequence:list"),UnsignedLong.valueOf(0x0000000000000076L),
+ };
+
+ private static final AmqpSequenceConstructor INSTANCE = new AmqpSequenceConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public AmqpSequence construct(Object underlying)
+ {
+
+ if(underlying instanceof List)
+ {
+ return new AmqpSequence((List)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceWriter.java
new file mode 100644
index 0000000000..14c10ca5e6
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpSequence;
+
+public class AmqpSequenceWriter extends AbstractDescribedTypeWriter<AmqpSequence>
+{
+ private AmqpSequence _value;
+
+
+
+ public AmqpSequenceWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final AmqpSequence value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000076L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value);
+ }
+
+ private static Factory<AmqpSequence> FACTORY = new Factory<AmqpSequence>()
+ {
+
+ public ValueWriter<AmqpSequence> newInstance(Registry registry)
+ {
+ return new AmqpSequenceWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(AmqpSequence.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueConstructor.java
new file mode 100644
index 0000000000..2000880361
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueConstructor.java
@@ -0,0 +1,65 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+
+public class AmqpValueConstructor extends DescribedTypeConstructor<AmqpValue>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:amqp-value:*"),UnsignedLong.valueOf(0x0000000000000077L),
+ };
+
+ private static final AmqpValueConstructor INSTANCE = new AmqpValueConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public AmqpValue construct(Object underlying)
+ {
+
+ if(underlying instanceof Object)
+ {
+ return new AmqpValue((Object)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueWriter.java
new file mode 100644
index 0000000000..f38d2edb00
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+
+public class AmqpValueWriter extends AbstractDescribedTypeWriter<AmqpValue>
+{
+ private AmqpValue _value;
+
+
+
+ public AmqpValueWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final AmqpValue value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000077L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<AmqpValue> FACTORY = new Factory<AmqpValue>()
+ {
+
+ public ValueWriter<AmqpValue> newInstance(Registry registry)
+ {
+ return new AmqpValueWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(AmqpValue.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesConstructor.java
new file mode 100644
index 0000000000..f2bf26b7b4
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesConstructor.java
@@ -0,0 +1,68 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+
+
+import java.util.Map;
+
+public class ApplicationPropertiesConstructor extends DescribedTypeConstructor<ApplicationProperties>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:application-properties:map"),UnsignedLong.valueOf(0x0000000000000074L),
+ };
+
+ private static final ApplicationPropertiesConstructor INSTANCE = new ApplicationPropertiesConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public ApplicationProperties construct(Object underlying)
+ {
+
+ if(underlying instanceof Map)
+ {
+ return new ApplicationProperties((Map)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesWriter.java
new file mode 100644
index 0000000000..6fff917058
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+
+public class ApplicationPropertiesWriter extends AbstractDescribedTypeWriter<ApplicationProperties>
+{
+ private ApplicationProperties _value;
+
+
+
+ public ApplicationPropertiesWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final ApplicationProperties value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000074L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<ApplicationProperties> FACTORY = new Factory<ApplicationProperties>()
+ {
+
+ public ValueWriter<ApplicationProperties> newInstance(Registry registry)
+ {
+ return new ApplicationPropertiesWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(ApplicationProperties.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataConstructor.java
new file mode 100644
index 0000000000..75e921c1b8
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataConstructor.java
@@ -0,0 +1,65 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Data;
+
+public class DataConstructor extends DescribedTypeConstructor<Data>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:data:binary"),UnsignedLong.valueOf(0x0000000000000075L),
+ };
+
+ private static final DataConstructor INSTANCE = new DataConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public Data construct(Object underlying)
+ {
+
+ if(underlying instanceof Binary)
+ {
+ return new Data((Binary)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataWriter.java
new file mode 100644
index 0000000000..5ae6eecb43
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Data;
+
+public class DataWriter extends AbstractDescribedTypeWriter<Data>
+{
+ private Data _value;
+
+
+
+ public DataWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Data value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000075L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<Data> FACTORY = new Factory<Data>()
+ {
+
+ public ValueWriter<Data> newInstance(Registry registry)
+ {
+ return new DataWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Data.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseConstructor.java
new file mode 100644
index 0000000000..31236a00cc
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseConstructor.java
@@ -0,0 +1,72 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnClose;
+
+
+import java.util.List;
+
+public class DeleteOnCloseConstructor extends DescribedTypeConstructor<DeleteOnClose>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:delete-on-close:list"),UnsignedLong.valueOf(0x000000000000002bL),
+ };
+
+ private static final DeleteOnCloseConstructor INSTANCE = new DeleteOnCloseConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public DeleteOnClose construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ DeleteOnClose obj = new DeleteOnClose();
+ int position = 0;
+ final int size = list.size();
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseWriter.java
new file mode 100644
index 0000000000..3ea43f2565
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseWriter.java
@@ -0,0 +1,142 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnClose;
+
+public class DeleteOnCloseWriter extends AbstractDescribedTypeWriter<DeleteOnClose>
+{
+ private DeleteOnClose _value;
+ private int _count = -1;
+
+ public DeleteOnCloseWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnClose value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x000000000000002bL);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<DeleteOnClose>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnClose value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<DeleteOnClose> FACTORY = new Factory<DeleteOnClose>()
+ {
+
+ public ValueWriter<DeleteOnClose> newInstance(Registry registry)
+ {
+ return new DeleteOnCloseWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(DeleteOnClose.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksConstructor.java
new file mode 100644
index 0000000000..e5ea6e923e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksConstructor.java
@@ -0,0 +1,72 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnNoLinks;
+
+
+import java.util.List;
+
+public class DeleteOnNoLinksConstructor extends DescribedTypeConstructor<DeleteOnNoLinks>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:delete-on-no-links:list"),UnsignedLong.valueOf(0x000000000000002cL),
+ };
+
+ private static final DeleteOnNoLinksConstructor INSTANCE = new DeleteOnNoLinksConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public DeleteOnNoLinks construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ DeleteOnNoLinks obj = new DeleteOnNoLinks();
+ int position = 0;
+ final int size = list.size();
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesConstructor.java
new file mode 100644
index 0000000000..c9bafe9550
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesConstructor.java
@@ -0,0 +1,72 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnNoLinksOrMessages;
+
+
+import java.util.List;
+
+public class DeleteOnNoLinksOrMessagesConstructor extends DescribedTypeConstructor<DeleteOnNoLinksOrMessages>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:delete-on-no-links-or-messages:list"),UnsignedLong.valueOf(0x000000000000002eL),
+ };
+
+ private static final DeleteOnNoLinksOrMessagesConstructor INSTANCE = new DeleteOnNoLinksOrMessagesConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public DeleteOnNoLinksOrMessages construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ DeleteOnNoLinksOrMessages obj = new DeleteOnNoLinksOrMessages();
+ int position = 0;
+ final int size = list.size();
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesWriter.java
new file mode 100644
index 0000000000..e77c6a3be4
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesWriter.java
@@ -0,0 +1,142 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnNoLinksOrMessages;
+
+public class DeleteOnNoLinksOrMessagesWriter extends AbstractDescribedTypeWriter<DeleteOnNoLinksOrMessages>
+{
+ private DeleteOnNoLinksOrMessages _value;
+ private int _count = -1;
+
+ public DeleteOnNoLinksOrMessagesWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnNoLinksOrMessages value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x000000000000002eL);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<DeleteOnNoLinksOrMessages>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnNoLinksOrMessages value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<DeleteOnNoLinksOrMessages> FACTORY = new Factory<DeleteOnNoLinksOrMessages>()
+ {
+
+ public ValueWriter<DeleteOnNoLinksOrMessages> newInstance(Registry registry)
+ {
+ return new DeleteOnNoLinksOrMessagesWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(DeleteOnNoLinksOrMessages.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksWriter.java
new file mode 100644
index 0000000000..cbd5048ba1
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksWriter.java
@@ -0,0 +1,142 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnNoLinks;
+
+public class DeleteOnNoLinksWriter extends AbstractDescribedTypeWriter<DeleteOnNoLinks>
+{
+ private DeleteOnNoLinks _value;
+ private int _count = -1;
+
+ public DeleteOnNoLinksWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnNoLinks value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x000000000000002cL);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<DeleteOnNoLinks>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnNoLinks value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<DeleteOnNoLinks> FACTORY = new Factory<DeleteOnNoLinks>()
+ {
+
+ public ValueWriter<DeleteOnNoLinks> newInstance(Registry registry)
+ {
+ return new DeleteOnNoLinksWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(DeleteOnNoLinks.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesConstructor.java
new file mode 100644
index 0000000000..de8ce5b9a5
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesConstructor.java
@@ -0,0 +1,72 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnNoMessages;
+
+
+import java.util.List;
+
+public class DeleteOnNoMessagesConstructor extends DescribedTypeConstructor<DeleteOnNoMessages>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:delete-on-no-messages:list"),UnsignedLong.valueOf(0x000000000000002dL),
+ };
+
+ private static final DeleteOnNoMessagesConstructor INSTANCE = new DeleteOnNoMessagesConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public DeleteOnNoMessages construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ DeleteOnNoMessages obj = new DeleteOnNoMessages();
+ int position = 0;
+ final int size = list.size();
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesWriter.java
new file mode 100644
index 0000000000..bd75ec9fa1
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesWriter.java
@@ -0,0 +1,142 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnNoMessages;
+
+public class DeleteOnNoMessagesWriter extends AbstractDescribedTypeWriter<DeleteOnNoMessages>
+{
+ private DeleteOnNoMessages _value;
+ private int _count = -1;
+
+ public DeleteOnNoMessagesWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnNoMessages value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x000000000000002dL);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<DeleteOnNoMessages>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnNoMessages value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<DeleteOnNoMessages> FACTORY = new Factory<DeleteOnNoMessages>()
+ {
+
+ public ValueWriter<DeleteOnNoMessages> newInstance(Registry registry)
+ {
+ return new DeleteOnNoMessagesWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(DeleteOnNoMessages.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsConstructor.java
new file mode 100644
index 0000000000..3596a1f722
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsConstructor.java
@@ -0,0 +1,68 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.DeliveryAnnotations;
+
+
+import java.util.Map;
+
+public class DeliveryAnnotationsConstructor extends DescribedTypeConstructor<DeliveryAnnotations>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:delivery-annotations:map"),UnsignedLong.valueOf(0x0000000000000071L),
+ };
+
+ private static final DeliveryAnnotationsConstructor INSTANCE = new DeliveryAnnotationsConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public DeliveryAnnotations construct(Object underlying)
+ {
+
+ if(underlying instanceof Map)
+ {
+ return new DeliveryAnnotations((Map)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsWriter.java
new file mode 100644
index 0000000000..e22c26b290
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.DeliveryAnnotations;
+
+public class DeliveryAnnotationsWriter extends AbstractDescribedTypeWriter<DeliveryAnnotations>
+{
+ private DeliveryAnnotations _value;
+
+
+
+ public DeliveryAnnotationsWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeliveryAnnotations value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000071L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value);
+ }
+
+ private static Factory<DeliveryAnnotations> FACTORY = new Factory<DeliveryAnnotations>()
+ {
+
+ public ValueWriter<DeliveryAnnotations> newInstance(Registry registry)
+ {
+ return new DeliveryAnnotationsWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(DeliveryAnnotations.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterConstructor.java
new file mode 100644
index 0000000000..90eff967b2
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterConstructor.java
@@ -0,0 +1,64 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.messaging.ExactSubjectFilter;
+
+public class ExactSubjectFilterConstructor extends DescribedTypeConstructor<ExactSubjectFilter>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("apache.org:legacy-amqp-direct-binding:string"), 0x0000468C00000000L
+ };
+
+ private static final ExactSubjectFilterConstructor INSTANCE = new ExactSubjectFilterConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public ExactSubjectFilter construct(Object underlying)
+ {
+
+ if(underlying instanceof String)
+ {
+ return new ExactSubjectFilter((String)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterWriter.java
new file mode 100644
index 0000000000..2e95aba7a2
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterWriter.java
@@ -0,0 +1,78 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.type.messaging.ExactSubjectFilter;
+
+public class ExactSubjectFilterWriter extends AbstractDescribedTypeWriter<ExactSubjectFilter>
+{
+ private ExactSubjectFilter _value;
+
+
+
+ public ExactSubjectFilterWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final ExactSubjectFilter value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return 0x0000468C00000000L;
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<ExactSubjectFilter> FACTORY = new Factory<ExactSubjectFilter>()
+ {
+
+ public ValueWriter<ExactSubjectFilter> newInstance(Registry registry)
+ {
+ return new ExactSubjectFilterWriter(registry);
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ registry.register(ExactSubjectFilter.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterConstructor.java
new file mode 100644
index 0000000000..ed92c9f8f8
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterConstructor.java
@@ -0,0 +1,68 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Footer;
+
+
+import java.util.Map;
+
+public class FooterConstructor extends DescribedTypeConstructor<Footer>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:footer:map"),UnsignedLong.valueOf(0x0000000000000078L),
+ };
+
+ private static final FooterConstructor INSTANCE = new FooterConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public Footer construct(Object underlying)
+ {
+
+ if(underlying instanceof Map)
+ {
+ return new Footer((Map)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterWriter.java
new file mode 100644
index 0000000000..3ffde7c663
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Footer;
+
+public class FooterWriter extends AbstractDescribedTypeWriter<Footer>
+{
+ private Footer _value;
+
+
+
+ public FooterWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Footer value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000078L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<Footer> FACTORY = new Factory<Footer>()
+ {
+
+ public ValueWriter<Footer> newInstance(Registry registry)
+ {
+ return new FooterWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Footer.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderConstructor.java
new file mode 100644
index 0000000000..5a1b4ceb1b
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderConstructor.java
@@ -0,0 +1,207 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+
+
+import java.util.List;
+
+public class HeaderConstructor extends DescribedTypeConstructor<Header>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:header:list"),UnsignedLong.valueOf(0x0000000000000070L),
+ };
+
+ private static final HeaderConstructor INSTANCE = new HeaderConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Header construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Header obj = new Header();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDurable( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setPriority( (UnsignedByte) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTtl( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setFirstAcquirer( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDeliveryCount( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderWriter.java
new file mode 100644
index 0000000000..20605293e1
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderWriter.java
@@ -0,0 +1,182 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+
+public class HeaderWriter extends AbstractDescribedTypeWriter<Header>
+{
+ private Header _value;
+ private int _count = -1;
+
+ public HeaderWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Header value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getDeliveryCount() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getFirstAcquirer() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getTtl() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getPriority() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getDurable() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000070L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Header>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Header value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getDurable();
+
+ case 1:
+ return _value.getPriority();
+
+ case 2:
+ return _value.getTtl();
+
+ case 3:
+ return _value.getFirstAcquirer();
+
+ case 4:
+ return _value.getDeliveryCount();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Header> FACTORY = new Factory<Header>()
+ {
+
+ public ValueWriter<Header> newInstance(Registry registry)
+ {
+ return new HeaderWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Header.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterConstructor.java
new file mode 100644
index 0000000000..ac377f8461
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterConstructor.java
@@ -0,0 +1,66 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter;
+
+public class JMSSelectorFilterConstructor extends DescribedTypeConstructor<JMSSelectorFilter>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("apache.org:jms-selector-filter:string"),
+ UnsignedLong.valueOf(0x0000468C00000004L)
+ };
+
+ private static final JMSSelectorFilterConstructor INSTANCE = new JMSSelectorFilterConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public JMSSelectorFilter construct(Object underlying)
+ {
+
+ if(underlying instanceof String)
+ {
+ return new JMSSelectorFilter((String)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterWriter.java
new file mode 100644
index 0000000000..f363f0f1a4
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterWriter.java
@@ -0,0 +1,79 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter;
+
+public class JMSSelectorFilterWriter extends AbstractDescribedTypeWriter<JMSSelectorFilter>
+{
+ private JMSSelectorFilter _value;
+
+
+
+ public JMSSelectorFilterWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final JMSSelectorFilter value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000468C00000004L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<JMSSelectorFilter> FACTORY = new Factory<JMSSelectorFilter>()
+ {
+
+ public ValueWriter<JMSSelectorFilter> newInstance(Registry registry)
+ {
+ return new JMSSelectorFilterWriter(registry);
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ registry.register(JMSSelectorFilter.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterConstructor.java
new file mode 100644
index 0000000000..13e365fb5a
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterConstructor.java
@@ -0,0 +1,65 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.MatchingSubjectFilter;
+
+public class MatchingSubjectFilterConstructor extends DescribedTypeConstructor<MatchingSubjectFilter>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("apache.org:legacy-amqp-topic-binding:string"), UnsignedLong.valueOf(0x0000468C00000001L)
+ };
+
+ private static final MatchingSubjectFilterConstructor INSTANCE = new MatchingSubjectFilterConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public MatchingSubjectFilter construct(Object underlying)
+ {
+
+ if(underlying instanceof String)
+ {
+ return new MatchingSubjectFilter((String)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterWriter.java
new file mode 100644
index 0000000000..3c260e66d4
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterWriter.java
@@ -0,0 +1,79 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.MatchingSubjectFilter;
+
+public class MatchingSubjectFilterWriter extends AbstractDescribedTypeWriter<MatchingSubjectFilter>
+{
+ private MatchingSubjectFilter _value;
+
+
+
+ public MatchingSubjectFilterWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final MatchingSubjectFilter value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000468C00000001L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<MatchingSubjectFilter> FACTORY = new Factory<MatchingSubjectFilter>()
+ {
+
+ public ValueWriter<MatchingSubjectFilter> newInstance(Registry registry)
+ {
+ return new MatchingSubjectFilterWriter(registry);
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ registry.register(MatchingSubjectFilter.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsConstructor.java
new file mode 100644
index 0000000000..b2f2ec5739
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsConstructor.java
@@ -0,0 +1,68 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.MessageAnnotations;
+
+
+import java.util.Map;
+
+public class MessageAnnotationsConstructor extends DescribedTypeConstructor<MessageAnnotations>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:message-annotations:map"),UnsignedLong.valueOf(0x0000000000000072L),
+ };
+
+ private static final MessageAnnotationsConstructor INSTANCE = new MessageAnnotationsConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public MessageAnnotations construct(Object underlying)
+ {
+
+ if(underlying instanceof Map)
+ {
+ return new MessageAnnotations((Map)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsWriter.java
new file mode 100644
index 0000000000..400449c381
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.MessageAnnotations;
+
+public class MessageAnnotationsWriter extends AbstractDescribedTypeWriter<MessageAnnotations>
+{
+ private MessageAnnotations _value;
+
+
+
+ public MessageAnnotationsWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final MessageAnnotations value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000072L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<MessageAnnotations> FACTORY = new Factory<MessageAnnotations>()
+ {
+
+ public ValueWriter<MessageAnnotations> newInstance(Registry registry)
+ {
+ return new MessageAnnotationsWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(MessageAnnotations.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedConstructor.java
new file mode 100644
index 0000000000..fb78708d7d
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedConstructor.java
@@ -0,0 +1,154 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Modified;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class ModifiedConstructor extends DescribedTypeConstructor<Modified>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:modified:list"),UnsignedLong.valueOf(0x0000000000000027L),
+ };
+
+ private static final ModifiedConstructor INSTANCE = new ModifiedConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Modified construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Modified obj = new Modified();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDeliveryFailed( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setUndeliverableHere( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMessageAnnotations( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedWriter.java
new file mode 100644
index 0000000000..df3063ee52
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedWriter.java
@@ -0,0 +1,166 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Modified;
+
+public class ModifiedWriter extends AbstractDescribedTypeWriter<Modified>
+{
+ private Modified _value;
+ private int _count = -1;
+
+ public ModifiedWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Modified value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getMessageAnnotations() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getUndeliverableHere() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getDeliveryFailed() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000027L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Modified>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Modified value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getDeliveryFailed();
+
+ case 1:
+ return _value.getUndeliverableHere();
+
+ case 2:
+ return _value.getMessageAnnotations();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Modified> FACTORY = new Factory<Modified>()
+ {
+
+ public ValueWriter<Modified> newInstance(Registry registry)
+ {
+ return new ModifiedWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Modified.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterConstructor.java
new file mode 100644
index 0000000000..b1c5e1dcfe
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterConstructor.java
@@ -0,0 +1,56 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.NoLocalFilter;
+
+public class NoLocalFilterConstructor extends DescribedTypeConstructor<NoLocalFilter>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("apache.org:jms-no-local-filter:list"), UnsignedLong.valueOf(0x0000468C00000003L)
+ };
+
+ private static final NoLocalFilterConstructor INSTANCE = new NoLocalFilterConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public NoLocalFilter construct(Object underlying)
+ {
+ return NoLocalFilter.INSTANCE;
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterWriter.java
new file mode 100644
index 0000000000..8308f63101
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterWriter.java
@@ -0,0 +1,89 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.NoLocalFilter;
+
+public class NoLocalFilterWriter extends AbstractDescribedTypeWriter<NoLocalFilter>
+{
+ private NoLocalFilter _value;
+ private int _count = -1;
+
+ public NoLocalFilterWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final NoLocalFilter value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000468C00000003L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return new ListWriter.EmptyListValueWriter();
+ }
+
+ private static Factory<NoLocalFilter> FACTORY = new Factory<NoLocalFilter>()
+ {
+
+ public ValueWriter<NoLocalFilter> newInstance(Registry registry)
+ {
+ return new NoLocalFilterWriter(registry);
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ registry.register(NoLocalFilter.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesConstructor.java
new file mode 100644
index 0000000000..98b911f341
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesConstructor.java
@@ -0,0 +1,424 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+
+import java.util.List;
+import java.util.Date;
+
+public class PropertiesConstructor extends DescribedTypeConstructor<Properties>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:properties:list"),UnsignedLong.valueOf(0x0000000000000073L),
+ };
+
+ private static final PropertiesConstructor INSTANCE = new PropertiesConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Properties construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Properties obj = new Properties();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMessageId( val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setUserId( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTo( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSubject( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setReplyTo( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setCorrelationId( val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setContentType( (Symbol) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setContentEncoding( (Symbol) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setAbsoluteExpiryTime( (Date) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setCreationTime( (Date) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setGroupId( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setGroupSequence( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setReplyToGroupId( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesWriter.java
new file mode 100644
index 0000000000..021338bcfa
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesWriter.java
@@ -0,0 +1,246 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+public class PropertiesWriter extends AbstractDescribedTypeWriter<Properties>
+{
+ private Properties _value;
+ private int _count = -1;
+
+ public PropertiesWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Properties value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getReplyToGroupId() != null)
+ {
+ return 13;
+ }
+
+ if( _value.getGroupSequence() != null)
+ {
+ return 12;
+ }
+
+ if( _value.getGroupId() != null)
+ {
+ return 11;
+ }
+
+ if( _value.getCreationTime() != null)
+ {
+ return 10;
+ }
+
+ if( _value.getAbsoluteExpiryTime() != null)
+ {
+ return 9;
+ }
+
+ if( _value.getContentEncoding() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getContentType() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getCorrelationId() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getReplyTo() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getSubject() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getTo() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getUserId() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getMessageId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000073L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Properties>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Properties value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getMessageId();
+
+ case 1:
+ return _value.getUserId();
+
+ case 2:
+ return _value.getTo();
+
+ case 3:
+ return _value.getSubject();
+
+ case 4:
+ return _value.getReplyTo();
+
+ case 5:
+ return _value.getCorrelationId();
+
+ case 6:
+ return _value.getContentType();
+
+ case 7:
+ return _value.getContentEncoding();
+
+ case 8:
+ return _value.getAbsoluteExpiryTime();
+
+ case 9:
+ return _value.getCreationTime();
+
+ case 10:
+ return _value.getGroupId();
+
+ case 11:
+ return _value.getGroupSequence();
+
+ case 12:
+ return _value.getReplyToGroupId();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Properties> FACTORY = new Factory<Properties>()
+ {
+
+ public ValueWriter<Properties> newInstance(Registry registry)
+ {
+ return new PropertiesWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Properties.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedConstructor.java
new file mode 100644
index 0000000000..a515379d33
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedConstructor.java
@@ -0,0 +1,126 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Received;
+
+
+import java.util.List;
+
+public class ReceivedConstructor extends DescribedTypeConstructor<Received>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:received:list"),UnsignedLong.valueOf(0x0000000000000023L),
+ };
+
+ private static final ReceivedConstructor INSTANCE = new ReceivedConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Received construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Received obj = new Received();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSectionNumber( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSectionOffset( (UnsignedLong) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedWriter.java
new file mode 100644
index 0000000000..76af939db5
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedWriter.java
@@ -0,0 +1,158 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Received;
+
+public class ReceivedWriter extends AbstractDescribedTypeWriter<Received>
+{
+ private Received _value;
+ private int _count = -1;
+
+ public ReceivedWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Received value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getSectionOffset() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getSectionNumber() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000023L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Received>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Received value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getSectionNumber();
+
+ case 1:
+ return _value.getSectionOffset();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Received> FACTORY = new Factory<Received>()
+ {
+
+ public ValueWriter<Received> newInstance(Registry registry)
+ {
+ return new ReceivedWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Received.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedConstructor.java
new file mode 100644
index 0000000000..eb923c535d
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Rejected;
+
+
+import java.util.List;
+
+public class RejectedConstructor extends DescribedTypeConstructor<Rejected>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:rejected:list"),UnsignedLong.valueOf(0x0000000000000025L),
+ };
+
+ private static final RejectedConstructor INSTANCE = new RejectedConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Rejected construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Rejected obj = new Rejected();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setError( (org.apache.qpid.amqp_1_0.type.transport.Error) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedWriter.java
new file mode 100644
index 0000000000..6e24ac2972
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Rejected;
+
+public class RejectedWriter extends AbstractDescribedTypeWriter<Rejected>
+{
+ private Rejected _value;
+ private int _count = -1;
+
+ public RejectedWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Rejected value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getError() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000025L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Rejected>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Rejected value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getError();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Rejected> FACTORY = new Factory<Rejected>()
+ {
+
+ public ValueWriter<Rejected> newInstance(Registry registry)
+ {
+ return new RejectedWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Rejected.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedConstructor.java
new file mode 100644
index 0000000000..534b81efd7
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedConstructor.java
@@ -0,0 +1,72 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Released;
+
+
+import java.util.List;
+
+public class ReleasedConstructor extends DescribedTypeConstructor<Released>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:released:list"),UnsignedLong.valueOf(0x0000000000000026L),
+ };
+
+ private static final ReleasedConstructor INSTANCE = new ReleasedConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Released construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Released obj = new Released();
+ int position = 0;
+ final int size = list.size();
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedWriter.java
new file mode 100644
index 0000000000..cad602e0a6
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedWriter.java
@@ -0,0 +1,142 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Released;
+
+public class ReleasedWriter extends AbstractDescribedTypeWriter<Released>
+{
+ private Released _value;
+ private int _count = -1;
+
+ public ReleasedWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Released value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000026L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Released>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Released value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Released> FACTORY = new Factory<Released>()
+ {
+
+ public ValueWriter<Released> newInstance(Registry registry)
+ {
+ return new ReleasedWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Released.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceConstructor.java
new file mode 100644
index 0000000000..764fa222ee
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceConstructor.java
@@ -0,0 +1,384 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class SourceConstructor extends DescribedTypeConstructor<Source>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:source:list"),UnsignedLong.valueOf(0x0000000000000028L),
+ };
+
+ private static final SourceConstructor INSTANCE = new SourceConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Source construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Source obj = new Source();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setAddress( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDurable( TerminusDurability.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setExpiryPolicy( TerminusExpiryPolicy.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTimeout( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDynamic( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDynamicNodeProperties( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDistributionMode( (DistributionMode) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setFilter( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDefaultOutcome( (Outcome) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setOutcomes( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setOutcomes( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceWriter.java
new file mode 100644
index 0000000000..7fc8cfb35e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceWriter.java
@@ -0,0 +1,230 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+
+public class SourceWriter extends AbstractDescribedTypeWriter<Source>
+{
+ private Source _value;
+ private int _count = -1;
+
+ public SourceWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Source value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getCapabilities() != null)
+ {
+ return 11;
+ }
+
+ if( _value.getOutcomes() != null)
+ {
+ return 10;
+ }
+
+ if( _value.getDefaultOutcome() != null)
+ {
+ return 9;
+ }
+
+ if( _value.getFilter() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getDistributionMode() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getDynamicNodeProperties() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getDynamic() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getTimeout() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getExpiryPolicy() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getDurable() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getAddress() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000028L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Source>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Source value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getAddress();
+
+ case 1:
+ return _value.getDurable();
+
+ case 2:
+ return _value.getExpiryPolicy();
+
+ case 3:
+ return _value.getTimeout();
+
+ case 4:
+ return _value.getDynamic();
+
+ case 5:
+ return _value.getDynamicNodeProperties();
+
+ case 6:
+ return _value.getDistributionMode();
+
+ case 7:
+ return _value.getFilter();
+
+ case 8:
+ return _value.getDefaultOutcome();
+
+ case 9:
+ return _value.getOutcomes();
+
+ case 10:
+ return _value.getCapabilities();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Source> FACTORY = new Factory<Source>()
+ {
+
+ public ValueWriter<Source> newInstance(Registry registry)
+ {
+ return new SourceWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Source.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetConstructor.java
new file mode 100644
index 0000000000..1c89574273
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetConstructor.java
@@ -0,0 +1,269 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class TargetConstructor extends DescribedTypeConstructor<Target>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:target:list"),UnsignedLong.valueOf(0x0000000000000029L),
+ };
+
+ private static final TargetConstructor INSTANCE = new TargetConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Target construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Target obj = new Target();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setAddress( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDurable( TerminusDurability.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setExpiryPolicy( TerminusExpiryPolicy.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTimeout( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDynamic( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDynamicNodeProperties( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetWriter.java
new file mode 100644
index 0000000000..970a9f4020
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetWriter.java
@@ -0,0 +1,198 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+
+public class TargetWriter extends AbstractDescribedTypeWriter<Target>
+{
+ private Target _value;
+ private int _count = -1;
+
+ public TargetWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Target value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getCapabilities() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getDynamicNodeProperties() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getDynamic() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getTimeout() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getExpiryPolicy() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getDurable() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getAddress() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000029L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Target>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Target value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getAddress();
+
+ case 1:
+ return _value.getDurable();
+
+ case 2:
+ return _value.getExpiryPolicy();
+
+ case 3:
+ return _value.getTimeout();
+
+ case 4:
+ return _value.getDynamic();
+
+ case 5:
+ return _value.getDynamicNodeProperties();
+
+ case 6:
+ return _value.getCapabilities();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Target> FACTORY = new Factory<Target>()
+ {
+
+ public ValueWriter<Target> newInstance(Registry registry)
+ {
+ return new TargetWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Target.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslChallenge.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslChallenge.java
new file mode 100644
index 0000000000..081c00af29
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslChallenge.java
@@ -0,0 +1,74 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security;
+
+
+import org.apache.qpid.amqp_1_0.transport.SASLEndpoint;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SaslChallenge
+ implements SaslFrameBody
+ {
+
+
+ private Binary _challenge;
+
+ public Binary getChallenge()
+ {
+ return _challenge;
+ }
+
+ public void setChallenge(Binary challenge)
+ {
+ _challenge = challenge;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("SaslChallenge{");
+ final int origLength = builder.length();
+
+ if(_challenge != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("challenge=").append(_challenge);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(SASLEndpoint conn)
+ {
+ conn.receiveSaslChallenge(this);
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslCode.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslCode.java
new file mode 100644
index 0000000000..59a24070ef
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslCode.java
@@ -0,0 +1,131 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SaslCode
+ implements RestrictedType<UnsignedByte>
+
+ {
+
+
+
+ private final UnsignedByte _val;
+
+
+ public static final SaslCode OK = new SaslCode(UnsignedByte.valueOf((byte) 0));
+
+ public static final SaslCode AUTH = new SaslCode(UnsignedByte.valueOf((byte) 1));
+
+ public static final SaslCode SYS = new SaslCode(UnsignedByte.valueOf((byte) 2));
+
+ public static final SaslCode SYS_PERM = new SaslCode(UnsignedByte.valueOf((byte) 3));
+
+ public static final SaslCode SYS_TEMP = new SaslCode(UnsignedByte.valueOf((byte) 4));
+
+
+
+ private SaslCode(UnsignedByte val)
+ {
+ _val = val;
+ }
+
+ public UnsignedByte getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == OK)
+ {
+ return "ok";
+ }
+
+ if(this == AUTH)
+ {
+ return "auth";
+ }
+
+ if(this == SYS)
+ {
+ return "sys";
+ }
+
+ if(this == SYS_PERM)
+ {
+ return "sys-perm";
+ }
+
+ if(this == SYS_TEMP)
+ {
+ return "sys-temp";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static SaslCode valueOf(Object obj)
+ {
+ UnsignedByte val = (UnsignedByte) obj;
+
+ if(OK._val.equals(val))
+ {
+ return OK;
+ }
+
+ if(AUTH._val.equals(val))
+ {
+ return AUTH;
+ }
+
+ if(SYS._val.equals(val))
+ {
+ return SYS;
+ }
+
+ if(SYS_PERM._val.equals(val))
+ {
+ return SYS_PERM;
+ }
+
+ if(SYS_TEMP._val.equals(val))
+ {
+ return SYS_TEMP;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslInit.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslInit.java
new file mode 100644
index 0000000000..9b789a4e17
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslInit.java
@@ -0,0 +1,116 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security;
+
+
+import org.apache.qpid.amqp_1_0.transport.SASLEndpoint;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SaslInit
+ implements SaslFrameBody
+ {
+
+
+ private Symbol _mechanism;
+
+ private Binary _initialResponse;
+
+ private String _hostname;
+
+ public Symbol getMechanism()
+ {
+ return _mechanism;
+ }
+
+ public void setMechanism(Symbol mechanism)
+ {
+ _mechanism = mechanism;
+ }
+
+ public Binary getInitialResponse()
+ {
+ return _initialResponse;
+ }
+
+ public void setInitialResponse(Binary initialResponse)
+ {
+ _initialResponse = initialResponse;
+ }
+
+ public String getHostname()
+ {
+ return _hostname;
+ }
+
+ public void setHostname(String hostname)
+ {
+ _hostname = hostname;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("SaslInit{");
+ final int origLength = builder.length();
+
+ if(_mechanism != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("mechanism=").append(_mechanism);
+ }
+
+ if(_initialResponse != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("initialResponse=").append(_initialResponse);
+ }
+
+ if(_hostname != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("hostname=").append(_hostname);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(SASLEndpoint conn)
+ {
+ conn.receiveSaslInit(this);
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslMechanisms.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslMechanisms.java
new file mode 100644
index 0000000000..9598035899
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslMechanisms.java
@@ -0,0 +1,74 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security;
+
+
+import java.util.Arrays;
+import org.apache.qpid.amqp_1_0.transport.SASLEndpoint;
+import org.apache.qpid.amqp_1_0.type.SaslFrameBody;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+
+public class SaslMechanisms
+ implements SaslFrameBody
+ {
+
+
+ private Symbol[] _saslServerMechanisms;
+
+ public Symbol[] getSaslServerMechanisms()
+ {
+ return _saslServerMechanisms;
+ }
+
+ public void setSaslServerMechanisms(Symbol[] saslServerMechanisms)
+ {
+ _saslServerMechanisms = saslServerMechanisms;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("SaslMechanisms{");
+ final int origLength = builder.length();
+
+ if(_saslServerMechanisms != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("saslServerMechanisms=").append(_saslServerMechanisms == null ? "" : Arrays.asList(_saslServerMechanisms));
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(SASLEndpoint conn)
+ {
+ conn.receiveSaslMechanisms(this);
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslOutcome.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslOutcome.java
new file mode 100644
index 0000000000..02d707d311
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslOutcome.java
@@ -0,0 +1,95 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security;
+
+
+import org.apache.qpid.amqp_1_0.transport.SASLEndpoint;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SaslOutcome
+ implements SaslFrameBody
+ {
+
+
+ private SaslCode _code;
+
+ private Binary _additionalData;
+
+ public SaslCode getCode()
+ {
+ return _code;
+ }
+
+ public void setCode(SaslCode code)
+ {
+ _code = code;
+ }
+
+ public Binary getAdditionalData()
+ {
+ return _additionalData;
+ }
+
+ public void setAdditionalData(Binary additionalData)
+ {
+ _additionalData = additionalData;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("SaslOutcome{");
+ final int origLength = builder.length();
+
+ if(_code != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("code=").append(_code);
+ }
+
+ if(_additionalData != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("additionalData=").append(_additionalData);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(SASLEndpoint conn)
+ {
+ conn.receiveSaslOutcome(this);
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslResponse.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslResponse.java
new file mode 100644
index 0000000000..7ffcaba7e9
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslResponse.java
@@ -0,0 +1,74 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security;
+
+
+import org.apache.qpid.amqp_1_0.transport.SASLEndpoint;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SaslResponse
+ implements SaslFrameBody
+ {
+
+
+ private Binary _response;
+
+ public Binary getResponse()
+ {
+ return _response;
+ }
+
+ public void setResponse(Binary response)
+ {
+ _response = response;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("SaslResponse{");
+ final int origLength = builder.length();
+
+ if(_response != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("response=").append(_response);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(SASLEndpoint conn)
+ {
+ conn.receiveSaslResponse(this);
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeConstructor.java
new file mode 100644
index 0000000000..400e62db5a
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.security.*;
+import org.apache.qpid.amqp_1_0.type.security.SaslChallenge;
+
+
+import java.util.List;
+
+public class SaslChallengeConstructor extends DescribedTypeConstructor<SaslChallenge>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:sasl-challenge:list"),UnsignedLong.valueOf(0x0000000000000042L),
+ };
+
+ private static final SaslChallengeConstructor INSTANCE = new SaslChallengeConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public SaslChallenge construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ SaslChallenge obj = new SaslChallenge();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setChallenge( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeWriter.java
new file mode 100644
index 0000000000..2dd0e572e4
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.security.SaslChallenge;
+
+public class SaslChallengeWriter extends AbstractDescribedTypeWriter<SaslChallenge>
+{
+ private SaslChallenge _value;
+ private int _count = -1;
+
+ public SaslChallengeWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslChallenge value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getChallenge() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000042L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<SaslChallenge>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslChallenge value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getChallenge();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<SaslChallenge> FACTORY = new Factory<SaslChallenge>()
+ {
+
+ public ValueWriter<SaslChallenge> newInstance(Registry registry)
+ {
+ return new SaslChallengeWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(SaslChallenge.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitConstructor.java
new file mode 100644
index 0000000000..ff21c8e7d9
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitConstructor.java
@@ -0,0 +1,153 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.security.*;
+import org.apache.qpid.amqp_1_0.type.security.SaslInit;
+
+
+import java.util.List;
+
+public class SaslInitConstructor extends DescribedTypeConstructor<SaslInit>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:sasl-init:list"),UnsignedLong.valueOf(0x0000000000000041L),
+ };
+
+ private static final SaslInitConstructor INSTANCE = new SaslInitConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public SaslInit construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ SaslInit obj = new SaslInit();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMechanism( (Symbol) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setInitialResponse( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHostname( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitWriter.java
new file mode 100644
index 0000000000..50c724d9ed
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitWriter.java
@@ -0,0 +1,166 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.security.SaslInit;
+
+public class SaslInitWriter extends AbstractDescribedTypeWriter<SaslInit>
+{
+ private SaslInit _value;
+ private int _count = -1;
+
+ public SaslInitWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslInit value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getHostname() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getInitialResponse() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getMechanism() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000041L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<SaslInit>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslInit value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getMechanism();
+
+ case 1:
+ return _value.getInitialResponse();
+
+ case 2:
+ return _value.getHostname();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<SaslInit> FACTORY = new Factory<SaslInit>()
+ {
+
+ public ValueWriter<SaslInit> newInstance(Registry registry)
+ {
+ return new SaslInitWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(SaslInit.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsConstructor.java
new file mode 100644
index 0000000000..0fcdbd2a1a
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsConstructor.java
@@ -0,0 +1,106 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.security.*;
+import org.apache.qpid.amqp_1_0.type.security.SaslMechanisms;
+
+
+import java.util.List;
+
+public class SaslMechanismsConstructor extends DescribedTypeConstructor<SaslMechanisms>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:sasl-mechanisms:list"),UnsignedLong.valueOf(0x0000000000000040L),
+ };
+
+ private static final SaslMechanismsConstructor INSTANCE = new SaslMechanismsConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public SaslMechanisms construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ SaslMechanisms obj = new SaslMechanisms();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setSaslServerMechanisms( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setSaslServerMechanisms( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsWriter.java
new file mode 100644
index 0000000000..e630cd0a2f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.security.SaslMechanisms;
+
+public class SaslMechanismsWriter extends AbstractDescribedTypeWriter<SaslMechanisms>
+{
+ private SaslMechanisms _value;
+ private int _count = -1;
+
+ public SaslMechanismsWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslMechanisms value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getSaslServerMechanisms() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000040L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<SaslMechanisms>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslMechanisms value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getSaslServerMechanisms();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<SaslMechanisms> FACTORY = new Factory<SaslMechanisms>()
+ {
+
+ public ValueWriter<SaslMechanisms> newInstance(Registry registry)
+ {
+ return new SaslMechanismsWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(SaslMechanisms.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeConstructor.java
new file mode 100644
index 0000000000..b1c4760d3e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeConstructor.java
@@ -0,0 +1,126 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.security.*;
+import org.apache.qpid.amqp_1_0.type.security.SaslOutcome;
+
+
+import java.util.List;
+
+public class SaslOutcomeConstructor extends DescribedTypeConstructor<SaslOutcome>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:sasl-outcome:list"),UnsignedLong.valueOf(0x0000000000000044L),
+ };
+
+ private static final SaslOutcomeConstructor INSTANCE = new SaslOutcomeConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public SaslOutcome construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ SaslOutcome obj = new SaslOutcome();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setCode( SaslCode.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setAdditionalData( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeWriter.java
new file mode 100644
index 0000000000..7c35900ccc
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeWriter.java
@@ -0,0 +1,158 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.security.SaslOutcome;
+
+public class SaslOutcomeWriter extends AbstractDescribedTypeWriter<SaslOutcome>
+{
+ private SaslOutcome _value;
+ private int _count = -1;
+
+ public SaslOutcomeWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslOutcome value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getAdditionalData() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getCode() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000044L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<SaslOutcome>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslOutcome value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getCode();
+
+ case 1:
+ return _value.getAdditionalData();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<SaslOutcome> FACTORY = new Factory<SaslOutcome>()
+ {
+
+ public ValueWriter<SaslOutcome> newInstance(Registry registry)
+ {
+ return new SaslOutcomeWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(SaslOutcome.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseConstructor.java
new file mode 100644
index 0000000000..364cf59a2f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.security.*;
+import org.apache.qpid.amqp_1_0.type.security.SaslResponse;
+
+
+import java.util.List;
+
+public class SaslResponseConstructor extends DescribedTypeConstructor<SaslResponse>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:sasl-response:list"),UnsignedLong.valueOf(0x0000000000000043L),
+ };
+
+ private static final SaslResponseConstructor INSTANCE = new SaslResponseConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public SaslResponse construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ SaslResponse obj = new SaslResponse();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setResponse( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseWriter.java
new file mode 100644
index 0000000000..a8d63085c2
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.security.SaslResponse;
+
+public class SaslResponseWriter extends AbstractDescribedTypeWriter<SaslResponse>
+{
+ private SaslResponse _value;
+ private int _count = -1;
+
+ public SaslResponseWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslResponse value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getResponse() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000043L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<SaslResponse>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslResponse value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getResponse();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<SaslResponse> FACTORY = new Factory<SaslResponse>()
+ {
+
+ public ValueWriter<SaslResponse> newInstance(Registry registry)
+ {
+ return new SaslResponseWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(SaslResponse.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Coordinator.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Coordinator.java
new file mode 100644
index 0000000000..0417cefd35
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Coordinator.java
@@ -0,0 +1,70 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import java.util.Arrays;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Coordinator
+ implements Target
+ {
+
+
+ private TxnCapability[] _capabilities;
+
+ public TxnCapability[] getCapabilities()
+ {
+ return _capabilities;
+ }
+
+ public void setCapabilities(TxnCapability[] capabilities)
+ {
+ _capabilities = capabilities;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Coordinator{");
+ final int origLength = builder.length();
+
+ if(_capabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("capabilities=").append(Arrays.asList(_capabilities));
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declare.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declare.java
new file mode 100644
index 0000000000..5ec8993392
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declare.java
@@ -0,0 +1,66 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Declare
+ {
+
+
+ private GlobalTxId _globalId;
+
+ public GlobalTxId getGlobalId()
+ {
+ return _globalId;
+ }
+
+ public void setGlobalId(GlobalTxId globalId)
+ {
+ _globalId = globalId;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Declare{");
+ final int origLength = builder.length();
+
+ if(_globalId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("globalId=").append(_globalId);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declared.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declared.java
new file mode 100644
index 0000000000..4878cc3ccf
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declared.java
@@ -0,0 +1,67 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Declared
+ implements DeliveryState, Outcome
+ {
+
+
+ private Binary _txnId;
+
+ public Binary getTxnId()
+ {
+ return _txnId;
+ }
+
+ public void setTxnId(Binary txnId)
+ {
+ _txnId = txnId;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Declared{");
+ final int origLength = builder.length();
+
+ if(_txnId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("txnId=").append(_txnId);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Discharge.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Discharge.java
new file mode 100644
index 0000000000..356380608b
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Discharge.java
@@ -0,0 +1,87 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Discharge
+ {
+
+
+ private Binary _txnId;
+
+ private Boolean _fail;
+
+ public Binary getTxnId()
+ {
+ return _txnId;
+ }
+
+ public void setTxnId(Binary txnId)
+ {
+ _txnId = txnId;
+ }
+
+ public Boolean getFail()
+ {
+ return _fail;
+ }
+
+ public void setFail(Boolean fail)
+ {
+ _fail = fail;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Discharge{");
+ final int origLength = builder.length();
+
+ if(_txnId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("txnId=").append(_txnId);
+ }
+
+ if(_fail != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("fail=").append(_fail);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionErrors.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionErrors.java
new file mode 100644
index 0000000000..b87a7eea91
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionErrors.java
@@ -0,0 +1,107 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class TransactionErrors
+ implements ErrorCondition, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final TransactionErrors UNKNOWN_ID = new TransactionErrors(Symbol.valueOf("amqp:transaction:unknown-id"));
+
+ public static final TransactionErrors TRANSACTION_ROLLBACK = new TransactionErrors(Symbol.valueOf("amqp:transaction:rollback"));
+
+ public static final TransactionErrors TRANSACTION_TIMEOUT = new TransactionErrors(Symbol.valueOf("amqp:transaction:timeout"));
+
+
+
+ private TransactionErrors(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == UNKNOWN_ID)
+ {
+ return "unknown-id";
+ }
+
+ if(this == TRANSACTION_ROLLBACK)
+ {
+ return "transaction-rollback";
+ }
+
+ if(this == TRANSACTION_TIMEOUT)
+ {
+ return "transaction-timeout";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static TransactionErrors valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(UNKNOWN_ID._val.equals(val))
+ {
+ return UNKNOWN_ID;
+ }
+
+ if(TRANSACTION_ROLLBACK._val.equals(val))
+ {
+ return TRANSACTION_ROLLBACK;
+ }
+
+ if(TRANSACTION_TIMEOUT._val.equals(val))
+ {
+ return TRANSACTION_TIMEOUT;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionalState.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionalState.java
new file mode 100644
index 0000000000..b4fe564cf1
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionalState.java
@@ -0,0 +1,88 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class TransactionalState
+ implements DeliveryState
+ {
+
+
+ private Binary _txnId;
+
+ private Outcome _outcome;
+
+ public Binary getTxnId()
+ {
+ return _txnId;
+ }
+
+ public void setTxnId(Binary txnId)
+ {
+ _txnId = txnId;
+ }
+
+ public Outcome getOutcome()
+ {
+ return _outcome;
+ }
+
+ public void setOutcome(Outcome outcome)
+ {
+ _outcome = outcome;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("TransactionalState{");
+ final int origLength = builder.length();
+
+ if(_txnId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("txnId=").append(_txnId);
+ }
+
+ if(_outcome != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("outcome=").append(_outcome);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapabilities.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapabilities.java
new file mode 100644
index 0000000000..840cc57d27
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapabilities.java
@@ -0,0 +1,144 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.TxnCapability;
+
+public class TxnCapabilities
+ implements TxnCapability, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final TxnCapabilities LOCAL_TXN = new TxnCapabilities(Symbol.valueOf("amqp:local-transactions"));
+
+ public static final TxnCapabilities DISTRIBUTED_TXN = new TxnCapabilities(Symbol.valueOf("amqp:distributed-transactions"));
+
+ public static final TxnCapabilities PROMOTABLE_TXN = new TxnCapabilities(Symbol.valueOf("amqp:promotable-transactions"));
+
+ public static final TxnCapabilities MULTI_TXNS_PER_SSN = new TxnCapabilities(Symbol.valueOf("amqp:multi-txns-per-ssn"));
+
+ public static final TxnCapabilities MULTI_SSNS_PER_TXN = new TxnCapabilities(Symbol.valueOf("amqp:multi-ssns-per-txn"));
+
+ public static final TxnCapabilities MULTI_CONNS_PER_TXN = new TxnCapabilities(Symbol.valueOf("amqp:multi-conns-per-txn"));
+
+
+
+ private TxnCapabilities(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == LOCAL_TXN)
+ {
+ return "local-txn";
+ }
+
+ if(this == DISTRIBUTED_TXN)
+ {
+ return "distributed-txn";
+ }
+
+ if(this == PROMOTABLE_TXN)
+ {
+ return "promotable-txn";
+ }
+
+ if(this == MULTI_TXNS_PER_SSN)
+ {
+ return "multi-txns-per-ssn";
+ }
+
+ if(this == MULTI_SSNS_PER_TXN)
+ {
+ return "multi-ssns-per-txn";
+ }
+
+ if(this == MULTI_CONNS_PER_TXN)
+ {
+ return "multi-conns-per-txn";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static TxnCapabilities valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(LOCAL_TXN._val.equals(val))
+ {
+ return LOCAL_TXN;
+ }
+
+ if(DISTRIBUTED_TXN._val.equals(val))
+ {
+ return DISTRIBUTED_TXN;
+ }
+
+ if(PROMOTABLE_TXN._val.equals(val))
+ {
+ return PROMOTABLE_TXN;
+ }
+
+ if(MULTI_TXNS_PER_SSN._val.equals(val))
+ {
+ return MULTI_TXNS_PER_SSN;
+ }
+
+ if(MULTI_SSNS_PER_TXN._val.equals(val))
+ {
+ return MULTI_SSNS_PER_TXN;
+ }
+
+ if(MULTI_CONNS_PER_TXN._val.equals(val))
+ {
+ return MULTI_CONNS_PER_TXN;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapability.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapability.java
new file mode 100644
index 0000000000..19763f5b6b
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapability.java
@@ -0,0 +1,131 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class TxnCapability
+ implements org.apache.qpid.amqp_1_0.type.TxnCapability, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final TxnCapability LOCAL_TXN = new TxnCapability(Symbol.valueOf("amqp:local-transactions"));
+
+ public static final TxnCapability DISTRIBUTED_TXN = new TxnCapability(Symbol.valueOf("amqp:distributed-transactions"));
+
+ public static final TxnCapability PROMOTABLE_TXN = new TxnCapability(Symbol.valueOf("amqp:promotable-transactions"));
+
+ public static final TxnCapability MULTI_TXNS_PER_SSN = new TxnCapability(Symbol.valueOf("amqp:multi-txns-per-ssn"));
+
+ public static final TxnCapability MULTI_SSNS_PER_TXN = new TxnCapability(Symbol.valueOf("amqp:multi-ssns-per-txn"));
+
+
+
+ private TxnCapability(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == LOCAL_TXN)
+ {
+ return "local-txn";
+ }
+
+ if(this == DISTRIBUTED_TXN)
+ {
+ return "distributed-txn";
+ }
+
+ if(this == PROMOTABLE_TXN)
+ {
+ return "promotable-txn";
+ }
+
+ if(this == MULTI_TXNS_PER_SSN)
+ {
+ return "multi-txns-per-ssn";
+ }
+
+ if(this == MULTI_SSNS_PER_TXN)
+ {
+ return "multi-ssns-per-txn";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static TxnCapability valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(LOCAL_TXN._val.equals(val))
+ {
+ return LOCAL_TXN;
+ }
+
+ if(DISTRIBUTED_TXN._val.equals(val))
+ {
+ return DISTRIBUTED_TXN;
+ }
+
+ if(PROMOTABLE_TXN._val.equals(val))
+ {
+ return PROMOTABLE_TXN;
+ }
+
+ if(MULTI_TXNS_PER_SSN._val.equals(val))
+ {
+ return MULTI_TXNS_PER_SSN;
+ }
+
+ if(MULTI_SSNS_PER_TXN._val.equals(val))
+ {
+ return MULTI_SSNS_PER_TXN;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorConstructor.java
new file mode 100644
index 0000000000..de1dbc625e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorConstructor.java
@@ -0,0 +1,117 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.Coordinator;
+import org.apache.qpid.amqp_1_0.type.transaction.TxnCapability;
+
+import java.util.List;
+
+public class CoordinatorConstructor extends DescribedTypeConstructor<Coordinator>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:coordinator:list"),UnsignedLong.valueOf(0x0000000000000030L),
+ };
+
+ private static final CoordinatorConstructor INSTANCE = new CoordinatorConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Coordinator construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Coordinator obj = new Coordinator();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof TxnCapability[] )
+ {
+ obj.setCapabilities( (TxnCapability[]) val );
+ }
+ else if (val instanceof Symbol[])
+ {
+ Symbol[] symVal = (Symbol[]) val;
+ TxnCapability[] cap = new TxnCapability[symVal.length];
+ int i = 0;
+ for(Symbol sym : symVal)
+ {
+ cap[i++] = TxnCapability.valueOf(sym);
+ }
+ obj.setCapabilities(cap);
+ }
+ else
+ {
+ try
+ {
+ obj.setCapabilities( new TxnCapability[] { (TxnCapability) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorWriter.java
new file mode 100644
index 0000000000..56e3993046
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transaction.Coordinator;
+
+public class CoordinatorWriter extends AbstractDescribedTypeWriter<Coordinator>
+{
+ private Coordinator _value;
+ private int _count = -1;
+
+ public CoordinatorWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Coordinator value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getCapabilities() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000030L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Coordinator>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Coordinator value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getCapabilities();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Coordinator> FACTORY = new Factory<Coordinator>()
+ {
+
+ public ValueWriter<Coordinator> newInstance(Registry registry)
+ {
+ return new CoordinatorWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Coordinator.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareConstructor.java
new file mode 100644
index 0000000000..7eaf7dd9a8
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.Declare;
+
+
+import java.util.List;
+
+public class DeclareConstructor extends DescribedTypeConstructor<Declare>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:declare:list"),UnsignedLong.valueOf(0x0000000000000031L),
+ };
+
+ private static final DeclareConstructor INSTANCE = new DeclareConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Declare construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Declare obj = new Declare();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setGlobalId( (GlobalTxId) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareWriter.java
new file mode 100644
index 0000000000..bf0687fe92
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transaction.Declare;
+
+public class DeclareWriter extends AbstractDescribedTypeWriter<Declare>
+{
+ private Declare _value;
+ private int _count = -1;
+
+ public DeclareWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Declare value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getGlobalId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000031L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Declare>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Declare value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getGlobalId();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Declare> FACTORY = new Factory<Declare>()
+ {
+
+ public ValueWriter<Declare> newInstance(Registry registry)
+ {
+ return new DeclareWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Declare.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredConstructor.java
new file mode 100644
index 0000000000..1e226ff994
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.Declared;
+
+
+import java.util.List;
+
+public class DeclaredConstructor extends DescribedTypeConstructor<Declared>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:declared:list"),UnsignedLong.valueOf(0x0000000000000033L),
+ };
+
+ private static final DeclaredConstructor INSTANCE = new DeclaredConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Declared construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Declared obj = new Declared();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTxnId( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredWriter.java
new file mode 100644
index 0000000000..798ffcc72b
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transaction.Declared;
+
+public class DeclaredWriter extends AbstractDescribedTypeWriter<Declared>
+{
+ private Declared _value;
+ private int _count = -1;
+
+ public DeclaredWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Declared value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getTxnId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000033L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Declared>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Declared value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getTxnId();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Declared> FACTORY = new Factory<Declared>()
+ {
+
+ public ValueWriter<Declared> newInstance(Registry registry)
+ {
+ return new DeclaredWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Declared.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeConstructor.java
new file mode 100644
index 0000000000..ab088cc74d
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeConstructor.java
@@ -0,0 +1,126 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.Discharge;
+
+
+import java.util.List;
+
+public class DischargeConstructor extends DescribedTypeConstructor<Discharge>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:discharge:list"),UnsignedLong.valueOf(0x0000000000000032L),
+ };
+
+ private static final DischargeConstructor INSTANCE = new DischargeConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Discharge construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Discharge obj = new Discharge();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTxnId( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setFail( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeWriter.java
new file mode 100644
index 0000000000..ddd8678418
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeWriter.java
@@ -0,0 +1,158 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transaction.Discharge;
+
+public class DischargeWriter extends AbstractDescribedTypeWriter<Discharge>
+{
+ private Discharge _value;
+ private int _count = -1;
+
+ public DischargeWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Discharge value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getFail() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getTxnId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000032L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Discharge>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Discharge value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getTxnId();
+
+ case 1:
+ return _value.getFail();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Discharge> FACTORY = new Factory<Discharge>()
+ {
+
+ public ValueWriter<Discharge> newInstance(Registry registry)
+ {
+ return new DischargeWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Discharge.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateConstructor.java
new file mode 100644
index 0000000000..88cddba562
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateConstructor.java
@@ -0,0 +1,126 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+
+
+import java.util.List;
+
+public class TransactionalStateConstructor extends DescribedTypeConstructor<TransactionalState>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:transactional-state:list"),UnsignedLong.valueOf(0x0000000000000034L),
+ };
+
+ private static final TransactionalStateConstructor INSTANCE = new TransactionalStateConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public TransactionalState construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ TransactionalState obj = new TransactionalState();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTxnId( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setOutcome( (Outcome) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateWriter.java
new file mode 100644
index 0000000000..ea450fcf35
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateWriter.java
@@ -0,0 +1,158 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+
+public class TransactionalStateWriter extends AbstractDescribedTypeWriter<TransactionalState>
+{
+ private TransactionalState _value;
+ private int _count = -1;
+
+ public TransactionalStateWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final TransactionalState value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getOutcome() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getTxnId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000034L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<TransactionalState>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final TransactionalState value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getTxnId();
+
+ case 1:
+ return _value.getOutcome();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<TransactionalState> FACTORY = new Factory<TransactionalState>()
+ {
+
+ public ValueWriter<TransactionalState> newInstance(Registry registry)
+ {
+ return new TransactionalStateWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(TransactionalState.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/AmqpError.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/AmqpError.java
new file mode 100644
index 0000000000..075a80ef90
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/AmqpError.java
@@ -0,0 +1,227 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class AmqpError
+ implements ErrorCondition, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final AmqpError INTERNAL_ERROR = new AmqpError(Symbol.valueOf("amqp:internal-error"));
+
+ public static final AmqpError NOT_FOUND = new AmqpError(Symbol.valueOf("amqp:not-found"));
+
+ public static final AmqpError UNAUTHORIZED_ACCESS = new AmqpError(Symbol.valueOf("amqp:unauthorized-access"));
+
+ public static final AmqpError DECODE_ERROR = new AmqpError(Symbol.valueOf("amqp:decode-error"));
+
+ public static final AmqpError RESOURCE_LIMIT_EXCEEDED = new AmqpError(Symbol.valueOf("amqp:resource-limit-exceeded"));
+
+ public static final AmqpError NOT_ALLOWED = new AmqpError(Symbol.valueOf("amqp:not-allowed"));
+
+ public static final AmqpError INVALID_FIELD = new AmqpError(Symbol.valueOf("amqp:invalid-field"));
+
+ public static final AmqpError NOT_IMPLEMENTED = new AmqpError(Symbol.valueOf("amqp:not-implemented"));
+
+ public static final AmqpError RESOURCE_LOCKED = new AmqpError(Symbol.valueOf("amqp:resource-locked"));
+
+ public static final AmqpError PRECONDITION_FAILED = new AmqpError(Symbol.valueOf("amqp:precondition-failed"));
+
+ public static final AmqpError RESOURCE_DELETED = new AmqpError(Symbol.valueOf("amqp:resource-deleted"));
+
+ public static final AmqpError ILLEGAL_STATE = new AmqpError(Symbol.valueOf("amqp:illegal-state"));
+
+ public static final AmqpError FRAME_SIZE_TOO_SMALL = new AmqpError(Symbol.valueOf("amqp:frame-size-too-small"));
+
+
+
+ private AmqpError(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == INTERNAL_ERROR)
+ {
+ return "internal-error";
+ }
+
+ if(this == NOT_FOUND)
+ {
+ return "not-found";
+ }
+
+ if(this == UNAUTHORIZED_ACCESS)
+ {
+ return "unauthorized-access";
+ }
+
+ if(this == DECODE_ERROR)
+ {
+ return "decode-error";
+ }
+
+ if(this == RESOURCE_LIMIT_EXCEEDED)
+ {
+ return "resource-limit-exceeded";
+ }
+
+ if(this == NOT_ALLOWED)
+ {
+ return "not-allowed";
+ }
+
+ if(this == INVALID_FIELD)
+ {
+ return "invalid-field";
+ }
+
+ if(this == NOT_IMPLEMENTED)
+ {
+ return "not-implemented";
+ }
+
+ if(this == RESOURCE_LOCKED)
+ {
+ return "resource-locked";
+ }
+
+ if(this == PRECONDITION_FAILED)
+ {
+ return "precondition-failed";
+ }
+
+ if(this == RESOURCE_DELETED)
+ {
+ return "resource-deleted";
+ }
+
+ if(this == ILLEGAL_STATE)
+ {
+ return "illegal-state";
+ }
+
+ if(this == FRAME_SIZE_TOO_SMALL)
+ {
+ return "frame-size-too-small";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static AmqpError valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(INTERNAL_ERROR._val.equals(val))
+ {
+ return INTERNAL_ERROR;
+ }
+
+ if(NOT_FOUND._val.equals(val))
+ {
+ return NOT_FOUND;
+ }
+
+ if(UNAUTHORIZED_ACCESS._val.equals(val))
+ {
+ return UNAUTHORIZED_ACCESS;
+ }
+
+ if(DECODE_ERROR._val.equals(val))
+ {
+ return DECODE_ERROR;
+ }
+
+ if(RESOURCE_LIMIT_EXCEEDED._val.equals(val))
+ {
+ return RESOURCE_LIMIT_EXCEEDED;
+ }
+
+ if(NOT_ALLOWED._val.equals(val))
+ {
+ return NOT_ALLOWED;
+ }
+
+ if(INVALID_FIELD._val.equals(val))
+ {
+ return INVALID_FIELD;
+ }
+
+ if(NOT_IMPLEMENTED._val.equals(val))
+ {
+ return NOT_IMPLEMENTED;
+ }
+
+ if(RESOURCE_LOCKED._val.equals(val))
+ {
+ return RESOURCE_LOCKED;
+ }
+
+ if(PRECONDITION_FAILED._val.equals(val))
+ {
+ return PRECONDITION_FAILED;
+ }
+
+ if(RESOURCE_DELETED._val.equals(val))
+ {
+ return RESOURCE_DELETED;
+ }
+
+ if(ILLEGAL_STATE._val.equals(val))
+ {
+ return ILLEGAL_STATE;
+ }
+
+ if(FRAME_SIZE_TOO_SMALL._val.equals(val))
+ {
+ return FRAME_SIZE_TOO_SMALL;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Attach.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Attach.java
new file mode 100644
index 0000000000..d01dd0146c
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Attach.java
@@ -0,0 +1,365 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.util.Map;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Attach
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private String _name;
+
+ private UnsignedInteger _handle;
+
+ private Role _role;
+
+ private SenderSettleMode _sndSettleMode;
+
+ private ReceiverSettleMode _rcvSettleMode;
+
+ private Source _source;
+
+ private Target _target;
+
+ private Map _unsettled;
+
+ private Boolean _incompleteUnsettled;
+
+ private UnsignedInteger _initialDeliveryCount;
+
+ private UnsignedLong _maxMessageSize;
+
+ private Symbol[] _offeredCapabilities;
+
+ private Symbol[] _desiredCapabilities;
+
+ private Map _properties;
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public void setName(String name)
+ {
+ _name = name;
+ }
+
+ public UnsignedInteger getHandle()
+ {
+ return _handle;
+ }
+
+ public void setHandle(UnsignedInteger handle)
+ {
+ _handle = handle;
+ }
+
+ public Role getRole()
+ {
+ return _role;
+ }
+
+ public void setRole(Role role)
+ {
+ _role = role;
+ }
+
+ public SenderSettleMode getSndSettleMode()
+ {
+ return _sndSettleMode;
+ }
+
+ public void setSndSettleMode(SenderSettleMode sndSettleMode)
+ {
+ _sndSettleMode = sndSettleMode;
+ }
+
+ public ReceiverSettleMode getRcvSettleMode()
+ {
+ return _rcvSettleMode;
+ }
+
+ public void setRcvSettleMode(ReceiverSettleMode rcvSettleMode)
+ {
+ _rcvSettleMode = rcvSettleMode;
+ }
+
+ public Source getSource()
+ {
+ return _source;
+ }
+
+ public void setSource(Source source)
+ {
+ _source = source;
+ }
+
+ public Target getTarget()
+ {
+ return _target;
+ }
+
+ public void setTarget(Target target)
+ {
+ _target = target;
+ }
+
+ public Map getUnsettled()
+ {
+ return _unsettled;
+ }
+
+ public void setUnsettled(Map unsettled)
+ {
+ _unsettled = unsettled;
+ }
+
+ public Boolean getIncompleteUnsettled()
+ {
+ return _incompleteUnsettled;
+ }
+
+ public void setIncompleteUnsettled(Boolean incompleteUnsettled)
+ {
+ _incompleteUnsettled = incompleteUnsettled;
+ }
+
+ public UnsignedInteger getInitialDeliveryCount()
+ {
+ return _initialDeliveryCount;
+ }
+
+ public void setInitialDeliveryCount(UnsignedInteger initialDeliveryCount)
+ {
+ _initialDeliveryCount = initialDeliveryCount;
+ }
+
+ public UnsignedLong getMaxMessageSize()
+ {
+ return _maxMessageSize;
+ }
+
+ public void setMaxMessageSize(UnsignedLong maxMessageSize)
+ {
+ _maxMessageSize = maxMessageSize;
+ }
+
+ public Symbol[] getOfferedCapabilities()
+ {
+ return _offeredCapabilities;
+ }
+
+ public void setOfferedCapabilities(Symbol[] offeredCapabilities)
+ {
+ _offeredCapabilities = offeredCapabilities;
+ }
+
+ public Symbol[] getDesiredCapabilities()
+ {
+ return _desiredCapabilities;
+ }
+
+ public void setDesiredCapabilities(Symbol[] desiredCapabilities)
+ {
+ _desiredCapabilities = desiredCapabilities;
+ }
+
+ public Map getProperties()
+ {
+ return _properties;
+ }
+
+ public void setProperties(Map properties)
+ {
+ _properties = properties;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Attach{");
+ final int origLength = builder.length();
+
+ if(_name != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("name=").append(_name);
+ }
+
+ if(_handle != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("handle=").append(_handle);
+ }
+
+ if(_role != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("role=").append(_role);
+ }
+
+ if(_sndSettleMode != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("sndSettleMode=").append(_sndSettleMode);
+ }
+
+ if(_rcvSettleMode != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("rcvSettleMode=").append(_rcvSettleMode);
+ }
+
+ if(_source != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("source=").append(_source);
+ }
+
+ if(_target != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("target=").append(_target);
+ }
+
+ if(_unsettled != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("unsettled=").append(_unsettled);
+ }
+
+ if(_incompleteUnsettled != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("incompleteUnsettled=").append(_incompleteUnsettled);
+ }
+
+ if(_initialDeliveryCount != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("initialDeliveryCount=").append(_initialDeliveryCount);
+ }
+
+ if(_maxMessageSize != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("maxMessageSize=").append(_maxMessageSize);
+ }
+
+ if(_offeredCapabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("offeredCapabilities=").append(_offeredCapabilities);
+ }
+
+ if(_desiredCapabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("desiredCapabilities=").append(_desiredCapabilities);
+ }
+
+ if(_properties != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("properties=").append(_properties);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveAttach(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Begin.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Begin.java
new file mode 100644
index 0000000000..558fcbf780
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Begin.java
@@ -0,0 +1,239 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.util.Map;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Begin
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private UnsignedShort _remoteChannel;
+
+ private UnsignedInteger _nextOutgoingId;
+
+ private UnsignedInteger _incomingWindow;
+
+ private UnsignedInteger _outgoingWindow;
+
+ private UnsignedInteger _handleMax;
+
+ private Symbol[] _offeredCapabilities;
+
+ private Symbol[] _desiredCapabilities;
+
+ private Map _properties;
+
+ public UnsignedShort getRemoteChannel()
+ {
+ return _remoteChannel;
+ }
+
+ public void setRemoteChannel(UnsignedShort remoteChannel)
+ {
+ _remoteChannel = remoteChannel;
+ }
+
+ public UnsignedInteger getNextOutgoingId()
+ {
+ return _nextOutgoingId;
+ }
+
+ public void setNextOutgoingId(UnsignedInteger nextOutgoingId)
+ {
+ _nextOutgoingId = nextOutgoingId;
+ }
+
+ public UnsignedInteger getIncomingWindow()
+ {
+ return _incomingWindow;
+ }
+
+ public void setIncomingWindow(UnsignedInteger incomingWindow)
+ {
+ _incomingWindow = incomingWindow;
+ }
+
+ public UnsignedInteger getOutgoingWindow()
+ {
+ return _outgoingWindow;
+ }
+
+ public void setOutgoingWindow(UnsignedInteger outgoingWindow)
+ {
+ _outgoingWindow = outgoingWindow;
+ }
+
+ public UnsignedInteger getHandleMax()
+ {
+ return _handleMax;
+ }
+
+ public void setHandleMax(UnsignedInteger handleMax)
+ {
+ _handleMax = handleMax;
+ }
+
+ public Symbol[] getOfferedCapabilities()
+ {
+ return _offeredCapabilities;
+ }
+
+ public void setOfferedCapabilities(Symbol[] offeredCapabilities)
+ {
+ _offeredCapabilities = offeredCapabilities;
+ }
+
+ public Symbol[] getDesiredCapabilities()
+ {
+ return _desiredCapabilities;
+ }
+
+ public void setDesiredCapabilities(Symbol[] desiredCapabilities)
+ {
+ _desiredCapabilities = desiredCapabilities;
+ }
+
+ public Map getProperties()
+ {
+ return _properties;
+ }
+
+ public void setProperties(Map properties)
+ {
+ _properties = properties;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Begin{");
+ final int origLength = builder.length();
+
+ if(_remoteChannel != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("remoteChannel=").append(_remoteChannel);
+ }
+
+ if(_nextOutgoingId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("nextOutgoingId=").append(_nextOutgoingId);
+ }
+
+ if(_incomingWindow != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("incomingWindow=").append(_incomingWindow);
+ }
+
+ if(_outgoingWindow != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("outgoingWindow=").append(_outgoingWindow);
+ }
+
+ if(_handleMax != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("handleMax=").append(_handleMax);
+ }
+
+ if(_offeredCapabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("offeredCapabilities=").append(_offeredCapabilities);
+ }
+
+ if(_desiredCapabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("desiredCapabilities=").append(_desiredCapabilities);
+ }
+
+ if(_properties != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("properties=").append(_properties);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveBegin(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Close.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Close.java
new file mode 100644
index 0000000000..e86342d531
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Close.java
@@ -0,0 +1,89 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Close
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private Error _error;
+
+ public Error getError()
+ {
+ return _error;
+ }
+
+ public void setError(Error error)
+ {
+ _error = error;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Close{");
+ final int origLength = builder.length();
+
+ if(_error != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("error=").append(_error);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveClose(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ConnectionError.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ConnectionError.java
new file mode 100644
index 0000000000..07f0496e23
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ConnectionError.java
@@ -0,0 +1,107 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class ConnectionError
+ implements ErrorCondition, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final ConnectionError CONNECTION_FORCED = new ConnectionError(Symbol.valueOf("amqp:connection:forced"));
+
+ public static final ConnectionError FRAMING_ERROR = new ConnectionError(Symbol.valueOf("amqp:connection:framing-error"));
+
+ public static final ConnectionError REDIRECT = new ConnectionError(Symbol.valueOf("amqp:connection:redirect"));
+
+
+
+ private ConnectionError(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == CONNECTION_FORCED)
+ {
+ return "connection-forced";
+ }
+
+ if(this == FRAMING_ERROR)
+ {
+ return "framing-error";
+ }
+
+ if(this == REDIRECT)
+ {
+ return "redirect";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static ConnectionError valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(CONNECTION_FORCED._val.equals(val))
+ {
+ return CONNECTION_FORCED;
+ }
+
+ if(FRAMING_ERROR._val.equals(val))
+ {
+ return FRAMING_ERROR;
+ }
+
+ if(REDIRECT._val.equals(val))
+ {
+ return REDIRECT;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Detach.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Detach.java
new file mode 100644
index 0000000000..f788201328
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Detach.java
@@ -0,0 +1,131 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Detach
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private UnsignedInteger _handle;
+
+ private Boolean _closed;
+
+ private Error _error;
+
+ public UnsignedInteger getHandle()
+ {
+ return _handle;
+ }
+
+ public void setHandle(UnsignedInteger handle)
+ {
+ _handle = handle;
+ }
+
+ public Boolean getClosed()
+ {
+ return _closed;
+ }
+
+ public void setClosed(Boolean closed)
+ {
+ _closed = closed;
+ }
+
+ public Error getError()
+ {
+ return _error;
+ }
+
+ public void setError(Error error)
+ {
+ _error = error;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Detach{");
+ final int origLength = builder.length();
+
+ if(_handle != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("handle=").append(_handle);
+ }
+
+ if(_closed != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("closed=").append(_closed);
+ }
+
+ if(_error != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("error=").append(_error);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveDetach(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Disposition.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Disposition.java
new file mode 100644
index 0000000000..c7f04dedca
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Disposition.java
@@ -0,0 +1,194 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Disposition
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private Role _role;
+
+ private UnsignedInteger _first;
+
+ private UnsignedInteger _last;
+
+ private Boolean _settled;
+
+ private DeliveryState _state;
+
+ private Boolean _batchable;
+
+ public Role getRole()
+ {
+ return _role;
+ }
+
+ public void setRole(Role role)
+ {
+ _role = role;
+ }
+
+ public UnsignedInteger getFirst()
+ {
+ return _first;
+ }
+
+ public void setFirst(UnsignedInteger first)
+ {
+ _first = first;
+ }
+
+ public UnsignedInteger getLast()
+ {
+ return _last;
+ }
+
+ public void setLast(UnsignedInteger last)
+ {
+ _last = last;
+ }
+
+ public Boolean getSettled()
+ {
+ return _settled;
+ }
+
+ public void setSettled(Boolean settled)
+ {
+ _settled = settled;
+ }
+
+ public DeliveryState getState()
+ {
+ return _state;
+ }
+
+ public void setState(DeliveryState state)
+ {
+ _state = state;
+ }
+
+ public Boolean getBatchable()
+ {
+ return _batchable;
+ }
+
+ public void setBatchable(Boolean batchable)
+ {
+ _batchable = batchable;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Disposition{");
+ final int origLength = builder.length();
+
+ if(_role != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("role=").append(_role);
+ }
+
+ if(_first != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("first=").append(_first);
+ }
+
+ if(_last != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("last=").append(_last);
+ }
+
+ if(_settled != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("settled=").append(_settled);
+ }
+
+ if(_state != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("state=").append(_state);
+ }
+
+ if(_batchable != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("batchable=").append(_batchable);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveDisposition(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/End.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/End.java
new file mode 100644
index 0000000000..63fc331360
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/End.java
@@ -0,0 +1,89 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class End
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private Error _error;
+
+ public Error getError()
+ {
+ return _error;
+ }
+
+ public void setError(Error error)
+ {
+ _error = error;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("End{");
+ final int origLength = builder.length();
+
+ if(_error != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("error=").append(_error);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveEnd(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Error.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Error.java
new file mode 100644
index 0000000000..6e1af84cc9
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Error.java
@@ -0,0 +1,111 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Error
+ {
+
+
+ private ErrorCondition _condition;
+
+ private String _description;
+
+ private Map _info;
+
+ public ErrorCondition getCondition()
+ {
+ return _condition;
+ }
+
+ public void setCondition(ErrorCondition condition)
+ {
+ _condition = condition;
+ }
+
+ public String getDescription()
+ {
+ return _description;
+ }
+
+ public void setDescription(String description)
+ {
+ _description = description;
+ }
+
+ public Map getInfo()
+ {
+ return _info;
+ }
+
+ public void setInfo(Map info)
+ {
+ _info = info;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Error{");
+ final int origLength = builder.length();
+
+ if(_condition != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("condition=").append(_condition);
+ }
+
+ if(_description != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("description=").append(_description);
+ }
+
+ if(_info != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("info=").append(_info);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Flow.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Flow.java
new file mode 100644
index 0000000000..118d163841
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Flow.java
@@ -0,0 +1,302 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.util.Map;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Flow
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private UnsignedInteger _nextIncomingId;
+
+ private UnsignedInteger _incomingWindow;
+
+ private UnsignedInteger _nextOutgoingId;
+
+ private UnsignedInteger _outgoingWindow;
+
+ private UnsignedInteger _handle;
+
+ private UnsignedInteger _deliveryCount;
+
+ private UnsignedInteger _linkCredit;
+
+ private UnsignedInteger _available;
+
+ private Boolean _drain;
+
+ private Boolean _echo;
+
+ private Map _properties;
+
+ public UnsignedInteger getNextIncomingId()
+ {
+ return _nextIncomingId;
+ }
+
+ public void setNextIncomingId(UnsignedInteger nextIncomingId)
+ {
+ _nextIncomingId = nextIncomingId;
+ }
+
+ public UnsignedInteger getIncomingWindow()
+ {
+ return _incomingWindow;
+ }
+
+ public void setIncomingWindow(UnsignedInteger incomingWindow)
+ {
+ _incomingWindow = incomingWindow;
+ }
+
+ public UnsignedInteger getNextOutgoingId()
+ {
+ return _nextOutgoingId;
+ }
+
+ public void setNextOutgoingId(UnsignedInteger nextOutgoingId)
+ {
+ _nextOutgoingId = nextOutgoingId;
+ }
+
+ public UnsignedInteger getOutgoingWindow()
+ {
+ return _outgoingWindow;
+ }
+
+ public void setOutgoingWindow(UnsignedInteger outgoingWindow)
+ {
+ _outgoingWindow = outgoingWindow;
+ }
+
+ public UnsignedInteger getHandle()
+ {
+ return _handle;
+ }
+
+ public void setHandle(UnsignedInteger handle)
+ {
+ _handle = handle;
+ }
+
+ public UnsignedInteger getDeliveryCount()
+ {
+ return _deliveryCount;
+ }
+
+ public void setDeliveryCount(UnsignedInteger deliveryCount)
+ {
+ _deliveryCount = deliveryCount;
+ }
+
+ public UnsignedInteger getLinkCredit()
+ {
+ return _linkCredit;
+ }
+
+ public void setLinkCredit(UnsignedInteger linkCredit)
+ {
+ _linkCredit = linkCredit;
+ }
+
+ public UnsignedInteger getAvailable()
+ {
+ return _available;
+ }
+
+ public void setAvailable(UnsignedInteger available)
+ {
+ _available = available;
+ }
+
+ public Boolean getDrain()
+ {
+ return _drain;
+ }
+
+ public void setDrain(Boolean drain)
+ {
+ _drain = drain;
+ }
+
+ public Boolean getEcho()
+ {
+ return _echo;
+ }
+
+ public void setEcho(Boolean echo)
+ {
+ _echo = echo;
+ }
+
+ public Map getProperties()
+ {
+ return _properties;
+ }
+
+ public void setProperties(Map properties)
+ {
+ _properties = properties;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Flow{");
+ final int origLength = builder.length();
+
+ if(_nextIncomingId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("nextIncomingId=").append(_nextIncomingId);
+ }
+
+ if(_incomingWindow != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("incomingWindow=").append(_incomingWindow);
+ }
+
+ if(_nextOutgoingId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("nextOutgoingId=").append(_nextOutgoingId);
+ }
+
+ if(_outgoingWindow != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("outgoingWindow=").append(_outgoingWindow);
+ }
+
+ if(_handle != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("handle=").append(_handle);
+ }
+
+ if(_deliveryCount != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("deliveryCount=").append(_deliveryCount);
+ }
+
+ if(_linkCredit != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("linkCredit=").append(_linkCredit);
+ }
+
+ if(_available != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("available=").append(_available);
+ }
+
+ if(_drain != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("drain=").append(_drain);
+ }
+
+ if(_echo != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("echo=").append(_echo);
+ }
+
+ if(_properties != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("properties=").append(_properties);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveFlow(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/LinkError.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/LinkError.java
new file mode 100644
index 0000000000..3c2d025619
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/LinkError.java
@@ -0,0 +1,131 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class LinkError
+ implements ErrorCondition, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final LinkError DETACH_FORCED = new LinkError(Symbol.valueOf("amqp:link:detach-forced"));
+
+ public static final LinkError TRANSFER_LIMIT_EXCEEDED = new LinkError(Symbol.valueOf("amqp:link:transfer-limit-exceeded"));
+
+ public static final LinkError MESSAGE_SIZE_EXCEEDED = new LinkError(Symbol.valueOf("amqp:link:message-size-exceeded"));
+
+ public static final LinkError REDIRECT = new LinkError(Symbol.valueOf("amqp:link:redirect"));
+
+ public static final LinkError STOLEN = new LinkError(Symbol.valueOf("amqp:link:stolen"));
+
+
+
+ private LinkError(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == DETACH_FORCED)
+ {
+ return "detach-forced";
+ }
+
+ if(this == TRANSFER_LIMIT_EXCEEDED)
+ {
+ return "transfer-limit-exceeded";
+ }
+
+ if(this == MESSAGE_SIZE_EXCEEDED)
+ {
+ return "message-size-exceeded";
+ }
+
+ if(this == REDIRECT)
+ {
+ return "redirect";
+ }
+
+ if(this == STOLEN)
+ {
+ return "stolen";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static LinkError valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(DETACH_FORCED._val.equals(val))
+ {
+ return DETACH_FORCED;
+ }
+
+ if(TRANSFER_LIMIT_EXCEEDED._val.equals(val))
+ {
+ return TRANSFER_LIMIT_EXCEEDED;
+ }
+
+ if(MESSAGE_SIZE_EXCEEDED._val.equals(val))
+ {
+ return MESSAGE_SIZE_EXCEEDED;
+ }
+
+ if(REDIRECT._val.equals(val))
+ {
+ return REDIRECT;
+ }
+
+ if(STOLEN._val.equals(val))
+ {
+ return STOLEN;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Open.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Open.java
new file mode 100644
index 0000000000..cabee25c73
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Open.java
@@ -0,0 +1,281 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.util.Map;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Open
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private String _containerId;
+
+ private String _hostname;
+
+ private UnsignedInteger _maxFrameSize;
+
+ private UnsignedShort _channelMax;
+
+ private UnsignedInteger _idleTimeOut;
+
+ private Symbol[] _outgoingLocales;
+
+ private Symbol[] _incomingLocales;
+
+ private Symbol[] _offeredCapabilities;
+
+ private Symbol[] _desiredCapabilities;
+
+ private Map _properties;
+
+ public String getContainerId()
+ {
+ return _containerId;
+ }
+
+ public void setContainerId(String containerId)
+ {
+ _containerId = containerId;
+ }
+
+ public String getHostname()
+ {
+ return _hostname;
+ }
+
+ public void setHostname(String hostname)
+ {
+ _hostname = hostname;
+ }
+
+ public UnsignedInteger getMaxFrameSize()
+ {
+ return _maxFrameSize;
+ }
+
+ public void setMaxFrameSize(UnsignedInteger maxFrameSize)
+ {
+ _maxFrameSize = maxFrameSize;
+ }
+
+ public UnsignedShort getChannelMax()
+ {
+ return _channelMax;
+ }
+
+ public void setChannelMax(UnsignedShort channelMax)
+ {
+ _channelMax = channelMax;
+ }
+
+ public UnsignedInteger getIdleTimeOut()
+ {
+ return _idleTimeOut;
+ }
+
+ public void setIdleTimeOut(UnsignedInteger idleTimeOut)
+ {
+ _idleTimeOut = idleTimeOut;
+ }
+
+ public Symbol[] getOutgoingLocales()
+ {
+ return _outgoingLocales;
+ }
+
+ public void setOutgoingLocales(Symbol[] outgoingLocales)
+ {
+ _outgoingLocales = outgoingLocales;
+ }
+
+ public Symbol[] getIncomingLocales()
+ {
+ return _incomingLocales;
+ }
+
+ public void setIncomingLocales(Symbol[] incomingLocales)
+ {
+ _incomingLocales = incomingLocales;
+ }
+
+ public Symbol[] getOfferedCapabilities()
+ {
+ return _offeredCapabilities;
+ }
+
+ public void setOfferedCapabilities(Symbol[] offeredCapabilities)
+ {
+ _offeredCapabilities = offeredCapabilities;
+ }
+
+ public Symbol[] getDesiredCapabilities()
+ {
+ return _desiredCapabilities;
+ }
+
+ public void setDesiredCapabilities(Symbol[] desiredCapabilities)
+ {
+ _desiredCapabilities = desiredCapabilities;
+ }
+
+ public Map getProperties()
+ {
+ return _properties;
+ }
+
+ public void setProperties(Map properties)
+ {
+ _properties = properties;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Open{");
+ final int origLength = builder.length();
+
+ if(_containerId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("containerId=").append(_containerId);
+ }
+
+ if(_hostname != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("hostname=").append(_hostname);
+ }
+
+ if(_maxFrameSize != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("maxFrameSize=").append(_maxFrameSize);
+ }
+
+ if(_channelMax != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("channelMax=").append(_channelMax);
+ }
+
+ if(_idleTimeOut != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("idleTimeOut=").append(_idleTimeOut);
+ }
+
+ if(_outgoingLocales != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("outgoingLocales=").append(_outgoingLocales);
+ }
+
+ if(_incomingLocales != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("incomingLocales=").append(_incomingLocales);
+ }
+
+ if(_offeredCapabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("offeredCapabilities=").append(_offeredCapabilities);
+ }
+
+ if(_desiredCapabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("desiredCapabilities=").append(_desiredCapabilities);
+ }
+
+ if(_properties != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("properties=").append(_properties);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveOpen(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ReceiverSettleMode.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ReceiverSettleMode.java
new file mode 100644
index 0000000000..53f0f2b931
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ReceiverSettleMode.java
@@ -0,0 +1,95 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class ReceiverSettleMode
+ implements RestrictedType<UnsignedByte>
+
+ {
+
+
+
+ private final UnsignedByte _val;
+
+
+ public static final ReceiverSettleMode FIRST = new ReceiverSettleMode(UnsignedByte.valueOf((byte) 0));
+
+ public static final ReceiverSettleMode SECOND = new ReceiverSettleMode(UnsignedByte.valueOf((byte) 1));
+
+
+
+ private ReceiverSettleMode(UnsignedByte val)
+ {
+ _val = val;
+ }
+
+ public UnsignedByte getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == FIRST)
+ {
+ return "first";
+ }
+
+ if(this == SECOND)
+ {
+ return "second";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static ReceiverSettleMode valueOf(Object obj)
+ {
+ UnsignedByte val = (UnsignedByte) obj;
+
+ if(FIRST._val.equals(val))
+ {
+ return FIRST;
+ }
+
+ if(SECOND._val.equals(val))
+ {
+ return SECOND;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Role.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Role.java
new file mode 100644
index 0000000000..55be00b3d7
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Role.java
@@ -0,0 +1,95 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Role
+ implements RestrictedType<Boolean>
+
+ {
+
+
+
+ private final boolean _val;
+
+
+ public static final Role SENDER = new Role(false);
+
+ public static final Role RECEIVER = new Role(true);
+
+
+
+ private Role(boolean val)
+ {
+ _val = val;
+ }
+
+ public Boolean getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == SENDER)
+ {
+ return "sender";
+ }
+
+ if(this == RECEIVER)
+ {
+ return "receiver";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static Role valueOf(Object obj)
+ {
+ boolean val = (Boolean) obj;
+
+ if(SENDER._val == (val))
+ {
+ return SENDER;
+ }
+
+ if(RECEIVER._val == (val))
+ {
+ return RECEIVER;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SenderSettleMode.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SenderSettleMode.java
new file mode 100644
index 0000000000..528ec69dbc
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SenderSettleMode.java
@@ -0,0 +1,107 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SenderSettleMode
+ implements RestrictedType<UnsignedByte>
+
+ {
+
+
+
+ private final UnsignedByte _val;
+
+
+ public static final SenderSettleMode UNSETTLED = new SenderSettleMode(UnsignedByte.valueOf((byte) 0));
+
+ public static final SenderSettleMode SETTLED = new SenderSettleMode(UnsignedByte.valueOf((byte) 1));
+
+ public static final SenderSettleMode MIXED = new SenderSettleMode(UnsignedByte.valueOf((byte) 2));
+
+
+
+ private SenderSettleMode(UnsignedByte val)
+ {
+ _val = val;
+ }
+
+ public UnsignedByte getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == UNSETTLED)
+ {
+ return "unsettled";
+ }
+
+ if(this == SETTLED)
+ {
+ return "settled";
+ }
+
+ if(this == MIXED)
+ {
+ return "mixed";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static SenderSettleMode valueOf(Object obj)
+ {
+ UnsignedByte val = (UnsignedByte) obj;
+
+ if(UNSETTLED._val.equals(val))
+ {
+ return UNSETTLED;
+ }
+
+ if(SETTLED._val.equals(val))
+ {
+ return SETTLED;
+ }
+
+ if(MIXED._val.equals(val))
+ {
+ return MIXED;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SessionError.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SessionError.java
new file mode 100644
index 0000000000..b7b233c879
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SessionError.java
@@ -0,0 +1,119 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SessionError
+ implements ErrorCondition, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final SessionError WINDOW_VIOLATION = new SessionError(Symbol.valueOf("amqp:session:window-violation"));
+
+ public static final SessionError ERRANT_LINK = new SessionError(Symbol.valueOf("amqp:session:errant-link"));
+
+ public static final SessionError HANDLE_IN_USE = new SessionError(Symbol.valueOf("amqp:session:handle-in-use"));
+
+ public static final SessionError UNATTACHED_HANDLE = new SessionError(Symbol.valueOf("amqp:session:unattached-handle"));
+
+
+
+ private SessionError(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == WINDOW_VIOLATION)
+ {
+ return "window-violation";
+ }
+
+ if(this == ERRANT_LINK)
+ {
+ return "errant-link";
+ }
+
+ if(this == HANDLE_IN_USE)
+ {
+ return "handle-in-use";
+ }
+
+ if(this == UNATTACHED_HANDLE)
+ {
+ return "unattached-handle";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static SessionError valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(WINDOW_VIOLATION._val.equals(val))
+ {
+ return WINDOW_VIOLATION;
+ }
+
+ if(ERRANT_LINK._val.equals(val))
+ {
+ return ERRANT_LINK;
+ }
+
+ if(HANDLE_IN_USE._val.equals(val))
+ {
+ return HANDLE_IN_USE;
+ }
+
+ if(UNATTACHED_HANDLE._val.equals(val))
+ {
+ return UNATTACHED_HANDLE;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Transfer.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Transfer.java
new file mode 100644
index 0000000000..a58db63a1f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Transfer.java
@@ -0,0 +1,299 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Transfer
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private UnsignedInteger _handle;
+
+ private UnsignedInteger _deliveryId;
+
+ private Binary _deliveryTag;
+
+ private UnsignedInteger _messageFormat;
+
+ private Boolean _settled;
+
+ private Boolean _more;
+
+ private ReceiverSettleMode _rcvSettleMode;
+
+ private DeliveryState _state;
+
+ private Boolean _resume;
+
+ private Boolean _aborted;
+
+ private Boolean _batchable;
+
+ public UnsignedInteger getHandle()
+ {
+ return _handle;
+ }
+
+ public void setHandle(UnsignedInteger handle)
+ {
+ _handle = handle;
+ }
+
+ public UnsignedInteger getDeliveryId()
+ {
+ return _deliveryId;
+ }
+
+ public void setDeliveryId(UnsignedInteger deliveryId)
+ {
+ _deliveryId = deliveryId;
+ }
+
+ public Binary getDeliveryTag()
+ {
+ return _deliveryTag;
+ }
+
+ public void setDeliveryTag(Binary deliveryTag)
+ {
+ _deliveryTag = deliveryTag;
+ }
+
+ public UnsignedInteger getMessageFormat()
+ {
+ return _messageFormat;
+ }
+
+ public void setMessageFormat(UnsignedInteger messageFormat)
+ {
+ _messageFormat = messageFormat;
+ }
+
+ public Boolean getSettled()
+ {
+ return _settled;
+ }
+
+ public void setSettled(Boolean settled)
+ {
+ _settled = settled;
+ }
+
+ public Boolean getMore()
+ {
+ return _more;
+ }
+
+ public void setMore(Boolean more)
+ {
+ _more = more;
+ }
+
+ public ReceiverSettleMode getRcvSettleMode()
+ {
+ return _rcvSettleMode;
+ }
+
+ public void setRcvSettleMode(ReceiverSettleMode rcvSettleMode)
+ {
+ _rcvSettleMode = rcvSettleMode;
+ }
+
+ public DeliveryState getState()
+ {
+ return _state;
+ }
+
+ public void setState(DeliveryState state)
+ {
+ _state = state;
+ }
+
+ public Boolean getResume()
+ {
+ return _resume;
+ }
+
+ public void setResume(Boolean resume)
+ {
+ _resume = resume;
+ }
+
+ public Boolean getAborted()
+ {
+ return _aborted;
+ }
+
+ public void setAborted(Boolean aborted)
+ {
+ _aborted = aborted;
+ }
+
+ public Boolean getBatchable()
+ {
+ return _batchable;
+ }
+
+ public void setBatchable(Boolean batchable)
+ {
+ _batchable = batchable;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Transfer{");
+ final int origLength = builder.length();
+
+ if(_handle != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("handle=").append(_handle);
+ }
+
+ if(_deliveryId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("deliveryId=").append(_deliveryId);
+ }
+
+ if(_deliveryTag != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("deliveryTag=").append(_deliveryTag);
+ }
+
+ if(_messageFormat != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("messageFormat=").append(_messageFormat);
+ }
+
+ if(_settled != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("settled=").append(_settled);
+ }
+
+ if(_more != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("more=").append(_more);
+ }
+
+ if(_rcvSettleMode != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("rcvSettleMode=").append(_rcvSettleMode);
+ }
+
+ if(_state != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("state=").append(_state);
+ }
+
+ if(_resume != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("resume=").append(_resume);
+ }
+
+ if(_aborted != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("aborted=").append(_aborted);
+ }
+
+ if(_batchable != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("batchable=").append(_batchable);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveTransfer(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachConstructor.java
new file mode 100644
index 0000000000..0df84ac820
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachConstructor.java
@@ -0,0 +1,465 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Attach;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class AttachConstructor extends DescribedTypeConstructor<Attach>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:attach:list"),UnsignedLong.valueOf(0x0000000000000012L),
+ };
+
+ private static final AttachConstructor INSTANCE = new AttachConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Attach construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Attach obj = new Attach();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setName( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHandle( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setRole( Role.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSndSettleMode( SenderSettleMode.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setRcvSettleMode( ReceiverSettleMode.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSource( (Source) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTarget( (Target) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setUnsettled( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setIncompleteUnsettled( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setInitialDeliveryCount( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMaxMessageSize( (UnsignedLong) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setOfferedCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setOfferedCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setDesiredCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setDesiredCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setProperties( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachWriter.java
new file mode 100644
index 0000000000..0b67635dc0
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachWriter.java
@@ -0,0 +1,254 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Attach;
+
+public class AttachWriter extends AbstractDescribedTypeWriter<Attach>
+{
+ private Attach _value;
+ private int _count = -1;
+
+ public AttachWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Attach value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getProperties() != null)
+ {
+ return 14;
+ }
+
+ if( _value.getDesiredCapabilities() != null)
+ {
+ return 13;
+ }
+
+ if( _value.getOfferedCapabilities() != null)
+ {
+ return 12;
+ }
+
+ if( _value.getMaxMessageSize() != null)
+ {
+ return 11;
+ }
+
+ if( _value.getInitialDeliveryCount() != null)
+ {
+ return 10;
+ }
+
+ if( _value.getIncompleteUnsettled() != null)
+ {
+ return 9;
+ }
+
+ if( _value.getUnsettled() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getTarget() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getSource() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getRcvSettleMode() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getSndSettleMode() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getRole() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getHandle() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getName() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000012L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Attach>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Attach value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getName();
+
+ case 1:
+ return _value.getHandle();
+
+ case 2:
+ return _value.getRole();
+
+ case 3:
+ return _value.getSndSettleMode();
+
+ case 4:
+ return _value.getRcvSettleMode();
+
+ case 5:
+ return _value.getSource();
+
+ case 6:
+ return _value.getTarget();
+
+ case 7:
+ return _value.getUnsettled();
+
+ case 8:
+ return _value.getIncompleteUnsettled();
+
+ case 9:
+ return _value.getInitialDeliveryCount();
+
+ case 10:
+ return _value.getMaxMessageSize();
+
+ case 11:
+ return _value.getOfferedCapabilities();
+
+ case 12:
+ return _value.getDesiredCapabilities();
+
+ case 13:
+ return _value.getProperties();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Attach> FACTORY = new Factory<Attach>()
+ {
+
+ public ValueWriter<Attach> newInstance(Registry registry)
+ {
+ return new AttachWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Attach.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginConstructor.java
new file mode 100644
index 0000000000..94470c5139
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginConstructor.java
@@ -0,0 +1,303 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Begin;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class BeginConstructor extends DescribedTypeConstructor<Begin>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:begin:list"),UnsignedLong.valueOf(0x0000000000000011L),
+ };
+
+ private static final BeginConstructor INSTANCE = new BeginConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Begin construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Begin obj = new Begin();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setRemoteChannel( (UnsignedShort) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setNextOutgoingId( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setIncomingWindow( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setOutgoingWindow( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHandleMax( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setOfferedCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setOfferedCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setDesiredCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setDesiredCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setProperties( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginWriter.java
new file mode 100644
index 0000000000..84abf6698e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginWriter.java
@@ -0,0 +1,206 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Begin;
+
+public class BeginWriter extends AbstractDescribedTypeWriter<Begin>
+{
+ private Begin _value;
+ private int _count = -1;
+
+ public BeginWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Begin value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getProperties() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getDesiredCapabilities() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getOfferedCapabilities() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getHandleMax() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getOutgoingWindow() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getIncomingWindow() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getNextOutgoingId() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getRemoteChannel() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000011L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Begin>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Begin value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getRemoteChannel();
+
+ case 1:
+ return _value.getNextOutgoingId();
+
+ case 2:
+ return _value.getIncomingWindow();
+
+ case 3:
+ return _value.getOutgoingWindow();
+
+ case 4:
+ return _value.getHandleMax();
+
+ case 5:
+ return _value.getOfferedCapabilities();
+
+ case 6:
+ return _value.getDesiredCapabilities();
+
+ case 7:
+ return _value.getProperties();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Begin> FACTORY = new Factory<Begin>()
+ {
+
+ public ValueWriter<Begin> newInstance(Registry registry)
+ {
+ return new BeginWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Begin.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseConstructor.java
new file mode 100644
index 0000000000..69544dc96f
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Close;
+
+
+import java.util.List;
+
+public class CloseConstructor extends DescribedTypeConstructor<Close>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:close:list"),UnsignedLong.valueOf(0x0000000000000018L),
+ };
+
+ private static final CloseConstructor INSTANCE = new CloseConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Close construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Close obj = new Close();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setError( (org.apache.qpid.amqp_1_0.type.transport.Error) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseWriter.java
new file mode 100644
index 0000000000..96313efcb9
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Close;
+
+public class CloseWriter extends AbstractDescribedTypeWriter<Close>
+{
+ private Close _value;
+ private int _count = -1;
+
+ public CloseWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Close value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getError() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000018L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Close>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Close value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getError();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Close> FACTORY = new Factory<Close>()
+ {
+
+ public ValueWriter<Close> newInstance(Registry registry)
+ {
+ return new CloseWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Close.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachConstructor.java
new file mode 100644
index 0000000000..8d90d39769
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachConstructor.java
@@ -0,0 +1,153 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Detach;
+
+
+import java.util.List;
+
+public class DetachConstructor extends DescribedTypeConstructor<Detach>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:detach:list"),UnsignedLong.valueOf(0x0000000000000016L),
+ };
+
+ private static final DetachConstructor INSTANCE = new DetachConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Detach construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Detach obj = new Detach();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHandle( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setClosed( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setError( (org.apache.qpid.amqp_1_0.type.transport.Error) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachWriter.java
new file mode 100644
index 0000000000..620f087f98
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachWriter.java
@@ -0,0 +1,166 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Detach;
+
+public class DetachWriter extends AbstractDescribedTypeWriter<Detach>
+{
+ private Detach _value;
+ private int _count = -1;
+
+ public DetachWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Detach value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getError() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getClosed() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getHandle() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000016L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Detach>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Detach value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getHandle();
+
+ case 1:
+ return _value.getClosed();
+
+ case 2:
+ return _value.getError();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Detach> FACTORY = new Factory<Detach>()
+ {
+
+ public ValueWriter<Detach> newInstance(Registry registry)
+ {
+ return new DetachWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Detach.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionConstructor.java
new file mode 100644
index 0000000000..928f54ea97
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionConstructor.java
@@ -0,0 +1,234 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Disposition;
+
+
+import java.util.List;
+
+public class DispositionConstructor extends DescribedTypeConstructor<Disposition>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:disposition:list"),UnsignedLong.valueOf(0x0000000000000015L),
+ };
+
+ private static final DispositionConstructor INSTANCE = new DispositionConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Disposition construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Disposition obj = new Disposition();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setRole( Role.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setFirst( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setLast( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSettled( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setState( (DeliveryState) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setBatchable( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionWriter.java
new file mode 100644
index 0000000000..3bfdf840ab
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionWriter.java
@@ -0,0 +1,190 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Disposition;
+
+public class DispositionWriter extends AbstractDescribedTypeWriter<Disposition>
+{
+ private Disposition _value;
+ private int _count = -1;
+
+ public DispositionWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Disposition value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getBatchable() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getState() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getSettled() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getLast() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getFirst() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getRole() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000015L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Disposition>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Disposition value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getRole();
+
+ case 1:
+ return _value.getFirst();
+
+ case 2:
+ return _value.getLast();
+
+ case 3:
+ return _value.getSettled();
+
+ case 4:
+ return _value.getState();
+
+ case 5:
+ return _value.getBatchable();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Disposition> FACTORY = new Factory<Disposition>()
+ {
+
+ public ValueWriter<Disposition> newInstance(Registry registry)
+ {
+ return new DispositionWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Disposition.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndConstructor.java
new file mode 100644
index 0000000000..0f8fe63d55
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.End;
+
+
+import java.util.List;
+
+public class EndConstructor extends DescribedTypeConstructor<End>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:end:list"),UnsignedLong.valueOf(0x0000000000000017L),
+ };
+
+ private static final EndConstructor INSTANCE = new EndConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public End construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ End obj = new End();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setError( (org.apache.qpid.amqp_1_0.type.transport.Error) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndWriter.java
new file mode 100644
index 0000000000..af6a11ae09
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.End;
+
+public class EndWriter extends AbstractDescribedTypeWriter<End>
+{
+ private End _value;
+ private int _count = -1;
+
+ public EndWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final End value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getError() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000017L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<End>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final End value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getError();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<End> FACTORY = new Factory<End>()
+ {
+
+ public ValueWriter<End> newInstance(Registry registry)
+ {
+ return new EndWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(End.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorConstructor.java
new file mode 100644
index 0000000000..6d745adb7e
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorConstructor.java
@@ -0,0 +1,169 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionErrors;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class ErrorConstructor extends DescribedTypeConstructor<org.apache.qpid.amqp_1_0.type.transport.Error>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:error:list"),UnsignedLong.valueOf(0x000000000000001dL),
+ };
+
+ private static final ErrorConstructor INSTANCE = new ErrorConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public org.apache.qpid.amqp_1_0.type.transport.Error construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ org.apache.qpid.amqp_1_0.type.transport.Error obj = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+ if(val instanceof ErrorCondition)
+ {
+ obj.setCondition( (ErrorCondition) val );
+ }
+ else if(val instanceof Symbol)
+ {
+ ErrorCondition condition = null;
+ condition = AmqpError.valueOf(val);
+ if(condition == null)
+ {
+ condition = ConnectionError.valueOf(val);
+ if(condition == null)
+ {
+ condition = SessionError.valueOf(val);
+ if(condition == null)
+ {
+ condition = LinkError.valueOf(val);
+ if(condition == null)
+ {
+ condition = TransactionErrors.valueOf(val);
+ }
+ }
+ }
+ }
+ obj.setCondition(condition);
+ }
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDescription( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setInfo( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorWriter.java
new file mode 100644
index 0000000000..6c5ebc5dc6
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorWriter.java
@@ -0,0 +1,166 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+public class ErrorWriter extends AbstractDescribedTypeWriter<Error>
+{
+ private Error _value;
+ private int _count = -1;
+
+ public ErrorWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Error value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getInfo() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getDescription() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getCondition() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x000000000000001dL);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Error>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Error value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getCondition();
+
+ case 1:
+ return _value.getDescription();
+
+ case 2:
+ return _value.getInfo();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Error> FACTORY = new Factory<Error>()
+ {
+
+ public ValueWriter<Error> newInstance(Registry registry)
+ {
+ return new ErrorWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Error.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowConstructor.java
new file mode 100644
index 0000000000..406b5a327a
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowConstructor.java
@@ -0,0 +1,370 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Flow;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class FlowConstructor extends DescribedTypeConstructor<Flow>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:flow:list"),UnsignedLong.valueOf(0x0000000000000013L),
+ };
+
+ private static final FlowConstructor INSTANCE = new FlowConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Flow construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Flow obj = new Flow();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setNextIncomingId( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setIncomingWindow( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setNextOutgoingId( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setOutgoingWindow( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHandle( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDeliveryCount( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setLinkCredit( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setAvailable( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDrain( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setEcho( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setProperties( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowWriter.java
new file mode 100644
index 0000000000..a866491cea
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowWriter.java
@@ -0,0 +1,230 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Flow;
+
+public class FlowWriter extends AbstractDescribedTypeWriter<Flow>
+{
+ private Flow _value;
+ private int _count = -1;
+
+ public FlowWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Flow value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getProperties() != null)
+ {
+ return 11;
+ }
+
+ if( _value.getEcho() != null)
+ {
+ return 10;
+ }
+
+ if( _value.getDrain() != null)
+ {
+ return 9;
+ }
+
+ if( _value.getAvailable() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getLinkCredit() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getDeliveryCount() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getHandle() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getOutgoingWindow() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getNextOutgoingId() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getIncomingWindow() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getNextIncomingId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000013L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Flow>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Flow value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getNextIncomingId();
+
+ case 1:
+ return _value.getIncomingWindow();
+
+ case 2:
+ return _value.getNextOutgoingId();
+
+ case 3:
+ return _value.getOutgoingWindow();
+
+ case 4:
+ return _value.getHandle();
+
+ case 5:
+ return _value.getDeliveryCount();
+
+ case 6:
+ return _value.getLinkCredit();
+
+ case 7:
+ return _value.getAvailable();
+
+ case 8:
+ return _value.getDrain();
+
+ case 9:
+ return _value.getEcho();
+
+ case 10:
+ return _value.getProperties();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Flow> FACTORY = new Factory<Flow>()
+ {
+
+ public ValueWriter<Flow> newInstance(Registry registry)
+ {
+ return new FlowWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Flow.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenConstructor.java
new file mode 100644
index 0000000000..ba2df038e4
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenConstructor.java
@@ -0,0 +1,371 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Open;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class OpenConstructor extends DescribedTypeConstructor<Open>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:open:list"),UnsignedLong.valueOf(0x0000000000000010L),
+ };
+
+ private static final OpenConstructor INSTANCE = new OpenConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Open construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Open obj = new Open();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setContainerId( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHostname( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMaxFrameSize( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setChannelMax( (UnsignedShort) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setIdleTimeOut( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setOutgoingLocales( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setOutgoingLocales( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setIncomingLocales( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setIncomingLocales( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setOfferedCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setOfferedCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setDesiredCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setDesiredCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setProperties( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenWriter.java
new file mode 100644
index 0000000000..f512384a20
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenWriter.java
@@ -0,0 +1,222 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Open;
+
+public class OpenWriter extends AbstractDescribedTypeWriter<Open>
+{
+ private Open _value;
+ private int _count = -1;
+
+ public OpenWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Open value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getProperties() != null)
+ {
+ return 10;
+ }
+
+ if( _value.getDesiredCapabilities() != null)
+ {
+ return 9;
+ }
+
+ if( _value.getOfferedCapabilities() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getIncomingLocales() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getOutgoingLocales() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getIdleTimeOut() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getChannelMax() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getMaxFrameSize() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getHostname() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getContainerId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000010L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Open>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Open value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getContainerId();
+
+ case 1:
+ return _value.getHostname();
+
+ case 2:
+ return _value.getMaxFrameSize();
+
+ case 3:
+ return _value.getChannelMax();
+
+ case 4:
+ return _value.getIdleTimeOut();
+
+ case 5:
+ return _value.getOutgoingLocales();
+
+ case 6:
+ return _value.getIncomingLocales();
+
+ case 7:
+ return _value.getOfferedCapabilities();
+
+ case 8:
+ return _value.getDesiredCapabilities();
+
+ case 9:
+ return _value.getProperties();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Open> FACTORY = new Factory<Open>()
+ {
+
+ public ValueWriter<Open> newInstance(Registry registry)
+ {
+ return new OpenWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Open.class, FACTORY);
+ }
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferConstructor.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferConstructor.java
new file mode 100644
index 0000000000..ad3812bbdc
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferConstructor.java
@@ -0,0 +1,369 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+
+import java.util.List;
+
+public class TransferConstructor extends DescribedTypeConstructor<Transfer>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:transfer:list"),UnsignedLong.valueOf(0x0000000000000014L),
+ };
+
+ private static final TransferConstructor INSTANCE = new TransferConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Transfer construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Transfer obj = new Transfer();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHandle( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDeliveryId( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDeliveryTag( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMessageFormat( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSettled( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMore( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setRcvSettleMode( ReceiverSettleMode.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setState( (DeliveryState) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setResume( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setAborted( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setBatchable( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferWriter.java b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferWriter.java
new file mode 100644
index 0000000000..f2252cfc4a
--- /dev/null
+++ b/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferWriter.java
@@ -0,0 +1,230 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+public class TransferWriter extends AbstractDescribedTypeWriter<Transfer>
+{
+ private Transfer _value;
+ private int _count = -1;
+
+ public TransferWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Transfer value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getBatchable() != null)
+ {
+ return 11;
+ }
+
+ if( _value.getAborted() != null)
+ {
+ return 10;
+ }
+
+ if( _value.getResume() != null)
+ {
+ return 9;
+ }
+
+ if( _value.getState() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getRcvSettleMode() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getMore() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getSettled() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getMessageFormat() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getDeliveryTag() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getDeliveryId() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getHandle() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000014L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Transfer>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Transfer value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getHandle();
+
+ case 1:
+ return _value.getDeliveryId();
+
+ case 2:
+ return _value.getDeliveryTag();
+
+ case 3:
+ return _value.getMessageFormat();
+
+ case 4:
+ return _value.getSettled();
+
+ case 5:
+ return _value.getMore();
+
+ case 6:
+ return _value.getRcvSettleMode();
+
+ case 7:
+ return _value.getState();
+
+ case 8:
+ return _value.getResume();
+
+ case 9:
+ return _value.getAborted();
+
+ case 10:
+ return _value.getBatchable();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Transfer> FACTORY = new Factory<Transfer>()
+ {
+
+ public ValueWriter<Transfer> newInstance(Registry registry)
+ {
+ return new TransferWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Transfer.class, FACTORY);
+ }
+
+}
diff --git a/java/bdbstore/bin/backup.sh b/java/bdbstore/bin/backup.sh
index 0fa1d57392..f3386e79dc 100755
--- a/java/bdbstore/bin/backup.sh
+++ b/java/bdbstore/bin/backup.sh
@@ -34,7 +34,7 @@ if [ -z "${QPID_HOME}" ]; then
export QPID_HOME=`cd ${WHEREAMI}/../ && pwd`
fi
-VERSION=0.15
+VERSION=0.17
# BDB's je JAR expected to be found in lib/opt
LIBS="${QPID_HOME}/lib/opt/*:${QPID_HOME}/lib/qpid-bdbstore-${VERSION}.jar:${QPID_HOME}/lib/qpid-all.jar"
diff --git a/java/bdbstore/bin/storeUpgrade.sh b/java/bdbstore/bin/storeUpgrade.sh
deleted file mode 100755
index 4c13f8d178..0000000000
--- a/java/bdbstore/bin/storeUpgrade.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-declare -a ARGS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS[${#ARGS[@]}]="$arg"
- fi
-done
-
-if [ -z "${QPID_HOME}" ]; then
- WHEREAMI=`dirname "$0"`
- export QPID_HOME=`cd ${WHEREAMI}/../ && pwd`
-fi
-
-VERSION=0.15
-
-# BDB's je JAR expected to be found in lib/opt
-LIBS="$QPID_HOME/lib/opt/*:$QPID_HOME/lib/qpid-bdbstore-${VERSION}.jar:$QPID_HOME/lib/qpid-all.jar"
-
-java -Xms256m -Dlog4j.configuration=BDBStoreUpgrade.log4j.xml -Xmx256m -Damqj.logging.level=warn ${JAVA_OPTS} -cp "${LIBS}" org.apache.qpid.server.store.berkeleydb.BDBStoreUpgrade "${ARGS[@]}"
diff --git a/java/bdbstore/build.xml b/java/bdbstore/build.xml
index af7c108aa9..7e55b41b28 100644
--- a/java/bdbstore/build.xml
+++ b/java/bdbstore/build.xml
@@ -18,7 +18,7 @@
-->
<project name="bdbstore" default="build">
<property name="module.depends" value="common broker" />
- <property name="module.test.depends" value="test client common/test broker/test management/common perftests systests" />
+ <property name="module.test.depends" value="test client common/test broker/test management/common systests" />
<property name="module.genpom" value="true"/>
<import file="../module.xml" />
@@ -81,4 +81,11 @@ http://www.oracle.com/technetwork/database/berkeleydb/downloads/jeoslicense-0868
<fileset dir="src/test/resources/upgrade"/>
</copy>
</target>
+
+ <target name="precompile-tests">
+ <mkdir dir="${module.test.resources}"/>
+ <copy todir="${module.test.resources}">
+ <fileset dir="src/test/resources"/>
+ </copy>
+ </target>
</project>
diff --git a/java/bdbstore/etc/scripts/bdbtest.sh b/java/bdbstore/etc/scripts/bdbtest.sh
deleted file mode 100755
index d53481c393..0000000000
--- a/java/bdbstore/etc/scripts/bdbtest.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-if [ -z "$QPID_HOME" ]; then
- export QPID_HOME=$(dirname $(dirname $(readlink -f $0)))
- export PATH=${PATH}:${QPID_HOME}/bin
-fi
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-VERSION=0.15
-
-# Set classpath to include Qpid jar with all required jars in manifest
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar:$QPID_HOME/lib/qpid-junit-toolkit-$VERSION.jar:$QPID_HOME/lib/junit-3.8.1.jar:$QPID_HOME/lib/log4j-1.2.12.jar:$QPID_HOME/lib/qpid-systests-$VERSION.jar:$QPID_HOME/lib/qpid-perftests-$VERSION.jar:$QPID_HOME/lib/slf4j-log4j12-1.6.1.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java JAVA_MEM=-Xmx256m QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Dlog4j.configuration=perftests.log4j -Dbadger.level=warn -Damqj.test.logging.level=warn -Damqj.logging.level=warn ${JAVA_OPTS} org.apache.qpid.ping.PingDurableClient -o $QPID_WORK/results ${ARGS}
diff --git a/java/bdbstore/src/main/java/BDBStoreUpgrade.log4j.xml b/java/bdbstore/src/main/java/BDBStoreUpgrade.log4j.xml
deleted file mode 100644
index 4d71963ea7..0000000000
--- a/java/bdbstore/src/main/java/BDBStoreUpgrade.log4j.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0"?>
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
- - or more contributor license agreements. See the NOTICE file
- - distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
- -->
-<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
- <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
-
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d %-5p - %m%n"/>
- </layout>
- </appender>
-
- <category name="org.apache.qpid.server.store.berkeleydb.BDBStoreUpgrade">
- <priority value="info"/>
- </category>
-
- <!-- Only show errors from the BDB Store -->
- <category name="org.apache.qpid.server.store.berkeleydb.berkeleydb.BDBMessageStore">
- <priority value="error"/>
- </category>
-
- <!-- Provide warnings to standard output -->
- <category name="org.apache.qpid">
- <priority value="error"/>
- </category>
-
- <!-- Log all info events to file -->
- <root>
- <priority value="info"/>
- <appender-ref ref="STDOUT"/>
- </root>
-
-</log4j:configuration>
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AMQShortStringEncoding.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AMQShortStringEncoding.java
index 354dba559c..2186597380 100644
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AMQShortStringEncoding.java
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AMQShortStringEncoding.java
@@ -33,7 +33,7 @@ public class AMQShortStringEncoding
public static AMQShortString readShortString(TupleInput tupleInput)
{
- int length = (int) tupleInput.readShort();
+ int length = tupleInput.readShort();
if (length < 0)
{
return null;
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AMQShortStringTB.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AMQShortStringTB.java
deleted file mode 100644
index 351b5b4f5b..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AMQShortStringTB.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.framing.AMQShortString;
-
-public class AMQShortStringTB extends TupleBinding
-{
- private static final Logger _log = Logger.getLogger(AMQShortStringTB.class);
-
-
- public AMQShortStringTB()
- {
- }
-
- public Object entryToObject(TupleInput tupleInput)
- {
- return AMQShortStringEncoding.readShortString(tupleInput);
- }
-
- public void objectToEntry(Object object, TupleOutput tupleOutput)
- {
- AMQShortStringEncoding.writeShortString((AMQShortString)object, tupleOutput);
- }
-
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
new file mode 100644
index 0000000000..fb1d7c5265
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
@@ -0,0 +1,1825 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb;
+
+import com.sleepycat.bind.tuple.ByteBinding;
+import com.sleepycat.bind.tuple.LongBinding;
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+import com.sleepycat.je.LockConflictException;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+import com.sleepycat.je.TransactionConfig;
+import java.io.File;
+import java.lang.ref.SoftReference;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.commons.configuration.Configuration;
+import org.apache.log4j.Logger;
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.binding.Binding;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.federation.Bridge;
+import org.apache.qpid.server.federation.BrokerLink;
+import org.apache.qpid.server.message.EnqueableMessage;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.BindingRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.ExchangeRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.QueueRecoveryHandler;
+import org.apache.qpid.server.store.ConfiguredObjectHelper;
+import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.apache.qpid.server.store.Event;
+import org.apache.qpid.server.store.EventListener;
+import org.apache.qpid.server.store.EventManager;
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreRecoveryHandler;
+import org.apache.qpid.server.store.MessageStoreRecoveryHandler.StoredMessageRecoveryHandler;
+import org.apache.qpid.server.store.State;
+import org.apache.qpid.server.store.StateManager;
+import org.apache.qpid.server.store.StorableMessageMetaData;
+import org.apache.qpid.server.store.StoreFuture;
+import org.apache.qpid.server.store.StoredMemoryMessage;
+import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.store.TransactionLogRecoveryHandler;
+import org.apache.qpid.server.store.TransactionLogRecoveryHandler.QueueEntryRecoveryHandler;
+import org.apache.qpid.server.store.TransactionLogResource;
+import org.apache.qpid.server.store.ConfiguredObjectRecord;
+import org.apache.qpid.server.store.berkeleydb.entry.PreparedTransaction;
+import org.apache.qpid.server.store.berkeleydb.entry.QueueEntryKey;
+import org.apache.qpid.server.store.berkeleydb.entry.Xid;
+import org.apache.qpid.server.store.berkeleydb.tuple.ConfiguredObjectBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.ContentBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.MessageMetaDataBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.PreparedTransactionBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.QueueEntryBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.StringMapBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.UUIDTupleBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.XidBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.Upgrader;
+
+public abstract class AbstractBDBMessageStore implements MessageStore
+{
+ private static final Logger LOGGER = Logger.getLogger(AbstractBDBMessageStore.class);
+
+ private static final int LOCK_RETRY_ATTEMPTS = 5;
+
+ public static final int VERSION = 6;
+
+ public static final String ENVIRONMENT_PATH_PROPERTY = "environment-path";
+
+ private Environment _environment;
+
+ private String CONFIGURED_OBJECTS = "CONFIGURED_OBJECTS";
+ private String MESSAGEMETADATADB_NAME = "MESSAGE_METADATA";
+ private String MESSAGECONTENTDB_NAME = "MESSAGE_CONTENT";
+ private String DELIVERYDB_NAME = "QUEUE_ENTRIES";
+ private String BRIDGEDB_NAME = "BRIDGES";
+ private String LINKDB_NAME = "LINKS";
+ private String XIDDB_NAME = "XIDS";
+
+ private Database _configuredObjectsDb;
+ private Database _messageMetaDataDb;
+ private Database _messageContentDb;
+ private Database _deliveryDb;
+ private Database _bridgeDb;
+ private Database _linkDb;
+ private Database _xidDb;
+
+ /* =======
+ * Schema:
+ * =======
+ *
+ * Queue:
+ * name(AMQShortString) - name(AMQShortString), owner(AMQShortString),
+ * arguments(FieldTable encoded as binary), exclusive (boolean)
+ *
+ * Exchange:
+ * name(AMQShortString) - name(AMQShortString), typeName(AMQShortString), autodelete (boolean)
+ *
+ * Binding:
+ * exchangeName(AMQShortString), queueName(AMQShortString), routingKey(AMQShortString),
+ * arguments (FieldTable encoded as binary) - 0 (zero)
+ *
+ * QueueEntry:
+ * queueName(AMQShortString), messageId (long) - 0 (zero)
+ *
+ * Message (MetaData):
+ * messageId (long) - bodySize (integer), metaData (MessageMetaData encoded as binary)
+ *
+ * Message (Content):
+ * messageId (long), byteOffset (integer) - dataLength(integer), data(binary)
+ */
+
+ private final AtomicLong _messageId = new AtomicLong(0);
+
+ protected final StateManager _stateManager;
+
+ protected TransactionConfig _transactionConfig = new TransactionConfig();
+
+ private MessageStoreRecoveryHandler _messageRecoveryHandler;
+
+ private TransactionLogRecoveryHandler _tlogRecoveryHandler;
+
+ private ConfigurationRecoveryHandler _configRecoveryHandler;
+
+ private final EventManager _eventManager = new EventManager();
+ private String _storeLocation;
+
+ private ConfiguredObjectHelper _configuredObjectHelper = new ConfiguredObjectHelper();
+
+ public AbstractBDBMessageStore()
+ {
+ _stateManager = new StateManager(_eventManager);
+ }
+
+ public void configureConfigStore(String name,
+ ConfigurationRecoveryHandler recoveryHandler,
+ Configuration storeConfiguration) throws Exception
+ {
+ _stateManager.attainState(State.CONFIGURING);
+
+ _configRecoveryHandler = recoveryHandler;
+
+ configure(name,storeConfiguration);
+
+
+
+ }
+
+ public void configureMessageStore(String name,
+ MessageStoreRecoveryHandler messageRecoveryHandler,
+ TransactionLogRecoveryHandler tlogRecoveryHandler,
+ Configuration storeConfiguration) throws Exception
+ {
+ _messageRecoveryHandler = messageRecoveryHandler;
+ _tlogRecoveryHandler = tlogRecoveryHandler;
+
+ _stateManager.attainState(State.CONFIGURED);
+ }
+
+ public void activate() throws Exception
+ {
+ _stateManager.attainState(State.RECOVERING);
+
+ recoverConfig(_configRecoveryHandler);
+ recoverMessages(_messageRecoveryHandler);
+ recoverQueueEntries(_tlogRecoveryHandler);
+
+ _stateManager.attainState(State.ACTIVE);
+ }
+
+ public org.apache.qpid.server.store.Transaction newTransaction()
+ {
+ return new BDBTransaction();
+ }
+
+
+ /**
+ * Called after instantiation in order to configure the message store.
+ *
+ * @param name The name of the virtual host using this store
+ * @return whether a new store environment was created or not (to indicate whether recovery is necessary)
+ *
+ * @throws Exception If any error occurs that means the store is unable to configure itself.
+ */
+ public void configure(String name, Configuration storeConfig) throws Exception
+ {
+ final String storeLocation = storeConfig.getString(ENVIRONMENT_PATH_PROPERTY,
+ System.getProperty("QPID_WORK") + File.separator + "bdbstore" + File.separator + name);
+
+ File environmentPath = new File(storeLocation);
+ if (!environmentPath.exists())
+ {
+ if (!environmentPath.mkdirs())
+ {
+ throw new IllegalArgumentException("Environment path " + environmentPath + " could not be read or created. "
+ + "Ensure the path is correct and that the permissions are correct.");
+ }
+ }
+
+ _storeLocation = storeLocation;
+
+ LOGGER.info("Configuring BDB message store");
+
+ setupStore(environmentPath, name);
+ }
+
+ /**
+ * Move the store state from INITIAL to ACTIVE without actually recovering.
+ *
+ * This is required if you do not want to perform recovery of the store data
+ *
+ * @throws AMQStoreException if the store is not in the correct state
+ */
+ void startWithNoRecover() throws AMQStoreException
+ {
+ _stateManager.attainState(State.CONFIGURING);
+ _stateManager.attainState(State.CONFIGURED);
+ _stateManager.attainState(State.RECOVERING);
+ _stateManager.attainState(State.ACTIVE);
+ }
+
+ protected void setupStore(File storePath, String name) throws DatabaseException, AMQStoreException
+ {
+ _environment = createEnvironment(storePath);
+
+ new Upgrader(_environment, name).upgradeIfNecessary();
+
+ openDatabases();
+ }
+
+ protected Environment createEnvironment(File environmentPath) throws DatabaseException
+ {
+ LOGGER.info("BDB message store using environment path " + environmentPath.getAbsolutePath());
+ EnvironmentConfig envConfig = new EnvironmentConfig();
+ // This is what allows the creation of the store if it does not already exist.
+ envConfig.setAllowCreate(true);
+ envConfig.setTransactional(true);
+ envConfig.setConfigParam("je.lock.nLockTables", "7");
+
+ // Added to help diagnosis of Deadlock issue
+ // http://www.oracle.com/technology/products/berkeley-db/faq/je_faq.html#23
+ if (Boolean.getBoolean("qpid.bdb.lock.debug"))
+ {
+ envConfig.setConfigParam("je.txn.deadlockStackTrace", "true");
+ envConfig.setConfigParam("je.txn.dumpLocks", "true");
+ }
+
+ // Set transaction mode
+ _transactionConfig.setReadCommitted(true);
+
+ //This prevents background threads running which will potentially update the store.
+ envConfig.setReadOnly(false);
+ try
+ {
+ return new Environment(environmentPath, envConfig);
+ }
+ catch (DatabaseException de)
+ {
+ if (de.getMessage().contains("Environment.setAllowCreate is false"))
+ {
+ //Allow the creation this time
+ envConfig.setAllowCreate(true);
+ if (_environment != null )
+ {
+ _environment.cleanLog();
+ _environment.close();
+ }
+ return new Environment(environmentPath, envConfig);
+ }
+ else
+ {
+ throw de;
+ }
+ }
+ }
+
+ public Environment getEnvironment()
+ {
+ return _environment;
+ }
+
+ private void openDatabases() throws DatabaseException
+ {
+ DatabaseConfig dbConfig = new DatabaseConfig();
+ dbConfig.setTransactional(true);
+ dbConfig.setAllowCreate(true);
+
+ //This is required if we are wanting read only access.
+ dbConfig.setReadOnly(false);
+
+ _configuredObjectsDb = openDatabase(CONFIGURED_OBJECTS, dbConfig);
+ _messageMetaDataDb = openDatabase(MESSAGEMETADATADB_NAME, dbConfig);
+ _messageContentDb = openDatabase(MESSAGECONTENTDB_NAME, dbConfig);
+ _deliveryDb = openDatabase(DELIVERYDB_NAME, dbConfig);
+ _linkDb = openDatabase(LINKDB_NAME, dbConfig);
+ _bridgeDb = openDatabase(BRIDGEDB_NAME, dbConfig);
+ _xidDb = openDatabase(XIDDB_NAME, dbConfig);
+ }
+
+ private Database openDatabase(final String dbName, final DatabaseConfig dbConfig)
+ {
+ // if opening read-only and the database doesn't exist, then you can't create it
+ return dbConfig.getReadOnly() && !_environment.getDatabaseNames().contains(dbName)
+ ? null
+ : _environment.openDatabase(null, dbName, dbConfig);
+ }
+
+ /**
+ * Called to close and cleanup any resources used by the message store.
+ *
+ * @throws Exception If the close fails.
+ */
+ public void close() throws Exception
+ {
+ if (_stateManager.isInState(State.ACTIVE) || _stateManager.isInState(State.QUIESCED))
+ {
+ _stateManager.stateTransition(State.ACTIVE, State.CLOSING);
+
+ closeInternal();
+
+ _stateManager.stateTransition(State.CLOSING, State.CLOSED);
+ }
+ }
+
+ protected void closeInternal() throws Exception
+ {
+ if (_messageMetaDataDb != null)
+ {
+ LOGGER.info("Closing message metadata database");
+ _messageMetaDataDb.close();
+ }
+
+ if (_messageContentDb != null)
+ {
+ LOGGER.info("Closing message content database");
+ _messageContentDb.close();
+ }
+
+ if (_configuredObjectsDb != null)
+ {
+ LOGGER.info("Closing configurable objects database");
+ _configuredObjectsDb.close();
+ }
+
+ if (_deliveryDb != null)
+ {
+ LOGGER.info("Close delivery database");
+ _deliveryDb.close();
+ }
+
+ if (_bridgeDb != null)
+ {
+ LOGGER.info("Close bridge database");
+ _bridgeDb.close();
+ }
+
+ if (_linkDb != null)
+ {
+ LOGGER.info("Close link database");
+ _linkDb.close();
+ }
+
+
+ if (_xidDb != null)
+ {
+ LOGGER.info("Close xid database");
+ _xidDb.close();
+ }
+
+ closeEnvironment();
+
+ }
+
+ private void closeEnvironment() throws DatabaseException
+ {
+ if (_environment != null)
+ {
+ // Clean the log before closing. This makes sure it doesn't contain
+ // redundant data. Closing without doing this means the cleaner may not
+ // get a chance to finish.
+ _environment.cleanLog();
+ _environment.close();
+ }
+ }
+
+
+ private void recoverConfig(ConfigurationRecoveryHandler recoveryHandler) throws AMQStoreException
+ {
+ try
+ {
+ List<ConfiguredObjectRecord> configuredObjects = loadConfiguredObjects();
+ QueueRecoveryHandler qrh = recoveryHandler.begin(this);
+ _configuredObjectHelper.recoverQueues(qrh, configuredObjects);
+
+ ExchangeRecoveryHandler erh = qrh.completeQueueRecovery();
+ _configuredObjectHelper.recoverExchanges(erh, configuredObjects);
+
+ BindingRecoveryHandler brh = erh.completeExchangeRecovery();
+ _configuredObjectHelper.recoverBindings(brh, configuredObjects);
+
+ ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh = brh.completeBindingRecovery();
+ recoverBrokerLinks(lrh);
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error recovering persistent state: " + e.getMessage(), e);
+ }
+
+ }
+
+ private List<ConfiguredObjectRecord> loadConfiguredObjects() throws DatabaseException
+ {
+ Cursor cursor = null;
+ List<ConfiguredObjectRecord> results = new ArrayList<ConfiguredObjectRecord>();
+ try
+ {
+ cursor = _configuredObjectsDb.openCursor(null, null);
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+ while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
+ {
+ ConfiguredObjectRecord configuredObject = ConfiguredObjectBinding.getInstance().entryToObject(value);
+ UUID id = UUIDTupleBinding.getInstance().entryToObject(key);
+ configuredObject.setId(id);
+ results.add(configuredObject);
+ }
+
+ }
+ finally
+ {
+ closeCursorSafely(cursor);
+ }
+ return results;
+ }
+
+ private void closeCursorSafely(Cursor cursor)
+ {
+ if (cursor != null)
+ {
+ cursor.close();
+ }
+ }
+
+ private void recoverBrokerLinks(final ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh)
+ {
+ Cursor cursor = null;
+
+ try
+ {
+ cursor = _linkDb.openCursor(null, null);
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+
+ while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
+ {
+ UUID id = UUIDTupleBinding.getInstance().entryToObject(key);
+ long createTime = LongBinding.entryToLong(value);
+ Map<String,String> arguments = StringMapBinding.getInstance().entryToObject(value);
+
+ ConfigurationRecoveryHandler.BridgeRecoveryHandler brh = lrh.brokerLink(id, createTime, arguments);
+
+ recoverBridges(brh, id);
+ }
+ }
+ finally
+ {
+ closeCursorSafely(cursor);
+ }
+
+ }
+
+ private void recoverBridges(final ConfigurationRecoveryHandler.BridgeRecoveryHandler brh, final UUID linkId)
+ {
+ Cursor cursor = null;
+
+ try
+ {
+ cursor = _bridgeDb.openCursor(null, null);
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+
+ while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
+ {
+ UUID id = UUIDTupleBinding.getInstance().entryToObject(key);
+
+ UUID parentId = UUIDTupleBinding.getInstance().entryToObject(value);
+ if(parentId.equals(linkId))
+ {
+
+ long createTime = LongBinding.entryToLong(value);
+ Map<String,String> arguments = StringMapBinding.getInstance().entryToObject(value);
+ brh.bridge(id,createTime,arguments);
+ }
+ }
+ brh.completeBridgeRecoveryForLink();
+ }
+ finally
+ {
+ closeCursorSafely(cursor);
+ }
+
+ }
+
+
+ private void recoverMessages(MessageStoreRecoveryHandler msrh) throws DatabaseException
+ {
+ StoredMessageRecoveryHandler mrh = msrh.begin();
+
+ Cursor cursor = null;
+ try
+ {
+ cursor = _messageMetaDataDb.openCursor(null, null);
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+ MessageMetaDataBinding valueBinding = MessageMetaDataBinding.getInstance();
+
+ long maxId = 0;
+
+ while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
+ {
+ long messageId = LongBinding.entryToLong(key);
+ StorableMessageMetaData metaData = valueBinding.entryToObject(value);
+
+ StoredBDBMessage message = new StoredBDBMessage(messageId, metaData, false);
+ mrh.message(message);
+
+ maxId = Math.max(maxId, messageId);
+ }
+
+ _messageId.set(maxId);
+ }
+ catch (DatabaseException e)
+ {
+ LOGGER.error("Database Error: " + e.getMessage(), e);
+ throw e;
+ }
+ finally
+ {
+ closeCursorSafely(cursor);
+ }
+ }
+
+ private void recoverQueueEntries(TransactionLogRecoveryHandler recoveryHandler)
+ throws DatabaseException
+ {
+ QueueEntryRecoveryHandler qerh = recoveryHandler.begin(this);
+
+ ArrayList<QueueEntryKey> entries = new ArrayList<QueueEntryKey>();
+
+ Cursor cursor = null;
+ try
+ {
+ cursor = _deliveryDb.openCursor(null, null);
+ DatabaseEntry key = new DatabaseEntry();
+ QueueEntryBinding keyBinding = QueueEntryBinding.getInstance();
+
+ DatabaseEntry value = new DatabaseEntry();
+ while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
+ {
+ QueueEntryKey qek = keyBinding.entryToObject(key);
+
+ entries.add(qek);
+ }
+
+ try
+ {
+ cursor.close();
+ }
+ finally
+ {
+ cursor = null;
+ }
+
+ for(QueueEntryKey entry : entries)
+ {
+ UUID queueId = entry.getQueueId();
+ long messageId = entry.getMessageId();
+ qerh.queueEntry(queueId, messageId);
+ }
+ }
+ catch (DatabaseException e)
+ {
+ LOGGER.error("Database Error: " + e.getMessage(), e);
+ throw e;
+ }
+ finally
+ {
+ closeCursorSafely(cursor);
+ }
+
+ TransactionLogRecoveryHandler.DtxRecordRecoveryHandler dtxrh = qerh.completeQueueEntryRecovery();
+
+ cursor = null;
+ try
+ {
+ cursor = _xidDb.openCursor(null, null);
+ DatabaseEntry key = new DatabaseEntry();
+ XidBinding keyBinding = XidBinding.getInstance();
+ PreparedTransactionBinding valueBinding = new PreparedTransactionBinding();
+ DatabaseEntry value = new DatabaseEntry();
+
+ while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
+ {
+ Xid xid = keyBinding.entryToObject(key);
+ PreparedTransaction preparedTransaction = valueBinding.entryToObject(value);
+ dtxrh.dtxRecord(xid.getFormat(),xid.getGlobalId(),xid.getBranchId(),
+ preparedTransaction.getEnqueues(),preparedTransaction.getDequeues());
+ }
+
+ }
+ catch (DatabaseException e)
+ {
+ LOGGER.error("Database Error: " + e.getMessage(), e);
+ throw e;
+ }
+ finally
+ {
+ closeCursorSafely(cursor);
+ }
+
+
+ dtxrh.completeDtxRecordRecovery();
+ }
+
+ public void removeMessage(long messageId, boolean sync) throws AMQStoreException
+ {
+
+ boolean complete = false;
+ com.sleepycat.je.Transaction tx = null;
+
+ Random rand = null;
+ int attempts = 0;
+ try
+ {
+ do
+ {
+ tx = null;
+ try
+ {
+ tx = _environment.beginTransaction(null, null);
+
+ //remove the message meta data from the store
+ DatabaseEntry key = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, key);
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Removing message id " + messageId);
+ }
+
+
+ OperationStatus status = _messageMetaDataDb.delete(tx, key);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ LOGGER.info("Message not found (attempt to remove failed - probably application initiated rollback) " +
+ messageId);
+ }
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Deleted metadata for message " + messageId);
+ }
+
+ //now remove the content data from the store if there is any.
+ DatabaseEntry contentKeyEntry = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, contentKeyEntry);
+ _messageContentDb.delete(tx, contentKeyEntry);
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Deleted content for message " + messageId);
+ }
+
+ commit(tx, sync);
+ complete = true;
+ tx = null;
+ }
+ catch (LockConflictException e)
+ {
+ try
+ {
+ if(tx != null)
+ {
+ tx.abort();
+ }
+ }
+ catch(DatabaseException e2)
+ {
+ LOGGER.warn("Unable to abort transaction after LockConflictExcption", e2);
+ // rethrow the original log conflict exception, the secondary exception should already have
+ // been logged.
+ throw e;
+ }
+
+
+ LOGGER.warn("Lock timeout exception. Retrying (attempt "
+ + (attempts+1) + " of "+ LOCK_RETRY_ATTEMPTS +") " + e);
+
+ if(++attempts < LOCK_RETRY_ATTEMPTS)
+ {
+ if(rand == null)
+ {
+ rand = new Random();
+ }
+
+ try
+ {
+ Thread.sleep(500l + (long)(500l * rand.nextDouble()));
+ }
+ catch (InterruptedException e1)
+ {
+
+ }
+ }
+ else
+ {
+ // rethrow the lock conflict exception since we could not solve by retrying
+ throw e;
+ }
+ }
+ }
+ while(!complete);
+ }
+ catch (DatabaseException e)
+ {
+ LOGGER.error("Unexpected BDB exception", e);
+
+ if (tx != null)
+ {
+ try
+ {
+ tx.abort();
+ tx = null;
+ }
+ catch (DatabaseException e1)
+ {
+ throw new AMQStoreException("Error aborting transaction " + e1, e1);
+ }
+ }
+
+ throw new AMQStoreException("Error removing message with id " + messageId + " from database: " + e.getMessage(), e);
+ }
+ finally
+ {
+ if (tx != null)
+ {
+ try
+ {
+ tx.abort();
+ tx = null;
+ }
+ catch (DatabaseException e1)
+ {
+ throw new AMQStoreException("Error aborting transaction " + e1, e1);
+ }
+ }
+ }
+ }
+
+ /**
+ * @see DurableConfigurationStore#createExchange(Exchange)
+ */
+ public void createExchange(Exchange exchange) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ ConfiguredObjectRecord configuredObject = _configuredObjectHelper.createExchangeConfiguredObject(exchange);
+ storeConfiguredObjectEntry(configuredObject);
+ }
+ }
+
+ /**
+ * @see DurableConfigurationStore#removeExchange(Exchange)
+ */
+ public void removeExchange(Exchange exchange) throws AMQStoreException
+ {
+ UUID id = exchange.getId();
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("public void removeExchange(String name = " + exchange.getName() + ", uuid = " + id + "): called");
+ }
+ OperationStatus status = removeConfiguredObject(id);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Exchange " + exchange.getName() + " with id " + id + " not found");
+ }
+ }
+
+
+ /**
+ * @see DurableConfigurationStore#bindQueue(Binding)
+ */
+ public void bindQueue(Binding binding) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ ConfiguredObjectRecord configuredObject = _configuredObjectHelper.createBindingConfiguredObject(binding);
+ storeConfiguredObjectEntry(configuredObject);
+ }
+ }
+
+ /**
+ * @see DurableConfigurationStore#unbindQueue(Binding)
+ */
+ public void unbindQueue(Binding binding)
+ throws AMQStoreException
+ {
+ UUID id = binding.getId();
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("public void unbindQueue(Binding binding = " + binding + ", uuid = " + id + "): called");
+ }
+
+ OperationStatus status = removeConfiguredObject(id);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Binding " + binding + " not found");
+ }
+ }
+
+ /**
+ * @see DurableConfigurationStore#createQueue(AMQQueue)
+ */
+ public void createQueue(AMQQueue queue) throws AMQStoreException
+ {
+ createQueue(queue, null);
+ }
+
+ /**
+ * @see DurableConfigurationStore#createQueue(AMQQueue, FieldTable)
+ */
+ public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("public void createQueue(AMQQueue queue(" + queue.getName() + "), queue id" + queue.getId()
+ + ", arguments=" + arguments + "): called");
+ }
+ ConfiguredObjectRecord configuredObject = _configuredObjectHelper.createQueueConfiguredObject(queue, arguments);
+ storeConfiguredObjectEntry(configuredObject);
+ }
+ }
+
+ /**
+ * Updates the specified queue in the persistent store, IF it is already present. If the queue
+ * is not present in the store, it will not be added.
+ *
+ * @param queue The queue to update the entry for.
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ public void updateQueue(final AMQQueue queue) throws AMQStoreException
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Updating queue: " + queue.getName());
+ }
+
+ try
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding keyBinding = UUIDTupleBinding.getInstance();
+ keyBinding.objectToEntry(queue.getId(), key);
+
+ DatabaseEntry value = new DatabaseEntry();
+ DatabaseEntry newValue = new DatabaseEntry();
+ ConfiguredObjectBinding configuredObjectBinding = ConfiguredObjectBinding.getInstance();
+
+ OperationStatus status = _configuredObjectsDb.get(null, key, value, LockMode.DEFAULT);
+ if (status == OperationStatus.SUCCESS)
+ {
+ ConfiguredObjectRecord queueRecord = configuredObjectBinding.entryToObject(value);
+ ConfiguredObjectRecord newQueueRecord = _configuredObjectHelper.updateQueueConfiguredObject(queue, queueRecord);
+
+ // write the updated entry to the store
+ configuredObjectBinding.objectToEntry(newQueueRecord, newValue);
+ status = _configuredObjectsDb.put(null, key, newValue);
+ if (status != OperationStatus.SUCCESS)
+ {
+ throw new AMQStoreException("Error updating queue details within the store: " + status);
+ }
+ }
+ else if (status != OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Error finding queue details within the store: " + status);
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error updating queue details within the store: " + e,e);
+ }
+ }
+
+ /**
+ * Removes the specified queue from the persistent store.
+ *
+ * @param queue The queue to remove.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ public void removeQueue(final AMQQueue queue) throws AMQStoreException
+ {
+ UUID id = queue.getId();
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("public void removeQueue(AMQShortString name = " + queue.getName() + ", uuid = " + id + "): called");
+ }
+
+ OperationStatus status = removeConfiguredObject(id);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Queue " + queue.getName() + " with id " + id + " not found");
+ }
+ }
+
+ public void createBrokerLink(final BrokerLink link) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding.getInstance().objectToEntry(link.getId(), key);
+
+ DatabaseEntry value = new DatabaseEntry();
+ LongBinding.longToEntry(link.getCreateTime(),value);
+ StringMapBinding.getInstance().objectToEntry(link.getArguments(), value);
+
+ try
+ {
+ _linkDb.put(null, key, value);
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error writing Link " + link
+ + " to database: " + e.getMessage(), e);
+ }
+ }
+ }
+
+ public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding.getInstance().objectToEntry(link.getId(), key);
+ try
+ {
+ OperationStatus status = _linkDb.delete(null, key);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Link " + link + " not found");
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error deleting the Link " + link + " from database: " + e.getMessage(), e);
+ }
+ }
+
+ public void createBridge(final Bridge bridge) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding.getInstance().objectToEntry(bridge.getId(), key);
+
+ DatabaseEntry value = new DatabaseEntry();
+ UUIDTupleBinding.getInstance().objectToEntry(bridge.getLink().getId(),value);
+ LongBinding.longToEntry(bridge.getCreateTime(),value);
+ StringMapBinding.getInstance().objectToEntry(bridge.getArguments(), value);
+
+ try
+ {
+ _bridgeDb.put(null, key, value);
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error writing Bridge " + bridge
+ + " to database: " + e.getMessage(), e);
+ }
+
+ }
+ }
+
+ public void deleteBridge(final Bridge bridge) throws AMQStoreException
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding.getInstance().objectToEntry(bridge.getId(), key);
+ try
+ {
+ OperationStatus status = _bridgeDb.delete(null, key);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Bridge " + bridge + " not found");
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error deleting the Bridge " + bridge + " from database: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Places a message onto a specified queue, in a given transaction.
+ *
+ * @param tx The transaction for the operation.
+ * @param queue The the queue to place the message on.
+ * @param messageId The message to enqueue.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ public void enqueueMessage(final com.sleepycat.je.Transaction tx, final TransactionLogResource queue,
+ long messageId) throws AMQStoreException
+ {
+
+ DatabaseEntry key = new DatabaseEntry();
+ QueueEntryBinding keyBinding = QueueEntryBinding.getInstance();
+ QueueEntryKey dd = new QueueEntryKey(queue.getId(), messageId);
+ keyBinding.objectToEntry(dd, key);
+ DatabaseEntry value = new DatabaseEntry();
+ ByteBinding.byteToEntry((byte) 0, value);
+
+ try
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Enqueuing message " + messageId + " on queue "
+ + (queue instanceof AMQQueue ? ((AMQQueue) queue).getName() + " with id " : "") + queue.getId()
+ + " [Transaction" + tx + "]");
+ }
+ _deliveryDb.put(tx, key, value);
+ }
+ catch (DatabaseException e)
+ {
+ LOGGER.error("Failed to enqueue: " + e.getMessage(), e);
+ throw new AMQStoreException("Error writing enqueued message with id " + messageId + " for queue "
+ + (queue instanceof AMQQueue ? ((AMQQueue) queue).getName() + " with id " : "") + queue.getId()
+ + " to database", e);
+ }
+ }
+
+ /**
+ * Extracts a message from a specified queue, in a given transaction.
+ *
+ * @param tx The transaction for the operation.
+ * @param queue The queue to take the message from.
+ * @param messageId The message to dequeue.
+ *
+ * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
+ */
+ public void dequeueMessage(final com.sleepycat.je.Transaction tx, final TransactionLogResource queue,
+ long messageId) throws AMQStoreException
+ {
+
+ DatabaseEntry key = new DatabaseEntry();
+ QueueEntryBinding keyBinding = QueueEntryBinding.getInstance();
+ QueueEntryKey queueEntryKey = new QueueEntryKey(queue.getId(), messageId);
+ UUID id = queue.getId();
+ keyBinding.objectToEntry(queueEntryKey, key);
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Dequeue message id " + messageId + " from queue "
+ + (queue instanceof AMQQueue ? ((AMQQueue) queue).getName() + " with id " : "") + id);
+ }
+
+ try
+ {
+
+ OperationStatus status = _deliveryDb.delete(tx, key);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Unable to find message with id " + messageId + " on queue "
+ + (queue instanceof AMQQueue ? ((AMQQueue) queue).getName() + " with id " : "") + id);
+ }
+ else if (status != OperationStatus.SUCCESS)
+ {
+ throw new AMQStoreException("Unable to remove message with id " + messageId + " on queue"
+ + (queue instanceof AMQQueue ? ((AMQQueue) queue).getName() + " with id " : "") + id);
+ }
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Removed message " + messageId + " on queue "
+ + (queue instanceof AMQQueue ? ((AMQQueue) queue).getName() + " with id " : "") + id
+ + " from delivery db");
+
+ }
+ }
+ catch (DatabaseException e)
+ {
+
+ LOGGER.error("Failed to dequeue message " + messageId + ": " + e.getMessage(), e);
+ LOGGER.error(tx);
+
+ throw new AMQStoreException("Error accessing database while dequeuing message: " + e.getMessage(), e);
+ }
+ }
+
+
+ private void recordXid(com.sleepycat.je.Transaction txn,
+ long format,
+ byte[] globalId,
+ byte[] branchId,
+ org.apache.qpid.server.store.Transaction.Record[] enqueues,
+ org.apache.qpid.server.store.Transaction.Record[] dequeues) throws AMQStoreException
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ Xid xid = new Xid(format, globalId, branchId);
+ XidBinding keyBinding = XidBinding.getInstance();
+ keyBinding.objectToEntry(xid,key);
+
+ DatabaseEntry value = new DatabaseEntry();
+ PreparedTransaction preparedTransaction = new PreparedTransaction(enqueues, dequeues);
+ PreparedTransactionBinding valueBinding = new PreparedTransactionBinding();
+ valueBinding.objectToEntry(preparedTransaction, value);
+
+ try
+ {
+ _xidDb.put(txn, key, value);
+ }
+ catch (DatabaseException e)
+ {
+ LOGGER.error("Failed to write xid: " + e.getMessage(), e);
+ throw new AMQStoreException("Error writing xid to database", e);
+ }
+ }
+
+ private void removeXid(com.sleepycat.je.Transaction txn, long format, byte[] globalId, byte[] branchId)
+ throws AMQStoreException
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ Xid xid = new Xid(format, globalId, branchId);
+ XidBinding keyBinding = XidBinding.getInstance();
+
+ keyBinding.objectToEntry(xid, key);
+
+
+ try
+ {
+
+ OperationStatus status = _xidDb.delete(txn, key);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Unable to find xid");
+ }
+ else if (status != OperationStatus.SUCCESS)
+ {
+ throw new AMQStoreException("Unable to remove xid");
+ }
+
+ }
+ catch (DatabaseException e)
+ {
+
+ LOGGER.error("Failed to remove xid ", e);
+ LOGGER.error(txn);
+
+ throw new AMQStoreException("Error accessing database while removing xid: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Commits all operations performed within a given transaction.
+ *
+ * @param tx The transaction to commit all operations for.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ private StoreFuture commitTranImpl(final com.sleepycat.je.Transaction tx, boolean syncCommit) throws AMQStoreException
+ {
+ if (tx == null)
+ {
+ throw new AMQStoreException("Fatal internal error: transactional is null at commitTran");
+ }
+
+ StoreFuture result;
+ try
+ {
+ result = commit(tx, syncCommit);
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("commitTranImpl completed for [Transaction:" + tx + "]");
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error commit tx: " + e.getMessage(), e);
+ }
+
+ return result;
+ }
+
+ /**
+ * Abandons all operations performed within a given transaction.
+ *
+ * @param tx The transaction to abandon.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ public void abortTran(final com.sleepycat.je.Transaction tx) throws AMQStoreException
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("abortTran called for [Transaction:" + tx + "]");
+ }
+
+ try
+ {
+ tx.abort();
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error aborting transaction: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Primarily for testing purposes.
+ *
+ * @param queueName
+ *
+ * @return a list of message ids for messages enqueued for a particular queue
+ */
+ List<Long> getEnqueuedMessages(UUID queueId) throws AMQStoreException
+ {
+ Cursor cursor = null;
+ try
+ {
+ cursor = _deliveryDb.openCursor(null, null);
+
+ DatabaseEntry key = new DatabaseEntry();
+
+ QueueEntryKey dd = new QueueEntryKey(queueId, 0);
+
+ QueueEntryBinding keyBinding = QueueEntryBinding.getInstance();
+ keyBinding.objectToEntry(dd, key);
+
+ DatabaseEntry value = new DatabaseEntry();
+
+ LinkedList<Long> messageIds = new LinkedList<Long>();
+
+ OperationStatus status = cursor.getSearchKeyRange(key, value, LockMode.DEFAULT);
+ dd = keyBinding.entryToObject(key);
+
+ while ((status == OperationStatus.SUCCESS) && dd.getQueueId().equals(queueId))
+ {
+
+ messageIds.add(dd.getMessageId());
+ status = cursor.getNext(key, value, LockMode.DEFAULT);
+ if (status == OperationStatus.SUCCESS)
+ {
+ dd = keyBinding.entryToObject(key);
+ }
+ }
+
+ return messageIds;
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Database error: " + e.getMessage(), e);
+ }
+ finally
+ {
+ if (cursor != null)
+ {
+ try
+ {
+ cursor.close();
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error closing cursor: " + e.getMessage(), e);
+ }
+ }
+ }
+ }
+
+ /**
+ * Return a valid, currently unused message id.
+ *
+ * @return A fresh message id.
+ */
+ public long getNewMessageId()
+ {
+ return _messageId.incrementAndGet();
+ }
+
+ /**
+ * Stores a chunk of message data.
+ *
+ * @param tx The transaction for the operation.
+ * @param messageId The message to store the data for.
+ * @param offset The offset of the data chunk in the message.
+ * @param contentBody The content of the data chunk.
+ *
+ * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
+ */
+ protected void addContent(final com.sleepycat.je.Transaction tx, long messageId, int offset,
+ ByteBuffer contentBody) throws AMQStoreException
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, key);
+ DatabaseEntry value = new DatabaseEntry();
+ ContentBinding messageBinding = ContentBinding.getInstance();
+ messageBinding.objectToEntry(contentBody.array(), value);
+ try
+ {
+ OperationStatus status = _messageContentDb.put(tx, key, value);
+ if (status != OperationStatus.SUCCESS)
+ {
+ throw new AMQStoreException("Error adding content for message id " + messageId + ": " + status);
+ }
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Storing content for message " + messageId + "[Transaction" + tx + "]");
+
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error writing AMQMessage with id " + messageId + " to database: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Stores message meta-data.
+ *
+ * @param tx The transaction for the operation.
+ * @param messageId The message to store the data for.
+ * @param messageMetaData The message meta data to store.
+ *
+ * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
+ */
+ private void storeMetaData(final com.sleepycat.je.Transaction tx, long messageId,
+ StorableMessageMetaData messageMetaData)
+ throws AMQStoreException
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("public void storeMetaData(Txn tx = " + tx + ", Long messageId = "
+ + messageId + ", MessageMetaData messageMetaData = " + messageMetaData + "): called");
+ }
+
+ DatabaseEntry key = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, key);
+ DatabaseEntry value = new DatabaseEntry();
+
+ MessageMetaDataBinding messageBinding = MessageMetaDataBinding.getInstance();
+ messageBinding.objectToEntry(messageMetaData, value);
+ try
+ {
+ _messageMetaDataDb.put(tx, key, value);
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Storing message metadata for message id " + messageId + "[Transaction" + tx + "]");
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error writing message metadata with id " + messageId + " to database: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Retrieves message meta-data.
+ *
+ * @param messageId The message to get the meta-data for.
+ *
+ * @return The message meta data.
+ *
+ * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
+ */
+ public StorableMessageMetaData getMessageMetaData(long messageId) throws AMQStoreException
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("public MessageMetaData getMessageMetaData(Long messageId = "
+ + messageId + "): called");
+ }
+
+ DatabaseEntry key = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, key);
+ DatabaseEntry value = new DatabaseEntry();
+ MessageMetaDataBinding messageBinding = MessageMetaDataBinding.getInstance();
+
+ try
+ {
+ OperationStatus status = _messageMetaDataDb.get(null, key, value, LockMode.READ_UNCOMMITTED);
+ if (status != OperationStatus.SUCCESS)
+ {
+ throw new AMQStoreException("Metadata not found for message with id " + messageId);
+ }
+
+ StorableMessageMetaData mdd = messageBinding.entryToObject(value);
+
+ return mdd;
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error reading message metadata for message with id " + messageId + ": " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Fills the provided ByteBuffer with as much content for the specified message as possible, starting
+ * from the specified offset in the message.
+ *
+ * @param messageId The message to get the data for.
+ * @param offset The offset of the data within the message.
+ * @param dst The destination of the content read back
+ *
+ * @return The number of bytes inserted into the destination
+ *
+ * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
+ */
+ public int getContent(long messageId, int offset, ByteBuffer dst) throws AMQStoreException
+ {
+ DatabaseEntry contentKeyEntry = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, contentKeyEntry);
+ DatabaseEntry value = new DatabaseEntry();
+ ContentBinding contentTupleBinding = ContentBinding.getInstance();
+
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Message Id: " + messageId + " Getting content body from offset: " + offset);
+ }
+
+ try
+ {
+
+ int written = 0;
+ OperationStatus status = _messageContentDb.get(null, contentKeyEntry, value, LockMode.READ_UNCOMMITTED);
+ if (status == OperationStatus.SUCCESS)
+ {
+ byte[] dataAsBytes = contentTupleBinding.entryToObject(value);
+ int size = dataAsBytes.length;
+ if (offset > size)
+ {
+ throw new RuntimeException("Offset " + offset + " is greater than message size " + size
+ + " for message id " + messageId + "!");
+
+ }
+
+ written = size - offset;
+ if(written > dst.remaining())
+ {
+ written = dst.remaining();
+ }
+
+ dst.put(dataAsBytes, offset, written);
+ }
+ return written;
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error getting AMQMessage with id " + messageId + " to database: " + e.getMessage(), e);
+ }
+ }
+
+ public boolean isPersistent()
+ {
+ return true;
+ }
+
+ public <T extends StorableMessageMetaData> StoredMessage<T> addMessage(T metaData)
+ {
+ if(metaData.isPersistent())
+ {
+ return (StoredMessage<T>) new StoredBDBMessage(getNewMessageId(), metaData);
+ }
+ else
+ {
+ return new StoredMemoryMessage(getNewMessageId(), metaData);
+ }
+ }
+
+ //Package getters for the various databases used by the Store
+
+ Database getMetaDataDb()
+ {
+ return _messageMetaDataDb;
+ }
+
+ Database getContentDb()
+ {
+ return _messageContentDb;
+ }
+
+ Database getDeliveryDb()
+ {
+ return _deliveryDb;
+ }
+
+ /**
+ * Makes the specified configured object persistent.
+ *
+ * @param configuredObject Details of the configured object to store.
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ private void storeConfiguredObjectEntry(ConfiguredObjectRecord configuredObject) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding keyBinding = UUIDTupleBinding.getInstance();
+ keyBinding.objectToEntry(configuredObject.getId(), key);
+
+ DatabaseEntry value = new DatabaseEntry();
+ ConfiguredObjectBinding queueBinding = ConfiguredObjectBinding.getInstance();
+
+ queueBinding.objectToEntry(configuredObject, value);
+ try
+ {
+ OperationStatus status = _configuredObjectsDb.put(null, key, value);
+ if (status != OperationStatus.SUCCESS)
+ {
+ throw new AMQStoreException("Error writing configured object " + configuredObject + " to database: "
+ + status);
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error writing configured object " + configuredObject
+ + " to database: " + e.getMessage(), e);
+ }
+ }
+ }
+
+ private OperationStatus removeConfiguredObject(UUID id) throws AMQStoreException
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding uuidBinding = UUIDTupleBinding.getInstance();
+ uuidBinding.objectToEntry(id, key);
+ try
+ {
+ return _configuredObjectsDb.delete(null, key);
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error deleting of configured object with id " + id + " from database", e);
+ }
+ }
+
+ protected abstract StoreFuture commit(com.sleepycat.je.Transaction tx, boolean syncCommit) throws DatabaseException;
+
+
+ private class StoredBDBMessage implements StoredMessage<StorableMessageMetaData>
+ {
+
+ private final long _messageId;
+ private volatile SoftReference<StorableMessageMetaData> _metaDataRef;
+
+ private StorableMessageMetaData _metaData;
+ private volatile SoftReference<byte[]> _dataRef;
+ private byte[] _data;
+
+ StoredBDBMessage(long messageId, StorableMessageMetaData metaData)
+ {
+ this(messageId, metaData, true);
+ }
+
+
+ StoredBDBMessage(long messageId,
+ StorableMessageMetaData metaData, boolean persist)
+ {
+ try
+ {
+ _messageId = messageId;
+ _metaData = metaData;
+
+ _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
+
+ }
+ catch (DatabaseException e)
+ {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ public StorableMessageMetaData getMetaData()
+ {
+ StorableMessageMetaData metaData = _metaDataRef.get();
+ if(metaData == null)
+ {
+ try
+ {
+ metaData = AbstractBDBMessageStore.this.getMessageMetaData(_messageId);
+ }
+ catch (AMQStoreException e)
+ {
+ throw new RuntimeException(e);
+ }
+ _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
+ }
+
+ return metaData;
+ }
+
+ public long getMessageNumber()
+ {
+ return _messageId;
+ }
+
+ public void addContent(int offsetInMessage, java.nio.ByteBuffer src)
+ {
+ src = src.slice();
+
+ if(_data == null)
+ {
+ _data = new byte[src.remaining()];
+ _dataRef = new SoftReference<byte[]>(_data);
+ src.duplicate().get(_data);
+ }
+ else
+ {
+ byte[] oldData = _data;
+ _data = new byte[oldData.length + src.remaining()];
+ _dataRef = new SoftReference<byte[]>(_data);
+
+ System.arraycopy(oldData,0,_data,0,oldData.length);
+ src.duplicate().get(_data, oldData.length, src.remaining());
+ }
+
+ }
+
+ public int getContent(int offsetInMessage, java.nio.ByteBuffer dst)
+ {
+ byte[] data = _dataRef == null ? null : _dataRef.get();
+ if(data != null)
+ {
+ int length = Math.min(dst.remaining(), data.length - offsetInMessage);
+ dst.put(data, offsetInMessage, length);
+ return length;
+ }
+ else
+ {
+ try
+ {
+ return AbstractBDBMessageStore.this.getContent(_messageId, offsetInMessage, dst);
+ }
+ catch (AMQStoreException e)
+ {
+ // TODO maybe should throw a checked exception, or at least log before throwing
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ public ByteBuffer getContent(int offsetInMessage, int size)
+ {
+ byte[] data = _dataRef == null ? null : _dataRef.get();
+ if(data != null)
+ {
+ return ByteBuffer.wrap(data,offsetInMessage,size);
+ }
+ else
+ {
+ ByteBuffer buf = ByteBuffer.allocate(size);
+ getContent(offsetInMessage, buf);
+ buf.position(0);
+ return buf;
+ }
+ }
+
+ synchronized void store(com.sleepycat.je.Transaction txn)
+ {
+
+ if(_metaData != null)
+ {
+ try
+ {
+ _dataRef = new SoftReference<byte[]>(_data);
+ AbstractBDBMessageStore.this.storeMetaData(txn, _messageId, _metaData);
+ AbstractBDBMessageStore.this.addContent(txn, _messageId, 0,
+ _data == null ? ByteBuffer.allocate(0) : ByteBuffer.wrap(_data));
+ }
+ catch(DatabaseException e)
+ {
+ throw new RuntimeException(e);
+ }
+ catch (AMQStoreException e)
+ {
+ throw new RuntimeException(e);
+ }
+ catch (RuntimeException e)
+ {
+ LOGGER.error("RuntimeException during store", e);
+ throw e;
+ }
+ finally
+ {
+ _metaData = null;
+ _data = null;
+ }
+ }
+ }
+
+ public synchronized StoreFuture flushToStore()
+ {
+ if(_metaData != null)
+ {
+ com.sleepycat.je.Transaction txn = _environment.beginTransaction(null, null);
+ store(txn);
+ AbstractBDBMessageStore.this.commit(txn,true);
+
+ }
+ return StoreFuture.IMMEDIATE_FUTURE;
+ }
+
+ public void remove()
+ {
+ try
+ {
+ AbstractBDBMessageStore.this.removeMessage(_messageId, false);
+ }
+ catch (AMQStoreException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ private class BDBTransaction implements org.apache.qpid.server.store.Transaction
+ {
+ private com.sleepycat.je.Transaction _txn;
+
+ private BDBTransaction()
+ {
+ try
+ {
+ _txn = _environment.beginTransaction(null, null);
+ }
+ catch (DatabaseException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
+ {
+ if(message.getStoredMessage() instanceof StoredBDBMessage)
+ {
+ ((StoredBDBMessage)message.getStoredMessage()).store(_txn);
+ }
+
+ AbstractBDBMessageStore.this.enqueueMessage(_txn, queue, message.getMessageNumber());
+ }
+
+ public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
+ {
+ AbstractBDBMessageStore.this.dequeueMessage(_txn, queue, message.getMessageNumber());
+ }
+
+ public void commitTran() throws AMQStoreException
+ {
+ AbstractBDBMessageStore.this.commitTranImpl(_txn, true);
+ }
+
+ public StoreFuture commitTranAsync() throws AMQStoreException
+ {
+ return AbstractBDBMessageStore.this.commitTranImpl(_txn, false);
+ }
+
+ public void abortTran() throws AMQStoreException
+ {
+ AbstractBDBMessageStore.this.abortTran(_txn);
+ }
+
+ public void removeXid(long format, byte[] globalId, byte[] branchId) throws AMQStoreException
+ {
+ AbstractBDBMessageStore.this.removeXid(_txn, format, globalId, branchId);
+ }
+
+ public void recordXid(long format, byte[] globalId, byte[] branchId, Record[] enqueues,
+ Record[] dequeues) throws AMQStoreException
+ {
+ AbstractBDBMessageStore.this.recordXid(_txn, format, globalId, branchId, enqueues, dequeues);
+ }
+ }
+
+ @Override
+ public void addEventListener(EventListener eventListener, Event... events)
+ {
+ _eventManager.addEventListener(eventListener, events);
+ }
+
+ @Override
+ public String getStoreLocation()
+ {
+ return _storeLocation;
+ }
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java
index 29f2a2f2fb..9f7eb4bfd9 100644
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java
@@ -20,76 +20,20 @@
*/
package org.apache.qpid.server.store.berkeleydb;
-import com.sleepycat.bind.EntryBinding;
-import com.sleepycat.bind.tuple.ByteBinding;
-import com.sleepycat.bind.tuple.IntegerBinding;
-import com.sleepycat.bind.tuple.LongBinding;
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.je.CheckpointConfig;
-import com.sleepycat.je.Cursor;
-import com.sleepycat.je.Database;
-import com.sleepycat.je.DatabaseConfig;
-import com.sleepycat.je.DatabaseEntry;
-import com.sleepycat.je.DatabaseException;
-import com.sleepycat.je.Environment;
-import com.sleepycat.je.EnvironmentConfig;
-import com.sleepycat.je.LockConflictException;
-import com.sleepycat.je.LockMode;
-import com.sleepycat.je.OperationStatus;
-import com.sleepycat.je.TransactionConfig;
-import org.apache.commons.configuration.Configuration;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.exchange.Exchange;
-import org.apache.qpid.server.federation.Bridge;
-import org.apache.qpid.server.federation.BrokerLink;
-import org.apache.qpid.server.logging.LogSubject;
-import org.apache.qpid.server.logging.actors.CurrentActor;
-import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
-import org.apache.qpid.server.logging.messages.MessageStoreMessages;
-import org.apache.qpid.server.logging.messages.TransactionLogMessages;
-import org.apache.qpid.server.message.EnqueableMessage;
-import org.apache.qpid.server.queue.AMQQueue;
-import org.apache.qpid.server.store.ConfigurationRecoveryHandler;
-import org.apache.qpid.server.store.ConfigurationRecoveryHandler.BindingRecoveryHandler;
-import org.apache.qpid.server.store.ConfigurationRecoveryHandler.ExchangeRecoveryHandler;
-import org.apache.qpid.server.store.ConfigurationRecoveryHandler.QueueRecoveryHandler;
-import org.apache.qpid.server.store.DurableConfigurationStore;
-import org.apache.qpid.server.store.MessageStore;
-import org.apache.qpid.server.store.MessageStoreRecoveryHandler;
-import org.apache.qpid.server.store.MessageStoreRecoveryHandler.StoredMessageRecoveryHandler;
-import org.apache.qpid.server.store.StorableMessageMetaData;
-import org.apache.qpid.server.store.StoredMemoryMessage;
-import org.apache.qpid.server.store.StoredMessage;
-import org.apache.qpid.server.store.TransactionLogRecoveryHandler;
-import org.apache.qpid.server.store.TransactionLogRecoveryHandler.QueueEntryRecoveryHandler;
-import org.apache.qpid.server.store.TransactionLogResource;
-import org.apache.qpid.server.store.berkeleydb.keys.MessageContentKey_5;
-import org.apache.qpid.server.store.berkeleydb.records.BindingRecord;
-import org.apache.qpid.server.store.berkeleydb.records.ExchangeRecord;
-import org.apache.qpid.server.store.berkeleydb.records.QueueRecord;
-import org.apache.qpid.server.store.berkeleydb.tuples.BindingTupleBindingFactory;
-import org.apache.qpid.server.store.berkeleydb.tuples.MessageContentKeyTB_5;
-import org.apache.qpid.server.store.berkeleydb.tuples.MessageMetaDataTupleBindingFactory;
-import org.apache.qpid.server.store.berkeleydb.tuples.QueueEntryTB;
-import org.apache.qpid.server.store.berkeleydb.tuples.QueueTupleBindingFactory;
-
import java.io.File;
-import java.lang.ref.SoftReference;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
import java.util.Queue;
-import java.util.Random;
-import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.log4j.Logger;
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.StoreFuture;
+
+import com.sleepycat.je.CheckpointConfig;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
/**
* BDBMessageStore implements a persistent {@link MessageStore} using the BDB high performance log.
@@ -99,331 +43,23 @@ import java.util.concurrent.atomic.AtomicLong;
* exchanges. <tr><td> Store and remove messages. <tr><td> Bind and unbind queues to exchanges. <tr><td> Enqueue and
* dequeue messages to queues. <tr><td> Generate message identifiers. </table>
*/
-@SuppressWarnings({"unchecked"})
-public class BDBMessageStore implements MessageStore, DurableConfigurationStore
+public class BDBMessageStore extends AbstractBDBMessageStore
{
- private static final Logger _log = Logger.getLogger(BDBMessageStore.class);
-
- private static final int LOCK_RETRY_ATTEMPTS = 5;
-
- static final int DATABASE_FORMAT_VERSION = 5;
- private static final String DATABASE_FORMAT_VERSION_PROPERTY = "version";
- public static final String ENVIRONMENT_PATH_PROPERTY = "environment-path";
-
- private Environment _environment;
-
- private String MESSAGEMETADATADB_NAME = "messageMetaDataDb";
- private String MESSAGECONTENTDB_NAME = "messageContentDb";
- private String QUEUEBINDINGSDB_NAME = "queueBindingsDb";
- private String DELIVERYDB_NAME = "deliveryDb";
- private String EXCHANGEDB_NAME = "exchangeDb";
- private String QUEUEDB_NAME = "queueDb";
- private String BRIDGEDB_NAME = "bridges";
- private String LINKDB_NAME = "links";
-
- private Database _messageMetaDataDb;
- private Database _messageContentDb;
- private Database _queueBindingsDb;
- private Database _deliveryDb;
- private Database _exchangeDb;
- private Database _queueDb;
- private Database _bridgeDb;
- private Database _linkDb;
-
- /* =======
- * Schema:
- * =======
- *
- * Queue:
- * name(AMQShortString) - name(AMQShortString), owner(AMQShortString),
- * arguments(FieldTable encoded as binary), exclusive (boolean)
- *
- * Exchange:
- * name(AMQShortString) - name(AMQShortString), typeName(AMQShortString), autodelete (boolean)
- *
- * Binding:
- * exchangeName(AMQShortString), queueName(AMQShortString), routingKey(AMQShortString),
- * arguments (FieldTable encoded as binary) - 0 (zero)
- *
- * QueueEntry:
- * queueName(AMQShortString), messageId (long) - 0 (zero)
- *
- * Message (MetaData):
- * messageId (long) - bodySize (integer), metaData (MessageMetaData encoded as binary)
- *
- * Message (Content):
- * messageId (long), byteOffset (integer) - dataLength(integer), data(binary)
- */
-
- private LogSubject _logSubject;
-
- private final AtomicLong _messageId = new AtomicLong(0);
+ private static final Logger LOGGER = Logger.getLogger(BDBMessageStore.class);
private final CommitThread _commitThread = new CommitThread("Commit-Thread");
- // Factory Classes to create the TupleBinding objects that reflect the version instance of this BDBStore
- private MessageMetaDataTupleBindingFactory _metaDataTupleBindingFactory;
- private QueueTupleBindingFactory _queueTupleBindingFactory;
- private BindingTupleBindingFactory _bindingTupleBindingFactory;
-
- /** The data version this store should run with */
- private int _version;
- private enum State
- {
- INITIAL,
- CONFIGURING,
- CONFIGURED,
- RECOVERING,
- STARTED,
- CLOSING,
- CLOSED
- }
-
- private State _state = State.INITIAL;
-
- private TransactionConfig _transactionConfig = new TransactionConfig();
-
- private boolean _readOnly = false;
-
- private boolean _configured;
-
-
- public BDBMessageStore()
- {
- this(DATABASE_FORMAT_VERSION);
- }
-
- public BDBMessageStore(int version)
- {
- _version = version;
- }
-
- private void setDatabaseNames(int version)
- {
- if (version > 1)
- {
- MESSAGEMETADATADB_NAME += "_v" + version;
-
- MESSAGECONTENTDB_NAME += "_v" + version;
-
- QUEUEDB_NAME += "_v" + version;
-
- DELIVERYDB_NAME += "_v" + version;
-
- EXCHANGEDB_NAME += "_v" + version;
-
- QUEUEBINDINGSDB_NAME += "_v" + version;
-
- LINKDB_NAME += "_v" + version;
-
- BRIDGEDB_NAME += "_v" + version;
- }
- }
-
- public void configureConfigStore(String name,
- ConfigurationRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
- CurrentActor.get().message(logSubject, ConfigStoreMessages.CREATED(this.getClass().getName()));
-
- if(!_configured)
- {
- _logSubject = logSubject;
- configure(name,storeConfiguration);
- _configured = true;
- stateTransition(State.CONFIGURING, State.CONFIGURED);
- }
-
- recover(recoveryHandler);
- stateTransition(State.RECOVERING, State.STARTED);
- }
-
- public void configureMessageStore(String name,
- MessageStoreRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
- CurrentActor.get().message(logSubject, MessageStoreMessages.CREATED(this.getClass().getName()));
-
- if(!_configured)
- {
- _logSubject = logSubject;
- configure(name,storeConfiguration);
- _configured = true;
- stateTransition(State.CONFIGURING, State.CONFIGURED);
- }
-
- recoverMessages(recoveryHandler);
- }
-
- public void configureTransactionLog(String name, TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration, LogSubject logSubject) throws Exception
- {
- CurrentActor.get().message(logSubject, TransactionLogMessages.CREATED(this.getClass().getName()));
-
-
- if(!_configured)
- {
- _logSubject = logSubject;
- configure(name,storeConfiguration);
- _configured = true;
- stateTransition(State.CONFIGURING, State.CONFIGURED);
- }
-
- recoverQueueEntries(recoveryHandler);
-
-
- }
-
- public org.apache.qpid.server.store.MessageStore.Transaction newTransaction()
- {
- return new BDBTransaction();
- }
-
-
- /**
- * Called after instantiation in order to configure the message store.
- *
- * @param name The name of the virtual host using this store
- * @return whether a new store environment was created or not (to indicate whether recovery is necessary)
- *
- * @throws Exception If any error occurs that means the store is unable to configure itself.
- */
- public boolean configure(String name, Configuration storeConfig) throws Exception
- {
- File environmentPath = new File(storeConfig.getString(ENVIRONMENT_PATH_PROPERTY,
- System.getProperty("QPID_WORK") + "/bdbstore/" + name));
- if (!environmentPath.exists())
- {
- if (!environmentPath.mkdirs())
- {
- throw new IllegalArgumentException("Environment path " + environmentPath + " could not be read or created. "
- + "Ensure the path is correct and that the permissions are correct.");
- }
- }
-
- CurrentActor.get().message(_logSubject, MessageStoreMessages.STORE_LOCATION(environmentPath.getAbsolutePath()));
-
- _version = storeConfig.getInt(DATABASE_FORMAT_VERSION_PROPERTY, DATABASE_FORMAT_VERSION);
-
- return configure(environmentPath, false);
- }
-
- /**
- * @param environmentPath location for the store to be created in/recovered from
- * @param readonly if true then don't allow modifications to an existing store, and don't create a new store if none exists
- * @return whether or not a new store environment was created
- * @throws AMQStoreException
- * @throws DatabaseException
- */
- protected boolean configure(File environmentPath, boolean readonly) throws AMQStoreException, DatabaseException
- {
- _readOnly = readonly;
- stateTransition(State.INITIAL, State.CONFIGURING);
-
- _log.info("Configuring BDB message store");
-
- createTupleBindingFactories(_version);
-
- setDatabaseNames(_version);
-
- return setupStore(environmentPath, readonly);
- }
-
- private void createTupleBindingFactories(int version)
- {
- _bindingTupleBindingFactory = new BindingTupleBindingFactory(version);
- _queueTupleBindingFactory = new QueueTupleBindingFactory(version);
- _metaDataTupleBindingFactory = new MessageMetaDataTupleBindingFactory(version);
- }
-
- /**
- * Move the store state from CONFIGURING to STARTED.
- *
- * This is required if you do not want to perform recovery of the store data
- *
- * @throws AMQStoreException if the store is not in the correct state
- */
- public void start() throws AMQStoreException
- {
- stateTransition(State.CONFIGURING, State.STARTED);
- }
-
- private boolean setupStore(File storePath, boolean readonly) throws DatabaseException, AMQStoreException
- {
- checkState(State.CONFIGURING);
-
- boolean newEnvironment = createEnvironment(storePath, readonly);
-
- verifyVersionByTables();
-
- openDatabases(readonly);
-
- if (!readonly)
- {
- _commitThread.start();
- }
-
- return newEnvironment;
- }
-
- private void verifyVersionByTables() throws DatabaseException
- {
- for (String s : _environment.getDatabaseNames())
- {
- int versionIndex = s.indexOf("_v");
-
- // lack of _v index suggests DB is v1
- // so if _version is not v1 then error
- if (versionIndex == -1)
- {
- if (_version != 1)
- {
- closeEnvironment();
- throw new IllegalArgumentException("Error: Unable to load BDBStore as version " + _version
- + ". Store on disk contains version 1 data.");
- }
- else // DB is v1 and _version is v1
- {
- continue;
- }
- }
-
- // Otherwise Check Versions
- int version = Integer.parseInt(s.substring(versionIndex + 2));
-
- if (version != _version)
- {
- closeEnvironment();
- throw new IllegalArgumentException("Error: Unable to load BDBStore as version " + _version
- + ". Store on disk contains version " + version + " data.");
- }
- }
- }
-
- private synchronized void stateTransition(State requiredState, State newState) throws AMQStoreException
+ @Override
+ protected void setupStore(File storePath, String name) throws DatabaseException, AMQStoreException
{
- if (_state != requiredState)
- {
- throw new AMQStoreException("Cannot transition to the state: " + newState + "; need to be in state: " + requiredState
- + "; currently in state: " + _state);
- }
-
- _state = newState;
- }
+ super.setupStore(storePath, name);
- private void checkState(State requiredState) throws AMQStoreException
- {
- if (_state != requiredState)
- {
- throw new AMQStoreException("Unexpected state: " + _state + "; required state: " + requiredState);
- }
+ startCommitThread();
}
- private boolean createEnvironment(File environmentPath, boolean readonly) throws DatabaseException
+ protected Environment createEnvironment(File environmentPath) throws DatabaseException
{
- _log.info("BDB message store using environment path " + environmentPath.getAbsolutePath());
+ LOGGER.info("BDB message store using environment path " + environmentPath.getAbsolutePath());
EnvironmentConfig envConfig = new EnvironmentConfig();
// This is what allows the creation of the store if it does not already exist.
envConfig.setAllowCreate(true);
@@ -442,11 +78,10 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
_transactionConfig.setReadCommitted(true);
//This prevents background threads running which will potentially update the store.
- envConfig.setReadOnly(readonly);
+ envConfig.setReadOnly(false);
try
{
- _environment = new Environment(environmentPath, envConfig);
- return false;
+ return new Environment(environmentPath, envConfig);
}
catch (DatabaseException de)
{
@@ -454,14 +89,7 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
{
//Allow the creation this time
envConfig.setAllowCreate(true);
- if (_environment != null )
- {
- _environment.cleanLog();
- _environment.close();
- }
- _environment = new Environment(environmentPath, envConfig);
-
- return true;
+ return new Environment(environmentPath, envConfig);
}
else
{
@@ -470,1491 +98,18 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
}
}
- private void openDatabases(boolean readonly) throws DatabaseException
- {
- DatabaseConfig dbConfig = new DatabaseConfig();
- dbConfig.setTransactional(true);
- dbConfig.setAllowCreate(true);
-
- //This is required if we are wanting read only access.
- dbConfig.setReadOnly(readonly);
-
- _messageMetaDataDb = openDatabase(MESSAGEMETADATADB_NAME, dbConfig);
- _queueDb = openDatabase(QUEUEDB_NAME, dbConfig);
- _exchangeDb = openDatabase(EXCHANGEDB_NAME, dbConfig);
- _queueBindingsDb = openDatabase(QUEUEBINDINGSDB_NAME, dbConfig);
- _messageContentDb = openDatabase(MESSAGECONTENTDB_NAME, dbConfig);
- _deliveryDb = openDatabase(DELIVERYDB_NAME, dbConfig);
- _linkDb = openDatabase(LINKDB_NAME, dbConfig);
- _bridgeDb = openDatabase(BRIDGEDB_NAME, dbConfig);
-
-
- }
-
- private Database openDatabase(final String dbName, final DatabaseConfig dbConfig)
- {
- // if opening read-only and the database doesn't exist, then you can't create it
- return dbConfig.getReadOnly() && !_environment.getDatabaseNames().contains(dbName)
- ? null
- : _environment.openDatabase(null, dbName, dbConfig);
- }
-
- /**
- * Called to close and cleanup any resources used by the message store.
- *
- * @throws Exception If the close fails.
- */
- public void close() throws Exception
- {
- if (_state != State.STARTED)
- {
- return;
- }
-
- _state = State.CLOSING;
-
- _commitThread.close();
- _commitThread.join();
-
- if (_messageMetaDataDb != null)
- {
- _log.info("Closing message metadata database");
- _messageMetaDataDb.close();
- }
-
- if (_messageContentDb != null)
- {
- _log.info("Closing message content database");
- _messageContentDb.close();
- }
-
- if (_exchangeDb != null)
- {
- _log.info("Closing exchange database");
- _exchangeDb.close();
- }
-
- if (_queueBindingsDb != null)
- {
- _log.info("Closing bindings database");
- _queueBindingsDb.close();
- }
-
- if (_queueDb != null)
- {
- _log.info("Closing queue database");
- _queueDb.close();
- }
-
- if (_deliveryDb != null)
- {
- _log.info("Close delivery database");
- _deliveryDb.close();
- }
-
- if (_bridgeDb != null)
- {
- _log.info("Close bridge database");
- _bridgeDb.close();
- }
-
- if (_linkDb != null)
- {
- _log.info("Close link database");
- _linkDb.close();
- }
-
- closeEnvironment();
-
- _state = State.CLOSED;
-
- CurrentActor.get().message(_logSubject,MessageStoreMessages.CLOSED());
- }
-
- private void closeEnvironment() throws DatabaseException
- {
- if (_environment != null)
- {
- if(!_readOnly)
- {
- // Clean the log before closing. This makes sure it doesn't contain
- // redundant data. Closing without doing this means the cleaner may not
- // get a chance to finish.
- _environment.cleanLog();
- }
- _environment.close();
- }
- }
-
-
- public void recover(ConfigurationRecoveryHandler recoveryHandler) throws AMQStoreException
- {
- stateTransition(State.CONFIGURED, State.RECOVERING);
-
- CurrentActor.get().message(_logSubject,MessageStoreMessages.RECOVERY_START());
-
- try
- {
- QueueRecoveryHandler qrh = recoveryHandler.begin(this);
- loadQueues(qrh);
-
- ExchangeRecoveryHandler erh = qrh.completeQueueRecovery();
- loadExchanges(erh);
-
- BindingRecoveryHandler brh = erh.completeExchangeRecovery();
- recoverBindings(brh);
-
- ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh = brh.completeBindingRecovery();
- recoverBrokerLinks(lrh);
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error recovering persistent state: " + e.getMessage(), e);
- }
-
- }
-
- private void loadQueues(QueueRecoveryHandler qrh) throws DatabaseException
- {
- Cursor cursor = null;
-
- try
- {
- cursor = _queueDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
- TupleBinding binding = _queueTupleBindingFactory.getInstance();
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- QueueRecord queueRecord = (QueueRecord) binding.entryToObject(value);
-
- String queueName = queueRecord.getNameShortString() == null ? null :
- queueRecord.getNameShortString().asString();
- String owner = queueRecord.getOwner() == null ? null :
- queueRecord.getOwner().asString();
- boolean exclusive = queueRecord.isExclusive();
-
- FieldTable arguments = queueRecord.getArguments();
-
- qrh.queue(queueName, owner, exclusive, arguments);
- }
-
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
- }
-
-
- private void loadExchanges(ExchangeRecoveryHandler erh) throws DatabaseException
- {
- Cursor cursor = null;
-
- try
- {
- cursor = _exchangeDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
- TupleBinding binding = new ExchangeTB();
-
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- ExchangeRecord exchangeRec = (ExchangeRecord) binding.entryToObject(value);
-
- String exchangeName = exchangeRec.getNameShortString() == null ? null :
- exchangeRec.getNameShortString().asString();
- String type = exchangeRec.getType() == null ? null :
- exchangeRec.getType().asString();
- boolean autoDelete = exchangeRec.isAutoDelete();
-
- erh.exchange(exchangeName, type, autoDelete);
- }
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
-
- }
-
- private void recoverBindings(BindingRecoveryHandler brh) throws DatabaseException
- {
- Cursor cursor = null;
- try
- {
- cursor = _queueBindingsDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
- TupleBinding<BindingRecord> binding = _bindingTupleBindingFactory.getInstance();
-
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- //yes, this is retrieving all the useful information from the key only.
- //For table compatibility it shall currently be left as is
- BindingRecord bindingRecord = binding.entryToObject(key);
-
- String exchangeName = bindingRecord.getExchangeName() == null ? null :
- bindingRecord.getExchangeName().asString();
- String queueName = bindingRecord.getQueueName() == null ? null :
- bindingRecord.getQueueName().asString();
- String routingKey = bindingRecord.getRoutingKey() == null ? null :
- bindingRecord.getRoutingKey().asString();
- ByteBuffer argumentsBB = (bindingRecord.getArguments() == null ? null :
- java.nio.ByteBuffer.wrap(bindingRecord.getArguments().getDataAsBytes()));
-
- brh.binding(exchangeName, queueName, routingKey, argumentsBB);
- }
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
-
- }
-
-
- private void recoverBrokerLinks(final ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh)
- {
- Cursor cursor = null;
-
- try
- {
- cursor = _linkDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
-
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- UUID id = UUIDTupleBinding.getInstance().entryToObject(key);
- long createTime = LongBinding.entryToLong(value);
- Map<String,String> arguments = StringMapBinding.getInstance().entryToObject(value);
-
- ConfigurationRecoveryHandler.BridgeRecoveryHandler brh = lrh.brokerLink(id, createTime, arguments);
-
- recoverBridges(brh, id);
- }
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
-
- }
-
- private void recoverBridges(final ConfigurationRecoveryHandler.BridgeRecoveryHandler brh, final UUID linkId)
- {
- Cursor cursor = null;
-
- try
- {
- cursor = _bridgeDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
-
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- UUID id = UUIDTupleBinding.getInstance().entryToObject(key);
-
- UUID parentId = UUIDTupleBinding.getInstance().entryToObject(value);
- if(parentId.equals(linkId))
- {
-
- long createTime = LongBinding.entryToLong(value);
- Map<String,String> arguments = StringMapBinding.getInstance().entryToObject(value);
- brh.bridge(id,createTime,arguments);
- }
- }
- brh.completeBridgeRecoveryForLink();
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
-
- }
-
-
- private void recoverMessages(MessageStoreRecoveryHandler msrh) throws DatabaseException
- {
- StoredMessageRecoveryHandler mrh = msrh.begin();
-
- Cursor cursor = null;
- try
- {
- cursor = _messageMetaDataDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
- EntryBinding valueBinding = _metaDataTupleBindingFactory.getInstance();
-
- long maxId = 0;
-
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- long messageId = LongBinding.entryToLong(key);
- StorableMessageMetaData metaData = (StorableMessageMetaData) valueBinding.entryToObject(value);
-
- StoredBDBMessage message = new StoredBDBMessage(messageId, metaData, false);
- mrh.message(message);
-
- maxId = Math.max(maxId, messageId);
- }
-
- _messageId.set(maxId);
- }
- catch (DatabaseException e)
- {
- _log.error("Database Error: " + e.getMessage(), e);
- throw e;
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
- }
-
- private void recoverQueueEntries(TransactionLogRecoveryHandler recoveryHandler)
- throws DatabaseException
- {
- QueueEntryRecoveryHandler qerh = recoveryHandler.begin(this);
-
- ArrayList<QueueEntryKey> entries = new ArrayList<QueueEntryKey>();
-
- Cursor cursor = null;
- try
- {
- cursor = _deliveryDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- EntryBinding keyBinding = new QueueEntryTB();
-
- DatabaseEntry value = new DatabaseEntry();
-
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- QueueEntryKey qek = (QueueEntryKey) keyBinding.entryToObject(key);
-
- entries.add(qek);
- }
-
- try
- {
- cursor.close();
- }
- finally
- {
- cursor = null;
- }
-
- for(QueueEntryKey entry : entries)
- {
- AMQShortString queueName = entry.getQueueName();
- long messageId = entry.getMessageId();
-
- qerh.queueEntry(queueName.asString(),messageId);
- }
- }
- catch (DatabaseException e)
- {
- _log.error("Database Error: " + e.getMessage(), e);
- throw e;
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
-
- qerh.completeQueueEntryRecovery();
- }
-
- /**
- * Removes the specified message from the store.
- *
- * @param messageId Identifies the message to remove.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- public void removeMessage(long messageId) throws AMQStoreException
- {
- removeMessage(messageId, true);
- }
- public void removeMessage(long messageId, boolean sync) throws AMQStoreException
- {
-
- boolean complete = false;
- com.sleepycat.je.Transaction tx = null;
-
- Random rand = null;
- int attempts = 0;
- try
- {
- do
- {
- tx = null;
- try
- {
- tx = _environment.beginTransaction(null, null);
-
- //remove the message meta data from the store
- DatabaseEntry key = new DatabaseEntry();
- LongBinding.longToEntry(messageId, key);
-
- if (_log.isDebugEnabled())
- {
- _log.debug("Removing message id " + messageId);
- }
-
-
- OperationStatus status = _messageMetaDataDb.delete(tx, key);
- if (status == OperationStatus.NOTFOUND)
- {
- _log.info("Message not found (attempt to remove failed - probably application initiated rollback) " +
- messageId);
- }
-
- if (_log.isDebugEnabled())
- {
- _log.debug("Deleted metadata for message " + messageId);
- }
-
- //now remove the content data from the store if there is any.
-
-
-
- int offset = 0;
- do
- {
- DatabaseEntry contentKeyEntry = new DatabaseEntry();
- MessageContentKey_5 mck = new MessageContentKey_5(messageId,offset);
- TupleBinding<MessageContentKey> contentKeyTupleBinding = new MessageContentKeyTB_5();
- contentKeyTupleBinding.objectToEntry(mck, contentKeyEntry);
- //Use a partial record for the value to prevent retrieving the
- //data itself as we only need the key to identify what to remove.
- DatabaseEntry value = new DatabaseEntry();
- value.setPartial(0, 4, true);
-
- status = _messageContentDb.get(null,contentKeyEntry, value, LockMode.READ_COMMITTED);
-
- if(status == OperationStatus.SUCCESS)
- {
-
- offset += IntegerBinding.entryToInt(value);
- _messageContentDb.delete(tx, contentKeyEntry);
- if (_log.isDebugEnabled())
- {
- _log.debug("Deleted content chunk offset " + mck.getOffset() + " for message " + messageId);
- }
- }
- }
- while (status == OperationStatus.SUCCESS);
-
- commit(tx, sync);
- complete = true;
- tx = null;
- }
- catch (LockConflictException e)
- {
- try
- {
- if(tx != null)
- {
- tx.abort();
- }
- }
- catch(DatabaseException e2)
- {
- _log.warn("Unable to abort transaction after LockConflictExcption", e2);
- // rethrow the original log conflict exception, the secondary exception should already have
- // been logged.
- throw e;
- }
-
-
- _log.warn("Lock timeout exception. Retrying (attempt "
- + (attempts+1) + " of "+ LOCK_RETRY_ATTEMPTS +") " + e);
-
- if(++attempts < LOCK_RETRY_ATTEMPTS)
- {
- if(rand == null)
- {
- rand = new Random();
- }
-
- try
- {
- Thread.sleep(500l + (long)(500l * rand.nextDouble()));
- }
- catch (InterruptedException e1)
- {
-
- }
- }
- else
- {
- // rethrow the lock conflict exception since we could not solve by retrying
- throw e;
- }
- }
- }
- while(!complete);
- }
- catch (DatabaseException e)
- {
- _log.error("Unexpected BDB exception", e);
-
- if (tx != null)
- {
- try
- {
- tx.abort();
- tx = null;
- }
- catch (DatabaseException e1)
- {
- throw new AMQStoreException("Error aborting transaction " + e1, e1);
- }
- }
-
- throw new AMQStoreException("Error removing message with id " + messageId + " from database: " + e.getMessage(), e);
- }
- finally
- {
- if (tx != null)
- {
- try
- {
- tx.abort();
- tx = null;
- }
- catch (DatabaseException e1)
- {
- throw new AMQStoreException("Error aborting transaction " + e1, e1);
- }
- }
- }
- }
-
- /**
- * @see DurableConfigurationStore#createExchange(Exchange)
- */
- public void createExchange(Exchange exchange) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- ExchangeRecord exchangeRec = new ExchangeRecord(exchange.getNameShortString(),
- exchange.getTypeShortString(), exchange.isAutoDelete());
-
- DatabaseEntry key = new DatabaseEntry();
- EntryBinding keyBinding = new AMQShortStringTB();
- keyBinding.objectToEntry(exchange.getNameShortString(), key);
-
- DatabaseEntry value = new DatabaseEntry();
- TupleBinding exchangeBinding = new ExchangeTB();
- exchangeBinding.objectToEntry(exchangeRec, value);
-
- try
- {
- _exchangeDb.put(null, key, value);
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing Exchange with name " + exchange.getName() + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- /**
- * @see DurableConfigurationStore#removeExchange(Exchange)
- */
- public void removeExchange(Exchange exchange) throws AMQStoreException
- {
- DatabaseEntry key = new DatabaseEntry();
- EntryBinding keyBinding = new AMQShortStringTB();
- keyBinding.objectToEntry(exchange.getNameShortString(), key);
- try
- {
- OperationStatus status = _exchangeDb.delete(null, key);
- if (status == OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Exchange " + exchange.getName() + " not found");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing deleting with name " + exchange.getName() + " from database: " + e.getMessage(), e);
- }
- }
-
-
- /**
- * @see DurableConfigurationStore#bindQueue(Exchange, AMQShortString, AMQQueue, FieldTable)
- */
- public void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
- {
- bindQueue(new BindingRecord(exchange.getNameShortString(), queue.getNameShortString(), routingKey, args));
- }
-
- protected void bindQueue(final BindingRecord bindingRecord) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- DatabaseEntry key = new DatabaseEntry();
- EntryBinding keyBinding = _bindingTupleBindingFactory.getInstance();
-
- keyBinding.objectToEntry(bindingRecord, key);
-
- //yes, this is writing out 0 as a value and putting all the
- //useful info into the key, don't ask me why. For table
- //compatibility it shall currently be left as is
- DatabaseEntry value = new DatabaseEntry();
- ByteBinding.byteToEntry((byte) 0, value);
-
- try
- {
- _queueBindingsDb.put(null, key, value);
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing binding for AMQQueue with name " + bindingRecord.getQueueName() + " to exchange "
- + bindingRecord.getExchangeName() + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- /**
- * @see DurableConfigurationStore#unbindQueue(Exchange, AMQShortString, AMQQueue, FieldTable)
- */
- public void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args)
- throws AMQStoreException
- {
- DatabaseEntry key = new DatabaseEntry();
- EntryBinding keyBinding = _bindingTupleBindingFactory.getInstance();
- keyBinding.objectToEntry(new BindingRecord(exchange.getNameShortString(), queue.getNameShortString(), routingKey, args), key);
-
- try
- {
- OperationStatus status = _queueBindingsDb.delete(null, key);
- if (status == OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Queue binding for queue with name " + queue.getName() + " to exchange "
- + exchange.getName() + " not found");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error deleting queue binding for queue with name " + queue.getName() + " to exchange "
- + exchange.getName() + " from database: " + e.getMessage(), e);
- }
- }
-
- /**
- * @see DurableConfigurationStore#createQueue(AMQQueue)
- */
- public void createQueue(AMQQueue queue) throws AMQStoreException
- {
- createQueue(queue, null);
- }
-
- /**
- * @see DurableConfigurationStore#createQueue(AMQQueue, FieldTable)
- */
- public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
- {
- if (_log.isDebugEnabled())
- {
- _log.debug("public void createQueue(AMQQueue queue(" + queue.getName() + ") = " + queue + "): called");
- }
-
- QueueRecord queueRecord= new QueueRecord(queue.getNameShortString(),
- queue.getOwner(), queue.isExclusive(), arguments);
-
- createQueue(queueRecord);
- }
-
- /**
- * Makes the specified queue persistent.
- *
- * Only intended for direct use during store upgrades.
- *
- * @param queueRecord Details of the queue to store.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- protected void createQueue(QueueRecord queueRecord) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- DatabaseEntry key = new DatabaseEntry();
- EntryBinding keyBinding = new AMQShortStringTB();
- keyBinding.objectToEntry(queueRecord.getNameShortString(), key);
-
- DatabaseEntry value = new DatabaseEntry();
- TupleBinding queueBinding = _queueTupleBindingFactory.getInstance();
-
- queueBinding.objectToEntry(queueRecord, value);
- try
- {
- _queueDb.put(null, key, value);
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing AMQQueue with name " + queueRecord.getNameShortString().asString()
- + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- /**
- * Updates the specified queue in the persistent store, IF it is already present. If the queue
- * is not present in the store, it will not be added.
- *
- * NOTE: Currently only updates the exclusivity.
- *
- * @param queue The queue to update the entry for.
- * @throws AMQStoreException If the operation fails for any reason.
- */
- public void updateQueue(final AMQQueue queue) throws AMQStoreException
- {
- if (_log.isDebugEnabled())
- {
- _log.debug("Updating queue: " + queue.getName());
- }
-
- try
- {
- DatabaseEntry key = new DatabaseEntry();
- EntryBinding keyBinding = new AMQShortStringTB();
- keyBinding.objectToEntry(queue.getNameShortString(), key);
-
- DatabaseEntry value = new DatabaseEntry();
- DatabaseEntry newValue = new DatabaseEntry();
- TupleBinding queueBinding = _queueTupleBindingFactory.getInstance();
-
- OperationStatus status = _queueDb.get(null, key, value, LockMode.DEFAULT);
- if(status == OperationStatus.SUCCESS)
- {
- //read the existing record and apply the new exclusivity setting
- QueueRecord queueRecord = (QueueRecord) queueBinding.entryToObject(value);
- queueRecord.setExclusive(queue.isExclusive());
-
- //write the updated entry to the store
- queueBinding.objectToEntry(queueRecord, newValue);
-
- _queueDb.put(null, key, newValue);
- }
- else if(status != OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Error updating queue details within the store: " + status);
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error updating queue details within the store: " + e,e);
- }
- }
-
- /**
- * Removes the specified queue from the persistent store.
- *
- * @param queue The queue to remove.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- public void removeQueue(final AMQQueue queue) throws AMQStoreException
- {
- AMQShortString name = queue.getNameShortString();
-
- if (_log.isDebugEnabled())
- {
- _log.debug("public void removeQueue(AMQShortString name = " + name + "): called");
- }
-
- DatabaseEntry key = new DatabaseEntry();
- EntryBinding keyBinding = new AMQShortStringTB();
- keyBinding.objectToEntry(name, key);
- try
- {
- OperationStatus status = _queueDb.delete(null, key);
- if (status == OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Queue " + name + " not found");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing deleting with name " + name + " from database: " + e.getMessage(), e);
- }
- }
-
- public void createBrokerLink(final BrokerLink link) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- DatabaseEntry key = new DatabaseEntry();
- UUIDTupleBinding.getInstance().objectToEntry(link.getId(), key);
-
- DatabaseEntry value = new DatabaseEntry();
- LongBinding.longToEntry(link.getCreateTime(),value);
- StringMapBinding.getInstance().objectToEntry(link.getArguments(), value);
-
- try
- {
- _linkDb.put(null, key, value);
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing Link " + link
- + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
- {
- DatabaseEntry key = new DatabaseEntry();
- UUIDTupleBinding.getInstance().objectToEntry(link.getId(), key);
- try
- {
- OperationStatus status = _linkDb.delete(null, key);
- if (status == OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Link " + link + " not found");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error deleting the Link " + link + " from database: " + e.getMessage(), e);
- }
- }
-
- public void createBridge(final Bridge bridge) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- DatabaseEntry key = new DatabaseEntry();
- UUIDTupleBinding.getInstance().objectToEntry(bridge.getId(), key);
-
- DatabaseEntry value = new DatabaseEntry();
- UUIDTupleBinding.getInstance().objectToEntry(bridge.getLink().getId(),value);
- LongBinding.longToEntry(bridge.getCreateTime(),value);
- StringMapBinding.getInstance().objectToEntry(bridge.getArguments(), value);
-
- try
- {
- _bridgeDb.put(null, key, value);
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing Bridge " + bridge
- + " to database: " + e.getMessage(), e);
- }
-
- }
- }
-
- public void deleteBridge(final Bridge bridge) throws AMQStoreException
- {
- DatabaseEntry key = new DatabaseEntry();
- UUIDTupleBinding.getInstance().objectToEntry(bridge.getId(), key);
- try
- {
- OperationStatus status = _bridgeDb.delete(null, key);
- if (status == OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Bridge " + bridge + " not found");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error deleting the Bridge " + bridge + " from database: " + e.getMessage(), e);
- }
- }
-
- /**
- * Places a message onto a specified queue, in a given transaction.
- *
- * @param tx The transaction for the operation.
- * @param queue The the queue to place the message on.
- * @param messageId The message to enqueue.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- public void enqueueMessage(final com.sleepycat.je.Transaction tx, final TransactionLogResource queue,
- long messageId) throws AMQStoreException
- {
- AMQShortString name = AMQShortString.valueOf(queue.getResourceName());
-
- DatabaseEntry key = new DatabaseEntry();
- EntryBinding keyBinding = new QueueEntryTB();
- QueueEntryKey dd = new QueueEntryKey(name, messageId);
- keyBinding.objectToEntry(dd, key);
- DatabaseEntry value = new DatabaseEntry();
- ByteBinding.byteToEntry((byte) 0, value);
-
- try
- {
- if (_log.isDebugEnabled())
- {
- _log.debug("Enqueuing message " + messageId + " on queue " + name + " [Transaction" + tx + "]");
- }
- _deliveryDb.put(tx, key, value);
- }
- catch (DatabaseException e)
- {
- _log.error("Failed to enqueue: " + e.getMessage(), e);
- throw new AMQStoreException("Error writing enqueued message with id " + messageId + " for queue " + name
- + " to database", e);
- }
- }
-
- /**
- * Extracts a message from a specified queue, in a given transaction.
- *
- * @param tx The transaction for the operation.
- * @param queue The name queue to take the message from.
- * @param messageId The message to dequeue.
- *
- * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
- */
- public void dequeueMessage(final com.sleepycat.je.Transaction tx, final TransactionLogResource queue,
- long messageId) throws AMQStoreException
- {
- AMQShortString name = new AMQShortString(queue.getResourceName());
-
- DatabaseEntry key = new DatabaseEntry();
- EntryBinding keyBinding = new QueueEntryTB();
- QueueEntryKey dd = new QueueEntryKey(name, messageId);
-
- keyBinding.objectToEntry(dd, key);
-
- if (_log.isDebugEnabled())
- {
- _log.debug("Dequeue message id " + messageId);
- }
-
- try
- {
-
- OperationStatus status = _deliveryDb.delete(tx, key);
- if (status == OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Unable to find message with id " + messageId + " on queue " + name);
- }
- else if (status != OperationStatus.SUCCESS)
- {
- throw new AMQStoreException("Unable to remove message with id " + messageId + " on queue " + name);
- }
-
- if (_log.isDebugEnabled())
- {
- _log.debug("Removed message " + messageId + ", " + name + " from delivery db");
-
- }
- }
- catch (DatabaseException e)
- {
-
- _log.error("Failed to dequeue message " + messageId + ": " + e.getMessage(), e);
- _log.error(tx);
-
- throw new AMQStoreException("Error accessing database while dequeuing message: " + e.getMessage(), e);
- }
- }
-
- /**
- * Commits all operations performed within a given transaction.
- *
- * @param tx The transaction to commit all operations for.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- private StoreFuture commitTranImpl(final com.sleepycat.je.Transaction tx, boolean syncCommit) throws AMQStoreException
- {
- if (tx == null)
- {
- throw new AMQStoreException("Fatal internal error: transactional is null at commitTran");
- }
-
- StoreFuture result;
- try
- {
- result = commit(tx, syncCommit);
-
- if (_log.isDebugEnabled())
- {
- _log.debug("commitTranImpl completed for [Transaction:" + tx + "]");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error commit tx: " + e.getMessage(), e);
- }
-
- return result;
- }
-
- /**
- * Abandons all operations performed within a given transaction.
- *
- * @param tx The transaction to abandon.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- public void abortTran(final com.sleepycat.je.Transaction tx) throws AMQStoreException
- {
- if (_log.isDebugEnabled())
- {
- _log.debug("abortTran called for [Transaction:" + tx + "]");
- }
-
- try
- {
- tx.abort();
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error aborting transaction: " + e.getMessage(), e);
- }
- }
-
- /**
- * Primarily for testing purposes.
- *
- * @param queueName
- *
- * @return a list of message ids for messages enqueued for a particular queue
- */
- List<Long> getEnqueuedMessages(AMQShortString queueName) throws AMQStoreException
- {
- Cursor cursor = null;
- try
- {
- cursor = _deliveryDb.openCursor(null, null);
-
- DatabaseEntry key = new DatabaseEntry();
-
- QueueEntryKey dd = new QueueEntryKey(queueName, 0);
-
- EntryBinding keyBinding = new QueueEntryTB();
- keyBinding.objectToEntry(dd, key);
-
- DatabaseEntry value = new DatabaseEntry();
-
- LinkedList<Long> messageIds = new LinkedList<Long>();
-
- OperationStatus status = cursor.getSearchKeyRange(key, value, LockMode.DEFAULT);
- dd = (QueueEntryKey) keyBinding.entryToObject(key);
-
- while ((status == OperationStatus.SUCCESS) && dd.getQueueName().equals(queueName))
- {
-
- messageIds.add(dd.getMessageId());
- status = cursor.getNext(key, value, LockMode.DEFAULT);
- if (status == OperationStatus.SUCCESS)
- {
- dd = (QueueEntryKey) keyBinding.entryToObject(key);
- }
- }
-
- return messageIds;
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Database error: " + e.getMessage(), e);
- }
- finally
- {
- if (cursor != null)
- {
- try
- {
- cursor.close();
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error closing cursor: " + e.getMessage(), e);
- }
- }
- }
- }
-
- /**
- * Return a valid, currently unused message id.
- *
- * @return A fresh message id.
- */
- public long getNewMessageId()
- {
- return _messageId.incrementAndGet();
- }
-
- /**
- * Stores a chunk of message data.
- *
- * @param tx The transaction for the operation.
- * @param messageId The message to store the data for.
- * @param offset The offset of the data chunk in the message.
- * @param contentBody The content of the data chunk.
- *
- * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
- */
- protected void addContent(final com.sleepycat.je.Transaction tx, long messageId, int offset,
- ByteBuffer contentBody) throws AMQStoreException
- {
- DatabaseEntry key = new DatabaseEntry();
- TupleBinding<MessageContentKey> keyBinding = new MessageContentKeyTB_5();
- keyBinding.objectToEntry(new MessageContentKey_5(messageId, offset), key);
- DatabaseEntry value = new DatabaseEntry();
- TupleBinding<ByteBuffer> messageBinding = new ContentTB();
- messageBinding.objectToEntry(contentBody, value);
- try
- {
- OperationStatus status = _messageContentDb.put(tx, key, value);
- if (status != OperationStatus.SUCCESS)
- {
- throw new AMQStoreException("Error adding content chunk offset" + offset + " for message id " + messageId + ": "
- + status);
- }
-
- if (_log.isDebugEnabled())
- {
- _log.debug("Storing content chunk offset" + offset + " for message " + messageId + "[Transaction" + tx + "]");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing AMQMessage with id " + messageId + " to database: " + e.getMessage(), e);
- }
- }
-
- /**
- * Stores message meta-data.
- *
- * @param tx The transaction for the operation.
- * @param messageId The message to store the data for.
- * @param messageMetaData The message meta data to store.
- *
- * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
- */
- private void storeMetaData(final com.sleepycat.je.Transaction tx, long messageId,
- StorableMessageMetaData messageMetaData)
- throws AMQStoreException
- {
- if (_log.isDebugEnabled())
- {
- _log.debug("public void storeMetaData(Txn tx = " + tx + ", Long messageId = "
- + messageId + ", MessageMetaData messageMetaData = " + messageMetaData + "): called");
- }
-
- DatabaseEntry key = new DatabaseEntry();
- LongBinding.longToEntry(messageId, key);
- DatabaseEntry value = new DatabaseEntry();
-
- TupleBinding messageBinding = _metaDataTupleBindingFactory.getInstance();
- messageBinding.objectToEntry(messageMetaData, value);
- try
- {
- _messageMetaDataDb.put(tx, key, value);
- if (_log.isDebugEnabled())
- {
- _log.debug("Storing message metadata for message id " + messageId + "[Transaction" + tx + "]");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing message metadata with id " + messageId + " to database: " + e.getMessage(), e);
- }
- }
-
- /**
- * Retrieves message meta-data.
- *
- * @param messageId The message to get the meta-data for.
- *
- * @return The message meta data.
- *
- * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
- */
- public StorableMessageMetaData getMessageMetaData(long messageId) throws AMQStoreException
- {
- if (_log.isDebugEnabled())
- {
- _log.debug("public MessageMetaData getMessageMetaData(Long messageId = "
- + messageId + "): called");
- }
-
- DatabaseEntry key = new DatabaseEntry();
- LongBinding.longToEntry(messageId, key);
- DatabaseEntry value = new DatabaseEntry();
- TupleBinding messageBinding = _metaDataTupleBindingFactory.getInstance();
-
- try
- {
- OperationStatus status = _messageMetaDataDb.get(null, key, value, LockMode.READ_UNCOMMITTED);
- if (status != OperationStatus.SUCCESS)
- {
- throw new AMQStoreException("Metadata not found for message with id " + messageId);
- }
-
- StorableMessageMetaData mdd = (StorableMessageMetaData) messageBinding.entryToObject(value);
-
- return mdd;
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error reading message metadata for message with id " + messageId + ": " + e.getMessage(), e);
- }
- }
-
- /**
- * Fills the provided ByteBuffer with as much content for the specified message as possible, starting
- * from the specified offset in the message.
- *
- * @param messageId The message to get the data for.
- * @param offset The offset of the data within the message.
- * @param dst The destination of the content read back
- *
- * @return The number of bytes inserted into the destination
- *
- * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
- */
- public int getContent(long messageId, int offset, ByteBuffer dst) throws AMQStoreException
- {
- DatabaseEntry contentKeyEntry = new DatabaseEntry();
-
- //Start from 0 offset and search for the starting chunk.
- MessageContentKey_5 mck = new MessageContentKey_5(messageId, 0);
- TupleBinding<MessageContentKey> contentKeyTupleBinding = new MessageContentKeyTB_5();
- contentKeyTupleBinding.objectToEntry(mck, contentKeyEntry);
- DatabaseEntry value = new DatabaseEntry();
- TupleBinding<ByteBuffer> contentTupleBinding = new ContentTB();
-
- if (_log.isDebugEnabled())
- {
- _log.debug("Message Id: " + messageId + " Getting content body from offset: " + offset);
- }
-
- int written = 0;
- int seenSoFar = 0;
-
- Cursor cursor = null;
- try
- {
- cursor = _messageContentDb.openCursor(null, null);
-
- OperationStatus status = cursor.getSearchKeyRange(contentKeyEntry, value, LockMode.READ_UNCOMMITTED);
-
- while (status == OperationStatus.SUCCESS)
- {
- mck = (MessageContentKey_5) contentKeyTupleBinding.entryToObject(contentKeyEntry);
- long id = mck.getMessageId();
-
- if(id != messageId)
- {
- //we have exhausted all chunks for this message id, break
- break;
- }
-
- int offsetInMessage = mck.getOffset();
- ByteBuffer buf = (ByteBuffer) contentTupleBinding.entryToObject(value);
-
- final int size = (int) buf.limit();
-
- seenSoFar += size;
-
- if(seenSoFar >= offset)
- {
- byte[] dataAsBytes = buf.array();
-
- int posInArray = offset + written - offsetInMessage;
- int count = size - posInArray;
- if(count > dst.remaining())
- {
- count = dst.remaining();
- }
- dst.put(dataAsBytes,posInArray,count);
- written+=count;
-
- if(dst.remaining() == 0)
- {
- break;
- }
- }
-
- status = cursor.getNext(contentKeyEntry, value, LockMode.RMW);
- }
-
- return written;
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing AMQMessage with id " + messageId + " to database: " + e.getMessage(), e);
- }
- finally
- {
- if(cursor != null)
- {
- try
- {
- cursor.close();
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing AMQMessage with id " + messageId + " to database: " + e.getMessage(), e);
- }
- }
- }
- }
-
- public boolean isPersistent()
- {
- return true;
- }
-
- public <T extends StorableMessageMetaData> StoredMessage<T> addMessage(T metaData)
- {
- if(metaData.isPersistent())
- {
- return new StoredBDBMessage(getNewMessageId(), metaData);
- }
- else
- {
- return new StoredMemoryMessage(getNewMessageId(), metaData);
- }
- }
-
-
- //protected getters for the TupleBindingFactories
-
- protected QueueTupleBindingFactory getQueueTupleBindingFactory()
- {
- return _queueTupleBindingFactory;
- }
-
- protected BindingTupleBindingFactory getBindingTupleBindingFactory()
- {
- return _bindingTupleBindingFactory;
- }
-
- protected MessageMetaDataTupleBindingFactory getMetaDataTupleBindingFactory()
- {
- return _metaDataTupleBindingFactory;
- }
-
- //Package getters for the various databases used by the Store
-
- Database getMetaDataDb()
- {
- return _messageMetaDataDb;
- }
-
- Database getContentDb()
- {
- return _messageContentDb;
- }
-
- Database getQueuesDb()
- {
- return _queueDb;
- }
-
- Database getDeliveryDb()
- {
- return _deliveryDb;
- }
- Database getExchangesDb()
- {
- return _exchangeDb;
- }
- Database getBindingsDb()
+ @Override
+ protected void closeInternal() throws Exception
{
- return _queueBindingsDb;
- }
+ stopCommitThread();
- void visitMetaDataDb(DatabaseVisitor visitor) throws DatabaseException, AMQStoreException
- {
- visitDatabase(_messageMetaDataDb, visitor);
+ super.closeInternal();
}
- void visitContentDb(DatabaseVisitor visitor) throws DatabaseException, AMQStoreException
- {
- visitDatabase(_messageContentDb, visitor);
- }
-
- void visitQueues(DatabaseVisitor visitor) throws DatabaseException, AMQStoreException
- {
- visitDatabase(_queueDb, visitor);
- }
-
- void visitDelivery(DatabaseVisitor visitor) throws DatabaseException, AMQStoreException
- {
- visitDatabase(_deliveryDb, visitor);
- }
-
- void visitExchanges(DatabaseVisitor visitor) throws DatabaseException, AMQStoreException
- {
- visitDatabase(_exchangeDb, visitor);
- }
-
- void visitBindings(DatabaseVisitor visitor) throws DatabaseException, AMQStoreException
- {
- visitDatabase(_queueBindingsDb, visitor);
- }
-
- /**
- * Generic visitDatabase allows iteration through the specified database.
- *
- * @param database The database to visit
- * @param visitor The visitor to give each entry to.
- *
- * @throws DatabaseException If there is a problem with the Database structure
- * @throws AMQStoreException If there is a problem with the Database contents
- */
- void visitDatabase(Database database, DatabaseVisitor visitor) throws DatabaseException, AMQStoreException
- {
- Cursor cursor = database.openCursor(null, null);
-
- try
- {
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- visitor.visit(key, value);
- }
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
- }
-
- private StoreFuture commit(com.sleepycat.je.Transaction tx, boolean syncCommit) throws DatabaseException
+ @Override
+ protected StoreFuture commit(com.sleepycat.je.Transaction tx, boolean syncCommit) throws DatabaseException
{
tx.commitNoSync();
@@ -1964,11 +119,17 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
return commitFuture;
}
- public void startCommitThread()
+ private void startCommitThread()
{
_commitThread.start();
}
+ private void stopCommitThread() throws InterruptedException
+ {
+ _commitThread.close();
+ _commitThread.join();
+ }
+
private static final class BDBCommitFuture implements StoreFuture
{
private final CommitThread _commitThread;
@@ -1986,9 +147,9 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
public synchronized void complete()
{
- if (_log.isDebugEnabled())
+ if (LOGGER.isDebugEnabled())
{
- _log.debug("public synchronized void complete(): called (Transaction = " + _tx + ")");
+ LOGGER.debug("public synchronized void complete(): called (Transaction = " + _tx + ")");
}
_complete = true;
@@ -2009,7 +170,7 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
if(!_syncCommit)
{
- _log.debug("CommitAsync was requested, returning immediately.");
+ LOGGER.debug("CommitAsync was requested, returning immediately.");
return;
}
@@ -2051,7 +212,7 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
* continuing, but it is the responsibility of this thread to tell the commit operations when they have been
* completed by calling back on their {@link BDBCommitFuture#complete()} and {@link BDBCommitFuture#abort} methods.
*
- * <p/><table id="crc"><caption>CRC Card</caption> <tr><th> Responsibilities <th> Collarations </table>
+ * <p/><table id="crc"><caption>CRC Card</caption> <tr><th> Responsibilities <th> Collaborations </table>
*/
private class CommitThread extends Thread
{
@@ -2104,7 +265,7 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
try
{
- _environment.flushLog(true);
+ getEnvironment().flushLog(true);
for(int i = 0; i < size; i++)
{
@@ -2152,239 +313,4 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
}
}
-
- private class StoredBDBMessage implements StoredMessage
- {
-
- private final long _messageId;
- private volatile SoftReference<StorableMessageMetaData> _metaDataRef;
-
- private StorableMessageMetaData _metaData;
- private volatile SoftReference<byte[]> _dataRef;
- private byte[] _data;
-
- StoredBDBMessage(long messageId, StorableMessageMetaData metaData)
- {
- this(messageId, metaData, true);
- }
-
-
- StoredBDBMessage(long messageId,
- StorableMessageMetaData metaData, boolean persist)
- {
- try
- {
- _messageId = messageId;
- _metaData = metaData;
-
- _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
-
- }
- catch (DatabaseException e)
- {
- throw new RuntimeException(e);
- }
-
- }
-
- public StorableMessageMetaData getMetaData()
- {
- StorableMessageMetaData metaData = _metaDataRef.get();
- if(metaData == null)
- {
- try
- {
- metaData = BDBMessageStore.this.getMessageMetaData(_messageId);
- }
- catch (AMQStoreException e)
- {
- throw new RuntimeException(e);
- }
- _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
- }
-
- return metaData;
- }
-
- public long getMessageNumber()
- {
- return _messageId;
- }
-
- public void addContent(int offsetInMessage, java.nio.ByteBuffer src)
- {
- src = src.slice();
-
- if(_data == null)
- {
- _data = new byte[src.remaining()];
- _dataRef = new SoftReference<byte[]>(_data);
- src.duplicate().get(_data);
- }
- else
- {
- byte[] oldData = _data;
- _data = new byte[oldData.length + src.remaining()];
- _dataRef = new SoftReference<byte[]>(_data);
-
- System.arraycopy(oldData,0,_data,0,oldData.length);
- src.duplicate().get(_data, oldData.length, src.remaining());
- }
-
- }
-
- public int getContent(int offsetInMessage, java.nio.ByteBuffer dst)
- {
- byte[] data = _dataRef == null ? null : _dataRef.get();
- if(data != null)
- {
- int length = Math.min(dst.remaining(), data.length - offsetInMessage);
- dst.put(data, offsetInMessage, length);
- return length;
- }
- else
- {
- try
- {
- return BDBMessageStore.this.getContent(_messageId, offsetInMessage, dst);
- }
- catch (AMQStoreException e)
- {
- throw new RuntimeException(e);
- }
- }
- }
-
- public ByteBuffer getContent(int offsetInMessage, int size)
- {
- byte[] data = _dataRef == null ? null : _dataRef.get();
- if(data != null)
- {
- return ByteBuffer.wrap(data,offsetInMessage,size);
- }
- else
- {
- ByteBuffer buf = ByteBuffer.allocate(size);
- getContent(offsetInMessage, buf);
- buf.position(0);
- return buf;
- }
- }
-
- synchronized void store(com.sleepycat.je.Transaction txn)
- {
-
- if(_metaData != null)
- {
- try
- {
- _dataRef = new SoftReference<byte[]>(_data);
- BDBMessageStore.this.storeMetaData(txn, _messageId, _metaData);
- BDBMessageStore.this.addContent(txn, _messageId, 0,
- _data == null ? ByteBuffer.allocate(0) : ByteBuffer.wrap(_data));
- }
- catch(DatabaseException e)
- {
- throw new RuntimeException(e);
- }
- catch (AMQStoreException e)
- {
- throw new RuntimeException(e);
- }
- catch (RuntimeException e)
- {
- e.printStackTrace();
- throw e;
- }
- finally
- {
- _metaData = null;
- _data = null;
- }
- }
- }
-
- public synchronized StoreFuture flushToStore()
- {
- if(_metaData != null)
- {
- com.sleepycat.je.Transaction txn = _environment.beginTransaction(null, null);
- store(txn);
- BDBMessageStore.this.commit(txn,true);
-
- }
- return IMMEDIATE_FUTURE;
- }
-
- public void remove()
- {
- try
- {
- BDBMessageStore.this.removeMessage(_messageId, false);
- }
- catch (AMQStoreException e)
- {
- throw new RuntimeException(e);
- }
- }
- }
-
- private class BDBTransaction implements Transaction
- {
- private com.sleepycat.je.Transaction _txn;
-
- private BDBTransaction()
- {
- try
- {
- _txn = _environment.beginTransaction(null, null);
- }
- catch (DatabaseException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
- {
- if(message.getStoredMessage() instanceof StoredBDBMessage)
- {
- ((StoredBDBMessage)message.getStoredMessage()).store(_txn);
- }
-
- BDBMessageStore.this.enqueueMessage(_txn, queue, message.getMessageNumber());
- }
-
- public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
- {
- BDBMessageStore.this.dequeueMessage(_txn, queue, message.getMessageNumber());
- }
-
- public void enqueueMessage(TransactionLogResource queue, long messageId) throws AMQStoreException
- {
- BDBMessageStore.this.enqueueMessage(_txn, queue, messageId);
- }
-
- public void dequeueMessage(TransactionLogResource queue, long messageId) throws AMQStoreException
- {
- BDBMessageStore.this.dequeueMessage(_txn, queue, messageId);
-
- }
-
- public void commitTran() throws AMQStoreException
- {
- BDBMessageStore.this.commitTranImpl(_txn, true);
- }
-
- public StoreFuture commitTranAsync() throws AMQStoreException
- {
- return BDBMessageStore.this.commitTranImpl(_txn, false);
- }
-
- public void abortTran() throws AMQStoreException
- {
- BDBMessageStore.this.abortTran(_txn);
- }
- }
-
}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreFactory.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreFactory.java
new file mode 100644
index 0000000000..7e5ef3f94c
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreFactory.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb;
+
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreFactory;
+
+public class BDBMessageStoreFactory implements MessageStoreFactory
+{
+
+ @Override
+ public MessageStore createMessageStore()
+ {
+ return new BDBMessageStore();
+ }
+
+ @Override
+ public String getStoreClassName()
+ {
+ return BDBMessageStore.class.getSimpleName();
+ }
+
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBStoreUpgrade.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBStoreUpgrade.java
deleted file mode 100644
index 817ba2a5f5..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBStoreUpgrade.java
+++ /dev/null
@@ -1,1299 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.je.Database;
-import com.sleepycat.je.DatabaseEntry;
-import com.sleepycat.je.DatabaseException;
-import com.sleepycat.je.Environment;
-import com.sleepycat.je.EnvironmentConfig;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.OptionBuilder;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-import org.apache.commons.cli.PosixParser;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.qpid.AMQException;
-import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.common.AMQPFilterTypes;
-import org.apache.qpid.exchange.ExchangeDefaults;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.logging.NullRootMessageLogger;
-import org.apache.qpid.server.logging.actors.BrokerActor;
-import org.apache.qpid.server.logging.actors.CurrentActor;
-import org.apache.qpid.server.message.MessageMetaData;
-import org.apache.qpid.server.store.berkeleydb.keys.MessageContentKey_4;
-import org.apache.qpid.server.store.berkeleydb.keys.MessageContentKey_5;
-import org.apache.qpid.server.store.berkeleydb.records.BindingRecord;
-import org.apache.qpid.server.store.berkeleydb.records.ExchangeRecord;
-import org.apache.qpid.server.store.berkeleydb.records.QueueRecord;
-import org.apache.qpid.server.store.berkeleydb.tuples.MessageContentKeyTB_4;
-import org.apache.qpid.server.store.berkeleydb.tuples.MessageContentKeyTB_5;
-import org.apache.qpid.server.store.berkeleydb.tuples.QueueEntryTB;
-import org.apache.qpid.util.FileUtils;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.nio.ByteBuffer;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Set;
-
-/**
- * This is a simple BerkeleyDB Store upgrade tool that will upgrade a V4 Store to a V5 Store.
- *
- * Currently upgrade is fixed from v4 -> v5
- *
- * Improvments:
- * - Add List BDBMessageStore.getDatabases(); This can the be iterated to guard against new DBs being added.
- * - A version in the store would allow automated upgrade or later with more available versions interactive upgrade.
- * - Add process logging and disable all Store and Qpid logging.
- */
-public class BDBStoreUpgrade
-{
- private static final Logger _logger = LoggerFactory.getLogger(BDBStoreUpgrade.class);
- /** The Store Directory that needs upgrading */
- private File _fromDir;
- /** The Directory that will be made to contain the upgraded store */
- private File _toDir;
- /** The Directory that will be made to backup the original store if required */
- private File _backupDir;
-
- /** The Old Store */
- private BDBMessageStore _oldMessageStore;
- /** The New Store */
- private BDBMessageStore _newMessageStore;
- /** The file ending that is used by BDB Store Files */
- private static final String BDB_FILE_ENDING = ".jdb";
-
- static final Options _options = new Options();
- private static CommandLine _commandLine;
- private boolean _interactive;
- private boolean _force;
-
- private static final String VERSION = "3.0";
- private static final String USER_ABORTED_PROCESS = "User aborted process";
- private static final int LOWEST_SUPPORTED_STORE_VERSION = 4;
- private static final String PREVIOUS_STORE_VERSION_UNSUPPORTED = "Store upgrade from version {0} is not supported."
- + " You must first run the previous store upgrade tool.";
- private static final String FOLLOWING_STORE_VERSION_UNSUPPORTED = "Store version {0} is newer than this tool supports. "
- + "You must use a newer version of the store upgrade tool";
- private static final String STORE_ALREADY_UPGRADED = "Store has already been upgraded to version {0}.";
-
- private static final String OPTION_INPUT_SHORT = "i";
- private static final String OPTION_INPUT = "input";
- private static final String OPTION_OUTPUT_SHORT = "o";
- private static final String OPTION_OUTPUT = "output";
- private static final String OPTION_BACKUP_SHORT = "b";
- private static final String OPTION_BACKUP = "backup";
- private static final String OPTION_QUIET_SHORT = "q";
- private static final String OPTION_QUIET = "quiet";
- private static final String OPTION_FORCE_SHORT = "f";
- private static final String OPTION_FORCE = "force";
- private boolean _inplace = false;
-
- public BDBStoreUpgrade(String fromDir, String toDir, String backupDir, boolean interactive, boolean force)
- {
- _interactive = interactive;
- _force = force;
-
- _fromDir = new File(fromDir);
- if (!_fromDir.exists())
- {
- throw new IllegalArgumentException("BDBStore path '" + fromDir + "' could not be read. "
- + "Ensure the path is correct and that the permissions are correct.");
- }
-
- if (!isDirectoryAStoreDir(_fromDir))
- {
- throw new IllegalArgumentException("Specified directory '" + fromDir + "' does not contain a valid BDBMessageStore.");
- }
-
- if (toDir == null)
- {
- _inplace = true;
- _toDir = new File(fromDir+"-Inplace");
- }
- else
- {
- _toDir = new File(toDir);
- }
-
- if (_toDir.exists())
- {
- if (_interactive)
- {
- if (toDir == null)
- {
- System.out.println("Upgrading in place:" + fromDir);
- }
- else
- {
- System.out.println("Upgrade destination: '" + toDir + "'");
- }
-
- if (userInteract("Upgrade destination exists do you wish to replace it?"))
- {
- if (!FileUtils.delete(_toDir, true))
- {
- throw new IllegalArgumentException("Unable to remove upgrade destination '" + _toDir + "'");
- }
- }
- else
- {
- throw new IllegalArgumentException("Upgrade destination '" + _toDir + "' already exists. ");
- }
- }
- else
- {
- if (_force)
- {
- if (!FileUtils.delete(_toDir, true))
- {
- throw new IllegalArgumentException("Unable to remove upgrade destination '" + _toDir + "'");
- }
- }
- else
- {
- throw new IllegalArgumentException("Upgrade destination '" + _toDir + "' already exists. ");
- }
- }
- }
-
- if (!_toDir.mkdirs())
- {
- throw new IllegalArgumentException("Upgrade destination '" + _toDir + "' could not be created. "
- + "Ensure the path is correct and that the permissions are correct.");
- }
-
- if (backupDir != null)
- {
- if (backupDir.equals(""))
- {
- _backupDir = new File(_fromDir.getAbsolutePath().toString() + "-Backup");
- }
- else
- {
- _backupDir = new File(backupDir);
- }
- }
- else
- {
- _backupDir = null;
- }
- }
-
- private static String ANSWER_OPTIONS = " Yes/No/Abort? ";
- private static String ANSWER_NO = "no";
- private static String ANSWER_N = "n";
- private static String ANSWER_YES = "yes";
- private static String ANSWER_Y = "y";
- private static String ANSWER_ABORT = "abort";
- private static String ANSWER_A = "a";
-
- /**
- * Interact with the user via System.in and System.out. If the user wishes to Abort then a RuntimeException is thrown.
- * Otherwise the method will return based on their response true=yes false=no.
- *
- * @param message Message to print out
- *
- * @return boolean response from user if they wish to proceed
- */
- private boolean userInteract(String message)
- {
- System.out.print(message + ANSWER_OPTIONS);
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
-
- String input = "";
- try
- {
- input = br.readLine();
- }
- catch (IOException e)
- {
- input = "";
- }
-
- if (input.equalsIgnoreCase(ANSWER_Y) || input.equalsIgnoreCase(ANSWER_YES))
- {
- return true;
- }
- else
- {
- if (input.equalsIgnoreCase(ANSWER_N) || input.equalsIgnoreCase(ANSWER_NO))
- {
- return false;
- }
- else
- {
- if (input.equalsIgnoreCase(ANSWER_A) || input.equalsIgnoreCase(ANSWER_ABORT))
- {
- throw new RuntimeException(USER_ABORTED_PROCESS);
- }
- }
- }
-
- return userInteract(message);
- }
-
- /**
- * Upgrade a Store of a specified version to the latest version.
- *
- * @param version the version of the current store
- *
- * @throws Exception
- */
- public void upgradeFromVersion(int version) throws Exception
- {
- upgradeFromVersion(version, _fromDir, _toDir, _backupDir, _force,
- _inplace);
- }
-
- /**
- * Upgrade a Store of a specified version to the latest version.
- *
- * @param version the version of the current store
- * @param fromDir the directory with the old Store
- * @param toDir the directrory to hold the newly Upgraded Store
- * @param backupDir the directrory to backup to if required
- * @param force suppress all questions
- * @param inplace replace the from dir with the upgraded result in toDir
- *
- * @throws Exception due to Virtualhost/MessageStore.close() being
- * rather poor at exception handling
- * @throws DatabaseException if there is a problem with the store formats
- * @throws AMQException if there is an issue creating Qpid data structures
- */
- public void upgradeFromVersion(int version, File fromDir, File toDir,
- File backupDir, boolean force,
- boolean inplace) throws Exception
- {
- _logger.info("Located store to upgrade at '" + fromDir + "'");
-
- // Verify user has created a backup, giving option to perform backup
- if (_interactive)
- {
- if (!userInteract("Have you performed a DB backup of this store."))
- {
- File backup;
- if (backupDir == null)
- {
- backup = new File(fromDir.getAbsolutePath().toString() + "-Backup");
- }
- else
- {
- backup = backupDir;
- }
-
- if (userInteract("Do you wish to perform a DB backup now? " +
- "(Store will be backed up to '" + backup.getName() + "')"))
- {
- performDBBackup(fromDir, backup, force);
- }
- else
- {
- if (!userInteract("Are you sure wish to proceed with DB migration without backup? " +
- "(For more details of the consequences check the Qpid/BDB Message Store Wiki)."))
- {
- throw new IllegalArgumentException("Upgrade stopped at user request as no DB Backup performed.");
- }
- }
- }
- else
- {
- if (!inplace)
- {
- _logger.info("Upgrade will create a new store at '" + toDir + "'");
- }
-
- _logger.info("Using the contents in the Message Store '" + fromDir + "'");
-
- if (!userInteract("Do you wish to proceed?"))
- {
- throw new IllegalArgumentException("Upgrade stopped as did not wish to proceed");
- }
- }
- }
- else
- {
- if (backupDir != null)
- {
- performDBBackup(fromDir, backupDir, force);
- }
- }
-
- CurrentActor.set(new BrokerActor(new NullRootMessageLogger()));
-
- //Create a new messageStore
- _newMessageStore = new BDBMessageStore();
- _newMessageStore.configure(toDir, false);
- _newMessageStore.start();
-
- try
- {
- //Load the old MessageStore
- switch (version)
- {
- default:
- case 4:
- _oldMessageStore = new BDBMessageStore(4);
- _oldMessageStore.configure(fromDir, true);
- _oldMessageStore.start();
- upgradeFromVersion_4();
- break;
- case 3:
- case 2:
- case 1:
- throw new IllegalArgumentException(MessageFormat.format(PREVIOUS_STORE_VERSION_UNSUPPORTED,
- new Object[] { Integer.toString(version) }));
- }
- }
- finally
- {
- _newMessageStore.close();
- if (_oldMessageStore != null)
- {
- _oldMessageStore.close();
- }
- // if we are running inplace then swap fromDir and toDir
- if (inplace)
- {
- // Remove original copy
- if (FileUtils.delete(fromDir, true))
- {
- // Rename upgraded store
- toDir.renameTo(fromDir);
- }
- else
- {
- throw new RuntimeException("Unable to upgrade inplace as " +
- "unable to delete source '"
- +fromDir+"', Store upgrade " +
- "successfully performed to :"
- +toDir);
- }
- }
- }
- }
-
- private void upgradeFromVersion_4() throws AMQException, DatabaseException
- {
- _logger.info("Starting store upgrade from version 4");
-
- //Migrate _exchangeDb
- _logger.info("Exchanges");
-
- moveContents(_oldMessageStore.getExchangesDb(), _newMessageStore.getExchangesDb(), "Exchange");
-
-
- TopicExchangeDiscoverer exchangeListVisitor = new TopicExchangeDiscoverer();
- _oldMessageStore.visitExchanges(exchangeListVisitor);
-
- //Inspect the bindings to gather a list of queues which are probably durable subscriptions, i.e. those
- //which have a colon in their name and are bound to the Topic exchanges above
- DurableSubDiscoverer durSubQueueListVisitor =
- new DurableSubDiscoverer(exchangeListVisitor.getTopicExchanges(),
- _oldMessageStore.getBindingTupleBindingFactory().getInstance());
- _oldMessageStore.visitBindings(durSubQueueListVisitor);
-
- final List<AMQShortString> durableSubQueues = durSubQueueListVisitor.getDurableSubQueues();
-
-
- //Migrate _queueBindingsDb
- _logger.info("Queue Bindings");
- BindingsVisitor bindingsVisitor = new BindingsVisitor(durableSubQueues,
- _oldMessageStore.getBindingTupleBindingFactory().getInstance(), _newMessageStore);
- _oldMessageStore.visitBindings(bindingsVisitor);
- logCount(bindingsVisitor.getVisitedCount(), "Queue Binding");
-
- //Migrate _queueDb
- _logger.info("Queues");
-
- // hold the list of existing queue names
-
- final TupleBinding<QueueRecord> queueTupleBinding = _oldMessageStore.getQueueTupleBindingFactory().getInstance();
-
- QueueVisitor queueVisitor = new QueueVisitor(queueTupleBinding, durableSubQueues, _newMessageStore);
- _oldMessageStore.visitQueues(queueVisitor);
- final List<AMQShortString> existingQueues = queueVisitor.getExistingQueues();
-
- logCount(queueVisitor.getVisitedCount(), "Queue");
-
-
- // Look for persistent messages stored for non-durable queues
- _logger.info("Checking for messages previously sent to non-durable queues");
-
- // delivery DB visitor to check message delivery and identify non existing queues
- final QueueEntryTB queueEntryTB = new QueueEntryTB();
- MessageDeliveryCheckVisitor messageDeliveryCheckVisitor =
- new MessageDeliveryCheckVisitor(queueEntryTB, queueVisitor.getExistingQueues());
- _oldMessageStore.visitDelivery(messageDeliveryCheckVisitor);
-
- final Set<Long> queueMessages = messageDeliveryCheckVisitor.getQueueMessages();
-
- if (messageDeliveryCheckVisitor.getPhantomMessageQueues().isEmpty())
- {
- _logger.info("No such messages were found");
- }
- else
- {
- _logger.info("Found " + messageDeliveryCheckVisitor.getVisitedCount()+ " such messages in total");
-
- for (Entry<String, HashSet<Long>> phantomQueue : messageDeliveryCheckVisitor.getPhantomMessageQueues().entrySet())
- {
- String queueName = phantomQueue.getKey();
- HashSet<Long> messages = phantomQueue.getValue();
-
- _logger.info(MessageFormat.format("There are {0} messages which were previously delivered to non-durable queue ''{1}''",messages.size(), queueName));
-
- boolean createQueue;
- if(!_interactive)
- {
- createQueue = true;
- _logger.info("Running in batch-mode, marking queue as durable to ensure retention of the messages.");
- }
- else
- {
- createQueue = userInteract("Do you want to make this queue durable?\n"
- + "NOTE: Answering No will result in these messages being discarded!");
- }
-
- if (createQueue)
- {
- for (Long messageId : messages)
- {
- queueMessages.add(messageId);
- }
- AMQShortString name = new AMQShortString(queueName);
- existingQueues.add(name);
- QueueRecord record = new QueueRecord(name, null, false, null);
- _newMessageStore.createQueue(record);
- }
- }
- }
-
-
- //Migrate _messageMetaDataDb
- _logger.info("Message MetaData");
-
- final Database newMetaDataDB = _newMessageStore.getMetaDataDb();
-
- MetaDataVisitor metaDataVisitor = new MetaDataVisitor(queueMessages, newMetaDataDB,
- _oldMessageStore.getMetaDataTupleBindingFactory().getInstance(),
- _newMessageStore.getMetaDataTupleBindingFactory().getInstance());
- _oldMessageStore.visitMetaDataDb(metaDataVisitor);
-
- logCount(metaDataVisitor.getVisitedCount(), "Message MetaData");
-
-
- //Migrate _messageContentDb
- _logger.info("Message Contents");
- final Database newContentDB = _newMessageStore.getContentDb();
-
- final TupleBinding<MessageContentKey> oldContentKeyTupleBinding = new MessageContentKeyTB_4();
- final TupleBinding<MessageContentKey> newContentKeyTupleBinding = new MessageContentKeyTB_5();
- final TupleBinding contentTB = new ContentTB();
-
- DatabaseVisitor contentVisitor = new ContentVisitor(oldContentKeyTupleBinding, queueMessages,
- contentTB, newContentKeyTupleBinding, newContentDB);
- _oldMessageStore.visitContentDb(contentVisitor);
-
- logCount(contentVisitor.getVisitedCount(), "Message Content");
-
-
- //Migrate _deliveryDb
- _logger.info("Delivery Records");
- final Database deliveryDb =_newMessageStore.getDeliveryDb();
- DatabaseVisitor deliveryDbVisitor = new DeliveryDbVisitor(queueEntryTB, existingQueues, deliveryDb);
- _oldMessageStore.visitDelivery(deliveryDbVisitor);
- logCount(contentVisitor.getVisitedCount(), "Delivery Record");
- }
-
- /**
- * Log the specified count for item in a user friendly way.
- *
- * @param count of items to log
- * @param item description of what is being logged.
- */
- private void logCount(int count, String item)
- {
- _logger.info(" " + count + " " + item + " " + (count == 1 ? "entry" : "entries"));
- }
-
- /**
- * @param oldDatabase The old MessageStoreDB to perform the visit on
- * @param newDatabase The new MessageStoreDB to copy the data to.
- * @param contentName The string name of the content for display purposes.
- *
- * @throws AMQException Due to createQueue thorwing AMQException
- * @throws DatabaseException If there is a problem with the loading of the data
- */
- private void moveContents(Database oldDatabase, final Database newDatabase, String contentName) throws AMQException, DatabaseException
- {
-
- DatabaseVisitor moveVisitor = new DatabaseVisitor()
- {
- public void visit(DatabaseEntry key, DatabaseEntry value) throws DatabaseException
- {
- incrementCount();
- newDatabase.put(null, key, value);
- }
- };
-
- _oldMessageStore.visitDatabase(oldDatabase, moveVisitor);
-
- logCount(moveVisitor.getVisitedCount(), contentName);
- }
-
- private static void usage()
- {
- System.out.println("usage: BDBStoreUpgrade:\n [-h|--help] [-q|--quiet] [-f|--force] [-b|--backup <Path to backup-db>] " +
- "-i|--input <Path to input-db> [-o|--output <Path to upgraded-db>]");
- }
-
- private static void help()
- {
- System.out.println("usage: BDBStoreUpgrade:");
- System.out.println("Required:");
- for (Object obj : _options.getOptions())
- {
- Option option = (Option) obj;
- if (option.isRequired())
- {
- System.out.println("-" + option.getOpt() + "|--" + option.getLongOpt() + "\t\t-\t" + option.getDescription());
- }
- }
-
- System.out.println("\nOptions:");
- for (Object obj : _options.getOptions())
- {
- Option option = (Option) obj;
- if (!option.isRequired())
- {
- System.out.println("--" + option.getLongOpt() + "|-" + option.getOpt() + "\t\t-\t" + option.getDescription());
- }
- }
- }
-
- static boolean isDirectoryAStoreDir(File directory)
- {
- if (directory.isFile())
- {
- return false;
- }
-
- for (File file : directory.listFiles())
- {
- if (file.isFile())
- {
- if (file.getName().endsWith(BDB_FILE_ENDING))
- {
- return true;
- }
- }
- }
- return false;
- }
-
- static File[] discoverDBStores(File fromDir)
- {
- if (!fromDir.exists())
- {
- throw new IllegalArgumentException("'" + fromDir + "' does not exist unable to upgrade.");
- }
-
- // Ensure we are given a directory
- if (fromDir.isFile())
- {
- throw new IllegalArgumentException("'" + fromDir + "' is not a directory unable to upgrade.");
- }
-
- // Check to see if we have been given a single directory
- if (isDirectoryAStoreDir(fromDir))
- {
- return new File[]{fromDir};
- }
-
- // Check to see if we have been give a directory containing stores.
- List<File> stores = new LinkedList<File>();
-
- for (File directory : fromDir.listFiles())
- {
- if (directory.isDirectory())
- {
- if (isDirectoryAStoreDir(directory))
- {
- stores.add(directory);
- }
- }
- }
-
- return stores.toArray(new File[stores.size()]);
- }
-
- private static void performDBBackup(File source, File backup, boolean force) throws Exception
- {
- if (backup.exists())
- {
- if (force)
- {
- _logger.info("Backup location exists. Forced to remove.");
- FileUtils.delete(backup, true);
- }
- else
- {
- throw new IllegalArgumentException("Unable to perform backup a backup already exists.");
- }
- }
-
- try
- {
- _logger.info("Backing up '" + source + "' to '" + backup + "'");
- FileUtils.copyRecursive(source, backup);
- }
- catch (FileNotFoundException e)
- {
- //Throwing IAE here as this will be reported as a Backup not started
- throw new IllegalArgumentException("Unable to perform backup:" + e.getMessage());
- }
- catch (FileUtils.UnableToCopyException e)
- {
- //Throwing exception here as this will be reported as a Failed Backup
- throw new Exception("Unable to perform backup due to:" + e.getMessage());
- }
- }
-
- public static void main(String[] args) throws ParseException
- {
- setOptions(_options);
-
- final Options helpOptions = new Options();
- setHelpOptions(helpOptions);
-
- //Display help
- boolean displayHelp = false;
- try
- {
- if (new PosixParser().parse(helpOptions, args).hasOption("h"))
- {
- showHelp();
- }
- }
- catch (ParseException pe)
- {
- displayHelp = true;
- }
-
- //Parse commandline for required arguments
- try
- {
- _commandLine = new PosixParser().parse(_options, args);
- }
- catch (ParseException mae)
- {
- if (displayHelp)
- {
- showHelp();
- }
- else
- {
- fatalError(mae.getMessage());
- }
- }
-
- String fromDir = _commandLine.getOptionValue(OPTION_INPUT_SHORT);
- String toDir = _commandLine.getOptionValue(OPTION_OUTPUT_SHORT);
- String backupDir = _commandLine.getOptionValue(OPTION_BACKUP_SHORT);
-
- if (backupDir == null && _commandLine.hasOption(OPTION_BACKUP_SHORT))
- {
- backupDir = "";
- }
-
- //Attempt to locate possible Store to upgrade on input path
- File[] stores = new File[0];
- try
- {
- stores = discoverDBStores(new File(fromDir));
- }
- catch (IllegalArgumentException iae)
- {
- fatalError(iae.getMessage());
- }
-
- boolean interactive = !_commandLine.hasOption(OPTION_QUIET_SHORT);
- boolean force = _commandLine.hasOption(OPTION_FORCE_SHORT);
-
- try{
- for (File store : stores)
- {
-
- // if toDir is null then we are upgrading inplace so we don't need
- // to provide an upgraded toDir when upgrading multiple stores.
- if (toDir == null ||
- // Check to see if we are upgrading a store specified in
- // fromDir or if the directories are nested.
- (stores.length > 0
- && stores[0].toString().length() == fromDir.length()))
- {
- upgrade(store, toDir, backupDir, interactive, force);
- }
- else
- {
- // Add the extra part of path from store to the toDir
- upgrade(store, toDir + File.separator + store.toString().substring(fromDir.length()), backupDir, interactive, force);
- }
- }
- }
- catch (RuntimeException re)
- {
- if (!(USER_ABORTED_PROCESS).equals(re.getMessage()))
- {
- re.printStackTrace();
- _logger.error("Upgrade Failed: " + re.getMessage());
- }
- else
- {
- _logger.error("Upgrade stopped : User aborted");
- }
- }
-
- }
-
- @SuppressWarnings("static-access")
- private static void setOptions(Options options)
- {
- Option input =
- OptionBuilder.isRequired().hasArg().withDescription("Location (Path) of store to upgrade.").withLongOpt(OPTION_INPUT)
- .create(OPTION_INPUT_SHORT);
-
- Option output =
- OptionBuilder.hasArg().withDescription("Location (Path) for the upgraded-db to be written.").withLongOpt(OPTION_OUTPUT)
- .create(OPTION_OUTPUT_SHORT);
-
- Option quiet = new Option(OPTION_QUIET_SHORT, OPTION_QUIET, false, "Disable interactive options.");
-
- Option force = new Option(OPTION_FORCE_SHORT, OPTION_FORCE, false, "Force upgrade removing any existing upgrade target.");
- Option backup =
- OptionBuilder.hasOptionalArg().withDescription("Location (Path) for the backup-db to be written.").withLongOpt(OPTION_BACKUP)
- .create(OPTION_BACKUP_SHORT);
-
- options.addOption(input);
- options.addOption(output);
- options.addOption(quiet);
- options.addOption(force);
- options.addOption(backup);
- setHelpOptions(options);
- }
-
- private static void setHelpOptions(Options options)
- {
- options.addOption(new Option("h", "help", false, "Show this help."));
- }
-
- static void upgrade(File fromDir, String toDir, String backupDir, boolean interactive, boolean force)
- {
-
- _logger.info("Running BDB Message Store upgrade tool: v" + VERSION);
- int version = getStoreVersion(fromDir);
- if (!isVersionUpgradable(version))
- {
- return;
- }
- try
- {
- new BDBStoreUpgrade(fromDir.toString(), toDir, backupDir, interactive, force).upgradeFromVersion(version);
-
- _logger.info("Upgrade complete.");
- }
- catch (IllegalArgumentException iae)
- {
- _logger.error("Upgrade not started due to: " + iae.getMessage());
- }
- catch (DatabaseException de)
- {
- de.printStackTrace();
- _logger.error("Upgrade Failed: " + de.getMessage());
- }
- catch (RuntimeException re)
- {
- if (!(USER_ABORTED_PROCESS).equals(re.getMessage()))
- {
- re.printStackTrace();
- _logger.error("Upgrade Failed: " + re.getMessage());
- }
- else
- {
- throw re;
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- _logger.error("Upgrade Failed: " + e.getMessage());
- }
- }
-
- /**
- * Utility method to verify if store of given version can be upgraded.
- *
- * @param version
- * store version to verify
- * @return true if store can be upgraded, false otherwise
- */
- protected static boolean isVersionUpgradable(int version)
- {
- boolean storeUpgradable = false;
- if (version == 0)
- {
- _logger.error("Existing store version is undefined!");
- }
- else if (version < LOWEST_SUPPORTED_STORE_VERSION)
- {
- _logger.error(MessageFormat.format(PREVIOUS_STORE_VERSION_UNSUPPORTED,
- new Object[] { Integer.toString(version) }));
- }
- else if (version == BDBMessageStore.DATABASE_FORMAT_VERSION)
- {
- _logger.error(MessageFormat.format(STORE_ALREADY_UPGRADED, new Object[] { Integer.toString(version) }));
- }
- else if (version > BDBMessageStore.DATABASE_FORMAT_VERSION)
- {
- _logger.error(MessageFormat.format(FOLLOWING_STORE_VERSION_UNSUPPORTED,
- new Object[] { Integer.toString(version) }));
- }
- else
- {
- _logger.info("Existing store version is " + version);
- storeUpgradable = true;
- }
- return storeUpgradable;
- }
-
- /**
- * Detects existing store version by checking list of database in store
- * environment
- *
- * @param fromDir
- * store folder
- * @return version
- */
- public static int getStoreVersion(File fromDir)
- {
- int version = 0;
- EnvironmentConfig envConfig = new EnvironmentConfig();
- envConfig.setAllowCreate(false);
- envConfig.setTransactional(false);
- envConfig.setReadOnly(true);
- Environment environment = null;
- try
- {
-
- environment = new Environment(fromDir, envConfig);
- List<String> databases = environment.getDatabaseNames();
- for (String name : databases)
- {
- if (name.startsWith("exchangeDb"))
- {
- if (name.startsWith("exchangeDb_v"))
- {
- version = Integer.parseInt(name.substring(12));
- }
- else
- {
- version = 1;
- }
- break;
- }
- }
- }
- catch (Exception e)
- {
- _logger.error("Failure to open existing database: " + e.getMessage());
- }
- finally
- {
- if (environment != null)
- {
- try
- {
- environment.close();
- }
- catch (Exception e)
- {
- // ignoring. It should never happen.
- }
- }
- }
- return version;
- }
-
- private static void fatalError(String message)
- {
- System.out.println(message);
- usage();
- System.exit(1);
- }
-
- private static void showHelp()
- {
- help();
- System.exit(0);
- }
-
- private static class TopicExchangeDiscoverer extends DatabaseVisitor
- {
- private final List<AMQShortString> topicExchanges = new ArrayList<AMQShortString>();
- private final TupleBinding exchangeTB = new ExchangeTB();
-
- public void visit(DatabaseEntry key, DatabaseEntry value) throws DatabaseException
- {
- ExchangeRecord exchangeRec = (ExchangeRecord) exchangeTB.entryToObject(value);
- AMQShortString type = exchangeRec.getType();
-
- if (ExchangeDefaults.TOPIC_EXCHANGE_CLASS.equals(type))
- {
- topicExchanges.add(exchangeRec.getNameShortString());
- }
- }
-
- public List<AMQShortString> getTopicExchanges()
- {
- return topicExchanges;
- }
- }
-
- private static class MessageDeliveryCheckVisitor extends DatabaseVisitor
- {
- private final QueueEntryTB _queueEntryTB;
- private final List<AMQShortString> _existingQueues;
-
- // track all message delivery to existing queues
- private final HashSet<Long> _queueMessages = new HashSet<Long>();
-
- // hold all non existing queues and their messages IDs
- private final HashMap<String, HashSet<Long>> _phantomMessageQueues = new HashMap<String, HashSet<Long>>();
-
-
-
- public MessageDeliveryCheckVisitor(QueueEntryTB queueEntryTB, List<AMQShortString> existingQueues)
- {
- _queueEntryTB = queueEntryTB;
- _existingQueues = existingQueues;
- }
-
- public void visit(DatabaseEntry key, DatabaseEntry value) throws DatabaseException
- {
- QueueEntryKey entryKey = (QueueEntryKey) _queueEntryTB.entryToObject(key);
- Long messageId = entryKey.getMessageId();
- AMQShortString queueName = entryKey.getQueueName();
- if (!_existingQueues.contains(queueName))
- {
- String name = queueName.asString();
- HashSet<Long> messages = _phantomMessageQueues.get(name);
- if (messages == null)
- {
- messages = new HashSet<Long>();
- _phantomMessageQueues.put(name, messages);
- }
- messages.add(messageId);
- incrementCount();
- }
- else
- {
- _queueMessages.add(messageId);
- }
- }
-
- public HashSet<Long> getQueueMessages()
- {
- return _queueMessages;
- }
-
- public HashMap<String, HashSet<Long>> getPhantomMessageQueues()
- {
- return _phantomMessageQueues;
- }
- }
-
- private static class ContentVisitor extends DatabaseVisitor
- {
- private long _prevMsgId; //Initialise to invalid value
- private int _bytesSeenSoFar;
- private final TupleBinding<MessageContentKey> _oldContentKeyTupleBinding;
- private final Set<Long> _queueMessages;
- private final TupleBinding _contentTB;
- private final TupleBinding<MessageContentKey> _newContentKeyTupleBinding;
- private final Database _newContentDB;
-
- public ContentVisitor(TupleBinding<MessageContentKey> oldContentKeyTupleBinding, Set<Long> queueMessages, TupleBinding contentTB, TupleBinding<MessageContentKey> newContentKeyTupleBinding, Database newContentDB)
- {
- _oldContentKeyTupleBinding = oldContentKeyTupleBinding;
- _queueMessages = queueMessages;
- _contentTB = contentTB;
- _newContentKeyTupleBinding = newContentKeyTupleBinding;
- _newContentDB = newContentDB;
- _prevMsgId = -1;
- _bytesSeenSoFar = 0;
- }
-
- public void visit(DatabaseEntry key, DatabaseEntry value) throws DatabaseException
- {
- incrementCount();
-
- //determine the msgId of the current entry
- MessageContentKey_4 contentKey = (MessageContentKey_4) _oldContentKeyTupleBinding.entryToObject(key);
- long msgId = contentKey.getMessageId();
-
- // ONLY copy data if message is delivered to existing queue
- if (!_queueMessages.contains(msgId))
- {
- return;
- }
- //if this is a new message, restart the byte offset count.
- if(_prevMsgId != msgId)
- {
- _bytesSeenSoFar = 0;
- }
-
- //determine the content size
- ByteBuffer content = (ByteBuffer) _contentTB.entryToObject(value);
- int contentSize = content.limit();
-
- //create the new key: id + previously seen data count
- MessageContentKey_5 newKey = new MessageContentKey_5(msgId, _bytesSeenSoFar);
- DatabaseEntry newKeyEntry = new DatabaseEntry();
- _newContentKeyTupleBinding.objectToEntry(newKey, newKeyEntry);
-
- DatabaseEntry newValueEntry = new DatabaseEntry();
- _contentTB.objectToEntry(content, newValueEntry);
-
- _newContentDB.put(null, newKeyEntry, newValueEntry);
-
- _prevMsgId = msgId;
- _bytesSeenSoFar += contentSize;
- }
- }
-
- private static class DeliveryDbVisitor extends DatabaseVisitor
- {
-
- private final QueueEntryTB _queueEntryTB;
- private final List<AMQShortString> _existingQueues;
- private final Database _deliveryDb;
-
- public DeliveryDbVisitor(QueueEntryTB queueEntryTB, List<AMQShortString> existingQueues, Database deliveryDb)
- {
- _queueEntryTB = queueEntryTB;
- _existingQueues = existingQueues;
- _deliveryDb = deliveryDb;
- }
-
- public void visit(DatabaseEntry key, DatabaseEntry value) throws DatabaseException
- {
- incrementCount();
-
- // get message id from entry key
- QueueEntryKey entryKey = (QueueEntryKey) _queueEntryTB.entryToObject(key);
- AMQShortString queueName = entryKey.getQueueName();
-
- // ONLY copy data if message queue exists
- if (_existingQueues.contains(queueName))
- {
- _deliveryDb.put(null, key, value);
- }
- }
- }
-
- private class DurableSubDiscoverer extends DatabaseVisitor
- {
- private final List<AMQShortString> _durableSubQueues;
- private final TupleBinding<BindingRecord> _bindingTB;
- private final List<AMQShortString> _topicExchanges;
-
-
- public DurableSubDiscoverer(List<AMQShortString> topicExchanges, TupleBinding<BindingRecord> bindingTB)
- {
- _durableSubQueues = new ArrayList<AMQShortString>();
- _bindingTB = bindingTB;
- _topicExchanges = topicExchanges;
- }
-
- public void visit(DatabaseEntry key, DatabaseEntry value) throws DatabaseException
- {
- BindingRecord bindingRec = _bindingTB.entryToObject(key);
- AMQShortString queueName = bindingRec.getQueueName();
- AMQShortString exchangeName = bindingRec.getExchangeName();
-
- if (_topicExchanges.contains(exchangeName) && queueName.asString().contains(":"))
- {
- _durableSubQueues.add(queueName);
- }
- }
-
- public List<AMQShortString> getDurableSubQueues()
- {
- return _durableSubQueues;
- }
- }
-
- private static class QueueVisitor extends DatabaseVisitor
- {
- private final TupleBinding<QueueRecord> _queueTupleBinding;
- private final List<AMQShortString> _durableSubQueues;
- private final List<AMQShortString> _existingQueues = new ArrayList<AMQShortString>();
- private final BDBMessageStore _newMessageStore;
-
- public QueueVisitor(TupleBinding<QueueRecord> queueTupleBinding,
- List<AMQShortString> durableSubQueues,
- BDBMessageStore newMessageStore)
- {
- _queueTupleBinding = queueTupleBinding;
- _durableSubQueues = durableSubQueues;
- _newMessageStore = newMessageStore;
- }
-
- public void visit(DatabaseEntry key, DatabaseEntry value) throws AMQStoreException
- {
- QueueRecord queueRec = _queueTupleBinding.entryToObject(value);
- AMQShortString queueName = queueRec.getNameShortString();
-
- //if the queue name is in the gathered list then set its exclusivity true
- if (_durableSubQueues.contains(queueName))
- {
- _logger.info("Marking as possible DurableSubscription backing queue: " + queueName);
- queueRec.setExclusive(true);
- }
-
- //The simple call to createQueue with the QueueRecord object is sufficient for a v2->v3 upgrade as
- //the extra 'exclusive' property in v3 will be defaulted to false in the record creation.
- _newMessageStore.createQueue(queueRec);
-
- incrementCount();
- _existingQueues.add(queueName);
- }
-
- public List<AMQShortString> getExistingQueues()
- {
- return _existingQueues;
- }
- }
-
- private static class BindingsVisitor extends DatabaseVisitor
- {
- private final List<AMQShortString> _durableSubQueues;
- private final BDBMessageStore _newMessageStore;
- private final TupleBinding<BindingRecord> _oldBindingTB;
- private AMQShortString _selectorFilterKey;
-
- public BindingsVisitor(List<AMQShortString> durableSubQueues,
- TupleBinding<BindingRecord> oldBindingTB,
- BDBMessageStore newMessageStore)
- {
- _oldBindingTB = oldBindingTB;
- _durableSubQueues = durableSubQueues;
- _newMessageStore = newMessageStore;
- _selectorFilterKey = AMQPFilterTypes.JMS_SELECTOR.getValue();
- }
-
- public void visit(DatabaseEntry key, DatabaseEntry value) throws AMQStoreException
- {
- //All the information required in binding entries is actually in the *key* not value.
- BindingRecord oldBindingRec = _oldBindingTB.entryToObject(key);
-
- AMQShortString queueName = oldBindingRec.getQueueName();
- AMQShortString exchangeName = oldBindingRec.getExchangeName();
- AMQShortString routingKey = oldBindingRec.getRoutingKey();
- FieldTable arguments = oldBindingRec.getArguments();
-
- //if the queue name is in the gathered list then inspect its binding arguments
- if (_durableSubQueues.contains(queueName))
- {
- if(arguments == null)
- {
- arguments = new FieldTable();
- }
-
- if(!arguments.containsKey(_selectorFilterKey))
- {
- //add the empty string (i.e. 'no selector') value for the selector argument
- arguments.put(_selectorFilterKey, "");
- }
- }
-
- //create the binding in the new store
- _newMessageStore.bindQueue(
- new BindingRecord(exchangeName, queueName, routingKey, arguments));
- }
- }
-
- private static class MetaDataVisitor extends DatabaseVisitor
- {
- private final TupleBinding<Object> _oldMetaDataTupleBinding;
- private final TupleBinding<Object> _newMetaDataTupleBinding;
- private final Set<Long> _queueMessages;
- private final Database _newMetaDataDB;
-
- public MetaDataVisitor(Set<Long> queueMessages,
- Database newMetaDataDB,
- TupleBinding<Object> oldMetaDataTupleBinding,
- TupleBinding<Object> newMetaDataTupleBinding)
- {
- _queueMessages = queueMessages;
- _newMetaDataDB = newMetaDataDB;
- _oldMetaDataTupleBinding = oldMetaDataTupleBinding;
- _newMetaDataTupleBinding = newMetaDataTupleBinding;
- }
-
-
- public void visit(DatabaseEntry key, DatabaseEntry value) throws DatabaseException
- {
- incrementCount();
- MessageMetaData metaData = (MessageMetaData) _oldMetaDataTupleBinding.entryToObject(value);
-
- // get message id
- Long messageId = TupleBinding.getPrimitiveBinding(Long.class).entryToObject(key);
-
- // ONLY copy data if message is delivered to existing queue
- if (!_queueMessages.contains(messageId))
- {
- return;
- }
- DatabaseEntry newValue = new DatabaseEntry();
- _newMetaDataTupleBinding.objectToEntry(metaData, newValue);
-
- _newMetaDataDB.put(null, key, newValue);
- }
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/ContentTB.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/ContentTB.java
deleted file mode 100644
index ef9f60b2c4..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/ContentTB.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-
-import java.nio.ByteBuffer;
-
-public class ContentTB extends TupleBinding
-{
- public Object entryToObject(TupleInput tupleInput)
- {
-
- final int size = tupleInput.readInt();
- byte[] underlying = new byte[size];
- tupleInput.readFast(underlying);
- return ByteBuffer.wrap(underlying);
- }
-
- public void objectToEntry(Object object, TupleOutput tupleOutput)
- {
- ByteBuffer src = (ByteBuffer) object;
-
- src = src.slice();
-
- byte[] chunkData = new byte[src.limit()];
- src.duplicate().get(chunkData);
-
- tupleOutput.writeInt(chunkData.length);
- tupleOutput.writeFast(chunkData);
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/DatabaseVisitor.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/DatabaseVisitor.java
deleted file mode 100644
index c6a1372d7e..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/DatabaseVisitor.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb;
-
-import com.sleepycat.je.DatabaseEntry;
-import com.sleepycat.je.DatabaseException;
-
-import org.apache.qpid.AMQStoreException;
-
-/** Visitor Interface so that each DatabaseEntry for a database can easily be processed. */
-public abstract class DatabaseVisitor
-{
- private int _count;
-
- abstract public void visit(DatabaseEntry entry, DatabaseEntry value) throws AMQStoreException, DatabaseException;
-
- public final int getVisitedCount()
- {
- return _count;
- }
-
- protected final void incrementCount()
- {
- _count++;
- }
-
- public void resetVisitCount()
- {
- _count = 0;
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/ExchangeTB.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/ExchangeTB.java
deleted file mode 100644
index c7a409f8e1..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/ExchangeTB.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.server.store.berkeleydb.records.ExchangeRecord;
-
-public class ExchangeTB extends TupleBinding
-{
- private static final Logger _log = Logger.getLogger(ExchangeTB.class);
-
- public ExchangeTB()
- {
- }
-
- public Object entryToObject(TupleInput tupleInput)
- {
-
- AMQShortString name = AMQShortStringEncoding.readShortString(tupleInput);
- AMQShortString typeName = AMQShortStringEncoding.readShortString(tupleInput);
-
- boolean autoDelete = tupleInput.readBoolean();
-
- return new ExchangeRecord(name, typeName, autoDelete);
- }
-
- public void objectToEntry(Object object, TupleOutput tupleOutput)
- {
- ExchangeRecord exchange = (ExchangeRecord) object;
-
- AMQShortStringEncoding.writeShortString(exchange.getNameShortString(), tupleOutput);
- AMQShortStringEncoding.writeShortString(exchange.getType(), tupleOutput);
-
- tupleOutput.writeBoolean(exchange.isAutoDelete());
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/MessageContentKey.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/MessageContentKey.java
deleted file mode 100644
index 005e8d4604..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/MessageContentKey.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb;
-
-public class MessageContentKey
-{
- private long _messageId;
-
- public MessageContentKey(long messageId)
- {
- _messageId = messageId;
- }
-
-
- public long getMessageId()
- {
- return _messageId;
- }
-
- public void setMessageId(long messageId)
- {
- this._messageId = messageId;
- }
-} \ No newline at end of file
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/QueueEntryKey.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/QueueEntryKey.java
deleted file mode 100644
index c274fdec8c..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/QueueEntryKey.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb;
-
-import org.apache.qpid.framing.AMQShortString;
-
-public class QueueEntryKey
-{
- private AMQShortString _queueName;
- private long _messageId;
-
-
- public QueueEntryKey(AMQShortString queueName, long messageId)
- {
- _queueName = queueName;
- _messageId = messageId;
- }
-
-
- public AMQShortString getQueueName()
- {
- return _queueName;
- }
-
-
- public long getMessageId()
- {
- return _messageId;
- }
-
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StringMapBinding.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StringMapBinding.java
deleted file mode 100644
index f8fd39e127..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StringMapBinding.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class StringMapBinding extends TupleBinding<Map<String,String>>
-{
-
- private static final StringMapBinding INSTANCE = new StringMapBinding();
-
- public Map<String, String> entryToObject(final TupleInput tupleInput)
- {
- int entries = tupleInput.readInt();
- Map<String,String> map = new HashMap<String,String>(entries);
- for(int i = 0; i < entries; i++)
- {
- map.put(tupleInput.readString(), tupleInput.readString());
- }
- return map;
- }
-
-
- public void objectToEntry(final Map<String, String> stringStringMap, final TupleOutput tupleOutput)
- {
- tupleOutput.writeInt(stringStringMap.size());
- for(Map.Entry<String,String> entry : stringStringMap.entrySet())
- {
- tupleOutput.writeString(entry.getKey());
- tupleOutput.writeString(entry.getValue());
- }
- }
-
- public static StringMapBinding getInstance()
- {
- return INSTANCE;
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/UUIDTupleBinding.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/UUIDTupleBinding.java
deleted file mode 100644
index c1a5d473f0..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/UUIDTupleBinding.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-
-import java.util.UUID;
-
-public class UUIDTupleBinding extends TupleBinding<UUID>
-{
- private static final UUIDTupleBinding INSTANCE = new UUIDTupleBinding();
-
- public UUID entryToObject(final TupleInput tupleInput)
- {
- return new UUID(tupleInput.readLong(), tupleInput.readLong());
- }
-
- public void objectToEntry(final UUID uuid, final TupleOutput tupleOutput)
- {
- tupleOutput.writeLong(uuid.getMostSignificantBits());
- tupleOutput.writeLong(uuid.getLeastSignificantBits());
- }
-
- public static UUIDTupleBinding getInstance()
- {
- return INSTANCE;
- }
-
-
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/PreparedTransaction.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/PreparedTransaction.java
new file mode 100644
index 0000000000..eb5c4677ff
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/PreparedTransaction.java
@@ -0,0 +1,46 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.store.berkeleydb.entry;
+
+import org.apache.qpid.server.store.Transaction;
+
+public class PreparedTransaction
+{
+ private final Transaction.Record[] _enqueues;
+ private final Transaction.Record[] _dequeues;
+
+ public PreparedTransaction(Transaction.Record[] enqueues, Transaction.Record[] dequeues)
+ {
+ _enqueues = enqueues;
+ _dequeues = dequeues;
+ }
+
+ public Transaction.Record[] getEnqueues()
+ {
+ return _enqueues;
+ }
+
+ public Transaction.Record[] getDequeues()
+ {
+ return _dequeues;
+ }
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/QueueEntryKey.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/QueueEntryKey.java
new file mode 100644
index 0000000000..e7cf93ff7a
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/QueueEntryKey.java
@@ -0,0 +1,45 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.entry;
+
+import java.util.UUID;
+
+public class QueueEntryKey
+{
+ private UUID _queueId;
+ private long _messageId;
+
+ public QueueEntryKey(UUID queueId, long messageId)
+ {
+ _queueId = queueId;
+ _messageId = messageId;
+ }
+
+ public UUID getQueueId()
+ {
+ return _queueId;
+ }
+
+ public long getMessageId()
+ {
+ return _messageId;
+ }
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/Xid.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/Xid.java
new file mode 100644
index 0000000000..bed7575f9a
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/Xid.java
@@ -0,0 +1,52 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.store.berkeleydb.entry;
+
+public class Xid
+{
+
+ private final long _format;
+ private final byte[] _globalId;
+ private final byte[] _branchId;
+
+ public Xid(long format, byte[] globalId, byte[] branchId)
+ {
+ _format = format;
+ _globalId = globalId;
+ _branchId = branchId;
+ }
+
+ public long getFormat()
+ {
+ return _format;
+ }
+
+ public byte[] getGlobalId()
+ {
+ return _globalId;
+ }
+
+ public byte[] getBranchId()
+ {
+ return _branchId;
+ }
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/keys/MessageContentKey_4.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/keys/MessageContentKey_4.java
deleted file mode 100644
index 30357c97d4..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/keys/MessageContentKey_4.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.keys;
-
-import org.apache.qpid.server.store.berkeleydb.MessageContentKey;
-
-public class MessageContentKey_4 extends MessageContentKey
-{
- private int _chunkNum;
-
- public MessageContentKey_4(long messageId, int chunkNo)
- {
- super(messageId);
- _chunkNum = chunkNo;
- }
-
- public int getChunk()
- {
- return _chunkNum;
- }
-
- public void setChunk(int chunk)
- {
- this._chunkNum = chunk;
- }
-} \ No newline at end of file
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/keys/MessageContentKey_5.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/keys/MessageContentKey_5.java
deleted file mode 100644
index a1a7fe80b5..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/keys/MessageContentKey_5.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.keys;
-
-import org.apache.qpid.server.store.berkeleydb.MessageContentKey;
-
-public class MessageContentKey_5 extends MessageContentKey
-{
- private int _offset;
-
- public MessageContentKey_5(long messageId, int chunkNo)
- {
- super(messageId);
- _offset = chunkNo;
- }
-
- public int getOffset()
- {
- return _offset;
- }
-
- public void setOffset(int chunk)
- {
- this._offset = chunk;
- }
-} \ No newline at end of file
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/records/BindingRecord.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/records/BindingRecord.java
deleted file mode 100644
index 394a6ea85c..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/records/BindingRecord.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.records;
-
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-
-public class BindingRecord extends Object
-{
- private final AMQShortString _exchangeName;
- private final AMQShortString _queueName;
- private final AMQShortString _routingKey;
- private final FieldTable _arguments;
-
- public BindingRecord(AMQShortString exchangeName, AMQShortString queueName, AMQShortString routingKey, FieldTable arguments)
- {
- _exchangeName = exchangeName;
- _queueName = queueName;
- _routingKey = routingKey;
- _arguments = arguments;
- }
-
-
- public AMQShortString getExchangeName()
- {
- return _exchangeName;
- }
-
- public AMQShortString getQueueName()
- {
- return _queueName;
- }
-
- public AMQShortString getRoutingKey()
- {
- return _routingKey;
- }
-
- public FieldTable getArguments()
- {
- return _arguments;
- }
-
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/records/ExchangeRecord.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/records/ExchangeRecord.java
deleted file mode 100644
index f20367e33b..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/records/ExchangeRecord.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.records;
-
-import org.apache.qpid.framing.AMQShortString;
-
-public class ExchangeRecord extends Object
-{
- private final AMQShortString _exchangeName;
- private final AMQShortString _exchangeType;
- private final boolean _autoDelete;
-
- public ExchangeRecord(AMQShortString exchangeName, AMQShortString exchangeType, boolean autoDelete)
- {
- _exchangeName = exchangeName;
- _exchangeType = exchangeType;
- _autoDelete = autoDelete;
- }
-
- public AMQShortString getNameShortString()
- {
- return _exchangeName;
- }
-
- public AMQShortString getType()
- {
- return _exchangeType;
- }
-
- public boolean isAutoDelete()
- {
- return _autoDelete;
- }
-
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/records/QueueRecord.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/records/QueueRecord.java
deleted file mode 100644
index fbe10433ca..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/records/QueueRecord.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.records;
-
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-
-public class QueueRecord extends Object
-{
- private final AMQShortString _queueName;
- private final AMQShortString _owner;
- private final FieldTable _arguments;
- private boolean _exclusive;
-
- public QueueRecord(AMQShortString queueName, AMQShortString owner, boolean exclusive, FieldTable arguments)
- {
- _queueName = queueName;
- _owner = owner;
- _exclusive = exclusive;
- _arguments = arguments;
- }
-
- public AMQShortString getNameShortString()
- {
- return _queueName;
- }
-
- public AMQShortString getOwner()
- {
- return _owner;
- }
-
- public boolean isExclusive()
- {
- return _exclusive;
- }
-
- public void setExclusive(boolean exclusive)
- {
- _exclusive = exclusive;
- }
-
- public FieldTable getArguments()
- {
- return _arguments;
- }
-
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBinding.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBinding.java
new file mode 100644
index 0000000000..8b84a4c9bb
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBinding.java
@@ -0,0 +1,37 @@
+package org.apache.qpid.server.store.berkeleydb.tuple;
+
+import org.apache.qpid.server.store.ConfiguredObjectRecord;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+
+public class ConfiguredObjectBinding extends TupleBinding<ConfiguredObjectRecord>
+{
+ private static final ConfiguredObjectBinding INSTANCE = new ConfiguredObjectBinding();
+
+ public static ConfiguredObjectBinding getInstance()
+ {
+ return INSTANCE;
+ }
+
+ /** non-public constructor forces getInstance instead */
+ private ConfiguredObjectBinding()
+ {
+ }
+
+ public ConfiguredObjectRecord entryToObject(TupleInput tupleInput)
+ {
+ String type = tupleInput.readString();
+ String json = tupleInput.readString();
+ ConfiguredObjectRecord configuredObject = new ConfiguredObjectRecord(null, type, json);
+ return configuredObject;
+ }
+
+ public void objectToEntry(ConfiguredObjectRecord object, TupleOutput tupleOutput)
+ {
+ tupleOutput.writeString(object.getType());
+ tupleOutput.writeString(object.getAttributes());
+ }
+
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ContentBinding.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ContentBinding.java
new file mode 100644
index 0000000000..9154ca114a
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ContentBinding.java
@@ -0,0 +1,52 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.tuple;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+
+public class ContentBinding extends TupleBinding<byte[]>
+{
+ private static final ContentBinding INSTANCE = new ContentBinding();
+
+ public static ContentBinding getInstance()
+ {
+ return INSTANCE;
+ }
+
+ /** private constructor forces getInstance instead */
+ private ContentBinding() { }
+
+ @Override
+ public byte[] entryToObject(final TupleInput input)
+ {
+ byte[] data = new byte[input.available()];
+ input.read(data);
+ return data;
+ }
+
+ @Override
+ public void objectToEntry(final byte[] data, final TupleOutput output)
+ {
+ output.write(data);
+ }
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java
new file mode 100644
index 0000000000..2e6c8d5666
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java
@@ -0,0 +1,77 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.tuple;
+
+import java.nio.ByteBuffer;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+
+import org.apache.qpid.server.store.MessageMetaDataType;
+import org.apache.qpid.server.store.StorableMessageMetaData;
+
+/**
+ * Handles the mapping to and from message meta data
+ */
+public class MessageMetaDataBinding extends TupleBinding<StorableMessageMetaData>
+{
+ private static final MessageMetaDataBinding INSTANCE = new MessageMetaDataBinding();
+
+ public static MessageMetaDataBinding getInstance()
+ {
+ return INSTANCE;
+ }
+
+ /** private constructor forces getInstance instead */
+ private MessageMetaDataBinding() { }
+
+ @Override
+ public StorableMessageMetaData entryToObject(TupleInput tupleInput)
+ {
+ final int bodySize = tupleInput.readInt();
+ byte[] dataAsBytes = new byte[bodySize];
+ tupleInput.readFast(dataAsBytes);
+
+ ByteBuffer buf = ByteBuffer.wrap(dataAsBytes);
+ buf.position(1);
+ buf = buf.slice();
+ MessageMetaDataType type = MessageMetaDataType.values()[dataAsBytes[0]];
+ StorableMessageMetaData metaData = type.getFactory().createMetaData(buf);
+
+ return metaData;
+ }
+
+ @Override
+ public void objectToEntry(StorableMessageMetaData metaData, TupleOutput tupleOutput)
+ {
+ final int bodySize = 1 + metaData.getStorableSize();
+ byte[] underlying = new byte[bodySize];
+ underlying[0] = (byte) metaData.getType().ordinal();
+ ByteBuffer buf = ByteBuffer.wrap(underlying);
+ buf.position(1);
+ buf = buf.slice();
+
+ metaData.writeToBuffer(0, buf);
+ tupleOutput.writeInt(bodySize);
+ tupleOutput.writeFast(underlying);
+ }
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/PreparedTransactionBinding.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/PreparedTransactionBinding.java
new file mode 100644
index 0000000000..09f2c50e2d
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/PreparedTransactionBinding.java
@@ -0,0 +1,127 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.store.berkeleydb.tuple;
+
+import java.util.UUID;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+import org.apache.qpid.server.message.EnqueableMessage;
+import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.store.Transaction;
+import org.apache.qpid.server.store.TransactionLogResource;
+import org.apache.qpid.server.store.berkeleydb.entry.PreparedTransaction;
+
+public class PreparedTransactionBinding extends TupleBinding<PreparedTransaction>
+{
+ @Override
+ public PreparedTransaction entryToObject(TupleInput input)
+ {
+ Transaction.Record[] enqueues = readRecords(input);
+
+ Transaction.Record[] dequeues = readRecords(input);
+
+ return new PreparedTransaction(enqueues, dequeues);
+ }
+
+ private Transaction.Record[] readRecords(TupleInput input)
+ {
+ Transaction.Record[] records = new Transaction.Record[input.readInt()];
+ for(int i = 0; i < records.length; i++)
+ {
+ records[i] = new RecordImpl(new UUID(input.readLong(), input.readLong()), input.readLong());
+ }
+ return records;
+ }
+
+ @Override
+ public void objectToEntry(PreparedTransaction preparedTransaction, TupleOutput output)
+ {
+ writeRecords(preparedTransaction.getEnqueues(), output);
+ writeRecords(preparedTransaction.getDequeues(), output);
+
+ }
+
+ private void writeRecords(Transaction.Record[] records, TupleOutput output)
+ {
+ if(records == null)
+ {
+ output.writeInt(0);
+ }
+ else
+ {
+ output.writeInt(records.length);
+ for(Transaction.Record record : records)
+ {
+ UUID id = record.getQueue().getId();
+ output.writeLong(id.getMostSignificantBits());
+ output.writeLong(id.getLeastSignificantBits());
+ output.writeLong(record.getMessage().getMessageNumber());
+ }
+ }
+ }
+
+ private static class RecordImpl implements Transaction.Record, TransactionLogResource, EnqueableMessage
+ {
+
+ private long _messageNumber;
+ private UUID _queueId;
+
+ public RecordImpl(UUID queueId, long messageNumber)
+ {
+ _messageNumber = messageNumber;
+ _queueId = queueId;
+ }
+
+ public TransactionLogResource getQueue()
+ {
+ return this;
+ }
+
+ public EnqueableMessage getMessage()
+ {
+ return this;
+ }
+
+ public long getMessageNumber()
+ {
+ return _messageNumber;
+ }
+
+ public boolean isPersistent()
+ {
+ return true;
+ }
+
+ public StoredMessage<?> getStoredMessage()
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public UUID getId()
+ {
+ return _queueId;
+ }
+ }
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java
new file mode 100644
index 0000000000..22d0ede31f
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java
@@ -0,0 +1,59 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.tuple;
+
+import java.util.UUID;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+
+import org.apache.qpid.server.store.berkeleydb.entry.QueueEntryKey;
+
+public class QueueEntryBinding extends TupleBinding<QueueEntryKey>
+{
+
+ private static final QueueEntryBinding INSTANCE = new QueueEntryBinding();
+
+ public static QueueEntryBinding getInstance()
+ {
+ return INSTANCE;
+ }
+
+ /** private constructor forces getInstance instead */
+ private QueueEntryBinding() { }
+
+ public QueueEntryKey entryToObject(TupleInput tupleInput)
+ {
+ UUID queueId = new UUID(tupleInput.readLong(), tupleInput.readLong());
+ long messageId = tupleInput.readLong();
+
+ return new QueueEntryKey(queueId, messageId);
+ }
+
+ public void objectToEntry(QueueEntryKey mk, TupleOutput tupleOutput)
+ {
+ UUID uuid = mk.getQueueId();
+ tupleOutput.writeLong(uuid.getMostSignificantBits());
+ tupleOutput.writeLong(uuid.getLeastSignificantBits());
+ tupleOutput.writeLong(mk.getMessageId());
+ }
+} \ No newline at end of file
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/StringMapBinding.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/StringMapBinding.java
new file mode 100644
index 0000000000..15f31953f4
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/StringMapBinding.java
@@ -0,0 +1,59 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.tuple;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class StringMapBinding extends TupleBinding<Map<String,String>>
+{
+ private static final StringMapBinding INSTANCE = new StringMapBinding();
+
+ public Map<String, String> entryToObject(final TupleInput tupleInput)
+ {
+ int entries = tupleInput.readInt();
+ Map<String,String> map = new HashMap<String,String>(entries);
+ for(int i = 0; i < entries; i++)
+ {
+ map.put(tupleInput.readString(), tupleInput.readString());
+ }
+ return map;
+ }
+
+ public void objectToEntry(final Map<String, String> stringStringMap, final TupleOutput tupleOutput)
+ {
+ tupleOutput.writeInt(stringStringMap.size());
+ for(Map.Entry<String,String> entry : stringStringMap.entrySet())
+ {
+ tupleOutput.writeString(entry.getKey());
+ tupleOutput.writeString(entry.getValue());
+ }
+ }
+
+ public static StringMapBinding getInstance()
+ {
+ return INSTANCE;
+ }
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/UUIDTupleBinding.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/UUIDTupleBinding.java
new file mode 100644
index 0000000000..f8657cdd49
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/UUIDTupleBinding.java
@@ -0,0 +1,48 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.tuple;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+
+import java.util.UUID;
+
+public class UUIDTupleBinding extends TupleBinding<UUID>
+{
+ private static final UUIDTupleBinding INSTANCE = new UUIDTupleBinding();
+
+ public UUID entryToObject(final TupleInput tupleInput)
+ {
+ return new UUID(tupleInput.readLong(), tupleInput.readLong());
+ }
+
+ public void objectToEntry(final UUID uuid, final TupleOutput tupleOutput)
+ {
+ tupleOutput.writeLong(uuid.getMostSignificantBits());
+ tupleOutput.writeLong(uuid.getLeastSignificantBits());
+ }
+
+ public static UUIDTupleBinding getInstance()
+ {
+ return INSTANCE;
+ }
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/XidBinding.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/XidBinding.java
new file mode 100644
index 0000000000..01a5b75fef
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/XidBinding.java
@@ -0,0 +1,70 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.store.berkeleydb.tuple;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+
+import org.apache.qpid.server.store.berkeleydb.entry.Xid;
+
+public class XidBinding extends TupleBinding<Xid>
+{
+
+ private static final XidBinding INSTANCE = new XidBinding();
+
+ public static XidBinding getInstance()
+ {
+ return INSTANCE;
+ }
+
+ /** private constructor forces getInstance instead */
+ private XidBinding() { }
+
+ @Override
+ public Xid entryToObject(TupleInput input)
+ {
+ long format = input.readLong();
+ byte[] globalId = new byte[input.readInt()];
+ input.readFast(globalId);
+ byte[] branchId = new byte[input.readInt()];
+ input.readFast(branchId);
+ return new Xid(format,globalId,branchId);
+ }
+
+ @Override
+ public void objectToEntry(Xid xid, TupleOutput output)
+ {
+ output.writeLong(xid.getFormat());
+ output.writeInt(xid.getGlobalId() == null ? 0 : xid.getGlobalId().length);
+ if(xid.getGlobalId() != null)
+ {
+ output.write(xid.getGlobalId());
+ }
+ output.writeInt(xid.getBranchId() == null ? 0 : xid.getBranchId().length);
+ if(xid.getBranchId() != null)
+ {
+ output.write(xid.getBranchId());
+ }
+
+ }
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/BindingTuple.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/BindingTuple.java
deleted file mode 100644
index 301ee417c5..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/BindingTuple.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-public interface BindingTuple
-{
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/BindingTupleBindingFactory.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/BindingTupleBindingFactory.java
deleted file mode 100644
index 468096ccc5..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/BindingTupleBindingFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-
-import org.apache.qpid.server.store.berkeleydb.records.BindingRecord;
-
-public class BindingTupleBindingFactory extends TupleBindingFactory<BindingRecord>
-{
- public BindingTupleBindingFactory(int version)
- {
- super(version);
- }
-
- public TupleBinding<BindingRecord> getInstance()
- {
- switch (getVersion())
- {
- default:
- case 5:
- //no change from v4
- case 4:
- return new BindingTuple_4();
- }
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/BindingTuple_4.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/BindingTuple_4.java
deleted file mode 100644
index c6a5e63bc8..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/BindingTuple_4.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-import com.sleepycat.je.DatabaseException;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
-import org.apache.qpid.server.store.berkeleydb.FieldTableEncoding;
-import org.apache.qpid.server.store.berkeleydb.records.BindingRecord;
-
-public class BindingTuple_4 extends TupleBinding<BindingRecord> implements BindingTuple
-{
- protected static final Logger _log = Logger.getLogger(BindingTuple.class);
-
- public BindingTuple_4()
- {
- super();
- }
-
- public BindingRecord entryToObject(TupleInput tupleInput)
- {
- AMQShortString exchangeName = AMQShortStringEncoding.readShortString(tupleInput);
- AMQShortString queueName = AMQShortStringEncoding.readShortString(tupleInput);
- AMQShortString routingKey = AMQShortStringEncoding.readShortString(tupleInput);
-
- FieldTable arguments;
-
- // Addition for Version 2 of this table
- try
- {
- arguments = FieldTableEncoding.readFieldTable(tupleInput);
- }
- catch (DatabaseException e)
- {
- _log.error("Unable to create binding: " + e, e);
- return null;
- }
-
- return new BindingRecord(exchangeName, queueName, routingKey, arguments);
- }
-
- public void objectToEntry(BindingRecord binding, TupleOutput tupleOutput)
- {
- AMQShortStringEncoding.writeShortString(binding.getExchangeName(), tupleOutput);
- AMQShortStringEncoding.writeShortString(binding.getQueueName(), tupleOutput);
- AMQShortStringEncoding.writeShortString(binding.getRoutingKey(), tupleOutput);
-
- // Addition for Version 2 of this table
- FieldTableEncoding.writeFieldTable(binding.getArguments(), tupleOutput);
- }
-
-} \ No newline at end of file
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageContentKeyTB_4.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageContentKeyTB_4.java
deleted file mode 100644
index df857df31a..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageContentKeyTB_4.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-
-import org.apache.qpid.server.store.berkeleydb.MessageContentKey;
-import org.apache.qpid.server.store.berkeleydb.keys.MessageContentKey_4;
-
-public class MessageContentKeyTB_4 extends TupleBinding<MessageContentKey>
-{
-
- public MessageContentKey entryToObject(TupleInput tupleInput)
- {
- long messageId = tupleInput.readLong();
- int chunk = tupleInput.readInt();
- return new MessageContentKey_4(messageId, chunk);
- }
-
- public void objectToEntry(MessageContentKey object, TupleOutput tupleOutput)
- {
- final MessageContentKey_4 mk = (MessageContentKey_4) object;
- tupleOutput.writeLong(mk.getMessageId());
- tupleOutput.writeInt(mk.getChunk());
- }
-
-} \ No newline at end of file
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageContentKeyTB_5.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageContentKeyTB_5.java
deleted file mode 100644
index 17f88e1c2b..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageContentKeyTB_5.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-
-import org.apache.qpid.server.store.berkeleydb.MessageContentKey;
-import org.apache.qpid.server.store.berkeleydb.keys.MessageContentKey_5;
-
-public class MessageContentKeyTB_5 extends TupleBinding<MessageContentKey>
-{
- public MessageContentKey entryToObject(TupleInput tupleInput)
- {
- long messageId = tupleInput.readLong();
- int offset = tupleInput.readInt();
- return new MessageContentKey_5(messageId, offset);
- }
-
- public void objectToEntry(MessageContentKey object, TupleOutput tupleOutput)
- {
- final MessageContentKey_5 mk = (MessageContentKey_5) object;
- tupleOutput.writeLong(mk.getMessageId());
- tupleOutput.writeInt(mk.getOffset());
- }
-
-} \ No newline at end of file
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageContentKeyTupleBindingFactory.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageContentKeyTupleBindingFactory.java
deleted file mode 100644
index 4a320f49c9..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageContentKeyTupleBindingFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-
-import org.apache.qpid.server.store.berkeleydb.MessageContentKey;
-
-public class MessageContentKeyTupleBindingFactory extends TupleBindingFactory<MessageContentKey>
-{
- public MessageContentKeyTupleBindingFactory(int version)
- {
- super(version);
- }
-
- public TupleBinding<MessageContentKey> getInstance()
- {
- switch (getVersion())
- {
- default:
- case 5:
- return new MessageContentKeyTB_5();
- case 4:
- return new MessageContentKeyTB_4();
- }
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageMetaDataTB_4.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageMetaDataTB_4.java
deleted file mode 100644
index bdd806bb81..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageMetaDataTB_4.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.AMQException;
-import org.apache.qpid.framing.AMQFrameDecodingException;
-import org.apache.qpid.framing.AMQProtocolVersionException;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.ContentHeaderBody;
-import org.apache.qpid.framing.abstraction.MessagePublishInfo;
-import org.apache.qpid.server.message.MessageMetaData;
-import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-
-/**
- * Handles the mapping to and from 0-8/0-9 message meta data
- */
-public class MessageMetaDataTB_4 extends TupleBinding<Object>
-{
- private static final Logger _log = Logger.getLogger(MessageMetaDataTB_4.class);
-
- public MessageMetaDataTB_4()
- {
- }
-
- public Object entryToObject(TupleInput tupleInput)
- {
- try
- {
- final MessagePublishInfo publishBody = readMessagePublishInfo(tupleInput);
- final ContentHeaderBody contentHeaderBody = readContentHeaderBody(tupleInput);
- final int contentChunkCount = tupleInput.readInt();
-
- return new MessageMetaData(publishBody, contentHeaderBody, contentChunkCount);
- }
- catch (Exception e)
- {
- _log.error("Error converting entry to object: " + e, e);
- // annoyingly just have to return null since we cannot throw
- return null;
- }
- }
-
- public void objectToEntry(Object object, TupleOutput tupleOutput)
- {
- MessageMetaData message = (MessageMetaData) object;
- try
- {
- writeMessagePublishInfo(message.getMessagePublishInfo(), tupleOutput);
- }
- catch (AMQException e)
- {
- // can't do anything else since the BDB interface precludes throwing any exceptions
- // in practice we should never get an exception
- throw new RuntimeException("Error converting object to entry: " + e, e);
- }
- writeContentHeader(message.getContentHeaderBody(), tupleOutput);
- tupleOutput.writeInt(message.getContentChunkCount());
- }
-
- private MessagePublishInfo readMessagePublishInfo(TupleInput tupleInput)
- {
-
- final AMQShortString exchange = AMQShortStringEncoding.readShortString(tupleInput);
- final AMQShortString routingKey = AMQShortStringEncoding.readShortString(tupleInput);
- final boolean mandatory = tupleInput.readBoolean();
- final boolean immediate = tupleInput.readBoolean();
-
- return new MessagePublishInfo()
- {
-
- public AMQShortString getExchange()
- {
- return exchange;
- }
-
- public void setExchange(AMQShortString exchange)
- {
-
- }
-
- public boolean isImmediate()
- {
- return immediate;
- }
-
- public boolean isMandatory()
- {
- return mandatory;
- }
-
- public AMQShortString getRoutingKey()
- {
- return routingKey;
- }
- } ;
-
- }
-
- private ContentHeaderBody readContentHeaderBody(TupleInput tupleInput) throws AMQFrameDecodingException, AMQProtocolVersionException
- {
- int bodySize = tupleInput.readInt();
- byte[] underlying = new byte[bodySize];
- tupleInput.readFast(underlying);
-
- try
- {
- return ContentHeaderBody.createFromBuffer(new DataInputStream(new ByteArrayInputStream(underlying)), bodySize);
- }
- catch (IOException e)
- {
- throw new AMQFrameDecodingException(null, e.getMessage(), e);
- }
- }
-
- private void writeMessagePublishInfo(MessagePublishInfo publishBody, TupleOutput tupleOutput) throws AMQException
- {
-
- AMQShortStringEncoding.writeShortString(publishBody.getExchange(), tupleOutput);
- AMQShortStringEncoding.writeShortString(publishBody.getRoutingKey(), tupleOutput);
- tupleOutput.writeBoolean(publishBody.isMandatory());
- tupleOutput.writeBoolean(publishBody.isImmediate());
- }
-
- private void writeContentHeader(ContentHeaderBody headerBody, TupleOutput tupleOutput)
- {
- // write out the content header body
- final int bodySize = headerBody.getSize();
- ByteArrayOutputStream baos = new ByteArrayOutputStream(bodySize);
- try
- {
- headerBody.writePayload(new DataOutputStream(baos));
- tupleOutput.writeInt(bodySize);
- tupleOutput.writeFast(baos.toByteArray());
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
-
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageMetaDataTB_5.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageMetaDataTB_5.java
deleted file mode 100644
index 4e124a03e3..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageMetaDataTB_5.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-
-import org.apache.qpid.server.store.MessageMetaDataType;
-import org.apache.qpid.server.store.StorableMessageMetaData;
-
-/**
- * Handles the mapping to and from message meta data
- */
-public class MessageMetaDataTB_5 extends MessageMetaDataTB_4
-{
-
- @Override
- public Object entryToObject(TupleInput tupleInput)
- {
- final int bodySize = tupleInput.readInt();
- byte[] dataAsBytes = new byte[bodySize];
- tupleInput.readFast(dataAsBytes);
-
- java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(dataAsBytes);
- buf.position(1);
- buf = buf.slice();
- MessageMetaDataType type = MessageMetaDataType.values()[dataAsBytes[0]];
- StorableMessageMetaData metaData = type.getFactory().createMetaData(buf);
-
- return metaData;
- }
-
- @Override
- public void objectToEntry(Object object, TupleOutput tupleOutput)
- {
- StorableMessageMetaData metaData = (StorableMessageMetaData) object;
-
- final int bodySize = 1 + metaData.getStorableSize();
- byte[] underlying = new byte[bodySize];
- underlying[0] = (byte) metaData.getType().ordinal();
- java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(underlying);
- buf.position(1);
- buf = buf.slice();
-
- metaData.writeToBuffer(0, buf);
- tupleOutput.writeInt(bodySize);
- tupleOutput.writeFast(underlying);
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageMetaDataTupleBindingFactory.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageMetaDataTupleBindingFactory.java
deleted file mode 100644
index cb742e76a1..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/MessageMetaDataTupleBindingFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-
-public class MessageMetaDataTupleBindingFactory extends TupleBindingFactory<Object>
-{
- public MessageMetaDataTupleBindingFactory(int version)
- {
- super(version);
- }
-
- public TupleBinding<Object> getInstance()
- {
- switch (getVersion())
- {
- default:
- case 5:
- return new MessageMetaDataTB_5();
- case 4:
- return new MessageMetaDataTB_4();
- }
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueEntryTB.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueEntryTB.java
deleted file mode 100644
index a4ed25c0ed..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueEntryTB.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
-import org.apache.qpid.server.store.berkeleydb.QueueEntryKey;
-
-public class QueueEntryTB extends TupleBinding<QueueEntryKey>
-{
- public QueueEntryKey entryToObject(TupleInput tupleInput)
- {
- AMQShortString queueName = AMQShortStringEncoding.readShortString(tupleInput);
- long messageId = tupleInput.readLong();
-
- return new QueueEntryKey(queueName, messageId);
- }
-
- public void objectToEntry(QueueEntryKey mk, TupleOutput tupleOutput)
- {
- AMQShortStringEncoding.writeShortString(mk.getQueueName(),tupleOutput);
- tupleOutput.writeLong(mk.getMessageId());
- }
-} \ No newline at end of file
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTuple.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTuple.java
deleted file mode 100644
index affa9a271d..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTuple.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-public interface QueueTuple
-{
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTupleBindingFactory.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTupleBindingFactory.java
deleted file mode 100644
index a189786885..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTupleBindingFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-
-import org.apache.qpid.server.store.berkeleydb.records.QueueRecord;
-
-public class QueueTupleBindingFactory extends TupleBindingFactory<QueueRecord>
-{
-
- public QueueTupleBindingFactory(int version)
- {
- super(version);
- }
-
- public TupleBinding<QueueRecord> getInstance()
- {
- switch (getVersion())
- {
- default:
- case 5:
- return new QueueTuple_5();
- case 4:
- return new QueueTuple_4();
- }
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTuple_4.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTuple_4.java
deleted file mode 100644
index d2ba4dbbca..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTuple_4.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-import com.sleepycat.je.DatabaseException;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
-import org.apache.qpid.server.store.berkeleydb.FieldTableEncoding;
-import org.apache.qpid.server.store.berkeleydb.records.QueueRecord;
-
-public class QueueTuple_4 extends TupleBinding<QueueRecord> implements QueueTuple
-{
- private static final Logger _logger = Logger.getLogger(QueueTuple_4.class);
-
- public QueueTuple_4()
- {
- super();
- }
-
- public QueueRecord entryToObject(TupleInput tupleInput)
- {
- try
- {
- AMQShortString name = AMQShortStringEncoding.readShortString(tupleInput);
- AMQShortString owner = AMQShortStringEncoding.readShortString(tupleInput);
- // Addition for Version 2 of this table, read the queue arguments
- FieldTable arguments = FieldTableEncoding.readFieldTable(tupleInput);
-
- return new QueueRecord(name, owner, false, arguments);
- }
- catch (DatabaseException e)
- {
- _logger.error("Unable to create binding: " + e, e);
- return null;
- }
-
- }
-
- public void objectToEntry(QueueRecord queue, TupleOutput tupleOutput)
- {
- AMQShortStringEncoding.writeShortString(queue.getNameShortString(), tupleOutput);
- AMQShortStringEncoding.writeShortString(queue.getOwner(), tupleOutput);
- // Addition for Version 2 of this table, store the queue arguments
- FieldTableEncoding.writeFieldTable(queue.getArguments(), tupleOutput);
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTuple_5.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTuple_5.java
deleted file mode 100644
index c9094a132d..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/QueueTuple_5.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-import com.sleepycat.je.DatabaseException;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
-import org.apache.qpid.server.store.berkeleydb.FieldTableEncoding;
-import org.apache.qpid.server.store.berkeleydb.records.QueueRecord;
-
-public class QueueTuple_5 extends QueueTuple_4
-{
- private static final Logger _logger = Logger.getLogger(QueueTuple_5.class);
-
- public QueueTuple_5()
- {
- super();
- }
-
- public QueueRecord entryToObject(TupleInput tupleInput)
- {
- try
- {
- AMQShortString name = AMQShortStringEncoding.readShortString(tupleInput);
- AMQShortString owner = AMQShortStringEncoding.readShortString(tupleInput);
- // Addition for Version 2 of this table, read the queue arguments
- FieldTable arguments = FieldTableEncoding.readFieldTable(tupleInput);
- // Addition for Version 3 of this table, read the queue exclusivity
- boolean exclusive = tupleInput.readBoolean();
-
- return new QueueRecord(name, owner, exclusive, arguments);
- }
- catch (DatabaseException e)
- {
- _logger.error("Unable to create binding: " + e, e);
- return null;
- }
-
- }
-
- public void objectToEntry(QueueRecord queue, TupleOutput tupleOutput)
- {
- AMQShortStringEncoding.writeShortString(queue.getNameShortString(), tupleOutput);
- AMQShortStringEncoding.writeShortString(queue.getOwner(), tupleOutput);
- // Addition for Version 2 of this table, store the queue arguments
- FieldTableEncoding.writeFieldTable(queue.getArguments(), tupleOutput);
- // Addition for Version 3 of this table, store the queue exclusivity
- tupleOutput.writeBoolean(queue.isExclusive());
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/TupleBindingFactory.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/TupleBindingFactory.java
deleted file mode 100644
index 97b1398e10..0000000000
--- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuples/TupleBindingFactory.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuples;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-
-public abstract class TupleBindingFactory<E>
-{
- private final int _version;
-
- public TupleBindingFactory(int version)
- {
- _version = version;
- }
-
- public abstract TupleBinding<E> getInstance();
-
- public int getVersion()
- {
- return _version;
- }
-}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractStoreUpgrade.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractStoreUpgrade.java
new file mode 100644
index 0000000000..43aa5aa2b4
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractStoreUpgrade.java
@@ -0,0 +1,77 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.Transaction;
+
+public abstract class AbstractStoreUpgrade implements StoreUpgrade
+{
+ private static final Logger _logger = Logger.getLogger(AbstractStoreUpgrade.class);
+
+ protected void reportFinished(Environment environment, int version)
+ {
+ _logger.info("Completed upgrade to version " + version);
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Upgraded:");
+ reportDatabaseRowCount(environment);
+ }
+ }
+
+ private void reportDatabaseRowCount(Environment environment)
+ {
+ List<String> databases = environment.getDatabaseNames();
+ for (String database : databases)
+ {
+ _logger.debug(" " + getRowCount(database, environment) + " rows in " + database);
+ }
+ }
+
+ protected void reportStarting(Environment environment, int version)
+ {
+ _logger.info("Starting store upgrade from version " + version);
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Upgrading:");
+ reportDatabaseRowCount(environment);
+ }
+ }
+
+ private long getRowCount(String databaseName, Environment environment)
+ {
+ DatabaseCallable<Long> operation = new DatabaseCallable<Long>()
+ {
+ @Override
+ public Long call(Database sourceDatabase, Database targetDatabase, Transaction transaction)
+ {
+ return sourceDatabase.count();
+ }
+ };
+ return new DatabaseTemplate(environment, databaseName, null).call(operation);
+ }
+
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/CursorOperation.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/CursorOperation.java
new file mode 100644
index 0000000000..925e40ea93
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/CursorOperation.java
@@ -0,0 +1,89 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import org.apache.log4j.Logger;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.Transaction;
+
+public abstract class CursorOperation implements DatabaseRunnable
+{
+ private static final Logger _logger = Logger.getLogger(CursorOperation.class);
+
+ private CursorTemplate _template;
+ private long _rowCount;
+ private long _processedRowCount;
+
+ @Override
+ public void run(final Database sourceDatabase, final Database targetDatabase, final Transaction transaction)
+ {
+ _rowCount = sourceDatabase.count();
+ _template = new CursorTemplate(sourceDatabase, transaction, new DatabaseEntryCallback()
+ {
+ @Override
+ public void processEntry(final Database database, final Transaction transaction, final DatabaseEntry key,
+ final DatabaseEntry value)
+ {
+ _processedRowCount++;
+ CursorOperation.this.processEntry(database, targetDatabase, transaction, key, value);
+ if (getProcessedCount() % 1000 == 0)
+ {
+ _logger.info("Processed " + getProcessedCount() + " records of " + getRowCount() + ".");
+ }
+ }
+
+ });
+ _template.processEntries();
+ }
+
+ public void abort()
+ {
+ if (_template != null)
+ {
+ _template.abort();
+ }
+ }
+
+ public boolean deleteCurrent()
+ {
+ if (_template != null)
+ {
+ return _template.deleteCurrent();
+ }
+ return false;
+ }
+
+ public long getRowCount()
+ {
+ return _rowCount;
+ }
+
+ public long getProcessedCount()
+ {
+ return _processedRowCount;
+ }
+
+ public abstract void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value);
+
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/CursorTemplate.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/CursorTemplate.java
new file mode 100644
index 0000000000..0b14080486
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/CursorTemplate.java
@@ -0,0 +1,75 @@
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.CursorConfig;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+import com.sleepycat.je.Transaction;
+
+public class CursorTemplate
+{
+ private Database _database;
+ private Transaction _transaction;
+ private DatabaseEntryCallback _databaseEntryCallback;
+ private Cursor _cursor;
+ private boolean _iterating;
+
+ public CursorTemplate(Database database, Transaction transaction, DatabaseEntryCallback databaseEntryCallback)
+ {
+ _database = database;
+ _transaction = transaction;
+ _databaseEntryCallback = databaseEntryCallback;
+ }
+
+ public void processEntries()
+ {
+ _cursor = _database.openCursor(_transaction, CursorConfig.READ_COMMITTED);
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+
+ try
+ {
+ _iterating = true;
+ while (_iterating && _cursor.getNext(key, value, LockMode.DEFAULT) == OperationStatus.SUCCESS)
+ {
+ _databaseEntryCallback.processEntry(_database, _transaction, key, value);
+ }
+ }
+ finally
+ {
+ _cursor.close();
+ }
+ }
+
+ public boolean deleteCurrent()
+ {
+ return _cursor.delete() == OperationStatus.SUCCESS;
+ }
+
+ public void abort()
+ {
+ _iterating = false;
+ }
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseCallable.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseCallable.java
new file mode 100644
index 0000000000..bf5462ef48
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseCallable.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.Transaction;
+
+public interface DatabaseCallable<T>
+{
+ public T call(Database sourceDatabase, Database targetDatabase, Transaction transaction);
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseEntryCallback.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseEntryCallback.java
new file mode 100644
index 0000000000..8ac22e5dfb
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseEntryCallback.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.Transaction;
+
+public interface DatabaseEntryCallback
+{
+ void processEntry(Database database, Transaction transaction, DatabaseEntry key, DatabaseEntry value);
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseRunnable.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseRunnable.java
new file mode 100644
index 0000000000..3e9e6a3497
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseRunnable.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.Transaction;
+
+public interface DatabaseRunnable
+{
+ public void run(Database sourceDatabase, Database targetDatabase, Transaction transaction);
+
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseTemplate.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseTemplate.java
new file mode 100644
index 0000000000..135158afa4
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseTemplate.java
@@ -0,0 +1,114 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import org.apache.log4j.Logger;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.Transaction;
+
+public class DatabaseTemplate
+{
+ private static final Logger _logger = Logger.getLogger(DatabaseTemplate.class);
+
+ private Environment _environment;
+ private String _sourceDatabaseName;
+ private String _targetDatabaseName;
+ private Transaction _parentTransaction;
+
+ public DatabaseTemplate(Environment environment, String sourceDatabaseName, Transaction transaction)
+ {
+ this(environment, sourceDatabaseName, null, transaction);
+ }
+
+ public DatabaseTemplate(Environment environment, String sourceDatabaseName, String targetDatabaseName,
+ Transaction parentTransaction)
+ {
+ _environment = environment;
+ _sourceDatabaseName = sourceDatabaseName;
+ _targetDatabaseName = targetDatabaseName;
+ _parentTransaction = parentTransaction;
+ }
+
+ public void run(DatabaseRunnable databaseRunnable)
+ {
+ DatabaseCallable<Void> callable = runnableToCallable(databaseRunnable);
+ call(callable);
+ }
+
+ public <T> T call(DatabaseCallable<T> databaseCallable)
+ {
+ Database sourceDatabase = null;
+ Database targetDatabase = null;
+ try
+ {
+ DatabaseConfig dbConfig = new DatabaseConfig();
+ dbConfig.setTransactional(true);
+ dbConfig.setAllowCreate(true);
+
+ sourceDatabase = _environment.openDatabase(_parentTransaction, _sourceDatabaseName, dbConfig);
+
+ if (_targetDatabaseName != null)
+ {
+ targetDatabase = _environment.openDatabase(_parentTransaction, _targetDatabaseName, dbConfig);
+ }
+
+ return databaseCallable.call(sourceDatabase, targetDatabase, _parentTransaction);
+ }
+ finally
+ {
+ closeDatabase(sourceDatabase);
+ closeDatabase(targetDatabase);
+ }
+ }
+
+ private DatabaseCallable<Void> runnableToCallable(final DatabaseRunnable databaseRunnable)
+ {
+ return new DatabaseCallable<Void>()
+ {
+
+ @Override
+ public Void call(Database sourceDatabase, Database targetDatabase, Transaction transaction)
+ {
+ databaseRunnable.run(sourceDatabase, targetDatabase, transaction);
+ return null;
+ }
+ };
+ }
+
+ private void closeDatabase(Database database)
+ {
+ if (database != null)
+ {
+ try
+ {
+ database.close();
+ }
+ catch (Exception e)
+ {
+ _logger.error("Unable to close database", e);
+ }
+ }
+ }
+
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/StoreUpgrade.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/StoreUpgrade.java
new file mode 100644
index 0000000000..f73e2e5d78
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/StoreUpgrade.java
@@ -0,0 +1,31 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import org.apache.qpid.AMQStoreException;
+
+public interface StoreUpgrade
+{
+ void performUpgrade(Environment environment, UpgradeInteractionHandler handler, String virtualHostName)
+ throws DatabaseException, AMQStoreException;
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4To5.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4To5.java
new file mode 100644
index 0000000000..49e5e700c4
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4To5.java
@@ -0,0 +1,915 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.common.AMQPFilterTypes;
+import org.apache.qpid.exchange.ExchangeDefaults;
+import org.apache.qpid.framing.AMQFrameDecodingException;
+import org.apache.qpid.framing.AMQProtocolVersionException;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.ContentHeaderBody;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.framing.abstraction.MessagePublishInfo;
+import org.apache.qpid.server.message.MessageMetaData;
+import org.apache.qpid.server.store.StorableMessageMetaData;
+import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
+import org.apache.qpid.server.store.berkeleydb.FieldTableEncoding;
+
+import com.sleepycat.bind.tuple.ByteBinding;
+import com.sleepycat.bind.tuple.LongBinding;
+import com.sleepycat.bind.tuple.TupleBase;
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.Transaction;
+
+public class UpgradeFrom4To5 extends AbstractStoreUpgrade
+{
+ private static final String OLD_DELIVERY_DB = "deliveryDb_v4";
+ private static final String NEW_DELIVERY_DB = "deliveryDb_v5";
+ private static final String EXCHANGE_DB_NAME = "exchangeDb_v4";
+ private static final String OLD_BINDINGS_DB_NAME = "queueBindingsDb_v4";
+ private static final String NEW_BINDINGS_DB_NAME = "queueBindingsDb_v5";
+ private static final String OLD_QUEUE_DB_NAME = "queueDb_v4";
+ private static final String NEW_QUEUE_DB_NAME = "queueDb_v5";
+ private static final String OLD_METADATA_DB_NAME = "messageMetaDataDb_v4";
+ private static final String NEW_METADATA_DB_NAME = "messageMetaDataDb_v5";
+ private static final String OLD_CONTENT_DB_NAME = "messageContentDb_v4";
+ private static final String NEW_CONTENT_DB_NAME = "messageContentDb_v5";
+
+ private static final byte COLON = (byte) ':';
+
+ private static final Logger _logger = Logger.getLogger(UpgradeFrom4To5.class);
+
+ public void performUpgrade(final Environment environment, final UpgradeInteractionHandler handler, String virtualHostName) throws DatabaseException, AMQStoreException
+ {
+ Transaction transaction = null;
+ try
+ {
+ reportStarting(environment, 4);
+
+ transaction = environment.beginTransaction(null, null);
+
+ // find all queues which are bound to a topic exchange and which have a colon in their name
+ final List<AMQShortString> potentialDurableSubs = findPotentialDurableSubscriptions(environment, transaction);
+
+ Set<String> existingQueues = upgradeQueues(environment, handler, potentialDurableSubs, transaction);
+ upgradeQueueBindings(environment, handler, potentialDurableSubs, transaction);
+ Set<Long> messagesToDiscard = upgradeDelivery(environment, existingQueues, handler, transaction);
+ upgradeContent(environment, handler, messagesToDiscard, transaction);
+ upgradeMetaData(environment, handler, messagesToDiscard, transaction);
+ renameRemainingDatabases(environment, handler, transaction);
+ transaction.commit();
+
+ reportFinished(environment, 5);
+
+ }
+ catch (Exception e)
+ {
+ transaction.abort();
+ if (e instanceof DatabaseException)
+ {
+ throw (DatabaseException) e;
+ }
+ else if (e instanceof AMQStoreException)
+ {
+ throw (AMQStoreException) e;
+ }
+ else
+ {
+ throw new AMQStoreException("Unexpected exception", e);
+ }
+ }
+ }
+
+ private void upgradeQueueBindings(Environment environment, UpgradeInteractionHandler handler, final List<AMQShortString> potentialDurableSubs,
+ Transaction transaction)
+ {
+ if (environment.getDatabaseNames().contains(OLD_BINDINGS_DB_NAME))
+ {
+ _logger.info("Queue Bindings");
+ final BindingTuple bindingTuple = new BindingTuple();
+ CursorOperation databaseOperation = new CursorOperation()
+ {
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ // All the information required in binding entries is actually in the *key* not value.
+ BindingRecord oldBindingRecord = bindingTuple.entryToObject(key);
+
+ AMQShortString queueName = oldBindingRecord.getQueueName();
+ AMQShortString exchangeName = oldBindingRecord.getExchangeName();
+ AMQShortString routingKey = oldBindingRecord.getRoutingKey();
+ FieldTable arguments = oldBindingRecord.getArguments();
+
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug(String.format(
+ "Processing binding for queue %s, exchange %s, routingKey %s arguments %s", queueName,
+ exchangeName, routingKey, arguments));
+ }
+
+ // if the queue name is in the gathered list then inspect its binding arguments
+ // only topic exchange should have a JMS selector key in binding
+ if (potentialDurableSubs.contains(queueName)
+ && exchangeName.equals(ExchangeDefaults.TOPIC_EXCHANGE_NAME))
+ {
+ if (arguments == null)
+ {
+ arguments = new FieldTable();
+ }
+
+ AMQShortString selectorFilterKey = AMQPFilterTypes.JMS_SELECTOR.getValue();
+ if (!arguments.containsKey(selectorFilterKey))
+ {
+ if (_logger.isDebugEnabled())
+ {
+ _logger.info("adding the empty string (i.e. 'no selector') value for " + queueName
+ + " and exchange " + exchangeName);
+ }
+ arguments.put(selectorFilterKey, "");
+ }
+ }
+ addBindingToDatabase(bindingTuple, targetDatabase, transaction, queueName, exchangeName, routingKey,
+ arguments);
+ }
+ };
+ new DatabaseTemplate(environment, OLD_BINDINGS_DB_NAME, NEW_BINDINGS_DB_NAME, transaction)
+ .run(databaseOperation);
+ environment.removeDatabase(transaction, OLD_BINDINGS_DB_NAME);
+ _logger.info(databaseOperation.getRowCount() + " Queue Binding entries");
+ }
+ }
+
+ private Set<String> upgradeQueues(final Environment environment, final UpgradeInteractionHandler handler,
+ List<AMQShortString> potentialDurableSubs, Transaction transaction)
+ {
+ _logger.info("Queues");
+ final Set<String> existingQueues = new HashSet<String>();
+ if (environment.getDatabaseNames().contains(OLD_QUEUE_DB_NAME))
+ {
+ final QueueRecordBinding binding = new QueueRecordBinding(potentialDurableSubs);
+ CursorOperation databaseOperation = new CursorOperation()
+ {
+ @Override
+ public void processEntry(final Database sourceDatabase, final Database targetDatabase,
+ final Transaction transaction, final DatabaseEntry key, final DatabaseEntry value)
+ {
+ QueueRecord record = binding.entryToObject(value);
+ DatabaseEntry newValue = new DatabaseEntry();
+ binding.objectToEntry(record, newValue);
+ targetDatabase.put(transaction, key, newValue);
+ existingQueues.add(record.getNameShortString().asString());
+ sourceDatabase.delete(transaction, key);
+ }
+ };
+ new DatabaseTemplate(environment, OLD_QUEUE_DB_NAME, NEW_QUEUE_DB_NAME, transaction).run(databaseOperation);
+ environment.removeDatabase(transaction, OLD_QUEUE_DB_NAME);
+ _logger.info(databaseOperation.getRowCount() + " Queue entries");
+ }
+ return existingQueues;
+ }
+
+ private List<AMQShortString> findPotentialDurableSubscriptions(final Environment environment,
+ Transaction transaction)
+ {
+ final List<AMQShortString> exchangeNames = findTopicExchanges(environment);
+ final List<AMQShortString> queues = new ArrayList<AMQShortString>();
+ final PartialBindingRecordBinding binding = new PartialBindingRecordBinding();
+
+ CursorOperation databaseOperation = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ PartialBindingRecord record = binding.entryToObject(key);
+ if (exchangeNames.contains(record.getExchangeName()) && record.getQueueName().contains(COLON))
+ {
+ queues.add(record.getQueueName());
+ }
+ }
+ };
+ new DatabaseTemplate(environment, OLD_BINDINGS_DB_NAME, transaction).run(databaseOperation);
+ return queues;
+ }
+
+ private Set<Long> upgradeDelivery(final Environment environment, final Set<String> existingQueues,
+ final UpgradeInteractionHandler handler, Transaction transaction)
+ {
+ final Set<Long> messagesToDiscard = new HashSet<Long>();
+ final Set<String> queuesToDiscard = new HashSet<String>();
+ final QueueEntryKeyBinding queueEntryKeyBinding = new QueueEntryKeyBinding();
+ _logger.info("Delivery Records");
+
+ CursorOperation databaseOperation = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ QueueEntryKey entryKey = queueEntryKeyBinding.entryToObject(key);
+ Long messageId = entryKey.getMessageId();
+ final String queueName = entryKey.getQueueName().asString();
+ if (!existingQueues.contains(queueName))
+ {
+ if (queuesToDiscard.contains(queueName))
+ {
+ messagesToDiscard.add(messageId);
+ }
+ else
+ {
+ String lineSeparator = System.getProperty("line.separator");
+ String question = MessageFormat.format("Found persistent messages for non-durable queue ''{1}''. "
+ + " Do you with to create this queue and move all the messages into it?" + lineSeparator
+ + "NOTE: Answering No will result in these messages being discarded!", queueName);
+ UpgradeInteractionResponse response = handler.requireResponse(question.toString(),
+ UpgradeInteractionResponse.YES, UpgradeInteractionResponse.YES,
+ UpgradeInteractionResponse.NO, UpgradeInteractionResponse.ABORT);
+
+ if (response == UpgradeInteractionResponse.YES)
+ {
+ createQueue(environment, transaction, queueName);
+ existingQueues.add(queueName);
+ }
+ else if (response == UpgradeInteractionResponse.NO)
+ {
+ queuesToDiscard.add(queueName);
+ messagesToDiscard.add(messageId);
+ }
+ else
+ {
+ throw new RuntimeException("Unable is aborted!");
+ }
+ }
+ }
+
+ if (!messagesToDiscard.contains(messageId))
+ {
+ DatabaseEntry newKey = new DatabaseEntry();
+ queueEntryKeyBinding.objectToEntry(entryKey, newKey);
+ targetDatabase.put(transaction, newKey, value);
+
+ }
+ }
+ };
+ new DatabaseTemplate(environment, OLD_DELIVERY_DB, NEW_DELIVERY_DB, transaction).run(databaseOperation);
+
+ if (!messagesToDiscard.isEmpty())
+ {
+ databaseOperation = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ QueueEntryKey entryKey = queueEntryKeyBinding.entryToObject(key);
+ Long messageId = entryKey.getMessageId();
+
+ if (messagesToDiscard.contains(messageId))
+ {
+ messagesToDiscard.remove(messageId);
+ }
+ }
+ };
+ new DatabaseTemplate(environment, NEW_DELIVERY_DB, transaction).run(databaseOperation);
+ }
+ _logger.info(databaseOperation.getRowCount() + " Delivery Records entries ");
+ environment.removeDatabase(transaction, OLD_DELIVERY_DB);
+
+ return messagesToDiscard;
+ }
+
+ protected void createQueue(final Environment environment, Transaction transaction, final String queueName)
+ {
+
+ final QueueRecordBinding binding = new QueueRecordBinding(null);
+ final BindingTuple bindingTuple = new BindingTuple();
+ DatabaseRunnable queueCreateOperation = new DatabaseRunnable()
+ {
+
+ @Override
+ public void run(Database newQueueDatabase, Database newBindingsDatabase, Transaction transaction)
+ {
+ AMQShortString queueNameAMQ = new AMQShortString(queueName);
+ QueueRecord record = new QueueRecord(queueNameAMQ, null, false, null);
+
+ DatabaseEntry key = new DatabaseEntry();
+
+ TupleOutput output = new TupleOutput();
+ AMQShortStringEncoding.writeShortString(record.getNameShortString(), output);
+ TupleBase.outputToEntry(output, key);
+
+ DatabaseEntry newValue = new DatabaseEntry();
+ binding.objectToEntry(record, newValue);
+ newQueueDatabase.put(transaction, key, newValue);
+
+ FieldTable emptyArguments = new FieldTable();
+ addBindingToDatabase(bindingTuple, newBindingsDatabase, transaction, queueNameAMQ,
+ ExchangeDefaults.DIRECT_EXCHANGE_NAME, queueNameAMQ, emptyArguments);
+
+ // TODO QPID-3490 we should not persist a default exchange binding
+ addBindingToDatabase(bindingTuple, newBindingsDatabase, transaction, queueNameAMQ,
+ ExchangeDefaults.DEFAULT_EXCHANGE_NAME, queueNameAMQ, emptyArguments);
+ }
+ };
+ new DatabaseTemplate(environment, NEW_QUEUE_DB_NAME, NEW_BINDINGS_DB_NAME, transaction).run(queueCreateOperation);
+ }
+
+ private List<AMQShortString> findTopicExchanges(final Environment environment)
+ {
+ final List<AMQShortString> topicExchanges = new ArrayList<AMQShortString>();
+ final ExchangeRecordBinding binding = new ExchangeRecordBinding();
+ CursorOperation databaseOperation = new CursorOperation()
+ {
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ ExchangeRecord record = binding.entryToObject(value);
+ if (ExchangeDefaults.TOPIC_EXCHANGE_CLASS.equals(record.getType()))
+ {
+ topicExchanges.add(record.getName());
+ }
+ }
+ };
+ new DatabaseTemplate(environment, EXCHANGE_DB_NAME, null).run(databaseOperation);
+ return topicExchanges;
+ }
+
+ private void upgradeMetaData(final Environment environment, final UpgradeInteractionHandler handler,
+ final Set<Long> messagesToDiscard, Transaction transaction)
+ {
+ _logger.info("Message MetaData");
+ if (environment.getDatabaseNames().contains(OLD_METADATA_DB_NAME))
+ {
+ final MessageMetaDataBinding binding = new MessageMetaDataBinding();
+ CursorOperation databaseOperation = new CursorOperation()
+ {
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ StorableMessageMetaData metaData = binding.entryToObject(value);
+
+ // get message id
+ Long messageId = LongBinding.entryToLong(key);
+
+ // ONLY copy data if message is delivered to existing queue
+ if (messagesToDiscard.contains(messageId))
+ {
+ return;
+ }
+ DatabaseEntry newValue = new DatabaseEntry();
+ binding.objectToEntry(metaData, newValue);
+
+ targetDatabase.put(transaction, key, newValue);
+ targetDatabase.put(transaction, key, newValue);
+ deleteCurrent();
+
+ }
+ };
+
+ new DatabaseTemplate(environment, OLD_METADATA_DB_NAME, NEW_METADATA_DB_NAME, transaction)
+ .run(databaseOperation);
+ environment.removeDatabase(transaction, OLD_METADATA_DB_NAME);
+ _logger.info(databaseOperation.getRowCount() + " Message MetaData entries");
+ }
+ }
+
+ private void upgradeContent(final Environment environment, final UpgradeInteractionHandler handler,
+ final Set<Long> messagesToDiscard, Transaction transaction)
+ {
+ _logger.info("Message Contents");
+ if (environment.getDatabaseNames().contains(OLD_CONTENT_DB_NAME))
+ {
+ final MessageContentKeyBinding keyBinding = new MessageContentKeyBinding();
+ final ContentBinding contentBinding = new ContentBinding();
+ CursorOperation cursorOperation = new CursorOperation()
+ {
+ private long _prevMsgId = -1;
+ private int _bytesSeenSoFar;
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ // determine the msgId of the current entry
+ MessageContentKey contentKey = keyBinding.entryToObject(key);
+ long msgId = contentKey.getMessageId();
+
+ // ONLY copy data if message is delivered to existing queue
+ if (messagesToDiscard.contains(msgId))
+ {
+ return;
+ }
+ // if this is a new message, restart the byte offset count.
+ if (_prevMsgId != msgId)
+ {
+ _bytesSeenSoFar = 0;
+ }
+
+ // determine the content size
+ ByteBuffer content = contentBinding.entryToObject(value);
+ int contentSize = content.limit();
+
+ // create the new key: id + previously seen data count
+ MessageContentKey newKey = new MessageContentKey(msgId, _bytesSeenSoFar);
+ DatabaseEntry newKeyEntry = new DatabaseEntry();
+ keyBinding.objectToEntry(newKey, newKeyEntry);
+
+ DatabaseEntry newValueEntry = new DatabaseEntry();
+ contentBinding.objectToEntry(content, newValueEntry);
+
+ targetDatabase.put(null, newKeyEntry, newValueEntry);
+
+ _prevMsgId = msgId;
+ _bytesSeenSoFar += contentSize;
+ }
+ };
+ new DatabaseTemplate(environment, OLD_CONTENT_DB_NAME, NEW_CONTENT_DB_NAME, transaction).run(cursorOperation);
+ environment.removeDatabase(transaction, OLD_CONTENT_DB_NAME);
+ _logger.info(cursorOperation.getRowCount() + " Message Content entries");
+ }
+ }
+
+ /**
+ * For all databases which haven't been otherwise upgraded, we still need to
+ * rename them from _v4 to _v5
+ */
+ private void renameRemainingDatabases(final Environment environment, final UpgradeInteractionHandler handler,
+ Transaction transaction)
+ {
+ for (String dbName : environment.getDatabaseNames())
+ {
+ if (dbName.endsWith("_v4"))
+ {
+ String newName = dbName.substring(0, dbName.length() - 3) + "_v5";
+ _logger.info("Renaming " + dbName + " into " + newName);
+ environment.renameDatabase(transaction, dbName, newName);
+ }
+ }
+
+ }
+
+ private void addBindingToDatabase(final BindingTuple bindingTuple, Database targetDatabase, Transaction transaction,
+ AMQShortString queueName, AMQShortString exchangeName, AMQShortString routingKey, FieldTable arguments)
+ {
+
+ DatabaseEntry newKey = new DatabaseEntry();
+
+ bindingTuple.objectToEntry(new BindingRecord(exchangeName, queueName, routingKey, arguments), newKey);
+
+ DatabaseEntry newValue = new DatabaseEntry();
+ ByteBinding.byteToEntry((byte) 0, newValue);
+
+ targetDatabase.put(transaction, newKey, newValue);
+ }
+
+ private static final class ExchangeRecord
+ {
+ private final AMQShortString _name;
+ private final AMQShortString _type;
+
+ private ExchangeRecord(final AMQShortString name, final AMQShortString type)
+ {
+ _name = name;
+ _type = type;
+ }
+
+ public AMQShortString getName()
+ {
+ return _name;
+ }
+
+ public AMQShortString getType()
+ {
+ return _type;
+ }
+ }
+
+ private static final class ExchangeRecordBinding extends TupleBinding<ExchangeRecord>
+ {
+
+ @Override
+ public ExchangeRecord entryToObject(final TupleInput input)
+ {
+ return new ExchangeRecord(AMQShortStringEncoding.readShortString(input),
+ AMQShortStringEncoding.readShortString(input));
+ }
+
+ @Override
+ public void objectToEntry(final ExchangeRecord object, final TupleOutput output)
+ {
+ AMQShortStringEncoding.writeShortString(object.getName(), output);
+ AMQShortStringEncoding.writeShortString(object.getType(), output);
+ output.writeBoolean(false);
+ }
+ }
+
+ private static final class PartialBindingRecord
+ {
+ private final AMQShortString _exchangeName;
+ private final AMQShortString _queueName;
+
+ private PartialBindingRecord(final AMQShortString name, final AMQShortString type)
+ {
+ _exchangeName = name;
+ _queueName = type;
+ }
+
+ public AMQShortString getExchangeName()
+ {
+ return _exchangeName;
+ }
+
+ public AMQShortString getQueueName()
+ {
+ return _queueName;
+ }
+ }
+
+ private static final class PartialBindingRecordBinding extends TupleBinding<PartialBindingRecord>
+ {
+
+ @Override
+ public PartialBindingRecord entryToObject(final TupleInput input)
+ {
+ return new PartialBindingRecord(AMQShortStringEncoding.readShortString(input),
+ AMQShortStringEncoding.readShortString(input));
+ }
+
+ @Override
+ public void objectToEntry(final PartialBindingRecord object, final TupleOutput output)
+ {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ static final class QueueRecord
+ {
+ private final AMQShortString _queueName;
+ private final AMQShortString _owner;
+ private final FieldTable _arguments;
+ private final boolean _exclusive;
+
+ public QueueRecord(AMQShortString queueName, AMQShortString owner, boolean exclusive, FieldTable arguments)
+ {
+ _queueName = queueName;
+ _owner = owner;
+ _exclusive = exclusive;
+ _arguments = arguments;
+ }
+
+ public AMQShortString getNameShortString()
+ {
+ return _queueName;
+ }
+
+ public AMQShortString getOwner()
+ {
+ return _owner;
+ }
+
+ public boolean isExclusive()
+ {
+ return _exclusive;
+ }
+
+ public FieldTable getArguments()
+ {
+ return _arguments;
+ }
+ }
+
+ static final class QueueRecordBinding extends TupleBinding<QueueRecord>
+ {
+ private final List<AMQShortString> _durableSubNames;
+
+ QueueRecordBinding(final List<AMQShortString> durableSubNames)
+ {
+ _durableSubNames = durableSubNames;
+ }
+
+ @Override
+ public QueueRecord entryToObject(final TupleInput input)
+ {
+ AMQShortString name = AMQShortStringEncoding.readShortString(input);
+ AMQShortString owner = AMQShortStringEncoding.readShortString(input);
+ FieldTable arguments = FieldTableEncoding.readFieldTable(input);
+ boolean exclusive = input.available() > 0 && input.readBoolean();
+ exclusive = exclusive || _durableSubNames.contains(name);
+
+ return new QueueRecord(name, owner, exclusive, arguments);
+
+ }
+
+ @Override
+ public void objectToEntry(final QueueRecord record, final TupleOutput output)
+ {
+ AMQShortStringEncoding.writeShortString(record.getNameShortString(), output);
+ AMQShortStringEncoding.writeShortString(record.getOwner(), output);
+ FieldTableEncoding.writeFieldTable(record.getArguments(), output);
+ output.writeBoolean(record.isExclusive());
+
+ }
+ }
+
+ static final class MessageMetaDataBinding extends TupleBinding<StorableMessageMetaData>
+ {
+
+ @Override
+ public MessageMetaData entryToObject(final TupleInput input)
+ {
+ try
+ {
+ final MessagePublishInfo publishBody = readMessagePublishInfo(input);
+ final ContentHeaderBody contentHeaderBody = readContentHeaderBody(input);
+ final int contentChunkCount = input.readInt();
+
+ return new MessageMetaData(publishBody, contentHeaderBody, contentChunkCount);
+ }
+ catch (Exception e)
+ {
+ _logger.error("Error converting entry to object: " + e, e);
+ // annoyingly just have to return null since we cannot throw
+ return null;
+ }
+ }
+
+ private MessagePublishInfo readMessagePublishInfo(TupleInput tupleInput)
+ {
+
+ final AMQShortString exchange = AMQShortStringEncoding.readShortString(tupleInput);
+ final AMQShortString routingKey = AMQShortStringEncoding.readShortString(tupleInput);
+ final boolean mandatory = tupleInput.readBoolean();
+ final boolean immediate = tupleInput.readBoolean();
+
+ return new MessagePublishInfo()
+ {
+
+ public AMQShortString getExchange()
+ {
+ return exchange;
+ }
+
+ public void setExchange(AMQShortString exchange)
+ {
+
+ }
+
+ public boolean isImmediate()
+ {
+ return immediate;
+ }
+
+ public boolean isMandatory()
+ {
+ return mandatory;
+ }
+
+ public AMQShortString getRoutingKey()
+ {
+ return routingKey;
+ }
+ };
+
+ }
+
+ private ContentHeaderBody readContentHeaderBody(TupleInput tupleInput) throws AMQFrameDecodingException,
+ AMQProtocolVersionException
+ {
+ int bodySize = tupleInput.readInt();
+ byte[] underlying = new byte[bodySize];
+ tupleInput.readFast(underlying);
+
+ try
+ {
+ return ContentHeaderBody.createFromBuffer(new DataInputStream(new ByteArrayInputStream(underlying)),
+ bodySize);
+ }
+ catch (IOException e)
+ {
+ throw new AMQFrameDecodingException(null, e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public void objectToEntry(final StorableMessageMetaData metaData, final TupleOutput output)
+ {
+ final int bodySize = 1 + metaData.getStorableSize();
+ byte[] underlying = new byte[bodySize];
+ underlying[0] = (byte) metaData.getType().ordinal();
+ java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(underlying);
+ buf.position(1);
+ buf = buf.slice();
+
+ metaData.writeToBuffer(0, buf);
+ output.writeInt(bodySize);
+ output.writeFast(underlying);
+ }
+ }
+
+ static final class MessageContentKey
+ {
+ private long _messageId;
+ private int _chunk;
+
+ public MessageContentKey(long messageId, int chunkNo)
+ {
+ _messageId = messageId;
+ _chunk = chunkNo;
+ }
+
+ public int getChunk()
+ {
+ return _chunk;
+ }
+
+ public long getMessageId()
+ {
+ return _messageId;
+ }
+
+ }
+
+ static final class MessageContentKeyBinding extends TupleBinding<MessageContentKey>
+ {
+
+ public MessageContentKey entryToObject(TupleInput tupleInput)
+ {
+ long messageId = tupleInput.readLong();
+ int chunk = tupleInput.readInt();
+ return new MessageContentKey(messageId, chunk);
+ }
+
+ public void objectToEntry(MessageContentKey object, TupleOutput tupleOutput)
+ {
+ final MessageContentKey mk = object;
+ tupleOutput.writeLong(mk.getMessageId());
+ tupleOutput.writeInt(mk.getChunk());
+ }
+
+ }
+
+ static final class ContentBinding extends TupleBinding<ByteBuffer>
+ {
+ public ByteBuffer entryToObject(TupleInput tupleInput)
+ {
+ final int size = tupleInput.readInt();
+ byte[] underlying = new byte[size];
+ tupleInput.readFast(underlying);
+ return ByteBuffer.wrap(underlying);
+ }
+
+ public void objectToEntry(ByteBuffer src, TupleOutput tupleOutput)
+ {
+ src = src.slice();
+
+ byte[] chunkData = new byte[src.limit()];
+ src.duplicate().get(chunkData);
+
+ tupleOutput.writeInt(chunkData.length);
+ tupleOutput.writeFast(chunkData);
+ }
+ }
+
+ static final class QueueEntryKey
+ {
+ private AMQShortString _queueName;
+ private long _messageId;
+
+ public QueueEntryKey(AMQShortString queueName, long messageId)
+ {
+ _queueName = queueName;
+ _messageId = messageId;
+ }
+
+ public AMQShortString getQueueName()
+ {
+ return _queueName;
+ }
+
+ public long getMessageId()
+ {
+ return _messageId;
+ }
+
+ }
+
+ static final class QueueEntryKeyBinding extends TupleBinding<QueueEntryKey>
+ {
+ public QueueEntryKey entryToObject(TupleInput tupleInput)
+ {
+ AMQShortString queueName = AMQShortStringEncoding.readShortString(tupleInput);
+ long messageId = tupleInput.readLong();
+ return new QueueEntryKey(queueName, messageId);
+ }
+
+ public void objectToEntry(QueueEntryKey mk, TupleOutput tupleOutput)
+ {
+ AMQShortStringEncoding.writeShortString(mk.getQueueName(), tupleOutput);
+ tupleOutput.writeLong(mk.getMessageId());
+ }
+ }
+
+ static final class BindingRecord extends Object
+ {
+ private final AMQShortString _exchangeName;
+ private final AMQShortString _queueName;
+ private final AMQShortString _routingKey;
+ private final FieldTable _arguments;
+
+ public BindingRecord(AMQShortString exchangeName, AMQShortString queueName, AMQShortString routingKey,
+ FieldTable arguments)
+ {
+ _exchangeName = exchangeName;
+ _queueName = queueName;
+ _routingKey = routingKey;
+ _arguments = arguments;
+ }
+
+ public AMQShortString getExchangeName()
+ {
+ return _exchangeName;
+ }
+
+ public AMQShortString getQueueName()
+ {
+ return _queueName;
+ }
+
+ public AMQShortString getRoutingKey()
+ {
+ return _routingKey;
+ }
+
+ public FieldTable getArguments()
+ {
+ return _arguments;
+ }
+
+ }
+
+ static final class BindingTuple extends TupleBinding<BindingRecord>
+ {
+ public BindingRecord entryToObject(TupleInput tupleInput)
+ {
+ AMQShortString exchangeName = AMQShortStringEncoding.readShortString(tupleInput);
+ AMQShortString queueName = AMQShortStringEncoding.readShortString(tupleInput);
+ AMQShortString routingKey = AMQShortStringEncoding.readShortString(tupleInput);
+
+ FieldTable arguments = FieldTableEncoding.readFieldTable(tupleInput);
+
+ return new BindingRecord(exchangeName, queueName, routingKey, arguments);
+ }
+
+ public void objectToEntry(BindingRecord binding, TupleOutput tupleOutput)
+ {
+ AMQShortStringEncoding.writeShortString(binding.getExchangeName(), tupleOutput);
+ AMQShortStringEncoding.writeShortString(binding.getQueueName(), tupleOutput);
+ AMQShortStringEncoding.writeShortString(binding.getRoutingKey(), tupleOutput);
+
+ FieldTableEncoding.writeFieldTable(binding.getArguments(), tupleOutput);
+ }
+
+ }
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6.java
new file mode 100644
index 0000000000..3265fb6823
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6.java
@@ -0,0 +1,1207 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeInteractionResponse.ABORT;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeInteractionResponse.NO;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeInteractionResponse.YES;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.UUID;
+
+import org.apache.log4j.Logger;
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.exchange.ExchangeDefaults;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.model.Binding;
+import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.LifetimePolicy;
+import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.model.UUIDGenerator;
+import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
+import org.apache.qpid.server.store.berkeleydb.FieldTableEncoding;
+import org.apache.qpid.server.util.MapJsonSerializer;
+
+import com.sleepycat.bind.tuple.LongBinding;
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.CursorConfig;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+import com.sleepycat.je.Transaction;
+
+public class UpgradeFrom5To6 extends AbstractStoreUpgrade
+{
+
+ private static final Logger _logger = Logger.getLogger(UpgradeFrom5To6.class);
+
+ static final String OLD_CONTENT_DB_NAME = "messageContentDb_v5";
+ static final String NEW_CONTENT_DB_NAME = "MESSAGE_CONTENT";
+ static final String NEW_METADATA_DB_NAME = "MESSAGE_METADATA";
+ static final String OLD_META_DATA_DB_NAME = "messageMetaDataDb_v5";
+ static final String OLD_EXCHANGE_DB_NAME = "exchangeDb_v5";
+ static final String OLD_QUEUE_DB_NAME = "queueDb_v5";
+ static final String OLD_DELIVERY_DB_NAME = "deliveryDb_v5";
+ static final String OLD_QUEUE_BINDINGS_DB_NAME = "queueBindingsDb_v5";
+ static final String OLD_XID_DB_NAME = "xids_v5";
+ static final String NEW_XID_DB_NAME = "XIDS";
+ static final String CONFIGURED_OBJECTS_DB_NAME = "CONFIGURED_OBJECTS";
+ static final String NEW_DELIVERY_DB_NAME = "QUEUE_ENTRIES";
+ static final String NEW_BRIDGES_DB_NAME = "BRIDGES";
+ static final String NEW_LINKS_DB_NAME = "LINKS";
+ static final String OLD_BRIDGES_DB_NAME = "bridges_v5";
+ static final String OLD_LINKS_DB_NAME = "links_v5";
+
+ static final String[] DEFAULT_EXCHANGES = { ExchangeDefaults.DEFAULT_EXCHANGE_NAME.asString(),
+ ExchangeDefaults.DEFAULT_EXCHANGE_NAME.asString(), ExchangeDefaults.FANOUT_EXCHANGE_NAME.asString(),
+ ExchangeDefaults.HEADERS_EXCHANGE_NAME.asString(), ExchangeDefaults.TOPIC_EXCHANGE_NAME.asString(),
+ ExchangeDefaults.DIRECT_EXCHANGE_NAME.asString() };
+ private static final Set<String> DEFAULT_EXCHANGES_SET = new HashSet<String>(Arrays.asList(DEFAULT_EXCHANGES));
+
+ private MapJsonSerializer _serializer = new MapJsonSerializer();
+
+ /**
+ * Upgrades from a v5 database to a v6 database
+ *
+ * v6 is the first "new style" schema where we don't version every table,
+ * and the upgrade is re-runnable
+ *
+ * Change in this version:
+ *
+ * Message content is moved from the database messageContentDb_v5 to
+ * MESSAGE_CONTENT. The structure of the database changes from ( message-id:
+ * long, chunk-id: int ) -> ( size: int, byte[] data ) to ( message-id:
+ * long) -> ( byte[] data )
+ *
+ * That is we keep only one record per message, which contains all the
+ * message content
+ *
+ * Queue, Exchange, Bindings entries are stored now as configurable objects
+ * in "CONFIGURED_OBJECTS" table.
+ */
+ public void performUpgrade(final Environment environment, final UpgradeInteractionHandler handler, String virtualHostName)
+ throws DatabaseException, AMQStoreException
+ {
+ reportStarting(environment, 5);
+ upgradeMessages(environment, handler);
+ upgradeConfiguredObjectsAndDependencies(environment, handler, virtualHostName);
+ renameDatabases(environment, null);
+ reportFinished(environment, 6);
+ }
+
+ private void upgradeConfiguredObjectsAndDependencies(Environment environment, UpgradeInteractionHandler handler, String virtualHostName)
+ throws AMQStoreException
+ {
+ Transaction transaction = null;
+ try
+ {
+ transaction = environment.beginTransaction(null, null);
+ upgradeConfiguredObjects(environment, handler, transaction, virtualHostName);
+ upgradeQueueEntries(environment, transaction, virtualHostName);
+ upgradeXidEntries(environment, transaction, virtualHostName);
+ transaction.commit();
+ }
+ catch (Exception e)
+ {
+ transaction.abort();
+ if (e instanceof DatabaseException)
+ {
+ throw (DatabaseException) e;
+ }
+ else if (e instanceof AMQStoreException)
+ {
+ throw (AMQStoreException) e;
+ }
+ else
+ {
+ throw new AMQStoreException("Unexpected exception", e);
+ }
+ }
+ }
+
+ private void upgradeMessages(final Environment environment, final UpgradeInteractionHandler handler)
+ throws AMQStoreException
+ {
+ Transaction transaction = null;
+ try
+ {
+ transaction = environment.beginTransaction(null, null);
+ upgradeMessages(environment, handler, transaction);
+ transaction.commit();
+ }
+ catch (Exception e)
+ {
+ transaction.abort();
+ if (e instanceof DatabaseException)
+ {
+ throw (DatabaseException) e;
+ }
+ else if (e instanceof AMQStoreException)
+ {
+ throw (AMQStoreException) e;
+ }
+ else
+ {
+ throw new AMQStoreException("Unexpected exception", e);
+ }
+ }
+ }
+
+ private void renameDatabases(Environment environment, Transaction transaction)
+ {
+ List<String> databases = environment.getDatabaseNames();
+ String[] oldDatabases = { OLD_META_DATA_DB_NAME, OLD_BRIDGES_DB_NAME, OLD_LINKS_DB_NAME };
+ String[] newDatabases = { NEW_METADATA_DB_NAME, NEW_BRIDGES_DB_NAME, NEW_LINKS_DB_NAME };
+
+ for (int i = 0; i < oldDatabases.length; i++)
+ {
+ String oldName = oldDatabases[i];
+ String newName = newDatabases[i];
+ if (databases.contains(oldName))
+ {
+ _logger.info("Renaming " + oldName + " into " + newName);
+ environment.renameDatabase(transaction, oldName, newName);
+ }
+ }
+ }
+
+ private void upgradeMessages(final Environment environment, final UpgradeInteractionHandler handler,
+ final Transaction transaction) throws AMQStoreException
+ {
+ _logger.info("Message Contents");
+ if (environment.getDatabaseNames().contains(OLD_CONTENT_DB_NAME))
+ {
+ DatabaseRunnable contentOperation = new DatabaseRunnable()
+ {
+ @Override
+ public void run(final Database oldContentDatabase, final Database newContentDatabase,
+ Transaction contentTransaction)
+ {
+ CursorOperation metaDataDatabaseOperation = new CursorOperation()
+ {
+
+ @Override
+ public void processEntry(Database metadataDatabase, Database notUsed,
+ Transaction metaDataTransaction, DatabaseEntry key, DatabaseEntry value)
+ {
+ long messageId = LongBinding.entryToLong(key);
+ upgradeMessage(messageId, oldContentDatabase, newContentDatabase, handler, metaDataTransaction,
+ metadataDatabase);
+ }
+ };
+ new DatabaseTemplate(environment, OLD_META_DATA_DB_NAME, contentTransaction)
+ .run(metaDataDatabaseOperation);
+ _logger.info(metaDataDatabaseOperation.getRowCount() + " Message Content Entries");
+ }
+ };
+ new DatabaseTemplate(environment, OLD_CONTENT_DB_NAME, NEW_CONTENT_DB_NAME, transaction).run(contentOperation);
+ environment.removeDatabase(transaction, OLD_CONTENT_DB_NAME);
+ }
+ }
+
+ /**
+ * Upgrade an individual message, that is read all the data from the old
+ * database, consolidate it into a single byte[] and then (in a transaction)
+ * remove the record from the old database and add the corresponding record
+ * to the new database
+ */
+ private void upgradeMessage(final long messageId, final Database oldDatabase, final Database newDatabase,
+ final UpgradeInteractionHandler handler, Transaction txn, Database oldMetadataDatabase)
+ {
+ SortedMap<Integer, byte[]> messageData = getMessageData(messageId, oldDatabase);
+ byte[] consolidatedData = new byte[0];
+ for (Map.Entry<Integer, byte[]> entry : messageData.entrySet())
+ {
+ int offset = entry.getKey();
+ if (offset != consolidatedData.length)
+ {
+ String message;
+ if (offset < consolidatedData.length)
+ {
+ message = "Missing data in message id " + messageId + " between offset " + consolidatedData.length
+ + " and " + offset + ". ";
+ }
+ else
+ {
+ message = "Duplicate data in message id " + messageId + " between offset " + offset + " and "
+ + consolidatedData.length + ". ";
+ }
+ UpgradeInteractionResponse action = handler.requireResponse(message
+ + "Do you wish do recover as much of this message as "
+ + "possible (answering NO will delete the message)?", ABORT, YES, NO, ABORT);
+
+ switch (action)
+ {
+ case YES:
+ byte[] oldData = consolidatedData;
+ consolidatedData = new byte[offset];
+ System.arraycopy(oldData, 0, consolidatedData, 0, Math.min(oldData.length, consolidatedData.length));
+ break;
+ case NO:
+ DatabaseEntry key = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, key);
+ oldMetadataDatabase.delete(txn, key);
+ return;
+ case ABORT:
+ _logger.error(message);
+ throw new RuntimeException("Unable to upgrade message " + messageId);
+ }
+
+ }
+ byte[] data = new byte[consolidatedData.length + entry.getValue().length];
+ System.arraycopy(consolidatedData, 0, data, 0, consolidatedData.length);
+ System.arraycopy(entry.getValue(), 0, data, offset, entry.getValue().length);
+ consolidatedData = data;
+ }
+
+ CompoundKeyBinding binding = new CompoundKeyBinding();
+ for (int offset : messageData.keySet())
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ binding.objectToEntry(new CompoundKey(messageId, offset), key);
+ oldDatabase.delete(txn, key);
+ }
+ DatabaseEntry key = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, key);
+ NewDataBinding dataBinding = new NewDataBinding();
+ DatabaseEntry value = new DatabaseEntry();
+ dataBinding.objectToEntry(consolidatedData, value);
+
+ put(newDatabase, txn, key, value);
+ }
+
+ /**
+ * @return a (sorted) map of offset -> data for the given message id
+ */
+ private SortedMap<Integer, byte[]> getMessageData(final long messageId, final Database oldDatabase)
+ {
+ TreeMap<Integer, byte[]> data = new TreeMap<Integer, byte[]>();
+
+ Cursor cursor = oldDatabase.openCursor(null, CursorConfig.READ_COMMITTED);
+ try
+ {
+ DatabaseEntry contentKeyEntry = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+ CompoundKeyBinding binding = new CompoundKeyBinding();
+ binding.objectToEntry(new CompoundKey(messageId, 0), contentKeyEntry);
+
+ OperationStatus status = cursor.getSearchKeyRange(contentKeyEntry, value, LockMode.DEFAULT);
+ OldDataBinding dataBinding = new OldDataBinding();
+
+ while (status == OperationStatus.SUCCESS)
+ {
+ CompoundKey compoundKey = binding.entryToObject(contentKeyEntry);
+ long id = compoundKey.getMessageId();
+
+ if (id != messageId)
+ {
+ // we have exhausted all chunks for this message id, break
+ break;
+ }
+
+ int offsetInMessage = compoundKey.getOffset();
+ OldDataValue dataValue = dataBinding.entryToObject(value);
+ data.put(offsetInMessage, dataValue.getData());
+
+ status = cursor.getNext(contentKeyEntry, value, LockMode.DEFAULT);
+ }
+ }
+ finally
+ {
+ cursor.close();
+ }
+
+ return data;
+ }
+
+ private void upgradeConfiguredObjects(Environment environment, UpgradeInteractionHandler handler, Transaction transaction, String virtualHostName)
+ throws AMQStoreException
+ {
+ upgradeQueues(environment, transaction, virtualHostName);
+ upgradeExchanges(environment, transaction, virtualHostName);
+ upgradeQueueBindings(environment, transaction, handler, virtualHostName);
+ }
+
+ private void upgradeXidEntries(Environment environment, Transaction transaction, final String virtualHostName)
+ {
+ if (environment.getDatabaseNames().contains(OLD_XID_DB_NAME))
+ {
+ _logger.info("Xid Records");
+ final OldPreparedTransactionBinding oldTransactionBinding = new OldPreparedTransactionBinding();
+ final NewPreparedTransactionBinding newTransactionBinding = new NewPreparedTransactionBinding();
+ CursorOperation xidEntriesCursor = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database oldXidDatabase, Database newXidDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ OldPreparedTransaction oldPreparedTransaction = oldTransactionBinding.entryToObject(value);
+ OldRecordImpl[] oldDequeues = oldPreparedTransaction.getDequeues();
+ OldRecordImpl[] oldEnqueues = oldPreparedTransaction.getEnqueues();
+
+ NewRecordImpl[] newEnqueues = null;
+ NewRecordImpl[] newDequeues = null;
+ if (oldDequeues != null)
+ {
+ newDequeues = new NewRecordImpl[oldDequeues.length];
+ for (int i = 0; i < newDequeues.length; i++)
+ {
+ OldRecordImpl dequeue = oldDequeues[i];
+ UUID id = UUIDGenerator.generateUUID(dequeue.getQueueName(), virtualHostName);
+ newDequeues[i] = new NewRecordImpl(id, dequeue.getMessageNumber());
+ }
+ }
+ if (oldEnqueues != null)
+ {
+ newEnqueues = new NewRecordImpl[oldEnqueues.length];
+ for (int i = 0; i < newEnqueues.length; i++)
+ {
+ OldRecordImpl enqueue = oldEnqueues[i];
+ UUID id = UUIDGenerator.generateUUID(enqueue.getQueueName(), virtualHostName);
+ newEnqueues[i] = new NewRecordImpl(id, enqueue.getMessageNumber());
+ }
+ }
+ NewPreparedTransaction newPreparedTransaction = new NewPreparedTransaction(newEnqueues, newDequeues);
+ DatabaseEntry newValue = new DatabaseEntry();
+ newTransactionBinding.objectToEntry(newPreparedTransaction, newValue);
+ put(newXidDatabase, transaction, key, newValue);
+ }
+ };
+ new DatabaseTemplate(environment, OLD_XID_DB_NAME, NEW_XID_DB_NAME, transaction).run(xidEntriesCursor);
+ environment.removeDatabase(transaction, OLD_XID_DB_NAME);
+ _logger.info(xidEntriesCursor.getRowCount() + " Xid Entries");
+ }
+ }
+
+ private void upgradeQueueEntries(Environment environment, Transaction transaction, final String virtualHostName)
+ {
+ _logger.info("Queue Delivery Records");
+ if (environment.getDatabaseNames().contains(OLD_DELIVERY_DB_NAME))
+ {
+ final OldQueueEntryBinding oldBinding = new OldQueueEntryBinding();
+ final NewQueueEntryBinding newBinding = new NewQueueEntryBinding();
+ CursorOperation queueEntriesCursor = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database oldDeliveryDatabase, Database newDeliveryDatabase,
+ Transaction transaction, DatabaseEntry key, DatabaseEntry value)
+ {
+ OldQueueEntryKey oldEntryRecord = oldBinding.entryToObject(key);
+ UUID queueId = UUIDGenerator.generateUUID(oldEntryRecord.getQueueName().asString(), virtualHostName);
+
+ NewQueueEntryKey newEntryRecord = new NewQueueEntryKey(queueId, oldEntryRecord.getMessageId());
+ DatabaseEntry newKey = new DatabaseEntry();
+ newBinding.objectToEntry(newEntryRecord, newKey);
+ put(newDeliveryDatabase, transaction, newKey, value);
+ }
+ };
+ new DatabaseTemplate(environment, OLD_DELIVERY_DB_NAME, NEW_DELIVERY_DB_NAME, transaction)
+ .run(queueEntriesCursor);
+ environment.removeDatabase(transaction, OLD_DELIVERY_DB_NAME);
+ _logger.info(queueEntriesCursor.getRowCount() + " Queue Delivery Record Entries");
+ }
+ }
+
+ private void upgradeQueueBindings(Environment environment, Transaction transaction, final UpgradeInteractionHandler handler, final String virtualHostName)
+ {
+ _logger.info("Queue Bindings");
+ if (environment.getDatabaseNames().contains(OLD_QUEUE_BINDINGS_DB_NAME))
+ {
+ final QueueBindingBinding binding = new QueueBindingBinding();
+ CursorOperation bindingCursor = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database exchangeDatabase, Database configuredObjectsDatabase,
+ Transaction transaction, DatabaseEntry key, DatabaseEntry value)
+ {
+ // TODO: check and remove orphaned bindings
+ BindingRecord bindingRecord = binding.entryToObject(key);
+ String exchangeName = bindingRecord.getExchangeName() == null ? ExchangeDefaults.DEFAULT_EXCHANGE_NAME
+ .asString() : bindingRecord.getExchangeName().asString();
+ String queueName = bindingRecord.getQueueName().asString();
+ String routingKey = bindingRecord.getRoutingKey().asString();
+ FieldTable arguments = bindingRecord.getArguments();
+
+ UUID bindingId = UUIDGenerator.generateUUID();
+ UpgradeConfiguredObjectRecord configuredObject = createBindingConfiguredObjectRecord(exchangeName, queueName,
+ routingKey, arguments, virtualHostName);
+ storeConfiguredObjectEntry(configuredObjectsDatabase, bindingId, configuredObject, transaction);
+ }
+
+ };
+ new DatabaseTemplate(environment, OLD_QUEUE_BINDINGS_DB_NAME, CONFIGURED_OBJECTS_DB_NAME, transaction)
+ .run(bindingCursor);
+ environment.removeDatabase(transaction, OLD_QUEUE_BINDINGS_DB_NAME);
+ _logger.info(bindingCursor.getRowCount() + " Queue Binding Entries");
+ }
+ }
+
+ private List<String> upgradeExchanges(Environment environment, Transaction transaction, final String virtualHostName)
+ {
+ final List<String> exchangeNames = new ArrayList<String>();
+ _logger.info("Exchanges");
+ if (environment.getDatabaseNames().contains(OLD_EXCHANGE_DB_NAME))
+ {
+ final ExchangeBinding exchangeBinding = new ExchangeBinding();
+ CursorOperation exchangeCursor = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database exchangeDatabase, Database configuredObjectsDatabase,
+ Transaction transaction, DatabaseEntry key, DatabaseEntry value)
+ {
+ ExchangeRecord exchangeRecord = exchangeBinding.entryToObject(value);
+ String exchangeName = exchangeRecord.getNameShortString().asString();
+ if (!DEFAULT_EXCHANGES_SET.contains(exchangeName))
+ {
+ String exchangeType = exchangeRecord.getType().asString();
+ boolean autoDelete = exchangeRecord.isAutoDelete();
+
+ UUID exchangeId = UUIDGenerator.generateUUID(exchangeName, virtualHostName);
+
+ UpgradeConfiguredObjectRecord configuredObject = createExchangeConfiguredObjectRecord(exchangeName,
+ exchangeType, autoDelete);
+ storeConfiguredObjectEntry(configuredObjectsDatabase, exchangeId, configuredObject, transaction);
+ exchangeNames.add(exchangeName);
+ }
+ }
+ };
+ new DatabaseTemplate(environment, OLD_EXCHANGE_DB_NAME, CONFIGURED_OBJECTS_DB_NAME, transaction)
+ .run(exchangeCursor);
+ environment.removeDatabase(transaction, OLD_EXCHANGE_DB_NAME);
+ _logger.info(exchangeCursor.getRowCount() + " Exchange Entries");
+ }
+ return exchangeNames;
+ }
+
+ private List<String> upgradeQueues(Environment environment, Transaction transaction, final String virtualHostName)
+ {
+ final List<String> queueNames = new ArrayList<String>();
+ _logger.info("Queues");
+ if (environment.getDatabaseNames().contains(OLD_QUEUE_DB_NAME))
+ {
+ final UpgradeQueueBinding queueBinding = new UpgradeQueueBinding();
+ CursorOperation queueCursor = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database queueDatabase, Database configuredObjectsDatabase,
+ Transaction transaction, DatabaseEntry key, DatabaseEntry value)
+ {
+ OldQueueRecord queueRecord = queueBinding.entryToObject(value);
+ String queueName = queueRecord.getNameShortString().asString();
+ queueNames.add(queueName);
+ String owner = queueRecord.getOwner() == null ? null : queueRecord.getOwner().asString();
+ boolean exclusive = queueRecord.isExclusive();
+ FieldTable arguments = queueRecord.getArguments();
+
+ UUID queueId = UUIDGenerator.generateUUID(queueName, virtualHostName);
+ UpgradeConfiguredObjectRecord configuredObject = createQueueConfiguredObjectRecord(queueName, owner, exclusive,
+ arguments);
+ storeConfiguredObjectEntry(configuredObjectsDatabase, queueId, configuredObject, transaction);
+ }
+ };
+ new DatabaseTemplate(environment, OLD_QUEUE_DB_NAME, CONFIGURED_OBJECTS_DB_NAME, transaction).run(queueCursor);
+ environment.removeDatabase(transaction, OLD_QUEUE_DB_NAME);
+ _logger.info(queueCursor.getRowCount() + " Queue Entries");
+ }
+ return queueNames;
+ }
+
+ private void storeConfiguredObjectEntry(Database configuredObjectsDatabase, UUID id,
+ UpgradeConfiguredObjectRecord configuredObject, Transaction transaction)
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+ UpgradeUUIDBinding uuidBinding = new UpgradeUUIDBinding();
+ uuidBinding.objectToEntry(id, key);
+ ConfiguredObjectBinding configuredBinding = new ConfiguredObjectBinding();
+ configuredBinding.objectToEntry(configuredObject, value);
+ put(configuredObjectsDatabase, transaction, key, value);
+ }
+
+ private UpgradeConfiguredObjectRecord createQueueConfiguredObjectRecord(String queueName, String owner, boolean exclusive,
+ FieldTable arguments)
+ {
+ Map<String, Object> attributesMap = new HashMap<String, Object>();
+ attributesMap.put(Queue.NAME, queueName);
+ attributesMap.put(Queue.OWNER, owner);
+ attributesMap.put(Queue.EXCLUSIVE, exclusive);
+ if (arguments != null)
+ {
+ attributesMap.put("ARGUMENTS", FieldTable.convertToMap(arguments));
+ }
+ String json = _serializer.serialize(attributesMap);
+ UpgradeConfiguredObjectRecord configuredObject = new UpgradeConfiguredObjectRecord(Queue.class.getName(), json);
+ return configuredObject;
+ }
+
+ private UpgradeConfiguredObjectRecord createExchangeConfiguredObjectRecord(String exchangeName, String exchangeType,
+ boolean autoDelete)
+ {
+ Map<String, Object> attributesMap = new HashMap<String, Object>();
+ attributesMap.put(Exchange.NAME, exchangeName);
+ attributesMap.put(Exchange.TYPE, exchangeType);
+ attributesMap.put(Exchange.LIFETIME_POLICY, autoDelete ? LifetimePolicy.AUTO_DELETE.name()
+ : LifetimePolicy.PERMANENT.name());
+ String json = _serializer.serialize(attributesMap);
+ UpgradeConfiguredObjectRecord configuredObject = new UpgradeConfiguredObjectRecord(Exchange.class.getName(), json);
+ return configuredObject;
+ }
+
+ private UpgradeConfiguredObjectRecord createBindingConfiguredObjectRecord(String exchangeName, String queueName,
+ String routingKey, FieldTable arguments, String virtualHostName)
+ {
+ Map<String, Object> attributesMap = new HashMap<String, Object>();
+ attributesMap.put(Binding.NAME, routingKey);
+ attributesMap.put(Binding.EXCHANGE, UUIDGenerator.generateUUID(exchangeName, virtualHostName));
+ attributesMap.put(Binding.QUEUE, UUIDGenerator.generateUUID(queueName, virtualHostName));
+ if (arguments != null)
+ {
+ attributesMap.put(Binding.ARGUMENTS, FieldTable.convertToMap(arguments));
+ }
+ String json = _serializer.serialize(attributesMap);
+ UpgradeConfiguredObjectRecord configuredObject = new UpgradeConfiguredObjectRecord(Binding.class.getName(), json);
+ return configuredObject;
+ }
+
+ private void put(final Database database, Transaction txn, DatabaseEntry key, DatabaseEntry value)
+ {
+ OperationStatus status = database.put(txn, key, value);
+ if (status != OperationStatus.SUCCESS)
+ {
+ throw new RuntimeException("Cannot add record into " + database.getDatabaseName() + ":" + status);
+ }
+ }
+
+ static final class CompoundKey
+ {
+ public final long _messageId;
+ public final int _offset;
+
+ public CompoundKey(final long messageId, final int offset)
+ {
+ _messageId = messageId;
+ _offset = offset;
+ }
+
+ public long getMessageId()
+ {
+ return _messageId;
+ }
+
+ public int getOffset()
+ {
+ return _offset;
+ }
+ }
+
+ static final class CompoundKeyBinding extends TupleBinding<CompoundKey>
+ {
+
+ @Override
+ public CompoundKey entryToObject(final TupleInput input)
+ {
+ return new CompoundKey(input.readLong(), input.readInt());
+ }
+
+ @Override
+ public void objectToEntry(final CompoundKey object, final TupleOutput output)
+ {
+ output.writeLong(object._messageId);
+ output.writeInt(object._offset);
+ }
+ }
+
+ static final class OldDataValue
+ {
+ private final int _size;
+ private final byte[] _data;
+
+ private OldDataValue(final int size, final byte[] data)
+ {
+ _size = size;
+ _data = data;
+ }
+
+ public int getSize()
+ {
+ return _size;
+ }
+
+ public byte[] getData()
+ {
+ return _data;
+ }
+ }
+
+ static final class OldDataBinding extends TupleBinding<OldDataValue>
+ {
+
+ @Override
+ public OldDataValue entryToObject(final TupleInput input)
+ {
+ int size = input.readInt();
+ byte[] data = new byte[size];
+ input.read(data);
+ return new OldDataValue(size, data);
+ }
+
+ @Override
+ public void objectToEntry(OldDataValue value, final TupleOutput output)
+ {
+ output.writeInt(value.getSize());
+ output.write(value.getData());
+ }
+ }
+
+ static final class NewDataBinding extends TupleBinding<byte[]>
+ {
+
+ @Override
+ public byte[] entryToObject(final TupleInput input)
+ {
+ byte[] data = new byte[input.available()];
+ input.read(data);
+ return data;
+ }
+
+ @Override
+ public void objectToEntry(final byte[] data, final TupleOutput output)
+ {
+ output.write(data);
+ }
+ }
+
+ static class OldQueueRecord extends Object
+ {
+ private final AMQShortString _queueName;
+ private final AMQShortString _owner;
+ private final FieldTable _arguments;
+ private boolean _exclusive;
+
+ public OldQueueRecord(AMQShortString queueName, AMQShortString owner, boolean exclusive, FieldTable arguments)
+ {
+ _queueName = queueName;
+ _owner = owner;
+ _exclusive = exclusive;
+ _arguments = arguments;
+ }
+
+ public AMQShortString getNameShortString()
+ {
+ return _queueName;
+ }
+
+ public AMQShortString getOwner()
+ {
+ return _owner;
+ }
+
+ public boolean isExclusive()
+ {
+ return _exclusive;
+ }
+
+ public void setExclusive(boolean exclusive)
+ {
+ _exclusive = exclusive;
+ }
+
+ public FieldTable getArguments()
+ {
+ return _arguments;
+ }
+
+ }
+
+ static class UpgradeConfiguredObjectRecord
+ {
+ private String _attributes;
+ private String _type;
+
+ public UpgradeConfiguredObjectRecord(String type, String attributes)
+ {
+ super();
+ _attributes = attributes;
+ _type = type;
+ }
+
+ public String getAttributes()
+ {
+ return _attributes;
+ }
+
+ public String getType()
+ {
+ return _type;
+ }
+
+ }
+
+ static class UpgradeQueueBinding extends TupleBinding<OldQueueRecord>
+ {
+ public OldQueueRecord entryToObject(TupleInput tupleInput)
+ {
+ AMQShortString name = AMQShortStringEncoding.readShortString(tupleInput);
+ AMQShortString owner = AMQShortStringEncoding.readShortString(tupleInput);
+ FieldTable arguments = FieldTableEncoding.readFieldTable(tupleInput);
+ boolean exclusive = tupleInput.readBoolean();
+ return new OldQueueRecord(name, owner, exclusive, arguments);
+ }
+
+ public void objectToEntry(OldQueueRecord queue, TupleOutput tupleOutput)
+ {
+ AMQShortStringEncoding.writeShortString(queue.getNameShortString(), tupleOutput);
+ AMQShortStringEncoding.writeShortString(queue.getOwner(), tupleOutput);
+ FieldTableEncoding.writeFieldTable(queue.getArguments(), tupleOutput);
+ tupleOutput.writeBoolean(queue.isExclusive());
+ }
+ }
+
+ static class UpgradeUUIDBinding extends TupleBinding<UUID>
+ {
+ public UUID entryToObject(final TupleInput tupleInput)
+ {
+ return new UUID(tupleInput.readLong(), tupleInput.readLong());
+ }
+
+ public void objectToEntry(final UUID uuid, final TupleOutput tupleOutput)
+ {
+ tupleOutput.writeLong(uuid.getMostSignificantBits());
+ tupleOutput.writeLong(uuid.getLeastSignificantBits());
+ }
+ }
+
+ static class ConfiguredObjectBinding extends TupleBinding<UpgradeConfiguredObjectRecord>
+ {
+
+ public UpgradeConfiguredObjectRecord entryToObject(TupleInput tupleInput)
+ {
+ String type = tupleInput.readString();
+ String json = tupleInput.readString();
+ UpgradeConfiguredObjectRecord configuredObject = new UpgradeConfiguredObjectRecord(type, json);
+ return configuredObject;
+ }
+
+ public void objectToEntry(UpgradeConfiguredObjectRecord object, TupleOutput tupleOutput)
+ {
+ tupleOutput.writeString(object.getType());
+ tupleOutput.writeString(object.getAttributes());
+ }
+
+ }
+
+ static class ExchangeRecord extends Object
+ {
+ private final AMQShortString _exchangeName;
+ private final AMQShortString _exchangeType;
+ private final boolean _autoDelete;
+
+ public ExchangeRecord(AMQShortString exchangeName, AMQShortString exchangeType, boolean autoDelete)
+ {
+ _exchangeName = exchangeName;
+ _exchangeType = exchangeType;
+ _autoDelete = autoDelete;
+ }
+
+ public AMQShortString getNameShortString()
+ {
+ return _exchangeName;
+ }
+
+ public AMQShortString getType()
+ {
+ return _exchangeType;
+ }
+
+ public boolean isAutoDelete()
+ {
+ return _autoDelete;
+ }
+
+ }
+
+ static class ExchangeBinding extends TupleBinding<ExchangeRecord>
+ {
+
+ public ExchangeRecord entryToObject(TupleInput tupleInput)
+ {
+ AMQShortString name = AMQShortStringEncoding.readShortString(tupleInput);
+ AMQShortString typeName = AMQShortStringEncoding.readShortString(tupleInput);
+
+ boolean autoDelete = tupleInput.readBoolean();
+
+ return new ExchangeRecord(name, typeName, autoDelete);
+ }
+
+ public void objectToEntry(ExchangeRecord exchange, TupleOutput tupleOutput)
+ {
+ AMQShortStringEncoding.writeShortString(exchange.getNameShortString(), tupleOutput);
+ AMQShortStringEncoding.writeShortString(exchange.getType(), tupleOutput);
+
+ tupleOutput.writeBoolean(exchange.isAutoDelete());
+ }
+ }
+
+ static class BindingRecord extends Object
+ {
+ private final AMQShortString _exchangeName;
+ private final AMQShortString _queueName;
+ private final AMQShortString _routingKey;
+ private final FieldTable _arguments;
+
+ public BindingRecord(AMQShortString exchangeName, AMQShortString queueName, AMQShortString routingKey,
+ FieldTable arguments)
+ {
+ _exchangeName = exchangeName;
+ _queueName = queueName;
+ _routingKey = routingKey;
+ _arguments = arguments;
+ }
+
+ public AMQShortString getExchangeName()
+ {
+ return _exchangeName;
+ }
+
+ public AMQShortString getQueueName()
+ {
+ return _queueName;
+ }
+
+ public AMQShortString getRoutingKey()
+ {
+ return _routingKey;
+ }
+
+ public FieldTable getArguments()
+ {
+ return _arguments;
+ }
+
+ }
+
+ static class QueueBindingBinding extends TupleBinding<BindingRecord>
+ {
+
+ public BindingRecord entryToObject(TupleInput tupleInput)
+ {
+ AMQShortString exchangeName = AMQShortStringEncoding.readShortString(tupleInput);
+ AMQShortString queueName = AMQShortStringEncoding.readShortString(tupleInput);
+ AMQShortString routingKey = AMQShortStringEncoding.readShortString(tupleInput);
+
+ FieldTable arguments = FieldTableEncoding.readFieldTable(tupleInput);
+
+ return new BindingRecord(exchangeName, queueName, routingKey, arguments);
+ }
+
+ public void objectToEntry(BindingRecord binding, TupleOutput tupleOutput)
+ {
+ AMQShortStringEncoding.writeShortString(binding.getExchangeName(), tupleOutput);
+ AMQShortStringEncoding.writeShortString(binding.getQueueName(), tupleOutput);
+ AMQShortStringEncoding.writeShortString(binding.getRoutingKey(), tupleOutput);
+
+ FieldTableEncoding.writeFieldTable(binding.getArguments(), tupleOutput);
+ }
+ }
+
+ static class OldQueueEntryKey
+ {
+ private AMQShortString _queueName;
+ private long _messageId;
+
+ public OldQueueEntryKey(AMQShortString queueName, long messageId)
+ {
+ _queueName = queueName;
+ _messageId = messageId;
+ }
+
+ public AMQShortString getQueueName()
+ {
+ return _queueName;
+ }
+
+ public long getMessageId()
+ {
+ return _messageId;
+ }
+ }
+
+ static class OldQueueEntryBinding extends TupleBinding<OldQueueEntryKey>
+ {
+
+ public OldQueueEntryKey entryToObject(TupleInput tupleInput)
+ {
+ AMQShortString queueName = AMQShortStringEncoding.readShortString(tupleInput);
+ long messageId = tupleInput.readLong();
+
+ return new OldQueueEntryKey(queueName, messageId);
+ }
+
+ public void objectToEntry(OldQueueEntryKey mk, TupleOutput tupleOutput)
+ {
+ AMQShortStringEncoding.writeShortString(mk.getQueueName(), tupleOutput);
+ tupleOutput.writeLong(mk.getMessageId());
+ }
+ }
+
+ static class NewQueueEntryKey
+ {
+ private UUID _queueId;
+ private long _messageId;
+
+ public NewQueueEntryKey(UUID queueId, long messageId)
+ {
+ _queueId = queueId;
+ _messageId = messageId;
+ }
+
+ public UUID getQueueId()
+ {
+ return _queueId;
+ }
+
+ public long getMessageId()
+ {
+ return _messageId;
+ }
+ }
+
+ static class NewQueueEntryBinding extends TupleBinding<NewQueueEntryKey>
+ {
+
+ public NewQueueEntryKey entryToObject(TupleInput tupleInput)
+ {
+ UUID queueId = new UUID(tupleInput.readLong(), tupleInput.readLong());
+ long messageId = tupleInput.readLong();
+
+ return new NewQueueEntryKey(queueId, messageId);
+ }
+
+ public void objectToEntry(NewQueueEntryKey mk, TupleOutput tupleOutput)
+ {
+ UUID uuid = mk.getQueueId();
+ tupleOutput.writeLong(uuid.getMostSignificantBits());
+ tupleOutput.writeLong(uuid.getLeastSignificantBits());
+ tupleOutput.writeLong(mk.getMessageId());
+ }
+ }
+
+ static class NewPreparedTransaction
+ {
+ private final NewRecordImpl[] _enqueues;
+ private final NewRecordImpl[] _dequeues;
+
+ public NewPreparedTransaction(NewRecordImpl[] enqueues, NewRecordImpl[] dequeues)
+ {
+ _enqueues = enqueues;
+ _dequeues = dequeues;
+ }
+
+ public NewRecordImpl[] getEnqueues()
+ {
+ return _enqueues;
+ }
+
+ public NewRecordImpl[] getDequeues()
+ {
+ return _dequeues;
+ }
+ }
+
+ static class NewRecordImpl
+ {
+
+ private long _messageNumber;
+ private UUID _queueId;
+
+ public NewRecordImpl(UUID queueId, long messageNumber)
+ {
+ _messageNumber = messageNumber;
+ _queueId = queueId;
+ }
+
+ public long getMessageNumber()
+ {
+ return _messageNumber;
+ }
+
+ public UUID getId()
+ {
+ return _queueId;
+ }
+ }
+
+ static class NewPreparedTransactionBinding extends TupleBinding<NewPreparedTransaction>
+ {
+ @Override
+ public NewPreparedTransaction entryToObject(TupleInput input)
+ {
+ NewRecordImpl[] enqueues = readRecords(input);
+
+ NewRecordImpl[] dequeues = readRecords(input);
+
+ return new NewPreparedTransaction(enqueues, dequeues);
+ }
+
+ private NewRecordImpl[] readRecords(TupleInput input)
+ {
+ NewRecordImpl[] records = new NewRecordImpl[input.readInt()];
+ for (int i = 0; i < records.length; i++)
+ {
+ records[i] = new NewRecordImpl(new UUID(input.readLong(), input.readLong()), input.readLong());
+ }
+ return records;
+ }
+
+ @Override
+ public void objectToEntry(NewPreparedTransaction preparedTransaction, TupleOutput output)
+ {
+ writeRecords(preparedTransaction.getEnqueues(), output);
+ writeRecords(preparedTransaction.getDequeues(), output);
+ }
+
+ private void writeRecords(NewRecordImpl[] records, TupleOutput output)
+ {
+ if (records == null)
+ {
+ output.writeInt(0);
+ }
+ else
+ {
+ output.writeInt(records.length);
+ for (NewRecordImpl record : records)
+ {
+ UUID id = record.getId();
+ output.writeLong(id.getMostSignificantBits());
+ output.writeLong(id.getLeastSignificantBits());
+ output.writeLong(record.getMessageNumber());
+ }
+ }
+ }
+ }
+
+ static class OldRecordImpl
+ {
+
+ private long _messageNumber;
+ private String _queueName;
+
+ public OldRecordImpl(String queueName, long messageNumber)
+ {
+ _messageNumber = messageNumber;
+ _queueName = queueName;
+ }
+
+ public long getMessageNumber()
+ {
+ return _messageNumber;
+ }
+
+ public String getQueueName()
+ {
+ return _queueName;
+ }
+ }
+
+ static class OldPreparedTransaction
+ {
+ private final OldRecordImpl[] _enqueues;
+ private final OldRecordImpl[] _dequeues;
+
+ public OldPreparedTransaction(OldRecordImpl[] enqueues, OldRecordImpl[] dequeues)
+ {
+ _enqueues = enqueues;
+ _dequeues = dequeues;
+ }
+
+ public OldRecordImpl[] getEnqueues()
+ {
+ return _enqueues;
+ }
+
+ public OldRecordImpl[] getDequeues()
+ {
+ return _dequeues;
+ }
+ }
+
+ static class OldPreparedTransactionBinding extends TupleBinding<OldPreparedTransaction>
+ {
+ @Override
+ public OldPreparedTransaction entryToObject(TupleInput input)
+ {
+ OldRecordImpl[] enqueues = readRecords(input);
+
+ OldRecordImpl[] dequeues = readRecords(input);
+
+ return new OldPreparedTransaction(enqueues, dequeues);
+ }
+
+ private OldRecordImpl[] readRecords(TupleInput input)
+ {
+ OldRecordImpl[] records = new OldRecordImpl[input.readInt()];
+ for (int i = 0; i < records.length; i++)
+ {
+ records[i] = new OldRecordImpl(input.readString(), input.readLong());
+ }
+ return records;
+ }
+
+ @Override
+ public void objectToEntry(OldPreparedTransaction preparedTransaction, TupleOutput output)
+ {
+ writeRecords(preparedTransaction.getEnqueues(), output);
+ writeRecords(preparedTransaction.getDequeues(), output);
+ }
+
+ private void writeRecords(OldRecordImpl[] records, TupleOutput output)
+ {
+ if (records == null)
+ {
+ output.writeInt(0);
+ }
+ else
+ {
+ output.writeInt(records.length);
+ for (OldRecordImpl record : records)
+ {
+ output.writeString(record.getQueueName());
+ output.writeLong(record.getMessageNumber());
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeInteractionHandler.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeInteractionHandler.java
new file mode 100644
index 0000000000..0cedbd15e0
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeInteractionHandler.java
@@ -0,0 +1,37 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+public interface UpgradeInteractionHandler
+{
+ UpgradeInteractionResponse requireResponse(String question, UpgradeInteractionResponse defaultResponse,
+ UpgradeInteractionResponse... possibleResponses);
+
+ public static final UpgradeInteractionHandler DEFAULT_HANDLER = new UpgradeInteractionHandler()
+ {
+ public UpgradeInteractionResponse requireResponse(final String question,
+ final UpgradeInteractionResponse defaultResponse,
+ final UpgradeInteractionResponse... possibleResponses)
+ {
+ return defaultResponse;
+ }
+ };
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeInteractionResponse.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeInteractionResponse.java
new file mode 100644
index 0000000000..eb5a049a9a
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeInteractionResponse.java
@@ -0,0 +1,28 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+public enum UpgradeInteractionResponse
+{
+ YES,
+ NO,
+ ABORT
+}
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/Upgrader.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/Upgrader.java
new file mode 100644
index 0000000000..e71e39cbb8
--- /dev/null
+++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/Upgrader.java
@@ -0,0 +1,177 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.server.store.berkeleydb.BDBMessageStore;
+
+import com.sleepycat.bind.tuple.IntegerBinding;
+import com.sleepycat.bind.tuple.LongBinding;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+
+public class Upgrader
+{
+ static final String VERSION_DB_NAME = "DB_VERSION";
+
+ private Environment _environment;
+ private String _virtualHostName;
+
+ public Upgrader(Environment environment, String virtualHostName)
+ {
+ _environment = environment;
+ _virtualHostName = virtualHostName;
+ }
+
+ public void upgradeIfNecessary() throws AMQStoreException
+ {
+ boolean isEmpty = _environment.getDatabaseNames().isEmpty();
+ DatabaseConfig dbConfig = new DatabaseConfig();
+ dbConfig.setTransactional(true);
+ dbConfig.setAllowCreate(true);
+
+ Database versionDb = null;
+ try
+ {
+ versionDb = _environment.openDatabase(null, VERSION_DB_NAME, dbConfig);
+
+ if(versionDb.count() == 0L)
+ {
+ int sourceVersion = isEmpty ? BDBMessageStore.VERSION: identifyOldStoreVersion();
+ DatabaseEntry key = new DatabaseEntry();
+ IntegerBinding.intToEntry(sourceVersion, key);
+ DatabaseEntry value = new DatabaseEntry();
+ LongBinding.longToEntry(System.currentTimeMillis(), value);
+
+ versionDb.put(null, key, value);
+ }
+
+ int version = getSourceVersion(versionDb);
+
+ performUpgradeFromVersion(version, versionDb);
+ }
+ finally
+ {
+ if (versionDb != null)
+ {
+ versionDb.close();
+ }
+ }
+ }
+
+ int getSourceVersion(Database versionDb)
+ {
+ int version = BDBMessageStore.VERSION + 1;
+ OperationStatus result;
+
+ do
+ {
+ version--;
+ DatabaseEntry key = new DatabaseEntry();
+ IntegerBinding.intToEntry(version, key);
+ DatabaseEntry value = new DatabaseEntry();
+
+ result = versionDb.get(null, key, value, LockMode.READ_COMMITTED);
+ }
+ while(result == OperationStatus.NOTFOUND);
+ return version;
+ }
+
+ void performUpgradeFromVersion(int sourceVersion, Database versionDb)
+ throws AMQStoreException
+ {
+ while(sourceVersion != BDBMessageStore.VERSION)
+ {
+ upgrade(sourceVersion, ++sourceVersion);
+ DatabaseEntry key = new DatabaseEntry();
+ IntegerBinding.intToEntry(sourceVersion, key);
+ DatabaseEntry value = new DatabaseEntry();
+ LongBinding.longToEntry(System.currentTimeMillis(), value);
+ versionDb.put(null, key, value);
+ }
+ }
+
+ void upgrade(final int fromVersion, final int toVersion) throws AMQStoreException
+ {
+ try
+ {
+ @SuppressWarnings("unchecked")
+ Class<StoreUpgrade> upgradeClass =
+ (Class<StoreUpgrade>) Class.forName("org.apache.qpid.server.store.berkeleydb.upgrade."
+ + "UpgradeFrom"+fromVersion+"To"+toVersion);
+ Constructor<StoreUpgrade> ctr = upgradeClass.getConstructor();
+ StoreUpgrade upgrade = ctr.newInstance();
+ upgrade.performUpgrade(_environment, UpgradeInteractionHandler.DEFAULT_HANDLER, _virtualHostName);
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new AMQStoreException("Unable to upgrade BDB data store from version " + fromVersion + " to version"
+ + toVersion, e);
+ }
+ catch (NoSuchMethodException e)
+ {
+ throw new AMQStoreException("Unable to upgrade BDB data store from version " + fromVersion + " to version"
+ + toVersion, e);
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new AMQStoreException("Unable to upgrade BDB data store from version " + fromVersion + " to version"
+ + toVersion, e);
+ }
+ catch (InstantiationException e)
+ {
+ throw new AMQStoreException("Unable to upgrade BDB data store from version " + fromVersion + " to version"
+ + toVersion, e);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new AMQStoreException("Unable to upgrade BDB data store from version " + fromVersion + " to version"
+ + toVersion, e);
+ }
+ }
+
+ private int identifyOldStoreVersion() throws DatabaseException
+ {
+ int version = 0;
+ for (String databaseName : _environment.getDatabaseNames())
+ {
+ if (databaseName.contains("_v"))
+ {
+ int versionIndex = databaseName.indexOf("_v");
+ if (versionIndex == -1)
+ {
+ versionIndex = 1;
+ }
+ version = Integer.parseInt(databaseName.substring(versionIndex + 2));
+ break;
+ }
+ }
+ return version;
+ }
+}
diff --git a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreConfigurationTest.java b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreConfigurationTest.java
new file mode 100644
index 0000000000..687c671566
--- /dev/null
+++ b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreConfigurationTest.java
@@ -0,0 +1,14 @@
+package org.apache.qpid.server.store.berkeleydb;
+
+import org.apache.qpid.server.store.DurableConfigurationStoreTest;
+import org.apache.qpid.server.store.MessageStore;
+
+public class BDBMessageStoreConfigurationTest extends DurableConfigurationStoreTest
+{
+ @Override
+ protected MessageStore createStore() throws Exception
+ {
+ return new BDBMessageStore();
+ }
+
+}
diff --git a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java
index 3d30f02b42..a318187f13 100644
--- a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java
+++ b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java
@@ -20,6 +20,10 @@
*/
package org.apache.qpid.server.store.berkeleydb;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
import org.apache.qpid.AMQStoreException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.BasicContentHeaderProperties;
@@ -33,10 +37,12 @@ import org.apache.qpid.server.message.MessageMetaData;
import org.apache.qpid.server.message.MessageMetaData_0_10;
import org.apache.qpid.server.message.MessageReference;
import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.store.MessageMetaDataType;
import org.apache.qpid.server.store.MessageStore;
import org.apache.qpid.server.store.StorableMessageMetaData;
import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.store.Transaction;
import org.apache.qpid.server.store.TransactionLogResource;
import org.apache.qpid.transport.DeliveryProperties;
import org.apache.qpid.transport.Header;
@@ -47,20 +53,17 @@ import org.apache.qpid.transport.MessageDeliveryPriority;
import org.apache.qpid.transport.MessageProperties;
import org.apache.qpid.transport.MessageTransfer;
-import java.io.File;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.List;
-
/**
* Subclass of MessageStoreTest which runs the standard tests from the superclass against
* the BDB Store as well as additional tests specific to the DBB store-implementation.
*/
public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageStoreTest
{
+ private static byte[] CONTENT_BYTES = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
+
/**
- * Tests that message metadata and content are successfully read back from a
- * store after it has been reloaded. Both 0-8 and 0-10 metadata is used to
+ * Tests that message metadata and content are successfully read back from a
+ * store after it has been reloaded. Both 0-8 and 0-10 metadata is used to
* verify their ability to co-exist within the store and be successful retrieved.
*/
public void testBDBMessagePersistence() throws Exception
@@ -73,10 +76,10 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
// Split the content into 2 chunks for the 0-8 message, as per broker behaviour.
// Use a single chunk for the 0-10 message as per broker behaviour.
String bodyText = "jfhdjsflsdhfjdshfjdslhfjdslhfsjlhfsjkhfdsjkhfdsjkfhdslkjf";
-
+
ByteBuffer firstContentBytes_0_8 = ByteBuffer.wrap(bodyText.substring(0, 10).getBytes());
ByteBuffer secondContentBytes_0_8 = ByteBuffer.wrap(bodyText.substring(10).getBytes());
-
+
ByteBuffer completeContentBody_0_10 = ByteBuffer.wrap(bodyText.getBytes());
int bodySize = completeContentBody_0_10.limit();
@@ -100,12 +103,12 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
/*
* Create and insert a 0-10 message (metadata and content)
- */
+ */
MessageProperties msgProps_0_10 = createMessageProperties_0_10(bodySize);
DeliveryProperties delProps_0_10 = createDeliveryProperties_0_10();
Header header_0_10 = new Header(delProps_0_10, msgProps_0_10);
- MessageTransfer xfr_0_10 = new MessageTransfer("destination", MessageAcceptMode.EXPLICIT,
+ MessageTransfer xfr_0_10 = new MessageTransfer("destination", MessageAcceptMode.EXPLICIT,
MessageAcquireMode.PRE_ACQUIRED, header_0_10, completeContentBody_0_10);
MessageMetaData_0_10 messageMetaData_0_10 = new MessageMetaData_0_10(xfr_0_10);
@@ -120,7 +123,7 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
/*
* reload the store only (read-only)
*/
- bdbStore = reloadStoreReadOnly(bdbStore);
+ bdbStore = reloadStore(bdbStore);
/*
* Read back and validate the 0-8 message metadata and content
@@ -190,14 +193,14 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
private DeliveryProperties createDeliveryProperties_0_10()
{
DeliveryProperties delProps_0_10 = new DeliveryProperties();
-
+
delProps_0_10.setDeliveryMode(MessageDeliveryMode.PERSISTENT);
delProps_0_10.setImmediate(true);
delProps_0_10.setExchange("exchange12345");
delProps_0_10.setRoutingKey("routingKey12345");
delProps_0_10.setExpiration(5);
delProps_0_10.setPriority(MessageDeliveryPriority.ABOVE_AVERAGE);
-
+
return delProps_0_10;
}
@@ -207,24 +210,24 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
msgProps_0_10.setContentLength(bodySize);
msgProps_0_10.setCorrelationId("qwerty".getBytes());
msgProps_0_10.setContentType("text/html");
-
+
return msgProps_0_10;
}
- /**
+ /**
* Close the provided store and create a new (read-only) store to read back the data.
- *
- * Use this method instead of reloading the virtual host like other tests in order
+ *
+ * Use this method instead of reloading the virtual host like other tests in order
* to avoid the recovery handler deleting the message for not being on a queue.
*/
- private BDBMessageStore reloadStoreReadOnly(BDBMessageStore messageStore) throws Exception
+ private BDBMessageStore reloadStore(BDBMessageStore messageStore) throws Exception
{
messageStore.close();
- File storePath = new File(String.valueOf(_config.getProperty("store.environment-path")));
BDBMessageStore newStore = new BDBMessageStore();
- newStore.configure(storePath, false);
- newStore.start();
+ newStore.configure("", _config.subset("store"));
+
+ newStore.startWithNoRecover();
return newStore;
}
@@ -275,7 +278,61 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
props.getHeaders().setString("Test", "MST");
return props;
}
-
+
+ public void testGetContentWithOffset() throws Exception
+ {
+ MessageStore store = getVirtualHost().getMessageStore();
+ BDBMessageStore bdbStore = assertBDBStore(store);
+ StoredMessage<MessageMetaData> storedMessage_0_8 = createAndStoreSingleChunkMessage_0_8(store);
+ long messageid_0_8 = storedMessage_0_8.getMessageNumber();
+
+ // normal case: offset is 0
+ ByteBuffer dst = ByteBuffer.allocate(10);
+ int length = bdbStore.getContent(messageid_0_8, 0, dst);
+ assertEquals("Unexpected length", CONTENT_BYTES.length, length);
+ byte[] array = dst.array();
+ assertTrue("Unexpected content", Arrays.equals(CONTENT_BYTES, array));
+
+ // offset is in the middle
+ dst = ByteBuffer.allocate(10);
+ length = bdbStore.getContent(messageid_0_8, 5, dst);
+ assertEquals("Unexpected length", 5, length);
+ array = dst.array();
+ byte[] expected = new byte[10];
+ System.arraycopy(CONTENT_BYTES, 5, expected, 0, 5);
+ assertTrue("Unexpected content", Arrays.equals(expected, array));
+
+ // offset beyond the content length
+ dst = ByteBuffer.allocate(10);
+ try
+ {
+ bdbStore.getContent(messageid_0_8, 15, dst);
+ fail("Should fail for the offset greater than message size");
+ }
+ catch (RuntimeException e)
+ {
+ assertEquals("Unexpected exception message", "Offset 15 is greater than message size 10 for message id "
+ + messageid_0_8 + "!", e.getMessage());
+ }
+
+ // buffer is smaller then message size
+ dst = ByteBuffer.allocate(5);
+ length = bdbStore.getContent(messageid_0_8, 0, dst);
+ assertEquals("Unexpected length", 5, length);
+ array = dst.array();
+ expected = new byte[5];
+ System.arraycopy(CONTENT_BYTES, 0, expected, 0, 5);
+ assertTrue("Unexpected content", Arrays.equals(expected, array));
+
+ // buffer is smaller then message size, offset is not 0
+ dst = ByteBuffer.allocate(5);
+ length = bdbStore.getContent(messageid_0_8, 2, dst);
+ assertEquals("Unexpected length", 5, length);
+ array = dst.array();
+ expected = new byte[5];
+ System.arraycopy(CONTENT_BYTES, 2, expected, 0, 5);
+ assertTrue("Unexpected content", Arrays.equals(expected, array));
+ }
/**
* Tests that messages which are added to the store and then removed using the
* public MessageStore interfaces are actually removed from the store by then
@@ -287,11 +344,10 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
MessageStore store = getVirtualHost().getMessageStore();
BDBMessageStore bdbStore = assertBDBStore(store);
- StoredMessage<MessageMetaData> storedMessage_0_8 = createAndStoreMultiChunkMessage_0_8(store);
+ StoredMessage<MessageMetaData> storedMessage_0_8 = createAndStoreSingleChunkMessage_0_8(store);
long messageid_0_8 = storedMessage_0_8.getMessageNumber();
-
- //remove the message in the fashion the broker normally would
- storedMessage_0_8.remove();
+
+ bdbStore.removeMessage(messageid_0_8, true);
//verify the removal using the BDB store implementation methods directly
try
@@ -308,29 +364,22 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
//expecting no content, allocate a 1 byte
ByteBuffer dst = ByteBuffer.allocate(1);
- assertEquals("Retrieved content when none was expected",
+ assertEquals("Retrieved content when none was expected",
0, bdbStore.getContent(messageid_0_8, 0, dst));
}
-
- private BDBMessageStore assertBDBStore(Object store)
+ private BDBMessageStore assertBDBStore(MessageStore store)
{
- if(!(store instanceof BDBMessageStore))
- {
- fail("Test requires an instance of BDBMessageStore to proceed");
- }
+
+ assertEquals("Test requires an instance of BDBMessageStore to proceed", BDBMessageStore.class, store.getClass());
return (BDBMessageStore) store;
}
- private StoredMessage<MessageMetaData> createAndStoreMultiChunkMessage_0_8(MessageStore store)
+ private StoredMessage<MessageMetaData> createAndStoreSingleChunkMessage_0_8(MessageStore store)
{
- byte[] body10Bytes = "0123456789".getBytes();
- byte[] body5Bytes = "01234".getBytes();
-
- ByteBuffer chunk1 = ByteBuffer.wrap(body10Bytes);
- ByteBuffer chunk2 = ByteBuffer.wrap(body5Bytes);
+ ByteBuffer chunk1 = ByteBuffer.wrap(CONTENT_BYTES);
- int bodySize = body10Bytes.length + body5Bytes.length;
+ int bodySize = CONTENT_BYTES.length;
//create and store the message using the MessageStore interface
MessagePublishInfo pubInfoBody_0_8 = createPublishInfoBody_0_8();
@@ -342,7 +391,6 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
StoredMessage<MessageMetaData> storedMessage_0_8 = store.addMessage(messageMetaData_0_8);
storedMessage_0_8.addContent(0, chunk1);
- storedMessage_0_8.addContent(chunk1.limit(), chunk2);
storedMessage_0_8.flushToStore();
return storedMessage_0_8;
@@ -359,36 +407,36 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
BDBMessageStore bdbStore = assertBDBStore(log);
- final AMQShortString mockQueueName = new AMQShortString("queueName");
-
+ final UUID mockQueueId = UUIDGenerator.generateUUID();
TransactionLogResource mockQueue = new TransactionLogResource()
{
- public String getResourceName()
+ @Override
+ public UUID getId()
{
- return mockQueueName.asString();
+ return mockQueueId;
}
};
-
- MessageStore.Transaction txn = log.newTransaction();
-
+
+ Transaction txn = log.newTransaction();
+
txn.enqueueMessage(mockQueue, new MockMessage(1L));
txn.enqueueMessage(mockQueue, new MockMessage(5L));
txn.commitTran();
- List<Long> enqueuedIds = bdbStore.getEnqueuedMessages(mockQueueName);
-
+ List<Long> enqueuedIds = bdbStore.getEnqueuedMessages(mockQueueId);
+
assertEquals("Number of enqueued messages is incorrect", 2, enqueuedIds.size());
Long val = enqueuedIds.get(0);
assertEquals("First Message is incorrect", 1L, val.longValue());
val = enqueuedIds.get(1);
assertEquals("Second Message is incorrect", 5L, val.longValue());
}
-
-
+
+
/**
- * Tests transaction rollback before a commit has occurred by utilising the
- * enqueue and dequeue methods available in the TransactionLog interface
- * implemented by the store, and verifying the behaviour using BDB
+ * Tests transaction rollback before a commit has occurred by utilising the
+ * enqueue and dequeue methods available in the TransactionLog interface
+ * implemented by the store, and verifying the behaviour using BDB
* implementation methods.
*/
public void testTranRollbackBeforeCommit() throws Exception
@@ -397,39 +445,39 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
BDBMessageStore bdbStore = assertBDBStore(log);
- final AMQShortString mockQueueName = new AMQShortString("queueName");
-
+ final UUID mockQueueId = UUIDGenerator.generateUUID();
TransactionLogResource mockQueue = new TransactionLogResource()
{
- public String getResourceName()
+ @Override
+ public UUID getId()
{
- return mockQueueName.asString();
+ return mockQueueId;
}
};
-
- MessageStore.Transaction txn = log.newTransaction();
-
+
+ Transaction txn = log.newTransaction();
+
txn.enqueueMessage(mockQueue, new MockMessage(21L));
txn.abortTran();
-
+
txn = log.newTransaction();
txn.enqueueMessage(mockQueue, new MockMessage(22L));
txn.enqueueMessage(mockQueue, new MockMessage(23L));
txn.commitTran();
- List<Long> enqueuedIds = bdbStore.getEnqueuedMessages(mockQueueName);
-
+ List<Long> enqueuedIds = bdbStore.getEnqueuedMessages(mockQueueId);
+
assertEquals("Number of enqueued messages is incorrect", 2, enqueuedIds.size());
Long val = enqueuedIds.get(0);
assertEquals("First Message is incorrect", 22L, val.longValue());
val = enqueuedIds.get(1);
assertEquals("Second Message is incorrect", 23L, val.longValue());
}
-
+
/**
- * Tests transaction rollback after a commit has occurred by utilising the
- * enqueue and dequeue methods available in the TransactionLog interface
- * implemented by the store, and verifying the behaviour using BDB
+ * Tests transaction rollback after a commit has occurred by utilising the
+ * enqueue and dequeue methods available in the TransactionLog interface
+ * implemented by the store, and verifying the behaviour using BDB
* implementation methods.
*/
public void testTranRollbackAfterCommit() throws Exception
@@ -438,31 +486,31 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
BDBMessageStore bdbStore = assertBDBStore(log);
- final AMQShortString mockQueueName = new AMQShortString("queueName");
-
+ final UUID mockQueueId = UUIDGenerator.generateUUID();
TransactionLogResource mockQueue = new TransactionLogResource()
{
- public String getResourceName()
+ @Override
+ public UUID getId()
{
- return mockQueueName.asString();
+ return mockQueueId;
}
};
-
- MessageStore.Transaction txn = log.newTransaction();
-
+
+ Transaction txn = log.newTransaction();
+
txn.enqueueMessage(mockQueue, new MockMessage(30L));
txn.commitTran();
txn = log.newTransaction();
txn.enqueueMessage(mockQueue, new MockMessage(31L));
txn.abortTran();
-
+
txn = log.newTransaction();
txn.enqueueMessage(mockQueue, new MockMessage(32L));
txn.commitTran();
-
- List<Long> enqueuedIds = bdbStore.getEnqueuedMessages(mockQueueName);
-
+
+ List<Long> enqueuedIds = bdbStore.getEnqueuedMessages(mockQueueId);
+
assertEquals("Number of enqueued messages is incorrect", 2, enqueuedIds.size());
Long val = enqueuedIds.get(0);
assertEquals("First Message is incorrect", 30L, val.longValue());
@@ -470,6 +518,7 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
assertEquals("Second Message is incorrect", 32L, val.longValue());
}
+ @SuppressWarnings("rawtypes")
private static class MockMessage implements ServerMessage, EnqueableMessage
{
private long _messageId;
diff --git a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBStoreUpgradeTestPreparer.java b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBStoreUpgradeTestPreparer.java
index bcbb7d8b72..122f846a2d 100644
--- a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBStoreUpgradeTestPreparer.java
+++ b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBStoreUpgradeTestPreparer.java
@@ -20,19 +20,36 @@
*/
package org.apache.qpid.server.store.berkeleydb;
+import javax.jms.Connection;
+import javax.jms.DeliveryMode;
+import javax.jms.Destination;
+import javax.jms.ExceptionListener;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.Topic;
+import javax.jms.TopicConnection;
+import javax.jms.TopicPublisher;
+import javax.jms.TopicSession;
+import javax.jms.TopicSubscriber;
+
import org.apache.qpid.client.AMQConnectionFactory;
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.client.AMQSession;
+import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.url.URLSyntaxException;
-import javax.jms.*;
-
/**
- * Prepares an older version brokers BDB store with the required
+ * Prepares an older version brokers BDB store with the required
* contents for use in the BDBStoreUpgradeTest.
*
* NOTE: Must be used with the equivalent older version client!
*
- * The store will then be used to verify that the upgraded is
- * completed properly and that once upgraded it functions as
+ * The store will then be used to verify that the upgraded is
+ * completed properly and that once upgraded it functions as
* expected with the new broker.
*
*/
@@ -43,9 +60,10 @@ public class BDBStoreUpgradeTestPreparer
public static final String SELECTOR_SUB_NAME="mySelectorDurSubName";
public static final String SELECTOR_TOPIC_NAME="mySelectorUpgradeTopic";
public static final String QUEUE_NAME="myUpgradeQueue";
+ public static final String NON_DURABLE_QUEUE_NAME="queue-non-durable";
private static AMQConnectionFactory _connFac;
- private static final String CONN_URL =
+ private static final String CONN_URL =
"amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'";
/**
@@ -59,14 +77,28 @@ public class BDBStoreUpgradeTestPreparer
private void prepareBroker() throws Exception
{
prepareQueues();
+ prepareNonDurableQueue();
prepareDurableSubscriptionWithSelector();
prepareDurableSubscriptionWithoutSelector();
}
+ private void prepareNonDurableQueue() throws Exception
+ {
+ Connection connection = _connFac.createConnection();
+ AMQSession<?, ?> session = (AMQSession<?,?>)connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ AMQShortString queueName = AMQShortString.valueOf(NON_DURABLE_QUEUE_NAME);
+ AMQDestination destination = (AMQDestination) session.createQueue(NON_DURABLE_QUEUE_NAME);
+ session.sendCreateQueue(queueName, false, false, false, null);
+ session.bindQueue(queueName, queueName, null, AMQShortString.valueOf("amq.direct"), destination);
+ MessageProducer messageProducer = session.createProducer(destination);
+ sendMessages(session, messageProducer, destination, DeliveryMode.PERSISTENT, 1024, 3);
+ connection.close();
+ }
+
/**
* Prepare a queue for use in testing message and binding recovery
* after the upgrade is performed.
- *
+ *
* - Create a transacted session on the connection.
* - Use a consumer to create the (durable by default) queue.
* - Send 5 large messages to test (multi-frame) content recovery.
@@ -74,7 +106,7 @@ public class BDBStoreUpgradeTestPreparer
* - Commit the session.
* - Send 5 small messages to test that uncommitted messages are not recovered.
* following the upgrade.
- * - Close the session.
+ * - Close the session.
*/
private void prepareQueues() throws Exception
{
@@ -114,9 +146,9 @@ public class BDBStoreUpgradeTestPreparer
}
/**
- * Prepare a DurableSubscription backing queue for use in testing selector
+ * Prepare a DurableSubscription backing queue for use in testing selector
* recovery and queue exclusivity marking during the upgrade process.
- *
+ *
* - Create a transacted session on the connection.
* - Open and close a DurableSubscription with selector to create the backing queue.
* - Send a message which matches the selector.
@@ -145,7 +177,7 @@ public class BDBStoreUpgradeTestPreparer
TopicSubscriber durSub1 = session.createDurableSubscriber(topic, SELECTOR_SUB_NAME,"testprop='true'", false);
durSub1.close();
- // Create a publisher and send a persistent message which matches the selector
+ // Create a publisher and send a persistent message which matches the selector
// followed by one that does not match, and another which matches but is not
// committed and so should be 'lost'
TopicSession pubSession = connection.createTopicSession(true, Session.SESSION_TRANSACTED);
@@ -202,7 +234,7 @@ public class BDBStoreUpgradeTestPreparer
connection.close();
}
- public static void sendMessages(Session session, MessageProducer messageProducer,
+ public static void sendMessages(Session session, MessageProducer messageProducer,
Destination dest, int deliveryMode, int length, int numMesages) throws JMSException
{
for (int i = 1; i <= numMesages; i++)
@@ -213,7 +245,7 @@ public class BDBStoreUpgradeTestPreparer
}
}
- public static void publishMessages(Session session, TopicPublisher publisher,
+ public static void publishMessages(Session session, TopicPublisher publisher,
Destination dest, int deliveryMode, int length, int numMesages, String selectorProperty) throws JMSException
{
for (int i = 1; i <= numMesages; i++)
@@ -227,8 +259,8 @@ public class BDBStoreUpgradeTestPreparer
/**
* Generates a string of a given length consisting of the sequence 0,1,2,..,9,0,1,2.
- *
- * @param length number of characters in the string
+ *
+ * @param length number of characters in the string
* @return string sequence of the given length
*/
public static String generateString(int length)
@@ -248,6 +280,7 @@ public class BDBStoreUpgradeTestPreparer
*/
public static void main(String[] args) throws Exception
{
+ System.setProperty("qpid.dest_syntax", "BURL");
BDBStoreUpgradeTestPreparer producer = new BDBStoreUpgradeTestPreparer();
producer.prepareBroker();
}
diff --git a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBUpgradeTest.java b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBUpgradeTest.java
index 55327e3b56..4e201d5473 100644
--- a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBUpgradeTest.java
+++ b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBUpgradeTest.java
@@ -20,36 +20,15 @@
*/
package org.apache.qpid.server.store.berkeleydb;
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.je.DatabaseEntry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.BasicContentHeaderProperties;
-import org.apache.qpid.framing.ContentHeaderBody;
-import org.apache.qpid.framing.MethodRegistry;
-import org.apache.qpid.framing.ProtocolVersion;
-import org.apache.qpid.framing.abstraction.MessagePublishInfo;
-import org.apache.qpid.framing.abstraction.MessagePublishInfoImpl;
-import org.apache.qpid.management.common.mbeans.ManagedQueue;
-import org.apache.qpid.server.message.EnqueableMessage;
-import org.apache.qpid.server.message.MessageMetaData;
-import org.apache.qpid.server.store.MessageStore;
-import org.apache.qpid.server.store.StoredMessage;
-import org.apache.qpid.server.store.TransactionLogResource;
-import org.apache.qpid.server.store.berkeleydb.keys.MessageContentKey_4;
-import org.apache.qpid.server.store.berkeleydb.tuples.MessageContentKeyTupleBindingFactory;
-import org.apache.qpid.server.store.berkeleydb.tuples.MessageMetaDataTupleBindingFactory;
-import org.apache.qpid.test.utils.JMXTestUtils;
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-import org.apache.qpid.util.FileUtils;
+import static org.apache.qpid.server.store.berkeleydb.BDBStoreUpgradeTestPreparer.NON_DURABLE_QUEUE_NAME;
import static org.apache.qpid.server.store.berkeleydb.BDBStoreUpgradeTestPreparer.QUEUE_NAME;
-import static org.apache.qpid.server.store.berkeleydb.BDBStoreUpgradeTestPreparer.SUB_NAME;
-import static org.apache.qpid.server.store.berkeleydb.BDBStoreUpgradeTestPreparer.TOPIC_NAME;
import static org.apache.qpid.server.store.berkeleydb.BDBStoreUpgradeTestPreparer.SELECTOR_SUB_NAME;
import static org.apache.qpid.server.store.berkeleydb.BDBStoreUpgradeTestPreparer.SELECTOR_TOPIC_NAME;
+import static org.apache.qpid.server.store.berkeleydb.BDBStoreUpgradeTestPreparer.SUB_NAME;
+import static org.apache.qpid.server.store.berkeleydb.BDBStoreUpgradeTestPreparer.TOPIC_NAME;
+
+import java.io.File;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
@@ -64,18 +43,18 @@ import javax.jms.TopicConnection;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
+
+import org.apache.qpid.management.common.mbeans.ManagedQueue;
+import org.apache.qpid.test.utils.JMXTestUtils;
+import org.apache.qpid.test.utils.QpidBrokerTestCase;
+import org.apache.qpid.util.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
- * Tests upgrading a BDB store and using it with the new broker
- * after the required contents are entered into the store using
- * an old broker with the BDBStoreUpgradeTestPreparer. The store
- * will then be used to verify that the upgraded is completed
- * properly and that once upgraded it functions as expected with
- * the new broker.
+ * Tests upgrading a BDB store on broker startup.
+ * The store will then be used to verify that the upgrade is completed
+ * properly and that once upgraded it functions as expected.
*/
public class BDBUpgradeTest extends QpidBrokerTestCase
{
@@ -84,43 +63,31 @@ public class BDBUpgradeTest extends QpidBrokerTestCase
private static final String STRING_1024 = BDBStoreUpgradeTestPreparer.generateString(1024);
private static final String STRING_1024_256 = BDBStoreUpgradeTestPreparer.generateString(1024*256);
private static final String QPID_WORK_ORIG = System.getProperty("QPID_WORK");
- private static final String QPID_HOME = System.getProperty("QPID_HOME");
- private static final int VERSION_4 = 4;
- private String _fromDir;
- private String _toDir;
- private String _toDirTwice;
+ private String _storeLocation;
@Override
public void setUp() throws Exception
{
assertNotNull("QPID_WORK must be set", QPID_WORK_ORIG);
- assertNotNull("QPID_HOME must be set", QPID_HOME);
-
- _fromDir = QPID_HOME + "/bdbstore-to-upgrade/test-store";
- _toDir = getWorkDirBaseDir() + "/bdbstore/test-store";
- _toDirTwice = getWorkDirBaseDir() + "/bdbstore-upgraded-twice";
+ _storeLocation = getWorkDirBaseDir() + "/bdbstore/test-store";
//Clear the two target directories if they exist.
- File directory = new File(_toDir);
- if (directory.exists() && directory.isDirectory())
- {
- FileUtils.delete(directory, true);
- }
- directory = new File(_toDirTwice);
+ File directory = new File(_storeLocation);
if (directory.exists() && directory.isDirectory())
{
FileUtils.delete(directory, true);
}
- //Upgrade the test store.
- upgradeBrokerStore(_fromDir, _toDir);
+ // copy store files
+ String src = getClass().getClassLoader().getResource("upgrade/bdbstore-v4/test-store").toURI().getPath();
+ FileUtils.copyRecursive(new File(src), new File(_storeLocation));
//override the broker config used and then start the broker with the updated store
_configFile = new File("build/etc/config-systests-bdb.xml");
setConfigurationProperty("management.enabled", "true");
- super.setUp();
+ super.setUp();
}
private String getWorkDirBaseDir()
@@ -129,31 +96,6 @@ public class BDBUpgradeTest extends QpidBrokerTestCase
}
/**
- * Tests that the core upgrade method of the store upgrade tool passes through the exception
- * from the BDBMessageStore indicating that the data on disk can't be loaded as the previous
- * version because it has already been upgraded.
- * @throws Exception
- */
- public void testMultipleUpgrades() throws Exception
- {
- //stop the broker started by setUp() in order to allow the second upgrade attempt to proceed
- stopBroker();
-
- try
- {
- new BDBStoreUpgrade(_toDir, _toDirTwice, null, false, true).upgradeFromVersion(VERSION_4);
- fail("Second Upgrade Succeeded");
- }
- catch (Exception e)
- {
- System.err.println("Showing stack trace, we are expecting an 'Unable to load BDBStore' error");
- e.printStackTrace();
- assertTrue("Incorrect Exception Thrown:" + e.getMessage(),
- e.getMessage().contains("Unable to load BDBStore as version 4. Store on disk contains version 5 data"));
- }
- }
-
- /**
* Test that the selector applied to the DurableSubscription was successfully
* transfered to the new store, and functions as expected with continued use
* by monitoring message count while sending new messages to the topic and then
@@ -175,26 +117,26 @@ public class BDBUpgradeTest extends QpidBrokerTestCase
try
{
ManagedQueue dursubQueue = jmxUtils.getManagedQueue("clientid" + ":" + SELECTOR_SUB_NAME);
- assertEquals("DurableSubscription backing queue should have 1 message on it initially",
+ assertEquals("DurableSubscription backing queue should have 1 message on it initially",
new Integer(1), dursubQueue.getMessageCount());
-
+
// Create a connection and start it
TopicConnection connection = (TopicConnection) getConnection();
connection.start();
-
+
// Send messages which don't match and do match the selector, checking message count
- TopicSession pubSession = connection.createTopicSession(true, org.apache.qpid.jms.Session.SESSION_TRANSACTED);
+ TopicSession pubSession = connection.createTopicSession(true, Session.SESSION_TRANSACTED);
Topic topic = pubSession.createTopic(SELECTOR_TOPIC_NAME);
TopicPublisher publisher = pubSession.createPublisher(topic);
-
+
BDBStoreUpgradeTestPreparer.publishMessages(pubSession, publisher, topic, DeliveryMode.PERSISTENT, 1*1024, 1, "false");
pubSession.commit();
- assertEquals("DurableSubscription backing queue should still have 1 message on it",
+ assertEquals("DurableSubscription backing queue should still have 1 message on it",
Integer.valueOf(1), dursubQueue.getMessageCount());
-
+
BDBStoreUpgradeTestPreparer.publishMessages(pubSession, publisher, topic, DeliveryMode.PERSISTENT, 1*1024, 1, "true");
pubSession.commit();
- assertEquals("DurableSubscription backing queue should now have 2 messages on it",
+ assertEquals("DurableSubscription backing queue should now have 2 messages on it",
Integer.valueOf(2), dursubQueue.getMessageCount());
TopicSubscriber durSub = pubSession.createDurableSubscriber(topic, SELECTOR_SUB_NAME,"testprop='true'", false);
@@ -240,7 +182,7 @@ public class BDBUpgradeTest extends QpidBrokerTestCase
connection.start();
// Send new message matching the topic, checking message count
- TopicSession session = connection.createTopicSession(true, org.apache.qpid.jms.Session.SESSION_TRANSACTED);
+ TopicSession session = connection.createTopicSession(true, Session.SESSION_TRANSACTED);
Topic topic = session.createTopic(TOPIC_NAME);
TopicPublisher publisher = session.createPublisher(topic);
@@ -298,10 +240,10 @@ public class BDBUpgradeTest extends QpidBrokerTestCase
/**
* Test that the upgraded queue continues to function properly when used
- * for persistent messaging and restarting the broker.
- *
+ * for persistent messaging and restarting the broker.
+ *
* Sends the new messages to the queue BEFORE consuming those which were
- * sent before the upgrade. In doing so, this also serves to test that
+ * sent before the upgrade. In doing so, this also serves to test that
* the queue bindings were successfully transitioned during the upgrade.
*/
public void testBindingAndMessageDurabability() throws Exception
@@ -329,7 +271,7 @@ public class BDBUpgradeTest extends QpidBrokerTestCase
}
/**
- * Test that all of the committed persistent messages previously sent to
+ * Test that all of the committed persistent messages previously sent to
* the broker are properly received following update of the MetaData and
* Content entries during the store upgrade process.
*/
@@ -349,200 +291,22 @@ public class BDBUpgradeTest extends QpidBrokerTestCase
*
* @throws Exception
*/
- public void testMigrationOfMessagesForNonExistingQueues() throws Exception
+ public void testMigrationOfMessagesForNonDurableQueues() throws Exception
{
- stopBroker();
-
- // copy store data into a new location for adding of phantom message
- File storeLocation = new File(_fromDir);
- File target = new File(_toDirTwice);
- if (!target.exists())
- {
- target.mkdirs();
- }
- FileUtils.copyRecursive(storeLocation, target);
-
- // delete migrated data
- File directory = new File(_toDir);
- if (directory.exists() && directory.isDirectory())
- {
- FileUtils.delete(directory, true);
- }
-
- // test data
- String nonExistingQueueName = getTestQueueName();
- String messageText = "Test Phantom Message";
-
- // add message
- addMessageForNonExistingQueue(target, VERSION_4, nonExistingQueueName, messageText);
-
- String[] inputs = { "Yes", "Yes", "Yes" };
- upgradeBrokerStoreInInterractiveMode(_toDirTwice, _toDir, inputs);
-
- // start broker
- startBroker();
-
// Create a connection and start it
Connection connection = getConnection();
connection.start();
// consume a message for non-existing store
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- Queue queue = session.createQueue(nonExistingQueueName);
+ Queue queue = session.createQueue(NON_DURABLE_QUEUE_NAME);
MessageConsumer messageConsumer = session.createConsumer(queue);
- Message message = messageConsumer.receive(1000);
-
- // assert consumed message
- assertNotNull("Message was not migrated!", message);
- assertTrue("Unexpected message received!", message instanceof TextMessage);
- String text = ((TextMessage) message).getText();
- assertEquals("Message migration failed!", messageText, text);
- }
- /**
- * An utility method to upgrade broker with simulation user interactions
- *
- * @param fromDir
- * location of the store to migrate
- * @param toDir
- * location of where migrated data will be stored
- * @param inputs
- * user answers on upgrade tool questions
- * @throws Exception
- */
- private void upgradeBrokerStoreInInterractiveMode(String fromDir, String toDir, final String[] inputs)
- throws Exception
- {
- // save to restore system.in after data migration
- InputStream stdin = System.in;
-
- // set fake system in to simulate user interactions
- // FIXME: it is a quite dirty simulator of system input but it does the job
- System.setIn(new InputStream()
+ for (int i = 0; i < 3; i++)
{
-
- private int counter = 0;
-
- public synchronized int read(byte b[], int off, int len)
- {
- byte[] src = (inputs[counter] + "\n").getBytes();
- System.arraycopy(src, 0, b, off, src.length);
- counter++;
- return src.length;
- }
-
- @Override
- public int read() throws IOException
- {
- return -1;
- }
- });
-
- try
- {
- // Upgrade the test store.
- new BDBStoreUpgrade(fromDir, toDir, null, true, true).upgradeFromVersion(VERSION_4);
- }
- finally
- {
- // restore system in
- System.setIn(stdin);
- }
- }
-
- @SuppressWarnings("unchecked")
- private void addMessageForNonExistingQueue(File storeLocation, int storeVersion, String nonExistingQueueName,
- String messageText) throws Exception
- {
- final AMQShortString queueName = new AMQShortString(nonExistingQueueName);
- BDBMessageStore store = new BDBMessageStore(storeVersion);
- store.configure(storeLocation, false);
- try
- {
- store.start();
-
- // store message objects
- ByteBuffer completeContentBody = ByteBuffer.wrap(messageText.getBytes("UTF-8"));
- long bodySize = completeContentBody.limit();
- MessagePublishInfo pubInfoBody = new MessagePublishInfoImpl(new AMQShortString("amq.direct"), false,
- false, queueName);
- BasicContentHeaderProperties props = new BasicContentHeaderProperties();
- props.setDeliveryMode(Integer.valueOf(BasicContentHeaderProperties.PERSISTENT).byteValue());
- props.setContentType("text/plain");
- props.setType("text/plain");
- props.setMessageId("whatever");
- props.setEncoding("UTF-8");
- props.getHeaders().setString("Test", "MST");
- MethodRegistry methodRegistry = MethodRegistry.getMethodRegistry(ProtocolVersion.v0_9);
- int classForBasic = methodRegistry.createBasicQosOkBody().getClazz();
- ContentHeaderBody contentHeaderBody = new ContentHeaderBody(classForBasic, 1, props, bodySize);
-
- // add content entry to database
- final long messageId = store.getNewMessageId();
- TupleBinding<MessageContentKey> contentKeyTB = new MessageContentKeyTupleBindingFactory(storeVersion).getInstance();
- MessageContentKey contentKey = null;
- if (storeVersion == VERSION_4)
- {
- contentKey = new MessageContentKey_4(messageId, 0);
- }
- else
- {
- throw new Exception(storeVersion + " is not supported");
- }
- DatabaseEntry key = new DatabaseEntry();
- contentKeyTB.objectToEntry(contentKey, key);
- DatabaseEntry data = new DatabaseEntry();
- ContentTB contentTB = new ContentTB();
- contentTB.objectToEntry(completeContentBody, data);
- store.getContentDb().put(null, key, data);
-
- // add meta data entry to database
- TupleBinding<Long> longTB = TupleBinding.getPrimitiveBinding(Long.class);
- TupleBinding<Object> metaDataTB = new MessageMetaDataTupleBindingFactory(storeVersion).getInstance();
- key = new DatabaseEntry();
- data = new DatabaseEntry();
- longTB.objectToEntry(new Long(messageId), key);
- MessageMetaData metaData = new MessageMetaData(pubInfoBody, contentHeaderBody, 1);
- metaDataTB.objectToEntry(metaData, data);
- store.getMetaDataDb().put(null, key, data);
-
- // add delivery entry to database
- TransactionLogResource mockQueue = new TransactionLogResource()
- {
- public String getResourceName()
- {
- return queueName.asString();
- }
- };
-
- EnqueableMessage mockMessage = new EnqueableMessage()
- {
-
- public long getMessageNumber()
- {
- return messageId;
- }
-
- public boolean isPersistent()
- {
- return true;
- }
-
- public StoredMessage getStoredMessage()
- {
- return null;
- }
- };
-
- MessageStore log = (MessageStore) store;
- MessageStore.Transaction txn = log.newTransaction();
- txn.enqueueMessage(mockQueue, mockMessage);
- txn.commitTran();
- }
- finally
- {
- // close store
- store.close();
+ Message message = messageConsumer.receive(1000);
+ assertNotNull("Message was not migrated!", message);
+ assertTrue("Unexpected message received!", message instanceof TextMessage);
}
}
@@ -564,7 +328,7 @@ public class BDBUpgradeTest extends QpidBrokerTestCase
}
- // Retrieve the matching message
+ // Retrieve the matching message
Message m = durSub.receive(2000);
assertNotNull("Failed to receive an expected message", m);
if(selector)
@@ -623,8 +387,4 @@ public class BDBUpgradeTest extends QpidBrokerTestCase
session.close();
}
- private void upgradeBrokerStore(String fromDir, String toDir) throws Exception
- {
- new BDBStoreUpgrade(_fromDir, _toDir, null, false, true).upgradeFromVersion(VERSION_4);
- }
}
diff --git a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBindingTest.java b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBindingTest.java
new file mode 100644
index 0000000000..f8aeb7f7b0
--- /dev/null
+++ b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBindingTest.java
@@ -0,0 +1,61 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.tuple;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.server.model.UUIDGenerator;
+import org.apache.qpid.server.store.ConfiguredObjectRecord;
+
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+
+public class ConfiguredObjectBindingTest extends TestCase
+{
+
+ private ConfiguredObjectRecord _object;
+
+ private static final String DUMMY_ATTRIBUTES_STRING = "dummyAttributes";
+ private static final String DUMMY_TYPE_STRING = "dummyType";
+ private ConfiguredObjectBinding _configuredObjectBinding;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _configuredObjectBinding = ConfiguredObjectBinding.getInstance();
+ _object = new ConfiguredObjectRecord(UUIDGenerator.generateUUID(), DUMMY_TYPE_STRING, DUMMY_ATTRIBUTES_STRING);
+ }
+
+ public void testObjectToEntryAndEntryToObject()
+ {
+ TupleOutput tupleOutput = new TupleOutput();
+
+ _configuredObjectBinding.objectToEntry(_object, tupleOutput);
+
+ byte[] entryAsBytes = tupleOutput.getBufferBytes();
+ TupleInput tupleInput = new TupleInput(entryAsBytes);
+
+ ConfiguredObjectRecord storedObject = _configuredObjectBinding.entryToObject(tupleInput);
+ assertEquals("Unexpected attributes", DUMMY_ATTRIBUTES_STRING, storedObject.getAttributes());
+ assertEquals("Unexpected type", DUMMY_TYPE_STRING, storedObject.getType());
+ }
+}
diff --git a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractUpgradeTestCase.java b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractUpgradeTestCase.java
new file mode 100644
index 0000000000..36991b90d0
--- /dev/null
+++ b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractUpgradeTestCase.java
@@ -0,0 +1,153 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import java.io.File;
+
+import org.apache.qpid.server.logging.LogSubject;
+import org.apache.qpid.server.logging.subjects.TestBlankSubject;
+import org.apache.qpid.test.utils.QpidTestCase;
+import org.apache.qpid.util.FileUtils;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+import com.sleepycat.je.Transaction;
+
+public abstract class AbstractUpgradeTestCase extends QpidTestCase
+{
+ protected static final class StaticAnswerHandler implements UpgradeInteractionHandler
+ {
+ private UpgradeInteractionResponse _response;
+
+ public StaticAnswerHandler(UpgradeInteractionResponse response)
+ {
+ _response = response;
+ }
+
+ @Override
+ public UpgradeInteractionResponse requireResponse(String question, UpgradeInteractionResponse defaultResponse,
+ UpgradeInteractionResponse... possibleResponses)
+ {
+ return _response;
+ }
+ }
+
+ public static final String[] QUEUE_NAMES = { "clientid:myDurSubName", "clientid:mySelectorDurSubName", "myUpgradeQueue",
+ "queue-non-durable" };
+ public static int[] QUEUE_SIZES = { 1, 1, 10, 3 };
+ public static int TOTAL_MESSAGE_NUMBER = 15;
+ protected static final LogSubject LOG_SUBJECT = new TestBlankSubject();
+
+ // one binding per exchange
+ protected static final int TOTAL_BINDINGS = QUEUE_NAMES.length * 2;
+ protected static final int TOTAL_EXCHANGES = 5;
+
+ private File _storeLocation;
+ protected Environment _environment;
+
+ @Override
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _storeLocation = copyStore(getStoreDirectoryName());
+
+ _environment = createEnvironment(_storeLocation);
+ }
+
+ /** @return eg "bdbstore-v4" - used for copying store */
+ protected abstract String getStoreDirectoryName();
+
+ protected Environment createEnvironment(File storeLocation)
+ {
+ EnvironmentConfig envConfig = new EnvironmentConfig();
+ envConfig.setAllowCreate(true);
+ envConfig.setTransactional(true);
+ envConfig.setConfigParam("je.lock.nLockTables", "7");
+ envConfig.setReadOnly(false);
+ envConfig.setSharedCache(false);
+ envConfig.setCacheSize(0);
+ return new Environment(storeLocation, envConfig);
+ }
+
+ @Override
+ public void tearDown() throws Exception
+ {
+ try
+ {
+ _environment.close();
+ }
+ finally
+ {
+ _environment = null;
+ deleteDirectoryIfExists(_storeLocation);
+ }
+ super.tearDown();
+ }
+
+ private File copyStore(String storeDirectoryName) throws Exception
+ {
+ String src = getClass().getClassLoader().getResource("upgrade/" + storeDirectoryName).toURI().getPath();
+ File storeLocation = new File(new File(TMP_FOLDER), "test-store");
+ deleteDirectoryIfExists(storeLocation);
+ FileUtils.copyRecursive(new File(src), new File(TMP_FOLDER));
+ return storeLocation;
+ }
+
+ protected void deleteDirectoryIfExists(File dir)
+ {
+ if (dir.exists())
+ {
+ assertTrue("The provided file " + dir + " is not a directory", dir.isDirectory());
+
+ boolean deletedSuccessfully = FileUtils.delete(dir, true);
+
+ assertTrue("Files at '" + dir + "' should have been deleted", deletedSuccessfully);
+ }
+ }
+
+ protected void assertDatabaseRecordCount(String databaseName, final long expectedCountNumber)
+ {
+ long count = getDatabaseCount(databaseName);
+ assertEquals("Unexpected database '" + databaseName + "' entry number", expectedCountNumber, count);
+ }
+
+ protected long getDatabaseCount(String databaseName)
+ {
+ DatabaseCallable<Long> operation = new DatabaseCallable<Long>()
+ {
+
+ @Override
+ public Long call(Database sourceDatabase, Database targetDatabase, Transaction transaction)
+ {
+ return new Long(sourceDatabase.count());
+
+ }
+ };
+ Long count = new DatabaseTemplate(_environment, databaseName, null).call(operation);
+ return count.longValue();
+ }
+
+ public String getVirtualHostName()
+ {
+ return getName();
+ }
+}
diff --git a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseTemplateTest.java b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseTemplateTest.java
new file mode 100644
index 0000000000..7ec442b73d
--- /dev/null
+++ b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/DatabaseTemplateTest.java
@@ -0,0 +1,83 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Matchers.same;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import junit.framework.TestCase;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.Transaction;
+
+public class DatabaseTemplateTest extends TestCase
+{
+ private static final String SOURCE_DATABASE = "sourceDatabase";
+ private Environment _environment;
+ private Database _sourceDatabase;
+
+ @Override
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _environment = mock(Environment.class);
+ _sourceDatabase = mock(Database.class);
+ when(_environment.openDatabase(any(Transaction.class), same(SOURCE_DATABASE), isA(DatabaseConfig.class)))
+ .thenReturn(_sourceDatabase);
+ }
+
+ public void testExecuteWithTwoDatabases()
+ {
+ String targetDatabaseName = "targetDatabase";
+ Database targetDatabase = mock(Database.class);
+
+ Transaction txn = mock(Transaction.class);
+
+ when(_environment.openDatabase(same(txn), same(targetDatabaseName), isA(DatabaseConfig.class)))
+ .thenReturn(targetDatabase);
+
+ DatabaseTemplate databaseTemplate = new DatabaseTemplate(_environment, SOURCE_DATABASE, targetDatabaseName, txn);
+
+ DatabaseRunnable databaseOperation = mock(DatabaseRunnable.class);
+ databaseTemplate.run(databaseOperation);
+
+ verify(databaseOperation).run(_sourceDatabase, targetDatabase, txn);
+ verify(_sourceDatabase).close();
+ verify(targetDatabase).close();
+ }
+
+ public void testExecuteWithOneDatabases()
+ {
+ DatabaseTemplate databaseTemplate = new DatabaseTemplate(_environment, SOURCE_DATABASE, null, null);
+
+ DatabaseRunnable databaseOperation = mock(DatabaseRunnable.class);
+ databaseTemplate.run(databaseOperation);
+
+ verify(databaseOperation).run(_sourceDatabase, (Database)null, (Transaction)null);
+ verify(_sourceDatabase).close();
+ }
+
+}
diff --git a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4to5Test.java b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4to5Test.java
new file mode 100644
index 0000000000..3f9e4e4aa1
--- /dev/null
+++ b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4to5Test.java
@@ -0,0 +1,299 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.qpid.common.AMQPFilterTypes;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.store.berkeleydb.BDBStoreUpgradeTestPreparer;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom4To5.BindingRecord;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom4To5.BindingTuple;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom4To5.MessageContentKey;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom4To5.MessageContentKeyBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom4To5.QueueEntryKey;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom4To5.QueueEntryKeyBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom4To5.QueueRecord;
+
+import com.sleepycat.bind.tuple.LongBinding;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.Transaction;
+
+public class UpgradeFrom4to5Test extends AbstractUpgradeTestCase
+{
+ private static final String NON_DURABLE_QUEUE = BDBStoreUpgradeTestPreparer.NON_DURABLE_QUEUE_NAME;
+ private static final String DURABLE_QUEUE = BDBStoreUpgradeTestPreparer.QUEUE_NAME;
+ private static final String DURABLE_SUBSCRIPTION_QUEUE_WITH_SELECTOR = "clientid:mySelectorDurSubName";
+ private static final String DURABLE_SUBSCRIPTION_QUEUE = "clientid:myDurSubName";
+ private static final String EXCHANGE_DB_NAME = "exchangeDb_v5";
+ private static final String MESSAGE_META_DATA_DB_NAME = "messageMetaDataDb_v5";
+ private static final String MESSAGE_CONTENT_DB_NAME = "messageContentDb_v5";
+ private static final String DELIVERY_DB_NAME = "deliveryDb_v5";
+ private static final String BINDING_DB_NAME = "queueBindingsDb_v5";
+
+ @Override
+ protected String getStoreDirectoryName()
+ {
+ return "bdbstore-v4";
+ }
+
+ public void testPerformUpgradeWithHandlerAnsweringYes() throws Exception
+ {
+ UpgradeFrom4To5 upgrade = new UpgradeFrom4To5();
+ upgrade.performUpgrade(_environment, new StaticAnswerHandler(UpgradeInteractionResponse.YES), getVirtualHostName());
+
+ assertQueues(new HashSet<String>(Arrays.asList(QUEUE_NAMES)));
+
+ assertDatabaseRecordCount(DELIVERY_DB_NAME, TOTAL_MESSAGE_NUMBER);
+ assertDatabaseRecordCount(MESSAGE_META_DATA_DB_NAME, TOTAL_MESSAGE_NUMBER);
+ assertDatabaseRecordCount(EXCHANGE_DB_NAME, TOTAL_EXCHANGES);
+
+ for (int i = 0; i < QUEUE_SIZES.length; i++)
+ {
+ assertQueueMessages(QUEUE_NAMES[i], QUEUE_SIZES[i]);
+ }
+
+ final List<BindingRecord> queueBindings = loadBindings();
+
+ assertEquals("Unxpected list size", TOTAL_BINDINGS, queueBindings.size());
+ assertBindingRecord(queueBindings, DURABLE_SUBSCRIPTION_QUEUE, "amq.topic", BDBStoreUpgradeTestPreparer.TOPIC_NAME, "");
+ assertBindingRecord(queueBindings, DURABLE_SUBSCRIPTION_QUEUE_WITH_SELECTOR, "amq.topic",
+ BDBStoreUpgradeTestPreparer.SELECTOR_TOPIC_NAME, "testprop='true'");
+ assertBindingRecord(queueBindings, DURABLE_QUEUE, "amq.direct", DURABLE_QUEUE, null);
+ assertBindingRecord(queueBindings, NON_DURABLE_QUEUE, "amq.direct", NON_DURABLE_QUEUE, null);
+ assertContent();
+ }
+
+ public void testPerformUpgradeWithHandlerAnsweringNo() throws Exception
+ {
+ UpgradeFrom4To5 upgrade = new UpgradeFrom4To5();
+ upgrade.performUpgrade(_environment, new StaticAnswerHandler(UpgradeInteractionResponse.NO), getVirtualHostName());
+ assertQueues(new HashSet<String>(Arrays.asList(DURABLE_SUBSCRIPTION_QUEUE, DURABLE_SUBSCRIPTION_QUEUE_WITH_SELECTOR, DURABLE_QUEUE)));
+
+ assertDatabaseRecordCount(DELIVERY_DB_NAME, 12);
+ assertDatabaseRecordCount(MESSAGE_META_DATA_DB_NAME, 12);
+ assertDatabaseRecordCount(EXCHANGE_DB_NAME, TOTAL_EXCHANGES);
+
+ assertQueueMessages(DURABLE_SUBSCRIPTION_QUEUE, 1);
+ assertQueueMessages(DURABLE_SUBSCRIPTION_QUEUE_WITH_SELECTOR, 1);
+ assertQueueMessages(DURABLE_QUEUE, 10);
+
+ final List<BindingRecord> queueBindings = loadBindings();
+
+ assertEquals("Unxpected list size", TOTAL_BINDINGS - 2, queueBindings.size());
+ assertBindingRecord(queueBindings, DURABLE_SUBSCRIPTION_QUEUE, "amq.topic", BDBStoreUpgradeTestPreparer.TOPIC_NAME,
+ "");
+ assertBindingRecord(queueBindings, DURABLE_SUBSCRIPTION_QUEUE_WITH_SELECTOR, "amq.topic",
+ BDBStoreUpgradeTestPreparer.SELECTOR_TOPIC_NAME, "testprop='true'");
+ assertBindingRecord(queueBindings, DURABLE_QUEUE, "amq.direct", DURABLE_QUEUE, null);
+ assertContent();
+ }
+
+ private List<BindingRecord> loadBindings()
+ {
+ final BindingTuple bindingTuple = new BindingTuple();
+ final List<BindingRecord> queueBindings = new ArrayList<BindingRecord>();
+ CursorOperation databaseOperation = new CursorOperation()
+ {
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ BindingRecord bindingRecord = bindingTuple.entryToObject(key);
+
+ AMQShortString queueName = bindingRecord.getQueueName();
+ AMQShortString exchangeName = bindingRecord.getExchangeName();
+ AMQShortString routingKey = bindingRecord.getRoutingKey();
+ FieldTable arguments = bindingRecord.getArguments();
+ queueBindings.add(new BindingRecord(exchangeName, queueName, routingKey, arguments));
+ }
+ };
+ new DatabaseTemplate(_environment, BINDING_DB_NAME, null).run(databaseOperation);
+ return queueBindings;
+ }
+
+ private void assertBindingRecord(List<BindingRecord> queueBindings, String queueName, String exchangeName,
+ String routingKey, String selectorKey)
+ {
+ BindingRecord record = null;
+ for (BindingRecord bindingRecord : queueBindings)
+ {
+ if (bindingRecord.getQueueName().asString().equals(queueName)
+ && bindingRecord.getExchangeName().asString().equals(exchangeName))
+ {
+ record = bindingRecord;
+ break;
+ }
+ }
+ assertNotNull("Binding is not found for queue " + queueName + " and exchange " + exchangeName, record);
+ assertEquals("Unexpected routing key", routingKey, record.getRoutingKey().asString());
+
+ if (selectorKey != null)
+ {
+ assertEquals("Unexpected selector key for " + queueName, selectorKey,
+ record.getArguments().get(AMQPFilterTypes.JMS_SELECTOR.getValue()));
+ }
+ }
+
+ private void assertQueueMessages(final String queueName, final int expectedQueueSize)
+ {
+ final Set<Long> messageIdsForQueue = assertDeliveriesForQueue(queueName, expectedQueueSize);
+
+ assertMetadataForQueue(queueName, expectedQueueSize, messageIdsForQueue);
+
+ assertContentForQueue(queueName, expectedQueueSize, messageIdsForQueue);
+ }
+
+ private Set<Long> assertDeliveriesForQueue(final String queueName, final int expectedQueueSize)
+ {
+ final QueueEntryKeyBinding queueEntryKeyBinding = new QueueEntryKeyBinding();
+ final AtomicInteger deliveryCounter = new AtomicInteger();
+ final Set<Long> messagesForQueue = new HashSet<Long>();
+
+ CursorOperation deliveryDatabaseOperation = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ QueueEntryKey entryKey = queueEntryKeyBinding.entryToObject(key);
+ String thisQueueName = entryKey.getQueueName().asString();
+ if (thisQueueName.equals(queueName))
+ {
+ deliveryCounter.incrementAndGet();
+ messagesForQueue.add(entryKey.getMessageId());
+ }
+ }
+ };
+ new DatabaseTemplate(_environment, DELIVERY_DB_NAME, null).run(deliveryDatabaseOperation);
+
+ assertEquals("Unxpected number of entries in delivery db for queue " + queueName, expectedQueueSize,
+ deliveryCounter.get());
+
+ return messagesForQueue;
+ }
+
+ private void assertMetadataForQueue(final String queueName, final int expectedQueueSize,
+ final Set<Long> messageIdsForQueue)
+ {
+ final AtomicInteger metadataCounter = new AtomicInteger();
+ CursorOperation databaseOperation = new CursorOperation()
+ {
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ Long messageId = LongBinding.entryToLong(key);
+
+ boolean messageIsForTheRightQueue = messageIdsForQueue.contains(messageId);
+ if (messageIsForTheRightQueue)
+ {
+ metadataCounter.incrementAndGet();
+ }
+ }
+ };
+ new DatabaseTemplate(_environment, MESSAGE_META_DATA_DB_NAME, null).run(databaseOperation);
+
+ assertEquals("Unxpected number of entries in metadata db for queue " + queueName, expectedQueueSize,
+ metadataCounter.get());
+ }
+
+ private void assertContentForQueue(String queueName, int expectedQueueSize, final Set<Long> messageIdsForQueue)
+ {
+ final AtomicInteger contentCounter = new AtomicInteger();
+ final MessageContentKeyBinding keyBinding = new MessageContentKeyBinding();
+ CursorOperation cursorOperation = new CursorOperation()
+ {
+ private long _prevMsgId = -1;
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ MessageContentKey contentKey = keyBinding.entryToObject(key);
+ long msgId = contentKey.getMessageId();
+
+ if (_prevMsgId != msgId && messageIdsForQueue.contains(msgId))
+ {
+ contentCounter.incrementAndGet();
+ }
+
+ _prevMsgId = msgId;
+ }
+ };
+ new DatabaseTemplate(_environment, MESSAGE_CONTENT_DB_NAME, null).run(cursorOperation);
+
+ assertEquals("Unxpected number of entries in content db for queue " + queueName, expectedQueueSize,
+ contentCounter.get());
+ }
+
+ private void assertQueues(Set<String> expectedQueueNames)
+ {
+ List<AMQShortString> durableSubNames = new ArrayList<AMQShortString>();
+ final UpgradeFrom4To5.QueueRecordBinding binding = new UpgradeFrom4To5.QueueRecordBinding(durableSubNames);
+ final Set<String> actualQueueNames = new HashSet<String>();
+
+ CursorOperation queueNameCollector = new CursorOperation()
+ {
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ QueueRecord record = binding.entryToObject(value);
+ String queueName = record.getNameShortString().asString();
+ actualQueueNames.add(queueName);
+ }
+ };
+ new DatabaseTemplate(_environment, "queueDb_v5", null).run(queueNameCollector);
+
+ assertEquals("Unexpected queue names", expectedQueueNames, actualQueueNames);
+ }
+
+ private void assertContent()
+ {
+ final UpgradeFrom4To5.ContentBinding contentBinding = new UpgradeFrom4To5.ContentBinding();
+ CursorOperation contentCursorOperation = new CursorOperation()
+ {
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction, DatabaseEntry key,
+ DatabaseEntry value)
+ {
+ long id = LongBinding.entryToLong(key);
+ assertTrue("Unexpected id", id > 0);
+ ByteBuffer content = contentBinding.entryToObject(value);
+ assertNotNull("Unexpected content", content);
+ }
+ };
+ new DatabaseTemplate(_environment, MESSAGE_CONTENT_DB_NAME, null).run(contentCursorOperation);
+ }
+}
diff --git a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6Test.java b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6Test.java
new file mode 100644
index 0000000000..5297692820
--- /dev/null
+++ b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6Test.java
@@ -0,0 +1,395 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.CONFIGURED_OBJECTS_DB_NAME;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NEW_CONTENT_DB_NAME;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NEW_DELIVERY_DB_NAME;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NEW_METADATA_DB_NAME;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NEW_XID_DB_NAME;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.OLD_CONTENT_DB_NAME;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.OLD_XID_DB_NAME;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.UUID;
+
+import org.apache.log4j.Logger;
+import org.apache.qpid.server.model.Binding;
+import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.model.UUIDGenerator;
+import org.apache.qpid.server.store.berkeleydb.entry.Xid;
+import org.apache.qpid.server.store.berkeleydb.tuple.XidBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.CompoundKey;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.CompoundKeyBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.ConfiguredObjectBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.UpgradeConfiguredObjectRecord;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NewDataBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NewPreparedTransaction;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NewPreparedTransactionBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NewQueueEntryBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NewQueueEntryKey;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NewRecordImpl;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.OldPreparedTransaction;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.OldPreparedTransactionBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.OldRecordImpl;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.UpgradeUUIDBinding;
+import org.apache.qpid.server.util.MapJsonSerializer;
+
+import com.sleepycat.bind.tuple.LongBinding;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.Transaction;
+
+public class UpgradeFrom5To6Test extends AbstractUpgradeTestCase
+{
+ private static final Logger _logger = Logger.getLogger(UpgradeFrom5To6Test.class);
+
+ @Override
+ protected String getStoreDirectoryName()
+ {
+ return "bdbstore-v5";
+ }
+
+ public void testPerformUpgrade() throws Exception
+ {
+ UpgradeFrom5To6 upgrade = new UpgradeFrom5To6();
+ upgrade.performUpgrade(_environment, UpgradeInteractionHandler.DEFAULT_HANDLER, getVirtualHostName());
+
+ assertDatabaseRecordCounts();
+ assertContent();
+
+ assertConfiguredObjects();
+ assertQueueEntries();
+ }
+
+ public void testPerformUpgradeWithMissingMessageChunkKeepsIncompleteMessage() throws Exception
+ {
+ corruptDatabase();
+
+ UpgradeFrom5To6 upgrade = new UpgradeFrom5To6();
+ upgrade.performUpgrade(_environment, new StaticAnswerHandler(UpgradeInteractionResponse.YES), getVirtualHostName());
+
+ assertDatabaseRecordCounts();
+
+ assertConfiguredObjects();
+ assertQueueEntries();
+ }
+
+ public void testPerformUpgradeWithMissingMessageChunkDiscardsIncompleteMessage() throws Exception
+ {
+ corruptDatabase();
+
+ UpgradeFrom5To6 upgrade = new UpgradeFrom5To6();
+
+ UpgradeInteractionHandler discardMessageInteractionHandler = new StaticAnswerHandler(UpgradeInteractionResponse.NO);
+
+ upgrade.performUpgrade(_environment, discardMessageInteractionHandler, getVirtualHostName());
+
+ assertDatabaseRecordCount(NEW_METADATA_DB_NAME, 11);
+ assertDatabaseRecordCount(NEW_CONTENT_DB_NAME, 11);
+
+ assertConfiguredObjects();
+ assertQueueEntries();
+ }
+
+ public void testPerformXidUpgrade() throws Exception
+ {
+ File storeLocation = new File(TMP_FOLDER, getName());
+ storeLocation.mkdirs();
+ Environment environment = createEnvironment(storeLocation);
+ try
+ {
+ populateOldXidEntries(environment);
+ UpgradeFrom5To6 upgrade = new UpgradeFrom5To6();
+ upgrade.performUpgrade(environment, UpgradeInteractionHandler.DEFAULT_HANDLER, getVirtualHostName());
+ assertXidEntries(environment);
+ }
+ finally
+ {
+ try
+ {
+ environment.close();
+ }
+ finally
+ {
+ deleteDirectoryIfExists(storeLocation);
+ }
+
+ }
+ }
+
+ private void assertXidEntries(Environment environment)
+ {
+ final DatabaseEntry value = new DatabaseEntry();
+ final DatabaseEntry key = getXidKey();
+ new DatabaseTemplate(environment, NEW_XID_DB_NAME, null).run(new DatabaseRunnable()
+ {
+
+ @Override
+ public void run(Database xidDatabase, Database nullDatabase, Transaction transaction)
+ {
+ xidDatabase.get(null, key, value, LockMode.DEFAULT);
+ }
+ });
+ NewPreparedTransactionBinding newBinding = new NewPreparedTransactionBinding();
+ NewPreparedTransaction newTransaction = newBinding.entryToObject(value);
+ NewRecordImpl[] newEnqueues = newTransaction.getEnqueues();
+ NewRecordImpl[] newDequeues = newTransaction.getDequeues();
+ assertEquals("Unxpected new enqueus number", 1, newEnqueues.length);
+ NewRecordImpl enqueue = newEnqueues[0];
+ assertEquals("Unxpected queue id", UUIDGenerator.generateUUID("TEST1", getVirtualHostName()), enqueue.getId());
+ assertEquals("Unxpected message id", 1, enqueue.getMessageNumber());
+ assertEquals("Unxpected new dequeues number", 1, newDequeues.length);
+ NewRecordImpl dequeue = newDequeues[0];
+ assertEquals("Unxpected queue id", UUIDGenerator.generateUUID("TEST2", getVirtualHostName()), dequeue.getId());
+ assertEquals("Unxpected message id", 2, dequeue.getMessageNumber());
+ }
+
+ private void populateOldXidEntries(Environment environment)
+ {
+
+ final DatabaseEntry value = new DatabaseEntry();
+ OldRecordImpl[] enqueues = { new OldRecordImpl("TEST1", 1) };
+ OldRecordImpl[] dequeues = { new OldRecordImpl("TEST2", 2) };
+ OldPreparedTransaction oldPreparedTransaction = new OldPreparedTransaction(enqueues, dequeues);
+ OldPreparedTransactionBinding oldPreparedTransactionBinding = new OldPreparedTransactionBinding();
+ oldPreparedTransactionBinding.objectToEntry(oldPreparedTransaction, value);
+
+ final DatabaseEntry key = getXidKey();
+ new DatabaseTemplate(environment, OLD_XID_DB_NAME, null).run(new DatabaseRunnable()
+ {
+
+ @Override
+ public void run(Database xidDatabase, Database nullDatabase, Transaction transaction)
+ {
+ xidDatabase.put(null, key, value);
+ }
+ });
+ }
+
+ protected DatabaseEntry getXidKey()
+ {
+ final DatabaseEntry value = new DatabaseEntry();
+ byte[] globalId = { 1 };
+ byte[] branchId = { 2 };
+ Xid xid = new Xid(1l, globalId, branchId);
+ XidBinding xidBinding = XidBinding.getInstance();
+ xidBinding.objectToEntry(xid, value);
+ return value;
+ }
+
+ private void assertQueueEntries()
+ {
+ final Map<UUID, UpgradeConfiguredObjectRecord> configuredObjects = loadConfiguredObjects();
+ final NewQueueEntryBinding newBinding = new NewQueueEntryBinding();
+ CursorOperation cursorOperation = new CursorOperation()
+ {
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ NewQueueEntryKey newEntryRecord = newBinding.entryToObject(key);
+ assertTrue("Unexpected queue id", configuredObjects.containsKey(newEntryRecord.getQueueId()));
+ }
+ };
+ new DatabaseTemplate(_environment, NEW_DELIVERY_DB_NAME, null).run(cursorOperation);
+ }
+
+ /**
+ * modify the chunk offset of a message to be wrong, so we can test logic
+ * that preserves incomplete messages
+ */
+ private void corruptDatabase()
+ {
+ CursorOperation cursorOperation = new CursorOperation()
+ {
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ CompoundKeyBinding binding = new CompoundKeyBinding();
+ CompoundKey originalCompoundKey = binding.entryToObject(key);
+ int corruptedOffset = originalCompoundKey.getOffset() + 2;
+ CompoundKey corruptedCompoundKey = new CompoundKey(originalCompoundKey.getMessageId(), corruptedOffset);
+ DatabaseEntry newKey = new DatabaseEntry();
+ binding.objectToEntry(corruptedCompoundKey, newKey);
+
+ _logger.info("Deliberately corrupted message id " + originalCompoundKey.getMessageId()
+ + ", changed offset from " + originalCompoundKey.getOffset() + " to "
+ + corruptedCompoundKey.getOffset());
+
+ deleteCurrent();
+ sourceDatabase.put(transaction, newKey, value);
+
+ abort();
+ }
+ };
+
+ Transaction transaction = _environment.beginTransaction(null, null);
+ new DatabaseTemplate(_environment, OLD_CONTENT_DB_NAME, transaction).run(cursorOperation);
+ transaction.commit();
+ }
+
+ private void assertDatabaseRecordCounts()
+ {
+ assertDatabaseRecordCount(CONFIGURED_OBJECTS_DB_NAME, 9);
+ assertDatabaseRecordCount(NEW_DELIVERY_DB_NAME, 12);
+
+ assertDatabaseRecordCount(NEW_METADATA_DB_NAME, 12);
+ assertDatabaseRecordCount(NEW_CONTENT_DB_NAME, 12);
+ }
+
+ private void assertConfiguredObjects()
+ {
+ Map<UUID, UpgradeConfiguredObjectRecord> configuredObjects = loadConfiguredObjects();
+ assertEquals("Unexpected number of configured objects", 9, configuredObjects.size());
+
+ Set<Map<String, Object>> expected = new HashSet<Map<String, Object>>(9);
+ Map<String, Object> queue1 = new HashMap<String, Object>();
+ queue1.put("exclusive", Boolean.FALSE);
+ queue1.put("name", "myUpgradeQueue");
+ queue1.put("owner", null);
+ expected.add(queue1);
+ Map<String, Object> queue2 = new HashMap<String, Object>();
+ queue2.put("exclusive", Boolean.TRUE);
+ queue2.put("name", "clientid:mySelectorDurSubName");
+ queue2.put("owner", "clientid");
+ expected.add(queue2);
+ Map<String, Object> queue3 = new HashMap<String, Object>();
+ queue3.put("exclusive", Boolean.TRUE);
+ queue3.put("name", "clientid:myDurSubName");
+ queue3.put("owner", "clientid");
+ expected.add(queue3);
+
+ Map<String, Object> queueBinding1 = new HashMap<String, Object>();
+ queueBinding1.put("queue", UUIDGenerator.generateUUID("myUpgradeQueue", getVirtualHostName()).toString());
+ queueBinding1.put("name", "myUpgradeQueue");
+ queueBinding1.put("exchange", UUIDGenerator.generateUUID("<<default>>", getVirtualHostName()).toString());
+ expected.add(queueBinding1);
+ Map<String, Object> queueBinding2 = new HashMap<String, Object>();
+ queueBinding2.put("queue", UUIDGenerator.generateUUID("myUpgradeQueue", getVirtualHostName()).toString());
+ queueBinding2.put("name", "myUpgradeQueue");
+ queueBinding2.put("exchange", UUIDGenerator.generateUUID("amq.direct", getVirtualHostName()).toString());
+ Map<String, Object> arguments2 = new HashMap<String, Object>();
+ arguments2.put("x-filter-jms-selector", "");
+ queueBinding2.put("arguments", arguments2);
+ expected.add(queueBinding2);
+ Map<String, Object> queueBinding3 = new HashMap<String, Object>();
+ queueBinding3.put("queue", UUIDGenerator.generateUUID("clientid:myDurSubName", getVirtualHostName()).toString());
+ queueBinding3.put("name", "myUpgradeTopic");
+ queueBinding3.put("exchange", UUIDGenerator.generateUUID("amq.topic", getVirtualHostName()).toString());
+ Map<String, Object> arguments3 = new HashMap<String, Object>();
+ arguments3.put("x-filter-jms-selector", "");
+ queueBinding3.put("arguments", arguments3);
+ expected.add(queueBinding3);
+ Map<String, Object> queueBinding4 = new HashMap<String, Object>();
+ queueBinding4.put("queue", UUIDGenerator.generateUUID("clientid:mySelectorDurSubName", getVirtualHostName()).toString());
+ queueBinding4.put("name", "mySelectorUpgradeTopic");
+ queueBinding4.put("exchange", UUIDGenerator.generateUUID("amq.topic", getVirtualHostName()).toString());
+ Map<String, Object> arguments4 = new HashMap<String, Object>();
+ arguments4.put("x-filter-jms-selector", "testprop='true'");
+ queueBinding4.put("arguments", arguments4);
+ expected.add(queueBinding4);
+ Map<String, Object> queueBinding5 = new HashMap<String, Object>();
+ queueBinding5.put("queue", UUIDGenerator.generateUUID("clientid:myDurSubName", getVirtualHostName()).toString());
+ queueBinding5.put("name", "clientid:myDurSubName");
+ queueBinding5.put("exchange", UUIDGenerator.generateUUID("<<default>>", getVirtualHostName()).toString());
+ expected.add(queueBinding5);
+ Map<String, Object> queueBinding6 = new HashMap<String, Object>();
+ queueBinding6.put("queue", UUIDGenerator.generateUUID("clientid:mySelectorDurSubName", getVirtualHostName()).toString());
+ queueBinding6.put("name", "clientid:mySelectorDurSubName");
+ queueBinding6.put("exchange", UUIDGenerator.generateUUID("<<default>>", getVirtualHostName()).toString());
+ expected.add(queueBinding6);
+
+ Set<String> expectedTypes = new HashSet<String>();
+ expectedTypes.add(Queue.class.getName());
+ expectedTypes.add(Exchange.class.getName());
+ expectedTypes.add(Binding.class.getName());
+ MapJsonSerializer jsonSerializer = new MapJsonSerializer();
+ for (Entry<UUID, UpgradeConfiguredObjectRecord> entry : configuredObjects.entrySet())
+ {
+ UpgradeConfiguredObjectRecord object = entry.getValue();
+ UUID key = entry.getKey();
+ Map<String, Object> deserialized = jsonSerializer.deserialize(object.getAttributes());
+ assertTrue("Unexpected entry:" + object.getAttributes(), expected.remove(deserialized));
+ String type = object.getType();
+ assertTrue("Unexpected type:" + type, expectedTypes.contains(type));
+ if (type.equals(Exchange.class.getName()) || type.equals(Queue.class.getName()))
+ {
+ assertEquals("Unexpected key", key, UUIDGenerator.generateUUID(((String) deserialized.get("name")), getVirtualHostName()));
+ }
+ else
+ {
+ assertNotNull("Key cannot be null", key);
+ }
+ }
+ assertTrue("Not all expected configured objects found:" + expected, expected.isEmpty());
+ }
+
+ private Map<UUID, UpgradeConfiguredObjectRecord> loadConfiguredObjects()
+ {
+ final Map<UUID, UpgradeConfiguredObjectRecord> configuredObjectsRecords = new HashMap<UUID, UpgradeConfiguredObjectRecord>();
+ final ConfiguredObjectBinding binding = new ConfiguredObjectBinding();
+ final UpgradeUUIDBinding uuidBinding = new UpgradeUUIDBinding();
+ CursorOperation configuredObjectsCursor = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ UUID id = uuidBinding.entryToObject(key);
+ UpgradeConfiguredObjectRecord object = binding.entryToObject(value);
+ configuredObjectsRecords.put(id, object);
+ }
+ };
+ new DatabaseTemplate(_environment, CONFIGURED_OBJECTS_DB_NAME, null).run(configuredObjectsCursor);
+ return configuredObjectsRecords;
+ }
+
+ private void assertContent()
+ {
+ final NewDataBinding contentBinding = new NewDataBinding();
+ CursorOperation contentCursorOperation = new CursorOperation()
+ {
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ long id = LongBinding.entryToLong(key);
+ assertTrue("Unexpected id", id > 0);
+ byte[] content = contentBinding.entryToObject(value);
+ assertNotNull("Unexpected content", content);
+ }
+ };
+ new DatabaseTemplate(_environment, NEW_CONTENT_DB_NAME, null).run(contentCursorOperation);
+ }
+}
diff --git a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgraderTest.java b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgraderTest.java
new file mode 100644
index 0000000000..ba5ca842bf
--- /dev/null
+++ b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgraderTest.java
@@ -0,0 +1,138 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.upgrade;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.qpid.server.store.berkeleydb.BDBMessageStore;
+import org.apache.qpid.server.store.berkeleydb.tuple.ContentBinding;
+
+import com.sleepycat.bind.tuple.IntegerBinding;
+import com.sleepycat.bind.tuple.LongBinding;
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.OperationStatus;
+import com.sleepycat.je.Transaction;
+
+public class UpgraderTest extends AbstractUpgradeTestCase
+{
+ private Upgrader _upgrader;
+
+ @Override
+ protected String getStoreDirectoryName()
+ {
+ return "bdbstore-v4";
+ }
+
+ @Override
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _upgrader = new Upgrader(_environment, getVirtualHostName());
+ }
+
+ private int getStoreVersion()
+ {
+ DatabaseConfig dbConfig = new DatabaseConfig();
+ dbConfig.setTransactional(true);
+ dbConfig.setAllowCreate(true);
+ int storeVersion = -1;
+ Database versionDb = null;
+ Cursor cursor = null;
+ try
+ {
+ versionDb = _environment.openDatabase(null, Upgrader.VERSION_DB_NAME, dbConfig);
+ cursor = versionDb.openCursor(null, null);
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+ while (cursor.getNext(key, value, null) == OperationStatus.SUCCESS)
+ {
+ int version = IntegerBinding.entryToInt(key);
+ if (storeVersion < version)
+ {
+ storeVersion = version;
+ }
+ }
+ }
+ finally
+ {
+ if (cursor != null)
+ {
+ cursor.close();
+ }
+ if (versionDb != null)
+ {
+ versionDb.close();
+ }
+ }
+ return storeVersion;
+ }
+
+ public void testUpgrade() throws Exception
+ {
+ assertEquals("Unexpected store version", -1, getStoreVersion());
+ _upgrader.upgradeIfNecessary();
+ assertEquals("Unexpected store version", BDBMessageStore.VERSION, getStoreVersion());
+ assertContent();
+ }
+
+ public void testEmptyDatabaseUpgradeDoesNothing() throws Exception
+ {
+ File nonExistentStoreLocation = new File(TMP_FOLDER, getName());
+ deleteDirectoryIfExists(nonExistentStoreLocation);
+
+ nonExistentStoreLocation.mkdir();
+ _environment = createEnvironment(nonExistentStoreLocation);
+ _upgrader = new Upgrader(_environment, getVirtualHostName());
+ _upgrader.upgradeIfNecessary();
+
+ List<String> databaseNames = _environment.getDatabaseNames();
+ List<String> expectedDatabases = new ArrayList<String>();
+ expectedDatabases.add(Upgrader.VERSION_DB_NAME);
+ assertEquals("Expectedonly VERSION table in initially empty store after upgrade: ", expectedDatabases, databaseNames);
+ assertEquals("Unexpected store version", BDBMessageStore.VERSION, getStoreVersion());
+
+ nonExistentStoreLocation.delete();
+ }
+
+ private void assertContent()
+ {
+ final ContentBinding contentBinding = ContentBinding.getInstance();
+ CursorOperation contentCursorOperation = new CursorOperation()
+ {
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction, DatabaseEntry key,
+ DatabaseEntry value)
+ {
+ long id = LongBinding.entryToLong(key);
+ assertTrue("Unexpected id", id > 0);
+ byte[] content = contentBinding.entryToObject(value);
+ assertNotNull("Unexpected content", content);
+ }
+ };
+ new DatabaseTemplate(_environment, "MESSAGE_CONTENT", null).run(contentCursorOperation);
+ }
+}
diff --git a/java/bdbstore/src/test/resources/upgrade/bdbstore-to-upgrade/test-store/00000000.jdb b/java/bdbstore/src/test/resources/upgrade/bdbstore-to-upgrade/test-store/00000000.jdb
deleted file mode 100644
index 38158a55e7..0000000000
--- a/java/bdbstore/src/test/resources/upgrade/bdbstore-to-upgrade/test-store/00000000.jdb
+++ /dev/null
Binary files differ
diff --git a/java/bdbstore/src/test/resources/upgrade/bdbstore-v4/test-store/00000000.jdb b/java/bdbstore/src/test/resources/upgrade/bdbstore-v4/test-store/00000000.jdb
new file mode 100644
index 0000000000..167ab7f0ca
--- /dev/null
+++ b/java/bdbstore/src/test/resources/upgrade/bdbstore-v4/test-store/00000000.jdb
Binary files differ
diff --git a/java/bdbstore/src/test/resources/upgrade/bdbstore-v5/readme.txt b/java/bdbstore/src/test/resources/upgrade/bdbstore-v5/readme.txt
new file mode 100644
index 0000000000..a7e754f967
--- /dev/null
+++ b/java/bdbstore/src/test/resources/upgrade/bdbstore-v5/readme.txt
@@ -0,0 +1,5 @@
+The bdbstore v5 data were obtained by upgrading the bdbstore v4 data as part of running
+test UpgradeFrom4to5Test#testPerformUpgradeWithHandlerAnsweringNo.
+
+The rationale for not using BDBStoreUpgradeTestPreparer in this case is that we need chunked content.
+Current implementation of BDBMessageStore only stores messages in one chunk. \ No newline at end of file
diff --git a/java/bdbstore/src/test/resources/upgrade/bdbstore-v5/test-store/00000000.jdb b/java/bdbstore/src/test/resources/upgrade/bdbstore-v5/test-store/00000000.jdb
new file mode 100644
index 0000000000..d44b21a83e
--- /dev/null
+++ b/java/bdbstore/src/test/resources/upgrade/bdbstore-v5/test-store/00000000.jdb
Binary files differ
diff --git a/java/bdbstore/src/test/resources/upgrade/bdbstore-v5/test-store/00000001.jdb b/java/bdbstore/src/test/resources/upgrade/bdbstore-v5/test-store/00000001.jdb
new file mode 100644
index 0000000000..9b85860c19
--- /dev/null
+++ b/java/bdbstore/src/test/resources/upgrade/bdbstore-v5/test-store/00000001.jdb
Binary files differ
diff --git a/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java b/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java
index b299b62538..9a08eb6499 100644
--- a/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java
+++ b/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java
@@ -83,7 +83,6 @@ public class PlainConfiguration extends AbstractConfiguration
_st.commentChar(COMMENT); // single line comments
_st.eolIsSignificant(true); // return EOL as a token
- _st.lowerCaseMode(true); // case insensitive tokens
_st.ordinaryChar('='); // equals is a token
_st.ordinaryChar(CONTINUATION); // continuation character (when followed by EOL)
_st.quoteChar('"'); // double quote
diff --git a/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java b/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java
index 61e867f459..5db02d10ce 100644
--- a/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java
+++ b/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java
@@ -68,7 +68,7 @@ public class AccessControlTest extends TestCase
private RuleSet createGroupRuleSet()
{
final RuleSet rs = new RuleSet();
- rs.addGroup("aclGroup1", Arrays.asList(new String[] {"member1", "member2"}));
+ rs.addGroup("aclGroup1", Arrays.asList(new String[] {"member1", "Member2"}));
// Rule expressed with username
rs.grant(0, "user1", Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
@@ -122,7 +122,12 @@ public class AccessControlTest extends TestCase
setUpGroupAccessControl();
SecurityManager.setThreadSubject(TestPrincipalUtils.createTestSubject("member1"));
- final Result result = _plugin.authorise(Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+ Result result = _plugin.authorise(Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+ assertEquals(Result.ALLOWED, result);
+
+ SecurityManager.setThreadSubject(TestPrincipalUtils.createTestSubject("Member2"));
+
+ result = _plugin.authorise(Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
assertEquals(Result.ALLOWED, result);
}
diff --git a/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java b/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java
index aa3982df71..25f903e860 100644
--- a/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java
+++ b/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java
@@ -318,17 +318,17 @@ public class PlainConfigurationTest extends TestCase
*/
public void testMixedCaseRuleInterpretation() throws Exception
{
- final PlainConfiguration config = writeACLConfig("AcL deny-LOG user1 BiND Exchange name=AmQ.dIrect");
+ final PlainConfiguration config = writeACLConfig("AcL deny-LOG User1 BiND Exchange Name=AmQ.dIrect");
final RuleSet rs = config.getConfiguration();
assertEquals(1, rs.getRuleCount());
final Map<Integer, Rule> rules = rs.getAllRules();
assertEquals(1, rules.size());
final Rule rule = rules.get(0);
- assertEquals("Rule has unexpected identity", "user1", rule.getIdentity());
+ assertEquals("Rule has unexpected identity", "User1", rule.getIdentity());
assertEquals("Rule has unexpected operation", Operation.BIND, rule.getAction().getOperation());
assertEquals("Rule has unexpected operation", ObjectType.EXCHANGE, rule.getAction().getObjectType());
- final ObjectProperties expectedProperties = new ObjectProperties("amq.direct");
+ final ObjectProperties expectedProperties = new ObjectProperties("AmQ.dIrect");
assertEquals("Rule has unexpected object properties", expectedProperties, rule.getAction().getProperties());
}
diff --git a/java/broker-plugins/experimental/info/MANIFEST.MF b/java/broker-plugins/experimental/info/MANIFEST.MF
deleted file mode 100644
index f213104d8d..0000000000
--- a/java/broker-plugins/experimental/info/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: QpidPlugin
-Bundle-SymbolicName: qpid_info_plugin;singleton:=true
-Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
-Bundle-Version: 1.0.0
-Bundle-Activator: org.apache.qpid.info.Activator
-Import-Package: org.apache.qpid.server.configuration,
- org.osgi.framework,
- org.apache.qpid.common,
- org.apache.qpid.server.registry
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ClassPath: .
-Bundle-ActivationPolicy: lazy
-Export-Package: org.apache.qpid.info;uses:="org.osgi.framework"
-
diff --git a/java/broker-plugins/experimental/info/build.properties b/java/broker-plugins/experimental/info/build.properties
deleted file mode 100644
index bdbbe1c2af..0000000000
--- a/java/broker-plugins/experimental/info/build.properties
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
- .,\
- plugin.xml,\
- lib/eventTrackerClient-2.7.0.jar,\
- lib/commons-logging-1.0.4.jar
-src.includes = src/,\
- plugin.xml,\
- lib/,\
- build.properties,\
- bin/,\
- META-INF/
diff --git a/java/broker-plugins/experimental/info/build.xml b/java/broker-plugins/experimental/info/build.xml
deleted file mode 100644
index 8f91adc5ff..0000000000
--- a/java/broker-plugins/experimental/info/build.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
-nn - or more contributor license agreements. See the NOTICE file
- -n distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
- -->
-<project name="AMQ Broker Info Plugin" default="build">
-
- <condition property="info-plugin.optional.depends" value="bdbstore" else="">
- <and>
- <contains string="${modules.opt}" substring="bdbstore"/>
- <contains string="${profile}" substring="bdb"/>
- </and>
- </condition>
-
- <property name="module.depends" value="common broker broker-plugins ${info-plugin.optional.depends}"/>
- <property name="module.test.depends" value="test broker/test management/common client systests common/test"/>
- <property name="module.manifest" value="MANIFEST.MF"/>
- <property name="module.plugin" value="true"/>
-
- <import file="../../../module.xml"/>
-
- <target name="bundle" depends="bundle-tasks"/>
-
-</project>
diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Activator.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Activator.java
deleted file mode 100644
index 037fad0979..0000000000
--- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Activator.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.info;
-
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-import org.apache.qpid.info.util.HttpPoster;
-import org.apache.qpid.info.util.IniFileReader;
-import org.apache.qpid.info.util.SoapClient;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-/** The Activator class for the OSGI info service */
-public class Activator implements BundleActivator
-{
-
- private final List<String> _soapPropList = Arrays.asList("soap.hostname",
- "soap.port", "soap.path", "soap.action", "soap.envelope");
-
- private final List<String> _httpPropList = Arrays.asList("http.url",
- "http.envelope");
-
- private InfoServiceImpl _service = null;
-
- private BundleContext _ctx = null;
-
- /**
- * Start bundle method
- *
- * @param ctx the bundle context
- */
- public void start(BundleContext ctx) throws Exception
- {
- if (null != ctx)
- {
- _ctx = ctx;
- _service = new InfoServiceImpl();
- ctx.registerService(InfoService.class.getName(), _service, null);
-
- new Thread(new Runnable()
- {
- public void run()
- {
- sendInfo("STARTUP");
- }
- }).start();
- }
- }
-
- /**
- * Stop the bundle method
- *
- * @param ctx the bundle context
- */
- public void stop(BundleContext ctx) throws Exception
- {
- sendInfo("SHUTDOWN");
- }
-
- /**
- * Sends the information message
- *
- * @param action label that identifies if we are starting up or shutting down
- */
- private void sendInfo(String action)
- {
- if ((null == _ctx) && (null == _service))
- {
- // invalid state
- return;
- }
-
- IniFileReader ifr = new IniFileReader();
- try
- {
- String QPID_HOME = System.getProperty("QPID_HOME");
- String cfgFilePath = QPID_HOME + File.separator + "etc"
- + File.separator + "qpidinfo.ini";
- ifr.load(cfgFilePath);
- }
- catch (Throwable ex)
- {
- // drop everything to be silent
- return;
- }
-
- // Only send Messages if we have some sections.
- if (ifr.getSections().size() != 0)
- {
- Info<? extends Map<String, ?>> info = _service.invoke(action);
- String protocol = ifr.getSections().get("").getProperty("protocol");
- sendMessages(protocol, ifr, info);
- }
- }
-
- /**
- * Sends all the messages configured in the properties file
- *
- * @param protocol indicates what protocol to be used: http and soap implemented
- * for now
- * @param ifr an instance of IniFileReader class
- * @param info an instance of an Info object, encapsulating the information
- * we want to send
- */
- private void sendMessages(String protocol, IniFileReader ifr,
- Info<? extends Map<String, ?>> info)
- {
- if (null != protocol)
- {
- // Set the global properties first (as they are the defaults)
- Properties defaultProps = ifr.getSections().get("");
- if (protocol.toLowerCase().startsWith("http"))
- {
- for (String section : ifr.getSections().keySet())
- {
- // Skip the defaults
- if (section.equals(""))
- {
- continue;
- }
- Properties props = new Properties();
- props.putAll(defaultProps);
- props.putAll(ifr.getSections().get(section));
- if (isValid(protocol, props))
- {
- new HttpPoster(props, info.toXML()).run();
- }
- }
-
- }
- else if (protocol.toLowerCase().startsWith("soap"))
- {
- for (String section : ifr.getSections().keySet())
- {
- Properties props = new Properties();
- props.putAll(defaultProps);
- props.putAll(ifr.getSections().get(section));
- if (isValid(protocol, props))
- {
- new SoapClient(info.toMap(), props).sendSOAPMessage();
- }
- }
- }
- }
- }
-
- /**
- * Checks if the properties for a specified protocol are valid
- *
- * @param protocol String representing the protocol
- * @param props The properties associate with the specified protocol
- * @return boolean
- */
- private boolean isValid(String protocol, Properties props)
- {
- if (null == protocol)
- {
- return false;
- }
- String value = "";
- if (protocol.toLowerCase().startsWith("http"))
- {
- for (String prop : _httpPropList)
- {
- if (null == props.get(prop))
- {
- return false;
- }
- }
- return true;
- }
-
- if (protocol.toLowerCase().startsWith("soap"))
- {
- for (String prop : _soapPropList)
- {
- value = props.getProperty(prop);
- if (null == value)
- {
- return false;
- }
- }
- return true;
- }
- return false;
- }
-} // end class
-
diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/AppInfo.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/AppInfo.java
deleted file mode 100644
index 3b03e2d680..0000000000
--- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/AppInfo.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.info;
-
-import org.apache.qpid.common.QpidProperties;
-import org.apache.qpid.server.configuration.ServerConfiguration;
-import org.apache.qpid.server.registry.ApplicationRegistry;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.TreeMap;
-
-/** AppInfo class is gathering application specific information */
-public class AppInfo
-{
-
- private static final List<String> appProps = Arrays.asList("QPID_HOME",
- "QPID_WORK");
-
- private static Map<String, String> appInfoMap = new TreeMap<String, String>();
-
- private AppInfo()
- {
- }
-
- /**
- * getInfo method retrieves a key-value map for specific application properties
- *
- * @return Map<String,String>
- */
- public static Map<String, String> getInfo()
- {
-
- // Gather the selected app props
- Properties sysprops = System.getProperties();
- String propName;
- for (Iterator<Entry<Object, Object>> it = sysprops.entrySet()
- .iterator(); it.hasNext();)
- {
- Entry<Object, Object> en = it.next();
- propName = en.getKey().toString();
- if (appProps.indexOf(propName) >= 0)
- {
- appInfoMap.put(propName, en.getValue().toString());
- }
- }
-
- ServerConfiguration sc;
- try
- {
- sc = ApplicationRegistry.getInstance().getConfiguration();
- if (null != sc)
- {
- appInfoMap.put("jmxport", sc.getJMXPortRegistryServer() + "");
- appInfoMap.put("port", sc.getPorts().toString());
- appInfoMap.put("version", QpidProperties.getReleaseVersion());
- appInfoMap.put("vhosts", "standalone");
- appInfoMap.put("KeystorePath", sc.getConnectorKeyStorePath());
- appInfoMap.put("PluginDirectory", sc.getPluginDirectory());
- appInfoMap.put("KeyManagerFactoryAlgorithm", sc.getConnectorKeyManagerFactoryAlgorithm());
- appInfoMap.put("QpidWork", sc.getQpidWork());
- appInfoMap.put("Bind", sc.getBind());
- }
- }
- catch (Exception e)
- {
- // drop everything to be silent
- }
- return appInfoMap;
-
- }
-
-}
diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Info.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Info.java
deleted file mode 100644
index 2fb9382526..0000000000
--- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/Info.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-/**
- *
- * @author sorin
- *
- * Info object
- */
-
-package org.apache.qpid.info;
-
-import org.apache.qpid.info.util.XMLWriter;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * The Info class encapsulates all the information we are collecting
- * and it is able to render it in different data representations
- */
-public class Info<T extends Map<String, ?>>
-{
- private T _info;
-
- /**
- * Constructor.
- *
- * @param info instantiates the object with a Map<String,?>
- */
- public Info(T info)
- {
- _info = info;
- }
-
- @Override
- public String toString()
- {
- String result = "";
- for (Iterator<String> it = _info.keySet().iterator(); it.hasNext();)
- {
- String str = it.next();
- result += str + "=" + _info.get(str).toString() + "\n";
- }
- return result;
- }
-
- /**
- * Renders Info map to a property object
- *
- * @return A Properties object representing the Info map
- */
- public Properties toProps()
- {
- Properties props = new Properties();
- if (null == _info)
- {
- return null;
- }
- for (Iterator<String> it = _info.keySet().iterator(); it.hasNext();)
- {
- String key = it.next();
- props.put(key, _info.get(key));
- }
- return props;
- }
-
- /**
- * Renders Info map to a StringBuffer
- *
- * @return A StringBuffer object representing the Info map
- */
- public StringBuffer toStringBuffer()
- {
- StringBuffer sb = new StringBuffer();
- for (Iterator<String> it = _info.keySet().iterator(); it.hasNext();)
- {
- String str = it.next();
- sb.append(str + "=" + _info.get(str).toString() + "\n");
- }
- return sb;
- }
-
- /**
- * Renders Info map to a StringBuffer containing an XML string
- *
- * @return A StringBuffer object containing an XML representation of the Info map
- */
- public StringBuffer toXML()
- {
- XMLWriter xw = new XMLWriter(new StringBuffer());
- xw.writeXMLHeader();
- Map<String, String> attr = new HashMap<String, String>();
- xw.writeOpenTag("qpidinfo", attr);
- String key;
- for (Iterator<String> it = _info.keySet().iterator(); it.hasNext();)
- {
- attr.clear();
- key = it.next();
- xw.writeTag(key, attr, _info.get(key).toString());
- }
- xw.writeCloseTag("qpidinfo");
- return xw.getXML();
- }
-
- /**
- * Renders Info map to a HashMap
- *
- * @return A HashMap object representing the Info map
- */
- public HashMap<String, String> toMap()
- {
- String key;
- HashMap<String, String> infoMap = new HashMap<String, String>();
- for (Iterator<String> it = _info.keySet().iterator(); it.hasNext();)
- {
- key = it.next();
- infoMap.put(key, _info.get(key).toString());
- }
- return infoMap;
- }
-
-}
diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoService.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoService.java
deleted file mode 100644
index 2804dfb1b4..0000000000
--- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
- /**
- * Interface exposing the service methods
- */
- package org.apache.qpid.info;
-
- public interface InfoService
- {
- public Info<?> invoke(String action);
- }
diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoServiceImpl.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoServiceImpl.java
deleted file mode 100644
index 08caa794fa..0000000000
--- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/InfoServiceImpl.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-/**
- *
- * @author sorin
- *
- * Implementation for Info service
- */
-
-package org.apache.qpid.info;
-
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-
-public class InfoServiceImpl implements InfoService
-{
-
- private SortedMap<String, String> infoMap = new TreeMap<String, String>();
-
- /**
- * invoke method collects all the information from System and Application
- * and encapsulates them in an Info object
- * @return An instance of an Info object
- */
- public Info<? extends Map<String,?>> invoke(String action)
- {
- // Record the action (STARTUP/SHUTDOWN)
- infoMap.put("action",action);
-
- // Record the current time stamp
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ");
- infoMap.put("time", sdf.format(Calendar.getInstance().getTime()));
-
- // Add the system specific properties
- infoMap.putAll(SystemInfo.getInfo());
-
- // Add the application specific properties
- infoMap.putAll(AppInfo.getInfo());
-
- return new Info<SortedMap<String, String>>(infoMap);
- }
-
-}
diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/SystemInfo.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/SystemInfo.java
deleted file mode 100644
index cf370d7384..0000000000
--- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/SystemInfo.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.info;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.TreeMap;
-
-/**
- * Collector for system specific information
- */
-public class SystemInfo
-{
-
- private static Map<String, String> sysInfoMap = new TreeMap<String, String>();
-
- private static final List<String> sysProps = Arrays.asList(
- "java.class.path", "java.home", "java.vm.name", "java.vm.vendor",
- "java.vm.version", "java.class.version", "java.runtime.version",
- "os.arch", "os.name", "os.version", "sun.arch.data.model",
- "user.home", "user.dir", "user.name", "user.timezone");
-
- private SystemInfo()
- {
- }
-
- /**
- * getInfo collects all the properties specified in sysprops list
- * @return A Map<String,String>
- */
- public static Map<String, String> getInfo()
- {
-
- // Get the hostname
- try
- {
- InetAddress addr = InetAddress.getLocalHost();
- String hostname = addr.getHostName();
- sysInfoMap.put("hostname", hostname);
- sysInfoMap.put("ip", addr.getHostAddress());
- }
- catch (UnknownHostException e)
- {
- // drop everything to be silent
- }
- // Get the runtime info
- sysInfoMap.put("CPUCores", Runtime.getRuntime().availableProcessors()
- + "");
- sysInfoMap.put("Maximum_Memory", Runtime.getRuntime().maxMemory() + "");
- sysInfoMap.put("Free_Memory", Runtime.getRuntime().freeMemory() + "");
-
- // Gather the selected system props
- Properties sysprops = System.getProperties();
- String propName;
- for (Iterator<Entry<Object, Object>> it = sysprops.entrySet()
- .iterator(); it.hasNext();)
- {
- Entry<Object, Object> en = it.next();
- propName = en.getKey().toString();
- if (sysProps.indexOf(propName) >= 0)
- {
- sysInfoMap.put(propName, en.getValue().toString());
- }
- }
-
- return sysInfoMap;
-
- }
-
-}
diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/HttpPoster.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/HttpPoster.java
deleted file mode 100644
index 3526e01374..0000000000
--- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/HttpPoster.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.info.util;
-
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.net.InetAddress;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-
-/**
- *
- * An simple Http post class for qpid info service
- */
-public class HttpPoster implements Runnable
-{
- private final String _url;
-
- private final Hashtable<String, String> _header;
-
- private final List<String> _response = new ArrayList<String>();
-
- private final StringBuffer _buf;
-
- /**
- * Constructor
- *
- * @param props Properties containing the URL
- * @param buf Buffer containing the message to be posted
- */
- public HttpPoster(Properties props, StringBuffer buf)
- {
- _buf = buf;
- if (null != props)
- {
- _url = props.getProperty("http.url");
- _header = new Hashtable<String, String>();
- try
- {
- String hostname = InetAddress.getLocalHost().getHostName();
- _header.put("hostname", hostname);
- }
- catch (UnknownHostException e)
- {
- // Silently ignoring the error ;)
- }
- }
- else
- {
- _url = null;
- _header = null;
- }
- }
-
- /** Posts the message from the _buf StringBuffer to the http server */
- public void run()
- {
- if (null == _url)
- {
- return;
- }
- String line;
- URL urlDest;
- URLConnection urlConn;
- try
- {
- urlDest = new URL(_url);
- urlConn = urlDest.openConnection();
- urlConn.setDoOutput(true);
- urlConn.setUseCaches(false);
- for (Iterator<String> it = _header.keySet().iterator(); it.hasNext();)
- {
- String prop = it.next();
- urlConn.setRequestProperty(prop, _header.get(prop));
- }
- OutputStreamWriter wr =
- new OutputStreamWriter(urlConn.getOutputStream());
- wr.write(_buf.toString());
- wr.flush();
- // Get the response
- BufferedReader rd = new BufferedReader(new InputStreamReader(
- urlConn.getInputStream()));
- while ((line = rd.readLine()) != null)
- {
- _response.add(line);
- }
- }
- catch (Exception ex)
- {
- // Silently ignoring the error ;)
- }
- }
-
- /**
- * Retrieves the response from the http server
- *
- * @return List<String> response received from the http server
- */
- public List<String> get_response()
- {
- return _response;
- }
-
-}
diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/IniFileReader.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/IniFileReader.java
deleted file mode 100644
index 60a025d322..0000000000
--- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/IniFileReader.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.info.util;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * This class is simple implementation of an ini file reader. It expects a
- * file with the following structure:
- *
- * ; global values, can be overwritten in sections
- * key1=value1
- * key2=value2
- *
- * [Section1]
- * key1=value1_new ; overwriting the global key1
- * key3=value3
- * key4=value4
- *
- * [Section2]
- * key5=value5
- * key6=value6
- * key7=value7
- *
- * Note: Commentaries are preceded by ; or # and are supported throughout
- * A commentary line at the end of section is interpreted as
- * a section end marker
- *
- * A structure <String,Properties> (section name, associated properties)
- * is generated as a result of processing the ini file.
- */
-public class IniFileReader
-{
- private final Map<String, Properties> _sections;
-
- private final String COMMENT_SEMICOLON = ";";
-
- private final String COMMENT_HASH = "#";
-
- enum State
- {
- IN_SECTION, OFF_SECTION, GLOBAL
- }
-
- /*
- * IniFileReader constructor
- */
-
- public IniFileReader()
- {
- _sections = new HashMap<String, Properties>();
- }
-
- /**
- * Cleans up the after comments or the empty spaces/tabs surrounding the given string
- *
- * @param str The String to be cleaned
- *
- * @return String Cleanup Version
- */
- private String cleanUp(String str)
- {
- if (str.contains(COMMENT_SEMICOLON))
- {
- str = str.substring(0, str.indexOf(COMMENT_SEMICOLON));
- }
- if (str.contains(COMMENT_HASH))
- {
- str = str.substring(0, str.indexOf(COMMENT_HASH));
- }
- return str.trim();
- }
-
- /**
- * Loads and parses the ini file with the full path specified in the argument
- *
- * @param fileName Full path to the ini file
- *
- * @throws IllegalArgumentException If the file cannot be processed
- */
- public void load(String fileName) throws IllegalArgumentException
- {
- if (!new File(fileName).isFile())
- {
- throw new IllegalArgumentException("File: " + fileName + " does not exist or cannot be read.");
- }
- State state = State.GLOBAL;
- String line;
- Properties sectionProps = new Properties();
- String sectionName = "";
- try
- {
- BufferedReader in = new BufferedReader(new FileReader(fileName));
- while ((line = in.readLine()) != null)
- {
- String str = cleanUp(line);
-
- // Did we get a section header?
- if (str.startsWith("["))
- {
- if (!str.endsWith("]"))
- {
- // Index of 1 to skip '['
- throw new IllegalArgumentException(str.substring(1)
- + " is not closed");
- }
-
- // We encountered a new section header
- if (state != State.IN_SECTION)
- {
- _sections.put(sectionName, sectionProps);
- sectionProps = new Properties();
- sectionName = str.replace("[", "").replace("]", "")
- .trim();
- state = State.IN_SECTION;
- }
- }
-
- // Any other line tested separately, ignore if out of a section
- // and add if in section
- if (str.length() == 0)
- {
- // We encountered a commented or an empty line, both cases
- // mean we are off the section
- if (state == State.IN_SECTION)
- {
- _sections.put(sectionName, sectionProps);
- state = State.OFF_SECTION;
- }
- }
- else
- {
- // proper line, add it to the props
- if (state != State.OFF_SECTION)
- {
- if (str.contains("="))
- {
- int ix = str.indexOf("=");
- sectionProps.put(str.substring(0, ix).trim(), str
- .substring(ix + 1).trim());
- }
- }
- }
- }
- in.close();
- }
- catch (IOException e)
- {
- _sections.clear();
- return;
- }
- if (state != State.OFF_SECTION)
- {
- _sections.put(sectionName, sectionProps);
- }
- }
-
- /**
- * Getter for the Sections Map
- *
- * @return Map<String,Properties> The parsed content of the ini file in this structure
- */
- public Map<String, Properties> getSections()
- {
- return _sections;
- }
-
-}
diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/SoapClient.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/SoapClient.java
deleted file mode 100644
index 0f66085fc3..0000000000
--- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/SoapClient.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-/**
- *
- * @author sorin
- *
- * An simple SOAP client for qpid info service
- */
-package org.apache.qpid.info.util;
-
-import java.io.BufferedWriter;
-import java.io.OutputStreamWriter;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.util.HashMap;
-import java.util.Properties;
-
-public class SoapClient
-{
-
- private final StringBuffer _xmlData;
-
- private final Properties _destprops;
-
- private final String _hostname;
-
- private final int _port;
-
- private final String _urlpath;
-
- private final String _soapenvelope;
-
- private final String _soapaction;
-
- private final StringBuffer _soapMessage = new StringBuffer();
-
-
- public SoapClient(HashMap<String, String> map, Properties destprops)
- {
- _destprops = destprops;
- _hostname = (String) _destprops.get("soap.hostname");
- _port = Integer.parseInt((String) _destprops.get("soap.port"));
- _urlpath = (String) destprops.get("soap.path");
- _soapenvelope = (String) destprops.get("soap.envelope");
- _soapaction = (String) destprops.get("soap.action");
- _xmlData = new StringBuffer(_soapenvelope);
- replaceVariables(map);
- }
-
- public StringBuffer getXMLData()
- {
- return _xmlData;
- }
-
- public StringBuffer getSoapMessage() {
- return _soapMessage;
- }
-
- public String getSoapEnvelope() {
- return _soapenvelope;
- }
-
- /**
- * Clears and sets new XML data
- * @param sb the new data to set
- */
- public void setXMLData(StringBuffer sb)
- {
- _xmlData.delete(0, _xmlData.length());
- _xmlData.append(sb);
- }
-
-
- public void replaceVariables(HashMap<String, String> vars)
- {
- int ix = 0;
- for (String var : vars.keySet())
- {
- while ((ix = _xmlData.indexOf("@" + var.toUpperCase())) >= 0)
- {
- _xmlData.replace(ix, ix + 1 + var.length(), vars.get(var));
- }
- }
- }
-
- public void replaceVariables(Properties varProps)
- {
- if (varProps == null)
- {
- return;
- }
- int ix = 0;
- for (Object var : varProps.keySet())
- {
- while ((ix = _xmlData.indexOf("@" + var)) >= 0)
- {
- _xmlData.replace(ix, ix + 1 + var.toString().length(), varProps
- .get(var).toString());
- }
- }
- }
-
-
- public void sendSOAPMessage()
- {
-
- try
- {
- InetAddress addr = InetAddress.getByName(_hostname);
- Socket sock = new Socket(addr, _port);
- StringBuffer sb = new StringBuffer();
- sb.append("POST " + _urlpath + " HTTP/1.1\r\n");
- sb.append("Host: " + _hostname + ":" + _port + "\r\n");
- sb.append("Content-Length: " + _xmlData.length() + "\r\n");
- sb.append("Content-Type: text/xml; charset=\"utf-8\"\r\n");
- sb.append("SOAPAction: \"urn:"+ _soapaction +"\"\r\n");
- sb.append("User-Agent: Axis2\r\n");
- sb.append("\r\n");
- // Send header
- BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sock
- .getOutputStream(), "UTF-8"));
- synchronized(_soapMessage) {
- _soapMessage.setLength(0);
- _soapMessage.append(sb);
- _soapMessage.append(_xmlData);
- }
- // Send data
- wr.write(_soapMessage.toString());
- wr.flush();
- wr.close();
-
- } catch (Exception ex)
- {
- // Drop any exception
- }
- }
-}
diff --git a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/XMLWriter.java b/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/XMLWriter.java
deleted file mode 100644
index 6bea9d2ac0..0000000000
--- a/java/broker-plugins/experimental/info/src/main/java/org/apache/qpid/info/util/XMLWriter.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.info.util;
-
-import java.util.Map;
-
-/**
- *
- * Naive and rudimentary XML writer
- * It has methods to write the header, a tag with attributes
- * and values. It escapes the XML special characters
- */
-public class XMLWriter
-{
-
- private final StringBuffer _sb;
-
- private final String INDENT = " ";
-
- public XMLWriter(StringBuffer sb)
- {
- _sb = sb;
- }
-
- public StringBuffer getXML()
- {
- return _sb;
- }
-
- public void writeXMLHeader()
- {
- _sb.append("<?xml version=\"1.0\"?>\n");
- }
-
- public void writeTag(String tagName, Map<String, String> attributes,
- String value)
- {
- writeOpenTag(tagName, attributes);
- writeValue(value);
- writeCloseTag(tagName);
- }
-
- public void writeOpenTag(String tagName, Map<String, String> attributes)
- {
- _sb.append("<").append(tagName);
- if (null == attributes)
- {
- _sb.append(">\n");
- return;
- }
- for (String key : attributes.keySet())
- {
- _sb.append(" ").append(key + "=\"" + attributes.get(key) + "\"");
- }
- _sb.append(">\n");
-
- }
-
- private void writeValue(String val)
- {
- _sb.append(INDENT).append(escapeXML(val) + "\n");
- }
-
- public void writeCloseTag(String tagName)
- {
- _sb.append("</" + tagName + ">\n");
- }
-
- private String escapeXML(String xmlStr)
- {
- if (null == xmlStr)
- {
- return null;
- }
- xmlStr = xmlStr.replaceAll("&", "&amp;");
- xmlStr = xmlStr.replace("<", "&lt;");
- xmlStr = xmlStr.replace(">", "&gt;");
- xmlStr = xmlStr.replace("\"", "&quot;");
- xmlStr = xmlStr.replace("'", "&apos;");
- return xmlStr;
- }
-
-}
diff --git a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/systest/InfoPluginTest.java b/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/systest/InfoPluginTest.java
deleted file mode 100644
index 9f38ab253d..0000000000
--- a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/systest/InfoPluginTest.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.info.systest;
-
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-public class InfoPluginTest extends QpidBrokerTestCase
-{
- private String QPID_HOME = null;
-
- private ServerSocket _server = null;
-
- private int _port;
-
- private static final String CR = System.getProperty("line.separator");
-
- private static final String FS = File.separator;
-
- private final String _cfgRelPath = "etc" + FS + "qpidinfo.ini";
-
- private File _tmpCfgFile;
-
- private final String _soapEnvelopeHead = "<?xml version=\"1.0\"?><soap:Envelope xmlns:soap=\"http://www.w3.org/2001/12/soap-envelope\" soap:encodingStyle=\"http://www.w3.org/2001/12/soap-encoding\">";
-
- private final String _soapEnvelopeTail = "</soap:Envelope>";
-
- private String _soapMessage1 = "@ACTION" + "-" + "@VERSION";
-
- private String _soapMessage2 = "@VERSION" + "-" + "@ACTION";
-
- private CountDownLatch _latch = new CountDownLatch(2);
-
- private final List<List<String>> _recv = new ArrayList<List<String>>();
-
- private Thread _socketAcceptor;
-
- public void setUp() throws Exception
- {
- QPID_HOME = System.getProperty("QPID_HOME");
- if (QPID_HOME != null)
- {
- System.out.println("QPID_HOME=" + QPID_HOME);
- }
- else
- {
- fail("QPID_HOME not set");
- }
-
- startSoapServer();
- // Must start the server first to identify a free port.
- createConfigFile();
- }
-
- public void tearDown() throws Exception
- {
- System.out.println("*** Stopping socket server...");
- _socketAcceptor.join(2000);
-
- System.out.println("*** Deleting the config file...");
- if (_tmpCfgFile.isFile())
- {
- _tmpCfgFile.delete();
- }
- super.tearDown();
- }
-
- private void createConfigFile()
- {
- try
- {
- _tmpCfgFile = new File(QPID_HOME + FS + _cfgRelPath);
- _tmpCfgFile.deleteOnExit();
- if (_tmpCfgFile.isFile())
- {
- _tmpCfgFile.delete();
- }
- assertTrue("Unable to create file.", _tmpCfgFile.createNewFile());
- assertTrue(_tmpCfgFile.isFile());
- FileWriter fwriter = new FileWriter(_tmpCfgFile);
- BufferedWriter writer = new BufferedWriter(fwriter);
- writer.write("protocol=soap");
- writer.write(CR);
- writer.write("soap.hostname=localhost");
- writer.write(CR);
- writer.write("soap.port=" + _port);
- writer.write(CR);
- writer.write(CR);
- writer.write("[MSG1]");
- writer.write(CR);
- writer.write("soap.path=/info1");
- writer.write(CR);
- writer.write("soap.action=submitinfo1");
- writer.write(CR);
- writer.write("soap.envelope=" + _soapEnvelopeHead + _soapMessage1
- + _soapEnvelopeTail);
- writer.write(CR);
- writer.write(CR);
- writer.write("[MSG2]");
- writer.write(CR);
- writer.write("soap.path=/info2");
- writer.write(CR);
- writer.write("soap.action=submitinfo2");
- writer.write(CR);
- writer.write("soap.envelope=" + _soapEnvelopeHead + _soapMessage2
- + _soapEnvelopeTail);
- writer.write(CR);
- writer.write(CR);
- writer.close();
- assertTrue("Config file size is zero", _tmpCfgFile.length() > 0);
- }
- catch (IOException e)
- {
- fail("Unable to create the qpidinfo.properties due to: "
- + e.getMessage());
- }
- }
-
- private void startSoapServer() throws Exception
- {
- try
- {
- _server = new ServerSocket(0);
- _port = _server.getLocalPort();
- assertTrue("Server not yet bound.", _port != -1);
-
- assertNotNull("SocketServer is null", _server);
- }
- catch (Exception ex)
- {
- fail("Unable to start the socket server due to: " + ex.getMessage());
- }
-
- _socketAcceptor = new Thread()
- {
- public void run()
- {
- while (true)
- {
- try
- {
- Socket socket = _server.accept();
- new ConnectionHandler(socket);
- }
- catch (IOException e)
- {
- fail("Error opening the socket in accept mode");
- }
- }
- }
- };
- _socketAcceptor.start();
- System.out.println("*** Socket server started...");
- }
-
- class ConnectionHandler implements Runnable
- {
- private Socket _socket;
-
- public ConnectionHandler(Socket socket)
- {
- _socket = socket;
- Thread t = new Thread(this);
- t.start();
- }
-
- public void run()
- {
- System.out.println("*** Connection handler running...");
- List<String> buf = new ArrayList<String>();
- String line;
- try
- {
- BufferedReader br = new BufferedReader(new InputStreamReader(
- _socket.getInputStream()));
- assertNotNull(br);
- while ((line = br.readLine()) != null)
- {
- buf.add(line);
- }
- br.close();
- System.out.println("*** Received buffer: " + buf);
- synchronized (_recv)
- {
- _recv.add(buf);
- }
-
- System.out.println("*** Latch countdown");
- _latch.countDown();
- }
- catch (Exception ex)
- {
- ex.printStackTrace();
- fail("Exception while reading from the socket");
- }
-
- }
-
- }
-
- public void testInfoPlugin() throws Exception
- {
- //Start the broker
- super.setUp();
- if (!_latch.await(10, TimeUnit.SECONDS))
- {
- fail("Timeout awaiting for the latch, upon startup");
- }
-
- validateResponses("STARTUP");
-
- _recv.clear();
- _latch = new CountDownLatch(2);
-
- stopBroker();
-
- if (!_latch.await(10, TimeUnit.SECONDS))
- {
- fail("Timeout awaiting for the latch, upon shutdown");
- }
-
- validateResponses("SHUTDOWN");
-
- }
-
- /**
- * Check the responses from the server to ensure they contain the required messages.
- * @param action String to match for the SHUTDOWN or STARTUP action.
- */
- private void validateResponses(String action)
- {
- assertTrue("Received less than 2 messages", _recv.size() > 1);
-
- // Message 1
- assertTrue("Message does not contain Host: localhost:" + _port + "\n" + _recv.get(0), _recv.get(0).contains("Host: localhost:" + _port));
- assertTrue("Message does not contain: User-Agent: Axis2 " + "\n" + _recv.get(0), _recv.get(0).contains("User-Agent: Axis2"));
- assertTrue("Message does not contain: SOAPAction: \"urn:submitinfo\"" + "\n" + _recv.get(0).get(4), _recv.get(0).get(4).startsWith("SOAPAction: \"urn:submitinfo"));
- assertTrue("Message does not contain '" + action + "' in the soap envelope" + "\n" + _recv.get(0).get(7), _recv.get(0).get(7).contains(action));
-
- // Message 2
- assertTrue("Message does not contain Host: localhost:" + _port + "\n" + _recv.get(1), _recv.get(1).contains("Host: localhost:" + _port));
- assertTrue("Message does not contain: User-Agent: Axis2 " + "\n" + _recv.get(1), _recv.get(1).contains("User-Agent: Axis2"));
- assertTrue("Message does not contain: SOAPAction: \"urn:submitinfo\"" + "\n" + _recv.get(1).get(4), _recv.get(1).get(4).startsWith("SOAPAction: \"urn:submitinfo"));
- assertTrue("Message does not contain '" + action + "' in the soap envelope" + "\n" + _recv.get(1).get(7), _recv.get(1).get(7).contains(action));
- }
-
-}
diff --git a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/HttpPosterTest.java b/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/HttpPosterTest.java
deleted file mode 100644
index 0adb543fd4..0000000000
--- a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/HttpPosterTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.info.test;
-
-import junit.framework.TestCase;
-import org.mortbay.jetty.testing.ServletTester;
-
-import org.apache.qpid.info.util.HttpPoster;
-
-import java.util.List;
-import java.util.Properties;
-
-/*
- * This test verifies that the plugin posts correctly to a webserver
- * We use an embedded jetty container to mimic the webserver
- */
-public class HttpPosterTest extends TestCase
-{
-
- private ServletTester tester;
-
- private String baseURL;
-
- private final String contextPath = "/info";
-
- /*
- * This method generates a dummy HttpPoster with a dummy body containing a
- * single line. The url we are posting to can be controlled by the parameter
- * url
- *
- * @param url
- */
- private HttpPoster getHttpPoster(String url)
- {
- StringBuffer sb = new StringBuffer("test=TEST");
- Properties props = new Properties();
- props.put("http.url", url);
- return new HttpPoster(props, sb);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see junit.framework.TestCase#setUp()
- */
- protected void setUp() throws Exception
- {
- tester = new ServletTester();
- tester.setContextPath("/");
- tester.addServlet(InfoServlet.class, contextPath);
- baseURL = tester.createSocketConnector(true);
- tester.start();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see junit.framework.TestCase#tearDown()
- */
- protected void tearDown() throws Exception
- {
- super.tearDown();
- tester.stop();
- }
-
- /*
- * This test is posting a string to an embedded Jetty Servlet and captures
- * the response message. If the servlet receives the message ok, it will
- * print Ok. A failure test is following where we post to a non-existent URL
- */
- public void testHttpPoster() throws Exception
- {
- // Test HttpPoster posts correctly to the servlet
- HttpPoster hp = getHttpPoster(baseURL + contextPath);
- assertNotNull(hp);
- hp.run();
- List<String> response = hp.get_response();
- assertTrue(response.size() > 0);
- assertEquals("OK <br>", response.get(0).toString());
-
- // Failure Test
- hp = getHttpPoster("http://localhost/nonexistent");
- hp.run();
- response = hp.get_response();
- assertTrue(response.size() == 0);
-
- }
-
-}
diff --git a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoServiceImplTest.java b/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoServiceImplTest.java
deleted file mode 100644
index 1e0b6ccccc..0000000000
--- a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoServiceImplTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.info.test;
-
-import junit.framework.TestCase;
-
-import org.apache.qpid.info.Info;
-import org.apache.qpid.info.InfoServiceImpl;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-/*
- * This test verifies the invoke() method for the info service making sure that the parameters are returned
- */
-public class InfoServiceImplTest extends TestCase
-{
-
- private InfoServiceImpl _isi = null;
-
- @SuppressWarnings("unchecked")
- public void testInvoke()
- {
- _isi = new InfoServiceImpl();
- assertNotNull(_isi);
- Info<? extends Map<String, String>> info = (Info<? extends Map<String, String>>) _isi
- .invoke("START");
- assertNotNull(info);
- Properties props = info.toProps();
- assertNotNull(props);
- List<String> infoProps = Arrays.asList("java.class.path",
- "java.vm.name", "java.class.version", "os.arch", "os.name",
- "os.version", "sun.arch.data.model", "user.dir", "user.name",
- "user.timezone");
- for (String tag : infoProps)
- {
- assertNotNull("Info.toProps() does not have the property: " + tag,
- props.getProperty(tag));
- }
- }
-
-}
diff --git a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoServlet.java b/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoServlet.java
deleted file mode 100644
index 07fc371bad..0000000000
--- a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoServlet.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.info.test;
-
-import javax.servlet.GenericServlet;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.PrintWriter;
-
-/*
- * This is a servlet used by the embedded Jetty to be able to receive http post
- * from the info plugin
- */
-
-public class InfoServlet extends GenericServlet
-{
- private static final long serialVersionUID = 1L;
-
- @Override
- public void service(ServletRequest request, ServletResponse response)
- throws ServletException, IOException
- {
- String line;
- BufferedReader in = request.getReader();
- while ((line = in.readLine()) != null)
- {
- System.out.println(line);
- }
- response.setContentType("text/html");
- PrintWriter out = response.getWriter();
- out.println("OK <br>\n");
- System.out.println("ServletResponse: OK");
- }
-
-} \ No newline at end of file
diff --git a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoTest.java b/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoTest.java
deleted file mode 100644
index d154757058..0000000000
--- a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/InfoTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.info.test;
-
-import junit.framework.TestCase;
-
-import org.apache.qpid.info.Info;
-
-import java.util.HashMap;
-import java.util.Properties;
-
-/*
- * This test verifies the toString(), toProps(), toXML() and toStringBuffer() methods of the Info object
- *
- */
-public class InfoTest extends TestCase
-{
- private HashMap<String, String> _infoPayLoad = null;
-
- private Info<HashMap<String, String>> _info = null;
-
- protected void setUp() throws Exception
- {
- super.setUp();
- _infoPayLoad = new HashMap<String, String>();
- _infoPayLoad.put("test", "Test");
- _info = new Info<HashMap<String, String>>(_infoPayLoad);
- }
-
- /*
- * Test the conversion toString() of the Info object
- */
- public void testToString()
- {
- assertNotNull("toString() returned null", _info.toString());
- assertEquals("toString() did not return the proper string",
- "test=Test\n", _info.toString());
- }
-
- /*
- * Test the conversion toProps() of the Info object
- */
- public void testToProps()
- {
- Properties props = new Properties();
- props.put("test", "Test");
- assertNotNull("toProperties() returned null", _info.toProps());
- assertEquals("toProperties not returned the proper object", props, _info
- .toProps());
- }
-
- /*
- * Test the conversion toStringBuffer() of the Info object
- */
- public void testToStringBuffer()
- {
- StringBuffer sb = new StringBuffer("test=Test\n");
- assertNotNull(_info.toStringBuffer());
- assertEquals(sb.toString(), _info.toStringBuffer().toString());
- }
-
- /*
- * Test conversion toXML() of the info object
- */
- public void testToXML()
- {
- String INDENT = " ";
- StringBuffer sb = new StringBuffer();
- sb.append("<?xml version=\"1.0\"?>\n");
- sb.append("<qpidinfo>\n");
- sb.append("<test>\n");
- sb.append(INDENT + "Test\n");
- sb.append("</test>\n");
- sb.append("</qpidinfo>\n");
- assertEquals("toString() does not return the proper string", _info
- .toXML().toString(), sb.toString());
- }
-
- /*
- * Test the conversion toMap() of the Info object
- */
- public void testToMap()
- {
- HashMap<String, String> thm = _info.toMap();
- assertFalse("toMap() returned empty map", thm.isEmpty());
- assertEquals("testToMap did not returned 1", 1, thm.size());
- assertTrue("toMap() returned a map not containing expected key: test",
- thm.containsKey("test"));
- assertTrue(
- "toMap() returned a map not containing the value for key test: Test",
- thm.containsValue("Test"));
-
- }
-
-}
diff --git a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/IniFileReaderTest.java b/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/IniFileReaderTest.java
deleted file mode 100644
index bae1d7bd2a..0000000000
--- a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/IniFileReaderTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.info.test;
-
-import junit.framework.TestCase;
-
-import org.apache.qpid.info.util.IniFileReader;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Test the Loading of the ini file reader by first writing
- * out a correct ini file.
- */
-public class IniFileReaderTest extends TestCase
-{
-
- public void testLoad()
- {
- IniFileReader ifr = new IniFileReader();
- File iniFile = null;
- try
- {
- iniFile = File.createTempFile("temp", "ini");
- iniFile.deleteOnExit();
- BufferedWriter writer = new BufferedWriter(new FileWriter(iniFile));
- writer.write("# Global Comment1\n");
- writer.write("globalprop1=globalval1\n");
- writer.write("globalprop2=globalval2\n");
- writer.write("\n");
- writer.write("[Section1] # Comment on Section\n");
- writer.write("key1=val1 # Comment on Value\n");
- writer.write("key2=val2\n");
- writer.write("\n");
- writer.write("#Section2 Comment\n");
- writer.write("[Section2]\n");
- writer.write("key3=val3\n");
- writer.write("key4=val4\n");
- writer.write("key5=val5\n");
- writer.write("\n");
- writer.write("[Section3]\n");
- writer.write("key6=val6\n");
- writer.write("key7=val7\n");
- writer.write("\n");
- writer.close();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- fail("Unable to create temporary File");
- }
- ifr.load(iniFile.getAbsolutePath());
- Map<String, Properties> sections = ifr.getSections();
- assertNotNull("Sections not null", sections);
- assertEquals("Have 4 sections", sections.keySet().size(), 4);
- assertTrue("Get globalprop1", sections.get("").getProperty("globalprop1").equals("globalval1"));
- assertTrue("Get globalprop2", sections.get("").getProperty("globalprop2").equals("globalval2"));
- assertNotNull("Section1 not null", sections.get("Section1"));
- assertEquals("Section1 has 2 properties", sections.get("Section1").size(), 2);
- assertTrue("Section1 key1 has val1", sections.get("Section1").getProperty("key1").equals("val1"));
- assertTrue("Section1 key2 has val2", sections.get("Section1").getProperty("key2").equals("val2"));
- assertEquals("Section2 has 3 properties", sections.get("Section2").size(), 3);
- assertTrue("Section2 key3 has val3", sections.get("Section2").getProperty("key3").equals("val3"));
- assertTrue("Section2 key4 has val4", sections.get("Section2").getProperty("key4").equals("val4"));
- assertTrue("Section2 key5 has val5", sections.get("Section2").getProperty("key5").equals("val5"));
- assertEquals("Section3 has 2 properties", sections.get("Section3").size(), 2);
- assertTrue("Section3 key6 has val6", sections.get("Section3").getProperty("key6").equals("val6"));
- assertTrue("Section3 key7 has val7", sections.get("Section3").getProperty("key7").equals("val7"));
- }
-
- /**
- * Test to ensure that the loading of a file with an unclosed section header
- * fails to parse.
- *
- * Section needs to be fully enclosed in square brackets '[<name>]'
- */
- public void testIncompleteSection1Load()
- {
- IniFileReader ifr = new IniFileReader();
- File iniFile = null;
- try
- {
- iniFile = File.createTempFile(getName(), "ini");
- iniFile.deleteOnExit();
- BufferedWriter writer = new BufferedWriter(new FileWriter(iniFile));
- writer.write("# Global Comment1\n");
- writer.write("globalprop1=globalval1\n");
- writer.write("globalprop2=globalval2\n");
- writer.write("\n");
- writer.write("[Section1\n"); // Note '[Section1' not complete
- writer.write("key1=val1\n");
- writer.write("key2=val2\n");
- writer.write("\n");
- writer.close();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- fail("Unable to create temporary File");
- }
- try
- {
- ifr.load(iniFile.getAbsolutePath());
- fail("File should fail to parse");
- }
- catch (IllegalArgumentException iae)
- {
- assertEquals("Incorrect Exception", "Section1 is not closed", iae.getMessage());
- }
-
- }
-
-}
diff --git a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SoapClientTest.java b/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SoapClientTest.java
deleted file mode 100644
index ffb7a910b8..0000000000
--- a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SoapClientTest.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.info.test;
-
-import junit.framework.TestCase;
-
-import org.apache.qpid.info.util.SoapClient;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Properties;
-
-public class SoapClientTest extends TestCase
-{
-
- private int _port;
-
- private final String _hostName = "localhost";
-
- private final String _urlPath = "/testSoap";
-
- private ServerSocket _server = null;
-
- /*
- * Generate a soap client from a custom URL, hostname, port and soap context
- * path to be derived
- */
- private SoapClient getSoapClient()
- {
- Properties destprops = new Properties();
- destprops.setProperty("soap.hostname", _hostName);
- destprops.setProperty("soap.port", _port + "");
- destprops.setProperty("soap.urlpath", _urlPath);
- destprops.setProperty("soap.envelope", "<ip>@IP</ip>");
- destprops.setProperty("soap.action", "send");
- HashMap<String, String> soapmap = new HashMap<String, String>();
- soapmap.put("IP", "127.0.0.1");
- return new SoapClient(soapmap, destprops);
- }
-
- /*
- * A connection handler class that verifies the correct message is received
- *
- */
- class ConnectionHandler implements Runnable
- {
- private Socket socket;
-
- public ConnectionHandler(Socket socket)
- {
- this.socket = socket;
- Thread t = new Thread(this);
- t.start();
- }
-
- public void run()
- {
- String line;
- final List<String> response = new ArrayList<String>();
- try
- {
- BufferedReader br = new BufferedReader(new InputStreamReader(
- socket.getInputStream()));
- assertNotNull(br);
- while ((line = br.readLine()) != null)
- {
- response.add(line);
- }
- br.close();
- }
- catch (Exception ex)
- {
- ex.printStackTrace();
- fail("Exception while reading from the socket");
- }
- assertTrue(response.contains("<ip>127.0.0.1</ip>"));
- assertTrue(response.contains("SOAPAction: \"urn:send\""));
- assertTrue(response
- .contains("Content-Type: text/xml; charset=\"utf-8\""));
- assertTrue(response.contains("Host: localhost" + _port));
- assertTrue(response.contains("User-Agent: Axis2"));
- }
-
- }
-
- /*
- * Test that the SOAP client sends the expected data to the socket We mock a
- * simple SOAP envelope: <ip>127.0.0.1</ip>
- */
- public void testSoapClient() throws Exception
- {
- //
- try
- {
- _server = new ServerSocket(0);
- _port = _server.getLocalPort();
- assertTrue("Server is not yet bound to a port", _port != -1);
- assertNotNull(_server);
- }
- catch (Exception ex)
- {
- ex.printStackTrace();
- fail("Unable to start the socket server");
- }
-
- Thread _socketAcceptor = new Thread()
- {
- public void run()
- {
- try
- {
- Socket socket = _server.accept();
- new ConnectionHandler(socket);
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- };
- _socketAcceptor.start();
- // Sleep for 1 second to allow the ServerSocket readiness
- Thread.sleep(1000);
- SoapClient sc = getSoapClient();
- assertNotNull(sc);
- sc.sendSOAPMessage();
-
- _socketAcceptor.join(2000);
-
- assertFalse("Socket Acceptor not stopped.", _socketAcceptor.isAlive());
- }
-
- /**
- * Test SoapClient correctly clears previously set values
- */
- public void testSoapClientXMLData()
- {
- SoapClient sc = getSoapClient();
-
- StringBuffer initial = new StringBuffer("Initial Value");
-
- sc.setXMLData(initial);
-
- assertEquals("getXMLData is not set with initial value",
- initial.toString(), sc.getXMLData().toString());
-
-
- StringBuffer sb = new StringBuffer("<?xml version=\"1.0\"?><ip=@IP><port=@PORT>");
- sc.setXMLData(sb);
- assertEquals(sc.getXMLData().length(), sb.length());
- assertEquals("getXMLData does not return the same StringBuffer set by setXMLData",
- sb.toString(), sc.getXMLData().toString());
- }
-
- /**
- * Test that variable replacement is performed on the soap.envelope.
- * Create dummy soap message and validate that the variable have been replaced.
- */
- public void testReplaceVariablesMap()
- {
- Properties props = new Properties();
- // Add dummy values as required to create a soap message
- props.setProperty("soap.hostname", _hostName);
- props.setProperty("soap.port", "0");
- props.setProperty("soap.urlpath", _urlPath);
- props.setProperty("soap.action", "send");
-
- /// The envelope is what we care about
- props.setProperty("soap.envelope", "<addr>@IP:@PORT</addr>");
- HashMap<String, String> soapmap = new HashMap<String, String>();
-
- /// Variables that should be replaced.
- final String ip = "127.0.0.1";
- soapmap.put("IP", ip);
- final String port = "8080";
- soapmap.put("PORT", port);
-
- SoapClient sc = new SoapClient(soapmap, props);
- assertNotNull("SoapClient is null", sc);
-
- assertTrue("Replace variables did not work as expected", ("<addr>" + ip + ":" + port + "</addr>").equals(sc.getXMLData().toString()));
- }
-
-}
diff --git a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SystemInfoTest.java b/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SystemInfoTest.java
deleted file mode 100644
index 6f138f5605..0000000000
--- a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/SystemInfoTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.info.test;
-
-import junit.framework.TestCase;
-
-import org.apache.qpid.info.SystemInfo;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-/** Test the SystemInfo component */
-public class SystemInfoTest extends TestCase
-{
-
- /**
- * Ensure the list of required properties are returned by the
- * SystemInfo.getInfo call
- */
- public void testGetInfo()
- {
- Map<String, String> sysInfoMap = SystemInfo.getInfo();
- assertNotNull("SystemInfo.getInfo() returned null", sysInfoMap);
- List<String> sysInfoProps = Arrays.asList(
- "java.class.path",
- "java.vm.name", "java.class.version", "os.arch", "os.name",
- "os.version", "sun.arch.data.model", "user.dir", "user.name",
- "user.timezone", "hostname", "ip", "CPUCores", "Maximum_Memory",
- "Free_Memory");
-
- for (String tag : sysInfoProps)
- {
- assertNotNull("Map does not contain the tag: " + tag, sysInfoMap.get(tag));
- }
- }
-
-} \ No newline at end of file
diff --git a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/XMLWriterTest.java b/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/XMLWriterTest.java
deleted file mode 100644
index d23c16f60e..0000000000
--- a/java/broker-plugins/experimental/info/src/test/java/org/apache/qpid/info/test/XMLWriterTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.info.test;
-
-import junit.framework.TestCase;
-
-import org.apache.qpid.info.util.XMLWriter;
-
-import java.util.HashMap;
-
-/*
- * This test verifies the XML writer custom class operations
- */
-
-public class XMLWriterTest extends TestCase
-{
-
- private XMLWriter xw = null;
-
- /** Test constructor arg is returned via getXML() */
- public void testXMLWriter()
- {
- StringBuffer input = new StringBuffer("Test");
- xw = new XMLWriter(input);
- assertNotNull("XMLWriter could not instantiate", xw);
- assertEquals("XMLWriter.getXML() failed", input, xw.getXML());
- }
-
- /** Test header generation */
- public void testWriteXMLHeader()
- {
- xw = new XMLWriter(new StringBuffer());
- assertNotNull(xw);
- xw.writeXMLHeader();
- assertEquals("XMLWriter.writeXMLHeader(...) failed", "<?xml version=\"1.0\"?>\n", xw.getXML().toString());
- }
-
- /** Test tag created and written correctly */
- public void testWriteTag()
- {
- String INDENT = " ";
- xw = new XMLWriter(new StringBuffer());
- assertNotNull("XMLWriter could not instantiate", xw);
- xw.writeTag("test", new HashMap<String, String>(), "TEST");
- assertEquals("XMLWriter.writeTag(...) failed", "<test>\n" + INDENT + "TEST\n" + "</test>\n", xw.getXML()
- .toString());
- }
-
- /** Test tag created and written correctly */
- public void testWriteTagWithNullAttribute()
- {
- String INDENT = " ";
- xw = new XMLWriter(new StringBuffer());
- assertNotNull("XMLWriter could not instantiate", xw);
- xw.writeTag("test", null, "TEST");
- assertEquals("XMLWriter.writeTag(...) failed", "<test>\n" + INDENT + "TEST\n" + "</test>\n", xw.getXML()
- .toString());
- }
-
- /** Test tag created and written correctly with attribute */
- public void testWriteTagWithAttribute()
- {
- String INDENT = " ";
- xw = new XMLWriter(new StringBuffer());
- assertNotNull("XMLWriter could not instantiate", xw);
- HashMap<String, String> attr = new HashMap<String, String>();
- attr.put("id", "1");
-
- xw.writeTag("test", attr, "TEST");
- assertEquals("XMLWriter.writeTag(...) failed", "<test id=\"1\">\n" + INDENT + "TEST\n" + "</test>\n", xw.getXML()
- .toString());
- }
-
- /** Test open tag with an empty attribute map. Just creates an open tag */
- public void testWriteOpenTag()
- {
- xw = new XMLWriter(new StringBuffer());
- assertNotNull(xw);
- HashMap<String, String> attr = new HashMap<String, String>();
- xw.writeOpenTag("test", attr);
- assertEquals("XMLWriter.writeOpenTag(...) failed", "<test>\n", xw.getXML().toString());
- }
-
- /** Test open tag with a null attribute map. Just creates an open tag */
- public void testNullAtrributeOnTag()
- {
- xw = new XMLWriter(new StringBuffer());
- assertNotNull(xw);
- xw.writeOpenTag("test", null);
- assertEquals("XMLWriter.writeOpenTag(...) failed", "<test>\n", xw.getXML().toString());
- }
-
- /** Test that setting an attribute value on the tag is correctly outputted. */
- public void testAtrributeOnTag()
- {
- xw = new XMLWriter(new StringBuffer());
- assertNotNull(xw);
- HashMap<String, String> attr = new HashMap<String, String>();
-
- attr.put("id", "1");
- xw.writeOpenTag("test1", attr);
- assertEquals("XMLWriter.writeOpenTag(...) failed", "<test1 id=\"1\">\n", xw.getXML().toString());
- }
-
- /** Test Close Tag is correctly written */
- public void testWriteCloseTag()
- {
- xw = new XMLWriter(new StringBuffer());
- assertNotNull(xw);
- xw.writeCloseTag("test");
- assertEquals("</test>\n", xw.getXML().toString());
- }
-
-}
diff --git a/java/broker-plugins/experimental/shutdown/src/main/java/shutdown.bnd b/java/broker-plugins/experimental/shutdown/src/main/java/shutdown.bnd
index c9e1371732..60af4b89e8 100755
--- a/java/broker-plugins/experimental/shutdown/src/main/java/shutdown.bnd
+++ b/java/broker-plugins/experimental/shutdown/src/main/java/shutdown.bnd
@@ -17,7 +17,7 @@
# under the License.
#
-ver: 0.15.0
+ver: 0.17.0
Bundle-SymbolicName: qpid-shutdown-plugin
Bundle-Version: ${ver}
diff --git a/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchange.java b/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchange.java
index 6e1ea25f26..af56b50437 100644
--- a/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchange.java
+++ b/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchange.java
@@ -40,6 +40,7 @@ import javax.management.openmbean.OpenDataException;
import javax.management.openmbean.TabularData;
import java.util.ArrayList;
import java.util.Map;
+import java.util.UUID;
/**
* This is a special diagnostic exchange type which doesn't actually do anything
@@ -125,14 +126,14 @@ public class DiagnosticExchange extends AbstractExchange
return DiagnosticExchange.class;
}
- public DiagnosticExchange newInstance(VirtualHost host,
+ public DiagnosticExchange newInstance(UUID id, VirtualHost host,
AMQShortString name,
boolean durable,
int ticket,
boolean autoDelete) throws AMQException
{
DiagnosticExchange exch = new DiagnosticExchange();
- exch.initialise(host,name,durable,ticket,autoDelete);
+ exch.initialise(id, host,name,durable,ticket,autoDelete);
return exch;
}
@@ -159,11 +160,6 @@ public class DiagnosticExchange extends AbstractExchange
return new DiagnosticExchange.DiagnosticExchangeMBean();
}
- public Logger getLogger()
- {
- return _logger;
- }
-
public void registerQueue(String routingKey, AMQQueue queue, Map<String, Object> args) throws AMQException
{
// No op
diff --git a/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchangeType.java b/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchangeType.java
index b4d0d1aa0d..c0f325e42f 100644
--- a/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchangeType.java
+++ b/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchangeType.java
@@ -21,6 +21,8 @@
package org.apache.qpid.extras.exchanges.diagnostic;
+import java.util.UUID;
+
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.exchange.ExchangeType;
@@ -42,11 +44,11 @@ public final class DiagnosticExchangeType implements ExchangeType<DiagnosticExch
return DiagnosticExchange.class;
}
- public DiagnosticExchange newInstance(VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
+ public DiagnosticExchange newInstance(UUID id, VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
throws AMQException
{
DiagnosticExchange exch = new DiagnosticExchange();
- exch.initialise(host, name, durable, ticket, autoDelete);
+ exch.initialise(id, host, name, durable, ticket, autoDelete);
return exch;
}
diff --git a/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchange.java b/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchange.java
index ace30b9b89..691f4c8d0b 100644
--- a/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchange.java
+++ b/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchange.java
@@ -80,6 +80,11 @@ public class TestExchange implements Exchange
return false;
}
+ public boolean isBound(String bindingKey, Map<String, Object> arguments, AMQQueue queue)
+ {
+ return false;
+ }
+
public boolean isBound(String bindingKey)
{
return false;
@@ -250,7 +255,7 @@ public class TestExchange implements Exchange
return 0;
}
- public void initialise(VirtualHost arg0, AMQShortString arg1, boolean arg2, int arg3, boolean arg4)
+ public void initialise(UUID id, VirtualHost arg0, AMQShortString arg1, boolean arg2, int arg3, boolean arg4)
throws AMQException
{
}
diff --git a/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchangeType.java b/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchangeType.java
index db02ca13ea..5c454b9d0e 100644
--- a/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchangeType.java
+++ b/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchangeType.java
@@ -21,6 +21,8 @@
package org.apache.qpid.extras.exchanges.example;
+import java.util.UUID;
+
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.exchange.Exchange;
@@ -40,12 +42,12 @@ public class TestExchangeType implements ExchangeType
return null;
}
- public Exchange newInstance(VirtualHost host, AMQShortString name, boolean durable,
+ public Exchange newInstance(UUID id, VirtualHost host, AMQShortString name, boolean durable,
int token, boolean autoDelete)
throws AMQException
{
TestExchange ex = new TestExchange();
- ex.initialise(host, name, durable, token, autoDelete);
+ ex.initialise(id, host, name, durable, token, autoDelete);
return ex;
}
diff --git a/java/broker/bin/create-example-ssl-stores.bat b/java/broker/bin/create-example-ssl-stores.bat
deleted file mode 100644
index 5419c098d5..0000000000
--- a/java/broker/bin/create-example-ssl-stores.bat
+++ /dev/null
@@ -1,36 +0,0 @@
-@REM
-@REM Licensed to the Apache Software Foundation (ASF) under one
-@REM or more contributor license agreements. See the NOTICE file
-@REM distributed with this work for additional information
-@REM regarding copyright ownership. The ASF licenses this file
-@REM to you under the Apache License, Version 2.0 (the
-@REM "License"); you may not use this file except in compliance
-@REM with the License. You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing,
-@REM software distributed under the License is distributed on an
-@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-@REM KIND, either express or implied. See the License for the
-@REM specific language governing permissions and limitations
-@REM under the License.
-@REM
-
-@REM Create example keystore for broker and trust store for client/management console.
-@REM
-@REM Use generated qpid.keystore as the brokers keystore
-@REM Use generated qpid.truststore as client/consoles truststore
-@REM All passwords have value: password
-
-@REM Create Broker Keystore:
-keytool -genkey -alias qpidBroker -keyalg RSA -validity 365 -keystore qpid.keystore -storepass password -keypass password -dname "CN=hostname, OU=OrgUnit, O=Org, L=City, C=US"
-
-@REM Export Self Signed Cert:
-keytool -export -alias qpidBroker -keystore qpid.keystore -file qpidBroker.cer -storepass password
-
-@REM Import Broker Cert Into MC TrustStore:
-keytool -import -alias qpidBrokerCert -file qpidBroker.cer -keystore qpid.truststore -storepass password -noprompt
-
-@REM Delete the cert
-del qpidBroker.cer \ No newline at end of file
diff --git a/java/broker/bin/create-example-ssl-stores.sh b/java/broker/bin/create-example-ssl-stores.sh
deleted file mode 100755
index bfcb3dfecf..0000000000
--- a/java/broker/bin/create-example-ssl-stores.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Create example keystore for broker and trust store for client/management console.
-#
-# Use generated qpid.keystore as the brokers keystore
-# Use generated qpid.truststore as client/consoles truststore
-# All passwords have value: password
-
-#Create Broker Keystore:
-keytool -genkey -alias qpidBroker -keyalg RSA -validity 365 -keystore qpid.keystore \
--storepass password -keypass password -dname "CN=hostname, OU=OrgUnit, O=Org, L=City, C=US"
-
-#Export Self Signed Cert:
-keytool -export -alias qpidBroker -keystore qpid.keystore -file qpidBroker.cer -storepass password
-
-#Import Broker Cert Into MC TrustStore:
-keytool -import -alias qpidBrokerCert -file qpidBroker.cer -keystore qpid.truststore -storepass password -noprompt
-
-#Delete the cert
-rm qpidBroker.cer
diff --git a/java/broker/build.xml b/java/broker/build.xml
index bb809583ee..9e8bf12f18 100644
--- a/java/broker/build.xml
+++ b/java/broker/build.xml
@@ -19,7 +19,7 @@
-
-->
<project name="AMQ Broker" default="build">
- <property name="module.depends" value="management/common common"/>
+ <property name="module.depends" value="management/common common amqp-1-0-common"/>
<property name="module.test.depends" value="common/test" />
<property name="module.main" value="org.apache.qpid.server.Main"/>
<property name="module.genpom" value="true"/>
diff --git a/java/broker/etc/config.xml b/java/broker/etc/config.xml
index 6839f8cf9f..e1aacd43b5 100644
--- a/java/broker/etc/config.xml
+++ b/java/broker/etc/config.xml
@@ -53,8 +53,7 @@
</jmxport>
<ssl>
<enabled>false</enabled>
- <!-- Update below path to your keystore location, or run the bin/create-example-ssl-stores(.sh|.bat)
- script from within the etc/ folder to generate an example store with self-signed cert -->
+ <!-- Update below path to your keystore location. -->
<keyStorePath>${conf}/qpid.keystore</keyStorePath>
<keyStorePassword>password</keyStorePassword>
</ssl>
diff --git a/java/broker/etc/virtualhosts.xml b/java/broker/etc/virtualhosts.xml
index 4dcdcda6d2..1f7f91de9a 100644
--- a/java/broker/etc/virtualhosts.xml
+++ b/java/broker/etc/virtualhosts.xml
@@ -25,8 +25,8 @@
<name>localhost</name>
<localhost>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
- <!--<class>org.apache.qpid.server.store.DerbyMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
+ <!--<factoryclass>org.apache.qpid.server.store.derby.DerbyMessageStoreFactory</factoryclass>
<environment-path>${QPID_WORK}/derbystore</environment-path>-->
</store>
@@ -86,8 +86,8 @@
<name>development</name>
<development>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
- <!--<class>org.apache.qpid.server.store.DerbyMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
+ <!--<factoryclass>org.apache.qpid.server.store.derby.DerbyMessageStoreFactory</factoryclass>
<environment-path>${QPID_WORK}/derbystore</environment-path>-->
</store>
@@ -125,8 +125,8 @@
<name>test</name>
<test>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
- <!--<class>org.apache.qpid.server.store.DerbyMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
+ <!--<factoryclass>org.apache.qpid.server.store.derby.DerbyMessageStoreFactory</factoryclass>
<environment-path>${QPID_WORK}/derbystore</environment-path>-->
</store>
diff --git a/java/broker/src/main/java/broker.bnd b/java/broker/src/main/java/broker.bnd
index 25b0495a63..fa433848a6 100755
--- a/java/broker/src/main/java/broker.bnd
+++ b/java/broker/src/main/java/broker.bnd
@@ -17,7 +17,7 @@
# under the License.
#
-ver: 0.15.0
+ver: 0.17.0
Bundle-SymbolicName: qpid-broker
Bundle-Version: ${ver}
diff --git a/java/broker/src/main/java/org/apache/qpid/qmf/ManagementExchange.java b/java/broker/src/main/java/org/apache/qpid/qmf/ManagementExchange.java
index 1a098d0446..034a4ae53c 100644
--- a/java/broker/src/main/java/org/apache/qpid/qmf/ManagementExchange.java
+++ b/java/broker/src/main/java/org/apache/qpid/qmf/ManagementExchange.java
@@ -37,6 +37,7 @@ import org.apache.qpid.server.exchange.topic.TopicNormalizer;
import org.apache.qpid.server.exchange.topic.TopicParser;
import org.apache.qpid.server.message.InboundMessage;
import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.virtualhost.HouseKeepingTask;
@@ -83,7 +84,8 @@ public class ManagementExchange implements Exchange, QMFService.Listener
private class ManagementQueue implements BaseQueue
{
- private final String NAME_AS_STRING = "##__mgmt_pseudo_queue__##" + UUID.randomUUID().toString();
+ private final UUID QUEUE_ID = UUIDGenerator.generateUUID();
+ private final String NAME_AS_STRING = "##__mgmt_pseudo_queue__##" + QUEUE_ID.toString();
private final AMQShortString NAME_AS_SHORT_STRING = new AMQShortString(NAME_AS_STRING);
public void enqueue(ServerMessage message) throws AMQException
@@ -129,9 +131,10 @@ public class ManagementExchange implements Exchange, QMFService.Listener
return NAME_AS_SHORT_STRING;
}
- public String getResourceName()
+ @Override
+ public UUID getId()
{
- return NAME_AS_STRING;
+ return QUEUE_ID;
}
}
@@ -155,14 +158,14 @@ public class ManagementExchange implements Exchange, QMFService.Listener
return ManagementExchange.class;
}
- public ManagementExchange newInstance(VirtualHost host,
+ public ManagementExchange newInstance(UUID id, VirtualHost host,
AMQShortString name,
boolean durable,
int ticket,
boolean autoDelete) throws AMQException
{
ManagementExchange exch = new ManagementExchange();
- exch.initialise(host, name, durable, ticket, autoDelete);
+ exch.initialise(id, host, name, durable, ticket, autoDelete);
return exch;
}
@@ -183,7 +186,7 @@ public class ManagementExchange implements Exchange, QMFService.Listener
return QPID_MANAGEMENT_TYPE;
}
- public void initialise(VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
+ public void initialise(UUID id, VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
throws AMQException
{
if(!QPID_MANAGEMENT.equals(name))
@@ -191,7 +194,7 @@ public class ManagementExchange implements Exchange, QMFService.Listener
throw new AMQException("Can't create more than one Management exchange");
}
_virtualHost = host;
- _id = host.getConfigStore().createId();
+ _id = id;
_virtualHost.scheduleHouseKeepingTask(_virtualHost.getBroker().getManagementPublishInterval(), new UpdateTask(_virtualHost));
getConfigStore().addConfiguredObject(this);
getQMFService().addListener(this);
@@ -410,6 +413,11 @@ public class ManagementExchange implements Exchange, QMFService.Listener
return queues;
}
+ public boolean isBound(String bindingKey, Map<String, Object> arguments, AMQQueue queue)
+ {
+ return false; //TODO
+ }
+
public boolean isBound(AMQShortString routingKey, FieldTable arguments, AMQQueue queue)
{
return false; //To change body of implemented methods use File | Settings | File Templates.
diff --git a/java/broker/src/main/java/org/apache/qpid/qmf/QMFService.java b/java/broker/src/main/java/org/apache/qpid/qmf/QMFService.java
index 4367a04da9..900b722886 100644
--- a/java/broker/src/main/java/org/apache/qpid/qmf/QMFService.java
+++ b/java/broker/src/main/java/org/apache/qpid/qmf/QMFService.java
@@ -658,6 +658,11 @@ public class QMFService implements ConfigStore.ConfigEventListener, Closeable
return _obj.getStagingThreshold();
}
+ public Boolean getMgmtPublish()
+ {
+ return true;
+ }
+
public Integer getMgmtPubInterval()
{
return _obj.getManagementPublishInterval();
diff --git a/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java b/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java
index 265aa7714e..0f32b98aa8 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java
@@ -33,11 +33,11 @@ import org.apache.qpid.server.logging.actors.CurrentActor;
import org.apache.qpid.server.logging.actors.ManagementActor;
import org.apache.qpid.server.management.AMQManagedObject;
import org.apache.qpid.server.management.ManagedObject;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
import org.apache.qpid.server.queue.AMQQueueMBean;
import org.apache.qpid.server.queue.QueueRegistry;
-import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.server.virtualhost.VirtualHostImpl;
@@ -49,6 +49,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
/**
* This MBean implements the broker management interface and exposes the
@@ -60,8 +61,6 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
private final QueueRegistry _queueRegistry;
private final ExchangeRegistry _exchangeRegistry;
private final ExchangeFactory _exchangeFactory;
- private final Exchange _defaultExchange;
- private final DurableConfigurationStore _durableConfig;
private final VirtualHostImpl.VirtualHostMBean _virtualHostMBean;
@@ -75,8 +74,6 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
_queueRegistry = virtualHost.getQueueRegistry();
_exchangeRegistry = virtualHost.getExchangeRegistry();
- _defaultExchange = _exchangeRegistry.getDefaultExchange();
- _durableConfig = virtualHost.getDurableConfigurationStore();
_exchangeFactory = virtualHost.getExchangeFactory();
}
@@ -176,12 +173,12 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
Exchange exchange = _exchangeRegistry.getExchange(new AMQShortString(exchangeName));
if (exchange == null)
{
- exchange = _exchangeFactory.createExchange(new AMQShortString(exchangeName), new AMQShortString(type),
- durable, false, 0);
+ exchange = _exchangeFactory.createExchange(new AMQShortString(exchangeName),
+ new AMQShortString(type), durable, false, 0);
_exchangeRegistry.registerExchange(exchange);
if (durable)
{
- _durableConfig.createExchange(exchange);
+ getVirtualHost().getMessageStore().createExchange(exchange);
}
}
else
@@ -249,45 +246,42 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
public void createNewQueue(String queueName, String owner, boolean durable, Map<String,Object> arguments) throws JMException
{
final AMQShortString queueNameAsAMQShortString = new AMQShortString(queueName);
- AMQQueue queue = _queueRegistry.getQueue(queueNameAsAMQShortString);
- if (queue != null)
+ synchronized (_queueRegistry)
{
- throw new JMException("The queue \"" + queueName + "\" already exists.");
- }
-
- CurrentActor.set(new ManagementActor(getLogActor().getRootMessageLogger()));
- try
- {
- AMQShortString ownerShortString = null;
- if (owner != null)
+ AMQQueue queue = _queueRegistry.getQueue(queueNameAsAMQShortString);
+ if (queue != null)
{
- ownerShortString = new AMQShortString(owner);
+ throw new JMException("The queue \"" + queueName + "\" already exists.");
}
- FieldTable args = null;
- if(arguments != null)
+ CurrentActor.set(new ManagementActor(getLogActor().getRootMessageLogger()));
+ try
{
- args = FieldTable.convertToFieldTable(arguments);
- }
- final VirtualHost virtualHost = getVirtualHost();
+ FieldTable args = null;
+ if(arguments != null)
+ {
+ args = FieldTable.convertToFieldTable(arguments);
+ }
+ final VirtualHost virtualHost = getVirtualHost();
+
+ queue = AMQQueueFactory.createAMQQueueImpl(UUIDGenerator.generateUUID(), queueName, durable, owner,
+ false, false, getVirtualHost(), arguments);
+ if (queue.isDurable() && !queue.isAutoDelete())
+ {
+ getVirtualHost().getMessageStore().createQueue(queue, args);
+ }
- queue = AMQQueueFactory.createAMQQueueImpl(queueNameAsAMQShortString, durable, ownerShortString,
- false, false, getVirtualHost(), args);
- if (queue.isDurable() && !queue.isAutoDelete())
+ virtualHost.getBindingFactory().addBinding(queueName, queue, _exchangeRegistry.getDefaultExchange(), null);
+ }
+ catch (AMQException ex)
{
- _durableConfig.createQueue(queue, args);
+ JMException jme = new JMException(ex.toString());
+ throw new MBeanException(jme, "Error in creating queue " + queueName);
+ }
+ finally
+ {
+ CurrentActor.remove();
}
-
- virtualHost.getBindingFactory().addBinding(queueName, queue, _defaultExchange, null);
- }
- catch (AMQException ex)
- {
- JMException jme = new JMException(ex.toString());
- throw new MBeanException(jme, "Error in creating queue " + queueName);
- }
- finally
- {
- CurrentActor.remove();
}
}
@@ -317,7 +311,7 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
queue.delete();
if (queue.isDurable())
{
- _durableConfig.removeQueue(queue);
+ getVirtualHost().getMessageStore().removeQueue(queue);
}
}
catch (AMQException ex)
diff --git a/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java b/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java
index e5e755bd23..8198cec821 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java
@@ -20,6 +20,7 @@
*/
package org.apache.qpid.server;
+import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -82,11 +83,13 @@ import org.apache.qpid.server.queue.IncomingMessage;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.StoreFuture;
import org.apache.qpid.server.store.StoredMessage;
import org.apache.qpid.server.subscription.ClientDeliveryMethod;
import org.apache.qpid.server.subscription.RecordDeliveryMethod;
import org.apache.qpid.server.subscription.Subscription;
import org.apache.qpid.server.subscription.SubscriptionFactoryImpl;
+import org.apache.qpid.server.subscription.SubscriptionImpl;
import org.apache.qpid.server.txn.AsyncAutoCommitTransaction;
import org.apache.qpid.server.txn.LocalTransaction;
import org.apache.qpid.server.txn.ServerTransaction;
@@ -273,7 +276,7 @@ public class AMQChannel implements SessionConfig, AMQSessionModel, AsyncAutoComm
{
throw new AMQSecurityException("Permission denied: " + e.getName());
}
- _currentMessage = new IncomingMessage(info);
+ _currentMessage = new IncomingMessage(info, getProtocolSession().getReference());
_currentMessage.setExchange(e);
}
@@ -295,26 +298,9 @@ public class AMQChannel implements SessionConfig, AMQSessionModel, AsyncAutoComm
_currentMessage.setExpiration();
+ _currentMessage.headersReceived(getProtocolSession().getLastReceivedTime());
- MessageMetaData mmd = _currentMessage.headersReceived(getProtocolSession().getLastReceivedTime());
- final StoredMessage<MessageMetaData> handle = _messageStore.addMessage(mmd);
- _currentMessage.setStoredMessage(handle);
-
- routeCurrentMessage();
-
-
- _transaction.addPostTransactionAction(new ServerTransaction.Action()
- {
-
- public void postCommit()
- {
- }
-
- public void onRollback()
- {
- handle.remove();
- }
- });
+ _currentMessage.route();
deliverCurrentMessageIfComplete();
}
@@ -346,17 +332,41 @@ public class AMQChannel implements SessionConfig, AMQSessionModel, AsyncAutoComm
{
_actor.message(ExchangeMessages.DISCARDMSG(_currentMessage.getExchange().asString(), _currentMessage.getRoutingKey()));
}
-
}
else
{
+ final StoredMessage<MessageMetaData> handle = _messageStore.addMessage(_currentMessage.getMessageMetaData());
+ _currentMessage.setStoredMessage(handle);
+ int bodyCount = _currentMessage.getBodyCount();
+ if(bodyCount > 0)
+ {
+ long bodyLengthReceived = 0;
+ for(int i = 0 ; i < bodyCount ; i++)
+ {
+ ContentChunk contentChunk = _currentMessage.getContentChunk(i);
+ handle.addContent((int)bodyLengthReceived, ByteBuffer.wrap(contentChunk.getData()));
+ bodyLengthReceived += contentChunk.getSize();
+ }
+ }
+
+ _transaction.addPostTransactionAction(new ServerTransaction.Action()
+ {
+ public void postCommit()
+ {
+ }
+
+ public void onRollback()
+ {
+ handle.remove();
+ }
+ });
+
_transaction.enqueue(destinationQueues, _currentMessage, new MessageDeliveryAction(_currentMessage, destinationQueues), getProtocolSession().getLastReceivedTime());
incrementOutstandingTxnsIfNecessary();
- updateTransactionalActivity();
+ updateTransactionalActivity();
+ _currentMessage.getStoredMessage().flushToStore();
}
}
- _currentMessage.getStoredMessage().flushToStore();
-
}
finally
{
@@ -383,9 +393,6 @@ public class AMQChannel implements SessionConfig, AMQSessionModel, AsyncAutoComm
try
{
-
- // returns true iff the message was delivered (i.e. if all data was
- // received
final ContentChunk contentChunk =
_session.getMethodRegistry().getProtocolVersionMethodConverter().convertToContentChunk(contentBody);
@@ -409,11 +416,6 @@ public class AMQChannel implements SessionConfig, AMQSessionModel, AsyncAutoComm
}
}
- protected void routeCurrentMessage() throws AMQException
- {
- _currentMessage.route();
- }
-
public long getNextDeliveryTag()
{
return ++_deliveryTag;
@@ -1123,11 +1125,6 @@ public class AMQChannel implements SessionConfig, AMQSessionModel, AsyncAutoComm
}
- public Object getID()
- {
- return _channelId;
- }
-
public AMQConnectionModel getConnectionModel()
{
return _session;
@@ -1377,7 +1374,7 @@ public class AMQChannel implements SessionConfig, AMQSessionModel, AsyncAutoComm
{
if(_blockingQueues.remove(queue))
{
- if(_blocking.compareAndSet(true,false))
+ if(_blocking.compareAndSet(true,false) && !isClosing())
{
_actor.message(_logSubject, ChannelMessages.FLOW_REMOVED());
@@ -1386,6 +1383,16 @@ public class AMQChannel implements SessionConfig, AMQSessionModel, AsyncAutoComm
}
}
+ public boolean onSameConnection(InboundMessage inbound)
+ {
+ if(inbound instanceof IncomingMessage)
+ {
+ IncomingMessage incoming = (IncomingMessage) inbound;
+ return getProtocolSession().getReference() == incoming.getConnectionReference();
+ }
+ return false;
+ }
+
private void flow(boolean flow)
{
MethodRegistry methodRegistry = _session.getMethodRegistry();
@@ -1551,7 +1558,7 @@ public class AMQChannel implements SessionConfig, AMQSessionModel, AsyncAutoComm
}
}
- public void recordFuture(final MessageStore.StoreFuture future, final ServerTransaction.Action action)
+ public void recordFuture(final StoreFuture future, final ServerTransaction.Action action)
{
_unfinishedCommandsQueue.add(new AsyncCommand(future, action));
}
@@ -1585,10 +1592,10 @@ public class AMQChannel implements SessionConfig, AMQSessionModel, AsyncAutoComm
private static class AsyncCommand
{
- private final MessageStore.StoreFuture _future;
+ private final StoreFuture _future;
private ServerTransaction.Action _action;
- public AsyncCommand(final MessageStore.StoreFuture future, final ServerTransaction.Action action)
+ public AsyncCommand(final StoreFuture future, final ServerTransaction.Action action)
{
_future = future;
_action = action;
@@ -1615,9 +1622,8 @@ public class AMQChannel implements SessionConfig, AMQSessionModel, AsyncAutoComm
}
}
- @Override
public int compareTo(AMQSessionModel session)
{
- return getId().toString().compareTo(session.getID().toString());
+ return getId().compareTo(session.getId());
}
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/Broker.java b/java/broker/src/main/java/org/apache/qpid/server/Broker.java
index 072f8dc132..5004d320c2 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/Broker.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/Broker.java
@@ -20,6 +20,7 @@
*/
package org.apache.qpid.server;
+import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.QpidLog4JConfigurator;
@@ -52,15 +53,24 @@ import java.io.InputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.EnumSet;
+import java.util.Formatter;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.FileHandler;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
public class Broker
{
+ private static final Logger LOGGER = Logger.getLogger(Broker.class);
+
private static final int IPV4_ADDRESS_LENGTH = 4;
private static final char IPV4_LITERAL_SEPARATOR = '.';
+ private volatile Thread _shutdownHookThread;
protected static class InitException extends RuntimeException
{
@@ -74,7 +84,14 @@ public class Broker
public void shutdown()
{
- ApplicationRegistry.remove();
+ try
+ {
+ removeShutdownHook();
+ }
+ finally
+ {
+ ApplicationRegistry.remove();
+ }
}
public void startup() throws Exception
@@ -88,6 +105,7 @@ public class Broker
{
CurrentActor.set(new BrokerActor(new SystemOutMessageLogger()));
startupImpl(options);
+ addShutdownHook();
}
finally
{
@@ -147,6 +165,12 @@ public class Broker
parsePortList(sslPorts, serverConfig.getSSLPorts());
}
+ Set<Integer> exclude_1_0 = new HashSet<Integer>(options.getExcludedPorts(ProtocolExclusion.v1_0));
+ if(exclude_1_0.isEmpty())
+ {
+ parsePortList(exclude_1_0, serverConfig.getPortExclude10());
+ }
+
Set<Integer> exclude_0_10 = new HashSet<Integer>(options.getExcludedPorts(ProtocolExclusion.v0_10));
if(exclude_0_10.isEmpty())
{
@@ -177,14 +201,14 @@ public class Broker
bindAddr = serverConfig.getBind();
}
- InetAddress bindAddress = null;
+ InetAddress bindAddress;
if (bindAddr.equals(WILDCARD_ADDRESS))
{
- bindAddress = new InetSocketAddress(0).getAddress();
+ bindAddress = null;
}
else
{
- bindAddress = InetAddress.getByAddress(parseIP(bindAddr));
+ bindAddress = InetAddress.getByName(bindAddr);
}
final AmqpProtocolVersion defaultSupportedProtocolReply = serverConfig.getDefaultSupportedProtocolReply();
@@ -193,18 +217,22 @@ public class Broker
{
for(int port : ports)
{
+ final InetSocketAddress inetSocketAddress = new InetSocketAddress(bindAddress, port);
+
final Set<AmqpProtocolVersion> supported =
- getSupportedVersions(port, exclude_0_10, exclude_0_9_1, exclude_0_9, exclude_0_8, serverConfig);
+ getSupportedVersions(port, exclude_1_0, exclude_0_10, exclude_0_9_1, exclude_0_9,
+ exclude_0_8, serverConfig);
final NetworkTransportConfiguration settings =
- new ServerNetworkTransportConfiguration(serverConfig, port, bindAddress.getHostName(), Transport.TCP);
+ new ServerNetworkTransportConfiguration(serverConfig, inetSocketAddress, Transport.TCP);
final IncomingNetworkTransport transport = Transport.getIncomingTransportInstance();
final MultiVersionProtocolEngineFactory protocolEngineFactory =
new MultiVersionProtocolEngineFactory(supported, defaultSupportedProtocolReply);
transport.accept(settings, protocolEngineFactory, null);
- ApplicationRegistry.getInstance().addAcceptor(new InetSocketAddress(bindAddress, port),
+
+ ApplicationRegistry.getInstance().addAcceptor(inetSocketAddress,
new QpidAcceptor(transport,"TCP"));
CurrentActor.get().message(BrokerMessages.LISTENING("TCP", port));
}
@@ -219,17 +247,21 @@ public class Broker
for(int sslPort : sslPorts)
{
+ final InetSocketAddress inetSocketAddress = new InetSocketAddress(bindAddress, sslPort);
+
final Set<AmqpProtocolVersion> supported =
- getSupportedVersions(sslPort, exclude_0_10, exclude_0_9_1, exclude_0_9, exclude_0_8, serverConfig);
+ getSupportedVersions(sslPort, exclude_1_0, exclude_0_10, exclude_0_9_1,
+ exclude_0_9, exclude_0_8, serverConfig);
final NetworkTransportConfiguration settings =
- new ServerNetworkTransportConfiguration(serverConfig, sslPort, bindAddress.getHostName(), Transport.TCP);
+ new ServerNetworkTransportConfiguration(serverConfig, inetSocketAddress, Transport.TCP);
final IncomingNetworkTransport transport = Transport.getIncomingTransportInstance();
final MultiVersionProtocolEngineFactory protocolEngineFactory =
new MultiVersionProtocolEngineFactory(supported, defaultSupportedProtocolReply);
transport.accept(settings, protocolEngineFactory, sslContext);
- ApplicationRegistry.getInstance().addAcceptor(new InetSocketAddress(bindAddress, sslPort),
+
+ ApplicationRegistry.getInstance().addAcceptor(inetSocketAddress,
new QpidAcceptor(transport,"TCP"));
CurrentActor.get().message(BrokerMessages.LISTENING("TCP/SSL", sslPort));
}
@@ -244,13 +276,20 @@ public class Broker
}
}
- private static Set<AmqpProtocolVersion> getSupportedVersions(final int port, final Set<Integer> exclude_0_10,
- final Set<Integer> exclude_0_9_1, final Set<Integer> exclude_0_9,
- final Set<Integer> exclude_0_8,
- final ServerConfiguration serverConfig)
+ private static Set<AmqpProtocolVersion> getSupportedVersions(final int port,
+ final Set<Integer> exclude_1_0,
+ final Set<Integer> exclude_0_10,
+ final Set<Integer> exclude_0_9_1,
+ final Set<Integer> exclude_0_9,
+ final Set<Integer> exclude_0_8,
+ final ServerConfiguration serverConfig)
{
final EnumSet<AmqpProtocolVersion> supported = EnumSet.allOf(AmqpProtocolVersion.class);
+ if(exclude_1_0.contains(port) || !serverConfig.isAmqp10enabled())
+ {
+ supported.remove(AmqpProtocolVersion.v1_0_0);
+ }
if(exclude_0_10.contains(port) || !serverConfig.isAmqp010enabled())
{
supported.remove(AmqpProtocolVersion.v0_10);
@@ -349,34 +388,6 @@ public class Broker
}
}
- private byte[] parseIP(String address) throws Exception
- {
- char[] literalBuffer = address.toCharArray();
- int byteCount = 0;
- int currByte = 0;
- byte[] ip = new byte[IPV4_ADDRESS_LENGTH];
- for (int i = 0; i < literalBuffer.length; i++)
- {
- char currChar = literalBuffer[i];
- if ((currChar >= '0') && (currChar <= '9'))
- {
- currByte = (currByte * 10) + (Character.digit(currChar, 10) & 0xFF);
- }
-
- if (currChar == IPV4_LITERAL_SEPARATOR || (i + 1 == literalBuffer.length))
- {
- ip[byteCount++] = (byte) currByte;
- currByte = 0;
- }
- }
-
- if (byteCount != 4)
- {
- throw new Exception("Invalid IP address: " + address);
- }
- return ip;
- }
-
private void configureLogging(File logConfigFile, long logWatchTime) throws InitException, IOException
{
if (logConfigFile.exists() && logConfigFile.canRead())
@@ -441,4 +452,56 @@ public class Broker
blm.register();
}
+
+ private void addShutdownHook()
+ {
+ Thread shutdownHookThread = new Thread(new ShutdownService());
+ shutdownHookThread.setName("QpidBrokerShutdownHook");
+
+ Runtime.getRuntime().addShutdownHook(shutdownHookThread);
+ _shutdownHookThread = shutdownHookThread;
+
+ LOGGER.debug("Added shutdown hook");
+ }
+
+ private void removeShutdownHook()
+ {
+ Thread shutdownThread = _shutdownHookThread;
+
+ //if there is a shutdown thread and we aren't it, we should remove it
+ if(shutdownThread != null && !(Thread.currentThread() == shutdownThread))
+ {
+ LOGGER.debug("Removing shutdown hook");
+
+ _shutdownHookThread = null;
+
+ boolean removed = false;
+ try
+ {
+ removed = Runtime.getRuntime().removeShutdownHook(shutdownThread);
+ }
+ catch(IllegalStateException ise)
+ {
+ //ignore, means the JVM is already shutting down
+ }
+
+ if(LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Removed shutdown hook: " + removed);
+ }
+ }
+ else
+ {
+ LOGGER.debug("Skipping shutdown hook removal as there either isnt one, or we are it.");
+ }
+ }
+
+ private class ShutdownService implements Runnable
+ {
+ public void run()
+ {
+ LOGGER.debug("Shutdown hook running");
+ Broker.this.shutdown();
+ }
+ }
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java b/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java
index 1f96a24701..d871c724fd 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java
@@ -47,7 +47,6 @@ public class BrokerOptions
private Integer _logWatchFrequency = 0;
-
public void addPort(final int port)
{
_ports.add(port);
@@ -107,7 +106,6 @@ public class BrokerOptions
{
_jmxPortConnectorServer = jmxPortConnectorServer;
}
-
public String getQpidHome()
{
return System.getProperty(QPID_HOME);
@@ -163,5 +161,4 @@ public class BrokerOptions
{
_bundleContext = bundleContext;
}
-
} \ No newline at end of file
diff --git a/java/broker/src/main/java/org/apache/qpid/server/Main.java b/java/broker/src/main/java/org/apache/qpid/server/Main.java
index 5fcd8a7b52..70fa414e3c 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/Main.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/Main.java
@@ -59,6 +59,12 @@ public class Main
.withDescription("SSL port. Overrides any value in the config file")
.withLongOpt("sslport").create("s");
+
+ private static final Option OPTION_EXCLUDE_1_0 =
+ OptionBuilder.withArgName("port").hasArg()
+ .withDescription("when listening on the specified port do not accept AMQP1-0 connections. The specified port must be one specified on the command line")
+ .withLongOpt("exclude-1-0").create();
+
private static final Option OPTION_EXCLUDE_0_10 =
OptionBuilder.withArgName("port").hasArg()
.withDescription("when listening on the specified port do not accept AMQP0-10 connections. The specified port must be one specified on the command line")
@@ -116,6 +122,7 @@ public class Main
OPTIONS.addOption(OPTION_LOG_WATCH);
OPTIONS.addOption(OPTION_PORT);
OPTIONS.addOption(OPTION_SSLPORT);
+ OPTIONS.addOption(OPTION_EXCLUDE_1_0);
OPTIONS.addOption(OPTION_EXCLUDE_0_10);
OPTIONS.addOption(OPTION_EXCLUDE_0_9_1);
OPTIONS.addOption(OPTION_EXCLUDE_0_9);
diff --git a/java/broker/src/main/java/org/apache/qpid/server/ProtocolExclusion.java b/java/broker/src/main/java/org/apache/qpid/server/ProtocolExclusion.java
index 22d97d36dd..fe6e32173f 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/ProtocolExclusion.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/ProtocolExclusion.java
@@ -28,7 +28,8 @@ public enum ProtocolExclusion
v0_8("exclude-0-8","--exclude-0-8"),
v0_9("exclude-0-9", "--exclude-0-9"),
v0_9_1("exclude-0-9-1", "--exclude-0-9-1"),
- v0_10("exclude-0-10", "--exclude-0-10");
+ v0_10("exclude-0-10", "--exclude-0-10"),
+ v1_0("exclude-1-0", "--exclude-1-0");
private static final Map<String, ProtocolExclusion> MAP = new HashMap<String,ProtocolExclusion>();
diff --git a/java/broker/src/main/java/org/apache/qpid/server/binding/Binding.java b/java/broker/src/main/java/org/apache/qpid/server/binding/Binding.java
index 8e44da095a..2efd4cee26 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/binding/Binding.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/binding/Binding.java
@@ -117,7 +117,7 @@ public class Binding
public String toString()
{
- return "Binding{bindingKey="+_bindingKey+", exchange="+_exchange+", queue="+_queue+"}";
+ return "Binding{bindingKey="+_bindingKey+", exchange="+_exchange+", queue="+_queue+", id= " + _id + " }";
}
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/binding/BindingFactory.java b/java/broker/src/main/java/org/apache/qpid/server/binding/BindingFactory.java
index fe66a6d341..abf252c733 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/binding/BindingFactory.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/binding/BindingFactory.java
@@ -24,7 +24,6 @@ import org.apache.qpid.AMQException;
import org.apache.qpid.AMQInternalException;
import org.apache.qpid.AMQSecurityException;
import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.server.configuration.BindingConfig;
import org.apache.qpid.server.configuration.BindingConfigType;
import org.apache.qpid.server.configuration.ConfigStore;
@@ -33,58 +32,35 @@ import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.logging.actors.CurrentActor;
import org.apache.qpid.server.logging.messages.BindingMessages;
import org.apache.qpid.server.logging.subjects.BindingLogSubject;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQQueue;
-import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Collections;
import java.util.Map;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class BindingFactory
{
private final VirtualHost _virtualHost;
- private final DurableConfigurationStore.Source _configSource;
- private final Exchange _defaultExchange;
private final ConcurrentHashMap<BindingImpl, BindingImpl> _bindings = new ConcurrentHashMap<BindingImpl, BindingImpl>();
-
public BindingFactory(final VirtualHost vhost)
{
- this(vhost, vhost.getExchangeRegistry().getDefaultExchange());
+ _virtualHost = vhost;
}
- public BindingFactory(final DurableConfigurationStore.Source configSource, final Exchange defaultExchange)
- {
- _configSource = configSource;
- _defaultExchange = defaultExchange;
- if (configSource instanceof VirtualHost)
- {
- _virtualHost = (VirtualHost) configSource;
- }
- else
- {
- _virtualHost = null;
- }
- }
-
- public VirtualHost getVirtualHost()
- {
- return _virtualHost;
- }
-
-
-
private final class BindingImpl extends Binding implements AMQQueue.Task, Exchange.Task, BindingConfig
{
private final BindingLogSubject _logSubject;
//TODO : persist creation time
private long _createTime = System.currentTimeMillis();
- private BindingImpl(String bindingKey, final AMQQueue queue, final Exchange exchange, final Map<String, Object> arguments)
+ private BindingImpl(UUID id, String bindingKey, final AMQQueue queue, final Exchange exchange, final Map<String, Object> arguments)
{
- super(queue.getVirtualHost().getConfigStore().createId(), bindingKey, queue, exchange, arguments);
+ super(id, bindingKey, queue, exchange, arguments);
_logSubject = new BindingLogSubject(bindingKey,exchange,queue);
}
@@ -141,48 +117,59 @@ public class BindingFactory
public boolean addBinding(String bindingKey, AMQQueue queue, Exchange exchange, Map<String, Object> arguments) throws AMQSecurityException, AMQInternalException
{
- return makeBinding(bindingKey, queue, exchange, arguments, false, false);
+ return makeBinding(null, bindingKey, queue, exchange, arguments, false, false);
}
- public boolean replaceBinding(final String bindingKey,
+ public boolean replaceBinding(final UUID id, final String bindingKey,
final AMQQueue queue,
final Exchange exchange,
final Map<String, Object> arguments) throws AMQSecurityException, AMQInternalException
{
- return makeBinding(bindingKey, queue, exchange, arguments, false, true);
+ return makeBinding(id, bindingKey, queue, exchange, arguments, false, true);
}
- private boolean makeBinding(String bindingKey, AMQQueue queue, Exchange exchange, Map<String, Object> arguments, boolean restore, boolean force) throws AMQSecurityException, AMQInternalException
+ private boolean makeBinding(UUID id, String bindingKey, AMQQueue queue, Exchange exchange, Map<String, Object> arguments, boolean restore, boolean force) throws AMQSecurityException, AMQInternalException
{
assert queue != null;
+ final Exchange defaultExchange = _virtualHost.getExchangeRegistry().getDefaultExchange();
+
if (bindingKey == null)
{
bindingKey = "";
}
if (exchange == null)
{
- exchange = _defaultExchange;
+ exchange = defaultExchange;
}
if (arguments == null)
{
arguments = Collections.emptyMap();
}
+ if (exchange == null)
+ {
+ throw new IllegalArgumentException("exchange cannot be null");
+ }
+
// The default exchange bindings must reflect the existence of queues, allow
// all operations on it to succeed. It is up to the broker to prevent illegal
// attempts at binding to this exchange, not the ACLs.
- if(exchange != _defaultExchange)
+ if(exchange != defaultExchange)
{
//Perform ACLs
- if (!getVirtualHost().getSecurityManager().authoriseBind(exchange, queue, new AMQShortString(bindingKey)))
+ if (!_virtualHost.getSecurityManager().authoriseBind(exchange, queue, new AMQShortString(bindingKey)))
{
throw new AMQSecurityException("Permission denied: binding " + bindingKey);
}
}
-
- BindingImpl b = new BindingImpl(bindingKey,queue,exchange,arguments);
- BindingImpl existingMapping = _bindings.putIfAbsent(b,b);
+
+ if (id == null)
+ {
+ id = UUIDGenerator.generateUUID();
+ }
+ BindingImpl b = new BindingImpl(id, bindingKey, queue, exchange, arguments);
+ BindingImpl existingMapping = _bindings.putIfAbsent(b, b);
if (existingMapping == null || force)
{
if (existingMapping != null)
@@ -192,7 +179,7 @@ public class BindingFactory
if (b.isDurable() && !restore)
{
- _configSource.getDurableConfigurationStore().bindQueue(exchange,new AMQShortString(bindingKey),queue,FieldTable.convertToFieldTable(arguments));
+ _virtualHost.getMessageStore().bindQueue(b);
}
queue.addQueueDeleteTask(b);
@@ -212,12 +199,12 @@ public class BindingFactory
private ConfigStore getConfigStore()
{
- return getVirtualHost().getConfigStore();
+ return _virtualHost.getConfigStore();
}
- public void restoreBinding(final String bindingKey, final AMQQueue queue, final Exchange exchange, final Map<String, Object> argumentMap) throws AMQSecurityException, AMQInternalException
+ public void restoreBinding(final UUID id, final String bindingKey, final AMQQueue queue, final Exchange exchange, final Map<String, Object> argumentMap) throws AMQSecurityException, AMQInternalException
{
- makeBinding(bindingKey,queue,exchange,argumentMap,true, false);
+ makeBinding(id, bindingKey,queue,exchange,argumentMap,true, false);
}
public void removeBinding(final Binding b) throws AMQSecurityException, AMQInternalException
@@ -229,13 +216,15 @@ public class BindingFactory
public Binding removeBinding(String bindingKey, AMQQueue queue, Exchange exchange, Map<String, Object> arguments) throws AMQSecurityException, AMQInternalException
{
assert queue != null;
+ final Exchange defaultExchange = _virtualHost.getExchangeRegistry().getDefaultExchange();
+
if (bindingKey == null)
{
bindingKey = "";
}
if (exchange == null)
{
- exchange = _defaultExchange;
+ exchange = defaultExchange;
}
if (arguments == null)
{
@@ -245,16 +234,16 @@ public class BindingFactory
// The default exchange bindings must reflect the existence of queues, allow
// all operations on it to succeed. It is up to the broker to prevent illegal
// attempts at binding to this exchange, not the ACLs.
- if(exchange != _defaultExchange)
+ if(exchange != defaultExchange)
{
// Check access
- if (!getVirtualHost().getSecurityManager().authoriseUnbind(exchange, new AMQShortString(bindingKey), queue))
+ if (!_virtualHost.getSecurityManager().authoriseUnbind(exchange, new AMQShortString(bindingKey), queue))
{
throw new AMQSecurityException("Permission denied: unbinding " + bindingKey);
}
}
- BindingImpl b = _bindings.remove(new BindingImpl(bindingKey,queue,exchange,arguments));
+ BindingImpl b = _bindings.remove(new BindingImpl(null, bindingKey,queue,exchange,arguments));
if (b != null)
{
@@ -265,10 +254,7 @@ public class BindingFactory
if (b.isDurable())
{
- _configSource.getDurableConfigurationStore().unbindQueue(exchange,
- new AMQShortString(bindingKey),
- queue,
- FieldTable.convertToFieldTable(arguments));
+ _virtualHost.getMessageStore().unbindQueue(b);
}
b.logDestruction();
getConfigStore().removeConfiguredObject(b);
@@ -280,20 +266,22 @@ public class BindingFactory
public Binding getBinding(String bindingKey, AMQQueue queue, Exchange exchange, Map<String, Object> arguments)
{
assert queue != null;
+ final Exchange defaultExchange = _virtualHost.getExchangeRegistry().getDefaultExchange();
+
if(bindingKey == null)
{
bindingKey = "";
}
if(exchange == null)
{
- exchange = _defaultExchange;
+ exchange = defaultExchange;
}
if(arguments == null)
{
arguments = Collections.emptyMap();
}
- BindingImpl b = new BindingImpl(bindingKey,queue,exchange,arguments);
+ BindingImpl b = new BindingImpl(null, bindingKey,queue,exchange,arguments);
return _bindings.get(b);
}
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java b/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java
index 259902a938..46027d02c6 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java
@@ -88,6 +88,7 @@ public class ServerConfiguration extends ConfigurationPlugin
public static final String MGMT_JMXPORT_CONNECTORSERVER = "management.jmxport.connectorServer";
public static final String STATUS_UPDATES = "status-updates";
public static final String ADVANCED_LOCALE = "advanced.locale";
+ public static final String CONNECTOR_AMQP10ENABLED = "connector.amqp10enabled";
public static final String CONNECTOR_AMQP010ENABLED = "connector.amqp010enabled";
public static final String CONNECTOR_AMQP091ENABLED = "connector.amqp091enabled";
public static final String CONNECTOR_AMQP09ENABLED = "connector.amqp09enabled";
@@ -667,6 +668,11 @@ public class ServerConfiguration extends ConfigurationPlugin
return getListValue("connector.port", Collections.<Integer>singletonList(DEFAULT_PORT));
}
+ public List getPortExclude10()
+ {
+ return getListValue("connector.non10port");
+ }
+
public List getPortExclude010()
{
return getListValue("connector.non010port");
@@ -737,7 +743,7 @@ public class ServerConfiguration extends ConfigurationPlugin
public String getConnectorKeyManagerFactoryAlgorithm()
{
final String systemFallback = KeyManagerFactory.getDefaultAlgorithm();
- // deprecated, pre-0.15 brokers supported this name.
+ // deprecated, pre-0.17 brokers supported this name.
final String fallback = getStringValue("connector.ssl.certType", systemFallback);
return getStringValue("connector.ssl.keyManagerFactoryAlgorithm", fallback);
}
@@ -843,6 +849,11 @@ public class ServerConfiguration extends ConfigurationPlugin
return getConfig().getString("deadLetterQueueSuffix", AMQQueueFactory.DEFAULT_DLQ_NAME_SUFFIX);
}
+ public boolean isAmqp10enabled()
+ {
+ return getConfig().getBoolean(CONNECTOR_AMQP10ENABLED, true);
+ }
+
public boolean isAmqp010enabled()
{
return getConfig().getBoolean(CONNECTOR_AMQP010ENABLED, true);
diff --git a/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerNetworkTransportConfiguration.java b/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerNetworkTransportConfiguration.java
index 81dfcb4465..f6fe47b996 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerNetworkTransportConfiguration.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerNetworkTransportConfiguration.java
@@ -19,22 +19,21 @@
*/
package org.apache.qpid.server.configuration;
+import java.net.InetSocketAddress;
import org.apache.qpid.transport.NetworkTransportConfiguration;
public class ServerNetworkTransportConfiguration implements NetworkTransportConfiguration
{
private final ServerConfiguration _serverConfig;
- private final int _port;
- private final String _host;
private final String _transport;
+ private InetSocketAddress _address;
public ServerNetworkTransportConfiguration(final ServerConfiguration serverConfig,
- final int port, final String host,
+ final InetSocketAddress address,
final String transport)
{
_serverConfig = serverConfig;
- _port = port;
- _host = host;
+ _address = address;
_transport = transport;
}
@@ -55,12 +54,12 @@ public class ServerNetworkTransportConfiguration implements NetworkTransportConf
public Integer getPort()
{
- return _port;
+ return _address.getPort();
}
public String getHost()
{
- return _host;
+ return _address.getHostName();
}
public String getTransport()
@@ -72,4 +71,9 @@ public class ServerNetworkTransportConfiguration implements NetworkTransportConf
{
return _serverConfig.getConnectorProcessors();
}
+
+ public InetSocketAddress getAddress()
+ {
+ return _address;
+ }
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfig.java b/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfig.java
index 9256724c56..b96ddc56c6 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfig.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfig.java
@@ -29,6 +29,4 @@ public interface VirtualHostConfig extends ConfiguredObject<VirtualHostConfigTyp
String getFederationTag();
- void setBroker(BrokerConfig brokerConfig);
-
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java b/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java
index 5fd261a081..5f472b6ddd 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java
@@ -32,6 +32,7 @@ import org.apache.qpid.server.configuration.plugins.ConfigurationPlugin;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.MemoryMessageStore;
+import org.apache.qpid.server.store.MemoryMessageStoreFactory;
import java.util.ArrayList;
import java.util.Arrays;
@@ -42,9 +43,9 @@ import java.util.Map;
public class VirtualHostConfiguration extends ConfigurationPlugin
{
- private String _name;
- private Map<String, QueueConfiguration> _queues = new HashMap<String, QueueConfiguration>();
- private Map<String, ExchangeConfiguration> _exchanges = new HashMap<String, ExchangeConfiguration>();
+ private final String _name;
+ private final Map<String, QueueConfiguration> _queues = new HashMap<String, QueueConfiguration>();
+ private final Map<String, ExchangeConfiguration> _exchanges = new HashMap<String, ExchangeConfiguration>();
public VirtualHostConfiguration(String name, Configuration config) throws ConfigurationException
{
@@ -92,11 +93,6 @@ public class VirtualHostConfiguration extends ConfigurationPlugin
return getLongValue("housekeeping.checkPeriod", ApplicationRegistry.getInstance().getConfiguration().getHousekeepingCheckPeriod());
}
- public String getAuthenticationDatabase()
- {
- return getStringValue("security.authentication.name");
- }
-
public List getCustomExchanges()
{
return getListValue("custom-exchanges.class-name");
@@ -107,14 +103,14 @@ public class VirtualHostConfiguration extends ConfigurationPlugin
return getConfig().subset("store");
}
- public String getMessageStoreClass()
+ public String getMessageStoreFactoryClass()
{
- return getStringValue("store.class", MemoryMessageStore.class.getName());
+ return getStringValue("store.factoryclass", MemoryMessageStoreFactory.class.getName());
}
- public void setMessageStoreClass(String storeClass)
+ public void setMessageStoreFactoryClass(String storeFactoryClass)
{
- getConfig().setProperty("store.class", storeClass);
+ getConfig().setProperty("store.factoryclass", storeFactoryClass);
}
public List getExchanges()
@@ -253,16 +249,6 @@ public class VirtualHostConfiguration extends ConfigurationPlugin
return queueConfig;
}
- public long getMemoryUsageMaximum()
- {
- return getLongValue("queues.maximumMemoryUsage");
- }
-
- public long getMemoryUsageMinimum()
- {
- return getLongValue("queues.minimumMemoryUsage");
- }
-
public int getMaximumMessageAge()
{
return getIntValue("queues.maximumMessageAge");
diff --git a/java/broker/src/main/java/org/apache/qpid/server/connection/ConnectionRegistry.java b/java/broker/src/main/java/org/apache/qpid/server/connection/ConnectionRegistry.java
index 9159489299..4a58314f51 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/connection/ConnectionRegistry.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/connection/ConnectionRegistry.java
@@ -46,11 +46,19 @@ public class ConnectionRegistry implements IConnectionRegistry, Closeable
/** Close all of the currently open connections. */
public void close()
{
- _logger.debug("Closing connection registry :" + _registry.size() + " connections.");
+ close(IConnectionRegistry.BROKER_SHUTDOWN_REPLY_TEXT);
+ }
+
+ public void close(final String replyText)
+ {
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Closing connection registry :" + _registry.size() + " connections.");
+ }
while (!_registry.isEmpty())
{
AMQConnectionModel connection = _registry.get(0);
- closeConnection(connection, AMQConstant.CONNECTION_FORCED, "Broker is shutting down");
+ closeConnection(connection, AMQConstant.CONNECTION_FORCED, replyText);
}
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/connection/IConnectionRegistry.java b/java/broker/src/main/java/org/apache/qpid/server/connection/IConnectionRegistry.java
index 89582e5748..954c448b72 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/connection/IConnectionRegistry.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/connection/IConnectionRegistry.java
@@ -28,12 +28,17 @@ import java.util.List;
public interface IConnectionRegistry
{
+ public static final String BROKER_SHUTDOWN_REPLY_TEXT = "Broker is shutting down";
+ public static final String VHOST_PASSIVATE_REPLY_TEXT = "Virtual host is being passivated";
+
public void initialise();
public void close() throws AMQException;
-
+
+ public void close(String replyText) throws AMQException;
+
public void closeConnection(AMQConnectionModel connection, AMQConstant cause, String message);
-
+
public List<AMQConnectionModel> getConnections();
public void registerConnection(AMQConnectionModel connnection);
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
index cae07046fa..9493f400f2 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
@@ -20,8 +20,6 @@
*/
package org.apache.qpid.server.exchange;
-import org.apache.log4j.Logger;
-
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.binding.Binding;
@@ -116,7 +114,7 @@ public abstract class AbstractExchange implements Exchange, Managable
*/
protected abstract AbstractExchangeMBean createMBean() throws JMException;
- public void initialise(VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
+ public void initialise(UUID id, VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
throws AMQException
{
_virtualHost = host;
@@ -125,10 +123,18 @@ public abstract class AbstractExchange implements Exchange, Managable
_autoDelete = autoDelete;
_ticket = ticket;
- // TODO - fix
- _id = getConfigStore().createId();
+ _id = id;
getConfigStore().addConfiguredObject(this);
+ createAndRegisterMBean();
+ _logSubject = new ExchangeLogSubject(this, this.getVirtualHost());
+
+ // Log Exchange creation
+ CurrentActor.get().message(ExchangeMessages.CREATED(String.valueOf(getTypeShortString()), String.valueOf(name), durable));
+ }
+
+ private void createAndRegisterMBean()
+ {
try
{
_exchangeMbean = createMBean();
@@ -136,12 +142,8 @@ public abstract class AbstractExchange implements Exchange, Managable
}
catch (JMException e)
{
- getLogger().error(e);
+ throw new RuntimeException("Failed to register mbean",e);
}
- _logSubject = new ExchangeLogSubject(this, this.getVirtualHost());
-
- // Log Exchange creation
- CurrentActor.get().message(ExchangeMessages.CREATED(String.valueOf(getTypeShortString()), String.valueOf(name), durable));
}
public ConfigStore getConfigStore()
@@ -149,8 +151,6 @@ public abstract class AbstractExchange implements Exchange, Managable
return getVirtualHost().getConfigStore();
}
- public abstract Logger getLogger();
-
public boolean isDurable()
{
return _durable;
@@ -324,8 +324,7 @@ public abstract class AbstractExchange implements Exchange, Managable
public Map<String, Object> getArguments()
{
- // TODO - Fix
- return Collections.EMPTY_MAP;
+ return Collections.emptyMap();
}
public UUID getId()
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java
index 153419de1b..5058f91995 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java
@@ -25,9 +25,11 @@ import org.apache.log4j.Logger;
import org.apache.qpid.AMQException;
import org.apache.qpid.AMQSecurityException;
import org.apache.qpid.AMQUnknownExchangeType;
+import org.apache.qpid.exchange.ExchangeDefaults;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.qmf.ManagementExchange;
import org.apache.qpid.server.configuration.VirtualHostConfiguration;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.virtualhost.VirtualHost;
@@ -35,6 +37,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
+import java.util.UUID;
public class DefaultExchangeFactory implements ExchangeFactory
{
@@ -76,17 +79,29 @@ public class DefaultExchangeFactory implements ExchangeFactory
return publicTypes;
}
-
-
public Exchange createExchange(String exchange, String type, boolean durable, boolean autoDelete)
- throws AMQException
+ throws AMQException
{
return createExchange(new AMQShortString(exchange), new AMQShortString(type), durable, autoDelete, 0);
}
- public Exchange createExchange(AMQShortString exchange, AMQShortString type, boolean durable, boolean autoDelete,
- int ticket)
+ public Exchange createExchange(UUID id, String exchange, String type, boolean durable, boolean autoDelete)
+ throws AMQException
+ {
+ return createExchange(id, new AMQShortString(exchange), new AMQShortString(type), durable, autoDelete, 0);
+ }
+
+ public Exchange createExchange(AMQShortString exchange, AMQShortString type, boolean durable,
+ boolean autoDelete, int ticket)
+ throws AMQException
+ {
+ UUID id = UUIDGenerator.generateExchangeUUID(exchange.asString(), _host.getName());
+ return createExchange(id, exchange, type, durable, autoDelete, ticket);
+ }
+
+ public Exchange createExchange(UUID id, AMQShortString exchange, AMQShortString type, boolean durable,
+ boolean autoDelete, int ticket)
throws AMQException
{
// Check access
@@ -102,7 +117,7 @@ public class DefaultExchangeFactory implements ExchangeFactory
throw new AMQUnknownExchangeType("Unknown exchange type: " + type,null);
}
- Exchange e = exchType.newInstance(_host, exchange, durable, ticket, autoDelete);
+ Exchange e = exchType.newInstance(id, _host, exchange, durable, ticket, autoDelete);
return e;
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java
index a5fa9f014e..bf4184bf0b 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java
@@ -21,7 +21,6 @@
package org.apache.qpid.server.exchange;
import org.apache.log4j.Logger;
-
import org.apache.qpid.AMQException;
import org.apache.qpid.AMQSecurityException;
import org.apache.qpid.exchange.ExchangeDefaults;
@@ -31,12 +30,13 @@ import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Collection;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class DefaultExchangeRegistry implements ExchangeRegistry
{
- private static final Logger _log = Logger.getLogger(DefaultExchangeRegistry.class);
+ private static final Logger LOGGER = Logger.getLogger(DefaultExchangeRegistry.class);
/**
* Maps from exchange name to exchange instance
@@ -59,11 +59,9 @@ public class DefaultExchangeRegistry implements ExchangeRegistry
new ExchangeInitialiser().initialise(_host.getExchangeFactory(), this, getDurableConfigurationStore());
}
-
-
public DurableConfigurationStore getDurableConfigurationStore()
{
- return _host.getDurableConfigurationStore();
+ return _host.getMessageStore();
}
public void registerExchange(Exchange exchange) throws AMQException
@@ -153,4 +151,49 @@ public class DefaultExchangeRegistry implements ExchangeRegistry
}
}
+ @Override
+ public void clearAndUnregisterMbeans()
+ {
+ for (final AMQShortString exchangeName : getExchangeNames())
+ {
+ final Exchange exchange = getExchange(exchangeName);
+
+ if (exchange instanceof AbstractExchange)
+ {
+ AbstractExchange abstractExchange = (AbstractExchange) exchange;
+ try
+ {
+ abstractExchange.getManagedObject().unregister();
+ }
+ catch (AMQException e)
+ {
+ LOGGER.warn("Failed to unregister mbean", e);
+ }
+ }
+ }
+ _exchangeMap.clear();
+ _exchangeMapStr.clear();
+ }
+
+ @Override
+ public synchronized Exchange getExchange(UUID exchangeId)
+ {
+ if (exchangeId == null)
+ {
+ return getDefaultExchange();
+ }
+ else
+ {
+ Collection<Exchange> exchanges = _exchangeMap.values();
+ for (Exchange exchange : exchanges)
+ {
+ if (exchange.getId().equals(exchangeId))
+ {
+ return exchange;
+ }
+ }
+ return null;
+ }
+ }
+
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java
index 8c0a5001db..af9322764a 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java
@@ -36,6 +36,7 @@ import javax.management.JMException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
@@ -103,14 +104,14 @@ public class DirectExchange extends AbstractExchange
return DirectExchange.class;
}
- public DirectExchange newInstance(VirtualHost host,
+ public DirectExchange newInstance(UUID id, VirtualHost host,
AMQShortString name,
boolean durable,
int ticket,
boolean autoDelete) throws AMQException
{
DirectExchange exch = new DirectExchange();
- exch.initialise(host,name,durable,ticket,autoDelete);
+ exch.initialise(id, host,name,durable,ticket,autoDelete);
return exch;
}
@@ -131,12 +132,6 @@ public class DirectExchange extends AbstractExchange
return new DirectExchangeMBean(this);
}
- public Logger getLogger()
- {
- return _logger;
- }
-
-
public List<? extends BaseQueue> doRoute(InboundMessage payload)
{
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/Exchange.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/Exchange.java
index c3ae15f09c..289cb1a923 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/Exchange.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/Exchange.java
@@ -35,6 +35,8 @@ import org.apache.qpid.server.virtualhost.VirtualHost;
import javax.management.JMException;
import java.util.Collection;
import java.util.List;
+import java.util.Map;
+import java.util.UUID;
public interface Exchange extends ExchangeReferrer, ExchangeConfig
{
@@ -49,7 +51,7 @@ public interface Exchange extends ExchangeReferrer, ExchangeConfig
AMQShortString getTypeShortString();
- void initialise(VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
+ void initialise(UUID id, VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
throws AMQException, JMException;
boolean isDurable();
@@ -111,6 +113,8 @@ public interface Exchange extends ExchangeReferrer, ExchangeConfig
boolean isBound(String bindingKey, AMQQueue queue);
+ public boolean isBound(String bindingKey, Map<String,Object> arguments, AMQQueue queue);
+
boolean isBound(String bindingKey);
void addCloseTask(Task task);
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java
index 577da79028..aae4ae89bb 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java
@@ -25,6 +25,7 @@ import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.configuration.VirtualHostConfiguration;
import java.util.Collection;
+import java.util.UUID;
public interface ExchangeFactory
@@ -40,4 +41,10 @@ public interface ExchangeFactory
Collection<ExchangeType<? extends Exchange>> getPublicCreatableTypes();
Exchange createExchange(String exchange, String type, boolean durable, boolean autoDelete) throws AMQException;
+
+ Exchange createExchange(UUID id, String exchange, String type, boolean durable, boolean autoDelete) throws AMQException;
+
+ Exchange createExchange(UUID id, AMQShortString exchange, AMQShortString type, boolean durable,
+ boolean autoDelete, int ticket)
+ throws AMQException;
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeInitialiser.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeInitialiser.java
index 4dfcce7bbe..ba4f57a8e0 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeInitialiser.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeInitialiser.java
@@ -20,6 +20,7 @@
*/
package org.apache.qpid.server.exchange;
+
import org.apache.qpid.AMQException;
import org.apache.qpid.exchange.ExchangeDefaults;
import org.apache.qpid.framing.AMQShortString;
@@ -27,7 +28,8 @@ import org.apache.qpid.server.store.DurableConfigurationStore;
public class ExchangeInitialiser
{
- public void initialise(ExchangeFactory factory, ExchangeRegistry registry, DurableConfigurationStore store) throws AMQException{
+ public void initialise(ExchangeFactory factory, ExchangeRegistry registry, DurableConfigurationStore store) throws AMQException
+ {
for (ExchangeType<? extends Exchange> type : factory.getRegisteredTypes())
{
define (registry, factory, type.getDefaultExchangeName(), type.getName(), store);
@@ -44,7 +46,6 @@ public class ExchangeInitialiser
{
Exchange exchange = f.createExchange(name, type, true, false, 0);
r.registerExchange(exchange);
-
if(exchange.isDurable())
{
store.createExchange(exchange);
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java
index 18eb37e037..795ae2e140 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java
@@ -24,6 +24,7 @@ import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
import java.util.Collection;
+import java.util.UUID;
public interface ExchangeRegistry
@@ -51,5 +52,9 @@ public interface ExchangeRegistry
Exchange getExchange(String exchangeName);
- void unregisterExchange(String exchange, boolean ifUnused) throws ExchangeInUseException, AMQException;;
+ void unregisterExchange(String exchange, boolean ifUnused) throws ExchangeInUseException, AMQException;
+
+ void clearAndUnregisterMbeans();
+
+ Exchange getExchange(UUID exchangeId);
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeType.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeType.java
index ce339c4e29..a01e41f039 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeType.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeType.java
@@ -20,6 +20,8 @@
*/
package org.apache.qpid.server.exchange;
+import java.util.UUID;
+
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.virtualhost.VirtualHost;
@@ -29,7 +31,7 @@ public interface ExchangeType<T extends Exchange>
{
public AMQShortString getName();
public Class<T> getExchangeClass();
- public T newInstance(VirtualHost host, AMQShortString name,
+ public T newInstance(UUID id, VirtualHost host, AMQShortString name,
boolean durable, int ticket, boolean autoDelete) throws AMQException;
public AMQShortString getDefaultExchangeName();
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java
index 76f86ea1b4..5ebcfd095f 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java
@@ -34,6 +34,7 @@ import org.apache.qpid.server.virtualhost.VirtualHost;
import javax.management.JMException;
import java.util.ArrayList;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class FanoutExchange extends AbstractExchange
@@ -52,11 +53,6 @@ public class FanoutExchange extends AbstractExchange
return new FanoutExchangeMBean(this);
}
- public Logger getLogger()
- {
- return _logger;
- }
-
public static final ExchangeType<FanoutExchange> TYPE = new ExchangeType<FanoutExchange>()
{
@@ -70,14 +66,14 @@ public class FanoutExchange extends AbstractExchange
return FanoutExchange.class;
}
- public FanoutExchange newInstance(VirtualHost host,
+ public FanoutExchange newInstance(UUID id, VirtualHost host,
AMQShortString name,
boolean durable,
int ticket,
boolean autoDelete) throws AMQException
{
FanoutExchange exch = new FanoutExchange();
- exch.initialise(host, name, durable, ticket, autoDelete);
+ exch.initialise(id, host, name, durable, ticket, autoDelete);
return exch;
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersBinding.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersBinding.java
index 0886ae2ae0..b6f5f973f4 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersBinding.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersBinding.java
@@ -39,7 +39,7 @@ class HeadersBinding
{
private static final Logger _logger = Logger.getLogger(HeadersBinding.class);
- private final FieldTable _mappings;
+ private final Map<String,Object> _mappings;
private final Binding _binding;
private final Set<String> required = new HashSet<String>();
private final Map<String,Object> matches = new HashMap<String,Object>();
@@ -58,7 +58,7 @@ class HeadersBinding
_binding = binding;
if(_binding !=null)
{
- _mappings = FieldTable.convertToFieldTable(_binding.getArguments());
+ _mappings = _binding.getArguments();
initMappings();
}
else
@@ -69,37 +69,23 @@ class HeadersBinding
private void initMappings()
{
- _mappings.processOverElements(new FieldTable.FieldTableElementProcessor()
+ for(Map.Entry<String, Object> entry : _mappings.entrySet())
{
-
- public boolean processElement(String propertyName, AMQTypedValue value)
+ String propertyName = entry.getKey();
+ Object value = entry.getValue();
+ if (isSpecial(propertyName))
{
- if (isSpecial(propertyName))
- {
- processSpecial(propertyName, value.getValue());
- }
- else if (value.getValue() == null || value.getValue().equals(""))
- {
- required.add(propertyName);
- }
- else
- {
- matches.put(propertyName,value.getValue());
- }
-
- return true;
+ processSpecial(propertyName, value);
}
-
- public Object getResult()
+ else if (value == null || value.equals(""))
{
- return null;
+ required.add(propertyName);
}
- });
- }
-
- protected FieldTable getMappings()
- {
- return _mappings;
+ else
+ {
+ matches.put(propertyName,value);
+ }
+ }
}
public Binding getBinding()
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersExchange.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersExchange.java
index de12da74b4..16ba3c0431 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersExchange.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersExchange.java
@@ -37,6 +37,7 @@ import javax.management.JMException;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Map;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
@@ -93,12 +94,12 @@ public class HeadersExchange extends AbstractExchange
return HeadersExchange.class;
}
- public HeadersExchange newInstance(VirtualHost host, AMQShortString name, boolean durable, int ticket,
+ public HeadersExchange newInstance(UUID id, VirtualHost host, AMQShortString name, boolean durable, int ticket,
boolean autoDelete) throws AMQException
{
HeadersExchange exch = new HeadersExchange();
- exch.initialise(host, name, durable, ticket, autoDelete);
+ exch.initialise(id, host, name, durable, ticket, autoDelete);
return exch;
}
@@ -146,6 +147,33 @@ public class HeadersExchange extends AbstractExchange
return new ArrayList<BaseQueue>(queues);
}
+
+ public boolean isBound(String bindingKey, Map<String, Object> arguments, AMQQueue queue)
+ {
+ CopyOnWriteArraySet<Binding> bindings;
+ if(bindingKey == null)
+ {
+ bindings = new CopyOnWriteArraySet<Binding>(getBindings());
+ }
+ else
+ {
+ bindings = _bindingsByKey.get(bindingKey);
+ }
+
+ if(bindings != null)
+ {
+ for(Binding binding : bindings)
+ {
+ if(queue == null || binding.getQueue().equals(queue))
+ {
+ return arguments == null ? binding.getArguments() == null : binding.getArguments().equals(arguments);
+ }
+ }
+ }
+
+ return false;
+ }
+
public boolean isBound(AMQShortString routingKey, FieldTable arguments, AMQQueue queue)
{
//fixme isBound here should take the arguements in to consideration.
@@ -204,11 +232,6 @@ public class HeadersExchange extends AbstractExchange
return new HeadersExchangeMBean(this);
}
- public Logger getLogger()
- {
- return _logger;
- }
-
protected void onBind(final Binding binding)
{
String bindingKey = binding.getBindingKey();
@@ -251,10 +274,11 @@ public class HeadersExchange extends AbstractExchange
{
bindings.remove(binding);
}
-
+
+ boolean removedBinding = _bindingHeaderMatchers.remove(new HeadersBinding(binding));
if(_logger.isDebugEnabled())
{
- _logger.debug("Removing Binding: " + _bindingHeaderMatchers.remove(new HeadersBinding(binding)));
+ _logger.debug("Removing Binding: " + removedBinding);
}
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java
index 6d7242a78d..7ea7a41826 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java
@@ -20,13 +20,24 @@
*/
package org.apache.qpid.server.exchange;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.UUID;
+import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import javax.management.JMException;
import org.apache.log4j.Logger;
-
import org.apache.qpid.AMQException;
import org.apache.qpid.AMQInvalidArgumentException;
import org.apache.qpid.common.AMQPFilterTypes;
import org.apache.qpid.exchange.ExchangeDefaults;
import org.apache.qpid.filter.SelectorParsingException;
+import org.apache.qpid.filter.selector.ParseException;
import org.apache.qpid.filter.selector.TokenMgrError;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.FieldTable;
@@ -36,23 +47,14 @@ import org.apache.qpid.server.exchange.topic.TopicMatcherResult;
import org.apache.qpid.server.exchange.topic.TopicNormalizer;
import org.apache.qpid.server.exchange.topic.TopicParser;
import org.apache.qpid.server.filter.JMSSelectorFilter;
-import org.apache.qpid.filter.selector.ParseException;
+import org.apache.qpid.server.filter.MessageFilter;
import org.apache.qpid.server.message.InboundMessage;
+import org.apache.qpid.server.protocol.AMQSessionModel;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.BaseQueue;
+import org.apache.qpid.server.queue.Filterable;
import org.apache.qpid.server.virtualhost.VirtualHost;
-import javax.management.JMException;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.WeakHashMap;
-import java.util.concurrent.ConcurrentHashMap;
-
public class TopicExchange extends AbstractExchange
{
@@ -69,14 +71,14 @@ public class TopicExchange extends AbstractExchange
return TopicExchange.class;
}
- public TopicExchange newInstance(VirtualHost host,
+ public TopicExchange newInstance(UUID id, VirtualHost host,
AMQShortString name,
boolean durable,
int ticket,
boolean autoDelete) throws AMQException
{
TopicExchange exch = new TopicExchange();
- exch.initialise(host, name, durable, ticket, autoDelete);
+ exch.initialise(id, host, name, durable, ticket, autoDelete);
return exch;
}
@@ -122,24 +124,26 @@ public class TopicExchange extends AbstractExchange
FieldTable oldArgs = _bindings.get(binding);
TopicExchangeResult result = _topicExchangeResults.get(routingKey);
- if(argumentsContainSelector(args))
+ if(argumentsContainFilter(args))
{
- if(argumentsContainSelector(oldArgs))
+ if(argumentsContainFilter(oldArgs))
{
- result.replaceQueueFilter(queue,createSelectorFilter(oldArgs), createSelectorFilter(args));
+ result.replaceQueueFilter(queue,
+ createMessageFilter(oldArgs, queue),
+ createMessageFilter(args, queue));
}
else
{
- result.addFilteredQueue(queue,createSelectorFilter(args));
+ result.addFilteredQueue(queue, createMessageFilter(args, queue));
result.removeUnfilteredQueue(queue);
}
}
else
{
- if(argumentsContainSelector(oldArgs))
+ if(argumentsContainFilter(oldArgs))
{
result.addUnfilteredQueue(queue);
- result.removeFilteredQueue(queue, createSelectorFilter(oldArgs));
+ result.removeFilteredQueue(queue, createMessageFilter(oldArgs, queue));
}
else
{
@@ -158,9 +162,9 @@ public class TopicExchange extends AbstractExchange
if(result == null)
{
result = new TopicExchangeResult();
- if(argumentsContainSelector(args))
+ if(argumentsContainFilter(args))
{
- result.addFilteredQueue(queue, createSelectorFilter(args));
+ result.addFilteredQueue(queue, createMessageFilter(args, queue));
}
else
{
@@ -171,9 +175,9 @@ public class TopicExchange extends AbstractExchange
}
else
{
- if(argumentsContainSelector(args))
+ if(argumentsContainFilter(args))
{
- result.addFilteredQueue(queue, createSelectorFilter(args));
+ result.addFilteredQueue(queue, createMessageFilter(args, queue));
}
else
{
@@ -187,9 +191,28 @@ public class TopicExchange extends AbstractExchange
}
- private JMSSelectorFilter createSelectorFilter(final FieldTable args) throws AMQInvalidArgumentException
+ private MessageFilter createMessageFilter(final FieldTable args, AMQQueue queue) throws AMQInvalidArgumentException
{
+ if(argumentsContainNoLocal(args))
+ {
+ MessageFilter filter = new NoLocalFilter(queue);
+
+ if(argumentsContainJMSSelector(args))
+ {
+ filter = new CompoundFilter(filter, createJMSSelectorFilter(args));
+ }
+ return filter;
+ }
+ else
+ {
+ return createJMSSelectorFilter(args);
+ }
+
+ }
+
+ private MessageFilter createJMSSelectorFilter(FieldTable args) throws AMQInvalidArgumentException
+ {
final String selectorString = args.getString(AMQPFilterTypes.JMS_SELECTOR.getValue());
WeakReference<JMSSelectorFilter> selectorRef = _selectorCache.get(selectorString);
JMSSelectorFilter selector = null;
@@ -217,11 +240,25 @@ public class TopicExchange extends AbstractExchange
return selector;
}
- private static boolean argumentsContainSelector(final FieldTable args)
+ private static boolean argumentsContainFilter(final FieldTable args)
{
- return args != null && args.containsKey(AMQPFilterTypes.JMS_SELECTOR.getValue()) && args.getString(AMQPFilterTypes.JMS_SELECTOR.getValue()).trim().length() != 0;
+ return argumentsContainNoLocal(args) || argumentsContainJMSSelector(args);
}
+ private static boolean argumentsContainNoLocal(final FieldTable args)
+ {
+ return args != null
+ && args.containsKey(AMQPFilterTypes.NO_LOCAL.getValue())
+ && Boolean.TRUE.equals(args.get(AMQPFilterTypes.NO_LOCAL.getValue()));
+ }
+
+ private static boolean argumentsContainJMSSelector(final FieldTable args)
+ {
+ return args != null && (args.containsKey(AMQPFilterTypes.JMS_SELECTOR.getValue())
+ && args.getString(AMQPFilterTypes.JMS_SELECTOR.getValue()).trim().length() != 0);
+ }
+
+
public ArrayList<BaseQueue> doRoute(InboundMessage payload)
{
@@ -275,6 +312,28 @@ public class TopicExchange extends AbstractExchange
}
}
+ public boolean isBound(String bindingKey, Map<String, Object> arguments, AMQQueue queue)
+ {
+ Binding binding = new Binding(null, bindingKey, queue, this, arguments);
+ if (arguments == null)
+ {
+ return _bindings.containsKey(binding);
+ }
+ else
+ {
+ FieldTable o = _bindings.get(binding);
+ if (o != null)
+ {
+ return arguments.equals(FieldTable.convertToMap(o));
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ }
+
public boolean isBound(AMQShortString routingKey, AMQQueue queue)
{
return isBound(routingKey, null, queue);
@@ -321,11 +380,11 @@ public class TopicExchange extends AbstractExchange
result.removeBinding(binding);
- if(argumentsContainSelector(bindingArgs))
+ if(argumentsContainFilter(bindingArgs))
{
try
{
- result.removeFilteredQueue(binding.getQueue(), createSelectorFilter(bindingArgs));
+ result.removeFilteredQueue(binding.getQueue(), createMessageFilter(bindingArgs, binding.getQueue()));
}
catch (AMQInvalidArgumentException e)
{
@@ -349,11 +408,6 @@ public class TopicExchange extends AbstractExchange
return new TopicExchangeMBean(this);
}
- public Logger getLogger()
- {
- return _logger;
- }
-
private Collection<AMQQueue> getMatchedQueues(InboundMessage message, AMQShortString routingKey)
{
@@ -402,4 +456,96 @@ public class TopicExchange extends AbstractExchange
deregisterQueue(binding);
}
+ private static final class NoLocalFilter implements MessageFilter
+ {
+ private final AMQQueue _queue;
+
+ public NoLocalFilter(AMQQueue queue)
+ {
+ _queue = queue;
+ }
+
+ public boolean matches(Filterable message)
+ {
+ InboundMessage inbound = (InboundMessage) message;
+ final AMQSessionModel exclusiveOwningSession = _queue.getExclusiveOwningSession();
+ return exclusiveOwningSession == null || !exclusiveOwningSession.onSameConnection(inbound);
+
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ NoLocalFilter that = (NoLocalFilter) o;
+
+ return _queue == null ? that._queue == null : _queue.equals(that._queue);
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _queue != null ? _queue.hashCode() : 0;
+ }
+ }
+
+ private static final class CompoundFilter implements MessageFilter
+ {
+ private MessageFilter _noLocalFilter;
+ private MessageFilter _jmsSelectorFilter;
+
+ public CompoundFilter(MessageFilter filter, MessageFilter jmsSelectorFilter)
+ {
+ _noLocalFilter = filter;
+ _jmsSelectorFilter = jmsSelectorFilter;
+ }
+
+ public boolean matches(Filterable message)
+ {
+ return _noLocalFilter.matches(message) && _jmsSelectorFilter.matches(message);
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ CompoundFilter that = (CompoundFilter) o;
+
+ if (_jmsSelectorFilter != null ? !_jmsSelectorFilter.equals(that._jmsSelectorFilter) : that._jmsSelectorFilter != null)
+ {
+ return false;
+ }
+ if (_noLocalFilter != null ? !_noLocalFilter.equals(that._noLocalFilter) : that._noLocalFilter != null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ int result = _noLocalFilter != null ? _noLocalFilter.hashCode() : 0;
+ result = 31 * result + (_jmsSelectorFilter != null ? _jmsSelectorFilter.hashCode() : 0);
+ return result;
+ }
+ }
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/federation/Bridge.java b/java/broker/src/main/java/org/apache/qpid/server/federation/Bridge.java
index b58802e1ff..c7046f8e53 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/federation/Bridge.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/federation/Bridge.java
@@ -132,7 +132,7 @@ public class Bridge implements BridgeConfig
{
try
{
- brokerLink.getVirtualHost().getDurableConfigurationStore().createBridge(this);
+ brokerLink.getVirtualHost().getMessageStore().createBridge(this);
}
catch (AMQStoreException e)
{
@@ -220,7 +220,7 @@ public class Bridge implements BridgeConfig
{
try
{
- brokerLink.getVirtualHost().getDurableConfigurationStore().createBridge(this);
+ brokerLink.getVirtualHost().getMessageStore().createBridge(this);
}
catch (AMQStoreException e)
{
@@ -767,13 +767,13 @@ public class Bridge implements BridgeConfig
try
{
- _queue = AMQQueueFactory.createAMQQueueImpl(_tmpQueueName,
+ _queue = AMQQueueFactory.createAMQQueueImpl(null,
+ _tmpQueueName,
isDurable(),
_link.getFederationTag(),
false,
false,
- getVirtualHost(),
- options);
+ getVirtualHost(), options);
}
catch (AMQException e)
{
diff --git a/java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java b/java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java
index 032df8bb0d..4bcc0d6136 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java
@@ -250,7 +250,7 @@ public class BrokerLink implements LinkConfig, ConnectionListener
{
try
{
- _virtualHost.getDurableConfigurationStore().createBrokerLink(this);
+ _virtualHost.getMessageStore().createBrokerLink(this);
}
catch (AMQStoreException e)
{
@@ -295,7 +295,7 @@ public class BrokerLink implements LinkConfig, ConnectionListener
{
try
{
- _virtualHost.getDurableConfigurationStore().createBrokerLink(this);
+ _virtualHost.getMessageStore().createBrokerLink(this);
}
catch (AMQStoreException e)
{
diff --git a/java/broker/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java b/java/broker/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java
index 18a0e4c8bf..6c158de8b5 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java
@@ -39,6 +39,12 @@ public class SimpleFilterManager implements FilterManager
_filters = new ConcurrentLinkedQueue<MessageFilter>();
}
+ public SimpleFilterManager(JMSSelectorFilter messageFilter)
+ {
+ this();
+ add(messageFilter);
+ }
+
public void add(MessageFilter filter)
{
_filters.add(filter);
diff --git a/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionOpenMethodHandler.java b/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionOpenMethodHandler.java
index 79fcfb6d76..eab28ac9d4 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionOpenMethodHandler.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionOpenMethodHandler.java
@@ -32,6 +32,7 @@ import org.apache.qpid.server.protocol.AMQProtocolSession;
import org.apache.qpid.server.state.AMQState;
import org.apache.qpid.server.state.AMQStateManager;
import org.apache.qpid.server.state.StateAwareMethodListener;
+import org.apache.qpid.server.virtualhost.State;
import org.apache.qpid.server.virtualhost.VirtualHost;
public class ConnectionOpenMethodHandler implements StateAwareMethodListener<ConnectionOpenBody>
@@ -82,6 +83,10 @@ public class ConnectionOpenMethodHandler implements StateAwareMethodListener<Con
{
throw body.getConnectionException(AMQConstant.ACCESS_REFUSED, "Permission denied: '" + virtualHost.getName() + "'");
}
+ else if (virtualHost.getState() != State.ACTIVE)
+ {
+ throw body.getConnectionException(AMQConstant.CONNECTION_FORCED, "Virtual host '" + virtualHost.getName() + "' is not active");
+ }
session.setVirtualHost(virtualHost);
@@ -89,10 +94,10 @@ public class ConnectionOpenMethodHandler implements StateAwareMethodListener<Con
if (session.getContextKey() == null)
{
session.setContextKey(generateClientID());
- }
+ }
MethodRegistry methodRegistry = session.getMethodRegistry();
- AMQMethodBody responseBody = methodRegistry.createConnectionOpenOkBody(body.getVirtualHost());
+ AMQMethodBody responseBody = methodRegistry.createConnectionOpenOkBody(body.getVirtualHost());
stateManager.changeState(AMQState.CONNECTION_OPEN);
diff --git a/java/broker/src/main/java/org/apache/qpid/server/handler/ExchangeDeclareHandler.java b/java/broker/src/main/java/org/apache/qpid/server/handler/ExchangeDeclareHandler.java
index 81e2e5557a..8756409f64 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/handler/ExchangeDeclareHandler.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/handler/ExchangeDeclareHandler.java
@@ -26,6 +26,7 @@ import org.apache.qpid.AMQConnectionException;
import org.apache.qpid.AMQException;
import org.apache.qpid.AMQUnknownExchangeType;
import org.apache.qpid.framing.AMQMethodBody;
+import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.ExchangeDeclareBody;
import org.apache.qpid.framing.MethodRegistry;
import org.apache.qpid.protocol.AMQConstant;
@@ -65,26 +66,39 @@ public class ExchangeDeclareHandler implements StateAwareMethodListener<Exchange
throw body.getChannelNotFoundException(channelId);
}
+ final AMQShortString exchangeName = body.getExchange();
if (_logger.isDebugEnabled())
{
- _logger.debug("Request to declare exchange of type " + body.getType() + " with name " + body.getExchange());
+ _logger.debug("Request to declare exchange of type " + body.getType() + " with name " + exchangeName);
}
synchronized(exchangeRegistry)
{
- Exchange exchange = exchangeRegistry.getExchange(body.getExchange());
+ Exchange exchange = exchangeRegistry.getExchange(exchangeName);
if (exchange == null)
{
if(body.getPassive() && ((body.getType() == null) || body.getType().length() ==0))
{
- throw body.getChannelException(AMQConstant.NOT_FOUND, "Unknown exchange: " + body.getExchange());
+ throw body.getChannelException(AMQConstant.NOT_FOUND, "Unknown exchange: " + exchangeName);
+ }
+ else if(exchangeName.startsWith("amq."))
+ {
+ throw body.getConnectionException(AMQConstant.NOT_ALLOWED,
+ "Attempt to declare exchange: " + exchangeName +
+ " which begins with reserved prefix 'amq.'.");
+ }
+ else if(exchangeName.startsWith("qpid."))
+ {
+ throw body.getConnectionException(AMQConstant.NOT_ALLOWED,
+ "Attempt to declare exchange: " + exchangeName +
+ " which begins with reserved prefix 'qpid.'.");
}
else
{
try
{
- exchange = exchangeFactory.createExchange(body.getExchange() == null ? null : body.getExchange().intern(),
+ exchange = exchangeFactory.createExchange(exchangeName == null ? null : exchangeName.intern(),
body.getType() == null ? null : body.getType().intern(),
body.getDurable(),
body.getPassive(), body.getTicket());
@@ -92,19 +106,20 @@ public class ExchangeDeclareHandler implements StateAwareMethodListener<Exchange
if (exchange.isDurable())
{
- virtualHost.getDurableConfigurationStore().createExchange(exchange);
+ virtualHost.getMessageStore().createExchange(exchange);
}
}
catch(AMQUnknownExchangeType e)
{
- throw body.getConnectionException(AMQConstant.COMMAND_INVALID, "Unknown exchange: " + body.getExchange(),e);
+ throw body.getConnectionException(AMQConstant.COMMAND_INVALID, "Unknown exchange: " + exchangeName,e);
}
}
}
else if (!exchange.getTypeShortString().equals(body.getType()) && !((body.getType() == null || body.getType().length() ==0) && body.getPassive()))
{
- throw new AMQConnectionException(AMQConstant.NOT_ALLOWED, "Attempt to redeclare exchange: " + body.getExchange() + " of type " + exchange.getTypeShortString() + " to " + body.getType() +".",body.getClazz(), body.getMethod(),body.getMajor(),body.getMinor(),null);
+ throw new AMQConnectionException(AMQConstant.NOT_ALLOWED, "Attempt to redeclare exchange: " +
+ exchangeName + " of type " + exchange.getTypeShortString() + " to " + body.getType() +".",body.getClazz(), body.getMethod(),body.getMajor(),body.getMinor(),null);
}
}
if(!body.getNowait())
diff --git a/java/broker/src/main/java/org/apache/qpid/server/handler/QueueBindHandler.java b/java/broker/src/main/java/org/apache/qpid/server/handler/QueueBindHandler.java
index bb979d5441..49ca934966 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/handler/QueueBindHandler.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/handler/QueueBindHandler.java
@@ -134,7 +134,7 @@ public class QueueBindHandler implements StateAwareMethodListener<QueueBindBody>
Map<String, Object> oldArgs = oldBinding.getArguments();
if((oldArgs == null && !arguments.isEmpty()) || (oldArgs != null && !oldArgs.equals(arguments)))
{
- virtualHost.getBindingFactory().replaceBinding(bindingKey, queue, exch, arguments);
+ virtualHost.getBindingFactory().replaceBinding(oldBinding.getId(), bindingKey, queue, exch, arguments);
}
}
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java b/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java
index f57f7eb9e6..396829df91 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java
@@ -24,6 +24,7 @@ import org.apache.log4j.Logger;
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.framing.MethodRegistry;
import org.apache.qpid.framing.QueueDeclareBody;
import org.apache.qpid.framing.QueueDeclareOkBody;
@@ -31,6 +32,7 @@ import org.apache.qpid.protocol.AMQConstant;
import org.apache.qpid.server.AMQChannel;
import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.exchange.ExchangeRegistry;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.protocol.AMQProtocolSession;
import org.apache.qpid.server.protocol.AMQSessionModel;
import org.apache.qpid.server.queue.AMQQueue;
@@ -43,6 +45,7 @@ import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Collections;
+import java.util.Map;
import java.util.UUID;
public class QueueDeclareHandler implements StateAwareMethodListener<QueueDeclareBody>
@@ -65,7 +68,7 @@ public class QueueDeclareHandler implements StateAwareMethodListener<QueueDeclar
VirtualHost virtualHost = protocolConnection.getVirtualHost();
ExchangeRegistry exchangeRegistry = virtualHost.getExchangeRegistry();
QueueRegistry queueRegistry = virtualHost.getQueueRegistry();
- DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
+ DurableConfigurationStore store = virtualHost.getMessageStore();
final AMQShortString queueName;
@@ -219,10 +222,11 @@ public class QueueDeclareHandler implements StateAwareMethodListener<QueueDeclar
throws AMQException
{
final QueueRegistry registry = virtualHost.getQueueRegistry();
- AMQShortString owner = body.getExclusive() ? session.getContextKey() : null;
+ String owner = body.getExclusive() ? AMQShortString.toString(session.getContextKey()) : null;
- final AMQQueue queue = AMQQueueFactory.createAMQQueueImpl(queueName, body.getDurable(), owner, body.getAutoDelete(),
- body.getExclusive(),virtualHost, body.getArguments());
+ Map<String, Object> arguments = FieldTable.convertToMap(body.getArguments());
+ final AMQQueue queue = AMQQueueFactory.createAMQQueueImpl(UUIDGenerator.generateUUID(), AMQShortString.toString(queueName), body.getDurable(), owner, body.getAutoDelete(),
+ body.getExclusive(),virtualHost, arguments);
if (body.getExclusive() && !body.getDurable())
{
diff --git a/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeleteHandler.java b/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeleteHandler.java
index cc37259d54..762f090b83 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeleteHandler.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeleteHandler.java
@@ -62,7 +62,7 @@ public class QueueDeleteHandler implements StateAwareMethodListener<QueueDeleteB
AMQProtocolSession protocolConnection = stateManager.getProtocolSession();
VirtualHost virtualHost = protocolConnection.getVirtualHost();
QueueRegistry queueRegistry = virtualHost.getQueueRegistry();
- DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
+ DurableConfigurationStore store = virtualHost.getMessageStore();
AMQChannel channel = protocolConnection.getChannel(channelId);
diff --git a/java/broker/src/main/java/org/apache/qpid/server/logging/actors/CurrentActor.java b/java/broker/src/main/java/org/apache/qpid/server/logging/actors/CurrentActor.java
index feacf35d41..97134515a0 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/logging/actors/CurrentActor.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/logging/actors/CurrentActor.java
@@ -20,11 +20,13 @@
*/
package org.apache.qpid.server.logging.actors;
-import org.apache.qpid.server.logging.LogActor;
-
import java.util.EmptyStackException;
import java.util.Stack;
+import org.apache.qpid.server.logging.LogActor;
+import org.apache.qpid.server.logging.LogMessage;
+import org.apache.qpid.server.logging.LogSubject;
+
/**
* The CurrentActor is a ThreadLocal wrapper that allows threads in the broker
* to retrieve an actor to perform logging. This approach is used so for two
@@ -126,4 +128,14 @@ public class CurrentActor
{
_defaultActor = defaultActor;
}
+
+ public static void message(LogSubject subject, LogMessage message)
+ {
+ get().message(subject, message);
+ }
+
+ public static void message(LogMessage message)
+ {
+ get().message(message);
+ }
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/logging/messages/ConfigStore_logmessages.properties b/java/broker/src/main/java/org/apache/qpid/server/logging/messages/ConfigStore_logmessages.properties
index 3bc5074777..541f8b8c68 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/logging/messages/ConfigStore_logmessages.properties
+++ b/java/broker/src/main/java/org/apache/qpid/server/logging/messages/ConfigStore_logmessages.properties
@@ -18,8 +18,7 @@
#
# Default File used for all non-defined locales.
-# 0 - name
-CREATED = CFG-1001 : Created : {0}
+CREATED = CFG-1001 : Created
# 0 - path
STORE_LOCATION = CFG-1002 : Store location : {0}
CLOSE = CFG-1003 : Closed
diff --git a/java/broker/src/main/java/org/apache/qpid/server/logging/messages/MessageStore_logmessages.properties b/java/broker/src/main/java/org/apache/qpid/server/logging/messages/MessageStore_logmessages.properties
index a2cedeb22a..081f2bbca3 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/logging/messages/MessageStore_logmessages.properties
+++ b/java/broker/src/main/java/org/apache/qpid/server/logging/messages/MessageStore_logmessages.properties
@@ -18,11 +18,11 @@
#
# Default File used for all non-defined locales.
#
-# 0 - name
-CREATED = MST-1001 : Created : {0}
+CREATED = MST-1001 : Created
# 0 - path
STORE_LOCATION = MST-1002 : Store location : {0}
CLOSED = MST-1003 : Closed
RECOVERY_START = MST-1004 : Recovery Start
RECOVERED = MST-1005 : Recovered {0,number} messages
-RECOVERY_COMPLETE = MST-1006 : Recovery Complete \ No newline at end of file
+RECOVERY_COMPLETE = MST-1006 : Recovery Complete
+PASSIVATE = MST-1007 : Store Passivated
diff --git a/java/broker/src/main/java/org/apache/qpid/server/logging/messages/TransactionLog_logmessages.properties b/java/broker/src/main/java/org/apache/qpid/server/logging/messages/TransactionLog_logmessages.properties
index fadc2e2098..b9e87159a6 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/logging/messages/TransactionLog_logmessages.properties
+++ b/java/broker/src/main/java/org/apache/qpid/server/logging/messages/TransactionLog_logmessages.properties
@@ -19,8 +19,7 @@
# Default File used for all non-defined locales.
#
#
-# 0 - name
-CREATED = TXN-1001 : Created : {0}
+CREATED = TXN-1001 : Created
# 0 - path
STORE_LOCATION = TXN-1002 : Store location : {0}
CLOSED = TXN-1003 : Closed
@@ -31,3 +30,9 @@ RECOVERY_START = TXN-1004 : Recovery Start[ : {0}]
RECOVERED = TXN-1005 : Recovered {0,number} messages for queue {1}
# 0 - queue name
RECOVERY_COMPLETE = TXN-1006 : Recovery Complete[ : {0}]
+# 0 - xid
+# 1 - queue name
+XA_INCOMPLETE_QUEUE = TXN-1007 : XA transaction recover for xid {0} incomplete as it references a queue {1} which was not durably retained
+# 0 - xid format
+# 1 - message id
+XA_INCOMPLETE_MESSAGE = TXN-1008 : XA transaction recover for xid {0} incomplete as it references a message {1} which was not durably retained
diff --git a/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/BindingLogSubject.java b/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/BindingLogSubject.java
index 8f0b9182a9..6f18cbcc6b 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/BindingLogSubject.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/BindingLogSubject.java
@@ -40,7 +40,8 @@ public class BindingLogSubject extends AbstractLogSubject
public BindingLogSubject(String routingKey, Exchange exchange,
AMQQueue queue)
{
- setLogStringWithFormat(BINDING_FORMAT, queue.getVirtualHost().getName(),
+ setLogStringWithFormat(BINDING_FORMAT,
+ queue.getVirtualHost().getName(),
exchange.getTypeShortString(),
exchange.getNameShortString(),
queue.getNameShortString(),
diff --git a/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubject.java b/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubject.java
index 969288be00..08963bd8f1 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubject.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubject.java
@@ -20,7 +20,6 @@
*/
package org.apache.qpid.server.logging.subjects;
-import org.apache.qpid.server.store.MessageStore;
import org.apache.qpid.server.virtualhost.VirtualHost;
import static org.apache.qpid.server.logging.subjects.LogSubjectFormat.STORE_FORMAT;
@@ -28,10 +27,9 @@ import static org.apache.qpid.server.logging.subjects.LogSubjectFormat.STORE_FOR
public class MessageStoreLogSubject extends AbstractLogSubject
{
- /** Create an ExchangeLogSubject that Logs in the following format. */
- public MessageStoreLogSubject(VirtualHost vhost, MessageStore store)
+ /** Create an MessageStoreLogSubject that Logs in the following format. */
+ public MessageStoreLogSubject(VirtualHost vhost, String messageStoreName)
{
- setLogStringWithFormat(STORE_FORMAT, vhost.getName(),
- store.getClass().getSimpleName());
+ setLogStringWithFormat(STORE_FORMAT, vhost.getName(), messageStoreName);
}
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/management/AbstractAMQManagedConnectionObject.java b/java/broker/src/main/java/org/apache/qpid/server/management/AbstractAMQManagedConnectionObject.java
index e7c07b6dd4..6cfc827046 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/management/AbstractAMQManagedConnectionObject.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/management/AbstractAMQManagedConnectionObject.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.server.management;
import org.apache.qpid.management.common.mbeans.ManagedConnection;
diff --git a/java/broker/src/main/java/org/apache/qpid/server/management/JMXManagedObjectRegistry.java b/java/broker/src/main/java/org/apache/qpid/server/management/JMXManagedObjectRegistry.java
index b6623bbd09..04a5b27991 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/management/JMXManagedObjectRegistry.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/management/JMXManagedObjectRegistry.java
@@ -157,9 +157,7 @@ public class JMXManagedObjectRegistry implements ManagedObjectRegistry
if (!ksf.exists())
{
- throw new FileNotFoundException("Cannot find JMX management SSL keystore file " + ksf + "\n"
- + "Check broker configuration, or see create-example-ssl-stores script"
- + "in the bin/ directory if you need to generate an example store.");
+ throw new FileNotFoundException("Cannot find JMX management SSL keystore file: " + ksf);
}
if (!ksf.canRead())
{
diff --git a/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_0_10.java b/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_0_10.java
index 805094a061..88b0f60346 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_0_10.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_0_10.java
@@ -50,6 +50,7 @@ public class MessageMetaData_0_10 implements StorableMessageMetaData, InboundMes
public static final MessageMetaDataType.Factory<MessageMetaData_0_10> FACTORY = new MetaDataFactory();
private volatile ByteBuffer _encoded;
+ private Object _connectionReference;
public MessageMetaData_0_10(MessageTransfer xfr)
@@ -219,6 +220,16 @@ public class MessageMetaData_0_10 implements StorableMessageMetaData, InboundMes
return _header;
}
+ public void setConnectionReference(Object connectionReference)
+ {
+ _connectionReference = connectionReference;
+ }
+
+ public Object getConnectionReference()
+ {
+ return _connectionReference;
+ }
+
private static class MetaDataFactory implements MessageMetaDataType.Factory<MessageMetaData_0_10>
{
public MessageMetaData_0_10 createMetaData(ByteBuffer buf)
diff --git a/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_1_0.java b/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_1_0.java
new file mode 100755
index 0000000000..7d030fe711
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_1_0.java
@@ -0,0 +1,522 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.qpid.server.message;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoder;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpSequence;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+import org.apache.qpid.amqp_1_0.type.messaging.Data;
+import org.apache.qpid.amqp_1_0.type.messaging.DeliveryAnnotations;
+import org.apache.qpid.amqp_1_0.type.messaging.Footer;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.MessageAnnotations;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+import org.apache.qpid.server.store.MessageMetaDataType;
+import org.apache.qpid.server.store.StorableMessageMetaData;
+
+public class MessageMetaData_1_0 implements StorableMessageMetaData
+{
+ // TODO move to somewhere more useful
+ public static final Symbol JMS_TYPE = Symbol.valueOf("x-opt-jms-type");
+
+
+ private Header _header;
+ private Properties _properties;
+ private Map _deliveryAnnotations;
+ private Map _messageAnnotations;
+ private Map _appProperties;
+ private Map _footer;
+
+ private List<ByteBuffer> _encodedSections = new ArrayList<ByteBuffer>(3);
+
+ private volatile ByteBuffer _encoded;
+ private MessageHeader_1_0 _messageHeader;
+
+
+
+ public MessageMetaData_1_0(ByteBuffer[] fragments, SectionDecoder decoder)
+ {
+ this(fragments, decoder, new ArrayList<ByteBuffer>(3));
+ }
+
+ public MessageMetaData_1_0(ByteBuffer[] fragments, SectionDecoder decoder, List<ByteBuffer> immuatableSections)
+ {
+ this(constructSections(fragments, decoder,immuatableSections), immuatableSections);
+ }
+
+ private MessageMetaData_1_0(List<Section> sections, List<ByteBuffer> encodedSections)
+ {
+ _encodedSections = encodedSections;
+
+ Iterator<Section> sectIter = sections.iterator();
+
+ Section section = sectIter.hasNext() ? sectIter.next() : null;
+ if(section instanceof Header)
+ {
+ _header = (Header) section;
+ section = sectIter.hasNext() ? sectIter.next() : null;
+ }
+
+ if(section instanceof DeliveryAnnotations)
+ {
+ _deliveryAnnotations = ((DeliveryAnnotations) section).getValue();
+ section = sectIter.hasNext() ? sectIter.next() : null;
+ }
+
+ if(section instanceof MessageAnnotations)
+ {
+ _messageAnnotations = ((MessageAnnotations) section).getValue();
+ section = sectIter.hasNext() ? sectIter.next() : null;
+ }
+
+ if(section instanceof Properties)
+ {
+ _properties = (Properties) section;
+ section = sectIter.hasNext() ? sectIter.next() : null;
+ }
+
+ if(section instanceof ApplicationProperties)
+ {
+ _appProperties = ((ApplicationProperties) section).getValue();
+ section = sectIter.hasNext() ? sectIter.next() : null;
+ }
+
+ if(section instanceof Footer)
+ {
+ _footer = ((Footer) section).getValue();
+ section = sectIter.hasNext() ? sectIter.next() : null;
+ }
+
+ _messageHeader = new MessageHeader_1_0();
+
+ }
+
+ private static List<Section> constructSections(final ByteBuffer[] fragments, final SectionDecoder decoder, List<ByteBuffer> encodedSections)
+ {
+ List<Section> sections = new ArrayList<Section>(3);
+
+ ByteBuffer src;
+ if(fragments.length == 1)
+ {
+ src = fragments[0].duplicate();
+ }
+ else
+ {
+ int size = 0;
+ for(ByteBuffer buf : fragments)
+ {
+ size += buf.remaining();
+ }
+ src = ByteBuffer.allocate(size);
+ for(ByteBuffer buf : fragments)
+ {
+ src.put(buf.duplicate());
+ }
+ src.flip();
+
+ }
+
+ try
+ {
+ int startBarePos = -1;
+ int lastPos = src.position();
+ Section s = decoder.readSection(src);
+
+
+
+ if(s instanceof Header)
+ {
+ sections.add(s);
+ lastPos = src.position();
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+
+ if(s instanceof DeliveryAnnotations)
+ {
+ sections.add(s);
+ lastPos = src.position();
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+
+ if(s instanceof MessageAnnotations)
+ {
+ sections.add(s);
+ lastPos = src.position();
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+
+ if(s instanceof Properties)
+ {
+ sections.add(s);
+ if(startBarePos == -1)
+ {
+ startBarePos = lastPos;
+ }
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+
+ if(s instanceof ApplicationProperties)
+ {
+ sections.add(s);
+ if(startBarePos == -1)
+ {
+ startBarePos = lastPos;
+ }
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+
+ if(s instanceof AmqpValue)
+ {
+ if(startBarePos == -1)
+ {
+ startBarePos = lastPos;
+ }
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+ else if(s instanceof Data)
+ {
+ if(startBarePos == -1)
+ {
+ startBarePos = lastPos;
+ }
+ do
+ {
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ } while(s instanceof Data);
+ }
+ else if(s instanceof AmqpSequence)
+ {
+ if(startBarePos == -1)
+ {
+ startBarePos = lastPos;
+ }
+ do
+ {
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+ while(s instanceof AmqpSequence);
+ }
+
+ if(s instanceof Footer)
+ {
+ sections.add(s);
+ }
+
+
+ int pos = 0;
+ for(ByteBuffer buf : fragments)
+ {
+/*
+ if(pos < startBarePos)
+ {
+ if(pos + buf.remaining() > startBarePos)
+ {
+ ByteBuffer dup = buf.duplicate();
+ dup.position(dup.position()+startBarePos-pos);
+ dup.slice();
+ encodedSections.add(dup);
+ }
+ }
+ else
+*/
+ {
+ encodedSections.add(buf.duplicate());
+ }
+ pos += buf.remaining();
+ }
+
+ return sections;
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+
+ public MessageMetaDataType getType()
+ {
+ return MessageMetaDataType.META_DATA_1_0;
+ }
+
+
+ public int getStorableSize()
+ {
+ int size = 0;
+
+ for(ByteBuffer bin : _encodedSections)
+ {
+ size += bin.limit();
+ }
+
+ return size;
+ }
+
+ private ByteBuffer encodeAsBuffer()
+ {
+ ByteBuffer buf = ByteBuffer.allocate(getStorableSize());
+
+ for(ByteBuffer bin : _encodedSections)
+ {
+ buf.put(bin.duplicate());
+ }
+
+ return buf;
+ }
+
+ public int writeToBuffer(int offsetInMetaData, ByteBuffer dest)
+ {
+ ByteBuffer buf = _encoded;
+
+ if(buf == null)
+ {
+ buf = encodeAsBuffer();
+ _encoded = buf;
+ }
+
+ buf = buf.duplicate();
+
+ buf.position(offsetInMetaData);
+
+ if(dest.remaining() < buf.limit())
+ {
+ buf.limit(dest.remaining());
+ }
+ dest.put(buf);
+ return buf.limit();
+ }
+
+ public int getContentSize()
+ {
+ ByteBuffer buf = _encoded;
+
+ if(buf == null)
+ {
+ buf = encodeAsBuffer();
+ _encoded = buf;
+ }
+ return buf.remaining();
+ }
+
+ public boolean isPersistent()
+ {
+ return _header != null && Boolean.TRUE.equals(_header.getDurable());
+ }
+
+ public MessageHeader_1_0 getMessageHeader()
+ {
+ return _messageHeader;
+ }
+
+ public static final MessageMetaDataType.Factory<MessageMetaData_1_0> FACTORY = new MetaDataFactory();
+
+
+ private static class MetaDataFactory implements MessageMetaDataType.Factory<MessageMetaData_1_0>
+ {
+ private final AMQPDescribedTypeRegistry _typeRegistry = AMQPDescribedTypeRegistry.newInstance();
+
+ public MessageMetaData_1_0 createMetaData(ByteBuffer buf)
+ {
+ ValueHandler valueHandler = new ValueHandler(_typeRegistry);
+
+ ArrayList<Section> sections = new ArrayList<Section>(3);
+ ArrayList<ByteBuffer> encodedSections = new ArrayList<ByteBuffer>(3);
+
+ while(buf.hasRemaining())
+ {
+ try
+ {
+ ByteBuffer encodedBuf = buf.duplicate();
+ sections.add((Section) valueHandler.parse(buf));
+ encodedBuf.limit(buf.position());
+ encodedSections.add(encodedBuf);
+
+ }
+ catch (AmqpErrorException e)
+ {
+ //TODO
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ return new MessageMetaData_1_0(sections,encodedSections);
+
+ }
+ }
+
+ public class MessageHeader_1_0 implements AMQMessageHeader
+ {
+
+ public String getCorrelationId()
+ {
+ if(_properties == null || _properties.getCorrelationId() == null)
+ {
+ return null;
+ }
+ else
+ {
+ return _properties.getMessageId().toString();
+ }
+ }
+
+ public long getExpiration()
+ {
+ return 0; //TODO
+ }
+
+ public String getMessageId()
+ {
+ if(_properties == null || _properties.getCorrelationId() == null)
+ {
+ return null;
+ }
+ else
+ {
+ return _properties.getCorrelationId().toString();
+ }
+ }
+
+ public String getMimeType()
+ {
+
+ if(_properties == null || _properties.getContentType() == null)
+ {
+ return null;
+ }
+ else
+ {
+ return _properties.getContentType().toString();
+ }
+ }
+
+ public String getEncoding()
+ {
+ return null; //TODO
+ }
+
+ public byte getPriority()
+ {
+ if(_header == null || _header.getPriority() == null)
+ {
+ return 4; //javax.jms.Message.DEFAULT_PRIORITY;
+ }
+ else
+ {
+ return _header.getPriority().byteValue();
+ }
+ }
+
+ public long getTimestamp()
+ {
+ if(_properties == null || _properties.getCreationTime() == null)
+ {
+ return 0L;
+ }
+ else
+ {
+ return _properties.getCreationTime().getTime();
+ }
+
+ }
+
+ public String getType()
+ {
+
+ if(_messageAnnotations == null || _messageAnnotations.get(JMS_TYPE) == null)
+ {
+ return null;
+ }
+ else
+ {
+ return _messageAnnotations.get(JMS_TYPE).toString();
+ }
+ }
+
+ public String getReplyTo()
+ {
+ if(_properties == null || _properties.getReplyTo() == null)
+ {
+ return null;
+ }
+ else
+ {
+ return _properties.getReplyTo().toString();
+ }
+ }
+
+ public String getReplyToExchange()
+ {
+ return null; //TODO
+ }
+
+ public String getReplyToRoutingKey()
+ {
+ return null; //TODO
+ }
+
+ public Object getHeader(final String name)
+ {
+ return _appProperties == null ? null : _appProperties.get(name);
+ }
+
+ public boolean containsHeaders(final Set<String> names)
+ {
+ if(_appProperties == null)
+ {
+ return false;
+ }
+
+ for(String key : names)
+ {
+ if(!_appProperties.containsKey(key))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public boolean containsHeader(final String name)
+ {
+ return _appProperties != null && _appProperties.containsKey(name);
+ }
+
+ public String getSubject()
+ {
+ return _properties == null ? null : _properties.getSubject();
+ }
+ }
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/model/Binding.java b/java/broker/src/main/java/org/apache/qpid/server/model/Binding.java
new file mode 100644
index 0000000000..fdb009386c
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/model/Binding.java
@@ -0,0 +1,75 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+public interface Binding extends ConfiguredObject
+{
+
+ public String MATCHED_BYTES = "matchedBytes";
+ public String MATCHED_MESSAGES = "matchedMessages";
+ public String STATE_CHANGED = "stateChanged";
+
+ public static final Collection<String> AVAILABLE_STATISTICS =
+ Collections.unmodifiableCollection(
+ Arrays.asList(
+ MATCHED_BYTES,
+ MATCHED_MESSAGES,
+ STATE_CHANGED));
+
+
+ public String ARGUMENTS = "arguments";
+ public String CREATED = "created";
+ public String DURABLE = "durable";
+ public String ID = "id";
+ public String LIFETIME_POLICY = "lifetimePolicy";
+ public String NAME = "name";
+ public String STATE = "state";
+ public String TIME_TO_LIVE = "timeToLive";
+ public String UPDATED = "updated";
+ public String QUEUE = "queue";
+ public String EXCHANGE = "exchange";
+
+ public static final Collection<String> AVAILABLE_ATTRIBUTES =
+ Collections.unmodifiableCollection(
+ Arrays.asList(ID,
+ NAME,
+ STATE,
+ DURABLE,
+ LIFETIME_POLICY,
+ TIME_TO_LIVE,
+ CREATED,
+ UPDATED,
+ EXCHANGE,
+ QUEUE,
+ ARGUMENTS)
+ );
+
+
+
+ Map<String,Object> getArguments();
+
+ void delete();
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/model/ConfigurationChangeListener.java b/java/broker/src/main/java/org/apache/qpid/server/model/ConfigurationChangeListener.java
new file mode 100644
index 0000000000..6477633a9b
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/model/ConfigurationChangeListener.java
@@ -0,0 +1,38 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+public interface ConfigurationChangeListener
+{
+ /**
+ * Inform the listener that the passed object has changed state
+ *
+ * @param object the object whose state has changed
+ * @param oldState the state prior to the change
+ * @param newState the state after the change
+ */
+ void stateChanged(ConfiguredObject object, State oldState, State newState);
+
+ void childAdded(ConfiguredObject object, ConfiguredObject child);
+
+ void childRemoved(ConfiguredObject object, ConfiguredObject child);
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java b/java/broker/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java
new file mode 100644
index 0000000000..fb47a54d0a
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java
@@ -0,0 +1,229 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.security.AccessControlException;
+import java.util.Collection;
+import java.util.UUID;
+
+public interface ConfiguredObject
+{
+
+ /**
+ * Get the universally unique identifier for the object
+ *
+ * @return the objects id
+ */
+ UUID getId();
+
+ /**
+ * Get the name of the object
+ *
+ * @return the name of the object
+ */
+ String getName();
+
+
+ /**
+ * Attempt to change the name of the object
+ *
+ * Request a change to the name of the object. The caller must pass in the name it believes the object currently
+ * has. If the current name differes from this expected value, then no name change will occur
+ *
+ * @param currentName the name the caller believes the object to have
+ * @param desiredName the name the caller would like the object to have
+ * @return the new name for the object
+ * @throws IllegalStateException if the name of the object may not be changed in in the current state
+ * @throws AccessControlException if the current context does not have permission to change the name
+ * @throws IllegalArgumentException if the provided name is not legal
+ * @throws NullPointerException if the desired name is null
+ */
+ String setName(String currentName, String desiredName) throws IllegalStateException,
+ AccessControlException;
+
+
+ /**
+ * Get the desired state of the object.
+ *
+ * This is the state set at the object itself, however the object
+ * may not be able attain this state if one of its ancestors is in a different state (in particular a descendant
+ * object may not be ACTIVE if all of its ancestors are not also ACTIVE).
+ *
+ * @return the desired state of the object
+ */
+ State getDesiredState();
+
+ /**
+ * Change the desired state of the object
+ *
+ * Request a change to the current state. The caller must pass in the state it believe the object to be in, if
+ * this differs from the current desired state when the object evalues the request, then no state change will occur.
+ *
+ * @param currentState the state the caller believes the object to be in
+ * @param desiredState the state the caller wishes the object to attain
+ * @return the new current state
+ * @throws IllegalStateTransitionException the requested state tranisition is invalid
+ * @throws AccessControlException the current context does not have sufficeint permissions to change the state
+ */
+ State setDesiredState(State currentState, State desiredState) throws IllegalStateTransitionException,
+ AccessControlException;
+
+ /**
+ * Get the actual state of the object.
+ *
+ * This state is derived fromt the desired state of the object itself and
+ * the actual state of its parents. If an object "desires" to be ACTIVE, but one of its parents is STOPPED, then
+ * the actual state of the object will be STOPPED
+ *
+ * @return the actual state of the object
+ */
+ State getActualState();
+
+
+ /**
+ * Add a listener which will be informed of all changes to this configuration object
+ *
+ * @param listener the listener to add
+ */
+ void addChangeListener(ConfigurationChangeListener listener);
+
+ /**
+ * Remove a change listener
+ *
+ *
+ * @param listener the listener to remove
+ * @return true iff a listener was removed
+ */
+ boolean removeChangeListener(ConfigurationChangeListener listener);
+
+ /**
+ * Get the parent of the given type for this object
+ *
+ * @param clazz the class of parent being asked for
+ * @return the objects parent
+ */
+ <T extends ConfiguredObject> T getParent(Class<T> clazz);
+
+
+ /**
+ * Returns whether the the object configuration is durably stored
+ *
+ * @return the durablity
+ */
+ boolean isDurable();
+
+ /**
+ * Sets the durability of the object
+ *
+ * @param durable true iff the caller wishes the object to store its configuration durably
+ *
+ * @throws IllegalStateException if the durability cannot be changed in the current state
+ * @throws AccessControlException if the current context does not have sufficient permission to change the durability
+ * @throws IllegalArgumentException if the object does not support the requested durability
+ */
+ void setDurable(boolean durable) throws IllegalStateException,
+ AccessControlException,
+ IllegalArgumentException;
+
+ /**
+ * Return the lifetime policy for the object
+ *
+ * @return the lifetime policy
+ */
+ LifetimePolicy getLifetimePolicy();
+
+ /**
+ * Set the lifetime policy of the object
+ *
+ * @param expected The lifetime policy the caller believes the object currently has
+ * @param desired The lifetime policy the caller desires the object to have
+ * @return the new lifetime policy
+ * @throws IllegalStateException if the lifetime policy cannot be changed in the current state
+ * @throws AccessControlException if the caller does not have permission to change the lifetime policy
+ * @throws IllegalArgumentException if the object does not support the requested lifetime policy
+ */
+ LifetimePolicy setLifetimePolicy(LifetimePolicy expected, LifetimePolicy desired) throws IllegalStateException,
+ AccessControlException,
+ IllegalArgumentException;
+
+ /**
+ * Get the time the object will live once the lifetime policy conditions are no longer fulfilled
+ *
+ * @return the time to live
+ */
+ long getTimeToLive();
+
+ /**
+ * Set the ttl value
+ *
+ * @param expected the ttl the caller believes the object currently has
+ * @param desired the ttl value the caller
+ * @return the new ttl value
+ * @throws IllegalStateException if the ttl cannot be set in the current state
+ * @throws AccessControlException if the caller does not have permission to change the ttl
+ * @throws IllegalArgumentException if the object does not support the requested ttl value
+ */
+ long setTimeToLive(long expected, long desired) throws IllegalStateException,
+ AccessControlException,
+ IllegalArgumentException;
+
+ /**
+ * Get the names of attributes that are set on this object
+ *
+ * Not that the returned collection is correct at the time the method is called, but will not reflect future
+ * additions or removals when they occur
+ *
+ * @return the collection of attribute names
+ */
+ Collection<String> getAttributeNames();
+
+
+ /**
+ * Return the value for the given attribute
+ *
+ * @param name the name of the attribute
+ * @return the value of the attribute at the object (or null if the attribute is not set
+ */
+ Object getAttribute(String name);
+
+ /**
+ * Set the value of an attribute
+ *
+ * @param name the name of the attribute to be set
+ * @param expected the value the caller believes the attribute currently has (or null if it is expected to be unset)
+ * @param desired the desired value for the attribute (or null to unset the attribute)
+ * @return the new value for the given attribute
+ * @throws IllegalStateException if the attribute cannot be set while the object is in its current state
+ * @throws AccessControlException if the caller does not have permission to alter the value of the attribute
+ * @throws IllegalArgumentException if the provided value is not valid for the given argument
+ */
+ Object setAttribute(String name, Object expected, Object desired) throws IllegalStateException,
+ AccessControlException,
+ IllegalArgumentException;
+
+
+ /**
+ * Return the Statistics holder for the ConfiguredObject
+ *
+ * @return the Statistics holder for the ConfiguredObject (or null if none exists)
+ */
+ Statistics getStatistics();
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/model/Consumer.java b/java/broker/src/main/java/org/apache/qpid/server/model/Consumer.java
new file mode 100644
index 0000000000..958177e713
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/model/Consumer.java
@@ -0,0 +1,73 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+
+public interface Consumer extends ConfiguredObject
+{
+ public String DISTRIBUTION_MODE = "distributionMode";
+ public String EXCLUSIVE = "exclusive";
+ public String NO_LOCAL = "noLocal";
+ public String SELECTOR = "selector";
+ public String SETTLEMENT_MODE = "settlementMode";
+ public String CREATED = "created";
+ public String DURABLE = "durable";
+ public String ID = "id";
+ public String LIFETIME_POLICY = "lifetimePolicy";
+ public String NAME = "name";
+ public String STATE = "state";
+ public String TIME_TO_LIVE = "timeToLive";
+ public String UPDATED = "updated";
+
+ public Collection<String> AVAILABLE_ATTRIBUTES =
+ Collections.unmodifiableCollection(
+ Arrays.asList(ID,
+ NAME,
+ STATE,
+ DURABLE,
+ LIFETIME_POLICY,
+ TIME_TO_LIVE,
+ CREATED,
+ UPDATED,
+ DISTRIBUTION_MODE,
+ SETTLEMENT_MODE,
+ EXCLUSIVE,
+ NO_LOCAL,
+ SELECTOR));
+
+ public String BYTES_OUT = "bytesOut";
+ public String MESSAGES_OUT = "messagesOut";
+ public String STATE_CHANGED = "stateChanged";
+ public String UNACKNOWLEDGED_BYTES = "unacknowledgedBytes";
+ public String UNACKNOWLEDGED_MESSAGES = "unacknowledgedMessages";
+
+ public Collection<String> AVAILABLE_STATISTICS =
+ Collections.unmodifiableCollection(
+ Arrays.asList(BYTES_OUT,
+ MESSAGES_OUT,
+ STATE_CHANGED,
+ UNACKNOWLEDGED_BYTES,
+ UNACKNOWLEDGED_MESSAGES)
+ );
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/model/Exchange.java b/java/broker/src/main/java/org/apache/qpid/server/model/Exchange.java
new file mode 100644
index 0000000000..e872273d05
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/model/Exchange.java
@@ -0,0 +1,91 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+public interface Exchange extends ConfiguredObject
+{
+ String BINDING_COUNT = "bindingCount";
+ String BYTES_DROPPED = "bytesDropped";
+ String BYTES_IN = "bytesIn";
+ String MESSAGES_DROPPED = "messagesDropped";
+ String MESSAGES_IN = "messagesIn";
+ String PRODUCER_COUNT = "producerCount";
+ String STATE_CHANGED = "stateChanged";
+
+ public static final Collection<String> AVAILABLE_STATISTICS =
+ Collections.unmodifiableList(
+ Arrays.asList(BINDING_COUNT,
+ BYTES_DROPPED,
+ BYTES_IN,
+ MESSAGES_DROPPED,
+ MESSAGES_IN,
+ PRODUCER_COUNT,
+ STATE_CHANGED));
+
+ String CREATED = "created";
+ String DURABLE = "durable";
+ String ID = "id";
+ String LIFETIME_POLICY = "lifetimePolicy";
+ String NAME = "name";
+ String STATE = "state";
+ String TIME_TO_LIVE = "timeToLive";
+ String UPDATED = "updated";
+ String ALTERNATE_EXCHANGE = "alternateExchange";
+ String TYPE = "type";
+
+ // Attributes
+ public static final Collection<String> AVAILABLE_ATTRIBUTES =
+ Collections.unmodifiableList(
+ Arrays.asList(
+ ID,
+ NAME,
+ STATE,
+ DURABLE,
+ LIFETIME_POLICY,
+ TIME_TO_LIVE,
+ CREATED,
+ UPDATED,
+ ALTERNATE_EXCHANGE,
+ TYPE
+ ));
+
+ String getExchangeType();
+
+ //children
+ Collection<Binding> getBindings();
+ Collection<Publisher> getPublishers();
+
+ //operations
+ Binding createBinding(String bindingKey,
+ Queue queue,
+ Map<String,Object> bindingArguments,
+ Map<String, Object> attributes);
+
+
+ // Statistics
+
+ void delete();
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/model/IllegalStateTransitionException.java b/java/broker/src/main/java/org/apache/qpid/server/model/IllegalStateTransitionException.java
new file mode 100644
index 0000000000..9cab5e2103
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/model/IllegalStateTransitionException.java
@@ -0,0 +1,43 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+public class IllegalStateTransitionException extends RuntimeException
+{
+ public IllegalStateTransitionException()
+ {
+ }
+
+ public IllegalStateTransitionException(final String message)
+ {
+ super(message);
+ }
+
+ public IllegalStateTransitionException(final String message, final Throwable cause)
+ {
+ super(message, cause);
+ }
+
+ public IllegalStateTransitionException(final Throwable cause)
+ {
+ super(cause);
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/model/LifetimePolicy.java b/java/broker/src/main/java/org/apache/qpid/server/model/LifetimePolicy.java
new file mode 100644
index 0000000000..c9006f4e71
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/model/LifetimePolicy.java
@@ -0,0 +1,27 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+public enum LifetimePolicy
+{
+ PERMANENT,
+ AUTO_DELETE
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/model/Publisher.java b/java/broker/src/main/java/org/apache/qpid/server/model/Publisher.java
new file mode 100644
index 0000000000..cdb85d8023
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/model/Publisher.java
@@ -0,0 +1,25 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+public interface Publisher extends ConfiguredObject
+{
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/model/Queue.java b/java/broker/src/main/java/org/apache/qpid/server/model/Queue.java
new file mode 100644
index 0000000000..7c4f0de22b
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/model/Queue.java
@@ -0,0 +1,146 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import org.apache.qpid.server.queue.QueueEntryVisitor;
+
+
+public interface Queue extends ConfiguredObject
+{
+ public static final String BINDING_COUNT = "bindingCount";
+ public static final String CONSUMER_COUNT = "consumerCount";
+ public static final String CONSUMER_COUNT_WITH_CREDIT = "consumerCountWithCredit";
+ public static final String DISCARDS_TTL_BYTES = "discardsTtlBytes";
+ public static final String DISCARDS_TTL_MESSAGES = "discardsTtlMessages";
+ public static final String PERSISTENT_DEQUEUED_BYTES = "persistentDequeuedBytes";
+ public static final String PERSISTENT_DEQUEUED_MESSAGES = "persistentDequeuedMessages";
+ public static final String PERSISTENT_ENQUEUED_BYTES = "persistentEnqueuedBytes";
+ public static final String PERSISTENT_ENQUEUED_MESSAGES = "persistentEnqueuedMessages";
+ public static final String QUEUE_DEPTH_BYTES = "queueDepthBytes";
+ public static final String QUEUE_DEPTH_MESSAGES = "queueDepthMessages";
+ public static final String STATE_CHANGED = "stateChanged";
+ public static final String TOTAL_DEQUEUED_BYTES = "totalDequeuedBytes";
+ public static final String TOTAL_DEQUEUED_MESSAGES = "totalDequeuedMessages";
+ public static final String TOTAL_ENQUEUED_BYTES = "totalEnqueuedBytes";
+ public static final String TOTAL_ENQUEUED_MESSAGES = "totalEnqueuedMessages";
+ public static final String UNACKNOWLEDGED_BYTES = "unacknowledgedBytes";
+ public static final String UNACKNOWLEDGED_MESSAGES = "unacknowledgedMessages";
+
+ public static final Collection<String> AVAILABLE_STATISTICS =
+ Collections.unmodifiableList(
+ Arrays.asList(BINDING_COUNT,
+ CONSUMER_COUNT,
+ CONSUMER_COUNT_WITH_CREDIT,
+ DISCARDS_TTL_BYTES,
+ DISCARDS_TTL_MESSAGES,
+ PERSISTENT_DEQUEUED_BYTES,
+ PERSISTENT_DEQUEUED_MESSAGES,
+ PERSISTENT_ENQUEUED_BYTES,
+ PERSISTENT_ENQUEUED_MESSAGES,
+ QUEUE_DEPTH_BYTES,
+ QUEUE_DEPTH_MESSAGES,
+ STATE_CHANGED,
+ TOTAL_DEQUEUED_BYTES,
+ TOTAL_DEQUEUED_MESSAGES,
+ TOTAL_ENQUEUED_BYTES,
+ TOTAL_ENQUEUED_MESSAGES,
+ UNACKNOWLEDGED_BYTES,
+ UNACKNOWLEDGED_MESSAGES));
+
+
+
+ public static final String ID = "id";
+ public static final String NAME = "name";
+ public static final String STATE = "state";
+ public static final String DURABLE = "durable";
+ public static final String LIFETIME_POLICY = "lifetimePolicy";
+ public static final String TIME_TO_LIVE = "timeToLive";
+ public static final String CREATED = "created";
+ public static final String UPDATED = "updated";
+
+ public static final String ALERT_REPEAT_GAP = "alertRepeatGap";
+ public static final String ALERT_THRESHOLD_MESSAGE_AGE = "alertThresholdMessageAge";
+ public static final String ALERT_THRESHOLD_MESSAGE_SIZE = "alertThresholdMessageSize";
+ public static final String ALERT_THRESHOLD_QUEUE_DEPTH_BYTES = "alertThresholdQueueDepthBytes";
+ public static final String ALERT_THRESHOLD_QUEUE_DEPTH_MESSAGES = "alertThresholdQueueDepthMessages";
+ public static final String ALTERNATE_EXCHANGE = "alternateExchange";
+ public static final String EXCLUSIVE = "exclusive";
+ public static final String MESSAGE_GROUP_KEY = "messageGroupKey";
+ public static final String MESSAGE_GROUP_DEFAULT_GROUP = "messageGroupDefaultGroup";
+ public static final String MESSAGE_GROUP_SHARED_GROUPS = "messageGroupSharedGroups";
+ public static final String LVQ_KEY = "lvqKey";
+ public static final String MAXIMUM_DELIVERY_ATTEMPTS = "maximumDeliveryAttempts";
+ public static final String NO_LOCAL = "noLocal";
+ public static final String OWNER = "owner";
+ public static final String QUEUE_FLOW_CONTROL_SIZE_BYTES = "queueFlowControlSizeBytes";
+ public static final String QUEUE_FLOW_RESUME_SIZE_BYTES = "queueFlowResumeSizeBytes";
+ public static final String QUEUE_FLOW_STOPPED = "queueFlowStopped";
+ public static final String SORT_KEY = "sortKey";
+ public static final String TYPE = "type";
+
+
+
+
+ public static final Collection<String> AVAILABLE_ATTRIBUTES =
+ Collections.unmodifiableList(
+ Arrays.asList(ID,
+ NAME,
+ STATE,
+ DURABLE,
+ LIFETIME_POLICY,
+ TIME_TO_LIVE,
+ CREATED,
+ UPDATED,
+ TYPE,
+ ALTERNATE_EXCHANGE,
+ EXCLUSIVE,
+ OWNER,
+ NO_LOCAL,
+ LVQ_KEY,
+ SORT_KEY,
+ MESSAGE_GROUP_KEY,
+ MESSAGE_GROUP_DEFAULT_GROUP,
+ MESSAGE_GROUP_SHARED_GROUPS,
+ MAXIMUM_DELIVERY_ATTEMPTS,
+ QUEUE_FLOW_CONTROL_SIZE_BYTES,
+ QUEUE_FLOW_RESUME_SIZE_BYTES,
+ QUEUE_FLOW_STOPPED,
+ ALERT_THRESHOLD_MESSAGE_AGE,
+ ALERT_THRESHOLD_MESSAGE_SIZE,
+ ALERT_THRESHOLD_QUEUE_DEPTH_BYTES,
+ ALERT_THRESHOLD_QUEUE_DEPTH_MESSAGES,
+ ALERT_REPEAT_GAP
+ ));
+
+ //children
+ Collection<Binding> getBindings();
+ Collection<Consumer> getConsumers();
+
+
+ //operations
+
+ void visit(QueueEntryVisitor visitor);
+
+ void delete();
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/model/State.java b/java/broker/src/main/java/org/apache/qpid/server/model/State.java
new file mode 100644
index 0000000000..a73b2c9d3e
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/model/State.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+public enum State
+{
+ INITIALISING,
+ QUIESCED,
+ STOPPED,
+ ACTIVE,
+ DELETED
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/model/Statistics.java b/java/broker/src/main/java/org/apache/qpid/server/model/Statistics.java
new file mode 100644
index 0000000000..2cb81eae82
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/model/Statistics.java
@@ -0,0 +1,25 @@
+package org.apache.qpid.server.model;
+
+import java.util.Collection;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+public interface Statistics
+{
+ Collection<String> getStatisticNames();
+ public Object getStatistic(String name);
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java b/java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java
new file mode 100644
index 0000000000..d8493c6df4
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java
@@ -0,0 +1,54 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.util.UUID;
+
+import org.apache.qpid.exchange.ExchangeDefaults;
+
+
+public class UUIDGenerator
+{
+
+ public static UUID generateUUID()
+ {
+ return UUID.randomUUID();
+ }
+
+ public static UUID generateUUID(String objectName, String virtualHostName)
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.append(virtualHostName).append(objectName);
+ return UUID.nameUUIDFromBytes(sb.toString().getBytes());
+ }
+
+ public static UUID generateExchangeUUID(String echangeName, String virtualHostName)
+ {
+ if(ExchangeDefaults.DEFAULT_EXCHANGE_NAME.asString().equals(echangeName) || echangeName.startsWith("amq.") || echangeName.startsWith("qpid."))
+ {
+ return generateUUID(echangeName, virtualHostName);
+ }
+ else
+ {
+ return generateUUID();
+ }
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java
index f6980be525..b750b29952 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java
@@ -58,6 +58,7 @@ import org.apache.qpid.server.state.AMQStateManager;
import org.apache.qpid.server.stats.StatisticsCounter;
import org.apache.qpid.server.subscription.ClientDeliveryMethod;
import org.apache.qpid.server.subscription.Subscription;
+import org.apache.qpid.server.subscription.SubscriptionImpl;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
import org.apache.qpid.transport.Sender;
@@ -1315,7 +1316,8 @@ public class AMQProtocolEngine implements ServerProtocolEngine, Managable, AMQPr
public void closeSession(AMQSessionModel session, AMQConstant cause, String message) throws AMQException
{
- closeChannel((Integer)session.getID());
+ int channelId = ((AMQChannel)session).getChannelId();
+ closeChannel(channelId);
MethodRegistry methodRegistry = getMethodRegistry();
ChannelCloseBody responseBody =
@@ -1324,7 +1326,7 @@ public class AMQProtocolEngine implements ServerProtocolEngine, Managable, AMQPr
new AMQShortString(message),
0,0);
- writeFrame(responseBody.generateFrame((Integer)session.getID()));
+ writeFrame(responseBody.generateFrame(channelId));
}
public void close(AMQConstant cause, String message) throws AMQException
@@ -1454,7 +1456,7 @@ public class AMQProtocolEngine implements ServerProtocolEngine, Managable, AMQPr
throws AMQException
{
registerMessageDelivered(entry.getMessage().getSize());
- _protocolOutputConverter.writeDeliver(entry, _channelId, deliveryTag, sub.getConsumerTag());
+ _protocolOutputConverter.writeDeliver(entry, _channelId, deliveryTag, ((SubscriptionImpl)sub).getConsumerTag());
entry.incrementDeliveryCount();
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQSessionModel.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQSessionModel.java
index a80eb46cfa..fa171815ca 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQSessionModel.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQSessionModel.java
@@ -20,10 +20,12 @@
*/
package org.apache.qpid.server.protocol;
+import java.util.UUID;
import java.util.concurrent.ConcurrentSkipListSet;
import org.apache.qpid.AMQException;
import org.apache.qpid.server.logging.LogSubject;
+import org.apache.qpid.server.message.InboundMessage;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.SimpleAMQQueue;
@@ -34,7 +36,8 @@ import org.apache.qpid.server.queue.SimpleAMQQueue;
*/
public interface AMQSessionModel extends Comparable<AMQSessionModel>
{
- public Object getID();
+ /** Unique session ID across entire broker*/
+ public UUID getId();
public AMQConnectionModel getConnectionModel();
@@ -64,4 +67,7 @@ public interface AMQSessionModel extends Comparable<AMQSessionModel>
void block(AMQQueue queue);
void unblock(AMQQueue queue);
+
+
+ boolean onSameConnection(InboundMessage inbound);
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/AmqpProtocolVersion.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/AmqpProtocolVersion.java
index e925d7a1ec..0a71fe257a 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/protocol/AmqpProtocolVersion.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/AmqpProtocolVersion.java
@@ -20,4 +20,4 @@
*/
package org.apache.qpid.server.protocol;
-public enum AmqpProtocolVersion { v0_8, v0_9, v0_9_1, v0_10 } \ No newline at end of file
+public enum AmqpProtocolVersion { v0_8, v0_9, v0_9_1, v0_10, v1_0_0 }
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java
index 3b26f05f84..652ffee004 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java
@@ -175,6 +175,28 @@ public class MultiVersionProtocolEngine implements ServerProtocolEngine
(byte) 10
};
+ private static final byte[] AMQP_1_0_0_HEADER =
+ new byte[] { (byte) 'A',
+ (byte) 'M',
+ (byte) 'Q',
+ (byte) 'P',
+ (byte) 0,
+ (byte) 1,
+ (byte) 0,
+ (byte) 0
+ };
+
+ private static final byte[] AMQP_SASL_1_0_0_HEADER =
+ new byte[] { (byte) 'A',
+ (byte) 'M',
+ (byte) 'Q',
+ (byte) 'P',
+ (byte) 3,
+ (byte) 1,
+ (byte) 0,
+ (byte) 0
+ };
+
public void setNetworkConnection(NetworkConnection networkConnection)
{
setNetworkConnection(networkConnection, networkConnection.getSender());
@@ -289,8 +311,48 @@ public class MultiVersionProtocolEngine implements ServerProtocolEngine
}
};
+ private DelegateCreator creator_1_0_0 = new DelegateCreator()
+ {
+
+ public AmqpProtocolVersion getVersion()
+ {
+ return AmqpProtocolVersion.v1_0_0;
+ }
+
+
+ public byte[] getHeaderIdentifier()
+ {
+ return AMQP_1_0_0_HEADER;
+ }
+
+ public ServerProtocolEngine getProtocolEngine()
+ {
+ return new ProtocolEngine_1_0_0(_appRegistry,_id);
+ }
+ };
+
+ private DelegateCreator creator_1_0_0_SASL = new DelegateCreator()
+ {
+
+ public AmqpProtocolVersion getVersion()
+ {
+ return AmqpProtocolVersion.v1_0_0;
+ }
+
+
+ public byte[] getHeaderIdentifier()
+ {
+ return AMQP_SASL_1_0_0_HEADER;
+ }
+
+ public ServerProtocolEngine getProtocolEngine()
+ {
+ return new ProtocolEngine_1_0_0_SASL(_network, _appRegistry, _id);
+ }
+ };
+
private final DelegateCreator[] _creators =
- new DelegateCreator[] { creator_0_8, creator_0_9, creator_0_9_1, creator_0_10 };
+ new DelegateCreator[] { creator_0_8, creator_0_9, creator_0_9_1, creator_0_10, creator_1_0_0_SASL, creator_1_0_0 };
private class ClosedDelegateProtocolEngine implements ServerProtocolEngine
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java
new file mode 100755
index 0000000000..f31ad5052b
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java
@@ -0,0 +1,394 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol;
+
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.security.auth.callback.CallbackHandler;
+import org.apache.qpid.amqp_1_0.codec.FrameWriter;
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+import org.apache.qpid.amqp_1_0.framing.FrameHandler;
+import org.apache.qpid.amqp_1_0.framing.OversizeFrameException;
+import org.apache.qpid.amqp_1_0.transport.CallbackHandlerSource;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+import org.apache.qpid.amqp_1_0.transport.Container;
+import org.apache.qpid.amqp_1_0.transport.FrameOutputHandler;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+import org.apache.qpid.protocol.ServerProtocolEngine;
+import org.apache.qpid.server.configuration.ConfigStore;
+import org.apache.qpid.server.configuration.ConnectionConfigType;
+import org.apache.qpid.server.protocol.v1_0.Connection_1_0;
+import org.apache.qpid.server.registry.IApplicationRegistry;
+import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
+import org.apache.qpid.transport.Sender;
+import org.apache.qpid.transport.network.NetworkConnection;
+
+public class ProtocolEngine_1_0_0 implements ServerProtocolEngine, FrameOutputHandler
+{
+ static final AtomicLong _connectionIdSource = new AtomicLong(0L);
+
+ //private NetworkConnection _networkDriver;
+ private long _readBytes;
+ private long _writtenBytes;
+ private final UUID _id;
+ private final IApplicationRegistry _appRegistry;
+ private long _createTime = System.currentTimeMillis();
+ private ConnectionEndpoint _conn;
+ private final long _connectionId;
+
+ private static final ByteBuffer HEADER =
+ ByteBuffer.wrap(new byte[]
+ {
+ (byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte) 0,
+ (byte) 1,
+ (byte) 0,
+ (byte) 0
+ });
+
+ private FrameWriter _frameWriter;
+ private FrameHandler _frameHandler;
+ private Object _sendLock = new Object();
+ private byte _major;
+ private byte _minor;
+ private byte _revision;
+ private NetworkConnection _network;
+ private Sender<ByteBuffer> _sender;
+
+
+ static enum State {
+ A,
+ M,
+ Q,
+ P,
+ PROTOCOL,
+ MAJOR,
+ MINOR,
+ REVISION,
+ FRAME
+ }
+
+ private State _state = State.A;
+
+
+
+ public ProtocolEngine_1_0_0(final IApplicationRegistry appRegistry, long id)
+ {
+ _id = appRegistry.getConfigStore().createId();
+ _appRegistry = appRegistry;
+ _connectionId = id;
+ }
+
+
+ public SocketAddress getRemoteAddress()
+ {
+ return _network.getRemoteAddress();
+ }
+
+ public SocketAddress getLocalAddress()
+ {
+ return _network.getLocalAddress();
+ }
+
+ public long getReadBytes()
+ {
+ return _readBytes;
+ }
+
+ public long getWrittenBytes()
+ {
+ return _writtenBytes;
+ }
+
+ public void writerIdle()
+ {
+ //Todo
+ }
+
+ public void readerIdle()
+ {
+ //Todo
+ }
+
+ public void setNetworkConnection(final NetworkConnection network, final Sender<ByteBuffer> sender)
+ {
+ _network = network;
+ _sender = sender;
+
+ Container container = new Container(_appRegistry.getBrokerId().toString());
+
+ _conn = new ConnectionEndpoint(container,asCallbackHandlerSource(_appRegistry.getAuthenticationManager()));
+ _conn.setConnectionEventListener(new Connection_1_0(_appRegistry));
+ _conn.setFrameOutputHandler(this);
+ _conn.setRemoteAddress(_network.getRemoteAddress());
+
+ _frameWriter = new FrameWriter(_conn.getDescribedTypeRegistry());
+ _frameHandler = new FrameHandler(_conn);
+
+ _sender.send(HEADER.duplicate());
+ _sender.flush();
+ }
+
+ private CallbackHandlerSource asCallbackHandlerSource(final AuthenticationManager authenticationManager)
+ {
+ return new CallbackHandlerSource()
+ {
+ @Override
+ public CallbackHandler getHandler(String mechanism)
+ {
+ return authenticationManager.getHandler(mechanism);
+ }
+ };
+ }
+
+ public String getAddress()
+ {
+ return getRemoteAddress().toString();
+ }
+
+
+ public ConfigStore getConfigStore()
+ {
+ return _appRegistry.getConfigStore();
+ }
+
+ public UUID getId()
+ {
+ return _id;
+ }
+
+ public ConnectionConfigType getConfigType()
+ {
+ return ConnectionConfigType.getInstance();
+ }
+
+ public boolean isDurable()
+ {
+ return false;
+ }
+
+ public synchronized void received(ByteBuffer msg)
+ {
+ if(RAW_LOGGER.isLoggable(Level.FINE))
+ {
+ ByteBuffer dup = msg.duplicate();
+ byte[] data = new byte[dup.remaining()];
+ dup.get(data);
+ Binary bin = new Binary(data);
+ RAW_LOGGER.fine("RECV[" + getRemoteAddress() + "] : " + bin.toString());
+ }
+ _readBytes += msg.remaining();
+ switch(_state)
+ {
+ case A:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ break;
+ }
+ case M:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.M;
+ break;
+ }
+
+ case Q:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.Q;
+ break;
+ }
+ case P:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.P;
+ break;
+ }
+ case PROTOCOL:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.PROTOCOL;
+ break;
+ }
+ case MAJOR:
+ if(msg.hasRemaining())
+ {
+ _major = msg.get();
+ }
+ else
+ {
+ _state = State.MAJOR;
+ break;
+ }
+ case MINOR:
+ if(msg.hasRemaining())
+ {
+ _minor = msg.get();
+ }
+ else
+ {
+ _state = State.MINOR;
+ break;
+ }
+ case REVISION:
+ if(msg.hasRemaining())
+ {
+ _revision = msg.get();
+
+ _state = State.FRAME;
+ }
+ else
+ {
+ _state = State.REVISION;
+ break;
+ }
+ case FRAME:
+ if(msg.hasRemaining())
+ {
+ _frameHandler.parse(msg);
+ }
+ }
+
+ }
+
+ public void exception(Throwable t)
+ {
+ t.printStackTrace();
+ }
+
+ public void closed()
+ {
+ _conn.inputClosed();
+ if(_conn != null && _conn.getConnectionEventListener() != null)
+ {
+ ((Connection_1_0)_conn.getConnectionEventListener()).closed();
+ }
+
+ }
+
+ public long getCreateTime()
+ {
+ return _createTime;
+ }
+
+
+ public boolean canSend()
+ {
+ return true;
+ }
+
+ public void send(final AMQFrame amqFrame)
+ {
+ send(amqFrame, null);
+ }
+
+ private final Logger FRAME_LOGGER = Logger.getLogger("FRM");
+ private final Logger RAW_LOGGER = Logger.getLogger("RAW");
+
+
+ public void send(final AMQFrame amqFrame, ByteBuffer buf)
+ {
+ synchronized(_sendLock)
+ {
+
+ if(FRAME_LOGGER.isLoggable(Level.FINE))
+ {
+ FRAME_LOGGER.fine("SEND[" + getRemoteAddress() + "|" + amqFrame.getChannel() + "] : " + amqFrame.getFrameBody());
+ }
+
+
+ _frameWriter.setValue(amqFrame);
+
+
+
+ ByteBuffer dup = ByteBuffer.allocate(_conn.getMaxFrameSize());
+
+ int size = _frameWriter.writeToBuffer(dup);
+ if(size > _conn.getMaxFrameSize())
+ {
+ throw new OversizeFrameException(amqFrame,size);
+ }
+
+ dup.flip();
+ _writtenBytes += dup.limit();
+
+ if(RAW_LOGGER.isLoggable(Level.FINE))
+ {
+ ByteBuffer dup2 = dup.duplicate();
+ byte[] data = new byte[dup2.remaining()];
+ dup2.get(data);
+ Binary bin = new Binary(data);
+ RAW_LOGGER.fine("SEND[" + getRemoteAddress() + "] : " + bin.toString());
+ }
+
+
+ _sender.send(dup);
+ _sender.flush();
+
+ }
+ }
+
+ public void send(short channel, FrameBody body)
+ {
+ AMQFrame frame = AMQFrame.createAMQFrame(channel, body);
+ send(frame);
+
+ }
+
+ public void close()
+ {
+ //TODO
+ }
+
+ public long getConnectionId()
+ {
+ return _connectionId;
+ }
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java
new file mode 100644
index 0000000000..ffd5e750b4
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java
@@ -0,0 +1,449 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol;
+
+import java.io.PrintWriter;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.util.UUID;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.security.auth.callback.CallbackHandler;
+import org.apache.qpid.amqp_1_0.codec.FrameWriter;
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+import org.apache.qpid.amqp_1_0.framing.OversizeFrameException;
+import org.apache.qpid.amqp_1_0.framing.SASLFrameHandler;
+import org.apache.qpid.amqp_1_0.transport.CallbackHandlerSource;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+import org.apache.qpid.amqp_1_0.transport.Container;
+import org.apache.qpid.amqp_1_0.transport.FrameOutputHandler;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+import org.apache.qpid.protocol.ServerProtocolEngine;
+import org.apache.qpid.server.configuration.ConfigStore;
+import org.apache.qpid.server.configuration.ConnectionConfigType;
+import org.apache.qpid.server.protocol.v1_0.Connection_1_0;
+import org.apache.qpid.server.registry.ApplicationRegistry;
+import org.apache.qpid.server.registry.IApplicationRegistry;
+import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
+import org.apache.qpid.transport.Sender;
+import org.apache.qpid.transport.network.NetworkConnection;
+
+public class ProtocolEngine_1_0_0_SASL implements ServerProtocolEngine, FrameOutputHandler
+{
+ private long _readBytes;
+ private long _writtenBytes;
+ private final UUID _id;
+ private final IApplicationRegistry _appRegistry;
+ private long _createTime = System.currentTimeMillis();
+ private ConnectionEndpoint _conn;
+ private long _connectionId;
+
+ private static final ByteBuffer HEADER =
+ ByteBuffer.wrap(new byte[]
+ {
+ (byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte) 3,
+ (byte) 1,
+ (byte) 0,
+ (byte) 0
+ });
+
+ private static final ByteBuffer PROTOCOL_HEADER =
+ ByteBuffer.wrap(new byte[]
+ {
+ (byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte) 0,
+ (byte) 1,
+ (byte) 0,
+ (byte) 0
+ });
+
+
+ private FrameWriter _frameWriter;
+ private ProtocolHandler _frameHandler;
+ private ByteBuffer _buf = ByteBuffer.allocate(1024 * 1024);
+ private Object _sendLock = new Object();
+ private byte _major;
+ private byte _minor;
+ private byte _revision;
+ private PrintWriter _out;
+ private NetworkConnection _network;
+ private Sender<ByteBuffer> _sender;
+
+
+ static enum State {
+ A,
+ M,
+ Q,
+ P,
+ PROTOCOL,
+ MAJOR,
+ MINOR,
+ REVISION,
+ FRAME
+ }
+
+ private State _state = State.A;
+
+
+ public ProtocolEngine_1_0_0_SASL(final NetworkConnection networkDriver, final IApplicationRegistry appRegistry,
+ long id)
+ {
+ _id = appRegistry.getConfigStore().createId();
+ _connectionId = id;
+ _appRegistry = appRegistry;
+
+ if(networkDriver != null)
+ {
+ setNetworkConnection(networkDriver, networkDriver.getSender());
+ }
+ }
+
+
+ public SocketAddress getRemoteAddress()
+ {
+ return _network.getRemoteAddress();
+ }
+
+ public SocketAddress getLocalAddress()
+ {
+ return _network.getLocalAddress();
+ }
+
+ public long getReadBytes()
+ {
+ return _readBytes;
+ }
+
+ public long getWrittenBytes()
+ {
+ return _writtenBytes;
+ }
+
+ public void writerIdle()
+ {
+ //Todo
+ }
+
+ public void readerIdle()
+ {
+ //Todo
+ }
+
+ public void setNetworkConnection(final NetworkConnection network, final Sender<ByteBuffer> sender)
+ {
+ _network = network;
+ _sender = sender;
+
+ Container container = new Container(_appRegistry.getBrokerId().toString());
+
+ _conn = new ConnectionEndpoint(container, asCallbackHandlerSource(ApplicationRegistry.getInstance()
+ .getAuthenticationManager()));
+ _conn.setConnectionEventListener(new Connection_1_0(_appRegistry));
+ _conn.setRemoteAddress(getRemoteAddress());
+
+
+ _conn.setFrameOutputHandler(this);
+ _conn.setSaslFrameOutput(this);
+
+ _conn.setOnSaslComplete(new Runnable()
+ {
+
+
+ public void run()
+ {
+ if(_conn.isAuthenticated())
+ {
+ _sender.send(PROTOCOL_HEADER.duplicate());
+ _sender.flush();
+ }
+ else
+ {
+ _network.close();
+ }
+ }
+ });
+ _frameWriter = new FrameWriter(_conn.getDescribedTypeRegistry());
+ _frameHandler = new SASLFrameHandler(_conn);
+
+ _sender.send(HEADER.duplicate());
+ _sender.flush();
+
+ _conn.initiateSASL();
+
+
+ }
+
+ private CallbackHandlerSource asCallbackHandlerSource(final AuthenticationManager authenticationManager)
+ {
+ return new CallbackHandlerSource()
+ {
+ @Override
+ public CallbackHandler getHandler(String mechanism)
+ {
+ return authenticationManager.getHandler(mechanism);
+ }
+ };
+ }
+
+ public String getAddress()
+ {
+ return getRemoteAddress().toString();
+ }
+
+
+ public ConfigStore getConfigStore()
+ {
+ return _appRegistry.getConfigStore();
+ }
+
+ public UUID getId()
+ {
+ return _id;
+ }
+
+ public ConnectionConfigType getConfigType()
+ {
+ return ConnectionConfigType.getInstance();
+ }
+
+ public boolean isDurable()
+ {
+ return false;
+ }
+
+ private final Logger RAW_LOGGER = Logger.getLogger("RAW");
+
+
+ public synchronized void received(ByteBuffer msg)
+ {
+ if(RAW_LOGGER.isLoggable(Level.FINE))
+ {
+ ByteBuffer dup = msg.duplicate();
+ byte[] data = new byte[dup.remaining()];
+ dup.get(data);
+ Binary bin = new Binary(data);
+ RAW_LOGGER.fine("RECV[" + getRemoteAddress() + "] : " + bin.toString());
+ }
+ _readBytes += msg.remaining();
+ switch(_state)
+ {
+ case A:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ break;
+ }
+ case M:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.M;
+ break;
+ }
+
+ case Q:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.Q;
+ break;
+ }
+ case P:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.P;
+ break;
+ }
+ case PROTOCOL:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.PROTOCOL;
+ break;
+ }
+ case MAJOR:
+ if(msg.hasRemaining())
+ {
+ _major = msg.get();
+ }
+ else
+ {
+ _state = State.MAJOR;
+ break;
+ }
+ case MINOR:
+ if(msg.hasRemaining())
+ {
+ _minor = msg.get();
+ }
+ else
+ {
+ _state = State.MINOR;
+ break;
+ }
+ case REVISION:
+ if(msg.hasRemaining())
+ {
+ _revision = msg.get();
+
+ _state = State.FRAME;
+ }
+ else
+ {
+ _state = State.REVISION;
+ break;
+ }
+ case FRAME:
+ if(msg.hasRemaining())
+ {
+ _frameHandler = _frameHandler.parse(msg);
+ }
+ }
+
+ }
+
+ public void exception(Throwable t)
+ {
+ t.printStackTrace();
+ }
+
+ public void closed()
+ {
+ // todo
+ _conn.inputClosed();
+ if(_conn != null && _conn.getConnectionEventListener() != null)
+ {
+ ((Connection_1_0)_conn.getConnectionEventListener()).closed();
+ }
+
+ }
+
+ public long getCreateTime()
+ {
+ return _createTime;
+ }
+
+
+ public boolean canSend()
+ {
+ return true;
+ }
+
+ public void send(final AMQFrame amqFrame)
+ {
+ send(amqFrame, null);
+ }
+
+ private static final Logger FRAME_LOGGER = Logger.getLogger("FRM");
+
+
+ public void send(final AMQFrame amqFrame, ByteBuffer buf)
+ {
+
+ synchronized(_sendLock)
+ {
+
+ if(FRAME_LOGGER.isLoggable(Level.FINE))
+ {
+ FRAME_LOGGER.fine("SEND[" + getRemoteAddress() + "|" + amqFrame.getChannel() + "] : " + amqFrame.getFrameBody());
+ }
+
+
+ _frameWriter.setValue(amqFrame);
+
+
+
+ ByteBuffer dup = ByteBuffer.allocate(_conn.getMaxFrameSize());
+
+ int size = _frameWriter.writeToBuffer(dup);
+ if(size > _conn.getMaxFrameSize())
+ {
+ throw new OversizeFrameException(amqFrame,size);
+ }
+
+ dup.flip();
+ _writtenBytes += dup.limit();
+
+ if(RAW_LOGGER.isLoggable(Level.FINE))
+ {
+ ByteBuffer dup2 = dup.duplicate();
+ byte[] data = new byte[dup2.remaining()];
+ dup2.get(data);
+ Binary bin = new Binary(data);
+ RAW_LOGGER.fine("SEND[" + getRemoteAddress() + "] : " + bin.toString());
+ }
+
+
+ _sender.send(dup);
+ _sender.flush();
+
+
+ }
+ }
+
+ public void send(short channel, FrameBody body)
+ {
+ AMQFrame frame = AMQFrame.createAMQFrame(channel, body);
+ send(frame);
+
+ }
+
+ public void close()
+ {
+ _sender.close();
+ }
+
+ public void setLogOutput(final PrintWriter out)
+ {
+ _out = out;
+ }
+
+ public long getConnectionId()
+ {
+ return _connectionId;
+ }
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java
new file mode 100644
index 0000000000..318a240b27
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java
@@ -0,0 +1,98 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEventListener;
+import org.apache.qpid.amqp_1_0.transport.SessionEndpoint;
+
+import org.apache.qpid.server.registry.IApplicationRegistry;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class Connection_1_0 implements ConnectionEventListener
+{
+
+ private IApplicationRegistry _appRegistry;
+ private VirtualHost _vhost;
+
+
+ public static interface Task
+ {
+ public void doTask(Connection_1_0 connection);
+ }
+
+
+ private List<Task> _closeTasks =
+ Collections.synchronizedList(new ArrayList<Task>());
+
+
+
+ public Connection_1_0(IApplicationRegistry appRegistry)
+ {
+ _appRegistry = appRegistry;
+ _vhost = _appRegistry.getVirtualHostRegistry().getDefaultVirtualHost();
+ }
+
+ public void remoteSessionCreation(SessionEndpoint endpoint)
+ {
+ Session_1_0 session = new Session_1_0(_vhost, _appRegistry, this);
+ endpoint.setSessionEventListener(session);
+ }
+
+
+ void removeConnectionCloseTask(final Task task)
+ {
+ _closeTasks.remove( task );
+ }
+
+ void addConnectionCloseTask(final Task task)
+ {
+ _closeTasks.add( task );
+ }
+
+ public void closeReceived()
+ {
+ List<Task> taskCopy;
+ synchronized (_closeTasks)
+ {
+ taskCopy = new ArrayList<Task>(_closeTasks);
+ }
+ for(Task task : taskCopy)
+ {
+ task.doTask(this);
+ }
+ synchronized (_closeTasks)
+ {
+ _closeTasks.clear();
+ }
+
+ }
+
+ public void closed()
+ {
+ closeReceived();
+ }
+
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Destination.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Destination.java
new file mode 100644
index 0000000000..d45758391c
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Destination.java
@@ -0,0 +1,28 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+
+public interface Destination
+{
+
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ExchangeDestination.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ExchangeDestination.java
new file mode 100644
index 0000000000..ba1a1ca45c
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ExchangeDestination.java
@@ -0,0 +1,108 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import java.util.List;
+import org.apache.qpid.AMQException;
+import org.apache.qpid.amqp_1_0.type.Outcome;
+import org.apache.qpid.amqp_1_0.type.messaging.Accepted;
+import org.apache.qpid.amqp_1_0.type.messaging.TerminusDurability;
+import org.apache.qpid.amqp_1_0.type.messaging.TerminusExpiryPolicy;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.queue.BaseQueue;
+import org.apache.qpid.server.txn.ServerTransaction;
+
+public class ExchangeDestination implements ReceivingDestination, SendingDestination
+{
+ private static final Accepted ACCEPTED = new Accepted();
+ private static final Outcome[] OUTCOMES = { ACCEPTED };
+
+ private Exchange _exchange;
+ private TerminusDurability _durability;
+ private TerminusExpiryPolicy _expiryPolicy;
+
+ public ExchangeDestination(Exchange exchange, TerminusDurability durable, TerminusExpiryPolicy expiryPolicy)
+ {
+ _exchange = exchange;
+ _durability = durable;
+ _expiryPolicy = expiryPolicy;
+ }
+
+ public Outcome[] getOutcomes()
+ {
+ return OUTCOMES;
+ }
+
+ public Outcome send(final Message_1_0 message, ServerTransaction txn)
+ {
+ final List<? extends BaseQueue> queues = _exchange.route(message);
+
+ txn.enqueue(queues,message, new ServerTransaction.Action()
+ {
+
+ BaseQueue[] _queues = queues.toArray(new BaseQueue[queues.size()]);
+
+ public void postCommit()
+ {
+ for(int i = 0; i < _queues.length; i++)
+ {
+ try
+ {
+ _queues[i].enqueue(message);
+ }
+ catch (AMQException e)
+ {
+ // TODO
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ public void onRollback()
+ {
+ // NO-OP
+ }
+ }, System.currentTimeMillis());
+
+ return ACCEPTED;
+ }
+
+ TerminusDurability getDurability()
+ {
+ return _durability;
+ }
+
+ TerminusExpiryPolicy getExpiryPolicy()
+ {
+ return _expiryPolicy;
+ }
+
+ public int getCredit()
+ {
+ // TODO - fix
+ return 20000;
+ }
+
+ public Exchange getExchange()
+ {
+ return _exchange;
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/LinkRegistry.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/LinkRegistry.java
new file mode 100644
index 0000000000..42eea05d37
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/LinkRegistry.java
@@ -0,0 +1,59 @@
+package org.apache.qpid.server.protocol.v1_0;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class LinkRegistry
+{
+ private final Map<String, SendingLink_1_0> _sendingLinks = new HashMap<String, SendingLink_1_0>();
+ private final Map<String, ReceivingLink_1_0> _receivingLinks = new HashMap<String, ReceivingLink_1_0>();
+
+ public synchronized SendingLink_1_0 getDurableSendingLink(String name)
+ {
+ return _sendingLinks.get(name);
+ }
+
+ public synchronized boolean registerSendingLink(String name, SendingLink_1_0 link)
+ {
+ if(_sendingLinks.containsKey(name))
+ {
+ return false;
+ }
+ else
+ {
+ _sendingLinks.put(name, link);
+ return true;
+ }
+ }
+
+ public synchronized boolean unregisterSendingLink(String name)
+ {
+ if(!_sendingLinks.containsKey(name))
+ {
+ return false;
+ }
+ else
+ {
+ _sendingLinks.remove(name);
+ return true;
+ }
+ }
+
+ public synchronized ReceivingLink_1_0 getDurableReceivingLink(String name)
+ {
+ return _receivingLinks.get(name);
+ }
+
+ public synchronized boolean registerReceivingLink(String name, ReceivingLink_1_0 link)
+ {
+ if(_receivingLinks.containsKey(name))
+ {
+ return false;
+ }
+ else
+ {
+ _receivingLinks.put(name, link);
+ return true;
+ }
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Link_1_0.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Link_1_0.java
new file mode 100644
index 0000000000..db81d3b205
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Link_1_0.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+public interface Link_1_0
+{
+ void start();
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java
new file mode 100644
index 0000000000..140a815f57
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java
@@ -0,0 +1,172 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+
+import java.lang.ref.WeakReference;
+import java.nio.ByteBuffer;
+import java.util.List;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.server.configuration.SessionConfig;
+import org.apache.qpid.server.message.InboundMessage;
+import org.apache.qpid.server.message.MessageMetaData_1_0;
+import org.apache.qpid.server.message.MessageReference;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.store.StoredMessage;
+
+public class Message_1_0 implements ServerMessage, InboundMessage
+{
+ private final StoredMessage<MessageMetaData_1_0> _storedMessage;
+ private List<ByteBuffer> _fragments;
+ private WeakReference<Session_1_0> _session;
+
+
+ public Message_1_0(final StoredMessage<MessageMetaData_1_0> storedMessage,
+ final List<ByteBuffer> fragments,
+ final Session_1_0 session)
+ {
+ _storedMessage = storedMessage;
+ _fragments = fragments;
+ _session = new WeakReference<Session_1_0>(session);
+ }
+
+ public String getRoutingKey()
+ {
+ Object routingKey = getMessageHeader().getHeader("routing-key");
+ if(routingKey != null)
+ {
+ return routingKey.toString();
+ }
+ else
+ {
+ return getMessageHeader().getSubject();
+ }
+ }
+
+ public AMQShortString getRoutingKeyShortString()
+ {
+ return AMQShortString.valueOf(getRoutingKey());
+ }
+
+ private MessageMetaData_1_0 getMessageMetaData()
+ {
+ return _storedMessage.getMetaData();
+ }
+
+ public MessageMetaData_1_0.MessageHeader_1_0 getMessageHeader()
+ {
+ return getMessageMetaData().getMessageHeader();
+ }
+
+ public StoredMessage getStoredMessage()
+ {
+ return _storedMessage;
+ }
+
+ public boolean isPersistent()
+ {
+ return getMessageMetaData().isPersistent();
+ }
+
+ public boolean isRedelivered()
+ {
+ // TODO
+ return false;
+ }
+
+ public long getSize()
+ {
+ // TODO
+ return 0l;
+ }
+
+ public boolean isImmediate()
+ {
+ return false;
+ }
+
+ public long getExpiration()
+ {
+ return getMessageHeader().getExpiration();
+ }
+
+ public MessageReference<Message_1_0> newReference()
+ {
+ return new Reference(this);
+ }
+
+ public long getMessageNumber()
+ {
+ return _storedMessage.getMessageNumber();
+ }
+
+ public long getArrivalTime()
+ {
+ return 0; //TODO
+ }
+
+ public int getContent(final ByteBuffer buf, final int offset)
+ {
+ return _storedMessage.getContent(offset, buf);
+ }
+
+ public ByteBuffer getContent(int offset, int size)
+ {
+ ByteBuffer buf = ByteBuffer.allocate(size);
+ buf.limit(getContent(buf, offset));
+
+ return buf;
+ }
+
+ public SessionConfig getSessionConfig()
+ {
+ return null; //TODO
+ }
+
+ public List<ByteBuffer> getFragments()
+ {
+ return _fragments;
+ }
+
+ public Session_1_0 getSession()
+ {
+ return _session.get();
+ }
+
+ public static class Reference extends MessageReference<Message_1_0>
+ {
+ public Reference(Message_1_0 message)
+ {
+ super(message);
+ }
+
+ protected void onReference(Message_1_0 message)
+ {
+
+ }
+
+ protected void onRelease(Message_1_0 message)
+ {
+
+ }
+
+}
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/QueueDestination.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/QueueDestination.java
new file mode 100644
index 0000000000..af3f0b7872
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/QueueDestination.java
@@ -0,0 +1,100 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.type.Outcome;
+import org.apache.qpid.amqp_1_0.type.messaging.Accepted;
+
+import org.apache.qpid.AMQException;
+import org.apache.qpid.server.queue.AMQQueue;
+
+import org.apache.qpid.server.txn.ServerTransaction;
+
+import java.util.Arrays;
+
+public class QueueDestination implements SendingDestination, ReceivingDestination
+{
+ private static final Accepted ACCEPTED = new Accepted();
+ private static final Outcome[] OUTCOMES = new Outcome[] { ACCEPTED };
+
+
+ private AMQQueue _queue;
+
+ public QueueDestination(AMQQueue queue)
+ {
+ _queue = queue;
+ }
+
+ public Outcome[] getOutcomes()
+ {
+ return OUTCOMES;
+ }
+
+ public Outcome send(final Message_1_0 message, ServerTransaction txn)
+ {
+
+ try
+ {
+ txn.enqueue(_queue,message, new ServerTransaction.Action()
+ {
+
+
+ public void postCommit()
+ {
+ try
+ {
+
+ _queue.enqueue(message);
+ }
+ catch (Exception e)
+ {
+ // TODO
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ public void onRollback()
+ {
+ // NO-OP
+ }
+ });
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ return ACCEPTED;
+ }
+
+ public int getCredit()
+ {
+ // TODO - fix
+ return 100;
+ }
+
+ public AMQQueue getQueue()
+ {
+ return _queue;
+ }
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingDestination.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingDestination.java
new file mode 100644
index 0000000000..4ae0596e25
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingDestination.java
@@ -0,0 +1,35 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.type.Outcome;
+
+import org.apache.qpid.server.txn.ServerTransaction;
+
+public interface ReceivingDestination extends Destination
+{
+
+ Outcome[] getOutcomes();
+
+ Outcome send(Message_1_0 message, ServerTransaction txn);
+
+ int getCredit();
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLinkAttachment.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLinkAttachment.java
new file mode 100644
index 0000000000..6da5081185
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLinkAttachment.java
@@ -0,0 +1,51 @@
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Source;
+import org.apache.qpid.amqp_1_0.type.Target;
+
+public class ReceivingLinkAttachment
+{
+ private final Session_1_0 _session;
+ private final ReceivingLinkEndpoint _endpoint;
+
+ public ReceivingLinkAttachment(final Session_1_0 session, final ReceivingLinkEndpoint endpoint)
+ {
+ _session = session;
+ _endpoint = endpoint;
+ }
+
+ public Session_1_0 getSession()
+ {
+ return _session;
+ }
+
+ public ReceivingLinkEndpoint getEndpoint()
+ {
+ return _endpoint;
+ }
+
+ public Source getSource()
+ {
+ return getEndpoint().getSource();
+ }
+
+ public void setDeliveryStateHandler(final DeliveryStateHandler handler)
+ {
+ getEndpoint().setDeliveryStateHandler(handler);
+ }
+
+ public void updateDisposition(final Binary deliveryTag, final DeliveryState state, final boolean settled)
+ {
+ getEndpoint().updateDisposition(deliveryTag, state, settled);
+ }
+
+ public Target getTarget()
+ {
+ return getEndpoint().getTarget();
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLink_1_0.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLink_1_0.java
new file mode 100644
index 0000000000..e097dd5c83
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLink_1_0.java
@@ -0,0 +1,305 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoderImpl;
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.LinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkListener;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Outcome;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+import org.apache.qpid.amqp_1_0.type.messaging.TerminusDurability;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+import org.apache.qpid.amqp_1_0.type.transport.Detach;
+import org.apache.qpid.amqp_1_0.type.transport.ReceiverSettleMode;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+import org.apache.qpid.server.message.MessageMetaData_1_0;
+import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.txn.AutoCommitTransaction;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+
+public class ReceivingLink_1_0 implements ReceivingLinkListener, Link_1_0, DeliveryStateHandler
+{
+ private VirtualHost _vhost;
+
+ private ReceivingDestination _destination;
+ private SectionDecoderImpl _sectionDecoder;
+ private volatile ReceivingLinkAttachment _attachment;
+
+
+ private ArrayList<Transfer> _incompleteMessage;
+ private TerminusDurability _durability;
+
+ private Map<Binary, Outcome> _unsettledMap = Collections.synchronizedMap(new HashMap<Binary, Outcome>());
+ private boolean _resumedMessage;
+ private Binary _messageDeliveryTag;
+ private ReceiverSettleMode _receivingSettlementMode;
+
+
+ public ReceivingLink_1_0(ReceivingLinkAttachment receivingLinkAttachment, VirtualHost vhost,
+ ReceivingDestination destination)
+ {
+ _vhost = vhost;
+ _destination = destination;
+ _attachment = receivingLinkAttachment;
+ receivingLinkAttachment.setDeliveryStateHandler(this);
+
+ _durability = ((Target)receivingLinkAttachment.getTarget()).getDurable();
+
+ _sectionDecoder = new SectionDecoderImpl(receivingLinkAttachment.getEndpoint().getSession().getConnection().getDescribedTypeRegistry());
+
+
+ }
+
+ public void messageTransfer(Transfer xfr)
+ {
+ // TODO - cope with fragmented messages
+
+ List<ByteBuffer> fragments = null;
+
+
+
+ if(Boolean.TRUE.equals(xfr.getMore()) && _incompleteMessage == null)
+ {
+ _incompleteMessage = new ArrayList<Transfer>();
+ _incompleteMessage.add(xfr);
+ _resumedMessage = Boolean.TRUE.equals(xfr.getResume());
+ _messageDeliveryTag = xfr.getDeliveryTag();
+ return;
+ }
+ else if(_incompleteMessage != null)
+ {
+ _incompleteMessage.add(xfr);
+
+ if(Boolean.TRUE.equals(xfr.getMore()))
+ {
+ return;
+ }
+
+ fragments = new ArrayList<ByteBuffer>(_incompleteMessage.size());
+ for(Transfer t : _incompleteMessage)
+ {
+ fragments.add(t.getPayload());
+ }
+ _incompleteMessage=null;
+
+ }
+ else
+ {
+ _resumedMessage = Boolean.TRUE.equals(xfr.getResume());
+ _messageDeliveryTag = xfr.getDeliveryTag();
+ fragments = Collections.singletonList(xfr.getPayload());
+ }
+
+ if(_resumedMessage)
+ {
+ if(_unsettledMap.containsKey(_messageDeliveryTag))
+ {
+ Outcome outcome = _unsettledMap.get(_messageDeliveryTag);
+ boolean settled = ReceiverSettleMode.FIRST.equals(getReceivingSettlementMode());
+ getEndpoint().updateDisposition(_messageDeliveryTag, (DeliveryState) outcome, settled);
+ if(settled)
+ {
+ _unsettledMap.remove(_messageDeliveryTag);
+ }
+ }
+ else
+ {
+ System.err.println("UNEXPECTED!!");
+ System.err.println("Delivery Tag: " + _messageDeliveryTag);
+ System.err.println("_unsettledMap: " + _unsettledMap);
+
+ }
+ }
+ else
+ {
+ MessageMetaData_1_0 mmd = null;
+ List<ByteBuffer> immutableSections = new ArrayList<ByteBuffer>(3);
+ mmd = new MessageMetaData_1_0(fragments.toArray(new ByteBuffer[fragments.size()]),
+ _sectionDecoder,
+ immutableSections);
+
+ StoredMessage<MessageMetaData_1_0> storedMessage = _vhost.getMessageStore().addMessage(mmd);
+
+ boolean skipping = true;
+ int offset = 0;
+
+ for(ByteBuffer bareMessageBuf : immutableSections)
+ {
+ storedMessage.addContent(offset, bareMessageBuf.duplicate());
+ offset += bareMessageBuf.remaining();
+ }
+
+ storedMessage.flushToStore();
+
+ Message_1_0 message = new Message_1_0(storedMessage, fragments, getSession());
+
+
+ Binary transactionId = null;
+ org.apache.qpid.amqp_1_0.type.DeliveryState xfrState = xfr.getState();
+ if(xfrState != null)
+ {
+ if(xfrState instanceof TransactionalState)
+ {
+ transactionId = ((TransactionalState)xfrState).getTxnId();
+ }
+ }
+
+ ServerTransaction transaction = null;
+ if(transactionId != null)
+ {
+ transaction = getSession().getTransaction(transactionId);
+ }
+ else
+ {
+ Session_1_0 session = getSession();
+ transaction = session != null ? session.getTransaction(null) : new AutoCommitTransaction(_vhost.getMessageStore());
+ }
+
+ Outcome outcome = _destination.send(message, transaction);
+
+ DeliveryState resultantState;
+
+ if(transactionId == null)
+ {
+ resultantState = (DeliveryState) outcome;
+ }
+ else
+ {
+ TransactionalState transactionalState = new TransactionalState();
+ transactionalState.setOutcome(outcome);
+ transactionalState.setTxnId(transactionId);
+ resultantState = transactionalState;
+
+ }
+
+
+ boolean settled = transaction instanceof AutoCommitTransaction && ReceiverSettleMode.FIRST.equals(getReceivingSettlementMode());
+
+ final Binary deliveryTag = xfr.getDeliveryTag();
+
+ if(!settled)
+ {
+ _unsettledMap.put(deliveryTag, outcome);
+ }
+
+ getEndpoint().updateDisposition(deliveryTag, resultantState, settled);
+
+ if(!(transaction instanceof AutoCommitTransaction))
+ {
+ ServerTransaction.Action a;
+ transaction.addPostTransactionAction(new ServerTransaction.Action()
+ {
+ public void postCommit()
+ {
+ getEndpoint().updateDisposition(deliveryTag, null, true);
+ }
+
+ public void onRollback()
+ {
+ getEndpoint().updateDisposition(deliveryTag, null, true);
+ }
+ });
+ }
+ }
+ }
+
+ private ReceiverSettleMode getReceivingSettlementMode()
+ {
+ return _receivingSettlementMode;
+ }
+
+ public void remoteDetached(LinkEndpoint endpoint, Detach detach)
+ {
+ //TODO
+ // if not durable or close
+ if(!TerminusDurability.UNSETTLED_STATE.equals(_durability) ||
+ (detach != null && Boolean.TRUE.equals(detach.getClosed())))
+ {
+ endpoint.close();
+ }
+ else if(detach == null || detach.getError() != null)
+ {
+ _attachment = null;
+ }
+ }
+
+ public void start()
+ {
+ getEndpoint().setLinkCredit(UnsignedInteger.valueOf(_destination.getCredit()));
+ getEndpoint().setCreditWindow();
+ }
+
+ public ReceivingLinkEndpoint getEndpoint()
+ {
+ return _attachment.getEndpoint();
+ }
+
+
+ public Session_1_0 getSession()
+ {
+ ReceivingLinkAttachment attachment = _attachment;
+ return attachment == null ? null : attachment.getSession();
+ }
+
+ public void handle(Binary deliveryTag, DeliveryState state, Boolean settled)
+ {
+ if(Boolean.TRUE.equals(settled))
+ {
+ _unsettledMap.remove(deliveryTag);
+ }
+ }
+
+ public void setLinkAttachment(ReceivingLinkAttachment linkAttachment)
+ {
+ _attachment = linkAttachment;
+ _receivingSettlementMode = linkAttachment.getEndpoint().getReceivingSettlementMode();
+ ReceivingLinkEndpoint endpoint = linkAttachment.getEndpoint();
+ Map initialUnsettledMap = endpoint.getInitialUnsettledMap();
+
+ Map<Binary, Outcome> unsettledCopy = new HashMap<Binary, Outcome>(_unsettledMap);
+ for(Map.Entry<Binary, Outcome> entry : unsettledCopy.entrySet())
+ {
+ Binary deliveryTag = entry.getKey();
+ if(!initialUnsettledMap.containsKey(deliveryTag))
+ {
+ _unsettledMap.remove(deliveryTag);
+ }
+ }
+
+ }
+
+ public Map getUnsettledOutcomeMap()
+ {
+ return _unsettledMap;
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingDestination.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingDestination.java
new file mode 100644
index 0000000000..6d601c9dda
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingDestination.java
@@ -0,0 +1,27 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+
+public interface SendingDestination extends Destination
+{
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLinkAttachment.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLinkAttachment.java
new file mode 100644
index 0000000000..9d7af24135
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLinkAttachment.java
@@ -0,0 +1,44 @@
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Source;
+
+public class SendingLinkAttachment
+{
+ private final Session_1_0 _session;
+ private final SendingLinkEndpoint _endpoint;
+
+ public SendingLinkAttachment(final Session_1_0 session, final SendingLinkEndpoint endpoint)
+ {
+ _session = session;
+ _endpoint = endpoint;
+ }
+
+ public Session_1_0 getSession()
+ {
+ return _session;
+ }
+
+ public SendingLinkEndpoint getEndpoint()
+ {
+ return _endpoint;
+ }
+
+ public Source getSource()
+ {
+ return getEndpoint().getSource();
+ }
+
+ public void setDeliveryStateHandler(final DeliveryStateHandler handler)
+ {
+ getEndpoint().setDeliveryStateHandler(handler);
+ }
+
+ public void updateDisposition(final Binary deliveryTag, final DeliveryState state, final boolean settled)
+ {
+ getEndpoint().updateDisposition(deliveryTag, state, settled);
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java
new file mode 100644
index 0000000000..b3e9a74d04
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java
@@ -0,0 +1,648 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import org.apache.qpid.AMQException;
+import org.apache.qpid.AMQInternalException;
+import org.apache.qpid.AMQSecurityException;
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.LinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkListener;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Outcome;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.messaging.Accepted;
+import org.apache.qpid.amqp_1_0.type.messaging.ExactSubjectFilter;
+import org.apache.qpid.amqp_1_0.type.messaging.Filter;
+import org.apache.qpid.amqp_1_0.type.messaging.MatchingSubjectFilter;
+import org.apache.qpid.amqp_1_0.type.messaging.Modified;
+import org.apache.qpid.amqp_1_0.type.messaging.NoLocalFilter;
+import org.apache.qpid.amqp_1_0.type.messaging.Released;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.StdDistMode;
+import org.apache.qpid.amqp_1_0.type.messaging.TerminusDurability;
+import org.apache.qpid.amqp_1_0.type.transport.AmqpError;
+import org.apache.qpid.amqp_1_0.type.transport.Detach;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+import org.apache.qpid.filter.SelectorParsingException;
+import org.apache.qpid.filter.selector.ParseException;
+import org.apache.qpid.server.binding.Binding;
+import org.apache.qpid.server.exchange.DirectExchange;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.exchange.TopicExchange;
+import org.apache.qpid.server.filter.JMSSelectorFilter;
+import org.apache.qpid.server.filter.SimpleFilterManager;
+import org.apache.qpid.server.model.UUIDGenerator;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.queue.AMQQueueFactory;
+import org.apache.qpid.server.queue.QueueEntry;
+import org.apache.qpid.server.txn.AutoCommitTransaction;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+
+public class SendingLink_1_0 implements SendingLinkListener, Link_1_0, DeliveryStateHandler
+{
+ private VirtualHost _vhost;
+ private SendingDestination _destination;
+
+ private Subscription_1_0 _subscription;
+ private boolean _draining;
+ private final Map<Binary, QueueEntry> _unsettledMap =
+ new HashMap<Binary, QueueEntry>();
+
+ private final ConcurrentHashMap<Binary, UnsettledAction> _unsettledActionMap =
+ new ConcurrentHashMap<Binary, UnsettledAction>();
+ private volatile SendingLinkAttachment _linkAttachment;
+ private TerminusDurability _durability;
+ private List<QueueEntry> _resumeFullTransfers = new ArrayList<QueueEntry>();
+ private List<Binary> _resumeAcceptedTransfers = new ArrayList<Binary>();
+ private Runnable _closeAction;
+
+ public SendingLink_1_0(final SendingLinkAttachment linkAttachment,
+ final VirtualHost vhost,
+ final SendingDestination destination)
+ throws AmqpErrorException
+ {
+ _vhost = vhost;
+ _destination = destination;
+ _linkAttachment = linkAttachment;
+ final Source source = (Source) linkAttachment.getSource();
+ _durability = source.getDurable();
+ linkAttachment.setDeliveryStateHandler(this);
+ QueueDestination qd = null;
+ AMQQueue queue = null;
+
+
+
+ boolean noLocal = false;
+ JMSSelectorFilter messageFilter = null;
+
+ if(destination instanceof QueueDestination)
+ {
+ queue = ((QueueDestination) _destination).getQueue();
+ if(queue.getArguments() != null && queue.getArguments().containsKey("topic"))
+ {
+ source.setDistributionMode(StdDistMode.COPY);
+ }
+ qd = (QueueDestination) destination;
+
+ Map<Symbol,Filter> filters = source.getFilter();
+
+ Map<Symbol,Filter> actualFilters = new HashMap<Symbol,Filter>();
+
+ if(filters != null)
+ {
+ for(Map.Entry<Symbol,Filter> entry : filters.entrySet())
+ {
+ if(entry.getValue() instanceof NoLocalFilter)
+ {
+ actualFilters.put(entry.getKey(), entry.getValue());
+ noLocal = true;
+ }
+ else if(messageFilter == null && entry.getValue() instanceof org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter)
+ {
+
+ org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter selectorFilter = (org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter) entry.getValue();
+ try
+ {
+ messageFilter = new JMSSelectorFilter(selectorFilter.getValue());
+
+ actualFilters.put(entry.getKey(), entry.getValue());
+ }
+ catch (ParseException e)
+ {
+ Error error = new Error();
+ error.setCondition(AmqpError.INVALID_FIELD);
+ error.setDescription("Invalid JMS Selector: " + selectorFilter.getValue());
+ error.setInfo(Collections.singletonMap(Symbol.valueOf("field"), Symbol.valueOf("filter")));
+ throw new AmqpErrorException(error);
+ }
+ catch (SelectorParsingException e)
+ {
+ Error error = new Error();
+ error.setCondition(AmqpError.INVALID_FIELD);
+ error.setDescription("Invalid JMS Selector: " + selectorFilter.getValue());
+ error.setInfo(Collections.singletonMap(Symbol.valueOf("field"), Symbol.valueOf("filter")));
+ throw new AmqpErrorException(error);
+ }
+
+
+ }
+ }
+ }
+ source.setFilter(actualFilters.isEmpty() ? null : actualFilters);
+
+ _subscription = new Subscription_1_0(this, qd);
+ }
+ else if(destination instanceof ExchangeDestination)
+ {
+ try
+ {
+
+ ExchangeDestination exchangeDestination = (ExchangeDestination) destination;
+
+ boolean isDurable = exchangeDestination.getDurability() == TerminusDurability.CONFIGURATION
+ || exchangeDestination.getDurability() == TerminusDurability.UNSETTLED_STATE;
+ String name;
+ if(isDurable)
+ {
+ String remoteContainerId = getEndpoint().getSession().getConnection().getRemoteContainerId();
+ remoteContainerId = remoteContainerId.replace("_","__").replace(".", "_:");
+
+ String endpointName = linkAttachment.getEndpoint().getName();
+ endpointName = endpointName
+ .replace("_", "__")
+ .replace(".", "_:")
+ .replace("(", "_O")
+ .replace(")", "_C")
+ .replace("<", "_L")
+ .replace(">", "_R");
+ name = "qpid_/" + remoteContainerId + "_/" + endpointName;
+ }
+ else
+ {
+ name = UUID.randomUUID().toString();
+ }
+
+ queue = _vhost.getQueueRegistry().getQueue(name);
+ Exchange exchange = exchangeDestination.getExchange();
+
+ if(queue == null)
+ {
+ queue = AMQQueueFactory.createAMQQueueImpl(
+ UUIDGenerator.generateUUID(),
+ name,
+ isDurable,
+ null,
+ true,
+ true,
+ _vhost,
+ Collections.EMPTY_MAP);
+ }
+ else
+ {
+ List<Binding> bindings = queue.getBindings();
+ List<Binding> bindingsToRemove = new ArrayList<Binding>();
+ for(Binding existingBinding : bindings)
+ {
+ if(existingBinding.getExchange() != _vhost.getExchangeRegistry().getDefaultExchange()
+ && existingBinding.getExchange() != exchange)
+ {
+ bindingsToRemove.add(existingBinding);
+ }
+ }
+ for(Binding existingBinding : bindingsToRemove)
+ {
+ existingBinding.getExchange().removeBinding(existingBinding);
+ }
+ }
+
+
+ String binding = "";
+
+ Map<Symbol,Filter> filters = source.getFilter();
+ Map<Symbol,Filter> actualFilters = new HashMap<Symbol,Filter>();
+ boolean hasBindingFilter = false;
+ if(filters != null && !filters.isEmpty())
+ {
+
+ for(Map.Entry<Symbol,Filter> entry : filters.entrySet())
+ {
+ if(!hasBindingFilter
+ && entry.getValue() instanceof ExactSubjectFilter
+ && exchange.getType() == DirectExchange.TYPE)
+ {
+ ExactSubjectFilter filter = (ExactSubjectFilter) filters.values().iterator().next();
+ source.setFilter(filters);
+ binding = filter.getValue();
+ actualFilters.put(entry.getKey(), entry.getValue());
+ hasBindingFilter = true;
+ }
+ else if(!hasBindingFilter
+ && entry.getValue() instanceof MatchingSubjectFilter
+ && exchange.getType() == TopicExchange.TYPE)
+ {
+ MatchingSubjectFilter filter = (MatchingSubjectFilter) filters.values().iterator().next();
+ source.setFilter(filters);
+ binding = filter.getValue();
+ actualFilters.put(entry.getKey(), entry.getValue());
+ hasBindingFilter = true;
+ }
+ else if(entry.getValue() instanceof NoLocalFilter)
+ {
+ actualFilters.put(entry.getKey(), entry.getValue());
+ noLocal = true;
+ }
+ else if(messageFilter == null && entry.getValue() instanceof org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter)
+ {
+
+ org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter selectorFilter = (org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter) entry.getValue();
+ try
+ {
+ messageFilter = new JMSSelectorFilter(selectorFilter.getValue());
+
+ actualFilters.put(entry.getKey(), entry.getValue());
+ }
+ catch (ParseException e)
+ {
+ Error error = new Error();
+ error.setCondition(AmqpError.INVALID_FIELD);
+ error.setDescription("Invalid JMS Selector: " + selectorFilter.getValue());
+ error.setInfo(Collections.singletonMap(Symbol.valueOf("field"), Symbol.valueOf("filter")));
+ throw new AmqpErrorException(error);
+ }
+ catch (SelectorParsingException e)
+ {
+ Error error = new Error();
+ error.setCondition(AmqpError.INVALID_FIELD);
+ error.setDescription("Invalid JMS Selector: " + selectorFilter.getValue());
+ error.setInfo(Collections.singletonMap(Symbol.valueOf("field"), Symbol.valueOf("filter")));
+ throw new AmqpErrorException(error);
+ }
+
+
+ }
+ }
+ }
+ source.setFilter(actualFilters.isEmpty() ? null : actualFilters);
+
+ vhost.getBindingFactory().addBinding(binding,queue,exchange,null);
+ source.setDistributionMode(StdDistMode.COPY);
+
+ qd = new QueueDestination(queue);
+ }
+ catch (AMQSecurityException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ catch (AMQInternalException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ } catch (AMQException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ _subscription = new Subscription_1_0(this, qd, true);
+
+ }
+
+ if(_subscription != null)
+ {
+ _subscription.setNoLocal(noLocal);
+ if(messageFilter!=null)
+ {
+ _subscription.setFilters(new SimpleFilterManager(messageFilter));
+ }
+
+ try
+ {
+
+ queue.registerSubscription(_subscription, false);
+ }
+ catch (AMQException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+ }
+
+ }
+
+ public void resume(SendingLinkAttachment linkAttachment)
+ {
+ _linkAttachment = linkAttachment;
+
+ }
+
+ public void remoteDetached(final LinkEndpoint endpoint, final Detach detach)
+ {
+ //TODO
+ // if not durable or close
+ if(!TerminusDurability.UNSETTLED_STATE.equals(_durability))
+ {
+ AMQQueue queue = _subscription.getQueue();
+
+ try
+ {
+
+ queue.unregisterSubscription(_subscription);
+
+ }
+ catch (AMQException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+
+ Modified state = new Modified();
+ state.setDeliveryFailed(true);
+
+ for(UnsettledAction action : _unsettledActionMap.values())
+ {
+
+ action.process(state,Boolean.TRUE);
+ }
+ _unsettledActionMap.clear();
+
+ endpoint.close();
+
+ if(_destination instanceof ExchangeDestination
+ && (_durability == TerminusDurability.CONFIGURATION
+ || _durability == TerminusDurability.UNSETTLED_STATE))
+ {
+ try
+ {
+ queue.delete();
+ }
+ catch(AMQException e)
+ {
+ e.printStackTrace(); // TODO - Implement
+ }
+ }
+
+ if(_closeAction != null)
+ {
+ _closeAction.run();
+ }
+ }
+ else if(detach == null || detach.getError() != null)
+ {
+ _linkAttachment = null;
+ _subscription.flowStateChanged();
+ }
+ else
+ {
+ endpoint.detach();
+ }
+ }
+
+ public void start()
+ {
+ //TODO
+ }
+
+ public SendingLinkEndpoint getEndpoint()
+ {
+ return _linkAttachment == null ? null : _linkAttachment.getEndpoint() ;
+ }
+
+ public Session_1_0 getSession()
+ {
+ return _linkAttachment == null ? null : _linkAttachment.getSession();
+ }
+
+ public void flowStateChanged()
+ {
+ if(Boolean.TRUE.equals(getEndpoint().getDrain())
+ && hasCredit())
+ {
+ _draining = true;
+ }
+
+ while(!_resumeAcceptedTransfers.isEmpty() && getEndpoint().hasCreditToSend())
+ {
+ Accepted accepted = new Accepted();
+ synchronized(getLock())
+ {
+
+ Transfer xfr = new Transfer();
+ Binary dt = _resumeAcceptedTransfers.remove(0);
+ xfr.setDeliveryTag(dt);
+ xfr.setState(accepted);
+ xfr.setResume(Boolean.TRUE);
+ getEndpoint().transfer(xfr);
+ }
+
+ }
+ if(_resumeAcceptedTransfers.isEmpty())
+ {
+ _subscription.flowStateChanged();
+ }
+
+ }
+
+ boolean hasCredit()
+ {
+ return getEndpoint().getLinkCredit().compareTo(UnsignedInteger.ZERO) > 0;
+ }
+
+ public boolean isDraining()
+ {
+ return false; //TODO
+ }
+
+ public boolean drained()
+ {
+ if(getEndpoint() != null)
+ {
+ synchronized(getEndpoint().getLock())
+ {
+ if(_draining)
+ {
+ //TODO
+ getEndpoint().drained();
+ _draining = false;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public void addUnsettled(Binary tag, UnsettledAction unsettledAction, QueueEntry queueEntry)
+ {
+ _unsettledActionMap.put(tag,unsettledAction);
+ if(getTransactionId() == null)
+ {
+ _unsettledMap.put(tag, queueEntry);
+ }
+ }
+
+ public void removeUnsettled(Binary tag)
+ {
+ _unsettledActionMap.remove(tag);
+ }
+
+ public void handle(Binary deliveryTag, DeliveryState state, Boolean settled)
+ {
+ UnsettledAction action = _unsettledActionMap.get(deliveryTag);
+ boolean localSettle = false;
+ if(action != null)
+ {
+ localSettle = action.process(state, settled);
+ if(localSettle && !Boolean.TRUE.equals(settled))
+ {
+ _linkAttachment.updateDisposition(deliveryTag, state, true);
+ }
+ }
+ if(Boolean.TRUE.equals(settled) || localSettle)
+ {
+ _unsettledActionMap.remove(deliveryTag);
+ _unsettledMap.remove(deliveryTag);
+ }
+ }
+
+ ServerTransaction getTransaction(Binary transactionId)
+ {
+ return _linkAttachment.getSession().getTransaction(transactionId);
+ }
+
+ public Binary getTransactionId()
+ {
+ SendingLinkEndpoint endpoint = getEndpoint();
+ return endpoint == null ? null : endpoint.getTransactionId();
+ }
+
+ public synchronized Object getLock()
+ {
+ return _linkAttachment == null ? this : getEndpoint().getLock();
+ }
+
+ public boolean isDetached()
+ {
+ return _linkAttachment == null || getEndpoint().isDetached();
+ }
+
+ public boolean isAttached()
+ {
+ return _linkAttachment != null && getEndpoint().isAttached();
+ }
+
+ public synchronized void setLinkAttachment(SendingLinkAttachment linkAttachment)
+ {
+
+ if(_subscription.isActive())
+ {
+ _subscription.suspend();
+ }
+
+ _linkAttachment = linkAttachment;
+
+ SendingLinkEndpoint endpoint = linkAttachment.getEndpoint();
+ endpoint.setDeliveryStateHandler(this);
+ Map initialUnsettledMap = endpoint.getInitialUnsettledMap();
+ Map<Binary, QueueEntry> unsettledCopy = new HashMap<Binary, QueueEntry>(_unsettledMap);
+ _resumeAcceptedTransfers.clear();
+ _resumeFullTransfers.clear();
+
+ for(Map.Entry<Binary, QueueEntry> entry : unsettledCopy.entrySet())
+ {
+ Binary deliveryTag = entry.getKey();
+ final QueueEntry queueEntry = entry.getValue();
+ if(initialUnsettledMap == null || !initialUnsettledMap.containsKey(deliveryTag))
+ {
+ queueEntry.setRedelivered();
+ queueEntry.release();
+ _unsettledMap.remove(deliveryTag);
+ }
+ else if(initialUnsettledMap != null && (initialUnsettledMap.get(deliveryTag) instanceof Outcome))
+ {
+ Outcome outcome = (Outcome) initialUnsettledMap.get(deliveryTag);
+
+ if(outcome instanceof Accepted)
+ {
+ AutoCommitTransaction txn = new AutoCommitTransaction(_vhost.getMessageStore());
+ if(_subscription.acquires())
+ {
+ txn.dequeue(Collections.singleton(queueEntry),
+ new ServerTransaction.Action()
+ {
+ public void postCommit()
+ {
+ queueEntry.discard();
+ }
+
+ public void onRollback()
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+ });
+ }
+ }
+ else if(outcome instanceof Released)
+ {
+ AutoCommitTransaction txn = new AutoCommitTransaction(_vhost.getMessageStore());
+ if(_subscription.acquires())
+ {
+ txn.dequeue(Collections.singleton(queueEntry),
+ new ServerTransaction.Action()
+ {
+ public void postCommit()
+ {
+ queueEntry.release();
+ }
+
+ public void onRollback()
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+ });
+ }
+ }
+ //_unsettledMap.remove(deliveryTag);
+ initialUnsettledMap.remove(deliveryTag);
+ _resumeAcceptedTransfers.add(deliveryTag);
+ }
+ else
+ {
+ _resumeFullTransfers.add(queueEntry);
+ // exists in receivers map, but not yet got an outcome ... should resend with resume = true
+ }
+ // TODO - else
+ }
+
+
+ }
+
+ public Map getUnsettledOutcomeMap()
+ {
+ Map<Binary, QueueEntry> unsettled = new HashMap<Binary, QueueEntry>(_unsettledMap);
+
+ for(Map.Entry<Binary, QueueEntry> entry : unsettled.entrySet())
+ {
+ entry.setValue(null);
+ }
+
+ return unsettled;
+ }
+
+ public void setCloseAction(Runnable action)
+ {
+ _closeAction = action;
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java
new file mode 100644
index 0000000000..48a551e42a
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java
@@ -0,0 +1,446 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.transport.LinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SessionEventListener;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+import org.apache.qpid.amqp_1_0.type.transaction.Coordinator;
+import org.apache.qpid.amqp_1_0.type.transaction.TxnCapability;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.AMQException;
+import org.apache.qpid.AMQSecurityException;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.model.UUIDGenerator;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.queue.AMQQueueFactory;
+import org.apache.qpid.server.registry.IApplicationRegistry;
+import org.apache.qpid.server.txn.AutoCommitTransaction;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+
+import java.util.*;
+
+public class Session_1_0 implements SessionEventListener
+{
+ private static final Symbol LIFETIME_POLICY = Symbol.valueOf("lifetime-policy");
+ private IApplicationRegistry _appRegistry;
+ private VirtualHost _vhost;
+ private AutoCommitTransaction _transaction;
+
+ private final LinkedHashMap<Integer, ServerTransaction> _openTransactions =
+ new LinkedHashMap<Integer, ServerTransaction>();
+ private final Connection_1_0 _connection;
+
+
+ public Session_1_0(VirtualHost vhost, IApplicationRegistry appRegistry, final Connection_1_0 connection)
+ {
+ _appRegistry = appRegistry;
+ _vhost = vhost;
+ _transaction = new AutoCommitTransaction(vhost.getMessageStore());
+ _connection = connection;
+
+ }
+
+ public void remoteLinkCreation(final LinkEndpoint endpoint)
+ {
+
+
+ Destination destination;
+ Link_1_0 link = null;
+ Error error = null;
+
+ final LinkRegistry linkRegistry = _vhost.getLinkRegistry(endpoint.getSession().getConnection().getRemoteContainerId());
+
+
+ if(endpoint.getRole() == Role.SENDER)
+ {
+
+ SendingLink_1_0 previousLink = linkRegistry.getDurableSendingLink(endpoint.getName());
+
+ if(previousLink == null)
+ {
+
+ Target target = (Target) endpoint.getTarget();
+ Source source = (Source) endpoint.getSource();
+
+
+ if(source != null)
+ {
+ if(Boolean.TRUE.equals(source.getDynamic()))
+ {
+ AMQQueue tempQueue = createTemporaryQueue(source.getDynamicNodeProperties());
+ source.setAddress(tempQueue.getName());
+ }
+ String addr = source.getAddress();
+ AMQQueue queue = _vhost.getQueueRegistry().getQueue(addr);
+ if(queue != null)
+ {
+
+ destination = new QueueDestination(queue);
+
+
+
+ }
+ else
+ {
+ Exchange exchg = _vhost.getExchangeRegistry().getExchange(addr);
+ if(exchg != null)
+ {
+ destination = new ExchangeDestination(exchg, source.getDurable(), source.getExpiryPolicy());
+ }
+ else
+ {
+
+ endpoint.setSource(null);
+ destination = null;
+ }
+ }
+
+ }
+ else
+ {
+ destination = null;
+ }
+
+ if(destination != null)
+ {
+ final SendingLinkEndpoint sendingLinkEndpoint = (SendingLinkEndpoint) endpoint;
+ try
+ {
+ final SendingLink_1_0 sendingLink = new SendingLink_1_0(new SendingLinkAttachment(this, sendingLinkEndpoint),
+ _vhost,
+ (SendingDestination) destination
+ );
+ sendingLinkEndpoint.setLinkEventListener(sendingLink);
+ link = sendingLink;
+ if(TerminusDurability.UNSETTLED_STATE.equals(source.getDurable()))
+ {
+ linkRegistry.registerSendingLink(endpoint.getName(), sendingLink);
+ }
+ }
+ catch(AmqpErrorException e)
+ {
+ e.printStackTrace();
+ destination = null;
+ sendingLinkEndpoint.setSource(null);
+ error = e.getError();
+ }
+ }
+ }
+ else
+ {
+ Source newSource = (Source) endpoint.getSource();
+
+ Source oldSource = (Source) previousLink.getEndpoint().getSource();
+ final TerminusDurability newSourceDurable = newSource == null ? null : newSource.getDurable();
+ if(newSourceDurable != null)
+ {
+ oldSource.setDurable(newSourceDurable);
+ if(newSourceDurable.equals(TerminusDurability.NONE))
+ {
+ linkRegistry.unregisterSendingLink(endpoint.getName());
+ }
+ }
+ endpoint.setSource(oldSource);
+ SendingLinkEndpoint sendingLinkEndpoint = (SendingLinkEndpoint) endpoint;
+ previousLink.setLinkAttachment(new SendingLinkAttachment(this, sendingLinkEndpoint));
+ sendingLinkEndpoint.setLinkEventListener(previousLink);
+ link = previousLink;
+ endpoint.setLocalUnsettled(previousLink.getUnsettledOutcomeMap());
+ }
+ }
+ else
+ {
+ if(endpoint.getTarget() instanceof Coordinator)
+ {
+ Coordinator coordinator = (Coordinator) endpoint.getTarget();
+ TxnCapability[] capabilities = coordinator.getCapabilities();
+ boolean localTxn = false;
+ boolean multiplePerSession = false;
+ if(capabilities != null)
+ {
+ for(TxnCapability capability : capabilities)
+ {
+ if(capability.equals(TxnCapability.LOCAL_TXN))
+ {
+ localTxn = true;
+ }
+ else if(capability.equals(TxnCapability.MULTI_TXNS_PER_SSN))
+ {
+ multiplePerSession = true;
+ }
+ else
+ {
+ error = new Error();
+ error.setCondition(AmqpError.NOT_IMPLEMENTED);
+ error.setDescription("Unsupported capability: " + capability);
+ break;
+ }
+ }
+ }
+
+ /* if(!localTxn)
+ {
+ capabilities.add(TxnCapabilities.LOCAL_TXN);
+ }*/
+
+ final ReceivingLinkEndpoint receivingLinkEndpoint = (ReceivingLinkEndpoint) endpoint;
+ final TxnCoordinatorLink_1_0 coordinatorLink =
+ new TxnCoordinatorLink_1_0(_vhost, this, receivingLinkEndpoint, _openTransactions);
+ receivingLinkEndpoint.setLinkEventListener(coordinatorLink);
+ link = coordinatorLink;
+
+
+ }
+ else
+ {
+
+ ReceivingLink_1_0 previousLink = linkRegistry.getDurableReceivingLink(endpoint.getName());
+
+ if(previousLink == null)
+ {
+
+ Target target = (Target) endpoint.getTarget();
+
+ if(target != null)
+ {
+ if(Boolean.TRUE.equals(target.getDynamic()))
+ {
+
+ AMQQueue tempQueue = createTemporaryQueue(target.getDynamicNodeProperties());
+ target.setAddress(tempQueue.getName());
+ }
+
+ String addr = target.getAddress();
+ Exchange exchg = _vhost.getExchangeRegistry().getExchange(addr);
+ if(exchg != null)
+ {
+ destination = new ExchangeDestination(exchg, target.getDurable(),
+ target.getExpiryPolicy());
+ }
+ else
+ {
+ AMQQueue queue = _vhost.getQueueRegistry().getQueue(addr);
+ if(queue != null)
+ {
+
+ destination = new QueueDestination(queue);
+ }
+ else
+ {
+ endpoint.setTarget(null);
+ destination = null;
+ }
+
+ }
+
+
+ }
+ else
+ {
+ destination = null;
+ }
+ if(destination != null)
+ {
+ final ReceivingLinkEndpoint receivingLinkEndpoint = (ReceivingLinkEndpoint) endpoint;
+ final ReceivingLink_1_0 receivingLink = new ReceivingLink_1_0(new ReceivingLinkAttachment(this, receivingLinkEndpoint), _vhost,
+ (ReceivingDestination) destination);
+ receivingLinkEndpoint.setLinkEventListener(receivingLink);
+ link = receivingLink;
+ if(TerminusDurability.UNSETTLED_STATE.equals(target.getDurable()))
+ {
+ linkRegistry.registerReceivingLink(endpoint.getName(), receivingLink);
+ }
+ }
+ }
+ else
+ {
+ ReceivingLinkEndpoint receivingLinkEndpoint = (ReceivingLinkEndpoint) endpoint;
+ previousLink.setLinkAttachment(new ReceivingLinkAttachment(this, receivingLinkEndpoint));
+ receivingLinkEndpoint.setLinkEventListener(previousLink);
+ link = previousLink;
+ endpoint.setLocalUnsettled(previousLink.getUnsettledOutcomeMap());
+
+ }
+ }
+ }
+
+ endpoint.attach();
+
+ if(link == null)
+ {
+ if(error == null)
+ {
+ error = new Error();
+ error.setCondition(AmqpError.NOT_FOUND);
+ }
+ endpoint.detach(error);
+ }
+ else
+ {
+ link.start();
+ }
+ }
+
+
+ private AMQQueue createTemporaryQueue(Map properties)
+ {
+ final String queueName = UUID.randomUUID().toString();
+ AMQQueue queue = null;
+ try
+ {
+ LifetimePolicy lifetimePolicy = properties == null
+ ? null
+ : (LifetimePolicy) properties.get(LIFETIME_POLICY);
+
+ final AMQQueue tempQueue = queue = AMQQueueFactory.createAMQQueueImpl( UUIDGenerator.generateUUID(),
+ queueName,
+ false, // durable
+ null, // owner
+ false, // autodelete
+ false, // exclusive
+ _vhost,
+ properties);
+
+
+
+ if (lifetimePolicy == null || lifetimePolicy instanceof DeleteOnClose)
+ {
+ final Connection_1_0.Task deleteQueueTask =
+ new Connection_1_0.Task()
+ {
+ public void doTask(Connection_1_0 session)
+ {
+ if (_vhost.getQueueRegistry().getQueue(queueName) == tempQueue)
+ {
+ try
+ {
+ tempQueue.delete();
+ }
+ catch (AMQException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ }
+ }
+ };
+
+ _connection.addConnectionCloseTask(deleteQueueTask);
+
+ queue.addQueueDeleteTask(new AMQQueue.Task()
+ {
+ public void doTask(AMQQueue queue)
+ {
+ _connection.removeConnectionCloseTask(deleteQueueTask);
+ }
+
+
+ });
+ }
+ else if(lifetimePolicy instanceof DeleteOnNoLinks)
+ {
+
+ }
+ else if(lifetimePolicy instanceof DeleteOnNoMessages)
+ {
+
+ }
+ else if(lifetimePolicy instanceof DeleteOnNoLinksOrMessages)
+ {
+
+ }
+ }
+ catch (AMQSecurityException e)
+ {
+ e.printStackTrace(); //TODO.
+ } catch (AMQException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+
+ return queue;
+ }
+
+ public ServerTransaction getTransaction(Binary transactionId)
+ {
+ // TODO should treat invalid id differently to null
+ ServerTransaction transaction = _openTransactions.get(binaryToInteger(transactionId));
+ return transaction == null ? _transaction : transaction;
+ }
+
+ public void remoteEnd(End end)
+ {
+ Iterator<Map.Entry<Integer, ServerTransaction>> iter = _openTransactions.entrySet().iterator();
+
+ while(iter.hasNext())
+ {
+ Map.Entry<Integer, ServerTransaction> entry = iter.next();
+ entry.getValue().rollback();
+ iter.remove();
+ }
+
+ }
+
+ Integer binaryToInteger(final Binary txnId)
+ {
+ if(txnId == null)
+ {
+ return null;
+ }
+
+ if(txnId.getLength() > 4)
+ throw new IllegalArgumentException();
+
+ int id = 0;
+ byte[] data = txnId.getArray();
+ for(int i = 0; i < txnId.getLength(); i++)
+ {
+ id <<= 8;
+ id += data[i+txnId.getArrayOffset()];
+ }
+
+ return id;
+
+ }
+
+ Binary integerToBinary(final int txnId)
+ {
+ byte[] data = new byte[4];
+ data[3] = (byte) (txnId & 0xff);
+ data[2] = (byte) ((txnId & 0xff00) >> 8);
+ data[1] = (byte) ((txnId & 0xff0000) >> 16);
+ data[0] = (byte) ((txnId & 0xff000000) >> 24);
+ return new Binary(data);
+
+ }
+
+ public void forceEnd()
+ {
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Subscription_1_0.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Subscription_1_0.java
new file mode 100644
index 0000000000..08926d000d
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Subscription_1_0.java
@@ -0,0 +1,634 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.ReentrantLock;
+import org.apache.qpid.AMQException;
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoderImpl;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Outcome;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+import org.apache.qpid.amqp_1_0.type.messaging.Accepted;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.Modified;
+import org.apache.qpid.amqp_1_0.type.messaging.Released;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.StdDistMode;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+import org.apache.qpid.amqp_1_0.type.transport.SenderSettleMode;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+import org.apache.qpid.server.filter.FilterManager;
+import org.apache.qpid.server.logging.LogActor;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.queue.QueueEntry;
+import org.apache.qpid.server.subscription.Subscription;
+import org.apache.qpid.server.txn.ServerTransaction;
+
+class Subscription_1_0 implements Subscription
+{
+ private SendingLink_1_0 _link;
+
+ private AMQQueue _queue;
+
+ private final AtomicReference<State> _state = new AtomicReference<State>(State.SUSPENDED);
+
+ private final QueueEntry.SubscriptionAcquiredState _owningState = new QueueEntry.SubscriptionAcquiredState(this);
+ private final QueueEntry.SubscriptionAssignedState _assignedState = new QueueEntry.SubscriptionAssignedState(this);
+ private final long _id;
+ private final boolean _acquires;
+ private AMQQueue.Context _queueContext;
+ private Map<String, Object> _properties = new ConcurrentHashMap<String, Object>();
+ private ReentrantLock _stateChangeLock = new ReentrantLock();
+
+ private boolean _noLocal;
+ private FilterManager _filters;
+
+ private long _deliveryTag = 0L;
+ private StateListener _stateListener;
+
+ private Binary _transactionId;
+ private final AMQPDescribedTypeRegistry _typeRegistry = AMQPDescribedTypeRegistry.newInstance()
+ .registerTransportLayer()
+ .registerMessagingLayer()
+ .registerTransactionLayer()
+ .registerSecurityLayer();
+ private SectionEncoder _sectionEncoder = new SectionEncoderImpl(_typeRegistry);
+
+ public Subscription_1_0(final SendingLink_1_0 link, final QueueDestination destination)
+ {
+ this(link, destination, ((Source)link.getEndpoint().getSource()).getDistributionMode() != StdDistMode.COPY);
+ }
+
+ public Subscription_1_0(final SendingLink_1_0 link, final QueueDestination destination, boolean acquires)
+ {
+ _link = link;
+ _queue = destination.getQueue();
+ _id = getEndpoint().getLocalHandle().longValue();
+ _acquires = acquires;
+ }
+
+ private SendingLinkEndpoint getEndpoint()
+ {
+ return _link.getEndpoint();
+ }
+
+ public LogActor getLogActor()
+ {
+ return null; //TODO
+ }
+
+ public boolean isTransient()
+ {
+ return true; //TODO
+ }
+
+ public AMQQueue getQueue()
+ {
+ return _queue;
+ }
+
+ public QueueEntry.SubscriptionAcquiredState getOwningState()
+ {
+ return _owningState;
+ }
+
+ public QueueEntry.SubscriptionAssignedState getAssignedState()
+ {
+ return _assignedState;
+ }
+
+ public void setQueue(final AMQQueue queue, final boolean exclusive)
+ {
+ //TODO
+ }
+
+ public void setNoLocal(final boolean noLocal)
+ {
+ _noLocal = noLocal;
+ }
+
+ public boolean isNoLocal()
+ {
+ return _noLocal;
+ }
+
+ public long getSubscriptionID()
+ {
+ return _id;
+ }
+
+ public boolean isSuspended()
+ {
+ return !isActive();// || !getEndpoint().hasCreditToSend();
+
+ }
+
+ public boolean hasInterest(final QueueEntry entry)
+ {
+ return !(_noLocal && (entry.getMessage() instanceof Message_1_0)
+ && ((Message_1_0)entry.getMessage()).getSession() == getSession())
+ && checkFilters(entry);
+
+ }
+
+ private boolean checkFilters(final QueueEntry entry)
+ {
+ return (_filters == null) || _filters.allAllow(entry);
+ }
+
+ public boolean isClosed()
+ {
+ return !getEndpoint().isAttached();
+ }
+
+ public boolean acquires()
+ {
+ return _acquires;
+ }
+
+ public boolean seesRequeues()
+ {
+ // TODO
+ return acquires();
+ }
+
+ public void close()
+ {
+ getEndpoint().detach();
+ }
+
+ public void send(QueueEntry entry, boolean batch) throws AMQException
+ {
+ // TODO
+ send(entry);
+ }
+
+ public void flushBatched()
+ {
+ // TODO
+ }
+
+ public void send(final QueueEntry queueEntry) throws AMQException
+ {
+ //TODO
+ ServerMessage serverMessage = queueEntry.getMessage();
+ if(serverMessage instanceof Message_1_0)
+ {
+ Message_1_0 message = (Message_1_0) serverMessage;
+ Transfer transfer = new Transfer();
+ //TODO
+
+
+ List<ByteBuffer> fragments = message.getFragments();
+ ByteBuffer payload;
+ if(fragments.size() == 1)
+ {
+ payload = fragments.get(0);
+ }
+ else
+ {
+ int size = 0;
+ for(ByteBuffer fragment : fragments)
+ {
+ size += fragment.remaining();
+ }
+
+ payload = ByteBuffer.allocate(size);
+
+ for(ByteBuffer fragment : fragments)
+ {
+ payload.put(fragment.duplicate());
+ }
+
+ payload.flip();
+ }
+
+ if(queueEntry.getDeliveryCount() != 0)
+ {
+ payload = payload.duplicate();
+ ValueHandler valueHandler = new ValueHandler(_typeRegistry);
+
+ Header oldHeader = null;
+ try
+ {
+ ByteBuffer encodedBuf = payload.duplicate();
+ Object value = valueHandler.parse(payload);
+ if(value instanceof Header)
+ {
+ oldHeader = (Header) value;
+ }
+ else
+ {
+ payload.position(0);
+ }
+ }
+ catch (AmqpErrorException e)
+ {
+ //TODO
+ throw new RuntimeException(e);
+ }
+
+ Header header = new Header();
+ if(oldHeader != null)
+ {
+ header.setDurable(oldHeader.getDurable());
+ header.setPriority(oldHeader.getPriority());
+ header.setTtl(oldHeader.getTtl());
+ }
+ header.setDeliveryCount(UnsignedInteger.valueOf(queueEntry.getDeliveryCount()));
+ _sectionEncoder.reset();
+ _sectionEncoder.encodeObject(header);
+ Binary encodedHeader = _sectionEncoder.getEncoding();
+
+ ByteBuffer oldPayload = payload;
+ payload = ByteBuffer.allocate(oldPayload.remaining() + encodedHeader.getLength());
+ payload.put(encodedHeader.getArray(),encodedHeader.getArrayOffset(),encodedHeader.getLength());
+ payload.put(oldPayload);
+ payload.flip();
+ }
+
+ transfer.setPayload(payload);
+ byte[] data = new byte[8];
+ ByteBuffer.wrap(data).putLong(_deliveryTag++);
+ final Binary tag = new Binary(data);
+
+ transfer.setDeliveryTag(tag);
+
+ synchronized(_link.getLock())
+ {
+ if(_link.isAttached())
+ {
+ if(SenderSettleMode.SETTLED.equals(getEndpoint().getSendingSettlementMode()))
+ {
+ transfer.setSettled(true);
+ }
+ else
+ {
+ UnsettledAction action = _acquires
+ ? new DispositionAction(tag, queueEntry)
+ : new DoNothingAction(tag, queueEntry);
+
+ _link.addUnsettled(tag, action, queueEntry);
+ }
+
+ if(_transactionId != null)
+ {
+ TransactionalState state = new TransactionalState();
+ state.setTxnId(_transactionId);
+ transfer.setState(state);
+ }
+ // TODO - need to deal with failure here
+ if(_acquires && _transactionId != null)
+ {
+ ServerTransaction txn = _link.getTransaction(_transactionId);
+ if(txn != null)
+ {
+ txn.addPostTransactionAction(new ServerTransaction.Action(){
+
+ public void postCommit()
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void onRollback()
+ {
+ if(queueEntry.isAcquiredBy(Subscription_1_0.this))
+ {
+ queueEntry.release();
+ _link.getEndpoint().updateDisposition(tag, (DeliveryState)null, true);
+
+
+ }
+ }
+ });
+ }
+
+ }
+
+ getEndpoint().transfer(transfer);
+ }
+ else
+ {
+ queueEntry.release();
+ }
+ }
+ }
+
+ }
+
+ public void queueDeleted(final AMQQueue queue)
+ {
+ //TODO
+ getEndpoint().setSource(null);
+ getEndpoint().detach();
+ }
+
+ public synchronized boolean wouldSuspend(final QueueEntry msg)
+ {
+ final boolean hasCredit = _link.isAttached() && getEndpoint().hasCreditToSend();
+ if(!hasCredit && getState() == State.ACTIVE)
+ {
+ suspend();
+ }
+
+ return !hasCredit;
+ }
+
+ public boolean trySendLock()
+ {
+ return _stateChangeLock.tryLock();
+ }
+
+ public synchronized void suspend()
+ {
+ if(_state.compareAndSet(State.ACTIVE, State.SUSPENDED))
+ {
+ _stateListener.stateChange(this, State.ACTIVE, State.SUSPENDED);
+ }
+ }
+
+ public void getSendLock()
+ {
+ _stateChangeLock.lock();
+ }
+
+ public void releaseSendLock()
+ {
+ _stateChangeLock.unlock();
+ }
+
+ public void releaseQueueEntry(QueueEntry queueEntryImpl)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+
+ public void onDequeue(final QueueEntry queueEntry)
+ {
+ //TODO
+ }
+
+ public void restoreCredit(final QueueEntry queueEntry)
+ {
+ //TODO
+ }
+
+ public void setStateListener(final StateListener listener)
+ {
+ _stateListener = listener;
+ }
+
+ public State getState()
+ {
+ return _state.get();
+ }
+
+ public AMQQueue.Context getQueueContext()
+ {
+ return _queueContext;
+ }
+
+ public void setQueueContext(AMQQueue.Context queueContext)
+ {
+ _queueContext = queueContext;
+ }
+
+
+ public boolean isActive()
+ {
+ return getState() == State.ACTIVE;
+ }
+
+ public void set(String key, Object value)
+ {
+ _properties.put(key, value);
+ }
+
+ public Object get(String key)
+ {
+ return _properties.get(key);
+ }
+
+ public boolean isSessionTransactional()
+ {
+ return false; //TODO
+ }
+
+ public synchronized void queueEmpty()
+ {
+ if(_link.drained())
+ {
+ if(_state.compareAndSet(State.ACTIVE, State.SUSPENDED))
+ {
+ _stateListener.stateChange(this, State.ACTIVE, State.SUSPENDED);
+ }
+ }
+ }
+
+ public synchronized void flowStateChanged()
+ {
+ if(isSuspended() && getEndpoint() != null)
+ {
+ if(_state.compareAndSet(State.SUSPENDED, State.ACTIVE))
+ {
+ _stateListener.stateChange(this, State.SUSPENDED, State.ACTIVE);
+ }
+ _transactionId = _link.getTransactionId();
+ }
+ }
+
+ public Session_1_0 getSession()
+ {
+ return _link.getSession();
+ }
+
+ private class DispositionAction implements UnsettledAction
+ {
+
+ private final QueueEntry _queueEntry;
+ private final Binary _deliveryTag;
+
+ public DispositionAction(Binary tag, QueueEntry queueEntry)
+ {
+ _deliveryTag = tag;
+ _queueEntry = queueEntry;
+ }
+
+ public boolean process(DeliveryState state, final Boolean settled)
+ {
+
+ Binary transactionId = null;
+ final Outcome outcome;
+ // If disposition is settled this overrides the txn?
+ if(state instanceof TransactionalState)
+ {
+ transactionId = ((TransactionalState)state).getTxnId();
+ outcome = ((TransactionalState)state).getOutcome();
+ }
+ else if (state instanceof Outcome)
+ {
+ outcome = (Outcome) state;
+ }
+ else
+ {
+ outcome = null;
+ }
+
+
+ ServerTransaction txn = _link.getTransaction(transactionId);
+
+ if(outcome instanceof Accepted)
+ {
+ txn.dequeue(_queueEntry.getQueue(), _queueEntry.getMessage(),
+ new ServerTransaction.Action()
+ {
+
+ public void postCommit()
+ {
+ if(_queueEntry.isAcquiredBy(Subscription_1_0.this))
+ {
+ _queueEntry.discard();
+ }
+ }
+
+ public void onRollback()
+ {
+
+ }
+ });
+ txn.addPostTransactionAction(new ServerTransaction.Action()
+ {
+ public void postCommit()
+ {
+ //_link.getEndpoint().settle(_deliveryTag);
+ _link.getEndpoint().updateDisposition(_deliveryTag, (DeliveryState)outcome, true);
+ _link.getEndpoint().sendFlowConditional();
+ }
+
+ public void onRollback()
+ {
+ if(Boolean.TRUE.equals(settled))
+ {
+ final Modified modified = new Modified();
+ modified.setDeliveryFailed(true);
+ _link.getEndpoint().updateDisposition(_deliveryTag, modified, true);
+ _link.getEndpoint().sendFlowConditional();
+ }
+ }
+ });
+ }
+ else if(outcome instanceof Released)
+ {
+ txn.addPostTransactionAction(new ServerTransaction.Action()
+ {
+ public void postCommit()
+ {
+
+ _queueEntry.release();
+ _link.getEndpoint().settle(_deliveryTag);
+ }
+
+ public void onRollback()
+ {
+ _link.getEndpoint().settle(_deliveryTag);
+ }
+ });
+ }
+
+ else if(outcome instanceof Modified)
+ {
+ txn.addPostTransactionAction(new ServerTransaction.Action()
+ {
+ public void postCommit()
+ {
+
+ _queueEntry.release();
+ if(Boolean.TRUE.equals(((Modified)outcome).getDeliveryFailed()))
+ {
+ _queueEntry.incrementDeliveryCount();
+ }
+ _link.getEndpoint().settle(_deliveryTag);
+ }
+
+ public void onRollback()
+ {
+ if(Boolean.TRUE.equals(settled))
+ {
+ final Modified modified = new Modified();
+ modified.setDeliveryFailed(true);
+ _link.getEndpoint().updateDisposition(_deliveryTag, modified, true);
+ _link.getEndpoint().sendFlowConditional();
+ }
+ }
+ });
+ }
+
+ return (transactionId == null && outcome != null);
+ }
+ }
+
+ private class DoNothingAction implements UnsettledAction
+ {
+ public DoNothingAction(final Binary tag,
+ final QueueEntry queueEntry)
+ {
+ }
+
+ public boolean process(final DeliveryState state, final Boolean settled)
+ {
+ Binary transactionId = null;
+ Outcome outcome = null;
+ // If disposition is settled this overrides the txn?
+ if(state instanceof TransactionalState)
+ {
+ transactionId = ((TransactionalState)state).getTxnId();
+ outcome = ((TransactionalState)state).getOutcome();
+ }
+ else if (state instanceof Outcome)
+ {
+ outcome = (Outcome) state;
+ }
+ return true;
+ }
+ }
+
+ public FilterManager getFilters()
+ {
+ return _filters;
+ }
+
+ public void setFilters(final FilterManager filters)
+ {
+ _filters = filters;
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/TxnCoordinatorLink_1_0.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/TxnCoordinatorLink_1_0.java
new file mode 100644
index 0000000000..a05d14816a
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/TxnCoordinatorLink_1_0.java
@@ -0,0 +1,195 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoder;
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoderImpl;
+import org.apache.qpid.amqp_1_0.transport.LinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkListener;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.transaction.Declare;
+import org.apache.qpid.amqp_1_0.type.transaction.Declared;
+import org.apache.qpid.amqp_1_0.type.transaction.Discharge;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.server.txn.LocalTransaction;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+
+import java.nio.ByteBuffer;
+import java.util.*;
+
+public class TxnCoordinatorLink_1_0 implements ReceivingLinkListener, Link_1_0
+{
+ private VirtualHost _vhost;
+ private ReceivingLinkEndpoint _endpoint;
+
+ private ArrayList<Transfer> _incompleteMessage;
+ private SectionDecoder _sectionDecoder;
+ private LinkedHashMap<Integer, ServerTransaction> _openTransactions;
+ private Session_1_0 _session;
+
+
+ public TxnCoordinatorLink_1_0(VirtualHost vhost,
+ Session_1_0 session_1_0, ReceivingLinkEndpoint endpoint,
+ LinkedHashMap<Integer, ServerTransaction> openTransactions)
+ {
+ _vhost = vhost;
+ _session = session_1_0;
+ _endpoint = endpoint;
+ _sectionDecoder = new SectionDecoderImpl(endpoint.getSession().getConnection().getDescribedTypeRegistry());
+ _openTransactions = openTransactions;
+ }
+
+ public void messageTransfer(Transfer xfr)
+ {
+ // TODO - cope with fragmented messages
+
+ ByteBuffer payload = null;
+
+
+ if(Boolean.TRUE.equals(xfr.getMore()) && _incompleteMessage == null)
+ {
+ _incompleteMessage = new ArrayList<Transfer>();
+ _incompleteMessage.add(xfr);
+ return;
+ }
+ else if(_incompleteMessage != null)
+ {
+ _incompleteMessage.add(xfr);
+ if(Boolean.TRUE.equals(xfr.getMore()))
+ {
+ return;
+ }
+
+ int size = 0;
+ for(Transfer t : _incompleteMessage)
+ {
+ size += t.getPayload().limit();
+ }
+ payload = ByteBuffer.allocate(size);
+ for(Transfer t : _incompleteMessage)
+ {
+ payload.put(t.getPayload().duplicate());
+ }
+ payload.flip();
+ _incompleteMessage=null;
+
+ }
+ else
+ {
+ payload = xfr.getPayload();
+ }
+
+
+ // Only interested int he amqp-value section that holds the message to the co-ordinator
+ try
+ {
+ List<Section> sections = _sectionDecoder.parseAll(payload);
+
+ for(Section section : sections)
+ {
+ if(section instanceof AmqpValue)
+ {
+ Object command = ((AmqpValue) section).getValue();
+
+ if(command instanceof Declare)
+ {
+ Integer txnId = Integer.valueOf(0);
+ Iterator<Integer> existingTxn = _openTransactions.keySet().iterator();
+ while(existingTxn.hasNext())
+ {
+ txnId = existingTxn.next();
+ }
+ txnId = Integer.valueOf(txnId.intValue() + 1);
+
+ _openTransactions.put(txnId, new LocalTransaction(_vhost.getMessageStore()));
+
+ Declared state = new Declared();
+
+
+
+ state.setTxnId(_session.integerToBinary(txnId));
+ _endpoint.updateDisposition(xfr.getDeliveryTag(), state, true);
+
+ }
+ else if(command instanceof Discharge)
+ {
+ Discharge discharge = (Discharge) command;
+
+ DeliveryState state = xfr.getState();
+ discharge(_session.binaryToInteger(discharge.getTxnId()), discharge.getFail());
+ _endpoint.updateDisposition(xfr.getDeliveryTag(), new Accepted(), true);
+
+ }
+ }
+ }
+
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+
+ }
+
+ public void remoteDetached(LinkEndpoint endpoint, Detach detach)
+ {
+ //TODO
+ endpoint.detach();
+ }
+
+ private Error discharge(Integer transactionId, boolean fail)
+ {
+ Error error = null;
+ ServerTransaction txn = _openTransactions.get(transactionId);
+ if(txn != null)
+ {
+ if(fail)
+ {
+ txn.rollback();
+ }
+ else
+ {
+ txn.commit();
+ }
+ _openTransactions.remove(transactionId);
+ }
+ else
+ {
+ error = new Error();
+ error.setCondition(AmqpError.NOT_FOUND);
+ error.setDescription("Unkown transactionId" + transactionId);
+ }
+ return error;
+ }
+
+
+
+ public void start()
+ {
+ _endpoint.setLinkCredit(UnsignedInteger.ONE);
+ _endpoint.setCreditWindow();
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/UnsettledAction.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/UnsettledAction.java
new file mode 100644
index 0000000000..c497cc5146
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/UnsettledAction.java
@@ -0,0 +1,8 @@
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+
+public interface UnsettledAction
+{
+ boolean process(DeliveryState state, Boolean settled);
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/AMQPriorityQueue.java b/java/broker/src/main/java/org/apache/qpid/server/queue/AMQPriorityQueue.java
index f6bf6626a0..46c2a635b7 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/AMQPriorityQueue.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/AMQPriorityQueue.java
@@ -23,19 +23,20 @@ package org.apache.qpid.server.queue;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Map;
+import java.util.UUID;
public class AMQPriorityQueue extends OutOfOrderQueue
{
- protected AMQPriorityQueue(final String name,
+ protected AMQPriorityQueue(UUID id,
+ final String name,
final boolean durable,
final String owner,
final boolean autoDelete,
boolean exclusive,
final VirtualHost virtualHost,
- Map<String, Object> arguments,
- int priorities)
+ Map<String, Object> arguments, int priorities)
{
- super(name, durable, owner, autoDelete, exclusive, virtualHost, new PriorityQueueList.Factory(priorities), arguments);
+ super(id, name, durable, owner, autoDelete, exclusive, virtualHost, new PriorityQueueList.Factory(priorities), arguments);
}
public int getPriorities()
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueue.java b/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueue.java
index a3da598bdf..e643338c3d 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueue.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueue.java
@@ -34,7 +34,6 @@ import org.apache.qpid.server.protocol.AMQSessionModel;
import org.apache.qpid.server.security.AuthorizationHolder;
import org.apache.qpid.server.store.TransactionLogResource;
import org.apache.qpid.server.subscription.Subscription;
-import org.apache.qpid.server.txn.ServerTransaction;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.List;
@@ -141,10 +140,9 @@ public interface AMQQueue extends Managable, Comparable<AMQQueue>, ExchangeRefer
public List<QueueEntry> getMessagesRangeOnTheQueue(final long fromPosition, final long toPosition);
- void moveMessagesToAnotherQueue(long fromMessageId, long toMessageId, String queueName,
- ServerTransaction transaction);
+ void moveMessagesToAnotherQueue(long fromMessageId, long toMessageId, String queueName);
- void copyMessagesToAnotherQueue(long fromMessageId, long toMessageId, String queueName, ServerTransaction transaction);
+ void copyMessagesToAnotherQueue(long fromMessageId, long toMessageId, String queueName);
void removeMessagesFromQueue(long fromMessageId, long toMessageId);
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java b/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java
index aca5891d2e..f2b7d7c56b 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java
@@ -20,6 +20,10 @@
*/
package org.apache.qpid.server.queue;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
import org.apache.qpid.AMQException;
import org.apache.qpid.AMQSecurityException;
import org.apache.qpid.exchange.ExchangeDefaults;
@@ -30,12 +34,10 @@ import org.apache.qpid.server.configuration.ServerConfiguration;
import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.exchange.ExchangeFactory;
import org.apache.qpid.server.exchange.ExchangeRegistry;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.virtualhost.VirtualHost;
-import java.util.HashMap;
-import java.util.Map;
-
public class AMQQueueFactory
{
public static final String X_QPID_PRIORITIES = "x-qpid-priorities";
@@ -166,8 +168,13 @@ public class AMQQueueFactory
}
};
-
- /** @see #createAMQQueueImpl(String, boolean, String, boolean, boolean, VirtualHost, Map) */
+ /**
+ * Creates a new queue with a random id.
+ *
+ * @see #createAMQQueueImpl(UUID, String, boolean, String, boolean, boolean, VirtualHost, Map)
+ * @deprecated because only called from unit tests
+ * */
+ @Deprecated
public static AMQQueue createAMQQueueImpl(AMQShortString name,
boolean durable,
AMQShortString owner,
@@ -175,22 +182,28 @@ public class AMQQueueFactory
boolean exclusive,
VirtualHost virtualHost, final FieldTable arguments) throws AMQException
{
- return createAMQQueueImpl(name == null ? null : name.toString(),
+ return createAMQQueueImpl(UUIDGenerator.generateUUID(),
+ name == null ? null : name.toString(),
durable,
owner == null ? null : owner.toString(),
autoDelete,
- exclusive,
- virtualHost, FieldTable.convertToMap(arguments));
+ exclusive, virtualHost, FieldTable.convertToMap(arguments));
}
-
- public static AMQQueue createAMQQueueImpl(String queueName,
+ /**
+ * @param id the id to use. If default then one is generated from queueName. TODO check correctness of calls that pass a null value.
+ */
+ public static AMQQueue createAMQQueueImpl(UUID id,
+ String queueName,
boolean durable,
String owner,
boolean autoDelete,
- boolean exclusive,
- VirtualHost virtualHost, Map<String, Object> arguments) throws AMQSecurityException, AMQException
+ boolean exclusive, VirtualHost virtualHost, Map<String, Object> arguments) throws AMQSecurityException, AMQException
{
+ if (id == null)
+ {
+ throw new IllegalArgumentException("Queue id must not be null");
+ }
if (queueName == null)
{
throw new IllegalArgumentException("Queue name must not be null");
@@ -241,19 +254,19 @@ public class AMQQueueFactory
AMQQueue q;
if(sortingKey != null)
{
- q = new SortedQueue(queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments, sortingKey);
+ q = new SortedQueue(id, queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments, sortingKey);
}
else if(conflationKey != null)
{
- q = new ConflationQueue(queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments, conflationKey);
+ q = new ConflationQueue(id, queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments, conflationKey);
}
else if(priorities > 1)
{
- q = new AMQPriorityQueue(queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments, priorities);
+ q = new AMQPriorityQueue(id, queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments, priorities);
}
else
{
- q = new SimpleAMQQueue(queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments);
+ q = new SimpleAMQQueue(id, queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments);
}
//Register the new queue
@@ -287,12 +300,12 @@ public class AMQQueueFactory
if(dlExchange == null)
{
- dlExchange = exchangeFactory.createExchange(new AMQShortString(dlExchangeName), ExchangeDefaults.FANOUT_EXCHANGE_CLASS, true, false, 0);
+ dlExchange = exchangeFactory.createExchange(UUIDGenerator.generateUUID(dlExchangeName, virtualHost.getName()), new AMQShortString(dlExchangeName), ExchangeDefaults.FANOUT_EXCHANGE_CLASS, true, false, 0);
exchangeRegistry.registerExchange(dlExchange);
//enter the dle in the persistent store
- virtualHost.getDurableConfigurationStore().createExchange(dlExchange);
+ virtualHost.getMessageStore().createExchange(dlExchange);
}
}
@@ -309,10 +322,10 @@ public class AMQQueueFactory
args.put(X_QPID_DLQ_ENABLED, false);
args.put(X_QPID_MAXIMUM_DELIVERY_COUNT, 0);
- dlQueue = createAMQQueueImpl(dlQueueName, true, owner, false, exclusive, virtualHost, args);
+ dlQueue = createAMQQueueImpl(UUIDGenerator.generateUUID(dlQueueName, virtualHost.getName()), dlQueueName, true, owner, false, exclusive, virtualHost, args);
//enter the dlq in the persistent store
- virtualHost.getDurableConfigurationStore().createQueue(dlQueue, FieldTable.convertToFieldTable(args));
+ virtualHost.getMessageStore().createQueue(dlQueue, FieldTable.convertToFieldTable(args));
}
}
@@ -364,7 +377,10 @@ public class AMQQueueFactory
arguments.put(X_QPID_DLQ_ENABLED, true);
}
- AMQQueue q = createAMQQueueImpl(queueName, durable, owner, autodelete, exclusive, host, arguments);
+ // we need queues that are defined in config to have deterministic ids.
+ UUID id = UUIDGenerator.generateUUID(queueName, host.getName());
+
+ AMQQueue q = createAMQQueueImpl(id, queueName, durable, owner, autodelete, exclusive, host, arguments);
q.configure(config);
return q;
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueMBean.java b/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueMBean.java
index 7c59097965..b0d4cb3486 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueMBean.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueMBean.java
@@ -36,8 +36,6 @@ import org.apache.qpid.server.message.AMQMessage;
import org.apache.qpid.server.message.AMQMessageHeader;
import org.apache.qpid.server.message.MessageTransferMessage;
import org.apache.qpid.server.message.ServerMessage;
-import org.apache.qpid.server.txn.LocalTransaction;
-import org.apache.qpid.server.txn.ServerTransaction;
import org.apache.qpid.transport.MessageProperties;
import javax.management.JMException;
@@ -613,9 +611,7 @@ public class AMQQueueMBean extends AMQManagedObject implements ManagedQueue, Que
throw new OperationsException("\"From MessageId\" should be greater than 0 and less than \"To MessageId\"");
}
- ServerTransaction txn = new LocalTransaction(_queue.getVirtualHost().getMessageStore());
- _queue.moveMessagesToAnotherQueue(fromMessageId, toMessageId, toQueueName, txn);
- txn.commit();
+ _queue.moveMessagesToAnotherQueue(fromMessageId, toMessageId, toQueueName);
}
/**
@@ -648,11 +644,7 @@ public class AMQQueueMBean extends AMQManagedObject implements ManagedQueue, Que
throw new OperationsException("\"From MessageId\" should be greater than 0 and less than \"To MessageId\"");
}
- ServerTransaction txn = new LocalTransaction(_queue.getVirtualHost().getMessageStore());
-
- _queue.copyMessagesToAnotherQueue(fromMessageId, toMessageId, toQueueName, txn);
-
- txn.commit();
+ _queue.copyMessagesToAnotherQueue(fromMessageId, toMessageId, toQueueName);
}
/**
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueue.java b/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueue.java
index 2c645cc555..c2813bb7a5 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueue.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueue.java
@@ -21,22 +21,23 @@
package org.apache.qpid.server.queue;
-import org.apache.qpid.server.virtualhost.VirtualHost;
-
import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.server.virtualhost.VirtualHost;
public class ConflationQueue extends SimpleAMQQueue
{
- protected ConflationQueue(String name,
+ protected ConflationQueue(UUID id,
+ String name,
boolean durable,
String owner,
boolean autoDelete,
boolean exclusive,
VirtualHost virtualHost,
- Map<String, Object> args,
- String conflationKey)
+ Map<String, Object> args, String conflationKey)
{
- super(name, durable, owner, autoDelete, exclusive, virtualHost, new ConflationQueueList.Factory(conflationKey), args);
+ super(id, name, durable, owner, autoDelete, exclusive, virtualHost, new ConflationQueueList.Factory(conflationKey), args);
}
public String getConflationKey()
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/DefaultQueueRegistry.java b/java/broker/src/main/java/org/apache/qpid/server/queue/DefaultQueueRegistry.java
index d76487073d..2493974d45 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/DefaultQueueRegistry.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/DefaultQueueRegistry.java
@@ -20,15 +20,21 @@
*/
package org.apache.qpid.server.queue;
+import org.apache.log4j.Logger;
+import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.server.exchange.DefaultExchangeRegistry;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Collection;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class DefaultQueueRegistry implements QueueRegistry
{
+ private static final Logger LOGGER = Logger.getLogger(DefaultExchangeRegistry.class);
+
private ConcurrentMap<AMQShortString, AMQQueue> _queueMap = new ConcurrentHashMap<AMQShortString, AMQQueue>();
private final VirtualHost _virtualHost;
@@ -72,4 +78,36 @@ public class DefaultQueueRegistry implements QueueRegistry
{
return getQueue(new AMQShortString(queue));
}
+
+ @Override
+ public void stopAllAndUnregisterMBeans()
+ {
+ for (final AMQQueue queue : getQueues())
+ {
+ queue.stop();
+ try
+ {
+ queue.getManagedObject().unregister();
+ }
+ catch (AMQException e)
+ {
+ LOGGER.warn("Failed to unregister mbean", e);
+ }
+ }
+ _queueMap.clear();
+ }
+
+ @Override
+ public synchronized AMQQueue getQueue(UUID queueId)
+ {
+ Collection<AMQQueue> queues = _queueMap.values();
+ for (AMQQueue queue : queues)
+ {
+ if (queue.getId().equals(queueId))
+ {
+ return queue;
+ }
+ }
+ return null;
+ }
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/IncomingMessage.java b/java/broker/src/main/java/org/apache/qpid/server/queue/IncomingMessage.java
index 0162f1b738..c5a610c7b6 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/IncomingMessage.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/IncomingMessage.java
@@ -70,8 +70,6 @@ public class IncomingMessage implements Filterable, InboundMessage, EnqueableMes
private Exchange _exchange;
-
- private int _receivedChunkCount = 0;
private List<ContentChunk> _contentChunks = new ArrayList<ContentChunk>();
// we keep both the original meta data object and the store reference to it just in case the
@@ -80,13 +78,20 @@ public class IncomingMessage implements Filterable, InboundMessage, EnqueableMes
private MessageMetaData _messageMetaData;
private StoredMessage<MessageMetaData> _storedMessageHandle;
+ private Object _connectionReference;
public IncomingMessage(
final MessagePublishInfo info
)
{
+ this(info, null);
+ }
+
+ public IncomingMessage(MessagePublishInfo info, Object reference)
+ {
_messagePublishInfo = info;
+ _connectionReference = reference;
}
public void setContentHeaderBody(final ContentHeaderBody contentHeaderBody) throws AMQException
@@ -125,12 +130,6 @@ public class IncomingMessage implements Filterable, InboundMessage, EnqueableMes
}
- public MessageMetaData headersReceived()
- {
-
- return headersReceived(System.currentTimeMillis());
- }
-
public MessageMetaData headersReceived(long currentTime)
{
_messageMetaData = new MessageMetaData(_messagePublishInfo, _contentHeaderBody, 0, currentTime);
@@ -143,16 +142,10 @@ public class IncomingMessage implements Filterable, InboundMessage, EnqueableMes
return _destinationQueues;
}
- public int addContentBodyFrame(final ContentChunk contentChunk)
- throws AMQException
+ public void addContentBodyFrame(final ContentChunk contentChunk) throws AMQException
{
- _storedMessageHandle.addContent((int)_bodyLengthReceived, ByteBuffer.wrap(contentChunk.getData()));
_bodyLengthReceived += contentChunk.getSize();
_contentChunks.add(contentChunk);
-
-
-
- return _receivedChunkCount++;
}
public boolean allContentReceived()
@@ -252,18 +245,12 @@ public class IncomingMessage implements Filterable, InboundMessage, EnqueableMes
return _expiration;
}
- public int getReceivedChunkCount()
- {
- return _receivedChunkCount;
- }
-
-
public int getBodyCount() throws AMQException
{
return _contentChunks.size();
}
- public ContentChunk getContentChunk(int index) throws IllegalArgumentException, AMQException
+ public ContentChunk getContentChunk(int index)
{
return _contentChunks.get(index);
}
@@ -318,4 +305,14 @@ public class IncomingMessage implements Filterable, InboundMessage, EnqueableMes
{
return _storedMessageHandle;
}
+
+ public Object getConnectionReference()
+ {
+ return _connectionReference;
+ }
+
+ public MessageMetaData getMessageMetaData()
+ {
+ return _messageMetaData;
+ }
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/OutOfOrderQueue.java b/java/broker/src/main/java/org/apache/qpid/server/queue/OutOfOrderQueue.java
index 53121fc031..daa5db393a 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/OutOfOrderQueue.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/OutOfOrderQueue.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.server.queue;
import org.apache.qpid.server.subscription.Subscription;
@@ -5,15 +25,16 @@ import org.apache.qpid.server.subscription.SubscriptionList;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Map;
+import java.util.UUID;
public abstract class OutOfOrderQueue extends SimpleAMQQueue
{
- protected OutOfOrderQueue(String name, boolean durable, String owner,
- boolean autoDelete, boolean exclusive, VirtualHost virtualHost,
- QueueEntryListFactory entryListFactory, Map<String, Object> arguments)
+ protected OutOfOrderQueue(UUID id, String name, boolean durable,
+ String owner, boolean autoDelete, boolean exclusive,
+ VirtualHost virtualHost, QueueEntryListFactory entryListFactory, Map<String, Object> arguments)
{
- super(name, durable, owner, autoDelete, exclusive, virtualHost, entryListFactory, arguments);
+ super(id, name, durable, owner, autoDelete, exclusive, virtualHost, entryListFactory, arguments);
}
@Override
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/PriorityQueueList.java b/java/broker/src/main/java/org/apache/qpid/server/queue/PriorityQueueList.java
index 05141a48a1..1d13ee66c0 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/PriorityQueueList.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/PriorityQueueList.java
@@ -25,19 +25,19 @@ import org.apache.qpid.server.message.ServerMessage;
public class PriorityQueueList implements QueueEntryList<SimpleQueueEntryImpl>
{
private final AMQQueue _queue;
- private final SimpleQueueEntryList[] _priorityLists;
+ private final PriorityQueueEntrySubList[] _priorityLists;
private final int _priorities;
private final int _priorityOffset;
public PriorityQueueList(AMQQueue queue, int priorities)
{
_queue = queue;
- _priorityLists = new SimpleQueueEntryList[priorities];
+ _priorityLists = new PriorityQueueEntrySubList[priorities];
_priorities = priorities;
_priorityOffset = 5-((priorities + 1)/2);
for(int i = 0; i < priorities; i++)
{
- _priorityLists[i] = new SimpleQueueEntryList(queue);
+ _priorityLists[i] = new PriorityQueueEntrySubList(queue);
}
}
@@ -161,4 +161,48 @@ public class PriorityQueueList implements QueueEntryList<SimpleQueueEntryImpl>
return new PriorityQueueList(queue, _priorities);
}
}
+
+ private static class PriorityQueueEntrySubList extends SimpleQueueEntryList
+ {
+ public PriorityQueueEntrySubList(AMQQueue queue)
+ {
+ super(queue);
+ }
+
+ @Override
+ protected PriorityQueueEntryImpl createQueueEntry(ServerMessage<?> message)
+ {
+ return new PriorityQueueEntryImpl(this, message);
+ }
+ }
+
+ private static class PriorityQueueEntryImpl extends SimpleQueueEntryImpl
+ {
+ public PriorityQueueEntryImpl(PriorityQueueEntrySubList queueEntryList, ServerMessage<?> message)
+ {
+ super(queueEntryList, message);
+ }
+
+ @Override
+ public int compareTo(final QueueEntry o)
+ {
+ byte thisPriority = getMessageHeader().getPriority();
+ byte otherPriority = o.getMessageHeader().getPriority();
+
+ if(thisPriority != otherPriority)
+ {
+ /*
+ * Different priorities, so answer can only be greater than or less than
+ *
+ * A message with higher priority (e.g. 5) is conceptually 'earlier' in the
+ * priority queue than one with a lower priority (e.g. 4).
+ */
+ return thisPriority > otherPriority ? -1 : 1;
+ }
+ else
+ {
+ return super.compareTo(o);
+ }
+ }
+ }
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/QueueContext.java b/java/broker/src/main/java/org/apache/qpid/server/queue/QueueContext.java
index c8f04c7b96..79279b44c7 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/QueueContext.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/QueueContext.java
@@ -52,4 +52,13 @@ final class QueueContext implements AMQQueue.Context
{
return _releasedEntry;
}
+
+ @Override
+ public String toString()
+ {
+ return "QueueContext{" +
+ "_lastSeenEntry=" + _lastSeenEntry +
+ ", _releasedEntry=" + _releasedEntry +
+ '}';
+ }
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java b/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java
index fea5303e23..209553e8fa 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java
@@ -227,9 +227,10 @@ public abstract class QueueEntryImpl implements QueueEntry
public void release()
{
EntryState state = _state;
-
+
if((state.getState() == State.ACQUIRED) &&_stateUpdater.compareAndSet(this, state, AVAILABLE_STATE))
{
+
if(state instanceof SubscriptionAcquiredState)
{
getQueue().decrementUnackedMsgCount();
@@ -254,6 +255,7 @@ public abstract class QueueEntryImpl implements QueueEntry
routeToAlternate();
}
}
+
}
public boolean releaseButRetain()
@@ -267,7 +269,6 @@ public abstract class QueueEntryImpl implements QueueEntry
Subscription sub = ((SubscriptionAcquiredState) state).getSubscription();
if(_stateUpdater.compareAndSet(this, state, sub.getAssignedState()))
{
- System.err.println("Message released (and retained)" + getMessage().getMessageNumber());
getQueue().requeue(this);
if(_stateChangeListeners != null)
{
@@ -417,11 +418,19 @@ public abstract class QueueEntryImpl implements QueueEntry
if (alternateExchange != null)
{
- final List<? extends BaseQueue> rerouteQueues = alternateExchange.route(new InboundMessageAdapter(this));
+ InboundMessageAdapter inboundMessageAdapter = new InboundMessageAdapter(this);
+ List<? extends BaseQueue> queues = alternateExchange.route(inboundMessageAdapter);
final ServerMessage message = getMessage();
- if (rerouteQueues != null && rerouteQueues.size() != 0)
+ if ((queues == null || queues.size() == 0) && alternateExchange.getAlternateExchange() != null)
{
+ queues = alternateExchange.getAlternateExchange().route(inboundMessageAdapter);
+ }
+
+
+ if (queues != null && queues.size() != 0)
+ {
+ final List<? extends BaseQueue> rerouteQueues = queues;
ServerTransaction txn = new LocalTransaction(getQueue().getVirtualHost().getMessageStore());
txn.enqueue(rerouteQueues, message, new ServerTransaction.Action()
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryVisitor.java b/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryVisitor.java
new file mode 100644
index 0000000000..1578d21321
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryVisitor.java
@@ -0,0 +1,22 @@
+package org.apache.qpid.server.queue;
+
+/**
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+* <p/>
+* http://www.apache.org/licenses/LICENSE-2.0
+* <p/>
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+public interface QueueEntryVisitor
+{
+ boolean visit(QueueEntry entry);
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/QueueRegistry.java b/java/broker/src/main/java/org/apache/qpid/server/queue/QueueRegistry.java
index 80f6bd1493..72a54c9889 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/QueueRegistry.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/QueueRegistry.java
@@ -24,6 +24,7 @@ import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Collection;
+import java.util.UUID;
public interface QueueRegistry
{
@@ -40,4 +41,8 @@ public interface QueueRegistry
Collection<AMQQueue> getQueues();
AMQQueue getQueue(String queue);
+
+ void stopAllAndUnregisterMBeans();
+
+ AMQQueue getQueue(UUID queueId);
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleAMQQueue.java b/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleAMQQueue.java
index 891a492b7f..d7eb304c92 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleAMQQueue.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleAMQQueue.java
@@ -191,29 +191,29 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
private int _maximumDeliveryCount = ApplicationRegistry.getInstance().getConfiguration().getMaxDeliveryCount();
private final MessageGroupManager _messageGroupManager;
- protected SimpleAMQQueue(AMQShortString name, boolean durable, AMQShortString owner, boolean autoDelete, boolean exclusive, VirtualHost virtualHost, Map<String,Object> arguments)
+ protected SimpleAMQQueue(UUID id, AMQShortString name, boolean durable, AMQShortString owner, boolean autoDelete, boolean exclusive, VirtualHost virtualHost, Map<String,Object> arguments)
{
- this(name, durable, owner, autoDelete, exclusive, virtualHost,new SimpleQueueEntryList.Factory(), arguments);
+ this(id, name, durable, owner, autoDelete, exclusive,virtualHost, new SimpleQueueEntryList.Factory(), arguments);
}
- public SimpleAMQQueue(String queueName, boolean durable, String owner, boolean autoDelete, boolean exclusive, VirtualHost virtualHost, Map<String, Object> arguments)
+ public SimpleAMQQueue(UUID id, String queueName, boolean durable, String owner, boolean autoDelete, boolean exclusive, VirtualHost virtualHost, Map<String, Object> arguments)
{
- this(queueName, durable, owner, autoDelete, exclusive, virtualHost, new SimpleQueueEntryList.Factory(), arguments);
+ this(id, queueName, durable, owner, autoDelete, exclusive, virtualHost, new SimpleQueueEntryList.Factory(), arguments);
}
- public SimpleAMQQueue(String queueName, boolean durable, String owner, boolean autoDelete, boolean exclusive, VirtualHost virtualHost, QueueEntryListFactory entryListFactory, Map<String, Object> arguments)
+ public SimpleAMQQueue(UUID id, String queueName, boolean durable, String owner, boolean autoDelete, boolean exclusive, VirtualHost virtualHost, QueueEntryListFactory entryListFactory, Map<String, Object> arguments)
{
- this(queueName == null ? null : new AMQShortString(queueName), durable, owner == null ? null : new AMQShortString(owner), autoDelete, exclusive, virtualHost, entryListFactory, arguments);
+ this(id, queueName == null ? null : new AMQShortString(queueName), durable, owner == null ? null : new AMQShortString(owner), autoDelete, exclusive, virtualHost, entryListFactory, arguments);
}
- protected SimpleAMQQueue(AMQShortString name,
+ protected SimpleAMQQueue(UUID id,
+ AMQShortString name,
boolean durable,
AMQShortString owner,
boolean autoDelete,
boolean exclusive,
VirtualHost virtualHost,
- QueueEntryListFactory entryListFactory,
- Map<String,Object> arguments)
+ QueueEntryListFactory entryListFactory, Map<String,Object> arguments)
{
if (name == null)
@@ -236,7 +236,7 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
_entries = entryListFactory.createQueueEntryList(this);
_arguments = arguments;
- _id = virtualHost.getConfigStore().createId();
+ _id = id;
_asyncDelivery = ReferenceCountingExecutorService.getInstance().acquireExecutorService();
@@ -346,7 +346,7 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
if(isDurable())
{
- getVirtualHost().getDurableConfigurationStore().updateQueue(this);
+ getVirtualHost().getMessageStore().updateQueue(this);
}
}
@@ -862,7 +862,6 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
public void requeue(QueueEntry entry)
{
-
SubscriptionList.SubscriptionNodeIterator subscriberIter = _subscriptionList.iterator();
// iterate over all the subscribers, and if they are in advance of this queue entry then move them backwards
while (subscriberIter.advance() && entry.isAvailable())
@@ -1198,19 +1197,10 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
public void moveMessagesToAnotherQueue(final long fromMessageId,
final long toMessageId,
- String queueName,
- ServerTransaction txn) throws IllegalArgumentException
+ String destinationQueueName) throws IllegalArgumentException
{
- final AMQQueue toQueue = getVirtualHost().getQueueRegistry().getQueue(new AMQShortString(queueName));
- if (toQueue == null)
- {
- throw new IllegalArgumentException("Queue '" + queueName + "' is not registered with the virtualhost.");
- }
- else if (toQueue == this)
- {
- throw new IllegalArgumentException("The destination queue cant be the same as the source queue");
- }
+ final AMQQueue toQueue = getValidatedDestinationQueue(destinationQueueName);
List<QueueEntry> entries = getMessagesOnTheQueue(new QueueEntryFilter()
{
@@ -1230,65 +1220,68 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
});
-
- // Move the messages in on the message store.
- for (final QueueEntry entry : entries)
+ final ServerTransaction txn = new LocalTransaction(getVirtualHost().getMessageStore());
+ boolean shouldRollback = true;
+ try
{
- final ServerMessage message = entry.getMessage();
- txn.enqueue(toQueue, message,
- new ServerTransaction.Action()
- {
-
- public void postCommit()
+ // Move the messages in on the message store.
+ for (final QueueEntry entry : entries)
+ {
+ final ServerMessage message = entry.getMessage();
+ txn.enqueue(toQueue, message,
+ new ServerTransaction.Action()
{
- try
+
+ public void postCommit()
{
- toQueue.enqueue(message);
+ try
+ {
+ toQueue.enqueue(message);
+ }
+ catch (AMQException e)
+ {
+ throw new RuntimeException(e);
+ }
}
- catch (AMQException e)
+
+ public void onRollback()
{
- throw new RuntimeException(e);
+ entry.release();
}
- }
-
- public void onRollback()
- {
- entry.release();
- }
- });
- txn.dequeue(this, message,
- new ServerTransaction.Action()
- {
-
- public void postCommit()
+ });
+ txn.dequeue(this, message,
+ new ServerTransaction.Action()
{
- entry.discard();
- }
- public void onRollback()
- {
+ public void postCommit()
+ {
+ entry.discard();
+ }
- }
- });
+ public void onRollback()
+ {
+ }
+ });
+ }
+ txn.commit();
+ shouldRollback = false;
+ }
+ finally
+ {
+ if (shouldRollback)
+ {
+ txn.rollback();
+ }
}
}
public void copyMessagesToAnotherQueue(final long fromMessageId,
final long toMessageId,
- String queueName,
- final ServerTransaction txn) throws IllegalArgumentException
+ String destinationQueueName) throws IllegalArgumentException
{
- final AMQQueue toQueue = getVirtualHost().getQueueRegistry().getQueue(new AMQShortString(queueName));
- if (toQueue == null)
- {
- throw new IllegalArgumentException("Queue '" + queueName + "' is not registered with the virtualhost.");
- }
- else if (toQueue == this)
- {
- throw new IllegalArgumentException("The destination queue cant be the same as the source queue");
- }
+ final AMQQueue toQueue = getValidatedDestinationQueue(destinationQueueName);
List<QueueEntry> entries = getMessagesOnTheQueue(new QueueEntryFilter()
{
@@ -1306,36 +1299,63 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
}
});
-
- // Move the messages in on the message store.
- for (QueueEntry entry : entries)
+ final ServerTransaction txn = new LocalTransaction(_virtualHost.getMessageStore());
+ boolean shouldRollback = true;
+ try
{
- final ServerMessage message = entry.getMessage();
-
- txn.enqueue(toQueue, message, new ServerTransaction.Action()
+ // Copy the messages in on the message store.
+ for (QueueEntry entry : entries)
{
- public void postCommit()
+ final ServerMessage message = entry.getMessage();
+
+ txn.enqueue(toQueue, message, new ServerTransaction.Action()
{
- try
+ public void postCommit()
{
- toQueue.enqueue(message);
+ try
+ {
+ toQueue.enqueue(message);
+ }
+ catch (AMQException e)
+ {
+ throw new RuntimeException(e);
+ }
}
- catch (AMQException e)
+
+ public void onRollback()
{
- throw new RuntimeException(e);
}
- }
+ });
- public void onRollback()
- {
-
- }
- });
+ }
+ txn.commit();
+ shouldRollback = false;
+ }
+ finally
+ {
+ if (shouldRollback)
+ {
+ txn.rollback();
+ }
}
}
+ private AMQQueue getValidatedDestinationQueue(String queueName)
+ {
+ final AMQQueue toQueue = getVirtualHost().getQueueRegistry().getQueue(new AMQShortString(queueName));
+ if (toQueue == null)
+ {
+ throw new IllegalArgumentException("Queue '" + queueName + "' is not registered with the virtualhost.");
+ }
+ else if (toQueue == this)
+ {
+ throw new IllegalArgumentException("The destination queue can't be the same as the source queue");
+ }
+ return toQueue;
+ }
+
public void removeMessagesFromQueue(long fromMessageId, long toMessageId)
{
@@ -1515,10 +1535,16 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
for(final QueueEntry entry : entries)
{
adapter.setEntry(entry);
- final List<? extends BaseQueue> rerouteQueues = _alternateExchange.route(adapter);
+ List<? extends BaseQueue> queues = _alternateExchange.route(adapter);
+ if((queues == null || queues.size() == 0) && _alternateExchange.getAlternateExchange() != null)
+ {
+ queues = _alternateExchange.getAlternateExchange().route(adapter);
+ }
+
final ServerMessage message = entry.getMessage();
- if(rerouteQueues != null && rerouteQueues.size() != 0)
+ if(queues != null && queues.size() != 0)
{
+ final List<? extends BaseQueue> rerouteQueues = queues;
txn.enqueue(rerouteQueues, entry.getMessage(),
new ServerTransaction.Action()
{
@@ -1716,6 +1742,7 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
{
boolean atTail = false;
final boolean keepSendLockHeld = iterations <= SimpleAMQQueue.MAX_ASYNC_DELIVERIES;
+ boolean queueEmpty = false;
try
{
@@ -1733,12 +1760,9 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
}
atTail = attemptDelivery(sub, true);
- if (atTail && !sub.isSuspended() && sub.isAutoClose())
+ if (atTail && getNextAvailableEntry(sub) == null)
{
- unregisterSubscription(sub);
-
- sub.confirmAutoClose();
-
+ queueEmpty = true;
}
else if (!atTail)
{
@@ -1760,6 +1784,11 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
{
sub.releaseSendLock();
}
+ if(queueEmpty)
+ {
+ sub.queueEmpty();
+ }
+
sub.flushBatched();
}
@@ -1895,7 +1924,7 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
if(context != null)
{
QueueEntry releasedNode = context.getReleasedEntry();
- return releasedNode == null || releasedNode.compareTo(entry) < 0;
+ return releasedNode != null && releasedNode.compareTo(entry) < 0;
}
else
{
@@ -1982,13 +2011,9 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
if (subscriptionDone)
{
sub.flushBatched();
- //close autoClose subscriptions if we are not currently intent on continuing
- if (lastLoop && !sub.isSuspended() && sub.isAutoClose())
+ if (lastLoop && !sub.isSuspended())
{
-
- unregisterSubscription(sub);
-
- sub.confirmAutoClose();
+ sub.queueEmpty();
}
break;
}
@@ -2064,9 +2089,13 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
// Only process nodes that are not currently deleted and not dequeued
if (!node.isDispensed())
{
- // If the node has exired then aquire it
+ // If the node has exired then acquire it
if (node.expired() && node.acquire())
{
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Dequeuing expired node " + node);
+ }
// Then dequeue it.
dequeueEntry(node);
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleQueueEntryList.java b/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleQueueEntryList.java
index e57390163c..b8d8ec19f4 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleQueueEntryList.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleQueueEntryList.java
@@ -104,7 +104,7 @@ public class SimpleQueueEntryList implements QueueEntryList<SimpleQueueEntryImpl
}
}
- protected SimpleQueueEntryImpl createQueueEntry(ServerMessage message)
+ protected SimpleQueueEntryImpl createQueueEntry(ServerMessage<?> message)
{
return new SimpleQueueEntryImpl(this, message);
}
@@ -116,7 +116,6 @@ public class SimpleQueueEntryList implements QueueEntryList<SimpleQueueEntryImpl
public static class QueueEntryIteratorImpl implements QueueEntryIterator<SimpleQueueEntryImpl>
{
-
private SimpleQueueEntryImpl _lastNode;
QueueEntryIteratorImpl(SimpleQueueEntryImpl startNode)
@@ -124,10 +123,9 @@ public class SimpleQueueEntryList implements QueueEntryList<SimpleQueueEntryImpl
_lastNode = startNode;
}
-
public boolean atTail()
{
- return _lastNode.getNextNode() == null;
+ return _lastNode.getNextValidEntry() == null;
}
public SimpleQueueEntryImpl getNode()
@@ -137,28 +135,17 @@ public class SimpleQueueEntryList implements QueueEntryList<SimpleQueueEntryImpl
public boolean advance()
{
+ SimpleQueueEntryImpl nextValidNode = _lastNode.getNextValidEntry();
- if(!atTail())
+ if(nextValidNode != null)
{
- SimpleQueueEntryImpl nextNode = _lastNode.getNextNode();
- while(nextNode.isDispensed() && nextNode.getNextNode() != null)
- {
- nextNode = nextNode.getNextNode();
- }
- _lastNode = nextNode;
- return true;
-
- }
- else
- {
- return false;
+ _lastNode = nextValidNode;
}
+ return nextValidNode != null;
}
-
}
-
public QueueEntryIteratorImpl iterator()
{
return new QueueEntryIteratorImpl(_head);
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java b/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java
index 446f57b142..b3566df0c4 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java
@@ -24,6 +24,7 @@ import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Map;
+import java.util.UUID;
public class SortedQueue extends OutOfOrderQueue
{
@@ -33,12 +34,12 @@ public class SortedQueue extends OutOfOrderQueue
private final Object _sortedQueueLock = new Object();
private final String _sortedPropertyName;
- protected SortedQueue(final String name, final boolean durable,
- final String owner, final boolean autoDelete, final boolean exclusive,
- final VirtualHost virtualHost, Map<String, Object> arguments, String sortedPropertyName)
+ protected SortedQueue(UUID id, final String name,
+ final boolean durable, final String owner, final boolean autoDelete,
+ final boolean exclusive, final VirtualHost virtualHost, Map<String, Object> arguments, String sortedPropertyName)
{
- super(name, durable, owner, autoDelete, exclusive, virtualHost,
- new SortedQueueEntryListFactory(sortedPropertyName), arguments);
+ super(id, name, durable, owner, autoDelete, exclusive,
+ virtualHost, new SortedQueueEntryListFactory(sortedPropertyName), arguments);
this._sortedPropertyName = sortedPropertyName;
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java b/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
index 224d694932..4ed28b965d 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
@@ -186,19 +186,6 @@ public abstract class ApplicationRegistry implements IApplicationRegistry
_qmfService = qmfService;
}
- static
- {
- Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownService()));
- }
-
- private static class ShutdownService implements Runnable
- {
- public void run()
- {
- remove();
- }
- }
-
public static void initialise(IApplicationRegistry instance) throws Exception
{
if(instance == null)
@@ -273,7 +260,6 @@ public abstract class ApplicationRegistry implements IApplicationRegistry
_logger.info("Shutting down ApplicationRegistry(" + instance + ")");
}
instance.close();
- instance.getBroker().getSystem().removeBroker(instance.getBroker());
}
}
catch (Exception e)
@@ -536,35 +522,49 @@ public abstract class ApplicationRegistry implements IApplicationRegistry
}
}
-
public void close()
{
if (_logger.isInfoEnabled())
{
_logger.info("Shutting down ApplicationRegistry:" + this);
}
-
- //Stop Statistics Reporting
- if (_reportingTimer != null)
+
+ //Set the Actor for Broker Shutdown
+ CurrentActor.set(new BrokerActor(getRootMessageLogger()));
+ try
{
- _reportingTimer.cancel();
- }
+ //Stop Statistics Reporting
+ if (_reportingTimer != null)
+ {
+ _reportingTimer.cancel();
+ }
+
+ //Stop incoming connections
+ unbind();
- //Stop incoming connections
- unbind();
+ //Shutdown virtualhosts
+ close(_virtualHostRegistry);
- //Shutdown virtualhosts
- close(_virtualHostRegistry);
+ close(_authenticationManager);
- close(_authenticationManager);
+ close(_qmfService);
- close(_qmfService);
+ close(_pluginManager);
- close(_pluginManager);
+ close(_managedObjectRegistry);
- close(_managedObjectRegistry);
+ BrokerConfig broker = getBroker();
+ if(broker != null)
+ {
+ broker.getSystem().removeBroker(broker);
+ }
- CurrentActor.get().message(BrokerMessages.STOPPED());
+ CurrentActor.get().message(BrokerMessages.STOPPED());
+ }
+ finally
+ {
+ CurrentActor.remove();
+ }
}
private void unbind()
@@ -664,7 +664,7 @@ public abstract class ApplicationRegistry implements IApplicationRegistry
public VirtualHost createVirtualHost(final VirtualHostConfiguration vhostConfig) throws Exception
{
- VirtualHostImpl virtualHost = new VirtualHostImpl(this, vhostConfig, null);
+ VirtualHostImpl virtualHost = new VirtualHostImpl(this, vhostConfig);
_virtualHostRegistry.registerVirtualHost(virtualHost);
getBroker().addVirtualHost(virtualHost);
return virtualHost;
diff --git a/java/broker/src/main/java/org/apache/qpid/server/registry/BrokerConfigAdapter.java b/java/broker/src/main/java/org/apache/qpid/server/registry/BrokerConfigAdapter.java
index 58fdc99dd3..db436b99e8 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/registry/BrokerConfigAdapter.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/registry/BrokerConfigAdapter.java
@@ -114,7 +114,6 @@ public class BrokerConfigAdapter implements BrokerConfig
public void addVirtualHost(final VirtualHostConfig virtualHost)
{
- virtualHost.setBroker(this);
_vhosts.put(virtualHost.getId(), virtualHost);
getConfigStore().addConfiguredObject(virtualHost);
diff --git a/java/broker/src/main/java/org/apache/qpid/server/registry/ConfigurationFileApplicationRegistry.java b/java/broker/src/main/java/org/apache/qpid/server/registry/ConfigurationFileApplicationRegistry.java
index e9ba2764e5..b28e3d6c89 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/registry/ConfigurationFileApplicationRegistry.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/registry/ConfigurationFileApplicationRegistry.java
@@ -25,8 +25,6 @@ import org.osgi.framework.BundleContext;
import org.apache.qpid.AMQException;
import org.apache.qpid.server.configuration.ServerConfiguration;
-import org.apache.qpid.server.logging.actors.BrokerActor;
-import org.apache.qpid.server.logging.actors.CurrentActor;
import org.apache.qpid.server.management.JMXManagedObjectRegistry;
import org.apache.qpid.server.management.NoopManagedObjectRegistry;
@@ -45,22 +43,6 @@ public class ConfigurationFileApplicationRegistry extends ApplicationRegistry
}
@Override
- public void close()
- {
- //Set the Actor for Broker Shutdown
- CurrentActor.set(new BrokerActor(getRootMessageLogger()));
- try
- {
- super.close();
- }
- finally
- {
- CurrentActor.remove();
- }
- }
-
-
- @Override
protected void initialiseManagedObjectRegistry() throws AMQException
{
if (getConfiguration().getManagementEnabled())
diff --git a/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationManager.java b/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationManager.java
index 4ffa5a4bc2..6c1a917d5b 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationManager.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationManager.java
@@ -24,6 +24,7 @@ import org.apache.qpid.common.Closeable;
import org.apache.qpid.server.plugins.Plugin;
import org.apache.qpid.server.security.auth.AuthenticationResult;
+import javax.security.auth.callback.CallbackHandler;
import javax.security.sasl.SaslException;
import javax.security.sasl.SaslServer;
@@ -88,4 +89,6 @@ public interface AuthenticationManager extends Closeable, Plugin
* @return authentication result
*/
AuthenticationResult authenticate(String username, String password);
+
+ CallbackHandler getHandler(String mechanism);
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/PrincipalDatabaseAuthenticationManager.java b/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/PrincipalDatabaseAuthenticationManager.java
index 3fa0de2af0..b5d70d9200 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/PrincipalDatabaseAuthenticationManager.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/PrincipalDatabaseAuthenticationManager.java
@@ -300,6 +300,11 @@ public class PrincipalDatabaseAuthenticationManager implements AuthenticationMan
}
}
+ public CallbackHandler getHandler(String mechanism)
+ {
+ return _callbackHandlerMap.get(mechanism);
+ }
+
/**
* @see org.apache.qpid.server.security.auth.manager.AuthenticationManager#authenticate(String, String)
*/
diff --git a/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/anonymous/AnonymousSaslServerFactory.java b/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/anonymous/AnonymousSaslServerFactory.java
index 3664568b75..4650234972 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/anonymous/AnonymousSaslServerFactory.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/anonymous/AnonymousSaslServerFactory.java
@@ -58,4 +58,4 @@ public class AnonymousSaslServerFactory implements SaslServerFactory
return new String[]{AnonymousSaslServer.MECHANISM};
}
}
-} \ No newline at end of file
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/plain/PlainSaslServer.java b/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/plain/PlainSaslServer.java
index c1f306dce9..a811806c00 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/plain/PlainSaslServer.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/plain/PlainSaslServer.java
@@ -51,56 +51,65 @@ public class PlainSaslServer implements SaslServer
public byte[] evaluateResponse(byte[] response) throws SaslException
{
- try
+ int authzidNullPosition = findNullPosition(response, 0);
+ if (authzidNullPosition < 0)
{
- int authzidNullPosition = findNullPosition(response, 0);
- if (authzidNullPosition < 0)
- {
- throw new SaslException("Invalid PLAIN encoding, authzid null terminator not found");
- }
- int authcidNullPosition = findNullPosition(response, authzidNullPosition + 1);
- if (authcidNullPosition < 0)
- {
- throw new SaslException("Invalid PLAIN encoding, authcid null terminator not found");
- }
+ throw new SaslException("Invalid PLAIN encoding, authzid null terminator not found");
+ }
+ int authcidNullPosition = findNullPosition(response, authzidNullPosition + 1);
+ if (authcidNullPosition < 0)
+ {
+ throw new SaslException("Invalid PLAIN encoding, authcid null terminator not found");
+ }
+
+ PlainPasswordCallback passwordCb;
+ AuthorizeCallback authzCb;
+ try
+ {
// we do not currently support authcid in any meaningful way
String authzid = new String(response, authzidNullPosition + 1, authcidNullPosition - authzidNullPosition - 1, "utf8");
// TODO: should not get pwd as a String but as a char array...
int passwordLen = response.length - authcidNullPosition - 1;
String pwd = new String(response, authcidNullPosition + 1, passwordLen, "utf8");
-
+
// we do not care about the prompt but it throws if null
NameCallback nameCb = new NameCallback("prompt", authzid);
- PlainPasswordCallback passwordCb = new PlainPasswordCallback("prompt", false, pwd);
- AuthorizeCallback authzCb = new AuthorizeCallback(authzid, authzid);
+ passwordCb = new PlainPasswordCallback("prompt", false, pwd);
+ authzCb = new AuthorizeCallback(authzid, authzid);
Callback[] callbacks = new Callback[]{nameCb, passwordCb, authzCb};
_cbh.handle(callbacks);
- if (passwordCb.isAuthenticated())
- {
- _complete = true;
- }
- if (authzCb.isAuthorized() && _complete)
- {
- _authorizationId = authzCb.getAuthenticationID();
- return null;
- }
- else
- {
- throw new SaslException("Authentication failed");
- }
}
catch (IOException e)
{
+ if(e instanceof SaslException)
+ {
+ throw (SaslException) e;
+ }
throw new SaslException("Error processing data: " + e, e);
}
catch (UnsupportedCallbackException e)
{
throw new SaslException("Unable to obtain data from callback handler: " + e, e);
}
+
+ if (passwordCb.isAuthenticated())
+ {
+ _complete = true;
+ }
+
+ if (authzCb.isAuthorized() && _complete)
+ {
+ _authorizationId = authzCb.getAuthenticationID();
+ return null;
+ }
+ else
+ {
+ throw new SaslException("Authentication failed");
+ }
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/AbstractMessageStore.java b/java/broker/src/main/java/org/apache/qpid/server/store/AbstractMessageStore.java
deleted file mode 100644
index fc5d2a4e42..0000000000
--- a/java/broker/src/main/java/org/apache/qpid/server/store/AbstractMessageStore.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store;
-
-import org.apache.qpid.server.logging.LogSubject;
-import org.apache.qpid.server.logging.actors.CurrentActor;
-import org.apache.qpid.server.logging.messages.MessageStoreMessages;
-import org.apache.qpid.server.logging.subjects.MessageStoreLogSubject;
-import org.apache.qpid.server.virtualhost.VirtualHost;
-
-public abstract class AbstractMessageStore implements MessageStore
-{
- private LogSubject _logSubject;
-
- public void configure(VirtualHost virtualHost) throws Exception
- {
- _logSubject = new MessageStoreLogSubject(virtualHost, this);
- CurrentActor.get().message(_logSubject, MessageStoreMessages.CREATED(this.getClass().getName()));
- }
-
- public void close() throws Exception
- {
- CurrentActor.get().message(_logSubject,MessageStoreMessages.CLOSED());
- }
-}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/ConfigurationRecoveryHandler.java b/java/broker/src/main/java/org/apache/qpid/server/store/ConfigurationRecoveryHandler.java
index fb67500da9..1307b1dbd4 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/store/ConfigurationRecoveryHandler.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/ConfigurationRecoveryHandler.java
@@ -32,19 +32,19 @@ public interface ConfigurationRecoveryHandler
public static interface QueueRecoveryHandler
{
- void queue(String queueName, String owner, boolean exclusive, FieldTable arguments);
+ void queue(UUID id, String queueName, String owner, boolean exclusive, FieldTable arguments);
ExchangeRecoveryHandler completeQueueRecovery();
}
public static interface ExchangeRecoveryHandler
{
- void exchange(String exchangeName, String type, boolean autoDelete);
+ void exchange(UUID id, String exchangeName, String type, boolean autoDelete);
BindingRecoveryHandler completeExchangeRecovery();
}
public static interface BindingRecoveryHandler
{
- void binding(String exchangeName, String queueName, String bindingKey, ByteBuffer buf);
+ void binding(UUID bindingId, UUID exchangeId, UUID queueId, String bindingName, ByteBuffer buf);
BrokerLinkRecoveryHandler completeBindingRecovery();
}
@@ -60,13 +60,4 @@ public interface ConfigurationRecoveryHandler
void completeBridgeRecoveryForLink();
}
- public static interface QueueEntryRecoveryHandler
- {
- void complete();
-
- void queueEntry(String queueName, long messageId);
- }
-
-
-
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectHelper.java b/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectHelper.java
new file mode 100644
index 0000000000..1a67fdf540
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectHelper.java
@@ -0,0 +1,183 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.model.Binding;
+import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.LifetimePolicy;
+import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.BindingRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.ExchangeRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.QueueRecoveryHandler;
+import org.apache.qpid.server.util.MapJsonSerializer;
+
+public class ConfiguredObjectHelper
+{
+ /**
+ * Name of queue attribute to store queue creation arguments.
+ * <p>
+ * This attribute is not defined yet on Queue configured object interface.
+ */
+ private static final String QUEUE_ARGUMENTS = "ARGUMENTS";
+
+ private MapJsonSerializer _serializer = new MapJsonSerializer();
+
+ public void loadQueue(ConfiguredObjectRecord configuredObject, QueueRecoveryHandler qrh)
+ {
+ if (Queue.class.getName().equals(configuredObject.getType()))
+ {
+ Map<String, Object> attributeMap = _serializer.deserialize(configuredObject.getAttributes());
+ String queueName = (String) attributeMap.get(Queue.NAME);
+ String owner = (String) attributeMap.get(Queue.OWNER);
+ boolean exclusive = (Boolean) attributeMap.get(Queue.EXCLUSIVE);
+ @SuppressWarnings("unchecked")
+ Map<String, Object> queueArgumentsMap = (Map<String, Object>) attributeMap.get(QUEUE_ARGUMENTS);
+ FieldTable arguments = null;
+ if (queueArgumentsMap != null)
+ {
+ arguments = FieldTable.convertToFieldTable(queueArgumentsMap);
+ }
+ qrh.queue(configuredObject.getId(), queueName, owner, exclusive, arguments);
+ }
+ }
+
+ public ConfiguredObjectRecord updateQueueConfiguredObject(final AMQQueue queue, ConfiguredObjectRecord queueRecord)
+ {
+ Map<String, Object> attributesMap = _serializer.deserialize(queueRecord.getAttributes());
+ attributesMap.put(Queue.NAME, queue.getName());
+ attributesMap.put(Queue.EXCLUSIVE, queue.isExclusive());
+ String newJson = _serializer.serialize(attributesMap);
+ ConfiguredObjectRecord newQueueRecord = new ConfiguredObjectRecord(queue.getId(), queueRecord.getType(), newJson);
+ return newQueueRecord;
+ }
+
+ public ConfiguredObjectRecord createQueueConfiguredObject(AMQQueue queue, FieldTable arguments)
+ {
+ Map<String, Object> attributesMap = new HashMap<String, Object>();
+ attributesMap.put(Queue.NAME, queue.getName());
+ attributesMap.put(Queue.OWNER, AMQShortString.toString(queue.getOwner()));
+ attributesMap.put(Queue.EXCLUSIVE, queue.isExclusive());
+ if (arguments != null)
+ {
+ attributesMap.put(QUEUE_ARGUMENTS, FieldTable.convertToMap(arguments));
+ }
+ String json = _serializer.serialize(attributesMap);
+ ConfiguredObjectRecord configuredObject = new ConfiguredObjectRecord(queue.getId(), Queue.class.getName(), json);
+ return configuredObject;
+ }
+
+ public void loadExchange(ConfiguredObjectRecord configuredObject, ExchangeRecoveryHandler erh)
+ {
+ if (Exchange.class.getName().equals(configuredObject.getType()))
+ {
+ Map<String, Object> attributeMap = _serializer.deserialize(configuredObject.getAttributes());
+ String exchangeName = (String) attributeMap.get(Exchange.NAME);
+ String exchangeType = (String) attributeMap.get(Exchange.TYPE);
+ String lifeTimePolicy = (String) attributeMap.get(Exchange.LIFETIME_POLICY);
+ boolean autoDelete = lifeTimePolicy == null
+ || LifetimePolicy.valueOf(lifeTimePolicy) == LifetimePolicy.AUTO_DELETE;
+ erh.exchange(configuredObject.getId(), exchangeName, exchangeType, autoDelete);
+ }
+ }
+
+ public ConfiguredObjectRecord createExchangeConfiguredObject(org.apache.qpid.server.exchange.Exchange exchange)
+ {
+ Map<String, Object> attributesMap = new HashMap<String, Object>();
+ attributesMap.put(Exchange.NAME, exchange.getName());
+ attributesMap.put(Exchange.TYPE, AMQShortString.toString(exchange.getTypeShortString()));
+ attributesMap.put(Exchange.LIFETIME_POLICY, exchange.isAutoDelete() ? LifetimePolicy.AUTO_DELETE.name()
+ : LifetimePolicy.PERMANENT.name());
+ String json = _serializer.serialize(attributesMap);
+ ConfiguredObjectRecord configuredObject = new ConfiguredObjectRecord(exchange.getId(), Exchange.class.getName(), json);
+ return configuredObject;
+ }
+
+ public void loadQueueBinding(ConfiguredObjectRecord configuredObject, BindingRecoveryHandler brh)
+ {
+ if (Binding.class.getName().equals(configuredObject.getType()))
+ {
+ Map<String, Object> attributeMap = _serializer.deserialize(configuredObject.getAttributes());
+ UUID exchangeId = UUID.fromString((String)attributeMap.get(Binding.EXCHANGE));
+ UUID queueId = UUID.fromString((String) attributeMap.get(Binding.QUEUE));
+ String bindingName = (String) attributeMap.get(Binding.NAME);
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> bindingArgumentsMap = (Map<String, Object>) attributeMap.get(Binding.ARGUMENTS);
+ FieldTable arguments = null;
+ if (bindingArgumentsMap != null)
+ {
+ arguments = FieldTable.convertToFieldTable(bindingArgumentsMap);
+ }
+ ByteBuffer argumentsBB = (arguments == null ? null : ByteBuffer.wrap(arguments.getDataAsBytes()));
+
+ brh.binding(configuredObject.getId(), exchangeId, queueId, bindingName, argumentsBB);
+ }
+ }
+
+ public ConfiguredObjectRecord createBindingConfiguredObject(org.apache.qpid.server.binding.Binding binding)
+ {
+ Map<String, Object> attributesMap = new HashMap<String, Object>();
+ attributesMap.put(Binding.NAME, binding.getBindingKey());
+ attributesMap.put(Binding.EXCHANGE, binding.getExchange().getId());
+ attributesMap.put(Binding.QUEUE, binding.getQueue().getId());
+ Map<String, Object> arguments = binding.getArguments();
+ if (arguments != null)
+ {
+ attributesMap.put(Binding.ARGUMENTS, arguments);
+ }
+ String json = _serializer.serialize(attributesMap);
+ ConfiguredObjectRecord configuredObject = new ConfiguredObjectRecord(binding.getId(), Binding.class.getName(), json);
+ return configuredObject;
+ }
+
+ public void recoverQueues(QueueRecoveryHandler qrh, List<ConfiguredObjectRecord> configuredObjects)
+ {
+ for (ConfiguredObjectRecord configuredObjectRecord : configuredObjects)
+ {
+ loadQueue(configuredObjectRecord, qrh);
+ }
+ }
+
+ public void recoverExchanges(ExchangeRecoveryHandler erh, List<ConfiguredObjectRecord> configuredObjects)
+ {
+ for (ConfiguredObjectRecord configuredObjectRecord : configuredObjects)
+ {
+ loadExchange(configuredObjectRecord, erh);
+ }
+ }
+
+ public void recoverBindings(BindingRecoveryHandler brh, List<ConfiguredObjectRecord> configuredObjects)
+ {
+ for (ConfiguredObjectRecord configuredObjectRecord : configuredObjects)
+ {
+ loadQueueBinding(configuredObjectRecord, brh);
+ }
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectRecord.java b/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectRecord.java
new file mode 100644
index 0000000000..95e1713d78
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectRecord.java
@@ -0,0 +1,65 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import java.util.UUID;
+
+public class ConfiguredObjectRecord
+{
+ private UUID _id;
+ private String _type;
+ private String _attributes;
+
+ public ConfiguredObjectRecord(UUID id, String type, String attributes)
+ {
+ super();
+ _id = id;
+ _type = type;
+ _attributes = attributes;
+ }
+
+ public UUID getId()
+ {
+ return _id;
+ }
+
+ public void setId(UUID id)
+ {
+ _id = id;
+ }
+
+ public String getType()
+ {
+ return _type;
+ }
+
+ public String getAttributes()
+ {
+ return _attributes;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "ConfiguredObjectRecord [id=" + _id + ", type=" + _type + ", attributes=" + _attributes + "]";
+ }
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/DerbyMessageStore.java b/java/broker/src/main/java/org/apache/qpid/server/store/DerbyMessageStore.java
deleted file mode 100644
index 2877e25645..0000000000
--- a/java/broker/src/main/java/org/apache/qpid/server/store/DerbyMessageStore.java
+++ /dev/null
@@ -1,2363 +0,0 @@
-/*
-*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*
-*/
-package org.apache.qpid.server.store;
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.AMQException;
-import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.exchange.Exchange;
-import org.apache.qpid.server.federation.Bridge;
-import org.apache.qpid.server.federation.BrokerLink;
-import org.apache.qpid.server.logging.LogSubject;
-import org.apache.qpid.server.logging.actors.CurrentActor;
-import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
-import org.apache.qpid.server.logging.messages.MessageStoreMessages;
-import org.apache.qpid.server.logging.messages.TransactionLogMessages;
-import org.apache.qpid.server.message.EnqueableMessage;
-import org.apache.qpid.server.queue.AMQQueue;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.lang.ref.SoftReference;
-import java.nio.ByteBuffer;
-import java.sql.Blob;
-import java.sql.Connection;
-import java.sql.Driver;
-import java.sql.DriverManager;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.sql.Types;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * An implementation of a {@link MessageStore} that uses Apache Derby as the persistance
- * mechanism.
- *
- * TODO extract the SQL statements into a generic JDBC store
- */
-public class DerbyMessageStore implements MessageStore, DurableConfigurationStore
-{
-
- private static final Logger _logger = Logger.getLogger(DerbyMessageStore.class);
-
- public static final String ENVIRONMENT_PATH_PROPERTY = "environment-path";
-
-
- private static final String SQL_DRIVER_NAME = "org.apache.derby.jdbc.EmbeddedDriver";
-
- private static final String DB_VERSION_TABLE_NAME = "QPID_DB_VERSION";
-
- private static final String EXCHANGE_TABLE_NAME = "QPID_EXCHANGE";
- private static final String QUEUE_TABLE_NAME = "QPID_QUEUE";
- private static final String BINDINGS_TABLE_NAME = "QPID_BINDINGS";
- private static final String QUEUE_ENTRY_TABLE_NAME = "QPID_QUEUE_ENTRY";
-
- private static final String META_DATA_TABLE_NAME = "QPID_META_DATA";
- private static final String MESSAGE_CONTENT_TABLE_NAME = "QPID_MESSAGE_CONTENT";
-
- private static final String LINKS_TABLE_NAME = "QPID_LINKS";
- private static final String BRIDGES_TABLE_NAME = "QPID_BRIDGES";
-
-
- private static final int DB_VERSION = 3;
-
-
-
- private static Class<Driver> DRIVER_CLASS;
-
- private final AtomicLong _messageId = new AtomicLong(0);
- private AtomicBoolean _closed = new AtomicBoolean(false);
-
- private String _connectionURL;
-
- private static final String TABLE_EXISTANCE_QUERY = "SELECT 1 FROM SYS.SYSTABLES WHERE TABLENAME = ?";
-
- private static final String CREATE_DB_VERSION_TABLE = "CREATE TABLE "+DB_VERSION_TABLE_NAME+" ( version int not null )";
- private static final String INSERT_INTO_DB_VERSION = "INSERT INTO "+DB_VERSION_TABLE_NAME+" ( version ) VALUES ( ? )";
-
- private static final String CREATE_EXCHANGE_TABLE = "CREATE TABLE "+EXCHANGE_TABLE_NAME+" ( name varchar(255) not null, type varchar(255) not null, autodelete SMALLINT not null, PRIMARY KEY ( name ) )";
- private static final String CREATE_QUEUE_TABLE = "CREATE TABLE "+QUEUE_TABLE_NAME+" ( name varchar(255) not null, owner varchar(255), exclusive SMALLINT not null, arguments blob, PRIMARY KEY ( name ))";
- private static final String CREATE_BINDINGS_TABLE = "CREATE TABLE "+BINDINGS_TABLE_NAME+" ( exchange_name varchar(255) not null, queue_name varchar(255) not null, binding_key varchar(255) not null, arguments blob , PRIMARY KEY ( exchange_name, queue_name, binding_key ) )";
- private static final String SELECT_FROM_QUEUE = "SELECT name, owner, exclusive, arguments FROM " + QUEUE_TABLE_NAME;
- private static final String FIND_QUEUE = "SELECT name, owner FROM " + QUEUE_TABLE_NAME + " WHERE name = ?";
- private static final String UPDATE_QUEUE_EXCLUSIVITY = "UPDATE " + QUEUE_TABLE_NAME + " SET exclusive = ? WHERE name = ?";
- private static final String SELECT_FROM_EXCHANGE = "SELECT name, type, autodelete FROM " + EXCHANGE_TABLE_NAME;
- private static final String SELECT_FROM_BINDINGS =
- "SELECT exchange_name, queue_name, binding_key, arguments FROM " + BINDINGS_TABLE_NAME + " ORDER BY exchange_name";
- private static final String FIND_BINDING =
- "SELECT * FROM " + BINDINGS_TABLE_NAME + " WHERE exchange_name = ? AND queue_name = ? AND binding_key = ? ";
- private static final String INSERT_INTO_EXCHANGE = "INSERT INTO " + EXCHANGE_TABLE_NAME + " ( name, type, autodelete ) VALUES ( ?, ?, ? )";
- private static final String DELETE_FROM_EXCHANGE = "DELETE FROM " + EXCHANGE_TABLE_NAME + " WHERE name = ?";
- private static final String FIND_EXCHANGE = "SELECT name FROM " + EXCHANGE_TABLE_NAME + " WHERE name = ?";
- private static final String INSERT_INTO_BINDINGS = "INSERT INTO " + BINDINGS_TABLE_NAME + " ( exchange_name, queue_name, binding_key, arguments ) values ( ?, ?, ?, ? )";
- private static final String DELETE_FROM_BINDINGS = "DELETE FROM " + BINDINGS_TABLE_NAME + " WHERE exchange_name = ? AND queue_name = ? AND binding_key = ?";
- private static final String INSERT_INTO_QUEUE = "INSERT INTO " + QUEUE_TABLE_NAME + " (name, owner, exclusive, arguments) VALUES (?, ?, ?, ?)";
- private static final String DELETE_FROM_QUEUE = "DELETE FROM " + QUEUE_TABLE_NAME + " WHERE name = ?";
-
- private static final String CREATE_QUEUE_ENTRY_TABLE = "CREATE TABLE "+QUEUE_ENTRY_TABLE_NAME+" ( queue_name varchar(255) not null, message_id bigint not null, PRIMARY KEY (queue_name, message_id) )";
- private static final String INSERT_INTO_QUEUE_ENTRY = "INSERT INTO " + QUEUE_ENTRY_TABLE_NAME + " (queue_name, message_id) values (?,?)";
- private static final String DELETE_FROM_QUEUE_ENTRY = "DELETE FROM " + QUEUE_ENTRY_TABLE_NAME + " WHERE queue_name = ? AND message_id =?";
- private static final String SELECT_FROM_QUEUE_ENTRY = "SELECT queue_name, message_id FROM " + QUEUE_ENTRY_TABLE_NAME + " ORDER BY queue_name, message_id";
-
-
- private static final String CREATE_META_DATA_TABLE = "CREATE TABLE "+META_DATA_TABLE_NAME+" ( message_id bigint not null, meta_data blob, PRIMARY KEY ( message_id ) )";
- private static final String CREATE_MESSAGE_CONTENT_TABLE = "CREATE TABLE "+MESSAGE_CONTENT_TABLE_NAME+" ( message_id bigint not null, offset int not null, last_byte int not null, content blob , PRIMARY KEY (message_id, offset) )";
-
- private static final String INSERT_INTO_MESSAGE_CONTENT = "INSERT INTO " + MESSAGE_CONTENT_TABLE_NAME + "( message_id, offset, last_byte, content ) values (?, ?, ?, ?)";
- private static final String SELECT_FROM_MESSAGE_CONTENT =
- "SELECT offset, content FROM " + MESSAGE_CONTENT_TABLE_NAME + " WHERE message_id = ? AND last_byte > ? AND offset < ? ORDER BY message_id, offset";
- private static final String DELETE_FROM_MESSAGE_CONTENT = "DELETE FROM " + MESSAGE_CONTENT_TABLE_NAME + " WHERE message_id = ?";
-
- private static final String INSERT_INTO_META_DATA = "INSERT INTO " + META_DATA_TABLE_NAME + "( message_id , meta_data ) values (?, ?)";;
- private static final String SELECT_FROM_META_DATA =
- "SELECT meta_data FROM " + META_DATA_TABLE_NAME + " WHERE message_id = ?";
- private static final String DELETE_FROM_META_DATA = "DELETE FROM " + META_DATA_TABLE_NAME + " WHERE message_id = ?";
- private static final String SELECT_ALL_FROM_META_DATA = "SELECT message_id, meta_data FROM " + META_DATA_TABLE_NAME;
-
- private static final String CREATE_LINKS_TABLE =
- "CREATE TABLE "+LINKS_TABLE_NAME+" ( id_lsb bigint not null,"
- + " id_msb bigint not null,"
- + " create_time bigint not null,"
- + " arguments blob, PRIMARY KEY ( id_lsb, id_msb ))";
- private static final String SELECT_FROM_LINKS =
- "SELECT create_time, arguments FROM " + LINKS_TABLE_NAME + " WHERE id_lsb = ? and id_msb";
- private static final String DELETE_FROM_LINKS = "DELETE FROM " + LINKS_TABLE_NAME
- + " WHERE id_lsb = ? and id_msb = ?";
- private static final String SELECT_ALL_FROM_LINKS = "SELECT id_lsb, id_msb, create_time, "
- + "arguments FROM " + LINKS_TABLE_NAME;
- private static final String FIND_LINK = "SELECT id_lsb, id_msb FROM " + LINKS_TABLE_NAME + " WHERE id_lsb = ? and"
- + " id_msb = ?";
- private static final String INSERT_INTO_LINKS = "INSERT INTO " + LINKS_TABLE_NAME + "( id_lsb, "
- + "id_msb, create_time, arguments ) values (?, ?, ?, ?)";
-
-
- private static final String CREATE_BRIDGES_TABLE =
- "CREATE TABLE "+BRIDGES_TABLE_NAME+" ( id_lsb bigint not null,"
- + " id_msb bigint not null,"
- + " create_time bigint not null,"
- + " link_id_lsb bigint not null,"
- + " link_id_msb bigint not null,"
- + " arguments blob, PRIMARY KEY ( id_lsb, id_msb ))";
- private static final String SELECT_FROM_BRIDGES =
- "SELECT create_time, link_id_lsb, link_id_msb, arguments FROM "
- + BRIDGES_TABLE_NAME + " WHERE id_lsb = ? and id_msb = ?";
- private static final String DELETE_FROM_BRIDGES = "DELETE FROM " + BRIDGES_TABLE_NAME
- + " WHERE id_lsb = ? and id_msb = ?";
- private static final String SELECT_ALL_FROM_BRIDGES = "SELECT id_lsb, id_msb, "
- + " create_time,"
- + " link_id_lsb, link_id_msb, "
- + "arguments FROM " + BRIDGES_TABLE_NAME
- + " WHERE link_id_lsb = ? and link_id_msb = ?";
- private static final String FIND_BRIDGE = "SELECT id_lsb, id_msb FROM " + BRIDGES_TABLE_NAME +
- " WHERE id_lsb = ? and id_msb = ?";
- private static final String INSERT_INTO_BRIDGES = "INSERT INTO " + BRIDGES_TABLE_NAME + "( id_lsb, id_msb, "
- + "create_time, "
- + "link_id_lsb, link_id_msb, "
- + "arguments )"
- + " values (?, ?, ?, ?, ?, ?)";
-
-
- private static final String DERBY_SINGLE_DB_SHUTDOWN_CODE = "08006";
-
-
- private LogSubject _logSubject;
- private boolean _configured;
-
-
- private static final class CommitStoreFuture implements StoreFuture
- {
- public boolean isComplete()
- {
- return true;
- }
-
- public void waitForCompletion()
- {
-
- }
- }
-
- private enum State
- {
- INITIAL,
- CONFIGURING,
- RECOVERING,
- STARTED,
- CLOSING,
- CLOSED
- }
-
- private State _state = State.INITIAL;
-
-
- public void configureConfigStore(String name,
- ConfigurationRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
- stateTransition(State.INITIAL, State.CONFIGURING);
- _logSubject = logSubject;
- CurrentActor.get().message(_logSubject, ConfigStoreMessages.CREATED(this.getClass().getName()));
-
- if(!_configured)
- {
- commonConfiguration(name, storeConfiguration, logSubject);
- _configured = true;
- }
-
- // this recovers durable exchanges, queues, and bindings
- recover(recoveryHandler);
-
-
- stateTransition(State.RECOVERING, State.STARTED);
-
- }
-
-
- public void configureMessageStore(String name,
- MessageStoreRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
- if(!_configured)
- {
-
- _logSubject = logSubject;
- }
-
- CurrentActor.get().message(_logSubject, MessageStoreMessages.CREATED(this.getClass().getName()));
-
- if(!_configured)
- {
-
- commonConfiguration(name, storeConfiguration, logSubject);
- _configured = true;
- }
-
- recoverMessages(recoveryHandler);
-
- }
-
-
-
- public void configureTransactionLog(String name,
- TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
-
- if(!_configured)
- {
- _logSubject = logSubject;
- }
- CurrentActor.get().message(_logSubject, TransactionLogMessages.CREATED(this.getClass().getName()));
-
- if(!_configured)
- {
-
- _logSubject = logSubject;
-
- commonConfiguration(name, storeConfiguration, logSubject);
- _configured = true;
- }
-
- recoverQueueEntries(recoveryHandler);
-
- }
-
-
-
- private void commonConfiguration(String name, Configuration storeConfiguration, LogSubject logSubject)
- throws ClassNotFoundException, SQLException
- {
- initialiseDriver();
-
- //Update to pick up QPID_WORK and use that as the default location not just derbyDB
-
- final String databasePath = storeConfiguration.getString(ENVIRONMENT_PATH_PROPERTY, System.getProperty("QPID_WORK")
- + File.separator + "derbyDB");
-
- File environmentPath = new File(databasePath);
- if (!environmentPath.exists())
- {
- if (!environmentPath.mkdirs())
- {
- throw new IllegalArgumentException("Environment path " + environmentPath + " could not be read or created. "
- + "Ensure the path is correct and that the permissions are correct.");
- }
- }
-
- CurrentActor.get().message(_logSubject, MessageStoreMessages.STORE_LOCATION(environmentPath.getAbsolutePath()));
-
- createOrOpenDatabase(name, databasePath);
- }
-
- private static synchronized void initialiseDriver() throws ClassNotFoundException
- {
- if(DRIVER_CLASS == null)
- {
- DRIVER_CLASS = (Class<Driver>) Class.forName(SQL_DRIVER_NAME);
- }
- }
-
- private void createOrOpenDatabase(String name, final String environmentPath) throws SQLException
- {
- //FIXME this the _vhost name should not be added here, but derby wont use an empty directory as was possibly just created.
- _connectionURL = "jdbc:derby:" + environmentPath + "/" + name + ";create=true";
-
- Connection conn = newAutoCommitConnection();
-
- createVersionTable(conn);
- createExchangeTable(conn);
- createQueueTable(conn);
- createBindingsTable(conn);
- createQueueEntryTable(conn);
- createMetaDataTable(conn);
- createMessageContentTable(conn);
- createLinkTable(conn);
- createBridgeTable(conn);
-
- conn.close();
- }
-
-
-
- private void createVersionTable(final Connection conn) throws SQLException
- {
- if(!tableExists(DB_VERSION_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_DB_VERSION_TABLE);
- }
- finally
- {
- stmt.close();
- }
-
- PreparedStatement pstmt = conn.prepareStatement(INSERT_INTO_DB_VERSION);
- try
- {
- pstmt.setInt(1, DB_VERSION);
- pstmt.execute();
- }
- finally
- {
- pstmt.close();
- }
- }
-
- }
-
-
- private void createExchangeTable(final Connection conn) throws SQLException
- {
- if(!tableExists(EXCHANGE_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_EXCHANGE_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
- }
-
- private void createQueueTable(final Connection conn) throws SQLException
- {
- if(!tableExists(QUEUE_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_QUEUE_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
- }
-
- private void createBindingsTable(final Connection conn) throws SQLException
- {
- if(!tableExists(BINDINGS_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_BINDINGS_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
-
- }
-
- private void createQueueEntryTable(final Connection conn) throws SQLException
- {
- if(!tableExists(QUEUE_ENTRY_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_QUEUE_ENTRY_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
-
- }
-
- private void createMetaDataTable(final Connection conn) throws SQLException
- {
- if(!tableExists(META_DATA_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_META_DATA_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
-
- }
-
-
- private void createMessageContentTable(final Connection conn) throws SQLException
- {
- if(!tableExists(MESSAGE_CONTENT_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_MESSAGE_CONTENT_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
-
- }
-
- private void createLinkTable(final Connection conn) throws SQLException
- {
- if(!tableExists(LINKS_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_LINKS_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
- }
-
-
- private void createBridgeTable(final Connection conn) throws SQLException
- {
- if(!tableExists(BRIDGES_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_BRIDGES_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
- }
-
-
-
-
- private boolean tableExists(final String tableName, final Connection conn) throws SQLException
- {
- PreparedStatement stmt = conn.prepareStatement(TABLE_EXISTANCE_QUERY);
- try
- {
- stmt.setString(1, tableName);
- ResultSet rs = stmt.executeQuery();
- try
- {
- return rs.next();
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
-
- }
-
- public void recover(ConfigurationRecoveryHandler recoveryHandler) throws AMQException
- {
- stateTransition(State.CONFIGURING, State.RECOVERING);
-
- CurrentActor.get().message(_logSubject,MessageStoreMessages.RECOVERY_START());
-
- try
- {
- ConfigurationRecoveryHandler.QueueRecoveryHandler qrh = recoveryHandler.begin(this);
- loadQueues(qrh);
-
- ConfigurationRecoveryHandler.ExchangeRecoveryHandler erh = qrh.completeQueueRecovery();
- List<String> exchanges = loadExchanges(erh);
- ConfigurationRecoveryHandler.BindingRecoveryHandler brh = erh.completeExchangeRecovery();
- recoverBindings(brh, exchanges);
- ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh = brh.completeBindingRecovery();
- recoverBrokerLinks(lrh);
- }
- catch (SQLException e)
- {
-
- throw new AMQStoreException("Error recovering persistent state: " + e.getMessage(), e);
- }
-
-
- }
-
- private void recoverBrokerLinks(final ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh)
- throws SQLException
- {
- _logger.info("Recovering broker links...");
-
- Connection conn = null;
- try
- {
- conn = newAutoCommitConnection();
-
- PreparedStatement stmt = conn.prepareStatement(SELECT_ALL_FROM_LINKS);
-
- try
- {
- ResultSet rs = stmt.executeQuery();
-
- try
- {
-
- while(rs.next())
- {
- UUID id = new UUID(rs.getLong(2), rs.getLong(1));
- long createTime = rs.getLong(3);
- Blob argumentsAsBlob = rs.getBlob(4);
-
- byte[] dataAsBytes = argumentsAsBlob.getBytes(1,(int) argumentsAsBlob.length());
-
- DataInputStream dis = new DataInputStream(new ByteArrayInputStream(dataAsBytes));
- int size = dis.readInt();
-
- Map<String,String> arguments = new HashMap<String, String>();
-
- for(int i = 0; i < size; i++)
- {
- arguments.put(dis.readUTF(), dis.readUTF());
- }
-
- ConfigurationRecoveryHandler.BridgeRecoveryHandler brh = lrh.brokerLink(id, createTime, arguments);
-
- recoverBridges(brh, id);
-
- }
- }
- catch (IOException e)
- {
- throw new SQLException(e.getMessage(), e);
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
-
- }
- finally
- {
- if(conn != null)
- {
- conn.close();
- }
- }
-
- }
-
- private void recoverBridges(final ConfigurationRecoveryHandler.BridgeRecoveryHandler brh, final UUID linkId)
- throws SQLException
- {
- _logger.info("Recovering bridges for link " + linkId + "...");
-
- Connection conn = null;
- try
- {
- conn = newAutoCommitConnection();
-
- PreparedStatement stmt = conn.prepareStatement(SELECT_ALL_FROM_BRIDGES);
-
- try
- {
- stmt.setLong(1, linkId.getLeastSignificantBits());
- stmt.setLong(2, linkId.getMostSignificantBits());
-
- ResultSet rs = stmt.executeQuery();
-
- try
- {
-
- while(rs.next())
- {
- UUID id = new UUID(rs.getLong(2), rs.getLong(1));
- long createTime = rs.getLong(3);
- Blob argumentsAsBlob = rs.getBlob(6);
-
- byte[] dataAsBytes = argumentsAsBlob.getBytes(1,(int) argumentsAsBlob.length());
-
- DataInputStream dis = new DataInputStream(new ByteArrayInputStream(dataAsBytes));
- int size = dis.readInt();
-
- Map<String,String> arguments = new HashMap<String, String>();
-
- for(int i = 0; i < size; i++)
- {
- arguments.put(dis.readUTF(), dis.readUTF());
- }
-
- brh.bridge(id, createTime, arguments);
-
- }
- brh.completeBridgeRecoveryForLink();
- }
- catch (IOException e)
- {
- throw new SQLException(e.getMessage(), e);
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
-
- }
- finally
- {
- if(conn != null)
- {
- conn.close();
- }
- }
-
- }
-
- private void loadQueues(ConfigurationRecoveryHandler.QueueRecoveryHandler qrh) throws SQLException
- {
- Connection conn = newAutoCommitConnection();
- try
- {
- Statement stmt = conn.createStatement();
- try
- {
- ResultSet rs = stmt.executeQuery(SELECT_FROM_QUEUE);
- try
- {
-
- while(rs.next())
- {
- String queueName = rs.getString(1);
- String owner = rs.getString(2);
- boolean exclusive = rs.getBoolean(3);
- Blob argumentsAsBlob = rs.getBlob(4);
-
- byte[] dataAsBytes = argumentsAsBlob.getBytes(1,(int) argumentsAsBlob.length());
- FieldTable arguments;
- if(dataAsBytes.length > 0)
- {
-
- try
- {
- arguments = new FieldTable(new DataInputStream(new ByteArrayInputStream(dataAsBytes)),dataAsBytes.length);
- }
- catch (IOException e)
- {
- throw new RuntimeException("IO Exception should not be thrown",e);
- }
- }
- else
- {
- arguments = null;
- }
-
- qrh.queue(queueName, owner, exclusive, arguments);
-
- }
-
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- conn.close();
- }
- }
-
-
- private List<String> loadExchanges(ConfigurationRecoveryHandler.ExchangeRecoveryHandler erh) throws SQLException
- {
-
- List<String> exchanges = new ArrayList<String>();
- Connection conn = null;
- try
- {
- conn = newAutoCommitConnection();
-
- Statement stmt = conn.createStatement();
- try
- {
- ResultSet rs = stmt.executeQuery(SELECT_FROM_EXCHANGE);
- try
- {
- while(rs.next())
- {
- String exchangeName = rs.getString(1);
- String type = rs.getString(2);
- boolean autoDelete = rs.getShort(3) != 0;
-
- exchanges.add(exchangeName);
-
- erh.exchange(exchangeName, type, autoDelete);
-
- }
- return exchanges;
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- if(conn != null)
- {
- conn.close();
- }
- }
-
- }
-
- private void recoverBindings(ConfigurationRecoveryHandler.BindingRecoveryHandler brh, List<String> exchanges) throws SQLException
- {
- _logger.info("Recovering bindings...");
-
- Connection conn = null;
- try
- {
- conn = newAutoCommitConnection();
-
- PreparedStatement stmt = conn.prepareStatement(SELECT_FROM_BINDINGS);
-
- try
- {
- ResultSet rs = stmt.executeQuery();
-
- try
- {
-
- while(rs.next())
- {
- String exchangeName = rs.getString(1);
- String queueName = rs.getString(2);
- String bindingKey = rs.getString(3);
- Blob arguments = rs.getBlob(4);
- java.nio.ByteBuffer buf;
-
- if(arguments != null && arguments.length() != 0)
- {
- byte[] argumentBytes = arguments.getBytes(1, (int) arguments.length());
- buf = java.nio.ByteBuffer.wrap(argumentBytes);
- }
- else
- {
- buf = null;
- }
-
- brh.binding(exchangeName, queueName, bindingKey, buf);
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
-
- }
- finally
- {
- if(conn != null)
- {
- conn.close();
- }
- }
- }
-
-
-
- public void close() throws Exception
- {
- CurrentActor.get().message(_logSubject,MessageStoreMessages.CLOSED());
- _closed.getAndSet(true);
-
- try
- {
- Connection conn = DriverManager.getConnection(_connectionURL + ";shutdown=true");
- // Shouldn't reach this point - shutdown=true should throw SQLException
- conn.close();
- _logger.error("Unable to shut down the store");
- }
- catch (SQLException e)
- {
- if (e.getSQLState().equalsIgnoreCase(DERBY_SINGLE_DB_SHUTDOWN_CODE))
- {
- //expected and represents a clean shutdown of this database only, do nothing.
- }
- else
- {
- _logger.error("Exception whilst shutting down the store: " + e);
- }
- }
- }
-
- public StoredMessage addMessage(StorableMessageMetaData metaData)
- {
- if(metaData.isPersistent())
- {
- return new StoredDerbyMessage(_messageId.incrementAndGet(), metaData);
- }
- else
- {
- return new StoredMemoryMessage(_messageId.incrementAndGet(), metaData);
- }
- }
-
- public StoredMessage getMessage(long messageNumber)
- {
- return null;
- }
-
- public void removeMessage(long messageId)
- {
- try
- {
- Connection conn = newConnection();
- try
- {
- PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_META_DATA);
- try
- {
- stmt.setLong(1,messageId);
- int results = stmt.executeUpdate();
- stmt.close();
-
- if (results == 0)
- {
- _logger.warn("Message metadata not found for message id " + messageId);
- }
-
- if (_logger.isDebugEnabled())
- {
- _logger.debug("Deleted metadata for message " + messageId);
- }
-
- stmt = conn.prepareStatement(DELETE_FROM_MESSAGE_CONTENT);
- stmt.setLong(1,messageId);
- results = stmt.executeUpdate();
- }
- finally
- {
- stmt.close();
- }
- conn.commit();
- }
- catch(SQLException e)
- {
- try
- {
- conn.rollback();
- }
- catch(SQLException t)
- {
- // ignore - we are re-throwing underlying exception
- }
-
- throw e;
-
- }
- finally
- {
- conn.close();
- }
- }
- catch (SQLException e)
- {
- throw new RuntimeException("Error removing message with id " + messageId + " from database: " + e.getMessage(), e);
- }
-
- }
-
- public void createExchange(Exchange exchange) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- try
- {
- Connection conn = newAutoCommitConnection();
-
- try
- {
-
-
- PreparedStatement stmt = conn.prepareStatement(FIND_EXCHANGE);
- try
- {
- stmt.setString(1, exchange.getNameShortString().toString());
- ResultSet rs = stmt.executeQuery();
- try
- {
-
- // If we don't have any data in the result set then we can add this exchange
- if (!rs.next())
- {
-
- PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_EXCHANGE);
- try
- {
- insertStmt.setString(1, exchange.getName().toString());
- insertStmt.setString(2, exchange.getTypeShortString().asString());
- insertStmt.setShort(3, exchange.isAutoDelete() ? (short) 1 : (short) 0);
- insertStmt.execute();
- }
- finally
- {
- insertStmt.close();
- }
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
-
- }
- finally
- {
- conn.close();
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error writing Exchange with name " + exchange.getNameShortString() + " to database: " + e.getMessage(), e);
- }
- }
-
- }
-
- public void removeExchange(Exchange exchange) throws AMQStoreException
- {
-
- try
- {
- Connection conn = newAutoCommitConnection();
- try
- {
- PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_EXCHANGE);
- try
- {
- stmt.setString(1, exchange.getNameShortString().toString());
- int results = stmt.executeUpdate();
- stmt.close();
- if(results == 0)
- {
- throw new AMQStoreException("Exchange " + exchange.getNameShortString() + " not found");
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- conn.close();
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error deleting Exchange with name " + exchange.getNameShortString() + " from database: " + e.getMessage(), e);
- }
- }
-
- public void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args)
- throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- try
- {
- Connection conn = newAutoCommitConnection();
-
- try
- {
-
- PreparedStatement stmt = conn.prepareStatement(FIND_BINDING);
- try
- {
- stmt.setString(1, exchange.getNameShortString().toString() );
- stmt.setString(2, queue.getNameShortString().toString());
- stmt.setString(3, routingKey == null ? null : routingKey.toString());
-
- ResultSet rs = stmt.executeQuery();
- try
- {
- // If this binding is not already in the store then create it.
- if (!rs.next())
- {
- PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_BINDINGS);
- try
- {
- insertStmt.setString(1, exchange.getNameShortString().toString() );
- insertStmt.setString(2, queue.getNameShortString().toString());
- insertStmt.setString(3, routingKey == null ? null : routingKey.toString());
- if(args != null)
- {
- // TODO - In Java 6 we could use create/set Blob
- byte[] bytes = args.getDataAsBytes();
- ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
- insertStmt.setBinaryStream(4, bis, bytes.length);
- }
- else
- {
- insertStmt.setNull(4, Types.BLOB);
- }
-
- insertStmt.executeUpdate();
- }
- finally
- {
- insertStmt.close();
- }
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- conn.close();
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error writing binding for AMQQueue with name " + queue.getNameShortString() + " to exchange "
- + exchange.getNameShortString() + " to database: " + e.getMessage(), e);
- }
-
- }
-
-
- }
-
- public void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args)
- throws AMQStoreException
- {
- Connection conn = null;
- PreparedStatement stmt = null;
-
- try
- {
- conn = newAutoCommitConnection();
- // exchange_name varchar(255) not null, queue_name varchar(255) not null, binding_key varchar(255), arguments blob
- stmt = conn.prepareStatement(DELETE_FROM_BINDINGS);
- stmt.setString(1, exchange.getNameShortString().toString() );
- stmt.setString(2, queue.getNameShortString().toString());
- stmt.setString(3, routingKey == null ? null : routingKey.toString());
-
- int result = stmt.executeUpdate();
-
- if(result != 1)
- {
- throw new AMQStoreException("Queue binding for queue with name " + queue.getNameShortString() + " to exchange "
- + exchange.getNameShortString() + " not found");
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error removing binding for AMQQueue with name " + queue.getNameShortString() + " to exchange "
- + exchange.getNameShortString() + " in database: " + e.getMessage(), e);
- }
- finally
- {
- closePreparedStatement(stmt);
- closeConnection(conn);
- }
- }
-
- public void createQueue(AMQQueue queue) throws AMQStoreException
- {
- createQueue(queue, null);
- }
-
- public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
- {
- _logger.debug("public void createQueue(AMQQueue queue = " + queue + "): called");
-
- if (_state != State.RECOVERING)
- {
- try
- {
- Connection conn = newAutoCommitConnection();
-
- PreparedStatement stmt = conn.prepareStatement(FIND_QUEUE);
- try
- {
- stmt.setString(1, queue.getNameShortString().toString());
- ResultSet rs = stmt.executeQuery();
- try
- {
-
- // If we don't have any data in the result set then we can add this queue
- if (!rs.next())
- {
- PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_QUEUE);
-
- try
- {
- String owner = queue.getOwner() == null ? null : queue.getOwner().toString();
-
- insertStmt.setString(1, queue.getNameShortString().toString());
- insertStmt.setString(2, owner);
- insertStmt.setBoolean(3,queue.isExclusive());
-
- final byte[] underlying;
- if(arguments != null)
- {
- underlying = arguments.getDataAsBytes();
- }
- else
- {
- underlying = new byte[0];
- }
-
- ByteArrayInputStream bis = new ByteArrayInputStream(underlying);
- insertStmt.setBinaryStream(4,bis,underlying.length);
-
- insertStmt.execute();
- }
- finally
- {
- insertStmt.close();
- }
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- conn.close();
-
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error writing AMQQueue with name " + queue.getNameShortString() + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- /**
- * Updates the specified queue in the persistent store, IF it is already present. If the queue
- * is not present in the store, it will not be added.
- *
- * NOTE: Currently only updates the exclusivity.
- *
- * @param queue The queue to update the entry for.
- * @throws AMQStoreException If the operation fails for any reason.
- */
- public void updateQueue(final AMQQueue queue) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- try
- {
- Connection conn = newAutoCommitConnection();
-
- try
- {
- PreparedStatement stmt = conn.prepareStatement(FIND_QUEUE);
- try
- {
- stmt.setString(1, queue.getNameShortString().toString());
-
- ResultSet rs = stmt.executeQuery();
- try
- {
- if (rs.next())
- {
- PreparedStatement stmt2 = conn.prepareStatement(UPDATE_QUEUE_EXCLUSIVITY);
- try
- {
- stmt2.setBoolean(1,queue.isExclusive());
- stmt2.setString(2, queue.getNameShortString().toString());
-
- stmt2.execute();
- }
- finally
- {
- stmt2.close();
- }
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- conn.close();
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error updating AMQQueue with name " + queue.getNameShortString() + " to database: " + e.getMessage(), e);
- }
- }
-
- }
-
- /**
- * Convenience method to create a new Connection configured for TRANSACTION_READ_COMMITED
- * isolation and with auto-commit transactions enabled.
- */
- private Connection newAutoCommitConnection() throws SQLException
- {
- final Connection connection = newConnection();
- try
- {
- connection.setAutoCommit(true);
- }
- catch (SQLException sqlEx)
- {
-
- try
- {
- connection.close();
- }
- finally
- {
- throw sqlEx;
- }
- }
-
- return connection;
- }
-
- /**
- * Convenience method to create a new Connection configured for TRANSACTION_READ_COMMITED
- * isolation and with auto-commit transactions disabled.
- */
- private Connection newConnection() throws SQLException
- {
- final Connection connection = DriverManager.getConnection(_connectionURL);
- try
- {
- connection.setAutoCommit(false);
- connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
- }
- catch (SQLException sqlEx)
- {
- try
- {
- connection.close();
- }
- finally
- {
- throw sqlEx;
- }
- }
- return connection;
- }
-
- public void removeQueue(final AMQQueue queue) throws AMQStoreException
- {
- AMQShortString name = queue.getNameShortString();
- _logger.debug("public void removeQueue(AMQShortString name = " + name + "): called");
- Connection conn = null;
- PreparedStatement stmt = null;
- try
- {
- conn = newAutoCommitConnection();
- stmt = conn.prepareStatement(DELETE_FROM_QUEUE);
- stmt.setString(1, name.toString());
- int results = stmt.executeUpdate();
-
- if (results == 0)
- {
- throw new AMQStoreException("Queue " + name + " not found");
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error deleting AMQQueue with name " + name + " from database: " + e.getMessage(), e);
- }
- finally
- {
- closePreparedStatement(stmt);
- closeConnection(conn);
- }
-
-
- }
-
- public void createBrokerLink(final BrokerLink link) throws AMQStoreException
- {
- _logger.debug("public void createBrokerLink(BrokerLink = " + link + "): called");
-
- if (_state != State.RECOVERING)
- {
- try
- {
- Connection conn = newAutoCommitConnection();
-
- PreparedStatement stmt = conn.prepareStatement(FIND_LINK);
- try
- {
-
- stmt.setLong(1, link.getId().getLeastSignificantBits());
- stmt.setLong(2, link.getId().getMostSignificantBits());
- ResultSet rs = stmt.executeQuery();
- try
- {
-
- // If we don't have any data in the result set then we can add this queue
- if (!rs.next())
- {
- PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_LINKS);
-
- try
- {
-
- insertStmt.setLong(1, link.getId().getLeastSignificantBits());
- insertStmt.setLong(2, link.getId().getMostSignificantBits());
- insertStmt.setLong(3, link.getCreateTime());
-
- byte[] argumentBytes = convertStringMapToBytes(link.getArguments());
- ByteArrayInputStream bis = new ByteArrayInputStream(argumentBytes);
-
- insertStmt.setBinaryStream(4,bis,argumentBytes.length);
-
- insertStmt.execute();
- }
- finally
- {
- insertStmt.close();
- }
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- conn.close();
-
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error writing " + link + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- private byte[] convertStringMapToBytes(final Map<String, String> arguments) throws AMQStoreException
- {
- byte[] argumentBytes;
- if(arguments == null)
- {
- argumentBytes = new byte[0];
- }
- else
- {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- DataOutputStream dos = new DataOutputStream(bos);
-
-
- try
- {
- dos.writeInt(arguments.size());
- for(Map.Entry<String,String> arg : arguments.entrySet())
- {
- dos.writeUTF(arg.getKey());
- dos.writeUTF(arg.getValue());
- }
- }
- catch (IOException e)
- {
- // This should never happen
- throw new AMQStoreException(e.getMessage(), e);
- }
- argumentBytes = bos.toByteArray();
- }
- return argumentBytes;
- }
-
- public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
- {
- _logger.debug("public void deleteBrokerLink( " + link + "): called");
- Connection conn = null;
- PreparedStatement stmt = null;
- try
- {
- conn = newAutoCommitConnection();
- stmt = conn.prepareStatement(DELETE_FROM_LINKS);
- stmt.setLong(1, link.getId().getLeastSignificantBits());
- stmt.setLong(2, link.getId().getMostSignificantBits());
- int results = stmt.executeUpdate();
-
- if (results == 0)
- {
- throw new AMQStoreException("Link " + link + " not found");
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error deleting Link " + link + " from database: " + e.getMessage(), e);
- }
- finally
- {
- closePreparedStatement(stmt);
- closeConnection(conn);
- }
-
-
- }
-
- public void createBridge(final Bridge bridge) throws AMQStoreException
- {
- _logger.debug("public void createBridge(BrokerLink = " + bridge + "): called");
-
- if (_state != State.RECOVERING)
- {
- try
- {
- Connection conn = newAutoCommitConnection();
-
- PreparedStatement stmt = conn.prepareStatement(FIND_BRIDGE);
- try
- {
-
- UUID id = bridge.getId();
- stmt.setLong(1, id.getLeastSignificantBits());
- stmt.setLong(2, id.getMostSignificantBits());
- ResultSet rs = stmt.executeQuery();
- try
- {
-
- // If we don't have any data in the result set then we can add this queue
- if (!rs.next())
- {
- PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_BRIDGES);
-
- try
- {
-
- insertStmt.setLong(1, id.getLeastSignificantBits());
- insertStmt.setLong(2, id.getMostSignificantBits());
-
- insertStmt.setLong(3, bridge.getCreateTime());
-
- UUID linkId = bridge.getLink().getId();
- insertStmt.setLong(4, linkId.getLeastSignificantBits());
- insertStmt.setLong(5, linkId.getMostSignificantBits());
-
- byte[] argumentBytes = convertStringMapToBytes(bridge.getArguments());
- ByteArrayInputStream bis = new ByteArrayInputStream(argumentBytes);
-
- insertStmt.setBinaryStream(6,bis,argumentBytes.length);
-
- insertStmt.execute();
- }
- finally
- {
- insertStmt.close();
- }
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- conn.close();
-
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error writing " + bridge + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- public void deleteBridge(final Bridge bridge) throws AMQStoreException
- {
- _logger.debug("public void deleteBridge( " + bridge + "): called");
- Connection conn = null;
- PreparedStatement stmt = null;
- try
- {
- conn = newAutoCommitConnection();
- stmt = conn.prepareStatement(DELETE_FROM_BRIDGES);
- stmt.setLong(1, bridge.getId().getLeastSignificantBits());
- stmt.setLong(2, bridge.getId().getMostSignificantBits());
- int results = stmt.executeUpdate();
-
- if (results == 0)
- {
- throw new AMQStoreException("Bridge " + bridge + " not found");
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error deleting bridge " + bridge + " from database: " + e.getMessage(), e);
- }
- finally
- {
- closePreparedStatement(stmt);
- closeConnection(conn);
- }
-
- }
-
- public Transaction newTransaction()
- {
- return new DerbyTransaction();
- }
-
- public void enqueueMessage(ConnectionWrapper connWrapper, final TransactionLogResource queue, Long messageId) throws AMQStoreException
- {
- String name = queue.getResourceName();
-
- Connection conn = connWrapper.getConnection();
-
-
- try
- {
- if (_logger.isDebugEnabled())
- {
- _logger.debug("Enqueuing message " + messageId + " on queue " + name + "[Connection" + conn + "]");
- }
-
- PreparedStatement stmt = conn.prepareStatement(INSERT_INTO_QUEUE_ENTRY);
- try
- {
- stmt.setString(1,name);
- stmt.setLong(2,messageId);
- stmt.executeUpdate();
- }
- finally
- {
- stmt.close();
- }
- }
- catch (SQLException e)
- {
- _logger.error("Failed to enqueue: " + e.getMessage(), e);
- throw new AMQStoreException("Error writing enqueued message with id " + messageId + " for queue " + name
- + " to database", e);
- }
-
- }
-
- public void dequeueMessage(ConnectionWrapper connWrapper, final TransactionLogResource queue, Long messageId) throws AMQStoreException
- {
- String name = queue.getResourceName();
-
-
- Connection conn = connWrapper.getConnection();
-
-
- try
- {
- PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_QUEUE_ENTRY);
- try
- {
- stmt.setString(1,name);
- stmt.setLong(2,messageId);
- int results = stmt.executeUpdate();
-
-
-
- if(results != 1)
- {
- throw new AMQStoreException("Unable to find message with id " + messageId + " on queue " + name);
- }
-
- if (_logger.isDebugEnabled())
- {
- _logger.debug("Dequeuing message " + messageId + " on queue " + name );
- }
- }
- finally
- {
- stmt.close();
- }
- }
- catch (SQLException e)
- {
- _logger.error("Failed to dequeue: " + e.getMessage(), e);
- throw new AMQStoreException("Error deleting enqueued message with id " + messageId + " for queue " + name
- + " from database", e);
- }
-
- }
-
- private static final class ConnectionWrapper
- {
- private final Connection _connection;
-
- public ConnectionWrapper(Connection conn)
- {
- _connection = conn;
- }
-
- public Connection getConnection()
- {
- return _connection;
- }
- }
-
-
- public void commitTran(ConnectionWrapper connWrapper) throws AMQStoreException
- {
-
- try
- {
- Connection conn = connWrapper.getConnection();
- conn.commit();
-
- if (_logger.isDebugEnabled())
- {
- _logger.debug("commit tran completed");
- }
-
- conn.close();
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error commit tx: " + e.getMessage(), e);
- }
- finally
- {
-
- }
- }
-
- public StoreFuture commitTranAsync(ConnectionWrapper connWrapper) throws AMQStoreException
- {
- commitTran(connWrapper);
- return new CommitStoreFuture();
- }
-
- public void abortTran(ConnectionWrapper connWrapper) throws AMQStoreException
- {
- if (connWrapper == null)
- {
- throw new AMQStoreException("Fatal internal error: transactional context is empty at abortTran");
- }
-
- if (_logger.isDebugEnabled())
- {
- _logger.debug("abort tran called: " + connWrapper.getConnection());
- }
-
- try
- {
- Connection conn = connWrapper.getConnection();
- conn.rollback();
- conn.close();
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error aborting transaction: " + e.getMessage(), e);
- }
-
- }
-
- public Long getNewMessageId()
- {
- return _messageId.incrementAndGet();
- }
-
-
- private void storeMetaData(Connection conn, long messageId, StorableMessageMetaData metaData)
- throws SQLException
- {
- if(_logger.isDebugEnabled())
- {
- _logger.debug("Adding metadata for message " +messageId);
- }
-
- PreparedStatement stmt = conn.prepareStatement(INSERT_INTO_META_DATA);
- try
- {
- stmt.setLong(1,messageId);
-
- final int bodySize = 1 + metaData.getStorableSize();
- byte[] underlying = new byte[bodySize];
- underlying[0] = (byte) metaData.getType().ordinal();
- java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(underlying);
- buf.position(1);
- buf = buf.slice();
-
- metaData.writeToBuffer(0, buf);
- ByteArrayInputStream bis = new ByteArrayInputStream(underlying);
- try
- {
- stmt.setBinaryStream(2,bis,underlying.length);
- int result = stmt.executeUpdate();
-
- if(result == 0)
- {
- throw new RuntimeException("Unable to add meta data for message " +messageId);
- }
- }
- finally
- {
- try
- {
- bis.close();
- }
- catch (IOException e)
- {
-
- throw new SQLException(e);
- }
- }
-
- }
- finally
- {
- stmt.close();
- }
-
- }
-
-
-
-
- private void recoverMessages(MessageStoreRecoveryHandler recoveryHandler) throws SQLException
- {
- Connection conn = newAutoCommitConnection();
- try
- {
- MessageStoreRecoveryHandler.StoredMessageRecoveryHandler messageHandler = recoveryHandler.begin();
-
- Statement stmt = conn.createStatement();
- try
- {
- ResultSet rs = stmt.executeQuery(SELECT_ALL_FROM_META_DATA);
- try
- {
-
- long maxId = 0;
-
- while(rs.next())
- {
-
- long messageId = rs.getLong(1);
- Blob dataAsBlob = rs.getBlob(2);
-
- if(messageId > maxId)
- {
- maxId = messageId;
- }
-
- byte[] dataAsBytes = dataAsBlob.getBytes(1,(int) dataAsBlob.length());
- java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(dataAsBytes);
- buf.position(1);
- buf = buf.slice();
- MessageMetaDataType type = MessageMetaDataType.values()[dataAsBytes[0]];
- StorableMessageMetaData metaData = type.getFactory().createMetaData(buf);
- StoredDerbyMessage message = new StoredDerbyMessage(messageId, metaData, false);
- messageHandler.message(message);
- }
-
- _messageId.set(maxId);
-
- messageHandler.completeMessageRecovery();
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- conn.close();
- }
- }
-
-
-
- private void recoverQueueEntries(TransactionLogRecoveryHandler recoveryHandler) throws SQLException
- {
- Connection conn = newAutoCommitConnection();
- try
- {
- TransactionLogRecoveryHandler.QueueEntryRecoveryHandler queueEntryHandler = recoveryHandler.begin(this);
-
- Statement stmt = conn.createStatement();
- try
- {
- ResultSet rs = stmt.executeQuery(SELECT_FROM_QUEUE_ENTRY);
- try
- {
- while(rs.next())
- {
-
- String queueName = rs.getString(1);
- long messageId = rs.getLong(2);
- queueEntryHandler.queueEntry(queueName,messageId);
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
-
- queueEntryHandler.completeQueueEntryRecovery();
- }
- finally
- {
- conn.close();
- }
- }
-
- StorableMessageMetaData getMetaData(long messageId) throws SQLException
- {
-
- Connection conn = newAutoCommitConnection();
- try
- {
- PreparedStatement stmt = conn.prepareStatement(SELECT_FROM_META_DATA);
- try
- {
- stmt.setLong(1,messageId);
- ResultSet rs = stmt.executeQuery();
- try
- {
-
- if(rs.next())
- {
- Blob dataAsBlob = rs.getBlob(1);
-
- byte[] dataAsBytes = dataAsBlob.getBytes(1,(int) dataAsBlob.length());
- java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(dataAsBytes);
- buf.position(1);
- buf = buf.slice();
- MessageMetaDataType type = MessageMetaDataType.values()[dataAsBytes[0]];
- StorableMessageMetaData metaData = type.getFactory().createMetaData(buf);
-
- return metaData;
- }
- else
- {
- throw new RuntimeException("Meta data not found for message with id " + messageId);
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- conn.close();
- }
- }
-
-
- private void addContent(Connection conn, long messageId, int offset, ByteBuffer src)
- {
- if(_logger.isDebugEnabled())
- {
- _logger.debug("Adding content chunk offset " + offset + " for message " +messageId);
- }
- PreparedStatement stmt = null;
-
- try
- {
- src = src.slice();
-
- byte[] chunkData = new byte[src.limit()];
- src.duplicate().get(chunkData);
-
- stmt = conn.prepareStatement(INSERT_INTO_MESSAGE_CONTENT);
- stmt.setLong(1,messageId);
- stmt.setInt(2, offset);
- stmt.setInt(3, offset+chunkData.length);
-
-
- // TODO in Java 6 we could just use blobs
-
- ByteArrayInputStream bis = new ByteArrayInputStream(chunkData);
- stmt.setBinaryStream(4, bis, chunkData.length);
- stmt.executeUpdate();
- }
- catch (SQLException e)
- {
- closeConnection(conn);
- throw new RuntimeException("Error adding content chunk offset " + offset + " for message " + messageId + ": " + e.getMessage(), e);
- }
- finally
- {
- closePreparedStatement(stmt);
- }
-
- }
-
-
- public int getContent(long messageId, int offset, ByteBuffer dst)
- {
- Connection conn = null;
- PreparedStatement stmt = null;
-
- try
- {
- conn = newAutoCommitConnection();
-
- stmt = conn.prepareStatement(SELECT_FROM_MESSAGE_CONTENT);
- stmt.setLong(1,messageId);
- stmt.setInt(2, offset);
- stmt.setInt(3, offset+dst.remaining());
- ResultSet rs = stmt.executeQuery();
-
- int written = 0;
-
- while(rs.next())
- {
- int offsetInMessage = rs.getInt(1);
- Blob dataAsBlob = rs.getBlob(2);
-
- final int size = (int) dataAsBlob.length();
- byte[] dataAsBytes = dataAsBlob.getBytes(1, size);
-
- int posInArray = offset + written - offsetInMessage;
- int count = size - posInArray;
- if(count > dst.remaining())
- {
- count = dst.remaining();
- }
- dst.put(dataAsBytes,posInArray,count);
- written+=count;
-
- if(dst.remaining() == 0)
- {
- break;
- }
- }
-
- return written;
-
- }
- catch (SQLException e)
- {
- throw new RuntimeException("Error retrieving content from offset " + offset + " for message " + messageId + ": " + e.getMessage(), e);
- }
- finally
- {
- closePreparedStatement(stmt);
- closeConnection(conn);
- }
-
-
- }
-
- public boolean isPersistent()
- {
- return true;
- }
-
-
- private synchronized void stateTransition(State requiredState, State newState) throws AMQStoreException
- {
- if (_state != requiredState)
- {
- throw new AMQStoreException("Cannot transition to the state: " + newState + "; need to be in state: " + requiredState
- + "; currently in state: " + _state);
- }
-
- _state = newState;
- }
-
-
- private class DerbyTransaction implements Transaction
- {
- private final ConnectionWrapper _connWrapper;
-
-
- private DerbyTransaction()
- {
- try
- {
- _connWrapper = new ConnectionWrapper(newConnection());
- }
- catch (SQLException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
- {
- if(message.getStoredMessage() instanceof StoredDerbyMessage)
- {
- try
- {
- ((StoredDerbyMessage)message.getStoredMessage()).store(_connWrapper.getConnection());
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Exception on enqueuing message " + _messageId, e);
- }
- }
-
- DerbyMessageStore.this.enqueueMessage(_connWrapper, queue, message.getMessageNumber());
- }
-
- public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
- {
- DerbyMessageStore.this.dequeueMessage(_connWrapper, queue, message.getMessageNumber());
-
- }
-
- public void commitTran() throws AMQStoreException
- {
- DerbyMessageStore.this.commitTran(_connWrapper);
- }
-
- public StoreFuture commitTranAsync() throws AMQStoreException
- {
- return DerbyMessageStore.this.commitTranAsync(_connWrapper);
- }
-
- public void abortTran() throws AMQStoreException
- {
- DerbyMessageStore.this.abortTran(_connWrapper);
- }
- }
-
- private class StoredDerbyMessage implements StoredMessage
- {
-
- private final long _messageId;
- private StorableMessageMetaData _metaData;
- private volatile SoftReference<StorableMessageMetaData> _metaDataRef;
- private byte[] _data;
- private volatile SoftReference<byte[]> _dataRef;
-
-
- StoredDerbyMessage(long messageId, StorableMessageMetaData metaData)
- {
- this(messageId, metaData, true);
- }
-
-
- StoredDerbyMessage(long messageId,
- StorableMessageMetaData metaData, boolean persist)
- {
- _messageId = messageId;
-
-
- _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
- if(persist)
- {
- _metaData = metaData;
- }
- }
-
- public StorableMessageMetaData getMetaData()
- {
- StorableMessageMetaData metaData = _metaData == null ? _metaDataRef.get() : _metaData;
- if(metaData == null)
- {
- try
- {
- metaData = DerbyMessageStore.this.getMetaData(_messageId);
- }
- catch (SQLException e)
- {
- throw new RuntimeException(e);
- }
- _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
- }
-
- return metaData;
- }
-
- public long getMessageNumber()
- {
- return _messageId;
- }
-
- public void addContent(int offsetInMessage, java.nio.ByteBuffer src)
- {
- src = src.slice();
-
- if(_data == null)
- {
- _data = new byte[src.remaining()];
- _dataRef = new SoftReference<byte[]>(_data);
- src.duplicate().get(_data);
- }
- else
- {
- byte[] oldData = _data;
- _data = new byte[oldData.length + src.remaining()];
- _dataRef = new SoftReference<byte[]>(_data);
-
- System.arraycopy(oldData,0,_data,0,oldData.length);
- src.duplicate().get(_data, oldData.length, src.remaining());
- }
-
- }
-
- public int getContent(int offsetInMessage, java.nio.ByteBuffer dst)
- {
- byte[] data = _dataRef == null ? null : _dataRef.get();
- if(data != null)
- {
- int length = Math.min(dst.remaining(), data.length - offsetInMessage);
- dst.put(data, offsetInMessage, length);
- return length;
- }
- else
- {
- return DerbyMessageStore.this.getContent(_messageId, offsetInMessage, dst);
- }
- }
-
-
- public ByteBuffer getContent(int offsetInMessage, int size)
- {
- ByteBuffer buf = ByteBuffer.allocate(size);
- getContent(offsetInMessage, buf);
- buf.position(0);
- return buf;
- }
-
- public synchronized StoreFuture flushToStore()
- {
- try
- {
- if(_metaData != null)
- {
- Connection conn = newConnection();
-
- store(conn);
-
- conn.commit();
- conn.close();
- }
- }
- catch (SQLException e)
- {
- if(_logger.isDebugEnabled())
- {
- _logger.debug("Error when trying to flush message " + _messageId + " to store: " + e);
- }
- throw new RuntimeException(e);
- }
- return IMMEDIATE_FUTURE;
- }
-
- private synchronized void store(final Connection conn) throws SQLException
- {
- if(_metaData != null)
- {
- try
- {
- storeMetaData(conn, _messageId, _metaData);
- DerbyMessageStore.this.addContent(conn, _messageId, 0,
- _data == null ? ByteBuffer.allocate(0) : ByteBuffer.wrap(_data));
- }
- finally
- {
- _metaData = null;
- _data = null;
- }
- }
-
- if(_logger.isDebugEnabled())
- {
- _logger.debug("Storing message " + _messageId + " to store");
- }
- }
-
- public void remove()
- {
- DerbyMessageStore.this.removeMessage(_messageId);
- }
- }
-
- private void closeConnection(final Connection conn)
- {
- if(conn != null)
- {
- try
- {
- conn.close();
- }
- catch (SQLException e)
- {
- _logger.error("Problem closing connection", e);
- }
- }
- }
-
- private void closePreparedStatement(final PreparedStatement stmt)
- {
- if (stmt != null)
- {
- try
- {
- stmt.close();
- }
- catch(SQLException e)
- {
- _logger.error("Problem closing prepared statement", e);
- }
- }
- }
-
-}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java b/java/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java
index 123ecd8145..655887e5c2 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java
@@ -23,12 +23,11 @@ package org.apache.qpid.server.store;
import org.apache.commons.configuration.Configuration;
import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.binding.Binding;
import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.federation.Bridge;
import org.apache.qpid.server.federation.BrokerLink;
-import org.apache.qpid.server.logging.LogSubject;
import org.apache.qpid.server.queue.AMQQueue;
public interface DurableConfigurationStore
@@ -36,23 +35,21 @@ public interface DurableConfigurationStore
public static interface Source
{
- DurableConfigurationStore getDurableConfigurationStore();
+ DurableConfigurationStore getMessageStore();
}
/**
* Called after instantiation in order to configure the message store. A particular implementation can define
* whatever parameters it wants.
*
- * @param name The name to be used by this storem
+ * @param name The name to be used by this store
* @param recoveryHandler Handler to be called as the store recovers on start up
* @param config The apache commons configuration object.
- *
* @throws Exception If any error occurs that means the store is unable to configure itself.
*/
void configureConfigStore(String name,
ConfigurationRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception;
+ Configuration config) throws Exception;
/**
* Makes the specified exchange persistent.
*
@@ -72,28 +69,22 @@ public interface DurableConfigurationStore
void removeExchange(Exchange exchange) throws AMQStoreException;
/**
- * Binds the specified queue to an exchange with a routing key.
+ * Store the queue binding.
*
- * @param exchange The exchange to bind to.
- * @param routingKey The routing key to bind by.
- * @param queue The queue to bind.
- * @param args Additional parameters.
+ * @param binding queue binding
*
* @throws AMQStoreException if the operation fails for any reason.
*/
- void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException;
+ void bindQueue(Binding binding) throws AMQStoreException;
/**
- * Unbinds the specified from an exchange under a particular routing key.
+ * Removes queue binding
*
- * @param exchange The exchange to unbind from.
- * @param routingKey The routing key to unbind.
- * @param queue The queue to unbind.
- * @param args Additonal parameters.
+ * @param binding queue binding to remove
*
* @throws AMQStoreException If the operation fails for any reason.
*/
- void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException;
+ void unbindQueue(Binding binding) throws AMQStoreException;
/**
* Makes the specified queue persistent.
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/Event.java b/java/broker/src/main/java/org/apache/qpid/server/store/Event.java
new file mode 100644
index 0000000000..bbde11ab4c
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/Event.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public enum Event
+{
+ BEFORE_INIT,
+ AFTER_INIT,
+ BEFORE_ACTIVATE,
+ AFTER_ACTIVATE,
+ BEFORE_PASSIVATE,
+ AFTER_PASSIVATE,
+ BEFORE_CLOSE,
+ AFTER_CLOSE
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/EventListener.java b/java/broker/src/main/java/org/apache/qpid/server/store/EventListener.java
new file mode 100644
index 0000000000..33ae7b5b24
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/EventListener.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public interface EventListener
+{
+ public void event(Event event);
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/EventManager.java b/java/broker/src/main/java/org/apache/qpid/server/store/EventManager.java
new file mode 100644
index 0000000000..21ae3924b8
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/EventManager.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+
+public class EventManager
+{
+ private Map<Event, List<EventListener>> _listeners = new EnumMap<Event, List<EventListener>> (Event.class);
+
+ public synchronized void addEventListener(EventListener listener, Event... events)
+ {
+ for(Event event : events)
+ {
+ List<EventListener> list = _listeners.get(event);
+ if(list == null)
+ {
+ list = new ArrayList<EventListener>();
+ _listeners.put(event,list);
+ }
+ list.add(listener);
+ }
+ }
+
+ public synchronized void notifyEvent(Event event)
+ {
+ if (_listeners.containsKey(event))
+ {
+ for (EventListener listener : _listeners.get(event))
+ {
+ listener.event(event);
+ }
+ }
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java b/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java
index 546a81a050..59624b7a75 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java
@@ -21,200 +21,117 @@
package org.apache.qpid.server.store;
import org.apache.commons.configuration.Configuration;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.AMQException;
import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.exchange.Exchange;
-import org.apache.qpid.server.federation.Bridge;
-import org.apache.qpid.server.federation.BrokerLink;
-import org.apache.qpid.server.logging.LogSubject;
-import org.apache.qpid.server.logging.actors.CurrentActor;
-import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
-import org.apache.qpid.server.logging.messages.MessageStoreMessages;
import org.apache.qpid.server.message.EnqueableMessage;
-import org.apache.qpid.server.queue.AMQQueue;
-import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
-/** A simple message store that stores the messages in a threadsafe structure in memory. */
-public class MemoryMessageStore implements MessageStore, DurableConfigurationStore
+/** A simple message store that stores the messages in a thread-safe structure in memory. */
+public class MemoryMessageStore extends NullMessageStore
{
- private static final Logger _log = Logger.getLogger(MemoryMessageStore.class);
-
- private static final int DEFAULT_HASHTABLE_CAPACITY = 50000;
-
- private static final String HASHTABLE_CAPACITY_CONFIG = "hashtable-capacity";
-
-
private final AtomicLong _messageId = new AtomicLong(1);
- private AtomicBoolean _closed = new AtomicBoolean(false);
- private LogSubject _logSubject;
+ private final AtomicBoolean _closed = new AtomicBoolean(false);
private static final Transaction IN_MEMORY_TRANSACTION = new Transaction()
{
+ @Override
+ public StoreFuture commitTranAsync() throws AMQStoreException
+ {
+ return StoreFuture.IMMEDIATE_FUTURE;
+ }
+
+ @Override
public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
{
}
+ @Override
public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
{
}
+ @Override
public void commitTran() throws AMQStoreException
{
}
- public StoreFuture commitTranAsync() throws AMQStoreException
+ @Override
+ public void abortTran() throws AMQStoreException
{
- return IMMEDIATE_FUTURE;
}
- public void abortTran() throws AMQStoreException
+ @Override
+ public void removeXid(long format, byte[] globalId, byte[] branchId)
{
}
- };
-
- public void configureConfigStore(String name, ConfigurationRecoveryHandler handler, Configuration configuration, LogSubject logSubject) throws Exception
- {
- _logSubject = logSubject;
- CurrentActor.get().message(_logSubject, ConfigStoreMessages.CREATED(this.getClass().getName()));
-
-
- }
-
- public void configureMessageStore(String name,
- MessageStoreRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception
- {
- if(_logSubject == null)
+ @Override
+ public void recordXid(long format, byte[] globalId, byte[] branchId, Record[] enqueues, Record[] dequeues)
{
- _logSubject = logSubject;
}
- int hashtableCapacity = config.getInt(name + "." + HASHTABLE_CAPACITY_CONFIG, DEFAULT_HASHTABLE_CAPACITY);
- _log.info("Using capacity " + hashtableCapacity + " for hash tables");
- CurrentActor.get().message(_logSubject, MessageStoreMessages.CREATED(this.getClass().getName()));
- }
-
- public void close() throws Exception
- {
- _closed.getAndSet(true);
- CurrentActor.get().message(_logSubject,MessageStoreMessages.CLOSED());
-
- }
-
- public StoredMessage addMessage(StorableMessageMetaData metaData)
- {
- final long id = _messageId.getAndIncrement();
- StoredMemoryMessage message = new StoredMemoryMessage(id, metaData);
-
- return message;
- }
-
-
- public void createExchange(Exchange exchange) throws AMQStoreException
- {
-
- }
-
- public void removeExchange(Exchange exchange) throws AMQStoreException
- {
-
- }
-
- public void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
- {
-
- }
-
- public void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
- {
-
- }
-
-
- public void createQueue(AMQQueue queue) throws AMQStoreException
- {
- // Not requred to do anything
- }
+ };
- public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
- {
- // Not required to do anything
- }
+ private final StateManager _stateManager;
+ private final EventManager _eventManager = new EventManager();
- public void removeQueue(final AMQQueue queue) throws AMQStoreException
- {
- // Not required to do anything
- }
-
- public void updateQueue(final AMQQueue queue) throws AMQStoreException
+ public MemoryMessageStore()
{
- // Not required to do anything
+ _stateManager = new StateManager(_eventManager);
}
- public void createBrokerLink(final BrokerLink link) throws AMQStoreException
+ @Override
+ public void configureConfigStore(String name, ConfigurationRecoveryHandler recoveryHandler, Configuration config) throws Exception
{
-
+ _stateManager.attainState(State.CONFIGURING);
}
- public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
+ @Override
+ public void configureMessageStore(String name, MessageStoreRecoveryHandler recoveryHandler, TransactionLogRecoveryHandler tlogRecoveryHandler, Configuration config) throws Exception
{
-
+ _stateManager.attainState(State.CONFIGURED);
}
- public void createBridge(final Bridge bridge) throws AMQStoreException
+ @Override
+ public void activate() throws Exception
{
-
+ _stateManager.attainState(State.RECOVERING);
+
+ _stateManager.attainState(State.ACTIVE);
}
- public void deleteBridge(final Bridge bridge) throws AMQStoreException
+ @Override
+ public StoredMessage addMessage(StorableMessageMetaData metaData)
{
+ final long id = _messageId.getAndIncrement();
+ StoredMemoryMessage message = new StoredMemoryMessage(id, metaData);
+ return message;
}
- public void configureTransactionLog(String name,
- TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
+ @Override
public Transaction newTransaction()
{
return IN_MEMORY_TRANSACTION;
}
-
- public List<AMQQueue> createQueues() throws AMQException
+ @Override
+ public boolean isPersistent()
{
- return null;
+ return false;
}
- public Long getNewMessageId()
+ @Override
+ public void close() throws Exception
{
- return _messageId.getAndIncrement();
+ _stateManager.attainState(State.CLOSING);
+ _closed.getAndSet(true);
+ _stateManager.attainState(State.CLOSED);
}
- public boolean isPersistent()
+ @Override
+ public void addEventListener(EventListener eventListener, Event... events)
{
- return false;
- }
-
- private void checkNotClosed() throws MessageStoreClosedException
- {
- if (_closed.get())
- {
- throw new MessageStoreClosedException();
- }
+ _eventManager.addEventListener(eventListener, events);
}
-
-
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStoreFactory.java b/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStoreFactory.java
new file mode 100644
index 0000000000..8724f102c6
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStoreFactory.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public class MemoryMessageStoreFactory implements MessageStoreFactory
+{
+
+ @Override
+ public MessageStore createMessageStore()
+ {
+ return new MemoryMessageStore();
+ }
+
+ @Override
+ public String getStoreClassName()
+ {
+ return MemoryMessageStore.class.getSimpleName();
+ }
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/MessageMetaDataType.java b/java/broker/src/main/java/org/apache/qpid/server/store/MessageMetaDataType.java
index 428bb1e41b..0fab60b6f3 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/store/MessageMetaDataType.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/MessageMetaDataType.java
@@ -22,13 +22,16 @@ package org.apache.qpid.server.store;
import org.apache.qpid.server.message.MessageMetaData;
import org.apache.qpid.server.message.MessageMetaData_0_10;
+import org.apache.qpid.server.message.MessageMetaData_1_0;
import java.nio.ByteBuffer;
public enum MessageMetaDataType
{
META_DATA_0_8 { public Factory<MessageMetaData> getFactory() { return MessageMetaData.FACTORY; } },
- META_DATA_0_10 { public Factory<MessageMetaData_0_10> getFactory() { return MessageMetaData_0_10.FACTORY; } };
+ META_DATA_0_10 { public Factory<MessageMetaData_0_10> getFactory() { return MessageMetaData_0_10.FACTORY; } },
+ META_DATA_1_0 { public Factory<MessageMetaData_1_0> getFactory() { return MessageMetaData_1_0.FACTORY; } };
+
public static interface Factory<M extends StorableMessageMetaData>
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java b/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java
index 2fecd5d4be..cf08ee00ff 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java
@@ -22,52 +22,28 @@ package org.apache.qpid.server.store;
import org.apache.commons.configuration.Configuration;
-import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.server.logging.LogSubject;
-import org.apache.qpid.server.message.EnqueableMessage;
-
/**
* MessageStore defines the interface to a storage area, which can be used to preserve the state of messages.
*
*/
-public interface MessageStore
+public interface MessageStore extends DurableConfigurationStore
{
- StoreFuture IMMEDIATE_FUTURE = new StoreFuture()
- {
- public boolean isComplete()
- {
- return true;
- }
-
- public void waitForCompletion()
- {
-
- }
- };
-
-
/**
* Called after instantiation in order to configure the message store. A particular implementation can define
* whatever parameters it wants.
*
- * @param name The name to be used by this storem
- * @param recoveryHandler Handler to be called as the store recovers on start up
+ * @param name The name to be used by this store
+ * @param messageRecoveryHandler Handler to be called as the store recovers on start up
+ * @param tlogRecoveryHandler
* @param config The apache commons configuration object.
- *
* @throws Exception If any error occurs that means the store is unable to configure itself.
*/
void configureMessageStore(String name,
- MessageStoreRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception;
-
- /**
- * Called to close and cleanup any resources used by the message store.
- *
- * @throws Exception If the close fails.
- */
- void close() throws Exception;
+ MessageStoreRecoveryHandler messageRecoveryHandler,
+ TransactionLogRecoveryHandler tlogRecoveryHandler,
+ Configuration config) throws Exception;
+ void activate() throws Exception;
public <T extends StorableMessageMetaData> StoredMessage<T> addMessage(T metaData);
@@ -79,70 +55,16 @@ public interface MessageStore
*/
boolean isPersistent();
-
-
- public static interface Transaction
- {
- /**
- * Places a message onto a specified queue, in a given transactional context.
- *
- *
- *
- * @param queue The queue to place the message on.
- * @param message
- * @throws org.apache.qpid.AMQStoreException If the operation fails for any reason.
- */
- void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException;
-
- /**
- * Extracts a message from a specified queue, in a given transactional context.
- *
- * @param queue The queue to place the message on.
- * @param message The message to dequeue.
- * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
- */
- void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException;
-
-
- /**
- * Commits all operations performed within a given transactional context.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- void commitTran() throws AMQStoreException;
-
- /**
- * Commits all operations performed within a given transactional context.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- StoreFuture commitTranAsync() throws AMQStoreException;
-
- /**
- * Abandons all operations performed within a given transactional context.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- void abortTran() throws AMQStoreException;
-
-
-
- }
-
- public void configureTransactionLog(String name,
- TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception;
-
Transaction newTransaction();
+ /**
+ * Called to close and cleanup any resources used by the message store.
+ *
+ * @throws Exception If the close fails.
+ */
+ void close() throws Exception;
+ void addEventListener(EventListener eventListener, Event... events);
- public static interface StoreFuture
- {
- boolean isComplete();
-
- void waitForCompletion();
- }
-
+ String getStoreLocation();
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreConstants.java b/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreConstants.java
new file mode 100644
index 0000000000..aba7456a44
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreConstants.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public class MessageStoreConstants
+{
+
+ public static final String ENVIRONMENT_PATH_PROPERTY = "environment-path";
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreFactory.java b/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreFactory.java
new file mode 100644
index 0000000000..a35db62b03
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreFactory.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public interface MessageStoreFactory
+{
+ MessageStore createMessageStore();
+
+ String getStoreClassName();
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java b/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java
new file mode 100644
index 0000000000..34c7d2d933
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.binding.Binding;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.federation.Bridge;
+import org.apache.qpid.server.federation.BrokerLink;
+import org.apache.qpid.server.queue.AMQQueue;
+
+public class NullMessageStore implements MessageStore
+{
+ @Override
+ public void configureConfigStore(String name,
+ ConfigurationRecoveryHandler recoveryHandler,
+ Configuration config) throws Exception
+ {
+ }
+
+ @Override
+ public void createExchange(Exchange exchange) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void removeExchange(Exchange exchange) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void bindQueue(Binding binding) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void unbindQueue(Binding binding) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void createQueue(AMQQueue queue) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void removeQueue(AMQQueue queue) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void updateQueue(AMQQueue queue) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void createBrokerLink(final BrokerLink link) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void createBridge(final Bridge bridge) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void deleteBridge(final Bridge bridge) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void configureMessageStore(String name,
+ MessageStoreRecoveryHandler recoveryHandler,
+ TransactionLogRecoveryHandler tlogRecoveryHandler, Configuration config) throws Exception
+ {
+ }
+
+ @Override
+ public void close() throws Exception
+ {
+ }
+
+ @Override
+ public <T extends StorableMessageMetaData> StoredMessage<T> addMessage(T metaData)
+ {
+ return null;
+ }
+
+ @Override
+ public boolean isPersistent()
+ {
+ return false;
+ }
+
+ @Override
+ public Transaction newTransaction()
+ {
+ return null;
+ }
+
+ @Override
+ public void activate() throws Exception
+ {
+ }
+
+ @Override
+ public void addEventListener(EventListener eventListener, Event... events)
+ {
+ }
+
+ @Override
+ public String getStoreLocation()
+ {
+ return null;
+ }
+
+} \ No newline at end of file
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/OperationalLoggingListener.java b/java/broker/src/main/java/org/apache/qpid/server/store/OperationalLoggingListener.java
new file mode 100644
index 0000000000..caff17daa5
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/OperationalLoggingListener.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import org.apache.qpid.server.logging.LogSubject;
+import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
+import org.apache.qpid.server.logging.messages.MessageStoreMessages;
+import org.apache.qpid.server.logging.messages.TransactionLogMessages;
+
+public class OperationalLoggingListener implements EventListener
+{
+ protected final LogSubject _logSubject;
+ private MessageStore _store;
+
+ private OperationalLoggingListener(final MessageStore store, LogSubject logSubject)
+ {
+ _logSubject = logSubject;
+ store.addEventListener(this, Event.BEFORE_INIT, Event.AFTER_INIT, Event.BEFORE_ACTIVATE, Event.AFTER_ACTIVATE, Event.AFTER_CLOSE);
+ _store = store;
+ }
+
+ public void event(Event event)
+ {
+ switch(event)
+ {
+ case BEFORE_INIT:
+ CurrentActor.get().message(_logSubject, ConfigStoreMessages.CREATED());
+ break;
+ case AFTER_INIT:
+ CurrentActor.get().message(_logSubject, MessageStoreMessages.CREATED());
+ CurrentActor.get().message(_logSubject, TransactionLogMessages.CREATED());
+ String storeLocation = _store.getStoreLocation();
+ if (storeLocation != null)
+ {
+ CurrentActor.get().message(_logSubject, MessageStoreMessages.STORE_LOCATION(storeLocation));
+ }
+ break;
+ case BEFORE_ACTIVATE:
+ CurrentActor.get().message(_logSubject, MessageStoreMessages.RECOVERY_START());
+ break;
+ case AFTER_ACTIVATE:
+ CurrentActor.get().message(_logSubject, MessageStoreMessages.RECOVERY_COMPLETE());
+ break;
+ case AFTER_CLOSE:
+ CurrentActor.get().message(_logSubject,MessageStoreMessages.CLOSED());
+ break;
+
+ }
+ }
+
+ public static void listen(final MessageStore store, LogSubject logSubject)
+ {
+ new OperationalLoggingListener(store, logSubject);
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/State.java b/java/broker/src/main/java/org/apache/qpid/server/store/State.java
new file mode 100644
index 0000000000..7cbdede85e
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/State.java
@@ -0,0 +1,38 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public enum State
+{
+
+ INITIAL,
+ CONFIGURING,
+ CONFIGURED,
+ RECOVERING,
+ ACTIVE,
+ QUIESCING,
+ QUIESCED,
+ CLOSING,
+ CLOSED;
+
+
+
+} \ No newline at end of file
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/StateManager.java b/java/broker/src/main/java/org/apache/qpid/server/store/StateManager.java
new file mode 100644
index 0000000000..5998be5bb6
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/StateManager.java
@@ -0,0 +1,151 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+
+import java.util.EnumMap;
+import java.util.Map;
+
+public class StateManager
+{
+ private State _state = State.INITIAL;
+ private EventListener _eventListener;
+
+ private static final Map<State,Map<State, Transition>> _validTransitions = new EnumMap<State, Map<State, Transition>>(State.class);
+
+
+ static class Transition
+ {
+ private final Event _event;
+ private final State _endState;
+ private final State _startState;
+
+ public Transition(State startState, State endState, Event event)
+ {
+ _event = event;
+ _startState = startState;
+ _endState = endState;
+
+ Map<State, Transition> stateTransitions = _validTransitions.get(startState);
+ if(stateTransitions == null)
+ {
+ stateTransitions = new EnumMap<State, Transition>(State.class);
+ _validTransitions.put(startState, stateTransitions);
+ }
+ stateTransitions.put(endState, this);
+ }
+
+ public Event getEvent()
+ {
+ return _event;
+ }
+
+ public State getStartState()
+ {
+ return _startState;
+ }
+
+ public State getEndState()
+ {
+ return _endState;
+ }
+
+ }
+
+ public static final Transition CONFIGURE = new Transition(State.INITIAL, State.CONFIGURING, Event.BEFORE_INIT);
+ public static final Transition CONFIGURE_COMPLETE = new Transition(State.CONFIGURING, State.CONFIGURED, Event.AFTER_INIT);
+ public static final Transition RECOVER = new Transition(State.CONFIGURED, State.RECOVERING, Event.BEFORE_ACTIVATE);
+ public static final Transition ACTIVATE = new Transition(State.RECOVERING, State.ACTIVE, Event.AFTER_ACTIVATE);
+ public static final Transition CLOSE_ACTIVE = new Transition(State.ACTIVE, State.CLOSING, Event.BEFORE_CLOSE);
+ public static final Transition CLOSE_QUIESCED = new Transition(State.QUIESCED, State.CLOSING, Event.BEFORE_CLOSE);
+ public static final Transition CLOSE_COMPLETE = new Transition(State.CLOSING, State.CLOSED, Event.AFTER_CLOSE);
+ public static final Transition QUIESCE = new Transition(State.ACTIVE, State.QUIESCING, Event.BEFORE_PASSIVATE);
+ public static final Transition QUIESCE_COMPLETE = new Transition(State.QUIESCING, State.QUIESCED, Event.BEFORE_PASSIVATE);
+ public static final Transition RESTART = new Transition(State.QUIESCED, State.RECOVERING, Event.BEFORE_ACTIVATE);
+
+
+ public StateManager(final EventManager eventManager)
+ {
+ this(new EventListener()
+ {
+ @Override
+ public void event(Event event)
+ {
+ eventManager.notifyEvent(event);
+ }
+ });
+ }
+
+
+ public StateManager(EventListener eventListener)
+ {
+ _eventListener = eventListener;
+ }
+
+ public synchronized State getState()
+ {
+ return _state;
+ }
+
+ public synchronized void stateTransition(final State current, final State desired)
+ {
+ if (_state != current)
+ {
+ throw new IllegalStateException("Cannot transition to the state: " + desired + "; need to be in state: " + current
+ + "; currently in state: " + _state);
+ }
+ attainState(desired);
+ }
+
+ public synchronized void attainState(State desired)
+ {
+ Transition transition = null;
+ final Map<State, Transition> stateTransitionMap = _validTransitions.get(_state);
+ if(stateTransitionMap != null)
+ {
+ transition = stateTransitionMap.get(desired);
+ }
+ if(transition == null)
+ {
+ throw new IllegalStateException("No valid transition from state " + _state + " to state " + desired);
+ }
+ _state = desired;
+ _eventListener.event(transition.getEvent());
+ }
+
+ public synchronized boolean isInState(State testedState)
+ {
+ return _state.equals(testedState);
+ }
+
+ public synchronized boolean isNotInState(State testedState)
+ {
+ return !isInState(testedState);
+ }
+
+ public synchronized void checkInState(State checkedState)
+ {
+ if (isNotInState(checkedState))
+ {
+ throw new IllegalStateException("Unexpected state. Was : " + _state + " but expected : " + checkedState);
+ }
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/StoreFuture.java b/java/broker/src/main/java/org/apache/qpid/server/store/StoreFuture.java
new file mode 100644
index 0000000000..7d3bf90a75
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/StoreFuture.java
@@ -0,0 +1,40 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.qpid.server.store;
+
+public interface StoreFuture
+{
+ StoreFuture IMMEDIATE_FUTURE = new StoreFuture()
+ {
+ public boolean isComplete()
+ {
+ return true;
+ }
+
+ public void waitForCompletion()
+ {
+ }
+ };
+
+ boolean isComplete();
+
+ void waitForCompletion();
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/StoredMemoryMessage.java b/java/broker/src/main/java/org/apache/qpid/server/store/StoredMemoryMessage.java
index 144cc629bd..e7302270bb 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/store/StoredMemoryMessage.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/StoredMemoryMessage.java
@@ -122,9 +122,9 @@ public class StoredMemoryMessage implements StoredMessage
return buf;
}
- public MessageStore.StoreFuture flushToStore()
+ public StoreFuture flushToStore()
{
- return MessageStore.IMMEDIATE_FUTURE;
+ return StoreFuture.IMMEDIATE_FUTURE;
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/StoredMessage.java b/java/broker/src/main/java/org/apache/qpid/server/store/StoredMessage.java
index d4a0381929..7909003855 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/store/StoredMessage.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/StoredMessage.java
@@ -34,7 +34,7 @@ public interface StoredMessage<M extends StorableMessageMetaData>
ByteBuffer getContent(int offsetInMessage, int size);
- MessageStore.StoreFuture flushToStore();
+ StoreFuture flushToStore();
void remove();
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/Transaction.java b/java/broker/src/main/java/org/apache/qpid/server/store/Transaction.java
new file mode 100644
index 0000000000..ed6b89e373
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/Transaction.java
@@ -0,0 +1,81 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.server.message.EnqueableMessage;
+
+public interface Transaction
+{
+ /**
+ * Places a message onto a specified queue, in a given transactional context.
+ *
+ *
+ *
+ * @param queue The queue to place the message on.
+ * @param message
+ * @throws org.apache.qpid.AMQStoreException If the operation fails for any reason.
+ */
+ void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException;
+
+ /**
+ * Extracts a message from a specified queue, in a given transactional context.
+ *
+ * @param queue The queue to place the message on.
+ * @param message The message to dequeue.
+ * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
+ */
+ void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException;
+
+
+ /**
+ * Commits all operations performed within a given transactional context.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ void commitTran() throws AMQStoreException;
+
+ /**
+ * Commits all operations performed within a given transactional context.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ StoreFuture commitTranAsync() throws AMQStoreException;
+
+ /**
+ * Abandons all operations performed within a given transactional context.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ void abortTran() throws AMQStoreException;
+
+
+ public static interface Record
+ {
+ TransactionLogResource getQueue();
+ EnqueableMessage getMessage();
+ }
+
+ void removeXid(long format, byte[] globalId, byte[] branchId) throws AMQStoreException;
+
+ void recordXid(long format, byte[] globalId, byte[] branchId, Transaction.Record[] enqueues, Transaction.Record[] dequeues)
+ throws AMQStoreException;
+} \ No newline at end of file
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogRecoveryHandler.java b/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogRecoveryHandler.java
index 802596ed1e..bd4da648f9 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogRecoveryHandler.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogRecoveryHandler.java
@@ -20,14 +20,23 @@
*/
package org.apache.qpid.server.store;
+import java.util.UUID;
+
public interface TransactionLogRecoveryHandler
{
QueueEntryRecoveryHandler begin(MessageStore log);
public static interface QueueEntryRecoveryHandler
{
- void queueEntry(String queuename, long messageId);
+ DtxRecordRecoveryHandler completeQueueEntryRecovery();
+
+ void queueEntry(UUID queueId, long messageId);
+ }
+
+ public static interface DtxRecordRecoveryHandler
+ {
+ void dtxRecord(long format, byte[] globalId, byte[] branchId, Transaction.Record[] enqueues, Transaction.Record[] dequeues);
- void completeQueueEntryRecovery();
+ void completeDtxRecordRecovery();
}
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogResource.java b/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogResource.java
index 0d81dd151d..576dca847d 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogResource.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogResource.java
@@ -20,7 +20,9 @@
*/
package org.apache.qpid.server.store;
+import java.util.UUID;
+
public interface TransactionLogResource
{
- public String getResourceName();
+ public UUID getId();
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java b/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java
new file mode 100644
index 0000000000..0371cdcfcb
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java
@@ -0,0 +1,2449 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.qpid.server.store.derby;
+
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.lang.ref.SoftReference;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.sql.Blob;
+import java.sql.Connection;
+import java.sql.Driver;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.commons.configuration.Configuration;
+import org.apache.log4j.Logger;
+import org.apache.qpid.AMQException;
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.binding.Binding;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.federation.Bridge;
+import org.apache.qpid.server.federation.BrokerLink;
+import org.apache.qpid.server.message.EnqueableMessage;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler;
+import org.apache.qpid.server.store.ConfiguredObjectHelper;
+import org.apache.qpid.server.store.ConfiguredObjectRecord;
+import org.apache.qpid.server.store.Event;
+import org.apache.qpid.server.store.EventListener;
+import org.apache.qpid.server.store.EventManager;
+import org.apache.qpid.server.store.MessageMetaDataType;
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreConstants;
+import org.apache.qpid.server.store.MessageStoreRecoveryHandler;
+import org.apache.qpid.server.store.State;
+import org.apache.qpid.server.store.StateManager;
+import org.apache.qpid.server.store.StorableMessageMetaData;
+import org.apache.qpid.server.store.StoreFuture;
+import org.apache.qpid.server.store.StoredMemoryMessage;
+import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.store.Transaction;
+import org.apache.qpid.server.store.TransactionLogRecoveryHandler;
+import org.apache.qpid.server.store.TransactionLogResource;
+
+/**
+ * An implementation of a {@link MessageStore} that uses Apache Derby as the persistence
+ * mechanism.
+ *
+ * TODO extract the SQL statements into a generic JDBC store
+ */
+public class DerbyMessageStore implements MessageStore
+{
+
+ private static final Logger _logger = Logger.getLogger(DerbyMessageStore.class);
+
+ private static final String SQL_DRIVER_NAME = "org.apache.derby.jdbc.EmbeddedDriver";
+
+ private static final String DB_VERSION_TABLE_NAME = "QPID_DB_VERSION";
+
+ private static final String QUEUE_ENTRY_TABLE_NAME = "QPID_QUEUE_ENTRIES";
+
+ private static final String META_DATA_TABLE_NAME = "QPID_MESSAGE_METADATA";
+ private static final String MESSAGE_CONTENT_TABLE_NAME = "QPID_MESSAGE_CONTENT";
+
+ private static final String LINKS_TABLE_NAME = "QPID_LINKS";
+ private static final String BRIDGES_TABLE_NAME = "QPID_BRIDGES";
+
+ private static final String XID_TABLE_NAME = "QPID_XIDS";
+ private static final String XID_ACTIONS_TABLE_NAME = "QPID_XID_ACTIONS";
+
+ private static final String CONFIGURED_OBJECTS_TABLE_NAME = "QPID_CONFIGURED_OBJECTS";
+
+ private static final int DB_VERSION = 6;
+
+
+
+ private static Class<Driver> DRIVER_CLASS;
+
+ private final AtomicLong _messageId = new AtomicLong(0);
+ private AtomicBoolean _closed = new AtomicBoolean(false);
+
+ private String _connectionURL;
+
+ private static final String TABLE_EXISTANCE_QUERY = "SELECT 1 FROM SYS.SYSTABLES WHERE TABLENAME = ?";
+
+ private static final String CREATE_DB_VERSION_TABLE = "CREATE TABLE "+DB_VERSION_TABLE_NAME+" ( version int not null )";
+ private static final String INSERT_INTO_DB_VERSION = "INSERT INTO "+DB_VERSION_TABLE_NAME+" ( version ) VALUES ( ? )";
+
+ private static final String CREATE_QUEUE_ENTRY_TABLE = "CREATE TABLE "+QUEUE_ENTRY_TABLE_NAME+" ( queue_id varchar(36) not null, message_id bigint not null, PRIMARY KEY (queue_id, message_id) )";
+ private static final String INSERT_INTO_QUEUE_ENTRY = "INSERT INTO " + QUEUE_ENTRY_TABLE_NAME + " (queue_id, message_id) values (?,?)";
+ private static final String DELETE_FROM_QUEUE_ENTRY = "DELETE FROM " + QUEUE_ENTRY_TABLE_NAME + " WHERE queue_id = ? AND message_id =?";
+ private static final String SELECT_FROM_QUEUE_ENTRY = "SELECT queue_id, message_id FROM " + QUEUE_ENTRY_TABLE_NAME + " ORDER BY queue_id, message_id";
+
+
+ private static final String CREATE_META_DATA_TABLE = "CREATE TABLE " + META_DATA_TABLE_NAME
+ + " ( message_id bigint not null, meta_data blob, PRIMARY KEY ( message_id ) )";
+ private static final String CREATE_MESSAGE_CONTENT_TABLE = "CREATE TABLE " + MESSAGE_CONTENT_TABLE_NAME
+ + " ( message_id bigint not null, content blob , PRIMARY KEY (message_id) )";
+
+ private static final String INSERT_INTO_MESSAGE_CONTENT = "INSERT INTO " + MESSAGE_CONTENT_TABLE_NAME
+ + "( message_id, content ) values (?, ?)";
+ private static final String SELECT_FROM_MESSAGE_CONTENT = "SELECT content FROM " + MESSAGE_CONTENT_TABLE_NAME
+ + " WHERE message_id = ?";
+ private static final String DELETE_FROM_MESSAGE_CONTENT = "DELETE FROM " + MESSAGE_CONTENT_TABLE_NAME
+ + " WHERE message_id = ?";
+
+ private static final String INSERT_INTO_META_DATA = "INSERT INTO " + META_DATA_TABLE_NAME + "( message_id , meta_data ) values (?, ?)";;
+ private static final String SELECT_FROM_META_DATA =
+ "SELECT meta_data FROM " + META_DATA_TABLE_NAME + " WHERE message_id = ?";
+ private static final String DELETE_FROM_META_DATA = "DELETE FROM " + META_DATA_TABLE_NAME + " WHERE message_id = ?";
+ private static final String SELECT_ALL_FROM_META_DATA = "SELECT message_id, meta_data FROM " + META_DATA_TABLE_NAME;
+
+ private static final String CREATE_LINKS_TABLE =
+ "CREATE TABLE "+LINKS_TABLE_NAME+" ( id_lsb bigint not null,"
+ + " id_msb bigint not null,"
+ + " create_time bigint not null,"
+ + " arguments blob, PRIMARY KEY ( id_lsb, id_msb ))";
+ private static final String SELECT_FROM_LINKS =
+ "SELECT create_time, arguments FROM " + LINKS_TABLE_NAME + " WHERE id_lsb = ? and id_msb";
+ private static final String DELETE_FROM_LINKS = "DELETE FROM " + LINKS_TABLE_NAME
+ + " WHERE id_lsb = ? and id_msb = ?";
+ private static final String SELECT_ALL_FROM_LINKS = "SELECT id_lsb, id_msb, create_time, "
+ + "arguments FROM " + LINKS_TABLE_NAME;
+ private static final String FIND_LINK = "SELECT id_lsb, id_msb FROM " + LINKS_TABLE_NAME + " WHERE id_lsb = ? and"
+ + " id_msb = ?";
+ private static final String INSERT_INTO_LINKS = "INSERT INTO " + LINKS_TABLE_NAME + "( id_lsb, "
+ + "id_msb, create_time, arguments ) values (?, ?, ?, ?)";
+
+
+ private static final String CREATE_BRIDGES_TABLE =
+ "CREATE TABLE "+BRIDGES_TABLE_NAME+" ( id_lsb bigint not null,"
+ + " id_msb bigint not null,"
+ + " create_time bigint not null,"
+ + " link_id_lsb bigint not null,"
+ + " link_id_msb bigint not null,"
+ + " arguments blob, PRIMARY KEY ( id_lsb, id_msb ))";
+ private static final String SELECT_FROM_BRIDGES =
+ "SELECT create_time, link_id_lsb, link_id_msb, arguments FROM "
+ + BRIDGES_TABLE_NAME + " WHERE id_lsb = ? and id_msb = ?";
+ private static final String DELETE_FROM_BRIDGES = "DELETE FROM " + BRIDGES_TABLE_NAME
+ + " WHERE id_lsb = ? and id_msb = ?";
+ private static final String SELECT_ALL_FROM_BRIDGES = "SELECT id_lsb, id_msb, "
+ + " create_time,"
+ + " link_id_lsb, link_id_msb, "
+ + "arguments FROM " + BRIDGES_TABLE_NAME
+ + " WHERE link_id_lsb = ? and link_id_msb = ?";
+ private static final String FIND_BRIDGE = "SELECT id_lsb, id_msb FROM " + BRIDGES_TABLE_NAME +
+ " WHERE id_lsb = ? and id_msb = ?";
+ private static final String INSERT_INTO_BRIDGES = "INSERT INTO " + BRIDGES_TABLE_NAME + "( id_lsb, id_msb, "
+ + "create_time, "
+ + "link_id_lsb, link_id_msb, "
+ + "arguments )"
+ + " values (?, ?, ?, ?, ?, ?)";
+
+ private static final String CREATE_XIDS_TABLE =
+ "CREATE TABLE "+XID_TABLE_NAME+" ( format bigint not null,"
+ + " global_id varchar(64) for bit data, branch_id varchar(64) for bit data, PRIMARY KEY ( format, " +
+ "global_id, branch_id ))";
+ private static final String INSERT_INTO_XIDS =
+ "INSERT INTO "+XID_TABLE_NAME+" ( format, global_id, branch_id ) values (?, ?, ?)";
+ private static final String DELETE_FROM_XIDS = "DELETE FROM " + XID_TABLE_NAME
+ + " WHERE format = ? and global_id = ? and branch_id = ?";
+ private static final String SELECT_ALL_FROM_XIDS = "SELECT format, global_id, branch_id FROM " + XID_TABLE_NAME;
+
+
+ private static final String CREATE_XID_ACTIONS_TABLE =
+ "CREATE TABLE "+XID_ACTIONS_TABLE_NAME+" ( format bigint not null,"
+ + " global_id varchar(64) for bit data not null, branch_id varchar(64) for bit data not null, " +
+ "action_type char not null, queue_id varchar(36) not null, message_id bigint not null" +
+ ", PRIMARY KEY ( " +
+ "format, global_id, branch_id, action_type, queue_id, message_id))";
+ private static final String INSERT_INTO_XID_ACTIONS =
+ "INSERT INTO "+XID_ACTIONS_TABLE_NAME+" ( format, global_id, branch_id, action_type, " +
+ "queue_id, message_id ) values (?,?,?,?,?,?) ";
+ private static final String DELETE_FROM_XID_ACTIONS = "DELETE FROM " + XID_ACTIONS_TABLE_NAME
+ + " WHERE format = ? and global_id = ? and branch_id = ?";
+ private static final String SELECT_ALL_FROM_XID_ACTIONS =
+ "SELECT action_type, queue_id, message_id FROM " + XID_ACTIONS_TABLE_NAME +
+ " WHERE format = ? and global_id = ? and branch_id = ?";
+
+ private static final String CREATE_CONFIGURED_OBJECTS_TABLE = "CREATE TABLE " + CONFIGURED_OBJECTS_TABLE_NAME
+ + " ( id VARCHAR(36) not null, object_type varchar(255), attributes blob, PRIMARY KEY (id))";
+ private static final String INSERT_INTO_CONFIGURED_OBJECTS = "INSERT INTO " + CONFIGURED_OBJECTS_TABLE_NAME
+ + " ( id, object_type, attributes) VALUES (?,?,?)";
+ private static final String UPDATE_CONFIGURED_OBJECTS = "UPDATE " + CONFIGURED_OBJECTS_TABLE_NAME
+ + " set object_type =?, attributes = ? where id = ?";
+ private static final String DELETE_FROM_CONFIGURED_OBJECTS = "DELETE FROM " + CONFIGURED_OBJECTS_TABLE_NAME
+ + " where id = ?";
+ private static final String FIND_CONFIGURED_OBJECT = "SELECT object_type, attributes FROM " + CONFIGURED_OBJECTS_TABLE_NAME
+ + " where id = ?";
+ private static final String SELECT_FROM_CONFIGURED_OBJECTS = "SELECT id, object_type, attributes FROM " + CONFIGURED_OBJECTS_TABLE_NAME;
+
+ private final Charset UTF8_CHARSET = Charset.forName("UTF-8");
+
+ private static final String DERBY_SINGLE_DB_SHUTDOWN_CODE = "08006";
+
+ private final StateManager _stateManager;
+
+ private final EventManager _eventManager = new EventManager();
+
+ private MessageStoreRecoveryHandler _messageRecoveryHandler;
+
+ private TransactionLogRecoveryHandler _tlogRecoveryHandler;
+
+ private ConfigurationRecoveryHandler _configRecoveryHandler;
+ private String _storeLocation;
+
+ public DerbyMessageStore()
+ {
+ _stateManager = new StateManager(_eventManager);
+ }
+
+ private ConfiguredObjectHelper _configuredObjectHelper = new ConfiguredObjectHelper();
+
+ @Override
+ public void configureConfigStore(String name,
+ ConfigurationRecoveryHandler configRecoveryHandler,
+ Configuration storeConfiguration) throws Exception
+ {
+ _stateManager.attainState(State.CONFIGURING);
+ _configRecoveryHandler = configRecoveryHandler;
+
+ commonConfiguration(name, storeConfiguration);
+
+ }
+
+ @Override
+ public void configureMessageStore(String name,
+ MessageStoreRecoveryHandler recoveryHandler,
+ TransactionLogRecoveryHandler tlogRecoveryHandler,
+ Configuration storeConfiguration) throws Exception
+ {
+ _tlogRecoveryHandler = tlogRecoveryHandler;
+ _messageRecoveryHandler = recoveryHandler;
+
+ _stateManager.attainState(State.CONFIGURED);
+ }
+
+ @Override
+ public void activate() throws Exception
+ {
+ _stateManager.attainState(State.RECOVERING);
+
+ // this recovers durable exchanges, queues, and bindings
+ recoverConfiguration(_configRecoveryHandler);
+ recoverMessages(_messageRecoveryHandler);
+ TransactionLogRecoveryHandler.DtxRecordRecoveryHandler dtxrh = recoverQueueEntries(_tlogRecoveryHandler);
+ recoverXids(dtxrh);
+
+ _stateManager.attainState(State.ACTIVE);
+ }
+
+ private void commonConfiguration(String name, Configuration storeConfiguration)
+ throws ClassNotFoundException, SQLException
+ {
+ initialiseDriver();
+
+ //Update to pick up QPID_WORK and use that as the default location not just derbyDB
+
+ final String databasePath = storeConfiguration.getString(MessageStoreConstants.ENVIRONMENT_PATH_PROPERTY, System.getProperty("QPID_WORK")
+ + File.separator + "derbyDB");
+
+ File environmentPath = new File(databasePath);
+ if (!environmentPath.exists())
+ {
+ if (!environmentPath.mkdirs())
+ {
+ throw new IllegalArgumentException("Environment path " + environmentPath + " could not be read or created. "
+ + "Ensure the path is correct and that the permissions are correct.");
+ }
+ }
+
+ _storeLocation = databasePath;
+
+ createOrOpenDatabase(name, databasePath);
+ }
+
+ private static synchronized void initialiseDriver() throws ClassNotFoundException
+ {
+ if(DRIVER_CLASS == null)
+ {
+ DRIVER_CLASS = (Class<Driver>) Class.forName(SQL_DRIVER_NAME);
+ }
+ }
+
+ private void createOrOpenDatabase(String name, final String environmentPath) throws SQLException
+ {
+ //FIXME this the _vhost name should not be added here, but derby wont use an empty directory as was possibly just created.
+ _connectionURL = "jdbc:derby:" + environmentPath + "/" + name + ";create=true";
+
+ Connection conn = newAutoCommitConnection();
+
+ createVersionTable(conn);
+ createConfiguredObjectsTable(conn);
+ createQueueEntryTable(conn);
+ createMetaDataTable(conn);
+ createMessageContentTable(conn);
+ createLinkTable(conn);
+ createBridgeTable(conn);
+ createXidTable(conn);
+ createXidActionTable(conn);
+ conn.close();
+ }
+
+
+
+ private void createVersionTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(DB_VERSION_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_DB_VERSION_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ PreparedStatement pstmt = conn.prepareStatement(INSERT_INTO_DB_VERSION);
+ try
+ {
+ pstmt.setInt(1, DB_VERSION);
+ pstmt.execute();
+ }
+ finally
+ {
+ pstmt.close();
+ }
+ }
+
+ }
+
+ private void createConfiguredObjectsTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(CONFIGURED_OBJECTS_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_CONFIGURED_OBJECTS_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ }
+
+ private void createQueueEntryTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(QUEUE_ENTRY_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_QUEUE_ENTRY_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+
+ }
+
+ private void createMetaDataTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(META_DATA_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_META_DATA_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+
+ }
+
+
+ private void createMessageContentTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(MESSAGE_CONTENT_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_MESSAGE_CONTENT_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+
+ }
+
+ private void createLinkTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(LINKS_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_LINKS_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ }
+
+
+ private void createBridgeTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(BRIDGES_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_BRIDGES_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ }
+
+ private void createXidTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(XID_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_XIDS_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ }
+
+
+ private void createXidActionTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(XID_ACTIONS_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_XID_ACTIONS_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ }
+
+ private boolean tableExists(final String tableName, final Connection conn) throws SQLException
+ {
+ PreparedStatement stmt = conn.prepareStatement(TABLE_EXISTANCE_QUERY);
+ try
+ {
+ stmt.setString(1, tableName);
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+ return rs.next();
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+
+ private void recoverConfiguration(ConfigurationRecoveryHandler recoveryHandler) throws AMQException
+ {
+ try
+ {
+ List<ConfiguredObjectRecord> configuredObjects = loadConfiguredObjects();
+ ConfigurationRecoveryHandler.QueueRecoveryHandler qrh = recoveryHandler.begin(this);
+ _configuredObjectHelper.recoverQueues(qrh, configuredObjects);
+
+ ConfigurationRecoveryHandler.ExchangeRecoveryHandler erh = qrh.completeQueueRecovery();
+ _configuredObjectHelper.recoverExchanges(erh, configuredObjects);
+
+ ConfigurationRecoveryHandler.BindingRecoveryHandler brh = erh.completeExchangeRecovery();
+ _configuredObjectHelper.recoverBindings(brh, configuredObjects);
+
+ ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh = brh.completeBindingRecovery();
+ recoverBrokerLinks(lrh);
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error recovering persistent state: " + e.getMessage(), e);
+ }
+ }
+
+ private void recoverBrokerLinks(final ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh)
+ throws SQLException
+ {
+ _logger.info("Recovering broker links...");
+
+ Connection conn = null;
+ try
+ {
+ conn = newAutoCommitConnection();
+
+ PreparedStatement stmt = conn.prepareStatement(SELECT_ALL_FROM_LINKS);
+
+ try
+ {
+ ResultSet rs = stmt.executeQuery();
+
+ try
+ {
+
+ while(rs.next())
+ {
+ UUID id = new UUID(rs.getLong(2), rs.getLong(1));
+ long createTime = rs.getLong(3);
+ Blob argumentsAsBlob = rs.getBlob(4);
+
+ byte[] dataAsBytes = argumentsAsBlob.getBytes(1,(int) argumentsAsBlob.length());
+
+ DataInputStream dis = new DataInputStream(new ByteArrayInputStream(dataAsBytes));
+ int size = dis.readInt();
+
+ Map<String,String> arguments = new HashMap<String, String>();
+
+ for(int i = 0; i < size; i++)
+ {
+ arguments.put(dis.readUTF(), dis.readUTF());
+ }
+
+ ConfigurationRecoveryHandler.BridgeRecoveryHandler brh = lrh.brokerLink(id, createTime, arguments);
+
+ recoverBridges(brh, id);
+
+ }
+ }
+ catch (IOException e)
+ {
+ throw new SQLException(e.getMessage(), e);
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ }
+ finally
+ {
+ if(conn != null)
+ {
+ conn.close();
+ }
+ }
+
+ }
+
+ private void recoverBridges(final ConfigurationRecoveryHandler.BridgeRecoveryHandler brh, final UUID linkId)
+ throws SQLException
+ {
+ _logger.info("Recovering bridges for link " + linkId + "...");
+
+ Connection conn = null;
+ try
+ {
+ conn = newAutoCommitConnection();
+
+ PreparedStatement stmt = conn.prepareStatement(SELECT_ALL_FROM_BRIDGES);
+
+ try
+ {
+ stmt.setLong(1, linkId.getLeastSignificantBits());
+ stmt.setLong(2, linkId.getMostSignificantBits());
+
+ ResultSet rs = stmt.executeQuery();
+
+ try
+ {
+
+ while(rs.next())
+ {
+ UUID id = new UUID(rs.getLong(2), rs.getLong(1));
+ long createTime = rs.getLong(3);
+ Blob argumentsAsBlob = rs.getBlob(6);
+
+ byte[] dataAsBytes = argumentsAsBlob.getBytes(1,(int) argumentsAsBlob.length());
+
+ DataInputStream dis = new DataInputStream(new ByteArrayInputStream(dataAsBytes));
+ int size = dis.readInt();
+
+ Map<String,String> arguments = new HashMap<String, String>();
+
+ for(int i = 0; i < size; i++)
+ {
+ arguments.put(dis.readUTF(), dis.readUTF());
+ }
+
+ brh.bridge(id, createTime, arguments);
+
+ }
+ brh.completeBridgeRecoveryForLink();
+ }
+ catch (IOException e)
+ {
+ throw new SQLException(e.getMessage(), e);
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ }
+ finally
+ {
+ if(conn != null)
+ {
+ conn.close();
+ }
+ }
+
+ }
+
+ @Override
+ public void close() throws Exception
+ {
+ _closed.getAndSet(true);
+ _stateManager.stateTransition(State.ACTIVE, State.CLOSING);
+
+ try
+ {
+ Connection conn = DriverManager.getConnection(_connectionURL + ";shutdown=true");
+ // Shouldn't reach this point - shutdown=true should throw SQLException
+ conn.close();
+ _logger.error("Unable to shut down the store");
+ }
+ catch (SQLException e)
+ {
+ if (e.getSQLState().equalsIgnoreCase(DERBY_SINGLE_DB_SHUTDOWN_CODE))
+ {
+ //expected and represents a clean shutdown of this database only, do nothing.
+ }
+ else
+ {
+ _logger.error("Exception whilst shutting down the store: " + e);
+ }
+ }
+
+ _stateManager.stateTransition(State.CLOSING, State.CLOSED);
+ }
+
+ @Override
+ public StoredMessage addMessage(StorableMessageMetaData metaData)
+ {
+ if(metaData.isPersistent())
+ {
+ return new StoredDerbyMessage(_messageId.incrementAndGet(), metaData);
+ }
+ else
+ {
+ return new StoredMemoryMessage(_messageId.incrementAndGet(), metaData);
+ }
+ }
+
+ public StoredMessage getMessage(long messageNumber)
+ {
+ return null;
+ }
+
+ public void removeMessage(long messageId)
+ {
+ try
+ {
+ Connection conn = newConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_META_DATA);
+ try
+ {
+ stmt.setLong(1,messageId);
+ int results = stmt.executeUpdate();
+ stmt.close();
+
+ if (results == 0)
+ {
+ _logger.warn("Message metadata not found for message id " + messageId);
+ }
+
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Deleted metadata for message " + messageId);
+ }
+
+ stmt = conn.prepareStatement(DELETE_FROM_MESSAGE_CONTENT);
+ stmt.setLong(1,messageId);
+ results = stmt.executeUpdate();
+ }
+ finally
+ {
+ stmt.close();
+ }
+ conn.commit();
+ }
+ catch(SQLException e)
+ {
+ try
+ {
+ conn.rollback();
+ }
+ catch(SQLException t)
+ {
+ // ignore - we are re-throwing underlying exception
+ }
+
+ throw e;
+
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new RuntimeException("Error removing message with id " + messageId + " from database: " + e.getMessage(), e);
+ }
+
+ }
+
+ @Override
+ public void createExchange(Exchange exchange) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ ConfiguredObjectRecord configuredObject = _configuredObjectHelper.createExchangeConfiguredObject(exchange);
+ insertConfiguredObject(configuredObject);
+ }
+
+ }
+
+ @Override
+ public void removeExchange(Exchange exchange) throws AMQStoreException
+ {
+ int results = removeConfiguredObject(exchange.getId());
+ if (results == 0)
+ {
+ throw new AMQStoreException("Exchange " + exchange.getName() + " with id " + exchange.getId() + " not found");
+ }
+ }
+
+ @Override
+ public void bindQueue(Binding binding)
+ throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ ConfiguredObjectRecord configuredObject = _configuredObjectHelper.createBindingConfiguredObject(binding);
+ insertConfiguredObject(configuredObject);
+ }
+ }
+
+ @Override
+ public void unbindQueue(Binding binding)
+ throws AMQStoreException
+ {
+ int results = removeConfiguredObject(binding.getId());
+ if (results == 0)
+ {
+ throw new AMQStoreException("Binding " + binding + " not found");
+ }
+ }
+
+ @Override
+ public void createQueue(AMQQueue queue) throws AMQStoreException
+ {
+ createQueue(queue, null);
+ }
+
+ @Override
+ public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
+ {
+ _logger.debug("public void createQueue(AMQQueue queue = " + queue + "): called");
+
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ ConfiguredObjectRecord queueConfiguredObject = _configuredObjectHelper.createQueueConfiguredObject(queue, arguments);
+ insertConfiguredObject(queueConfiguredObject);
+ }
+ }
+
+ /**
+ * Updates the specified queue in the persistent store, IF it is already present. If the queue
+ * is not present in the store, it will not be added.
+ *
+ * NOTE: Currently only updates the exclusivity.
+ *
+ * @param queue The queue to update the entry for.
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ @Override
+ public void updateQueue(final AMQQueue queue) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ ConfiguredObjectRecord queueConfiguredObject = loadConfiguredObject(queue.getId());
+ if (queueConfiguredObject != null)
+ {
+ ConfiguredObjectRecord newQueueRecord = _configuredObjectHelper.updateQueueConfiguredObject(queue, queueConfiguredObject);
+ updateConfiguredObject(newQueueRecord);
+ }
+ }
+
+ }
+
+ /**
+ * Convenience method to create a new Connection configured for TRANSACTION_READ_COMMITED
+ * isolation and with auto-commit transactions enabled.
+ */
+ private Connection newAutoCommitConnection() throws SQLException
+ {
+ final Connection connection = newConnection();
+ try
+ {
+ connection.setAutoCommit(true);
+ }
+ catch (SQLException sqlEx)
+ {
+
+ try
+ {
+ connection.close();
+ }
+ finally
+ {
+ throw sqlEx;
+ }
+ }
+
+ return connection;
+ }
+
+ /**
+ * Convenience method to create a new Connection configured for TRANSACTION_READ_COMMITED
+ * isolation and with auto-commit transactions disabled.
+ */
+ private Connection newConnection() throws SQLException
+ {
+ final Connection connection = DriverManager.getConnection(_connectionURL);
+ try
+ {
+ connection.setAutoCommit(false);
+ connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+ }
+ catch (SQLException sqlEx)
+ {
+ try
+ {
+ connection.close();
+ }
+ finally
+ {
+ throw sqlEx;
+ }
+ }
+ return connection;
+ }
+
+ @Override
+ public void removeQueue(final AMQQueue queue) throws AMQStoreException
+ {
+ AMQShortString name = queue.getNameShortString();
+ _logger.debug("public void removeQueue(AMQShortString name = " + name + "): called");
+ int results = removeConfiguredObject(queue.getId());
+ if (results == 0)
+ {
+ throw new AMQStoreException("Queue " + name + " with id " + queue.getId() + " not found");
+ }
+ }
+
+ @Override
+ public void createBrokerLink(final BrokerLink link) throws AMQStoreException
+ {
+ _logger.debug("public void createBrokerLink(BrokerLink = " + link + "): called");
+
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ try
+ {
+ Connection conn = newAutoCommitConnection();
+
+ PreparedStatement stmt = conn.prepareStatement(FIND_LINK);
+ try
+ {
+
+ stmt.setLong(1, link.getId().getLeastSignificantBits());
+ stmt.setLong(2, link.getId().getMostSignificantBits());
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+
+ // If we don't have any data in the result set then we can add this queue
+ if (!rs.next())
+ {
+ PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_LINKS);
+
+ try
+ {
+
+ insertStmt.setLong(1, link.getId().getLeastSignificantBits());
+ insertStmt.setLong(2, link.getId().getMostSignificantBits());
+ insertStmt.setLong(3, link.getCreateTime());
+
+ byte[] argumentBytes = convertStringMapToBytes(link.getArguments());
+ ByteArrayInputStream bis = new ByteArrayInputStream(argumentBytes);
+
+ insertStmt.setBinaryStream(4,bis,argumentBytes.length);
+
+ insertStmt.execute();
+ }
+ finally
+ {
+ insertStmt.close();
+ }
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ conn.close();
+
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error writing " + link + " to database: " + e.getMessage(), e);
+ }
+ }
+ }
+
+ private byte[] convertStringMapToBytes(final Map<String, String> arguments) throws AMQStoreException
+ {
+ byte[] argumentBytes;
+ if(arguments == null)
+ {
+ argumentBytes = new byte[0];
+ }
+ else
+ {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ DataOutputStream dos = new DataOutputStream(bos);
+
+
+ try
+ {
+ dos.writeInt(arguments.size());
+ for(Map.Entry<String,String> arg : arguments.entrySet())
+ {
+ dos.writeUTF(arg.getKey());
+ dos.writeUTF(arg.getValue());
+ }
+ }
+ catch (IOException e)
+ {
+ // This should never happen
+ throw new AMQStoreException(e.getMessage(), e);
+ }
+ argumentBytes = bos.toByteArray();
+ }
+ return argumentBytes;
+ }
+
+ @Override
+ public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
+ {
+ _logger.debug("public void deleteBrokerLink( " + link + "): called");
+ Connection conn = null;
+ PreparedStatement stmt = null;
+ try
+ {
+ conn = newAutoCommitConnection();
+ stmt = conn.prepareStatement(DELETE_FROM_LINKS);
+ stmt.setLong(1, link.getId().getLeastSignificantBits());
+ stmt.setLong(2, link.getId().getMostSignificantBits());
+ int results = stmt.executeUpdate();
+
+ if (results == 0)
+ {
+ throw new AMQStoreException("Link " + link + " not found");
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error deleting Link " + link + " from database: " + e.getMessage(), e);
+ }
+ finally
+ {
+ closePreparedStatement(stmt);
+ closeConnection(conn);
+ }
+
+
+ }
+
+ @Override
+ public void createBridge(final Bridge bridge) throws AMQStoreException
+ {
+ _logger.debug("public void createBridge(BrokerLink = " + bridge + "): called");
+
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ try
+ {
+ Connection conn = newAutoCommitConnection();
+
+ PreparedStatement stmt = conn.prepareStatement(FIND_BRIDGE);
+ try
+ {
+
+ UUID id = bridge.getId();
+ stmt.setLong(1, id.getLeastSignificantBits());
+ stmt.setLong(2, id.getMostSignificantBits());
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+
+ // If we don't have any data in the result set then we can add this queue
+ if (!rs.next())
+ {
+ PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_BRIDGES);
+
+ try
+ {
+
+ insertStmt.setLong(1, id.getLeastSignificantBits());
+ insertStmt.setLong(2, id.getMostSignificantBits());
+
+ insertStmt.setLong(3, bridge.getCreateTime());
+
+ UUID linkId = bridge.getLink().getId();
+ insertStmt.setLong(4, linkId.getLeastSignificantBits());
+ insertStmt.setLong(5, linkId.getMostSignificantBits());
+
+ byte[] argumentBytes = convertStringMapToBytes(bridge.getArguments());
+ ByteArrayInputStream bis = new ByteArrayInputStream(argumentBytes);
+
+ insertStmt.setBinaryStream(6,bis,argumentBytes.length);
+
+ insertStmt.execute();
+ }
+ finally
+ {
+ insertStmt.close();
+ }
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ conn.close();
+
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error writing " + bridge + " to database: " + e.getMessage(), e);
+ }
+ }
+ }
+
+ @Override
+ public void deleteBridge(final Bridge bridge) throws AMQStoreException
+ {
+ _logger.debug("public void deleteBridge( " + bridge + "): called");
+ Connection conn = null;
+ PreparedStatement stmt = null;
+ try
+ {
+ conn = newAutoCommitConnection();
+ stmt = conn.prepareStatement(DELETE_FROM_BRIDGES);
+ stmt.setLong(1, bridge.getId().getLeastSignificantBits());
+ stmt.setLong(2, bridge.getId().getMostSignificantBits());
+ int results = stmt.executeUpdate();
+
+ if (results == 0)
+ {
+ throw new AMQStoreException("Bridge " + bridge + " not found");
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error deleting bridge " + bridge + " from database: " + e.getMessage(), e);
+ }
+ finally
+ {
+ closePreparedStatement(stmt);
+ closeConnection(conn);
+ }
+
+ }
+
+ @Override
+ public Transaction newTransaction()
+ {
+ return new DerbyTransaction();
+ }
+
+ public void enqueueMessage(ConnectionWrapper connWrapper, final TransactionLogResource queue, Long messageId) throws AMQStoreException
+ {
+ Connection conn = connWrapper.getConnection();
+
+
+ try
+ {
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Enqueuing message " + messageId + " on queue " + (queue instanceof AMQQueue ? ((AMQQueue)queue).getName() : "" ) + queue.getId()+ "[Connection" + conn + "]");
+ }
+
+ PreparedStatement stmt = conn.prepareStatement(INSERT_INTO_QUEUE_ENTRY);
+ try
+ {
+ stmt.setString(1, queue.getId().toString());
+ stmt.setLong(2,messageId);
+ stmt.executeUpdate();
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ _logger.error("Failed to enqueue: " + e.getMessage(), e);
+ throw new AMQStoreException("Error writing enqueued message with id " + messageId + " for queue " + (queue instanceof AMQQueue ? ((AMQQueue)queue).getName() : "" ) + " with id " + queue.getId()
+ + " to database", e);
+ }
+
+ }
+
+ public void dequeueMessage(ConnectionWrapper connWrapper, final TransactionLogResource queue, Long messageId) throws AMQStoreException
+ {
+
+ Connection conn = connWrapper.getConnection();
+
+
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_QUEUE_ENTRY);
+ try
+ {
+ stmt.setString(1, queue.getId().toString());
+ stmt.setLong(2,messageId);
+ int results = stmt.executeUpdate();
+
+
+
+ if(results != 1)
+ {
+ throw new AMQStoreException("Unable to find message with id " + messageId + " on queue " + (queue instanceof AMQQueue ? ((AMQQueue)queue).getName() : "" )
+ + " with id " + queue.getId());
+ }
+
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Dequeuing message " + messageId + " on queue " + (queue instanceof AMQQueue ? ((AMQQueue)queue).getName() : "" )
+ + " with id " + queue.getId());
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ _logger.error("Failed to dequeue: " + e.getMessage(), e);
+ throw new AMQStoreException("Error deleting enqueued message with id " + messageId + " for queue " + (queue instanceof AMQQueue ? ((AMQQueue)queue).getName() : "" )
+ + " with id " + queue.getId() + " from database", e);
+ }
+
+ }
+
+
+ private void removeXid(ConnectionWrapper connWrapper, long format, byte[] globalId, byte[] branchId)
+ throws AMQStoreException
+ {
+ Connection conn = connWrapper.getConnection();
+
+
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_XIDS);
+ try
+ {
+ stmt.setLong(1,format);
+ stmt.setBytes(2,globalId);
+ stmt.setBytes(3,branchId);
+ int results = stmt.executeUpdate();
+
+
+
+ if(results != 1)
+ {
+ throw new AMQStoreException("Unable to find message with xid");
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ stmt = conn.prepareStatement(DELETE_FROM_XID_ACTIONS);
+ try
+ {
+ stmt.setLong(1,format);
+ stmt.setBytes(2,globalId);
+ stmt.setBytes(3,branchId);
+ int results = stmt.executeUpdate();
+
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ }
+ catch (SQLException e)
+ {
+ _logger.error("Failed to dequeue: " + e.getMessage(), e);
+ throw new AMQStoreException("Error deleting enqueued message with xid", e);
+ }
+
+ }
+
+
+ private void recordXid(ConnectionWrapper connWrapper, long format, byte[] globalId, byte[] branchId,
+ Transaction.Record[] enqueues, Transaction.Record[] dequeues) throws AMQStoreException
+ {
+ Connection conn = connWrapper.getConnection();
+
+
+ try
+ {
+
+ PreparedStatement stmt = conn.prepareStatement(INSERT_INTO_XIDS);
+ try
+ {
+ stmt.setLong(1,format);
+ stmt.setBytes(2, globalId);
+ stmt.setBytes(3, branchId);
+ stmt.executeUpdate();
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ stmt = conn.prepareStatement(INSERT_INTO_XID_ACTIONS);
+
+ try
+ {
+ stmt.setLong(1,format);
+ stmt.setBytes(2, globalId);
+ stmt.setBytes(3, branchId);
+
+ if(enqueues != null)
+ {
+ stmt.setString(4, "E");
+ for(Transaction.Record record : enqueues)
+ {
+ stmt.setString(5, record.getQueue().getId().toString());
+ stmt.setLong(6, record.getMessage().getMessageNumber());
+ stmt.executeUpdate();
+ }
+ }
+
+ if(dequeues != null)
+ {
+ stmt.setString(4, "D");
+ for(Transaction.Record record : dequeues)
+ {
+ stmt.setString(5, record.getQueue().getId().toString());
+ stmt.setLong(6, record.getMessage().getMessageNumber());
+ stmt.executeUpdate();
+ }
+ }
+
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ }
+ catch (SQLException e)
+ {
+ _logger.error("Failed to enqueue: " + e.getMessage(), e);
+ throw new AMQStoreException("Error writing xid ", e);
+ }
+
+ }
+
+ private static final class ConnectionWrapper
+ {
+ private final Connection _connection;
+
+ public ConnectionWrapper(Connection conn)
+ {
+ _connection = conn;
+ }
+
+ public Connection getConnection()
+ {
+ return _connection;
+ }
+ }
+
+
+ public void commitTran(ConnectionWrapper connWrapper) throws AMQStoreException
+ {
+
+ try
+ {
+ Connection conn = connWrapper.getConnection();
+ conn.commit();
+
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("commit tran completed");
+ }
+
+ conn.close();
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error commit tx: " + e.getMessage(), e);
+ }
+ finally
+ {
+
+ }
+ }
+
+ public StoreFuture commitTranAsync(ConnectionWrapper connWrapper) throws AMQStoreException
+ {
+ commitTran(connWrapper);
+ return StoreFuture.IMMEDIATE_FUTURE;
+ }
+
+ public void abortTran(ConnectionWrapper connWrapper) throws AMQStoreException
+ {
+ if (connWrapper == null)
+ {
+ throw new AMQStoreException("Fatal internal error: transactional context is empty at abortTran");
+ }
+
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("abort tran called: " + connWrapper.getConnection());
+ }
+
+ try
+ {
+ Connection conn = connWrapper.getConnection();
+ conn.rollback();
+ conn.close();
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error aborting transaction: " + e.getMessage(), e);
+ }
+
+ }
+
+ public Long getNewMessageId()
+ {
+ return _messageId.incrementAndGet();
+ }
+
+
+ private void storeMetaData(Connection conn, long messageId, StorableMessageMetaData metaData)
+ throws SQLException
+ {
+ if(_logger.isDebugEnabled())
+ {
+ _logger.debug("Adding metadata for message " +messageId);
+ }
+
+ PreparedStatement stmt = conn.prepareStatement(INSERT_INTO_META_DATA);
+ try
+ {
+ stmt.setLong(1,messageId);
+
+ final int bodySize = 1 + metaData.getStorableSize();
+ byte[] underlying = new byte[bodySize];
+ underlying[0] = (byte) metaData.getType().ordinal();
+ java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(underlying);
+ buf.position(1);
+ buf = buf.slice();
+
+ metaData.writeToBuffer(0, buf);
+ ByteArrayInputStream bis = new ByteArrayInputStream(underlying);
+ try
+ {
+ stmt.setBinaryStream(2,bis,underlying.length);
+ int result = stmt.executeUpdate();
+
+ if(result == 0)
+ {
+ throw new RuntimeException("Unable to add meta data for message " +messageId);
+ }
+ }
+ finally
+ {
+ try
+ {
+ bis.close();
+ }
+ catch (IOException e)
+ {
+
+ throw new SQLException(e);
+ }
+ }
+
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ }
+
+
+
+
+ private void recoverMessages(MessageStoreRecoveryHandler recoveryHandler) throws SQLException
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ MessageStoreRecoveryHandler.StoredMessageRecoveryHandler messageHandler = recoveryHandler.begin();
+
+ Statement stmt = conn.createStatement();
+ try
+ {
+ ResultSet rs = stmt.executeQuery(SELECT_ALL_FROM_META_DATA);
+ try
+ {
+
+ long maxId = 0;
+
+ while(rs.next())
+ {
+
+ long messageId = rs.getLong(1);
+ Blob dataAsBlob = rs.getBlob(2);
+
+ if(messageId > maxId)
+ {
+ maxId = messageId;
+ }
+
+ byte[] dataAsBytes = dataAsBlob.getBytes(1,(int) dataAsBlob.length());
+ java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(dataAsBytes);
+ buf.position(1);
+ buf = buf.slice();
+ MessageMetaDataType type = MessageMetaDataType.values()[dataAsBytes[0]];
+ StorableMessageMetaData metaData = type.getFactory().createMetaData(buf);
+ StoredDerbyMessage message = new StoredDerbyMessage(messageId, metaData, false);
+ messageHandler.message(message);
+ }
+
+ _messageId.set(maxId);
+
+ messageHandler.completeMessageRecovery();
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+
+
+
+ private TransactionLogRecoveryHandler.DtxRecordRecoveryHandler recoverQueueEntries(TransactionLogRecoveryHandler recoveryHandler) throws SQLException
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ TransactionLogRecoveryHandler.QueueEntryRecoveryHandler queueEntryHandler = recoveryHandler.begin(this);
+
+ Statement stmt = conn.createStatement();
+ try
+ {
+ ResultSet rs = stmt.executeQuery(SELECT_FROM_QUEUE_ENTRY);
+ try
+ {
+ while(rs.next())
+ {
+
+ String id = rs.getString(1);
+ long messageId = rs.getLong(2);
+ queueEntryHandler.queueEntry(UUID.fromString(id), messageId);
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ return queueEntryHandler.completeQueueEntryRecovery();
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+
+ private static final class Xid
+ {
+
+ private final long _format;
+ private final byte[] _globalId;
+ private final byte[] _branchId;
+
+ public Xid(long format, byte[] globalId, byte[] branchId)
+ {
+ _format = format;
+ _globalId = globalId;
+ _branchId = branchId;
+ }
+
+ public long getFormat()
+ {
+ return _format;
+ }
+
+ public byte[] getGlobalId()
+ {
+ return _globalId;
+ }
+
+ public byte[] getBranchId()
+ {
+ return _branchId;
+ }
+ }
+
+ private static class RecordImpl implements Transaction.Record, TransactionLogResource, EnqueableMessage
+ {
+
+ private long _messageNumber;
+ private UUID _queueId;
+
+ public RecordImpl(UUID queueId, long messageNumber)
+ {
+ _messageNumber = messageNumber;
+ _queueId = queueId;
+ }
+
+ @Override
+ public TransactionLogResource getQueue()
+ {
+ return this;
+ }
+
+ @Override
+ public EnqueableMessage getMessage()
+ {
+ return this;
+ }
+
+ @Override
+ public long getMessageNumber()
+ {
+ return _messageNumber;
+ }
+
+ @Override
+ public boolean isPersistent()
+ {
+ return true;
+ }
+
+ @Override
+ public StoredMessage getStoredMessage()
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public UUID getId()
+ {
+ return _queueId;
+ }
+ }
+
+ private void recoverXids(TransactionLogRecoveryHandler.DtxRecordRecoveryHandler dtxrh) throws SQLException
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ List<Xid> xids = new ArrayList<Xid>();
+
+ Statement stmt = conn.createStatement();
+ try
+ {
+ ResultSet rs = stmt.executeQuery(SELECT_ALL_FROM_XIDS);
+ try
+ {
+ while(rs.next())
+ {
+
+ long format = rs.getLong(1);
+ byte[] globalId = rs.getBytes(2);
+ byte[] branchId = rs.getBytes(3);
+ xids.add(new Xid(format, globalId, branchId));
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+
+
+ for(Xid xid : xids)
+ {
+ List<RecordImpl> enqueues = new ArrayList<RecordImpl>();
+ List<RecordImpl> dequeues = new ArrayList<RecordImpl>();
+
+ PreparedStatement pstmt = conn.prepareStatement(SELECT_ALL_FROM_XID_ACTIONS);
+
+ try
+ {
+ pstmt.setLong(1, xid.getFormat());
+ pstmt.setBytes(2, xid.getGlobalId());
+ pstmt.setBytes(3, xid.getBranchId());
+
+ ResultSet rs = pstmt.executeQuery();
+ try
+ {
+ while(rs.next())
+ {
+
+ String actionType = rs.getString(1);
+ UUID queueId = UUID.fromString(rs.getString(2));
+ long messageId = rs.getLong(3);
+
+ RecordImpl record = new RecordImpl(queueId, messageId);
+ List<RecordImpl> records = "E".equals(actionType) ? enqueues : dequeues;
+ records.add(record);
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ pstmt.close();
+ }
+
+ dtxrh.dtxRecord(xid.getFormat(), xid.getGlobalId(), xid.getBranchId(),
+ enqueues.toArray(new RecordImpl[enqueues.size()]),
+ dequeues.toArray(new RecordImpl[dequeues.size()]));
+ }
+
+
+ dtxrh.completeDtxRecordRecovery();
+ }
+ finally
+ {
+ conn.close();
+ }
+
+ }
+
+ StorableMessageMetaData getMetaData(long messageId) throws SQLException
+ {
+
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(SELECT_FROM_META_DATA);
+ try
+ {
+ stmt.setLong(1,messageId);
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+
+ if(rs.next())
+ {
+ Blob dataAsBlob = rs.getBlob(1);
+
+ byte[] dataAsBytes = dataAsBlob.getBytes(1,(int) dataAsBlob.length());
+ java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(dataAsBytes);
+ buf.position(1);
+ buf = buf.slice();
+ MessageMetaDataType type = MessageMetaDataType.values()[dataAsBytes[0]];
+ StorableMessageMetaData metaData = type.getFactory().createMetaData(buf);
+
+ return metaData;
+ }
+ else
+ {
+ throw new RuntimeException("Meta data not found for message with id " + messageId);
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+
+
+ private void addContent(Connection conn, long messageId, ByteBuffer src)
+ {
+ if(_logger.isDebugEnabled())
+ {
+ _logger.debug("Adding content for message " +messageId);
+ }
+ PreparedStatement stmt = null;
+
+ try
+ {
+ src = src.slice();
+
+ byte[] chunkData = new byte[src.limit()];
+ src.duplicate().get(chunkData);
+
+ stmt = conn.prepareStatement(INSERT_INTO_MESSAGE_CONTENT);
+ stmt.setLong(1,messageId);
+
+ ByteArrayInputStream bis = new ByteArrayInputStream(chunkData);
+ stmt.setBinaryStream(2, bis, chunkData.length);
+ stmt.executeUpdate();
+ }
+ catch (SQLException e)
+ {
+ closeConnection(conn);
+ throw new RuntimeException("Error adding content for message " + messageId + ": " + e.getMessage(), e);
+ }
+ finally
+ {
+ closePreparedStatement(stmt);
+ }
+
+ }
+
+
+ public int getContent(long messageId, int offset, ByteBuffer dst)
+ {
+ Connection conn = null;
+ PreparedStatement stmt = null;
+
+ try
+ {
+ conn = newAutoCommitConnection();
+
+ stmt = conn.prepareStatement(SELECT_FROM_MESSAGE_CONTENT);
+ stmt.setLong(1,messageId);
+ ResultSet rs = stmt.executeQuery();
+
+ int written = 0;
+
+ if (rs.next())
+ {
+
+ Blob dataAsBlob = rs.getBlob(1);
+
+ final int size = (int) dataAsBlob.length();
+ byte[] dataAsBytes = dataAsBlob.getBytes(1, size);
+
+ if (offset > size)
+ {
+ throw new RuntimeException("Offset " + offset + " is greater than message size " + size
+ + " for message id " + messageId + "!");
+
+ }
+
+ written = size - offset;
+ if(written > dst.remaining())
+ {
+ written = dst.remaining();
+ }
+
+ dst.put(dataAsBytes, offset, written);
+ }
+
+ return written;
+
+ }
+ catch (SQLException e)
+ {
+ throw new RuntimeException("Error retrieving content from offset " + offset + " for message " + messageId + ": " + e.getMessage(), e);
+ }
+ finally
+ {
+ closePreparedStatement(stmt);
+ closeConnection(conn);
+ }
+
+
+ }
+
+ @Override
+ public boolean isPersistent()
+ {
+ return true;
+ }
+
+
+ private class DerbyTransaction implements Transaction
+ {
+ private final ConnectionWrapper _connWrapper;
+
+
+ private DerbyTransaction()
+ {
+ try
+ {
+ _connWrapper = new ConnectionWrapper(newConnection());
+ }
+ catch (SQLException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
+ {
+ if(message.getStoredMessage() instanceof StoredDerbyMessage)
+ {
+ try
+ {
+ ((StoredDerbyMessage)message.getStoredMessage()).store(_connWrapper.getConnection());
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Exception on enqueuing message " + _messageId, e);
+ }
+ }
+
+ DerbyMessageStore.this.enqueueMessage(_connWrapper, queue, message.getMessageNumber());
+ }
+
+ @Override
+ public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
+ {
+ DerbyMessageStore.this.dequeueMessage(_connWrapper, queue, message.getMessageNumber());
+
+ }
+
+ @Override
+ public void commitTran() throws AMQStoreException
+ {
+ DerbyMessageStore.this.commitTran(_connWrapper);
+ }
+
+ @Override
+ public StoreFuture commitTranAsync() throws AMQStoreException
+ {
+ return DerbyMessageStore.this.commitTranAsync(_connWrapper);
+ }
+
+ @Override
+ public void abortTran() throws AMQStoreException
+ {
+ DerbyMessageStore.this.abortTran(_connWrapper);
+ }
+
+ @Override
+ public void removeXid(long format, byte[] globalId, byte[] branchId) throws AMQStoreException
+ {
+ DerbyMessageStore.this.removeXid(_connWrapper, format, globalId, branchId);
+ }
+
+ @Override
+ public void recordXid(long format, byte[] globalId, byte[] branchId, Record[] enqueues, Record[] dequeues)
+ throws AMQStoreException
+ {
+ DerbyMessageStore.this.recordXid(_connWrapper, format, globalId, branchId, enqueues, dequeues);
+ }
+ }
+
+
+
+ private class StoredDerbyMessage implements StoredMessage
+ {
+
+ private final long _messageId;
+ private StorableMessageMetaData _metaData;
+ private volatile SoftReference<StorableMessageMetaData> _metaDataRef;
+ private byte[] _data;
+ private volatile SoftReference<byte[]> _dataRef;
+
+
+ StoredDerbyMessage(long messageId, StorableMessageMetaData metaData)
+ {
+ this(messageId, metaData, true);
+ }
+
+
+ StoredDerbyMessage(long messageId,
+ StorableMessageMetaData metaData, boolean persist)
+ {
+ _messageId = messageId;
+
+
+ _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
+ if(persist)
+ {
+ _metaData = metaData;
+ }
+ }
+
+ @Override
+ public StorableMessageMetaData getMetaData()
+ {
+ StorableMessageMetaData metaData = _metaData == null ? _metaDataRef.get() : _metaData;
+ if(metaData == null)
+ {
+ try
+ {
+ metaData = DerbyMessageStore.this.getMetaData(_messageId);
+ }
+ catch (SQLException e)
+ {
+ throw new RuntimeException(e);
+ }
+ _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
+ }
+
+ return metaData;
+ }
+
+ @Override
+ public long getMessageNumber()
+ {
+ return _messageId;
+ }
+
+ @Override
+ public void addContent(int offsetInMessage, java.nio.ByteBuffer src)
+ {
+ src = src.slice();
+
+ if(_data == null)
+ {
+ _data = new byte[src.remaining()];
+ _dataRef = new SoftReference<byte[]>(_data);
+ src.duplicate().get(_data);
+ }
+ else
+ {
+ byte[] oldData = _data;
+ _data = new byte[oldData.length + src.remaining()];
+ _dataRef = new SoftReference<byte[]>(_data);
+
+ System.arraycopy(oldData,0,_data,0,oldData.length);
+ src.duplicate().get(_data, oldData.length, src.remaining());
+ }
+
+ }
+
+ @Override
+ public int getContent(int offsetInMessage, java.nio.ByteBuffer dst)
+ {
+ byte[] data = _dataRef == null ? null : _dataRef.get();
+ if(data != null)
+ {
+ int length = Math.min(dst.remaining(), data.length - offsetInMessage);
+ dst.put(data, offsetInMessage, length);
+ return length;
+ }
+ else
+ {
+ return DerbyMessageStore.this.getContent(_messageId, offsetInMessage, dst);
+ }
+ }
+
+
+ @Override
+ public ByteBuffer getContent(int offsetInMessage, int size)
+ {
+ ByteBuffer buf = ByteBuffer.allocate(size);
+ getContent(offsetInMessage, buf);
+ buf.position(0);
+ return buf;
+ }
+
+ @Override
+ public synchronized StoreFuture flushToStore()
+ {
+ try
+ {
+ if(_metaData != null)
+ {
+ Connection conn = newConnection();
+
+ store(conn);
+
+ conn.commit();
+ conn.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ if(_logger.isDebugEnabled())
+ {
+ _logger.debug("Error when trying to flush message " + _messageId + " to store: " + e);
+ }
+ throw new RuntimeException(e);
+ }
+ return StoreFuture.IMMEDIATE_FUTURE;
+ }
+
+ private synchronized void store(final Connection conn) throws SQLException
+ {
+ if(_metaData != null)
+ {
+ try
+ {
+ storeMetaData(conn, _messageId, _metaData);
+ DerbyMessageStore.this.addContent(conn, _messageId,
+ _data == null ? ByteBuffer.allocate(0) : ByteBuffer.wrap(_data));
+ }
+ finally
+ {
+ _metaData = null;
+ _data = null;
+ }
+ }
+
+ if(_logger.isDebugEnabled())
+ {
+ _logger.debug("Storing message " + _messageId + " to store");
+ }
+ }
+
+ @Override
+ public void remove()
+ {
+ DerbyMessageStore.this.removeMessage(_messageId);
+ }
+ }
+
+ private void closeConnection(final Connection conn)
+ {
+ if(conn != null)
+ {
+ try
+ {
+ conn.close();
+ }
+ catch (SQLException e)
+ {
+ _logger.error("Problem closing connection", e);
+ }
+ }
+ }
+
+ private void closePreparedStatement(final PreparedStatement stmt)
+ {
+ if (stmt != null)
+ {
+ try
+ {
+ stmt.close();
+ }
+ catch(SQLException e)
+ {
+ _logger.error("Problem closing prepared statement", e);
+ }
+ }
+ }
+
+ @Override
+ public void addEventListener(EventListener eventListener, Event... events)
+ {
+ _eventManager.addEventListener(eventListener, events);
+ }
+
+ @Override
+ public String getStoreLocation()
+ {
+ return _storeLocation;
+ }
+
+ private void insertConfiguredObject(ConfiguredObjectRecord configuredObject) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ try
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(FIND_CONFIGURED_OBJECT);
+ try
+ {
+ stmt.setString(1, configuredObject.getId().toString());
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+ // If we don't have any data in the result set then we can add this configured object
+ if (!rs.next())
+ {
+ PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_CONFIGURED_OBJECTS);
+ try
+ {
+ insertStmt.setString(1, configuredObject.getId().toString());
+ insertStmt.setString(2, configuredObject.getType());
+ if(configuredObject.getAttributes() == null)
+ {
+ insertStmt.setNull(3, Types.BLOB);
+ }
+ else
+ {
+ byte[] attributesAsBytes = configuredObject.getAttributes().getBytes(UTF8_CHARSET);
+ ByteArrayInputStream bis = new ByteArrayInputStream(attributesAsBytes);
+ insertStmt.setBinaryStream(3, bis, attributesAsBytes.length);
+ }
+ insertStmt.execute();
+ }
+ finally
+ {
+ insertStmt.close();
+ }
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error inserting of configured object " + configuredObject + " into database: " + e.getMessage(), e);
+ }
+ }
+ }
+
+ private int removeConfiguredObject(UUID id) throws AMQStoreException
+ {
+ int results = 0;
+ try
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_CONFIGURED_OBJECTS);
+ try
+ {
+ stmt.setString(1, id.toString());
+ results = stmt.executeUpdate();
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error deleting of configured object with id " + id + " from database: " + e.getMessage(), e);
+ }
+ return results;
+ }
+
+ private void updateConfiguredObject(final ConfiguredObjectRecord configuredObject) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ try
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(FIND_CONFIGURED_OBJECT);
+ try
+ {
+ stmt.setString(1, configuredObject.getId().toString());
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+ if (rs.next())
+ {
+ PreparedStatement stmt2 = conn.prepareStatement(UPDATE_CONFIGURED_OBJECTS);
+ try
+ {
+ stmt2.setString(1, configuredObject.getType());
+ if (configuredObject.getAttributes() != null)
+ {
+ byte[] attributesAsBytes = configuredObject.getAttributes().getBytes(UTF8_CHARSET);
+ ByteArrayInputStream bis = new ByteArrayInputStream(attributesAsBytes);
+ stmt2.setBinaryStream(2, bis, attributesAsBytes.length);
+ }
+ else
+ {
+ stmt2.setNull(2, Types.BLOB);
+ }
+ stmt2.setString(3, configuredObject.getId().toString());
+ stmt2.execute();
+ }
+ finally
+ {
+ stmt2.close();
+ }
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error updating configured object " + configuredObject + " in database: " + e.getMessage(), e);
+ }
+ }
+ }
+
+ private ConfiguredObjectRecord loadConfiguredObject(final UUID id) throws AMQStoreException
+ {
+ ConfiguredObjectRecord result = null;
+ try
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(FIND_CONFIGURED_OBJECT);
+ try
+ {
+ stmt.setString(1, id.toString());
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+ if (rs.next())
+ {
+ String type = rs.getString(1);
+ Blob blob = rs.getBlob(2);
+ String attributes = null;
+ if (blob != null)
+ {
+ attributes = blobToString(blob);
+ }
+ result = new ConfiguredObjectRecord(id, type, attributes);
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error loading of configured object with id " + id + " from database: "
+ + e.getMessage(), e);
+ }
+ return result;
+ }
+
+ private String blobToString(Blob blob) throws SQLException
+ {
+ byte[] bytes = blob.getBytes(1, (int)blob.length());
+ return new String(bytes, UTF8_CHARSET);
+ }
+
+ private List<ConfiguredObjectRecord> loadConfiguredObjects() throws SQLException
+ {
+ ArrayList<ConfiguredObjectRecord> results = new ArrayList<ConfiguredObjectRecord>();
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(SELECT_FROM_CONFIGURED_OBJECTS);
+ try
+ {
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+ while (rs.next())
+ {
+ String id = rs.getString(1);
+ String objectType = rs.getString(2);
+ String attributes = blobToString(rs.getBlob(3));
+ results.add(new ConfiguredObjectRecord(UUID.fromString(id), objectType, attributes));
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ return results;
+ }
+} \ No newline at end of file
diff --git a/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStoreFactory.java b/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStoreFactory.java
new file mode 100644
index 0000000000..12d7f64a8d
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStoreFactory.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.derby;
+
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreFactory;
+
+public class DerbyMessageStoreFactory implements MessageStoreFactory
+{
+
+ @Override
+ public MessageStore createMessageStore()
+ {
+ return new DerbyMessageStore();
+ }
+
+ @Override
+ public String getStoreClassName()
+ {
+ return DerbyMessageStore.class.getSimpleName();
+ }
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription.java b/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription.java
index f8a585b562..66825caa24 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription.java
@@ -54,16 +54,12 @@ public interface Subscription
void setNoLocal(boolean noLocal);
- AMQShortString getConsumerTag();
-
long getSubscriptionID();
boolean isSuspended();
boolean hasInterest(QueueEntry msg);
- boolean isAutoClose();
-
boolean isClosed();
boolean acquires();
@@ -105,11 +101,11 @@ public interface Subscription
boolean isActive();
- void confirmAutoClose();
-
public void set(String key, Object value);
public Object get(String key);
boolean isSessionTransactional();
+
+ void queueEmpty() throws AMQException;
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/subscription/SubscriptionImpl.java b/java/broker/src/main/java/org/apache/qpid/server/subscription/SubscriptionImpl.java
index 32baa17fc7..1f25c215cc 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/subscription/SubscriptionImpl.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/subscription/SubscriptionImpl.java
@@ -375,7 +375,7 @@ public abstract class SubscriptionImpl implements Subscription, FlowCreditManage
{
return getQueue().getConfigStore();
}
-
+
public Long getDelivered()
{
return _deliveredCount.get();
@@ -810,12 +810,22 @@ public abstract class SubscriptionImpl implements Subscription, FlowCreditManage
{
return _channel.isTransactional();
}
-
+
public long getCreateTime()
{
return _createTime;
}
+ public void queueEmpty() throws AMQException
+ {
+ if (isAutoClose())
+ {
+ _queue.unregisterSubscription(this);
+
+ confirmAutoClose();
+ }
+ }
+
public void flushBatched()
{
_channel.getProtocolSession().setDeferFlush(false);
diff --git a/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription_0_10.java b/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription_0_10.java
index 9a7d69b10d..76d975a789 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription_0_10.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription_0_10.java
@@ -109,7 +109,7 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
public void stateChange(Subscription sub, State oldState, State newState)
{
- CurrentActor.get().message(SubscriptionMessages.STATE(newState.toString()));
+ CurrentActor.get().message(SubscriptionMessages.STATE(newState.toString()));
}
};
private AMQQueue _queue;
@@ -199,12 +199,7 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
CurrentActor.get().message(this, SubscriptionMessages.CREATE(filterLogString, queue.isDurable() && exclusive,
filterLogString.length() > 0));
}
-
- }
- public AMQShortString getConsumerTag()
- {
- return new AMQShortString(_destination);
}
public boolean isSuspended()
@@ -244,12 +239,6 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
return (_filters == null) || _filters.allAllow(entry);
}
- public boolean isAutoClose()
- {
- // no such thing in 0-10
- return false;
- }
-
public boolean isClosed()
{
return getState() == State.CLOSED;
@@ -302,7 +291,7 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
{
return getQueue().getConfigStore();
}
-
+
public Long getDelivered()
{
return _deliveredCount.get();
@@ -409,6 +398,10 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
{
deliveryProps.setTimestamp(origDeliveryProps.getTimestamp());
}
+ if(origDeliveryProps.hasTtl())
+ {
+ deliveryProps.setTtl(origDeliveryProps.getTtl());
+ }
}
@@ -684,7 +677,10 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
{
entry.setRedelivered();
entry.routeToAlternate();
-
+ if(entry.isAcquiredBy(this))
+ {
+ entry.discard();
+ }
}
void release(final QueueEntry entry, final boolean setRedelivered)
@@ -816,11 +812,6 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
return getState() == State.ACTIVE;
}
- public void confirmAutoClose()
- {
- //No such thing in 0-10
- }
-
public void set(String key, Object value)
{
_properties.put(key, value);
@@ -1019,6 +1010,10 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
return _session.isTransactional();
}
+ public void queueEmpty()
+ {
+ }
+
public long getCreateTime()
{
return _createTime;
@@ -1026,7 +1021,7 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
public String toLogString()
{
- String queueInfo = MessageFormat.format(QUEUE_FORMAT, _queue.getVirtualHost().getName(),
+ String queueInfo = MessageFormat.format(QUEUE_FORMAT, _queue.getVirtualHost().getName(),
_queue.getNameShortString());
String result = "[" + MessageFormat.format(SUBSCRIPTION_FORMAT, getSubscriptionID()) + "("
// queueString is "vh(/{0})/qu({1}) " so need to trim
diff --git a/java/broker/src/main/java/org/apache/qpid/server/transport/ServerConnectionDelegate.java b/java/broker/src/main/java/org/apache/qpid/server/transport/ServerConnectionDelegate.java
index 02c4ffa012..5460c89eab 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/transport/ServerConnectionDelegate.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/transport/ServerConnectionDelegate.java
@@ -33,6 +33,7 @@ import org.apache.qpid.server.security.SecurityManager;
import org.apache.qpid.server.security.auth.AuthenticationResult;
import org.apache.qpid.server.security.auth.AuthenticationResult.AuthenticationStatus;
import org.apache.qpid.server.subscription.Subscription_0_10;
+import org.apache.qpid.server.virtualhost.State;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.transport.*;
import org.slf4j.Logger;
@@ -177,6 +178,11 @@ public class ServerConnectionDelegate extends ServerDelegate
sconn.setState(Connection.State.CLOSING);
sconn.invoke(new ConnectionClose(ConnectionCloseCode.CONNECTION_FORCED, "Permission denied '"+vhostName+"'"));
}
+ else if (vhost.getState() != State.ACTIVE)
+ {
+ sconn.setState(Connection.State.CLOSING);
+ sconn.invoke(new ConnectionClose(ConnectionCloseCode.CONNECTION_FORCED, "Virtual host '"+vhostName+"' is not active"));
+ }
else
{
sconn.setState(Connection.State.OPEN);
@@ -231,23 +237,26 @@ public class ServerConnectionDelegate extends ServerDelegate
@Override public void sessionDetach(Connection conn, SessionDetach dtc)
{
- // To ensure a clean detach, we unregister any remaining subscriptions. Unregister ensures
- // that any in-progress delivery (SubFlushRunner/QueueRunner) is completed before the unregister
+ // To ensure a clean detach, we stop any remaining subscriptions. Stop ensures
+ // that any in-progress delivery (SubFlushRunner/QueueRunner) is completed before the stop
// completes.
- unregisterAllSubscriptions(conn, dtc);
+ stopAllSubscriptions(conn, dtc);
+ Session ssn = conn.getSession(dtc.getChannel());
+ ((ServerSession)ssn).setClose(true);
super.sessionDetach(conn, dtc);
}
- private void unregisterAllSubscriptions(Connection conn, SessionDetach dtc)
+ private void stopAllSubscriptions(Connection conn, SessionDetach dtc)
{
final ServerSession ssn = (ServerSession) conn.getSession(dtc.getChannel());
final Collection<Subscription_0_10> subs = ssn.getSubscriptions();
for (Subscription_0_10 subscription_0_10 : subs)
{
- ssn.unregister(subscription_0_10);
+ subscription_0_10.stop();
}
}
+
@Override
public void sessionAttach(final Connection conn, final SessionAttach atc)
{
@@ -255,8 +264,7 @@ public class ServerConnectionDelegate extends ServerDelegate
if(isSessionNameUnique(atc.getName(), conn))
{
- ssn = sessionAttachImpl(conn, atc);
- conn.registerSession(ssn);
+ super.sessionAttach(conn, atc);
((ServerConnection)conn).checkForNotification();
}
else
@@ -306,4 +314,4 @@ public class ServerConnectionDelegate extends ServerDelegate
{
return _clientProperties == null ? null : (String) _clientProperties.get(ConnectionStartProperties.VERSION_0_10);
}
-} \ No newline at end of file
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java b/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java
index e4268ed2dc..6f979e035e 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java
@@ -21,6 +21,11 @@
package org.apache.qpid.server.transport;
import static org.apache.qpid.server.logging.subjects.LogSubjectFormat.CHANNEL_FORMAT;
+import org.apache.qpid.server.message.InboundMessage;
+import org.apache.qpid.server.message.MessageMetaData_0_10;
+import org.apache.qpid.server.message.MessageTransferMessage;
+import org.apache.qpid.server.txn.RollbackOnlyDtxException;
+import org.apache.qpid.server.txn.TimeoutDtxException;
import static org.apache.qpid.util.Serial.gt;
import java.security.Principal;
@@ -44,6 +49,7 @@ import java.util.concurrent.atomic.AtomicLong;
import javax.security.auth.Subject;
import org.apache.qpid.AMQException;
+import org.apache.qpid.AMQStoreException;
import org.apache.qpid.protocol.AMQConstant;
import org.apache.qpid.protocol.ProtocolEngine;
import org.apache.qpid.server.configuration.ConfigStore;
@@ -66,25 +72,21 @@ import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.security.AuthorizationHolder;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.StoreFuture;
import org.apache.qpid.server.subscription.Subscription_0_10;
+import org.apache.qpid.server.txn.AlreadyKnownDtxException;
import org.apache.qpid.server.txn.AsyncAutoCommitTransaction;
+import org.apache.qpid.server.txn.DistributedTransaction;
+import org.apache.qpid.server.txn.DtxNotSelectedException;
+import org.apache.qpid.server.txn.IncorrectDtxStateException;
+import org.apache.qpid.server.txn.JoinAndResumeDtxException;
import org.apache.qpid.server.txn.LocalTransaction;
+import org.apache.qpid.server.txn.NotAssociatedDtxException;
import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.txn.SuspendAndFailDtxException;
+import org.apache.qpid.server.txn.UnknownDtxBranchException;
import org.apache.qpid.server.virtualhost.VirtualHost;
-import org.apache.qpid.transport.Binary;
-import org.apache.qpid.transport.Connection;
-import org.apache.qpid.transport.MessageCreditUnit;
-import org.apache.qpid.transport.MessageFlow;
-import org.apache.qpid.transport.MessageFlowMode;
-import org.apache.qpid.transport.MessageSetFlowMode;
-import org.apache.qpid.transport.MessageStop;
-import org.apache.qpid.transport.MessageTransfer;
-import org.apache.qpid.transport.Method;
-import org.apache.qpid.transport.Range;
-import org.apache.qpid.transport.RangeSet;
-import org.apache.qpid.transport.RangeSetFactory;
-import org.apache.qpid.transport.Session;
-import org.apache.qpid.transport.SessionDelegate;
+import org.apache.qpid.transport.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -109,7 +111,6 @@ public class ServerSession extends Session
private ChannelLogSubject _logSubject;
private final AtomicInteger _outstandingCredit = new AtomicInteger(UNLIMITED_CREDIT);
-
public static interface MessageDispositionChangeListener
{
public void onAccept();
@@ -133,7 +134,7 @@ public class ServerSession extends Session
new ConcurrentSkipListMap<Integer, MessageDispositionChangeListener>();
private ServerTransaction _transaction;
-
+
private final AtomicLong _txnStarts = new AtomicLong(0);
private final AtomicLong _txnCommits = new AtomicLong(0);
private final AtomicLong _txnRejects = new AtomicLong(0);
@@ -152,7 +153,7 @@ public class ServerSession extends Session
public ServerSession(Connection connection, SessionDelegate delegate, Binary name, long expiry, ConnectionConfig connConfig)
{
super(connection, delegate, name, expiry);
- _connectionConfig = connConfig;
+ _connectionConfig = connConfig;
_transaction = new AsyncAutoCommitTransaction(this.getMessageStore(),this);
_logSubject = new ChannelLogSubject(this);
_id = getConfigStore().createId();
@@ -352,14 +353,22 @@ public class ServerSession extends Session
}
}
- public void removeDispositionListener(Method method)
+ public void removeDispositionListener(Method method)
{
_messageDispositionListenerMap.remove(method.getId());
}
public void onClose()
{
- _transaction.rollback();
+ if(_transaction instanceof LocalTransaction)
+ {
+ _transaction.rollback();
+ }
+ else if(_transaction instanceof DistributedTransaction)
+ {
+ getVirtualHost().getDtxRegistry().endAssociations(this);
+ }
+
for(MessageDispositionChangeListener listener : _messageDispositionListenerMap.values())
{
listener.onRelease(true);
@@ -372,7 +381,7 @@ public class ServerSession extends Session
{
task.doTask(this);
}
-
+
CurrentActor.get().message(getLogSubject(), ChannelMessages.CLOSE());
}
@@ -395,6 +404,9 @@ public class ServerSession extends Session
public void onRollback()
{
+ // The client has acknowledge the message and therefore have seen it.
+ // In the event of rollback, the message must be marked as redelivered.
+ entry.setRedelivered();
entry.release();
}
});
@@ -418,7 +430,7 @@ public class ServerSession extends Session
public void unregister(Subscription_0_10 sub)
{
- _subscriptions.remove(sub.getConsumerTag().toString());
+ _subscriptions.remove(sub.getName());
try
{
sub.getSendLock();
@@ -455,10 +467,99 @@ public class ServerSession extends Session
_txnStarts.incrementAndGet();
}
+ public void selectDtx()
+ {
+ _transaction = new DistributedTransaction(this, getMessageStore(), getVirtualHost());
+
+ }
+
+
+ public void startDtx(Xid xid, boolean join, boolean resume)
+ throws JoinAndResumeDtxException,
+ UnknownDtxBranchException,
+ AlreadyKnownDtxException,
+ DtxNotSelectedException
+ {
+ DistributedTransaction distributedTransaction = assertDtxTransaction();
+ distributedTransaction.start(xid, join, resume);
+ }
+
+
+ public void endDtx(Xid xid, boolean fail, boolean suspend)
+ throws NotAssociatedDtxException,
+ UnknownDtxBranchException,
+ DtxNotSelectedException,
+ SuspendAndFailDtxException, TimeoutDtxException
+ {
+ DistributedTransaction distributedTransaction = assertDtxTransaction();
+ distributedTransaction.end(xid, fail, suspend);
+ }
+
+
+ public long getTimeoutDtx(Xid xid)
+ throws UnknownDtxBranchException
+ {
+ return getVirtualHost().getDtxRegistry().getTimeout(xid);
+ }
+
+
+ public void setTimeoutDtx(Xid xid, long timeout)
+ throws UnknownDtxBranchException
+ {
+ getVirtualHost().getDtxRegistry().setTimeout(xid, timeout);
+ }
+
+
+ public void prepareDtx(Xid xid)
+ throws UnknownDtxBranchException,
+ IncorrectDtxStateException, AMQStoreException, RollbackOnlyDtxException, TimeoutDtxException
+ {
+ getVirtualHost().getDtxRegistry().prepare(xid);
+ }
+
+ public void commitDtx(Xid xid, boolean onePhase)
+ throws UnknownDtxBranchException,
+ IncorrectDtxStateException, AMQStoreException, RollbackOnlyDtxException, TimeoutDtxException
+ {
+ getVirtualHost().getDtxRegistry().commit(xid, onePhase);
+ }
+
+
+ public void rollbackDtx(Xid xid)
+ throws UnknownDtxBranchException,
+ IncorrectDtxStateException, AMQStoreException, TimeoutDtxException
+ {
+ getVirtualHost().getDtxRegistry().rollback(xid);
+ }
+
+
+ public void forgetDtx(Xid xid) throws UnknownDtxBranchException, IncorrectDtxStateException
+ {
+ getVirtualHost().getDtxRegistry().forget(xid);
+ }
+
+ public List<Xid> recoverDtx()
+ {
+ return getVirtualHost().getDtxRegistry().recover();
+ }
+
+ private DistributedTransaction assertDtxTransaction() throws DtxNotSelectedException
+ {
+ if(_transaction instanceof DistributedTransaction)
+ {
+ return (DistributedTransaction) _transaction;
+ }
+ else
+ {
+ throw new DtxNotSelectedException();
+ }
+ }
+
+
public void commit()
{
_transaction.commit();
-
+
_txnCommits.incrementAndGet();
_txnStarts.incrementAndGet();
decrementOutstandingTxnsIfNecessary();
@@ -467,13 +568,13 @@ public class ServerSession extends Session
public void rollback()
{
_transaction.rollback();
-
+
_txnRejects.incrementAndGet();
_txnStarts.incrementAndGet();
decrementOutstandingTxnsIfNecessary();
}
-
+
private void incrementOutstandingTxnsIfNecessary()
{
if(isTransactional())
@@ -483,7 +584,7 @@ public class ServerSession extends Session
_txnCount.compareAndSet(0,1);
}
}
-
+
private void decrementOutstandingTxnsIfNecessary()
{
if(isTransactional())
@@ -524,7 +625,7 @@ public class ServerSession extends Session
{
return _txnCount.get();
}
-
+
public Principal getAuthorizedPrincipal()
{
return getConnection().getAuthorizedPrincipal();
@@ -620,11 +721,6 @@ public class ServerSession extends Session
close();
}
- public Object getID()
- {
- return getName();
- }
-
public AMQConnectionModel getConnectionModel()
{
return getConnection();
@@ -704,7 +800,7 @@ public class ServerSession extends Session
{
if(_blockingQueues.remove(queue) && _blockingQueues.isEmpty())
{
- if(_blocking.compareAndSet(true,false))
+ if(_blocking.compareAndSet(true,false) && !isClosing())
{
_actor.message(_logSubject, ChannelMessages.FLOW_REMOVED());
@@ -720,6 +816,14 @@ public class ServerSession extends Session
}
}
+ public boolean onSameConnection(InboundMessage inbound)
+ {
+ return ((inbound instanceof MessageTransferMessage)
+ && ((MessageTransferMessage)inbound).getConnectionReference() == getConnection().getReference())
+ || ((inbound instanceof MessageMetaData_0_10)
+ && (((MessageMetaData_0_10)inbound).getConnectionReference())== getConnection().getReference());
+ }
+
public String toLogString()
{
@@ -746,7 +850,6 @@ public class ServerSession extends Session
// unregister subscriptions in order to prevent sending of new messages
// to subscriptions with closing session
unregisterSubscriptions();
-
super.close();
}
@@ -759,6 +862,16 @@ public class ServerSession extends Session
}
}
+ void stopSubscriptions()
+ {
+ final Collection<Subscription_0_10> subscriptions = getSubscriptions();
+ for (Subscription_0_10 subscription_0_10 : subscriptions)
+ {
+ subscription_0_10.stop();
+ }
+ }
+
+
public void receivedComplete()
{
final Collection<Subscription_0_10> subscriptions = getSubscriptions();
@@ -863,17 +976,17 @@ public class ServerSession extends Session
return _unfinishedCommandsQueue.isEmpty() ? null : _unfinishedCommandsQueue.getLast();
}
- public void recordFuture(final MessageStore.StoreFuture future, final ServerTransaction.Action action)
+ public void recordFuture(final StoreFuture future, final ServerTransaction.Action action)
{
_unfinishedCommandsQueue.add(new AsyncCommand(future, action));
}
private static class AsyncCommand
{
- private final MessageStore.StoreFuture _future;
+ private final StoreFuture _future;
private ServerTransaction.Action _action;
- public AsyncCommand(final MessageStore.StoreFuture future, final ServerTransaction.Action action)
+ public AsyncCommand(final StoreFuture future, final ServerTransaction.Action action)
{
_future = future;
_action = action;
@@ -900,9 +1013,14 @@ public class ServerSession extends Session
}
}
- @Override
+ protected void setClose(boolean close)
+ {
+ super.setClose(close);
+ }
+
public int compareTo(AMQSessionModel session)
{
- return getId().toString().compareTo(session.getID().toString());
+ return getId().compareTo(session.getId());
}
+
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java b/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java
index 8e4fb3635b..79a8bc0e4c 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java
@@ -23,6 +23,7 @@ package org.apache.qpid.server.transport;
import org.apache.log4j.Logger;
import org.apache.qpid.AMQException;
+import org.apache.qpid.AMQStoreException;
import org.apache.qpid.AMQUnknownExchangeType;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.FieldTable;
@@ -39,6 +40,7 @@ import org.apache.qpid.server.flow.WindowCreditManager;
import org.apache.qpid.server.logging.messages.ExchangeMessages;
import org.apache.qpid.server.message.MessageMetaData_0_10;
import org.apache.qpid.server.message.MessageTransferMessage;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
import org.apache.qpid.server.queue.BaseQueue;
@@ -47,10 +49,20 @@ import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.security.SecurityManager;
import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.StoreFuture;
import org.apache.qpid.server.store.StoredMessage;
import org.apache.qpid.server.subscription.SubscriptionFactoryImpl;
import org.apache.qpid.server.subscription.Subscription_0_10;
+import org.apache.qpid.server.txn.AlreadyKnownDtxException;
+import org.apache.qpid.server.txn.DtxNotSelectedException;
+import org.apache.qpid.server.txn.IncorrectDtxStateException;
+import org.apache.qpid.server.txn.JoinAndResumeDtxException;
+import org.apache.qpid.server.txn.NotAssociatedDtxException;
+import org.apache.qpid.server.txn.RollbackOnlyDtxException;
import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.txn.SuspendAndFailDtxException;
+import org.apache.qpid.server.txn.TimeoutDtxException;
+import org.apache.qpid.server.txn.UnknownDtxBranchException;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.transport.*;
@@ -116,7 +128,7 @@ public class ServerSessionDelegate extends SessionDelegate
serverSession.accept(method.getTransfers());
if(!serverSession.isTransactional())
{
- serverSession.recordFuture(MessageStore.IMMEDIATE_FUTURE,
+ serverSession.recordFuture(StoreFuture.IMMEDIATE_FUTURE,
new CommandProcessedAction(serverSession, method));
}
}
@@ -199,6 +211,10 @@ public class ServerSessionDelegate extends SessionDelegate
{
exception(session,method,ExecutionErrorCode.RESOURCE_LOCKED, "Exclusive Queue: " + queueName + " owned exclusively by another session");
}
+ else if(queue.isExclusive() && queue.getExclusiveOwningSession() != null && queue.getExclusiveOwningSession() != session)
+ {
+ exception(session,method,ExecutionErrorCode.RESOURCE_LOCKED, "Exclusive Queue: " + queueName + " owned exclusively by another session");
+ }
else
{
if(queue.isExclusive())
@@ -221,7 +237,6 @@ public class ServerSessionDelegate extends SessionDelegate
}
});
}
-
}
FlowCreditManager_0_10 creditManager = new WindowCreditManager(0L,0L);
@@ -281,6 +296,7 @@ public class ServerSessionDelegate extends SessionDelegate
}
final MessageMetaData_0_10 messageMetaData = new MessageMetaData_0_10(xfr);
+ messageMetaData.setConnectionReference(((ServerSession)ssn).getReference());
if (!getVirtualHost(ssn).getSecurityManager().authorisePublish(messageMetaData.isImmediate(), messageMetaData.getRoutingKey(), exchange.getName()))
{
@@ -342,7 +358,7 @@ public class ServerSessionDelegate extends SessionDelegate
}
else
{
- serverSession.recordFuture(MessageStore.IMMEDIATE_FUTURE, new CommandProcessedAction(serverSession, xfr));
+ serverSession.recordFuture(StoreFuture.IMMEDIATE_FUTURE, new CommandProcessedAction(serverSession, xfr));
}
}
@@ -426,6 +442,235 @@ public class ServerSessionDelegate extends SessionDelegate
((ServerSession)session).rollback();
}
+ @Override
+ public void dtxSelect(Session session, DtxSelect method)
+ {
+ // TODO - check current tx mode
+ ((ServerSession)session).selectDtx();
+ }
+
+ @Override
+ public void dtxStart(Session session, DtxStart method)
+ {
+ XaResult result = new XaResult();
+ result.setStatus(DtxXaStatus.XA_OK);
+ try
+ {
+ ((ServerSession)session).startDtx(method.getXid(), method.getJoin(), method.getResume());
+ session.executionResult(method.getId(), result);
+ }
+ catch(JoinAndResumeDtxException e)
+ {
+ exception(session, method, ExecutionErrorCode.COMMAND_INVALID, e.getMessage());
+ }
+ catch(UnknownDtxBranchException e)
+ {
+ exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Unknown xid " + method.getXid());
+ }
+ catch(AlreadyKnownDtxException e)
+ {
+ exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Xid already started an neither join nor " +
+ "resume set" + method.getXid());
+ }
+ catch(DtxNotSelectedException e)
+ {
+ exception(session, method, ExecutionErrorCode.COMMAND_INVALID, e.getMessage());
+ }
+
+ }
+
+ @Override
+ public void dtxEnd(Session session, DtxEnd method)
+ {
+ XaResult result = new XaResult();
+ result.setStatus(DtxXaStatus.XA_OK);
+ try
+ {
+ try
+ {
+ ((ServerSession)session).endDtx(method.getXid(), method.getFail(), method.getSuspend());
+ }
+ catch (TimeoutDtxException e)
+ {
+ result.setStatus(DtxXaStatus.XA_RBTIMEOUT);
+ }
+ session.executionResult(method.getId(), result);
+ }
+ catch(UnknownDtxBranchException e)
+ {
+ exception(session, method, ExecutionErrorCode.ILLEGAL_STATE, e.getMessage());
+ }
+ catch(NotAssociatedDtxException e)
+ {
+ exception(session, method, ExecutionErrorCode.ILLEGAL_STATE, e.getMessage());
+ }
+ catch(DtxNotSelectedException e)
+ {
+ exception(session, method, ExecutionErrorCode.ILLEGAL_STATE, e.getMessage());
+ }
+ catch(SuspendAndFailDtxException e)
+ {
+ exception(session, method, ExecutionErrorCode.COMMAND_INVALID, e.getMessage());
+ }
+
+ }
+
+ @Override
+ public void dtxCommit(Session session, DtxCommit method)
+ {
+ XaResult result = new XaResult();
+ result.setStatus(DtxXaStatus.XA_OK);
+ try
+ {
+ try
+ {
+ ((ServerSession)session).commitDtx(method.getXid(), method.getOnePhase());
+ }
+ catch (RollbackOnlyDtxException e)
+ {
+ result.setStatus(DtxXaStatus.XA_RBROLLBACK);
+ }
+ catch (TimeoutDtxException e)
+ {
+ result.setStatus(DtxXaStatus.XA_RBTIMEOUT);
+ }
+ session.executionResult(method.getId(), result);
+ }
+ catch(UnknownDtxBranchException e)
+ {
+ exception(session, method, ExecutionErrorCode.NOT_FOUND, e.getMessage());
+ }
+ catch(IncorrectDtxStateException e)
+ {
+ exception(session, method, ExecutionErrorCode.ILLEGAL_STATE, e.getMessage());
+ }
+ catch(AMQStoreException e)
+ {
+ exception(session, method, ExecutionErrorCode.INTERNAL_ERROR, e.getMessage());
+ }
+ }
+
+ @Override
+ public void dtxForget(Session session, DtxForget method)
+ {
+ try
+ {
+ ((ServerSession)session).forgetDtx(method.getXid());
+ }
+ catch(UnknownDtxBranchException e)
+ {
+ exception(session, method, ExecutionErrorCode.NOT_FOUND, e.getMessage());
+ }
+ catch(IncorrectDtxStateException e)
+ {
+ exception(session, method, ExecutionErrorCode.ILLEGAL_STATE, e.getMessage());
+ }
+
+ }
+
+ @Override
+ public void dtxGetTimeout(Session session, DtxGetTimeout method)
+ {
+ GetTimeoutResult result = new GetTimeoutResult();
+ try
+ {
+ result.setTimeout(((ServerSession) session).getTimeoutDtx(method.getXid()));
+ session.executionResult(method.getId(), result);
+ }
+ catch(UnknownDtxBranchException e)
+ {
+ exception(session, method, ExecutionErrorCode.NOT_FOUND, e.getMessage());
+ }
+ }
+
+ @Override
+ public void dtxPrepare(Session session, DtxPrepare method)
+ {
+ XaResult result = new XaResult();
+ result.setStatus(DtxXaStatus.XA_OK);
+ try
+ {
+ try
+ {
+ ((ServerSession)session).prepareDtx(method.getXid());
+ }
+ catch (RollbackOnlyDtxException e)
+ {
+ result.setStatus(DtxXaStatus.XA_RBROLLBACK);
+ }
+ catch (TimeoutDtxException e)
+ {
+ result.setStatus(DtxXaStatus.XA_RBTIMEOUT);
+ }
+ session.executionResult((int) method.getId(), result);
+ }
+ catch(UnknownDtxBranchException e)
+ {
+ exception(session, method, ExecutionErrorCode.NOT_FOUND, e.getMessage());
+ }
+ catch(IncorrectDtxStateException e)
+ {
+ exception(session, method, ExecutionErrorCode.ILLEGAL_STATE, e.getMessage());
+ }
+ catch(AMQStoreException e)
+ {
+ exception(session, method, ExecutionErrorCode.INTERNAL_ERROR, e.getMessage());
+ }
+ }
+
+ @Override
+ public void dtxRecover(Session session, DtxRecover method)
+ {
+ RecoverResult result = new RecoverResult();
+ List inDoubt = ((ServerSession)session).recoverDtx();
+ result.setInDoubt(inDoubt);
+ session.executionResult(method.getId(), result);
+ }
+
+ @Override
+ public void dtxRollback(Session session, DtxRollback method)
+ {
+
+ XaResult result = new XaResult();
+ result.setStatus(DtxXaStatus.XA_OK);
+ try
+ {
+ try
+ {
+ ((ServerSession)session).rollbackDtx(method.getXid());
+ }
+ catch (TimeoutDtxException e)
+ {
+ result.setStatus(DtxXaStatus.XA_RBTIMEOUT);
+ }
+ session.executionResult(method.getId(), result);
+ }
+ catch(UnknownDtxBranchException e)
+ {
+ exception(session, method, ExecutionErrorCode.NOT_FOUND, e.getMessage());
+ }
+ catch(IncorrectDtxStateException e)
+ {
+ exception(session, method, ExecutionErrorCode.ILLEGAL_STATE, e.getMessage());
+ }
+ catch(AMQStoreException e)
+ {
+ exception(session, method, ExecutionErrorCode.INTERNAL_ERROR, e.getMessage());
+ }
+ }
+
+ @Override
+ public void dtxSetTimeout(Session session, DtxSetTimeout method)
+ {
+ try
+ {
+ ((ServerSession)session).setTimeoutDtx(method.getXid(), method.getTimeout());
+ }
+ catch(UnknownDtxBranchException e)
+ {
+ exception(session, method, ExecutionErrorCode.NOT_FOUND, e.getMessage());
+ }
+ }
@Override
public void executionSync(final Session ssn, final ExecutionSync sync)
@@ -439,13 +684,12 @@ public class ServerSessionDelegate extends SessionDelegate
{
String exchangeName = method.getExchange();
VirtualHost virtualHost = getVirtualHost(session);
- Exchange exchange = getExchange(session, exchangeName);
+ ExchangeRegistry exchangeRegistry = getExchangeRegistry(session);
//we must check for any unsupported arguments present and throw not-implemented
if(method.hasArguments())
{
Map<String,Object> args = method.getArguments();
-
//QPID-3392: currently we don't support any!
if(!args.isEmpty())
{
@@ -453,72 +697,113 @@ public class ServerSessionDelegate extends SessionDelegate
return;
}
}
-
- if(method.getPassive())
+ synchronized(exchangeRegistry)
{
- if(exchange == null)
- {
- exception(session, method, ExecutionErrorCode.NOT_FOUND, "not-found: exchange-name '"+exchangeName+"'");
+ Exchange exchange = getExchange(session, exchangeName);
- }
- else
+ if(method.getPassive())
{
- if(!exchange.getTypeShortString().toString().equals(method.getType()) && (method.getType() != null && method.getType().length() > 0))
+ if(exchange == null)
+ {
+ exception(session, method, ExecutionErrorCode.NOT_FOUND, "not-found: exchange-name '" + exchangeName + "'");
+ }
+ else
{
- exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Attempt to redeclare exchange: " + exchangeName + " of type " + exchange.getTypeShortString() + " to " + method.getType() +".");
+ if (!exchange.getTypeShortString().toString().equals(method.getType())
+ && (method.getType() != null && method.getType().length() > 0))
+ {
+ exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Attempt to redeclare exchange: "
+ + exchangeName + " of type " + exchange.getTypeShortString() + " to " + method.getType() + ".");
+ }
}
}
-
- }
- else
- {
- if (exchange == null)
+ else
{
- ExchangeRegistry exchangeRegistry = getExchangeRegistry(session);
- ExchangeFactory exchangeFactory = virtualHost.getExchangeFactory();
-
-
-
- try
+ if (exchange == null)
{
-
- exchange = exchangeFactory.createExchange(method.getExchange(),
- method.getType(),
- method.getDurable(),
- method.getAutoDelete());
-
- String alternateExchangeName = method.getAlternateExchange();
- if(alternateExchangeName != null && alternateExchangeName.length() != 0)
+ if (exchangeName.startsWith("amq."))
{
- Exchange alternate = getExchange(session, alternateExchangeName);
- exchange.setAlternateExchange(alternate);
+ exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Attempt to declare exchange: "
+ + exchangeName + " which begins with reserved prefix 'amq.'.");
}
-
- if (exchange.isDurable())
+ else if (exchangeName.startsWith("qpid."))
{
- DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
- store.createExchange(exchange);
+ exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Attempt to declare exchange: "
+ + exchangeName + " which begins with reserved prefix 'qpid.'.");
+ }
+ else
+ {
+ ExchangeFactory exchangeFactory = virtualHost.getExchangeFactory();
+ try
+ {
+ exchange = exchangeFactory.createExchange(method.getExchange(),
+ method.getType(),
+ method.getDurable(),
+ method.getAutoDelete());
+ String alternateExchangeName = method.getAlternateExchange();
+ boolean validAlternate;
+ if(alternateExchangeName != null && alternateExchangeName.length() != 0)
+ {
+ Exchange alternate = getExchange(session, alternateExchangeName);
+ if(alternate == null)
+ {
+ validAlternate = false;
+ }
+ else
+ {
+ exchange.setAlternateExchange(alternate);
+ validAlternate = true;
+ }
+ }
+ else
+ {
+ validAlternate = true;
+ }
+ if(validAlternate)
+ {
+ if (exchange.isDurable())
+ {
+ DurableConfigurationStore store = virtualHost.getMessageStore();
+ store.createExchange(exchange);
+ }
+ exchangeRegistry.registerExchange(exchange);
+ }
+ else
+ {
+ exception(session, method, ExecutionErrorCode.NOT_FOUND,
+ "Unknown alternate exchange " + alternateExchangeName);
+ }
+ }
+ catch(AMQUnknownExchangeType e)
+ {
+ exception(session, method, ExecutionErrorCode.NOT_FOUND, "Unknown Exchange Type: " + method.getType());
+ }
+ catch (AMQException e)
+ {
+ exception(session, method, e, "Cannot declare exchange '" + exchangeName);
+ }
}
-
- exchangeRegistry.registerExchange(exchange);
- }
- catch(AMQUnknownExchangeType e)
- {
- exception(session, method, ExecutionErrorCode.NOT_FOUND, "Unknown Exchange Type: " + method.getType());
- }
- catch (AMQException e)
- {
- exception(session, method, e, "Cannot declare exchange '" + exchangeName);
}
- }
- else
- {
- if(!exchange.getTypeShortString().toString().equals(method.getType()))
+ else
{
- exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Attempt to redeclare exchange: " + exchangeName + " of type " + exchange.getTypeShortString() + " to " + method.getType() +".");
+ if(!exchange.getTypeShortString().toString().equals(method.getType()))
+ {
+ exception(session, method, ExecutionErrorCode.NOT_ALLOWED,
+ "Attempt to redeclare exchange: " + exchangeName
+ + " of type " + exchange.getTypeShortString()
+ + " to " + method.getType() +".");
+ }
+ else if(method.hasAlternateExchange()
+ && (exchange.getAlternateExchange() == null ||
+ !method.getAlternateExchange().equals(exchange.getAlternateExchange().getName())))
+ {
+ exception(session, method, ExecutionErrorCode.NOT_ALLOWED,
+ "Attempt to change alternate exchange of: " + exchangeName
+ + " from " + exchange.getAlternateExchange()
+ + " to " + method.getAlternateExchange() +".");
+ }
}
}
-
}
}
@@ -633,7 +918,7 @@ public class ServerSessionDelegate extends SessionDelegate
if (exchange.isDurable() && !exchange.isAutoDelete())
{
- DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
+ DurableConfigurationStore store = virtualHost.getMessageStore();
store.removeExchange(exchange);
}
}
@@ -732,10 +1017,7 @@ public class ServerSessionDelegate extends SessionDelegate
}
else
{
- AMQShortString routingKey = new AMQShortString(method.getBindingKey());
- FieldTable fieldTable = FieldTable.convertToFieldTable(method.getArguments());
-
- if (!exchange.isBound(routingKey, fieldTable, queue))
+ if (!exchange.isBound(method.getBindingKey(), method.getArguments(), queue))
{
try
{
@@ -847,12 +1129,6 @@ public class ServerSessionDelegate extends SessionDelegate
if(method.hasBindingKey())
{
- if(method.hasArguments())
- {
- FieldTable args = FieldTable.convertToFieldTable(method.getArguments());
-
- result.setArgsNotMatched(!exchange.isBound(new AMQShortString(method.getBindingKey()), args, queue));
- }
if(queueMatched)
{
result.setKeyNotMatched(!exchange.isBound(method.getBindingKey(), queue));
@@ -861,23 +1137,28 @@ public class ServerSessionDelegate extends SessionDelegate
{
result.setKeyNotMatched(!exchange.isBound(method.getBindingKey()));
}
+
+ if(method.hasArguments())
+ {
+ result.setArgsNotMatched(!exchange.isBound(result.getKeyNotMatched() ? null : method.getBindingKey(), method.getArguments(), queueMatched ? queue : null));
+ }
+
}
else if (method.hasArguments())
{
- // TODO
-
+ result.setArgsNotMatched(!exchange.isBound(null, method.getArguments(), queueMatched ? queue : null));
}
- result.setQueueNotMatched(!exchange.isBound(queue));
-
}
else if(exchange != null && method.hasBindingKey())
{
+ result.setKeyNotMatched(!exchange.isBound(method.getBindingKey()));
+
if(method.hasArguments())
{
- // TODO
+ result.setArgsNotMatched(!exchange.isBound(result.getKeyNotMatched() ? null : method.getBindingKey(), method.getArguments(), queue));
}
- result.setKeyNotMatched(!exchange.isBound(method.getBindingKey()));
+
}
@@ -886,11 +1167,15 @@ public class ServerSessionDelegate extends SessionDelegate
{
if(method.hasArguments())
{
- // TODO
+ result.setArgsNotMatched(!exchange.isBound(method.getBindingKey(), method.getArguments(), null));
}
result.setKeyNotMatched(!exchange.isBound(method.getBindingKey()));
}
+ else if(exchange != null && method.hasArguments())
+ {
+ result.setArgsNotMatched(!exchange.isBound(null, method.getArguments(), null));
+ }
session.executionResult((int) method.getId(), result);
@@ -914,7 +1199,7 @@ public class ServerSessionDelegate extends SessionDelegate
{
VirtualHost virtualHost = getVirtualHost(session);
- DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
+ DurableConfigurationStore store = virtualHost.getMessageStore();
String queueName = method.getQueue();
AMQQueue queue;
@@ -1104,8 +1389,8 @@ public class ServerSessionDelegate extends SessionDelegate
{
String owner = body.getExclusive() ? session.getClientID() : null;
- final AMQQueue queue = AMQQueueFactory.createAMQQueueImpl(queueName, body.getDurable(), owner, body.getAutoDelete(),
- body.getExclusive(), virtualHost, body.getArguments());
+ final AMQQueue queue = AMQQueueFactory.createAMQQueueImpl(UUIDGenerator.generateUUID(), queueName, body.getDurable(), owner,
+ body.getAutoDelete(), body.getExclusive(), virtualHost, body.getArguments());
return queue;
}
@@ -1134,6 +1419,10 @@ public class ServerSessionDelegate extends SessionDelegate
{
exception(session,method,ExecutionErrorCode.RESOURCE_LOCKED, "Exclusive Queue: " + queueName + " owned exclusively by another session");
}
+ else if(queue.isExclusive() && queue.getExclusiveOwningSession() != null && queue.getExclusiveOwningSession() != session)
+ {
+ exception(session,method,ExecutionErrorCode.RESOURCE_LOCKED, "Exclusive Queue: " + queueName + " owned exclusively by another session");
+ }
else if (method.getIfEmpty() && !queue.isEmpty())
{
exception(session, method, ExecutionErrorCode.PRECONDITION_FAILED, "Queue " + queueName + " not empty");
@@ -1153,7 +1442,7 @@ public class ServerSessionDelegate extends SessionDelegate
queue.delete();
if (queue.isDurable() && !queue.isAutoDelete())
{
- DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
+ DurableConfigurationStore store = virtualHost.getMessageStore();
store.removeQueue(queue);
}
}
@@ -1280,8 +1569,9 @@ public class ServerSessionDelegate extends SessionDelegate
ServerSession serverSession = (ServerSession)session;
- serverSession.unregisterSubscriptions();
+ serverSession.stopSubscriptions();
serverSession.onClose();
+ serverSession.unregisterSubscriptions();
}
@Override
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/AlreadyKnownDtxException.java b/java/broker/src/main/java/org/apache/qpid/server/txn/AlreadyKnownDtxException.java
new file mode 100644
index 0000000000..faa4ec592f
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/AlreadyKnownDtxException.java
@@ -0,0 +1,32 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.txn;
+
+import org.apache.qpid.transport.Xid;
+
+public class AlreadyKnownDtxException extends DtxException
+{
+ public AlreadyKnownDtxException(Xid id)
+ {
+ super("Xid " + id + " cannot be started as it is already known");
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/AsyncAutoCommitTransaction.java b/java/broker/src/main/java/org/apache/qpid/server/txn/AsyncAutoCommitTransaction.java
index a062c6732f..d446434d24 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/txn/AsyncAutoCommitTransaction.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/AsyncAutoCommitTransaction.java
@@ -29,7 +29,8 @@ import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.store.MessageStore;
-import org.apache.qpid.server.store.MessageStore.StoreFuture;
+import org.apache.qpid.server.store.StoreFuture;
+import org.apache.qpid.server.store.Transaction;
import java.util.Collection;
import java.util.List;
@@ -71,16 +72,16 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
*/
public void addPostTransactionAction(final Action immediateAction)
{
- addFuture(MessageStore.IMMEDIATE_FUTURE, immediateAction);
+ addFuture(StoreFuture.IMMEDIATE_FUTURE, immediateAction);
}
public void dequeue(BaseQueue queue, EnqueableMessage message, Action postTransactionAction)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
- MessageStore.StoreFuture future;
+ StoreFuture future;
if(message.isPersistent() && queue.isDurable())
{
if (_logger.isDebugEnabled())
@@ -96,7 +97,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
else
{
- future = MessageStore.IMMEDIATE_FUTURE;
+ future = StoreFuture.IMMEDIATE_FUTURE;
}
addFuture(future, postTransactionAction);
postTransactionAction = null;
@@ -113,7 +114,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
- private void addFuture(final MessageStore.StoreFuture future, final Action action)
+ private void addFuture(final StoreFuture future, final Action action)
{
if(action != null)
{
@@ -130,7 +131,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
public void dequeue(Collection<QueueEntry> queueEntries, Action postTransactionAction)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
for(QueueEntry entry : queueEntries)
@@ -154,7 +155,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
}
- MessageStore.StoreFuture future;
+ StoreFuture future;
if(txn != null)
{
future = txn.commitTranAsync();
@@ -162,7 +163,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
else
{
- future = MessageStore.IMMEDIATE_FUTURE;
+ future = StoreFuture.IMMEDIATE_FUTURE;
}
addFuture(future, postTransactionAction);
postTransactionAction = null;
@@ -182,10 +183,10 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
public void enqueue(BaseQueue queue, EnqueableMessage message, Action postTransactionAction)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
- MessageStore.StoreFuture future;
+ StoreFuture future;
if(message.isPersistent() && queue.isDurable())
{
if (_logger.isDebugEnabled())
@@ -200,7 +201,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
else
{
- future = MessageStore.IMMEDIATE_FUTURE;
+ future = StoreFuture.IMMEDIATE_FUTURE;
}
addFuture(future, postTransactionAction);
postTransactionAction = null;
@@ -220,7 +221,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
public void enqueue(List<? extends BaseQueue> queues, EnqueableMessage message, Action postTransactionAction, long currentTime)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
@@ -246,7 +247,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
}
- MessageStore.StoreFuture future;
+ StoreFuture future;
if (txn != null)
{
future = txn.commitTranAsync();
@@ -254,7 +255,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
else
{
- future = MessageStore.IMMEDIATE_FUTURE;
+ future = StoreFuture.IMMEDIATE_FUTURE;
}
addFuture(future, postTransactionAction);
postTransactionAction = null;
@@ -278,7 +279,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
{
if(immediatePostTransactionAction != null)
{
- addFuture(MessageStore.IMMEDIATE_FUTURE, new Action()
+ addFuture(StoreFuture.IMMEDIATE_FUTURE, new Action()
{
public void postCommit()
{
@@ -305,7 +306,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
return false;
}
- private void rollbackIfNecessary(Action postTransactionAction, MessageStore.Transaction txn)
+ private void rollbackIfNecessary(Action postTransactionAction, Transaction txn)
{
if (txn != null)
{
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/AutoCommitTransaction.java b/java/broker/src/main/java/org/apache/qpid/server/txn/AutoCommitTransaction.java
index 597797b5f8..e5a7df6880 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/txn/AutoCommitTransaction.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/AutoCommitTransaction.java
@@ -29,6 +29,7 @@ import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.Transaction;
import java.util.Collection;
import java.util.List;
@@ -67,7 +68,7 @@ public class AutoCommitTransaction implements ServerTransaction
public void dequeue(BaseQueue queue, EnqueableMessage message, Action postTransactionAction)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
if(message.isPersistent() && queue.isDurable())
@@ -99,7 +100,7 @@ public class AutoCommitTransaction implements ServerTransaction
public void dequeue(Collection<QueueEntry> queueEntries, Action postTransactionAction)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
for(QueueEntry entry : queueEntries)
@@ -146,7 +147,7 @@ public class AutoCommitTransaction implements ServerTransaction
public void enqueue(BaseQueue queue, EnqueableMessage message, Action postTransactionAction)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
if(message.isPersistent() && queue.isDurable())
@@ -179,7 +180,7 @@ public class AutoCommitTransaction implements ServerTransaction
public void enqueue(List<? extends BaseQueue> queues, EnqueableMessage message, Action postTransactionAction, long currentTime)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
@@ -247,7 +248,7 @@ public class AutoCommitTransaction implements ServerTransaction
return false;
}
- private void rollbackIfNecessary(Action postTransactionAction, MessageStore.Transaction txn)
+ private void rollbackIfNecessary(Action postTransactionAction, Transaction txn)
{
if (txn != null)
{
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/DistributedTransaction.java b/java/broker/src/main/java/org/apache/qpid/server/txn/DistributedTransaction.java
new file mode 100644
index 0000000000..05d0110e9b
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/DistributedTransaction.java
@@ -0,0 +1,247 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.txn;
+
+import org.apache.qpid.server.message.EnqueableMessage;
+import org.apache.qpid.server.protocol.AMQSessionModel;
+import org.apache.qpid.server.queue.BaseQueue;
+import org.apache.qpid.server.queue.QueueEntry;
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.Transaction;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+import org.apache.qpid.transport.Xid;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+public class DistributedTransaction implements ServerTransaction
+{
+
+ private final AutoCommitTransaction _autoCommitTransaction;
+
+ private volatile Transaction _transaction;
+
+ private long _txnStartTime = 0L;
+
+ private DtxBranch _branch;
+ private AMQSessionModel _session;
+ private VirtualHost _vhost;
+
+
+ public DistributedTransaction(AMQSessionModel session, MessageStore store, VirtualHost vhost)
+ {
+ _session = session;
+ _vhost = vhost;
+ _autoCommitTransaction = new AutoCommitTransaction(vhost.getMessageStore());
+ }
+
+ public long getTransactionStartTime()
+ {
+ return _txnStartTime;
+ }
+
+ public void addPostTransactionAction(Action postTransactionAction)
+ {
+ if(_branch != null)
+ {
+ _branch.addPostTransactionAcion(postTransactionAction);
+ }
+ else
+ {
+ _autoCommitTransaction.addPostTransactionAction(postTransactionAction);
+ }
+ }
+
+ public void dequeue(BaseQueue queue, EnqueableMessage message, Action postTransactionAction)
+ {
+ if(_branch != null)
+ {
+ _branch.dequeue(queue, message);
+ _branch.addPostTransactionAcion(postTransactionAction);
+ }
+ else
+ {
+ _autoCommitTransaction.dequeue(queue, message, postTransactionAction);
+ }
+ }
+
+ public void dequeue(Collection<QueueEntry> messages, Action postTransactionAction)
+ {
+ if(_branch != null)
+ {
+ for(QueueEntry entry : messages)
+ {
+ _branch.dequeue(entry.getQueue(), entry.getMessage());
+ }
+ _branch.addPostTransactionAcion(postTransactionAction);
+ }
+ else
+ {
+ _autoCommitTransaction.dequeue(messages, postTransactionAction);
+ }
+ }
+
+ public void enqueue(BaseQueue queue, EnqueableMessage message, Action postTransactionAction)
+ {
+ if(_branch != null)
+ {
+ _branch.enqueue(queue, message);
+ _branch.addPostTransactionAcion(postTransactionAction);
+ enqueue(Collections.singletonList(queue), message, postTransactionAction, System.currentTimeMillis());
+ }
+ else
+ {
+ _autoCommitTransaction.enqueue(queue, message, postTransactionAction);
+ }
+ }
+
+ public void enqueue(List<? extends BaseQueue> queues, EnqueableMessage message,
+ Action postTransactionAction, long currentTime)
+ {
+ if(_branch != null)
+ {
+ for(BaseQueue queue : queues)
+ {
+ _branch.enqueue(queue, message);
+ }
+ _branch.addPostTransactionAcion(postTransactionAction);
+ }
+ else
+ {
+ _autoCommitTransaction.enqueue(queues, message, postTransactionAction, currentTime);
+ }
+ }
+
+ public void commit()
+ {
+ throw new IllegalStateException("Cannot call tx.commit() on a distributed transaction");
+ }
+
+ public void commit(Runnable immediatePostTransactionAction)
+ {
+ throw new IllegalStateException("Cannot call tx.commit() on a distributed transaction");
+ }
+
+ public void rollback()
+ {
+ throw new IllegalStateException("Cannot call tx.rollback() on a distributed transaction");
+ }
+
+ public boolean isTransactional()
+ {
+ return _branch != null;
+ }
+
+ public void start(Xid id, boolean join, boolean resume)
+ throws UnknownDtxBranchException, AlreadyKnownDtxException, JoinAndResumeDtxException
+ {
+ if(join && resume)
+ {
+ throw new JoinAndResumeDtxException(id);
+ }
+
+ DtxBranch branch = _vhost.getDtxRegistry().getBranch(id);
+
+ if(branch == null)
+ {
+ if(join || resume)
+ {
+ throw new UnknownDtxBranchException(id);
+ }
+ branch = new DtxBranch(id,_vhost.getMessageStore(), _vhost);
+ if(_vhost.getDtxRegistry().registerBranch(branch))
+ {
+ _branch = branch;
+ branch.associateSession(_session);
+ }
+ else
+ {
+ throw new AlreadyKnownDtxException(id);
+ }
+ }
+ else
+ {
+ if(join)
+ {
+ branch.associateSession(_session);
+ }
+ else if(resume)
+ {
+ branch.resumeSession(_session);
+ }
+ else
+ {
+ throw new AlreadyKnownDtxException(id);
+ }
+ _branch = branch;
+ }
+ }
+
+ public void end(Xid id, boolean fail, boolean suspend)
+ throws UnknownDtxBranchException, NotAssociatedDtxException, SuspendAndFailDtxException, TimeoutDtxException
+ {
+ DtxBranch branch = _vhost.getDtxRegistry().getBranch(id);
+
+ if(suspend && fail)
+ {
+ branch.disassociateSession(_session);
+ _branch = null;
+ throw new SuspendAndFailDtxException(id);
+ }
+
+
+ if(branch == null)
+ {
+ throw new UnknownDtxBranchException(id);
+ }
+ else
+ {
+ if(!branch.isAssociated(_session))
+ {
+ throw new NotAssociatedDtxException(id);
+ }
+ if(branch.expired() || branch.getState() == DtxBranch.State.TIMEDOUT)
+ {
+ branch.disassociateSession(_session);
+ throw new TimeoutDtxException(id);
+ }
+
+ if(suspend)
+ {
+ branch.suspendSession(_session);
+ }
+ else
+ {
+ if(fail)
+ {
+ branch.setState(DtxBranch.State.ROLLBACK_ONLY);
+ }
+ branch.disassociateSession(_session);
+ }
+
+ _branch = null;
+
+ }
+ }
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/DtxBranch.java b/java/broker/src/main/java/org/apache/qpid/server/txn/DtxBranch.java
new file mode 100644
index 0000000000..3ac71fc6a6
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/DtxBranch.java
@@ -0,0 +1,349 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.txn;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ScheduledFuture;
+
+import org.apache.log4j.Logger;
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.server.message.EnqueableMessage;
+import org.apache.qpid.server.protocol.AMQSessionModel;
+import org.apache.qpid.server.queue.BaseQueue;
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.Transaction;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+import org.apache.qpid.transport.Xid;
+
+public class DtxBranch
+{
+ private static final Logger _logger = Logger.getLogger(DtxBranch.class);
+
+ private final Xid _xid;
+ private final List<ServerTransaction.Action> _postTransactionActions = new ArrayList<ServerTransaction.Action>();
+ private State _state = State.ACTIVE;
+ private long _timeout;
+ private Map<AMQSessionModel, State> _associatedSessions = new HashMap<AMQSessionModel, State>();
+ private final List<Record> _enqueueRecords = new ArrayList<Record>();
+ private final List<Record> _dequeueRecords = new ArrayList<Record>();
+
+ private Transaction _transaction;
+ private long _expiration;
+ private VirtualHost _vhost;
+ private ScheduledFuture<?> _timeoutFuture;
+ private MessageStore _store;
+
+
+ public enum State
+ {
+ ACTIVE,
+ PREPARED,
+ TIMEDOUT,
+ SUSPENDED,
+ FORGOTTEN,
+ HEUR_COM,
+ HEUR_RB,
+ ROLLBACK_ONLY
+ }
+
+
+ public DtxBranch(Xid xid, MessageStore store, VirtualHost vhost)
+ {
+ _xid = xid;
+ _store = store;
+ _vhost = vhost;
+ }
+
+ public Xid getXid()
+ {
+ return _xid;
+ }
+
+ public State getState()
+ {
+ return _state;
+ }
+
+ public void setState(State state)
+ {
+ _state = state;
+ }
+
+ public long getTimeout()
+ {
+ return _timeout;
+ }
+
+ public void setTimeout(long timeout)
+ {
+ if(_timeoutFuture != null)
+ {
+ _timeoutFuture.cancel(false);
+ }
+ _timeout = timeout;
+ _expiration = timeout == 0 ? 0 : System.currentTimeMillis() + timeout;
+
+ if(_timeout == 0)
+ {
+ _timeoutFuture = null;
+ }
+ else
+ {
+ _timeoutFuture = _vhost.scheduleTask(_timeout, new Runnable()
+ {
+ public void run()
+ {
+ setState(State.TIMEDOUT);
+ try
+ {
+ rollback();
+ }
+ catch (AMQStoreException e)
+ {
+ _logger.error("Unexpected error when attempting to rollback XA transaction ("+
+ _xid + ") due to timeout", e);
+ throw new RuntimeException(e);
+ }
+ }
+ });
+ }
+ }
+
+ public boolean expired()
+ {
+ return _timeout != 0 && _expiration < System.currentTimeMillis();
+ }
+
+ public synchronized boolean isAssociated(AMQSessionModel session)
+ {
+ return _associatedSessions.containsKey(session);
+ }
+
+ public synchronized boolean hasAssociatedSessions()
+ {
+ return !_associatedSessions.isEmpty();
+ }
+
+
+ public synchronized boolean hasAssociatedActiveSessions()
+ {
+ if(hasAssociatedSessions())
+ {
+ for(State state : _associatedSessions.values())
+ {
+ if(state != State.SUSPENDED)
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public synchronized void clearAssociations()
+ {
+ _associatedSessions.clear();
+ }
+
+ synchronized boolean associateSession(AMQSessionModel associatedSession)
+ {
+ return _associatedSessions.put(associatedSession, State.ACTIVE) != null;
+ }
+
+ synchronized boolean disassociateSession(AMQSessionModel associatedSession)
+ {
+ return _associatedSessions.remove(associatedSession) != null;
+ }
+
+ public synchronized boolean resumeSession(AMQSessionModel session)
+ {
+ if(_associatedSessions.containsKey(session) && _associatedSessions.get(session) == State.SUSPENDED)
+ {
+ _associatedSessions.put(session, State.ACTIVE);
+ return true;
+ }
+ return false;
+ }
+
+ public synchronized boolean suspendSession(AMQSessionModel session)
+ {
+ if(_associatedSessions.containsKey(session) && _associatedSessions.get(session) == State.ACTIVE)
+ {
+ _associatedSessions.put(session, State.SUSPENDED);
+ return true;
+ }
+ return false;
+ }
+
+ public void prepare() throws AMQStoreException
+ {
+
+ Transaction txn = _store.newTransaction();
+ txn.recordXid(_xid.getFormat(),
+ _xid.getGlobalId(),
+ _xid.getBranchId(),
+ _enqueueRecords.toArray(new Record[_enqueueRecords.size()]),
+ _dequeueRecords.toArray(new Record[_dequeueRecords.size()]));
+ txn.commitTran();
+
+ prePrepareTransaction();
+ }
+
+ public synchronized void rollback() throws AMQStoreException
+ {
+ if(_timeoutFuture != null)
+ {
+ _timeoutFuture.cancel(false);
+ _timeoutFuture = null;
+ }
+
+
+ if(_transaction != null)
+ {
+ // prepare has previously been called
+
+ Transaction txn = _store.newTransaction();
+ txn.removeXid(_xid.getFormat(), _xid.getGlobalId(), _xid.getBranchId());
+ txn.commitTran();
+
+ _transaction.abortTran();
+ }
+
+ for(ServerTransaction.Action action : _postTransactionActions)
+ {
+ action.onRollback();
+ }
+ _postTransactionActions.clear();
+ }
+
+ public void commit() throws AMQStoreException
+ {
+ if(_timeoutFuture != null)
+ {
+ _timeoutFuture.cancel(false);
+ _timeoutFuture = null;
+ }
+
+ if(_transaction == null)
+ {
+ prePrepareTransaction();
+ }
+ else
+ {
+ _transaction.removeXid(_xid.getFormat(), _xid.getGlobalId(), _xid.getBranchId());
+ }
+ _transaction.commitTran();
+
+ for(ServerTransaction.Action action : _postTransactionActions)
+ {
+ action.postCommit();
+ }
+ _postTransactionActions.clear();
+ }
+
+ public void prePrepareTransaction() throws AMQStoreException
+ {
+ _transaction = _store.newTransaction();
+
+ for(Record enqueue : _enqueueRecords)
+ {
+ if(enqueue.isDurable())
+ {
+ _transaction.enqueueMessage(enqueue.getQueue(), enqueue.getMessage());
+ }
+ }
+
+
+ for(Record enqueue : _dequeueRecords)
+ {
+ if(enqueue.isDurable())
+ {
+ _transaction.dequeueMessage(enqueue.getQueue(), enqueue.getMessage());
+ }
+ }
+ }
+
+
+ public void addPostTransactionAcion(ServerTransaction.Action postTransactionAction)
+ {
+ _postTransactionActions.add(postTransactionAction);
+ }
+
+
+ public void dequeue(BaseQueue queue, EnqueableMessage message)
+ {
+ _dequeueRecords.add(new Record(queue, message));
+ }
+
+
+ public void enqueue(BaseQueue queue, EnqueableMessage message)
+ {
+ _enqueueRecords.add(new Record(queue, message));
+ }
+
+ private static final class Record implements Transaction.Record
+ {
+ private final BaseQueue _queue;
+ private final EnqueableMessage _message;
+
+ public Record(BaseQueue queue, EnqueableMessage message)
+ {
+ _queue = queue;
+ _message = message;
+ }
+
+ public BaseQueue getQueue()
+ {
+ return _queue;
+ }
+
+ public EnqueableMessage getMessage()
+ {
+ return _message;
+ }
+
+ public boolean isDurable()
+ {
+ return _message.isPersistent() && _queue.isDurable();
+ }
+ }
+
+
+ public void close()
+ {
+ if(_transaction != null)
+ {
+ try
+ {
+ _state = null;
+ _transaction.abortTran();
+ }
+ catch(AMQStoreException e)
+ {
+ _logger.error("Error while closing XA branch", e);
+ }
+ }
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/DtxException.java b/java/broker/src/main/java/org/apache/qpid/server/txn/DtxException.java
new file mode 100644
index 0000000000..d18d0cb68b
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/DtxException.java
@@ -0,0 +1,44 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.txn;
+
+public class DtxException extends Exception
+{
+ public DtxException()
+ {
+ }
+
+ public DtxException(String message)
+ {
+ super(message);
+ }
+
+ public DtxException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
+
+ public DtxException(Throwable cause)
+ {
+ super(cause);
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/DtxNotSelectedException.java b/java/broker/src/main/java/org/apache/qpid/server/txn/DtxNotSelectedException.java
new file mode 100644
index 0000000000..c1289b1fdd
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/DtxNotSelectedException.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.txn;
+
+public class DtxNotSelectedException extends DtxException
+{
+ public DtxNotSelectedException()
+ {
+ super("Distribution transactions have not been selected on this session");
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/DtxRegistry.java b/java/broker/src/main/java/org/apache/qpid/server/txn/DtxRegistry.java
new file mode 100644
index 0000000000..5c54c1164f
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/DtxRegistry.java
@@ -0,0 +1,333 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.txn;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.server.protocol.AMQSessionModel;
+import org.apache.qpid.transport.Xid;
+
+public class DtxRegistry
+{
+ private final Map<ComparableXid, DtxBranch> _branches = new HashMap<ComparableXid, DtxBranch>();
+
+
+ private static final class ComparableXid
+ {
+ private final Xid _xid;
+
+ private ComparableXid(Xid xid)
+ {
+ _xid = xid;
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if(this == o)
+ {
+ return true;
+ }
+ if(o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ ComparableXid that = (ComparableXid) o;
+
+ return compareBytes(_xid.getBranchId(), that._xid.getBranchId())
+ && compareBytes(_xid.getGlobalId(), that._xid.getGlobalId());
+ }
+
+ private static boolean compareBytes(byte[] a, byte[] b)
+ {
+ if(a.length != b.length)
+ {
+ return false;
+ }
+ for(int i = 0; i < a.length; i++)
+ {
+ if(a[i] != b[i])
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ @Override
+ public int hashCode()
+ {
+ int result = 0;
+ for(int i = 0; i < _xid.getGlobalId().length; i++)
+ {
+ result = 31 * result + (int) _xid.getGlobalId()[i];
+ }
+ for(int i = 0; i < _xid.getBranchId().length; i++)
+ {
+ result = 31 * result + (int) _xid.getBranchId()[i];
+ }
+
+ return result;
+ }
+ }
+
+ public synchronized DtxBranch getBranch(Xid xid)
+ {
+ return _branches.get(new ComparableXid(xid));
+ }
+
+ public synchronized boolean registerBranch(DtxBranch branch)
+ {
+ ComparableXid xid = new ComparableXid(branch.getXid());
+ if(!_branches.containsKey(xid))
+ {
+ _branches.put(xid, branch);
+ return true;
+ }
+ return false;
+ }
+
+ synchronized boolean unregisterBranch(DtxBranch branch)
+ {
+ return (_branches.remove(new ComparableXid(branch.getXid())) != null);
+ }
+
+ public void commit(Xid id, boolean onePhase)
+ throws IncorrectDtxStateException, UnknownDtxBranchException, AMQStoreException, RollbackOnlyDtxException, TimeoutDtxException
+ {
+ DtxBranch branch = getBranch(id);
+ if(branch != null)
+ {
+ synchronized (branch)
+ {
+ if(!branch.hasAssociatedActiveSessions())
+ {
+ branch.clearAssociations();
+
+ if(branch.expired() || branch.getState() == DtxBranch.State.TIMEDOUT)
+ {
+ unregisterBranch(branch);
+ throw new TimeoutDtxException(id);
+ }
+ else if(branch.getState() == DtxBranch.State.ROLLBACK_ONLY)
+ {
+ throw new RollbackOnlyDtxException(id);
+ }
+ else if(onePhase && branch.getState() == DtxBranch.State.PREPARED)
+ {
+ throw new IncorrectDtxStateException("Cannot call one-phase commit on a prepared branch", id);
+ }
+ else if(!onePhase && branch.getState() != DtxBranch.State.PREPARED)
+ {
+ throw new IncorrectDtxStateException("Cannot call two-phase commit on a non-prepared branch",
+ id);
+ }
+ branch.commit();
+ branch.setState(DtxBranch.State.FORGOTTEN);
+ unregisterBranch(branch);
+ }
+ else
+ {
+ throw new IncorrectDtxStateException("Branch was still associated with a session", id);
+ }
+ }
+ }
+ else
+ {
+ throw new UnknownDtxBranchException(id);
+ }
+ }
+
+ public synchronized void prepare(Xid id)
+ throws UnknownDtxBranchException,
+ IncorrectDtxStateException, AMQStoreException, RollbackOnlyDtxException, TimeoutDtxException
+ {
+ DtxBranch branch = getBranch(id);
+ if(branch != null)
+ {
+ synchronized (branch)
+ {
+ if(!branch.hasAssociatedActiveSessions())
+ {
+ branch.clearAssociations();
+
+ if(branch.expired() || branch.getState() == DtxBranch.State.TIMEDOUT)
+ {
+ unregisterBranch(branch);
+ throw new TimeoutDtxException(id);
+ }
+ else if(branch.getState() != DtxBranch.State.ACTIVE
+ && branch.getState() != DtxBranch.State.ROLLBACK_ONLY)
+ {
+ throw new IncorrectDtxStateException("Cannot prepare a transaction in state "
+ + branch.getState(), id);
+ }
+ else
+ {
+ branch.prepare();
+ branch.setState(DtxBranch.State.PREPARED);
+ }
+ }
+ else
+ {
+ throw new IncorrectDtxStateException("Branch still has associated sessions", id);
+ }
+ }
+ }
+ else
+ {
+ throw new UnknownDtxBranchException(id);
+ }
+ }
+
+ public void rollback(Xid id)
+ throws IncorrectDtxStateException,
+ UnknownDtxBranchException,
+ AMQStoreException, TimeoutDtxException
+ {
+
+ DtxBranch branch = getBranch(id);
+ if(branch != null)
+ {
+ synchronized (branch)
+ {
+ if(branch.expired() || branch.getState() == DtxBranch.State.TIMEDOUT)
+ {
+ unregisterBranch(branch);
+ throw new TimeoutDtxException(id);
+ }
+ if(!branch.hasAssociatedActiveSessions())
+ {
+ branch.clearAssociations();
+ branch.rollback();
+ branch.setState(DtxBranch.State.FORGOTTEN);
+ unregisterBranch(branch);
+ }
+ else
+ {
+ throw new IncorrectDtxStateException("Branch was still associated with a session", id);
+ }
+ }
+ }
+ else
+ {
+ throw new UnknownDtxBranchException(id);
+ }
+ }
+
+
+ public void forget(Xid id) throws UnknownDtxBranchException, IncorrectDtxStateException
+ {
+ DtxBranch branch = getBranch(id);
+ if(branch != null)
+ {
+ synchronized (branch)
+ {
+ if(!branch.hasAssociatedSessions())
+ {
+ if(branch.getState() != DtxBranch.State.HEUR_COM && branch.getState() != DtxBranch.State.HEUR_RB)
+ {
+ throw new IncorrectDtxStateException("Branch should not be forgotten - "
+ + "it is not heuristically complete", id);
+ }
+ branch.setState(DtxBranch.State.FORGOTTEN);
+ unregisterBranch(branch);
+ }
+ else
+ {
+ throw new IncorrectDtxStateException("Branch was still associated with a session", id);
+ }
+ }
+ }
+ else
+ {
+ throw new UnknownDtxBranchException(id);
+ }
+ }
+
+ public long getTimeout(Xid id) throws UnknownDtxBranchException
+ {
+ DtxBranch branch = getBranch(id);
+ if(branch != null)
+ {
+ return branch.getTimeout();
+ }
+ else
+ {
+ throw new UnknownDtxBranchException(id);
+ }
+ }
+
+ public void setTimeout(Xid id, long timeout) throws UnknownDtxBranchException
+ {
+ DtxBranch branch = getBranch(id);
+ if(branch != null)
+ {
+ branch.setTimeout(timeout);
+ }
+ else
+ {
+ throw new UnknownDtxBranchException(id);
+ }
+ }
+
+ public synchronized List<Xid> recover()
+ {
+ List<Xid> inDoubt = new ArrayList<Xid>();
+ for(DtxBranch branch : _branches.values())
+ {
+ if(branch.getState() == DtxBranch.State.PREPARED)
+ {
+ inDoubt.add(branch.getXid());
+ }
+ }
+ return inDoubt;
+ }
+
+ public synchronized void endAssociations(AMQSessionModel session)
+ {
+ for(DtxBranch branch : _branches.values())
+ {
+ if(branch.isAssociated(session))
+ {
+ branch.setState(DtxBranch.State.ROLLBACK_ONLY);
+ branch.disassociateSession(session);
+ }
+ }
+ }
+
+
+ public synchronized void close()
+ {
+ for(DtxBranch branch : _branches.values())
+ {
+ branch.close();
+ }
+ _branches.clear();
+ }
+
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/IncorrectDtxStateException.java b/java/broker/src/main/java/org/apache/qpid/server/txn/IncorrectDtxStateException.java
new file mode 100644
index 0000000000..45f094e4b9
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/IncorrectDtxStateException.java
@@ -0,0 +1,32 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.txn;
+
+import org.apache.qpid.transport.Xid;
+
+public class IncorrectDtxStateException extends DtxException
+{
+ public IncorrectDtxStateException(String message, Xid id)
+ {
+ super(message + " (xid: " + id + ")");
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/JoinAndResumeDtxException.java b/java/broker/src/main/java/org/apache/qpid/server/txn/JoinAndResumeDtxException.java
new file mode 100644
index 0000000000..a25e5a4ed6
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/JoinAndResumeDtxException.java
@@ -0,0 +1,32 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.txn;
+
+import org.apache.qpid.transport.Xid;
+
+public class JoinAndResumeDtxException extends DtxException
+{
+ public JoinAndResumeDtxException(Xid id)
+ {
+ super("Cannot start a branch with both join and resume set " + id);
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/LocalTransaction.java b/java/broker/src/main/java/org/apache/qpid/server/txn/LocalTransaction.java
index 9b61f7543f..11401ebd65 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/txn/LocalTransaction.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/LocalTransaction.java
@@ -29,6 +29,7 @@ import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.Transaction;
import java.util.ArrayList;
import java.util.Collection;
@@ -46,7 +47,7 @@ public class LocalTransaction implements ServerTransaction
private final List<Action> _postTransactionActions = new ArrayList<Action>();
- private volatile MessageStore.Transaction _transaction;
+ private volatile Transaction _transaction;
private MessageStore _transactionLog;
private long _txnStartTime = 0L;
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/NotAssociatedDtxException.java b/java/broker/src/main/java/org/apache/qpid/server/txn/NotAssociatedDtxException.java
new file mode 100644
index 0000000000..de070546a7
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/NotAssociatedDtxException.java
@@ -0,0 +1,32 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.txn;
+
+import org.apache.qpid.transport.Xid;
+
+public class NotAssociatedDtxException extends DtxException
+{
+ public NotAssociatedDtxException(Xid id)
+ {
+ super("Xid " + id + " not associated with the current session");
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/RollbackOnlyDtxException.java b/java/broker/src/main/java/org/apache/qpid/server/txn/RollbackOnlyDtxException.java
new file mode 100644
index 0000000000..6cf12d8631
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/RollbackOnlyDtxException.java
@@ -0,0 +1,32 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.txn;
+
+import org.apache.qpid.transport.Xid;
+
+public class RollbackOnlyDtxException extends DtxException
+{
+ public RollbackOnlyDtxException(Xid id)
+ {
+ super("Transaction " + id + " may only be rolled back");
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/ServerTransaction.java b/java/broker/src/main/java/org/apache/qpid/server/txn/ServerTransaction.java
index 7617544451..c568ae67aa 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/txn/ServerTransaction.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/ServerTransaction.java
@@ -20,13 +20,12 @@
*/
package org.apache.qpid.server.txn;
+import java.util.Collection;
+import java.util.List;
import org.apache.qpid.server.message.EnqueableMessage;
import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.queue.QueueEntry;
-import java.util.Collection;
-import java.util.List;
-
/**
* The ServerTransaction interface allows a set enqueue/dequeue operations to be
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/SuspendAndFailDtxException.java b/java/broker/src/main/java/org/apache/qpid/server/txn/SuspendAndFailDtxException.java
new file mode 100644
index 0000000000..228844fd63
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/SuspendAndFailDtxException.java
@@ -0,0 +1,32 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.txn;
+
+import org.apache.qpid.transport.Xid;
+
+public class SuspendAndFailDtxException extends DtxException
+{
+public SuspendAndFailDtxException(Xid id)
+{
+ super("Cannot end a branch with both suspend and fail set " + id);
+}
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/TimeoutDtxException.java b/java/broker/src/main/java/org/apache/qpid/server/txn/TimeoutDtxException.java
new file mode 100644
index 0000000000..50f7708d8a
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/TimeoutDtxException.java
@@ -0,0 +1,32 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.txn;
+
+import org.apache.qpid.transport.Xid;
+
+public class TimeoutDtxException extends DtxException
+{
+ public TimeoutDtxException(Xid id)
+ {
+ super("Transaction " + id + " has timed-out and may only be rolled back");
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/txn/UnknownDtxBranchException.java b/java/broker/src/main/java/org/apache/qpid/server/txn/UnknownDtxBranchException.java
new file mode 100644
index 0000000000..c23e518365
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/txn/UnknownDtxBranchException.java
@@ -0,0 +1,32 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.txn;
+
+import org.apache.qpid.transport.Xid;
+
+public class UnknownDtxBranchException extends DtxException
+{
+ public UnknownDtxBranchException(Xid id)
+ {
+ super("Unknown xid " + id);
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/util/MapJsonSerializer.java b/java/broker/src/main/java/org/apache/qpid/server/util/MapJsonSerializer.java
new file mode 100644
index 0000000000..2d9ba38555
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/util/MapJsonSerializer.java
@@ -0,0 +1,69 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.util;
+
+import java.io.StringWriter;
+import java.util.Map;
+
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.type.TypeReference;
+
+public class MapJsonSerializer
+{
+ private static final TypeReference<Map<String, Object>> MAP_TYPE_REFERENCE = new TypeReference<Map<String, Object>>()
+ {
+ };
+
+ private ObjectMapper _mapper;
+
+ public MapJsonSerializer()
+ {
+ _mapper = new ObjectMapper();
+ }
+
+ public String serialize(Map<String, Object> attributeMap)
+ {
+ StringWriter stringWriter = new StringWriter();
+ try
+ {
+ _mapper.writeValue(stringWriter, attributeMap);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("Failure to serialize map:" + attributeMap, e);
+ }
+ return stringWriter.toString();
+ }
+
+ public Map<String, Object> deserialize(String json)
+ {
+ Map<String, Object> attributesMap = null;
+ try
+ {
+ attributesMap = _mapper.readValue(json, MAP_TYPE_REFERENCE);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("Failure to deserialize json:" + json, e);
+ }
+ return attributesMap;
+ }
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/virtualhost/State.java b/java/broker/src/main/java/org/apache/qpid/server/virtualhost/State.java
new file mode 100644
index 0000000000..fb50b3e289
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/virtualhost/State.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.virtualhost;
+
+public enum State
+{
+ INITIALISING,
+ ACTIVE,
+ PASSIVE,
+ STOPPED
+}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java b/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java
index afded3416e..489b985222 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java
@@ -20,6 +20,9 @@
*/
package org.apache.qpid.server.virtualhost;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ScheduledFuture;
import org.apache.qpid.common.Closeable;
import org.apache.qpid.server.binding.BindingFactory;
import org.apache.qpid.server.configuration.ConfigStore;
@@ -30,16 +33,14 @@ import org.apache.qpid.server.exchange.ExchangeFactory;
import org.apache.qpid.server.exchange.ExchangeRegistry;
import org.apache.qpid.server.federation.BrokerLink;
import org.apache.qpid.server.management.ManagedObject;
+import org.apache.qpid.server.protocol.v1_0.LinkRegistry;
import org.apache.qpid.server.queue.QueueRegistry;
import org.apache.qpid.server.registry.IApplicationRegistry;
import org.apache.qpid.server.security.SecurityManager;
-import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
import org.apache.qpid.server.stats.StatisticsGatherer;
import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.store.MessageStore;
-
-import java.util.Map;
-import java.util.UUID;
+import org.apache.qpid.server.txn.DtxRegistry;
public interface VirtualHost extends DurableConfigurationStore.Source, VirtualHostConfig, Closeable, StatisticsGatherer
{
@@ -57,10 +58,6 @@ public interface VirtualHost extends DurableConfigurationStore.Source, VirtualHo
MessageStore getMessageStore();
- DurableConfigurationStore getDurableConfigurationStore();
-
- AuthenticationManager getAuthenticationManager();
-
SecurityManager getSecurityManager();
void close();
@@ -96,5 +93,13 @@ public interface VirtualHost extends DurableConfigurationStore.Source, VirtualHo
ConfigStore getConfigStore();
+ DtxRegistry getDtxRegistry();
+
void removeBrokerConnection(BrokerLink brokerLink);
+
+ LinkRegistry getLinkRegistry(String remoteContainerId);
+
+ ScheduledFuture<?> scheduleTask(long delay, Runnable timeoutTask);
+
+ State getState();
}
diff --git a/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostConfigRecoveryHandler.java b/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostConfigRecoveryHandler.java
index 266d23af97..e956806823 100755
--- a/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostConfigRecoveryHandler.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostConfigRecoveryHandler.java
@@ -20,9 +20,17 @@
*/
package org.apache.qpid.server.virtualhost;
-import org.apache.log4j.Logger;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.UUID;
+import org.apache.log4j.Logger;
import org.apache.qpid.AMQException;
+import org.apache.qpid.AMQStoreException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.server.binding.BindingFactory;
@@ -32,29 +40,27 @@ import org.apache.qpid.server.logging.actors.CurrentActor;
import org.apache.qpid.server.logging.messages.TransactionLogMessages;
import org.apache.qpid.server.logging.subjects.MessageStoreLogSubject;
import org.apache.qpid.server.message.AMQMessage;
+import org.apache.qpid.server.message.AbstractServerMessageImpl;
import org.apache.qpid.server.message.EnqueableMessage;
import org.apache.qpid.server.message.MessageTransferMessage;
import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
+import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.store.ConfigurationRecoveryHandler;
import org.apache.qpid.server.store.MessageStore;
import org.apache.qpid.server.store.MessageStoreRecoveryHandler;
import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.store.Transaction;
import org.apache.qpid.server.store.TransactionLogRecoveryHandler;
import org.apache.qpid.server.store.TransactionLogResource;
+import org.apache.qpid.server.txn.DtxBranch;
+import org.apache.qpid.server.txn.DtxRegistry;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.transport.Xid;
+import org.apache.qpid.transport.util.Functions;
import org.apache.qpid.util.ByteBufferInputStream;
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.UUID;
-
public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHandler,
ConfigurationRecoveryHandler.QueueRecoveryHandler,
ConfigurationRecoveryHandler.ExchangeRecoveryHandler,
@@ -63,20 +69,19 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
MessageStoreRecoveryHandler,
MessageStoreRecoveryHandler.StoredMessageRecoveryHandler,
TransactionLogRecoveryHandler,
- TransactionLogRecoveryHandler.QueueEntryRecoveryHandler
+ TransactionLogRecoveryHandler.QueueEntryRecoveryHandler,
+ TransactionLogRecoveryHandler.DtxRecordRecoveryHandler
{
private static final Logger _logger = Logger.getLogger(VirtualHostConfigRecoveryHandler.class);
-
private final VirtualHost _virtualHost;
private MessageStoreLogSubject _logSubject;
- private List<ProcessAction> _actions;
private MessageStore _store;
private final Map<String, Integer> _queueRecoveries = new TreeMap<String, Integer>();
- private Map<Long, ServerMessage> _recoveredMessages = new HashMap<Long, ServerMessage>();
+ private Map<Long, AbstractServerMessageImpl> _recoveredMessages = new HashMap<Long, AbstractServerMessageImpl>();
private Map<Long, StoredMessage> _unusedMessages = new HashMap<Long, StoredMessage>();
@@ -88,14 +93,14 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
public VirtualHostConfigRecoveryHandler begin(MessageStore store)
{
- _logSubject = new MessageStoreLogSubject(_virtualHost,store);
+ _logSubject = new MessageStoreLogSubject(_virtualHost,store.getClass().getSimpleName());
_store = store;
CurrentActor.get().message(_logSubject, TransactionLogMessages.RECOVERY_START(null, false));
return this;
}
- public void queue(String queueName, String owner, boolean exclusive, FieldTable arguments)
+ public void queue(UUID id, String queueName, String owner, boolean exclusive, FieldTable arguments)
{
try
{
@@ -103,7 +108,7 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
if (q == null)
{
- q = AMQQueueFactory.createAMQQueueImpl(queueName, true, owner, false, exclusive, _virtualHost,
+ q = AMQQueueFactory.createAMQQueueImpl(id, queueName, true, owner, false, exclusive, _virtualHost,
FieldTable.convertToMap(arguments));
_virtualHost.getQueueRegistry().registerQueue(q);
}
@@ -125,7 +130,7 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
return this;
}
- public void exchange(String exchangeName, String type, boolean autoDelete)
+ public void exchange(UUID id, String exchangeName, String type, boolean autoDelete)
{
try
{
@@ -134,7 +139,7 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
exchange = _virtualHost.getExchangeRegistry().getExchange(exchangeNameSS);
if (exchange == null)
{
- exchange = _virtualHost.getExchangeFactory().createExchange(exchangeNameSS, new AMQShortString(type), true, autoDelete, 0);
+ exchange = _virtualHost.getExchangeFactory().createExchange(id, exchangeNameSS, new AMQShortString(type), true, autoDelete, 0);
_virtualHost.getExchangeRegistry().registerExchange(exchange);
}
}
@@ -158,7 +163,7 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
public void message(StoredMessage message)
{
- ServerMessage serverMessage;
+ AbstractServerMessageImpl serverMessage;
switch(message.getMetaData().getType())
{
case META_DATA_0_8:
@@ -193,47 +198,178 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
{
}
- private static final class ProcessAction
+ public void dtxRecord(long format, byte[] globalId, byte[] branchId,
+ Transaction.Record[] enqueues,
+ Transaction.Record[] dequeues)
{
- private final AMQQueue _queue;
- private final AMQMessage _message;
-
- public ProcessAction(AMQQueue queue, AMQMessage message)
+ Xid id = new Xid(format, globalId, branchId);
+ DtxRegistry dtxRegistry = _virtualHost.getDtxRegistry();
+ DtxBranch branch = dtxRegistry.getBranch(id);
+ if(branch == null)
{
- _queue = queue;
- _message = message;
+ branch = new DtxBranch(id, _store, _virtualHost);
+ dtxRegistry.registerBranch(branch);
}
+ for(Transaction.Record record : enqueues)
+ {
+ final AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(record.getQueue().getId());
+ if(queue != null)
+ {
+ final long messageId = record.getMessage().getMessageNumber();
+ final AbstractServerMessageImpl message = _recoveredMessages.get(messageId);
+ _unusedMessages.remove(messageId);
+
+ if(message != null)
+ {
+ message.incrementReference();
- public void process()
+ branch.enqueue(queue,message);
+
+ branch.addPostTransactionAcion(new ServerTransaction.Action()
+ {
+
+ public void postCommit()
+ {
+ try
+ {
+
+ queue.enqueue(message, true, null);
+ message.decrementReference();
+ }
+ catch (AMQException e)
+ {
+ _logger.error("Unable to enqueue message " + message.getMessageNumber() + " into " +
+ "queue " + queue.getName() + " (from XA transaction)", e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void onRollback()
+ {
+ message.decrementReference();
+ }
+ });
+ }
+ else
+ {
+ StringBuilder xidString = xidAsString(id);
+ CurrentActor.get().message(_logSubject,
+ TransactionLogMessages.XA_INCOMPLETE_MESSAGE(xidString.toString(),
+ Long.toString(messageId)));
+
+ }
+
+ }
+ else
+ {
+ StringBuilder xidString = xidAsString(id);
+ CurrentActor.get().message(_logSubject,
+ TransactionLogMessages.XA_INCOMPLETE_QUEUE(xidString.toString(),
+ record.getQueue().getId().toString()));
+
+ }
+ }
+ for(Transaction.Record record : dequeues)
{
- try
+ final AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(record.getQueue().getId());
+ if(queue != null)
{
- _queue.enqueue(_message);
+ final long messageId = record.getMessage().getMessageNumber();
+ final AbstractServerMessageImpl message = _recoveredMessages.get(messageId);
+ _unusedMessages.remove(messageId);
+
+ if(message != null)
+ {
+ final QueueEntry entry = queue.getMessageOnTheQueue(messageId);
+
+ entry.acquire();
+
+ branch.dequeue(queue, message);
+
+ branch.addPostTransactionAcion(new ServerTransaction.Action()
+ {
+
+ public void postCommit()
+ {
+ entry.discard();
+ }
+
+ public void onRollback()
+ {
+ entry.release();
+ }
+ });
+ }
+ else
+ {
+ StringBuilder xidString = xidAsString(id);
+ CurrentActor.get().message(_logSubject,
+ TransactionLogMessages.XA_INCOMPLETE_MESSAGE(xidString.toString(),
+ Long.toString(messageId)));
+
+ }
+
}
- catch(AMQException e)
+ else
{
- throw new RuntimeException(e);
+ StringBuilder xidString = xidAsString(id);
+ CurrentActor.get().message(_logSubject,
+ TransactionLogMessages.XA_INCOMPLETE_QUEUE(xidString.toString(),
+ record.getQueue().getId().toString()));
}
+
}
+ try
+ {
+ branch.setState(DtxBranch.State.PREPARED);
+ branch.prePrepareTransaction();
+ }
+ catch (AMQStoreException e)
+ {
+ _logger.error("Unexpected database exception when attempting to prepare a recovered XA transaction " +
+ xidAsString(id), e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static StringBuilder xidAsString(Xid id)
+ {
+ return new StringBuilder("(")
+ .append(id.getFormat())
+ .append(',')
+ .append(Functions.str(id.getGlobalId()))
+ .append(',')
+ .append(Functions.str(id.getBranchId()))
+ .append(')');
}
- public void binding(String exchangeName, String queueName, String bindingKey, ByteBuffer buf)
+ public void completeDtxRecordRecovery()
+ {
+ for(StoredMessage m : _unusedMessages.values())
+ {
+ _logger.warn("Message id " + m.getMessageNumber() + " in store, but not in any queue - removing....");
+ m.remove();
+ }
+ CurrentActor.get().message(_logSubject, TransactionLogMessages.RECOVERY_COMPLETE(null, false));
+ }
+
+ @Override
+ public void binding(UUID bindingId, UUID exchangeId, UUID queueId, String bindingKey, ByteBuffer buf)
{
- _actions = new ArrayList<ProcessAction>();
try
{
- Exchange exchange = _virtualHost.getExchangeRegistry().getExchange(exchangeName);
+ Exchange exchange = _virtualHost.getExchangeRegistry().getExchange(exchangeId);
if (exchange == null)
{
- _logger.error("Unknown exchange: " + exchangeName + ", cannot bind queue : " + queueName);
+ _logger.error("Unknown exchange id " + exchangeId + ", cannot bind queue with id " + queueId);
return;
}
-
- AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(new AMQShortString(queueName));
+
+ AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(queueId);
if (queue == null)
{
- _logger.error("Unknown queue: " + queueName + ", cannot be bound to exchange: " + exchangeName);
+ _logger.error("Unknown queue id " + queueId + ", cannot be bound to exchange: " + exchange.getName());
}
else
{
@@ -257,10 +393,10 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
if(bf.getBinding(bindingKey, queue, exchange, argumentMap) == null)
{
- _logger.info("Restoring binding: (Exchange: " + exchange.getNameShortString() + ", Queue: " + queueName
+ _logger.info("Restoring binding: (Exchange: " + exchange.getNameShortString() + ", Queue: " + queue.getName()
+ ", Routing Key: " + bindingKey + ", Arguments: " + argumentsFT + ")");
- bf.restoreBinding(bindingKey, queue, exchange, argumentMap);
+ bf.restoreBinding(bindingId, bindingKey, queue, exchange, argumentMap);
}
}
}
@@ -282,16 +418,14 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
}
- public void queueEntry(final String queueName, long messageId)
+ public void queueEntry(final UUID queueId, long messageId)
{
- AMQShortString queueNameShortString = new AMQShortString(queueName);
-
- AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(queueNameShortString);
-
+ AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(queueId);
try
{
if(queue != null)
{
+ String queueName = queue.getName();
ServerMessage message = _recoveredMessages.get(messageId);
_unusedMessages.remove(messageId);
@@ -301,7 +435,7 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
if (_logger.isDebugEnabled())
{
- _logger.debug("On recovery, delivering " + message.getMessageNumber() + " to " + queue.getNameShortString());
+ _logger.debug("On recovery, delivering " + message.getMessageNumber() + " to " + queueName);
}
Integer count = _queueRecoveries.get(queueName);
@@ -316,23 +450,23 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
}
else
{
- _logger.warn("Message id " + messageId + " referenced in log as enqueued in queue " + queue.getNameShortString() + " is unknown, entry will be discarded");
- MessageStore.Transaction txn = _store.newTransaction();
+ _logger.warn("Message id " + messageId + " referenced in log as enqueued in queue " + queueName + " is unknown, entry will be discarded");
+ Transaction txn = _store.newTransaction();
txn.dequeueMessage(queue, new DummyMessage(messageId));
txn.commitTranAsync();
}
}
else
{
- _logger.warn("Message id " + messageId + " in log references queue " + queueName + " which is not in the configuration, entry will be discarded");
- MessageStore.Transaction txn = _store.newTransaction();
+ _logger.warn("Message id " + messageId + " in log references queue with id " + queueId + " which is not in the configuration, entry will be discarded");
+ Transaction txn = _store.newTransaction();
TransactionLogResource mockQueue =
new TransactionLogResource()
{
-
- public String getResourceName()
+ @Override
+ public UUID getId()
{
- return queueName;
+ return queueId;
}
};
txn.dequeueMessage(mockQueue, new DummyMessage(messageId));
@@ -344,20 +478,11 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
{
throw new RuntimeException(e);
}
-
-
-
}
- public void completeQueueEntryRecovery()
+ public DtxRecordRecoveryHandler completeQueueEntryRecovery()
{
- for(StoredMessage m : _unusedMessages.values())
- {
- _logger.warn("Message id " + m.getMessageNumber() + " in store, but not in any queue - removing....");
- m.remove();
- }
-
for(Map.Entry<String,Integer> entry : _queueRecoveries.entrySet())
{
CurrentActor.get().message(_logSubject, TransactionLogMessages.RECOVERED(entry.getValue(), entry.getKey()));
@@ -365,7 +490,9 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
CurrentActor.get().message(_logSubject, TransactionLogMessages.RECOVERY_COMPLETE(entry.getKey(), true));
}
- CurrentActor.get().message(_logSubject, TransactionLogMessages.RECOVERY_COMPLETE(null, false));
+
+
+ return this;
}
private static class DummyMessage implements EnqueableMessage
diff --git a/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java b/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java
index 51b60f7980..9b113525d4 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java
@@ -20,14 +20,11 @@
*/
package org.apache.qpid.server.virtualhost;
-import org.apache.commons.configuration.Configuration;
+
import org.apache.commons.configuration.ConfigurationException;
import org.apache.log4j.Logger;
-
import org.apache.qpid.AMQException;
-import org.apache.qpid.AMQStoreException;
import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.server.AMQBrokerManagerMBean;
import org.apache.qpid.server.binding.BindingFactory;
import org.apache.qpid.server.configuration.BrokerConfig;
@@ -44,225 +41,189 @@ import org.apache.qpid.server.exchange.DefaultExchangeRegistry;
import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.exchange.ExchangeFactory;
import org.apache.qpid.server.exchange.ExchangeRegistry;
-import org.apache.qpid.server.federation.Bridge;
import org.apache.qpid.server.federation.BrokerLink;
-import org.apache.qpid.server.logging.LogSubject;
import org.apache.qpid.server.logging.actors.CurrentActor;
import org.apache.qpid.server.logging.messages.VirtualHostMessages;
import org.apache.qpid.server.logging.subjects.MessageStoreLogSubject;
import org.apache.qpid.server.management.AMQManagedObject;
import org.apache.qpid.server.management.ManagedObject;
+import org.apache.qpid.server.protocol.v1_0.LinkRegistry;
import org.apache.qpid.server.protocol.AMQConnectionModel;
import org.apache.qpid.server.protocol.AMQSessionModel;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
import org.apache.qpid.server.queue.DefaultQueueRegistry;
import org.apache.qpid.server.queue.QueueRegistry;
-import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.registry.IApplicationRegistry;
import org.apache.qpid.server.security.SecurityManager;
-import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
import org.apache.qpid.server.stats.StatisticsCounter;
-import org.apache.qpid.server.store.ConfigurationRecoveryHandler;
-import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.apache.qpid.server.store.Event;
+import org.apache.qpid.server.store.EventListener;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreFactory;
+import org.apache.qpid.server.store.OperationalLoggingListener;
+import org.apache.qpid.server.txn.DtxRegistry;
import org.apache.qpid.server.virtualhost.plugins.VirtualHostPlugin;
import org.apache.qpid.server.virtualhost.plugins.VirtualHostPluginFactory;
+import javax.management.JMException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
-import java.util.LinkedList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
+import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+
public class VirtualHostImpl implements VirtualHost
{
private static final Logger _logger = Logger.getLogger(VirtualHostImpl.class);
+ private static final int HOUSEKEEPING_SHUTDOWN_TIMEOUT = 5;
+
+ private final UUID _id;
+
private final String _name;
- private ConnectionRegistry _connectionRegistry;
+ private final long _createTime = System.currentTimeMillis();
- private QueueRegistry _queueRegistry;
+ private final ConcurrentHashMap<BrokerLink,BrokerLink> _links = new ConcurrentHashMap<BrokerLink, BrokerLink>();
- private ExchangeRegistry _exchangeRegistry;
+ private final ScheduledThreadPoolExecutor _houseKeepingTasks;
- private ExchangeFactory _exchangeFactory;
+ private final IApplicationRegistry _appRegistry;
- private MessageStore _messageStore;
+ private final SecurityManager _securityManager;
- private VirtualHostMBean _virtualHostMBean;
+ private final BrokerConfig _brokerConfig;
- private AMQBrokerManagerMBean _brokerMBean;
+ private final VirtualHostConfiguration _vhostConfig;
- private final AuthenticationManager _authenticationManager;
+ private final VirtualHostMBean _virtualHostMBean;
- private SecurityManager _securityManager;
+ private final AMQBrokerManagerMBean _brokerMBean;
- private final ScheduledThreadPoolExecutor _houseKeepingTasks;
- private final IApplicationRegistry _appRegistry;
- private VirtualHostConfiguration _configuration;
- private DurableConfigurationStore _durableConfigurationStore;
- private BindingFactory _bindingFactory;
- private BrokerConfig _broker;
- private UUID _id;
+ private final QueueRegistry _queueRegistry;
- private boolean _statisticsEnabled = false;
- private StatisticsCounter _messagesDelivered, _dataDelivered, _messagesReceived, _dataReceived;
+ private final ExchangeRegistry _exchangeRegistry;
- private final long _createTime = System.currentTimeMillis();
- private final ConcurrentHashMap<BrokerLink,BrokerLink> _links = new ConcurrentHashMap<BrokerLink, BrokerLink>();
- private static final int HOUSEKEEPING_SHUTDOWN_TIMEOUT = 5;
+ private final ExchangeFactory _exchangeFactory;
- public IConnectionRegistry getConnectionRegistry()
- {
- return _connectionRegistry;
- }
+ private final ConnectionRegistry _connectionRegistry;
- public VirtualHostConfiguration getConfiguration()
- {
- return _configuration;
- }
+ private final BindingFactory _bindingFactory;
- public UUID getId()
- {
- return _id;
- }
+ private final DtxRegistry _dtxRegistry;
- public VirtualHostConfigType getConfigType()
- {
- return VirtualHostConfigType.getInstance();
- }
+ private final MessageStore _messageStore;
- public ConfiguredObject getParent()
- {
- return getBroker();
- }
+ private State _state = State.INITIALISING;
- public boolean isDurable()
- {
- return false;
- }
+ private boolean _statisticsEnabled = false;
- /**
- * Virtual host JMX MBean class.
- *
- * This has some of the methods implemented from management intrerface for exchanges. Any
- * implementaion of an Exchange MBean should extend this class.
- */
- public class VirtualHostMBean extends AMQManagedObject implements ManagedVirtualHost
- {
- public VirtualHostMBean() throws NotCompliantMBeanException
- {
- super(ManagedVirtualHost.class, ManagedVirtualHost.TYPE);
- }
+ private StatisticsCounter _messagesDelivered, _dataDelivered, _messagesReceived, _dataReceived;
- public String getObjectInstanceName()
- {
- return ObjectName.quote(_name);
- }
+ private final Map<String, LinkRegistry> _linkRegistry = new HashMap<String, LinkRegistry>();
- public String getName()
+ public VirtualHostImpl(IApplicationRegistry appRegistry, VirtualHostConfiguration hostConfig) throws Exception
+ {
+ if (hostConfig == null)
{
- return _name;
+ throw new IllegalArgumentException("HostConfig cannot be null");
}
- public VirtualHostImpl getVirtualHost()
+ if (hostConfig.getName() == null || hostConfig.getName().length() == 0)
{
- return VirtualHostImpl.this;
+ throw new IllegalArgumentException("Illegal name (" + hostConfig.getName() + ") for virtualhost.");
}
- }
- public VirtualHostImpl(IApplicationRegistry appRegistry, VirtualHostConfiguration hostConfig, MessageStore store) throws Exception
- {
- if (hostConfig == null)
- {
- throw new IllegalArgumentException("HostConfig cannot be null");
- }
-
_appRegistry = appRegistry;
- _broker = _appRegistry.getBroker();
- _configuration = hostConfig;
- _name = _configuration.getName();
+ _brokerConfig = _appRegistry.getBroker();
+ _vhostConfig = hostConfig;
+ _name = _vhostConfig.getName();
+ _dtxRegistry = new DtxRegistry();
_id = _appRegistry.getConfigStore().createId();
CurrentActor.get().message(VirtualHostMessages.CREATED(_name));
- if (_name == null || _name.length() == 0)
- {
- throw new IllegalArgumentException("Illegal name (" + _name + ") for virtualhost.");
- }
-
- _securityManager = new SecurityManager(_appRegistry.getSecurityManager());
- _securityManager.configureHostPlugins(_configuration);
-
_virtualHostMBean = new VirtualHostMBean();
+ _securityManager = new SecurityManager(_appRegistry.getSecurityManager());
+ _securityManager.configureHostPlugins(_vhostConfig);
_connectionRegistry = new ConnectionRegistry();
- _houseKeepingTasks = new ScheduledThreadPoolExecutor(_configuration.getHouseKeepingThreadCount());
+ _houseKeepingTasks = new ScheduledThreadPoolExecutor(_vhostConfig.getHouseKeepingThreadCount());
_queueRegistry = new DefaultQueueRegistry(this);
_exchangeFactory = new DefaultExchangeFactory(this);
- _exchangeFactory.initialise(_configuration);
+ _exchangeFactory.initialise(_vhostConfig);
_exchangeRegistry = new DefaultExchangeRegistry(this);
- StartupRoutingTable configFileRT = new StartupRoutingTable();
+ _bindingFactory = new BindingFactory(this);
- _durableConfigurationStore = configFileRT;
+ _brokerMBean = new AMQBrokerManagerMBean(_virtualHostMBean);
- // This needs to be after the RT has been defined as it creates the default durable exchanges.
- _exchangeRegistry.initialise();
+ _messageStore = initialiseMessageStore(hostConfig.getMessageStoreFactoryClass());
- _bindingFactory = new BindingFactory(this);
+ configureMessageStore(hostConfig);
- initialiseModel(_configuration);
+ activateNonHAMessageStore();
- if (store != null)
- {
- _messageStore = store;
- if(store instanceof DurableConfigurationStore)
- {
- _durableConfigurationStore = (DurableConfigurationStore) store;
- }
- }
- else
- {
- initialiseMessageStore(hostConfig);
- }
-
- _authenticationManager = ApplicationRegistry.getInstance().getAuthenticationManager();
-
- _brokerMBean = new AMQBrokerManagerMBean(_virtualHostMBean);
- _brokerMBean.register();
- initialiseHouseKeeping(hostConfig.getHousekeepingCheckPeriod());
-
initialiseStatistics();
}
+ public IConnectionRegistry getConnectionRegistry()
+ {
+ return _connectionRegistry;
+ }
+
+ public VirtualHostConfiguration getConfiguration()
+ {
+ return _vhostConfig;
+ }
+
+ public UUID getId()
+ {
+ return _id;
+ }
+
+ public VirtualHostConfigType getConfigType()
+ {
+ return VirtualHostConfigType.getInstance();
+ }
+
+ public ConfiguredObject getParent()
+ {
+ return getBroker();
+ }
+
+ public boolean isDurable()
+ {
+ return false;
+ }
+
/**
* Initialise a housekeeping task to iterate over queues cleaning expired messages with no consumers
* and checking for idle or open transactions that have exceeded the permitted thresholds.
*
* @param period
*/
- private void initialiseHouseKeeping(long period)
+ private void initialiseHouseKeeping(long period)
{
+
if (period != 0L)
{
-
-
scheduleHouseKeepingTask(period, new VirtualHostHouseKeepingTask());
- Map<String, VirtualHostPluginFactory> plugins =
- ApplicationRegistry.getInstance().getPluginManager().getVirtualHostPlugins();
+ Map<String, VirtualHostPluginFactory> plugins = _appRegistry.getPluginManager().getVirtualHostPlugins();
if (plugins != null)
{
@@ -292,50 +253,30 @@ public class VirtualHostImpl implements VirtualHost
}
}
- private class VirtualHostHouseKeepingTask extends HouseKeepingTask
+ private void shutdownHouseKeeping()
{
- public VirtualHostHouseKeepingTask()
- {
- super(VirtualHostImpl.this);
- }
+ _houseKeepingTasks.shutdown();
- public void execute()
+ try
+ {
+ if (!_houseKeepingTasks.awaitTermination(HOUSEKEEPING_SHUTDOWN_TIMEOUT, TimeUnit.SECONDS))
+ {
+ _houseKeepingTasks.shutdownNow();
+ }
+ }
+ catch (InterruptedException e)
+ {
+ _logger.warn("Interrupted during Housekeeping shutdown:", e);
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ private void removeHouseKeepingTasks()
+ {
+ BlockingQueue<Runnable> taskQueue = _houseKeepingTasks.getQueue();
+ for (final Runnable runnable : taskQueue)
{
- for (AMQQueue q : _queueRegistry.getQueues())
- {
- _logger.debug("Checking message status for queue: "
- + q.getName());
- try
- {
- q.checkMessageStatus();
- }
- catch (Exception e)
- {
- _logger.error("Exception in housekeeping for queue: "
- + q.getNameShortString().toString(), e);
- //Don't throw exceptions as this will stop the
- // house keeping task from running.
- }
- }
- for (AMQConnectionModel connection : getConnectionRegistry().getConnections())
- {
- _logger.debug("Checking for long running open transactions on connection " + connection);
- for (AMQSessionModel session : connection.getSessionModels())
- {
- _logger.debug("Checking for long running open transactions on session " + session);
- try
- {
- session.checkTransactionStatus(_configuration.getTransactionTimeoutOpenWarn(),
- _configuration.getTransactionTimeoutOpenClose(),
- _configuration.getTransactionTimeoutIdleWarn(),
- _configuration.getTransactionTimeoutIdleClose());
- }
- catch (Exception e)
- {
- _logger.error("Exception in housekeeping for connection: " + connection.toString(), e);
- }
- }
- }
+ _houseKeepingTasks.remove(runnable);
}
}
@@ -351,6 +292,11 @@ public class VirtualHostImpl implements VirtualHost
TimeUnit.MILLISECONDS);
}
+ public ScheduledFuture<?> scheduleTask(long delay, Runnable task)
+ {
+ return _houseKeepingTasks.schedule(task, delay, TimeUnit.MILLISECONDS);
+ }
+
public long getHouseKeepingTaskCount()
{
return _houseKeepingTasks.getTaskCount();
@@ -378,65 +324,58 @@ public class VirtualHostImpl implements VirtualHost
}
- private void initialiseMessageStore(VirtualHostConfiguration hostConfig) throws Exception
+ private MessageStore initialiseMessageStore(final String messageStoreFactoryClass) throws Exception
{
- String messageStoreClass = hostConfig.getMessageStoreClass();
-
- Class clazz = Class.forName(messageStoreClass);
- Object o = clazz.newInstance();
-
+ final Class<?> clazz = Class.forName(messageStoreFactoryClass);
+ final Object o = clazz.newInstance();
-
- if (!(o instanceof MessageStore))
+ if (!(o instanceof MessageStoreFactory))
{
- throw new ClassCastException("Message store class must implement " + MessageStore.class + ". Class " + clazz +
- " does not.");
+ throw new ClassCastException("Message store factory class must implement " + MessageStoreFactory.class +
+ ". Class " + clazz + " does not.");
}
- MessageStore messageStore = (MessageStore) o;
- VirtualHostConfigRecoveryHandler recoveryHandler = new VirtualHostConfigRecoveryHandler(this);
- MessageStoreLogSubject storeLogSubject = new MessageStoreLogSubject(this, messageStore);
+ final MessageStoreFactory messageStoreFactory = (MessageStoreFactory) o;
+ final MessageStore messageStore = messageStoreFactory.createMessageStore();
+ final MessageStoreLogSubject storeLogSubject = new MessageStoreLogSubject(this, messageStoreFactory.getStoreClassName());
+ OperationalLoggingListener.listen(messageStore, storeLogSubject);
+ messageStore.addEventListener(new BeforeActivationListener(), Event.BEFORE_ACTIVATE);
+ messageStore.addEventListener(new AfterActivationListener(), Event.AFTER_ACTIVATE);
+ messageStore.addEventListener(new BeforeCloseListener(), Event.BEFORE_CLOSE);
+ messageStore.addEventListener(new BeforePassivationListener(), Event.BEFORE_PASSIVATE);
- if(messageStore instanceof DurableConfigurationStore)
- {
- DurableConfigurationStore durableConfigurationStore = (DurableConfigurationStore) messageStore;
-
- durableConfigurationStore.configureConfigStore(this.getName(),
- recoveryHandler,
- hostConfig.getStoreConfiguration(),
- storeLogSubject);
+ return messageStore;
+ }
- _durableConfigurationStore = durableConfigurationStore;
- }
+ private void configureMessageStore(VirtualHostConfiguration hostConfig) throws Exception
+ {
- messageStore.configureMessageStore(this.getName(),
- recoveryHandler,
- hostConfig.getStoreConfiguration(),
- storeLogSubject);
- messageStore.configureTransactionLog(this.getName(),
- recoveryHandler,
- hostConfig.getStoreConfiguration(),
- storeLogSubject);
+ VirtualHostConfigRecoveryHandler recoveryHandler = new VirtualHostConfigRecoveryHandler(this);
- _messageStore = messageStore;
+ // TODO perhaps pass config on construction??
+ _messageStore.configureConfigStore(getName(), recoveryHandler, hostConfig.getStoreConfiguration());
+ _messageStore.configureMessageStore(getName(), recoveryHandler, recoveryHandler, hostConfig.getStoreConfiguration());
+ }
+ private void activateNonHAMessageStore() throws Exception
+ {
+ _messageStore.activate();
}
private void initialiseModel(VirtualHostConfiguration config) throws ConfigurationException, AMQException
{
_logger.debug("Loading configuration for virtualhost: " + config.getName());
- List exchangeNames = config.getExchanges();
+ List<String> exchangeNames = config.getExchanges();
- for (Object exchangeNameObj : exchangeNames)
+ for (String exchangeName : exchangeNames)
{
- String exchangeName = String.valueOf(exchangeNameObj);
configureExchange(config.getExchangeConfiguration(exchangeName));
}
- String[] queueNames = config.getQueueNames();
+ String[] queueNames = config.getQueueNames();
for (Object queueNameObj : queueNames)
{
@@ -447,45 +386,45 @@ public class VirtualHostImpl implements VirtualHost
private void configureExchange(ExchangeConfiguration exchangeConfiguration) throws AMQException
{
- AMQShortString exchangeName = new AMQShortString(exchangeConfiguration.getName());
+ AMQShortString exchangeName = new AMQShortString(exchangeConfiguration.getName());
Exchange exchange;
exchange = _exchangeRegistry.getExchange(exchangeName);
if (exchange == null)
{
- AMQShortString type = new AMQShortString(exchangeConfiguration.getType());
- boolean durable = exchangeConfiguration.getDurable();
- boolean autodelete = exchangeConfiguration.getAutoDelete();
+ AMQShortString type = new AMQShortString(exchangeConfiguration.getType());
+ boolean durable = exchangeConfiguration.getDurable();
+ boolean autodelete = exchangeConfiguration.getAutoDelete();
Exchange newExchange = _exchangeFactory.createExchange(exchangeName, type, durable, autodelete, 0);
_exchangeRegistry.registerExchange(newExchange);
if (newExchange.isDurable())
{
- _durableConfigurationStore.createExchange(newExchange);
+ _messageStore.createExchange(newExchange);
}
}
}
private void configureQueue(QueueConfiguration queueConfiguration) throws AMQException, ConfigurationException
{
- AMQQueue queue = AMQQueueFactory.createAMQQueueImpl(queueConfiguration, this);
+ AMQQueue queue = AMQQueueFactory.createAMQQueueImpl(queueConfiguration, this);
String queueName = queue.getName();
- if (queue.isDurable())
- {
- getDurableConfigurationStore().createQueue(queue);
- }
+ if (queue.isDurable())
+ {
+ getMessageStore().createQueue(queue);
+ }
//get the exchange name (returns default exchange name if none was specified)
- String exchangeName = queueConfiguration.getExchange();
+ String exchangeName = queueConfiguration.getExchange();
Exchange exchange = _exchangeRegistry.getExchange(exchangeName);
- if (exchange == null)
- {
+ if (exchange == null)
+ {
throw new ConfigurationException("Attempt to bind queue '" + queueName + "' to unknown exchange:" + exchangeName);
- }
+ }
Exchange defaultExchange = _exchangeRegistry.getDefaultExchange();
@@ -531,17 +470,12 @@ public class VirtualHostImpl implements VirtualHost
public BrokerConfig getBroker()
{
- return _broker;
+ return _brokerConfig;
}
public String getFederationTag()
{
- return _broker.getFederationTag();
- }
-
- public void setBroker(final BrokerConfig broker)
- {
- _broker = broker;
+ return _brokerConfig.getFederationTag();
}
public long getCreateTime()
@@ -569,16 +503,6 @@ public class VirtualHostImpl implements VirtualHost
return _messageStore;
}
- public DurableConfigurationStore getDurableConfigurationStore()
- {
- return _durableConfigurationStore;
- }
-
- public AuthenticationManager getAuthenticationManager()
- {
- return _authenticationManager;
- }
-
public SecurityManager getSecurityManager()
{
return _securityManager;
@@ -588,34 +512,8 @@ public class VirtualHostImpl implements VirtualHost
{
//Stop Connections
_connectionRegistry.close();
-
- //Stop the Queues processing
- if (_queueRegistry != null)
- {
- for (AMQQueue queue : _queueRegistry.getQueues())
- {
- queue.stop();
- }
- }
-
- //Stop Housekeeping
- if (_houseKeepingTasks != null)
- {
- _houseKeepingTasks.shutdown();
-
- try
- {
- if (!_houseKeepingTasks.awaitTermination(HOUSEKEEPING_SHUTDOWN_TIMEOUT, TimeUnit.SECONDS))
- {
- _houseKeepingTasks.shutdownNow();
- }
- }
- catch (InterruptedException e)
- {
- _logger.warn("Interrupted during Housekeeping shutdown:" + e.getMessage());
- // Swallowing InterruptedException ok as we are shutting down.
- }
- }
+ _queueRegistry.stopAllAndUnregisterMBeans();
+ _dtxRegistry.close();
//Close MessageStore
if (_messageStore != null)
@@ -627,10 +525,12 @@ public class VirtualHostImpl implements VirtualHost
}
catch (Exception e)
{
- e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ _logger.error("Failed to close message store", e);
}
}
+ _state = State.STOPPED;
+
CurrentActor.get().message(VirtualHostMessages.CLOSED());
}
@@ -742,7 +642,6 @@ public class VirtualHostImpl implements VirtualHost
return blink;
}
-
public void createBrokerConnection(final String transport,
final String host,
final int port,
@@ -779,149 +678,182 @@ public class VirtualHostImpl implements VirtualHost
}
}
+ public synchronized LinkRegistry getLinkRegistry(String remoteContainerId)
+ {
+ LinkRegistry linkRegistry = _linkRegistry.get(remoteContainerId);
+ if(linkRegistry == null)
+ {
+ linkRegistry = new LinkRegistry();
+ _linkRegistry.put(remoteContainerId, linkRegistry);
+ }
+ return linkRegistry;
+ }
+
public ConfigStore getConfigStore()
{
return getApplicationRegistry().getConfigStore();
}
+ public DtxRegistry getDtxRegistry()
+ {
+ return _dtxRegistry;
+ }
+
+ @Override
+ public String toString()
+ {
+ return _name;
+ }
+
+ @Override
+ public State getState()
+ {
+ return _state;
+ }
+
+
/**
- * Temporary Startup RT class to record the creation of persistent queues / exchanges.
- *
+ * Virtual host JMX MBean class.
*
- * This is so we can replay the creation of queues/exchanges in to the real _RT after it has been loaded.
- * This should be removed after the _RT has been fully split from the the TL
+ * This has some of the methods implemented from management interface for exchanges. Any
+ * Implementation of an Exchange MBean should extend this class.
*/
- private static class StartupRoutingTable implements DurableConfigurationStore
+ public class VirtualHostMBean extends AMQManagedObject implements ManagedVirtualHost
{
- private List<Exchange> exchange = new LinkedList<Exchange>();
- private List<CreateQueueTuple> queue = new LinkedList<CreateQueueTuple>();
- private List<CreateBindingTuple> bindings = new LinkedList<CreateBindingTuple>();
- private List<BrokerLink> links = new LinkedList<BrokerLink>();
- private List<Bridge> bridges = new LinkedList<Bridge>();
-
- public void configure(VirtualHost virtualHost, String base, VirtualHostConfiguration config) throws Exception
+ public VirtualHostMBean() throws NotCompliantMBeanException
{
+ super(ManagedVirtualHost.class, ManagedVirtualHost.TYPE);
}
- public void close() throws Exception
+ public String getObjectInstanceName()
{
+ return ObjectName.quote(_name);
}
- public void removeMessage(Long messageId) throws AMQException
+ public String getName()
{
- //To change body of implemented methods use File | Settings | File Templates.
+ return _name;
}
- public void configureConfigStore(String name,
- ConfigurationRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception
+ public VirtualHostImpl getVirtualHost()
{
- //To change body of implemented methods use File | Settings | File Templates.
+ return VirtualHostImpl.this;
}
+ }
- public void createExchange(Exchange exchange) throws AMQStoreException
+ private final class BeforeActivationListener implements EventListener
+ {
+ @Override
+ public void event(Event event)
{
- if (exchange.isDurable())
+ try
{
- this.exchange.add(exchange);
- }
- }
-
- public void removeExchange(Exchange exchange) throws AMQStoreException
- {
- }
-
- public void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
- {
- if (exchange.isDurable() && queue.isDurable())
+ _exchangeRegistry.initialise();
+ initialiseModel(_vhostConfig);
+ } catch (Exception e)
{
- bindings.add(new CreateBindingTuple(exchange, routingKey, queue, args));
+ throw new RuntimeException("Failed to initialise virtual host after state change", e);
}
}
+ }
- public void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
- {
- }
-
- public void createQueue(AMQQueue queue) throws AMQStoreException
- {
- createQueue(queue, null);
- }
-
- public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
+ private final class AfterActivationListener implements EventListener
+ {
+ @Override
+ public void event(Event event)
{
- if (queue.isDurable())
+ initialiseHouseKeeping(_vhostConfig.getHousekeepingCheckPeriod());
+ try
{
- this.queue.add(new CreateQueueTuple(queue, arguments));
+ _brokerMBean.register();
+ } catch (JMException e)
+ {
+ throw new RuntimeException("Failed to register virtual host mbean for virtual host " + getName(), e);
}
- }
- public void removeQueue(AMQQueue queue) throws AMQStoreException
- {
+ _state = State.ACTIVE;
}
+ }
+ public class BeforePassivationListener implements EventListener
+ {
- private static class CreateQueueTuple
+ @Override
+ public void event(Event event)
{
- private AMQQueue queue;
- private FieldTable arguments;
+ _connectionRegistry.close(IConnectionRegistry.VHOST_PASSIVATE_REPLY_TEXT);
+ _brokerMBean.unregister();
+ removeHouseKeepingTasks();
- public CreateQueueTuple(AMQQueue queue, FieldTable arguments)
- {
- this.queue = queue;
- this.arguments = arguments;
- }
+ _queueRegistry.stopAllAndUnregisterMBeans();
+ _exchangeRegistry.clearAndUnregisterMbeans();
+ _dtxRegistry.close();
+
+ _state = State.PASSIVE;
}
+ }
- private static class CreateBindingTuple
+ private final class BeforeCloseListener implements EventListener
+ {
+ @Override
+ public void event(Event event)
{
- private AMQQueue queue;
- private FieldTable arguments;
- private Exchange exchange;
- private AMQShortString routingKey;
-
- public CreateBindingTuple(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args)
- {
- this.exchange = exchange;
- this.routingKey = routingKey;
- this.queue = queue;
- arguments = args;
- }
+ _brokerMBean.unregister();
+ shutdownHouseKeeping();
}
+ }
- public void updateQueue(AMQQueue queue) throws AMQStoreException
+ private class VirtualHostHouseKeepingTask extends HouseKeepingTask
+ {
+ public VirtualHostHouseKeepingTask()
{
+ super(VirtualHostImpl.this);
}
- public void createBrokerLink(final BrokerLink link) throws AMQStoreException
+ public void execute()
{
- if(link.isDurable())
+ for (AMQQueue q : _queueRegistry.getQueues())
{
- links.add(link);
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Checking message status for queue: "
+ + q.getName());
+ }
+ try
+ {
+ q.checkMessageStatus();
+ } catch (Exception e)
+ {
+ _logger.error("Exception in housekeeping for queue: "
+ + q.getNameShortString().toString(), e);
+ //Don't throw exceptions as this will stop the
+ // house keeping task from running.
+ }
}
- }
-
- public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
- {
- }
-
- public void createBridge(final Bridge bridge) throws AMQStoreException
- {
- if(bridge.isDurable())
+ for (AMQConnectionModel connection : getConnectionRegistry().getConnections())
{
- bridges.add(bridge);
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Checking for long running open transactions on connection " + connection);
+ }
+ for (AMQSessionModel session : connection.getSessionModels())
+ {
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Checking for long running open transactions on session " + session);
+ }
+ try
+ {
+ session.checkTransactionStatus(_vhostConfig.getTransactionTimeoutOpenWarn(),
+ _vhostConfig.getTransactionTimeoutOpenClose(),
+ _vhostConfig.getTransactionTimeoutIdleWarn(),
+ _vhostConfig.getTransactionTimeoutIdleClose());
+ } catch (Exception e)
+ {
+ _logger.error("Exception in housekeeping for connection: " + connection.toString(), e);
+ }
+ }
}
}
-
- public void deleteBridge(final Bridge bridge) throws AMQStoreException
- {
- }
- }
-
- @Override
- public String toString()
- {
- return _name;
}
}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/AMQBrokerManagerMBeanTest.java b/java/broker/src/test/java/org/apache/qpid/server/AMQBrokerManagerMBeanTest.java
index d34d1bbef3..5c500771c2 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/AMQBrokerManagerMBeanTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/AMQBrokerManagerMBeanTest.java
@@ -37,6 +37,7 @@ import org.apache.qpid.server.queue.QueueRegistry;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.registry.IApplicationRegistry;
import org.apache.qpid.server.store.TestableMemoryMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStoreFactory;
import org.apache.qpid.server.util.TestApplicationRegistry;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.server.virtualhost.VirtualHostImpl;
@@ -165,7 +166,7 @@ public class AMQBrokerManagerMBeanTest extends QpidTestCase
XMLConfiguration configXml = new XMLConfiguration();
configXml.addProperty("virtualhosts.virtualhost(-1).name", "test");
- configXml.addProperty("virtualhosts.virtualhost(-1).test.store.class", TestableMemoryMessageStore.class.getName());
+ configXml.addProperty("virtualhosts.virtualhost(-1).test.store.factoryclass", TestableMemoryMessageStoreFactory.class.getName());
ServerConfiguration configuration = new ServerConfiguration(configXml);
diff --git a/java/broker/src/test/java/org/apache/qpid/server/AMQChannelTest.java b/java/broker/src/test/java/org/apache/qpid/server/AMQChannelTest.java
new file mode 100644
index 0000000000..fc6cbcb248
--- /dev/null
+++ b/java/broker/src/test/java/org/apache/qpid/server/AMQChannelTest.java
@@ -0,0 +1,52 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server;
+
+import org.apache.qpid.server.protocol.AMQProtocolSession;
+import org.apache.qpid.server.protocol.InternalTestProtocolSession;
+import org.apache.qpid.server.registry.ApplicationRegistry;
+import org.apache.qpid.server.util.InternalBrokerBaseCase;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+
+public class AMQChannelTest extends InternalBrokerBaseCase
+{
+ private VirtualHost _virtualHost;
+ private AMQProtocolSession _protocolSession;
+
+ @Override
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _virtualHost = ApplicationRegistry.getInstance().getVirtualHostRegistry().getVirtualHosts().iterator().next();
+ _protocolSession = new InternalTestProtocolSession(_virtualHost);
+ }
+
+ public void testCompareTo() throws Exception
+ {
+ AMQChannel channel1 = new AMQChannel(_protocolSession, 1, _virtualHost.getMessageStore());
+
+ // create a channel with the same channelId but on a different session
+ AMQChannel channel2 = new AMQChannel(new InternalTestProtocolSession(_virtualHost), 1, _virtualHost.getMessageStore());
+ assertFalse("Unexpected compare result", channel1.compareTo(channel2) == 0);
+ assertEquals("Unexpected compare result", 0, channel1.compareTo(channel1));
+ }
+
+}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/configuration/MockConnectionConfig.java b/java/broker/src/test/java/org/apache/qpid/server/configuration/MockConnectionConfig.java
index 73e0bc5d27..c0777d2f8f 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/configuration/MockConnectionConfig.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/configuration/MockConnectionConfig.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.server.configuration;
import java.util.UUID;
diff --git a/java/broker/src/test/java/org/apache/qpid/server/configuration/VirtualHostConfigurationTest.java b/java/broker/src/test/java/org/apache/qpid/server/configuration/VirtualHostConfigurationTest.java
index 50e7f0588b..c4c93acfb6 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/configuration/VirtualHostConfigurationTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/configuration/VirtualHostConfigurationTest.java
@@ -27,6 +27,7 @@ import org.apache.qpid.server.queue.AMQPriorityQueue;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.TestableMemoryMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStoreFactory;
import org.apache.qpid.server.util.InternalBrokerBaseCase;
import org.apache.qpid.server.virtualhost.VirtualHost;
@@ -161,7 +162,7 @@ public class VirtualHostConfigurationTest extends InternalBrokerBaseCase
getConfigXml().addProperty("virtualhosts.virtualhost." + getName() + "Extra.queues(-1).queue(-1).name", "r2d2");
getConfigXml().addProperty("virtualhosts.virtualhost." + getName() + "Extra.queues.queue.r2d2.deadLetterQueues", "true");
getConfigXml().addProperty("virtualhosts.virtualhost." + getName() + "Extra.queues(-1).queue(-1).name", "c3p0");
- getConfigXml().addProperty("virtualhosts.virtualhost." + getName() + "Extra.store.class", TestableMemoryMessageStore.class.getName());
+ getConfigXml().addProperty("virtualhosts.virtualhost." + getName() + "Extra.store.factoryclass", TestableMemoryMessageStoreFactory.class.getName());
// Start the broker now.
super.createBroker();
diff --git a/java/broker/src/test/java/org/apache/qpid/server/exchange/AbstractHeadersExchangeTestBase.java b/java/broker/src/test/java/org/apache/qpid/server/exchange/AbstractHeadersExchangeTestBase.java
index 27a0462e09..afd8fd9ed2 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/exchange/AbstractHeadersExchangeTestBase.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/exchange/AbstractHeadersExchangeTestBase.java
@@ -20,8 +20,19 @@
*/
package org.apache.qpid.server.exchange;
-import org.apache.log4j.Logger;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.log4j.Logger;
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.BasicContentHeaderProperties;
@@ -31,11 +42,11 @@ import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.framing.FieldTableFactory;
import org.apache.qpid.framing.abstraction.MessagePublishInfo;
import org.apache.qpid.server.binding.Binding;
-import org.apache.qpid.server.binding.BindingFactory;
import org.apache.qpid.server.message.AMQMessage;
import org.apache.qpid.server.message.AMQMessageHeader;
import org.apache.qpid.server.message.MessageMetaData;
import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.protocol.AMQProtocolSession;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.BaseQueue;
@@ -44,23 +55,10 @@ import org.apache.qpid.server.queue.MockStoredMessage;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.queue.SimpleAMQQueue;
import org.apache.qpid.server.registry.ApplicationRegistry;
-import org.apache.qpid.server.store.DurableConfigurationStore;
-import org.apache.qpid.server.store.MemoryMessageStore;
import org.apache.qpid.server.store.StoredMessage;
import org.apache.qpid.server.subscription.Subscription;
import org.apache.qpid.server.util.InternalBrokerBaseCase;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicLong;
-
public class AbstractHeadersExchangeTestBase extends InternalBrokerBaseCase
{
private static final Logger _log = Logger.getLogger(AbstractHeadersExchangeTestBase.class);
@@ -68,24 +66,6 @@ public class AbstractHeadersExchangeTestBase extends InternalBrokerBaseCase
private final HeadersExchange exchange = new HeadersExchange();
protected final Set<TestQueue> queues = new HashSet<TestQueue>();
-
-
- /**
- * Not used in this test, just there to stub out the routing calls
- */
- private MemoryMessageStore _store = new MemoryMessageStore();
-
-
- private BindingFactory bindingFactory = new BindingFactory(new DurableConfigurationStore.Source()
- {
-
- public DurableConfigurationStore getDurableConfigurationStore()
- {
- return _store;
- }
- },
- exchange);
-
private int count;
public void testDoNothing()
@@ -103,7 +83,6 @@ public class AbstractHeadersExchangeTestBase extends InternalBrokerBaseCase
protected void unbind(TestQueue queue, String... bindings) throws AMQException
{
String queueName = queue.getName();
- //TODO - check this
exchange.onUnbind(new Binding(null,queueName, queue, exchange, getHeadersMap(bindings)));
}
@@ -123,7 +102,7 @@ public class AbstractHeadersExchangeTestBase extends InternalBrokerBaseCase
protected int route(Message m) throws AMQException
{
- m.getIncomingMessage().headersReceived();
+ m.getIncomingMessage().headersReceived(System.currentTimeMillis());
m.route(exchange);
if(m.getIncomingMessage().allContentReceived())
{
@@ -297,7 +276,7 @@ public class AbstractHeadersExchangeTestBase extends InternalBrokerBaseCase
public TestQueue(AMQShortString name) throws AMQException
{
- super(name, false, new AMQShortString("test"), true, false,ApplicationRegistry.getInstance().getVirtualHostRegistry().getVirtualHost("test"), Collections.EMPTY_MAP);
+ super(UUIDGenerator.generateUUID(), name, false, new AMQShortString("test"), true, false,ApplicationRegistry.getInstance().getVirtualHostRegistry().getVirtualHost("test"), Collections.EMPTY_MAP);
ApplicationRegistry.getInstance().getVirtualHostRegistry().getVirtualHost("test").getQueueRegistry().registerQueue(this);
}
@@ -538,12 +517,6 @@ public class AbstractHeadersExchangeTestBase extends InternalBrokerBaseCase
}
- public AMQMessage getUnderlyingMessage()
- {
- return Message.this;
- }
-
-
public ContentHeaderBody getContentHeader()
{
try
diff --git a/java/broker/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java b/java/broker/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java
index 1fac4afe29..9034bf9c3a 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java
@@ -26,6 +26,7 @@ import org.apache.qpid.exchange.ExchangeDefaults;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.management.common.mbeans.ManagedExchange;
import org.apache.qpid.server.management.ManagedObject;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
import org.apache.qpid.server.queue.QueueRegistry;
@@ -52,7 +53,7 @@ public class ExchangeMBeanTest extends InternalBrokerBaseCase
public void testGeneralProperties() throws Exception
{
DirectExchange exchange = new DirectExchange();
- exchange.initialise(_virtualHost, ExchangeDefaults.DIRECT_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost, ExchangeDefaults.DIRECT_EXCHANGE_NAME, false, 0, true);
ManagedObject managedObj = exchange.getManagedObject();
ManagedExchange mbean = (ManagedExchange)managedObj;
@@ -67,7 +68,7 @@ public class ExchangeMBeanTest extends InternalBrokerBaseCase
public void testDirectExchangeMBean() throws Exception
{
DirectExchange exchange = new DirectExchange();
- exchange.initialise(_virtualHost, ExchangeDefaults.DIRECT_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost, ExchangeDefaults.DIRECT_EXCHANGE_NAME, false, 0, true);
ManagedObject managedObj = exchange.getManagedObject();
ManagedExchange mbean = (ManagedExchange)managedObj;
@@ -82,7 +83,7 @@ public class ExchangeMBeanTest extends InternalBrokerBaseCase
public void testTopicExchangeMBean() throws Exception
{
TopicExchange exchange = new TopicExchange();
- exchange.initialise(_virtualHost,ExchangeDefaults.TOPIC_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost,ExchangeDefaults.TOPIC_EXCHANGE_NAME, false, 0, true);
ManagedObject managedObj = exchange.getManagedObject();
ManagedExchange mbean = (ManagedExchange)managedObj;
@@ -97,7 +98,7 @@ public class ExchangeMBeanTest extends InternalBrokerBaseCase
public void testHeadersExchangeMBean() throws Exception
{
HeadersExchange exchange = new HeadersExchange();
- exchange.initialise(_virtualHost,ExchangeDefaults.HEADERS_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost,ExchangeDefaults.HEADERS_EXCHANGE_NAME, false, 0, true);
ManagedObject managedObj = exchange.getManagedObject();
ManagedExchange mbean = (ManagedExchange)managedObj;
@@ -119,7 +120,7 @@ public class ExchangeMBeanTest extends InternalBrokerBaseCase
public void testHeadersExchangeMBeanMatchPropertyNoValue() throws Exception
{
HeadersExchange exchange = new HeadersExchange();
- exchange.initialise(_virtualHost,ExchangeDefaults.HEADERS_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost,ExchangeDefaults.HEADERS_EXCHANGE_NAME, false, 0, true);
ManagedObject managedObj = exchange.getManagedObject();
ManagedExchange mbean = (ManagedExchange)managedObj;
@@ -137,7 +138,7 @@ public class ExchangeMBeanTest extends InternalBrokerBaseCase
public void testInvalidHeaderBindingMalformed() throws Exception
{
HeadersExchange exchange = new HeadersExchange();
- exchange.initialise(_virtualHost,ExchangeDefaults.HEADERS_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost,ExchangeDefaults.HEADERS_EXCHANGE_NAME, false, 0, true);
ManagedObject managedObj = exchange.getManagedObject();
ManagedExchange mbean = (ManagedExchange)managedObj;
diff --git a/java/broker/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java b/java/broker/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java
index dfa31e131f..00c8a18d9f 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java
@@ -350,7 +350,7 @@ public class TopicExchangeTest extends InternalBrokerBaseCase
private int routeMessage(final IncomingMessage message)
throws AMQException
{
- MessageMetaData mmd = message.headersReceived();
+ MessageMetaData mmd = message.headersReceived(System.currentTimeMillis());
message.setStoredMessage(_store.addMessage(mmd));
message.enqueue(_exchange.route(message));
diff --git a/java/broker/src/test/java/org/apache/qpid/server/logging/messages/MessageStoreMessagesTest.java b/java/broker/src/test/java/org/apache/qpid/server/logging/messages/MessageStoreMessagesTest.java
index cc032a0430..3377573b9d 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/logging/messages/MessageStoreMessagesTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/logging/messages/MessageStoreMessagesTest.java
@@ -29,12 +29,10 @@ public class MessageStoreMessagesTest extends AbstractTestMessages
{
public void testMessageStoreCreated()
{
- String name = "DerbyMessageStore";
-
- _logMessage = MessageStoreMessages.CREATED(name);
+ _logMessage = MessageStoreMessages.CREATED();
List<Object> log = performLog();
- String[] expected = {"Created :", name};
+ String[] expected = {"Created"};
validateLogMessage(log, "MST-1001", expected);
}
@@ -70,56 +68,4 @@ public class MessageStoreMessagesTest extends AbstractTestMessages
validateLogMessage(log, "MST-1004", expected);
}
-/*
- public void testMessageStoreRecoveryStart_withQueue()
- {
- String queueName = "testQueue";
-
- _logMessage = MessageStoreMessages.RECOVERY_START(queueName, true);
- List<Object> log = performLog();
-
- String[] expected = {"Recovery Start :", queueName};
-
- validateLogMessage(log, "MST-1004", expected);
- }
-
- public void testMessageStoreRecovered()
- {
- String queueName = "testQueue";
- Integer messasgeCount = 2000;
-
- _logMessage = MessageStoreMessages.MST_RECOVERED(messasgeCount, queueName);
- List<Object> log = performLog();
-
- // Here we use MessageFormat to ensure the messasgeCount of 2000 is
- // reformated for display as '2,000'
- String[] expected = {"Recovered ",
- MessageFormat.format("{0,number}", messasgeCount),
- "messages for queue", queueName};
-
- validateLogMessage(log, "MST-1005", expected);
- }
-
- public void testMessageStoreRecoveryComplete()
- {
- _logMessage = MessageStoreMessages.MST_RECOVERY_COMPLETE(null,false);
- List<Object> log = performLog();
-
- String[] expected = {"Recovery Complete"};
-
- validateLogMessage(log, "MST-1006", expected);
- }
-
- public void testMessageStoreRecoveryComplete_withQueue()
- {
- String queueName = "testQueue";
-
- _logMessage = MessageStoreMessages.MST_RECOVERY_COMPLETE(queueName, true);
- List<Object> log = performLog();
-
- String[] expected = {"Recovery Complete :", queueName};
-
- validateLogMessage(log, "MST-1006", expected);
- }
- */
}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubjectTest.java b/java/broker/src/test/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubjectTest.java
index 158fb667a9..c62b24c3b9 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubjectTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubjectTest.java
@@ -37,13 +37,13 @@ public class MessageStoreLogSubjectTest extends AbstractTestLogSubject
_testVhost = ApplicationRegistry.getInstance().getVirtualHostRegistry().
getVirtualHost("test");
- _subject = new MessageStoreLogSubject(_testVhost, _testVhost.getMessageStore());
+ _subject = new MessageStoreLogSubject(_testVhost, _testVhost.getMessageStore().getClass().getSimpleName());
}
/**
* Validate that the logged Subject message is as expected:
* MESSAGE [Blank][vh(/test)/ms(MemoryMessageStore)] <Log Message>
- * @param message the message whos format needs validation
+ * @param message the message who's format needs validation
*/
@Override
protected void validateLogStatement(String message)
diff --git a/java/broker/src/test/java/org/apache/qpid/server/plugins/OsgiSystemPackageUtilTest.java b/java/broker/src/test/java/org/apache/qpid/server/plugins/OsgiSystemPackageUtilTest.java
index d64d1212b0..267545c656 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/plugins/OsgiSystemPackageUtilTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/plugins/OsgiSystemPackageUtilTest.java
@@ -73,11 +73,11 @@ public class OsgiSystemPackageUtilTest extends QpidTestCase
_map.put("org.apache.qpid.xyz", "1.0.0");
_map.put("org.abc", "1.2.3");
- _util = new OsgiSystemPackageUtil(new Version("0.15"), _map);
+ _util = new OsgiSystemPackageUtil(new Version("0.17"), _map);
final String systemPackageString = _util.getFormattedSystemPackageString();
- assertEquals("org.abc; version=1.2.3, org.apache.qpid.xyz; version=0.15.0", systemPackageString);
+ assertEquals("org.abc; version=1.2.3, org.apache.qpid.xyz; version=0.17.0", systemPackageString);
}
public void testWithQpidPackageWithoutQpidReleaseNumberSet() throws Exception
diff --git a/java/broker/src/test/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBeanTest.java b/java/broker/src/test/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBeanTest.java
index 71d5211470..fe9bcc57a6 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBeanTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBeanTest.java
@@ -30,7 +30,7 @@ import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.MessageStore;
-import org.apache.qpid.server.store.SkeletonMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStore;
import org.apache.qpid.server.util.InternalBrokerBaseCase;
import org.apache.qpid.server.virtualhost.VirtualHost;
@@ -45,7 +45,7 @@ public class AMQProtocolSessionMBeanTest extends InternalBrokerBaseCase
/** Used for debugging. */
private static final Logger log = Logger.getLogger(AMQProtocolSessionMBeanTest.class);
- private MessageStore _messageStore = new SkeletonMessageStore();
+ private MessageStore _messageStore = new TestableMemoryMessageStore();
private AMQProtocolEngine _protocolSession;
private AMQChannel _channel;
private AMQProtocolSessionMBean _mbean;
diff --git a/java/broker/src/test/java/org/apache/qpid/server/protocol/InternalTestProtocolSession.java b/java/broker/src/test/java/org/apache/qpid/server/protocol/InternalTestProtocolSession.java
index db37cc0965..96c67941f9 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/protocol/InternalTestProtocolSession.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/protocol/InternalTestProtocolSession.java
@@ -34,6 +34,7 @@ import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.security.auth.sasl.UsernamePrincipal;
import org.apache.qpid.server.subscription.ClientDeliveryMethod;
import org.apache.qpid.server.subscription.Subscription;
+import org.apache.qpid.server.subscription.SubscriptionImpl;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.transport.TestNetworkConnection;
@@ -239,12 +240,12 @@ public class InternalTestProtocolSession extends AMQProtocolEngine implements Pr
_channelDelivers.put(_channelId, consumers);
}
- LinkedList<DeliveryPair> consumerDelivers = consumers.get(sub.getConsumerTag());
+ LinkedList<DeliveryPair> consumerDelivers = consumers.get(((SubscriptionImpl)sub).getConsumerTag());
if (consumerDelivers == null)
{
consumerDelivers = new LinkedList<DeliveryPair>();
- consumers.put(sub.getConsumerTag(), consumerDelivers);
+ consumers.put(((SubscriptionImpl)sub).getConsumerTag(), consumerDelivers);
}
consumerDelivers.add(new DeliveryPair(deliveryTag, (AMQMessage)entry.getMessage()));
diff --git a/java/broker/src/test/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactoryTest.java b/java/broker/src/test/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactoryTest.java
index d8b5cd02cf..6081be8efd 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactoryTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactoryTest.java
@@ -35,6 +35,7 @@ import java.util.Set;
public class MultiVersionProtocolEngineFactoryTest extends QpidTestCase
{
+
protected void setUp() throws Exception
{
super.setUp();
@@ -93,7 +94,20 @@ public class MultiVersionProtocolEngineFactoryTest extends QpidTestCase
(byte) 0,
(byte) 10
};
-
+
+
+ private static final byte[] AMQP_1_0_0_HEADER =
+ new byte[] {
+ (byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte) 0,
+ (byte) 1,
+ (byte) 0,
+ (byte) 0
+ };
+
private byte[] getAmqpHeader(final AmqpProtocolVersion version)
{
switch(version)
@@ -106,6 +120,8 @@ public class MultiVersionProtocolEngineFactoryTest extends QpidTestCase
return AMQP_0_9_1_HEADER;
case v0_10:
return AMQP_0_10_HEADER;
+ case v1_0_0:
+ return AMQP_1_0_0_HEADER;
default:
fail("unknown AMQP version, appropriate header must be added for new protocol version");
return null;
diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueAlertTest.java b/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueAlertTest.java
index 91e35f07de..25d35aab16 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueAlertTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueAlertTest.java
@@ -35,6 +35,8 @@ import org.apache.qpid.server.subscription.SubscriptionFactoryImpl;
import org.apache.qpid.server.util.InternalBrokerBaseCase;
import javax.management.Notification;
+
+import java.nio.ByteBuffer;
import java.util.ArrayList;
/** This class tests all the alerts an AMQQueue can throw based on threshold values of different parameters */
@@ -300,7 +302,7 @@ public class AMQQueueAlertTest extends InternalBrokerBaseCase
messages[i] = message(false, size);
ArrayList<AMQQueue> qs = new ArrayList<AMQQueue>();
qs.add(getQueue());
- metaData[i] = messages[i].headersReceived();
+ metaData[i] = messages[i].headersReceived(System.currentTimeMillis());
messages[i].setStoredMessage(getMessageStore().addMessage(metaData[i]));
messages[i].enqueue(qs);
@@ -309,30 +311,29 @@ public class AMQQueueAlertTest extends InternalBrokerBaseCase
for (int i = 0; i < messageCount; i++)
{
- messages[i].addContentBodyFrame(
- new ContentChunk()
- {
-
- private byte[] _data = new byte[(int)size];
+ ContentChunk contentChunk = new ContentChunk()
+ {
+ private byte[] _data = new byte[(int)size];
- public int getSize()
- {
- return (int) size;
- }
+ public int getSize()
+ {
+ return (int) size;
+ }
- public byte[] getData()
- {
- return _data;
- }
+ public byte[] getData()
+ {
+ return _data;
+ }
- public void reduceToFit()
- {
+ public void reduceToFit()
+ {
+ }
+ };
- }
- });
+ messages[i].addContentBodyFrame(contentChunk);
+ messages[i].getStoredMessage().addContent(0, ByteBuffer.wrap(contentChunk.getData()));
getQueue().enqueue(new AMQMessage(messages[i].getStoredMessage()));
-
}
}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueFactoryTest.java b/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueFactoryTest.java
index 337ff194c3..e123a968a4 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueFactoryTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueFactoryTest.java
@@ -20,6 +20,8 @@
*/
package org.apache.qpid.server.queue;
+import java.util.UUID;
+
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.qpid.AMQException;
@@ -35,6 +37,7 @@ import org.apache.qpid.server.logging.actors.CurrentActor;
import org.apache.qpid.server.logging.actors.TestLogActor;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.TestableMemoryMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStoreFactory;
import org.apache.qpid.server.util.TestApplicationRegistry;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.test.utils.QpidTestCase;
@@ -53,7 +56,7 @@ public class AMQQueueFactoryTest extends QpidTestCase
XMLConfiguration configXml = new XMLConfiguration();
configXml.addProperty("virtualhosts.virtualhost(-1).name", getName());
- configXml.addProperty("virtualhosts.virtualhost(-1)."+getName()+".store.class", TestableMemoryMessageStore.class.getName());
+ configXml.addProperty("virtualhosts.virtualhost(-1)."+getName()+".store.factoryclass", TestableMemoryMessageStoreFactory.class.getName());
ServerConfiguration configuration = new ServerConfiguration(configXml);
diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueMBeanTest.java b/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueMBeanTest.java
index 933eb3b84f..45933e7064 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueMBeanTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueMBeanTest.java
@@ -27,6 +27,7 @@ import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.BasicContentHeaderProperties;
import org.apache.qpid.framing.ContentBody;
import org.apache.qpid.framing.ContentHeaderBody;
+import org.apache.qpid.framing.abstraction.ContentChunk;
import org.apache.qpid.framing.abstraction.MessagePublishInfo;
import org.apache.qpid.management.common.mbeans.ManagedQueue;
import org.apache.qpid.server.AMQChannel;
@@ -45,6 +46,7 @@ import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.TabularData;
import java.io.IOException;
+import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
@@ -457,15 +459,16 @@ public class AMQQueueMBeanTest extends InternalBrokerBaseCase
currentMessage.enqueue(qs);
// route header
- MessageMetaData mmd = currentMessage.headersReceived();
- currentMessage.setStoredMessage(getMessageStore().addMessage(mmd));
+ MessageMetaData mmd = currentMessage.headersReceived(System.currentTimeMillis());
- // Add the body so we have something to test later
- currentMessage.addContentBodyFrame(
- getSession().getMethodRegistry()
- .getProtocolVersionMethodConverter()
- .convertToContentChunk(
- new ContentBody(new byte[(int) MESSAGE_SIZE])));
+ // Add the message to the store so we have something to test later
+ currentMessage.setStoredMessage(getMessageStore().addMessage(mmd));
+ ContentChunk chunk = getSession().getMethodRegistry()
+ .getProtocolVersionMethodConverter()
+ .convertToContentChunk(
+ new ContentBody(new byte[(int) MESSAGE_SIZE]));
+ currentMessage.addContentBodyFrame(chunk);
+ currentMessage.getStoredMessage().addContent(0, ByteBuffer.wrap(chunk.getData()));
AMQMessage m = new AMQMessage(currentMessage.getStoredMessage());
for(BaseQueue q : currentMessage.getDestinationQueues())
diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/AckTest.java b/java/broker/src/test/java/org/apache/qpid/server/queue/AckTest.java
index 1b35dfe34f..409b9fd92e 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/queue/AckTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/queue/AckTest.java
@@ -20,7 +20,6 @@
*/
package org.apache.qpid.server.queue;
-import org.apache.log4j.Logger;
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
@@ -37,7 +36,7 @@ import org.apache.qpid.server.protocol.AMQProtocolSession;
import org.apache.qpid.server.protocol.InternalTestProtocolSession;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.StoredMessage;
-import org.apache.qpid.server.store.TestMemoryMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStore;
import org.apache.qpid.server.subscription.Subscription;
import org.apache.qpid.server.subscription.SubscriptionFactoryImpl;
import org.apache.qpid.server.txn.AutoCommitTransaction;
@@ -53,13 +52,11 @@ import java.util.Set;
*/
public class AckTest extends InternalBrokerBaseCase
{
- private static final Logger _log = Logger.getLogger(AckTest.class);
-
private Subscription _subscription;
private AMQProtocolSession _protocolSession;
- private TestMemoryMessageStore _messageStore;
+ private TestableMemoryMessageStore _messageStore;
private AMQChannel _channel;
@@ -73,7 +70,7 @@ public class AckTest extends InternalBrokerBaseCase
{
super.setUp();
_virtualHost = ApplicationRegistry.getInstance().getVirtualHostRegistry().getVirtualHost("test");
- _messageStore = new TestMemoryMessageStore();
+ _messageStore = new TestableMemoryMessageStore();
_protocolSession = new InternalTestProtocolSession(_virtualHost);
_channel = new AMQChannel(_protocolSession,5, _messageStore /*dont need exchange registry*/);
@@ -143,7 +140,7 @@ public class AckTest extends InternalBrokerBaseCase
ArrayList<AMQQueue> qs = new ArrayList<AMQQueue>();
qs.add(_queue);
msg.enqueue(qs);
- MessageMetaData mmd = msg.headersReceived();
+ MessageMetaData mmd = msg.headersReceived(System.currentTimeMillis());
final StoredMessage storedMessage = _messageStore.addMessage(mmd);
msg.setStoredMessage(storedMessage);
final AMQMessage message = new AMQMessage(storedMessage);
@@ -180,7 +177,7 @@ public class AckTest extends InternalBrokerBaseCase
}
catch (InterruptedException e)
{
- e.printStackTrace(); //TODO.
+ Thread.currentThread().interrupt();
}
}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/MockAMQQueue.java b/java/broker/src/test/java/org/apache/qpid/server/queue/MockAMQQueue.java
index 34dc5b4428..afaa417415 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/queue/MockAMQQueue.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/queue/MockAMQQueue.java
@@ -34,7 +34,6 @@ import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.protocol.AMQSessionModel;
import org.apache.qpid.server.security.AuthorizationHolder;
import org.apache.qpid.server.subscription.Subscription;
-import org.apache.qpid.server.txn.ServerTransaction;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.List;
@@ -357,12 +356,12 @@ public class MockAMQQueue implements AMQQueue
return null;
}
- public void moveMessagesToAnotherQueue(long fromMessageId, long toMessageId, String queueName, ServerTransaction storeContext)
+ public void moveMessagesToAnotherQueue(long fromMessageId, long toMessageId, String queueName)
{
}
- public void copyMessagesToAnotherQueue(long fromMessageId, long toMessageId, String queueName, ServerTransaction storeContext)
+ public void copyMessagesToAnotherQueue(long fromMessageId, long toMessageId, String queueName)
{
}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/MockStoredMessage.java b/java/broker/src/test/java/org/apache/qpid/server/queue/MockStoredMessage.java
index fba3851507..950d59bef5 100755
--- a/java/broker/src/test/java/org/apache/qpid/server/queue/MockStoredMessage.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/queue/MockStoredMessage.java
@@ -25,7 +25,7 @@ import org.apache.qpid.framing.ContentHeaderBody;
import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.framing.abstraction.MessagePublishInfo;
import org.apache.qpid.server.message.MessageMetaData;
-import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.StoreFuture;
import org.apache.qpid.server.store.StoredMessage;
import java.nio.ByteBuffer;
@@ -105,9 +105,9 @@ public class MockStoredMessage implements StoredMessage<MessageMetaData>
return buf;
}
- public MessageStore.StoreFuture flushToStore()
+ public StoreFuture flushToStore()
{
- return MessageStore.IMMEDIATE_FUTURE;
+ return StoreFuture.IMMEDIATE_FUTURE;
}
public void remove()
diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/PriorityQueueListTest.java b/java/broker/src/test/java/org/apache/qpid/server/queue/PriorityQueueListTest.java
new file mode 100644
index 0000000000..e8c0470915
--- /dev/null
+++ b/java/broker/src/test/java/org/apache/qpid/server/queue/PriorityQueueListTest.java
@@ -0,0 +1,117 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.queue;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.qpid.server.message.AMQMessageHeader;
+import org.apache.qpid.server.message.MessageReference;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public class PriorityQueueListTest extends QpidTestCase
+{
+ private static final byte[] PRIORITIES = {4, 5, 5, 4};
+ PriorityQueueList _list = new PriorityQueueList(null, 10);
+
+ private QueueEntry _priority4message1;
+ private QueueEntry _priority4message2;
+ private QueueEntry _priority5message1;
+ private QueueEntry _priority5message2;
+
+ protected void setUp()
+ {
+ QueueEntry[] entries = new QueueEntry[PRIORITIES.length];
+
+ for (int i = 0; i < PRIORITIES.length; i++)
+ {
+ ServerMessage<?> message = mock(ServerMessage.class);
+ AMQMessageHeader header = mock(AMQMessageHeader.class);
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ MessageReference<ServerMessage> ref = mock(MessageReference.class);
+
+ when(message.getMessageHeader()).thenReturn(header);
+ when(message.newReference()).thenReturn(ref);
+ when(ref.getMessage()).thenReturn(message);
+ when(header.getPriority()).thenReturn(PRIORITIES[i]);
+
+ entries[i] = _list.add(message);
+ }
+
+ _priority4message1 = entries[0];
+ _priority4message2 = entries[3];
+ _priority5message1 = entries[1];
+ _priority5message2 = entries[2];
+ }
+
+ public void testPriorityQueueEntryCompareToItself()
+ {
+ //check messages compare to themselves properly
+ assertEquals("message should compare 'equal' to itself",
+ 0, _priority4message1.compareTo(_priority4message1));
+
+ assertEquals("message should compare 'equal' to itself",
+ 0, _priority5message2.compareTo(_priority5message2));
+ }
+
+ public void testPriorityQueueEntryCompareToSamePriority()
+ {
+ //check messages with the same priority are ordered properly
+ assertEquals("first message should be 'earlier' than second message of the same priority",
+ -1, _priority4message1.compareTo(_priority4message2));
+
+ assertEquals("first message should be 'earlier' than second message of the same priority",
+ -1, _priority5message1.compareTo(_priority5message2));
+
+ //and in reverse
+ assertEquals("second message should be 'later' than first message of the same priority",
+ 1, _priority4message2.compareTo(_priority4message1));
+
+ assertEquals("second message should be 'later' than first message of the same priority",
+ 1, _priority5message2.compareTo(_priority5message1));
+ }
+
+ public void testPriorityQueueEntryCompareToDifferentPriority()
+ {
+ //check messages with higher priority are ordered 'earlier' than those with lower priority
+ assertEquals("first message with priority 5 should be 'earlier' than first message of priority 4",
+ -1, _priority5message1.compareTo(_priority4message1));
+ assertEquals("first message with priority 5 should be 'earlier' than second message of priority 4",
+ -1, _priority5message1.compareTo(_priority4message2));
+
+ assertEquals("second message with priority 5 should be 'earlier' than first message of priority 4",
+ -1, _priority5message2.compareTo(_priority4message1));
+ assertEquals("second message with priority 5 should be 'earlier' than second message of priority 4",
+ -1, _priority5message2.compareTo(_priority4message2));
+
+ //and in reverse
+ assertEquals("first message with priority 4 should be 'later' than first message of priority 5",
+ 1, _priority4message1.compareTo(_priority5message1));
+ assertEquals("first message with priority 4 should be 'later' than second message of priority 5",
+ 1, _priority4message1.compareTo(_priority5message2));
+
+ assertEquals("second message with priority 4 should be 'later' than first message of priority 5",
+ 1, _priority4message2.compareTo(_priority5message1));
+ assertEquals("second message with priority 4 should be 'later' than second message of priority 5",
+ 1, _priority4message2.compareTo(_priority5message2));
+ }
+}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/QueueEntryListTestBase.java b/java/broker/src/test/java/org/apache/qpid/server/queue/QueueEntryListTestBase.java
index 7f81aaed51..4b40c3b552 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/queue/QueueEntryListTestBase.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/queue/QueueEntryListTestBase.java
@@ -31,6 +31,7 @@ public abstract class QueueEntryListTestBase extends TestCase
{
protected static final AMQQueue _testQueue = new MockAMQQueue("test");
public abstract QueueEntryList<QueueEntry> getTestList();
+ public abstract QueueEntryList<QueueEntry> getTestList(boolean newList);
public abstract long getExpectedFirstMsgId();
public abstract int getExpectedListLength();
public abstract ServerMessage getTestMessageToAdd() throws AMQException;
@@ -188,4 +189,36 @@ public abstract class QueueEntryListTestBase extends TestCase
.getMessage().getMessageNumber(), third.getMessage().getMessageNumber());
}
+ /**
+ * Tests that after the last node of the list is marked deleted but has not yet been removed,
+ * the iterator still ignores it and returns that it is 'atTail()' and can't 'advance()'
+ *
+ * @see QueueEntryListTestBase#getTestList()
+ * @see QueueEntryListTestBase#getExpectedListLength()
+ */
+ public void testIteratorIgnoresDeletedFinalNode() throws Exception
+ {
+ QueueEntryList<QueueEntry> list = getTestList(true);
+ int i = 0;
+
+ QueueEntry queueEntry1 = list.add(new MockAMQMessage(i++));
+ QueueEntry queueEntry2 = list.add(new MockAMQMessage(i++));
+
+ assertSame(queueEntry2, list.next(queueEntry1));
+ assertNull(list.next(queueEntry2));
+
+ //'delete' the 2nd QueueEntry
+ assertTrue("Deleting node should have succeeded", queueEntry2.delete());
+
+ QueueEntryIterator<QueueEntry> iter = list.iterator();
+
+ //verify the iterator isn't 'atTail', can advance, and returns the 1st QueueEntry
+ assertFalse("Iterator should not have been 'atTail'", iter.atTail());
+ assertTrue("Iterator should have been able to advance", iter.advance());
+ assertSame("Iterator returned unexpected QueueEntry", queueEntry1, iter.getNode());
+
+ //verify the iterator is atTail() and can't advance
+ assertTrue("Iterator should have been 'atTail'", iter.atTail());
+ assertFalse("Iterator should not have been able to advance", iter.advance());
+ }
}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleAMQQueueTest.java b/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleAMQQueueTest.java
index c345384e28..52ad4a7c5b 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleAMQQueueTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleAMQQueueTest.java
@@ -37,15 +37,16 @@ import org.apache.qpid.server.exchange.DirectExchange;
import org.apache.qpid.server.message.AMQMessage;
import org.apache.qpid.server.message.MessageMetaData;
import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.BaseQueue.PostEnqueueAction;
import org.apache.qpid.server.queue.SimpleAMQQueue.QueueEntryFilter;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.StoredMessage;
import org.apache.qpid.server.store.TestableMemoryMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStoreFactory;
import org.apache.qpid.server.subscription.MockSubscription;
import org.apache.qpid.server.subscription.Subscription;
import org.apache.qpid.server.txn.AutoCommitTransaction;
-import org.apache.qpid.server.txn.LocalTransaction;
import org.apache.qpid.server.txn.ServerTransaction;
import org.apache.qpid.server.util.InternalBrokerBaseCase;
import org.apache.qpid.server.virtualhost.VirtualHost;
@@ -62,7 +63,6 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
protected SimpleAMQQueue _queue;
protected VirtualHost _virtualHost;
- protected TestableMemoryMessageStore _store = new TestableMemoryMessageStore();
protected AMQShortString _qname = new AMQShortString("qname");
protected AMQShortString _owner = new AMQShortString("owner");
protected AMQShortString _routingKey = new AMQShortString("routing key");
@@ -107,7 +107,9 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
ApplicationRegistry applicationRegistry = (ApplicationRegistry)ApplicationRegistry.getInstance();
PropertiesConfiguration env = new PropertiesConfiguration();
- _virtualHost = new VirtualHostImpl(ApplicationRegistry.getInstance(), new VirtualHostConfiguration(getClass().getName(), env), _store);
+ final VirtualHostConfiguration vhostConfig = new VirtualHostConfiguration(getClass().getName(), env);
+ vhostConfig.setMessageStoreFactoryClass(TestableMemoryMessageStoreFactory.class.getName());
+ _virtualHost = new VirtualHostImpl(ApplicationRegistry.getInstance(), vhostConfig);
applicationRegistry.getVirtualHostRegistry().registerVirtualHost(_virtualHost);
_queue = (SimpleAMQQueue) AMQQueueFactory.createAMQQueueImpl(_qname, false, _owner, false, false, _virtualHost, _arguments);
@@ -136,7 +138,7 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
}
try {
- _queue = new SimpleAMQQueue(_qname, false, _owner, false, false,null, Collections.EMPTY_MAP);
+ _queue = new SimpleAMQQueue(UUIDGenerator.generateUUID(), _qname, false, _owner, false,false, null, Collections.EMPTY_MAP);
assertNull("Queue was created", _queue);
}
catch (IllegalArgumentException e)
@@ -478,7 +480,7 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
public void testAutoDeleteQueue() throws Exception
{
_queue.stop();
- _queue = new SimpleAMQQueue(_qname, false, null, true, false, _virtualHost, Collections.EMPTY_MAP);
+ _queue = new SimpleAMQQueue(UUIDGenerator.generateUUID(), _qname, false, null, true, false, _virtualHost, Collections.EMPTY_MAP);
_queue.setDeleteOnNoConsumers(true);
_queue.registerSubscription(_subscription, false);
AMQMessage message = createMessage(new Long(25));
@@ -634,12 +636,13 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
// Send persistent message
qs.add(_queue);
- MessageMetaData metaData = msg.headersReceived();
- StoredMessage handle = _store.addMessage(metaData);
+ MessageMetaData metaData = msg.headersReceived(System.currentTimeMillis());
+ TestableMemoryMessageStore store = (TestableMemoryMessageStore) _virtualHost.getMessageStore();
+ StoredMessage handle = store.addMessage(metaData);
msg.setStoredMessage(handle);
- ServerTransaction txn = new AutoCommitTransaction(_store);
+ ServerTransaction txn = new AutoCommitTransaction(store);
txn.enqueue(qs, msg, new ServerTransaction.Action()
{
@@ -654,7 +657,7 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
}, 0L);
// Check that it is enqueued
- AMQQueue data = _store.getMessages().get(1L);
+ AMQQueue data = store.getMessages().get(1L);
assertNull(data);
// Dequeue message
@@ -665,7 +668,7 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
_queue.dequeue(entry,null);
// Check that it is dequeued
- data = _store.getMessages().get(1L);
+ data = store.getMessages().get(1L);
assertNull(data);
}
@@ -689,8 +692,8 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
public void testProcessQueueWithUniqueSelectors() throws Exception
{
TestSimpleQueueEntryListFactory factory = new TestSimpleQueueEntryListFactory();
- SimpleAMQQueue testQueue = new SimpleAMQQueue("testQueue", false, "testOwner",false,
- false, _virtualHost, factory, null)
+ SimpleAMQQueue testQueue = new SimpleAMQQueue(UUIDGenerator.generateUUID(), "testQueue", false,"testOwner",
+ false, false, _virtualHost, factory, null)
{
@Override
public void deliverAsync(Subscription sub)
@@ -839,7 +842,7 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
/**
* Tests that dequeued message is not copied as part of invocation of
- * {@link SimpleAMQQueue#copyMessagesToAnotherQueue(long, long, String, ServerTransaction)}
+ * {@link SimpleAMQQueue#copyMessagesToAnotherQueue(long, long, String)}
*/
public void testCopyMessagesWithDequeuedEntry()
{
@@ -856,14 +859,8 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
// create another queue
SimpleAMQQueue queue = createQueue(anotherQueueName);
- // create transaction
- ServerTransaction txn = new LocalTransaction(_queue.getVirtualHost().getMessageStore());
-
// copy messages into another queue
- _queue.copyMessagesToAnotherQueue(0, messageNumber, anotherQueueName, txn);
-
- // commit transaction
- txn.commit();
+ _queue.copyMessagesToAnotherQueue(0, messageNumber, anotherQueueName);
// get messages on another queue
List<QueueEntry> entries = queue.getMessagesOnTheQueue();
@@ -889,7 +886,7 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
/**
* Tests that dequeued message is not moved as part of invocation of
- * {@link SimpleAMQQueue#moveMessagesToAnotherQueue(long, long, String, ServerTransaction)}
+ * {@link SimpleAMQQueue#moveMessagesToAnotherQueue(long, long, String)}
*/
public void testMovedMessagesWithDequeuedEntry()
{
@@ -906,14 +903,8 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
// create another queue
SimpleAMQQueue queue = createQueue(anotherQueueName);
- // create transaction
- ServerTransaction txn = new LocalTransaction(_queue.getVirtualHost().getMessageStore());
-
// move messages into another queue
- _queue.moveMessagesToAnotherQueue(0, messageNumber, anotherQueueName, txn);
-
- // commit transaction
- txn.commit();
+ _queue.moveMessagesToAnotherQueue(0, messageNumber, anotherQueueName);
// get messages on another queue
List<QueueEntry> entries = queue.getMessagesOnTheQueue();
@@ -1038,8 +1029,8 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
int dequeueMessageIndex = 1;
// create queue with overridden method deliverAsync
- SimpleAMQQueue testQueue = new SimpleAMQQueue(new AMQShortString("test"), false,
- new AMQShortString("testOwner"), false, false, _virtualHost, null)
+ SimpleAMQQueue testQueue = new SimpleAMQQueue(UUIDGenerator.generateUUID(), new AMQShortString("test"),
+ false, new AMQShortString("testOwner"), false, false, _virtualHost, null)
{
@Override
public void deliverAsync(Subscription sub)
@@ -1109,8 +1100,8 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
public void testEqueueDequeuedEntry()
{
// create a queue where each even entry is considered a dequeued
- SimpleAMQQueue queue = new SimpleAMQQueue(new AMQShortString("test"), false, new AMQShortString("testOwner"),
- false, false, _virtualHost, new QueueEntryListFactory()
+ SimpleAMQQueue queue = new SimpleAMQQueue(UUIDGenerator.generateUUID(), new AMQShortString("test"), false,
+ new AMQShortString("testOwner"), false, false, _virtualHost, new QueueEntryListFactory()
{
public QueueEntryList createQueueEntryList(AMQQueue queue)
{
@@ -1187,8 +1178,8 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
public void testActiveConsumerCount() throws Exception
{
- final SimpleAMQQueue queue = new SimpleAMQQueue(new AMQShortString("testActiveConsumerCount"), false, new AMQShortString("testOwner"),
- false, false, _virtualHost, new SimpleQueueEntryList.Factory(), null);
+ final SimpleAMQQueue queue = new SimpleAMQQueue(UUIDGenerator.generateUUID(), new AMQShortString("testActiveConsumerCount"), false,
+ new AMQShortString("testOwner"), false, false, _virtualHost, new SimpleQueueEntryList.Factory(), null);
//verify adding an active subscription increases the count
final MockSubscription subscription1 = new MockSubscription();
diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java b/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java
index d8d78bbb84..ac18bbe687 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.server.queue;
import org.apache.qpid.AMQException;
diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryListTest.java b/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryListTest.java
index 55c6143124..caf1eea09f 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryListTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryListTest.java
@@ -23,6 +23,7 @@ package org.apache.qpid.server.queue;
import org.apache.qpid.AMQException;
import org.apache.qpid.server.message.AMQMessage;
import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.queue.SimpleQueueEntryList.QueueEntryIteratorImpl;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -59,11 +60,24 @@ public class SimpleQueueEntryListTest extends QueueEntryListTestBase
System.clearProperty(SCAVENGE_PROP);
}
}
-
+
@Override
public QueueEntryList getTestList()
{
- return _sqel;
+ return getTestList(false);
+ }
+
+ @Override
+ public QueueEntryList getTestList(boolean newList)
+ {
+ if(newList)
+ {
+ return new SimpleQueueEntryList(_testQueue);
+ }
+ else
+ {
+ return _sqel;
+ }
}
@Override
@@ -216,5 +230,4 @@ public class SimpleQueueEntryListTest extends QueueEntryListTestBase
next = next.getNextValidEntry();
assertNull("The next entry after the last should be null", next);
}
-
}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java b/java/broker/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java
index 794888f780..38b12f8250 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java
@@ -77,9 +77,23 @@ public class SortedQueueEntryListTest extends QueueEntryListTestBase
}
+ @Override
public QueueEntryList getTestList()
{
- return _sqel;
+ return getTestList(false);
+ }
+
+ @Override
+ public QueueEntryList getTestList(boolean newList)
+ {
+ if(newList)
+ {
+ return new SelfValidatingSortedQueueEntryList(_testQueue, "KEY");
+ }
+ else
+ {
+ return _sqel;
+ }
}
public int getExpectedListLength()
diff --git a/java/broker/src/test/java/org/apache/qpid/server/registry/ApplicationRegistryShutdownTest.java b/java/broker/src/test/java/org/apache/qpid/server/registry/ApplicationRegistryShutdownTest.java
index 6a8a6dc2d0..9ff8f0a531 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/registry/ApplicationRegistryShutdownTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/registry/ApplicationRegistryShutdownTest.java
@@ -80,11 +80,10 @@ public class ApplicationRegistryShutdownTest extends InternalBrokerBaseCase
}
}
- // Not using isEmpty as that is not in Java 5
- assertTrue("No new SASL mechanisms added by initialisation.", additions.size() != 0 );
+ assertFalse("No new SASL mechanisms added by initialisation.", additions.isEmpty());
//Close the registry which will perform the close the AuthenticationManager
- getRegistry().close();
+ stopBroker();
//Validate that the SASL plugFins have been removed.
Provider[] providersAfterClose = Security.getProviders();
diff --git a/java/broker/src/test/java/org/apache/qpid/server/security/auth/rmi/RMIPasswordAuthenticatorTest.java b/java/broker/src/test/java/org/apache/qpid/server/security/auth/rmi/RMIPasswordAuthenticatorTest.java
index ba0a715001..bef03057ec 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/security/auth/rmi/RMIPasswordAuthenticatorTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/security/auth/rmi/RMIPasswordAuthenticatorTest.java
@@ -22,13 +22,19 @@ package org.apache.qpid.server.security.auth.rmi;
import junit.framework.TestCase;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.XMLConfiguration;
+import org.apache.qpid.server.configuration.ServerConfiguration;
import org.apache.qpid.server.configuration.plugins.ConfigurationPlugin;
+import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.security.auth.AuthenticationResult;
import org.apache.qpid.server.security.auth.AuthenticationResult.AuthenticationStatus;
import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
+import org.apache.qpid.server.util.TestApplicationRegistry;
import javax.management.remote.JMXPrincipal;
import javax.security.auth.Subject;
+import javax.security.auth.callback.CallbackHandler;
import javax.security.sasl.SaslException;
import javax.security.sasl.SaslServer;
import java.util.Collections;
@@ -47,7 +53,7 @@ public class RMIPasswordAuthenticatorTest extends TestCase
protected void setUp() throws Exception
{
_rmipa = new RMIPasswordAuthenticator();
-
+
_credentials = new String[] {USERNAME, PASSWORD};
}
@@ -114,8 +120,19 @@ public class RMIPasswordAuthenticatorTest extends TestCase
/**
* Tests case where authentication manager is not set.
*/
- public void testNullAuthenticationManager()
+ public void testNullAuthenticationManager() throws Exception
{
+ ServerConfiguration serverConfig = new ServerConfiguration(new XMLConfiguration());
+ TestApplicationRegistry reg = new TestApplicationRegistry(serverConfig)
+ {
+ @Override
+ protected AuthenticationManager createAuthenticationManager() throws ConfigurationException
+ {
+ return null;
+ }
+ };
+ ApplicationRegistry.initialise(reg);
+
try
{
_rmipa.authenticate(_credentials);
@@ -126,6 +143,10 @@ public class RMIPasswordAuthenticatorTest extends TestCase
assertEquals("Unexpected exception message",
RMIPasswordAuthenticator.UNABLE_TO_LOOKUP, se.getMessage());
}
+ finally
+ {
+ ApplicationRegistry.remove();
+ }
}
/**
@@ -254,6 +275,11 @@ public class RMIPasswordAuthenticatorTest extends TestCase
return new AuthenticationResult(AuthenticationStatus.CONTINUE);
}
}
+
+ public CallbackHandler getHandler(String mechanism)
+ {
+ return null;
+ }
};
}
}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/security/auth/sasl/SaslServerTestCase.java b/java/broker/src/test/java/org/apache/qpid/server/security/auth/sasl/SaslServerTestCase.java
index c3671d6a87..f5247634ac 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/security/auth/sasl/SaslServerTestCase.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/security/auth/sasl/SaslServerTestCase.java
@@ -54,7 +54,7 @@ public abstract class SaslServerTestCase extends TestCase
}
catch (SaslException e)
{
- assertEquals("Authentication failed", e.getCause().getMessage());
+ assertTrue(e.getMessage().contains("Authentication failed"));
exceptionCaught = true;
}
if (!exceptionCaught)
diff --git a/java/broker/src/test/java/org/apache/qpid/server/store/DurableConfigurationStoreTest.java b/java/broker/src/test/java/org/apache/qpid/server/store/DurableConfigurationStoreTest.java
new file mode 100644
index 0000000000..a1cbb2cbc8
--- /dev/null
+++ b/java/broker/src/test/java/org/apache/qpid/server/store/DurableConfigurationStoreTest.java
@@ -0,0 +1,377 @@
+package org.apache.qpid.server.store;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.times;
+
+import java.io.File;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.common.AMQPFilterTypes;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.binding.Binding;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.logging.SystemOutMessageLogger;
+import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.actors.TestLogActor;
+import org.apache.qpid.server.logging.subjects.TestBlankSubject;
+import org.apache.qpid.server.message.EnqueableMessage;
+import org.apache.qpid.server.model.UUIDGenerator;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.queue.MockStoredMessage;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler;
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreRecoveryHandler;
+import org.apache.qpid.server.store.TransactionLogRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.BindingRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.ExchangeRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.QueueRecoveryHandler;
+import org.apache.qpid.server.store.MessageStoreRecoveryHandler.StoredMessageRecoveryHandler;
+import org.apache.qpid.server.store.Transaction.Record;
+import org.apache.qpid.server.store.derby.DerbyMessageStoreFactory;
+import org.apache.qpid.test.utils.QpidTestCase;
+import org.apache.qpid.util.FileUtils;
+
+public class DurableConfigurationStoreTest extends QpidTestCase
+{
+ private static final String EXCHANGE_NAME = "exchangeName";
+ private String _storePath;
+ private String _storeName;
+ private MessageStore _store;
+ private Configuration _configuration;
+
+ private ConfigurationRecoveryHandler _recoveryHandler;
+ private QueueRecoveryHandler _queueRecoveryHandler;
+ private ExchangeRecoveryHandler _exchangeRecoveryHandler;
+ private BindingRecoveryHandler _bindingRecoveryHandler;
+ private ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler _linkRecoveryHandler;
+ private MessageStoreRecoveryHandler _messageStoreRecoveryHandler;
+ private StoredMessageRecoveryHandler _storedMessageRecoveryHandler;
+ private TransactionLogRecoveryHandler _logRecoveryHandler;
+ private TransactionLogRecoveryHandler.QueueEntryRecoveryHandler _queueEntryRecoveryHandler;
+ private TransactionLogRecoveryHandler.DtxRecordRecoveryHandler _dtxRecordRecoveryHandler;
+
+ private Exchange _exchange = mock(Exchange.class);
+ private static final String ROUTING_KEY = "routingKey";
+ private static final String QUEUE_NAME = "queueName";
+ private FieldTable _bindingArgs;
+ private UUID _queueId;
+ private UUID _exchangeId;
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+
+ _queueId = UUIDGenerator.generateUUID();
+ _exchangeId = UUIDGenerator.generateUUID();
+
+ _storeName = getName();
+ _storePath = TMP_FOLDER + "/" + _storeName;
+ FileUtils.delete(new File(_storePath), true);
+ setTestSystemProperty("QPID_WORK", TMP_FOLDER);
+ _configuration = mock(Configuration.class);
+ _recoveryHandler = mock(ConfigurationRecoveryHandler.class);
+ _queueRecoveryHandler = mock(QueueRecoveryHandler.class);
+ _exchangeRecoveryHandler = mock(ExchangeRecoveryHandler.class);
+ _bindingRecoveryHandler = mock(BindingRecoveryHandler.class);
+ _storedMessageRecoveryHandler = mock(StoredMessageRecoveryHandler.class);
+ _logRecoveryHandler = mock(TransactionLogRecoveryHandler.class);
+ _messageStoreRecoveryHandler = mock(MessageStoreRecoveryHandler.class);
+ _queueEntryRecoveryHandler = mock(TransactionLogRecoveryHandler.QueueEntryRecoveryHandler.class);
+ _dtxRecordRecoveryHandler = mock(TransactionLogRecoveryHandler.DtxRecordRecoveryHandler.class);
+
+ when(_messageStoreRecoveryHandler.begin()).thenReturn(_storedMessageRecoveryHandler);
+ when(_recoveryHandler.begin(isA(MessageStore.class))).thenReturn(_queueRecoveryHandler);
+ when(_queueRecoveryHandler.completeQueueRecovery()).thenReturn(_exchangeRecoveryHandler);
+ when(_exchangeRecoveryHandler.completeExchangeRecovery()).thenReturn(_bindingRecoveryHandler);
+ when(_bindingRecoveryHandler.completeBindingRecovery()).thenReturn(_linkRecoveryHandler);
+ when(_logRecoveryHandler.begin(any(MessageStore.class))).thenReturn(_queueEntryRecoveryHandler);
+ when(_queueEntryRecoveryHandler.completeQueueEntryRecovery()).thenReturn(_dtxRecordRecoveryHandler);
+ when(_exchange.getNameShortString()).thenReturn(AMQShortString.valueOf(EXCHANGE_NAME));
+ when(_exchange.getId()).thenReturn(_exchangeId);
+ when(_configuration.getString(eq(MessageStoreConstants.ENVIRONMENT_PATH_PROPERTY), anyString())).thenReturn(
+ _storePath);
+
+ _bindingArgs = new FieldTable();
+ AMQShortString argKey = AMQPFilterTypes.JMS_SELECTOR.getValue();
+ String argValue = "some selector expression";
+ _bindingArgs.put(argKey, argValue);
+
+ reopenStore();
+ }
+
+ public void tearDown() throws Exception
+ {
+ FileUtils.delete(new File(_storePath), true);
+ super.tearDown();
+ }
+
+ public void testCreateExchange() throws Exception
+ {
+ Exchange exchange = createTestExchange();
+ _store.createExchange(exchange);
+
+ reopenStore();
+ verify(_exchangeRecoveryHandler).exchange(_exchangeId, getName(), getName() + "Type", true);
+ }
+
+ public void testRemoveExchange() throws Exception
+ {
+ Exchange exchange = createTestExchange();
+ _store.createExchange(exchange);
+
+ _store.removeExchange(exchange);
+
+ reopenStore();
+ verify(_exchangeRecoveryHandler, never()).exchange(any(UUID.class), anyString(), anyString(), anyBoolean());
+ }
+
+ public void testBindQueue() throws Exception
+ {
+ AMQQueue queue = createTestQueue(QUEUE_NAME, "queueOwner", false);
+ Binding binding = new Binding(UUIDGenerator.generateUUID(), ROUTING_KEY, queue, _exchange,
+ FieldTable.convertToMap(_bindingArgs));
+ _store.bindQueue(binding);
+
+ reopenStore();
+
+ ByteBuffer argsAsBytes = ByteBuffer.wrap(_bindingArgs.getDataAsBytes());
+
+ verify(_bindingRecoveryHandler).binding(binding.getId(), _exchange.getId(), queue.getId(), ROUTING_KEY, argsAsBytes);
+ }
+
+ public void testUnbindQueue() throws Exception
+ {
+ AMQQueue queue = createTestQueue(QUEUE_NAME, "queueOwner", false);
+ Binding binding = new Binding(UUIDGenerator.generateUUID(), ROUTING_KEY, queue, _exchange,
+ FieldTable.convertToMap(_bindingArgs));
+ _store.bindQueue(binding);
+
+ _store.unbindQueue(binding);
+ reopenStore();
+
+ verify(_bindingRecoveryHandler, never()).binding(any(UUID.class), any(UUID.class), any(UUID.class), anyString(),
+ isA(ByteBuffer.class));
+ }
+
+ public void testCreateQueueAMQQueue() throws Exception
+ {
+ AMQQueue queue = createTestQueue(getName(), getName() + "Owner", true);
+ _store.createQueue(queue);
+
+ reopenStore();
+ verify(_queueRecoveryHandler).queue(_queueId, getName(), getName() + "Owner", true, null);
+ }
+
+ public void testCreateQueueAMQQueueFieldTable() throws Exception
+ {
+ AMQQueue queue = createTestQueue(getName(), getName() + "Owner", true);
+ Map<String, Object> attributes = new HashMap<String, Object>();
+ attributes.put("x-qpid-dlq-enabled", Boolean.TRUE);
+ attributes.put("x-qpid-maximum-delivery-count", new Integer(10));
+
+ FieldTable arguments = FieldTable.convertToFieldTable(attributes);
+ _store.createQueue(queue, arguments);
+
+ reopenStore();
+ verify(_queueRecoveryHandler).queue(_queueId, getName(), getName() + "Owner", true, arguments);
+ }
+
+ public void testUpdateQueue() throws Exception
+ {
+ // create queue
+ AMQQueue queue = createTestQueue(getName(), getName() + "Owner", true);
+ Map<String, Object> attributes = new HashMap<String, Object>();
+ attributes.put("x-qpid-dlq-enabled", Boolean.TRUE);
+ attributes.put("x-qpid-maximum-delivery-count", new Integer(10));
+ FieldTable arguments = FieldTable.convertToFieldTable(attributes);
+ _store.createQueue(queue, arguments);
+
+ // update the queue to have exclusive=false
+ queue = createTestQueue(getName(), getName() + "Owner", false);
+ _store.updateQueue(queue);
+
+ reopenStore();
+ verify(_queueRecoveryHandler).queue(_queueId, getName(), getName() + "Owner", false, arguments);
+ }
+
+ public void testRemoveQueue() throws Exception
+ {
+ // create queue
+ AMQQueue queue = createTestQueue(getName(), getName() + "Owner", true);
+ Map<String, Object> attributes = new HashMap<String, Object>();
+ attributes.put("x-qpid-dlq-enabled", Boolean.TRUE);
+ attributes.put("x-qpid-maximum-delivery-count", new Integer(10));
+ FieldTable arguments = FieldTable.convertToFieldTable(attributes);
+ _store.createQueue(queue, arguments);
+
+ // remove queue
+ _store.removeQueue(queue);
+ reopenStore();
+ verify(_queueRecoveryHandler, never()).queue(any(UUID.class), anyString(), anyString(), anyBoolean(),
+ any(FieldTable.class));
+ }
+
+ private AMQQueue createTestQueue(String queueName, String queueOwner, boolean exclusive) throws AMQStoreException
+ {
+ AMQQueue queue = mock(AMQQueue.class);
+ when(queue.getName()).thenReturn(queueName);
+ when(queue.getNameShortString()).thenReturn(AMQShortString.valueOf(queueName));
+ when(queue.getOwner()).thenReturn(AMQShortString.valueOf(queueOwner));
+ when(queue.isExclusive()).thenReturn(exclusive);
+ when(queue.getId()).thenReturn(_queueId);
+ return queue;
+ }
+
+ private Exchange createTestExchange()
+ {
+ Exchange exchange = mock(Exchange.class);
+ when(exchange.getNameShortString()).thenReturn(AMQShortString.valueOf(getName()));
+ when(exchange.getName()).thenReturn(getName());
+ when(exchange.getTypeShortString()).thenReturn(AMQShortString.valueOf(getName() + "Type"));
+ when(exchange.isAutoDelete()).thenReturn(true);
+ when(exchange.getId()).thenReturn(_exchangeId);
+ return exchange;
+ }
+
+ private void reopenStore() throws Exception
+ {
+ if (_store != null)
+ {
+ _store.close();
+ }
+ _store = createStore();
+
+ _store.configureConfigStore(_storeName, _recoveryHandler, _configuration);
+ _store.configureMessageStore(_storeName, _messageStoreRecoveryHandler, _logRecoveryHandler, _configuration);
+ _store.activate();
+ }
+
+ protected MessageStore createStore() throws Exception
+ {
+ String storeFactoryClass = System.getProperty(MS_FACTORY_CLASS_NAME_KEY);
+ if (storeFactoryClass == null)
+ {
+ storeFactoryClass = DerbyMessageStoreFactory.class.getName();
+ }
+ CurrentActor.set(new TestLogActor(new SystemOutMessageLogger()));
+ MessageStoreFactory factory = (MessageStoreFactory) Class.forName(storeFactoryClass).newInstance();
+ return factory.createMessageStore();
+ }
+
+ public void testRecordXid() throws Exception
+ {
+ Record enqueueRecord = getTestRecord(1);
+ Record dequeueRecord = getTestRecord(2);
+ Record[] enqueues = { enqueueRecord };
+ Record[] dequeues = { dequeueRecord };
+ byte[] globalId = new byte[] { 1 };
+ byte[] branchId = new byte[] { 2 };
+
+ Transaction transaction = _store.newTransaction();
+ transaction.recordXid(1l, globalId, branchId, enqueues, dequeues);
+ transaction.commitTran();
+ reopenStore();
+ verify(_dtxRecordRecoveryHandler).dtxRecord(1l, globalId, branchId, enqueues, dequeues);
+
+ transaction = _store.newTransaction();
+ transaction.removeXid(1l, globalId, branchId);
+ transaction.commitTran();
+
+ reopenStore();
+ verify(_dtxRecordRecoveryHandler, times(1)).dtxRecord(1l, globalId, branchId, enqueues, dequeues);
+ }
+
+ private Record getTestRecord(long messageNumber)
+ {
+ UUID queueId1 = UUIDGenerator.generateUUID();
+ TransactionLogResource queue1 = mock(TransactionLogResource.class);
+ when(queue1.getId()).thenReturn(queueId1);
+ EnqueableMessage message1 = mock(EnqueableMessage.class);
+ when(message1.isPersistent()).thenReturn(true);
+ when(message1.getMessageNumber()).thenReturn(messageNumber);
+ when(message1.getStoredMessage()).thenReturn(new MockStoredMessage(messageNumber));
+ Record enqueueRecord = new TestRecord(queue1, message1);
+ return enqueueRecord;
+ }
+
+ private static class TestRecord implements Record
+ {
+ private TransactionLogResource _queue;
+ private EnqueableMessage _message;
+
+ public TestRecord(TransactionLogResource queue, EnqueableMessage message)
+ {
+ super();
+ _queue = queue;
+ _message = message;
+ }
+
+ @Override
+ public TransactionLogResource getQueue()
+ {
+ return _queue;
+ }
+
+ @Override
+ public EnqueableMessage getMessage()
+ {
+ return _message;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((_message == null) ? 0 : new Long(_message.getMessageNumber()).hashCode());
+ result = prime * result + ((_queue == null) ? 0 : _queue.getId().hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null)
+ {
+ return false;
+ }
+ if (!(obj instanceof Record))
+ {
+ return false;
+ }
+ Record other = (Record) obj;
+ if (_message == null && other.getMessage() != null)
+ {
+ return false;
+ }
+ if (_queue == null && other.getQueue() != null)
+ {
+ return false;
+ }
+ if (_message.getMessageNumber() != other.getMessage().getMessageNumber())
+ {
+ return false;
+ }
+ return _queue.getId().equals(other.getQueue().getId());
+ }
+
+ }
+}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/store/EventManagerTest.java b/java/broker/src/test/java/org/apache/qpid/server/store/EventManagerTest.java
new file mode 100644
index 0000000000..2be79c5839
--- /dev/null
+++ b/java/broker/src/test/java/org/apache/qpid/server/store/EventManagerTest.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.apache.qpid.server.store.Event.AFTER_ACTIVATE;
+import static org.apache.qpid.server.store.Event.BEFORE_ACTIVATE;
+import junit.framework.TestCase;
+
+public class EventManagerTest extends TestCase
+{
+ private EventManager _eventManager = new EventManager();
+ private EventListener _mockListener = mock(EventListener.class);
+
+ public void testEventListenerFires()
+ {
+ _eventManager.addEventListener(_mockListener, BEFORE_ACTIVATE);
+ _eventManager.notifyEvent(BEFORE_ACTIVATE);
+ verify(_mockListener).event(BEFORE_ACTIVATE);
+ }
+
+ public void testEventListenerDoesntFire()
+ {
+ _eventManager.addEventListener(_mockListener, BEFORE_ACTIVATE);
+ _eventManager.notifyEvent(AFTER_ACTIVATE);
+ verifyZeroInteractions(_mockListener);
+ }
+
+ public void testEventListenerFiresMulitpleTimes()
+ {
+ _eventManager.addEventListener(_mockListener, BEFORE_ACTIVATE);
+ _eventManager.addEventListener(_mockListener, AFTER_ACTIVATE);
+
+ _eventManager.notifyEvent(BEFORE_ACTIVATE);
+ verify(_mockListener).event(BEFORE_ACTIVATE);
+
+ _eventManager.notifyEvent(AFTER_ACTIVATE);
+ verify(_mockListener).event(AFTER_ACTIVATE);
+ }
+
+ public void testMultipleListenersFireForSameEvent()
+ {
+ final EventListener mockListener1 = mock(EventListener.class);
+ final EventListener mockListener2 = mock(EventListener.class);
+
+ _eventManager.addEventListener(mockListener1, BEFORE_ACTIVATE);
+ _eventManager.addEventListener(mockListener2, BEFORE_ACTIVATE);
+ _eventManager.notifyEvent(BEFORE_ACTIVATE);
+
+ verify(mockListener1).event(BEFORE_ACTIVATE);
+ verify(mockListener2).event(BEFORE_ACTIVATE);
+ }
+}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTest.java b/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTest.java
index 5fc074d877..3fb0776083 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTest.java
@@ -39,6 +39,7 @@ import org.apache.qpid.server.exchange.ExchangeType;
import org.apache.qpid.server.exchange.TopicExchange;
import org.apache.qpid.server.message.AMQMessage;
import org.apache.qpid.server.message.MessageMetaData;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQPriorityQueue;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
@@ -58,6 +59,7 @@ import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
/**
* This tests the MessageStores by using the available interfaces.
@@ -101,7 +103,7 @@ public class MessageStoreTest extends InternalBrokerBaseCase
String storePath = System.getProperty("QPID_WORK") + "/" + getName();
_config = new PropertiesConfiguration();
- _config.addProperty("store.class", getTestProfileMessageStoreClassName());
+ _config.addProperty("store.factoryclass", getTestProfileMessageStoreFactoryClassName());
_config.addProperty("store.environment-path", storePath);
cleanup(new File(storePath));
@@ -298,7 +300,7 @@ public class MessageStoreTest extends InternalBrokerBaseCase
1, queueRegistry.getQueues().size());
//test that removing the queue means it is not recovered next time
- getVirtualHost().getDurableConfigurationStore().removeQueue(queueRegistry.getQueue(durableQueueName));
+ getVirtualHost().getMessageStore().removeQueue(queueRegistry.getQueue(durableQueueName));
reloadVirtualHost();
@@ -351,7 +353,7 @@ public class MessageStoreTest extends InternalBrokerBaseCase
origExchangeCount + 1, exchangeRegistry.getExchangeNames().size());
//test that removing the exchange means it is not recovered next time
- getVirtualHost().getDurableConfigurationStore().removeExchange(exchangeRegistry.getExchange(directExchangeName));
+ getVirtualHost().getMessageStore().removeExchange(exchangeRegistry.getExchange(directExchangeName));
reloadVirtualHost();
@@ -600,7 +602,7 @@ public class MessageStoreTest extends InternalBrokerBaseCase
currentMessage.setExpiration();
- MessageMetaData mmd = currentMessage.headersReceived();
+ MessageMetaData mmd = currentMessage.headersReceived(System.currentTimeMillis());
currentMessage.setStoredMessage(getVirtualHost().getMessageStore().addMessage(mmd));
currentMessage.getStoredMessage().flushToStore();
currentMessage.route();
@@ -707,7 +709,7 @@ public class MessageStoreTest extends InternalBrokerBaseCase
if (queue.isDurable() && !queue.isAutoDelete())
{
- getVirtualHost().getDurableConfigurationStore().createQueue(queue, queueArguments);
+ getVirtualHost().getMessageStore().createQueue(queue, queueArguments);
}
}
catch (AMQException e)
@@ -739,7 +741,7 @@ public class MessageStoreTest extends InternalBrokerBaseCase
try
{
- exchange = type.newInstance(getVirtualHost(), name, durable, 0, false);
+ exchange = type.newInstance(UUIDGenerator.generateUUID(), getVirtualHost(), name, durable, 0, false);
}
catch (AMQException e)
{
@@ -751,7 +753,7 @@ public class MessageStoreTest extends InternalBrokerBaseCase
getVirtualHost().getExchangeRegistry().registerExchange(exchange);
if (durable)
{
- getVirtualHost().getDurableConfigurationStore().createExchange(exchange);
+ getVirtualHost().getMessageStore().createExchange(exchange);
}
}
catch (AMQException e)
diff --git a/java/broker/src/test/java/org/apache/qpid/server/store/OperationalLoggingListenerTest.java b/java/broker/src/test/java/org/apache/qpid/server/store/OperationalLoggingListenerTest.java
new file mode 100644
index 0000000000..42746f9119
--- /dev/null
+++ b/java/broker/src/test/java/org/apache/qpid/server/store/OperationalLoggingListenerTest.java
@@ -0,0 +1,181 @@
+package org.apache.qpid.server.store;
+
+import java.util.ArrayList;
+import java.util.List;
+import junit.framework.TestCase;
+import org.apache.qpid.server.logging.LogActor;
+import org.apache.qpid.server.logging.LogMessage;
+import org.apache.qpid.server.logging.LogSubject;
+import org.apache.qpid.server.logging.RootMessageLogger;
+import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
+import org.apache.qpid.server.logging.messages.MessageStoreMessages;
+import org.apache.qpid.server.logging.messages.TransactionLogMessages;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+public class OperationalLoggingListenerTest extends TestCase
+{
+
+
+ public static final String STORE_LOCATION = "The moon!";
+
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ }
+
+ public void testOperationalLoggingWithStoreLocation() throws Exception
+ {
+ TestMessageStore messageStore = new TestMessageStore();
+ LogSubject logSubject = LOG_SUBJECT;
+
+ OperationalLoggingListener.listen(messageStore, logSubject);
+
+ performTests(messageStore, true);
+
+ }
+
+ public void testOperationalLogging() throws Exception
+ {
+ TestMessageStore messageStore = new TestMessageStore();
+ LogSubject logSubject = LOG_SUBJECT;
+
+ OperationalLoggingListener.listen(messageStore, logSubject);
+
+ performTests(messageStore, false);
+ }
+
+ private void performTests(TestMessageStore messageStore, boolean setStoreLocation)
+ {
+ final List<LogMessage> messages = new ArrayList<LogMessage>();
+
+ CurrentActor.set(new TestActor(messages));
+
+ if(setStoreLocation)
+ {
+ messageStore.setStoreLocation(STORE_LOCATION);
+ }
+
+
+ messageStore.attainState(State.CONFIGURING);
+ assertEquals("Unexpected number of operational log messages on configuring", 1, messages.size());
+ assertEquals(messages.remove(0).toString(), ConfigStoreMessages.CREATED().toString());
+
+ messageStore.attainState(State.CONFIGURED);
+ assertEquals("Unexpected number of operational log messages on CONFIGURED", setStoreLocation ? 3 : 2, messages.size());
+ assertEquals(messages.remove(0).toString(), MessageStoreMessages.CREATED().toString());
+ assertEquals(messages.remove(0).toString(), TransactionLogMessages.CREATED().toString());
+ if(setStoreLocation)
+ {
+ assertEquals(messages.remove(0).toString(), MessageStoreMessages.STORE_LOCATION(STORE_LOCATION).toString());
+ }
+
+ messageStore.attainState(State.RECOVERING);
+ assertEquals("Unexpected number of operational log messages on RECOVERING", 1, messages.size());
+ assertEquals(messages.remove(0).toString(), MessageStoreMessages.RECOVERY_START().toString());
+
+
+ messageStore.attainState(State.ACTIVE);
+ assertEquals("Unexpected number of operational log messages on ACTIVE", 1, messages.size());
+ assertEquals(messages.remove(0).toString(), MessageStoreMessages.RECOVERY_COMPLETE().toString());
+
+ messageStore.attainState(State.CLOSING);
+ assertEquals("Unexpected number of operational log messages on CLOSING", 0, messages.size());
+
+ messageStore.attainState(State.CLOSED);
+ assertEquals("Unexpected number of operational log messages on CLOSED", 1, messages.size());
+ assertEquals(messages.remove(0).toString(), MessageStoreMessages.CLOSED().toString());
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ super.tearDown();
+ CurrentActor.remove();
+ }
+
+
+ private static final LogSubject LOG_SUBJECT = new LogSubject()
+ {
+ public String toLogString()
+ {
+ return "";
+ }
+ };
+
+ private static final class TestMessageStore extends NullMessageStore
+ {
+
+ private final EventManager _eventManager = new EventManager();
+ private final StateManager _stateManager = new StateManager(_eventManager);
+ private String _storeLocation;
+
+ public void attainState(State state)
+ {
+ _stateManager.attainState(state);
+ }
+
+ @Override
+ public String getStoreLocation()
+ {
+ return _storeLocation;
+ }
+
+ public void setStoreLocation(String storeLocation)
+ {
+ _storeLocation = storeLocation;
+ }
+
+ @Override
+ public void addEventListener(EventListener eventListener, Event... events)
+ {
+ _eventManager.addEventListener(eventListener, events);
+ }
+ }
+
+ private static class TestActor implements LogActor
+ {
+ private final List<LogMessage> _messages;
+
+ public TestActor(List<LogMessage> messages)
+ {
+ _messages = messages;
+ }
+
+ public void message(LogSubject subject, LogMessage message)
+ {
+ _messages.add(message);
+ }
+
+ public void message(LogMessage message)
+ {
+ _messages.add(message);
+ }
+
+ public RootMessageLogger getRootMessageLogger()
+ {
+ return null;
+ }
+
+ public String getLogMessage()
+ {
+ return null;
+ }
+ }
+}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/store/ReferenceCountingTest.java b/java/broker/src/test/java/org/apache/qpid/server/store/ReferenceCountingTest.java
index 2ffa157ca8..4aa023a25c 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/store/ReferenceCountingTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/store/ReferenceCountingTest.java
@@ -34,12 +34,12 @@ import org.apache.qpid.test.utils.QpidTestCase;
*/
public class ReferenceCountingTest extends QpidTestCase
{
- private TestMemoryMessageStore _store;
+ private TestableMemoryMessageStore _store;
protected void setUp() throws Exception
{
- _store = new TestMemoryMessageStore();
+ _store = new TestableMemoryMessageStore();
}
/**
diff --git a/java/broker/src/test/java/org/apache/qpid/server/store/SkeletonMessageStore.java b/java/broker/src/test/java/org/apache/qpid/server/store/SkeletonMessageStore.java
deleted file mode 100644
index 88b9acffe0..0000000000
--- a/java/broker/src/test/java/org/apache/qpid/server/store/SkeletonMessageStore.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store;
-
-import org.apache.commons.configuration.Configuration;
-
-import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.exchange.Exchange;
-import org.apache.qpid.server.logging.LogSubject;
-import org.apache.qpid.server.message.EnqueableMessage;
-import org.apache.qpid.server.queue.AMQQueue;
-
-/**
- * A message store that does nothing. Designed to be used in tests that do not want to use any message store
- * functionality.
- */
-public class SkeletonMessageStore implements MessageStore
-{
- public void configureConfigStore(String name,
- ConfigurationRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception
- {
- }
-
- public void configureMessageStore(String name,
- MessageStoreRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception
- {
- }
-
- public void close() throws Exception
- {
- }
-
- public <M extends StorableMessageMetaData> StoredMessage<M> addMessage(M metaData)
- {
- return null;
- }
-
-
- public void createExchange(Exchange exchange) throws AMQStoreException
- {
-
- }
-
- public void removeExchange(Exchange exchange) throws AMQStoreException
- {
-
- }
-
- public void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
- {
-
- }
-
- public void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
- {
-
- }
-
- public void createQueue(AMQQueue queue) throws AMQStoreException
- {
- }
-
- public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
- {
- }
-
- public boolean isPersistent()
- {
- return false;
- }
-
- public void removeQueue(final AMQQueue queue) throws AMQStoreException
- {
-
- }
-
- public void configureTransactionLog(String name,
- TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
-
- }
-
- public Transaction newTransaction()
- {
- return new Transaction()
- {
-
- public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
- {
-
- }
-
- public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
- {
-
- }
-
- public void commitTran() throws AMQStoreException
- {
-
- }
-
- public StoreFuture commitTranAsync() throws AMQStoreException
- {
- return new StoreFuture()
- {
- public boolean isComplete()
- {
- return true;
- }
-
- public void waitForCompletion()
- {
-
- }
- };
- }
-
- public void abortTran() throws AMQStoreException
- {
-
- }
- };
- }
-
- public void updateQueue(AMQQueue queue) throws AMQStoreException
- {
-
- }
-
-}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/store/StateManagerTest.java b/java/broker/src/test/java/org/apache/qpid/server/store/StateManagerTest.java
new file mode 100644
index 0000000000..97c88ca1d3
--- /dev/null
+++ b/java/broker/src/test/java/org/apache/qpid/server/store/StateManagerTest.java
@@ -0,0 +1,195 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+
+import java.util.EnumSet;
+import junit.framework.TestCase;
+
+public class StateManagerTest extends TestCase implements EventListener
+{
+
+ private StateManager _manager;
+ private Event _event;
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _manager = new StateManager(this);
+ }
+
+ public void testInitialState()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+ }
+
+ public void testStateTransitionAllowed()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+
+ _manager.stateTransition(State.INITIAL, State.CONFIGURING);
+ assertEquals(State.CONFIGURING, _manager.getState());
+ }
+
+ public void testStateTransitionDisallowed()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+
+ try
+ {
+ _manager.stateTransition(State.ACTIVE, State.CLOSING);
+ fail("Exception not thrown");
+ }
+ catch (IllegalStateException e)
+ {
+ // PASS
+ }
+ assertEquals(State.INITIAL, _manager.getState());
+ }
+
+ public void testIsInState()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+ assertFalse(_manager.isInState(State.ACTIVE));
+ assertTrue(_manager.isInState(State.INITIAL));
+ }
+
+ public void testIsNotInState()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+ assertTrue(_manager.isNotInState(State.ACTIVE));
+ assertFalse(_manager.isNotInState(State.INITIAL));
+ }
+
+ public void testCheckInState()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+
+ try
+ {
+ _manager.checkInState(State.ACTIVE);
+ fail("Exception not thrown");
+ }
+ catch (IllegalStateException e)
+ {
+ // PASS
+ }
+ assertEquals(State.INITIAL, _manager.getState());
+ }
+
+ public void testValidStateTransitions()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+ performValidTransition(StateManager.CONFIGURE);
+ performValidTransition(StateManager.CONFIGURE_COMPLETE);
+ performValidTransition(StateManager.RECOVER);
+ performValidTransition(StateManager.ACTIVATE);
+ performValidTransition(StateManager.QUIESCE);
+ performValidTransition(StateManager.QUIESCE_COMPLETE);
+ performValidTransition(StateManager.RESTART);
+ performValidTransition(StateManager.ACTIVATE);
+ performValidTransition(StateManager.CLOSE_ACTIVE);
+ performValidTransition(StateManager.CLOSE_COMPLETE);
+
+ _manager = new StateManager(this);
+ performValidTransition(StateManager.CONFIGURE);
+ performValidTransition(StateManager.CONFIGURE_COMPLETE);
+ performValidTransition(StateManager.RECOVER);
+ performValidTransition(StateManager.ACTIVATE);
+ performValidTransition(StateManager.QUIESCE);
+ performValidTransition(StateManager.QUIESCE_COMPLETE);
+ performValidTransition(StateManager.CLOSE_QUIESCED);
+ performValidTransition(StateManager.CLOSE_COMPLETE);
+ }
+
+ private void performValidTransition(StateManager.Transition transition)
+ {
+ _manager.attainState(transition.getEndState());
+ assertEquals("Unexpected end state", transition.getEndState(), _manager.getState());
+ assertEquals("Unexpected event", transition.getEvent(), _event);
+ _event = null;
+ }
+
+ public void testInvalidStateTransitions()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+
+
+ performInvalidTransitions(StateManager.CONFIGURE, State.CONFIGURED);
+ performInvalidTransitions(StateManager.CONFIGURE_COMPLETE, State.RECOVERING);
+ performInvalidTransitions(StateManager.RECOVER, State.ACTIVE);
+ performInvalidTransitions(StateManager.ACTIVATE, State.QUIESCING, State.CLOSING);
+ performInvalidTransitions(StateManager.QUIESCE, State.QUIESCED);
+ performInvalidTransitions(StateManager.QUIESCE_COMPLETE, State.RECOVERING, State.CLOSING);
+ performInvalidTransitions(StateManager.CLOSE_QUIESCED, State.CLOSED);
+ performInvalidTransitions(StateManager.CLOSE_COMPLETE);
+
+
+
+
+ }
+
+ private void performInvalidTransitions(StateManager.Transition preTransition, State... validTransitions)
+ {
+ if(preTransition != null)
+ {
+ performValidTransition(preTransition);
+ }
+
+ EnumSet<State> nextStates = EnumSet.allOf(State.class);
+
+ if(validTransitions != null)
+ {
+ for(State state: validTransitions)
+ {
+ nextStates.remove(state);
+ }
+ }
+
+ for(State nextState : nextStates)
+ {
+ performInvalidStateTransition(nextState);
+ }
+
+
+ }
+
+ private void performInvalidStateTransition(State state)
+ {
+ try
+ {
+ _event = null;
+ State startState = _manager.getState();
+ _manager.attainState(state);
+ fail("Invalid state transition performed: " + startState + " to " + state);
+ }
+ catch(IllegalStateException e)
+ {
+ // pass
+ }
+ assertNull("No event should have be fired", _event);
+ }
+
+ public void event(Event event)
+ {
+ _event = event;
+ }
+}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/store/TestMemoryMessageStore.java b/java/broker/src/test/java/org/apache/qpid/server/store/TestMemoryMessageStore.java
deleted file mode 100644
index 8a261b3b86..0000000000
--- a/java/broker/src/test/java/org/apache/qpid/server/store/TestMemoryMessageStore.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Adds some extra methods to the memory message store for testing purposes.
- */
-public class TestMemoryMessageStore extends MemoryMessageStore
-{
- private AtomicInteger _messageCount = new AtomicInteger(0);
-
-
- public TestMemoryMessageStore()
- {
- }
-
- @Override
- public StoredMessage addMessage(StorableMessageMetaData metaData)
- {
- return new TestableStoredMessage(super.addMessage(metaData));
- }
-
- public int getMessageCount()
- {
- return _messageCount.get();
- }
-
- private class TestableStoredMessage implements StoredMessage
- {
- private final StoredMessage _storedMessage;
-
- public TestableStoredMessage(StoredMessage storedMessage)
- {
- _messageCount.incrementAndGet();
- _storedMessage = storedMessage;
- }
-
- public StorableMessageMetaData getMetaData()
- {
- return _storedMessage.getMetaData();
- }
-
- public long getMessageNumber()
- {
- return _storedMessage.getMessageNumber();
- }
-
- public void addContent(int offsetInMessage, ByteBuffer src)
- {
- _storedMessage.addContent(offsetInMessage, src);
- }
-
- public int getContent(int offsetInMessage, ByteBuffer dst)
- {
- return _storedMessage.getContent(offsetInMessage, dst);
- }
-
-
- public ByteBuffer getContent(int offsetInMessage, int size)
- {
- return _storedMessage.getContent(offsetInMessage, size);
- }
-
- public StoreFuture flushToStore()
- {
- return _storedMessage.flushToStore();
- }
-
- public void remove()
- {
- _storedMessage.remove();
- _messageCount.decrementAndGet();
- }
-
- }
-
-}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStore.java b/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStore.java
index e409734a17..210408f490 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStore.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStore.java
@@ -26,6 +26,7 @@ import org.apache.qpid.server.queue.AMQQueue;
import java.nio.ByteBuffer;
import java.util.HashMap;
+import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -33,26 +34,8 @@ import java.util.concurrent.atomic.AtomicInteger;
*/
public class TestableMemoryMessageStore extends MemoryMessageStore
{
-
- private MemoryMessageStore _mms = null;
- private HashMap<Long, AMQQueue> _messages = new HashMap<Long, AMQQueue>();
- private AtomicInteger _messageCount = new AtomicInteger(0);
-
- public TestableMemoryMessageStore(MemoryMessageStore mms)
- {
- _mms = mms;
- }
-
- public TestableMemoryMessageStore()
- {
-
- }
-
- @Override
- public void close() throws Exception
- {
- // Not required to do anything
- }
+ private final Map<Long, AMQQueue> _messages = new HashMap<Long, AMQQueue>();
+ private final AtomicInteger _messageCount = new AtomicInteger(0);
@Override
public StoredMessage addMessage(StorableMessageMetaData metaData)
@@ -65,41 +48,47 @@ public class TestableMemoryMessageStore extends MemoryMessageStore
return _messageCount.get();
}
+ public Map<Long, AMQQueue> getMessages()
+ {
+ return _messages;
+ }
+
private class TestableTransaction implements Transaction
{
+ @Override
public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
{
getMessages().put(message.getMessageNumber(), (AMQQueue)queue);
}
+ @Override
public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
{
getMessages().remove(message.getMessageNumber());
}
+ @Override
public void commitTran() throws AMQStoreException
{
}
+ @Override
public StoreFuture commitTranAsync() throws AMQStoreException
{
- return new StoreFuture()
- {
- public boolean isComplete()
- {
- return true;
- }
-
- public void waitForCompletion()
- {
-
- }
- };
+ return StoreFuture.IMMEDIATE_FUTURE;
}
public void abortTran() throws AMQStoreException
{
}
+
+ public void removeXid(long format, byte[] globalId, byte[] branchId)
+ {
+ }
+
+ public void recordXid(long format, byte[] globalId, byte[] branchId, Record[] enqueues, Record[] dequeues)
+ {
+ }
}
@@ -109,10 +98,6 @@ public class TestableMemoryMessageStore extends MemoryMessageStore
return new TestableTransaction();
}
- public HashMap<Long, AMQQueue> getMessages()
- {
- return _messages;
- }
private class TestableStoredMessage implements StoredMessage
{
diff --git a/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStoreFactory.java b/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStoreFactory.java
new file mode 100644
index 0000000000..44070f22ad
--- /dev/null
+++ b/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStoreFactory.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public class TestableMemoryMessageStoreFactory implements MessageStoreFactory
+{
+
+ @Override
+ public MessageStore createMessageStore()
+ {
+ return new TestableMemoryMessageStore();
+ }
+
+ @Override
+ public String getStoreClassName()
+ {
+ return TestableMemoryMessageStore.class.getSimpleName();
+ }
+
+}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/subscription/MockSubscription.java b/java/broker/src/test/java/org/apache/qpid/server/subscription/MockSubscription.java
index 1d6ccfbbc2..5ba9c0c015 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/subscription/MockSubscription.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/subscription/MockSubscription.java
@@ -277,6 +277,10 @@ public class MockSubscription implements Subscription
return false;
}
+ public void queueEmpty() throws AMQException
+ {
+ }
+
public void setActive(final boolean isActive)
{
_isActive = isActive;
diff --git a/java/broker/src/test/java/org/apache/qpid/server/transport/ServerSessionTest.java b/java/broker/src/test/java/org/apache/qpid/server/transport/ServerSessionTest.java
new file mode 100644
index 0000000000..d775b0f2f8
--- /dev/null
+++ b/java/broker/src/test/java/org/apache/qpid/server/transport/ServerSessionTest.java
@@ -0,0 +1,67 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.transport;
+
+import java.util.UUID;
+
+import org.apache.qpid.server.configuration.MockConnectionConfig;
+import org.apache.qpid.server.registry.ApplicationRegistry;
+import org.apache.qpid.server.util.InternalBrokerBaseCase;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+import org.apache.qpid.transport.Binary;
+
+public class ServerSessionTest extends InternalBrokerBaseCase
+{
+
+ private VirtualHost _virtualHost;
+
+ @Override
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _virtualHost = ApplicationRegistry.getInstance().getVirtualHostRegistry().getVirtualHosts().iterator().next();
+ }
+
+ public void testCompareTo() throws Exception
+ {
+ ServerConnection connection = new ServerConnection(1);
+ connection.setConnectionConfig(createConnectionConfig());
+ ServerSession session1 = new ServerSession(connection, new ServerSessionDelegate(),
+ new Binary(getName().getBytes()), 0 , connection.getConfig());
+
+ // create a session with the same name but on a different connection
+ ServerConnection connection2 = new ServerConnection(2);
+ connection2.setConnectionConfig(createConnectionConfig());
+ ServerSession session2 = new ServerSession(connection2, new ServerSessionDelegate(),
+ new Binary(getName().getBytes()), 0 , connection2.getConfig());
+
+ assertFalse("Unexpected compare result", session1.compareTo(session2) == 0);
+ assertEquals("Unexpected compare result", 0, session1.compareTo(session1));
+ }
+
+ private MockConnectionConfig createConnectionConfig()
+ {
+ return new MockConnectionConfig(UUID.randomUUID(), null, null,
+ false, 1, _virtualHost, "address", Boolean.TRUE, Boolean.TRUE, Boolean.TRUE,
+ "authid", "remoteProcessName", new Integer(1967), new Integer(1970), _virtualHost.getConfigStore(), Boolean.FALSE);
+ }
+
+}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/txn/MockStoreTransaction.java b/java/broker/src/test/java/org/apache/qpid/server/txn/MockStoreTransaction.java
index fa0bb5be8b..af49238998 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/txn/MockStoreTransaction.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/txn/MockStoreTransaction.java
@@ -20,19 +20,13 @@
*/
package org.apache.qpid.server.txn;
-import org.apache.commons.configuration.Configuration;
import org.apache.commons.lang.NotImplementedException;
-
import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.server.logging.LogSubject;
import org.apache.qpid.server.message.EnqueableMessage;
import org.apache.qpid.server.store.MessageStore;
-import org.apache.qpid.server.store.MessageStore.StoreFuture;
-import org.apache.qpid.server.store.MessageStore.Transaction;
-import org.apache.qpid.server.store.MessageStoreRecoveryHandler;
-import org.apache.qpid.server.store.StorableMessageMetaData;
-import org.apache.qpid.server.store.StoredMessage;
-import org.apache.qpid.server.store.TransactionLogRecoveryHandler;
+import org.apache.qpid.server.store.NullMessageStore;
+import org.apache.qpid.server.store.StoreFuture;
+import org.apache.qpid.server.store.Transaction;
import org.apache.qpid.server.store.TransactionLogResource;
/**
@@ -112,44 +106,24 @@ class MockStoreTransaction implements Transaction
_state = TransactionState.ABORTED;
}
- public static MessageStore createTestTransactionLog(final MockStoreTransaction storeTransaction)
+ public void removeXid(long format, byte[] globalId, byte[] branchId)
{
- return new MessageStore()
- {
- public void configureMessageStore(final String name,
- final MessageStoreRecoveryHandler recoveryHandler,
- final Configuration config,
- final LogSubject logSubject) throws Exception
- {
- //TODO.
- }
-
- public void close() throws Exception
- {
- //TODO.
- }
-
- public <T extends StorableMessageMetaData> StoredMessage<T> addMessage(final T metaData)
- {
- return null; //TODO.
- }
-
- public boolean isPersistent()
- {
- return false; //TODO.
- }
+ }
- public void configureTransactionLog(String name, TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration, LogSubject logSubject) throws Exception
- {
- }
+ public void recordXid(long format, byte[] globalId, byte[] branchId, Record[] enqueues, Record[] dequeues)
+ {
+ }
+ public static MessageStore createTestTransactionLog(final MockStoreTransaction storeTransaction)
+ {
+ return new NullMessageStore()
+ {
+ @Override
public Transaction newTransaction()
{
storeTransaction.setState(TransactionState.STARTED);
return storeTransaction;
}
-
- };
+ };
}
} \ No newline at end of file
diff --git a/java/broker/src/test/java/org/apache/qpid/server/util/InternalBrokerBaseCase.java b/java/broker/src/test/java/org/apache/qpid/server/util/InternalBrokerBaseCase.java
index 9df0aec545..8a34e92985 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/util/InternalBrokerBaseCase.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/util/InternalBrokerBaseCase.java
@@ -20,6 +20,8 @@
*/
package org.apache.qpid.server.util;
+import java.util.UUID;
+
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.qpid.AMQException;
@@ -43,6 +45,7 @@ import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.registry.IApplicationRegistry;
import org.apache.qpid.server.store.MessageStore;
import org.apache.qpid.server.store.TestableMemoryMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStoreFactory;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.test.utils.QpidTestCase;
@@ -65,10 +68,10 @@ public class InternalBrokerBaseCase extends QpidTestCase
super.setUp();
_configXml.addProperty("virtualhosts.virtualhost.name", "test");
- _configXml.addProperty("virtualhosts.virtualhost.test.store.class", TestableMemoryMessageStore.class.getName());
+ _configXml.addProperty("virtualhosts.virtualhost.test.store.factoryclass", TestableMemoryMessageStoreFactory.class.getName());
_configXml.addProperty("virtualhosts.virtualhost(-1).name", getName());
- _configXml.addProperty("virtualhosts.virtualhost(-1)."+getName()+".store.class", TestableMemoryMessageStore.class.getName());
+ _configXml.addProperty("virtualhosts.virtualhost(-1)."+getName()+".store.factoryclass", TestableMemoryMessageStoreFactory.class.getName());
createBroker();
}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/util/MapJsonSerializerTest.java b/java/broker/src/test/java/org/apache/qpid/server/util/MapJsonSerializerTest.java
new file mode 100644
index 0000000000..56567523df
--- /dev/null
+++ b/java/broker/src/test/java/org/apache/qpid/server/util/MapJsonSerializerTest.java
@@ -0,0 +1,53 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+public class MapJsonSerializerTest extends TestCase
+{
+ private MapJsonSerializer _serializer;
+
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _serializer = new MapJsonSerializer();
+
+ }
+
+ public void testSerializeDeserialize()
+ {
+ Map<String, Object> testMap = new HashMap<String, Object>();
+ testMap.put("string", "Test String");
+ testMap.put("integer", new Integer(10));
+ testMap.put("long", new Long(Long.MAX_VALUE));
+ testMap.put("boolean", Boolean.TRUE);
+
+ String jsonString = _serializer.serialize(testMap);
+ Map<String, Object> deserializedMap = _serializer.deserialize(jsonString);
+
+ assertEquals(deserializedMap, testMap);
+ }
+
+}
diff --git a/java/broker/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java b/java/broker/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java
index 5fe664acdd..91174c5d10 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java
@@ -20,6 +20,7 @@
*/
package org.apache.qpid.server.virtualhost;
+import java.util.concurrent.ScheduledFuture;
import org.apache.qpid.server.binding.BindingFactory;
import org.apache.qpid.server.configuration.BrokerConfig;
import org.apache.qpid.server.configuration.ConfigStore;
@@ -32,13 +33,14 @@ import org.apache.qpid.server.exchange.ExchangeFactory;
import org.apache.qpid.server.exchange.ExchangeRegistry;
import org.apache.qpid.server.federation.BrokerLink;
import org.apache.qpid.server.management.ManagedObject;
+import org.apache.qpid.server.protocol.v1_0.LinkRegistry;
import org.apache.qpid.server.queue.QueueRegistry;
import org.apache.qpid.server.registry.IApplicationRegistry;
import org.apache.qpid.server.security.SecurityManager;
import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
import org.apache.qpid.server.stats.StatisticsCounter;
-import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.txn.DtxRegistry;
import java.util.Map;
import java.util.UUID;
@@ -94,17 +96,17 @@ public class MockVirtualHost implements VirtualHost
return null;
}
- public VirtualHostConfiguration getConfiguration()
+ public DtxRegistry getDtxRegistry()
{
return null;
}
- public IConnectionRegistry getConnectionRegistry()
+ public VirtualHostConfiguration getConfiguration()
{
return null;
}
- public DurableConfigurationStore getDurableConfigurationStore()
+ public IConnectionRegistry getConnectionRegistry()
{
return null;
}
@@ -170,6 +172,16 @@ public class MockVirtualHost implements VirtualHost
}
+ public LinkRegistry getLinkRegistry(String remoteContainerId)
+ {
+ return null;
+ }
+
+ public ScheduledFuture<?> scheduleTask(long delay, Runnable timeoutTask)
+ {
+ return null;
+ }
+
public void scheduleHouseKeepingTask(long period, HouseKeepingTask task)
{
@@ -269,4 +281,10 @@ public class MockVirtualHost implements VirtualHost
{
}
+
+ @Override
+ public State getState()
+ {
+ return State.ACTIVE;
+ }
} \ No newline at end of file
diff --git a/java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java b/java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java
index df7b4da426..87eb0f9d16 100644
--- a/java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java
+++ b/java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java
@@ -27,7 +27,7 @@ import org.apache.qpid.server.configuration.ServerConfiguration;
import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.registry.ApplicationRegistry;
-import org.apache.qpid.server.store.TestableMemoryMessageStore;
+import org.apache.qpid.server.store.MemoryMessageStoreFactory;
import org.apache.qpid.server.util.TestApplicationRegistry;
import org.apache.qpid.test.utils.QpidTestCase;
@@ -68,31 +68,6 @@ public class VirtualHostImplTest extends QpidTestCase
customBindingTestImpl(new String[0]);
}
- private void customBindingTestImpl(final String[] routingKeys) throws Exception
- {
- String exchangeName = getName() +".direct";
- String vhostName = getName();
- String queueName = getName();
-
- File config = writeConfigFile(vhostName, queueName, exchangeName, false, routingKeys);
- VirtualHost vhost = createVirtualHost(vhostName, config);
- assertNotNull("virtualhost should exist", vhost);
-
- AMQQueue queue = vhost.getQueueRegistry().getQueue(queueName);
- assertNotNull("queue should exist", queue);
-
- Exchange defaultExch = vhost.getExchangeRegistry().getDefaultExchange();
- assertTrue("queue should have been bound to default exchange with its name", defaultExch.isBound(queueName, queue));
-
- Exchange exch = vhost.getExchangeRegistry().getExchange(exchangeName);
- assertTrue("queue should have been bound to " + exchangeName + " with its name", exch.isBound(queueName, queue));
-
- for(String key: routingKeys)
- {
- assertTrue("queue should have been bound to " + exchangeName + " with key " + key, exch.isBound(key, queue));
- }
- }
-
/**
* Tests that specifying custom routing keys for a queue in the configuration file results in failure
* to create the vhost (since this is illegal, only queue names are used with the default exchange)
@@ -106,12 +81,32 @@ public class VirtualHostImplTest extends QpidTestCase
createVirtualHost(getName(), config);
fail("virtualhost creation should have failed due to illegal configuration");
}
- catch (ConfigurationException e)
+ catch (RuntimeException e)
{
+ assertEquals(ConfigurationException.class, e.getCause().getClass());
//expected
}
}
+ public void testVirtualHostBecomesActive() throws Exception
+ {
+ File config = writeConfigFile(getName(), getName(), getName() +".direct", false, new String[0]);
+ VirtualHost vhost = createVirtualHost(getName(), config);
+ assertNotNull(vhost);
+ assertEquals(State.ACTIVE, vhost.getState());
+ }
+
+ public void testVirtualHostBecomesStoppedOnClose() throws Exception
+ {
+ File config = writeConfigFile(getName(), getName(), getName() +".direct", false, new String[0]);
+ VirtualHost vhost = createVirtualHost(getName(), config);
+ assertNotNull(vhost);
+ assertEquals(State.ACTIVE, vhost.getState());
+ vhost.close();
+ assertEquals(State.STOPPED, vhost.getState());
+ assertEquals(0, vhost.getHouseKeepingActiveCount());
+ }
+
/**
* Tests that specifying an unknown exchange to bind the queue to results in failure to create the vhost
*/
@@ -124,12 +119,39 @@ public class VirtualHostImplTest extends QpidTestCase
createVirtualHost(getName(), config);
fail("virtualhost creation should have failed due to illegal configuration");
}
- catch (ConfigurationException e)
+ catch (RuntimeException e)
{
+ assertEquals(ConfigurationException.class, e.getCause().getClass());
//expected
}
}
+ private void customBindingTestImpl(final String[] routingKeys) throws Exception
+ {
+ String exchangeName = getName() +".direct";
+ String vhostName = getName();
+ String queueName = getName();
+
+ File config = writeConfigFile(vhostName, queueName, exchangeName, false, routingKeys);
+ VirtualHost vhost = createVirtualHost(vhostName, config);
+ assertNotNull("virtualhost should exist", vhost);
+
+ AMQQueue queue = vhost.getQueueRegistry().getQueue(queueName);
+ assertNotNull("queue should exist", queue);
+
+ Exchange defaultExch = vhost.getExchangeRegistry().getDefaultExchange();
+ assertTrue("queue should have been bound to default exchange with its name", defaultExch.isBound(queueName, queue));
+
+ Exchange exch = vhost.getExchangeRegistry().getExchange(exchangeName);
+ assertTrue("queue should have been bound to " + exchangeName + " with its name", exch.isBound(queueName, queue));
+
+ for(String key: routingKeys)
+ {
+ assertTrue("queue should have been bound to " + exchangeName + " with key " + key, exch.isBound(key, queue));
+ }
+ }
+
+
private VirtualHost createVirtualHost(String vhostName, File config) throws Exception
{
_configuration = new ServerConfiguration(new XMLConfiguration(config));
@@ -167,11 +189,11 @@ public class VirtualHostImplTest extends QpidTestCase
writer.write("<virtualhosts>");
writer.write(" <default>" + vhostName + "</default>");
writer.write(" <virtualhost>");
- writer.write(" <store>");
- writer.write(" <class>" + TestableMemoryMessageStore.class.getName() + "</class>");
- writer.write(" </store>");
writer.write(" <name>" + vhostName + "</name>");
writer.write(" <" + vhostName + ">");
+ writer.write(" <store>");
+ writer.write(" <factoryclass>" + MemoryMessageStoreFactory.class.getName() + "</factoryclass>");
+ writer.write(" </store>");
if(exchangeName != null && !dontDeclare)
{
writer.write(" <exchanges>");
diff --git a/java/build.deps b/java/build.deps
index dd3853cb73..76b1461fe2 100644
--- a/java/build.deps
+++ b/java/build.deps
@@ -35,6 +35,9 @@ geronimo-kernel=lib/geronimo-kernel-2.2.1.jar
geronimo-openejb=lib/geronimo-ejb_3.0_spec-1.0.1.jar
junit=lib/junit-3.8.1.jar
+mockito-all=lib/mockito-all-1.9.0.jar
+
+gson-all=lib/gson-2.0.jar
log4j=lib/log4j-1.2.12.jar
@@ -43,30 +46,31 @@ slf4j-log4j=lib/slf4j-log4j12-1.6.1.jar
xalan=lib/xalan-2.7.0.jar
-jetty=lib/jetty-6.1.14.jar
-jetty-util=lib/jetty-util-6.1.14.jar
-jetty-servlet-tester=lib/jetty-servlet-tester-6.1.14.jar
-servlet-api=lib/servlet-api.jar
+felix-main=lib/org.apache.felix.main-2.0.5.jar
-osgi-core=lib/org.osgi.core-1.0.0.jar
-felix-framework=lib/org.apache.felix.framework-2.0.5.jar
+felix.libs=${felix-main}
-felix.libs=${osgi-core} ${felix-framework}
+jackson-core=lib/jackson-core-asl-1.9.0.jar
+jackson-mapper=lib/jackson-mapper-asl-1.9.0.jar
commons-configuration.libs = ${commons-beanutils-core} ${commons-digester} \
${commons-codec} ${commons-lang} ${commons-collections} ${commons-configuration}
common.libs=${slf4j-api}
client.libs=${geronimo-jms}
+amqp-1-0-common.libs=
+amqp-1-0-client.libs=${commons-cli}
+amqp-1-0-client-jms.libs=${geronimo-jms}
tools.libs=${commons-configuration.libs} ${log4j}
broker.libs=${commons-cli} ${commons-logging} ${log4j} ${slf4j-log4j} \
- ${xalan} ${felix.libs} ${derby-db} ${commons-configuration.libs}
+ ${xalan} ${felix.libs} ${derby-db} ${commons-configuration.libs} \
+ ${jackson-core} ${jackson-mapper}
broker-plugins.libs=${felix.libs} ${log4j} ${commons-configuration.libs}
-junit-toolkit.libs=${log4j} ${junit} ${slf4j-api}
-test.libs=${slf4j-log4j} ${junit-toolkit.libs}
-testkit.libs=${log4j}
+test.libs=${slf4j-log4j} ${log4j} ${junit} ${slf4j-api} ${mockito-all}
+
+perftests.libs=${geronimo-jms} ${slf4j-api} ${commons-collections} ${commons-beanutils-core} ${commons-lang} ${gson-all}
ibm-icu=lib/com.ibm.icu_3.8.1.v20080530.jar
ecl-core-jface=lib/org.eclipse.jface_3.4.1.M20080827-2000.jar
@@ -125,7 +129,7 @@ management-eclipse-plugin-macosx.libs=${management-eclipse-plugin.core-libs} \
${ecl-swt-macosx-carbon} ${ecl-equinox-launcher-macosx-carbon} ${ecl-core-runtime-compat-registry}
management-eclipse-plugin-solaris-gtk-sparc.libs=${management-eclipse-plugin.core-libs} \
${ecl-swt-solaris-gtk-sparc} ${ecl-equinox-launcher-solaris-gtk-sparc} ${ecl-core-runtime-compat-registry}
-
+
common.test.libs=${test.libs}
broker.test.libs=${test.libs}
client.test.libs=${test.libs}
@@ -133,18 +137,29 @@ client-example.test.libs=${test.libs}
tools.test.libs=
testkit.test.libs=${test.libs}
systests.libs=${test.libs}
+perftests.test.libs=${test.libs}
broker-plugins.test.libs=${test.libs}
-broker-plugins-experimental-info.test.libs=${test.libs} ${servlet-api} ${jetty} ${jetty-util} ${jetty-servlet-tester}
management-eclipse-plugin.test.libs=${test.libs}
management-common.test.libs=${test.libs}
# JCA Resource adapter
-ra.libs=${geronimo-j2ee} ${geronimo-jta} ${geronimo-jms} ${slf4j-api} ${geronimo-kernel} ${geronimo-openejb}
+ra.libs=${geronimo-j2ee} ${geronimo-jta} ${geronimo-jms} ${test.libs} ${geronimo-kernel} ${geronimo-openejb}
+ra.test.libs=${test.libs}
+
+#note this is a hack because systests is looking for 'jca' versus 'ra' we need to do this twice
+jca.libs=${geronimo-j2ee} ${geronimo-jta} ${geronimo-jms} ${test.libs} ${geronimo-kernel} ${geronimo-openejb}
+jca.test.libs=${test.libs}
# optional bdbstore module deps
bdb-je=lib/bdbstore/je-5.0.34.jar
bdbstore.libs=${bdb-je}
bdbstore.test.libs=${test.libs}
+# optional perftests-visualisation-jfc module deps
+jfreechart.jar=lib/jfree/jfreechart-1.0.13.jar
+jfreecommon.jar=lib/jfree/jfreecommon-1.0.16.jar
+csvjdbc.jar=lib/csvjdbc/csvjdbc-1.0.8.jar
+perftests-visualisation-jfc.libs=${jfreechart.jar} ${jfreecommon.jar} ${csvjdbc.jar}
+perftests-visualisation-jfc.test.libs=${test.libs}
diff --git a/java/build.xml b/java/build.xml
index a77469eff6..1de6c8f49c 100644
--- a/java/build.xml
+++ b/java/build.xml
@@ -7,9 +7,9 @@
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- -
+ -
- http://www.apache.org/licenses/LICENSE-2.0
- -
+ -
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -26,15 +26,15 @@
<findSubProjects name="client-plugins" dir="client-plugins"/>
<findSubProjects name="management" dir="management" excludes="common,example"/>
- <property name="modules.core" value="junit-toolkit common management/common broker client tools"/>
+ <property name="modules.core" value="common management/common amqp-1-0-common broker client amqp-1-0-client amqp-1-0-client-jms tools"/>
<property name="modules.examples" value="client/example management/example"/>
- <property name="modules.tests" value="systests perftests integrationtests testkit"/>
+ <property name="modules.tests" value="systests perftests"/>
<property name="modules.management" value="${management}"/>
<property name="modules.plugin" value="${broker-plugins} ${client-plugins}"/>
<property name="modules.opt" value=""/>
<property name="modules.jca" value="jca"/>
<property name="modules" value="${modules.core} ${modules.examples}
- ${modules.management} ${modules.tests} ${modules.plugin} ${modules.opt} ${modules.jca}"/>
+ ${modules.management} ${modules.jca} ${modules.tests} ${modules.plugin} ${modules.opt}"/>
<property name="qpid.jar" location="${build.lib}/qpid-all.jar"/>
<basename property="qpid.jar.name" file="${qpid.jar}"/>
@@ -94,7 +94,7 @@
<fail if="failed" message="TEST SUITE FAILED"/>
</target>
-
+
<target name="report-module" description="generate junitreport for modules">
<iterate target="report-module"/>
</target>
@@ -122,7 +122,7 @@
<target name="bundle" description="create OSGi bundles">
<iterate target="bundle"/>
</target>
-
+
<target name="release-bin" description="build a binary release artifact" depends="build,bundle">
<iterate target="release-bin"/>
</target>
@@ -245,14 +245,14 @@
<target name="instrument" description="instrument for artifacts">
<iterate target="instrument"/>
</target>
-
+
<target name="cover-test" description="run tests and generate coverage information" depends="build">
<iterate target="cover-test" modules="broker client common"/>
</target>
<target name="test-interop" depends="build,compile-tests"
description="run JMS examples against the corresponding c++ and python examples">
- <property name="qpid.src.home" location=".."/>
+ <property name="qpid.src.home" location=".."/>
<echo-prop name="qpid.src.home"/>
<exec executable="/bin/sh" failonerror="true">
<env key="QPID_SRC_HOME" value="${qpid.src.home}"/>
@@ -276,7 +276,7 @@
<findbugs home="${findbugs.dir}"
output="html"
- outputFile="${build.findbugs}/report.html"
+ outputFile="${build.findbugs}/report.html"
stylesheet="fancy-hist.xsl"
jvmargs="-Xmx512m"
projectName="Qpid">
diff --git a/java/client/src/main/java/client.bnd b/java/client/src/main/java/client.bnd
index d92d582ec8..495ea6793f 100755
--- a/java/client/src/main/java/client.bnd
+++ b/java/client/src/main/java/client.bnd
@@ -17,7 +17,7 @@
# under the License.
#
-ver: 0.15.0
+ver: 0.17.0
Bundle-SymbolicName: qpid-client
Bundle-Version: ${ver}
diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQBrokerDetails.java b/java/client/src/main/java/org/apache/qpid/client/AMQBrokerDetails.java
index 771e80c3bc..987404cb80 100644
--- a/java/client/src/main/java/org/apache/qpid/client/AMQBrokerDetails.java
+++ b/java/client/src/main/java/org/apache/qpid/client/AMQBrokerDetails.java
@@ -319,18 +319,18 @@ public class AMQBrokerDetails implements BrokerDetails
BrokerDetails bd = (BrokerDetails) o;
- return _host.equalsIgnoreCase(bd.getHost()) &&
+ return _host.toLowerCase().equals(bd.getHost() == null ? null : bd.getHost().toLowerCase()) &&
(_port == bd.getPort()) &&
- _transport.equalsIgnoreCase(bd.getTransport());
+ _transport.toLowerCase().equals(bd.getTransport() == null ? null : bd.getTransport().toLowerCase());
//TODO do we need to compare all the options as well?
}
@Override
public int hashCode()
{
- int result = _host != null ? _host.hashCode() : 0;
+ int result = _host != null ? _host.toLowerCase().hashCode() : 0;
result = 31 * result + _port;
- result = 31 * result + (_transport != null ? _transport.hashCode() : 0);
+ result = 31 * result + (_transport != null ? _transport.toLowerCase().hashCode() : 0);
return result;
}
diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java b/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java
index 39ad282422..23b47c8d67 100644
--- a/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java
+++ b/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java
@@ -308,9 +308,9 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect
_delegate = new AMQConnectionDelegate_0_10(this);
}
- if (_logger.isInfoEnabled())
+ if (_logger.isDebugEnabled())
{
- _logger.info("Connection:" + connectionURL);
+ _logger.debug("Connection:" + connectionURL);
}
_connectionURL = connectionURL;
@@ -343,7 +343,10 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect
_protocolHandler = new AMQProtocolHandler(this);
- _logger.info("Connecting with ProtocolHandler Version:"+_protocolHandler.getProtocolVersion());
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Connecting with ProtocolHandler Version:"+_protocolHandler.getProtocolVersion());
+ }
// We are not currently connected
setConnected(false);
@@ -435,7 +438,10 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect
throw new AMQConnectionFailureException(message, connectionException);
}
- _logger.info("Connected with ProtocolHandler Version:"+_protocolHandler.getProtocolVersion());
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Connected with ProtocolHandler Version:"+_protocolHandler.getProtocolVersion());
+ }
_sessions.setMaxChannelID(_delegate.getMaxChannelID());
_sessions.setMinChannelID(_delegate.getMinChannelID());
@@ -462,7 +468,10 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect
String delegateClassName = String.format
("org.apache.qpid.client.AMQConnectionDelegate_%s_%s",
pe.getMajorVersion(), pe.getMinorVersion());
- _logger.info("Looking up delegate '" + delegateClassName + "' Based on PE:" + pe);
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Looking up delegate '" + delegateClassName + "' Based on PE:" + pe);
+ }
Class c = Class.forName(delegateClassName);
Class partypes[] = new Class[1];
partypes[0] = AMQConnection.class;
@@ -569,6 +578,7 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect
public ProtocolVersion makeBrokerConnection(BrokerDetails brokerDetail) throws IOException, AMQException
{
+ resetClosedFlag();
return _delegate.makeBrokerConnection(brokerDetail);
}
@@ -968,7 +978,8 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect
{
checkNotClosed();
- return null;
+ throw new JmsNotImplementedException();
+
}
public ConnectionConsumer createConnectionConsumer(Queue queue, String messageSelector, ServerSessionPool sessionPool,
@@ -976,7 +987,7 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect
{
checkNotClosed();
- return null;
+ throw new JmsNotImplementedException();
}
public ConnectionConsumer createConnectionConsumer(Topic topic, String messageSelector, ServerSessionPool sessionPool,
@@ -984,7 +995,7 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect
{
checkNotClosed();
- return null;
+ throw new JmsNotImplementedException();
}
public ConnectionConsumer createDurableConnectionConsumer(Topic topic, String subscriptionName, String messageSelector,
@@ -993,7 +1004,7 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect
// TODO Auto-generated method stub
checkNotClosed();
- return null;
+ throw new JmsNotImplementedException();
}
public long getMaximumChannelCount() throws JMSException
diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java b/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java
index 56ee56d178..a1a06c5547 100644
--- a/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java
+++ b/java/client/src/main/java/org/apache/qpid/client/AMQConnectionDelegate_0_10.java
@@ -327,6 +327,8 @@ public class AMQConnectionDelegate_0_10 implements AMQConnectionDelegate, Connec
}
}
+ _conn.setClosed();
+
ExceptionListener listener = _conn.getExceptionListenerNoCheck();
if (listener == null)
{
diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQQueueBrowser.java b/java/client/src/main/java/org/apache/qpid/client/AMQQueueBrowser.java
index 2313bce474..0c6031ea91 100644
--- a/java/client/src/main/java/org/apache/qpid/client/AMQQueueBrowser.java
+++ b/java/client/src/main/java/org/apache/qpid/client/AMQQueueBrowser.java
@@ -20,6 +20,12 @@
*/
package org.apache.qpid.client;
+import javax.jms.InvalidDestinationException;
+import javax.jms.InvalidSelectorException;
+import org.apache.qpid.AMQException;
+import org.apache.qpid.AMQInternalException;
+import org.apache.qpid.client.filter.JMSSelectorFilter;
+import org.apache.qpid.protocol.AMQConstant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -48,12 +54,50 @@ public class AMQQueueBrowser implements QueueBrowser
_session = session;
_queue = queue;
_messageSelector = ((messageSelector == null) || (messageSelector.trim().length() == 0)) ? null : messageSelector;
- // Create Consumer to verify message selector.
- BasicMessageConsumer consumer =
- (BasicMessageConsumer) _session.createBrowserConsumer(_queue, _messageSelector, false);
- // Close this consumer as we are not looking to consume only to establish that, at least for now,
- // the QB can be created
- consumer.close();
+
+
+ validateQueue((AMQDestination) queue);
+
+ if(_messageSelector != null)
+ {
+ validateSelector(_messageSelector);
+ }
+ }
+
+ private void validateSelector(String messageSelector) throws InvalidSelectorException
+ {
+ try
+ {
+ new JMSSelectorFilter(messageSelector);
+ }
+ catch (AMQInternalException e)
+ {
+ throw new InvalidSelectorException(e.getMessage());
+ }
+ }
+
+ private void validateQueue(AMQDestination queue) throws JMSException
+ {
+ try
+ {
+ // Essentially just test the connection/session is still active
+ _session.sync();
+ // TODO - should really validate queue exists, but we often rely on creating the consumer to create the queue :(
+ // _session.declareQueuePassive( queue );
+ }
+ catch (AMQException e)
+ {
+ if(e.getErrorCode() == AMQConstant.NOT_FOUND)
+ {
+ throw new InvalidDestinationException(e.getMessage());
+ }
+ else
+ {
+ final JMSException jmsException = new JMSException(e.getMessage(), String.valueOf(e.getErrorCode().getCode()));
+ jmsException.setLinkedException(e);
+ throw jmsException;
+ }
+ }
}
public Queue getQueue() throws JMSException
@@ -88,6 +132,10 @@ public class AMQQueueBrowser implements QueueBrowser
public Enumeration getEnumeration() throws JMSException
{
checkState();
+ if(!_session.getAMQConnection().started())
+ {
+ throw new IllegalStateException("Cannot enumerate message on the queue while the Connection is stopped");
+ }
final BasicMessageConsumer consumer =
(BasicMessageConsumer) _session.createBrowserConsumer(_queue, _messageSelector, false);
@@ -118,12 +166,12 @@ public class AMQQueueBrowser implements QueueBrowser
_consumer = consumer;
prefetchMessage();
}
- _logger.info("QB:created with first element:" + _nextMessage);
+ _logger.debug("QB:created with first element:" + _nextMessage);
}
public boolean hasMoreElements()
{
- _logger.info("QB:hasMoreElements:" + (_nextMessage != null));
+ _logger.debug("QB:hasMoreElements:" + (_nextMessage != null));
return (_nextMessage != null);
}
@@ -136,9 +184,9 @@ public class AMQQueueBrowser implements QueueBrowser
}
try
{
- _logger.info("QB:nextElement about to receive");
+ _logger.debug("QB:nextElement about to receive");
prefetchMessage();
- _logger.info("QB:nextElement received:" + _nextMessage);
+ _logger.debug("QB:nextElement received:" + _nextMessage);
}
catch (JMSException e)
{
diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQSession.java b/java/client/src/main/java/org/apache/qpid/client/AMQSession.java
index e7e937b689..55d3ccb6e7 100644
--- a/java/client/src/main/java/org/apache/qpid/client/AMQSession.java
+++ b/java/client/src/main/java/org/apache/qpid/client/AMQSession.java
@@ -120,18 +120,6 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
public static final long DEFAULT_FLOW_CONTROL_WAIT_FAILURE = 120000L;
/**
- * The default value for immediate flag used by producers created by this session is false. That is, a consumer does
- * not need to be attached to a queue.
- */
- private final boolean _defaultImmediateValue = Boolean.parseBoolean(System.getProperty("qpid.default_immediate", "false"));
-
- /**
- * The default value for mandatory flag used by producers created by this session is true. That is, server will not
- * silently drop messages where no queue is connected to the exchange for the message.
- */
- private final boolean _defaultMandatoryValue = Boolean.parseBoolean(System.getProperty("qpid.default_mandatory", "true"));
-
- /**
* The period to wait while flow controlled before sending a log message confirming that the session is still
* waiting on flow control being revoked
*/
@@ -542,9 +530,9 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
}
// Add creation logging to tie in with the existing close logging
- if (_logger.isInfoEnabled())
+ if (_logger.isDebugEnabled())
{
- _logger.info("Created session:" + this);
+ _logger.debug("Created session:" + this);
}
}
@@ -733,9 +721,9 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
private void close(long timeout, boolean sendClose) throws JMSException
{
- if (_logger.isInfoEnabled())
+ if (_logger.isDebugEnabled())
{
- _logger.info("Closing session: " + this);
+ _logger.debug("Closing session: " + this);
}
// Ensure we only try and close an open session.
@@ -904,11 +892,11 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
// Flush any pending messages for this consumerTag
if (_dispatcher != null)
{
- _logger.info("Dispatcher is not null");
+ _logger.debug("Dispatcher is not null");
}
else
{
- _logger.info("Dispatcher is null so created stopped dispatcher");
+ _logger.debug("Dispatcher is null so created stopped dispatcher");
startDispatcherIfNecessary(true);
}
@@ -926,9 +914,9 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
// There is a small window where the message is between the two queues in the dispatcher.
if (consumer.isClosed())
{
- if (_logger.isInfoEnabled())
+ if (_logger.isDebugEnabled())
{
- _logger.info("Closing consumer:" + consumer.debugIdentity());
+ _logger.debug("Closing consumer:" + consumer.debugIdentity());
}
deregisterConsumer(consumer);
@@ -1101,6 +1089,10 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
// possible to determine when querying the broker whether there are no arguments or just a non-matching selector
// argument, as specifying null for the arguments when querying means they should not be checked at all
args.put(AMQPFilterTypes.JMS_SELECTOR.getValue().toString(), messageSelector == null ? "" : messageSelector);
+ if(noLocal)
+ {
+ args.put(AMQPFilterTypes.NO_LOCAL.getValue().toString(), true);
+ }
// if the queue is bound to the exchange but NOT for this topic and selector, then the JMS spec
// says we must trash the subscription.
@@ -1198,12 +1190,12 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
public P createProducer(Destination destination) throws JMSException
{
- return createProducerImpl(destination, _defaultMandatoryValue, _defaultImmediateValue);
+ return createProducerImpl(destination, null, null);
}
public P createProducer(Destination destination, boolean immediate) throws JMSException
{
- return createProducerImpl(destination, _defaultMandatoryValue, immediate);
+ return createProducerImpl(destination, null, immediate);
}
public P createProducer(Destination destination, boolean mandatory, boolean immediate)
@@ -1692,7 +1684,7 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
{
AMQProtocolHandler protocolHandler = getProtocolHandler();
declareExchange(amqd, protocolHandler, false);
- AMQShortString queueName = declareQueue(amqd, protocolHandler, false);
+ AMQShortString queueName = declareQueue(amqd, false);
bindQueue(queueName, amqd.getRoutingKey(), new FieldTable(), amqd.getExchangeName(), amqd);
}
@@ -2378,9 +2370,9 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
_dispatcherThread.setDaemon(DEAMON_DISPATCHER_THREAD);
_dispatcher.setConnectionStopped(initiallyStopped);
_dispatcherThread.start();
- if (_dispatcherLogger.isInfoEnabled())
+ if (_dispatcherLogger.isDebugEnabled())
{
- _dispatcherLogger.info(_dispatcherThread.getName() + " created");
+ _dispatcherLogger.debug(_dispatcherThread.getName() + " created");
}
}
else
@@ -2613,7 +2605,7 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
public abstract void sendConsume(C consumer, AMQShortString queueName,
AMQProtocolHandler protocolHandler, boolean nowait, int tag) throws AMQException, FailoverException;
- private P createProducerImpl(final Destination destination, final boolean mandatory, final boolean immediate)
+ private P createProducerImpl(final Destination destination, final Boolean mandatory, final Boolean immediate)
throws JMSException
{
return new FailoverRetrySupport<P, JMSException>(
@@ -2642,8 +2634,8 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
}, _connection).execute();
}
- public abstract P createMessageProducer(final Destination destination, final boolean mandatory,
- final boolean immediate, final long producerId) throws JMSException;
+ public abstract P createMessageProducer(final Destination destination, final Boolean mandatory,
+ final Boolean immediate, final long producerId) throws JMSException;
private void declareExchange(AMQDestination amqd, AMQProtocolHandler protocolHandler, boolean nowait) throws AMQException
{
@@ -2726,6 +2718,12 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
public abstract void sendExchangeDeclare(final AMQShortString name, final AMQShortString type, final AMQProtocolHandler protocolHandler,
final boolean nowait) throws AMQException, FailoverException;
+
+ void declareQueuePassive(AMQDestination queue) throws AMQException
+ {
+ declareQueue(queue,false,false,true);
+ }
+
/**
* Declares a queue for a JMS destination.
*
@@ -2735,27 +2733,35 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
*
* <p/>Note that this operation automatically retries in the event of fail-over.
*
- * @param amqd The destination to declare as a queue.
- * @param protocolHandler The protocol handler to communicate through.
*
+ * @param amqd The destination to declare as a queue.
* @return The name of the decalred queue. This is useful where the broker is generating a queue name on behalf of
* the client.
*
+ *
+ *
* @throws AMQException If the queue cannot be declared for any reason.
* @todo Verify the destiation is valid or throw an exception.
* @todo Be aware of possible changes to parameter order as versions change.
*/
- protected AMQShortString declareQueue(final AMQDestination amqd, final AMQProtocolHandler protocolHandler,
+ protected AMQShortString declareQueue(final AMQDestination amqd,
final boolean noLocal) throws AMQException
{
- return declareQueue(amqd, protocolHandler, noLocal, false);
+ return declareQueue(amqd, noLocal, false);
}
- protected AMQShortString declareQueue(final AMQDestination amqd, final AMQProtocolHandler protocolHandler,
+ protected AMQShortString declareQueue(final AMQDestination amqd,
final boolean noLocal, final boolean nowait)
+ throws AMQException
+ {
+ return declareQueue(amqd, noLocal, nowait, false);
+ }
+
+ protected AMQShortString declareQueue(final AMQDestination amqd,
+ final boolean noLocal, final boolean nowait, final boolean passive)
throws AMQException
{
- /*return new FailoverRetrySupport<AMQShortString, AMQException>(*/
+ final AMQProtocolHandler protocolHandler = getProtocolHandler();
return new FailoverNoopSupport<AMQShortString, AMQException>(
new FailoverProtectedOperation<AMQShortString, AMQException>()
{
@@ -2767,7 +2773,7 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
amqd.setQueueName(protocolHandler.generateQueueName());
}
- sendQueueDeclare(amqd, protocolHandler, nowait);
+ sendQueueDeclare(amqd, protocolHandler, nowait, passive);
return amqd.getAMQQueueName();
}
@@ -2775,7 +2781,7 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
}
public abstract void sendQueueDeclare(final AMQDestination amqd, final AMQProtocolHandler protocolHandler,
- final boolean nowait) throws AMQException, FailoverException;
+ final boolean nowait, boolean passive) throws AMQException, FailoverException;
/**
* Undeclares the specified queue.
@@ -2916,7 +2922,7 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
if (_delareQueues || amqd.isNameRequired())
{
- declareQueue(amqd, protocolHandler, consumer.isNoLocal(), nowait);
+ declareQueue(amqd, consumer.isNoLocal(), nowait);
}
bindQueue(amqd.getAMQQueueName(), amqd.getRoutingKey(), consumer.getArguments(), amqd.getExchangeName(), amqd, nowait);
}
@@ -2939,7 +2945,7 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
try
{
suspendChannel(true);
- _logger.info(
+ _logger.debug(
"Prefetching delayed existing messages will not flow until requested via receive*() or setML().");
}
catch (AMQException e)
@@ -2951,7 +2957,7 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
}
else
{
- _logger.info("Immediately prefetching existing messages to new consumer.");
+ _logger.debug("Immediately prefetching existing messages to new consumer.");
}
try
@@ -2983,18 +2989,18 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
private void rejectMessagesForConsumerTag(int consumerTag, boolean requeue, boolean rejectAllConsumers)
{
Iterator messages = _queue.iterator();
- if (_logger.isInfoEnabled())
+ if (_logger.isDebugEnabled())
{
- _logger.info("Rejecting messages from _queue for Consumer tag(" + consumerTag + ") (PDispatchQ) requeue:"
+ _logger.debug("Rejecting messages from _queue for Consumer tag(" + consumerTag + ") (PDispatchQ) requeue:"
+ requeue);
if (messages.hasNext())
{
- _logger.info("Checking all messages in _queue for Consumer tag(" + consumerTag + ")");
+ _logger.debug("Checking all messages in _queue for Consumer tag(" + consumerTag + ")");
}
else
{
- _logger.info("No messages in _queue to reject");
+ _logger.debug("No messages in _queue to reject");
}
}
while (messages.hasNext())
@@ -3037,7 +3043,7 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
private void resubscribeProducers() throws AMQException
{
ArrayList producers = new ArrayList(_producers.values());
- _logger.info(MessageFormat.format("Resubscribing producers = {0} producers.size={1}", producers, producers.size())); // FIXME: removeKey
+ _logger.debug(MessageFormat.format("Resubscribing producers = {0} producers.size={1}", producers, producers.size())); // FIXME: removeKey
for (Iterator it = producers.iterator(); it.hasNext();)
{
P producer = (P) it.next();
@@ -3127,7 +3133,10 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
public void setFlowControl(final boolean active)
{
_flowControl.setFlowControl(active);
- _logger.warn("Broker enforced flow control " + (active ? "no longer in effect" : "has been enforced"));
+ if (_logger.isInfoEnabled())
+ {
+ _logger.info("Broker enforced flow control " + (active ? "no longer in effect" : "has been enforced"));
+ }
}
public void checkFlowControl() throws InterruptedException, JMSException
@@ -3141,7 +3150,10 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
{
_flowControl.wait(_flowControlWaitPeriod);
- _logger.warn("Message send delayed by " + (System.currentTimeMillis() + _flowControlWaitFailure - expiryTime)/1000 + "s due to broker enforced flow control");
+ if (_logger.isInfoEnabled())
+ {
+ _logger.info("Message send delayed by " + (System.currentTimeMillis() + _flowControlWaitFailure - expiryTime)/1000 + "s due to broker enforced flow control");
+ }
}
if(!_flowControl.getFlowControl())
{
@@ -3200,28 +3212,15 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
public void rejectPending(C consumer)
{
- synchronized (_lock)
- {
- boolean stopped = _dispatcher.connectionStopped();
+ // Reject messages on pre-receive queue
+ consumer.rollbackPendingMessages();
- if (!stopped)
- {
- _dispatcher.setConnectionStopped(true);
- }
+ // Reject messages on pre-dispatch queue
+ rejectMessagesForConsumerTag(consumer.getConsumerTag(), true, false);
- // Reject messages on pre-receive queue
- consumer.rollbackPendingMessages();
+ // closeConsumer
+ consumer.markClosed();
- // Reject messages on pre-dispatch queue
- rejectMessagesForConsumerTag(consumer.getConsumerTag(), true, false);
- //Let the dispatcher deal with this when it gets to them.
-
- // closeConsumer
- consumer.markClosed();
-
- _dispatcher.setConnectionStopped(stopped);
-
- }
}
public void rollback()
@@ -3294,9 +3293,9 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
public void run()
{
- if (_dispatcherLogger.isInfoEnabled())
+ if (_dispatcherLogger.isDebugEnabled())
{
- _dispatcherLogger.info(_dispatcherThread.getName() + " started");
+ _dispatcherLogger.debug(_dispatcherThread.getName() + " started");
}
// Allow disptacher to start stopped
@@ -3318,7 +3317,7 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
try
{
Dispatchable disp;
- while (!_closed.get() && ((disp = (Dispatchable) _queue.take()) != null))
+ while (((disp = (Dispatchable) _queue.take()) != null) && !_closed.get())
{
disp.dispatch(AMQSession.this);
}
@@ -3328,9 +3327,9 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
// ignored as run will exit immediately
}
- if (_dispatcherLogger.isInfoEnabled())
+ if (_dispatcherLogger.isDebugEnabled())
{
- _dispatcherLogger.info(_dispatcherThread.getName() + " thread terminating for channel " + _channelId + ":" + AMQSession.this);
+ _dispatcherLogger.debug(_dispatcherThread.getName() + " thread terminating for channel " + _channelId + ":" + AMQSession.this);
}
}
@@ -3413,7 +3412,7 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
{
final C consumer = _consumers.get(message.getConsumerTag());
- if ((consumer == null) || consumer.isClosed())
+ if ((consumer == null) || consumer.isClosed() || consumer.isClosing())
{
if (_dispatcherLogger.isInfoEnabled())
{
diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java b/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java
index 816ad1f222..3902c726f3 100644
--- a/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java
+++ b/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java
@@ -17,9 +17,20 @@
*/
package org.apache.qpid.client;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import javax.jms.Destination;
+import javax.jms.JMSException;
import org.apache.qpid.AMQException;
import org.apache.qpid.client.AMQDestination.AddressOption;
import org.apache.qpid.client.AMQDestination.Binding;
@@ -27,7 +38,6 @@ import org.apache.qpid.client.AMQDestination.DestSyntax;
import org.apache.qpid.client.failover.FailoverException;
import org.apache.qpid.client.failover.FailoverNoopSupport;
import org.apache.qpid.client.failover.FailoverProtectedOperation;
-import org.apache.qpid.client.filter.MessageFilter;
import org.apache.qpid.client.message.AMQMessageDelegateFactory;
import org.apache.qpid.client.message.FieldTableSupport;
import org.apache.qpid.client.message.MessageFactoryRegistry;
@@ -42,28 +52,14 @@ import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.protocol.AMQConstant;
import org.apache.qpid.transport.*;
-import org.apache.qpid.util.Serial;
-import org.apache.qpid.util.Strings;
-
import static org.apache.qpid.transport.Option.BATCH;
import static org.apache.qpid.transport.Option.NONE;
import static org.apache.qpid.transport.Option.SYNC;
import static org.apache.qpid.transport.Option.UNRELIABLE;
-
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentLinkedQueue;
+import org.apache.qpid.util.Serial;
+import org.apache.qpid.util.Strings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* This is a 0.10 Session
@@ -654,8 +650,8 @@ public class AMQSession_0_10 extends AMQSession<BasicMessageConsumer_0_10, Basic
/**
* Create an 0_10 message producer
*/
- public BasicMessageProducer_0_10 createMessageProducer(final Destination destination, final boolean mandatory,
- final boolean immediate, final long producerId) throws JMSException
+ public BasicMessageProducer_0_10 createMessageProducer(final Destination destination, final Boolean mandatory,
+ final Boolean immediate, final long producerId) throws JMSException
{
try
{
@@ -725,7 +721,7 @@ public class AMQSession_0_10 extends AMQSession<BasicMessageConsumer_0_10, Basic
* Declare a queue with the given queueName
*/
public void sendQueueDeclare(final AMQDestination amqd, final AMQProtocolHandler protocolHandler,
- final boolean nowait)
+ final boolean nowait, boolean passive)
throws AMQException, FailoverException
{
// do nothing this is only used by 0_8
@@ -735,7 +731,7 @@ public class AMQSession_0_10 extends AMQSession<BasicMessageConsumer_0_10, Basic
* Declare a queue with the given queueName
*/
public AMQShortString send0_10QueueDeclare(final AMQDestination amqd, final AMQProtocolHandler protocolHandler,
- final boolean noLocal, final boolean nowait)
+ final boolean noLocal, final boolean nowait, boolean passive)
throws AMQException
{
AMQShortString queueName;
@@ -761,7 +757,8 @@ public class AMQSession_0_10 extends AMQSession<BasicMessageConsumer_0_10, Basic
getQpidSession().queueDeclare(queueName.toString(), "" , arguments,
amqd.isAutoDelete() ? Option.AUTO_DELETE : Option.NONE,
amqd.isDurable() ? Option.DURABLE : Option.NONE,
- amqd.isExclusive() ? Option.EXCLUSIVE : Option.NONE);
+ amqd.isExclusive() ? Option.EXCLUSIVE : Option.NONE,
+ passive ? Option.PASSIVE : Option.NONE);
}
else
{
@@ -931,11 +928,12 @@ public class AMQSession_0_10 extends AMQSession<BasicMessageConsumer_0_10, Basic
return getCurrentException();
}
- protected AMQShortString declareQueue(final AMQDestination amqd, final AMQProtocolHandler protocolHandler,
- final boolean noLocal, final boolean nowait)
+ protected AMQShortString declareQueue(final AMQDestination amqd,
+ final boolean noLocal, final boolean nowait, final boolean passive)
throws AMQException
{
- /*return new FailoverRetrySupport<AMQShortString, AMQException>(*/
+ final AMQProtocolHandler protocolHandler = getProtocolHandler();
+
return new FailoverNoopSupport<AMQShortString, AMQException>(
new FailoverProtectedOperation<AMQShortString, AMQException>()
{
@@ -952,7 +950,7 @@ public class AMQSession_0_10 extends AMQSession<BasicMessageConsumer_0_10, Basic
amqd.setQueueName(new AMQShortString( binddingKey + "@"
+ amqd.getExchangeName().toString() + "_" + UUID.randomUUID()));
}
- return send0_10QueueDeclare(amqd, protocolHandler, noLocal, nowait);
+ return send0_10QueueDeclare(amqd, protocolHandler, noLocal, nowait, passive);
}
}, getAMQConnection()).execute();
}
@@ -1209,7 +1207,7 @@ public class AMQSession_0_10 extends AMQSession<BasicMessageConsumer_0_10, Basic
else if(createNode)
{
setLegacyFiledsForQueueType(dest);
- send0_10QueueDeclare(dest,null,noLocal,noWait);
+ send0_10QueueDeclare(dest,null,noLocal,noWait, false);
sendQueueBind(dest.getAMQQueueName(), dest.getRoutingKey(),
null,dest.getExchangeName(),dest, false);
break;
@@ -1315,7 +1313,7 @@ public class AMQSession_0_10 extends AMQSession<BasicMessageConsumer_0_10, Basic
}
node.setExclusive(true);
node.setAutoDelete(!node.isDurable());
- send0_10QueueDeclare(dest,null,noLocal,true);
+ send0_10QueueDeclare(dest,null,noLocal,true, false);
getQpidSession().exchangeBind(dest.getQueueName(),
dest.getAddressName(),
dest.getSubject(),
diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_8.java b/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_8.java
index 29f1925cbc..8ab23a240e 100644
--- a/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_8.java
+++ b/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_8.java
@@ -38,7 +38,6 @@ import org.apache.qpid.client.protocol.AMQProtocolHandler;
import org.apache.qpid.client.state.AMQState;
import org.apache.qpid.client.state.AMQStateManager;
import org.apache.qpid.client.state.listener.SpecificMethodFrameListener;
-import org.apache.qpid.client.filter.MessageFilter;
import org.apache.qpid.framing.*;
import org.apache.qpid.framing.amqp_0_9.MethodRegistry_0_9;
import org.apache.qpid.framing.amqp_0_91.MethodRegistry_0_91;
@@ -401,9 +400,17 @@ public class AMQSession_0_8 extends AMQSession<BasicMessageConsumer_0_8, BasicMe
}
public void sendQueueDeclare(final AMQDestination amqd, final AMQProtocolHandler protocolHandler,
- final boolean nowait) throws AMQException, FailoverException
- {
- QueueDeclareBody body = getMethodRegistry().createQueueDeclareBody(getTicket(),amqd.getAMQQueueName(),false,amqd.isDurable(),amqd.isExclusive(),amqd.isAutoDelete(),false,null);
+ final boolean nowait, boolean passive) throws AMQException, FailoverException
+ {
+ QueueDeclareBody body =
+ getMethodRegistry().createQueueDeclareBody(getTicket(),
+ amqd.getAMQQueueName(),
+ passive,
+ amqd.isDurable(),
+ amqd.isExclusive(),
+ amqd.isAutoDelete(),
+ false,
+ null);
AMQFrame queueDeclare = body.generateFrame(getChannelId());
@@ -441,8 +448,8 @@ public class AMQSession_0_8 extends AMQSession<BasicMessageConsumer_0_8, BasicMe
}
- public BasicMessageProducer_0_8 createMessageProducer(final Destination destination, final boolean mandatory,
- final boolean immediate, long producerId) throws JMSException
+ public BasicMessageProducer_0_8 createMessageProducer(final Destination destination, final Boolean mandatory,
+ final Boolean immediate, long producerId) throws JMSException
{
try
{
diff --git a/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java b/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java
index 8e9b1fb90f..0f8b5717d6 100644
--- a/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java
+++ b/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java
@@ -199,6 +199,10 @@ public abstract class BasicMessageConsumer<U> extends Closeable implements Messa
// possible to determine when querying the broker whether there are no arguments or just a non-matching selector
// argument, as specifying null for the arguments when querying means they should not be checked at all
ft.put(AMQPFilterTypes.JMS_SELECTOR.getValue(), messageSelector == null ? "" : messageSelector);
+ if(noLocal)
+ {
+ ft.put(AMQPFilterTypes.NO_LOCAL.getValue(), noLocal);
+ }
_arguments = ft;
@@ -275,7 +279,10 @@ public abstract class BasicMessageConsumer<U> extends Closeable implements Messa
throw new javax.jms.IllegalStateException("Attempt to alter listener while session is started.");
}
- _logger.debug("Message listener set for destination " + _destination);
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Message listener set for destination " + _destination);
+ }
if (messageListener != null)
{
@@ -553,9 +560,9 @@ public abstract class BasicMessageConsumer<U> extends Closeable implements Messa
public void close(boolean sendClose) throws JMSException
{
- if (_logger.isInfoEnabled())
+ if (_logger.isDebugEnabled())
{
- _logger.info("Closing consumer:" + debugIdentity());
+ _logger.debug("Closing consumer:" + debugIdentity());
}
if (!setClosed())
@@ -586,7 +593,10 @@ public abstract class BasicMessageConsumer<U> extends Closeable implements Messa
// no point otherwise as the connection will be gone
if (!_session.isClosed() || _session.isClosing())
{
- sendCancel();
+ synchronized(_session.getMessageDeliveryLock())
+ {
+ sendCancel();
+ }
cleanupQueue();
}
}
diff --git a/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer.java b/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer.java
index 75f198e1fa..9b3b2ce0e9 100644
--- a/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer.java
+++ b/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer.java
@@ -20,18 +20,8 @@
*/
package org.apache.qpid.client;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.qpid.AMQException;
-import org.apache.qpid.client.message.AbstractJMSMessage;
-import org.apache.qpid.client.message.MessageConverter;
-import org.apache.qpid.client.protocol.AMQProtocolHandler;
-import org.apache.qpid.framing.ContentBody;
-import org.apache.qpid.transport.TransportException;
-import org.apache.qpid.util.UUIDGen;
-import org.apache.qpid.util.UUIDs;
-
+import java.io.UnsupportedEncodingException;
+import java.util.UUID;
import javax.jms.BytesMessage;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
@@ -42,77 +32,22 @@ import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
-import java.io.UnsupportedEncodingException;
-import java.util.UUID;
+import javax.jms.Topic;
+import org.apache.qpid.AMQException;
+import org.apache.qpid.client.message.AbstractJMSMessage;
+import org.apache.qpid.client.message.MessageConverter;
+import org.apache.qpid.client.protocol.AMQProtocolHandler;
+import org.apache.qpid.transport.TransportException;
+import org.apache.qpid.util.UUIDGen;
+import org.apache.qpid.util.UUIDs;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public abstract class BasicMessageProducer extends Closeable implements org.apache.qpid.jms.MessageProducer
{
- /**
- * If true, messages will not get a timestamp.
- */
- protected boolean isDisableTimestamps()
- {
- return _disableTimestamps;
- }
-
- protected void setDisableTimestamps(boolean disableTimestamps)
- {
- _disableTimestamps = disableTimestamps;
- }
-
- protected void setDestination(AMQDestination destination)
- {
- _destination = destination;
- }
-
- protected AMQProtocolHandler getProtocolHandler()
- {
- return _protocolHandler;
- }
-
- protected void setProtocolHandler(AMQProtocolHandler protocolHandler)
- {
- _protocolHandler = protocolHandler;
- }
-
- protected int getChannelId()
- {
- return _channelId;
- }
-
- protected void setChannelId(int channelId)
- {
- _channelId = channelId;
- }
-
- protected void setSession(AMQSession session)
- {
- _session = session;
- }
-
- protected String getUserID()
- {
- return _userID;
- }
-
- protected void setUserID(String userID)
- {
- _userID = userID;
- }
-
- protected PublishMode getPublishMode()
- {
- return publishMode;
- }
-
- protected void setPublishMode(PublishMode publishMode)
- {
- this.publishMode = publishMode;
- }
-
enum PublishMode { ASYNC_PUBLISH_ALL, SYNC_PUBLISH_PERSISTENT, SYNC_PUBLISH_ALL };
- private final Logger _logger = LoggerFactory.getLogger(getClass());
+ private final Logger _logger ;
private AMQConnection _connection;
@@ -166,7 +101,7 @@ public abstract class BasicMessageProducer extends Closeable implements org.apac
private final boolean _immediate;
- private final boolean _mandatory;
+ private final Boolean _mandatory;
private boolean _disableMessageId;
@@ -174,14 +109,37 @@ public abstract class BasicMessageProducer extends Closeable implements org.apac
private String _userID; // ref user id used in the connection.
- private static final ContentBody[] NO_CONTENT_BODIES = new ContentBody[0];
+
+ /**
+ * The default value for immediate flag used this producer is false. That is, a consumer does
+ * not need to be attached to a queue.
+ */
+ private final boolean _defaultImmediateValue = Boolean.parseBoolean(System.getProperty("qpid.default_immediate", "false"));
+
+ /**
+ * The default value for mandatory flag used by this producer is true. That is, server will not
+ * silently drop messages where no queue is connected to the exchange for the message.
+ */
+ private final boolean _defaultMandatoryValue = Boolean.parseBoolean(System.getProperty("qpid.default_mandatory", "true"));
+
+ /**
+ * The default value for mandatory flag used by this producer when publishing to a Topic is false. That is, server
+ * will silently drop messages where no queue is connected to the exchange for the message.
+ */
+ private final boolean _defaultMandatoryTopicValue =
+ Boolean.parseBoolean(System.getProperty("qpid.default_mandatory_topic",
+ System.getProperties().containsKey("qpid.default_mandatory")
+ ? System.getProperty("qpid.default_mandatory")
+ : "false"));
private PublishMode publishMode = PublishMode.ASYNC_PUBLISH_ALL;
- protected BasicMessageProducer(AMQConnection connection, AMQDestination destination, boolean transacted, int channelId,
- AMQSession session, AMQProtocolHandler protocolHandler, long producerId, boolean immediate, boolean mandatory) throws AMQException
+ protected BasicMessageProducer(Logger logger,AMQConnection connection, AMQDestination destination, boolean transacted, int channelId,
+ AMQSession session, AMQProtocolHandler protocolHandler, long producerId,
+ Boolean immediate, Boolean mandatory) throws AMQException
{
- _connection = connection;
+ _logger = logger;
+ _connection = connection;
_destination = destination;
_transacted = transacted;
_protocolHandler = protocolHandler;
@@ -193,8 +151,14 @@ public abstract class BasicMessageProducer extends Closeable implements org.apac
declareDestination(destination);
}
- _immediate = immediate;
- _mandatory = mandatory;
+ _immediate = immediate == null ? _defaultImmediateValue : immediate;
+ _mandatory = mandatory == null
+ ? destination == null ? null
+ : destination instanceof Topic
+ ? _defaultMandatoryTopicValue
+ : _defaultMandatoryValue
+ : mandatory;
+
_userID = connection.getUsername();
setPublishMode();
}
@@ -215,7 +179,10 @@ public abstract class BasicMessageProducer extends Closeable implements org.apac
publishMode = PublishMode.SYNC_PUBLISH_ALL;
}
- _logger.info("MessageProducer " + toString() + " using publish mode : " + publishMode);
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("MessageProducer " + toString() + " using publish mode : " + publishMode);
+ }
}
void resubscribe() throws AMQException
@@ -381,7 +348,12 @@ public abstract class BasicMessageProducer extends Closeable implements org.apac
synchronized (_connection.getFailoverMutex())
{
validateDestination(destination);
- sendImpl((AMQDestination) destination, message, _deliveryMode, _messagePriority, _timeToLive, _mandatory,
+ sendImpl((AMQDestination) destination, message, _deliveryMode, _messagePriority, _timeToLive,
+ _mandatory == null
+ ? destination instanceof Topic
+ ? _defaultMandatoryTopicValue
+ : _defaultMandatoryValue
+ : _mandatory,
_immediate);
}
}
@@ -394,7 +366,13 @@ public abstract class BasicMessageProducer extends Closeable implements org.apac
synchronized (_connection.getFailoverMutex())
{
validateDestination(destination);
- sendImpl((AMQDestination) destination, message, deliveryMode, priority, timeToLive, _mandatory, _immediate);
+ sendImpl((AMQDestination) destination, message, deliveryMode, priority, timeToLive,
+ _mandatory == null
+ ? destination instanceof Topic
+ ? _defaultMandatoryTopicValue
+ : _defaultMandatoryValue
+ : _mandatory,
+ _immediate);
}
}
@@ -542,7 +520,10 @@ public abstract class BasicMessageProducer extends Closeable implements org.apac
_logger.debug("Updating original message");
origMessage.setJMSPriority(message.getJMSPriority());
origMessage.setJMSTimestamp(message.getJMSTimestamp());
- _logger.debug("Setting JMSExpiration:" + message.getJMSExpiration());
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Setting JMSExpiration:" + message.getJMSExpiration());
+ }
origMessage.setJMSExpiration(message.getJMSExpiration());
origMessage.setJMSMessageID(message.getJMSMessageID());
}
@@ -646,6 +627,69 @@ public abstract class BasicMessageProducer extends Closeable implements org.apac
}
}
+ /**
+ * If true, messages will not get a timestamp.
+ */
+ protected boolean isDisableTimestamps()
+ {
+ return _disableTimestamps;
+ }
+
+ protected void setDisableTimestamps(boolean disableTimestamps)
+ {
+ _disableTimestamps = disableTimestamps;
+ }
+
+ protected void setDestination(AMQDestination destination)
+ {
+ _destination = destination;
+ }
+
+ protected AMQProtocolHandler getProtocolHandler()
+ {
+ return _protocolHandler;
+ }
+
+ protected void setProtocolHandler(AMQProtocolHandler protocolHandler)
+ {
+ _protocolHandler = protocolHandler;
+ }
+
+ protected int getChannelId()
+ {
+ return _channelId;
+ }
+
+ protected void setChannelId(int channelId)
+ {
+ _channelId = channelId;
+ }
+
+ protected void setSession(AMQSession session)
+ {
+ _session = session;
+ }
+
+ protected String getUserID()
+ {
+ return _userID;
+ }
+
+ protected void setUserID(String userID)
+ {
+ _userID = userID;
+ }
+
+ protected PublishMode getPublishMode()
+ {
+ return publishMode;
+ }
+
+ protected void setPublishMode(PublishMode publishMode)
+ {
+ this.publishMode = publishMode;
+ }
+
Logger getLogger()
{
return _logger;
diff --git a/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_10.java b/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_10.java
index 024219cfd6..a3a1e9c28b 100644
--- a/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_10.java
+++ b/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_10.java
@@ -61,9 +61,9 @@ public class BasicMessageProducer_0_10 extends BasicMessageProducer
BasicMessageProducer_0_10(AMQConnection connection, AMQDestination destination, boolean transacted, int channelId,
AMQSession session, AMQProtocolHandler protocolHandler, long producerId,
- boolean immediate, boolean mandatory) throws AMQException
+ Boolean immediate, Boolean mandatory) throws AMQException
{
- super(connection, destination, transacted, channelId, session, protocolHandler, producerId, immediate, mandatory);
+ super(_logger, connection, destination, transacted, channelId, session, protocolHandler, producerId, immediate, mandatory);
userIDBytes = Strings.toUTF8(getUserID());
}
diff --git a/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_8.java b/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_8.java
index 3b5e361f97..21ff6c877a 100644
--- a/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_8.java
+++ b/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_8.java
@@ -33,6 +33,9 @@ import org.apache.qpid.framing.ContentHeaderBody;
import org.apache.qpid.framing.ExchangeDeclareBody;
import org.apache.qpid.framing.MethodRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
@@ -42,11 +45,12 @@ import java.util.UUID;
public class BasicMessageProducer_0_8 extends BasicMessageProducer
{
+ private static final Logger _logger = LoggerFactory.getLogger(BasicMessageProducer_0_8.class);
BasicMessageProducer_0_8(AMQConnection connection, AMQDestination destination, boolean transacted, int channelId,
- AMQSession session, AMQProtocolHandler protocolHandler, long producerId, boolean immediate, boolean mandatory) throws AMQException
+ AMQSession session, AMQProtocolHandler protocolHandler, long producerId, Boolean immediate, Boolean mandatory) throws AMQException
{
- super(connection, destination,transacted,channelId,session, protocolHandler, producerId, immediate, mandatory);
+ super(_logger,connection, destination,transacted,channelId,session, protocolHandler, producerId, immediate, mandatory);
}
void declareDestination(AMQDestination destination)
diff --git a/java/client/src/main/java/org/apache/qpid/client/Closeable.java b/java/client/src/main/java/org/apache/qpid/client/Closeable.java
index ba26bfc485..2f7fbad30c 100644
--- a/java/client/src/main/java/org/apache/qpid/client/Closeable.java
+++ b/java/client/src/main/java/org/apache/qpid/client/Closeable.java
@@ -81,7 +81,7 @@ public abstract class Closeable
}
/**
- * Checks if this is closis.
+ * Checks if this is closing.
*
* @return <tt>true</tt> if we are closing, <tt>false</tt> otherwise.
*/
@@ -90,6 +90,11 @@ public abstract class Closeable
return _closing.get();
}
+ public void resetClosedFlag()
+ {
+ _closed.set(false);
+ }
+
protected boolean setClosed()
{
return _closed.getAndSet(true);
diff --git a/java/client/src/main/java/org/apache/qpid/client/XAResourceImpl.java b/java/client/src/main/java/org/apache/qpid/client/XAResourceImpl.java
index 128aa18d30..af9048f1f5 100644
--- a/java/client/src/main/java/org/apache/qpid/client/XAResourceImpl.java
+++ b/java/client/src/main/java/org/apache/qpid/client/XAResourceImpl.java
@@ -308,13 +308,16 @@ public class XAResourceImpl implements XAResource
_xaSession.createSession();
convertExecutionErrorToXAErr( e.getException().getErrorCode());
}
- Xid[] result = new Xid[res.getInDoubt().size()];
- int i = 0;
- for (Object obj : res.getInDoubt())
+ Xid[] result = new Xid[res.getInDoubt() != null ? res.getInDoubt().size() : 0];
+ if(result.length != 0)
{
- org.apache.qpid.transport.Xid xid = (org.apache.qpid.transport.Xid) obj;
- result[i] = new XidImpl(xid.getBranchId(), (int) xid.getFormat(), xid.getGlobalId());
- i++;
+ int i = 0;
+ for (Object obj : res.getInDoubt())
+ {
+ org.apache.qpid.transport.Xid xid = (org.apache.qpid.transport.Xid) obj;
+ result[i] = new XidImpl(xid.getBranchId(), (int) xid.getFormat(), xid.getGlobalId());
+ i++;
+ }
}
return result;
}
@@ -436,6 +439,16 @@ public class XAResourceImpl implements XAResource
}
}
+ /**
+ * Is this resource currently enlisted in a transaction?
+ *
+ * @return true if the resource is associated with a transaction, false otherwise.
+ */
+ public boolean isEnlisted()
+ {
+ return (_xid != null) ;
+ }
+
//------------------------------------------------------------------------
// Private methods
//------------------------------------------------------------------------
diff --git a/java/client/src/main/java/org/apache/qpid/client/XASessionImpl.java b/java/client/src/main/java/org/apache/qpid/client/XASessionImpl.java
index 85623df8c0..f2efb6e8a5 100644
--- a/java/client/src/main/java/org/apache/qpid/client/XASessionImpl.java
+++ b/java/client/src/main/java/org/apache/qpid/client/XASessionImpl.java
@@ -6,7 +6,7 @@
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE 2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
@@ -18,6 +18,7 @@
package org.apache.qpid.client;
import org.apache.qpid.client.message.MessageFactoryRegistry;
+import org.apache.qpid.transport.RangeSet;
import javax.jms.JMSException;
import javax.jms.QueueSession;
@@ -178,4 +179,17 @@ public class XASessionImpl extends AMQSession_0_10 implements XASession, XATopic
{
return (TopicSession) getSession();
}
+
+ @Override
+ protected void acknowledgeImpl()
+ {
+ if (_xaResource.isEnlisted())
+ {
+ acknowledgeMessage(Long.MAX_VALUE, true) ;
+ }
+ else
+ {
+ super.acknowledgeImpl() ;
+ }
+ }
}
diff --git a/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl.java b/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl.java
index 558d93538b..e1a0e18262 100644
--- a/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl.java
+++ b/java/client/src/main/java/org/apache/qpid/client/handler/ClientMethodDispatcherImpl.java
@@ -95,9 +95,9 @@ public class ClientMethodDispatcherImpl implements MethodDispatcher
public static ClientMethodDispatcherImpl newMethodDispatcher(ProtocolVersion version, AMQProtocolSession session)
{
- if (_logger.isInfoEnabled())
+ if (_logger.isDebugEnabled())
{
- _logger.info("New Method Dispatcher:" + session);
+ _logger.debug("New Method Dispatcher:" + session);
}
DispatcherFactory factory = _dispatcherFactories.get(version);
diff --git a/java/client/src/main/java/org/apache/qpid/client/message/FieldTableSupport.java b/java/client/src/main/java/org/apache/qpid/client/message/FieldTableSupport.java
index 31a0440b04..bd63cdb5c5 100644
--- a/java/client/src/main/java/org/apache/qpid/client/message/FieldTableSupport.java
+++ b/java/client/src/main/java/org/apache/qpid/client/message/FieldTableSupport.java
@@ -48,9 +48,12 @@ public class FieldTableSupport
public static Map<String,Object> convertToMap(FieldTable ft)
{
Map<String,Object> map = new HashMap<String,Object>();
- for (AMQShortString key: ft.keySet() )
+ if(ft != null)
{
- map.put(key.asString(), ft.getObject(key));
+ for (AMQShortString key: ft.keySet() )
+ {
+ map.put(key.asString(), ft.getObject(key));
+ }
}
return map;
diff --git a/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java b/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java
index d380402da7..b314453e31 100644
--- a/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java
+++ b/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java
@@ -652,7 +652,8 @@ public class AMQProtocolHandler implements ProtocolEngine
}
writeFrame(frame);
- return listener.blockForFrame(timeout);
+ long actualTimeout = timeout == -1 ? DEFAULT_SYNC_TIMEOUT : timeout;
+ return listener.blockForFrame(actualTimeout);
// When control resumes before this line, a reply will have been received
// that matches the criteria defined in the blocking listener
}
diff --git a/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolSession.java b/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolSession.java
index ced734f70f..af57fd98fc 100644
--- a/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolSession.java
+++ b/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolSession.java
@@ -108,7 +108,10 @@ public class AMQProtocolSession implements AMQVersionAwareProtocolSession
{
_protocolHandler = protocolHandler;
_protocolVersion = connection.getProtocolVersion();
- _logger.info("Using ProtocolVersion for Session:" + _protocolVersion);
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Using ProtocolVersion for Session:" + _protocolVersion);
+ }
_methodDispatcher = ClientMethodDispatcherImpl.newMethodDispatcher(ProtocolVersion.getLatestSupportedVersion(),
this);
_connection = connection;
@@ -302,7 +305,10 @@ public class AMQProtocolSession implements AMQVersionAwareProtocolSession
*/
public void closeSession(AMQSession session)
{
- _logger.debug("closeSession called on protocol session for session " + session.getChannelId());
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("closeSession called on protocol session for session " + session.getChannelId());
+ }
final int channelId = session.getChannelId();
if (channelId <= 0)
{
@@ -393,7 +399,10 @@ public class AMQProtocolSession implements AMQVersionAwareProtocolSession
public void setProtocolVersion(final ProtocolVersion pv)
{
- _logger.info("Setting ProtocolVersion to :" + pv);
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Setting ProtocolVersion to :" + pv);
+ }
_protocolVersion = pv;
_methodRegistry = MethodRegistry.getMethodRegistry(pv);
_methodDispatcher = ClientMethodDispatcherImpl.newMethodDispatcher(pv, this);
diff --git a/java/client/src/main/java/org/apache/qpid/client/util/BlockingWaiter.java b/java/client/src/main/java/org/apache/qpid/client/util/BlockingWaiter.java
index 80d171592f..22dc17e53c 100644
--- a/java/client/src/main/java/org/apache/qpid/client/util/BlockingWaiter.java
+++ b/java/client/src/main/java/org/apache/qpid/client/util/BlockingWaiter.java
@@ -39,7 +39,7 @@ import java.util.concurrent.locks.ReentrantLock;
* differs from a 'rendezvous' in that sense.
*
* <p/>BlockingWaiters are used to coordinate when waiting for an an event that expect a response.
- * They are always used in a 'one-shot' manner, that is, to recieve just one response. Usually the caller has to register
+ * They are always used in a 'one-shot' manner, that is, to receive just one response. Usually the caller has to register
* them as method listeners with an event dispatcher and remember to de-register them (in a finally block) once they
* have been completed.
*
@@ -51,12 +51,12 @@ import java.util.concurrent.locks.ReentrantLock;
* <p/><table id="crc"><caption>CRC Card</caption>
* <tr><th> Responsibilities <th> Collaborations </td>
* <tr><td> Accept generic objects as events for processing via {@link #process}. <td>
- * <tr><td> Delegate handling and undserstanding of the object to a concrete implementation. <td>
+ * <tr><td> Delegate handling and understanding of the object to a concrete implementation. <td>
* <tr><td> Block until {@link #process} determines that waiting is no longer required <td>
* <tr><td> Propagate the most recent exception to the consumer.<td>
* </table>
*
- * @todo Interuption is caught but not handled. This could be allowed to fall through. This might actually be usefull
+ * @todo Interruption is caught but not handled. This could be allowed to fall through. This might actually be useful
* for fail-over where a thread is blocking when failure happens, it could be interrupted to abandon or retry
* when this happens. At the very least, restore the interrupted status flag.
* @todo If the retrotranslator can handle it, could use a SynchronousQueue to implement this rendezvous. Need to
@@ -84,13 +84,13 @@ public abstract class BlockingWaiter<T>
/** Used to hold the most recent exception that is passed to the {@link #error(Exception)} method. */
private volatile Exception _error;
- /** Holds the incomming Object. */
+ /** Holds the incoming Object. */
private Object _doneObject = null;
private AtomicBoolean _waiting = new AtomicBoolean(false);
private boolean _closed = false;
/**
- * Delegates processing of the incomming object to the handler.
+ * Delegates processing of the incoming object to the handler.
*
* @param object The object to process.
*
@@ -146,6 +146,11 @@ public abstract class BlockingWaiter<T>
*/
public Object block(long timeout) throws AMQException, FailoverException
{
+ if (timeout < 0)
+ {
+ throw new IllegalArgumentException("timeout must be zero or greater");
+ }
+
long nanoTimeout = TimeUnit.MILLISECONDS.toNanos(timeout);
_lock.lock();
@@ -165,26 +170,18 @@ public abstract class BlockingWaiter<T>
{
try
{
- if (timeout == -1)
- {
- _receivedCondition.await();
- }
- else
- {
- nanoTimeout = _receivedCondition.awaitNanos(nanoTimeout);
+ nanoTimeout = _receivedCondition.awaitNanos(nanoTimeout);
- if (nanoTimeout <= 0 && !_ready && _error == null)
- {
- _error = new AMQTimeoutException("Server did not respond in a timely fashion", null);
- _ready = true;
- }
+ if (nanoTimeout <= 0 && !_ready && _error == null)
+ {
+ _error = new AMQTimeoutException("Server did not respond in a timely fashion", null);
+ _ready = true;
}
}
catch (InterruptedException e)
{
_logger.error(e.getMessage(), e);
- // IGNORE -- //fixme this isn't ideal as being interrupted isn't equivellant to sucess
-
+ // IGNORE -- //fixme this isn't ideal as being interrupted isn't equivalent to success
}
}
}
@@ -285,8 +282,8 @@ public abstract class BlockingWaiter<T>
/**
* Close this Waiter so that no more errors are processed.
* This is a preventative method to ensure that a second error thread does not get stuck in the error method after
- * the await has returned. This has not happend but in practise but if two errors occur on the Connection at
- * the same time then it is conceiveably possible for the second to get stuck if the first one is processed by a
+ * the await has returned. This has not happened but in practise but if two errors occur on the Connection at
+ * the same time then it is conceivably possible for the second to get stuck if the first one is processed by a
* waiter.
*
* Once closed any attempt to wait will throw an exception.
diff --git a/java/client/src/main/java/org/apache/qpid/jndi/PropertiesFileInitialContextFactory.java b/java/client/src/main/java/org/apache/qpid/jndi/PropertiesFileInitialContextFactory.java
index bc3f89849e..9b202a13ee 100644
--- a/java/client/src/main/java/org/apache/qpid/jndi/PropertiesFileInitialContextFactory.java
+++ b/java/client/src/main/java/org/apache/qpid/jndi/PropertiesFileInitialContextFactory.java
@@ -20,8 +20,26 @@
*/
package org.apache.qpid.jndi;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.Queue;
+import javax.jms.Topic;
+import javax.naming.ConfigurationException;
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.spi.InitialContextFactory;
import org.apache.qpid.client.AMQConnectionFactory;
import org.apache.qpid.client.AMQDestination;
@@ -33,23 +51,10 @@ import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.url.BindingURL;
import org.apache.qpid.url.URLSyntaxException;
import org.apache.qpid.util.Strings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
-import javax.jms.ConnectionFactory;
-import javax.jms.Destination;
-import javax.jms.Queue;
-import javax.jms.Topic;
-import javax.naming.ConfigurationException;
-import javax.naming.Context;
-import javax.naming.NamingException;
-import javax.naming.spi.InitialContextFactory;
-import java.io.BufferedInputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.ConcurrentHashMap;
public class PropertiesFileInitialContextFactory implements InitialContextFactory
{
@@ -60,6 +65,7 @@ public class PropertiesFileInitialContextFactory implements InitialContextFactor
private String QUEUE_PREFIX = "queue.";
private String TOPIC_PREFIX = "topic.";
+ @SuppressWarnings({ "rawtypes", "unchecked" })
public Context getInitialContext(Hashtable environment) throws NamingException
{
Map data = new ConcurrentHashMap();
@@ -68,6 +74,7 @@ public class PropertiesFileInitialContextFactory implements InitialContextFactor
{
String file = null;
+
if (environment.containsKey(Context.PROVIDER_URL))
{
file = (String) environment.get(Context.PROVIDER_URL);
@@ -77,13 +84,23 @@ public class PropertiesFileInitialContextFactory implements InitialContextFactor
file = System.getProperty(Context.PROVIDER_URL);
}
+ // Load the properties specified
if (file != null)
{
_logger.info("Loading Properties from:" + file);
+ BufferedInputStream inputStream = null;
- // Load the properties specified
- BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));
+ if(file.contains("file:"))
+ {
+ inputStream = new BufferedInputStream(new FileInputStream(new File(new URI(file))));
+ }
+ else
+ {
+ inputStream = new BufferedInputStream(new FileInputStream(file));
+ }
+
Properties p = new Properties();
+
try
{
p.load(inputStream);
@@ -119,6 +136,11 @@ public class PropertiesFileInitialContextFactory implements InitialContextFactor
_logger.warn("Unable to load property file specified in Provider_URL:" + environment.get(Context.PROVIDER_URL) +"\n" +
"Due to:"+ioe.getMessage());
}
+ catch(URISyntaxException uoe)
+ {
+ _logger.warn("Unable to load property file specified in Provider_URL:" + environment.get(Context.PROVIDER_URL) +"\n" +
+ "Due to:"+uoe.getMessage());
+ }
createConnectionFactories(data, environment);
diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/jndi/JNDITest.properties b/java/client/src/test/java/org/apache/qpid/jndi/JNDITest.properties
index 07017a05a6..07017a05a6 100644
--- a/java/client/src/test/java/org/apache/qpid/test/unit/jndi/JNDITest.properties
+++ b/java/client/src/test/java/org/apache/qpid/jndi/JNDITest.properties
diff --git a/java/client/src/test/java/org/apache/qpid/jndi/PropertiesFileInitialContextFactoryTest.java b/java/client/src/test/java/org/apache/qpid/jndi/PropertiesFileInitialContextFactoryTest.java
new file mode 100644
index 0000000000..2989970dcd
--- /dev/null
+++ b/java/client/src/test/java/org/apache/qpid/jndi/PropertiesFileInitialContextFactoryTest.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *
+ */
+package org.apache.qpid.jndi;
+
+
+import java.util.Properties;
+
+import javax.jms.Destination;
+import javax.jms.Queue;
+import javax.jms.Topic;
+import javax.naming.ConfigurationException;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.framing.AMQShortString;
+
+public class PropertiesFileInitialContextFactoryTest extends TestCase
+{
+ private static final String FILE_URL_PATH = System.getProperty("user.dir") + "/client/src/test/java/org/apache/qpid/jndi/";
+ private static final String FILE_NAME = "hello.properties";
+
+ private Context ctx;
+
+ protected void setUp() throws Exception
+ {
+ Properties properties = new Properties();
+ properties.load(this.getClass().getResourceAsStream("JNDITest.properties"));
+
+ //Create the initial context
+ ctx = new InitialContext(properties);
+ }
+
+
+ public void testQueueNamesWithTrailingSpaces() throws Exception
+ {
+ Queue queue = (Queue)ctx.lookup("QueueNameWithSpace");
+ assertEquals("QueueNameWithSpace",queue.getQueueName());
+ }
+
+ public void testTopicNamesWithTrailingSpaces() throws Exception
+ {
+ Topic topic = (Topic)ctx.lookup("TopicNameWithSpace");
+ assertEquals("TopicNameWithSpace",topic.getTopicName());
+ }
+
+ public void testMultipleTopicNamesWithTrailingSpaces() throws Exception
+ {
+ Topic topic = (Topic)ctx.lookup("MultipleTopicNamesWithSpace");
+ int i = 0;
+ for (AMQShortString bindingKey: ((AMQDestination)topic).getBindingKeys())
+ {
+ i++;
+ assertEquals("Topic" + i + "WithSpace",bindingKey.asString());
+ }
+ }
+
+ public void testConfigurationErrors() throws Exception
+ {
+ Properties properties = new Properties();
+ properties.put("java.naming.factory.initial", "org.apache.qpid.jndi.PropertiesFileInitialContextFactory");
+ properties.put("destination.my-queue","amq.topic/test;create:always}");
+
+ try
+ {
+ ctx = new InitialContext(properties);
+ fail("A configuration exception should be thrown with details about the address syntax error");
+ }
+ catch(ConfigurationException e)
+ {
+ assertTrue("Incorrect exception", e.getMessage().contains("Failed to parse entry: amq.topic/test;create:always}"));
+ }
+
+ }
+}
diff --git a/java/client/src/test/java/org/apache/qpid/jndi/hello.properties b/java/client/src/test/java/org/apache/qpid/jndi/hello.properties
new file mode 100644
index 0000000000..d017d137fe
--- /dev/null
+++ b/java/client/src/test/java/org/apache/qpid/jndi/hello.properties
@@ -0,0 +1,27 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+
+# register some connection factories
+# connectionfactory.[jndiname] = [ConnectionURL]
+connectionfactory.qpidConnectionfactory = amqp://guest:guest@clientid/test?brokerlist='tcp://10.0.1.46:5672'
+
+# Register an AMQP destination in JNDI
+# destination.[jniName] = [Address Format]
+destination.topicExchange = amq.topic
diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/jndi/JNDIPropertyFileTest.java b/java/client/src/test/java/org/apache/qpid/test/unit/jndi/JNDIPropertyFileTest.java
deleted file mode 100644
index 576ab4fa05..0000000000
--- a/java/client/src/test/java/org/apache/qpid/test/unit/jndi/JNDIPropertyFileTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- *
- */
-package org.apache.qpid.test.unit.jndi;
-
-import junit.framework.TestCase;
-
-import org.apache.qpid.client.AMQDestination;
-import org.apache.qpid.framing.AMQShortString;
-
-import javax.jms.Queue;
-import javax.jms.Topic;
-import javax.naming.ConfigurationException;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import java.util.Properties;
-
-public class JNDIPropertyFileTest extends TestCase
-{
- private Context ctx;
-
- public JNDIPropertyFileTest() throws Exception
- {
- Properties properties = new Properties();
- properties.load(this.getClass().getResourceAsStream("JNDITest.properties"));
-
- //Create the initial context
- ctx = new InitialContext(properties);
- }
-
- public void testQueueNamesWithTrailingSpaces() throws Exception
- {
- Queue queue = (Queue)ctx.lookup("QueueNameWithSpace");
- assertEquals("QueueNameWithSpace",queue.getQueueName());
- }
-
- public void testTopicNamesWithTrailingSpaces() throws Exception
- {
- Topic topic = (Topic)ctx.lookup("TopicNameWithSpace");
- assertEquals("TopicNameWithSpace",topic.getTopicName());
- }
-
- public void testMultipleTopicNamesWithTrailingSpaces() throws Exception
- {
- Topic topic = (Topic)ctx.lookup("MultipleTopicNamesWithSpace");
- int i = 0;
- for (AMQShortString bindingKey: ((AMQDestination)topic).getBindingKeys())
- {
- i++;
- assertEquals("Topic" + i + "WithSpace",bindingKey.asString());
- }
- }
-
- public void testConfigurationErrors() throws Exception
- {
- Properties properties = new Properties();
- properties.put("java.naming.factory.initial", "org.apache.qpid.jndi.PropertiesFileInitialContextFactory");
- properties.put("destination.my-queue","amq.topic/test;create:always}");
-
- try
- {
- ctx = new InitialContext(properties);
- fail("A configuration exception should be thrown with details about the address syntax error");
- }
- catch(ConfigurationException e)
- {
- assertTrue("Incorrect exception", e.getMessage().contains("Failed to parse entry: amq.topic/test;create:always}"));
- }
-
- }
-}
diff --git a/java/client/src/test/java/org/apache/qpid/test/unit/message/TestAMQSession.java b/java/client/src/test/java/org/apache/qpid/test/unit/message/TestAMQSession.java
index 84d91ee57e..f199961b6f 100644
--- a/java/client/src/test/java/org/apache/qpid/test/unit/message/TestAMQSession.java
+++ b/java/client/src/test/java/org/apache/qpid/test/unit/message/TestAMQSession.java
@@ -145,7 +145,7 @@ public class TestAMQSession extends AMQSession_0_8
}
public void sendQueueDeclare(AMQDestination amqd, AMQProtocolHandler protocolHandler,
- boolean nowait) throws AMQException, FailoverException
+ boolean nowait, boolean passive) throws AMQException, FailoverException
{
}
diff --git a/java/common.xml b/java/common.xml
index 4e9e2d1598..2059e0aeb9 100644
--- a/java/common.xml
+++ b/java/common.xml
@@ -23,7 +23,7 @@
<dirname property="project.root" file="${ant.file.common}"/>
<property name="project.name" value="qpid"/>
- <property name="project.version" value="0.15"/>
+ <property name="project.version" value="0.17"/>
<property name="project.url" value="http://qpid.apache.org"/>
<property name="project.groupid" value="org.apache.qpid"/>
<property name="project.namever" value="${project.name}-${project.version}"/>
diff --git a/java/common/src/main/java/common.bnd b/java/common/src/main/java/common.bnd
index 64e80c9b43..9149986aa3 100755
--- a/java/common/src/main/java/common.bnd
+++ b/java/common/src/main/java/common.bnd
@@ -17,7 +17,7 @@
# under the License.
#
-ver: 0.15.0
+ver: 0.17.0
Bundle-SymbolicName: qpid-common
Bundle-Version: ${ver}
diff --git a/java/common/src/main/java/org/apache/qpid/codec/MarkableDataInput.java b/java/common/src/main/java/org/apache/qpid/codec/MarkableDataInput.java
index 2a243a810d..a1513135a3 100644
--- a/java/common/src/main/java/org/apache/qpid/codec/MarkableDataInput.java
+++ b/java/common/src/main/java/org/apache/qpid/codec/MarkableDataInput.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.codec;
import org.apache.qpid.framing.AMQShortString;
diff --git a/java/common/src/main/java/org/apache/qpid/common/AMQPFilterTypes.java b/java/common/src/main/java/org/apache/qpid/common/AMQPFilterTypes.java
index 9ed915cc35..57cd2a1ff5 100644
--- a/java/common/src/main/java/org/apache/qpid/common/AMQPFilterTypes.java
+++ b/java/common/src/main/java/org/apache/qpid/common/AMQPFilterTypes.java
@@ -34,11 +34,13 @@ public enum AMQPFilterTypes
{
JMS_SELECTOR("x-filter-jms-selector"),
NO_CONSUME("x-filter-no-consume"),
- AUTO_CLOSE("x-filter-auto-close");
+ AUTO_CLOSE("x-filter-auto-close"),
+ NO_LOCAL("x-qpid-no-local");
/** The identifying string for the filter type. */
private final AMQShortString _value;
+
/**
* Creates a new filter type from its identifying string.
*
diff --git a/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java b/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java
index 85870e68c5..fdc71e31f9 100644
--- a/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java
+++ b/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java
@@ -858,4 +858,9 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt
}
}
+ public static String toString(AMQShortString amqShortString)
+ {
+ return amqShortString == null ? null : amqShortString.asString();
+ }
+
}
diff --git a/java/common/src/main/java/org/apache/qpid/framing/ByteArrayDataInput.java b/java/common/src/main/java/org/apache/qpid/framing/ByteArrayDataInput.java
index 196ab422a3..854f77e135 100644
--- a/java/common/src/main/java/org/apache/qpid/framing/ByteArrayDataInput.java
+++ b/java/common/src/main/java/org/apache/qpid/framing/ByteArrayDataInput.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.framing;
import org.apache.qpid.codec.MarkableDataInput;
diff --git a/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java b/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java
index a0ed90244d..f6fa89a91c 100644
--- a/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java
+++ b/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java
@@ -75,17 +75,6 @@ public class ContentHeaderBody implements AMQBody
return TYPE;
}
- protected void populateFromBuffer(DataInputStream buffer, long size)
- throws AMQFrameDecodingException, AMQProtocolVersionException, IOException
- {
- classId = buffer.readUnsignedShort();
- weight = buffer.readUnsignedShort();
- bodySize = buffer.readLong();
- int propertyFlags = buffer.readUnsignedShort();
- ContentHeaderPropertiesFactory factory = ContentHeaderPropertiesFactory.getInstance();
- properties = factory.createContentHeaderProperties(classId, propertyFlags, buffer, (int)size - 14);
- }
-
/**
* Helper method that is used currently by the persistence layer (by BDB at the moment).
* @param buffer
diff --git a/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java b/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
index 6d05c2fd3a..1ecd8a13b7 100644
--- a/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
+++ b/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
@@ -264,7 +264,6 @@ public class EncodingUtils
public static void writeLongStringBytes(DataOutput buffer, String s) throws IOException
{
- assert (s == null) || (s.length() <= 0xFFFE);
if (s != null)
{
int len = s.length();
@@ -286,7 +285,6 @@ public class EncodingUtils
public static void writeLongStringBytes(DataOutput buffer, char[] s) throws IOException
{
- assert (s == null) || (s.length <= 0xFFFE);
if (s != null)
{
int len = s.length;
@@ -307,7 +305,6 @@ public class EncodingUtils
public static void writeLongStringBytes(DataOutput buffer, byte[] bytes) throws IOException
{
- assert (bytes == null) || (bytes.length <= 0xFFFE);
if (bytes != null)
{
writeUnsignedInteger(buffer, bytes.length);
diff --git a/java/common/src/main/java/org/apache/qpid/framing/ExtendedDataInput.java b/java/common/src/main/java/org/apache/qpid/framing/ExtendedDataInput.java
index c789d9275e..04c1677892 100644
--- a/java/common/src/main/java/org/apache/qpid/framing/ExtendedDataInput.java
+++ b/java/common/src/main/java/org/apache/qpid/framing/ExtendedDataInput.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.framing;
import java.io.DataInput;
diff --git a/java/common/src/main/java/org/apache/qpid/properties/ConnectionStartProperties.java b/java/common/src/main/java/org/apache/qpid/properties/ConnectionStartProperties.java
index 0215c87618..15c144b0eb 100644
--- a/java/common/src/main/java/org/apache/qpid/properties/ConnectionStartProperties.java
+++ b/java/common/src/main/java/org/apache/qpid/properties/ConnectionStartProperties.java
@@ -74,14 +74,19 @@ public class ConnectionStartProperties
public static String getPlatformInfo()
{
- StringBuffer fullSystemInfo = new StringBuffer();
- fullSystemInfo.append(System.getProperty("java.runtime.name"));
- fullSystemInfo.append(", " + System.getProperty("java.runtime.version"));
- fullSystemInfo.append(", " + System.getProperty("java.vendor"));
- fullSystemInfo.append(", " + System.getProperty("os.arch"));
- fullSystemInfo.append(", " + System.getProperty("os.name"));
- fullSystemInfo.append(", " + System.getProperty("os.version"));
- fullSystemInfo.append(", " + System.getProperty("sun.os.patch.level"));
+ StringBuilder fullSystemInfo = new StringBuilder(System.getProperty("java.runtime.name"));
+ fullSystemInfo.append(", ");
+ fullSystemInfo.append(System.getProperty("java.runtime.version"));
+ fullSystemInfo.append(", ");
+ fullSystemInfo.append(System.getProperty("java.vendor"));
+ fullSystemInfo.append(", ");
+ fullSystemInfo.append(System.getProperty("os.arch"));
+ fullSystemInfo.append(", ");
+ fullSystemInfo.append(System.getProperty("os.name"));
+ fullSystemInfo.append(", ");
+ fullSystemInfo.append(System.getProperty("os.version"));
+ fullSystemInfo.append(", ");
+ fullSystemInfo.append(System.getProperty("sun.os.patch.level"));
return fullSystemInfo.toString();
}
diff --git a/java/common/src/main/java/org/apache/qpid/transport/Connection.java b/java/common/src/main/java/org/apache/qpid/transport/Connection.java
index b0f1a1bad8..2cd6a6e465 100644
--- a/java/common/src/main/java/org/apache/qpid/transport/Connection.java
+++ b/java/common/src/main/java/org/apache/qpid/transport/Connection.java
@@ -216,6 +216,7 @@ public class Connection extends ConnectionInvoker
conSettings = settings;
state = OPENING;
userID = settings.getUsername();
+ connectionLost.set(false);
securityLayer = SecurityLayerFactory.newInstance(getConnectionSettings());
diff --git a/java/common/src/main/java/org/apache/qpid/transport/NetworkTransportConfiguration.java b/java/common/src/main/java/org/apache/qpid/transport/NetworkTransportConfiguration.java
index 8d3f7a779a..472beb6bb1 100644
--- a/java/common/src/main/java/org/apache/qpid/transport/NetworkTransportConfiguration.java
+++ b/java/common/src/main/java/org/apache/qpid/transport/NetworkTransportConfiguration.java
@@ -20,6 +20,8 @@
*/
package org.apache.qpid.transport;
+import java.net.InetSocketAddress;
+
/**
* This interface provides a means for NetworkDrivers to configure TCP options such as incoming and outgoing
* buffer sizes and set particular options on the socket. NetworkDrivers should honour the values returned
@@ -43,4 +45,6 @@ public interface NetworkTransportConfiguration
String getTransport();
Integer getConnectorProcessors();
+
+ InetSocketAddress getAddress();
}
diff --git a/java/common/src/main/java/org/apache/qpid/transport/Range.java b/java/common/src/main/java/org/apache/qpid/transport/Range.java
index 8380744024..413ec8e8fd 100644
--- a/java/common/src/main/java/org/apache/qpid/transport/Range.java
+++ b/java/common/src/main/java/org/apache/qpid/transport/Range.java
@@ -122,6 +122,11 @@ public abstract class Range implements RangeSet
throw new UnsupportedOperationException();
}
+ public void subtract(RangeSet rangeSet)
+ {
+ throw new UnsupportedOperationException();
+ }
+
public RangeSet copy()
{
RangeSet rangeSet = RangeSetFactory.createRangeSet();
diff --git a/java/common/src/main/java/org/apache/qpid/transport/RangeSet.java b/java/common/src/main/java/org/apache/qpid/transport/RangeSet.java
index 8737df88d6..19990a4610 100644
--- a/java/common/src/main/java/org/apache/qpid/transport/RangeSet.java
+++ b/java/common/src/main/java/org/apache/qpid/transport/RangeSet.java
@@ -49,6 +49,8 @@ public interface RangeSet extends Iterable<Range>
void add(int value);
+ void subtract(final RangeSet other);
+
void clear();
RangeSet copy();
diff --git a/java/common/src/main/java/org/apache/qpid/transport/RangeSetImpl.java b/java/common/src/main/java/org/apache/qpid/transport/RangeSetImpl.java
index 3e24c10a06..adf18e2920 100644
--- a/java/common/src/main/java/org/apache/qpid/transport/RangeSetImpl.java
+++ b/java/common/src/main/java/org/apache/qpid/transport/RangeSetImpl.java
@@ -150,6 +150,68 @@ public class RangeSetImpl implements RangeSet
ranges.clear();
}
+ public void subtract(final RangeSet other)
+ {
+ final Iterator<Range> otherIter = other.iterator() ;
+ if (otherIter.hasNext())
+ {
+ Range otherRange = otherIter.next();
+ final ListIterator<Range> iter = ranges.listIterator() ;
+ if (iter.hasNext())
+ {
+ Range range = iter.next();
+ do
+ {
+ if (otherRange.getUpper() < range.getLower())
+ {
+ otherRange = nextRange(otherIter) ;
+ }
+ else if (range.getUpper() < otherRange.getLower())
+ {
+ range = nextRange(iter) ;
+ }
+ else
+ {
+ final boolean first = range.getLower() < otherRange.getLower() ;
+ final boolean second = otherRange.getUpper() < range.getUpper() ;
+
+ if (first)
+ {
+ iter.set(Range.newInstance(range.getLower(), otherRange.getLower()-1)) ;
+ if (second)
+ {
+ iter.add(Range.newInstance(otherRange.getUpper()+1, range.getUpper())) ;
+ iter.previous() ;
+ range = iter.next() ;
+ }
+ else
+ {
+ range = nextRange(iter) ;
+ }
+ }
+ else if (second)
+ {
+ range = Range.newInstance(otherRange.getUpper()+1, range.getUpper()) ;
+ iter.set(range) ;
+ otherRange = nextRange(otherIter) ;
+ }
+ else
+ {
+ iter.remove() ;
+ range = nextRange(iter) ;
+ }
+ }
+ }
+ while ((otherRange != null) && (range != null)) ;
+ }
+ }
+ }
+
+ private Range nextRange(final Iterator<Range> iter)
+ {
+ return (iter.hasNext() ? iter.next() : null) ;
+ }
+
public RangeSet copy()
{
return new org.apache.qpid.transport.RangeSetImpl(this);
diff --git a/java/common/src/main/java/org/apache/qpid/transport/ServerDelegate.java b/java/common/src/main/java/org/apache/qpid/transport/ServerDelegate.java
index d30e48ad85..ec409d1c72 100644
--- a/java/common/src/main/java/org/apache/qpid/transport/ServerDelegate.java
+++ b/java/common/src/main/java/org/apache/qpid/transport/ServerDelegate.java
@@ -191,17 +191,11 @@ public class ServerDelegate extends ConnectionDelegate
@Override
public void sessionAttach(Connection conn, SessionAttach atc)
{
- sessionAttachImpl(conn, atc);
- }
-
- protected Session sessionAttachImpl(Connection conn, SessionAttach atc)
- {
Session ssn = getSession(conn, atc);
conn.map(ssn, atc.getChannel());
+ conn.registerSession(ssn);
ssn.sessionAttached(atc.getName());
ssn.setState(Session.State.OPEN);
-
- return ssn;
}
protected void setConnectionTuneOkChannelMax(final Connection conn, final int okChannelMax)
diff --git a/java/common/src/main/java/org/apache/qpid/transport/Session.java b/java/common/src/main/java/org/apache/qpid/transport/Session.java
index d450746eaa..110c73f718 100644
--- a/java/common/src/main/java/org/apache/qpid/transport/Session.java
+++ b/java/common/src/main/java/org/apache/qpid/transport/Session.java
@@ -161,7 +161,7 @@ public class Session extends SessionInvoker
this.expiry = expiry;
}
- void setClose(boolean close)
+ protected void setClose(boolean close)
{
this.closing = close;
}
@@ -513,20 +513,12 @@ public class Session extends SessionInvoker
void knownComplete(RangeSet kc)
{
- synchronized (processedLock)
+ if (kc.size() > 0)
{
- RangeSet newProcessed = RangeSetFactory.createRangeSet();
- for (Range pr : processed)
+ synchronized (processedLock)
{
- for (Range kr : kc)
- {
- for (Range r : pr.subtract(kr))
- {
- newProcessed.add(r);
- }
- }
+ processed.subtract(kc) ;
}
- this.processed = newProcessed;
}
}
diff --git a/java/common/src/main/java/org/apache/qpid/transport/codec/AbstractEncoder.java b/java/common/src/main/java/org/apache/qpid/transport/codec/AbstractEncoder.java
index a38c83d4cb..2b93697bfc 100644
--- a/java/common/src/main/java/org/apache/qpid/transport/codec/AbstractEncoder.java
+++ b/java/common/src/main/java/org/apache/qpid/transport/codec/AbstractEncoder.java
@@ -25,6 +25,7 @@ import org.apache.qpid.transport.RangeSet;
import org.apache.qpid.transport.Struct;
import org.apache.qpid.transport.Type;
+import org.apache.qpid.transport.Xid;
import static org.apache.qpid.transport.util.Functions.lsb;
import java.io.UnsupportedEncodingException;
@@ -61,6 +62,7 @@ abstract class AbstractEncoder implements Encoder
ENCODINGS.put(Character.class, Type.CHAR);
ENCODINGS.put(byte[].class, Type.VBIN32);
ENCODINGS.put(UUID.class, Type.UUID);
+ ENCODINGS.put(Xid.class, Type.STRUCT32);
}
private final Map<String,byte[]> str8cache = new LinkedHashMap<String,byte[]>()
diff --git a/java/common/src/main/java/org/apache/qpid/transport/network/Assembler.java b/java/common/src/main/java/org/apache/qpid/transport/network/Assembler.java
index b80d5dfd30..a80b988cea 100644
--- a/java/common/src/main/java/org/apache/qpid/transport/network/Assembler.java
+++ b/java/common/src/main/java/org/apache/qpid/transport/network/Assembler.java
@@ -189,7 +189,7 @@ public class Assembler implements Receiver<NetworkEvent>, NetworkDelegate
command = Method.create(commandType);
command.setSync((0x0001 & hdr) != 0);
command.read(dec);
- if (command.hasPayload())
+ if (command.hasPayload() && !frame.isLastSegment())
{
setIncompleteCommand(channel, command);
}
diff --git a/java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java b/java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java
index 387777a80c..42c8334a5d 100644
--- a/java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java
+++ b/java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java
@@ -157,7 +157,7 @@ public class IoNetworkTransport implements OutgoingNetworkTransport, IncomingNet
_factory = factory;
_sslContext = sslContext;
- InetSocketAddress address = new InetSocketAddress(config.getHost(), config.getPort());
+ InetSocketAddress address = config.getAddress();
if(sslContext == null)
{
diff --git a/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java b/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java
index 94db7d8dde..cbf6caf141 100644
--- a/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java
+++ b/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java
@@ -42,6 +42,7 @@ public class QpidTestCase extends TestCase
{
public static final String QPID_HOME = System.getProperty("QPID_HOME");
public static final String TEST_RESOURCES_DIR = QPID_HOME + "/../test-profiles/test_resources/";
+ public static final String TMP_FOLDER = System.getProperty("java.io.tmpdir");
private static final Logger _logger = Logger.getLogger(QpidTestCase.class);
@@ -108,10 +109,10 @@ public class QpidTestCase extends TestCase
_exclusionList = exclusionList;
}
}
-
- protected static final String MS_CLASS_NAME_KEY = "messagestore.class.name";
- protected static final String MEMORY_STORE_CLASS_NAME = "org.apache.qpid.server.store.MemoryMessageStore";
-
+
+ protected static final String MS_FACTORY_CLASS_NAME_KEY = "messagestorefactory.class.name";
+ protected static final String MEMORY_STORE_FACTORY_CLASS_NAME = "org.apache.qpid.server.store.MemoryMessageStoreFactory";
+
private static List<String> _exclusionList;
public QpidTestCase()
@@ -139,11 +140,12 @@ public class QpidTestCase extends TestCase
}
}
- public String getTestProfileMessageStoreClassName()
+ public String getTestProfileMessageStoreFactoryClassName()
{
- String storeClass = System.getProperty(MS_CLASS_NAME_KEY);
+ final String storeFactoryClass = System.getProperty(MS_FACTORY_CLASS_NAME_KEY);
+ _logger.debug("MS_FACTORY_CLASS_NAME_KEY " + storeFactoryClass);
- return storeClass != null ? storeClass : MEMORY_STORE_CLASS_NAME ;
+ return storeFactoryClass != null ? storeFactoryClass : MEMORY_STORE_FACTORY_CLASS_NAME ;
}
@@ -157,7 +159,7 @@ public class QpidTestCase extends TestCase
* @param fromPort the port to scan for availability
* @throws NoSuchElementException if there are no ports available
*/
- protected int getNextAvailable(int fromPort)
+ public int getNextAvailable(int fromPort)
{
if ((fromPort < MIN_PORT_NUMBER) || (fromPort > MAX_PORT_NUMBER))
{
diff --git a/java/common/src/test/java/org/apache/qpid/transport/RangeSetTest.java b/java/common/src/test/java/org/apache/qpid/transport/RangeSetTest.java
index 56dbaf5535..14589eb541 100644
--- a/java/common/src/test/java/org/apache/qpid/transport/RangeSetTest.java
+++ b/java/common/src/test/java/org/apache/qpid/transport/RangeSetTest.java
@@ -27,6 +27,7 @@ import static org.apache.qpid.util.Serial.eq;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Iterator;
import java.util.List;
/**
@@ -236,4 +237,117 @@ public class RangeSetTest extends TestCase
assertEquals(d.getUpper(), 10);
}
+ public void testSetSubtract1()
+ {
+ final RangeSet orig = createRangeSet(0, 10) ;
+ final RangeSet update = createRangeSet(3, 15) ;
+ orig.subtract(update) ;
+ checkRange(orig, 0, 2) ;
+ }
+
+ public void testSetSubtract2()
+ {
+ final RangeSet orig = createRangeSet(0, 10) ;
+ final RangeSet update = createRangeSet(3, 10) ;
+ orig.subtract(update) ;
+ checkRange(orig, 0, 2) ;
+ }
+
+ public void testSetSubtract3()
+ {
+ final RangeSet orig = createRangeSet(0, 10) ;
+ final RangeSet update = createRangeSet(3, 4) ;
+ orig.subtract(update) ;
+ checkRange(orig, 0, 2, 5, 10) ;
+ }
+
+ public void testSetSubtract4()
+ {
+ final RangeSet orig = createRangeSet(3, 15) ;
+ final RangeSet update = createRangeSet(0, 10) ;
+ orig.subtract(update) ;
+ checkRange(orig, 11, 15) ;
+ }
+
+ public void testSetSubtract5()
+ {
+ final RangeSet orig = createRangeSet(3, 10) ;
+ final RangeSet update = createRangeSet(0, 10) ;
+ orig.subtract(update) ;
+ checkRange(orig) ;
+ }
+
+ public void testSetSubtract6()
+ {
+ final RangeSet orig = createRangeSet(3, 10) ;
+ final RangeSet update = createRangeSet(0, 15) ;
+ orig.subtract(update) ;
+ checkRange(orig) ;
+ }
+
+ public void testSetSubtract7()
+ {
+ final RangeSet orig = createRangeSet(0, 10) ;
+ final RangeSet update = createRangeSet(0, 15) ;
+ orig.subtract(update) ;
+ checkRange(orig) ;
+ }
+
+ public void testSetSubtract8()
+ {
+ final RangeSet orig = createRangeSet(0, 15) ;
+ final RangeSet update = createRangeSet(0, 10) ;
+ orig.subtract(update) ;
+ checkRange(orig, 11, 15) ;
+ }
+
+ public void testSetSubtract9()
+ {
+ final RangeSet orig = createRangeSet(0, 15, 20, 30) ;
+ final RangeSet update = createRangeSet(2, 3, 5, 6, 8, 9, 22, 23, 27, 28) ;
+ orig.subtract(update) ;
+ checkRange(orig, 0, 1, 4, 4, 7, 7, 10, 15, 20, 21, 24, 26, 29, 30) ;
+ }
+
+ public void testSetSubtract10()
+ {
+ final RangeSet orig = createRangeSet(0, 15, 20, 30) ;
+ final RangeSet update = createRangeSet(0, 2, 4, 6, 10, 22, 24, 24, 27, 30) ;
+ orig.subtract(update) ;
+ checkRange(orig, 3, 3, 7, 9, 23, 23, 25, 26) ;
+ }
+
+ public void testSetSubtract11()
+ {
+ final RangeSet orig = createRangeSet(0, 2, 4, 6, 10, 22, 24, 24, 27, 30) ;
+ final RangeSet update = createRangeSet(0, 2, 4, 6, 10, 22, 24, 24, 27, 30) ;
+ orig.subtract(update) ;
+ checkRange(orig) ;
+ }
+
+ private RangeSet createRangeSet(int ... bounds)
+ {
+ RangeSet set = RangeSetFactory.createRangeSet();
+ final int length = (bounds == null ? 0 : bounds.length) ;
+ int count = 0 ;
+ while(count < length)
+ {
+ set.add(bounds[count++], bounds[count++]) ;
+ }
+ return set ;
+ }
+
+ private void checkRange(final RangeSet rangeSet, int ... bounds)
+ {
+ final int length = (bounds == null ? 0 : bounds.length) ;
+ assertEquals("Range count", length/2, rangeSet.size()) ;
+ final Iterator<Range> iter = rangeSet.iterator() ;
+ int count = 0 ;
+ while(count < length)
+ {
+ final Range range = iter.next() ;
+ assertEquals("Range lower", bounds[count++], range.getLower()) ;
+ assertEquals("Range upper", bounds[count++], range.getUpper()) ;
+ }
+ }
}
diff --git a/java/genpom b/java/genpom
index 39eccd4c3e..07a5b82a1f 100755
--- a/java/genpom
+++ b/java/genpom
@@ -73,13 +73,15 @@ if opts.name is None:
if opts.artifact is None:
opts.artifact = opts.name
-def lookup(dep, attr):
- nd = dep["dep"][attr]
+def lookup(doc, attr):
+ nd = doc[attr]
if nd is None:
- if nd is None:
- return None
+ return None
return nd.text()
+def lookupElement(doc, attr):
+ return doc[attr]
+
def search(path, file):
for d in path:
f = os.path.join(d, file)
@@ -120,6 +122,7 @@ for jar in jars:
continue
else:
die("unable to locate xml for %s" % jar)
+ dep = dep["dep"]
group = lookup(dep, "groupId")
artifactId = lookup(dep, "artifactId")
version = lookup(dep, "version")
@@ -128,11 +131,28 @@ for jar in jars:
<groupId>%s</groupId>
<artifactId>%s</artifactId>
<version>%s</version>
- <scope>%s</scope>
- </dependency>
-""" % (group, artifactId, version,
+ <scope>%s</scope>""" % (group, artifactId, version,
scopes.get(artifactId, "compile")))
+ exclusions = lookupElement(dep, "exclusions")
+ if exclusions is not None:
+ deps.append("""
+ <exclusions>""")
+ for exclusion in list(exclusions.query["exclusion"]):
+ group = lookup(exclusion, "groupId")
+ artifactId = lookup(exclusion, "artifactId")
+ deps.append("""
+ <exclusion>
+ <groupId>%s</groupId>
+ <artifactId>%s</artifactId>
+ </exclusion>""" % (group, artifactId))
+ deps.append("""
+ </exclusions>""")
+
+ deps.append("""
+ </dependency>
+""")
+
TEMPLATE = """<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
diff --git a/java/integrationtests/README.txt b/java/integrationtests/README.txt
deleted file mode 100644
index 00a21883a9..0000000000
--- a/java/integrationtests/README.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-This module contains integration tests, for testing a java client againt *any* broker
-implementation or against other clients. These tests must not rely on starting the
-Java broker in-vm but must depend on a broker being started independantly before running
-the tests in this module. By default tests in this module will expect the broker to be
-started on localhost on the default port, but this can be overridden by passing in a
-sys property to maven. Interop tests are in this module. Java broker specific tests that
-use an in-vm broker should go in the systests module.
-
-Don't set the tests in this module to run by default as part of the maven build, until
-there is a script to start and stop the broker; needed to fully automate these tests.
-Interop tests will always be run using a seperate script (not from maven) but it might
-be worthwile to script into the maven build starting of the Java broker, and running
-these tests against it. \ No newline at end of file
diff --git a/java/integrationtests/bin/interoptests.py b/java/integrationtests/bin/interoptests.py
deleted file mode 100755
index a883a22a5f..0000000000
--- a/java/integrationtests/bin/interoptests.py
+++ /dev/null
@@ -1,180 +0,0 @@
-#!/usr/bin/env python
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import glob, os, subprocess
-from subprocess import Popen
-from optparse import OptionParser
-
-interop_cases = ["InteropTestCase1DummyRun", "InteropTestCase2BasicP2P", "InteropTestCase3BasicPubSub", "InteropTestCase4P2PMessageSize", "InteropTestCase5PubSubMessageSize"]
-
-interop_command = "java -cp %s org.apache.qpid.test.framework.distributedtesting.Coordinator --xml -e interop -o . -n interop org.apache.qpid.interop.testcases.%s"
-
-# TODO: read this from the ant properties file
-clientlibs = ["qpid-integrationtests-M4.jar",
- "qpid-junit-toolkit-M4.jar",
- "junit-3.8.1.jar",
- "qpid-systests-M4.jar",
- "qpid-junit-toolkit-M4.jar",
- "geronimo-jms_1.1_spec-1.0.jar",
- "log4j-1.2.12.jar"]
-
-def main():
- parser = OptionParser()
- parser.add_option("-t", "--testlib", dest="testlib", action="store",
- type="string",
- help="The directory containing the test classes to run")
- parser.add_option("-b", "--brokers", dest="brokers", action="store",
- type="string",
- help="The directory containing the unpacked brokers to test")
- parser.add_option("-j", "--java", dest="java", action="store",
- type="string",
- help="The directory containing the java client to test")
- parser.add_option("-d", "--dotnet", dest="dotnet", action="store",
- type="string",
- help="The directory containing the .Net client to test")
- parser.add_option("-c", "--cpp", dest="cpp", action="store",
- type="string",
- help="The directory containing the C++ client to test")
- (options, args) = parser.parse_args()
-
- # check available brokers
- if (options.brokers == None or
- not os.path.exists(options.brokers) or
- not os.path.isdir(options.brokers)):
- parser.error("Broker directory must be specified and must exist")
-
- # check available clients
- if (options.java == None or
- not os.path.exists(options.java) or
- not os.path.isdir(options.java)):
- parser.error("Java client directory must be specified and must exist")
-
- # check available tests
- if (options.testlib == None or
- not os.path.exists(options.testlib) or
- not os.path.isdir(options.testlib)):
- parser.error("Test directory must be specified and must exist")
-
- # check dotnet test client
- if (options.dotnet == None or
- not os.path.exists(options.dotnet) or
- not os.path.exists(options.dotnet+"/TestClient.exe")):
- parser.error(".Net test directory must be specified and must contain TestClient.exe")
-
- # check cpp test client
- if (options.cpp == None or
- not os.path.exists(options.cpp) or
- not os.path.exists(options.cpp+"/src/tests/interop_runner")):
- parser.error("C++ test directory must be specified and must contain test client")
-
- # Get list of available broker and client versions
- brokers = glob.glob(options.brokers+"/qpid-[0-9].[0-9].[0-9].[0-9]")
- java_clients = glob.glob(options.java+"/qpid-[0-9].[0-9].[0-9].[0-9]*")
-
- if (not len(brokers) > 0):
- parser.error("Broker directory did not contain any brokers!")
-
- if (not len(java_clients) > 0):
- parser.error("Broker directory did not contain any brokers!")
-
- for broker in brokers:
- for client in java_clients:
- test(options.testlib, broker, client, options.dotnet,
- options.cpp)
-
-def start_dotnet(dotnetpath):
- return Popen(["%s/TestClient.exe" % os.path.abspath(dotnetpath),
- "-bamqp://guest:guest@clientid/?brokerlist=\'tcp://localhost:5672\'"],
- stdin=subprocess.PIPE, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
-
-def start_java(javapath):
- # Setup classpath
- classpath = ""
- for lib in clientlibs:
- classpath = classpath + testlibdir+"/"+lib+";"
-
- classpath = classpath + javapath+"/lib/qpid-all.jar"
-
- # Add qpid common since the tests need that, classpath hatefulness
- classpath = classpath + ";"+testlibdir+"/qpid-common-M4.jar"
-
- return Popen(["java", "-cp","\""+classpath+"\"",
- "org.apache.qpid.test.framework.distributedtesting.TestClient"],
- stdin=subprocess.PIPE, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
-
-def start_cpp(cpppath):
- return Popen([cpppath+"tests/interop_runner"],
- stdin=subprocess.PIPE, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
-
-def run_tests():
- for testcase in interop_cases:
- cmd = " ".join(["java", "-cp","\""+classpath+"\"", "org.apache.qpid.test.framework.distributedtesting.Coordinator",
- "--xml", "-e", "interop", "-o", ".", "-n", "interop", ("org.apache.qpid.interop.testcases.%s" % testcase)])
- fd = os.popen(cmd, "r")
- output = fd.read()
- fd.close()
-
-def test(testlibdir, brokerpath, javapath, dotnetpath, cpppath):
- print ("Testing broker in %s\nclient in %s" % (brokerpath, javapath))
- print ("Logging too %s" % ("/tmp/qpid-interop-tests/%s-%s" %
- (os.path.basename(brokerpath), os.path.basename(javapath))))
- os.environ["QPID_HOME"] = brokerpath
- os.environ["QPID_WORK"] = ("/tmp/qpid-interop-tests/%s-%s" %
- (os.path.basename(brokerpath), os.path.basename(javapath)))
-
- brokerp, javacp, dotnetp, cppp, coordinatorp = (None, None, None, None, None)
-
- try:
- # Start broker
- brokerp = Popen(brokerpath+"/bin/qpid-server",
- stdin=subprocess.PIPE, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- print ("Started broker, pid %s" % brokerp.pid)
-
- cppp = start_cpp(cpppath)
- print ("Started C++ client, pid %s" % cppp.pid)
-
- dotnetp = start_dotnet(dotnetpath)
- print ("Started .Net client, pid %s" % dotnetp.pid)
-
- javacp = start_java(javapath)
- print ("Started client, pid %s" % javacp.pid)
-
- run_tests()
-
- finally:
- # Shutdown broker and clients
- if javacp != None:
- os.kill(javacp.pid, 9)
- if dotnetp != None:
- os.kill(dotnetp.pid, 9)
- if coordinatorp != None:
- os.kill(coordinatorp.pid, 9)
- if brokerp != None:
- os.kill(brokerp.pid, 9)
-
- # Start coordinator
-
-
-if __name__ == "__main__":
- main()
diff --git a/java/integrationtests/build.xml b/java/integrationtests/build.xml
deleted file mode 100644
index ae870c5675..0000000000
--- a/java/integrationtests/build.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
- - or more contributor license agreements. See the NOTICE file
- - distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
- -->
-<project name="Integration Tests" default="build">
-
- <property name="module.depends" value="systests client common common/test junit-toolkit"/>
- <property name="module.dist" value="false"/>
-
- <import file="../module.xml"/>
-
-</project>
diff --git a/java/integrationtests/docs/RunningSustainedTests.txt b/java/integrationtests/docs/RunningSustainedTests.txt
deleted file mode 100644
index db4405a32d..0000000000
--- a/java/integrationtests/docs/RunningSustainedTests.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-In addition to the integration tests the framework provided by this package also allows for
-sustained tests to be run. Currently avaible tests:
-- org.apache.qpid.sustained.SustainedClientTestCase : Pub Sub test to determine steady state throughput.
-
-
-Running Tests.
-
-Run the tests as per the integration tests.
-- Start a broker
-- Start at least one test client [java org.apache.qpid.interop.TestClient], ensuring unique naming.
-
-- Start the test coordinator with the 'fanout' engine, on the sustained test case [java org.apache.qpid.test.framework.distributedtesting.Coordinator]
-
-- Additional Test clients can be started and joined into the running test: [java org.apache.qpid.interop.TestClient -j]
-
-
-
diff --git a/java/integrationtests/jar-with-dependencies.xml b/java/integrationtests/jar-with-dependencies.xml
deleted file mode 100644
index 3e95e7ab22..0000000000
--- a/java/integrationtests/jar-with-dependencies.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<!-- This is an assembly descriptor that produces a jar file that contains all the
- dependencies, fully expanded into a single jar, required to run the tests of
- a maven project.
- -->
-<assembly>
- <id>all-test-deps</id>
- <formats>
- <format>jar</format>
- </formats>
- <includeBaseDirectory>false</includeBaseDirectory>
- <dependencySets>
- <dependencySet>
- <outputDirectory></outputDirectory>
- <outputFileNameMapping></outputFileNameMapping>
- <unpack>true</unpack>
- <scope>test</scope>
- </dependencySet>
- </dependencySets>
- <fileSets>
- <fileSet>
- <directory>target/classes</directory>
- <outputDirectory></outputDirectory>
- </fileSet>
- <fileSet>
- <directory>target/test-classes</directory>
- <outputDirectory></outputDirectory>
- </fileSet>
- </fileSets>
-</assembly>
diff --git a/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase1DummyRun.java b/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase1DummyRun.java
deleted file mode 100644
index db17c7aacc..0000000000
--- a/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase1DummyRun.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.clienttestcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.distributedtesting.TestClientControlledTest;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-
-/**
- * Implements tet case 1, dummy run. This test case sends no test messages, it exists to confirm that the test harness
- * is interacting with the coordinator correctly.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Perform test case actions.
- * <tr><td> Generate test reports.
- * </table>
- */
-public class TestCase1DummyRun implements TestClientControlledTest
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestCase1DummyRun.class);
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- log.debug("public String getName(): called");
-
- return "TC1_DummyRun";
- }
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- *
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException
- {
- log.debug("public boolean acceptInvite(Message inviteMessage): called");
-
- // Test parameters don't matter, accept all invites.
- return true;
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role, Message assignRoleMessage): called");
-
- // Do nothing, both roles are the same.
- }
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- */
- public void start(int numMessages)
- {
- log.debug("public void start(): called");
-
- // Do nothing.
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- log.debug("public Message getReport(Session controlSession): called");
-
- // Generate a dummy report, the coordinator expects a report but doesn't care what it is.
- return session.createTextMessage("Dummy Run, Ok.");
- }
-
- /**
- * Handles incoming test messages. Does nothing.
- *
- * @param message The incoming test message.
- */
- public void onMessage(Message message)
- {
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- // Ignore any messages.
- }
-}
diff --git a/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase2BasicP2P.java b/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase2BasicP2P.java
deleted file mode 100644
index 36d3cce7f7..0000000000
--- a/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase2BasicP2P.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.clienttestcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedtesting.TestClient;
-import org.apache.qpid.test.framework.distributedtesting.TestClientControlledTest;
-
-import javax.jms.*;
-
-/**
- * Implements test case 2, basic P2P. Sends/received a specified number of messages to a specified route on the
- * default direct exchange. Produces reports on the actual number of messages sent/received.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Send required number of test messages.
- * <tr><td> Generate test reports.
- * </table>
- */
-public class TestCase2BasicP2P implements TestClientControlledTest, MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestCase2BasicP2P.class);
-
- /** Holds the count of test messages received. */
- private int messageCount;
-
- /** The role to be played by the test. */
- private Roles role;
-
- /** The number of test messages to send. */
- private int numMessages;
-
- /** The connection to send the test messages on. */
- private Connection connection;
-
- /** The controlSession to send the test messages on. */
- private Session session;
-
- /** The producer to send the test messages with. */
- MessageProducer producer;
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- log.debug("public String getName(): called");
-
- return "TC2_BasicP2P";
- }
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- *
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException
- {
- log.debug("public boolean acceptInvite(Message inviteMessage = " + inviteMessage + "): called");
-
- // All invites are acceptable.
- return true;
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- *
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role = " + role + ", Message assignRoleMessage = " + assignRoleMessage
- + "): called");
-
- // Reset the message count for a new test.
- messageCount = 0;
-
- // Take note of the role to be played.
- this.role = role;
-
- // Create a new connection to pass the test messages on.
- connection = TestUtils.createConnection(TestClient.testContextProperties);
- session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- // Extract and retain the test parameters.
- numMessages = assignRoleMessage.getIntProperty("P2P_NUM_MESSAGES");
- Destination sendDestination = session.createQueue(assignRoleMessage.getStringProperty("P2P_QUEUE_AND_KEY_NAME"));
-
- log.debug("numMessages = " + numMessages);
- log.debug("sendDestination = " + sendDestination);
- log.debug("role = " + role);
-
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a message producer if so.
- case SENDER:
- producer = session.createProducer(sendDestination);
- break;
-
- // Otherwise the receivers role is being assigned, so set this up to listen for messages.
- case RECEIVER:
- MessageConsumer consumer = session.createConsumer(sendDestination);
- consumer.setMessageListener(this);
- break;
- }
-
- connection.start();
- }
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void start(int numMessages) throws JMSException
- {
- log.debug("public void start(): called");
-
- // Check that the sender role is being performed.
- if (role.equals(Roles.SENDER))
- {
- Message testMessage = session.createTextMessage("test");
-
- for (int i = 0; i < this.numMessages; i++)
- {
- producer.send(testMessage);
-
- // Increment the message count.
- messageCount++;
- }
- }
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- log.debug("public Message getReport(Session controlSession): called");
-
- // Close the test connection.
- connection.close();
-
- // Generate a report message containing the count of the number of messages passed.
- Message report = session.createMessage();
- report.setStringProperty("CONTROL_TYPE", "REPORT");
- report.setIntProperty("MESSAGE_COUNT", messageCount);
-
- return report;
- }
-
- /**
- * Counts incoming test messages.
- *
- * @param message The incoming test message.
- */
- public void onMessage(Message message)
- {
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- // Increment the message count.
- messageCount++;
- }
-}
diff --git a/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase3BasicPubSub.java b/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase3BasicPubSub.java
deleted file mode 100644
index 205472716b..0000000000
--- a/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase3BasicPubSub.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.clienttestcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedtesting.TestClient;
-import org.apache.qpid.test.framework.distributedtesting.TestClientControlledTest;
-
-import javax.jms.*;
-
-/**
- * Implements test case 3, basic pub/sub. Sends/received a specified number of messages to a specified route on the
- * default topic exchange, using the specified number of receivers connections. Produces reports on the actual number of
- * messages sent/received.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Send required number of test messages using pub/sub.
- * <tr><td> Generate test reports.
- * </table>
- */
-public class TestCase3BasicPubSub implements TestClientControlledTest, MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestCase3BasicPubSub.class);
-
- /** Holds the count of test messages received. */
- private int messageCount;
-
- /** The role to be played by the test. */
- private Roles role;
-
- /** The number of test messages to send. */
- private int numMessages;
-
- /** The connections to send/receive the test messages on. */
- private Connection[] connection;
-
- /** The sessions to send/receive the test messages on. */
- private Session[] session;
-
- /** The producer to send the test messages with. */
- MessageProducer producer;
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- log.debug("public String getName(): called");
-
- return "TC3_BasicPubSub";
- }
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- *
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws javax.jms.JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException
- {
- log.debug("public boolean acceptInvite(Message inviteMessage = " + inviteMessage + "): called");
-
- // All invites are acceptable.
- return true;
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- *
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role = " + role + ", Message assignRoleMessage = " + assignRoleMessage
- + "): called");
-
- // Reset the message count for a new test.
- messageCount = 0;
-
- // Take note of the role to be played.
- this.role = role;
-
- // Extract and retain the test parameters.
- numMessages = assignRoleMessage.getIntProperty("PUBSUB_NUM_MESSAGES");
- int numReceivers = assignRoleMessage.getIntProperty("PUBSUB_NUM_RECEIVERS");
- String sendKey = assignRoleMessage.getStringProperty("PUBSUB_KEY");
-
- log.debug("numMessages = " + numMessages);
- log.debug("numReceivers = " + numReceivers);
- log.debug("sendKey = " + sendKey);
- log.debug("role = " + role);
-
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a single message producer if so.
- case SENDER:
- // Create a new connection to pass the test messages on.
- connection = new Connection[1];
- session = new Session[1];
-
- connection[0] = TestUtils.createConnection(TestClient.testContextProperties);
- session[0] = connection[0].createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- // Extract and retain the test parameters.
- Destination sendDestination = session[0].createTopic(sendKey);
-
- producer = session[0].createProducer(sendDestination);
- break;
-
- // Otherwise the receivers role is being assigned, so set this up to listen for messages on the required number
- // of receivers connections.
- case RECEIVER:
- // Create the required number of receivers connections.
- connection = new Connection[numReceivers];
- session = new Session[numReceivers];
-
- for (int i = 0; i < numReceivers; i++)
- {
- connection[i] = TestUtils.createConnection(TestClient.testContextProperties);
- session[i] = connection[i].createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- sendDestination = session[i].createTopic(sendKey);
-
- MessageConsumer consumer = session[i].createConsumer(sendDestination);
- consumer.setMessageListener(this);
- }
-
- break;
- }
-
- // Start all the connection dispatcher threads running.
- for (Connection conn : connection)
- {
- conn.start();
- }
- }
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void start(int numMessages) throws JMSException
- {
- log.debug("public void start(): called");
-
- // Check that the sender role is being performed.
- if (role.equals(Roles.SENDER))
- {
- Message testMessage = session[0].createTextMessage("test");
-
- for (int i = 0; i < this.numMessages; i++)
- {
- producer.send(testMessage);
-
- // Increment the message count.
- messageCount++;
- }
- }
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- log.debug("public Message getReport(Session controlSession): called");
-
- // Close the test connections.
- for (Connection conn : connection)
- {
- conn.close();
- }
-
- // Generate a report message containing the count of the number of messages passed.
- Message report = session.createMessage();
- report.setStringProperty("CONTROL_TYPE", "REPORT");
- report.setIntProperty("MESSAGE_COUNT", messageCount);
-
- return report;
- }
-
- /**
- * Counts incoming test messages.
- *
- * @param message The incoming test message.
- */
- public void onMessage(Message message)
- {
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- // Increment the message count.
- messageCount++;
- }
-}
diff --git a/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase4P2PMessageSize.java b/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase4P2PMessageSize.java
deleted file mode 100644
index 3730233264..0000000000
--- a/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase4P2PMessageSize.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.clienttestcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedtesting.TestClient;
-import org.apache.qpid.test.framework.distributedtesting.TestClientControlledTest;
-
-import javax.jms.*;
-
-/**
- * Implements test case 4, P2P messages with message size. Sends/received a specified number of messages to a specified
- * route on the default direct exchange, of a specified size. Produces reports on the actual number of messages
- * sent/received.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Send required number of test messages.
- * <tr><td> Generate test reports.
- * </table>
- */
-public class TestCase4P2PMessageSize implements TestClientControlledTest, MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestCase4P2PMessageSize.class);
-
- /** Holds the count of test messages received. */
- private int messageCount;
-
- /** The role to be played by the test. */
- private Roles role;
-
- /** The number of test messages to send. */
- private int numMessages;
-
- /** The size of the test messages to send. */
- private int messageSize;
-
- /** The connection to send the test messages on. */
- private Connection connection;
-
- /** The controlSession to send the test messages on. */
- private Session session;
-
- /** The producer to send the test messages with. */
- MessageProducer producer;
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- log.debug("public String getName(): called");
-
- return "TC4_P2PMessageSize";
- }
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- *
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException
- {
- log.debug("public boolean acceptInvite(Message inviteMessage = " + inviteMessage + "): called");
-
- // All invites are acceptable.
- return true;
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- *
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role = " + role + ", Message assignRoleMessage = " + assignRoleMessage
- + "): called");
-
- // Reset the message count for a new test.
- messageCount = 0;
-
- // Take note of the role to be played.
- this.role = role;
-
- // Create a new connection to pass the test messages on.
- connection = TestUtils.createConnection(TestClient.testContextProperties);
- session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- // Extract and retain the test parameters.
- numMessages = assignRoleMessage.getIntProperty("P2P_NUM_MESSAGES");
- messageSize = assignRoleMessage.getIntProperty("messageSize");
- Destination sendDestination = session.createQueue(assignRoleMessage.getStringProperty("P2P_QUEUE_AND_KEY_NAME"));
-
- log.debug("numMessages = " + numMessages);
- log.debug("sendDestination = " + sendDestination);
- log.debug("role = " + role);
-
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a message producer if so.
- case SENDER:
- producer = session.createProducer(sendDestination);
- break;
-
- // Otherwise the receivers role is being assigned, so set this up to listen for messages.
- case RECEIVER:
- MessageConsumer consumer = session.createConsumer(sendDestination);
- consumer.setMessageListener(this);
- break;
- }
-
- connection.start();
- }
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void start(int numMessages) throws JMSException
- {
- log.debug("public void start(): called");
-
- // Check that the sender role is being performed.
- if (role.equals(Roles.SENDER))
- {
- Message testMessage = TestUtils.createTestMessageOfSize(session, messageSize);
-
- for (int i = 0; i < this.numMessages; i++)
- {
- producer.send(testMessage);
-
- // Increment the message count.
- messageCount++;
- }
- }
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- log.debug("public Message getReport(Session controlSession): called");
-
- // Close the test connection.
- connection.close();
-
- // Generate a report message containing the count of the number of messages passed.
- Message report = session.createMessage();
- report.setStringProperty("CONTROL_TYPE", "REPORT");
- report.setIntProperty("MESSAGE_COUNT", messageCount);
-
- return report;
- }
-
- /**
- * Counts incoming test messages.
- *
- * @param message The incoming test message.
- */
- public void onMessage(Message message)
- {
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- // Increment the message count.
- messageCount++;
- }
-}
diff --git a/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase5PubSubMessageSize.java b/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase5PubSubMessageSize.java
deleted file mode 100644
index f601712bc9..0000000000
--- a/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase5PubSubMessageSize.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.clienttestcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedtesting.TestClient;
-import org.apache.qpid.test.framework.distributedtesting.TestClientControlledTest;
-
-import javax.jms.*;
-
-/**
- * Implements test case 5, pub/sub with message size. Sends/received a specified number of messages to a specified route
- * on the default topic exchange, using the specified number of receivers connections, and the specified message size.
- * Produces reports on the actual number of messages sent/received.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Send required number of test messages using pub/sub.
- * <tr><td> Generate test reports.
- * </table>
- */
-public class TestCase5PubSubMessageSize implements TestClientControlledTest, MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestCase5PubSubMessageSize.class);
-
- /** Holds the count of test messages received. */
- private int messageCount;
-
- /** The role to be played by the test. */
- private Roles role;
-
- /** The number of test messages to send. */
- private int numMessages;
-
- /** The size of the test messages to send. */
- private int messageSize;
-
- /** The connections to send/receive the test messages on. */
- private Connection[] connection;
-
- /** The sessions to send/receive the test messages on. */
- private Session[] session;
-
- /** The producer to send the test messages with. */
- MessageProducer producer;
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- log.debug("public String getName(): called");
-
- return "TC5_PubSubMessageSize";
- }
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- *
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws javax.jms.JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException
- {
- log.debug("public boolean acceptInvite(Message inviteMessage = " + inviteMessage + "): called");
-
- // All invites are acceptable.
- return true;
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- *
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws javax.jms.JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role = " + role + ", Message assignRoleMessage = " + assignRoleMessage
- + "): called");
-
- // Reset the message count for a new test.
- messageCount = 0;
-
- // Take note of the role to be played.
- this.role = role;
-
- // Extract and retain the test parameters.
- numMessages = assignRoleMessage.getIntProperty("PUBSUB_NUM_MESSAGES");
- messageSize = assignRoleMessage.getIntProperty("messageSize");
- int numReceivers = assignRoleMessage.getIntProperty("PUBSUB_NUM_RECEIVERS");
- String sendKey = assignRoleMessage.getStringProperty("PUBSUB_KEY");
-
- log.debug("numMessages = " + numMessages);
- log.debug("numReceivers = " + numReceivers);
- log.debug("sendKey = " + sendKey);
- log.debug("role = " + role);
-
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a single message producer if so.
- case SENDER:
- // Create a new connection to pass the test messages on.
- connection = new Connection[1];
- session = new Session[1];
-
- connection[0] = TestUtils.createConnection(TestClient.testContextProperties);
- session[0] = connection[0].createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- // Extract and retain the test parameters.
- Destination sendDestination = session[0].createTopic(sendKey);
-
- producer = session[0].createProducer(sendDestination);
- break;
-
- // Otherwise the receivers role is being assigned, so set this up to listen for messages on the required number
- // of receivers connections.
- case RECEIVER:
- // Create the required number of receivers connections.
- connection = new Connection[numReceivers];
- session = new Session[numReceivers];
-
- for (int i = 0; i < numReceivers; i++)
- {
- connection[i] = TestUtils.createConnection(TestClient.testContextProperties);
- session[i] = connection[i].createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- sendDestination = session[i].createTopic(sendKey);
-
- MessageConsumer consumer = session[i].createConsumer(sendDestination);
- consumer.setMessageListener(this);
- }
-
- break;
- }
-
- // Start all the connection dispatcher threads running.
- for (Connection conn : connection)
- {
- conn.start();
- }
- }
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void start(int numMessages) throws JMSException
- {
- log.debug("public void start(): called");
-
- // Check that the sender role is being performed.
- if (role.equals(Roles.SENDER))
- {
- Message testMessage = TestUtils.createTestMessageOfSize(session[0], messageSize);
-
- for (int i = 0; i < this.numMessages; i++)
- {
- producer.send(testMessage);
-
- // Increment the message count.
- messageCount++;
- }
- }
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws javax.jms.JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- log.debug("public Message getReport(Session controlSession): called");
-
- // Close the test connections.
- for (Connection conn : connection)
- {
- conn.close();
- }
-
- // Generate a report message containing the count of the number of messages passed.
- Message report = session.createMessage();
- report.setStringProperty("CONTROL_TYPE", "REPORT");
- report.setIntProperty("MESSAGE_COUNT", messageCount);
-
- return report;
- }
-
- /**
- * Counts incoming test messages.
- *
- * @param message The incoming test message.
- */
- public void onMessage(Message message)
- {
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- // Increment the message count.
- messageCount++;
- }
-}
diff --git a/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase1DummyRun.java b/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase1DummyRun.java
deleted file mode 100644
index a2e4a00aa6..0000000000
--- a/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase1DummyRun.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.testcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-
-import java.util.Properties;
-
-/**
- * Coordinates test case 1, from the interop test specification. This test connects up the sender and receivers roles,
- * and gets some dummy test reports from them, in order to check that the test framework itself is operational.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Exercises the interop testing framework without actually sending any test messages.
- * <td> {@link FrameworkBaseCase}
- * </table>
- */
-public class InteropTestCase1DummyRun extends FrameworkBaseCase
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(InteropTestCase1DummyRun.class);
-
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public InteropTestCase1DummyRun(String name)
- {
- super(name);
- }
-
- /**
- * Performs the basic P2P test case, "Test Case 2" in the specification.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testDummyRun() throws Exception
- {
- log.debug("public void testDummyRun(): called");
-
- Properties testConfig = new Properties();
- testConfig.put("TEST_NAME", "TC1_DummyRun");
-
- /*Message[] reports =*/ getCircuitFactory().sequenceTest(null, null, testConfig);
-
- // Compare sender and receivers reports.
- // Assert.assertEquals("Expected to get 2 dummy reports.", 2, reports.length);
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as defined in the
- * interop testing specification. For example the method "testP2P" might map onto the interop test case name
- * "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "TC1_DummyRun";
- }
-}
diff --git a/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase2BasicP2P.java b/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase2BasicP2P.java
deleted file mode 100644
index 6d6515f1fd..0000000000
--- a/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase2BasicP2P.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.testcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-
-import java.util.Properties;
-
-/**
- * Implements test case 2, from the interop test specification. This test sets up the TC2_BasicP2P test for 50
- * messages. It checks that the sender and receivers reports both indicate that all the test messages were transmitted
- * successfully.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Setup p2p test parameters and compare with test output. <td> {@link FrameworkBaseCase}
- * </table>
- */
-public class InteropTestCase2BasicP2P extends FrameworkBaseCase
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(InteropTestCase2BasicP2P.class);
-
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public InteropTestCase2BasicP2P(String name)
- {
- super(name);
- }
-
- /**
- * Performs the basic P2P test case, "Test Case 2" in the specification.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testBasicP2P() throws Exception
- {
- log.debug("public void testBasicP2P(): called");
-
- Properties testConfig = new Properties();
- testConfig.setProperty("TEST_NAME", "TC2_BasicP2P");
- testConfig.setProperty("P2P_QUEUE_AND_KEY_NAME", "tc2queue");
- testConfig.put("P2P_NUM_MESSAGES", 50);
-
- /*Message[] reports =*/ getCircuitFactory().sequenceTest(null, null, testConfig);
-
- // Compare sender and receivers reports.
- /*int messagesSent = reports[0].getIntProperty("MESSAGE_COUNT");
- int messagesReceived = reports[1].getIntProperty("MESSAGE_COUNT");
-
- Assert.assertEquals("The requested number of messages were not sent.", 50, messagesSent);
- Assert.assertEquals("Sender and receivers messages sent did not match up.", messagesSent, messagesReceived);*/
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as defined in the
- * interop testing specification. For example the method "testP2P" might map onto the interop test case name
- * "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "TC2_BasicP2P";
- }
-}
diff --git a/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase3BasicPubSub.java b/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase3BasicPubSub.java
deleted file mode 100644
index 2faca91e73..0000000000
--- a/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase3BasicPubSub.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.testcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-
-import java.util.Properties;
-
-/**
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Setup pub/sub test parameters and compare with test output. <td> {@link FrameworkBaseCase}
- * </table>
- */
-public class InteropTestCase3BasicPubSub extends FrameworkBaseCase
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(InteropTestCase3BasicPubSub.class);
-
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public InteropTestCase3BasicPubSub(String name)
- {
- super(name);
- }
-
- /**
- * Performs the basic P2P test case, "Test Case 2" in the specification.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testBasicPubSub() throws Exception
- {
- log.debug("public void testBasicPubSub(): called");
-
- Properties testConfig = new Properties();
- testConfig.put("TEST_NAME", "TC3_BasicPubSub");
- testConfig.put("PUBSUB_KEY", "tc3route");
- testConfig.put("PUBSUB_NUM_MESSAGES", 10);
- testConfig.put("PUBSUB_NUM_RECEIVERS", 5);
-
- /*Message[] reports =*/ getCircuitFactory().sequenceTest(null, null, testConfig);
-
- // Compare sender and receivers reports.
- /*int messagesSent = reports[0].getIntProperty("MESSAGE_COUNT");
- int messagesReceived = reports[1].getIntProperty("MESSAGE_COUNT");
-
- Assert.assertEquals("The requested number of messages were not sent.", 10, messagesSent);
- Assert.assertEquals("Received messages did not match up to num sent * num receivers.", messagesSent * 5,
- messagesReceived);*/
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as defined in the
- * interop testing specification. For example the method "testP2P" might map onto the interop test case name
- * "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "TC3_BasicPubSub";
- }
-}
diff --git a/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase4P2PMessageSize.java b/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase4P2PMessageSize.java
deleted file mode 100644
index 2d64f2b805..0000000000
--- a/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase4P2PMessageSize.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.testcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-
-import java.util.Properties;
-
-/**
- * Implements test case 4, from the interop test specification. This test sets up the TC2_P2PMessageSize test for 50
- * messages, and a variety of message sizes. It checks that the sender and receivers reports both indicate that all
- * the test messages were transmitted successfully.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Setup p2p test parameters and compare with test output. <td> {@link FrameworkBaseCase}
- * </table>
- */
-public class InteropTestCase4P2PMessageSize extends FrameworkBaseCase
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(InteropTestCase4P2PMessageSize.class);
-
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public InteropTestCase4P2PMessageSize(String name)
- {
- super(name);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 0K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize0K() throws Exception
- {
- runTestForMessagesOfSize(0);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 63K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize63K() throws Exception
- {
- runTestForMessagesOfSize(63 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 64K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize64K() throws Exception
- {
- runTestForMessagesOfSize(64 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 65K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize65K() throws Exception
- {
- runTestForMessagesOfSize(65 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 127K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize127K() throws Exception
- {
- runTestForMessagesOfSize(127 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 128K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize128K() throws Exception
- {
- runTestForMessagesOfSize(128 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 129K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize129K() throws Exception
- {
- runTestForMessagesOfSize(129 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 255K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize255K() throws Exception
- {
- runTestForMessagesOfSize(255 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 256K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize256K() throws Exception
- {
- runTestForMessagesOfSize(256 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 257K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize257K() throws Exception
- {
- runTestForMessagesOfSize(257 * 1024);
- }
-
- /**
- * Sends 50 test messages of the specified size, and asserts that all were received.
- *
- * @param size The size of the messages to send in bytes.
- */
- private void runTestForMessagesOfSize(int size)
- {
- Properties testConfig = new Properties();
- testConfig.setProperty("TEST_NAME", "TC4_P2PMessageSize");
- testConfig.setProperty("P2P_QUEUE_AND_KEY_NAME", "tc2queue");
- testConfig.put("P2P_NUM_MESSAGES", 50);
- testConfig.put("messageSize", size);
-
- /*Message[] reports =*/
- getCircuitFactory().sequenceTest(null, null, testConfig);
-
- // Compare sender and receivers reports.
- /*
- int messagesSent = reports[0].getIntProperty("MESSAGE_COUNT");
- int messagesReceived = reports[1].getIntProperty("MESSAGE_COUNT");
-
- Assert.assertEquals("The requested number of messages were not sent.", 50, messagesSent);
- Assert.assertEquals("Sender and receivers messages sent did not match up.", messagesSent, messagesReceived);
- */
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as defined in the
- * interop testing specification. For example the method "testP2P" might map onto the interop test case name
- * "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- *
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "TC4_P2PMessageSize";
- }
-}
diff --git a/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase5PubSubMessageSize.java b/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase5PubSubMessageSize.java
deleted file mode 100644
index 23d33fc115..0000000000
--- a/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase5PubSubMessageSize.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.testcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-
-import java.util.Properties;
-
-/**
- * Implements test case 5, from the interop test specification. This test sets up the TC2_PubSubMessageSize test for 10
- * messages, sent to 5 consumers, and a variety of message sizes. It checks that the sender and receivers reports both
- * indicate that all the test messages were transmitted successfully.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Setup pub/sub test parameters and compare with test output. <td> {@link FrameworkBaseCase}
- * </table>
- */
-public class InteropTestCase5PubSubMessageSize extends FrameworkBaseCase
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(InteropTestCase5PubSubMessageSize.class);
-
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public InteropTestCase5PubSubMessageSize(String name)
- {
- super(name);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 0K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize0K() throws Exception
- {
- runTestForMessagesOfSize(0);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 63K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize63K() throws Exception
- {
- runTestForMessagesOfSize(63 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 64K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize64K() throws Exception
- {
- runTestForMessagesOfSize(64 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 65K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize65K() throws Exception
- {
- runTestForMessagesOfSize(65 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 127K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize127K() throws Exception
- {
- runTestForMessagesOfSize(127 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 128K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize128K() throws Exception
- {
- runTestForMessagesOfSize(128 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 129K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize129K() throws Exception
- {
- runTestForMessagesOfSize(129 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 255K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize255K() throws Exception
- {
- runTestForMessagesOfSize(255 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 256K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize256K() throws Exception
- {
- runTestForMessagesOfSize(256 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 257K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize257K() throws Exception
- {
- runTestForMessagesOfSize(257 * 1024);
- }
-
- /**
- * Sends 50 test messages of the specified size, and asserts that all were received.
- *
- * @param size The size of the messages to send in bytes.
- */
- private void runTestForMessagesOfSize(int size)
- {
- Properties testConfig = new Properties();
- testConfig.put("TEST_NAME", "TC5_PubSubMessageSize");
- testConfig.put("PUBSUB_KEY", "tc3route");
- testConfig.put("PUBSUB_NUM_MESSAGES", 10);
- testConfig.put("PUBSUB_NUM_RECEIVERS", 5);
- testConfig.put("messageSize", size);
-
- /*Message[] reports =*/
- getCircuitFactory().sequenceTest(null, null, testConfig);
-
- // Compare sender and receivers reports.
- /*
- int messagesSent = reports[0].getIntProperty("MESSAGE_COUNT");
- int messagesReceived = reports[1].getIntProperty("MESSAGE_COUNT");
-
- Assert.assertEquals("The requested number of messages were not sent.", 50, messagesSent);
- Assert.assertEquals("Sender and receivers messages sent did not match up.", messagesSent, messagesReceived);
- */
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as defined in the
- * interop testing specification. For example the method "testP2P" might map onto the interop test case name
- * "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "TC5_PubSubMessageSize";
- }
-}
diff --git a/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedClientTestCase.java b/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedClientTestCase.java
deleted file mode 100644
index 63e2c75509..0000000000
--- a/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedClientTestCase.java
+++ /dev/null
@@ -1,906 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.sustained;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.client.AMQNoConsumersException;
-import org.apache.qpid.client.AMQNoRouteException;
-import org.apache.qpid.test.framework.distributedtesting.TestClient;
-import org.apache.qpid.interop.clienttestcases.TestCase3BasicPubSub;
-import org.apache.qpid.test.framework.TestUtils;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.ExceptionListener;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-import javax.jms.TextMessage;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.concurrent.CountDownLatch;
-
-/**
- * Implements test case 3, basic pub/sub. Sends/received a specified number of messages to a specified route on the
- * default topic exchange, using the specified number of receivers connections. Produces reports on the actual number of
- * messages sent/received.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Send required number of test messages using pub/sub. <tr><td> Generate test reports.
- * </table>
- */
-public class SustainedClientTestCase extends TestCase3BasicPubSub implements ExceptionListener, MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(SustainedClientTestCase.class);
-
- /** Used to log to the console. */
- private static final Logger console = Logger.getLogger("SustainedTest");
-
- /** The role to be played by the test. */
- private Roles role;
-
- /** The number of receivers connection to use. */
- private int numReceivers;
-
- /** The routing key to send them to on the default direct exchange. */
- private Destination sendDestination;
-
- /** The routing key to send updates to on the default direct exchange. */
- private Destination sendUpdateDestination;
-
- /** The connections to send/receive the test messages on. */
- private Connection[] connection;
-
- /** The sessions to send/receive the test messages on. */
- private Session[] session;
-
- /** The producer to send the test messages with. */
- MessageProducer producer;
-
- /** Adapter that adjusts the send rate based on the updates from clients. */
- SustainedRateAdapter _rateAdapter;
-
- /** */
- int _batchSize;
-
- private static final long TEN_MILLI_SEC = 10000000;
- private static final int DEBUG_LOG_UPATE_INTERVAL = 10;
- private static final int LOG_UPATE_INTERVAL = 10;
- private static final boolean SLEEP_PER_MESSAGE = Boolean.getBoolean("sleepPerMessage");
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the interop
- * testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- log.debug("public String getName(): called");
-
- return "Perf_SustainedPubSub";
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the assignment
- * message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role = " + role + ", Message assignRoleMessage = " + assignRoleMessage
- + "): called");
-
- // Take note of the role to be played.
- this.role = role;
-
- // Extract and retain the test parameters.
- numReceivers = assignRoleMessage.getIntProperty("SUSTAINED_NUM_RECEIVERS");
- _batchSize = assignRoleMessage.getIntProperty("SUSTAINED_UPDATE_INTERVAL");
- String sendKey = assignRoleMessage.getStringProperty("SUSTAINED_KEY");
- String sendUpdateKey = assignRoleMessage.getStringProperty("SUSTAINED_UPDATE_KEY");
- int ackMode = assignRoleMessage.getIntProperty("ACKNOWLEDGE_MODE");
- String clientName = assignRoleMessage.getStringProperty("CLIENT_NAME");
-
- if (log.isDebugEnabled())
- {
- log.debug("numReceivers = " + numReceivers);
- log.debug("_batchSize = " + _batchSize);
- log.debug("ackMode = " + ackMode);
- log.debug("sendKey = " + sendKey);
- log.debug("sendUpdateKey = " + sendUpdateKey);
- log.debug("role = " + role);
- }
-
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a single message producer if so.
- case SENDER:
- console.info("Creating Sender");
- // Create a new connection to pass the test messages on.
- connection = new Connection[1];
- session = new Session[1];
-
- connection[0] = TestUtils.createConnection(TestClient.testContextProperties);
- session[0] = connection[0].createSession(false, ackMode);
-
- // Extract and retain the test parameters.
- sendDestination = session[0].createTopic(sendKey);
-
- connection[0].setExceptionListener(this);
-
- producer = session[0].createProducer(sendDestination);
-
- sendUpdateDestination = session[0].createTopic(sendUpdateKey);
- MessageConsumer updateConsumer = session[0].createConsumer(sendUpdateDestination);
-
- _rateAdapter = new SustainedRateAdapter(this);
- updateConsumer.setMessageListener(_rateAdapter);
-
- break;
-
- // Otherwise the receivers role is being assigned, so set this up to listen for messages on the required number
- // of receivers connections.
- case RECEIVER:
- console.info("Creating Receiver");
- // Create the required number of receivers connections.
- connection = new Connection[numReceivers];
- session = new Session[numReceivers];
-
- for (int i = 0; i < numReceivers; i++)
- {
- connection[i] = TestUtils.createConnection(TestClient.testContextProperties);
- session[i] = connection[i].createSession(false, ackMode);
-
- sendDestination = session[i].createTopic(sendKey);
-
- sendUpdateDestination = session[i].createTopic(sendUpdateKey);
-
- MessageConsumer consumer = session[i].createConsumer(sendDestination);
-
- consumer.setMessageListener(new SustainedListener(clientName + "-" + i, _batchSize, session[i],
- sendUpdateDestination));
- }
-
- break;
- }
-
- // Start all the connection dispatcher threads running.
- for (int i = 0; i < connection.length; i++)
- {
- connection[i].start();
- }
- }
-
- /** Performs the test case actions.
- * @param numMessages*/
- public void start(int numMessages) throws JMSException
- {
- log.debug("public void start(): called");
-
- // Check that the sender role is being performed.
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a single message producer if so.
- case SENDER:
- _rateAdapter.run();
- break;
- case RECEIVER:
-
- }
-
- // return from here when you have finished the test.. this will signal the controller and
- }
-
- public void terminate() throws JMSException, InterruptedException
- {
- if (_rateAdapter != null)
- {
- _rateAdapter.stop();
- }
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- log.debug("public Message getReport(Session controlSession): called");
-
- // Close the test connections.
- for (int i = 0; i < connection.length; i++)
- {
- connection[i].close();
- }
-
- Message report = session.createMessage();
- report.setStringProperty("CONTROL_TYPE", "REPORT");
-
- return report;
- }
-
- public void onException(JMSException jmsException)
- {
- Exception linked = jmsException.getLinkedException();
-
- if (linked != null)
- {
- if (log.isDebugEnabled())
- {
- log.debug("Linked Exception:" + linked);
- }
-
- if ((linked instanceof AMQNoRouteException) || (linked instanceof AMQNoConsumersException))
- {
- if (log.isDebugEnabled())
- {
- if (linked instanceof AMQNoConsumersException)
- {
- log.warn("No clients currently available for message:"
- + ((AMQNoConsumersException) linked).getUndeliveredMessage());
- }
- else
- {
- log.warn("No route for message");
- }
- }
-
- // Tell the rate adapter that there are no clients ready yet
- _rateAdapter.NO_CLIENTS = true;
- }
- }
- else
- {
- log.warn("Exception:" + linked);
- }
- }
-
- /**
- * Inner class that listens for messages and sends a report for the time taken between receiving the 'start' and
- * 'end' messages.
- */
- class SustainedListener implements MessageListener
- {
- /** Number of messages received */
- private long _received = 0;
- /** The number of messages in the batch */
- private int _batchSize = 0;
- /** Record of the when the 'start' messagse was sen */
- private Long _startTime;
- /** Message producer to use to send reports */
- MessageProducer _updater;
- /** Session to create the report message on */
- Session _session;
- /** Record of the client ID used for this SustainedListnener */
- String _client;
-
- /**
- * Main Constructor
- *
- * @param clientname The _client id used to identify this connection.
- * @param batchSize The number of messages that are to be sent per batch. Note: This is not used to
- * control the interval between sending reports.
- * @param session The controlSession used for communication.
- * @param sendDestination The destination that update reports should be sent to.
- *
- * @throws JMSException My occur if creatingthe Producer fails
- */
- public SustainedListener(String clientname, int batchSize, Session session, Destination sendDestination)
- throws JMSException
- {
- _batchSize = batchSize;
- _client = clientname;
- _session = session;
- _updater = session.createProducer(sendDestination);
- }
-
- public void onMessage(Message message)
- {
- if (log.isDebugEnabled())
- {
- log.debug("Message " + _received + "received in listener");
- }
-
- if (message instanceof TextMessage)
- {
- try
- {
- _received++;
- if (((TextMessage) message).getText().equals("start"))
- {
- log.debug("Starting Batch");
- _startTime = System.nanoTime();
- }
- else if (((TextMessage) message).getText().equals("end"))
- {
- if (_startTime != null)
- {
- long currentTime = System.nanoTime();
- sendStatus(currentTime - _startTime, _received, message.getIntProperty("BATCH"));
- log.debug("End Batch");
- }
- }
- }
- catch (JMSException e)
- {
- // ignore error
- }
- }
-
- }
-
- /**
- * sendStatus creates and sends the report back to the publisher
- *
- * @param time taken for the the last batch
- * @param received Total number of messages received.
- * @param batchNumber the batch number
- * @throws JMSException if an error occurs during the send
- */
- private void sendStatus(long time, long received, int batchNumber) throws JMSException
- {
- Message updateMessage = _session.createTextMessage("update");
- updateMessage.setStringProperty("CLIENT_ID", ":" + _client);
- updateMessage.setStringProperty("CONTROL_TYPE", "UPDATE");
- updateMessage.setLongProperty("RECEIVED", received);
- updateMessage.setIntProperty("BATCH", batchNumber);
- updateMessage.setLongProperty("DURATION", time);
-
- if (log.isInfoEnabled())
- {
- log.info("**** SENDING [" + batchNumber + "]**** " + "CLIENT_ID:" + _client + " RECEIVED:" + received
- + " BATCH:" + batchNumber + " DURATION:" + time);
- }
-
- // Output on the main console.info the details of this batch
- if ((batchNumber % 10) == 0)
- {
- console.info("Sending Report [" + batchNumber + "] " + "CLIENT_ID:" + _client + " RECEIVED:" + received
- + " BATCH:" + batchNumber + " DURATION:" + time);
- }
-
- _updater.send(updateMessage);
- }
- }
-
- /**
- * This class is used here to adjust the _delay value which in turn is used to control the number of messages/second
- * that are sent through the test system.
- *
- * By keeping a record of the messages recevied and the average time taken to process the batch size can be
- * calculated and so the delay can be adjusted to maintain that rate.
- *
- * Given that delays of < 10ms can be rounded up the delay is only used between messages if the _delay > 10ms * no
- * messages in the batch. Otherwise the delay is used at the end of the batch.
- */
- class SustainedRateAdapter implements MessageListener, Runnable
- {
- private SustainedClientTestCase _client;
- private long _batchVariance = Integer.getInteger("batchVariance", 3); // no. batches to allow drifting
- private long _timeVariance = TEN_MILLI_SEC * 5; // no. nanos between send and report delay (10ms)
- private volatile long _delay; // in nanos
- private long _sent;
- private Map<String, Long> _slowClients = new HashMap<String, Long>();
- private static final long PAUSE_SLEEP = TEN_MILLI_SEC / 1000; // 10 ms
- private static final long NO_CLIENT_SLEEP = 1000; // 1s
- private volatile boolean NO_CLIENTS = true;
- private int _delayShifting;
- private final int REPORTS_WITHOUT_CHANGE = Integer.getInteger("stableReportCount", 5);
- private boolean _warmedup = false;
- private static final long EXPECTED_TIME_PER_BATCH = 100000L;
- private int _warmUpBatches = Integer.getInteger("warmUpBatches", 10);
-
- SustainedRateAdapter(SustainedClientTestCase client)
- {
- _client = client;
- }
-
- public void onMessage(Message message)
- {
- if (log.isDebugEnabled())
- {
- log.debug("SustainedRateAdapter onMessage(Message message = " + message + "): called");
- }
-
- try
- {
- String controlType = message.getStringProperty("CONTROL_TYPE");
-
- // Check if the message is a test invite.
- if ("UPDATE".equals(controlType))
- {
- NO_CLIENTS = false;
- long duration = message.getLongProperty("DURATION");
- long totalReceived = message.getLongProperty("RECEIVED");
- String client = message.getStringProperty("CLIENT_ID");
- int batchNumber = message.getIntProperty("BATCH");
-
- if (log.isInfoEnabled() && ((batchNumber % DEBUG_LOG_UPATE_INTERVAL) == 0))
- {
- log.info("Update Report: CLIENT_ID:" + client + " RECEIVED:" + totalReceived + " Recevied BATCH:"
- + batchNumber + " DURATION:" + duration);
- }
-
- recordSlow(client, totalReceived, batchNumber);
-
- adjustDelay(client, batchNumber, duration);
-
- // Warm up completes when:
- // we haven't warmed up
- // and the number of batches sent to each client is at least half of the required warmup batches
- if (!_warmedup && (batchNumber >= _warmUpBatches))
- {
- _warmedup = true;
- _warmup.countDown();
-
- }
- }
- }
- catch (JMSException e)
- {
- //
- }
- }
-
- CountDownLatch _warmup = new CountDownLatch(1);
-
- int _numBatches = 10000;
-
- // long[] _timings = new long[_numBatches];
- private boolean _running = true;
-
- public void run()
- {
- console.info("Warming up");
-
- doBatch(_warmUpBatches);
-
- try
- {
- // wait for warmup to complete.
- _warmup.await();
-
- // set delay to the average length of the batches
- _delay = _totalDuration / _warmUpBatches / delays.size();
-
- console.info("Warmup complete delay set : " + _delay + " based on _totalDuration: " + _totalDuration
- + " over no. batches: " + _warmUpBatches + " with client count: " + delays.size());
-
- _totalDuration = 0L;
- _totalReceived = 0L;
- _sent = 0L;
- }
- catch (InterruptedException e)
- {
- //
- }
-
- doBatch(_numBatches);
-
- }
-
- private void doBatch(int batchSize) // long[] timings,
- {
- TextMessage testMessage = null;
- try
- {
- testMessage = _client.session[0].createTextMessage("start");
-
- for (int batch = 0; batch <= batchSize; batch++)
- // while (_running)
- {
- long start = System.nanoTime();
-
- testMessage.setText("start");
- testMessage.setIntProperty("BATCH", batch);
-
- _client.producer.send(testMessage);
- _rateAdapter.sentMessage();
-
- testMessage.setText("test");
- // start at 2 so start and end count as part of batch
- for (int m = 2; m < _batchSize; m++)
- {
- _client.producer.send(testMessage);
- _rateAdapter.sentMessage();
- }
-
- testMessage.setText("end");
- _client.producer.send(testMessage);
- _rateAdapter.sentMessage();
-
- long end = System.nanoTime();
-
- long sendtime = end - start;
-
- if (log.isDebugEnabled())
- {
- log.info("Sent batch[" + batch + "](" + _batchSize + ") in " + sendtime); // timings[batch]);
- }
-
- if ((batch % LOG_UPATE_INTERVAL) == 0)
- {
- console.info("Sent Batch[" + batch + "](" + _batchSize + ")" + status());
- }
-
- _rateAdapter.sleepBatch();
-
- }
- }
- catch (JMSException e)
- {
- console.error("Runner ended");
- }
- }
-
- private String status()
- {
- return " TotalDuration: " + _totalDuration + " for " + delays.size() + " consumers" + " Delay is " + _delay
- + " resulting in "
- + ((_delay > (TEN_MILLI_SEC * _batchSize)) ? ((_delay / _batchSize) + "/msg") : (_delay + "/batch"));
- }
-
- private void sleepBatch()
- {
- if (checkForSlowClients())
- { // if there werwe slow clients we have already slept so don't sleep anymore again.
- return;
- }
-
- if (!SLEEP_PER_MESSAGE)
- {
- // per batch sleep.. if sleep is to small to spread over the batch.
- if (_delay <= (TEN_MILLI_SEC * _batchSize))
- {
- sleepLong(_delay);
- }
- else
- {
- log.info("Not sleeping _delay > ten*batch is:" + _delay);
- }
- }
- }
-
- public void stop()
- {
- _running = false;
- }
-
- Map<String, Long> delays = new HashMap<String, Long>();
- Long _totalReceived = 0L;
- Long _totalDuration = 0L;
- int _skipUpdate = 0;
-
- /**
- * Adjust the delay for sending messages based on this update from the client
- *
- * @param client The client that send this update
- * @param duration The time taken for the last batch of messagse
- * @param batchNumber The reported batchnumber from the client
- */
- private void adjustDelay(String client, int batchNumber, long duration)
- {
- // Retrieve the current total time taken for this client.
- Long currentTime = delays.get(client);
-
- // Add the new duration time to this client
- if (currentTime == null)
- {
- currentTime = duration;
- }
- else
- {
- currentTime += duration;
- }
-
- delays.put(client, currentTime);
-
- long batchesSent = _sent / _batchSize;
-
- // ensure we don't divide by zero
- if (batchesSent == 0)
- {
- batchesSent = 1L;
- }
-
- _totalReceived += _batchSize;
- _totalDuration += duration;
-
- // calculate average duration accross clients per batch
- long averageDuration = _totalDuration / delays.size() / batchesSent;
-
- // calculate the difference between current send delay and average report delay
- long diff = (duration) - averageDuration;
-
- if (log.isInfoEnabled() && ((batchNumber % DEBUG_LOG_UPATE_INTERVAL) == 0))
- {
- log.info("TotalDuration:" + _totalDuration + " for " + delays.size() + " consumers." + " on batch: "
- + batchesSent + " received batch: " + batchNumber + " Batch Duration: " + duration + " Average: "
- + averageDuration + " so diff: " + diff + " for : " + client + " Delay is " + _delay + " resulting in "
- + ((_delay > (TEN_MILLI_SEC * _batchSize)) ? ((_delay / _batchSize) + "/msg") : (_delay + "/batch")));
- }
-
- // if the averageDuration differs from the current by more than the specified variane then adjust delay.
- if (Math.abs(diff) > _timeVariance)
- {
-
- // if the the _delay is larger than the required duration to send report
- // speed up
- if (diff > TEN_MILLI_SEC)
- {
- _delay -= TEN_MILLI_SEC;
-
- if (_delay < 0)
- {
- _delay = 0;
- log.info("Reset _delay to 0");
- delayStable();
- }
- else
- {
- delayChanged();
- }
-
- }
- else if (diff < 0) // diff < 0 diff cannot be 0 as it is > _timeVariance
- {
- // the report took longer
- _delay += TEN_MILLI_SEC;
- delayChanged();
- }
- }
- else
- {
- delayStable();
- }
-
- // If we have a consumer that is behind with the batches.
- if ((batchesSent - batchNumber) > _batchVariance)
- {
- log.debug("Increasing _delay as sending more than receiving");
-
- _delay += 2 * TEN_MILLI_SEC;
- delayChanged();
- }
-
- }
-
- /** Reset the number of iterations before we say the delay has stabilised. */
- private void delayChanged()
- {
- _delayShifting = REPORTS_WITHOUT_CHANGE;
- }
-
- /**
- * Record the fact that delay has stabilised If delay has stablised for REPORTS_WITHOUT_CHANGE then it will
- * output Delay stabilised
- */
- private void delayStable()
- {
- _delayShifting--;
-
- if (_delayShifting < 0)
- {
- _delayShifting = 0;
- console.debug("Delay stabilised:" + _delay);
- }
- }
-
- /**
- * Checks that the client has received enough messages. If the client has fallen behind then they are put in the
- * _slowClients lists which will increase the delay.
- *
- * @param client The client identifier to check
- * @param received the number of messages received by that client
- * @param batchNumber
- */
- private void recordSlow(String client, long received, int batchNumber)
- {
- if (Math.abs(batchNumber - (_sent / _batchSize)) > _batchVariance)
- {
- _slowClients.put(client, received);
- }
- else
- {
- _slowClients.remove(client);
- }
- }
-
- /** Incrment the number of sent messages and then sleep, if required. */
- public void sentMessage()
- {
-
- _sent++;
-
- if (_delay > (TEN_MILLI_SEC * _batchSize))
- {
- long batchDelay = _delay / _batchSize;
- // less than 10ms sleep doesn't always work.
- // _delay is in nano seconds
- // if (batchDelay < (TEN_MILLI_SEC))
- // {
- // sleep(0, (int) batchDelay);
- // }
- // else
- {
- // if (batchDelay < 30000000000L)
- {
- sleepLong(batchDelay);
- }
- }
- }
- else
- {
- if (SLEEP_PER_MESSAGE && (_delay > 0))
- {
- sleepLong(_delay / _batchSize);
- }
- }
- }
-
- /**
- * Check at the end of each batch and pause sending messages to allow slow clients to catch up.
- *
- * @return true if there were slow clients that caught up.
- */
- private boolean checkForSlowClients()
- {
- // This will allways be true as we are running this at the end of each batchSize
- // if (_sent % _batchSize == 0)
- {
- // Cause test to pause when we have slow
- if (!_slowClients.isEmpty() || NO_CLIENTS)
- {
-
- while (!_slowClients.isEmpty())
- {
- if (log.isInfoEnabled() && ((_sent / _batchSize % DEBUG_LOG_UPATE_INTERVAL) == 0))
- {
- String clients = "";
- Iterator it = _slowClients.keySet().iterator();
- while (it.hasNext())
- {
- clients += it.next();
- if (it.hasNext())
- {
- clients += ", ";
- }
- }
-
- log.info("Pausing for slow clients:" + clients);
- }
-
- if (console.isDebugEnabled() && ((_sent / _batchSize % LOG_UPATE_INTERVAL) == 0))
- {
- console.debug(_slowClients.size() + " slow clients.");
- }
-
- sleep(PAUSE_SLEEP);
- }
-
- if (NO_CLIENTS)
- {
- sleep(NO_CLIENT_SLEEP);
- }
-
- log.debug("Continuing");
-
- return true;
- }
- else
- {
- if ((_sent / _batchSize % LOG_UPATE_INTERVAL) == 0)
- {
- console.info("Total Delay :" + _delay + " "
- + ((_delayShifting == 0) ? "Stablised" : ("Not Stablised(" + _delayShifting + ")")));
- }
- }
-
- }
-
- return false;
- }
-
- /**
- * Sleep normally takes micro-seconds this allows the use of a nano-second value.
- *
- * @param delay nanoseconds to sleep for.
- */
- private void sleepLong(long delay)
- {
- sleep(delay / 1000000, (int) (delay % 1000000));
- }
-
- /**
- * Sleep for the specified micro-seconds.
- * @param sleep microseconds to sleep for.
- */
- private void sleep(long sleep)
- {
- sleep(sleep, 0);
- }
-
- /**
- * Perform the sleep , swallowing any InteruptException.
- *
- * NOTE: If a sleep request is > 10s then reset only sleep for 5s
- *
- * @param milli to sleep for
- * @param nano sub miliseconds to sleep for
- */
- private void sleep(long milli, int nano)
- {
- try
- {
- log.debug("Sleep:" + milli + ":" + nano);
- if (milli > 10000)
- {
-
- if (_delay == milli)
- {
- _totalDuration = _totalReceived / _batchSize * EXPECTED_TIME_PER_BATCH;
- log.error("Sleeping for more than 10 seconds adjusted to 5s!:" + (milli / 1000)
- + "s. Reset _totalDuration:" + _totalDuration);
- }
- else
- {
- log.error("Sleeping for more than 10 seconds adjusted to 5s!:" + (milli / 1000) + "s");
- }
-
- milli = 5000;
- }
-
- Thread.sleep(milli, nano);
- }
- catch (InterruptedException e)
- {
- //
- }
- }
-
- public void setClient(SustainedClientTestCase client)
- {
- _client = client;
- }
- }
-
-}
diff --git a/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedTestCase.java b/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedTestCase.java
deleted file mode 100644
index 0077b4727a..0000000000
--- a/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedTestCase.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.sustained;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.test.framework.DropInTest;
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-
-import java.util.Properties;
-
-/**
- * SustainedTestCase is a {@link FrameworkBaseCase} that runs the "Perf_SustainedPubSub" test case. This consists of one
- * test client sending, and several receiving, and attempts to find the highest rate at which messages can be broadcast
- * to the receivers. It is also a {@link DropInTest} to which more test clients may be added during a test run.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td>
- * </table>
- */
-public class SustainedTestCase extends FrameworkBaseCase implements DropInTest
-{
- /** Used for debugging. */
- Logger log = Logger.getLogger(SustainedTestCase.class);
-
- /** Holds the root name of the topic on which to send the test messages. */
- private static final String SUSTAINED_KEY = "Perf_SustainedPubSub";
-
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public SustainedTestCase(String name)
- {
- super(name);
- }
-
- /**
- * Performs a single test run of the sustained test.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testBasicPubSub() throws Exception
- {
- log.debug("public void testSinglePubSubCycle(): called");
-
- Properties testConfig = new Properties();
- testConfig.put("TEST_NAME", "Perf_SustainedPubSub");
- testConfig.put("SUSTAINED_KEY", SUSTAINED_KEY);
- testConfig.put("SUSTAINED_NUM_RECEIVERS", Integer.getInteger("numReceives", 2));
- testConfig.put("SUSTAINED_UPDATE_INTERVAL", Integer.getInteger("batchSize", 1000));
- testConfig.put("SUSTAINED_UPDATE_KEY", SUSTAINED_KEY + ".UPDATE");
- testConfig.put("ACKNOWLEDGE_MODE", Integer.getInteger("ackMode", AMQSession.AUTO_ACKNOWLEDGE));
-
- log.info("Created Config: " + testConfig.entrySet().toArray());
-
- getCircuitFactory().sequenceTest(null, null, testConfig);
- }
-
- /**
- * Accepts a late joining client into this test case. The client will be enlisted with a control message
- * with the 'CONTROL_TYPE' field set to the value 'LATEJOIN'. It should also provide values for the fields:
- *
- * <p/><table>
- * <tr><td> CLIENT_NAME <td> A unique name for the new client.
- * <tr><td> CLIENT_PRIVATE_CONTROL_KEY <td> The key for the route on which the client receives its control messages.
- * </table>
- *
- * @param message The late joiners join message.
- *
- * @throws JMSException Any JMS Exception are allowed to fall through, indicating that the join failed.
- */
- public void lateJoin(Message message) throws JMSException
- {
- throw new RuntimeException("Not implemented.");
- /*
- // Extract the joining clients details from its join request message.
- TestClientDetails clientDetails = new TestClientDetails();
- clientDetails.clientName = message.getStringProperty("CLIENT_NAME");
- clientDetails.privateControlKey = message.getStringProperty("CLIENT_PRIVATE_CONTROL_KEY");
-
- // Register the joining client, but do block for confirmation as cannot do a synchronous receivers during this
- // method call, as it may have been called from an 'onMessage' method.
- assignReceiverRole(clientDetails, new Properties(), false);
- */
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as known to the test
- * clients that will run the test. The purpose of this is to convert the JUnit method name into the correct test
- * case name to place into the test invite. For example the method "testP2P" might map onto the interop test case
- * name "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- *
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "Perf_SustainedPubSub";
- }
-}
diff --git a/java/integrationtests/src/resources/sustained-log4j.xml b/java/integrationtests/src/resources/sustained-log4j.xml
deleted file mode 100644
index c5ab3137bf..0000000000
--- a/java/integrationtests/src/resources/sustained-log4j.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0"?>
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
- - or more contributor license agreements. See the NOTICE file
- - distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
- -->
-<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
-
- <appender name="FileAppender" class="org.apache.log4j.FileAppender">
- <param name="File" value="${QPID_WORK}/log/${logprefix}qpid${logsuffix}.log"/>
- <param name="Append" value="false"/>
-
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
- </layout>
- </appender>
-
- <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
-
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d %-5p (%F:%L) - %m%n"/>
- <!--param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/-->
- </layout>
- </appender>
-
- <category name="SustainedTest">
- <priority value="${sustained.level}"/>
- </category>
-
- <category name="org.apache">
- <priority value="warn"/>
- </category>
-
- <category name="org.apache.qpid.interop">
- <priority value="${interop.logging.level}"/>
- </category>
-
-
- <category name="org.apache.qpid.sustained">
- <priority value="${amqj.logging.level}"/>
- </category>
-
- <!--category name="org.apache.qpid.server.txn">
- <priority value="debug"/>
- </category>-->
-
- <root>
- <priority value="all"/>
- <appender-ref ref="STDOUT"/>
- <!--appender-ref ref="ArchivingFileAppender"/-->
- </root>
-</log4j:configuration>
diff --git a/java/ivy.xml b/java/ivy.xml
index 899c5fa79b..cc891094a3 100644
--- a/java/ivy.xml
+++ b/java/ivy.xml
@@ -18,7 +18,7 @@
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
- <info organisation="org/apache" module="qpid" revision="0.15"/>
+ <info organisation="org/apache" module="qpid" revision="0.17"/>
<publications xmlns:e="urn:ant.apache.org:ivy-extras">
<artifact name="qpid-client" type="pom" ext="pom"/>
diff --git a/java/jca/.gitignore b/java/jca/.gitignore
deleted file mode 100644
index 1377554ebe..0000000000
--- a/java/jca/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.swp
diff --git a/java/jca/README.txt b/java/jca/README.txt
index 29e6825c4c..a4d426310d 100644
--- a/java/jca/README.txt
+++ b/java/jca/README.txt
@@ -5,9 +5,10 @@ Overview
The Qpid Resource Adapter is a JCA 1.5 compliant resource adapter that allows
for JEE integration between EE applications and AMQP 0.10 message brokers.
-The adapter provides both outbound and inbound connectivity and
+The Qpid JCA adapter provides both outbound and inbound connectivity and
exposes a variety of options to fine tune your messaging applications. Currently
-the adapter only supports C++ based brokers and has only been tested with Apache Qpid C++ broker.
+the adapter only supports C++ based brokers and has only been tested with Apache
+Qpid C++ broker.
The following document explains general configuration information for the Qpid JCA RA. Details for
specific application server platforms are provided in separate README files typically designated as
@@ -31,30 +32,29 @@ When a ManagedConnectionFactory JavaBean or ActivationSpec JavaBean are deployed
the configuration properties from the ResourceAdapter or provide specific properties which in turn will override
the defaults.
-While some of the properties from the three componets are specific to the JCA adapter, a majority of the
-properties directly correspond the the Qpid JMS client. As such, it is strongly encouraged your familiarize
-yourself with the correct syntax, configuration options for the JMS client as well as the JCA adapter. Similarly,
-familiarity with the 1.5 JCA specification is encouraged though not strictly required.
+While some of the properties from the three components are specific to the JCA adapter, a majority of the
+properties directly correspond the the Qpid JMS client. As such, familiarity with the Qpid JMS Client is strongly
+encouraged. Similarly, familiarity with the JCA 1.5 specification is encouraged though not strictly required.
The ResourceAdapter JavaBean
============================
-The ResourceAdapter JavaBean provides global configuration options for both inbound and outbound connectivity.
-The set of ResourceAdapter properties are described below. The ResourceAdapter properties can be found in the META-INF/ra.xml
-deployment descriptor which is provided with the adapter. Note, deploying a ResourceAdapter, ManagedConnectionFactory
-or ActivationSpec is application server specific. As such, this document provides an explanation of these properties
-but not how they are configured as this is environment specific.
+The ResourceAdapter JavaBean provides global configuration options for both inbound and outbound
+connectivity. The set of ResourceAdapter properties are described below. The ResourceAdapter properties
+can be found in the META-INF/ra.xml deployment descriptor which is provided with the adapter. Note,
+deploying a ResourceAdapter, ManagedConnectionFactory or ActivationSpec is application server specific.
+As such, this document provides an explanation of these properties but not how they are configured.
ResourceAdapter JavaBean Properties
===================================
-ClientID
+ClientId
The unique client identifier. From the JMS API this is used only in the context of durable subscriptions.
Default: client_id
SetupAttempts
- The number of attempts the ResourceAdapter will make to successfully setup an inbound activation on deployment, or when an exception
- occurs at runtime.
+ The number of attempts the ResourceAdapter will make to successfully setup an inbound activation on deployment,
+ or when an exception occurs at runtime.
Default: 5
SetupInterval
@@ -65,14 +65,6 @@ UseLocalTx
Whether or not to use local transactions instead of XA.
Default: false
-DefaultUserName
- The default user name to use.
-Default: guest
-
-DefaultPassword
- The default password to use.
-Default: guest
-
Host
The hostname/ip address of the broker.
Default: localhost
@@ -87,23 +79,25 @@ Default: test
ConnectionURL
The full connection URL to the broker.
-Default:amqp://guest:guest@/test?brokerlist='tcp://localhost:5672'
+Default: amqp://anonymous:passwd@client/test?brokerlist='tcp://localhost?sasl_mechs='PLAIN''
TransactionManagerLocatorClass
- The class responsible for locating the transaction manager within a specific application server. This is a ResourceAdapter
- Java Bean specific property and is application server specific. As such, it is currently commented out. Two examples have
- been provided.
+ The class responsible for locating the transaction manager within a specific application server.
+ This is a ResourceAdapter Java Bean specific property and is application server specific, as such,
+ no default is provided.
Default: none
TransactionManagerLocatorMethod
- The specific method on the class above used to acquire a reference to the platform specific transaction manager.
- This is a ResourceAdapter Java Bean specific property and is application server specific.
- As such, it is currently commented out. Two examples have been provided.
+ The specific method on the TransactionManagerLocatorClass used to acquire a reference to the platform
+ specific transaction manager. This is a ResourceAdapter Java Bean specific property and is application
+ server specific as such, no default is provided.
Default:none
-Note, if you require XA support, both the TransactionManagerLocatorClass and the TransactionManagerLocatorMethod
-properties MUST be set. While application servers typically provide a mechanism to do this in the form of a specific
-deployment descriptor, or GUI console, the ra.xml file can also be modified directly.
+UseConnectionPerHandler
+ The Apache C++ Broker multiplexes on the physical connection rather than the session. As a result, performance
+ improvements can be gained by allocating and assigning a connection per inbound listener. The alternative is
+ to share a connection across each handler for a given endpoint (MDB).
+Default:true
The ManagedConnectionFactory JavaBean
=====================================
@@ -112,28 +106,16 @@ The ManagedConnectionFactory JavaBean provides outbound connectivity for the Qpi
inherited from the ResourceAdapter JavaBean, the ManagedConnectionFactory JavaBean provides specific properties only applicable
to outbound connectivity.
-sessionDefaulType
+SessionDefaulType
The default type of Session. Currently unused.
Default: java.jms.Queue
-useTryLock
+UseTryLock
Multi-purpose property used to specify both that a lock on the underlying managed connection should be used, as well as the
wait duration to aquire the lock. Primarily used for transaction management. A null or zero value will atttempt to acquire
the lock without a duration. Anything greater than zero will wait n number of seconds before failing to acquire the lock.
Default:0
-KeyStorePassword
- The KeyStore password for SSL
-Default:none
-
-KeyStorePath
- The path to the KeyStore.
-Default:none
-
-CertType
- The type of certificate.
-Default:SunX509
-
The ActivationSpec JavaBean
===========================
The ActivationSpec JavaBean provides inbound connectivity for the Qpid JCA adapter. In addition to most of the properties
@@ -149,7 +131,7 @@ UseJNDI
Default: true
Destination
- The name of the destination on which to listen for messages.
+ The JNDI name of the destination on which to listen for messages.
Default:none
DestinationType
@@ -187,49 +169,56 @@ PrefetchLow
PrefetchHigh
Qpid specific -- TODO more explanation
-
+Setup
Administered Objects
======================
The JCA specification provides for administered objects. Ass per the specification, administered objects are
-JavaBeans that specific to the messaging provider. The Qpid JCA Resource Adapter provides two administered
+JavaBeans that specific to the messaging provider. The Qpid JCA Resource Adapter provides three administered
objects that can be used to configure JMS destinations and a specialized JMS Connection Factory respectively.
Both these administered objects have properities to support configuration and deployment.
-QpidDestinationProxy
+QpidQueue/QpidTopic
====================
- The QpidDestinationProxy allows a developer, deployer or adminstrator to create destinations (queues or topic) and
- bind these destinations into JNDI. The following lists the properties applicable to the QpidDestinationProxy
+The QpidQueue and QpidTopic AdminObjects allow binding JMS destintations into the JEE JNDI namespace. Both
+objects support one property:
+
+DestinationAddress
+ The address string of the destination. Please see the Qpid JMS client documentation for valid values.
-destinationType
- The type of destination to create. Valid values are QUEUE or TOPIC.
+Example:
+ DestinationAddress=hello.Queue;{create:always, node:{type:queue, x-declare:{auto-delete:true}}}
+ DestinationAddress=amq.topic/hello.Topic
+ The QpidQueue/QpidTopic AdminObjects allow a developer, deployer or adminstrator to create destinations
+ (queues or topic) and bind these destinations into JNDI. Only one property is required:
-destinationAddress
- The address string of the destination. Please see the Qpid Java JMS client documentation for valid values.
QpidConnectionFactoryProxy
+==========================
+The QpidConnectionFactoryProxy allows for a non-JCA ConnectionFactory to be bound into the JNDI tree. This
+ConnectionFactory can in turn be used outside of the application server. Typically a ConnectionFactory of
+this sort is used by Swing or other non-managed clients not requiring JCA. The QpidConnectionFactoryProxy
+provides one property
+
+ConnectionURL
+ This is the url used to configure the connection factory. Please see the Qpid JMS client documentation for
The QpidConnectionFactoryProxy allows for a non-JCA ConnectionFactory to be bound into the JNDI tree. This
ConnectionFactory can in turn be used outside of the application server. Typically a ConnectionFactory of
- this sort is used by Swing or other two-tier clients not requiring JCA. The QpidConnectionFactoryProxy provides
- one property
-
-connectionURL
- This is the url used to configure the connection factory. Please see the Qpid Java Client documentation for
- further details.
+ this sort is used by Java Swing or other non-managed clients not requiring JCA. One one property is
+ required:
+Example:
+ amqp://anonymous:passwd@client/test?brokerlist='tcp://localhost:5672?sasl_mechs='PLAIN''
Transaction Support
===================
The Qpid JCA Resource Adapter provides three levels of transaction support: XA, LocalTransactions and NoTransaction.
Typical usage of the Qpid JCA Resource adapter implies the use of XA transactions, though there are certain scenarios
where this is not preferred. Transaction support configuration is application server specific and as such, is explained
-in the corresponding documentation for each supported application server. However, there are two limitations with
-the Qpid JCA adapter at this time:
-
-1) Currently, the Qpid C++ broker does not support he use of XA within the context of clustered brokers. As such, if
-you are running in a cluster, you will need to configure the adapter to use LocalTransactions.
+in the corresponding documentation for each supported application server.
-2)XARecovery is currently not implemented. In the case of a system failure, in doubt transactions will have to be
-manually resolved by and administrator or otherwise qualified personnel.
+XA recovery, that is being able to recover 'in-doubt' transactions for a given resource manager is non-standardized,
+and as such is application server specific. Currently, the Qpid JCA adapter only supports recovery for JBoss EAP 5.x
+as a separate module.
Conclusion
==========
diff --git a/java/jca/example/.gitignore b/java/jca/example/.gitignore
index 54c810d4a0..624fd61581 100644
--- a/java/jca/example/.gitignore
+++ b/java/jca/example/.gitignore
@@ -1,3 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
build/*
lib/*
*.swp
diff --git a/java/jca/example/README-EXAMPLE.txt b/java/jca/example/README-EXAMPLE.txt
new file mode 100644
index 0000000000..3a2ee0c38e
--- /dev/null
+++ b/java/jca/example/README-EXAMPLE.txt
@@ -0,0 +1,235 @@
+Qpid JCA Example
+
+Overview
+========
+The Qpid JCA example provides a sample JEE application that demonstrates how to
+configure, install and run applications using the Qpid JCA adapter for JEE
+connectivity and the Apache Qpid C++ Broker. This example code can be used as a
+convenient starting point for your own development and deployment
+efforts.
+
+Example Components
+===================
+Currently the example application consists of the following components:
+
+Destinations
+============
+Any messaging application relies on destinations (queues or topics )
+in order to produce or consume messages.The Qpid JCA example provides
+the following destinations:
+
+ HelloTopic
+ GoodByeTopic
+ HelloQueue
+ GoodByeQueue
+ QpidRequestQueue
+ QpidResponseQueue
+
+Each destination is configured for the respective application server in which
+the examples will be run. Generally the example application allows for sending
+messages to a Hello<DestinationType>. Depending on a configuration option, once
+a message is received by the Hello component, the Hello component can also be
+sent to a GoodBye<DestinationType> component.
+
+The QpidRequest/Response destinations provide the destinations for the
+request/reponse messaging pattern.
+
+
+ConnectionFactories
+===================
+Similar to destinations, ConnectionFactories are a core component of both JMS
+and JCA. ConnectionFactories provide the necessary starting point to make a
+connection, establish a session and produce or consume (or both) messages from
+your JMS provider.
+
+The Qpid JCA example provides three connection factories by default:
+
+ QpidJMSXA
+ QpidJMS
+ QpidConnectionFactory
+
+Each of these ConnectionFactories varies in their capabilities and the context in which
+they should be used. By default, the Qpid JCA examples use the QpidJMSXA connection factory
+which provides for full XA transaction support. The QpidJMS connection factory provides a
+local JMS transaction CF and is currently deprecated, though it has been maintained for
+backwards compatibility. The QpidConnectionFactory is a specialized ConnectionFactory designed
+to be used outside of a JEE application server. This CF has been provided to support non-managed
+clients that want to use the JNDI facilities of JEE.
+
+The deployment configuration for destinations, and ConnectionFactories varies by JEE platform.
+Please see the application server specific documentation for specific instructions.
+
+EJB 3.x
+
+There are a six EJB 3.x components provided as part of the example.
+
+ QpidHelloSubscriberBean - MessageDrivenBean (MDB)
+ QpidGoodByeSubscriberBean - (MDB)
+ QpidHelloListenerBean - (MDB)
+ QpidGoodByeListenerBean - (MDB)
+ QpidJMSResponderBean - (MDB)
+ QpidTestBean - Stateless Session Bean (SLSB)
+
+Generally, the name of the EJB component corresponds to the aforementioned destinations
+listed above in the consumption of messages.
+
+QpidTestServlet
+A sample EE 2.5 servlet is provided allowing testing from a browser versus a RMI or JMS
+based client.
+
+QpidTestClient
+A Java based client allowing for both RMI or JMS access to the sample application. RMI or
+JMS access is based on configuration options.
+
+QpidRequestResponseClient
+A Java based client allowing for a request/response application.
+
+EE EAR archive
+ An EAR wrapper for the ejb and web components.
+
+A build.xml file
+ An ant build.xml file to configure, install and deploy the aforementioned components.
+
+Requirements
+============
+Apache Qpid Broker
+To run the sample it is assumed you have an Apache Qpid C++ broker configured and running.
+The example code assumes that the broker will run at localhost on port 5672. The broker
+address can be modified in the build-properties.xml file.
+
+Examples
+===============
+Using the Qpid JCA examples is the same regardless of preferred JEE application server.
+The provided clients and supported options are listed below.
+
+QpidTestClient
+==============
+As previously mentioned, the Qpid JCA example provides an RMI/JMS Java client to test
+the application. Executing the command
+
+ant-run client
+
+will execute the QpidTestClient client with the default options.
+
+QpidTestClient Options
+
+client.use.ejb (build.xml)
+Setting this value to false will result in the QpidTestClient using JMS to send messages to
+the configured destination.
+Default:true
+
+client.message
+The text content of the JMS message sent to the configured destination.
+Default: Hello Qpid World!
+
+client.message.count
+The number of messages that will be sent to the configured destionation.
+Default: 1
+
+client.use.topic
+Setting this value to true will send messages to HelloTopic versus HelloQueue.
+Default:false
+
+client.say.goodbye
+Setting this value to true will cause the listener on the Hello Queue/Topic to send a
+message to the GoodBye Queue/Topic
+Default:false
+
+
+QpidRequestResponseClient
+=========================
+Similar to the QpidTestClient, the QpidRequestResponseClient is a Java based application that allows for
+sending messages to a destination. The QpidRequestResponseClient also provides the capability for the
+application to listen for a response. Executing the command
+
+ant run-reqresp
+
+will run the application with the default options.
+
+QpidRequestResponseClient Options
+
+QpidTestServlet
+===============
+Similar to the QpidTestClient application, the Qpid JCA examples also provides a JEE Servlet to test and run the
+application. This Servlet can be used as an alternative, or in conjunction with the Java application. The Servlet
+can be reached via the following URL:
+
+http://<server-host-name>:<server-port>/qpid-jca-web/qpid
+
+where server-host and server-port are the host and port where you are running your application server.
+
+QpidTestServlet Options
+
+The QpidTestServlet options can be configured by appending certain values to the above URL. These values are
+listed below and generally correspond, both in name and purpose, to the Java application configuration options.
+
+message
+The text content of the JMS message sent to the configured destination.
+Default: Hello World!
+
+useEJB
+Setting this value to true will result in the QpidTestServlet using the QpidTestBean SLSB to
+send the message to the configured destination. By default the QpidTestServlet uses JMS.
+Default:false
+
+count
+The number of messages that will be sent to the configured destionation.
+Default: 1
+
+useTopic
+Setting this value to true will send messages to HelloTopic versus HelloQueue.
+Default:false
+
+sayGoodBye
+Setting this value to true will cause the listener on the Hello Queue/Topic to send a
+message to the GoodBye Queue/Topic
+Default:false
+
+useXA
+Setting this value to true will cause the QpidTestServlet to do all activity within the
+context of an XA transaction.
+Default:false
+
+useTX
+Setting this value to true will cause the QpidTestServlet to do all activity within the
+context of a JMS transation.
+Default:false
+
+
+Note, the useXA and useTX are mutually exclusive. Setting both to true, the QpidTestServlet
+will choose XA over a JMS transaction.
+
+QpidRequestResponseServlet
+==========================
+Similar to the QpidRequestResponseClient application, the Qpid JCA examples also provides a JEE Servlet
+to execute the request/response type messaging pattern. The Servlet can be reached via the following url:
+
+http://<server-host-name>:<server-port>/qpid-jca-web/qpid-reqresp
+
+where server-host and server-port are the host and port where you are running your application server.
+
+QpidRequestResponseServlet Options
+
+message
+The text content of the JMS message sent to the configured destination.
+Default: Hello World!
+
+count
+The number of messages that will be sent to the configured destionation.
+Default: 1
+
+useXA
+Setting this value to true will cause the QpidTestServlet to do all activity within the
+context of an XA transaction.
+Default:false
+
+Summary
+=======
+While conceptually simple, the Qpid JCA examples provide a majority of the component types and messaging patterns
+you are most likely to use your development efforts. With the Web and EJB components, you can experiment with
+various aspects of JCA as well as EE development in general using the Qpid Broker as your messaging provider.
+While this documentation highlights the major components and steps needed to take to get the example running,
+the possiblities for modifcation are numerous. You are encouraged to experiment with the example as you work
+to develop your own messaging applications.
+
+
diff --git a/java/jca/example/README-GERONIMO.txt b/java/jca/example/README-GERONIMO.txt
new file mode 100644
index 0000000000..d58d034c79
--- /dev/null
+++ b/java/jca/example/README-GERONIMO.txt
@@ -0,0 +1,69 @@
+Qpid JCA Example - Apache Geronimo 2.x
+
+Overview
+========
+This document explains the steps required to configure and
+deploy the Qpid JCA examples for the Apache Geronimo environment.
+General information can be found in the README.txt file.
+
+The Apache Geronimo environment provides two methods for deploying
+JEE application components: the web-based administration console and the
+command line based deployment environment. This document only explains
+the command line environment. Please see the Apache Geronimo 2.x
+documentation for the web-based console.
+
+Requirements
+============
+In order to deploy the Qpid JCA adapter, as well as the example application,
+the GERONIMO_HOME environemnt variable must be set. The environment variable
+should point to the root of your Apache Geronimo 2.x install directory.
+
+In order to automatically deploy the Qpid JCA Adapter, the QPID_JCA_HOME
+environment variable needs to be set. The environment variable should point
+to the directory which contains the Qpid JCA Adapter. If building from the
+source tree, by default this can be found at
+
+QPID_ROOT/java/build/lib
+
+If installing from RPM or other binary distribution, this can vary by platform.
+
+Prior to deploying any application component, the Apache Geronimo application
+should be started and available for requests.
+
+
+Deploy the Qpid JCA Adapter
+==============================
+Once the above requirements are satisfied the command
+
+ant deploy-rar
+
+will attempt to use the Apache Geronimo deployer to install the Qpid JCA
+adapter into the Apache Geronimo environment. Any errors will be reported
+back to the client for further examination. Once the above command executes
+successfully, the Qpid JCA adapter has been deployed, configured and is ready
+for use.
+
+
+Deploy the Qpid JCA Examples
+============================
+After the Qpid JCA adapter is deployed, executing the command
+
+ant deploy-ear
+
+will attempt to use the Apache Geronimo deploy to install the Qpid JCA
+example EAR into the Apache Geronimo environment. Any errors will be reported
+back to the client for further examination. Once the above command executes
+successfully, the Qpid JCA example application is deployed, configured and ready
+for use.
+
+The build-geronimo-properties.xml file contain Apache Geronimo specific values
+and Ant targets that can be used to suit your development requirements.
+
+The README.txt file in this directory provides the necessary instructions for using the Qpid JCA
+adapter and example application.
+
+
+
+
+
+
diff --git a/java/jca/example/README-GLASSFISH.txt b/java/jca/example/README-GLASSFISH.txt
new file mode 100644
index 0000000000..1b73ba68fd
--- /dev/null
+++ b/java/jca/example/README-GLASSFISH.txt
@@ -0,0 +1,84 @@
+Qpid JCA Example - Glassfish 3.x
+
+Overview
+========
+This document explains the steps required to configure and
+deploy the Qpid JCA examples for the Glassfish 3.x environment.
+
+The Glassfish environment provides two methods for deploying
+JEE application components: the web-based administration console
+and the asadmin command line utility. This document only explains
+the command line utility. Please see the Glassfish 3.x
+documentation for the web-based console approach.
+
+Requirements
+============
+In order to deploy the Qpid JCA adapter, as well as the example application,
+the GLASSFISH_HOME environemnt variable must be set. The environment variable
+should point to the root of your Glassfish installation.
+
+In order to automatically deploy the Qpid JCA Adapter from the build system,
+the QPID_JCA_HOME environment variable needs to be set.
+The environment variable should point to the directory which contains the
+Qpid JCA Adapter. If building from the source tree, by default this can be found at
+
+QPID_ROOT/java/build/lib
+
+If installing from RPM or other binary distribution, this can vary by OS platform.
+
+The Qpid JCA examples assume the Apache Geronimo application server as the default
+target platform. This can be modified in two ways:
+
+1) Modify the build.xml file and change the target.platform property:
+
+Example:
+
+ <!-- Valid target platforms are currently geronimo, jboss, jboss7, glassfish -->
+ <property name="target.platform" value="glassfish"/>
+
+2) Set the target.platform property via the command line:
+
+Example:
+
+ant -Dtarget.platform=glassfish <target>
+
+Note, if you choose the second method, all command line invocations must include
+the target.platform variable. For the remainder of this document, we will assume
+the second approach.
+
+Prior to deploying any application component, the Glassfish application server
+should be started and available for requests.
+
+
+Deploy and configure the Qpid JCA Adapter
+==============================
+Once the above requirements are satisfied the command
+
+ant -Dtarget.platform=glassfish deploy-rar
+
+will attempt to invoke the asadmin utility to deploy and configure the
+Qpid JCA adapter. Once this step completes succesfully the Qpid JCA adapter
+is deployed, configured and ready for use.
+
+
+Deploy the Qpid JCA Examples
+============================
+After the Qpid JCA adapter is deployed, executing the command
+
+ant -Dtarget.platform=glassfish deploy-ear
+
+will attempt to deploy the Qpid JCA example EAR into the Glassfish environment.
+Once the above command executes successfully, the Qpid JCA example application
+is deployed, configured and ready for use.
+
+The build-glassfish-properties.xml file contains Glassfish specific configuration options
+and Ant targets that can be used to suit your development requirements. Executing
+
+ant -Dtarget.platform=glassfish -p
+
+will list the appropriate targets and provide a simple description for each.
+
+The README.txt file in this directory provides the necessary instructions for using
+the Qpid JCA adapter and example application which is consistent across all supported
+JEE platforms.
+
diff --git a/java/jca/example/README-JBOSS.txt b/java/jca/example/README-JBOSS.txt
new file mode 100644
index 0000000000..e23b3ba308
--- /dev/null
+++ b/java/jca/example/README-JBOSS.txt
@@ -0,0 +1,107 @@
+Qpid JCA Example - JBoss EAP 5.x, JBoss 5.x, 6.x
+
+Overview
+========
+This document explains the steps required to configure and
+deploy the Qpid JCA examples for both the JBoss EAP 5.x
+environment as well as the JBoss 5.x/6.x community edition
+(herafter simply referred to as JBoss). General information
+can be found in the README.txt file.
+
+Requirements
+============
+In order to deploy the Qpid JCA adapter, as well as the example application,
+the JBOSS_HOME environemnt variable must be set. The environment variable
+should point to the root of your JBoss installation.
+
+In order to automatically deploy the Qpid JCA Adapter from the build system,
+the QPID_JCA_HOME environment variable needs to be set.
+The environment variable should point to the directory which contains the
+Qpid JCA Adapter. If building from the source tree, by default this can be found at
+
+QPID_ROOT/java/build/lib
+
+If installing from RPM or other binary distribution, this can vary by platform.
+
+If you do not want to use the build system to deploy the Qpid JCA adapter, you
+can simply copy the qpid-ra-0.<version>.rar file to the
+
+JBOSS_HOME/server/<server-name>/deploy
+
+directory. By default, the example assumes the JBoss 'default' server profile will
+be used. This can be modified in the build-jboss-properties.xml file.
+
+The Qpid JCA examples assume the Apache Geronimo application server as the default
+target platform. This can be modified in two ways:
+
+1) Modify the build.xml file and change the target.platform property:
+
+Example:
+
+ <!-- Valid target platforms are currently geronimo, jboss, jboss7, glassfish -->
+ <property name="target.platform" value="jboss"/>
+
+2) Set the target.platform property via the command line:
+
+Example:
+
+ant -Dtarget.platform=jboss <target>
+
+Note, if you choose the second method, all command line invocations must include
+the target.platform. For the remainder of this document, we will assume the second
+approach.
+
+Prior to deploying any application component, the JBoss application server
+should be started and available for requests.
+
+
+
+
+Deploy and configure the Qpid JCA Adapter
+==============================
+Once the above requirements are satisfied the command
+
+ant -Dtarget.platform= jboss deploy-rar
+
+will copy the Qpid JCA adapter to JBoss server deploy directory.
+
+To configure JCA resources in the JBoss environment, the *-ds.xml configuration file
+is used. The command
+
+ant -Dtarget.platform=jboss deploy-ds
+
+will accomplish this task using the defaults provided. Any errors will be reported
+in the
+
+JBOSS_HOME/server/<server-name>/log/server.log
+
+file or on the console.
+
+Once the above commands execute successfully, the Qpid JCA adapter is deployed, configured
+and ready for use.
+
+
+Deploy the Qpid JCA Examples
+============================
+After the Qpid JCA adapter is deployed, executing the command
+
+ant -Dtarget.platform=jboss deploy-ear
+
+will attempt to deploy the Qpid JCA example EAR into the JBoss environment.
+Once the above command executes successfully, the Qpid JCA example application is deployed,
+configured and ready for use.
+
+Note, if making modifications to either the Qpid JCA adapter or *-ds.xml configuration, the
+EAR archive will need to be redeployed. This is a JBoss JCA issue and not due to the Qpid JCA
+adapter.
+
+The build-jboss-properties.xml file contains JBoss specific configuration options
+and Ant targets that can be used to suit your development requirements.
+
+The README.txt file in this directory provides the necessary instructions for using the Qpid JCA
+adapter and example application which is consistent across all supported JEE platforms.
+
+
+
+
+
diff --git a/java/jca/example/README-JBOSS7.txt b/java/jca/example/README-JBOSS7.txt
new file mode 100644
index 0000000000..7a3e0db01a
--- /dev/null
+++ b/java/jca/example/README-JBOSS7.txt
@@ -0,0 +1,116 @@
+Qpid JCA Example - JBoss AS 7
+
+Overview
+========
+This document explains the steps required to configure and
+deploy the Qpid JCA examples for the JBoss AS 7 environment.
+General information about the example can be found in the
+README-EXAMPLE.txt file.
+
+Requirements
+============
+In order to deploy the Qpid JCA adapter, as well as the example application,
+the JBOSS_HOME environemnt variable must be set. The environment variable
+should point to the root of your JBoss installation.
+
+In order to automatically deploy the Qpid JCA Adapter from the build system,
+the QPID_JCA_HOME environment variable needs to be set.
+The environment variable should point to the directory which contains the
+Qpid JCA Adapter. If building from the source tree, by default this can be found at
+
+QPID_ROOT/java/build/lib
+
+If installing from RPM or other binary distribution, this can vary by platform.
+
+If you do not want to use the build system to deploy the Qpid JCA adapter, you
+can simply copy the qpid-ra-0.<version>.rar file to the
+
+JBOSS_HOME/<server-profile>/deployments
+
+directory. By default, the example assumes the JBoss 'standalone' server profile will
+be used. This can be modified in the build-jboss7-properties.xml file.
+
+The Qpid JCA examples assume the Apache Geronimo application server as the default
+target platform. This can be modified in two ways:
+
+1) Modify the build.xml file and change the target.platform property:
+
+Example:
+
+ <!-- Valid target platforms are currently geronimo, jboss, jboss7, glassfish -->
+ <property name="target.platform" value="jboss7"/>
+
+2) Set the target.platform property via the command line:
+
+Example:
+
+ant -Dtarget.platform=jboss7 <target>
+
+Note, if you choose the second method, all command line invocations must include
+the target.platform. For the remainder of this document, we will assume the second
+approach.
+
+As opposed to earlier versions of JBoss AS, JBoss AS 7 uses a different approach for
+configuring JCA resources. JBoss AS 7 provides support for different server profiles
+each configured through an XML based configuration file. In order to configure the
+Qpid JCA adapter for the JBoss AS 7 environment, a complete XML configuration has been
+provided in the conf/ directory as conf/qpid-standalone.xml. In order to configure this
+file execute the following command:
+
+ant -Dtarget.platform=jboss7 generate
+
+The result of this command will produce a file build/gen/qpid-standalone.xml file. To
+deploy this file copy the file to:
+
+JBOSS_HOME/standalone/configuration
+
+directory.
+
+Prior to deploying any application component, the JBoss application server
+should be started and available for requests. In order to use the qpid-standalone.xml
+file generated in the previous step, when starting JBoss AS 7 invoke the following:
+
+./standalone.sh -c qpid-standalone.xml
+
+
+Note, the above method completely replaces the default messaging provider in JBoss AS 7.
+Currently there is no way to have two separate messaging providers deployed within the same
+server. It assumed that this will be addressed in a later version of JBoss AS 7.
+
+
+Deploy the Qpid JCA Adapter
+==============================
+Once the above requirements are satisfied the command
+
+ant -Dtarget.platform=jboss7 deploy-rar
+
+will copy the Qpid JCA adapter to JBoss AS 7 server deploy directory.
+
+Once the above commands execute successfully, the Qpid JCA adapter is deployed, configured
+and ready for use.
+
+
+Deploy the Qpid JCA Examples
+============================
+After the Qpid JCA adapter is deployed, executing the command
+
+ant -Dtarget.platform=jboss7 deploy-ear
+
+will attempt to deploy the Qpid JCA example EAR into the JBoss AS 7 environment.
+Once the above command executes successfully, the Qpid JCA example application is
+deployed, configured and ready for use.
+
+Note, currently there is an issue with 'hot-deployment' in the JBoss AS 7 environment.
+If you need to re-deploy the EAR file, restarting JBoss AS 7 is required.
+
+The build-jboss7-properties.xml file contains JBoss AS 7 specific configuration options
+and Apache Ant targets that can be used to suit your development requirements.
+
+The README.txt file in this directory provides the necessary instructions for using the Qpid JCA
+adapter and example application which is consistent across all supported JEE platforms.
+
+
+
+
+
+
diff --git a/java/jca/example/README.txt b/java/jca/example/README.txt
deleted file mode 100644
index d94bbfa7e5..0000000000
--- a/java/jca/example/README.txt
+++ /dev/null
@@ -1,277 +0,0 @@
-Qpid JCA Example
-
-Overview
-=======
-The Qpid JCA example provides a sample JEE application that demonstrates how to
-configure, install and run applications using the Qpid JCA adapter for EE
-connectivity and the Apache Qpid C++ Broker. This example code can be used as a
-convenient starting point for your own development and deployment
-efforts. Currently the example is supported on JBoss EAP 5.x, JBoss 6.x and
-Apache Geronimo 2.x.
-
-Example Components
-===================
-Currently the example application consists of the following components:
-
-Destinations and ConnectionFactories
-
-Any messaging application relies on destinations (queues or topics )
-in order to produce or consume messages.The Qpid JCA example provides
-five destinations by default:
-
- HelloTopic
- GoodByeTopic
- HelloGoodByeTopic
- HelloQueue
- GoodByeQueue
- QpidResponderQueue
-
-
-Similar to destinations, ConnectionFactories are a core component of both JMS
-and JCA. ConnectionFactories provide the necessary starting point to make a connection,
-establish a session and produce or consume (or both) messages from your JMS provider.
-
-The Qpid JCA example provides three connection factories by default:
-
- QpidJMSXA
- QpidJMS
- QpidConnectionFactory
-
-Each of these ConnectionFactories varies in their capabilities and the context in which
-they should be used. These concepts will be explained later in this document.
-
-The deployment configuration for destinations, and ConnectionFactories varies by platform.
-In JBossEAP, the configuration mechanism is a *-ds.xml file. Geronimo 2.2.x has the notion
-of a deployment plan in the form of a geronimo-ra.xml file.
-
-The Qpid JCA Example provides both a qpid-jca-ds.xml file as well as a geronimo-ra.xml deployment
-plan. Both mechanisms provide a reasonable set of defaults to allow you to deploy the Qpid JCA
-adapter in either environment and get up and running quickly.
-
-EJB 3.x
-
-There are a six EJB 3.x components provided as part of the example.
-
- QpidHelloSubscriberBean - MessageDrivenBean (MDB)
- QpidGoodByeSubscriberBean - (MDB)
- QpidHelloListenerBean - (MDB)
- QpidGoodByeListenerBean - (MDB)
- QpidJMSResponderBean - (MDB)
- QpidTestBean - Stateless Session Bean (SLSB)
-
-Servlet 2.5
-
- QpidTestServlet
-
-A sample EE 2.5 servlet is provided allowing testing from a browser versus a JNDI
-client
-
-EE EAR archive
- An EAR wrapper for the ejb and web components.
-
-
- An RMI client used to excercise the EJB 3.x component.
-
-Sample *-ds.xml file
- A sample *-ds.xml file is provided to create destinations and ManagedConnectionFactories
- in the JBoss environment.
-
-Sample geronimo-ra.xml
- A sample geronimo-ra.xml file is provided to create destinations and ManagedConnectionFactories
- in the Geronimo environment. This file is semantically equivalent to the JBoss *-ds.xml artifact.
-
-A build.xml file
- An ant build.xml file to configure, install and deploy the aforementioned components.
-
-
-Requirements
-============
-
-Depending upon your target platform (eg. JBoss EAP or Geronimo) you will need to set either
-the JBOSS_HOME or GERONIMO_HOME property. By default, these properties are assumed to be
-set from your environment. This can be modified in the build.xml file.
-
-JBoss EAP 5.x, JBoss 6.x
- To use the sample application you will need to have JBoss EAP 5.x or JBoss 6.x running.
-
-Geronimo 2.x
- To use the sample application you will need to have Geronimo 2.x running.
-
-Apache Qpid Broker
- To run the sample it is assumed you have an Apache Qpid C++ broker configured and running.
- The example code assumes that the broker will run at localhost on port 5672. This can be
- modified within the build.xml file if this does not suit your particular environment.
-
-
-Quickstart
-==========
-After satifsying the above requirements you are ready to deploy and run the example application.
-The steps to deploy and run in the supported application servers are largely the same, however,
-if you are targeting JBoss you will either need to modify the property in the example build.xml file
-
-
- <property name="target.platform" value="geronimo"/>
-
-to be jboss
-
- <property name="target.platform" value="jboss"/>
-
-or set this property via the command line.
-
-Example:
-
- ant -Dtarget.platform=jboss <target>
-
-**Note**
-Any time you wish to change platforms, this property needs to be modified and a complete clean
-and rebuild needs to be performed.
-
-Step 1 -- Package, Deploy and configure the Qpid JCA adapter
-
-The core component of the example is the Qpid JCA adapter. The following lists the steps
-for the respective platforms
-
-**Note**
-
-Regardless of platform, if you are building the Qpid JCA adapter from source code
-you will need to use to package the RAR file via the Ant build system. To do this, from
-the example directory execute
-
- ant deploy-rar
-
-This task packages the adapter and includes the necessary dependent jar files.
-
-
-JBoss
- There are no additional steps to package the adapter for JBoss deployment. Simply copy
- the qpid-ra-<qpid.version>rar to your JBoss deploy directory.
-
- To configure the Qpid JCA Adapter in JBoss the *-ds.xml file mechanism is used. A sample
- file is provided in the conf directory.
-
- If the defaults are suitable, you can simply execute
-
- ant deploy-ds
-
- While any property can be modified in the qpid-jca-ds.xml file, typically you will want to
- change the URL of the broker to which you are trying to connect. Rather than modifying
- the qpid-jca-ds.xml file directly you can modify the
-
- <property name="broker.url" value="amqp://anonymous:@client/test?brokerlist='tcp://localhost:5672?sasl_mechs='ANONYMOUS''"/>
-
- line in the build.xml file. This will dynamically insert the broker.url value into the qpid-jca-ds.xml file.
-
- Once this file is copied to your JBoss deploy directory and you received no exceptions, the adapter is now deployed, configured
- and ready for use.
-
-Geronimo
- By default, the Qpid JCA adapter ships with the geronimo-ra.xml deployment plan embedded
- in the RAR file. This file is located in the META-INF directory alongside the ra.xml file.
- By default the adapter is configured to access a broker located at localhost with the
- default port of 5672. The ANONYMOUS security mechanism is also in use. If this is not
- desirable, you have two approaches to configure the adapter.
-
-
- 1) Extract the META-INF/ra.xml file from the RAR file, modify and recompress the RAR archive
- with the updated contents.
-
- 2) Use the example build system to package the adapter. The example build.xml file includes
- a target
-
- package-rar
-
- that can be used to package the RAR file as well as allowing changes to the geronimo-ra.xml
- file without having to extract the RAR file by hand. The conf/geronimo-ra.xml file is used
- when you use the example build system.
-
- While any property can be modified in the geronimo-ra.xml file, typically you will want to
- change the URL of the broker to which you are trying to connect. Rather than modifying
- the geronimo-ra.xml file directly you can modify the
-
-
- <property name="broker.url" value="amqp://anonymous:@client/test?brokerlist='tcp://10.0.1.44:5672?sasl_mechs='ANONYMOUS''"/>
-
- line in the build.xml file. This will dynamically insert the broker.url value into the geronimo-ra.xml file.
-
- Once you have made your modifications you can execute
-
-
- ant clean package-rar deploy-rar
-
- Note, your Geronimo server must be running and your GERONIMO_HOME environment variable must be set. Barring any exceptions, the
- adapter is now deployed and ready for use in Geronimo.
-
-
-Step 2 -- Deploy the application component(s).
-
-As previously mentioned, the adapter comes with a variety of EE components for use in your respective application server. You can choose to deploy
-these components individually, or as a single EAR archive. This document assumes that you will use the EAR to deploy and run the example.
-
-The command to package and deploy the EAR archive is the same across application servers. Executing the following command
-
-ant deploy-ear
-
-will, depending upon platform, package the EAR and deploy the archive in your respective environment. Once this step is executed, the example
-is ready for use.
-
-
-Step 3 -- Test the Example
-
-The Qpid JCA example provides an EJB application, as well as a Web application. Both can be used to test/run the example:
-
-EJB
-If you want to use the EJB application to test the example you can execute
-
- ant run-client
-
-Running this command will perform a JNDI lookup of the SLSB in either JBoss or Geronimo and send a simple string to the SLSB. The SLSB will receive
-this string, construct a JMS message and place this message on a configured queue. The MDB will in turn receive this message and print the contents
-to the console.
-
-The main properties involved in this task are
-
-server.host
-jndi.context
-
-These vary depending upon which application server you are runnning. These can be modified to suit your environment. Looking at the run-client task you
-will see the following:
-
-
- <sysproperty key="qpid.ejb.name" value="qpid-jcaex/QpidTestBean/remote"/>
-
-This is the JNDI name of the SLSB component and it varies by application server. Typically you do not have to change this. Also, the task supports another property
-
-
- <sysproperty key="qpid.message" value="insert-value-here"/>
-
-You can set this property if you want to modify the message contents being routed through the system.
-
-Web
-The Qpid JCA Example comes with a web application. To access the web component, simply use a browser of your choice and navigate to
-
-http://<server-host-name>:<server-port>/qpid-jca-web/qpid
-
-where server-host and server-port are the host and port where you are running your application server. By default this is localhost:8080. Similar to the EJB component,
-the web application supports a few options:
-
-
-http://<server-host-name>:<server-port>/qpid-jca-web/qpid?messsage=<yourmessage>
-
-will allow you to customize the message contents that are routed through the system. By default, the Web application posts to a configured queue in the system. If you want to
-test XA functionality, or use an alternate approach, you can specify
-
-
-http://<server-host-name>:<server-port>/qpid-jca-web/qpid?useEJB=true
-
-instead of posting to a queue, the web application will use the local interface of the EJB component to send the message. This is functionally equivalent to running the
-RMI client.
-
-
-Summary
-=======
-While conceptually simple, the Qpid JCA example provides a majority of the component types and messaging patterns you are most likely to use your development efforts.
-With the Web and EJB components, you can experiment with various aspects of JCA as well as EE development in general using the Qpid Broker as your messaging provider.
-While this documentation highlights the major components and steps needed to take to get the example running, the possiblities for modifcation are numerous. You are
-encouraged to experiment with the example as you develop your own messaging applications.
-
-
diff --git a/java/jca/example/build-geronimo-properties.xml b/java/jca/example/build-geronimo-properties.xml
index 2251b7a2df..02ecb53134 100644
--- a/java/jca/example/build-geronimo-properties.xml
+++ b/java/jca/example/build-geronimo-properties.xml
@@ -22,18 +22,31 @@
<property name="jndi.scheme" value="name"/>
- <!--
- <property name="qpid.xacf.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAManagedConnectionFactory/QpidJMSXA"/>
- -->
<property name="qpid.xacf.jndi.name" value="QpidJMSXA"/>
+
+ <property name="jndi.prefix" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/"/>
+
+
+ <property name="qpid.hello.queue.jndi.name" value="HelloQueue"/>
+ <property name="qpid.goodbye.queue.jndi.name" value="GoodByeQueue"/>
+ <property name="qpid.hello.topic.jndi.name" value="HelloTopic"/>
+ <property name="qpid.goodbye.topic.jndi.name" value="GoodByeTopic"/>
+ <property name="qpid.request.queue.jndi.name" value="RequestQueue"/>
+ <property name="qpid.response.queue.jndi.name" value="ResponseQueue"/>
+
+ <!--
<property name="qpid.cf.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/QpidConnectionFactory"/>
<property name="qpid.hello.queue.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/HelloQueue"/>
<property name="qpid.goodbye.queue.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/GoodByeQueue"/>
- <property name="qpid.responder.queue.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/ResponderQueue"/>
<property name="qpid.hello.topic.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/HelloTopic"/>
<property name="qpid.goodbye.topic.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/GoodByeTopic"/>
+ <property name="qpid.request.queue.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/RequestQueue"/>
+ <property name="qpid.response.queue.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/ResponseQueue"/>
+ -->
<property name="qpid.ejb.jndi.name" value="name=&quot;QpidTestEJB&quot;"/>
<property name="qpid.ejb.name" value="QpidTestBeanRemote"/>
+ <property name="qpid.client.cf.jndi.name" value="${jndi.prefix}/QpidConnectionFactory"/>
+ <property name="qpid.client.dest.jndi.name" value="${jndi.prefix}/${qpid.hello.queue.jndi.name}"/>
<property name="jndi.context" value="org.openejb.client.RemoteInitialContextFactory"/>
<property name="server.host" value="ejbd://localhost:4201"/>
diff --git a/java/jca/example/build-glassfish-properties.xml b/java/jca/example/build-glassfish-properties.xml
new file mode 100644
index 0000000000..94c79be931
--- /dev/null
+++ b/java/jca/example/build-glassfish-properties.xml
@@ -0,0 +1,135 @@
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+-->
+<project name="qpid-jca-example-glassfish-properties" basedir="." default="">
+
+ <property name="jndi.scheme" value="name"/>
+ <property name="jndi.prefix" value=""/>
+
+ <property name="qpid.xacf.jndi.name" value="QpidJMSXA"/>
+ <property name="qpid.hello.topic.jndi.name" value="HelloTopic"/>
+ <property name="qpid.goodbye.topic.jndi.name" value="GoodByeTopic"/>
+ <property name="qpid.hello.queue.jndi.name" value="HelloQueue"/>
+ <property name="qpid.goodbye.queue.jndi.name" value="GoodByeQueue"/>
+ <property name="qpid.request.queue.jndi.name" value="QpidRequestQueue"/>
+ <property name="qpid.response.queue.jndi.name" value="QpidResponseQueue"/>
+ <property name="qpid.ejb.jndi.name" value="mappedName=&quot;QpidTestEJB&quot;"/>
+ <property name="qpid.ejb.ref.name" value="QpidTestBean/local"/>
+ <property name="qpid.ejb.name" value="QpidTestBean#org.apache.qpid.jca.example.ejb.QpidTestRemote"/>
+ <property name="qpid.client.cf.jndi.name" value="QpidConnectionFactory"/>
+ <property name="qpid.client.dest.jndi.name" value="${qpid.hello.queue.jndi.name}"/>
+
+ <property name="jndi.context" value="com.sun.enterprise.naming.SerialInitContextFactory"/>
+ <property name="server.host" value="iiop://localhost:3700"/>
+ <property name="glassfish.home" value="${env.GLASSFISH_HOME}"/>
+ <property name="glassfish.domain" value="domain1"/>
+ <property name="glassfish.user" value=""/>
+ <property name="glassfish.password" value=""/>
+
+ <path id="compile.classpath">
+ <fileset dir="${glassfish.home}/glassfish/modules">
+ <include name="javax.ejb.jar"/>
+ <include name="javax.transaction.jar"/>
+ <include name="javax.jms.jar"/>
+ <include name="javax.resource.jar"/>
+ <include name="javax.servlet.jar"/>
+ </fileset>
+
+ <fileset dir="${glassfish.home}/glassfish/domains/${glassfish.domain}/lib/ext">
+ <include name="slf4j-api-*.jar"/>
+ </fileset>
+ </path>
+
+ <path id="run.classpath">
+ <fileset dir="${lib.dir}">
+ <include name="qpid-ra-*.jar"/>
+ <include name="qpid-client-*.jar"/>
+ <include name="qpid-common-*.jar"/>
+ </fileset>
+
+ <fileset dir="${glassfish.home}/glassfish/lib/">
+ <include name="gf-client.jar"/>
+ </fileset>
+
+ <fileset dir="${glassfish.home}/glassfish/modules">
+ <include name="javax.ejb.jar"/>
+ <include name="javax.transaction.jar"/>
+ <include name="javax.jms.jar"/>
+ <include name="javax.resource.jar"/>
+ <include name="javax.servlet.jar"/>
+ </fileset>
+ <fileset dir="${glassfish.home}/glassfish/domains/${glassfish.domain}/lib/ext">
+ <include name="slf4j-api-*.jar"/>
+ </fileset>
+ </path>
+
+ <filterset id="extra.filterset">
+ <filter token="rar.ver" value="${qpid.ver}"/>
+ </filterset>
+
+ <macrodef name="glassfish">
+ <attribute name="user" default="${glassfish.user}"/>
+ <attribute name="password" default="${glassfish.password}"/>
+ <attribute name="action" default="list-applications"/>
+ <attribute name="module"/>
+ <attribute name="plan" default=""/>
+ <sequential>
+ <exec executable="${glassfish.home}/bin/asadmin">
+ <arg line="@{action} @{module} @{plan}"/>
+ </exec>
+ </sequential>
+ </macrodef>
+
+ <target name="package-rar" depends="compile">
+ <jar destfile="${build.dir}/${rar.name}"/>
+ </target>
+
+ <target name="deploy-rar" depends="package-rar" description="Deploy the RAR file.">
+ <glassfish action="deploy" module="${qpid.jca.dir}/${rar.name}"/>
+ <glassfish action="add-resources" module="${gen.dir}/glassfish-resources.xml"/>
+ </target>
+
+
+ <target name="undeploy-resources">
+ <glassfish action="delete-admin-object" module="${qpid.hello.topic.jndi.name}"/>
+ <glassfish action="delete-admin-object" module="${qpid.goodbye.topic.jndi.name}"/>
+ <glassfish action="delete-admin-object" module="${qpid.hello.queue.jndi.name}"/>
+ <glassfish action="delete-admin-object" module="${qpid.goodbye.queue.jndi.name}"/>
+ <glassfish action="delete-admin-object" module="${qpid.request.queue.jndi.name}"/>
+ <glassfish action="delete-admin-object" module="${qpid.response.queue.jndi.name}"/>
+ <glassfish action="delete-connector-connection-pool" module="--cascade true QpidJMSXAPool"/>
+ <glassfish action="delete-connector-connection-pool" module="--cascade true QpidJMSPool"/>
+ <glassfish action="delete-resource-adapter-config" module="QpidResourceAdapter"/>
+ </target>
+
+ <target name="undeploy-rar" description="Deploy the RAR file.">
+ <glassfish action="undeploy" module="--cascade true qpid-ra-${qpid.ver}"/>
+ </target>
+
+ <target name="deploy-ear" description="Deploy the EAR file." depends="package-ear">
+ <glassfish action="deploy" module="${build.dir}/${ear.name}"/>
+ </target>
+
+ <target name="undeploy-ear" description="Undeploy the EAR file.">
+ <glassfish action="undeploy" module="qpid-jcaex"/>
+ </target>
+</project>
+
+
diff --git a/java/jca/example/build-jboss-properties.xml b/java/jca/example/build-jboss-properties.xml
index 5fc4053cf8..fd38274630 100644
--- a/java/jca/example/build-jboss-properties.xml
+++ b/java/jca/example/build-jboss-properties.xml
@@ -21,16 +21,21 @@
<project name="qpid-jca-example-jboss-properties" basedir="." default="">
<property name="jndi.scheme" value="mappedName"/>
+ <property name="jndi.prefix" value=""/>
+
<property name="qpid.xacf.jndi.name" value="java:QpidJMSXA"/>
<property name="qpid.cf.jndi.name" value="QpidConnectionFactory"/>
<property name="qpid.hello.topic.jndi.name" value="HelloTopic"/>
<property name="qpid.goodbye.topic.jndi.name" value="GoodByeTopic"/>
<property name="qpid.hello.queue.jndi.name" value="HelloQueue"/>
<property name="qpid.goodbye.queue.jndi.name" value="GoodByeQueue"/>
- <property name="qpid.responder.queue.jndi.name" value="QpidResponderQueue"/>
+ <property name="qpid.request.queue.jndi.name" value="QpidRequestQueue"/>
+ <property name="qpid.response.queue.jndi.name" value="QpidResponseQueue"/>
<property name="qpid.ejb.jndi.name" value="mappedName=&quot;QpidTestEJB&quot;"/>
<property name="qpid.ejb.ref.name" value="QpidTestBean/local"/>
<property name="qpid.ejb.name" value="qpid-jcaex/QpidTestBean/remote"/>
+ <property name="qpid.client.cf.jndi.name" value="${jndi.prefix}/QpidConnectionFactory"/>
+ <property name="qpid.client.dest.jndi.name" value="${jndi.prefix}/${qpid.hello.queue.jndi.name}"/>
<property name="jndi.context" value="org.jnp.interfaces.NamingContextFactory"/>
<property name="server.host" value="jnp://localhost:1099"/>
diff --git a/java/jca/example/build-jboss7-properties.xml b/java/jca/example/build-jboss7-properties.xml
new file mode 100644
index 0000000000..68ecd8a4f4
--- /dev/null
+++ b/java/jca/example/build-jboss7-properties.xml
@@ -0,0 +1,133 @@
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+-->
+<project name="qpid-jca-example-jboss7-properties" basedir="." default="">
+
+ <property name="jndi.scheme" value="name"/>
+ <property name="jndi.prefix" value=""/>
+
+ <property name="qpid.xacf.jndi.name" value="java:/QpidJMSXA"/>
+ <property name="qpid.cf.jndi.name" value="QpidConnectionFactory"/>
+ <property name="qpid.hello.topic.jndi.name" value="java:jboss/exported/HelloTopic"/>
+ <property name="qpid.goodbye.topic.jndi.name" value="java:jboss/exported/GoodByeTopic"/>
+ <property name="qpid.hello.queue.jndi.name" value="java:jboss/exported/HelloQueue"/>
+ <property name="qpid.goodbye.queue.jndi.name" value="java:jboss/exported/GoodByeQueue"/>
+ <property name="qpid.request.queue.jndi.name" value="java:jboss/exported/QpidRequestQueue"/>
+ <property name="qpid.response.queue.jndi.name" value="java:jboss/exported/QpidResponseQueue"/>
+
+ <property name="qpid.ejb.jndi.name" value="mappedName=&quot;QpidTestEJB&quot;"/>
+ <property name="qpid.ejb.ref.name" value="QpidTestBean/local"/>
+ <property name="qpid.ejb.name" value="ejb:qpid-jcaex/qpid-jcaex-ejb/QpidTestBean!org.apache.qpid.jca.example.ejb.QpidTestRemote"/>
+
+ <property name="qpid.client.cf.jndi.name" value="${jndi.prefix}/QpidConnectionFactory"/>
+ <property name="qpid.client.dest.jndi.name" value="${jndi.prefix}/HelloQueue"/>
+ <property name="jndi.context" value="org.jboss.naming.remote.client.InitialContextFactory"/>
+ <property name="server.host" value="remote://localhost:4447"/>
+
+
+ <property name="jboss.server.config" value="standalone"/>
+
+ <property name="jboss.home" location="${env.JBOSS_HOME}"/>
+ <property name="jboss.server" value="${jboss.server.config}"/>
+ <property name="jboss.deploy" location="${jboss.home}/${jboss.server}/deployments"/>
+ <property name="jboss.modules" location="${jboss.home}/modules"/>
+ <property name="jboss.config.dir" location="${jboss.home}/${jboss.server}/configuration/"/>
+ <property name="jboss.client" location="${jboss.home}/bin/client"/>
+
+ <path id="compile.classpath">
+ <fileset dir="${jboss.modules}/javax/jms/api/main">
+ <include name="jboss-jms-api_1.1_spec-1.0.1.Final.jar"/>
+ </fileset>
+ <fileset dir="${jboss.modules}/javax/ejb/api/main">
+ <include name="jboss-ejb-api_3.1_spec-1.0.2.Final.jar"/>
+ </fileset>
+ <fileset dir="${jboss.modules}/javax/servlet/api/main">
+ <include name="jboss-servlet-api_3.0_spec-1.0.1.Final.jar"/>
+ </fileset>
+ <fileset dir="${jboss.modules}/javax/transaction/api/main">
+ <include name="jboss-transaction-api_1.1_spec-1.0.1.Final.jar"/>
+ </fileset>
+ <fileset dir="${jboss.modules}/org/slf4j/main">
+ <include name="slf4j-api-1.6.1.jar"/>
+ </fileset>
+ </path>
+
+ <path id="run.classpath">
+ <fileset dir="${jboss.client}">
+ <include name="jboss-client.jar"/>
+ </fileset>
+ <fileset dir="${lib.dir}">
+ <include name="qpid-ra-*.jar"/>
+ <include name="qpid-client-*.jar"/>
+ <include name="qpid-common-*.jar"/>
+ </fileset>
+ <fileset dir="${jboss.modules}/org/slf4j/main">
+ <include name="slf4j-api-1.6.1.jar"/>
+ </fileset>
+ <fileset dir="../../build/lib">
+ <include name="slf4j*.jar"/>
+ <include name="log4j*.jar"/>
+ </fileset>
+ <fileset dir="${jboss.modules}/org/jboss/ejb-client/main/">
+ <include name="jboss-ejb-client-1.0.6.CR1.jar"/>
+ </fileset>
+
+ </path>
+
+ <filterset id="extra.filterset"/>
+
+ <!-- Deployment is target specific so is included here -->
+ <target name="deploy-rar" description="Deploy the RAR file.">
+ <copy todir="${jboss.deploy}" overwrite="true">
+ <fileset dir="${qpid.jca.dir}">
+ <include name="${rar.name}"/>
+ </fileset>
+ </copy>
+ </target>
+
+ <target name="undeploy-rar" description="Undeploys the RAR deployment.">
+ <delete file="${jboss.deploy}/${rar.name}"/>
+ </target>
+
+ <target name="deploy-ear" depends="package-ear" description="Deploys the EAR archive.">
+ <copy todir="${jboss.deploy}" overwrite="true">
+ <fileset dir="${build.dir}">
+ <include name="${ear.name}"/>
+ </fileset>
+ </copy>
+ </target>
+
+ <target name="undeploy-ear" description="Undeploys the EAR archive.">
+ <delete file="${jboss.deploy}/${ear.name}"/>
+ </target>
+
+ <target name="deploy-config" depends="generate" description="Deploys the standalone file to the JBoss environment.">
+ <copy todir="${jboss.config.dir}" overwrite="true">
+ <fileset dir="${gen.dir}">
+ <include name="${jboss.server.config}.xml"/>
+ </fileset>
+ </copy>
+ </target>
+
+ <target name="undeploy-ds" description="Undeploys the ds.xml file from the JBoss environment.">
+ <delete file="${jboss.deploy}/qpid-jca-ds.xml"/>
+ </target>
+
+</project>
diff --git a/java/jca/example/build.xml b/java/jca/example/build.xml
index 2717ce84d7..7a75f9abc6 100644
--- a/java/jca/example/build.xml
+++ b/java/jca/example/build.xml
@@ -20,7 +20,7 @@
-->
<project name="qpid-jca-example" default="help" basedir="">
- <!-- Valid target platforms are currently geronimo & jboss -->
+ <!-- Valid target platforms are currently geronimo, jboss, jboss7, glassfish -->
<property name="target.platform" value="geronimo"/>
<!-- Change to BURL for older syntax support -->
@@ -72,7 +72,6 @@
<filter token="rar.name" value="${rar.name}"/>
<filter token="ejb.name" value="${ejb.name}"/>
<filter token="war.name" value="${war.name}"/>
-
<filter token="broker.url" value="${broker.url}"/>
<filter token="qpid.hello.topic.dest.address" value="${qpid.hello.topic.dest.address}"/>
@@ -80,7 +79,8 @@
<filter token="qpid.hellogoodbye.topic.dest.address" value="${qpid.hellogoodbye.topic.dest.address}"/>
<filter token="qpid.hello.queue.dest.address" value="${qpid.hello.queue.dest.address}"/>
<filter token="qpid.goodbye.queue.dest.address" value="${qpid.goodbye.queue.dest.address}"/>
- <filter token="qpid.responder.queue.dest.address" value="${qpid.responder.queue.dest.address}"/>
+ <filter token="qpid.request.queue.dest.address" value="${qpid.request.queue.dest.address}"/>
+ <filter token="qpid.response.queue.dest.address" value="${qpid.response.queue.dest.address}"/>
</filterset>
<filterset refid="extra.filterset"/>
@@ -91,12 +91,14 @@
<filter token="rar.name" value="${rar.name}"/>
<filter token="broker.url" value="${broker.url}"/>
<filter token="jndi.scheme" value="${jndi.scheme}"/>
+ <filter token="jndi.prefix" value="${jndi.prefix}"/>
<filter token="qpid.xacf.jndi.name" value="${qpid.xacf.jndi.name}"/>
<filter token="qpid.hello.topic.jndi.name" value="${qpid.hello.topic.jndi.name}"/>
<filter token="qpid.goodbye.topic.jndi.name" value="${qpid.goodbye.topic.jndi.name}"/>
<filter token="qpid.hello.queue.jndi.name" value="${qpid.hello.queue.jndi.name}"/>
<filter token="qpid.goodbye.queue.jndi.name" value="${qpid.goodbye.queue.jndi.name}"/>
- <filter token="qpid.responder.queue.jndi.name" value="${qpid.responder.queue.jndi.name}"/>
+ <filter token="qpid.request.queue.jndi.name" value="${qpid.request.queue.jndi.name}"/>
+ <filter token="qpid.response.queue.jndi.name" value="${qpid.response.queue.jndi.name}"/>
<filter token="qpid.ejb.jndi.name" value="${qpid.ejb.jndi.name}"/>
</filterset>
</copy>
@@ -111,6 +113,9 @@
<classes dir="${build.classes.dir}">
<include name="org/apache/qpid/jca/example/web/**"/>
</classes>
+ <metainf dir="${gen.dir}">
+ <include name="glassfish-web.xml"/>
+ </metainf>
</war>
</target>
@@ -119,6 +124,7 @@
<include name="org/apache/qpid/jca/example/ejb/**/*.class"/>
<metainf dir="${gen.dir}">
<include name="jboss.xml"/>
+ <include name="glassfish-ejb-jar.xml"/>
</metainf>
</jar>
</target>
@@ -141,10 +147,13 @@
</classpath>
<sysproperty key="java.naming.factory.initial" value="${jndi.context}"/>
<sysproperty key="java.naming.provider.url" value="${server.host}"/>
+ <sysproperty key="java.naming.factory.url.pkgs" value="org.jboss.ejb.client.naming"/>
+ <sysproperty key="jboss.ejb.client.properties.file.path" value="${conf.dir}/jboss-ejb-client.properties"/>
+
<sysproperty key="qpid.ejb.name" value="${qpid.ejb.name}"/>
- <sysproperty key="qpid.cf.name" value="${qpid.cf.jndi.name}"/>
+ <sysproperty key="qpid.cf.name" value="${qpid.client.cf.jndi.name}"/>
+ <sysproperty key="qpid.dest.name" value="${qpid.client.dest.jndi.name}"/>
<sysproperty key="qpid.dest_syntax" value="${qpid.dest_syntax}"/>
- <sysproperty key="qpid.dest.name" value="${qpid.hello.queue.jndi.name}"/>
<sysproperty key="log4j.configuration" value="file://${conf.dir}/log4j.properties"/>
<sysproperty key="qpid.message" value="${client.message}"/>
@@ -166,8 +175,8 @@
<sysproperty key="qpid.message" value="Hello, World"/>
<sysproperty key="message.count" value="1"/>
<sysproperty key="thread.count" value="5"/>
- <sysproperty key="qpid.cf.name" value="${qpid.cf.jndi.name}"/>
- <sysproperty key="qpid.dest.name" value="${qpid.responder.queue.jndi.name}"/>
+ <sysproperty key="qpid.cf.name" value="${qpid.client.cf.jndi.name}"/>
+ <sysproperty key="qpid.dest.name" value="${qpid.client.dest.jndi.name}"/>
<sysproperty key="log4j.configuration" value="file://${conf.dir}/log4j.properties"/>
<sysproperty key="qpid.dest_syntax" value="${qpid.dest_syntax}"/>
</java>
diff --git a/java/jca/example/conf/geronimo-application.xml b/java/jca/example/conf/geronimo-application.xml
index a855e0fae8..384f6b2e75 100644
--- a/java/jca/example/conf/geronimo-application.xml
+++ b/java/jca/example/conf/geronimo-application.xml
@@ -21,7 +21,7 @@
-->
<application xmlns="http://geronimo.apache.org/xml/ns/j2ee/application-2.0"
xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.2"
- xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.2"
+ xmlns:nam="http://geronimo.apache.org/xml/ns/naming-1.2"
application-name="QpidJCAExampleApplication">
<sys:environment>
diff --git a/java/jca/example/conf/geronimo-ra.xml b/java/jca/example/conf/geronimo-ra.xml
index e3e74ebc62..a7511f647f 100644
--- a/java/jca/example/conf/geronimo-ra.xml
+++ b/java/jca/example/conf/geronimo-ra.xml
@@ -67,63 +67,73 @@
<adminobject-class>org.apache.qpid.ra.admin.QpidTopicImpl</adminobject-class>
<adminobject-instance>
<message-destination-name>Dummy</message-destination-name>
- <config-property-setting name="destinationAddress">amq.topic</config-property-setting>
+ <config-property-setting name="DestinationAddress">amq.topic</config-property-setting>
</adminobject-instance>
</adminobject>
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidTopic</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidTopicImpl</adminobject-class>
<adminobject-instance>
- <message-destination-name>HelloTopic</message-destination-name>
- <config-property-setting name="destinationAddress">@qpid.hello.topic.dest.address@</config-property-setting>
+ <message-destination-name>HelloTopic</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.hello.topic.dest.address@</config-property-setting>
</adminobject-instance>
</adminobject>
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidTopic</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidTopicImpl</adminobject-class>
<adminobject-instance>
- <message-destination-name>GoodByeTopic</message-destination-name>
- <config-property-setting name="destinationAddress">@qpid.goodbye.topic.dest.address@</config-property-setting>
+ <message-destination-name>GoodByeTopic</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.goodbye.topic.dest.address@</config-property-setting>
</adminobject-instance>
</adminobject>
+ <!--
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidTopic</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidTopicImpl</adminobject-class>
<adminobject-instance>
- <message-destination-name>HelloGoodByeTopic</message-destination-name>
- <config-property-setting name="destinationAddress">@qpid.hellogoodbye.topic.dest.address@</config-property-setting>
+ <message-destination-name>jms/HelloGoodByeTopic</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.hellogoodbye.topic.dest.address@</config-property-setting>
</adminobject-instance>
</adminobject>
+ -->
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidQueue</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidQueueImpl</adminobject-class>
<adminobject-instance>
- <message-destination-name>HelloQueue</message-destination-name>
- <config-property-setting name="destinationAddress">@qpid.hello.queue.dest.address@</config-property-setting>
+ <message-destination-name>HelloQueue</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.hello.queue.dest.address@</config-property-setting>
</adminobject-instance>
</adminobject>
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidQueue</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidQueueImpl</adminobject-class>
<adminobject-instance>
- <message-destination-name>GoodByeQueue</message-destination-name>
- <config-property-setting name="destinationAddress">@qpid.goodbye.queue.dest.address@</config-property-setting>
+ <message-destination-name>GoodByeQueue</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.goodbye.queue.dest.address@</config-property-setting>
</adminobject-instance>
</adminobject>
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidQueue</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidQueueImpl</adminobject-class>
<adminobject-instance>
- <message-destination-name>ResponderQueue</message-destination-name>
- <config-property-setting name="destinationAddress">@qpid.responder.queue.dest.address@</config-property-setting>
+ <message-destination-name>RequestQueue</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.request.queue.dest.address@</config-property-setting>
+ </adminobject-instance>
+ </adminobject>
+ <adminobject>
+ <adminobject-interface>org.apache.qpid.ra.admin.QpidQueue</adminobject-interface>
+ <adminobject-class>org.apache.qpid.ra.admin.QpidQueueImpl</adminobject-class>
+ <adminobject-instance>
+ <message-destination-name>ResponseQueue</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.response.queue.dest.address@</config-property-setting>
</adminobject-instance>
</adminobject>
<adminobject>
<adminobject-interface>javax.jms.ConnectionFactory</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidConnectionFactoryProxy</adminobject-class>
<adminobject-instance>
- <message-destination-name>QpidConnectionFactory</message-destination-name>
- <config-property-setting name="connectionURL">@broker.url@</config-property-setting>
+ <message-destination-name>QpidConnectionFactory</message-destination-name>
+ <config-property-setting name="ConnectionURL">@broker.url@</config-property-setting>
</adminobject-instance>
</adminobject>
</resourceadapter>
diff --git a/java/jca/example/conf/glassfish-ejb-jar.xml b/java/jca/example/conf/glassfish-ejb-jar.xml
new file mode 100644
index 0000000000..e3ea140472
--- /dev/null
+++ b/java/jca/example/conf/glassfish-ejb-jar.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE glassfish-ejb-jar PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN" "http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd">
+<glassfish-ejb-jar>
+ <enterprise-beans>
+ <ejb>
+ <ejb-name>QpidHelloListenerBean</ejb-name>
+ <jndi-name>HelloQueue</jndi-name>
+ <mdb-resource-adapter>
+ <resource-adapter-mid>qpid-ra-@rar.ver@</resource-adapter-mid>
+ </mdb-resource-adapter>
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ </ejb>
+ <ejb>
+ <ejb-name>QpidGoodByeListenerBean</ejb-name>
+ <jndi-name>GoodByeQueue</jndi-name>
+ <mdb-resource-adapter>
+ <resource-adapter-mid>qpid-ra-@rar.ver@</resource-adapter-mid>
+ </mdb-resource-adapter>
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ </ejb>
+ <ejb>
+ <ejb-name>QpidHelloSubscriberBean</ejb-name>
+ <jndi-name>HelloTopic</jndi-name>
+ <mdb-resource-adapter>
+ <resource-adapter-mid>qpid-ra-@rar.ver@</resource-adapter-mid>
+ </mdb-resource-adapter>
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ </ejb>
+ <ejb>
+ <ejb-name>QpidGoodByeSubscriberBean</ejb-name>
+ <jndi-name>GoodByeTopic</jndi-name>
+ <mdb-resource-adapter>
+ <resource-adapter-mid>qpid-ra-@rar.ver@</resource-adapter-mid>
+ </mdb-resource-adapter>
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ </ejb>
+ <ejb>
+ <ejb-name>QpidJMSResponderBean</ejb-name>
+ <jndi-name>QpidResponderQueue</jndi-name>
+ <mdb-resource-adapter>
+ <resource-adapter-mid>qpid-ra-@rar.ver@</resource-adapter-mid>
+ </mdb-resource-adapter>
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ </ejb>
+ <ejb>
+ <ejb-name>QpidTestBean</ejb-name>
+ <jndi-name>QpidTestBean</jndi-name>
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ </ejb>
+ </enterprise-beans>
+</glassfish-ejb-jar>
+
diff --git a/java/jca/example/conf/glassfish-resources.xml b/java/jca/example/conf/glassfish-resources.xml
new file mode 100644
index 0000000000..9eab4302d5
--- /dev/null
+++ b/java/jca/example/conf/glassfish-resources.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
+<resources>
+
+
+ <resource-adapter-config name="QpidResourceAdapter" resource-adapter-name="qpid-ra-@rar.ver@" thread-pool-ids="thread-pool-1">
+ <property name="TransactionManagerLocatorClass" value="org.apache.qpid.ra.tm.GlassfishTransactionManagerLocator"/>
+ <property name="TransactionManagerLocatorMethod" value="getTm"/>
+ </resource-adapter-config>
+
+ <!--XAConnectionFactory-->
+ <connector-connection-pool
+ name="QpidJMSXAPool"
+ resource-adapter-name="qpid-ra-@rar.ver@"
+ connection-definition-name="org.apache.qpid.ra.QpidRAConnectionFactory"
+ transaction-support="XATransaction"
+ ping="true">
+ <property name="connectionURL" value="@broker.url@"/>
+ <property name="SessionDefaultType" value="javax.jms.Queue"/>
+ </connector-connection-pool>
+
+ <connector-resource jndi-name="QpidJMSXA" pool-name="QpidJMSXAPool"/>
+
+ <!--LocalTransaction ConnectionFactory
+ <connector-connection-pool
+ name="QpidJMSPool"
+ resource-adapter-name="qpid-ra-@rar.ver@"
+ connection-definition-name="org.apache.qpid.ra.QpidRAConnectionFactory"
+ transaction-support="LocalTransaction"
+ ping="true">
+ <property name="connectionURL" value="@broker.url@"/>
+ <property name="SessionDefaultType" value="javax.jms.Queue"/>
+ <property name="UseLocalTx" value="true"/>
+ </connector-connection-pool>
+
+
+ <connector-resource jndi-name="QpidJMS" pool-name="QpidJMSPool"/>
+
+ -->
+ <!--Destinations-->
+ <admin-object-resource jndi-name="HelloQueue" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidQueue" class-name="org.apache.qpid.ra.admin.QpidQueueImpl">
+ <property name="DestinationAddress" value="@qpid.hello.queue.dest.address@"/>
+ </admin-object-resource>
+
+ <admin-object-resource jndi-name="GoodByeQueue" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidQueue" class-name="org.apache.qpid.ra.admin.QpidQueueImpl">
+ <property name="DestinationAddress" value="@qpid.goodbye.queue.dest.address@"/>
+ </admin-object-resource>
+
+ <admin-object-resource jndi-name="HelloTopic" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidTopic" class-name="org.apache.qpid.ra.admin.QpidTopicImpl">
+ <property name="DestinationAddress" value="@qpid.hello.topic.dest.address@"/>
+ </admin-object-resource>
+
+ <admin-object-resource jndi-name="GoodByeTopic" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidTopic" class-name="org.apache.qpid.ra.admin.QpidTopicImpl">
+ <property name="DestinationAddress" value="@qpid.goodbye.topic.dest.address@"/>
+ </admin-object-resource>
+
+ <!--
+ <admin-object-resource jndi-name="HelloGoodByeTopic" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidTopic" class-name="org.apache.qpid.ra.admin.QpidTopicImpl">
+ <property name="DestinationAddress" value="@qpid.hellogoodbye.topic.dest.address@"/>
+ </admin-object-resource>
+ -->
+ <admin-object-resource jndi-name="QpidRequestQueue" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidQueue" class-name="org.apache.qpid.ra.admin.QpidQueueImpl">
+ <property name="DestinationAddress" value="@qpid.request.queue.dest.address@"/>
+ </admin-object-resource>
+
+ <admin-object-resource jndi-name="QpidResponseQueue" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidQueue" class-name="org.apache.qpid.ra.admin.QpidQueueImpl">
+ <property name="DestinationAddress" value="@qpid.response.queue.dest.address@"/>
+ </admin-object-resource>
+
+ <admin-object-resource jndi-name="QpidConnectionFactory" res-adapter="qpid-ra-@rar.ver@" res-type="javax.jms.ConnectionFactory" class-name="org.apache.qpid.ra.admin.QpidConnectionFactoryProxy">
+ <property name="ConnectionURL" value="@broker.url@"/>
+ </admin-object-resource>
+
+</resources>
diff --git a/java/jca/example/conf/glassfish-web.xml b/java/jca/example/conf/glassfish-web.xml
new file mode 100644
index 0000000000..950ee73d51
--- /dev/null
+++ b/java/jca/example/conf/glassfish-web.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
+<glassfish-web-app>
+
+ <context-root>qpid-jca-web</context-root>
+
+ <ejb-ref>
+ <ejb-ref-name>QpidTestBean</ejb-ref-name>
+ <jndi-name>QpidTestBean</jndi-name>
+ </ejb-ref>
+
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ <resource-env-ref>
+ <res-env-ref-name>HelloQueue</res-env-ref-name>
+ <jndi-name>HelloQueue</jndi-name>
+ </resource-env-ref>
+ <resource-ref>
+ <res-ref-name>HelloTopic</res-ref-name>
+ <jndi-name>HelloTopic</jndi-name>
+ </resource-ref>
+
+
+</glassfish-web-app>
diff --git a/java/jca/example/conf/jboss-ejb-client.properties b/java/jca/example/conf/jboss-ejb-client.properties
new file mode 100644
index 0000000000..8bf1075c14
--- /dev/null
+++ b/java/jca/example/conf/jboss-ejb-client.properties
@@ -0,0 +1,12 @@
+endpoint.name=client-endpoint
+remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
+
+remote.connections=default
+
+remote.connection.default.host=localhost
+remote.connection.default.port = 4447
+remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
+
+remote.connection.default.username=wmprice
+remote.connection.default.password=72whtu78
+
diff --git a/java/jca/example/conf/jboss-web.xml b/java/jca/example/conf/jboss-web.xml
index edacf8d418..32a97d1c35 100644
--- a/java/jca/example/conf/jboss-web.xml
+++ b/java/jca/example/conf/jboss-web.xml
@@ -25,6 +25,11 @@
<res-type>javax.jms.ConnectionFactory</res-type>
<jndi-name>java:/QpidJMSXA</jndi-name>
</resource-ref>
+ <resource-ref>
+ <res-ref-name>QpidJMS</res-ref-name>
+ <res-type>javax.jms.ConnectionFactory</res-type>
+ <jndi-name>java:/QpidJMS</jndi-name>
+ </resource-ref>
<ejb-local-ref>
<ejb-ref-name>QpidTestBean</ejb-ref-name>
<jndi-name>qpid-jcaex/QpidTestBean/local</jndi-name>
diff --git a/java/jca/example/conf/log4j.properties b/java/jca/example/conf/log4j.properties
index f1847f4418..1139ab9e85 100644
--- a/java/jca/example/conf/log4j.properties
+++ b/java/jca/example/conf/log4j.properties
@@ -1,3 +1,21 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
log4j.rootLogger=DEBUG, CONSOLE, FILE
#Console Appender
diff --git a/java/jca/example/conf/qpid-jca-ds.xml b/java/jca/example/conf/qpid-jca-ds.xml
index 80fb828b55..ad75876808 100644
--- a/java/jca/example/conf/qpid-jca-ds.xml
+++ b/java/jca/example/conf/qpid-jca-ds.xml
@@ -27,7 +27,7 @@
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">org.apache.qpid.ra.admin.QpidTopic</attribute>
<attribute name="Properties">
- destinationAddress=@qpid.hello.topic.dest.address@
+ DestinationAddress=@qpid.hello.topic.dest.address@
</attribute>
</mbean>
@@ -37,7 +37,7 @@
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">org.apache.qpid.ra.admin.QpidTopic</attribute>
<attribute name="Properties">
- destinationAddress=@qpid.goodbye.topic.dest.address@
+ DestinationAddress=@qpid.goodbye.topic.dest.address@
</attribute>
</mbean>
@@ -47,7 +47,7 @@
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">org.apache.qpid.ra.admin.QpidTopic</attribute>
<attribute name="Properties">
- destinationAddress=@qpid.hellogoodbye.topic.dest.address@
+ DestinationAddress=@qpid.hellogoodbye.topic.dest.address@
</attribute>
</mbean>
@@ -57,7 +57,7 @@
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">org.apache.qpid.ra.admin.QpidQueue</attribute>
<attribute name="Properties">
- destinationAddress=@qpid.hello.queue.dest.address@
+ DestinationAddress=@qpid.hello.queue.dest.address@
</attribute>
</mbean>
@@ -67,27 +67,36 @@
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">org.apache.qpid.ra.admin.QpidQueue</attribute>
<attribute name="Properties">
- destinationAddress=@qpid.goodbye.queue.dest.address@
+ DestinationAddress=@qpid.goodbye.queue.dest.address@
</attribute>
</mbean>
<mbean code="org.jboss.resource.deployment.AdminObject"
- name="qpid.jca:name=QpidResponderQueue">
- <attribute name="JNDIName">QpidResponderQueue</attribute>
+ name="qpid.jca:name=QpidRequestQueue">
+ <attribute name="JNDIName">QpidRequestQueue</attribute>
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">org.apache.qpid.ra.admin.QpidQueue</attribute>
<attribute name="Properties">
- destinationAddress=@qpid.responder.queue.dest.address@
+ DestinationAddress=@qpid.request.queue.dest.address@
</attribute>
</mbean>
<mbean code="org.jboss.resource.deployment.AdminObject"
+ name="qpid.jca:name=QpidResponseQueue">
+ <attribute name="JNDIName">QpidResponseQueue</attribute>
+ <depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
+ <attribute name="Type">org.apache.qpid.ra.admin.QpidQueue</attribute>
+ <attribute name="Properties">
+ DestinationAddress=@qpid.response.queue.dest.address@
+ </attribute>
+ </mbean>
+ <mbean code="org.jboss.resource.deployment.AdminObject"
name="qpid.jca:name=QpidConnectionFactory">
<attribute name="JNDIName">QpidConnectionFactory</attribute>
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">javax.jms.ConnectionFactory</attribute>
<attribute name="Properties">
- connectionURL=@broker.url@
+ ConnectionURL=@broker.url@
</attribute>
</mbean>
diff --git a/java/jca/example/conf/qpid-standalone.xml b/java/jca/example/conf/qpid-standalone.xml
new file mode 100644
index 0000000000..8d6137aea7
--- /dev/null
+++ b/java/jca/example/conf/qpid-standalone.xml
@@ -0,0 +1,422 @@
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+-->
+<?xml version='1.0' encoding='UTF-8'?>
+
+<server xmlns="urn:jboss:domain:1.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance">
+
+ <extensions>
+ <extension module="org.jboss.as.clustering.infinispan"/>
+ <extension module="org.jboss.as.connector"/>
+ <extension module="org.jboss.as.configadmin"/>
+ <extension module="org.jboss.as.deployment-scanner"/>
+ <extension module="org.jboss.as.ee"/>
+ <extension module="org.jboss.as.ejb3"/>
+ <extension module="org.jboss.as.jaxr"/>
+ <extension module="org.jboss.as.jaxrs"/>
+ <extension module="org.jboss.as.jdr"/>
+ <extension module="org.jboss.as.jmx"/>
+ <extension module="org.jboss.as.jpa"/>
+ <extension module="org.jboss.as.logging"/>
+ <extension module="org.jboss.as.mail"/>
+ <extension module="org.jboss.as.naming"/>
+ <extension module="org.jboss.as.osgi"/>
+ <extension module="org.jboss.as.pojo"/>
+ <extension module="org.jboss.as.remoting"/>
+ <extension module="org.jboss.as.sar"/>
+ <extension module="org.jboss.as.security"/>
+ <extension module="org.jboss.as.threads"/>
+ <extension module="org.jboss.as.transactions"/>
+ <extension module="org.jboss.as.web"/>
+ <extension module="org.jboss.as.webservices"/>
+ <extension module="org.jboss.as.weld"/>
+ </extensions>
+
+ <management>
+ <security-realms>
+ <security-realm name="ManagementRealm">
+ <authentication>
+ <properties path="mgmt-users.properties" relative-to="jboss.server.config.dir"/>
+ </authentication>
+ </security-realm>
+ </security-realms>
+ <management-interfaces>
+ <native-interface security-realm="ManagementRealm">
+ <socket-binding native="management-native"/>
+ </native-interface>
+ <http-interface security-realm="ManagementRealm">
+ <socket-binding http="management-http"/>
+ </http-interface>
+ </management-interfaces>
+ </management>
+
+ <profile>
+ <subsystem xmlns="urn:jboss:domain:logging:1.1">
+ <console-handler name="CONSOLE">
+ <level name="INFO"/>
+ <formatter>
+ <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
+ </formatter>
+ </console-handler>
+ <periodic-rotating-file-handler name="FILE">
+ <formatter>
+ <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
+ </formatter>
+ <file relative-to="jboss.server.log.dir" path="server.log"/>
+ <suffix value=".yyyy-MM-dd"/>
+ <append value="true"/>
+ </periodic-rotating-file-handler>
+ <logger category="com.arjuna">
+ <level name="WARN"/>
+ </logger>
+ <logger category="org.apache.tomcat.util.modeler">
+ <level name="WARN"/>
+ </logger>
+ <logger category="sun.rmi">
+ <level name="WARN"/>
+ </logger>
+ <logger category="jacorb">
+ <level name="WARN"/>
+ </logger>
+ <logger category="jacorb.config">
+ <level name="ERROR"/>
+ </logger>
+ <root-logger>
+ <level name="DEBUG"/>
+ <handlers>
+ <handler name="CONSOLE"/>
+ <handler name="FILE"/>
+ </handlers>
+ </root-logger>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:configadmin:1.0"/>
+ <subsystem xmlns="urn:jboss:domain:datasources:1.0">
+ <datasources>
+ <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
+ <connection-url>
+ jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
+ </connection-url>
+ <driver>
+ h2
+ </driver>
+ <security>
+ <user-name>
+ sa
+ </user-name>
+ <password>
+ sa
+ </password>
+ </security>
+ </datasource>
+ <drivers>
+ <driver name="h2" module="com.h2database.h2">
+ <xa-datasource-class>
+ org.h2.jdbcx.JdbcDataSource
+ </xa-datasource-class>
+ </driver>
+ </drivers>
+ </datasources>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:deployment-scanner:1.1">
+ <deployment-scanner name="default" path="deployments" scan-interval="5000" relative-to="jboss.server.base.dir"/>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:ee:1.0"/>
+ <subsystem xmlns="urn:jboss:domain:ejb3:1.2">
+ <session-bean>
+ <stateless>
+ <bean-instance-pool-ref pool-name="slsb-strict-max-pool"/>
+ </stateless>
+ <stateful default-access-timeout="5000" cache-ref="simple"/>
+ <singleton default-access-timeout="5000"/>
+ </session-bean>
+ <mdb>
+ <resource-adapter-ref resource-adapter-name="@rar.name@"/>
+ <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
+ </mdb>
+ <pools>
+ <bean-instance-pools>
+ <strict-max-pool name="slsb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/>
+ <strict-max-pool name="mdb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/>
+ </bean-instance-pools>
+ </pools>
+ <caches>
+ <cache name="simple" aliases="NoPassivationCache"/>
+ <cache name="passivating" passivation-store-ref="file" aliases="SimpleStatefulCache"/>
+ </caches>
+ <passivation-stores>
+ <file-passivation-store name="file"/>
+ </passivation-stores>
+ <async thread-pool-name="default"/>
+ <timer-service thread-pool-name="default">
+ <data-store path="timer-service-data" relative-to="jboss.server.data.dir"/>
+ </timer-service>
+ <remote connector-ref="remoting-connector" thread-pool-name="default"/>
+ <thread-pools>
+ <thread-pool name="default">
+ <max-threads count="10"/>
+ <keepalive-time time="100" unit="milliseconds"/>
+ </thread-pool>
+ </thread-pools>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:infinispan:1.1" default-cache-container="hibernate">
+ <cache-container name="hibernate" default-cache="local-query">
+ <local-cache name="entity">
+ <transaction mode="NON_XA"/>
+ <eviction strategy="LRU" max-entries="10000"/>
+ <expiration max-idle="100000"/>
+ </local-cache>
+ <local-cache name="local-query">
+ <transaction mode="NONE"/>
+ <eviction strategy="LRU" max-entries="10000"/>
+ <expiration max-idle="100000"/>
+ </local-cache>
+ <local-cache name="timestamps">
+ <transaction mode="NONE"/>
+ <eviction strategy="NONE"/>
+ </local-cache>
+ </cache-container>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:jaxr:1.0">
+ <connection-factory jndi-name="java:jboss/jaxr/ConnectionFactory"/>
+ <juddi-server publish-url="http://localhost:8080/juddi/publish" query-url="http://localhost:8080/juddi/query"/>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/>
+ <subsystem xmlns="urn:jboss:domain:jca:1.1">
+ <archive-validation enabled="false"/>
+ <bean-validation enabled="false"/>
+ <default-workmanager>
+ <short-running-threads>
+ <core-threads count="50"/>
+ <queue-length count="50"/>
+ <max-threads count="50"/>
+ <keepalive-time time="10" unit="seconds"/>
+ </short-running-threads>
+ <long-running-threads>
+ <core-threads count="50"/>
+ <queue-length count="50"/>
+ <max-threads count="50"/>
+ <keepalive-time time="10" unit="seconds"/>
+ </long-running-threads>
+ </default-workmanager>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:jdr:1.0"/>
+ <subsystem xmlns="urn:jboss:domain:jmx:1.1">
+ <show-model value="true"/>
+ <remoting-connector/>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:jpa:1.0">
+ <jpa default-datasource=""/>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:mail:1.0">
+ <mail-session jndi-name="java:jboss/mail/Default">
+ <smtp-server outbound-socket-binding-ref="mail-smtp"/>
+ </mail-session>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:naming:1.1"/>
+ <subsystem xmlns="urn:jboss:domain:osgi:1.2" activation="lazy">
+ <properties>
+ <property name="org.osgi.framework.startlevel.beginning">
+ 1
+ </property>
+ </properties>
+ <capabilities>
+ <capability name="javax.servlet.api"/>
+ <capability name="javax.transaction.api"/>
+ <capability name="org.apache.felix.log" startlevel="1"/>
+ <capability name="org.jboss.osgi.logging" startlevel="1"/>
+ <capability name="org.apache.felix.configadmin" startlevel="1"/>
+ <capability name="org.jboss.as.osgi.configadmin" startlevel="1"/>
+ <capability name="org.jboss.osgi.repository" startlevel="1"/>
+ </capabilities>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:pojo:1.0"/>
+ <subsystem xmlns="urn:jboss:domain:remoting:1.1">
+ <connector name="remoting-connector" socket-binding="remoting"/>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:resource-adapters:1.0">
+ <resource-adapters>
+ <resource-adapter>
+ <archive>
+ @rar.name@
+ </archive>
+ <transaction-support>
+ XATransaction
+ </transaction-support>
+ <config-property name="connectionURL">
+ @broker.url@
+ </config-property>
+ <config-property name="TransactionManagerLocatorClass">
+ org.apache.qpid.ra.tm.JBoss7TransactionManagerLocator
+ </config-property>
+ <config-property name="TransactionManagerLocatorMethod">
+ getTm
+ </config-property>
+ <connection-definitions>
+ <connection-definition class-name="org.apache.qpid.ra.QpidRAManagedConnectionFactory" jndi-name="QpidJMSXA" pool-name="QpidJMSXA">
+ <config-property name="connectionURL">
+ @broker.url@
+ </config-property>
+ <config-property name="SessionDefaultType">
+ javax.jms.Queue
+ </config-property>
+ </connection-definition>
+ </connection-definitions>
+ <admin-objects>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidConnectionFactoryProxy" jndi-name="java:jboss/exported/QpidConnectionFactory" use-java-context="false">
+ <config-property name="ConnectionURL">
+ @broker.url@
+ </config-property>
+ </admin-object>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidTopicImpl" jndi-name="java:jboss/exported/GoodByeTopic" use-java-context="false" pool-name="GoodByeTopic">
+ <config-property name="DestinationAddress">
+ @qpid.hello.topic.dest.address@
+ </config-property>
+ </admin-object>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidTopicImpl" jndi-name="java:jboss/exported/HelloTopic" use-java-context="false" pool-name="HelloTopic">
+ <config-property name="DestinationAddress">
+ @qpid.goodbye.topic.dest.address@
+ </config-property>
+ </admin-object>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidQueueImpl" jndi-name="java:jboss/exported/GoodByeQueue" use-java-context="false" pool-name="GoodByeQueue">
+ <config-property name="DestinationAddress">
+ @qpid.goodbye.queue.dest.address@
+ </config-property>
+ </admin-object>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidQueueImpl" jndi-name="java:jboss/exported/HelloQueue" use-java-context="false" pool-name="HelloQueue">
+ <config-property name="DestinationAddress">
+ @qpid.hello.queue.dest.address@
+ </config-property>
+ </admin-object>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidQueueImpl" jndi-name="java:jboss/exported/QpidRequestQueue" use-java-context="false" pool-name="QpidRequestQueue">
+ <config-property name="DestinationAddress">
+ @qpid.request.queue.dest.address@
+ </config-property>
+ </admin-object>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidQueueImpl" jndi-name="java:jboss/exported/QpidResponseQueue" use-java-context="false" pool-name="QpidResponseQueue">
+ <config-property name="DestinationAddress">
+ @qpid.response.queue.dest.address@
+ </config-property>
+ </admin-object>
+ </admin-objects>
+ </resource-adapter>
+ </resource-adapters>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:sar:1.0"/>
+ <subsystem xmlns="urn:jboss:domain:security:1.1">
+ <security-domains>
+ <security-domain name="other" cache-type="default">
+ <authentication>
+ <login-module code="UsersRoles" flag="required"/>
+ </authentication>
+ </security-domain>
+ <security-domain name="jboss-web-policy" cache-type="default">
+ <authorization>
+ <policy-module code="Delegating" flag="required"/>
+ </authorization>
+ </security-domain>
+ <security-domain name="jboss-ejb-policy" cache-type="default">
+ <authorization>
+ <policy-module code="Delegating" flag="required"/>
+ </authorization>
+ </security-domain>
+ </security-domains>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:threads:1.1"/>
+ <subsystem xmlns="urn:jboss:domain:transactions:1.1">
+ <core-environment>
+ <process-id>
+ <uuid/>
+ </process-id>
+ </core-environment>
+ <recovery-environment socket-binding="txn-recovery-environment" status-socket-binding="txn-status-manager"/>
+ <coordinator-environment default-timeout="300"/>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host">
+ <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
+ <virtual-server name="default-host" enable-welcome-root="true">
+ <alias name="localhost"/>
+ <alias name="example.com"/>
+ </virtual-server>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:webservices:1.0" xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:jaxwsconfig="urn:jboss:jbossws-jaxws-config:4.0">
+ <modify-wsdl-address>
+ true
+ </modify-wsdl-address>
+ <wsdl-host>
+ ${jboss.bind.address:127.0.0.1}
+ </wsdl-host>
+ <endpoint-config>
+ <jaxwsconfig:config-name>
+ Standard-Endpoint-Config
+ </jaxwsconfig:config-name>
+ </endpoint-config>
+ <endpoint-config>
+ <jaxwsconfig:config-name>
+ Recording-Endpoint-Config
+ </jaxwsconfig:config-name>
+ <jaxwsconfig:pre-handler-chains>
+ <javaee:handler-chain id="recording-handlers">
+ <javaee:protocol-bindings>
+ ##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM
+ </javaee:protocol-bindings>
+ <javaee:handler>
+ <javaee:handler-name>
+ RecordingHandler
+ </javaee:handler-name>
+ <javaee:handler-class>
+ org.jboss.ws.common.invocation.RecordingServerHandler
+ </javaee:handler-class>
+ </javaee:handler>
+ </javaee:handler-chain>
+ </jaxwsconfig:pre-handler-chains>
+ </endpoint-config>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:weld:1.0"/>
+ </profile>
+
+ <interfaces>
+ <interface name="management">
+ <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
+ </interface>
+ <interface name="public">
+ <inet-address value="${jboss.bind.address:127.0.0.1}"/>
+ </interface>
+ </interfaces>
+
+ <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
+ <socket-binding name="http" port="8080"/>
+ <socket-binding name="https" port="8443"/>
+ <socket-binding name="jacorb" port="3528"/>
+ <socket-binding name="jacorb-ssl" port="3529"/>
+ <socket-binding name="management-native" interface="management" port="${jboss.management.native.port:9999}"/>
+ <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
+ <socket-binding name="messaging" port="5445"/>
+ <socket-binding name="messaging-throughput" port="5455"/>
+ <socket-binding name="osgi-http" interface="management" port="8090"/>
+ <socket-binding name="remoting" port="4447"/>
+ <socket-binding name="txn-recovery-environment" port="4712"/>
+ <socket-binding name="txn-status-manager" port="4713"/>
+ <outbound-socket-binding name="mail-smtp">
+ <remote-destination host="localhost" port="25"/>
+ </outbound-socket-binding>
+ </socket-binding-group>
+
+
+</server>
diff --git a/java/jca/example/conf/web.xml b/java/jca/example/conf/web.xml
index d87c578606..6e53d7beba 100644
--- a/java/jca/example/conf/web.xml
+++ b/java/jca/example/conf/web.xml
@@ -29,11 +29,22 @@
<load-on-startup>1</load-on-startup>
</servlet>
+ <servlet>
+ <display-name>QpidRequestResponseServlet</display-name>
+ <servlet-name>QpidRequestResponseServlet</servlet-name>
+ <servlet-class>org.apache.qpid.jca.example.web.QpidRequestResponseServlet</servlet-class>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
<servlet-mapping>
<servlet-name>QpidTestServlet</servlet-name>
<url-pattern>/qpid</url-pattern>
</servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>QpidRequestResponseServlet</servlet-name>
+ <url-pattern>/qpid-reqresp</url-pattern>
+ </servlet-mapping>
</web-app>
diff --git a/java/jca/example/qpid-jca-example-properties.xml b/java/jca/example/qpid-jca-example-properties.xml
index eb219a05e1..ab0f6267ba 100644
--- a/java/jca/example/qpid-jca-example-properties.xml
+++ b/java/jca/example/qpid-jca-example-properties.xml
@@ -45,8 +45,10 @@
value="hello.Queue;{create:always, node:{type:queue, x-declare:{auto-delete:true}}}"/>
<property name="qpid.goodbye.queue.dest.address.ADDR"
value="goodbye.Queue;{create:always, node:{type:queue, x-declare:{auto-delete:true}}}"/>
- <property name="qpid.responder.queue.dest.address.ADDR"
- value="responder.Queue;{create:always, node:{type:queue, x-declare:{auto-delete:true}}}"/>
+ <property name="qpid.request.queue.dest.address.ADDR"
+ value="request.Queue;{create:always, node:{type:queue, x-declare:{auto-delete:true}}}"/>
+ <property name="qpid.response.queue.dest.address.ADDR"
+ value="response.Queue;{create:always, node:{type:queue, x-declare:{auto-delete:false}}}"/>
<property name="qpid.hello.topic.dest.address.BURL"
value="BURL:topic://amq.topic//hello.jcaTopic?routingKey='hello.jcaTopic',autodelete='true'"/>
@@ -58,8 +60,10 @@
value="BURL:direct://amq.direct//hello.Queue?routingkey='hello.Queue'"/>
<property name="qpid.goodbye.queue.dest.address.BURL"
value="BURL:direct://amq.direct//goodbye.Queue?routingkey='goodbye.Queue'"/>
- <property name="qpid.responder.queue.dest.address.BURL"
- value="BURL:direct://amq.direct//responder.Queue?routingkey='responder.Queue'"/>
+ <property name="qpid.request.queue.dest.address.BURL"
+ value="BURL:direct://amq.direct//request.Queue?routingkey='request.Queue'"/>
+ <property name="qpid.response.queue.dest.address.BURL"
+ value="BURL:direct://amq.direct//response.Queue?routingkey='response.Queue'"/>
<!-- This macro allows us to construct a property name which contains a property expansion -->
<macrodef name="set-address-property">
@@ -75,5 +79,6 @@
<set-address-property name="qpid.hellogoodbye.topic.dest.address" syntax="${qpid.dest_syntax}"/>
<set-address-property name="qpid.hello.queue.dest.address" syntax="${qpid.dest_syntax}"/>
<set-address-property name="qpid.goodbye.queue.dest.address" syntax="${qpid.dest_syntax}"/>
- <set-address-property name="qpid.responder.queue.dest.address" syntax="${qpid.dest_syntax}"/>
+ <set-address-property name="qpid.request.queue.dest.address" syntax="${qpid.dest_syntax}"/>
+ <set-address-property name="qpid.response.queue.dest.address" syntax="${qpid.dest_syntax}"/>
</project>
diff --git a/java/jca/example/src/main/java/org/apache/qpid/jca/example/client/QpidRequestResponseClient.java b/java/jca/example/src/main/java/org/apache/qpid/jca/example/client/QpidRequestResponseClient.java
index 734df1c0f3..fd5b3efff0 100644
--- a/java/jca/example/src/main/java/org/apache/qpid/jca/example/client/QpidRequestResponseClient.java
+++ b/java/jca/example/src/main/java/org/apache/qpid/jca/example/client/QpidRequestResponseClient.java
@@ -42,7 +42,7 @@ public class QpidRequestResponseClient implements MessageListener, Runnable
private static final Logger _log = LoggerFactory.getLogger(QpidRequestResponseClient.class);
private static final String DEFAULT_CF_JNDI = "QpidConnectionFactory";
- private static final String DEFAULT_DESTINATION_JNDI = "QpidResponderQueue";
+ private static final String DEFAULT_DESTINATION_JNDI = "QpidRequestQueue";
private static final String DEFAULT_MESSAGE = "Hello, World!";
private static final int DEFAULT_MESSAGE_COUNT = 1;
private static final int DEFAULT_THREAD_COUNT = 1;
diff --git a/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeListenerBean.java b/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeListenerBean.java
index 9cf220de2a..bdb722a87b 100644
--- a/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeListenerBean.java
+++ b/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeListenerBean.java
@@ -34,7 +34,7 @@ import org.slf4j.LoggerFactory;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
- @ActivationConfigProperty(propertyName = "destination", propertyValue = "@qpid.goodbye.queue.jndi.name@"),
+ @ActivationConfigProperty(propertyName = "destination", propertyValue = "@jndi.prefix@@qpid.goodbye.queue.jndi.name@"),
@ActivationConfigProperty(propertyName = "connectionURL", propertyValue = "@broker.url@"),
@ActivationConfigProperty(propertyName = "useLocalTx", propertyValue = "false"),
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "10")
diff --git a/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeSubscriberBean.java b/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeSubscriberBean.java
index 64e0effb1f..f2e4d6aaa5 100644
--- a/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeSubscriberBean.java
+++ b/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeSubscriberBean.java
@@ -34,10 +34,9 @@ import org.slf4j.LoggerFactory;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
- @ActivationConfigProperty(propertyName = "destination", propertyValue = "@qpid.goodbye.topic.jndi.name@"),
+ @ActivationConfigProperty(propertyName = "destination", propertyValue = "@jndi.prefix@@qpid.goodbye.topic.jndi.name@"),
@ActivationConfigProperty(propertyName = "connectionURL", propertyValue = "@broker.url@"),
@ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "NotDurable"),
- @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "hello.Topic"),
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "10")
})
diff --git a/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloListenerBean.java b/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloListenerBean.java
index 0056e7b0b8..75e0acab79 100644
--- a/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloListenerBean.java
+++ b/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloListenerBean.java
@@ -42,7 +42,7 @@ import org.slf4j.LoggerFactory;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
- @ActivationConfigProperty(propertyName = "destination", propertyValue = "@qpid.hello.queue.jndi.name@"),
+ @ActivationConfigProperty(propertyName = "destination", propertyValue = "@jndi.prefix@@qpid.hello.queue.jndi.name@"),
@ActivationConfigProperty(propertyName = "connectionURL", propertyValue = "@broker.url@"),
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "10")
})
@@ -53,7 +53,7 @@ public class QpidHelloListenerBean implements MessageListener
@Resource(@jndi.scheme@="@qpid.xacf.jndi.name@")
private ConnectionFactory _connectionFactory;
- @Resource(@jndi.scheme@="GoodByeQueue")
+ @Resource(@jndi.scheme@="@qpid.goodbye.queue.jndi.name@")
private Destination _queue;
@Override
diff --git a/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloSubscriberBean.java b/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloSubscriberBean.java
index 560de36e48..882c85fa18 100644
--- a/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloSubscriberBean.java
+++ b/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloSubscriberBean.java
@@ -42,10 +42,9 @@ import org.slf4j.LoggerFactory;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
- @ActivationConfigProperty(propertyName = "destination", propertyValue = "@qpid.hello.topic.jndi.name@"),
+ @ActivationConfigProperty(propertyName = "destination", propertyValue = "@jndi.prefix@@qpid.hello.topic.jndi.name@"),
@ActivationConfigProperty(propertyName = "connectionURL", propertyValue = "@broker.url@"),
@ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "NotDurable"),
- @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "hello.Topic"),
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "10")
})
public class QpidHelloSubscriberBean implements MessageListener
@@ -55,7 +54,7 @@ public class QpidHelloSubscriberBean implements MessageListener
@Resource(@jndi.scheme@="@qpid.xacf.jndi.name@")
private ConnectionFactory _connectionFactory;
- @Resource(@jndi.scheme@="GoodByeTopic")
+ @Resource(@jndi.scheme@="@qpid.goodbye.topic.jndi.name@")
private Destination _topic;
@Override
diff --git a/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidJMSResponderBean.java b/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidJMSResponderBean.java
index e7b44e10ca..6e99d4fe7f 100644
--- a/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidJMSResponderBean.java
+++ b/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidJMSResponderBean.java
@@ -27,6 +27,7 @@ import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
@@ -40,7 +41,7 @@ import org.slf4j.LoggerFactory;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
- @ActivationConfigProperty(propertyName = "destination", propertyValue = "@qpid.responder.queue.jndi.name@"),
+ @ActivationConfigProperty(propertyName = "destination", propertyValue = "@jndi.prefix@@qpid.request.queue.jndi.name@"),
@ActivationConfigProperty(propertyName = "connectionURL", propertyValue = "@broker.url@"),
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "10")
})
@@ -72,10 +73,12 @@ public class QpidJMSResponderBean implements MessageListener
temp.append("QpidJMSResponderBean received message with content: [" + content);
temp.append("] at " + new Date());
+ connection = _connectionFactory.createConnection();
+ session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
if(message.getJMSReplyTo() != null)
{
- connection = _connectionFactory.createConnection();
- session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _log.info("Sending response via JMSReplyTo");
messageProducer = session.createProducer(message.getJMSReplyTo());
response = session.createTextMessage();
response.setText(temp.toString());
@@ -83,8 +86,10 @@ public class QpidJMSResponderBean implements MessageListener
}
else
{
- _log.warn("Response was requested with no JMSReplyToDestination set. Will not respond to message.");
+ _log.info("JMSReplyTo is null. Will not respond to message.");
}
+
+
}
}
catch(Exception e)
diff --git a/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidTestBean.java b/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidTestBean.java
index 014b459699..a5f4770257 100644
--- a/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidTestBean.java
+++ b/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidTestBean.java
@@ -43,10 +43,10 @@ public class QpidTestBean implements QpidTestRemote, QpidTestLocal
@Resource(@jndi.scheme@="@qpid.xacf.jndi.name@")
private ConnectionFactory _connectionFactory;
- @Resource(@jndi.scheme@="HelloQueue")
+ @Resource(@jndi.scheme@="@qpid.hello.queue.jndi.name@")
private Destination _queue;
- @Resource(@jndi.scheme@="HelloTopic")
+ @Resource(@jndi.scheme@="@qpid.hello.topic.jndi.name@")
private Destination _topic;
@Override
diff --git a/java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidRequestResponseServlet.java b/java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidRequestResponseServlet.java
new file mode 100644
index 0000000000..d069a0c943
--- /dev/null
+++ b/java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidRequestResponseServlet.java
@@ -0,0 +1,283 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.jca.example.web;
+import java.io.IOException;
+import java.lang.Thread;
+
+import javax.annotation.Resource;
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.InitialContext;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.transaction.UserTransaction;
+
+import org.apache.qpid.jca.example.ejb.QpidTest;
+import org.apache.qpid.jca.example.ejb.QpidUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@SuppressWarnings("serial")
+public class QpidRequestResponseServlet extends HttpServlet
+{
+ private static final Logger _log = LoggerFactory.getLogger(QpidTestServlet.class);
+
+ private static final String DEFAULT_MESSAGE = "Hello, World!";
+ private static final int DEFAULT_COUNT = 1;
+ private static final boolean DEFAULT_XA = false;
+ private static final boolean DEFAULT_TX = false;
+ private static final boolean USE_TMP_QUEUE = false;
+
+ @Resource(@jndi.scheme@="@qpid.xacf.jndi.name@")
+ private ConnectionFactory _connectionFactory;
+
+ @Resource(@jndi.scheme@="@qpid.request.queue.jndi.name@")
+ private Destination _queue;
+
+ @Resource(@jndi.scheme@="@qpid.response.queue.jndi.name@")
+ private Destination _responseQueue;
+
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+ {
+ doPost(req, resp);
+ }
+
+ @Override
+ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+ {
+ InitialContext ctx = null;
+ Connection connection = null;
+ Session session = null;
+ MessageProducer messageProducer = null;
+ UserTransaction ut = null;
+ boolean useXA = false;
+ boolean rollback = false;
+ boolean useTx = false;
+ MessageConsumer messageConsumer = null;
+ long startTime = 0;
+
+ try
+ {
+ String content = (req.getParameter("message") == null) ? DEFAULT_MESSAGE : req.getParameter("message");
+ int count = (req.getParameter("count") == null) ? DEFAULT_COUNT : Integer.valueOf(req.getParameter("count"));
+ useXA = (req.getParameter("useXA") == null) ? DEFAULT_XA : Boolean.valueOf(req.getParameter("useXA"));
+ useTx = (req.getParameter("useTx") == null) ? DEFAULT_TX : Boolean.valueOf(req.getParameter("useTx"));
+
+ ctx = new InitialContext();
+
+ _log.debug("Environment: ");
+ _log.debug("Message content: " + content);
+ _log.debug("Message count:" + count);
+ _log.debug("Using XA: " + useXA);
+
+ resp.getOutputStream().println("Environment: ");
+ resp.getOutputStream().println("Message content: " + content);
+ resp.getOutputStream().println("Message count:" + count);
+ resp.getOutputStream().println("Using XA: " + useXA);
+
+ try
+ {
+
+ connection = _connectionFactory.createConnection();
+
+ if(useXA)
+ {
+ ut = (UserTransaction)ctx.lookup("java:comp/UserTransaction");
+ ut.begin();
+ useTx = false;
+ }
+
+ session = (useXA) ? connection.createSession(false, Session.AUTO_ACKNOWLEDGE) : connection.createSession(useTx, Session.AUTO_ACKNOWLEDGE);
+ messageProducer = session.createProducer(_queue);
+
+ startTime = System.currentTimeMillis();
+
+ for(int i = 0; i < count; i++)
+ {
+ TextMessage message = session.createTextMessage(content);
+ message.setJMSReplyTo(_responseQueue);
+ messageProducer.send(message);
+ }
+
+ }
+ catch(Exception e)
+ {
+ rollback = true;
+
+ if(useXA && ut != null)
+ {
+ try
+ {
+ ut.setRollbackOnly();
+ }
+ catch(Exception ex)
+ {
+ _log.error(ex.getMessage(), ex);
+ throw new ServletException(ex.getMessage(), ex);
+ }
+ }
+ }
+ finally
+ {
+ try
+ {
+ if(useXA && ut != null)
+ {
+ if(rollback)
+ {
+ ut.rollback();
+ }
+ else
+ {
+ ut.commit();
+ }
+ }
+ if(useTx && !useXA)
+ {
+ if(rollback)
+ {
+ session.rollback();
+ }
+ else
+ {
+ session.commit();
+ }
+ }
+ }
+ catch(Exception e)
+ {
+ _log.error(e.getMessage(), e);
+ throw new ServletException(e.getMessage(), e);
+ }
+
+ QpidUtil.closeResources(messageProducer, session);
+ }
+
+ resp.getOutputStream().println("Sent " + count + " messages with content '" + content + "'");
+ resp.getOutputStream().flush();
+
+ int ackMode = Session.AUTO_ACKNOWLEDGE;
+ rollback = false;
+
+ if(useXA)
+ {
+ ut.begin();
+ }
+
+ session = (useXA) ? connection.createSession(false, Session.AUTO_ACKNOWLEDGE) : connection.createSession(useTx, Session.AUTO_ACKNOWLEDGE);
+ messageConsumer = session.createConsumer(_responseQueue);
+ connection.start();
+
+ for(int i = 0; i < count; i++)
+ {
+ TextMessage message = (TextMessage)messageConsumer.receive(5000);
+
+ if(message != null)
+ {
+ message.acknowledge();
+ content = message.getText();
+
+ }
+ }
+
+ startTime = System.currentTimeMillis() - startTime;
+ resp.getOutputStream().println("Received " + count + " messages with content '" + content + "'");
+ resp.getOutputStream().println("Total process time " + startTime);
+ }
+ catch(Exception e)
+ {
+ rollback = true;
+
+ if(useXA && ut != null)
+ {
+ try
+ {
+ ut.setRollbackOnly();
+ }
+ catch(Exception ex)
+ {
+ _log.error(ex.getMessage(), ex);
+ throw new ServletException(ex.getMessage(), ex);
+ }
+ }
+ }
+ finally
+ {
+ if(useXA && ut != null)
+ {
+ try
+ {
+ if(rollback)
+ {
+ ut.rollback();
+ }
+ else
+ {
+ ut.commit();
+ }
+ }
+ catch(Exception e)
+ {
+ _log.error(e.getMessage(), e);
+ throw new ServletException(e.getMessage(), e);
+
+ }
+ }
+
+ if(useTx && !useXA)
+ {
+ try
+ {
+ if(rollback)
+ {
+ session.rollback();
+ }
+ else
+ {
+ session.commit();
+ }
+ }
+ catch(Exception e)
+ {
+ _log.error(e.getMessage(), e);
+ throw new ServletException(e.getMessage(), e);
+ }
+ }
+
+ QpidUtil.closeResources(messageProducer, session);
+ }
+ }
+
+}
+
+
diff --git a/java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidTestServlet.java b/java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidTestServlet.java
index 11a61e762c..7526daa83d 100644
--- a/java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidTestServlet.java
+++ b/java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidTestServlet.java
@@ -52,15 +52,16 @@ public class QpidTestServlet extends HttpServlet
private static final int DEFAULT_COUNT = 1;
private static final boolean DEFAULT_TOPIC = false;
private static final boolean DEFAULT_XA = false;
+ private static final boolean DEFAULT_TX = false;
private static final boolean DEFAULT_SAY_GOODBYE = true;
@Resource(@jndi.scheme@="@qpid.xacf.jndi.name@")
private ConnectionFactory _connectionFactory;
- @Resource(@jndi.scheme@="HelloQueue")
+ @Resource(@jndi.scheme@="@qpid.hello.queue.jndi.name@")
private Destination _queue;
- @Resource(@jndi.scheme@="HelloTopic")
+ @Resource(@jndi.scheme@="@qpid.hello.topic.jndi.name@")
private Destination _topic;
@EJB
@@ -82,6 +83,7 @@ public class QpidTestServlet extends HttpServlet
UserTransaction ut = null;
boolean useXA = false;
boolean rollback = false;
+ boolean useTX = false;
try
{
@@ -90,8 +92,10 @@ public class QpidTestServlet extends HttpServlet
int count = (req.getParameter("count") == null) ? DEFAULT_COUNT : Integer.valueOf(req.getParameter("count"));
boolean useTopic = (req.getParameter("useTopic") == null) ? DEFAULT_TOPIC : Boolean.valueOf(req.getParameter("useTopic"));
useXA = (req.getParameter("useXA") == null) ? DEFAULT_XA : Boolean.valueOf(req.getParameter("useXA"));
+ useTX = (req.getParameter("useTX") == null) ? DEFAULT_TX : Boolean.valueOf(req.getParameter("useTX"));
ctx = new InitialContext();
boolean sayGoodBye = (req.getParameter("sayGoodBye") == null) ? DEFAULT_SAY_GOODBYE : Boolean.valueOf(req.getParameter("sayGoodBye"));
+ useTX = (req.getParameter("useTX") == null) ? DEFAULT_TOPIC : Boolean.valueOf(req.getParameter("DEFAULT_TX"));
_log.debug("Environment: ");
_log.debug("Message content: " + content);
@@ -122,7 +126,7 @@ public class QpidTestServlet extends HttpServlet
}
connection = _connectionFactory.createConnection();
- session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ session = connection.createSession(useTX, Session.AUTO_ACKNOWLEDGE);
messageProducer = (useTopic) ? session.createProducer(_topic) : session.createProducer(_queue);
for(int i = 0; i < count; i++)
@@ -155,6 +159,19 @@ public class QpidTestServlet extends HttpServlet
}
}
+ if(useTX)
+ {
+ try
+ {
+ session.rollback();
+ }
+ catch(Exception ex)
+ {
+ _log.error(ex.getMessage(), ex);
+ throw new ServletException(ex.getMessage(), ex);
+ }
+ }
+
_log.error(e.getMessage(), e);
throw new ServletException(e.getMessage(), e);
}
@@ -181,12 +198,32 @@ public class QpidTestServlet extends HttpServlet
}
}
+ if(useTX && !useXA)
+ {
+ try
+ {
+
+ if(rollback)
+ {
+ session.rollback();
+ }
+ else
+ {
+ session.commit();
+ }
+ }
+ catch(Exception e)
+ {
+
+ _log.error(e.getMessage(), e);
+ throw new ServletException(e.getMessage(), e);
+ }
+ }
+
QpidUtil.closeResources(session, connection, ctx);
}
}
-
-
}
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/ConnectionFactoryProperties.java b/java/jca/src/main/java/org/apache/qpid/ra/ConnectionFactoryProperties.java
index a7b36bc98c..3bddfd80a4 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/ConnectionFactoryProperties.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/ConnectionFactoryProperties.java
@@ -34,7 +34,7 @@ public class ConnectionFactoryProperties
private boolean _hasBeenUpdated = false;
- private String _clientID;
+ private String _clientId;
private String _connectionURL;
@@ -56,7 +56,7 @@ public class ConnectionFactoryProperties
{
_log.trace("getClientID()");
}
- return _clientID;
+ return _clientId;
}
public void setClientId(final String clientID)
@@ -66,7 +66,7 @@ public class ConnectionFactoryProperties
_log.trace("setClientID(" + clientID + ")");
}
_hasBeenUpdated = true;
- this._clientID = clientID;
+ this._clientId = clientID;
}
public boolean isHasBeenUpdated()
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/QpidRAConnectionRequestInfo.java b/java/jca/src/main/java/org/apache/qpid/ra/QpidRAConnectionRequestInfo.java
index c37a264ebc..779709839a 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/QpidRAConnectionRequestInfo.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/QpidRAConnectionRequestInfo.java
@@ -45,7 +45,7 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
private String _password;
/** The client id */
- private String _clientID;
+ private String _clientId;
/** The type */
private final int _type;
@@ -76,13 +76,13 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
final ConnectionURL connectionURL = ra.getDefaultAMQConnectionFactory().getConnectionURL() ;
_userName = connectionURL.getUsername();
_password = connectionURL.getPassword();
- _clientID = connectionURL.getClientName();
+ _clientId = connectionURL.getClientName();
}
else
{
- _userName = ra.getDefaultUserName();
- _password = ra.getDefaultPassword();
- _clientID = ra.getClientId();
+ _userName = ra.getUserName();
+ _password = ra.getPassword();
+ _clientId = ra.getClientId();
}
this._type = type;
_transacted = true;
@@ -142,9 +142,9 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
{
_password = connectionURL.getPassword();
}
- if (_clientID == null)
+ if (_clientId == null)
{
- _clientID = connectionURL.getClientName();
+ _clientId = connectionURL.getClientName();
}
}
@@ -170,15 +170,15 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
{
if (_userName == null)
{
- _userName = ra.getDefaultUserName();
+ _userName = ra.getUserName();
}
if (_password == null)
{
- _password = ra.getDefaultPassword();
+ _password = ra.getPassword();
}
- if (_clientID == null)
+ if (_clientId == null)
{
- _clientID = ra.getClientId();
+ _clientId = ra.getClientId();
}
}
}
@@ -243,28 +243,28 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
* Get the client id
* @return The value
*/
- public String getClientID()
+ public String getClientId()
{
if (_log.isTraceEnabled())
{
_log.trace("getClientID()");
}
- return _clientID;
+ return _clientId;
}
/**
* Set the client id
* @param clientID The value
*/
- public void setClientID(final String clientID)
+ public void setClientId(final String clientID)
{
if (_log.isTraceEnabled())
{
_log.trace("setClientID(" + clientID + ")");
}
- this._clientID = clientID;
+ this._clientId = clientID;
}
/**
@@ -321,7 +321,7 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
{
QpidRAConnectionRequestInfo you = (QpidRAConnectionRequestInfo)obj;
return Util.compare(_userName, you.getUserName()) && Util.compare(_password, you.getPassword()) &&
- Util.compare(_clientID, you.getClientID()) &&
+ Util.compare(_clientId, you.getClientId()) &&
_type == you.getType() &&
_transacted == you.isTransacted() &&
_acknowledgeMode == you.getAcknowledgeMode();
@@ -343,7 +343,7 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
hash += 31 * hash + (_userName != null ? _userName.hashCode() : 0);
hash += 31 * hash + (_password != null ? _password.hashCode() : 0);
- hash += 31 * hash + (_clientID != null ? _clientID.hashCode() : 0);
+ hash += 31 * hash + (_clientId != null ? _clientId.hashCode() : 0);
hash += 31 * hash + _type;
hash += 31 * hash + (_transacted ? 1 : 0);
hash += 31 * hash + _acknowledgeMode;
@@ -356,6 +356,6 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
{
return "QpidRAConnectionRequestInfo[type=" + _type +
", transacted=" + _transacted + ", acknowledgeMode=" + _acknowledgeMode +
- ", clientID=" + _clientID + ", userName=" + _userName + ((_password != null) ? ", password=********]" :"]");
+ ", clientID=" + _clientId + ", userName=" + _userName + ((_password != null) ? ", password=********]" :"]");
}
}
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnection.java b/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnection.java
index 53896d8872..eccf77aff2 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnection.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnection.java
@@ -34,10 +34,11 @@ import java.util.concurrent.locks.ReentrantLock;
import javax.jms.Connection;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
+import javax.jms.QueueConnection;
import javax.jms.ResourceAllocationException;
import javax.jms.Session;
-import javax.jms.QueueConnection;
import javax.jms.TopicConnection;
+import javax.jms.XAConnection;
import javax.jms.XAQueueConnection;
import javax.jms.XASession;
import javax.jms.XATopicConnection;
@@ -260,7 +261,20 @@ public class QpidRAManagedConnection implements ManagedConnection, ExceptionList
}
catch (JMSException e)
{
- _log.debug("Error closing session " + this, e);
+ _log.debug("Error closing XASession " + this, e);
+ }
+
+ try
+ {
+ if(_session != null)
+ {
+ _session.close();
+ }
+
+ }
+ catch(JMSException e)
+ {
+ _log.error("Error closing Session " + this, e);
}
if (_connection != null)
@@ -585,7 +599,7 @@ public class QpidRAManagedConnection implements ManagedConnection, ExceptionList
*/
protected Session getSession() throws JMSException
{
- if(_xaSession != null && !_mcf.getUseLocalTx())
+ if(_xaSession != null && !_mcf.getUseLocalTx() && _inManagedTx)
{
if (_log.isTraceEnabled())
{
@@ -761,107 +775,44 @@ public class QpidRAManagedConnection implements ManagedConnection, ExceptionList
{
if (_userName != null && _password != null)
{
- if(!transacted)
- {
- _connection = _mcf.getCleanAMQConnectionFactory().createXATopicConnection(_userName, _password);
- }
- else
- {
- _connection = _mcf.getCleanAMQConnectionFactory().createTopicConnection(_userName, _password);
- }
+ _connection = _mcf.getCleanAMQConnectionFactory().createXATopicConnection(_userName, _password);
}
else
{
- if(!transacted)
- {
- _connection = _mcf.getDefaultAMQConnectionFactory().createXATopicConnection();
- }
- else
- {
- _connection = _mcf.getDefaultAMQConnectionFactory().createTopicConnection();
- }
+ _connection = _mcf.getDefaultAMQConnectionFactory().createXATopicConnection();
}
- if(!transacted)
- {
- _xaSession = ((XATopicConnection)_connection).createXATopicSession();
- }
- else
- {
- _session = ((TopicConnection)_connection).createTopicSession(transacted, acknowledgeMode);
- }
+ _xaSession = ((XATopicConnection)_connection).createXATopicSession();
+ _session = ((TopicConnection)_connection).createTopicSession(transacted, acknowledgeMode);
+
}
else if (_cri.getType() == QpidRAConnectionFactory.QUEUE_CONNECTION)
{
if (_userName != null && _password != null)
{
- if(!transacted)
- {
- _connection = _mcf.getCleanAMQConnectionFactory().createXAQueueConnection(_userName, _password);
- }
- else
- {
- _connection = _mcf.getCleanAMQConnectionFactory().createQueueConnection(_userName, _password);
- }
+ _connection = _mcf.getCleanAMQConnectionFactory().createXAQueueConnection(_userName, _password);
}
else
{
- if(!transacted)
- {
- _connection = _mcf.getDefaultAMQConnectionFactory().createXAQueueConnection();
- }
- else
- {
- _connection = _mcf.getDefaultAMQConnectionFactory().createQueueConnection();
- }
+ _connection = _mcf.getDefaultAMQConnectionFactory().createXAQueueConnection();
}
- if(!transacted)
- {
- _xaSession = ((XAQueueConnection)_connection).createXAQueueSession();
+ _xaSession = ((XAQueueConnection)_connection).createXAQueueSession();
+ _session = ((QueueConnection)_connection).createQueueSession(transacted, acknowledgeMode);
- }
- else
- {
- _session = ((QueueConnection)_connection).createQueueSession(transacted, acknowledgeMode);
-
- }
}
else
{
if (_userName != null && _password != null)
{
- if(!transacted)
- {
- _connection = _mcf.getCleanAMQConnectionFactory().createXAConnection(_userName, _password);
- }
- else
- {
- _connection = _mcf.getCleanAMQConnectionFactory().createConnection(_userName, _password);
- }
- }
- else
- {
- if(!transacted)
- {
- _connection = _mcf.getDefaultAMQConnectionFactory().createXAConnection();
- }
- else
- {
- _connection = _mcf.getDefaultAMQConnectionFactory().createConnection();
- }
- }
-
- if(!transacted)
- {
- _xaSession = ((XAQueueConnection)_connection).createXASession();
-
+ _connection = _mcf.getCleanAMQConnectionFactory().createXAConnection(_userName, _password);
}
else
{
- _session = ((QueueConnection)_connection).createSession(transacted, acknowledgeMode);
-
+ _connection = _mcf.getDefaultAMQConnectionFactory().createXAConnection();
}
+ _xaSession = ((XAConnection)_connection).createXASession();
+ _session = _connection.createSession(transacted, acknowledgeMode);
}
_connection.setExceptionListener(this);
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java b/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java
index 318485a7f2..8744a9deec 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java
@@ -365,12 +365,12 @@ public class QpidRAManagedConnectionFactory implements ManagedConnectionFactory,
_mcfProperties.setSessionDefaultType(type);
}
- public String getClientID()
+ public String getClientId()
{
return _mcfProperties.getClientId();
}
- public void setClientID(final String clientID)
+ public void setClientId(final String clientID)
{
_mcfProperties.setClientId(clientID);
}
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/QpidRAProperties.java b/java/jca/src/main/java/org/apache/qpid/ra/QpidRAProperties.java
index 21f7d2574f..69320575b0 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/QpidRAProperties.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/QpidRAProperties.java
@@ -31,10 +31,8 @@ import org.slf4j.LoggerFactory;
*/
public class QpidRAProperties extends ConnectionFactoryProperties implements Serializable
{
- /** Serial version UID */
private static final long serialVersionUID = -4823893873707374791L;
- /** The logger */
private static final Logger _log = LoggerFactory.getLogger(QpidRAProperties.class);
private static final int DEFAULT_SETUP_ATTEMPTS = 10;
@@ -45,16 +43,14 @@ public class QpidRAProperties extends ConnectionFactoryProperties implements Ser
private long _setupInterval = DEFAULT_SETUP_INTERVAL;
- /** Use Local TX instead of XA */
- private Boolean _localTx = false;
-
/** Class used to locate the Transaction Manager. */
private String _transactionManagerLocatorClass ;
/** Method used to locate the TM */
private String _transactionManagerLocatorMethod ;
-
+ private boolean _useConnectionPerHandler = true;
+
/**
* Constructor
*/
@@ -66,34 +62,6 @@ public class QpidRAProperties extends ConnectionFactoryProperties implements Ser
}
}
- /**
- * Get the use XA flag
- * @return The value
- */
- public Boolean getUseLocalTx()
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("getUseLocalTx()");
- }
-
- return _localTx;
- }
-
- /**
- * Set the use XA flag
- * @param localTx The value
- */
- public void setUseLocalTx(final Boolean localTx)
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("setUseLocalTx(" + localTx + ")");
- }
-
- this._localTx = localTx;
- }
-
public void setTransactionManagerLocatorClass(final String transactionManagerLocatorClass)
{
if (_log.isTraceEnabled())
@@ -174,10 +142,20 @@ public class QpidRAProperties extends ConnectionFactoryProperties implements Ser
this._setupInterval = setupInterval;
}
+ public boolean isUseConnectionPerHandler()
+ {
+ return _useConnectionPerHandler;
+ }
+
+ public void setUseConnectionPerHandler(boolean connectionPerHandler)
+ {
+ this._useConnectionPerHandler = connectionPerHandler;
+ }
+
@Override
public String toString()
{
- return "QpidRAProperties[localTx=" + _localTx +
+ return "QpidRAProperties[" +
", transactionManagerLocatorClass=" + _transactionManagerLocatorClass +
", transactionManagerLocatorMethod=" + _transactionManagerLocatorMethod +
", setupAttempts=" + _setupAttempts +
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/QpidRASession.java b/java/jca/src/main/java/org/apache/qpid/ra/QpidRASession.java
index 081677ca4b..a72f51da51 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/QpidRASession.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/QpidRASession.java
@@ -30,4 +30,6 @@ public interface QpidRASession
public void start() throws JMSException;
public void close() throws JMSException;
+
+ public void closeSession() throws JMSException;
}
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactory.java b/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactory.java
index cf28d5bba1..2747282a3c 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactory.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactory.java
@@ -58,5 +58,5 @@ public interface QpidRASessionFactory extends Connection, TopicConnection, Queue
* @param session The session
* @throws JMSException for any error
*/
- void closeSession(QpidRASessionImpl session) throws JMSException;
+ void closeSession(QpidRASession session) throws JMSException;
}
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactoryImpl.java b/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactoryImpl.java
index e2bc2d2008..f3253e1400 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactoryImpl.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactoryImpl.java
@@ -567,7 +567,7 @@ public class QpidRASessionFactoryImpl implements QpidRASessionFactory, Reference
_started = true;
for (Iterator<QpidRASession> i = _sessions.iterator(); i.hasNext();)
{
- QpidRASessionImpl session = (QpidRASessionImpl)i.next();
+ QpidRASession session = (QpidRASession)i.next();
session.start();
}
}
@@ -609,7 +609,7 @@ public class QpidRASessionFactoryImpl implements QpidRASessionFactory, Reference
{
for (Iterator<QpidRASession> i = _sessions.iterator(); i.hasNext();)
{
- QpidRASessionImpl session = (QpidRASessionImpl)i.next();
+ QpidRASession session = (QpidRASession)i.next();
try
{
session.closeSession();
@@ -670,7 +670,7 @@ public class QpidRASessionFactoryImpl implements QpidRASessionFactory, Reference
* @param session The session
* @exception JMSException Thrown if an error occurs
*/
- public void closeSession(final QpidRASessionImpl session) throws JMSException
+ public void closeSession(final QpidRASession session) throws JMSException
{
if (_log.isTraceEnabled())
{
@@ -679,7 +679,7 @@ public class QpidRASessionFactoryImpl implements QpidRASessionFactory, Reference
synchronized (_sessions)
{
- _sessions.remove(session);
+ _sessions.clear();
}
}
@@ -742,7 +742,7 @@ public class QpidRASessionFactoryImpl implements QpidRASessionFactory, Reference
QpidRAConnectionRequestInfo info = new QpidRAConnectionRequestInfo(sessionType);
info.setUserName(_userName);
info.setPassword(_password);
- info.setClientID(_clientID);
+ info.setClientId(_clientID);
info.setDefaults(_mcf.getDefaultAMQConnectionFactory().getConnectionURL());
if (_log.isTraceEnabled())
@@ -839,7 +839,7 @@ public class QpidRASessionFactoryImpl implements QpidRASessionFactory, Reference
sessionType);
info.setUserName(_userName);
info.setPassword(_password);
- info.setClientID(_clientID);
+ info.setClientId(_clientID);
info.setDefaults(_mcf.getDefaultAMQConnectionFactory().getConnectionURL());
if (_log.isTraceEnabled())
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionImpl.java b/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionImpl.java
index fdd4888a3d..c4cfeaba48 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionImpl.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionImpl.java
@@ -1446,7 +1446,7 @@ public class QpidRASessionImpl implements Session, QueueSession, TopicSession, X
* Close session
* @exception JMSException Thrown if an error occurs
*/
- void closeSession() throws JMSException
+ public void closeSession() throws JMSException
{
final QpidRAManagedConnection mc = this._mc;
if (mc != null)
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/QpidResourceAdapter.java b/java/jca/src/main/java/org/apache/qpid/ra/QpidResourceAdapter.java
index 363af1bbcd..96fa83ceef 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/QpidResourceAdapter.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/QpidResourceAdapter.java
@@ -38,8 +38,6 @@ import javax.resource.spi.work.WorkManager;
import javax.transaction.TransactionManager;
import javax.transaction.xa.XAResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.apache.qpid.client.AMQConnection;
import org.apache.qpid.client.AMQConnectionFactory;
import org.apache.qpid.client.AMQConnectionURL;
@@ -47,6 +45,8 @@ import org.apache.qpid.client.XAConnectionImpl;
import org.apache.qpid.ra.inflow.QpidActivation;
import org.apache.qpid.ra.inflow.QpidActivationSpec;
import org.apache.qpid.url.URLSyntaxException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* The resource adapter for Qpid
@@ -54,43 +54,22 @@ import org.apache.qpid.url.URLSyntaxException;
*/
public class QpidResourceAdapter implements ResourceAdapter, Serializable
{
- /**
- *
- */
private static final long serialVersionUID = -2446231446818098726L;
- /**
- * The logger
- */
- private static final Logger _log = LoggerFactory.getLogger(QpidResourceAdapter.class);
+ private static final transient Logger _log = LoggerFactory.getLogger(QpidResourceAdapter.class);
- /**
- * The bootstrap context
- */
private BootstrapContext _ctx;
- /**
- * The resource adapter properties
- */
private final QpidRAProperties _raProperties;
- /**
- * Have the factory been configured
- */
private final AtomicBoolean _configured;
- /**
- * The activations by activation spec
- */
private final Map<ActivationSpec, QpidActivation> _activations;
private AMQConnectionFactory _defaultAMQConnectionFactory;
private TransactionManager _tm;
- /**
- * Constructor
- */
public QpidResourceAdapter()
{
if (_log.isTraceEnabled())
@@ -223,65 +202,6 @@ public class QpidResourceAdapter implements ResourceAdapter, Serializable
_log.info("Qpid resource adapter stopped");
}
- /**
- * Get the user name
- *
- * @return The value
- */
- public String getDefaultUserName()
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("getUserName()");
- }
-
- return _raProperties.getUserName();
- }
-
- /**
- * Set the user name
- *
- * @param userName The value
- */
- public void setDefaultUserName(final String userName)
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("setUserName(" + userName + ")");
- }
-
- _raProperties.setUserName(userName);
- }
-
- /**
- * Get the password
- *
- * @return The value
- */
- public String getDefaultPassword()
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("getPassword()");
- }
-
- return _raProperties.getPassword();
- }
-
- /**
- * Set the password
- *
- * @param password The value
- */
- public void setDefaultPassword(final String password)
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("setPassword(****)");
- }
-
- _raProperties.setPassword(password);
- }
/**
* Get the client ID
@@ -403,6 +323,26 @@ public class QpidResourceAdapter implements ResourceAdapter, Serializable
_raProperties.setPath(path);
}
+ public String getUserName()
+ {
+ return _raProperties.getUserName();
+ }
+
+ public void setUserName(String userName)
+ {
+ _raProperties.setUserName(userName);
+ }
+
+ public String getPassword()
+ {
+ return _raProperties.getPassword();
+ }
+
+ public void setPassword(String password)
+ {
+ _raProperties.setPassword(password);
+ }
+
/**
* Get the connection url
*
@@ -493,14 +433,14 @@ public class QpidResourceAdapter implements ResourceAdapter, Serializable
*
* @return The value
*/
- public Boolean getUseLocalTx()
+ public Boolean isUseLocalTx()
{
if (_log.isTraceEnabled())
{
_log.trace("getUseLocalTx()");
}
- return _raProperties.getUseLocalTx();
+ return _raProperties.isUseLocalTx();
}
/**
@@ -553,7 +493,27 @@ public class QpidResourceAdapter implements ResourceAdapter, Serializable
}
_raProperties.setSetupInterval(interval);
}
+
+ public Boolean isUseConnectionPerHandler()
+ {
+ if (_log.isTraceEnabled())
+ {
+ _log.trace("isConnectionPerHandler()");
+ }
+
+ return _raProperties.isUseConnectionPerHandler();
+ }
+ public void setUseConnectionPerHandler(Boolean connectionPerHandler)
+ {
+ if (_log.isTraceEnabled())
+ {
+ _log.trace("setConnectionPerHandler(" + connectionPerHandler + ")");
+ }
+
+ _raProperties.setUseConnectionPerHandler(connectionPerHandler);
+ }
+
/**
* Indicates whether some other object is "equal to" this one.
*
@@ -720,9 +680,10 @@ public class QpidResourceAdapter implements ResourceAdapter, Serializable
return map;
}
- private void locateTM()
+ private void locateTM() throws ResourceAdapterInternalException
{
- if(_raProperties.getTransactionManagerLocatorClass() != null && _raProperties.getTransactionManagerLocatorMethod() != null)
+ if(_raProperties.getTransactionManagerLocatorClass() != null
+ && _raProperties.getTransactionManagerLocatorMethod() != null)
{
String locatorClasses[] = _raProperties.getTransactionManagerLocatorClass().split(";");
@@ -742,8 +703,8 @@ public class QpidResourceAdapter implements ResourceAdapter, Serializable
if (_tm == null)
{
- _log.warn("It wasn't possible to lookup a Transaction Manager through the configured properties TransactionManagerLocatorClass and TransactionManagerLocatorMethod");
- _log.warn("Qpid Resource Adapter won't be able to set and verify transaction timeouts in certain cases.");
+ _log.error("It was not possible to locate javax.transaction.TransactionManager via the RA properties TransactionManagerLocatorClass and TransactionManagerLocatorMethod");
+ throw new ResourceAdapterInternalException("Could not locate javax.transaction.TransactionManager");
}
else
{
@@ -802,6 +763,7 @@ public class QpidResourceAdapter implements ResourceAdapter, Serializable
final String client = (clientID != null ? clientID : "") ;
final String newurl = AMQConnectionURL.AMQ_PROTOCOL + "://" + username +":" + password + "@" + client + "/" + path + '?' + AMQConnectionURL.OPTIONS_BROKERLIST + "='tcp://" + host + ':' + port + '\'' ;
+
if (_log.isDebugEnabled())
{
_log.debug("Initialising connectionURL to " + newurl) ;
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/admin/QpidConnectionFactoryProxy.java b/java/jca/src/main/java/org/apache/qpid/ra/admin/QpidConnectionFactoryProxy.java
index 41242fefae..a948948d6a 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/admin/QpidConnectionFactoryProxy.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/admin/QpidConnectionFactoryProxy.java
@@ -77,17 +77,17 @@ public class QpidConnectionFactoryProxy implements Externalizable, Referenceable
public void writeExternal(ObjectOutput out) throws IOException
{
- if (_delegate == null)
- {
- _log.error("Null Destination ");
- throw new IOException("Null ConnectionFactory!");
- }
try
{
+ if(_delegate == null)
+ {
+ getReference();
+ }
+
out.writeObject(((Referenceable) _delegate).getReference());
}
- catch (NamingException e)
+ catch (Exception e)
{
_log.error("Failed to dereference ConnectionFactory " + e.getMessage(), e);
throw new IOException("Failed to dereference ConnectionFactory: " + e.getMessage());
@@ -137,7 +137,20 @@ public class QpidConnectionFactoryProxy implements Externalizable, Referenceable
*/
public Connection createConnection() throws JMSException
{
- return _delegate.createConnection();
+ try
+ {
+ if(_delegate == null)
+ {
+ getReference();
+ }
+
+ return _delegate.createConnection();
+ }
+ catch(Exception e)
+ {
+ throw new JMSException(e.getMessage());
+ }
+
}
/**
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/admin/QpidQueueImpl.java b/java/jca/src/main/java/org/apache/qpid/ra/admin/QpidQueueImpl.java
index 417849fc5c..162099d1ee 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/admin/QpidQueueImpl.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/admin/QpidQueueImpl.java
@@ -21,25 +21,15 @@
package org.apache.qpid.ra.admin;
import java.io.Externalizable;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
-import java.io.ObjectInputStream;
import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-import java.util.Hashtable;
-import javax.naming.Context;
-import javax.naming.Name;
import javax.naming.NamingException;
-import javax.naming.RefAddr;
import javax.naming.Reference;
import javax.naming.StringRefAddr;
-import javax.naming.spi.ObjectFactory;
import org.apache.qpid.client.AMQQueue;
-import org.apache.qpid.ra.admin.AdminObjectFactory;
public class QpidQueueImpl extends AMQQueue implements QpidQueue, Externalizable
{
@@ -101,19 +91,4 @@ public class QpidQueueImpl extends AMQQueue implements QpidQueue, Externalizable
out.writeObject(this._url);
}
- //TODO move to tests
- public static void main(String[] args) throws Exception
- {
- QpidQueueImpl q = new QpidQueueImpl();
- q.setDestinationAddress("hello.Queue;{create:always, node:{type:queue, x-declare:{auto-delete:true}}}");
- ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("queue.out"));
- os.writeObject(q);
- os.close();
-
-
- ObjectInputStream is = new ObjectInputStream(new FileInputStream("queue.out"));
- q = (QpidQueueImpl)is.readObject();
- System.out.println(q);
-
- }
}
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidActivation.java b/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidActivation.java
index 57edec8eee..2327512a62 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidActivation.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidActivation.java
@@ -20,114 +20,28 @@
*/
package org.apache.qpid.ra.inflow;
-import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.ExceptionListener;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageListener;
-import javax.jms.Queue;
-import javax.jms.Session;
-import javax.jms.Topic;
-import javax.naming.Context;
-import javax.naming.InitialContext;
import javax.resource.ResourceException;
import javax.resource.spi.endpoint.MessageEndpointFactory;
import javax.resource.spi.work.Work;
-import javax.resource.spi.work.WorkManager;
+import org.apache.qpid.ra.QpidResourceAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.qpid.AMQException;
-import org.apache.qpid.client.AMQConnection;
-import org.apache.qpid.client.AMQConnectionFactory;
-import org.apache.qpid.client.AMQDestination;
-import org.apache.qpid.client.XAConnectionImpl;
-import org.apache.qpid.protocol.AMQConstant;
-import org.apache.qpid.ra.QpidResourceAdapter;
-import org.apache.qpid.ra.Util;
-
/**
* The activation.
*
*/
-public class QpidActivation implements ExceptionListener
+public class QpidActivation extends QpidExceptionHandler
{
- /**
- * The logger
- */
private static final Logger _log = LoggerFactory.getLogger(QpidActivation.class);
- /**
- * The onMessage method
- */
- public static final Method ONMESSAGE;
-
- /**
- * The resource adapter
- */
- private final QpidResourceAdapter _ra;
-
- /**
- * The activation spec
- */
- private final QpidActivationSpec _spec;
-
- /**
- * The message endpoint factory
- */
- private final MessageEndpointFactory _endpointFactory;
-
- /**
- * Whether delivery is active
- */
- private final AtomicBoolean _deliveryActive = new AtomicBoolean(false);
-
- /**
- * The destination type
- */
- private boolean _isTopic = false;
-
- /**
- * Is the delivery transacted
- */
- private boolean _isDeliveryTransacted;
-
- private Destination _destination;
-
- /**
- * The connection
- */
- private Connection _connection;
-
private final List<QpidMessageHandler> _handlers = new ArrayList<QpidMessageHandler>();
- private AMQConnectionFactory _factory;
-
- // Whether we are in the failure recovery loop
- private AtomicBoolean _inFailure = new AtomicBoolean(false);
-
- //Whether or not we have completed activating
- private AtomicBoolean _activated = new AtomicBoolean(false);
-
- static
- {
- try
- {
- ONMESSAGE = MessageListener.class.getMethod("onMessage", new Class[] { Message.class });
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
+
/**
* Constructor
*
@@ -140,97 +54,8 @@ public class QpidActivation implements ExceptionListener
final MessageEndpointFactory endpointFactory,
final QpidActivationSpec spec) throws ResourceException
{
- if (_log.isTraceEnabled())
- {
- _log.trace("constructor(" + ra + ", " + endpointFactory + ", " + spec + ")");
- }
-
- this._ra = ra;
- this._endpointFactory = endpointFactory;
- this._spec = spec;
- try
- {
- _isDeliveryTransacted = endpointFactory.isDeliveryTransacted(QpidActivation.ONMESSAGE);
- }
- catch (Exception e)
- {
- throw new ResourceException(e);
- }
- }
-
- /**
- * Get the activation spec
- *
- * @return The value
- */
- public QpidActivationSpec getActivationSpec()
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("getActivationSpec()");
- }
-
- return _spec;
- }
-
- /**
- * Get the message endpoint factory
- *
- * @return The value
- */
- public MessageEndpointFactory getMessageEndpointFactory()
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("getMessageEndpointFactory()");
- }
-
- return _endpointFactory;
- }
-
- /**
- * Get whether delivery is transacted
- *
- * @return The value
- */
- public boolean isDeliveryTransacted()
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("isDeliveryTransacted()");
- }
-
- return _isDeliveryTransacted;
- }
-
- /**
- * Get the work manager
- *
- * @return The value
- */
- public WorkManager getWorkManager()
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("getWorkManager()");
- }
-
- return _ra.getWorkManager();
- }
-
- /**
- * Is the destination a topic
- *
- * @return The value
- */
- public boolean isTopic()
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("isTopic()");
- }
-
- return _isTopic;
+ super(ra, spec, endpointFactory);
+
}
/**
@@ -267,70 +92,62 @@ public class QpidActivation implements ExceptionListener
*
* @throws Exception Thrown if an error occurs
*/
- protected synchronized void setup() throws Exception
+ public synchronized void setup() throws Exception
{
_log.debug("Setting up " + _spec);
- setupCF();
-
+ setupCF();
setupDestination();
- final AMQConnection amqConnection ;
- final boolean useLocalTx = _spec.isUseLocalTx() ;
- final boolean isXA = _isDeliveryTransacted && !useLocalTx ;
-
- if (isXA)
+
+ if(!_spec.isUseConnectionPerHandler())
{
- amqConnection = (XAConnectionImpl)_factory.createXAConnection() ;
+ setupConnection();
+ _connection.setExceptionListener(this);
}
- else
- {
- amqConnection = (AMQConnection)_factory.createConnection() ;
- }
-
- amqConnection.setExceptionListener(this) ;
-
+
for (int i = 0; i < _spec.getMaxSession(); i++)
{
- Session session = null;
-
- try
- {
- if (isXA)
- {
- session = _ra.createXASession((XAConnectionImpl)amqConnection) ;
- }
- else
- {
- session = _ra.createSession((AMQConnection)amqConnection,
- _spec.getAcknowledgeModeInt(),
- useLocalTx,
- _spec.getPrefetchLow(),
- _spec.getPrefetchHigh());
- }
-
- _log.debug("Using session " + Util.asString(session));
- QpidMessageHandler handler = new QpidMessageHandler(this, _ra.getTM(), session);
- handler.setup();
- _handlers.add(handler);
- }
- catch (Exception e)
- {
- try
- {
- amqConnection.close() ;
- }
- catch (Exception e2)
- {
- _log.trace("Ignored error closing connection", e2);
- }
-
- throw e;
- }
+ try
+ {
+ QpidMessageHandler handler = null;
+
+ if(_spec.isUseConnectionPerHandler())
+ {
+ handler = new QpidMessageHandler(_ra, _spec, _endpointFactory, _ra.getTM());
+ }
+ else
+ {
+ handler = new QpidMessageHandler(_ra, _spec, _endpointFactory, _ra.getTM(), _connection);
+ }
+
+ handler.start();
+ _handlers.add(handler);
+ }
+ catch(Exception e)
+ {
+ try
+ {
+ if(_connection != null)
+ {
+ this._connection.close();
+ }
+ }
+ catch (Exception e2)
+ {
+ _log.trace("Ignored error closing connection", e2);
+ }
+
+ throw e;
+
+ }
+
+ }
+
+ if(!_spec.isUseConnectionPerHandler())
+ {
+ this._connection.start();
+ _activated.set(true);
}
- amqConnection.start() ;
- this._connection = amqConnection ;
- _activated.set(true);
-
_log.debug("Setup complete " + this);
}
@@ -340,136 +157,17 @@ public class QpidActivation implements ExceptionListener
protected synchronized void teardown()
{
_log.debug("Tearing down " + _spec);
-
- try
- {
- if (_connection != null)
- {
- _connection.stop();
- }
- }
- catch (Throwable t)
- {
- _log.debug("Error stopping connection " + Util.asString(_connection), t);
- }
+
+ super.teardown();
for (QpidMessageHandler handler : _handlers)
{
- handler.teardown();
+ handler.stop();
}
- try
- {
- if (_connection != null)
- {
- _connection.close();
- }
- }
- catch (Throwable t)
- {
- _log.debug("Error closing connection " + Util.asString(_connection), t);
- }
- if (_spec.isHasBeenUpdated())
- {
- _factory = null;
- }
_log.debug("Tearing down complete " + this);
}
- protected void setupCF() throws Exception
- {
- if (_spec.isHasBeenUpdated())
- {
- _factory = _ra.createAMQConnectionFactory(_spec);
- }
- else
- {
- _factory = _ra.getDefaultAMQConnectionFactory();
- }
- }
-
- public Destination getDestination()
- {
- return _destination;
- }
-
- protected void setupDestination() throws Exception
- {
-
- String destinationName = _spec.getDestination();
- String destinationTypeString = _spec.getDestinationType();
-
- if (_spec.isUseJNDI())
- {
- Context ctx = new InitialContext();
- _log.debug("Using context " + ctx.getEnvironment() + " for " + _spec);
- if (_log.isTraceEnabled())
- {
- _log.trace("setupDestination(" + ctx + ")");
- }
-
- if (destinationTypeString != null && !destinationTypeString.trim().equals(""))
- {
- _log.debug("Destination type defined as " + destinationTypeString);
-
- Class<? extends Destination> destinationType;
- if (Topic.class.getName().equals(destinationTypeString))
- {
- destinationType = Topic.class;
- _isTopic = true;
- }
- else
- {
- destinationType = Queue.class;
- }
-
- _log.debug("Retrieving destination " + destinationName +
- " of type " +
- destinationType.getName());
- _destination = Util.lookup(ctx, destinationName, destinationType);
-
- }
- else
- {
- _log.debug("Destination type not defined");
- _log.debug("Retrieving destination " + destinationName +
- " of type " +
- Destination.class.getName());
-
- _destination = Util.lookup(ctx, destinationName, AMQDestination.class);
- _isTopic = !(_destination instanceof Queue) ;
- }
- }
- else
- {
- _destination = (AMQDestination)AMQDestination.createDestination(_spec.getDestination());
- if (destinationTypeString != null && !destinationTypeString.trim().equals(""))
- {
- _log.debug("Destination type defined as " + destinationTypeString);
- final boolean match ;
- if (Topic.class.getName().equals(destinationTypeString))
- {
- match = (_destination instanceof Topic) ;
- _isTopic = true;
- }
- else
- {
- match = (_destination instanceof Queue) ;
- }
- if (!match)
- {
- throw new ClassCastException("Expected destination of type " + destinationTypeString + " but created destination " + _destination) ;
- }
- }
- else
- {
- _isTopic = !(_destination instanceof Queue) ;
- }
- }
-
- _log.debug("Got destination " + _destination + " from " + destinationName);
- }
-
/**
* Get a string representation
*
@@ -492,94 +190,7 @@ public class QpidActivation implements ExceptionListener
return buffer.toString();
}
- public void onException(final JMSException jmse)
- {
- if(_activated.get())
- {
- handleFailure(jmse) ;
- }
- else
- {
- _log.warn("Received JMSException: " + jmse + " while endpoint was not activated.");
- }
- }
-
- /**
- * Handles any failure by trying to reconnect
- *
- * @param failure the reason for the failure
- */
- public void handleFailure(Throwable failure)
- {
- if(doesNotExist(failure))
- {
- _log.info("awaiting topic/queue creation " + getActivationSpec().getDestination());
- }
- else
- {
- _log.warn("Failure in Qpid activation " + _spec, failure);
- }
- int reconnectCount = 0;
- int setupAttempts = _spec.getSetupAttempts();
- long setupInterval = _spec.getSetupInterval();
-
- // Only enter the failure loop once
- if (_inFailure.getAndSet(true))
- return;
- try
- {
- while (_deliveryActive.get() && (setupAttempts == -1 || reconnectCount < setupAttempts))
- {
- teardown();
-
- try
- {
- Thread.sleep(setupInterval);
- }
- catch (InterruptedException e)
- {
- _log.debug("Interrupted trying to reconnect " + _spec, e);
- break;
- }
-
- _log.info("Attempting to reconnect " + _spec);
- try
- {
- setup();
- _log.info("Reconnected with Qpid");
- break;
- }
- catch (Throwable t)
- {
- if(doesNotExist(failure))
- {
- _log.info("awaiting topic/queue creation " + getActivationSpec().getDestination());
- }
- else
- {
- _log.error("Unable to reconnect " + _spec, t);
- }
- }
- ++reconnectCount;
- }
- }
- finally
- {
- // Leaving failure recovery loop
- _inFailure.set(false);
- }
- }
-
- /**
- * Check to see if the failure represents a missing endpoint
- * @param failure The failure.
- * @return true if it represents a missing endpoint, false otherwise
- */
- private boolean doesNotExist(final Throwable failure)
- {
- return (failure instanceof AMQException) && (((AMQException)failure).getErrorCode() == AMQConstant.NOT_FOUND) ;
- }
-
+
/**
* Handles the setup
*/
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidActivationSpec.java b/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidActivationSpec.java
index 5f4e2dcf6b..3d9a88adb5 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidActivationSpec.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidActivationSpec.java
@@ -28,10 +28,10 @@ import javax.resource.spi.ActivationSpec;
import javax.resource.spi.InvalidPropertyException;
import javax.resource.spi.ResourceAdapter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.apache.qpid.ra.ConnectionFactoryProperties;
import org.apache.qpid.ra.QpidResourceAdapter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* The activation spec
@@ -88,6 +88,8 @@ public class QpidActivationSpec extends ConnectionFactoryProperties implements A
// undefined by default, default is specified at the RA level in QpidRAProperties
private Long _setupInterval;
+ private Boolean _useConnectionPerHandler;
+
/**
* Constructor
*/
@@ -544,6 +546,16 @@ public class QpidActivationSpec extends ConnectionFactoryProperties implements A
this._setupInterval = setupInterval;
}
+ public Boolean isUseConnectionPerHandler()
+ {
+ return (_useConnectionPerHandler == null) ? _ra.isUseConnectionPerHandler() : _useConnectionPerHandler;
+ }
+
+ public void setUseConnectionPerHandler(Boolean connectionPerHandler)
+ {
+ this._useConnectionPerHandler = connectionPerHandler;
+ }
+
/**
* Validate
* @exception InvalidPropertyException Thrown if a validation exception occurs
@@ -561,6 +573,7 @@ public class QpidActivationSpec extends ConnectionFactoryProperties implements A
}
}
+
/**
* Get a string representation
* @return The value
@@ -573,23 +586,30 @@ public class QpidActivationSpec extends ConnectionFactoryProperties implements A
buffer.append("ra=").append(_ra);
buffer.append(" destination=").append(_destination);
buffer.append(" destinationType=").append(_destinationType);
+
if (_messageSelector != null)
{
buffer.append(" selector=").append(_messageSelector);
}
+
buffer.append(" ack=").append(getAcknowledgeMode());
buffer.append(" durable=").append(_subscriptionDurability);
buffer.append(" clientID=").append(getClientId());
+
if (_subscriptionName != null)
{
buffer.append(" subscription=").append(_subscriptionName);
}
+
buffer.append(" user=").append(getUserName());
+
if (getPassword() != null)
{
- buffer.append(" password=").append("****");
+ buffer.append(" password=").append("********");
}
+
buffer.append(" maxSession=").append(_maxSession);
+
if (_prefetchLow != null)
{
buffer.append(" prefetchLow=").append(_prefetchLow);
@@ -598,7 +618,10 @@ public class QpidActivationSpec extends ConnectionFactoryProperties implements A
{
buffer.append(" prefetchHigh=").append(_prefetchHigh);
}
+
+ buffer.append(" connectionPerHandler=").append(isUseConnectionPerHandler());
buffer.append(')');
+
return buffer.toString();
}
}
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidExceptionHandler.java b/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidExceptionHandler.java
new file mode 100644
index 0000000000..8775362eb5
--- /dev/null
+++ b/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidExceptionHandler.java
@@ -0,0 +1,339 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.ra.inflow;
+
+import java.lang.reflect.Method;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.ExceptionListener;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageListener;
+import javax.jms.Queue;
+import javax.jms.Topic;
+import javax.jms.XAConnectionFactory;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.resource.ResourceException;
+import javax.resource.spi.endpoint.MessageEndpointFactory;
+
+import org.apache.qpid.AMQException;
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.protocol.AMQConstant;
+import org.apache.qpid.ra.QpidResourceAdapter;
+import org.apache.qpid.ra.Util;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class QpidExceptionHandler implements ExceptionListener
+{
+ private static final Logger _log = LoggerFactory.getLogger(QpidExceptionHandler.class);
+
+ public static final Method ONMESSAGE;
+
+ protected final MessageEndpointFactory _endpointFactory;
+
+ protected Connection _connection;
+
+ protected ConnectionFactory _factory;
+
+ protected Destination _destination;
+
+ protected final QpidResourceAdapter _ra;
+
+ protected final QpidActivationSpec _spec;
+
+ protected boolean _isDeliveryTransacted;
+
+ protected final AtomicBoolean _deliveryActive = new AtomicBoolean(false);
+
+ protected boolean _isTopic = false;
+
+ // Whether we are in the failure recovery loop
+ protected AtomicBoolean _inFailure = new AtomicBoolean(false);
+
+ //Whether or not we have completed activating
+ protected AtomicBoolean _activated = new AtomicBoolean(false);
+
+ static
+ {
+ try
+ {
+ ONMESSAGE = MessageListener.class.getMethod("onMessage", new Class[] { Message.class });
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public abstract void setup() throws Exception;
+ public abstract void start() throws Exception;
+ public abstract void stop();
+
+ protected QpidExceptionHandler(QpidResourceAdapter ra,
+ QpidActivationSpec spec,
+ MessageEndpointFactory endpointFactory) throws ResourceException
+ {
+ this._ra = ra;
+ this._spec = spec;
+ this._endpointFactory = endpointFactory;
+
+ try
+ {
+ _isDeliveryTransacted = endpointFactory.isDeliveryTransacted(QpidActivation.ONMESSAGE);
+ }
+ catch (Exception e)
+ {
+ throw new ResourceException(e);
+ }
+
+
+ }
+
+ public void onException(JMSException e)
+ {
+ if(_activated.get())
+ {
+ handleFailure(e) ;
+ }
+ else
+ {
+ _log.warn("Received JMSException: " + e + " while endpoint was not activated.");
+ }
+ }
+
+ /**
+ * Handles any failure by trying to reconnect
+ *
+ * @param failure the reason for the failure
+ */
+ public void handleFailure(Throwable failure)
+ {
+ if(doesNotExist(failure))
+ {
+ _log.info("awaiting topic/queue creation " + _spec.getDestination());
+ }
+ else
+ {
+ _log.warn("Failure in Qpid activation " + _spec, failure);
+ }
+ int reconnectCount = 0;
+ int setupAttempts = _spec.getSetupAttempts();
+ long setupInterval = _spec.getSetupInterval();
+
+ // Only enter the failure loop once
+ if (_inFailure.getAndSet(true))
+ return;
+ try
+ {
+ while (_deliveryActive.get() && (setupAttempts == -1 || reconnectCount < setupAttempts))
+ {
+ teardown();
+
+ try
+ {
+ Thread.sleep(setupInterval);
+ }
+ catch (InterruptedException e)
+ {
+ _log.debug("Interrupted trying to reconnect " + _spec, e);
+ break;
+ }
+
+ _log.info("Attempting to reconnect " + _spec);
+ try
+ {
+ setup();
+ _log.info("Reconnected with Qpid");
+ break;
+ }
+ catch (Throwable t)
+ {
+ if(doesNotExist(failure))
+ {
+ _log.info("awaiting topic/queue creation " + _spec.getDestination());
+ }
+ else
+ {
+ _log.error("Unable to reconnect " + _spec, t);
+ }
+ }
+ ++reconnectCount;
+ }
+ }
+ finally
+ {
+ // Leaving failure recovery loop
+ _inFailure.set(false);
+ }
+ }
+
+ /**
+ * Check to see if the failure represents a missing endpoint
+ * @param failure The failure.
+ * @return true if it represents a missing endpoint, false otherwise
+ */
+ protected boolean doesNotExist(final Throwable failure)
+ {
+ return (failure instanceof AMQException) && (((AMQException)failure).getErrorCode() == AMQConstant.NOT_FOUND) ;
+ }
+
+ protected boolean isXA()
+ {
+ return _isDeliveryTransacted && !_spec.isUseLocalTx();
+ }
+
+ protected void setupConnection() throws Exception
+ {
+ this._connection = (isXA()) ? ((XAConnectionFactory)_factory).createXAConnection() : _factory.createConnection();
+ }
+
+ protected synchronized void teardown()
+ {
+ _log.debug("Tearing down " + _spec);
+
+ try
+ {
+ if (_connection != null)
+ {
+ _connection.stop();
+ }
+ }
+ catch (Throwable t)
+ {
+ _log.debug("Error stopping connection " + Util.asString(_connection), t);
+ }
+
+ try
+ {
+ if (_connection != null)
+ {
+ _connection.close();
+ }
+ }
+ catch (Throwable t)
+ {
+ _log.debug("Error closing connection " + Util.asString(_connection), t);
+ }
+ if (_spec.isHasBeenUpdated())
+ {
+ _factory = null;
+ }
+ _log.debug("Tearing down complete " + this);
+ }
+
+ protected void setupCF() throws Exception
+ {
+ if (_spec.isHasBeenUpdated())
+ {
+ _factory = _ra.createAMQConnectionFactory(_spec);
+ }
+ else
+ {
+ _factory = _ra.getDefaultAMQConnectionFactory();
+ }
+ }
+
+ protected void setupDestination() throws Exception
+ {
+
+ String destinationName = _spec.getDestination();
+ String destinationTypeString = _spec.getDestinationType();
+
+ if (_spec.isUseJNDI())
+ {
+ Context ctx = new InitialContext();
+ _log.debug("Using context " + ctx.getEnvironment() + " for " + _spec);
+ if (_log.isTraceEnabled())
+ {
+ _log.trace("setupDestination(" + ctx + ")");
+ }
+
+ if (destinationTypeString != null && !destinationTypeString.trim().equals(""))
+ {
+ _log.debug("Destination type defined as " + destinationTypeString);
+
+ Class<? extends Destination> destinationType;
+ if (Topic.class.getName().equals(destinationTypeString))
+ {
+ destinationType = Topic.class;
+ _isTopic = true;
+ }
+ else
+ {
+ destinationType = Queue.class;
+ }
+
+ _log.debug("Retrieving destination " + destinationName +
+ " of type " +
+ destinationType.getName());
+ _destination = Util.lookup(ctx, destinationName, destinationType);
+
+ }
+ else
+ {
+ _log.debug("Destination type not defined");
+ _log.debug("Retrieving destination " + destinationName +
+ " of type " +
+ Destination.class.getName());
+
+ _destination = Util.lookup(ctx, destinationName, AMQDestination.class);
+ _isTopic = !(_destination instanceof Queue) ;
+ }
+ }
+ else
+ {
+ _destination = (AMQDestination)AMQDestination.createDestination(_spec.getDestination());
+
+ if (destinationTypeString != null && !destinationTypeString.trim().equals(""))
+ {
+ _log.debug("Destination type defined as " + destinationTypeString);
+ final boolean match ;
+ if (Topic.class.getName().equals(destinationTypeString))
+ {
+ match = (_destination instanceof Topic) ;
+ _isTopic = true;
+ }
+ else
+ {
+ match = (_destination instanceof Queue) ;
+ }
+ if (!match)
+ {
+ throw new ClassCastException("Expected destination of type " + destinationTypeString + " but created destination " + _destination) ;
+ }
+ }
+ else
+ {
+ _isTopic = !(_destination instanceof Queue) ;
+ }
+ }
+
+ _log.debug("Got destination " + _destination + " from " + destinationName);
+ }
+
+
+
+}
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidMessageHandler.java b/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidMessageHandler.java
index 473efab31f..a02adf0dad 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidMessageHandler.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/inflow/QpidMessageHandler.java
@@ -20,6 +20,7 @@
*/
package org.apache.qpid.ra.inflow;
+import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
@@ -35,6 +36,9 @@ import javax.transaction.Status;
import javax.transaction.TransactionManager;
import javax.transaction.xa.XAResource;
+import org.apache.qpid.client.AMQConnection;
+import org.apache.qpid.client.XAConnectionImpl;
+import org.apache.qpid.ra.QpidResourceAdapter;
import org.apache.qpid.ra.Util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -43,82 +47,100 @@ import org.slf4j.LoggerFactory;
* The message handler
*
*/
-public class QpidMessageHandler implements MessageListener
+public class QpidMessageHandler extends QpidExceptionHandler implements MessageListener
{
- /**
- * The logger
- */
private static final Logger _log = LoggerFactory.getLogger(QpidMessageHandler.class);
- /**
- * The session
- */
- private final Session _session;
-
private MessageConsumer _consumer;
- /**
- * The endpoint
- */
private MessageEndpoint _endpoint;
- private final QpidActivation _activation;
-
- private boolean _useLocalTx;
-
- private boolean _transacted;
+ private Session _session;
private final TransactionManager _tm;
- public QpidMessageHandler(final QpidActivation activation,
- final TransactionManager tm,
- final Session session)
+ public QpidMessageHandler(final QpidResourceAdapter ra,
+ final QpidActivationSpec spec,
+ final MessageEndpointFactory endpointFactory,
+ final TransactionManager tm,
+ final Connection connection) throws ResourceException
{
- this._activation = activation;
- this._session = session;
+ super(ra, spec, endpointFactory);
this._tm = tm;
+ this._connection = connection;
}
-
+
+ public QpidMessageHandler(final QpidResourceAdapter ra,
+ final QpidActivationSpec spec,
+ final MessageEndpointFactory endpointFactory,
+ final TransactionManager tm) throws ResourceException
+ {
+ super(ra, spec, endpointFactory);
+ this._tm = tm;
+ }
+
public void setup() throws Exception
{
if (_log.isTraceEnabled())
{
_log.trace("setup()");
}
-
- QpidActivationSpec spec = _activation.getActivationSpec();
- String selector = spec.getMessageSelector();
-
+
+ setupCF();
+ setupDestination();
+ String selector = _spec.getMessageSelector();
+
+ if(_spec.isUseConnectionPerHandler())
+ {
+ setupConnection();
+ _connection.setExceptionListener(this);
+ }
+
+ if(isXA())
+ {
+ _session = _ra.createXASession((XAConnectionImpl)_connection);
+ }
+ else
+ {
+ _session = _ra.createSession((AMQConnection)_connection,
+ _spec.getAcknowledgeModeInt(),
+ _spec.isUseLocalTx(),
+ _spec.getPrefetchLow(),
+ _spec.getPrefetchHigh());
+ }
// Create the message consumer
- if (_activation.isTopic())
+ if (_isTopic)
{
- final Topic topic = (Topic) _activation.getDestination();
- final String subscriptionName = spec.getSubscriptionName();
- if (spec.isSubscriptionDurable())
- _consumer = _session.createDurableSubscriber(topic, subscriptionName, selector, false);
+ final Topic topic = (Topic) _destination;
+ final String subscriptionName = _spec.getSubscriptionName();
+
+ if (_spec.isSubscriptionDurable())
+ {
+ _consumer = _session.createDurableSubscriber(topic, subscriptionName, selector, false);
+ }
else
- _consumer = _session.createConsumer(topic, selector) ;
+ {
+ _consumer = _session.createConsumer(topic, selector) ;
+ }
}
else
{
- final Queue queue = (Queue) _activation.getDestination();
+ final Queue queue = (Queue) _destination;
_consumer = _session.createConsumer(queue, selector);
}
- // Create the endpoint, if we are transacted pass the session so it is enlisted, unless using Local TX
- MessageEndpointFactory endpointFactory = _activation.getMessageEndpointFactory();
- _useLocalTx = _activation.getActivationSpec().isUseLocalTx();
- _transacted = _activation.isDeliveryTransacted() || _useLocalTx ;
- if (_activation.isDeliveryTransacted() && !_activation.getActivationSpec().isUseLocalTx())
+ if (isXA())
{
final XAResource xaResource = ((XASession)_session).getXAResource() ;
- _endpoint = endpointFactory.createEndpoint(xaResource);
+ _endpoint = _endpointFactory.createEndpoint(xaResource);
}
else
{
- _endpoint = endpointFactory.createEndpoint(null);
+ _endpoint = _endpointFactory.createEndpoint(null);
}
_consumer.setMessageListener(this);
+ _connection.start();
+ _activated.set(true);
}
/**
@@ -126,11 +148,13 @@ public class QpidMessageHandler implements MessageListener
*/
public void teardown()
{
- if (_log.isTraceEnabled())
- {
- _log.trace("teardown()");
- }
+ if (_log.isTraceEnabled())
+ {
+ _log.trace("teardown()");
+ }
+ super.teardown();
+
try
{
if (_endpoint != null)
@@ -156,27 +180,28 @@ public class QpidMessageHandler implements MessageListener
try
{
- if (_activation.getActivationSpec().getTransactionTimeout() > 0 && _tm != null)
+ if (_spec.getTransactionTimeout() > 0 && _tm != null)
{
- _tm.setTransactionTimeout(_activation.getActivationSpec().getTransactionTimeout());
+ _tm.setTransactionTimeout(_spec.getTransactionTimeout());
}
_endpoint.beforeDelivery(QpidActivation.ONMESSAGE);
beforeDelivery = true;
- if(_transacted)
+ if(isXA())
{
message.acknowledge();
}
((MessageListener)_endpoint).onMessage(message);
- if (_transacted && (_tm.getTransaction() != null))
+ if (isXA() && (_tm.getTransaction() != null))
{
final int status = _tm.getStatus() ;
final boolean rollback = status == Status.STATUS_MARKED_ROLLBACK
|| status == Status.STATUS_ROLLING_BACK
|| status == Status.STATUS_ROLLEDBACK;
+
if (rollback)
{
_session.recover() ;
@@ -196,7 +221,7 @@ public class QpidMessageHandler implements MessageListener
_log.warn("Unable to call after delivery", e);
return;
}
- if (_useLocalTx)
+ if (!isXA() && _spec.isUseLocalTx())
{
_session.commit();
}
@@ -216,7 +241,7 @@ public class QpidMessageHandler implements MessageListener
_log.warn("Unable to call after delivery", e);
}
}
- if (_useLocalTx || !_activation.isDeliveryTransacted())
+ if (!isXA() && _spec.isUseLocalTx())
{
try
{
@@ -241,5 +266,17 @@ public class QpidMessageHandler implements MessageListener
}
}
+
+ public void start() throws Exception
+ {
+ _deliveryActive.set(true);
+ setup();
+ }
+
+ public void stop()
+ {
+ _deliveryActive.set(false);
+ teardown();
+ }
}
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/tm/GlassfishTransactionManagerLocator.java b/java/jca/src/main/java/org/apache/qpid/ra/tm/GlassfishTransactionManagerLocator.java
new file mode 100644
index 0000000000..cff53d2710
--- /dev/null
+++ b/java/jca/src/main/java/org/apache/qpid/ra/tm/GlassfishTransactionManagerLocator.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.ra.tm;
+
+
+import javax.naming.InitialContext;
+import javax.transaction.TransactionManager;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class GlassfishTransactionManagerLocator
+{
+ private static final Logger _log = LoggerFactory.getLogger(GlassfishTransactionManagerLocator.class);
+
+ private static final String TM_JNDI_NAME = "java:appserver/TransactionManager";
+
+ public TransactionManager getTm() throws Exception
+ {
+ InitialContext ctx = null;
+ TransactionManager tm = null;
+
+ try
+ {
+ ctx = new InitialContext();
+ tm = (TransactionManager)ctx.lookup(TM_JNDI_NAME);
+ }
+ catch(Exception e)
+ {
+ _log.error("Error attempting to location TM " + e.getMessage());
+ }
+ finally
+ {
+ try
+ {
+ if(ctx != null)
+ {
+ ctx.close();
+ }
+ }
+ catch(Exception ignore){}
+ }
+
+ return tm;
+ }
+}
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/tm/JBoss7TransactionManagerLocator.java b/java/jca/src/main/java/org/apache/qpid/ra/tm/JBoss7TransactionManagerLocator.java
index 266c56bd63..6103433cbf 100644
--- a/java/jca/src/main/java/org/apache/qpid/ra/tm/JBoss7TransactionManagerLocator.java
+++ b/java/jca/src/main/java/org/apache/qpid/ra/tm/JBoss7TransactionManagerLocator.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.ra.tm;
import javax.naming.InitialContext;
diff --git a/java/jca/src/main/java/org/apache/qpid/ra/tm/WLSTransactionManagerLocator.java b/java/jca/src/main/java/org/apache/qpid/ra/tm/WLSTransactionManagerLocator.java
new file mode 100644
index 0000000000..29e673d28e
--- /dev/null
+++ b/java/jca/src/main/java/org/apache/qpid/ra/tm/WLSTransactionManagerLocator.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.ra.tm;
+
+
+import javax.naming.InitialContext;
+import javax.transaction.TransactionManager;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WLSTransactionManagerLocator
+{
+ private static final Logger _log = LoggerFactory.getLogger(WLSTransactionManagerLocator.class);
+
+ private static final String TM_JNDI_NAME = "javax.transaction.TransactionManager";
+
+ public TransactionManager getTm() throws Exception
+ {
+ InitialContext ctx = null;
+ TransactionManager tm = null;
+
+ try
+ {
+ ctx = new InitialContext();
+ tm = (TransactionManager)ctx.lookup(TM_JNDI_NAME);
+ }
+ catch(Exception e)
+ {
+ _log.error("Unable to locate javax.transaction.TransactionManager " + e.getMessage());
+ }
+ finally
+ {
+ try
+ {
+ if(ctx != null)
+ {
+ ctx.close();
+ }
+ }
+ catch(Exception ignore){}
+ }
+
+ return tm;
+ }
+}
+
diff --git a/java/jca/src/main/resources/META-INF/ra.xml b/java/jca/src/main/resources/META-INF/ra.xml
index 2c8344c8f0..a9374f52d7 100755
--- a/java/jca/src/main/resources/META-INF/ra.xml
+++ b/java/jca/src/main/resources/META-INF/ra.xml
@@ -69,7 +69,7 @@
</config-property>
<config-property>
- <description>Interval between setup attempts</description>
+ <description>Interval between setup attempts in milliseconds</description>
<config-property-name>SetupInterval</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
<config-property-value>5000</config-property-value>
@@ -104,10 +104,17 @@
</config-property>
<config-property>
- <description>connection URL</description>
+ <description>Connection URL</description>
<config-property-name>ConnectionURL</config-property-name>
<config-property-type>java.lang.String</config-property-type>
- <config-property-value>amqp://guest:guest@/test?brokerlist='tcp://localhost:5672'</config-property-value>
+ <config-property-value>amqp://anonymous:passwd@client/test?brokerlist='tcp://localhost?sasl_mechs='PLAIN''</config-property-value>
+ </config-property>
+
+ <config-property>
+ <description>Use a JMS Connection per MessageHandler</description>
+ <config-property-name>UseConnectionPerHandler</config-property-name>
+ <config-property-type>java.lang.Boolean</config-property-type>
+ <config-property-value>true</config-property-value>
</config-property>
<outbound-resourceadapter>
@@ -116,14 +123,14 @@
<config-property>
<description>Default session type</description>
- <config-property-name>sessionDefaultType</config-property-name>
+ <config-property-name>SessionDefaultType</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>javax.jms.Queue</config-property-value>
</config-property>
<config-property>
<description>Specify lock timeout in seconds</description>
- <config-property-name>useTryLock</config-property-name>
+ <config-property-name>UseTryLock</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
<config-property-value>0</config-property-value>
</config-property>
@@ -137,7 +144,7 @@
<config-property>
<description>Client ID for the connection</description>
- <config-property-name>ClientID</config-property-name>
+ <config-property-name>ClientId</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>client_id</config-property-value>
</config-property>
@@ -195,12 +202,11 @@
</messagelistener>
</messageadapter>
</inbound-resourceadapter>
-
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidQueue</adminobject-interface>
<adminobject-class> org.apache.qpid.ra.admin.QpidQueueImpl</adminobject-class>
<config-property>
- <config-property-name>destinationAddress </config-property-name>
+ <config-property-name>DestinationAddress </config-property-name>
<config-property-type>java.lang.String </config-property-type>
</config-property>
</adminobject>
@@ -208,30 +214,16 @@
<adminobject-interface>org.apache.qpid.ra.admin.QpidTopic</adminobject-interface>
<adminobject-class> org.apache.qpid.ra.admin.QpidTopicImpl</adminobject-class>
<config-property>
- <config-property-name>destinationAddress </config-property-name>
+ <config-property-name>DestinationAddress </config-property-name>
<config-property-type>java.lang.String </config-property-type>
</config-property>
</adminobject>
- <!--
- <adminobject>
- <adminobject-interface>javax.jms.Destination</adminobject-interface>
- <adminobject-class> org.apache.qpid.ra.admin.QpidDestinationProxy</adminobject-class>
- <config-property>
- <config-property-name>destinationAddress </config-property-name>
- <config-property-type>java.lang.String </config-property-type>
- </config-property>
- <config-property>
- <config-property-name>destinationType</config-property-name>
- <config-property-type>java.lang.String </config-property-type>
- </config-property>
- </adminobject>
- -->
<adminobject>
<adminobject-interface>javax.jms.ConnectionFactory</adminobject-interface>
<adminobject-class> org.apache.qpid.ra.admin.QpidConnectionFactoryProxy</adminobject-class>
<config-property>
- <config-property-name>connectionURL</config-property-name>
- <config-property-type>java.lang.String </config-property-type>
+ <config-property-name>ConnectionURL</config-property-name>
+ <config-property-type>java.lang.String</config-property-type>
</config-property>
</adminobject>
</resourceadapter>
diff --git a/java/jca/src/test/java/org/apache/qpid/ra/QpidActivationSpecTest.java b/java/jca/src/test/java/org/apache/qpid/ra/QpidActivationSpecTest.java
new file mode 100644
index 0000000000..e811427223
--- /dev/null
+++ b/java/jca/src/test/java/org/apache/qpid/ra/QpidActivationSpecTest.java
@@ -0,0 +1,45 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.ra;
+
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectOutputStream;
+
+import javax.resource.spi.ResourceAdapterInternalException;
+
+import org.apache.qpid.ra.inflow.QpidActivationSpec;
+
+import junit.framework.TestCase;
+
+public class QpidActivationSpecTest extends TestCase
+{
+
+ public void testActivationSpecBasicSerialization() throws Exception
+ {
+ QpidActivationSpec spec = new QpidActivationSpec();
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(out);
+ oos.writeObject(spec);
+ oos.close();
+ assertTrue(out.toByteArray().length > 0);
+ }
+
+}
diff --git a/java/jca/src/test/java/org/apache/qpid/ra/QpidResourceAdapterTest.java b/java/jca/src/test/java/org/apache/qpid/ra/QpidResourceAdapterTest.java
new file mode 100644
index 0000000000..a6788a72c5
--- /dev/null
+++ b/java/jca/src/test/java/org/apache/qpid/ra/QpidResourceAdapterTest.java
@@ -0,0 +1,78 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.ra;
+
+import javax.resource.spi.ResourceAdapterInternalException;
+
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectOutputStream;
+
+import junit.framework.TestCase;
+
+
+public class QpidResourceAdapterTest extends TestCase
+{
+ public void testGetXAResources() throws Exception
+ {
+ QpidResourceAdapter ra = new QpidResourceAdapter();
+ assertNull(ra.getXAResources(null));
+ }
+
+ public void testTransactionManagerLocatorException() throws Exception
+ {
+
+ QpidResourceAdapter ra = new QpidResourceAdapter();
+ assertNull(ra.getTransactionManagerLocatorClass());
+ assertNull(ra.getTransactionManagerLocatorMethod());
+
+ try
+ {
+ ra.start(null);
+ }
+ catch(ResourceAdapterInternalException e)
+ {
+
+ }
+
+ ra.setTransactionManagerLocatorClass("DummyLocator");
+
+ try
+ {
+ ra.start(null);
+ }
+ catch(ResourceAdapterInternalException e)
+ {
+
+ }
+
+ }
+
+ public void testResourceAdapterBasicSerialization() throws Exception
+ {
+
+ QpidResourceAdapter ra = new QpidResourceAdapter();
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(out);
+ oos.writeObject(ra);
+ oos.close();
+ assertTrue(out.toByteArray().length > 0);
+ }
+}
diff --git a/java/junit-toolkit/build.xml b/java/junit-toolkit/build.xml
deleted file mode 100644
index a2f352c4b7..0000000000
--- a/java/junit-toolkit/build.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
- - or more contributor license agreements. See the NOTICE file
- - distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
- -->
-<project name="Junit Toolkit" default="build">
- <property name="module.src" value="src/main"/>
-
- <import file="../module.xml"/>
-
-</project>
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/DefaultThreadFactory.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/DefaultThreadFactory.java
deleted file mode 100644
index 8fb0a6a90e..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/DefaultThreadFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.concurrency;
-
-import java.util.concurrent.ThreadFactory;
-
-/**
- * Implements a default thread factory.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create default threads with no specialization.
- * </table>
- *
- * @author Rupert Smith
- */
-public class DefaultThreadFactory implements ThreadFactory
-{
- /**
- * Constructs a new <tt>Thread</tt>.
- *
- * @param r A runnable to be executed by new thread instance.
- *
- * @return The constructed thread.
- */
- public Thread newThread(Runnable r)
- {
- return new Thread(r);
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/PossibleDeadlockException.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/PossibleDeadlockException.java
deleted file mode 100644
index 3bbfc2d502..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/PossibleDeadlockException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.concurrency;
-
-/**
- * PossibleDeadlockException is used to signal that two test threads being executed by a {@link ThreadTestCoordinator}
- * may be in a state of deadlock because they are mutually blocking each other or one is waiting on the other and the
- * other has been blocked elsewhere for longer than a specified timeout.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Signal a possible state of deadlock between coordinated test threads.
- * </table>
- *
- * @author Rupert Smith
- */
-public class PossibleDeadlockException extends RuntimeException
-{
- /**
- * Create a new possible deadlock execption.
- *
- * @param message The exception message.
- */
- public PossibleDeadlockException(String message)
- {
- super(message);
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/TestRunnable.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/TestRunnable.java
deleted file mode 100644
index 02e776a4ea..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/TestRunnable.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.concurrency;
-
-/**
- * TestRunnable is an extension of java.util.Runnable that adds some features to make it easier to coordinate the
- * activities of threads in such a way as to expose bugs in multi threaded code.
- *
- * <p/>Sometimes several threads will run in a particular order so that a bug is not revealed. Other times the ordering
- * of the threads will expose a bug. Such bugs can be hard to replicate as the exact execution ordering of threads is not
- * usually controlled. This class adds some methods that allow threads to synchronize other threads, either allowing them
- * to run, or waiting for them to allow this thread to run. It also provides convenience methods to gather error messages
- * and exceptions from threads, which will often be reported in unit testing code.
- *
- * <p/>Coordination between threads is handled by the {@link ThreadTestCoordinator}. It is called through the convenience
- * methods {@link #allow} and {@link #waitFor}. Threads to be coordinated must be set up with the coordinator and assigned
- * integer ids. It is then possible to call the coordinator with an array of thread ids requesting that those threads
- * be allowed to continue, or to wait until one of them allows this thread to continue. The otherwise non-deterministic
- * execution order of threads can be controlled into a carefully determined sequence using these methods in order
- * to reproduce race conditions, dead locks, live locks, dirty reads, phantom reads, non repeatable reads and so on.
- *
- * <p/>When waiting for another thread to give a signal to continue it is sometimes the case that the other thread has
- * become blocked by the code under test. For example in testing for a dirty read (for example in database code),
- * thread 1 lets thread 2 perform a write but not commit it, then thread 2 lets thread 1 run and attempt to perform a
- * dirty read on its uncommitted write. Transaction synchronization code being tested against the possibility of a dirty
- * write may make use of snapshots in which case both threads should be able to read and write without blocking. It may
- * make use of explicit keys in which case thread 2 may become blocked on its write attempt because thread 1 holds a
- * read lock and it must wait until thread 1 completes its transaction before it can acquire this lock. The
- * {@link #waitFor} method accepts a boolean parameter to indicate that threads being blocked (other than on the
- * coordinator) can be interpreted the same as if the thread explicitly allows the thread calling waitFor to continue.
- * Using this technique a dirty read test could be written that works against either the snapshot or the locking
- * implementation, allowing both approaches to pass the test yet arranging for multiple threads to run against the
- * implementation in such a way that a potential dirty read bug is exposed.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Wait for another thread to allow this one to continue.
- * <tr><td> Allow another thread to continue.
- * <tr><td> Accumulate error messages.
- * <tr><td> Record exceptions from thread run.
- * <tr><td> Maintain link to thread coordinator.
- * <tr><td> Explicitly mark a thread with an integer id.
- * <tr><td> Maintian a flag to indicate whether or not this thread is waiting on the coordinator.
- * </table>
- *
- * @todo The allow then waitFor operations are very often used as a pair. So create a method allowAndWait that combines
- * them into a single method call.
- *
- * @author Rupert Smith
- */
-public abstract class TestRunnable implements Runnable
-{
- /** Holds a reference to the thread coordinator. */
- private ThreadTestCoordinator coordinator;
-
- /** Holds the explicit integer id of this thread. */
- private int id;
-
- /** Used to indicate that this thread is waiting on the coordinator and not elsewhere. */
- private boolean waitingOnCoordinator = false;
-
- /** Used to accumulate error messsages. */
- private String errorMessage = "";
-
- /** Holds the Java thread object that this is running under. */
- private Thread thisThread;
-
- /** Used to hold any exceptions resulting from the run method. */
- private Exception runException = null;
-
- /**
- * Implementations override this to perform coordinated thread sequencing.
- *
- * @throws Exception Any exception raised by the implementation will be caught by the default {@link #run()}
- * implementation for later querying by the {@link #getException()} method.
- */
- public abstract void runWithExceptions() throws Exception;
-
- /**
- * Provides a default implementation of the run method that allows exceptions to be thrown and keeps a record
- * of those exceptions. Defers to the {@link #runWithExceptions()} method to provide the thread body implementation
- * and catches any exceptions thrown by it.
- */
- public void run()
- {
- try
- {
- runWithExceptions();
- }
- catch (Exception e)
- {
- this.runException = e;
- }
- }
-
- /**
- * Attempt to consume an allow event from one of the specified threads and blocks until such an event occurrs.
- *
- * @param threads The set of threads that can allow this one to continue.
- * @param otherWaitIsAllow If set to <tt>true</tt> if the threads being waited on are blocked other than on
- * the coordinator itself then this is to be interpreted as allowing this thread to
- * continue.
- *
- * @return If the <tt>otherWaitIsAllow</tt> flag is set, then <tt>true</tt> is returned when the thread being waited on is found
- * to be blocked outside of the thread test coordinator. <tt>false</tt> under all other conditions.
- */
- protected boolean waitFor(int[] threads, boolean otherWaitIsAllow)
- {
- return coordinator.consumeAllowEvent(threads, otherWaitIsAllow, id, this);
- }
-
- /**
- * Produces allow events on each of the specified threads.
- *
- * @param threads The set of threads that are to be allowed to continue.
- */
- protected void allow(int[] threads)
- {
- coordinator.produceAllowEvents(threads, id, this);
- }
-
- /**
- * Keeps the error message for later reporting by the coordinator.
- *
- * @param message The error message to keep.
- */
- protected void addErrorMessage(String message)
- {
- errorMessage += message;
- }
-
- /**
- * Sets the coordinator for this thread.
- *
- * @param coordinator The coordinator for this thread.
- */
- void setCoordinator(ThreadTestCoordinator coordinator)
- {
- this.coordinator = coordinator;
- }
-
- /**
- * Reports whether or not this thread is waiting on the coordinator.
- *
- * @return <tt>If this thread is waiting on the coordinator.
- */
- boolean isWaitingOnCoordinator()
- {
- return waitingOnCoordinator;
- }
-
- /**
- * Sets the value of the waiting on coordinator flag.
- *
- * @param waiting The value of the waiting on coordinator flag.
- */
- void setWaitingOnCoordinator(boolean waiting)
- {
- waitingOnCoordinator = waiting;
- }
-
- /**
- * Sets up the explicit int id for this thread.
- *
- * @param id The integer id.
- */
- void setId(int id)
- {
- this.id = id;
- }
-
- /**
- * Reports any accumulated error messages.
- *
- * @return Any accumulated error messages.
- */
- String getErrorMessage()
- {
- return errorMessage;
- }
-
- /**
- * Reports any exception thrown by the {@link #runWithExceptions} method.
- *
- * @return Any exception thrown by the {@link #runWithExceptions} method.
- */
- Exception getException()
- {
- return runException;
- }
-
- /**
- * Sets the Java thread under which this runs.
- *
- * @param thread The Java thread under which this runs.
- */
- void setThread(Thread thread)
- {
- thisThread = thread;
- }
-
- /**
- * Gets the Java thread under which this runs.
- *
- * @return The Java thread under which this runs.
- */
- Thread getThread()
- {
- return thisThread;
- }
-
- /**
- * Provides a string summary of this test threads status.
- *
- * @return Summarizes this threads status.
- */
- public String toString()
- {
- return "id = " + id + ", waitingOnCoordinator = " + waitingOnCoordinator;
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestCoordinator.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestCoordinator.java
deleted file mode 100644
index 3cf8543656..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestCoordinator.java
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.concurrency;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.concurrent.ThreadFactory;
-
-/**
- * ThreadTestCoordinator provides an array of binary latches that allows threads to wait for other threads or to send
- * them a signal that allows them to continue running or to wait for another thread to signal them. The binary latch
- * array is always a square array, allowing one latch from and to every thread. Upon accepting an allow signal from one
- * sender the latches for all senders for a are cleared. This class is always used in conjunction with
- * {@link TestRunnable} for writing concurrent test code that coordinates multi-threaded activity in order to reproduce
- * concurrency bugs.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Accept test threads to coordinate.
- * <tr><td> Allow test threads to send 'allow to continue' signals.
- * <tr><td> Allow test threads to wait on this coordinator for 'allow to continue' signals.
- * <tr><td> Report error messages from test threads.
- * <tr><td> Report exceptions from test threads.
- * <tr><td> Provide method to wait until all test threads have completed.
- * </table>
- *
- * @todo This code was hacked together as a bit of an experiment, because I wasn't sure if this idea would work. It has
- * proved extremely usefull. Some documentation for this needs to be written to explain it better.
- *
- * @todo Consider how deadlock detection will be handled. If all threads are blocking on the coordinator, waiting for
- * each other, they are deadlocked and there is something wrong with the test code that put them in that
- * situation. If they are all blocked elsewhere, they may be deadlocked, or could just be waiting on some
- * external event. A timeout should be used. Timeout is already implemented, just need to sanity check how
- * this is working and document it.
- *
- * @todo Consider how livelock detection could be implemented? LockFree data structures might cause live locks. I
- * guess a longish timeout is the only thing that can be done for that.
- *
- * @todo Only course grained synchronous at the method class level can be obtained. This is because test code can
- * only insert synchronization points between method calls it makes. So this code will not be usefull for
- * checking sequences of events within methods, unless the code under test is explicitly instrumented for it.
- * It might be possible to instrument code by using labels, and then use the debugger/profiler interface to
- * put breakpoints on the labels and use them as synchronization points. Not perfect, but at the unused labels
- * can be left in the code, without altering its behaviour.
- *
- * @author Rupert Smith
- */
-public class ThreadTestCoordinator
-{
- /** Used for logging. */
- private static final Logger log = LoggerFactory.getLogger(ThreadTestCoordinator.class);
-
- /** Keeps track of the test threads by their ids. */
- private TestRunnable[] testThreads; // = new TestRunnable[2];
-
- /** An explicit thread monitor for the coordinator. Threads wait on the coordinator whilst waiting for events. */
- private final Object coordinatorLock = new Object();
-
- /** A set of monitors for each test thread. */
- private Object[] locks;
-
- /** The binary latch array, this is always a square array allowing one event from and to every thread. */
- private boolean[][] allowEvents;
-
- /** Keeps track of the number of threads being coordinated. */
- private int threadCount = 0;
-
- /** Accumulates any exceptions resulting from the threads run methods. */
- private Collection<Exception> exceptions = new ArrayList<Exception>();
-
- /**
- * Holds the deadlock timeout after which threads are given a runtime exception to signal that a potential
- * deadlock may be happening.
- */
- private long deadlockTimeout = 1000 * 1000000;
-
- /** Holds the factory to create test thread with. */
- private ThreadFactory threadFactory;
-
- /**
- * Creates a new test thread coordinator. The number of threads to run must be specified here.
- *
- * @param numThreads The number of threads to run.
- */
- public ThreadTestCoordinator(int numThreads)
- {
- this.threadCount = numThreads;
-
- // Create an array big enough to hold all the test threads.
- testThreads = new TestRunnable[threadCount];
-
- // Use the default thread factory, as none specified.
- threadFactory = new DefaultThreadFactory();
- }
-
- /**
- * Creates a new test thread coordinator with a specific thread factory. The number of threads to run must be
- * specified here.
- *
- * @param numThreads The number of threads to run.
- * @param threadFactory The factory to use to create the test threads.
- */
- public ThreadTestCoordinator(int numThreads, ThreadFactory threadFactory)
- {
- this.threadCount = numThreads;
-
- // Create an array big enough to hold all the test threads.
- testThreads = new TestRunnable[threadCount];
-
- // Use the specified thread factory.
- this.threadFactory = threadFactory;
- }
-
- /**
- * Adds a thread to this coordinator and assigns an id to it. The ids must be numbered sequentially from 0 and
- * it is up to the caller to do this.
- *
- * @param runnable The test thread.
- * @param id The explicit id to assign to the test thread.
- */
- public void addTestThread(TestRunnable runnable, int id)
- {
- testThreads[id] = runnable;
- runnable.setCoordinator(this);
- runnable.setId(id);
- }
-
- /**
- * Starts all the coordinated threads running.
- */
- public void run()
- {
- // Create the monitors for each thread.
- locks = new Object[threadCount];
-
- // Create an appropriately sized event queue to allow one event from and to each thread.
- allowEvents = new boolean[threadCount][threadCount];
-
- // Initialize the monitors and clear the event queues.
- for (int i = 0; i < locks.length; i++)
- {
- locks[i] = new Object();
-
- for (int j = 0; j < locks.length; j++)
- {
- allowEvents[i][j] = false;
- }
- }
-
- // Start all the threads running.
- for (TestRunnable nextRunnable : testThreads)
- {
- // Create a Java thread for the test thread.
- Thread newThread = threadFactory.newThread(nextRunnable);
- nextRunnable.setThread(newThread);
-
- // Start it running.
- newThread.start();
- }
- }
-
- /**
- * Waits until all the test threads have completed and returns any accumulated error messages from them. Any
- * exceptions thrown by their run methods are also kept at this point.
- *
- * @return The accumulated error messages from all the threads concatenated together.
- */
- public String joinAndRetrieveMessages()
- {
- // Create an empty error message.
- String errorMessage = "";
-
- // Join all the test threads.
- for (TestRunnable r : testThreads)
- {
- Thread t = r.getThread();
-
- try
- {
- t.join();
- }
- catch (InterruptedException e)
- { }
-
- // Add any accumulated error messages to the return value.
- errorMessage += r.getErrorMessage();
-
- // Keep any exceptions resulting from the threads run method.
- Exception e = r.getException();
-
- if (e != null)
- {
- exceptions.add(e);
- }
- }
-
- return errorMessage;
- }
-
- /**
- * Reports any accumulated exceptions from the test threads run methods. This method must be called after
- * {@link #joinAndRetrieveMessages}.
- *
- * @return Any accumulated exceptions from the test threads run methods. This method must be called after
- */
- public Collection<Exception> getExceptions()
- {
- return exceptions;
- }
-
- /**
- * Sets a timeout to break out of potential deadlocks. If all threads are waiting for other threads to send
- * them continue events for longer than this timeout then the threads are all terminated.
- *
- * @param millis The minimum time to allow to pass before breaking out of any potential deadlocks.
- *
- * @todo This has not been implemented yet. If a potential deadlock happens then the joinAndRetrieveMessages
- * method should throw a PotentialDeadlockException.
- */
- public void setDeadlockTimeout(long millis)
- {
- deadlockTimeout = millis * 1000000;
- }
-
- /**
- * Creates a set of 'allow to continue' events on the event queues of the specified threads.
- *
- * @param threads The set of threads to allow to continue.
- * @param callerId The explicit id of the calling test thread.
- * @param caller The calling test thread.
- */
- void produceAllowEvents(int[] threads, int callerId, TestRunnable caller)
- {
- // Generate some debugging messages. Very usefull to know how thread synchronization is progressing.
- String message = "Thread " + callerId + " is allowing threads [ ";
-
- for (int j = 0; j < threads.length; j++)
- {
- message += threads[j] + ((j < (threads.length - 1)) ? ", " : "");
- }
-
- message += " ] to continue.";
- log.debug(message);
-
- // For each allow event, synchronize on the threads lock then set the event flag to true.
- for (int id : threads)
- {
- // Set the waiting on coordinator flag to true in case the coordinator tries to test this thread for
- // being blocked at this time.
- caller.setWaitingOnCoordinator(true);
-
- synchronized (locks[id])
- {
- // Release the wating on coordinator flag now that this thread is running again.
- caller.setWaitingOnCoordinator(false);
-
- // Send the allow to continue event to the receiving thread.
- allowEvents[id][callerId] = true;
- }
- }
-
- // Wake up any threads waiting on the coordinator lock to recheck their event queues.
- // Set the waiting on coordinator flag to true in case the coordinator tries to test this thread for
- // being blocked at this time.
- caller.setWaitingOnCoordinator(true);
-
- synchronized (coordinatorLock)
- {
- // Release the wating on coordinator flag now that this thread is running again.
- caller.setWaitingOnCoordinator(false);
- coordinatorLock.notifyAll();
- }
- }
-
- /**
- * Consumes an 'allow to continue' from one of the specified threads or waits until one is available or in some
- * cases if one of the specified threads is blocked elsewhere to accept that as an 'allow to continue' event.
- *
- * @param threads The set of threads to accept an allow to continue event from.
- * @param otherWaitIsAllow Whether or not to accept threads being blocked elsewhere as permission to continue.
- * @param callerId The explicit id of the calling test thread.
- * @param caller The calling test thread.
- *
- * @return If the <tt>otherWaitIsAllow</tt> flag is set, then <tt>true</tt> is returned when the thread being waited on is found
- * to be blocked outside of the thread test coordinator. <tt>false</tt> under all other conditions.
- */
- boolean consumeAllowEvent(int[] threads, boolean otherWaitIsAllow, int callerId, TestRunnable caller)
- {
- // Generate some debugging messages. Very usefull to know how thread synchronization is progressing.
- String message = "Thread " + callerId + " is requesting threads [ ";
-
- // Record the time at which this method was called. Will be used for breaking out of potential deadlocks.
- long startTime = System.nanoTime();
-
- for (int j = 0; j < threads.length; j++)
- {
- message += threads[j] + ((j < (threads.length - 1)) ? ", " : "");
- }
-
- message += " ] to allow it to continue.";
- log.debug(message);
-
- // Loop until an allow to continue event is received.
- while (true)
- {
- // Look at all the allowing thread to see if one has created an event for consumption.
- for (int allowerId : threads)
- {
- // Get the threads lock for the event to consume.
- // Set the waiting on coordinator flag to true in case the coordinator tries to test this thread for
- // being blocked at this time.
- caller.setWaitingOnCoordinator(true);
-
- synchronized (locks[callerId])
- {
- // Release the wating on coordinator flag now that this thread is running again.
- caller.setWaitingOnCoordinator(false);
-
- // Check if there is an event on the queue from the allowing thread to this one.
- if (allowEvents[callerId][allowerId])
- {
- log.debug("Found an allow event, thread " + allowerId + ", is allowing thread " + callerId
- + ", to continue.");
-
- // Consume all the allow events for this thread.
- /*for (int i = 0; i < allowEvents[callerId].length; i++)
- {
- allowEvents[callerId][i] = false;
- }*/
-
- // Consume just the event from the allower to the consumer, leaving other pending allow events alone.
- allowEvents[callerId][allowerId] = false;
-
- return false;
- }
- }
- }
-
- // If waiting elsewhere is to be interpreted as an 'allow to continue' event, then look at the thread status
- // for the threads being waited on to see if any are blocked on other resources.
- if (otherWaitIsAllow)
- {
- log.debug("Other wait is to be interpreted as an allow event.");
-
- // Look at all the potential allower threads.
- for (int allowerId : threads)
- {
- // Get the Java thread state for the allowing thread.
- Thread threadToTest = testThreads[allowerId].getThread();
- Thread.State state = threadToTest.getState();
-
- // Check if the thread is blocked and so a potential candidate for releasing this one.
- if ((state == Thread.State.BLOCKED) || (state == Thread.State.WAITING)
- || (state == Thread.State.TIMED_WAITING))
- {
- log.debug("Found an allower thread, id = " + allowerId + ", that is blocked or wating.");
-
- // Check that the allower thread is not waiting on the coordinator lock or any of the
- // individual thread locks. It must be waiting or blocked on another monitor.
- TestRunnable allowingRunnable = testThreads[allowerId];
- boolean isWaitingOnCoordinator = allowingRunnable.isWaitingOnCoordinator();
-
- if (!isWaitingOnCoordinator)
- {
- log.debug("The allower thread, id = " + allowerId
- + ", is blocked or waiting other than on the coordinator.");
-
- // Get the threads lock for the event to consume.
- caller.setWaitingOnCoordinator(true);
-
- synchronized (locks[callerId])
- {
- caller.setWaitingOnCoordinator(false);
-
- // Consume all the allow events for this thread.
- for (int i = 0; i < allowEvents[callerId].length; i++)
- {
- allowEvents[callerId][i] = false;
- }
-
- return true;
- }
- }
- else
- {
- log.debug("The waiting allower thread, " + allowerId
- + ", is waiting on the coordinator so does not allow thread " + callerId + " to continue.");
- }
- }
- }
- }
-
- // Keep waiting until an 'allow to continue' event can be consumed.
- try
- {
- // Set the waiting on coordinator flag to true in case the coordinator tries to test this thread for
- // being blocked at this time.
- caller.setWaitingOnCoordinator(true);
-
- synchronized (coordinatorLock)
- {
- // Release the wating on coordinator flag now that this thread is running again.
- caller.setWaitingOnCoordinator(false);
-
- log.debug("Thread " + callerId + " is waiting on coordinator lock for more allow events.");
-
- // Set the waiting on coordinator flag to true in case the coordinator tries to test this thread for
- // being blocked at this time.
- caller.setWaitingOnCoordinator(true);
- coordinatorLock.wait(10);
- }
- }
- catch (InterruptedException e)
- { }
-
- // Release the waiting on coordinator flag now that this thread is running again.
- caller.setWaitingOnCoordinator(false);
-
- // Check if this thread has been waiting for longer than the deadlock timeout and raise a possible
- // deadlock exception if so.
- long waitTime = System.nanoTime() - startTime;
- log.debug("Thread " + callerId + " has been waiting for " + (waitTime / 1000000) + " milliseconds.");
-
- if (waitTime > deadlockTimeout)
- {
- // Throw a possible deadlock exception.
- throw new PossibleDeadlockException("Possible deadlock due to timeout with state:\n" + this);
- }
-
- log.debug("Thread " + callerId + " has woken up, was waiting for more allow events to become available.");
- }
- }
-
- /**
- * Pretty prints the state of the thread test coordinator, for debugging purposes.
- *
- * @return Pretty printed state of the thread test coordinator.
- */
- public String toString()
- {
- String result = "[";
-
- for (int i = 0; i < allowEvents.length; i++)
- {
- for (int j = 0; j < allowEvents[i].length; j++)
- {
- result += allowEvents[i][j];
-
- result += (j < (allowEvents[i].length - 1)) ? ", " : "";
- }
-
- result += (i < (allowEvents.length - 1)) ? ",\n " : "";
- }
-
- result += "]";
-
- for (int i = 0; i < testThreads.length; i++)
- {
- result += "thread[" + i + "] = " + testThreads[i].toString();
- }
-
- return result;
- }
-
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestExample.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestExample.java
deleted file mode 100644
index b9865f2e22..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestExample.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.concurrency;
-
-import org.apache.log4j.Logger;
-
-/**
- * An example to illustrate the use of the {@link ThreadTestCoordinator} and {@link TestRunnable}s.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Demo multi-threaded testing.
- * </table>
- *
- * @author Rupert Smith
- */
-public class ThreadTestExample
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(ThreadTestExample.class);
-
- /** Test thread 1. */
- TestRunnable testThread1 =
- new TestRunnable()
- {
- public void runWithExceptions() throws Exception
- {
- log.debug("public void run(): called");
- log.info("in testThread0, block 1");
-
- // Wait for t2 to allow t1 to continue.
- allow(new int[] { 1 });
- waitFor(new int[] { 1 }, false);
-
- log.info("in testThread0, block 2");
-
- // Wait for t2 to allow t1 to continue. T2 is allowed to be blocked elsewhere than giving explicit
- // permission to allow t1 to continue.
- allow(new int[] { 1 });
- waitFor(new int[] { 1 }, true);
-
- log.info("in testThread0, block 3");
-
- // Release thread 2 from waiting on the shared lock.
- synchronized (sharedLock)
- {
- sharedLock.notifyAll();
- }
-
- allow(new int[] { 1 });
- }
- };
-
- /** A shared lock between the test threads. */
- final Object sharedLock = new Object();
-
- /** Test thread 2. */
- TestRunnable testThread2 =
- new TestRunnable()
- {
- public void runWithExceptions() throws Exception
- {
- log.debug("public void run(): called");
- log.info("in testThread1, block 1");
-
- // Wait for t1 to allow t2 to continue.
- allow(new int[] { 0 });
- waitFor(new int[] { 0 }, false);
-
- log.info("in testThread1, block 2");
-
- // Wait on another resource. T1 should accept this as permission to continue.
- try
- {
- synchronized (sharedLock)
- {
- log.debug("in testThread1, waiting on shared lock.");
- sharedLock.wait();
- }
- }
- catch (InterruptedException e)
- {
- // Bail-out with a runtime if this happens.
- throw new RuntimeException("Interrupted whilst waiting for shared lock.", e);
- }
-
- log.info("in testThread1, finished waiting on shared lock.");
-
- // allow(new int[] { 0 });
-
- // Wait for t1 to allow t2 to continue.
- waitFor(new int[] { 0 }, false);
-
- log.info("in testThread1, block 3");
-
- allow(new int[] { 0 });
- }
- };
-
- /**
- * Executes the test threads with coordination.
- *
- * @param args Ignored.
- */
- public void main(String[] args)
- {
- ThreadTestCoordinator tt = new ThreadTestCoordinator(2);
-
- tt.addTestThread(testThread1, 0);
- tt.addTestThread(testThread2, 1);
- tt.setDeadlockTimeout(500);
- tt.run();
-
- String errorMessage = tt.joinAndRetrieveMessages();
-
- // Print any error messages or exceptions.
- log.info(errorMessage);
-
- if (!tt.getExceptions().isEmpty())
- {
- for (Exception e : tt.getExceptions())
- {
- log.warn("Exception thrown during test thread: ", e);
- }
- }
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/package.html b/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/package.html
deleted file mode 100644
index 904fd0fd05..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/package.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<html>
-<body>
-Contains code to assist in testing concurrency issues using coordinated threads to present code under test with
-oportunities to expose concurrency bugs. Some example concurrency bugs that may be tested using these techniques are
-race conditions, dead locks, live locks, dirty reads, phantom reads, non repeatable reads and so on.
-</body>
-</html>
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestCase.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestCase.java
deleted file mode 100644
index 58a7f60f3c..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestCase.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.TestCase;
-
-import org.apache.log4j.Logger;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-
-/**
- * AsymptoticTestCase is an extension of TestCase for writing unit tests to analyze asymptotic time and space behaviour.
- *
- * <p>ParameterizedTestCases allow tests to be defined which have test methods that take a single int argument. Normal
- * JUnit test methods do not take any arguments. This int argument can be interpreted in any way by the test but it is
- * intended to denote the 'size' of the test to be run. For example, when testing the performance of a data structure
- * for different numbers of data elements held in the data structure the int parameter should be interpreted as the
- * number of elements. Test timings for different numbers of elements can then be captured and the asymptotic behaviour
- * of the data structure with respect to time analyzed. Any non-parameterized tests defined in extensions of this class
- * will also be run.
- *
- * <p>TestCases derived from this class may also define tear down methods to clean up their memory usage. This is
- * intended to be used in conjunction with memory listeners that report the amount of memory a test uses. The idea is
- * to write a test that allocates memory in the main test method in such a way that it leaves that memory still
- * allocated at the end of the test. The amount of memory used can then be measured before calling the tear down method
- * to clean it up. In the data structure example above, a test will allocate as many elements as are requested by the
- * int parameter and deallocate them in the tear down method. In this way memory readings for different numbers of
- * elements can be captured and the asymptotic behaviour of the data structure with respect to space analyzed.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Store the current int parameter value. <td> {@link TKTestResult} and see {@link AsymptoticTestDecorator} too.
- * <tr><td> Invoke parameterized test methods.
- * </table>
- *
- * @todo If possible try to move the code that invokes the test and setup/teardown methods into {@link TKTestResult} or
- * {@link AsymptoticTestDecorator} rather than this class. This would mean that tests don't have to extend this
- * class to do time and space performance analysis, these methods could be added to any JUnit TestCase class
- * instead. This would be an improvement because existing unit tests wouldn't have to extend a different class to
- * work with this extension, and also tests that extend other junit extension classes could have parameterized
- * and tear down methods too.
- *
- * @author Rupert Smith
- */
-public class AsymptoticTestCase extends TestCase implements InstrumentedTest
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(AsymptoticTestCase.class);
-
- /** The name of the test case. */
- private String testCaseName;
-
- /** Thread local for holding measurements on a per thread basis. */
- ThreadLocal<TestMeasurements> threadLocalMeasurement =
- new ThreadLocal<TestMeasurements>()
- {
- /**
- * Sets up a default set test measurements (zeroed, apart from the size param which defaults to 1).
- *
- * @return A set of default test measurements.
- */
- protected synchronized TestMeasurements initialValue()
- {
- return new TestMeasurements();
- }
- };
-
- /**
- * Constructs a test case with the given name.
- *
- * @param name The name of the test.
- */
- public AsymptoticTestCase(String name)
- {
- super(name);
-
- log.debug("public AsymptoticTestCase(String " + name + "): called");
- testCaseName = name;
- }
-
- /**
- * Gets the current value of the integer parameter to be passed to the parameterized test.
- *
- * @return The current value of the integer parameter.
- */
- public int getN()
- {
- log.debug("public int getN(): called");
- int n = threadLocalMeasurement.get().n;
-
- log.debug("return: " + n);
-
- return n;
- }
-
- /**
- * Sets the current value of the integer parameter to be passed to the parameterized test.
- *
- * @param n The new current value of the integer parameter.
- */
- public void setN(int n)
- {
- log.debug("public void setN(int " + n + "): called");
- threadLocalMeasurement.get().n = n;
- }
-
- /**
- * Reports how long the test took to run.
- *
- * @return The time in milliseconds that the test took to run.
- */
- public long getTestTime()
- {
- log.debug("public long getTestTime(): called");
- long startTime = threadLocalMeasurement.get().startTime;
- long endTime = threadLocalMeasurement.get().endTime;
- long testTime = endTime - startTime;
-
- log.debug("return: " + testTime);
-
- return testTime;
- }
-
- /**
- * Reports the memory usage at the start of the test.
- *
- * @return The memory usage at the start of the test.
- */
- public long getTestStartMemory()
- {
- // log.debug("public long getTestStartMemory(): called");
- long startMem = threadLocalMeasurement.get().startMem;
-
- // log.debug("return: " + startMem);
-
- return startMem;
- }
-
- /**
- * Reports the memory usage at the end of the test.
- *
- * @return The memory usage at the end of the test.
- */
- public long getTestEndMemory()
- {
- // log.debug("public long getTestEndMemory(): called");
- long endMem = threadLocalMeasurement.get().endMem;
-
- // log.debug("return: " + endMem);
- return endMem;
- }
-
- /**
- * Resets the instrumentation values to zero, and nulls any references to held measurements so that the memory
- * can be reclaimed.
- */
- public void reset()
- {
- log.debug("public void reset(): called");
- threadLocalMeasurement.remove();
- }
-
- /**
- * Runs the test method for this test case.
- *
- * @throws Throwable Any Throwables from the test methods invoked are allowed to fall through.
- */
- protected void runTest() throws Throwable
- {
- log.debug("protected void runTest(): called");
-
- // Check that a test name has been set. This is used to define which method to run.
- assertNotNull(testCaseName);
- log.debug("testCaseName = " + testCaseName);
-
- // Try to get the method with matching name.
- Method runMethod = null;
- boolean isParameterized = false;
-
- // Check if a parameterized test method is available.
- try
- {
- // Use getMethod to get all public inherited methods. getDeclaredMethods returns all
- // methods of this class but excludes the inherited ones.
- runMethod = getClass().getMethod(testCaseName, int.class);
- isParameterized = true;
- }
- catch (NoSuchMethodException e)
- {
- // log.debug("Parameterized method \"" + testCaseName + "\" not found.");
- // Set run method to null (it already will be but...) to indicate that no parameterized method
- // version could be found.
- runMethod = null;
- }
-
- // If no parameterized method is available, try and get the unparameterized method.
- if (runMethod == null)
- {
- try
- {
- runMethod = getClass().getMethod(testCaseName);
- isParameterized = false;
-
- }
- catch (NoSuchMethodException e)
- {
- fail("Method \"" + testCaseName + "\" not found.");
- }
- }
-
- // Check that the method is publicly accessable.
- if (!Modifier.isPublic(runMethod.getModifiers()))
- {
- fail("Method \"" + testCaseName + "\" should be public.");
- }
-
- // Try to execute the method, passing it the current int parameter value. Allow any invocation exceptions or
- // resulting exceptions from the method to fall through.
- try
- {
- Integer paramN = getN();
- log.debug("paramN = " + paramN);
-
- // Calculate parameters for parameterized tests so new does not get called during memory measurement.
- Object[] params = new Object[] { paramN };
-
- // Take the test start memory and start time.
- threadLocalMeasurement.get().startMem = 0; // SizeOf.getUsedMemory();
-
- threadLocalMeasurement.get().startTime = System.nanoTime();
-
- if (isParameterized)
- {
- runMethod.invoke(this, params);
- }
- else
- {
- runMethod.invoke(this);
- }
- }
- catch (InvocationTargetException e)
- {
- e.fillInStackTrace();
- throw e.getTargetException();
- }
- catch (IllegalAccessException e)
- {
- e.fillInStackTrace();
- throw e;
- }
- finally
- {
- // Take the test end memory and end time and calculate how long it took to run.
- long endTime = System.nanoTime();
- threadLocalMeasurement.get().endTime = endTime;
- log.debug("startTime = " + threadLocalMeasurement.get().startTime + ", endTime = " + endTime + ", testTime = "
- + getTestTime());
-
- threadLocalMeasurement.get().endMem = 0; // SizeOf.getUsedMemory();
- }
- }
-
- /**
- * The test parameters, encapsulated as a unit for attaching on a per thread basis.
- */
- private static class TestMeasurements
- {
- /** Holds the current value of the integer parameter to run tests on. */
- public int n = 1;
-
- /** Holds the test start memory. */
- public long startTime = 0;
-
- /** Holds the test end memory. */
- public long endTime = 0;
-
- /** Holds the test start memory. */
- public long startMem = 0;
-
- /** Holds the test end memory. */
- public long endMem = 0;
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestDecorator.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestDecorator.java
deleted file mode 100644
index 8869d25be3..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestDecorator.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.TestResult;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.MathUtils;
-
-/**
- * A Decorator that runs a test repeatedly on an increasing int parameter, or for a fixed number of repeats. If both
- * a set of integer parameters and a repeat count are specified, then each test is run for the repeat count at each
- * integer parameter.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Repeat a test for each of a set of integer parameters. <td> {@link TKTestResult}
- * <tr><td> Repeat a test multiple times.
- * <tr><td>
- * </table>
- *
- * @author Rupert Smith
- */
-public class AsymptoticTestDecorator extends WrappedSuiteTestDecorator
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(AsymptoticTestDecorator.class);
-
- /** The int size parameters to run the test with. */
- private int[] params;
-
- /** The number of times the whole test should be repeated. */
- private int repeat;
-
- /**
- * Creates an asymptotic test decorator that wraps a test with repeats and a set of integer 'size' paramters
- * to call the test with.
- *
- * @param test The test to wrap.
- * @param params The integer 'size' parameters.
- * @param repeat The number of times to repeat the test.
- */
- public AsymptoticTestDecorator(WrappedSuiteTestDecorator test, int[] params, int repeat)
- {
- super(test);
-
- log.debug("public AsymptoticTestDecorator(Test \"" + test + "\", int[] "
- + ((params == null) ? null : MathUtils.printArray(params)) + ", int " + repeat + "): called");
-
- this.params = params;
- this.repeat = repeat;
- }
-
- /**
- * Creates a new AsymptoticTestDecorator object.
- *
- * @param test The test to decorate.
- * @param start The starting asymptotic integer parameter value.
- * @param end The ending asymptotic integer parameter value.
- * @param step The increment size to move from the start to end values by.
- * @param repeat The number of times to repeat the test at each step of the cycle.
- */
- public AsymptoticTestDecorator(WrappedSuiteTestDecorator test, int start, int end, int step, int repeat)
- {
- super(test);
-
- if (start < 0)
- {
- throw new IllegalArgumentException("Start must be >= 0");
- }
-
- if (end < start)
- {
- throw new IllegalArgumentException("End must be >= start");
- }
-
- if (step < 1)
- {
- throw new IllegalArgumentException("Step must be >= 1");
- }
-
- if (repeat < 1)
- {
- throw new IllegalArgumentException("Repeat must be >= 1");
- }
-
- // Generate the sequence.
- params = new int[((end - start) / step) + 1];
- int i = 0;
- for (int n = start; n <= end; n += step)
- {
- params[i++] = n;
- }
-
- this.repeat = repeat;
- }
-
- /**
- * Runs the test repeatedly for each value of the int parameter specified and for the correct number of test
- * repeats.
- *
- * @param result The test result object that the tests will indicate their results to. This is also used
- * to pass the int parameter from this class to the decorated test class.
- */
- public void run(TestResult result)
- {
- log.debug("public void run(TestResult result): called");
-
- if (!(result instanceof TKTestResult))
- {
- throw new IllegalArgumentException("AsymptoticTestDecorator only works with TKTestResult");
- }
-
- // Cast the test result into a TKTestResult to place the current parameter into.
- TKTestResult tkResult = (TKTestResult) result;
-
- log.debug("params = " + ((params == null) ? null : MathUtils.printArray(params)));
- log.debug("repeat = " + repeat);
-
- if(params != null)
- {
- for (int n : params)
- {
- for (int j = 0; j < repeat; j++)
- {
- log.debug("n = " + n);
-
- // Set the integer parameter in the TKTestResult to be passed to the tests.
- tkResult.setN(n);
-
- if (tkResult.shouldStop())
- {
- log.debug("tkResult.shouldStop = " + true);
-
- break;
- }
-
- log.debug("Calling super#run");
- super.run(tkResult);
- }
- }
- }
- }
-
- /**
- * Prints out the name of this test with the string "(parameterized)" appended onto it for debugging purposes.
- *
- * @return The name of this test with the string "(parameterized)" appended onto it.
- */
- public String toString()
- {
- return super.toString() + "(parameterized)";
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BaseThrottle.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BaseThrottle.java
deleted file mode 100644
index 61d5746421..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BaseThrottle.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * Provides a base implementation of the non-waiting throttle checking method, using the system nano timer.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Check against a throttle speed without waiting.
- * </table>
- *
- * @author Rupert Smith
- */
-public abstract class BaseThrottle implements Throttle
-{
- /** Holds the length of a single cycle in nano seconds. */
- protected long cycleTimeNanos;
-
- /** Holds the time of the last succesfull call to the check method. */
- private long lastCheckTimeNanos;
-
- /** Flag used to detect the first call to the {@link #checkThrottle()} method. */
- boolean firstCheckCall = true;
-
- /**
- * Flag used to detect the first call to the {@link #throttle()} method. Zero or negative start time cannot be
- * relied on to detect this as System.nanoTime can return zero or negative values.
- */
- boolean firstCall = true;
-
- /**
- * Specifies the throttling rate in operations per second. This must be called with with a value, the inverse
- * of which is a measurement in nano seconds, such that the number of nano seconds do not overflow a long integer.
- * The value must also be larger than zero.
- *
- * @param hertz The throttling rate in cycles per second.
- */
- public void setRate(float hertz)
- {
- // Check that the argument is above zero.
- if (hertz <= 0.0f)
- {
- throw new IllegalArgumentException("The throttle rate must be above zero.");
- }
-
- // Calculate the cycle time.
- cycleTimeNanos = (long) (1000000000f / hertz);
-
- // Reset the first pass flag.
- firstCall = false;
- firstCheckCall = false;
- }
-
- /**
- * Checks but does not enforce the throttle rate. When this method is called, it checks if a length of time greater
- * than that equal to the inverse of the throttling rate has passed since it was last called and returned <tt>true</tt>
- *
- * @return <tt>true</tt> if a length of time greater than that equal to the inverse of the throttling rate has
- * passed since this method was last called and returned <tt>true</tt>, <tt>false</tt> otherwise. The very
- * first time this method is called on a throttle, it returns <tt>true</tt> as the base case to the above
- * self-referential definition.
- */
- public boolean checkThrottle()
- {
- long now = System.nanoTime();
-
- if ((now > (cycleTimeNanos + lastCheckTimeNanos)) || firstCheckCall)
- {
- firstCheckCall = false;
- lastCheckTimeNanos = now;
-
- return true;
- }
- else
- {
- return false;
- }
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BatchedThrottle.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BatchedThrottle.java
deleted file mode 100644
index 241e7aa2b7..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BatchedThrottle.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * BatchedThrottle is a {@link SleepThrottle} that uses batching to achieve much higher throttling rates than a sleep
- * throttle can. Sleep throttle has difficulties once the rate gets above a few hundred hertz, because the JVM cannot
- * generate timed pauses that are that short. BatchedThrottle gets around this by only inserting pauses once every so
- * many calls to the {@link #throttle()} method, and using a sleep throttle run at a lower rate. The rate for the sleep
- * throttle is chosen so that it remains under 100hz. The final throttling rate of this throttle is equal to the batch
- * size times the rate of the underlying sleep throttle.
- *
- * <p/>The batching calculation involves taking the log to the base 100 of the desired rate and rounding this to
- * an integer. The batch size is always an exact power of 100 because of the rounding. The rate for an underlying
- * sleep throttle is then chosen appropriately.
- *
- * <p/>In practice, the accuracy of a BacthedThrottle skews off but can sometimes even be reasonable up to ten thousand
- * hertz compared with 100 Hz for a {@link SleepThrottle}.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Accept throttling rate in operations per second.
- * <tr><td> Inject short pauses, occasionaly, to fill out processing cycles to a specified rate.
- * <tr><td> Check against a throttle speed without waiting.
- * </table>
- *
- * @todo Should always round the log base 100 down to the nearest integer?
- *
- * @author Rupert Smith
- */
-public class BatchedThrottle extends BaseThrottle
-{
- /** Holds the batch size. */
- int batchSize;
-
- /** The call count within the current batch. */
- long callCount;
-
- /** Holds a sleep throttle configured to run at the batched rate. */
- private Throttle batchRateThrottle = new SleepThrottle();
-
- /**
- * Specifies the throttling rate in operations per second.
- *
- * @param hertz The throttling rate in cycles per second.
- */
- public void setRate(float hertz)
- {
- // Pass the rate unaltered down to the base implementation, for the check method.
- super.setRate(hertz);
-
- // Log base 10 over 2 is used here to get a feel for what power of 100 the total rate is.
- // As the total rate goes up the powers of 100 the batch size goes up by powers of 100 to keep the
- // throttle rate in the range 1 to 100.
- int x = (int) (Math.log10(hertz) / 2);
- batchSize = (int) Math.pow(100, x);
- float throttleRate = hertz / batchSize;
-
- // Reset the call count.
- callCount = 0;
-
- // Set the sleep throttle wrapped implementation at a rate within its abilities.
- batchRateThrottle.setRate(throttleRate);
- }
-
- /**
- * Throttle calls to this method to the rate specified by the {@link #setRate(float)} method.
- */
- public void throttle()
- {
- if ((callCount++ % batchSize) == 0)
- {
- batchRateThrottle.throttle();
- }
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/DurationTestDecorator.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/DurationTestDecorator.java
deleted file mode 100644
index e99fcce752..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/DurationTestDecorator.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-
-import org.apache.log4j.Logger;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-/**
- * A test decorator that runs a test repeatedly until a specified length of time has passed.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Repeatedly run a test for a fixed length of time.
- * </table>
- *
- * @todo The count of the number of tests run is an important number to keep. Also num passed/error/failed is also
- * important to record. What to do with these numbers? They are already logged to the test listeners.
- *
- * @todo The duration test runner wraps on top of size, repeat or thread wrappers, need a way for it to tell
- * TKTestResult when the duration is up, so that it can terminate any repeats in progress. It should end
- * as soon as possible once the test method exits.
- *
- * @author Rupert Smith
- */
-public class DurationTestDecorator extends WrappedSuiteTestDecorator implements ShutdownHookable
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(DurationTestDecorator.class);
-
- /** The test to run. */
- private Test test;
-
- /** The length of time to run the test for. */
- private long duration;
-
- /** Flag set by the shutdown hook. This decorator will not start any new tests when this is set. */
- private boolean shutdown = false;
-
- /**
- * Creates an active test with default multiplier (1).
- *
- * @param test The target test.
- */
- public DurationTestDecorator(WrappedSuiteTestDecorator test)
- {
- super(test);
- this.test = test;
- }
-
- /**
- * Creates active test with default multiplier (1).
- *
- * @param test The target test.
- * @param duration The duration in milliseconds.
- */
- public DurationTestDecorator(WrappedSuiteTestDecorator test, long duration)
- {
- super(test);
-
- // log.debug("public DurationTestDecorator(Test \"" + test + "\", long " + duration + "): called");
-
- this.test = test;
- this.duration = duration;
- }
-
- /**
- * Runs the test repeatedly for the fixed duration.
- *
- * @param testResult The the results object to monitor the test results with.
- */
- public void run(TestResult testResult)
- {
- log.debug("public void run(TestResult testResult): called");
-
-// Removing the durationTimer as this addition prevents this TestDecorator being wrapped with a Scaled Test Decorator.
- // This change will cause the tests to run for at least the specified duration
- // If we need the test to stop much closer to the specified duration then we need to
- // ensure that the solution doesn't prevent this Decorator being wrapped with other Decorators.
-
-// // Cast the test result to expose it as a TKTestResult if the test is running under the TKTestRunner.
-// TKTestResult tkTestResult = null;
-//
-// if (testResult instanceof TKTestResult)
-// {
-// tkTestResult = (TKTestResult) testResult;
-// }
-//
-// // If running under the TKTestRunner, set up a timer to notify the test framework when the test reaches its
-// // completion time.
-// Timer durationTimer = null;
-//
-// if (tkTestResult != null)
-// {
-// log.debug("Creating duration timer.");
-//
-// durationTimer = new Timer();
-// durationTimer.schedule(new DurationTimerTask((TKTestResult) testResult), duration);
-// }
-
-
- // Work out when the test should end.
- long now = System.nanoTime();
- long end = (duration * 1000000) + now;
-
- // Run the test until the duration times out or the shutdown flag is set. The test method may not exit until
- // interrupted in some cases, in which case the timer will do the interrupting.
- while ((now < end) && !shutdown)
- {
- test.run(testResult);
-
- now = System.nanoTime();
- }
-
-// // Clean up any timer that was used.
-// if (durationTimer != null)
-// {
-// log.debug("Cancelling duration timer.");
-//
-// durationTimer.cancel();
-// }
- }
-
- /**
- * Supplies the shutdown hook. This shutdown hook does not call {@link TKTestResult#shutdownNow()} because the
- * {@link ScaledTestDecorator} already takes care of that.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- // log.debug("DurationTestDecorator::ShutdownHook: called");
-
- // Set the shutdown flag so that no new tests are started.
- shutdown = true;
- }
- });
- }
-
-// /**
-// * DurationTimerTask is a timer task that is configured, upon expiry of its timer, to invoke
-// * {@link TKTestResult#shutdownNow()}, for the test result object on which it is set. It also sets
-// * the {@link DurationTestDecorator#shutdown} flag to indicate that no new tests should be run.
-// *
-// * <p/>The test loop implemented by DurationTestDecorator checks that the duration has not expired, on each
-// * test case that it runs. However, it is possible to write test cases that never return until explicitly
-// * interrupted by the test framework. This timer task exists to notify the test framework
-// */
-// private class DurationTimerTask extends TimerTask
-// {
-// /** Used for debugging purposes. */
-// private final Logger log = Logger.getLogger(DurationTimerTask.class);
-//
-// /** Holds the test result for the test to which a duration limit is being applied. */
-// TKTestResult testResult;
-//
-// /**
-// * Creates a duration limit timer which will notify the specified test result when the duration has
-// * expired.
-// *
-// * @param testResult The test result to notify upon expiry of the test duration.
-// */
-// public DurationTimerTask(TKTestResult testResult)
-// {
-// this.testResult = testResult;
-// }
-//
-// /**
-// * The action to be performed by this timer task.
-// */
-// public void run()
-// {
-// log.debug("public void run(): called");
-//
-// shutdown = true;
-// testResult.shutdownNow();
-// }
-// }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/InstrumentedTest.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/InstrumentedTest.java
deleted file mode 100644
index 0804757dce..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/InstrumentedTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.Test;
-
-/**
- * An InstrumentedTest is one which can supply some additional instrumentation on top of the pass/fail/error behaviour
- * of normal junit tests. Tests implementing this interface must additionally supply information about how long they
- * took to run and how much memory they used.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Report test run time.
- * <tr><td> Report test memory usage.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface InstrumentedTest extends Test
-{
- /**
- * Reports how long the test took to run.
- *
- * @return The time in milliseconds that the test took to run.
- */
- public long getTestTime();
-
- /**
- * Reports the memory usage at the start of the test.
- *
- * @return The memory usage at the start of the test.
- */
- public long getTestStartMemory();
-
- /**
- * Reports the memory usage at the end of the test.
- *
- * @return The memory usage at the end of the test.
- */
- public long getTestEndMemory();
-
- /**
- * Resets the instrumentation values to zero, and nulls any references to held measurements so that the memory
- * can be reclaimed.
- */
- public void reset();
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/NullResultPrinter.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/NullResultPrinter.java
deleted file mode 100644
index 6727f6f152..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/NullResultPrinter.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-
-import junit.textui.ResultPrinter;
-
-import java.io.PrintStream;
-
-/**
- * A ResultPrinter that prints nothing. This exists, in order to provide a replacement to JUnit's ResultPrinter, which
- * is refered to directly by JUnit code, rather that as an abstracted TestListener. JUnit's text ui TestRunner must
- * have a ResultPrinter. This provides an implementation of it that prints nothing, so that a better mechanism can
- * be used for providing feedback to the console instead.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td>
- * </table>
- *
- * @todo See todo in TKTestRunner about completely replacing the test ui runner. Doing things like this in order to
- * extend JUnit is not nice, and there needs to be a better way to do it. Delete this class and use a listener
- * instead.
- *
- * @author Rupert Smith
- */
-public class NullResultPrinter extends ResultPrinter
-{
- /**
- * Builds a fake ResultPrinter that prints nothing.
- *
- * @param writer The writer to send output to.
- */
- public NullResultPrinter(PrintStream writer)
- {
- super(writer);
- }
-
- /**
- * Does nothing.
- *
- * @param test Ignored.
- * @param t Ignored.
- */
- public void addError(Test test, Throwable t)
- { }
-
- /**
- * Does nothing.
- *
- * @param test Ignored.
- * @param t Ignored.
- */
- public void addFailure(Test test, AssertionFailedError t)
- { }
-
- /**
- * Does nothing.
- *
- * @param test Ignored.
- */
- public void endTest(Test test)
- { }
-
- /**
- * Does nothing.
- *
- * @param test Ignored.
- */
- public void startTest(Test test)
- { }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ParameterVariationTestDecorator.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ParameterVariationTestDecorator.java
deleted file mode 100644
index 7da4667928..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ParameterVariationTestDecorator.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.TestResult;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.MathUtils;
-
-/**
- * ParameterVariationTestDecorator is a test decorator that runs a test repeatedly under all permutations of its
- * test parameters.
- *
- * a set of integer parameters and a repeat count are specified, then each test is run for the repeat count at each
- * integer parameter.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Repeat a test for each of a set of integer parameters. <td> {@link org.apache.qpid.junit.extensions.TKTestResult}
- * <tr><td> Repeat a test multiple times.
- * <tr><td>
- * </table>
- *
- * @author Rupert Smith
- */
-public class ParameterVariationTestDecorator extends WrappedSuiteTestDecorator
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(ParameterVariationTestDecorator.class);
-
- /** The int size parameters to run the test with. */
- private int[] params;
-
- /** The number of times the whole test should be repeated. */
- private int repeat;
-
- /**
- * Creates an asymptotic test decorator that wraps a test with repeats and a set of integer 'size' paramters
- * to call the test with.
- *
- * @param test The test to wrap.
- * @param params The integer 'size' parameters.
- * @param repeat The number of times to repeat the test.
- */
- public ParameterVariationTestDecorator(WrappedSuiteTestDecorator test, int[] params, int repeat)
- {
- super(test);
-
- log.debug("public AsymptoticTestDecorator(Test \"" + test + "\", int[] "
- + ((params == null) ? null : MathUtils.printArray(params)) + ", int " + repeat + "): called");
-
- this.params = params;
- this.repeat = repeat;
- }
-
- /**
- * Creates a new AsymptoticTestDecorator object.
- *
- * @param test The test to decorate.
- * @param start The starting asymptotic integer parameter value.
- * @param end The ending asymptotic integer parameter value.
- * @param step The increment size to move from the start to end values by.
- * @param repeat The number of times to repeat the test at each step of the cycle.
- */
- public ParameterVariationTestDecorator(WrappedSuiteTestDecorator test, int start, int end, int step, int repeat)
- {
- super(test);
-
- if (start < 0)
- {
- throw new IllegalArgumentException("Start must be >= 0");
- }
-
- if (end < start)
- {
- throw new IllegalArgumentException("End must be >= start");
- }
-
- if (step < 1)
- {
- throw new IllegalArgumentException("Step must be >= 1");
- }
-
- if (repeat < 1)
- {
- throw new IllegalArgumentException("Repeat must be >= 1");
- }
-
- // Generate the sequence.
- params = new int[((end - start) / step) + 1];
- int i = 0;
- for (int n = start; n <= end; n += step)
- {
- params[i++] = n;
- }
-
- this.repeat = repeat;
- }
-
- /**
- * Runs the test repeatedly for each value of the int parameter specified and for the correct number of test
- * repeats.
- *
- * @param result The test result object that the tests will indicate their results to. This is also used
- * to pass the int parameter from this class to the decorated test class.
- */
- public void run(TestResult result)
- {
- log.debug("public void run(TestResult result): called");
-
- if (!(result instanceof TKTestResult))
- {
- throw new IllegalArgumentException("AsymptoticTestDecorator only works with TKTestResult");
- }
-
- // Cast the test result into a TKTestResult to place the current parameter into.
- TKTestResult tkResult = (TKTestResult) result;
-
- log.debug("params = " + ((params == null) ? null : MathUtils.printArray(params)));
- log.debug("repeat = " + repeat);
-
- if(params != null)
- {
- for (int n : params)
- {
- for (int j = 0; j < repeat; j++)
- {
- log.debug("n = " + n);
-
- // Set the integer parameter in the TKTestResult to be passed to the tests.
- tkResult.setN(n);
-
- if (tkResult.shouldStop())
- {
- log.debug("tkResult.shouldStop = " + true);
-
- break;
- }
-
- log.debug("Calling super#run");
- super.run(tkResult);
- }
- }
- }
- }
-
- /**
- * Prints out the name of this test with the string "(parameterized)" appended onto it for debugging purposes.
- *
- * @return The name of this test with the string "(parameterized)" appended onto it.
- */
- public String toString()
- {
- return super.toString() + "(parameterized)";
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ScaledTestDecorator.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ScaledTestDecorator.java
deleted file mode 100644
index 93e2a3c855..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ScaledTestDecorator.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-
-import java.util.concurrent.BrokenBarrierException;
-import java.util.concurrent.CyclicBarrier;
-
-/**
- * A test decorator that runs a test many times simultaneously in many threads.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Clone a test run into many threads and run them simultaneously.
- * <tr><td> Inform the test results of the start and end of each concurrent test batch. <td> {@link TKTestResult}
- * <tr><td> Inform the test results of the concurrency level. <td> {@link TKTestResult}
- * </table>
- *
- * @author Rupert Smith
- */
-public class ScaledTestDecorator extends WrappedSuiteTestDecorator implements ShutdownHookable // TestDecorator
-{
- /** Used for logging. */
- // private static final Logger log = Logger.getLogger(ScaledTestDecorator.class);
-
- /** Determines how long to wait for tests to cleanly exit on shutdown. */
- private static final long SHUTDOWN_PAUSE = 3000;
-
- /**
- * The stress levels or numbers of simultaneous threads to run the test in. The test is repeated at each of
- * the concurrency levels specified here. Defaults to 1 thread.
- */
- private int[] threads = new int[] { 1 };
-
- /** Used to hold the number of tests currently being run in parallel. */
- private int concurrencyLevel;
-
- /** The test to run. */
- private WrappedSuiteTestDecorator test;
-
- /**
- * Used to hold the current {@link TKTestResult} for the tests currently being run. This is made available so that
- * the shutdown hook can ask it to cleanly end the current tests in the event of a shutdown.
- */
- private TKTestResult currentTestResult;
-
- /** Flag set by the shutdown hook. This decorator will not start any new tests when this is set. */
- private boolean shutdown = false;
-
- /**
- * Creates an active test with default multiplier (1).
- *
- * @param test The target test.
- */
- public ScaledTestDecorator(WrappedSuiteTestDecorator test)
- {
- super(test);
- this.test = test;
- }
-
- /**
- * Creates a concurrently scaled test with the specified number of threads.
- *
- * @param test The target test.
- * @param numThreads The stress level.
- */
- public ScaledTestDecorator(WrappedSuiteTestDecorator test, int numThreads)
- {
- this(test, new int[] { numThreads });
- }
-
- /**
- * Creates a concurrently scaled test with the specified thread levels, the test is repeated at each level.
- *
- * @param test The target test.
- * @param threads The concurrency levels.
- */
- public ScaledTestDecorator(WrappedSuiteTestDecorator test, int[] threads)
- {
- super(test);
-
- /*log.debug("public ScaledTestDecorator(WrappedSuiteTestDecorator test = \"" + test + "\", int[] threads = "
- + MathUtils.printArray(threads) + "): called");*/
-
- this.test = test;
- this.threads = threads;
- }
-
- /**
- * Runs the test simultaneously in at the specified concurrency levels.
- *
- * @param testResult The results object to monitor the test results with.
- */
- public void run(TestResult testResult)
- {
- // log.debug("public void run(TestResult testResult = " + testResult + "): called");
-
- // Loop through all of the specified concurrent levels for the test, provided shutdown has not been called.
- for (int i = 0; (i < threads.length) && !shutdown; i++)
- {
- // Get the number of threads for this run.
- int numThreads = threads[i];
-
- // Create test thread handlers for all the threads.
- TestThreadHandler[] threadHandlers = new TestThreadHandler[numThreads];
-
- // Create a cyclic barrier for the test threads to synch their setups and teardowns on.
- CyclicBarrier barrier = new CyclicBarrier(numThreads);
-
- // Set up the test thread handlers to output results to the same test results object.
- for (int j = 0; j < numThreads; j++)
- {
- threadHandlers[j] = new TestThreadHandler(testResult, test, barrier);
- }
-
- // Ensure the concurrency level statistic is set up correctly.
- concurrencyLevel = numThreads;
-
- // Begin batch.
- if (testResult instanceof TKTestResult)
- {
- TKTestResult tkResult = (TKTestResult) testResult;
- // tkResult.notifyStartBatch();
- tkResult.setConcurrencyLevel(numThreads);
-
- // Set the test result for the currently running tests, so that the shutdown hook can call it if necessary.
- currentTestResult = tkResult;
- }
-
- // Run all the tests and wait for them all to finish.
- executeAndWaitForRunnables(threadHandlers);
-
- // Clear the test result for the currently running tests.
- currentTestResult = null;
-
- // End batch.
- if (testResult instanceof TKTestResult)
- {
- TKTestResult tkResult = (TKTestResult) testResult;
- tkResult.notifyEndBatch();
- }
-
- // Clear up all the test threads, they hold references to their associated TestResult object and Test object,
- // which may prevent them from being garbage collected as the TestResult and Test objects are long lived.
- for (int j = 0; j < numThreads; j++)
- {
- threadHandlers[j].testResult = null;
- threadHandlers[j].test = null;
- threadHandlers[j] = null;
- }
- }
- }
-
- /**
- * Reports the number of tests that the scaled decorator is currently running concurrently.
- *
- * @return The number of tests that the scaled decorator is currently running concurrently.
- */
- public int getConcurrencyLevel()
- {
- return concurrencyLevel;
- }
-
- /**
- * Executes all of the specifed runnable using the thread pool and waits for them all to complete.
- *
- * @param runnables The set of runnables to execute concurrently.
- */
- private void executeAndWaitForRunnables(Runnable[] runnables)
- {
- int numThreads = runnables.length;
-
- // Used to keep track of the test threads in order to know when they have all completed.
- Thread[] threads = new Thread[numThreads];
-
- // Create all the test threads.
- for (int j = 0; j < numThreads; j++)
- {
- threads[j] = new Thread(runnables[j]);
- }
-
- // Start all the test threads.
- for (int j = 0; j < numThreads; j++)
- {
- threads[j].start();
- }
-
- // Wait for all the test threads to complete.
- for (int j = 0; j < numThreads; j++)
- {
- try
- {
- threads[j].join();
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted state of the thread.
- Thread.currentThread().interrupt();
- }
- }
- }
-
- /**
- * Supplies the shut-down hook.
- *
- * @return The shut-down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- // log.debug("ScaledTestDecorator::ShutdownHook: called");
-
- // Set the shutdown flag so that no new tests are started.
- shutdown = true;
-
- // Check if tests are currently running, and ask them to complete as soon as possible. Allow
- // a short pause for this to happen.
- TKTestResult testResult = currentTestResult;
-
- if (testResult != null)
- {
- // log.debug("There is a test result currently running tests, asking it to terminate ASAP.");
- testResult.shutdownNow();
-
- try
- {
- Thread.sleep(SHUTDOWN_PAUSE);
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted state of the thread.
- Thread.currentThread().interrupt();
- }
- }
- }
- });
- }
-
- /**
- * Prints a string summarizing this test decorator, mainly for debugging purposes.
- *
- * @return String representation for debugging purposes.
- */
- public String toString()
- {
- return "ScaledTestDecorator: [ test = " + test + ", concurrencyLevel = " + concurrencyLevel + " ]";
- }
-
- /**
- * TestThreadHandler is a runnable used to execute a test in. This is static to avoid implicit 'this' reference to
- * the longer lived ScaledTestDecorator class. The scaled test decorator may execute many repeats but creates fresh
- * handlers for each one. It re-uses the threads in a pool but does not re-use these handlers.
- */
- private static class TestThreadHandler implements Runnable
- {
- /** The test result object for the test to be run with. */
- TestResult testResult;
-
- /** The test to run. */
- WrappedSuiteTestDecorator test;
-
- /** Holds the cyclic barrier to synchronize on the end of the setups and before the tear downs. */
- CyclicBarrier barrier;
-
- /**
- * Creates a new TestThreadHandler object.
- *
- * @param testResult The test result object for the test to be run with.
- * @param test The test to run in a sperate thread.
- * @param barrier The barrier implementation to use to synchronize per-thread setup completion and test
- * completion before moving on through the setup, test, teardown phases. The barrier should
- * be configured for the number of test threads.
- */
- TestThreadHandler(TestResult testResult, WrappedSuiteTestDecorator test, CyclicBarrier barrier)
- {
- this.testResult = testResult;
- this.test = test;
- this.barrier = barrier;
- }
-
- /**
- * Runs the test associated with this pool.
- */
- public void run()
- {
- try
- {
- // Call setup on all underlying tests in the suite that are thread aware.
- for (Test childTest : test.getAllUnderlyingTests())
- {
- // Check that the test is concurrency aware, so provides a setup method to call.
- if (childTest instanceof TestThreadAware)
- {
- // Call the tests per thread setup.
- TestThreadAware setupTest = (TestThreadAware) childTest;
- setupTest.threadSetUp();
- }
- }
-
- // Wait until all test threads have completed their setups.
- barrier.await();
-
-
- // Call setup on all underlying tests in the suite that are thread aware.
- for (Test childTest : test.getAllUnderlyingTests())
- {
- // Check that the test is concurrency aware, so provides a setup method to call.
- if (childTest instanceof TestThreadAware)
- {
- // Call the tests post thread setup.
- TestThreadAware setupTest = (TestThreadAware) childTest;
- setupTest.postThreadSetUp();
- }
- }
-
- // Wait until all test threads have completed their prefill.
- barrier.await();
-
- // Start timing the test batch, only after thread setups have completed.
- if (testResult instanceof TKTestResult)
- {
- ((TKTestResult) testResult).notifyStartBatch();
- }
-
- // Run the tests.
- test.run(testResult);
-
- // Wait unitl all test threads have completed their tests.
- barrier.await();
-
- // Call tear down on all underlying tests in the suite that are thread aware.
- for (Test childTest : test.getAllUnderlyingTests())
- {
- // Check that the test is concurrency aware, so provides a teardown method to call.
- if (childTest instanceof TestThreadAware)
- {
- // Call the tests per thread tear down.
- TestThreadAware setupTest = (TestThreadAware) childTest;
- setupTest.threadTearDown();
- }
- }
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted state of the thread.
- Thread.currentThread().interrupt();
- }
- catch (BrokenBarrierException e)
- {
- // Set the interrupted state on the thread. The BrokenBarrierException may be caused where one thread
- // waiting for the barrier is interrupted, causing the remaining threads correctly waiting on the
- // barrier to fail. This condition is expected during test interruptions, and the response to it is to
- // interrupt all the other threads running in the same scaled test.
- Thread.currentThread().interrupt();
- }
- }
-
- /**
- * Prints the name of the test for debugging purposes.
- *
- * @return The name of the test.
- */
- public String toString()
- {
- return "ScaledTestDecorator: [test = \"" + test + "\"]";
- }
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskAware.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskAware.java
deleted file mode 100644
index e462145d7d..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskAware.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * SetupTaskAware is an interface that tests that can accept injectable setup tasks may implement. Typically this
- * is used by configurable decorator stack to inject setup tasks into tests. It is then up to the test case to run
- * the tasks in the setup or threadSetup methods as it chooses.
- *
- * <p/>Set up tasks should be chained so that they are executed in the order that they are applied. Tear down tasks
- * should be chained so that they are executed in the reverse order to which they are applied. That way the set up and
- * tear down tasks act as a 'task' stack, with nested setups and tear downs.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities.
- * <tr><td> Handle injection of set up tasks.
- * <tr><td> Handle injection of tear down tasks.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface SetupTaskAware
-{
- /**
- * Adds the specified task to the tests setup.
- *
- * @param task The task to add to the tests setup.
- */
- public void chainSetupTask(Runnable task);
-
- /**
- * Adds the specified task to the tests tear down.
- *
- * @param task The task to add to the tests tear down.
- */
- public void chainTearDownTask(Runnable task);
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskHandler.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskHandler.java
deleted file mode 100644
index 631f4dcdf0..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskHandler.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import org.apache.qpid.junit.extensions.util.StackQueue;
-
-import java.util.LinkedList;
-import java.util.Queue;
-
-/**
- * SetupTaskHandler implements a task stack. It can be used, by delegation, as a base implementation for tests that want
- * to have configurable setup/teardown task stacks. Typically it is up to the test implementation to decide whether the
- * stack is executed in the setup/teardown methods or in the threadSetup/threadTeaddown methods.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Handle injection of set up tasks.
- * <tr><td> Handle injection of tear down tasks.
- * <tr><td> Run set up tasks in chain order.
- * <tr><td> Run tear down tasks in reverse chain order.
- * </table>
- *
- * @author Rupert Smith
- */
-public class SetupTaskHandler implements SetupTaskAware
-{
- /** Holds the set up tasks. */
- private Queue<Runnable> setups = new LinkedList<Runnable>();
-
- /** Holds the tear down tasks. */
- private Queue<Runnable> teardowns = new StackQueue<Runnable>();
-
- /**
- * Adds the specified task to the tests setup.
- *
- * @param task The task to add to the tests setup.
- */
- public void chainSetupTask(Runnable task)
- {
- setups.offer(task);
- }
-
- /**
- * Adds the specified task to the tests tear down.
- *
- * @param task The task to add to the tests tear down.
- */
- public void chainTearDownTask(Runnable task)
- {
- teardowns.offer(task);
- }
-
- /**
- * Runs the set up tasks in the order that they way chained.
- */
- public void runSetupTasks()
- {
- while (!setups.isEmpty())
- {
- setups.remove().run();
- }
- }
-
- /**
- * Runs the tear down tasks in the reverse of the order in which they were chained.
- */
- public void runTearDownTasks()
- {
- while (!teardowns.isEmpty())
- {
- teardowns.remove().run();
- }
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ShutdownHookable.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ShutdownHookable.java
deleted file mode 100644
index dc6aa3c291..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ShutdownHookable.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * Defines an interface that classes which supply shutdown hooks implement. Code that creates these classes can check
- * if they supply a shutdown hook and register these hooks when the obejct are created.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Supply a shutdown hook.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface ShutdownHookable
-{
- /**
- * Supplies the shutdown hook.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook();
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SleepThrottle.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SleepThrottle.java
deleted file mode 100644
index 2dc4c0e272..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SleepThrottle.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * SleepThrottle is a Throttle implementation that generates short pauses using the thread sleep methods. As the pauses
- * get shorter, this technique gets more innacurate. In practice, around 100 Hz is the cap rate for accuracy.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Accept throttling rate in operations per second.
- * <tr><td> Inject short pauses to fill out processing cycles to a specified rate.
- * <tr><td> Check against a throttle speed without waiting.
- * </table>
- *
- * @author Rupert Smith
- */
-public class SleepThrottle extends BaseThrottle implements Throttle
-{
- /** Holds the time of the last call to the throttle method in nano seconds. */
- private long lastTimeNanos;
-
- /**
- * This method can only be called at the rate set by the {@link #setRate} method, if it is called faster than this
- * it will inject short pauses to restrict the call rate to that rate.
- */
- public void throttle()
- {
- // Get the current time in nanos.
- long currentTimeNanos = System.nanoTime();
-
- // Don't introduce any pause on the first call.
- if (!firstCall)
- {
- // Check if there is any time left in the cycle since the last call to this method and introduce a short pause
- // to fill that time if there is.
- long remainingTimeNanos = cycleTimeNanos - (currentTimeNanos - lastTimeNanos);
-
- if (remainingTimeNanos > 0)
- {
- long milliPause = remainingTimeNanos / 1000000;
- int nanoPause = (int) (remainingTimeNanos % 1000000);
-
- try
- {
- Thread.sleep(milliPause, nanoPause);
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted thread, in-case the caller is checking for it.
- Thread.currentThread().interrupt();
- }
- }
- }
- else
- {
- firstCall = false;
- }
-
- // Update the last time stamp.
- lastTimeNanos = System.nanoTime();
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestResult.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestResult.java
deleted file mode 100644
index 5ce56a690e..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestResult.java
+++ /dev/null
@@ -1,654 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestResult;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.listeners.TKTestListener;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Properties;
-
-/**
- * TKTestResult extends TestResult in order to calculate test timings, to pass the variable integer parameter for
- * parameterized test cases to those test cases and to introduce an optional delay before test starts. Interested
- * {@link TKTestListener}s may be attached to this and will be informed of all relevant test statistics.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Calculate test timings.
- * <tr><td> Inform timing listeners of timings.
- * <tr><td> Inform memory listeners of memory readings.
- * <tr><td> Inform parameters listeners of parameters.
- * <tr><td> Pass the integer parameter to parameterized test cases.
- * <tr><td> Provide verbose test information on test start and end.
- * </table>
- *
- * @todo Move the verbose test information on test start/end into a test listener instead. It confuses the intention
- * of this class. Could also move the delay into a listener but that seems less appropriate as it would be a
- * side-effecting listener. Delay and timing calculation are fundamental enough to this class.
- *
- * @todo The need for this class to act as a place-holder for the integer parameter for parameterized test cases is
- * because this behaviour has been factored out into a test decorator class, see {@link AsymptoticTestDecorator}.
- * The {@link AsymptoticTestDecorator#run} method takes a TestResult as an argument and cannot easily get to the
- * {@link AsymptoticTestCase} class other than through this class. The option of using this class as a place hold
- * for this value was chosen. Alternatively this class could provide a method for decorators to access the
- * underlying test case through and then leave the setting of this parameter to the decorator which is a more
- * natural home for this behaviour. It would also provide a more general framework for decorators.
- *
- * @todo The memory usage may need to be moved in closer to the test method invocation so that as little code as possible
- * exists between it and the test or the results may be obscured. In fact it certainly does as the teardown method
- * is getting called first. Wouldn't be a bad idea to move the timing code in closer too.
- *
- * @todo Get rid of the delay logic. Will be replaced by throttle control.
- *
- * @author Rupert Smith
- */
-public class TKTestResult extends TestResult
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(TKTestResult.class);
-
- /** The delay between two tests. */
- private int delay = 0;
-
- /**
- * This flag indicates that the #completeTest method of the timing controller has been called. Once this has
- * been called once, the end test event for the whole test method should be ignored because tests have taken
- * charge of outputing their own timings.
- */
- private boolean completeTestUsed = false;
-
- /**
- * Thread locals to hold test start time for non-instrumented tests. (Instrumented tests hold their own
- * measurement data).
- */
- // private Hashtable threadStartTimeMap = new Hashtable();
- private ThreadLocal<ThreadLocalSettings> threadLocals = new ThreadLocal<ThreadLocalSettings>();
-
- /** Used to hold the current integer parameter to pass to parameterized tests. This defaults to 1. */
- private int n = 1;
-
- /** The timing listeners. */
- private Collection<TKTestListener> tkListeners;
-
- /** The test case name. */
- private String testCaseName;
-
- /** Used to hold the current concurrency level, set by the {@link ScaledTestDecorator}. */
- private int concurrencyLevel = 1;
-
- /** Flag used to indicate that this test result should attempt to complete its current tests as soon as possible. */
- private boolean shutdownNow = false;
-
- /** Holds the parametes that the test is run with. */
- private Properties testParameters;
-
- /**
- * Creates a new TKTestResult object.
- *
- * @param delay A delay in milliseconds to introduce before every test start.
- * @param testCaseName The name of the test case that this is the TestResult object for.
- */
- public TKTestResult(int delay, String testCaseName)
- {
- super();
-
- /*log.debug("public TKTestResult(PrintStream writer, int " + delay + ", boolean " + verbose + ", String "
- + testCaseName + "): called");*/
-
- // Keep all the parameters that this is created with.
- this.delay = delay;
- this.testCaseName = testCaseName;
- }
-
- /**
- * Callback method use to inform this test result that a test will be started. Waits for the configured delay time
- * if one has been set, starts the timer, then delegates to the super class implementation.
- *
- * @param test The test to be started.
- */
- public void startTest(Test test)
- {
- // log.debug("public void startTest(Test test): called");
-
- // If a delay time has been specified then wait for that length of time.
- if (this.delay > 0)
- {
- try
- {
- Thread.sleep(delay);
- }
- catch (InterruptedException e)
- {
- // Ignore, but restore the interrupted flag.
- Thread.currentThread().interrupt();
- }
- }
-
- // Create the thread local settings for the test.
- ThreadLocalSettings threadLocalSettings = new ThreadLocalSettings();
- threadLocals.set(threadLocalSettings);
-
- // Record the test start time against this thread for calculating the test timing. (Consider using ThreadLocal
- // instead?)
- Long startTime = System.nanoTime();
- threadLocalSettings.startTime = startTime;
- // log.debug("startTime = " + startTime);
-
- // Check if the test is timing controller aware, in which case set up a new timing controller and hold it
- // in the thread local settings.
- if (test instanceof TimingControllerAware)
- {
- TimingControllerAware controllerAware = (TimingControllerAware) test;
- TimingControllerImpl controller =
- new TimingControllerImpl(this, test, startTime, Thread.currentThread().getId());
- controllerAware.setTimingController(controller);
-
- threadLocalSettings.timingController = controller;
- }
-
- // Delegate to the super method to notify test event listeners.
- super.startTest(test);
- }
-
- /**
- * Callback method use to inform this result that a test was completed. This calculates how long the test took
- * to run, then delegates to the super class implementation.
- *
- * @param test The test that has ended.
- */
- public void endTest(Test test)
- {
- // log.debug("public void endTest(Test test): called");
-
- long runTime = 0;
-
- // Recover the thread local settings.
- ThreadLocalSettings threadLocalSettings = threadLocals.get();
-
- // Check if the test is an instrumented test and get the timing information from the instrumentation as this
- // will be more accurate.
- if (test instanceof InstrumentedTest)
- {
- InstrumentedTest iTest = (InstrumentedTest) test;
-
- // Calculate the test run time.
- runTime = iTest.getTestTime();
- // log.debug("runTime = " + runTime);
-
- // Calculate the test memory usage.
- long startMem = iTest.getTestStartMemory();
- long endMem = iTest.getTestEndMemory();
-
- // log.debug("startMem = " + startMem);
- // log.debug("endMem = " + endMem);
-
- // Inform any memory listeners of the test memory.
- if (tkListeners != null)
- {
- for (TKTestListener memoryListener : tkListeners)
- {
- memoryListener.memoryUsed(test, startMem, endMem, null);
- }
- }
- }
- else
- {
- // Calculate the test run time.
- long endTime = System.nanoTime();
- Long startTime = threadLocalSettings.startTime;
- runTime = endTime - startTime;
- // log.debug("runTime = " + runTime);
-
- threadLocals.remove();
- }
-
- // Output end test stats. This is only done when the tests have not used the timing controller to output
- // mutiple timings.
- if (!completeTestUsed)
- {
- // Check if the test is an asymptotic test case and get its int parameter if so.
- if (test instanceof AsymptoticTestCase)
- {
- AsymptoticTestCase pTest = (AsymptoticTestCase) test;
-
- // Set the parameter.
- int paramValue = pTest.getN();
-
- // Inform any parameter listeners of the test parameter.
- if (tkListeners != null)
- {
- for (TKTestListener parameterListener : tkListeners)
- {
- parameterListener.parameterValue(test, paramValue, null);
- }
- }
- }
-
- // Inform any timing listeners of the test timing and concurrency level.
- if (tkListeners != null)
- {
- for (TKTestListener tkListener : tkListeners)
- {
- TKTestListener next = tkListener;
-
- next.timing(test, runTime, null);
- next.concurrencyLevel(test, concurrencyLevel, null);
- }
- }
-
- // Call the super method to notify test event listeners of the end event.
- super.endTest(test);
- }
- }
-
- /**
- * Gets the integer parameter to pass to parameterized test cases.
- *
- * @return The value of the integer parameter.
- */
- public int getN()
- {
- return n;
- }
-
- /**
- * Sets the integer parameter to pass to parameterized test cases.
- *
- * @param n The new value of the integer parameter.
- */
- public void setN(int n)
- {
- // log.debug("public void setN(int " + n + "): called");
-
- this.n = n;
- }
-
- /**
- * Adds a timing listener to pass all timing events to.
- *
- * @param listener The timing listener to register.
- */
- public void addTKTestListener(TKTestListener listener)
- {
- // Create the collection to hold the timing listeners if it does not already exist.
- if (tkListeners == null)
- {
- tkListeners = new ArrayList<TKTestListener>();
- }
-
- // Keep the new timing listener.
- tkListeners.add(listener);
- }
-
- /**
- * Called by the test runner to notify this that a new test batch is being begun. This method forwards this
- * notification to all batch listeners.
- */
- public void notifyStartBatch()
- {
- if (tkListeners != null)
- {
- for (TKTestListener batchListener : tkListeners)
- {
- batchListener.startBatch();
- }
- }
- }
-
- /**
- * Called by the test runner to notify this that the current test batch has been ended. This method forwards this
- * notification to all batch listener.
- */
- public void notifyEndBatch()
- {
- // log.debug("public void notifyEndBatch(): called");
-
- if (tkListeners != null)
- {
- for (TKTestListener batchListener : tkListeners)
- {
- batchListener.endBatch(testParameters);
- }
- }
- }
-
- /**
- * Called by the test runner to notify this of the properties that the test is using.
- *
- * @param properties The tests set/read properties.
- */
- public void notifyTestProperties(Properties properties)
- {
- // log.debug("public void notifyTestProperties(Properties properties): called");
-
- this.testParameters = properties;
-
- /*
- if (tkListeners != null)
- {
- for (TKTestListener batchListener : tkListeners)
- {
- batchListener.properties(properties);
- }
- }
- */
- }
-
- /**
- * Intercepts the execution of a test case to pass the variable integer parameter to a test if it is a parameterized
- * test case.
- *
- * @param test The test to run.
- */
- protected void run(final TestCase test)
- {
- // log.debug("protected void run(final TestCase test): called");
-
- // Check if the test case is a parameterized test and set its integer parameter if so.
- if (test instanceof AsymptoticTestCase)
- {
- AsymptoticTestCase pTest = (AsymptoticTestCase) test;
-
- // Set up the integer parameter.
- pTest.setN(n);
- }
-
- // Delegate to the super method to run the test.
- super.run(test);
- }
-
- /**
- * Helper method that generats a String of verbose information about a test. This includes the thread name, test
- * class name and test method name.
- *
- * @param test The test to generate the info string for.
- *
- * @return Returns a string with the thread name, test class name and test method name.
- */
- protected String getTestInfo(Test test)
- {
- // log.debug("protected String getTestInfo(Test test): called");
-
- return "[" + Thread.currentThread().getName() + "@" + test.getClass().getName() + "."
- + ((test instanceof TestCase) ? ((TestCase) test).getName() : "") + "]";
- }
-
- /**
- * Sets the concurrency level to pass into the test result.
- *
- * @param concurrencyLevel The concurrency level the tests are running out.
- */
- public void setConcurrencyLevel(int concurrencyLevel)
- {
- this.concurrencyLevel = concurrencyLevel;
- }
-
- /**
- * Tells this test result that it should stop running tests. Once this method has been called this test result
- * will not start any new tests, and any tests that use the timing controller will be passed interrupted exceptions,
- * to indicate that they should end immediately. Usually the caller of this method will introduce a short wait
- * to allow an opporunity for running tests to complete, before forcing the shutdown of the JVM.
- */
- public void shutdownNow()
- {
- log.debug("public void shutdownNow(): called on " + this);
-
- shutdownNow = true;
- }
-
- /**
- * Prints a string summary of this class, mainly for debugging purposes.
- *
- * @return A string summary of this class, mainly for debugging purposes.
- */
- public String toString()
- {
- return "TKTestResult@" + Integer.toString(hashCode(), 16) + ": [ testCaseName = " + testCaseName + ", n = " + n
- + ", tkListeners = " + tkListeners + " ]";
- }
-
- /**
- * Holds things that need to be kept on a per thread basis for each test invocation, such as the test start
- * time and its timing controller.
- */
- private static class ThreadLocalSettings
- {
- /** Holds the test start time. */
- Long startTime;
-
- /** Holds the test threads timing controller. */
- TimingController timingController;
- }
-
- /**
- * Provides an implementation of the {@link TimingController} interface that timing aware tests can use to call
- * back to reset timers, and register additional test timings.
- */
- private static class TimingControllerImpl implements TimingController
- {
- /** Holds an explicit reference to the test TKTestResult that created this. */
- TKTestResult testResult;
-
- /** Holds a reference to the test that this is the timing controller for. */
- Test test;
-
- /** Holds the start time for this timing controller. This gets reset to now on each completed test. */
- long startTime;
-
- /**
- * Holds the thread id of the thread that started the test, so that this controller may be called from other
- * threads but still identify itself correctly to {@link TKTestListener}s as being associated with the
- * thread that called the test method.
- */
- long threadId;
-
- /**
- * Creates a timing controller on a specified TKTestResult and a test.
- *
- * @param testResult The TKTestResult that this controller interacts with.
- * @param test The test that this is the timing controller for.
- * @param startTime The test start time in nanoseconds.
- * @param threadId The thread id of the thread that is calling the test method.
- */
- public TimingControllerImpl(TKTestResult testResult, Test test, long startTime, long threadId)
- {
- this.testResult = testResult;
- this.test = test;
- this.startTime = startTime;
- this.threadId = threadId;
- }
-
- /**
- * Gets the timing controller associated with the current test thread. Tests that use timing controller should
- * always get the timing controller from this method in the same thread that called the setUp, tearDown or test
- * method. The controller returned by this method may be called from any thread because it remembers the thread
- * id of the original test thread.
- *
- * @return The timing controller associated with the current test thread.
- */
- public TimingController getControllerForCurrentThread()
- {
- // Recover the thread local settings and extract the timing controller from them.
- ThreadLocalSettings threadLocalSettings = testResult.threadLocals.get();
-
- return threadLocalSettings.timingController;
- }
-
- /**
- * Not implemented yet.
- *
- * @return Nothing.
- */
- public long suspend()
- {
- throw new RuntimeException("Method not implemented.");
- }
-
- /**
- * Not implemented yet.
- *
- * @return Nothing.
- */
- public long resume()
- {
- throw new RuntimeException("Method not implemented.");
- }
-
- /**
- * Resets the timer start time to now.
- *
- * @return The new value of the start time.
- */
- public long restart()
- {
- startTime = System.nanoTime();
-
- return startTime;
- }
-
- /**
- * Register an additional pass/fail for the current test. The test result is assumed to apply to a test of
- * 'size' parmeter 1. Use the {@link #completeTest(boolean, int)} method to register timings with parameters.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed) throws InterruptedException
- {
- completeTest(testPassed, 1);
- }
-
- /**
- * Register an additional pass/fail for the current test. The test result is applies to a test of the specified
- * 'size' parmeter.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- * @param param The test parameter size for parameterized tests.
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed, int param) throws InterruptedException
- {
- completeTest(testPassed, param, null, null);
- }
-
- /**
- * Register an additional pass/fail for the current test. The test result is applies to a test of the specified
- * 'size' parmeter and allows the caller to sepecify the timing to log.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- * @param param The test parameter size for parameterized tests.
- * @param timeNanos The time in nano-seconds to log the test result with.
- *
- * A null value for timeNanos is a request to this method that it should
- * calculate the time for the given test run.
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed, int param, Long timeNanos) throws InterruptedException
- {
- completeTest(testPassed, param, timeNanos, null);
- }
-
- /**
- * Register an additional pass/fail for the current test. The test result is applies to a test of the specified
- * 'size' parmeter and allows the caller to sepecify the timing to log.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- * @param param The test parameter size for parameterized tests.
- * @param timeNanos The time in nano seconds to log the test result with.
- *
- * A null value for timeNanos is a request to this method that it should
- * calculate the time for the given test run.
- * A null value for timeNanos2 means this test does not provide a second
- * timing value so a '-' is printed in the log.
- *
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed, int param, Long timeNanos, Long time2Nanos) throws InterruptedException
- {
- log.debug("public void completeTest(boolean testPassed, int param, long timeNanos): called");
- log.debug("testResult = " + testResult);
-
- /*log.debug("public long completeTest(boolean testPassed = " + testPassed + ", int param = " + param
- + "): called");*/
-
- // Calculate the test run time.
- long endTime = System.nanoTime();
- long runTime = endTime - startTime;
- startTime = endTime;
-
- //
- if (timeNanos != null)
- {
- runTime = timeNanos;
- }
-
- // Tell the test result that completeTest has been used, so to not register end test events for the whole
- // test method.
- testResult.completeTestUsed = true;
-
- // Inform any timing listeners of the test timings and parameters and send an end test notification using
- // the thread id of the thread that started the test.
- if (testResult.tkListeners != null)
- {
- for (TKTestListener listener : testResult.tkListeners)
- {
- listener.reset(test, threadId);
- listener.timing(test, runTime, threadId);
- listener.timing2(test, time2Nanos, threadId);
- listener.parameterValue(test, param, threadId);
- listener.concurrencyLevel(test, testResult.concurrencyLevel, threadId);
-
- if (!testPassed)
- {
- listener.addFailure(test, null, threadId);
- }
-
- listener.endTest(test, threadId);
- }
- }
-
- // log.debug("testResult.shutdownNow = " + testResult.shutdownNow);
-
- // Check if the test runner has been asked to shutdown and raise an interuppted exception if so.
- if (testResult.shutdownNow)
- {
- // log.debug("The shutdown flag is set.");
-
- throw new InterruptedException("Attempting clean shutdown by suspending current test.");
- }
- }
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestRunner.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestRunner.java
deleted file mode 100644
index 671d33feed..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestRunner.java
+++ /dev/null
@@ -1,694 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.listeners.CSVTestListener;
-import org.apache.qpid.junit.extensions.listeners.ConsoleTestListener;
-import org.apache.qpid.junit.extensions.listeners.XMLTestListener;
-import org.apache.qpid.junit.extensions.util.CommandLineParser;
-import org.apache.qpid.junit.extensions.util.MathUtils;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-
-import java.io.*;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * TKTestRunner extends {@link junit.textui.TestRunner} with the ability to run tests multiple times, to execute a test
- * simultaneously using many threads, to put a delay between test runs and adds support for tests that take integer
- * parameters that can be 'stepped' through on multiple test runs. These features can be accessed by using this class
- * as an entry point and passing command line arguments to specify which features to use:
- *
- * <pre>
- * -w ms The number of milliseconds between invocations of test cases.
- * -c pattern The number of tests to run concurrently.
- * -r num The number of times to repeat each test.
- * -d duration The length of time to run the tests for.
- * -t name The name of the test case to execute.
- * -s pattern The size parameter to run tests with.
- * -o dir The name of the directory to output test timings to.
- * --csv Output test results in CSV format.
- * --xml Output test results in XML format.
- * </pre>
- *
- * <p/>This command line may also have trailing 'name=value' parameters added to it. All of these values are added
- * to the test context properties and passed to the test, which can access them by name.
- *
- * <p/>The pattern arguments are of the form [lowest(: ...)(: highest)](:sample=s)(:exp), where round brackets
- * enclose optional values. Using this pattern form it is possible to specify a single value, a range of values divided
- * into s samples, a range of values divided into s samples but distributed exponentially, or a fixed set of samples.
- *
- * <p/>The duration arguments are of the form (dD)(hH)(mM)(sS), where round brackets enclose optional values. At least
- * one of the optional values must be present.
- *
- * <p/>When specifying optional test parameters on the command line, in 'name=value' format, it is also possible to use
- * the format 'name=[value1:value2:value3:...]', to specify multiple values for a parameter. All permutations of all
- * parameters with multiple values will be created and tested. If the values are numerical, it is also possible to use
- * the sequence generation patterns instead of fully specifying all of the values.
- *
- * <p/>Here are some examples:
- *
- * <p/><table>
- * <tr><td><pre> -c [10:20:30:40:50] </pre><td> Runs the test with 10,20,...,50 threads.
- * <tr><td><pre> -s [1:100]:samples=10 </pre>
- * <td> Runs the test with ten different size parameters evenly spaced between 1 and 100.
- * <tr><td><pre> -s [1:1000000]:samples=10:exp </pre>
- * <td> Runs the test with ten different size parameters exponentially spaced between 1 and 1000000.
- * <tr><td><pre> -r 10 </pre><td> Runs each test ten times.
- * <tr><td><pre> -d 10H </pre><td> Runs the test repeatedly for 10 hours.
- * <tr><td><pre> -d 1M, -r 10 </pre>
- * <td> Runs the test repeatedly for 1 minute but only takes a timing sample every 10 test runs.
- * <tr><td><pre> -r 10, -c [1:5:10:50], -s [100:1000:10000] </pre>
- * <td> Runs 12 test cycles (4 concurrency samples * 3 size sample), with 10 repeats each. In total the test
- * will be run 199 times (3 + 15 + 30 + 150)
- * <tr><td><pre> cache=true </pre><td> Passes the 'cache' parameter with value 'true' to the test.
- * <tr><td><pre> cache=[true:false] </pre><td> Runs the test with the 'cache' parameter set to 'true' and 'false'.
- * <tr><td><pre> cacheSize=[1000:1000000],samples=4,exp </pre>
- * <td> Runs the test with the 'cache' parameter set to a series of exponentially increasing sizes.
- * </table>
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create the test configuration specified by the command line parameters.
- * </table>
- *
- * @todo Verify that the output directory exists or can be created.
- *
- * @todo Verify that the specific named test case to execute exists.
- *
- * @todo Drop the delay parameter as it is being replaced by throttling.
- *
- * @todo Completely replace the test ui test runner, instead of having TKTestRunner inherit from it, its just not
- * good code to extend.
- *
- * @author Rupert Smith
- */
-public class TKTestRunner extends TestRunnerImprovedErrorHandling
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TKTestRunner.class);
-
- /** Used for displaying information on the console. */
- // private static final Logger console = Logger.getLogger("CONSOLE." + TKTestRunner.class.getName());
-
- /** Used for generating the timestamp when naming output files. */
- protected static final DateFormat TIME_STAMP_FORMAT = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss");
-
- /** Number of times to rerun the test. */
- protected Integer repetitions = 1;
-
- /** The length of time to run the tests for. */
- protected Long duration;
-
- /** Number of threads running the tests. */
- protected int[] threads;
-
- /** Delay in ms to wait between two test cases. */
- protected int delay = 0;
-
- /** The parameter values to pass to parameterized tests. */
- protected int[] params;
-
- /** Name of the single test case to execute. */
- protected String testCaseName = null;
-
- /** Name of the test class. */
- protected String testClassName = null;
-
- /** Name of the test run. */
- protected String testRunName = null;
-
- /** Directory to output XML reports into, if specified. */
- protected String reportDir = null;
-
- /** Flag that indicates the CSV results listener should be used to output results. */
- protected boolean csvResults;
-
- /** Flag that indiciates the XML results listener should be used to output results. */
- protected boolean xmlResults;
-
- /**
- * Holds the name of the class of the test currently being run. Ideally passed into the {@link #createTestResult}
- * method, but as the signature is already fixed for this, the current value gets pushed here as a member variable.
- */
- protected String currentTestClassName;
-
- /** Holds the test results object, which is reponsible for instrumenting tests/threads to record results. */
- protected TKTestResult result;
-
- /** Holds a list of factories for instantiating optional user specified test decorators. */
- protected List<TestDecoratorFactory> decoratorFactories;
-
- /**
- * Constructs a TKTestRunner using System.out for all the output.
- *
- * @param repetitions The number of times to repeat the test, or test batch size.
- * @param duration The length of time to run the tests for. -1 means no duration has been set.
- * @param threads The concurrency levels to ramp up to.
- * @param delay A delay in milliseconds between test runs.
- * @param params The sets of 'size' parameters to pass to test.
- * @param testCaseName The name of the test case to run.
- * @param reportDir The directory to output the test results to.
- * @param runName The name of the test run; used to name the output file.
- * @param csvResults <tt>true</tt> if the CSV results listener should be attached.
- * @param xmlResults <tt>true</tt> if the XML results listener should be attached.
- * @param decoratorFactories List of factories for user specified decorators.
- */
- public TKTestRunner(Integer repetitions, Long duration, int[] threads, int delay, int[] params, String testCaseName,
- String reportDir, String runName, boolean csvResults, boolean xmlResults,
- List<TestDecoratorFactory> decoratorFactories)
- {
- super(new NullResultPrinter(System.out));
-
- log.debug("public TKTestRunner(): called");
-
- // Keep all the test parameters.
- this.repetitions = repetitions;
- this.duration = duration;
- this.threads = threads;
- this.delay = delay;
- this.params = params;
- this.testCaseName = testCaseName;
- this.reportDir = reportDir;
- this.testRunName = runName;
- this.csvResults = csvResults;
- this.xmlResults = xmlResults;
- this.decoratorFactories = decoratorFactories;
- }
-
- /**
- * The entry point for the toolkit test runner.
- *
- * @param args The command line arguments.
- */
- public static void main(String[] args)
- {
- // Use the command line parser to evaluate the command line.
- CommandLineParser commandLine =
- new CommandLineParser(
- new String[][]
- {
- { "w", "The number of milliseconds between invocations of test cases.", "ms", "false" },
- { "c", "The number of tests to run concurrently.", "num", "false", MathUtils.SEQUENCE_REGEXP },
- { "r", "The number of times to repeat each test.", "num", "false" },
- { "d", "The length of time to run the tests for.", "duration", "false", MathUtils.DURATION_REGEXP },
- { "f", "The maximum rate to call the tests at.", "frequency", "false", "^([1-9][0-9]*)/([1-9][0-9]*)$" },
- { "s", "The size parameter to run tests with.", "size", "false", MathUtils.SEQUENCE_REGEXP },
- { "t", "The name of the test case to execute.", "name", "false" },
- { "o", "The name of the directory to output test timings to.", "dir", "false" },
- { "n", "A name for this test run, used to name the output file.", "name", "true" },
- {
- "X:decorators", "A list of additional test decorators to wrap the tests in.",
- "\"class.name[:class.name]*\"", "false"
- },
- { "1", "Test class.", "class", "true" },
- { "-csv", "Output test results in CSV format.", null, "false" },
- { "-xml", "Output test results in XML format.", null, "false" }
- });
-
- // Capture the command line arguments or display errors and correct usage and then exit.
- ParsedProperties options = null;
-
- try
- {
- options = new ParsedProperties(commandLine.parseCommandLine(args));
- }
- catch (IllegalArgumentException e)
- {
- System.out.println(commandLine.getErrors());
- System.out.println(commandLine.getUsage());
- System.exit(FAILURE_EXIT);
- }
-
- // Extract the command line options.
- Integer delay = options.getPropertyAsInteger("w");
- String threadsString = options.getProperty("c");
- Integer repetitions = options.getPropertyAsInteger("r");
- String durationString = options.getProperty("d");
- String paramsString = options.getProperty("s");
- String testCaseName = options.getProperty("t");
- String reportDir = options.getProperty("o");
- String testRunName = options.getProperty("n");
- String decorators = options.getProperty("X:decorators");
- String testClassName = options.getProperty("1");
- boolean csvResults = options.getPropertyAsBoolean("-csv");
- boolean xmlResults = options.getPropertyAsBoolean("-xml");
-
- int[] threads = (threadsString == null) ? null : MathUtils.parseSequence(threadsString);
- int[] params = (paramsString == null) ? null : MathUtils.parseSequence(paramsString);
- Long duration = (durationString == null) ? null : MathUtils.parseDuration(durationString);
-
- // The test run name defaults to the test class name unless a value was specified for it.
- testRunName = (testRunName == null) ? testClassName : testRunName;
-
- // Add all the command line options and trailing settings to test context properties. Tests may pick up
- // overridden values from there, and these values will be logged in the test results, for analysis and
- // to make tests repeatable.
- commandLine.addTrailingPairsToProperties(TestContextProperties.getInstance());
- commandLine.addOptionsToProperties(TestContextProperties.getInstance());
-
- // Create and start the test runner.
- try
- {
- // Create a list of test decorator factories for use specified decorators to be applied.
- List<TestDecoratorFactory> decoratorFactories = parseDecorators(decorators);
-
- TKTestRunner testRunner =
- new TKTestRunner(repetitions, duration, threads, (delay == null) ? 0 : delay, params, testCaseName,
- reportDir, testRunName, csvResults, xmlResults, decoratorFactories);
-
- TestResult testResult = testRunner.start(testClassName);
-
- if (!testResult.wasSuccessful())
- {
- System.exit(FAILURE_EXIT);
- }
- }
- catch (Exception e)
- {
- System.err.println(e.getMessage());
- e.printStackTrace(new PrintStream(System.err));
- System.exit(EXCEPTION_EXIT);
- }
- }
-
- /**
- * Parses a list of test decorators, in the form "class.name[:class.name]*", and creates factories for those
- * TestDecorator classes , and returns a list of the factories. This list of factories will be in the same
- * order as specified in the string. The factories can be used to succesively wrap tests in layers of
- * decorators, as decorators themselves implement the 'Test' interface.
- *
- * <p/>If the string fails to parse, or if any of the decorators specified in it are cannot be loaded, or are not
- * TestDecorators, a runtime exception with a suitable error message will be thrown. The factories themselves
- * throw runtimes if the constructor method calls on the decorators fail.
- *
- * @param decorators The decorators list to be parsed.
- *
- * @return A list of instantiated decorators.
- */
- protected static List<TestDecoratorFactory> parseDecorators(String decorators)
- {
- List<TestDecoratorFactory> result = new LinkedList<TestDecoratorFactory>();
- String toParse = decorators;
-
- // Check that the decorators string is not null or empty, returning an empty list of decorator factories it
- // it is.
- if ((decorators == null) || "".equals(decorators))
- {
- return result;
- }
-
- // Strip any leading and trailing quotes from the string.
- if (toParse.charAt(0) == '\"')
- {
- toParse = toParse.substring(1, toParse.length() - 1);
- }
-
- if (toParse.charAt(toParse.length() - 1) == '\"')
- {
- toParse = toParse.substring(0, toParse.length() - 2);
- }
-
- // Instantiate all decorators.
- for (String decoratorClassName : toParse.split(":"))
- {
- try
- {
- Class decoratorClass = Class.forName(decoratorClassName);
- final Constructor decoratorConstructor = decoratorClass.getConstructor(WrappedSuiteTestDecorator.class);
-
- // Check that the decorator is an instance of WrappedSuiteTestDecorator.
- if (!WrappedSuiteTestDecorator.class.isAssignableFrom(decoratorClass))
- {
- throw new RuntimeException("The decorator class " + decoratorClassName
- + " is not a sub-class of WrappedSuiteTestDecorator, which it needs to be.");
- }
-
- result.add(new TestDecoratorFactory()
- {
- public WrappedSuiteTestDecorator decorateTest(Test test)
- {
- try
- {
- return (WrappedSuiteTestDecorator) decoratorConstructor.newInstance(test);
- }
- catch (InstantiationException e)
- {
- throw new RuntimeException(
- "The decorator class " + decoratorConstructor.getDeclaringClass().getName()
- + " cannot be instantiated.", e);
- }
- catch (IllegalAccessException e)
- {
- throw new RuntimeException(
- "The decorator class " + decoratorConstructor.getDeclaringClass().getName()
- + " does not have a publicly accessable constructor.", e);
- }
- catch (InvocationTargetException e)
- {
- throw new RuntimeException(
- "The decorator class " + decoratorConstructor.getDeclaringClass().getName()
- + " cannot be invoked.", e);
- }
- }
- });
- }
- catch (ClassNotFoundException e)
- {
- throw new RuntimeException("The decorator class " + decoratorClassName + " could not be found.", e);
- }
- catch (NoSuchMethodException e)
- {
- throw new RuntimeException("The decorator class " + decoratorClassName
- + " does not have a constructor that accepts a single 'WrappedSuiteTestDecorator' argument.", e);
- }
- }
-
- return result;
- }
-
- /**
- * TestDecoratorFactory is a factory for creating test decorators from tests.
- */
- protected interface TestDecoratorFactory
- {
- /**
- * Decorates the specified test with a new decorator.
- *
- * @param test The test to decorate.
- *
- * @return The decorated test.
- */
- public WrappedSuiteTestDecorator decorateTest(Test test);
- }
-
- /**
- * Runs a test or suite of tests, using the super class implemenation. This method wraps the test to be run
- * in any test decorators needed to add in the configured toolkits enhanced junit functionality.
- *
- * @param test The test to run.
- * @param wait Undocumented. Nothing in the JUnit javadocs to say what this is for.
- *
- * @return The results of the test run.
- */
- public TestResult doRun(Test test, boolean wait)
- {
- log.debug("public TestResult doRun(Test \"" + test + "\", boolean " + wait + "): called");
-
- // Wrap the tests in decorators for duration, scaling, repetition, parameterization etc.
- WrappedSuiteTestDecorator targetTest = decorateTests(test);
-
- // Delegate to the super method to run the decorated tests.
- log.debug("About to call super.doRun");
-
- TestResult result = super.doRun(targetTest, wait);
- log.debug("super.doRun returned.");
-
- /*if (result instanceof TKTestResult)
- {
- TKTestResult tkResult = (TKTestResult) result;
-
- tkResult.notifyEndBatch();
- }*/
-
- return result;
- }
-
- /**
- * Applies test decorators to the tests for parameterization, duration, scaling and repetition.
- *
- * @param test The test to decorat.
- *
- * @return The decorated test.
- */
- protected WrappedSuiteTestDecorator decorateTests(Test test)
- {
- log.debug("params = " + ((params == null) ? null : MathUtils.printArray(params)));
- log.debug("repetitions = " + repetitions);
- log.debug("threads = " + ((threads == null) ? null : MathUtils.printArray(threads)));
- log.debug("duration = " + duration);
-
- // Wrap all tests in the test suite with WrappedSuiteTestDecorators. This is quite ugly and a bit baffling,
- // but the reason it is done is because the JUnit implementation of TestDecorator has some bugs in it.
- WrappedSuiteTestDecorator targetTest = null;
-
- if (test instanceof TestSuite)
- {
- log.debug("targetTest is a TestSuite");
-
- TestSuite suite = (TestSuite) test;
-
- int numTests = suite.countTestCases();
- log.debug("There are " + numTests + " in the suite.");
-
- for (int i = 0; i < numTests; i++)
- {
- Test nextTest = suite.testAt(i);
- log.debug("suite.testAt(" + i + ") = " + nextTest);
-
- if (nextTest instanceof TimingControllerAware)
- {
- log.debug("nextTest is TimingControllerAware");
- }
-
- if (nextTest instanceof TestThreadAware)
- {
- log.debug("nextTest is TestThreadAware");
- }
- }
-
- targetTest = new WrappedSuiteTestDecorator(suite);
- log.debug("Wrapped with a WrappedSuiteTestDecorator.");
- }
- // If the test has already been wrapped, no need to do it again.
- else if (test instanceof WrappedSuiteTestDecorator)
- {
- targetTest = (WrappedSuiteTestDecorator) test;
- }
-
- // If size parameter values have been set, then wrap the test in an asymptotic test decorator.
- if (params != null)
- {
- targetTest = new AsymptoticTestDecorator(targetTest, params, (repetitions == null) ? 1 : repetitions);
- log.debug("Wrapped with asymptotic test decorator.");
- log.debug("targetTest = " + targetTest);
- }
-
- // If no size parameters are set but the repitions parameter is, then wrap the test in an asymptotic test decorator.
- else if ((repetitions != null) && (repetitions > 1))
- {
- targetTest = new AsymptoticTestDecorator(targetTest, new int[] { 1 }, repetitions);
- log.debug("Wrapped with asymptotic test decorator.");
- log.debug("targetTest = " + targetTest);
- }
-
- // Apply any optional user specified decorators.
- targetTest = applyOptionalUserDecorators(targetTest);
-
- // If a test run duration has been set then wrap the test in a duration test decorator. This will wrap on
- // top of size, repeat or concurrency wrappings already applied.
- if (duration != null)
- {
- DurationTestDecorator durationTest = new DurationTestDecorator(targetTest, duration);
- targetTest = durationTest;
-
- log.debug("Wrapped with duration test decorator.");
- log.debug("targetTest = " + targetTest);
-
- registerShutdownHook(durationTest);
- }
-
- // ParameterVariationTestDecorator...
-
- // If a test thread concurrency level is set then wrap the test in a scaled test decorator. This will wrap on
- // top of size scaling or repetition wrappings.
- ScaledTestDecorator scaledDecorator;
-
- if ((threads != null) && ((threads.length > 1) || (MathUtils.maxInArray(threads) > 1)))
- {
- scaledDecorator = new ScaledTestDecorator(targetTest, threads);
- targetTest = scaledDecorator;
- log.debug("Wrapped with scaled test decorator.");
- log.debug("targetTest = " + targetTest);
- }
- else
- {
- scaledDecorator = new ScaledTestDecorator(targetTest, new int[] { 1 });
- targetTest = scaledDecorator;
- log.debug("Wrapped with scaled test decorator with default of 1 thread.");
- log.debug("targetTest = " + targetTest);
- }
-
- // Register the scaled test decorators shutdown hook.
- registerShutdownHook(scaledDecorator);
-
- return targetTest;
- }
-
- /**
- * If there were any user specified test decorators on the command line, this method instantiates them and wraps
- * the test in them, from inner-most to outer-most in the order in which the decorators were supplied on the
- * command line.
- *
- * @param targetTest The test to wrap.
- *
- * @return A wrapped test.
- */
- protected WrappedSuiteTestDecorator applyOptionalUserDecorators(WrappedSuiteTestDecorator targetTest)
- {
- // If there are user defined test decorators apply them in order now.
- for (TestDecoratorFactory factory : decoratorFactories)
- {
- targetTest = factory.decorateTest(targetTest);
- }
-
- return targetTest;
- }
-
- /**
- * Creates the TestResult object to be used for test runs. See {@link TKTestResult} for more information and the
- * enhanced test result class that this uses.
- *
- * @return An instance of the enhanced test result object, {@link TKTestResult}.
- */
- protected TestResult createTestResult()
- {
- log.debug("protected TestResult createTestResult(): called");
-
- TKTestResult result = new TKTestResult(delay, testCaseName);
-
- // Check if a directory to output reports to has been specified and attach test listeners if so.
- if (reportDir != null)
- {
- // Create the report directory if it does not already exist.
- File reportDirFile = new File(reportDir);
-
- if (!reportDirFile.exists())
- {
- reportDirFile.mkdir();
- }
-
- // Create the results file (make the name of this configurable as a command line parameter).
- Writer timingsWriter;
-
- // Always set up a console feedback listener.
- ConsoleTestListener feedbackListener = new ConsoleTestListener();
- result.addListener(feedbackListener);
- result.addTKTestListener(feedbackListener);
-
- // Set up an XML results listener to output the timings to the results file, if requested on the command line.
- if (xmlResults)
- {
- try
- {
- File timingsFile = new File(reportDirFile, "TEST-" + currentTestClassName + ".xml");
- timingsWriter = new BufferedWriter(new FileWriter(timingsFile), 20000);
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to create the log file to write test results to: " + e, e);
- }
-
- XMLTestListener listener = new XMLTestListener(timingsWriter, currentTestClassName);
- result.addListener(listener);
- result.addTKTestListener(listener);
-
- registerShutdownHook(listener);
- }
-
- // Set up an CSV results listener to output the timings to the results file, if requested on the command line.
- if (csvResults)
- {
- try
- {
- File timingsFile =
- new File(reportDirFile, testRunName + "-" + TIME_STAMP_FORMAT.format(new Date()) + "-timings.csv");
- timingsWriter = new BufferedWriter(new FileWriter(timingsFile), 20000);
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to create the log file to write test results to: " + e, e);
- }
-
- CSVTestListener listener = new CSVTestListener(timingsWriter);
- result.addListener(listener);
- result.addTKTestListener(listener);
-
- // Register the results listeners shutdown hook to flush its data if the test framework is shutdown
- // prematurely.
- registerShutdownHook(listener);
- }
-
- // Register the results listeners shutdown hook to flush its data if the test framework is shutdown
- // prematurely.
- // registerShutdownHook(listener);
-
- // Record the start time of the batch.
- // result.notifyStartBatch();
-
- // At this point in time the test class has been instantiated, giving it an opportunity to read its parameters.
- // Inform any test listers of the test properties.
- result.notifyTestProperties(TestContextProperties.getAccessedProps());
- }
-
- return result;
- }
-
- /**
- * Registers the shutdown hook of a {@link ShutdownHookable}.
- *
- * @param hookable The hookable to register.
- */
- protected void registerShutdownHook(ShutdownHookable hookable)
- {
- Runtime.getRuntime().addShutdownHook(hookable.getShutdownHook());
- }
-
- /**
- * Initializes the test runner with the provided command line arguments and and starts the test run.
- *
- * @param testClassName The fully qualified name of the test class to run.
- *
- * @return The test results.
- *
- * @throws Exception Any exceptions from running the tests are allowed to fall through.
- */
- protected TestResult start(String testClassName) throws Exception
- {
- // Record the current test class, so that the test results can be output to a file incorporating this name.
- this.currentTestClassName = testClassName;
-
- // Delegate to the super method to run the tests.
- return super.start(new String[] { testClassName });
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestRunnerImprovedErrorHandling.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestRunnerImprovedErrorHandling.java
deleted file mode 100644
index c68405bd06..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestRunnerImprovedErrorHandling.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-
-import junit.runner.Version;
-
-import junit.textui.ResultPrinter;
-import junit.textui.TestRunner;
-
-import org.apache.log4j.Logger;
-
-import java.io.PrintStream;
-
-/**
- * The {@link junit.textui.TestRunner} does not provide very good error handling. It does not wrap exceptions and
- * does not print out stack traces, losing valuable error tracing information. This class overrides methods in it
- * in order to improve their error handling. The {@link TKTestRunner} is then built on top of this.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * </table>
- *
- * @author Rupert Smith
- */
-public class TestRunnerImprovedErrorHandling extends TestRunner
-{
- /** Used for logging. */
- Logger log = Logger.getLogger(TestRunnerImprovedErrorHandling.class);
-
- /**
- * Delegates to the super constructor.
- */
- public TestRunnerImprovedErrorHandling()
- {
- super();
- }
-
- /**
- * Delegates to the super constructor.
- *
- * @param printStream The location to write test results to.
- */
- public TestRunnerImprovedErrorHandling(PrintStream printStream)
- {
- super(printStream);
- }
-
- /**
- * Delegates to the super constructor.
- *
- * @param resultPrinter The location to write test results to.
- */
- public TestRunnerImprovedErrorHandling(ResultPrinter resultPrinter)
- {
- super(resultPrinter);
- }
-
- /**
- * Starts a test run. Analyzes the command line arguments
- * and runs the given test suite.
- *
- * @param args The command line arguments.
- *
- * @return The test results.
- *
- * @throws Exception Any exceptions falling through the tests are wrapped in Exception and rethrown.
- */
- public TestResult start(String[] args) throws Exception
- {
- String testCase = "";
- boolean wait = false;
-
- for (int i = 0; i < args.length; i++)
- {
- if (args[i].equals("-wait"))
- {
- wait = true;
- }
- else if (args[i].equals("-c"))
- {
- testCase = extractClassName(args[++i]);
- }
- else if (args[i].equals("-v"))
- {
- System.err.println("JUnit " + Version.id() + " by Kent Beck and Erich Gamma");
- }
- else
- {
- testCase = args[i];
- }
- }
-
- if (testCase.equals(""))
- {
- throw new Exception("Usage: TestRunner [-wait] testCaseName, where name is the name of the TestCase class");
- }
-
- try
- {
- Test suite = getTest(testCase);
-
- return doRun(suite, wait);
- }
- catch (Exception e)
- {
- log.warn("Got exception whilst creating and running test suite.", e);
- throw new Exception("Could not create and run the test suite.", e);
- }
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestThreadAware.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestThreadAware.java
deleted file mode 100644
index 94dcf5499b..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestThreadAware.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * This interface can be implemented by tests that want to know if they are being run concurrently. It provides
- * lifecycle notification events to tell the test implementation when test threads are being created and destroyed.
- * This can assist tests in creating and destroying resources that exist over the life of a test thread. A single
- * test thread can excute the same test many times, and often it is convenient to keep resources, for example network
- * connections, open over many test calls.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Set up per thread test fixtures.
- * <tr><td> Clean up per thread test fixtures.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface TestThreadAware
-{
- /**
- * Called when a test thread is created.
- */
- public void threadSetUp();
-
- /**
- * Called after all threads have completed their setup.
- */
- public void postThreadSetUp();
-
- /**
- * Called when a test thread is destroyed.
- */
- public void threadTearDown();
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/Throttle.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/Throttle.java
deleted file mode 100644
index 1ea8e8e2be..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/Throttle.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * Throttle is an interface that supplies a {@link #throttle} method, that can only be called at the rate specified
- * in a call to the {@link #setRate} method. This can be used to restict processing to run at a certain number
- * of operations per second.
- *
- * <p/>Throttle also supplies a method to check the throttle rate, without waiting. This could be used to update a user
- * interface every time an event occurs, but only up to a maximum rate. For example, as elements are added to a list,
- * a count of elements is updated for the user to see, but only up to a maximum rate of ten updates a second, as updating
- * faster than that slows the processing of element-by-element additions to the list unnecessarily.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Accept throttling rate in operations per second.
- * <tr><td> Inject short pauses to fill-out processing cycles to a specified rate.
- * <tr><td> Check against a throttle speed without waiting.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface Throttle
-{
- /**
- * Specifies the throttling rate in operations per second. This must be called with with a value, the inverse
- * of which is a measurement in nano seconds, such that the number of nano seconds do not overflow a long integer.
- * The value must also be larger than zero.
- *
- * @param hertz The throttling rate in cycles per second.
- */
- public void setRate(float hertz);
-
- /**
- * This method can only be called at the rate set by the {@link #setRate} method, if it is called faster than this
- * it will inject short pauses to restrict the call rate to that rate.
- *
- * <p/>If the thread executing this method is interrupted, it must ensure that the threads interrupt thread
- * remains set upon exit from the method. This method does not expose InterruptedException, to indicate interruption
- * of the throttle during a timed wait. It may be changed so that it does.
- */
- public void throttle();
-
- /**
- * Checks but does not enforce the throttle rate. When this method is called, it checks if a length of time greater
- * than that equal to the inverse of the throttling rate has passed since it was last called and returned <tt>true</tt>
- *
- * @return <tt>true</tt> if a length of time greater than that equal to the inverse of the throttling rate has
- * passed since this method was last called and returned <tt>true</tt>, <tt>false</tt> otherwise. The very
- * first time this method is called on a throttle, it returns <tt>true</tt> as the base case to the above
- * self-referential definition.
- */
- public boolean checkThrottle();
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingController.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingController.java
deleted file mode 100644
index 27e43a10a4..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingController.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * A TimingController is a interface that a test that is aware of the fact that it is being timed can use to manage
- * the timer. Using this interface tests can suspend and resume test timers. This is usefull if you want to exclude
- * some expensive preparation from being timed as part of a test. In general when timing tests to measure the
- * performance of code, you should try to set up data in the #setUp where possible, or as static members in the test
- * class. This is not always convenient, this interface gives you a way to suspend and resume, or event completely
- * restart test timers, to get accurate measurements.
- *
- * <p/>The interface can also be used to register multiple test pass/fails and timings from a single test method.
- * In some cases it is easier to write tests in this way. For example a concurrent and asynchronous test may make
- * many asynchronous requests and then wait for replies to all its requests. Writing such a test with one send/reply
- * per test method and trying to scale up using many threads will quickly run into limitations if more than about
- * 100 asynchronous calls need to be made at once. A better way to write such a test is as a single method that sends
- * many (perhaps thousands or millions) and waits for replies in two threads, one for send, one for replies. It can
- * then log pass/fails and timings on each individual reply as they come back in, even though the test has been written
- * to send thousands of requests per test method in order to do volume testing.
- *
- * <p/>If when the {@link #completeTest(boolean)} is called, the test runner decides that testing should stop (perhaps
- * because a duration test has expired), it throws an InterruptedException to indicate that the test method should stop
- * immediately. The test method can do this by allowing this exception to fall through, if no other clean-up handling
- * is necessary, or it can simply return as soon as it possibly can. The test runner will still call the tearDown
- * method in the usual way when this happens.
- *
- * <p/>Below are some examples of how this can be used. Not how checking that the timing controller is really available
- * rather than assuming it is, means that the test can run as an ordinary JUnit test under the default test runners. In
- * general code should be written to take advantage of the extended capabilities of junit toolkit, without assuming they
- * are going to be run under its test runner.
- *
- * <pre>
- * public class MyTest extends TestCase implements TimingControllerAware {
- * ...
- *
- * timingUtils = this.getTimingController();
- *
- * // Do expensive data preparation here...
- *
- * if (timingUtils != null)
- * timingUtils.restart();
- * </pre>
- *
- * <pre>
- * public class MyTest extends TestCase implements TimingControllerAware {
- * ...
- *
- * public void myVolumeTest(int size) {
- *
- * timingUtils = this.getTimingController();
- *
- * boolean stopNow = false;
- *
- * // In Sender thread.
- * for(int i = 0; !stopNow && i < size; i++)
- * // Send request i.
- * ...
- *
- * // In Receiver thread.
- * onReceive(Object o) {
- * try {
- * // Check o is as expected.
- * if (....)
- * {
- * if (timingUtils != null)
- * timingUtils.completeTest(true);
- * }
- * else
- * {
- * if (timingUtils != null)
- * timingUtils.completeTest(false);
- * }
- * } catch (InterruptedException e) {
- * stopNow = true;
- * return;
- * }
- * }
- * </pre>
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Allow test timers to be suspended, restarted or reset.
- * <tr><td> Allow tests to register multiple pass/fails and timings.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface TimingController
-{
- /**
- * Gets the timing controller associated with the current test thread. Tests that use timing controller should
- * always get the timing controller from this method in the same thread that called the setUp, tearDown or test
- * method. The controller returned by this method may be called from any thread because it remembers the thread
- * id of the original test thread.
- *
- * @return The timing controller associated with the current test thread.
- */
- public TimingController getControllerForCurrentThread();
-
- /**
- * Suspends the test timer.
- *
- * @return The current time in nanoseconds.
- */
- public long suspend();
-
- /**
- * Allows the test timer to continue running after a suspend.
- *
- * @return The current time in nanoseconds.
- */
- public long resume();
-
- /**
- * Completely restarts the test timer from zero.
- *
- * @return The current time in nanoseconds.
- */
- public long restart();
-
- /**
- * Register an additional pass/fail for the current test. The test result is assumed to apply to a test of
- * 'size' parmeter 1. Use the {@link #completeTest(boolean, int)} method to register timings with parameters.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed) throws InterruptedException;
-
- /**
- * Register an additional pass/fail for the current test. The test result is applies to a test of the specified
- * 'size' parmeter.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- * @param param The test parameter size for parameterized tests.
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed, int param) throws InterruptedException;
-
- /**
- * Register an additional pass/fail for the current test. The test result is applies to a test of the specified
- * 'size' parmeter and allows the caller to sepecify the timing to log.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- * @param param The test parameter size for parameterized tests.
- * @param timeNanos The time in nano seconds to log the test result with.
- *
- * A null value for timeNanos is a request to this method that it should
- * calculate the time for the given test run.
- *
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed, int param, Long timeNanos) throws InterruptedException;
-
- /**
- * Register an additional pass/fail for the current test. The test result is applies to a test of the specified
- * 'size' parmeter and allows the caller to sepecify the timing to log.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- * @param param The test parameter size for parameterized tests.
- * @param timeNanos The time in nano seconds to log the test result with.
- *
- * A null value for timeNanos is a request to this method that it should
- * calculate the time for the given test run.
- * A null value for timeNanos2 means this test does not provide a second
- * timing value so a '-' is printed in the log.
- *
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed, int param, Long timeNanos, Long time2Nanos) throws InterruptedException;
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingControllerAware.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingControllerAware.java
deleted file mode 100644
index 11db87e073..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingControllerAware.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * TimingControllerAware is an interface that tests that manipulate the timing controller should implement. It enables
- * the TK test runner to set the test up with a handle on the timing controller which the test can use to call back
- * to the test runner to manage the timers.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide timing controller insertion point for tests.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface TimingControllerAware
-{
- /**
- * Used by test runners that can supply a {@link TimingController} to set the controller on an aware test.
- *
- * @param controller The timing controller.
- */
- public void setTimingController(TimingController controller);
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/WrappedSuiteTestDecorator.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/WrappedSuiteTestDecorator.java
deleted file mode 100644
index d5690fc24a..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/WrappedSuiteTestDecorator.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.extensions.TestDecorator;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.apache.log4j.Logger;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * WrappedSuiteTestDecorator is a test decorator that wraps a test suite, or another wrapped suite, but provides the
- * same functionality for the {@link junit.extensions.TestDecorator#countTestCases()} and {@link TestSuite#testAt(int)}
- * methods as the underlying suite. It returns the values that these methods provide, to enable classes using decorated
- * tests to drill down to the underlying tests in the suite. That is to say that it indexes and reports the number of
- * distinct tests in the suite, not the number of test runs that would result from, for example, wrapping the suite in a
- * repeating decorator.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide access to the underlying tests in a suite.
- * </table>
- *
- * @author Rupert Smith
- */
-public class WrappedSuiteTestDecorator extends TestDecorator
-{
- /** Used for logging. */
- private static Logger log = Logger.getLogger(WrappedSuiteTestDecorator.class);
-
- /** Holds the test suite that this supplies access to. */
- protected Test suite;
-
- /**
- * Creates a wrappred suite test decorator from a test suite.
- *
- * @param suite The test suite.
- */
- public WrappedSuiteTestDecorator(TestSuite suite)
- {
- super(suite);
- this.suite = suite;
- }
-
- /**
- * Creates a wrapped suite test decorator from another one.
- *
- * @param suite The test suite.
- */
- public WrappedSuiteTestDecorator(WrappedSuiteTestDecorator suite)
- {
- super(suite);
- this.suite = suite;
- }
-
- /**
- * Returns the test count of the wrapped suite.
- *
- * @return The test count of the wrapped suite.
- */
- public int countTestCases()
- {
- return suite.countTestCases();
- }
-
- /**
- * Gets the ith test from the test suite.
- *
- * @param i The index of the test within the suite to get.
- *
- * @return The test with the specified index.
- */
- public Test testAt(int i)
- {
- log.debug("public Test testAt(int i = " + i + "): called");
-
- if (suite instanceof WrappedSuiteTestDecorator)
- {
- return ((WrappedSuiteTestDecorator) suite).testAt(i);
- }
- else if (suite instanceof TestSuite)
- {
- return ((TestSuite) suite).testAt(i);
- }
-
- // This should never happen.
- return null;
- }
-
- /**
- * Gets all the tests from the underlying test suite.
- *
- * @return All the tests from the underlying test suite.
- */
- public Collection<Test> getAllUnderlyingTests()
- {
- log.debug("public Collection<Test> getAllUnderlyingTests(): called");
-
- List<Test> tests = new ArrayList<Test>();
-
- int numTests = countTestCases();
- log.debug("numTests = " + numTests);
-
- for (int i = 0; i < numTests; i++)
- {
- tests.add(testAt(i));
- }
-
- return tests;
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/CSVTestListener.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/CSVTestListener.java
deleted file mode 100644
index 40841189a3..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/CSVTestListener.java
+++ /dev/null
@@ -1,572 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.listeners;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestListener;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.ShutdownHookable;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * CSVTestListener is both a test listener, a timings listener, a memory listener and a parameter listener. It listens for test completion events and
- * then writes out all the data that it has listened to into a '.csv' (comma seperated values) file.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Listen to test events; start, end, fail, error.
- * <tr><td> Listen to test timings.
- * <tr><td> Listen to test memory usage.
- * <tr><td> Listen to parameterized test parameters.
- * <tr><td> Output all test data to a CSV file.
- * </table>
- *
- * @author Rupert Smith
- *
- * @todo Write an XML output class. Write a transform to convert it into an HTML page with timings as graphs.
- */
-public class CSVTestListener implements TestListener, TKTestListener, ShutdownHookable
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(CSVTestListener.class);
-
- /** The timings file writer. */
- private Writer timingsWriter;
-
- /**
- * Map for holding results on a per thread basis as they come in. A ThreadLocal is not used as sometimes an
- * explicit thread id must be used, where notifications come from different threads than the ones that called
- * the test method.
- */
- Map<Long, TestResult> threadLocalResults = Collections.synchronizedMap(new HashMap<Long, TestResult>());
-
- /** Used to record the start time of a complete test run, for outputing statistics at the end of the test run. */
- private long batchStartTime;
-
- /** Used to record the number of errors accross a complete test run. */
- private int numError;
-
- /** Used to record the number of failures accross a complete test run. */
- private int numFailed;
-
- /** Used to record the number of passes accross a complete test run. */
- private int numPassed;
-
- /** Used to record the total tests run accross a complete test run. Always equal to passes + errors + fails. */
- private int totalTests;
-
- /** Used to recrod the current concurrency level for the test batch. */
- private int concurrencyLevel;
-
- /**
- * Used to record the total 'size' of the tests run, this is the number run times the average value of the test
- * size parameters.
- */
- private int totalSize;
-
- /**
- * Used to record the summation of all of the individual test timings. Note that total time and summed time
- * are unlikely to be in agreement, exception for a single threaded test (with no setup time). Total time is
- * the time taken to run all the tests, summed time is the added up time that each individual test took. So if
- * two tests run in parallel and take one second each, total time will be one seconds, summed time will be two
- * seconds.
- */
- private long summedTime;
-
- /**
- * Used to record the summation of all of the second test timing information.
- * One use of the second timing would be to provide latency as well as test timing.
- */
- private long summedTime2;
-
- /** Flag to indicate when batch has been started but not ended to ensure end batch stats are output only once. */
- private boolean batchStarted = false;
-
- /**
- * Creates a new CSVTestListener object.
- *
- * @param writer A writer where this CSV listener should write out its output to.
- */
- public CSVTestListener(Writer writer)
- {
- // log.debug("public CSVTestListener(Writer writer): called");
-
- // Keep the writer.
- this.timingsWriter = writer;
- }
-
- /**
- * Resets the test results to the default state of time zero, memory usage zero, test passed.
- *
- * @param test The test to resest any results for.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void reset(Test test, Long threadId)
- {
- // log.debug("public void reset(Test test = \"" + test + "\", Long threadId = " + threadId + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.testTime = 0L;
- r.testTime2 = null;
- r.testStartMem = 0L;
- r.testEndMem = 0L;
- r.testState = "Pass";
- r.testParam = 0;
- }
-
- /**
- * Called when a test results in an error.
- *
- * @param test The test which is in error.
- * @param t Any Throwable raised by the test in error.
- */
- public void addError(Test test, Throwable t)
- {
- // log.debug("public void addError(Test test, Throwable t): called");
-
- TestResult r = threadLocalResults.get(Thread.currentThread().getId());
- r.testState = "Error";
- }
-
- /**
- * Called when a test results in a failure.
- *
- * @param test The test which failed.
- * @param t The AssertionFailedError that encapsulates the test failure.
- */
- public void addFailure(Test test, AssertionFailedError t)
- {
- // log.debug("public void addFailure(Test \"" + test + "\", AssertionFailedError t): called");
-
- TestResult r = threadLocalResults.get(Thread.currentThread().getId());
- r.testState = "Failure";
- }
-
- /**
- * Called when a test completes to mark it as a test fail. This method should be used when registering a
- * failure from a different thread than the one that started the test.
- *
- * @param test The test which failed.
- * @param e The assertion that failed the test.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void addFailure(Test test, AssertionFailedError e, Long threadId)
- {
- // log.debug("public void addFailure(Test test = \"" + test + "\", AssertionFailedError e, Long threadId = " + threadId
- // + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.testState = "Failure";
- }
-
- /**
- * Called when a test completes. Success, failure and errors.
- *
- * @param test The test which completed.
- */
- public void endTest(Test test)
- {
- // log.debug("public void endTest(Test \"" + test + "\"): called");
-
- TestResult r = threadLocalResults.get(Thread.currentThread().getId());
-
- writeTestResults(r, test);
-
- // Clear all the test results for the thread.
- threadLocalResults.remove(Thread.currentThread().getId());
- }
-
- /**
- * Called when a test starts.
- *
- * @param test The test wich has started.
- */
- public void startTest(Test test)
- {
- // log.debug("public void startTest(Test \"" + test + "\"): called");
-
- // Initialize the thread local test results.
- threadLocalResults.put(Thread.currentThread().getId(), new TestResult());
- }
-
- /**
- * Should be called every time a test completes with the run time of that test.
- *
- * @param test The name of the test.
- * @param nanos The run time of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing(Test test, long nanos, Long threadId)
- {
- // log.debug("public void timing(String \"" + test + "\", long " + nanos + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.testTime = nanos;
- summedTime += nanos;
- }
-
- /**
- * Optionally called every time a test completes with the second timing test.
- *
- * @param test The name of the test.
- * @param nanos The second timing information of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing2(Test test, Long nanos, Long threadId)
- {
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
-
- if (nanos != null)
- {
- r.testTime2 = nanos;
- summedTime2 += nanos;
- }
- }
-
- /**
- * Should be called every time a test completed with the amount of memory used before and after the test was run.
- *
- * @param test The test which memory was measured for.
- * @param memStart The total JVM memory used before the test was run.
- * @param memEnd The total JVM memory used after the test was run.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void memoryUsed(Test test, long memStart, long memEnd, Long threadId)
- {
- // log.debug("public void memoryUsed(Test \"" + test + "\", long " + memStart + ", long " + memEnd + ", Long "
- // + threadId + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.testStartMem = memStart;
- r.testEndMem = memEnd;
- }
-
- /**
- * Should be called every time a parameterized test completed with the int value of its test parameter.
- *
- * @param test The test which memory was measured for.
- * @param parameter The int parameter value.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void parameterValue(Test test, int parameter, Long threadId)
- {
- // log.debug("public void parameterValue(Test test = \"" + test + "\", int parameter = " + parameter + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.testParam = parameter;
- totalSize += parameter;
- }
-
- /**
- * Should be called every time a test completes with the current number of test threads running. This should not
- * change within a test batch, therefore it is safe to take this as a batch level property value too.
- *
- * @param test The test for which the measurement is being generated.
- * @param threads The number of tests being run concurrently.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void concurrencyLevel(Test test, int threads, Long threadId)
- {
- // log.debug("public void concurrencyLevel(Test test = \"" + test + "\", int threads = " + threads + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.testConcurrency = threads;
- concurrencyLevel = threads;
-
- }
-
- /**
- * Called when a test completes. Success, failure and errors. This method should be used when registering an
- * end test from a different thread than the one that started the test.
- *
- * @param test The test which completed.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void endTest(Test test, Long threadId)
- {
- // log.debug("public void endTest(Test test = \"" + test + "\", Long threadId " + threadId + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- writeTestResults(r, test);
- }
-
- /**
- * Takes a time stamp for the beginning of the batch and resets stats counted for the batch.
- */
- public synchronized void startBatch()
- {
- numError = 0;
- numFailed = 0;
- numPassed = 0;
- totalTests = 0;
- totalSize = 0;
- batchStartTime = System.nanoTime();
- summedTime = 0;
- summedTime2 = 0;
- batchStarted = true;
-
- // Write out the column headers for the batch.
- writeColumnHeaders();
- }
-
- /**
- * Takes a time stamp for the end of the batch to calculate the total run time.
- * Write this and other stats out to the tail of the csv file.
- *
- * @param parameters The optional test parameters, may be null.
- */
- public synchronized void endBatch(Properties parameters)
- {
- boolean noParams = (parameters == null) || (parameters.size() == 0);
-
- // Check that a batch has been started but not ended.
- if (batchStarted)
- {
- long batchEndTime = System.nanoTime();
- float totalTimeMillis = ((float) (batchEndTime - batchStartTime)) / 1000000f;
- float summedTimeMillis = ((float) summedTime) / 1000000f;
- float summedTime2Millis = ((float) summedTime2) / 1000000f;
-
-
- // Write the stats for the batch out.
- try
- {
- synchronized (this.getClass())
- {
- timingsWriter.write("Total Tests:, " + totalTests + ", ");
- timingsWriter.write("Total Passed:, " + numPassed + ", ");
- timingsWriter.write("Total Failed:, " + numFailed + ", ");
- timingsWriter.write("Total Error:, " + numError + ", ");
- timingsWriter.write("Total Size:, " + totalSize + ", ");
- timingsWriter.write("Summed Time:, " + summedTimeMillis + ", ");
- timingsWriter.write("Summed Custom Time:, " + summedTime2Millis + ", ");
- timingsWriter.write("Concurrency Level:, " + concurrencyLevel + ", ");
- timingsWriter.write("Total Time:, " + totalTimeMillis + ", ");
- timingsWriter.write("Average Custom Time:, " + ((summedTime2Millis/ (float) totalTests)) + ", ");
- timingsWriter.write("Test Throughput:, " + (((float) totalTests) / totalTimeMillis) + ", ");
- timingsWriter.write("Test * Size Throughput:, " + (((float) totalSize) / totalTimeMillis)
- + (noParams ? "\n\n" : ", "));
-
- // Write out the test parameters if there are any specified.
- if (!noParams)
- {
- properties(parameters);
- }
-
- timingsWriter.flush();
- }
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write out end batch statistics: " + e, e);
- }
- }
-
- // Reset the batch started flag to ensure stats are only output once.
- batchStarted = false;
- }
-
- /**
- * Notifies listeners of the tests read/set properties.
- *
- * @param properties The tests read/set properties.
- */
- public void properties(Properties properties)
- {
- // log.debug("public void properties(Properties properties): called");
-
- // Write the properties out to the results file.
- try
- {
- synchronized (this.getClass())
- {
- Set keySet = new TreeSet(properties.keySet());
-
- // timingsWriter.write("\n");
-
- for (Object key : keySet)
- {
- timingsWriter.write(key + " = , " + properties.getProperty((String) key) + ", ");
- }
-
- timingsWriter.write("\n\n");
- // timingsWriter.flush();
- }
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write out test parameters: " + e, e);
- }
-
- // Write out the column headers after the properties.
- // writeColumnHeaders();
- }
-
- /**
- * Writes out and flushes the column headers for raw test data.
- */
- private void writeColumnHeaders()
- {
- // Write the column headers for the CSV file. Any IO exceptions are ignored.
- try
- {
- timingsWriter.write("Class, ");
- timingsWriter.write("Method, ");
- timingsWriter.write("Thread, ");
- timingsWriter.write("Test Outcome, ");
- timingsWriter.write("Time (milliseconds), ");
- timingsWriter.write("Custom Time (milliseconds), ");
- timingsWriter.write("Memory Used (bytes), ");
- timingsWriter.write("Concurrency level, ");
- timingsWriter.write("Test Size\n");
-
- timingsWriter.flush();
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write out column headers: " + e, e);
- }
- }
-
- /**
- * Writes out the test results for the specified test. This outputs a single line of results to the csv file.
- *
- * @param r The test results to write out.
- * @param test The test to write them out for.
- */
- private void writeTestResults(TestResult r, Test test)
- {
- // Update the running stats for this batch.
- if ("Error".equals(r.testState))
- {
- numError++;
- }
- else if ("Failure".equals(r.testState))
- {
- numFailed++;
- }
- else if ("Pass".equals(r.testState))
- {
- numPassed++;
- }
-
- totalTests++;
-
- // Write the test name and thread information plus all instrumenation a line of the CSV ouput. Any IO
- // exceptions are ignored.
- try
- {
- synchronized (this.getClass())
- {
- timingsWriter.write(test.getClass().getName() + ", ");
- timingsWriter.write(((test instanceof TestCase) ? ((TestCase) test).getName() : "") + ", ");
- timingsWriter.write(Thread.currentThread().getName() + ", ");
- timingsWriter.write(r.testState + ", ");
- timingsWriter.write((((float) r.testTime) / 1000000f) + ", ");
-
- timingsWriter.write(r.testTime2 == null ? "- , " :
- (((float) r.testTime2) / 1000000f) + ", ");
- timingsWriter.write((r.testEndMem - r.testStartMem) + ", ");
- timingsWriter.write(r.testConcurrency + ", ");
- timingsWriter.write(r.testParam + "\n");
- }
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write out test results: " + e, e);
- }
- }
-
- /**
- * Supplies the shutdown hook. This attempts to flush the results in the event of the test runner being prematurely
- * suspended before the end of the current test batch.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- log.debug("CSVTestListener::ShutdownHook: called");
-
- // Complete the current test batch stats.
- endBatch(TestContextProperties.getInstance());
- }
- });
- }
-
- /** Captures test results packaged into a single object, so that it can be set up as a thread local. */
- private static class TestResult
- {
- /** Used to hold the test timing. */
- public long testTime;
-
- /** Use to hold the second timing information. */
- public Long testTime2;
-
- /** Used to hold the test start memory usage. */
- public long testStartMem;
-
- /** Used to hold the test end memory usage. */
- public long testEndMem;
-
- /** Used to hold the test pass/fail/error state. */
- public String testState = "Pass";
-
- /** Used to hold the test parameter value. */
- public int testParam;
-
- /** Used to hold the concurrency level under which the test was run. */
- public int testConcurrency;
-
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/ConsoleTestListener.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/ConsoleTestListener.java
deleted file mode 100644
index 276fec328e..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/ConsoleTestListener.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.listeners;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestListener;
-
-import org.apache.qpid.junit.extensions.SleepThrottle;
-import org.apache.qpid.junit.extensions.Throttle;
-
-import java.util.Properties;
-
-/**
- * ConsoleTestListener provides feedback to the console, as test timings are taken, by drawing a '.', or an 'E', or an
- * 'F', for each test that passes, is in error or fails. It does this for every test result registered with the framework,
- * not just on the completion of each test method as the JUnit one does. It also uses a throttle to cap the rate of
- * dot drawing, as exessively high rates can degrade test performance without providing much usefull feedback to the user.
- * Unlike the JUnit dot drawing feedback, this one will correctly wrap lines when tests are run concurrently (the
- * rate capping ensures that this does not become a hot-spot for thread contention).
- *
- * <p/>Where rate capping causes the conflation of multiple requested dots into a single dot, the dot that is actually
- * drawn will be the worst result within the conflation period, that is, error is worse than fail which is worse than pass.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Draw dots as each test result completes, at a capped rate.
- * </table>
- *
- * @author Rupert Smith
- */
-public class ConsoleTestListener implements TestListener, TKTestListener
-{
- /** Used to indicate a test pass. */
- private static final int PASS = 1;
-
- /** Used to indicate a test failure. */
- private static final int FAIL = 2;
-
- /** Used to indicate a test error. */
- private static final int ERROR = 3;
-
- /** Defines the maximum number of columns of dots to print. */
- private static final int MAX_COLUMNS = 80;
-
- /** Used to throttle the dot writing rate. */
- Throttle throttle;
-
- /** Tracks the worst test result so far, when the throttled print method must conflate results due to throttling. */
- private int conflatedResult = 0;
-
- /** Tracks the column count as dots are printed, so that newlines can be inserted at the right margin. */
- private int columnCount = 0;
-
- /** Used as a monitor on the print method criticial section, to ensure that line ends always happen in the right place. */
- private final Object printMonitor = new Object();
-
- /**
- * Creates a dot drawing feedback test listener, set by default to 80 columns at 80 dots per second capped rate.
- */
- public ConsoleTestListener()
- {
- throttle = new SleepThrottle();
- throttle.setRate(80f);
- }
-
- /**
- * Prints dots at a capped rate, conflating the requested type of dot to draw if this method is called at a rate
- * higher than the capped rate. The conflation works by always printing the worst result that occurs within the
- * conflation period, that is, error is worse than fail which is worse than a pass.
- *
- * @param result The type of dot to draw, {@link #PASS}, {@link #FAIL} or {@link #ERROR}.
- */
- private void throttledPrint(int result)
- {
- conflatedResult = (result > conflatedResult) ? result : conflatedResult;
-
- if (throttle.checkThrottle())
- {
- synchronized (printMonitor)
- {
- switch (conflatedResult)
- {
- default:
- case PASS:
- System.out.print('.');
- break;
-
- case FAIL:
- System.out.print('F');
- break;
-
- case ERROR:
- System.out.print('E');
- break;
- }
-
- columnCount = (columnCount >= MAX_COLUMNS) ? 0 : (columnCount + 1);
-
- if (columnCount == 0)
- {
- System.out.print('\n');
- }
-
- conflatedResult = 0;
- }
- }
- }
-
- /**
- * An error occurred.
- *
- * @param test The test in error. Ignored.
- * @param t The error that the test threw. Ignored.
- */
- public void addError(Test test, Throwable t)
- {
- throttledPrint(ERROR);
- }
-
- /**
- * A failure occurred.
- *
- * @param test The test that failed. Ignored.
- * @param t The assertion failure that the test threw. Ignored.
- */
- public void addFailure(Test test, AssertionFailedError t)
- {
- throttledPrint(FAIL);
- }
-
- /**
- * A test ended.
- *
- * @param test The test that ended. Ignored.
- */
- public void endTest(Test test)
- {
- throttledPrint(PASS);
- }
-
- /**
- * A test started.
- *
- * @param test The test that started. Ignored.
- */
- public void startTest(Test test)
- { }
-
- /**
- * Resets the test results to the default state of time zero, memory usage zero, parameter zero, test passed.
- *
- * @param test The test to resest any results for.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void reset(Test test, Long threadId)
- { }
-
- /**
- * Should be called every time a test completes with the run time of that test.
- *
- * @param test The name of the test.
- * @param nanos The run time of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing(Test test, long nanos, Long threadId)
- { }
-
- /**
- * Optionally called every time a test completes with the second timing test.
- *
- * @param test The name of the test.
- * @param nanos The second timing information of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing2(Test test, Long nanos, Long threadId)
- { }
-
- /**
- * Should be called every time a test completed with the amount of memory used before and after the test was run.
- *
- * @param test The test which memory was measured for.
- * @param memStart The total JVM memory used before the test was run.
- * @param memEnd The total JVM memory used after the test was run.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void memoryUsed(Test test, long memStart, long memEnd, Long threadId)
- { }
-
- /**
- * Should be called every time a parameterized test completed with the int value of its test parameter.
- *
- * @param test The test which memory was measured for.
- * @param parameter The int parameter value.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void parameterValue(Test test, int parameter, Long threadId)
- { }
-
- /**
- * Should be called every time a test completes with the current number of test threads running.
- *
- * @param test The test for which the measurement is being generated.
- * @param threads The number of tests being run concurrently.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void concurrencyLevel(Test test, int threads, Long threadId)
- { }
-
- /**
- * Called when a test completes. Success, failure and errors. This method should be used when registering an
- * end test from a different thread than the one that started the test.
- *
- * @param test The test which completed.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void endTest(Test test, Long threadId)
- {
- throttledPrint(PASS);
- }
-
- /**
- * Called when a test completes to mark it as a test fail. This method should be used when registering a
- * failure from a different thread than the one that started the test.
- *
- * @param test The test which failed.
- * @param e The assertion that failed the test.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void addFailure(Test test, AssertionFailedError e, Long threadId)
- {
- throttledPrint(FAIL);
- }
-
- /**
- * Notifies listeners of the start of a complete run of tests.
- */
- public void startBatch()
- { }
-
- /**
- * Notifies listeners of the end of a complete run of tests.
- *
- * @param parameters The optional test parameters to log out with the batch results.
- */
- public void endBatch(Properties parameters)
- { }
-
- /**
- * Notifies listeners of the tests read/set properties.
- *
- * @param properties The tests read/set properties.
- */
- public void properties(Properties properties)
- { }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/TKTestListener.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/TKTestListener.java
deleted file mode 100644
index 63b042db10..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/TKTestListener.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.listeners;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestListener;
-
-import java.util.Properties;
-
-/**
- * TKTestListener is a listener interface for listeners that want to be informed of the run times of tests, the memory
- * usage of tests, the 'size' parameters of parameterized tests and the begin and end events of complete test runs.
- * {@link org.apache.qpid.junit.extensions.TKTestResult} is an example of a test result class that listeners
- * interested in these events can be attached to.
- *
- * The {@link #timing(junit.framework.Test, long, Long)}, {@link #memoryUsed(junit.framework.Test, long, long, Long)},
- * {@link #parameterValue(junit.framework.Test, int, Long)} and {@link #endTest(junit.framework.Test, Long)} methods
- * all accept on optional thread id parameter.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Listen to test timings.
- * <tr><td> Listen to test memory usages.
- * <tr><td> Listen to parameterized test parameters.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface TKTestListener extends TestListener
-{
- /**
- * Resets the test results to the default state of time zero, memory usage zero, parameter zero, test passed.
- *
- * @param test The test to resest any results for.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void reset(Test test, Long threadId);
-
- /**
- * Should be called every time a test completes with the run time of that test.
- *
- * @param test The name of the test.
- * @param nanos The run time of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing(Test test, long nanos, Long threadId);
-
-
- /**
- * Optionally called every time a test completes with the second timing test.
- *
- * @param test The name of the test.
- * @param nanos The second timing information of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing2(Test test, Long nanos, Long threadId);
-
- /**
- * Should be called every time a test completed with the amount of memory used before and after the test was run.
- *
- * @param test The test which memory was measured for.
- * @param memStart The total JVM memory used before the test was run.
- * @param memEnd The total JVM memory used after the test was run.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void memoryUsed(Test test, long memStart, long memEnd, Long threadId);
-
- /**
- * Should be called every time a parameterized test completed with the int value of its test parameter.
- *
- * @param test The test which memory was measured for.
- * @param parameter The int parameter value.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void parameterValue(Test test, int parameter, Long threadId);
-
- /**
- * Should be called every time a test completes with the current number of test threads running.
- *
- * @param test The test for which the measurement is being generated.
- * @param threads The number of tests being run concurrently.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void concurrencyLevel(Test test, int threads, Long threadId);
-
- /**
- * Called when a test completes. Success, failure and errors. This method should be used when registering an
- * end test from a different thread than the one that started the test.
- *
- * @param test The test which completed.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void endTest(Test test, Long threadId);
-
- /**
- * Called when a test completes to mark it as a test fail. This method should be used when registering a
- * failure from a different thread than the one that started the test.
- *
- * @param test The test which failed.
- * @param e The assertion that failed the test.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void addFailure(Test test, AssertionFailedError e, Long threadId);
-
- /**
- * Notifies listeners of the start of a complete run of tests.
- */
- public void startBatch();
-
- /**
- * Notifies listeners of the end of a complete run of tests.
- *
- * @param parameters The optional test parameters to log out with the batch results.
- */
- public void endBatch(Properties parameters);
-
- /**
- * Notifies listeners of the tests read/set properties.
- *
- * @param properties The tests read/set properties.
- */
- public void properties(Properties properties);
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/XMLTestListener.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/XMLTestListener.java
deleted file mode 100644
index 003bd0cecc..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/XMLTestListener.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.listeners;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestCase;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.ShutdownHookable;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.util.*;
-
-/**
- * Listens for test results for a named test and outputs these in the standard JUnit XML format to the specified
- * writer.
- *
- * <p/>The API for this listener accepts notifications about different aspects of a tests results through different
- * methods, so some assumption needs to be made as to which test result a notification refers to. For example
- * {@link #startTest} will be called, then possibly {@link #timing} will be called, even though the test instance is
- * passed in both cases, it is not enough to distinguish a particular run of the test, as the test case instance may
- * be being shared between multiple threads, or being run a repeated number of times, and can therfore be re-used
- * between calls. The listeners make the assumption that, for every test, a unique thread will call {@link #startTest}
- * and {@link #endTest} to delimit each test. All calls to set test parameters, timings, state and so on, will occur
- * between the start and end and will be given with the same thread id as the start and end, so the thread id provides
- * a unqiue value to identify a particular test run against.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Listen to test lifecycle notifications.
- * <tr><td> Listen to test errors and failures.
- * <tr><td> Listen to test timings.
- * <tr><td> Listen to test memory usages.
- * <tr><td> Listen to parameterized test parameters.
- * <tr><th> Responsibilities
- * </table>
- *
- * @todo Merge this class with CSV test listener, making the collection of results common to both, and only factoring
- * out the results printing code into sub-classes. Provide a simple XML results formatter with the same format as
- * the ant XML formatter, and a more structured one for outputing results with timings and summaries from
- * performance tests.
- *
- * @author Rupert Smith
- */
-public class XMLTestListener implements TKTestListener, ShutdownHookable
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(XMLTestListener.class);
-
- /** The results file writer. */
- protected Writer writer;
-
- /** Holds the results for individual tests. */
- // protected Map<Result, Result> results = new LinkedHashMap<Result, Result>();
- // protected List<Result> results = new ArrayList<Result>();
-
- /**
- * Map for holding results on a per thread basis as they come in. A ThreadLocal is not used as sometimes an
- * explicit thread id must be used, where notifications come from different threads than the ones that called
- * the test method.
- */
- private Map<Long, Result> threadLocalResults = Collections.synchronizedMap(new LinkedHashMap<Long, Result>());
-
- /**
- * Holds results for tests that have ended. Transferring these results here from the per-thread results map, means
- * that the thread id is freed for the thread to generate more results.
- */
- private List<Result> results = new ArrayList<Result>();
-
- /** Holds the overall error count. */
- private int errors = 0;
-
- /** Holds the overall failure count. */
- private int failures = 0;
-
- /** Holds the overall tests run count. */
- private int runs = 0;
-
- /** Holds the name of the class that tests are being run for. */
- private String testClassName;
-
- /**
- * Creates a new XML results output listener that writes to the specified location.
- *
- * @param writer The location to write results to.
- * @param testClassName The name of the test class to include in the test results.
- */
- public XMLTestListener(Writer writer, String testClassName)
- {
- log.debug("public XMLTestListener(Writer writer, String testClassName = " + testClassName + "): called");
-
- this.writer = writer;
- this.testClassName = testClassName;
- }
-
- /**
- * Resets the test results to the default state of time zero, memory usage zero, parameter zero, test passed.
- *
- * @param test The test to resest any results for.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void reset(Test test, Long threadId)
- {
- log.debug("public void reset(Test test = " + test + ", Long threadId = " + threadId + "): called");
-
- XMLTestListener.Result r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.error = null;
- r.failure = null;
-
- }
-
- /**
- * Notification that a test started.
- *
- * @param test The test that started.
- */
- public void startTest(Test test)
- {
- log.debug("public void startTest(Test test = " + test + "): called");
-
- Result newResult = new Result(test.getClass().getName(), ((TestCase) test).getName());
-
- // Initialize the thread local test results.
- threadLocalResults.put(Thread.currentThread().getId(), newResult);
- runs++;
- }
-
- /**
- * Should be called every time a test completes with the run time of that test.
- *
- * @param test The name of the test.
- * @param nanos The run time of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing(Test test, long nanos, Long threadId)
- { }
-
- /**
- * Optionally called every time a test completes with the second timing test.
- *
- * @param test The name of the test.
- * @param nanos The second timing information of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing2(Test test, Long nanos, Long threadId)
- { }
-
- /**
- * Should be called every time a test completed with the amount of memory used before and after the test was run.
- *
- * @param test The test which memory was measured for.
- * @param memStart The total JVM memory used before the test was run.
- * @param memEnd The total JVM memory used after the test was run.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void memoryUsed(Test test, long memStart, long memEnd, Long threadId)
- { }
-
- /**
- * Should be called every time a parameterized test completed with the int value of its test parameter.
- *
- * @param test The test which memory was measured for.
- * @param parameter The int parameter value.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void parameterValue(Test test, int parameter, Long threadId)
- { }
-
- /**
- * Should be called every time a test completes with the current number of test threads running.
- *
- * @param test The test for which the measurement is being generated.
- * @param threads The number of tests being run concurrently.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void concurrencyLevel(Test test, int threads, Long threadId)
- { }
-
- /**
- * Notifies listeners of the tests read/set properties.
- *
- * @param properties The tests read/set properties.
- */
- public void properties(Properties properties)
- { }
-
- /**
- * Notification that a test ended.
- *
- * @param test The test that ended.
- */
- public void endTest(Test test)
- {
- log.debug("public void endTest(Test test = " + test + "): called");
-
- // Move complete test results into the completed tests list.
- Result r = threadLocalResults.get(Thread.currentThread().getId());
- results.add(r);
-
- // Clear all the test results for the thread.
- threadLocalResults.remove(Thread.currentThread().getId());
- }
-
- /**
- * Called when a test completes. Success, failure and errors. This method should be used when registering an
- * end test from a different thread than the one that started the test.
- *
- * @param test The test which completed.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void endTest(Test test, Long threadId)
- {
- log.debug("public void endTest(Test test = " + test + ", Long threadId = " + threadId + "): called");
-
- // Move complete test results into the completed tests list.
- Result r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
- results.add(r);
-
- // Clear all the test results for the thread.
- threadLocalResults.remove(Thread.currentThread().getId());
- }
-
- /**
- * An error occurred.
- *
- * @param test The test in which the error occurred.
- * @param t The throwable that resulted from the error.
- */
- public void addError(Test test, Throwable t)
- {
- log.debug("public void addError(Test test = " + test + ", Throwable t = " + t + "): called");
-
- Result r = threadLocalResults.get(Thread.currentThread().getId());
- r.error = t;
- errors++;
- }
-
- /**
- * A failure occurred.
- *
- * @param test The test in which the failure occurred.
- * @param t The JUnit assertions that led to the failure.
- */
- public void addFailure(Test test, AssertionFailedError t)
- {
- log.debug("public void addFailure(Test test = " + test + ", AssertionFailedError t = " + t + "): called");
-
- Result r = threadLocalResults.get(Thread.currentThread().getId());
- r.failure = t;
- failures++;
- }
-
- /**
- * Called when a test completes to mark it as a test fail. This method should be used when registering a
- * failure from a different thread than the one that started the test.
- *
- * @param test The test which failed.
- * @param e The assertion that failed the test.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void addFailure(Test test, AssertionFailedError e, Long threadId)
- {
- log.debug("public void addFailure(Test test, AssertionFailedError e, Long threadId): called");
-
- Result r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
- r.failure = e;
- failures++;
- }
-
- /**
- * Notifies listeners of the start of a complete run of tests.
- */
- public void startBatch()
- {
- log.debug("public void startBatch(): called");
-
- // Reset all results counts.
- threadLocalResults = Collections.synchronizedMap(new HashMap<Long, Result>());
- errors = 0;
- failures = 0;
- runs = 0;
-
- // Write out the file header.
- try
- {
- writer.write("<?xml version=\"1.0\" ?>\n");
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write the test results.", e);
- }
- }
-
- /**
- * Notifies listeners of the end of a complete run of tests.
- *
- * @param parameters The optional test parameters to log out with the batch results.
- */
- public void endBatch(Properties parameters)
- {
- log.debug("public void endBatch(Properties parameters = " + parameters + "): called");
-
- // Write out the results.
- try
- {
- // writer.write("<?xml version=\"1.0\" ?>\n");
- writer.write("<testsuite errors=\"" + errors + "\" failures=\"" + failures + "\" tests=\"" + runs + "\" name=\""
- + testClassName + "\">\n");
-
- for (Result result : results)
- {
- writer.write(" <testcase classname=\"" + result.testClass + "\" name=\"" + result.testName + "\">\n");
-
- if (result.error != null)
- {
- writer.write(" <error type=\"" + result.error.getClass() + "\">");
- result.error.printStackTrace(new PrintWriter(writer));
- writer.write(" </error>");
- }
- else if (result.failure != null)
- {
- writer.write(" <failure type=\"" + result.failure.getClass() + "\">");
- result.failure.printStackTrace(new PrintWriter(writer));
- writer.write(" </failure>");
- }
-
- writer.write(" </testcase>\n");
- }
-
- writer.write("</testsuite>\n");
- writer.flush();
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write the test results.", e);
- }
- }
-
- /**
- * Supplies the shutdown hook.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- log.debug("XMLTestListener::ShutdownHook: called");
- }
- });
- }
-
- /**
- * Used to capture the results of a particular test run.
- */
- protected static class Result
- {
- /** Holds the name of the test class. */
- public String testClass;
-
- /** Holds the name of the test method. */
- public String testName;
-
- /** Holds the exception that caused error in this test. */
- public Throwable error;
-
- /** Holds the assertion exception that caused failure in this test. */
- public AssertionFailedError failure;
-
- /**
- * Creates a placeholder for the results of a test.
- *
- * @param testClass The test class.
- * @param testName The name of the test that was run.
- */
- public Result(String testClass, String testName)
- {
- this.testClass = testClass;
- this.testName = testName;
- }
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/package.html b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/package.html
deleted file mode 100644
index 15acc02ab1..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/package.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<html>
-<body>
-Listners for test statistics are defined in this package. At the moment there is only one listener which writes all test
-statistics out to a CSV (comma seperated values) file which can be loaded by most spread sheets.
-</body>
-</html>
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/package.html b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/package.html
deleted file mode 100644
index 4cab8d936a..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/package.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<html>
-<body>
-Basic JUnit is enahanced with test runners to run tests repeatedly, simultaneously in many threads and with increasing
-test sizes for asymptotic performance measurements. There are features to measure the time and amount of memory that
-tests use as well as to record the asymptotic test size parameters. There are some utilities to write these test
-statistics to various file formats too and these can be found in the listeners package.
-
-</p>The main test runner class is TKTestRunner which can be called with command line parameters to specify how tests
-should be run.
-
-</body>
-</html>
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/CommandLineParser.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/CommandLineParser.java
deleted file mode 100644
index f158090e96..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/CommandLineParser.java
+++ /dev/null
@@ -1,787 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-import java.text.CharacterIterator;
-import java.text.StringCharacterIterator;
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * CommandLineParser provides a utility for specifying the format of a command line and parsing command lines to ensure
- * that they fit their specified format. A command line is made up of flags and options, both may be refered to as
- * options. A flag is an option that does not take an argument (specifying it means it has the value 'true' and not
- * specifying it means it has the value 'false'). Options must take arguments but they can be set up with defaults so
- * that they take a default value when not set. Options may be mandatory in wich case it is an error not to specify
- * them on the command line. Flags are never mandatory because they are implicitly set to false when not specified.
- *
- * <p/>Some examples command line are:
- *
- * <ul>
- * <li>This one has two options that expect arguments:
- * <pre>
- * cruisecontrol -configfile cruisecontrol.xml -port 9000
- * </pre>
- * <li>This has one no-arg flag and two 'free' arguments:
- * <pre>
- * zip -r project.zip project/*
- * </pre>
- * <li>This one concatenates multiple flags into a single block with only one '-':
- * <pre>
- * jar -tvf mytar.tar
- * </pre>
- *
- * <p/>The parsing rules are:
- *
- * <ol>
- * <li>Flags may be combined after a single '-' because they never take arguments. Normally such flags are single letter
- * flags but this is only a convention and not enforced. Flags of more than one letter are usually specified on their own.
- * <li>Options expecting arguments must always be on their own.
- * <li>The argument to an option may be seperated from it by whitespace or appended directly onto the option.
- * <li>The argument to an option may never begin with a '-' character.
- * <li>All other arguments not beginning with a '-' character are free arguments that do not belong to any option.
- * <li>The second or later of a set of duplicate or repeated flags override earlier ones.
- * <li>Options are matched up to the shortest matching option. This is because of the possibility of having no space
- * between an option and its argument. This rules out the possibility of using two options where one is an opening
- * substring of the other. For example, the options "foo" and "foobar" cannot be used on the same command line because
- * it is not possible to distinguish the argument "-foobar" from being the "foobar" option or the "foo" option with
- * the "bar" argument.
- * </ol>
- *
- * <p/>By default, unknown options are simply ignored if specified on the command line. This behaviour may be changed
- * so that the parser reports all unknowns as errors by using the {@link #setErrorsOnUnknowns} method.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Accept a command line specification.
- * <tr><td> Parse a command line into properties, validating it against its specification.
- * <tr><td> Report all errors between a command line and its specification.
- * <tr><td> Provide a formatted usage string for a command line.
- * <tr><td> Provide a formatted options in force string for a command line.
- * <tr><td> Allow errors on unknowns behaviour to be turned on or off.
- * </table>
- *
- * @author Rupert Smith
- */
-public class CommandLineParser
-{
- /**
- * Holds a mapping from command line option names to detailed information about those options.
- * Use of a tree map ensures that the options are easy to print in alphabetical order as a usage string.
- * An alternative might be to use a LinkedHashMap to print them in the order they are specified.
- */
- private Map<String, CommandLineOption> optionMap = new TreeMap<String, CommandLineOption>();
-
- /** Holds a list of parsing errors. */
- private List<String> parsingErrors = new ArrayList<String>();
-
- /** Holds the regular head matcher to match command line options with. */
- private Matcher optionMatcher = null;
-
- /** Holds the parsed command line properties after parsing. */
- private Properties parsedProperties = null;
-
- /** Holds any trailing name=value pairs specified in the free arguments. */
- private Properties trailingProperties = null;
-
- /** Flag used to indicate that errors should be created for unknown options. False by default. */
- private boolean errorsOnUnknowns = false;
-
- /**
- * Creates a command line options parser from a command line specification. This is passed to this constructor
- * as an array of arrays of strings. Each array of strings specifies the command line for a single option. A static
- * array may therefore easily be used to configure the command line parser in a single method call with an easily
- * readable format.
- *
- * <p/>Each array of strings must be 2, 3, 4 or 5 elements long. If any of the last three elements are missing they
- * are assumed to be null. The elements specify the following parameters:
- * <ol>
- * <li>The name of the option without the leading '-'. For example, "file". To specify the format of the 'free'
- * arguments use the option names "1", "2", ... and so on.
- * <li>The option comment. A line of text describing the usage of the option. For example, "The file to be processed."
- * <li>The options argument. This is a very short description of the argument to the option, often a single word
- * or a reminder as to the arguments format. When this element is null the option is a flag and does not
- * accept any arguments. For example, "filename" or "(unix | windows)" or null. The actual text specified
- * is only used to print in the usage message to remind the user of the usage of the option.
- * <li>The mandatory flag. When set to "true" an option must always be specified. Any other value, including null,
- * means that the option is mandatory. Flags are always mandatory (see class javadoc for explanation of why) so
- * this is ignored for flags.
- * <li>A regular head describing the format that the argument must take. Ignored if null.
- * </ol>
- * <p/>An example call to this constructor is:
- *
- * <pre>
- * CommandLineParser commandLine = new CommandLineParser(
- * new String[][] {{"file", "The file to be processed. ", "filename", "true"},
- * {"dir", "Directory to store results in. Current dir used if not set.", "out dir"},
- * {"os", "Operating system EOL format to use.", "(windows | unix)", null, "windows\|unix"},
- * {"v", "Verbose mode. Prints information about the processing as it goes."},
- * {"1", "The processing command to run.", "command", "true", "add\|remove\|list"}});
- * </pre>
- *
- * @param config The configuration as an array of arrays of strings.
- */
- public CommandLineParser(String[][] config)
- {
- // Loop through all the command line option specifications creating details for each in the options map.
- for (String[] nextOptionSpec : config)
- {
- addOption(nextOptionSpec[0], nextOptionSpec[1], (nextOptionSpec.length > 2) ? nextOptionSpec[2] : null,
- (nextOptionSpec.length > 3) && ("true".equals(nextOptionSpec[3])),
- (nextOptionSpec.length > 4) ? nextOptionSpec[4] : null);
- }
- }
-
- /**
- * Extracts all name=value pairs from the command line, sets them all as system properties and also returns
- * a map of properties containing them.
- *
- * @param args The command line.
- * @param commandLine The command line parser.
- * @param properties The properties object to inject all parsed properties into (optional may be <tt>null</tt>).
- *
- * @return A set of properties containing all name=value pairs from the command line.
- */
- public static Properties processCommandLine(String[] args, CommandLineParser commandLine, Properties properties)
- {
- // Capture the command line arguments or display errors and correct usage and then exit.
- Properties options = null;
-
- try
- {
- options = commandLine.parseCommandLine(args);
-
- // Add all the command line options and trailing settings to properties if the optional properties object
- // to copy them into has been set.
- if (properties != null)
- {
- commandLine.addTrailingPairsToProperties(properties);
- commandLine.addOptionsToProperties(properties);
- }
- }
- catch (IllegalArgumentException e)
- {
- System.out.println(commandLine.getErrors());
- System.out.println(commandLine.getUsage());
- System.exit(1);
- }
-
- return options;
- }
-
- /**
- * Lists all the parsing errors from the most recent parsing in a string.
- *
- * @return All the parsing errors from the most recent parsing.
- */
- public String getErrors()
- {
- // Return the empty string if there are no errors.
- if (parsingErrors.isEmpty())
- {
- return "";
- }
-
- // Concatenate all the parsing errors together.
- String result = "";
-
- for (String s : parsingErrors)
- {
- result += s;
- }
-
- return result;
- }
-
- /**
- * Lists the properties set from the most recent parsing or an empty string if no parsing has been done yet.
- *
- * @return The properties set from the most recent parsing or an empty string if no parsing has been done yet.
- */
- public String getOptionsInForce()
- {
- // Check if there are no properties to report and return and empty string if so.
- if (parsedProperties == null)
- {
- return "";
- }
-
- // List all the properties.
- String result = "Options in force:\n";
-
- for (Map.Entry<Object, Object> property : parsedProperties.entrySet())
- {
- result += property.getKey() + " = " + property.getValue() + "\n";
- }
-
- return result;
- }
-
- /**
- * Generates a usage string consisting of the name of each option and each options argument description and
- * comment.
- *
- * @return A usage string for all the options.
- */
- public String getUsage()
- {
- String result = "Options:\n";
-
- int optionWidth = 0;
- int argumentWidth = 0;
-
- // Calculate the column widths required for aligned layout.
- for (CommandLineOption optionInfo : optionMap.values())
- {
- int oWidth = optionInfo.option.length();
- int aWidth = (optionInfo.argument != null) ? (optionInfo.argument.length()) : 0;
-
- optionWidth = (oWidth > optionWidth) ? oWidth : optionWidth;
- argumentWidth = (aWidth > argumentWidth) ? aWidth : argumentWidth;
- }
-
- // Print usage on each of the command line options.
- for (CommandLineOption optionInfo : optionMap.values())
- {
- String argString = ((optionInfo.argument != null) ? (optionInfo.argument) : "");
- String optionString = optionInfo.option;
-
- argString = rightPad(argString, " ", argumentWidth);
- optionString = rightPad(optionString, " ", optionWidth);
-
- result += "-" + optionString + " " + argString + " " + optionInfo.comment + "\n";
- }
-
- return result;
- }
-
- /**
- * Right pads a string with a given string to a given size. This method will repeat the padder string as many
- * times as is necessary until the exact specified size is reached. If the specified size is less than the size
- * of the original string then the original string is returned unchanged.
- *
- * <pre>
- * Example1 - original string "cat", padder string "white", size 8 gives "catwhite".
- * Example2 - original string "cat", padder string "white", size 15 gives "catwhitewhitewh".
- * Example3 - original string "cat", padder string "white", size 2 gives "cat".
- * </pre>
- *
- * @param stringToPad The original string.
- * @param padder The string to pad onto the original string.
- * @param size The required size of the new string.
- *
- * @return The newly padded string.
- */
- public static String rightPad(String stringToPad, String padder, int size)
- {
- if (padder.length() == 0)
- {
- return stringToPad;
- }
-
- StringBuffer strb = new StringBuffer(stringToPad);
- StringCharacterIterator sci = new StringCharacterIterator(padder);
-
- while (strb.length() < size)
- {
- for (char ch = sci.first(); ch != CharacterIterator.DONE; ch = sci.next())
- {
- if (strb.length() < size)
- {
- strb.append(String.valueOf(ch));
- }
- }
- }
-
- return strb.toString();
- }
-
- /**
- * Control the behaviour of the errors on unkowns reporting. When turned on this reports all unkowns options
- * as errors. When turned off, all unknowns are simply ignored.
- *
- * @param errors The setting of the errors on unkown flag. True to turn it on.
- */
- public void setErrorsOnUnknowns(boolean errors)
- {
- errorsOnUnknowns = errors;
- }
-
- /**
- * Parses a set of command line arguments into a set of properties, keyed by the argument flag. The free arguments
- * are keyed by integers as strings starting at "1" and then "2", ... and so on.
- *
- * <p/>See the class level comment for a description of the parsing rules.
- *
- * @param args The command line arguments.
- *
- * @return The arguments as a set of properties.
- *
- * @throws IllegalArgumentException If the command line cannot be parsed against its specification. If this exception
- * is thrown a call to {@link #getErrors} will provide a diagnostic of the command
- * line errors.
- */
- public Properties parseCommandLine(String[] args) throws IllegalArgumentException
- {
- Properties options = new Properties();
-
- // Used to keep count of the current 'free' argument.
- int free = 1;
-
- // Used to indicate that the most recently parsed option is expecting arguments.
- boolean expectingArgs = false;
-
- // The option that is expecting arguments from the next element of the command line.
- String optionExpectingArgs = null;
-
- // Used to indicate that the most recently parsed option is a duplicate and should be ignored.
- // boolean ignore = false;
-
- // Create the regular head matcher for the command line options.
- String regexp = "^(";
- int optionsAdded = 0;
-
- for (Iterator<String> i = optionMap.keySet().iterator(); i.hasNext();)
- {
- String nextOption = i.next();
-
- // Check that the option is not a free argument definition.
- boolean notFree = false;
-
- try
- {
- Integer.parseInt(nextOption);
- }
- catch (NumberFormatException e)
- {
- notFree = true;
- }
-
- // Add the option to the regular head matcher if it is not a free argument definition.
- if (notFree)
- {
- regexp += nextOption + (i.hasNext() ? "|" : "");
- optionsAdded++;
- }
- }
-
- // There has to be more that one option in the regular head or else the compiler complains that the close
- // cannot be nullable if the '?' token is used to make the matched option string optional.
- regexp += ")" + ((optionsAdded > 0) ? "?" : "") + "(.*)";
- Pattern pattern = Pattern.compile(regexp);
-
- // Loop through all the command line arguments.
- for (String arg1 : args)
- {
- // Check if the next command line argument begins with a '-' character and is therefore the start of
- // an option.
- if (arg1.startsWith("-"))
- {
- // Extract the value of the option without the leading '-'.
- String arg = arg1.substring(1);
-
- // Match up to the longest matching option.
- optionMatcher = pattern.matcher(arg);
- optionMatcher.matches();
-
- String matchedOption = optionMatcher.group(1);
-
- // Match any argument directly appended onto the longest matching option.
- String matchedArg = optionMatcher.group(2);
-
- // Check that a known option was matched.
- if ((matchedOption != null) && !"".equals(matchedOption))
- {
- // Get the command line option information for the matched option.
- CommandLineOption optionInfo = optionMap.get(matchedOption);
-
- // Check if this option is expecting arguments.
- if (optionInfo.expectsArgs)
- {
- // The option is expecting arguments so swallow the next command line argument as an
- // argument to this option.
- expectingArgs = true;
- optionExpectingArgs = matchedOption;
-
- // In the mean time set this options argument to the empty string in case no argument is ever
- // supplied.
- // options.put(matchedOption, "");
- }
-
- // Check if the option was matched on its own and is a flag in which case set that flag.
- if ("".equals(matchedArg) && !optionInfo.expectsArgs)
- {
- options.put(matchedOption, "true");
- }
- // The option was matched as a substring with its argument appended to it or is a flag that is
- // condensed together with other flags.
- else if (!"".equals(matchedArg))
- {
- // Check if the option is a flag and therefore is allowed to be condensed together
- // with other flags.
- if (!optionInfo.expectsArgs)
- {
- // Set the first matched flag.
- options.put(matchedOption, "true");
-
- // Repeat the longest matching process on the remainder but ensure that the remainder
- // consists only of flags as only flags may be condensed together in this fashion.
- do
- {
- // Match the remainder against the options.
- optionMatcher = pattern.matcher(matchedArg);
- optionMatcher.matches();
-
- matchedOption = optionMatcher.group(1);
- matchedArg = optionMatcher.group(2);
-
- // Check that an option was matched.
- if (matchedOption != null)
- {
- // Get the command line option information for the next matched option.
- optionInfo = optionMap.get(matchedOption);
-
- // Ensure that the next option is a flag or raise an error if not.
- if (optionInfo.expectsArgs)
- {
- parsingErrors.add("Option " + matchedOption + " cannot be combined with flags.\n");
- }
-
- options.put(matchedOption, "true");
- }
- // The remainder could not be matched against a flag it is either an unknown flag
- // or an illegal argument to a flag.
- else
- {
- parsingErrors.add("Illegal argument to a flag in the option " + arg + "\n");
-
- break;
- }
- }
- // Continue until the remainder of the argument has all been matched with flags.
- while (!"".equals(matchedArg));
- }
- // The option is expecting an argument, so store the unmatched portion against it
- // as its argument.
- else
- {
- // Check the arguments format is correct against any specified format.
- checkArgumentFormat(optionInfo, matchedArg);
-
- // Store the argument against its option (regardless of its format).
- options.put(matchedOption, matchedArg);
-
- // The argument to this flag has already been supplied to it. Do not swallow the
- // next command line argument as an argument to this flag.
- expectingArgs = false;
- }
- }
- }
- else // No matching option was found.
- {
- // Add this to the list of parsing errors if errors on unkowns is being used.
- if (errorsOnUnknowns)
- {
- parsingErrors.add("Option " + matchedOption + " is not a recognized option.\n");
- }
- }
- }
- // The command line argument did not being with a '-' so it is an argument to the previous flag or it
- // is a free argument.
- else
- {
- // Check if a previous flag is expecting to swallow this next argument as its argument.
- if (expectingArgs)
- {
- // Get the option info for the option waiting for arguments.
- CommandLineOption optionInfo = optionMap.get(optionExpectingArgs);
-
- // Check the arguments format is correct against any specified format.
- checkArgumentFormat(optionInfo, arg1);
-
- // Store the argument against its option (regardless of its format).
- options.put(optionExpectingArgs, arg1);
-
- // Clear the expecting args flag now that the argument has been swallowed.
- expectingArgs = false;
- optionExpectingArgs = null;
- }
- // This command line option is not an argument to any option. Add it to the set of 'free' options.
- else
- {
- // Get the option info for the free option, if there is any.
- CommandLineOption optionInfo = optionMap.get(Integer.toString(free));
-
- if (optionInfo != null)
- {
- // Check the arguments format is correct against any specified format.
- checkArgumentFormat(optionInfo, arg1);
- }
-
- // Add to the list of free options.
- options.put(Integer.toString(free), arg1);
-
- // Move on to the next free argument.
- free++;
- }
- }
- }
-
- // Scan through all the specified options to check that all mandatory options have been set and that all flags
- // that were not set are set to false in the set of properties.
- for (CommandLineOption optionInfo : optionMap.values())
- {
- // Check if this is a flag.
- if (!optionInfo.expectsArgs)
- {
- // Check if the flag is not set in the properties and set it to false if so.
- if (!options.containsKey(optionInfo.option))
- {
- options.put(optionInfo.option, "false");
- }
- }
- // Check if this is a mandatory option and was not set.
- else if (optionInfo.mandatory && !options.containsKey(optionInfo.option))
- {
- // Create an error for the missing option.
- parsingErrors.add("Option " + optionInfo.option + " is mandatory but not was not specified.\n");
- }
- }
-
- // Check if there were any errors.
- if (!parsingErrors.isEmpty())
- {
- // Throw an illegal argument exception to signify that there were parsing errors.
- throw new IllegalArgumentException();
- }
-
- // Convert any name/value pairs in the free arguments into properties in the parsed options.
- trailingProperties = takeFreeArgsAsProperties(options, 1);
-
- parsedProperties = options;
-
- return options;
- }
-
- /**
- * If a command line has been parsed, calling this method sets all of its free arguments that were name=value pairs
- * on the specified properties.
- *
- * @param properties The property set to add the name=value pairs to.
- */
- public void addTrailingPairsToProperties(Properties properties)
- {
- if (trailingProperties != null)
- {
- for (Object propKey : trailingProperties.keySet())
- {
- String name = (String) propKey;
- String value = trailingProperties.getProperty(name);
-
- properties.setProperty(name, value);
- }
- }
- }
-
- /**
- * If a command line has been parsed, calling this method sets all of its options that were set to the specified
- * properties.
- *
- * @param properties The property set to the options to.
- */
- public void addOptionsToProperties(Properties properties)
- {
- if (parsedProperties != null)
- {
- for (Object propKey : parsedProperties.keySet())
- {
- String name = (String) propKey;
- String value = parsedProperties.getProperty(name);
-
- // This filters out all trailing items.
- if (!name.matches("^[0-9]+$"))
- {
- properties.setProperty(name, value);
- }
- }
- }
- }
-
- /**
- * Resets this command line parser after it has been used to parse a command line. This method will only need
- * to be called to use this parser a second time which is not likely seeing as a command line is usually only
- * specified once. However, it is exposed as a public method for the rare case where this may be done.
- *
- * <p/>Cleans the internal state of this parser, removing all stored errors and information about the options in
- * force.
- */
- public void reset()
- {
- parsingErrors = new ArrayList<String>();
- parsedProperties = null;
- }
-
- /**
- * Adds the option to list of available command line options.
- *
- * @param option The option to add as an available command line option.
- * @param comment A comment for the option.
- * @param argument The text that appears after the option in the usage string.
- * @param mandatory When true, indicates that this option is mandatory.
- * @param formatRegexp The format that the argument must take, defined as a regular head.
- */
- protected void addOption(String option, String comment, String argument, boolean mandatory, String formatRegexp)
- {
- // Check if usage text has been set in which case this option is expecting arguments.
- boolean expectsArgs = (!((argument == null) || argument.equals("")));
-
- // Add the option to the map of command line options.
- CommandLineOption opt = new CommandLineOption(option, expectsArgs, comment, argument, mandatory, formatRegexp);
- optionMap.put(option, opt);
- }
-
- /**
- * Converts the free arguments into property declarations. After parsing the command line the free arguments
- * are numbered from 1, such that the parsed properties contain values for the keys "1", "2", ... This method
- * converts any free arguments declared using the 'name=value' syntax into properties with key 'name', value
- * 'value'.
- *
- * <p/>For example the comand line:
- * <pre>
- * ... debug=true
- * </pre>
- *
- * <p/>After parsing has properties:
- * <pre>[[1, debug=true]]</pre>
- *
- * <p/>After applying this method the properties are:
- * <pre>[[1, debug=true], [debug, true]]</pre>
- *
- * @param properties The parsed command line properties.
- * @param from The free argument index to convert to properties from.
- *
- * @return The parsed command line properties, with free argument name value pairs too.
- */
- private Properties takeFreeArgsAsProperties(Properties properties, int from)
- {
- Properties result = new Properties();
-
- for (int i = from; true; i++)
- {
- String nextFreeArg = properties.getProperty(Integer.toString(i));
-
- // Terminate the loop once all free arguments have been consumed.
- if (nextFreeArg == null)
- {
- break;
- }
-
- // Split it on the =, strip any whitespace and set it as a system property.
- String[] nameValuePair = nextFreeArg.split("=");
-
- if (nameValuePair.length == 2)
- {
- result.setProperty(nameValuePair[0], nameValuePair[1]);
- }
- }
-
- return result;
- }
-
- /**
- * Checks the format of an argument to an option against its specified regular head format if one has
- * been set. Any errors are added to the list of parsing errors.
- *
- * @param optionInfo The command line option information for the option which is havings its argument checked.
- * @param matchedArg The string argument to the option.
- */
- private void checkArgumentFormat(CommandLineOption optionInfo, String matchedArg)
- {
- // Check if this option enforces a format for its argument.
- if (optionInfo.argumentFormatRegexp != null)
- {
- Pattern pattern = Pattern.compile(optionInfo.argumentFormatRegexp);
- Matcher argumentMatcher = pattern.matcher(matchedArg);
-
- // Check if the argument does not meet its required format.
- if (!argumentMatcher.matches())
- {
- // Create an error for this badly formed argument.
- parsingErrors.add("The argument to option " + optionInfo.option + " does not meet its required format.\n");
- }
- }
- }
-
- /**
- * Holds information about a command line options. This includes what its name is, whether or not it is a flag,
- * whether or not it is mandatory, what its user comment is, what its argument reminder text is and what its
- * regular head format is.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Hold details of a command line option.
- * </table>
- *
- * @author Rupert Smith
- */
- protected class CommandLineOption
- {
- /** Holds the text for the flag to match this argument with. */
- public String option = null;
-
- /** Holds a string describing how to use this command line argument. */
- public String argument = null;
-
- /** Flag that determines whether or not this command line argument can take arguments. */
- public boolean expectsArgs = false;
-
- /** Holds a short comment describing what this command line argument is for. */
- public String comment = null;
-
- /** Flag that determines whether or not this is an mandatory command line argument. */
- public boolean mandatory = false;
-
- /** A regular head describing what format the argument to this option muist have. */
- public String argumentFormatRegexp = null;
-
- /**
- * Create a command line option object that holds specific information about a command line option.
- *
- * @param option The text that matches the option.
- * @param expectsArgs Whether or not the option expects arguments. It is a flag if this is false.
- * @param comment A comment explaining how to use this option.
- * @param argument A short reminder of the format of the argument to this option/
- * @param mandatory Set to true if this option is mandatory.
- * @param formatRegexp The regular head that the argument to this option must meet to be valid.
- */
- public CommandLineOption(String option, boolean expectsArgs, String comment, String argument, boolean mandatory,
- String formatRegexp)
- {
- this.option = option;
- this.expectsArgs = expectsArgs;
- this.comment = comment;
- this.argument = argument;
- this.mandatory = mandatory;
- this.argumentFormatRegexp = formatRegexp;
- }
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ContextualProperties.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ContextualProperties.java
deleted file mode 100644
index 14de96d165..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ContextualProperties.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * ContextualProperties is an extension of {@link java.util.Properties} that automatically selects properties based on an
- * environment parameter (defined by the system property {@link #ENV_SYS_PROPERTY}), the name of a class, plus a modifier
- * (which can be used to name a method of a class) and a property key. It also supports the definition of arrays of
- * property values using indexes. The properties are searched in the following order until a match is found:
- *
- * <ol>
- * <li>environment + class name with package name + modifier + key
- * <li>environment + class name with package name + key
- * <li>environment + key
- * <li>class name with package name + modifier + key
- * <li>class name with package name + key
- * <li>key
- * </ol>
- *
- * <p>To create arrays of property values add index numbers onto the end of the property keys. An array of string values
- * will be created with the elements of the array set to the value of the property at the matching index. Ideally the
- * index values will be contiguous, starting at 0. This does not need to be the case however. If an array definition
- * begins at index n, and ends at index m, Then an array big enough to hold m + 1 elements will be created and populated
- * with values from n to m. Values before n and any missing values between n and m will be null in the array.
- *
- * <p>To give an example, suppose you have two different environments 'DEVELOPMENT' and 'PRODUCTION' and they each need
- * the same properties but set to different values for each environment and some properties the same in both, you could
- * create a properties file like:
- *
- * <p><code>
- * # Project configuration properties file.<br/>
- * <br/>
- * # These properties are environment specific.<br/>
- * DEVELOPMENT.debug=true<br/>
- * PRODUCTION.debug=false<br/>
- * <br/>
- * # Always debug MyClass in all environments but not the myMethod method.<br/>
- * MyClass.debug=true<br/>
- * MyClass.myMethod.debug=false<br/>
- * <br/>
- * # Set up an array of my ten favourite animals. Leave elements 3 to 8 as null as I haven't decided on them yet.<br/>
- * animals.0=cat<br/>
- * animals.1=dog<br/>
- * animals.2=elephant<br/>
- * animals.9=lion<br/>
- * <br/>
- * # This is a default value that will be used when the environment is not known.<br/>
- * debug=false<br/>
- * </code>
- *
- * <p>The most specific definition of a property is searched for first moving out to the most general. This allows
- * general property defaults to be set and then overiden for specific uses by some classes and modifiers.
- *
- * <p>A ContextualProperties object can be loaded in the same way as a java.utils.Properties. A recommended way to do
- * this that does not assume that the properties file is a file (it could be in a jar) is to load the properties from the
- * url for the resource lookup up on the classpath:
- *
- * <p><code>
- * Properties configProperties = new ContextualProperties();<br/>
- * configProperties.load(this.getClass().getClassLoader().getResourceAsStream("config.properties"));<br/>
- * </code>
- *
- * <p>EnvironmentProperties will load the 'DEVELOPMENT.debug' property or 'PROUCTION.debug' property based on the setting
- * of the system environment property. If a matching property for the environment cannot be found then the simple property
- * name without the environment pre-pended onto it will be used instead. This 'use of default environments' behaviour is
- * turned on initially but it can be disabled by calling the {@link #useDefaultEnvironments} method.
- *
- * <p>When a property matching a key cannot be found then the property accessor methods will always return null. If a
- * default value for a property exists but the 'use of default environments' behavious prevents it being used then the
- * accessor methods will return null.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Automatically select properties dependant on environment, class name and modifier as well as property key.
- * <tr><td> Convert indexed properties into arrays.
- * </table>
- *
- * @author Rupert Smith
- */
-public class ContextualProperties extends ParsedProperties
-{
- /** The name of the system property that is used to define the environment. */
- public static final String ENV_SYS_PROPERTY = "environment";
-
- /**
- * <p>Holds the iteration count down order.
- *
- * <p>If e = 4, b = 2, m = 1 then the iteration order or i is 7,6,4 and then if using environment defaults 3,2,0
- * where the accessor key is:
- * (i & e != 0 ? environment : "") + (i & b != 0 ? base : "") + (1 + m != 0 ? modifier : "") + key
- *
- * <p>In other words the presence or otherwise of the three least significant bits when counting down from 7
- * specifies which of the environment, base and modifier are to be included in the key where the environment, base
- * and modifier stand for the bits in positions 2, 1 and 0. The numbers 5 and 1 are missed out of the count because
- * they stand for the case where the modifier is used without the base which is not done.
- */
- private static final int[] ORDER = new int[] { 7, 6, 4, 3, 2, 0 };
-
- /**
- * Defines the point in the iteration count order below which the 'use environment defaults' feature is being used.
- */
- private static final int ENVIRONMENT_DEFAULTS_CUTOFF = 4;
-
- /** Defines the bit representation for the environment in the key ordering. See {@link #ORDER}. */
- private static final int E = 4;
-
- /** Defines the bit representation for the base in the key ordering. See {@link #ORDER}. */
- private static final int B = 2;
-
- /** Defines the bit representation for the modifier in the key ordering. See {@link #ORDER}. */
- private static final int M = 1;
-
- /** Used to hold the value of the environment system property. */
- private String environment;
-
- /** Used to indicate that the 'use of defaults' behaviour should be used. */
- private boolean useDefaults = true;
-
- /** Used to hold all the array properties. This is a mapping from property names to ArrayLists of Strings. */
- protected Map arrayProperties = new HashMap();
-
- /**
- * Default constructor that builds a ContextualProperties that uses environment defaults.
- */
- public ContextualProperties()
- {
- super();
-
- // Keep the value of the system environment property.
- environment = System.getProperty(ENV_SYS_PROPERTY);
- }
-
- /**
- * Creates a ContextualProperties that uses environment defaults and is initialized with the specified properties.
- *
- * @param props The properties to initialize this with.
- */
- public ContextualProperties(Properties props)
- {
- super(props);
-
- // Keep the value of the system environment property.
- environment = System.getProperty(ENV_SYS_PROPERTY);
-
- // Extract any array properties as arrays.
- createArrayProperties();
- }
-
- /**
- * Parses an input stream as properties.
- *
- * @param inStream The input stream to read the properties from.
- *
- * @exception IOException If there is an IO error during reading from the input stream.
- */
- public void load(InputStream inStream) throws IOException
- {
- super.load(inStream);
-
- // Extract any array properties as arrays.
- createArrayProperties();
- }
-
- /**
- * Tells this environment aware properties object whether it should use default environment properties without a
- * pre-pended environment when a property for the current environment cannot be found.
- *
- * @param flag True to use defaults, false to not use defaults.
- */
- public void useDefaultEnvironments(boolean flag)
- {
- useDefaults = flag;
- }
-
- /**
- * Looks up a property value relative to the environment, callers class and method. The default environment will be
- * checked for a matching property if defaults are being used. In order to work out the callers class and method this
- * method throws an exception and then searches one level up its stack frames.
- *
- * @param key The property key.
- *
- * @return The value of this property searching from the most specific definition (environment, class, method, key)
- * to the most general (key only), unless use of default environments is turned off in which case the most general
- * proeprty searched is (environment, key).
- */
- public String getProperty(String key)
- {
- // Try to get the callers class name and method name by examing the stack.
- String className = null;
- String methodName = null;
-
- // Java 1.4 onwards only.
- /*try
- {
- throw new Exception();
- }
- catch (Exception e)
- {
- StackTraceElement[] stack = e.getStackTrace();
-
- // Check that the stack trace contains at least two elements, one for this method and one for the caller.
- if (stack.length >= 2)
- {
- className = stack[1].getClassName();
- methodName = stack[1].getMethodName();
- }
- }*/
-
- // Java 1.5 onwards only.
- StackTraceElement[] stack = Thread.currentThread().getStackTrace();
-
- // Check that the stack trace contains at least two elements, one for this method and one for the caller.
- if (stack.length >= 2)
- {
- className = stack[1].getClassName();
- methodName = stack[1].getMethodName();
- }
-
- // Java 1.3 and before? Not sure, some horrible thing that parses the text spat out by printStackTrace?
-
- return getProperty(className, methodName, key);
- }
-
- /**
- * Looks up a property value relative to the environment, base class and modifier. The default environment will be
- * checked for a matching property if defaults are being used.
- *
- * @param base An object of the class to retrieve properties relative to.
- * @param modifier The modifier (which may stand for a method of the class).
- * @param key The property key.
- *
- * @return The value of this property searching from the most specific definition (environment, class, modifier, key)
- * to the most general (key only), unless use of default environments is turned off in which case the most general
- * property searched is (environment, key).
- */
- public String getProperty(Object base, String modifier, String key)
- {
- return getProperty(base.getClass().getName(), modifier, key);
- }
-
- /**
- * Looks up a property value relative to the environment, base class and modifier. The default environment will be
- * checked for a matching property if defaults are being used.
- *
- * @param base The name of the class to retrieve properties relative to.
- * @param modifier The modifier (which may stand for a method of the class).
- * @param key The property key.
- *
- * @return The value of this property searching from the most specific definition (environment, class, modifier, key)
- * to the most general (key only), unless use of default environments is turned off in which case the most general
- * property searched is (environment, key).
- */
- public String getProperty(String base, String modifier, String key)
- {
- String result = null;
-
- // Loop over the key orderings, from the most specific to the most general, until a matching value is found.
- for (Iterator i = getKeyIterator(base, modifier, key); i.hasNext();)
- {
- String nextKey = (String) i.next();
-
- result = super.getProperty(nextKey);
-
- if (result != null)
- {
- break;
- }
- }
-
- return result;
- }
-
- /**
- * Looks up an array property value relative to the environment, callers class and method. The default environment
- * will be checked for a matching array property if defaults are being used. In order to work out the callers class
- * and method this method throws an exception and then searches one level up its stack frames.
- *
- * @param key The property key.
- *
- * @return The array value of this indexed property searching from the most specific definition (environment, class,
- * method, key) to the most general (key only), unless use of default environments is turned off in which
- * case the most general proeprty searched is (environment, key).
- */
- public String[] getProperties(String key)
- {
- // Try to get the callers class name and method name by throwing an exception an searching the stack frames.
- String className = null;
- String methodName = null;
-
- /* Java 1.4 onwards only.
- try {
- throw new Exception();
- } catch (Exception e) {
- StackTraceElement[] stack = e.getStackTrace();
- // Check that the stack trace contains at least two elements, one for this method and one for the caller.
- if (stack.length >= 2) {
- className = stack[1].getClassName();
- methodName = stack[1].getMethodName();
- }
- }*/
- return getProperties(className, methodName, key);
- }
-
- /**
- * Looks up an array property value relative to the environment, base class and modifier. The default environment will
- * be checked for a matching array property if defaults are being used.
- *
- * @param base An object of the class to retrieve properties relative to.
- * @param modifier The modifier (which may stand for a method of the class).
- * @param key The property key.
- *
- * @return The array value of this indexed property searching from the most specific definition (environment, class,
- * modifier, key) to the most general (key only), unless use of default environments is turned off in which
- * case the most general proeprty searched is (environment, key).
- */
- public String[] getProperties(Object base, String modifier, String key)
- {
- return getProperties(base.getClass().getName(), modifier, key);
- }
-
- /**
- * Looks up an array property value relative to the environment, base class and modifier. The default environment will
- * be checked for a matching array property if defaults are being used.
- *
- * @param base The name of the class to retrieve properties relative to.
- * @param modifier The modifier (which may stand for a method of the class).
- * @param key The property key.
- *
- * @return The array value of this indexed property searching from the most specific definition (environment, class,
- * modifier, key) to the most general (key only), unless use of default environments is turned off in which
- * case the most general property searched is (environment, key).
- */
- public String[] getProperties(String base, String modifier, String key)
- {
- String[] result = null;
-
- // Loop over the key orderings, from the most specific to the most general, until a matching value is found.
- for (Iterator i = getKeyIterator(base, modifier, key); i.hasNext();)
- {
- String nextKey = (String) i.next();
- ArrayList arrayList = (ArrayList) arrayProperties.get(nextKey);
-
- if (arrayList != null)
- {
- result = (String[]) arrayList.toArray(new String[] {});
-
- break;
- }
- }
-
- return result;
- }
-
- /**
- * For a given environment, base, modifier and key and setting of the use of default environments feature this
- * generates an iterator that walks over the order in which to try and access properties.
- *
- * <p>See the {@link #ORDER} constant for an explanation of how the key ordering is generated.
- *
- * @param base The name of the class to retrieve properties relative to.
- * @param modifier The modifier (which may stand for a method of the class).
- * @param key The property key.
- *
- * @return An Iterator over String keys defining the order in which properties should be accessed.
- */
- protected Iterator getKeyIterator(final String base, final String modifier, final String key)
- {
- return new Iterator()
- {
- // The key ordering count always begins at the start of the ORDER array.
- private int i = 0;
-
- public boolean hasNext()
- {
- return (useDefaults ? ((i < ORDER.length) && (ORDER[i] > ENVIRONMENT_DEFAULTS_CUTOFF))
- : (i < ORDER.length));
- }
-
- public Object next()
- {
- // Check that there is a next element and return null if not.
- if (!hasNext())
- {
- return null;
- }
-
- // Get the next ordering count.
- int o = ORDER[i];
-
- // Do bit matching on the count to choose which elements to include in the key.
- String result =
- (((o & E) != 0) ? (environment + ".") : "") + (((o & B) != 0) ? (base + ".") : "")
- + (((o & M) != 0) ? (modifier + ".") : "") + key;
-
- // Increment the iterator to get the next key on the next call.
- i++;
-
- return result;
- }
-
- public void remove()
- {
- // This method is not supported.
- throw new UnsupportedOperationException("remove() is not supported on this key order iterator as "
- + "the ordering cannot be changed");
- }
- };
- }
-
- /**
- * Scans all the properties in the parent Properties object and creates arrays for any array property definitions.
- *
- * <p>Array properties are defined with indexes. For example:
- *
- * <p><code>
- * property.1=one<br/>
- * property.2=two<br/>
- * property.3=three<br/>
- * </code>
- *
- * <p>Note that these properties will be stored as the 'empty string' or "" property array.
- *
- * <p><code>
- * .1=one<br/>
- * 2=two<br/>
- * </code>
- */
- protected void createArrayProperties()
- {
- // Scan through all defined properties.
- for (Object o : keySet())
- {
- String key = (String) o;
- String value = super.getProperty(key);
-
- // Split the property key into everything before the last '.' and after it.
- int lastDotIndex = key.lastIndexOf('.');
- String keyEnding = key.substring(lastDotIndex + 1, key.length());
- String keyStart = key.substring(0, (lastDotIndex == -1) ? 0 : lastDotIndex);
-
- // Check if the property key ends in an integer, in which case it is an array property.
- int index = 0;
-
- try
- {
- index = Integer.parseInt(keyEnding);
- }
- // The ending is not an integer so its not an array.
- catch (NumberFormatException e)
- {
- // Scan the next property.
- continue;
- }
-
- // Check if an array property already exists for this base name and create one if not.
- ArrayList propArray = (ArrayList) arrayProperties.get(keyStart);
-
- if (propArray == null)
- {
- propArray = new ArrayList();
- arrayProperties.put(keyStart, propArray);
- }
-
- // Add the new property value to the array property for the index.
- propArray.set(index, value);
- }
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/MathUtils.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/MathUtils.java
deleted file mode 100644
index 7c803294f4..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/MathUtils.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-import java.util.ArrayList;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Mathematical support methods for the toolkit. Caculating averages, variances, min/max for test latencies and
- * generating linear/exponential sequences for test size/concurrency ramping up.
- *
- * <p/>The sequence specifications are of the form [lowest(, ...)(, highest)](,sample=s)(,exp), where round brackets
- * enclose optional values. Using this pattern form it is possible to specify a single value, a range of values divided
- * into s samples, a range of values divided into s samples but distributed exponentially, or a fixed set of samples.
- *
- * <p/>The duration arguments are of the form (dD)(hH)(mM)(sS), where round brackets enclose optional values. At least
- * one of the optional values must be present.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Generate a sequene of integers from a sequence specification.
- * <tr><td> Parse an encoded duration into milliseconds.
- * </table>
- *
- * @author Rupert Smith
- */
-public class MathUtils
-{
- /** Used for debugging. */
- // private static final Logger log = Logger.getLogger(MathUtils.class);
-
- /** The sequence defintion matching regular expression. */
- public static final String SEQUENCE_REGEXP = "^(\\[[0-9:]+\\])(:samples=[0-9]+)?(:exp)?$";
-
- /** The regular expression that matches sequence definitions. */
- private static final Pattern SEQUENCE_PATTERN = Pattern.compile(SEQUENCE_REGEXP);
-
- /** The duration definition matching regular expression. */
- public static final String DURATION_REGEXP = "^(\\d+D)?(\\d+H)?(\\d+M)?(\\d+S)?$";
-
- /** The regular expression that matches the duration expression. */
- public static final Pattern DURATION_PATTERN = Pattern.compile(DURATION_REGEXP);
-
- /** For matching name=value pairs. */
- public static final String NAME_VALUE_REGEXP = "^\\w+=\\w+$";
-
- /** For matching name=[value1: value2: ...] variations. */
- public static final String NAME_VALUE_VARIATION_REGEXP = "^\\w+=\\[[\\w:]+\\]$";
-
- /** For matching name=[n: ... :m](:sample=s)(:exp) sequences. */
- public static final String NAME_VALUE_SEQUENCE_REGEXP = "^\\w+=(\\[[0-9:]+\\])(:samples=[0-9]+)?(:exp)?$";
-
- /** The regular expression that matches name=value pairs and variations. */
- public static final Pattern NAME_VALUE_PATTERN =
- Pattern.compile("(" + NAME_VALUE_REGEXP + ")|(" + NAME_VALUE_VARIATION_REGEXP + ")|(" + NAME_VALUE_SEQUENCE_REGEXP
- + ")");
-
- /**
- * Runs a quick test of the sequence generation methods to confirm that they work as expected.
- *
- * @param args The command line parameters.
- */
- public static void main(String[] args)
- {
- // Use the command line parser to evaluate the command line.
- CommandLineParser commandLine =
- new CommandLineParser(
- new String[][]
- {
- { "s", "The sequence definition.", "[m:...:n](:sample=s)(:exp)", "true", MathUtils.SEQUENCE_REGEXP },
- { "d", "The duration definition.", "dDhHmMsS", "false", MathUtils.DURATION_REGEXP }
- });
-
- // Capture the command line arguments or display errors and correct usage and then exit.
- ParsedProperties options = null;
-
- try
- {
- options = new ParsedProperties(commandLine.parseCommandLine(args));
- }
- catch (IllegalArgumentException e)
- {
- System.out.println(commandLine.getErrors());
- System.out.println(commandLine.getUsage());
- System.exit(-1);
- }
-
- // Extract the command line options.
- String sequence = options.getProperty("s");
- String durationString = options.getProperty("d");
-
- System.out.println("Sequence is: " + printArray(parseSequence(sequence)));
-
- if (durationString != null)
- {
- System.out.println("Duration is: " + parseDuration(durationString));
- }
- }
-
- /**
- * Given a start and end and a number of steps this method generates a sequence of evenly spaced integer
- * values, starting at the start (inclusive) and finishing at the end (inclusive) with the specified number
- * of values in the sequence. The sequence returned may contain less than the specified number where the integer
- * range between start and end is too small to contain that many.
- *
- * <p/>As the results are integers, they will not be perfectly evenly spaced but a best-fit.
- *
- * @param start The sequence start.
- * @param end The sequence end.
- * @param steps The number of steps.
- *
- * @return The sequence.
- */
- public static int[] generateSequence(int start, int end, int steps)
- {
- // Check that there are at least two steps.
- if (steps < 2)
- {
- throw new IllegalArgumentException("There must be at least 2 steps.");
- }
-
- ArrayList<Integer> result = new ArrayList<Integer>();
-
- // Calculate the sequence using floating point, then round into the results.
- double fStart = start;
- double fEnd = end;
- double fCurrent = start;
-
- for (int i = 0; i < steps; i++)
- {
- fCurrent = (((fEnd - fStart) / (steps - 1)) * i) + fStart;
-
- roundAndAdd(result, fCurrent);
- }
-
- // Return the results after converting to a primitive array.
- return intListToPrimitiveArray(result);
- }
-
- /**
- * Given a start and end and a number of steps this method generates a sequence of expontentially spaced integer
- * values, starting at the start (inclusive) and finishing at the end (inclusive) with the specified number
- * of values in the sequence. An exponentially spaced sequence is one where the ratio between any two consecutive
- * numbers in the sequence remains constant. The sequence returned may contain less than the specified number where
- * the difference between two consecutive values is too small (this is more likely at the start of the sequence,
- * where the values are closer together).
- *
- * <p/>As the results are integers, they will not be perfectly exponentially spaced but a best-fit.
- *
- * @param start The sequence start.
- * @param end The sequence end.
- * @param steps The number of steps.
- *
- * @return The sequence.
- */
- public static int[] generateExpSequence(int start, int end, int steps)
- {
- // Check that there are at least two steps.
- if (steps < 2)
- {
- throw new IllegalArgumentException("There must be at least 2 steps.");
- }
-
- ArrayList<Integer> result = new ArrayList<Integer>();
-
- // Calculate the sequence using floating point, then round into the results.
- double fStart = start;
- double fEnd = end;
- // float fCurrent = start;
- double diff = fEnd - fStart;
- double factor = java.lang.Math.pow(diff, (1.0f / (steps - 1)));
-
- for (int i = 0; i < steps; i++)
- {
- // This is a cheat to get the end exactly on and lose the accumulated rounding error.
- if (i == (steps - 1))
- {
- result.add(end);
- }
- else
- {
- roundAndAdd(result, fStart - 1.0f + java.lang.Math.pow(factor, i));
- }
- }
-
- // Return the results after converting to a primitive array.
- return intListToPrimitiveArray(result);
- }
-
- /**
- * Parses a string defintion of a sequence into an int array containing the sequence. The definition will conform
- * to the regular expression: "^(\[[0-9,]+\])(,samples=[0-9]+)?(,exp)?$". This splits it into three parts,
- * an array of integers, the optional sample count and the optional exponential flag.
- *
- * @param sequenceDef The sequence definition.
- *
- * @return The sequence as a fully expanded int array.
- */
- public static int[] parseSequence(String sequenceDef)
- {
- // Match the sequence definition against the regular expression for sequences.
- Matcher matcher = SEQUENCE_PATTERN.matcher(sequenceDef);
-
- // Check that the argument is of the right format accepted by this method.
- if (!matcher.matches())
- {
- throw new IllegalArgumentException("The sequence definition is not in the correct format.");
- }
-
- // Get the total number of matching groups to see if either of the optional samples or exponential flag
- // goups were set.
- int numGroups = matcher.groupCount();
-
- // Split the array of integers on commas.
- String intArrayString = matcher.group(1);
-
- String[] intSplits = intArrayString.split("[:\\[\\]]");
-
- int[] sequence = new int[intSplits.length - 1];
-
- for (int i = 1; i < intSplits.length; i++)
- {
- sequence[i - 1] = Integer.parseInt(intSplits[i]);
- }
-
- // Check for the optional samples count.
- int samples = 0;
-
- if ((numGroups > 1) && (matcher.group(2) != null))
- {
- String samplesGroup = matcher.group(2);
-
- String samplesString = samplesGroup.substring(",samples=".length());
- samples = Integer.parseInt(samplesString);
- }
-
- // Check for the optional exponential flag.
- boolean expFlag = false;
-
- if ((numGroups > 2) && (matcher.group(3) != null))
- {
- expFlag = true;
- }
-
- // If there is a sample count and 2 or more sequence values defined, then generate the sequence from the first
- // and last sequence values.
- if ((samples != 0) && (sequence.length >= 2))
- {
- int start = sequence[0];
- int end = sequence[sequence.length - 1];
-
- if (!expFlag)
- {
- sequence = generateSequence(start, end, samples);
- }
- else
- {
- sequence = generateExpSequence(start, end, samples);
- }
- }
-
- return sequence;
- }
-
- /**
- * Parses a duration defined as a string, giving a duration in days, hours, minutes and seconds into a number
- * of milliseconds equal to that duration.
- *
- * @param duration The duration definition string.
- *
- * @return The duration in millliseconds.
- */
- public static long parseDuration(String duration)
- {
- // Match the duration against the regular expression.
- Matcher matcher = DURATION_PATTERN.matcher(duration);
-
- // Check that the argument is of the right format accepted by this method.
- if (!matcher.matches())
- {
- throw new IllegalArgumentException("The duration definition is not in the correct format.");
- }
-
- // This accumulates the duration.
- long result = 0;
-
- int numGroups = matcher.groupCount();
-
- // Extract the days.
- if (numGroups >= 1)
- {
- String daysString = matcher.group(1);
- result +=
- (daysString == null)
- ? 0 : (Long.parseLong(daysString.substring(0, daysString.length() - 1)) * 24 * 60 * 60 * 1000);
- }
-
- // Extract the hours.
- if (numGroups >= 2)
- {
- String hoursString = matcher.group(2);
- result +=
- (hoursString == null) ? 0
- : (Long.parseLong(hoursString.substring(0, hoursString.length() - 1)) * 60 * 60 * 1000);
- }
-
- // Extract the minutes.
- if (numGroups >= 3)
- {
- String minutesString = matcher.group(3);
- result +=
- (minutesString == null)
- ? 0 : (Long.parseLong(minutesString.substring(0, minutesString.length() - 1)) * 60 * 1000);
- }
-
- // Extract the seconds.
- if (numGroups >= 4)
- {
- String secondsString = matcher.group(4);
- result +=
- (secondsString == null) ? 0 : (Long.parseLong(secondsString.substring(0, secondsString.length() - 1)) * 1000);
- }
-
- return result;
- }
-
- /**
- * Pretty prints an array of ints as a string.
- *
- * @param array The array to pretty print.
- *
- * @return The pretty printed string.
- */
- public static String printArray(int[] array)
- {
- String result = "[";
- for (int i = 0; i < array.length; i++)
- {
- result += array[i];
- result += (i < (array.length - 1)) ? ", " : "";
- }
-
- result += "]";
-
- return result;
- }
-
- /**
- * Returns the maximum value in an array of integers.
- *
- * @param values The array to find the amx in.
- *
- * @return The max value.
- */
- public static int maxInArray(int[] values)
- {
- if ((values == null) || (values.length == 0))
- {
- throw new IllegalArgumentException("Cannot find the max of a null or empty array.");
- }
-
- int max = values[0];
-
- for (int value : values)
- {
- max = (max < value) ? value : max;
- }
-
- return max;
- }
-
- /**
- * The #toArray methods of collections cannot be used with primitive arrays. This loops over and array list
- * of Integers and outputs and array of int.
- *
- * @param result The array of Integers to convert.
- *
- * @return An array of int.
- */
- private static int[] intListToPrimitiveArray(ArrayList<Integer> result)
- {
- int[] resultArray = new int[result.size()];
- int index = 0;
- for (int r : result)
- {
- resultArray[index] = result.get(index);
- index++;
- }
-
- return resultArray;
- }
-
- /**
- * Rounds the specified floating point value to the nearest integer and adds it to the specified list of
- * integers, provided it is not already in the list.
- *
- * @param result The list of integers to add to.
- * @param value The new candidate to round and add to the list.
- */
- private static void roundAndAdd(ArrayList<Integer> result, double value)
- {
- int roundedValue = (int) Math.round(value);
-
- if (!result.contains(roundedValue))
- {
- result.add(roundedValue);
- }
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ParsedProperties.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ParsedProperties.java
deleted file mode 100644
index 1cc6757675..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ParsedProperties.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-import java.util.Properties;
-
-/**
- * ParsedProperties extends the basic Properties class with methods to extract properties, not as strings but as strings
- * parsed into basic types.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * </table>
- *
- * @author Rupert Smith
- */
-public class ParsedProperties extends Properties
-{
- /**
- * Creates an empty ParsedProperties.
- */
- public ParsedProperties()
- {
- super();
- }
-
- /**
- * Creates a ParsedProperties initialized with the specified properties.
- *
- * @param props The properties to initialize this with.
- */
- public ParsedProperties(Properties props)
- {
- super(props);
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public static boolean setSysPropertyIfNull(String propname, boolean value)
- {
- return Boolean.parseBoolean(setSysPropertyIfNull(propname, Boolean.toString(value)));
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public static short setSysPropertyIfNull(String propname, short value)
- {
- return Short.parseShort(setSysPropertyIfNull(propname, Short.toString(value)));
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public static int setSysPropertyIfNull(String propname, int value)
- {
- return Integer.parseInt(setSysPropertyIfNull(propname, Integer.toString(value)));
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public static long setSysPropertyIfNull(String propname, long value)
- {
- return Long.parseLong(setSysPropertyIfNull(propname, Long.toString(value)));
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public static float setSysPropertyIfNull(String propname, float value)
- {
- return Float.parseFloat(setSysPropertyIfNull(propname, Float.toString(value)));
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public static double setSysPropertyIfNull(String propname, double value)
- {
- return Double.parseDouble(setSysPropertyIfNull(propname, Double.toString(value)));
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the system property after this method call.
- */
- public static String setSysPropertyIfNull(String propname, String value)
- {
- String property = System.getProperty(propname);
-
- if (property == null)
- {
- System.setProperty(propname, value);
-
- return value;
- }
- else
- {
- return property;
- }
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public boolean setPropertyIfNull(String propname, boolean value)
- {
- return Boolean.parseBoolean(setPropertyIfNull(propname, Boolean.toString(value)));
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public short setPropertyIfNull(String propname, short value)
- {
- return Short.parseShort(setPropertyIfNull(propname, Short.toString(value)));
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public int setPropertyIfNull(String propname, int value)
- {
- return Integer.parseInt(setPropertyIfNull(propname, Integer.toString(value)));
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public long setPropertyIfNull(String propname, long value)
- {
- return Long.parseLong(setPropertyIfNull(propname, Long.toString(value)));
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public float setPropertyIfNull(String propname, float value)
- {
- return Float.parseFloat(setPropertyIfNull(propname, Float.toString(value)));
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public double setPropertyIfNull(String propname, double value)
- {
- return Double.parseDouble(setPropertyIfNull(propname, Double.toString(value)));
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public String setPropertyIfNull(String propname, String value)
- {
- String property = super.getProperty(propname);
-
- if (property == null)
- {
- super.setProperty(propname, value);
-
- return value;
- }
- else
- {
- return property;
- }
- }
-
- /**
- * Helper method for setting properties.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public boolean setProperty(String propname, boolean value)
- {
- setProperty(propname, Boolean.toString(value));
-
- return value;
- }
-
- /**
- * Helper method for setting properties.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public short setProperty(String propname, short value)
- {
- setProperty(propname, Short.toString(value));
-
- return value;
- }
-
- /**
- * Helper method for setting properties.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public int setProperty(String propname, int value)
- {
- setProperty(propname, Integer.toString(value));
-
- return value;
- }
-
- /**
- * Helper method for setting properties.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public long setProperty(String propname, long value)
- {
- setProperty(propname, Long.toString(value));
-
- return value;
- }
-
- /**
- * Helper method for setting properties.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public float setProperty(String propname, float value)
- {
- setProperty(propname, Float.toString(value));
-
- return value;
- }
-
- /**
- * Helper method for setting properties.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public double setProperty(String propname, double value)
- {
- setProperty(propname, Double.toString(value));
-
- return value;
- }
-
- /**
- * Parses a property as a boolean.
- *
- * @param propName The property.
- *
- * @return The property as a boolean, or false if it does not exist.
- */
- public boolean getPropertyAsBoolean(String propName)
- {
- String prop = getProperty(propName);
-
- return (prop != null) && Boolean.parseBoolean(prop);
- }
-
- /**
- * Parses a property as an integer.
- *
- * @param propName The property.
- *
- * @return The property as a integer, or null if it does not exist.
- */
- public Integer getPropertyAsInteger(String propName)
- {
- String prop = getProperty(propName);
-
- return (prop != null) ? new Integer(prop) : null;
- }
-
- /**
- * Parses a property as a long.
- *
- * @param propName The property.
- *
- * @return The property as a long, or null if it does not exist.
- */
- public Long getPropertyAsLong(String propName)
- {
- String prop = getProperty(propName);
-
- return (prop != null) ? new Long(prop) : null;
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/SizeOf.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/SizeOf.java
deleted file mode 100644
index ecc08770a9..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/SizeOf.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-/**
- * SizeOf provides a static method that does its best to return an accurate measure of the total amount of memory used by
- * the virtual machine. This is calculated as the total memory available to the VM minus the actual amount used by it.
- * Before this measurement is taken the garbage collector is run many times until the used memory calculation stabilizes.
- * Generally, this trick works quite well to provide an accurate reading, however, it cannot be relied upon to be totally
- * accurate. It is also quite slow.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Calculate total memory used.
- * </table>
- *
- * @author Rupert Smith
- */
-public class SizeOf
-{
- /** Holds a reference to the runtime object. */
- private static final Runtime RUNTIME = Runtime.getRuntime();
-
- /**
- * Makes 4 calls the {@link #runGCTillStable} method.
- */
- public static void runGCTillStableSeveralTimes()
- {
- // It helps to call Runtime.gc() using several method calls.
- for (int r = 0; r < 4; ++r)
- {
- runGCTillStable();
- }
- }
-
- /**
- * Runs the garbage collector until the used memory reading stabilizes. It may run the garbage collector up
- * to 500 times.
- */
- public static void runGCTillStable()
- {
- long usedMem1 = usedMemory(), usedMem2 = Long.MAX_VALUE;
-
- for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i)
- {
- RUNTIME.runFinalization();
- RUNTIME.gc();
- Thread.currentThread().yield();
-
- usedMem2 = usedMem1;
- usedMem1 = usedMemory();
- }
- }
-
- /**
- * Runs the garbage collector until the used memory stabilizes and then measures it.
- *
- * @return The amount of memory used by the virtual machine.
- */
- public static long getUsedMemory()
- {
- runGCTillStableSeveralTimes();
-
- return usedMemory();
- }
-
- /**
- * Returns the amount of memory used by subtracting the free memory from the total available memory.
- *
- * @return The amount of memory used.
- */
- private static long usedMemory()
- {
- return RUNTIME.totalMemory() - RUNTIME.freeMemory();
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/StackQueue.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/StackQueue.java
deleted file mode 100644
index acc1e2c218..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/StackQueue.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-import java.util.EmptyStackException;
-import java.util.NoSuchElementException;
-import java.util.Queue;
-import java.util.Stack;
-
-/**
- * The Stack class in java.util (most unhelpfully) does not implement the Queue interface. This is an adaption of that
- * class as a queue.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Turn a stack into a queue.
- * </table>
- *
- * @todo Need to override the add method, and iterator and consider other methods too. They work like LIFO but
- * really wany FIFO behaviour accross the whole data structure.
- *
- * @author Rupert Smith
- */
-public class StackQueue<E> extends Stack<E> implements Queue<E>
-{
- /**
- * Retrieves, but does not remove, the head of this queue.
- *
- * @return The element at the top of the stack.
- */
- public E element()
- {
- try
- {
- return super.peek();
- }
- catch (EmptyStackException e)
- {
- NoSuchElementException t = new NoSuchElementException();
- t.initCause(e);
- throw t;
- }
- }
-
- /**
- * Inserts the specified element into this queue, if possible.
- *
- * @param o The data element to push onto the stack.
- *
- * @return True if it was added to the stack, false otherwise (this implementation always returns true).
- */
- public boolean offer(E o)
- {
- push(o);
-
- return true;
- }
-
- /**
- * Retrieves, but does not remove, the head of this queue, returning null if this queue is empty.
- *
- * @return The top element from the stack, or null if the stack is empty.
- */
- public E peek()
- {
- try
- {
- return super.peek();
- }
- catch (EmptyStackException e)
- {
- return null;
- }
- }
-
- /**
- * Retrieves and removes the head of this queue, or null if this queue is empty.
- *
- * @return The top element from the stack, or null if the stack is empty.
- */
- public E poll()
- {
- try
- {
- return super.pop();
- }
- catch (EmptyStackException e)
- {
- return null;
- }
- }
-
- /**
- * Retrieves and removes the head of this queue.
- *
- * @return The top element from the stack, or null if the stack is empty.
- *
- * @throws NoSuchElementException If the stack is empty so no element can be removed from it.
- */
- public E remove()
- {
- try
- {
- return super.pop();
- }
- catch (EmptyStackException e)
- {
- NoSuchElementException t = new NoSuchElementException();
- t.initCause(e);
- throw t;
- }
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestContextProperties.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestContextProperties.java
deleted file mode 100644
index d402077963..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestContextProperties.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-import java.util.Properties;
-
-/**
- * TestContextProperties is an extension of {@link ParsedProperties} that keeps track of property key/value pairs
- * that are used by tests being run under the {@link org.apache.qpid.junit.extensions.TKTestRunner}. To keep the
- * test runner notified of configurable test parameters, tests should establish their required property values by
- * initiliazing fields or statics or in the constructor, through this class. The tk test runner automatically places
- * any additional properties specified on the command line into the this class, and these are held statically.
- *
- * <p/>Here is an example:
- *
- * <pre>
- * public class MyTestClass extends TestCase {
- * ParsedProperties testProps = TestContextProperties.getInstance();
- * private int testParam = testProps.setPropertyIfNull("testParam", 1);
- * ...
- * </pre>
- *
- * <p/>This has the effect of setting up the field testParam with the default value of 1, unless it is overridden
- * by values passed to the tk test runner. It also notifies the tk test runner of the name and value of the test
- * parameter actually used for the test, so that this can be logged in the test output file.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Log all name/value pairs read or written.
- * </table>
- *
- * @author Rupert Smith
- */
-public class TestContextProperties extends ParsedProperties
-{
- /** Used for debugging. */
- // Logger log = Logger.getLogger(TestContextProperties.class);
-
- /** Holds all properties set or read through this property extension class. */
- private Properties accessedProps = new Properties();
-
- /** The singleton instance of the test context properties. */
- private static TestContextProperties singleton = null;
-
- /**
- * Default constructor that builds a ContextualProperties that uses environment defaults.
- */
- private TestContextProperties()
- {
- super();
- }
-
- /**
- * Gets the singleton instance of the test context properties.
- *
- * @return The singleton instance of the test context properties.
- */
- public static synchronized ParsedProperties getInstance()
- {
- if (singleton == null)
- {
- singleton = new TestContextProperties();
- }
-
- return singleton;
- }
-
- /**
- * Gets the singleton instance of the test context properties, applying a specified set of default properties to
- * it, if they are not already set.
- *
- * @param defaults The defaults to apply for properties not already set.
- *
- * @return The singleton instance of the test context properties.
- */
- public static synchronized ParsedProperties getInstance(Properties defaults)
- {
- ParsedProperties props = getInstance();
-
- for (Object key : defaults.keySet())
- {
- String stringKey = (String) key;
- String value = defaults.getProperty(stringKey);
-
- props.setPropertyIfNull(stringKey, value);
- }
-
- return props;
- }
-
- /*
- * Creates a ContextualProperties that uses environment defaults and is initialized with the specified properties.
- *
- * @param props The properties to initialize this with.
- */
- /*public TestContextProperties(Properties props)
- {
- super();
- }*/
-
- /**
- * Gets all of the properties (with their most recent values) that have been set or read through this class.
- *
- * @return All of the properties accessed through this class.
- */
- public static Properties getAccessedProps()
- {
- return (singleton == null) ? new Properties() : singleton;
- // return accessedProps;
- }
-
- /**
- * Looks up a property value relative to the environment, callers class and method. The default environment will be
- * checked for a matching property if defaults are being used. The property key/value pair is remembered and made
- * available to {@link org.apache.qpid.junit.extensions.TKTestRunner}.
- *
- * @param key The property key.
- *
- * @return The value of this property searching from the most specific definition (environment, class, method, key)
- * to the most general (key only), unless use of default environments is turned off in which case the most general
- * proeprty searched is (environment, key).
- */
- public String getProperty(String key)
- {
- // log.debug("public String getProperty(String key = " + key + "): called");
-
- String value = super.getProperty(key);
-
- if (value != null)
- {
- accessedProps.setProperty(key, value);
- }
-
- // log.debug("value = " + value);
-
- return value;
- }
-
- /**
- * Calls the <tt>Hashtable</tt> method <code>put</code>. Provided for parallelism with the <tt>getProperty</tt>
- * method. Enforces use of strings for property keys and values. The value returned is the result of the
- * <tt>Hashtable</tt> call to <code>put</code>. The property key/value pair is remembered and made
- * available to {@link org.apache.qpid.junit.extensions.TKTestRunner}.
- *
- * @param key The key to be placed into this property list.
- * @param value The value corresponding to <tt>key</tt>.
- *
- * @return The previous value of the specified key in this property list, or <code>null</code> if it did not have one.
- */
- public synchronized Object setProperty(String key, String value)
- {
- // log.debug("public synchronized Object setProperty(String key = " + key + ", String value = " + value + "): called");
-
- Object result = super.setProperty(key, value);
- accessedProps.setProperty(key, value);
-
- return result;
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set. The property key/value pair is
- * remembered and made available to {@link org.apache.qpid.junit.extensions.TKTestRunner}.
- *
- * @param key The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property, which will be the value passed in if it was null, or the existing value otherwise.
- */
- public String setPropertyIfNull(String key, String value)
- {
- // log.debug("public String setPropertyIfNull(String key = " + key + ", String value = " + value + "): called");
-
- String result = super.setPropertyIfNull(key, value);
-
- if (value != null)
- {
- accessedProps.setProperty(key, result);
- }
-
- // log.debug("result = " + result);
-
- return result;
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestUtils.java b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestUtils.java
deleted file mode 100644
index 553a41ecae..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestUtils.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-/**
- * Provides commonly used functions that aid testing.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a short pause.
- * </table>
- *
- * @author Rupert Smith
- */
-public class TestUtils
-{
- /**
- * Injects a short pause. The pause may not complete its full length, if the thread is interrupted when waiting.
- * In most cases, this will not happen and this method is a vry adequate pause implementation, without the
- * need to handle interrupted exceptions.
- *
- * @param millis The length of the pause in milliseconds.
- */
- public static void pause(long millis)
- {
- try
- {
- Thread.sleep(millis);
- }
- catch (InterruptedException e)
- {
- // Clear the flag and ignore.
- Thread.interrupted();
- }
- }
-}
diff --git a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/package.html b/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/package.html
deleted file mode 100644
index f39b892e2d..0000000000
--- a/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/package.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<html>
-<body>
-Provides some helper classes. ContextualProperties allows a hierarchy of properties to be used in properties file with
-default overrides. SizeOf takes memeory measurements by stabilizing the garbage collector.
-</body>
-</html>
diff --git a/java/lib/gson-2.0.jar b/java/lib/gson-2.0.jar
new file mode 100644
index 0000000000..7b413f9570
--- /dev/null
+++ b/java/lib/gson-2.0.jar
Binary files differ
diff --git a/java/lib/jackson-core-asl-1.9.0.jar b/java/lib/jackson-core-asl-1.9.0.jar
new file mode 100644
index 0000000000..e9456ad887
--- /dev/null
+++ b/java/lib/jackson-core-asl-1.9.0.jar
Binary files differ
diff --git a/java/lib/jackson-mapper-asl-1.9.0.jar b/java/lib/jackson-mapper-asl-1.9.0.jar
new file mode 100644
index 0000000000..f8beebcfea
--- /dev/null
+++ b/java/lib/jackson-mapper-asl-1.9.0.jar
Binary files differ
diff --git a/java/lib/jetty-6.1.14.jar b/java/lib/jetty-6.1.14.jar
deleted file mode 100644
index 3e67d1e19e..0000000000
--- a/java/lib/jetty-6.1.14.jar
+++ /dev/null
Binary files differ
diff --git a/java/lib/jetty-servlet-tester-6.1.14.jar b/java/lib/jetty-servlet-tester-6.1.14.jar
deleted file mode 100644
index c6d7c66f4a..0000000000
--- a/java/lib/jetty-servlet-tester-6.1.14.jar
+++ /dev/null
Binary files differ
diff --git a/java/lib/jetty-util-6.1.14.jar b/java/lib/jetty-util-6.1.14.jar
deleted file mode 100644
index 7acc988655..0000000000
--- a/java/lib/jetty-util-6.1.14.jar
+++ /dev/null
Binary files differ
diff --git a/java/lib/mockito-all-1.9.0.jar b/java/lib/mockito-all-1.9.0.jar
new file mode 100644
index 0000000000..273fd50feb
--- /dev/null
+++ b/java/lib/mockito-all-1.9.0.jar
Binary files differ
diff --git a/java/lib/org.apache.felix.framework-2.0.5.jar b/java/lib/org.apache.felix.main-2.0.5.jar
index 71e5a84231..71e5a84231 100644
--- a/java/lib/org.apache.felix.framework-2.0.5.jar
+++ b/java/lib/org.apache.felix.main-2.0.5.jar
Binary files differ
diff --git a/java/lib/poms/commons-digester-1.8.1.xml b/java/lib/poms/commons-digester-1.8.1.xml
index 1edee7b5f0..56b38bf778 100644
--- a/java/lib/poms/commons-digester-1.8.1.xml
+++ b/java/lib/poms/commons-digester-1.8.1.xml
@@ -19,4 +19,10 @@
<groupId>commons-digester</groupId>
<artifactId>commons-digester</artifactId>
<version>1.8.1</version>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils</artifactId>
+ </exclusion>
+ </exclusions>
</dep>
diff --git a/java/lib/poms/jackson-core-asl-1.9.0.xml b/java/lib/poms/jackson-core-asl-1.9.0.xml
new file mode 100644
index 0000000000..cc5947b72b
--- /dev/null
+++ b/java/lib/poms/jackson-core-asl-1.9.0.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<dep>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-core-asl</artifactId>
+ <version>1.9.0</version>
+</dep>
diff --git a/java/lib/poms/jackson-mapper-asl-1.9.0.xml b/java/lib/poms/jackson-mapper-asl-1.9.0.xml
new file mode 100644
index 0000000000..ff74f5a503
--- /dev/null
+++ b/java/lib/poms/jackson-mapper-asl-1.9.0.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<dep>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-mapper-asl</artifactId>
+ <version>1.9.0</version>
+</dep>
diff --git a/java/lib/poms/org.apache.felix.framework-2.0.5.xml b/java/lib/poms/org.apache.felix.framework-2.0.5.xml
deleted file mode 100644
index cef17fe589..0000000000
--- a/java/lib/poms/org.apache.felix.framework-2.0.5.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<dep>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.framework</artifactId>
- <version>2.0.5</version>
-</dep>
diff --git a/java/lib/poms/org.apache.felix.main-2.0.5.xml b/java/lib/poms/org.apache.felix.main-2.0.5.xml
new file mode 100644
index 0000000000..91718725dc
--- /dev/null
+++ b/java/lib/poms/org.apache.felix.main-2.0.5.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<dep>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.main</artifactId>
+ <version>2.0.5</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.framework</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.shell</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.shell.tui</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.bundlerepository</artifactId>
+ </exclusion>
+ </exclusions>
+</dep>
diff --git a/java/lib/poms/org.osgi.core-1.0.0.xml b/java/lib/poms/org.osgi.core-1.0.0.xml
deleted file mode 100644
index 833cc91729..0000000000
--- a/java/lib/poms/org.osgi.core-1.0.0.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<dep>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.osgi.core</artifactId>
- <version>1.0.0</version>
-</dep>
diff --git a/java/lib/poms/xalan-2.7.0.xml b/java/lib/poms/xalan-2.7.0.xml
index 73ea2df7e2..3fd89aacd8 100644
--- a/java/lib/poms/xalan-2.7.0.xml
+++ b/java/lib/poms/xalan-2.7.0.xml
@@ -19,4 +19,12 @@
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
<version>2.7.0</version>
+ <exclusions>
+ <exclusion>
+ <groupId>xml-apis</groupId>
+ <artifactId>xml-apis</artifactId>
+ </exclusion>
+ </exclusions>
</dep>
+
+
diff --git a/java/lib/servlet-api.jar b/java/lib/servlet-api.jar
deleted file mode 100644
index e3b61e0079..0000000000
--- a/java/lib/servlet-api.jar
+++ /dev/null
Binary files differ
diff --git a/java/management/common/src/main/java/management-common.bnd b/java/management/common/src/main/java/management-common.bnd
index 5f7f8bede3..f42652d1d4 100644
--- a/java/management/common/src/main/java/management-common.bnd
+++ b/java/management/common/src/main/java/management-common.bnd
@@ -17,7 +17,7 @@
# under the License.
#
-ver: 0.15.0
+ver: 0.17.0
Bundle-SymbolicName: qpid-management-common
Bundle-Version: ${ver}
diff --git a/java/management/eclipse-plugin/META-INF/MANIFEST.MF b/java/management/eclipse-plugin/META-INF/MANIFEST.MF
index f47bc86797..097b6ba0a9 100644
--- a/java/management/eclipse-plugin/META-INF/MANIFEST.MF
+++ b/java/management/eclipse-plugin/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
Bundle-ManifestVersion: 2
Bundle-Name: Qpid JMX Management Console Plug-in
Bundle-SymbolicName: org.apache.qpid.management.ui; singleton:=true
-Bundle-Version: 0.15.0
+Bundle-Version: 0.17.0
Bundle-Activator: org.apache.qpid.management.ui.Activator
Bundle-Vendor: Apache Software Foundation
Bundle-Localization: plugin
diff --git a/java/management/eclipse-plugin/src/test/java/org/apache/qpid/management/ui/ManagementConsoleTest.java b/java/management/eclipse-plugin/src/test/java/org/apache/qpid/management/ui/ManagementConsoleTest.java
index 6065a04576..eef6356642 100644
--- a/java/management/eclipse-plugin/src/test/java/org/apache/qpid/management/ui/ManagementConsoleTest.java
+++ b/java/management/eclipse-plugin/src/test/java/org/apache/qpid/management/ui/ManagementConsoleTest.java
@@ -24,6 +24,7 @@ import org.apache.qpid.exchange.ExchangeDefaults;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.exchange.DirectExchange;
import org.apache.qpid.server.management.AMQManagedObject;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
import org.apache.qpid.server.queue.AMQQueueMBean;
@@ -36,6 +37,7 @@ import javax.management.MBeanFeatureInfo;
import javax.management.MBeanInfo;
import java.util.ArrayList;
import java.util.List;
+import java.util.UUID;
/**
@@ -86,7 +88,7 @@ public class ManagementConsoleTest extends InternalBrokerBaseCase
// If this test fails due to changes in the broker code,
// then the constants in the Constants.java shoule be updated accordingly
DirectExchange exchange = new DirectExchange();
- exchange.initialise(_virtualHost, ExchangeDefaults.DIRECT_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost, ExchangeDefaults.DIRECT_EXCHANGE_NAME, false, 0, true);
AMQManagedObject mbean = (AMQManagedObject)exchange.getManagedObject();
MBeanInfo mbeanInfo = mbean.getMBeanInfo();
diff --git a/java/module.xml b/java/module.xml
index a3b8606525..1aea77b488 100644
--- a/java/module.xml
+++ b/java/module.xml
@@ -48,6 +48,7 @@
<property name="module.api" location="${build.api}/${module}/"/>
<property name="module.test.api" location="${build.test.api}/${module}"/>
<property name="module.test.classes" location="${module.build}/test/classes"/>
+ <property name="module.test.resources" location="${module.build}/test/resources"/>
<property name="module.results" location="${build.results}/${module}"/>
<property name="module.failed" location="${module.results}/FAILED"/>
<property name="module.src" location="src/main/java"/>
@@ -179,6 +180,7 @@
<path refid="module.class.path"/>
<pathelement path="${module.test.depends.path}"/>
<path refid="module.test.libs"/>
+ <pathelement path="${module.test.resources}"/>
</path>
<property name="javac.deprecation" value="off"/>
@@ -220,7 +222,7 @@
<jython path="${mllib.dir}">
<args>
<arg line='"${project.root}/genpom"'/>
- <arg line='-s "${project.root}/lib/poms"'/>
+ <arg line='-s "${project.root}/lib/poms${path.separator}lib/poms"'/>
<arg line='-o "${build.scratch}/qpid-${module.name}.pom"'/>
<arg line="-u ${project.url}"/>
<arg line="-g ${project.groupid}"/>
@@ -347,7 +349,7 @@
<sysproperty key="log4j.configuration" value="${log4j.configuration}"/>
<sysproperty key="java.naming.factory.initial" value="${java.naming.factory.initial}"/>
<sysproperty key="java.naming.provider.url" value="${java.naming.provider.url}"/>
- <sysproperty key="messagestore.class.name" value="${messagestore.class.name}" />
+ <sysproperty key="messagestorefactory.class.name" value="${messagestorefactory.class.name}" />
<sysproperty key="test.output" value="${module.results}"/>
<sysproperty key="qpid.amqp.version" value="${qpid.amqp.version}"/>
diff --git a/java/perftests/RunningPerformanceTests.txt b/java/perftests/RunningPerformanceTests.txt
deleted file mode 100644
index 2bc9220774..0000000000
--- a/java/perftests/RunningPerformanceTests.txt
+++ /dev/null
@@ -1,141 +0,0 @@
-The Performance Tests
--------------------------
-
-Building the Tests (Only develoeprs need to know how to do this).
------------------------------------------------------------------
-
-The performance tests are compiled as part of the Maven build by default, but the performance test scripts are not. There is also an additional step to perform, that generates a convenient Jar file containing all of the test dependencies, to simplify invoking Java with a very long command line. The steps to build the performance test suite are:
-
- 1. Cd to the /java/perftests directory.
- 2. Execute: mvn org.apache.qpid:junit-toolkit-maven-plugin:tkscriptgen (this generates the scripts).
- 3. Execute: mvn assembly:assembly
-
-The assembly:assembly step generates a Jar with all the dependecies in it in a file name ending with -all-test-deps.jar, which contains the client code and all its dependencies, plus JUnit and the toolkit test runners. The generated scripts expect to find the jar in the current directory. You can Cd to the /target directory and run the scripts from there. The assembly:assembly step also outputs some archives that contain all the scripts and required Jar for convenient shipping of the test suite. Unpack this anywhere you like and run the tests from there.
-
-Running the Tests
------------------
-
-All the performance tests are run through shell scripts, that have been configured with parameters set up in the pom.xml file. You can override any of these parameters on the command line. It is also possible to pass parameters through the script to the JVM that is running the test. For example to change the heap size you might do:
-
-./Ping-Once.sh -java:Xmx1024M
-
-The tests have all been set up to accept a single integer 'size' parameter, passed to the JUnit TestCase for the test, through the JUnit Toolkit asymptotic test case extension. The 'size' parameter is always interpreted in the performance tests as standing for the number of messages to send per test method invocation. Therefore, in the results of the test the throughput of messages is equal to the number of test method invocations times the 'size' divided by the time taken.
-
-** TODO: Change this, use seconds not millis.
-
-Test timing results are output to .csv files, which can easily be imported into a spreadsheet for graphing and analysis. The timings in this file are always given in milliseconds, which may be a bit confusing and should really be changed to seconds.
-
-The JUnit Toolkit provides a framework for controlling how long tests are run for, how many are run at once and what the 'size' parameter is, which is general enough to handle a wide variety of performance tests. Here is the documentation from the TKTestRunner class that explains what its command line parameters are:
-
- ...
- * TKTestRunner extends {@link junit.textui.TestRunner} with the ability to run tests multiple times, to execute a test
- * simultaneously using many threads, to put a delay between test runs and adds support for tests that take integer
- * parameters that can be 'stepped' through on multiple test runs. These features can be accessed by using this class
- * as an entry point and passing command line arguments to specify which features to use:
- *
- * <pre>
- * -w ms The number of milliseconds between invocations of test cases.
- * -c pattern The number of tests to run concurrently.
- * -r num The number of times to repeat each test.
- * -d duration The length of time to run the tests for.
- * -t name The name of the test case to execute.
- * -s pattern The size parameter to run tests with.
- * -o dir The name of the directory to output test timings to.
- * -v Verbose mode.
- * </pre>
- *
- * <p/>The pattern arguments are of the form [lowest(, ...)(, highest)](,sample=s)(,exp), where round brackets
- * enclose optional values. Using this pattern form it is possible to specify a single value, a range of values divided
- * into s samples, a range of values divided into s samples but distributed exponentially, or a fixed set of samples.
- *
- * <p/>The duration arguments are of the form dD(:hH)(:mM)(:sS), where round brackets enclose optional values.
- *
- * <p/>Here are some examples:
- *
- * <p/><table>
- * <tr><td><pre> -c [10,20,30,40,50] </pre><td> Runs the test with 10,20,...,50 threads.
- * <tr><td><pre> -s [1,100],samples=10 </pre>
- * <td> Runs the test with ten different size parameters evenly spaced between 1 and 100.
- * <tr><td><pre> -s [1,1000000],samples=10,exp </pre>
- * <td> Runs the test with ten different size parameters exponentially spaced between 1 and 1000000.
- * <tr><td><pre> -r 10 </pre><td> Runs each test ten times.
- * <tr><td><pre> -d 10H </pre><td> Runs the test repeatedly for 10 hours.
- * <tr><td><pre> -d 1M, -r 10 </pre>
- * <td> Runs the test repeatedly for 1 minute but only takes a timing sample every 10 test runs.
- * <tr><td><pre> -r 10, -c [1, 5, 10, 50], -s [100, 1000, 10000] </pre>
- * <td> Runs 12 test cycles (4 concurrency samples * 3 size sample), with 10 repeats each. In total the test
- * will be run 199 times (3 + 15 + 30 + 150)
- * </table>
- ...
-
-The specific performance test cases for QPid are implemented as extensions to JUnit TestCase (asymptotic test cases), and also accept a large number of different parameters to control the characteristics of the test. The are passed into the test scripts as name=value pairs. Here is the documentation from the PingPongProducer class that explains what the available parameters and default values are:
-
- ...
- * <p/>This ping tool accepts a vast number of configuration options, all of which are passed in to the constructor. It
- * can ping topics or queues; ping multiple destinations; do persistent pings; send messages of any size; do pings within
- * transactions; control the number of pings to send in each transaction; limit its sending rate; and perform failover
- * testing. A complete list of accepted parameters, default values and comments on their usage is provided here:
- *
- * <p/><table><caption>Parameters</caption>
- * <tr><th> Parameter <th> Default <th> Comments
- * <tr><td> messageSize <td> 0 <td> Message size in bytes. Not including any headers.
- * <tr><td> destinationName <td> ping <td> The root name to use to generate destination names to ping.
- * <tr><td> persistent <td> false <td> Determines whether peristent delivery is used.
- * <tr><td> transacted <td> false <td> Determines whether messages are sent/received in transactions.
- * <tr><td> broker <td> tcp://localhost:5672 <td> Determines the broker to connect to.
- * <tr><td> virtualHost <td> test <td> Determines the virtual host to send all ping over.
- * <tr><td> rate <td> 0 <td> The maximum rate (in hertz) to send messages at. 0 means no limit.
- * <tr><td> verbose <td> false <td> The verbose flag for debugging. Prints to console on every message.
- * <tr><td> pubsub <td> false <td> Whether to ping topics or queues. Uses p2p by default.
- * <tr><td> failAfterCommit <td> false <td> Whether to prompt user to kill broker after a commit batch.
- * <tr><td> failBeforeCommit <td> false <td> Whether to prompt user to kill broker before a commit batch.
- * <tr><td> failAfterSend <td> false <td> Whether to prompt user to kill broker after a send.
- * <tr><td> failBeforeSend <td> false <td> Whether to prompt user to kill broker before a send.
- * <tr><td> failOnce <td> true <td> Whether to prompt for failover only once.
- * <tr><td> username <td> guest <td> The username to access the broker with.
- * <tr><td> password <td> guest <td> The password to access the broker with.
- * <tr><td> selector <td> null <td> Not used. Defines a message selector to filter pings with.
- * <tr><td> destinationCount <td> 1 <td> The number of receivers listening to the pings.
- * <tr><td> timeout <td> 30000 <td> In milliseconds. The timeout to stop waiting for replies.
- * <tr><td> commitBatchSize <td> 1 <td> The number of messages per transaction in transactional mode.
- * <tr><td> uniqueDests <td> true <td> Whether each receiver only listens to one ping destination or all.
- * <tr><td> durableDests <td> false <td> Whether or not durable destinations are used.
- * <tr><td> ackMode <td> AUTO_ACK <td> The message acknowledgement mode. Possible values are:
- * 0 - SESSION_TRANSACTED
- * 1 - AUTO_ACKNOWLEDGE
- * 2 - CLIENT_ACKNOWLEDGE
- * 3 - DUPS_OK_ACKNOWLEDGE
- * 257 - NO_ACKNOWLEDGE
- * 258 - PRE_ACKNOWLEDGE
- * <tr><td> maxPending <td> 0 <td> The maximum size in bytes, of messages sent but not yet received.
- * Limits the volume of messages currently buffered on the client
- * or broker. Can help scale test clients by limiting amount of buffered
- * data to avoid out of memory errors.
- * </table>
- ...
-
-The most common test case to run is implemented in the class PingAsyncTestPerf, which sends and recieves messages simultaneously. This class uses a PingPongProdicer to do its sending and receiving, and wraps it in a suitable way to make it callable through the extended JUnit test runner. This class also accpets another parameter "batchSize" with a default of "1000". This tells the test how many messages to send before stopping sending and waiting for them all to come back. The actual value entered does not matter too much, but typically values larger than 1000 are used to ensure that there is a reasonable opportunity for simultaneous sending and receiving, and less than 10000 to ensure that each test method invocation does not go on for too long.
-
-The test script parameters can all be seen in the pom.xml file. A three letter code is used on the test scripts, first letter P or T for persistent or transient, second letter Q or T for queue (p2p) or topic (pub/sub), third letter R for reliability tests, C for client scaling tests, M for message size tests.Typically tests run and sample their results for 10 minutes, to get a reasonable measurement of a broker running under a steady load. The tests as configured do not measure 'burst' performance.
-
-The reliability/burn in tests, test the broker running at slightly below its maximum throughput for a period of 24 hours. Their purpose is to check that the broker remains stable under load for a reasonable duration, in order to provide some confidence in the long-term stability of its process. These tests are intended to be run as a two step process. The first two tests run for 10 minutes and are used to asses the broker throughput for the test. The output from these tests are to be fed into the rate limiter for the second set of tests, so that the broker may be set up to run at slightly below its maximum throughput for the 24 hour duration. It is suggested that 90% of the rate achieved by the first two tests should be used for this.
-
-The client scaling tests are split into two sub-sections. The first section tests the performance of increasing numbers of client connections, each sending at a fixed rate. The purpose of this is to determine the brokers saturation load, and to evaluate how its performance degrades uder higher loads. The second section varies the fan-out or fan-in ratio of the number of sending clients to receving clients. This is primarily intended to test the pubsub messaging model, but the tests are also run in p2p mode (with each message being received by one consumer), for completeness and to provide a comparison with the pubsub performance.
-
-The message size scaling tests, examine the brokers performance with different message payload sizes. The purpose of these tests is to evaluate where the broker process switches from being an io-bound to a cpu-bound process (if at all). The expected model is that the amount of CPU processing the broker has to carry out depends largely on the number of messages, and not on their size, because it carries out de-framing and routing for each message header but just copies payloads in-place or in a tight instruction loop. Therefore large message should be io-bound and a constant data rate through the broker should be seen for messages larger than the io/cpu threshold. Small messages require more processing so a constant message rate should be seen for message smaller than the io/cpu threshold. If the broker implementation is extremely efficient the threshold may dissapear altogether and the broker will be purely io-bound.
-The final variation, which is applied to all tests, is to run a transactional and non-transactional version of each. Messages are always batched into transactions of 100 messages each.
-
-Running the entire test suite can take some time, in particular their are about 4 24 hour burn-in tests. There are also 8 30 minute client scaling ramp up tests. If you want to run the test for a short time, to skim test that they work on your environment a command line like the following is usefull:
-
-> find . -name '*.sh' -exec {} -d10S \;
-
-If you want to run just a sub-set of the tests, you can use variations of the above command line. For example, to run just the message size tests using persistent p2p messaging do:
-
-> find . -name 'PPM-*.sh' -exec {} \;
-
-and so on.
-
-Interpreting the Results
-------------------------
-
-TODO: Explain what the results are expected to show and how to look for it. What should be graphed to get a visualization of the broker performance. How to turn the measurements into a description of the performance 'envelope'. \ No newline at end of file
diff --git a/java/perftests/bin/monitoring/monitor-broker.sh b/java/perftests/bin/monitoring/monitor-broker.sh
deleted file mode 100755
index 27c8ff25f6..0000000000
--- a/java/perftests/bin/monitoring/monitor-broker.sh
+++ /dev/null
@@ -1,221 +0,0 @@
-#!/bin/bash
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-#
-# This script starts a broker and then starts additional logging as required.
-# *.pid files are generated in the LOG_DIR for later use by the stop-monitored-broker
-# script.
-#
-# Currently this process starts:
-# - The broker with additional QPID_OPTS for gc logging
-# - Top to monitoring the CPU usage
-#
-# Additional processes can be started and as long as they write a PID into LOG_DIR/*.pid
-# it will be shutdown with the stop script
-#
-
-#
-# Output the broker log file to aid problem diagnosis
-# then exit.
-#
-brokerFailExit()
-{
- echo "Broker failed to start up."
- cat $BROKER_LOG
- exit 1
-}
-
-showUsageExit()
-{
- echo "Usage $0 <Path to Test Broker> <LOG DIR> <CPU Monitor Rate (s)> [Additional options to
- pass to Qpid broker startup]"
- exit 1
-}
-
-#
-# Perform 3 attempts to get the broker PID via ps and grep
-# if unable the output broker log and exit
-#
-getBrokerPID()
-{
- attempts=3
- ready=0
- while [ $ready == 0 ] ; do
-
- PID=`ps auxwww| grep java | grep Xloggc | awk '{print $2}'`
-
- if [ ! $PID == 0 ] ; then
- ready=1
- else
- attempts=$[ $attempts - 1 ]
-
- if [ $attempts == 0 ] ; then
- brokerFailExit
- fi
-
- sleep 1
- fi
- done
-
-}
-
-
-#
-# Additional Check to ensure that the broker process
-# has correctly written 'Ready' to the log file.
-#
-checkBrokerStarted()
-{
- attempts=3
- ready=0
- while [ $ready == 0 ] ; do
-
- grep Ready $BROKER_LOG > /dev/null
-
- if [ $? == 0 ] ; then
- ready=1
- else
- attempts=$[ $attempts - 1 ]
-
- if [ $attempts == 0 ] ; then
- brokerFailExit
- fi
-
- echo "Broker not ready sleeping 1s"
- sleep 1
- fi
- done
-}
-
-#
-# Command Line setup
-#
-
-# Ensure we have minimum of three arguments
-if [[ $# > 2 ]] ; then
- BROKER_VERSION=$1
- LOG_DIR=$2
- CPU_MONITOR_RATE=$3
- # Remove these arguments from the $@ variable
- shift
- shift
- shift
-else
- # If we have no arguments then use these as the default
- CPU_MONITOR_RATE=0.5
- LOG_DIR=$QPID_WORK/logging
- BROKER_VERSION=qpid-0.5
-fi
-
-
-#
-# Check the specified broker is reachable
-# it it is not the log and show usage
-#
-if [ ! -d $BROKER_VERSION ] ; then
- echo "Broker not available at: $BROKER_VERSION"
- showUsageExit
-fi
-
-#
-# Check to see if we have an absolute path for logging
-#
-logStart=`echo $LOG_DIR|cut -c 1`
-
-
-#
-# If we don't have an absolute path then add the current
-# directory path to the start.
-#
-if [[ $logStart != '/' ]] ; then
- echo -n "$LOG_DIR is not absolute, using "
- LOG_DIR=`pwd`/$LOG_DIR
- echo $LOG_DIR
-fi
-
-#
-# Validate that the directory does not exist
-# - this is so we can guarrantee a clean run.
-# If it does exit then log and show usage
-#
-if [ -d $LOG_DIR ] ; then
- echo "Log directory already exists : $LOG_DIR"
- showUsageExit
-fi
-
-#
-# Create the logging directory
-#
-mkdir -p $LOG_DIR
-
-#
-# Variable for broker log
-#
-BROKER_LOG=$LOG_DIR/broker.log
-
-# Variable to hold broker PID
-PID=0
-
-export QPID_OPTS="-Xloggc:$LOG_DIR/gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps"
-
-#
-# Start Qpid Broker
-#
-echo "Starting Broker : $BROKER_VERSION"
-pushd $BROKER_VERSION/bin > /dev/null
-./qpid-server $@ 2> $BROKER_LOG >&2 &
-popd > /dev/null
-
-# Wait and check startup was ok
-echo "Waiting for broker startup"
-getBrokerPID
-
-checkBrokerStarted
-
-echo $PID > $LOG_DIR/broker.pid
-
-#
-# Start CPU Monitoring via TOP
-#
-echo "Starting CPU Monitor at RATE:$CPU_MONITOR_RATE on $SERVER1"
-pushd $LOG_DIR > /dev/null
-
-echo $CPU_MONITOR_RATE > top.rate
-
-top -d $CPU_MONITOR_RATE -S -c -p $PID -b > broker_cpu.log &
-
-#
-# Get top pid using $!
-#
-echo $! > $LOG_DIR/top.pid
-
-popd > /dev/null
-
-
-#
-# Generate Stat files
-#
-echo "Generating Stat data"
-stat $BROKER_LOG > $BROKER_LOG.stat
-stat $LOG_DIR/broker_cpu.log > $LOG_DIR/broker_cpu.log.stat
-stat $LOG_DIR/gc.log > $LOG_DIR/gc.log.stat
-
diff --git a/java/perftests/bin/monitoring/runTests.sh b/java/perftests/bin/monitoring/runTests.sh
deleted file mode 100755
index 676db0d4fa..0000000000
--- a/java/perftests/bin/monitoring/runTests.sh
+++ /dev/null
@@ -1,148 +0,0 @@
-#!/bin/bash
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-#
-# Run specified performance tests and
-# gather details about the test run
-#
-
-
-runTest()
-{
- echo "$@"
- echo "$@ --csv -o $LOG_DIR" >> $LOG_DIR/TestRun.log 2>&1
- ./$@ --csv -o $LOG_DIR >> $LOG_DIR/TestRun.log 2>&1
-}
-
-showUsageExit()
-{
- echo "Usage $0 <Path to Test Pack> <LOG DIR> <TEST LIST FILE>"
- exit 1
-}
-
-# Ensure we have minimum of three arguments
-if [[ $# > 2 ]] ; then
- TEST_VERSION=$1
- LOG_DIR=$2
- TEST_LIST=$3
- # Remove these arguments from the $@ variable
- shift
- shift
- shift
-else
- showUsageExit
-fi
-
-#
-# Check the specified broker is reachable
-# it it is not the log and show usage
-#
-if [ ! -d $TEST_VERSION ] ; then
- echo "Tests not available at: $TEST_VERSION"
- showUsageExit
-fi
-
-
-#
-# Check to see if we have an absolute path for logging
-#
-logStart=`echo $LOG_DIR|cut -c 1`
-
-#
-# If we don't have an absolute path then add the current
-# directory path to the start.
-#
-if [[ $logStart != '/' ]] ; then
- echo -n "$LOG_DIR is not absolute, using "
- LOG_DIR=`pwd`/$LOG_DIR
- echo $LOG_DIR
-fi
-
-#
-# Validate that the directory does not exist
-# - this is so we can guarrantee a clean run.
-# If it does exit then log and show usage
-#
-if [ -d $LOG_DIR ] ; then
- echo "Log directory already exists : $LOG_DIR"
- showUsageExit
-fi
-
-#
-# Check to see if we have an absolute path for test list
-#
-testListStart=`echo $TEST_LIST|cut -c 1`
-
-#
-# If we don't have an absolute path then add the current
-# directory path to the start.
-#
-if [[ $testListStart != '/' ]] ; then
- echo -n "$TEST_LIST is not absolute, using "
- TEST_LIST=`pwd`/$TEST_LIST
- echo $TEST_LIST
-fi
-
-#
-# Validate that the directory does not exist
-# - this is so we can guarrantee a clean run.
-# If it does exit then log and show usage
-#
-# -r Check file exists and is readable
-if [ ! -r $TEST_LIST ] ; then
- echo "Test file is not readable : $TEST_LIST"
- showUsageExit
-fi
-
-
-
-#
-# Create the logging directory
-#
-mkdir -p $LOG_DIR
-
-
-
-echo "Starting Test Run in : $TEST_VERSION"
-pushd $TEST_VERSION/bin > /dev/null
-
-#
-# Run tests
-#
-
-
-while read testCommand
-do
- runTest $testCommand
-done < "$TEST_LIST"
-
-
-popd > /dev/null
-
-
-#
-# Generate Stat files
-#
-echo "Generating Stat data"
-for file in `find $LOG_DIR -name "*.csv"` ; do
- stat $file > $file.stat
-done
diff --git a/java/perftests/bin/monitoring/stop-monitored-broker.sh b/java/perftests/bin/monitoring/stop-monitored-broker.sh
deleted file mode 100755
index ad882b0bea..0000000000
--- a/java/perftests/bin/monitoring/stop-monitored-broker.sh
+++ /dev/null
@@ -1,124 +0,0 @@
-#!/bin/bash
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-#
-# Script to stop the running of a monitored broker
-# and the associated monitoring processes.
-#
-# Looks in the specifed directory for pid files and
-# stops those proceses
-#
-
-
-usage()
-{
- echo "Usage: $0 <LOG_DIR>"
-}
-
-#
-# Attempt to gracefully kill processs
-#
-stopRun()
-{
- kill $PIDS
-}
-
-
-#
-# Forcibly stop processes
-#
-forceStopRun()
-{
- kill -9 $PIDS
-}
-
-#
-# Show usage if we are not started correctly
-#
-if [ $# != 1 ] ; then
- usage
- exit 1
-fi
-
-LOG_DIR=$1
-
-
-PIDS=`cat $LOG_DIR/*.pid`
-
-echo "Preparing to stop:"
-#
-# Escape the path so we can use sed to remove it.
-#
-path=`echo $LOG_DIR|sed -e s/\\\//\\\\\\\\\\\//g`
-
-for i in `ls $LOG_DIR/*.pid` ; do
- # Remove path from pid item then remove any final '/'
- echo $i|cut -d '.' -f 1| sed -e s/$path// |tr '/' ' '
-done
-
-status=`ps $PIDS |wc -l`
-
-if [ $status == 1 ] ; then
- echo "Processes do not appear to be running."
- echo "Have they already been stopped?"
- exit 0
-fi
-
-attempts=3
-
-while [ ! $status == 1 ] ; do
- stopRun
- sleep 1
- status=`ps $PIDS |wc -l`
-
- if [ $status == 1 ] ; then
- echo "Done"
- exit 0
- else
- attempts=$[ $attempts - 1 ]
-
- if [ $attempts == 0 ] ; then
- break
- fi
-
- echo "Sleeping as processes not stopped"
- sleep 2
-
- fi
-done
-
-# If we haven't been able to kill the processes then
-# forcibly do it
-if [ ! $status == 1 ] ; then
- forceStopRun
- sleep 1
- status=`ps $PIDS |wc -l`
-
- if [ $status == 1 ] ; then
- echo "Done"
- else
- echo "Stop failed"
- exit 1
- fi
-else
- echo "Done"
-fi
diff --git a/java/perftests/bin/processing/process.sh b/java/perftests/bin/processing/process.sh
deleted file mode 100755
index 6dbf9b9ea8..0000000000
--- a/java/perftests/bin/processing/process.sh
+++ /dev/null
@@ -1,388 +0,0 @@
-#!/bin/bash
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-
-usage()
-{
- echo "usage: process.sh <Qpid Version> <Test Type Queue/Topic/Latency..> <Volume of data %age> <broker details>"
- echo "These parameters are used to title and name the graphs:"
- echo 'Title = $<Qpid Version> $<Test Type> : $<Volume>% volume'
- echo 'File = $<Qpid Version>-$<Broker Details>-$<Test Type>-$<Volume>'
- exit 1
-}
-
-processCMSGCFile()
-{
- # Extract all the ParNew timings: Ignore any lines corrupted by concurrent CMS logging.
- grep -v CMS gc.log|grep ParNew > $work/parnew.gc.log
-
- # Calculate Full GC Data
- grep failure -B 1 gc.log | sed -e :a -e '$!N;s/\n.(concurrent/ /;ta' -e 'P;D' |grep -v ^\- > $work/full.gc.log
- cut -d ':' -f 1 $work/full.gc.log > $work/full.time.log
- sed -e 's/failure)/\#/g' $work/full.gc.log |cut -d '#' -f 2- |awk '{print $3}' > $work/full.dur.log
-
- # Move to the working directory to further process the gathered data.
- pushd $work &> /dev/null
-
- # Extract the Heap and timing data.
- #8 is the full gc data
- #5 is the paranew gc data
- cat parnew.gc.log | awk '{print $8}' | cut -d '(' -f 2 | cut -d 'K' -f 1 > HEAP_MAX.log
- cat parnew.gc.log | awk '{print $8}' | cut -d 'K' -f 1 > HEAP_PRE_GC.log
- cat parnew.gc.log | awk '{print $8}' | cut -d 'K' -f 2 | cut -d '>' -f 2 > HEAP_POST_GC.log
- cat parnew.gc.log | awk '{print $1}' | cut -d ':' -f 1 > GC_TIME.log
-
- calculateStats "MEM_PRE" HEAP_PRE_GC.log
- calculateStats "MEM_POST" HEAP_POST_GC.log
- calculateStatsBC "GC_FREQ" GC_TIME.log
-
-
- # Calculate ParNew GC Cumulative total
- cat parnew.gc.log |awk '{sum=sum+$6; print $6, sum}' > GC_DUR.log
- # Give a count of GC occurances
- parNewGCCount=`wc -l GC_DUR.log| awk '{print $1}'`
-
- # Create the Heap data file
- paste GC_TIME.log HEAP_POST_GC.log HEAP_PRE_GC.log HEAP_MAX.log > GC.Heap.data
- # Create ParNew GC Duration data file for graphing
- paste GC_TIME.log GC_DUR.log > GC.Dur.data
- # Create Full GC occurance log file for plotting
- paste full.time.log full.dur.log > GC.Full.data
-
- # Calculate All GC Timing and give a count of their occurance
- awk '{print $1}' GC_DUR.log > gc_dur.log
- paste GC_TIME.log gc_dur.log > gc_all.log
- cat GC.Full.data >> gc_all.log
- sort -n gc_all.log | awk '{sum=sum+$2;print $1 , sum}' > GC.Dur.All.data
- fullGCCount=`wc -l GC.Full.data| awk '{print $1}'`
-}
-
-processG1GCFile()
-{
- cat gc.log | grep -e \^[0-9]*.[0-9]*\: -e \^.*[0-9]*.\-\> > $work/g1.gc.log
-
- # Move to the working directory to further process the gathered data.
- pushd $work &> /dev/null
-
- # Calculate Full GC Data
- cat g1.gc.log | sed -e :a -e '$!N;s/\n.\ *\[/ \[/;ta' -e 'P;D' > full.gc.log
- grep Full full.gc.log |awk '{print $1}'| tr ':' ' ' > full.time.log
- grep Full full.gc.log |awk '{print $5}' > full.dur.log
- fullGCCount=`wc -l GC.Full.data| awk '{print $1}'`
-
- # Create Full GC occurance log file for plotting
- paste full.time.log full.dur.log > GC.Full.data
-
- # Extract the Heap and timing data.
- # Create G1 Young Duration data file for graphing
- grep "(young)," full.gc.log |awk '{print $1}' | tr ':' ' ' > GC_TIME.log
- grep "(young)," full.gc.log |awk '{print $5}' > young.gc.time.log
- # Calculate G1 young Cumulative total
- cat young.gc.time.log |awk '{sum=sum+$1; print $1, sum}' > GC_DUR.log
- # Create G1 Young Duration data file for graphing
- paste GC_TIME.log GC_DUR.log > GC.Dur.data
-
- # Give a count of GC occurances
- youngGCCount=`wc -l GC_DUR.log| awk '{print $1}'`
-
- #
- # If we have no GCs then something is wrong
- if [ $youngGCCount == 0 ] ; then
- echo "Error no YoungGC log entries to proceses"
- return
- fi
-
- # Gather the Heap Size data
-
- grep "(young)," full.gc.log | awk '{print $8}' | cut -d '(' -f 2 | cut -d ')' -f 1 > HEAP_MAX.Sized.log
- grep "(young)," full.gc.log | awk '{print $8}' | cut -d '-' -f 1 > HEAP_PRE_GC.Sized.log
- grep "(young)," full.gc.log | awk '{print $8}' | cut -d '>' -f 2| cut -d '(' -f 1 > HEAP_POST_GC.Sized.log
-
- normaliseSizeMemFile HEAP_MAX.Sized.log HEAP_MAX.log
- normaliseSizeMemFile HEAP_PRE_GC.Sized.log HEAP_PRE_GC.log
- normaliseSizeMemFile HEAP_POST_GC.Sized.log HEAP_POST_GC.log
-
-
- # Create the Heap data file
- paste GC_TIME.log HEAP_POST_GC.log HEAP_PRE_GC.log HEAP_MAX.log > GC.Heap.data
-
- # Calculate All GC Timing and give a count of their occurance
- awk '{print $1}' GC_DUR.log > gc_dur.log
- paste GC_TIME.log gc_dur.log > gc_all.log
- cat GC.Full.data >> gc_all.log
- sort -n gc_all.log | awk '{sum=sum+$2;print $1 , sum}' > GC.Dur.All.data
-
-}
-
-calculateStatsBC()
-{
-label=$1
-statFile=$2
-# Calculate GC Frequencies
- prevFreq=0
- countFreq=0
- gcFreqTotal=0
- minFreq=99999999
- maxFreq=0
-
- echo "" > GC_FREQ.log
- for time in `cat $statFile` ; do
- if [ $prevFreq == 0 ] ; then
- prevFreq=$time
- else
- freq=`echo $time - $prevFreq | bc`
- echo $freq >> GC_FREQ.log
-
- prevFreq=$time
- gcFreqTotal=`echo $gcFreqTotal + $freq | bc`
- countFreq=$[$countFreq + 1]
-
- if [ `echo "$freq > $maxFreq " | bc` == 1 ] ; then
- maxFreq=$freq
- fi
-
- if [ `echo "$freq < $minFreq " | bc ` == 1 ] ; then
- minFreq=$freq
- fi
- fi
- done
-
- # Extract Min/Max/Avg
- echo "#type:min/max/avg" > $statFile.stats
-
- if [ $countFreq != 0 ] ; then
- avgFreq=`echo $gcFreqTotal / $countFreq | bc -l 2&> /dev/null`
- echo "$label:$minFreq/$maxFreq/$avgFreq" >> $statFile.stats
- echo "Done GC Freq Stat generation for $statFile"
- else
- echo "$label:-/-/-" >> $statFile.stats
- echo "Unable to calculate GC Freq stats as no freq entries found."
- fi
-}
-
-calculateStats()
-{
-label=$1
-statFile=$2
-
-# Calculate GC Frequencies
- count=0
- gcTotal=0
- min=0
- max=0
-
-
- for item in `cat $statFile` ; do
- if [ $min == 0 ] ; then
- min=$item
- fi
-
- gcTotal=$[$gcTotal + $item]
- count=$[$count + 1]
-
- if [ $item -gt $max ] ; then
- max=$item
- fi
-
- if [ $item -lt $min ] ; then
- min=$item
- fi
- done
-
- # Extract Min/Max/Avg
- echo "#type:min/max/avg" > $statFile.stats
-
- if [ $count != 0 ] ; then
- avg=`echo $gcTotal / $count | bc -l`
-
- echo "$label:$min/$max/$avg" >> $statFile.stats
- echo "Done $label Stat generation for $statFile"
- else
- echo "$label:-/-/-" >> $statFile.stats
- echo "Unable to calculate $label stats as no entries found."
- fi
-
-}
-
-#
-# Take an input file ($1) of lines
-# <value><K|M>
-# and output file $2 of <value> in whole M
-#
-normaliseSizeMemFile()
-{
-rm -f $2
-for i in `cat $1` ; do
- if [[ `echo $i | grep -c "K" ` == 1 ]] ; then
- kb=`echo $i|cut -d 'K' -f 1`
- echo $[ $kb / 1024 ] >> $2
- else
- echo $i|cut -d 'M' -f 1 >> $2
- fi
-done
-
-
-}
-
-
-# Parse command line
-# TODO more advanced processing
-# Check we have enough parameters
-if [ $# != 4 ] ; then
- # Take one arg to be a graph data file.
- if [ $# == 1 ] ; then
- textArray[0]="" # hold text
- length=0
- # read whole file in loop
- while read line
- do
- textArray[$length]=$line # store line
- length=$(expr $length + 1) # increase length by 1
- done < $1
-
- if [ $length != 2 ] ; then
- usage
- fi
-
- #Get Title and file name
- title=${textArray[0]}
- file=${textArray[1]}
-
- pushd `dirname $1`
-
- else
- usage
- fi
-else
- version=$1
- type=$2
- volume=$3
- brokerState=$4
-
-
- # Configure Graph Title and image file names
- title="$version $type : $volume% volume"
- file="$version-$brokerState-$type-$volume"
-fi
-
-work=work
-
-mkdir -p $work
-
-echo -n "Processing GC Usage Data : "
-ParNew=`grep -c ParNew gc.log`
-
-if [ $ParNew != 0 ] ; then
- echo "CMS log file"
- processCMSGCFile
- PLOT="\"GC.Dur.data\" with lines axis x1y1 ti \"ParNew GC Time ($parNewGCCount)\", "
-else
- echo "G1 log file"
- processG1GCFile
- PLOT="\"GC.Dur.data\" with lines axis x1y1 ti \"G1 Young Time ($youngGCCount)\", "
-fi
-
-#
-# Colate Stats
-#
-echo -n "Colating stat Data : "
-echo "#type:min/max/avg" > $file.statistics.txt
-find .. -name "*stats" -exec grep -v "type" {} >> $file.statistics.txt \;
-
-
-# Prepare the plot command
-# If a Full GC occured during this test then plot those
-if [[ $fullGCCount > 0 ]] ; then
-PLOT=$PLOT"\"GC.Dur.data\" using 1:3 with lines axis x1y2 ti \"Cumulative Total Time(ParNew)\", \
- \"GC.Dur.All.data\" with lines axis x1y2 ti \"Cumulative Total Time(All)\", \
- \"GC.Full.data\" with points ti \"Full GCs Time ($fullGCCount)\" "
-else
-PLOT=$PLOT"\"GC.Dur.data\" using 1:3 with lines axis x1y2 ti \"Cumulative Total Time(ParNew)\", \
- \"GC.Dur.All.data\" with lines axis x1y2 ti \"Cumulative Total Time(All)\" "
-fi
-
-if [ $ParNew != 0 ] ; then
- gcs=$parNewGCCount
-else
- gcs=$youngGCCount
-fi
-
-# Call out to gnuplot to generate graphs
-# Only do this if we have data
-if [ $gcs != 0 ] ; then
- # Generate the Heap Graph and the GC Duration Graph
- gnuplot << EOGNUPLOT
-set xlabel "Run Time(s)"
-
-set title "$title : Heap Size"
-set term png
-set output "$file-Heap.png"
-set ylabel "MB" +0.5,0
-plot "GC.Heap.data" using 1:2 with lines axis x1y1 ti "GC Size Post",\
- "GC.Heap.data" using 1:4 with lines axis x1y1 ti "GC Size Max ", \
- "GC.Heap.data" using 1:3 with lines axis x1y1 ti "GC Size Pre "
-
-set y2tics nomirror
-set ytics nomirror
-set key top left
-set title "$title GC Time"
-set ylabel "Time(s)" +0.5,0
-set y2label "Total Time(s)"
-set output "$file-GCDuration.png"
-plot $PLOT
-EOGNUPLOT
-
-else
- echo "Warning: No GC Data to graph"
-fi
-
-# pop back to further process for CPU usage
-popd &> /dev/null
-
-echo "Processing CPU Usage Data"
-
-# CPU.data is just TimeStamp + %age
-cat broker_cpu.log |awk '{print $1 "T" $2 " " $3}' > $work/CPU.data
-
-# Move to work directory to run gnuplot
-pushd $work &> /dev/null
-
-# Call out to gnuplot to generate graphs
-# Generate the Heap Graph and the GC Duration Graph
-gnuplot << EOGNUPLOT
-set term png
-set title "$title : CPU"
-set output "$file-CPU.png"
-unset key
-set xlabel "Real Time(h:m)"
-set ylabel "Usage(%)"
-
-set xdata time
-set timefmt "%Y-%m-%dT%H:%M:%S"
-set format x "%H:%M"
-plot "CPU.data" using 1:2 with lines
-EOGNUPLOT
-
-#"
-# Pop out of $work directory.
-#
-popd &> /dev/null \ No newline at end of file
diff --git a/java/perftests/bin/processing/processAll.sh b/java/perftests/bin/processing/processAll.sh
deleted file mode 100755
index 895d59c316..0000000000
--- a/java/perftests/bin/processing/processAll.sh
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/bash
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-
-usage()
-{
- echo "processResults.sh <search dir>"
- exit 1
-}
-
-root=`pwd`
-echo $root
-graphFile=graph.data
-
-if [ $# != 1 ] ; then
- usage
-fi
-
-mkdir -p results
-
-for file in `find $1 -name $graphFile` ; do
-
- dir=`dirname $file`
-
- echo Processing : $dir
- pushd $dir &> /dev/null
-
- $root/process.sh $graphFile
-
- echo Copying Images
- cp work/*png $root/results/
-
- echo Copying Stats
- cp work/*.statistics.txt $root/results/
-
-
- popd &> /dev/null
- echo Done
-done \ No newline at end of file
diff --git a/java/perftests/bin/processing/processTests.py b/java/perftests/bin/processing/processTests.py
deleted file mode 100755
index 8db44eda79..0000000000
--- a/java/perftests/bin/processing/processTests.py
+++ /dev/null
@@ -1,850 +0,0 @@
-#!/usr/bin/env python
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import os
-import re
-import datetime
-import sys
-import string
-from optparse import OptionParser
-from datetime import datetime, timedelta
-import shutil
-
-
-def showUsage():
- log("./processTests.py [-b|--broker-log-dir] <dir> [-t|--test-dir] <dir>")
-
-
-ACCESS="Access"
-MODIFY="Modify"
-
-BROKER_LOG="broker.log"
-BROKER_PID="broker.pid"
-BROKER_CPU="broker_cpu.log"
-BROKER_CPU_DATED="broker_cpu.log.dated"
-BROKER_STATS="broker.stats"
-BROKER_GC="gc.log"
-
-GRAPH_DATA="graph.data"
-
-_verbose = False
-_debug = False
-_brokerLogs = ""
-
-def exitError(message):
- log(message)
- sys.exit(1)
-
-def main():
- global _log, _verbose, _debug, _brokerLogs
-
- # Load the
- parser = OptionParser()
-
- parser.add_option("-v", "--verbose", dest="verbose",
- action="store_true", default=False, help="enable verbose output")
-
- parser.add_option("-d", "--debug", dest="debug",
- action="store_true", default=False, help="enable debug output")
-
- parser.add_option("-b", "--broker-log-dir", dest="brokerLogs",
- action="store", default=True, help="Broker Logs")
-
- parser.add_option("-t", "--test-dir", dest="testDir",
- action="store", default="", help="Test Results")
-
-
- (options, args) = parser.parse_args()
-
- _verbose = options.verbose
- _debug = options.debug
- testDir = options.testDir
- _brokerLogs = options.brokerLogs
-
- if testDir == "" or _brokerLogs == "" :
- log("Broker Log Dir and Test Dir are both requried.")
- showUsage()
-
- if not os.path.exists(testDir):
- exitError("Test directory does not exist:" + testDir)
-
- if not os.path.exists(_brokerLogs):
- exitError("Broker log directory does not exist:" + _brokerLogs)
-
-
- # Standardize the format of the broker logs
- preProcessBrokerLogs(_brokerLogs)
-
- # Get list of test results from test_dir
- processTestResults(testDir)
-
-#
-# Process the log files we know of
-#
-def preProcessBrokerLogs(resultDir):
-
- print "Pre Processing Broker Logs"
- # Pre-Process GC - no pre processing required
-
- # Process Log4j - no processing required as file is already time stamped.
-
- # Pre-Process broker_cpu
- processCPUUsage(resultDir)
-
-#
-# Process the broker CPU log file and create an output file of format
-# <Date Time> <CPU Usage>
-#
-#
-def processCPUUsage(resultDir):
- logfile=resultDir+os.sep+BROKER_CPU
- datedFile=resultDir+os.sep+BROKER_CPU_DATED
-
- start = extractTime(ACCESS, logfile+".stat")
-
- pid = getPID(BROKER_PID)
-
- topRate = getFirstLine(_brokerLogs+os.sep+"top.rate")
-
- #
- # Calulate addition required per process line output
- #
- if topRate.find(".") == -1:
- seconds = topRate
- millis = 0
- else:
- split = topRate.split('.')
- seconds = split[0]
- # Convert
- millis = float("0."+split[1]) * 1000
-
- offset = timedelta(seconds=int(seconds),milliseconds=int(millis))
-
- #
- # Process the CPU log file and make a file of format:
- # datetime <CPU% usage> <MEM% usage>
- #
- # Open log CPU file for reading
- logfile = open(logfile, "r")
-
- # Open the output file, erasing any existing version
- # Keep track of the min/max sum and entries,.
- minCPU=float(sys.maxint)
- maxCPU=0.0
- minMem=float(sys.maxint)
- maxMem=0.0
-
- entries=0
- sumCPU=0.0
- sumMem=0.0
-
- output= open(datedFile, "w")
- for line in logfile:
- #
- # Data format
- # 0 1 2 3 4 5 6 7 8 9 10 11
- # PID USER PR NI %CPU TIME+ %MEM VIRT RES SHR S COMMAND
- # PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- #
- # %CPU and %MEM are vary, probably based on os/version of top.
- # lets auto-detect where it is.
- #
- # Index is 0 based for array usage.
- index = 0
- if line.find("PID") != -1:
- for key in line.split(" "):
- strippedKey = key.lstrip()
- if len(strippedKey) > 0:
- # Record the key index
- if (strippedKey == "%CPU"):
- cpuIndex=index
- if (strippedKey == "%MEM"):
- memIndex=index
- # Increase count for next key
- index = index + 1
-
-
- # Find lines that contain our broker process
- if line.find("QPBRKR") != -1:
-
- # Split line on whitespace
- data = line.split()
-
- #Write out the date time (ISO-8601 format)
- output.write(str(start))
- # Output the %CPU value
- output.write(" "+str(data[cpuIndex]))
- # Output the %MEM value
- output.write(" "+str(data[memIndex]))
- output.write('\n')
-
- # Add the offset based on the logging rate
- start = start + offset
-
- # Record entires
- entries = entries + 1
-
- # Record Metrics
- # Record CPU data
- cpu = float(data[cpuIndex])
- if (cpu < minCPU):
- minCPU = cpu
-
- if (cpu > maxCPU):
- maxCPU = cpu
-
- sumCPU = sumCPU + cpu
-
- # Record Mem data
- mem = float(data[memIndex])
-
- if (mem < minMem):
- minMem = mem
-
- if (mem > maxMem):
- maxMem = mem
-
- sumMem = sumMem + mem
-
-
- #end for
-
- # Close the files
- logfile.close
- output.close
-
- # Output stats file
- statFile=resultDir+os.sep+BROKER_CPU+".stats"
- output= open(statFile, "w")
- output.write("#type:min/max/avg")
- output.write('\n')
- output.write("CPU:"+str(minCPU)+"/"+str(maxCPU)+"/"+str(float(sumCPU)/float(entries)))
- output.write('\n')
- output.write("MEM:"+str(minMem)+"/"+str(maxMem)+"/"+str(float(sumMem)/float(entries)))
- output.write('\n')
- output.close
-
- log("Pre Process of CPU Log file '"+BROKER_CPU+"' complete")
-
-
-#
-# Give an known process type get the recorded PID.
-#
-def getPID(process):
- return getFirstLine(_brokerLogs+os.sep+process)
-
-#
-# Get the first line of the file without EOL chars.
-# NOTE: this will load the entire file into memory to do it.
-#
-def getFirstLine(fileName):
- f = open(fileName,"r")
- line = f.read().splitlines()[0]
- f.close
- return line
-
-
-#
-# Walk the directory given and process all csv test results
-#
-def processTestResults(resultDir):
- for root, dirs, files in os.walk(resultDir, topdown=False):
- if len(files) == 0:
- exitError("Test result directory is empty:" + resultDir)
- for file in files:
- if file.endswith(".csv"):
- processTestResult(root , file)
-
-def processTestResult(root, resultFile):
- # Open stat file and extract test times, we determine:
- # -start time based on the 'Access' value
- # -end time based on the 'Modify' value 'Change' would also work
-
- statFile=root+os.sep+resultFile+".stat"
-
- if not os.path.exists(statFile):
- log("Unable to process : Unable to open stat file:" + statFile)
- return
-
-
- createResultSetPackage(root, resultFile)
-
-
-def extractTime(field, statFile):
- stats = open(statFile, "r")
- for line in stats:
- if line.startswith(field):
- if line.find("(") == -1:
- dt = lineToDate(" ".join(line.split()[1:]))
-
- #
- # TODO We need to handle time time zone issues as I'm sure we will have issues with the
- # log4j matching.
-
- stats.close
- return dt
-
-#
-# Given a text line in ISO format convert it to a date object
-#
-def lineToDate(line):
- #2009-06-22 17:04:44,320
- #2009-06-22 17:04:44.320
- pattern = re.compile(r'(?P<year>^[0-9][0-9][0-9][0-9])-(?P<month>[0-9][0-9])-(?P<day>[0-9][0-9]) (?P<hour>[0-9][0-9]):(?P<minute>[0-9][0-9]):(?P<seconds>[0-9][0-9])')
-
-
- m = pattern.match(line)
- if m:
- year = int(m.group('year'))
- month = int(m.group('month'))
- day = int(m.group('day'))
- hour = int(m.group('hour'))
- minute = int(m.group('minute'))
- seconds = int(m.group('seconds'))
-
- pattern = re.compile(r'(?P<year>^[0-9][0-9][0-9][0-9])-(?P<month>[0-9][0-9])-(?P<day>[0-9][0-9]) (?P<hour>[0-9][0-9]):(?P<minute>[0-9][0-9]):(?P<seconds>[0-9][0-9])[.|,](?P<micro>[0-9]+)')
- m = pattern.match(line)
- micro = None
- if m:
- micro = m.group('micro')
-
- if micro == None:
- micro = 0
-
- # Correct issue where micros are actually nanos
- if int(micro) > 999999:
- micro = int(micro) / 1000
-
- return datetime(year,month,day,hour,minute,seconds,int(micro))
- else:
- # Error we shouldn't get here
- return null
-
-def createResultSetPackage(root, resultFile):
- # Get the Name of the test to make a directory with said name
- testName = resultFile.split(".csv")[0]
- resultDir = root+ os.sep + testName
-
- log("Processing Result set for:"+ testName)
-
- mkdir(resultDir)
-
- # Move result file to new directory
- shutil.move(root + os.sep + resultFile, resultDir)
-
- # Move stat file to new directory
- shutil.move(root + os.sep + resultFile + ".stat", resultDir)
-
- statFile=resultDir + os.sep + resultFile + ".stat"
-
- #
- # Get start and end time for test run
- #
- start = extractTime(ACCESS, statFile)
- end = extractTime(MODIFY, statFile)
-
- sliceBrokerLogs(resultDir, start, end)
- createGraphData(resultDir, testName)
- createTestStatData(resultDir, testName)
-
- log("Created Result Package for:"+ testName)
-
-def sliceBrokerLogs(resultDir, start, end):
- sliceCPULog(resultDir, start, end)
- sliceLog4j(resultDir, start, end)
- sliceGCLog(resultDir, start, end)
-
-
-def sliceCPULog(resultDir, start, end):
- global _brokerLogs
- logfilePath=_brokerLogs+os.sep+BROKER_CPU_DATED
- cpuSliceFile=resultDir+os.sep+BROKER_CPU
-
- # Process the CPU log file and make a file of format:
- # datetime <CPU% usage> <MEM% usage>
- #
- # Open log CPU file for reading
- logFile = open(logfilePath, "r")
-
- # Open the output file, erasing any existing version
- # Keep track of the min/max sum and entries,.
- minCPU=float(sys.maxint)
- maxCPU=0.0
- minMem=float(sys.maxint)
- maxMem=0.0
-
- entries=0
- sumCPU=0.0
- sumMem=0.0
-
- #
- # Create outputfile
- #
- cpuslice = open(cpuSliceFile,"w")
- for line in logFile:
- data = line.split()
- #
- # //fixme remove tz addition.
- #
- lineTime = lineToDate(" ".join(data[0:2])+" +0000")
-
- if lineTime > start:
- if lineTime < end:
- # Write the data though to the new file
- cpuslice.writelines(line)
-
- # Perform stat processing for the min/max/avg
-
- data = line.split()
-
- #
- # Data format is
- # <Date> <Time> <%CPU> <%MEM>
- # 2010-02-19 10:16:17 157 28.1
- #
- cpuIndex = 2
- memIndex = 3
-
- # Record entires
- entries = entries + 1
-
- # Record Metrics
- # Record CPU data
- cpu = float(data[cpuIndex])
- if (cpu < minCPU):
- minCPU = cpu
-
- if (cpu > maxCPU):
- maxCPU = cpu
-
- sumCPU = sumCPU + cpu
-
- # Record Mem data
- mem = float(data[memIndex])
-
- if (mem < minMem):
- minMem = mem
-
- if (mem > maxMem):
- maxMem = mem
-
- sumMem = sumMem + mem
-
- logFile.close()
- cpuslice.close()
- log("Sliced CPU log")
-
- # Output stats file
- statFile=cpuSliceFile+".stats"
- output= open(statFile, "w")
- output.write("#type:min/max/avg")
- output.write('\n')
- output.write("CPU:"+str(minCPU)+"/"+str(maxCPU)+"/"+str(float(sumCPU)/float(entries)))
- output.write('\n')
- output.write("MEM:"+str(minMem)+"/"+str(maxMem)+"/"+str(float(sumMem)/float(entries)))
- output.write('\n')
- output.close
-
- log("Generated stat data from CPU Log file")
-
-
-def sliceGCLog(resultDir, start, end):
- global _brokerLogs
- logfilePath=_brokerLogs+os.sep+BROKER_GC
- sliceFile=resultDir+os.sep+BROKER_GC
-
- gcstart = extractTime(ACCESS, logfilePath+".stat")
-
- # Open the output file, erasing any existing version
- # Keep track of the min/max sum and entries,.
- minGCDuration=float(sys.maxint)
- maxGCDuration=0.0
- sumGCDuration=0.0
- entriesGCDuration = 0
-
-
- # Open log GC file for reading
- logFile = open(logfilePath, "r")
-
- # Open the output file, erasing any existing version
- output= open(sliceFile, "w")
-
- # Use a regular expression to pull out the Seconds.Millis values from the
- # Start of the gc log line.
- pattern = re.compile(r'(?P<seconds>^[0-9]+)\.(?P<millis>[0-9]+):')
-
- for line in logFile:
- m = pattern.match(line)
-
- if m:
- seconds = m.group('seconds');
- millis = m.group('millis');
-
- offset = timedelta(seconds=int(seconds),milliseconds=int(millis))
-
- lineTime = gcstart + offset
-
- if lineTime > start:
- if lineTime < end:
- output.writelines(line)
- # Perform stat processing for the min/max/avg
-
- # Process GC Duration lines in ParNew gc ,
- # ensure we do not have CMS printed as that means the line line has been corrupted
- if line.find("ParNew") != -1 & line.find("CMS") == -1:
-
- #
- # Example data line
- # 7.646: [GC 7.646: [ParNew: 14778K->461K(14784K), 0.0026610 secs] 49879K->36609K(73288K), 0.0027560 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
- #
- # So entry 5 is the ParNew time and 8 is the whole GC cycle. 14 entries total
-
- data = line.split()
-
- gcTime = 0
- # Check we have a valid ParNew Line
- if (len(data) == 15):
-
- # Record entires
- # Record GC Duration data
-
- entriesGCDuration = entriesGCDuration + 1
- gcTime = float(data[8])
-
- if (gcTime < minGCDuration):
- minGCDuration = gcTime
-
- if (gcTime > maxGCDuration):
- maxGCDuration = gcTime
-
- sumGCDuration = sumGCDuration + gcTime
-
-
-
- # Close the files
- logFile.close
- output.close()
-
- log("Sliced gc log")
-
- # Output stats file
- statFile=sliceFile+".stats"
- output= open(statFile, "w")
- output.write("#type:min/max/avg")
- output.write('\n')
- #
- # Only provide GCDuration if it was processed
- #
- output.write("GC_DUR:%.14f/%.14f/%.14f" % (minGCDuration, maxGCDuration , (sumGCDuration/float(entriesGCDuration))))
- output.write('\n')
- output.close
-
- log("Generated stat data from CPU Log file")
-
-
-def sliceLog4j(resultDir, start, end):
- global _brokerLogs
- logfilePath=_brokerLogs+os.sep+BROKER_LOG
- log4jSliceFile=resultDir+os.sep+BROKER_LOG
-
- log4jstart = extractTime(ACCESS, logfilePath+".stat")
-
- #
- # Say that first line is the start of the file,
- # This value will give a time value to the initial
- # logging before Log4j kicks in.
- #
- lineTime = log4jstart
-
- # Process the broker log4j file
- # Open log CPU file for reading
- logFile = open(logfilePath, "r")
-
- #
- # Create outputfile
- #
- log4jslice = open(log4jSliceFile,"w")
-
- for line in logFile:
- data = line.split()
-
- #
- # If the line has a time at the start then process it
- # otherwise use the previous time. This means if there is
- # a stack trace in the middle of the log file then it will
- # be copied over to the split file as long as it is in the
- # split time.
- #
- if (hasTime(data)):
- #
- # //fixme remove tz addition.
- #
- lineTime = lineToDate(" ".join(data[0:2])+" +0000")
-
- if lineTime > start:
- if lineTime < end:
- print line
- log4jslice.writelines(line)
-
- logFile.close()
- log4jslice.close()
- log("Sliced broker log")
-
-
-#
-# Check the first two entries of data can make a datetime object
-#
-def hasTime(data):
- date = data[0]
- time = data[1]
-
- # Examples:
- # 2009-06-22 17:04:44,246
- # 2009-06-22 17:04:44.2464
- # 2009-06-22 17:04:44
-
- # ISO-8601 '-' format date
- dateRE = re.compile('[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]')
-
- #
- # Check for times with/out millis
- # e.g.
- # 10:00:00,000 - log4j
- # 10:00:00.0000 - generated in script for cpu time
- #
- timeRE = re.compile('[0-9][0-9]:[0-9][0-9]:[0-9][0-9]?[0-9]*')
-
- return dateRE.match(date) and timeRE.match(time)
-
-def createGraphData(resultDir, testName):
- # Create graph.data file for process.sh
- # Format two lines : Title and filename
- # $version $type : $volume% volume
- # $version-$brokerState-$type-$volume
- version=getBrokerVersion()
-
- test= extractTestValue("n",resultDir, testName)
- volume = int(float(extractTestResult("Test * Size Throughput", resultDir, testName)) * 1000)
- messageSize = extractTestValue("messageSize",resultDir, testName)
- ackMode = ackModeToString(extractTestValue("consAckMode",resultDir, testName))
-
- graphDataFile=resultDir+os.sep+GRAPH_DATA
-
- graphData = open(graphDataFile, "w")
-
- #
- # Write Title
- graphData.write(version+":"+test+":"+str(messageSize)+"kb x "+str(volume)+" msg/sec using "+ackMode)
- graphData.write('\n')
-
- #
- # Write FileName
- graphData.writelines(version+"-"+testName)
- graphData.write('\n')
- graphData.close
- log("Created graph.data")
-
-
-def getBrokerVersion():
- global _brokerLogs
- READY = "Qpid Broker Ready"
- brokerLogFile = _brokerLogs + os.sep + BROKER_LOG
-
- log = open(brokerLogFile, "r")
-
- dataLine = ""
- for line in log:
- if line.find(READY) != -1:
- dataLine = line
- break
-
- # Log Entry
- #2009-06-19 17:04:02,493 INFO [main] server.Main (Main.java:456) - Qpid Broker Ready :2.3.0.1 build: 727403M
- # Split on READY
- data = dataLine.split(READY)
-
- # So [1] should be
- # :2.3.0.1 build: 727403M
- readyEntries = data[1].split()
-
- # so spliting on white space should give us ':version'
- # and a quick split on ':' will give us the version
- version = readyEntries[0].split(':')[1]
-
- # Strip to ensure we have no whitespace
- return version.strip()
-
-
-def extractTestValue(property,resultDir,testName):
- return extractTestData(property,resultDir,testName," =")
-
-def extractTestResult(property,resultDir,testName):
- return extractTestData(property,resultDir,testName,":")
-
-def extractTestData(property,resultDir,testName,type):
- resultFile = resultDir + os.sep + testName+".csv"
-
- results = open(resultFile, "r")
-
- dataLine = ""
- for line in results:
- if line.find("Total Tests:") == 0:
- dataLine = line
-
- results.close()
-
- # Data is CSV
- data = dataLine.split(',')
-
- found = False
- result = ""
- searchProperty = property+type
-
- for entry in data:
- if found:
- result = entry
- break
- if entry.strip() == searchProperty:
- found=True
-
- return result.strip()
-
-def createTestStatData(resultDir, testName):
- csvFilePath=resultDir + os.sep + testName + ".csv"
-
- # Open the output file, erasing any existing version
- # Keep track of the min/max sum and entries,.
- minLatency=float(sys.maxint)
- maxLatency=0.0
- minThroughput=float(sys.maxint)
- maxThroughput=0.0
-
- entries=0
- sumLatency=0.0
- sumThroughput=0.0
-
- #
- # Open csv File
- #
- csvFile = open(csvFilePath,"r")
- for line in csvFile:
-
- # The PingAsyncTestPerf test class outputs the latency and throughput data.
- if line.find("PingAsyncTestPerf") != -1:
- #
- # Data format is
- # <Test> <TestName> <Thread> <Status> <Time> <Latency> <Concurrency> <Thread> <TestSize>
- #org.apache.qpid.ping.PingAsyncTestPerf, testAsyncPingOk, Dispatcher-Channel-1, Pass, 209.074, 219.706, 0, 1, 10
- LatencyIndex = 5
- ThroughputIndex = 4
-
- # The PingLatencyTestPerf test class just outputs the latency data.
- if line.find("PingLatencyTestPerf") != -1:
- #
- # Data format is
- # <Test> <TestName> <Thread> <Status> <Time> <Latency> <Concurrency> <Thread> <TestSize>
- # org.apache.qpid.ping.PingLatencyTestPerf, testPingLatency, Dispatcher-Channel-1, Pass, 397.05502, 0, 2, 1000
- LatencyIndex = 4
- ThroughputIndex = -1
-
-
- # Only process the test lines that have 'org.apache.qpid.ping', i.e. skip header and footer.
- if line.find("org.apache.qpid.ping") != -1:
- # Perform stat processing for the min/max/avg
- data = line.split(",")
-
- # Record entires
- entries = entries + 1
-
- # Record Metrics
- # Record Latency data
- latency = float(data[LatencyIndex])
- if (latency < minLatency):
- minLatency = latency
-
- if (latency > maxLatency):
- maxLatency = latency
-
- sumLatency = sumLatency + latency
-
- if (ThroughputIndex != -1):
- # Record Latency data
- throughput = float(data[ThroughputIndex])
- if (throughput < minThroughput):
- minThroughput = throughput
-
- if (throughput > maxThroughput):
- maxThroughput = throughput
-
- sumThroughput = sumThroughput + throughput
-
-
- csvFile.close()
-
- # Output stats file
- statFile=resultDir + os.sep + testName+".stats"
- output= open(statFile, "w")
- output.write("#type:min/max/avg")
- output.write('\n')
- output.write("LATENCY:"+str(minLatency)+"/"+str(maxLatency)+"/"+str(float(sumLatency)/float(entries)))
- output.write('\n')
-
- if (ThroughputIndex != -1):
- # Output msgs/sec based on time for a batch of msgs
- output.write("THROUGHPUT:"+str(float(1000)/maxThroughput)+"/"+str(float(1000)/minThroughput)+"/"+str(float(1000)/(float(sumThroughput)/float(entries))))
- output.write('\n')
-
- output.close
-
- log("Generated stat data from test "+testName+" CSV file")
-
-
-def ackModeToString(ackMode):
- if ackMode == '0':
- return "Transacted"
- elif ackMode == '1':
- return "AutoAck"
- elif ackMode == '2':
- return "ClientAck"
- elif ackMode == '3':
- return "DupsOK"
- elif ackMode == '257':
- return "NoAck"
- elif ackMode == '258':
- return "PreAck"
- else:
- return str(ackMode)
-
-
-
-def debug(msg):
- global _debug
- if _debug:
- log(msg)
-
-def log(msg):
- print msg
-
-def mkdir(dir):
- if not os.path.exists(dir):
- os.mkdir(dir)
-
-if __name__ == "__main__":
- main() \ No newline at end of file
diff --git a/java/perftests/bin/run_many.sh b/java/perftests/bin/run_many.sh
deleted file mode 100755
index cca2ffec21..0000000000
--- a/java/perftests/bin/run_many.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-
-# args:
-# <number of processes to start>
-# <name of run>
-# <command ro run>
-
-for i in `seq 1 $1`; do
- $3 >$2.$i.out 2>>$2.err &
- echo $! > $2.$i.pid
-done;
diff --git a/java/perftests/bin/topicListener.sh b/java/perftests/bin/topicListener.sh
deleted file mode 100755
index 3a925910ad..0000000000
--- a/java/perftests/bin/topicListener.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-
-# XXX -Xmx512m -Xms512m -XX:NewSize=150m
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java \
- JAVA_VM=-server \
- JAVA_MEM="-Xmx128m -Dlog4j.configuration=$HOME/log4j.properties" \
- JAVA_GC="-XX:-UseConcMarkSweepGC -XX:+HeapDumpOnOutOfMemoryError" \
- QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Damqj.logging.level="INFO" org.apache.qpid.oldtopic.Listener $*
diff --git a/java/perftests/bin/topicPublisher.sh b/java/perftests/bin/topicPublisher.sh
deleted file mode 100755
index e4e9981a75..0000000000
--- a/java/perftests/bin/topicPublisher.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# XXX -Xmx512m -Xms512m -XX:NewSize=150m
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java \
- JAVA_VM=-server \
- JAVA_MEM=-Xmx128m \
- JAVA_GC="-XX:-UseConcMarkSweepGC -XX:+HeapDumpOnOutOfMemoryError" \
- QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Damqj.logging.level="INFO" org.apache.qpid.oldtopic.Publisher $*
diff --git a/java/perftests/build.xml b/java/perftests/build.xml
index 497bfc8035..75d75b4f5a 100644
--- a/java/perftests/build.xml
+++ b/java/perftests/build.xml
@@ -7,9 +7,9 @@
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- -
+ -
- http://www.apache.org/licenses/LICENSE-2.0
- -
+ -
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -19,8 +19,15 @@
-
-->
<project name="Performance Tests" default="build">
+ <condition property="perftests.optional.test.depends" value="bdbstore" else="">
+ <and>
+ <contains string="${modules.opt}" substring="bdbstore"/>
+ <contains string="${profile}" substring="bdb"/>
+ </and>
+ </condition>
- <property name="module.depends" value="systests client broker common common/test junit-toolkit"/>
+ <property name="module.depends" value="client common"/>
+ <property name="module.test.depends" value="systests broker common/test management/common ${perftests.optional.test.depends}"/>
<import file="../module.xml"/>
@@ -30,310 +37,5 @@
<property name="qpid.logging.level" value="-Damqj.logging.level=warn"/>
<property name="log4j.config" value="-Dlog4j.configuration=perftests.log4j"/>
<property name="properties" value="perftests.properties"/>
- <property name="scripts.dir" value="${build.bin}/${module.name}"/>
-
- <condition property="results" value="${result-path}/results" else="${project.root}/${module}/results">
- <isset property="result-path"/>
- </condition>
-
- <property name="scripts.timestamp" location="${build.scratch}/perftests/scripts.timestamp" />
-
- <target name="check_scripts_uptodate">
- <uptodate property="scripts.notRequired" targetfile="${scripts.timestamp}">
- <srcfiles dir="${scripts.dir}" includes="**.sh" />
- <srcfiles dir="${project.root}/perftests/" includes="scripts.xml" />
- </uptodate>
- </target>
-
- <target name="precompile" depends="check_scripts_uptodate" unless="scripts.notRequired">
- <mkdir dir="${scripts.dir}"/>
- <jython path="${mllib.dir}">
- <args>
- <arg value="generate-scripts"/>
- <arg value="scripts.xml"/>
- <arg value="${scripts.dir}"/>
- </args>
- </jython>
- <touch file="${scripts.timestamp}" />
- </target>
-
- <target name="all-tests" depends="all-queue-tests,all-topic-tests"/>
-
- <target name="all-queue-tests" depends="Queue-Duration-Persistent,Queue-Concurrent,
- Queue-Duration,Queue-Latency,Queue-Duration-Transacted,Queue-LargeMessage-Persistent"/>
-
- <target name="all-topic-tests" depends="Topic-Concurrent,Topic-Duration,Topic-Latency,
- Topic-Duration-Transacted"/>
-
- <!-- Queue tests -->
-
- <!--
- Send 10000 (.5K) messages and measure the time for receiving 1000 messages (10 intervals)
- the overall latency is also calculated (See Test * Size Throughput)
- Note that "Test Throughput" is the average time for receiving 1000 messages
- -->
- <target name="Queue-Latency" depends="build" description="Run Queue-Latency">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-n Queue-Latency"/>
- <arg value="-s[10000]"/>
- <arg value="-t testPingLatency"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingLatencyTestPerf"/>
- <arg value="rate=100"/>
- <arg value="batchSize=1000"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
-
- <!--
- Measure the time required for one producer/consumer pair
- for sending and receiving 10000 transient messages.
- The test last for 5 minutes.
- -->
- <target name="Queue-Duration" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-d5M"/>
- <arg value="-n Queue-Duration"/>
- <arg value="-s[1000]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
-
- <!--
- Measure the time required for one producer/consumer pair
- for sending and receiving 10000 0.5K persistent messages.
- The test last for 5 minutes.
- -->
- <target name="Queue-Duration-Persistent" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-d5M"/>
- <arg value="-n Queue-Duration-Persistent"/>
- <arg value="-s[1000]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="persistent=true"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
-
- <!--
- Measure the time required for one producer/consumer pair
- for sending and receiving 10000 100K persistent messages.
- The test last for 5 minutes.
- -->
- <target name="Queue-LargeMessage-Persistent" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-d5M"/>
- <arg value="-n Queue-LargeMessage-Persistent"/>
- <arg value="-s[1000]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="persistent=true"/>
- <arg value="messageSize=102400"/>
- </java>
- </target>
-
- <!--
- Measure the time required for one (transacted producer)/(Transacted consumer) pair
- for sending and receiving 10000 (0.5K) persistent messages.
- Tx batch size is 100 (consumer and producer)
- The test last for 5 minutes.
- -->
- <target name="Queue-Duration-Transacted" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-d5M"/>
- <arg value="-n Queue-Duration-Transacted"/>
- <arg value="-s[1000]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="persistent=true"/>
- <arg value="transacted=true"/>
- <arg value="batchSize=100"/>
- <arg value="consTransacted=true"/>
- <arg value="commitBatchSize=100"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
-
- <!--
- Measure the time for four concurrent producer/receiver pairs to send and receive 1000 transient messages
- -->
- <target name="Queue-Concurrent" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-r1"/>
- <arg value="-n Queue-Concurrent"/>
- <arg value="-s[1000]"/>
- <arg value="-c[4]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
-
-
- <!-- Topic tests -->
-
- <!--
- Send 10000 (.5K) messages and measure the time for receiving 1000 messages (10 intervals)
- the overall latency is also calculated (See Test * Size Throughput)
- Note that "Test Throughput" is the average time for receiving 1000 messages
- -->
- <target name="Topic-Latency" depends="build" description="Run Queue-Latency">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-n Topic-Latency"/>
- <arg value="-s[10000]"/>
- <arg value="-t testPingLatency"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingLatencyTestPerf"/>
- <arg value="rate=100"/>
- <arg value="batchSize=1000"/>
- <arg value="messageSize=512"/>
- <arg value="pubsub=true"/>
- </java>
- </target>
-
- <!--
- Measure the time required for one producer/consumer pair
- for sending and receiving 10000 transient messages.
- The test last for 5 minutes.
- -->
- <target name="Topic-Duration" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-d5M"/>
- <arg value="-n Topic-Duration"/>
- <arg value="-s[1000]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="messageSize=512"/>
- <arg value="pubsub=true"/>
- </java>
- </target>
-
- <!--
- Measure the time required for one (transacted producer)/(Transacted consumer) pair
- for sending and receiving 10000 (0.5K) persistent messages.
- Tx batch size is 100 (consumer and producer)
- The test last for 5 minutes.
- -->
- <target name="Topic-Duration-Transacted" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-d5M"/>
- <arg value="-n Topic-Duration-Transacted"/>
- <arg value="-s[1000]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="persistent=true"/>
- <arg value="transacted=true"/>
- <arg value="batchSize=100"/>
- <arg value="consTransacted=true"/>
- <arg value="commitBatchSize=100"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
-
- <!--
- Measure the time for four concurrent producer/receiver pairs to send and receive 1000 transient messages
- -->
- <target name="Topic-Concurrent" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-r1"/>
- <arg value="-n Topic-Concurrent"/>
- <arg value="-s[1000]"/>
- <arg value="-c[4]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
</project>
diff --git a/java/perftests/dist-zip.xml b/java/perftests/dist-zip.xml
deleted file mode 100644
index 0039bfb157..0000000000
--- a/java/perftests/dist-zip.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<!-- This is an assembly descriptor that produces a zip containing all the test scripts and
- the all dependencies jar. -->
-<assembly>
- <id>perftests</id>
- <formats>
- <format>zip</format>
- <format>tar.gz</format>
- </formats>
- <includeBaseDirectory>false</includeBaseDirectory>
- <fileSets>
- <fileSet>
- <directory>target</directory>
- <outputDirectory>PerformanceTests</outputDirectory>
- <includes>
- <include>qpid-perftests-${qpid.version}-all-test-deps.jar</include>
- <include>*.sh</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>etc/scripts</directory>
- <outputDirectory>PerformanceTests</outputDirectory>
- <includes>
- <include>*.sh</include>
- </includes>
- </fileSet>
- </fileSets>
-</assembly>
diff --git a/java/perftests/etc/chartdefs/AcknowledgementModesAutoAck.chartdef b/java/perftests/etc/chartdefs/AcknowledgementModesAutoAck.chartdef
new file mode 100644
index 0000000000..42e4a0c11e
--- /dev/null
+++ b/java/perftests/etc/chartdefs/AcknowledgementModesAutoAck.chartdef
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=BAR
+chartTitle=Performance of acknowledgement modes (Auto-acknowledgement)
+xAxisTitle=Persistence
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT testName, throughputKbPerS FROM AcknowledgementModes WHERE acknowledgeMode = '1' AND participantName = 'All'
+series.1.legend=Current
+series.1.dir=${csvCurrentDir}
+
diff --git a/java/perftests/etc/chartdefs/AcknowledgementModesTransacted.chartdef b/java/perftests/etc/chartdefs/AcknowledgementModesTransacted.chartdef
new file mode 100644
index 0000000000..3bbee462a0
--- /dev/null
+++ b/java/perftests/etc/chartdefs/AcknowledgementModesTransacted.chartdef
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=BAR
+chartTitle=Performance of acknowledgement modes (Transacted)
+xAxisTitle=Persistence
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT testName, throughputKbPerS FROM AcknowledgementModes WHERE acknowledgeMode = '0' AND participantName = 'All'
+series.1.legend=Current
+series.1.dir=${csvCurrentDir}
+
diff --git a/java/perftests/etc/chartdefs/BatchSize.chartdef b/java/perftests/etc/chartdefs/BatchSize.chartdef
new file mode 100644
index 0000000000..13c42b2ebf
--- /dev/null
+++ b/java/perftests/etc/chartdefs/BatchSize.chartdef
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=LINE
+chartTitle=Transaction Batch Size
+xAxisTitle=Batch Size
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT batchSize, throughputKbPerS FROM BatchSize WHERE participantName = 'All'
+series.1.legend=Current
+series.1.dir=${csvCurrentDir}
+
diff --git a/java/perftests/etc/chartdefs/MessageSizeNonPersistent.chartdef b/java/perftests/etc/chartdefs/MessageSizeNonPersistent.chartdef
new file mode 100644
index 0000000000..22d78042d8
--- /dev/null
+++ b/java/perftests/etc/chartdefs/MessageSizeNonPersistent.chartdef
@@ -0,0 +1,27 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=LINE
+chartTitle=Impact of Message Size (Non-Persistent)
+xAxisTitle=Message Size (B)
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT payloadSizeB, throughputKbPerS FROM MessageSize WHERE testName like '%NON_PERSISTENT' AND participantName = 'All'
+series.1.legend=Current
+series.1.dir=${csvCurrentDir}
diff --git a/java/perftests/etc/chartdefs/MessageSizePersistent.chartdef b/java/perftests/etc/chartdefs/MessageSizePersistent.chartdef
new file mode 100644
index 0000000000..4a57215714
--- /dev/null
+++ b/java/perftests/etc/chartdefs/MessageSizePersistent.chartdef
@@ -0,0 +1,29 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=LINE
+chartTitle=Impact of Message Size (Persistent)
+xAxisTitle=Message Size (B)
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT payloadSizeB, throughputKbPerS FROM MessageSize WHERE testName like '% PERSISTENT' AND participantName = 'All'
+series.1.legend=Current
+series.1.dir=${csvCurrentDir}
+
+# Define series3/4 to chart the baseline
diff --git a/java/perftests/etc/chartdefs/QueueTypes.chartdef b/java/perftests/etc/chartdefs/QueueTypes.chartdef
new file mode 100644
index 0000000000..770b5cc719
--- /dev/null
+++ b/java/perftests/etc/chartdefs/QueueTypes.chartdef
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=BAR
+chartTitle=Queue Types
+xAxisTitle=Queue Types
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT testName, throughputKbPerS FROM QueueTypes WHERE participantName = 'All'
+series.1.legend=Current
+series.1.dir=${csvCurrentDir}
+
diff --git a/java/perftests/etc/chartdefs/VaryingNumberOfConsumers.chartdef b/java/perftests/etc/chartdefs/VaryingNumberOfConsumers.chartdef
new file mode 100644
index 0000000000..83d6fe2659
--- /dev/null
+++ b/java/perftests/etc/chartdefs/VaryingNumberOfConsumers.chartdef
@@ -0,0 +1,35 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=LINE
+chartTitle=Varying number of consumers
+xAxisTitle=Consumers
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT totalNumberOfConsumers, throughputKbPerS FROM VaryingNumberOfParticipants WHERE participantName = 'All' and totalNumberOfProducers = '1'
+series.1.legend=1 Producer
+series.1.dir=${csvCurrentDir}
+
+series.2.statement=SELECT totalNumberOfConsumers, throughputKbPerS FROM VaryingNumberOfParticipants WHERE participantName = 'All' and totalNumberOfProducers = '5'
+series.2.legend=5 Producers
+series.2.dir=${csvCurrentDir}
+
+series.3.statement=SELECT totalNumberOfConsumers, throughputKbPerS FROM VaryingNumberOfParticipants WHERE participantName = 'All' and totalNumberOfProducers = '10'
+series.3.legend=10 Producers
+series.3.dir=${csvCurrentDir}
diff --git a/java/perftests/etc/chartdefs/VaryingNumberOfProducers.chartdef b/java/perftests/etc/chartdefs/VaryingNumberOfProducers.chartdef
new file mode 100644
index 0000000000..51ea92b909
--- /dev/null
+++ b/java/perftests/etc/chartdefs/VaryingNumberOfProducers.chartdef
@@ -0,0 +1,35 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=LINE
+chartTitle=Varying number of producers
+xAxisTitle=Producers
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT totalNumberOfProducers, throughputKbPerS FROM VaryingNumberOfParticipants WHERE participantName = 'All' and totalNumberOfConsumers = '1'
+series.1.legend=1 Consumer
+series.1.dir=${csvCurrentDir}
+
+series.2.statement=SELECT totalNumberOfProducers, throughputKbPerS FROM VaryingNumberOfParticipants WHERE participantName = 'All' and totalNumberOfConsumers = '5'
+series.2.legend=5 Consumer
+series.2.dir=${csvCurrentDir}
+
+series.3.statement=SELECT totalNumberOfProducers, throughputKbPerS FROM VaryingNumberOfParticipants WHERE participantName = 'All' and totalNumberOfConsumers = '10'
+series.3.legend=10 Consumer
+series.3.dir=${csvCurrentDir}
diff --git a/java/perftests/etc/jndi/activemq.properties b/java/perftests/etc/jndi/activemq.properties
deleted file mode 100644
index 281577c4a8..0000000000
--- a/java/perftests/etc/jndi/activemq.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
-java.naming.provider.url= tcp://localhost:61616
-
diff --git a/java/perftests/etc/jndi/failovertest.properties b/java/perftests/etc/jndi/failovertest.properties
deleted file mode 100644
index b437d12062..0000000000
--- a/java/perftests/etc/jndi/failovertest.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
-connectionfactory.local = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5001;tcp://localhost:5002'
diff --git a/java/perftests/etc/jndi/perftests.properties b/java/perftests/etc/jndi/perftests.properties
deleted file mode 100644
index a2348f4547..0000000000
--- a/java/perftests/etc/jndi/perftests.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
-connectionfactory.local = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
diff --git a/java/perftests/etc/jndi/swiftmq.properties b/java/perftests/etc/jndi/swiftmq.properties
deleted file mode 100644
index 2d037a2513..0000000000
--- a/java/perftests/etc/jndi/swiftmq.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-java.naming.factory.initial = com.swiftmq.jndi.InitialContextFactoryImpl
-java.naming.provider.url=smqp://localhost:4001/timeout=10000
-#connectionfactory.local = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
diff --git a/java/perftests/etc/log4j.properties b/java/perftests/etc/log4j.properties
new file mode 100644
index 0000000000..60e15d0817
--- /dev/null
+++ b/java/perftests/etc/log4j.properties
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+log4j.rootLogger=ERROR,console
+
+log4j.logger.org.apache.qpid=WARN
+log4j.logger.org.apache.qpid.disttest=INFO
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.Threshold=all
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+
+log4j.appender.console.layout.ConversionPattern=%d %p [%c{1}] %m%n \ No newline at end of file
diff --git a/java/perftests/etc/perftests-jndi.properties b/java/perftests/etc/perftests-jndi.properties
new file mode 100644
index 0000000000..8ad0decaad
--- /dev/null
+++ b/java/perftests/etc/perftests-jndi.properties
@@ -0,0 +1,26 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# this file is used for running system tests of the performance test framework,
+# (i.e. not for running the performance tests themselves!)
+
+java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+
+# use QpidBrokerTestCase's default port
+connectionfactory.connectionfactory = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
+
+destination.controllerqueue = direct://amq.direct//controllerqueue
diff --git a/java/perftests/etc/perftests.log4j b/java/perftests/etc/perftests.log4j
deleted file mode 100644
index af8c1b0784..0000000000
--- a/java/perftests/etc/perftests.log4j
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-log4j.rootLogger=${root.logging.level}
-
-
-log4j.logger.org.apache.mina=${amqj.logging.level}
-
-log4j.logger.org.apache.qpid=${amqj.logging.level}, console
-log4j.additivity.org.apache.qpid=false
-
-log4j.logger.org.apache.qpid.requestreply=${amqj.test.logging.level}
-log4j.logger.org.apache.qpid.pingpong=${amqj.test.logging.level}
-log4j.logger.org.apache.qpid.ping=${amqj.test.logging.level}
-log4j.logger.org.apache.qpid.topic=${amqj.test.logging.level}
-
-log4j.logger.org.apache.qpid.junit.extensions=${badger.level}, console
-log4j.additivity.org.apache.qpid.junit.extensions=false
-
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-log4j.appender.console.Threshold=all
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-
-log4j.appender.console.layout.ConversionPattern=%t %d %p [%c{4}] %m%n
-#log4j.appender.console.layout.ConversionPattern=%t %p [%c] %m%n
-
-log4j.appender.fileApp=org.apache.log4j.FileAppender
-log4j.appender.fileApp.file=${log.dir}/perftests.volumetest.log
-log4j.appender.fileApp.Threshold=info
-log4j.appender.fileApp.append=false
-log4j.appender.fileApp.layout=org.apache.log4j.PatternLayout
diff --git a/java/perftests/etc/scripts/CTQ-Qpid-1.sh b/java/perftests/etc/scripts/CTQ-Qpid-1.sh
deleted file mode 100755
index 057dec5c63..0000000000
--- a/java/perftests/etc/scripts/CTQ-Qpid-1.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-./PQ-Qpid-1.sh $@ & ./PQ-Qpid-1-P.sh $@
diff --git a/java/perftests/etc/scripts/CTQ-Qpid-2.sh b/java/perftests/etc/scripts/CTQ-Qpid-2.sh
deleted file mode 100755
index 08057cbf44..0000000000
--- a/java/perftests/etc/scripts/CTQ-Qpid-2.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-./PQ-Qpid-2.sh $@ & ./PQ-Qpid-2-P.sh $@
diff --git a/java/perftests/etc/scripts/CTQ-Qpid-3.sh b/java/perftests/etc/scripts/CTQ-Qpid-3.sh
deleted file mode 100755
index 0bb7e25197..0000000000
--- a/java/perftests/etc/scripts/CTQ-Qpid-3.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-./PQ-Qpid-3.sh $@ & ./PQ-Qpid-3-P.sh $@
diff --git a/java/perftests/etc/scripts/CTQ-Qpid-4.sh b/java/perftests/etc/scripts/CTQ-Qpid-4.sh
deleted file mode 100755
index 278e44d12b..0000000000
--- a/java/perftests/etc/scripts/CTQ-Qpid-4.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-./PQ-Qpid-4.sh $@ & ./PQ-Qpid-4-P.sh $@
diff --git a/java/perftests/etc/scripts/CTQ-Qpid-5.sh b/java/perftests/etc/scripts/CTQ-Qpid-5.sh
deleted file mode 100755
index 5dee0176b2..0000000000
--- a/java/perftests/etc/scripts/CTQ-Qpid-5.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-./PQ-Qpid-5.sh $@ & ./PQ-Qpid-5-P.sh $@
diff --git a/java/perftests/etc/scripts/CTQ-Qpid-6.sh b/java/perftests/etc/scripts/CTQ-Qpid-6.sh
deleted file mode 100755
index b9996da77d..0000000000
--- a/java/perftests/etc/scripts/CTQ-Qpid-6.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-./PQ-Qpid-6.sh $@ & ./PQ-Qpid-6-P.sh $@
diff --git a/java/perftests/etc/scripts/Connections.sh b/java/perftests/etc/scripts/Connections.sh
deleted file mode 100755
index 17e69166bf..0000000000
--- a/java/perftests/etc/scripts/Connections.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-find . -regex '\.\/[P|T].CT-.*\.sh' -exec {} -o results-Connections/ --csv \;
diff --git a/java/perftests/etc/scripts/JobQueue.sh b/java/perftests/etc/scripts/JobQueue.sh
deleted file mode 100755
index 312037f5ab..0000000000
--- a/java/perftests/etc/scripts/JobQueue.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-find . -regex '.*BL-.*\.sh' -exec {} -o results-JobQueue/ --csv \;
diff --git a/java/perftests/etc/scripts/Latency.sh b/java/perftests/etc/scripts/Latency.sh
deleted file mode 100755
index f70131de38..0000000000
--- a/java/perftests/etc/scripts/Latency.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-find . -regex '\.\/[P|T].CL-.*\.sh' -exec {} -o results-Latency/ --csv \;
diff --git a/java/perftests/etc/scripts/MessageSize.sh b/java/perftests/etc/scripts/MessageSize.sh
deleted file mode 100755
index bb10822257..0000000000
--- a/java/perftests/etc/scripts/MessageSize.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-find . -regex '.*M-Qpid-.*\.sh' -exec {} -o results-messageSize/ --csv $* \;
diff --git a/java/perftests/etc/scripts/PT-Qpid-13.sh b/java/perftests/etc/scripts/PT-Qpid-13.sh
deleted file mode 100755
index df35f718b9..0000000000
--- a/java/perftests/etc/scripts/PT-Qpid-13.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-echo "Starting 6 parallel tests"
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-13.1 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=newd1 uniqueDests=true batchSize=250 transacted=true commitBatchSize=50 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-13.2 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=newd2 uniqueDests=true batchSize=250 transacted=true commitBatchSize=50 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-13.3 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=newd3 uniqueDests=true batchSize=250 transacted=true commitBatchSize=50 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-13.4 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinatioNname=newd4 uniqueDests=true batchSize=250 transacted=true commitBatchSize=50 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-13.5 -s [250] -c[100] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=newd5 uniqueDests=true batchSize=250 transacted=true commitBatchSize=50 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-13.6 -s [250] -c[100] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=newd6 uniqueDests=true batchSize=250 transacted=true commitBatchSize=50 -o $QPID_WORK/results ${ARGS}
-
diff --git a/java/perftests/etc/scripts/PT-Qpid-14.sh b/java/perftests/etc/scripts/PT-Qpid-14.sh
deleted file mode 100755
index ff5b8a76f9..0000000000
--- a/java/perftests/etc/scripts/PT-Qpid-14.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-echo "Starting 6 parallel tests"
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-14 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=ping1 batchSize=250 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-14 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=ping2 batchSize=250 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-14 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=ping3 batchSize=250 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-14 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256destinationname=ping4 batchSize=250 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-14 -s [250] -c[100] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=ping5 batchSize=250 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-14 -s [250] -c[100] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=ping6 batchSize=250 -o $QPID_WORK/results ${ARGS}
diff --git a/java/perftests/etc/scripts/Reliability.sh b/java/perftests/etc/scripts/Reliability.sh
deleted file mode 100755
index 9e5e508743..0000000000
--- a/java/perftests/etc/scripts/Reliability.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-find . -regex '.*R-Qpid-0[1-8].*\.sh' -exec {} -o results-Reliability/ --csv \;
diff --git a/java/perftests/etc/scripts/RunAll.sh b/java/perftests/etc/scripts/RunAll.sh
deleted file mode 100755
index 8b0d8b6e7c..0000000000
--- a/java/perftests/etc/scripts/RunAll.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-./RunCore.sh
-./Connections.sh
-./JobQueue.sh
-./MessageSize.sh
diff --git a/java/perftests/etc/scripts/RunCore.sh b/java/perftests/etc/scripts/RunCore.sh
deleted file mode 100755
index fcc45aacf0..0000000000
--- a/java/perftests/etc/scripts/RunCore.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-./Throughput.sh
-./Latency.sh
-./Reliability.sh
diff --git a/java/perftests/etc/scripts/Test-ActiveMQ.sh b/java/perftests/etc/scripts/Test-ActiveMQ.sh
deleted file mode 100644
index 27e0411870..0000000000
--- a/java/perftests/etc/scripts/Test-ActiveMQ.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx1024m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp "qpid-perftests-1.0-incubating-M2.1-SNAPSHOT.jar;activemq-jars/apache-activemq-4.1.1.jar" org.apache.qpid.junit.extensions.TKTestRunner -n Test-ActiveMQ -s[1] -r 1 -t testAsyncPingOk -o . org.apache.qpid.ping.PingAsyncTestPerf properties=activemq.properties factoryName=ConnectionFactory ${ARGS}
-
-# queueNamePostfix=@router1 overrideClientId=true
diff --git a/java/perftests/etc/scripts/Test-SwiftMQ.sh b/java/perftests/etc/scripts/Test-SwiftMQ.sh
deleted file mode 100644
index 1f0b38ccc2..0000000000
--- a/java/perftests/etc/scripts/Test-SwiftMQ.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx1024m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp "qpid-perftests-1.0-incubating-M2.1-SNAPSHOT.jar;swiftmqjars/swiftmq.jar" org.apache.qpid.junit.extensions.TKTestRunner -n Test-SwiftMQ -s[1] -r 1 -t testAsyncPingOk -o . org.apache.qpid.ping.PingAsyncTestPerf properties=swiftmq.properties factoryName=ConnectionFactory queueNamePostfix=@router1 overrideClientId=true ${ARGS}
diff --git a/java/perftests/etc/scripts/Throughput.sh b/java/perftests/etc/scripts/Throughput.sh
deleted file mode 100755
index d08ad248a5..0000000000
--- a/java/perftests/etc/scripts/Throughput.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-find . -regex '.*[P|T].BT-.*\.sh' -exec {} -o results-throughput/ --csv $* \;
diff --git a/java/perftests/etc/scripts/drainBroker.sh b/java/perftests/etc/scripts/drainBroker.sh
deleted file mode 100755
index eea7209f03..0000000000
--- a/java/perftests/etc/scripts/drainBroker.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-if [ -z "$QPID_HOME" ]; then
- export QPID_HOME=$(dirname $(dirname $(dirname $(readlink -f $0))))
- export PATH=${PATH}:${QPID_HOME}/bin
-fi
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-# Set classpath to include Qpid jar with all required jars in manifest
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java JAVA_VM=-server JAVA_MEM=-Xmx1024m QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Xms256m -Dlog4j.configuration=file://${QPID_HOME}/etc/perftests.log4j -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn org.apache.qpid.junit.extensions.TKTestRunner -n PQBT-TX-Qpid-01 -s[1000] -c[1] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=0 consumeOnly=true consumeOnly=true${ARGS}
diff --git a/java/perftests/etc/scripts/extractResults.sh b/java/perftests/etc/scripts/extractResults.sh
deleted file mode 100755
index 4fc74059af..0000000000
--- a/java/perftests/etc/scripts/extractResults.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/bash +x
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-#
-# Process a given directory (defaults to '.') and provide a list of the tests run so
-# identification of any failures can be seen.
-#
-
-if [ $# == 0 ] ; then
- dir=.
-else
- dir=$1
-fi
-
-grep 'Total Tests:' $dir/*Qpid* | sed -e 's/^.*\/\([A-Z\-]*-Qpid-[0-9]*\).*Total Tests:, \([0-9.]*\).*Total Passed:, \([0-9.]*\).*Total Failed:, \([0-9.]*\).*Total Error:, \([0-9.]*\).*$/\1, Total:\t\2,\tPassed:\t\3,\tFailed:\t\4,\tError:\t\5/'
diff --git a/java/perftests/etc/scripts/extractThroughputResults.sh b/java/perftests/etc/scripts/extractThroughputResults.sh
deleted file mode 100755
index 14236c68bc..0000000000
--- a/java/perftests/etc/scripts/extractThroughputResults.sh
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/bash +x
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-#
-# Process a given directory (defaults to '.') and provides the throughput results as
-# reported by the tests.
-#
-# if a second argument of -n is provided then it will only list the number output for
-# easy copy/paste
-#
-
-if [ $# == 0 ] ; then
- dir=.
-else
- dir=$1
-fi
-
-numeric=0
-if [ "$dir" == "-n" ] ; then
- numeric=1
- dir=.
-fi
-
-if [ "$2" == "-n" ] ; then
- numeric=1
-fi
-
-if [ $numeric == 1 ] ; then
- grep 'Total Tests:' $dir/*Qpid* | sed -e 's/^.*\/\([A-Z]*-[A-Z][A-Z]-Qpid-01\).*Size Throughput:, \([0-9.]*\).*$/\1, \2/' | sed -e 's/\.\([0-9][0-9][0-9]\)/\1\./' | sed -e 's/, 0/, /' | awk '{print $2}'
-else
- grep 'Total Tests:' $dir/*Qpid* | sed -e 's/^.*\/\([A-Z]*-[A-Z][A-Z]-Qpid-01\).*Size Throughput:, \([0-9.]*\).*$/\1, \2/' | sed -e 's/\.\([0-9][0-9][0-9]\)/\1\./' | sed -e 's/, 0/, /'
-fi
diff --git a/java/perftests/etc/scripts/fillBroker.sh b/java/perftests/etc/scripts/fillBroker.sh
deleted file mode 100755
index 5b7de6f999..0000000000
--- a/java/perftests/etc/scripts/fillBroker.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-if [ -z "$QPID_HOME" ]; then
- export QPID_HOME=$(dirname $(dirname $(dirname $(readlink -f $0))))
- export PATH=${PATH}:${QPID_HOME}/bin
-fi
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-# Set classpath to include Qpid jar with all required jars in manifest
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java JAVA_VM=-server JAVA_MEM=-Xmx1024m QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Xms256m -Dlog4j.configuration=file://${QPID_HOME}/etc/perftests.log4j -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn org.apache.qpid.junit.extensions.TKTestRunner -n PQBT-TX-Qpid-01 -s[1000] -c[1] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=0 transacted=true consTransacted=true consAckMode=0 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=0 ${ARGS}
diff --git a/java/perftests/etc/scripts/sendAndWaitClient.sh b/java/perftests/etc/scripts/sendAndWaitClient.sh
deleted file mode 100755
index af4b788658..0000000000
--- a/java/perftests/etc/scripts/sendAndWaitClient.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-$JAVA_HOME/bin/java -Dlog4j.configuration=backup-log4j.xml -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.ping.PingSendOnlyClient messageSize=512
diff --git a/java/perftests/etc/scripts/testWithPreFill.sh b/java/perftests/etc/scripts/testWithPreFill.sh
deleted file mode 100755
index 721ecf6ecc..0000000000
--- a/java/perftests/etc/scripts/testWithPreFill.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-if [ -z "$QPID_HOME" ]; then
- export QPID_HOME=$(dirname $(dirname $(dirname $(readlink -f $0))))
- export PATH=${PATH}:${QPID_HOME}/bin
-fi
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-# Set classpath to include Qpid jar with all required jars in manifest
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java JAVA_VM=-server JAVA_MEM=-Xmx1024m QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Xms256m -Dlog4j.configuration=file://${QPID_HOME}/etc/perftests.log4j -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn org.apache.qpid.junit.extensions.TKTestRunner -n PQBT-TX-Qpid-01 -s[1000] -c[1] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=0 preFill=1000 delayBeforeConsume=1000 ${ARGS}
diff --git a/java/perftests/etc/testdefs/short/AcknowledgementModes.json b/java/perftests/etc/testdefs/short/AcknowledgementModes.json
new file mode 100644
index 0000000000..d504c486aa
--- /dev/null
+++ b/java/perftests/etc/testdefs/short/AcknowledgementModes.json
@@ -0,0 +1,138 @@
+{
+ "_tests":[
+ {
+ "_name": "Acknowledgement Modes - NON_PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 1000000,
+ "_acknowledgeMode": 1,
+ "_deliveryMode": 1
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 250000,
+ "_acknowledgeMode": 0,
+ "_deliveryMode": 1
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Acknowledgement Modes - PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 100000,
+ "_acknowledgeMode": 1,
+ "_deliveryMode": 2
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 25000,
+ "_acknowledgeMode": 0,
+ "_deliveryMode": 2
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue?durable='true'",
+ "_durable" : "true"
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue?durable='true'"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue?durable='true'"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/java/perftests/etc/testdefs/short/BatchSize.json b/java/perftests/etc/testdefs/short/BatchSize.json
new file mode 100644
index 0000000000..eeb446bad6
--- /dev/null
+++ b/java/perftests/etc/testdefs/short/BatchSize.json
@@ -0,0 +1,84 @@
+{
+ "_tests":[
+ {
+ "_name": "Batch Size- PERSISTENT";
+ "_iterations":[
+ {
+ "_batchSize": 1
+ },
+ {
+ "_batchSize": 2
+ },
+ {
+ "_batchSize": 5
+ },
+ {
+ "_batchSize": 10
+ },
+ {
+ "_batchSize": 20
+ },
+ {
+ "_batchSize": 50
+ },
+ {
+ "_batchSize": 100
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//batchSize?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//batchSize?durable='true'",
+ "_messageSize": 1024,
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//batchSize?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/java/perftests/etc/testdefs/short/MessageSize.json b/java/perftests/etc/testdefs/short/MessageSize.json
new file mode 100644
index 0000000000..3354d72d3e
--- /dev/null
+++ b/java/perftests/etc/testdefs/short/MessageSize.json
@@ -0,0 +1,213 @@
+{
+ "_tests":[
+ {
+ "_name": "Message Size - 1P-1C - NON_PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 256,
+ "_numberOfMessages": 1000000
+ },
+ {
+ "_messageSize": 512,
+ "_numberOfMessages": 500000
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": "250000"
+ },
+ {
+ "_messageSize": 2048,
+ "_numberOfMessages": "125000"
+ },
+ {
+ "_messageSize": 4096,
+ "_numberOfMessages": "62500"
+ },
+ {
+ "_messageSize": 8192,
+ "_numberOfMessages": 31250
+ },
+ {
+ "_messageSize": 16384,
+ "_numberOfMessages": 15625
+ },
+ {
+ "_messageSize": 32768,
+ "_numberOfMessages": 7812
+ },
+ {
+ "_messageSize": 65536,
+ "_numberOfMessages": 3906
+ },
+ {
+ "_messageSize": 131072,
+ "_numberOfMessages": 195
+ },
+ {
+ "_messageSize": 262144,
+ "_numberOfMessages": 97
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//messageSize",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//messageSize",
+ "_deliveryMode": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//messageSize"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Message Size - 1P-1C - PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 256,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 512,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 2048,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 4096,
+ "_numberOfMessages": 4000
+ },
+ {
+ "_messageSize": 8192,
+ "_numberOfMessages": 4000
+ },
+ {
+ "_messageSize": 16384,
+ "_numberOfMessages": 4000
+ },
+ {
+ "_messageSize": 32768,
+ "_numberOfMessages": 2000
+ },
+ {
+ "_messageSize": 65536,
+ "_numberOfMessages": 2000
+ },
+ {
+ "_messageSize": 131072,
+ "_numberOfMessages": 2000
+ },
+ {
+ "_messageSize": 262144,
+ "_numberOfMessages": 2000
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//messageSize?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//messageSize?durable='true'",
+ "_deliveryMode": 2
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//messageSize?durable='true'"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/java/perftests/etc/testdefs/short/QueueTypes.json b/java/perftests/etc/testdefs/short/QueueTypes.json
new file mode 100644
index 0000000000..2237e8d8b9
--- /dev/null
+++ b/java/perftests/etc/testdefs/short/QueueTypes.json
@@ -0,0 +1,16198 @@
+{
+ "_tests":[
+ {
+ "_name": "queue-type:sorted-queue";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//sorted-queue?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "qpid.queue_sort_key": "sort-key"
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "sort-key": {"@def": "list", "_items": [
+"GWqqXCp3mZ","b29RJ45cIH","7hyVvgtCA5","16lHcCxVEf","jzUqRuPX7G","0Wr5y4QMc9","pWiOsLbRTH","Dz1R3BGaQY","Cfgr39y4lw","Zv7z0FxX9q",
+"lj07QxXTI4","RACuj9XyT9","MGlTF55rfB","0Wr5yW3VFH","lweGyVprf2","lpF6WuJScX","lCMxy2TRI7","KZamHl83Ud","5drc6jiVBP","rKDLJwDajX",
+"CK5W7MezSW","2TRI7LbRTH","zqH0WiwzGk","hYBCKUvlv4","Mkgy8Q6hMC","8FmFHjtn0X","8FmFH5Mg9r","hUTw7rz7Ut","pmeCdQnJ1S","euZA5dQ586",
+"sqVrfQWxoT","RsQUqTwano","7ku1ptlILt","jzUqRpiJSk","0YAGH5Drn0","7ku1pCxVEf","QbxXc8hJdt","4W0Tldpe1v","MK07Ys7Mxk","zHF1qCNHmv",
+"uoStwRzaZA","KZamHVLTy6","XyPZN5Drn0","7fKYU07n1c","HfyNQiwzGk","mX2GEoGu6x","9eoRcydG8U","pAhR1iKqhr","LbRTHb29RJ","Waim6DLhzM",
+"bgJAzReKEW","pmeCdjeskS","gdQsSguMb8","Oz8yZI7p2a","ogLgculk41","HfyNQ0MR5X","24ARFWDVWJ","uAWypwDajX","lH1kt6AFT0","EOE1oZhwG1",
+"AIYUu0Kyfs","prNT6uTacx","TwanoFPfSE","OUYuFAXpwE","euZA5FVMxo","ni2v10BmCy","5Mg9rJRJQB","nlaBya00b5","7X3uyL7cGc","ECMvU55rfB",
+"JXljW2TRI7","Z4I1vY1mC0","lj07QFhtgl","fqypycmXIX","Ul4a1GrDg7","LDk6fulk41","2Nslm2hEEU","LbRTHuTacx","gIYvEK4GS8","Cfgr3i7WMQ",
+"pWiOss4786","mX2GETCgPp","8xEKzjeskS","uTacxDQimp","ksJbyfFDrJ","7fKYUAOgEe","5Drn0azIWp","he9IAIKxdL","HfyNQTwano","FcWrW0ao3l",
+"iKqhrn8pJ9","BbwgArhl0J","M6qcGjiVBP","b29RJ8U2nU","MK07Y8cVD3","dhSuHjfREu","azIWpjS1aj","qQxHPTwano","QChxsJRJQB","YjB9tuZPqg",
+"FVMxoMmKGJ","JKWYRZUnqt","AIYUuhUTw7","U3yw5Cp3mZ","zz4ZUGXdoH","8hJdtBbwgA","Ul4a155rfB","oVQp6DLhzM","DG4sTfmIK1","zY1GYAXpwE",
+"M3zXLGrDg7","CK5W7jSjS3","fmIK1uTacx","OxWIHkB5nP","xXTI4BFkb8","OUYuFblLA9","RkQkeqaofN","YjB9tuTacx","uLtKsW7cTs","l83UdDcpWB",
+"brhlQRsQUq","GSQwjCIShG","GSQwjFwEJz","HlUbF2DREs","Mkgy8xReec","16lHcwDajX","MaJQs5IhmG","9iGoTdmoS7","DQimplpF6W","bgJAzVjCZq",
+"vLsmSwDajX","DG4sTciuWz","ECMvU48cHL","nlaByqaofN","QWxoTv1Hln","WaWsvqUJMd","F6PT28cVD3","lweGyLewvM","IRh48xciqp","9y4lw8U2nU",
+"2TRI7NOHsz","uAWypuTacx","FhtglcQOnv","bZLvS0PktI","v2eC3DcpWB","ReKEWksJby","ECMvUPOUYS","8RCUATa8f6","gjUTu0YAGH","FcWrWcmXIX",
+"QYxC0zQt6Q","MK07Y7fKYU","qQxHPoGu6x","faHirNo0Qb","aFFss0MR5X","RpBQmokgRi","IBe8kVerEA","OHaBzy94nw","0ao3lDLhzM","tuDySpT8wu",
+"jSjS3JJs5m","VerEA7Ow5C","5NammJXljW","gf8rIhi5X7","M3zXLRsQUq","K4GS8y94nw","aez9yvkCHH","uTacxix74r","RpBQmCqqaD","4dEz6L7cGc",
+"ix74rJKWYR","4W0TlNhXdu","VjCZqogLgc","45cIHNcICA","pT8wufqypy","nnP8odQ586","dpe1vGSQwj","2ZHdkvkCHH","zz4ZUhe9IA","nnP8oCqqaD",
+"vLsmSYw2oU","4QMc9GSQwj","yluBxOz8yZ","0ao3lsqVrf","K20wKCK5W7","fcwDa8FmFH","GWqqXX6Pin","faHird7vjM","RBhp0ZzJHW","EOE1owDajX",
+"QssNC0Kyfs","iqv4kCp3mZ","4W0TlMkgy8","aDGtSdhSuH","uQIcz5Drn0","1v5hHUmaEv","pAhR1MmKGJ","2Yz7EQWxoT","nFqikKASQ8","ZJTXHpT8wu",
+"5iGN5MojnP","gf8rIsuY4x","l83UdHzZT8","uoStwtAOsr","wDajXzFgtB","mz8gxAOgEe","dhSuHMm8si","ZzJHW6q6L9","FjHXRuPX7G","8cVD3MmsIo",
+"Pb1pagdQsS","m4bxUuAWyp","4QMc9suY4x","nnP8ouZPqg","7X3uynFqik","FnPFBRxrsm","Waim6NcICA","KASQ8JIqXi","s7MxkguMb8","KASQ8AkKTk",
+"fFDrJtuDyS","l83UdD6rBy","ZhwG1dmoS7","7ku1pnnP8o","uPX7GpFrrl","7ku1p4W0Tl","zmLYDQbxXc","zY1GYPb1pa","x3LDe3weIF","zbIYYKsjRK",
+"7Ow5COHaBz","dhSuHJJs5m","RzaZAZhwG1","HRxd8DQimp","IjTwPCK5W7","AOgEelpF6W","8FmFHn1pmO","e6e4z0Kyfs","blLA95nmWv","s4786LbRTH",
+"VBjhzuPX7G","WPmlx7Ow5C","soy9tK4GS8","qaofNfcwDa","iB08lOHaBz","4W0Tl0MR5X","FLsphNo0Qb","kZANmZJTXH","fmIK19iGoT","zFgtB7fsYM",
+"tlILtKZamH","zHF1qvkCHH","HzZT8O3iyQ","i3pydMkgy8","GXdoHy94nw","HlUbFyToGW","e6e4za00b5","aDGtSi3pyd","ZJTXHjzUqR","pAhR1FNYIM",
+"5Mg9rhUTw7","QWxoTL7cGc","aFFssfcwDa","GSQwjni2v1","Vprf2Nxx9V","7ku1peuZA5","MaJQsokgRi","DcpWBQ6hMC","HlUbFM6qcG","iqv4kKr8ys",
+"hi5X7cL0aE","fLNg8Nxx9V","zHF1qQbxXc","Yf2EcB3qem","gIYvEQWxoT","CIShGlViBv","8xEKzBCxeC","UmaEvh1zcH","ogLgcfcJOy","ZUnqtGSQwj",
+"2hEEUzQt6Q","rKDLJTXQ0Z","MmsIoru4UG","mz8gxOxWIH","zFgtBhYBCK","bZLvSqUJMd","hi5X7lsQGo","hSSvQs4786","SjskQoGu6x","07n1cJ2mQi",
+"hYBCKjeskS","Chuy324ARF","s4786UlU3M","AkKTkBFkb8","W3VFHulk41","tl72W7fsYM","ZhwG1Rxrsm","K4GS8YOfrY","0PktIxciqp","9rlg90h1b1",
+"Pb1paAgJHQ","WmadAsx5Gl","GWqqXnFqik","QnJ1SFcWrW","XyPZNNo0Qb","9rlg9TXQ0Z","4dEz6oQ87r","WaWsvZ4I1v","7hyVv4dEz6","a00b5TXQ0Z",
+"iqv4kblLA9","pv0i7ciuWz","9GXkXsx5Gl","Yh1hFyEfy9","SWfouQssNC","5NammlsQGo","ciuWzJKWYR","RmDcrWmadA","s47862ZHdk","RACujo8Uyd",
+"hYBCKm4bxU","l83UdMaJQs","9rlg9Qworu","J2mQiTa8f6","jzUqR7ku1p","64s8NSmGzv","ZhwG1NOHsz","fFDrJuoStw","Chuy3RACuj","aL6AJ5drc6",
+"hYBCKS2Dfu","OHaBzJXljW","djsrv0ao3l","zz4ZUsqVrf","TXQ0ZIBe8k","lViBv2Yz7E","cQOnvMm8si","aL6AJLDk6f","ThjNnru4UG","14FLRo8Uyd",
+"pv0i7rz7Ut","tlILtCIShG","WMiS37fKYU","xXTI4b29RJ","8FmFHThjNn","8cVD34QMc9","8xEKzqaofN","Oz8yZs93Ml","tjQxsJRJQB","Chuy3TCgPp",
+"P6bcgfmIK1","OUYuFI7p2a","tlILtQssNC","k85Aem4bxU","RpBQm7lUXZ","StlDJyvOMI","DcpWBFxX9q","iwzGk0ao3l","KASQ8BbwgA","gdQsS45cIH",
+"bZLvSpWiOs","RACujGrDg7","tuDySZv7z0","d85a9Pb1pa","0BmCyQWxoT","ECMvUs93Ml","CIShGmX2GE","uupzktAOsr","1LB1Lgf8rI","24ARFbgJAz",
+"HRxd8hi5X7","1v5hHyluBx","RACujWreyP","vLsmS0ao3l","BFkb8uTacx","7lUXZVjCZq","RACujSbRYy","K20wK1v5hH","uPX7GUvlv4","tvdkDOHaBz",
+"dpe1vKr8ys","5NammJ2mQi","aDGtSQClRL","M6qcGRzaZA","WMiS3SWfou","0KyfsSmGzv","P6bcg0Wr5y","pvgjSfLNg8","RpBQmCK5W7","gf8rIFxX9q",
+"sqVrf8FmFH","lpF6Wzz4ZU","AOgEeTwano","7lUXZNhXdu","64s8NJIqXi","ni2v1d85a9","2DREscQOnv","Mm8silm0pD","xXTI4MK07Y","Q6Lix9XyT9",
+"64s8NG1RhS","RkQkevOqCE","zz4ZUpv0i7","QnJ1SBpYhV","a00b5IKxdL","BpYhV8xEKz","s7MxkPYBf4","ThjNn5Drn0","jfREu7Ow5C","cShY2VjCZq",
+"M3zXLtAOsr","ru4UGRzaZA","5NammF6PT2","CNHmvtjQxs","MmsIoFxX9q","fqypyWPmlx","K20wKMaJQs","7lUXZ0h1b1","sx5Gln1pmO","ZhwG14QMc9",
+"45cIHUvlv4","i3pyd8U2nU","RmDcrXyPZN","Nxx9Ve6e4z","uPX7GO3iyQ","5VZjSbZLvS","jS1ajh1zcH","0Kyfs5iGN5","7X3uyn8pJ9","3weIFOHaBz",
+"IjTwPIRh48","CdyBV1v5hH","hi5X72Nslm","atef2KsjRK","K20wKMmKGJ","nnP8o4QMc9","7ku1pcShY2","Mm8siGv3Fq","dhSuHrz7Ut","5drc6IjTwP",
+"lkMUAjzUqR","lweGyiKqhr","7Ow5Czz4ZU","AmdQdCfgr3","aFFssL7cGc","P6bcggjUTu","s7MxkY1mC0","FVMxoQbxXc","uPX7GblLA9","BFkb8jeskS",
+"8FmFHt59lR","hi5X7pv0i7","DQimpuvf7A","MezSWHlUbF","9y4lw2Yz7E","QssNC2TRI7","HzZT8EOE1o","Ta8f65drc6","WMiS35VZjS","LDk6fGSQwj",
+"uTacxgjUTu","n8pJ9L7cGc","fcJOyQYxC0","8RCUApFrrl","azIWpReKEW","uN6r3Chuy3","CNHmvL7cGc","jzUqR2Nslm","uPX7GGv3Fq","CqqaDlkMUA",
+"zY1GYSbRYy","AgJHQMGlTF","0PktIpT8wu","RxrsmU3yw5","yvOMI6q6L9","Kr8ysStlDJ","QClRLsqVrf","2Yz7EyofH3","7Ow5CprNT6","IKxdLTa8f6",
+"n8pJ92TRI7","qUJMdvOqCE","jSjS3pT8wu","S2DfusuY4x","AXpwEAgJHQ","1j5L8ZhwG1","uAWyp2Nslm","IRh488FmFH","dmoS7VLTy6","CNHmvECMvU",
+"RACujhUTw7","Uvlv4ix74r","Gv3FqaL6AJ","Waim6DG4sT","QYxC0gdQsS","3weIFzY1GY","pvgjSCfgr3","ZJTXHlj07Q","2hEEU29QAz","Cfgr3s93Ml",
+"wiHrZMmKGJ","XyPZNMaJQs","zbIYYNOHsz","brhlQECMvU","J2mQilweGy","fqypyOxWIH","BbwgAyofH3","W3VFHrKDLJ","sx5Gl2TRI7","AXpwE8TxD7",
+"I7p2anlaBy","NhXduqQxHP","fcJOy4QMc9","SWfouKZamH","GSQwjuoStw","fmIK17X3uy","tAOsrQ6hMC","k85Ae45cIH","Y1mC0uQIcz","zbIYY8FmFH",
+"uZPqg3weIF","8TxD7OHaBz","pmeCd4W0Tl","WaWsv0Wr5y","IRh482TRI7","nlaByvLsmS","hSSvQdpe1v","hi5X7xciqp","tl72WAIYUu","OUqFM9rlg9",
+"VBjhzQ6Lix","Cp3mZSWfou","5drc6ksJby","faHirMmsIo","fFDrJvLsmS","ReKEWfqypy","QWxoTGrDg7","2DREsRpBQm","WaWsvZv7z0","8U2nU3weIF",
+"Rxrsmv2eC3","7X3uyaez9y","0MR5XJJs5m","5IhmGdQ586","BpYhVoQ87r","8FmFH8xEKz","ZUnqtqaofN","45cIHlH1kt","48cHLhUTw7","LewvMnnP8o",
+"CNHmvHzZT8","WMiS39iGoT","QChxsjfREu","RmDcr5iGN5","4dEz68RCUA","64s8NOz8yZ","yluBxuoStw","7hyVvWPmlx","FLsphprNT6","ogLgchE1Ql",
+"uPX7G2TRI7","M6qcGv1Hln","n8pJ9t59lR","cmXIXaL6AJ","1j5L8ni2v1","zz4ZUJKWYR","VBjhzru4UG","oVQp6CNHmv","lViBvTXQ0Z","Pb1paGrDg7",
+"FjHXRFjHXR","yEfy9MmsIo","hE1QlJRJQB","xXTI407n1c","8FmFHtaOXK","fqypyReKEW","AXpwEVprf2","RBhp0ECMvU","Chuy3K4GS8","nFqikTa8f6",
+"lkMUARxrsm","a00b5ulk41","64s8NciuWz","IKxdLHfyNQ","2Nslmt59lR","5drc6580YD","uupzk0h1b1","7fsYMdjsrv","CdyBVoQ87r","Yh1hFMezSW",
+"prNT6hE1Ql","Yh1hFSWfou","CIShGG1RhS","2Yz7EJkzUn","zHF1qZUnqt","xXTI4tjQxs","ZzJHWCxVEf","I7p2akB5nP","2NslmMkgy8","KsjRKVLTy6",
+"TXQ0ZFwEJz","HlUbFazIWp","M3zXLs4786","VerEAzFgtB","VNCPdJIqXi","Pb1pafLNg8","8TxD74QMc9","gIYvEv8yFN","FNYIMgIYvE","YOfrYd7vjM",
+"9rlg914FLR","zFgtBC2Irc","4QMc9D6rBy","uLtKsQssNC","Yw2oUWreyP","WaWsvFhtgl","MGlTFdjsrv","tlILtLDk6f","QClRLhSSvQ","QssNCaL6AJ",
+"fcJOy2ZHdk","d85a9RBhp0","lpF6W7fKYU","qUJMdlXFOB","JIqXidpe1v","45cIHCxVEf","t59lR0Wr5y","zFgtBhe9IA","uLtKsCfgr3","YOfrYReKEW",
+"AgJHQhE1Ql","2ZHdk6q6L9","AgJHQChuy3","RACujuAWyp","Yw2oUDz1R3","pAhR1HfyNQ","jeskSaDGtS","CK5W7Dz1R3","3otm6blLA9","X6PinKASQ8",
+"aez9ygIYvE","K20wKhi5X7","suY4xiKqhr","s4786Z4I1v","gIYvEydG8U","AmdQdQ6hMC","gjUTuAXpwE","FPfSEW3VFH","bgJAzatef2","gf8rIO3iyQ",
+"gtCA5blLA9","FVMxoVjCZq","7hyVvfLNg8","zqH0WC2Irc","yEfy9lweGy","JXljWDQimp","wDajXGXdoH","s93MlFwEJz","G1RhS618Di","l83Ud5IhmG",
+"45cIHzFgtB","8RCUAlsQGo","ni2v11LB1L","yvOMI2Yz7E","zz4ZUnnP8o","L7cGcRsQUq","v8yFNdhSuH","5IhmGzz4ZU","yvOMIo8Uyd","Cp3mZS77LH",
+"zz4ZUGSQwj","P6bcgIjTwP","hYBCKDQimp","8cVD3SjskQ","EoToP64s8N","6q6L9QbxXc","wiHrZqaofN","cmXIXxXTI4","3otm6zqH0W","24ARFulk41",
+"VLTy6cShY2","soy9tOHaBz","StlDJ2Nslm","AkKTkwiHrZ","VerEAyEfy9","HfyNQCK5W7","cShY2M6qcG","bZLvSXyPZN","J2mQiWmadA","0ao3lRxrsm",
+"QChxs4dEz6","0ao3lhi5X7","yvOMITa8f6","hSSvQMmKGJ","OHaBzFNYIM","16lHcy94nw","1LB1L8hJdt","SbRYyWmadA","MGlTFKZamH","rKDLJGWqqX",
+"IjTwPdjsrv","EOE1oHP433","Gv3FqZzJHW","RsQUqfLNg8","G1RhS5ZaEz","JKWYR7fKYU","JXljWTa8f6","FPfSEo8Uyd","4QMc9yToGW","HfyNQM6qcG",
+"S77LHFPfSE","fqypyvkCHH","tuDySfFDrJ","gf8rIuQIcz","Oz8yZFNYIM","FGzgpyToGW","8hJdtKr8ys","pAhR1618Di","pmeCdfFDrJ","AkKTkhUTw7",
+"0MR5XoQ87r","RACujs93Ml","dQ586kB5nP","uoStwYOfrY","UmaEvUlU3M","9GXkXxReec","pv0i7tjQxs","OUqFMQssNC","FnPFBuAWyp","WreyPiKqhr",
+"aFFssUlU3M","dhSuHS77LH","vkCHHFNYIM","Oz8yZG1RhS","C2Irc6AFT0","2ZHdkzbIYY","BpYhVTwano","Mkgy8yEfy9","PYBf4RsQUq","FxX9qlpF6W",
+"WaWsvjfREu","M3zXLU3yw5","VjCZqfcJOy","mz8gxIKxdL","WPmlxCNHmv","1v5hHzqH0W","v1HlnjzUqR","G1RhSNo0Qb","Yh1hFNo0Qb","6AFT0ksJby",
+"dhSuHAOgEe","pv0i7JXljW","djsrv29QAz","D6rByix74r","M6qcG4W0Tl","ThjNneuZA5","5drc6S77LH","TXQ0ZfcJOy","UlU3MgIYvE","ReKEW16lHc",
+"lXFOBSmGzv","aL6AJMGlTF","Yf2Ec7fKYU","0MR5XvLsmS","HzZT8NAFuw","gdQsSIRh48","TXQ0ZAOgEe","HfyNQQWxoT","2TRI7aFFss","xXTI4ReKEW",
+"2Yz7EpT8wu","Ta8f6lXFOB","blLA9pFrrl","0h1b1WMiS3","ThjNnAmdQd","FnPFBsoy9t","hUTw7M3zXL","ksJbyZUnqt","taOXKVIlwP","XflUqtlILt",
+"BpYhVpmeCd","zHF1q5IhmG","gdQsSZzJHW","uAWypYh1hF","BCxeCTXQ0Z","yluBxPOUYS","nnP8oaL6AJ","qQxHPFnPFB","VNCPdcL0aE","s93Ml5VZjS",
+"zHF1qIn3NS","jeskSTXQ0Z","v2eC3sqVrf","uAWyp8hJdt","lXFOB5Drn0","OHaBzAXpwE","uTacxGSQwj","Dz1R3VLTy6","zHF1qulk41","EdBKcRpBQm",
+"Gv3Fq5nmWv","Y1mC01j5L8","45cIHfcJOy","ZJTXHuJScX","bZLvSThjNn","3weIF9XyT9","qQxHPHRxd8","55rfBXyPZN","DG4sTXyPZN","suY4xxXTI4",
+"cL0aEjS1aj","pFrrlAXpwE","uoStwlH1kt","vOqCEaL6AJ","RmDcrfLNg8","suY4xZv7z0","TCgPptuDyS","JJs5m45cIH","F6PT2Ul4a1","B3qem8U2nU",
+"K20wK6q6L9","brhlQWaWsv","FjHXRJJs5m","gf8rI3weIF","BGaQY7fKYU","NhXdu7lUXZ","3weIFSmGzv","Cfgr3FVMxo","LewvMlsQGo","55rfBW7cTs",
+"qaofNQ6hMC","NhXduFnPFB","iwzGkhE1Ql","M6qcGPYBf4","XyPZNVjCZq","S2DfuAgJHQ","vLsmS9GXkX","X6PinVprf2","B3qemMezSW","MmKGJKsjRK",
+"FNYIMDLhzM","U3yw5dpe1v","FFDuiFcWrW","JkzUniB08l","azIWpS2Dfu","0KyfsuTacx","lXFOBfaHir","VerEA7fsYM","StlDJQWxoT","brhlQ5Mg9r",
+"CqqaDFxX9q","4dEz6dQ586","nnP8oFjHXR","CNHmvI7p2a","LewvMazIWp","qaofNVNCPd","KsjRKdjsrv","GXdoHJIqXi","aDGtSFcWrW","RkQkepAhR1",
+"RkQkeGWqqX","F6PT229QAz","JKWYRuJScX","v1HlnguMb8","FVMxot59lR","oQ87rrhl0J","WaWsv7Ow5C","Q6hMClweGy","POUYSbgJAz","16lHcRsQUq",
+"qQxHPWaim6","lViBvRpBQm","G1RhS8TxD7","0PktIBpYhV","CIShG2DREs","2ZHdk24ARF","Yh1hFv1Hln","CdyBVxciqp","jiVBPuQIcz","v8yFNPOUYS",
+"OUqFMazIWp","RpBQm5nmWv","6AFT0JJs5m","VBjhz5Drn0","O3iyQSs0Zu","JJs5mRkQke","yvOMIQChxs","fmIK1Yh1hF","LbRTHXflUq","4W0TlqQxHP",
+"ulk41I7p2a","UlU3MtvdkD","5IhmGIjTwP","ciuWzFGzgp","0KyfsxXTI4","580YD2TRI7","tjQxspiJSk","lm0pDrKDLJ","14FLR8hJdt","29QAzWMiS3",
+"t59lRMGlTF","14FLRrz7Ut","lm0pDUl4a1","X6PinCp3mZ","7ku1pAmdQd","48cHLix74r","aL6AJaez9y","t98iWkB5nP","ru4UG2Yz7E","In3NShYBCK",
+"S2DfuQssNC","uLtKsuN6r3","G1RhSsx5Gl","618DiWPmlx","2ZHdkRpBQm","AOgEeIBe8k","lj07QVprf2","TXQ0ZJkzUn","CK5W7zmLYD","AOgEeaFFss",
+"StlDJJIqXi","VjCZqWDVWJ","W7cTsGSQwj","580YDMmKGJ","TwanoS2Dfu","lH1ktRzaZA","uupzko8Uyd","k85AeguMb8","64s8NNcICA","VLTy6uTacx",
+"oVQp67lUXZ","Zv7z0Q6hMC","Q6LixLDk6f","9rlg92Yz7E","ulk41ydG8U","JKWYRQWxoT","ciuWzaFFss","7fKYUQClRL","8FmFH0h1b1","4W0TlMezSW",
+"euZA5gjUTu","lViBv07n1c","uPX7GGXdoH","VjCZq0MR5X","6q6L9nFqik","K20wKHRxd8","580YDIBe8k","aFFss8TxD7","RpBQmHP433","5Drn0gdQsS",
+"5ZaEz9eoRc","fmIK1M3zXL","tAOsruTacx","K20wK8TxD7","48cHL9eoRc","tvdkDzFgtB","Waim6wiHrZ","SjskQWreyP","cQOnvn8pJ9","dQ586AIYUu",
+"SjskQguMb8","hYBCK5Mg9r","ogLgcFNYIM","Chuy3Ss0Zu","580YDReKEW","jzUqRDcpWB","Z4I1vyEfy9","Cfgr3MmsIo","HRxd88RCUA","FnPFBqUJMd",
+"MGlTFBCxeC","NOHszrz7Ut","M6qcGtvdkD","RzaZATwano","s93MlogLgc","tl72WZUnqt","Mkgy8Qworu","m4bxU5Namm","jeskScmXIX","cL0aE5VZjS",
+"FwEJzNOHsz","jS1ajYf2Ec","gtCA5MmKGJ","fFDrJZzJHW","QWxoT24ARF","pT8wuuJScX","5ZaEzxXTI4","QnJ1SY1mC0","cQOnvAkKTk","Ta8f6fqypy",
+"uoStwCxVEf","SbRYytAOsr","MaJQscmXIX","G1RhS2Nslm","okgRiHRxd8","16lHcuN6r3","b29RJ8FmFH","POUYS4QMc9","IKxdLi7WMQ","pvgjSnnP8o",
+"Ss0ZuuAWyp","t59lRiKqhr","0YAGHCp3mZ","WPmlxzbIYY","n8pJ9gjUTu","jSjS3zQt6Q","aez9yFVMxo","pmeCdvkCHH","jiVBP9eoRc","5Mg9r5Drn0",
+"djsrvTa8f6","v1Hln8FmFH","e6e4zZ4I1v","GSQwjBGaQY","fqypyYh1hF","RBhp0aFFss","QChxsnlaBy","gjUTuxciqp","MojnPuLtKs","SWfou8cVD3",
+"HP433HfyNQ","uupzkMezSW","Yf2Ec7hyVv","lkMUAzY1GY","oVQp6MojnP","CK5W7WMiS3","lsQGoKr8ys","v1HlnL7cGc","S2DfucmXIX","Yf2EcpAhR1",
+"v1Hln7hyVv","vkCHHzQt6Q","a00b5RzaZA","StlDJNxx9V","AXpwEHRxd8","OUqFMgtCA5","tuDySaez9y","P6bcgWDVWJ","Chuy3S2Dfu","BpYhVguMb8",
+"cmXIX8hJdt","BGaQYP6bcg","S2DfuydG8U","i7WMQYjB9t","L7cGcFPfSE","cQOnv0Kyfs","t59lRcL0aE","uQIczdpe1v","FLsph7ku1p","CNHmvWDVWJ",
+"EOE1ojS1aj","0BmCymX2GE","TXQ0ZokgRi","lkMUAWDVWJ","3otm6M3zXL","RmDcrPOUYS","AkKTkoGu6x","S2Dfu5Namm","qUJMdAIYUu","soy9tQbxXc",
+"BpYhVDQimp","NcICAyluBx","l83UdYf2Ec","K20wKKZamH","WaWsv0PktI","uJScX9XyT9","HP433tuDyS","dpe1vaDGtS","LDk6f16lHc","oGu6xx3LDe",
+"lm0pDDcpWB","fcwDajS1aj","ru4UGCNHmv","MezSWaez9y","0YAGHHRxd8","5NammfFDrJ","FNYIMBbwgA","faHirWPmlx","ydG8U580YD","tjQxsEdBKc",
+"gjUTucShY2","ydG8UAXpwE","bZLvSIRh48","AgJHQs93Ml","CK5W70MR5X","iKqhrtl72W","MK07YFFDui","ZUnqtbZLvS","GXdoHFnPFB","lkMUAHzZT8",
+"tl72WChuy3","Dz1R3iB08l","uLtKsNhXdu","AXpwEMGlTF","ZJTXHEOE1o","Kr8ysRmDcr","OUYuFWDVWJ","48cHLtl72W","UlU3M2ZHdk","Z4I1vd7vjM",
+"4QMc9K4GS8","SbRYyChuy3","WreyPAmdQd","IKxdL8U2nU","Cfgr3jzUqR","vOqCEguMb8","uQIczn8pJ9","VLTy6xReec","pvgjSYh1hF","kZANmjiVBP",
+"MezSWMmsIo","IKxdLfcJOy","cQOnveuZA5","hi5X7pWiOs","ksJbyKr8ys","uAWypulk41","AIYUuoGu6x","JIqXi0MR5X","5drc6W3VFH","pmeCdtAOsr",
+"yluBxTa8f6","FFDuilH1kt","48cHLuJScX","S2Dfux3LDe","5ZaEzCxVEf","h1zcHCqqaD","jfREufmIK1","s4786ZUnqt","wDajXAIYUu","Qworu2TRI7",
+"5VZjSzmLYD","618DituDyS","tAOsrpiJSk","RkQkePYBf4","RxrsmPOUYS","NhXdumz8gx","kZANmDG4sT","AmdQdlsQGo","QYxC0soy9t","9XyT9he9IA",
+"3otm6ZzJHW","aez9yRACuj","v2eC3iwzGk","lViBvNcICA","lXFOBazIWp","brhlQLewvM","SbRYycQOnv","ZzJHWtAOsr","soy9tuPX7G","0YAGHo8Uyd",
+"zFgtBSs0Zu","h1zcHECMvU","ru4UG5nmWv","AgJHQK4GS8","jtn0XzFgtB","AOgEeW7cTs","Ss0Zu2hEEU","IBe8kReKEW","SWfouEoToP","hSSvQlViBv",
+"euZA5K4GS8","1j5L8lweGy","Q6LixQworu","azIWpazIWp","uQIczVIlwP","okgRiCIShG","YOfrYYf2Ec","PYBf455rfB","nFqikGv3Fq","7lUXZpmeCd",
+"EdBKctvdkD","Mkgy8tlILt","VerEAiwzGk","gdQsSaDGtS","W7cTsbrhlQ","yEfy9wDajX","Dz1R3LbRTH","ksJbyNxx9V","DG4sTYf2Ec","5NammPYBf4",
+"64s8NYh1hF","fcwDaGrDg7","9y4lwni2v1","5nmWv2ZHdk","X6PinvLsmS","sqVrfKASQ8","9rlg97fsYM","DLhzMkB5nP","s7Mxkmz8gx","jtn0X5ZaEz",
+"GSQwjqUJMd","5iGN5NOHsz","yofH3jtn0X","xXTI4HfyNQ","qQxHPS2Dfu","pv0i7Q6Lix","iKqhr7ku1p","3otm6rhl0J","FPfSEZzJHW","Cfgr3ksJby",
+"brhlQ5nmWv","Q6LixCK5W7","lkMUAS2Dfu","BFkb8cQOnv","S2DfuYw2oU","OUqFMQ6hMC","5IhmGvLsmS","Ta8f65ZaEz","sx5GlQssNC","m4bxU7lUXZ",
+"NOHszZuDtD","lH1kt5Namm","kZANmS2Dfu","cShY2FjHXR","ZzJHWpiJSk","FPfSEl83Ud","LewvMlpF6W","ZhwG15nmWv","hi5X7VLTy6","s4786LDk6f",
+"dpe1vQClRL","yofH3JKWYR","iKqhrVLTy6","BGaQYCIShG","ciuWz5Namm","MojnPVerEA","pFrrlbZLvS","VerEA8hJdt","hi5X77ku1p","O3iyQY1mC0",
+"JkzUn48cHL","nFqikCdyBV","48cHLlsQGo","lH1ktzHF1q","FFDuiSjskQ","nnP8oiwzGk","1v5hHaFFss","55rfBvOqCE","Ss0ZuHRxd8","O3iyQ48cHL",
+"faHirfLNg8","Mkgy8FnPFB","8FmFHFVMxo","RxrsmcL0aE","fLNg8gf8rI","MezSWWaim6","okgRiTCgPp","YjB9t7hyVv","7lUXZS77LH","Rxrsmsx5Gl",
+"a00b5xReec","h1zcHoVQp6","QworuHlUbF","xXTI4ix74r","n8pJ9okgRi","h1zcHqUJMd","ciuWzd7vjM","wDajXVIlwP","J2mQigdQsS","SjskQiwzGk",
+"fcwDablLA9","ZUnqtaFFss","lCMxyzHF1q","AgJHQJkzUn","ZUnqtQClRL","gIYvEtvdkD","taOXKydG8U","RxrsmvkCHH","k85AejiVBP","WDVWJ6AFT0",
+"CIShGOUYuF","aFFsshi5X7","taOXKjzUqR","M3zXLHP433","WMiS3wiHrZ","xXTI47fKYU","QworuZUnqt","aL6AJFPfSE","yToGWRkQke","HzZT8oGu6x",
+"IBe8kMojnP","o8Uyd7hyVv","BGaQYvOqCE","vOqCERsQUq","HRxd8HfyNQ","soy9tRBhp0","ksJbysqVrf","wDajX7fsYM","J2mQiTXQ0Z","uvf7AMK07Y",
+"AXpwEyToGW","YjB9tyofH3","LbRTHCxVEf","cQOnvqUJMd","Yf2Ecsx5Gl","5drc66AFT0","XyPZN9XyT9","5Mg9rFGzgp","BFkb8K4GS8","blLA9FNYIM",
+"oVQp67X3uy","jSjS307n1c","HzZT8lm0pD","Cp3mZKZamH","SbRYyBbwgA","n1pmOfqypy","vLsmSni2v1","5drc6L7cGc","he9IA1LB1L","aez9y0Wr5y",
+"5Mg9r24ARF","FGzgp2hEEU","OxWIHRBhp0","aFFssStlDJ","FLsphyToGW","1LB1LAkKTk","uAWypRxrsm","azIWpLDk6f","DQimptl72W","LewvM8RCUA",
+"gIYvEYw2oU","X6PinNcICA","PYBf4iwzGk","jSjS38U2nU","JIqXipvgjS","XyPZNtl72W","UmaEvrKDLJ","uvf7A1LB1L","0YAGHAkKTk","k85AeQssNC",
+"FLsphYjB9t","hYBCKuZPqg","azIWpt98iW","wDajXgdQsS","Mkgy8dmoS7","gtCA5OHaBz","pmeCd45cIH","wDajXfaHir","TXQ0ZOUqFM","K4GS8ru4UG",
+"W3VFHfLNg8","oGu6x45cIH","hSSvQHlUbF","y94nwkZANm","0YAGHoGu6x","M6qcGMmsIo","uPX7GJRJQB","MGlTFlViBv","CNHmv0PktI","iKqhrEOE1o",
+"cQOnvfFDrJ","JXljWMezSW","iqv4kyvOMI","CIShG5IhmG","ru4UGNxx9V","lj07Q7Ow5C","HlUbFZv7z0","Z4I1vyToGW","hE1QlfcJOy","DG4sTgdQsS",
+"CK5W7S2Dfu","Waim6HRxd8","lH1ktTCgPp","Yf2EcgdQsS","5nmWvYOfrY","EdBKcWreyP","bZLvSd7vjM","1j5L88cVD3","lCMxyoVQp6","9XyT90PktI",
+"4dEz6zqH0W","Cp3mZ2DREs","TwanoW3VFH","9XyT907n1c","jzUqRe6e4z","nFqik5drc6","7lUXZEOE1o","2DREshE1Ql","RkQkegf8rI","t98iWAgJHQ",
+"pAhR1LewvM","dmoS7NcICA","9iGoTrz7Ut","gIYvEatef2","FLsphIjTwP","gf8rIk85Ae","K20wKd7vjM","b29RJRpBQm","wiHrZpWiOs","L7cGcM6qcG",
+"oGu6xyofH3","CxVEf48cHL","StlDJP6bcg","Cfgr3GWqqX","pmeCd7fKYU","PYBf4yluBx","RBhp0piJSk","AgJHQCxVEf","ydG8UuAWyp","0YAGHn1pmO",
+"VLTy6EOE1o","Gv3FqzFgtB","WDVWJqQxHP","atef2gtCA5","pT8wu9rlg9","dpe1vDQimp","mz8gxs93Ml","5Drn07ku1p","t98iWwiHrZ","5iGN5PYBf4",
+"29QAzgtCA5","L7cGcNhXdu","618DiDLhzM","Oz8yZWmadA","a00b5JJs5m","cmXIX9XyT9","L7cGcrKDLJ","Zv7z00YAGH","lm0pDn1pmO","EOE1omX2GE",
+"Oz8yZn8pJ9","t59lRlH1kt","mX2GEOUqFM","7hyVvVjCZq","7ku1pn8pJ9","I7p2aRsQUq","Gv3Fqsoy9t","FPfSEiKqhr","uJScXuJScX","9iGoT0Kyfs",
+"zbIYYL7cGc","2hEEUAmdQd","55rfB7lUXZ","jzUqRYjB9t","8xEKzogLgc","BCxeC5Namm","WaWsvZzJHW","GrDg7HzZT8","3weIFMmsIo","rz7Ut0h1b1",
+"Nxx9Vd85a9","8FmFHYOfrY","Ta8f6ix74r","FhtgllXFOB","0BmCypT8wu","HfyNQ7fsYM","pvgjSuupzk","9rlg9FPfSE","sqVrfCNHmv","fLNg8jSjS3",
+"W7cTsL7cGc","07n1cWreyP","yToGWaFFss","okgRiWMiS3","0MR5X45cIH","StlDJoVQp6","pT8wuP6bcg","oQ87rjzUqR","UlU3Mlm0pD","fcJOyyvOMI",
+"azIWp29QAz","0KyfsVIlwP","9y4lwlsQGo","uLtKsiwzGk","0ao3leuZA5","7ku1pKsjRK","QChxszqH0W","VBjhzi3pyd","9XyT9okgRi","RkQkeNAFuw",
+"HRxd8VBjhz","suY4xn1pmO","ciuWzC2Irc","RpBQm07n1c","WPmlxZJTXH","sqVrfCK5W7","jzUqRsqVrf","FnPFBfaHir","hYBCKqUJMd","MaJQs5ZaEz",
+"5nmWvJKWYR","x3LDeWmadA","TwanonlaBy","1j5L8i3pyd","FhtglpFrrl","jiVBPk85Ae","FFDuitaOXK","v2eC3lCMxy","FhtglcShY2","y94nwjzUqR",
+"SbRYySjskQ","AmdQdciuWz","QnJ1SfmIK1","lH1ktv1Hln","pv0i7618Di","i3pydYOfrY","uJScXv1Hln","QChxsaez9y","M6qcGJXljW","6AFT0ogLgc",
+"qaofN2TRI7","pAhR12ZHdk","kB5nP1j5L8","XyPZNbrhlQ","Dz1R39iGoT","tlILtoGu6x","fqypy9rlg9","iwzGkpmeCd","ogLgcpmeCd","KsjRKfcJOy",
+"zqH0WcmXIX","B3qemVIlwP","djsrvZ4I1v","xXTI4ydG8U","pmeCdKZamH","ix74ruLtKs","uvf7AFVMxo","16lHc5drc6","aFFssWPmlx","euZA5G1RhS",
+"2ZHdk8xEKz","iB08l1j5L8","yToGWQssNC","FNYIMB3qem","ksJbyAIYUu","Q6LixZhwG1","djsrvNo0Qb","Mm8siAOgEe","aL6AJtvdkD","lXFOBtaOXK",
+"qQxHP0MR5X","FnPFBWaWsv","NcICAksJby","D6rByWMiS3","Ta8f6uZPqg","MK07Y07n1c","1v5hHb29RJ","dQ586n8pJ9","M3zXLHRxd8","UlU3MQ6hMC",
+"nlaByPYBf4","YOfrYBbwgA","FNYIMkZANm","14FLR580YD","faHir2DREs","AIYUuC2Irc","0PktIiB08l","VIlwPuupzk","ThjNnWMiS3","oGu6xS2Dfu",
+"lXFOBCxVEf","qQxHPt98iW","580YDlCMxy","uAWypl83Ud","P6bcg8hJdt","FGzgp7fsYM","B3qemMGlTF","POUYS0MR5X","P6bcg07n1c","WreyPFNYIM",
+"hYBCKVerEA","iqv4kxXTI4","M6qcGoVQp6","uZPqgY1mC0","pv0i7C2Irc","618DiAkKTk","rz7Ut29QAz","Y1mC0dhSuH","4W0TllweGy","nFqikI7p2a",
+"F6PT20Kyfs","618DiuZPqg","0KyfsPb1pa","azIWptl72W","Qworu8FmFH","n8pJ9G1RhS","lXFOB5drc6","Q6hMCFjHXR","NhXduAOgEe","d85a9rz7Ut",
+"azIWpVBjhz","0ao3l0BmCy","Yf2EcfaHir","ReKEWlweGy","HfyNQVjCZq","Ta8f65nmWv","Chuy3vOqCE","ksJbyoGu6x","DG4sTzqH0W","MmsIolH1kt",
+"KASQ86q6L9","XyPZN5IhmG","faHirHfyNQ","FVMxofcJOy","NAFuwdQ586","GrDg7Mkgy8","yvOMIEoToP","nFqikgdQsS","5ZaEzv2eC3","BbwgAK4GS8",
+"ECMvUy94nw","BFkb8jiVBP","Nxx9VOUYuF","v8yFNSbRYy","VBjhzSjskQ","5IhmG618Di","5iGN5QssNC","jSjS3lXFOB","pvgjSKZamH","BGaQYsuY4x",
+"1v5hHTa8f6","StlDJhi5X7","I7p2a7fKYU","NOHszMmsIo","n8pJ9ReKEW","CNHmv3otm6","D6rByAmdQd","vOqCEZUnqt","GSQwjUlU3M","4dEz6yvOMI",
+"CqqaDgjUTu","CdyBVYjB9t","iwzGkjS1aj","ru4UG8FmFH","k85AeRBhp0","1LB1LMezSW","Mkgy8CIShG","8hJdtFhtgl","euZA5B3qem","a00b516lHc",
+"HzZT8FPfSE","MojnPMK07Y","xciqpM3zXL","KASQ8KASQ8","aL6AJb29RJ","8cVD3x3LDe","e6e4zOxWIH","8FmFHCfgr3","zz4ZUfLNg8","0Wr5yReKEW",
+"IBe8kBbwgA","4W0TlhE1Ql","zz4ZUB3qem","55rfBNAFuw","hYBCK0h1b1","Ta8f6JXljW","SmGzvL7cGc","FVMxo0PktI","No0QbazIWp","9eoRcNxx9V",
+"AgJHQKZamH","VerEAhSSvQ","QssNCd85a9","okgRi5IhmG","MK07Y1v5hH","U3yw5i7WMQ","RpBQmhSSvQ","Yw2oUsuY4x","6AFT0AmdQd","GXdoH3weIF",
+"sx5GlbrhlQ","FLsphFGzgp","9y4lwfcwDa","MaJQswiHrZ","K20wKuJScX","yvOMIK20wK","L7cGclsQGo","yofH3AkKTk","pWiOsDz1R3","7fsYMulk41",
+"K4GS8aez9y","ZJTXHxReec","5ZaEzMGlTF","DcpWByToGW","RmDcrJJs5m","YOfrYS77LH","Ul4a1bgJAz","DG4sT9y4lw","hSSvQfmIK1","Dz1R3piJSk",
+"uoStw55rfB","6q6L9MezSW","CK5W7FVMxo","l83Udlj07Q","NAFuwKASQ8","W3VFHAXpwE","MmKGJGWqqX","rhl0JRBhp0","QClRLYw2oU","oVQp6cL0aE",
+"K4GS8FwEJz","5NammyvOMI","zz4ZUv8yFN","uLtKsMkgy8","AgJHQMezSW","BCxeCKr8ys","zqH0WuJScX","DQimpGrDg7","MmKGJoGu6x","bZLvSBGaQY",
+"OHaBzogLgc","5VZjS7fKYU","cmXIXGXdoH","RpBQmSs0Zu","NOHszRsQUq","0ao3le6e4z","J2mQi5Namm","EdBKcSjskQ","uoStwdQ586","LbRTHyvOMI",
+"v1HlnWMiS3","FNYIMtvdkD","48cHLv1Hln","0KyfsqQxHP","xReecUvlv4","wiHrZx3LDe","HzZT8cQOnv","JJs5m2hEEU","uJScXnFqik","5nmWvXyPZN",
+"okgRi0Kyfs","l83UdFNYIM","Zv7z0GWqqX","fmIK1pAhR1","JRJQBDQimp","fcwDadjsrv","nFqiks7Mxk","55rfBMkgy8","BbwgAYw2oU","xReecksJby",
+"pT8wurKDLJ","zQt6QF6PT2","OxWIHKASQ8","WmadA2Yz7E","5drc6618Di","d7vjMwDajX","n8pJ9iwzGk","OHaBzpWiOs","FVMxoCIShG","WPmlx8hJdt",
+"hUTw7J2mQi","dpe1vOUYuF","VjCZqjfREu","FnPFBLDk6f","CqqaDciuWz","ZuDtDWDVWJ","EoToPzbIYY","S2DfuQYxC0","t98iWMmKGJ","ZzJHW7X3uy",
+"he9IA55rfB","xciqpWreyP","8FmFHwDajX","YjB9tW7cTs","55rfB5IhmG","blLA9ZJTXH","Mkgy8OUqFM","8U2nU0MR5X","BGaQY8xEKz","LbRTHDQimp",
+"HlUbFpWiOs","POUYSQ6Lix","zFgtBlm0pD","cShY25nmWv","SWfouThjNn","DG4sTUl4a1","ZJTXHa00b5","14FLRUvlv4","h1zcHCK5W7","FPfSEwiHrZ",
+"GWqqXdQ586","9y4lwgIYvE","ix74rzmLYD","uZPqg7ku1p","i3pydpmeCd","M3zXL2Yz7E","JKWYReuZA5","xReecIBe8k","QnJ1SBbwgA","gdQsSzbIYY",
+"8TxD7cL0aE","0YAGHQworu","uLtKsWaWsv","DQimpjzUqR","JRJQBbrhlQ","Uvlv4kB5nP","SWfouWmadA","JJs5m0BmCy","ThjNnaez9y","d85a9AmdQd",
+"pvgjS5iGN5","Chuy3nnP8o","ECMvUBbwgA","RsQUqYh1hF","l83Ud5Drn0","Vprf2POUYS","pv0i7jfREu","1v5hHReKEW","lCMxyReKEW","aDGtSwiHrZ",
+"Chuy3AOgEe","WreyPlj07Q","Gv3FqQbxXc","zY1GYjzUqR","pWiOsaDGtS","Oz8yZ5VZjS","Nxx9VxReec","ulk41cShY2","Cp3mZZUnqt","XflUqIBe8k",
+"5drc6gjUTu","J2mQiYOfrY","Nxx9Vo8Uyd","F6PT27ku1p","wiHrZ7fKYU","aL6AJcmXIX","M3zXLyToGW","QnJ1Stl72W","Ta8f6KZamH","8FmFHIBe8k",
+"Zv7z09XyT9","iB08lYjB9t","k85AePb1pa","HlUbF5drc6","16lHcdjsrv","guMb8DG4sT","guMb81LB1L","JJs5mulk41","8TxD7ZhwG1","m4bxU0MR5X",
+"Yw2oUDQimp","rz7Ut5Namm","Ta8f6cQOnv","D6rBylXFOB","5ZaEzFNYIM","Q6LixFNYIM","5NammzmLYD","VjCZqZUnqt","v1HlnDz1R3","prNT6DcpWB",
+"WDVWJIBe8k","POUYSIn3NS","n1pmONo0Qb","7fsYMK20wK","zY1GY0PktI","nnP8o5Drn0","ix74r1v5hH","JkzUnQYxC0","nlaByQbxXc","S2DfufmIK1",
+"aFFssAIYUu","Zv7z0JIqXi","SmGzvF6PT2","iKqhruJScX","HfyNQGWqqX","2ZHdkfmIK1","5IhmG14FLR","k85AegdQsS","sqVrfNOHsz","ZuDtDVBjhz",
+"o8Uydh1zcH","K20wKM3zXL","U3yw5JRJQB","uoStwDG4sT","AIYUuMojnP","dmoS7FFDui","yvOMI9eoRc","AkKTkfFDrJ","GXdoHEoToP","DcpWBIBe8k",
+"HRxd8pWiOs","XyPZNulk41","iwzGk7Ow5C","4W0TlTa8f6","y94nwRmDcr","Uvlv4fmIK1","FNYIMS2Dfu","n1pmORBhp0","uZPqgKsjRK","s93MluPX7G",
+"CNHmvHlUbF","ogLgcv8yFN","n1pmOReKEW","QChxsix74r","BbwgAgIYvE","W3VFHxReec","Oz8yZUvlv4","UmaEvpFrrl","fmIK1aDGtS","euZA5rz7Ut",
+"JJs5muTacx","hE1Qlfqypy","XyPZNazIWp","0ao3latef2","wiHrZCIShG","pmeCdtuDyS","StlDJNo0Qb","aFFssQssNC","5ZaEzOUqFM","uQIczcmXIX",
+"soy9tQWxoT","zHF1qVLTy6","7hyVvEOE1o","tl72WcShY2","kZANmnFqik","gjUTuJJs5m","ix74rnlaBy","lpF6WFGzgp","s93MlQbxXc","NhXduIRh48",
+"Pb1pa45cIH","9rlg9fcJOy","P6bcguZPqg","QChxs0h1b1","9y4lwMmKGJ","HP433AkKTk","iqv4kru4UG","ix74rgf8rI","WDVWJRsQUq","d7vjMfqypy",
+"t59lRtjQxs","WDVWJ45cIH","CqqaDpv0i7","Uvlv44QMc9","FcWrWYOfrY","okgRiAXpwE","nnP8otvdkD","azIWpQWxoT","HP433FLsph","wiHrZEdBKc",
+"faHiri3pyd","P6bcgfLNg8","nlaByQClRL","O3iyQgf8rI","zHF1q1j5L8","IjTwPmz8gx","7ku1pbrhlQ","RsQUqlCMxy","uupzkkZANm","fcJOyguMb8",
+"i3pydQssNC","d7vjMb29RJ","lXFOBhE1Ql","bgJAzMK07Y","Oz8yZtuDyS","IKxdLChuy3","WmadAhe9IA","ru4UGQYxC0","7hyVvtaOXK","yEfy9djsrv",
+"Q6hMCRxrsm","K4GS80Kyfs","n8pJ9m4bxU","y94nwFxX9q","ru4UGFwEJz","a00b51LB1L","iKqhrMkgy8","pT8wusx5Gl","S77LHEOE1o","JRJQBAgJHQ",
+"prNT6VBjhz","WaWsvlXFOB","faHirIjTwP","jtn0Xv2eC3","ZJTXHhE1Ql","Ul4a1Yw2oU","2ZHdkWMiS3","2Yz7E24ARF","soy9tazIWp","8xEKzUlU3M",
+"W3VFHcShY2","gjUTuFVMxo","SmGzvFnPFB","C2IrcMK07Y","Oz8yZHzZT8","NOHszgtCA5","guMb8CNHmv","lViBvdhSuH","zmLYDPOUYS","lm0pDiqv4k",
+"Uvlv4VIlwP","7ku1pF6PT2","jeskSpiJSk","5Drn0cShY2","yluBxrz7Ut","M3zXLVerEA","CK5W7M3zXL","nFqikBFkb8","MGlTF0ao3l","FwEJzxXTI4",
+"Uvlv4taOXK","Yh1hFMojnP","vLsmS7ku1p","cQOnvTCgPp","ulk41t98iW","ru4UGVprf2","s93MlVerEA","uJScXuPX7G","AOgEeVjCZq","fcwDapmeCd",
+"DQimpVLTy6","9XyT9J2mQi","gIYvEuAWyp","azIWplH1kt","CNHmvFVMxo","SWfouh1zcH","jS1ajM6qcG","Ul4a12Nslm","cQOnvEoToP","Gv3FqFwEJz",
+"KZamHfmIK1","he9IAuLtKs","EdBKc5iGN5","pWiOs16lHc","Yf2EcqQxHP","blLA9lViBv","d7vjMNxx9V","d85a9RzaZA","iKqhrPb1pa","m4bxURxrsm",
+"MK07YJkzUn","suY4xlkMUA","AXpwE0YAGH","Yh1hFTa8f6","taOXKvkCHH","QssNCRpBQm","hSSvQ5VZjS","2TRI7CqqaD","soy9tStlDJ","Gv3Fq9y4lw",
+"OxWIH5iGN5","G1RhSaDGtS","dhSuH7fsYM","Kr8ys5VZjS","ZhwG1Vprf2","DG4sTRzaZA","SbRYy5Namm","FNYIMLDk6f","1v5hHix74r","dQ5860ao3l",
+"ThjNnpmeCd","b29RJAOgEe","zqH0W5iGN5","VerEAoQ87r","7ku1pM6qcG","uZPqgsoy9t","DQimpI7p2a","s4786AXpwE","Ss0ZuS2Dfu","v8yFNVjCZq",
+"Waim6djsrv","RBhp0Vprf2","iB08lcShY2","iqv4k9rlg9","FNYIMjSjS3","9rlg96q6L9","MK07YLewvM","jzUqRvOqCE","ksJbyvOqCE","Q6LixxReec",
+"t98iW5ZaEz","POUYSVNCPd","tlILtyluBx","prNT6RpBQm","pv0i7Twano","oGu6xCIShG","OHaBzx3LDe","y94nwKZamH","FjHXRJXljW","YjB9tWaWsv",
+"JRJQBEdBKc","Rxrsma00b5","gjUTu64s8N","2DREs8RCUA","xciqpJIqXi","24ARFAIYUu","Waim6S2Dfu","guMb8ThjNn","iB08lZJTXH","aL6AJMmsIo",
+"OHaBzQ6hMC","e6e4zs7Mxk","vOqCEBCxeC","QChxs5IhmG","8RCUAqUJMd","lj07QtAOsr","dQ586hE1Ql","8hJdtyEfy9","lViBvvLsmS","euZA5b29RJ",
+"lViBvaFFss","Uvlv4v8yFN","h1zcHjeskS","WMiS3tl72W","7lUXZKsjRK","HlUbFokgRi","MmKGJhUTw7","ulk41b29RJ","2NslmQChxs","DcpWBSmGzv",
+"Kr8ys5drc6","vkCHHi7WMQ","uAWype6e4z","ogLgcECMvU","gf8rIrKDLJ","FcWrWmX2GE","euZA5Yw2oU","qQxHPpiJSk","55rfBmX2GE","WPmlxlweGy",
+"Zv7z0Pb1pa","7ku1pRpBQm","8cVD3DLhzM","s7MxkFcWrW","blLA9Mm8si","bgJAzfFDrJ","pvgjSQ6hMC","QWxoTCp3mZ","XflUqTwano","pT8wu24ARF",
+"HlUbFx3LDe","EOE1olViBv","NhXduWMiS3","iwzGkt98iW","YjB9tuupzk","vOqCEHfyNQ","IRh48ZzJHW","XflUqjzUqR","oVQp62Yz7E","KZamHOUqFM",
+"9y4lw0Kyfs","SWfouXflUq","GWqqXFLsph","9iGoTXflUq","ni2v15Drn0","aDGtSQChxs","n8pJ9zFgtB","XyPZNMezSW","zmLYDhUTw7","CxVEfpWiOs",
+"3weIFnFqik","8U2nUXflUq","uvf7A2DREs","aDGtSWMiS3","uLtKszQt6Q","JXljWDcpWB","WDVWJ8cVD3","M6qcGCp3mZ","nlaByDLhzM","piJSkRmDcr",
+"lsQGo7hyVv","SbRYyoVQp6","RBhp0D6rBy","MGlTFvkCHH","yToGWVjCZq","2hEEUogLgc","VerEA8U2nU","O3iyQRmDcr","d85a9HfyNQ","K20wKUmaEv",
+"pAhR1fLNg8","FjHXRL7cGc","ksJbyi3pyd","Ul4a1Cp3mZ","JXljWogLgc","faHirMK07Y","fmIK1rKDLJ","64s8NAgJHQ","CK5W7RzaZA","G1RhStAOsr",
+"5IhmGQChxs","BFkb8zQt6Q","O3iyQi3pyd","guMb85drc6","NcICABpYhV","M6qcGd85a9","MezSWjtn0X","QWxoT4dEz6","FNYIMwiHrZ","gjUTufLNg8",
+"oGu6xYOfrY","MezSWhSSvQ","dmoS7TCgPp","K20wKrz7Ut","0YAGHVLTy6","K4GS8EoToP","FGzgp8TxD7","AgJHQQnJ1S","5nmWvokgRi","jtn0Xix74r",
+"7ku1ptAOsr","8hJdtUmaEv","FNYIMGXdoH","okgRix3LDe","Vprf2VIlwP","l83Ud45cIH","StlDJZv7z0","s4786lweGy","9eoRcJIqXi","5iGN5CNHmv",
+"Yh1hFFxX9q","GSQwjZUnqt","5nmWvDQimp","v2eC3tAOsr","IRh48piJSk","B3qemMkgy8","5iGN59rlg9","t98iWuN6r3","9XyT9zY1GY","TwanoksJby",
+"faHir2ZHdk","aL6AJydG8U","tl72WPOUYS","StlDJzmLYD","6q6L9RACuj","S2Dfu48cHL","gtCA5ZUnqt","2DREsMGlTF","ru4UGJkzUn","mX2GEDQimp",
+"nlaBySWfou","0YAGHuPX7G","KASQ829QAz","Chuy3NcICA","3otm6ciuWz","l83UdM3zXL","e6e4zQClRL","cmXIXLDk6f","KASQ8dQ586","Vprf2vkCHH",
+"ZUnqt5Mg9r","WMiS3nFqik","9iGoTsx5Gl","ReKEW48cHL","IjTwPjzUqR","jiVBPmX2GE","F6PT2JRJQB","prNT6xXTI4","QbxXca00b5","Cp3mZBpYhV",
+"BbwgAQworu","3otm6MK07Y","mX2GEyToGW","lCMxy9y4lw","Nxx9VQClRL","5Drn0djsrv","Gv3FqzHF1q","FFDuiazIWp","KASQ8CqqaD","suY4xQbxXc",
+"lkMUAMaJQs","oQ87rNxx9V","BbwgA9XyT9","AkKTkuupzk","jSjS3BbwgA","QworuX6Pin","FwEJzW3VFH","CNHmvlj07Q","Z4I1vtjQxs","W3VFHgf8rI",
+"BCxeCuN6r3","ulk41580YD","KASQ89rlg9","xXTI4pAhR1","tvdkDpmeCd","jiVBPlCMxy","uLtKsAkKTk","S2DfuVIlwP","5VZjSFcWrW","soy9t9y4lw",
+"LDk6fMmKGJ","sx5GlTCgPp","Mm8siSmGzv","8xEKzJXljW","CdyBVPYBf4","9eoRcRBhp0","NOHszJkzUn","vOqCEFwEJz","vLsmSnFqik","qQxHPMojnP",
+"pWiOsECMvU","IjTwPaez9y","8TxD7CNHmv","B3qems7Mxk","OxWIHMK07Y","piJSkWaim6","s4786Mkgy8","oVQp6ZJTXH","jS1ajEOE1o","hE1Qlru4UG",
+"xXTI44dEz6","Gv3FqQClRL","v2eC3s7Mxk","QYxC0okgRi","h1zcHBbwgA","i3pydS2Dfu","zQt6QRmDcr","3otm61v5hH","GrDg7AIYUu","o8Uyd7ku1p",
+"aL6AJK20wK","QYxC0WMiS3","zFgtBbrhlQ","IRh48tlILt","tvdkDFLsph","Dz1R3faHir","KZamHUlU3M","M6qcGrhl0J","9eoRcbZLvS","UmaEvmz8gx",
+"uAWyp5ZaEz","9iGoTJXljW","OUYuFlsQGo","cQOnvjS1aj","48cHLDQimp","aL6AJqQxHP","DLhzMtjQxs","GSQwjtvdkD","Zv7z0M6qcG","EdBKcrhl0J",
+"5IhmGhSSvQ","jiVBPFjHXR","Zv7z0Zv7z0","lCMxyM3zXL","azIWpuTacx","rhl0JK4GS8","AgJHQy94nw","Yw2oUMK07Y","HzZT8SjskQ","bZLvS8RCUA",
+"ydG8U8cVD3","FjHXRrKDLJ","fcwDavLsmS","MaJQsJRJQB","7ku1pGXdoH","dQ586ZzJHW","8FmFHQClRL","07n1cn8pJ9","e6e4zBpYhV","Ul4a1fFDrJ",
+"Yf2Ec9y4lw","HRxd8vLsmS","jS1aj9GXkX","lweGyQbxXc","RBhp0dQ586","8U2nUJXljW","lweGyY1mC0","x3LDeguMb8","jfREuuTacx","fLNg8Waim6",
+"YjB9tZUnqt","FFDui8xEKz","zmLYDblLA9","zz4ZUqaofN","djsrvSWfou","8FmFHn8pJ9","pWiOso8Uyd","lkMUAF6PT2","HlUbFfqypy","Chuy3zHF1q",
+"QnJ1SU3yw5","faHirOUqFM","oGu6xh1zcH","2hEEUAgJHQ","gf8rIG1RhS","OHaBzRxrsm","3weIFuJScX","ksJbyeuZA5","ciuWz4dEz6","fLNg8v8yFN",
+"8TxD7RpBQm","24ARF8TxD7","6AFT0fLNg8","xXTI4lXFOB","Yh1hF5ZaEz","FPfSEO3iyQ","LewvMBGaQY","xReecAIYUu","i3pydhYBCK","MmKGJNcICA",
+"POUYShE1Ql","07n1c55rfB","M3zXLTCgPp","4dEz6nFqik","uPX7GnlaBy","RxrsmpiJSk","RpBQmt59lR","XflUqazIWp","qQxHPciuWz","TXQ0Zs93Ml",
+"IRh48Nxx9V","No0QbyofH3","ThjNnhi5X7","1LB1LlpF6W","kB5nPd85a9","fFDrJt59lR","qQxHPlViBv","8U2nU1v5hH","bgJAzoGu6x","0BmCy7fsYM",
+"L7cGcQbxXc","ReKEW8FmFH","M6qcGYw2oU","8RCUAGXdoH","5Drn03weIF","5nmWvzz4ZU","Uvlv4kZANm","No0QbHRxd8","WPmlxIRh48","4dEz6CqqaD",
+"MojnPsqVrf","Chuy3JIqXi","Cfgr3YjB9t","l83UdNcICA","07n1ct98iW","bZLvSHlUbF","1LB1LsuY4x","5drc6aL6AJ","FPfSEgIYvE","Mkgy8pv0i7",
+"5ZaEzzHF1q","Ul4a1brhlQ","Mm8siStlDJ","FGzgpHfyNQ","zbIYYjSjS3","v1HlnQYxC0","h1zcHQssNC","IKxdL9y4lw","S2Dfu3otm6","WMiS3EdBKc",
+"v8yFNWaim6","FPfSEVjCZq","QClRLNhXdu","HzZT8gtCA5","XyPZNqQxHP","lm0pDuAWyp","pWiOsfaHir","hUTw7CdyBV","RpBQmJkzUn","uZPqgAXpwE",
+"DQimp9y4lw","k85AecShY2","uvf7A9iGoT","aL6AJqUJMd","MmsIoW3VFH","uvf7AJRJQB","uTacxStlDJ","45cIHgIYvE","Yh1hF0PktI","QWxoTZzJHW",
+"tAOsrtjQxs","SWfou4dEz6","ni2v1hSSvQ","atef22TRI7","3weIF8cVD3","4QMc9zz4ZU","t59lRQbxXc","rKDLJ5ZaEz","bgJAzzqH0W","ulk41s7Mxk",
+"xReecaFFss","WMiS38cVD3","0ao3l1v5hH","HRxd8vkCHH","tuDySX6Pin","s4786gf8rI","ReKEWCp3mZ","POUYSRxrsm","cQOnvSbRYy","Chuy3a00b5",
+"Yf2Ec5Drn0","d85a9l83Ud","8TxD7gf8rI","xciqpPb1pa","RBhp0JJs5m","yluBxaez9y","iqv4k7X3uy","i7WMQru4UG","1LB1LBCxeC","QWxoTt59lR",
+"ZhwG1ZJTXH","LewvMQYxC0","GXdoHtaOXK","OUYuFFVMxo","MaJQszbIYY","NOHsz4W0Tl","prNT6EdBKc","jtn0XkB5nP","5Namm8U2nU","lsQGoCdyBV",
+"NhXdu2Nslm","Z4I1vJIqXi","zqH0WdQ586","5Mg9rKsjRK","Yw2oUJKWYR","uQIczh1zcH","G1RhSwDajX","tlILt4W0Tl","2DREspmeCd","soy9tOxWIH",
+"CxVEf55rfB","8RCUAyvOMI","7lUXZFnPFB","yofH3CK5W7","1LB1LiB08l","14FLRUlU3M","gtCA53weIF","29QAzCIShG","CNHmvK20wK","29QAzzmLYD",
+"5VZjSatef2","6AFT0uN6r3","RsQUqoGu6x","55rfB0YAGH","AOgEeCIShG","oGu6xt59lR","In3NSW3VFH","55rfBVBjhz","VjCZqOUYuF","OUqFMCK5W7",
+"VerEAHlUbF","JJs5mWPmlx","AXpwE2Nslm","HP433lweGy","pT8wuQChxs","tAOsr580YD","Yh1hFm4bxU","zY1GYL7cGc","sqVrfQClRL","FjHXRiB08l",
+"AIYUuyvOMI","24ARFZv7z0","RBhp08FmFH","IRh48FVMxo","uoStwZv7z0","FxX9qRBhp0","BbwgACdyBV","QworuguMb8","guMb8v1Hln","kZANm7fsYM",
+"pvgjSY1mC0","bZLvSEdBKc","l83Udhi5X7","VjCZq8TxD7","s4786n1pmO","CdyBVCfgr3","KASQ8AOgEe","vLsmSh1zcH","O3iyQxciqp","RxrsmJKWYR",
+"LewvMyvOMI","fcwDaD6rBy","ydG8U7hyVv","v8yFN9iGoT","SWfouMm8si","gdQsSjSjS3","8RCUAtl72W","d7vjMHP433","AmdQda00b5","AIYUuD6rBy",
+"azIWpSWfou","tAOsrOUqFM","RsQUqHRxd8","d85a90Wr5y","MGlTFhSSvQ","DG4sTFPfSE","64s8NogLgc","VjCZqhUTw7","55rfBPOUYS","DQimp0PktI",
+"BpYhVStlDJ","8xEKzZzJHW","bZLvS7lUXZ","JIqXi0BmCy","zmLYDGSQwj","e6e4zksJby","SmGzvFjHXR","AmdQdWaim6","fcJOyEdBKc","7lUXZQChxs",
+"o8Uyd1LB1L","8cVD3CIShG","suY4xcShY2","QChxsGv3Fq","48cHLsoy9t","ZJTXHFGzgp","jiVBP8U2nU","MaJQs5Namm","pFrrl2hEEU","ulk41QChxs",
+"tl72WLDk6f","O3iyQlpF6W","yToGWn1pmO","AIYUuv1Hln","lH1ktNo0Qb","nFqik580YD","Vprf2xXTI4","RmDcrpAhR1","vkCHH8FmFH","zQt6QGWqqX",
+"i7WMQJKWYR","7Ow5CguMb8","gtCA5lsQGo","BbwgAYh1hF","sx5Glv1Hln","0KyfsyofH3","euZA5mz8gx","Mm8si7Ow5C","xciqpIn3NS","faHirgIYvE",
+"ZhwG1wiHrZ","MaJQsru4UG","jiVBPS77LH","jeskSokgRi","tuDySa00b5","oVQp6y94nw","FPfSEVprf2","Oz8yZSWfou","GXdoHuZPqg","vkCHHyEfy9",
+"QnJ1SPYBf4","HP433AIYUu","aez9y9y4lw","PYBf4nnP8o","uAWypQnJ1S","AIYUuxciqp","XflUqFFDui","cQOnvKr8ys","S2DfufFDrJ","uN6r3ReKEW",
+"HP433WmadA","9rlg9Oz8yZ","KASQ8zmLYD","S2DfuzHF1q","6q6L9VIlwP","Dz1R3iwzGk","Mkgy8QWxoT","VIlwPQYxC0","LewvMtlILt","djsrvQYxC0",
+"SmGzvRBhp0","UmaEvDQimp","KsjRKSjskQ","zz4ZUzHF1q","prNT6WmadA","gtCA5iqv4k","RpBQmMGlTF","hUTw7Chuy3","ni2v1wDajX","a00b5Waim6",
+"lj07QyEfy9","Rxrsm7Ow5C","0ao3lQ6Lix","VerEAuJScX","uoStwQ6Lix","FVMxo29QAz","O3iyQtl72W","d7vjMFcWrW","yvOMISWfou","OUYuFFGzgp",
+"pvgjSoQ87r","lweGyzmLYD","JkzUnrz7Ut","taOXKzmLYD","JkzUnfcJOy","QClRLulk41","pFrrlAmdQd","zqH0WOUqFM","0MR5Xrz7Ut","U3yw5J2mQi",
+"Q6hMCYh1hF","FcWrWpAhR1","ru4UG2ZHdk","P6bcgjzUqR","cmXIXatef2","VLTy6zmLYD","KZamHtuDyS","jiVBPkB5nP","NcICAKASQ8","OUqFMGXdoH",
+"0PktI3otm6","QClRLdQ586","zQt6QVerEA","MK07YtvdkD","RBhp0NhXdu","dhSuHFnPFB","IKxdLo8Uyd","24ARFeuZA5","9XyT9t98iW","brhlQVprf2",
+"I7p2aaDGtS","RACujKASQ8","taOXK5ZaEz","Chuy3nlaBy","ZUnqtyvOMI","lXFOBW7cTs","8xEKzbZLvS","LbRTHCNHmv","kZANmZ4I1v","DcpWBzY1GY",
+"M6qcGUmaEv","F6PT2VLTy6","TXQ0ZIRh48","guMb87X3uy","i7WMQuJScX","mz8gxe6e4z","fFDrJjSjS3","AIYUuJXljW","lsQGolkMUA","MmKGJ5iGN5",
+"HRxd8ciuWz","zQt6Q55rfB","EdBKcpT8wu","K20wKcQOnv","ReKEWJKWYR","AmdQdOHaBz","Q6LixFhtgl","mX2GE7Ow5C","VerEAMkgy8","yluBxzbIYY",
+"x3LDeNAFuw","MojnP3weIF","M6qcGuQIcz","yofH3atef2","AOgEeNxx9V","1v5hHzY1GY","48cHLSs0Zu","3weIFFLsph","L7cGc3weIF","o8UydzqH0W",
+"OHaBzuQIcz","24ARFlm0pD","nnP8ohYBCK","ogLgc5drc6","0ao3lIKxdL","FcWrWVerEA","ZuDtDlpF6W","tlILtChuy3","suY4xuupzk","ulk41IjTwP",
+"uupzkjtn0X","k85AejzUqR","No0Qblm0pD","hSSvQx3LDe","lpF6WI7p2a","nlaByThjNn","dQ5869eoRc","wDajXk85Ae","zQt6Q5IhmG","ZuDtDm4bxU",
+"580YDQworu","uN6r3UlU3M","8RCUAOz8yZ","tjQxslpF6W","ZuDtDqUJMd","AgJHQNOHsz","aez9yuN6r3","48cHLrKDLJ","d85a9DG4sT","14FLRlm0pD",
+"o8Uyd5Drn0","AOgEehe9IA","2TRI7pT8wu","dmoS7C2Irc","fFDrJtaOXK","BGaQYlViBv","TwanoQnJ1S","ZhwG1kB5nP","lm0pDQworu","ni2v1QssNC",
+"zHF1qJRJQB","hi5X7tjQxs","29QAzMGlTF","SbRYyfcJOy","RzaZAlj07Q","2ZHdko8Uyd","580YDogLgc","OUqFM5Drn0","J2mQib29RJ","NOHszRkQke",
+"fLNg8uLtKs","pAhR1W3VFH","Q6LixhUTw7","RBhp0BGaQY","Waim6pmeCd","vLsmS8cVD3","a00b5NOHsz","uupzkJ2mQi","9rlg92ZHdk","xXTI4KASQ8",
+"bZLvS5VZjS","64s8N48cHL","2NslmWmadA","AIYUuQYxC0","IBe8kqQxHP","W7cTs1LB1L","zFgtBa00b5","LewvM16lHc","nlaByOUqFM","BGaQYgdQsS",
+"WmadAJKWYR","FnPFBEOE1o","AXpwErhl0J","BFkb8ECMvU","iB08lv8yFN","6AFT0RsQUq","cL0aE16lHc","FxX9q8hJdt","DG4sT2Nslm","hSSvQJJs5m",
+"FxX9q2Nslm","HlUbFMkgy8","dpe1vxciqp","2ZHdkAOgEe","lViBvPOUYS","5nmWvdmoS7","jSjS3J2mQi","4dEz6RzaZA","YjB9tFxX9q","9GXkXZUnqt",
+"HlUbFZhwG1","k85AeYOfrY","SmGzvuPX7G","S2DfuFxX9q","FnPFB4W0Tl","6q6L9WMiS3","7fKYUMK07Y","ydG8U2hEEU","zz4ZUIn3NS","KsjRKzz4ZU",
+"FNYIMlViBv","JRJQBaL6AJ","ZuDtDuoStw","gf8rIlsQGo","NcICAydG8U","AkKTk1v5hH","KsjRKzQt6Q","GXdoHjS1aj","6q6L9rKDLJ","oQ87rZJTXH",
+"1j5L8HRxd8","2ZHdkWDVWJ","ThjNnQbxXc","YjB9tFhtgl","AkKTkyEfy9","MojnPi3pyd","uvf7AFwEJz","NOHszFwEJz","16lHczHF1q","CxVEfSWfou",
+"m4bxUCNHmv","2DREsa00b5","uPX7G45cIH","M6qcGn8pJ9","uvf7AtjQxs","TwanoFhtgl","FjHXRYOfrY","s7MxkyToGW","NhXduPYBf4","Mkgy8ThjNn",
+"64s8NZJTXH","AIYUuFwEJz","618Di7fsYM","jzUqRCqqaD","EdBKct59lR","v2eC3bgJAz","kZANmokgRi","l83UdgIYvE","WPmlxuvf7A","9y4lwzQt6Q",
+"WDVWJn1pmO","lViBvxReec","FxX9qzmLYD","yluBx16lHc","taOXKtaOXK","IBe8kTXQ0Z","fFDrJ8xEKz","FFDui0YAGH","yToGWhi5X7","O3iyQUmaEv",
+"ThjNnatef2","9y4lwlkMUA","4W0TlfcJOy","m4bxU0BmCy","No0Qb48cHL","kZANmFcWrW","GrDg7580YD","t98iWRzaZA","BbwgAS77LH","DQimpni2v1",
+"BbwgA7X3uy","Cp3mZkB5nP","7Ow5CW3VFH","FPfSERACuj","64s8NRACuj","okgRinlaBy","FFDuijS1aj","MojnPb29RJ","U3yw5XyPZN","ThjNnU3yw5",
+"GXdoHX6Pin","Nxx9VpAhR1","7ku1pM3zXL","07n1cMmKGJ","x3LDekB5nP","lweGy5drc6","aez9y5drc6","CNHmvl83Ud","DQimpMGlTF","24ARFP6bcg",
+"QClRLyluBx","HRxd8a00b5","qQxHPZuDtD","TXQ0ZZJTXH","lm0pDFGzgp","JJs5muN6r3","OUYuFqaofN","Q6hMCfcJOy","suY4xjSjS3","Y1mC0Gv3Fq",
+"S2Dfu24ARF","djsrvK20wK","zFgtB14FLR","rhl0Jl83Ud","I7p2aeuZA5","L7cGcqQxHP","8FmFHuZPqg","IKxdLaL6AJ","xciqpXflUq","HzZT8fLNg8",
+"MK07YM3zXL","fcJOyuAWyp","EdBKclpF6W","xReeczz4ZU","GrDg7XflUq","J2mQi2ZHdk","3otm64QMc9","Cp3mZuLtKs","EOE1oAIYUu","xXTI4aez9y",
+"xciqpjiVBP","W3VFHOz8yZ","jtn0XzHF1q","QClRLAXpwE","Q6LixKsjRK","zmLYDSWfou","nlaByK4GS8","3otm6gdQsS","ulk41Vprf2","8cVD3NhXdu",
+"2DREsFFDui","okgRi14FLR","8RCUAmz8gx","FnPFBhi5X7","oQ87rB3qem","dhSuHb29RJ","m4bxURkQke","aL6AJxciqp","1LB1LCdyBV","iKqhrJRJQB",
+"s93MlaFFss","pWiOs7lUXZ","kB5nPS77LH","6AFT08U2nU","aez9y1v5hH","taOXKhUTw7","o8UydGrDg7","vLsmSKsjRK","CIShGpAhR1","wDajXy94nw",
+"BFkb8t98iW","jS1ajFLsph","QWxoTqQxHP","FLsphlH1kt","2Yz7ElCMxy","gjUTuMGlTF","WaWsveuZA5","AIYUurhl0J","t59lRTCgPp","s4786gjUTu",
+"ciuWz5VZjS","azIWpUl4a1","Uvlv4KASQ8","K4GS8VLTy6","tuDyS9eoRc","zQt6QlweGy","suY4xUvlv4","lCMxytAOsr","oVQp6h1zcH","BbwgABpYhV",
+"lpF6WJ2mQi","KASQ83weIF","uupzks93Ml","x3LDexciqp","lViBvv2eC3","5drc6BGaQY","gIYvEhYBCK","pmeCdo8Uyd","MGlTFL7cGc","lkMUAjfREu",
+"0Wr5y5Mg9r","DcpWBrz7Ut","EdBKcCqqaD","C2Ircjtn0X","FPfSEuTacx","9eoRcuupzk","K4GS8CdyBV","VLTy68U2nU","2DREs2DREs","nFqiktAOsr",
+"0ao3lhYBCK","PYBf4m4bxU","POUYStvdkD","xReec0YAGH","PYBf4djsrv","gf8rI8cVD3","ni2v19rlg9","pmeCddhSuH","MK07Y8U2nU","wiHrZb29RJ",
+"0Kyfsmz8gx","ksJbySs0Zu","WMiS3VNCPd","CNHmvUmaEv","MmsIo4dEz6","FcWrWv2eC3","oQ87r4QMc9","wDajXatef2","jSjS3MmKGJ","aez9ytlILt",
+"hi5X7Vprf2","fFDrJBCxeC","Pb1pa55rfB","7fsYMChuy3","FxX9qK4GS8","uQIczHP433","okgRiMmKGJ","16lHcO3iyQ","EdBKcDLhzM","HP433wDajX",
+"5iGN57Ow5C","gtCA5AOgEe","EOE1oTXQ0Z","pWiOsoQ87r","BGaQYFcWrW","FwEJzXflUq","i3pydTa8f6","m4bxUUmaEv","7lUXZtvdkD","BpYhVFVMxo",
+"ZJTXHJIqXi","vOqCEFGzgp","QYxC0S77LH","piJSkJRJQB","FcWrWlViBv","JRJQBpWiOs","W7cTsfaHir","Q6Lix1LB1L","16lHcfLNg8","DQimp1LB1L",
+"prNT629QAz","uoStw5ZaEz","TXQ0ZIn3NS","nFqikzqH0W","Z4I1vuJScX","ZUnqttvdkD","HP433CNHmv","t98iWsuY4x","uupzk2hEEU","piJSkDz1R3",
+"JRJQBQ6hMC","45cIHYh1hF","FVMxoM3zXL","5Mg9rtuDyS","vkCHHjSjS3","VLTy6brhlQ","1v5hHsuY4x","SmGzvGWqqX","FFDuiHzZT8","Yw2oUs4786",
+"l83UduLtKs","GXdoHZzJHW","Cfgr3S2Dfu","In3NSokgRi","7fsYMGrDg7","pv0i7Ta8f6","AkKTkFVMxo","Cfgr3SjskQ","FVMxoNxx9V","guMb8iKqhr",
+"3otm6vLsmS","KASQ8K4GS8","8RCUAD6rBy","7Ow5CWDVWJ","okgRi8RCUA","lkMUAGXdoH","9y4lw3otm6","AOgEeDcpWB","fLNg8618Di","UlU3MYh1hF",
+"l83UdStlDJ","GWqqXWPmlx","e6e4z45cIH","pWiOs580YD","5NammOxWIH","7Ow5CZzJHW","l83UdhYBCK","tjQxsZuDtD","ZJTXHgjUTu","8hJdtrKDLJ",
+"D6rByo8Uyd","WreyPRBhp0","ZzJHWrhl0J","oQ87r9iGoT","dmoS7lkMUA","D6rByRBhp0","ZJTXHb29RJ","4dEz6a00b5","Gv3Fq64s8N","Q6hMCLbRTH",
+"5ZaEzXflUq","1LB1LVIlwP","J2mQiYjB9t","55rfBFjHXR","FjHXRni2v1","ThjNntuDyS","5Mg9rEdBKc","zz4ZUoGu6x","FGzgpCdyBV","0BmCyRACuj",
+"CqqaDaL6AJ","Yw2oUYOfrY","7ku1pdhSuH","zqH0WP6bcg","aez9yMojnP","9rlg9D6rBy","faHirwDajX","Q6Lix9GXkX","2Nslmlj07Q","MGlTFOz8yZ",
+"9rlg9KZamH","B3qemBpYhV","euZA5Pb1pa","14FLRAOgEe","ThjNnFhtgl","QWxoTP6bcg","0KyfslkMUA","FnPFBlkMUA","J2mQiwDajX","2Yz7EZUnqt",
+"FPfSESbRYy","yofH3qQxHP","MmKGJm4bxU","55rfBfqypy","zbIYYn8pJ9","cShY2fcwDa","dmoS7Rxrsm","Chuy3QnJ1S","JIqXiRBhp0","NcICAjzUqR",
+"zz4ZU6q6L9","IBe8kThjNn","FPfSESs0Zu","7X3uyyvOMI","IKxdLcL0aE","okgRiVerEA","VIlwPC2Irc","tuDySjtn0X","zmLYDDcpWB","lCMxydhSuH",
+"lweGylViBv","kZANmpWiOs","VNCPdgdQsS","v8yFN7lUXZ","fLNg8FPfSE","k85Aev2eC3","nnP8ouN6r3","16lHc2DREs","uPX7GzQt6Q","ZJTXHBbwgA",
+"Oz8yZpiJSk","h1zcHGrDg7","ZuDtDk85Ae","yofH3gjUTu","uZPqgWaWsv","blLA9MmsIo","ZhwG1DcpWB","618DiiB08l","5iGN5y94nw","5ZaEzydG8U",
+"ciuWzLDk6f","iB08lfcwDa","S2DfuHzZT8","ZhwG1fFDrJ","Cfgr3JRJQB","zFgtBWaWsv","Cfgr3JkzUn","U3yw5dQ586","ru4UGxciqp","JIqXiaDGtS",
+"HlUbFogLgc","pFrrln1pmO","ZJTXHcShY2","tvdkDCp3mZ","yvOMIYw2oU","2ZHdkMezSW","hUTw7zQt6Q","bgJAznFqik","5drc61v5hH","8FmFHiKqhr",
+"StlDJ5ZaEz","ReKEW1v5hH","rKDLJHRxd8","0ao3ltlILt","n1pmOZzJHW","F6PT2VNCPd","qaofNzz4ZU","1LB1LfLNg8","fcwDayofH3","DQimp618Di",
+"8hJdt5IhmG","uAWyptuDyS","5IhmGVerEA","pWiOsjfREu","Pb1pauAWyp","RmDcrTXQ0Z","5ZaEztuDyS","n1pmOfaHir","5nmWv14FLR","oVQp6RpBQm",
+"FVMxo1j5L8","uN6r3zz4ZU","Fhtgl29QAz","K20wK29QAz","0h1b18FmFH","7fKYUNo0Qb","AXpwEWaim6","pT8wuYw2oU","OUYuFi3pyd","s47865Mg9r",
+"qQxHPa00b5","yvOMIbrhlQ","9eoRc55rfB","VjCZqtjQxs","GXdoHtlILt","U3yw5ECMvU","RBhp0azIWp","yofH3i7WMQ","FnPFBZv7z0","k85AeYjB9t",
+"GXdoHFGzgp","J2mQiGSQwj","OUYuFhYBCK","AgJHQUlU3M","ECMvUHzZT8","oVQp6b29RJ","JXljWcL0aE","djsrvAkKTk","5VZjS7lUXZ","gtCA51LB1L",
+"RzaZAtjQxs","t98iW3otm6","hUTw7Vprf2","RxrsmW7cTs","Yh1hFwDajX","NOHszP6bcg","LDk6f45cIH","ZJTXHv8yFN","Nxx9V7X3uy","TwanoRBhp0",
+"ru4UGLbRTH","uPX7GHP433","oVQp6Rxrsm","xciqp0ao3l","pvgjSn8pJ9","GWqqXPYBf4","9rlg9ZJTXH","SmGzvzHF1q","KASQ8iwzGk","0Kyfs9GXkX",
+"5VZjSRACuj","JJs5mlweGy","x3LDe9eoRc","WmadAGrDg7","HP433a00b5","MGlTFX6Pin","zFgtBpmeCd","y94nw0Wr5y","jtn0XtaOXK","uN6r3uupzk",
+"rhl0JZhwG1","XyPZNMojnP","RpBQmCxVEf","uLtKs4dEz6","okgRiUvlv4","JRJQBFwEJz","jiVBPMGlTF","AmdQdOUqFM","2TRI78cVD3","e6e4zCIShG",
+"lXFOBa00b5","Yf2EcCxVEf","ksJbyMmsIo","HzZT83weIF","29QAzhi5X7","HfyNQuvf7A","mz8gxaFFss","xciqpCp3mZ","XflUq2Nslm","bZLvStaOXK",
+"he9IAFxX9q","o8UydLbRTH","9y4lwOHaBz","euZA5blLA9","0MR5XiKqhr","5Drn0jS1aj","4QMc9AkKTk","EdBKcuQIcz","blLA98cVD3","OxWIHNAFuw",
+"t59lRv2eC3","Rxrsmd85a9","OHaBz4QMc9","tAOsraFFss","sqVrfuTacx","07n1cbZLvS","mX2GE9eoRc","0YAGHqaofN","7Ow5CI7p2a","JXljWv8yFN",
+"jfREud7vjM","n8pJ9FVMxo","x3LDen8pJ9","LewvMFnPFB","ZhwG1JIqXi","Waim6gtCA5","BFkb8FGzgp","O3iyQDQimp","SmGzvQWxoT","0MR5XFLsph",
+"Fhtgl0Wr5y","1LB1LRBhp0","hE1Qluupzk","FxX9q5Mg9r","dmoS7mX2GE","zqH0WjeskS","Mm8siJJs5m","nFqikuupzk","POUYSuoStw","wDajXh1zcH",
+"KASQ8tvdkD","8cVD3wiHrZ","pv0i72Nslm","2TRI7FGzgp","JkzUntjQxs","aFFssgtCA5","ulk41aez9y","uJScXrhl0J","5ZaEzHRxd8","wDajXxReec",
+"VBjhzCIShG","RBhp0ulk41","BCxeCpFrrl","prNT6Nxx9V","0Wr5ylXFOB","ni2v1jfREu","kB5nPnnP8o","aL6AJX6Pin","lsQGo9iGoT","0KyfsZhwG1",
+"lH1ktThjNn","POUYS2hEEU","n8pJ98TxD7","7ku1poQ87r","KZamHG1RhS","XflUqpvgjS","Q6hMCVprf2","VIlwPk85Ae","8cVD3CqqaD","NAFuwCp3mZ",
+"3weIFJJs5m","4QMc9580YD","AkKTkJRJQB","pmeCdRsQUq","azIWphYBCK","I7p2aXyPZN","L7cGcCp3mZ","5Drn0soy9t","IKxdL0PktI","NAFuw5Drn0",
+"JKWYRP6bcg","5iGN5SWfou","iB08lgdQsS","8RCUANo0Qb","k85AeM3zXL","gIYvEAkKTk","FwEJzaFFss","JXljW45cIH","VBjhzTXQ0Z","MmsIoMaJQs",
+"Ul4a1ciuWz","VerEA4dEz6","B3qembZLvS","StlDJdpe1v","jS1ajChuy3","jSjS35VZjS","gtCA5okgRi","uN6r316lHc","RBhp09y4lw","pFrrlLDk6f",
+"aez9yMezSW","EoToPlkMUA","4dEz6K4GS8","aez9y0ao3l","RpBQmQbxXc","fcwDarKDLJ","SWfoucShY2","prNT6wDajX","VLTy6Vprf2","rz7Ute6e4z",
+"mX2GEMojnP","NAFuwFhtgl","BGaQY7lUXZ","8TxD7rKDLJ","RACuj3weIF","07n1cPOUYS","0MR5XJXljW","5Mg9r0h1b1","7Ow5CZv7z0","Ul4a1faHir",
+"NcICALewvM","9y4lw2TRI7","OUYuFuupzk","uPX7GcmXIX","xReecQYxC0","AgJHQVprf2","45cIHfFDrJ","xReecqUJMd","taOXKuPX7G","CqqaD5ZaEz",
+"FGzgppv0i7","G1RhScL0aE","lm0pDfLNg8","F6PT2QYxC0","0ao3lJXljW","8xEKzGXdoH","t98iWd85a9","vOqCE7fsYM","n8pJ9Yh1hF","TXQ0Z5drc6",
+"uvf7Aix74r","G1RhSo8Uyd","HP433lXFOB","ZuDtDguMb8","uPX7GMmKGJ","cL0aE5ZaEz","0BmCycShY2","HlUbFtl72W","8hJdtgf8rI","uAWypdQ586",
+"K20wKzY1GY","d7vjMpv0i7","uJScX07n1c","gf8rI2DREs","QChxs9y4lw","CdyBVfcJOy","VNCPdsqVrf","lm0pDblLA9","D6rByDQimp","KsjRKWDVWJ",
+"QYxC0yluBx","7fsYMD6rBy","5nmWvjSjS3","gdQsSMezSW","piJSkFNYIM","lXFOBvOqCE","JkzUn8cVD3","rz7Utv1Hln","djsrvOUqFM","M3zXLuN6r3",
+"RkQkeWDVWJ","7Ow5CHzZT8","WaWsvrz7Ut","CqqaDUmaEv","B3qemHzZT8","64s8N4QMc9","uvf7A9y4lw","6q6L9lm0pD","FVMxoTXQ0Z","wDajXSmGzv",
+"hYBCKNOHsz","d85a9hE1Ql","zHF1qNo0Qb","FPfSEGSQwj","LewvMx3LDe","KsjRK618Di","nFqikbZLvS","s93MlZ4I1v","9GXkXt59lR","jtn0XhSSvQ",
+"7X3uyaL6AJ","cQOnvFVMxo","0h1b1uTacx","oGu6xs93Ml","oVQp6CK5W7","he9IAlj07Q","JJs5mIn3NS","lm0pDbgJAz","okgRiDcpWB","07n1cZzJHW",
+"8RCUAGWqqX","hUTw7cShY2","WreyPvkCHH","piJSkUmaEv","b29RJkZANm","IKxdLokgRi","Cp3mZYw2oU","0h1b116lHc","7Ow5C24ARF","gjUTuQworu",
+"PYBf4TXQ0Z","tuDySFLsph","faHirmX2GE","lj07Qt98iW","ciuWz7fKYU","0PktI6q6L9","VerEANo0Qb","Uvlv40h1b1","pWiOsa00b5","piJSk5VZjS",
+"OHaBzjtn0X","zHF1qzmLYD","Q6LixNhXdu","okgRiuPX7G","iqv4kIjTwP","45cIHn1pmO","U3yw5JkzUn","FnPFBFnPFB","dmoS7i3pyd","I7p2auPX7G",
+"nlaByAIYUu","YOfrYYjB9t","1LB1LThjNn","oGu6x9y4lw","NOHszUl4a1","pT8wufcwDa","lkMUANhXdu","Q6LixGrDg7","wDajX9rlg9","IKxdLIn3NS",
+"GWqqXIRh48","FjHXR8cVD3","7lUXZuQIcz","Y1mC0O3iyQ","EOE1ociuWz","n8pJ9DLhzM","AmdQdRACuj","jfREud85a9","CqqaDcL0aE","5nmWvfcJOy",
+"BFkb8rhl0J","O3iyQFxX9q","iB08lK20wK","Cp3mZlpF6W","JIqXi2ZHdk","5nmWv5drc6","6AFT0wiHrZ","i7WMQTCgPp","i7WMQjSjS3","Gv3FqHfyNQ",
+"lm0pDL7cGc","HzZT8GrDg7","ru4UGiKqhr","aez9yfFDrJ","S2Dfuhe9IA","FxX9qpiJSk","8RCUAKr8ys","9iGoTGXdoH","MezSWnlaBy","ThjNnNAFuw",
+"JJs5mh1zcH","pv0i7BbwgA","QworukZANm","8xEKz2Yz7E","Qworu7fKYU","S2DfugIYvE","MaJQst98iW","PYBf4x3LDe","lViBvMGlTF","EdBKcQworu",
+"suY4xKASQ8","jSjS30ao3l","FjHXRMaJQs","tAOsruPX7G","Yw2oUs7Mxk","pT8wuReKEW","Chuy3SbRYy","0Wr5yZJTXH","jfREunnP8o","hE1Qle6e4z",
+"Ta8f6uPX7G","pvgjSX6Pin","AIYUugIYvE","NhXduMK07Y","zY1GYoQ87r","FcWrWS77LH","hSSvQBFkb8","QssNC2hEEU","DcpWB9y4lw","v1Hln48cHL",
+"FGzgpZ4I1v","AkKTkVprf2","FxX9qOUYuF","FwEJzSbRYy","ydG8Uhi5X7","L7cGcWmadA","guMb8RmDcr","MojnPXyPZN","uPX7GSs0Zu","aez9yHfyNQ",
+"RsQUqqUJMd","U3yw5atef2","7X3uy2Nslm","MaJQs5VZjS","ECMvUh1zcH","8RCUAQ6Lix","MmKGJgdQsS","wDajXQnJ1S","sqVrfS2Dfu","gtCA5pWiOs",
+"pT8wuW3VFH","Mm8siVerEA","hSSvQt98iW","Nxx9Vs93Ml","BFkb8Yf2Ec","FcWrWM3zXL","MezSWatef2","fFDrJAgJHQ","hUTw7pmeCd","m4bxUd7vjM",
+"blLA9BCxeC","oQ87r5iGN5","0Wr5ydQ586","No0QbNAFuw","LewvMPb1pa","TwanoCxVEf","J2mQiM3zXL","Cp3mZY1mC0","3otm6AOgEe","Yw2oUBbwgA",
+"oQ87r64s8N","HP433n8pJ9","O3iyQWDVWJ","VIlwPOHaBz","VerEAbgJAz","cQOnv14FLR","W3VFHXflUq","ReKEWpWiOs","VerEAuvf7A","POUYSv8yFN",
+"5iGN5RBhp0","uvf7Ajtn0X","Y1mC0djsrv","pT8wuWreyP","uQIczGv3Fq","SWfoux3LDe","WmadAmX2GE","Cp3mZEdBKc","hSSvQY1mC0","QClRL6AFT0",
+"AIYUu2TRI7","zFgtBPb1pa","StlDJi3pyd","4QMc9SbRYy","LbRTHSWfou","zmLYDiwzGk","AkKTkCIShG","In3NSe6e4z","taOXKPOUYS","pAhR10Wr5y",
+"yToGWPOUYS","gdQsS5IhmG","EdBKcFNYIM","ru4UGWaWsv","he9IAKr8ys","AOgEePOUYS","Kr8ysPYBf4","JXljWksJby","VNCPdFPfSE","tlILtb29RJ",
+"gIYvEvOqCE","QYxC03otm6","pFrrlMkgy8","EoToPWreyP","CqqaDhE1Ql","QChxsguMb8","JJs5mQ6hMC","MaJQsLbRTH","d7vjMCxVEf","0MR5Xi7WMQ",
+"kZANmgIYvE","ni2v1OHaBz","nFqik7ku1p","BFkb82ZHdk","lpF6W5IhmG","nlaBysx5Gl","uN6r39GXkX","XyPZN7Ow5C","45cIHVprf2","fLNg8AOgEe",
+"suY4xdjsrv","lCMxyciuWz","POUYSWDVWJ","v2eC3uN6r3","0KyfsGrDg7","he9IAMK07Y","lH1ktjtn0X","brhlQZhwG1","EOE1oUvlv4","lViBvZUnqt",
+"aDGtSrhl0J","uTacx8cVD3","7ku1pMmsIo","Gv3Fq07n1c","dQ586Dz1R3","48cHLAXpwE","l83UdRsQUq","iwzGkQChxs","CNHmv5Mg9r","D6rBy9y4lw",
+"Q6hMCWMiS3","yluBxMGlTF","X6PinZv7z0","tvdkD2hEEU","rz7UtFwEJz","fmIK1FLsph","SWfoucmXIX","nFqikCK5W7","8hJdtDG4sT","BGaQYlXFOB",
+"Zv7z0wiHrZ","OHaBz7lUXZ","lpF6Wuvf7A","9iGoTQbxXc","W3VFHuoStw","lXFOB5nmWv","QYxC0VNCPd","OHaBzMaJQs","i7WMQjS1aj","iwzGk1LB1L",
+"ix74rtl72W","4W0Tlhe9IA","t98iWyEfy9","rz7UtHzZT8","Z4I1vi7WMQ","3weIFiwzGk","1j5L8rhl0J","XflUqC2Irc","kZANmn8pJ9","U3yw50Kyfs",
+"nnP8oQClRL","AOgEelViBv","8FmFHzFgtB","t98iWIKxdL","nlaByd7vjM","0Wr5yP6bcg","QWxoTpAhR1","YjB9tFFDui","RmDcr9y4lw","Q6LixF6PT2",
+"5VZjSxciqp","QChxsvOqCE","PYBf4hi5X7","CK5W7NAFuw","CNHmvi3pyd","24ARFuQIcz","DLhzMfcJOy","PYBf4atef2","b29RJhe9IA","a00b5zqH0W",
+"QbxXc8RCUA","1j5L8vOqCE","BFkb8GWqqX","ZuDtDWreyP","NcICAEdBKc","J2mQiX6Pin","VjCZqhi5X7","8xEKzQworu","FGzgpwDajX","nnP8oi3pyd",
+"F6PT2lkMUA","Y1mC0FcWrW","MmsIoXflUq","8RCUAokgRi","l83UdZ4I1v","S2DfuQWxoT","lViBvOxWIH","HRxd8BbwgA","CIShGNcICA","Yh1hFzmLYD",
+"2TRI7KASQ8","LewvMdhSuH","sx5Gl7Ow5C","Mkgy89y4lw","yluBxUvlv4","fcJOyuTacx","AmdQdyEfy9","14FLRhi5X7","C2IrcM6qcG","P6bcgfcwDa",
+"lm0pDQssNC","IBe8kDcpWB","ECMvUMaJQs","RACujRpBQm","2TRI7Yh1hF","Y1mC0YjB9t","MmKGJuAWyp","1v5hHtaOXK","JkzUnTCgPp","Gv3Fq0Kyfs",
+"atef2cmXIX","5Mg9rLbRTH","pmeCduvf7A","v2eC3zqH0W","7ku1ptjQxs","blLA9jzUqR","O3iyQtaOXK","zbIYY1v5hH","FxX9qGv3Fq","t98iWuupzk",
+"C2IrcFVMxo","JRJQB0Kyfs","cmXIXTXQ0Z","uN6r3dmoS7","RBhp0FNYIM","BFkb8WPmlx","zQt6QkZANm","zbIYYJJs5m","ZuDtD0MR5X","Gv3FqL7cGc",
+"SjskQfcJOy","NOHszzqH0W","8xEKzIKxdL","KASQ8Mm8si","HP433QClRL","2Yz7EYh1hF","wiHrZMK07Y","i3pydTwano","S77LHRBhp0","POUYSix74r",
+"uPX7G6q6L9","S2DfuHlUbF","zFgtBvkCHH","yofH355rfB","zY1GYd85a9","ciuWzVjCZq","zFgtBJRJQB","MmsIoFLsph","uupzk2Yz7E","FhtglHzZT8",
+"NOHszW7cTs","lXFOBPb1pa","uN6r3J2mQi","5iGN5AmdQd","fcJOyPOUYS","dmoS7atef2","FLsphJJs5m","RzaZAm4bxU","faHirlH1kt","OUqFMJJs5m",
+"xReecCp3mZ","Ss0ZuY1mC0","cQOnvOUYuF","7X3uy55rfB","taOXK5nmWv","0YAGHv2eC3","AIYUuM3zXL","Gv3FquLtKs","wDajXru4UG","RmDcr9XyT9",
+"ydG8U3weIF","jfREutjQxs","X6PinCfgr3","K20wKWreyP","CqqaDSmGzv","lCMxyL7cGc","EoToPm4bxU","Ss0ZuMojnP","oGu6x14FLR","C2IrcXyPZN",
+"tlILthYBCK","azIWp5nmWv","9y4lwoVQp6","AmdQdRmDcr","cQOnvuZPqg","QbxXc8FmFH","m4bxUOUqFM","F6PT2IBe8k","OHaBzyToGW","aFFssVLTy6",
+"Q6hMCZhwG1","m4bxUVBjhz","AXpwEOUYuF","8TxD7cmXIX","zFgtBeuZA5","WDVWJJ2mQi","4dEz6Pb1pa","HfyNQxciqp","v8yFNJkzUn","ru4UGDcpWB",
+"taOXKksJby","vkCHHuAWyp","ZzJHW618Di","UmaEv8U2nU","i3pydPOUYS","oQ87r5Mg9r","WmadAVjCZq","zqH0Wh1zcH","rKDLJAIYUu","9GXkXs7Mxk",
+"pT8wuJJs5m","WMiS3RmDcr","PYBf4uLtKs","CK5W7Oz8yZ","45cIHhYBCK","9iGoTi3pyd","FVMxoIKxdL","ThjNnv1Hln","aFFssDz1R3","JXljWAOgEe",
+"prNT6aez9y","Chuy3HRxd8","F6PT2xXTI4","AIYUuZJTXH","pv0i7HP433","yluBxuvf7A","Nxx9VcQOnv","O3iyQFNYIM","lsQGoCK5W7","AIYUuix74r",
+"yofH34QMc9","NhXduHRxd8","K20wKxXTI4","5VZjSY1mC0","MK07YTCgPp","8RCUAQbxXc","uoStwSs0Zu","Yf2EcQbxXc","GWqqXIjTwP","0MR5XJkzUn",
+"qaofN64s8N","tlILtyvOMI","a00b5lweGy","XflUqAkKTk","gdQsSHlUbF","azIWpD6rBy","NcICAC2Irc","Yw2oU14FLR","IRh48Rxrsm","HRxd8BFkb8",
+"uvf7AW3VFH","RzaZAqQxHP","ni2v1uQIcz","0BmCyHfyNQ","AOgEe7fsYM","2NslmcQOnv","IBe8kYw2oU","x3LDehe9IA","RpBQmv1Hln","tjQxsVjCZq",
+"vkCHH8RCUA","djsrvl83Ud","Ta8f6ZhwG1","s4786uQIcz","5Mg9rlsQGo","HzZT8piJSk","gIYvEn1pmO","5Mg9ruTacx","Pb1paTwano","iKqhrWaWsv",
+"lCMxyCqqaD","QbxXctl72W","LewvM2hEEU","2ZHdk4QMc9","azIWpVprf2","b29RJW7cTs","MojnP4QMc9","QWxoTMGlTF","v2eC39eoRc","0h1b1e6e4z",
+"uvf7A0ao3l","0h1b1Q6hMC","F6PT2Qworu","1j5L8KsjRK","Yw2oURmDcr","0PktIdQ586","soy9t2Nslm","v1HlnQChxs","yluBxECMvU","EoToPpFrrl",
+"64s8NReKEW","8TxD75iGN5","hSSvQVjCZq","W3VFHGWqqX","QYxC0taOXK","618DiLDk6f","DQimpMaJQs","5drc6AIYUu","JRJQBx3LDe","ksJbyJKWYR",
+"tAOsrW7cTs","5nmWv4dEz6","5drc65drc6","Yf2EcpiJSk","vOqCEBGaQY","uTacxuQIcz","NcICApv0i7","fcJOyogLgc","B3qem14FLR","U3yw5rz7Ut",
+"cmXIX8FmFH","yEfy9Gv3Fq","uLtKsgdQsS","5ZaEzIRh48","yluBxfaHir","faHiriKqhr","o8Uyd2ZHdk","Ul4a1prNT6","FLsph8TxD7","okgRipiJSk",
+"7Ow5Csx5Gl","5Mg9rd7vjM","5Mg9rpT8wu","XyPZNGrDg7","BpYhVVerEA","UmaEvlpF6W","jeskStvdkD","PYBf4cQOnv","hi5X7WmadA","FxX9q7hyVv",
+"QWxoT2hEEU","DQimpX6Pin","4dEz6QYxC0","kZANmUvlv4","iqv4k5Drn0","xXTI4AOgEe","qUJMdzbIYY","TXQ0ZyEfy9","MmsIolsQGo","lj07Q5drc6",
+"SjskQReKEW","gf8rIMezSW","CdyBVQChxs","wiHrZuAWyp","cL0aECxVEf","lweGyfmIK1","7X3uy16lHc","HP433l83Ud","Nxx9VZuDtD","5ZaEzVprf2",
+"dQ586d7vjM","RzaZA5Mg9r","lH1ktjiVBP","i7WMQOUqFM","WMiS3fcwDa","GXdoH5Mg9r","NOHszTwano","9y4lwiqv4k","FNYIM9GXkX","ThjNn8xEKz",
+"JRJQBsx5Gl","RBhp0lViBv","3otm6HfyNQ","2DREsQ6Lix","Yw2oU7lUXZ","d85a9ZUnqt","Mkgy8ZJTXH","Ss0ZuOz8yZ","8xEKzzHF1q","45cIH7Ow5C",
+"hSSvQStlDJ","he9IAWPmlx","Ss0Zum4bxU","e6e4z6AFT0","3weIFHfyNQ","atef2MojnP","W3VFHv2eC3","WmadA2ZHdk","wiHrZtvdkD","0Wr5yRBhp0",
+"zHF1qGSQwj","KsjRKWMiS3","K20wKpv0i7","taOXKi3pyd","W7cTse6e4z","Vprf2NhXdu","iKqhr5VZjS","VjCZqTa8f6","Rxrsm1v5hH","6AFT06AFT0",
+"2NslmTwano","sx5GlKr8ys","5Drn0vOqCE","FFDuicmXIX","CK5W70ao3l","BGaQYtvdkD","Mkgy82DREs","ZzJHWh1zcH","FFDui7lUXZ","16lHcQ6hMC",
+"m4bxUt98iW","DcpWBVNCPd","4dEz65ZaEz","tvdkDCK5W7","qUJMdFnPFB","CqqaDX6Pin","HzZT8qUJMd","W7cTsAkKTk","X6PinaDGtS","FPfSECfgr3",
+"9rlg9JKWYR","BCxeCs93Ml","8U2nU5Namm","48cHLKsjRK","OHaBzo8Uyd","5Mg9rCNHmv","hE1QlCfgr3","6AFT0YOfrY","t98iWJJs5m","t98iWM3zXL",
+"MK07YS2Dfu","AkKTkiB08l","IKxdLECMvU","GXdoHjfREu","ZuDtDxReec","64s8NxXTI4","XyPZNSs0Zu","v8yFNO3iyQ","RxrsmFNYIM","xReec6AFT0",
+"Kr8ysfaHir","bgJAz48cHL","zmLYDFLsph","fLNg8fqypy","WDVWJuTacx","KASQ80h1b1","mX2GEfaHir","blLA9MojnP","G1RhSKZamH","5iGN5lpF6W",
+"iKqhr0ao3l","4dEz64W0Tl","CqqaDuvf7A","8FmFHogLgc","C2IrcDz1R3","JRJQB24ARF","JkzUnYf2Ec","NhXduC2Irc","VerEAtaOXK","rKDLJ9rlg9",
+"M6qcG8TxD7","14FLRtvdkD","brhlQ64s8N","5IhmGReKEW","lsQGosx5Gl","07n1cLewvM","5Mg9r0Kyfs","MaJQs29QAz","5NammEOE1o","0Wr5yThjNn",
+"5VZjS55rfB","zqH0WyEfy9","MmKGJdjsrv","8xEKzVNCPd","EOE1o5drc6","CIShG8U2nU","DG4sTP6bcg","P6bcg8cVD3","M6qcGi3pyd","9y4lwQ6hMC",
+"yToGWtjQxs","rz7UtG1RhS","tuDySCIShG","azIWpCxVEf","CNHmv8xEKz","rz7UtDcpWB","9iGoTEoToP","4QMc9atef2","K4GS8e6e4z","DcpWByluBx",
+"zQt6QVBjhz","5VZjSCNHmv","ulk41h1zcH","lj07QS77LH","2DREsRzaZA","0ao3lzQt6Q","oQ87rMGlTF","C2IrcOxWIH","i7WMQuvf7A","x3LDeQClRL",
+"Q6hMCDLhzM","Ul4a18hJdt","t98iWFVMxo","yofH3Nxx9V","BFkb8AOgEe","ZJTXHdpe1v","tl72WqaofN","gtCA5qaofN","MK07YSbRYy","iqv4k3otm6",
+"P6bcgwiHrZ","AIYUuwiHrZ","JkzUndQ586","e6e4z29QAz","ZUnqtYw2oU","6q6L90YAGH","atef2Y1mC0","he9IAjS1aj","HfyNQt59lR","5drc6s93Ml",
+"G1RhSHfyNQ","IKxdLBbwgA","DLhzM07n1c","pvgjSSmGzv","7hyVvaL6AJ","cL0aEfaHir","TwanohE1Ql","gdQsSYjB9t","v8yFNThjNn","HzZT8nnP8o",
+"L7cGc8RCUA","M6qcGfLNg8","rKDLJydG8U","POUYShSSvQ","0ao3lv8yFN","BFkb8soy9t","CIShGIKxdL","lpF6WNcICA","jiVBPtvdkD","WaWsvcmXIX",
+"FjHXRAIYUu","dQ586uPX7G","i7WMQi7WMQ","Kr8ys7fKYU","d85a9DQimp","RpBQmEdBKc","XflUqpAhR1","qUJMdUmaEv","J2mQiblLA9","v8yFNqQxHP",
+"zFgtBhSSvQ","gtCA5m4bxU","EoToPn1pmO","MaJQs7fsYM","okgRiChuy3","BFkb8xciqp","FnPFBU3yw5","9GXkXHP433","No0QbS2Dfu","CIShGuupzk",
+"Ul4a15ZaEz","X6PingdQsS","ksJbyM6qcG","QChxshSSvQ","nFqikyvOMI","Ss0ZuWDVWJ","Pb1palpF6W","xReecaez9y","vLsmSlpF6W","okgRivkCHH",
+"cL0aEhE1Ql","rz7UtNxx9V","TCgPp6AFT0","GSQwjlsQGo","LDk6f7ku1p","1j5L8BCxeC","1v5hH0ao3l","tuDySCxVEf","29QAzIKxdL","FNYIMRmDcr",
+"jSjS3UlU3M","1v5hHSs0Zu","StlDJjiVBP","5Mg9rv2eC3","zbIYYWPmlx","kB5nP0BmCy","Mm8siHRxd8","LDk6fVBjhz","3otm60h1b1","wDajX2hEEU",
+"FVMxo8hJdt","yvOMIQworu","xciqpDLhzM","rhl0Jlm0pD","W7cTsciuWz","AgJHQuAWyp","F6PT2Waim6","No0QbStlDJ","uPX7GvLsmS","ECMvU8U2nU",
+"a00b5cL0aE","VBjhzMK07Y","AgJHQzmLYD","v1HlnbZLvS","8FmFHIKxdL","IjTwPRkQke","HRxd8he9IA","IRh48zmLYD","I7p2aRBhp0","55rfBVNCPd",
+"GSQwjnlaBy","IRh48P6bcg","8cVD3ThjNn","xXTI4hUTw7","prNT6DQimp","O3iyQlXFOB","sqVrfAXpwE","IjTwPcmXIX","0BmCyfaHir","pWiOsiwzGk",
+"Kr8ysRxrsm","rhl0JUlU3M","cmXIX2hEEU","48cHLPYBf4","UmaEvAXpwE","7fsYMHzZT8","MK07YuAWyp","BbwgATCgPp","Q6LixM6qcG","48cHLn8pJ9",
+"AmdQdtvdkD","SWfoujzUqR","5Nammuupzk","jiVBPh1zcH","blLA90ao3l","lH1kt9y4lw","8xEKz3otm6","0Wr5yQChxs","9GXkXokgRi","iwzGkbrhlQ",
+"8hJdtI7p2a","uAWypTwano","X6Pin3otm6","7fKYUPOUYS","Cfgr34QMc9","mX2GE14FLR","QssNCPOUYS","fcJOyqaofN","fmIK1zY1GY","vOqCEUl4a1",
+"FVMxoHfyNQ","oVQp68FmFH","14FLROz8yZ","tAOsrv8yFN","pT8wuOUqFM","9y4lwVerEA","StlDJFcWrW","xXTI44QMc9","9eoRcCqqaD","t59lRNAFuw",
+"0BmCyPOUYS","ydG8UbrhlQ","pAhR1zmLYD","45cIHNo0Qb","HRxd8QssNC","uN6r3piJSk","OUYuFuQIcz","KsjRKhSSvQ","hE1Ql7X3uy","ReKEWnlaBy",
+"LewvMMojnP","48cHL5iGN5","EoToPMK07Y","Z4I1vni2v1","XflUqzz4ZU","9eoRcFwEJz","RsQUq0Kyfs","cL0aEOUqFM","lH1kti3pyd","o8UydDG4sT",
+"5Drn0gjUTu","AmdQd5drc6","5drc6iB08l","J2mQiJ2mQi","vkCHHP6bcg","I7p2aQssNC","jeskS0MR5X","LDk6fYh1hF","guMb8Oz8yZ","yEfy99y4lw",
+"nlaBylweGy","07n1cjtn0X","0h1b1Qworu","MezSW7fKYU","lkMUA2Yz7E","rz7UtJRJQB","cQOnvNhXdu","ksJbyd7vjM","QYxC0Rxrsm","DG4sTJRJQB",
+"hYBCKPb1pa","n1pmOCxVEf","yluBxmX2GE","o8Uydsoy9t","lViBvtuDyS","Q6LixhE1Ql","qUJMd7X3uy","pvgjSkB5nP","X6PinG1RhS","uQIczFVMxo",
+"pvgjSuTacx","WaWsvFVMxo","CIShGI7p2a","ni2v1k85Ae","D6rBy8RCUA","K4GS8F6PT2","rz7UtyvOMI","zY1GYblLA9","GrDg7gtCA5","AIYUu1j5L8",
+"Mkgy8KASQ8","zmLYDgdQsS","mX2GEWreyP","qaofNAkKTk","5iGN5blLA9","nlaByEdBKc","2Yz7EoGu6x","OxWIH9rlg9","dhSuHIjTwP","NcICA9y4lw",
+"ZUnqts93Ml","C2IrcyEfy9","8U2nUe6e4z","2DREsDcpWB","Uvlv4Nxx9V","9rlg9hE1Ql","5VZjSbgJAz","CIShGMGlTF","hE1QlKASQ8","SbRYy7Ow5C",
+"dpe1vfFDrJ","YjB9tFNYIM","Twano16lHc","14FLRSbRYy","rhl0JQssNC","oGu6x5Namm","wDajXWPmlx","pmeCdzqH0W","Zv7z0DLhzM","MmsIoNxx9V",
+"cL0aEyluBx","FcWrWuoStw","7hyVv55rfB","fFDrJOHaBz","gIYvEJJs5m","sx5GlLewvM","HzZT8FcWrW","FFDuis4786","cL0aESWfou","piJSkMK07Y",
+"gIYvEJkzUn","hE1QlOUYuF","7fsYMhE1Ql","BCxeCJRJQB","s7MxkKASQ8","ThjNnI7p2a","suY4xGXdoH","nnP8o580YD","VIlwPCIShG","dQ586qaofN",
+"yofH3UlU3M","JKWYRiwzGk","S2DfupvgjS","0Wr5yuTacx","oVQp6uPX7G","mz8gxjfREu","TwanoG1RhS","Ul4a1S2Dfu","qaofNGrDg7","TwanoI7p2a",
+"AXpwE24ARF","bgJAz0ao3l","zFgtBQWxoT","7fsYMEoToP","PYBf40BmCy","8xEKzWMiS3","FwEJzyluBx","Yh1hFrhl0J","prNT6rz7Ut","n1pmOGXdoH",
+"x3LDeQbxXc","VBjhzCp3mZ","RpBQmOxWIH","azIWpRBhp0","lsQGoM6qcG","hUTw7s4786","rhl0J4W0Tl","6q6L9S2Dfu","JRJQB29QAz","AIYUugdQsS",
+"DQimpgIYvE","QWxoTUlU3M","CK5W7LDk6f","pFrrlZv7z0","gIYvEgjUTu","okgRiFVMxo","fLNg8taOXK","AIYUuTwano","HzZT8TXQ0Z","JKWYRJIqXi",
+"Ta8f6hYBCK","KASQ8Kr8ys","uoStwogLgc","uTacxl83Ud","FcWrWIKxdL","CxVEf9GXkX","SWfouZzJHW","5VZjSix74r","dmoS72hEEU","RxrsmJ2mQi",
+"GXdoHuoStw","VNCPdRACuj","tl72Wd7vjM","tl72WEOE1o","WMiS3BpYhV","Nxx9Vn8pJ9","yluBx8xEKz","RmDcr9rlg9","ix74rfcJOy","tvdkDk85Ae",
+"Gv3FqMezSW","k85AeNcICA","s7MxkBCxeC","uAWypQ6hMC","QChxsdmoS7","uQIczo8Uyd","kZANmqQxHP","BCxeCSWfou","TCgPpx3LDe","vkCHHrz7Ut",
+"blLA92hEEU","n8pJ91v5hH","QnJ1SaFFss","4dEz6sx5Gl","yofH3lm0pD","P6bcgMezSW","wiHrZ8TxD7","0MR5XyluBx","In3NSU3yw5","jSjS3xXTI4",
+"8xEKzZ4I1v","Cp3mZdQ586","RsQUqHfyNQ","t59lRD6rBy","t59lRpAhR1","ix74rpvgjS","POUYSAmdQd","oGu6xogLgc","4QMc9WaWsv","x3LDeXflUq",
+"lj07Qhe9IA","gjUTuuLtKs","B3qemTXQ0Z","Chuy3I7p2a","VBjhzQYxC0","qQxHPlkMUA","tvdkDyvOMI","uTacxB3qem","7fKYUo8Uyd","FhtglCfgr3",
+"SmGzvlXFOB","s93MlFcWrW","Cfgr3B3qem","9y4lwatef2","tl72WFhtgl","Cp3mZvOqCE","OxWIHni2v1","fcJOyFNYIM","tjQxsCNHmv","lH1ktGrDg7",
+"v8yFNgdQsS","yEfy9WMiS3","vOqCEQworu","CdyBVvOqCE","EdBKcyluBx","azIWptlILt","OUqFMPb1pa","Mkgy8faHir","hYBCKpv0i7","C2IrcRACuj",
+"3otm6Ss0Zu","48cHLXyPZN","JIqXiKr8ys","yvOMI5drc6","rz7UtMmsIo","Y1mC0AOgEe","JXljWlpF6W","7lUXZIKxdL","AmdQdqQxHP","Q6LixDLhzM",
+"RmDcr3weIF","gIYvE7ku1p","gjUTucL0aE","iwzGklj07Q","uoStwSjskQ","UlU3MpT8wu","GWqqX4W0Tl","I7p2aydG8U","8hJdtcQOnv","RxrsmlweGy",
+"lXFOBUmaEv","dmoS7uQIcz","C2IrcVerEA","L7cGc4QMc9","Cp3mZhE1Ql","9eoRcjS1aj","lm0pDv1Hln","8cVD3Zv7z0","hi5X7ix74r","jzUqRAIYUu",
+"x3LDezHF1q","x3LDeuPX7G","fcwDatl72W","SbRYyGXdoH","aFFssh1zcH","8FmFH48cHL","FwEJzhUTw7","CdyBV07n1c","gf8rIVprf2","POUYSFhtgl",
+"7fKYUxXTI4","K4GS8t98iW","HfyNQzmLYD","8xEKzdhSuH","BGaQYF6PT2","jiVBPxXTI4","55rfBcL0aE","gdQsSZUnqt","0Kyfs4QMc9","8cVD3AIYUu",
+"Zv7z05IhmG","580YD5drc6","xReec45cIH","tl72WMkgy8","8cVD3LbRTH","tlILtHzZT8","ydG8U6AFT0","JIqXipiJSk","zz4ZU4dEz6","iqv4kv8yFN",
+"JJs5m1LB1L","CxVEfOUqFM","iKqhr24ARF","v8yFN24ARF","WPmlxdjsrv","JRJQBuoStw","CIShGhUTw7","oGu6xJXljW","aL6AJ0PktI","aL6AJUvlv4",
+"WMiS3tlILt","mX2GEAkKTk","jzUqR9rlg9","MmsIoAXpwE","JkzUntAOsr","wiHrZFhtgl","4QMc9Dz1R3","uQIczt98iW","uAWyppmeCd","4dEz6jfREu",
+"iKqhrRsQUq","M6qcGuTacx","8cVD3ydG8U","TwanoOUqFM","sqVrf6q6L9","lCMxyGWqqX","euZA524ARF","v2eC32DREs","guMb8uN6r3","gf8rI48cHL",
+"2DREsqUJMd","bZLvSvOqCE","jS1ajfqypy","MezSWfaHir","VBjhztaOXK","0h1b1MaJQs","jfREuqUJMd","QnJ1SqUJMd","7Ow5C2Nslm","NOHsz2TRI7",
+"618DiCxVEf","SWfouCdyBV","gdQsSnnP8o","nnP8ofFDrJ","XflUq0BmCy","YjB9tFnPFB","C2IrchUTw7","CIShG9eoRc","sqVrf7fsYM","fqypyfcJOy",
+"Dz1R3WMiS3","b29RJMojnP","FLsph0BmCy","tuDySzqH0W","DLhzMTCgPp","i7WMQfcJOy","5Mg9rOHaBz","pT8wuOxWIH","1j5L87fsYM","618DiMm8si",
+"KZamHFcWrW","2TRI7lpF6W","WmadAuLtKs","EoToPNOHsz","QChxsDQimp","UmaEvcL0aE","FwEJzpiJSk","v2eC3pv0i7","LDk6fbgJAz","Z4I1vdjsrv",
+"MGlTFLDk6f","cQOnvsoy9t","bZLvSlj07Q","Yf2Ec9rlg9","WPmlxtaOXK","Cp3mZK20wK","C2IrccL0aE","1LB1LOUYuF","WreyPjtn0X","yofH3FGzgp",
+"7fKYUWMiS3","24ARFVerEA","24ARFL7cGc","G1RhSk85Ae","0ao3ldjsrv","okgRipWiOs","e6e4z2Nslm","dmoS7uTacx","MezSWuupzk","WPmlxChuy3",
+"vkCHHsuY4x","e6e4z3weIF","Yf2EcJKWYR","Vprf2IjTwP","t98iW9rlg9","ulk41fFDrJ","DcpWBGv3Fq","jtn0X0YAGH","oVQp6BbwgA","l83UdGv3Fq",
+"8hJdtcL0aE","ydG8Ulm0pD","LDk6fhSSvQ","Ss0ZujzUqR","24ARFMojnP","lpF6W8TxD7","BGaQYMojnP","07n1ch1zcH","BGaQYQ6hMC","yToGWVNCPd",
+"FhtglHP433","ReKEW2TRI7","MK07YKASQ8","gdQsSni2v1","4dEz6cShY2","Ul4a1uvf7A","AOgEeOz8yZ","BFkb8RpBQm","blLA91v5hH","iwzGksoy9t",
+"pT8wupWiOs","Gv3FqdQ586","Vprf2IRh48","AgJHQBbwgA","qaofNCfgr3","WPmlx9rlg9","h1zcHBFkb8","jtn0Xe6e4z","fmIK1tAOsr","Ta8f6No0Qb",
+"5Drn0fcJOy","8cVD39GXkX","ZuDtDpv0i7","2DREsBCxeC","2Yz7EAmdQd","I7p2a45cIH","MojnPvkCHH","0KyfsksJby","WaWsvJkzUn","FFDuiL7cGc",
+"AmdQde6e4z","hSSvQCfgr3","ZJTXHVLTy6","hYBCKMm8si","2Yz7EwiHrZ","ZUnqtCfgr3","bgJAzRxrsm","M6qcGuvf7A","VLTy6zHF1q","v1HlnnnP8o",
+"MmKGJJXljW","OHaBzQworu","tl72WBFkb8","618DiyEfy9","Kr8ys07n1c","Ss0ZuPYBf4","16lHcuLtKs","uvf7AKASQ8","9rlg9sqVrf","MmsIoxReec",
+"qQxHPsqVrf","U3yw55drc6","tvdkDtAOsr","TwanoCNHmv","2hEEUYw2oU","zFgtBguMb8","atef2ksJby","ReKEWSjskQ","iqv4k4QMc9","hUTw76q6L9",
+"d85a9lXFOB","uupzkM3zXL","RpBQmsoy9t","45cIHm4bxU","FxX9qQnJ1S","prNT6TXQ0Z","X6PinDLhzM","FLsph9GXkX","okgRiUmaEv","0KyfslweGy",
+"WaWsvpiJSk","blLA9AXpwE","W3VFHJ2mQi","G1RhStaOXK","qaofNvLsmS","2NslmW7cTs","dhSuHQnJ1S","iqv4kQ6hMC","RsQUqRACuj","0ao3lF6PT2",
+"tl72WIjTwP","StlDJY1mC0","LDk6fd85a9","pFrrlFGzgp","RpBQmGXdoH","tjQxslweGy","fLNg8GSQwj","ix74rprNT6","7lUXZGXdoH","KASQ8jeskS",
+"FFDuiD6rBy","pWiOsfFDrJ","EdBKcSbRYy","rhl0Jru4UG","uTacxW3VFH","lsQGozqH0W","qaofNuN6r3","EdBKcrz7Ut","U3yw57hyVv","7hyVv618Di",
+"faHir8xEKz","SbRYyuoStw","rz7Ut5IhmG","zmLYDUmaEv","F6PT245cIH","XyPZNDG4sT","7ku1pYh1hF","Ul4a1FcWrW","55rfB8hJdt","5iGN55IhmG",
+"0ao3lWaWsv","K4GS8B3qem","Zv7z0ciuWz","yvOMIZuDtD","gjUTuUmaEv","ciuWzgf8rI","t98iWs93Ml","gdQsSHRxd8","yToGWv1Hln","cShY2s93Ml",
+"0Wr5yjfREu","J2mQi0MR5X","1v5hH8FmFH","Fhtgld85a9","KASQ8gf8rI","BpYhVQnJ1S","kZANm2ZHdk","M6qcG55rfB","QnJ1SaDGtS","TCgPp7ku1p",
+"uJScXJXljW","nnP8oOz8yZ","IBe8kjtn0X","yEfy9AkKTk","48cHLWPmlx","8RCUA8RCUA","djsrvB3qem","IRh48JRJQB","iwzGkQnJ1S","WMiS3lpF6W",
+"zqH0WOxWIH","FcWrW48cHL","VBjhzxciqp","hUTw7B3qem","2NslmtlILt","zQt6Qxciqp","vLsmS7hyVv","0YAGHyofH3","MmKGJCNHmv","MmKGJTwano",
+"YjB9tLewvM","hUTw7zqH0W","jS1aj8FmFH","NOHsz5nmWv","qUJMdfqypy","EdBKc55rfB","UmaEvOz8yZ","7fKYUOHaBz","ciuWztlILt","lXFOBVprf2",
+"S77LHjzUqR","XflUqWreyP","yEfy9WmadA","prNT6HfyNQ","Oz8yZJRJQB","t98iWFnPFB","t98iWCxVEf","FGzgpZhwG1","EoToPRxrsm","8TxD7QnJ1S",
+"hi5X7taOXK","lpF6WcmXIX","okgRiLDk6f","mX2GE5ZaEz","uvf7AKsjRK","Yw2oUlH1kt","Yw2oUPYBf4","8RCUAFxX9q","AIYUutlILt","TXQ0Zru4UG",
+"5nmWvuupzk","WreyPsqVrf","DG4sTy94nw","BFkb8d7vjM","LDk6fYOfrY","ZuDtD0BmCy","qUJMdRsQUq","Mkgy8VjCZq","ECMvU24ARF","55rfBJJs5m",
+"zFgtBCK5W7","9GXkXzQt6Q","In3NSSbRYy","s93Mll83Ud","In3NSa00b5","OxWIH3otm6","45cIH8U2nU","dhSuHCxVEf","d85a9HlUbF","jtn0XBbwgA",
+"lpF6WfFDrJ","5VZjSLDk6f","2hEEUnFqik","aDGtS4dEz6","Fhtglzz4ZU","zY1GYJKWYR","8RCUAFPfSE","TCgPpSjskQ","8TxD7SmGzv","FFDuibgJAz",
+"bgJAzh1zcH","nnP8oQnJ1S","07n1c2ZHdk","CIShGPYBf4","EOE1oQnJ1S","faHir6q6L9","AXpwE0BmCy","jtn0XZuDtD","9y4lwIRh48","Nxx9ViKqhr",
+"uZPqgzz4ZU","StlDJD6rBy","7fKYUs7Mxk","iwzGki7WMQ","XyPZNF6PT2","MK07Y0YAGH","fmIK1i7WMQ","uPX7GL7cGc","o8UydyEfy9","i7WMQHzZT8",
+"LewvMWaim6","zmLYDuTacx","atef2CIShG","FLsphdpe1v","pT8wuSbRYy","ix74rdQ586","yToGWuJScX","O3iyQO3iyQ","o8Uyd29QAz","RkQkeS2Dfu",
+"QYxC0aFFss","0BmCytjQxs","IBe8kGv3Fq","azIWp8RCUA","Yh1hFQClRL","7lUXZHlUbF","ogLgcDcpWB","NAFuw64s8N","QClRLnnP8o","s4786GrDg7",
+"5ZaEzDcpWB","5IhmGPOUYS","580YDNOHsz","Dz1R3S77LH","QssNC07n1c","0ao3lrhl0J","qaofNXyPZN","HfyNQzHF1q","iqv4kFGzgp","lH1ktCqqaD",
+"KZamH2DREs","rhl0JiB08l","F6PT2Oz8yZ","tjQxsAkKTk","I7p2a16lHc","UmaEv6q6L9","Z4I1vbZLvS","VerEAd85a9","gdQsSBFkb8","FNYIMMmKGJ",
+"Kr8yslpF6W","Yf2EcxXTI4","0KyfsQbxXc","45cIHdmoS7","pWiOsguMb8","h1zcHOHaBz","m4bxUQChxs","9GXkXzz4ZU","FhtglIjTwP","FVMxo9y4lw",
+"pWiOsBbwgA","0YAGHuTacx","e6e4zU3yw5","QnJ1SYw2oU","S77LHReKEW","ReKEWtAOsr","lj07QGSQwj","BGaQYZuDtD","8FmFHlCMxy","RmDcrciuWz",
+"StlDJYh1hF","x3LDeVerEA","580YDtlILt","lweGyK20wK","5iGN5Nxx9V","lsQGoMm8si","55rfB48cHL","O3iyQ0YAGH","AXpwEWDVWJ","xReecDcpWB",
+"ix74rdpe1v","aFFssatef2","2Nslmuupzk","lj07QgdQsS","4W0TliwzGk","djsrvBGaQY","aDGtSY1mC0","8xEKzQnJ1S","DLhzM3otm6","TwanohSSvQ",
+"EdBKcW7cTs","HfyNQsoy9t","OUqFMQnJ1S","QWxoTyvOMI","uTacxokgRi","d85a9IRh48","C2Irc0MR5X","k85AeMaJQs","jiVBPuTacx","5iGN5J2mQi",
+"uupzkcL0aE","OxWIHSbRYy","FVMxo6AFT0","rz7UtRmDcr","gf8rIRxrsm","brhlQZuDtD","HlUbFG1RhS","b29RJ9GXkX","HRxd8oQ87r","zz4ZUkB5nP",
+"n8pJ9pFrrl","CNHmvAXpwE","cL0aEhUTw7","wDajXW7cTs","FLsphtuDyS","CNHmvGv3Fq","NcICATwano","jfREuuLtKs","WmadA07n1c","RBhp0AXpwE",
+"AmdQdi3pyd","580YDv2eC3","LDk6fKASQ8","fLNg8uTacx","1j5L8JIqXi","KASQ8Mkgy8","4QMc9tl72W","XyPZN0MR5X","lweGyCfgr3","YjB9t5nmWv",
+"VNCPd8TxD7","t59lRnFqik","gdQsSFnPFB","TXQ0ZZuDtD","Ta8f6CdyBV","BpYhVBpYhV","FwEJzCIShG","0PktI8xEKz","fmIK1XflUq","NOHszU3yw5",
+"FPfSE3otm6","YOfrYZuDtD","nlaByQYxC0","FFDuiNcICA","Ss0Zu5VZjS","CNHmvaDGtS","AIYUuqaofN","zQt6QjiVBP","gdQsSRkQke","Yh1hFuvf7A",
+"EOE1ofcJOy","jtn0XfFDrJ","o8Uyd1j5L8","s7MxkKsjRK","F6PT2hUTw7","wiHrZuTacx","VIlwPdpe1v","Q6LixcShY2","HzZT8tvdkD","AOgEeGXdoH",
+"7ku1p5iGN5","YjB9ty94nw","lkMUAulk41","RkQkeW3VFH","aDGtSHlUbF","HlUbFuAWyp","7Ow5CZUnqt","tjQxsjzUqR","FFDuifFDrJ","Oz8yZVprf2",
+"DQimpFcWrW","MmKGJDz1R3","zHF1qQworu","55rfBWmadA","FnPFBRkQke","uoStwgf8rI","2TRI7Yw2oU","EoToPpmeCd","iwzGkDcpWB","ECMvUUmaEv",
+"IjTwPzQt6Q","uJScX5Namm","8TxD7P6bcg","h1zcHJ2mQi","IjTwP8RCUA","jfREuM3zXL","RsQUqhUTw7","i7WMQiqv4k","dpe1vECMvU","Gv3Fqd7vjM",
+"64s8NyToGW","gdQsSGXdoH","YjB9tECMvU","580YD2DREs","QWxoTNhXdu","FNYIMFVMxo","VNCPdFVMxo","dpe1vBFkb8","cmXIXW7cTs","POUYSCxVEf",
+"mz8gx7Ow5C","RBhp0OxWIH","e6e4zReKEW","hSSvQulk41","EoToPtvdkD","hYBCKmX2GE","Zv7z0dQ586","LewvMF6PT2","jSjS30PktI","fcJOyYf2Ec",
+"SjskQt98iW","OHaBzFcWrW","FxX9qW3VFH","RBhp0HfyNQ","QbxXcJRJQB","0MR5X14FLR","GWqqXlH1kt","FLsphvLsmS","l83Udrhl0J","wDajXZJTXH",
+"Ss0ZuRxrsm","VNCPdlpF6W","BpYhVLDk6f","uTacxfqypy","XyPZNEdBKc","MezSWhi5X7","F6PT216lHc","BFkb8Mm8si","C2IrctuDyS","v2eC3VIlwP",
+"7Ow5C4W0Tl","XflUqAOgEe","FNYIMnFqik","POUYSTXQ0Z","Dz1R3jtn0X","rKDLJReKEW","9y4lwxciqp","ECMvU0YAGH","MezSW8hJdt","8FmFHuTacx",
+"RmDcrFLsph","lweGyWmadA","y94nwSWfou","pWiOsNAFuw","StlDJW7cTs","SbRYyZ4I1v","uN6r32DREs","VNCPdWMiS3","zY1GY8RCUA","K20wKBCxeC",
+"uQIczYw2oU","rhl0Jtl72W","zz4ZUM6qcG","ECMvUo8Uyd","uZPqgbgJAz","ZhwG1WaWsv","tuDySs93Ml","NAFuwzQt6Q","uN6r3CdyBV","HfyNQHzZT8",
+"WPmlxJkzUn","d85a9W3VFH","gdQsSCqqaD","07n1c0MR5X","WPmlxcQOnv","euZA5FPfSE","0YAGHhUTw7","VIlwPuPX7G","OUqFMKr8ys","No0Qbiqv4k",
+"n8pJ97lUXZ","guMb8yToGW","AkKTkgjUTu","dQ586jtn0X","SbRYy45cIH","L7cGcCxVEf","RsQUqdjsrv","aL6AJ9eoRc","5ZaEz2Yz7E","uLtKsokgRi",
+"0BmCy2DREs","ru4UG8RCUA","lH1ktS77LH","ix74ratef2","tjQxsYf2Ec","StlDJVprf2","XyPZNn1pmO","9GXkX55rfB","JJs5miwzGk","S2DfuiB08l",
+"iKqhr9GXkX","k85AeFxX9q","lweGyVBjhz","In3NSxciqp","iwzGkdjsrv","P6bcgCNHmv","b29RJlweGy","y94nwjeskS","lm0pDzY1GY","QChxsGSQwj",
+"EoToPfcJOy","4QMc90h1b1","9rlg9uN6r3","OxWIHbrhlQ","RpBQmK4GS8","uN6r3Yh1hF","hE1QlvLsmS","9eoRcaDGtS","0h1b1h1zcH","S77LHokgRi",
+"7hyVv14FLR","MGlTF5Drn0","okgRi618Di","0Wr5yBCxeC","TwanoCIShG","hi5X7uZPqg","VerEAdhSuH","taOXKru4UG","oVQp6QClRL","oGu6xLDk6f",
+"yofH3piJSk","rKDLJzmLYD","TCgPpru4UG","pT8wuTa8f6","FwEJzFxX9q","RpBQmulk41","fcJOyZUnqt","WDVWJpAhR1","QWxoTbZLvS","aez9yhe9IA",
+"2NslmYw2oU","tjQxs6AFT0","fLNg8bgJAz","qUJMd2Yz7E","cmXIX9eoRc","vkCHH0Wr5y","FcWrWSmGzv","pv0i7pAhR1","zFgtBzbIYY","ZhwG1s93Ml",
+"VIlwPVNCPd","h1zcHHzZT8","rz7UtI7p2a","i3pyd5nmWv","fFDrJFcWrW","7fsYMrhl0J","Twanod85a9","Yf2EcdQ586","jSjS3soy9t","WMiS3P6bcg",
+"ZJTXHAgJHQ","EdBKckB5nP","pWiOspWiOs","uLtKsYh1hF","J2mQiUlU3M","1j5L8HfyNQ","CdyBV9XyT9","iKqhrjfREu","OxWIHTXQ0Z","5VZjSeuZA5",
+"0ao3llpF6W","F6PT2dhSuH","lkMUA8U2nU","lweGypiJSk","uZPqguupzk","oVQp6yofH3","MezSWBpYhV","QYxC0ulk41","FGzgpprNT6","6q6L9580YD",
+"nlaByZzJHW","MojnPlsQGo","9rlg9i7WMQ","RpBQmlCMxy","0BmCyK4GS8","Oz8yZdQ586","d85a9NhXdu","LbRTHFhtgl","WreyPk85Ae","n1pmOv8yFN",
+"UlU3MW7cTs","BpYhVThjNn","MK07YfLNg8","45cIH8FmFH","0KyfsogLgc","mX2GEaL6AJ","OUqFMFVMxo","F6PT2hSSvQ","VBjhzHP433","Ul4a1Nxx9V",
+"blLA9Q6Lix","tlILt0Wr5y","4W0TlHP433","Oz8yZpvgjS","3weIF1LB1L","BCxeCvkCHH","uPX7GQClRL","RzaZATXQ0Z","GWqqXL7cGc","DQimpFGzgp",
+"8TxD7cQOnv","8hJdtYf2Ec","uPX7GxXTI4","2DREshSSvQ","ksJbyn8pJ9","NOHszfaHir","NAFuwh1zcH","Zv7z0i3pyd","8cVD3lsQGo","jeskSfcwDa",
+"7X3uyzFgtB","5IhmGGXdoH","gdQsSyluBx","rz7Ut7X3uy","SWfouX6Pin","Ss0ZuiKqhr","Dz1R30MR5X","fcJOy0h1b1","cmXIXjzUqR","uTacx9y4lw",
+"0MR5XjzUqR","IKxdLuoStw","fmIK1EOE1o","EoToPJJs5m","Pb1pajzUqR","P6bcgaL6AJ","F6PT27fsYM","CxVEfFhtgl","lkMUAbgJAz","Ul4a1Ul4a1",
+"S77LHksJby","a00b5sx5Gl","nnP8olm0pD","07n1c9eoRc","b29RJJKWYR","bgJAziwzGk","WaWsvMK07Y","v2eC3t98iW","4QMc94dEz6","iKqhrdQ586",
+"jS1ajjiVBP","iB08lCNHmv","zQt6QgdQsS","Z4I1vv1Hln","okgRi7X3uy","CxVEf45cIH","sx5GlAIYUu","tl72WbZLvS","S2DfunFqik","C2IrcTa8f6",
+"WmadAn8pJ9","y94nwUlU3M","uTacxjtn0X","ZhwG1ni2v1","QClRLQChxs","uZPqg48cHL","0PktIpAhR1","fcJOys7Mxk","pvgjSzQt6Q","pWiOsciuWz",
+"s7Mxk618Di","1LB1LWmadA","lj07QzmLYD","Vprf2TCgPp","xReecGv3Fq","zqH0Wk85Ae","3weIFdhSuH","9iGoTFxX9q","3otm6uN6r3","UmaEvn1pmO",
+"W3VFHAOgEe","jiVBPCfgr3","IjTwPfcJOy","In3NSydG8U","X6PinvkCHH","ogLgcHRxd8","IRh48kZANm","YOfrYi3pyd","0BmCylViBv","7fsYM618Di",
+"DG4sTIRh48","VLTy6pAhR1","RACujzFgtB","lViBv55rfB","jfREusqVrf","WPmlxTCgPp","YjB9tjfREu","SbRYyKZamH","aDGtStuDyS","bZLvSqaofN",
+"Kr8ysQssNC","ReKEWYw2oU","Nxx9VJKWYR","xReecuoStw","7X3uyTXQ0Z","xXTI4MmKGJ","Vprf28RCUA","d7vjMaL6AJ","7fsYMRBhp0","5nmWv2hEEU",
+"FcWrW9eoRc","ydG8UBbwgA","y94nwHRxd8","fLNg8BCxeC","fFDrJZhwG1","iqv4kguMb8","GXdoHVprf2","jSjS3Ul4a1","iqv4kpFrrl","zHF1qYf2Ec",
+"oGu6x9GXkX","580YD9iGoT","2DREsfcJOy","jtn0XYOfrY","azIWp9iGoT","aDGtSogLgc","uvf7ARxrsm","RpBQmZuDtD","8RCUAQClRL","BbwgAxciqp",
+"RzaZAW7cTs","lCMxyOUqFM","wiHrZGWqqX","JJs5maFFss","4dEz6brhlQ","lweGy7fsYM","HlUbF5Drn0","14FLRgjUTu","uN6r3pmeCd","zz4ZUjzUqR",
+"JkzUnQssNC","FVMxoazIWp","8U2nUJIqXi","RBhp0t98iW","In3NSVjCZq","yofH3ulk41","24ARFW3VFH","SbRYyYOfrY","aL6AJlkMUA","2NslmQnJ1S",
+"580YD7ku1p","HRxd8gjUTu","0ao3l4dEz6","prNT6Yf2Ec","FFDuiM6qcG","ksJbyrKDLJ","m4bxU3otm6","CxVEfyluBx","RxrsmhE1Ql","Zv7z0brhlQ",
+"hUTw7piJSk","lm0pDZzJHW","HRxd8Pb1pa","lm0pDaez9y","zFgtB2TRI7","hYBCK2Nslm","BCxeCaL6AJ","BGaQYSjskQ","Yf2EcMK07Y","SmGzvYw2oU",
+"cL0aEyToGW","GXdoHFLsph","FVMxoStlDJ","bZLvSaL6AJ","6AFT0hYBCK","0PktIkZANm","yEfy9Mkgy8","rz7UtFjHXR","yToGWBpYhV","Nxx9VVjCZq",
+"vOqCERzaZA","cL0aE2TRI7","oQ87ryluBx","MmsIolweGy","0ao3lZuDtD","In3NSDLhzM","he9IAMezSW","zQt6Q580YD","fqypy0Wr5y","2DREsmz8gx",
+"jiVBPAOgEe","d85a9WreyP","L7cGcB3qem","I7p2aOHaBz","1j5L84W0Tl","tuDySni2v1","QChxss4786","lm0pDm4bxU","fqypys93Ml","ZJTXHoGu6x",
+"uupzkmz8gx","jeskSuPX7G","uN6r3blLA9","DQimp1j5L8","sqVrf5ZaEz","jS1ajokgRi","n8pJ9DQimp","k85AewDajX","MK07YKZamH","XyPZNAmdQd",
+"NcICAQClRL","hi5X79XyT9","WreyPtjQxs","gjUTufqypy","0PktIGSQwj","MojnPv1Hln","e6e4z7ku1p","Waim6LewvM","fcwDafcJOy","pFrrlix74r",
+"5iGN5G1RhS","U3yw5LbRTH","AkKTkB3qem","soy9tpT8wu","ix74rTCgPp","AkKTkSWfou","gIYvE8TxD7","pWiOsNo0Qb","45cIHQWxoT","AOgEeNAFuw",
+"K20wKZUnqt","Uvlv4In3NS","i7WMQatef2","VLTy6AmdQd","45cIHlm0pD","Vprf2VBjhz","guMb89iGoT","hUTw7oGu6x","yofH3CxVEf","lpF6W9rlg9",
+"uAWyplweGy","y94nwFNYIM","uJScXIn3NS","1LB1L5IhmG","XyPZNx3LDe","vLsmSl83Ud","RpBQmF6PT2","iqv4kiKqhr","5nmWvtl72W","hYBCK64s8N",
+"pvgjSP6bcg","AgJHQEoToP","Q6Lixo8Uyd","y94nwfqypy","64s8NPb1pa","YOfrYuTacx","qaofNbgJAz","AkKTkUl4a1","BFkb85nmWv","ZJTXHsoy9t",
+"JXljWGrDg7","DLhzMiKqhr","DG4sT55rfB","uupzkfaHir","FjHXRydG8U","CIShG0YAGH","zQt6QGSQwj","VerEAFVMxo","uoStwZ4I1v","Yh1hFIjTwP",
+"ru4UGWaim6","qUJMd6q6L9","iB08lrhl0J","oQ87rWaWsv","pWiOs9iGoT","vkCHHy94nw","EdBKcPb1pa","fqypy0ao3l","hUTw7RBhp0","Vprf2Pb1pa",
+"tuDySwiHrZ","dQ586580YD","hi5X74W0Tl","HlUbFo8Uyd","9iGoTFVMxo","2ZHdkyvOMI","DLhzMPb1pa","Qworu5VZjS","VIlwPBGaQY","ni2v1iqv4k",
+"Waim6ydG8U","VLTy6jfREu","618DilViBv","tl72W9y4lw","n8pJ9rhl0J","AgJHQL7cGc","7fKYUVIlwP","Nxx9VOz8yZ","a00b5D6rBy","yluBxIjTwP",
+"IKxdL5VZjS","QnJ1SiB08l","zHF1qIRh48","k85AeJRJQB","euZA5uvf7A","gdQsSAXpwE","hUTw7pAhR1","P6bcgFVMxo","16lHc5Namm","faHirtuDyS",
+"ni2v1vOqCE","2ZHdkiwzGk","VNCPdqUJMd","D6rByd85a9","ECMvUQnJ1S","9rlg9AIYUu","5Drn0MaJQs","MezSWDcpWB","dpe1v48cHL","DG4sTgjUTu",
+"Gv3Fqrhl0J","hUTw7a00b5","iqv4k2DREs","5Mg9r48cHL","HzZT864s8N","VerEAfaHir","JIqXisuY4x","9y4lweuZA5","lm0pDOUYuF","Mm8sijtn0X",
+"Chuy3MmsIo","YOfrYThjNn","xReecAmdQd","o8UydCK5W7","FFDuiFwEJz","KASQ8In3NS","ZhwG1U3yw5","8TxD79XyT9","MojnPAgJHQ","S77LHChuy3",
+"b29RJWreyP","VIlwPECMvU","n8pJ9cL0aE","BFkb8DQimp","aez9yrz7Ut","4W0TlEdBKc","CIShGOz8yZ","taOXKyEfy9","Yh1hFfFDrJ","lXFOB0Wr5y",
+"rhl0J5Namm","2Yz7EfcJOy","atef2AXpwE","16lHc16lHc","cShY2MmKGJ","GXdoHnFqik","7fKYUP6bcg","JkzUnaez9y","M3zXLBCxeC","NAFuwAkKTk",
+"tuDySFcWrW","fqypySjskQ","Oz8yZD6rBy","UlU3MThjNn","8U2nU0Kyfs","ciuWzSs0Zu","RsQUqFGzgp","MmsIos93Ml","lsQGoQnJ1S","OUYuF8FmFH",
+"Q6Lixd7vjM","Ss0ZuEoToP","7X3uy9iGoT","t59lRYh1hF","W7cTs0BmCy","uQIczMkgy8","OHaBzwiHrZ","qaofNYh1hF","nFqik3weIF","dQ586VjCZq",
+"lpF6Wk85Ae","lsQGos93Ml","cShY2GSQwj","mz8gxI7p2a","7X3uyuoStw","lkMUAI7p2a","fmIK1NOHsz","K4GS8mz8gx","Chuy3RmDcr","WreyPuupzk",
+"dmoS7jeskS","JKWYRl83Ud","3otm6Ta8f6","9iGoTyluBx","tAOsr5IhmG","TCgPpJkzUn","jiVBPK4GS8","FGzgpRkQke","Pb1pay94nw","uQIczksJby",
+"RsQUqpiJSk","QbxXcv1Hln","qUJMdNAFuw","Mm8siYw2oU","5Mg9rrKDLJ","M6qcGuZPqg","KsjRK7Ow5C","HRxd8d7vjM","iqv4kk85Ae","CK5W7euZA5",
+"B3qemJkzUn","cShY2AkKTk","CqqaDlH1kt","POUYSNOHsz","BCxeCYw2oU","KsjRK8xEKz","1j5L8zmLYD","d85a9XyPZN","d7vjMOz8yZ","L7cGcECMvU",
+"YjB9tcmXIX","AXpwEAOgEe","9y4lw8xEKz","Nxx9VStlDJ","t98iWZJTXH","5drc6m4bxU","GrDg7WmadA","4QMc9v2eC3","F6PT2kZANm","CdyBVyEfy9",
+"RxrsmtaOXK","uQIczjzUqR","cmXIXNhXdu","cQOnvRkQke","CxVEfRkQke","GXdoHzbIYY","NhXduRkQke","AkKTkWDVWJ","lm0pDuZPqg","pmeCdtjQxs",
+"8RCUAjiVBP","b29RJFGzgp","o8UydVerEA","StlDJxciqp","0BmCyzY1GY","tuDySpFrrl","SjskQnlaBy","BbwgAbrhlQ","zmLYDuJScX","CdyBVQssNC",
+"JkzUnrKDLJ","TwanoIKxdL","BpYhVulk41","l83Ud7fKYU","6q6L9LewvM","iqv4klweGy","NOHsztuDyS","UlU3MpmeCd","NcICAnnP8o","0MR5X0YAGH",
+"he9IAm4bxU","guMb814FLR","aL6AJfcwDa","HfyNQMezSW","gtCA524ARF","RzaZAuTacx","MK07YPYBf4","fqypyxXTI4","ThjNn6q6L9","jzUqRjfREu",
+"LewvMfFDrJ","8hJdtpFrrl","AXpwEzHF1q","FPfSERBhp0","xReec1v5hH","GrDg7brhlQ","ZJTXHCfgr3","jtn0XTXQ0Z","o8UydZJTXH","gf8rIoGu6x",
+"FhtglJKWYR","guMb8fmIK1","HzZT81LB1L","tvdkD2ZHdk","VerEAJIqXi","hYBCKK20wK","euZA5RpBQm","i7WMQ2TRI7","WaWsvfLNg8","xciqpGrDg7",
+"s93MlOxWIH","hE1QlSjskQ","KASQ8VjCZq","x3LDet59lR","JIqXiksJby","cmXIXM3zXL","Yh1hF9iGoT","J2mQi9rlg9","FFDuiHP433","ix74rlm0pD",
+"lH1ktuoStw","ZJTXHaL6AJ","cL0aE5Namm","tlILtprNT6","fqypylkMUA","MaJQsNcICA","UlU3MJIqXi","t98iWBCxeC","uLtKsQworu","2TRI7WPmlx",
+"fcJOyMaJQs","jSjS3uAWyp","zmLYDRxrsm","5Mg9rfcJOy","okgRi1v5hH","5Namme6e4z","7lUXZJkzUn","iB08lCqqaD","0Kyfszz4ZU","Y1mC0EdBKc",
+"9XyT9soy9t","FcWrW3otm6","fmIK17fsYM","IBe8k8hJdt","7X3uy1LB1L","BGaQYoVQp6","2DREsTwano","lCMxy8RCUA","rz7UtUl4a1","taOXKAIYUu",
+"1LB1LReKEW","s7MxkiB08l","xReec4QMc9","a00b57lUXZ","TXQ0ZStlDJ","2ZHdk0YAGH","VLTy6s93Ml","nFqikuvf7A","QbxXcVprf2","uoStwAXpwE",
+"zHF1q3otm6","cShY2NcICA","Ss0ZuzHF1q","CqqaDCfgr3","7fKYUUvlv4","jeskSn1pmO","DcpWBqUJMd","y94nwhYBCK","wDajXLbRTH","soy9t8FmFH",
+"XflUquoStw","NhXduaez9y","Ss0ZumX2GE","OHaBzFPfSE","BpYhVBbwgA","oGu6x8cVD3","M6qcGeuZA5","7X3uydjsrv","tlILtEdBKc","4W0TltAOsr",
+"oVQp6X6Pin","9eoRcx3LDe","lweGyCIShG","iwzGk16lHc","5ZaEzbZLvS","gIYvENo0Qb","sx5GlhSSvQ","lCMxyNhXdu","fqypy5Mg9r","Rxrsm7ku1p",
+"bZLvStvdkD","l83UdBGaQY","2NslmGv3Fq","DQimpWPmlx","CdyBVBGaQY","2DREs7ku1p","MmsIoFVMxo","POUYSWMiS3","tjQxsS77LH","kB5nPFGzgp",
+"YjB9taL6AJ","EoToPokgRi","Ta8f6aL6AJ","suY4x7hyVv","FPfSEh1zcH","9y4lwGWqqX","zmLYDd85a9","JIqXi3weIF","ru4UGQ6hMC","2hEEUi3pyd",
+"zqH0W7hyVv","pWiOssoy9t","0PktIB3qem","lpF6WHP433","jeskSzY1GY","uQIcztlILt","hUTw72Yz7E","jeskSZzJHW","bgJAzCxVEf","djsrvuLtKs",
+"7lUXZ8U2nU","ru4UGChuy3","29QAzNAFuw","EoToPdQ586","bgJAzjSjS3","xciqpKsjRK","9eoRc6AFT0","ZJTXHBCxeC","14FLRb29RJ","GWqqXY1mC0",
+"jeskSMm8si","sx5GllCMxy","fmIK13weIF","XyPZNG1RhS","wDajXrhl0J","7lUXZPYBf4","AmdQdjSjS3","dpe1v7lUXZ","ix74r1j5L8","Dz1R3Yw2oU",
+"SmGzvzqH0W","RzaZA2hEEU","8TxD7M3zXL","CNHmvzHF1q","sqVrfNcICA","FVMxotjQxs","uoStwMezSW","k85AeX6Pin","vkCHHRpBQm","Waim6d7vjM",
+"pT8wuQClRL","fLNg8ni2v1","2TRI7CxVEf","SjskQ0h1b1","LewvMM3zXL","7X3uyAkKTk","HP433LewvM","P6bcg9y4lw","tAOsrprNT6","lm0pD9eoRc",
+"JkzUn2Nslm","guMb8ZuDtD","LbRTHVerEA","bgJAzHlUbF","m4bxU5VZjS","zqH0W16lHc","fcJOyYw2oU","yofH3lCMxy","QWxoToQ87r","v8yFNGXdoH",
+"FhtglBFkb8","BFkb8yToGW","o8UydtuDyS","zbIYYx3LDe","HfyNQlm0pD","k85AeblLA9","guMb8Rxrsm","d85a9n8pJ9","lj07Q5IhmG","azIWpsuY4x",
+"8U2nUuvf7A","ZzJHWm4bxU","EoToPaL6AJ","Yh1hFlViBv","FFDuidhSuH","618Di580YD","D6rBySWfou","9eoRc9rlg9","aez9y580YD","jS1aj3otm6",
+"0MR5X7Ow5C","ECMvU07n1c","VLTy6KZamH","zqH0WazIWp","No0QbPb1pa","h1zcHlCMxy","jfREu2ZHdk","uLtKsxXTI4","MezSWVIlwP","AOgEeokgRi",
+"uPX7GOUqFM","lweGyVNCPd","Mm8sinlaBy","aFFssI7p2a","0BmCy5Drn0","Yw2oURACuj","mz8gxk85Ae","MmKGJv1Hln","aez9yuAWyp","W3VFHgtCA5",
+"QnJ1SyEfy9","Q6hMCs93Ml","gjUTu24ARF","In3NS5IhmG","Qworu7fsYM","uvf7APOUYS","mz8gxlCMxy","KASQ8HP433","v2eC3faHir","gjUTuZhwG1",
+"SbRYyYh1hF","GrDg7rhl0J","RkQkeuN6r3","W7cTsBpYhV","0ao3lQChxs","29QAzTCgPp","jS1ajaL6AJ","WDVWJQnJ1S","GSQwjlXFOB","0BmCyYjB9t",
+"8xEKzjS1aj","5nmWvo8Uyd","QnJ1SaL6AJ","mX2GERmDcr","nFqikuJScX","jfREu8cVD3","m4bxUcL0aE","xXTI4FjHXR","NAFuwZUnqt","QYxC0dpe1v",
+"29QAz618Di","YjB9tpAhR1","Cfgr3dQ586","hUTw7ZzJHW","0YAGHQssNC","ksJbyt98iW","lweGyMm8si","mz8gxiB08l","b29RJ9rlg9","okgRiaL6AJ",
+"vkCHH7X3uy","l83UdVLTy6","Cfgr3LewvM","tjQxsO3iyQ","J2mQiCdyBV","SWfouyToGW","s93MlaL6AJ","YjB9tIn3NS","JRJQBM3zXL","mX2GED6rBy",
+"dQ586guMb8","m4bxUL7cGc","s7MxkSjskQ","mX2GE5VZjS","RBhp0s93Ml","5iGN5QChxs","4dEz68hJdt","5Drn014FLR","djsrvlj07Q","jtn0X6AFT0",
+"vkCHHo8Uyd","7lUXZkB5nP","t59lRyofH3","RpBQmKr8ys","7X3uyQbxXc","OHaBzn1pmO","fcJOyQChxs","Yf2Ec5Mg9r","24ARF64s8N","4QMc9yofH3",
+"9iGoTlkMUA","LDk6fGWqqX","QbxXcQClRL","brhlQReKEW","XyPZNpmeCd","QworuPOUYS","GXdoHRkQke","s93MlU3yw5","Yh1hFatef2","azIWp07n1c",
+"rhl0JVNCPd","HfyNQuN6r3","uvf7AfcJOy","SWfoudpe1v","QWxoT2TRI7","AXpwEa00b5","qaofNMmsIo","3otm6580YD","mz8gxW3VFH","0h1b1b29RJ",
+"DQimpVjCZq","yvOMItl72W","K20wKRxrsm","v2eC36AFT0","CIShGTCgPp","Cfgr3FwEJz","lCMxy0YAGH","dmoS7AkKTk","hUTw7nFqik","55rfBzz4ZU",
+"azIWpMezSW","NAFuwEoToP","4QMc95iGN5","Q6hMC7ku1p","v1HlnokgRi","Ul4a1OUYuF","K20wKpFrrl","a00b5uLtKs","5drc6MGlTF","TXQ0Zt59lR",
+"GSQwjQnJ1S","jeskS07n1c","tlILt3weIF","2Yz7EFNYIM","Ul4a1jS1aj","CxVEfMojnP","jtn0Xs93Ml","EoToPQssNC","RkQkeNOHsz","nlaByDG4sT",
+"uLtKs1LB1L","SWfouOHaBz","I7p2aIn3NS","okgRiuLtKs","uQIczuAWyp","Nxx9VUlU3M","BGaQY1v5hH","hSSvQZzJHW","euZA5xReec","RkQkeNhXdu",
+"oVQp6QChxs","x3LDeNxx9V","tjQxsG1RhS","blLA907n1c","IRh48fFDrJ","hE1Qldpe1v","2DREsyEfy9","ulk419GXkX","POUYSJJs5m","cL0aEeuZA5",
+"Q6hMC1j5L8","iqv4kOz8yZ","oVQp6vOqCE","OUqFMSbRYy","MmKGJEOE1o","brhlQ8cVD3","v2eC3HlUbF","l83UdgtCA5","2NslmFGzgp","5iGN5StlDJ",
+"AXpwEUvlv4","Pb1pa1j5L8","s93MlEOE1o","3otm67ku1p","ECMvUMm8si","s4786azIWp","gf8rIsx5Gl","fqypyzmLYD","VjCZq8FmFH","BGaQYpFrrl",
+"ZuDtD7ku1p","MaJQsUvlv4","ZJTXHK20wK","Yf2Ec7X3uy","QbxXcnFqik","lj07Qs4786","Ss0ZupWiOs","hi5X7LbRTH","FcWrWuPX7G","Uvlv4618Di",
+"G1RhSuLtKs","Pb1paUl4a1","YjB9tB3qem","i7WMQpFrrl","IKxdLNxx9V","pWiOsoVQp6","ZJTXHuZPqg","jSjS3EoToP","FVMxoDz1R3","2TRI7J2mQi",
+"CxVEfs7Mxk","5VZjSuN6r3","uvf7AiB08l","Vprf2h1zcH","cmXIXulk41","jS1ajRBhp0","zHF1q580YD","HfyNQTCgPp","MmsIoVerEA","StlDJFhtgl",
+"XflUqAgJHQ","hYBCKQbxXc","RsQUqI7p2a","lkMUA5Mg9r","pFrrlBbwgA","WDVWJv8yFN","iB08lYf2Ec","X6PinpmeCd","Kr8ysCIShG","Ta8f6zmLYD",
+"uPX7G0Kyfs","MGlTFAIYUu","d85a9S77LH","0Kyfsrz7Ut","xXTI4ru4UG","14FLRs4786","he9IA2Nslm","07n1cyluBx","QnJ1SQnJ1S","WPmlxHP433",
+"iB08lQssNC","e6e4zAOgEe","B3qemm4bxU","pT8wuQworu","hUTw70Wr5y","jS1ajpiJSk","ZhwG1HP433","rz7UtAIYUu","tAOsr07n1c","RACujC2Irc",
+"ZzJHW5Mg9r","jS1ajAXpwE","SWfouWMiS3","gIYvEiwzGk","HP433Gv3Fq","FPfSEcQOnv","jtn0XTwano","suY4x0ao3l","fFDrJeuZA5","soy9tpFrrl",
+"ix74rhYBCK","7Ow5C9rlg9","i7WMQCp3mZ","iKqhrUl4a1","9rlg9SWfou","VBjhzIBe8k","29QAzFxX9q","lkMUARsQUq","0Kyfs4dEz6","D6rByWmadA",
+"MaJQsCfgr3","HlUbF2hEEU","hi5X7zmLYD","LbRTHnlaBy","5Drn0dpe1v","JJs5mru4UG","lweGySbRYy","7ku1pzqH0W","ZJTXHW7cTs","t98iW2TRI7",
+"NhXdu5Drn0","hi5X75VZjS","OxWIHYf2Ec","ZUnqtdjsrv","JkzUn2ZHdk","0MR5Xn8pJ9","C2IrcU3yw5","4W0TlZv7z0","AgJHQgjUTu","5Drn0Y1mC0",
+"7X3uyiqv4k","SWfou0h1b1","dpe1vn1pmO","vLsmS5ZaEz","5NammnlaBy","5iGN5WDVWJ","faHir1LB1L","tlILtNOHsz","HRxd8t98iW","qQxHPbgJAz",
+"DLhzMWaWsv","VLTy6In3NS","F6PT2kB5nP","TXQ0ZEoToP","OHaBzgIYvE","gIYvEVerEA","Vprf2mz8gx","OUYuF9rlg9","0Wr5y618Di","fqypyRBhp0",
+"RzaZAiqv4k","x3LDedmoS7","M3zXLUl4a1","FGzgpmX2GE","NOHszHP433","soy9tQssNC","fmIK1hE1Ql","nnP8o2Yz7E","fcJOyqQxHP","Ul4a1n1pmO",
+"MmsIoWMiS3","tAOsrAmdQd","5Mg9r5drc6","yEfy9zqH0W","FjHXRW3VFH","5nmWvQChxs","PYBf4cShY2","pWiOsx3LDe","DQimpThjNn","24ARFsx5Gl",
+"HP433pmeCd","BFkb8nnP8o","cL0aE0MR5X","45cIHb29RJ","7hyVvK4GS8","618DiWMiS3","OxWIHfLNg8","sx5GlIKxdL","B3qemjiVBP","lH1ktCIShG",
+"Cp3mZDLhzM","HRxd8LewvM","zqH0WQChxs","W3VFH7lUXZ","0MR5XQssNC","azIWp2hEEU","7lUXZlsQGo","9XyT92DREs","KZamHogLgc","wDajXzqH0W",
+"3otm6Vprf2","AmdQdJJs5m","MezSW5Namm","uJScXSs0Zu","KZamHGWqqX","pv0i7uupzk","BbwgAAOgEe","qUJMd5VZjS","zY1GYdQ586","uoStw24ARF",
+"ZzJHWoVQp6","ydG8UfLNg8","M3zXLD6rBy","qQxHPs7Mxk","dmoS7Yf2Ec","Yw2oUjtn0X","EOE1oJkzUn","blLA9iB08l","FLspha00b5","EoToPFLsph",
+"IjTwPXflUq","zQt6QmX2GE","6q6L9zQt6Q","RpBQmlkMUA","S77LHguMb8","s7MxktaOXK","piJSkiqv4k","b29RJfaHir","GWqqX9XyT9","he9IAhi5X7",
+"2Nslm45cIH","tAOsrF6PT2","580YD8U2nU","JJs5mnnP8o","blLA9MK07Y","29QAzFnPFB","rKDLJuTacx","48cHLFPfSE","Uvlv4Q6hMC","jS1aj0MR5X",
+"mz8gx7ku1p","MojnPJ2mQi","S77LH9XyT9","8FmFHpv0i7","tAOsrnlaBy","VNCPdb29RJ","d85a9pAhR1","Ul4a1vkCHH","nlaBytjQxs","yluBxGWqqX",
+"FGzgpuTacx","FFDuiWaWsv","dmoS7QssNC","JkzUns7Mxk","OHaBz0Kyfs","hUTw7DQimp","RzaZAQssNC","sx5GltjQxs","618DifLNg8","v8yFNQWxoT",
+"EdBKcgf8rI","0h1b1Mm8si","uPX7Gni2v1","X6PinqUJMd","DLhzM0h1b1","xXTI4ZuDtD","TXQ0Z29QAz","5nmWv0ao3l","wiHrZ1v5hH","Ul4a1kB5nP",
+"gdQsSaez9y","hE1QllweGy","StlDJ0BmCy","BGaQYv2eC3","qaofNNAFuw","580YDa00b5","KASQ8d85a9","FjHXRd7vjM","IKxdLAkKTk","kB5nPVNCPd",
+"tjQxswDajX","D6rByuvf7A","GWqqXWmadA","fqypyvOqCE","M3zXLY1mC0","gf8rIuJScX","Q6hMC618Di","IBe8kulk41","AkKTkTwano","CqqaDiB08l",
+"pT8wuWMiS3","ZJTXHBpYhV","suY4x5Namm","K4GS8wDajX","8TxD7IBe8k","RkQke5nmWv","ksJbyFFDui","8U2nUWDVWJ","Yw2oUQ6Lix","tl72WwiHrZ",
+"FPfSErhl0J","FxX9qAgJHQ","45cIHVNCPd","jiVBPXyPZN","m4bxUxReec","yofH37fKYU","X6PinuN6r3","MGlTFpAhR1","9rlg9JXljW","Oz8yZoGu6x",
+"m4bxUlH1kt","MezSW3otm6","6q6L9sqVrf","ZJTXHfcwDa","XyPZNjeskS","QssNCuLtKs","DG4sTYOfrY","pv0i7brhlQ","MGlTFn1pmO","l83UdMojnP",
+"blLA924ARF","2DREsm4bxU","AmdQdnnP8o","FnPFBx3LDe","uupzkHP433","gdQsSoVQp6","oVQp6KsjRK","0Wr5yfmIK1","ZJTXH7lUXZ","lkMUAyvOMI",
+"xciqpNo0Qb","9iGoTiwzGk","cQOnvl83Ud","Q6hMC16lHc","4QMc9MezSW","Waim6b29RJ","uTacx7hyVv","tlILtzz4ZU","hE1Qlpv0i7","prNT6D6rBy",
+"QWxoTFLsph","UlU3MX6Pin","sx5GluJScX","YjB9tWMiS3","nnP8ojSjS3","MmKGJVjCZq","S2DfuyluBx","QssNCa00b5","h1zcH16lHc","7hyVvQ6Lix",
+"UmaEvCqqaD","pAhR1i3pyd","RmDcrOxWIH","POUYSEoToP","2hEEU07n1c","ZuDtDIn3NS","6AFT0G1RhS","CK5W74dEz6","jtn0XbrhlQ","y94nwoGu6x",
+"29QAzvLsmS","ciuWzJXljW","tl72WlViBv","GSQwj0Kyfs","7Ow5C3otm6","oGu6xRxrsm","4QMc9QssNC","he9IA9eoRc","CIShGWDVWJ","pFrrlCp3mZ",
+"aez9yuPX7G","jiVBPWPmlx","RxrsmtuDyS","dpe1vprNT6","Dz1R3lCMxy","Kr8yssoy9t","5Mg9rix74r","ECMvUfcJOy","Ta8f6MojnP","16lHcjS1aj",
+"cmXIXECMvU","IRh48uQIcz","blLA9580YD","WaWsvAXpwE","iB08lh1zcH","Chuy3jtn0X","I7p2a9rlg9","QssNC7fKYU","8cVD3zqH0W","OxWIHBCxeC",
+"blLA9JXljW","jzUqRWaim6","ZuDtDfFDrJ","618Din1pmO","LDk6f1j5L8","5iGN5KsjRK","WmadA6q6L9","9rlg9CxVEf","lm0pDIKxdL","rhl0JX6Pin",
+"0PktIGrDg7","tl72Wix74r","i3pydlpF6W","UmaEvksJby","zmLYDGWqqX","rhl0Jatef2","MGlTFM6qcG","s93MlNAFuw","HP433yvOMI","ogLgc0YAGH",
+"zQt6QJ2mQi","JIqXituDyS","W3VFHzmLYD","5NammzqH0W","lm0pDY1mC0","iB08llpF6W","Ss0ZuJXljW","BbwgABCxeC","Q6hMCGSQwj","JRJQBMojnP",
+"Ta8f6IKxdL","b29RJZhwG1","ZJTXH4dEz6","CqqaDBCxeC","FwEJziKqhr","atef2CdyBV","W7cTspT8wu","9rlg9DcpWB","xXTI4ZUnqt","zQt6QyluBx",
+"Q6LixzY1GY","HfyNQThjNn","hE1QlFxX9q","jeskS1LB1L","o8Uyd5IhmG","S2Dfu4W0Tl","QssNCgjUTu","55rfBd7vjM","uvf7ARsQUq","y94nw7ku1p",
+"atef2tuDyS","RpBQmpmeCd","lweGybZLvS","Vprf2nlaBy","QnJ1Sru4UG","zFgtBs4786","0BmCyKASQ8","3weIF0Kyfs","v2eC3ZzJHW","mz8gxAXpwE",
+"ulk41ulk41","wiHrZt59lR","lkMUAHRxd8","zz4ZUOxWIH","X6PinFnPFB","W3VFHNAFuw","hE1QluZPqg","fmIK1FnPFB","7fKYUwiHrZ","8xEKzRmDcr",
+"pAhR14QMc9","2NslmGXdoH","uupzkSs0Zu","Yw2oUaDGtS","UmaEvAmdQd","zqH0W0YAGH","NcICATXQ0Z","K4GS8K4GS8","ThjNnfLNg8","uJScXYOfrY",
+"HlUbFFLsph","0Kyfsy94nw","ulk41W3VFH","PYBf4Y1mC0","3otm6pv0i7","EoToP6AFT0","lXFOB4dEz6","VBjhzBbwgA","QWxoTQWxoT","7Ow5CVjCZq",
+"pT8wupmeCd","L7cGcoGu6x","S2DfugjUTu","d7vjMMK07Y","5ZaEz4dEz6","VLTy6Chuy3","VjCZq5iGN5","GXdoHQssNC","HlUbFQssNC","FNYIMTXQ0Z",
+"qUJMdx3LDe","QYxC0RpBQm","RzaZAFxX9q","5nmWv9rlg9","QWxoTqaofN","FcWrW8RCUA","uZPqgVLTy6","FhtgljzUqR","55rfBrz7Ut","jS1ajd7vjM",
+"m4bxUFLsph","rKDLJTa8f6","55rfBChuy3","JKWYRaez9y","gjUTu6AFT0","piJSkZ4I1v","DLhzMWMiS3","sqVrfSbRYy","WmadA9GXkX","U3yw5ZUnqt",
+"NAFuwoQ87r","DLhzMjfREu","FjHXRokgRi","5Mg9rlViBv","ru4UGjfREu","Z4I1vprNT6","pv0i7UlU3M","RACujgIYvE","uvf7AFGzgp","yToGWXflUq",
+"WPmlxRzaZA","CIShGdmoS7","iKqhrcL0aE","7fsYMFGzgp","7hyVvCxVEf","i7WMQMaJQs","BFkb87fsYM","l83UdWMiS3","yvOMIni2v1","dpe1vpAhR1",
+"zbIYY3otm6","FhtglEOE1o","tlILtYOfrY","7fsYMiKqhr","0MR5XQ6Lix","NhXdus7Mxk","MojnPogLgc","yluBx0Kyfs","HP43364s8N","AXpwEQWxoT",
+"pv0i7sx5Gl","8TxD7HzZT8","7fsYMyvOMI","0h1b1n8pJ9","qaofNsoy9t","SbRYyOUYuF","d85a9jS1aj","VIlwPTXQ0Z","lsQGoaL6AJ","wiHrZzFgtB",
+"D6rByS2Dfu","HfyNQuTacx","dmoS7n8pJ9","jSjS3Ta8f6","l83Ud1LB1L","fFDrJx3LDe","QChxsJKWYR","55rfBTwano","qQxHPS77LH","VerEAPOUYS",
+"aDGtSTa8f6","iKqhrLDk6f","C2Irco8Uyd","e6e4zv2eC3","GrDg7uZPqg","HlUbFFcWrW","Q6hMCUmaEv","atef2FnPFB","hE1QlCNHmv","prNT6Z4I1v",
+"l83UdlViBv","GWqqXWaim6","7Ow5CoVQp6","1j5L8dmoS7","jeskSsuY4x","MaJQskZANm","s4786dQ586","Q6hMCeuZA5","lj07QnnP8o","uAWypvLsmS",
+"WreyPO3iyQ","vOqCEokgRi","aFFssuQIcz","3weIFUmaEv","5IhmGk85Ae","zFgtB8U2nU","8cVD3JRJQB","VNCPddjsrv","i7WMQv8yFN","5IhmGNAFuw",
+"D6rByXflUq","guMb8OUYuF","7X3uyJIqXi","AIYUu48cHL","GWqqXQbxXc","ZhwG1n1pmO","JXljWRBhp0","ReKEWCqqaD","aDGtSfcwDa","QnJ1ShSSvQ",
+"uJScXKZamH","uN6r3uQIcz","lViBvpFrrl","d7vjMyToGW","YjB9tpmeCd","jzUqRdmoS7","DQimpTa8f6","mX2GEhUTw7","5drc6lm0pD","FwEJzbrhlQ",
+"cShY28xEKz","Kr8ysEOE1o","64s8N0BmCy","F6PT2Chuy3","ZzJHWbgJAz","QWxoT8xEKz","ciuWzWaim6","G1RhSdhSuH","Ta8f6ZuDtD","o8UydxReec",
+"oGu6xhSSvQ","RxrsmgIYvE","tvdkD4dEz6","ciuWzCqqaD","K20wKfLNg8","ru4UG8hJdt","kB5nP8TxD7","XyPZNOUqFM","K20wKhe9IA","uLtKsRsQUq",
+"PYBf4t59lR","fcJOyRsQUq","tl72We6e4z","djsrvcL0aE","1v5hHGWqqX","HzZT80MR5X","bgJAzRmDcr","Q6Lix4QMc9","okgRiBFkb8","pT8wuDLhzM",
+"vkCHHYh1hF","7ku1p2Yz7E","6q6L9HRxd8","ZzJHWUlU3M","jiVBPoVQp6","uQIczNo0Qb","soy9tqUJMd","TXQ0Z2Nslm","2Yz7E8xEKz","Yf2EcNOHsz",
+"gtCA5fLNg8","pT8wu9XyT9","OHaBzOUqFM","faHirQ6Lix","Waim6a00b5","kZANmaDGtS","oQ87rsoy9t","hE1Ql0ao3l","7lUXZfFDrJ","55rfBBFkb8",
+"lkMUAlkMUA","JIqXiZv7z0","lj07QnlaBy","3otm6FjHXR","yluBxL7cGc","ix74r45cIH","SWfouAOgEe","SjskQQworu","k85AeThjNn","RkQkeIRh48",
+"Yh1hFblLA9","SWfouvkCHH","5nmWvYw2oU","24ARF0PktI","FcWrWcL0aE","vLsmSs4786","Chuy3yofH3","mz8gxCK5W7","uupzkzqH0W","2TRI7JRJQB",
+"0YAGHQ6Lix","D6rByUl4a1","qQxHPReKEW","U3yw5pv0i7","AmdQdiKqhr","OUYuF24ARF","yEfy9JJs5m","G1RhSt98iW","Gv3FqK4GS8","P6bcguLtKs",
+"5VZjS45cIH","WPmlxgdQsS","qQxHPFhtgl","5nmWvpmeCd","8RCUA9y4lw","D6rByy94nw","1v5hHBFkb8","gf8rIlH1kt","qaofNMezSW","KZamHkZANm",
+"BGaQYuupzk","n1pmOoQ87r","nFqikjiVBP","Uvlv4VerEA","Zv7z0sqVrf","Ta8f6NAFuw","Yh1hFtlILt","5ZaEzzY1GY","2DREsfqypy","CxVEfTXQ0Z",
+"NOHszWaim6","lCMxylXFOB","J2mQilXFOB","HzZT8Fhtgl","5NammAOgEe","0ao3lqUJMd","Ta8f6gtCA5","ZUnqtblLA9","W7cTsYf2Ec","qaofNUl4a1",
+"ogLgcVLTy6","zbIYYs93Ml","IKxdLOUqFM","WPmlxGSQwj","Qworu9iGoT","B3qemZUnqt","pT8wuWmadA","Yf2EckB5nP","RBhp016lHc","pvgjSKr8ys",
+"7hyVvFhtgl","Q6LixMK07Y","RzaZACfgr3","EoToPblLA9","ZzJHWQssNC","gdQsSIKxdL","jiVBPb29RJ","AOgEe2TRI7","2NslmzHF1q","xciqpQnJ1S",
+"b29RJtjQxs","tl72WNhXdu","bgJAzY1mC0","pvgjSJXljW","aDGtSEoToP","lViBvZJTXH","Oz8yZdmoS7","Uvlv41v5hH","sx5GlChuy3","5nmWvWDVWJ",
+"OHaBzdpe1v","Mm8si0Kyfs","S2DfuW3VFH","QworuAgJHQ","9iGoTLbRTH","l83UdIRh48","t59lRSmGzv","fcwDaWaim6","rKDLJI7p2a","U3yw50h1b1",
+"IBe8kpWiOs","KsjRK24ARF","rz7UtqQxHP","Q6LixUvlv4","7hyVvEdBKc","WPmlxFnPFB","hYBCK2ZHdk","pmeCdpiJSk","Mm8si7ku1p","Q6hMCFLsph",
+"yluBx9rlg9","DcpWBF6PT2","7hyVvnFqik","Mkgy8Ul4a1","VNCPdMezSW","aez9y0BmCy","tvdkDaFFss","lH1kt9rlg9","vkCHHbgJAz","lCMxyRpBQm",
+"Mkgy8UmaEv","hi5X7WreyP","VjCZqzbIYY","HlUbF07n1c","Kr8ysuupzk","QnJ1S9GXkX","W7cTshi5X7","NcICAvkCHH","zHF1quZPqg","TCgPpMmKGJ",
+"suY4xkB5nP","K4GS8Cfgr3","aL6AJHP433","Q6Lix9rlg9","C2IrcnFqik","ZuDtD580YD","faHir4QMc9","29QAzOUqFM","QClRLHlUbF","XyPZNFLsph",
+"Kr8yspmeCd","fLNg8JJs5m","Y1mC0BGaQY","UmaEvCIShG","mX2GEFLsph","HP433Q6Lix","Y1mC0WMiS3","MmKGJlH1kt","Pb1paEOE1o","FcWrW5drc6",
+"Ta8f6VjCZq","IKxdLAIYUu","QChxsVBjhz","StlDJIKxdL","XyPZNn8pJ9","Qworu7lUXZ","AIYUujS1aj","zHF1qWaWsv","5nmWvzbIYY","SbRYya00b5",
+"48cHLhi5X7","VIlwPLDk6f","16lHct98iW","uZPqgEoToP","zmLYDqUJMd","guMb8ciuWz","AmdQdjiVBP","0h1b1ZhwG1","X6PinCNHmv","2Nslm7hyVv",
+"pWiOsQssNC","ciuWz5IhmG","0Wr5y9XyT9","wDajXNxx9V","tlILtv8yFN","NAFuwgf8rI","Vprf23otm6","jS1ajCdyBV","4W0Tl7hyVv","DLhzMhi5X7",
+"2NslmFxX9q","h1zcHuPX7G","s93MlRACuj","uZPqgFxX9q","IjTwP14FLR","TXQ0ZsuY4x","pFrrlJXljW","ZUnqtzmLYD","OHaBzTa8f6","I7p2ajSjS3",
+"5IhmGtlILt","Pb1paPb1pa","okgRi7ku1p","AOgEepAhR1","cQOnv7hyVv","ydG8Urhl0J","NOHszSWfou","atef2xXTI4","oGu6xMaJQs","OHaBzuLtKs",
+"h1zcHqQxHP","vOqCExciqp","SbRYyatef2","AIYUuZv7z0","DcpWBRsQUq","K4GS8MojnP","AOgEeuvf7A","uN6r3EdBKc","jeskSReKEW","soy9txXTI4",
+"xXTI4MaJQs","I7p2agf8rI","HfyNQs93Ml","3weIFpmeCd","JKWYRGXdoH","WmadAi3pyd","wiHrZSjskQ","Uvlv4DG4sT","Nxx9VtjQxs","ksJbytjQxs",
+"FjHXRUl4a1","JIqXiaez9y","MmsIouJScX","0MR5XhSSvQ","Mkgy8euZA5","6AFT0CNHmv","QnJ1S24ARF","n1pmOQssNC","BGaQY6AFT0","1v5hHM6qcG",
+"lweGyVIlwP","5ZaEzEoToP","mz8gxlm0pD","TwanoYh1hF","kB5nPlH1kt","dmoS7sqVrf","TXQ0ZoQ87r","X6PinzHF1q","Mkgy8AIYUu","5iGN507n1c",
+"PYBf4hSSvQ","iKqhre6e4z","64s8Nfqypy","0MR5XfLNg8","XflUqUl4a1","KsjRKbrhlQ","a00b5jiVBP","7X3uyTa8f6","CqqaDlViBv","9XyT955rfB",
+"nnP8olsQGo","s4786zY1GY","EOE1o5iGN5","BpYhVRACuj","EOE1oblLA9","DcpWBWMiS3","VBjhzNxx9V","guMb8ni2v1","B3qemVerEA","dmoS73otm6",
+"5IhmGuPX7G","jzUqRUl4a1","S77LHhYBCK","FhtglPb1pa","l83Ud8TxD7","s93Mlatef2","lkMUAv1Hln","Mm8siprNT6","8cVD3lweGy","L7cGcwDajX",
+"NhXduvOqCE","uPX7GDG4sT","fcwDav8yFN","7lUXZk85Ae","he9IAC2Irc","yofH3iB08l","CxVEft98iW","MGlTFpmeCd","VLTy6FPfSE","Q6Lix0MR5X",
+"VNCPdFhtgl","FwEJzn8pJ9","RACuj2DREs","wiHrZ4dEz6","t98iWCqqaD","7ku1pDLhzM","KASQ8Z4I1v","NOHsz6AFT0","lm0pD5Mg9r","zmLYDuN6r3",
+"8RCUAaDGtS","s93MlDcpWB","FFDuicQOnv","KsjRKn8pJ9","aDGtSZJTXH","WmadARxrsm","lsQGouJScX","2hEEUoVQp6","FPfSEs4786","2Yz7EuoStw",
+"YjB9tNOHsz","ZzJHWHlUbF","S2DfufcJOy","Chuy3DcpWB","W7cTsi3pyd","5nmWvtjQxs","CK5W77fKYU","aL6AJSWfou","uAWypIjTwP","7hyVviB08l",
+"CdyBV0Wr5y","QnJ1SGrDg7","29QAzF6PT2","lCMxybgJAz","CIShGNhXdu","0h1b1t59lR","4QMc9FLsph","HlUbFRpBQm","AIYUubrhlQ","y94nwvLsmS",
+"lsQGoGWqqX","fqypyDLhzM","FGzgpBFkb8","K20wKaez9y","bgJAztaOXK","HRxd8Q6hMC","9rlg9MaJQs","oVQp6GWqqX","cQOnvxciqp","VNCPdNo0Qb",
+"CdyBVOHaBz","EOE1oJRJQB","8FmFHDcpWB","vLsmSmz8gx","jfREuOxWIH","FhtglIRh48","JIqXiMK07Y","ThjNnaDGtS","6q6L9OxWIH","ogLgct98iW",
+"nlaByCIShG","DG4sTcmXIX","uJScXzY1GY","Mkgy8GrDg7","StlDJ9eoRc","RACujcQOnv","ulk41U3yw5","vLsmSCxVEf","64s8Nv1Hln","MmsIov1Hln",
+"zbIYY5nmWv","WreyPgIYvE","uAWypS77LH","EoToPOxWIH","NAFuw2Nslm","hi5X7Waim6","EOE1o5nmWv","lj07Q24ARF","VIlwPNAFuw","pT8wuvLsmS",
+"tAOsrFGzgp","S2DfulkMUA","0MR5XRBhp0","B3qemG1RhS","oGu6xMmKGJ","S77LHVerEA","xReec8cVD3","B3qemn8pJ9","dmoS7fmIK1","atef2VBjhz",
+"UlU3MWreyP","hi5X7DG4sT","Nxx9Vm4bxU","580YDjfREu","NcICA5iGN5","DcpWBHzZT8","cShY2cQOnv","hUTw7NOHsz","SbRYyWreyP","618DiTwano",
+"lViBvJKWYR","AkKTkaL6AJ","s93Mlh1zcH","SmGzvEdBKc","Nxx9Vatef2","JKWYRNhXdu","L7cGcCqqaD","EoToPhi5X7","suY4xuZPqg","cShY2dQ586",
+"BpYhVVprf2","uZPqgaL6AJ","5Drn0Mm8si","RBhp00Wr5y","O3iyQjfREu","9iGoTpvgjS","QbxXccShY2","ru4UGqaofN","B3qemiB08l","oGu6xdmoS7",
+"Mkgy8OUYuF","RsQUqY1mC0","lm0pD4W0Tl","5drc60PktI","ogLgcZuDtD","JkzUnzQt6Q","NcICA6q6L9","5nmWvn1pmO","FnPFBRmDcr","Cp3mZs93Ml",
+"hE1QlJkzUn","mz8gxuLtKs","14FLRdmoS7","jzUqRFPfSE","Nxx9VTXQ0Z","JKWYR4W0Tl","M3zXLBGaQY","yvOMIOUYuF","K4GS8x3LDe","DQimpMK07Y",
+"s4786tAOsr","ksJbyDcpWB","OxWIH7Ow5C","mz8gx5drc6","m4bxUatef2","m4bxUtlILt","7Ow5CWreyP","5iGN5aL6AJ","Uvlv4O3iyQ","HP4337Ow5C",
+"azIWpEdBKc","aFFssyToGW","nFqikguMb8","iqv4kprNT6","0h1b1tAOsr","7lUXZciuWz","QssNCZJTXH","zHF1q8RCUA","KsjRK8TxD7","lpF6WQ6hMC",
+"MezSWFcWrW","jS1ajG1RhS","CK5W7Cp3mZ","0PktIi7WMQ","bgJAzuJScX","iqv4krhl0J","Dz1R32ZHdk","HRxd8EoToP","zbIYYBpYhV","Dz1R3hUTw7",
+"mz8gxS2Dfu","X6PinGv3Fq","GXdoHdpe1v","tlILthSSvQ","0YAGHtl72W","16lHcmX2GE","5iGN5zz4ZU","3weIFRACuj","fcwDat59lR","6q6L9zFgtB",
+"piJSkFLsph","FGzgp14FLR","5iGN58hJdt","iB08lGXdoH","D6rByI7p2a","KASQ8uoStw","b29RJMmsIo","Yw2oUqQxHP","uoStw4W0Tl","lsQGoiKqhr",
+"VjCZqwDajX","KsjRKh1zcH","ReKEW7X3uy","8cVD3JkzUn","jiVBPaL6AJ","MmKGJSjskQ","ciuWzGXdoH","VIlwPxciqp","Chuy38hJdt","3weIFyvOMI",
+"v2eC3QChxs","6q6L9Pb1pa","9eoRcZhwG1","TXQ0ZBGaQY","Cfgr3Yw2oU","oQ87ruQIcz","t98iWNo0Qb","lXFOBCqqaD","yEfy9KZamH","7fsYM8U2nU",
+"okgRio8Uyd","X6Pinzz4ZU","5Mg9rFcWrW","he9IAFPfSE","d7vjMpmeCd","5Drn0UmaEv","jSjS3iqv4k","h1zcHQWxoT","O3iyQNo0Qb","2NslmAIYUu",
+"lCMxycShY2","zY1GYGWqqX","W7cTsG1RhS","BCxeCl83Ud","FjHXR8xEKz","BpYhV64s8N","0BmCybZLvS","Yw2oUvkCHH","29QAzBFkb8","uTacxPb1pa",
+"0Kyfs1v5hH","BbwgA5iGN5","jtn0X55rfB","JkzUnWreyP","Ss0ZuuJScX","48cHL0ao3l","9GXkXQClRL","M6qcGNcICA","n1pmOWmadA","uPX7Ghi5X7",
+"uJScXNo0Qb","FxX9quZPqg","pFrrlVLTy6","K4GS8580YD","gtCA5SmGzv","Kr8ysxReec","IKxdLuvf7A","tuDyS0Kyfs","brhlQTa8f6","TwanoVLTy6",
+"s4786RBhp0","RxrsmQChxs","KsjRKWaWsv","OHaBz2Yz7E","O3iyQa00b5","XflUqksJby","YjB9t9y4lw","AkKTklViBv","8RCUAxciqp","Q6hMCiKqhr",
+"uupzkOUYuF","uAWypC2Irc","uN6r3Yw2oU","nFqik5Mg9r","pT8wuCfgr3","tvdkD6q6L9","euZA5J2mQi","GXdoHatef2","FPfSE48cHL","VBjhz2Yz7E",
+"pFrrllj07Q","UlU3Mhe9IA","QbxXczmLYD","aFFss0BmCy","rKDLJJRJQB","blLA92ZHdk","hi5X7AgJHQ","9GXkXyofH3","cL0aEmz8gx","cShY2fmIK1",
+"FGzgpP6bcg","3otm624ARF","VBjhz5Mg9r","dpe1vLbRTH","x3LDe618Di","I7p2aO3iyQ","2ZHdkLDk6f","wiHrZ9y4lw","zQt6QQbxXc","s7Mxkv2eC3",
+"0Wr5yVLTy6","lweGy8RCUA","1j5L8MaJQs","b29RJDz1R3","Zv7z0Yf2Ec","vOqCEWaWsv","DcpWBDQimp","3weIFlkMUA","dQ586iB08l","XflUqsqVrf",
+"7fKYUt98iW","JJs5mgf8rI","qUJMdcShY2","NhXdu55rfB","GXdoHwiHrZ","i3pydm4bxU","55rfBBbwgA","zbIYYo8Uyd","U3yw5Y1mC0","blLA9dpe1v",
+"5drc664s8N","1v5hHdQ586","2DREsuAWyp","9y4lwFxX9q","cShY2oVQp6","x3LDewiHrZ","Mm8siBbwgA","MaJQsjzUqR","qUJMdTwano","7lUXZIRh48",
+"hYBCKqQxHP","nFqiklweGy","XyPZNtaOXK","MezSWY1mC0","o8UydNhXdu","M3zXLFnPFB","GXdoHdjsrv","OxWIHDcpWB","0YAGHeuZA5","3otm6Qworu",
+"7fsYMuoStw","hUTw7v2eC3","OUYuFWmadA","ZhwG1hSSvQ","yofH32hEEU","55rfBulk41","BCxeCGWqqX","7ku1pGrDg7","BGaQY7ku1p","BpYhV1j5L8",
+"0YAGHjeskS","QWxoTPb1pa","MojnPX6Pin","DQimpRzaZA","2DREs3weIF","UmaEvqaofN","gf8rIoQ87r","3weIFBFkb8","rhl0Jt59lR","oVQp6hYBCK",
+"jS1ajFNYIM","kZANmKASQ8","IjTwP2Nslm","O3iyQTa8f6","SWfourhl0J","dmoS7IBe8k","wDajXksJby","uJScXgjUTu","8TxD7jtn0X","M3zXLVjCZq",
+"IBe8k5drc6","1v5hHzHF1q","YjB9t0PktI","ksJbyQnJ1S","5drc6SmGzv","tjQxsUl4a1","14FLR24ARF","sx5GlMmKGJ","zbIYYfqypy","FcWrWn8pJ9",
+"DLhzMNcICA","HP433RkQke","FwEJz5Drn0","uoStwOUYuF","lpF6W5Mg9r","nlaByogLgc","TCgPpJIqXi","FLsph1j5L8","AXpwEpAhR1","nlaByyofH3",
+"azIWptaOXK","K20wKDz1R3","YjB9ttvdkD","brhlQlViBv","FGzgpiKqhr","QWxoTY1mC0","TCgPpOUqFM","oVQp6L7cGc","MGlTFFFDui","5iGN5ZuDtD",
+"uoStwd7vjM","ulk418RCUA","2Yz7EBGaQY","i3pydpvgjS","8RCUASs0Zu","vkCHHSs0Zu","dhSuHlpF6W","FGzgppT8wu","yToGWiB08l","RpBQm29QAz",
+"OxWIH7ku1p","FLsphaFFss","tvdkDFnPFB","jSjS3D6rBy","RmDcruN6r3","Ul4a1uN6r3","9y4lwBbwgA","14FLRydG8U","0KyfszQt6Q","IKxdLTCgPp",
+"jzUqRQssNC","D6rByfcwDa","AXpwE8RCUA","GWqqXt98iW","24ARFa00b5","2hEEUFxX9q","dQ586lweGy","FxX9qdjsrv","MK07YWMiS3","uPX7Gix74r",
+"lweGygf8rI","FwEJzMezSW","WMiS35drc6","ReKEW3otm6","KsjRKfLNg8","ciuWzK4GS8","In3NSHlUbF","4W0TlYh1hF","fLNg8OUqFM","dhSuHKsjRK",
+"uLtKsQbxXc","XyPZNwiHrZ","pFrrlt59lR","DcpWBzbIYY","9y4lwNo0Qb","pv0i7QnJ1S","BGaQYoGu6x","7fsYMciuWz","HP433VerEA","GWqqX0Kyfs",
+"yofH33otm6","CK5W7Vprf2","Twano9y4lw","yEfy9uN6r3","8RCUA5Drn0","WaWsvPOUYS","uJScXfcwDa","n8pJ9JJs5m","yvOMI9GXkX","FcWrWCqqaD",
+"CNHmvbrhlQ","2NslmP6bcg","RpBQmpT8wu","uvf7AHfyNQ","lj07QLbRTH","0YAGHpT8wu","2TRI7hSSvQ","2TRI7I7p2a","Uvlv4I7p2a","mz8gx1v5hH",
+"tuDySpAhR1","5VZjSCK5W7","OHaBzQChxs","n1pmOnlaBy","tuDyS9iGoT","BpYhVhi5X7","qUJMdVLTy6","UmaEvuupzk","618DiAIYUu","MezSWKZamH",
+"v8yFNazIWp","jeskSrz7Ut","X6PinbrhlQ","uJScXTwano","5iGN5NAFuw","0MR5XgtCA5","x3LDetjQxs","zY1GYNAFuw","jSjS3B3qem","RsQUqsuY4x",
+"ciuWzvLsmS","TCgPppv0i7","OUYuFVBjhz","yEfy9ix74r","pv0i7UmaEv","ksJbyVBjhz","FVMxoDG4sT","ZhwG1azIWp","Waim6WPmlx","8hJdtlXFOB",
+"tuDySguMb8","2NslmB3qem","QssNC2Yz7E","9y4lw2hEEU","CIShGGSQwj","AIYUuaDGtS","hE1Qlrz7Ut","7lUXZfLNg8","HRxd8QYxC0","HP433oGu6x",
+"jtn0XyofH3","zmLYDQ6Lix","FPfSEhUTw7","bgJAzkB5nP","zHF1qyofH3","xciqpFPfSE","QClRLaez9y","Gv3Fq14FLR","RBhp0taOXK","5Drn0lH1kt",
+"ZUnqtOUqFM","lpF6Wxciqp","ix74razIWp","n8pJ9Cp3mZ","atef2OxWIH","SjskQokgRi","GSQwj9XyT9","YOfrYOz8yZ","yEfy9StlDJ","WMiS30h1b1",
+"DLhzMOUqFM","29QAzQClRL","fqypysuY4x","HP433cQOnv","K4GS8MaJQs","qaofNdQ586","0BmCyzz4ZU","WmadAzz4ZU","WPmlxlH1kt","RzaZAuPX7G",
+"hSSvQpvgjS","jfREu07n1c","DcpWBciuWz","5nmWvyofH3","uAWypVLTy6","fqypyyToGW","Chuy3FPfSE","MGlTFaDGtS","vOqCE9rlg9","Zv7z0tAOsr",
+"pvgjSECMvU","Yf2EcjeskS","lH1ktU3yw5","bgJAz8xEKz","euZA58FmFH","QYxC0guMb8","Yw2oULewvM","tlILtFhtgl","FFDuiCIShG","JKWYRqQxHP",
+"IBe8kW7cTs","7X3uytvdkD","RkQkeuTacx","EoToP4W0Tl","Vprf2UmaEv","AgJHQyEfy9","07n1cHRxd8","nFqik2hEEU","ni2v1rz7Ut","DLhzMjtn0X",
+"J2mQipiJSk","7ku1poGu6x","gf8rI64s8N","euZA5zQt6Q","jS1aj5VZjS","lpF6Wd85a9","uoStwzY1GY","lkMUACK5W7","1LB1LblLA9","aL6AJoGu6x",
+"iwzGkuvf7A","5IhmGCK5W7","RsQUqUmaEv","gjUTud7vjM","2DREsTCgPp","NcICAHlUbF","cL0aE5iGN5","uAWyp7ku1p","fLNg8M6qcG","FhtglFPfSE",
+"fmIK1oQ87r","8U2nUoGu6x","WmadAFNYIM","3otm6jfREu","CdyBVjiVBP","ReKEWCxVEf","8TxD7rz7Ut","fLNg8ReKEW","GSQwjblLA9","XyPZN0Wr5y",
+"sx5GlOUYuF","MmsIoQssNC","5nmWvJ2mQi","FFDuiF6PT2","9iGoTpv0i7","kB5nPKsjRK","ni2v1ZJTXH","fcwDafmIK1","PYBf4VNCPd","zFgtB29QAz",
+"In3NSRmDcr","nlaByqUJMd","StlDJYw2oU","7hyVvFGzgp","lweGyRxrsm","t98iWjfREu","OHaBzcL0aE","LbRTHix74r","No0Qb9XyT9","7hyVvrhl0J",
+"AgJHQ5iGN5","4QMc9Yh1hF","ciuWz8cVD3","AIYUuv8yFN","CNHmv8U2nU","WMiS3xciqp","QnJ1SMmKGJ","gdQsSFPfSE","WreyPzHF1q","xciqpnFqik",
+"0h1b12DREs","AXpwEgjUTu","9y4lw6q6L9","lj07QoGu6x","EoToPK20wK","FVMxo9iGoT","bgJAz0MR5X","AmdQdMmsIo","POUYSv2eC3","QClRLnFqik",
+"gIYvENAFuw","VLTy6djsrv","nnP8osqVrf","pAhR1lXFOB","2TRI71j5L8","Cfgr32ZHdk","cmXIXwDajX","5Nammh1zcH","sx5GlzbIYY","pv0i7MGlTF",
+"CNHmv4QMc9","mX2GE6AFT0","Gv3FqRmDcr","RmDcr3otm6","C2Ircx3LDe","Zv7z0d85a9","5NammGXdoH","UmaEvaDGtS","FPfSESWfou","Mkgy8AkKTk",
+"hi5X7gIYvE","0PktIDQimp","lH1kty94nw","suY4xs93Ml","Mkgy8cQOnv","Chuy3pT8wu","dQ586gtCA5","J2mQizFgtB","Zv7z0uLtKs","GXdoHn1pmO",
+"XflUqtaOXK","RmDcruTacx","SjskQcShY2","Q6LixhYBCK","ni2v1FFDui","GSQwjIRh48","Gv3FqqQxHP","OHaBzOHaBz","pv0i7gjUTu","618Diuupzk",
+"QWxoTFNYIM","FGzgpFnPFB","OUqFMx3LDe","K4GS8uZPqg","PYBf4Qworu","lweGy9XyT9","k85AevOqCE","ydG8UAkKTk","14FLRtaOXK","0MR5XYw2oU",
+"atef2VIlwP","CNHmvt98iW","tlILtQChxs","5IhmGHzZT8","IRh48GXdoH","xciqpfaHir","RBhp0QChxs","t59lRwiHrZ","QbxXcIBe8k","ciuWzJIqXi",
+"VerEAokgRi","brhlQRACuj","CqqaDxciqp","VerEABGaQY","rKDLJogLgc","rKDLJAgJHQ","dmoS7pAhR1","fcwDaKZamH","euZA5Mm8si","Fhtglaez9y",
+"FGzgpIKxdL","VIlwPL7cGc","Y1mC0s7Mxk","7fKYUdmoS7","QbxXcWaim6","qQxHPIRh48","yvOMIb29RJ","pFrrlJIqXi","RBhp05drc6","jSjS3CNHmv",
+"fLNg8ulk41","RmDcrMm8si","DLhzMjeskS","nFqikqaofN","KZamHP6bcg","kB5nPZhwG1","MmsIosuY4x","Uvlv4FNYIM","5iGN5rKDLJ","ECMvUuvf7A",
+"zbIYYRBhp0","jS1ajNo0Qb","FhtglYOfrY","D6rByBGaQY","azIWpYh1hF","fLNg8nnP8o","KsjRKVjCZq","ix74rZv7z0","KASQ85Mg9r","VjCZqBCxeC",
+"0YAGH0h1b1","FGzgpCqqaD","tlILts93Ml","OxWIHuvf7A","iKqhrLewvM","RzaZAhe9IA","RACujTXQ0Z","jzUqRbZLvS","RxrsmUmaEv","v1HlnLbRTH",
+"YOfrYChuy3","8cVD3pAhR1","MezSWi7WMQ","azIWp5VZjS","lXFOBokgRi","YjB9t9GXkX","O3iyQ2Nslm","tuDyS3otm6","0YAGHMm8si","FGzgpb29RJ",
+"FNYIMFnPFB","64s8NDcpWB","zqH0WIn3NS","EOE1oYjB9t","Waim6yToGW","Kr8yssuY4x","ogLgcxXTI4","pvgjSuJScX","CqqaDtuDyS","hYBCKv8yFN",
+"he9IASs0Zu","P6bcgyEfy9","24ARFl83Ud","JJs5mYh1hF","No0QbmX2GE","2TRI7Zv7z0","RpBQm5ZaEz","sqVrfk85Ae","cShY2djsrv","U3yw5mz8gx",
+"tlILt7fKYU","FNYIMuAWyp","VerEA48cHL","OHaBzVprf2","55rfByvOMI","zFgtBe6e4z","P6bcgzmLYD","FLsphKr8ys","07n1cFcWrW","3weIFQClRL",
+"soy9tWmadA","QnJ1SsqVrf","uJScXydG8U","NAFuw0MR5X","HfyNQVNCPd","OUqFMAOgEe","WmadA5IhmG","W3VFHECMvU","mX2GEKZamH","0MR5XAOgEe",
+"FGzgp9eoRc","AgJHQ1j5L8","14FLR1v5hH","hi5X745cIH","i7WMQG1RhS","8xEKz580YD","ydG8UNcICA","2Yz7EFcWrW","lm0pDMmsIo","zY1GYCxVEf",
+"v1HlnGXdoH","XyPZNpiJSk","1LB1L14FLR","x3LDe6q6L9","QClRLOxWIH","6q6L9AOgEe","OHaBziB08l","5Drn0SjskQ","TwanoS77LH","6q6L9uoStw",
+"iKqhrBFkb8","ix74rYjB9t","dmoS7o8Uyd","d7vjMlsQGo","jtn0XCp3mZ","soy9tMkgy8","2ZHdktlILt","9XyT9VIlwP","6AFT0rhl0J","CdyBV1j5L8",
+"dmoS70Kyfs","gjUTuFFDui","v2eC3I7p2a","RxrsmhYBCK","v8yFN45cIH","yofH3uJScX","0h1b1Rxrsm","7ku1px3LDe","AIYUuGWqqX","s7Mxk6q6L9",
+"fmIK14dEz6","jeskS0PktI","MojnPyToGW","WmadAuQIcz","uPX7GlViBv","7fKYUCp3mZ","SbRYybZLvS","IjTwPfqypy","s7MxkQssNC","Pb1paVIlwP",
+"OUqFM8RCUA","tjQxs16lHc","rhl0JyEfy9","FwEJzcShY2","5iGN5SjskQ","5IhmGqaofN","oQ87rF6PT2","07n1c2TRI7","mX2GEVIlwP","55rfBStlDJ",
+"6q6L9AIYUu","0h1b107n1c","7X3uy5IhmG","cL0aEFGzgp","hUTw7yToGW","nlaByv1Hln","lm0pDQbxXc","MK07YNxx9V","xReeci3pyd","Vprf29XyT9",
+"SmGzvaL6AJ","NAFuwZzJHW","L7cGcUlU3M","cQOnv4dEz6","brhlQ2DREs","Cfgr3lpF6W","Yh1hFCxVEf","K20wKjS1aj","zmLYDFjHXR","HzZT8L7cGc",
+"GWqqXO3iyQ","guMb8jfREu","2DREsNxx9V","o8UydyToGW","WMiS3t59lR","ciuWzOUqFM","Nxx9VdQ586","Cp3mZCqqaD","Cfgr3kZANm","Kr8yscShY2",
+"0YAGHS2Dfu","FGzgp4dEz6","dpe1vIn3NS","zHF1qJIqXi","Z4I1vVLTy6","5VZjSs4786","sx5Glsoy9t","azIWpAOgEe","he9IAb29RJ","gjUTu2hEEU",
+"RkQkeRzaZA","MmKGJS77LH","S2Dfud85a9","X6Pins7Mxk","2DREsjiVBP","MmKGJfaHir","0ao3lKr8ys","3weIFAIYUu","ZzJHWi3pyd","J2mQisoy9t",
+"XyPZNMm8si","pmeCdgdQsS","Y1mC0JIqXi","7Ow5Ce6e4z","3weIFGSQwj","QbxXcYf2Ec","pFrrlSs0Zu","AOgEe07n1c","2hEEUlXFOB","yToGW5nmWv",
+"lkMUA5drc6","Mkgy8Q6Lix","0ao3llsQGo","16lHcjfREu","6AFT00Wr5y","KASQ8RpBQm","6AFT0zFgtB","FjHXR0ao3l","2TRI7BCxeC","StlDJ0YAGH",
+"CdyBVazIWp","JXljW6AFT0","gjUTuCK5W7","2Yz7ECfgr3","2TRI7ix74r","QssNCUl4a1","i3pydHRxd8","k85Ae5ZaEz","7ku1pv2eC3","0Kyfs8U2nU",
+"5IhmGs93Ml","HP433Mkgy8","uAWyp5iGN5","KASQ8a00b5","I7p2azz4ZU","7ku1pUl4a1","ksJbyK4GS8","cShY2EdBKc","zbIYYrhl0J","7X3uyl83Ud",
+"UlU3M5Mg9r","JIqXiJIqXi","M3zXLMaJQs","6AFT0i3pyd","FcWrWUl4a1","iB08ls4786","KASQ8Yf2Ec","okgRixReec","AOgEen8pJ9","8TxD71v5hH",
+"9eoRcWaWsv","2NslmguMb8","D6rBy8FmFH","ix74rgtCA5","n1pmOZUnqt","5VZjStl72W","nnP8oblLA9","Y1mC07fsYM","0BmCywiHrZ","fcwDahe9IA",
+"aL6AJni2v1","jfREuRmDcr","QClRLCxVEf","StlDJuQIcz","EdBKcSmGzv","QChxsv8yFN","7hyVv1j5L8","2NslmyluBx","MK07Yuupzk","jfREuFLsph",
+"hUTw755rfB","LDk6fFLsph","xXTI4QClRL","0YAGHhYBCK","ZuDtDMm8si","6AFT0VNCPd","Mkgy89iGoT","0BmCyUlU3M","b29RJv8yFN","oVQp6tvdkD",
+"EOE1ouJScX","16lHcQssNC","B3qemaez9y","MmsIoGXdoH","FxX9qjSjS3","wDajXyvOMI","8hJdtStlDJ","Nxx9Va00b5","S77LHSbRYy","D6rByUlU3M",
+"FPfSEfcJOy","45cIH9GXkX","guMb8IjTwP","618DiBFkb8","5VZjSoVQp6","e6e4zuTacx","2TRI7nlaBy","lCMxyRBhp0","5iGN5RACuj","cShY2hYBCK",
+"DG4sTi3pyd","5Drn00MR5X","lkMUAQChxs","CdyBVciuWz","GSQwjYh1hF","Y1mC00Wr5y","9GXkXF6PT2","M6qcGjSjS3","NcICAoVQp6","2hEEUprNT6",
+"iwzGkbZLvS","Kr8ysReKEW","FnPFBCK5W7","FwEJzKsjRK","5Mg9rlm0pD","EoToP16lHc","uvf7AHRxd8","S2DfuNcICA","EdBKcRACuj","FGzgp7ku1p",
+"ReKEWWmadA","dpe1vrz7Ut","0MR5XWreyP","HlUbFiqv4k","RBhp0zmLYD","dpe1vFnPFB","lj07Q5Mg9r","NcICAWaim6","Kr8ys5IhmG","jSjS3SbRYy",
+"JRJQBXflUq","OUqFMbgJAz","7Ow5CJKWYR","MojnPtuDyS","uvf7A4QMc9","k85Ae1j5L8","2TRI7bZLvS","mz8gxYw2oU","LewvMs4786","16lHchSSvQ",
+"MezSWSjskQ","Zv7z0azIWp","nFqikS77LH","okgRiuAWyp","suY4xcL0aE","CdyBVGXdoH","0Kyfsd85a9","SbRYyQClRL","0Wr5ylViBv","bZLvSWMiS3",
+"faHirAIYUu","FVMxouPX7G","WreyP9XyT9","BFkb8jtn0X","FVMxoaDGtS","zY1GYZuDtD","RkQkeM6qcG","bgJAz7fsYM","prNT6XflUq","HP433WMiS3",
+"JKWYRFFDui","o8Uydiqv4k","Dz1R3a00b5","CNHmv580YD","xXTI4JIqXi","8xEKzYf2Ec","zY1GYNxx9V","P6bcgOUYuF","580YDpmeCd","xXTI4uPX7G",
+"WMiS3IBe8k","3otm67Ow5C","tlILtBCxeC","nFqikl83Ud","NhXduMkgy8","okgRiAkKTk","LDk6f7hyVv","7lUXZCNHmv","580YDKZamH","8RCUAzY1GY",
+"vLsmScShY2","pWiOsS2Dfu","gdQsSzmLYD","dQ586soy9t","jeskSvkCHH","Mm8siLbRTH","pFrrlAOgEe","GSQwjCfgr3","FVMxoydG8U","kB5nPSs0Zu",
+"0PktIsqVrf","cShY2ZzJHW","tjQxsaFFss","iB08laL6AJ","jeskSOxWIH","yvOMIFVMxo","jtn0XnFqik","K4GS80h1b1","AIYUu7lUXZ","QClRLlViBv",
+"guMb8K20wK","8hJdt1LB1L","Cfgr3U3yw5","brhlQBFkb8","B3qemzHF1q","JkzUnEoToP","ru4UGLDk6f","ZhwG1RsQUq","fmIK1GWqqX","rKDLJFxX9q",
+"d7vjMBFkb8","euZA5Twano","QYxC0Qworu","yofH30PktI","AgJHQYjB9t","ni2v1gIYvE","ZJTXHprNT6","S77LHo8Uyd","In3NSaDGtS","JIqXiChuy3",
+"VNCPdRmDcr","lCMxy29QAz","OxWIHUl4a1","gtCA5QWxoT","7X3uyW3VFH","pAhR1FcWrW","lpF6Wa00b5","EOE1o8U2nU","yvOMICNHmv","dmoS7Ta8f6",
+"9y4lwsqVrf","blLA9W7cTs","QssNCGv3Fq","618DigtCA5","b29RJNo0Qb","iKqhrQ6hMC","S77LHlCMxy","suY4xAIYUu","JXljWBbwgA","DLhzMyluBx",
+"FFDui07n1c","YOfrYVBjhz","fqypybZLvS","bZLvSVjCZq","rhl0JjzUqR","s93MlHP433","14FLRx3LDe","VjCZq2DREs","RpBQm5VZjS","uupzksuY4x",
+"MezSW0ao3l","L7cGcs93Ml","Vprf2Q6Lix","W7cTsKZamH","618Di5ZaEz","uoStwAmdQd","7lUXZlH1kt","ZuDtDs93Ml","U3yw5k85Ae","l83UdHP433",
+"RmDcrIjTwP","NAFuwkZANm","5VZjSJkzUn","YjB9txXTI4","KASQ8i7WMQ","iB08lyToGW","NAFuw9rlg9","6q6L9uN6r3","FxX9qK20wK","5NammuAWyp",
+"HP4333otm6","M6qcG16lHc","L7cGcKsjRK","FNYIMhYBCK","s7MxkdhSuH","uQIczpmeCd","Zv7z0U3yw5","ix74rG1RhS","SbRYypAhR1","WDVWJni2v1",
+"VerEA7ku1p","lCMxy4W0Tl","KZamHVBjhz","cL0aElsQGo","07n1czY1GY","WMiS3sqVrf","Yh1hFkB5nP","QYxC0lViBv","oVQp6blLA9","XflUquupzk",
+"5iGN5dhSuH","0h1b1pvgjS","8cVD38RCUA","HRxd8In3NS","JRJQBciuWz","brhlQMm8si","NhXdu7Ow5C","tlILts7Mxk","rKDLJCIShG","Pb1payvOMI",
+"cQOnvK20wK","1LB1LtvdkD","Pb1pa6AFT0","6AFT01v5hH","EOE1o2ZHdk","DLhzMQssNC","HzZT8QssNC","LbRTHiwzGk","Oz8yZQworu","X6Pinl83Ud",
+"tAOsrCxVEf","MK07YSmGzv","KASQ807n1c","zHF1qWMiS3","9iGoTAgJHQ","TCgPpjS1aj","qQxHPI7p2a","5VZjS2ZHdk","FVMxoiB08l","45cIHtaOXK",
+"5Drn0t98iW","gdQsSvLsmS","G1RhSKr8ys","djsrv16lHc","ydG8U5drc6","8RCUAReKEW","hE1QlIn3NS","5ZaEzjzUqR","Waim6jS1aj","Gv3FqpWiOs",
+"dhSuHsx5Gl","lCMxyFjHXR","kB5nP9GXkX","LewvMyofH3","ZuDtD5ZaEz","uLtKs48cHL","GXdoHcShY2","lkMUAW7cTs","SjskQJIqXi","B3qemPb1pa",
+"TXQ0ZguMb8","ThjNnuLtKs","P6bcg1v5hH","brhlQgIYvE","fmIK1CqqaD","wiHrZtuDyS","wDajXNcICA","piJSkpv0i7","LDk6fVIlwP","4W0Tldjsrv",
+"BpYhVlm0pD","In3NS1v5hH","6q6L9pT8wu","2TRI7a00b5","dhSuHFwEJz","TCgPpCK5W7","J2mQivkCHH","Ul4a1aFFss","K4GS8aDGtS","580YDzQt6Q",
+"aL6AJ0Kyfs","n1pmOYOfrY","J2mQi8TxD7","PYBf4ZhwG1","RBhp0Yh1hF","lsQGogtCA5","HRxd85drc6","Mkgy8RsQUq","BpYhVB3qem","fFDrJyToGW",
+"nlaByCdyBV","WreyPguMb8","2hEEUdpe1v","8FmFHprNT6","KsjRKMmsIo","XyPZN9iGoT","AkKTk0MR5X","v8yFNMkgy8","piJSkogLgc","WaWsvYh1hF",
+"580YDTXQ0Z","aez9ydhSuH","FnPFBcQOnv","yofH3Waim6","7Ow5CQssNC","RkQkeTwano","hUTw76AFT0","rKDLJzz4ZU","fmIK12DREs","2Yz7ERpBQm",
+"Q6LixJXljW","gtCA57fsYM","3weIFd7vjM","Ul4a1D6rBy","9GXkXBFkb8","16lHc2TRI7","oQ87r0ao3l","07n1cgdQsS","azIWp55rfB","KZamHCp3mZ",
+"Q6LixgdQsS","Gv3Fq5Mg9r","lm0pDXflUq","6q6L9dQ586","rz7Utatef2","vLsmSoQ87r","EOE1oBFkb8","v1HlnW3VFH","iqv4kQ6Lix","BpYhVcShY2",
+"KsjRKyToGW","SjskQ16lHc","5IhmG7fKYU","OUqFMWreyP","4QMc9rKDLJ","NhXduciuWz","uoStwi3pyd","0YAGH64s8N","9y4lwJRJQB","DLhzMTa8f6",
+"4QMc9OHaBz","rz7UtVjCZq","J2mQi8xEKz","jzUqR4QMc9","CK5W7W7cTs","2Yz7EKr8ys","uPX7GguMb8","M6qcGzmLYD","VIlwPdjsrv","bgJAztAOsr",
+"TCgPp7lUXZ","5nmWviqv4k","UlU3MfLNg8","ZUnqtLDk6f","ZzJHWRzaZA","DQimpNo0Qb","k85AeHzZT8","v1HlnQssNC","ZzJHWix74r","FhtglblLA9",
+"29QAzfcwDa","G1RhSAkKTk","0ao3lDcpWB","RsQUqQssNC","MezSWHfyNQ","FnPFBFcWrW","uvf7AQnJ1S","RsQUqs7Mxk","MojnPdjsrv","0BmCyQbxXc",
+"W7cTsSbRYy","ru4UGfFDrJ","QbxXcAgJHQ","cQOnv0ao3l","blLA9nlaBy","LewvMKsjRK","pFrrl7lUXZ","nlaByeuZA5","DLhzMru4UG","7lUXZFNYIM",
+"v1HlnChuy3","aFFss7X3uy","qaofNYw2oU","zz4ZU1j5L8","uLtKsThjNn","ZJTXHM3zXL","FhtglXflUq","dQ586jiVBP","G1RhSJKWYR","prNT6VerEA",
+"MojnPlweGy","x3LDeyToGW","yofH3wDajX","8RCUAzFgtB","0h1b1TCgPp","okgRiIRh48","MojnPOHaBz","0Wr5ycL0aE","8TxD7t98iW","gIYvE7lUXZ",
+"faHirdhSuH","5ZaEzogLgc","8hJdtQssNC","WreyPBpYhV","O3iyQ9iGoT","okgRiQssNC","OUYuFhi5X7","CNHmvUvlv4","CqqaDRpBQm","HfyNQfLNg8",
+"7fKYUVLTy6","he9IATa8f6","VIlwPDz1R3","KZamHnlaBy","mX2GEMK07Y","QnJ1Sa00b5","2DREsguMb8","aFFsskZANm","fcwDaVprf2","HfyNQRBhp0",
+"5IhmG8RCUA","uPX7GJ2mQi","7fKYUuN6r3","FNYIMlCMxy","zmLYDpFrrl","soy9t1LB1L","hi5X7uN6r3","nnP8oZUnqt","JXljWjS1aj","8cVD3o8Uyd",
+"pv0i7ZzJHW","NhXdun1pmO","rhl0J5drc6","gtCA5Uvlv4","MmsIojS1aj","yEfy9BCxeC","ru4UG8cVD3","Dz1R3uupzk","AmdQdrz7Ut","FVMxon8pJ9",
+"OUqFMdhSuH","HlUbFOUqFM","taOXK07n1c","1v5hHDLhzM","Kr8ys1j5L8","GrDg7fcJOy","pv0i7VIlwP","5ZaEzn1pmO","0Kyfsdpe1v","brhlQuvf7A",
+"dhSuHix74r","8TxD7SjskQ","soy9tP6bcg","WreyP1j5L8","e6e4ztlILt","LewvMIKxdL","IjTwPpWiOs","tjQxsWDVWJ","JkzUnpmeCd","BGaQYVIlwP",
+"C2Irc7X3uy","zHF1qvLsmS","guMb8FxX9q","5ZaEzNAFuw","EoToPnFqik","Cp3mZVLTy6","VBjhz2Nslm","b29RJ0Wr5y","v1HlncmXIX","POUYShUTw7",
+"UlU3Mn1pmO","9y4lwHlUbF","QbxXcRzaZA","jfREuqQxHP","VLTy6Zv7z0","gjUTupvgjS","5Mg9rbZLvS","fcwDa8xEKz","dQ586bgJAz","pvgjStjQxs",
+"SjskQRpBQm","8RCUA0PktI","n1pmOzbIYY","kB5nP14FLR","7lUXZZuDtD","FjHXR5nmWv","wiHrZcL0aE","Yw2oUbrhlQ","FPfSEQ6Lix","LDk6fpT8wu",
+"prNT6ix74r","brhlQhe9IA","guMb8Q6Lix","9y4lws93Ml","yvOMIdQ586","5nmWv5nmWv","hi5X7gtCA5","RACujZhwG1","iqv4kSbRYy","FhtglFnPFB",
+"lViBvQbxXc","2hEEUo8Uyd","1j5L83otm6","YjB9tblLA9","k85AeuTacx","NAFuwB3qem","FVMxoJXljW","suY4xAXpwE","jfREulm0pD","D6rBy24ARF",
+"RpBQmVprf2","yEfy9QYxC0","BpYhVIn3NS","64s8N6q6L9","lH1ktpWiOs","fLNg8lj07Q","uN6r39iGoT","7fKYU5drc6","ciuWzdmoS7","n8pJ9X6Pin",
+"ZhwG1fcJOy","64s8NNo0Qb","ulk41JJs5m","HlUbF580YD","C2Irclj07Q","45cIH7fsYM","9eoRcgf8rI","SjskQAgJHQ","8RCUAB3qem","MGlTFfaHir",
+"TXQ0ZksJby","9rlg90PktI","M6qcGpvgjS","FFDuiHlUbF","n1pmOsx5Gl","JXljWAXpwE","WmadAaez9y","RxrsmyToGW","HlUbFhi5X7","B3qemDz1R3",
+"i7WMQHRxd8","t98iW0ao3l","K4GS8Q6Lix","uvf7AFFDui","F6PT2n8pJ9","FNYIMU3yw5","GrDg7FPfSE","BFkb8FNYIM","KASQ8FcWrW","JRJQB5VZjS",
+"2Yz7EDcpWB","suY4xuQIcz","CNHmvn1pmO","MmsIoS2Dfu","XyPZNK20wK","TXQ0ZCp3mZ","5nmWvTwano","IjTwPPOUYS","zY1GYcQOnv","FNYIMeuZA5",
+"EoToPCqqaD","k85AeDG4sT","0YAGH8xEKz","9y4lwKASQ8","GXdoHksJby","RmDcrDz1R3","5IhmGVBjhz","Y1mC0In3NS","uPX7G2hEEU","Oz8yZM3zXL",
+"MK07YhYBCK","oQ87rzFgtB","pWiOsmz8gx","hi5X7tvdkD","taOXKlsQGo","7hyVvazIWp","QssNCAXpwE","LewvMh1zcH","Mm8siQnJ1S","okgRibgJAz",
+"kB5nPfqypy","Oz8yZ0BmCy","gIYvEaL6AJ","XflUqG1RhS","ciuWzpWiOs","CxVEftvdkD","oVQp6dhSuH","ix74rOUqFM","Yw2oUokgRi","zbIYYqaofN",
+"CIShGaez9y","nnP8o7fsYM","07n1cl83Ud","1j5L8rKDLJ","xReecdpe1v","yluBxzqH0W","VerEA0h1b1","FxX9qL7cGc","ciuWzaDGtS","yToGWOz8yZ",
+"hSSvQzQt6Q","fLNg8cL0aE","Yw2oU9y4lw","ni2v1oQ87r","DQimp580YD","hi5X7CxVEf","iB08lv2eC3","n8pJ9gIYvE","ZJTXHi7WMQ","2Yz7ENo0Qb",
+"t98iWsqVrf","Cfgr3FcWrW","pT8wu16lHc","HRxd8X6Pin","DG4sTxReec","In3NSOUYuF","Y1mC07hyVv","BpYhV0h1b1","JXljWqUJMd","ReKEWNhXdu",
+"oQ87rBpYhV","prNT6pv0i7","Yh1hFkZANm","0PktI5VZjS","RmDcrmX2GE","hUTw79y4lw","FhtglwDajX","n8pJ9BCxeC","55rfBUlU3M","5nmWvXflUq",
+"0ao3lEoToP","yEfy9rKDLJ","lpF6Wt59lR","ZUnqt2TRI7","29QAzwiHrZ","J2mQi3otm6","0PktIW3VFH","CqqaDL7cGc","Z4I1v3weIF","0h1b1CdyBV",
+"WaWsvjtn0X","FFDuiQworu","qUJMduN6r3","MezSWguMb8","azIWpZv7z0","F6PT2e6e4z","5Mg9rlXFOB","hSSvQWaim6","4W0Tlb29RJ","OxWIHVerEA",
+"ciuWz0ao3l","WaWsv7X3uy","suY4xgjUTu","MezSWBbwgA","ogLgcFVMxo","Zv7z07Ow5C","d7vjMblLA9","24ARF16lHc","StlDJciuWz","9y4lwmz8gx",
+"faHiruLtKs","Cp3mZMojnP","EOE1oCdyBV","pWiOs7hyVv","ThjNnfaHir","MaJQsBFkb8","0YAGHNcICA","dQ586VLTy6","LDk6fD6rBy","QYxC0OUqFM",
+"lXFOBjiVBP","tAOsrJKWYR","W3VFHJRJQB","48cHLSmGzv","NAFuwCIShG","C2IrciwzGk","zqH0WEoToP","FnPFB3otm6","Qworud7vjM","9rlg9pAhR1",
+"CIShGJXljW","ogLgca00b5","SWfou8hJdt","RkQkeoGu6x","ix74rlpF6W","WMiS3i3pyd","nFqikMmKGJ","2ZHdkd85a9","L7cGcQChxs","ulk41DG4sT",
+"NOHszSmGzv","I7p2arKDLJ","JJs5mStlDJ","uPX7G7hyVv","xReec8xEKz","yofH3K4GS8","tvdkDpv0i7","9eoRcIKxdL","ThjNnVprf2","K20wKIjTwP",
+"QbxXcJJs5m","uTacx2TRI7","IjTwPyEfy9","XflUqdhSuH","faHirciuWz","8RCUABpYhV","0Wr5yZzJHW","pT8wuB3qem","9iGoTv1Hln","fcwDa07n1c",
+"9eoRc0ao3l","uQIczQbxXc","MmsIo5ZaEz","CNHmvIjTwP","sx5GlTwano","cL0aE6q6L9","Q6hMCyToGW","x3LDe6AFT0","zQt6Qpv0i7","uJScXVjCZq",
+"7fsYM5VZjS","Waim6AIYUu","07n1c3weIF","SWfouuPX7G","taOXK0h1b1","D6rBywDajX","HP433ZuDtD","he9IAlpF6W","0YAGHtlILt","tuDySIn3NS",
+"xReece6e4z","5IhmG5drc6","2NslmVprf2","qQxHPQChxs","lkMUAVBjhz","MojnPt98iW","6AFT0DcpWB","JXljWm4bxU","gIYvEVNCPd","atef20h1b1",
+"EOE1oqUJMd","5Mg9rDQimp","F6PT2RsQUq","iwzGkFhtgl","bgJAzv1Hln","Ta8f6oVQp6","lj07Q8TxD7","fLNg8U3yw5","EdBKcaez9y","U3yw58FmFH",
+"bgJAzpT8wu","DcpWBrhl0J","5Mg9rZhwG1","WmadAWreyP","rKDLJo8Uyd","7fKYUJkzUn","wiHrZQ6hMC","XflUqEOE1o","8cVD3blLA9","MGlTFIRh48",
+"xReecgdQsS","suY4xKsjRK","S77LHNxx9V","CK5W75Drn0","qaofNIKxdL","ru4UGuZPqg","oQ87rtaOXK","IKxdLThjNn","h1zcHCxVEf","5iGN5uPX7G",
+"UmaEvZuDtD","FLsphOUYuF","WDVWJ5ZaEz","FLsphaez9y","fmIK1Yf2Ec","NAFuwF6PT2","azIWp618Di","kZANmGXdoH","tl72WLewvM","QChxst98iW",
+"MojnPjeskS","PYBf48cVD3","24ARFRBhp0","RACuj7fsYM","VBjhzS2Dfu","QworupAhR1","i7WMQ7hyVv","MojnPhUTw7","FVMxosuY4x","qUJMdKr8ys",
+"W3VFHB3qem","FxX9qFVMxo","CqqaD8TxD7","AmdQdXflUq","tvdkDCxVEf","rhl0J8RCUA","RsQUqkZANm","C2IrcpiJSk","Qworu48cHL","X6PinS2Dfu",
+"sqVrfFPfSE","zY1GYxXTI4","Mm8siYh1hF","pvgjSv1Hln","7lUXZjzUqR","GWqqXyofH3","HP433K4GS8","8cVD3jfREu","8cVD3iKqhr","uAWypDz1R3",
+"jtn0XFVMxo","uZPqgydG8U","lsQGo0Kyfs","K4GS8pvgjS","azIWp64s8N","Twanosx5Gl","QssNCGXdoH","pvgjS55rfB","EoToPP6bcg","gdQsS2hEEU",
+"2TRI7SWfou","W3VFHSmGzv","he9IA618Di","lsQGopAhR1","5drc6nlaBy","pvgjSFLsph","RBhp0LewvM","CxVEfd85a9","JkzUn5VZjS","PYBf4Z4I1v",
+"CK5W7DcpWB","5IhmGb29RJ","CNHmv7Ow5C","MojnPMojnP","ZJTXH07n1c","hUTw7lweGy","i7WMQFNYIM","AkKTkmX2GE","WMiS3Yh1hF","FwEJzhE1Ql",
+"XflUqs7Mxk","7fKYUFwEJz","0Wr5yYf2Ec","zqH0W9XyT9","48cHLkZANm","FhtglOUYuF","Mkgy8kB5nP","GWqqX7fsYM","DG4sTL7cGc","BCxeCbrhlQ",
+"No0QbBGaQY","LDk6f618Di","MezSWRmDcr","t98iWUmaEv","uupzk0BmCy","FFDuiCdyBV","gdQsShYBCK","Mkgy8cmXIX","16lHcciuWz","suY4xX6Pin",
+"VNCPdyEfy9","QbxXcFhtgl","zbIYYiKqhr","azIWplViBv","hi5X7QssNC","kB5nPIjTwP","Dz1R3fcwDa","gf8rIPYBf4","No0QbIBe8k","IBe8kzbIYY",
+"4dEz6gdQsS","fcwDavOqCE","lm0pDQnJ1S","EoToPvOqCE","s4786SWfou","DG4sTlkMUA","5drc65Mg9r","PYBf4FLsph","FNYIMYh1hF","RpBQm9iGoT",
+"tuDyS6AFT0","7lUXZGWqqX","FcWrWYjB9t","Ss0Zuo8Uyd","5nmWv0h1b1","3weIFVNCPd","SbRYylViBv","QssNCvOqCE","CxVEfB3qem","lweGy45cIH",
+"VjCZquPX7G","0h1b1kB5nP","FxX9quTacx","iKqhrIRh48","RkQkepiJSk","JkzUngIYvE","8FmFHCp3mZ","oGu6xGWqqX","9rlg9LbRTH","GSQwjGSQwj",
+"IjTwPcL0aE","DQimp0Kyfs","pT8wuFhtgl","mz8gxHlUbF","RpBQm5drc6","W7cTs48cHL","s93Mlo8Uyd","AmdQdGWqqX","FxX9qFnPFB","zHF1qEoToP",
+"e6e4zoGu6x","9GXkXD6rBy","5drc6euZA5","ReKEW4W0Tl","Kr8ysdpe1v","aez9yb29RJ","b29RJcmXIX","uZPqgjfREu","t59lRTXQ0Z","ECMvUEoToP",
+"uZPqgfaHir","djsrvL7cGc","9y4lwMezSW","pv0i7uAWyp","jeskSKr8ys","4QMc9Yf2Ec","4dEz6Cfgr3","5NammBFkb8","0ao3l2Nslm","tl72W8cVD3",
+"uLtKstl72W","KZamHjtn0X","NOHszuJScX","Pb1paUlU3M","lj07QzbIYY","Nxx9VLewvM","i7WMQ2Nslm","i7WMQVprf2","9XyT9jtn0X","55rfBG1RhS",
+"TwanoK20wK","CdyBV5ZaEz","gjUTuSbRYy","I7p2aAgJHQ","KZamHYf2Ec","24ARFZzJHW","Rxrsms7Mxk","oGu6xBGaQY","uTacxvOqCE","zbIYYe6e4z",
+"9GXkXUmaEv","Q6hMC0PktI","WreyPVLTy6","2DREsUmaEv","iqv4kCdyBV","RACujru4UG","ReKEWKsjRK","Zv7z0ZuDtD","uoStwHP433","tAOsrnnP8o",
+"iwzGkTCgPp","I7p2aBGaQY","s93MlBFkb8","v8yFN8hJdt","QssNCiwzGk","zHF1q64s8N","oQ87rUlU3M","IKxdL2DREs","5ZaEzzFgtB","AkKTkpAhR1",
+"14FLRcShY2","QnJ1SiwzGk","7fsYMECMvU","QClRLxXTI4","KsjRKGrDg7","WPmlxW3VFH","YjB9tvLsmS","MmKGJReKEW","rKDLJFFDui","9y4lwrKDLJ",
+"WPmlx0h1b1","v1HlnOxWIH","1v5hHMkgy8","8U2nUBCxeC","yofH3zqH0W","QbxXc8xEKz","JIqXin8pJ9","uupzkB3qem","FxX9q0YAGH","EdBKcsoy9t",
+"BFkb8sqVrf","JIqXiXyPZN","MGlTFogLgc","KASQ8azIWp","Cp3mZRmDcr","DLhzMDcpWB","AOgEe2DREs","qUJMdY1mC0","CxVEfStlDJ","zHF1qOxWIH",
+"IRh48uoStw","9eoRcZ4I1v","Oz8yZzmLYD","1j5L8W3VFH","BGaQYqaofN","Nxx9VuAWyp","IRh48lkMUA","RxrsmguMb8","LewvMb29RJ","uAWypWDVWJ",
+"Ul4a1LbRTH","ZzJHWMm8si","OUqFMtaOXK","55rfBFNYIM","7Ow5C2hEEU","ZhwG17X3uy","cQOnv580YD","jfREuTCgPp","xReeccShY2","oVQp6s93Ml",
+"he9IA4dEz6","WDVWJeuZA5","VjCZqazIWp","gf8rIuN6r3","gtCA5zmLYD","n1pmOyEfy9","POUYSQnJ1S","faHirTa8f6","a00b5VerEA","GSQwjWreyP",
+"VLTy6ogLgc","FNYIMqaofN","dQ586ZhwG1","GWqqXd85a9","jfREu2TRI7","8xEKzxciqp","xXTI40h1b1","RkQkeHRxd8","ZuDtDhSSvQ","FVMxoCp3mZ",
+"tjQxsogLgc","4QMc9xXTI4","U3yw55Mg9r","hi5X7Y1mC0","YOfrYXyPZN","EoToPe6e4z","uoStwlkMUA","ix74rksJby","MaJQsFNYIM","d85a91v5hH",
+"gf8rIhSSvQ","0h1b1Pb1pa","ZhwG1fmIK1","Zv7z0lXFOB","NOHszyToGW","uLtKs1v5hH","9eoRcX6Pin","X6Pin2Yz7E","8TxD7CqqaD","Chuy3FwEJz",
+"uvf7A8xEKz","1LB1LIjTwP","hUTw7uPX7G","s93Ml5IhmG","7lUXZdpe1v","2ZHdkChuy3","6AFT04QMc9","X6PinM3zXL","6AFT0oGu6x","5Namm5Namm",
+"OUqFMgIYvE","ThjNnhE1Ql","yToGWogLgc","WMiS3S2Dfu","kB5nPvkCHH","Q6Lixmz8gx","0ao3lWreyP","580YDlXFOB","0ao3lWDVWJ","MGlTFgdQsS",
+"M6qcG8FmFH","VLTy6yluBx","GXdoHTXQ0Z","jS1ajMm8si","EOE1oDG4sT","3weIF0Wr5y","piJSkY1mC0","t98iWTwano","sqVrfsuY4x","JIqXi5Mg9r",
+"DG4sTQnJ1S","uZPqg5drc6","FPfSEAXpwE","wiHrZt98iW","qaofNBpYhV","0h1b1NOHsz","5NammRACuj","lXFOBQbxXc","uupzkKZamH","BGaQY2DREs",
+"S77LH6q6L9","lj07QCNHmv","uLtKsIjTwP","GrDg7nlaBy","QnJ1SPb1pa","AmdQdTXQ0Z","kB5nPVLTy6","G1RhSQssNC","ciuWzlCMxy","8FmFHAOgEe",
+"rKDLJFjHXR","FjHXR0Wr5y","Rxrsmn8pJ9","ECMvUpFrrl","tvdkDFjHXR","e6e4zIBe8k","Yw2oUyluBx","JKWYR7X3uy","Kr8ys2DREs","nnP8opvgjS",
+"O3iyQgtCA5","F6PT2CdyBV","WreyP2TRI7","guMb8iwzGk","8xEKzy94nw","7X3uyprNT6","he9IAfmIK1","ZJTXHDcpWB","Kr8ys9y4lw","ix74rFcWrW",
+"ZJTXH8cVD3","piJSklH1kt","2DREs0Wr5y","zHF1quQIcz","4QMc97hyVv","AOgEe4QMc9","VjCZqzQt6Q","8U2nU7hyVv","48cHLlViBv","dpe1vWDVWJ",
+"Nxx9VO3iyQ","okgRigtCA5","AkKTkzqH0W","RsQUqiwzGk","3otm6DLhzM","IKxdLqQxHP","jeskSXflUq","lCMxy5ZaEz","HP433djsrv","fcJOy5Namm",
+"AOgEeTa8f6","pv0i70ao3l","ZhwG1LDk6f","pmeCdXflUq","lViBvyofH3","jSjS30BmCy","JJs5mCqqaD","7ku1pW7cTs","48cHLdjsrv","qUJMdO3iyQ",
+"8cVD3RACuj","VIlwPtaOXK","DLhzMYOfrY","jeskSOUqFM","ThjNnKZamH","9eoRc5drc6","StlDJbgJAz","cmXIXNAFuw","LDk6f4W0Tl","KZamHM3zXL",
+"JKWYRJkzUn","Waim67hyVv","1v5hH9eoRc","M6qcGVBjhz","FwEJz7fsYM","aFFss1v5hH","C2IrcWreyP","NcICAAXpwE","C2IrcoGu6x","VerEAMmsIo",
+"X6PinwDajX","CxVEfni2v1","cL0aEyofH3","P6bcgx3LDe","lsQGociuWz","QClRLYh1hF","qaofNhYBCK","pAhR1HlUbF","C2Ircsoy9t","QworuRsQUq",
+"pAhR1aDGtS","RxrsmuTacx","RxrsmVBjhz","7fsYMzQt6Q","QnJ1S0h1b1","hE1QlQWxoT","W3VFHnnP8o","SjskQa00b5","cL0aEs4786","2DREs9rlg9",
+"lj07QogLgc","ix74r2TRI7","ix74rpAhR1","S2DfuUlU3M","VjCZqCNHmv","7lUXZOUYuF","GrDg7Yh1hF","In3NSwiHrZ","3otm6zbIYY","RpBQmIRh48",
+"NAFuwix74r","gIYvE0ao3l","I7p2a4W0Tl","yvOMIzmLYD","lm0pDfcJOy","AXpwEzQt6Q","FwEJz2hEEU","piJSkeuZA5","iwzGkC2Irc","nlaBytaOXK",
+"nFqikCIShG","Gv3FqUvlv4","oVQp6rKDLJ","1j5L8XyPZN","M3zXLZ4I1v","gtCA54QMc9","WMiS3s4786","8U2nUa00b5","0ao3ls7Mxk","Nxx9VHP433",
+"hi5X74dEz6","pv0i7580YD","h1zcH5Mg9r","guMb8jS1aj","n8pJ9kZANm","CIShG8FmFH","55rfBzmLYD","aL6AJO3iyQ","IBe8kQworu","VBjhzlCMxy",
+"EoToPlpF6W","Uvlv4uLtKs","DG4sTNAFuw","CIShGJRJQB","Uvlv4uupzk","GrDg7oQ87r","Kr8ysk85Ae","s7MxkGv3Fq","sqVrf14FLR","9GXkXzHF1q",
+"KASQ8fLNg8","gtCA5lj07Q","8U2nUQnJ1S","lsQGoQworu","UlU3MJRJQB","CNHmv4dEz6","FLsphM6qcG","oGu6xTXQ0Z","JRJQBFxX9q","HP433gjUTu",
+"1j5L8n8pJ9","vkCHHCqqaD","cShY2JKWYR","uPX7GiKqhr","7fsYMzqH0W","Chuy3pWiOs","2NslmuoStw","POUYSciuWz","F6PT2ZuDtD","fcJOyF6PT2",
+"oQ87raDGtS","s47866AFT0","O3iyQBCxeC","0YAGHQnJ1S","HzZT8KZamH","GSQwjAIYUu","blLA9EdBKc","mX2GE7hyVv","1LB1Ldjsrv","yvOMIlpF6W",
+"fcJOycQOnv","oGu6xJkzUn","CqqaDlCMxy","ydG8UVerEA","BGaQY1LB1L","dpe1v14FLR","iqv4kjSjS3","lCMxyRmDcr","I7p2aMkgy8","SbRYyazIWp",
+"tuDySjS1aj","HzZT8jtn0X","VerEAGSQwj","AgJHQaFFss","4dEz6ZuDtD","FNYIMjiVBP","FVMxoQssNC","zQt6Qru4UG","rhl0JuJScX","iqv4kCxVEf",
+"JRJQBhYBCK","6q6L9RpBQm","yluBxgtCA5","Mm8siksJby","uLtKsVIlwP","a00b5VjCZq","StlDJCK5W7","mz8gxvkCHH","VBjhzK20wK","IjTwPJIqXi",
+"ciuWzn1pmO","UlU3MfcwDa","CIShGl83Ud","m4bxUvLsmS","zqH0WdhSuH","WreyPMm8si","64s8NhSSvQ","FjHXRWMiS3","48cHLQChxs","KZamHjfREu",
+"0PktIZ4I1v","djsrvI7p2a","h1zcHYf2Ec","jtn0XtlILt","wDajXMmsIo","WPmlx0MR5X","zmLYDpmeCd","5drc6gIYvE","zqH0WlkMUA","MojnPTa8f6",
+"AIYUu64s8N","IRh48uN6r3","FNYIMiB08l","FwEJzFcWrW","gIYvEyluBx","dQ586MezSW","RBhp08xEKz","FxX9qRzaZA","VNCPdK4GS8","aez9yQClRL",
+"W3VFHlkMUA","rKDLJs4786","Q6hMCdmoS7","BFkb8suY4x","s7Mxk8TxD7","POUYSMK07Y","yEfy9X6Pin","64s8NQ6Lix","euZA5ZzJHW","xXTI4MojnP",
+"Chuy3WMiS3","Yw2oUpAhR1","VNCPd5Mg9r","GrDg7aDGtS","ECMvUQYxC0","Qworu0Kyfs","d85a9VBjhz","JKWYREdBKc","WPmlxPYBf4","kB5nP9eoRc",
+"Uvlv4v1Hln","sx5GlFFDui","n1pmOVLTy6","S2DfuBGaQY","CxVEfQClRL","Yh1hFDcpWB","LbRTHqaofN","hYBCKM3zXL","ZJTXHo8Uyd","gIYvEVjCZq",
+"tAOsrtvdkD","gdQsSuAWyp","TXQ0ZBpYhV","W7cTsLbRTH","1LB1LzQt6Q","RzaZA7fKYU","HP433ni2v1","29QAzMkgy8","24ARFuN6r3","lsQGovLsmS",
+"prNT6W3VFH","1j5L89rlg9","brhlQX6Pin","SmGzvuZPqg","Fhtgly94nw","XflUq55rfB","2NslmDLhzM","WPmlxNAFuw","Ss0ZuzQt6Q","lkMUAYh1hF",
+"Cfgr3AmdQd","RmDcrjeskS","mz8gxVprf2","M3zXLDG4sT","zY1GYCNHmv","Uvlv4lm0pD","5Drn0FjHXR","MaJQspvgjS","uPX7GThjNn","RmDcrUvlv4",
+"LDk6f7lUXZ","qUJMd9eoRc","8xEKz9iGoT","KZamHlj07Q","IjTwPciuWz","dmoS7kB5nP","gdQsSnFqik","rhl0Jdjsrv","DLhzM9y4lw","07n1cHfyNQ",
+"yluBxZhwG1","t98iWIBe8k","RzaZA7ku1p","ECMvUk85Ae","RzaZAQChxs","7Ow5CXyPZN","tl72WlweGy","ThjNnCxVEf","0MR5XJIqXi","AXpwEQChxs",
+"8xEKz8U2nU","9rlg9zbIYY","WMiS3RkQke","FhtglUmaEv","AIYUutaOXK","HP433WDVWJ","jS1ajzHF1q","9rlg9LDk6f","Cfgr3MojnP","B3qemWmadA",
+"J2mQiogLgc","QnJ1Szz4ZU","1v5hH618Di","14FLROxWIH","GXdoHgf8rI","EoToPYf2Ec","a00b5K20wK","B3qemFNYIM","pFrrl9rlg9","Yw2oUyvOMI",
+"ru4UG2Nslm","OUqFMni2v1","qUJMdMK07Y","SmGzvJXljW","TXQ0ZYOfrY","QssNC5IhmG","LbRTHS77LH","TXQ0ZMm8si","FVMxoKASQ8","iqv4kAIYUu",
+"s4786RkQke","i7WMQJRJQB","GXdoHDLhzM","jS1aj7fKYU","Waim68RCUA","NhXduHzZT8","BCxeCW7cTs","mX2GEydG8U","LDk6fyEfy9","CK5W7SWfou",
+"QWxoTK20wK","k85AeDz1R3","I7p2atl72W","jeskSuN6r3","QbxXc45cIH","AIYUus93Ml","5nmWvatef2","BpYhVbrhlQ","DcpWBAgJHQ","Oz8yZx3LDe",
+"aL6AJ48cHL","5nmWvL7cGc","9XyT9P6bcg","prNT6FjHXR","uLtKsMojnP","lj07QEdBKc","uN6r3oGu6x","8xEKzgIYvE","CxVEfJRJQB","XyPZNguMb8",
+"xciqpGv3Fq","Nxx9Vpv0i7","CqqaDrhl0J","Y1mC0M6qcG","wDajX9GXkX","GrDg7x3LDe","b29RJCqqaD","tAOsrlj07Q","djsrvMojnP","VIlwPo8Uyd",
+"Y1mC0GrDg7","Uvlv4aFFss","euZA55ZaEz","lXFOBru4UG","FPfSEUlU3M","ZUnqtQworu","ZUnqtRBhp0","uPX7GTCgPp","Yh1hF55rfB","yvOMI8FmFH",
+"5nmWvsqVrf","lXFOBJIqXi","7fKYUKr8ys","MGlTFHP433","jtn0XtvdkD","VjCZqatef2","uLtKsgtCA5","sqVrfQYxC0","DG4sTSs0Zu","qUJMdoGu6x",
+"F6PT2LewvM","Dz1R3Oz8yZ","jiVBPK20wK","FwEJzx3LDe","a00b52ZHdk","1j5L8lkMUA","Z4I1vEdBKc","o8UydKsjRK","55rfBhE1Ql","x3LDeBCxeC",
+"WPmlxsqVrf","m4bxUhUTw7","yofH314FLR","uZPqg64s8N","BFkb8Yh1hF","uAWypFxX9q","RkQkeWaim6","qUJMd7ku1p","5Drn0CK5W7","RmDcr2Yz7E",
+"C2IrcxReec","qaofNokgRi","QWxoTsx5Gl","MmsIoJJs5m","yluBxlH1kt","45cIHnnP8o","RBhp0qQxHP","faHirprNT6","lkMUAiKqhr","M6qcGgtCA5",
+"iqv4kix74r","jSjS3uQIcz","tuDySNAFuw","fmIK1B3qem","n8pJ907n1c","HP433fmIK1","In3NSnFqik","lkMUA5iGN5","xReec3otm6","HlUbFzqH0W",
+"ix74ruN6r3","G1RhS0YAGH","5IhmGsqVrf","M3zXL618Di","Ta8f6JIqXi","ZhwG1CxVEf","guMb8hE1Ql","uPX7GdmoS7","0h1b1ogLgc","fqypyNAFuw",
+"o8UydDLhzM","VLTy6uZPqg","soy9tMezSW","Mm8siQClRL","1v5hHW7cTs","GSQwjKASQ8","uTacx9XyT9","VBjhzZv7z0","EdBKc0BmCy","hSSvQgf8rI",
+"Yw2oUzY1GY","FhtglXyPZN","rhl0JW3VFH","yEfy9dmoS7","CNHmvs7Mxk","ydG8UFLsph","jiVBPt59lR","a00b5Mkgy8","tvdkDjfREu","ZuDtDFGzgp",
+"QbxXcpWiOs","0PktId85a9","piJSklm0pD","9eoRcfcwDa","Gv3Fq8xEKz","fcJOyJkzUn","aL6AJZzJHW","YOfrYmz8gx","ZuDtDNhXdu","GWqqXwiHrZ",
+"9rlg9tuDyS","Gv3FqQnJ1S","tvdkDO3iyQ","aL6AJWDVWJ","t59lRCxVEf","lweGyOxWIH","QClRL8TxD7","hi5X7Kr8ys","D6rByzY1GY","0PktIbrhlQ",
+"MGlTFMK07Y","ThjNnuoStw","LewvMdpe1v","ZJTXH16lHc","uTacxSmGzv","s4786uoStw","ciuWzTwano","GrDg7Chuy3","64s8NOUqFM","iB08lMmKGJ",
+"fmIK1OUqFM","lm0pDRmDcr","azIWpVerEA","lweGyGXdoH","t59lRNOHsz","Mm8siru4UG","S2DfujSjS3","AXpwECqqaD","Chuy3CxVEf","7fKYUbrhlQ",
+"lweGyD6rBy","7X3uy8cVD3","lViBvprNT6","2TRI7L7cGc","AOgEe0h1b1","pmeCdRzaZA","Ta8f6POUYS","TwanoLDk6f","S2DfugtCA5","pT8wuJXljW",
+"QworuhE1Ql","Yf2EcxReec","FPfSEFLsph","jeskSyvOMI","RBhp0pFrrl","xciqpoVQp6","okgRis4786","MezSWs93Ml","uAWypoGu6x","dpe1vFhtgl",
+"HP4332TRI7","AIYUuIjTwP","ulk419y4lw","GSQwjpT8wu","48cHLK4GS8","IRh48EOE1o","FcWrWnlaBy","HRxd80ao3l","0BmCyxciqp","faHiryvOMI",
+"JXljW0MR5X","M3zXLSbRYy","pFrrlIjTwP","xReec2ZHdk","yofH3POUYS","Dz1R3s93Ml","soy9tWreyP","tvdkDAmdQd","4QMc9Mm8si","vOqCEvLsmS",
+"8hJdttvdkD","mX2GElsQGo","AkKTkjiVBP","POUYSaFFss","oGu6xuvf7A","GWqqXWreyP","faHirzY1GY","okgRiciuWz","IBe8kQ6hMC","pvgjSlkMUA",
+"gjUTu5Mg9r","EOE1oMmKGJ","v1Hlne6e4z","Cp3mZQ6Lix","FNYIMTCgPp","cQOnvjzUqR","i3pydjtn0X","x3LDed7vjM","0Wr5yyEfy9","CK5W7hi5X7",
+"WmadAni2v1","pT8wuatef2","7fsYMaFFss","pmeCduZPqg","JXljW0PktI","Ta8f607n1c","BCxeClViBv","i3pydCIShG","ZUnqtHfyNQ","gjUTuQ6Lix",
+"QYxC0ogLgc","zFgtBThjNn","cmXIXRsQUq","hSSvQW3VFH","M3zXLVBjhz","1v5hHOUqFM","b29RJfcwDa","KsjRK0h1b1","1j5L8e6e4z","WaWsvzFgtB",
+"JkzUnMmsIo","MaJQsmX2GE","FwEJzlkMUA","FLsphzHF1q","HzZT8aL6AJ","nFqik55rfB","Yf2EcuTacx","ogLgcMmsIo","DQimpbrhlQ","6AFT0qUJMd",
+"tlILtyEfy9","jzUqRYf2Ec","cQOnvt98iW","i3pyd5ZaEz","7fsYMdhSuH","JkzUnIKxdL","MmsIoQ6hMC","JKWYRs4786","ulk41FwEJz","hE1QlB3qem",
+"ZhwG1yEfy9","5VZjSpv0i7","In3NSgjUTu","W7cTsHzZT8","CqqaDVLTy6","Q6hMCsuY4x","ZUnqtnFqik","nnP8oDG4sT","In3NSBFkb8","brhlQbrhlQ",
+"lm0pDt59lR","uTacxRxrsm","v8yFNyofH3","WreyPBGaQY","WDVWJ0YAGH","ECMvUqaofN","FhtglJIqXi","AIYUuYjB9t","jSjS3F6PT2","gdQsSMmsIo",
+"NAFuwFNYIM","dmoS7Dz1R3","EdBKc9XyT9","AOgEecShY2","jzUqRx3LDe","Kr8yspv0i7","nFqikVprf2","Cfgr3Rxrsm","I7p2aM6qcG","VerEA9iGoT",
+"Ss0Zu45cIH","qQxHPjSjS3","Gv3FqDcpWB","NAFuwIBe8k","a00b5RmDcr","StlDJpWiOs","NAFuwOHaBz","XflUqfFDrJ","5VZjS5Mg9r","tlILth1zcH",
+"2hEEUZv7z0","5ZaEz2Nslm","uAWyp8RCUA","WmadA8cVD3","Zv7z0QClRL","faHirvOqCE","UmaEv55rfB","v8yFNZhwG1","tAOsrbgJAz","lpF6WStlDJ",
+"iKqhrTwano","VLTy6ZJTXH","P6bcgn8pJ9","5IhmGX6Pin","jfREupFrrl","2NslmlsQGo","fFDrJStlDJ","Y1mC0DG4sT","uupzkzHF1q","ZUnqtC2Irc",
+"9XyT98FmFH","B3qemlCMxy","QworuRxrsm","uN6r3ix74r","G1RhSIBe8k","FGzgp9y4lw","VjCZqWaWsv","TXQ0ZiKqhr","4QMc92hEEU","Q6hMCCxVEf",
+"RmDcrB3qem","brhlQHfyNQ","M3zXLThjNn","0h1b1gdQsS","lpF6WoGu6x","FxX9quN6r3","cL0aERmDcr","faHirStlDJ","s4786JIqXi","qaofN5Mg9r",
+"QYxC09rlg9","FxX9qEoToP","tl72WlkMUA","ReKEWgtCA5","KASQ8kZANm","Q6hMCxReec","EdBKcMGlTF","s93MlfcwDa","M6qcG5nmWv","lCMxyDcpWB",
+"WmadATXQ0Z","AOgEehYBCK","S2Dfu7Ow5C","pWiOsqaofN","EOE1ouPX7G","yofH3yofH3","uPX7GjeskS","lkMUAfaHir","0KyfsbgJAz","uAWypGSQwj",
+"n8pJ9ZhwG1","fmIK1Chuy3","HfyNQWreyP","tvdkD8cVD3","WMiS3lViBv","Vprf2W7cTs","uLtKsgf8rI","v2eC3StlDJ","i7WMQSmGzv","GXdoHNxx9V",
+"G1RhSLDk6f","GXdoHCxVEf","CdyBVv2eC3","t98iWfqypy","FnPFBEoToP","jfREu6AFT0","s4786ix74r","8hJdtFcWrW","tAOsrrz7Ut","fqypypWiOs",
+"uAWypvkCHH","pmeCd8xEKz","45cIHNAFuw","YOfrYGrDg7","CNHmvlweGy","tuDySOxWIH","Cfgr3gf8rI","lsQGov1Hln","UlU3MHzZT8","W7cTs8hJdt",
+"RACuj1j5L8","9GXkXjzUqR","lm0pDBpYhV","BCxeCCfgr3","FhtglqaofN","16lHc0MR5X","FFDuiVNCPd","FVMxom4bxU","zQt6Qrhl0J","aDGtSqUJMd",
+"8hJdtyvOMI","fLNg8W7cTs","HfyNQYh1hF","Waim6dpe1v","s7MxkHfyNQ","GSQwjG1RhS","Q6hMCAOgEe","2Yz7E8hJdt","MojnP4W0Tl","AXpwEoQ87r",
+"tlILthe9IA","1j5L8yluBx","kB5nP7X3uy","5ZaEz7fsYM","OUqFMyEfy9","45cIH618Di","azIWpStlDJ","TCgPpzqH0W","nnP8oXyPZN","atef2fqypy",
+"GXdoH45cIH","K4GS8blLA9","pv0i7Q6hMC","uupzkHlUbF","lH1ktVNCPd","piJSkBGaQY","XyPZNWreyP","IKxdLVLTy6","gjUTua00b5","zQt6Q5Drn0",
+"dpe1vsqVrf","2DREsoGu6x","lXFOBYf2Ec","tvdkDuQIcz","dpe1vpiJSk","EoToPQnJ1S","VLTy6lpF6W","rz7Ut4W0Tl","n8pJ9Yf2Ec","5Nammx3LDe",
+"9eoRcS2Dfu","8FmFHSjskQ","cL0aEVIlwP","YOfrYG1RhS","tuDyShYBCK","FjHXR8RCUA","BpYhV7hyVv","GWqqXFhtgl","M6qcGFcWrW","Q6LixdhSuH",
+"O3iyQC2Irc","LDk6fChuy3","JkzUns93Ml","G1RhSQChxs","AXpwEIBe8k","jeskSChuy3","rhl0JBGaQY","VjCZqZuDtD","2DREs4W0Tl","5drc6QWxoT",
+"zz4ZUprNT6","1LB1Le6e4z","o8Uydv8yFN","GrDg7O3iyQ","FPfSEQYxC0","RxrsmI7p2a","8TxD7S77LH","WDVWJjS1aj","ni2v1Zv7z0","uPX7GQssNC",
+"vOqCEWPmlx","HP433uTacx","dhSuHjeskS","IBe8kzQt6Q","uAWypnnP8o","zqH0WkB5nP","9XyT9dhSuH","l83UdOHaBz","sqVrfciuWz","8RCUAxXTI4",
+"FcWrWhE1Ql","rhl0JLDk6f","CdyBVqaofN","Q6hMCAIYUu","K20wKK4GS8","y94nwdpe1v","Kr8ys0Kyfs","v2eC3OUYuF","i7WMQ0MR5X","7fKYUCxVEf",
+"FjHXRMK07Y","gIYvEVLTy6","FnPFB7ku1p","2Nslm0BmCy","LDk6fksJby","h1zcHjzUqR","JRJQBxciqp","fqypyIRh48","2Yz7Ev8yFN","8FmFHMGlTF",
+"5iGN5FxX9q","1v5hHOHaBz","2TRI7Nxx9V","8U2nUblLA9","uZPqgKZamH","FFDuiPOUYS","1LB1LGWqqX","29QAzFNYIM","kZANmGrDg7","zqH0WJkzUn",
+"lsQGo0YAGH","0MR5XpmeCd","Mkgy8gjUTu","D6rByFjHXR","FjHXR5iGN5","gf8rI45cIH","d85a9jeskS","X6PinZhwG1","LewvMWDVWJ","ThjNnYOfrY",
+"I7p2aYw2oU","07n1cYOfrY","Yf2Eclj07Q","0h1b18xEKz","AOgEelweGy","5Drn0hE1Ql","fFDrJJRJQB","X6PinHfyNQ","FGzgpjiVBP","MojnPI7p2a",
+"djsrvFnPFB","brhlQGSQwj","BCxeCG1RhS","0KyfsReKEW","Kr8yszqH0W","sx5GlzY1GY","hYBCKVLTy6","uPX7GxReec","0PktIuJScX","a00b5RACuj",
+"5IhmGW3VFH","2ZHdkpFrrl","ix74rjtn0X","0PktI7fKYU","gtCA5IRh48","HP4332hEEU","ru4UGzmLYD","OUYuF2TRI7","0KyfsMmsIo","he9IAX6Pin",
+"a00b5ciuWz","QworuUvlv4","9GXkXMK07Y","YjB9tKZamH","cQOnv2Nslm","uvf7AQYxC0","BGaQYS2Dfu","ZJTXHDz1R3","JJs5mMezSW","fFDrJoVQp6",
+"lpF6WXflUq","45cIHQworu","NhXduOUqFM","uLtKsZv7z0","C2IrcGv3Fq","jtn0Xfqypy","Yh1hFsx5Gl","DLhzMCfgr3","LbRTHPYBf4","uvf7A2TRI7",
+"8FmFHKASQ8","POUYS0Kyfs","Fhtgle6e4z","IjTwPQChxs","xReecNxx9V","No0Qbaez9y","FFDuiWaim6","24ARFvLsmS","F6PT26AFT0","tl72WoVQp6",
+"prNT6vkCHH","Yh1hFKASQ8","FxX9qQworu","i7WMQDcpWB","BpYhV5nmWv","UmaEvoVQp6","HRxd84dEz6","4QMc9s4786","aFFssAXpwE","pT8wud85a9",
+"8hJdtIn3NS","gdQsSgtCA5","8TxD7YOfrY","1v5hHPb1pa","FjHXRHfyNQ","AkKTktvdkD","oQ87rRACuj","Kr8yszFgtB","uLtKsNo0Qb","ZzJHWd85a9",
+"jtn0XogLgc","M3zXL9XyT9","7fKYUjfREu","pv0i7uZPqg","48cHL5Namm","uJScXpv0i7","RzaZAzQt6Q","MmsIoksJby","7lUXZM6qcG","KsjRKQ6hMC",
+"suY4xRzaZA","0MR5XfcJOy","JIqXiBGaQY","WMiS36AFT0","jSjS3FxX9q","NOHszQChxs","Cp3mZatef2","x3LDe2DREs","X6PinK4GS8","SjskQK20wK",
+"618DiogLgc","64s8NECMvU","bZLvSfcJOy","lj07Q7lUXZ","ydG8UFPfSE","5iGN5gdQsS","Pb1pauLtKs","hYBCKHzZT8","4W0TlzFgtB","pAhR1TCgPp",
+"cmXIX4QMc9","blLA9i3pyd","14FLRLDk6f","9XyT9vLsmS","7fKYUSbRYy","7fsYMoVQp6","Yw2oUgjUTu","14FLRzz4ZU","wDajXZzJHW","WaWsvcShY2",
+"HP433Zv7z0","BFkb864s8N","fLNg80YAGH","W7cTs0YAGH","3weIFI7p2a","Cp3mZRsQUq","cL0aE9eoRc","FNYIM7hyVv","QYxC0WDVWJ","zHF1qBFkb8",
+"KsjRKrhl0J","1LB1LoGu6x","taOXKM3zXL","FcWrWhUTw7","NAFuwdmoS7","RmDcrpT8wu","lCMxyNxx9V","TXQ0ZL7cGc","9rlg9cmXIX","yluBxaL6AJ",
+"LDk6fnnP8o","AgJHQZhwG1","pv0i7vLsmS","lj07QtlILt","lpF6W8hJdt","VNCPduN6r3","FPfSEYjB9t","GWqqXBpYhV","MGlTFtlILt","n8pJ9BGaQY",
+"yvOMIHfyNQ","lkMUAS77LH","qaofNQnJ1S","RmDcrpv0i7","7lUXZL7cGc","AmdQdNcICA","jzUqRTCgPp","BGaQYeuZA5","mX2GEyluBx","AgJHQCIShG",
+"HRxd8P6bcg","qaofNl83Ud","IBe8kTwano","1LB1Li7WMQ","4W0Tlv2eC3","618Di0YAGH","ReKEWtaOXK","faHirnlaBy","tlILtpFrrl","Mkgy8wiHrZ",
+"i7WMQzz4ZU","ix74rKr8ys","tuDySs7Mxk","fmIK1he9IA","tuDySAgJHQ","ogLgcaez9y","hi5X755rfB","Z4I1vv2eC3","zHF1qMojnP","Oz8yZ5IhmG",
+"fcwDalH1kt","OUYuFHzZT8","1v5hHyEfy9","oGu6xvkCHH","zmLYDo8Uyd","QYxC0wiHrZ","oQ87ryToGW","lj07Q0MR5X","x3LDeK4GS8","JJs5mQWxoT",
+"RkQkeazIWp","FwEJzvLsmS","CIShGwiHrZ","W7cTsQworu","2Nslmtl72W","i7WMQSs0Zu","aDGtSyluBx","CqqaDtlILt","ZuDtDI7p2a","fqypy6q6L9",
+"FPfSE2TRI7","U3yw5okgRi","DQimpJkzUn","FNYIMCIShG","MezSWuQIcz","8U2nUNOHsz","RBhp0soy9t","0h1b1piJSk","rKDLJaFFss","nnP8oCK5W7",
+"wDajX8RCUA","618DiOxWIH","WreyPi7WMQ","45cIHFxX9q","RpBQmMaJQs","pvgjSDG4sT","lpF6WQWxoT","In3NSAOgEe","uLtKstjQxs","MaJQs2hEEU",
+"WDVWJuN6r3","QnJ1Sb29RJ","Q6hMCzmLYD","zqH0Wv2eC3","aez9y7ku1p","FGzgpqUJMd","I7p2arz7Ut","ru4UGzY1GY","4W0TlBFkb8","2Yz7ERzaZA",
+"F6PT2vOqCE","o8UydLewvM","lH1kt1v5hH","X6PinuJScX","tuDySCK5W7","tjQxsBbwgA","CqqaDlsQGo","Vprf2AIYUu","uoStwyToGW","gtCA5CNHmv",
+"OUqFMtlILt","aDGtSX6Pin","taOXKRsQUq","Cp3mZXyPZN","he9IAQworu","aL6AJpT8wu","MmsIovkCHH","BGaQYyvOMI","FFDuiCxVEf","BpYhVYw2oU",
+"zQt6QXyPZN","U3yw5Zv7z0","BbwgArKDLJ","jiVBPBbwgA","ydG8URmDcr","AOgEeMaJQs","fmIK15Drn0","KZamH0MR5X","hSSvQjSjS3","lViBvtaOXK",
+"jiVBPeuZA5","xciqpVjCZq","7X3uyWaim6","TwanoUlU3M","0Wr5yECMvU","S2DfulXFOB","4W0TlFcWrW","uPX7GFnPFB","6AFT0fcJOy","ZJTXHDG4sT",
+"WMiS3HRxd8","vOqCE2hEEU","v1Hln2hEEU","aL6AJuZPqg","Chuy31v5hH","t59lRru4UG","CxVEfBFkb8","W7cTsx3LDe","Mkgy87lUXZ","gdQsS7hyVv",
+"XyPZNJJs5m","FGzgpcQOnv","oGu6xyToGW","WmadAbZLvS","8cVD3OHaBz","No0Qbd85a9","JIqXis93Ml","8xEKzMGlTF","JXljW9GXkX","tvdkDhi5X7",
+"9iGoTpmeCd","K4GS8jiVBP","Y1mC0Z4I1v","uQIczblLA9","RkQkeLDk6f","cmXIXK4GS8","gtCA52Nslm","IKxdLPYBf4","zFgtBWaim6","XyPZNCdyBV",
+"suY4xnlaBy","he9IAlweGy","uAWypxciqp","ni2v1fFDrJ","mX2GEe6e4z","tjQxsZJTXH","pWiOsru4UG","K20wKJJs5m","X6Pin14FLR","oQ87rtvdkD",
+"Ss0ZuCK5W7","lj07QK4GS8","VLTy6fqypy","ogLgc48cHL","VLTy61j5L8","pT8wuC2Irc","pmeCdYOfrY","3weIF5drc6","kZANmChuy3","ulk41G1RhS",
+"5nmWv0BmCy","55rfBi7WMQ","8cVD3VerEA","RkQkeLewvM","Kr8ysFPfSE","YjB9tcL0aE","0h1b1POUYS","uPX7GjiVBP","RmDcr0h1b1","BGaQYpvgjS",
+"kZANmwiHrZ","16lHcfqypy","oGu6xYf2Ec","hE1QlO3iyQ","HfyNQOxWIH","taOXKzbIYY","kZANmOHaBz","qQxHPVjCZq","xReec5IhmG","oGu6xfLNg8",
+"kB5nP7ku1p","CqqaDjSjS3","gtCA5n1pmO","uvf7AW7cTs","o8UydMmsIo","dQ586lj07Q","07n1cvOqCE","7X3uy29QAz","EoToP8TxD7","YjB9tMojnP",
+"3otm6bgJAz","VerEARkQke","lsQGojfREu","UmaEvRACuj","64s8NCp3mZ","qQxHPQYxC0","o8UyduAWyp","jiVBPQChxs","pWiOsQClRL","sqVrf2Yz7E",
+"rz7UtMaJQs","4QMc95Drn0","s7MxkVBjhz","0ao3lAOgEe","7ku1pydG8U","gdQsSlm0pD","n1pmOpvgjS","OxWIH580YD","cQOnvpv0i7","uoStwHlUbF",
+"rKDLJdmoS7","VBjhzrz7Ut","jSjS3ix74r","pAhR1QbxXc","blLA9iqv4k","FPfSEbrhlQ","MGlTFQClRL","M6qcGqaofN","MGlTF0YAGH","hUTw7EdBKc",
+"ix74ryToGW","oVQp6J2mQi","P6bcg7lUXZ","7fKYUqUJMd","fqypyiB08l","EOE1otaOXK","BGaQYy94nw","29QAzK20wK","Mkgy8FNYIM","cL0aEi3pyd",
+"EdBKcU3yw5","4QMc9AmdQd","1v5hHgjUTu","JJs5md7vjM","No0QbLbRTH","BFkb8CxVEf","5IhmGAkKTk","zbIYYpiJSk","ru4UG0YAGH","fqypy9GXkX",
+"16lHc6AFT0","lH1ktM6qcG","KsjRKMm8si","zz4ZURmDcr","a00b5tlILt","ZzJHW3weIF","CNHmvHP433","8cVD3BFkb8","RmDcrrhl0J","FPfSEsx5Gl",
+"d85a9CqqaD","P6bcgd85a9","HRxd8AkKTk","Zv7z0Yh1hF","VLTy6fLNg8","dpe1vGWqqX","o8UydFjHXR","ReKEWW7cTs","hYBCKECMvU","YOfrYXflUq",
+"oQ87rsqVrf","RmDcrzY1GY","M3zXL7Ow5C","FVMxolsQGo","1LB1L0h1b1","Mkgy85nmWv","aez9yguMb8","xReecblLA9","uTacxh1zcH","4dEz6M6qcG",
+"iwzGkHlUbF","zz4ZUCK5W7","GXdoHjzUqR","MmsIoOHaBz","tjQxsAOgEe","JRJQBMK07Y","ydG8USWfou","zQt6QJXljW","uLtKsIKxdL","VIlwP5VZjS",
+"jtn0XuPX7G","W7cTsBbwgA","pAhR1IjTwP","NcICAaDGtS","VBjhzHlUbF","h1zcHNAFuw","0Wr5yhUTw7","GSQwjokgRi","EOE1o2DREs","7fKYUIKxdL",
+"v8yFNtvdkD","l83UdBbwgA","0PktIChuy3","qaofNzQt6Q","MezSW2hEEU","aDGtSyEfy9","vkCHHOHaBz","YjB9t7ku1p","zQt6QhYBCK","W3VFHAkKTk",
+"e6e4zsoy9t","guMb8Z4I1v","Cfgr38RCUA","2hEEUW7cTs","t98iWUlU3M","RBhp0i7WMQ","WmadAtaOXK","KZamHRpBQm","UmaEv7hyVv","CdyBVSWfou",
+"1LB1Ll83Ud","In3NSlViBv","nlaBy8TxD7","kB5nPzY1GY","uQIczyEfy9","1v5hHo8Uyd","ReKEW0YAGH","s93MlYh1hF","9GXkXgf8rI","piJSkuJScX",
+"vLsmSpvgjS","dQ586SmGzv","zz4ZUuPX7G","lViBvIjTwP","2Nslm9XyT9","7lUXZ2ZHdk","MojnPAXpwE","t59lRlkMUA","14FLRHRxd8","jSjS3atef2",
+"d85a9kB5nP","RzaZAU3yw5","zFgtBX6Pin","8cVD3b29RJ","b29RJIn3NS","bZLvS0YAGH","6q6L9ydG8U","dhSuH4W0Tl","bgJAzQChxs","VerEAAmdQd",
+"yvOMIsqVrf","Uvlv4JXljW","2NslmiB08l","aez9yksJby","zFgtBEdBKc","9XyT95Drn0","JRJQBFhtgl","7hyVvVIlwP","AmdQdThjNn","MmsIodjsrv",
+"QClRLpvgjS","hUTw7vkCHH","In3NSgdQsS","X6PiniwzGk","XyPZNWaim6","5VZjSZUnqt","X6PinYOfrY","JKWYRJKWYR","AIYUuOUYuF","5Drn0ciuWz",
+"1LB1LDG4sT","9XyT9gIYvE","ReKEWFPfSE","7fsYMTCgPp","v8yFNECMvU","Q6Lix29QAz","iKqhrpFrrl","mX2GEOz8yZ","M3zXLlj07Q","WaWsvYOfrY",
+"qQxHPMm8si","tl72WiwzGk","K20wKAXpwE","55rfBSbRYy","KZamHgjUTu","JIqXiSjskQ","4W0TlRACuj","8xEKzyluBx","cShY2yofH3","FxX9qlXFOB",
+"VerEAzHF1q","8U2nUMmKGJ","faHirFjHXR","29QAzKr8ys","RzaZA4QMc9","0Kyfs9XyT9","BbwgACIShG","2ZHdkJJs5m","pWiOsMojnP","jzUqRHzZT8",
+"AXpwEUmaEv","BGaQYWPmlx","sx5GlUlU3M","y94nwaL6AJ","iB08lzQt6Q","ni2v1GWqqX","ciuWzeuZA5","LewvMYOfrY","s93MlqQxHP","RACuj3otm6",
+"W3VFHCp3mZ","rhl0Jm4bxU","fmIK1F6PT2","ix74rWaim6","MojnPLewvM","LbRTHFxX9q","Waim6nnP8o","gjUTuokgRi","lkMUA0PktI","0Wr5ygIYvE",
+"FwEJzB3qem","7Ow5CUvlv4","MmKGJlViBv","Rxrsm64s8N","FjHXR7X3uy","WDVWJsx5Gl","pWiOsn1pmO","i3pydtaOXK","Ss0ZuGXdoH","S77LHL7cGc",
+"JRJQB14FLR","brhlQ24ARF","OUqFMRsQUq","oQ87rcmXIX","OHaBz55rfB","NAFuwxXTI4","UmaEvsoy9t","ZuDtDBCxeC","v8yFN55rfB","OxWIHCdyBV",
+"yEfy9zFgtB","hYBCKpmeCd","cShY26AFT0","uN6r3lsQGo","FcWrWQChxs","LewvM5Mg9r","VjCZqVerEA","LDk6fbZLvS","qUJMd9y4lw","C2IrcYOfrY",
+"K4GS8FVMxo","aFFss5Drn0","oQ87rciuWz","8xEKzlViBv","JJs5mDz1R3","SWfouFjHXR","rKDLJQssNC","b29RJ1j5L8","RxrsmmX2GE","9rlg9taOXK",
+"1v5hHSmGzv","x3LDeTa8f6","KsjRKIBe8k","v1HlnwDajX","fFDrJuAWyp","ZuDtD24ARF","cShY2lViBv","Zv7z00h1b1","hYBCKDcpWB","yofH3W3VFH",
+"CIShG5Namm","a00b5FjHXR","rhl0JBbwgA","RkQkeJ2mQi","YjB9tIBe8k","KZamHh1zcH","uvf7ACxVEf","0PktIYOfrY","FFDui2Nslm","gtCA5DcpWB",
+"GSQwjfFDrJ","i3pydQ6hMC","JKWYRAIYUu","5VZjSMkgy8","VLTy6uoStw","lH1ktuvf7A","pv0i7CqqaD","tvdkDOz8yZ","rhl0JlsQGo","djsrvJJs5m",
+"4QMc98U2nU","PYBf4ZuDtD","uupzk07n1c","gjUTuzHF1q","yToGWzqH0W","tAOsrt98iW","07n1c9GXkX","QworujS1aj","0YAGH2Yz7E","8FmFHJKWYR",
+"8RCUAksJby","soy9t1j5L8","qUJMdFjHXR","Mkgy84W0Tl","HP433OUYuF","2TRI7yEfy9","rKDLJUvlv4","lj07QLewvM","B3qemBCxeC","5Nammiqv4k",
+"qaofNXflUq","JKWYR0ao3l","v2eC3FLsph","IRh48FFDui","fqypyeuZA5","GrDg72Nslm","P6bcgl83Ud","n1pmOIBe8k","oQ87rUvlv4","sx5GlGXdoH",
+"okgRim4bxU","k85Ae9XyT9","aez9yThjNn","nlaByCfgr3","yluBxn1pmO","2TRI7AXpwE","VNCPdNOHsz","2DREs580YD","Fhtgl9y4lw","XyPZNWMiS3",
+"XflUq1LB1L","mz8gxNxx9V","jtn0XRmDcr","No0Qbuupzk","zmLYDFwEJz","ZzJHW45cIH","KZamH1v5hH","jSjS3uZPqg","Kr8ysdQ586","hE1QlZv7z0",
+"0PktI4dEz6","djsrvWreyP","0BmCyFwEJz","BCxeCNhXdu","ThjNn8cVD3","IKxdLSjskQ","VIlwPpmeCd","AgJHQjtn0X","OxWIHIRh48","Waim6lweGy",
+"uoStwCqqaD","CNHmvtl72W","NAFuwfaHir","pAhR1S77LH","iqv4k7lUXZ","jtn0Xm4bxU","55rfB618Di","RkQkejzUqR","VjCZqOxWIH","gIYvEUvlv4",
+"QssNCzmLYD","8FmFHnnP8o","2Yz7E0PktI","CdyBVvLsmS","WDVWJnlaBy","FnPFBl83Ud","ogLgczqH0W","9rlg9580YD","CqqaDfqypy","cShY2AmdQd",
+"WPmlxIjTwP","580YDCqqaD","s4786YOfrY","zbIYYDG4sT","n8pJ93otm6","zHF1qatef2","J2mQihE1Ql","JkzUn8TxD7","t59lRcmXIX","uupzk8U2nU",
+"sqVrfgtCA5","fFDrJlCMxy","JJs5mBpYhV","FnPFBAOgEe","0h1b1s7Mxk","tvdkDQnJ1S","Yf2EcNAFuw","BpYhVjfREu","ZzJHWpv0i7","IRh48QWxoT",
+"618DiZv7z0","jS1ajMmKGJ","8U2nURACuj","tl72WCqqaD","zbIYYaDGtS","CK5W7WaWsv","gdQsSpT8wu","Yf2EcLewvM","QChxsJIqXi","HzZT8C2Irc",
+"lsQGoAkKTk","x3LDe5ZaEz","vOqCEAkKTk","i3pydIjTwP","pFrrl1LB1L","VBjhzjzUqR","WmadAKASQ8","24ARFCxVEf","bgJAzZuDtD","aez9yulk41",
+"580YDuoStw","LewvMgf8rI","QWxoTuN6r3","dQ586618Di","DG4sTDz1R3","FGzgpSmGzv","X6Pin9rlg9","K20wKZzJHW","SbRYySmGzv","wiHrZECMvU",
+"suY4xxReec","JIqXi0YAGH","7fKYUFLsph","lweGyvOqCE","OHaBzSmGzv","9GXkXhi5X7","QChxsQWxoT","Pb1pah1zcH","fqypyydG8U","KZamHm4bxU",
+"pFrrlzmLYD","DcpWBJKWYR","B3qem07n1c","ix74rNo0Qb","pAhR1m4bxU","Y1mC0M3zXL","Mm8sijfREu","sx5Glt59lR","fcwDah1zcH","Qworulm0pD",
+"lXFOBpiJSk","LDk6fPOUYS","Q6Lix0PktI","MK07YuJScX","FcWrWiwzGk","pFrrlRzaZA","M3zXLQssNC","0Wr5y2DREs","uPX7Gpv0i7","vkCHHsx5Gl",
+"MGlTFqQxHP","bZLvSBCxeC","ni2v1MmKGJ","QnJ1S5nmWv","ZUnqtuoStw","uJScX2Yz7E","AIYUuGrDg7","GXdoHlweGy","7hyVv3otm6","dmoS7fFDrJ",
+"GSQwjMojnP","cShY2o8Uyd","WmadAguMb8","4W0Tl8hJdt","n1pmO8U2nU","C2IrclCMxy","QWxoTCdyBV","ciuWzMGlTF","Mkgy8TCgPp","vLsmSsoy9t",
+"6q6L9aez9y","QbxXcFFDui","BFkb8vkCHH","uoStwfmIK1","uLtKs8cVD3","POUYSdmoS7","lsQGoSbRYy","jSjS329QAz","gtCA5kZANm","SjskQyluBx",
+"uZPqgSWfou","HRxd8VIlwP","sqVrflCMxy","Mkgy88FmFH","WmadAnnP8o","iKqhrRBhp0","8xEKzgtCA5","RpBQmdmoS7","aL6AJ6AFT0","uupzkgdQsS",
+"lj07QaL6AJ","VjCZqNhXdu","GrDg7dpe1v","RACujBCxeC","rz7UtOxWIH","2Yz7E0BmCy","dpe1vB3qem","gjUTu6q6L9","WDVWJWMiS3","DQimpm4bxU",
+"45cIH5iGN5","Chuy3aez9y","4W0Tl55rfB","55rfB45cIH","U3yw5jSjS3","BFkb85IhmG","yToGWPb1pa","zFgtBSWfou","YjB9thSSvQ","fFDrJnFqik",
+"1j5L8FnPFB","atef2fLNg8","v2eC34QMc9","xReeclkMUA","soy9tLbRTH","ZJTXHvLsmS","OUYuFCxVEf","XyPZNTXQ0Z","CdyBVMkgy8","JJs5mTXQ0Z",
+"lj07QfcJOy","fcJOycmXIX","QssNCgIYvE","a00b5CNHmv","VIlwPNOHsz","cL0aEChuy3","uAWyptjQxs","RBhp0nlaBy","M6qcGWreyP","7fsYMzmLYD",
+"WMiS3Zv7z0","d85a9tl72W","5Namm9GXkX","EdBKcfmIK1","EoToPuTacx","AXpwE8hJdt","UmaEviB08l","P6bcgD6rBy","9rlg9AXpwE","djsrvZJTXH",
+"AmdQdm4bxU","RsQUqk85Ae","lj07Q5VZjS","zHF1qHfyNQ","cL0aE5nmWv","FnPFBUvlv4","PYBf4lViBv","9GXkXulk41","nFqikGXdoH","lm0pDjiVBP",
+"IRh48yEfy9","MGlTFulk41","hE1QlnFqik","B3qemKr8ys","jfREuydG8U","9rlg9uLtKs","3otm65ZaEz","fcJOy5ZaEz","uPX7GHfyNQ","y94nw5Namm",
+"14FLRhE1Ql","ni2v1CxVEf","n8pJ9DcpWB","ZUnqtlm0pD","dmoS77Ow5C","qaofNzqH0W","D6rBycShY2","POUYSYh1hF","jiVBPydG8U","4dEz6JkzUn",
+"uoStwCfgr3","16lHcNxx9V","5iGN5ru4UG","QssNCTXQ0Z","KZamHS77LH","GXdoHaez9y","NOHszZ4I1v","JXljWMK07Y","JJs5mZzJHW","XyPZNSmGzv",
+"azIWpFNYIM","AgJHQcShY2","azIWprz7Ut","KASQ8Oz8yZ","FFDuinFqik","WMiS3Uvlv4","lkMUAAgJHQ","bgJAzRzaZA","hE1QlNcICA","Yw2oUuLtKs",
+"sx5Gl0Wr5y","uZPqg2Nslm","HlUbFFGzgp","POUYSYjB9t","zY1GYZJTXH","M3zXLDcpWB","VerEA9XyT9","0Wr5ylH1kt","jtn0XRxrsm","hSSvQ7fKYU",
+"8xEKzRkQke","CdyBVEoToP","gf8rIt59lR","9XyT9ru4UG","G1RhSqaofN","PYBf4VBjhz","zmLYDJJs5m","lweGye6e4z","qUJMdQ6Lix","qaofNJ2mQi",
+"L7cGcxXTI4","Mkgy8CdyBV","aFFsscQOnv","v2eC3ulk41","x3LDeFLsph","t98iW6AFT0","TXQ0Z55rfB","MojnP8hJdt","RBhp0No0Qb","WaWsvprNT6",
+"1v5hHWMiS3","OxWIHlsQGo","jeskSfFDrJ","QworuFLsph","24ARFQssNC","TCgPpPYBf4","tAOsr8U2nU","Gv3FqcShY2","HP433v1Hln","uPX7GvOqCE",
+"brhlQx3LDe","5ZaEzqUJMd","l83UdoVQp6","CqqaDk85Ae","9rlg9GXdoH","07n1cAmdQd","NOHsz55rfB","8U2nUDz1R3","7Ow5CNOHsz","BGaQYLbRTH",
+"S2DfuEdBKc","618DiksJby","v8yFNpAhR1","S2DfuAkKTk","Chuy3BFkb8","7fKYU8FmFH","xReecTwano","NcICAqUJMd","dhSuHReKEW","LDk6fqUJMd",
+"L7cGcJRJQB","MmsIo2ZHdk","lH1ktKsjRK","StlDJCqqaD","uN6r3yofH3","9rlg9s7Mxk","KZamHix74r","azIWpsoy9t","OUYuFazIWp","fFDrJi3pyd",
+"Uvlv40Wr5y","BFkb81v5hH","xReecyToGW","9iGoT0BmCy","DQimptAOsr","mX2GEtaOXK","zHF1qPb1pa","Ta8f6MezSW","ZzJHWRACuj","e6e4zbZLvS",
+"iwzGksx5Gl","5Mg9rgf8rI","qUJMdYh1hF","bgJAzrKDLJ","zY1GY5ZaEz","uPX7GrKDLJ","6q6L9SWfou","9eoRcJKWYR","2hEEUjfREu","Oz8yZhYBCK",
+"JRJQBSbRYy","n8pJ9cmXIX","yofH3618Di","uoStw6AFT0","RxrsmJIqXi","POUYS6AFT0","blLA9AIYUu","iqv4kokgRi","bgJAzM3zXL","Dz1R3SjskQ",
+"fqypyCK5W7","i7WMQ64s8N","580YDDG4sT","SWfousx5Gl","piJSkHfyNQ","VBjhzsqVrf","HlUbFIn3NS","LbRTHn8pJ9","t59lRBbwgA","Chuy3AmdQd",
+"soy9tlViBv","AOgEeQ6Lix","LbRTHX6Pin","uvf7AlCMxy","Vprf2dhSuH","RACujVprf2","NhXduhSSvQ","QbxXcogLgc","dQ5868FmFH","soy9tpvgjS",
+"8cVD3kZANm","5ZaEz5VZjS","SmGzvJIqXi","CNHmvX6Pin","0Kyfs580YD","zFgtBx3LDe","n1pmOblLA9","azIWp2Yz7E","sx5GliKqhr","X6PinaL6AJ",
+"AmdQd2hEEU","JKWYRogLgc","uvf7Atl72W","QssNCQssNC","StlDJx3LDe","ydG8UlsQGo","F6PT2rKDLJ","aDGtSDcpWB","14FLRSs0Zu","K20wKC2Irc",
+"CNHmvlCMxy","qUJMdtjQxs","cmXIXJIqXi","8RCUAs93Ml","Yf2EcsqVrf","TCgPpyEfy9","xciqp580YD","DG4sTv8yFN","WDVWJhi5X7","s93MlFPfSE",
+"jiVBPyluBx","UmaEv0Wr5y","gjUTuOHaBz","wDajXUl4a1","FFDuiZhwG1","LbRTHJ2mQi","8RCUAhSSvQ","VjCZqRxrsm","VerEA0YAGH","zbIYYAkKTk",
+"rhl0JCIShG","ksJbyEoToP","WPmlxcShY2","BpYhVReKEW","uZPqgogLgc","aDGtSfLNg8","Yh1hFFnPFB","gf8rIuvf7A","pmeCdMezSW","DLhzMzbIYY",
+"taOXKiB08l","DQimpt59lR","L7cGcnlaBy","dQ586pWiOs","7lUXZ14FLR","guMb8U3yw5","GWqqXUl4a1","uPX7GECMvU","MmKGJ4dEz6","RBhp0ciuWz",
+"nlaByblLA9","tl72Wn1pmO","RkQkeC2Irc","14FLRv2eC3","fcwDa6AFT0","pvgjS7lUXZ","zQt6QQClRL","gIYvE5Mg9r","580YDWaim6","Dz1R3m4bxU",
+"JXljWjSjS3","s7Mxktl72W","t59lRZUnqt","2Nslmuvf7A","CNHmv9y4lw","EdBKc7ku1p","QWxoTZUnqt","SmGzvVIlwP","IjTwPsx5Gl","ulk41RmDcr",
+"vOqCEix74r","UlU3MRACuj","OUYuF4W0Tl","RBhp0QssNC","iB08lFLsph","Kr8ysBFkb8","NOHszxXTI4","lXFOBbZLvS","v8yFNfLNg8","JRJQBdQ586",
+"xciqpJJs5m","QChxs2DREs","ReKEWPb1pa","Q6LixiwzGk","5IhmGCp3mZ","DLhzMvkCHH","uPX7Gzz4ZU","24ARF9GXkX","AIYUuAkKTk","prNT6fqypy",
+"Yh1hFVIlwP","580YDS2Dfu","B3qemtjQxs","jzUqR5iGN5","sx5GlzHF1q","WmadA7ku1p","FNYIMdjsrv","v8yFNBbwgA","580YDnnP8o","64s8NuPX7G",
+"UmaEvv1Hln","taOXKECMvU","QYxC0NAFuw","QbxXclsQGo","v2eC3rKDLJ","2NslmPb1pa","J2mQis93Ml","ReKEWSbRYy","1LB1L9iGoT","4dEz6580YD",
+"fmIK1uLtKs","ni2v1OUqFM","t59lR8xEKz","Mm8siJRJQB","nnP8oBFkb8","jiVBPO3iyQ","JXljW16lHc","jfREuKASQ8","jzUqRoQ87r","8cVD3QnJ1S",
+"s7Mxk0YAGH","blLA9VjCZq","pv0i7D6rBy","MaJQsUlU3M","QYxC0aez9y","yluBxgf8rI","VBjhz3weIF","JXljWSmGzv","VIlwPMmKGJ","K4GS8atef2",
+"t98iWokgRi","jSjS3aFFss","HP433prNT6","VIlwPMkgy8","jzUqRRxrsm","UmaEvKr8ys","s4786qUJMd","6q6L9QYxC0","0PktIMK07Y","taOXKP6bcg",
+"D6rByJRJQB","UlU3MmX2GE","16lHcpFrrl","PYBf4jzUqR","wDajXhE1Ql","0h1b1O3iyQ","s93Ml6q6L9","W7cTsB3qem","jeskSJRJQB","vOqCEYOfrY",
+"ydG8UfaHir","CxVEfzbIYY","TCgPpHlUbF","Cfgr3BGaQY","C2IrcFFDui","WmadAuAWyp","zbIYYRsQUq","7fsYMuAWyp","CNHmvv8yFN","CNHmvWaWsv",
+"uTacxbrhlQ","tvdkDlpF6W","jfREub29RJ","mz8gxFLsph","JXljWAmdQd","Fhtgld7vjM","aez9yMkgy8","jiVBPRACuj","uPX7GIBe8k","XyPZNaFFss",
+"FLsphIKxdL","Yh1hFLDk6f","MmKGJOUYuF","QnJ1Shi5X7","lpF6WRmDcr","YjB9tvOqCE","JJs5me6e4z","9GXkXDQimp","uLtKsUmaEv","7fsYMOz8yZ",
+"KZamHjeskS","vOqCEMezSW","Gv3FqXyPZN","ZJTXH7X3uy","7X3uyNOHsz","OUYuFZUnqt","l83UdgjUTu","Mkgy8C2Irc","aFFssAkKTk","XflUqVprf2",
+"euZA5AgJHQ","TCgPpjSjS3","RxrsmlH1kt","29QAzhSSvQ","FVMxo8RCUA","JRJQBtuDyS","k85Ae7fKYU","FVMxo5Mg9r","okgRiW3VFH","3weIFbrhlQ",
+"aDGtS0PktI","Twanoy94nw","yluBx6AFT0","16lHcMmKGJ","jiVBPMezSW","FFDuiUvlv4","pv0i7gtCA5","yToGW2DREs","pFrrlTa8f6","o8Uydhe9IA",
+"SjskQFcWrW","ru4UGEOE1o","y94nwF6PT2","W7cTsUl4a1","WreyPFxX9q","DG4sTFLsph","iwzGkmX2GE","d85a9CK5W7","lkMUAFFDui","Z4I1v7X3uy",
+"IBe8kLbRTH","FVMxofaHir","cShY2Waim6","Vprf2FjHXR","jtn0XIRh48","MojnPCp3mZ","VLTy6ulk41","MK07Y0h1b1","7Ow5CqaofN","lpF6WJRJQB",
+"aFFssW7cTs","dhSuHoQ87r","5VZjSYh1hF","hi5X7ni2v1","5NammazIWp","Pb1pa9iGoT","VBjhz7Ow5C","Vprf2DQimp","9rlg9K4GS8","t98iW8cVD3",
+"6q6L9Mm8si","lCMxyjzUqR","xReecIn3NS","5iGN5TXQ0Z","fmIK1l83Ud","Q6LixRsQUq","CK5W7QbxXc","hE1QltvdkD","oQ87rcShY2","OxWIHB3qem",
+"bZLvSCp3mZ","fqypyG1RhS","bZLvSjeskS","SbRYyHzZT8","2NslmLbRTH","16lHch1zcH","ZhwG1v8yFN","LDk6fVerEA","dpe1voQ87r","IjTwPGWqqX",
+"jeskSLbRTH","WDVWJ0ao3l","GXdoH0MR5X","aDGtSGWqqX","nFqikix74r","M6qcG0MR5X","aDGtSOz8yZ","Ul4a1HP433","MaJQsStlDJ","lj07QcL0aE",
+"mX2GEuQIcz","QnJ1St59lR","e6e4zlpF6W","v2eC3ThjNn","pAhR10YAGH","07n1cO3iyQ","2TRI7YOfrY","zHF1qhSSvQ","OUqFM0BmCy","azIWpCp3mZ",
+"NcICAPOUYS","45cIHiB08l","X6PinvOqCE","1v5hHYw2oU","oQ87r0BmCy","5nmWvCqqaD","POUYSMkgy8","FVMxoFwEJz","e6e4zfmIK1","MojnPJKWYR",
+"qQxHPzbIYY","Twanok85Ae","mX2GE580YD","S2DfuWmadA","mX2GE7ku1p","iwzGkLbRTH","6q6L9JRJQB","cShY2Yf2Ec","iwzGkOUqFM","aez9yWmadA",
+"PYBf4DG4sT","GSQwjB3qem","fcJOyprNT6","FnPFBRzaZA","blLA9CK5W7","jiVBPEdBKc","FGzgp0YAGH","sqVrfAmdQd","Q6LixFwEJz","suY4xRpBQm",
+"nlaBy580YD","ZzJHWQ6hMC","M3zXLM6qcG","jSjS3bZLvS","OxWIHQClRL","zqH0WFxX9q","lXFOBMmKGJ","dhSuHlsQGo","BbwgAHfyNQ","ix74rUvlv4",
+"MmsIolm0pD","BCxeCSjskQ","taOXKJJs5m","S2DfuksJby","VIlwP5IhmG","sqVrf0Kyfs","kB5nPNo0Qb","tuDySix74r","2Yz7EGWqqX","9iGoT0PktI",
+"14FLRuLtKs","0ao3lb29RJ","0Wr5yGrDg7","2DREsGSQwj","zHF1q7fKYU","piJSkD6rBy","ulk41nnP8o","jSjS3mz8gx","FGzgpOUqFM","BbwgAcQOnv",
+"QssNCtaOXK","wDajXYh1hF","NcICAogLgc","m4bxUFhtgl","JkzUnVerEA","uPX7GokgRi","he9IAPb1pa","G1RhSb29RJ","he9IAzQt6Q","Ss0Zuv8yFN",
+"WreyPKASQ8","i3pydoGu6x","AOgEe5nmWv","jiVBPVLTy6","NhXduG1RhS","lH1kt5drc6","tjQxs0MR5X","EOE1o7Ow5C","yluBxCqqaD","WPmlx8FmFH",
+"W3VFH55rfB","bgJAz3weIF","ydG8UWaWsv","7fKYU8RCUA","ogLgcgdQsS","Ta8f6jfREu","gdQsSS2Dfu","6AFT09rlg9","QworuKr8ys","Chuy3ECMvU",
+"gf8rIZuDtD","8TxD7GrDg7","0KyfsuoStw","d7vjMNAFuw","atef2HzZT8","8xEKzXflUq","6q6L9YjB9t","iKqhrYw2oU","aez9ycQOnv","FVMxoyvOMI",
+"hUTw7AkKTk","RmDcraFFss","KZamHjS1aj","RkQke618Di","AmdQdTa8f6","jiVBPqaofN","6q6L91v5hH","qUJMdW7cTs","QYxC0G1RhS","RkQkeK20wK",
+"rhl0JGv3Fq","vLsmSpT8wu","UmaEvQnJ1S","S77LHdpe1v","OxWIHD6rBy","QYxC0BGaQY","POUYS9eoRc","jtn0XrKDLJ","24ARFYjB9t","CIShGuAWyp",
+"d7vjMRsQUq","aFFssulk41","XflUqtvdkD","48cHL48cHL","I7p2a5iGN5","7fsYMBpYhV","Nxx9VFPfSE","HzZT8Q6hMC","s7Mxk48cHL","LewvMMmsIo",
+"vLsmS580YD","5VZjShUTw7","Chuy3brhlQ","Oz8yZRpBQm","SWfouMmKGJ","VBjhzKr8ys","MGlTFyluBx","Waim6iqv4k","7ku1p8hJdt","he9IALbRTH",
+"Cfgr3nnP8o","U3yw5ZzJHW","Vprf2WMiS3","NOHszatef2","SmGzvEOE1o","lXFOBFjHXR","RACujoGu6x","cL0aEMK07Y","PYBf414FLR","l83Udl83Ud",
+"JXljW8FmFH","jiVBPyEfy9","FnPFBiB08l","WPmlxZzJHW","sqVrfiB08l","9rlg9FFDui","bZLvSKsjRK","FwEJzZJTXH","okgRiQ6Lix","Mkgy85drc6",
+"jiVBPHzZT8","HlUbFCdyBV","WPmlxiB08l","Yw2oU0PktI","gf8rI7ku1p","nnP8om4bxU","IBe8kVLTy6","QworuOUYuF","G1RhSX6Pin","RACujCxVEf",
+"mz8gxLewvM","k85AeNAFuw","yofH3OUqFM","RzaZAKsjRK","tl72Wpv0i7","WmadAmz8gx","hYBCK0BmCy","1j5L8Nxx9V","suY4xMmsIo","SmGzvsqVrf",
+"i3pydjfREu","Cp3mZfcwDa","I7p2aa00b5","hE1QlPb1pa","Yf2EcIn3NS","Y1mC0Q6hMC","tAOsr0Wr5y","zmLYDKsjRK","D6rBy3otm6","xXTI49iGoT",
+"nFqikY1mC0","7Ow5CuZPqg","lj07Qsoy9t","AXpwERmDcr","zz4ZU5ZaEz","G1RhSZv7z0","l83UdhUTw7","soy9tm4bxU","mz8gxcQOnv","Chuy3uLtKs",
+"Yf2EcQChxs","Vprf2sx5Gl","he9IAOHaBz","1v5hHSjskQ","J2mQiK4GS8","ni2v1zHF1q","ReKEWoGu6x","CK5W7L7cGc","Yw2oUzz4ZU","vkCHHpiJSk",
+"dmoS7cmXIX","EOE1oZv7z0","pT8wuKASQ8","2DREs1v5hH","SWfouL7cGc","oVQp6zmLYD","lViBvydG8U","HRxd8rKDLJ","AOgEeZJTXH","K20wKOUqFM",
+"zmLYDVLTy6","rz7UtW3VFH","FwEJzzQt6Q","QssNCU3yw5","i3pydatef2","dmoS7wiHrZ","1j5L8AIYUu","VIlwPnnP8o","JJs5mvkCHH","7fKYURpBQm",
+"pAhR1blLA9","zqH0WVIlwP","J2mQiStlDJ","XflUqkB5nP","uJScXMmKGJ","pFrrllH1kt","qaofNYf2Ec","ReKEWvkCHH","5nmWvTa8f6","D6rByiqv4k",
+"QworuK20wK","Gv3Fqh1zcH","8RCUAjfREu","lH1kt0Wr5y","Ss0ZujiVBP","guMb8zqH0W","uLtKs7hyVv","Gv3FqVNCPd","CqqaDpFrrl","MezSWQbxXc",
+"taOXKFLsph","pAhR1In3NS","HlUbF8xEKz","4dEz6xXTI4","FnPFBY1mC0","aFFssiwzGk","prNT65Mg9r","pWiOsiKqhr","LbRTHECMvU","iKqhrWreyP",
+"fLNg8n1pmO","QbxXc0Wr5y","a00b5FGzgp","SWfouBFkb8","XyPZNM3zXL","Yw2oUblLA9","VjCZqPYBf4","vOqCEn8pJ9","NcICAZ4I1v","29QAzRsQUq",
+"2TRI7xciqp","pvgjShUTw7","D6rByBbwgA","0Kyfso8Uyd","EoToPhYBCK","a00b5ZuDtD","oGu6xjzUqR","xXTI4No0Qb","pT8wui3pyd","ZhwG1rz7Ut",
+"FPfSEBbwgA","1LB1LJJs5m","atef2POUYS","yvOMIMmKGJ","YjB9tFwEJz","RxrsmokgRi","oGu6xAOgEe","5Nammlm0pD","8FmFHv2eC3","FGzgpmz8gx",
+"o8UydpAhR1","jS1ajVjCZq","X6PinyofH3","I7p2aAOgEe","ReKEWgIYvE","JkzUnuupzk","hYBCKVprf2","jfREulj07Q","ksJbyhYBCK","pAhR1FjHXR",
+"QnJ1S55rfB","vkCHHfqypy","PYBf4n1pmO","jzUqRs4786","lm0pDpFrrl","7fsYM8FmFH","v8yFNVIlwP","hUTw7FFDui","UmaEvulk41","6AFT0zQt6Q",
+"jeskSYw2oU","fcJOyIRh48","ni2v1M3zXL","h1zcH0PktI","JIqXimz8gx","VIlwPSbRYy","GXdoH1j5L8","AOgEewDajX","VBjhzbgJAz","uZPqgfcJOy",
+"Uvlv4hYBCK","48cHLQClRL","IBe8kMK07Y","Cfgr3NcICA","WMiS3zQt6Q","ZUnqtChuy3","lweGyfqypy","29QAzdjsrv","JkzUnbrhlQ","cShY2sx5Gl",
+"s7MxkfaHir","Oz8yZzqH0W","uLtKsMezSW","ZUnqt55rfB","MmKGJhYBCK","2hEEUY1mC0","ulk41X6Pin","0Wr5ySs0Zu","tl72WWaWsv","NOHszFhtgl",
+"jzUqRO3iyQ","jeskSBGaQY","Zv7z0618Di","iB08l8RCUA","vkCHHYOfrY","O3iyQCp3mZ","i7WMQBCxeC","uvf7A7lUXZ","okgRiQnJ1S","aez9yyvOMI",
+"Ss0ZuSbRYy","FnPFBjSjS3","SjskQFLsph","4dEz6BGaQY","DLhzM16lHc","Uvlv4iB08l","IRh48CqqaD","5Drn0cmXIX","ulk410Kyfs","hi5X7MezSW",
+"piJSkSbRYy","0MR5Xlj07Q","ZuDtDWaim6","AkKTklXFOB","Yh1hFBGaQY","Waim61j5L8","hUTw7ciuWz","IKxdLe6e4z","S77LHe6e4z","lCMxyv1Hln",
+"ZuDtDix74r","J2mQiSWfou","M6qcGQ6Lix","FnPFBWreyP","OUYuF2Yz7E","CdyBVzqH0W","S77LHzQt6Q","NOHszuZPqg","zmLYDZzJHW","tl72WF6PT2",
+"vkCHHMGlTF","StlDJ4QMc9","tjQxsZv7z0","KASQ8prNT6","lj07Qiqv4k","SWfouCxVEf","tlILtuoStw","i7WMQuQIcz","KASQ8dhSuH","TXQ0ZGv3Fq",
+"blLA9ni2v1","he9IAHlUbF","D6rByzQt6Q","9eoRciKqhr","BCxeC2ZHdk","Mm8sisoy9t","6AFT0xciqp","FxX9qCqqaD","CIShGD6rBy","t98iWCIShG",
+"Dz1R3gjUTu","OxWIHFjHXR","UmaEvVBjhz","6q6L9O3iyQ","SbRYyWaWsv","nnP8oSjskQ","djsrvd7vjM","POUYSh1zcH","WPmlxpT8wu","ogLgco8Uyd",
+"NcICAWMiS3","SWfou29QAz","QnJ1SCxVEf","piJSk7lUXZ","G1RhSd85a9","guMb8FFDui","EoToPzqH0W","No0Qbs4786","fcJOym4bxU","Yf2Ect98iW",
+"WaWsvFxX9q","8FmFH5Namm","4QMc9L7cGc","8hJdtsqVrf","Kr8ysvLsmS","AOgEeO3iyQ","lsQGoWmadA","ix74rLbRTH","Waim6FcWrW","U3yw5pmeCd",
+"BFkb8IjTwP","hYBCKjzUqR","lsQGoDLhzM","EOE1oGWqqX","prNT6LDk6f","0BmCytAOsr","5IhmGFcWrW","o8UydZ4I1v","O3iyQ8TxD7","8cVD3OxWIH",
+"nFqikTCgPp","l83UdU3yw5","Dz1R3lXFOB","RBhp0CdyBV","qQxHPCp3mZ","4QMc9ulk41","4W0TlC2Irc","ix74r5Drn0","ni2v18U2nU","XflUqi3pyd",
+"nlaByFxX9q","he9IAtl72W","9iGoT8TxD7","O3iyQM6qcG","5drc68hJdt","FLsphlsQGo","QnJ1SZhwG1","Y1mC0euZA5","vLsmS0MR5X","DQimpReKEW",
+"s4786HP433","MmsIoa00b5","cShY25IhmG","ydG8UHlUbF","QClRLbgJAz","dmoS7Cp3mZ","BFkb8kZANm","sx5GlxReec","tvdkDtuDyS","prNT6lsQGo",
+"VLTy6SjskQ","9iGoT6AFT0","ZuDtDxciqp","uLtKs618Di","t59lRzQt6Q","DQimpM3zXL","vLsmSVLTy6","rhl0JJkzUn","uZPqgO3iyQ","yvOMIzHF1q",
+"16lHcpv0i7","UmaEvtlILt","8hJdt24ARF","Mkgy82hEEU","mX2GEXflUq","3otm6LDk6f","8RCUAvLsmS","P6bcguTacx","bZLvSzmLYD","JKWYRyluBx",
+"JkzUnK20wK","HP433jfREu","618DinnP8o","jfREus4786","guMb8aL6AJ","GSQwjIBe8k","EOE1opT8wu","cShY2QssNC","TXQ0ZVNCPd","RBhp0dpe1v",
+"zQt6QtaOXK","gdQsSL7cGc","Yf2Ecuupzk","Oz8yZgdQsS","HlUbFSbRYy","dhSuH8hJdt","RACujs7Mxk","piJSkWMiS3","7hyVvulk41","2hEEUfcJOy",
+"Ul4a1FnPFB","P6bcgbgJAz","zz4ZU5Drn0","5nmWv1v5hH","1v5hH3otm6","K20wKNcICA","fFDrJfqypy","NhXdu8FmFH","jzUqRS77LH","FcWrWKZamH",
+"YjB9tzY1GY","IRh48BGaQY","uQIcz8TxD7","FVMxoi3pyd","OUqFMlCMxy","fqypyJkzUn","GrDg724ARF","QYxC0lkMUA","NOHszFLsph","4QMc9ru4UG",
+"FjHXR5Drn0","5iGN5DQimp","x3LDeReKEW","FVMxoni2v1","2NslmL7cGc","5Mg9rZuDtD","zY1GYChuy3","wDajXuvf7A","pmeCd580YD","Ul4a1HRxd8",
+"Ss0Zu9XyT9","1LB1LYw2oU","rhl0JaL6AJ","oQ87rmX2GE","VBjhzzz4ZU","UmaEvWmadA","ZuDtDQWxoT","Nxx9VP6bcg","fFDrJRsQUq","QChxs0Wr5y",
+"zmLYDQChxs","Dz1R3AIYUu","cQOnvqaofN","tuDyS9rlg9","Uvlv4Mkgy8","ru4UGZv7z0","NOHszX6Pin","Y1mC0y94nw","ydG8UStlDJ","YOfrYFwEJz",
+"DcpWBfaHir","9eoRc9eoRc","1LB1LokgRi","uoStwzHF1q","PYBf49iGoT","DcpWBcQOnv","brhlQjiVBP","lj07QbgJAz","iKqhrReKEW","uPX7G7lUXZ",
+"QWxoTuLtKs","blLA9zqH0W","jS1ajCK5W7","lj07Q6AFT0","VerEANxx9V","29QAzDG4sT","lpF6Wx3LDe","uPX7GMmsIo","64s8NuLtKs","Uvlv4uJScX",
+"RACujulk41","C2IrcjeskS","e6e4z580YD","GWqqXU3yw5","CxVEfOz8yZ","U3yw5JXljW","In3NShSSvQ","s7MxkwiHrZ","XyPZNMkgy8","IBe8kjeskS",
+"wiHrZsuY4x","oVQp6LDk6f","v8yFNRmDcr","VBjhzUvlv4","MGlTF9iGoT","y94nw9GXkX","OUqFM16lHc","hSSvQhE1Ql","Ss0ZupvgjS","gjUTutl72W",
+"LDk6fMGlTF","MK07YSWfou","jfREuZUnqt","7lUXZ5Drn0","Cp3mZEOE1o","HlUbFRACuj","MaJQshE1Ql","yvOMIhUTw7","4dEz6yEfy9","he9IAyToGW",
+"LewvMLewvM","GrDg7uAWyp","ThjNnStlDJ","TwanonFqik","ZuDtDK4GS8","rhl0JwDajX","ogLgcyToGW","2DREsVIlwP","RsQUq0PktI","RsQUqksJby",
+"BGaQYCfgr3","55rfBfaHir","h1zcHxReec","MmKGJpFrrl","HfyNQXflUq","aez9yLewvM","RACujuN6r3","FhtglfFDrJ","i7WMQZUnqt","2hEEUatef2",
+"ogLgcs4786","FxX9qydG8U","rKDLJsuY4x","fFDrJ14FLR","IBe8klweGy","lj07Qd7vjM","MmKGJZhwG1","pv0i7uoStw","2ZHdkFPfSE","yEfy9JIqXi",
+"GXdoHPOUYS","sx5Gldpe1v","7Ow5Culk41","lCMxy2Yz7E","a00b5JkzUn","MK07YcL0aE","F6PT2iqv4k","uoStwlpF6W","9iGoTFjHXR","WPmlxYw2oU",
+"5Drn05Namm","ogLgc0Wr5y","zQt6QSWfou","BpYhVLewvM","B3qemiqv4k","lH1ktfcJOy","CIShGgjUTu","Oz8yZ8RCUA","Ta8f6F6PT2","pT8wuDcpWB",
+"yToGWyToGW","suY4x8U2nU","CNHmvuZPqg","vLsmSwiHrZ","POUYSzFgtB","4W0Tl1v5hH","n8pJ9Cfgr3","SbRYyjSjS3","Q6LixbZLvS","I7p2alsQGo",
+"EoToPlj07Q","lj07QGv3Fq","zbIYYCK5W7","G1RhStuDyS","dQ586TXQ0Z","jiVBPdjsrv","RkQkeyToGW","euZA53weIF","lsQGooVQp6","FGzgpatef2",
+"S77LHHzZT8","SjskQRxrsm","FxX9qatef2","suY4xFLsph","gf8rIYjB9t","cQOnvtlILt","U3yw5xXTI4","7Ow5CvkCHH","FLsphzz4ZU","2Nslm6AFT0",
+"prNT655rfB","QWxoToVQp6","RmDcrdhSuH","zqH0WTa8f6","EOE1o0ao3l","TCgPpCqqaD","uZPqgIRh48","jtn0XFPfSE","NAFuwjzUqR","okgRiRsQUq",
+"DcpWBEOE1o","QnJ1SogLgc","iwzGkMm8si","blLA9zQt6Q","5Drn0lpF6W","1j5L8suY4x","pmeCdgtCA5","ni2v1KASQ8","UmaEv8FmFH","SjskQRkQke",
+"ix74rpFrrl","i3pydZv7z0","RkQke0Kyfs","rhl0JNxx9V","iwzGkWPmlx","1j5L8h1zcH","ZJTXHNo0Qb","oGu6x8TxD7","Ta8f6piJSk","iqv4k8FmFH",
+"fcwDalXFOB","K4GS8vOqCE","vOqCERBhp0","lj07QRxrsm","gIYvEZv7z0","m4bxU0Wr5y","FPfSEBCxeC","QClRLK4GS8","blLA9UmaEv","iB08ljSjS3",
+"bgJAzTwano","k85Aev1Hln","s93Ml1j5L8","yluBxyofH3","CNHmvkB5nP","yofH3v2eC3","gjUTut98iW","rhl0J9iGoT","atef28FmFH","JJs5mksJby",
+"AgJHQ2hEEU","14FLRa00b5","MmKGJW7cTs","JXljWhSSvQ","oQ87rIBe8k","tlILthi5X7","zFgtBokgRi","Mm8silsQGo","oGu6xFjHXR","jeskSZJTXH",
+"BFkb8In3NS","i3pyd5iGN5","ZJTXHWMiS3","gjUTumz8gx","JXljW7fsYM","CdyBViKqhr","0h1b1Kr8ys","NcICAAgJHQ","dpe1vRsQUq","fqypyAgJHQ",
+"gtCA5ni2v1","BFkb8lpF6W","MaJQsWreyP","lXFOBiwzGk","P6bcgVLTy6","Dz1R30YAGH","v1HlntuDyS","VjCZqiqv4k","VerEAjeskS","iKqhrnnP8o",
+"zFgtBiB08l","cmXIXJJs5m","lsQGoG1RhS","OUYuFvLsmS","djsrvfFDrJ","kZANmWaWsv","uupzkmX2GE","QYxC0gjUTu","lXFOBgjUTu","7fKYU7lUXZ",
+"xXTI4yofH3","QworuEdBKc","WDVWJogLgc","0Wr5ysoy9t","RsQUquvf7A","3otm6Nxx9V","qQxHPhe9IA","gdQsSjeskS","ReKEWuvf7A","s7Mxkjtn0X",
+"TCgPpJKWYR","pv0i7gIYvE","7fKYU5iGN5","O3iyQd7vjM","K4GS8nlaBy","wDajXFVMxo","9GXkXECMvU","gIYvEyofH3","F6PT2FjHXR","t98iWaL6AJ",
+"1LB1LnlaBy","2DREsZhwG1","dmoS7FGzgp","SmGzv5nmWv","gtCA5JRJQB","zqH0WguMb8","0KyfsMmKGJ","okgRiM6qcG","iB08lIRh48","lCMxyQYxC0",
+"MmsIo0PktI","azIWpcmXIX","tjQxspAhR1","uupzknlaBy","JRJQBI7p2a","7X3uyIjTwP","gf8rI5IhmG","lH1kthYBCK","iqv4k1v5hH","8hJdtIKxdL",
+"QClRLsuY4x","AkKTkHP433","7Ow5CJRJQB","JIqXi4QMc9","VLTy65Mg9r","QssNCRxrsm","BCxeCrhl0J","BCxeCzqH0W","azIWpksJby","8U2nUCNHmv",
+"7X3uy0Kyfs","GWqqXaDGtS","cShY28hJdt","D6rByWaWsv","piJSkuTacx","v8yFNRsQUq","ulk41pvgjS","dpe1vd85a9","KASQ8hi5X7","d85a98RCUA",
+"d85a92TRI7","jzUqRyluBx","9eoRcm4bxU","jSjS39eoRc","29QAzLewvM","JkzUnWDVWJ","lj07QcShY2","yvOMIFjHXR","WaWsv48cHL","euZA5lj07Q",
+"WreyPhSSvQ","0MR5XX6Pin","Zv7z0EdBKc","l83UdYjB9t","xReecpvgjS","I7p2a5ZaEz","iwzGktjQxs","dmoS7guMb8","0ao3lpFrrl","Pb1pa2TRI7",
+"Yf2EciB08l","LbRTHNAFuw","3otm6uLtKs","t98iWCNHmv","gf8rI9rlg9","MaJQsOUqFM","MaJQsblLA9","1LB1LaDGtS","BGaQYW7cTs","ThjNnWDVWJ",
+"580YDnFqik","cShY2CIShG","XflUq7hyVv","aez9y7Ow5C","fcJOyX6Pin","55rfB6AFT0","dpe1vgjUTu","2DREstuDyS","k85AeFnPFB","I7p2ak85Ae",
+"jzUqR0YAGH","QClRLWreyP","HfyNQhE1Ql","tlILtlweGy","ru4UGUmaEv","uZPqgpAhR1","uPX7GtvdkD","dQ586kZANm","POUYStl72W","mX2GEprNT6",
+"lH1ktpiJSk","lsQGoSjskQ","ReKEWB3qem","gtCA5uTacx","jfREuSjskQ","zqH0We6e4z","prNT6gIYvE","Mm8sihi5X7","VBjhzn1pmO","d85a9pv0i7",
+"tuDySLbRTH","yvOMIQYxC0","8FmFHpmeCd","HP433YjB9t","7fKYUhi5X7","IBe8k5IhmG","soy9tDz1R3","QWxoTlweGy","24ARFtaOXK","0BmCyOxWIH",
+"MmKGJDQimp","Chuy3ksJby","lj07QFGzgp","Pb1paCfgr3","XflUqJIqXi","2NslmIjTwP","RmDcrhUTw7","OHaBz8RCUA","5nmWvG1RhS","tl72Wlj07Q",
+"F6PT20ao3l","B3qemQClRL","cL0aE29QAz","7X3uytAOsr","8RCUAciuWz","RpBQmFcWrW","P6bcgru4UG","uTacxK4GS8","wiHrZhYBCK","brhlQSmGzv",
+"pWiOs64s8N","JJs5mvLsmS","MmKGJciuWz","HzZT8Twano","0PktIn8pJ9","v1Hln1LB1L","OUYuF8xEKz","3otm6lCMxy","5nmWvAOgEe","h1zcHfcJOy",
+"7X3uyv1Hln","0YAGHiB08l","RzaZAMm8si","M3zXLGXdoH","BbwgAReKEW","DG4sTuN6r3","24ARF8xEKz","9eoRcFVMxo","ix74rNOHsz","CdyBV7lUXZ",
+"hSSvQru4UG","Q6Lix5iGN5","xReecnlaBy","BpYhV29QAz","JRJQBcmXIX","4QMc9rz7Ut","xciqpL7cGc","RACujcShY2","U3yw5O3iyQ","2Nslmd7vjM",
+"yluBxMmKGJ","F6PT2GWqqX","zHF1qAmdQd","suY4xv1Hln","soy9tCK5W7","Yh1hF24ARF","RzaZAXyPZN","a00b5JIqXi","ZUnqthE1Ql","d85a9rhl0J",
+"5drc6QClRL","S2DfuMkgy8","jzUqR5IhmG","MojnPzHF1q","iB08lUlU3M","b29RJNAFuw","pv0i7yluBx","K20wKjSjS3","UmaEvVIlwP","UlU3M618Di",
+"L7cGcOUqFM","y94nwFFDui","uoStwL7cGc","h1zcHlweGy","QYxC0ZzJHW","d85a9FcWrW","euZA5IBe8k","VIlwPuQIcz","jfREuMK07Y","0KyfsIBe8k",
+"hSSvQCdyBV","TXQ0ZpT8wu","dmoS7Mkgy8","AOgEe9iGoT","8FmFH8cVD3","WmadAh1zcH","prNT6J2mQi","zmLYDogLgc","brhlQMaJQs","Vprf2JJs5m",
+"b29RJYOfrY","oQ87ruTacx","RkQkecShY2","tlILt5Namm","iqv4k8cVD3","BGaQYlm0pD","7fKYUzbIYY","lsQGo2TRI7","FwEJz2Yz7E","TCgPphUTw7",
+"Ul4a1WmadA","MmsIoe6e4z","xciqpjSjS3","In3NSSWfou","Vprf2VNCPd","gtCA5fFDrJ","ni2v19iGoT","5nmWvRzaZA","14FLRVjCZq","RxrsmNxx9V",
+"uLtKsv2eC3","XflUq14FLR","v1HlnI7p2a","CK5W7Q6hMC","Yh1hFXyPZN","gtCA5Pb1pa","HzZT8uvf7A","WMiS3Fhtgl","EOE1o0Kyfs","0MR5XYf2Ec",
+"K20wKFjHXR","0ao3luPX7G","5drc6Nxx9V","RmDcrAmdQd","zQt6QjzUqR","PYBf47ku1p","kB5nPm4bxU","gIYvEWaWsv","UmaEvy94nw","azIWpQ6Lix",
+"Yh1hFa00b5","BCxeCHfyNQ","m4bxUKr8ys","uQIczWmadA","oQ87rEOE1o","3weIFqQxHP","3otm6uTacx","16lHcGrDg7","gjUTuFhtgl","gtCA5hSSvQ",
+"Nxx9Vv1Hln","2hEEUPOUYS","Yh1hF6AFT0","mz8gxrz7Ut","RpBQmTCgPp","pmeCdd7vjM","tl72WRACuj","SWfouDG4sT","ulk41pv0i7","bZLvSdmoS7",
+"L7cGcpAhR1","KsjRKyluBx","48cHLqaofN","YOfrYv2eC3","tlILtlm0pD","uTacxNhXdu","RACuj5IhmG","zY1GYMGlTF","bZLvSKASQ8","AkKTkZuDtD",
+"he9IA5nmWv","NhXduTXQ0Z","W3VFHhE1Ql","SbRYyokgRi","XflUqPb1pa","WMiS3ni2v1","SbRYyCp3mZ","8U2nU6AFT0","EOE1oVerEA","JkzUnDQimp",
+"nnP8oVprf2","kZANmVIlwP","0YAGHIn3NS","2hEEUEdBKc","LewvMwDajX","lpF6W7fsYM","VNCPd9y4lw","45cIHi7WMQ","uoStwfaHir","UmaEvwDajX",
+"cmXIXM6qcG","uZPqgOz8yZ","8TxD7fqypy","prNT6FnPFB","lH1ktFcWrW","qUJMdhUTw7","gdQsSdpe1v","t59lRFnPFB","0MR5X2Nslm","Nxx9V5Namm",
+"tl72WrKDLJ","kB5nPyofH3","AgJHQdmoS7","JKWYRUmaEv","FwEJzuoStw","lXFOBKsjRK","dmoS7yToGW","uLtKs29QAz","2NslmZzJHW","MK07YHP433",
+"QChxs0BmCy","D6rByuAWyp","NAFuw7fKYU","uJScX29QAz","QYxC0cQOnv","MK07Yaez9y","7fKYUBbwgA","iKqhraL6AJ","ksJbygf8rI","Ta8f6zz4ZU",
+"pv0i7FnPFB","VNCPdThjNn","YOfrYhUTw7","RzaZAb29RJ","ECMvURzaZA","DG4sT5Namm","FVMxoaez9y","RxrsmRkQke","o8Uydix74r","9iGoTlXFOB",
+"IjTwPSs0Zu","blLA9Zv7z0","Mm8sixciqp","07n1cCfgr3","WreyPgtCA5","tAOsrRsQUq","lpF6WQnJ1S","Yf2Ec0Wr5y","nlaByRpBQm","DLhzMSmGzv",
+"uoStwfcwDa","ThjNnHRxd8","aez9yIBe8k","t59lRsuY4x","RpBQmh1zcH","4QMc9YjB9t","O3iyQBbwgA","XflUq29QAz","lCMxyazIWp","BpYhVlXFOB",
+"5IhmGtuDyS","bgJAzlkMUA","FFDuih1zcH","dQ586JKWYR","No0QbVLTy6","5Drn0IjTwP","n1pmO45cIH","fFDrJ8FmFH","zFgtBWreyP","s7MxkRzaZA",
+"K4GS8zqH0W","0PktI48cHL","4W0TlgjUTu","HP433ix74r","vLsmSI7p2a","9rlg90BmCy","nFqik4QMc9","AXpwE0Kyfs","7ku1pCqqaD","2ZHdkS2Dfu",
+"IRh48pWiOs","TXQ0ZK20wK","KsjRKFcWrW","zY1GYiqv4k","VerEAAOgEe","b29RJa00b5","Chuy3CIShG","gtCA529QAz","Nxx9VyluBx","m4bxUs4786",
+"CNHmvlm0pD","ydG8UQ6Lix","SjskQdjsrv","e6e4ztl72W","NcICAMmsIo","rKDLJx3LDe","aL6AJsqVrf","JJs5mRACuj","Dz1R3QssNC","fcJOyyofH3",
+"618Digf8rI","zHF1qZv7z0","0YAGHI7p2a","KASQ8M6qcG","FnPFBHlUbF","618DiHfyNQ","5ZaEzni2v1","pv0i7x3LDe","CNHmvPb1pa","FcWrWaDGtS",
+"VIlwPVIlwP","Gv3Fq8FmFH","lkMUA14FLR","bgJAz4dEz6","14FLR8TxD7","HRxd8uQIcz","FFDui0BmCy","tvdkDQ6Lix","6AFT0dQ586","aDGtSiwzGk",
+"uTacx1v5hH","Qworupv0i7","yluBxS77LH","fqypylweGy","6AFT0Cfgr3","2DREsCp3mZ","WMiS39XyT9","uupzkEdBKc","lweGyFnPFB","1j5L8Yw2oU",
+"y94nwbrhlQ","wiHrZVerEA","Gv3FqNhXdu","mz8gxiwzGk","BpYhVxXTI4","cQOnvWmadA","LewvMJKWYR","zbIYYwiHrZ","MojnPUmaEv","Dz1R364s8N",
+"lkMUAqaofN","Qworu5Namm","0Wr5yv1Hln","LewvMcQOnv","aDGtSCp3mZ","uTacxHzZT8","WreyPcQOnv","o8UydbrhlQ","yEfy9Pb1pa","Vprf2gjUTu",
+"CIShGCNHmv","dpe1v5VZjS","jSjS3Fhtgl","i3pydIRh48","hi5X75iGN5","DLhzMguMb8","qUJMdWPmlx","UlU3Mx3LDe","FnPFBzbIYY","FNYIMIBe8k",
+"0YAGH9eoRc","faHirpmeCd","TXQ0ZtvdkD","ru4UGcL0aE","nlaBydjsrv","ZJTXH7ku1p","DLhzMJ2mQi","SjskQVLTy6","lkMUAlpF6W","vLsmSZuDtD",
+"TCgPpWDVWJ","sqVrf6AFT0","1LB1LF6PT2","K4GS8oVQp6","uAWypuPX7G","7X3uyiKqhr","2TRI7gf8rI","8TxD724ARF","CdyBVkZANm","RACujlH1kt",
+"kZANmyluBx","NhXdui7WMQ","prNT6MezSW","Qworui3pyd","OxWIHFPfSE","24ARFCIShG","ZUnqtNOHsz","s7Mxkh1zcH","HzZT82DREs","45cIHAmdQd",
+"uJScXK20wK","5Mg9rdQ586","C2IrcNo0Qb","Vprf2aDGtS","VLTy6qUJMd","l83UdTwano","b29RJuvf7A","o8UydlweGy","mz8gxlpF6W","1v5hHm4bxU",
+"iqv4k2Nslm","yToGWAgJHQ","7fKYUAIYUu","K4GS80Wr5y","GXdoHzY1GY","dQ586Gv3Fq","prNT6hYBCK","29QAzO3iyQ","5Drn0FNYIM","QChxsEOE1o",
+"DLhzMUmaEv","s7MxkOHaBz","KZamHru4UG","4dEz6lXFOB","gtCA5HRxd8","fcwDaqaofN","uoStwwDajX","lj07QuN6r3","CNHmvAkKTk","yEfy9o8Uyd",
+"xXTI4FNYIM","CIShGkZANm","uLtKsuTacx","VerEAI7p2a","RkQke8TxD7","14FLR55rfB","cShY2DLhzM","HRxd8YOfrY","ECMvUfmIK1","uupzkRpBQm",
+"zY1GYOz8yZ","ulk41xReec","RmDcrNxx9V","jeskSni2v1","sx5GlhE1Ql","BbwgAd7vjM","1j5L87hyVv","atef2BpYhV","7lUXZTXQ0Z","VerEAt59lR",
+"zY1GY55rfB","RACuj9eoRc","uAWypydG8U","Q6LixHP433","Yf2EcIRh48","kB5nP0ao3l","FLsphS77LH","faHirXflUq","D6rByM3zXL","blLA9OxWIH",
+"dpe1vhSSvQ","MaJQsDQimp","IRh48zbIYY","RkQke9y4lw","4QMc95IhmG","SWfoudmoS7","DcpWBzHF1q","WaWsvqQxHP","KASQ88RCUA","VNCPdD6rBy",
+"fFDrJ48cHL","FjHXRsx5Gl","yToGWZ4I1v","wDajX24ARF","S2DfuJRJQB","ksJbyVjCZq","ru4UGhe9IA","FxX9qi3pyd","2NslmuTacx","5NammuTacx",
+"t98iWfmIK1","TwanoWreyP","7hyVvzmLYD","07n1clViBv","zqH0WuLtKs","ni2v1Waim6","AIYUuBCxeC","K20wKksJby","0ao3ln8pJ9","lkMUAprNT6",
+"Z4I1vi3pyd","Ta8f6Pb1pa","64s8NKASQ8","UmaEvRzaZA","Kr8ysuN6r3","fmIK1pFrrl","oGu6xM3zXL","lpF6WUmaEv","RACujlkMUA","jzUqRSjskQ",
+"POUYSHfyNQ","9iGoTxXTI4","rhl0J8U2nU","5Drn01LB1L","FLsphUvlv4","OHaBzh1zcH","jeskSS2Dfu","uQIcz3weIF","45cIHU3yw5","5Mg9rI7p2a",
+"5nmWvtvdkD","CK5W7d7vjM","8xEKzNOHsz","MmKGJBpYhV","SbRYybrhlQ","Ul4a1ydG8U","DLhzMiqv4k","5IhmGRBhp0","lViBvv1Hln","zmLYDs4786",
+"IBe8kfLNg8","5ZaEzM6qcG","zz4ZUC2Irc","7fKYUtjQxs","RACujKr8ys","7fsYMAIYUu","cL0aErKDLJ","hi5X7ReKEW","oQ87r2Yz7E","jS1aj0h1b1",
+"7fKYUuupzk","64s8N4dEz6","1LB1Ls93Ml","UmaEvru4UG","29QAzgIYvE","RkQkefcwDa","ZuDtDM6qcG","aez9ytjQxs","VerEAuN6r3","IBe8kdQ586",
+"Ul4a1XyPZN","OUYuFlXFOB","DQimpaFFss","tjQxs3weIF","XyPZNlH1kt","M6qcGoQ87r","FwEJzvkCHH","zz4ZURsQUq","Zv7z0Qworu","m4bxU8RCUA",
+"bgJAzAmdQd","MezSW55rfB","ciuWzru4UG","AOgEeECMvU","t59lR2TRI7","CdyBVI7p2a","DG4sTuoStw","hYBCKiB08l","CK5W7Fhtgl","ni2v15ZaEz",
+"ZzJHWFVMxo","Oz8yZblLA9","7Ow5Cv2eC3","RzaZAGv3Fq","lj07QYh1hF","OUYuFfmIK1","Kr8ys618Di","5Drn06AFT0","wiHrZs93Ml","7lUXZpiJSk",
+"OxWIH16lHc","rz7UtWreyP","ru4UGhSSvQ","lsQGoP6bcg","lViBv9rlg9","zqH0WM3zXL","zY1GYcShY2","RmDcrIKxdL","SbRYy8FmFH","XflUqDQimp",
+"1LB1LtlILt","UmaEvIjTwP","BpYhV0Wr5y","lpF6WyEfy9","GXdoHJKWYR","ZUnqtv8yFN","zFgtBXflUq","HRxd8cShY2","d85a9jSjS3","FFDui16lHc",
+"lweGy48cHL","EoToPdjsrv","tlILtJXljW","WmadAOHaBz","6AFT0Zv7z0","QClRLzmLYD","s93MlRxrsm","vOqCEuN6r3","P6bcgn1pmO","yvOMIIRh48",
+"pAhR1StlDJ","Q6Lix7X3uy","gdQsSHzZT8","2hEEUC2Irc","MaJQsguMb8","64s8NyEfy9","sqVrfrKDLJ","8RCUAlm0pD","tjQxss7Mxk","Mm8si0ao3l",
+"O3iyQ16lHc","d7vjMyofH3","5Drn08xEKz","djsrvru4UG","zz4ZUVLTy6","J2mQigIYvE","fLNg8WMiS3","pvgjSdQ586","M3zXLW7cTs","djsrva00b5",
+"fcwDa55rfB","Zv7z0S2Dfu","SbRYyL7cGc","QnJ1Suvf7A","s4786BCxeC","Chuy3euZA5","ni2v1FGzgp","AOgEe1LB1L","lj07Qsx5Gl","iKqhriqv4k",
+"pT8wunlaBy","XyPZNZv7z0","POUYSCp3mZ","ogLgcVBjhz","MezSW0YAGH","t98iWt98iW","i3pydlH1kt","AmdQd0MR5X","2TRI70BmCy","nFqik64s8N",
+"FcWrW9XyT9","D6rByNcICA","0BmCy9y4lw","y94nwBGaQY","s478664s8N","tuDySjzUqR","jiVBPYh1hF","xciqp9XyT9","lH1ktzmLYD","0Kyfs2TRI7",
+"8TxD7580YD","cmXIXFNYIM","JJs5m7lUXZ","9GXkX4QMc9","Kr8ysxciqp","uTacxqQxHP","pWiOsuPX7G","zHF1q2TRI7","dhSuHy94nw","BFkb8BFkb8",
+"soy9t8U2nU","m4bxUyluBx","Kr8ysTwano","SWfoutAOsr","ogLgcrhl0J","brhlQPb1pa","F6PT2y94nw","ZUnqtGXdoH","QbxXclkMUA","fcJOy5drc6",
+"6AFT0okgRi","AOgEepv0i7","tl72WCdyBV","NOHszhE1Ql","xXTI4JXljW","WDVWJOz8yZ","sx5GllH1kt","NOHszn1pmO","fqypyBbwgA","Nxx9V3otm6",
+"x3LDecmXIX","VIlwPAIYUu","VjCZq4W0Tl","m4bxURACuj","YjB9ttlILt","ni2v1TXQ0Z","lH1kt3otm6","RBhp0DcpWB","piJSkdhSuH","l83UdlkMUA",
+"wDajXlH1kt","nnP8oW7cTs","vLsmSqUJMd","QworuUl4a1","bZLvSfaHir","FcWrWMojnP","QClRLv2eC3","m4bxU2Nslm","uJScXDQimp","cmXIXh1zcH",
+"lweGymX2GE","aez9ybgJAz","uN6r3DcpWB","hi5X72DREs","0Wr5yo8Uyd","2ZHdkK20wK","xciqpjeskS","pv0i7tl72W","hi5X7HRxd8","prNT6yToGW",
+"guMb8Cfgr3","XyPZNy94nw","o8Uyd5ZaEz","uLtKs2DREs","uTacxsx5Gl","S2Dfu0MR5X","d7vjM48cHL","5IhmG29QAz","2NslmAgJHQ","RBhp08RCUA",
+"Nxx9VDz1R3","gf8rIcQOnv","kZANmZuDtD","VerEA8cVD3","sqVrfuJScX","gdQsSGrDg7","FjHXRYf2Ec","qaofN5VZjS","0BmCyZhwG1","azIWpbZLvS",
+"2Yz7ERkQke","Q6Lix0YAGH","oVQp6NcICA","mX2GEVjCZq","brhlQqQxHP","s93MlpiJSk","XflUqh1zcH","5NammTCgPp","HRxd8Zv7z0","2NslmHP433",
+"HzZT8guMb8","7lUXZC2Irc","Ul4a1pFrrl","VNCPdIn3NS","ydG8UVBjhz","cShY2dhSuH","RBhp0CIShG","B3qemQworu","W7cTsD6rBy","WDVWJI7p2a",
+"he9IAVNCPd","nlaBykB5nP","qUJMdjzUqR","pT8wuJ2mQi","ulk41zmLYD","dmoS7QbxXc","M6qcG29QAz","HzZT8i3pyd","LewvMK4GS8","AgJHQogLgc",
+"Yh1hFzbIYY","8FmFHxXTI4","5VZjScShY2","RsQUqgjUTu","blLA98RCUA","0Wr5yazIWp","vkCHHW3VFH","0h1b1VerEA","Vprf2qaofN","RsQUqpT8wu",
+"S2Dfumz8gx","oGu6xblLA9","FNYIMtl72W","jS1ajsqVrf","qQxHPfcJOy","LDk6f1LB1L","FPfSEYw2oU","FLsphLewvM","uvf7As7Mxk","pvgjSPb1pa",
+"nlaByuTacx","Yf2Ec55rfB","RzaZA0ao3l","OHaBzlm0pD","OUYuFXyPZN","lViBvgjUTu","POUYSGv3Fq","Q6LixVjCZq","Fhtgls4786","K20wKatef2",
+"AIYUuBFkb8","45cIH4dEz6","tvdkDdjsrv","IRh48DQimp","OUYuFuvf7A","Oz8yZfcJOy","vkCHHbZLvS","WDVWJoQ87r","Cp3mZQChxs","kB5nP2ZHdk",
+"Nxx9VlCMxy","sx5Glx3LDe","t98iWThjNn","suY4xI7p2a","DLhzMRBhp0","zmLYD0PktI","uvf7AtlILt","S77LHciuWz","4W0TlnnP8o","uAWyp7fKYU",
+"64s8NeuZA5","7Ow5CaFFss","s7MxkSWfou","ogLgcMK07Y","yvOMIJKWYR","pvgjSaL6AJ","O3iyQCNHmv","l83UdfmIK1","uAWyp618Di","GXdoHm4bxU",
+"DLhzMQChxs","dhSuHVLTy6","Chuy3SjskQ","3otm60BmCy","wDajXaDGtS","zqH0WTwano","ECMvUrKDLJ","618Dimz8gx","qaofNx3LDe","RpBQmgdQsS",
+"VIlwP8TxD7","48cHLjSjS3","K4GS8sx5Gl","xXTI4Yh1hF","AIYUumX2GE","VNCPdRxrsm","dpe1vC2Irc","5nmWvU3yw5","oGu6xDQimp","9y4lwx3LDe",
+"n1pmOni2v1","WMiS3ksJby","D6rByyvOMI","2TRI7Ul4a1","JKWYRIRh48","UlU3M9iGoT","S77LH618Di","vkCHHZhwG1","zqH0WChuy3","S2DfulsQGo",
+"JIqXiDG4sT","FGzgpzqH0W","cShY2JXljW","WaWsvGv3Fq","jfREujS1aj","k85Ae8xEKz","uPX7GAIYUu","LbRTHHlUbF","jiVBPVerEA","fqypyKr8ys",
+"gf8rIFwEJz","8xEKzpiJSk","zqH0W2Nslm","VBjhzFhtgl","VerEAMm8si","ECMvU3otm6","FFDui9rlg9","BCxeCDcpWB","uvf7ADcpWB","RzaZAjzUqR",
+"lH1ktix74r","SbRYyi7WMQ","MojnP5drc6","lm0pDksJby","zY1GYAOgEe","lweGy6q6L9","fcJOyYjB9t","XflUqoQ87r","HzZT85Mg9r","Yw2oUoQ87r",
+"v2eC3KsjRK","B3qemDQimp","MezSW0MR5X","i7WMQaez9y","2Nslm5Namm","ulk41RACuj","1v5hHuPX7G","uoStwOxWIH","uTacxQWxoT","h1zcH07n1c",
+"tl72WlpF6W","SmGzvChuy3","yofH3MK07Y","vkCHHhYBCK","CdyBVQworu","StlDJGXdoH","BbwgAh1zcH","L7cGc5iGN5","jtn0XaL6AJ","JIqXiGv3Fq",
+"FnPFB8cVD3","yEfy9RmDcr","ru4UGvkCHH","vOqCE5iGN5","RxrsmtjQxs","OUYuFGrDg7","Zv7z0sx5Gl","CK5W79XyT9","RpBQmzmLYD","iwzGkcL0aE",
+"8hJdtaFFss","fLNg8atef2","fLNg85drc6","1j5L8NcICA","D6rByMGlTF","BGaQYVjCZq","tuDySuJScX","5Drn0guMb8","BCxeCpmeCd","HzZT8ru4UG",
+"QChxsYjB9t","ThjNnBFkb8","tl72W1j5L8","gjUTuCdyBV","lj07QOHaBz","QClRLfaHir","pWiOsSs0Zu","nnP8oRkQke","tuDyS1LB1L","pFrrluvf7A",
+"FwEJz2ZHdk","pvgjSRACuj","rKDLJCNHmv","lj07QlCMxy","uN6r3aDGtS","FLsph3otm6","K20wKAOgEe","gIYvEwDajX","64s8NQnJ1S","9iGoTWaWsv",
+"MGlTFsx5Gl","i7WMQlj07Q","W3VFH29QAz","aL6AJ9rlg9","jiVBPYf2Ec","5Mg9rO3iyQ","h1zcHxciqp","Q6hMCfFDrJ","RsQUqm4bxU","fcwDahUTw7",
+"FxX9qdpe1v","nnP8oqUJMd","AmdQddmoS7","vOqCEfLNg8","QworuIn3NS","v1Hlnn8pJ9","pFrrlWmadA","W3VFH24ARF","pAhR18TxD7","n1pmO580YD",
+"FGzgpIBe8k","DG4sT0ao3l","TXQ0ZjfREu","ksJbyhi5X7","W3VFHVBjhz","RpBQmwiHrZ","cmXIX55rfB","I7p2adQ586","zFgtBZuDtD","blLA9YjB9t",
+"FjHXRb29RJ","zz4ZUgtCA5","pWiOsuupzk","Vprf255rfB","QClRLaFFss","Z4I1vgIYvE","rhl0JHlUbF","580YDyluBx","bZLvS2hEEU","7hyVvGSQwj",
+"ksJbyyvOMI","iqv4kFhtgl","ZzJHWDG4sT","tjQxsgtCA5","he9IAatef2","uZPqgfcwDa","cmXIXs7Mxk","7lUXZ5Namm","hi5X73weIF","Yf2Ec29QAz",
+"45cIHFLsph","9rlg9yluBx","yEfy9aez9y","IjTwPuQIcz","djsrvTwano","QssNCOxWIH","Chuy35nmWv","piJSk0MR5X","HlUbFK4GS8","ru4UGe6e4z",
+"tjQxsatef2","9iGoTS2Dfu","jSjS32DREs","ZJTXH0h1b1","azIWpk85Ae","zQt6QStlDJ","55rfBSs0Zu","e6e4zZJTXH","ThjNnS77LH","pv0i7Yf2Ec",
+"pT8wuYOfrY","RsQUqprNT6","QworuThjNn","mX2GEhYBCK","9XyT9pmeCd","h1zcHnnP8o","I7p2am4bxU","QWxoTjiVBP","taOXK8TxD7","Cp3mZcShY2",
+"Qworu1v5hH","W3VFHv8yFN","HlUbFAgJHQ","pmeCdJRJQB","zQt6QRsQUq","4dEz6ZJTXH","djsrvQworu","GrDg7JRJQB","cL0aEZUnqt","7lUXZ9eoRc",
+"FVMxo55rfB","yvOMIRACuj","ciuWzQnJ1S","ZUnqtOxWIH","jfREuQWxoT","o8UydhYBCK","uTacxUl4a1","RpBQma00b5","iwzGk3weIF","B3qemEoToP",
+"b29RJTwano","7ku1pBGaQY","RkQkehe9IA","55rfB580YD","07n1cMGlTF","gdQsSx3LDe","29QAzmz8gx","OxWIHReKEW","M6qcGqQxHP","Mm8siwDajX",
+"GWqqXkB5nP","Y1mC0m4bxU","taOXKzHF1q","M3zXLgtCA5","uupzke6e4z","45cIHWaWsv","5Mg9rSjskQ","XflUqt98iW","DG4sT48cHL","xReecQ6Lix",
+"OHaBzpvgjS","l83UdAXpwE","v1HlnHRxd8","MmsIoCqqaD","Rxrsm4QMc9","0ao3lNcICA","zFgtBcShY2","Twano3otm6","618DiqQxHP","Oz8yZokgRi",
+"suY4x9eoRc","No0QbFwEJz","aFFssCIShG","gdQsSd85a9","Mkgy8yvOMI","OHaBzYjB9t","5ZaEzpAhR1","QYxC016lHc","cQOnvatef2","SmGzvAkKTk",
+"48cHLtaOXK","Yh1hFFNYIM","jzUqR2DREs","SmGzv6AFT0","zbIYY8cVD3","HlUbFnFqik","jSjS3W7cTs","QbxXcQbxXc","wiHrZoVQp6","PYBf4lj07Q",
+"lXFOBaFFss","FPfSEOUYuF","0Wr5yrKDLJ","2TRI7P6bcg","14FLRnlaBy","DG4sTBFkb8","FGzgpfqypy","7Ow5CFxX9q","y94nw7lUXZ","dQ586B3qem",
+"CdyBV14FLR","6AFT0TXQ0Z","iqv4k1LB1L","VBjhzBGaQY","aDGtSLewvM","uPX7GB3qem","NcICABFkb8","SmGzvvkCHH","vkCHHe6e4z","3otm6pT8wu",
+"MmKGJWmadA","prNT6No0Qb","1LB1LuoStw","SbRYy6AFT0","cL0aEd7vjM","pFrrlWaim6","FxX9qNxx9V","CK5W7Z4I1v","FFDuikB5nP","atef2AIYUu",
+"DcpWB7Ow5C","FLsphWDVWJ","1LB1LY1mC0","RsQUqTa8f6","CNHmvlH1kt","pv0i7Cp3mZ","fmIK107n1c","v1Hln2Nslm","Qworu9XyT9","BCxeC0MR5X",
+"azIWppvgjS","rhl0J7Ow5C","Chuy32Nslm","o8UydUl4a1","uTacx1j5L8","KsjRKa00b5","0Kyfs07n1c","djsrvcShY2","UmaEvgjUTu","fmIK1FFDui",
+"o8UydjzUqR","RpBQm16lHc","AXpwEbZLvS","5VZjSpAhR1","jeskSIjTwP","9eoRcFnPFB","CdyBVtAOsr","aL6AJM6qcG","FLsph7hyVv","fqypyuvf7A",
+"dpe1v07n1c","hE1Ql5IhmG","aez9yUlU3M","C2IrccQOnv","b29RJjeskS","piJSkZuDtD","DcpWBjtn0X","guMb8soy9t","FLsph8hJdt","zFgtBlViBv",
+"lm0pDWDVWJ","qaofNt98iW","K20wK8hJdt","ulk41JXljW","ix74r8RCUA","In3NSCfgr3","5drc6iwzGk","d7vjM5Mg9r","QChxsWDVWJ","YjB9t8TxD7",
+"ogLgc5Drn0","jiVBPwDajX","QYxC0jSjS3","L7cGcAIYUu","9rlg9k85Ae","AXpwEMaJQs","4dEz6nnP8o","s4786WaWsv","lCMxyuvf7A","lpF6WyvOMI",
+"ciuWzl83Ud","GXdoHECMvU","i7WMQQClRL","7fsYMPYBf4","JIqXi0h1b1","CNHmvNxx9V","Mm8sicmXIX","RBhp0oVQp6","t98iWZ4I1v","LewvMbgJAz",
+"fcJOybgJAz","iwzGkBFkb8","8RCUAUmaEv","uN6r3jeskS","zFgtB9y4lw","nnP8oSs0Zu","mz8gxFhtgl","0Kyfs5ZaEz","StlDJiwzGk","Nxx9VSbRYy",
+"k85AeVLTy6","t98iWI7p2a","2ZHdkFwEJz","fmIK1UlU3M","O3iyQbZLvS","EdBKcKsjRK","okgRiRmDcr","WPmlxF6PT2","NOHszvLsmS","lweGyxciqp",
+"Cp3mZC2Irc","SWfoubZLvS","ECMvUpv0i7","lpF6WM3zXL","4W0TlWaim6","SmGzvUlU3M","0PktIhi5X7","SmGzvaFFss","lkMUAlsQGo","FPfSEG1RhS",
+"x3LDejzUqR","iB08lFcWrW","MaJQsHlUbF","jfREuWreyP","7fKYUL7cGc","8FmFH1LB1L","Uvlv44dEz6","618DiThjNn","d7vjMLewvM","0YAGHokgRi",
+"aDGtSNxx9V","4QMc9Qworu","AIYUuQ6Lix","FVMxoQ6Lix","Zv7z0s4786","7Ow5CnlaBy","L7cGclj07Q","pvgjS9rlg9","7X3uyQWxoT","pT8wuGrDg7",
+"VerEACNHmv","rKDLJblLA9","xciqpQClRL","CxVEf2Yz7E","y94nwFLsph","6AFT0HfyNQ","t59lRazIWp","okgRivLsmS","ciuWztAOsr","2ZHdkX6Pin",
+"2TRI7Cfgr3","M3zXLhSSvQ","ZUnqtQ6hMC","9rlg9vOqCE","hYBCKOz8yZ","LbRTHulk41","Uvlv4k85Ae","CqqaDGSQwj","fcJOy16lHc","9y4lwAOgEe",
+"AOgEe0BmCy","RACujFxX9q","KsjRKFPfSE","tlILtFGzgp","UlU3MjSjS3","Z4I1vxReec","d7vjMNhXdu","KsjRKrz7Ut","v8yFNzHF1q","fFDrJtAOsr",
+"1j5L8GWqqX","Qworu4dEz6","nFqikJKWYR","MaJQs4W0Tl","lweGyDQimp","uZPqg3otm6","iqv4kjeskS","64s8N0MR5X","RACujQChxs","2DREsGrDg7",
+"BpYhVAgJHQ","M6qcGCqqaD","bgJAz618Di","JJs5mfFDrJ","Dz1R3FwEJz","tjQxsOUYuF","580YDgdQsS","zqH0W618Di","SmGzvFcWrW","MmsIogdQsS",
+"d7vjMChuy3","M6qcGpAhR1","JJs5mdpe1v","bZLvSpvgjS","VNCPdMm8si","lweGyulk41","2Yz7EbgJAz","W7cTs5Namm","cL0aEOxWIH","t59lRzmLYD",
+"CNHmvMmsIo","d85a9RmDcr","VBjhzI7p2a","iwzGkMmsIo","xXTI4BCxeC","HfyNQuPX7G","lH1ktGv3Fq","BpYhVNhXdu","bZLvSY1mC0","FNYIMtaOXK",
+"jfREurhl0J","In3NSBpYhV","KASQ8taOXK","oVQp6OHaBz","RBhp0uJScX","tvdkDxReec","7fKYUOUqFM","JRJQBsoy9t","x3LDe0YAGH","GrDg7s4786",
+"lXFOBzbIYY","i3pydlCMxy","xReecJJs5m","7fsYMBGaQY","CNHmvlViBv","pWiOsMkgy8","O3iyQPOUYS","FhtgloVQp6","618DiVBjhz","prNT6W7cTs",
+"LbRTHgIYvE","IBe8k48cHL","t59lRBCxeC","KsjRKFnPFB","mz8gxDQimp","QbxXc0ao3l","aFFssMaJQs","M3zXLfcJOy","FcWrWWreyP","Q6Lixy94nw",
+"nlaByGv3Fq","fqypyUvlv4","SWfouCfgr3","7fsYMgjUTu","blLA9tuDyS","9eoRcZzJHW","W3VFHDz1R3","2hEEU8FmFH","IBe8kfcwDa","0BmCy1LB1L",
+"ulk41AmdQd","VerEAVBjhz","9rlg9atef2","uupzkuupzk","ThjNnWPmlx","ksJbyzHF1q","XflUqQClRL","Nxx9VfcwDa","7Ow5C0Wr5y","CNHmv5IhmG",
+"8RCUAbrhlQ","uLtKspmeCd","JJs5mIjTwP","GXdoHZ4I1v","zmLYDix74r","B3qemHlUbF","G1RhS5Drn0","xciqpPYBf4","9eoRcQssNC","yToGWU3yw5",
+"pWiOsnlaBy","ZhwG1Qworu","7Ow5CciuWz","VerEAFGzgp","7fKYUni2v1","B3qemFcWrW","DcpWBHP433","nnP8oYw2oU","SjskQix74r","QYxC00h1b1",
+"kB5nPyvOMI","zHF1qDQimp","zQt6QCNHmv","gIYvEoQ87r","ksJbyHfyNQ","9y4lwksJby","5Drn0S2Dfu","8RCUATwano","L7cGctuDyS","fFDrJix74r",
+"SjskQ4QMc9","Cfgr3OUYuF","CK5W7FcWrW","a00b5OxWIH","7hyVvVNCPd","pAhR164s8N","Ta8f6RACuj","RkQkeguMb8","5IhmGnnP8o","jzUqRlH1kt",
+"okgRiP6bcg","0BmCyfqypy","gf8rISWfou","sx5Glrz7Ut","v8yFNRACuj","SjskQJKWYR","yluBxRBhp0","M3zXLF6PT2","RsQUqydG8U","55rfBoGu6x",
+"lViBvMkgy8","BpYhVlH1kt","QworusqVrf","zY1GYFLsph","8cVD39XyT9","NOHsz8xEKz","S2DfuzY1GY","FLsphSbRYy","0YAGHaL6AJ","rhl0J2TRI7",
+"3weIFO3iyQ","0Wr5yVNCPd","cQOnv29QAz","I7p2aCNHmv","tlILt9y4lw","CxVEfprNT6","Cfgr37hyVv","soy9t7lUXZ","guMb8FwEJz","atef2Yf2Ec",
+"8FmFH2hEEU","fqypyuTacx","ECMvUvLsmS","y94nwVIlwP","tAOsrJJs5m","mX2GESs0Zu","a00b58hJdt","14FLRCxVEf","YjB9tCxVEf","rKDLJLewvM",
+"J2mQiRmDcr","ulk41yvOMI","y94nwsx5Gl","fFDrJQWxoT","OUqFMpiJSk","k85Ae7Ow5C","PYBf4SmGzv","WPmlxlXFOB","fqypy8hJdt","lj07QCdyBV",
+"he9IAprNT6","y94nwix74r","dpe1vtlILt","8TxD7J2mQi","v8yFNdmoS7","n1pmOEoToP","lpF6Wdpe1v","0YAGH7hyVv","8FmFHAmdQd","brhlQ5ZaEz",
+"nFqikUmaEv","QYxC0fcJOy","tjQxsfcwDa","FxX9q580YD","ix74rYw2oU","K20wKTXQ0Z","aDGtSrz7Ut","RpBQm580YD","CdyBVDLhzM","jtn0Xt98iW",
+"J2mQiCxVEf","ksJbyoQ87r","zz4ZU64s8N","i3pydChuy3","yluBxk85Ae","LDk6fBGaQY","9XyT9FVMxo","6q6L9JkzUn","6AFT0FNYIM","FFDuiFnPFB",
+"RkQkeS77LH","2Yz7EfFDrJ","G1RhSi3pyd","cShY2AIYUu","aez9yzz4ZU","lm0pDyEfy9","0Wr5yKZamH","2hEEUIBe8k","5Drn07Ow5C","yToGWSmGzv",
+"fFDrJ9rlg9","QbxXcaL6AJ","d7vjM5nmWv","StlDJPOUYS","iwzGkChuy3","mX2GEvOqCE","1j5L8FPfSE","IRh48XyPZN","G1RhS5IhmG","euZA5WmadA",
+"24ARFmz8gx","yofH3QbxXc","DLhzM4W0Tl","6AFT0RBhp0","DLhzMxXTI4","M3zXLo8Uyd","o8UyddhSuH","NhXdulpF6W","dhSuHuN6r3","BbwgAxReec",
+"pT8wulkMUA","StlDJdQ586","lsQGoJRJQB","l83Ud0YAGH","aL6AJD6rBy","x3LDeMmKGJ","8FmFHiwzGk","VjCZq0Kyfs","WreyPi3pyd","16lHcIRh48",
+"YjB9tjtn0X","8cVD3J2mQi","5drc6Yh1hF","vLsmSt98iW","h1zcHb29RJ","xReecCqqaD","VerEAqaofN","sx5GlKsjRK","NOHszeuZA5","lCMxyStlDJ",
+"5IhmGzbIYY","hYBCK6q6L9","aL6AJi7WMQ","soy9tyluBx","t98iW9eoRc","jeskSyEfy9","K4GS8nnP8o","soy9tNAFuw","5drc6KASQ8","MaJQsReKEW",
+"e6e4ztAOsr","CdyBVlCMxy","QbxXcSmGzv","MezSWpFrrl","lH1ktAXpwE","nnP8oEdBKc","6q6L9HzZT8","BpYhVFPfSE","uLtKszmLYD","I7p2azY1GY",
+"tl72WMmKGJ","BpYhVAOgEe","zY1GYThjNn","8U2nUS77LH","IKxdLAmdQd","BGaQY618Di","0BmCyIn3NS","pWiOswiHrZ","iB08l24ARF","5IhmGxReec",
+"HP433tl72W","OxWIHfcwDa","Ul4a1No0Qb","FjHXRD6rBy","m4bxUSmGzv","ReKEWPOUYS","euZA5tl72W","n1pmOTa8f6","jeskS5VZjS","zY1GYF6PT2",
+"B3qemi3pyd","VerEAQnJ1S","NOHszokgRi","9eoRcK4GS8","jzUqROxWIH","cShY29eoRc","aL6AJYw2oU","8U2nU2ZHdk","xciqpvLsmS","LDk6fCIShG",
+"guMb8M3zXL","4QMc9QYxC0","NcICAi3pyd","55rfBgjUTu","gdQsSiwzGk","y94nwh1zcH","AkKTkdhSuH","fcwDaMaJQs","m4bxUiwzGk","Chuy3PYBf4",
+"FwEJz29QAz","Twanohe9IA","pmeCdJ2mQi","0MR5XCfgr3","55rfBt59lR","fmIK18RCUA","aDGtS3otm6","ciuWzuN6r3","GSQwjAXpwE","gtCA5pv0i7",
+"Oz8yZrhl0J","YjB9tEoToP","zY1GYix74r","dhSuHJRJQB","HzZT8Chuy3","FNYIM7fKYU","7Ow5CxXTI4","M3zXLRpBQm","fcwDazmLYD","S77LHTXQ0Z",
+"nFqikpiJSk","45cIHW3VFH","IjTwPm4bxU","ZzJHWZUnqt","QYxC0KZamH","lm0pDNOHsz","EoToPIjTwP","jeskSTCgPp","9GXkXQChxs","0h1b10h1b1",
+"5iGN5gIYvE","vLsmS7X3uy","yofH38RCUA","tjQxsRBhp0","618DiaFFss","JJs5muupzk","2TRI7EdBKc","Ta8f6M3zXL","gIYvE3weIF","SmGzvbgJAz",
+"gjUTum4bxU","C2IrczFgtB","aL6AJk85Ae","m4bxU6AFT0","2ZHdksqVrf","8RCUAMGlTF","6q6L9AkKTk","ogLgcDLhzM","yvOMIVBjhz","aL6AJs4786",
+"3otm6yToGW","uoStw5Drn0","OxWIHAgJHQ","BpYhVZuDtD","In3NSPYBf4","NhXdu5Mg9r","Pb1pauN6r3","SbRYyWMiS3","FcWrWtvdkD","lsQGoCqqaD",
+"JIqXiFnPFB","uupzk2Nslm","prNT6lCMxy","b29RJQ6Lix","8RCUAHzZT8","2NslmG1RhS","rz7UtFcWrW","GSQwjAmdQd","lXFOBt59lR","NAFuwFcWrW",
+"9rlg9G1RhS","Yw2oUBCxeC","9rlg9zY1GY","uupzkydG8U","b29RJ0YAGH","FLsphv8yFN","IRh48VerEA","rz7Utix74r","7fKYUQYxC0","YjB9tjeskS",
+"lj07Qh1zcH","FGzgpjeskS","WmadAD6rBy","Ta8f6zFgtB","9rlg9jfREu","YjB9t7fKYU","CNHmvuoStw","euZA58TxD7","ThjNnd7vjM","VerEAQWxoT",
+"faHirokgRi","hi5X7lCMxy","48cHLtlILt","pFrrldhSuH","RmDcrlm0pD","lH1kthe9IA","HRxd8CNHmv","8U2nUHzZT8","hYBCK0Kyfs","5Namm7lUXZ",
+"MaJQsQ6Lix","PYBf4RzaZA","ThjNnzQt6Q","brhlQUl4a1","9XyT9lm0pD","UlU3MaDGtS","8FmFH3otm6","XyPZNVprf2","WPmlxuupzk","atef2FPfSE",
+"U3yw5uvf7A","oGu6xS77LH","cShY2lm0pD","Ta8f6fLNg8","FLsphG1RhS","GSQwjmX2GE","vOqCEK4GS8","rhl0JogLgc","K4GS8OUYuF","iqv4kQworu",
+"EoToP24ARF","jiVBPMojnP","mz8gxtjQxs","euZA5v1Hln","Cp3mZBCxeC","6AFT0S77LH","uQIczuQIcz","nFqikuLtKs","9y4lwJXljW","taOXKEOE1o",
+"7fsYMCIShG","MojnPXflUq","h1zcHulk41","Chuy3jS1aj","hSSvQJkzUn","pv0i7ReKEW","64s8NGSQwj","W3VFH7Ow5C","yofH3Kr8ys","Zv7z0FjHXR",
+"NOHszFVMxo","HP433lpF6W","uvf7Adpe1v","CK5W7tlILt","4dEz6uLtKs","zz4ZUvLsmS","d7vjM14FLR","prNT6uZPqg","SjskQmz8gx","M3zXLuJScX",
+"580YDEoToP","tuDySzmLYD","qUJMdsoy9t","JKWYRprNT6","DcpWBPOUYS","Q6hMCFnPFB","2Yz7EVjCZq","fLNg8HRxd8","t98iWaDGtS","QssNCJIqXi",
+"8hJdtzmLYD","0YAGHyluBx","WmadAQYxC0","CK5W7BpYhV","8U2nUF6PT2","VLTy6h1zcH","v1HlnUl4a1","aDGtSlViBv","16lHcuAWyp","zqH0W2hEEU",
+"IBe8kUlU3M","X6PinCdyBV","pT8wu5Mg9r","prNT6zmLYD","vOqCEmz8gx","yluBx618Di","9y4lwlweGy","NAFuwhe9IA","s7MxkFFDui","FxX9qlCMxy",
+"5VZjSIjTwP","guMb8uvf7A","Yh1hFChuy3","2DREs3otm6","LDk6fv2eC3","580YDhi5X7","IjTwP9rlg9","prNT60Kyfs","5Drn0k85Ae","3otm6Y1mC0",
+"QClRLFjHXR","0Wr5yzqH0W","vOqCESs0Zu","BGaQYuvf7A","pvgjS0YAGH","Mkgy8Yh1hF","SmGzvwDajX","lm0pDtlILt","D6rByPOUYS","VjCZqSs0Zu",
+"lm0pD0MR5X","Z4I1v5iGN5","sx5GlOxWIH","55rfBfLNg8","IRh48zHF1q","t59lRdQ586","PYBf4Gv3Fq","DQimpciuWz","LbRTHxciqp","DLhzMFLsph",
+"FGzgp8RCUA","fcJOyCdyBV","GSQwjZv7z0","Cp3mZ45cIH","s93MlW3VFH","ThjNn6AFT0","WmadApv0i7","S2DfuRpBQm","uJScXCfgr3","S77LHuPX7G",
+"55rfB9GXkX","1j5L8VNCPd","zbIYYdhSuH","jtn0XQbxXc","LbRTHCdyBV","uTacxKr8ys","0PktI7X3uy","cQOnvhE1Ql","AmdQdL7cGc","AkKTkh1zcH",
+"zbIYY9XyT9","BGaQY0Wr5y","d85a9DcpWB","wDajXlViBv","DcpWBnnP8o","yvOMI580YD","VNCPdFFDui","W7cTsvOqCE","DcpWBEoToP","0MR5XD6rBy",
+"GXdoHO3iyQ","ix74rNhXdu","n1pmO5nmWv","W7cTsRsQUq","nlaByP6bcg","VIlwPKsjRK","jeskSZUnqt","0ao3loQ87r","S77LHFxX9q","BpYhVFFDui",
+"LDk6fuZPqg","TwanoXflUq","G1RhSQbxXc","ECMvU7fsYM","5VZjSyEfy9","rhl0Jhi5X7","s93MlQnJ1S","ulk41i7WMQ","StlDJU3yw5","jtn0XPOUYS",
+"Yw2oUFjHXR","2ZHdk0h1b1","d7vjMd85a9","iB08luoStw","I7p2al83Ud","IjTwPv2eC3","4W0Tllj07Q","vLsmStvdkD","ReKEW9XyT9","NOHszCxVEf",
+"Waim6he9IA","StlDJlpF6W","gIYvEi3pyd","Yw2oU5Namm","GSQwjuN6r3","IBe8k8FmFH","lXFOBiqv4k","BCxeCAXpwE","VNCPd64s8N","VNCPd5drc6",
+"580YDfmIK1","IRh48ni2v1","9y4lw5Namm","yluBxMkgy8","Kr8ysB3qem","NcICAulk41","2TRI7Yf2Ec","5Mg9rmz8gx","5iGN50ao3l","45cIHLbRTH",
+"MezSWXyPZN","NOHszfFDrJ","8FmFHWreyP","POUYSeuZA5","No0QboGu6x","suY4xhi5X7","SjskQuTacx","prNT6OUYuF","RkQkelXFOB","jS1ajuPX7G",
+"5IhmGoVQp6","U3yw5Waim6","ciuWzIRh48","JRJQB7Ow5C","lm0pD4QMc9","FPfSEUl4a1","7fsYMxReec","ZzJHWQworu","StlDJ5IhmG","uLtKsNOHsz",
+"7fsYM0BmCy","0MR5XFwEJz","MojnPCdyBV","fqypyWDVWJ","FjHXRyvOMI","blLA9VNCPd","tvdkDMkgy8","Z4I1vuvf7A","e6e4zGSQwj","jeskSECMvU",
+"EoToPuoStw","IRh485IhmG","GSQwjtaOXK","1j5L85IhmG","0BmCyRBhp0","CNHmvazIWp","soy9t7ku1p","LbRTHyofH3","sx5Gljtn0X","brhlQuupzk",
+"hE1QlL7cGc","VBjhzpmeCd","No0Qbi3pyd","h1zcHJXljW","AgJHQB3qem","ciuWzlpF6W","jiVBPUl4a1","azIWpNhXdu","HRxd8Dz1R3","XflUqVNCPd",
+"1LB1LECMvU","Yf2EcFwEJz","8TxD7NAFuw","ZhwG1QYxC0","7ku1p2Nslm","aez9ym4bxU","uTacxW7cTs","ulk41PYBf4","8hJdt45cIH","K4GS8m4bxU",
+"BpYhV580YD","MK07YMaJQs","uQIczQ6hMC","Waim6aDGtS","4W0Tl2DREs","14FLRKr8ys","pv0i7faHir","nnP8oyEfy9","5nmWv8cVD3","HRxd8uupzk",
+"fLNg8t98iW","uQIczFNYIM","t59lR2ZHdk","lCMxytjQxs","uupzk618Di","pT8wucmXIX","VLTy6J2mQi","AgJHQGXdoH","FnPFBlsQGo","BCxeCaez9y",
+"Ta8f65Drn0","Ss0ZuRkQke","cmXIXBpYhV","OUqFMiKqhr","ZhwG1blLA9","QnJ1SbZLvS","aDGtSQYxC0","AIYUutAOsr","GSQwjYf2Ec","AmdQdzz4ZU",
+"zmLYDfcJOy","gdQsSlweGy","DG4sTdQ586","nlaByy94nw","fcJOylsQGo","Mkgy8uN6r3","OUqFMSmGzv","blLA9FcWrW","t98iWazIWp","WmadAKsjRK",
+"4QMc9HP433","gIYvEUl4a1","7hyVvUlU3M","wiHrZuupzk","tlILtQworu","HfyNQmX2GE","MmKGJpv0i7","0MR5XWDVWJ","IKxdLFVMxo","oQ87rgdQsS",
+"QnJ1SW3VFH","pWiOsWreyP","5iGN5Fhtgl","lkMUAaez9y","KsjRKyofH3","OHaBzCNHmv","ReKEWaFFss","oGu6xFwEJz","StlDJ0h1b1","tAOsr9GXkX",
+"7ku1pi3pyd","CdyBV7fsYM","2NslmMm8si","nnP8olkMUA","Yw2oU0h1b1","0MR5X7fsYM","djsrvpiJSk","UmaEvuQIcz","oGu6xVprf2","8xEKzulk41",
+"gdQsS8U2nU","a00b5WPmlx","16lHc8FmFH","bgJAzdhSuH","xReecjS1aj","lXFOBYw2oU","Cfgr3KZamH","Kr8yscL0aE","a00b5WmadA","hUTw7KsjRK",
+"CqqaDYjB9t","3otm6SbRYy","55rfBGWqqX","UlU3Ms7Mxk","NAFuwlm0pD","8cVD3DQimp","fqypyoVQp6","MojnP580YD","MmKGJlkMUA","s4786suY4x",
+"07n1c7lUXZ","zHF1qJKWYR","BCxeCeuZA5","9iGoTOxWIH","VBjhzNcICA","S77LHRACuj","uQIczsoy9t","RmDcr7fsYM","K4GS8AOgEe","lkMUAQworu",
+"okgRiF6PT2","s4786t59lR","djsrv8cVD3","QnJ1Si7WMQ","4QMc9IBe8k","Uvlv4uAWyp","uupzkuN6r3","ksJbyG1RhS","8FmFHYw2oU","pvgjShYBCK",
+"TCgPphSSvQ","DQimpsqVrf","hE1QlJIqXi","HzZT8lsQGo","NAFuwCqqaD","PYBf4W7cTs","taOXK580YD","AXpwE1LB1L","Ta8f6prNT6","dpe1vSbRYy",
+"BFkb8O3iyQ","hSSvQHRxd8","hYBCKTXQ0Z","Ta8f616lHc","6q6L9D6rBy","1j5L8okgRi","29QAzM6qcG","Rxrsm8TxD7","DcpWBkB5nP","SWfouJJs5m",
+"Ss0ZuGSQwj","jfREukZANm","uJScXgIYvE","FnPFB2Yz7E","lweGycL0aE","5Namm8FmFH","ix74rsx5Gl","zY1GYFhtgl","FxX9qdmoS7","0ao3l618Di",
+"ogLgckZANm","Gv3FqBbwgA","HlUbFZuDtD","P6bcgxXTI4","BGaQYpT8wu","azIWpDcpWB","5nmWvD6rBy","8TxD7pT8wu","pv0i7WreyP","45cIHAXpwE",
+"cQOnvGrDg7","QClRLzHF1q","NcICAQWxoT","TwanoMkgy8","dhSuHzY1GY","pv0i7RmDcr","Vprf2tuDyS","GrDg7fLNg8","OxWIHVLTy6","tvdkD8RCUA",
+"2hEEUVNCPd","rz7Utulk41","AmdQd64s8N","FcWrW7lUXZ","K4GS814FLR","WDVWJd85a9","ydG8UM6qcG","azIWpJJs5m","No0QbG1RhS","TCgPpv2eC3",
+"IBe8kzY1GY","FwEJz8hJdt","oGu6xWMiS3","QssNCs4786","cL0aEcL0aE","azIWpWMiS3","fcJOyHlUbF","FnPFBDcpWB","ZUnqtFwEJz","SWfoufmIK1",
+"6AFT02Yz7E","iwzGk7lUXZ","ZzJHWFwEJz","7X3uyvkCHH","nlaByNhXdu","dmoS7GXdoH","AkKTks7Mxk","7hyVvWreyP","SbRYyYjB9t","lpF6Wfqypy",
+"0BmCyAkKTk","AOgEeFwEJz","dQ586pAhR1","5IhmGLbRTH","zQt6QvkCHH","zQt6QECMvU","uQIczMmsIo","hE1Qlulk41","ReKEWyofH3","LewvMMkgy8",
+"IjTwPuTacx","2DREs45cIH","9y4lwVLTy6","FFDuicShY2","KsjRKuoStw","x3LDefcJOy","24ARFFGzgp","FPfSEUmaEv","GrDg7AgJHQ","o8UydVNCPd",
+"rz7UtTa8f6","aez9ylCMxy","kZANmBbwgA","X6PinYw2oU","WPmlxDQimp","SjskQ0PktI","pAhR1ZhwG1","QYxC03weIF","2DREsLewvM","8xEKzAgJHQ",
+"3otm6ni2v1","Q6hMCfLNg8","nnP8o0Wr5y","qUJMd5drc6","DQimpb29RJ","XflUq64s8N","piJSkO3iyQ","RmDcri7WMQ","xciqpvOqCE","zY1GYZv7z0",
+"6AFT05IhmG","oQ87rQssNC","oQ87rOUYuF","uZPqgZhwG1","EdBKci7WMQ","RmDcrs93Ml","yToGWeuZA5","LbRTHnFqik","C2Irc0ao3l","uJScXKr8ys",
+"ECMvU8RCUA","9eoRczFgtB","cmXIXIKxdL","euZA5mX2GE","XyPZNlweGy","S2Dfuiqv4k","ZhwG1hUTw7","BFkb8Vprf2","jiVBPEOE1o","mz8gx45cIH",
+"suY4xW3VFH","2TRI7taOXK","Ta8f6GWqqX","7lUXZQnJ1S","uN6r3n8pJ9","OxWIHFVMxo","pWiOsSWfou","zQt6QIRh48","5iGN5WPmlx","pAhR17hyVv",
+"LewvMCdyBV","jzUqRZzJHW","d85a90YAGH","aez9ys4786","gjUTuMkgy8","PYBf4MmKGJ","tjQxsBCxeC","OxWIHLewvM","FFDuiI7p2a","3weIFFwEJz",
+"bZLvSaFFss","hYBCKa00b5","wiHrZFGzgp","brhlQmX2GE","oVQp6WMiS3","Waim6Chuy3","AmdQdW7cTs","Yf2EccShY2","C2IrcKsjRK","JJs5mS2Dfu",
+"uQIczNcICA","vkCHHni2v1","L7cGc2ZHdk","SbRYyzQt6Q","0PktItAOsr","NOHszZzJHW","iqv4kOHaBz","WPmlxS2Dfu","TwanoRpBQm","HlUbFs93Ml",
+"Cp3mZIKxdL","zqH0WNxx9V","8FmFHMezSW","K4GS84W0Tl","yEfy92hEEU","OHaBzUl4a1","zHF1qLbRTH","0h1b1G1RhS","QChxshYBCK","C2Irc5nmWv",
+"uvf7AaL6AJ","7fsYMQbxXc","M6qcGNOHsz","J2mQihe9IA","pmeCdIRh48","FwEJzSs0Zu","gf8rIv1Hln","XflUqQworu","C2IrcMmKGJ","GXdoHzQt6Q",
+"b29RJdmoS7","Oz8yZFjHXR","2hEEUrz7Ut","WMiS3DcpWB","uupzkMmsIo","2NslmVjCZq","iwzGkDG4sT","pFrrlOUqFM","Chuy3IBe8k","e6e4zjzUqR",
+"lCMxyEdBKc","fFDrJmX2GE","X6PinBFkb8","atef2DG4sT","5ZaEz5Namm","0YAGH1LB1L","SjskQ3weIF","Twanosoy9t","tuDySHzZT8","fqypyrz7Ut",
+"MojnPfcwDa","AgJHQuupzk","DQimpBpYhV","djsrvVLTy6","uoStwyofH3","X6PinlViBv","tvdkDFwEJz","ZJTXHAkKTk","a00b5nlaBy","IjTwPQ6hMC",
+"prNT65drc6","uJScX6AFT0","IKxdLs4786","DG4sTiqv4k","Mm8siaL6AJ","Cp3mZgIYvE","uupzkvkCHH","pAhR1KsjRK","vLsmSlXFOB","EOE1oG1RhS",
+"NAFuwJXljW","O3iyQ8hJdt","NhXduy94nw","Gv3Fqs7Mxk","okgRidQ586","vOqCEuvf7A","VNCPdBCxeC","Y1mC0FGzgp","7fKYU8TxD7","RACuj2TRI7",
+"RsQUqazIWp","8TxD7DQimp","pFrrlFPfSE","ThjNnXyPZN","oQ87rFnPFB","Mm8siOz8yZ","ZUnqtWreyP","brhlQ7ku1p","VjCZqxciqp","lj07QZUnqt",
+"n8pJ9dpe1v","NOHszNAFuw","brhlQpT8wu","vkCHHNcICA","WMiS3iwzGk","gjUTuUvlv4","v8yFNFNYIM","ThjNnECMvU","zY1GYogLgc","RkQke14FLR",
+"YjB9tMmsIo","No0Qbuvf7A","jSjS3Rxrsm","9y4lwuoStw","5NammhE1Ql","gtCA5VLTy6","pv0i7gdQsS","suY4xuLtKs","KASQ8JJs5m","9GXkX8FmFH",
+"jfREuThjNn","GrDg79y4lw","29QAz5iGN5","ZJTXHS77LH","BGaQY5VZjS","CqqaDm4bxU","ni2v1lj07Q","jiVBP2ZHdk","oQ87rZ4I1v","5Drn0Oz8yZ",
+"e6e4z9eoRc","0KyfsuAWyp","YjB9ti3pyd","CxVEf0MR5X","hi5X7qUJMd","RpBQmFGzgp","cQOnvFPfSE","azIWpbgJAz","24ARFF6PT2","X6PinjSjS3",
+"tuDySF6PT2","aDGtS7fKYU","KsjRKfaHir","yEfy9piJSk","NOHszPOUYS","YjB9tksJby","M6qcGjeskS","LewvMlCMxy","JKWYRzbIYY","LbRTH9GXkX",
+"6AFT045cIH","4QMc96AFT0","uJScXb29RJ","JRJQBZhwG1","Waim6nFqik","h1zcH5Drn0","In3NSVIlwP","POUYSPb1pa","ogLgcHfyNQ","SWfouXyPZN",
+"FLsphBCxeC","JXljWdhSuH","zz4ZUlj07Q","pmeCdMkgy8","LDk6fQbxXc","24ARF2ZHdk","QClRLX6Pin","Z4I1vNOHsz","IRh48hYBCK","4W0TlECMvU",
+"cQOnvPb1pa","KZamHK4GS8","aez9yOUqFM","FnPFBdhSuH","m4bxUWPmlx","uupzkWmadA","GrDg7MojnP","dmoS72TRI7","HlUbFYjB9t","9y4lwvkCHH",
+"Ss0ZuKr8ys","jtn0X0ao3l","CdyBVOUqFM","TwanoRACuj","t98iWtl72W","uZPqgpvgjS","Kr8ysOxWIH","07n1cZuDtD","Kr8ysMm8si","xReecMK07Y",
+"aez9yjiVBP","AgJHQ5Drn0","t59lRWPmlx","CIShG16lHc","FNYIMqQxHP","uN6r3CqqaD","rhl0JO3iyQ","iwzGkhe9IA","soy9t8TxD7","fFDrJWmadA",
+"k85AeFFDui","lXFOBfLNg8","9GXkXPb1pa","8cVD33weIF","8RCUAaez9y","GrDg7qaofN","FjHXRFhtgl","kZANmlViBv","zFgtBru4UG","RpBQmgf8rI",
+"ni2v15iGN5","VIlwPChuy3","IBe8ksoy9t","RpBQm2ZHdk","Gv3Fqaez9y","8cVD314FLR","y94nwZv7z0","0ao3lUmaEv","QWxoTjeskS","pWiOsFjHXR",
+"JXljWlCMxy","yToGW07n1c","55rfB9XyT9","SbRYyZuDtD","BFkb8YOfrY","gIYvECdyBV","CxVEfM6qcG","brhlQfqypy","i7WMQYh1hF","hUTw75IhmG",
+"s47867ku1p","e6e4zpv0i7","k85AeOUqFM","45cIHfcwDa","yEfy9bgJAz","x3LDeIKxdL","NOHszlXFOB","M3zXLcQOnv","HP433o8Uyd","hE1QlRpBQm",
+"KASQ8gdQsS","kB5nPNOHsz","HP433FNYIM","GXdoHSs0Zu","taOXKGrDg7","iqv4koGu6x","v8yFNPYBf4","OUYuFZzJHW","FFDuiPYBf4","d85a9guMb8",
+"0MR5XQChxs","kZANmt98iW","StlDJiqv4k","guMb8djsrv","D6rByydG8U","NcICAuJScX","ZhwG1zHF1q","iB08lECMvU","MojnPRzaZA","d85a9xciqp",
+"hYBCKQWxoT","5IhmGpmeCd","WreyPMmKGJ","nFqikBbwgA","xXTI4FGzgp","FhtglYf2Ec","Kr8ysVLTy6","FFDuiUmaEv","CxVEfiqv4k","OHaBz4W0Tl",
+"QYxC0Z4I1v","EdBKc4QMc9","lweGyCdyBV","brhlQgjUTu","5VZjSs93Ml","uJScXC2Irc","gf8rI0h1b1","zY1GYWmadA","Cfgr3No0Qb","POUYS5ZaEz",
+"v2eC3uoStw","M3zXLsqVrf","cQOnvyvOMI","FGzgpI7p2a","AOgEeUlU3M","pT8wuwiHrZ","jiVBPa00b5","RsQUqcShY2","5Mg9rDz1R3","qaofN1LB1L",
+"qaofNn8pJ9","y94nwWMiS3","oGu6xAmdQd","CxVEfxciqp","6q6L9QChxs","FNYIMMK07Y","29QAz7Ow5C","TXQ0ZTCgPp","zqH0WgjUTu","zQt6QHlUbF",
+"lpF6WDz1R3","cQOnvIBe8k","Qworul83Ud","DcpWBjeskS","xReecWmadA","cShY264s8N","IBe8k24ARF","IjTwPlsQGo","3otm6POUYS","yEfy91j5L8",
+"dpe1vZ4I1v","HzZT8P6bcg","Cfgr3Mkgy8","faHirjiVBP","FcWrWU3yw5","rKDLJiB08l","zz4ZUjSjS3","zQt6QHfyNQ","taOXKoQ87r","mz8gxd7vjM",
+"he9IAOUYuF","0MR5XAmdQd","rhl0J0ao3l","MmKGJ2Yz7E","pAhR1CxVEf","h1zcHhE1Ql","NAFuwPOUYS","2ZHdkpWiOs","P6bcgi7WMQ","brhlQFhtgl",
+"2hEEUguMb8","2hEEU5IhmG","hSSvQQWxoT","8hJdtd85a9","WPmlxqQxHP","Oz8yZIn3NS","ydG8UpmeCd","sqVrfs4786","FxX9qQYxC0","Fhtgl48cHL",
+"RmDcr618Di","SjskQ14FLR","FNYIM24ARF","Zv7z0d7vjM","lkMUAsoy9t","NhXdugjUTu","rz7UtaL6AJ","tjQxs64s8N","v1HlnfmIK1","JkzUnv8yFN",
+"P6bcgxciqp","8hJdtTXQ0Z","Yf2EcmX2GE","nnP8oQWxoT","nlaByoGu6x","aDGtS1v5hH","GWqqXuN6r3","SmGzv2TRI7","lpF6WlpF6W","gtCA51v5hH",
+"5Drn0tAOsr","nnP8o1LB1L","POUYS5Mg9r","HfyNQHfyNQ","fFDrJgtCA5","FcWrWrz7Ut","yEfy9QssNC","JXljWRmDcr","rKDLJ6q6L9","jfREuQYxC0",
+"OUqFMatef2","jiVBPhYBCK","uJScXyvOMI","tjQxsBpYhV","2Yz7E55rfB","AOgEeQClRL","7X3uyLewvM","ZhwG1QnJ1S","8U2nUAkKTk","uvf7AOz8yZ",
+"KZamHeuZA5","5Namm5nmWv","fqypy2ZHdk","lH1ktRACuj","blLA9qQxHP","a00b5gjUTu","ogLgcfaHir","iKqhrm4bxU","FVMxoWreyP","GXdoHUlU3M",
+"9y4lw0Wr5y","Nxx9VpFrrl","EoToPs93Ml","soy9t6AFT0","Waim6QnJ1S","faHirpv0i7","XyPZNhE1Ql","t59lRsoy9t","07n1cAXpwE","pT8wuuTacx",
+"0MR5XtlILt","uoStwRpBQm","lViBvHP433","hi5X7IKxdL","ZuDtDs4786","iqv4kWreyP","n8pJ9FxX9q","9eoRcn1pmO","1v5hHAIYUu","gf8rIzY1GY",
+"RACujiqv4k","JXljWEoToP","BpYhVaL6AJ","HzZT8x3LDe","cQOnvi7WMQ","xXTI4CxVEf","zbIYYjS1aj","pAhR1rhl0J","ZhwG1yluBx","Cfgr3bgJAz",
+"ogLgclkMUA","Kr8ysvOqCE","dhSuHMmsIo","lj07Qpv0i7","t98iW4dEz6","Zv7z0jfREu","MezSW2DREs","IRh48h1zcH","FNYIMbgJAz","4dEz6CK5W7",
+"P6bcgYf2Ec","07n1caez9y","9XyT9fqypy","8xEKzKASQ8","CK5W7s4786","x3LDeOz8yZ","BCxeC3otm6","cmXIXJRJQB","dhSuHCqqaD","pv0i7wiHrZ",
+"VerEAY1mC0","QnJ1SxXTI4","Y1mC0RzaZA","iB08lMezSW","Ul4a1VLTy6","RpBQm48cHL","VNCPd7fsYM","2Yz7EXyPZN","LbRTHdhSuH","b29RJM3zXL",
+"djsrvBCxeC","zHF1qFjHXR","7lUXZsoy9t","StlDJFjHXR","BCxeC0PktI","P6bcgRzaZA","CxVEfDcpWB","HfyNQQYxC0","euZA5Fhtgl","No0QbVjCZq",
+"pmeCd8TxD7","JKWYRLbRTH","b29RJuoStw","Dz1R3uTacx","yToGWUvlv4","AmdQdokgRi","Gv3FqXflUq","RsQUquTacx","7Ow5C8FmFH","MmKGJMezSW",
+"Cp3mZiB08l","kZANm45cIH","Gv3FqPYBf4","S2DfuJIqXi","iqv4kM6qcG","DQimp0ao3l","lsQGoTXQ0Z","EoToPS2Dfu","9GXkXMkgy8","OxWIH0Kyfs",
+"ulk419eoRc","7fKYUYf2Ec","QssNCwiHrZ","FhtglAOgEe","3otm65VZjS","BCxeCEoToP","ksJbyNhXdu","piJSkYh1hF","VLTy6zz4ZU","LbRTHDz1R3",
+"okgRilViBv","vkCHH5Namm","RBhp0WreyP","gf8rICfgr3","v8yFNMm8si","9y4lw14FLR","lkMUAzmLYD","4dEz6HP433","nlaByzqH0W","8cVD3SWfou",
+"hE1Ql2hEEU","k85Ae0YAGH","y94nwzQt6Q","v1HlnlsQGo","7X3uyFPfSE","gf8rI2hEEU","pv0i79rlg9","okgRi2hEEU","pv0i7IjTwP","wiHrZfqypy",
+"fFDrJ29QAz","kB5nP6q6L9","lweGyMkgy8","cL0aEQWxoT","VBjhzsx5Gl","AOgEesqVrf","9XyT9RkQke","U3yw5EOE1o","ZJTXH5nmWv","lweGysuY4x",
+"RpBQmFFDui","wiHrZQYxC0","In3NSTCgPp","9GXkX618Di","DQimpiqv4k","rKDLJ29QAz","FjHXRiqv4k","JkzUnO3iyQ","07n1cWDVWJ","8FmFHs4786",
+"QssNCsoy9t","14FLRFGzgp","FFDui580YD","IKxdLUl4a1","0PktIOUqFM","uPX7GK4GS8","K20wKbrhlQ","x3LDegjUTu","XflUqMK07Y","fcwDab29RJ",
+"U3yw50ao3l","soy9tkB5nP","CIShGJ2mQi","DG4sT8RCUA","bZLvS0ao3l","PYBf4FFDui","0KyfsSs0Zu","MmsIo1LB1L","5IhmG9rlg9","Fhtglh1zcH",
+"Kr8ysuJScX","t59lRMojnP","v1HlnazIWp","VerEAulk41","618DiMojnP","Zv7z0qUJMd","pT8wupvgjS","azIWpgIYvE","I7p2aSjskQ","KZamHiB08l",
+"DcpWB9GXkX","WaWsvGWqqX","brhlQ7fKYU","M6qcGzHF1q","Gv3FqB3qem","55rfBTa8f6","G1RhSd7vjM","GXdoH3otm6","BpYhV8hJdt","okgRiBCxeC",
+"7ku1pazIWp","gdQsSv1Hln","SjskQlkMUA","QbxXcs7Mxk","VBjhzIKxdL","ciuWzix74r","HzZT8sx5Gl","sx5GlyEfy9","nFqikk85Ae","GSQwjzqH0W",
+"GrDg7zmLYD","rz7UtWaim6","Yh1hFyvOMI","MezSWkB5nP","hSSvQtaOXK","JJs5mQbxXc","FLsphgtCA5","XyPZNECMvU","LbRTHjzUqR","2Yz7EzY1GY",
+"zmLYDX6Pin","uJScXfqypy","uN6r3XyPZN","uZPqgokgRi","48cHLsx5Gl","Yh1hFzHF1q","Vprf26q6L9","zbIYYxXTI4","BbwgAIRh48","fcwDaatef2",
+"s93MltjQxs","VLTy6QnJ1S","dhSuHcShY2","JRJQBYf2Ec","M6qcGJkzUn","gdQsSfqypy","GSQwjQChxs","Ss0ZunnP8o","pv0i7lCMxy","7X3uyMezSW",
+"BpYhVGSQwj","vkCHHJIqXi","YjB9tfcJOy","JXljW55rfB","v1Hlnuvf7A","o8UydRzaZA","gtCA52TRI7","SWfoucL0aE","QnJ1SHlUbF","MmKGJk85Ae",
+"v2eC3XflUq","CdyBVVerEA","5IhmGZv7z0","GWqqX64s8N","U3yw5n1pmO","QChxsPb1pa","Oz8yZogLgc","No0QblXFOB","ZhwG1ulk41","Mm8si9iGoT",
+"jS1ajjzUqR","MojnPIKxdL","mz8gxpvgjS","SWfoum4bxU","RBhp0LDk6f","JXljWl83Ud","IKxdL16lHc","n8pJ9IRh48","EdBKc8TxD7","AgJHQ1v5hH",
+"7Ow5ClkMUA","ECMvUv2eC3","U3yw5VLTy6","9eoRcfFDrJ","QnJ1Sd7vjM","Gv3FqTCgPp","7fsYMFNYIM","WMiS3ciuWz","0ao3lAIYUu","7ku1pjS1aj",
+"uLtKsblLA9","s93MlFhtgl","F6PT20MR5X","hi5X77Ow5C","GXdoHtuDyS","e6e4zdpe1v","5IhmGni2v1","ulk41uN6r3","Mm8siEoToP","1LB1L618Di",
+"MK07YpT8wu","EOE1oiwzGk","yToGW2ZHdk","KZamHnnP8o","Mm8siguMb8","BFkb8FjHXR","SWfouBbwgA","jfREuBGaQY","y94nwYOfrY","vOqCEuLtKs",
+"3otm6Mm8si","OUqFMpFrrl","Waim6lsQGo","Z4I1vCNHmv","rKDLJWPmlx","WaWsvrhl0J","jzUqRpv0i7","U3yw5MGlTF","DQimpMmKGJ","jSjS30Kyfs",
+"kZANmfcJOy","hi5X7F6PT2","pv0i7IKxdL","CNHmvS77LH","lm0pDAgJHQ","rz7UtdmoS7","n1pmOfLNg8","xReecFnPFB","5drc6CK5W7","AIYUuNhXdu",
+"v2eC3v1Hln","BCxeCFnPFB","IRh48Uvlv4","xXTI4zY1GY","pFrrlStlDJ","WPmlxUvlv4","FcWrWQworu","hi5X71v5hH","dpe1vuvf7A","W7cTsVerEA",
+"OHaBzdQ586","hUTw7nlaBy","ECMvUMGlTF","Yw2oUlViBv","ogLgctuDyS","oGu6xv1Hln","SbRYylm0pD","dQ586Rxrsm","5Mg9rfaHir","Waim6lpF6W",
+"tvdkDVerEA","IjTwP45cIH","QssNCYf2Ec","dQ586blLA9","cQOnv0YAGH","OUYuFAgJHQ","QbxXcx3LDe","Ta8f68TxD7","n1pmOaFFss","cShY2AXpwE",
+"3weIFl83Ud","uTacxYOfrY","QClRLs7Mxk","KsjRKuZPqg","45cIHpWiOs","FcWrWRACuj","piJSkMojnP","F6PT2jSjS3","IBe8kfqypy","L7cGcaDGtS",
+"o8UydZUnqt","RkQkelH1kt","8xEKzrKDLJ","J2mQi7lUXZ","DLhzMydG8U","zz4ZUyvOMI","0Kyfs618Di","Y1mC0HzZT8","zbIYYAIYUu","ThjNnMezSW",
+"5nmWvQClRL","zHF1q1v5hH","l83UdB3qem","tlILtt59lR","lXFOB45cIH","Waim6No0Qb","EdBKcFGzgp","jeskSm4bxU","1j5L8zqH0W","k85AeS2Dfu",
+"hE1QlD6rBy","5IhmGFhtgl","0MR5XVIlwP","uQIcz2TRI7","618DipmeCd","KZamHCqqaD","SmGzvqQxHP","9y4lwTa8f6","ZJTXHFLsph","9XyT9uQIcz",
+"O3iyQ55rfB","EoToPtlILt","VjCZqCqqaD","ru4UGAIYUu","YOfrY5Drn0","JKWYRhSSvQ","aez9yYf2Ec","x3LDeuAWyp","uvf7ARpBQm","yvOMIECMvU",
+"fmIK1zHF1q","Zv7z0s93Ml","Vprf2ZuDtD","9eoRcjSjS3","8RCUA9eoRc","3otm6HRxd8","UlU3MCxVEf","EdBKcprNT6","Waim6Rxrsm","ZzJHW9iGoT",
+"t98iWlH1kt","ciuWzm4bxU","l83UdCqqaD","gIYvEyvOMI","L7cGcVBjhz","L7cGcZJTXH","FNYIMlXFOB","07n1cjSjS3","YjB9tVNCPd","5drc6EOE1o",
+"he9IAazIWp","VerEAtjQxs","9XyT9hE1Ql","IBe8ks4786","uQIcz580YD","qaofNDcpWB","NcICADQimp","blLA9cShY2","Kr8ysWMiS3","0BmCyiKqhr",
+"dmoS7qaofN","14FLR2DREs","gtCA5TCgPp","jzUqRuLtKs","aL6AJhYBCK","n8pJ9PYBf4","WaWsvCqqaD","GXdoHRzaZA","fLNg8VBjhz","n8pJ9Nxx9V",
+"2TRI7FcWrW","POUYSvOqCE","uQIczlsQGo","Chuy3Yh1hF","iwzGkFjHXR","wiHrZ5Drn0","iB08lHzZT8","CK5W7J2mQi","JXljWPOUYS","B3qemChuy3",
+"tvdkDVprf2","gtCA5AXpwE","Ss0ZuFcWrW","iqv4kMmsIo","DQimpVerEA","oVQp69eoRc","Q6LixNAFuw","M6qcGfaHir","Dz1R3fcJOy","aFFssWDVWJ",
+"1v5hHtlILt","xciqp8FmFH","zY1GYI7p2a","RsQUqFNYIM","gf8rI5iGN5","U3yw51v5hH","hUTw7uZPqg","MK07YEoToP","dmoS7uPX7G","taOXKn1pmO",
+"yToGWNo0Qb","EdBKcm4bxU","DcpWB29QAz","AIYUuCK5W7","HRxd83otm6","lj07QyluBx","fcwDazQt6Q","QYxC02Nslm","MmKGJ580YD","WreyP580YD",
+"dQ586Nxx9V","9eoRcdmoS7","yvOMIy94nw","lCMxyYf2Ec","Uvlv4CNHmv","ZJTXHVerEA","G1RhS7lUXZ","64s8NfcJOy","0h1b15IhmG","OHaBzsoy9t",
+"oGu6x8RCUA","2TRI7Mm8si","tAOsrvLsmS","VNCPd2Yz7E","RxrsmazIWp","YOfrYEOE1o","QClRLIn3NS","pmeCd0Kyfs","n8pJ9GrDg7","v2eC3hYBCK",
+"ksJbyYjB9t","FGzgpDG4sT","JXljWhE1Ql","faHirfaHir","I7p2a0MR5X","XflUqO3iyQ","4QMc9VBjhz","dpe1vlkMUA","dpe1vVerEA","8U2nUGv3Fq",
+"3weIFEdBKc","580YDU3yw5","ydG8URBhp0","zz4ZU5nmWv","ru4UGU3yw5","zmLYD5nmWv","qUJMdzz4ZU","LDk6fM3zXL","dmoS7djsrv","jtn0XFxX9q",
+"WDVWJxciqp","HfyNQJXljW","RsQUqQ6Lix","ksJbypWiOs","VerEAKr8ys","UlU3MbgJAz","4dEz6EOE1o","FxX9qVerEA","sqVrfaDGtS","fqypyMmKGJ",
+"0KyfsG1RhS","8FmFHyluBx","t98iWfFDrJ","580YDvOqCE","xReecdmoS7","ru4UGuQIcz","qQxHP2hEEU","GXdoH2Yz7E","faHirY1mC0","MmsIodhSuH",
+"FVMxojzUqR","MmKGJYh1hF","RxrsmCIShG","QWxoTzbIYY","yvOMIaDGtS","FVMxo16lHc","m4bxUhYBCK","PYBf4LewvM","0KyfshUTw7","Yw2oUvLsmS",
+"Z4I1vHlUbF","Yw2oUnFqik","Ta8f6yofH3","RACujiB08l","BFkb8HRxd8","9eoRcru4UG","lViBvlsQGo","MmsIoatef2","07n1c2Nslm","FVMxoZhwG1",
+"ksJby55rfB","mX2GEciuWz","oGu6xQssNC","RsQUqHzZT8","xciqpUl4a1","pAhR1Qworu","LDk6fRmDcr","cShY27ku1p","l83UdNhXdu","EOE1oIn3NS",
+"QbxXclViBv","Yw2oU9iGoT","xXTI4s93Ml","0PktIlViBv","Yh1hFMm8si","NhXduzQt6Q","DG4sTblLA9","DQimpxReec","BCxeCv1Hln","P6bcgWmadA",
+"In3NSuPX7G","7Ow5C0YAGH","7ku1p4QMc9","cL0aEVprf2","gjUTublLA9","prNT6HzZT8","gtCA5bZLvS","sx5GlMm8si","i3pyduoStw","ru4UGRACuj",
+"7ku1pVjCZq","QbxXczFgtB","BbwgANAFuw","v2eC3VLTy6","prNT6pWiOs","MK07YO3iyQ","9y4lwIKxdL","VNCPdd7vjM","JRJQBnlaBy","ReKEWyToGW",
+"jeskSQYxC0","F6PT2okgRi","dpe1vdQ586","l83Ud0Wr5y","v2eC3QbxXc","aL6AJcL0aE","AOgEeXflUq","tAOsrtaOXK","DcpWBCdyBV","5drc6S2Dfu",
+"yofH3PYBf4","euZA58U2nU","pvgjSjfREu","brhlQd7vjM","a00b5F6PT2","RxrsmAmdQd","0MR5Xe6e4z","jS1ajzz4ZU","lm0pDlViBv","rz7Ut45cIH",
+"NAFuwn1pmO","xXTI4gf8rI","29QAzHP433","NOHszgjUTu","JKWYRDG4sT","uLtKsTXQ0Z","dmoS7VjCZq","PYBf4GSQwj","4QMc9lViBv","5IhmGaL6AJ",
+"Kr8ys2ZHdk","nnP8oWaim6","lm0pDgf8rI","iwzGkSjskQ","B3qemMmKGJ","CxVEfAXpwE","JXljWuZPqg","EdBKcMm8si","QssNCCK5W7","lH1ktS2Dfu",
+"9XyT9FGzgp","aL6AJNxx9V","MojnPIBe8k","HRxd8Yh1hF","LewvMP6bcg","he9IAcL0aE","9XyT9ZuDtD","C2IrcCIShG","5Drn0RpBQm","jiVBPzqH0W",
+"C2IrcMm8si","WaWsvRzaZA","hUTw7BpYhV","pv0i7bgJAz","VBjhzMkgy8","J2mQiazIWp","G1RhSFxX9q","M6qcGOxWIH","zbIYYXflUq","GXdoHAXpwE",
+"zQt6Qmz8gx","4QMc9yvOMI","JIqXiHRxd8","DG4sTHzZT8","CxVEfFNYIM","DG4sTJKWYR","TCgPpZzJHW","Mm8siYjB9t","kZANmS77LH","LbRTH55rfB",
+"No0Qb24ARF","0ao3l0PktI","bgJAzZ4I1v","0KyfsSjskQ","5IhmGyvOMI","VLTy65VZjS","UmaEv5Mg9r","Ul4a1Z4I1v","OHaBzhi5X7","JJs5myofH3",
+"okgRicQOnv","VjCZqLbRTH","2Nslmrhl0J","WmadAzFgtB","4W0Tlhi5X7","l83Ud07n1c","zmLYDTwano","4QMc98xEKz","GrDg7s7Mxk","wiHrZZUnqt",
+"gtCA5lm0pD","sqVrfK4GS8","Zv7z09rlg9","XflUqrhl0J","Nxx9VfcJOy","7ku1pVerEA","fLNg8lpF6W","pFrrlXflUq","aez9yUmaEv","LewvMVBjhz",
+"oQ87rC2Irc","StlDJJJs5m","bZLvSDcpWB","qaofNThjNn","16lHcvkCHH","xReecpAhR1","ru4UGI7p2a","9eoRcnlaBy","IRh489XyT9","6AFT0RpBQm",
+"ZJTXHNhXdu","Mm8siFGzgp","7X3uyuPX7G","iwzGknlaBy","14FLRZUnqt","bgJAzS2Dfu","5iGN5djsrv","ZuDtDpWiOs","uJScXfaHir","WPmlxOxWIH",
+"FjHXRVjCZq","BpYhVU3yw5","AIYUulViBv","tuDySECMvU","uAWypjiVBP","zQt6QVprf2","YOfrYCxVEf","Kr8ys7Ow5C","In3NSThjNn","8RCUAv1Hln",
+"3otm6IRh48","dhSuHzFgtB","P6bcgUmaEv","taOXKCxVEf","GWqqXI7p2a","yluBxwiHrZ","MaJQsHzZT8","xReectjQxs","oGu6x9rlg9","5iGN5Rxrsm",
+"9GXkX16lHc","QworudhSuH","AXpwE6q6L9","gIYvEuTacx","29QAzXyPZN","JRJQBNo0Qb","I7p2auN6r3","cmXIXxciqp","SWfou7fsYM","dQ5867hyVv",
+"nlaByOz8yZ","9eoRclkMUA","s4786WPmlx","t98iWaez9y","zqH0W3weIF","rhl0JCfgr3","EoToPydG8U","Chuy3lweGy","0YAGHdQ586","RxrsmhUTw7",
+"lkMUADG4sT","9XyT9uoStw","NcICANxx9V","o8Uyd4dEz6","WMiS3vLsmS","taOXKBbwgA","Nxx9ViwzGk","hYBCK8RCUA","rhl0JFxX9q","OxWIHHzZT8",
+"ulk41mz8gx","jfREuK20wK","9iGoTVjCZq","UmaEvdpe1v","ReKEWkZANm","iKqhrJ2mQi","gf8rIZv7z0","iwzGks4786","RACujwiHrZ","uvf7A8FmFH",
+"ydG8UtuDyS","0MR5XuLtKs","hSSvQm4bxU","OUYuFyofH3","EOE1oIKxdL","WaWsvogLgc","pWiOsM3zXL","rhl0JtaOXK","lpF6WdhSuH","GXdoHlCMxy",
+"jSjS3GSQwj","TCgPpe6e4z","EOE1odQ586","7fsYM7hyVv","gjUTuNhXdu","wDajXbgJAz","618DiCfgr3","i7WMQo8Uyd","HzZT8BCxeC","BCxeC7fsYM",
+"QworuiKqhr","M6qcGuupzk","Q6hMC5nmWv","8TxD7ZUnqt","DQimphYBCK","a00b5blLA9","24ARFvkCHH","SmGzvnlaBy","Q6hMClpF6W","Cp3mZprNT6",
+"s4786pv0i7","uTacxVBjhz","HP433mX2GE","yvOMIYh1hF","wiHrZi7WMQ","XflUq1j5L8","i3pydMezSW","hi5X77lUXZ","CNHmvZv7z0","pmeCdjzUqR",
+"QworuCIShG","bZLvSVprf2","dhSuHG1RhS","UlU3MIKxdL","C2IrczbIYY","Yw2oUjSjS3","AIYUulH1kt","euZA5n8pJ9","O3iyQQYxC0","L7cGcDcpWB",
+"In3NSjiVBP","EdBKculk41","he9IAUlU3M","F6PT2AkKTk","Vprf27lUXZ","Ss0Zulj07Q","IRh48Yw2oU","nFqikP6bcg","QnJ1SRkQke","In3NSZUnqt",
+"0KyfsK4GS8","uQIczoGu6x","pv0i7SjskQ","FVMxoEOE1o","In3NS5Namm","1j5L8kZANm","Y1mC01LB1L","KASQ8IRh48","6q6L9ksJby","l83UdSjskQ",
+"s93MlguMb8","QworuMojnP","cShY2uPX7G","JRJQBoGu6x","fFDrJ5Mg9r","QChxsZv7z0","BpYhVwiHrZ","SmGzvpFrrl","ru4UGoQ87r","RsQUq55rfB",
+"jeskS5Mg9r","RACujVIlwP","Yh1hFcQOnv","DQimpYw2oU","iKqhrazIWp","pFrrl4QMc9","ZhwG1dpe1v","kZANmJkzUn","zHF1q8TxD7","rhl0JFnPFB",
+"StlDJ7lUXZ","blLA9n8pJ9","yToGWuupzk","S77LHECMvU","lsQGoaDGtS","Yw2oU0Kyfs","zqH0WzmLYD","AXpwEtlILt","qaofNfLNg8","dmoS7Cfgr3",
+"G1RhSFnPFB","ThjNn0Kyfs","a00b50YAGH","jzUqRs93Ml","iB08lm4bxU","AXpwE7fKYU","MojnP45cIH","djsrvfaHir","1LB1L4dEz6","aFFssfLNg8",
+"29QAz7hyVv","bgJAzZv7z0","SbRYyrz7Ut","M3zXL07n1c","LbRTH2ZHdk","QssNCdQ586","oVQp6NAFuw","CqqaDChuy3","n1pmOC2Irc","s4786fqypy",
+"wDajXhYBCK","8FmFHTCgPp","zbIYYBFkb8","ulk41Kr8ys","Nxx9V55rfB","580YDsx5Gl","G1RhS8FmFH","0KyfsFNYIM","9eoRcbgJAz","zbIYYRzaZA",
+"Dz1R31j5L8","Yf2EcBbwgA","qUJMd7fKYU","faHir0h1b1","AIYUuVLTy6","Ss0Zu8hJdt","Yf2EcWreyP","fLNg80BmCy","LbRTHzmLYD","OUqFMKsjRK",
+"ksJbyBCxeC","s7Mxk29QAz","UlU3M7fKYU","G1RhS7ku1p","tvdkDQ6hMC","GWqqXCIShG","AOgEeRzaZA","C2IrcOz8yZ","4dEz6HlUbF","BCxeCMezSW",
+"vLsmSdpe1v","YjB9t4QMc9","9y4lwyofH3","ulk41jeskS","XflUqWMiS3","pT8wuECMvU","Mkgy8uLtKs","NOHszIn3NS","dQ586GrDg7","wiHrZM3zXL",
+"xciqpEdBKc","RBhp0pvgjS","X6PinPYBf4","0Wr5yGv3Fq","Ul4a1hYBCK","W7cTs0PktI","taOXKMmsIo","Cp3mZlweGy","b29RJNxx9V","NcICAhe9IA",
+"5Mg9rBCxeC","ReKEWIjTwP","Mkgy8iwzGk","IKxdL0MR5X","UmaEvxReec","Chuy3kZANm","Z4I1vGXdoH","YOfrYrKDLJ","NOHszBCxeC","uupzkThjNn",
+"okgRiprNT6","v2eC3blLA9","RACuj8xEKz","ZzJHW9XyT9","24ARFNhXdu","XyPZNPYBf4","Fhtgluvf7A","AXpwEyluBx","qaofNP6bcg","AIYUukZANm",
+"M6qcGO3iyQ","9eoRcB3qem","jfREuVBjhz","SmGzvhUTw7","MezSWix74r","QssNCVerEA","2TRI7tvdkD","24ARFZhwG1","blLA9vkCHH","Yw2oUPb1pa",
+"y94nw5Drn0","bZLvSrz7Ut","OHaBz2TRI7","07n1cDQimp","IRh48Cfgr3","G1RhSJIqXi","KASQ8O3iyQ","KASQ8W7cTs","pmeCdQworu","Nxx9VIn3NS",
+"fLNg87Ow5C","CIShGSjskQ","zY1GYUvlv4","Nxx9Vru4UG","ZuDtDwiHrZ","TCgPpi3pyd","29QAzI7p2a","0Wr5ygtCA5","zQt6QSbRYy","k85AenFqik",
+"cmXIXWPmlx","bZLvSPYBf4","Gv3Fq8cVD3","IjTwPS77LH","9iGoTsuY4x","8RCUAWPmlx","Uvlv4ReKEW","FnPFBWPmlx","GSQwj8FmFH","AmdQdjfREu",
+"b29RJs93Ml","ZzJHWIn3NS","3otm6DQimp","uLtKsNAFuw","lm0pDPb1pa","D6rByulk41","sqVrfCdyBV","POUYSrKDLJ","0h1b1WDVWJ","MaJQs9rlg9",
+"yToGWsuY4x","yofH3fqypy","zqH0Wb29RJ","s4786jSjS3","ciuWzQYxC0","yToGWMezSW","GXdoHvkCHH","pAhR1IRh48","OHaBz5Mg9r","RmDcrxciqp",
+"lm0pDuQIcz","48cHLqUJMd","oQ87rThjNn","MaJQsh1zcH","rz7UtfmIK1","TXQ0Z45cIH","OxWIHWDVWJ","IjTwPZJTXH","RxrsmKsjRK","FjHXR0h1b1",
+"Yf2EcMojnP","Q6LixokgRi","t98iWX6Pin","pT8wuDQimp","MojnPlViBv","7X3uy0BmCy","jzUqRlXFOB","t59lRuAWyp","O3iyQiKqhr","ydG8UWDVWJ",
+"SbRYy7hyVv","lj07QK20wK","5ZaEzGrDg7","lj07QZ4I1v","AmdQdjS1aj","NhXdu0BmCy","Nxx9VWmadA","8U2nUYf2Ec","MezSWS2Dfu","l83Ud9iGoT",
+"xciqpZv7z0","lkMUAt98iW","dQ5868hJdt","AmdQdix74r","rhl0JRkQke","BpYhVGWqqX","S77LHMmKGJ","iqv4kCfgr3","y94nwK4GS8","FnPFBTwano",
+"zz4ZUQbxXc","Ss0ZuJKWYR","4W0Tl8FmFH","0YAGHMezSW","he9IA6q6L9","soy9tNhXdu","FGzgpxXTI4","gdQsSlpF6W","5IhmG0BmCy","G1RhSCp3mZ",
+"tAOsryluBx","zmLYDJKWYR","MmKGJFcWrW","Mm8siCqqaD","J2mQiW7cTs","BpYhV14FLR","tAOsrguMb8","nnP8on8pJ9","NcICAThjNn","oQ87rGWqqX",
+"FGzgpqQxHP","3weIFzHF1q","K4GS8S2Dfu","Gv3Fqmz8gx","lweGyzqH0W","0KyfsStlDJ","8U2nUgf8rI","gtCA5hi5X7","nFqikQWxoT","7fKYU14FLR",
+"yEfy9uoStw","8U2nUPOUYS","pWiOsFxX9q","5drc6FjHXR","djsrvS2Dfu","No0QbFFDui","RmDcrVprf2","lXFOB2Nslm","In3NS580YD","AkKTkAmdQd",
+"WreyPtaOXK","SjskQ0BmCy","Ul4a19GXkX","uvf7A9rlg9","hYBCKlsQGo","hSSvQOxWIH","soy9tJkzUn","HP433XflUq","lH1kt55rfB","ZhwG1JKWYR",
+"5nmWvjtn0X","cL0aEzbIYY","ksJbyUmaEv","dpe1v0h1b1","ZJTXHs7Mxk","NOHszyEfy9","VBjhznnP8o","1v5hH7fsYM","Uvlv48U2nU","G1RhSh1zcH",
+"CK5W72hEEU","blLA9n1pmO","faHirCIShG","JKWYRReKEW","lweGyNcICA","VIlwPQ6hMC","FwEJzs93Ml","J2mQiDcpWB","Dz1R3cL0aE","QYxC05nmWv",
+"oQ87rbZLvS","FcWrWkB5nP","8FmFHuupzk","GSQwjlm0pD","OHaBzl83Ud","CxVEfP6bcg","NhXdudhSuH","ogLgcjiVBP","ciuWz16lHc","Chuy3ZJTXH",
+"aez9yTwano","uvf7A7Ow5C","UlU3MfcJOy","O3iyQfmIK1","n8pJ93weIF","DQimpChuy3","gjUTuzFgtB","iKqhrTCgPp","i3pydAkKTk","In3NS7hyVv",
+"kB5nPfFDrJ","MezSWOHaBz","uN6r3qUJMd","AXpwEVNCPd","jiVBPfFDrJ","s47863weIF","xciqp9y4lw","MGlTFjSjS3","EoToPpiJSk","mz8gxjzUqR",
+"cQOnvIKxdL","K20wKQClRL","0MR5XEdBKc","zmLYD7lUXZ","D6rByxXTI4","7X3uyP6bcg","lH1ktwiHrZ","FwEJzqUJMd","Vprf2prNT6","JXljWJKWYR",
+"ReKEW7ku1p","atef214FLR","Y1mC0QnJ1S","Yh1hFy94nw","618DiGrDg7","9eoRcs7Mxk","7lUXZ64s8N","PYBf4L7cGc","Z4I1vOz8yZ","YOfrYsuY4x",
+"uN6r3U3yw5","6q6L9tl72W","ECMvUtvdkD","SjskQtvdkD","lViBvCp3mZ","FwEJztjQxs","8xEKzlkMUA","JRJQBuZPqg","5VZjSiB08l","9XyT9RACuj",
+"azIWpPb1pa","NcICAdjsrv","9XyT9FxX9q","DLhzMG1RhS","jzUqRZuDtD","BCxeCiqv4k","nlaBy5Drn0","RmDcrhe9IA","GSQwjjS1aj","tuDySWDVWJ",
+"suY4xFjHXR","DQimp6AFT0","oQ87rix74r","v1Hlnhe9IA","Ul4a1NcICA","29QAzWDVWJ","In3NSaL6AJ","ZzJHWrKDLJ","qUJMd5IhmG","8xEKzDz1R3",
+"lViBvuupzk","M3zXLkZANm","S2DfuIBe8k","64s8NXflUq","8FmFHzY1GY","djsrvfLNg8","No0QbjSjS3","Oz8yZYjB9t","he9IA29QAz","GWqqXZhwG1",
+"0MR5XHlUbF","ix74rTXQ0Z","rz7UtgIYvE","BpYhVCp3mZ","pv0i7yofH3","P6bcgLewvM","ulk41zz4ZU","ru4UG29QAz","0YAGHJRJQB","0PktIIRh48",
+"IKxdL45cIH","ciuWzM6qcG","5VZjSa00b5","0Wr5ykZANm","jzUqRuupzk","HRxd8MGlTF","iwzGkuQIcz","uZPqgFcWrW","NcICA6AFT0","CqqaDcQOnv",
+"MGlTFNo0Qb","vOqCEmX2GE","uJScXOHaBz","CIShGtaOXK","iKqhr1LB1L","uQIcznFqik","jeskSuupzk","DQimpVNCPd","7fKYUulk41","t59lRRpBQm",
+"UmaEvUvlv4","8hJdtJJs5m","yEfy9nFqik","7X3uyWPmlx","0KyfsciuWz","pmeCd2hEEU","jeskSQnJ1S","yofH3zQt6Q","zqH0WFcWrW","pT8wuuN6r3",
+"WMiS329QAz","IRh48pvgjS","hSSvQCqqaD","uN6r3VLTy6","07n1cwiHrZ","5nmWvVLTy6","b29RJ5drc6","LewvMVprf2","mX2GEIn3NS","ni2v1O3iyQ",
+"RkQkexciqp","DQimp5IhmG","kB5nPuJScX","X6PinMaJQs","zHF1qThjNn","7fsYM14FLR","4dEz6yofH3","VNCPdzqH0W","uLtKsFxX9q","M3zXLyvOMI",
+"QbxXcWreyP","nnP8odjsrv","FNYIMMkgy8","jeskSvLsmS","SjskQXyPZN","K4GS85Mg9r","fqypyo8Uyd","FLsphuPX7G","9eoRcU3yw5","uN6r3HlUbF",
+"24ARFFnPFB","tl72W45cIH","0Wr5yXyPZN","n8pJ9i3pyd","Waim6iB08l","0h1b1RkQke","WPmlxAXpwE","lkMUA2DREs","XflUqCfgr3","VIlwPzz4ZU",
+"BFkb8kB5nP","gdQsSS77LH","ZuDtDaFFss","yEfy9F6PT2","Mkgy8KZamH","9XyT9ulk41","W3VFHPOUYS","07n1catef2","iqv4khUTw7","WDVWJn8pJ9",
+"HlUbF3weIF","FFDui5drc6","soy9t7fsYM","WreyPaDGtS","B3qemUlU3M","uvf7AFnPFB","RxrsmgjUTu","DcpWBlweGy","7lUXZlCMxy","WDVWJtlILt",
+"XyPZNCfgr3","FxX9qDcpWB","b29RJqUJMd","M3zXLuupzk","t98iW2hEEU","lj07QUvlv4","Ta8f6580YD","ZzJHWLewvM","48cHLlweGy","FPfSEJRJQB",
+"cL0aEaez9y","pAhR1CK5W7","TXQ0ZprNT6","8RCUAJJs5m","RBhp0x3LDe","BbwgADLhzM","VerEAjSjS3","suY4xpiJSk","EoToPulk41","jeskS1v5hH",
+"AIYUux3LDe","LDk6fBbwgA","RACuj1LB1L","s4786djsrv","8U2nUcmXIX","0h1b1M3zXL","2ZHdkix74r","MojnPdhSuH","Y1mC0s93Ml","soy9tyofH3",
+"OUYuFjSjS3","8cVD3zbIYY","djsrv5Namm","uJScX7fsYM","NOHszprNT6","RzaZAMmsIo","AXpwEvkCHH","WmadA4W0Tl","QnJ1SnFqik","IRh48Mm8si",
+"rz7Utjtn0X","uTacxNo0Qb","JkzUn618Di","UmaEvJXljW","t59lRtaOXK","o8UyddmoS7","brhlQ5Drn0","5iGN5LbRTH","fcJOy9eoRc","ZhwG1v1Hln",
+"QssNCWDVWJ","cQOnvYjB9t","euZA57X3uy","taOXKs7Mxk","7fsYMYf2Ec","iKqhrvkCHH","RzaZA5drc6","ni2v1FxX9q","AOgEeFPfSE","s93MlOz8yZ",
+"M6qcGRxrsm","F6PT20PktI","wDajXChuy3","Dz1R3I7p2a","5Mg9rk85Ae","wiHrZWMiS3","MmsIo9y4lw","CdyBV6q6L9","BpYhVM3zXL","AXpwE9y4lw",
+"16lHcvLsmS","Waim6tuDyS","Nxx9VgdQsS","lj07QjfREu","l83UdkZANm","1j5L8dhSuH","RxrsmVerEA","IBe8k9iGoT","QnJ1SQssNC","FcWrW5nmWv",
+"YjB9tOUqFM","FwEJzZUnqt","a00b5pT8wu","zY1GYuZPqg","O3iyQF6PT2","9iGoTblLA9","JkzUnL7cGc","ydG8UfmIK1","P6bcgNOHsz","SbRYyIBe8k",
+"lsQGoVjCZq","FNYIMRsQUq","5ZaEz8RCUA","he9IAHP433","pv0i7y94nw","JIqXix3LDe","0h1b1JIqXi","VerEAkZANm","gf8rIprNT6","RACujQWxoT",
+"MojnPfFDrJ","taOXKFxX9q","xXTI4JKWYR","taOXK9iGoT","RACujD6rBy","4dEz6dmoS7","FVMxolH1kt","wiHrZBGaQY","LbRTHUvlv4","WMiS3580YD",
+"M3zXLW3VFH","v1HlnAIYUu","7lUXZCqqaD","ThjNnW7cTs","xciqp0Wr5y","jeskS9rlg9","tvdkDUl4a1","uvf7A1j5L8","euZA5Waim6","uTacxa00b5",
+"MaJQsFjHXR","CdyBVY1mC0","8xEKzQbxXc","1v5hHNOHsz","24ARFdjsrv","n8pJ9SjskQ","cQOnv5VZjS","EOE1oguMb8","AOgEeJXljW","QbxXchE1Ql",
+"jeskSpFrrl","uvf7Al83Ud","Nxx9V3weIF","cQOnvM6qcG","uPX7G7fKYU","SmGzvQnJ1S","AkKTkcL0aE","5NammKsjRK","7Ow5CVLTy6","uTacxEoToP",
+"rz7UtWDVWJ","uJScXdmoS7","VIlwPru4UG","NhXdutvdkD","K20wKZ4I1v","8U2nUvkCHH","zbIYYK4GS8","W7cTsJJs5m","BFkb8iKqhr","WMiS33otm6",
+"JkzUnbZLvS","1v5hH5Drn0","ReKEW8hJdt","zz4ZUjiVBP","C2IrcDQimp","t59lRmz8gx","9eoRcrKDLJ","lweGy8TxD7","fcJOy7X3uy","suY4xC2Irc",
+"yluBxxXTI4","JkzUnFGzgp","fLNg8FFDui","aDGtSlCMxy","Chuy3JJs5m","UlU3MZzJHW","uQIczJkzUn","7lUXZGv3Fq","55rfBEoToP","MojnP5nmWv",
+"guMb8MaJQs","9XyT9ix74r","aDGtSMmsIo","pT8wuLewvM","JKWYRCxVEf","v1HlnhYBCK","FcWrWZv7z0","ni2v1Rxrsm","FVMxoI7p2a","DQimpd7vjM",
+"euZA5iwzGk","rhl0JUvlv4","AOgEeXyPZN","guMb8jSjS3","RmDcrQnJ1S","580YDTCgPp","0MR5Xd85a9","aL6AJ6q6L9","s4786yEfy9","ZzJHWnnP8o",
+"LbRTHiB08l","v2eC3uvf7A","yToGWFcWrW","IKxdLgtCA5","v2eC3pFrrl","cQOnvSmGzv","gtCA5MojnP","Z4I1vpiJSk","07n1chSSvQ","YjB9tdpe1v",
+"iwzGkMaJQs","uZPqgd85a9","s93Ml9eoRc","QChxsNo0Qb","X6Pin8hJdt","kB5nPRsQUq","YOfrY9iGoT","580YDwiHrZ","bgJAzChuy3","soy9tvLsmS",
+"CdyBVfmIK1","ReKEWDcpWB","sx5GlY1mC0","ZuDtDqaofN","0PktIbZLvS","1j5L8guMb8","lweGyFGzgp","FLsph3weIF","NhXduSjskQ","RxrsmF6PT2",
+"AXpwEVLTy6","Yh1hF1LB1L","HlUbFOxWIH","qUJMdzqH0W","SjskQGXdoH","fqypyfcwDa","GrDg7pmeCd","Yh1hF9GXkX","XflUqzY1GY","n8pJ95IhmG",
+"brhlQF6PT2","QWxoTVerEA","lViBvIKxdL","tl72WXyPZN","FnPFBGWqqX","OUqFMZzJHW","lweGyNOHsz","1j5L8EOE1o","prNT6uLtKs","24ARFYf2Ec",
+"9eoRcb29RJ","1LB1LNxx9V","fmIK1sx5Gl","OxWIHNo0Qb","NhXduF6PT2","YOfrYaez9y","580YDy94nw","aez9yaL6AJ","D6rBy8xEKz","3otm6jS1aj",
+"6q6L9AgJHQ","iB08lFjHXR","LewvMbrhlQ","XyPZN6AFT0","lCMxy1LB1L","9y4lw7fsYM","2TRI7HRxd8","HlUbF618Di","TCgPpulk41","aDGtSAgJHQ",
+"aDGtSHfyNQ","W3VFHKASQ8","1v5hHt98iW","Y1mC03weIF","4QMc9TCgPp","Cfgr3fcwDa","vkCHH5Drn0","IjTwPAXpwE","Twano4QMc9","BbwgAiwzGk",
+"dpe1vfqypy","uJScXuZPqg","2hEEU9iGoT","L7cGctAOsr","Ul4a1zHF1q","WaWsvM6qcG","cQOnvWaWsv","0YAGHKZamH","3otm6Waim6","AIYUud7vjM",
+"Yh1hFwiHrZ","lm0pDyofH3","y94nwuTacx","QnJ1SXflUq","tAOsrNxx9V","Z4I1vWreyP","No0Qb580YD","EOE1oMGlTF","okgRi8U2nU","64s8Nulk41",
+"FwEJz7lUXZ","D6rBy64s8N","XflUqv1Hln","jfREuOUYuF","guMb8aFFss","In3NSzz4ZU","FLsph5Mg9r","zqH0WjzUqR","580YDbrhlQ","8xEKz7X3uy",
+"zbIYYgjUTu","QChxsC2Irc","RBhp0d85a9","Q6LixuZPqg","SbRYyG1RhS","DQimprhl0J","gjUTuCfgr3","a00b5Vprf2","soy9tuTacx","2Yz7E45cIH",
+"MmKGJzz4ZU","tuDySmX2GE","8TxD7AmdQd","aFFssyvOMI","3otm6taOXK","BbwgAVjCZq","o8Uydxciqp","Vprf2uN6r3","WmadAyluBx","WPmlxprNT6",
+"cQOnvQssNC","RBhp0Chuy3","3otm6mz8gx","brhlQjtn0X","0MR5X16lHc","8hJdtU3yw5","U3yw5yToGW","AXpwEHzZT8","S2DfulpF6W","6q6L97lUXZ",
+"HP4337ku1p","5Mg9rStlDJ","qaofN0Wr5y","Dz1R3QChxs","uZPqgQbxXc","8FmFH45cIH","0MR5X5iGN5","Y1mC0SWfou","tuDySW3VFH","AmdQdI7p2a",
+"tlILtDz1R3","1LB1LYf2Ec","2DREs7Ow5C","ECMvUAOgEe","0BmCy8FmFH","JKWYRlH1kt","ogLgcC2Irc","pvgjSCNHmv","uLtKsS2Dfu","y94nwtlILt",
+"RACujP6bcg","oVQp65ZaEz","OxWIH7lUXZ","AmdQdfcJOy","s93MlpFrrl","55rfBJKWYR","Yf2EcvLsmS","CK5W7n8pJ9","0PktIuoStw","cmXIXCK5W7",
+"IBe8kTa8f6","bgJAzmz8gx","dpe1veuZA5","CNHmviwzGk","bZLvSatef2","i3pyd9XyT9","Y1mC0BCxeC","DLhzMQworu","WPmlxNhXdu","RkQkeUmaEv",
+"hSSvQtlILt","S2DfurKDLJ","tuDyS0BmCy","Yf2EcS77LH","CNHmv0Wr5y","kB5nPiwzGk","Kr8ysZzJHW","3weIFuupzk","okgRi5Drn0","OUYuFgjUTu",
+"P6bcg3otm6","MezSWK20wK","POUYSHlUbF","2DREs6q6L9","HP433X6Pin","5drc6v1Hln","JIqXinlaBy","5iGN5tl72W","CqqaDZv7z0","uvf7AciuWz",
+"bgJAzYh1hF","hYBCKlj07Q","euZA5Zv7z0","S2Dfu4dEz6","FxX9quQIcz","gIYvEFjHXR","e6e4zEoToP","ix74rm4bxU","P6bcg5Drn0","3otm6e6e4z",
+"lXFOBEOE1o","8FmFHksJby","WDVWJPOUYS","RsQUq8cVD3","MaJQsazIWp","48cHLVerEA","TXQ0Z5iGN5","ZUnqt8TxD7","aL6AJfcJOy","AkKTkMaJQs",
+"lkMUAaL6AJ","lCMxyY1mC0","B3qemcL0aE","ogLgcOUqFM","9GXkXFNYIM","lweGyhUTw7","uJScXAOgEe","W3VFHvLsmS","gdQsSy94nw","bgJAzG1RhS",
+"QssNClXFOB","Yf2EcjzUqR","Vprf25Namm","soy9t7fKYU","gtCA5In3NS","ZUnqtM6qcG","ZuDtDB3qem","sx5Gl0ao3l","fcwDaaDGtS","lsQGoCfgr3",
+"suY4xWreyP","G1RhS2DREs","NhXdu3otm6","euZA5KsjRK","RzaZAYOfrY","8cVD3m4bxU","hi5X7uupzk","lweGylm0pD","0YAGH1v5hH","gIYvEXflUq",
+"cQOnvPYBf4","ru4UGIjTwP","lm0pDcL0aE","5drc6uLtKs","9eoRcDLhzM","8TxD7rhl0J","1j5L82Nslm","aFFssCxVEf","M3zXLuLtKs","cmXIX7Ow5C",
+"t98iWzbIYY","jtn0XFcWrW","pAhR1XflUq","fmIK1RmDcr","8U2nUulk41","IjTwPbZLvS","7lUXZx3LDe","2ZHdkU3yw5","Ul4a1WaWsv","RsQUqlkMUA",
+"jzUqRXflUq","Ss0Zuni2v1","v2eC3WDVWJ","pvgjSblLA9","RxrsmNo0Qb","uZPqg8RCUA","gjUTubZLvS","DcpWBCp3mZ","ni2v1jtn0X","uTacxnFqik",
+"YOfrYlkMUA","UlU3MEdBKc","CIShGlCMxy","Ss0ZuW7cTs","cShY2OxWIH","bgJAz8cVD3","KASQ8QChxs","Vprf224ARF","Nxx9V29QAz","s4786iKqhr",
+"Z4I1vuQIcz","Nxx9VwiHrZ","pAhR1580YD","JkzUn6q6L9","0Wr5y4dEz6","WreyPhe9IA","W3VFHAmdQd","iKqhr2ZHdk","DLhzMfFDrJ","O3iyQlm0pD",
+"h1zcHgdQsS","ThjNnFVMxo","0BmCyFFDui","FVMxoD6rBy","Ta8f6Twano","faHirBpYhV","X6PinBCxeC","F6PT2EoToP","zbIYYQ6hMC","tl72W5Drn0",
+"zY1GYt98iW","KASQ8FVMxo","uLtKsEdBKc","dmoS7uAWyp","RBhp0mz8gx","mX2GEd85a9","RkQkeZzJHW","FNYIMs93Ml","ZUnqt4dEz6","x3LDezY1GY",
+"jtn0XvkCHH","07n1cStlDJ","pAhR155rfB","POUYSX6Pin","Ul4a1O3iyQ","zmLYDLDk6f","l83UdzHF1q","8U2nUsx5Gl","ix74r5VZjS","pvgjSuN6r3",
+"QChxsCK5W7","S77LHMojnP","zbIYYMGlTF","EOE1oRmDcr","HzZT8IjTwP","RmDcrMK07Y","yofH3ydG8U","taOXKfcwDa","QChxsWMiS3","pmeCdFcWrW",
+"OxWIHuoStw","gdQsSMaJQs","3otm6cL0aE","h1zcHlj07Q","S2DfupiJSk","ZhwG1rhl0J","hUTw7lm0pD","HzZT8FVMxo","C2IrcjSjS3","WmadACK5W7",
+"guMb8NAFuw","StlDJqQxHP","ciuWzgIYvE","NcICAW3VFH","L7cGcwiHrZ","oQ87rfcJOy","FxX9qn1pmO","Yh1hFNOHsz","aez9yi3pyd","VjCZqAmdQd",
+"5drc6iqv4k","vOqCE8hJdt","2DREsjSjS3","CK5W7G1RhS","AXpwEt59lR","yEfy9YjB9t","4dEz6FjHXR","uLtKsdmoS7","b29RJZzJHW","yofH3d7vjM",
+"t98iWUvlv4","tlILt29QAz","h1zcH7lUXZ","s93MlGrDg7","5Mg9raez9y","pvgjSvOqCE","55rfBgdQsS","rKDLJMGlTF","G1RhSpmeCd","NcICA9XyT9",
+"TCgPpwDajX","0h1b1Nxx9V","1v5hHG1RhS","zqH0WDcpWB","DQimpoGu6x","SjskQgtCA5","7hyVvCK5W7","oGu6x0YAGH","cShY2FcWrW","I7p2atjQxs",
+"ReKEWhSSvQ","BGaQYnnP8o","NcICAVLTy6","Ss0Zus4786","tvdkDAIYUu","yToGWUl4a1","HP433BGaQY","lH1ktcShY2","StlDJzFgtB","ogLgcW3VFH",
+"atef2prNT6","4QMc9s7Mxk","45cIH4W0Tl","FnPFB0YAGH","ZUnqtIjTwP","45cIHMezSW","8cVD3WMiS3","MGlTF2Yz7E","faHirMojnP","0MR5XHfyNQ",
+"K20wKPb1pa","oQ87rk85Ae","s47860MR5X","IKxdL5nmWv","FxX9qpv0i7","e6e4ziB08l","gf8rInFqik","vOqCEB3qem","MK07YIBe8k","rhl0JVjCZq",
+"O3iyQaFFss","CdyBVuQIcz","QWxoTdjsrv","YjB9trKDLJ","iqv4knFqik","he9IA4W0Tl","VerEASbRYy","lweGyQ6hMC","lj07QpFrrl","gjUTu3otm6",
+"Pb1pani2v1","ZhwG1KZamH","ZUnqthYBCK","U3yw5uTacx","hi5X7BCxeC","jSjS3AXpwE","v8yFNzz4ZU","tjQxstvdkD","GSQwjHlUbF","pWiOs55rfB",
+"WDVWJulk41","X6PintjQxs","ni2v1MmsIo","zqH0WK20wK","aez9yo8Uyd","lCMxyix74r","XflUqqUJMd","v1HlnIBe8k","oVQp6JXljW","pv0i7fcJOy",
+"s7Mxkl83Ud","zHF1qpWiOs","dhSuHeuZA5","W3VFHYw2oU","uvf7AlH1kt","OUYuFxciqp","fLNg8xciqp","8FmFHY1mC0","jzUqRQnJ1S","BpYhVKZamH",
+"HRxd8v1Hln","zHF1qRsQUq","lViBvxciqp","5ZaEzs4786","mz8gxuQIcz","U3yw5X6Pin","fqypyLbRTH","jzUqR16lHc","rhl0JMK07Y","iKqhroQ87r",
+"S77LHyofH3","ZzJHWW3VFH","RBhp0lXFOB","UlU3MUvlv4","vOqCEnFqik","yvOMIdhSuH","uJScXs4786","7hyVvyvOMI","aez9y2TRI7","16lHck85Ae",
+"sqVrfoVQp6","k85AeUl4a1","dmoS7AmdQd","ksJby1LB1L","XflUq0h1b1","lH1ktNAFuw","y94nwjSjS3","In3NSzmLYD","FLsphQ6Lix","dmoS7CIShG",
+"tlILtfqypy","DQimpyofH3","QbxXcCNHmv","55rfBGXdoH","XflUqlweGy","soy9tokgRi","uPX7GG1RhS","W7cTsbgJAz","fFDrJ6q6L9","mX2GEsqVrf",
+"Gv3Fq24ARF","ReKEWK20wK","dhSuHSs0Zu","8hJdt0MR5X","3otm6ThjNn","fFDrJhi5X7","cL0aEFPfSE","LewvM64s8N","MmsIoQbxXc","jfREu7X3uy",
+"0Wr5yMGlTF","WreyPRxrsm","vLsmS7Ow5C","MmsIoazIWp","Y1mC0D6rBy","tvdkDblLA9","48cHLGXdoH","mz8gxuoStw","FLsphAgJHQ","I7p2amz8gx",
+"64s8NcL0aE","QssNCDG4sT","uZPqgprNT6","MGlTFYw2oU","StlDJKsjRK","rhl0JzmLYD","yvOMIzz4ZU","9eoRcMm8si","WreyPdpe1v","CqqaDYOfrY",
+"W7cTsgf8rI","QChxs7hyVv","dmoS77ku1p","m4bxUFVMxo","KASQ85iGN5","2ZHdkdpe1v","v1HlnCqqaD","VNCPdVjCZq","soy9tOz8yZ","KASQ8XflUq",
+"7hyVvLewvM","NhXdukB5nP","zz4ZUUmaEv","n1pmOuN6r3","AOgEeCxVEf","GXdoHAkKTk","bgJAzi7WMQ","8hJdtRpBQm","MK07Y4QMc9","h1zcHQYxC0",
+"uvf7AUmaEv","yToGWChuy3","QnJ1SdmoS7","WDVWJJKWYR","uoStwl83Ud","lweGyx3LDe","WMiS3Ss0Zu","LewvM5IhmG","7Ow5C7fKYU","e6e4zlm0pD",
+"dmoS71j5L8","vOqCEStlDJ","ECMvUZ4I1v","TCgPp5nmWv","EdBKclkMUA","4QMc9RACuj","0YAGHazIWp","jtn0XyvOMI","SWfourKDLJ","5ZaEztaOXK",
+"ZJTXHlweGy","nnP8o8cVD3","blLA9yToGW","gIYvEAOgEe","oVQp6SbRYy","1j5L829QAz","atef229QAz","14FLRtl72W","xReecECMvU","fmIK1kZANm",
+"gtCA5QbxXc","s93Ml29QAz","8U2nU5nmWv","5nmWvW7cTs","HfyNQTXQ0Z","OxWIHdpe1v","ulk41Zv7z0","2TRI7MojnP","JJs5mZ4I1v","5nmWvdpe1v",
+"5iGN5FFDui","FcWrWazIWp","ydG8Uni2v1","Cfgr3djsrv","K4GS8LewvM","SWfou3weIF","Oz8yZAIYUu","xReecHRxd8","jzUqRdjsrv","jeskSs7Mxk",
+"ZhwG10Kyfs","AgJHQtvdkD","DG4sTpv0i7","xXTI4xXTI4","0YAGHPb1pa","gf8rIECMvU","DG4sTs93Ml","t98iW1j5L8","i3pydMGlTF","taOXKbgJAz",
+"C2Irc5drc6","aL6AJFGzgp","45cIHcL0aE","8xEKzW3VFH","Vprf2d85a9","iwzGkIRh48","bZLvSMK07Y","tjQxsy94nw","RxrsmnFqik","0PktIatef2",
+"S77LHSWfou","Yf2EcVerEA","pmeCdx3LDe","lkMUAjSjS3","JRJQBM6qcG","9XyT9TCgPp","jfREu8FmFH","5Mg9r9XyT9","Oz8yZulk41","hSSvQyEfy9",
+"VerEAnnP8o","AOgEeI7p2a","K4GS8FNYIM","YOfrYKASQ8","AmdQdRzaZA","TXQ0ZLDk6f","Ta8f6uLtKs","Z4I1vQssNC","F6PT2Dz1R3","OxWIHa00b5",
+"yofH3VIlwP","wDajXwiHrZ","ulk41Chuy3","S2DfuRkQke","atef2faHir","Gv3FqMmKGJ","MezSWQChxs","uoStwSmGzv","2DREskZANm","t98iWRBhp0",
+"JJs5meuZA5","K20wKTCgPp","uvf7AF6PT2","pAhR1FwEJz","6AFT07fKYU","9rlg9ECMvU","brhlQuQIcz","CxVEftl72W","Mm8sivLsmS","QWxoTjtn0X",
+"FFDui3otm6","WmadAOUqFM","prNT6S77LH","Cp3mZrhl0J","SbRYyVprf2","NAFuwzbIYY","gtCA5d85a9","pWiOs8RCUA","guMb8zY1GY","5iGN5WMiS3",
+"IKxdLfmIK1","WMiS3BbwgA","lm0pD0ao3l","SbRYyIn3NS","okgRizHF1q","0MR5X5Mg9r","yluBxAOgEe","uQIczIRh48","55rfB7ku1p","lpF6WfcJOy",
+"VerEAprNT6","e6e4zPOUYS","G1RhSvOqCE","FFDuiUlU3M","8FmFHa00b5","k85AeReKEW","RBhp0MmKGJ","9rlg9pWiOs","HfyNQsuY4x","gdQsSD6rBy",
+"W3VFH0h1b1","8RCUABGaQY","lsQGoCp3mZ","aL6AJlweGy","zHF1qxReec","HfyNQP6bcg","azIWpC2Irc","MmsIolCMxy","vLsmSsqVrf","lkMUAVLTy6",
+"tjQxsyToGW","JXljWJ2mQi","O3iyQl83Ud","C2Ircs7Mxk","IBe8kX6Pin","fFDrJJXljW","QbxXcZ4I1v","Q6hMCOz8yZ","RACuj0YAGH","StlDJJRJQB",
+"ydG8US77LH","JRJQBlXFOB","29QAziKqhr","lweGyuQIcz","Cp3mZAkKTk","faHirQWxoT","ZJTXHD6rBy","0Wr5yCdyBV","ZuDtDM3zXL","5IhmGpWiOs",
+"PYBf4ksJby","BCxeCdpe1v","AOgEeZuDtD","24ARFrhl0J","9XyT9l83Ud","yEfy9DcpWB","zFgtBcL0aE","uAWyp1v5hH","5nmWvt98iW","mX2GEpvgjS",
+"HzZT8pFrrl","L7cGcaFFss","ix74rni2v1","aDGtSk85Ae","blLA9NAFuw","LDk6f5IhmG","Yh1hFRxrsm","Q6hMCatef2","5VZjS3otm6","wiHrZjzUqR",
+"ZJTXHulk41","Chuy3jeskS","JJs5mGSQwj","cL0aEZzJHW","iB08l1v5hH","55rfBCp3mZ","XyPZNlm0pD","wiHrZUl4a1","CdyBVpiJSk","ZuDtDEOE1o",
+"8FmFHgdQsS","JKWYRQ6Lix","uvf7AyluBx","07n1cIRh48","BbwgAGSQwj","FhtglWDVWJ","n8pJ9JXljW","5Mg9rgdQsS","IKxdLEoToP","Uvlv4pvgjS",
+"zbIYYAmdQd","29QAzpWiOs","x3LDeSjskQ","DG4sT7ku1p","nnP8obZLvS","2hEEU9y4lw","GSQwj6q6L9","WMiS3nnP8o","yluBxVerEA","JXljWVerEA",
+"lpF6WpT8wu","ZzJHWVNCPd","NhXduaDGtS","Yh1hF8RCUA","I7p2a0BmCy","I7p2aDz1R3","JXljWuLtKs","Pb1pa3otm6","lViBvjS1aj","BGaQYHRxd8",
+"JJs5m55rfB","VerEAZuDtD","580YDBCxeC","No0QbW3VFH","Zv7z0lkMUA","FhtglQworu","tvdkDQClRL","Yh1hFlCMxy","0MR5XtuDyS","5ZaEzBpYhV",
+"4QMc9CK5W7","580YDDLhzM","sqVrf1v5hH","BFkb8dmoS7","RpBQmaL6AJ","CqqaDs93Ml","wDajXs4786","QssNCNxx9V","FGzgpFwEJz","M6qcGCK5W7",
+"1v5hHpAhR1","ulk41HRxd8","tAOsrAXpwE","AXpwEv1Hln","xReec55rfB","hi5X7zQt6Q","e6e4zh1zcH","DcpWBK20wK","Pb1paQ6hMC","soy9tAmdQd",
+"xXTI4azIWp","VIlwPaL6AJ","soy9tKr8ys","brhlQlCMxy","0PktIMezSW","J2mQix3LDe","9iGoTDz1R3","zz4ZUFcWrW","5VZjSzQt6Q","Q6hMCazIWp",
+"v1HlnhSSvQ","BbwgALewvM","0PktItlILt","P6bcg5IhmG","kB5nPjSjS3","KsjRKoVQp6","OHaBz16lHc","lsQGoVIlwP","Cfgr3Z4I1v","YjB9t7lUXZ",
+"hSSvQydG8U","aFFssRACuj","hUTw764s8N","JkzUn0Wr5y","XflUq3weIF","i3pydhUTw7","d85a9k85Ae","gIYvEuLtKs","64s8N7fsYM","dhSuHtl72W",
+"7X3uyDQimp","8U2nUpiJSk","yvOMI5iGN5","IBe8k5VZjS","7ku1p6q6L9","prNT6QClRL","uvf7A14FLR","JRJQB5Drn0","RkQkeW7cTs","580YDLewvM",
+"Gv3Fqdjsrv","W7cTsk85Ae","2TRI7zQt6Q","U3yw5B3qem","7Ow5CHlUbF","lm0pDd85a9","1v5hH0Kyfs","cShY27Ow5C","SWfou5drc6","Kr8ys7hyVv",
+"bgJAzVprf2","ksJbyJIqXi","RsQUqaFFss","RzaZAoGu6x","ydG8UD6rBy","qaofNM6qcG","jzUqRW7cTs","XyPZN55rfB","JIqXikZANm","ZUnqt1v5hH",
+"aFFssb29RJ","iwzGkPb1pa","8cVD3zQt6Q","m4bxU2Yz7E","zY1GYFnPFB","lXFOBlj07Q","kB5nPuN6r3","Q6LixoGu6x","dpe1vFNYIM","VLTy6dhSuH",
+"LbRTH5VZjS","29QAzaFFss","cShY2ECMvU","O3iyQprNT6","lViBvAmdQd","guMb8JXljW","S77LH0MR5X","OUYuFRkQke","KASQ8fqypy","pv0i78cVD3",
+"aFFsseuZA5","0BmCygjUTu","JKWYRQnJ1S","QbxXcuQIcz","uPX7GVNCPd","xXTI4Gv3Fq","cShY2RsQUq","vkCHHcQOnv","ECMvUVIlwP","FxX9q14FLR",
+"jiVBPv1Hln","sx5GlAmdQd","ogLgct59lR","4QMc9618Di","vkCHHBCxeC","o8UydgIYvE","XyPZNxciqp","m4bxUOUYuF","uJScXfmIK1","zqH0Wd85a9",
+"X6PinpvgjS","xXTI4lCMxy","l83UdVNCPd","HRxd8Mkgy8","YOfrY5VZjS","jfREujtn0X","y94nwVerEA","ZhwG1Oz8yZ","zY1GYHzZT8","Waim60Wr5y",
+"uN6r3JJs5m","ogLgcRpBQm","5nmWvfcwDa","OUYuF07n1c","lViBvDcpWB","FhtglyluBx","OHaBzydG8U","YOfrY8cVD3","Y1mC0HfyNQ","FVMxod85a9",
+"iKqhrzFgtB","8xEKz0h1b1","jeskSRxrsm","rhl0J64s8N","Cp3mZJXljW","EdBKcNhXdu","blLA99XyT9","IjTwPwDajX","7ku1pdQ586","vOqCEFNYIM",
+"NAFuwUl4a1","AIYUuGSQwj","MmKGJHzZT8","uQIczeuZA5","Kr8ysfFDrJ","s7MxkMmsIo","TwanoCdyBV","uAWypK20wK","AIYUuyofH3","jiVBPuAWyp",
+"CIShGiB08l","zHF1qMezSW","K4GS864s8N","IjTwPQworu","1v5hHFxX9q","FcWrWVprf2","GWqqXtjQxs","zbIYYDLhzM","wiHrZHfyNQ","4QMc9In3NS",
+"ogLgcfmIK1","U3yw5Mm8si","0MR5X5IhmG","JXljW9XyT9","CK5W77fsYM","qUJMdPYBf4","NcICAZv7z0","9iGoT8xEKz","BCxeCe6e4z","JJs5mciuWz",
+"FnPFB8xEKz","jtn0X4dEz6","sqVrfnFqik","n1pmOZJTXH","zz4ZUJJs5m","2NslmcL0aE","fLNg8WDVWJ","pmeCdZhwG1","PYBf4lXFOB","CK5W7FwEJz",
+"No0QbgdQsS","8cVD3In3NS","TwanoTwano","JkzUnQClRL","4QMc9Nxx9V","lXFOBnlaBy","ZJTXHRxrsm","s4786uTacx","QbxXcYw2oU","Q6hMCuQIcz",
+"Zv7z0cShY2","kB5nPFxX9q","ZUnqtM3zXL","FNYIMJXljW","ksJbyLbRTH","MmKGJI7p2a","RmDcrjS1aj","uoStwjiVBP","6AFT007n1c","BFkb8n8pJ9",
+"J2mQiSmGzv","I7p2av8yFN","nlaByhSSvQ","GWqqXKsjRK","tvdkDJJs5m","BpYhVdmoS7","5iGN5n1pmO","uvf7Ae6e4z","StlDJ5drc6","xXTI4wiHrZ",
+"TwanoFxX9q","ix74rLDk6f","rhl0JCK5W7","9GXkXOUYuF","hE1QlI7p2a","NAFuwyofH3","i3pydGXdoH","7hyVvgIYvE","pv0i7MmsIo","9rlg9TCgPp",
+"BGaQYMGlTF","Dz1R3fLNg8","ulk41HfyNQ","5NammYh1hF","gIYvEDcpWB","wiHrZOUqFM","KASQ8ulk41","2ZHdksx5Gl","rz7UtLewvM","Z4I1vgjUTu",
+"5Mg9rzY1GY","uPX7GpmeCd","fcJOyB3qem","MojnPuAWyp","W7cTstaOXK","sqVrfTXQ0Z","7Ow5CMaJQs","guMb8EoToP","5NammbrhlQ","uvf7Aulk41",
+"PYBf4v1Hln","uAWypM3zXL","brhlQCIShG","hUTw7DcpWB","9rlg99y4lw","TXQ0ZFxX9q","Cfgr3K4GS8","HP433OxWIH","0YAGHQChxs","AXpwEWmadA",
+"lViBvEdBKc","yofH3S2Dfu","iKqhrFGzgp","pmeCdFFDui","MojnPQ6Lix","5NammpmeCd","2TRI7IjTwP","fqypyzFgtB","QbxXcWPmlx","64s8NvOqCE",
+"NOHszo8Uyd","vOqCEPOUYS","pFrrlYf2Ec","5Drn0Vprf2","FVMxoYw2oU","2Nslmdpe1v","FVMxok85Ae","5IhmGpT8wu","cmXIX45cIH","Oz8yZLDk6f",
+"L7cGcpT8wu","Chuy3zbIYY","a00b50ao3l","7hyVv8FmFH","a00b5zFgtB","7fKYUQWxoT","MmKGJydG8U","tl72Wdjsrv","618Di6q6L9","JKWYR8U2nU",
+"qUJMdMojnP","yluBx5Mg9r","UmaEvQssNC","pT8wuBGaQY","IKxdLd7vjM","fcJOy0BmCy","Nxx9VMojnP","aFFss64s8N","8TxD7UmaEv","ZJTXHh1zcH",
+"C2Irclm0pD","fLNg8o8Uyd","oGu6xKsjRK","qaofNo8Uyd","6q6L9fLNg8","UmaEvS77LH","SmGzvo8Uyd","zqH0WQWxoT","7lUXZ5VZjS","Q6hMC5Drn0",
+"5iGN5AXpwE","RmDcrkZANm","618DioGu6x","W3VFH0BmCy","JIqXiAgJHQ","Ul4a1ThjNn","vLsmSCNHmv","5nmWv55rfB","lkMUAgdQsS","CqqaD0Wr5y",
+"tjQxs9GXkX","9XyT9pAhR1","PYBf4l83Ud","JJs5mZJTXH","FhtglfmIK1","Gv3FqgjUTu","ix74r6q6L9","3otm67X3uy","5NammUmaEv","lweGy618Di",
+"VBjhz7ku1p","618DiHlUbF","d85a9uTacx","7fKYUUlU3M","0PktITa8f6","AgJHQjiVBP","UlU3MJXljW","euZA5VjCZq","wiHrZguMb8","Twano9iGoT",
+"HzZT8pAhR1","7hyVvjfREu","QWxoTdQ586","tAOsrpvgjS","VjCZqZzJHW","K4GS8SjskQ","pT8wuWPmlx","UlU3MQWxoT","XflUqXflUq","AmdQdogLgc",
+"VjCZqFcWrW","KASQ8AmdQd","8U2nUyvOMI","Q6hMCjeskS","9rlg9CK5W7","aFFsshUTw7","l83UdTCgPp","2NslmZ4I1v","FhtgllweGy","uN6r3BCxeC",
+"Oz8yZ8xEKz","k85AeaL6AJ","MGlTFBGaQY","uPX7GCfgr3","tlILtqQxHP","Yh1hF6q6L9","lj07QhE1Ql","AmdQdReKEW","2DREsAkKTk","DcpWBVLTy6",
+"soy9tJ2mQi","Ss0ZucQOnv","64s8Ntl72W","fcwDatvdkD","dpe1v1LB1L","jtn0XDz1R3","brhlQHlUbF","7fKYU6q6L9","RkQkelweGy","AgJHQxXTI4",
+"5iGN5EoToP","VIlwPwiHrZ","D6rBya00b5","S2DfuDcpWB","8hJdtVLTy6","8cVD3rKDLJ","CK5W7yofH3","oVQp6jzUqR","n8pJ9k85Ae","VjCZqe6e4z",
+"o8UydlCMxy","MGlTF2ZHdk","qaofNZhwG1","uLtKsHfyNQ","i3pydgdQsS","mz8gxMojnP","atef2DcpWB","1LB1Lulk41","FjHXRCfgr3","VNCPdlViBv",
+"zHF1qEdBKc","k85AeiB08l","s93MlJKWYR","cQOnvVIlwP","vLsmSD6rBy","prNT6FNYIM","8hJdt7lUXZ","QClRL8FmFH","HRxd8gIYvE","MaJQsQClRL",
+"1j5L8Q6Lix","9iGoTuvf7A","wDajX5Drn0","jS1ajuvf7A","HzZT8uTacx","pvgjSfcJOy","hSSvQuoStw","9y4lwv2eC3","y94nwBpYhV","guMb80Kyfs",
+"zz4ZUCNHmv","64s8NIKxdL","WPmlxRxrsm","7X3uyjiVBP","KASQ8FwEJz","jSjS3HzZT8","24ARFzbIYY","x3LDe0MR5X","HfyNQ7X3uy","v2eC3uAWyp",
+"h1zcHBpYhV","3weIFtAOsr","WPmlxG1RhS","lViBvRmDcr","bgJAz1LB1L","3otm6MGlTF","FVMxoVerEA","soy9tEOE1o","No0QbuJScX","RxrsmAkKTk",
+"SjskQuoStw","hE1Qliqv4k","lXFOBaL6AJ","Waim6bZLvS","OHaBzhYBCK","piJSk0ao3l","aL6AJQ6hMC","djsrv580YD","QnJ1SFPfSE","1j5L8jSjS3",
+"AOgEeuAWyp","Q6LixzbIYY","5drc6yEfy9","VLTy60BmCy","nFqik8cVD3","29QAzD6rBy","MmsIob29RJ","AXpwEfcJOy","dpe1vMmKGJ","dmoS7t98iW",
+"14FLRVerEA","5nmWvIKxdL","nFqik16lHc","ksJbyyToGW","5drc6TXQ0Z","soy9tuvf7A","FGzgplm0pD","Vprf2faHir","NhXduzFgtB","GrDg7FFDui",
+"AIYUuFVMxo","KsjRKZUnqt","Q6LixcmXIX","7fKYUtaOXK","I7p2a29QAz","lCMxyt59lR","aDGtSaFFss","aFFssgIYvE","WDVWJe6e4z","8U2nUuoStw",
+"AOgEe9eoRc","StlDJWDVWJ","o8UydcQOnv","ix74r8U2nU","MezSWLbRTH","1LB1LAIYUu","rhl0JmX2GE","ECMvUFVMxo","0PktIVprf2","7fKYUDQimp",
+"hYBCKNxx9V","euZA5tvdkD","WaWsvHzZT8","Nxx9V0Wr5y","5nmWvDz1R3","6AFT0jSjS3","LewvMNxx9V","QChxs6q6L9","SmGzvOUYuF","QbxXc2hEEU",
+"VIlwPJkzUn","uoStwpiJSk","RmDcr1j5L8","fLNg8CK5W7","qUJMdhSSvQ","jtn0XuAWyp","rKDLJix74r","TXQ0ZuLtKs","9rlg9HP433","Cfgr3M6qcG",
+"QssNCTCgPp","uupzky94nw","iqv4k8TxD7","suY4xVNCPd","aez9y0YAGH","ulk41aFFss","jiVBP1v5hH","dmoS7tl72W","RBhp0fLNg8","QWxoTnlaBy",
+"I7p2aqaofN","rz7UtxReec","d7vjMzmLYD","jS1ajprNT6","WreyPvOqCE","0YAGH5nmWv","29QAzL7cGc","5NammRmDcr","1j5L8DLhzM","vOqCEtuDyS",
+"MmKGJQ6hMC","qQxHP0YAGH","oVQp6IKxdL","fFDrJblLA9","fcwDa16lHc","TXQ0ZqaofN","fmIK1VjCZq","BbwgA55rfB","EOE1ovkCHH","K20wKzz4ZU",
+"VjCZqM3zXL","qQxHPDLhzM","iwzGkKASQ8","s93MljS1aj","Yf2EcoGu6x","oQ87rv2eC3","yvOMIKsjRK","FnPFBciuWz","ciuWzlkMUA","uLtKsCdyBV",
+"1v5hHxReec","MmKGJX6Pin","soy9tJRJQB","29QAzTXQ0Z","BbwgAsuY4x","ZhwG1iB08l","WmadAECMvU","cmXIX1LB1L","P6bcgwDajX","8U2nUkZANm",
+"oQ87rulk41","X6PinuZPqg","a00b5TCgPp","atef2aDGtS","zmLYDaFFss","Uvlv4i3pyd","KZamHbrhlQ","SWfouChuy3","CIShGFhtgl","ksJbyTwano",
+"fLNg824ARF","iqv4kTXQ0Z","FFDuiMkgy8","rz7UtK4GS8","PYBf4o8Uyd","lViBvl83Ud","aL6AJTCgPp","b29RJ2Yz7E","24ARFTXQ0Z","RzaZAVLTy6",
+"k85AeJKWYR","brhlQksJby","RBhp0pWiOs","lkMUAl83Ud","ZzJHWyvOMI","qaofN2Yz7E","GSQwjyluBx","fqypyZUnqt","2DREstl72W","cQOnvlm0pD",
+"lCMxywDajX","JkzUnazIWp","pvgjS9iGoT","ZJTXHQYxC0","NAFuwdpe1v","TCgPp1v5hH","Yf2EcAmdQd","n1pmOJXljW","dpe1vm4bxU","okgRijSjS3",
+"DQimp3otm6","kZANmEdBKc","he9IA5iGN5","HzZT8Z4I1v","2DREs7fKYU","blLA9Vprf2","G1RhSWaim6","hSSvQKZamH","tvdkDYh1hF","nFqik2Nslm",
+"D6rByfFDrJ","K4GS8LbRTH","GSQwjRBhp0","Ss0Zuiqv4k","HRxd8pT8wu","tl72WazIWp","IKxdLUvlv4","QworuOUqFM","HfyNQAgJHQ","RzaZAt59lR",
+"fLNg8zbIYY","8hJdtO3iyQ","WmadAVBjhz","2Nslm3otm6","LbRTHKZamH","yEfy95VZjS","CqqaDOz8yZ","9iGoTRsQUq","jeskStlILt","HfyNQzqH0W",
+"FxX9qIn3NS","Z4I1vuoStw","IjTwPrz7Ut","JJs5mJJs5m","RpBQm1v5hH","suY4xNhXdu","blLA9RkQke","Kr8ysjzUqR","pAhR1ZuDtD","DcpWBpAhR1",
+"2DREsMojnP","Nxx9VECMvU","Kr8yss7Mxk","FwEJzHRxd8","B3qem7Ow5C","HfyNQRpBQm","zz4ZUt98iW","L7cGcxReec","5iGN5i3pyd","2DREsKASQ8",
+"0MR5Xl83Ud","blLA9v2eC3","oGu6xD6rBy","fcwDai7WMQ","TXQ0ZQ6hMC","uLtKsnFqik","QWxoTzHF1q","0PktIiKqhr","OUYuF55rfB","K4GS8PYBf4",
+"AXpwEQnJ1S","fcJOy2TRI7","suY4xgtCA5","U3yw5C2Irc","0BmCyuZPqg","hSSvQYf2Ec","Ss0ZuhUTw7","FjHXRAkKTk","Q6hMCQYxC0","Vprf2v1Hln",
+"m4bxUn1pmO","7hyVvzz4ZU","gIYvESbRYy","brhlQpv0i7","CK5W7AIYUu","RBhp0W7cTs","9y4lwCxVEf","4dEz6uQIcz","7lUXZFhtgl","WmadAJXljW",
+"uupzkprNT6","55rfB2hEEU","ogLgciB08l","djsrvuoStw","D6rByqQxHP","EdBKctjQxs","sqVrfPYBf4","JJs5miB08l","QYxC0JKWYR","NAFuwhUTw7",
+"tvdkDFNYIM","rKDLJ0BmCy","5Namm5Mg9r","gjUTuksJby","6AFT0taOXK","SWfou9y4lw","xciqpvkCHH","EoToP0MR5X","9GXkXVerEA","5nmWvVjCZq",
+"uPX7G5VZjS","45cIHGv3Fq","jiVBPpmeCd","F6PT2Cfgr3","oQ87r8cVD3","QYxC0UlU3M","7Ow5Cn1pmO","m4bxUbZLvS","OHaBzY1mC0","sx5GlWMiS3",
+"9XyT9aL6AJ","Oz8yZqQxHP","jS1aj8xEKz","rhl0Jaez9y","Kr8ysIjTwP","jiVBP7fKYU","lweGylXFOB","jiVBPuPX7G","yEfy9MezSW","7fsYM07n1c",
+"hUTw7uupzk","jeskShE1Ql","NhXdufcwDa","FxX9qcL0aE","Dz1R3dmoS7","WreyPzqH0W","suY4x2Nslm","48cHLStlDJ","n1pmOl83Ud","WaWsvnlaBy",
+"Ta8f6aez9y","uZPqgIBe8k","rz7UtTwano","x3LDeRsQUq","Gv3FqMGlTF","djsrvbgJAz","brhlQi7WMQ","B3qemlweGy","Rxrsm7fsYM","KASQ8lpF6W",
+"0h1b1AmdQd","4W0TlfLNg8","OUqFMSWfou","yEfy97X3uy","QYxC00Kyfs","RsQUqlViBv","0ao3laL6AJ","LDk6fJKWYR","2NslmCK5W7","suY4xix74r",
+"lpF6WpiJSk","e6e4zNo0Qb","oQ87rW3VFH","D6rByWPmlx","piJSkQClRL","sqVrfF6PT2","dQ586iKqhr","NOHsz7lUXZ","ThjNnlsQGo","TwanoQssNC",
+"0Kyfs1LB1L","pWiOs1v5hH","8hJdtGv3Fq","lweGyoQ87r","Gv3FqQChxs","6q6L95drc6","0BmCyuTacx","In3NS5iGN5","MezSW9XyT9","fcJOyCK5W7",
+"x3LDelViBv","8U2nUM3zXL","9GXkXtl72W","zbIYYBbwgA","W3VFHS77LH","MmsIoWaWsv","Ta8f6JkzUn","8U2nUNhXdu","kB5nPs4786","NhXdupiJSk",
+"WMiS3RpBQm","t59lRMmsIo","y94nwe6e4z","cmXIXcL0aE","8xEKzTa8f6","tl72Ws4786","FNYIMpmeCd","MmKGJlsQGo","No0Qbv2eC3","S2Dfu5Mg9r",
+"EOE1oM3zXL","7hyVvNxx9V","yofH3StlDJ","oVQp6WreyP","8U2nUhYBCK","hE1QlWDVWJ","S2Dfuru4UG","vLsmSUl4a1","MGlTFoVQp6","QnJ1SIRh48",
+"uupzkogLgc","blLA9rhl0J","2ZHdk5nmWv","v2eC3uLtKs","ulk41Uvlv4","EdBKcQ6Lix","3otm62DREs","pWiOsHzZT8","IjTwPnlaBy","2Yz7E16lHc",
+"euZA5Yh1hF","oVQp6fqypy","a00b5POUYS","ReKEWO3iyQ","pmeCddQ586","iKqhrnFqik","0BmCyfcJOy","FNYIMgf8rI","0ao3lOxWIH","blLA9Chuy3",
+"v8yFN618Di","Yw2oUt59lR","PYBf4ZJTXH","FFDuiJkzUn","ZuDtDtuDyS","yluBxtl72W","9y4lwS2Dfu","TCgPp0Wr5y","nFqikIRh48","pWiOs8TxD7",
+"L7cGcAOgEe","lm0pD2TRI7","jfREuRzaZA","BFkb8Fhtgl","DLhzMuAWyp","LbRTHS2Dfu","YjB9tbZLvS","rhl0JCxVEf","vLsmSMezSW","l83UdmX2GE",
+"euZA54dEz6","8RCUAK20wK","Yw2oUHlUbF","Waim6FwEJz","G1RhSlj07Q","CqqaDVNCPd","aL6AJCqqaD","dpe1vMmsIo","ni2v1nFqik","UlU3MCK5W7",
+"8RCUA29QAz","OxWIHBbwgA","3otm6KZamH","3otm645cIH","WmadAYw2oU","aFFsspT8wu","l83Ud64s8N","Kr8ysUvlv4","tvdkDBbwgA","Kr8ysmX2GE",
+"FFDuiXyPZN","X6PinwiHrZ","vkCHHfmIK1","I7p2an1pmO","djsrv5iGN5","mX2GEIKxdL","K4GS84dEz6","0h1b1X6Pin","yofH35nmWv","5nmWv0Kyfs",
+"h1zcHpAhR1","gjUTuiwzGk","Mkgy87X3uy","AOgEehSSvQ","b29RJZUnqt","MmsIo8RCUA","FVMxooQ87r","8U2nUECMvU","uvf7AKZamH","aL6AJv1Hln",
+"BbwgAmz8gx","h1zcHjiVBP","nnP8ot98iW","48cHLJXljW","VBjhzQssNC","v8yFNsqVrf","tjQxsgdQsS","ix74r1LB1L","CqqaDMmsIo","8U2nU7lUXZ",
+"oVQp6pvgjS","YOfrY580YD","P6bcgaez9y","1j5L8CIShG","WMiS3lj07Q","SmGzva00b5","OUYuFnFqik","YOfrYSWfou","4QMc9aez9y","lH1ktECMvU",
+"fLNg8RzaZA","WaWsvwiHrZ","5Drn0mz8gx","Y1mC0pAhR1","5IhmGXflUq","iqv4kUlU3M","uLtKsk85Ae","iB08ly94nw","taOXKAkKTk","Chuy35drc6",
+"faHirWmadA","OxWIH0h1b1","cmXIX7ku1p","VLTy61v5hH","BFkb85VZjS","fLNg8uN6r3","JXljW8xEKz","8xEKzTwano","EoToPMaJQs","GWqqXsoy9t",
+"MmKGJZzJHW","2hEEUaDGtS","DG4sT0Wr5y","pAhR1Nxx9V","5iGN5jfREu","2TRI7Ss0Zu","suY4xtaOXK","lweGyqQxHP","7hyVv0Wr5y","pvgjS0Kyfs",
+"a00b5LDk6f","faHirjSjS3","Yh1hFqUJMd","wiHrZYOfrY","rhl0JgIYvE","QssNCokgRi","8U2nUh1zcH","pmeCdi7WMQ","XflUqVerEA","xciqpl83Ud",
+"JIqXii7WMQ","tvdkDzY1GY","I7p2aWDVWJ","gf8rIVBjhz","tAOsrFjHXR","G1RhSv8yFN","0BmCyMmsIo","7fsYMQ6Lix","okgRiW7cTs","EOE1oy94nw",
+"brhlQyofH3","lsQGoQ6Lix","CqqaDAOgEe","9rlg9kZANm","uTacxlViBv","SjskQiqv4k","ix74rhUTw7","JXljWbgJAz","FLsphatef2","8xEKz7ku1p",
+"Mm8sitvdkD","ThjNnWmadA","16lHctuDyS","jzUqRuZPqg","v8yFNG1RhS","MaJQsVIlwP","WDVWJdjsrv","piJSkgf8rI","2TRI7Vprf2","MojnPThjNn",
+"uAWypt59lR","uN6r3CNHmv","jiVBPoGu6x","Mkgy8BbwgA","No0Qb5Namm","zQt6Qv2eC3","hUTw7StlDJ","zmLYDAgJHQ","3otm6WreyP","azIWphE1Ql",
+"s93MldQ586","euZA5618Di","W3VFHzqH0W","F6PT2a00b5","QbxXcfaHir","jSjS3In3NS","Gv3FqW3VFH","MojnP7fKYU","xciqpFLsph","prNT6gjUTu",
+"RxrsmprNT6","IBe8kjzUqR","ciuWzi7WMQ","y94nwKsjRK","vOqCElViBv","aL6AJt98iW","nlaByksJby","Vprf2wiHrZ","RmDcrHfyNQ","OUYuFlkMUA",
+"Oz8yZECMvU","iqv4ks93Ml","ZuDtDdpe1v","RACujWPmlx","jSjS32Nslm","t98iW7fsYM","FLsphKASQ8","he9IAWreyP","jSjS3TCgPp","ogLgcPYBf4",
+"GSQwj580YD","iqv4keuZA5","aL6AJlm0pD","FxX9qKZamH","DLhzMUvlv4","L7cGcs4786","WreyP8TxD7","nlaByVBjhz","uN6r38cVD3","1v5hH0BmCy",
+"JJs5mMmKGJ","azIWp3otm6","Ul4a1tuDyS","ReKEWqQxHP","Waim6fFDrJ","CIShGFcWrW","iwzGkaFFss","HRxd82Nslm","K4GS8cL0aE","K4GS8MmsIo",
+"IRh48BCxeC","QWxoTbrhlQ","FcWrWRkQke","nlaByLDk6f","IRh48StlDJ","b29RJVjCZq","1LB1L8U2nU","RBhp0618Di","RzaZApFrrl","oGu6xmX2GE",
+"DLhzMeuZA5","AkKTkpT8wu","KASQ8tjQxs","W3VFHbgJAz","ZhwG1IRh48","lm0pDF6PT2","d85a9618Di","tuDySTwano","ix74roGu6x","iKqhr9XyT9",
+"l83UdpFrrl","CdyBVblLA9","CdyBVRsQUq","iKqhrM3zXL","TCgPpdQ586","aFFsss7Mxk","d7vjMNcICA","dpe1vDG4sT","CIShGeuZA5","aDGtSQworu",
+"ulk41Y1mC0","8RCUARpBQm","KsjRKB3qem","HlUbFDG4sT","s47865iGN5","7X3uyi3pyd","7hyVvlCMxy","aL6AJ0ao3l","FhtglOz8yZ","4dEz6tlILt",
+"lweGys4786","9XyT9cQOnv","lCMxycQOnv","ECMvUMK07Y","v2eC3fFDrJ","W3VFHCK5W7","v1Hln0PktI","bZLvShYBCK","lkMUA29QAz","yofH35VZjS",
+"W3VFHWaim6","618DiIRh48","HRxd8faHir","uQIczcQOnv","EdBKcgdQsS","W7cTs7lUXZ","h1zcHVNCPd","lXFOBy94nw","BGaQY2TRI7","k85Aeaez9y",
+"GrDg7NAFuw","StlDJQChxs","mz8gxpiJSk","ZUnqtK20wK","2ZHdkgtCA5","aFFssLbRTH","Waim6nlaBy","azIWpAkKTk","WMiS3a00b5","uLtKshYBCK",
+"JIqXiuN6r3","aez9y0PktI","MmsIo0Kyfs","1j5L8Yh1hF","RsQUqWreyP","iKqhrlm0pD","7Ow5CxReec","QWxoTVIlwP","zY1GYOUYuF","ZhwG1MK07Y",
+"ulk41Yf2Ec","bZLvSpT8wu","fmIK1gIYvE","UmaEv0ao3l","B3qemJXljW","QbxXchYBCK","ZuDtDvLsmS","MK07Y2hEEU","nlaBymX2GE","Q6hMCfaHir",
+"DG4sT9rlg9","MmsIoMkgy8","3weIF8TxD7","GXdoHtAOsr","ZhwG1Ta8f6","fmIK1taOXK","QClRLqUJMd","U3yw5CIShG","qQxHPlsQGo","BCxeCReKEW",
+"Cp3mZIjTwP","bgJAzW7cTs","jtn0XMGlTF","a00b5pAhR1","L7cGcQ6hMC","lViBvMm8si","RzaZA3weIF","AOgEev8yFN","pWiOsFLsph","zHF1qFnPFB",
+"1v5hHStlDJ","QnJ1SL7cGc","guMb8VjCZq","a00b5HP433","GXdoHaDGtS","LewvMdQ586","IRh488cVD3","v2eC3GXdoH","QnJ1SqaofN","Vprf2HzZT8",
+"hUTw7dpe1v","I7p2a2TRI7","nFqiky94nw","MmKGJAIYUu","ru4UGcmXIX","IRh48QClRL","dpe1vbrhlQ","9XyT9zmLYD","s7Mxk24ARF","2NslmOz8yZ",
+"BpYhVQChxs","wDajXS2Dfu","HzZT88hJdt","QnJ1SVNCPd","v1Hln0ao3l","Gv3Fqs4786","Cfgr355rfB","45cIHrKDLJ","EOE1o64s8N","Dz1R31LB1L",
+"HlUbFBGaQY","EdBKchE1Ql","2DREsfaHir","0YAGHBbwgA","7fsYMVIlwP","s4786i7WMQ","nFqikPYBf4","CxVEfMaJQs","d7vjMtuDyS","DG4sTRxrsm",
+"aFFsszY1GY","MmsIoNOHsz","ksJbypAhR1","5VZjSgIYvE","BGaQYQClRL","JKWYRuTacx","lXFOBKZamH","xciqp5iGN5","LewvMv8yFN","tvdkDGXdoH",
+"yToGW0ao3l","0YAGHwDajX","No0Qb6q6L9","i7WMQUmaEv","IRh480Wr5y","sx5GlOz8yZ","rz7Ut7lUXZ","fcwDaJIqXi","l83UdFGzgp","8hJdtQChxs",
+"iB08lCxVEf","8FmFHazIWp","uJScXhUTw7","jtn0X3weIF","SjskQuupzk","ni2v1UmaEv","cmXIX1j5L8","fcJOyCqqaD","ZzJHWhSSvQ","jeskSpv0i7",
+"iwzGkM6qcG","dpe1vtvdkD","zQt6QAmdQd","t98iWUl4a1","Rxrsm8FmFH","FNYIMn1pmO","tAOsr5drc6","guMb8bZLvS","8cVD3FGzgp","uvf7AlXFOB",
+"WMiS3EoToP","VBjhzMmKGJ","IRh48WmadA","faHirQworu","pmeCdtaOXK","8U2nU9GXkX","xciqpFjHXR","v1HlnfcwDa","suY4xPYBf4","ix74rfLNg8",
+"wiHrZuvf7A","8TxD7uPX7G","sqVrfpAhR1","tlILtMK07Y","0h1b1iKqhr","S77LHjiVBP","5nmWvsuY4x","nnP8o1j5L8","hSSvQ7X3uy","TXQ0ZdhSuH",
+"Mkgy8lsQGo","5drc62DREs","i7WMQFGzgp","WPmlxIBe8k","Yh1hFQ6Lix","EdBKcWmadA","FVMxoDQimp","ZUnqtFVMxo","HP433oQ87r","MK07Ypv0i7",
+"Waim6WmadA","kZANmdhSuH","lkMUAy94nw","i3pyduLtKs","fqypylCMxy","ksJbyHlUbF","uLtKs3weIF","Yw2oUIBe8k","nnP8oZv7z0","SbRYyAgJHQ",
+"ru4UG1j5L8","Zv7z00Wr5y","l83UdNAFuw","IjTwPs93Ml","v1Hlnru4UG","GXdoH9GXkX","CdyBV1LB1L","Uvlv4zQt6Q","kZANmBGaQY","jeskSFnPFB",
+"NOHszAgJHQ","nnP8o8U2nU","9y4lwrhl0J","cL0aEogLgc","ix74rvkCHH","zQt6QguMb8","HP4335iGN5","AXpwEFVMxo","0MR5XuZPqg","uQIcz7hyVv",
+"qQxHPazIWp","VNCPdNxx9V","fqypyFFDui","DLhzMEOE1o","I7p2azmLYD","VerEAlm0pD","gdQsSCxVEf","7hyVvK20wK","sx5GliB08l","uoStw6q6L9",
+"CdyBVvkCHH","RBhp09GXkX","VLTy6b29RJ","AgJHQI7p2a","2hEEUFVMxo","gf8rIVjCZq","pmeCdn1pmO","VjCZqpFrrl","gtCA55VZjS","C2Irc0PktI",
+"Uvlv40MR5X","AmdQdGSQwj","F6PT2GXdoH","JJs5mChuy3","Yf2EcSs0Zu","Ul4a1t98iW","FNYIMZuDtD","3weIFD6rBy","JIqXijiVBP","lkMUAOxWIH",
+"gtCA5fqypy","pWiOs8hJdt","qUJMdjiVBP","OUqFMJ2mQi","In3NSFPfSE","MezSWs7Mxk","fLNg8fcwDa","BpYhVgIYvE","dhSuHdhSuH","yvOMIMm8si",
+"blLA9iwzGk","a00b5bgJAz","oGu6xWaim6","oVQp648cHL","55rfBlj07Q","MmsIogjUTu","aL6AJpAhR1","16lHcHlUbF","EOE1oMK07Y","Fhtgln1pmO",
+"JXljWJJs5m","AkKTk7fKYU","M6qcGJRJQB","FcWrWIBe8k","CqqaDhSSvQ","jS1ajsoy9t","64s8NP6bcg","WaWsvWDVWJ","9rlg9pvgjS","HfyNQYw2oU",
+"okgRifqypy","W7cTsPb1pa","qaofNy94nw","Nxx9V580YD","pmeCd1LB1L","atef2IBe8k","FwEJzzHF1q","Ta8f6Yh1hF","zqH0WgtCA5","DcpWB618Di",
+"KASQ8S2Dfu","xciqpECMvU","SbRYyaL6AJ","QClRLWPmlx","dQ586cQOnv","lweGyRBhp0","UmaEvMojnP","BpYhVazIWp","euZA5FLsph","WreyPFPfSE",
+"WmadAsqVrf","Gv3FqhSSvQ","In3NSB3qem","55rfBzqH0W","prNT6MmKGJ","2Nslm2Nslm","pvgjSuQIcz","lweGyHP433","45cIH7fKYU","TCgPpSWfou",
+"7lUXZFPfSE","iKqhr2DREs","vkCHH5drc6","zmLYDTa8f6","brhlQwiHrZ","oQ87r7ku1p","5ZaEz0MR5X","W3VFHJkzUn","5VZjSD6rBy","8RCUAogLgc",
+"M3zXLI7p2a","16lHcpAhR1","lViBvlm0pD","pFrrlM6qcG","zz4ZUx3LDe","LDk6fW7cTs","7fsYMGv3Fq","RBhp0rKDLJ","blLA9Fhtgl","AXpwEFNYIM",
+"2Nslm24ARF","O3iyQ5Mg9r","5IhmGydG8U","d7vjMuupzk","Cfgr3QYxC0","580YDoGu6x","RACujFVMxo","zbIYYzz4ZU","Nxx9VX6Pin","zQt6QnnP8o",
+"zqH0WPb1pa","nFqikx3LDe","580YD6q6L9","jSjS3580YD","AkKTkTa8f6","FGzgpCxVEf","v8yFNh1zcH","aez9y45cIH","kZANm2Nslm","MmsIod85a9",
+"FGzgppiJSk","taOXK5Mg9r","Ss0ZulweGy","BCxeCazIWp","RzaZAnnP8o","Waim6oVQp6","FwEJzi3pyd","cShY29XyT9","dQ586rKDLJ","iqv4kU3yw5",
+"dhSuHUl4a1","fqypyVprf2","m4bxU5nmWv","dpe1v5Namm","MezSWGWqqX","5VZjSXflUq","vkCHHCfgr3","2DREsAmdQd","KsjRKL7cGc","iqv4kdpe1v",
+"jiVBPSjskQ","e6e4zsuY4x","tuDySzz4ZU","n1pmOPOUYS","qUJMdsx5Gl","bZLvSZ4I1v","i3pydt59lR","LewvMi3pyd","OUqFMyvOMI","jS1ajeuZA5",
+"Ta8f6sx5Gl","FVMxoPb1pa","2hEEUFPfSE","kB5nPaL6AJ","rz7UtSWfou","pAhR1ni2v1","pT8wudjsrv","UmaEvWaWsv","AIYUuIKxdL","taOXKpv0i7",
+"U3yw5t98iW","Yw2oUHzZT8","4QMc9jzUqR","bgJAzTa8f6","nFqikOUYuF","tl72WzHF1q","Uvlv4NAFuw","vOqCE16lHc","J2mQiF6PT2","GrDg7nFqik",
+"WDVWJ14FLR","aL6AJazIWp","IBe8kzmLYD","IBe8kpFrrl","07n1cDG4sT","CdyBVm4bxU","KsjRK6q6L9","L7cGc0Kyfs","WMiS3fmIK1","14FLRi3pyd",
+"8xEKzGrDg7","atef2Rxrsm","oVQp6kZANm","WDVWJMojnP","vLsmSIKxdL","v1HlnRBhp0","d85a90h1b1","OUqFMS77LH","s7MxkG1RhS","lH1ktSbRYy",
+"5ZaEzcL0aE","2ZHdkydG8U","Zv7z07lUXZ","0KyfsQssNC","djsrv24ARF","lsQGofcwDa","djsrvNhXdu","2TRI7brhlQ","6q6L94QMc9","RsQUq9y4lw",
+"jzUqRM6qcG","F6PT2BpYhV","Chuy34dEz6","JXljWokgRi","Z4I1v4W0Tl","jzUqR1LB1L","SWfoubgJAz","tl72WJkzUn","aDGtS6AFT0","SWfouQChxs",
+"v8yFNCp3mZ","CNHmvm4bxU","F6PT2l83Ud","ciuWztuDyS","Vprf2ydG8U","0h1b1DcpWB","Waim6tlILt","07n1cP6bcg","cQOnvoQ87r","L7cGcjiVBP",
+"ru4UGzz4ZU","zQt6QX6Pin","dQ586zQt6Q","ksJbyZ4I1v","hi5X7AIYUu","he9IAgIYvE","IRh48BbwgA","t98iWsx5Gl","gjUTurhl0J","lweGyatef2",
+"FxX9qeuZA5","XyPZNNxx9V","WaWsvRpBQm","MojnPaDGtS","TCgPpD6rBy","NhXduJKWYR","580YDAgJHQ","IKxdLI7p2a","h1zcHS77LH","No0QbOUYuF",
+"i7WMQl83Ud","rz7Uts7Mxk","D6rByFcWrW","64s8NMGlTF","fLNg8wiHrZ","EOE1oQClRL","ulk41dhSuH","24ARF6AFT0","9eoRcAgJHQ","blLA9oVQp6",
+"GWqqXaez9y","PYBf4Fhtgl","5VZjSlm0pD","FjHXRW7cTs","uvf7A0MR5X","zqH0Ws93Ml","WPmlxtl72W","IjTwPVLTy6","k85AeDLhzM","7lUXZP6bcg",
+"VLTy6AXpwE","580YDMkgy8","KASQ8lCMxy","W3VFHFnPFB","45cIHFjHXR","7fsYMzHF1q","iqv4kFPfSE","mX2GEPYBf4","MezSWDz1R3","AmdQdfaHir",
+"SmGzvTXQ0Z","v2eC3zz4ZU","zz4ZUh1zcH","ZhwG1uTacx","zY1GYLewvM","0ao3l7hyVv","14FLRHzZT8","Cp3mZFPfSE","sx5GlKASQ8","euZA55nmWv",
+"Yh1hFpv0i7","C2IrcMaJQs","ECMvUzQt6Q","16lHcAmdQd","NAFuwl83Ud","FcWrWjS1aj","zz4ZUtaOXK","UmaEvkZANm","FxX9qBFkb8","45cIHkB5nP",
+"MaJQsfcJOy","ydG8Ud7vjM","GXdoH8cVD3","CIShGjeskS","hSSvQpiJSk","lViBvZv7z0","JXljWQ6hMC","2Yz7EjzUqR","BbwgAUmaEv","HlUbFnnP8o",
+"2TRI7Dz1R3","VBjhzUmaEv","8FmFHK4GS8","GWqqXiKqhr","uQIczCxVEf","0ao3luoStw","MezSWtjQxs","cmXIXQChxs","iKqhrZuDtD","i3pyd5IhmG",
+"dpe1vuPX7G","zmLYDvkCHH","t98iW7hyVv","lH1ktlXFOB","Zv7z09GXkX","qaofNCp3mZ","iKqhrbZLvS","Dz1R3y94nw","DG4sTD6rBy","64s8Ngf8rI",
+"uAWyp0ao3l","YOfrYPb1pa","tvdkD0YAGH","7lUXZgjUTu","ydG8U2Yz7E","AmdQdhUTw7","vkCHHa00b5","AOgEeo8Uyd","rz7UtQClRL","uJScXVBjhz",
+"1v5hH5Mg9r","Gv3Fqv2eC3","lViBvuLtKs","D6rByhSSvQ","RsQUqpFrrl","dmoS7gjUTu","WreyPfcJOy","VjCZqGv3Fq","ru4UGXyPZN","jfREu4W0Tl",
+"jeskSVLTy6","Cp3mZyofH3","lCMxylViBv","pvgjSrhl0J","MojnPm4bxU","WDVWJyToGW","euZA57hyVv","GWqqXsqVrf","hYBCKQ6Lix","RpBQmjtn0X",
+"s4786CxVEf","AIYUuMkgy8","NcICAni2v1","tAOsrU3yw5","gdQsSX6Pin","hE1Ql0YAGH","xciqpMK07Y","nFqikjzUqR","BpYhVFcWrW","Dz1R3M6qcG",
+"7lUXZ0BmCy","Z4I1v1LB1L","KsjRKogLgc","2Yz7ES2Dfu","fcwDa5iGN5","xReecRsQUq","8RCUA0YAGH","JkzUnfqypy","IBe8kK4GS8","k85AeChuy3",
+"zbIYY618Di","BCxeCcL0aE","IRh48D6rBy","Cfgr3HRxd8","FcWrW2Nslm","FwEJzjtn0X","OUYuFprNT6","AkKTkjfREu","vkCHHgf8rI","zQt6QqQxHP",
+"oGu6xO3iyQ","wDajXgjUTu","fFDrJ7Ow5C","FjHXRC2Irc","1j5L8s4786","uLtKszFgtB","guMb84QMc9","EdBKcpmeCd","IKxdLWMiS3","kB5nPQClRL",
+"mX2GElweGy","s93MlTCgPp","hYBCKXflUq","2NslmuAWyp","6AFT0OxWIH","ciuWzRACuj","xciqpMaJQs","bZLvSlXFOB","aFFssgdQsS","In3NSIRh48",
+"No0QbVNCPd","ydG8UKsjRK","GWqqXYjB9t","QClRLjeskS","piJSkazIWp","Gv3FqcmXIX","BGaQYUvlv4","FNYIM0BmCy","FGzgpv1Hln","HfyNQIn3NS",
+"Yh1hFRmDcr","0YAGHs7Mxk","I7p2ajS1aj","qaofNJJs5m","MK07Yi7WMQ","2DREs1j5L8","i3pydZzJHW","0KyfsFnPFB","lsQGoLbRTH","JJs5mVNCPd",
+"RmDcrECMvU","yEfy9kB5nP","3otm6Uvlv4","29QAznFqik","M3zXLDz1R3","VjCZqydG8U","OxWIHogLgc","mX2GEAOgEe","QYxC0xciqp","soy9tzbIYY",
+"VjCZqNxx9V","v2eC3S2Dfu","WMiS3qaofN","24ARFAXpwE","2Nslmdjsrv","4dEz6OHaBz","okgRiaFFss","M3zXLaFFss","BFkb8ReKEW","rKDLJMkgy8",
+"pvgjS5VZjS","Oz8yZtjQxs","FFDuiOz8yZ","SWfoupmeCd","KsjRKZJTXH","jtn0XWaim6","9eoRcmz8gx","uN6r3tuDyS","blLA9xReec","gjUTuCNHmv",
+"PYBf4pAhR1","lkMUAk85Ae","uPX7GpWiOs","lsQGoIn3NS","Y1mC0TCgPp","uPX7Gt59lR","oQ87rUl4a1","RxrsmoGu6x","Kr8ys0PktI","v1Hln4QMc9",
+"oGu6xtl72W","Vprf2i7WMQ","iKqhr8FmFH","7fsYMYOfrY","GSQwj1j5L8","lCMxyHlUbF","4QMc9AXpwE","45cIHyofH3","qaofNix74r","euZA5BbwgA",
+"ThjNne6e4z","MK07Yv2eC3","Cfgr3Chuy3","PYBf4Yw2oU","RBhp0gtCA5","TwanoMmsIo","618DiVprf2","CNHmvRmDcr","blLA9RmDcr","Y1mC0cL0aE",
+"580YDvkCHH","5VZjS4dEz6","e6e4zNcICA","OUqFMfFDrJ","zz4ZUnFqik","qaofNiqv4k","4W0Tlm4bxU","M6qcGWaim6","JXljWi7WMQ","RmDcroVQp6",
+"RACujWDVWJ","9GXkXLewvM","EdBKcCp3mZ","sqVrfU3yw5","pT8wuVBjhz","G1RhSRxrsm","X6Pin1LB1L","VNCPdzHF1q","Mkgy8RmDcr","1j5L8TXQ0Z",
+"jS1ajpFrrl","ThjNn16lHc","cQOnvGWqqX","dhSuHJkzUn","StlDJ6AFT0","Pb1palViBv","AgJHQzFgtB","s7MxkQnJ1S","9iGoTJkzUn","BFkb8No0Qb",
+"AXpwEkB5nP","ogLgcfqypy","0YAGHe6e4z","pvgjS580YD","dmoS7vOqCE","BFkb8MmsIo","2hEEUni2v1","MaJQsgdQsS","v8yFNyToGW","WaWsvMezSW",
+"5IhmGogLgc","yToGWtaOXK","Yw2oUXflUq","cL0aEMmKGJ","zmLYDHP433","POUYS1LB1L","yvOMICfgr3","Chuy3DLhzM","Ss0Zu9eoRc","BFkb8NcICA",
+"BbwgAo8Uyd","aL6AJGXdoH","OUqFMiB08l","6AFT09XyT9","FnPFBSbRYy","ZhwG12TRI7","IjTwP8cVD3","45cIHzmLYD","rKDLJ8TxD7","QssNCHlUbF",
+"ulk41Q6hMC","8TxD7gjUTu","Dz1R3RpBQm","fcwDaIRh48","9iGoT8FmFH","48cHLe6e4z","JJs5m8FmFH","fcwDaVerEA","brhlQzz4ZU","pvgjScQOnv",
+"uoStwm4bxU","bgJAzVIlwP","AgJHQHP433","AIYUuDcpWB","cmXIXLbRTH","jzUqRlm0pD","aFFssNcICA","9XyT9Mm8si","4QMc9XyPZN","AmdQdX6Pin",
+"pvgjSFNYIM","FcWrW7Ow5C","pWiOs45cIH","RzaZAHRxd8","lXFOBVLTy6","jtn0X0h1b1","lj07QWaim6","0BmCyyToGW","aez9yC2Irc","ciuWzLewvM",
+"xciqpY1mC0","nlaByuoStw","wDajX5nmWv","kZANmQworu","FxX9q8FmFH","VBjhzCNHmv","yEfy9tvdkD","5NammmX2GE","QnJ1SRmDcr","tjQxsRpBQm",
+"Cp3mZ0ao3l","uvf7AhUTw7","DQimpCp3mZ","5drc67fKYU","Uvlv4UmaEv","b29RJix74r","MaJQsuQIcz","ciuWzSbRYy","StlDJRACuj","CIShGAmdQd",
+"yvOMIh1zcH","m4bxUEoToP","gIYvEFwEJz","t59lR5IhmG","zQt6QUl4a1","Ul4a1dQ586","5drc69XyT9","FhtglWmadA","WMiS3o8Uyd","KZamHPOUYS",
+"vLsmSb29RJ","9XyT9kZANm","gtCA5uoStw","rz7Ut8U2nU","uTacxCxVEf","8xEKzDcpWB","uLtKsFhtgl","nFqik7hyVv","prNT6azIWp","wiHrZv8yFN",
+"xXTI4RmDcr","xReecIjTwP","RACujWaWsv","ZuDtDe6e4z","K20wK2ZHdk","b29RJVBjhz","4W0TlVNCPd","cQOnvKZamH","14FLRQssNC","4W0Tld7vjM",
+"DQimph1zcH","sx5Gl1j5L8","jzUqRNxx9V","AkKTkCxVEf","zz4ZUlsQGo","v1Hlni3pyd","aL6AJxXTI4","lCMxy24ARF","Ss0Zuk85Ae","SmGzv4dEz6",
+"CxVEfD6rBy","Cfgr3aDGtS","n1pmO8FmFH","1LB1L16lHc","FLsphtAOsr","ix74rPb1pa","dhSuHOxWIH","5Namm3otm6","2ZHdk2hEEU","piJSkMm8si",
+"OHaBzL7cGc","qaofN0MR5X","BGaQYfqypy","YOfrYlH1kt","fFDrJpT8wu","HP433FxX9q","QssNCZv7z0","Chuy31j5L8","9GXkXTa8f6","bgJAzO3iyQ",
+"HfyNQogLgc","CK5W7vLsmS","FhtglpT8wu","GWqqXzmLYD","5iGN5v1Hln","RACujfqypy","IjTwP7lUXZ","U3yw5uLtKs","7lUXZuoStw","fLNg84QMc9",
+"LDk6f5Drn0","U3yw5qQxHP","sx5GlciuWz","i3pydIKxdL","pvgjSZ4I1v","2TRI7ZuDtD","s7MxkzFgtB","VjCZq7Ow5C","Gv3FqECMvU","nFqikRzaZA",
+"YOfrYcShY2","2Nslmix74r","5IhmGgIYvE","FNYIM4W0Tl","mz8gxjiVBP","RxrsmQClRL","AmdQdUl4a1","Uvlv4TXQ0Z","MGlTFEOE1o","StlDJiKqhr",
+"0PktIAIYUu","nFqikCqqaD","8U2nUChuy3","YjB9tRxrsm","StlDJnlaBy","FNYIMG1RhS","07n1ciKqhr","0h1b1k85Ae","Mkgy8RpBQm","JRJQBAOgEe",
+"MK07YzbIYY","Yw2oUReKEW","I7p2at59lR","n8pJ9AOgEe","FVMxouLtKs","UmaEv5IhmG","8RCUASWfou","dpe1vxXTI4","hE1QlVprf2","8cVD3guMb8",
+"Qworumz8gx","dQ586VerEA","D6rByGSQwj","hUTw7AIYUu","wiHrZxciqp","qUJMd5Drn0","FnPFBVLTy6","9y4lw29QAz","tuDySJ2mQi","X6PinY1mC0",
+"rz7Utfqypy","7ku1pZhwG1","VLTy6XyPZN","uZPqgeuZA5","9GXkXC2Irc","tlILtMezSW","bgJAzyofH3","0KyfsguMb8","fcJOyCIShG","Ss0ZuvOqCE",
+"xReecwDajX","d7vjMuoStw","W3VFHCdyBV","DG4sTY1mC0","lsQGoa00b5","J2mQimz8gx","KsjRKJXljW","yluBx6q6L9","NhXduIKxdL","bZLvSReKEW",
+"DcpWBiqv4k","kB5nPSjskQ","1v5hHlm0pD","FjHXRLDk6f","HlUbFJJs5m","hE1QluN6r3","Q6hMCZuDtD","Ul4a1F6PT2","VIlwPzqH0W","Dz1R3guMb8",
+"C2IrcSWfou","AOgEeatef2","ni2v15nmWv","MaJQssuY4x","Ta8f6CxVEf","OUYuFbZLvS","YjB9tVBjhz","KZamHJXljW","tuDySt98iW","W7cTsjeskS",
+"VBjhzDG4sT","djsrvzz4ZU","Vprf25ZaEz","i3pydSs0Zu","LDk6fuQIcz","ThjNnFFDui","v8yFNOxWIH","0MR5XlH1kt","he9IAmz8gx","SbRYyFxX9q",
+"yofH3jzUqR","sqVrfOHaBz","QnJ1S3otm6","IBe8k5ZaEz","qQxHPuAWyp","iwzGkWMiS3","6AFT0Ss0Zu","uoStwxciqp","2DREsVBjhz","0KyfssuY4x",
+"cQOnvZUnqt","7lUXZqaofN","5VZjSk85Ae","Mm8si4W0Tl","BbwgAeuZA5","oGu6xeuZA5","KZamH2Nslm","hSSvQSs0Zu","aez9yFGzgp","e6e4zL7cGc",
+"48cHLTwano","No0QbQworu","xciqpWDVWJ","uJScXTa8f6","BpYhVhSSvQ","zHF1qKZamH","HlUbFGSQwj","FwEJz6q6L9","SWfou24ARF","ThjNnblLA9",
+"TXQ0ZFGzgp","lm0pD7ku1p","Q6Lix5Mg9r","vkCHHWmadA","Mkgy8prNT6","9XyT9S77LH","5NammVjCZq","jSjS3RzaZA","vOqCE2ZHdk","v8yFNK20wK",
+"07n1cjeskS","ulk41bZLvS","hUTw7dmoS7","Zv7z0aez9y","ZuDtDdQ586","JIqXikB5nP","RkQkeuZPqg","WPmlxtjQxs","JXljWmz8gx","pWiOsn8pJ9",
+"xciqpNxx9V","48cHLRsQUq","ru4UGZJTXH","aez9yzbIYY","hE1Ql7ku1p","8cVD3s93Ml","pFrrlMezSW","ReKEWEdBKc","FVMxoBFkb8","QnJ1SCK5W7",
+"W7cTsBFkb8","e6e4zni2v1","QbxXcpmeCd","Gv3FqcL0aE","EdBKcokgRi","MojnP2hEEU","guMb8blLA9","8cVD3tl72W","BFkb8BGaQY","UlU3MFjHXR",
+"BGaQYLDk6f","FLsphjtn0X","G1RhS5nmWv","8cVD3CK5W7","NhXduLewvM","aDGtSuTacx","FhtglRBhp0","iB08luLtKs","lViBv8TxD7","VjCZqPOUYS",
+"lm0pD0Wr5y","FPfSE8cVD3","Waim6Uvlv4","In3NScShY2","YjB9tOxWIH","iwzGkCfgr3","ydG8UpiJSk","prNT6IBe8k","x3LDe5drc6","wDajXv1Hln",
+"xciqpqaofN","LbRTHNcICA","NcICAyofH3","MojnPpvgjS","kB5nPlViBv","ksJbyUl4a1","SWfouuvf7A","ZJTXHlsQGo","ogLgcSjskQ","jiVBPCdyBV",
+"v1HlnpiJSk","gdQsSbgJAz","tuDySy94nw","yToGWBbwgA","ECMvUguMb8","HfyNQokgRi","lweGyFFDui","dhSuHtAOsr","ThjNnFPfSE","FGzgpRpBQm",
+"FPfSEWreyP","nlaByiB08l","NhXduhUTw7","piJSkS2Dfu","M3zXLiqv4k","OUYuFM6qcG","vLsmS2Nslm","nnP8ovkCHH","LbRTH9XyT9","FcWrWnFqik",
+"sqVrfe6e4z","0BmCykB5nP","Gv3FqjfREu","BGaQY2Nslm","0YAGHB3qem","KZamHZhwG1","euZA5tAOsr","d85a9YOfrY","IRh48yvOMI","Z4I1vwiHrZ",
+"dQ586zFgtB","uN6r3VerEA","Zv7z0KZamH","9y4lw4W0Tl","Yw2oU0BmCy","U3yw5OUqFM","RmDcr5Drn0","CNHmvSjskQ","HlUbFmz8gx","ogLgcJRJQB",
+"5drc6djsrv","FnPFBMmsIo","vkCHHjzUqR","RzaZAZ4I1v","DQimpl83Ud","D6rBy5ZaEz","KsjRKxXTI4","OUqFM1j5L8","e6e4zRBhp0","zQt6Q5drc6",
+"zqH0Wiqv4k","FFDuiJIqXi","7lUXZAgJHQ","Dz1R3aDGtS","GWqqXwDajX","CNHmvjzUqR","o8Uyd7X3uy","dpe1vY1mC0","5Drn0uZPqg","QworumX2GE",
+"sx5GlfcwDa","0YAGHG1RhS","euZA5Ul4a1","zmLYDQ6hMC","xReecuvf7A","uN6r3Uvlv4","dmoS7hYBCK","tvdkDuLtKs","mz8gxL7cGc","vkCHHt98iW",
+"QnJ1SAkKTk","2hEEUChuy3","RkQkeQChxs","GSQwjAgJHQ","iwzGkh1zcH","Dz1R3CqqaD","29QAzqUJMd","lm0pD4dEz6","UlU3MMezSW","JIqXi7lUXZ",
+"SjskQS2Dfu","aez9y8hJdt","JKWYR2Yz7E","5IhmGpvgjS","hE1QlNxx9V","v1HlnuJScX","Yf2EcKr8ys","Cfgr3EoToP","pWiOsxciqp","O3iyQrKDLJ",
+"zbIYYZUnqt","gtCA5cQOnv","7ku1pKr8ys","dpe1vQChxs","MmsIoWPmlx","GrDg7RsQUq","J2mQiQ6Lix","4dEz6fmIK1","fcJOyPYBf4","HP433piJSk",
+"i3pyd7Ow5C","QYxC0aL6AJ","AmdQdEoToP","EdBKcwiHrZ","IjTwPSjskQ","dpe1vSmGzv","QChxstAOsr","ZUnqtMmKGJ","48cHLhYBCK","Pb1paFxX9q",
+"9rlg9s4786","Qworuv2eC3","Ul4a1lj07Q","W3VFHBFkb8","l83UdG1RhS","nFqikrz7Ut","JXljWMGlTF","TCgPpHP433","FFDuiYjB9t","oVQp6ulk41",
+"QworuuZPqg","e6e4z5iGN5","QClRL8U2nU","8cVD3FFDui","IRh48EoToP","QnJ1S8U2nU","QnJ1SOUqFM","AIYUuXflUq","3otm6SWfou","7hyVvuPX7G",
+"zFgtBwiHrZ","prNT69rlg9","QYxC0ciuWz","2NslmbgJAz","8FmFHVNCPd","0PktIVBjhz","Cfgr3uQIcz","uupzkn8pJ9","rKDLJKr8ys","fFDrJzz4ZU",
+"Yw2oUaFFss","Qworuru4UG","Cp3mZVIlwP","MaJQs5drc6","5ZaEzZhwG1","MojnPQnJ1S","9eoRcpAhR1","TCgPp5iGN5","QWxoTLewvM","5IhmGsoy9t",
+"ogLgc1j5L8","FjHXRGXdoH","5nmWvRsQUq","U3yw50BmCy","h1zcHMmKGJ","lkMUAfcwDa","5drc6oVQp6","pvgjSNcICA","BCxeCQClRL","jfREu24ARF",
+"ZJTXH5ZaEz","IRh48oGu6x","Kr8ysO3iyQ","s7MxkhUTw7","G1RhSFjHXR","HP433OHaBz","5nmWvZJTXH","Q6LixBpYhV","hi5X7Ul4a1","TXQ0ZVLTy6",
+"JKWYRtvdkD","NOHszQ6hMC","qUJMdRBhp0","bZLvSs93Ml","yvOMIQbxXc","aez9yDQimp","LbRTHprNT6","K4GS8MmKGJ","ZJTXHCK5W7","NhXduGXdoH",
+"Oz8yZlCMxy","CdyBVRkQke","hE1QlW7cTs","d85a9Waim6","Nxx9VYOfrY","X6PinSWfou","jSjS3ZJTXH","YjB9tYf2Ec","MaJQsKASQ8","zQt6QKASQ8",
+"cShY2FGzgp","oGu6xbrhlQ","GXdoHKsjRK","GXdoHtl72W","D6rByVNCPd","POUYSDG4sT","kB5nPdhSuH","lpF6WK4GS8","soy9tdhSuH","9iGoTuN6r3",
+"qUJMdhe9IA","HRxd87lUXZ","5NammD6rBy","uPX7GcQOnv","wDajXhi5X7","BbwgAd85a9","uN6r3HfyNQ","atef28U2nU","PYBf4FGzgp","EdBKcFjHXR",
+"yvOMIpAhR1","5nmWvYjB9t","RmDcrDLhzM","RsQUqRxrsm","n8pJ9lH1kt","uLtKsGv3Fq","xXTI4ZzJHW","1LB1LwiHrZ","29QAzpv0i7","Mm8silViBv",
+"QChxsBbwgA","Yf2EcRACuj","Nxx9VbZLvS","cQOnvL7cGc","uPX7GSWfou","LbRTHbgJAz","zHF1qpAhR1","5iGN5MK07Y","euZA5CIShG","2hEEUzqH0W",
+"cL0aEYOfrY","2TRI7pAhR1","Pb1pajS1aj","W3VFHSjskQ","uupzkTCgPp","lpF6WP6bcg","5nmWvhYBCK","kZANmgjUTu","sqVrfs93Ml","oGu6xo8Uyd",
+"i3pydX6Pin","OHaBzlj07Q","hUTw7MojnP","soy9t9iGoT","O3iyQW7cTs","QYxC0Fhtgl","tl72WzY1GY","07n1c7Ow5C","VLTy6jSjS3","48cHLfFDrJ",
+"wDajXI7p2a","Kr8ysIKxdL","WreyPQChxs","W3VFH48cHL","rhl0JFLsph","okgRi580YD","tuDySnlaBy","hE1QlpT8wu","TwanoDcpWB","AkKTklweGy",
+"jzUqRVBjhz","n1pmOyofH3","d85a9mX2GE","bgJAzFFDui","F6PT2ZUnqt","DQimpJ2mQi","45cIHO3iyQ","NhXdugdQsS","cmXIXFLsph","HfyNQVIlwP",
+"AgJHQUl4a1","dQ586Ta8f6","ReKEWZv7z0","aez9ysx5Gl","Zv7z0nnP8o","Y1mC0atef2","iqv4kAkKTk","K20wKCIShG","KASQ80BmCy","2DREswDajX",
+"LbRTHZzJHW","HzZT8lweGy","cL0aEFwEJz","nFqik45cIH","StlDJHzZT8","VLTy6VBjhz","v2eC38cVD3","0ao3lt98iW","uN6r3Q6Lix","atef2zmLYD",
+"guMb88TxD7","580YDaDGtS","2ZHdkvOqCE","14FLRlpF6W","5VZjSQworu","UlU3MCp3mZ","jzUqR14FLR","MmsIo3otm6","NcICAd7vjM","Oz8yZMK07Y",
+"14FLRlkMUA","45cIHix74r","SmGzvQssNC","tlILtRACuj","LbRTHjeskS","0Wr5y29QAz","FjHXR7Ow5C","atef2M6qcG","HRxd814FLR","v2eC3ciuWz",
+"1j5L8D6rBy","ThjNnL7cGc","5Drn09rlg9","8cVD3K4GS8","vOqCE9GXkX","prNT6lViBv","U3yw5vLsmS","JRJQBReKEW","oVQp6jS1aj","ulk41lsQGo",
+"FVMxoCdyBV","8FmFHpiJSk","SbRYyaez9y","ZUnqt7fKYU","WreyP5iGN5","pT8wuFVMxo","FxX9qS2Dfu","ydG8UnFqik","Mm8siDz1R3","zY1GYBFkb8",
+"HzZT8MojnP","ZhwG1atef2","7fsYMdpe1v","StlDJECMvU","QWxoT9iGoT","tuDyS9y4lw","qaofNgIYvE","djsrvn1pmO","P6bcgTXQ0Z","B3qemJ2mQi",
+"xciqpW3VFH","DLhzMjiVBP","K20wK16lHc","Pb1paChuy3","O3iyQeuZA5","FcWrW5ZaEz","JKWYRRBhp0","gjUTujfREu","soy9tlCMxy","gtCA5wiHrZ",
+"yofH3No0Qb","14FLR9XyT9","zY1GYprNT6","VNCPdWaim6","TXQ0ZXyPZN","LewvMksJby","8TxD7lViBv","MojnPqQxHP","HP4334W0Tl","aDGtSCNHmv",
+"Cfgr3QssNC","hYBCKn1pmO","L7cGccShY2","dpe1vBGaQY","tl72WuPX7G","0PktI1v5hH","Dz1R3In3NS","Vprf2azIWp","AOgEeuPX7G","zz4ZU8cVD3",
+"580YDcL0aE","lkMUAQssNC","NhXduW7cTs","xciqpMmsIo","VjCZq9XyT9","7lUXZ0Kyfs","zY1GY7fKYU","O3iyQqQxHP","v1Hlnmz8gx","yluBxCNHmv",
+"tjQxslH1kt","Oz8yZHlUbF","bZLvS5Drn0","K20wKK20wK","I7p2a4dEz6","5iGN5brhlQ","IBe8khYBCK","MGlTF7fsYM","uJScXuTacx","gdQsS2DREs",
+"Y1mC0JJs5m","8cVD3O3iyQ","5drc6jS1aj","bgJAzWDVWJ","DG4sTi7WMQ","8FmFHVLTy6","2ZHdklm0pD","fFDrJksJby","RzaZAOHaBz","4W0TlW3VFH",
+"Mm8siW7cTs","KASQ8OxWIH","lXFOBix74r","ciuWzVprf2","J2mQiNo0Qb","0BmCyxReec","MaJQsZhwG1","dpe1vEdBKc","6q6L9lweGy","QbxXcDG4sT",
+"EOE1oQYxC0","JJs5mqUJMd","QWxoTfaHir","0MR5X7X3uy","Pb1pafmIK1","OUYuFqQxHP","aL6AJWmadA","MmKGJnlaBy","Kr8ysprNT6","zbIYY0Kyfs",
+"TXQ0ZVjCZq","HRxd8iKqhr","DQimpix74r","EOE1oI7p2a","16lHcoQ87r","oVQp6tuDyS","vLsmSHzZT8","Nxx9VpmeCd","lpF6W8U2nU","AkKTk5ZaEz",
+"zbIYY6AFT0","RACujChuy3","dQ586XflUq","lXFOBUlU3M","atef2jtn0X","n8pJ9Ss0Zu","UmaEvJKWYR","lViBvM6qcG","uupzks7Mxk","Yw2oUVLTy6",
+"e6e4zDQimp","lViBv7lUXZ","taOXKb29RJ","tjQxs0h1b1","Ss0ZukZANm","lm0pDi7WMQ","pT8wuTXQ0Z","lkMUAWMiS3","fqypynlaBy","In3NShe9IA",
+"kZANmdjsrv","45cIHS2Dfu","UlU3MSs0Zu","AkKTkwDajX","4QMc9Cfgr3","t98iWQnJ1S","Mm8siQYxC0","9iGoTK20wK","wiHrZsx5Gl","0PktIpiJSk",
+"o8Uyds93Ml","gdQsSuPX7G","LbRTHnnP8o","0PktIZv7z0","XyPZN4QMc9","2Nslmn1pmO","9eoRc16lHc","7fsYMqaofN","UmaEvoGu6x","iB08lydG8U",
+"MK07YguMb8","guMb8BFkb8","oVQp6jSjS3","AmdQdbZLvS","hE1QlQClRL","tl72W7hyVv","h1zcHYOfrY","kB5nPSWfou","Cfgr3pvgjS","XflUqRxrsm",
+"soy9tnFqik","iKqhriB08l","G1RhSMkgy8","Ss0Zudpe1v","ni2v1he9IA","B3qem9iGoT","uZPqgtaOXK","NOHszVBjhz","dQ586Yw2oU","16lHcW7cTs",
+"k85Ae7fsYM","0ao3l0Wr5y","ulk41lm0pD","UlU3MzHF1q","FNYIM8TxD7","MK07YpiJSk","uQIczXyPZN","9rlg924ARF","uvf7AM6qcG","GXdoHFwEJz",
+"m4bxUuupzk","VLTy6Q6hMC","lweGydpe1v","h1zcHhUTw7","MmsIoJ2mQi","dQ586nFqik","jSjS3FGzgp","m4bxUM3zXL","jtn0X0MR5X","Dz1R3tAOsr",
+"No0Qbsoy9t","J2mQin1pmO","uTacx07n1c","BGaQYxciqp","8hJdtb29RJ","FLsphfmIK1","a00b5IBe8k","uPX7GuJScX","zz4ZUt59lR","fqypyAmdQd",
+"X6Pin16lHc","U3yw5d85a9","fFDrJzY1GY","tuDySRBhp0","ZuDtDZUnqt","StlDJ1j5L8","DQimp2Nslm","AkKTk07n1c","jtn0X7fKYU","nFqikgtCA5",
+"o8UydPOUYS","azIWpfLNg8","uQIczsqVrf","lpF6WXyPZN","kZANmpiJSk","rKDLJe6e4z","wiHrZJIqXi","HfyNQ8hJdt","FFDuiuN6r3","Kr8ysm4bxU",
+"4W0TlFLsph","2Yz7E7ku1p","07n1c8cVD3","W7cTscmXIX","wDajXrz7Ut","5ZaEzCIShG","JJs5mM3zXL","FjHXRh1zcH","YOfrYzz4ZU","2ZHdk580YD",
+"aez9yY1mC0","FVMxo0h1b1","29QAzn8pJ9","48cHLQssNC","Ss0ZuazIWp","gdQsSDz1R3","16lHcEdBKc","RmDcr580YD","xciqpuvf7A","ni2v1EdBKc",
+"piJSkNOHsz","ZJTXH618Di","xciqpHRxd8","i7WMQn1pmO","ECMvUmX2GE","s4786uN6r3","JIqXiLDk6f","X6PinIBe8k","JJs5mQClRL","K20wKnFqik",
+"O3iyQjzUqR","taOXKhYBCK","FnPFBy94nw","U3yw5W7cTs","QWxoTcL0aE","uAWypUlU3M","WPmlx0Wr5y","WMiS3tAOsr","RkQkeFGzgp","O3iyQNAFuw",
+"W3VFHsoy9t","9eoRcqaofN","uoStwvkCHH","Y1mC08cVD3","lweGyAgJHQ","ZUnqtQ6Lix","ydG8UYjB9t","2ZHdkv8yFN","TXQ0Z4QMc9","uAWypRmDcr",
+"AmdQd7fsYM","s93Mlgf8rI","3weIF24ARF","XflUqJXljW","ZhwG17fKYU","5drc65IhmG","gf8rIlXFOB","QworuJkzUn","Cfgr3DQimp","uvf7AIjTwP",
+"AmdQdKASQ8","9iGoTuupzk","nlaByvOqCE","Yh1hFokgRi","RpBQmt98iW","hYBCK5nmWv","m4bxUlCMxy","lCMxyS77LH","XyPZNzqH0W","uTacxlCMxy",
+"zmLYDWDVWJ","SmGzvJKWYR","3weIFv2eC3","v8yFNVprf2","IKxdLdQ586","yToGWQ6hMC","AkKTk1LB1L","SWfouMK07Y","L7cGcDG4sT","l83UdlH1kt",
+"NhXdu45cIH","rz7Ut1LB1L","In3NS14FLR","Oz8yZPb1pa","uAWyplH1kt","dmoS7IKxdL","guMb8OHaBz","aez9yoVQp6","zHF1qKASQ8","24ARFm4bxU",
+"HRxd8UlU3M","14FLRUl4a1","HRxd8GXdoH","lXFOBQworu","5drc6okgRi","AgJHQ0ao3l","mX2GEU3yw5","jSjS3Yh1hF","tjQxsVIlwP","suY4x6AFT0",
+"HzZT8tl72W","jtn0XWMiS3","6q6L9OUYuF","x3LDelCMxy","8cVD3D6rBy","Oz8yZl83Ud","QWxoTSjskQ","JXljW4W0Tl","7ku1pxReec","VjCZqFjHXR",
+"m4bxUv1Hln","qQxHPb29RJ","y94nwCK5W7","5iGN55nmWv","3weIFW3VFH","Cfgr3Q6hMC","Rxrsm45cIH","6q6L9QssNC","2TRI7nnP8o","OHaBzMmKGJ",
+"FxX9q5iGN5","v2eC3rz7Ut","Yw2oU55rfB","BCxeCPYBf4","5iGN5GXdoH","SmGzvdhSuH","d85a9EdBKc","MaJQsMmsIo","Ul4a1gtCA5","yToGW3otm6",
+"uPX7Glj07Q","L7cGc5drc6","IBe8kYjB9t","lweGyAXpwE","uAWypYw2oU","VIlwPiqv4k","Dz1R3ru4UG","faHirDz1R3","CNHmv1LB1L","zz4ZUyluBx",
+"CK5W7Y1mC0","v2eC3yluBx","29QAzDz1R3","zqH0WCqqaD","FFDuiNOHsz","Z4I1vtaOXK","RzaZAIjTwP","9eoRcsqVrf","nFqikzY1GY","iqv4kvOqCE",
+"Ss0ZuJ2mQi","tjQxsOz8yZ","RmDcrgdQsS","0Wr5yFLsph","AXpwEt98iW","x3LDefcwDa","Q6Lix07n1c","jtn0XGrDg7","0Kyfs9iGoT","C2IrcG1RhS",
+"kB5nPtvdkD","zY1GYS2Dfu","n1pmOtl72W","KZamHlCMxy","pvgjSgdQsS","POUYShi5X7","5nmWvSWfou","Q6Lix9eoRc","ni2v1Ss0Zu","O3iyQWmadA",
+"cL0aE9rlg9","2DREsjfREu","n1pmO9y4lw","1j5L8uoStw","ZuDtDnFqik","jfREuzmLYD","gIYvEOHaBz","s93MlXflUq","D6rByYOfrY","9eoRcpT8wu",
+"5Drn0Nxx9V","5drc6IKxdL","D6rByDG4sT","2hEEUQssNC","Ul4a1JXljW","iB08lBGaQY","Oz8yZEoToP","Nxx9VK20wK","ulk41RpBQm","1v5hHIRh48",
+"FVMxoatef2","VerEAU3yw5","VerEAC2Irc","F6PT2t98iW","JIqXiSbRYy","brhlQfcJOy","0MR5XsuY4x","BFkb8qaofN","TwanouN6r3","FnPFBfFDrJ",
+"xciqpRzaZA","VerEAjfREu","6AFT0MK07Y","0Wr5y0YAGH","zHF1qIBe8k","1LB1LvkCHH","KASQ84QMc9","tuDySfcwDa","t98iWeuZA5","OxWIHpiJSk",
+"WmadAEdBKc","0Wr5yDG4sT","ydG8U0YAGH","pT8wuCdyBV","Uvlv4fcJOy","RACujsqVrf","ReKEWuLtKs","ZuDtDcmXIX","QnJ1SOxWIH","y94nwHzZT8",
+"b29RJn1pmO","fqypyW3VFH","pvgjSUvlv4","fcwDaNcICA","MmKGJdmoS7","iB08lfLNg8","QChxsCdyBV","aL6AJW7cTs","Pb1padpe1v","h1zcHdmoS7",
+"gjUTuCxVEf","pv0i7iwzGk","lkMUAyofH3","8FmFHlViBv","BGaQYciuWz","vOqCE1j5L8","Waim6sx5Gl","jtn0XksJby","7hyVvfaHir","kB5nP9iGoT",
+"RACujDG4sT","4W0Tl9GXkX","qaofNFcWrW","GWqqXfmIK1","mz8gxBbwgA","M6qcGMkgy8","zHF1qtlILt","Kr8ysOz8yZ","TwanoOxWIH","BFkb8ZUnqt",
+"VIlwPWreyP","uLtKsZzJHW","VjCZquoStw","uTacxsoy9t","5Mg9r4W0Tl","7X3uymX2GE","dhSuHhYBCK","Q6hMCpiJSk","FwEJzdhSuH","lkMUACIShG",
+"ni2v1AOgEe","rKDLJNhXdu","0YAGHUvlv4","7fKYUaez9y","Cp3mZn8pJ9","LewvMDQimp","G1RhSAIYUu","WMiS3ix74r","KsjRK0BmCy","29QAzVerEA",
+"LbRTHatef2","wDajXZhwG1","QClRLt59lR","2NslmQWxoT","RzaZACxVEf","uLtKsBbwgA","GXdoHlj07Q","Y1mC0IKxdL","hYBCK9iGoT","1LB1LuAWyp",
+"1LB1LRxrsm","GrDg7piJSk","lViBvlpF6W","zHF1qiqv4k","YjB9td7vjM","CdyBV9GXkX","pFrrl0MR5X","qUJMdtl72W","tuDyStAOsr","U3yw507n1c",
+"Q6hMCvOqCE","7fKYUgdQsS","XflUqRsQUq","9XyT9Y1mC0","iwzGk2hEEU","pmeCdsuY4x","jtn0XtuDyS","Nxx9VFhtgl","uZPqg0BmCy","JKWYRAOgEe",
+"6q6L91j5L8","lm0pDFcWrW","i3pydjiVBP","yofH3ZzJHW","S2Dfu9iGoT","i3pydZUnqt","Yf2EcUl4a1","uJScXsuY4x","qaofN0YAGH","QnJ1SQ6Lix",
+"YjB9tJJs5m","Mm8sipAhR1","OUqFM29QAz","t59lR1LB1L","LewvMfcwDa","29QAzs7Mxk","W3VFHgjUTu","jzUqRQClRL","pT8wuqaofN","CxVEfNcICA",
+"hE1QlWaWsv","Cfgr3OUqFM","ZhwG1gjUTu","9GXkX5ZaEz","oVQp65nmWv","lCMxy5VZjS","gjUTuZJTXH","618DiOz8yZ","QWxoTSWfou","Z4I1vs93Ml",
+"RACujmz8gx","fLNg8PYBf4","gdQsSfmIK1","LewvMJRJQB","jSjS3Z4I1v","YjB9tW3VFH","pAhR1e6e4z","DLhzM2hEEU","W7cTslm0pD","JRJQB5Mg9r",
+"WreyPK4GS8","QnJ1S5VZjS","KASQ8xciqp","9iGoTVBjhz","Yf2Ecs93Ml","Yw2oUx3LDe","580YDuJScX","I7p2ayluBx","BFkb8FPfSE","lm0pDa00b5",
+"jtn0XmX2GE","BCxeCsqVrf","AXpwEfLNg8","FhtglQYxC0","LewvMOxWIH","cL0aEIjTwP","s7MxkoGu6x","hYBCKogLgc","blLA9In3NS","POUYSHzZT8",
+"pv0i7ZhwG1","J2mQiFxX9q","0ao3lt59lR","lj07QQYxC0","O3iyQX6Pin","5drc6gdQsS","s7MxkcQOnv","guMb855rfB","tAOsrChuy3","8cVD3DcpWB",
+"rhl0JJIqXi","X6PinpWiOs","G1RhSMK07Y","tjQxsFGzgp","VNCPdGSQwj","lCMxyFGzgp","Mkgy8MK07Y","vkCHH8hJdt","Uvlv4hSSvQ","azIWp5Mg9r",
+"HfyNQYjB9t","6q6L9v1Hln","OUYuFciuWz","pv0i77Ow5C","oVQp6IRh48","QWxoTgdQsS","UlU3M9y4lw","FxX9qFxX9q","Yf2EcyToGW","OHaBz8cVD3",
+"hi5X7Q6hMC","zFgtBk85Ae","iKqhrcShY2","In3NSWDVWJ","cmXIXS77LH","In3NSAXpwE","3otm6zmLYD","AkKTk9GXkX","F6PT2blLA9","zHF1qlj07Q",
+"StlDJfcwDa","lsQGot98iW","gdQsSJXljW","G1RhSlweGy","bgJAzGv3Fq","k85Aeiqv4k","5Drn0ogLgc","VIlwPzQt6Q","IBe8kv2eC3","AgJHQnFqik",
+"L7cGcFcWrW","AkKTktjQxs","OUYuFGWqqX","qQxHPfaHir","DQimpBbwgA","tjQxsuJScX","WaWsvsqVrf","zmLYDpAhR1","GWqqXWDVWJ","MmKGJbrhlQ",
+"AXpwEtvdkD","7hyVv1LB1L","VIlwPciuWz","oVQp6yEfy9","O3iyQMaJQs","TwanoNhXdu","RpBQmHRxd8","8U2nUCdyBV","brhlQiB08l","Cfgr3CdyBV",
+"lViBvNhXdu","JJs5m6q6L9","2ZHdkiqv4k","NhXdupFrrl","GrDg7oGu6x","FwEJzyToGW","WmadA580YD","Dz1R3ksJby","d7vjMoGu6x","ogLgcNcICA",
+"he9IAFwEJz","EdBKcvLsmS","FVMxouTacx","FcWrW0Wr5y","zqH0Wa00b5","YOfrYRxrsm","lsQGoPb1pa","D6rByMojnP","FNYIMWDVWJ","uLtKs2ZHdk",
+"0h1b1Uvlv4","EOE1oGv3Fq","cmXIXDLhzM","In3NS3weIF","3weIF4QMc9","JJs5mOxWIH","lViBvdmoS7","DcpWB8RCUA","VBjhzksJby","Oz8yZJKWYR",
+"BpYhVOxWIH","l83UdzmLYD","O3iyQFVMxo","dhSuH7hyVv","8RCUAl83Ud","fqypyP6bcg","3otm60ao3l","GrDg77lUXZ","7fKYUZJTXH","ciuWzG1RhS",
+"FnPFB9iGoT","tuDySlkMUA","suY4xPb1pa","bZLvSQYxC0","XflUqFjHXR","C2IrcGXdoH","taOXKzQt6Q","MezSWcL0aE","rKDLJ0YAGH","MojnP7X3uy",
+"CqqaD8RCUA","dhSuHDQimp","lsQGo5drc6","gf8rIkB5nP","5Drn0yluBx","sqVrfSWfou","G1RhSKsjRK","SmGzvCK5W7","4dEz6FNYIM","jfREui7WMQ",
+"GSQwjQbxXc","cQOnvuQIcz","WPmlxkB5nP","gdQsSOHaBz","AXpwEpFrrl","QbxXc24ARF","POUYSVerEA","jfREuRkQke","l83Udt98iW","fLNg8I7p2a",
+"RsQUq2ZHdk","LDk6flXFOB","pFrrlnlaBy","580YD9XyT9","Zv7z0tvdkD","AOgEeRmDcr","0Wr5yFwEJz","QWxoTaFFss","l83Ud8U2nU","8TxD7Nxx9V",
+"2NslmMmsIo","3weIF48cHL","o8UydHfyNQ","1j5L80ao3l","xReecOz8yZ","F6PT2wiHrZ","No0QbcShY2","uAWypeuZA5","FLsphGv3Fq","oQ87rjeskS",
+"9rlg9iKqhr","KsjRKi7WMQ","sx5GlrKDLJ","faHiraez9y","guMb8JRJQB","l83UdIn3NS","lm0pDMGlTF","qaofN8hJdt","5VZjSGXdoH","14FLRWMiS3",
+"7ku1p0PktI","Vprf2LbRTH","he9IA5IhmG","fqypyjzUqR","iKqhrMK07Y","POUYS2ZHdk","HP433ru4UG","ZhwG1W3VFH","zQt6QcL0aE","lsQGofcJOy",
+"l83UdAIYUu","Z4I1vsoy9t","fFDrJCIShG","5Mg9rlj07Q","CIShGuZPqg","VBjhzMmsIo","ZuDtDChuy3","blLA9AOgEe","fcwDaoQ87r","jiVBP5Namm",
+"wDajXtuDyS","O3iyQ2ZHdk","NcICAGv3Fq","KZamHSbRYy","F6PT2JkzUn","rKDLJh1zcH","VLTy6EdBKc","Chuy3h1zcH","suY4xLDk6f","nlaBy8FmFH",
+"UlU3MlpF6W","fcwDaAOgEe","HP433ogLgc","xXTI4guMb8","dhSuHOz8yZ","aL6AJ2DREs","gf8rIt98iW","2DREsJkzUn","d85a97ku1p","FLsph55rfB",
+"cL0aEM3zXL","Mkgy89GXkX","zbIYYChuy3","FVMxo0Kyfs","v2eC3U3yw5","tjQxsCfgr3","pvgjS14FLR","dpe1vjfREu","aL6AJlH1kt","aL6AJlCMxy",
+"y94nw0PktI","48cHLOHaBz","i7WMQ29QAz","NAFuwvOqCE","tl72WIKxdL","aDGtSNo0Qb","48cHLMezSW","48cHL6q6L9","HRxd8JIqXi","B3qemyluBx",
+"14FLRNOHsz","oVQp6a00b5","FFDuipAhR1","8cVD3ni2v1","Cfgr3oVQp6","aez9yuZPqg","IjTwPYf2Ec","kZANmNhXdu","AOgEeLDk6f","POUYScShY2",
+"In3NSUlU3M","7lUXZtAOsr","dmoS7lpF6W","29QAzQworu","CqqaDgf8rI","9XyT9pFrrl","QYxC0jS1aj","5Drn0fmIK1","kZANmaez9y","cQOnv9eoRc",
+"hSSvQjzUqR","RpBQmZUnqt","kB5nPwiHrZ","Q6hMCUlU3M","pmeCdjS1aj","MK07YSjskQ","0YAGHuQIcz","s93MlRpBQm","ogLgcTa8f6","K20wKD6rBy",
+"uupzkuQIcz","cShY2Ta8f6","fLNg8a00b5","ZuDtDfmIK1","uoStw9iGoT","pv0i7aFFss","KASQ8ReKEW","ciuWzfaHir","ZzJHWS2Dfu","mX2GEyEfy9",
+"m4bxUNxx9V","WDVWJWmadA","TwanoWDVWJ","cmXIXd85a9","FjHXRuvf7A","CNHmvrKDLJ","uupzkSjskQ","XflUqUvlv4","8cVD3XyPZN","5ZaEz9GXkX",
+"M3zXLpmeCd","tjQxsgf8rI","2DREslweGy","QWxoTYf2Ec","uvf7Apv0i7","TXQ0ZTa8f6","P6bcgyToGW","XyPZNBGaQY","EoToPzQt6Q","SjskQ7Ow5C",
+"5iGN5DG4sT","POUYSSmGzv","GrDg7jS1aj","tjQxsgjUTu","t59lRuLtKs","JKWYRyEfy9","9XyT9L7cGc","prNT6l83Ud","24ARFWreyP","HlUbFn8pJ9",
+"EoToPNhXdu","AkKTkQbxXc","ix74rcmXIX","Oz8yZX6Pin","SjskQ0MR5X","uN6r37fsYM","FGzgpOUYuF","M6qcGF6PT2","rhl0JGXdoH","HP433jiVBP",
+"HlUbFzbIYY","FLsphpFrrl","yluBxzmLYD","yvOMIi7WMQ","BGaQYQworu","D6rByRACuj","Vprf2FcWrW","Oz8yZGXdoH","zbIYYHlUbF","FhtglpWiOs",
+"AOgEeaL6AJ","vkCHHfFDrJ","Kr8ysi7WMQ","RBhp0QWxoT","VerEARmDcr","fLNg8MmKGJ","48cHLIn3NS","55rfBHRxd8","NOHszIjTwP","S77LHO3iyQ",
+"nnP8oGWqqX","jeskSogLgc","VNCPd0Wr5y","29QAzbgJAz","7ku1p7Ow5C","rhl0J8hJdt","W7cTs8xEKz","ZhwG1Ss0Zu","GWqqXLbRTH","uoStwo8Uyd",
+"rhl0JU3yw5","s7MxkJKWYR","0Wr5ygf8rI","DcpWBru4UG","uvf7ApmeCd","tjQxsU3yw5","Q6hMCXflUq","NAFuwUvlv4","ix74rJIqXi","lpF6Wi3pyd",
+"lsQGoJkzUn","n8pJ9Ul4a1","ZuDtDulk41","Kr8ysiKqhr","U3yw5StlDJ","HfyNQtvdkD","kZANmzqH0W","v8yFNhSSvQ","s93MlKsjRK","qUJMdJJs5m",
+"HzZT8lpF6W","6q6L9zHF1q","FLsphJXljW","CqqaD2DREs","vkCHHStlDJ","l83UdQ6Lix","bZLvSbgJAz","AXpwEOxWIH","zmLYDRpBQm","qQxHPaez9y",
+"y94nwAIYUu","PYBf4Cfgr3","ECMvUWreyP","FGzgp0ao3l","i3pydtuDyS","gf8rI0PktI","Chuy3dQ586","WreyP14FLR","FwEJzRkQke","DQimpFFDui",
+"1j5L8dpe1v","FcWrWxXTI4","RsQUqcL0aE","HP433D6rBy","djsrvO3iyQ","CNHmv9XyT9","tjQxsaez9y","8TxD7XflUq","iqv4kJ2mQi","HfyNQFNYIM",
+"zQt6QpvgjS","FGzgpjzUqR","uJScXuupzk","KZamHprNT6","QChxsiB08l","4W0TlSjskQ","7Ow5CzbIYY","8hJdtFxX9q","aL6AJtuDyS","fmIK1o8Uyd",
+"F6PT2uQIcz","hi5X7yEfy9","ZhwG1SjskQ","LDk6fRACuj","jS1ajbrhlQ","jtn0X5nmWv","SmGzvrKDLJ","5VZjSMmKGJ","uN6r37X3uy","Cfgr3RzaZA",
+"Waim69eoRc","QworuB3qem","8U2nUJKWYR","S77LHW7cTs","YjB9t7Ow5C","3otm6JKWYR","lweGyM3zXL","2Yz7EAIYUu","Cfgr3LDk6f","BCxeCL7cGc",
+"pv0i7L7cGc","BFkb8HlUbF","L7cGcrz7Ut","dpe1vMkgy8","qaofNMGlTF","Vprf2n8pJ9","WDVWJWaim6","QYxC08cVD3","ogLgcnFqik","4W0TlAIYUu",
+"8TxD7ZuDtD","24ARFzFgtB","1j5L8wiHrZ","GrDg70MR5X","vkCHHRmDcr","aez9yjeskS","bZLvSOUqFM","VNCPdhe9IA","RxrsmRpBQm","tjQxsECMvU",
+"mz8gxS77LH","Ul4a1POUYS","euZA5VerEA","s7Mxkix74r","s7MxkChuy3","Ul4a17ku1p","Chuy3kB5nP","S77LHVjCZq","Z4I1vfLNg8","hYBCKvLsmS",
+"7lUXZfaHir","YjB9t0MR5X","pAhR1Y1mC0","uPX7G0ao3l","gIYvEX6Pin","lpF6Wy94nw","RzaZAtAOsr","B3qemprNT6","No0QbKsjRK","n1pmOFGzgp",
+"JJs5mO3iyQ","b29RJb29RJ","WPmlxtAOsr","RsQUqs93Ml","fcwDani2v1","UlU3MQChxs","WaWsvTXQ0Z","pv0i7oGu6x","bgJAzNcICA","M6qcGMmKGJ",
+"Yh1hFb29RJ","S77LHCp3mZ","IRh48bgJAz","M3zXLguMb8","a00b5Ul4a1","55rfBF6PT2","0BmCyqQxHP","NcICAFcWrW","5nmWv580YD","rKDLJUmaEv",
+"kB5nPIRh48","Nxx9VuTacx","UmaEvRBhp0","KASQ8bZLvS","64s8NuQIcz","pFrrlZzJHW","RzaZAo8Uyd","CdyBVk85Ae","AOgEezY1GY","jSjS3yofH3",
+"JKWYREOE1o","TXQ0Z8hJdt","8RCUAuAWyp","tAOsrQnJ1S","618DiU3yw5","h1zcHP6bcg","lm0pDtjQxs","MezSWRsQUq","6AFT03weIF","hUTw7iwzGk",
+"RmDcrgIYvE","oGu6xvOqCE","2Yz7Ehe9IA","AOgEeZUnqt","8U2nU8RCUA","k85AeO3iyQ","x3LDee6e4z","Uvlv4C2Irc","I7p2acL0aE","UmaEvFLsph",
+"Pb1panlaBy","1v5hHi7WMQ","QClRLrKDLJ","nlaByaL6AJ","rz7UtAOgEe","pT8wu8TxD7","7X3uyzQt6Q","pvgjS2ZHdk","jeskSdpe1v","ix74rCfgr3",
+"FLsphFjHXR","lXFOBoGu6x","K20wKiB08l","jiVBPLbRTH","pmeCdIBe8k","QClRL0PktI","lweGyRACuj","M6qcGyofH3","ix74rX6Pin","zQt6QZzJHW",
+"JRJQBzQt6Q","4dEz6pWiOs","55rfBv1Hln","xciqpYh1hF","AkKTkJ2mQi","DQimpi7WMQ","h1zcHzz4ZU","gdQsSsx5Gl","CdyBVdhSuH","jtn0Xmz8gx",
+"4dEz62ZHdk","Mkgy8Gv3Fq","HfyNQsqVrf","fcwDaGWqqX","Kr8ysNcICA","HRxd8DG4sT","0BmCy5nmWv","zQt6QlH1kt","aDGtSaez9y","mz8gxCxVEf",
+"lweGySjskQ","7fsYMAXpwE","IBe8kvOqCE","ksJbyAkKTk","Q6LixFVMxo","lm0pDSs0Zu","rz7UtpvgjS","7lUXZ7fKYU","dpe1vru4UG","a00b5W3VFH",
+"fmIK1aL6AJ","CqqaDwDajX","2ZHdkksJby","2hEEUyluBx","JJs5muvf7A","zz4ZUwiHrZ","HP433MojnP","Q6LixZJTXH","9y4lwW3VFH","pFrrlfcJOy",
+"FnPFBFLsph","BCxeCdmoS7","2Yz7EuAWyp","dmoS7G1RhS","RmDcrQ6hMC","6AFT0pmeCd","Oz8yZ580YD","fFDrJaFFss","AgJHQkZANm","zbIYYRpBQm",
+"jzUqRThjNn","RzaZA8U2nU","FLsphHRxd8","QssNCJRJQB","55rfBFwEJz","taOXKTa8f6","1v5hHGSQwj","QChxsfqypy","aFFssWMiS3","4W0TljfREu",
+"0KyfsrKDLJ","zY1GYaL6AJ","Zv7z0AXpwE","KZamHHRxd8","U3yw5fLNg8","vLsmSFVMxo","euZA5y94nw","zY1GYLDk6f","Ul4a1ZhwG1","HRxd8ReKEW",
+"BbwgAnnP8o","mz8gxyofH3","QbxXcksJby","uTacxtAOsr","5Namm1LB1L","lm0pDMezSW","ix74r5drc6","CIShGzY1GY","fcJOyK20wK","BpYhVTXQ0Z",
+"IKxdLfFDrJ","KZamHWDVWJ","8U2nUEdBKc","brhlQpvgjS","SjskQgdQsS","POUYSuN6r3","EoToPsoy9t","8U2nUs7Mxk","d85a9TXQ0Z","JJs5mVjCZq",
+"MaJQsIjTwP","9eoRcgtCA5","8U2nUtAOsr","jSjS3BpYhV","oQ87r2TRI7","RBhp0k85Ae","7hyVvogLgc","guMb8MezSW","uoStwVprf2","iB08lGWqqX",
+"sqVrfbZLvS","kZANmpv0i7","WmadAjzUqR","VjCZq2Nslm","tvdkD5Drn0","mX2GEo8Uyd","fcwDaHRxd8","gIYvEHlUbF","i3pydBFkb8","d85a9aL6AJ",
+"fcJOy5Drn0","4W0TluJScX","Dz1R3NhXdu","OxWIH2hEEU","MmKGJ0YAGH","kB5nP29QAz","DLhzMqaofN","fcJOy8cVD3","he9IA5Drn0","0Wr5yx3LDe",
+"rKDLJ2TRI7","0h1b17lUXZ","vOqCEbZLvS","tl72WpmeCd","RmDcr5drc6","guMb8NhXdu","5iGN51j5L8","P6bcgoQ87r","WreyP0h1b1","VLTy6Yf2Ec",
+"0MR5XBbwgA","MGlTFoGu6x","aez9yuQIcz","a00b5uupzk","MGlTFyofH3","5nmWvkZANm","v8yFNuJScX","Twanos7Mxk","MmsIo0BmCy","WPmlxRsQUq",
+"K4GS88U2nU","SmGzv3otm6","Z4I1vLbRTH","s4786Vprf2","VLTy6tAOsr","FGzgptl72W","AXpwEn8pJ9","Gv3FquN6r3","7fsYMuQIcz","2Nslm16lHc",
+"Kr8ysjS1aj","07n1cm4bxU","uvf7AzbIYY","Waim6QYxC0","QWxoT4QMc9","JkzUnGv3Fq","G1RhSG1RhS","uAWyp8cVD3","lH1ktRxrsm","3weIFC2Irc",
+"6AFT0uZPqg","bZLvSzqH0W","pmeCdHP433","rz7Utni2v1","d7vjMydG8U","0KyfsazIWp","n8pJ9CNHmv","sx5GleuZA5","cQOnvmX2GE","atef2MGlTF",
+"tAOsr6AFT0","I7p2at98iW","gtCA58hJdt","euZA5VNCPd","pv0i7Qworu","t98iWru4UG","zFgtB24ARF","jS1aj7fsYM","kZANmrhl0J","h1zcHv2eC3",
+"0KyfsRACuj","FcWrWFPfSE","RsQUq7X3uy","VLTy6kB5nP","hYBCKCK5W7","uZPqgi3pyd","azIWpDQimp","mz8gxjeskS","Kr8ys8RCUA","0Kyfshe9IA",
+"vLsmSF6PT2","SmGzvB3qem","Twano4W0Tl","ThjNn0ao3l","ydG8Urz7Ut","faHiro8Uyd","ZzJHWlweGy","PYBf4gdQsS","QbxXcPOUYS","B3qemfFDrJ",
+"0ao3lVprf2","gjUTuQnJ1S","fFDrJaDGtS","l83UdEoToP","24ARFOUqFM","580YDRsQUq","t59lRFPfSE","yEfy9Nxx9V","VerEAhe9IA","FcWrWkZANm",
+"aL6AJvkCHH","yvOMIDcpWB","Zv7z0Mm8si","fFDrJkZANm","7ku1pyluBx","iB08lJKWYR","6AFT0gf8rI","GWqqXFjHXR","rz7UtlXFOB","GXdoHUvlv4",
+"oQ87rvLsmS","dmoS7DG4sT","VIlwP9rlg9","guMb80ao3l","0YAGHjzUqR","7fKYUoQ87r","HP433ZzJHW","ECMvUnnP8o","WDVWJ7Ow5C","Oz8yZCfgr3",
+"6q6L99XyT9","9y4lwguMb8","tuDySJIqXi","6AFT00BmCy","ni2v1zY1GY","In3NSzqH0W","WmadA1LB1L","iwzGkpvgjS","y94nw0YAGH","3weIFP6bcg",
+"WMiS3piJSk","Uvlv4h1zcH","No0QbciuWz","oVQp62Nslm","ksJbyqUJMd","t98iWECMvU","lweGyFhtgl","Mkgy82Nslm","uAWypMm8si","he9IAQnJ1S",
+"jzUqRWMiS3","Zv7z0O3iyQ","zHF1qVjCZq","VerEADQimp","iqv4kW3VFH","Ul4a1lsQGo","Mkgy8P6bcg","RzaZAiB08l","SjskQbgJAz","cL0aEiwzGk",
+"aL6AJOUqFM","NAFuwm4bxU","uZPqguAWyp","rhl0JTCgPp","5drc6LewvM","aFFssuupzk","6AFT0azIWp","Kr8ysLDk6f","NOHszCdyBV","EOE1ofqypy",
+"cmXIXYw2oU","fcwDaFjHXR","0h1b1HRxd8","NcICAprNT6","hi5X7dmoS7","s4786QnJ1S","0h1b1qUJMd","55rfBcmXIX","IKxdLJkzUn","VNCPdGXdoH",
+"kZANm7ku1p","K20wKSbRYy","3weIFlj07Q","YOfrYK4GS8","soy9t8hJdt","uupzkpWiOs","0h1b1Ul4a1","FPfSEkB5nP","Nxx9V9iGoT","FjHXR5Namm",
+"pAhR148cHL","qUJMdIjTwP","9GXkX5iGN5","jiVBPsx5Gl","VNCPdpAhR1","4QMc9BCxeC","Uvlv4zY1GY","TXQ0ZQChxs","2hEEUbZLvS","tjQxsTa8f6",
+"Oz8yZgjUTu","h1zcHRxrsm","he9IANhXdu","BbwgAhi5X7","24ARFC2Irc","oQ87rpFrrl","wDajXtvdkD","FhtglVBjhz","AXpwEZJTXH","8U2nUXyPZN",
+"QworuJRJQB","JkzUnW3VFH","5nmWvMmKGJ","jzUqRzz4ZU","SbRYyJIqXi","0MR5X2hEEU","uPX7Grz7Ut","d7vjMOUYuF","8cVD3P6bcg","sqVrf9GXkX",
+"mX2GEQClRL","uJScXMm8si","BFkb8I7p2a","No0QbYf2Ec","Yw2oU0ao3l","he9IAUl4a1","G1RhSTCgPp","WaWsvZuDtD","i3pydtlILt","8U2nUpFrrl",
+"GrDg7atef2","v1HlnCdyBV","55rfBpAhR1","In3NSRpBQm","iB08liwzGk","AXpwEL7cGc","8TxD7oVQp6","3weIFuAWyp","GrDg7lCMxy","cQOnvciuWz",
+"lH1ktNcICA","VIlwP7hyVv","oVQp6KASQ8","hE1Qlatef2","l83UdZuDtD","2Yz7EnFqik","aFFss7Ow5C","aDGtS1LB1L","xReecHzZT8","fcJOy8hJdt",
+"okgRi48cHL","Gv3FqBFkb8","CdyBVQWxoT","VNCPd6AFT0","QClRLi3pyd","NhXduVNCPd","7hyVvjeskS","cL0aE7X3uy","QWxoT2DREs","zmLYD8xEKz",
+"VerEAlCMxy","SWfousqVrf","gIYvEKr8ys","lj07QGrDg7","h1zcHReKEW","uQIcz48cHL","rz7UtfLNg8","pWiOsOHaBz","CIShGNxx9V","fcwDaMK07Y",
+"soy9tThjNn","VLTy6tuDyS","D6rBydpe1v","CIShGEOE1o","bgJAzThjNn","prNT6MaJQs","ZUnqtciuWz","fFDrJzbIYY","W7cTsPOUYS","1j5L8MezSW",
+"zFgtBm4bxU","cL0aEuLtKs","S77LHfcJOy","lH1ktx3LDe","9iGoTtuDyS","jSjS3NcICA","3otm6FNYIM","nlaByk85Ae","S77LHix74r","EOE1oJJs5m",
+"M6qcGxReec","jeskSZuDtD","zFgtBMmKGJ","6AFT00h1b1","zY1GYksJby","QWxoTuoStw","BCxeCdhSuH","uTacxKASQ8","CdyBVuupzk","LDk6fQ6Lix",
+"aez9ySmGzv","9y4lwtuDyS","2ZHdkd7vjM","MojnPEOE1o","TXQ0Z2hEEU","VerEA5nmWv","kZANm9rlg9","5nmWvVBjhz","dQ586FPfSE","0h1b1VNCPd",
+"I7p2a2DREs","ZzJHWo8Uyd","48cHLuLtKs","JRJQB2Nslm","hUTw7gdQsS","a00b5VBjhz","sx5GlMaJQs","b29RJ2DREs","EOE1oWMiS3","Chuy39rlg9",
+"IRh48In3NS","aDGtSl83Ud","KsjRKjS1aj","OHaBzuPX7G","SbRYyVerEA","IKxdLAXpwE","ulk41WaWsv","lkMUAh1zcH","ReKEWMezSW","6q6L9xXTI4",
+"B3qemlsQGo","CqqaD8cVD3","5IhmGW7cTs","3otm6EOE1o","KASQ8tlILt","07n1c2hEEU","yEfy9MGlTF","S2Dfuo8Uyd","VerEAUl4a1","Mm8sihE1Ql",
+"AXpwECfgr3","SWfouQ6hMC","bgJAz5Namm","Pb1paJkzUn","GrDg7dhSuH","AOgEelm0pD","uJScXStlDJ","HP433jSjS3","Zv7z0m4bxU","NhXdu5iGN5",
+"NOHszpWiOs","8TxD7Cp3mZ","bgJAzOUqFM","aL6AJ29QAz","Kr8ysZv7z0","Nxx9VLbRTH","VjCZq4QMc9","YOfrYuN6r3","AgJHQpFrrl","TCgPp2ZHdk",
+"jtn0Xo8Uyd","vLsmSjeskS","9rlg9uZPqg","7fKYU0Kyfs","16lHcGSQwj","ZUnqtMkgy8","QnJ1SKZamH","WmadAVerEA","sqVrf5Namm","uLtKsFwEJz",
+"GrDg7F6PT2","ThjNnkB5nP","FxX9qSWfou","Y1mC0VLTy6","WreyPHP433","SmGzvOxWIH","s93MluAWyp","ReKEW29QAz","lpF6WaDGtS","uN6r3OUYuF",
+"GXdoHb29RJ","UlU3MeuZA5","LewvMtaOXK","8U2nU64s8N","zY1GYhE1Ql","piJSklkMUA","bgJAzRBhp0","guMb8GXdoH","1LB1LFnPFB","StlDJjSjS3",
+"WmadAL7cGc","suY4xhE1Ql","8cVD3Ul4a1","ZuDtDW7cTs","tAOsrqUJMd","iKqhrzmLYD","v8yFNlm0pD","Mkgy8e6e4z","xReecGSQwj","iwzGk7X3uy",
+"0YAGHYw2oU","lm0pDcmXIX","uJScXuAWyp","SjskQmX2GE","8RCUAcL0aE","GrDg7n1pmO","Q6LixazIWp","m4bxUFwEJz","a00b507n1c","QbxXcd7vjM",
+"FPfSE5IhmG","8cVD3fcwDa","Zv7z0e6e4z","uAWypdhSuH","t98iW7Ow5C","e6e4zJ2mQi","tAOsrYf2Ec","AOgEepmeCd","1v5hHiKqhr","IKxdLRBhp0",
+"QChxsKr8ys","VIlwPThjNn","AkKTkQ6Lix","Kr8ys1v5hH","M3zXLJIqXi","uN6r3pT8wu","8hJdtaDGtS","RmDcrFNYIM","5Nammsoy9t","Y1mC04W0Tl",
+"zz4ZUNcICA","Mkgy8lCMxy","TCgPpfaHir","9eoRcO3iyQ","K20wKDcpWB","2ZHdkl83Ud","QbxXc4W0Tl","7Ow5CVNCPd","qUJMdv2eC3","16lHcB3qem",
+"RkQkekB5nP","VNCPdy94nw","i3pydIn3NS","ZUnqtEdBKc","oQ87rdpe1v","Uvlv4aDGtS","8xEKzTCgPp","gIYvEfLNg8","7lUXZoQ87r","iKqhreuZA5",
+"d85a9ulk41","8FmFHhe9IA","MmsIoIn3NS","8cVD3hSSvQ","EoToP5Namm","POUYSaDGtS","8TxD7Waim6","uZPqgMkgy8","lViBvFjHXR","mz8gxyEfy9",
+"t59lRbZLvS","5ZaEzmz8gx","Rxrsm5Namm","ZhwG1rKDLJ","xReecjeskS","gtCA55nmWv","YOfrYBCxeC","FcWrWxciqp","lpF6WFLsph","AOgEeMkgy8",
+"KsjRK5IhmG","55rfBLDk6f","gjUTuFxX9q","piJSk9eoRc","taOXKd7vjM","Mm8siF6PT2","7Ow5CkZANm","jfREujeskS","7ku1ptvdkD","uupzkni2v1",
+"faHir24ARF","fmIK1soy9t","uupzkQChxs","YjB9tDG4sT","FwEJz7Ow5C","zmLYD48cHL","9eoRcVprf2","5Mg9rtl72W","vLsmSBbwgA","zY1GYUlU3M",
+"nnP8o8TxD7","FNYIMt59lR","JIqXiYw2oU","uTacxRzaZA","IjTwPsoy9t","prNT6fFDrJ","5VZjS16lHc","h1zcHMkgy8","WMiS30YAGH","FLsphyEfy9",
+"Yw2oUGrDg7","cQOnv5Mg9r","Gv3Fqm4bxU","s93MlCIShG","RBhp0s4786","pFrrlYOfrY","aez9yWMiS3","GWqqXVIlwP","9GXkXwDajX","dhSuHn1pmO",
+"Chuy3ReKEW","55rfBhSSvQ","ECMvU8xEKz","yToGWAIYUu","pFrrlqaofN","vLsmSyToGW","WDVWJ9iGoT","he9IAW7cTs","Yf2Ec4W0Tl","BbwgAWMiS3",
+"6q6L9y94nw","KZamHb29RJ","NOHszMkgy8","ulk41EdBKc","Uvlv4LewvM","VLTy62DREs","ZuDtDlViBv","DQimppmeCd","1j5L8HzZT8","Q6LixJ2mQi",
+"ydG8UogLgc","IRh485Mg9r","v8yFNtaOXK","BGaQYazIWp","cQOnvrz7Ut","UlU3MlCMxy","v2eC3hSSvQ","ZUnqtsuY4x","xXTI49y4lw","azIWpuZPqg",
+"tAOsrxXTI4","v1HlnuLtKs","hUTw7CNHmv","IRh485VZjS","55rfBsqVrf","uN6r3xciqp","UmaEvtaOXK","45cIHuQIcz","5Drn0X6Pin","ZJTXHbrhlQ",
+"aFFssMGlTF","RsQUqblLA9","pWiOsdjsrv","CNHmvYw2oU","FxX9qWDVWJ","8hJdthi5X7","2Yz7E0ao3l","yluBxRpBQm","QChxs7ku1p","oGu6xuQIcz",
+"xciqpMm8si","euZA52TRI7","QnJ1S0MR5X","7ku1puAWyp","7X3uyhUTw7","NOHszi3pyd","uTacxHRxd8","he9IAx3LDe","mX2GEtuDyS","gjUTu2Nslm",
+"OHaBzi3pyd","AkKTkt59lR","NhXdutuDyS","2TRI7MmKGJ","07n1cAOgEe","QClRL2hEEU","zHF1qBCxeC","lH1ktydG8U","fLNg8s4786","MK07YuZPqg",
+"7ku1ppFrrl","45cIHrhl0J","uQIczFxX9q","nlaByBpYhV","14FLRmX2GE","pvgjS0h1b1","MojnPd85a9","lXFOBAmdQd","ni2v1Yw2oU","m4bxUaFFss",
+"azIWpSbRYy","zmLYDAOgEe","8TxD7AkKTk","1LB1LoVQp6","jzUqRUlU3M","HlUbF9XyT9","BbwgAtaOXK","jSjS37ku1p","Zv7z07fKYU","hYBCKfaHir",
+"d85a9GSQwj","FcWrWeuZA5","jfREuVNCPd","jtn0XAmdQd","MK07YzY1GY","DcpWBuAWyp","FnPFBpWiOs","t98iWZv7z0","d7vjMix74r","euZA59y4lw",
+"Zv7z0P6bcg","XflUqaL6AJ","cShY27fKYU","kZANmKr8ys","GXdoHEdBKc","CxVEfv8yFN","s93Ml4QMc9","5drc6MaJQs","DQimpEdBKc","lj07QNcICA",
+"YOfrY24ARF","jfREuh1zcH","uTacx7lUXZ","cQOnvWaim6","618Di1LB1L","RpBQmjzUqR","aDGtSYOfrY","Yh1hFjzUqR","ydG8UF6PT2","kZANmL7cGc",
+"VLTy6FcWrW","J2mQi9GXkX","tAOsrAkKTk","MezSWxXTI4","qaofNtAOsr","EdBKcJRJQB","ThjNnCNHmv","ZzJHWrz7Ut","No0QbCdyBV","uvf7ADG4sT",
+"Cp3mZfmIK1","8hJdt7fsYM","TCgPpAkKTk","RzaZAiwzGk","TXQ0ZqUJMd","tlILtDcpWB","qaofNcQOnv","VNCPd29QAz","v2eC3IBe8k","0KyfsaDGtS",
+"AXpwEGXdoH","CK5W7ni2v1","0KyfsMK07Y","ni2v107n1c","pAhR10h1b1","taOXKVjCZq","FxX9qZJTXH","Qworujtn0X","AgJHQM6qcG","wiHrZDLhzM",
+"brhlQzQt6Q","ogLgcMmKGJ","FcWrWblLA9","FhtglzY1GY","StlDJGSQwj","Yf2EcFNYIM","jSjS3G1RhS","lweGyNxx9V","WmadAVLTy6","DcpWB5iGN5",
+"XflUqGSQwj","mX2GEYjB9t","ReKEWGv3Fq","dpe1vCIShG","JKWYRIBe8k","m4bxUStlDJ","suY4xJ2mQi","yToGWHlUbF","4dEz64QMc9","hYBCKydG8U",
+"CIShGAkKTk","lXFOBFNYIM","taOXK64s8N","8U2nUI7p2a","Y1mC064s8N","16lHclViBv","9GXkXAXpwE","TCgPpix74r","P6bcgOHaBz","1j5L84QMc9",
+"SWfouFnPFB","s93MlEoToP","RpBQmprNT6","Yf2Ec5iGN5","fcJOygjUTu","5VZjSWDVWJ","cQOnviKqhr","dQ586JXljW","9iGoTd85a9","qQxHPulk41",
+"uZPqggtCA5","FLsphtaOXK","pAhR1Mm8si","uupzkbgJAz","64s8NlpF6W","Yh1hFIRh48","piJSkdpe1v","jiVBPfcwDa","0YAGH5drc6","RsQUqPb1pa",
+"xReecGXdoH","7lUXZe6e4z","07n1cZJTXH","t59lRaFFss","EOE1oJIqXi","zbIYYgdQsS","NAFuwChuy3","vkCHHCNHmv","dhSuH48cHL","Waim6rKDLJ",
+"5ZaEzQworu","5Mg9rIRh48","IBe8kFNYIM","Q6Lixzz4ZU","5Nammtl72W","ZUnqtDG4sT","Mm8siPYBf4","I7p2afcwDa","K4GS8n8pJ9","h1zcHkB5nP",
+"DLhzMS77LH","QChxssqVrf","QssNC64s8N","7lUXZgIYvE","9y4lw9rlg9","fLNg80Wr5y","RsQUqFPfSE","1v5hHGXdoH","TXQ0ZWaWsv","cQOnvTa8f6",
+"7fsYMVjCZq","vOqCELDk6f","SWfouVjCZq","Yf2Eco8Uyd","hi5X75drc6","FPfSEVerEA","taOXKm4bxU","Pb1paeuZA5","RBhp0uPX7G","WaWsv14FLR",
+"lkMUAVerEA","ZUnqt7Ow5C","2DREsS77LH","LbRTHKsjRK","uvf7A8TxD7","1j5L8gdQsS","o8UydjS1aj","7fKYUYh1hF","tlILtoQ87r","zQt6QfFDrJ",
+"ogLgcYh1hF","9GXkXRpBQm","fcJOyYOfrY","pAhR1uQIcz","9XyT9MezSW","fqypyQChxs","LbRTHzQt6Q","he9IAyofH3","GrDg7DQimp","xReecYw2oU",
+"d7vjMAOgEe","NAFuwaFFss","a00b5v8yFN","B3qemjfREu","8hJdt8hJdt","aez9yiB08l","WPmlxMK07Y","Z4I1vK4GS8","Cp3mZjtn0X","uQIczdmoS7",
+"qQxHP2ZHdk","QClRLfFDrJ","GWqqXqaofN","dmoS7gtCA5","MGlTFkB5nP","TXQ0ZQ6Lix","zHF1qHlUbF","faHirv1Hln","L7cGcZUnqt","J2mQibgJAz",
+"NcICAyEfy9","wDajXv8yFN","VerEAS77LH","VBjhziB08l","Gv3Fqulk41","Y1mC0Pb1pa","G1RhSrKDLJ","F6PT2ZhwG1","9rlg9zmLYD","uTacxMaJQs",
+"lCMxyVjCZq","AkKTkDcpWB","QYxC0t59lR","AgJHQgIYvE","IjTwPqQxHP","Kr8ysGXdoH","zmLYDW3VFH","CxVEfazIWp","F6PT29rlg9","W7cTsni2v1",
+"RkQkeBbwgA","2TRI7GrDg7","4dEz6WmadA","9XyT9vkCHH","14FLRIn3NS","FGzgpy94nw","mX2GENAFuw","yvOMIix74r","n8pJ95Drn0","Cp3mZEoToP",
+"uTacxVprf2","jS1ajgdQsS","0PktIs93Ml","EOE1ohE1Ql","Gv3FqFcWrW","jeskSUmaEv","4dEz6gf8rI","nFqikM3zXL","OUYuFhUTw7","XflUq0Kyfs",
+"ix74ri7WMQ","DcpWBzmLYD","JRJQBNOHsz","mz8gxzFgtB","ECMvUSs0Zu","suY4xYjB9t","HfyNQCIShG","b29RJ48cHL","WreyPFwEJz","lCMxyVNCPd",
+"uLtKsuvf7A","2Yz7EuLtKs","RkQkerKDLJ","7fKYUsx5Gl","zz4ZUDQimp","YjB9tBGaQY","Mkgy8d7vjM","gjUTuyofH3","Oz8yZReKEW","5IhmGpAhR1",
+"29QAzRxrsm","X6PinlsQGo","ydG8UHP433","iB08lC2Irc","Rxrsm9rlg9","qQxHP2Nslm","i3pydVNCPd","FxX9qulk41","RpBQmC2Irc","ZJTXHjfREu",
+"Zv7z0DcpWB","bZLvSfmIK1","VLTy6M6qcG","cShY2jSjS3","Uvlv4gIYvE","TwanoZv7z0","Ss0Zui7WMQ","CNHmvxciqp","In3NSNhXdu","No0QbWDVWJ",
+"FPfSEAmdQd","vOqCEx3LDe","ReKEWVBjhz","hSSvQAIYUu","x3LDeBFkb8","hE1QlUl4a1","MaJQs3weIF","v1HlnZv7z0","G1RhSyofH3","No0Qb3weIF",
+"Pb1paCK5W7","Twano55rfB","QClRL6q6L9","7fsYMJXljW","StlDJyofH3","D6rByQssNC","CIShGK4GS8","2hEEUm4bxU","VIlwPe6e4z","C2Ircl83Ud",
+"Cp3mZ5Drn0","dQ586FwEJz","OUYuFlm0pD","5VZjSnlaBy","guMb8lH1kt","StlDJ3otm6","gtCA58RCUA","vkCHHI7p2a","YjB9te6e4z","1v5hHd85a9",
+"OxWIHrz7Ut","WaWsvblLA9","cShY2t98iW","Uvlv4IRh48","1v5hHX6Pin","2hEEUs7Mxk","lCMxyDQimp","Ss0ZuoQ87r","rKDLJt98iW","AOgEeWMiS3",
+"ZUnqtlViBv","nlaByNxx9V","WPmlxFGzgp","EoToPUlU3M","RsQUq7fsYM","vkCHHPOUYS","d7vjM9GXkX","Nxx9VtlILt","v1Hlndpe1v","lj07Qtl72W",
+"hE1Qldjsrv","X6PinRACuj","blLA90MR5X","9y4lwVjCZq","0MR5XSs0Zu","JKWYR9XyT9","qaofNjSjS3","oQ87rSs0Zu","8TxD7JJs5m","L7cGc48cHL",
+"5Nammxciqp","uJScXl83Ud","0YAGHulk41","MmsIo45cIH","7lUXZuvf7A","tjQxstl72W","Dz1R3WPmlx","MaJQs8cVD3","Pb1pacQOnv","OUYuFBpYhV",
+"n1pmO2ZHdk","2ZHdkaDGtS","HlUbFuZPqg","AIYUuB3qem","5drc6rKDLJ","8RCUAulk41","XyPZNuLtKs","8xEKzzmLYD","xReecChuy3","AXpwEb29RJ",
+"QYxC0tjQxs","X6PinRsQUq","In3NSlCMxy","pmeCduPX7G","MmsIoKr8ys","Ta8f6I7p2a","580YDMmsIo","EoToPuLtKs","VNCPdyluBx","sx5GlB3qem",
+"qQxHPQbxXc","ECMvUSbRYy","FxX9qyEfy9","yofH3AXpwE","GWqqXmX2GE","d85a9dhSuH","J2mQiuQIcz","he9IAgtCA5","zmLYDyToGW","9y4lw8TxD7",
+"GXdoH0YAGH","QWxoTWMiS3","MmsIosx5Gl","9iGoTzqH0W","55rfBDLhzM","HzZT82Yz7E","SjskQU3yw5","dmoS7m4bxU","RACujBpYhV","uTacx14FLR",
+"SjskQAmdQd","AkKTkWreyP","QClRLIKxdL","Q6LixmX2GE","ulk415Namm","LDk6fFVMxo","hE1QluQIcz","vLsmSv8yFN","JRJQBZzJHW","GWqqX8RCUA",
+"Zv7z0G1RhS","s4786qaofN","uoStwQYxC0","uPX7G9XyT9","Oz8yZhi5X7","v2eC3d85a9","JJs5mQworu","rhl0JqaofN","ZhwG1AIYUu","VerEAuZPqg",
+"0MR5XvkCHH","Gv3FqGSQwj","cQOnvQ6hMC","ydG8UkZANm","FNYIM0ao3l","xciqpGXdoH","zqH0W1j5L8","WmadAzqH0W","16lHcyluBx","jS1ajOUYuF",
+"zFgtB9iGoT","Yh1hFRzaZA","lH1ktM3zXL","Mm8siECMvU","VerEAaL6AJ","TCgPpPb1pa","QworuAOgEe","t98iWciuWz","n1pmOm4bxU","pAhR1I7p2a",
+"7ku1pzY1GY","tuDySSWfou","JJs5mBFkb8","ydG8UFcWrW","5Mg9rQWxoT","fqypyZuDtD","gf8rItlILt","FGzgppAhR1","hYBCKcmXIX","FLsph16lHc",
+"M3zXL9iGoT","EoToPHzZT8","ZzJHWuoStw","FnPFBIRh48","Pb1paStlDJ","jtn0XbZLvS","he9IAZUnqt","tlILtM3zXL","QssNChi5X7","8RCUAFNYIM",
+"AOgEeuoStw","2ZHdkqaofN","zFgtBMmsIo","ksJbypvgjS","x3LDeMojnP","l83Ud1v5hH","ydG8USs0Zu","S2DfuRxrsm","5IhmGLDk6f","gdQsSWDVWJ",
+"tl72WRBhp0","VLTy6CNHmv","KASQ845cIH","7hyVv9rlg9","fcJOyXyPZN","Cp3mZd7vjM","NcICAh1zcH","HRxd80BmCy","nFqikOHaBz","o8UydAgJHQ",
+"In3NS2hEEU","dpe1vtjQxs","oVQp6s7Mxk","rKDLJzY1GY","RACujrKDLJ","qaofNh1zcH","ZzJHWdpe1v","5Drn0wDajX","IBe8kIn3NS","P6bcg618Di",
+"ogLgcYf2Ec","d7vjMI7p2a","fFDrJn1pmO","MK07YQworu","3otm6DcpWB","Waim6Ss0Zu","BbwgAiqv4k","uLtKsSjskQ","cQOnvBCxeC","BpYhVSs0Zu",
+"TCgPpUmaEv","IKxdLXflUq","lViBvJIqXi","2ZHdk07n1c","fcJOyrz7Ut","blLA9azIWp","Dz1R3IRh48","uJScXUvlv4","BCxeC5IhmG","8FmFHFGzgp",
+"Pb1paWPmlx","KZamHlkMUA","07n1cpT8wu","Zv7z0lpF6W","yluBxuQIcz","3weIFaDGtS","faHirOHaBz","iwzGkCK5W7","2DREs64s8N","l83UdaL6AJ",
+"SbRYylsQGo","RBhp0iKqhr","aez9yfcwDa","FjHXRFnPFB","v2eC3LbRTH","JKWYRxciqp","lsQGoAXpwE","mX2GEhSSvQ","pAhR15iGN5","tl72Wuupzk",
+"FFDui9y4lw","0KyfsQYxC0","CK5W7ulk41","ydG8UJ2mQi","fcJOyi3pyd","pT8wuIKxdL","s7MxkcmXIX","djsrv0Wr5y","SmGzvs4786","l83Ud3otm6",
+"djsrv45cIH","5iGN5OUqFM","SjskQMkgy8","ni2v13otm6","JkzUnAgJHQ","BFkb8OUqFM","NOHszM6qcG","lpF6W5ZaEz","VLTy6cQOnv","JRJQBDLhzM",
+"oGu6xFFDui","i3pyd9rlg9","XyPZNkB5nP","0YAGHpmeCd","MmKGJ0BmCy","zqH0WLbRTH","5VZjS29QAz","LbRTH16lHc","7fsYMLbRTH","X6PinBbwgA",
+"iKqhrWDVWJ","RBhp0zbIYY","FjHXRogLgc","EoToP7X3uy","WreyPJXljW","DLhzMh1zcH","jSjS3dQ586","7lUXZ45cIH","5VZjSUmaEv","rKDLJ7hyVv",
+"SbRYyzqH0W","5ZaEzzz4ZU","VerEAJJs5m","16lHc0Wr5y","ZuDtDjtn0X","brhlQZzJHW","BFkb8lViBv","tl72WQChxs","vkCHHwiHrZ","RzaZAUmaEv",
+"HzZT8QYxC0","8RCUAYf2Ec","WMiS3Dz1R3","Ta8f6FFDui","Y1mC0v8yFN","aFFsswDajX","sqVrflViBv","6q6L9Ss0Zu","0h1b1djsrv","64s8N8TxD7",
+"fqypyWmadA","MaJQs0PktI","jfREu3weIF","azIWp3weIF","JRJQBJ2mQi","pFrrlLbRTH","lkMUAhSSvQ","9eoRctAOsr","cShY2Qworu","LDk6flweGy",
+"RkQkeqQxHP","rz7UtBCxeC","K20wK9iGoT","14FLRcmXIX","Yh1hFXflUq","QssNCZhwG1","zmLYDhYBCK","Mkgy8VIlwP","Ul4a1JKWYR","zmLYDtvdkD",
+"5Mg9rsoy9t","8cVD3ksJby","d85a9fLNg8","ECMvUX6Pin","yEfy9No0Qb","WMiS38FmFH","8U2nUvOqCE","RkQkeZUnqt","NhXduMm8si","5Drn0h1zcH",
+"fFDrJFPfSE","Yh1hFEOE1o","vOqCEjfREu","dmoS7aFFss","vOqCEsx5Gl","ru4UGlCMxy","pT8wuHP433","9rlg9h1zcH","ZJTXHMezSW","xXTI4qQxHP",
+"gtCA5Cfgr3","JXljWFGzgp","ECMvUfLNg8","yvOMIzQt6Q","VIlwPPYBf4","pmeCd5VZjS","lCMxysoy9t","U3yw5U3yw5","tuDySpiJSk","VLTy6JJs5m",
+"DcpWBlCMxy","45cIHbgJAz","NOHszQYxC0","HRxd8dmoS7","lpF6WCK5W7","s4786prNT6","pAhR1Gv3Fq","rhl0JRpBQm","UmaEvciuWz","gtCA5fcwDa",
+"Z4I1vNcICA","9GXkX7ku1p","5Drn0RsQUq","zbIYYyluBx","W7cTs9XyT9","GrDg7prNT6","FPfSEtuDyS","wiHrZgdQsS","cShY2sqVrf","B3qemmz8gx",
+"ydG8UM3zXL","PYBf4tvdkD","jeskSK20wK","5Drn0x3LDe","TCgPp7X3uy","K20wK24ARF","SbRYyGv3Fq","I7p2aPYBf4","VerEAuoStw","gIYvE0MR5X",
+"lkMUAsuY4x","okgRilCMxy","WDVWJi7WMQ","ix74rfaHir","hUTw7fcJOy","Y1mC0hi5X7","aez9yJKWYR","OHaBzuN6r3","WPmlxzFgtB","lCMxypT8wu",
+"kZANmksJby","soy9tXflUq","WPmlxblLA9","pAhR1zHF1q","Q6hMCyluBx","euZA5JIqXi","NhXdubZLvS","Zv7z0WaWsv","n1pmOy94nw","WPmlxv2eC3",
+"WPmlxfaHir","5Drn0atef2","ZzJHWaez9y","lpF6WFhtgl","6q6L9NcICA","45cIHtvdkD","tjQxsAIYUu","yToGWwiHrZ","fFDrJFwEJz","Uvlv4nFqik",
+"yEfy9ZzJHW","WMiS3ydG8U","lm0pD8hJdt","lCMxyaDGtS","In3NSv1Hln","nlaBy2TRI7","vLsmSXflUq","M6qcG2ZHdk","vOqCEZhwG1","mz8gxJRJQB",
+"RxrsmlpF6W","8TxD7uLtKs","uJScXzbIYY","EOE1orz7Ut","Dz1R37hyVv","2Yz7EuPX7G","No0QbuQIcz","gtCA5aFFss","8cVD3vOqCE","lsQGoMGlTF",
+"O3iyQxReec","iqv4kpmeCd","tAOsrksJby","EoToPCK5W7","VNCPdWreyP","sqVrfgf8rI","Vprf2G1RhS","n1pmORzaZA","VLTy6aL6AJ","lsQGoZ4I1v",
+"Q6hMCFGzgp","WMiS3xXTI4","Oz8yZVLTy6","VIlwPb29RJ","i7WMQWPmlx","TCgPp0YAGH","lm0pD2ZHdk","lpF6WuAWyp","L7cGcFjHXR","zmLYDL7cGc",
+"0MR5Xjtn0X","s7MxkrKDLJ","hi5X7lpF6W","LbRTHfaHir","No0Qb0Kyfs","618DiFPfSE","Ta8f6qaofN","KZamHtl72W","2Yz7E0h1b1","07n1ctvdkD",
+"FLsphWaim6","NcICAfFDrJ","2NslmWDVWJ","AgJHQ9eoRc","Yf2EcK20wK","K20wKFhtgl","JRJQBAkKTk","yEfy9IjTwP","U3yw5SbRYy","QnJ1Sk85Ae",
+"D6rByvkCHH","UlU3MZJTXH","vLsmSZJTXH","BCxeCQ6hMC","tuDySStlDJ","4dEz6b29RJ","CK5W7ReKEW","CqqaDCK5W7","KsjRK4QMc9","8hJdtZ4I1v",
+"gtCA5Twano","PYBf4uN6r3","oGu6xgtCA5","MmsIoZuDtD","MaJQsgf8rI","DQimplm0pD","QnJ1Sdjsrv","euZA5Cfgr3","Oz8yZydG8U","Chuy3UlU3M",
+"2TRI748cHL","oGu6xlweGy","Waim6Cfgr3","HlUbFdQ586","n8pJ9SbRYy","hSSvQZv7z0","QChxsvkCHH","tl72WWDVWJ","azIWpRpBQm","RpBQmcL0aE",
+"nFqikVLTy6","h1zcH8cVD3","OHaBzblLA9","euZA5JKWYR","UmaEvnlaBy","o8UydpmeCd","5nmWv2DREs","pAhR1wiHrZ","v2eC3NOHsz","3otm6iwzGk",
+"RkQkeyofH3","48cHLHlUbF","7hyVvaFFss","t59lRfaHir","BbwgAguMb8","X6PinK20wK","FVMxoQChxs","nFqikjfREu","4QMc9CNHmv","rz7UtVprf2",
+"Ss0Zuv1Hln","1LB1Lk85Ae","Yf2Ecgf8rI","zY1GYhSSvQ","Uvlv4POUYS","YOfrY7Ow5C","fLNg8UmaEv","iKqhrjzUqR","5Mg9rGSQwj","lViBv0MR5X",
+"Dz1R37fsYM","2TRI7k85Ae","VIlwPSmGzv","LewvMTCgPp","VLTy6FwEJz","Z4I1vHP433","hUTw7Kr8ys","yluBxuJScX","pmeCdBGaQY","d7vjMyluBx",
+"suY4xyToGW","pT8wuMmKGJ","IRh48aFFss","JJs5mn1pmO","BpYhV4W0Tl","ECMvUMojnP","s93MlAkKTk","yofH3kZANm","cL0aE8cVD3","5ZaEz0PktI",
+"RBhp0qUJMd","xXTI44W0Tl","S77LHJJs5m","sx5GlJXljW","6q6L95Drn0","BpYhVgf8rI","2Yz7Et98iW","wiHrZNOHsz","FjHXR3otm6","J2mQifcwDa",
+"lH1ktBpYhV","XflUqBCxeC","NAFuw0PktI","Ss0ZuuTacx","VLTy6CK5W7","qUJMdMmsIo","s4786Ta8f6","0h1b1soy9t","SbRYyBpYhV","0Wr5yM3zXL",
+"U3yw555rfB","5Drn0DcpWB","9rlg9gIYvE","Waim67ku1p","FxX9qd7vjM","5Mg9rFFDui","NcICAFwEJz","jiVBPNo0Qb","7X3uylCMxy","MmsIo9GXkX",
+"5NammXyPZN","TCgPppmeCd","nnP8oRsQUq","uupzkChuy3","ZJTXHVBjhz","2DREslm0pD","ZJTXHsuY4x","1j5L82Yz7E","nFqik48cHL","HRxd8QbxXc",
+"ksJbyyofH3","yEfy9J2mQi","tuDySAXpwE","Q6LixQbxXc","580YDK20wK","uN6r3jSjS3","MmsIozqH0W","DcpWB9eoRc","zz4ZUcShY2","n1pmOpAhR1",
+"DLhzMqQxHP","CIShGMm8si","580YDJKWYR","dpe1v3weIF","bgJAzcL0aE","piJSkrz7Ut","OxWIHrhl0J","pT8wubrhlQ","blLA9fcwDa","taOXKSs0Zu",
+"In3NSChuy3","8xEKzlCMxy","iB08lzY1GY","TCgPpNhXdu","v2eC3Ss0Zu","Cfgr39XyT9","yofH3IjTwP","2DREsDz1R3","S77LHXyPZN","v2eC3FFDui",
+"Ta8f64W0Tl","0ao3lFLsph","9eoRcZUnqt","lH1ktk85Ae","14FLRk85Ae","9XyT9mX2GE","Yh1hFuAWyp","fmIK1RACuj","8TxD7kZANm","gf8rIrz7Ut",
+"vkCHHzmLYD","QWxoT29QAz","JRJQBWreyP","14FLRkZANm","AgJHQ3otm6","CIShGUvlv4","zQt6QJkzUn","ZuDtDfaHir","YOfrYC2Irc","WmadAi7WMQ",
+"CNHmvjeskS","9XyT9SjskQ","2Yz7EQChxs","QYxC0pvgjS","Uvlv42DREs","UmaEvfaHir","lj07QNhXdu","xciqpatef2","QnJ1SoGu6x","euZA5lXFOB",
+"Oz8yZcQOnv","uN6r3S77LH","RBhp0EoToP","Gv3Fqx3LDe","HRxd8iB08l","VBjhzQChxs","qQxHP4dEz6","LbRTHpiJSk","RsQUqNo0Qb","9rlg9Vprf2",
+"v1HlnWmadA","EdBKcogLgc","EOE1on8pJ9","Gv3FqyofH3","fLNg8WreyP","gf8rICdyBV","taOXKSbRYy","qUJMdHlUbF","fqypyqaofN","1j5L8lH1kt",
+"NOHszkB5nP","atef2ru4UG","0MR5XtvdkD","hE1QlXyPZN","uN6r3FNYIM","cL0aE4dEz6","MGlTFyToGW","SWfouiB08l","FjHXRMezSW","mz8gxFPfSE",
+"s4786K4GS8","cShY2s4786","ciuWzt59lR","y94nw8RCUA","uupzk4W0Tl","QChxsRpBQm","cmXIXPYBf4","3otm6x3LDe","4W0Tl618Di","24ARFcShY2",
+"B3qemuJScX","n1pmOd85a9","WPmlxRmDcr","i3pydFnPFB","FLsphTwano","0PktI0YAGH","8FmFHKZamH","24ARFn1pmO","uAWyptAOsr","l83Ud580YD",
+"fqypy1j5L8","24ARFwiHrZ","WDVWJXyPZN","blLA9okgRi","7ku1pKASQ8","G1RhS0Wr5y","s7MxkVerEA","uvf7ABbwgA","W7cTssqVrf","SbRYyhSSvQ",
+"AOgEeiKqhr","JKWYRQworu","XflUqZzJHW","uAWypG1RhS","tjQxsjiVBP","JkzUnvkCHH","B3qemRxrsm","mX2GEUlU3M","FLsphStlDJ","pAhR15Namm",
+"euZA5qQxHP","9eoRccShY2","s4786KZamH","kZANmRsQUq","AXpwE2ZHdk","G1RhSYh1hF","rKDLJAOgEe","QbxXczY1GY","1LB1LAXpwE","M3zXLB3qem",
+"v1HlnOUqFM","WMiS3x3LDe","lm0pDkZANm","OUqFMzY1GY","SWfouyEfy9","tAOsrWaWsv","J2mQisqVrf","VjCZq1j5L8","CdyBVuLtKs","uoStwYjB9t",
+"ogLgch1zcH","hYBCKRsQUq","OxWIHzmLYD","4dEz6Z4I1v","Gv3Fq0MR5X","pFrrlQ6hMC","lViBvzQt6Q","uoStwpT8wu","oGu6xPYBf4","HP433nnP8o",
+"taOXKEoToP","7X3uy618Di","FhtglWPmlx","iwzGkFVMxo","JXljW9rlg9","OxWIHsuY4x","2TRI7gtCA5","iB08lVBjhz","Ta8f6lViBv","lViBvW7cTs",
+"piJSkaFFss","5NammMaJQs","vkCHHix74r","s7MxkQbxXc","l83UdMezSW","AkKTkXyPZN","SmGzvtl72W","blLA93weIF","Mkgy8zQt6Q","KZamHuoStw",
+"2hEEUvOqCE","dhSuHYh1hF","U3yw5DQimp","WreyPyvOMI","pT8wu5VZjS","JkzUndpe1v","QssNCK20wK","soy9tKZamH","oQ87r6AFT0","Ss0Zusoy9t",
+"FhtglCp3mZ","i7WMQ8TxD7","ix74rcShY2","8RCUARBhp0","SjskQwDajX","azIWpNcICA","o8Uyd8FmFH","dpe1vWreyP","wiHrZQWxoT","2NslmoGu6x",
+"BCxeCHlUbF","SbRYyAmdQd","3weIFMaJQs","guMb8FcWrW","FhtglZv7z0","8RCUAgdQsS","MojnPmz8gx","cShY2FVMxo","FLsphPb1pa","VNCPdbZLvS",
+"QbxXcOUqFM","Ul4a1ru4UG","0ao3lyofH3","yluBxKsjRK","ECMvU3weIF","QnJ1SlpF6W","GrDg7jeskS","RzaZAAOgEe","uvf7AP6bcg","suY4xfmIK1",
+"0h1b1aFFss","5iGN5ThjNn","Q6LixeuZA5","P6bcgVprf2","7Ow5CD6rBy","o8UydCp3mZ","AmdQd8U2nU","o8UydWPmlx","prNT6nnP8o","zY1GYuLtKs",
+"OHaBzI7p2a","CdyBVlH1kt","I7p2aEoToP","s7Mxk5drc6","Kr8ys29QAz","QClRLVLTy6","v2eC37fKYU","NhXduZv7z0","CdyBVVjCZq","uJScXuvf7A",
+"QChxsgf8rI","Yw2oUTwano","zHF1qMaJQs","Yw2oURBhp0","1LB1LUlU3M","DG4sTn8pJ9","BFkb8v8yFN","yEfy9EdBKc","okgRiYOfrY","suY4xQ6hMC",
+"8U2nUFjHXR","ciuWzlm0pD","5ZaEziwzGk","iqv4kHzZT8","yluBx1v5hH","uAWyplkMUA","rhl0JIjTwP","0ao3lulk41","XyPZNBpYhV","NhXduBpYhV",
+"7X3uyqQxHP","Mkgy8S77LH","qUJMdxciqp","8hJdtoGu6x","2TRI7RACuj","ydG8UO3iyQ","atef2JKWYR","1v5hHnFqik","0PktI9XyT9","taOXKVerEA",
+"suY4xOUqFM","l83UdzY1GY","FNYIMl83Ud","5ZaEzMkgy8","QssNCXflUq","tl72W8TxD7","uQIczhUTw7","0MR5XwDajX","ThjNnnFqik","WreyPciuWz",
+"BbwgA8cVD3","n8pJ9WMiS3","MK07YOUYuF","CIShGSbRYy","Rxrsmo8Uyd","RzaZANAFuw","2TRI7lH1kt","5nmWvSmGzv","PYBf4kZANm","Q6Lix0h1b1",
+"tjQxsZhwG1","jfREuWaim6","s7Mxkrz7Ut","PYBf4suY4x","cQOnvkZANm","okgRi0PktI","9rlg9rz7Ut","lpF6WYf2Ec","lViBv8xEKz","1j5L8uJScX",
+"9y4lwYh1hF","tjQxsFFDui","cmXIXe6e4z","2NslmeuZA5","jSjS3aL6AJ","OUqFMjfREu","cQOnvLbRTH","AmdQd5Namm","5nmWvNhXdu","lj07Qv8yFN",
+"RsQUqzmLYD","2Nslmb29RJ","hi5X7suY4x","Mkgy8vkCHH","DQimpXyPZN","HP433uPX7G","faHirM6qcG","kZANm5drc6","gf8rIpWiOs","QworuK4GS8",
+"xReecYh1hF","FxX9qpvgjS","5drc62TRI7","0YAGHStlDJ","D6rBy4W0Tl","blLA9HfyNQ","v2eC3qaofN","d7vjM1LB1L","UmaEvtl72W","yvOMI0MR5X",
+"G1RhSOUqFM","Nxx9VgjUTu","MGlTFYOfrY","UmaEvzmLYD","pFrrlcmXIX","e6e4zMojnP","FnPFB9XyT9","GSQwjM3zXL","7lUXZmz8gx","ZzJHW7hyVv",
+"OHaBz0ao3l","sqVrfiKqhr","FhtglJ2mQi","G1RhSCIShG","x3LDeEOE1o","FxX9qlm0pD","aL6AJpmeCd","Dz1R3yToGW","qaofNMkgy8","TXQ0ZLewvM",
+"WaWsvYf2Ec","CIShG7X3uy","mz8gxoGu6x","J2mQiaL6AJ","lm0pDU3yw5","VLTy6tvdkD","WPmlxUl4a1","FVMxoOUqFM","k85AeazIWp","6q6L9M6qcG",
+"FcWrWAgJHQ","bZLvSJkzUn","e6e4zZhwG1","QbxXcBGaQY","EoToPvLsmS","v2eC3taOXK","he9IA5drc6","zY1GYtaOXK","TwanolpF6W","XyPZNksJby",
+"zFgtBqaofN","UlU3MtAOsr","QworuGXdoH","tjQxsSs0Zu","i3pydzz4ZU","oVQp6P6bcg","a00b5JXljW","S2DfuWMiS3","DcpWBY1mC0","jS1ajru4UG",
+"bZLvSkZANm","5IhmGUlU3M","dQ586yEfy9","y94nwyToGW","7hyVvpT8wu","FNYIM1LB1L","BbwgAyToGW","DLhzMK20wK","CdyBV8RCUA","Q6hMCzqH0W",
+"zbIYY0MR5X","S77LHQnJ1S","faHir5nmWv","VIlwPJRJQB","IRh48NhXdu","DcpWB55rfB","BbwgAokgRi","blLA9uupzk","kB5nPx3LDe","QYxC05ZaEz",
+"i3pydhe9IA","mX2GEWaWsv","HzZT8Rxrsm","ulk41ThjNn","oQ87rdjsrv","uZPqgcShY2","y94nwMojnP","SjskQsx5Gl","RzaZAtvdkD","xXTI4hE1Ql",
+"8TxD729QAz","RxrsmIn3NS","gf8rIlCMxy","OUYuFMmsIo","5nmWv5ZaEz","0Wr5yoVQp6","pWiOs2Yz7E","9eoRcKr8ys","EoToPd7vjM","2hEEUGSQwj",
+"QssNCyvOMI","9iGoTpiJSk","5nmWvVerEA","jfREu8hJdt","0MR5Xxciqp","8U2nUpvgjS","5nmWv7fKYU","QWxoThe9IA","Ta8f68U2nU","Mkgy80MR5X",
+"7fsYMMm8si","i7WMQSWfou","HzZT85IhmG","7fKYUtAOsr","L7cGc9rlg9","blLA9LDk6f","wDajX7lUXZ","LbRTHzbIYY","mX2GEyvOMI","MGlTFIn3NS",
+"4W0TlZ4I1v","NcICADG4sT","yvOMIiwzGk","t98iWbZLvS","brhlQ0BmCy","qUJMdJ2mQi","FnPFBW3VFH","VIlwPDcpWB","MmsIoDG4sT","VBjhzAIYUu",
+"C2IrcWmadA","Vprf2NOHsz","gjUTu7lUXZ","GXdoHDG4sT","Cp3mZ580YD","In3NSAkKTk","Ta8f6Gv3Fq","i7WMQM6qcG","IRh487fsYM","tjQxsP6bcg",
+"BbwgAHP433","JkzUnl83Ud","UlU3MYjB9t","uPX7GJKWYR","yofH3cShY2","pFrrlWDVWJ","FFDuiksJby","0PktIU3yw5","cmXIXd7vjM","S77LHazIWp",
+"EoToPzHF1q","x3LDeY1mC0","RBhp0I7p2a","5IhmG1v5hH","bZLvS5drc6","aez9yRkQke","iKqhruvf7A","qQxHP2DREs","GrDg76AFT0","45cIH2hEEU",
+"Kr8ysMGlTF","DG4sTWPmlx","7fsYMOHaBz","Vprf2FPfSE","v2eC34W0Tl","zz4ZUDcpWB","dpe1vTCgPp","QYxC0Twano","he9IAStlDJ","PYBf4IKxdL",
+"PYBf4JXljW","tvdkD48cHL","zFgtBciuWz","GSQwjTXQ0Z","fcwDaTXQ0Z","2ZHdkQworu","6q6L9iKqhr","tuDySQssNC","MmKGJXflUq","MmKGJuLtKs",
+"X6Pinb29RJ","v2eC3yvOMI","euZA5zHF1q","GWqqXaL6AJ","uvf7A45cIH","B3qemVLTy6","IBe8k9eoRc","VerEA0MR5X","FxX9qMGlTF","zHF1qpiJSk",
+"hE1QlGSQwj","ni2v18xEKz","8FmFHgIYvE","POUYSkB5nP","iB08lrz7Ut","okgRiNAFuw","OHaBzrKDLJ","P6bcgjeskS","uTacxFhtgl","gf8rIK4GS8",
+"7fKYUK4GS8","VerEAdmoS7","uJScXBCxeC","2DREsXyPZN","EOE1oHlUbF","B3qemWreyP","FjHXRaFFss","RACujJ2mQi","ogLgcCNHmv","3otm6RACuj",
+"uQIczoVQp6","FhtglokgRi","7lUXZ1j5L8","7fKYUF6PT2","euZA5Oz8yZ","zqH0WGSQwj","Cp3mZ8TxD7","yToGWcL0aE","h1zcHIjTwP","B3qemIBe8k",
+"vLsmSi7WMQ","Q6LixgjUTu","ru4UGgf8rI","C2Ircm4bxU","pv0i7Yw2oU","7fKYUhe9IA","9y4lwhE1Ql","D6rBydjsrv","StlDJQ6hMC","9eoRcCIShG",
+"YjB9tQbxXc","1j5L8Fhtgl","jSjS39y4lw","qaofNQWxoT","zQt6QGv3Fq","euZA5t98iW","soy9tOUYuF","6AFT01j5L8","iB08ljS1aj","qaofNSbRYy",
+"VLTy6AIYUu","J2mQiQnJ1S","hSSvQiwzGk","5iGN56q6L9","gf8rIGv3Fq","MmKGJ7fsYM","i3pydru4UG","iKqhrNo0Qb","5Drn0vkCHH","FhtglFGzgp",
+"faHirs4786","jeskSvOqCE","EdBKcB3qem","fFDrJlkMUA","Ul4a1MmKGJ","AOgEeWaWsv","IjTwPsuY4x","2hEEUydG8U","JJs5mpiJSk","GXdoHQworu",
+"DG4sTzz4ZU","GWqqXlXFOB","Yh1hFS2Dfu","bgJAzxciqp","Vprf2CxVEf","Ul4a1JJs5m","aDGtSsoy9t","lH1ktJKWYR","tAOsrulk41","DcpWBNxx9V",
+"KsjRKhE1Ql","VNCPdcmXIX","jfREuYf2Ec","9XyT9d85a9","iB08lHP433","RmDcrTCgPp","uN6r3pv0i7","QworuRkQke","8TxD72Yz7E","FcWrWHfyNQ",
+"soy9tVjCZq","zY1GYiB08l","JXljW5VZjS","M3zXL9y4lw","v1HlnTXQ0Z","8FmFHHfyNQ","okgRi9rlg9","hE1QlzFgtB","atef2RACuj","e6e4zJKWYR",
+"RBhp02Nslm","1LB1Lv2eC3","Y1mC0Fhtgl","FjHXRzqH0W","JIqXigdQsS","v8yFNF6PT2","JRJQBO3iyQ","7X3uypv0i7","pAhR19rlg9","XyPZNk85Ae",
+"ECMvUmz8gx","uZPqg9XyT9","IRh480ao3l","K20wKogLgc","VIlwPFGzgp","hYBCKfLNg8","Yh1hFAOgEe","2ZHdkb29RJ","0MR5XMojnP","6AFT0DG4sT",
+"pvgjSTXQ0Z","FhtglDz1R3","JXljWsoy9t","iB08lsx5Gl","jzUqRuvf7A","HlUbFAkKTk","uJScXzmLYD","y94nw8U2nU","lXFOBB3qem","J2mQiKsjRK",
+"0KyfscL0aE","rhl0JEOE1o","Ss0ZuPb1pa","jiVBP1j5L8","zz4ZUEoToP","jS1aj48cHL","uoStw9GXkX","QnJ1STa8f6","BbwgAdhSuH","hE1QlUmaEv",
+"lpF6WcL0aE","QClRLv1Hln","Uvlv4x3LDe","DG4sTgtCA5","MmsIooQ87r","QClRLBCxeC","a00b50h1b1","IjTwPJJs5m","atef2VjCZq","s7MxkOxWIH",
+"oVQp6RmDcr","brhlQ5drc6","okgRicShY2","zmLYDlpF6W","CNHmvFLsph","zbIYYblLA9","14FLRzmLYD","Nxx9V8TxD7","WaWsvt59lR","dQ586QWxoT",
+"bgJAzIjTwP","0MR5XOUqFM","QbxXcMaJQs","cmXIXhSSvQ","Vprf2ru4UG","Oz8yZqUJMd","tvdkDi3pyd","aFFssZ4I1v","BpYhV0BmCy","QnJ1SD6rBy",
+"zQt6QfLNg8","tAOsrCp3mZ","iqv4kaFFss","yEfy9Qworu","yluBx0BmCy","SmGzv580YD","zqH0WfmIK1","Q6hMCGWqqX","Q6Lix7hyVv","AOgEeNhXdu",
+"qUJMdi3pyd","Pb1pa5VZjS","Qworuh1zcH","pT8wuK20wK","ReKEWs93Ml","VIlwP48cHL","MojnPGv3Fq","i3pydQYxC0","2TRI71LB1L","FVMxodhSuH",
+"jiVBPtlILt","FNYIMi3pyd","NAFuwbZLvS","bgJAz2ZHdk","48cHLzFgtB","9GXkXLDk6f","wiHrZ2ZHdk","5VZjSC2Irc","bgJAzxXTI4","iwzGk24ARF",
+"1v5hHfaHir","TCgPpHRxd8","X6PinHlUbF","5Namm7Ow5C","BbwgARpBQm","taOXKuvf7A","J2mQiM6qcG","mz8gxVjCZq","WPmlxSjskQ","Chuy3Y1mC0",
+"3otm6vkCHH","v8yFNTCgPp","h1zcHzQt6Q","jeskSzQt6Q","tAOsrBCxeC","M6qcGIKxdL","No0QbHP433","VjCZqKASQ8","RzaZAogLgc","iB08lTwano",
+"4dEz6fcwDa","yofH3Yw2oU","cL0aE618Di","n8pJ9rz7Ut","IBe8kprNT6","QWxoTl83Ud","8RCUAhi5X7","wDajXNhXdu","WMiS3dpe1v","48cHLdpe1v",
+"NOHszxciqp","lm0pDhSSvQ","soy9toQ87r","AIYUucmXIX","hi5X7zbIYY","ReKEWAmdQd","FwEJzdjsrv","K20wKY1mC0","0MR5XECMvU","JJs5mtl72W",
+"bgJAzwDajX","48cHLI7p2a","2ZHdkuPX7G","wiHrZ0YAGH","i7WMQzmLYD","O3iyQI7p2a","OxWIHd7vjM","o8UydMaJQs","CdyBVgdQsS","tlILtWmadA",
+"d7vjMQnJ1S","ulk41K20wK","hi5X7wiHrZ","sqVrf2TRI7","Vprf2pFrrl","dQ5868TxD7","AOgEeYjB9t","MezSWCfgr3","AgJHQv1Hln","1LB1LrKDLJ",
+"Chuy3LDk6f","F6PT2EdBKc","QnJ1S9eoRc","lweGyECMvU","14FLR9iGoT","gIYvEe6e4z","Rxrsmpv0i7","29QAzKASQ8","HfyNQAXpwE","StlDJs4786",
+"StlDJ8FmFH","580YDazIWp","jeskSjtn0X","euZA5k85Ae","rKDLJlweGy","t98iWzFgtB","9GXkXm4bxU","I7p2aZUnqt","ru4UGfLNg8","7ku1pKZamH",
+"07n1c24ARF","tuDySReKEW","RkQkeOz8yZ","aez9yuJScX","RmDcrRpBQm","uoStwfFDrJ","UlU3MIn3NS","YjB9tsoy9t","YjB9tQworu","CxVEfWaWsv",
+"MezSWlweGy","pWiOsprNT6","GSQwjQ6hMC","QssNC2Nslm","NcICACfgr3","uoStwqQxHP","ZzJHWv8yFN","y94nwlpF6W","aez9yB3qem","Cfgr3uN6r3",
+"Waim6jzUqR","uLtKs8TxD7","k85AeZ4I1v","azIWp0Wr5y","SWfouru4UG","pmeCd7hyVv","nFqiki7WMQ","CdyBVUvlv4","FPfSEuAWyp","ogLgcZJTXH",
+"FGzgpzmLYD","a00b58U2nU","QChxsDcpWB","pmeCd9XyT9","HlUbFDQimp","fcJOyThjNn","0YAGHMkgy8","QnJ1SCNHmv","FjHXRlsQGo","piJSkyvOMI",
+"WPmlxs4786","AIYUu5IhmG","M3zXL0MR5X","FxX9quAWyp","CNHmvvOqCE","v1HlnRzaZA","WDVWJZ4I1v","lsQGon8pJ9","U3yw50MR5X","rz7UtLDk6f",
+"VIlwP0Wr5y","d85a9M3zXL","EOE1o29QAz","1LB1Laez9y","ulk41zFgtB","Oz8yZ5Namm","rz7Utk85Ae","uvf7AO3iyQ","lpF6Wtl72W","uupzkaFFss",
+"Vprf2soy9t","okgRiFGzgp","WDVWJPYBf4","MojnPqUJMd","qUJMdC2Irc","AkKTki3pyd","a00b5QnJ1S","CxVEfAmdQd","RBhp0uTacx","dpe1vAOgEe",
+"cShY24QMc9","bZLvSRACuj","BCxeClweGy","5IhmG6AFT0","ydG8UJkzUn","14FLRWaWsv","RsQUqDz1R3","WaWsvTa8f6","I7p2aVjCZq","QChxs580YD",
+"1v5hHuQIcz","yofH3RzaZA","FnPFBaDGtS","2Yz7Ehi5X7","x3LDeh1zcH","fcJOyfFDrJ","iwzGk8TxD7","tl72WQ6hMC","2NslmazIWp","qaofN8FmFH",
+"mz8gx2DREs","ni2v1ECMvU","lH1ktyofH3","LbRTHQbxXc","OUqFMOz8yZ","FLsphhUTw7","QbxXc4QMc9","y94nwC2Irc","RBhp0Waim6","RzaZAfcwDa",
+"dhSuHa00b5","ECMvU1v5hH","zQt6Q8RCUA","k85AeYf2Ec","ZhwG1oQ87r","W7cTs0MR5X","FwEJzIBe8k","lViBvAkKTk","hYBCKD6rBy","QssNClweGy",
+"jS1ajgf8rI","0YAGHLbRTH","gjUTu16lHc","lsQGoOHaBz","rhl0JTa8f6","TXQ0Zn8pJ9","zQt6QzQt6Q","XflUqRBhp0","AmdQdoGu6x","nFqik6AFT0",
+"Ss0Zu8FmFH","hSSvQHfyNQ","t59lRGrDg7","ogLgc2TRI7","3weIFM6qcG","XyPZNbgJAz","OHaBzQ6Lix","lViBvAXpwE","hi5X7DLhzM","S77LHRxrsm",
+"zmLYDqQxHP","ZhwG1Cp3mZ","fLNg8jzUqR","hYBCKWaim6","0PktIcL0aE","prNT64W0Tl","BCxeClkMUA","MezSW5iGN5","gIYvEMm8si","7hyVvDQimp",
+"RsQUqB3qem","zQt6QuAWyp","pAhR145cIH","cQOnvZhwG1","8FmFH2DREs","Q6Lixiqv4k","KASQ8Vprf2","XflUquZPqg","DcpWBX6Pin","CxVEfaL6AJ",
+"pFrrlqUJMd","29QAzlm0pD","yvOMIVprf2","jeskSSjskQ","ZuDtDCfgr3","zQt6QlCMxy","AOgEeGv3Fq","iqv4ktlILt","wDajXVerEA","In3NS55rfB",
+"uAWyp6q6L9","OUYuFQ6Lix","ksJbyJXljW","gIYvE5nmWv","bgJAzQbxXc","G1RhSAOgEe","Waim6VjCZq","GrDg7IjTwP","FxX9q24ARF","he9IATXQ0Z",
+"ydG8U7fsYM","Mm8sid7vjM","JkzUnLbRTH","WDVWJWDVWJ","xciqps4786","QClRLcmXIX","14FLRuPX7G","fcwDaFNYIM","iqv4kX6Pin","euZA55Namm",
+"VLTy6MojnP","wiHrZgf8rI","aez9yhUTw7","U3yw5NcICA","GrDg7o8Uyd","YOfrY8xEKz","FVMxopvgjS","pT8wu2DREs","hE1QlOHaBz","9XyT90h1b1",
+"Cp3mZjfREu","v1HlnpAhR1","0KyfsiB08l","jiVBPMaJQs","lweGy9eoRc","WmadA2Nslm","QssNCtlILt","dpe1vK4GS8","jiVBPd7vjM","YjB9tzz4ZU",
+"jzUqRjtn0X","Fhtgliqv4k","2ZHdkLbRTH","AmdQdyluBx","5Nammo8Uyd","QworukB5nP","2NslmRsQUq","KZamHFjHXR","X6Piniqv4k","GXdoHM3zXL",
+"Oz8yZP6bcg","UlU3Maez9y","iwzGkPYBf4","soy9thi5X7","EdBKcjiVBP","d7vjMWPmlx","CxVEf8xEKz","qaofN29QAz","DG4sTogLgc","lj07QiB08l",
+"OUqFMEoToP","55rfBU3yw5","2hEEUgf8rI","OxWIHlkMUA","lXFOBFPfSE","FwEJzFjHXR","lViBvbrhlQ","TXQ0Zx3LDe","JKWYRMGlTF","RsQUqyofH3",
+"gjUTuW3VFH","8RCUACqqaD","LDk6foGu6x","FjHXRd85a9","29QAzAOgEe","yvOMILDk6f","Ta8f6ThjNn","LewvMjfREu","5ZaEzDLhzM","yluBx0PktI",
+"uZPqgwDajX","AXpwERzaZA","ZhwG1KsjRK","d7vjMFwEJz","9XyT9MK07Y","dpe1vciuWz","9eoRcOUYuF","NAFuwiwzGk","yofH3nlaBy","jiVBPix74r",
+"F6PT2aDGtS","suY4xuoStw","YOfrYMK07Y","v8yFNoGu6x","Ss0Zu16lHc","prNT6iwzGk","QbxXcD6rBy","FVMxox3LDe","Mkgy8LewvM","7fsYMyToGW",
+"RACujguMb8","4dEz6Rxrsm","n8pJ9POUYS","pmeCdS77LH","dQ586gf8rI","JRJQB8RCUA","FFDuiGSQwj","Ul4a1s93Ml","Kr8ysv2eC3","JIqXi9XyT9",
+"9eoRcfqypy","MK07YReKEW","CdyBV8TxD7","BCxeC7lUXZ","kZANmRxrsm","JJs5mRpBQm","oGu6xC2Irc","s93MlJ2mQi","ZJTXHnnP8o","Q6LixWmadA",
+"JJs5moGu6x","StlDJzz4ZU","zbIYYpAhR1","2Yz7ED6rBy","4QMc9nFqik","uAWypjfREu","hE1Ql48cHL","4QMc90Kyfs","cShY22DREs","3otm6L7cGc",
+"16lHctjQxs","0Wr5yzmLYD","dpe1viwzGk","VjCZqmX2GE","OHaBzHfyNQ","euZA5prNT6","JIqXi5iGN5","ogLgcM3zXL","0BmCy4dEz6","euZA5BFkb8",
+"Nxx9VlweGy","fcwDaguMb8","n8pJ9nnP8o","OxWIHKr8ys","SbRYyaFFss","dhSuHlViBv","dQ5861LB1L","zY1GYStlDJ","6AFT0NAFuw","pv0i7xReec",
+"n1pmOhe9IA","ni2v148cHL","bZLvSuupzk","RzaZAOUYuF","pvgjSQ6Lix","29QAzxReec","t59lR9y4lw","pvgjSjiVBP","xReecdhSuH","ZhwG1xciqp",
+"guMb8s7Mxk","HzZT814FLR","xReecs93Ml","lj07Q16lHc","jS1ajGv3Fq","pFrrlHlUbF","Rxrsmlm0pD","bZLvS4W0Tl","VLTy6guMb8","uJScXRmDcr",
+"oQ87rMm8si","QClRLZzJHW","EOE1oS2Dfu","TCgPppT8wu","Gv3FqOz8yZ","fFDrJs4786","prNT65ZaEz","WPmlxtlILt","uLtKsZ4I1v","QClRLCK5W7",
+"bZLvS16lHc","vkCHHuJScX","fLNg8DLhzM","G1RhSlXFOB","0Kyfs0ao3l","8FmFHF6PT2","lXFOBD6rBy","zQt6QsuY4x","zHF1q9eoRc","WreyPd85a9",
+"cmXIXWDVWJ","iwzGkBCxeC","0KyfsX6Pin","618DiYw2oU","U3yw5IBe8k","LDk6fpvgjS","Kr8ysrz7Ut","7hyVviKqhr","WreyPZhwG1","9GXkXWPmlx",
+"5Drn0PYBf4","dQ586HP433","KZamH4dEz6","WmadAQ6Lix","ThjNnYf2Ec","tAOsrvOqCE","CK5W78RCUA","ulk41ogLgc","F6PT2gf8rI","zqH0WHzZT8",
+"ulk41brhlQ","WmadAsuY4x","55rfBRkQke","Waim6zY1GY","uJScXguMb8","dpe1vwiHrZ","0Kyfs0Wr5y","Z4I1vdpe1v","dpe1vCK5W7","jtn0Xd7vjM",
+"qaofNQworu","Uvlv445cIH","BGaQYaDGtS","Zv7z0xXTI4","Mm8sihUTw7","W7cTsaez9y","5iGN5nnP8o","RkQkeL7cGc","WPmlxpv0i7","h1zcHFNYIM",
+"SWfouRzaZA","AmdQdM6qcG","VjCZqXflUq","zQt6QYjB9t","0PktIi3pyd","qUJMd0Kyfs","k85AeKZamH","oQ87rSmGzv","5nmWvoQ87r","ThjNnYh1hF",
+"K20wKpT8wu","tl72WZzJHW","he9IARmDcr","9rlg9e6e4z","7Ow5C16lHc","0MR5XlCMxy","FxX9qyluBx","rz7Ut618Di","XyPZNcQOnv","O3iyQm4bxU",
+"P6bcgokgRi","vkCHHSWfou","XflUqHP433","5NammTXQ0Z","dpe1vcShY2","nnP8opT8wu","2ZHdkDLhzM","0ao3lvLsmS","J2mQitlILt","Q6hMCNo0Qb",
+"gIYvE64s8N","hUTw7AXpwE","5VZjSGrDg7","Z4I1vSjskQ","BpYhVnnP8o","TwanoZzJHW","5IhmGECMvU","fqypyRACuj","d7vjMVjCZq","y94nwXflUq",
+"4QMc9Vprf2","W7cTsThjNn","0Wr5yjS1aj","I7p2aiqv4k","vLsmSfLNg8","XflUqzbIYY","Z4I1vS2Dfu","8U2nUEOE1o","VIlwPatef2","0BmCyFnPFB",
+"kB5nPh1zcH","ZhwG1okgRi","BFkb8Ss0Zu","ydG8UzY1GY","0YAGHcShY2","lViBv1j5L8","pvgjS9eoRc","qQxHPMGlTF","SmGzvblLA9","WaWsvyofH3",
+"FxX9qFPfSE","pAhR17lUXZ","LbRTH24ARF","29QAzeuZA5","48cHLdQ586","FnPFB48cHL","29QAzY1mC0","PYBf4iKqhr","tuDySpv0i7","FhtglFNYIM",
+"cmXIXD6rBy","yofH3HP433","FnPFBMK07Y","W3VFHCxVEf","Mm8siFnPFB","JIqXijtn0X","QssNCaDGtS","5Mg9r0Wr5y","X6PinOUYuF","jfREuqaofN",
+"soy9tpWiOs","AmdQdiqv4k","KASQ8lm0pD","6AFT0oQ87r","lCMxyBpYhV","0YAGHCqqaD","CK5W7kZANm","kB5nPZJTXH","S77LHFhtgl","qUJMdBbwgA",
+"7Ow5C2Yz7E","pAhR16q6L9","No0Qb5IhmG","azIWpyToGW","DQimpFjHXR","Kr8ysW7cTs","MojnPbrhlQ","k85AepmeCd","fcJOyGWqqX","BbwgAi7WMQ",
+"zHF1qG1RhS","RBhp0GXdoH","Mm8siUl4a1","o8UydM6qcG","brhlQa00b5","pWiOszQt6Q","5NammrKDLJ","uJScXHfyNQ","ReKEW618Di","OxWIHzQt6Q",
+"kB5nP7hyVv","QClRLXyPZN","B3qemOz8yZ","rz7UtPb1pa","8hJdtSWfou","DQimpnnP8o","bgJAzFwEJz","he9IAK20wK","rhl0JMaJQs","45cIHYOfrY",
+"AXpwEuvf7A","0h1b15ZaEz","xReeczY1GY","KZamHxXTI4","piJSkKsjRK","HzZT8dpe1v","Yh1hFfqypy","nnP8oiKqhr","oGu6xK20wK","K4GS8BpYhV",
+"QssNChE1Ql","vkCHHwDajX","k85AeFGzgp","1LB1La00b5","faHirhSSvQ","FcWrWFLsph","W7cTsh1zcH","v2eC3lkMUA","l83UdlweGy","JkzUnt98iW",
+"pmeCdFwEJz","RkQkenlaBy","hYBCKChuy3","ZhwG15Namm","zHF1qgf8rI","Ss0ZujfREu","ZzJHWMezSW","n8pJ9ECMvU","F6PT2i3pyd","EoToPWPmlx",
+"gjUTu0ao3l","WmadAGv3Fq","rhl0Js93Ml","s4786uZPqg","48cHLGWqqX","VjCZq29QAz","2Yz7Efqypy","yvOMIt59lR","Q6hMCJXljW","7lUXZfcwDa",
+"VLTy60h1b1","XflUqCxVEf","No0Qb8FmFH","jiVBPogLgc","FVMxoIRh48","HRxd8Yw2oU","kB5nPbrhlQ","HRxd88cVD3","FPfSE7lUXZ","WreyPqUJMd",
+"vLsmSqQxHP","gIYvEdhSuH","S2DfuAXpwE","LbRTHCfgr3","JIqXiCqqaD","45cIHLewvM","iqv4kOUqFM","Ss0ZuM3zXL","0KyfsYOfrY","jiVBPUmaEv",
+"piJSkprNT6","blLA9M3zXL","cL0aEa00b5","BpYhVt98iW","2Yz7EVprf2","W7cTsW7cTs","2DREs9iGoT","IBe8kpv0i7","v2eC3n1pmO","W3VFHpAhR1",
+"piJSkuupzk","aFFssjzUqR","9y4lwReKEW","bZLvS3weIF","HlUbFBFkb8","No0Qb9iGoT","bgJAzCdyBV","zqH0W1v5hH","jiVBPSbRYy","1LB1LPb1pa",
+"AOgEe48cHL","aDGtS2TRI7","yEfy9Rxrsm","fmIK1FcWrW","HlUbFl83Ud","Kr8ys5ZaEz","pT8wuyToGW","uvf7AqQxHP","tuDySfmIK1","5nmWvMm8si",
+"jfREusoy9t","atef2lCMxy","AIYUuRsQUq","pvgjSMmsIo","rKDLJxXTI4","ZUnqt5iGN5","2DREsOUqFM","VjCZqFhtgl","kZANmJRJQB","mX2GElViBv",
+"lm0pDRACuj","okgRi64s8N","FnPFBtjQxs","O3iyQ7lUXZ","7fKYUgjUTu","v2eC3HP433","Cfgr3FPfSE","Fhtgl45cIH","Fhtglv2eC3","NOHszogLgc",
+"b29RJgtCA5","HzZT8jiVBP","tlILtKASQ8","zFgtBt59lR","HP433azIWp","yluBxgIYvE","1j5L8ydG8U","yToGWIjTwP","mz8gxQbxXc","RACujS2Dfu",
+"RzaZAGXdoH","5iGN5h1zcH","dmoS7WaWsv","9y4lwC2Irc","FcWrWVLTy6","FxX9quvf7A","yvOMIjtn0X","8xEKzazIWp","JRJQB0ao3l","cShY2RzaZA",
+"pT8wu1v5hH","8xEKz5iGN5","IKxdLrhl0J","LDk6fVprf2","VLTy6RkQke","0BmCy8hJdt","x3LDeKsjRK","MaJQs0MR5X","wDajXlm0pD","JKWYR0h1b1",
+"5Drn0a00b5","Mm8si8cVD3","BGaQYuN6r3","fFDrJ8U2nU","ZJTXHhYBCK","AXpwEazIWp","ydG8UuPX7G","guMb8iqv4k","dhSuHEoToP","tAOsrUlU3M",
+"KASQ8WmadA","pv0i7zqH0W","J2mQiEOE1o","ZzJHW5VZjS","jtn0XAIYUu","EoToPQ6Lix","cShY2U3yw5","CdyBVTCgPp","IKxdLk85Ae","Chuy3HfyNQ",
+"uZPqgJ2mQi","Zv7z00BmCy","XyPZNYh1hF","5ZaEzt98iW","LDk6fd7vjM","P6bcg5nmWv","9iGoTMm8si","16lHcCK5W7","TXQ0Zix74r","hSSvQQworu",
+"Oz8yZrz7Ut","ulk410h1b1","uAWypBCxeC","MGlTF45cIH","IKxdL9XyT9","FwEJzK20wK","dhSuHRkQke","zmLYDJRJQB","J2mQiHRxd8","IjTwP48cHL",
+"y94nwJJs5m","K4GS8Z4I1v","lpF6WU3yw5","G1RhSQ6Lix","tl72WEdBKc","lpF6WTa8f6","kB5nPFPfSE","UmaEvHzZT8","VerEA2DREs","7lUXZfqypy",
+"SbRYyuQIcz","S77LHlXFOB","v2eC3PYBf4","AkKTk8hJdt","t59lRQworu","0Wr5yXflUq","GSQwjdmoS7","TXQ0ZSmGzv","WPmlxWaim6","In3NS6q6L9",
+"MaJQsZzJHW","vLsmS07n1c","prNT6PYBf4","iKqhrDG4sT","Gv3Fq5Namm","7fKYUiKqhr","QbxXcX6Pin","FLsphMojnP","P6bcgKASQ8","9GXkX0MR5X",
+"Waim6azIWp","hi5X7s7Mxk","cShY2e6e4z","Vprf2EoToP","v8yFN0MR5X","EoToPMkgy8","7fKYUMm8si","oGu6xuPX7G","rKDLJnnP8o","ulk41GWqqX",
+"fcwDa2DREs","aL6AJzmLYD","SWfou64s8N","WaWsvdmoS7","QbxXcLbRTH","SWfouZuDtD","oQ87rEdBKc","2TRI7cShY2","k85Aerhl0J","4dEz6CdyBV",
+"IRh48v1Hln","VBjhzm4bxU","Yw2oUi7WMQ","cQOnv2hEEU","5drc6fcwDa","3weIF0BmCy","s7MxkYw2oU","CxVEfOxWIH","vkCHHFnPFB","euZA564s8N",
+"QssNCTwano","uPX7GD6rBy","QYxC014FLR","07n1cRkQke","zz4ZUnlaBy","Gv3Fq5drc6","wDajXOz8yZ","J2mQiGWqqX","tuDySWreyP","QChxsuoStw",
+"l83Ud5ZaEz","BCxeCLDk6f","zz4ZUblLA9","S77LHYw2oU","7hyVvPYBf4","l83Ud14FLR","No0QbhSSvQ","jzUqRQ6Lix","9iGoTSmGzv","pWiOshUTw7",
+"WaWsvyvOMI","L7cGcLewvM","ZzJHWTa8f6","GWqqXAOgEe","yEfy9hE1Ql","pmeCdcShY2","14FLRhe9IA","YOfrYMaJQs","iKqhrs93Ml","hYBCKWDVWJ",
+"Nxx9VdhSuH","sqVrfs7Mxk","HfyNQ4dEz6","24ARFksJby","Uvlv4FcWrW","FNYIM0YAGH","bZLvSciuWz","zqH0W4W0Tl","n8pJ9ZUnqt","I7p2ay94nw",
+"AmdQd0Wr5y","RACujzz4ZU","d7vjMe6e4z","7Ow5C1LB1L","hi5X7pFrrl","LDk6fF6PT2","bgJAztvdkD","zQt6QChuy3","yEfy9yEfy9","hSSvQ8U2nU",
+"vLsmSru4UG","nnP8ogjUTu","NcICAVerEA","G1RhSP6bcg","uLtKsnlaBy","NOHszvkCHH","64s8NgjUTu","RpBQmAgJHQ","3weIFxXTI4","8U2nUFFDui",
+"7fKYURxrsm","aL6AJ55rfB","7Ow5CQbxXc","ru4UGOUqFM","2Yz7EuTacx","3weIFQYxC0","KsjRK2Nslm","K4GS8tl72W","5VZjSyToGW","Mkgy8HfyNQ",
+"RBhp0ni2v1","YOfrY7hyVv","YOfrYVIlwP","5VZjSQWxoT","FGzgpyluBx","9iGoTJKWYR","piJSk0Wr5y","zz4ZUdQ586","7fsYMru4UG","7fsYM4QMc9",
+"5IhmGlH1kt","ydG8Udpe1v","iqv4ksx5Gl","Cp3mZzY1GY","NOHszECMvU","oGu6xxReec","cShY2lpF6W","0KyfsoGu6x","55rfBAIYUu","lweGyZ4I1v",
+"StlDJ0PktI","cL0aEGWqqX","sqVrfydG8U","jeskSiqv4k","tjQxsMm8si","lH1kti7WMQ","hUTw7XyPZN","AXpwERpBQm","VNCPduTacx","n1pmOyToGW",
+"1LB1LMGlTF","fmIK1suY4x","VerEAJRJQB","taOXKCK5W7","ZuDtDni2v1","16lHcQWxoT","dmoS79eoRc","FcWrWNAFuw","5iGN5tlILt","FcWrWix74r",
+"FNYIMcShY2","QbxXcEOE1o","zHF1qQClRL","lCMxy5Namm","SbRYy7X3uy","vkCHHFhtgl","Cfgr3F6PT2","ni2v13weIF","t59lR618Di","48cHLlXFOB",
+"14FLRFLsph","VerEAThjNn","aDGtSQnJ1S","blLA9xXTI4","uQIcztl72W","t59lR0MR5X","o8UydgjUTu","jzUqRBpYhV","mz8gxtl72W","JKWYRt59lR",
+"a00b5cShY2","MmKGJfcwDa","B3qemJKWYR","P6bcgDLhzM","MK07YtAOsr","I7p2alweGy","Yh1hFG1RhS","XflUqY1mC0","24ARFS2Dfu","kB5nPgIYvE",
+"s7MxkD6rBy","QssNCRACuj","AgJHQTCgPp","MaJQsZv7z0","LDk6f8TxD7","tuDySQ6Lix","D6rByJKWYR","jSjS3FLsph","Vprf2v8yFN","iwzGkGv3Fq",
+"K4GS8guMb8","ZJTXHMojnP","JJs5mhE1Ql","VjCZqbrhlQ","MmsIon8pJ9","5nmWvvOqCE","JKWYR5Drn0","F6PT2MmsIo","uupzk7hyVv","RxrsmCdyBV",
+"B3qemx3LDe","OUqFMtl72W","NAFuwMezSW","v2eC3Waim6","tl72WlXFOB","RkQkeksJby","pv0i7aL6AJ","hSSvQzqH0W","zHF1q48cHL","MezSWFVMxo",
+"lpF6WSbRYy","MGlTFHfyNQ","FwEJztvdkD","bZLvSWaWsv","9XyT9QssNC","guMb8i7WMQ","VBjhz2TRI7","lkMUAmz8gx","3otm66AFT0","Vprf2aL6AJ",
+"K20wKyluBx","9XyT9CK5W7","GWqqXQYxC0","7fsYMzFgtB","tjQxsQworu","ksJbyL7cGc","pWiOsReKEW","U3yw5lsQGo","IKxdLzHF1q","QworuhYBCK",
+"wDajXCxVEf","RpBQmJJs5m","BCxeCulk41","hSSvQNcICA","7hyVvSbRYy","zz4ZUFNYIM","0PktIMkgy8","dhSuHL7cGc","No0QbcL0aE","M3zXLfaHir",
+"K4GS8KASQ8","xciqpYf2Ec","yluBxlm0pD","0PktIzbIYY","iB08ldQ586","v1HlnCNHmv","5iGN57fKYU","zFgtBazIWp","HzZT8DcpWB","s7MxkkZANm",
+"45cIHECMvU","bZLvSl83Ud","blLA9G1RhS","n1pmOlpF6W","JIqXiYjB9t","9eoRc48cHL","tjQxshSSvQ","bgJAzSjskQ","prNT6gf8rI","aez9yMGlTF",
+"2TRI7Mkgy8","IRh48VIlwP","QbxXco8Uyd","WreyPFLsph","mz8gx9iGoT","0ao3lGXdoH","m4bxUAkKTk","FFDuivOqCE","M3zXLM3zXL","pmeCdL7cGc",
+"0YAGHlCMxy","cmXIX5Namm","W7cTsOHaBz","XflUqWmadA","ThjNn4dEz6","BCxeCCxVEf","Yh1hF0h1b1","TwanowDajX","U3yw5Q6hMC","SmGzv8RCUA",
+"HzZT8prNT6","Nxx9V2ZHdk","EoToPazIWp","CqqaDDz1R3","VNCPdpWiOs","JJs5mReKEW","lH1ktCdyBV","P6bcgS2Dfu","Yf2EcbgJAz","FFDuiVjCZq",
+"sqVrftl72W","euZA5K20wK","O3iyQLDk6f","FFDuizFgtB","pFrrljSjS3","FxX9qFjHXR","DQimpWaim6","zQt6Qtl72W","L7cGcy94nw","v2eC3x3LDe",
+"jzUqR8TxD7","MaJQsMm8si","lsQGoqaofN","Z4I1vHRxd8","RxrsmEoToP","FcWrWFjHXR","aDGtSAmdQd","FLsphuJScX","JIqXiVNCPd","QClRLZJTXH",
+"J2mQiIn3NS","AOgEebZLvS","Yw2oUFwEJz","Kr8ysjiVBP","U3yw5HlUbF","GXdoHMK07Y","jtn0XVIlwP","FxX9qJKWYR","W3VFHatef2","hYBCKUmaEv",
+"o8UydqUJMd","euZA5OHaBz","prNT6X6Pin","hSSvQ7fsYM","uN6r38RCUA","Q6LixYf2Ec","M6qcGYh1hF","HRxd8qUJMd","55rfBYOfrY","MezSWCxVEf",
+"29QAzt59lR","qUJMd4QMc9","OHaBzVerEA","cL0aEDQimp","jSjS39XyT9","QClRLvLsmS","0MR5X55rfB","3weIF618Di","YOfrYbZLvS","m4bxUVIlwP",
+"VjCZqnnP8o","1LB1LWMiS3","iwzGknnP8o","uTacxChuy3","zz4ZURzaZA","MGlTFIKxdL","taOXKpT8wu","Cfgr3guMb8","EdBKcRxrsm","5drc6yToGW",
+"0ao3lzbIYY","BpYhVEOE1o","uAWypSWfou","gjUTu580YD","hE1QlOxWIH","0ao3l3weIF","XflUq7fKYU","v1HlnIRh48","ogLgcY1mC0","Pb1pae6e4z",
+"QClRLOUqFM","MojnPyofH3","pv0i7mX2GE","uQIczaDGtS","o8UydYw2oU","ReKEWuPX7G","8TxD7HP433","NhXduuQIcz","24ARFkB5nP","Oz8yZjfREu",
+"WmadA7hyVv","Yh1hF7Ow5C","64s8NHfyNQ","B3qem48cHL","AXpwEgIYvE","JkzUnblLA9","hE1Qllj07Q","pFrrloVQp6","hSSvQzbIYY","SmGzvjeskS",
+"lpF6WWaWsv","gIYvEo8Uyd","pv0i7uLtKs","4QMc9DcpWB","v2eC38TxD7","0KyfsXflUq","lm0pDlH1kt","v8yFNdQ586","9GXkXKASQ8","pAhR1UlU3M",
+"0KyfsdhSuH","2DREsiwzGk","UmaEvGv3Fq","DLhzMlkMUA","xReecjiVBP","JXljWWDVWJ","HP433h1zcH","kB5nPpiJSk","MmKGJ9y4lw","CNHmvM3zXL",
+"xciqp9eoRc","FFDui3weIF","5Mg9rM6qcG","Pb1paS2Dfu","W7cTsUvlv4","yofH3FPfSE","GXdoH8RCUA","5iGN5jtn0X","uQIczhi5X7","580YDm4bxU",
+"VIlwPix74r","rKDLJqaofN","9GXkXydG8U","xciqpbZLvS","BGaQYRmDcr","Ss0ZujSjS3","zHF1q07n1c","MezSWa00b5","jeskSv2eC3","RsQUqbrhlQ",
+"QYxC0QYxC0","JXljWUmaEv","Mm8siMojnP","fLNg8Chuy3","M6qcG6AFT0","FhtglDcpWB","kZANmZzJHW","hUTw7oQ87r","AIYUuni2v1","RBhp0lkMUA",
+"HP4338TxD7","zQt6QzHF1q","DG4sTThjNn","NAFuwQworu","OHaBzAkKTk","WreyPxReec","s93MlgdQsS","ix74r16lHc","faHir3weIF","d7vjMUmaEv",
+"v2eC3CK5W7","IRh481j5L8","d7vjMuZPqg","FjHXRZJTXH","8hJdtv2eC3","ciuWzTXQ0Z","hSSvQoVQp6","ni2v1rKDLJ","Mm8siWPmlx","SbRYyjtn0X",
+"DG4sTDG4sT","DcpWBqaofN","ZUnqtyToGW","cmXIXnFqik","MK07YYw2oU","jzUqRvLsmS","vOqCEhUTw7","Kr8ysKASQ8","ydG8Ufqypy","Uvlv4X6Pin",
+"yEfy9gf8rI","6AFT0brhlQ","MaJQsTXQ0Z","5ZaEzs93Ml","YOfrYs4786","ksJbyPOUYS","uQIczSWfou","RsQUq5Mg9r","VLTy6AgJHQ","7fKYU5ZaEz",
+"kB5nPJJs5m","fLNg8POUYS","5nmWvuPX7G","0h1b1FLsph","Yf2Ec7Ow5C","xciqp24ARF","RBhp0RkQke","HP433wiHrZ","0Wr5yokgRi","RsQUqCIShG",
+"C2IrcVBjhz","8cVD3i7WMQ","WMiS3v2eC3","GXdoHGv3Fq","48cHLm4bxU","n1pmO0Kyfs","qUJMdYjB9t","fcwDaXyPZN","y94nwS77LH","4QMc9iB08l",
+"S2Dfut59lR","l83UdJIqXi","ciuWzn8pJ9","nFqikzHF1q","ZJTXHkB5nP","aez9yWPmlx","Nxx9VKASQ8","HfyNQLewvM","sx5GlAkKTk","nlaByI7p2a",
+"k85AexReec","AkKTk8xEKz","0Wr5yQ6Lix","b29RJ3otm6","WaWsvcQOnv","MaJQsqQxHP","0MR5XQbxXc","2ZHdki3pyd","ogLgcEdBKc","580YDOxWIH",
+"ECMvUSjskQ","WmadAcQOnv","ZuDtDUvlv4","MmKGJWaim6","Cp3mZ5nmWv","vLsmSfmIK1","Uvlv414FLR","VerEABpYhV","pWiOsRsQUq","t98iWIRh48",
+"S77LHRzaZA","QYxC0DQimp","Kr8ys7lUXZ","7fsYM0PktI","Oz8yZZv7z0","16lHcDz1R3","HzZT8NOHsz","07n1che9IA","2DREspWiOs","Z4I1v2DREs",
+"uAWyp9eoRc","Chuy3taOXK","4W0TlKsjRK","LewvM4dEz6","lm0pDlCMxy","Chuy3MK07Y","soy9tDG4sT","b29RJI7p2a","QClRLSs0Zu","JXljWYh1hF",
+"FPfSEyluBx","RzaZAtuDyS","v1Hln9XyT9","07n1c5iGN5","Cp3mZBbwgA","he9IAFhtgl","UlU3Mdpe1v","HP433FnPFB","64s8NDQimp","qQxHPF6PT2",
+"RxrsmGXdoH","M3zXL5IhmG","45cIHCNHmv","NOHszZhwG1","K20wKru4UG","azIWpy94nw","zbIYYM6qcG","2NslmO3iyQ","aez9yx3LDe","SmGzvK4GS8",
+"AIYUuOUqFM","IKxdLK4GS8","bZLvSxciqp","uLtKsfcwDa","W7cTsiKqhr","14FLRZhwG1","mX2GEs4786","pFrrldjsrv","MmsIojtn0X","VLTy6pFrrl",
+"QssNCAIYUu","uvf7AVIlwP","QYxC0m4bxU","UlU3Mru4UG","NOHszix74r","jS1ajZuDtD","pT8wuTwano","lpF6WnFqik","iKqhrfqypy","ZUnqtBCxeC",
+"nnP8oa00b5","HlUbFoQ87r","BpYhVsuY4x","P6bcgMGlTF","aDGtStaOXK","Zv7z08cVD3","ogLgc3otm6","9eoRcvkCHH","2DREsZv7z0","zY1GYHP433",
+"gdQsSuLtKs","QbxXcJXljW","uupzkFnPFB","2ZHdk5Drn0","SmGzvx3LDe","vLsmSeuZA5","Yf2Ec6AFT0","Uvlv4OHaBz","HfyNQRkQke","Ta8f6tuDyS",
+"X6PinECMvU","Cfgr3vLsmS","9eoRcOxWIH","oVQp6VIlwP","VjCZqEOE1o","IjTwP618Di","iwzGkyEfy9","vkCHH580YD","KASQ8ZJTXH","ulk41ru4UG",
+"SbRYy9XyT9","d7vjMYOfrY","RmDcrBCxeC","HP433dQ586","EOE1oQ6hMC","fqypyqUJMd","n8pJ9QYxC0","guMb8pvgjS","mX2GEa00b5","jzUqRTwano",
+"FhtgliB08l","Z4I1vCp3mZ","aL6AJaDGtS","W3VFH9iGoT","oGu6xni2v1","NcICADz1R3","8xEKzuPX7G","FjHXRYjB9t","I7p2aFNYIM","FxX9qqQxHP",
+"Cp3mZGXdoH","gf8rIzQt6Q","Pb1paCIShG","jS1ajpT8wu","aL6AJ5VZjS","Ul4a1tvdkD","mX2GEcShY2","t98iWdjsrv","OHaBzuupzk","yvOMIru4UG",
+"M6qcG0BmCy","zHF1qRkQke","dhSuH5drc6","i7WMQRzaZA","taOXK1LB1L","K20wKYOfrY","S2DfuSmGzv","Uvlv4zbIYY","iB08lCp3mZ","GrDg7pAhR1",
+"Ul4a1oVQp6","taOXKZv7z0","XflUqWaim6","FnPFBgf8rI","GSQwj1v5hH","FGzgpdhSuH","QClRLFGzgp","QYxC0n8pJ9","suY4xRBhp0","16lHcStlDJ",
+"RsQUqC2Irc","he9IAy94nw","zHF1q8xEKz","4W0TlUmaEv","EoToPTCgPp","Kr8ys0ao3l","2ZHdkYw2oU","FnPFBtaOXK","fFDrJguMb8","45cIHBGaQY",
+"iB08l0Wr5y","vLsmSBpYhV","EdBKcgIYvE","RxrsmC2Irc","Chuy355rfB","nnP8opWiOs","pWiOsW3VFH","CIShGRmDcr","S77LHzFgtB","v2eC355rfB",
+"Kr8ysYjB9t","FjHXR9iGoT","v2eC3EdBKc","gtCA57ku1p","uAWypn8pJ9","P6bcgMm8si","wiHrZM6qcG","AXpwEiKqhr","jfREuGrDg7","gf8rINOHsz",
+"M3zXLQChxs","7fsYMpFrrl","qQxHPKASQ8","RzaZA0Kyfs","Nxx9VHzZT8","9iGoTZ4I1v","1v5hHZhwG1","VjCZqjSjS3","8cVD3gjUTu","EdBKcM6qcG",
+"Nxx9VfmIK1","4dEz6JXljW","7X3uyatef2","uTacxJ2mQi","uPX7GS2Dfu","QWxoTazIWp","Kr8ysCp3mZ","ZzJHW1LB1L","Cfgr3NAFuw","LewvM24ARF",
+"MmKGJVIlwP","0Wr5yzbIYY","lweGy8cVD3","euZA5Uvlv4","8hJdtRmDcr","KZamHs4786","IKxdLjeskS","sx5Gl2Yz7E","k85Aet59lR","Cfgr3HfyNQ",
+"FFDuifaHir","mX2GEVLTy6","CK5W7POUYS","2hEEUcQOnv","QnJ1Sm4bxU","BGaQYWDVWJ","5IhmGAOgEe","5nmWvoVQp6","xReectuDyS","5VZjSuQIcz",
+"JKWYR8hJdt","5Drn0HRxd8","yofH3Ss0Zu","I7p2aHzZT8","9iGoTMmsIo","lweGyjeskS","hE1QlECMvU","3weIFdmoS7","lj07QgIYvE","48cHLlpF6W",
+"x3LDeCK5W7","W7cTso8Uyd","MmsIoQworu","K4GS82TRI7","RzaZAix74r","zHF1qpmeCd","VLTy6WPmlx","VerEAfcJOy","ReKEWNcICA","8FmFH8FmFH",
+"LbRTHQChxs","gIYvEPb1pa","8xEKzFxX9q","Yw2oUn1pmO","IRh48nFqik","CK5W7C2Irc","FFDuiIn3NS","5ZaEzL7cGc","HlUbFTwano","WmadAkB5nP",
+"POUYStlILt","W3VFHdmoS7","bZLvSNhXdu","5Drn0ni2v1","uQIczWDVWJ","Zv7z0CdyBV","Mm8siv8yFN","CxVEfCNHmv","hi5X70h1b1","MaJQsK4GS8",
+"t98iWtjQxs","cShY2Rxrsm","ciuWzNAFuw","WDVWJWaWsv","pWiOsQWxoT","taOXKSjskQ","tuDySEdBKc","SjskQMm8si","Zv7z024ARF","yEfy9rhl0J",
+"FVMxoFGzgp","GrDg7fFDrJ","gIYvEy94nw","RACuj29QAz","hUTw70ao3l","Uvlv4jiVBP","t98iW9XyT9","JKWYRlweGy","uoStwrhl0J","jzUqRxReec",
+"QYxC024ARF","HP433n1pmO","BFkb8LewvM","d85a9pvgjS","9iGoTkB5nP","618DiSbRYy","zbIYYdQ586","i3pydk85Ae","S77LHWaWsv","h1zcHwiHrZ",
+"8hJdtGSQwj","brhlQJ2mQi","gjUTu5IhmG","6AFT0EdBKc","0ao3l7fKYU","OUYuFfcJOy","LewvMaL6AJ","iwzGkuPX7G","lkMUAiqv4k","MGlTFzY1GY",
+"8RCUA5iGN5","AIYUuHP433","0Wr5yuZPqg","piJSkCdyBV","FhtglxXTI4","JXljWyluBx","AgJHQNcICA","ogLgc29QAz","y94nwfLNg8","DG4sTuTacx",
+"Pb1pauvf7A","MmsIopAhR1","ru4UGulk41","Ul4a1zbIYY","1v5hHa00b5","RsQUqhYBCK","dQ586GSQwj","WPmlxVprf2","JkzUnDLhzM","IBe8ktjQxs",
+"zbIYYhe9IA","LbRTHv1Hln","tvdkDtl72W","yToGWHzZT8","5nmWvQworu","ulk41uQIcz","gtCA58FmFH","kZANmNcICA","v1Hlnulk41","4W0TlWDVWJ",
+"2Yz7EMkgy8","SjskQBGaQY","9y4lwVBjhz","tAOsrOz8yZ","jSjS35IhmG","tl72WRmDcr","AXpwEAmdQd","FjHXRmX2GE","KZamHtAOsr","xXTI4i3pyd",
+"lViBvt59lR","GXdoHuLtKs","HlUbF0MR5X","lweGyuoStw","P6bcgZv7z0","7Ow5CTCgPp","IKxdLnlaBy","QssNCaFFss","64s8N9eoRc","fcwDak85Ae",
+"Ta8f6D6rBy","5IhmGhUTw7","EdBKcaL6AJ","HfyNQGXdoH","KASQ824ARF","azIWp16lHc","8U2nUaFFss","Ul4a1KZamH","JJs5miqv4k","FFDuiK4GS8",
+"CNHmvjfREu","RxrsmQ6hMC","VIlwPsqVrf","CNHmvfFDrJ","WDVWJlm0pD","M6qcG64s8N","W3VFHWaWsv","qUJMde6e4z","EdBKc0Kyfs","Ss0Zul83Ud",
+"yToGWNcICA","jSjS348cHL","QnJ1SyofH3","UlU3M580YD","fFDrJ2TRI7","M3zXLqQxHP","0Wr5yHP433","uJScXyEfy9","djsrvyofH3","ciuWzuoStw",
+"kZANm0Kyfs","FVMxoqaofN","64s8Nsoy9t","n1pmOuvf7A","hUTw7K4GS8","dpe1v9rlg9","LewvM7ku1p","16lHcTXQ0Z","nnP8onnP8o","14FLRaFFss",
+"JKWYRNxx9V","FPfSEK4GS8","5IhmGKASQ8","Vprf2n1pmO","sqVrftAOsr","Yf2EcLbRTH","zbIYYNxx9V","5IhmGuvf7A","FNYIMJRJQB","WmadAJJs5m",
+"dhSuHQ6hMC","0ao3lqaofN","6q6L9tuDyS","RpBQmtjQxs","pWiOs7X3uy","FGzgp5nmWv","5Drn0GXdoH","wDajXJkzUn","2Yz7E14FLR","piJSkM3zXL",
+"lweGyTa8f6","pT8wuPYBf4","lj07Q7fKYU","TXQ0ZWaim6","EdBKcRsQUq","y94nwksJby","Cp3mZDQimp","Mkgy8hUTw7","S2DfuFNYIM","cShY2ReKEW",
+"jzUqRSmGzv","QClRLiKqhr","MmKGJCp3mZ","MmKGJ0MR5X","M3zXLXyPZN","UmaEvB3qem","Y1mC0o8Uyd","Gv3FqF6PT2","BpYhVMaJQs","9iGoTtvdkD",
+"jiVBPzY1GY","FwEJzFNYIM","ulk418xEKz","M3zXLPYBf4","QbxXc5iGN5","pvgjS0MR5X","AIYUuYw2oU","6q6L9uQIcz","guMb8IBe8k","HRxd8zQt6Q",
+"4W0TlOHaBz","fcwDa7lUXZ","UlU3M29QAz","pvgjSyEfy9","HzZT8s4786","Dz1R35iGN5","14FLRZuDtD","UmaEvReKEW","SWfouVprf2","djsrvCdyBV",
+"OUqFMFFDui","SbRYySbRYy","SmGzvC2Irc","oVQp6AgJHQ","uoStwDLhzM","CqqaDv1Hln","AOgEeru4UG","lXFOBtAOsr","QYxC0Zv7z0","W3VFHvkCHH",
+"9eoRcBpYhV","i7WMQuN6r3","WmadAs93Ml","iKqhrt98iW","pT8wuSs0Zu","2NslmtvdkD","fmIK1xXTI4","hUTw70MR5X","NOHszuoStw","W3VFHPYBf4",
+"azIWpjfREu","nlaByVIlwP","MezSWFjHXR","QbxXc0YAGH","5ZaEzYjB9t","618Di55rfB","W7cTsjSjS3","7lUXZ7Ow5C","Waim6iwzGk","SjskQ64s8N",
+"ECMvUksJby","tjQxsxReec","Q6hMCbgJAz","OxWIH2ZHdk","G1RhSnnP8o","oQ87rzHF1q","TCgPpkB5nP","Q6hMC5Mg9r","jtn0X5Mg9r","uoStw5drc6",
+"NAFuwfFDrJ","e6e4z9GXkX","aL6AJNAFuw","8hJdtMmsIo","nlaByMezSW","v8yFNcL0aE","8xEKzcShY2","Y1mC0HRxd8","KsjRK0Kyfs","0MR5X2TRI7",
+"3otm62ZHdk","v2eC3L7cGc","jSjS3v8yFN","d7vjMBbwgA","BpYhVCfgr3","zmLYDRsQUq","jS1ajYOfrY","i7WMQvkCHH","VjCZquLtKs","RxrsmOUqFM",
+"uZPqguJScX","2DREsMm8si","0Kyfsjtn0X","NhXdupvgjS","UmaEvX6Pin","OUYuFIRh48","DLhzMSbRYy","7ku1pvOqCE","55rfBThjNn","ru4UGcQOnv",
+"CqqaDZhwG1","M6qcGgjUTu","faHirqaofN","pFrrlG1RhS","jiVBP4QMc9","tAOsrnFqik","uLtKs0h1b1","G1RhSdmoS7","M3zXLMezSW","ciuWz0h1b1",
+"7hyVvdjsrv","2Yz7EBFkb8","lH1ktyEfy9","fLNg8No0Qb","pWiOs7Ow5C","tAOsrDcpWB","hSSvQVerEA","AIYUuCp3mZ","W7cTsyluBx","dQ58629QAz",
+"FnPFBECMvU","K4GS8kZANm","b29RJnlaBy","kB5nPP6bcg","faHir7hyVv","m4bxUyEfy9","MmKGJK4GS8","tlILthUTw7","LewvMtuDyS","nFqikhYBCK",
+"LDk6fMm8si","qQxHPEOE1o","45cIHFFDui","In3NSfcJOy","fFDrJs93Ml","Q6Lix3weIF","y94nwzFgtB","POUYSVjCZq","8cVD34W0Tl","14FLRDLhzM",
+"zY1GYOUqFM","Z4I1vsx5Gl","iwzGk4dEz6","OUqFMHlUbF","d85a9BCxeC","JJs5mKr8ys","mX2GEfmIK1","uTacxGWqqX","pFrrl9XyT9","Ss0ZuAXpwE",
+"RBhp0gIYvE","n1pmOpWiOs","BGaQYSbRYy","JXljWnnP8o","uZPqgMm8si","uvf7AWDVWJ","lpF6WuLtKs","lweGyChuy3","lpF6W9iGoT","uupzkJIqXi",
+"ECMvUd7vjM","s93MlyofH3","WMiS3ThjNn","SmGzvdQ586","dQ586FjHXR","Cp3mZSmGzv","qQxHP9iGoT","sx5GlBpYhV","fcwDaprNT6","F6PT2AmdQd",
+"StlDJatef2","AmdQdJKWYR","FxX9qB3qem","0Wr5yuJScX","5Drn0Cfgr3","WmadAF6PT2","TXQ0Z9XyT9","GWqqXhE1Ql","QChxsAIYUu","2Yz7E9y4lw",
+"No0QbbrhlQ","EdBKc7lUXZ","AOgEekB5nP","BpYhV7lUXZ","8FmFHtjQxs","QClRLtaOXK","M6qcGSmGzv","m4bxUpT8wu","5Mg9riwzGk","MGlTF0MR5X",
+"1j5L8Yf2Ec","blLA9MezSW","ReKEWNOHsz","uLtKsuZPqg","FhtglJJs5m","MK07YUlU3M","t98iWFhtgl","a00b50BmCy","hYBCKReKEW","PYBf46AFT0",
+"jzUqRnlaBy","O3iyQpWiOs","s7MxklpF6W","brhlQlpF6W","mz8gx2hEEU","Pb1paDQimp","CNHmvMkgy8","Waim68xEKz","MK07YMkgy8","faHirsoy9t",
+"7X3uyB3qem","Z4I1vfqypy","7Ow5CtlILt","VerEAgf8rI","P6bcgStlDJ","Vprf2gf8rI","AmdQdyvOMI","B3qemSbRYy","suY4xWaWsv","JJs5mtaOXK",
+"soy9tFFDui","aL6AJKr8ys","0ao3lsx5Gl","CNHmvgtCA5","7fsYM8RCUA","Mm8siv2eC3","dQ586lm0pD","zFgtBjeskS","IKxdLulk41","4W0TlTXQ0Z",
+"sx5GlgjUTu","soy9t0ao3l","1LB1LM3zXL","QbxXcgIYvE","xciqp5nmWv","a00b5OUqFM","KASQ8zbIYY","uJScXNcICA","FGzgprz7Ut","bgJAzfcJOy",
+"24ARFCp3mZ","VLTy6Mm8si","hYBCKBCxeC","aez9yJJs5m","GrDg7LbRTH","9XyT9bgJAz","Waim6uvf7A","8hJdtQWxoT","dmoS7aez9y","5IhmG64s8N",
+"uvf7AhYBCK","fcwDaAmdQd","OHaBzhE1Ql","zqH0WHlUbF","soy9taez9y","8TxD7sqVrf","Y1mC02ZHdk","5IhmGPYBf4","sqVrfQssNC","jtn0XKr8ys",
+"guMb8QClRL","2hEEU45cIH","CxVEfh1zcH","n8pJ9EoToP","FcWrWBbwgA","Rxrsm4W0Tl","ni2v1FPfSE","QYxC0oGu6x","Y1mC0iB08l","G1RhSFPfSE",
+"gf8rIni2v1","NOHszDLhzM","uJScXaDGtS","YOfrY07n1c","mX2GEh1zcH","8FmFH5VZjS","b29RJFnPFB","G1RhS7X3uy","dQ586zHF1q","hi5X7l83Ud",
+"MK07YPOUYS","CdyBVIjTwP","Gv3FqyToGW","M3zXLblLA9","nnP8olXFOB","CqqaDNOHsz","5VZjSzbIYY","lweGyGv3Fq","yvOMI4dEz6","m4bxU1j5L8",
+"t98iWbgJAz","EoToPdmoS7","MaJQsdpe1v","cmXIXo8Uyd","azIWpBbwgA","RmDcrxReec","gdQsSi7WMQ","6AFT0s4786","YjB9twDajX","3otm6n1pmO",
+"Mkgy8jiVBP","fFDrJQbxXc","ThjNnHfyNQ","zFgtBJXljW","s93Ml45cIH","DG4sTguMb8","WPmlxiKqhr","Vprf216lHc","7lUXZfcJOy","2DREsQssNC",
+"cmXIX29QAz","Q6hMChUTw7","IBe8kXyPZN","QworulCMxy","HfyNQpWiOs","VIlwPIn3NS","Yf2EcVjCZq","nlaByW3VFH","0Wr5yAmdQd","WDVWJ0Kyfs",
+"lm0pDPYBf4","IBe8ksx5Gl","tuDySsuY4x","pAhR1Z4I1v","QbxXcBpYhV","zbIYYX6Pin","0YAGHMojnP","taOXKgtCA5","lsQGoQWxoT","UlU3MGWqqX",
+"HfyNQ1LB1L","XyPZNv1Hln","vOqCE07n1c","BpYhV9y4lw","7Ow5CgdQsS","QnJ1SzQt6Q","JXljWP6bcg","QChxsatef2","WDVWJG1RhS","y94nw7fsYM",
+"GrDg7e6e4z","Mm8siciuWz","bgJAzgjUTu","JIqXiQ6Lix","s4786ru4UG","yluBxvkCHH","FGzgpaez9y","s93MlZuDtD","29QAzaez9y","GrDg7uN6r3",
+"jiVBPQssNC","lj07QbrhlQ","yEfy9M6qcG","pAhR1CqqaD","QssNCM6qcG","Vprf22hEEU","ZhwG1qUJMd","FhtglO3iyQ","e6e4zuupzk","JkzUnVprf2",
+"rz7UthSSvQ","VLTy6KASQ8","UmaEv16lHc","9XyT9SmGzv","nnP8oFVMxo","Cp3mZVBjhz","FjHXR8hJdt","SmGzv7Ow5C","prNT6B3qem","VerEAVjCZq",
+"618Di7lUXZ","lpF6WWmadA","2NslmprNT6","OUqFMyluBx","bgJAzulk41","jfREuFwEJz","QssNCuTacx","HfyNQxReec","64s8NfcwDa","YOfrYQClRL",
+"OUqFMW7cTs","DQimpjS1aj","Mm8siNOHsz","gdQsSM3zXL","atef2FGzgp","yluBxD6rBy","VIlwP29QAz","d7vjM2Yz7E","NOHszm4bxU","9y4lw5drc6",
+"NOHsz580YD","ZuDtDAkKTk","fmIK1Q6hMC","ogLgcd85a9","IBe8k580YD","jfREuUvlv4","1j5L8ZJTXH","AmdQdpv0i7","0KyfsuQIcz","wiHrZyluBx",
+"5nmWvtuDyS","KsjRKxciqp","9iGoTydG8U","yvOMIWreyP","HlUbF29QAz","EoToPGWqqX","KASQ80ao3l","FVMxoRsQUq","zmLYD7Ow5C","RACujsuY4x",
+"s4786MaJQs","ECMvUuTacx","tl72WaDGtS","Q6hMCjzUqR","fcwDaTa8f6","t59lROUqFM","CK5W7CNHmv","AmdQdzQt6Q","CNHmvLDk6f","3weIFAXpwE",
+"FjHXRO3iyQ","he9IAGv3Fq","9XyT9EOE1o","t98iWNhXdu","kB5nPv2eC3","Yw2oUbZLvS","Yf2Ec3weIF","azIWpogLgc","Yf2EcZzJHW","ogLgcNxx9V",
+"b29RJnFqik","FjHXRyluBx","iKqhrMaJQs","ZzJHWuvf7A","djsrvtlILt","Twanov8yFN","QnJ1SZJTXH","ru4UGdmoS7","pvgjSuLtKs","jSjS3lViBv",
+"jSjS3v1Hln","Mm8si5Mg9r","MGlTFuQIcz","pT8wuGSQwj","k85AeFLsph","dmoS7ZhwG1","uLtKsPb1pa","W3VFHuN6r3","t98iWmz8gx","Waim6lCMxy",
+"v2eC35nmWv","jS1ajdjsrv","tlILtJRJQB","5IhmGhe9IA","qQxHPJXljW","lj07QrKDLJ","NAFuwGXdoH","8TxD7ZzJHW","vOqCElXFOB","gjUTuvLsmS",
+"SWfou5Namm","OUYuFG1RhS","ReKEWxciqp","Cp3mZWPmlx","GXdoHOz8yZ","LewvMUlU3M","dmoS7yofH3","s93Mlzz4ZU","MK07YVBjhz","BbwgA8TxD7",
+"48cHLJkzUn","Cp3mZ4W0Tl","oVQp6MaJQs","FNYIMWaWsv","brhlQ3otm6","pmeCd5iGN5","jSjS3b29RJ","zHF1q8cVD3","jiVBPtl72W","LbRTHMGlTF",
+"BpYhVxReec","8xEKzPb1pa","U3yw56q6L9","rKDLJjeskS","n1pmOWMiS3","n1pmOprNT6","OUYuFK4GS8","Oz8yZNxx9V","M3zXLhUTw7","WmadAFwEJz",
+"7hyVvksJby","Gv3Fq48cHL","Vprf2lH1kt","lpF6Wsx5Gl","BFkb8OUYuF","qUJMdfaHir","qaofNrhl0J","FFDuiRxrsm","9iGoTgdQsS","TCgPpsqVrf",
+"U3yw5IjTwP","uoStwFPfSE","HRxd8QnJ1S","oQ87rPOUYS","StlDJJ2mQi","DLhzMOUYuF","TXQ0ZChuy3","6q6L9DLhzM","s93Ml8TxD7","GSQwjzY1GY",
+"tuDySlj07Q","MaJQsG1RhS","Mkgy8HzZT8","v2eC3OxWIH","guMb8lpF6W","IjTwPM3zXL","2ZHdki7WMQ","0h1b1uPX7G","hUTw7SWfou","L7cGcvLsmS",
+"tvdkDguMb8","MezSWRBhp0","fLNg8uQIcz","4QMc9MmKGJ","gdQsS9eoRc","dQ586gjUTu","QWxoT2Yz7E","C2Irct59lR","fqypyhYBCK","uZPqgECMvU",
+"2hEEU5Mg9r","ZJTXHciuWz","SjskQY1mC0","O3iyQ9XyT9","zHF1qo8Uyd","QWxoTo8Uyd","faHirMmKGJ","jiVBPmz8gx","iKqhrzQt6Q","djsrvThjNn",
+"bgJAzD6rBy","48cHL5drc6","gjUTu7ku1p","YOfrYn8pJ9","S2Dfu9XyT9","iB08lnlaBy","FPfSERmDcr","euZA53otm6","W7cTsFLsph","ECMvUYf2Ec",
+"ksJbyEOE1o","jfREuVprf2","iwzGktvdkD","Ul4a1m4bxU","zHF1qI7p2a","uTacxhYBCK","0KyfsIRh48","JkzUnFcWrW","wDajXWDVWJ","LewvMI7p2a",
+"8U2nU9y4lw","Ul4a1lkMUA","FjHXRGSQwj","prNT6zHF1q","yEfy9iwzGk","8hJdtSmGzv","t59lRWmadA","n8pJ9Fhtgl","618DiRsQUq","zqH0WkZANm",
+"HlUbFKsjRK","cShY2S77LH","dQ586fFDrJ","7ku1p3weIF","e6e4zrz7Ut","yToGWJXljW","L7cGclH1kt","AgJHQ5ZaEz","W3VFH2Yz7E","FFDuiDLhzM",
+"5VZjSCp3mZ","ni2v1Mkgy8","fqypyECMvU","IKxdLlweGy","dhSuHMojnP","NAFuw7X3uy","Yh1hFW7cTs","d85a9lCMxy","Chuy3e6e4z","MmsIo0Wr5y",
+"IKxdLX6Pin","hE1QlZuDtD","M6qcGyvOMI","55rfB4dEz6","uQIczqUJMd","UmaEvxciqp","uQIczBpYhV","C2IrcJXljW","3otm6QYxC0","i7WMQprNT6",
+"4QMc9MK07Y","LDk6fpiJSk","aL6AJlXFOB","JIqXiqUJMd","s4786TCgPp","Mm8silpF6W","FFDuiLbRTH","QWxoTb29RJ","QChxsQClRL","RACujn1pmO",
+"IBe8k5Drn0","ZuDtD8TxD7","CdyBVQ6Lix","8xEKzW7cTs","t98iWzqH0W","Z4I1v5Drn0","FnPFB9eoRc","guMb8qaofN","Dz1R3Rxrsm","nnP8ox3LDe",
+"3otm6nlaBy","x3LDefqypy","U3yw5cShY2","brhlQOUqFM","zz4ZUmX2GE","OUYuFSs0Zu","LbRTHHfyNQ","BpYhVciuWz","JKWYRpmeCd","FwEJzTa8f6",
+"h1zcHvOqCE","Z4I1vAkKTk","qUJMdcQOnv","sx5GlfFDrJ","TwanoQ6Lix","5NammIBe8k","pv0i7aez9y","BbwgAWreyP","gf8rIBbwgA","IjTwPAkKTk",
+"fcJOyfaHir","5IhmG5IhmG","uLtKs45cIH","d85a9BFkb8","s93MlZUnqt","U3yw5ciuWz","G1RhSQ6hMC","a00b5lm0pD","MK07Yh1zcH","dpe1vVIlwP",
+"suY4xWmadA","VNCPdaFFss","0YAGH5Namm","e6e4zNOHsz","NAFuw5drc6","Y1mC0tuDyS","gf8rIWPmlx","14FLRrhl0J","0PktIMGlTF","NOHsz8RCUA",
+"FwEJz0MR5X","aL6AJzY1GY","uupzkwiHrZ","gjUTuKZamH","X6Pin9y4lw","xXTI4OUqFM","vOqCEbrhlQ","lm0pDqUJMd","9iGoTnnP8o","v1HlnDG4sT",
+"WreyPFnPFB","yToGWThjNn","FLsphCxVEf","FjHXRIBe8k","4dEz6DcpWB","d85a95IhmG","OHaBzMmsIo","0h1b1KASQ8","k85Ae7hyVv","B3qemW3VFH",
+"wiHrZKASQ8","dmoS79y4lw","s7MxkJRJQB","2Yz7EHfyNQ","ThjNnNcICA","2Yz7EFnPFB","vkCHHW7cTs","AgJHQFGzgp","NhXdupv0i7","d7vjMv1Hln",
+"jtn0XgjUTu","XflUquJScX","OUqFMmX2GE","YOfrYKsjRK","0Wr5ywDajX","CNHmvMGlTF","okgRi8xEKz","t59lRHzZT8","EOE1oh1zcH","pmeCdiB08l",
+"x3LDecQOnv","k85AeUvlv4","uN6r3nnP8o","gIYvEGSQwj","4QMc94W0Tl","ZzJHW9rlg9","ZhwG1ZuDtD","yToGW7Ow5C","Kr8yssx5Gl","Q6LixguMb8",
+"ulk41okgRi","cL0aEbgJAz","blLA98hJdt","RzaZAlXFOB","QbxXcChuy3","uPX7GNAFuw","NOHszIKxdL","DLhzMoQ87r","iqv4ki7WMQ","qaofNSmGzv",
+"Dz1R3nlaBy","QbxXc0BmCy","xReecKASQ8","aL6AJXflUq","bgJAzBGaQY","ru4UG9iGoT","VNCPd2Nslm","iqv4kThjNn","G1RhSCdyBV","xXTI4ZJTXH",
+"xReecStlDJ","1v5hHFhtgl","8TxD7AgJHQ","dpe1vx3LDe","POUYSSbRYy","KASQ8FNYIM","TwanoWaim6","DQimpQnJ1S","m4bxUlj07Q","5nmWvFhtgl",
+"FFDuiZUnqt","vkCHH16lHc","rhl0JFVMxo","lj07QiwzGk","BCxeC9iGoT","EdBKct98iW","CK5W7cmXIX","aDGtSgIYvE","FGzgpsoy9t","7fsYMAkKTk",
+"yEfy9BpYhV","MGlTF8U2nU","FPfSEuLtKs","OxWIHW3VFH","64s8NY1mC0","0ao3ln1pmO","UlU3MWPmlx","rKDLJuQIcz","uQIczS2Dfu","S2DfuM6qcG",
+"hE1QleuZA5","pFrrl8RCUA","SmGzvnFqik","7X3uyi7WMQ","Y1mC0CxVEf","5NammQWxoT","X6PinfcJOy","VLTy64QMc9","qUJMdAOgEe","JXljWB3qem",
+"14FLRPb1pa","1j5L89eoRc","QWxoTMaJQs","SWfouY1mC0","MezSWsx5Gl","iwzGkxciqp","xReec9rlg9","k85AevLsmS","i3pydyluBx","sqVrfHlUbF",
+"QYxC0azIWp","5NammuLtKs","0h1b1vOqCE","rz7UtyluBx","s7MxkxXTI4","0h1b1StlDJ","PYBf4mX2GE","FGzgphi5X7","5Drn0rhl0J","ni2v17X3uy",
+"xXTI4kZANm","d7vjMKsjRK","NAFuwHfyNQ","FjHXRCxVEf","pmeCd4QMc9","JkzUnKr8ys","lkMUASjskQ","FwEJz5Namm","Y1mC0dpe1v","Uvlv4FxX9q",
+"7Ow5CgIYvE","d85a9Q6hMC","IKxdL580YD","dhSuHZv7z0","6AFT0XyPZN","9iGoT580YD","AXpwEZ4I1v","QYxC0W7cTs","X6PinUmaEv","EoToP9eoRc",
+"wiHrZLewvM","Ul4a1QWxoT","AgJHQFwEJz","b29RJCfgr3","ZuDtDWaWsv","7X3uyLbRTH","0YAGHJJs5m","CdyBVjtn0X","lweGy7lUXZ","EoToPiKqhr",
+"580YDZUnqt","WreyPECMvU","QssNCfcwDa","s93Mluvf7A","FNYIMlsQGo","YjB9tQ6hMC","Yh1hF0Wr5y","Waim6RBhp0","tvdkDS77LH","8hJdtCdyBV",
+"e6e4zsqVrf","ogLgcsuY4x","ix74rS77LH","JKWYRSWfou","1LB1LWaim6","fFDrJlweGy","Rxrsm618Di","FFDuioGu6x","Cfgr3S77LH","s93MlFLsph",
+"aL6AJjSjS3","TCgPpoQ87r","EOE1ofaHir","zY1GY0ao3l","zHF1q5Mg9r","7Ow5CtjQxs","FLsphlCMxy","CIShGvkCHH","qUJMd9GXkX","KsjRKVprf2",
+"azIWpM6qcG","F6PT2YjB9t","taOXKgIYvE","lXFOBmz8gx","I7p2aDLhzM","M6qcGjS1aj","5VZjS0PktI","v8yFNFwEJz","O3iyQDLhzM","lpF6WHfyNQ",
+"VerEAK4GS8","9eoRclXFOB","Yw2oUsoy9t","0Wr5ydhSuH","BpYhVuPX7G","Chuy3Waim6","d85a9prNT6","wiHrZSbRYy","Pb1pajeskS","FGzgpF6PT2",
+"PYBf4FwEJz","t59lREdBKc","rKDLJ8U2nU","StlDJOUYuF","UlU3Mrhl0J","pAhR1t59lR","zqH0WsuY4x","Cfgr3zY1GY","5Drn0oGu6x","4dEz6zQt6Q",
+"LewvM8U2nU","CK5W70Kyfs","RmDcriB08l","2ZHdk1LB1L","U3yw5Ss0Zu","iqv4kv2eC3","kB5nPCIShG","dhSuHuvf7A","ulk41CK5W7","KsjRKThjNn",
+"RmDcrOHaBz","FPfSEKr8ys","MGlTFRzaZA","lCMxyW7cTs","AXpwEmX2GE","lpF6Wru4UG","U3yw5S2Dfu","fqypySWfou","BpYhVRBhp0","RmDcraDGtS",
+"RBhp0Mkgy8","VNCPdix74r","FhtglCqqaD","sqVrfKZamH","yvOMIv2eC3","2ZHdkEoToP","0BmCyL7cGc","lH1ktpv0i7","0h1b10Kyfs","L7cGcsuY4x",
+"oQ87rQnJ1S","faHirVprf2","yluBx7fsYM","JKWYR0BmCy","v1HlnfcJOy","sx5GlzqH0W","yToGWguMb8","gjUTuBbwgA","cQOnvG1RhS","oVQp6RACuj",
+"7ku1pMK07Y","64s8NFFDui","QClRLbZLvS","OUYuF580YD","ulk41MK07Y","MK07YFjHXR","2DREsnlaBy","jzUqRzY1GY","UmaEvRmDcr","azIWpfaHir",
+"wDajXhSSvQ","S77LHxciqp","gf8rIBpYhV","NAFuwrKDLJ","BGaQYM6qcG","l83UduTacx","zQt6Q2ZHdk","k85Aeh1zcH","v8yFNyEfy9","BGaQY7fsYM",
+"zY1GYUmaEv","blLA9ZUnqt","LDk6f0h1b1","MaJQsuN6r3","pvgjSYf2Ec","KZamHjSjS3","SbRYyyvOMI","jzUqRK20wK","5drc6jfREu","5Namm2Nslm",
+"atef2ulk41","bgJAz8TxD7","2hEEUlweGy","lm0pDuLtKs","7hyVvix74r","CIShGoVQp6","jzUqRRmDcr","Mkgy80YAGH","oVQp614FLR","PYBf4JIqXi",
+"CIShGTa8f6","yofH3yluBx","MmKGJtuDyS","2DREs618Di","5iGN5Yf2Ec","uQIczJKWYR","CNHmvMezSW","gdQsSh1zcH","2TRI76q6L9","OxWIHciuWz",
+"d7vjMCfgr3","RACuj5Namm","Kr8ysWreyP","VBjhzhe9IA","tlILtfFDrJ","FwEJz2DREs","EdBKcaFFss","WPmlx6AFT0","bZLvSYw2oU","FVMxo2Yz7E",
+"RpBQmzFgtB","fqypypvgjS","HfyNQguMb8","FPfSEgtCA5","jtn0XAkKTk","jeskSUl4a1","07n1clweGy","okgRi55rfB","RzaZAmz8gx","FLsphnFqik",
+"HlUbFgjUTu","tAOsr8cVD3","uoStwRACuj","ThjNnoQ87r","64s8NjfREu","fLNg82Yz7E","ksJbyBFkb8","LDk6f2hEEU","XyPZNiKqhr","aez9y2Yz7E",
+"WaWsvjzUqR","SmGzvfmIK1","Gv3FqiwzGk","ulk41JIqXi","hi5X7fcJOy","aez9yCfgr3","GSQwj9eoRc","07n1cAgJHQ","MojnPo8Uyd","iqv4kOxWIH",
+"PYBf4qUJMd","618DipAhR1","uZPqgMezSW","ni2v1RsQUq","Waim6hYBCK","CxVEfhi5X7","zQt6QPYBf4","hSSvQDLhzM","sqVrfcmXIX","Uvlv47fsYM",
+"dQ586hYBCK","fcJOypFrrl","Y1mC0XyPZN","ZzJHWCdyBV","0h1b1QChxs","ogLgcni2v1","CIShGfmIK1","QworuxReec","TCgPpiB08l","In3NSNOHsz",
+"StlDJcmXIX","dmoS7pv0i7","WaWsvcL0aE","8TxD7EoToP","b29RJBCxeC","Cp3mZTa8f6","Chuy3rz7Ut","ksJbyoVQp6","OUqFMxXTI4","bgJAzPb1pa",
+"yvOMIiB08l","5VZjSiKqhr","VBjhzWmadA","VjCZqgf8rI","DQimpQChxs","wDajXJIqXi","HzZT8ThjNn","QnJ1Ss7Mxk","oGu6xzY1GY","xXTI4M3zXL",
+"he9IAHzZT8","pFrrlv8yFN","I7p2a7X3uy","lweGynnP8o","GXdoHpiJSk","Gv3Fqv8yFN","WMiS3jS1aj","qQxHPvkCHH","v8yFNdjsrv","RmDcr9eoRc",
+"7Ow5Cn8pJ9","29QAzSmGzv","zz4ZUb29RJ","jfREuRsQUq","QssNCFGzgp","qQxHPfFDrJ","45cIHG1RhS","xciqpAmdQd","5Drn0VIlwP","uTacx0YAGH",
+"0h1b1zHF1q","Oz8yZ14FLR","7fsYM2Nslm","KZamH6q6L9","gtCA5fcJOy","MmKGJL7cGc","zFgtBOz8yZ","1v5hHblLA9","sx5Gl7lUXZ","9XyT9LDk6f",
+"POUYSuPX7G","RACuj8hJdt","ZzJHWhe9IA","Yw2oUeuZA5","9rlg9XflUq","piJSk29QAz","xReecVNCPd","iKqhrRkQke","DcpWB7fKYU","24ARFK4GS8",
+"cShY2pv0i7","qaofNG1RhS","2hEEU7ku1p","e6e4zSmGzv","yToGWRzaZA","jSjS3JIqXi","VjCZqaDGtS","UlU3MCNHmv","d85a9SjskQ","TXQ0Z3weIF",
+"48cHLpT8wu","F6PT2dQ586","POUYSksJby","Ta8f6FwEJz","iB08lLDk6f","uQIczfqypy","sx5Gl2ZHdk","8cVD3taOXK","b29RJy94nw","In3NSrKDLJ",
+"qUJMds4786","rhl0Jo8Uyd","cL0aEi7WMQ","Dz1R3lH1kt","JJs5mIRh48","RsQUqPYBf4","JkzUnPb1pa","piJSk6q6L9","bgJAzyluBx","SWfou0ao3l",
+"Kr8ysbgJAz","EdBKc07n1c","5VZjSAmdQd","JJs5mOHaBz","rz7UtBpYhV","ThjNn9iGoT","ThjNnAkKTk","uN6r37Ow5C","jfREuCxVEf","FGzgpRzaZA",
+"BbwgAsqVrf","nFqikLewvM","48cHLW7cTs","oGu6xuN6r3","lH1ktTXQ0Z","jfREuFxX9q","dhSuHUvlv4","MezSWFnPFB","QChxst59lR","0PktIcShY2",
+"i7WMQVBjhz","hUTw7ksJby","b29RJaDGtS","SWfouBCxeC","VNCPdiB08l","iqv4k16lHc","W3VFHW3VFH","WaWsvDcpWB","cmXIXmX2GE","fcwDabZLvS",
+"uPX7GtlILt","ECMvU5drc6","JJs5m8xEKz","zHF1qcShY2","pvgjS7hyVv","x3LDeW3VFH","5iGN5lkMUA","t59lRdpe1v","ix74rs4786","azIWpfFDrJ",
+"Gv3FqvOqCE","n8pJ9618Di","e6e4zFjHXR","e6e4zBCxeC","Zv7z0gdQsS","55rfBiKqhr","zFgtB7fKYU","WaWsvVIlwP","7Ow5Cix74r","iB08lZuDtD",
+"yEfy9FwEJz","taOXK8hJdt","Q6hMCVBjhz","v2eC3ydG8U","ydG8UKr8ys","taOXK7ku1p","Gv3Fqt59lR","gdQsSYf2Ec","ydG8UNhXdu","9rlg9GrDg7",
+"JJs5mThjNn","2Nslm48cHL","4W0Tly94nw","jSjS3GrDg7","K4GS8YjB9t","GWqqX7lUXZ","piJSkuPX7G","618DiKr8ys","ZzJHWRBhp0","QChxs07n1c",
+"brhlQ2Yz7E","AmdQdFjHXR","NOHszI7p2a","brhlQcShY2","Ss0ZuiwzGk","FGzgpdQ586","Cfgr3HP433","RpBQmuoStw","ZzJHWmX2GE","55rfBhYBCK",
+"tAOsroVQp6","pv0i7VBjhz","GXdoHAgJHQ","gf8rIB3qem","pWiOslpF6W","WaWsvgIYvE","lViBvzY1GY","ZUnqtY1mC0","k85AeFNYIM","Ss0ZufFDrJ",
+"DLhzMDz1R3","OxWIHyEfy9","ciuWzSmGzv","hi5X7MGlTF","NcICA48cHL","qUJMd580YD","0BmCyvOqCE","azIWp1j5L8","dmoS7JkzUn","hYBCKxciqp",
+"Ta8f6uN6r3","zHF1qD6rBy","guMb8tuDyS","XflUqlpF6W","uoStw7fsYM","Mkgy8pvgjS","J2mQiAOgEe","LewvMFcWrW","CK5W7uJScX","W7cTsuoStw",
+"CqqaDyofH3","64s8N8hJdt","DLhzMlViBv","jfREuTa8f6","lViBvBpYhV","W7cTs4QMc9","16lHcs7Mxk","5iGN5IjTwP","kZANmFVMxo","W7cTsFnPFB",
+"580YDfcwDa","LDk6ftjQxs","xciqpNOHsz","8RCUA2TRI7","VerEAzz4ZU","FnPFBK4GS8","dQ5865IhmG","MojnPUvlv4","XyPZNpWiOs","9y4lwDQimp",
+"4W0TlDLhzM","Ss0ZuAIYUu","guMb8aez9y","fLNg8hE1Ql","29QAzVNCPd","8cVD3VIlwP","Cfgr3D6rBy","oVQp60MR5X","mz8gx0BmCy","8U2nU7ku1p",
+"Fhtgl7Ow5C","tlILtv2eC3","qaofNTa8f6","gf8rIFnPFB","UmaEviwzGk","QYxC0K4GS8","D6rByhe9IA","kB5nPHzZT8","BbwgADcpWB","yToGWWPmlx",
+"FxX9qkZANm","lweGyKr8ys","lpF6Wv1Hln","zFgtBv1Hln","fmIK18U2nU","5VZjSHP433","v1HlnPYBf4","tuDySQYxC0","B3qemvOqCE","soy9t0Wr5y",
+"lViBvDQimp","hE1QlfFDrJ","S2DfuuLtKs","48cHL9iGoT","OUqFMd7vjM","uTacxcL0aE","P6bcg24ARF","7ku1pNOHsz","D6rByFhtgl","soy9tYh1hF",
+"Oz8yZjeskS","OUYuFLewvM","suY4x2ZHdk","Waim6oQ87r","pmeCddmoS7","DG4sTKASQ8","Q6Lixh1zcH","BFkb8gdQsS","taOXKHlUbF","WPmlxt98iW",
+"brhlQYf2Ec","FNYIMru4UG","XflUqECMvU","55rfBazIWp","KsjRKiKqhr","B3qemQnJ1S","pFrrlZhwG1","JJs5m7ku1p","qQxHPsuY4x","48cHLo8Uyd",
+"VLTy67fKYU","xReecCxVEf","MK07Y24ARF","zbIYYVBjhz","CdyBV8U2nU","ulk41In3NS","zbIYYuQIcz","0BmCyn1pmO","tuDyS580YD","Yw2oUsx5Gl",
+"s7MxkEOE1o","oGu6x6q6L9","kB5nPbZLvS","GXdoHhYBCK","J2mQi2TRI7","dQ586DLhzM","QssNCJXljW","VIlwPO3iyQ","7X3uysuY4x","D6rBylViBv",
+"KZamHtvdkD","Oz8yZMaJQs","16lHcVLTy6","JKWYRMezSW","aL6AJYOfrY","K4GS8gjUTu","tl72W2Yz7E","m4bxUFGzgp","ZJTXH8TxD7","5Nammlj07Q",
+"he9IAaez9y","BCxeCRsQUq","MK07Y5VZjS","jSjS364s8N","Kr8ysqQxHP","s7MxkCNHmv","kZANmCp3mZ","X6PinOxWIH","M6qcG4QMc9","fmIK1ZzJHW",
+"5drc6Pb1pa","JXljWZuDtD","WreyPrhl0J","Vprf2S77LH","ZuDtDCIShG","In3NS8U2nU","POUYSprNT6","JRJQBOxWIH","iKqhrMmKGJ","D6rByBFkb8",
+"ulk41zHF1q","NcICAe6e4z","n8pJ9vLsmS","Ss0ZuxReec","hYBCKiKqhr","RkQke5IhmG","QbxXcLewvM","fLNg8pWiOs","WPmlxuZPqg","RpBQm5Mg9r",
+"lCMxybrhlQ","a00b5KASQ8","RsQUq8xEKz","lj07Q6q6L9","8cVD3MmKGJ","RzaZAJ2mQi","MojnPStlDJ","6AFT0kB5nP","Gv3Fq0PktI","ydG8UwDajX",
+"djsrvJkzUn","euZA5O3iyQ","nlaBydhSuH","atef2618Di","oGu6xguMb8","kB5nPMmsIo","jfREutAOsr","lsQGo9GXkX","ReKEWeuZA5","HP433GrDg7",
+"2Yz7E2DREs","5nmWvBbwgA","24ARF55rfB","blLA9JJs5m","GrDg7k85Ae","FhtglDG4sT","7X3uyQssNC","uJScXBGaQY","RsQUqLbRTH","dhSuHAkKTk",
+"lXFOBBpYhV","7Ow5C4dEz6","DG4sT16lHc","UmaEv14FLR","azIWpDz1R3","xciqpMkgy8","uQIczgtCA5","fmIK1MezSW","P6bcgM3zXL","8RCUAM3zXL",
+"07n1cRsQUq","Nxx9Vn1pmO","i3pydMaJQs","t98iWQssNC","ix74raDGtS","fLNg8aFFss","RzaZAd7vjM","jeskSMezSW","8RCUAmX2GE","1j5L8AmdQd",
+"16lHc45cIH","lCMxyUl4a1","MK07YQ6Lix","brhlQHP433","MaJQsZuDtD","EoToPuvf7A","BpYhVkZANm","OUYuFcShY2","ydG8UuQIcz","ciuWzDcpWB",
+"uN6r3Gv3Fq","dhSuHGv3Fq","4QMc9JRJQB","0MR5X8FmFH","ECMvUqQxHP","3weIFbZLvS","FGzgpCp3mZ","6q6L9GrDg7","vLsmSSbRYy","X6Pin7ku1p",
+"brhlQaFFss","oQ87ri7WMQ","aez9y0MR5X","MojnPMm8si","CNHmvjtn0X","8TxD74W0Tl","l83Udgf8rI","Y1mC0xXTI4","Pb1paiKqhr","KZamHNxx9V",
+"45cIH16lHc","Yw2oUZuDtD","GWqqXOHaBz","KASQ8ru4UG","FnPFBeuZA5","EOE1oxciqp","jiVBPIn3NS","AIYUu24ARF","RkQkeJXljW","yofH3DLhzM",
+"TXQ0ZKZamH","2NslmCfgr3","uPX7GydG8U","taOXKuAWyp","2DREsgtCA5","G1RhSQnJ1S","a00b5v1Hln","9y4lwUlU3M","ReKEWMGlTF","aDGtSv8yFN",
+"J2mQiQssNC","DG4sTBpYhV","s7MxkO3iyQ","WPmlx9XyT9","StlDJni2v1","piJSk5Namm","S77LHEdBKc","WPmlxHRxd8","AkKTkFLsph","8xEKzaez9y",
+"2DREsYw2oU","lm0pDsx5Gl","ulk41VIlwP","AgJHQ24ARF","JKWYRe6e4z","ZzJHWQbxXc","hE1QlFFDui","4dEz6WaWsv","zHF1qoQ87r","GXdoHTCgPp",
+"lm0pDoQ87r","ogLgcMojnP","yToGWRpBQm","0YAGHksJby","7hyVvLDk6f","CxVEflCMxy","oGu6xgIYvE","qaofNJRJQB","JRJQBFPfSE","t98iW5iGN5",
+"uN6r3yluBx","POUYSy94nw","3otm69eoRc","5nmWv07n1c","FxX9qDLhzM","yToGWP6bcg","rz7UtFPfSE","ogLgcl83Ud","nnP8oVBjhz","ZJTXHnlaBy",
+"EdBKcWMiS3","WDVWJM3zXL","RpBQmciuWz","fFDrJdQ586","x3LDeL7cGc","zHF1qX6Pin","X6PintlILt","zHF1qWPmlx","ni2v1jSjS3","HzZT8ogLgc",
+"HfyNQpv0i7","QWxoT5VZjS","n8pJ9azIWp","Ss0ZusuY4x","PYBf4NOHsz","pT8wutlILt","0BmCy6AFT0","9iGoTRkQke","L7cGcFwEJz","dhSuHmX2GE",
+"WaWsv8xEKz","5Drn0In3NS","8FmFHAgJHQ","BpYhVDG4sT","zFgtBAkKTk","29QAz9XyT9","zFgtBs7Mxk","CIShGNAFuw","8xEKz1j5L8","AIYUuuTacx",
+"Oz8yZzbIYY","CK5W7soy9t","mX2GECdyBV","X6Pin4W0Tl","BpYhVKASQ8","prNT6fLNg8","nlaByUl4a1","DQimptjQxs","BpYhVi7WMQ","i7WMQYOfrY",
+"X6Pin2Nslm","MezSWLDk6f","blLA98U2nU","WPmlxjfREu","n1pmO7X3uy","pmeCdoQ87r","Mm8siChuy3","LewvM0h1b1","IRh48n1pmO","RBhp02DREs",
+"IRh484W0Tl","lpF6WFNYIM","AkKTkCp3mZ","VerEAmX2GE","F6PT2jS1aj","XyPZNfLNg8","cL0aE7fsYM","xXTI4RzaZA","HzZT80PktI","zqH0WhYBCK",
+"9rlg9O3iyQ","hSSvQhe9IA","9y4lwlXFOB","ZuDtDRBhp0","Y1mC0KsjRK","2ZHdkdhSuH","TCgPpBGaQY","AkKTk5nmWv","IRh48Y1mC0","zY1GYmX2GE",
+"In3NSlH1kt","SmGzvzY1GY","AmdQdJXljW","gdQsStjQxs","Ss0Zun8pJ9","580YDdpe1v","QworuNOHsz","ZhwG1yToGW","jtn0XtAOsr","oVQp6lpF6W",
+"8hJdt8U2nU","dQ586RzaZA","9XyT9pv0i7","JXljWFwEJz","AXpwEzY1GY","jS1ajSbRYy","2DREsgIYvE","0YAGHWDVWJ","WreyP8U2nU","5Mg9rjzUqR",
+"StlDJk85Ae","7lUXZSs0Zu","FVMxotvdkD","BCxeCS77LH","WaWsv9rlg9","a00b5ksJby","L7cGc580YD","nFqikKsjRK","VBjhzpFrrl","TwanoGWqqX",
+"lCMxyuupzk","guMb8Gv3Fq","1v5hHdjsrv","yEfy9JKWYR","CIShGRsQUq","S2DfuSbRYy","gIYvEZzJHW","W7cTsGrDg7","Yw2oUXyPZN","KZamH8RCUA",
+"v1HlnNhXdu","Q6hMCuLtKs","x3LDeHRxd8","0Kyfss7Mxk","I7p2a7lUXZ","CIShGbgJAz","s7MxkuJScX","Uvlv45IhmG","FxX9qtl72W","ru4UGVNCPd",
+"pT8wuNcICA","uPX7GZJTXH","prNT6FLsph","n8pJ924ARF","VjCZqGXdoH","48cHLzmLYD","AgJHQEdBKc","Cp3mZUmaEv","2TRI7LDk6f","iB08lQnJ1S",
+"LbRTHUmaEv","I7p2aSbRYy","WPmlxM3zXL","tvdkD0Kyfs","jiVBP8hJdt","4W0Tl48cHL","d7vjMpiJSk","xReecQ6hMC","cShY2jiVBP","55rfB0ao3l",
+"W3VFHiqv4k","Ta8f61j5L8","EoToP14FLR","RBhp0IKxdL","FnPFBQChxs","guMb8iB08l","WreyPyToGW","jzUqRuoStw","n1pmOuTacx","VLTy6W3VFH",
+"Oz8yZtlILt","8U2nUb29RJ","jiVBPyvOMI","hSSvQl83Ud","cL0aECK5W7","hE1QlF6PT2","In3NSOUqFM","lpF6Wh1zcH","POUYSWaWsv","StlDJ24ARF",
+"aDGtSnnP8o","xXTI4dpe1v","tjQxsXyPZN","IRh48lweGy","FGzgplXFOB","I7p2annP8o","7fKYUaDGtS","fqypyTXQ0Z","AXpwEv2eC3","iB08lMkgy8",
+"WPmlxWaWsv","t98iWWMiS3","zmLYDPYBf4","rhl0J0PktI","FjHXRaDGtS","5Mg9ruupzk","Ta8f6Cfgr3","sqVrfv1Hln","FjHXRlm0pD","djsrvfcwDa",
+"zY1GYMm8si","cmXIXTwano","dhSuHbrhlQ","mX2GECNHmv","tl72WbgJAz","Chuy30ao3l","fcwDasoy9t","zbIYYI7p2a","okgRiVLTy6","ulk41JkzUn",
+"rhl0JksJby","FxX9q3weIF","cShY27lUXZ","lj07QWPmlx","6AFT0POUYS","sqVrfZuDtD","CqqaDWDVWJ","0ao3lSs0Zu","4dEz6i3pyd","RsQUqYOfrY",
+"RxrsmblLA9","he9IAxXTI4","pvgjSK4GS8","3weIFpvgjS","m4bxUiB08l","dhSuH0YAGH","JXljWciuWz","9GXkXUvlv4","JkzUnhE1Ql","O3iyQKsjRK",
+"uJScXYf2Ec","dpe1vs7Mxk","CxVEfzHF1q","SbRYy5VZjS","0YAGHNhXdu","NcICAqQxHP","tl72WcL0aE","W7cTsAOgEe","vkCHHCK5W7","O3iyQdmoS7",
+"k85AeFcWrW","PYBf4WDVWJ","2ZHdksoy9t","y94nw1j5L8","yEfy9fFDrJ","2DREszFgtB","zmLYDAIYUu","zbIYYHRxd8","SmGzv7ku1p","AkKTkAIYUu",
+"FnPFBHfyNQ","CNHmvFnPFB","djsrvuPX7G","0BmCy5iGN5","Chuy3jzUqR","FGzgpn1pmO","fLNg8hi5X7","7fsYMKZamH","TXQ0ZEdBKc","aFFss0ao3l",
+"0KyfsVBjhz","t98iWZuDtD","taOXKDLhzM","7hyVvcQOnv","cL0aEwiHrZ","fFDrJRkQke","HlUbFm4bxU","Yh1hFVLTy6","pvgjSzY1GY","jfREulCMxy",
+"cShY2K4GS8","C2IrckZANm","45cIHxciqp","oGu6xulk41","9iGoTFcWrW","JkzUnAOgEe","AXpwEni2v1","hUTw7gtCA5","2hEEU8TxD7","PYBf49GXkX",
+"5nmWvlj07Q","yToGWuvf7A","yvOMIVNCPd","CxVEfQssNC","dmoS7hSSvQ","s7MxkJIqXi","ogLgcAgJHQ","EoToPVLTy6","24ARFiB08l","wiHrZKsjRK",
+"sx5Glulk41","cL0aEStlDJ","suY4xmz8gx","GXdoHWmadA","QClRLD6rBy","5VZjS07n1c","WPmlxzHF1q","nFqiklXFOB","gf8rIJJs5m","mz8gxQ6Lix",
+"580YDThjNn","Z4I1vGWqqX","QYxC0CxVEf","uZPqg8xEKz","RkQke4dEz6","n8pJ9WaWsv","jfREuI7p2a","jtn0XQssNC","Nxx9VGSQwj","cShY2FnPFB",
+"Oz8yZIKxdL","jeskSsx5Gl","zz4ZU5Namm","WreyPMkgy8","uvf7Asoy9t","VBjhzQbxXc","9XyT9vOqCE","tlILt9GXkX","0MR5Xt59lR","hSSvQDz1R3",
+"wiHrZnlaBy","5Drn08TxD7","WreyPv2eC3","VNCPdjfREu","fmIK1OUYuF","AmdQd55rfB","7X3uydmoS7","ni2v1SjskQ","14FLRfqypy","7X3uyGWqqX",
+"SmGzvZzJHW","RACujuJScX","Ul4a1s4786","UmaEvQWxoT","RmDcrUlU3M","b29RJhYBCK","NOHszGSQwj","Cp3mZFLsph","PYBf4uupzk","FNYIMEOE1o",
+"mX2GEMezSW","1j5L8LDk6f","k85Ae580YD","vOqCED6rBy","F6PT2jtn0X","EdBKcMmsIo","JRJQBvkCHH","5nmWvWmadA","lsQGoulk41","8TxD7RBhp0",
+"v1Hlnix74r","uLtKslm0pD","zFgtBTwano","CdyBVuTacx","JkzUn7lUXZ","7hyVv07n1c","OUqFMKASQ8","he9IAWaWsv","9eoRcQworu","Oz8yZK20wK",
+"EOE1ozmLYD","9XyT9zz4ZU","8cVD3Q6hMC","hi5X7cQOnv","K20wKS77LH","pWiOsNOHsz","pv0i7WPmlx","07n1cTwano","qaofNtlILt","FFDuiiqv4k",
+"lViBvsoy9t","tjQxsoVQp6","aDGtSVerEA","RBhp0CNHmv","lXFOBvLsmS","RmDcrFwEJz","jtn0X29QAz","7lUXZdjsrv","Rxrsmn1pmO","yluBxs7Mxk",
+"QClRLt98iW","zY1GYmz8gx","aL6AJWaWsv","xReecF6PT2","FjHXRXflUq","nFqikOxWIH","t98iWS77LH","6q6L9VerEA","5iGN5GSQwj","HfyNQ5Drn0",
+"RzaZAMaJQs","HlUbF8FmFH","xXTI4qUJMd","QClRLQssNC","nlaByF6PT2","ru4UGNcICA","F6PT27hyVv","nnP8oIKxdL","BbwgAuupzk","XyPZNHfyNQ",
+"pFrrl580YD","CK5W7wDajX","0PktICxVEf","8TxD7DLhzM","FnPFBb29RJ","mz8gxa00b5","e6e4zRACuj","tjQxsDG4sT","sqVrfZ4I1v","8RCUAFcWrW",
+"0YAGHQbxXc","NcICAJkzUn","P6bcg7hyVv","QssNC3otm6","0PktI8FmFH","VLTy6aDGtS","4QMc91j5L8","JJs5mFwEJz","pAhR1P6bcg","VBjhzjfREu",
+"FnPFBYOfrY","uAWypIKxdL","ReKEWpv0i7","LbRTHReKEW","IBe8kU3yw5","uN6r3lCMxy","ix74rNcICA","QYxC0BpYhV","tlILtDLhzM","9eoRcMezSW",
+"618Dil83Ud","9XyT90MR5X","a00b5o8Uyd","D6rByQ6hMC","07n1cv2eC3","cShY255rfB","t98iWhSSvQ","fmIK1LewvM","QssNCzbIYY","lsQGo5iGN5",
+"BpYhVwDajX","KZamHM6qcG","3otm6WDVWJ","ulk419rlg9","4W0TlpmeCd","LDk6fn1pmO","d85a9O3iyQ","tlILtoVQp6","EoToPgtCA5","Kr8ysVprf2",
+"G1RhSjS1aj","ni2v1JJs5m","rKDLJQbxXc","zqH0WW3VFH","sx5GlGrDg7","wDajXbZLvS","07n1cYf2Ec","RmDcrv1Hln","xciqphE1Ql","16lHcCNHmv",
+"HfyNQn8pJ9","DG4sTyluBx","h1zcH2DREs","GrDg7pFrrl","FjHXRDG4sT","KZamHFxX9q","F6PT2ThjNn","Z4I1vBpYhV","VIlwPlViBv","uPX7GazIWp",
+"hYBCKfFDrJ","a00b5brhlQ","tAOsr0Kyfs","wDajXyluBx","tuDySmz8gx","KsjRKAOgEe","AgJHQ5Mg9r","dpe1vlCMxy","gdQsSBbwgA","oVQp6W7cTs",
+"F6PT25iGN5","uN6r39y4lw","NhXduuPX7G","WMiS3MaJQs","euZA5M6qcG","gIYvEjzUqR","SWfou1v5hH","guMb8o8Uyd","yvOMI9XyT9","tlILtNo0Qb",
+"0h1b10ao3l","No0QbwiHrZ","CNHmvpT8wu","n8pJ9tvdkD","uvf7AFjHXR","Kr8ysfcwDa","2TRI7580YD","TwanoJKWYR","IKxdLksJby","n1pmOciuWz",
+"9XyT9qQxHP","B3qemi7WMQ","pvgjSDLhzM","FjHXRzmLYD","2ZHdkwiHrZ","QChxsuZPqg","iKqhrtjQxs","b29RJpFrrl","azIWpMGlTF","uvf7AJXljW",
+"h1zcHKsjRK","8RCUAAXpwE","8TxD7G1RhS","fqypy7hyVv","580YD9rlg9","9y4lwAXpwE","QworucmXIX","JKWYRS77LH","OUYuFTXQ0Z","8cVD307n1c",
+"tAOsrxciqp","s7MxkWreyP","gtCA5dmoS7","9y4lwsoy9t","Ul4a1yofH3","e6e4zGXdoH","JRJQBBFkb8","aFFssYf2Ec","jeskSM6qcG","1j5L8NhXdu",
+"2TRI7WMiS3","AXpwEUlU3M","ZUnqtThjNn","RACujl83Ud","GWqqXRmDcr","RpBQmUlU3M","i3pydnnP8o","qQxHPe6e4z","FVMxoyToGW","tjQxsYjB9t",
+"JkzUnPYBf4","azIWpdpe1v","Q6hMC5IhmG","GXdoHQYxC0","9GXkX9y4lw","suY4xUlU3M","WMiS3uJScX","7fKYUJKWYR","BGaQYfLNg8","HlUbF7ku1p",
+"d85a924ARF","okgRirKDLJ","zHF1qUvlv4","MGlTFd85a9","jS1aj2ZHdk","Z4I1vh1zcH","StlDJkZANm","lViBvKr8ys","n8pJ9VIlwP","5nmWv9GXkX",
+"8hJdtJ2mQi","k85Aeuvf7A","9rlg9Rxrsm","Z4I1vRBhp0","S2Dfu8xEKz","GrDg7mz8gx","dmoS7tAOsr","MezSWMm8si","CqqaD4QMc9","G1RhSzY1GY",
+"TwanoRzaZA","M3zXL1j5L8","uTacxCNHmv","yluBxZJTXH","Vprf23weIF","7hyVvyToGW","Yw2oUAgJHQ","djsrvgtCA5","EdBKcZhwG1","9iGoTgf8rI",
+"Pb1pajSjS3","C2IrcHP433","yvOMId85a9","OxWIHv2eC3","FcWrWQYxC0","rhl0J4QMc9","yvOMIFxX9q","Q6hMC7Ow5C","0MR5X0PktI","0ao3l5IhmG",
+"8FmFHaez9y","yvOMIUlU3M","lViBvgIYvE","oVQp6suY4x","GWqqXPb1pa","P6bcgBCxeC","8RCUAlH1kt","pFrrlFhtgl","0ao3lC2Irc","he9IAQ6Lix",
+"AkKTkzbIYY","taOXKBCxeC","jiVBP2DREs","PYBf4xciqp","4dEz6k85Ae","suY4xwiHrZ","QYxC0VerEA","5VZjSwDajX","BFkb82TRI7","ZuDtDS77LH",
+"rKDLJFNYIM","BCxeC8RCUA","oQ87rFhtgl","IBe8keuZA5","aL6AJYh1hF","v1Hln0h1b1","Kr8ysfmIK1","2hEEU0PktI","Cp3mZS2Dfu","Cfgr3h1zcH",
+"ydG8UpAhR1","Cp3mZAgJHQ","EoToP7ku1p","F6PT2k85Ae","DcpWBDcpWB","P6bcgPOUYS","5drc6DLhzM","dmoS7iwzGk","ksJbyWmadA","No0QbDG4sT",
+"MezSWhe9IA","8cVD3tAOsr","J2mQiCqqaD","9eoRc2DREs","JKWYRTa8f6","7fsYMP6bcg","QssNC9XyT9","ZUnqtPOUYS","2NslmyEfy9","0BmCyZJTXH",
+"Gv3FqHRxd8","atef2JkzUn","RsQUqiKqhr","soy9tG1RhS","MezSWdjsrv","ix74r7hyVv","2TRI7xXTI4","s7MxkZUnqt","8TxD7xciqp","G1RhS4dEz6",
+"yToGWCdyBV","StlDJFnPFB","iqv4kHfyNQ","EdBKcVprf2","DG4sTUvlv4","dhSuHCIShG","9eoRcVerEA","AXpwEe6e4z","ogLgcdjsrv","Chuy3618Di",
+"S2Dfu4QMc9","HzZT8aez9y","DQimpW7cTs","FnPFBFGzgp","QWxoTYh1hF","taOXK0ao3l","CxVEftjQxs","kZANmjSjS3","WMiS3aL6AJ","RzaZAzY1GY",
+"6q6L9lCMxy","cQOnvo8Uyd","EdBKcuPX7G","JkzUnCfgr3","YOfrY9y4lw","GXdoHbgJAz","YOfrY618Di","9rlg9jtn0X","GWqqXtAOsr","YOfrYAmdQd",
+"HfyNQa00b5","pAhR1gf8rI","EdBKcK4GS8","1v5hHt59lR","uTacxMGlTF","XyPZNSbRYy","Chuy3NAFuw","tlILt2DREs","07n1c0PktI","Chuy3he9IA",
+"GSQwjPb1pa","MezSWAmdQd","Gv3Fqb29RJ","6q6L9iB08l","b29RJVLTy6","14FLRpv0i7","Cp3mZFhtgl","y94nwtjQxs","618DiUvlv4","24ARFDLhzM",
+"2TRI70MR5X","cmXIXJ2mQi","JIqXi8hJdt","4dEz6FLsph","VNCPdUvlv4","2TRI7SmGzv","PYBf4QWxoT","lCMxyVprf2","s93Ml5nmWv","aFFssOHaBz",
+"ni2v1MezSW","QWxoTVLTy6","ZuDtDOHaBz","vOqCEjtn0X","0Wr5yuPX7G","4W0TlHlUbF","pvgjSx3LDe","SmGzvZUnqt","FwEJzhYBCK","h1zcH2TRI7",
+"LDk6fIRh48","45cIHBpYhV","GrDg7faHir","EdBKc6q6L9","xXTI4bgJAz","2TRI7lXFOB","LbRTHogLgc","Nxx9VFcWrW","Mkgy8VBjhz","0PktIL7cGc",
+"Zv7z0x3LDe","0ao3l2hEEU","soy9t4W0Tl","4dEz6lm0pD","6q6L9Yf2Ec","B3qemNAFuw","lj07Q9XyT9","WMiS3pvgjS","h1zcHHfyNQ","29QAzS77LH",
+"kZANmK4GS8","2ZHdkMmsIo","48cHLFxX9q","pv0i7M3zXL","K4GS8QssNC","JKWYRqaofN","hE1Ql55rfB","piJSkMezSW","cQOnvUlU3M","gf8rIBGaQY",
+"2Yz7EXflUq","hYBCKGXdoH","v8yFNMezSW","G1RhSPOUYS","jSjS3euZA5","5ZaEzprNT6","Uvlv4zHF1q","BFkb8yofH3","fFDrJru4UG","he9IASjskQ",
+"azIWpU3yw5","aL6AJtlILt","CdyBVrKDLJ","RzaZAuQIcz","RzaZAlm0pD","lj07QZzJHW","aFFss7fKYU","0KyfsHfyNQ","Ta8f6mX2GE","bgJAzWmadA",
+"EdBKcatef2","BCxeCpT8wu","8cVD3KsjRK","oQ87rYh1hF","b29RJTCgPp","zqH0WlH1kt","KsjRKiwzGk","BGaQYRACuj","9rlg9faHir","WmadApmeCd",
+"fqypyS2Dfu","yvOMIlCMxy","b29RJAXpwE","MmKGJ2DREs","pT8wu5Namm","Gv3FqQYxC0","9rlg91v5hH","kB5nPtl72W","kB5nPs7Mxk","DLhzMgjUTu",
+"StlDJS2Dfu","tvdkDVjCZq","Pb1paBpYhV","D6rBy8U2nU","8xEKzzFgtB","QYxC0i3pyd","rKDLJlsQGo","RACujCfgr3","zmLYDpv0i7","RkQkeaez9y",
+"NOHszazIWp","pmeCdCNHmv","16lHcKr8ys","uAWypYOfrY","8FmFHS2Dfu","5NammSjskQ","Nxx9VTCgPp","hUTw7nnP8o","45cIHY1mC0","lj07QfcwDa",
+"FGzgplpF6W","rz7UtRsQUq","5IhmGWaim6","9y4lwi7WMQ","IKxdLciuWz","0MR5XRsQUq","ydG8UQworu","nnP8oQssNC","JXljWZhwG1","gf8rIpiJSk",
+"ksJbytlILt","pFrrlSmGzv","CK5W7KsjRK","RmDcr2TRI7","FFDuiW3VFH","ulk418hJdt","PYBf48hJdt","5ZaEzRmDcr","XyPZNFFDui","hSSvQd7vjM",
+"2hEEUn1pmO","XyPZNIn3NS","WmadAK4GS8","Nxx9VIjTwP","RACujFFDui","07n1cQClRL","uJScXCp3mZ","iKqhrZv7z0","1v5hHWmadA","JIqXiLbRTH",
+"B3qem8FmFH","YOfrYVNCPd","5Drn04dEz6","NAFuwWaim6","2TRI7ogLgc","StlDJRzaZA","0YAGHiKqhr","MaJQsWPmlx","55rfBuTacx","v2eC3m4bxU",
+"s4786zqH0W","B3qemkZANm","Ta8f6QClRL","MezSWB3qem","7Ow5CTa8f6","6AFT0vkCHH","TXQ0Z14FLR","WmadANcICA","5Drn0618Di","h1zcHpT8wu",
+"suY4xDG4sT","JkzUnzFgtB","pAhR1O3iyQ","JJs5m9eoRc","yToGWn8pJ9","jeskSgdQsS","ZUnqt1j5L8","m4bxUUvlv4","Vprf2Ul4a1","QWxoTKsjRK",
+"FnPFBdQ586","y94nw16lHc","tuDySokgRi","JXljWuAWyp","i3pyd55rfB","wiHrZFxX9q","ni2v1Y1mC0","F6PT2FPfSE","d7vjMTwano","NhXdu8xEKz",
+"Ss0ZuYh1hF","y94nwuoStw","NcICAxciqp","CdyBVhSSvQ","mz8gxAgJHQ","JXljWKsjRK","n1pmOThjNn","8FmFHNhXdu","QYxC0tAOsr","tAOsrX6Pin",
+"XflUqOUYuF","ulk41gIYvE","RBhp00h1b1","QWxoTNOHsz","bZLvStuDyS","jtn0XdmoS7","8cVD3l83Ud","xXTI4IBe8k","JXljWFnPFB","ciuWzK20wK",
+"rhl0J7fsYM","Uvlv4RmDcr","s4786zmLYD","K20wK48cHL","lm0pDGv3Fq","VBjhzsuY4x","kB5nPUlU3M","aFFssYjB9t","QYxC0Chuy3","8U2nUJkzUn",
+"GSQwjsuY4x","9eoRcuZPqg","KsjRKru4UG","RkQkepWiOs","M6qcGaL6AJ","yvOMIQssNC","X6Pin3weIF","gjUTulH1kt","7fKYUhE1Ql","Ta8f6RkQke",
+"hUTw7ulk41","07n1c3otm6","64s8NUmaEv","0BmCyGrDg7","0YAGHs4786","5ZaEzCfgr3","RsQUqNAFuw","k85AeiwzGk","NOHszIBe8k","RpBQmZv7z0",
+"Rxrsm0h1b1","iwzGk5VZjS","XyPZNcmXIX","rz7UtDLhzM","FhtglogLgc","3weIFQWxoT","uPX7GjSjS3","RsQUqJIqXi","POUYSwDajX","cQOnvguMb8",
+"5drc6taOXK","5NammStlDJ","ZUnqtMezSW","EoToPEoToP","KsjRK5Drn0","oGu6x8xEKz","dhSuHP6bcg","Mkgy81LB1L","6q6L9zz4ZU","iB08lUl4a1",
+"64s8N45cIH","618DiIn3NS","JIqXiD6rBy","uQIczDcpWB","jeskSIRh48","64s8N9y4lw","ZUnqtVBjhz","nnP8o45cIH","gf8rIL7cGc","IKxdLMkgy8",
+"WDVWJydG8U","5nmWvfmIK1","uvf7ALewvM","lpF6WSmGzv","t59lR5iGN5","0ao3luTacx","aez9yTXQ0Z","3weIF5Mg9r","IBe8kzHF1q","7ku1pWaWsv",
+"MojnPpv0i7","Gv3FqblLA9","zFgtBBFkb8","FFDuiBCxeC","uJScXsoy9t","brhlQo8Uyd","aDGtSs93Ml","ogLgcUl4a1","lViBvS2Dfu","bZLvSHfyNQ",
+"piJSkd7vjM","618DioQ87r","5Drn0lCMxy","jtn0XoVQp6","9eoRc24ARF","Yf2EcECMvU","nnP8oqaofN","RpBQm0h1b1","euZA5jeskS","4QMc9FGzgp",
+"KASQ8vOqCE","ZhwG1Mm8si","IRh48uTacx","07n1cJRJQB","8hJdtlpF6W","fqypyQ6Lix","zmLYD2ZHdk","GrDg7U3yw5","X6PinCIShG","K20wK5Drn0",
+"ReKEWMmsIo","FxX9q8xEKz","e6e4zAkKTk","qUJMd0BmCy","nnP8o2Nslm","RkQkeRACuj","VjCZqQYxC0","uQIczlH1kt","8RCUAk85Ae","rhl0Jni2v1",
+"8xEKzwiHrZ","hUTw7KASQ8","Z4I1v7fKYU","yvOMI5VZjS","v2eC3MaJQs","gf8rIKsjRK","M3zXLGv3Fq","gdQsSMkgy8","v8yFNMmsIo","L7cGcQ6Lix",
+"dhSuHBpYhV","OUqFM5drc6","xReecKr8ys","Dz1R3RmDcr","AkKTkNcICA","uN6r3dQ586","lViBv4dEz6","d85a9SmGzv","fFDrJSmGzv","SmGzvZuDtD",
+"Ul4a124ARF","I7p2apWiOs","sqVrfru4UG","6AFT0BpYhV","2ZHdkZUnqt","GrDg7In3NS","fqypyCIShG","CIShGrz7Ut","zbIYY9iGoT","IKxdLSs0Zu",
+"45cIHIn3NS","BbwgAZJTXH","xReec2TRI7","faHirChuy3","Nxx9Vi3pyd","JXljWW3VFH","tlILtlH1kt","yluBxYh1hF","gtCA5gf8rI","VjCZqIn3NS",
+"6AFT0FjHXR","uLtKsyofH3","NcICAlXFOB","7ku1pAkKTk","SWfouGWqqX","OUqFMOxWIH","gtCA5IKxdL","AmdQddpe1v","OUqFMLDk6f","M6qcGTCgPp",
+"yofH3iKqhr","VLTy67hyVv","vLsmSTXQ0Z","QWxoTSbRYy","oGu6xKASQ8","D6rBy1j5L8","WMiS37X3uy","FjHXRt98iW","b29RJpmeCd","8RCUA0Kyfs",
+"Zv7z05drc6","euZA5W3VFH","B3qemCxVEf","h1zcHMK07Y","Kr8ysxXTI4","oQ87rogLgc","Uvlv4dpe1v","RmDcrNcICA","9GXkX4W0Tl","qaofNpAhR1",
+"2hEEUru4UG","XflUqlkMUA","P6bcgyofH3","zQt6QQnJ1S","Ss0Zuy94nw","VBjhz5VZjS","CK5W714FLR","MaJQsqaofN","IjTwPQClRL","lkMUAC2Irc",
+"AgJHQdjsrv","7fKYUBGaQY","lCMxyVIlwP","VIlwPMojnP","nFqik8U2nU","NhXdul83Ud","d85a94QMc9","6AFT0JRJQB","x3LDeFxX9q","s93MlWaim6",
+"DLhzMC2Irc","OHaBzHRxd8","uupzkJJs5m","S2DfuqUJMd","M3zXLydG8U","5ZaEzpmeCd","7Ow5CPYBf4","9y4lwJKWYR","JXljWgf8rI","U3yw5LewvM",
+"aDGtSRxrsm","atef2bZLvS","Yf2Ec580YD","cShY2dmoS7","QnJ1SGWqqX","pv0i7JkzUn","YOfrYfqypy","48cHL8xEKz","uTacxgdQsS","iB08l2Nslm",
+"Kr8ysG1RhS","djsrvX6Pin","D6rByaL6AJ","14FLRJJs5m","i3pydlm0pD","NAFuwjfREu","v8yFNnnP8o","cQOnvMmsIo","CxVEfHP433","aez9yM6qcG",
+"QworuO3iyQ","7hyVvbZLvS","6q6L9BbwgA","sqVrfzQt6Q","WMiS37Ow5C","bZLvSEoToP","DcpWBd85a9","Mkgy89eoRc","CxVEfAIYUu","NOHszOUqFM",
+"aL6AJmz8gx","n1pmOZ4I1v","4dEz6MGlTF","GXdoHSmGzv","RBhp0VBjhz","sqVrf2hEEU","NhXdu0Kyfs","Kr8ys9XyT9","cmXIXcShY2","5Mg9rRkQke",
+"4QMc9lpF6W","FhtglWaWsv","lweGyMaJQs","n8pJ9ZJTXH","fLNg8580YD","mz8gxFwEJz","xXTI4Cfgr3","5ZaEzM3zXL","EdBKcv2eC3","NhXduvkCHH",
+"Cp3mZx3LDe","fcJOyFFDui","FxX9q5ZaEz","s4786nnP8o","gdQsSStlDJ","d85a9MmsIo","LewvMulk41","0PktI24ARF","Mm8siNAFuw","aez9yChuy3",
+"Chuy3v1Hln","C2IrcgdQsS","3weIFyEfy9","UmaEvCNHmv","t59lRSWfou","GSQwjatef2","NAFuwcmXIX","iqv4k9GXkX","fcwDan8pJ9","S77LHUvlv4",
+"OUqFMfcwDa","5NammjfREu","zbIYYW3VFH","2hEEUUmaEv","WmadAFnPFB","blLA9cL0aE","45cIHh1zcH","lXFOBhSSvQ","lCMxypFrrl","oGu6x8FmFH",
+"xciqp0YAGH","24ARF48cHL","ydG8UaDGtS","QChxsuLtKs","Vprf2pmeCd","3otm6OUqFM","SbRYyoGu6x","VIlwPNhXdu","Qworuni2v1","CqqaDi7WMQ",
+"BpYhVCK5W7","guMb8lsQGo","jiVBPM6qcG","uZPqgMmsIo","KASQ89y4lw","soy9t5Namm","HRxd8jS1aj","9GXkX7fsYM","JKWYRG1RhS","hE1QlBFkb8",
+"RkQkelm0pD","ciuWznnP8o","2NslmGSQwj","KASQ8IjTwP","29QAzix74r","2NslmCxVEf","fLNg8IBe8k","Dz1R3CdyBV","FhtgltjQxs","7X3uyy94nw",
+"QWxoTRmDcr","LbRTHgtCA5","aFFsslj07Q","i7WMQVIlwP","7fKYUWmadA","0MR5XaL6AJ","uN6r3D6rBy","W7cTstAOsr","bgJAzydG8U","zmLYDLewvM",
+"qUJMdIKxdL","2hEEUpiJSk","QnJ1SpmeCd","nFqikuZPqg","dmoS7Waim6","okgRiHzZT8","Cfgr3Qworu","1j5L8Oz8yZ","0YAGHOz8yZ","8U2nUO3iyQ",
+"7hyVvwDajX","iqv4khi5X7","WmadA5VZjS","IBe8kIjTwP","AgJHQsx5Gl","8xEKzYh1hF","XflUqhYBCK","Ta8f6FxX9q","zbIYYt98iW","7fKYUuJScX",
+"aez9ypT8wu","jS1aj5drc6","NAFuwyEfy9","Cfgr35Mg9r","5Drn0Fhtgl","HfyNQUvlv4","zFgtBv8yFN","tvdkDokgRi","5VZjSTXQ0Z","5Mg9rpvgjS",
+"VjCZqFFDui","IRh48VjCZq","StlDJ618Di","uLtKsQWxoT","h1zcHtaOXK","prNT60MR5X","s4786YjB9t","JJs5m1v5hH","Cp3mZqUJMd","WaWsvmz8gx",
+"s93MlIBe8k","B3qemVNCPd","dpe1vcL0aE","FGzgpU3yw5","OUYuFOxWIH","OUqFMZ4I1v","1v5hH6q6L9","RzaZATCgPp","xXTI4TXQ0Z","jfREuvLsmS",
+"lH1kt7ku1p","X6PinJ2mQi","GrDg7FjHXR","J2mQiQWxoT","tjQxs3otm6","zz4ZUd7vjM","BCxeCU3yw5","uN6r3wDajX","FGzgpRxrsm","Pb1paprNT6",
+"BbwgAydG8U","FGzgpCIShG","yEfy9kZANm","2hEEUG1RhS","5IhmGZ4I1v","kB5nPCfgr3","ZUnqtix74r","Y1mC0JXljW","dmoS7DcpWB","Gv3FqIBe8k",
+"NAFuwMkgy8","zqH0WFPfSE","QClRLQClRL","KASQ8POUYS","d7vjMpAhR1","cmXIXRBhp0","bZLvShUTw7","MmKGJHP433","uvf7AuZPqg","9eoRcRsQUq",
+"G1RhSyvOMI","YjB9tlCMxy","uQIczMojnP","lkMUAzQt6Q","uLtKseuZA5","ksJbyo8Uyd","Z4I1vuN6r3","v8yFNJKWYR","brhlQThjNn","vkCHHRsQUq",
+"ix74rjS1aj","azIWpVIlwP","KASQ8lXFOB","Z4I1viqv4k","SjskQpmeCd","NcICAlsQGo","DG4sTpFrrl","AkKTkM3zXL","b29RJCNHmv","580YDHP433",
+"fcwDaDcpWB","8RCUA1j5L8","RBhp0ReKEW","VjCZqQChxs","WPmlx24ARF","rz7UtB3qem","6q6L9Kr8ys","ciuWzHlUbF","IBe8kcShY2","LewvMl83Ud",
+"S2DfuGWqqX","8cVD3IRh48","EdBKcYf2Ec","AkKTkzY1GY","guMb8D6rBy","0KyfsfmIK1","SbRYyFwEJz","JXljWlViBv","lsQGoS77LH","euZA5a00b5",
+"yluBxiKqhr","ydG8UrKDLJ","oVQp6vLsmS","blLA9ix74r","HRxd8AXpwE","J2mQi0PktI","IKxdLFjHXR","rhl0JzY1GY","sqVrfokgRi","fqypykZANm",
+"t59lRS2Dfu","CK5W7RmDcr","lH1ktXflUq","In3NSAIYUu","8RCUAdhSuH","ru4UGpAhR1","gIYvEbgJAz","s4786M3zXL","2Yz7EksJby","8RCUAfFDrJ",
+"fcwDaHP433","yToGW0YAGH","2Nslm0h1b1","Kr8ys3otm6","zHF1q5drc6","ni2v1m4bxU","5VZjSgdQsS","IRh48n8pJ9","RpBQmP6bcg","zY1GYQssNC",
+"uoStwxXTI4","2ZHdkIn3NS","7hyVvpmeCd","0h1b1S77LH","8FmFHbgJAz","RzaZAX6Pin","FPfSE4W0Tl","rKDLJFPfSE","bZLvSoQ87r","JIqXih1zcH",
+"cmXIX7fsYM","hE1QlbgJAz","Mkgy88RCUA","zFgtB5Mg9r","M3zXL8hJdt","CNHmv618Di","JkzUnMaJQs","AgJHQQClRL","iqv4kJXljW","uJScXbgJAz",
+"2hEEUQnJ1S","cmXIXs93Ml","BGaQYaez9y","6q6L9d85a9","tuDySsoy9t","blLA9KASQ8","ni2v19XyT9","CIShGHlUbF","7ku1pSjskQ","v2eC33otm6",
+"3weIFM3zXL","hUTw7tuDyS","lXFOBSjskQ","piJSkuZPqg","ix74r55rfB","hYBCKpFrrl","Nxx9VMezSW","5iGN5W3VFH","24ARFOHaBz","oGu6xdQ586",
+"BGaQYRBhp0","lsQGoqQxHP","Nxx9VYf2Ec","zz4ZUzFgtB","n8pJ9nFqik","pAhR1JRJQB","QworuHfyNQ","i3pydmX2GE","LDk6fgf8rI","zQt6Q5Mg9r",
+"StlDJgjUTu","C2IrcAmdQd","G1RhS2hEEU","FjHXRPb1pa","Q6hMCIKxdL","fFDrJwDajX","1j5L8hYBCK","JRJQBazIWp","hi5X7rKDLJ","In3NSgtCA5",
+"ni2v1Dz1R3","IBe8kO3iyQ","4QMc91v5hH","jeskSWreyP","tlILt5Drn0","CqqaDJRJQB","hSSvQ4W0Tl","0YAGH7Ow5C","OxWIHS77LH","U3yw5ogLgc",
+"NAFuwVIlwP","taOXKjtn0X","W7cTsNOHsz","blLA92DREs","W3VFHyvOMI","dhSuHaDGtS","Ss0ZutuDyS","8cVD3fLNg8","MojnPDz1R3","CxVEfMkgy8",
+"jSjS38FmFH","Yh1hFCfgr3","7Ow5CK20wK","HzZT8GXdoH","B3qemAIYUu","uLtKshE1Ql","EoToPkB5nP","6AFT0jtn0X","8U2nUlm0pD","48cHLNAFuw",
+"7lUXZReKEW","zqH0WFhtgl","HP433uN6r3","prNT67Ow5C","hSSvQlj07Q","zmLYDD6rBy","DG4sTTCgPp","wiHrZQssNC","8hJdteuZA5","Chuy3uupzk",
+"lCMxyblLA9","14FLRCIShG","VLTy6AkKTk","P6bcga00b5","gtCA5GWqqX","M3zXLVLTy6","Cfgr3kB5nP","ulk41VNCPd","5IhmGCIShG","ReKEWhE1Ql",
+"xciqp7X3uy","zHF1qn1pmO","xXTI4VerEA","AkKTkThjNn","bZLvSX6Pin","XflUq9eoRc","lsQGodhSuH","XyPZN7ku1p","HRxd8xReec","FhtglJkzUn",
+"v8yFNs4786","IBe8kazIWp","bgJAzUmaEv","ogLgcBbwgA","AIYUuTXQ0Z","5Mg9rgIYvE","FxX9q2Yz7E","BpYhVeuZA5","DQimpuAWyp","n8pJ99rlg9",
+"0PktIVLTy6","pv0i7mz8gx","5iGN5fLNg8","8cVD3Nxx9V","Waim6SWfou","580YD5iGN5","s7MxkvOqCE","618DiAgJHQ","soy9tJKWYR","9iGoTm4bxU",
+"uTacxIRh48","OUYuFuZPqg","qUJMdaL6AJ","3weIFfcwDa","3otm6Cfgr3","Zv7z0IKxdL","uQIczJXljW","AmdQd0YAGH","VIlwPJKWYR","cQOnvhYBCK",
+"oVQp6hSSvQ","FnPFBLbRTH","6q6L9faHir","zFgtBgjUTu","h1zcHWreyP","7hyVvYf2Ec","uJScXWmadA","h1zcHni2v1","piJSktl72W","tjQxs7fsYM",
+"l83UddQ586","djsrvVIlwP","ReKEWpT8wu","07n1cQYxC0","M3zXLgdQsS","XyPZNsoy9t","d85a9zY1GY","lXFOBMGlTF","atef25drc6","AOgEeFnPFB",
+"pT8wuqQxHP","hSSvQgjUTu","14FLRdjsrv","uJScXzQt6Q","SjskQfmIK1","kB5nPB3qem","P6bcgbrhlQ","xXTI4uvf7A","i3pydd7vjM","Mm8sia00b5",
+"lViBvtjQxs","v8yFN5Namm","guMb8Uvlv4","1LB1L2Nslm","S2DfuOxWIH","fcJOyKASQ8","yvOMIqQxHP","CNHmvWmadA","8cVD3GSQwj","aL6AJQbxXc",
+"5iGN5qaofN","5nmWvMkgy8","WaWsvgtCA5","nnP8ouAWyp","EoToPMm8si","oVQp64QMc9","TXQ0ZyvOMI","AXpwEwiHrZ","8cVD3fFDrJ","uoStwCIShG",
+"NhXduxXTI4","OxWIH55rfB","7fKYUW7cTs","ydG8UHfyNQ","suY4xQssNC","XyPZN2Yz7E","FwEJzl83Ud","lm0pDv8yFN","0PktIRACuj","o8UydwDajX",
+"uTacx48cHL","okgRiMm8si","W7cTskZANm","zmLYDNAFuw","lsQGopvgjS","AgJHQAmdQd","lH1ktPYBf4","FLsphFhtgl","C2IrcprNT6","aL6AJAgJHQ",
+"0MR5X64s8N","CxVEfK4GS8","mz8gxaL6AJ","hSSvQVNCPd","AmdQd5Drn0","iqv4kNo0Qb","azIWplweGy","WreyPWaim6","i3pydReKEW","tl72Wrhl0J",
+"RmDcrogLgc","IRh4816lHc","nFqikFjHXR","lpF6Wpv0i7","ni2v1hE1Ql","uPX7GZzJHW","KsjRKtuDyS","4W0TlOz8yZ","W7cTsnlaBy","lH1ktjzUqR",
+"IjTwPVIlwP","Waim61v5hH","MGlTFi7WMQ","2TRI714FLR","NcICAMmKGJ","QWxoTS77LH","uTacxUvlv4","QnJ1Sl83Ud","IBe8k8TxD7","CIShGhYBCK",
+"pv0i7BGaQY","nFqik24ARF","EoToPl83Ud","48cHLjfREu","Yf2EcuoStw","ciuWzYOfrY","uTacxWreyP","djsrvMGlTF","5drc6Y1mC0","WPmlxGWqqX",
+"yluBxZUnqt","vLsmSfcwDa","zY1GYrKDLJ","1LB1LCNHmv","qaofNciuWz","tuDySYOfrY","atef23weIF","XyPZNFxX9q","0BmCyHzZT8","he9IAxciqp",
+"9iGoTuPX7G","v8yFNzmLYD","618DiJRJQB","ni2v1AXpwE","G1RhS1j5L8","HP433VNCPd","S77LHAmdQd","BFkb88cVD3","1LB1Lix74r","Qworu9y4lw",
+"W3VFHI7p2a","blLA9J2mQi","taOXK7lUXZ","v2eC3KZamH","n8pJ9xReec","CxVEf8cVD3","W3VFHDQimp","EdBKc9iGoT","F6PT2tuDyS","Q6Lixjtn0X",
+"Waim6GWqqX","0PktI45cIH","5IhmGl83Ud","fqypy4W0Tl","0Wr5y7ku1p","FGzgpGWqqX","pFrrlYw2oU","WmadARBhp0","PYBf4AgJHQ","5ZaEzyvOMI",
+"uQIczIBe8k","DQimpFxX9q","FwEJzru4UG","CqqaD7fKYU","lkMUAxciqp","VNCPdM3zXL","tlILtzY1GY","FLsphb29RJ","vOqCEQClRL","v2eC3e6e4z",
+"LbRTHjtn0X","48cHLMK07Y","ru4UGPOUYS","7hyVvtjQxs","5ZaEzjtn0X","t98iWJIqXi","Yw2oUF6PT2","POUYSOxWIH","9iGoTzz4ZU","okgRifaHir",
+"HlUbFSWfou","JRJQBYjB9t","kB5nPtuDyS","StlDJQworu","29QAzCdyBV","s4786M6qcG","zY1GYRkQke","FwEJzCK5W7","BpYhVMGlTF","zHF1qRBhp0",
+"BFkb8hi5X7","WDVWJzbIYY","Yw2oUuZPqg","QnJ1ScmXIX","zz4ZU45cIH","Z4I1vblLA9","JJs5mGv3Fq","WPmlxzY1GY","CqqaDRkQke","ZJTXHSWfou",
+"No0QbzmLYD","OxWIHDLhzM","OHaBziKqhr","SmGzvQClRL","G1RhS8xEKz","ogLgcP6bcg","tl72W4QMc9","lm0pD5Namm","618Dihe9IA","Yh1hFFjHXR",
+"AkKTkW3VFH","MezSWydG8U","VBjhzpvgjS","HRxd8LDk6f","jtn0XGSQwj","6q6L9gdQsS","Q6Lix5Drn0","ZJTXHaez9y","mX2GEdpe1v","hYBCKnnP8o",
+"ZzJHWfFDrJ","MGlTFTwano","L7cGcMkgy8","jzUqRcmXIX","gtCA5VIlwP","DQimpY1mC0","o8UydB3qem","cL0aEWaim6","8U2nU4dEz6","lweGyy94nw",
+"tjQxs7fKYU","ciuWzGrDg7","MaJQsix74r","2ZHdkcShY2","5IhmGqQxHP","yofH3gIYvE","5iGN5pT8wu","24ARFuTacx","ogLgcFxX9q","gdQsSPOUYS",
+"8RCUARsQUq","9GXkXn1pmO","G1RhSuAWyp","fcJOyoVQp6","cL0aEOUYuF","pT8wuiKqhr","ogLgctvdkD","7lUXZG1RhS","RmDcrMmKGJ","aez9ymz8gx",
+"4QMc9RkQke","5IhmGuN6r3","618Dih1zcH","TXQ0ZXflUq","Twanozz4ZU","o8UydfFDrJ","VNCPdAOgEe","bZLvSS2Dfu","0Wr5y9iGoT","dpe1vjeskS",
+"vOqCE8cVD3","CxVEfNOHsz","IBe8kgtCA5","euZA5W7cTs","fcwDazbIYY","QbxXche9IA","hSSvQUlU3M","8RCUAQ6hMC","ru4UGOHaBz","45cIH07n1c",
+"BbwgAP6bcg","KASQ8brhlQ","KASQ85nmWv","WPmlxpWiOs","1v5hHY1mC0","2Yz7EJXljW","ZzJHWqUJMd","MK07YZzJHW","StlDJBCxeC","hUTw7Cp3mZ",
+"KASQ8xXTI4","mX2GEDcpWB","1j5L8blLA9","EoToP580YD","nFqikZhwG1","0YAGH55rfB","ulk412ZHdk","iB08lcL0aE","4W0TlsuY4x","StlDJuAWyp",
+"CK5W7QYxC0","IRh48WPmlx","yToGW8RCUA","J2mQiZUnqt","RBhp0lH1kt","BbwgAhUTw7","1v5hHzFgtB","xXTI46AFT0","W3VFHiwzGk","hSSvQWPmlx",
+"14FLR45cIH","KASQ8580YD","GrDg7yToGW","580YD6AFT0","2DREsKr8ys","HP433qQxHP","QworuUmaEv","cL0aE7ku1p","DG4sTFcWrW","azIWp7fsYM",
+"JRJQBzqH0W","IjTwP8xEKz","lXFOBZuDtD","JJs5mn8pJ9","FVMxotAOsr","0PktIIjTwP","Mkgy8uPX7G","1j5L8QnJ1S","G1RhSn8pJ9","lkMUAnnP8o",
+"0BmCyUl4a1","1j5L8hi5X7","O3iyQpmeCd","Dz1R3OUqFM","FcWrWjiVBP","5ZaEzJkzUn","WaWsvIKxdL","618Dilj07Q","cL0aEFFDui","FwEJzlpF6W",
+"FLsph7X3uy","uQIczcL0aE","0Wr5y07n1c","5nmWvs7Mxk","WDVWJlXFOB","hi5X7SjskQ","FVMxoiwzGk","SWfouP6bcg","Yf2EcRsQUq","QWxoTStlDJ",
+"CNHmvpAhR1","ZJTXHazIWp","uPX7GHzZT8","9rlg9s93Ml","64s8NiwzGk","TwanoMm8si","dpe1v9XyT9","yEfy9m4bxU","NhXduFNYIM","9eoRcKASQ8",
+"JRJQBWaim6","NAFuwJIqXi","zz4ZUiB08l","Waim6MmsIo","s4786BGaQY","TCgPpAOgEe","NAFuwK4GS8","Cfgr3nFqik","fqypyksJby","FNYIMThjNn",
+"MK07YI7p2a","SjskQVNCPd","Ta8f6UlU3M","HlUbFs7Mxk","pv0i7lXFOB","i7WMQ8hJdt","vOqCEUlU3M","Yf2EcFxX9q","vOqCENOHsz","aDGtSpWiOs",
+"FVMxosqVrf","iB08lt98iW","FjHXRix74r","Vprf2lweGy","iKqhr16lHc","29QAzpFrrl","WreyP5IhmG","Mm8siokgRi","JRJQBFLsph","jzUqRfqypy",
+"cShY2Yh1hF","NOHszBpYhV","DQimpQ6Lix","iqv4k8xEKz","aFFssKZamH","TwanoL7cGc","piJSklweGy","bZLvSv8yFN","blLA9pmeCd","QbxXcxXTI4",
+"y94nwlm0pD","5IhmGB3qem","FFDuiO3iyQ","vOqCEQChxs","W3VFHeuZA5","RpBQmzHF1q","ECMvUe6e4z","e6e4zxReec","x3LDe4dEz6","2ZHdkRmDcr",
+"oGu6xBbwgA","Waim6UmaEv","dhSuHO3iyQ","i7WMQHlUbF","QYxC05drc6","NAFuwzFgtB","s7MxkDz1R3","dmoS745cIH","J2mQiBCxeC","OHaBzTXQ0Z",
+"GXdoHzHF1q","QnJ1SdhSuH","RmDcrNOHsz","k85AeK4GS8","v2eC3BFkb8","6q6L9yEfy9","MaJQss4786","8FmFHOHaBz","B3qemjeskS","JKWYRECMvU",
+"i7WMQmz8gx","BFkb88hJdt","BpYhVSjskQ","ix74r2ZHdk","prNT6BpYhV","RsQUqlweGy","guMb8AIYUu","WDVWJP6bcg","0Wr5yRmDcr","oGu6xQChxs",
+"YOfrYgjUTu","fLNg8bZLvS","djsrv64s8N","7X3uy7hyVv","QWxoT9rlg9","yofH3rhl0J","iB08lJIqXi","ni2v1brhlQ","HRxd85IhmG","WPmlx1v5hH",
+"8hJdtCK5W7","uZPqga00b5","lsQGocL0aE","lsQGotaOXK","yluBxiB08l","VNCPdtl72W","pvgjSuPX7G","TwanohYBCK","vkCHHv8yFN","uJScXtaOXK",
+"JJs5m2TRI7","zbIYYlweGy","9iGoTlm0pD","S2DfuzbIYY","580YD0YAGH","uQIcz7fsYM","FNYIMSbRYy","djsrv0PktI","jSjS3hYBCK","DLhzMYw2oU",
+"UmaEvjeskS","tvdkDgIYvE","pmeCdQbxXc","OUqFMRmDcr","SbRYyTXQ0Z","brhlQiqv4k","a00b5aL6AJ","lsQGoIBe8k","uN6r3bgJAz","iKqhrs7Mxk",
+"S77LHJXljW","NhXduRACuj","WmadAB3qem","45cIHs4786","HlUbFIRh48","yToGWDLhzM","tvdkDMGlTF","WmadACqqaD","OUYuFGSQwj","FcWrWy94nw",
+"5IhmGOxWIH","YOfrYUl4a1","rhl0JFwEJz","Chuy3FFDui","5Mg9rs4786","LDk6fy94nw","F6PT2ni2v1","5NammBGaQY","0Wr5yDQimp","48cHLVjCZq",
+"IRh48JJs5m","O3iyQcQOnv","CqqaDQ6Lix","aL6AJRmDcr","WreyPUl4a1","iqv4kVLTy6","Pb1paJ2mQi","OxWIHJRJQB","taOXKlm0pD","Cp3mZ4QMc9",
+"hUTw7gf8rI","W3VFHdhSuH","brhlQUlU3M","tjQxsOHaBz","qaofNZuDtD","YjB9toVQp6","K20wKtvdkD","zFgtBRzaZA","VerEAsuY4x","U3yw53otm6",
+"zbIYYlCMxy","XflUqHRxd8","EoToPCfgr3","DG4sTiKqhr","YjB9tNo0Qb","y94nwvkCHH","EdBKcEdBKc","uN6r3okgRi","Twano5IhmG","zmLYDjzUqR",
+"hi5X7t59lR","BpYhVO3iyQ","Pb1paIjTwP","GSQwjpv0i7","ksJbyh1zcH","YOfrYjzUqR","3weIFogLgc","24ARFlCMxy","NAFuwZuDtD","BbwgAgdQsS",
+"1v5hHGrDg7","oVQp6piJSk","uvf7A2ZHdk","fqypyHfyNQ","O3iyQCxVEf","hE1Qlm4bxU","qaofNbrhlQ","piJSkx3LDe","TXQ0ZU3yw5","pWiOsdQ586",
+"s4786ni2v1","uLtKsG1RhS","RkQke8xEKz","lXFOBDG4sT","MaJQsnnP8o","jtn0XQ6Lix","0MR5XRkQke","1j5L8prNT6","MezSWVLTy6","hUTw7QssNC",
+"taOXKIRh48","tl72WIn3NS","qaofN4W0Tl","nFqikKr8ys","wiHrZMmsIo","dQ586ru4UG","Zv7z0cmXIX","KZamH9y4lw","BGaQY8TxD7","WmadANo0Qb",
+"9eoRcazIWp","DLhzMJIqXi","G1RhSK4GS8","2hEEU2hEEU","Q6hMCaDGtS","AIYUuW7cTs","qUJMdCNHmv","d7vjM618Di","EdBKcYw2oU","zz4ZUXflUq",
+"6AFT0ReKEW","EOE1ocL0aE","Kr8ysMojnP","nFqikSbRYy","BpYhVgjUTu","QbxXc48cHL","8cVD37Ow5C","Pb1paHfyNQ","uQIczChuy3","CxVEf64s8N",
+"14FLRatef2","HlUbF0h1b1","tvdkD5VZjS","lCMxyLbRTH","Z4I1vaFFss","5Drn0I7p2a","VBjhzUlU3M","rKDLJQ6Lix","nnP8otaOXK","9GXkXDLhzM",
+"vOqCE7X3uy","FVMxoAgJHQ","ZzJHWokgRi","MmsIouvf7A","v1HlnJXljW","2DREsuupzk","618Di0BmCy","TCgPpmz8gx","pFrrl2ZHdk","euZA5NAFuw",
+"QworuTwano","xReecZJTXH","NOHszRBhp0","CxVEfcL0aE","6q6L9lViBv","1LB1L1LB1L","MojnPP6bcg","5Drn0hUTw7","GXdoHQnJ1S","X6PinpAhR1",
+"lpF6WiKqhr","16lHcX6Pin","KsjRKv2eC3","DQimp48cHL","7hyVvs4786","y94nwDz1R3","JRJQBG1RhS","jeskSNhXdu","pvgjSlpF6W","suY4xlsQGo",
+"t98iW14FLR","1j5L85drc6","FPfSE0YAGH","s4786CK5W7","fqypytvdkD","QssNC29QAz","9iGoTP6bcg","zz4ZUMK07Y","0h1b1EdBKc","ru4UGThjNn",
+"t59lRRACuj","RkQkeBCxeC","pmeCdoGu6x","W7cTsgIYvE","CNHmvFhtgl","yvOMIX6Pin","GSQwjn1pmO","RACujEOE1o","Yh1hF5Mg9r","5IhmGFxX9q",
+"hSSvQVprf2","16lHcVprf2","hE1Ql24ARF","oVQp6lsQGo","W3VFHYOfrY","HRxd8wiHrZ","5iGN5ix74r","WreyPXflUq","d7vjMcmXIX","ogLgcqaofN",
+"16lHcGv3Fq","I7p2aMaJQs","Oz8yZ8TxD7","K20wKSWfou","FcWrWMmsIo","OHaBzv1Hln","yvOMIVLTy6","5Mg9rRpBQm","GSQwjNcICA","D6rBynlaBy",
+"In3NS7X3uy","sqVrfNo0Qb","K20wKGrDg7","NcICARsQUq","5iGN5SbRYy","QssNCkB5nP","FNYIMYf2Ec","DQimpIRh48","JJs5mbZLvS","aez9yBpYhV",
+"bZLvSFxX9q","Ul4a1uAWyp","FVMxoxReec","bgJAzFNYIM","XflUqFcWrW","cL0aEAXpwE","yToGWcShY2","U3yw59eoRc","JkzUnYOfrY","pT8wu3otm6",
+"RACujEoToP","9iGoTfcwDa","JKWYRFjHXR","M6qcGCfgr3","MK07YYOfrY","lH1ktSjskQ","jzUqR55rfB","4W0TlLewvM","DG4sT9eoRc","Dz1R3Yh1hF",
+"xXTI4m4bxU","iqv4kSs0Zu","lweGypvgjS","VNCPdjSjS3","ydG8U9rlg9","x3LDeWDVWJ","zbIYYl83Ud","hUTw7yofH3","FcWrW5Drn0","iwzGkdQ586",
+"oGu6xuAWyp","OUqFMyofH3","FFDuitAOsr","D6rBy8hJdt","YjB9tzqH0W","vOqCEeuZA5","CK5W7FxX9q","ydG8UqQxHP","Zv7z0CIShG","atef20Kyfs",
+"uupzkblLA9","iwzGkuTacx","aFFss4QMc9","9iGoTciuWz","9rlg9JIqXi","FGzgpIjTwP","uoStwPYBf4","WMiS3zmLYD","rKDLJsx5Gl","5IhmGtjQxs",
+"0h1b1YjB9t","5IhmGGrDg7","0ao3ls4786","aDGtSzz4ZU","yluBxuLtKs","0YAGH8hJdt","vLsmSWPmlx","618Didpe1v","taOXKFhtgl","WaWsvgdQsS",
+"EdBKcY1mC0","Yf2EckZANm","uvf7A8RCUA","hYBCKO3iyQ","HRxd855rfB","WPmlxlm0pD","oVQp65VZjS","e6e4zWaWsv","aez9yEdBKc","K20wKuoStw",
+"9iGoTWaim6","Dz1R3zz4ZU","580YDdQ586","ThjNnPOUYS","0h1b1yluBx","NOHszFFDui","s93Ml24ARF","s4786TXQ0Z","WMiS324ARF","d85a9SbRYy",
+"5Namm9XyT9","cL0aEYf2Ec","7Ow5CiB08l","pT8wuuvf7A","BCxeCK20wK","1LB1LS77LH","FFDuijtn0X","fmIK1oGu6x","9XyT9S2Dfu","ECMvUzHF1q",
+"Chuy32DREs","vOqCEvOqCE","Nxx9VjeskS","dmoS7NhXdu","vOqCEiqv4k","7hyVve6e4z","lCMxy0PktI","zz4ZU5iGN5","AXpwEJKWYR","dQ5869iGoT",
+"FGzgplCMxy","fLNg8UlU3M","AIYUuQ6hMC","BGaQY9XyT9","X6PinJXljW","P6bcg5ZaEz","XflUqJKWYR","8U2nUNo0Qb","No0Qb7fsYM","CdyBV5Mg9r",
+"Waim6wDajX","MezSWvLsmS","07n1cdmoS7","lj07QMkgy8","7fKYUXyPZN","SWfouuJScX","xReecTa8f6","VBjhzOUYuF","GXdoHQWxoT","HzZT8CNHmv",
+"MezSWNOHsz","MaJQsCqqaD","k85Ae0h1b1","Q6LixpAhR1","zqH0WzY1GY","8U2nUqaofN","KsjRKcmXIX","16lHcTwano","ni2v1n1pmO","WPmlxHfyNQ",
+"aL6AJOUYuF","5iGN55VZjS","qQxHP55rfB","pFrrlQChxs","gjUTuk85Ae","9iGoTtlILt","hi5X7fmIK1","tlILtpAhR1","IRh48ECMvU","fcwDaiKqhr",
+"fcJOywiHrZ","qUJMdVNCPd","gf8rI0ao3l","QWxoTJXljW","7fKYUW3VFH","FwEJzQworu","Kr8ysdhSuH","9eoRcVjCZq","uJScXjtn0X","tl72WnFqik",
+"nnP8ociuWz","k85AezFgtB","0MR5XciuWz","HlUbFzY1GY","Oz8yZLewvM","KASQ8jiVBP","mz8gxLDk6f","M6qcGBCxeC","JKWYRRmDcr","djsrv2TRI7",
+"Nxx9VpvgjS","RzaZAh1zcH","lViBvzmLYD","1LB1LFFDui","iwzGkJXljW","i7WMQuoStw","0Wr5yd85a9","J2mQi5drc6","618DiX6Pin","o8UydRBhp0",
+"zmLYDkZANm","mz8gxfaHir","AgJHQOxWIH","5Mg9rFLsph","hYBCK0ao3l","DG4sTVprf2","MGlTFQssNC","iB08lCIShG","SWfouKASQ8","HfyNQuJScX",
+"0YAGHdhSuH","tAOsrWaim6","SWfouv2eC3","nFqikkZANm","CdyBVJXljW","VIlwPCqqaD","4dEz6GWqqX","aFFss4dEz6","lsQGokB5nP","LbRTHiKqhr",
+"yofH3VerEA","JkzUn45cIH","pv0i7rhl0J","7X3uyVNCPd","D6rByNxx9V","FNYIMMmsIo","jiVBPW3VFH","soy9tjSjS3","pmeCdxReec","jfREuiKqhr",
+"POUYSM6qcG","oQ87rYjB9t","cmXIXlsQGo","o8Uyd24ARF","8RCUA7fsYM","CNHmvgjUTu","vkCHHZJTXH","RsQUqwDajX","7Ow5CHP433","ydG8U5nmWv",
+"580YDfcJOy","FnPFBGXdoH","aez9y5iGN5","uN6r35Namm","VBjhzTwano","U3yw5UmaEv","SmGzvIKxdL","VjCZqSWfou","FFDuiEdBKc","brhlQRxrsm",
+"BCxeCMGlTF","BFkb8QWxoT","CxVEfi7WMQ","pWiOsokgRi","VLTy6dpe1v","IRh48lViBv","3otm60PktI","cmXIXv8yFN","Uvlv4ZUnqt","FxX9q48cHL",
+"cQOnv2DREs","RpBQmmz8gx","hYBCKsuY4x","VBjhzl83Ud","JJs5mSmGzv","4W0Tl0YAGH","qQxHP0PktI","nFqikzz4ZU","hi5X7Pb1pa","Kr8ysDcpWB",
+"BFkb84dEz6","lCMxyhYBCK","3weIFCIShG","Yh1hFhYBCK","x3LDeRACuj","yluBx5IhmG","b29RJzqH0W","bgJAzpFrrl","2hEEU6q6L9","StlDJVLTy6",
+"Cp3mZix74r","2TRI73otm6","ZJTXHtaOXK","Y1mC08hJdt","Pb1pajtn0X","JJs5m9rlg9","nlaByReKEW","4W0TlX6Pin","5Mg9ratef2","FGzgpgtCA5",
+"zY1GYDLhzM","e6e4ztaOXK","9y4lw7hyVv","jeskSJJs5m","n1pmOix74r","pT8wuMmsIo","0MR5XuTacx","WMiS3MmsIo","tlILt7hyVv","24ARFvOqCE",
+"7ku1pFhtgl","Chuy3nFqik","RsQUqWaim6","he9IAhUTw7","2TRI7uoStw","JRJQBjzUqR","7hyVvFLsph","NOHsztl72W","piJSk0h1b1","tl72W2DREs",
+"K20wKyEfy9","fqypyBCxeC","TCgPp5Namm","euZA5GWqqX","LbRTHtAOsr","G1RhSzHF1q","tAOsrlm0pD","Dz1R3W3VFH","VBjhzhSSvQ","Mm8si580YD",
+"VIlwPGrDg7","guMb8v8yFN","RpBQmWmadA","29QAz0BmCy","FjHXRlj07Q","2DREs14FLR","DQimp8hJdt","Dz1R3U3yw5","Pb1paRzaZA","VNCPdazIWp",
+"Q6LixAXpwE","ReKEWuZPqg","s93Ml8cVD3","y94nwReKEW","Yw2oUFxX9q","QYxC0i7WMQ","S77LHhSSvQ","Qworu2Nslm","QYxC0FxX9q","QChxsrKDLJ",
+"i7WMQPOUYS","TwanoFwEJz","OUYuFHfyNQ","0h1b1VjCZq","rz7Utgf8rI","OHaBznFqik","Ul4a1qaofN","k85AelXFOB","suY4x0h1b1","Waim6cmXIX",
+"Kr8yspFrrl","d7vjMciuWz","7fsYMRACuj","yluBxFcWrW","Yw2oUFcWrW","hSSvQG1RhS","CNHmvGrDg7","i7WMQksJby","16lHcfaHir","J2mQiHP433",
+"NcICA29QAz","v8yFNcQOnv","t59lRO3iyQ","i3pydAmdQd","oQ87ruvf7A","QClRLsx5Gl","LewvMOHaBz","gtCA5he9IA","2DREshYBCK","7X3uycQOnv",
+"jeskShSSvQ","OHaBzhSSvQ","Kr8yslsQGo","EOE1ogtCA5","tvdkDkB5nP","aFFssCK5W7","tjQxsQ6Lix","GWqqXpvgjS","lViBvOUqFM","4W0TlO3iyQ",
+"zmLYD0h1b1","zmLYDuAWyp","rKDLJLbRTH","8cVD37X3uy","7hyVvL7cGc","I7p2aiKqhr","QbxXc8U2nU","zHF1q0MR5X","bgJAzNxx9V","RpBQmCfgr3",
+"RACujM3zXL","NcICAIKxdL","pFrrldpe1v","hSSvQk85Ae","LbRTHrz7Ut","s93Ml9rlg9","24ARF6q6L9","d85a9QssNC","o8UydF6PT2","In3NSaez9y",
+"HRxd807n1c","n1pmOCp3mZ","0ao3lQworu","gdQsSiKqhr","Fhtgl7fKYU","ksJbyfLNg8","CNHmv7hyVv","0YAGHJKWYR","ydG8UUlU3M","rKDLJZhwG1",
+"NOHszCIShG","tl72WiB08l","piJSkciuWz","RACujksJby","NhXduWaWsv","y94nwVBjhz","tjQxsiqv4k","kZANmnnP8o","jS1ajWPmlx","lCMxyECMvU",
+"uPX7GpvgjS","lm0pDnFqik","xXTI4qaofN","faHirwiHrZ","Qworudjsrv","29QAzOxWIH","i7WMQyEfy9","soy9t580YD","NOHszWreyP","JJs5mtvdkD",
+"d85a9aDGtS","iwzGk1v5hH","AkKTkvkCHH","M6qcG8cVD3","ECMvUfcwDa","RkQkecL0aE","JKWYRS2Dfu","lpF6WGv3Fq","uTacxuJScX","sqVrfmz8gx",
+"7fsYMSjskQ","WMiS3BFkb8","pT8wuuQIcz","hSSvQoGu6x","JIqXibgJAz","0MR5XMaJQs","WreyPMezSW","zqH0W8xEKz","i7WMQ7Ow5C","hE1Ql7fsYM",
+"yofH3cL0aE","yEfy9lH1kt","9XyT99rlg9","ulk41iqv4k","GWqqX24ARF","uJScXfLNg8","FhtglqUJMd","iqv4ktAOsr","l83UdnnP8o","S77LHU3yw5",
+"uN6r3vLsmS","K20wKFxX9q","6q6L92hEEU","e6e4zLbRTH","QWxoTpv0i7","FLsphgdQsS","Nxx9V6q6L9","brhlQ8hJdt","kB5nPb29RJ","zY1GYsx5Gl",
+"vkCHHuLtKs","VLTy624ARF","D6rByxReec","fqypyYjB9t","3otm6fFDrJ","Yh1hFgtCA5","a00b5ThjNn","lm0pDuupzk","IRh482ZHdk","AmdQdVerEA",
+"JkzUnAkKTk","Mm8siAIYUu","8FmFHmz8gx","Cp3mZTXQ0Z","iwzGkYh1hF","yofH34dEz6","YOfrYJRJQB","s7MxkGWqqX","D6rByvOqCE","dQ586ulk41",
+"lH1kt64s8N","YOfrY48cHL","OUYuFdpe1v","ECMvUlCMxy","jiVBPY1mC0","FPfSES77LH","tl72WJRJQB","LewvMzY1GY","QWxoTuPX7G","AgJHQzbIYY",
+"yluBxqUJMd","a00b57ku1p","Z4I1v29QAz","XyPZNiB08l","lkMUA9rlg9","sx5GljfREu","lH1ktCp3mZ","AkKTkZJTXH","FjHXRjfREu","Chuy3wDajX",
+"FVMxo3weIF","G1RhSMmsIo","hSSvQSbRYy","9eoRcTXQ0Z","DcpWBCxVEf","hUTw7Gv3Fq","uoStwzbIYY","lViBvNxx9V","HlUbFVjCZq","K4GS8Mkgy8",
+"yvOMIsx5Gl","GSQwjQworu","fcJOyzmLYD","45cIHni2v1","24ARFdmoS7","Nxx9VciuWz","yvOMILewvM","gf8rINo0Qb","KASQ8JKWYR","CdyBVuoStw",
+"Y1mC0nFqik","zbIYYtjQxs","dQ586OxWIH","XflUqQ6Lix","6q6L9CIShG","sx5GltlILt","Yh1hFlpF6W","pWiOshYBCK","k85Ae7lUXZ","DcpWBM6qcG",
+"BpYhVUmaEv","zHF1qF6PT2","FjHXRciuWz","YOfrYFcWrW","8cVD324ARF","NOHszqaofN","v1HlnSs0Zu","zmLYDlH1kt","IjTwP24ARF","s7Mxkhi5X7",
+"JKWYR9GXkX","ReKEWjzUqR","guMb8uZPqg","Z4I1vCqqaD","Kr8ysXyPZN","Cfgr3FnPFB","lm0pDhi5X7","ni2v1hi5X7","jiVBPJXljW","h1zcHDz1R3",
+"Y1mC0G1RhS","NcICAJ2mQi","sqVrf0YAGH","iqv4kYw2oU","prNT6VjCZq","RmDcrcQOnv","qaofNjS1aj","Gv3FqfLNg8","VNCPdRpBQm","5NammjS1aj",
+"cL0aEFnPFB","HlUbFi3pyd","29QAzcmXIX","5ZaEzxciqp","hYBCK9rlg9","LDk6fI7p2a","No0QbuTacx","FcWrWlXFOB","Y1mC0h1zcH","kZANmAXpwE",
+"POUYSdpe1v","ZUnqtStlDJ","L7cGc7hyVv","kZANmblLA9","ZzJHWjfREu","Chuy3uAWyp","F6PT2DcpWB","64s8NZuDtD","zqH0WFwEJz","cQOnvDz1R3",
+"2ZHdkhYBCK","VIlwPZUnqt","7Ow5CRmDcr","8cVD3FPfSE","uZPqgWreyP","AgJHQ8hJdt","VjCZqXyPZN","FhtglkB5nP","TXQ0Z0ao3l","l83Ud8xEKz",
+"BbwgAlCMxy","lm0pDNo0Qb","AmdQdazIWp","fFDrJJIqXi","GSQwj0MR5X","zz4ZUOz8yZ","VLTy6Kr8ys","2TRI7uN6r3","X6Pin0PktI","zqH0WRBhp0",
+"7lUXZulk41","WaWsv64s8N","QYxC0mX2GE","OUYuFQssNC","8RCUAMezSW","CqqaDiwzGk","v1HlnVLTy6","wDajXJRJQB","aFFssru4UG","dhSuHbgJAz",
+"Nxx9VL7cGc","SbRYy2Nslm","BpYhVqaofN","rhl0J7hyVv","FNYIMpWiOs","cL0aERsQUq","J2mQiyEfy9","jzUqRcL0aE","i7WMQzbIYY","OUYuFzz4ZU",
+"JRJQBlViBv","dQ586fqypy","IKxdL0h1b1","ThjNnxReec","8U2nUt98iW","mz8gxKZamH","M3zXLrhl0J","qaofNwiHrZ","TCgPp9eoRc","HzZT8gf8rI",
+"Q6hMCgdQsS","5nmWvzFgtB","45cIHguMb8","9eoRclj07Q","CdyBVYh1hF","StlDJcQOnv","CK5W7LewvM","5Drn0pvgjS","hUTw7ECMvU","tvdkDCfgr3",
+"QYxC0PYBf4","lCMxySmGzv","hE1QlCqqaD","JJs5mVerEA","XyPZNQChxs","yluBxTwano","jfREuxReec","hSSvQWmadA","Twano0BmCy","Mkgy8Ss0Zu",
+"EOE1oFPfSE","aDGtSSs0Zu","FnPFBoVQp6","okgRiuvf7A","BpYhVhE1Ql","7X3uypiJSk","AmdQd7Ow5C","QWxoT0BmCy","RzaZAfaHir","l83UdGWqqX",
+"1j5L8OUYuF","CK5W7QssNC","5VZjS5Drn0","M3zXLL7cGc","WreyPpT8wu","NhXdulkMUA","FVMxobrhlQ","S2DfuhYBCK","OUqFM1LB1L","VBjhz0ao3l",
+"FhtglsqVrf","7fsYMpv0i7","pAhR1AIYUu","45cIHSjskQ","0PktISs0Zu","I7p2acmXIX","JRJQBdpe1v","DcpWBSs0Zu","VerEAydG8U","hYBCKgIYvE",
+"MezSW8FmFH","lCMxyHRxd8","PYBf4U3yw5","48cHLGrDg7","kB5nP8hJdt","bZLvSn1pmO","IBe8kChuy3","pAhR1jeskS","7ku1pCNHmv","J2mQiguMb8",
+"vLsmS3otm6","64s8NnnP8o","Mm8siDG4sT","m4bxUfLNg8","ThjNnVerEA","wiHrZjeskS","JIqXi0Kyfs","v1Hlnrz7Ut","1LB1LM6qcG","2TRI7v1Hln",
+"0h1b1gjUTu","iKqhrjSjS3","7ku1p7ku1p","uPX7GFVMxo","Kr8ysFcWrW","5VZjSRkQke","Q6hMCJJs5m","h1zcHjSjS3","Rxrsm5drc6","fmIK1ciuWz",
+"P6bcgtvdkD","kZANmnlaBy","ZJTXH64s8N","4QMc9No0Qb","Yf2EcJJs5m","POUYSi7WMQ","QClRLokgRi","oQ87rIn3NS","ksJbykB5nP","pmeCdyluBx",
+"NhXduQbxXc","HfyNQaL6AJ","tAOsrix74r","Yf2EctAOsr","o8UydiB08l","TXQ0Z8RCUA","iwzGkzFgtB","WmadAlkMUA","8RCUAhE1Ql","iqv4kogLgc",
+"EOE1otuDyS","XyPZNuPX7G","oQ87rCp3mZ","lH1ktQssNC","tuDySMaJQs","7X3uyjfREu","NOHsz7ku1p","FnPFBpvgjS","7lUXZv2eC3","1LB1LhYBCK",
+"vOqCEVIlwP","P6bcgzFgtB","0Wr5ynFqik","Zv7z0ru4UG","zY1GYVLTy6","ydG8UIn3NS","bgJAzhE1Ql","atef2tjQxs","cmXIXaez9y","Y1mC0QssNC",
+"brhlQs93Ml","GSQwjfcwDa","FhtgljiVBP","7X3uyCfgr3","DcpWBgtCA5","tAOsrZUnqt","Cp3mZOxWIH","Uvlv4KZamH","M3zXLWreyP","Y1mC0MojnP",
+"YOfrY0PktI","IRh488TxD7","4W0Tlfqypy","pAhR1o8Uyd","F6PT2vkCHH","WMiS3StlDJ","cL0aEMojnP","gtCA5FFDui","DG4sTIjTwP","G1RhShUTw7",
+"NAFuwaL6AJ","jtn0XwiHrZ","lViBv8U2nU","sx5Gl3otm6","QnJ1S7lUXZ","2Yz7Es4786","KsjRKuJScX","AgJHQVBjhz","JKWYRguMb8","ogLgci3pyd",
+"yofH3IKxdL","iB08l5Mg9r","BCxeC7Ow5C","aez9y0Kyfs","In3NSgf8rI","ZUnqt9eoRc","ReKEWyEfy9","ThjNnYw2oU","JXljWuTacx","dQ586tuDyS",
+"FGzgpogLgc","5nmWvLewvM","faHirpAhR1","nFqikulk41","FGzgpSjskQ","HlUbF9GXkX","Ss0ZuZJTXH","AmdQdlViBv","8RCUArhl0J","aL6AJhUTw7",
+"KASQ8B3qem","618DiJXljW","MK07Yuvf7A","MGlTFjS1aj","BbwgA07n1c","ZUnqt14FLR","yEfy90Wr5y","QnJ1SuZPqg","tvdkDMmsIo","NOHszaez9y",
+"M3zXLTa8f6","xciqpyEfy9","s93MltaOXK","MGlTFFjHXR","CIShGHP433","suY4xLewvM","iqv4kWDVWJ","m4bxU0YAGH","hYBCKyofH3","BpYhVuJScX",
+"OUqFMWDVWJ","GrDg7pv0i7","0Wr5yBbwgA","RpBQmOUYuF","I7p2aReKEW","he9IAEOE1o","XflUqrz7Ut","3otm6a00b5","8hJdtOHaBz","NcICAF6PT2",
+"Ss0ZuF6PT2","RpBQmThjNn","Ta8f60YAGH","0YAGHtAOsr","oVQp6VNCPd","FnPFBJXljW","WDVWJrKDLJ","BGaQYe6e4z","uPX7GUlU3M","taOXKWaWsv",
+"EOE1oAgJHQ","lj07QJkzUn","RACujhi5X7","aFFsshE1Ql","Dz1R3FNYIM","mz8gxQ6hMC","fFDrJlsQGo","o8UydCIShG","Vprf2iqv4k","QWxoTrz7Ut",
+"FwEJzWaim6","uN6r3IBe8k","fqypySbRYy","5iGN52DREs","ZuDtDX6Pin","Q6hMC0Kyfs","blLA9o8Uyd","t98iWfaHir","MmsIouZPqg","nlaBygIYvE",
+"uTacxMmKGJ","5IhmGTXQ0Z","iqv4kVBjhz","8RCUAKsjRK","IRh48SWfou","uTacxpT8wu","aez9ye6e4z","ulk41d85a9","uLtKs5Namm","64s8NpmeCd",
+"TwanoAXpwE","YOfrYuQIcz","pAhR1jS1aj","Waim6ThjNn","kB5nPGWqqX","gf8rI5Namm","ogLgcThjNn","ReKEW2DREs","GrDg73otm6","FjHXR7ku1p",
+"faHirNAFuw","I7p2alCMxy","9eoRcZJTXH","i3pydxXTI4","jtn0XhUTw7","1v5hHxciqp","BFkb8yEfy9","MmsIopvgjS","9XyT9jzUqR","I7p2aEOE1o",
+"1v5hH5VZjS","4dEz6BbwgA","lCMxyxXTI4","Gv3FqaDGtS","qaofNqUJMd","v1HlnTwano","BbwgAfLNg8","kB5nP9y4lw","yToGWt98iW","yToGWOHaBz",
+"dhSuHRxrsm","MK07Ysx5Gl","CIShGStlDJ","55rfBm4bxU","ksJbyCIShG","CqqaD3otm6","oQ87rQbxXc","v2eC3RkQke","PYBf4CNHmv","QbxXcprNT6",
+"uPX7GNOHsz","ZzJHW7ku1p","yToGWTCgPp","BGaQYOHaBz","QnJ1SHRxd8","VBjhz8FmFH","LewvMNAFuw","ZUnqt9y4lw","ulk41MojnP","HlUbFEoToP",
+"djsrvaFFss","SjskQFnPFB","mz8gxOz8yZ","2TRI7aL6AJ","KZamHQbxXc","7hyVvtvdkD","a00b5B3qem","MGlTFiKqhr","I7p2a580YD","YjB9t2hEEU",
+"yvOMIO3iyQ","yToGW618Di","5VZjSnFqik","hSSvQe6e4z","dhSuHv8yFN","HzZT8CK5W7","s7MxkcL0aE","DLhzMCdyBV","HlUbFzmLYD","TCgPpIjTwP",
+"7Ow5CVprf2","K20wKJKWYR","VIlwPDLhzM","aez9y64s8N","vLsmSGWqqX","QYxC0Cp3mZ","8hJdtgtCA5","h1zcHAmdQd","uoStwlweGy","8cVD3IBe8k",
+"48cHLWaim6","2Yz7EtlILt","CdyBVNAFuw","EoToPgjUTu","jtn0XlkMUA","nnP8oPYBf4","uLtKsbrhlQ","fFDrJfcwDa","YOfrYbgJAz","NhXduECMvU",
+"ZzJHWMmKGJ","55rfBIBe8k","yEfy9FcWrW","okgRidpe1v","okgRiQbxXc","nFqikCxVEf","LDk6f9eoRc","h1zcHPb1pa","fcwDajeskS","2ZHdk5Mg9r",
+"GSQwjciuWz","LDk6ft98iW","d85a9tlILt","0BmCyBFkb8","DG4sTMK07Y","dQ5865Drn0","WPmlxni2v1","uTacxLbRTH","e6e4zgf8rI","oQ87rVBjhz",
+"J2mQiAXpwE","fFDrJMK07Y","aFFssbrhlQ","8cVD3yToGW","k85AeTCgPp","uLtKsYjB9t","SjskQIBe8k","RsQUqTXQ0Z","xXTI4lViBv","GSQwj2Nslm",
+"MaJQsAkKTk","StlDJ9XyT9","Yw2oUQChxs","ReKEWReKEW","v2eC35IhmG","2Nslmi3pyd","nnP8oguMb8","oQ87rlCMxy","G1RhSJ2mQi","pv0i78RCUA",
+"zz4ZUqUJMd","i3pydpiJSk","cShY2YOfrY","ZJTXHWDVWJ","rKDLJJIqXi","DcpWBtlILt","aL6AJOHaBz","uAWypiKqhr","0ao3ly94nw","FVMxoJIqXi",
+"2hEEUMojnP","vLsmSbrhlQ","1v5hHFcWrW","guMb8pAhR1","oGu6xIKxdL","618Din8pJ9","lCMxya00b5","Waim6s7Mxk","QbxXcO3iyQ","RACujqaofN",
+"fqypyFnPFB","yluBxEOE1o","FFDuiVBjhz","i7WMQJkzUn","0YAGH16lHc","RmDcr8FmFH","bZLvSuLtKs","gIYvEaDGtS","K20wKLbRTH","1j5L80YAGH",
+"kZANmhYBCK","CK5W7guMb8","DG4sTMaJQs","Ul4a1MK07Y","2Yz7ElweGy","iqv4kIRh48","JkzUnpFrrl","0Wr5yQbxXc","cQOnvIjTwP","2hEEUKASQ8",
+"ni2v1zbIYY","4W0TlM3zXL","GrDg7QssNC","FVMxolpF6W","O3iyQzqH0W","fcwDaLewvM","8RCUAMmsIo","No0QbnFqik","RBhp0G1RhS","NAFuwSs0Zu",
+"ydG8UqaofN","14FLR0PktI","n1pmO7fsYM","JkzUnJXljW","5nmWvGWqqX","uJScX9GXkX","cL0aEsuY4x","v2eC3FGzgp","iqv4kK4GS8","lm0pDwiHrZ",
+"ydG8U0Kyfs","7hyVvC2Irc","X6PinFFDui","B3qemOUYuF","FjHXRZhwG1","uTacxLewvM","X6PinYjB9t","8RCUAWaim6","TXQ0ZRxrsm","n1pmO1j5L8",
+"7ku1pQ6hMC","7hyVvo8Uyd","qUJMdFLsph","xReecxciqp","MaJQsrz7Ut","HP433lm0pD","C2Ircmz8gx","yofH39rlg9","X6Pin8cVD3","KZamHLDk6f",
+"5VZjS8RCUA","n8pJ9aFFss","jS1ajW3VFH","FxX9qfLNg8","FVMxoqQxHP","UmaEvgtCA5","dhSuH9iGoT","FcWrWGSQwj","RACujfcJOy","nnP8oCIShG",
+"Nxx9VCfgr3","8RCUApWiOs","t98iW24ARF","2hEEUaL6AJ","F6PT2SWfou","pT8wuHRxd8","OUqFMdmoS7","Pb1paWDVWJ","POUYSBbwgA","gIYvE4dEz6",
+"nnP8oazIWp","QWxoTix74r","d7vjMkB5nP","ReKEW0MR5X","FGzgpguMb8","8xEKzIjTwP","bZLvSJKWYR","sx5GlWreyP","tvdkDHRxd8","RBhp0tAOsr",
+"fcwDaSWfou","4dEz6BpYhV","FNYIMHP433","FnPFBSWfou","fcwDaoGu6x","FnPFBYh1hF","M6qcGjfREu","0MR5X5drc6","s7MxkTwano","GXdoHeuZA5",
+"0PktIhe9IA","WreyPpWiOs","IKxdLO3iyQ","yvOMIWDVWJ","lpF6WUlU3M","5ZaEzzqH0W","i3pydLewvM","4QMc9vkCHH","x3LDeVjCZq","lkMUAWaWsv",
+"ZzJHWUvlv4","wiHrZEOE1o","VerEAyToGW","zbIYYJRJQB","LDk6fZzJHW","piJSkVprf2","mz8gxfcwDa","i7WMQvLsmS","9GXkXP6bcg","VLTy6Twano",
+"DLhzMZJTXH","xciqpy94nw","lViBvrKDLJ","tjQxsdjsrv","oGu6xQbxXc","n1pmOi7WMQ","atef22DREs","55rfBzHF1q","JJs5mK20wK","2ZHdkHfyNQ",
+"RBhp0DQimp","d85a9StlDJ","qaofNNxx9V","dpe1vnnP8o","QssNCzY1GY","TwanobgJAz","HP433SmGzv","G1RhSgdQsS","tjQxsPb1pa","pT8wue6e4z",
+"5Mg9r7Ow5C","IjTwPMm8si","NOHsz8hJdt","d85a9zmLYD","m4bxUX6Pin","2Yz7EtuDyS","24ARFogLgc","zbIYYhi5X7","0MR5X9eoRc","QssNCiKqhr",
+"atef2rKDLJ","RACujix74r","azIWpuAWyp","UmaEvLDk6f","lH1kteuZA5","hSSvQLDk6f","Cfgr38FmFH","lweGyBpYhV","zz4ZUGv3Fq","X6PinnlaBy",
+"lCMxyWaWsv","POUYSStlDJ","No0Qb55rfB","pv0i79eoRc","9eoRcVBjhz","VerEArhl0J","rhl0J2ZHdk","nFqikIjTwP","07n1clpF6W","YjB9tDcpWB",
+"a00b5W7cTs","CxVEfOHaBz","NOHszNxx9V","9rlg95VZjS","faHirblLA9","ReKEW0BmCy","DG4sTW3VFH","FVMxo0Wr5y","WPmlxix74r","lpF6WVjCZq",
+"zqH0WvkCHH","JXljWTCgPp","nlaBy8xEKz","x3LDeJKWYR","29QAzCNHmv","5drc6FNYIM","aez9yuoStw","S2DfuSWfou","29QAzjtn0X","fqypypiJSk",
+"0Wr5yzz4ZU","yofH3KASQ8","MmsIoYh1hF","Ss0ZuzqH0W","t59lROxWIH","Mm8si8U2nU","JXljWKZamH","ulk416AFT0","a00b5YOfrY","IKxdLv1Hln",
+"2hEEUjtn0X","MaJQsy94nw","uZPqgfLNg8","0KyfsvOqCE","LewvMFVMxo","G1RhSQClRL","8hJdtVNCPd","m4bxUDLhzM","fmIK155rfB","YjB9t1j5L8",
+"v8yFNDcpWB","Yw2oURsQUq","AkKTkMK07Y","Vprf2atef2","zFgtB55rfB","7fKYU8xEKz","jzUqRl83Ud","jzUqROHaBz","ReKEWvLsmS","oQ87r5nmWv",
+"ZUnqt580YD","SjskQQ6Lix","J2mQiU3yw5","YjB9tgtCA5","tvdkDtjQxs","NAFuwpmeCd","djsrvcmXIX","ZuDtD7lUXZ","ThjNn0h1b1","ZUnqtuZPqg",
+"lweGyFPfSE","FjHXRdjsrv","VLTy65Drn0","fqypyRmDcr","he9IAAmdQd","ru4UGd85a9","G1RhSGv3Fq","uupzktaOXK","ciuWzv1Hln","yEfy95Namm",
+"ogLgcVprf2","XflUqVLTy6","fLNg80Kyfs","OUYuF5iGN5","tAOsrtlILt","8U2nUFwEJz","fFDrJPb1pa","P6bcgjS1aj","m4bxUni2v1","a00b5HfyNQ",
+"UlU3Mv8yFN","pWiOsvOqCE","yvOMIQ6Lix","fmIK1a00b5","EdBKcfaHir","bZLvStlILt","sqVrfAgJHQ","F6PT2nFqik","Oz8yZ3otm6","pAhR1i7WMQ",
+"ix74rdhSuH","mz8gxqUJMd","cL0aEix74r","MaJQsciuWz","Pb1pazqH0W","lH1kt8cVD3","RpBQmYjB9t","DQimpQYxC0","dpe1vzFgtB","nlaByQnJ1S",
+"7X3uy64s8N","zbIYYxciqp","ReKEWKr8ys","uPX7GtjQxs","Nxx9VsqVrf","gdQsSLDk6f","48cHLFjHXR","0PktIQClRL","DcpWB7hyVv","lXFOBCIShG",
+"dpe1vJJs5m","fcJOycL0aE","VLTy6QssNC","djsrv7hyVv","1v5hHpv0i7","Nxx9V7hyVv","d85a9lj07Q","IRh48580YD","BCxeCRmDcr","FLsph2DREs",
+"W3VFHwiHrZ","LewvMsuY4x","jfREuyToGW","NhXdu5IhmG","W7cTsRzaZA","xXTI47lUXZ","ZhwG1Q6Lix","Yw2oUfLNg8","ThjNn2ZHdk","QworufFDrJ",
+"xciqpsuY4x","fcwDadmoS7","ZhwG1VjCZq","1LB1Lmz8gx","hYBCK7ku1p","AkKTk0BmCy","1v5hHRxrsm","suY4xuAWyp","5IhmGRsQUq","EoToPZhwG1",
+"ZJTXHaFFss","16lHchUTw7","7fKYUGrDg7","JXljWlsQGo","WreyPtl72W","Q6LixsuY4x","5VZjScL0aE","MGlTFSmGzv","BbwgAQYxC0","CNHmvulk41",
+"dpe1vThjNn","W3VFHfmIK1","55rfBqUJMd","8hJdttuDyS","MGlTFiB08l","7lUXZEdBKc","RpBQmZJTXH","W3VFHfFDrJ","jiVBPfLNg8","8TxD7n1pmO",
+"7fKYUb29RJ","7fsYMZhwG1","W7cTsgdQsS","16lHcn1pmO","o8UydJRJQB","ReKEWRBhp0","C2IrckB5nP","i3pyda00b5","CIShGqQxHP","Fhtgln8pJ9",
+"vkCHHdjsrv","tlILtzHF1q","lH1ktKZamH","JRJQBb29RJ","FLsph7fsYM","VjCZqU3yw5","lpF6W8cVD3","RzaZAQworu","QYxC08U2nU","7fsYMO3iyQ",
+"vOqCENAFuw","SjskQgf8rI","IKxdLSmGzv","FFDuifqypy","qaofNjiVBP","9XyT95nmWv","RACujXyPZN","5iGN5NhXdu","HP433hSSvQ","lH1ktrKDLJ",
+"iKqhrB3qem","blLA9zz4ZU","blLA9oGu6x","ksJbyuLtKs","7ku1pjSjS3","jfREuHP433","VjCZqS2Dfu","7fKYU3weIF","WDVWJjzUqR","fqypy7fKYU",
+"2NslmSs0Zu","ni2v1lViBv","WDVWJX6Pin","aL6AJDQimp","nlaBy0MR5X","StlDJ7Ow5C","iwzGkFxX9q","RkQkelkMUA","FwEJzUlU3M","OUYuFFFDui",
+"s4786O3iyQ","FxX9qLDk6f","gf8rIi7WMQ","uAWypcShY2","oQ87rQ6hMC","JKWYRHRxd8","pFrrlHzZT8","pvgjSqUJMd","ksJby8RCUA","zHF1qQssNC",
+"J2mQiRzaZA","zY1GY14FLR","QssNCru4UG","S2Dfu2TRI7","C2Irc8TxD7","VerEAtuDyS","5Namma00b5","ksJbyjtn0X","vLsmSnlaBy","t59lR7fsYM",
+"bZLvS0Kyfs","Cfgr32DREs","UlU3MWaWsv","9GXkXuN6r3","Ss0Zuuupzk","UlU3MB3qem","tjQxshUTw7","VIlwP9iGoT","tuDyScQOnv","aDGtSpvgjS",
+"lkMUA7lUXZ","pvgjSFFDui","SjskQIjTwP","AXpwE45cIH","PYBf4Chuy3","QnJ1SI7p2a","55rfBnFqik","Mm8sibrhlQ","uAWypJJs5m","he9IArz7Ut",
+"YjB9tWDVWJ","djsrvn8pJ9","SjskQzbIYY","AIYUutjQxs","S2Dfuh1zcH","5Drn0brhlQ","e6e4zStlDJ","HRxd8F6PT2","HfyNQ6AFT0","U3yw5brhlQ",
+"uTacxJRJQB","EOE1oW3VFH","yToGWMkgy8","FNYIMsx5Gl","Pb1paJJs5m","BbwgAzY1GY","o8UydJIqXi","faHirCxVEf","cmXIXThjNn","WDVWJQChxs",
+"gtCA5uvf7A","0MR5XDQimp","lH1ktlCMxy","k85AekZANm","7hyVv5Drn0","XyPZNSjskQ","SjskQQClRL","QworunFqik","oQ87rXflUq","NOHszRpBQm",
+"okgRiBGaQY","uLtKszz4ZU","jiVBPKr8ys","tjQxszqH0W","P6bcg0ao3l","CqqaD0MR5X","dhSuHokgRi","prNT6uupzk","VerEAlXFOB","fFDrJEdBKc",
+"2DREsW7cTs","WPmlxo8Uyd","VerEAGXdoH","vOqCE9iGoT","uZPqgWPmlx","cShY2atef2","suY4xNOHsz","iB08lRBhp0","JJs5mKZamH","F6PT2VIlwP",
+"pmeCdnlaBy","GrDg7BpYhV","tjQxs8xEKz","WDVWJKr8ys","AkKTkK4GS8","BCxeCWaim6","brhlQrz7Ut","8U2nUTXQ0Z","G1RhSeuZA5","jSjS3FcWrW",
+"zqH0W2Yz7E","hYBCK45cIH","Gv3FqFnPFB","KZamHOHaBz","HRxd8pFrrl","fmIK1Kr8ys","FjHXR9eoRc","0BmCydjsrv","DG4sThi5X7","JKWYRJJs5m",
+"55rfBfcwDa","Gv3FqGWqqX","tlILtnFqik","ZhwG1CK5W7","iwzGkni2v1","AIYUuIRh48","v1Hlnjtn0X","lm0pDB3qem","oGu6x24ARF","8hJdts93Ml",
+"yToGWuTacx","JJs5mWmadA","uAWypMaJQs","7ku1pBpYhV","Q6hMCNcICA","Z4I1vCK5W7","atef25VZjS","JXljW5drc6","SWfouDz1R3","lH1ktyluBx",
+"YOfrY0YAGH","fcwDaFwEJz","MaJQs7ku1p","24ARFb29RJ","VerEARsQUq","lpF6WLewvM","580YDWreyP","uLtKsjiVBP","gtCA507n1c","nnP8ovLsmS",
+"U3yw57ku1p","Gv3FqNxx9V","0Wr5yCIShG","aFFssJIqXi","U3yw5VBjhz","ciuWzy94nw","ulk41rz7Ut","YjB9togLgc","OUYuFXflUq","QChxsWaim6",
+"No0Qbe6e4z","EoToPFPfSE","djsrvRsQUq","mz8gxWDVWJ","tvdkDCNHmv","VNCPdGv3Fq","J2mQi5VZjS","tlILtHP433","2ZHdk0MR5X","atef2No0Qb",
+"ThjNnFjHXR","F6PT2iwzGk","29QAzW7cTs","Yw2oU5ZaEz","uupzk7Ow5C","QWxoTYw2oU","NcICAt98iW","cQOnvyluBx","Q6LixMGlTF","TXQ0ZfcwDa",
+"IBe8kWDVWJ","NOHszJ2mQi","SbRYyru4UG","14FLRO3iyQ","1LB1Lxciqp","1j5L8wDajX","lpF6WWreyP","qQxHPMK07Y","jS1ajqQxHP","zz4ZUfFDrJ",
+"gdQsS618Di","uLtKsU3yw5","s93MlpmeCd","JXljWazIWp","W7cTszqH0W","NhXduNxx9V","JXljW5iGN5","AkKTkUvlv4","CK5W7gjUTu","L7cGct59lR",
+"KsjRKlH1kt","zqH0WNo0Qb","XyPZNxXTI4","FVMxo8FmFH","MGlTFcL0aE","hi5X77fKYU","lm0pDzbIYY","8TxD73weIF","RzaZAFcWrW","1LB1LD6rBy",
+"Yf2Ecdjsrv","CIShGlpF6W","iB08lVprf2","POUYSAIYUu","EdBKcEOE1o","pAhR1FPfSE","cL0aEdjsrv","IBe8kFnPFB","L7cGc16lHc","Uvlv4Cfgr3",
+"ZUnqtPYBf4","faHirWDVWJ","5drc6LbRTH","AkKTkRxrsm","dQ586HzZT8","D6rBytAOsr","uTacxi7WMQ","faHirMm8si","JRJQBKsjRK","9y4lwv8yFN",
+"7fsYMZuDtD","faHirGXdoH","k85AeNxx9V","uAWypRpBQm","5Drn0o8Uyd","Yw2oUIn3NS","CdyBVcL0aE","kZANmlCMxy","9rlg9vLsmS","rhl0JBpYhV",
+"J2mQizQt6Q","TCgPp3weIF","nlaByPb1pa","MmKGJ2hEEU","YOfrYTXQ0Z","okgRitAOsr","YOfrYEoToP","5ZaEzD6rBy","AOgEe0MR5X","CxVEfNxx9V",
+"0KyfsJRJQB","lj07QJKWYR","DQimp7ku1p","U3yw5BFkb8","uAWyp24ARF","GXdoHCK5W7","QworulXFOB","uTacxgIYvE","2TRI7iqv4k","JJs5mWaWsv",
+"Yf2EcuLtKs","dmoS7JJs5m","0MR5XChuy3","XyPZNRzaZA","uZPqgcQOnv","ZUnqtQYxC0","Q6hMCWDVWJ","L7cGczFgtB","faHircQOnv","SjskQfaHir",
+"WreyPuoStw","W7cTsfFDrJ","0BmCy64s8N","PYBf4uTacx","0MR5XAXpwE","fcwDaKASQ8","suY4x5nmWv","JkzUn5ZaEz","JkzUnKsjRK","ni2v1580YD",
+"tlILtuLtKs","gf8rIuAWyp","uN6r33otm6","tlILt1j5L8","LbRTHeuZA5","nFqikjtn0X","EOE1ozY1GY","WreyPYf2Ec","kB5nPGrDg7","tl72WOxWIH",
+"0KyfsGv3Fq","5Drn0IKxdL","tAOsrjiVBP","FPfSECIShG","uTacxhi5X7","faHirYOfrY","LbRTHdpe1v","OHaBzrz7Ut","No0QbyEfy9","DG4sThe9IA",
+"W3VFHtaOXK","9iGoThE1Ql","gdQsSHP433","J2mQifFDrJ","FGzgpe6e4z","NAFuwe6e4z","QYxC0djsrv","9iGoTC2Irc","Y1mC0b29RJ","CK5W7WDVWJ",
+"h1zcHbZLvS","hSSvQMK07Y","hE1QlKZamH","tAOsrQWxoT","AgJHQCK5W7","uPX7GF6PT2","QbxXcS77LH","LewvMmX2GE","Z4I1vhSSvQ","aL6AJgdQsS",
+"oQ87ra00b5","7lUXZni2v1","YOfrYNOHsz","qUJMdJXljW","brhlQOz8yZ","pv0i7dQ586","0h1b1tl72W","0Wr5yFcWrW","lm0pDEoToP","AkKTkv8yFN",
+"RkQkeOHaBz","5ZaEzRBhp0","m4bxUNAFuw","VNCPdMmsIo","JRJQBzFgtB","WreyP4dEz6","VIlwPFhtgl","CIShGfFDrJ","FPfSEqUJMd","48cHLPb1pa",
+"suY4x9GXkX","ECMvUWaim6","VBjhzmz8gx","jtn0XChuy3","0Wr5yQClRL","FVMxotaOXK","6q6L9VLTy6","uvf7Ahe9IA","zmLYDNxx9V","hSSvQHzZT8",
+"HfyNQMm8si","2ZHdkDz1R3","7fsYMWDVWJ","tAOsrpT8wu","o8UydJKWYR","FcWrWJ2mQi","tl72WRsQUq","lViBvMmKGJ","8hJdt0BmCy","8U2nUX6Pin",
+"zbIYYTCgPp","B3qemY1mC0","HzZT8G1RhS","VIlwP8cVD3","5NammpFrrl","QChxsWaWsv","ZzJHWWmadA","5Mg9rciuWz","ZJTXHd7vjM","aFFssjfREu",
+"LDk6f8xEKz","5Drn0pWiOs","7lUXZMmsIo","v1HlnSjskQ","RkQkeprNT6","Cp3mZwiHrZ","hUTw7RzaZA","Ul4a10MR5X","O3iyQOz8yZ","gjUTuLewvM",
+"s93MlOUYuF","lsQGoWaim6","tl72WguMb8","QssNCnFqik","WreyPsx5Gl","ECMvU4W0Tl","DQimpIKxdL","B3qembgJAz","zHF1qydG8U","WMiS3gtCA5",
+"QnJ1SjeskS","cL0aEVLTy6","lCMxyG1RhS","GrDg7NcICA","NcICAEoToP","zz4ZUuAWyp","rKDLJO3iyQ","7Ow5Cpv0i7","xReeccmXIX","gtCA5L7cGc",
+"Oz8yZ0ao3l","vkCHHtlILt","9eoRciB08l","lH1kt45cIH","a00b57X3uy","qaofNUmaEv","0ao3luAWyp","LbRTHzFgtB","Gv3FqydG8U","ZJTXHpv0i7",
+"OUqFM8TxD7","TwanoBCxeC","uAWypzFgtB","QClRLyofH3","7hyVvn1pmO","kB5nPyToGW","24ARFzmLYD","y94nwoVQp6","QssNCtuDyS","aez9yRBhp0",
+"uAWyp0h1b1","jSjS3ZuDtD","QWxoT8U2nU","hE1Ql2DREs","WMiS3zqH0W","hi5X7jiVBP","AIYUuChuy3","zY1GYOHaBz","aDGtSVjCZq","gdQsSVerEA",
+"Yh1hFhE1Ql","XyPZNWPmlx","W7cTsprNT6","RxrsmX6Pin","pFrrlUmaEv","HfyNQ9XyT9","X6PinGrDg7","v2eC3oQ87r","DLhzMogLgc","uoStwWaim6",
+"uAWypi3pyd","9rlg9DLhzM","29QAz5VZjS","AkKTkrhl0J","okgRiVBjhz","16lHcDcpWB","S2Dfum4bxU","jzUqRGv3Fq","i7WMQ9XyT9","WDVWJLewvM",
+"5drc6k85Ae","Uvlv4vkCHH","B3qemUmaEv","FwEJz7ku1p","RmDcrhE1Ql","kZANmv2eC3","MojnP0PktI","2hEEUuPX7G","aFFssoQ87r","StlDJMaJQs",
+"9rlg9zqH0W","iB08lru4UG","9iGoTI7p2a","n8pJ9cQOnv","JIqXiIjTwP","6q6L9VBjhz","0h1b1m4bxU","HlUbFaL6AJ","0YAGHCNHmv","nFqikMkgy8",
+"Y1mC0zY1GY","QnJ1S7Ow5C","yvOMI29QAz","bgJAzRACuj","pvgjSy94nw","rKDLJQ6hMC","0h1b1MojnP","5ZaEzHfyNQ","4dEz6Y1mC0","v8yFN9GXkX",
+"DcpWBbrhlQ","HfyNQazIWp","LewvMtvdkD","he9IAS2Dfu","suY4xFwEJz","ThjNnpv0i7","sqVrfVNCPd","StlDJEoToP","lViBvfFDrJ","6AFT0RkQke",
+"0MR5X1LB1L","pvgjSMK07Y","O3iyQAkKTk","aDGtSgjUTu","WPmlxguMb8","yToGWiwzGk","D6rByCp3mZ","v8yFNkB5nP","Rxrsm2DREs","uvf7ATCgPp",
+"b29RJFLsph","HlUbFuTacx","s7MxknlaBy","i7WMQZv7z0","S2Dfu7ku1p","2hEEUbgJAz","0PktIFPfSE","WmadAQClRL","y94nwCdyBV","n8pJ94W0Tl",
+"GXdoH8FmFH","Q6hMCe6e4z","lXFOBd85a9","TCgPpGXdoH","RzaZA8hJdt","OUYuFs93Ml","O3iyQnlaBy","nFqik5iGN5","uAWypkZANm","FLsphS2Dfu",
+"h1zcHwDajX","BbwgA4dEz6","hE1QlIBe8k","uupzk8RCUA","BbwgAJkzUn","Z4I1v8U2nU","bgJAzrz7Ut","fcJOyhYBCK","atef2vOqCE","hSSvQnnP8o",
+"POUYSl83Ud","OxWIHFcWrW","RkQkeP6bcg","8cVD3FnPFB","xciqpUvlv4","iB08lv1Hln","16lHc7fKYU","y94nw07n1c","pv0i716lHc","LDk6fKZamH",
+"mX2GEbrhlQ","29QAzG1RhS","8hJdt0YAGH","SjskQ2Nslm","JJs5muAWyp","NhXduHfyNQ","7ku1p9y4lw","LDk6fZhwG1","Ta8f66AFT0","Mm8siogLgc",
+"7Ow5CFcWrW","MezSWRACuj","K20wK5ZaEz","yluBxHzZT8","GSQwjyToGW","RpBQm2Nslm","Ta8f6WPmlx","QChxsfaHir","QnJ1ShUTw7","55rfB14FLR",
+"RACujydG8U","QworuRACuj","hi5X7MmsIo","lj07QcQOnv","UlU3MWmadA","HP433Rxrsm","G1RhSzz4ZU","7Ow5CLbRTH","NOHsz5Mg9r","kB5nPsx5Gl",
+"LewvMqUJMd","ru4UGs4786","1j5L8zHF1q","o8Uyd3otm6","ZzJHWJRJQB","XflUqStlDJ","dmoS77hyVv","ix74rlViBv","xciqpJRJQB","NOHszYf2Ec",
+"pT8wu7fKYU","iqv4ka00b5","8U2nUG1RhS","8hJdtYOfrY","pmeCdQYxC0","LbRTHWmadA","jzUqRrKDLJ","SbRYyFFDui","BpYhVECMvU","Yf2EcDLhzM",
+"5ZaEz6q6L9","K4GS8FGzgp","M6qcGru4UG","uoStwUvlv4","oGu6xMojnP","BCxeCXyPZN","uJScXlweGy","OUqFMQWxoT","VjCZqfaHir","9eoRcpv0i7",
+"QbxXcdhSuH","RACujThjNn","qaofNCdyBV","CK5W7MaJQs","gf8rIlkMUA","7lUXZECMvU","soy9tAgJHQ","Vprf2SbRYy","atef2FFDui","AIYUurKDLJ",
+"EOE1onFqik","IjTwP5iGN5","hUTw7NAFuw","d7vjMMmsIo","yvOMIkB5nP","bgJAzEdBKc","ogLgc2DREs","pmeCdK4GS8","YOfrY5Namm","lH1ktdpe1v",
+"zbIYYU3yw5","euZA5aez9y","dmoS7HfyNQ","MaJQsM6qcG","KZamHd7vjM","djsrvsoy9t","MK07YAXpwE","OxWIHRACuj","xciqpZ4I1v","SWfou5ZaEz",
+"GWqqXpAhR1","Ul4a1GXdoH","gf8rIuupzk","8cVD3LewvM","GrDg7EoToP","8xEKzfmIK1","07n1csx5Gl","8hJdt3otm6","8U2nUJ2mQi","GrDg7K20wK",
+"SjskQv1Hln","lCMxymX2GE","BCxeCtaOXK","Rxrsm0Wr5y","ZzJHWtuDyS","Dz1R3Y1mC0","ulk41Nxx9V","dmoS7JRJQB","pWiOsy94nw","lweGyUvlv4",
+"QnJ1SIn3NS","ReKEWXyPZN","ReKEWd7vjM","6AFT0DQimp","lj07QlXFOB","prNT6F6PT2","9eoRcYw2oU","618DiS77LH","AmdQdjeskS","jfREut98iW",
+"OUYuFYf2Ec","MezSWKr8ys","oQ87r45cIH","K4GS8ksJby","SbRYylCMxy","GXdoHIRh48","oQ87rBGaQY","0MR5XNOHsz","F6PT24W0Tl","ru4UGZUnqt",
+"Nxx9VuLtKs","OHaBzvkCHH","U3yw5HzZT8","UlU3MciuWz","gIYvEFxX9q","DQimpyluBx","ZhwG1G1RhS","0KyfsQworu","DcpWBKZamH","zQt6QBCxeC",
+"FnPFBC2Irc","YOfrYGSQwj","xciqphUTw7","gdQsSP6bcg","YOfrYydG8U","sqVrfn1pmO","gtCA5rhl0J","S2DfuuZPqg","6q6L9ru4UG","UmaEv0MR5X",
+"BpYhVG1RhS","dpe1vgIYvE","tAOsrMmsIo","7ku1pYf2Ec","s93MliwzGk","5Drn0AgJHQ","FnPFB8U2nU","0h1b1oGu6x","lH1ktksJby","n1pmOQYxC0",
+"HlUbFQbxXc","9rlg9HzZT8","8TxD7iKqhr","ciuWz1LB1L","ZuDtDZJTXH","In3NSLbRTH","SmGzvAXpwE","6q6L9pFrrl","4dEz6uZPqg","FGzgp3weIF",
+"Waim6HlUbF","dpe1vCNHmv","Z4I1vdhSuH","ciuWzHzZT8","XyPZNjzUqR","n8pJ9ciuWz","RxrsmuPX7G","JXljWsuY4x","1LB1LKsjRK","9rlg9QChxs",
+"mX2GEOHaBz","JkzUnMGlTF","bZLvSbZLvS","e6e4zfcwDa","QbxXcW3VFH","jS1ajZJTXH","o8UydHlUbF","KZamHpFrrl","7lUXZRmDcr","s4786atef2",
+"xReecqQxHP","fmIK12Nslm","i3pydjzUqR","gdQsS0Kyfs","No0Qbb29RJ","oGu6xSWfou","TwanoprNT6","okgRiPYBf4","uZPqggf8rI","guMb8d85a9",
+"2hEEUOxWIH","bZLvSlpF6W","aez9yFhtgl","uTacx5IhmG","dpe1v8FmFH","v8yFNUmaEv","fmIK1JJs5m","Zv7z0jzUqR","vOqCEy94nw","gdQsSvkCHH",
+"a00b52TRI7","lj07QuQIcz","QbxXc580YD","faHirRkQke","EOE1o5VZjS","Pb1pahSSvQ","9y4lw64s8N","Q6hMCcQOnv","618DihUTw7","9y4lw2ZHdk",
+"FjHXRRzaZA","ZuDtDQworu","KZamH7ku1p","i3pydhE1Ql","SjskQEOE1o","BbwgAMm8si","gjUTuhSSvQ","ZJTXHFxX9q","Q6LixPb1pa","WaWsvW7cTs",
+"FcWrWAIYUu","blLA9MmKGJ","POUYSRkQke","07n1cSmGzv","9XyT97fKYU","POUYStaOXK","1j5L8QClRL","v1Hlns4786","aFFssYOfrY","WreyPsuY4x",
+"RsQUq0MR5X","GrDg7okgRi","tjQxsLbRTH","soy9tSjskQ","FNYIMOUqFM","7Ow5CO3iyQ","h1zcHlsQGo","W7cTszFgtB","Gv3FqwiHrZ","VNCPds93Ml",
+"s7Mxk7ku1p","GXdoHC2Irc","2DREsfmIK1","JIqXiFwEJz","jzUqR5Mg9r","fcwDaWreyP","L7cGc0h1b1","iwzGkzz4ZU","16lHcKsjRK","qUJMdqUJMd",
+"CK5W7yvOMI","2NslmsuY4x","TXQ0ZpiJSk","BpYhVuTacx","bZLvSZJTXH","lpF6WVIlwP","lweGyuTacx","ZuDtD0Wr5y","TXQ0Z9y4lw","5Mg9rYOfrY",
+"l83UdtvdkD","KZamHVNCPd","s4786MGlTF","pvgjSPOUYS","9iGoTaez9y","45cIHgdQsS","RzaZAazIWp","vkCHHhi5X7","7hyVv9y4lw","ksJbyZJTXH",
+"Yf2Ec1LB1L","WreyPnlaBy","Yh1hFYf2Ec","djsrviB08l","2Yz7EM3zXL","azIWpBFkb8","Fhtgl2ZHdk","m4bxUQssNC","pv0i7HlUbF","5Mg9rVIlwP",
+"qaofNJXljW","x3LDerz7Ut","WmadAHlUbF","uvf7ACK5W7","DLhzMHRxd8","bgJAzLDk6f","5NammTwano","8cVD3HlUbF","pAhR1VNCPd","uJScX1j5L8",
+"cShY2xciqp","2NslmJ2mQi","9XyT90BmCy","5Mg9r0MR5X","5drc6WaWsv","suY4xqUJMd","Mm8sirz7Ut","BbwgARsQUq","fmIK1HzZT8","VBjhzpv0i7",
+"JXljWIn3NS","dhSuHatef2","ReKEWDLhzM","MojnPRxrsm","9XyT9JJs5m","C2IrcLDk6f","atef2W3VFH","JRJQBFcWrW","uupzkFPfSE","9GXkXCp3mZ",
+"QChxsI7p2a","dQ5862DREs","4QMc9M3zXL","J2mQiHlUbF","yvOMIHlUbF","5nmWvVprf2","qaofNfaHir","MmsIocShY2","nlaByKASQ8","Zv7z0J2mQi",
+"hE1Ql8hJdt","7Ow5C8cVD3","JKWYR5ZaEz","yToGWFVMxo","s93MlZhwG1","VIlwPiKqhr","d7vjMrKDLJ","s93MlBbwgA","piJSkdQ586","55rfBZhwG1",
+"ulk41gjUTu","QClRLFhtgl","TXQ0Z2Yz7E","0MR5XMGlTF","Y1mC0hE1Ql","vLsmSIRh48","aL6AJiwzGk","jtn0XvLsmS","tl72W1v5hH","dhSuHNcICA",
+"OUYuFCNHmv","Y1mC0qaofN","4dEz6S2Dfu","hE1QlP6bcg","45cIHaDGtS","MmKGJMK07Y","mz8gxAkKTk","Y1mC0xciqp","4dEz6AOgEe","CqqaDECMvU",
+"45cIHZuDtD","Fhtgl5IhmG","suY4xJIqXi","piJSkyToGW","0PktIKASQ8","CIShGWreyP","TCgPp0ao3l","fFDrJF6PT2","RBhp0FPfSE","S77LHs4786",
+"lj07QMojnP","8hJdtEdBKc","QYxC0JJs5m","VNCPdCNHmv","HzZT8DLhzM","ECMvUtlILt","5ZaEzxReec","QssNCtjQxs","hYBCKzQt6Q","DcpWBWPmlx",
+"lH1kt5ZaEz","b29RJhUTw7","sx5Gl2Nslm","BbwgAqaofN","0BmCyReKEW","tvdkDmX2GE","FxX9qVLTy6","DcpWB4dEz6","FxX9qFcWrW","8FmFHbZLvS",
+"JRJQBQssNC","oVQp6HlUbF","4W0Tl16lHc","5drc6zHF1q","TwanozbIYY","3weIFfcJOy","Qworu2DREs","wDajXMkgy8","WPmlxHzZT8","AgJHQDcpWB",
+"DLhzMo8Uyd","C2Irc5VZjS","5IhmGCxVEf","5drc6SbRYy","7hyVvVprf2","ZzJHWqaofN","tl72Wm4bxU","29QAzVjCZq","2TRI7pmeCd","guMb8FVMxo",
+"8xEKzSWfou","zmLYDMK07Y","PYBf4dpe1v","zmLYDSmGzv","Vprf2e6e4z","MmKGJtaOXK","he9IANOHsz","VNCPdqaofN","GWqqXSmGzv","RkQkeFFDui",
+"xReecHfyNQ","Yh1hFHP433","uoStwEoToP","a00b5mz8gx","J2mQiMmsIo","JIqXifmIK1","BGaQYlCMxy","9y4lwK20wK","CIShG8RCUA","yToGW16lHc",
+"azIWpOxWIH","8TxD7618Di","fLNg8lCMxy","Gv3FqSjskQ","uupzktuDyS","ru4UGAmdQd","OxWIH6AFT0","HRxd8No0Qb","7hyVvlViBv","OUqFMVerEA",
+"RpBQm4W0Tl","tvdkDW3VFH","ZuDtDAOgEe","TXQ0ZBFkb8","wiHrZ8xEKz","5NammyluBx","NcICAMm8si","ThjNnJ2mQi","CK5W7t98iW","2hEEUiB08l",
+"AXpwE4QMc9","pv0i7iqv4k","JJs5mYjB9t","fmIK1KZamH","K4GS8k85Ae","cL0aEF6PT2","vLsmSRkQke","MezSW2ZHdk","RmDcrgtCA5","CK5W79eoRc",
+"BpYhVmX2GE","HlUbFcShY2","atef20Wr5y","cmXIXuAWyp","yofH3XflUq","KsjRK5iGN5","5ZaEzjfREu","RkQkeHlUbF","WMiS3Mm8si","UlU3Mh1zcH",
+"QYxC0v1Hln","FxX9qM6qcG","8hJdtjeskS","5NammTa8f6","FjHXRNOHsz","5Mg9rBbwgA","TwanosuY4x","ThjNnni2v1","ZhwG1gf8rI","iKqhrydG8U",
+"m4bxUHP433","ZuDtDlweGy","zmLYDlweGy","580YD24ARF","NcICAcL0aE","RACujogLgc","7fKYUzz4ZU","0MR5XuQIcz","ksJbyI7p2a","pv0i7FNYIM",
+"24ARFciuWz","ThjNnC2Irc","piJSkn1pmO","uN6r37lUXZ","EOE1oFGzgp","Kr8ysgf8rI","oGu6xLewvM","v2eC35VZjS","lweGyDG4sT","7ku1pIn3NS",
+"MK07Ysoy9t","G1RhSatef2","nlaByoVQp6","Nxx9VQChxs","HlUbFyvOMI","9XyT9uZPqg","zz4ZUzqH0W","tl72WpFrrl","ThjNnh1zcH","FLsphdQ586",
+"hYBCKTCgPp","ru4UGSWfou","CdyBVAkKTk","7fsYMk85Ae","OxWIHv1Hln","7lUXZSWfou","ECMvUQChxs","ru4UGJJs5m","Y1mC0gtCA5","NAFuwD6rBy",
+"aFFssksJby","2DREsEOE1o","VjCZqy94nw","Mm8siix74r","Kr8ysfLNg8","rKDLJC2Irc","fqypyQ6hMC","W7cTsAXpwE","Oz8yZuLtKs","IjTwPBFkb8",
+"UmaEvix74r","0Wr5ymz8gx","cShY2X6Pin","uTacxIn3NS","7ku1p55rfB","VLTy60PktI","K20wKXyPZN","8cVD3hE1Ql","M3zXLa00b5","pFrrlKASQ8",
+"No0QbVprf2","uLtKs7ku1p","tlILt2TRI7","hi5X7mz8gx","yEfy9SWfou","uoStw48cHL","4W0Tl5nmWv","16lHc0YAGH","9rlg9vkCHH","ni2v1NcICA",
+"8FmFHQnJ1S","0Wr5yRsQUq","CIShGyofH3","8hJdtVIlwP","gf8rI4W0Tl","S77LHQ6hMC","DQimpZzJHW","FPfSE9GXkX","FxX9qJRJQB","BFkb80MR5X",
+"pmeCdBbwgA","9GXkXFLsph","qaofN0BmCy","jeskSCK5W7","IjTwPW3VFH","0h1b1VIlwP","tlILtGv3Fq","wiHrZCp3mZ","lH1ktPb1pa","ogLgcVNCPd",
+"NcICACNHmv","okgRiuZPqg","hYBCKpAhR1","7fsYMJIqXi","Yh1hF580YD","7fsYMgf8rI","2DREsdQ586","MmsIoEOE1o","B3qem2DREs","07n1cEdBKc",
+"i3pydMmKGJ","7fKYU9iGoT","NAFuwtl72W","XyPZNi7WMQ","xXTI4s7Mxk","Zv7z0t59lR","MaJQsOHaBz","YOfrY0Wr5y","ulk41DQimp","Q6Lix2hEEU",
+"WMiS3sx5Gl","FjHXRMGlTF","hUTw7zmLYD","sx5Gl0h1b1","OxWIHaDGtS","tjQxsi7WMQ","hYBCKAgJHQ","azIWp7X3uy","580YDYjB9t","M3zXLMGlTF",
+"5ZaEzix74r","StlDJv1Hln","fFDrJTCgPp","uQIczMaJQs","IRh48L7cGc","48cHLBFkb8","v2eC3RsQUq","JRJQBv8yFN","AmdQdIBe8k","djsrvWPmlx",
+"yvOMIrKDLJ","G1RhScQOnv","RACujhSSvQ","yluBxYOfrY","taOXKThjNn","rhl0JaFFss","618DiFxX9q","Ss0ZuStlDJ","CK5W7GXdoH","5drc6yluBx",
+"zFgtBIn3NS","JKWYRuLtKs","VLTy6UlU3M","CNHmvuupzk","QbxXcvOqCE","fqypyYOfrY","0MR5X2ZHdk","JkzUnQ6hMC","a00b5O3iyQ","CxVEf7ku1p",
+"okgRiTXQ0Z","GXdoHQ6hMC","FPfSENOHsz","Kr8yslCMxy","5ZaEzcShY2","8TxD7FcWrW","RxrsmQssNC","S2Dfu5drc6","t98iWfcwDa","FhtglJXljW",
+"P6bcgZuDtD","JIqXiJXljW","fcJOyJXljW","nlaBy3otm6","8TxD7suY4x","DcpWBydG8U","WaWsvb29RJ","OHaBzJJs5m","fFDrJfFDrJ","zQt6Q9rlg9",
+"ni2v1aez9y","RBhp029QAz","NcICARBhp0","Z4I1vuAWyp","SmGzvuN6r3","FcWrWd85a9","Cfgr3taOXK","QClRLa00b5","jzUqRIRh48","8cVD3MezSW",
+"n1pmOb29RJ","580YDFwEJz","jS1ajAgJHQ","2Nslm9rlg9","fcJOyzbIYY","yluBx9eoRc","8U2nUzFgtB","VBjhzMezSW","rKDLJIn3NS","guMb8oGu6x",
+"CIShGYOfrY","zQt6Qhe9IA","MojnPn8pJ9","fcwDaFxX9q","lViBvBbwgA","MmKGJyvOMI","blLA94W0Tl","NOHszpv0i7","0Wr5yX6Pin","h1zcHtl72W",
+"rz7UtfaHir","bZLvStAOsr","suY4x8cVD3","Q6hMClXFOB","atef2Ul4a1","tAOsrsqVrf","v2eC35Namm","7hyVvxXTI4","2DREsru4UG","VBjhz29QAz",
+"5Drn0BCxeC","xReec8hJdt","yofH3xReec","y94nwqUJMd","mX2GEFnPFB","WPmlxv8yFN","zQt6QrKDLJ","ThjNnQ6Lix","FNYIMZUnqt","pFrrl55rfB",
+"Yh1hFVprf2","aL6AJVjCZq","D6rByIRh48","FFDuifmIK1","BbwgAFPfSE","tAOsrd7vjM","9XyT9QbxXc","5ZaEzuJScX","CNHmvXyPZN","EOE1ocShY2",
+"dmoS7s7Mxk","AOgEeY1mC0","s7Mxk4W0Tl","Waim6soy9t","0Wr5yBFkb8","QbxXcPYBf4","cShY2M3zXL","SWfouSs0Zu","s7MxkBpYhV","WPmlxnlaBy",
+"JkzUnVBjhz","vLsmSSWfou","OUqFMNcICA","VerEAguMb8","5iGN5DLhzM","v8yFNZzJHW","JRJQB1j5L8","jfREuiqv4k","W3VFHjiVBP","9iGoTnFqik",
+"fcwDaAgJHQ","fcwDaK4GS8","WmadACxVEf","BCxeCAmdQd","ciuWzVBjhz","l83Uds4786","aL6AJ45cIH","9eoRc2hEEU","aez9y29QAz","GSQwjydG8U",
+"iB08l4dEz6","dpe1vJRJQB","HfyNQlsQGo","C2Ircrz7Ut","oVQp6azIWp","CNHmv64s8N","oQ87rNcICA","7fKYUyofH3","jS1ajnlaBy","QworuG1RhS",
+"AOgEeiB08l","MaJQs1v5hH","9XyT9rhl0J","brhlQ2Nslm","vkCHHqUJMd","sx5GlwiHrZ","ogLgcvOqCE","piJSkfmIK1","ZhwG1yvOMI","VNCPdHRxd8",
+"55rfBD6rBy","HzZT8Vprf2","jfREuNhXdu","zFgtBAIYUu","MezSWO3iyQ","HP433FVMxo","GWqqXtvdkD","brhlQMojnP","hYBCKpT8wu","MojnPhE1Ql",
+"7ku1pprNT6","jS1aj6q6L9","IjTwPGXdoH","Pb1pa8FmFH","WaWsv8U2nU","PYBf4FnPFB","5Drn0DQimp","KASQ8BCxeC","ru4UGFcWrW","8TxD7tl72W",
+"QworuIRh48","0KyfsWDVWJ","ZJTXHhi5X7","yvOMIfcJOy","d7vjMfLNg8","Gv3FqpAhR1","WMiS3hE1Ql","IBe8kyEfy9","atef2jS1aj","24ARFHlUbF",
+"JXljWpiJSk","aDGtS8U2nU","1j5L8lXFOB","VLTy6rKDLJ","NhXduZzJHW","WreyPRmDcr","0Wr5yStlDJ","brhlQgf8rI","BFkb8aL6AJ","HRxd8l83Ud",
+"fqypyWaim6","WaWsvuoStw","qQxHPWPmlx","RBhp0WDVWJ","uPX7GPOUYS","mz8gxZ4I1v","fmIK1JXljW","1j5L8HP433","pvgjSxXTI4","fcwDa9GXkX",
+"2DREsh1zcH","xReecbZLvS","XyPZNEoToP","HRxd8FNYIM","MojnPtjQxs","J2mQiO3iyQ","FcWrWdhSuH","oVQp6uoStw","FNYIMCK5W7","29QAz0Wr5y",
+"2hEEUrhl0J","HfyNQqaofN","n1pmOuQIcz","TXQ0ZblLA9","tl72WuZPqg","oVQp6UlU3M","VerEAZzJHW","BGaQYgf8rI","euZA5DG4sT","Chuy3Chuy3",
+"i7WMQqQxHP","ZhwG1cShY2","HzZT8FnPFB","CdyBVVNCPd","9iGoT7fKYU","yEfy964s8N","OxWIHHP433","KsjRKRpBQm","RzaZABbwgA","sqVrf29QAz",
+"BFkb8guMb8","aez9yt98iW","uAWypuupzk","GXdoH1v5hH","5drc6Vprf2","0PktINxx9V","nnP8oiB08l","YjB9tRzaZA","d85a9AIYUu","8FmFHW3VFH",
+"LbRTHWDVWJ","MK07YzmLYD","AIYUupAhR1","gIYvExXTI4","HP433CxVEf","pmeCdQ6hMC","UlU3MksJby","3otm6RBhp0","mz8gxaez9y","tlILtWaim6",
+"zz4ZUyofH3","VNCPdIRh48","y94nwChuy3","WDVWJzFgtB","QworuVBjhz","jtn0Xhi5X7","ulk415VZjS","GWqqXMaJQs","14FLRHfyNQ","FVMxoUmaEv",
+"IRh480YAGH","AgJHQBpYhV","b29RJUl4a1","BpYhVQWxoT","a00b5dhSuH","gtCA5d7vjM","FcWrW07n1c","uN6r3TCgPp","7fKYUnlaBy","5ZaEzJRJQB",
+"ciuWzydG8U","iKqhr5drc6","SjskQWmadA","1LB1LhSSvQ","7lUXZprNT6","aL6AJlsQGo","vOqCEtaOXK","Cfgr37X3uy","v1HlnLewvM","mz8gxO3iyQ",
+"WreyPNhXdu","fqypyMkgy8","2hEEUpv0i7","5Drn0lXFOB","M6qcGgIYvE","pWiOsBGaQY","FwEJztAOsr","CqqaDqQxHP","MmKGJF6PT2","i3pydix74r",
+"lj07QtjQxs","hSSvQTwano","ReKEWFjHXR","Waim69iGoT","MmKGJMkgy8","aL6AJBGaQY","UlU3MS2Dfu","7ku1p580YD","RkQkexReec","9GXkXPOUYS",
+"brhlQzmLYD","2ZHdkY1mC0","QworuBFkb8","Nxx9VoVQp6","xReec4W0Tl","8cVD3IKxdL","a00b5fLNg8","h1zcHFVMxo","t98iW8RCUA","uLtKsVerEA",
+"cQOnv8RCUA","Ss0Zu7X3uy","F6PT20YAGH","Gv3FqeuZA5","BCxeC55rfB","CK5W7PYBf4","4W0Tl5IhmG","Y1mC00h1b1","QClRLtjQxs","1LB1LoQ87r",
+"xciqp5drc6","ni2v1vkCHH","9y4lwMkgy8","yToGWDcpWB","0MR5XlXFOB","Nxx9V8hJdt","5ZaEzlkMUA","n1pmOUl4a1","O3iyQHlUbF","l83UdpWiOs",
+"9rlg9xXTI4","wiHrZLDk6f","s7MxkgIYvE","0YAGHhE1Ql","RkQkeJRJQB","3weIFh1zcH","UmaEvjfREu","LDk6fuLtKs","Mm8siY1mC0","gtCA5lXFOB",
+"YOfrYhE1Ql","ulk41S77LH","64s8NFxX9q","pmeCd8cVD3","NOHszFPfSE","FnPFBatef2","VerEA6AFT0","7Ow5CQChxs","0Kyfsi3pyd","lViBvMmsIo",
+"cShY28U2nU","2ZHdk2TRI7","W3VFHzQt6Q","M6qcGChuy3","P6bcghYBCK","Ta8f6mz8gx","64s8NzQt6Q","m4bxUOxWIH","48cHLUl4a1","ThjNn3otm6",
+"e6e4zx3LDe","yluBxpvgjS","RxrsmRmDcr","6AFT0pT8wu","VerEAF6PT2","soy9tgjUTu","m4bxUrKDLJ","VIlwPcQOnv","VerEAX6Pin","GSQwjQ6Lix",
+"EOE1ohYBCK","IRh48tuDyS","uoStwCp3mZ","4QMc9W7cTs","SWfouYOfrY","IBe8kQChxs","gf8rI1v5hH","pWiOsThjNn","iKqhri3pyd","v2eC3lsQGo",
+"8U2nUUl4a1","piJSk1j5L8","9GXkXZzJHW","lweGyU3yw5","pWiOssqVrf","Mm8siydG8U","h1zcHGXdoH","G1RhSdjsrv","S77LHNcICA","Kr8ysCdyBV",
+"piJSkzHF1q","prNT6GSQwj","4W0TlGv3Fq","64s8NEOE1o","lm0pD7Ow5C","Q6LixtlILt","PYBf4Waim6","suY4xQYxC0","YjB9tlpF6W","24ARFQClRL",
+"djsrvuvf7A","FjHXRFVMxo","W3VFHbZLvS","BbwgAQWxoT","CK5W7AmdQd","aDGtSThjNn","DLhzMwDajX","okgRiWreyP","HzZT8atef2","wiHrZmX2GE",
+"tjQxsblLA9","NAFuwlkMUA","CxVEfl83Ud","blLA9K20wK","CK5W75drc6","gIYvElViBv","Rxrsm8U2nU","dQ586RACuj","JIqXiGWqqX","yvOMIt98iW",
+"VerEAlweGy","iqv4kStlDJ","Pb1paEdBKc","ciuWzAgJHQ","bgJAzgIYvE","pv0i7cShY2","cShY2UmaEv","Pb1paRmDcr","YjB9tWreyP","aez9ypvgjS",
+"2Yz7EciuWz","ydG8UOUqFM","MezSWfqypy","2DREsFGzgp","Pb1pasx5Gl","jfREuRBhp0","DLhzMRACuj","MmKGJRzaZA","prNT65Namm","HzZT8jzUqR",
+"s93MlzQt6Q","VjCZqpvgjS","Chuy3b29RJ","prNT6M6qcG","NAFuwjeskS","PYBf4pvgjS","atef2In3NS","WDVWJcQOnv","dmoS7pmeCd","oVQp6Kr8ys",
+"Ss0ZujS1aj","d85a9Qworu","QClRLMK07Y","AgJHQWMiS3","DLhzMtAOsr","qaofNQbxXc","TwanoY1mC0","QworuBGaQY","hSSvQWMiS3","s7Mxk6AFT0",
+"Q6hMC4QMc9","QWxoT55rfB","AmdQdIKxdL","oGu6xDG4sT","Vprf2Rxrsm","S77LHZzJHW","WreyPuAWyp","jSjS3FVMxo","e6e4ziKqhr","VLTy6piJSk",
+"fcJOyuLtKs","fLNg80h1b1","ThjNnRmDcr","BpYhVMkgy8","9iGoTcmXIX","DcpWBIRh48","a00b5lCMxy","pFrrlGSQwj","Ul4a1yEfy9","Yf2EcQWxoT",
+"DQimpUvlv4","hi5X7WMiS3","SmGzvazIWp","Q6LixfcJOy","gIYvED6rBy","7lUXZzbIYY","AmdQdCIShG","RmDcrW7cTs","I7p2a1j5L8","bZLvSFLsph",
+"yToGW9GXkX","0Wr5y6AFT0","xXTI4uJScX","O3iyQdQ586","D6rBy0ao3l","suY4x8TxD7","B3qem7fKYU","7fKYUWPmlx","Yw2oURxrsm","W3VFH7X3uy",
+"zbIYYB3qem","1v5hHciuWz","SWfoupWiOs","8TxD7LewvM","BGaQYDz1R3","K20wKlkMUA","lCMxyLewvM","IKxdLzqH0W","cL0aEWDVWJ","x3LDe7fKYU",
+"UlU3M7ku1p","29QAzblLA9","RBhp0PYBf4","618DiFnPFB","JXljW9y4lw","5ZaEzsoy9t","n1pmO9eoRc","Z4I1vnnP8o","blLA9fcJOy","FwEJzFVMxo",
+"MaJQszqH0W","tuDySuTacx","t59lRoVQp6","oVQp6ZzJHW","bZLvSs4786","b29RJsoy9t","tl72WvOqCE","PYBf40PktI","JKWYRgjUTu","JkzUnJRJQB",
+"aFFssFwEJz","hUTw7yluBx","1v5hHzz4ZU","Ss0Zu2Nslm","5IhmG9iGoT","C2IrczHF1q","dQ586NOHsz","zz4ZUYf2Ec","0MR5XUmaEv","ZJTXHzY1GY",
+"AkKTkFFDui","Ss0ZuBFkb8","ogLgcYw2oU","JXljWuvf7A","BCxeCAIYUu","aFFssbZLvS","uLtKsMm8si","oVQp6VjCZq","jSjS345cIH","iqv4k0ao3l",
+"CdyBVCNHmv","3weIF8FmFH","4W0TlpT8wu","cShY2CxVEf","5Mg9rMGlTF","soy9tcQOnv","8TxD7Mm8si","U3yw5yofH3","PYBf4O3iyQ","uLtKsaL6AJ",
+"6q6L9vLsmS","cL0aEqUJMd","zY1GY5IhmG","Q6hMCAkKTk","2ZHdkG1RhS","VjCZquupzk","jzUqRlsQGo","UmaEvuAWyp","Ta8f6TXQ0Z","lH1kt8TxD7",
+"n1pmOBFkb8","vkCHHCp3mZ","jfREuksJby","VLTy6JXljW","1j5L8jiVBP","y94nwv1Hln","qUJMdRzaZA","7ku1pOUYuF","2DREsRmDcr","24ARF5Mg9r",
+"uN6r3JIqXi","zbIYYBGaQY","zz4ZUpmeCd","AXpwENcICA","QYxC0ZJTXH","ZhwG1tjQxs","hUTw7pv0i7","Mkgy8lXFOB","yluBxmz8gx","Chuy3K20wK",
+"55rfBgtCA5","0PktIt98iW","aDGtSpAhR1","tjQxsIn3NS","hE1QlkZANm","fmIK10MR5X","zQt6QMmKGJ","azIWpNAFuw","29QAzoQ87r","gtCA5RzaZA",
+"StlDJIRh48","soy9trhl0J","jS1ajLDk6f","MezSWQssNC","l83UdOUYuF","jeskSaez9y","tjQxstuDyS","uJScXtl72W","lCMxyQssNC","5Mg9rZJTXH",
+"Q6LixzFgtB","s93MllH1kt","I7p2aEdBKc","piJSkStlDJ","nlaBylj07Q","vLsmSNo0Qb","pFrrlDcpWB","O3iyQazIWp","WDVWJzz4ZU","K20wKWDVWJ",
+"jfREuNcICA","BCxeCMmsIo","HP433K20wK","AmdQdFhtgl","0ao3lAgJHQ","dmoS7uN6r3","HRxd8Vprf2","tAOsrdpe1v","FGzgpMezSW","5Namm2ZHdk",
+"7Ow5C5drc6","4QMc9cQOnv","HP433WaWsv","vOqCEsuY4x","JXljWt98iW","uAWypsqVrf","uZPqgBCxeC","IjTwP0ao3l","BGaQYzbIYY","7ku1pbgJAz",
+"DG4sTksJby","uoStwKr8ys","oVQp6FNYIM","tuDySQChxs","pT8wujzUqR","7fKYUuAWyp","07n1cokgRi","zqH0WAIYUu","Fhtgl5drc6","xReecpWiOs",
+"zFgtB0ao3l","iwzGke6e4z","hi5X7bgJAz","lj07QKASQ8","qQxHPGrDg7","8U2nULDk6f","y94nwjtn0X","pv0i7XflUq","FFDuirz7Ut","pmeCdFVMxo",
+"zFgtBlsQGo","Pb1paZhwG1","gIYvEciuWz","hUTw7HlUbF","ulk41nFqik","cShY2uvf7A","QWxoTRBhp0","SbRYy8xEKz","uAWypAmdQd","IKxdLRpBQm",
+"7fKYUZ4I1v","FFDuiuJScX","ru4UGOxWIH","2Yz7EfaHir","HlUbFpFrrl","FFDui5VZjS","kB5nPzFgtB","EdBKcMkgy8","Qworu0BmCy","DLhzMjS1aj",
+"lViBvJXljW","Vprf2GrDg7","gtCA5Zv7z0","Nxx9VHRxd8","Cfgr3Yf2Ec","MmKGJi3pyd","s4786ZhwG1","BFkb8mz8gx","4QMc9fqypy","2DREsQYxC0",
+"8xEKzrz7Ut","pv0i7ZJTXH","MezSWDLhzM","JkzUn7Ow5C","RsQUqBbwgA","Ss0ZuCdyBV","JXljWs4786","Zv7z0S77LH","zbIYYxReec","1LB1LazIWp",
+"sx5Gl9XyT9","fLNg8AIYUu","2Yz7E3weIF","pv0i70Wr5y","IKxdLDcpWB","9iGoT7hyVv","gjUTuFPfSE","tl72WYf2Ec","euZA55Mg9r","I7p2aOxWIH",
+"5Mg9rxciqp","Rxrsmd7vjM","e6e4zFNYIM","K4GS8I7p2a","s93MlvOqCE","RBhp0S77LH","LDk6fFhtgl","Ta8f6uoStw","FwEJzMm8si","kB5nPPYBf4",
+"0Wr5ylsQGo","Yh1hF2TRI7","HRxd8Rxrsm","okgRilpF6W","fLNg81j5L8","fcJOyECMvU","uAWypD6rBy","K4GS8Rxrsm","VNCPd0BmCy","C2IrcAIYUu",
+"OxWIHPYBf4","M6qcGcQOnv","euZA5lweGy","B3qemZ4I1v","kB5nPL7cGc","gIYvE1v5hH","jzUqRmz8gx","9XyT97lUXZ","DG4sTMmKGJ","ECMvUd85a9",
+"ECMvUEOE1o","aFFss3weIF","KsjRKzqH0W","fcwDaCfgr3","prNT6s7Mxk","QWxoT5iGN5","S77LHWDVWJ","W7cTseuZA5","tl72WJJs5m","zbIYYS2Dfu",
+"pFrrlzY1GY","jiVBP5nmWv","jSjS3JkzUn","lj07Qni2v1","fqypy9XyT9","OUYuFpT8wu","lweGyAOgEe","taOXKmX2GE","64s8NBFkb8","LDk6fMojnP",
+"9GXkXAOgEe","1j5L8ZuDtD","L7cGcF6PT2","B3qem0BmCy","3weIFLewvM","brhlQpFrrl","DQimp1v5hH","Mm8siVjCZq","ksJby7lUXZ","yluBxQbxXc",
+"M6qcGMaJQs","0BmCy8cVD3","JRJQB9y4lw","FFDuiaDGtS","qQxHPvLsmS","piJSklXFOB","BCxeCa00b5","RxrsmbZLvS","9rlg90MR5X","5nmWvFLsph",
+"uZPqg7hyVv","lsQGovOqCE","9y4lwAmdQd","vLsmSiqv4k","FcWrWvkCHH","8hJdtmz8gx","RzaZA8xEKz","NhXduQworu","VerEAM6qcG","W7cTsksJby",
+"zFgtBL7cGc","Zv7z0F6PT2","gjUTuD6rBy","2TRI7ni2v1","8hJdtpiJSk","5IhmGiqv4k","piJSkQworu","soy9tFnPFB","1LB1L7fKYU","BCxeCxciqp",
+"dpe1vuQIcz","aez9yBFkb8","o8UydlsQGo","jtn0X8xEKz","RACujFGzgp","rz7UtguMb8","FnPFBtAOsr","0ao3ltuDyS","W7cTsI7p2a","VjCZqni2v1",
+"5ZaEzTwano","m4bxUMojnP","Ul4a18FmFH","2Yz7E9eoRc","jS1ajvOqCE","FjHXRNAFuw","VNCPdblLA9","pT8wuCp3mZ","Yh1hFYw2oU","uQIczvLsmS",
+"IRh48MezSW","uN6r3h1zcH","2DREsJXljW","M6qcG8xEKz","zY1GYRsQUq","Cp3mZ9GXkX","nFqikd85a9","WreyPhi5X7","zHF1qChuy3","QYxC0QWxoT",
+"UlU3MCfgr3","NhXducShY2","cShY2Y1mC0","OUYuFjS1aj","aDGtSDLhzM","i3pydfmIK1","2DREsOz8yZ","Uvlv4zz4ZU","0Wr5yaL6AJ","0ao3lrz7Ut",
+"DcpWBFGzgp","hSSvQ0ao3l","Mm8sipiJSk","580YD64s8N","cL0aEokgRi","AmdQdaDGtS","D6rByBCxeC","o8UydAXpwE","0h1b1Zv7z0","8cVD3pv0i7",
+"lXFOBLewvM","NAFuwU3yw5","5nmWvMmsIo","DcpWBoGu6x","iKqhrEoToP","Kr8ysAkKTk","9iGoTECMvU","lCMxyHP433","k85Aey94nw","lH1ktBCxeC",
+"YjB9t9XyT9","FnPFB4QMc9","okgRizqH0W","QssNCs93Ml","UmaEvydG8U","yToGWFLsph","v1Hlnd85a9","he9IAtjQxs","tAOsr24ARF","rhl0JNOHsz",
+"gIYvESmGzv","DcpWB5VZjS","StlDJ7X3uy","rKDLJ8FmFH","16lHcThjNn","dhSuHW3VFH","55rfBpmeCd","JkzUn5iGN5","bZLvSm4bxU","C2Irc24ARF",
+"MaJQs6AFT0","NAFuwRACuj","1LB1LFxX9q","0MR5Xgf8rI","1LB1LaFFss","4QMc9Q6hMC","MmsIotjQxs","aDGtSgtCA5","7Ow5CEdBKc","NhXduogLgc",
+"zbIYYi3pyd","s7Mxk64s8N","M6qcGtuDyS","0BmCyHP433","6q6L9Twano","Ta8f6x3LDe","1v5hHazIWp","tvdkDCdyBV","XyPZNaDGtS","FxX9qGWqqX",
+"FLsphDG4sT","5iGN5TCgPp","mz8gxgIYvE","5IhmGY1mC0","iKqhrQChxs","kZANm5IhmG","jfREu16lHc","Yh1hFAIYUu","CxVEfQbxXc","xciqpNAFuw",
+"ksJbyKsjRK","0YAGHDG4sT","jeskSO3iyQ","uoStwAIYUu","64s8N5Namm","aL6AJ0Wr5y","MmsIo1v5hH","16lHcFcWrW","m4bxUGrDg7","9XyT9FnPFB",
+"9iGoT618Di","1LB1LcQOnv","zz4ZUy94nw","GWqqXuPX7G","DcpWBTCgPp","Oz8yZCqqaD","e6e4z9iGoT","okgRiRkQke","zqH0WAmdQd","8U2nUpWiOs",
+"ciuWzoGu6x","EdBKcQYxC0","wiHrZReKEW","oGu6xaDGtS","zbIYYi7WMQ","azIWplXFOB","6AFT0SWfou","gdQsSazIWp","FFDuiuTacx","lXFOBqQxHP",
+"CxVEfix74r","2TRI71v5hH","uJScX7lUXZ","AOgEe0Wr5y","16lHc2ZHdk","x3LDelkMUA","zY1GY45cIH","o8UydQYxC0","lkMUAPOUYS","v1HlnyluBx",
+"WaWsvL7cGc","7fKYUlsQGo","dpe1vFFDui","MGlTFIBe8k","2TRI7MmsIo","oVQp6Ss0Zu","TCgPpzHF1q","MmsIoBpYhV","RsQUqVjCZq","oQ87rPYBf4",
+"48cHLgtCA5","0ao3lhE1Ql","RxrsmHRxd8","ydG8UhUTw7","dQ586Mm8si","cmXIXvOqCE","ZUnqtiKqhr","ulk41Rxrsm","m4bxU2ZHdk","VIlwPHlUbF",
+"pT8wuFLsph","lpF6WyofH3","HlUbFWaWsv","fcJOyWaWsv","gdQsSNhXdu","MK07YxXTI4","2ZHdkStlDJ","cmXIXQ6hMC","In3NSZuDtD","v8yFN9y4lw",
+"M3zXLQ6Lix","0MR5XHP433","tlILt4dEz6","tlILtMojnP","zbIYYzbIYY","atef2fcwDa","LbRTHQClRL","mz8gxMaJQs","Q6hMCFcWrW","lweGyDLhzM",
+"580YDuvf7A","CdyBV5nmWv","vOqCEO3iyQ","1j5L8In3NS","GSQwj7Ow5C","FFDuiMmsIo","SbRYyOz8yZ","cQOnvSjskQ","lpF6WprNT6","okgRi8FmFH",
+"ix74rwiHrZ","AkKTk7X3uy","t98iW9iGoT","h1zcHU3yw5","i7WMQKZamH","tAOsrtuDyS","QClRLDLhzM","zz4ZURpBQm","t59lRDQimp","wDajXwDajX",
+"QnJ1SFVMxo","AgJHQv8yFN","guMb8SbRYy","cQOnvBbwgA","zz4ZUbrhlQ","uPX7GfFDrJ","lViBvdQ586","ru4UGMK07Y","jfREuFcWrW","pFrrlQYxC0",
+"K20wKkZANm","FGzgpBGaQY","14FLRSmGzv","8xEKz7lUXZ","S2Dfu7fKYU","Ta8f6Mkgy8","2hEEUFnPFB","2DREsDG4sT","rz7UtpAhR1","YjB9tQClRL",
+"cQOnvcShY2","FNYIMcL0aE","euZA5Cp3mZ","9rlg9gtCA5","2DREsYjB9t","ru4UG7Ow5C","MmKGJIBe8k","t98iWix74r","suY4xqaofN","jfREu29QAz",
+"6AFT0jzUqR","Chuy3WPmlx","In3NSl83Ud","y94nwRBhp0","S2Dfu7X3uy","tjQxssoy9t","DcpWBRkQke","tjQxsNcICA","FLsphTXQ0Z","x3LDeUlU3M",
+"VerEAlH1kt","s93MlFGzgp","VjCZqs4786","2DREsP6bcg","8hJdtblLA9","Pb1paiqv4k","blLA9Nxx9V","Q6hMCZ4I1v","I7p2aCxVEf","tlILtJkzUn",
+"rhl0JFFDui","FGzgp3otm6","C2Irc5Drn0","BGaQYrhl0J","580YDtjQxs","uLtKsHP433","Ss0ZuQ6Lix","tl72WKr8ys","rKDLJzbIYY","ZhwG1lkMUA",
+"nnP8oJIqXi","n1pmOi3pyd","d7vjMZhwG1","B3qemxReec","FNYIMSs0Zu","EdBKc0MR5X","fcJOyWMiS3","pv0i7jeskS","K4GS8Ul4a1","lm0pDVNCPd",
+"iwzGkWaWsv","Waim6W7cTs","gdQsShi5X7","9eoRchYBCK","KZamH5VZjS","Q6Lix0BmCy","VNCPd5nmWv","t59lRl83Ud","bgJAzni2v1","0YAGHjfREu",
+"VBjhztuDyS","s4786Oz8yZ","TXQ0ZAkKTk","tuDySBGaQY","uPX7GuN6r3","29QAzDQimp","aL6AJs7Mxk","QworuKZamH","FNYIMpT8wu","pmeCddjsrv",
+"8cVD38xEKz","MojnPatef2","U3yw5fFDrJ","x3LDeCfgr3","U3yw5iqv4k","gdQsS0Wr5y","yofH3aDGtS","M3zXLJRJQB","AXpwESWfou","MmKGJJJs5m",
+"v2eC3FjHXR","b29RJrhl0J","pWiOsgIYvE","HRxd8WDVWJ","uZPqgHlUbF","NAFuwMm8si","FFDuil83Ud","ZzJHWRsQUq","Ul4a1SWfou","soy9tCIShG",
+"0KyfsYw2oU","CIShG0Kyfs","WMiS3FFDui","suY4x7ku1p","o8UydciuWz","In3NSKr8ys","v1HlnK20wK","LewvMYh1hF","tuDySd7vjM","Nxx9VXflUq",
+"In3NSd7vjM","0YAGH5ZaEz","hE1QlsuY4x","qUJMdSWfou","MmKGJYjB9t","jiVBPv8yFN","hE1QlprNT6","aez9yQ6hMC","pFrrlkB5nP","7X3uye6e4z",
+"rz7UtpFrrl","QnJ1S9y4lw","TwanoRmDcr","Vprf2Uvlv4","lViBv0Wr5y","uoStwQWxoT","zmLYDIBe8k","bZLvSFFDui","wDajX5iGN5","ZzJHWnFqik",
+"B3qemhYBCK","GrDg7YjB9t","uPX7G9eoRc","JJs5mVLTy6","LbRTHOxWIH","blLA9e6e4z","S2DfuRmDcr","nlaBylViBv","ZhwG1C2Irc","0ao3lsuY4x",
+"FwEJz8TxD7","cmXIXhE1Ql","MK07YB3qem","kZANm5nmWv","W3VFHwDajX","uN6r3bZLvS","14FLRIBe8k","M6qcGK4GS8","lpF6WdQ586","uoStwMmsIo",
+"W3VFHsuY4x","QChxspvgjS","d7vjM5Drn0","RACujiKqhr","DLhzMzFgtB","iKqhrZJTXH","IBe8ktAOsr","pFrrl0PktI","o8Uydv2eC3","J2mQiQ6hMC",
+"blLA9zY1GY","55rfB4QMc9","taOXKguMb8","qaofNFxX9q","djsrviwzGk","IBe8k6AFT0","9rlg9VerEA","OHaBz24ARF","YjB9tYjB9t","ogLgc580YD",
+"Ss0ZuLewvM","SjskQnnP8o","OxWIHJIqXi","lH1ktyToGW","Kr8ysChuy3","7X3uyUmaEv","mX2GEB3qem","6q6L97Ow5C","Gv3FqFFDui","uN6r3gjUTu",
+"MK07Yy94nw","ciuWzMmsIo","WaWsvSs0Zu","s93Mlx3LDe","tvdkDECMvU","8FmFHBGaQY","yvOMIjS1aj","lsQGoZuDtD","qQxHP3otm6","VIlwPLbRTH",
+"7fsYMFhtgl","s93MluQIcz","sx5GlwDajX","fqypymz8gx","NcICAOxWIH","zHF1qcL0aE","yluBxkB5nP","djsrvrz7Ut","jS1ajs7Mxk","uN6r30PktI",
+"t98iWQWxoT","sx5Glfqypy","rz7Uto8Uyd","CK5W7suY4x","dQ586Z4I1v","JIqXijzUqR","45cIHTCgPp","FcWrW0MR5X","v2eC3hUTw7","pAhR1Yw2oU",
+"HRxd8QClRL","QChxslweGy","BFkb8MK07Y","o8UydsqVrf","55rfB2DREs","X6Pin8TxD7","JJs5mWreyP","48cHLIKxdL","RACujqQxHP","s93MlTa8f6",
+"FxX9qksJby","WmadAhSSvQ","fcwDadQ586","brhlQ07n1c","YOfrYtuDyS","SjskQl83Ud","lm0pD618Di","ksJbyDQimp","SWfouZUnqt","fmIK1ZUnqt",
+"hYBCKzHF1q","Chuy3pmeCd","hSSvQiqv4k","WaWsvmX2GE","4W0TlJIqXi","ZzJHWcQOnv","9GXkXWaim6","9iGoT1v5hH","Q6Lix3otm6","G1RhSDQimp",
+"7lUXZVIlwP","iB08lThjNn","VjCZq9iGoT","Cfgr3lViBv","MojnPv2eC3","SbRYyFGzgp","WreyP8cVD3","DQimpfcJOy","ZuDtDOUYuF","Fhtglxciqp",
+"pmeCdcmXIX","3otm6k85Ae","uAWypXflUq","2ZHdkyToGW","PYBf4sx5Gl","C2IrcTCgPp","nFqikydG8U","lsQGohi5X7","K4GS8JIqXi","In3NSuTacx",
+"7fKYUAgJHQ","lCMxyFPfSE","S2DfunnP8o","S77LHFNYIM","KASQ8WDVWJ","5drc6AgJHQ","JIqXipAhR1","CIShGjtn0X","0h1b1uN6r3","580YDrz7Ut",
+"45cIHsoy9t","14FLRRkQke","tvdkDGWqqX","16lHcM3zXL","VNCPdPYBf4","VBjhzFLsph","d85a9WmadA","2Nslm1j5L8","i3pydECMvU","prNT6KsjRK",
+"NAFuwFVMxo","HP433SjskQ","BFkb8euZA5","9rlg9ru4UG","9rlg9gjUTu","RkQken8pJ9","dpe1vSWfou","MmsIoy94nw","s93MlBCxeC","FNYIMDQimp",
+"ZUnqt3weIF","2hEEUlpF6W","QYxC0BCxeC","SmGzvDz1R3","F6PT2hi5X7","9y4lwTwano","64s8NNxx9V","3weIFpAhR1","RxrsmCqqaD","X6PinL7cGc",
+"4W0TlIn3NS","XyPZNrhl0J","0BmCypvgjS","14FLR5ZaEz","aL6AJpFrrl","blLA9uZPqg","FhtgloQ87r","bgJAzuupzk","S2DfuEoToP","yvOMIQWxoT",
+"hSSvQv8yFN","WaWsvv1Hln","NhXdu9y4lw","fFDrJXyPZN","Q6LixC2Irc","pWiOsdmoS7","ix74rFhtgl","DcpWBuJScX","lViBvVIlwP","b29RJIjTwP",
+"HRxd80h1b1","TCgPpuJScX","rhl0JHP433","JXljWQnJ1S","OxWIH45cIH","AOgEeLbRTH","lH1kttlILt","2Yz7EBCxeC","NhXdu07n1c","vOqCEyluBx",
+"azIWpECMvU","GrDg7X6Pin","d85a9uoStw","StlDJUlU3M","VIlwPMK07Y","24ARFpT8wu","5Mg9ryToGW","8RCUAVNCPd","JKWYR0YAGH","zY1GYkZANm",
+"QnJ1S7hyVv","VerEAksJby","QChxsIRh48","NhXduo8Uyd","RmDcrtuDyS","0h1b1FVMxo","FFDuidmoS7","Qworu8TxD7","jS1ajaez9y","mz8gxs4786",
+"4W0TluLtKs","n1pmOPb1pa","WMiS3SbRYy","GWqqXRsQUq","SWfoub29RJ","i3pydulk41","5drc65Namm","AIYUuzz4ZU","gIYvETa8f6","jiVBPCp3mZ",
+"G1RhSRBhp0","OHaBz2DREs","VIlwPdQ586","WMiS3tjQxs","5NammtAOsr","NcICAru4UG","QbxXcd85a9","tlILtRxrsm","iB08lsuY4x","1v5hHF6PT2",
+"RmDcrY1mC0","zz4ZUTa8f6","0PktIlj07Q","HP433HzZT8","yvOMI7lUXZ","EdBKcgjUTu","FLsphMGlTF","FNYIMC2Irc","h1zcHRzaZA","l83UdFVMxo",
+"t98iWiqv4k","pv0i7s7Mxk","0BmCyNhXdu","lj07QAOgEe","8xEKzCIShG","BGaQYjSjS3","G1RhS7Ow5C","5VZjSl83Ud","zHF1qNxx9V","AgJHQ0Kyfs",
+"GWqqXxXTI4","lXFOBNo0Qb","K4GS8i7WMQ","S2DfuOz8yZ","pvgjSk85Ae","uQIcz0BmCy","29QAzbZLvS","GSQwjOUYuF","FFDuiRkQke","ni2v1D6rBy",
+"OUYuFJkzUn","1j5L8ix74r","hE1QlMmsIo","QClRL9iGoT","hSSvQUl4a1","zmLYD2hEEU","vLsmSLbRTH","uN6r3aez9y","Fhtgllj07Q","IjTwPZzJHW",
+"wiHrZlViBv","JKWYRfaHir","S77LH5Mg9r","xXTI4gjUTu","tlILt4QMc9","DcpWBZUnqt","rhl0JpiJSk","AkKTkrKDLJ","brhlQfaHir","CxVEffqypy",
+"azIWph1zcH","I7p2aVLTy6","VLTy6v2eC3","SbRYyhe9IA","atef2NcICA","hUTw7ni2v1","h1zcHokgRi","SbRYyNo0Qb","cmXIX3weIF","DLhzM5Mg9r",
+"0Kyfss93Ml","07n1cxciqp","Cfgr3AIYUu","IjTwPTwano","AmdQdQWxoT","djsrvk85Ae","uLtKspWiOs","Q6Lix4dEz6","UmaEvMGlTF","lH1ktD6rBy",
+"HlUbFOHaBz","QYxC0faHir","5drc60Wr5y","o8UydqaofN","jiVBP0ao3l","580YDJkzUn","S2Dfu0YAGH","KsjRKsuY4x","BGaQYfaHir","JkzUn0ao3l",
+"NcICA9iGoT","JkzUnYh1hF","zFgtBlweGy","14FLRazIWp","FhtglI7p2a","nnP8oRACuj","SWfou0BmCy","AgJHQlsQGo","BpYhVd85a9","JkzUnOUqFM",
+"ydG8UzFgtB","QnJ1S4W0Tl","UlU3MgdQsS","oGu6xFPfSE","mX2GEIBe8k","JkzUnpv0i7","Uvlv4Y1mC0","BFkb8WMiS3","9eoRcWMiS3","5Mg9rsuY4x",
+"atef2IKxdL","EoToPDcpWB","AIYUuGXdoH","s93MlO3iyQ","HfyNQMkgy8","t98iW5nmWv","LewvMgIYvE","uPX7GVjCZq","Yh1hFU3yw5","nlaByOHaBz",
+"ix74r9XyT9","iB08ld7vjM","9GXkXzY1GY","s93MlyvOMI","RsQUqRpBQm","gIYvEGrDg7","nFqikNo0Qb","LbRTHYf2Ec","0ao3lUl4a1","CxVEfs4786",
+"8U2nUix74r","29QAzgdQsS","AmdQdkB5nP","5VZjSjtn0X","AOgEesoy9t","5nmWvlCMxy","fFDrJhSSvQ","Z4I1vmX2GE","TwanojS1aj","cShY2TCgPp",
+"ni2v1FnPFB","In3NSpmeCd","prNT6Q6Lix","16lHc48cHL","suY4xs4786","kZANmuN6r3","v8yFNksJby","TCgPp618Di","In3NSi3pyd","StlDJ2DREs",
+"2NslmBGaQY","ulk41vOqCE","jzUqRgdQsS","RBhp0XyPZN","OHaBz45cIH","jiVBP8RCUA","aDGtSx3LDe","07n1c5drc6","tl72Wzz4ZU","rz7UtsqVrf",
+"iB08lOz8yZ","7hyVv0BmCy","SWfou48cHL","vkCHHNo0Qb","FVMxoVBjhz","cmXIX16lHc","JXljWFPfSE","C2Ircy94nw","UmaEv8hJdt","pmeCdCqqaD",
+"2TRI78FmFH","Mm8siCfgr3","0ao3llm0pD","5VZjSzz4ZU","ix74rQ6hMC","l83UdqaofN","FFDuihSSvQ","9GXkXciuWz","tvdkDzbIYY","lsQGoFNYIM",
+"DLhzM5IhmG","dmoS7uLtKs","k85AeBbwgA","n8pJ9WDVWJ","lCMxyuPX7G","7X3uySjskQ","s7Mxk8U2nU","sx5Glgf8rI","fcwDaazIWp","1LB1LG1RhS",
+"lm0pDFnPFB","5Nammm4bxU","VIlwPbZLvS","2TRI7CIShG","5Namm16lHc","zz4ZU7Ow5C","fFDrJFxX9q","FFDuiECMvU","aDGtSI7p2a","3otm6VLTy6",
+"ThjNnChuy3","aL6AJ14FLR","lkMUApmeCd","uTacxvLsmS","Ul4a1DLhzM","0ao3lP6bcg","Ss0Zu55rfB","Q6hMC7fKYU","pT8wucShY2","n8pJ9StlDJ",
+"GXdoHyEfy9","0KyfsjSjS3","oVQp6YjB9t","xXTI4EOE1o","vkCHHuN6r3","uTacxkB5nP","s7MxkzmLYD","GWqqXS77LH","VNCPdECMvU","QnJ1SBCxeC",
+"9iGoTW7cTs","GSQwjs93Ml","iwzGkQ6hMC","RzaZAyvOMI","0Kyfse6e4z","DG4sTWmadA","uPX7GRkQke","FFDuiHRxd8","vLsmSiwzGk","vOqCEv8yFN",
+"nlaByQChxs","gtCA5Gv3Fq","vLsmSdQ586","VIlwPRxrsm","2NslmM6qcG","QssNCd7vjM","ZJTXHcQOnv","7ku1pQssNC","45cIHRBhp0","bZLvSJXljW",
+"JKWYRXyPZN","oVQp6FVMxo","FVMxoYh1hF","NAFuwECMvU","VerEAgdQsS","v1HlniB08l","BCxeCoVQp6","vkCHHv2eC3","cShY2VIlwP","RACuj8TxD7",
+"xXTI4XflUq","lCMxyvkCHH","EOE1oru4UG","tAOsr9y4lw","XyPZNru4UG","yToGWX6Pin","WMiS3yluBx","Uvlv4vOqCE","vLsmSix74r","AXpwEhe9IA",
+"7hyVv0Kyfs","IjTwPK4GS8","JIqXit59lR","In3NS4dEz6","WDVWJ5nmWv","lm0pDNxx9V","ix74rFFDui","iwzGktAOsr","0h1b1nFqik","LDk6fgdQsS",
+"Cfgr3prNT6","QWxoT0PktI","dQ5868xEKz","FnPFBWDVWJ","07n1cuoStw","JkzUnkZANm","2Yz7EvkCHH","WPmlxFhtgl","yofH3aez9y","iqv4kksJby",
+"AgJHQCNHmv","bZLvS9iGoT","gIYvEru4UG","IjTwPRzaZA","AIYUucL0aE","KsjRKCxVEf","JXljWY1mC0","BGaQYECMvU","0YAGH48cHL","nnP8ov8yFN",
+"WmadAlCMxy","D6rByUmaEv","OUqFMO3iyQ","MK07YDLhzM","WDVWJ8U2nU","WreyPUvlv4","Vprf2lpF6W","UmaEvBbwgA","gdQsSIjTwP","CNHmvyToGW",
+"s4786uvf7A","fmIK1d85a9","ydG8U0h1b1","F6PT2CxVEf","RkQkeCNHmv","ECMvUFnPFB","Nxx9Vxciqp","618DitaOXK","RkQkeaDGtS","4dEz6uN6r3",
+"0BmCyRpBQm","gjUTuuN6r3","i7WMQcShY2","J2mQiSjskQ","hYBCKJkzUn","lpF6WlXFOB","6AFT064s8N","Vprf2qQxHP","5Drn0VjCZq","16lHcCfgr3",
+"fmIK1iB08l","0PktIfcJOy","lXFOBuTacx","Pb1paOxWIH","d85a9cShY2","16lHcSs0Zu","DcpWBBFkb8","7X3uy3weIF","e6e4zM6qcG","jfREuaez9y",
+"DG4sTjSjS3","5Drn0EdBKc","9eoRcQ6Lix","ksJbyGSQwj","s93Ml07n1c","45cIH6AFT0","lXFOBMm8si","dhSuHRpBQm","rhl0JGrDg7","MGlTFn8pJ9",
+"8RCUA0ao3l","cShY23weIF","CdyBVFNYIM","FhtglYh1hF","lweGyydG8U","s93MlHzZT8","lkMUAs4786","M3zXLcmXIX","1j5L8U3yw5","piJSkWDVWJ",
+"K4GS8d7vjM","HzZT8mX2GE","G1RhSrz7Ut","zY1GYIRh48","FPfSERxrsm","S77LHK4GS8","AgJHQbrhlQ","7ku1pmX2GE","5ZaEzpT8wu","LbRTHhYBCK",
+"fLNg8ECMvU","FwEJzokgRi","MGlTFblLA9","Q6hMCnlaBy","ydG8UnnP8o","GXdoHn8pJ9","OHaBzMm8si","FPfSE7fsYM","pAhR1B3qem","d7vjMhSSvQ",
+"oVQp60YAGH","cL0aEgf8rI","VjCZqRpBQm","48cHLyToGW","Vprf2FGzgp","ni2v1WDVWJ","5Nammaez9y","AXpwECp3mZ","rKDLJdQ586","9rlg98xEKz",
+"FwEJzTwano","POUYS3weIF","MmKGJFPfSE","zbIYYFjHXR","MK07YtaOXK","suY4xS77LH","WPmlxkZANm","Ss0ZuRpBQm","JXljWX6Pin","ECMvU2DREs",
+"9XyT9s4786","gtCA5FNYIM","dmoS755rfB","yToGWCfgr3","QClRLThjNn","OHaBzlpF6W","NAFuwgtCA5","CK5W7iqv4k","QChxszmLYD","zFgtBtjQxs",
+"FVMxoAkKTk","M3zXLx3LDe","DLhzMyvOMI","uvf7AD6rBy","Uvlv4nlaBy","L7cGcuLtKs","rz7Uttl72W","ogLgcaFFss","WPmlxaez9y","cQOnv0MR5X",
+"NOHszoQ87r","ReKEWX6Pin","XyPZN1j5L8","n1pmOqQxHP","v2eC3gjUTu","7Ow5CBpYhV","24ARFQ6Lix","Gv3Fq8RCUA","zQt6QRBhp0","s7MxkgjUTu",
+"i3pyd7X3uy","16lHcsx5Gl","oGu6xbZLvS","uoStwMkgy8","BFkb8BpYhV","DG4sTBCxeC","8FmFHv8yFN","0Kyfsk85Ae","euZA5zFgtB","fLNg8uvf7A",
+"Q6LixlkMUA","RmDcrzHF1q","NAFuwqQxHP","n1pmOiqv4k","FjHXRReKEW","W7cTsyEfy9","NhXduXflUq","qUJMdcL0aE","nlaByGXdoH","rz7UtgtCA5",
+"d7vjMYw2oU","lpF6WhSSvQ","sx5GlRkQke","a00b5zbIYY","y94nwMm8si","v1HlnfLNg8","0YAGHW7cTs","ni2v1S77LH","taOXKuLtKs","I7p2aTXQ0Z",
+"UmaEvuZPqg","WDVWJlH1kt","aez9yNcICA","pAhR1HP433","fmIK1yluBx","Cp3mZvkCHH","S2DfuSjskQ","uLtKsNxx9V","lViBvCNHmv","hYBCK5Namm",
+"iwzGkSs0Zu","VBjhzyvOMI","X6PinSbRYy","v8yFNYh1hF","fcJOy5nmWv","BCxeCD6rBy","lCMxyrz7Ut","rhl0JdmoS7","b29RJlpF6W","29QAzXflUq",
+"TXQ0Z6AFT0","55rfBfmIK1","8cVD316lHc","In3NStl72W","s93Mls93Ml","MojnPcShY2","sx5Gl4QMc9","5IhmGWDVWJ","K20wKvLsmS","K4GS8n1pmO",
+"FGzgpVNCPd","oGu6xWmadA","lH1ktuLtKs","Y1mC05ZaEz","v8yFNCNHmv","YjB9tQnJ1S","2Nslm0Kyfs","uPX7GJJs5m","uTacxNAFuw","7Ow5CX6Pin",
+"xciqpnlaBy","AXpwEW3VFH","0Wr5yGSQwj","618Di5IhmG","gjUTue6e4z","29QAzQ6Lix","v2eC3RACuj","Dz1R3SbRYy","WmadAiB08l","45cIHt59lR",
+"2NslmBbwgA","dQ586zbIYY","e6e4zFPfSE","Mm8sidmoS7","FcWrWBpYhV","lweGys7Mxk","s4786hYBCK","45cIH9iGoT","a00b5VLTy6","YOfrYzFgtB",
+"5drc6sx5Gl","aez9y2hEEU","8U2nUOxWIH","KsjRKQChxs","580YDgtCA5","lXFOBCNHmv","Ul4a1zQt6Q","QChxsIKxdL","7lUXZi3pyd","oQ87rtAOsr",
+"v2eC36q6L9","yofH3Mkgy8","suY4x07n1c","OUqFMt59lR","3weIFSs0Zu","cQOnvQYxC0","0BmCytuDyS","D6rBytuDyS","uLtKsKsjRK","aDGtSYjB9t",
+"RkQkegdQsS","he9IA5ZaEz","RBhp0cQOnv","Pb1paNcICA","HfyNQHlUbF","v8yFNFGzgp","GWqqXgtCA5","8TxD7FPfSE","faHirzbIYY","0Wr5yiwzGk",
+"0h1b1PYBf4","07n1csqVrf","5iGN5t98iW","hE1Ql2ZHdk","2Yz7EZJTXH","FNYIMhi5X7","zFgtBksJby","QYxC0QssNC","2DREs7lUXZ","pT8wuYh1hF",
+"7ku1pd85a9","0MR5XyvOMI","IBe8k07n1c","580YDGXdoH","qQxHPY1mC0","FVMxoQ6hMC","blLA9Yw2oU","QChxsGWqqX","BGaQYnFqik","euZA5NcICA",
+"VerEAtAOsr","fqypyPYBf4","uupzkWMiS3","s93Ml9iGoT","brhlQhE1Ql","6AFT0LbRTH","pT8wu8xEKz","aez9ycL0aE","GrDg7iB08l","cQOnvRsQUq",
+"s4786NAFuw","fFDrJfaHir","8xEKzQssNC","GWqqXHzZT8","Pb1parz7Ut","WreyPRpBQm","MojnPi7WMQ","NcICAW7cTs","ksJbyOUqFM","h1zcHVLTy6",
+"StlDJ45cIH","cQOnvi3pyd","MezSWjzUqR","2DREsRsQUq","atef2G1RhS","DQimpLewvM","lweGyFjHXR","Cfgr3dmoS7","8RCUAQYxC0","gjUTuFnPFB",
+"WreyP9iGoT","lj07QTa8f6","VNCPdVprf2","DG4sTtvdkD","iqv4kni2v1","v2eC30h1b1","UlU3MuN6r3","BGaQY14FLR","tvdkD1v5hH","Qworu6q6L9",
+"BFkb8pWiOs","K4GS8gIYvE","KZamHiwzGk","tjQxsFLsph","wDajX7fKYU","euZA5QChxs","gIYvEAIYUu","y94nwjS1aj","JJs5mlm0pD","5IhmGFjHXR",
+"HRxd89XyT9","FLsphHzZT8","WaWsv9eoRc","ZJTXHFhtgl","GrDg7Ul4a1","S2DfuBpYhV","tjQxs618Di","prNT6fmIK1","euZA5zmLYD","MojnPdQ586",
+"MK07YKr8ys","MmsIopmeCd","OxWIHpvgjS","i3pydFFDui","I7p2aLDk6f","s93MlUl4a1","2hEEUkB5nP","DLhzM8cVD3","CNHmvuLtKs","EOE1oaDGtS",
+"faHirSs0Zu","jSjS3Q6Lix","OxWIHpT8wu","lkMUAUmaEv","UlU3MxReec","prNT6s4786","fLNg87fsYM","LDk6fdQ586","FVMxoXyPZN","i7WMQgjUTu",
+"FnPFBZ4I1v","0h1b1bgJAz","djsrvGWqqX","9eoRcoQ87r","Zv7z0X6Pin","RACujIRh48","Kr8ysAIYUu","uvf7A4dEz6","CxVEfsx5Gl","cShY2zHF1q",
+"BCxeCfcJOy","FjHXRFFDui","AXpwEPb1pa","Y1mC0ECMvU","W7cTshUTw7","StlDJ5Drn0","tvdkD5iGN5","kZANmuZPqg","TCgPpUvlv4","9GXkX48cHL",
+"0Kyfsulk41","NOHsz2Nslm","QworuMmKGJ","BbwgAAIYUu","ZzJHWMmsIo","7X3uylViBv","cQOnv64s8N","DG4sTd7vjM","b29RJOz8yZ","OUqFMIBe8k",
+"F6PT2WPmlx","s4786UmaEv","QClRLSmGzv","t59lRAkKTk","QssNCWaWsv","tlILtuTacx","LewvM3otm6","O3iyQx3LDe","dQ586O3iyQ","i7WMQsx5Gl",
+"0KyfsS77LH","FNYIMFNYIM","ZzJHWVprf2","pFrrlTwano","d7vjMpT8wu","uAWyps93Ml","uQIczlpF6W","ru4UGogLgc","Ta8f6xXTI4","i3pydtl72W",
+"lkMUABbwgA","MmKGJ8RCUA","rKDLJrz7Ut","NAFuwKZamH","No0QbblLA9","WDVWJru4UG","2hEEUIn3NS","fmIK1Zv7z0","StlDJBbwgA","pv0i7DQimp",
+"ZuDtDGWqqX","VerEAZUnqt","zmLYDNcICA","uupzkiKqhr","pAhR1UmaEv","RBhp0dmoS7","gf8rIVerEA","7Ow5CVBjhz","8RCUAoGu6x","Ss0Zuaez9y",
+"X6PinThjNn","WMiS31v5hH","7Ow5CFjHXR","M6qcG3otm6","NhXduGWqqX","FFDui2DREs","SWfouVLTy6","AOgEe14FLR","RzaZAMkgy8","No0QblkMUA",
+"atef2rz7Ut","W7cTs1j5L8","gf8rI2Yz7E","8TxD7VerEA","Dz1R3Ta8f6","3weIFzqH0W","DLhzMuupzk","dhSuHKZamH","AXpwEWaWsv","618DiSWfou",
+"0Wr5yMK07Y","29QAzrhl0J","Zv7z0uoStw","7Ow5CsqVrf","uAWyplsQGo","soy9tFVMxo","AgJHQtaOXK","okgRipv0i7","WMiS3X6Pin","IjTwPgf8rI",
+"oVQp6uAWyp","rhl0JpmeCd","9GXkXgjUTu","FLsphxReec","jeskSgtCA5","UlU3MFwEJz","ReKEWNxx9V","CIShG2TRI7","ulk41l83Ud","RACujlsQGo",
+"gf8rIS2Dfu","LDk6f9XyT9","i7WMQv2eC3","i3pydy94nw","M6qcGHfyNQ","Rxrsmgf8rI","TXQ0Zatef2","9y4lwiwzGk","48cHLuoStw","55rfBt98iW",
+"hi5X7YOfrY","9iGoTYjB9t","t98iWzz4ZU","nlaBye6e4z","xciqpHP433","EdBKcsx5Gl","9eoRc1LB1L","Q6hMCF6PT2","CxVEfZhwG1","QChxsChuy3",
+"iwzGkOz8yZ","OHaBzUvlv4","GWqqX5nmWv","JkzUnXyPZN","9XyT9FFDui","hUTw7Twano","wiHrZEoToP","618DiECMvU","0ao3lD6rBy","jtn0XGv3Fq",
+"t98iW9GXkX","HzZT8uAWyp","580YDZJTXH","fqypyiqv4k","Oz8yZsoy9t","yofH3t98iW","MGlTFpFrrl","5Namms4786","ksJbyuJScX","v2eC3lj07Q",
+"BCxeCUlU3M","KZamHfcJOy","SmGzvnnP8o","t98iW2Yz7E","uN6r3ni2v1","WMiS3W7cTs","7ku1p9iGoT","pmeCdECMvU","OHaBzMGlTF","29QAzcQOnv",
+"v2eC3jtn0X","ydG8U45cIH","d7vjMSmGzv","M6qcGydG8U","Kr8ys6q6L9","WMiS3lCMxy","ru4UG4dEz6","8FmFHQWxoT","POUYSlm0pD","Yh1hFQ6hMC",
+"x3LDeyofH3","P6bcgQssNC","3otm68cVD3","JRJQBdmoS7","45cIHZ4I1v","KZamH07n1c","5iGN59XyT9","ni2v1CqqaD","HlUbFTa8f6","n1pmOFnPFB",
+"Yh1hF0YAGH","AgJHQvkCHH","5iGN5gtCA5","B3qempvgjS","Zv7z0CK5W7","0MR5X4dEz6","fqypyFhtgl","xciqp8TxD7","WDVWJJXljW","v8yFNuN6r3",
+"AOgEeAmdQd","AkKTkiKqhr","s7MxkRBhp0","WmadABGaQY","TCgPpZJTXH","m4bxU8FmFH","azIWppAhR1","yluBxa00b5","lpF6WuZPqg","OUYuFHlUbF",
+"ECMvUFwEJz","uZPqggIYvE","Gv3FqK20wK","FjHXRZv7z0","6AFT0lkMUA","07n1c8hJdt","lXFOB4QMc9","djsrvHlUbF","atef2y94nw","FNYIM1v5hH",
+"O3iyQni2v1","9y4lwuPX7G","jtn0XRACuj","uTacxsqVrf","W3VFHcL0aE","l83UdVIlwP","y94nwBFkb8","lkMUAn1pmO","FLsphNAFuw","x3LDe0Wr5y",
+"hi5X7uTacx","y94nwt98iW","kB5nPt59lR","9eoRcdpe1v","jSjS3JRJQB","8U2nURzaZA","JJs5mRzaZA","lsQGoMmKGJ","2TRI7gIYvE","ZuDtDCNHmv",
+"0BmCyWaWsv","RBhp09rlg9","2DREs5nmWv","nFqikrhl0J","S2DfuciuWz","fqypyVNCPd","Ul4a1fcwDa","zHF1qzY1GY","ReKEWgdQsS","hUTw7S2Dfu",
+"G1RhSXflUq","14FLRlsQGo","atef2wiHrZ","MezSWjiVBP","euZA5o8Uyd","8RCUAAIYUu","7ku1pRACuj","VBjhz2DREs","lj07QX6Pin","dhSuH5Mg9r",
+"gf8rITXQ0Z","NcICAt59lR","dQ58616lHc","Gv3FqUmaEv","HzZT8pT8wu","Y1mC0sqVrf","hSSvQNhXdu","Mkgy8t59lR","sqVrfzz4ZU","1v5hH580YD",
+"gdQsS1j5L8","iKqhrhSSvQ","AXpwEP6bcg","2NslmWPmlx","piJSk0PktI","WaWsvAgJHQ","iKqhrO3iyQ","QYxC0ix74r","WDVWJ9y4lw","Zv7z0bgJAz",
+"Yw2oUlCMxy","9XyT9jSjS3","No0QbXyPZN","lCMxyhSSvQ","zY1GYIjTwP","prNT6he9IA","48cHLv2eC3","aez9yAXpwE","P6bcgDz1R3","FFDuimz8gx",
+"8cVD3F6PT2","AmdQdatef2","ZJTXHPYBf4","aL6AJpWiOs","QbxXcUvlv4","NOHszs4786","KsjRK8hJdt","0h1b18U2nU","HlUbFAOgEe","okgRiFhtgl",
+"t98iWHlUbF","SjskQaez9y","zbIYYpmeCd","JKWYR5Namm","faHirW3VFH","tlILtTCgPp","0YAGHhSSvQ","azIWpQ6hMC","o8UydaL6AJ","iB08ljfREu",
+"s93MlWmadA","FFDuiTXQ0Z","uupzkIRh48","2ZHdkYjB9t","64s8NQ6hMC","zHF1qSbRYy","14FLRKsjRK","B3qemF6PT2","NAFuw29QAz","POUYSPYBf4",
+"lXFOBlkMUA","Dz1R34W0Tl","RzaZAvkCHH","fFDrJyluBx","bZLvSIBe8k","HRxd85Mg9r","8U2nUlpF6W","suY4xl83Ud","CxVEfHlUbF","0KyfsAIYUu",
+"0PktIjeskS","0MR5XVerEA","o8UydfaHir","ulk41ni2v1","2NslmlViBv","Nxx9VpWiOs","16lHcGXdoH","Dz1R3e6e4z","lViBvaez9y","lkMUAuAWyp",
+"sqVrfMGlTF","k85Ae1v5hH","U3yw5Ta8f6","DG4sTJJs5m","In3NSzbIYY","pv0i7iB08l","LDk6fokgRi","IRh48RACuj","LbRTHlViBv","CIShGbrhlQ",
+"48cHL8hJdt","BbwgAQnJ1S","ix74rJJs5m","07n1ctAOsr","S77LHvkCHH","OHaBzBCxeC","M3zXLKZamH","ix74ruQIcz","ZhwG1BCxeC","QbxXcWDVWJ",
+"FxX9qAIYUu","Q6LixDG4sT","UlU3MNhXdu","nlaBy3weIF","LbRTH8cVD3","S77LHWPmlx","JXljWZzJHW","fcJOyuQIcz","uN6r3oQ87r","ZhwG1In3NS",
+"iqv4kS77LH","hYBCKtl72W","S77LHpWiOs","o8Uyd8hJdt","8xEKzblLA9","sqVrfhe9IA","uLtKss4786","yToGWdjsrv","rz7UtCp3mZ","zY1GY9y4lw",
+"MojnPpT8wu","I7p2agdQsS","IKxdLprNT6","7fKYU64s8N","zz4ZUtl72W","zbIYYnFqik","8FmFHChuy3","7fsYMv8yFN","gdQsSAOgEe","Mm8siIRh48",
+"5Mg9rCqqaD","MK07Y1LB1L","5iGN5BbwgA","IKxdLC2Irc","lH1ktNxx9V","JIqXiy94nw","B3qems93Ml","RACujQClRL","gIYvEQworu","o8Uyd0Wr5y",
+"Chuy32Yz7E","v8yFNBFkb8","uAWypFhtgl","JJs5mwiHrZ","8RCUAtuDyS","M6qcGBpYhV","k85Ae4W0Tl","8hJdtD6rBy","v2eC3Chuy3","ru4UGUlU3M",
+"HlUbFhUTw7","9GXkXRxrsm","fLNg8Yh1hF","VerEAlj07Q","GWqqXIKxdL","v1HlnFcWrW","Ta8f6Kr8ys","y94nw7fKYU","HP433lsQGo","Chuy39GXkX",
+"hUTw7TXQ0Z","euZA5cQOnv","soy9tZJTXH","lXFOBzqH0W","7hyVvpiJSk","D6rBy2ZHdk","oQ87rJIqXi","QClRLn8pJ9","aDGtSLDk6f","nnP8oDQimp",
+"HlUbFxciqp","VNCPdFwEJz","8hJdtFGzgp","zqH0Wzz4ZU","hi5X7EOE1o","he9IAgdQsS","qaofNPb1pa","Yw2oUfFDrJ","pv0i7uPX7G","Ss0ZuKASQ8",
+"Cp3mZb29RJ","VBjhzMojnP","MmsIoWaim6","0BmCyG1RhS","soy9tW7cTs","8FmFHNcICA","JXljWQClRL","FhtglaL6AJ","POUYS6q6L9","ZJTXHrKDLJ",
+"POUYSnFqik","IBe8kAgJHQ","W3VFHlm0pD","RkQkeWmadA","WPmlxCdyBV","KASQ8n1pmO","CdyBVXflUq","lj07QCK5W7","Cp3mZaez9y","7fsYMjiVBP",
+"ZuDtDRpBQm","14FLR3otm6","KZamH6AFT0","Mkgy8Mm8si","MmsIoGSQwj","Q6hMCv2eC3","LewvMQ6hMC","uQIcz2Nslm","fcJOyJJs5m","blLA9kB5nP",
+"piJSkv8yFN","tl72WQssNC","fqypyzY1GY","uvf7AAmdQd","NAFuwKr8ys","tvdkDrKDLJ","vkCHH14FLR","QworuFjHXR","lweGy29QAz","JJs5mCxVEf",
+"zFgtBb29RJ","TCgPppFrrl","uQIczX6Pin","QChxsAgJHQ","faHiruPX7G","WPmlxGrDg7","mX2GEcmXIX","2TRI7lweGy","FPfSEtvdkD","9XyT9VerEA",
+"jS1ajTXQ0Z","0ao3lVjCZq","faHira00b5","ZJTXHSjskQ","lH1ktnlaBy","MaJQs2DREs","OHaBzW7cTs","5drc6n8pJ9","JJs5mFVMxo","wiHrZRkQke",
+"XflUqJkzUn","9GXkXQbxXc","7fKYUcShY2","In3NShUTw7","Q6LixyvOMI","MezSWfLNg8","pT8wufmIK1","uJScXiqv4k","lH1ktQnJ1S","d85a9zqH0W",
+"aDGtSNcICA","fLNg8FwEJz","MojnPFLsph","5Drn0EoToP","FnPFB0MR5X","FNYIMK20wK","NhXduzY1GY","9rlg95nmWv","5IhmGvkCHH","uZPqgTCgPp",
+"618DiY1mC0","y94nwIn3NS","L7cGclpF6W","aL6AJ2hEEU","In3NSCp3mZ","2TRI7euZA5","M6qcGGSQwj","qQxHPP6bcg","OHaBzFjHXR","o8Uydtl72W",
+"BFkb8tuDyS","a00b5FNYIM","K20wKTwano","QbxXclH1kt","QChxsW7cTs","RmDcrFPfSE","MaJQspv0i7","jtn0Xlj07Q","MmsIoAkKTk","4W0TlCK5W7",
+"AIYUuRmDcr","RsQUqBGaQY","K4GS8uAWyp","Dz1R3pv0i7","QClRLLewvM","0Wr5yEdBKc","KZamH7X3uy","S2Dfu2DREs","xXTI4fLNg8","DLhzMNhXdu",
+"WreyPxXTI4","TCgPpv1Hln","Uvlv42ZHdk","yvOMIWmadA","ciuWzRmDcr","IKxdLU3yw5","FhtglNcICA","No0QbOHaBz","2TRI7uQIcz","djsrvJKWYR",
+"QssNCBCxeC","faHir7fKYU","d7vjMn1pmO","Oz8yZ2Nslm","7fKYUStlDJ","7ku1ppWiOs","i3pydvkCHH","ZJTXHCqqaD","2hEEU0BmCy","MezSWiwzGk",
+"AIYUu5iGN5","rhl0Jx3LDe","a00b5StlDJ","W7cTsnFqik","uupzk55rfB","t59lRuupzk","kB5nP48cHL","s93MlWDVWJ","0BmCy48cHL","djsrvhYBCK",
+"uZPqgdpe1v","NcICA5IhmG","gf8rIQssNC","QworuVjCZq","vOqCEZv7z0","iqv4kjiVBP","4dEz6Q6hMC","8hJdt1j5L8","rhl0JDG4sT","jzUqRdpe1v",
+"uoStw5VZjS","2hEEULDk6f","Z4I1v0h1b1","aL6AJReKEW","EOE1oeuZA5","BGaQYpWiOs","fcJOylCMxy","5NammgtCA5","AOgEeQChxs","o8UydlXFOB",
+"WreyPiwzGk","hYBCKS77LH","KASQ8rhl0J","aFFss9y4lw","14FLRjfREu","7hyVvVLTy6","gjUTulViBv","uTacxyEfy9","JJs5m64s8N","HfyNQEdBKc",
+"FxX9qx3LDe","Twano9rlg9","h1zcHaez9y","nFqikqQxHP","SWfouPb1pa","l83UdIjTwP","zqH0Wuvf7A","MaJQs45cIH","5Mg9rqUJMd","CIShGaL6AJ",
+"29QAzJRJQB","QYxC00MR5X","rKDLJ4dEz6","ni2v1Gv3Fq","SmGzvwiHrZ","Yh1hFM3zXL","2ZHdkuoStw","TCgPphE1Ql","lViBv9XyT9","ogLgcmX2GE",
+"QworuF6PT2","0PktIfLNg8","XflUqW3VFH","CIShG618Di","HP433EoToP","CK5W7d85a9","zmLYDQWxoT","tuDySEOE1o","QnJ1SlsQGo","zY1GY7ku1p",
+"lkMUAReKEW","FLsphfaHir","hi5X7fFDrJ","piJSkM6qcG","yEfy9NOHsz","n1pmOhUTw7","suY4xuJScX","Pb1paMK07Y","gdQsSzQt6Q","YjB9tdQ586",
+"7X3uygIYvE","5iGN5LDk6f","MezSW1j5L8","n8pJ9FnPFB","uvf7Azz4ZU","vOqCESbRYy","G1RhSSs0Zu","Z4I1vW7cTs","WDVWJqUJMd","XyPZNtlILt",
+"DQimpBCxeC","WPmlxfLNg8","qaofNJkzUn","t59lRjeskS","oQ87r8RCUA","IjTwP1v5hH","YjB9tTCgPp","Dz1R3prNT6","2TRI7azIWp","gdQsScQOnv",
+"0MR5XW7cTs","0Wr5yfaHir","OHaBzJ2mQi","Z4I1vEoToP","FxX9qFGzgp","hUTw7pT8wu","aFFssQ6Lix","wDajXKr8ys","brhlQJKWYR","JRJQBPYBf4",
+"gjUTuLbRTH","taOXKRmDcr","NOHszNcICA","9rlg9Ul4a1","FwEJzY1mC0","zFgtBi3pyd","l83Udtl72W","FhtglBCxeC","k85AeiKqhr","ydG8UVprf2",
+"5NammaDGtS","atef2SjskQ","2ZHdkQChxs","RkQkeReKEW","ZUnqtd85a9","xXTI4F6PT2","lCMxyaez9y","k85Ae5iGN5","QbxXczQt6Q","y94nwiB08l",
+"uupzkyEfy9","fcJOydhSuH","VBjhzWreyP","Ul4a1Pb1pa","BbwgAVerEA","FFDuihe9IA","0Wr5yQssNC","IKxdLQ6hMC","lViBvyToGW","y94nwKr8ys",
+"4QMc964s8N","Gv3Fq4dEz6","pAhR12Yz7E","BGaQYa00b5","55rfBIRh48","7X3uyAmdQd","lViBv5Drn0","tvdkD5ZaEz","fcwDaRsQUq","qaofNCNHmv",
+"uZPqglpF6W","X6PinSs0Zu","VLTy6KsjRK","LDk6fe6e4z","rz7Utl83Ud","9XyT90Kyfs","djsrvgIYvE","cShY2QbxXc","AIYUu16lHc","gIYvEFLsph",
+"jtn0XvOqCE","6AFT0iqv4k","fcJOygdQsS","aDGtSzY1GY","O3iyQBGaQY","uPX7GMkgy8","d85a9d85a9","x3LDeZv7z0","nlaByhUTw7","FhtgliwzGk",
+"1j5L8EoToP","2Yz7E2TRI7","UlU3MbZLvS","faHirG1RhS","vLsmSv1Hln","MK07Yhe9IA","gjUTupmeCd","ThjNnpvgjS","ThjNnMmKGJ","uTacx9eoRc",
+"QYxC0MaJQs","pvgjSpT8wu","ogLgcpWiOs","VLTy6VerEA","faHirI7p2a","prNT63weIF","wDajXCp3mZ","OUqFMGSQwj","YOfrYzHF1q","AXpwEyofH3",
+"fcJOyjfREu","5drc6hUTw7","IRh488hJdt","0KyfspvgjS","dmoS7RmDcr","ZhwG18RCUA","suY4xIn3NS","29QAzlj07Q","d85a96q6L9","h1zcHs93Ml",
+"BGaQYogLgc","xXTI4Y1mC0","LDk6fNAFuw","AgJHQGv3Fq","7fKYUtl72W","AIYUujiVBP","B3qemt98iW","gjUTuEoToP","pFrrlmz8gx","iKqhrBbwgA",
+"OHaBzkZANm","Ta8f6s4786","oQ87rjS1aj","aFFssLDk6f","OUqFMDcpWB","55rfBlweGy","AkKTkiqv4k","FcWrWciuWz","4W0TlNxx9V","tvdkDAkKTk",
+"hi5X7QClRL","W3VFHlpF6W","BCxeCuJScX","nFqikv8yFN","EOE1ozFgtB","Zv7z0IBe8k","zFgtBAmdQd","QYxC0ReKEW","o8UydWDVWJ","HzZT8ZzJHW",
+"0h1b1xXTI4","aFFssOxWIH","UlU3MyofH3","ZzJHWWPmlx","hSSvQ0PktI","jSjS3djsrv","G1RhS55rfB","4QMc9mX2GE","KZamHzz4ZU","tl72WaL6AJ",
+"x3LDe7Ow5C","29QAzYw2oU","s93Ml9y4lw","mz8gxyluBx","fLNg8MGlTF","EoToPvkCHH","MezSWUlU3M","6q6L95Mg9r","taOXKM6qcG","i7WMQ1v5hH",
+"Nxx9VtuDyS","AOgEeBpYhV","atef255rfB","2Nslmni2v1","xciqp1LB1L","9GXkXX6Pin","kZANmyToGW","lj07Qlj07Q","FxX9qMm8si","lj07QKr8ys",
+"d85a9FLsph","RsQUqChuy3","faHir45cIH","Yw2oULDk6f","MaJQsqUJMd","ix74rNxx9V","IjTwPFVMxo","jtn0XU3yw5","piJSkfLNg8","bgJAzAOgEe",
+"yvOMIzqH0W","MK07Ys4786","MmKGJ6q6L9","okgRigjUTu","lH1kt6q6L9","Cfgr3qQxHP","WaWsviwzGk","MGlTF8cVD3","xciqpcL0aE","blLA9tlILt",
+"MGlTFdpe1v","5ZaEzzbIYY","NOHsztjQxs","pT8wuiB08l","Dz1R3JkzUn","RmDcrYh1hF","dhSuH618Di","cmXIXzmLYD","hi5X7aFFss","BCxeCjtn0X",
+"0MR5XrKDLJ","hUTw7XflUq","CqqaDatef2","LbRTHQYxC0","K4GS8FjHXR","pvgjSQbxXc","jSjS3EOE1o","jSjS3ZzJHW","qUJMd1v5hH","zz4ZU1v5hH",
+"iwzGkU3yw5","pmeCd1j5L8","RpBQmFhtgl","lkMUAjiVBP","W3VFHVerEA","FNYIMsoy9t","SmGzvKr8ys","rz7Utm4bxU","CNHmvblLA9","JKWYROHaBz",
+"2Nslmlm0pD","l83Ud29QAz","AkKTkvOqCE","gf8rIyToGW","CdyBVNhXdu","ksJbyTXQ0Z","cShY2FwEJz","ydG8Uv8yFN","7hyVvt59lR","uoStwJkzUn",
+"s93MlsuY4x","gjUTuRACuj","K20wKaL6AJ","aez9yfcJOy","HlUbF7Ow5C","fmIK1v2eC3","QnJ1SFFDui","9iGoTGv3Fq","CdyBVNcICA","uupzktlILt",
+"Gv3FqPOUYS","tl72W9GXkX","0ao3lJkzUn","OUqFMs4786","i3pydqUJMd","KASQ855rfB","sqVrfRkQke","XflUqWaWsv","RACujMojnP","Q6hMCzY1GY",
+"uQIczzbIYY","djsrvWMiS3","P6bcghUTw7","pv0i7VLTy6","NOHszAIYUu","VNCPd0h1b1","Vprf2fcwDa","VBjhzzFgtB","W7cTsulk41","fcwDaaFFss",
+"AXpwEydG8U","XflUq6AFT0","oQ87rn1pmO","JKWYRXflUq","ydG8UoQ87r","1v5hHmX2GE","hYBCKfcJOy","QssNC9GXkX","L7cGcIKxdL","8hJdtZUnqt",
+"NOHszyofH3","Mm8sifcJOy","WreyPCxVEf","ciuWzoVQp6","YjB9tciuWz","No0QbL7cGc","faHir9GXkX","POUYSBpYhV","POUYSIjTwP","45cIHDcpWB",
+"aFFssciuWz","Kr8ys8TxD7","1v5hH2hEEU","zQt6QqaofN","rhl0JtuDyS","JKWYRGv3Fq","WMiS3I7p2a","4QMc9t59lR","UlU3MQClRL","SmGzvQ6Lix",
+"0h1b129QAz","faHirjfREu","aL6AJ7Ow5C","TXQ0ZCxVEf","xXTI4618Di","P6bcg2Yz7E","pFrrlb29RJ","Dz1R3Ul4a1","BCxeC8TxD7","NhXduK20wK",
+"uQIczGXdoH","ZhwG1OUqFM","PYBf4BFkb8","9GXkXt98iW","IjTwPprNT6","a00b57fKYU","qUJMdguMb8","RxrsmyvOMI","yofH3n8pJ9","Pb1paQ6Lix",
+"Yf2EcQ6hMC","14FLRQ6hMC","lkMUAEOE1o","KsjRKiqv4k","CxVEfThjNn","9XyT9M6qcG","suY4xRkQke","lViBvKZamH","RsQUqsx5Gl","fmIK1X6Pin",
+"a00b5djsrv","KsjRKOUYuF","uoStwlj07Q","a00b57fsYM","0PktI7ku1p","djsrv8FmFH","b29RJTa8f6","0ao3lwiHrZ","MGlTFYh1hF","d85a9o8Uyd",
+"nFqikt59lR","prNT6Cp3mZ","DLhzMMmsIo","FVMxoU3yw5","uN6r3oVQp6","RmDcrBbwgA","EoToP5Mg9r","piJSklj07Q","XyPZNdhSuH","zbIYY5VZjS",
+"NAFuw1LB1L","taOXK0YAGH","Ul4a1uQIcz","SjskQLDk6f","0ao3lkB5nP","NhXduPOUYS","HP4335IhmG","2TRI7uLtKs","Y1mC0580YD","WaWsvy94nw",
+"hSSvQ3weIF","zbIYYEoToP","ThjNnlm0pD","soy9tdQ586","Dz1R3RBhp0","brhlQyluBx","LDk6f2Nslm","YOfrYoVQp6","wDajXuPX7G","CdyBV29QAz",
+"5iGN5lweGy","gtCA5RpBQm","iwzGkX6Pin","PYBf4ThjNn","taOXKdjsrv","nnP8oru4UG","S2DfuCIShG","Ta8f6iqv4k","hi5X70PktI","7fsYMFjHXR",
+"14FLR1j5L8","VBjhz1j5L8","FwEJzDQimp","okgRiThjNn","AkKTk9rlg9","RmDcrBGaQY","i3pyd5Drn0","atef2Q6hMC","J2mQiRkQke","jSjS3CdyBV",
+"tjQxsprNT6","tjQxsJKWYR","8TxD7RACuj","B3qem45cIH","0h1b17hyVv","QssNCYw2oU","faHirqUJMd","l83UdbrhlQ","BFkb8zFgtB","DG4sTUmaEv",
+"hUTw7QChxs","ZuDtDhYBCK","pAhR1ReKEW","DcpWBt59lR","JIqXiL7cGc","9eoRc7fKYU","NOHszpmeCd","BGaQYGrDg7","RkQke1LB1L","jzUqRgf8rI",
+"24ARFFLsph","lj07Qe6e4z","RmDcrMmsIo","1v5hHWaWsv","aDGtSyofH3","HP433ydG8U","Yf2Ecrz7Ut","X6PinMkgy8","Chuy3iqv4k","gIYvEqUJMd",
+"WaWsvuPX7G","uJScXOz8yZ","y94nwQbxXc","5drc6K4GS8","7fsYMRzaZA","bZLvS4QMc9","Rxrsmix74r","X6PinU3yw5","NcICA5drc6","RsQUq5VZjS",
+"lH1kt29QAz","07n1cMmsIo","QWxoTXyPZN","FjHXRlkMUA","ZuDtDHzZT8","sx5GlThjNn","LDk6fazIWp","m4bxUx3LDe","QWxoTQworu","YjB9tGrDg7",
+"iwzGkOHaBz","HlUbFvkCHH","I7p2azFgtB","bZLvSgIYvE","Twanojtn0X","Gv3FqzbIYY","MmKGJuvf7A","5Mg9rWMiS3","aL6AJdQ586","VLTy6fcJOy",
+"7hyVv8RCUA","KsjRKJkzUn","BpYhV7fsYM","LbRTHXyPZN","8cVD3NcICA","gjUTupWiOs","qQxHPFcWrW","hE1QlBpYhV","LewvM0Wr5y","G1RhSFhtgl",
+"IBe8k9rlg9","zmLYDfqypy","IBe8kMm8si","45cIHWPmlx","HP433NcICA","xReecP6bcg","580YDZ4I1v","lweGyQssNC","i3pydtjQxs","J2mQiQYxC0",
+"MojnPwiHrZ","CxVEfuPX7G","UlU3MoVQp6","zmLYDYf2Ec","dpe1vlj07Q","HfyNQBCxeC","uLtKsfLNg8","LDk6foVQp6","NcICA580YD","aL6AJZUnqt",
+"l83Ud4W0Tl","jzUqRm4bxU","uTacxe6e4z","VIlwP7Ow5C","uPX7G14FLR","xReeczmLYD","8cVD3tvdkD","WaWsvni2v1","Q6Lixgf8rI","DcpWBlm0pD",
+"n1pmOpiJSk","pT8wuzqH0W","nlaByTwano","AOgEeyEfy9","zQt6Q29QAz","wDajX0ao3l","guMb8hSSvQ","pT8wu0Wr5y","yEfy9v1Hln","t98iWGWqqX",
+"zHF1quupzk","VerEAGWqqX","JRJQBKASQ8","GXdoHzmLYD","v1HlnuoStw","DG4sTuJScX","GWqqXydG8U","07n1ccmXIX","VerEAQworu","AgJHQuvf7A",
+"WDVWJK20wK","1LB1LHzZT8","IBe8kuoStw","Cp3mZDG4sT","FcWrWGXdoH","zFgtBl83Ud","5ZaEz16lHc","7fsYMJJs5m","5iGN5aez9y","ogLgcAmdQd",
+"7ku1plj07Q","9XyT9DQimp","JIqXi9eoRc","XyPZNyvOMI","RkQke7fKYU","hE1QlMkgy8","DcpWBIjTwP","m4bxUCfgr3","9XyT9m4bxU","HzZT8ulk41",
+"5ZaEzQ6Lix","uAWypjS1aj","jtn0XQClRL","pvgjSHP433","5nmWvAkKTk","MK07YFnPFB","YjB9tpvgjS","fcwDaiqv4k","Kr8ysUl4a1","aDGtSFnPFB",
+"VBjhzMm8si","blLA9uTacx","0BmCyW7cTs","ksJbyS2Dfu","0MR5XB3qem","I7p2amX2GE","9iGoT8cVD3","pAhR18hJdt","Vprf2J2mQi","djsrvQbxXc",
+"fmIK1s7Mxk","Zv7z02Yz7E","BbwgAVNCPd","W3VFHSWfou","2ZHdkOUYuF","m4bxULDk6f","d7vjMlweGy","Cfgr3YOfrY","9y4lwKr8ys","tjQxsuvf7A",
+"StlDJs93Ml","Cfgr307n1c","y94nwRzaZA","AXpwE2hEEU","LewvMRkQke","s4786pWiOs","Ul4a1FjHXR","M3zXLtaOXK","2ZHdkZ4I1v","1LB1LpWiOs",
+"9iGoTWPmlx","ReKEWi3pyd","Fhtgl2DREs","piJSkxReec","PYBf4NhXdu","i3pyd6q6L9","uTacxC2Irc","618Dii7WMQ","qQxHPZ4I1v","fmIK1ZJTXH",
+"0MR5XNxx9V","gIYvECqqaD","v8yFN4QMc9","soy9t8cVD3","JXljWxXTI4","QssNCuN6r3","2DREsIn3NS","lm0pDFwEJz","tAOsrMm8si","W7cTs5drc6",
+"X6PinlpF6W","yluBx48cHL","FcWrW6AFT0","suY4xqQxHP","gIYvEgf8rI","CxVEfSjskQ","MojnPvOqCE","Yf2EcZ4I1v","L7cGcX6Pin","k85Aetl72W",
+"SWfouaFFss","qQxHPeuZA5","uTacxVjCZq","7ku1pC2Irc","9GXkXx3LDe","fFDrJv1Hln","xReecWaWsv","5nmWvzHF1q","qaofNv2eC3","uJScXJkzUn",
+"mX2GERzaZA","0Wr5yDz1R3","hYBCK3otm6","5NammS77LH","S77LH7lUXZ","euZA5RACuj","Chuy3AkKTk","t59lRHlUbF","vkCHHhUTw7","l83UdMkgy8",
+"d7vjMuJScX","8FmFH2TRI7","FNYIMIjTwP","4dEz6EoToP","Oz8yZIRh48","xReecUl4a1","DLhzMCNHmv","lj07Q14FLR","yluBxuTacx","FVMxoogLgc",
+"uQIcz5Namm","a00b5faHir","48cHLWmadA","QnJ1SwiHrZ","8xEKzLewvM","pv0i7zbIYY","VIlwPn8pJ9","5drc65ZaEz","b29RJGv3Fq","0Wr5yG1RhS",
+"7X3uyrhl0J","5Mg9r7ku1p","VerEAVNCPd","KASQ80PktI","1j5L81j5L8","iB08lP6bcg","ECMvUlpF6W","NhXduBCxeC","CqqaDx3LDe","JJs5md85a9",
+"dQ586AgJHQ","StlDJKr8ys","yofH32Yz7E","5IhmGIn3NS","FNYIMLewvM","iKqhrOz8yZ","07n1cWaWsv","BbwgAn1pmO","F6PT20h1b1","soy9tcShY2",
+"SbRYyZv7z0","I7p2ae6e4z","d7vjM9iGoT","FcWrWHP433","618DieuZA5","uN6r3zQt6Q","M6qcGv2eC3","CNHmvMmKGJ","JXljWL7cGc","VLTy6Ul4a1",
+"VIlwP9y4lw","Mkgy8X6Pin","WmadAhUTw7","cShY2lCMxy","aez9yuvf7A","JIqXi1j5L8","a00b5ZJTXH","atef2NhXdu","yofH3X6Pin","gjUTu5nmWv",
+"W3VFHtl72W","jzUqRKASQ8","cmXIXciuWz","7X3uyBCxeC","d85a9NcICA","euZA5lkMUA","uJScXxXTI4","lkMUAxXTI4","EdBKccL0aE","JIqXiFGzgp",
+"pAhR1MezSW","QChxsfLNg8","tl72WuJScX","HP433Cp3mZ","uLtKsFLsph","guMb8m4bxU","AXpwEIRh48","taOXKCp3mZ","ZzJHWzY1GY","lXFOBzmLYD",
+"Nxx9VJIqXi","OUqFMCdyBV","wDajX5Namm","gdQsS7Ow5C","9rlg9qQxHP","WreyP8FmFH","D6rBypv0i7","JkzUnFxX9q","gIYvEsoy9t","s7MxkBbwgA",
+"n8pJ9JkzUn","Uvlv4Fhtgl","D6rByt59lR","2Yz7EZv7z0","5Mg9r5ZaEz","fqypypT8wu","5iGN5atef2","MK07Y0Kyfs","dmoS7nlaBy","Ss0ZuWaWsv",
+"Chuy3HzZT8","PYBf4Yh1hF","JIqXiIn3NS","U3yw5I7p2a","hi5X7djsrv","CK5W7lm0pD","k85AeIn3NS","iKqhrDQimp","DLhzMRmDcr","CIShGuvf7A",
+"lkMUAOHaBz","b29RJHP433","yvOMIQ6hMC","Pb1pa9eoRc","d85a9Z4I1v","zqH0WbZLvS","O3iyQhYBCK","ksJbyv1Hln","yEfy9i7WMQ","BpYhVQworu",
+"Yh1hFAmdQd","L7cGc5IhmG","d85a9tAOsr","oVQp6FwEJz","JIqXiWaim6","iwzGkix74r","pAhR1VjCZq","ksJbyM3zXL","45cIHydG8U","PYBf4FPfSE",
+"AmdQdGrDg7","55rfBAXpwE","b29RJRmDcr","OUYuFlpF6W","vkCHHgdQsS","AIYUuK20wK","fLNg88FmFH","tAOsrkB5nP","EdBKcK20wK","S77LHtl72W",
+"pmeCdCK5W7","jfREuAmdQd","5ZaEzlj07Q","pAhR1uPX7G","uvf7ApWiOs","S77LHuAWyp","xXTI4HRxd8","hSSvQFFDui","nlaByOxWIH","mX2GEF6PT2",
+"lViBvuJScX","CdyBVv1Hln","taOXKNxx9V","MojnPpAhR1","pvgjSMmKGJ","uupzkgf8rI","Mm8siO3iyQ","6AFT0O3iyQ","gf8rIjfREu","AOgEeMmKGJ",
+"1j5L8Mkgy8","UlU3MjzUqR","Twano8RCUA","yofH3l83Ud","WMiS35Namm","5iGN52Nslm","WreyPJKWYR","8U2nU0ao3l","3weIF0YAGH","UlU3MIjTwP",
+"UmaEvqQxHP","ydG8Ui3pyd","xXTI4kB5nP","HP433PYBf4","Dz1R3HlUbF","jtn0XcL0aE","NhXdu6AFT0","L7cGcogLgc","WmadA24ARF","fLNg8k85Ae",
+"WaWsvs7Mxk","Ul4a1lweGy","FPfSEFVMxo","1v5hHni2v1","7X3uybgJAz","yofH39y4lw","zY1GYgjUTu","iqv4kpiJSk","tAOsrSbRYy","IKxdLqaofN",
+"dpe1vpmeCd","zmLYDIjTwP","MaJQs9GXkX","3weIFQ6Lix","okgRioVQp6","Cfgr3uupzk","AkKTk9y4lw","pWiOsrz7Ut","lm0pDW7cTs","dhSuH7lUXZ",
+"ulk41piJSk","ZUnqtzz4ZU","blLA9L7cGc","7fKYUcQOnv","WDVWJ0h1b1","uPX7G55rfB","FLsph07n1c","FLsphqUJMd","AOgEeVNCPd","gf8rIpmeCd",
+"Cfgr3jiVBP","n8pJ9i7WMQ","ZJTXHI7p2a","5IhmGhE1Ql","6AFT0AgJHQ","oQ87rOz8yZ","pWiOsRpBQm","yluBxazIWp","YOfrYxXTI4","HzZT8BGaQY",
+"fqypy4dEz6","1LB1LSs0Zu","PYBf4W3VFH","n8pJ9uQIcz","OHaBzTCgPp","y94nwd7vjM","sx5GlFjHXR","CK5W77Ow5C","OUYuFAOgEe","KZamHThjNn",
+"JIqXihe9IA","qUJMdQWxoT","JIqXiAOgEe","ix74rguMb8","ni2v1GXdoH","GXdoHJRJQB","aez9ySbRYy","AXpwEcShY2","yToGWs93Ml","fLNg86q6L9",
+"GXdoHoQ87r","OxWIHix74r","he9IAlsQGo","QssNCguMb8","HfyNQS2Dfu","y94nwJXljW","DLhzMQYxC0","d7vjMbgJAz","tlILtbrhlQ","1j5L8v8yFN",
+"FjHXRQ6Lix","AkKTkL7cGc","M6qcGJJs5m","aL6AJ580YD","HP433JIqXi","dmoS7jfREu","GWqqXv2eC3","2hEEUiKqhr","v8yFNyvOMI","HzZT87Ow5C",
+"DG4sTQ6hMC","i3pydQ6Lix","Yf2EcW7cTs","I7p2ayofH3","Dz1R3TCgPp","XflUqOz8yZ","rz7UtkZANm","Yf2EcazIWp","ZuDtDydG8U","QYxC0nlaBy",
+"PYBf4vOqCE","GrDg7CqqaD","iqv4kP6bcg","faHirYjB9t","YjB9tpWiOs","BbwgACxVEf","oQ87rBFkb8","TCgPph1zcH","dpe1vi3pyd","x3LDeBGaQY",
+"CK5W7yluBx","oGu6xokgRi","ECMvUOz8yZ","NAFuwLDk6f","HzZT8WMiS3","45cIHVIlwP","m4bxU5Drn0","AXpwEm4bxU","tlILtFxX9q","Ss0Zu7lUXZ",
+"ogLgc5iGN5","hYBCKX6Pin","t98iWLewvM","JkzUnzY1GY","ydG8UECMvU","WMiS35ZaEz","lpF6WRkQke","1j5L8lCMxy","FGzgpn8pJ9","WPmlxEoToP",
+"mX2GEzQt6Q","xReecVjCZq","MaJQsSWfou","JJs5mXyPZN","FjHXRv1Hln","pT8wueuZA5","GSQwj7ku1p","zbIYYuTacx","HfyNQReKEW","Chuy3i3pyd",
+"ECMvUuupzk","jeskSx3LDe","aL6AJFcWrW","jzUqRYOfrY","pT8wuuPX7G","tvdkDDG4sT","aFFssEdBKc","9y4lwGXdoH","ix74rxXTI4","RzaZA2TRI7",
+"DcpWBdpe1v","2Yz7ESWfou","CK5W7x3LDe","lsQGo0ao3l","DG4sT8hJdt","zz4ZU9y4lw","hUTw7Cfgr3","5ZaEzCp3mZ","taOXKRBhp0","MmsIoAOgEe",
+"QssNCzz4ZU","jeskSoQ87r","vLsmSzFgtB","6AFT05ZaEz","okgRiReKEW","7X3uySWfou","hUTw7Q6hMC","DG4sTo8Uyd","1j5L8k85Ae","s93MlnnP8o",
+"MmKGJuQIcz","kB5nPFwEJz","v8yFNVerEA","fmIK1hUTw7","v8yFNZuDtD","fcwDauQIcz","RBhp0ThjNn","7fsYMNAFuw","MmsIogtCA5","v1HlnDQimp",
+"LbRTHrKDLJ","QWxoTaL6AJ","K20wKUl4a1","C2IrcDcpWB","JRJQBLbRTH","v2eC3BpYhV","1v5hH5Namm","0h1b1d7vjM","fqypyjfREu","aFFss0YAGH",
+"tl72WX6Pin","Ss0Zu2ZHdk","0MR5XydG8U","ulk41ECMvU","lCMxyZuDtD","8TxD7QWxoT","pmeCdAgJHQ","9iGoTNcICA","I7p2aMm8si","AOgEeB3qem",
+"BCxeCQYxC0","PYBf4I7p2a","P6bcg9XyT9","Zv7z02Nslm","No0QbzY1GY","lweGyaFFss","0ao3l8U2nU","xXTI4DQimp","cmXIXWMiS3","6AFT0t59lR",
+"MezSWM6qcG","DG4sTlXFOB","cmXIXgjUTu","VLTy6WaWsv","5IhmGOUqFM","sqVrffcwDa","MmKGJFFDui","WreyP5ZaEz","ru4UGd7vjM","AkKTkRACuj",
+"prNT6JIqXi","uZPqgh1zcH","RmDcrFhtgl","gjUTuECMvU","0MR5XAkKTk","14FLRiqv4k","oQ87rIjTwP","kB5nPd7vjM","W3VFHWmadA","GSQwjpFrrl",
+"RpBQm5IhmG","kZANmAgJHQ","L7cGcgIYvE","pmeCd55rfB","64s8NQChxs","uvf7AAOgEe","RBhp0hYBCK","QWxoTlpF6W","FNYIMEdBKc","n1pmOeuZA5",
+"WDVWJRkQke","zz4ZUfcwDa","n8pJ9jeskS","jtn0XJXljW","KASQ8zz4ZU","DG4sTn1pmO","tAOsrL7cGc","FVMxoZUnqt","x3LDeFFDui","JRJQBYOfrY",
+"8hJdtlsQGo","faHirs93Ml","StlDJK20wK","RsQUqFnPFB","SWfou2hEEU","9XyT9MGlTF","s93MlOHaBz","aez9yWaim6","CIShGRACuj","7hyVvZhwG1",
+"Pb1pazmLYD","WDVWJVBjhz","blLA9Kr8ys","QClRLvkCHH","hUTw7wiHrZ","zQt6Q8xEKz","jSjS3prNT6","y94nwWaWsv","zbIYYbgJAz","VBjhz9XyT9",
+"lj07QdhSuH","B3qemgtCA5","k85AeTXQ0Z","5nmWv3weIF","AXpwECdyBV","uZPqgx3LDe","Yw2oU5VZjS","MezSWpmeCd","k85AeAXpwE","0h1b1Y1mC0",
+"FVMxooVQp6","m4bxU618Di","Mkgy8Pb1pa","gtCA55Mg9r","M3zXLZv7z0","he9IAzHF1q","W3VFHQWxoT","ydG8UkB5nP","fcJOylH1kt","8xEKz3weIF",
+"cQOnvuoStw","1v5hHlkMUA","tAOsr4QMc9","qaofNFGzgp","iB08lxciqp","OxWIHP6bcg","0PktIAgJHQ","8U2nU5iGN5","BGaQYzHF1q","aez9yru4UG",
+"WaWsvvkCHH","Chuy3ZUnqt","6q6L9qaofN","gIYvEpiJSk","Pb1pa5Drn0","Mm8si0MR5X","dhSuH0Wr5y","VerEAEoToP","dmoS7v2eC3","2TRI72TRI7",
+"AmdQdGv3Fq","AgJHQoGu6x","IRh48OHaBz","WMiS3rz7Ut","lCMxys93Ml","7fsYMWaWsv","HfyNQpiJSk","lpF6WtvdkD","t98iWJXljW","bZLvS8xEKz",
+"ReKEW7lUXZ","yEfy9sx5Gl","Cfgr3WaWsv","0YAGHK4GS8","9XyT9IjTwP","QClRLSjskQ","zz4ZU4QMc9","lXFOBRkQke","pvgjSRzaZA","5IhmGgf8rI",
+"fLNg8J2mQi","lpF6WIKxdL","D6rByzz4ZU","7Ow5Cx3LDe","5IhmGAgJHQ","AOgEeEoToP","lkMUAUvlv4","RzaZAdpe1v","iqv4k48cHL","16lHc1LB1L",
+"lsQGozY1GY","m4bxUCK5W7","oVQp6d7vjM","U3yw5GXdoH","ni2v1MojnP","FwEJzZ4I1v","L7cGcIn3NS","lH1ktUmaEv","SmGzvAmdQd","aL6AJyofH3",
+"Oz8yZCIShG","24ARFRzaZA","FLsphFFDui","ReKEW8xEKz","fFDrJMmKGJ","s93Ml64s8N","d85a9VjCZq","pAhR1Twano","bgJAzbZLvS","atef21j5L8",
+"ix74rStlDJ","ogLgcvLsmS","lViBvAIYUu","2TRI7BbwgA","9eoRcpmeCd","OxWIHuAWyp","4dEz6cL0aE","gdQsSgjUTu","x3LDeNOHsz","HfyNQ5nmWv",
+"SbRYyVjCZq","HfyNQWaWsv","tAOsrhYBCK","Dz1R3okgRi","dmoS7zQt6Q","CK5W7GSQwj","14FLR8xEKz","jiVBPCK5W7","WreyP5nmWv","zmLYDyEfy9",
+"rz7Ut3weIF","yluBxKZamH","n1pmO7ku1p","zbIYYzmLYD","AOgEelH1kt","h1zcHVprf2","jiVBPZJTXH","YjB9tM6qcG","a00b5Y1mC0","uZPqgt59lR",
+"48cHLs93Ml","Yf2EceuZA5","LewvMpWiOs","8U2nU1LB1L","8cVD3QYxC0","3weIFxReec","vOqCEoGu6x","lCMxyKsjRK","v8yFNP6bcg","VIlwPFLsph",
+"3weIF4W0Tl","XyPZN5ZaEz","ZhwG1pv0i7","ThjNnGrDg7","VIlwPEOE1o","hE1Qlv1Hln","L7cGcNxx9V","CK5W7pvgjS","RACuje6e4z","8cVD3sqVrf",
+"DQimpSWfou","ZuDtDZuDtD","l83UdSWfou","DQimplCMxy","xciqpSmGzv","FLsphlkMUA","pFrrlNxx9V","nFqikkB5nP","Yw2oUGSQwj","IjTwPMkgy8",
+"yofH3djsrv","ThjNnlkMUA","OUqFMTCgPp","9XyT9rz7Ut","hYBCKQClRL","cL0aENAFuw","7hyVvKr8ys","aDGtScQOnv","2NslmjzUqR","n8pJ9QChxs",
+"9XyT9b29RJ","EOE1oIRh48","LDk6fStlDJ","ciuWzYjB9t","dmoS78TxD7","ZhwG1VIlwP","RACuj0Wr5y","fcwDaMmKGJ","lXFOB7fKYU","9XyT9XyPZN",
+"AmdQdMm8si","YjB9t618Di","5NammFnPFB","ni2v1azIWp","580YDRBhp0","hUTw7sx5Gl","QnJ1SfFDrJ","TXQ0ZpvgjS","580YDxReec","5drc6Yf2Ec",
+"nnP8oPOUYS","SWfouW7cTs","X6PinNxx9V","rz7UtWMiS3","yToGWyEfy9","jeskSFLsph","DQimpsx5Gl","v2eC3Fhtgl","RkQkeRpBQm","wDajXQworu",
+"lCMxyjeskS","5IhmGzQt6Q","Yf2EcAkKTk","CK5W7Cfgr3","Fhtgl7hyVv","jeskS0Kyfs","guMb87hyVv","IRh484QMc9","qUJMdMezSW","9GXkXtjQxs",
+"ReKEWzY1GY","7fKYUs4786","uZPqgFhtgl","O3iyQ9eoRc","ciuWzKr8ys","FnPFB9GXkX","dpe1vuJScX","2TRI7QYxC0","CdyBVOUYuF","lkMUA7hyVv",
+"AkKTkRsQUq","jS1ajWaWsv","1LB1L5nmWv","taOXKzqH0W","7Ow5CCxVEf","O3iyQYw2oU","618DiJkzUn","G1RhS7fsYM","7fKYUhYBCK","5Mg9r2Yz7E",
+"Vprf2In3NS","QbxXc3weIF","TwanoHP433","pv0i7lm0pD","iB08lrKDLJ","iqv4k24ARF","LDk6fjfREu","vkCHH64s8N","s93Mlk85Ae","ZUnqtuvf7A",
+"HRxd8VNCPd","No0QbFnPFB","0Wr5y8cVD3","BbwgAuN6r3","xReecVLTy6","gf8rI5Mg9r","9y4lw48cHL","tjQxs0BmCy","lsQGozbIYY","hUTw7tvdkD",
+"3weIF0PktI","rKDLJIjTwP","ogLgc7X3uy","ni2v1l83Ud","oQ87rpAhR1","0ao3ld85a9","zY1GYdpe1v","6q6L9brhlQ","5NammciuWz","tAOsrK4GS8",
+"Q6hMCMGlTF","JRJQBZuDtD","Mkgy88xEKz","yEfy9tlILt","ni2v17Ow5C","uN6r3i3pyd","uZPqgRzaZA","kZANmCqqaD","pmeCdCxVEf","jfREuNo0Qb",
+"uQIczZ4I1v","24ARFPb1pa","b29RJfLNg8","QnJ1SQWxoT","OxWIHjiVBP","S2Dfusoy9t","euZA5OxWIH","IBe8kSjskQ","FVMxoeuZA5","MojnP24ARF",
+"xXTI4x3LDe","iqv4ksoy9t","TCgPp9rlg9","0PktILewvM","2DREsiKqhr","yToGWGrDg7","No0Qb8RCUA","fqypyOz8yZ","MezSWlj07Q","kZANm16lHc",
+"lXFOBZUnqt","lCMxyX6Pin","OUYuF2ZHdk","LbRTHtaOXK","v8yFNpmeCd","4dEz64dEz6","ReKEWCfgr3","uN6r3iB08l","64s8N1v5hH","iB08lBCxeC",
+"Uvlv4UlU3M","6AFT0Oz8yZ","ix74rlsQGo","LbRTHlpF6W","yEfy9iB08l","4dEz6Uvlv4","IjTwPNo0Qb","Cfgr3RsQUq","uoStwDcpWB","v1HlnuTacx",
+"tjQxszFgtB","cmXIXUvlv4","618DiNhXdu","L7cGcGSQwj","l83UdaFFss","0ao3lZUnqt","ZhwG1uZPqg","AgJHQuPX7G","ydG8UCNHmv","aL6AJ2Yz7E",
+"v8yFNuQIcz","fmIK1euZA5","DQimp8TxD7","QChxs24ARF","t59lRFNYIM","xXTI4ksJby","Mm8siblLA9","HP4330Kyfs","VLTy6qQxHP","gtCA545cIH",
+"7X3uy9eoRc","CdyBV9y4lw","AOgEe5iGN5","Ss0ZuJJs5m","cShY2AgJHQ","prNT69XyT9","0KyfsFjHXR","n8pJ9iqv4k","xciqpFGzgp","CK5W7BbwgA",
+"aL6AJQ6Lix","iwzGkJIqXi","BbwgAlpF6W","yvOMIcmXIX","CdyBVHzZT8","FLsphFnPFB","he9IADLhzM","VBjhzYOfrY","oQ87rdhSuH","D6rBylkMUA",
+"FVMxokZANm","brhlQwDajX","blLA9soy9t","WMiS3BCxeC","RxrsmQbxXc","lCMxyyofH3","Oz8yZzQt6Q","wiHrZGXdoH","580YDIn3NS","tvdkDRmDcr",
+"uAWypv8yFN","JKWYRdjsrv","h1zcHDLhzM","tvdkDrhl0J","8RCUAIRh48","SjskQ8xEKz","5VZjS5IhmG","S77LHBFkb8","2hEEUuJScX","0Wr5yRxrsm",
+"U3yw5zFgtB","s7Mxk07n1c","VNCPduLtKs","In3NSazIWp","LbRTHYh1hF","AgJHQAXpwE","blLA9X6Pin","8U2nUni2v1","TXQ0ZmX2GE","y94nwMGlTF",
+"NhXdux3LDe","ZzJHWZ4I1v","cQOnvzHF1q","DcpWBCfgr3","ulk41uupzk","qaofNCK5W7","piJSkqaofN","jzUqRFVMxo","i7WMQNxx9V","CdyBVECMvU",
+"CxVEfGWqqX","piJSkHRxd8","n1pmOd7vjM","K20wKDG4sT","jtn0XnlaBy","ReKEWVNCPd","Z4I1vZzJHW","cQOnvQnJ1S","MojnPix74r","0PktItvdkD",
+"4QMc9ciuWz","CxVEf7fKYU","soy9twDajX","QChxsksJby","0MR5XjeskS","djsrvv1Hln","FGzgpNxx9V","k85AeEOE1o","Ul4a1QYxC0","uLtKsrhl0J",
+"i3pydUlU3M","U3yw5cQOnv","hE1QloQ87r","0BmCy0ao3l","C2IrcHRxd8","4QMc9ydG8U","yvOMIF6PT2","OUqFMDG4sT","Pb1paFcWrW","okgRi8TxD7",
+"jtn0X48cHL","AkKTkm4bxU","oQ87rpv0i7","FwEJzFFDui","lj07QZv7z0","Fhtglm4bxU","DLhzM8hJdt","W3VFHd85a9","ru4UGK20wK","FnPFB7lUXZ",
+"Fhtgl1LB1L","580YD7fKYU","RBhp0SmGzv","HRxd8nnP8o","9eoRc5VZjS","618DiFLsph","b29RJ2TRI7","lweGyv1Hln","0Wr5yIKxdL","M6qcGUlU3M",
+"7fKYUZuDtD","KsjRK9eoRc","ZhwG1RzaZA","9eoRcksJby","Q6Lix7fsYM","ZJTXHyEfy9","s7MxkC2Irc","zbIYY2Yz7E","hUTw77hyVv","tjQxs1j5L8",
+"MojnPIjTwP","cQOnvix74r","FcWrW2ZHdk","QnJ1SJkzUn","t59lRGSQwj","ni2v1pT8wu","QWxoT5ZaEz","lpF6WbrhlQ","uoStwjS1aj","S77LHyvOMI",
+"KZamHblLA9","oGu6xKZamH","aFFssMkgy8","pmeCdmz8gx","AOgEezmLYD","fLNg8AXpwE","8RCUAMK07Y","AmdQdsuY4x","XyPZNzbIYY","ZUnqtRACuj",
+"8RCUA16lHc","Gv3FqRpBQm","pmeCdJJs5m","6q6L9ulk41","sx5GlZhwG1","mz8gxv1Hln","xReecRzaZA","tjQxsx3LDe","WmadA9rlg9","lCMxykB5nP",
+"IKxdLvOqCE","EdBKc7Ow5C","Uvlv4Pb1pa","VerEAYjB9t","Nxx9VSs0Zu","K20wK5Namm","QWxoTZuDtD","m4bxUBbwgA","PYBf43weIF","7lUXZVprf2",
+"AOgEe0YAGH","pvgjSlViBv","uJScXM6qcG","fFDrJMGlTF","5iGN5lH1kt","tl72W16lHc","rhl0JCqqaD","U3yw5K20wK","xciqpYOfrY","ru4UGAXpwE",
+"4QMc9b29RJ","BFkb89eoRc","5VZjS0YAGH","YOfrYYOfrY","lXFOBzQt6Q","jiVBPy94nw","VerEAxReec","MGlTF5Namm","OHaBzGXdoH","7Ow5CpAhR1",
+"0Kyfsh1zcH","FxX9qtAOsr","lkMUAIRh48","5drc6RzaZA","5nmWvuZPqg","7hyVvfmIK1","fLNg8ydG8U","YOfrYiKqhr","dQ586AkKTk","cShY2brhlQ",
+"hSSvQS2Dfu","jzUqRCxVEf","Oz8yZlkMUA","jtn0XazIWp","sqVrfBCxeC","ix74rHlUbF","4dEz6NAFuw","FcWrW7fsYM","tAOsryEfy9","CIShGReKEW",
+"45cIHQYxC0","7lUXZWreyP","lkMUAQbxXc","FnPFBQnJ1S","AOgEedjsrv","MojnP6AFT0","MGlTFHlUbF","TwanotjQxs","ciuWz0BmCy","EOE1oBpYhV",
+"TwanoTXQ0Z","14FLRTwano","gjUTu0BmCy","EdBKcNAFuw","fcJOyxReec","8xEKz4dEz6","RzaZAFNYIM","prNT6fcJOy","DG4sTtjQxs","BFkb8Yw2oU",
+"WaWsvuJScX","xXTI45Mg9r","tl72WUvlv4","lViBvoQ87r","dmoS7LbRTH","sx5GlsuY4x","pmeCdYf2Ec","AIYUu5nmWv","oQ87rxciqp","xReecAkKTk",
+"s4786zHF1q","2Yz7EChuy3","uLtKsMK07Y","uupzkDG4sT","jSjS3sqVrf","iKqhrlj07Q","QYxC0iqv4k","RkQkeLbRTH","uTacxciuWz","ni2v1W3VFH",
+"fcJOyAgJHQ","s93MlMK07Y","zz4ZURACuj","lm0pDeuZA5","d7vjMfmIK1","fcJOyBCxeC","HP433ulk41","pvgjSvLsmS","uAWypWmadA","DG4sTsuY4x",
+"tuDySP6bcg","8xEKz5Namm","9y4lwpT8wu","BFkb8Qworu","t59lRKsjRK","NOHsz1v5hH","jtn0Xxciqp","qUJMd6AFT0","jeskSpT8wu","azIWp8TxD7",
+"24ARF7ku1p","sqVrfLbRTH","zY1GY24ARF","9XyT9rKDLJ","9y4lw9GXkX","gf8rIiqv4k","Yw2oUD6rBy","5Mg9rhi5X7","DcpWBMezSW","pv0i7Uvlv4",
+"i7WMQSbRYy","i7WMQIjTwP","aez9yGv3Fq","Ul4a1NOHsz","ogLgcWmadA","uAWypnFqik","i3pydDLhzM","uJScXFNYIM","kZANma00b5","M3zXLqaofN",
+"Ta8f6O3iyQ","M6qcGmX2GE","7hyVvpvgjS","Yf2EcZv7z0","faHirAkKTk","rKDLJuPX7G","9eoRcni2v1","qQxHPHzZT8","5VZjSTwano","zY1GYyEfy9",
+"ydG8UyvOMI","LDk6fv8yFN","GXdoHiKqhr","qUJMd618Di","zFgtBy94nw","NhXduiwzGk","29QAzdQ586","6q6L96q6L9","fFDrJMkgy8","5IhmGi7WMQ",
+"aez9yM3zXL","hSSvQlH1kt","ReKEWZJTXH","KZamHoGu6x","0KyfsIKxdL","0Wr5yCfgr3","5IhmGtaOXK","cQOnvNo0Qb","Ss0ZuTCgPp","G1RhSfmIK1",
+"yEfy9euZA5","wDajX0h1b1","l83Udxciqp","AOgEeOxWIH","qUJMdvLsmS","M3zXLvLsmS","n1pmOzqH0W","iqv4kPb1pa","hUTw7JKWYR","xXTI45nmWv",
+"RkQke7hyVv","AOgEeNOHsz","ZUnqtvLsmS","sx5Gl1v5hH","NcICAQ6Lix","zqH0WTXQ0Z","TCgPpW3VFH","ZJTXHdQ586","lViBvbZLvS","ZuDtD0h1b1",
+"7fKYUGSQwj","55rfBwiHrZ","tlILtMm8si","NcICAEOE1o","uvf7Ax3LDe","e6e4zv8yFN","vkCHH5VZjS","Cp3mZpv0i7","ZzJHWciuWz","MojnPaL6AJ",
+"lCMxy07n1c","CqqaDWreyP","45cIHoQ87r","lj07QHRxd8","PYBf42Nslm","HP43329QAz","vLsmS45cIH","ydG8URpBQm","0YAGHqQxHP","G1RhSm4bxU",
+"D6rBypmeCd","FFDuilViBv","wiHrZl83Ud","JRJQBpAhR1","45cIHC2Irc","FxX9qgf8rI","WPmlxtvdkD","GrDg764s8N","HRxd87hyVv","jSjS3oGu6x",
+"5iGN5x3LDe","BbwgANxx9V","9iGoTaL6AJ","gf8rICIShG","VNCPdAXpwE","FcWrWoGu6x","No0Qbrz7Ut","VerEAFhtgl","ulk41qaofN","jiVBPBFkb8",
+"VLTy6YOfrY","5Mg9r2TRI7","oGu6xdpe1v","I7p2adjsrv","pv0i7M6qcG","HP433xXTI4","KsjRKl83Ud","9rlg9618Di","IBe8kEdBKc","aDGtSFGzgp",
+"5NammlpF6W","LewvMy94nw","Q6hMCqQxHP","l83UdAmdQd","hi5X7b29RJ","Uvlv4cmXIX","uLtKsCxVEf","ECMvUcmXIX","S2Dfu0BmCy","FxX9q07n1c",
+"1j5L8YjB9t","i7WMQbrhlQ","s4786hUTw7","YjB9t2ZHdk","Uvlv4iqv4k","FxX9qqUJMd","uPX7GFNYIM","S2Dfu0Kyfs","tAOsrQworu","v2eC3lpF6W",
+"vLsmSZhwG1","dmoS7AXpwE","FnPFBhE1Ql","DG4sTJkzUn","0KyfsGXdoH","pT8wuMojnP","NAFuwuupzk","ix74rlj07Q","WPmlxazIWp","Q6LixNo0Qb",
+"VIlwPksJby","s93MlwDajX","NAFuwFFDui","guMb8ulk41","4QMc9tjQxs","ECMvUTa8f6","5VZjSmX2GE","jzUqRNo0Qb","jzUqRQ6hMC","OUYuF1v5hH",
+"29QAzCK5W7","xReecFGzgp","d7vjMVLTy6","euZA55drc6","JRJQB580YD","WreyPS2Dfu","LbRTHOUqFM","S77LHThjNn","faHirW7cTs","aFFsslH1kt",
+"jtn0XB3qem","FVMxoIBe8k","zz4ZU5VZjS","sqVrfaL6AJ","RpBQmk85Ae","m4bxU0h1b1","euZA5ru4UG","XyPZNFcWrW","hE1QlzHF1q","v2eC3vLsmS",
+"FxX9qpAhR1","Cfgr3Q6Lix","16lHcgIYvE","UlU3MjfREu","0YAGHix74r","BbwgACK5W7","uAWyp5VZjS","G1RhS580YD","ZJTXHbgJAz","NAFuw7ku1p",
+"fFDrJEoToP","L7cGcBCxeC","kZANmxXTI4","5Mg9rAgJHQ","WmadAfFDrJ","MK07YPb1pa","Waim6y94nw","618DitjQxs","8TxD7ReKEW","mX2GEk85Ae",
+"618DisqVrf","n8pJ9ThjNn","nFqikDG4sT","14FLRkB5nP","MaJQs0Wr5y","RsQUq0h1b1","RpBQm5Namm","fcwDauAWyp","8cVD3pmeCd","Cp3mZoGu6x",
+"WreyPpv0i7","DcpWBAIYUu","lkMUAuJScX","fFDrJl83Ud","HlUbFrz7Ut","Oz8yZKr8ys","GWqqXuTacx","VIlwPfqypy","HfyNQcmXIX","GrDg7MK07Y",
+"yluBxIn3NS","pFrrl8cVD3","JKWYRM3zXL","EOE1o6q6L9","OUYuF8cVD3","5NammCqqaD","uAWypVerEA","SbRYyix74r","kB5nPI7p2a","MezSWlm0pD",
+"rhl0JuTacx","AOgEe64s8N","M6qcG7hyVv","48cHLd85a9","uZPqgAIYUu","8RCUAlkMUA","TXQ0Zy94nw","QnJ1SrKDLJ","pv0i72hEEU","5Mg9rpFrrl",
+"Dz1R3Mkgy8","rz7UtogLgc","QworuAmdQd","AmdQdgtCA5","v2eC3bZLvS","hYBCKni2v1","ECMvUUvlv4","DG4sTG1RhS","ni2v1tuDyS","uPX7GjS1aj",
+"FPfSEuZPqg","tlILtazIWp","l83UdUmaEv","lH1kthSSvQ","jS1ajFjHXR","euZA5dpe1v","uPX7GW3VFH","FPfSEokgRi","n1pmOs7Mxk","n1pmOEdBKc",
+"No0QbtlILt","nlaByEoToP","rz7Uthe9IA","2DREsBGaQY","QChxsHRxd8","zmLYDMojnP","l83UdyluBx","AmdQdAOgEe","MK07YJIqXi","MaJQsdQ586",
+"QbxXcv8yFN","ThjNnMGlTF","FxX9qDQimp","CxVEfCfgr3","TCgPpNOHsz","uAWyp7X3uy","RBhp0Q6hMC","9eoRc7lUXZ","ciuWztl72W","ru4UGAgJHQ",
+"7fsYM2TRI7","jtn0Xn1pmO","WMiS30MR5X","n8pJ9v1Hln","ReKEWAXpwE","guMb8qQxHP","0BmCyKZamH","DG4sTRBhp0","0BmCy2Yz7E","HRxd8s4786",
+"uTacxU3yw5","gjUTuguMb8","HfyNQL7cGc","iwzGk0Kyfs","VLTy6uN6r3","CNHmvgf8rI","48cHL5IhmG","sx5Gly94nw","ZUnqtMojnP","CqqaD0Kyfs",
+"lH1ktxXTI4","GWqqX5VZjS","ReKEWOxWIH","Oz8yZZUnqt","ECMvUGrDg7","W3VFHNOHsz","oQ87rlweGy","zbIYYSmGzv","uZPqgFLsph","CNHmvk85Ae",
+"8xEKzgdQsS","07n1c45cIH","uJScX618Di","0ao3lDz1R3","TXQ0ZD6rBy","lpF6WzY1GY","mX2GE5drc6","2DREs2ZHdk","uJScXMaJQs","BGaQYuJScX",
+"ciuWzOxWIH","ECMvUHP433","Cp3mZk85Ae","TwanoyToGW","J2mQituDyS","uoStwlViBv","SbRYyM3zXL","aL6AJQWxoT","K4GS87lUXZ","d7vjM5IhmG",
+"Yf2EcQnJ1S","jtn0XRkQke","MK07YNOHsz","RmDcrKr8ys","pT8wuuoStw","NOHszbrhlQ","WMiS3ZuDtD","5iGN5qUJMd","No0QbtAOsr","2hEEUPYBf4",
+"d85a9FPfSE","e6e4zCqqaD","VLTy6lm0pD","JIqXi7X3uy","uAWyptlILt","D6rByX6Pin","GrDg7OHaBz","euZA5euZA5","d7vjMReKEW","No0Qbix74r",
+"ydG8UBCxeC","aL6AJaFFss","ZzJHWv1Hln","Oz8yZRzaZA","l83Ud2DREs","yvOMICdyBV","pvgjS7fsYM","lsQGouTacx","GSQwjfcJOy","qQxHPlXFOB",
+"WMiS38hJdt","FNYIMLbRTH","zmLYDVIlwP","IRh480BmCy","HRxd8RzaZA","3weIFs93Ml","WaWsvo8Uyd","I7p2ab29RJ","JJs5mrhl0J","qaofN5iGN5",
+"8hJdtlweGy","xciqphe9IA","618Di64s8N","t98iWcL0aE","aDGtSuQIcz","yvOMIDLhzM","MezSWOz8yZ","tjQxsGXdoH","tAOsrwiHrZ","ZzJHW0BmCy",
+"45cIH29QAz","ydG8U6q6L9","gtCA5BFkb8","rhl0Jv2eC3","k85Ae0PktI","5nmWvIn3NS","hi5X7d85a9","BpYhV0ao3l","HlUbFMK07Y","XyPZN0ao3l",
+"5Mg9r8TxD7","i3pydcmXIX","QChxsWreyP","xciqpyvOMI","lViBv4W0Tl","v8yFN7X3uy","qQxHPRxrsm","RmDcrb29RJ","zbIYYjiVBP","fcJOy29QAz",
+"lH1ktQYxC0","0MR5XGWqqX","djsrv2Nslm","VerEAn1pmO","KZamHIKxdL","XyPZNbZLvS","16lHcVIlwP","M6qcGStlDJ","MezSWuvf7A","J2mQiHzZT8",
+"ulk417hyVv","Waim60BmCy","Gv3FqGrDg7","CqqaDxXTI4","GXdoHW7cTs","Nxx9VC2Irc","RmDcrUl4a1","HzZT8FwEJz","W7cTsHRxd8","WPmlxdQ586",
+"cQOnvOxWIH","16lHcblLA9","qUJMdQClRL","EoToPtuDyS","618DiyofH3","BCxeClXFOB","GWqqXMmsIo","5drc6cQOnv","X6PinRBhp0","h1zcHCfgr3",
+"euZA5NOHsz","dpe1vAIYUu","5iGN5fFDrJ","JXljWy94nw","brhlQ9iGoT","pAhR116lHc","5IhmG8cVD3","45cIHuN6r3","SbRYydjsrv","Nxx9VVprf2",
+"aFFssD6rBy","FVMxoJRJQB","0MR5X8RCUA","yvOMISjskQ","uvf7ARBhp0","RzaZA2ZHdk","MmKGJWMiS3","qQxHPYjB9t","RzaZANxx9V","i7WMQ8RCUA",
+"zQt6QGXdoH","9iGoTaDGtS","X6Pin0h1b1","pAhR1OxWIH","3weIFFhtgl","pWiOs4dEz6","gdQsS2Nslm","lH1ktWMiS3","QnJ1SoVQp6","W3VFHfaHir",
+"1v5hH4dEz6","QYxC0MezSW","YOfrYzqH0W","MK07YFPfSE","zqH0W64s8N","prNT6ZUnqt","h1zcHiwzGk","lsQGoReKEW","aDGtSVNCPd","SmGzvRACuj",
+"6AFT0yofH3","RmDcrfFDrJ","zbIYYQ6Lix","7fKYUZUnqt","JRJQBRzaZA","CqqaDxReec","Y1mC0uZPqg","uoStwv8yFN","fFDrJsqVrf","580YDeuZA5",
+"3weIFlpF6W","WDVWJl83Ud","AIYUuiKqhr","FjHXR8U2nU","y94nwlsQGo","ZzJHWCNHmv","ZUnqtLbRTH","SbRYyO3iyQ","hSSvQJRJQB","RzaZAlViBv",
+"SjskQtlILt","2ZHdk1v5hH","2DREspvgjS","Yw2oUVerEA","jSjS3vkCHH","NAFuwKsjRK","WPmlxoQ87r","2ZHdkFhtgl","FGzgpni2v1","m4bxUFxX9q",
+"pFrrlydG8U","J2mQiJIqXi","6AFT0QYxC0","HfyNQkZANm","ZJTXHwiHrZ","0PktIzFgtB","7Ow5CMkgy8","GSQwjxciqp","QnJ1SyToGW","hE1QlPOUYS",
+"HlUbFnlaBy","SmGzvIn3NS","7fsYMtlILt","1LB1LpiJSk","gtCA5o8Uyd","jeskSksJby","JJs5m5IhmG","Z4I1vCxVEf","OUqFMRxrsm","K4GS85ZaEz",
+"hYBCKzFgtB","07n1cECMvU","9GXkXQ6hMC","FGzgpQYxC0","0MR5XZhwG1","faHirTCgPp","CK5W7Twano","AgJHQoQ87r","AkKTkNAFuw","Cp3mZxXTI4",
+"I7p2aCIShG","9eoRcEoToP","O3iyQpFrrl","ZhwG1WmadA","5ZaEzfFDrJ","t98iWDQimp","MmsIod7vjM","iB08lOUqFM","lpF6WFFDui","BCxeCSmGzv",
+"O3iyQAOgEe","TwanoQworu","UmaEvfcwDa","FnPFBa00b5","hYBCKeuZA5","rhl0Jy94nw","5drc6K20wK","cmXIXAOgEe","K4GS8ciuWz","zbIYYMkgy8",
+"ECMvUCfgr3","faHiraL6AJ","fFDrJHP433","EOE1oaL6AJ","Uvlv4s93Ml","Ta8f64QMc9","7X3uyVerEA","Waim65iGN5","MGlTF8xEKz","HfyNQ8TxD7",
+"uupzk8cVD3","hi5X7Oz8yZ","3weIFcShY2","xciqpcShY2","t59lRfqypy","8RCUAuLtKs","GrDg7zFgtB","FFDuiiwzGk","UlU3MjeskS","Ta8f6Qworu",
+"uTacxD6rBy","NhXduhYBCK","5Drn0FFDui","9y4lwvLsmS","AgJHQBGaQY","WMiS3PYBf4","yEfy9GWqqX","DQimpO3iyQ","EoToPThjNn","nnP8oOUqFM",
+"rz7Ut9eoRc","5VZjSNAFuw","0MR5XIBe8k","ru4UGTwano","zQt6QzbIYY","P6bcgAOgEe","FNYIMP6bcg","i7WMQe6e4z","MK07YNhXdu","J2mQiI7p2a",
+"gf8rI0Kyfs","mX2GENcICA","VjCZqtlILt","8U2nUWPmlx","uN6r38U2nU","VerEAbZLvS","rKDLJ55rfB","BCxeCQ6Lix","vkCHHfaHir","0KyfszY1GY",
+"CK5W7SbRYy","OxWIHCfgr3","aFFssjiVBP","Z4I1vtlILt","lXFOBcmXIX","JIqXidmoS7","fmIK17fKYU","WDVWJoVQp6","K4GS85Namm","Dz1R35nmWv",
+"J2mQii7WMQ","n1pmOzFgtB","sqVrft59lR","t59lRi3pyd","Oz8yZCp3mZ","5VZjSJJs5m","nFqik2Yz7E","xReeculk41","NcICAWmadA","d7vjMVBjhz",
+"dmoS7HzZT8","2Yz7EmX2GE","5nmWvsoy9t","5Drn0MmKGJ","uPX7GChuy3","MK07YlkMUA","5Drn0ReKEW","7ku1pZv7z0","RBhp0uQIcz","2Yz7ESbRYy",
+"DG4sTZzJHW","iKqhrDcpWB","yToGWlsQGo","KZamHcL0aE","EOE1ob29RJ","AgJHQAkKTk","s7MxkIBe8k","oQ87rECMvU","lpF6Wgf8rI","QChxs16lHc",
+"S2DfulViBv","uLtKs9GXkX","uvf7Asx5Gl","GSQwjBbwgA","jiVBPRpBQm","KZamHni2v1","0MR5XZuDtD","OUqFMaDGtS","AOgEeQnJ1S","gf8rIWaWsv",
+"uvf7A9GXkX","fqypyFxX9q","MmsIov8yFN","pmeCdxciqp","dQ586NAFuw","DLhzM8U2nU","5drc6azIWp","8FmFHAIYUu","ZUnqtpAhR1","ZzJHWIjTwP",
+"i7WMQUlU3M","m4bxUxciqp","HzZT8FLsph","3weIFS77LH","DG4sTcL0aE","0PktINo0Qb","9eoRc2Yz7E","RpBQmvOqCE","EOE1olCMxy","azIWpatef2",
+"8TxD70MR5X","he9IA7X3uy","RkQkezY1GY","mX2GEChuy3","64s8Nd85a9","NcICAOz8yZ","7ku1pfcwDa","Yw2oUcShY2","7hyVvX6Pin","Yh1hFni2v1",
+"AIYUuKASQ8","ulk41tAOsr","jzUqRMmsIo","O3iyQZJTXH","U3yw5YOfrY","aFFssBbwgA","VNCPdHzZT8","0h1b1UlU3M","8U2nU7fKYU","pAhR1AkKTk",
+"VjCZq5nmWv","fFDrJJKWYR","cQOnvhi5X7","lm0pDjeskS","jfREuXflUq","AmdQdCNHmv","ix74rIn3NS","soy9tBFkb8","zFgtBiqv4k","NOHszXflUq",
+"fcJOyKsjRK","5IhmGDG4sT","dmoS70MR5X","yToGWlm0pD","9XyT95VZjS","8xEKztuDyS","U3yw55ZaEz","nFqikvkCHH","pv0i79XyT9","cShY2fcJOy",
+"vLsmS6q6L9","7lUXZiB08l","QChxsjtn0X","AOgEeRBhp0","FFDuiQClRL","EdBKcXyPZN","3otm6Gv3Fq","dQ58648cHL","BGaQYRpBQm","WmadAY1mC0",
+"07n1cRpBQm","FLsphPYBf4","LbRTH2Yz7E","CdyBVzbIYY","OUqFM0ao3l","oQ87rVprf2","mz8gx0MR5X","7hyVvTa8f6","0YAGHzFgtB","8xEKzvOqCE",
+"KZamHhe9IA","RsQUqKsjRK","WreyPF6PT2","Z4I1vWaWsv","pT8wuM6qcG","uTacxTa8f6","uupzkaDGtS","Cfgr3QnJ1S","SWfouokgRi","WmadAuZPqg",
+"FNYIMjeskS","QChxsThjNn","cShY2NOHsz","uTacx8TxD7","WreyPBCxeC","QWxoTD6rBy","Qworu16lHc","XyPZNS77LH","0BmCyQssNC","FPfSEBGaQY",
+"ReKEW24ARF","9XyT9JRJQB","Rxrsm4dEz6","mz8gx9XyT9","9rlg9uoStw","v1HlnHzZT8","9iGoTazIWp","FnPFBzHF1q","sx5GlVprf2","fLNg8zz4ZU",
+"AIYUuJKWYR","UlU3MtjQxs","QnJ1SMm8si","JRJQBWPmlx","Dz1R3pAhR1","RACujLewvM","Q6Lixuupzk","SbRYyCdyBV","VerEARBhp0","iwzGk8xEKz",
+"QYxC0ni2v1","bZLvSSs0Zu","hUTw7DLhzM","i3pyd4W0Tl","v1HlnzqH0W","iwzGkRpBQm","5nmWv2Nslm","8U2nUwDajX","iKqhrWPmlx","lCMxy4QMc9",
+"K20wK4W0Tl","Ta8f6wDajX","WaWsvZJTXH","4dEz63otm6","i3pydvOqCE","i7WMQcmXIX","hUTw7hUTw7","C2IrcVIlwP","ZhwG1he9IA","sx5GlVjCZq",
+"BpYhVFGzgp","FLsphGXdoH","KsjRKNhXdu","EoToPaDGtS","IBe8kxXTI4","soy9tdjsrv","Mm8siFcWrW","zmLYD9eoRc","MezSWtlILt","C2IrclH1kt",
+"cmXIXCxVEf","SmGzvbrhlQ","WMiS3hUTw7","WPmlxs93Ml","OUYuFzHF1q","gjUTuuTacx","Ss0Zu7fsYM","9iGoTJJs5m","QbxXc8cVD3","xXTI4pvgjS",
+"CIShGQWxoT","iB08l5ZaEz","zQt6QTa8f6","Mkgy8mz8gx","FLsphU3yw5","X6Pinsx5Gl","Chuy3oGu6x","hUTw7yvOMI","prNT6K4GS8","yToGWni2v1",
+"xXTI42Nslm","wiHrZv1Hln","oVQp6LewvM","GSQwj0YAGH","0Wr5yHlUbF","ru4UG8xEKz","JRJQB618Di","tvdkDvkCHH","55rfBCK5W7","JXljWjiVBP",
+"HlUbFqUJMd","RACujAkKTk","ZUnqtzqH0W","QssNChSSvQ","dQ586Yf2Ec","NcICAMezSW","BpYhVokgRi","Mm8siJXljW","YjB9tGWqqX","VIlwP1j5L8",
+"aL6AJNcICA","nFqikChuy3","AgJHQBCxeC","I7p2a9iGoT","v2eC3IjTwP","gf8rIVNCPd","bgJAzfcwDa","Ss0ZuVNCPd","Gv3FqAIYUu","NhXduhE1Ql",
+"i7WMQGv3Fq","n1pmOYf2Ec","vkCHHcShY2","24ARFNcICA","S77LHMmsIo","QworuS2Dfu","6q6L9pmeCd","DLhzMcmXIX","guMb8AkKTk","KsjRK48cHL",
+"ulk41XyPZN","l83Ud9XyT9","5VZjSPb1pa","pv0i7RACuj","X6PinHP433","B3qemni2v1","rKDLJQWxoT","tAOsr5Namm","a00b5GWqqX","NAFuwlViBv",
+"tl72WKsjRK","i3pydd85a9","xciqpciuWz","oGu6x7ku1p","0h1b1ni2v1","azIWpzQt6Q","vLsmSMK07Y","ReKEWLbRTH","POUYS4W0Tl","dmoS78hJdt",
+"hSSvQxXTI4","oGu6xfFDrJ","fcJOyoGu6x","sqVrfnnP8o","Q6hMCn8pJ9","AkKTk7Ow5C","s4786lsQGo","5Mg9rHfyNQ","TXQ0Z618Di","qUJMdXflUq",
+"Ul4a1uupzk","FFDuiRACuj","uLtKstuDyS","FVMxohYBCK","5NammuN6r3","KsjRKYOfrY","uLtKsNcICA","WaWsvLbRTH","4dEz60BmCy","ogLgcdQ586",
+"hUTw7suY4x","pT8wuHfyNQ","ksJbys93Ml","zmLYDMm8si","VNCPd1v5hH","qaofN7lUXZ","zQt6Q1v5hH","SWfoubrhlQ","azIWpK20wK","djsrvjfREu",
+"fLNg8b29RJ","IRh48ix74r","MK07YDG4sT","xXTI4jSjS3","e6e4z7X3uy","9XyT9zQt6Q","J2mQiDz1R3","OUYuFjtn0X","5drc61LB1L","blLA9s93Ml",
+"16lHcM6qcG","FNYIMAmdQd","IRh48qaofN","pvgjSAgJHQ","tAOsrKr8ys","gjUTuNOHsz","aFFssHfyNQ","8xEKzDLhzM","AkKTkydG8U","8TxD7dhSuH",
+"lkMUARpBQm","v2eC3prNT6","ogLgcjS1aj","64s8N8FmFH","aDGtSG1RhS","AkKTkk85Ae","wDajXM3zXL","tAOsrxReec","Yh1hFZhwG1","KsjRK0Wr5y",
+"EoToP7fsYM","uPX7G4W0Tl","Gv3FqmX2GE","wDajXNOHsz","cQOnvhe9IA","SmGzvxReec","DQimpHlUbF","dmoS7RsQUq","ZhwG1QChxs","WDVWJ7hyVv",
+"yluBxYjB9t","rhl0Ja00b5","Oz8yZix74r","xXTI4Dz1R3","Pb1paoGu6x","ogLgcQChxs","7X3uyZzJHW","FwEJzW7cTs","uZPqghE1Ql","bgJAzMezSW",
+"Mm8si618Di","5iGN5tjQxs","MGlTFuPX7G","he9IAAkKTk","EOE1o2TRI7","IKxdL0BmCy","FjHXREoToP","Vprf22Yz7E","CNHmvDz1R3","yToGWsx5Gl",
+"WmadAFFDui","BbwgAKsjRK","l83UdogLgc","CqqaDRsQUq","IKxdLRmDcr","RBhp0vLsmS","6AFT0Mm8si","IjTwPChuy3","XyPZN14FLR","YOfrYTa8f6",
+"Cfgr3cL0aE","5ZaEzOHaBz","QbxXcZUnqt","K4GS8s4786","SmGzvS2Dfu","B3qemlj07Q","0PktIRBhp0","OUqFMv1Hln","rhl0JQWxoT","mz8gxb29RJ",
+"oGu6xzqH0W","uPX7G0Wr5y","C2IrchSSvQ","6AFT0aFFss","hSSvQFnPFB","OxWIHlj07Q","J2mQisx5Gl","ru4UG0MR5X","UlU3MqUJMd","uJScXsx5Gl",
+"K20wKvkCHH","8RCUAgtCA5","2DREsUvlv4","5Mg9rvLsmS","3otm6Chuy3","fcJOyt59lR","IBe8k3otm6","Chuy3pAhR1","xReecC2Irc","45cIHzqH0W",
+"HzZT816lHc","ksJbyuvf7A","JKWYRQssNC","jiVBPZhwG1","FVMxo9XyT9","fFDrJ64s8N","zqH0W0h1b1","zmLYDuQIcz","l83Ud9GXkX","lj07QpiJSk",
+"WaWsvTCgPp","prNT6b29RJ","0YAGH8U2nU","zqH0WdmoS7","SbRYy3otm6","cQOnvokgRi","HlUbFgIYvE","oGu6xuZPqg","pFrrlpiJSk","M6qcGUl4a1",
+"RmDcrK20wK","lkMUAwDajX","GXdoHJXljW","OxWIHnnP8o","JKWYRWMiS3","5nmWvvkCHH","bgJAzgdQsS","rhl0JThjNn","F6PT2F6PT2","h1zcH6AFT0",
+"yofH38U2nU","0Wr5yLbRTH","Mm8siuLtKs","AkKTkjeskS","CdyBVcShY2","oGu6xiKqhr","Chuy3fcJOy","AXpwEFnPFB","lm0pDatef2","0KyfsdQ586",
+"Yw2oUQ6hMC","IKxdLjzUqR","sqVrfHzZT8","zQt6QTCgPp","HP433Z4I1v","tvdkD618Di","5NammKASQ8","FwEJzO3iyQ","zz4ZUWreyP","tAOsrfFDrJ",
+"iqv4kEoToP","AkKTkEdBKc","5Mg9r07n1c","QworurKDLJ","VBjhzyToGW","9rlg9VLTy6","qUJMdSmGzv","KZamHZzJHW","8RCUAhUTw7","C2IrcuQIcz",
+"TwanoWaWsv","AIYUuzqH0W","WreyPMK07Y","IBe8kAXpwE","M6qcGfcwDa","NcICA45cIH","qQxHPCK5W7","ZzJHWuQIcz","ReKEW6AFT0","wDajXC2Irc",
+"5Mg9r0ao3l","8FmFHlXFOB","xXTI4EdBKc","QworuciuWz","1LB1LzbIYY","0PktIReKEW","yvOMIQnJ1S","ksJbySbRYy","uLtKs2TRI7","IjTwPtAOsr",
+"fFDrJyvOMI","9XyT9taOXK","Ta8f6IjTwP","kB5nPWMiS3","s7Mxkulk41","uAWypI7p2a","v8yFN0YAGH","ogLgcK20wK","CqqaD8xEKz","e6e4z5Drn0",
+"OUqFMGv3Fq","7fsYMlpF6W","JXljWuN6r3","VjCZqFNYIM","qUJMduTacx","OUYuFt98iW","ZzJHWCIShG","gtCA5lH1kt","jzUqRCNHmv","6q6L99GXkX",
+"i7WMQBFkb8","lXFOB5IhmG","580YDpFrrl","n1pmOlViBv","W3VFH9GXkX","pT8wuIRh48","QworuW7cTs","NOHszQbxXc","pFrrlHP433","kZANm7fKYU",
+"HfyNQYOfrY","K4GS8O3iyQ","dmoS7rz7Ut","24ARFzHF1q","cL0aEQYxC0","AIYUu2Nslm","W7cTsQWxoT","iwzGkjiVBP","zmLYDyvOMI","uZPqgUvlv4",
+"fFDrJUmaEv","xReecBGaQY","IjTwPrhl0J","kB5nPe6e4z","2Yz7EfmIK1","uTacxn8pJ9","DcpWBt98iW","AgJHQ4QMc9","gjUTuYjB9t","IRh48LewvM",
+"jS1ajLewvM","JIqXiJJs5m","OUYuFhSSvQ","pAhR1JJs5m","IRh48xXTI4","7hyVvQssNC","C2IrcpT8wu","9eoRcJRJQB","yluBxuPX7G","jfREuYjB9t",
+"M3zXL2hEEU","jeskSFxX9q","oVQp6prNT6","6AFT0zqH0W","S2DfuAmdQd","zz4ZUP6bcg","zbIYYdjsrv","iKqhrTXQ0Z","euZA5soy9t","jtn0XpiJSk",
+"LewvM1LB1L","uLtKsRBhp0","lsQGo3otm6","v8yFN29QAz","29QAzNxx9V","MojnPSjskQ","mz8gxJKWYR","MaJQsQYxC0","0PktIW7cTs","uLtKsGrDg7",
+"uAWyp5Mg9r","djsrvZzJHW","wDajXjtn0X","cL0aESs0Zu","xReecQWxoT","M3zXL8TxD7","iqv4k5iGN5","EdBKc8cVD3","07n1cIn3NS","DG4sTTXQ0Z",
+"v8yFNNo0Qb","JIqXiU3yw5","y94nwuupzk","yEfy9tuDyS","Mm8silCMxy","b29RJt98iW","B3qemO3iyQ","dpe1v5ZaEz","CdyBVprNT6","8cVD35iGN5",
+"aL6AJokgRi","0MR5XTa8f6","3weIFZzJHW","pvgjSe6e4z","AgJHQqQxHP","7hyVvpWiOs","HlUbFECMvU","TwanojiVBP","y94nw0h1b1","AXpwEO3iyQ",
+"2hEEUCNHmv","J2mQiJXljW","Yf2EcJ2mQi","jzUqRzQt6Q","mz8gxRsQUq","pv0i75drc6","MGlTFAmdQd","mX2GE5IhmG","qQxHPlH1kt","4QMc9QClRL",
+"9XyT9hi5X7","vkCHHSbRYy","FGzgpHP433","NOHszFjHXR","mX2GECqqaD","VerEAsoy9t","RBhp04W0Tl","POUYSZzJHW","WaWsvUlU3M","iKqhr8xEKz",
+"0h1b1ThjNn","Zv7z0tlILt","FxX9qzz4ZU","4QMc90Wr5y","X6Pinv1Hln","sqVrfBFkb8","OUqFMReKEW","7X3uyWMiS3","QChxs1v5hH","cQOnv1LB1L",
+"hUTw7uJScX","AkKTkn8pJ9","AgJHQGWqqX","ru4UGY1mC0","WreyPrKDLJ","SWfou9rlg9","iwzGkQClRL","WaWsvuTacx","ydG8UKZamH","1j5L8UmaEv",
+"iB08lhe9IA","HP4335Mg9r","RmDcr8xEKz","Ul4a1JkzUn","F6PT2WmadA","qaofNuTacx","lpF6WS77LH","d85a95drc6","1LB1LQ6hMC","d85a9KASQ8",
+"sx5GlHP433","AOgEeX6Pin","9iGoT0YAGH","pAhR1dpe1v","d85a9L7cGc","3weIFUl4a1","nlaByM3zXL","Dz1R35Namm","RmDcrkB5nP","bZLvSMezSW",
+"n8pJ9Pb1pa","2ZHdkMaJQs","16lHcFGzgp","BGaQYBGaQY","zY1GYazIWp","cmXIXix74r","ECMvUciuWz","IKxdLzY1GY","djsrvRzaZA","ZJTXHJkzUn",
+"7Ow5CIRh48","FLsphlXFOB","nnP8o3otm6","RzaZAksJby","9GXkXpmeCd","s7MxkQClRL","uLtKs07n1c","wDajXLDk6f","JXljWCK5W7","Cp3mZWDVWJ",
+"POUYSjiVBP","0h1b1aDGtS","MezSWIBe8k","FFDuiCp3mZ","EdBKc1j5L8","0PktIHfyNQ","mz8gx7fKYU","JIqXiUl4a1","4dEz6Chuy3","1v5hHn1pmO",
+"9rlg9ZuDtD","EdBKcbgJAz","Mm8si6AFT0","FGzgpazIWp","dQ586jS1aj","gdQsS2TRI7","8hJdt7X3uy","AXpwEPYBf4","yluBxNo0Qb","4dEz6kZANm",
+"tAOsrtl72W","oQ87rSWfou","pv0i7dmoS7","k85Ae3otm6","07n1c6AFT0","m4bxUlpF6W","d85a9HRxd8","ZuDtDzHF1q","0Wr5yh1zcH","Ss0ZuDQimp",
+"ReKEWBbwgA","POUYSThjNn","DcpWBWaWsv","ZUnqtfaHir","BbwgABbwgA","ksJbyatef2","MaJQsChuy3","okgRiMGlTF","GWqqXt59lR","F6PT2aez9y",
+"9rlg9NAFuw","xXTI4tAOsr","O3iyQuoStw","K4GS8prNT6","YOfrYZJTXH","In3NS7lUXZ","v2eC3n8pJ9","qaofN1j5L8","9GXkX7hyVv","suY4xSbRYy",
+"rhl0JOz8yZ","kZANm8xEKz","ksJbyRBhp0","ni2v11v5hH","MGlTF07n1c","n1pmOmX2GE","KASQ8Cp3mZ","5Mg9r45cIH","DLhzMGSQwj","2NslmFFDui",
+"2ZHdkt59lR","gtCA5CIShG","9rlg99rlg9","RpBQmdjsrv","uZPqg14FLR","gf8rI3otm6","fcJOyC2Irc","uoStwdmoS7","ThjNn2hEEU","x3LDejS1aj",
+"0h1b1J2mQi","IjTwPDcpWB","d85a9Cp3mZ","xReecXyPZN","SWfou8xEKz","WDVWJpv0i7","cL0aEAIYUu","zqH0Wi3pyd","W3VFHs7Mxk","QChxsjzUqR",
+"hSSvQP6bcg","JXljW9iGoT","FnPFBIBe8k","Mm8siUlU3M","CxVEfo8Uyd","ksJbyOUYuF","VerEAFPfSE","taOXKAOgEe","Pb1pak85Ae","M6qcGvkCHH",
+"ciuWzLbRTH","LDk6fJRJQB","No0QbJXljW","OUYuFbgJAz","8U2nUIRh48","uPX7GNcICA","xXTI4LDk6f","pFrrl5drc6","1j5L8RkQke","zz4ZUNAFuw",
+"pAhR1uTacx","QChxsOz8yZ","2ZHdkbrhlQ","v8yFNNAFuw","5iGN5Q6Lix","IjTwPpv0i7","64s8Ns93Ml","gIYvEM6qcG","QClRLpT8wu","n1pmOatef2",
+"S77LHZ4I1v","9iGoTlpF6W","7X3uyQChxs","AOgEevOqCE","B3qemaDGtS","iqv4kuQIcz","AkKTkl83Ud","0Wr5yydG8U","9eoRceuZA5","blLA9QClRL",
+"0Wr5yO3iyQ","IKxdL8TxD7","SjskQ1j5L8","MezSWzY1GY","AkKTkWPmlx","AOgEeydG8U","QbxXc2Nslm","9eoRcFLsph","kB5nP1LB1L","JXljWVprf2",
+"7fKYURsQUq","ru4UGRpBQm","0MR5XI7p2a","9rlg9ThjNn","gjUTuQ6hMC","e6e4zWPmlx","K20wKDQimp","t59lRPOUYS","AkKTk618Di","cShY2gtCA5",
+"BCxeCZuDtD","Vprf2blLA9","SmGzv8U2nU","7hyVvdpe1v","RpBQmlj07Q","lsQGoNhXdu","5nmWvlXFOB","uLtKs8U2nU","MezSWJkzUn","ZJTXHlCMxy",
+"2hEEUL7cGc","07n1czHF1q","FnPFBYjB9t","n8pJ9Q6Lix","NhXducL0aE","4W0TlFwEJz","FhtglazIWp","VBjhzs93Ml","Mm8siiB08l","pv0i7AgJHQ",
+"Z4I1vtuDyS","0ao3lgIYvE","IRh48bZLvS","5ZaEzFPfSE","EdBKcaDGtS","F6PT2ksJby","Vprf2M3zXL","tuDySVBjhz","5Drn0Pb1pa","IjTwPBbwgA",
+"blLA9h1zcH","jeskStAOsr","RsQUql83Ud","a00b5yofH3","1LB1LqUJMd","AmdQdMmKGJ","wiHrZdQ586","VjCZq5drc6","djsrvaL6AJ","Uvlv4gdQsS",
+"AXpwEuLtKs","lj07QMGlTF","64s8NbgJAz","9GXkXBpYhV","CK5W7oVQp6","prNT6i3pyd","Fhtgl7X3uy","a00b5EOE1o","BbwgAJIqXi","7lUXZAkKTk",
+"K4GS8yvOMI","0YAGHSmGzv","55rfBlXFOB","lXFOBW3VFH","hUTw7LewvM","Uvlv424ARF","lCMxyPOUYS","RmDcrrz7Ut","tlILtsqVrf","HlUbFNhXdu",
+"AOgEe16lHc","Ul4a15iGN5","Yh1hFO3iyQ","M3zXLK20wK","CdyBVS77LH","KASQ8aFFss","UlU3MOxWIH","zY1GYa00b5","KsjRKDLhzM","NAFuwNcICA",
+"FGzgpCfgr3","7X3uySbRYy","pFrrltjQxs","8cVD3SmGzv","FNYIMlweGy","3otm6WmadA","pv0i70h1b1","2ZHdk0ao3l","m4bxUaL6AJ","GrDg7CIShG",
+"RsQUqqaofN","7lUXZDQimp","NOHszjtn0X","b29RJ3weIF","uJScXQnJ1S","G1RhSPYBf4","8TxD7OxWIH","VerEAciuWz","lpF6WuPX7G","yToGWGSQwj",
+"FcWrWZ4I1v","gdQsSru4UG","W7cTs4dEz6","Ta8f6lweGy","v2eC3vOqCE","0MR5XZv7z0","TXQ0ZzQt6Q","OxWIHzqH0W","tjQxsn8pJ9","2NslmVIlwP",
+"Cp3mZRACuj","2DREszHF1q","14FLRRzaZA","m4bxUyvOMI","bZLvSTa8f6","In3NSCIShG","x3LDegdQsS","K4GS8RpBQm","0ao3ldpe1v","MojnPQssNC",
+"8xEKzLDk6f","KASQ8yluBx","oVQp67hyVv","07n1cnFqik","zbIYYZzJHW","he9IASWfou","CK5W7dpe1v","YOfrYZzJHW","dpe1vqaofN","DcpWBFcWrW",
+"piJSkjiVBP","x3LDevkCHH","lkMUAdmoS7","oGu6xcmXIX","BGaQYulk41","7hyVvokgRi","iKqhrgIYvE","ogLgcPOUYS","ni2v1IBe8k","1LB1L55rfB",
+"ni2v1GrDg7","iKqhrgdQsS","suY4xjS1aj","S2DfuWDVWJ","6q6L9jfREu","lsQGoF6PT2","xXTI4cmXIX","gIYvEsx5Gl","sx5GlCqqaD","v2eC3No0Qb",
+"SWfouIKxdL","FGzgpgjUTu","1v5hHP6bcg","Cfgr3a00b5","Ss0Zu48cHL","7lUXZjS1aj","tAOsrW3VFH","0h1b1ZJTXH","pT8wu7fsYM","VjCZqpWiOs",
+"uTacxuoStw","CqqaDKZamH","Ta8f69GXkX","qaofNWreyP","jfREuyofH3","gdQsSoQ87r","HzZT8Y1mC0","iwzGkFPfSE","b29RJbrhlQ","14FLRuJScX",
+"ciuWzfFDrJ","lpF6WZJTXH","RACujvkCHH","n1pmOVBjhz","zbIYYMm8si","ogLgcSmGzv","FxX9q7Ow5C","ZhwG1FcWrW","8TxD7zbIYY","RkQkeWaWsv",
+"lViBvlj07Q","7Ow5CQYxC0","RmDcr8hJdt","oQ87rFLsph","uvf7ATwano","580YDNxx9V","MmsIom4bxU","S77LHaDGtS","1LB1LiKqhr","FxX9qtaOXK",
+"QWxoT45cIH","Mm8siFFDui","WDVWJSWfou","vLsmSGrDg7","FcWrWDcpWB","uQIczJJs5m","HzZT8QChxs","suY4xjiVBP","IKxdLfaHir","2hEEUnnP8o",
+"580YDuPX7G","jzUqRUvlv4","h1zcHRACuj","dhSuHNo0Qb","YjB9tlkMUA","WmadAJ2mQi","KsjRK1LB1L","3weIFZJTXH","sx5GlYh1hF","9GXkX1j5L8",
+"aez9yzFgtB","lCMxyXflUq","SjskQ5Mg9r","16lHcatef2","zHF1qQnJ1S","atef2aL6AJ","OHaBzWPmlx","yluBxIBe8k","ksJbyFxX9q","DG4sT4dEz6",
+"lsQGoO3iyQ","lweGyMojnP","QworuM6qcG","BbwgARACuj","2NslmQYxC0","07n1cQ6hMC","uTacxM3zXL","Chuy3Mm8si","TXQ0ZsqVrf","QssNCxciqp",
+"Yf2Ec9iGoT","iqv4kyToGW","tlILta00b5","jS1ajl83Ud","nFqikNxx9V","ulk41wDajX","WreyPgdQsS","qQxHPaDGtS","IKxdLMaJQs","BpYhVkB5nP",
+"C2IrcqUJMd","fcwDa8cVD3","16lHcazIWp","9GXkXZv7z0","9XyT98TxD7","BpYhVtl72W","FwEJzsuY4x","L7cGcb29RJ","YOfrY2hEEU","S77LHlj07Q",
+"Q6LixGWqqX","RBhp0HzZT8","jeskSbZLvS","oGu6xZUnqt","IBe8kRACuj","ru4UGpT8wu","TCgPpcmXIX","GSQwjECMvU","n8pJ9KZamH","VIlwPCNHmv",
+"aez9yy94nw","xXTI43weIF","uZPqgzQt6Q","0BmCyNcICA","QClRLlpF6W","7ku1pUlU3M","I7p2a9eoRc","uupzktvdkD","uupzkG1RhS","yofH3sx5Gl",
+"SbRYyIjTwP","uJScXGSQwj","Yf2EcCqqaD","Waim6lXFOB","FnPFBSmGzv","ZJTXH6AFT0","VIlwPCdyBV","ZJTXHWmadA","b29RJcQOnv","F6PT2yEfy9",
+"B3qem5drc6","AIYUuZhwG1","MmsIo1j5L8","SjskQ07n1c","0Wr5yEOE1o","MmKGJsuY4x","fcwDaQworu","Vprf2hE1Ql","7Ow5CzqH0W","zmLYDIn3NS",
+"0BmCyjS1aj","0KyfsBFkb8","0Wr5yFnPFB","2ZHdkReKEW","YOfrY4QMc9","YOfrY9GXkX","cL0aEgjUTu","hi5X7MmKGJ","jiVBPe6e4z","ogLgcn8pJ9",
+"gtCA5HP433","m4bxUK20wK","FxX9qhe9IA","5iGN5t59lR","BGaQYWaWsv","GrDg7azIWp","7X3uyAOgEe","BCxeCuupzk","9iGoTn1pmO","FGzgp5VZjS",
+"1LB1LuQIcz","KsjRKQnJ1S","Qworuatef2","0ao3lPOUYS","jzUqR0h1b1","IKxdL1v5hH","GWqqXgjUTu","CK5W7tAOsr","zqH0Wn8pJ9","5iGN5suY4x",
+"BFkb8oGu6x","1j5L8uAWyp","TCgPpnlaBy","HzZT8DG4sT","iB08lqUJMd","OxWIH0BmCy","gtCA5JKWYR","tlILtHfyNQ","IKxdLi3pyd","qQxHPgjUTu",
+"qQxHP1v5hH","iKqhrSjskQ","m4bxU1v5hH","uLtKsiB08l","dQ586aFFss","QYxC0Kr8ys","FwEJz0PktI","8hJdt16lHc","RmDcrL7cGc","9rlg9RBhp0",
+"qaofNYjB9t","iqv4kNxx9V","FnPFBI7p2a","cmXIX5drc6","8FmFHVBjhz","QClRLaL6AJ","HP433t59lR","yToGWZuDtD","xXTI48U2nU","mz8gxIRh48",
+"a00b5atef2","OUYuFGXdoH","QChxspAhR1","GXdoHgdQsS","3otm6F6PT2","Ta8f6QssNC","v1HlnEdBKc","ulk41gf8rI","yofH3WDVWJ","9GXkXxciqp",
+"HP433LDk6f","wDajXMojnP","29QAzYjB9t","mz8gxuJScX","ZuDtDDG4sT","cL0aEvLsmS","hUTw7lj07Q","RsQUqFLsph","KASQ8MGlTF","9eoRcsuY4x",
+"uPX7GogLgc","cL0aExReec","MGlTF9y4lw","qUJMdRkQke","07n1cW3VFH","Chuy3tvdkD","8FmFHfaHir","6AFT0ZzJHW","oQ87re6e4z","bgJAzSWfou",
+"X6PintvdkD","UmaEvzY1GY","bZLvSjS1aj","24ARFI7p2a","SjskQVIlwP","8RCUApiJSk","MojnPAmdQd","Q6hMCMkgy8","L7cGc8U2nU","qUJMd3weIF",
+"qQxHPyvOMI","gdQsSKsjRK","5IhmGiKqhr","y94nwNAFuw","2DREsgdQsS","I7p2aZ4I1v","CK5W7xciqp","0KyfstAOsr","nnP8o64s8N","CxVEfYf2Ec",
+"tjQxsydG8U","vkCHH0PktI","he9IAWmadA","JJs5mCp3mZ","AmdQdhE1Ql","ZJTXHyofH3","CIShGo8Uyd","cShY2SjskQ","VBjhzMaJQs","guMb8QnJ1S",
+"jiVBPtuDyS","LDk6fjSjS3","yofH3t59lR","ciuWztjQxs","rhl0JzbIYY","IKxdLvLsmS","zFgtBsqVrf","tAOsrIBe8k","0Wr5y8xEKz","XyPZNuQIcz",
+"brhlQFwEJz","s7MxkDQimp","lweGyNo0Qb","aFFssvLsmS","5nmWv1LB1L","FNYIMGWqqX","gjUTuoVQp6","QChxsciuWz","zFgtBrKDLJ","gjUTutvdkD",
+"SWfouKsjRK","9iGoTsqVrf","oVQp6618Di","OHaBztuDyS","hUTw7lsQGo","5Drn0YjB9t","dpe1vQnJ1S","uupzkZhwG1","zqH0WoVQp6","Q6hMCQChxs",
+"B3qemTwano","5Drn0W3VFH","okgRivOqCE","nFqikKZamH","618DiPYBf4","s4786aL6AJ","C2IrcciuWz","6AFT0Rxrsm","PYBf4DQimp","U3yw5zbIYY",
+"a00b5JRJQB","QYxC07ku1p","LDk6f14FLR","jtn0XTCgPp","Chuy3BGaQY","pAhR1s7Mxk","CNHmv6q6L9","0ao3lydG8U","Gv3FqsuY4x","NAFuwSWfou",
+"rz7UtjeskS","EoToP2TRI7","tjQxsd7vjM","9XyT9lCMxy","pT8wu5nmWv","CIShGGXdoH","M3zXL5drc6","dQ586nnP8o","bgJAzpmeCd","Gv3FqI7p2a",
+"No0QblpF6W","ReKEWFcWrW","L7cGcHlUbF","MezSWJXljW","QYxC0d85a9","JJs5mpWiOs","kZANmsoy9t","Ss0ZuyluBx","JXljWC2Irc","1v5hHIBe8k",
+"lViBv9eoRc","Uvlv4sqVrf","lsQGod7vjM","hSSvQPb1pa","2TRI7pFrrl","7Ow5CQWxoT","9GXkXkZANm","UlU3MAgJHQ","7fsYM2DREs","EOE1oni2v1",
+"hSSvQFLsph","d85a95Drn0","5Drn0sx5Gl","PYBf4OxWIH","StlDJhSSvQ","x3LDeJ2mQi","suY4xJJs5m","jS1ajFxX9q","aDGtSWreyP","FxX9qoGu6x",
+"zHF1q9XyT9","suY4xzQt6Q","jS1ajxXTI4","Yw2oUjiVBP","G1RhS16lHc","Gv3Fqni2v1","yluBxzz4ZU","StlDJwDajX","DLhzMv2eC3","Vprf2RmDcr",
+"WMiS3djsrv","lj07Qgf8rI","JXljWFNYIM","ECMvUokgRi","dmoS7hE1Ql","G1RhS9rlg9","yofH3G1RhS","OHaBz5drc6","EoToP0h1b1","jiVBPuN6r3",
+"GXdoHlViBv","EdBKcru4UG","ciuWzogLgc","iKqhrVprf2","2TRI7zFgtB","Waim62TRI7","gjUTuHP433","5drc6Waim6","Gv3Fq8hJdt","9eoRcM6qcG",
+"POUYSgIYvE","cL0aE5Mg9r","cShY2blLA9","wiHrZCfgr3","brhlQsqVrf","dpe1vpvgjS","SWfou3otm6","lsQGodmoS7","Vprf2lViBv","JkzUnzqH0W",
+"yvOMIZ4I1v","Cfgr3Twano","0YAGHfqypy","t59lR0ao3l","7Ow5Cxciqp","jzUqRMmKGJ","hi5X7mX2GE","UlU3M5ZaEz","Yw2oUYf2Ec","Nxx9V2Nslm",
+"QbxXci3pyd","tvdkDfFDrJ","blLA9FGzgp","gtCA5W3VFH","dQ586CdyBV","lm0pDQWxoT","y94nwAgJHQ","b29RJRzaZA","lViBvfcwDa","07n1cx3LDe",
+"PYBf4B3qem","tvdkDLDk6f","Mkgy8zbIYY","prNT6IRh48","GSQwjDLhzM","zHF1qrhl0J","Chuy3Twano","SjskQ9XyT9","uQIcz5ZaEz","he9IA9iGoT",
+"2Yz7Erhl0J","xciqpsx5Gl","ZJTXHqaofN","CK5W7b29RJ","QWxoTm4bxU","oQ87rQworu","Pb1paM6qcG","QYxC09y4lw","zbIYYUvlv4","Pb1paK20wK",
+"MmKGJ7lUXZ","MezSWnFqik","S77LHKASQ8","2Yz7ERxrsm","Kr8ysLewvM","zQt6QKsjRK","HfyNQzbIYY","nnP8o55rfB","0ao3lYOfrY","pmeCdWDVWJ",
+"zqH0WWPmlx","Zv7z045cIH","0YAGHMaJQs","jSjS34dEz6","FjHXRDLhzM","GrDg7LDk6f","Yf2EcWMiS3","HlUbFpiJSk","5drc62ZHdk","CNHmvv2eC3",
+"SmGzvVNCPd","l83Ud7lUXZ","nlaBy45cIH","WPmlxpvgjS","0ao3lZ4I1v","GrDg7Cfgr3","MaJQsQ6hMC","ZzJHW5ZaEz","uN6r3MaJQs","zHF1qFLsph",
+"1LB1LGrDg7","5Mg9r9eoRc","yofH3Mm8si","K4GS8xXTI4","blLA9gf8rI","7ku1pMezSW","fFDrJM6qcG","ulk41rhl0J","pWiOs0YAGH","Yf2EcBFkb8",
+"CIShGdjsrv","2hEEUM3zXL","ogLgcWMiS3","xReecnFqik","Mm8siiwzGk","Mm8sixXTI4","5iGN5yofH3","B3qempT8wu","TCgPpvkCHH","iB08luvf7A",
+"pAhR1s4786","JkzUn1j5L8","iwzGkfqypy","AkKTkVNCPd","NOHszbgJAz","ydG8UUmaEv","HzZT8djsrv","9GXkXnnP8o","3otm6gIYvE","0ao3lY1mC0",
+"16lHcK4GS8","AmdQdlpF6W","hUTw7GXdoH","ni2v19eoRc","ZhwG1QssNC","EOE1oCqqaD","v8yFNWMiS3","618Di4QMc9","fFDrJuupzk","RpBQmfLNg8",
+"zqH0WNcICA","gIYvE1j5L8","jeskSjeskS","9rlg9Yw2oU","t59lRDG4sT","lm0pDix74r","AOgEegf8rI","2NslmtuDyS","pWiOsRACuj","lsQGo8xEKz",
+"pvgjS0BmCy","MmsIoLDk6f","G1RhS24ARF","D6rByuoStw","kZANmkZANm","v1Hlnlm0pD","POUYS24ARF","Vprf2U3yw5","n8pJ98xEKz","M3zXLiKqhr",
+"45cIHmz8gx","FVMxoFnPFB","fqypydjsrv","Ul4a1rhl0J","Yh1hFs4786","VjCZq2Yz7E","AOgEeReKEW","EoToPS77LH","yofH3I7p2a","fFDrJnnP8o",
+"aez9yD6rBy","cL0aEm4bxU","TXQ0ZjS1aj","Gv3FqM3zXL","BpYhVtaOXK","SbRYyzHF1q","MK07YDcpWB","v8yFNUvlv4","lkMUAZzJHW","cL0aEK4GS8",
+"0ao3lh1zcH","Oz8yZAOgEe","RACujatef2","0h1b1azIWp","oVQp6yToGW","8hJdt5drc6","YjB9tRpBQm","RmDcrRkQke","Q6hMC24ARF","ni2v1FcWrW",
+"s7MxkReKEW","aez9y8FmFH","F6PT28xEKz","Mkgy8WreyP","ksJbytaOXK","5VZjSlH1kt","lj07Q5Drn0","5Drn0lViBv","O3iyQYf2Ec","XflUqKZamH",
+"s4786zQt6Q","M3zXLStlDJ","Nxx9VBpYhV","okgRituDyS","v2eC3Z4I1v","fFDrJMmsIo","FjHXRqUJMd","YjB9tLbRTH","IKxdL7lUXZ","t59lRPb1pa",
+"IBe8kiwzGk","WaWsvWMiS3","xXTI4TCgPp","WreyPVprf2","BpYhVWaWsv","64s8Ni3pyd","zFgtB6AFT0","prNT6Yh1hF","Uvlv4AmdQd","prNT6SWfou",
+"ulk41AIYUu","l83UdCfgr3","cmXIXni2v1","1LB1LtjQxs","djsrvPOUYS","1j5L87lUXZ","MK07YnFqik","t59lRC2Irc","azIWp1v5hH","aez9yZJTXH",
+"JJs5mTa8f6","aDGtSJkzUn","FwEJz9rlg9","Chuy3M3zXL","RxrsmHzZT8","HP433lkMUA","6AFT0s7Mxk","MezSW7ku1p","Dz1R3v1Hln","yToGW5IhmG",
+"QWxoTiB08l","3weIF3otm6","aDGtS5Namm","AIYUuh1zcH","2NslmfmIK1","ciuWz5drc6","lXFOBFLsph","9eoRctlILt","fLNg855rfB","FLsphtl72W",
+"5VZjSb29RJ","07n1c5nmWv","RmDcr0YAGH","5iGN5RsQUq","FLsphOz8yZ","LewvMlkMUA","tl72WVNCPd","UmaEvLbRTH","xciqpuQIcz","5VZjSFnPFB",
+"oVQp6RkQke","lViBvhe9IA","o8UydI7p2a","AIYUuDG4sT","M6qcG9GXkX","OUYuFNo0Qb","hUTw7jiVBP","618DiD6rBy","K4GS8VerEA","NcICAdhSuH",
+"RkQke1v5hH","RxrsmzFgtB","ZzJHW0ao3l","48cHLHRxd8","aFFssJ2mQi","0YAGHYh1hF","s4786oVQp6","tlILtYh1hF","5Drn0pFrrl","QssNCuoStw",
+"e6e4z5Mg9r","0ao3l5nmWv","7fKYUeuZA5","HlUbFCNHmv","1j5L8ZzJHW","k85AeuN6r3","ru4UGjiVBP","I7p2ataOXK","1LB1LlViBv","cmXIXlm0pD",
+"guMb8jeskS","FnPFBokgRi","FNYIMiKqhr","Mkgy8aL6AJ","8TxD7AXpwE","pv0i7qUJMd","QbxXcblLA9","0MR5XM3zXL","0KyfsUmaEv","I7p2aFPfSE",
+"U3yw5FGzgp","SjskQ2Yz7E","QbxXcJ2mQi","TXQ0ZjeskS","3weIFChuy3","djsrvi7WMQ","ZzJHWJKWYR","yToGW8cVD3","2TRI7soy9t","uN6r3WmadA",
+"VIlwPGXdoH","ulk41sx5Gl","JKWYRaFFss","wDajX4W0Tl","rKDLJsoy9t","Pb1paxciqp","24ARFh1zcH","7lUXZM3zXL","M3zXLKr8ys","8U2nU8cVD3",
+"s4786OxWIH","LDk6f2TRI7","0YAGHv1Hln","lViBvYw2oU","9GXkXi7WMQ","ZzJHWVerEA","b29RJFcWrW","pvgjSTwano","qQxHP8FmFH","KsjRKb29RJ",
+"S77LHHP433","M6qcGdhSuH","Q6Lix5ZaEz","lXFOBNhXdu","euZA5iqv4k","lm0pDYOfrY","soy9ti7WMQ","Yw2oU1LB1L","5Drn0Z4I1v","QnJ1SBFkb8",
+"djsrvGSQwj","uPX7G9GXkX","Cfgr3JXljW","JRJQBIjTwP","FnPFBIjTwP","DcpWBMm8si","24ARFSmGzv","tjQxss4786","VjCZqMGlTF","29QAz48cHL",
+"FcWrWK4GS8","8U2nU5Mg9r","jiVBPDG4sT","uN6r3WMiS3","NOHszsoy9t","Waim66AFT0","ZUnqtUvlv4","0PktISjskQ","CNHmvIRh48","1j5L8Mm8si",
+"2ZHdk2ZHdk","jeskSPOUYS","tl72Wb29RJ","jeskSyluBx","U3yw5azIWp","K20wKX6Pin","cShY2guMb8","QssNCVprf2","xReecgf8rI","Pb1padQ586",
+"580YD4W0Tl","uLtKsrKDLJ","uoStwHfyNQ","sx5GlNAFuw","uupzkU3yw5","aFFssQChxs","hUTw7dQ586","djsrvzmLYD","Mkgy8v2eC3","oGu6x2Nslm",
+"dmoS7Vprf2","SjskQrz7Ut","DcpWB24ARF","t98iWNxx9V","ReKEWfcwDa","uoStwuupzk","4dEz60MR5X","ulk4107n1c","lH1kttAOsr","ReKEWiKqhr",
+"JIqXiuoStw","gIYvENOHsz","fcwDaC2Irc","Cfgr3MmKGJ","2Yz7EIBe8k","GrDg7FnPFB","VNCPdM6qcG","D6rBy2DREs","9rlg9JkzUn","4dEz6C2Irc",
+"h1zcHTCgPp","Yw2oUlsQGo","M3zXLni2v1","7fsYM5drc6","2DREsVjCZq","zFgtBPOUYS","oQ87raL6AJ","4W0TlNAFuw","1v5hHC2Irc","i3pydl83Ud",
+"e6e4zD6rBy","MojnPBCxeC","8FmFHFPfSE","RmDcrReKEW","vkCHH55rfB","jtn0XZzJHW","Twano8hJdt","t98iWMK07Y","RxrsmRsQUq","JRJQB7hyVv",
+"uvf7A4W0Tl","HP433vkCHH","pAhR17ku1p","MezSWBFkb8","uJScX8hJdt","s4786W7cTs","CqqaD8U2nU","zQt6QM3zXL","vkCHHoGu6x","Chuy3suY4x",
+"ix74r6AFT0","YOfrYzQt6Q","nlaBy48cHL","tlILtbgJAz","QWxoT9GXkX","azIWpo8Uyd","o8Uydk85Ae","MezSWiB08l","jS1ajdQ586","pFrrlguMb8",
+"B3qemxXTI4","pFrrlYh1hF","qUJMdrKDLJ","pvgjSZJTXH","618DitlILt","OxWIHwiHrZ","vLsmSiB08l","gtCA5LbRTH","48cHLzQt6Q","lCMxyEOE1o",
+"nlaBy5Namm","ulk41cQOnv","pT8wu64s8N","d7vjMaFFss","ydG8Uatef2","KZamH5iGN5","yToGWlViBv","uoStw3otm6","FhtglFxX9q","cQOnv07n1c",
+"8xEKzhYBCK","t59lRYf2Ec","JJs5mFLsph","sqVrfQChxs","oGu6x7fKYU","U3yw5OHaBz","v8yFNYjB9t","DQimpCNHmv","dhSuHm4bxU","h1zcHlViBv",
+"7lUXZzY1GY","MezSWuoStw","WMiS3gdQsS","k85Ae9y4lw","taOXKfmIK1","FnPFBNxx9V","JIqXiuAWyp","lj07QciuWz","gIYvEI7p2a","jeskSL7cGc",
+"oVQp6LbRTH","ZJTXHIn3NS","CNHmvZJTXH","24ARFIRh48","CdyBVLewvM","brhlQD6rBy","QClRLReKEW","FxX9qHRxd8","5ZaEznnP8o","GWqqXZuDtD",
+"qUJMdhi5X7","uvf7AFPfSE","FNYIMjtn0X","FnPFBxReec","NOHszVjCZq","8xEKzRsQUq","mz8gxi7WMQ","djsrvsuY4x","aL6AJK4GS8","aFFsshYBCK",
+"qUJMds7Mxk","hi5X7brhlQ","X6Pinm4bxU","e6e4zazIWp","zQt6Qlj07Q","y94nwU3yw5","aL6AJn1pmO","J2mQiZzJHW","Yh1hF8cVD3","9XyT90ao3l",
+"rz7UteuZA5","SWfouLDk6f","uQIczAkKTk","Qworu55rfB","hUTw7IKxdL","XflUqMojnP","aDGtScShY2","MGlTFMmKGJ","o8UydzFgtB","Ss0Zu6q6L9",
+"4W0TldQ586","FVMxoix74r","ix74rWreyP","x3LDejeskS","5nmWvpvgjS","Vprf2RsQUq","BCxeCgjUTu","TCgPp9XyT9","oGu6xazIWp","n1pmOv2eC3",
+"vLsmSQYxC0","QnJ1SW7cTs","nFqikVNCPd","prNT6aFFss","OHaBzix74r","RkQkeY1mC0","VNCPdOz8yZ","cL0aExXTI4","Nxx9V5ZaEz","aL6AJuQIcz",
+"QbxXcix74r","Pb1paSWfou","7Ow5Cdpe1v","wDajX8cVD3","uQIczuN6r3","cShY2RBhp0","JKWYR07n1c","OHaBz5Drn0","8hJdtpAhR1","7lUXZMGlTF",
+"8TxD7wDajX","blLA9Qworu","9y4lwWDVWJ","vkCHHXflUq","QChxsVIlwP","ydG8UfFDrJ","FPfSEOHaBz","AXpwESmGzv","h1zcHAOgEe","uoStwlXFOB",
+"FwEJz7hyVv","qUJMduQIcz","ZhwG1M3zXL","0PktIGWqqX","Yf2Ecmz8gx","7lUXZ4W0Tl","jzUqRlkMUA","AXpwEzbIYY","1v5hHMGlTF","lCMxy9rlg9",
+"ZzJHWgIYvE","Nxx9V1v5hH","MaJQsuvf7A","ni2v1lXFOB","8TxD7Y1mC0","QClRLQbxXc","hi5X7HzZT8","lj07QpWiOs","M6qcGUvlv4","7lUXZXflUq",
+"MmKGJd7vjM","WDVWJv1Hln","CK5W7zQt6Q","iB08l5nmWv","1j5L8hE1Ql","RxrsmYh1hF","he9IAn8pJ9","wDajXnlaBy","ulk41QssNC","uQIczuTacx",
+"tAOsrGv3Fq","Uvlv49eoRc","MojnPOUYuF","U3yw5tAOsr","nlaBy2ZHdk","t59lRK20wK","8TxD7B3qem","jtn0X0PktI","4dEz6IKxdL","v2eC3FwEJz",
+"djsrvFNYIM","1LB1LlXFOB","9y4lwX6Pin","piJSkZzJHW","D6rByXyPZN","bZLvSt98iW","QssNCP6bcg","AgJHQpvgjS","J2mQioGu6x","0BmCyO3iyQ",
+"Yh1hFfaHir","t59lRRkQke","9rlg9prNT6","xciqpjfREu","CdyBVlkMUA","3otm63otm6","7lUXZydG8U","QYxC0MK07Y","RmDcrQworu","1v5hHFPfSE",
+"cmXIXQssNC","pWiOsIn3NS","ZzJHW1v5hH","uLtKsStlDJ","he9IAFLsph","MmKGJXyPZN","n8pJ92ZHdk","piJSk0BmCy","618DiWaWsv","fcwDaKr8ys",
+"kZANmHfyNQ","3weIFzQt6Q","5IhmGzHF1q","yToGWjfREu","pvgjSmz8gx","LbRTHlkMUA","euZA5CqqaD","fcwDaZv7z0","8FmFHDG4sT","M3zXLFFDui",
+"pWiOsUlU3M","StlDJYjB9t","CxVEfzqH0W","jSjS3EdBKc","lweGyW7cTs","jfREu9GXkX","29QAzS2Dfu","XflUqFGzgp","d85a9MGlTF","ZuDtDVjCZq",
+"9rlg9RpBQm","UmaEvO3iyQ","0MR5Xs93Ml","5drc6Q6Lix","AIYUulsQGo","8FmFHHP433","1j5L8soy9t","SbRYye6e4z","v8yFNiKqhr","suY4xIjTwP",
+"tjQxs5iGN5","JKWYRVLTy6","fLNg8oGu6x","LbRTHgf8rI","o8UyduJScX","TCgPpNo0Qb","o8UydlViBv","Fhtgl9eoRc","s7Mxk2ZHdk","jfREuReKEW",
+"7hyVv9iGoT","Q6LixkZANm","YjB9tlm0pD","XyPZN5drc6","K4GS8i3pyd","l83UdMmsIo","yEfy9AOgEe","ciuWzS2Dfu","djsrvEOE1o","jSjS3CxVEf",
+"d85a98FmFH","K4GS8xReec","DG4sTsx5Gl","mz8gx9eoRc","3otm6gtCA5","kZANmoQ87r","9rlg9IjTwP","guMb80MR5X","JJs5mjSjS3","uTacxNxx9V",
+"QnJ1SMojnP","6AFT0ZhwG1","C2IrcEOE1o","nFqikuN6r3","ogLgcOHaBz","uJScX2ZHdk","fFDrJ8TxD7","n1pmOJ2mQi","7fKYUjSjS3","MmKGJQ6Lix",
+"zQt6QBbwgA","Ul4a1DQimp","Yw2oUIKxdL","lH1ktciuWz","a00b5pv0i7","X6Pin2DREs","MaJQsHP433","prNT6tlILt","lXFOBblLA9","Yh1hF7X3uy",
+"dmoS7rhl0J","Vprf20Kyfs","iqv4k5Mg9r","aez9ywiHrZ","AOgEeiqv4k","VNCPdgjUTu","RxrsmUlU3M","0BmCy3weIF","pv0i7Gv3Fq","CK5W7IRh48",
+"Vprf2cL0aE","2NslmQssNC","he9IAh1zcH","S2DfuOHaBz","JXljWMmsIo","VIlwPv8yFN","RzaZA7hyVv","7X3uy0MR5X","s4786ogLgc","5ZaEzcmXIX",
+"lweGyn8pJ9","3otm6S2Dfu","JkzUnnFqik","FPfSEt59lR","cL0aE0ao3l","618DiQbxXc","nnP8oOHaBz","ogLgcNAFuw","qaofNguMb8","0MR5XRpBQm",
+"0PktIOxWIH","xReecMGlTF","uAWyprz7Ut","qQxHPYh1hF","pFrrl7fKYU","G1RhS48cHL","WMiS3CNHmv","CdyBV55rfB","DLhzMP6bcg","No0Qbt98iW",
+"JJs5ml83Ud","AkKTkaDGtS","lweGyF6PT2","Ul4a1L7cGc","WaWsvtl72W","yvOMIZUnqt","y94nwlH1kt","zbIYYMezSW","UlU3MgjUTu","J2mQiNOHsz",
+"vLsmSCIShG","lViBvZhwG1","FGzgpqaofN","9y4lwTCgPp","aez9y4W0Tl","s4786CqqaD","NhXduQWxoT","Vprf25Drn0","AIYUufqypy","Ul4a1blLA9",
+"SmGzvUl4a1","9iGoTU3yw5","Ul4a1618Di","Dz1R3ogLgc","kB5nPQ6hMC","0PktILDk6f","hi5X7Dz1R3","1v5hHQssNC","RmDcrRzaZA","zmLYDcL0aE",
+"QWxoTJIqXi","jeskStl72W","lH1ktFxX9q","Chuy3hYBCK","oVQp6aDGtS","Zv7z0l83Ud","MGlTFAOgEe","mX2GE618Di","QssNCoGu6x","lH1ktK4GS8",
+"5VZjSsoy9t","DQimpNcICA","m4bxUSs0Zu","OUYuF2Nslm","atef28RCUA","3otm6QChxs","8cVD3RsQUq","WmadAHRxd8","EoToPQ6hMC","VIlwPJIqXi",
+"BGaQYYh1hF","wiHrZIRh48","IBe8kMGlTF","ThjNn5ZaEz","Yh1hFJJs5m","RACujUvlv4","Ta8f6kZANm","VjCZqTCgPp","MaJQsNo0Qb","BFkb83otm6",
+"x3LDeqaofN","xReecuZPqg","AgJHQTwano","CxVEfpiJSk","uQIczwDajX","rhl0J9eoRc","AmdQdBCxeC","ZzJHWlViBv","AIYUujtn0X","IBe8kPOUYS",
+"HP433e6e4z","QChxs6AFT0","BGaQYYOfrY","xReect59lR","XyPZNgtCA5","K4GS8uvf7A","7ku1pyToGW","yofH3NAFuw","Gv3FqpvgjS","0YAGHAIYUu",
+"9iGoT5ZaEz","Z4I1vNxx9V","2DREsNAFuw","RBhp0ZhwG1","F6PT25VZjS","LbRTHpvgjS","VLTy6RmDcr","5Mg9rvOqCE","D6rByzHF1q","ni2v1L7cGc",
+"BCxeCxXTI4","3weIFaFFss","ECMvUG1RhS","brhlQXflUq","pT8wuAXpwE","8xEKzaL6AJ","TwanoFcWrW","8U2nURsQUq","nnP8oQworu","HzZT8d85a9",
+"pFrrlJRJQB","uPX7Glm0pD","tuDySm4bxU","s4786CIShG","0Wr5y5nmWv","CIShGWmadA","0ao3lJRJQB","2ZHdk9iGoT","oGu6xNOHsz","2ZHdkpmeCd",
+"o8Uydpv0i7","5NammqUJMd","sx5Glsx5Gl","0YAGHRzaZA","cmXIXtvdkD","rz7UtyToGW","uLtKsCK5W7","AXpwEKr8ys","gjUTuY1mC0","Ss0ZuRBhp0",
+"7ku1p5ZaEz","WMiS3NAFuw","ksJbyMK07Y","QssNCv8yFN","Yf2EczFgtB","0KyfszFgtB","x3LDeM3zXL","yEfy9ni2v1","jeskSdhSuH","HP433iqv4k",
+"pvgjS24ARF","t59lRBGaQY","OHaBzIBe8k","FxX9qTCgPp","zmLYDbrhlQ","ksJbyLDk6f","RzaZAni2v1","jzUqRVLTy6","gdQsSblLA9","Yf2EcBCxeC",
+"7fKYUCdyBV","RxrsmGSQwj","zFgtBxReec","RACujY1mC0","SbRYyMK07Y","uJScX5Mg9r","x3LDeaez9y","tl72WGrDg7","suY4x0YAGH","fcJOyUmaEv",
+"TXQ0ZuPX7G","QChxsZzJHW","SWfouPYBf4","s7MxkxReec","iB08lMojnP","jzUqRyofH3","8RCUAFjHXR","S77LHt98iW","suY4xTXQ0Z","C2Irc8hJdt",
+"dpe1vFVMxo","QnJ1SZ4I1v","8U2nURxrsm","S77LHRkQke","5NammDG4sT","QworuyluBx","lkMUARzaZA","RzaZAW3VFH","Kr8ysX6Pin","Twanov2eC3",
+"0MR5XbgJAz","CdyBVaFFss","MaJQsMojnP","Oz8yZFcWrW","nlaByY1mC0","LbRTH5nmWv","StlDJfaHir","pT8wus93Ml","b29RJS77LH","s4786lkMUA",
+"EoToPcQOnv","nnP8otl72W","tl72Wsoy9t","U3yw5Dz1R3","D6rBy16lHc","4QMc9WmadA","8cVD30Kyfs","G1RhSCK5W7","vLsmSNOHsz","7Ow5CSs0Zu",
+"9GXkXUlU3M","HlUbFpv0i7","Kr8ysuoStw","0BmCy9GXkX","ZJTXHyvOMI","gjUTu8cVD3","pWiOsuZPqg","tl72Watef2","FjHXRuTacx","t98iWHzZT8",
+"I7p2asuY4x","48cHLnlaBy","prNT6zFgtB","HP433Waim6","JJs5mNo0Qb","FhtglStlDJ","7fKYUM3zXL","GSQwjk85Ae","Q6LixUmaEv","d7vjM07n1c",
+"ECMvUF6PT2","dhSuHTa8f6","29QAzAkKTk","RzaZAZJTXH","gf8rIiB08l","Yw2oU29QAz","FPfSEyofH3","YOfrYQbxXc","2Yz7E29QAz","Waim6Y1mC0",
+"bgJAz4QMc9","I7p2auoStw","ZhwG17ku1p","NOHsz24ARF","pWiOsXflUq","oQ87rlpF6W","qaofNX6Pin","UlU3MWDVWJ","k85AeWreyP","VIlwP16lHc",
+"JXljW7X3uy","TCgPppAhR1","tvdkDzHF1q","MojnPfLNg8","Chuy38TxD7","Vprf21v5hH","uupzkSWfou","8RCUALDk6f","4dEz61j5L8","Mkgy8K20wK",
+"iB08lhSSvQ","ZJTXHZJTXH","2TRI7OUYuF","ZzJHWGrDg7","xciqplCMxy","fcJOyv2eC3","WMiS3G1RhS","TXQ0ZS2Dfu","EOE1oogLgc","cShY2euZA5",
+"OHaBzuoStw","euZA5tuDyS","FcWrW8cVD3","lViBvFNYIM","fqypyt59lR","jSjS3zHF1q","2NslmVNCPd","bgJAzuN6r3","fcwDaaL6AJ","XyPZN07n1c",
+"OHaBzyvOMI","QworuSjskQ","vOqCEHP433","FNYIMuTacx","5NammFjHXR","ni2v1iB08l","SWfoui3pyd","nFqiksqVrf","v8yFNOUqFM","djsrv7X3uy",
+"yluBx2DREs","HP433zFgtB","FnPFB8hJdt","3otm6BbwgA","7fsYMjtn0X","Waim6yofH3","4W0TlGrDg7","yToGWStlDJ","BFkb8oQ87r","n8pJ99iGoT",
+"jS1ajC2Irc","RBhp0In3NS","DG4sTwiHrZ","pT8wu0Kyfs","vOqCEBpYhV","cmXIXaDGtS","nlaByJXljW","lkMUAMmKGJ","CIShGsqVrf","JXljWWreyP",
+"dpe1v7fsYM","fqypyJKWYR","cQOnvQ6Lix","LDk6fJXljW","brhlQaL6AJ","faHiruoStw","ZzJHWWMiS3","AmdQduAWyp","lCMxyD6rBy","0YAGH2TRI7",
+"ZJTXH2Yz7E","uPX7GgtCA5","lsQGoFFDui","d7vjMqUJMd","pAhR1W7cTs","0PktIkB5nP","KZamHOUYuF","n1pmOzY1GY","soy9tF6PT2","NAFuwydG8U",
+"ksJbyzQt6Q","FcWrWsuY4x","lCMxyZJTXH","VjCZq5Namm","XflUqU3yw5","QClRLpv0i7","zFgtBGrDg7","7X3uyHfyNQ","v8yFNsuY4x","hE1QlStlDJ",
+"EoToPC2Irc","OxWIHl83Ud","0Wr5ygjUTu","U3yw5DcpWB","mz8gxhUTw7","QbxXc6AFT0","Waim6fmIK1","45cIHa00b5","wDajXblLA9","yToGWksJby",
+"Ul4a1Gv3Fq","vOqCERpBQm","Yh1hFJ2mQi","VLTy6n1pmO","HzZT8FFDui","ksJbyaL6AJ","lViBvWreyP","s93MlzHF1q","dQ586Qworu","RkQkeaFFss",
+"XflUqfcJOy","Kr8yswDajX","uoStw7hyVv","zHF1qaDGtS","fFDrJNxx9V","RsQUqRzaZA","GWqqXs4786","t59lRuZPqg","azIWpaDGtS","8RCUAyofH3",
+"FcWrWHlUbF","uQIczCK5W7","uTacxPYBf4","zz4ZUs7Mxk","4QMc9dQ586","MezSWv1Hln","8hJdtzHF1q","StlDJfFDrJ","mX2GE16lHc","VIlwPxXTI4",
+"7hyVvv2eC3","IRh48cL0aE","iwzGkRACuj","WPmlxCfgr3","64s8Ndjsrv","9rlg9oVQp6","kB5nPEdBKc","RzaZAMojnP","oQ87r5Drn0","MojnPAIYUu",
+"iKqhr5nmWv","KsjRKCqqaD","Kr8ys9iGoT","FnPFB5nmWv","uvf7AYh1hF","HP4337fKYU","5ZaEzF6PT2","tjQxsulk41","rhl0JiKqhr","rz7UtuZPqg",
+"rKDLJyToGW","MmsIotl72W","RBhp0AOgEe","9XyT9fFDrJ","FcWrWogLgc","y94nwY1mC0","gjUTuAIYUu","uQIczm4bxU","QChxsJJs5m","KASQ8FFDui",
+"qaofNt59lR","UmaEvGWqqX","t98iWD6rBy","zHF1qqUJMd","7lUXZs4786","ECMvUBFkb8","t59lRvkCHH","ReKEWsx5Gl","vLsmSQClRL","0ao3lXflUq",
+"atef2a00b5","MmKGJG1RhS","oVQp6ksJby","VIlwPtl72W","Uvlv4SbRYy","Waim6ECMvU","I7p2ad85a9","lH1ktW7cTs","y94nwQnJ1S","uAWyprhl0J",
+"zQt6QciuWz","fLNg8FcWrW","Mkgy8jfREu","Fhtgl0YAGH","VIlwP4W0Tl","Ul4a1QChxs","7hyVvAkKTk","Mkgy8W3VFH","soy9tHlUbF","9y4lwOz8yZ",
+"pmeCduTacx","9GXkXJkzUn","RzaZAM6qcG","kZANmjzUqR","dmoS7hi5X7","O3iyQEoToP","MojnPjtn0X","zFgtBjSjS3","jiVBPsoy9t","VBjhznlaBy",
+"SWfoua00b5","lH1ktZUnqt","jiVBP9iGoT","X6PinzQt6Q","piJSkLewvM","L7cGcAXpwE","9iGoTMkgy8","pWiOscmXIX","ni2v1HfyNQ","No0QbjzUqR",
+"tjQxsbrhlQ","580YDlkMUA","RxrsmjS1aj","i3pydAIYUu","v8yFNblLA9","wDajXKASQ8","55rfBJkzUn","CK5W7AgJHQ","tl72WGSQwj","Mm8siFjHXR",
+"iwzGkQYxC0","7lUXZnFqik","n8pJ9hSSvQ","Cfgr3Ss0Zu","uTacxXyPZN","7X3uypWiOs","5Mg9rHlUbF","yofH39eoRc","0YAGHWPmlx","RBhp0AkKTk",
+"3weIFHzZT8","pFrrl9eoRc","xciqpQChxs","cShY25ZaEz","suY4xWaim6","RxrsmY1mC0","zHF1qNhXdu","ciuWzzmLYD","gjUTuEOE1o","Cfgr3xXTI4",
+"x3LDe8U2nU","TCgPpdpe1v","618Dixciqp","RxrsmgtCA5","Vprf24W0Tl","CxVEf618Di","uvf7A64s8N","JKWYRRzaZA","8cVD3v1Hln","aFFsstuDyS",
+"m4bxUgdQsS","gjUTuh1zcH","EOE1ozbIYY","FLsph2Yz7E","TCgPplH1kt","FFDuiX6Pin","GWqqX9y4lw","dmoS7RBhp0","TwanoGv3Fq","O3iyQsuY4x",
+"7Ow5C5ZaEz","S77LHM3zXL","l83Udb29RJ","EoToPUl4a1","h1zcHMojnP","azIWptjQxs","1j5L8NAFuw","jfREuyvOMI","qQxHPzHF1q","IBe8kkB5nP",
+"ZJTXHX6Pin","sqVrfatef2","pv0i7tuDyS","OHaBzprNT6","Z4I1vfaHir","i7WMQtuDyS","KsjRKmX2GE","Mm8siZUnqt","prNT6CNHmv","QYxC0fqypy",
+"UmaEvd7vjM","DQimpwiHrZ","POUYSfaHir","1v5hHMaJQs","yluBxM3zXL","pT8wuG1RhS","64s8NBpYhV","ZJTXH8FmFH","blLA99rlg9","NAFuwJkzUn",
+"brhlQ0ao3l","O3iyQGSQwj","AIYUu2ZHdk","xReecpFrrl","zbIYYYOfrY","pFrrlKZamH","9XyT9jfREu","JJs5mKsjRK","uTacxZv7z0","Ss0Zu0h1b1",
+"KZamHv1Hln","ydG8UlpF6W","hUTw7VBjhz","W7cTsBCxeC","In3NSC2Irc","Dz1R3xciqp","618DitvdkD","dQ586EdBKc","3weIFjeskS","9y4lw16lHc",
+"ZhwG1i7WMQ","ZJTXH5VZjS","MojnPU3yw5","5NammRzaZA","5nmWvAXpwE","BFkb8W7cTs","OHaBzs7Mxk","pWiOse6e4z","zbIYY5ZaEz","2hEEUdhSuH",
+"hSSvQuQIcz","8cVD3Qworu","4W0Tl64s8N","zFgtBIKxdL","Z4I1v5VZjS","QWxoTW7cTs","AgJHQNo0Qb","JXljWgjUTu","lXFOBfcJOy","07n1cFVMxo",
+"NAFuwWDVWJ","fqypyWaWsv","mz8gxuN6r3","IjTwPBGaQY","2TRI7VIlwP","4dEz6iwzGk","Oz8yZuAWyp","yvOMIJIqXi","d7vjMs7Mxk","QWxoThUTw7",
+"FVMxoBCxeC","gjUTui7WMQ","lXFOBMezSW","yvOMIZv7z0","rKDLJVLTy6","gIYvEMmKGJ","t59lR0h1b1","FLsphLbRTH","prNT6pT8wu","580YD4dEz6",
+"ru4UGsqVrf","IRh48kB5nP","KZamHDcpWB","VIlwPa00b5","DQimpJJs5m","FjHXRjS1aj","KASQ89eoRc","x3LDeIjTwP","BGaQYvkCHH","K20wKUlU3M",
+"FhtgloGu6x","Yw2oUuvf7A","580YDCp3mZ","FGzgpsuY4x","IKxdLD6rBy","Vprf2UlU3M","djsrvjeskS","BpYhVKr8ys","v1HlnW7cTs","tlILt7lUXZ",
+"taOXK6AFT0","yvOMIuN6r3","ZJTXH5drc6","pFrrlReKEW","IBe8k9XyT9","jfREuGSQwj","In3NSMK07Y","HzZT8uLtKs","DQimpgdQsS","faHirv8yFN",
+"OUqFMMK07Y","O3iyQd85a9","QClRLdjsrv","hUTw78xEKz","zY1GYVerEA","FGzgpZUnqt","djsrvCxVEf","8xEKzRxrsm","s93MlJIqXi","6AFT0FPfSE",
+"BFkb8XyPZN","xciqp45cIH","Waim6uupzk","BGaQYsx5Gl","pvgjStl72W","nnP8ojiVBP","yEfy9VLTy6","AgJHQtAOsr","DcpWBk85Ae","ThjNnRzaZA",
+"TwanofaHir","xReec1j5L8","CdyBVFhtgl","P6bcgpT8wu","618DisuY4x","iqv4ky94nw","Cp3mZ0YAGH","fmIK1S77LH","zbIYYsx5Gl","CqqaDAgJHQ",
+"RACujgf8rI","Pb1pagIYvE","OHaBzLbRTH","fFDrJ9XyT9","jSjS3M3zXL","QssNCK4GS8","fcwDaQbxXc","BpYhV0PktI","0ao3lhe9IA","KsjRKoGu6x",
+"QWxoTlj07Q","MojnP5ZaEz","0YAGHDQimp","16lHc07n1c","Nxx9VmX2GE","kB5nPHRxd8","LDk6f5Mg9r","WDVWJtjQxs","5IhmGGWqqX","JkzUnYjB9t",
+"n1pmOKr8ys","qUJMdYOfrY","RACuj4dEz6","POUYSKsjRK","Yw2oUjS1aj","euZA5NhXdu","Cfgr345cIH","aDGtSQ6Lix","4QMc9pWiOs","J2mQih1zcH",
+"9iGoTprNT6","yEfy9Ss0Zu","G1RhSI7p2a","8FmFH5IhmG","rhl0JfmIK1","uQIczF6PT2","faHirSmGzv","0BmCytlILt","MmKGJe6e4z","PYBf4No0Qb",
+"2Yz7EUvlv4","hSSvQs7Mxk","S77LHQClRL","HzZT8wDajX","48cHLrhl0J","fFDrJGv3Fq","dmoS72Yz7E","ciuWzZuDtD","piJSktjQxs","VjCZqdpe1v",
+"fcJOyFcWrW","ciuWzD6rBy","uAWypblLA9","cShY2i3pyd","Uvlv40BmCy","9iGoThe9IA","ZzJHWCfgr3","Oz8yZJkzUn","5iGN5CK5W7","VLTy6QbxXc",
+"XflUqI7p2a","QYxC0OHaBz","8U2nUfcwDa","taOXK24ARF","Dz1R3kZANm","yEfy9AgJHQ","aez9yWDVWJ","QbxXcFjHXR","iqv4kGv3Fq","fqypyxciqp",
+"dmoS7pWiOs","rz7UtPOUYS","CxVEfVerEA","XyPZNv8yFN","l83UdQworu","2Yz7EzFgtB","MGlTFO3iyQ","tjQxs0PktI","Dz1R3o8Uyd","2DREsQClRL",
+"9eoRcVNCPd","o8UydsuY4x","WDVWJuAWyp","tlILtwiHrZ","xXTI4vkCHH","VIlwPJ2mQi","RpBQmStlDJ","zHF1qs93Ml","zqH0WVerEA","1v5hHy94nw",
+"3weIFtlILt","Z4I1vcmXIX","S77LH8cVD3","TwanoKZamH","rhl0JKZamH","HfyNQwiHrZ","okgRiv2eC3","sqVrf3weIF","uoStwZuDtD","K4GS8C2Irc",
+"IBe8kZzJHW","AOgEezHF1q","2ZHdkcQOnv","AIYUuSs0Zu","uPX7G7X3uy","Yf2Ect59lR","zFgtBiKqhr","gf8rIJkzUn","FxX9qzHF1q","prNT60h1b1",
+"gjUTuaL6AJ","rz7UtTXQ0Z","uQIcziwzGk","QChxse6e4z","SjskQZv7z0","JIqXiEoToP","oVQp664s8N","S77LHx3LDe","C2Irc8FmFH","suY4xpv0i7",
+"vkCHHgIYvE","lViBvdjsrv","4dEz6FFDui","yofH3Cfgr3","fLNg8ru4UG","oQ87ruoStw","QbxXcSbRYy","yvOMIVIlwP","UmaEv1v5hH","OHaBzZ4I1v",
+"Oz8yZ8U2nU","LbRTHWPmlx","RmDcrfqypy","5nmWvGv3Fq","ThjNnOxWIH","SjskQZzJHW","yluBxQChxs","uJScXVprf2","IKxdLQssNC","8U2nUxciqp",
+"Oz8yZtAOsr","Oz8yZFxX9q","SbRYyB3qem","FxX9qcmXIX","MGlTFLewvM","SWfouUl4a1","tjQxs8cVD3","9y4lwe6e4z","AgJHQlpF6W","tl72W8FmFH",
+"FNYIM16lHc","jiVBPjSjS3","dQ586m4bxU","VNCPdW7cTs","OHaBzdmoS7","oQ87ryvOMI","TXQ0ZnnP8o","tAOsrAIYUu","fqypyguMb8","5IhmGThjNn",
+"lViBvatef2","faHirv2eC3","hUTw7OxWIH","gdQsS9iGoT","tlILto8Uyd","C2Irc7hyVv","4W0TlyToGW","pFrrlzz4ZU","G1RhSRsQUq","Z4I1vUlU3M",
+"suY4xtl72W","WmadAlXFOB","Kr8ysblLA9","GXdoHmX2GE","n1pmOMezSW","jtn0XBGaQY","Y1mC0nnP8o","POUYSqaofN","2hEEUKr8ys","Ss0ZuVIlwP",
+"t59lRpv0i7","CIShG8cVD3","No0Qbv8yFN","TCgPpYh1hF","aDGtS0Wr5y","Mm8siMmKGJ","WreyPLDk6f","x3LDeYjB9t","1LB1LJXljW","LDk6ffLNg8",
+"ReKEWIn3NS","Q6Lix2ZHdk","VIlwPqUJMd","StlDJWaim6","0MR5XWaim6","VerEAv8yFN","JJs5mMGlTF","WPmlx0PktI","VerEAG1RhS","FNYIMCNHmv",
+"CxVEf29QAz","4QMc9VNCPd","CNHmvatef2","5NammtuDyS","BpYhVv1Hln","JkzUn2Yz7E","RACujF6PT2","VIlwPGv3Fq","dQ586uvf7A","ECMvUxciqp",
+"QYxC04dEz6","J2mQi45cIH","TXQ0Zfqypy","OxWIHmz8gx","AOgEeVBjhz","CdyBVzz4ZU","uPX7Gaez9y","AXpwETCgPp","G1RhSzmLYD","2Yz7ESmGzv",
+"uQIczni2v1","iqv4kpv0i7","lm0pDRkQke","MK07YZJTXH","MezSWgf8rI","SmGzvkB5nP","kZANmpmeCd","yluBxFjHXR","kB5nPlm0pD","iqv4k5drc6",
+"8cVD3RpBQm","WaWsvjS1aj","fqypySmGzv","ZzJHWiqv4k","gtCA5n8pJ9","ReKEWJ2mQi","16lHciKqhr","GXdoH9y4lw","dhSuHBCxeC","Ss0Zu29QAz",
+"VLTy68xEKz","POUYSs7Mxk","lkMUA0ao3l","QnJ1SZuDtD","SmGzvFLsph","ix74rFGzgp","45cIHRxrsm","VerEAOHaBz","dhSuHFxX9q","ydG8UblLA9",
+"uAWypWPmlx","EdBKcfcwDa","ulk41lXFOB","fLNg8QYxC0","MGlTFM3zXL","ulk41HP433","lkMUAZ4I1v","HP433pvgjS","4dEz6QssNC","wiHrZ9iGoT",
+"ZUnqt0Wr5y","CqqaDZUnqt","7fKYUuTacx","ZzJHWW7cTs","lpF6W0Wr5y","0ao3lZhwG1","he9IAfcwDa","lpF6Wix74r","BGaQYuZPqg","mz8gxtvdkD",
+"Yf2EcjiVBP","3weIF55rfB","zbIYYQChxs","6AFT0StlDJ","QnJ1SIKxdL","Yw2oUFnPFB","cQOnvdjsrv","iqv4knnP8o","ogLgcsqVrf","0PktIuZPqg",
+"Cfgr3iqv4k","h1zcHWPmlx","48cHL580YD","Yh1hFDG4sT","uTacxWmadA","aDGtS9XyT9","NAFuwAIYUu","AIYUufmIK1","5nmWvCp3mZ","XyPZN7fsYM",
+"gtCA5zbIYY","RxrsmB3qem","ZzJHWmz8gx","NhXdufmIK1","x3LDeLewvM","NhXduuTacx","lViBvrhl0J","W7cTsFjHXR","tuDySl83Ud","2TRI7zz4ZU",
+"SjskQXflUq","cL0aEkZANm","zbIYYFcWrW","MojnPuTacx","YjB9tCdyBV","FGzgp7X3uy","zQt6Q0YAGH","SmGzvBbwgA","hYBCK16lHc","CK5W7yToGW",
+"Q6LixpiJSk","iKqhryluBx","JKWYRtAOsr","jfREuCqqaD","oVQp6XyPZN","BbwgA9rlg9","uupzkatef2","MezSWuJScX","4QMc9hE1Ql","jSjS3WaWsv",
+"MGlTF8RCUA","XflUqtAOsr","6AFT0HzZT8","8RCUAlViBv","Oz8yZKASQ8","24ARFFPfSE","xReectl72W","7lUXZWaim6","b29RJxXTI4","Y1mC0BpYhV",
+"8TxD75Mg9r","qQxHPSjskQ","lCMxyMmKGJ","QworuYh1hF","UlU3M7hyVv","JXljWWPmlx","S2Dfu55rfB","zFgtBFhtgl","OUqFMsoy9t","L7cGcP6bcg",
+"Yw2oUNhXdu","RkQkehi5X7","LbRTHI7p2a","M6qcG5VZjS","xReecHlUbF","M6qcGWaWsv","SWfou2Yz7E","LewvMwiHrZ","BFkb8Ta8f6","gf8rIMGlTF",
+"AgJHQMaJQs","guMb8aDGtS","gdQsSUl4a1","DLhzMGv3Fq","CdyBVM3zXL","EOE1oDz1R3","uN6r30BmCy","QClRLUvlv4","iwzGkTwano","dmoS7zmLYD",
+"uupzk2ZHdk","9rlg9FjHXR","v2eC3Vprf2","lj07Q7ku1p","s93MlIn3NS","QbxXcfmIK1","45cIHdQ586","pv0i7NAFuw","n1pmOMojnP","FFDuiLewvM",
+"y94nwCxVEf","gIYvEB3qem","MGlTFs93Ml","hE1Qlt59lR","VerEAhUTw7","fcJOyQ6hMC","OUYuFni2v1","BFkb8JRJQB","gjUTuGXdoH","8cVD3hUTw7",
+"0MR5XsqVrf","TwanociuWz","uJScXZJTXH","Vprf2guMb8","64s8Nxciqp","ydG8URzaZA","djsrvWDVWJ","BFkb8Dz1R3","lsQGoMK07Y","7Ow5CQ6Lix",
+"JIqXiRxrsm","8U2nUfaHir","tjQxsix74r","CxVEfuN6r3","UlU3MuoStw","P6bcg4QMc9","MK07YECMvU","SWfouzz4ZU","dhSuH9eoRc","guMb8zQt6Q",
+"s4786tl72W","ZuDtDLDk6f","RkQkePOUYS","euZA5aFFss","TCgPpMGlTF","vOqCEAXpwE","Yh1hFxReec","uQIczStlDJ","Nxx9VF6PT2","GSQwjNhXdu",
+"qUJMdI7p2a","ogLgcFcWrW","hSSvQQssNC","14FLR8RCUA","Nxx9VcmXIX","EdBKcOUYuF","NAFuwL7cGc","azIWp4QMc9","uQIczK20wK","ru4UGv8yFN",
+"ni2v129QAz","ksJbyuPX7G","9y4lwJJs5m","9iGoTdhSuH","GrDg7tuDyS","jS1ajZUnqt","EOE1oOUYuF","5nmWvgIYvE","9GXkXFwEJz","oVQp67fsYM",
+"oVQp6gtCA5","Oz8yZMmsIo","55rfBmz8gx","tlILtNAFuw","aDGtS14FLR","CIShGBCxeC","Zv7z0VIlwP","sx5GlqQxHP","Y1mC0t98iW","G1RhSru4UG",
+"FwEJzNAFuw","AgJHQ3weIF","gdQsS5VZjS","SWfouLewvM","ogLgc9GXkX","W3VFHaDGtS","1j5L80Wr5y","uTacxlweGy","2TRI7Fhtgl","0h1b1uAWyp",
+"fcwDaHfyNQ","7X3uyHRxd8","07n1ciqv4k","WreyPjeskS","8xEKzFhtgl","Z4I1vVprf2","9eoRcDz1R3","ZJTXH9eoRc","5NammVLTy6","VIlwPWaWsv",
+"ogLgcv1Hln","7fKYUQworu","ni2v12ZHdk","Pb1pafcJOy","9y4lw0YAGH","uN6r32ZHdk","I7p2aRpBQm","KASQ8Twano","LDk6fHRxd8","HP433lViBv",
+"zFgtBTa8f6","OUqFMy94nw","FFDuiMm8si","ZzJHWNhXdu","ZJTXHK4GS8","FGzgpMGlTF","b29RJuupzk","WDVWJd7vjM","zHF1qfcwDa","gjUTuuJScX",
+"C2IrcfLNg8","ZzJHWXflUq","Mkgy8m4bxU","yvOMIVerEA","xXTI40ao3l","jfREuIBe8k","3weIFnlaBy","cmXIXjS1aj","7ku1p8U2nU","ksJbyWreyP",
+"b29RJZuDtD","uPX7GBpYhV","ZUnqtSjskQ","MezSWlpF6W","QssNC1LB1L","Y1mC0B3qem","HfyNQiB08l","JXljWpWiOs","Cp3mZeuZA5","dhSuHzbIYY",
+"IBe8kAOgEe","qaofNBGaQY","prNT6vLsmS","DG4sT3otm6","DG4sTPOUYS","xReecKZamH","gf8rInlaBy","Waim6EoToP","iKqhr5Namm","GXdoHdhSuH",
+"F6PT2NhXdu","AIYUu5ZaEz","7lUXZMmKGJ","okgRimX2GE","XyPZNWmadA","jSjS3QChxs","iB08lUvlv4","Ta8f6fmIK1","P6bcg7fsYM","aFFssGXdoH",
+"L7cGcD6rBy","BpYhVjS1aj","t98iW0PktI","ReKEWprNT6","jfREu5Namm","FnPFBVNCPd","d85a9ix74r","9rlg9lkMUA","YjB9tyToGW","9y4lwNAFuw",
+"AkKTkvLsmS","nnP8oChuy3","qaofN6AFT0","0MR5XazIWp","RsQUqCNHmv","jtn0X5VZjS","sx5GlL7cGc","2NslmBFkb8","QssNCrz7Ut","FjHXRfaHir",
+"2ZHdks93Ml","4QMc9iqv4k","WPmlxEOE1o","ZzJHWM3zXL","SmGzvWaim6","SWfou7ku1p","O3iyQZv7z0","qQxHP0Wr5y","jzUqRBGaQY","DG4sTQYxC0",
+"BFkb8StlDJ","djsrvKZamH","lsQGopFrrl","i3pydzbIYY","euZA5Gv3Fq","gtCA5Yw2oU","aez9ysoy9t","5Mg9rpWiOs","zmLYDs93Ml","lj07QqUJMd",
+"uZPqgmz8gx","iB08l9iGoT","lH1ktJ2mQi","5IhmGBpYhV","AXpwEDcpWB","m4bxU8hJdt","4dEz6yluBx","IjTwPW7cTs","C2IrcjfREu","wDajX8TxD7",
+"64s8NNOHsz","0PktIjSjS3","zqH0WeuZA5","uPX7Gxciqp","uJScXi3pyd","bgJAzuQIcz","8FmFHZUnqt","fcJOynnP8o","S77LHZv7z0","ru4UGciuWz",
+"ZuDtD64s8N","Nxx9Vsoy9t","FPfSEjfREu","NcICAAmdQd","fcwDa7fKYU","L7cGcjtn0X","lweGyRmDcr","o8UydRmDcr","LewvM5ZaEz","fLNg8W3VFH",
+"NcICAuTacx","KZamHKZamH","TwanoEdBKc","VBjhzzQt6Q","M3zXLatef2","fqypylViBv","U3yw5b29RJ","euZA5Yf2Ec","jS1ajVNCPd","WMiS3atef2",
+"xciqpOUYuF","WreyPJRJQB","bZLvScmXIX","e6e4zprNT6","6AFT0Gv3Fq","TXQ0ZTXQ0Z","mz8gxFcWrW","ru4UGyofH3","uoStwt98iW","jS1aj55rfB",
+"jeskSWaWsv","jS1aj4W0Tl","POUYS1v5hH","ulk41Oz8yZ","sqVrfCxVEf","45cIHv8yFN","lm0pDwDajX","BCxeCGv3Fq","xXTI4RBhp0","Uvlv4jfREu",
+"8cVD3lH1kt","P6bcg1LB1L","pv0i7CNHmv","Ta8f6K4GS8","64s8NaFFss","tl72WMK07Y","JkzUn1LB1L","gIYvEGXdoH","AgJHQ618Di","AkKTk8FmFH",
+"OxWIHuJScX","07n1cs7Mxk","RACuj9y4lw","Yh1hFpvgjS","HP4339GXkX","FjHXRAgJHQ","cShY2Vprf2","Waim67Ow5C","MezSWX6Pin","uJScXJ2mQi",
+"aFFss55rfB","WreyPksJby","G1RhSzQt6Q","NhXduS77LH","n8pJ9s93Ml","8RCUApAhR1","5ZaEzVBjhz","KsjRKt98iW","Q6hMCy94nw","CNHmvVBjhz",
+"7ku1ps4786","bZLvSsqVrf","G1RhSNcICA","2ZHdkFGzgp","2NslmnnP8o","5iGN5JIqXi","dhSuHuAWyp","1j5L8Zv7z0","2DREslH1kt","nFqik2DREs",
+"pAhR1djsrv","TCgPp4W0Tl","soy9thUTw7","n8pJ90MR5X","mX2GElkMUA","CxVEfulk41","TCgPpZUnqt","VNCPdrhl0J","dmoS7oVQp6","QClRLqaofN",
+"K4GS8s7Mxk","VBjhzv1Hln","y94nwLbRTH","Cp3mZP6bcg","FcWrWC2Irc","h1zcHB3qem","RsQUqSmGzv","JIqXilCMxy","Nxx9VNhXdu","HP433POUYS",
+"qaofNLbRTH","J2mQiPOUYS","Kr8ysZhwG1","WaWsv2hEEU","taOXKJkzUn","1v5hHuZPqg","uvf7ANAFuw","SjskQ5drc6","FGzgps7Mxk","yluBxcmXIX",
+"X6PinAmdQd","K20wKMm8si","gf8rIzFgtB","bZLvSfLNg8","5drc6AkKTk","Kr8ys8xEKz","StlDJtjQxs","uJScX9rlg9","iB08leuZA5","uZPqg55rfB",
+"d7vjMeuZA5","hi5X7blLA9","nFqikzmLYD","KZamHlsQGo","7fsYMVprf2","ciuWzUmaEv","07n1ca00b5","QssNClkMUA","aL6AJuN6r3","hUTw7ix74r",
+"8U2nUx3LDe","rhl0JgdQsS","RmDcrzqH0W","M6qcG9XyT9","FjHXRCqqaD","MojnPgjUTu","Q6hMC9eoRc","qQxHPuZPqg","iKqhrFNYIM","1v5hHn8pJ9",
+"k85AeWaim6","GrDg7Yw2oU","uvf7AFLsph","k85Aesoy9t","VjCZqhe9IA","8hJdt8cVD3","FPfSEfLNg8","Zv7z0Ul4a1","uZPqgtvdkD","blLA90h1b1",
+"VerEAvLsmS","ru4UG8TxD7","FPfSEuPX7G","7fKYUzmLYD","In3NS2TRI7","ECMvUWmadA","FGzgplViBv","lH1ktUvlv4","vOqCEuJScX","Mm8simz8gx",
+"okgRiazIWp","Yh1hFNhXdu","zQt6QYOfrY","No0QbNo0Qb","WDVWJS2Dfu","i3pyd29QAz","MezSWgdQsS","2NslmpmeCd","vkCHHn8pJ9","faHirZJTXH",
+"M3zXLpFrrl","uLtKsWDVWJ","faHirxReec","Yh1hFv2eC3","2Yz7EQClRL","5IhmGkZANm","fcJOyfcJOy","SmGzvX6Pin","9rlg9QbxXc","RBhp0zQt6Q",
+"gjUTu9iGoT","cShY2G1RhS","vLsmSe6e4z","AgJHQlj07Q","wDajXAXpwE","dhSuHAmdQd","0ao3llH1kt","TCgPpSs0Zu","Dz1R3MojnP","o8UydokgRi",
+"DLhzMgtCA5","zz4ZUn8pJ9","QnJ1SoQ87r","vOqCEd7vjM","gjUTuVNCPd","Gv3FqSbRYy","uLtKscL0aE","5VZjScQOnv","lViBvxXTI4","0ao3l580YD",
+"Nxx9Vk85Ae","8U2nUMojnP","14FLRru4UG","iqv4koQ87r","Nxx9V1LB1L","s4786vOqCE","a00b50Kyfs","OUYuFRxrsm","07n1cuZPqg","0PktIrhl0J",
+"prNT6okgRi","gIYvEuupzk","CNHmvFcWrW","HlUbFUl4a1","hUTw7fcwDa","580YDcmXIX","YjB9tkZANm","prNT60ao3l","fLNg8CqqaD","Kr8ysUmaEv",
+"rz7Ut9GXkX","RpBQmzqH0W","lkMUAMojnP","xReecCK5W7","Dz1R3CIShG","xReecuN6r3","gdQsSHfyNQ","zbIYYO3iyQ","QClRLMaJQs","atef2oQ87r",
+"Yw2oUd85a9","8cVD3OUYuF","xReechi5X7","zmLYDBbwgA","OHaBzRBhp0","5Mg9rRBhp0","9iGoTzmLYD","7hyVvlpF6W","48cHLCIShG","VNCPdfLNg8",
+"5iGN5lViBv","ix74rkB5nP","o8UydoVQp6","DG4sTv2eC3","kZANmlkMUA","5Mg9rKZamH","y94nwbgJAz","zHF1qPOUYS","2DREse6e4z","7fKYUlViBv",
+"gjUTuyEfy9","IRh487Ow5C","uN6r3brhlQ","K20wKKsjRK","xciqpjzUqR","uupzkMojnP","2Yz7EblLA9","pT8wuRACuj","POUYSt98iW","29QAz45cIH",
+"ix74rVNCPd","v8yFNXyPZN","vkCHHQ6Lix","UmaEvogLgc","ZJTXHChuy3","pAhR1QnJ1S","DcpWBNOHsz","MojnP8xEKz","pT8wuFFDui","Rxrsmhe9IA",
+"1LB1LWDVWJ","azIWpni2v1","X6PinAkKTk","2DREsGWqqX","fFDrJ9y4lw","aez9ypv0i7","WDVWJdmoS7","OHaBz8FmFH","nlaBy29QAz","WreyPcL0aE",
+"QnJ1SFxX9q","9eoRc5iGN5","zbIYYVjCZq","64s8No8Uyd","uoStwyEfy9","CxVEfy94nw","KASQ8gtCA5","tl72WDz1R3","dQ586ni2v1","rhl0JKr8ys",
+"2hEEUJRJQB","e6e4zyEfy9","lXFOBUvlv4","K20wKVNCPd","9XyT9nnP8o","NhXduksJby","0MR5Xlm0pD","O3iyQ45cIH","lkMUA9iGoT","KZamHlXFOB",
+"jfREu1v5hH","Uvlv4StlDJ","soy9tgtCA5","GrDg78cVD3","WMiS3OxWIH","aFFssUl4a1","yEfy9DQimp","HP433zqH0W","lsQGolsQGo","RzaZAEOE1o",
+"VNCPdGrDg7","hi5X7Chuy3","fcwDaM3zXL","VNCPdbrhlQ","MGlTFe6e4z","VerEAIjTwP","cmXIXksJby","W3VFH2Nslm","7fKYUlweGy","jS1ajFnPFB",
+"HP433RBhp0","CqqaDNAFuw","8TxD7FFDui","7Ow5CyEfy9","WreyPhE1Ql","yEfy9VBjhz","GrDg7rz7Ut","zz4ZUbZLvS","GrDg7JKWYR","FNYIM5Drn0",
+"s4786WreyP","WaWsv29QAz","GSQwjMK07Y","Nxx9V2DREs","580YD580YD","ZhwG1xReec","jtn0XCdyBV","LewvMNcICA","2hEEURzaZA","2hEEUzFgtB",
+"FjHXReuZA5","3otm6uupzk","BFkb816lHc","x3LDeEoToP","Chuy3gdQsS","dQ586YjB9t","mz8gxCfgr3","mz8gxciuWz","i7WMQsoy9t","Yh1hFFcWrW",
+"xReecPb1pa","48cHLLewvM","atef2Ss0Zu","KZamHs93Ml","IRh4845cIH","rhl0JTXQ0Z","6AFT0WMiS3","pFrrlEdBKc","vkCHHWaim6","ksJbycmXIX",
+"tuDySY1mC0","TCgPpM6qcG","ECMvUyofH3","P6bcgulk41","CNHmvJKWYR","VjCZq5VZjS","OxWIH14FLR","7Ow5CqUJMd","LDk6fqQxHP","pAhR1VIlwP",
+"dpe1vAXpwE","0ao3lRmDcr","0h1b1IRh48","HfyNQGrDg7","fqypyKZamH","fcJOyI7p2a","KsjRKsx5Gl","OUYuFSbRYy","dpe1vHP433","AmdQdnlaBy",
+"JKWYRyvOMI","vOqCES2Dfu","QbxXclXFOB","bZLvSU3yw5","FFDuioVQp6","ZhwG124ARF","RxrsmFPfSE","IKxdL07n1c","hUTw7lH1kt","e6e4zW7cTs",
+"zbIYYlm0pD","ix74rnFqik","yluBxbgJAz","5iGN5IBe8k","suY4xo8Uyd","uupzkyofH3","POUYSECMvU","MaJQsuPX7G","aDGtShE1Ql","dhSuHOUYuF",
+"tl72WxXTI4","IjTwP0PktI","1v5hHksJby","tl72WiKqhr","9XyT9B3qem","MK07YydG8U","U3yw5gf8rI","bZLvSuvf7A","14FLRRxrsm","TXQ0ZFhtgl",
+"Yh1hFZzJHW","VNCPd7ku1p","1LB1LZv7z0","POUYSo8Uyd","0h1b1tvdkD","VNCPdfmIK1","K4GS8cQOnv","xciqptjQxs","RzaZAWMiS3","QWxoTtl72W",
+"JkzUnZ4I1v","VNCPdAmdQd","K4GS8a00b5","faHiruN6r3","lpF6WBpYhV","ZuDtD16lHc","FjHXRFGzgp","5Drn0KASQ8","EoToPgdQsS","zFgtBmz8gx",
+"5ZaEzDz1R3","ZUnqtRzaZA","PYBf4uZPqg","FwEJz9y4lw","pvgjS8xEKz","m4bxUFnPFB","xXTI48hJdt","In3NSzFgtB","VjCZqd85a9","8hJdtyofH3",
+"24ARFSs0Zu","ZzJHWKASQ8","6AFT0tuDyS","W3VFHNcICA","MGlTFMGlTF","580YDqQxHP","2Yz7EIRh48","AkKTkuN6r3","brhlQtaOXK","WaWsvCIShG",
+"n1pmOjS1aj","0Wr5yyluBx","1j5L8O3iyQ","HfyNQ7lUXZ","SWfougjUTu","JRJQBZJTXH","okgRiYjB9t","S77LHogLgc","9iGoTVerEA","t59lRQnJ1S",
+"6AFT05nmWv","ni2v1J2mQi","AgJHQcmXIX","cShY2tvdkD","TXQ0Zt98iW","7fKYUpvgjS","BFkb8mX2GE","Yf2Ec24ARF","EoToPbZLvS","yEfy945cIH",
+"UlU3MMkgy8","5iGN55drc6","M3zXL5Drn0","5VZjSru4UG","14FLRjS1aj","K4GS8WreyP","brhlQeuZA5","ni2v1M6qcG","soy9tk85Ae","gtCA5jSjS3",
+"s7MxkJ2mQi","ThjNntAOsr","cL0aEpAhR1","tl72WRkQke","v2eC3QClRL","P6bcglCMxy","QYxC0Q6Lix","djsrvIBe8k","TCgPp4QMc9","5Mg9riKqhr",
+"lH1ktgdQsS","FxX9q4QMc9","2Yz7E1v5hH","okgRis93Ml","lpF6W45cIH","5nmWvoGu6x","6q6L9Q6hMC","fLNg8nFqik","ZuDtD45cIH","k85AelH1kt",
+"P6bcgjtn0X","8U2nU7fsYM","tvdkD9GXkX","blLA9ksJby","vOqCE7hyVv","iwzGkogLgc","CqqaDd85a9","aDGtSblLA9","nFqikPOUYS","ThjNnBCxeC",
+"RACujvLsmS","9GXkXJRJQB","oVQp6iB08l","xReecI7p2a","qaofNs7Mxk","SbRYyGWqqX","Chuy3Vprf2","FwEJzdpe1v","soy9tpv0i7","BGaQY9GXkX",
+"ciuWzgtCA5","580YDdjsrv","dhSuHHRxd8","bgJAzzY1GY","FjHXR4dEz6","HRxd8AgJHQ","iwzGkhi5X7","VBjhzjeskS","OxWIHbgJAz","uZPqgzY1GY",
+"8cVD3YjB9t","pAhR15VZjS","gjUTuni2v1","zFgtBGWqqX","pAhR1s93Ml","BFkb8wDajX","kB5nP9XyT9","zFgtBFNYIM","NcICA1v5hH","LewvMUvlv4",
+"AOgEeNo0Qb","0PktINOHsz","prNT6taOXK","zbIYYlViBv","guMb8RzaZA","kZANm14FLR","9GXkX5VZjS","OHaBzGrDg7","EoToP0Wr5y","aL6AJdjsrv",
+"MojnPfaHir","Ss0Zux3LDe","cQOnvjSjS3","0ao3lCxVEf","fqypyfFDrJ","IRh48dQ586","8xEKzS77LH","dQ5862hEEU","dQ586lsQGo","4QMc9sx5Gl",
+"DcpWBzz4ZU","gjUTuIBe8k","SbRYypvgjS","uTacxgf8rI","lm0pDWPmlx","Oz8yZgf8rI","0ao3l9y4lw","XyPZNcL0aE","kZANmYOfrY","Yf2EcF6PT2",
+"No0QbokgRi","B3qems4786","blLA97lUXZ","MK07YOxWIH","0Wr5yd7vjM","5IhmGJRJQB","MmKGJ9XyT9","JkzUnW7cTs","pmeCdUlU3M","lCMxyulk41",
+"0KyfsXyPZN","VjCZqWaim6","Ta8f6tAOsr","64s8NSWfou","7Ow5Ctl72W","Cp3mZK4GS8","PYBf4WMiS3","VjCZqd7vjM","EOE1o0YAGH","rKDLJru4UG",
+"JXljWNcICA","aL6AJyvOMI","jfREue6e4z","TCgPpdjsrv","GrDg7aL6AJ","KZamHWMiS3","tjQxs8RCUA","5drc6oGu6x","64s8Njtn0X","D6rByLbRTH",
+"CdyBVJkzUn","lXFOB5Mg9r","LewvMoGu6x","zQt6QpmeCd","2NslmMmKGJ","JJs5mpFrrl","qaofN9GXkX","MaJQs1j5L8","CxVEf6q6L9","Kr8ysaDGtS",
+"Ul4a1t59lR","MaJQsksJby","VLTy6OUqFM","mX2GElpF6W","VjCZqBGaQY","Cp3mZ5IhmG","DLhzMVprf2","0MR5XpFrrl","JXljWVLTy6","uJScXThjNn",
+"BGaQYStlDJ","FnPFBRpBQm","fcwDaOUYuF","C2IrcQWxoT","iqv4kMojnP","uupzklXFOB","azIWpdQ586","MezSWF6PT2","MmKGJwiHrZ","GWqqXfqypy",
+"sx5GlJRJQB","0YAGHUmaEv","ru4UGX6Pin","ZUnqtXflUq","Chuy3FnPFB","dQ586jeskS","BFkb8JJs5m","cL0aEzz4ZU","7Ow5CMmsIo","QssNCkZANm",
+"618Div8yFN","pT8wuCqqaD","WmadAuoStw","O3iyQ5drc6","tl72W14FLR","45cIHNhXdu","wiHrZxXTI4","xciqptuDyS","45cIH8hJdt","FPfSElpF6W",
+"8xEKzmz8gx","FVMxoFVMxo","RkQkeCdyBV","8xEKzuTacx","tl72W3weIF","LbRTHDcpWB","qUJMdD6rBy","HP433IRh48","fcJOyFxX9q","KASQ8pAhR1",
+"oGu6xxciqp","U3yw5WDVWJ","SWfouHP433","YjB9ttl72W","y94nw2ZHdk","FjHXR4QMc9","Ul4a1qUJMd","ni2v1lpF6W","gdQsSYw2oU","piJSkatef2",
+"qUJMdydG8U","U3yw57lUXZ","I7p2aTCgPp","MojnPYjB9t","jfREutl72W","9eoRcCfgr3","vkCHHZ4I1v","M3zXLzmLYD","euZA5FxX9q","4W0Tlh1zcH",
+"55rfBZv7z0","QClRLlj07Q","hSSvQnlaBy","xReecmz8gx","euZA5BGaQY","7hyVvMojnP","he9IA7ku1p","14FLRU3yw5","v1Hln2Yz7E","QYxC0VLTy6",
+"ZzJHWGWqqX","5drc6pAhR1","yToGWd7vjM","zmLYD9rlg9","Yf2EcRkQke","KsjRKJKWYR","MGlTF1LB1L","GXdoHiwzGk","SjskQ8cVD3","OUYuF8U2nU",
+"uZPqg0ao3l","ydG8UuJScX","HRxd8RACuj","In3NSeuZA5","gjUTuoQ87r","ru4UGfcJOy","5nmWvMK07Y","2DREscShY2","he9IAaDGtS","t98iWlpF6W",
+"NOHsz2Yz7E","pT8wu9iGoT","Waim614FLR","v2eC3MmsIo","0Wr5yPb1pa","1v5hH5iGN5","DcpWBi7WMQ","sqVrfdjsrv","ECMvU29QAz","d7vjM7ku1p",
+"GrDg7d7vjM","SmGzvtaOXK","tl72WeuZA5","M6qcGokgRi","K4GS8v2eC3","jeskSUlU3M","hi5X7GXdoH","7ku1plkMUA","Uvlv4ThjNn","i3pyd0Kyfs",
+"16lHcY1mC0","pT8wuNOHsz","7fKYUXflUq","JKWYRRpBQm","JkzUncQOnv","618DiQssNC","KZamH0h1b1","QClRLzFgtB","tvdkDfaHir","cmXIXyofH3",
+"DG4sTfLNg8","hE1Qld85a9","FVMxoaFFss","mX2GE5Mg9r","tvdkDi7WMQ","uPX7GBFkb8","lXFOBuPX7G","4W0Tl9XyT9","Yf2EcfcJOy","dmoS7zFgtB",
+"WreyPoVQp6","G1RhSHlUbF","tvdkDEdBKc","rhl0JAgJHQ","MmsIoYOfrY","GrDg7yEfy9","nnP8oDLhzM","v1Hln7lUXZ","dmoS7Pb1pa","8hJdtKZamH",
+"ulk4164s8N","CK5W7tuDyS","he9IAI7p2a","1LB1LBGaQY","QworuVLTy6","XyPZN48cHL","GrDg7v1Hln","tAOsrsx5Gl","7Ow5C0MR5X","MGlTFlm0pD",
+"J2mQibrhlQ","FwEJzDz1R3","5iGN5faHir","ZuDtDuN6r3","0MR5Xru4UG","XyPZNe6e4z","cShY224ARF","4QMc9zmLYD","TCgPpNxx9V","tvdkDuoStw",
+"RzaZABGaQY","AkKTkOUqFM","fqypyVerEA","vLsmSCqqaD","VIlwPJXljW","FjHXRHRxd8","iKqhr2Yz7E","djsrvqaofN","8RCUA0Wr5y","jeskSs4786",
+"ECMvUFcWrW","uN6r3cL0aE","gtCA5X6Pin","NAFuwRpBQm","W7cTshSSvQ","0Wr5y7Ow5C","Kr8ysIn3NS","M3zXLogLgc","Yf2Ecd85a9","zY1GYHlUbF",
+"0YAGHyvOMI","WPmlxzqH0W","IKxdLpmeCd","hSSvQRBhp0","6q6L9Yh1hF","n8pJ9BFkb8","prNT62ZHdk","0BmCyOUYuF","48cHL618Di","d85a9rKDLJ",
+"l83UdY1mC0","uupzkbrhlQ","piJSkSs0Zu","djsrv5Drn0","KZamHF6PT2","iwzGkCIShG","WmadAaL6AJ","faHirEOE1o","5NammM3zXL","FVMxoP6bcg",
+"7fKYUS2Dfu","OUYuFUmaEv","5NammLDk6f","uLtKsOUYuF","2Yz7EQssNC","2Yz7EjfREu","4dEz6FwEJz","ReKEWZhwG1","5ZaEzeuZA5","euZA5vkCHH",
+"OxWIHksJby","9y4lwuvf7A","pv0i7okgRi","tAOsrfcwDa","taOXKWPmlx","5Drn0nnP8o","oGu6x8hJdt","uTacxiwzGk","v1Hlnzz4ZU","6q6L9yToGW",
+"hi5X7VIlwP","dQ586BCxeC","QChxsbgJAz","FLsphuQIcz","HzZT83otm6","29QAzWaim6","jiVBPGv3Fq","yToGW5Namm","Nxx9VIRh48","wDajX0Wr5y",
+"tvdkDgdQsS","tlILtJJs5m","n1pmOtvdkD","gf8rIDLhzM","KASQ8QbxXc","0h1b1MGlTF","BCxeC7hyVv","CIShGni2v1","2NslmZv7z0","bZLvSUlU3M",
+"ZUnqtgf8rI","WMiS3suY4x","LDk6fZv7z0","ThjNnzFgtB","LDk6fQClRL","bZLvS0h1b1","pT8wuMezSW","aez9yOHaBz","VIlwPuoStw","QbxXcZJTXH",
+"jfREuhE1Ql","yofH30Wr5y","gdQsSWaim6","BFkb8DG4sT","s7MxkpvgjS","Yw2oUOUqFM","SmGzvRxrsm","sqVrfhUTw7","WreyP07n1c","xXTI49eoRc",
+"FLsphzQt6Q","FhtglFhtgl","6AFT0QssNC","IjTwPFnPFB","iKqhruoStw","2hEEUNhXdu","55rfBUvlv4","RkQkeiwzGk","fFDrJIjTwP","pvgjSpvgjS",
+"8RCUAa00b5","LDk6fWmadA","MmsIoi3pyd","zY1GYKASQ8","F6PT2v2eC3","zY1GYb29RJ","vOqCECdyBV","d85a9HzZT8","cShY2FFDui","RkQkeb29RJ",
+"JXljW5Namm","piJSkFhtgl","s47869GXkX","CNHmv8cVD3","gIYvEDQimp","0PktIStlDJ","n8pJ9lXFOB","O3iyQYjB9t","SjskQjtn0X","tlILt8TxD7",
+"VerEAvOqCE","ru4UGWreyP","uAWypB3qem","618DiOUqFM","QssNCIKxdL","qQxHPi7WMQ","iqv4kuZPqg","oGu6x4W0Tl","JIqXiuZPqg","QssNCpAhR1",
+"rz7UtiKqhr","Q6LixWaWsv","oQ87rs4786","In3NSQ6hMC","RACujyToGW","M3zXLYOfrY","wiHrZuLtKs","FcWrW1j5L8","FcWrWTCgPp","LDk6fcShY2",
+"uPX7GWPmlx","FLsphKsjRK","he9IA64s8N","DLhzMHzZT8","FcWrWMGlTF","ru4UGni2v1","CdyBVTwano","580YDguMb8","t59lRCfgr3","piJSkni2v1",
+"OUYuFReKEW","5nmWv24ARF","cmXIXuZPqg","lkMUApAhR1","BGaQYL7cGc","ydG8UyEfy9","d7vjMXflUq","Nxx9Vhi5X7","ZzJHWXyPZN","1LB1LnFqik",
+"Ta8f6Oz8yZ","lH1ktpT8wu","Yf2EczQt6Q","64s8NqaofN","LewvM9rlg9","mX2GEn8pJ9","MojnPcQOnv","jeskSGv3Fq","8FmFHLDk6f","fLNg8CxVEf",
+"HP433FwEJz","64s8NfFDrJ","24ARFhSSvQ","nFqikdhSuH","2hEEUMkgy8","580YDJXljW","SbRYyEOE1o","v2eC3zFgtB","l83Udm4bxU","580YDCIShG",
+"FNYIMNcICA","0ao3lpWiOs","pv0i77fKYU","7X3uy5Namm","DcpWBFPfSE","DQimpYjB9t","gtCA58TxD7","QClRLEOE1o","RACujTwano","uN6r3JXljW",
+"o8UydRsQUq","OUqFMt98iW","fmIK1FVMxo","tlILtksJby","jzUqRHfyNQ","uAWyp9XyT9","L7cGcvOqCE","VBjhzZJTXH","uZPqghe9IA","9rlg9fmIK1",
+"zbIYY8TxD7","Ss0ZuQClRL","7ku1pVLTy6","FFDuiDz1R3","DcpWBCqqaD","CK5W7v2eC3","Ul4a1ECMvU","ru4UGMmKGJ","5VZjSuTacx","tAOsrS2Dfu",
+"GXdoHbrhlQ","cL0aEt59lR","5drc6HfyNQ","9XyT9YOfrY","djsrv8hJdt","tvdkDprNT6","Z4I1vlCMxy","S2DfuKr8ys","zz4ZUlXFOB","Yh1hFWDVWJ",
+"K4GS8okgRi","qaofNRkQke","qUJMdb29RJ","s93MlydG8U","v8yFNuTacx","CxVEfhUTw7","Q6LixdQ586","No0QbKr8ys","S2Dfuv2eC3","Oz8yZiB08l",
+"cmXIXtuDyS","TwanokB5nP","M6qcGlXFOB","AIYUuMGlTF","v1Hln0MR5X","KASQ8zqH0W","s7MxkCqqaD","6q6L9AmdQd","pT8wugf8rI","8hJdtlj07Q",
+"IRh48U3yw5","29QAzGrDg7","piJSk5nmWv","4W0TlLbRTH","lj07QF6PT2","0PktIlpF6W","t59lRuJScX","8TxD7WmadA","55rfBtAOsr","pT8wuzY1GY",
+"zQt6Q5VZjS","yToGWnFqik","wiHrZRmDcr","1j5L8AgJHQ","WDVWJO3iyQ","RzaZAJIqXi","gjUTun1pmO","14FLRqaofN","Uvlv4wiHrZ","lpF6W1LB1L",
+"7Ow5CLewvM","i3pydn8pJ9","JKWYR1v5hH","VNCPdQworu","P6bcgvOqCE","GXdoHo8Uyd","RmDcrsx5Gl","SWfoupvgjS","JXljWfcJOy","RBhp0suY4x",
+"JRJQBRpBQm","FPfSETCgPp","ogLgcAIYUu","VBjhzlj07Q","ix74rUmaEv","gf8rIwiHrZ","gf8rIUlU3M","2TRI7JKWYR","uAWypVIlwP","pFrrly94nw",
+"dmoS78U2nU","iB08l2ZHdk","he9IA5VZjS","h1zcH2Nslm","MaJQsxciqp","Yh1hF9rlg9","yToGWReKEW","LewvMEdBKc","x3LDeTXQ0Z","WDVWJU3yw5",
+"nlaByo8Uyd","i3pydsqVrf","pv0i7uvf7A","YjB9tuQIcz","618DiVjCZq","QChxsFNYIM","UlU3MQbxXc","d7vjMM3zXL","uAWypm4bxU","FxX9qzqH0W",
+"Zv7z0QYxC0","QChxsVprf2","piJSkReKEW","7Ow5CtAOsr","cQOnvaez9y","rKDLJ0ao3l","zFgtBbZLvS","XyPZNogLgc","RpBQmpv0i7","BFkb88TxD7",
+"2ZHdk64s8N","IjTwP5nmWv","lXFOBPYBf4","hSSvQqQxHP","AOgEen1pmO","Q6hMCD6rBy","yToGWGv3Fq","FwEJz5nmWv","Yw2oUAXpwE","pFrrljeskS",
+"fcJOyFjHXR","l83UdksJby","HlUbFwiHrZ","JJs5mMojnP","DQimpQ6hMC","5ZaEz9iGoT","Dz1R3QnJ1S","pvgjSl83Ud","m4bxUJXljW","Nxx9VhSSvQ",
+"WreyPkB5nP","S77LHd85a9","5VZjSQClRL","y94nwcmXIX","wDajXDG4sT","yvOMIMGlTF","vkCHHh1zcH","x3LDeydG8U","9GXkXTCgPp","lH1kttjQxs",
+"Yw2oU64s8N","d85a95iGN5","Gv3Fq45cIH","P6bcg29QAz","In3NSkB5nP","AIYUupiJSk","YOfrYUlU3M","uAWyp2DREs","UmaEv45cIH","v2eC3cmXIX",
+"jSjS3jzUqR","FPfSEC2Irc","gtCA59GXkX","M6qcGuN6r3","JKWYRVprf2","m4bxUpiJSk","zmLYDOz8yZ","cShY2ZUnqt","kB5nPDz1R3","lsQGoHP433",
+"m4bxURsQUq","v1HlnYOfrY","S2DfuVLTy6","azIWpdhSuH","O3iyQSbRYy","FNYIMksJby","No0QbFNYIM","lkMUACNHmv","cL0aEPYBf4","hi5X707n1c",
+"s93MlMm8si","JkzUn29QAz","CdyBVjzUqR","v2eC3dhSuH","jSjS3uoStw","fmIK1ThjNn","aL6AJEOE1o","1v5hHUl4a1","aez9yAgJHQ","m4bxUF6PT2",
+"tuDySuPX7G","8xEKz8cVD3","FGzgpFVMxo","taOXKRxrsm","Pb1pasqVrf","RmDcr4W0Tl","XyPZNNAFuw","0Kyfstl72W","9GXkXNcICA","BGaQYuPX7G",
+"5VZjSSs0Zu","DQimpxciqp","vOqCECIShG","lweGyb29RJ","gIYvEFPfSE","iwzGkyofH3","rKDLJv1Hln","zY1GYDQimp","dhSuHXyPZN","nnP8o0BmCy",
+"FPfSEMkgy8","Vprf2cQOnv","1v5hHBbwgA","Oz8yZ45cIH","BbwgAiKqhr","rKDLJjS1aj","6AFT0LDk6f","KsjRKMaJQs","5IhmGRzaZA","SWfoucQOnv",
+"WmadAtAOsr","pWiOsFcWrW","dhSuHK20wK","5iGN5VjCZq","iwzGkv8yFN","aez9yIn3NS","6q6L9fqypy","HP433lj07Q","jS1ajuJScX","1j5L8POUYS",
+"XflUqMaJQs","faHirzQt6Q","WPmlxmX2GE","wDajXpiJSk","MojnPOz8yZ","vkCHHnlaBy","PYBf4JRJQB","fFDrJU3yw5","uPX7GuLtKs","Ta8f6lH1kt",
+"lH1ktW3VFH","4QMc916lHc","jeskScL0aE","YOfrYkB5nP","zQt6QaL6AJ","C2Irc4W0Tl","5NammblLA9","gtCA5mX2GE","8xEKz8TxD7","a00b5hYBCK",
+"9XyT9FcWrW","nlaByDcpWB","MmsIo6AFT0","GWqqXk85Ae","LbRTHRzaZA","d85a9pFrrl","pAhR1mz8gx","rhl0JPb1pa","y94nwv2eC3","guMb87ku1p",
+"K20wKBbwgA","16lHcAIYUu","i7WMQ4QMc9","uoStw2DREs","Q6hMCVNCPd","gdQsSDG4sT","jS1ajSjskQ","HlUbFlm0pD","VjCZqjiVBP","7fsYMVLTy6",
+"IKxdLMmKGJ","k85Ae0MR5X","zFgtBni2v1","RBhp0QClRL","QChxssx5Gl","DG4sT6AFT0","zQt6Q0ao3l","ciuWzsx5Gl","FhtglL7cGc","1v5hH7fKYU",
+"pWiOstaOXK","gjUTu8xEKz","Ss0ZuJIqXi","TwanouZPqg","Mm8siuN6r3","7X3uyHP433","XflUqi7WMQ","Yw2oUuupzk","guMb8GrDg7","I7p2a0Kyfs",
+"1v5hHMojnP","FxX9qhUTw7","CNHmvZ4I1v","OUYuFQworu","FhtglF6PT2","tlILtP6bcg","Nxx9VzHF1q","pT8wulm0pD","EoToPs4786","lViBvJRJQB",
+"yEfy95nmWv","29QAz8U2nU","vkCHH0BmCy","Yh1hF2DREs","o8UydYOfrY","FPfSEIKxdL","gtCA5Mm8si","gdQsS5Drn0","cShY22Nslm","i3pydUl4a1",
+"48cHL4W0Tl","o8UydNo0Qb","fqypyd7vjM","jiVBPkZANm","B3qemnFqik","VIlwP8xEKz","WMiS3AgJHQ","No0QbVerEA","GSQwjdQ586","FnPFBMm8si",
+"2hEEUCqqaD","tvdkDm4bxU","e6e4zuLtKs","he9IAFVMxo","P6bcgksJby","NAFuwhE1Ql","fmIK1mz8gx","Z4I1vRmDcr","BbwgAlm0pD","0PktImz8gx",
+"5Drn0xciqp","VjCZqaez9y","O3iyQfFDrJ","prNT6zQt6Q","8TxD7KsjRK","GrDg7Waim6","Pb1pa48cHL","5Drn09XyT9","sqVrfJJs5m","iqv4kDG4sT",
+"jfREuuAWyp","gIYvElH1kt","atef2okgRi","W7cTslweGy","lpF6W0h1b1","hYBCKNcICA","fLNg8gIYvE","J2mQi1j5L8","Chuy3tjQxs","lpF6WCp3mZ",
+"xReecD6rBy","9XyT9UlU3M","RzaZAZzJHW","5drc6n1pmO","t59lRQClRL","8U2nUi7WMQ","e6e4zlsQGo","07n1cFPfSE","nFqikHzZT8","CK5W7zqH0W",
+"5Mg9rBpYhV","pFrrlgjUTu","RACujblLA9","fqypyi3pyd","taOXK7fsYM","fmIK1hi5X7","SbRYyZzJHW","QYxC0dhSuH","n1pmOlweGy","5ZaEz0Kyfs",
+"zHF1qKr8ys","ydG8U64s8N","fcwDa8RCUA","PYBf4VIlwP","WPmlxD6rBy","WPmlx5drc6","W7cTslXFOB","DQimpblLA9","Y1mC0uLtKs","JRJQBvLsmS",
+"lm0pDTXQ0Z","atef2uZPqg","JRJQBuupzk","jtn0XuLtKs","YOfrYqUJMd","oGu6xi7WMQ","MGlTFcmXIX","Z4I1v9eoRc","CNHmvDQimp","mX2GEt59lR",
+"oQ87rCIShG","9rlg9AOgEe","n8pJ9he9IA","yofH3pAhR1","48cHLAgJHQ","JRJQBWmadA","CK5W7dhSuH","1LB1L8TxD7","DcpWB1v5hH","JRJQBhi5X7",
+"he9IAGXdoH","brhlQogLgc","2ZHdkRACuj","8hJdtWaim6","taOXKtl72W","RACujBbwgA","Ta8f6pAhR1","QnJ1Sd85a9","StlDJ7ku1p","POUYS29QAz",
+"ZhwG1ix74r","ThjNn8hJdt","RpBQmnnP8o","RkQkeIjTwP","Yh1hFUl4a1","BpYhVzmLYD","djsrvwiHrZ","OUYuFVIlwP","8RCUAjSjS3","kB5nP0YAGH",
+"AOgEefqypy","yluBxIKxdL","LDk6faez9y","GSQwjNxx9V","MmKGJpiJSk","UlU3Msx5Gl","uQIcz4W0Tl","24ARFVjCZq","Mm8siW3VFH","RsQUqAmdQd",
+"xReecFVMxo","zHF1qwDajX","o8Uyde6e4z","mz8gxogLgc","8TxD78hJdt","IRh48oQ87r","MmKGJD6rBy","Zv7z0nlaBy","ReKEW0ao3l","FGzgpuvf7A",
+"2ZHdkdQ586","G1RhSi7WMQ","5VZjSGWqqX","1LB1L0PktI","jzUqR618Di","FNYIMfFDrJ","FGzgpM3zXL","S2DfutvdkD","fmIK1fqypy","aDGtS0Kyfs",
+"HRxd8dpe1v","Ta8f6ECMvU","zz4ZU0Wr5y","7hyVv16lHc","JKWYRdhSuH","yToGWzHF1q","0KyfsHP433","hUTw7Q6Lix","4QMc9hi5X7","iB08lQChxs",
+"7Ow5CtuDyS","L7cGcmz8gx","VerEAiB08l","uupzkguMb8","5Drn0Dz1R3","QbxXcuupzk","hSSvQLbRTH","X6Pinix74r","No0QbZv7z0","8FmFHSmGzv",
+"dpe1vuAWyp","618Di8RCUA","BpYhVHRxd8","zQt6Q7fKYU","W7cTs580YD","QWxoTCK5W7","WPmlxFPfSE","lpF6W64s8N","FwEJzAkKTk","M3zXLk85Ae",
+"07n1cCqqaD","lXFOBJXljW","7ku1pBFkb8","yofH3ZhwG1","FFDui2Yz7E","zmLYDMezSW","KZamHVIlwP","FwEJzG1RhS","14FLRLbRTH","8TxD7zY1GY",
+"FFDui2ZHdk","uN6r3ulk41","faHirFGzgp","0BmCyv1Hln","fFDrJSWfou","AgJHQjS1aj","XflUqlsQGo","JRJQBBGaQY","U3yw5In3NS","Dz1R3AkKTk",
+"8hJdtfFDrJ","45cIHUl4a1","yToGWHP433","ZUnqtni2v1","s93Ml3weIF","L7cGcSWfou","VIlwPgjUTu","1LB1LNcICA","5Drn0nlaBy","kZANmZUnqt",
+"ulk41kZANm","pvgjSIjTwP","8RCUAI7p2a","2DREssx5Gl","GSQwjuTacx","soy9tl83Ud","7lUXZCfgr3","ni2v1FjHXR","8FmFHIjTwP","OUYuFO3iyQ",
+"SmGzvQChxs","uTacxyofH3","zY1GYM3zXL","atef2Oz8yZ","ulk41MmsIo","ydG8U5Mg9r","WDVWJVprf2","5IhmG55rfB","WPmlx2TRI7","RmDcr5nmWv",
+"MmsIohe9IA","MmsIoLbRTH","gf8rIAXpwE","xXTI4AmdQd","FxX9qfmIK1","2TRI7h1zcH","b29RJUmaEv","KASQ80Wr5y","QworuFVMxo","RzaZAYf2Ec",
+"GSQwjVjCZq","EdBKcTwano","brhlQ1v5hH","RzaZA5nmWv","3otm6BCxeC","EdBKc6AFT0","cmXIXKsjRK","48cHLCK5W7","0MR5XblLA9","hi5X7gf8rI",
+"i7WMQgf8rI","In3NSHzZT8","QChxssoy9t","W7cTsJRJQB","Waim6d85a9","Q6hMCUvlv4","uTacxaez9y","pFrrlNcICA","14FLRP6bcg","MojnPxXTI4",
+"oQ87rZuDtD","d85a9PYBf4","M6qcGDcpWB","618DipiJSk","CK5W7nFqik","jzUqRsuY4x","he9IAKASQ8","tvdkD1j5L8","pmeCdFxX9q","SmGzvWreyP",
+"jeskSCxVEf","EdBKchSSvQ","7ku1pvLsmS","M3zXLHfyNQ","Ta8f6rz7Ut","iB08lIn3NS","FGzgpvLsmS","CdyBVC2Irc","uPX7Gdjsrv","6q6L9ZJTXH",
+"y94nw4W0Tl","VBjhzyluBx","cShY2uupzk","xciqph1zcH","gf8rIJKWYR","IRh48KsjRK","GWqqXogLgc","FjHXRnnP8o","FwEJzOz8yZ","iqv4kZuDtD",
+"uJScXeuZA5","zbIYYGWqqX","VNCPdK20wK","0ao3lAmdQd","qQxHP29QAz","9GXkXtuDyS","taOXKTCgPp","NhXdu4dEz6","t59lRKZamH","ThjNnnnP8o",
+"uvf7A7ku1p","7fKYUoGu6x","YOfrYyvOMI","AXpwEK20wK","Ss0Zue6e4z","5iGN5VIlwP","3weIFVprf2","dhSuHZhwG1","dhSuH5VZjS","jzUqRgjUTu",
+"ZhwG1hYBCK","okgRiS2Dfu","QWxoTulk41","guMb8UlU3M","gjUTujzUqR","SmGzvDLhzM","8cVD3EoToP","7fsYMzbIYY","HlUbFeuZA5","CxVEfIBe8k",
+"wDajXpAhR1","7fsYMo8Uyd","lsQGoJ2mQi","lH1ktHfyNQ","blLA9618Di","7fKYU618Di","oQ87rt98iW","tjQxsM6qcG","HRxd8FcWrW","QnJ1Sxciqp",
+"fcwDarhl0J","FcWrWMkgy8","WaWsvReKEW","tjQxspT8wu","ECMvUjzUqR","4dEz6v8yFN","dmoS7lViBv","MezSWMaJQs","5NammK20wK","AgJHQkB5nP",
+"0YAGHUlU3M","lj07QMm8si","9iGoTru4UG","CqqaDWMiS3","fmIK1Nxx9V","8TxD7ru4UG","Yf2Ec8U2nU","PYBf4gIYvE","QnJ1SEOE1o","soy9t6q6L9",
+"s93Ml2Yz7E","9GXkXBCxeC","L7cGc0ao3l","Qworub29RJ","jeskSlCMxy","okgRiCNHmv","nnP8oX6Pin","qUJMdgjUTu","JIqXiyvOMI","sx5GlWPmlx",
+"CdyBVs4786","M3zXLlweGy","gf8rIuLtKs","ThjNnAXpwE","dpe1vrhl0J","0BmCyFGzgp","JXljWW7cTs","1j5L8cmXIX","OUYuF1LB1L","jeskSguMb8",
+"ZUnqtlpF6W","FcWrWuLtKs","FLsphK4GS8","48cHLjiVBP","6q6L9QClRL","55rfBLewvM","VBjhzPOUYS","S77LHdhSuH","C2Irc8RCUA","FFDui1v5hH",
+"uAWypuvf7A","8cVD345cIH","h1zcHksJby","C2Irc9GXkX","I7p2aprNT6","mz8gx5VZjS","SWfouFNYIM","oVQp65drc6","PYBf4Twano","uPX7GRzaZA",
+"6q6L9618Di","sx5GlNhXdu","0PktIWDVWJ","K4GS8QYxC0","2ZHdkAmdQd","24ARFcQOnv","F6PT2s4786","lweGyWPmlx","Yw2oUiqv4k","k85AeKr8ys",
+"nnP8oJkzUn","WaWsvG1RhS","Zv7z02DREs","L7cGcWPmlx","2TRI76AFT0","lXFOB9y4lw","GWqqXxReec","oVQp6MmsIo","BCxeCmz8gx","brhlQdQ586",
+"POUYSTCgPp","tuDySzbIYY","lm0pDjzUqR","2hEEUZUnqt","CIShG9iGoT","pT8wujeskS","EoToPx3LDe","5nmWvVNCPd","okgRi5iGN5","CdyBVpFrrl",
+"uLtKs8hJdt","5NammzHF1q","UlU3MCdyBV","oQ87rlm0pD","BbwgA8hJdt","FPfSEYOfrY","pFrrlZJTXH","1j5L81LB1L","FNYIMyEfy9","x3LDetlILt",
+"gf8rI7hyVv","WMiS3GSQwj","7Ow5CDcpWB","IKxdLsoy9t","AmdQdtuDyS","Oz8yZMkgy8","TwanoM3zXL","XyPZNUlU3M","1LB1LMmsIo","RBhp0d7vjM",
+"Vprf2t98iW","Chuy38cVD3","lViBvBFkb8","qaofNpWiOs","Chuy3GrDg7","YOfrYyEfy9","2NslmWreyP","3weIFvkCHH","uJScXF6PT2","Q6hMCkZANm",
+"HRxd8U3yw5","ReKEW1j5L8","4QMc9SjskQ","5nmWvBCxeC","MmsIogf8rI","pWiOsAIYUu","ECMvUM6qcG","6AFT0MojnP","FnPFBAkKTk","rz7UtDQimp",
+"jSjS3HlUbF","i7WMQAkKTk","AOgEehi5X7","8U2nUyofH3","cmXIXkZANm","fqypyXyPZN","aFFssix74r","uvf7AbrhlQ","XflUqDLhzM","v2eC3uTacx",
+"wDajXzY1GY","dQ586EOE1o","618DilkMUA","NAFuwlXFOB","vOqCEpT8wu","FcWrWulk41","3weIFmz8gx","lViBveuZA5","0BmCyTXQ0Z","5drc6CxVEf",
+"kZANmK20wK","faHirRzaZA","5IhmGVIlwP","KZamHFnPFB","TXQ0Ztl72W","MK07YgjUTu","RmDcrAkKTk","HzZT8iwzGk","AXpwEksJby","lXFOBVNCPd",
+"QssNCqUJMd","d85a9uvf7A","GSQwj2TRI7","tl72WBbwgA","SWfoujiVBP","hE1Ql2TRI7","CNHmvbZLvS","2DREsmX2GE","aL6AJVLTy6","FGzgpRmDcr",
+"NhXduJIqXi","JJs5mCIShG","hi5X7X6Pin","he9IAPOUYS","JRJQBTXQ0Z","jeskS7X3uy","wiHrZ16lHc","cL0aEl83Ud","zY1GY2Nslm","O3iyQJJs5m",
+"Yf2Ece6e4z","sx5GlMK07Y","tvdkDW7cTs","Uvlv4y94nw","gIYvE8RCUA","AkKTkPOUYS","Ss0Zu5Namm","pWiOsBFkb8","djsrvDcpWB","EoToPru4UG",
+"pFrrldQ586","rKDLJSWfou","gjUTuPOUYS","M6qcGfFDrJ","ECMvUhe9IA","suY4x5drc6","zQt6Q6q6L9","Q6LixksJby","ZhwG1ThjNn","VjCZqHRxd8",
+"0PktI1j5L8","uJScXJIqXi","oGu6xCp3mZ","9GXkXHlUbF","NAFuwG1RhS","bgJAzi3pyd","FPfSEiB08l","jS1ajciuWz","y94nwiKqhr","tAOsruN6r3",
+"BGaQYFPfSE","M6qcGhe9IA","WaWsvU3yw5","uoStwQworu","v1HlnHfyNQ","hSSvQ9iGoT","MaJQsSmGzv","RkQkeMezSW","ZJTXHFVMxo","2ZHdkQnJ1S",
+"Pb1paWaim6","blLA9BpYhV","07n1ceuZA5","lpF6WpvgjS","fqypyQYxC0","JkzUnSbRYy","wiHrZ07n1c","DG4sT14FLR","hYBCK8cVD3","VBjhzThjNn",
+"taOXKuoStw","VerEAZhwG1","VIlwPmX2GE","zbIYY0Wr5y","oVQp64dEz6","s93MlzFgtB","M6qcGP6bcg","5Drn01j5L8","5Mg9rfLNg8","1LB1L6AFT0",
+"JRJQB6q6L9","xReecBCxeC","CxVEfjiVBP","FFDuizHF1q","b29RJlm0pD","MmsIoCIShG","NcICAMojnP","FNYIMfaHir","RkQkeVprf2","KsjRKNOHsz",
+"FLsphdhSuH","9iGoTl83Ud","Yh1hFReKEW","L7cGc2Yz7E","618DizQt6Q","2hEEUOUYuF","rKDLJ16lHc","rhl0J8TxD7","JRJQBguMb8","ReKEWQClRL",
+"8RCUA7X3uy","POUYSzz4ZU","8cVD3lkMUA","IjTwPNxx9V","fcJOysx5Gl","MmsIoK4GS8","45cIHjfREu","o8UydJJs5m","k85AeFPfSE","tvdkDNOHsz",
+"xciqp0PktI","xciqpSbRYy","6AFT0Nxx9V","M6qcGtlILt","G1RhSgjUTu","XyPZN8xEKz","iB08lWaim6","wiHrZVjCZq","X6PinGXdoH","BFkb8IRh48",
+"aL6AJm4bxU","s7MxkSs0Zu","0MR5XxXTI4","Nxx9VbrhlQ","Y1mC045cIH","aDGtSulk41","7hyVvIBe8k","lCMxyChuy3","d85a97Ow5C","ru4UGpmeCd",
+"ydG8UG1RhS","WPmlxMm8si","ciuWz55rfB","MezSWDQimp","AIYUunFqik","EdBKczHF1q","9GXkXQYxC0","D6rByt98iW","tl72Wa00b5","aez9yFNYIM",
+"AIYUuBbwgA","FFDuiiKqhr","4W0TllH1kt","o8UydFwEJz","UlU3M2Nslm","NcICADLhzM","JKWYRpT8wu","GSQwj2ZHdk","XflUq8FmFH","HzZT8WreyP",
+"k85AeD6rBy","AmdQdDz1R3","14FLRZv7z0","uJScXs7Mxk","2hEEUd85a9","a00b5P6bcg","4QMc90PktI","SmGzvXyPZN","fcwDae6e4z","lCMxyB3qem",
+"sx5GlksJby","jSjS3gf8rI","RBhp0B3qem","64s8N5Drn0","MGlTF2Nslm","8hJdt7ku1p","fFDrJi7WMQ","No0QbQnJ1S","oVQp6ydG8U","4W0Tl6AFT0",
+"FFDuipT8wu","QssNC8TxD7","SmGzvCNHmv","618DiDG4sT","FNYIMMezSW","14FLRIKxdL","CqqaDNxx9V","2hEEUHRxd8","FPfSEatef2","Z4I1vAgJHQ",
+"KASQ8CxVEf","l83UdQ6hMC","jtn0XJRJQB","2Yz7E4dEz6","DLhzMMm8si","cmXIXBGaQY","VBjhzfcJOy","sqVrfHfyNQ","uTacx618Di","d85a9ru4UG",
+"lCMxy55rfB","zbIYYgIYvE","oQ87rLewvM","pFrrlbrhlQ","SbRYyyEfy9","0KyfsCp3mZ","qQxHPJIqXi","SjskQDLhzM","Mm8sizbIYY","tuDySuLtKs",
+"tvdkD8TxD7","8FmFHyvOMI","lH1ktSs0Zu","pvgjSi7WMQ","FjHXRFwEJz","blLA9zmLYD","zFgtBUlU3M","SWfouIn3NS","W7cTsaDGtS","GXdoHWDVWJ",
+"vLsmSxXTI4","7fKYU45cIH","FLsphnnP8o","7X3uyLDk6f","9eoRcjtn0X","DLhzMatef2","L7cGczQt6Q","5IhmGSs0Zu","cShY2Zv7z0","Uvlv4AkKTk",
+"Mkgy8HlUbF","fLNg8Mkgy8","azIWpi7WMQ","9rlg9S2Dfu","ZuDtDiqv4k","F6PT20BmCy","ZJTXH5IhmG","KZamHn8pJ9","YjB9tJIqXi","KZamHcShY2",
+"lCMxye6e4z","tl72WmX2GE","uvf7AGv3Fq","NcICAs7Mxk","5ZaEzdjsrv","VLTy6NcICA","45cIHCdyBV","WMiS3d85a9","lCMxyAkKTk","oVQp6OxWIH",
+"tl72WOHaBz","C2Irc2TRI7","jSjS3pmeCd","MmKGJTXQ0Z","DQimpNhXdu","7fsYMnnP8o","mz8gxFFDui","WPmlxIn3NS","rz7Ut24ARF","zbIYYUlU3M",
+"bZLvSM6qcG","1j5L8iqv4k","uAWypHzZT8","jS1ajTa8f6","XyPZNmz8gx","618Di0h1b1","pv0i79iGoT","ydG8UjS1aj","d7vjM7lUXZ","s7Mxk14FLR",
+"RpBQmAXpwE","okgRiCxVEf","Ss0Zut59lR","StlDJoQ87r","8hJdtnFqik","mz8gxNOHsz","5nmWva00b5","Twano7hyVv","AgJHQJKWYR","azIWpyluBx",
+"WMiS3CdyBV","0MR5XAgJHQ","rz7UtqUJMd","zQt6QogLgc","LewvMWaWsv","mz8gxY1mC0","jzUqRsoy9t","CxVEf2hEEU","zY1GYjSjS3","8RCUAEdBKc",
+"s7MxkQ6Lix","StlDJCNHmv","o8UydGWqqX","uvf7AlpF6W","TCgPpS2Dfu","1LB1LyEfy9","suY4xgIYvE","prNT6Twano","MK07YoGu6x","pFrrlaL6AJ",
+"45cIHuPX7G","Dz1R3cShY2","14FLR2Yz7E","X6Pinx3LDe","5ZaEzlXFOB","0h1b1JRJQB","Mkgy8K4GS8","i7WMQTa8f6","dhSuHTwano","SWfou8FmFH",
+"Kr8ysfqypy","lViBvbgJAz","iwzGkNcICA","TCgPpOz8yZ","9iGoT7ku1p","QClRLWaim6","Yf2Ec9XyT9","GSQwj9GXkX","5drc6OUqFM","SWfou0Wr5y",
+"Gv3FqNOHsz","Yf2EczqH0W","TwanoSWfou","55rfB9rlg9","lViBvdpe1v","k85AeqQxHP","NcICABGaQY","GSQwjFGzgp","v2eC3euZA5","YjB9tfLNg8",
+"ix74rrhl0J","Mm8si16lHc","faHirReKEW","O3iyQhi5X7","kZANmFxX9q","JXljW8U2nU","pFrrlGXdoH","uAWyp3otm6","YjB9t8cVD3","8hJdt5Drn0",
+"GWqqXBbwgA","X6PinhYBCK","oGu6xJJs5m","dpe1vPYBf4","iB08l0ao3l","CK5W7i7WMQ","BFkb8e6e4z","cL0aEatef2","Ta8f6S2Dfu","nlaByTCgPp",
+"8xEKzFNYIM","FhtglfcJOy","Ta8f6QnJ1S","aez9yDG4sT","uPX7GwDajX","2NslmU3yw5","7X3uy2ZHdk","RpBQmVBjhz","F6PT2atef2","OUqFMMkgy8",
+"jzUqRgIYvE","oVQp6cShY2","BbwgA64s8N","fmIK1WDVWJ","14FLRTXQ0Z","K4GS8D6rBy","RmDcr8cVD3","HzZT8Ta8f6","Yf2EcNhXdu","lkMUA2TRI7",
+"ZzJHWEdBKc","FcWrWKsjRK","UlU3MI7p2a","fcwDamX2GE","i7WMQk85Ae","MmsIoQYxC0","9y4lwTXQ0Z","d85a9uN6r3","kZANmCdyBV","4dEz6M3zXL",
+"CK5W71v5hH","5ZaEzBCxeC","JIqXinFqik","zbIYYb29RJ","BbwgAUvlv4","gjUTuRBhp0","1LB1LBbwgA","KsjRKIjTwP","5iGN5hE1Ql","Yw2oUlweGy",
+"Cfgr32TRI7","bgJAzo8Uyd","C2IrcQ6hMC","XflUqyvOMI","uvf7AWaWsv","nFqikCNHmv","2DREsblLA9","9eoRcd85a9","pv0i7GWqqX","0ao3lGv3Fq",
+"QssNClpF6W","SWfouhYBCK","WDVWJNAFuw","soy9tAOgEe","RpBQmM3zXL","QworuAXpwE","EdBKcCK5W7","QYxC0d7vjM","580YDi3pyd","3weIFuoStw",
+"JJs5mjeskS","G1RhSIRh48","zqH0W9iGoT","oQ87rAgJHQ","2DREs0PktI","Cp3mZciuWz","okgRi7lUXZ","uAWypHP433","Cp3mZ2Nslm","5Nammn1pmO",
+"7ku1pn1pmO","s7MxkFhtgl","8TxD7DG4sT","2hEEUhE1Ql","S77LHtuDyS","hUTw73otm6","OHaBz0h1b1","hE1QlYw2oU","jS1ajyEfy9","CxVEfn1pmO",
+"QbxXcjiVBP","ogLgcBGaQY","WPmlxlpF6W","gjUTuRzaZA","Yh1hFjtn0X","l83UdokgRi","8xEKz0ao3l","S2DfuxReec","guMb80BmCy","Q6Lixuvf7A",
+"FnPFBPYBf4","RBhp0oQ87r","9eoRci7WMQ","5Drn0Uvlv4","cQOnvcmXIX","bgJAzrhl0J","WDVWJt98iW","Ss0Zu0MR5X","o8UydtaOXK","iB08lIBe8k",
+"lkMUA9y4lw","zbIYYFLsph","OUqFMG1RhS","hSSvQyofH3","JIqXiulk41","K20wK9GXkX","F6PT2U3yw5","blLA9YOfrY","YjB9tAIYUu","rhl0JJJs5m",
+"29QAzEOE1o","tl72WBGaQY","IKxdLnFqik","mX2GEuN6r3","zFgtBOUqFM","0PktI5Drn0","Yw2oU4QMc9","K20wK3otm6","MmsIoulk41","WmadAIKxdL",
+"RACujFcWrW","piJSkIjTwP","0PktIZuDtD","618DiKsjRK","618DiKASQ8","Ul4a1y94nw","tl72WlsQGo","ciuWzYh1hF","blLA9O3iyQ","lCMxyiwzGk",
+"vkCHHNhXdu","JXljW580YD","pFrrlJKWYR","MaJQse6e4z","d7vjMG1RhS","SjskQZ4I1v","7lUXZdQ586","JkzUnpvgjS","S77LHpiJSk","LDk6fOUYuF",
+"rz7UtlpF6W","5IhmGsuY4x","lm0pDaDGtS","5ZaEziKqhr","pT8wuCK5W7","HlUbFpAhR1","8TxD7pvgjS","sqVrfb29RJ","RsQUqMezSW","DG4sTt98iW",
+"FPfSEFFDui","7hyVvCfgr3","9GXkX5IhmG","S2Dfu9GXkX","lj07QuJScX","RsQUq4dEz6","7fsYM1v5hH","NAFuwUlU3M","QnJ1SBGaQY","5drc645cIH",
+"wiHrZo8Uyd","gtCA5FwEJz","v8yFNFjHXR","HRxd8n8pJ9","GWqqXzqH0W","gf8rIbZLvS","lXFOBydG8U","pWiOsHfyNQ","nFqikU3yw5","No0QbHlUbF",
+"uLtKshSSvQ","jeskSlkMUA","lpF6WRzaZA","DcpWBsx5Gl","LewvMMGlTF","Z4I1vLDk6f","xXTI4jeskS","FGzgpChuy3","lCMxyVLTy6","RmDcrpFrrl",
+"QbxXcXflUq","3weIF6q6L9","uPX7Ge6e4z","euZA5oGu6x","Z4I1vlXFOB","l83UdRzaZA","7lUXZzFgtB","55rfBaL6AJ","rhl0J9XyT9","8U2nUdQ586",
+"2TRI7cQOnv","ogLgcUvlv4","nlaBy2Yz7E","djsrvMkgy8","Mm8siWDVWJ","dQ586Chuy3","7hyVvJ2mQi","hYBCK8U2nU","KZamHydG8U","AIYUus4786",
+"Zv7z01j5L8","IBe8ky94nw","VLTy6lweGy","QYxC0HzZT8","y94nwuN6r3","WaWsvbrhlQ","aez9y5Namm","Yf2EcdhSuH","soy9tFhtgl","nFqikdQ586",
+"16lHcv1Hln","M6qcGZv7z0","45cIHHzZT8","lCMxy16lHc","CIShGcmXIX","FVMxoDcpWB","v8yFNSs0Zu","zFgtBzmLYD","pAhR1t98iW","tjQxs2TRI7",
+"48cHLHP433","8RCUAiB08l","ru4UGjtn0X","DG4sT7hyVv","0MR5XZJTXH","ThjNnQWxoT","5VZjSHzZT8","kB5nPyEfy9","BCxeChSSvQ","8cVD3lm0pD",
+"WaWsvKsjRK","0YAGHMK07Y","AgJHQECMvU","Uvlv4QnJ1S","POUYSlViBv","IBe8kaL6AJ","7Ow5ChSSvQ","xciqpRpBQm","mX2GE8xEKz","FLsphUmaEv",
+"9iGoTFwEJz","C2IrcNxx9V","3weIFWMiS3","FcWrWyEfy9","In3NSv2eC3","5Mg9rpiJSk","FGzgp24ARF","I7p2aNOHsz","Kr8ys7ku1p","29QAzVBjhz",
+"pT8wuoQ87r","iB08lAmdQd","suY4xNxx9V","Yw2oU8FmFH","FjHXRBCxeC","GrDg7uoStw","7hyVvWMiS3","24ARFlweGy","VLTy6gdQsS","kB5nP9rlg9",
+"EdBKcKZamH","GrDg7WPmlx","5drc6Chuy3","hi5X7FNYIM","ZuDtD8xEKz","RpBQmMojnP","Zv7z0Fhtgl","dpe1vvOqCE","KZamHoVQp6","uvf7AMojnP",
+"ulk41vkCHH","8cVD3soy9t","qUJMdulk41","1j5L8i7WMQ","LDk6fciuWz","M3zXLAIYUu","8hJdt4QMc9","Q6Lixlm0pD","lpF6WeuZA5","WaWsvC2Irc",
+"pFrrlU3yw5","xReecd7vjM","BFkb8VjCZq","QChxsIBe8k","RBhp0cShY2","x3LDejtn0X","WPmlxNxx9V","i7WMQs7Mxk","aFFssYh1hF","4W0TlQChxs",
+"0KyfsJJs5m","Yh1hF0Kyfs","Fhtgl3otm6","hYBCKoVQp6","hUTw7fFDrJ","iB08lMGlTF","xciqpyToGW","b29RJaL6AJ","I7p2aIKxdL","JXljWHRxd8",
+"WDVWJFPfSE","VerEA2ZHdk","P6bcg0MR5X","IKxdL5Mg9r","IRh48dhSuH","0YAGHHP433","45cIHReKEW","HRxd8K4GS8","HlUbFfLNg8","mX2GEoQ87r",
+"tl72WpvgjS","piJSkhUTw7","dpe1vdmoS7","4QMc9blLA9","bZLvSHP433","Cp3mZAXpwE","pvgjS8hJdt","G1RhSEoToP","guMb8J2mQi","NcICAS77LH",
+"1v5hH8cVD3","HRxd8RsQUq","DLhzMWmadA","uJScXRBhp0","QnJ1SWaWsv","x3LDeM6qcG","GXdoHtjQxs","AgJHQStlDJ","RpBQmtlILt","580YD7X3uy",
+"NcICAYf2Ec","2Yz7ERACuj","FcWrWhSSvQ","lweGyuJScX","HzZT8ydG8U","ogLgcDG4sT","F6PT2FNYIM","U3yw5FPfSE","0YAGHfcwDa","FPfSE64s8N",
+"hYBCKF6PT2","uPX7G9rlg9","QClRLZhwG1","dhSuHyEfy9","uN6r32TRI7","64s8NAmdQd","BCxeC6AFT0","YjB9tFPfSE","HP433FPfSE","uN6r3LDk6f",
+"In3NSVerEA","0PktIjS1aj","GSQwjuJScX","RsQUqbgJAz","C2IrcksJby","WreyPblLA9","lH1ktqQxHP","pv0i7K4GS8","CK5W7OHaBz","1LB1LfcJOy",
+"GSQwjv1Hln","VLTy6dmoS7","aDGtSwDajX","aez9yhYBCK","JRJQBBpYhV","ni2v1hYBCK","ni2v1djsrv","F6PT2yofH3","ZJTXHCxVEf","ksJbyNAFuw",
+"HP433MmKGJ","blLA9zFgtB","RmDcrv2eC3","DcpWBn1pmO","xReec24ARF","HlUbFdjsrv","9rlg9x3LDe","uTacxpAhR1","29QAzGXdoH","d7vjMGrDg7",
+"jS1aj07n1c","SWfou7lUXZ","XflUqQnJ1S","hUTw7jzUqR","cmXIXFFDui","3otm6Oz8yZ","uQIcz8xEKz","9y4lwjSjS3","2hEEUpT8wu","TwanoiwzGk",
+"piJSk8FmFH","mz8gxJXljW","jSjS3iB08l","rKDLJrhl0J","Ta8f6618Di","0BmCyGWqqX","J2mQihSSvQ","WDVWJHzZT8","Zv7z0suY4x","1LB1LVerEA",
+"fcJOyNOHsz","5VZjSyvOMI","QbxXct59lR","TwanouQIcz","Q6hMCChuy3","IBe8kKr8ys","pmeCdFGzgp","Qworu3otm6","dhSuH3weIF","uJScXDLhzM",
+"IjTwPzqH0W","euZA5fcwDa","d7vjMhUTw7","XyPZNOHaBz","WDVWJBFkb8","WreyPIjTwP","RzaZAJXljW","2DREs5Drn0","BGaQYVLTy6","l83UdFxX9q",
+"n1pmOe6e4z","AgJHQPOUYS","07n1c0BmCy","l83Ud55rfB","Gv3FqfmIK1","14FLREOE1o","zz4ZUhUTw7","RpBQmB3qem","qUJMdUl4a1","1v5hHs7Mxk",
+"AmdQd2Nslm","Chuy32ZHdk","RBhp0yToGW","ciuWzazIWp","ZhwG11v5hH","hUTw7tAOsr","GWqqXjSjS3","MezSW48cHL","o8UydRkQke","M3zXLFPfSE",
+"MojnPx3LDe","d7vjMMGlTF","SWfou9GXkX","StlDJulk41","BGaQY0ao3l","TXQ0ZMGlTF","soy9tDcpWB","FnPFBcShY2","14FLRs7Mxk","LewvMDcpWB",
+"DcpWBaDGtS","Dz1R3he9IA","M6qcGYf2Ec","EOE1oYf2Ec","b29RJm4bxU","pvgjSiB08l","kZANmReKEW","i7WMQEOE1o","In3NSuJScX","5NammprNT6",
+"rz7UtFGzgp","tvdkDrz7Ut","LbRTH8U2nU","4dEz6azIWp","ZUnqtTwano","yEfy9PYBf4","UlU3Mlj07Q","YOfrYiqv4k","cmXIXMkgy8","pAhR1MojnP",
+"YjB9tHfyNQ","Waim6v8yFN","cL0aEIn3NS","SjskQUlU3M","UlU3M6AFT0","0KyfslsQGo","v2eC3zmLYD","5nmWvbrhlQ","No0QbpFrrl","VerEAyofH3",
+"5IhmGo8Uyd","lViBv3otm6","5VZjSlkMUA","uPX7GRsQUq","lViBvFxX9q","2Nslm29QAz","m4bxUtjQxs","W7cTs5Drn0","GSQwjFhtgl","rKDLJv2eC3",
+"YOfrYlpF6W","n1pmO0ao3l","RsQUqguMb8","RBhp0M3zXL","Mm8sigdQsS","prNT6Oz8yZ","Mkgy8blLA9","OHaBz2hEEU","QssNC5nmWv","BCxeCfcwDa",
+"29QAzk85Ae","U3yw5EoToP","IjTwPjiVBP","ECMvU8TxD7","ZuDtDVerEA","AXpwEbgJAz","MezSW2Nslm","gjUTuFNYIM","Waim6QbxXc","9XyT9yofH3",
+"4W0TlFFDui","JkzUnokgRi","5iGN5v8yFN","xXTI4lj07Q","F6PT2POUYS","YOfrYdjsrv","FVMxoG1RhS","Y1mC0ydG8U","zz4ZU580YD","64s8NdhSuH",
+"HRxd8zbIYY","FxX9qCfgr3","brhlQtl72W","tuDySZzJHW","vOqCEW3VFH","uTacxHlUbF","lCMxyxReec","MezSWtuDyS","1v5hHHfyNQ","LewvM7fsYM",
+"zQt6Qix74r","FxX9qGXdoH","7ku1pJkzUn","YOfrYZ4I1v","AXpwENAFuw","zHF1q29QAz","6AFT0No0Qb","CdyBVs93Ml","ulk41FLsph","ydG8UMmKGJ",
+"xReecWPmlx","qUJMdFFDui","oGu6xgjUTu","RsQUqNxx9V","0BmCyVjCZq","FGzgpQClRL","Ta8f6zbIYY","FPfSE4QMc9","AOgEe618Di","FVMxocmXIX",
+"IRh48dmoS7","oVQp6UmaEv","hSSvQazIWp","lkMUAatef2","HfyNQdpe1v","AkKTkatef2","uTacxDcpWB","uTacx9GXkX","GSQwjC2Irc","ru4UGfmIK1",
+"8TxD7VLTy6","07n1coVQp6","DG4sTm4bxU","CNHmvNhXdu","pvgjSS2Dfu","RpBQmfaHir","Ta8f6lCMxy","QbxXcCIShG","Yh1hFZv7z0","IBe8kMmsIo",
+"guMb8d7vjM","Oz8yZTwano","uoStwECMvU","WMiS3uPX7G","5Drn0yofH3","TXQ0ZuZPqg","fFDrJBGaQY","SbRYyv1Hln","C2IrcBGaQY","2TRI7WreyP",
+"P6bcgdmoS7","sqVrfFVMxo","i7WMQUl4a1","a00b5AXpwE","DLhzMRsQUq","MmsIo9eoRc","jSjS3d7vjM","CqqaDi3pyd","iqv4kUvlv4","EdBKclViBv",
+"StlDJuPX7G","aL6AJpv0i7","WmadAMojnP","O3iyQiqv4k","MojnPiB08l","gdQsSlH1kt","WreyPaez9y","EdBKcO3iyQ","ZhwG1FwEJz","XflUqyofH3",
+"0PktIYf2Ec","M3zXLsoy9t","POUYSk85Ae","UlU3MDQimp","7fKYUMezSW","9iGoTS77LH","8TxD7ZJTXH","kZANm4QMc9","9iGoTfqypy","AOgEeoGu6x",
+"618DibZLvS","ThjNnpAhR1","U3yw5FLsph","yofH3lpF6W","8RCUATCgPp","tlILtB3qem","5ZaEz5IhmG","CqqaDni2v1","ogLgcMkgy8","rz7Ut5VZjS",
+"kB5nP4QMc9","atef2EoToP","AkKTk5drc6","pAhR15ZaEz","9iGoTiB08l","JRJQB9GXkX","BFkb8zqH0W","v8yFNtjQxs","Mkgy87Ow5C","jSjS314FLR",
+"oGu6xzQt6Q","CxVEfYh1hF","uvf7Ad7vjM","iB08lSmGzv","Q6hMCmz8gx","gjUTubgJAz","VerEAW7cTs","FLsph4dEz6","S2Dfuni2v1","lViBvOz8yZ",
+"QClRLFnPFB","lViBvd85a9","FwEJze6e4z","RsQUqBpYhV","CdyBVMmsIo","IBe8kdjsrv","5ZaEzPb1pa","FnPFB1LB1L","48cHL7hyVv","yToGWgtCA5",
+"JRJQBhUTw7","Dz1R3AXpwE","Pb1paWaWsv","WPmlx8U2nU","zz4ZUaFFss","MK07YcShY2","7Ow5CQnJ1S","UlU3MuAWyp","CxVEfsqVrf","SWfouVerEA",
+"okgRiuTacx","5ZaEzSjskQ","Cfgr38hJdt","4QMc9djsrv","RzaZAIRh48","6AFT0aL6AJ","48cHLB3qem","hSSvQsqVrf","xXTI4Twano","In3NSvLsmS",
+"dQ5862Yz7E","m4bxUuPX7G","jSjS3n8pJ9","zz4ZUJRJQB","Pb1paJRJQB","tlILtEOE1o","0ao3lguMb8","VNCPdzmLYD","taOXKYjB9t","9GXkX8cVD3",
+"lm0pDDz1R3","45cIH9eoRc","rz7UtiB08l","9eoRcsoy9t","07n1cOHaBz","okgRijS1aj","zY1GYJXljW","jiVBPReKEW","5drc614FLR","fLNg8ZJTXH",
+"zHF1qiB08l","RzaZAlsQGo","AXpwEMK07Y","v8yFN0h1b1","jzUqRQworu","tlILttlILt","uZPqgnlaBy","Zv7z0TCgPp","LbRTH0YAGH","FjHXRSbRYy",
+"ZzJHWUl4a1","pT8wuO3iyQ","pT8wuZv7z0","Ss0ZuIRh48","lj07Q4W0Tl","JkzUneuZA5","7ku1pS2Dfu","U3yw5cmXIX","24ARF5Namm","5Mg9rlweGy",
+"MojnPni2v1","O3iyQVjCZq","mz8gx8FmFH","TCgPpVprf2","16lHcQworu","pWiOs5ZaEz","4W0TlF6PT2","zY1GYO3iyQ","VerEA29QAz","s4786faHir",
+"YjB9tyluBx","yofH34W0Tl","JIqXiPb1pa","4dEz6VLTy6","ydG8Usx5Gl","MojnP2DREs","jeskSrKDLJ","ydG8U5IhmG","zbIYYTXQ0Z","blLA9QChxs",
+"lj07QTwano","nFqiktlILt","gIYvEKASQ8","s93Ml0MR5X","faHiryToGW","lweGyK4GS8","OHaBzIRh48","suY4xpvgjS","rKDLJK20wK","fFDrJKZamH",
+"o8UydDz1R3","AOgEeuQIcz","Ss0ZuUmaEv","bgJAziKqhr","jfREufFDrJ","IKxdLa00b5","K4GS8Fhtgl","8U2nUFcWrW","tvdkDGv3Fq","suY4xChuy3",
+"brhlQ9y4lw","7fKYUCNHmv","45cIH5Mg9r","618DiG1RhS","2TRI7n8pJ9","uupzkiqv4k","DQimpWMiS3","aDGtSyToGW","rKDLJ7ku1p","qaofNMmKGJ",
+"7X3uysoy9t","FNYIMdmoS7","hE1QlWreyP","hi5X7lj07Q","gIYvEgIYvE","RkQkeNo0Qb","0PktInFqik","jiVBPaFFss","ciuWzfmIK1","CIShGjfREu",
+"0PktIBFkb8","PYBf4ulk41","In3NSAgJHQ","7fsYMM3zXL","RpBQmKASQ8","xciqpAgJHQ","G1RhS45cIH","ReKEW9iGoT","fLNg85iGN5","lkMUAgjUTu",
+"zmLYDI7p2a","TwanoyluBx","azIWp0BmCy","t59lRyEfy9","nnP8oThjNn","In3NSFGzgp","nnP8o5VZjS","yEfy9Cp3mZ","x3LDePOUYS","RxrsmJJs5m",
+"HP433uQIcz","n1pmObZLvS","gIYvEOxWIH","jzUqRydG8U","brhlQEoToP","9iGoTAIYUu","7Ow5CbZLvS","JkzUndmoS7","ZuDtDP6bcg","ECMvUOUYuF",
+"0Wr5y45cIH","kZANmGSQwj","Ul4a12hEEU","djsrv07n1c","1v5hHDG4sT","jSjS3Yf2Ec","pmeCd64s8N","SWfouGv3Fq","ulk41IBe8k","OxWIHI7p2a",
+"fFDrJVLTy6","ydG8ULbRTH","AIYUudhSuH","NOHszhi5X7","MojnPDLhzM","d7vjMFxX9q","gIYvEmX2GE","ix74rFVMxo","b29RJQ6hMC","SbRYyK20wK",
+"S77LHs93Ml","VLTy6uJScX","yofH38cVD3","BGaQYChuy3","5IhmG8xEKz","7Ow5CGSQwj","0PktI55rfB","29QAzPYBf4","Kr8ys24ARF","aDGtSS77LH",
+"pv0i7BFkb8","Rxrsm2hEEU","Qworu4W0Tl","hi5X7gdQsS","uupzksoy9t","16lHcs4786","1j5L8FwEJz","lkMUALDk6f","he9IAZv7z0","Mm8si2TRI7",
+"U3yw5AXpwE","aL6AJKZamH","0ao3laDGtS","QnJ1SYf2Ec","SmGzvSmGzv","bgJAzFxX9q","PYBf4POUYS","uJScXG1RhS","Cfgr3FFDui","vLsmSQWxoT",
+"SjskQEoToP","Chuy3dhSuH","IKxdLQnJ1S","5IhmGmz8gx","i7WMQTwano","W7cTsYOfrY","VNCPduoStw","5iGN5X6Pin","uvf7A55rfB","azIWplj07Q",
+"MmsIopFrrl","Cp3mZReKEW","UmaEvbgJAz","7hyVvatef2","Gv3FqThjNn","UlU3MGSQwj","rz7UtCK5W7","RsQUq2hEEU","2ZHdkFVMxo","zY1GYZhwG1",
+"lpF6WY1mC0","vkCHHv1Hln","Gv3FqhE1Ql","5iGN5AkKTk","uvf7A6AFT0","HfyNQtl72W","uvf7AgjUTu","uAWypbZLvS","lH1ktsuY4x","v2eC3qUJMd",
+"gf8rIblLA9","Ss0Zud7vjM","piJSkfaHir","I7p2aMGlTF","djsrvuAWyp","ZuDtD2TRI7","NhXduChuy3","zQt6QI7p2a","gdQsSciuWz","Ss0ZuFGzgp",
+"X6PinJJs5m","ni2v19GXkX","WMiS3LewvM","nnP8oIn3NS","SWfouAXpwE","FcWrWcQOnv","bZLvScShY2","0YAGHzY1GY","24ARFx3LDe","iwzGkaL6AJ",
+"jtn0X07n1c","ZUnqtMm8si","9iGoT24ARF","618DiZJTXH","mX2GEuupzk","8cVD3Chuy3","Yw2oUe6e4z","ECMvUzqH0W","1LB1LiwzGk","0KyfsWaWsv",
+"piJSkjeskS","tuDySyofH3","8hJdtciuWz","ulk41S2Dfu","zY1GYtAOsr","C2IrcvLsmS","a00b5nnP8o","2hEEU24ARF","YjB9t45cIH","ZzJHWSmGzv",
+"WDVWJaDGtS","5VZjSdmoS7","t59lRcShY2","vLsmSSmGzv","lweGy4W0Tl","CIShGogLgc","yluBxS2Dfu","YjB9toGu6x","fcJOyGrDg7","4QMc9JXljW",
+"ru4UGix74r","YjB9tjS1aj","NcICAGrDg7","s93MlfLNg8","2Yz7EWMiS3","suY4xOHaBz","SWfouO3iyQ","yToGWCIShG","QChxskB5nP","U3yw5v2eC3",
+"J2mQiMojnP","9y4lwAkKTk","yofH3W7cTs","CxVEfEoToP","S2Dfu2hEEU","pmeCdF6PT2","gf8rIFcWrW","7fsYMNxx9V","W3VFHrhl0J","Chuy3o8Uyd",
+"FLsphydG8U","WaWsvuN6r3","v8yFNlpF6W","d7vjMuLtKs","9iGoTMmKGJ","azIWpnlaBy","X6Pinlj07Q","FnPFBfqypy","jeskS4dEz6","AgJHQSbRYy",
+"FnPFBlweGy","uAWyppFrrl","hUTw7BbwgA","Kr8ysbZLvS","cShY2zY1GY","LewvMZUnqt","POUYSatef2","48cHLzbIYY","prNT69GXkX","SWfouxXTI4",
+"0ao3lyvOMI","S2Dfurhl0J","4W0TlgtCA5","xXTI4Nxx9V","FwEJzQ6Lix","9rlg9NhXdu","TwanotaOXK","tlILtQWxoT","m4bxUjzUqR","HRxd86q6L9",
+"B3qem8TxD7","mz8gxJIqXi","BGaQYhe9IA","djsrv5nmWv","SjskQO3iyQ","uAWyppv0i7","Y1mC0No0Qb","TCgPp0PktI","S2DfuhUTw7","MGlTFSs0Zu",
+"FwEJz5VZjS","Uvlv45Drn0","5Mg9roVQp6","prNT6YOfrY","JJs5my94nw","AmdQdRkQke","o8UydWaWsv","JIqXidhSuH","8RCUAn8pJ9","ZJTXHqUJMd",
+"ZJTXHtjQxs","ReKEWfFDrJ","k85Ae16lHc","IBe8km4bxU","7ku1p4dEz6","L7cGclViBv","2TRI7fmIK1","hYBCKaDGtS","Mkgy8n1pmO","RBhp0Cfgr3",
+"o8Uydlm0pD","aFFssy94nw","7lUXZaDGtS","kZANmOUqFM","d7vjMxciqp","zFgtBFVMxo","Mkgy8ydG8U","n8pJ9GWqqX","BCxeCOUqFM","UmaEvIn3NS",
+"8cVD36AFT0","ZuDtDv2eC3","v8yFNIKxdL","Pb1paVNCPd","dmoS7lH1kt","lsQGoKZamH","Yf2EcD6rBy","QYxC0prNT6","i7WMQEdBKc","Ta8f65Mg9r",
+"piJSkzmLYD","aL6AJS77LH","pWiOsYf2Ec","6q6L9dpe1v","7fsYMbZLvS","lViBvYf2Ec","9XyT9G1RhS","zz4ZU7fKYU","FGzgpDLhzM","MmKGJRxrsm",
+"v1Hln24ARF","7hyVv48cHL","Chuy38FmFH","FPfSEAOgEe","HRxd8pAhR1","Dz1R32TRI7","hUTw7rKDLJ","pT8wuCxVEf","HfyNQwDajX","AmdQdQYxC0",
+"M3zXLy94nw","CK5W7FPfSE","JKWYRt98iW","QssNCVIlwP","dmoS7FxX9q","ZUnqtQChxs","uoStwNxx9V","bgJAzvkCHH","pmeCdD6rBy","CNHmv24ARF",
+"MaJQsyvOMI","VjCZqOHaBz","M6qcGkB5nP","P6bcgKsjRK","FFDuiQssNC","55rfBuN6r3","CqqaDC2Irc","I7p2ax3LDe","gIYvEMaJQs","vOqCEcShY2",
+"aFFssQYxC0","lj07Q4QMc9","ru4UGuN6r3","WmadAZhwG1","Zv7z0tjQxs","QssNCPYBf4","he9IAi7WMQ","Ul4a1wiHrZ","0PktIM3zXL","lH1ktuJScX",
+"FjHXRJkzUn","IKxdLt59lR","jeskSLDk6f","QnJ1SQYxC0","WDVWJ9XyT9","nlaBy0PktI","RxrsmtAOsr","pvgjSpWiOs","14FLRVNCPd","YjB9tS2Dfu",
+"FwEJzQClRL","48cHLuupzk","J2mQiBpYhV","5VZjSrz7Ut","Y1mC0iwzGk","WaWsvoQ87r","bZLvSFhtgl","n8pJ9M3zXL","x3LDe1LB1L","FjHXR5drc6",
+"bgJAzpAhR1","4dEz6VNCPd","4dEz6Cp3mZ","9iGoTfmIK1","yToGWo8Uyd","aL6AJAXpwE","O3iyQogLgc","EOE1oTwano","VBjhzuN6r3","ZzJHWHP433",
+"l83Ud5drc6","hi5X76AFT0","y94nwGXdoH","WreyPThjNn","pmeCd5ZaEz","B3qemPOUYS","tjQxsxciqp","ZUnqtAOgEe","ulk41yofH3","2ZHdkHRxd8",
+"s4786AmdQd","jiVBPJkzUn","JXljWReKEW","Ss0Zu7ku1p","2Yz7EL7cGc","ThjNnhe9IA","RmDcrQbxXc","D6rBySmGzv","AgJHQEOE1o","sx5GlhUTw7",
+"MmsIoZzJHW","SjskQ8RCUA","8hJdtLbRTH","Y1mC0lViBv","ZuDtDiB08l","MmKGJKASQ8","0MR5Xhi5X7","d7vjMRACuj","nlaByHP433","0MR5XMmsIo",
+"Y1mC0mz8gx","RkQkeI7p2a","0h1b1mX2GE","9y4lw7Ow5C","9rlg9M6qcG","uoStwjzUqR","JIqXiCIShG","OxWIHoVQp6","BbwgAgtCA5","cL0aE1v5hH",
+"Ta8f67fsYM","x3LDeciuWz","yEfy9Yf2Ec","7fsYMd7vjM","FjHXRHlUbF","aez9y14FLR","prNT6Q6hMC","jfREuYOfrY","tvdkDdmoS7","4QMc9EdBKc",
+"1LB1LtAOsr","YOfrYB3qem","nlaBy0YAGH","7ku1p8xEKz","9iGoTuLtKs","v1Hln64s8N","uoStwt59lR","UlU3MTwano","lViBv580YD","qQxHPatef2",
+"HfyNQKZamH","xciqpwiHrZ","0KyfsbZLvS","MmKGJiB08l","ix74ry94nw","4dEz6uTacx","tl72WRzaZA","618DiJIqXi","GXdoH9XyT9","1v5hHyofH3",
+"atef2soy9t","1v5hHpvgjS","XyPZNtuDyS","0h1b1WaWsv","JXljWaez9y","FNYIMBGaQY","FnPFBvLsmS","8U2nUt59lR","MaJQsThjNn","5Drn0iqv4k",
+"faHirM3zXL","FwEJz0BmCy","xXTI4YjB9t","MaJQslj07Q","uPX7G8TxD7","AmdQdZhwG1","48cHLvOqCE","zz4ZUYjB9t","DQimp5ZaEz","I7p2aSs0Zu",
+"aez9y1j5L8","BCxeCprNT6","9rlg98hJdt","iB08lzqH0W","Dz1R3ZhwG1","k85AeMkgy8","hE1QlqQxHP","2Yz7Eulk41","0MR5XoVQp6","uZPqg6q6L9",
+"PYBf45nmWv","IKxdLhe9IA","a00b59eoRc","0MR5X8xEKz","b29RJwDajX","t59lRChuy3","gjUTuIn3NS","cQOnvBGaQY","CqqaDl83Ud","RmDcrblLA9",
+"RsQUqECMvU","ZUnqtlj07Q","EoToPfLNg8","yluBxThjNn","hE1Qlh1zcH","Cp3mZNcICA","uTacxKsjRK","HzZT8DQimp","RBhp0YOfrY","aL6AJv8yFN",
+"Gv3Fq3weIF","cL0aEk85Ae","Y1mC0QClRL","zY1GYEdBKc","blLA9RsQUq","MmKGJ5Drn0","JKWYRdQ586","xciqp4dEz6","BFkb8Z4I1v","G1RhSVBjhz",
+"AkKTkRkQke","ix74ruoStw","9y4lwWmadA","gf8rILbRTH","ciuWzZ4I1v","0Wr5yyToGW","FxX9qXflUq","uZPqg5Mg9r","tlILtXflUq","piJSkFVMxo",
+"qUJMd1LB1L","CIShG9XyT9","VLTy6v1Hln","ulk41QbxXc","NcICAyToGW","LbRTH7Ow5C","uAWypX6Pin","NAFuwGSQwj","iB08lGrDg7","5Drn0K4GS8",
+"AOgEeBGaQY","Y1mC0iqv4k","n1pmOzz4ZU","h1zcHC2Irc","7lUXZuLtKs","fcwDa5IhmG","uLtKs580YD","0ao3l3otm6","FNYIMpv0i7","rz7UtMezSW",
+"jS1ajuQIcz","0YAGHxXTI4","lj07QJRJQB","FFDuiuZPqg","WmadA5Drn0","MK07YvOqCE","pvgjS2hEEU","cShY27X3uy","Y1mC0jzUqR","RsQUqpmeCd",
+"wDajXgf8rI","oGu6xReKEW","tAOsrgf8rI","FFDui5nmWv","lCMxydpe1v","QWxoT0YAGH","faHirP6bcg","8RCUACxVEf","NOHszpAhR1","x3LDeWaim6",
+"7fsYMK4GS8","8FmFHBCxeC","FNYIMlH1kt","0MR5X0BmCy","OxWIHbZLvS","NAFuwVNCPd","DG4sT8cVD3","Y1mC0CK5W7","1j5L8CxVEf","WDVWJBbwgA",
+"fFDrJBFkb8","CK5W7RkQke","HP433JKWYR","jtn0X0Kyfs","MezSWAIYUu","mX2GE0PktI","ECMvUzmLYD","SbRYylkMUA","PYBf4cL0aE","EoToP618Di",
+"55rfBlViBv","NAFuwVerEA","jiVBPQClRL","uJScXVerEA","GrDg70Kyfs","hi5X78TxD7","sqVrfuZPqg","fqypy5ZaEz","dhSuHuPX7G","rhl0J4dEz6",
+"Ul4a1CIShG","wiHrZni2v1","64s8N0PktI","7ku1pQChxs","tAOsr5VZjS","YOfrY1j5L8","aDGtSU3yw5","8RCUAzmLYD","bZLvSuAWyp","yluBxlViBv",
+"tvdkD9iGoT","M6qcGEdBKc","lkMUAUlU3M","Uvlv4yToGW","NcICAFjHXR","16lHcpmeCd","CdyBVAmdQd","jeskSMkgy8","cmXIX0Kyfs","fmIK1lm0pD",
+"ZuDtDGv3Fq","EoToPNcICA","euZA5aL6AJ","NcICA7fsYM","pv0i7GXdoH","2TRI7yluBx","euZA5pWiOs","Pb1pablLA9","MojnPK20wK","0ao3lfqypy",
+"a00b5zmLYD","Q6hMC0h1b1","K4GS8RzaZA","7hyVvOUYuF","FcWrWrKDLJ","Vprf2580YD","vLsmSlH1kt","CIShGC2Irc","prNT6pFrrl","tlILt9iGoT",
+"FnPFBZJTXH","HfyNQdmoS7","WmadAvkCHH","t59lRNcICA","Q6hMCRmDcr","NOHszL7cGc","dhSuH16lHc","Yf2EcydG8U","Pb1pajiVBP","zqH0WOHaBz",
+"CIShGv1Hln","MK07YWPmlx","6AFT0FGzgp","EoToPX6Pin","piJSkvkCHH","8TxD7DcpWB","jzUqR8hJdt","t98iWcQOnv","16lHcoVQp6","hi5X75nmWv",
+"pWiOsMezSW","2Yz7EaL6AJ","VLTy6G1RhS","GXdoHk85Ae","v1Hlnsx5Gl","ZJTXHsx5Gl","m4bxU64s8N","QnJ1SDQimp","OxWIHuTacx","QworuazIWp",
+"7Ow5CdhSuH","azIWpgdQsS","s93MltuDyS","pT8wuSmGzv","v2eC3Yh1hF","zmLYDThjNn","HlUbFtvdkD","v2eC3y94nw","iwzGka00b5","QClRLtl72W",
+"rz7UtZUnqt","zFgtBqQxHP","CIShG1j5L8","2ZHdkTXQ0Z","gIYvETwano","uPX7GyEfy9","SWfouv1Hln","atef2uLtKs","gdQsSlkMUA","l83UdFcWrW",
+"KZamH9eoRc","VNCPde6e4z","hYBCK1LB1L","QClRLe6e4z","7hyVv64s8N","ciuWz580YD","OUqFMUvlv4","yluBxKASQ8","tuDySLDk6f","VjCZq9GXkX",
+"VNCPdFnPFB","cmXIXSjskQ","9eoRcVIlwP","fcJOy8TxD7","BCxeCkZANm","y94nwlViBv","POUYSdjsrv","QWxoTFPfSE","lpF6WYOfrY","pmeCdZUnqt",
+"AkKTkHRxd8","TCgPpl83Ud","ix74rOxWIH","FhtglMkgy8","a00b5ix74r","L7cGc5VZjS","AmdQdPb1pa","jtn0XFnPFB","SWfou9eoRc","29QAz5IhmG",
+"v2eC3RmDcr","MaJQsbrhlQ","gf8rI0MR5X","uAWypECMvU","oVQp6d85a9","yvOMIBCxeC","9XyT9U3yw5","EdBKcX6Pin","No0QbSjskQ","U3yw5uJScX",
+"n8pJ9n8pJ9","9XyT98hJdt","ZhwG1lViBv","uZPqg1j5L8","BbwgA6q6L9","9y4lwsx5Gl","4W0TlaDGtS","2Nslm8xEKz","7Ow5CjSjS3","azIWpcL0aE",
+"AmdQdECMvU","0PktIyvOMI","MGlTFjeskS","ydG8UAgJHQ","FnPFBbgJAz","nFqikNOHsz","qUJMd8RCUA","xciqpksJby","FVMxoQYxC0","i7WMQ55rfB",
+"ksJbyuQIcz","uZPqgAgJHQ","8RCUANcICA","B3qemM6qcG","B3qemfcJOy","taOXKcShY2","FFDuiQ6hMC","2Yz7ElkMUA","lsQGoFwEJz","AmdQd7X3uy",
+"t59lRpT8wu","5iGN5MaJQs","ciuWzi3pyd","WaWsvt98iW","CIShGtAOsr","AmdQd8cVD3","nFqikHfyNQ","4dEz68xEKz","RmDcrOUYuF","KZamHtlILt",
+"O3iyQJXljW","djsrvt98iW","nnP8o5iGN5","NAFuwVLTy6","0MR5XRzaZA","oVQp6ogLgc","v8yFNpT8wu","3otm6Z4I1v","JRJQBVBjhz","UlU3MqQxHP",
+"QssNCuupzk","oVQp6XflUq","QClRL29QAz","jfREu7lUXZ","0PktIguMb8","LbRTHTa8f6","QClRLqQxHP","uN6r3pAhR1","sx5GlFNYIM","QClRL9y4lw",
+"jS1ajRzaZA","hYBCKTa8f6","vLsmS9eoRc","VIlwPHRxd8","jiVBPQworu","kB5nPHP433","QssNCReKEW","Pb1paXflUq","Mm8sifcwDa","FcWrWhe9IA",
+"soy9tChuy3","uAWypy94nw","8cVD3B3qem","o8UydMm8si","VLTy6QChxs","RsQUqHlUbF","fmIK15nmWv","OUqFMJIqXi","24ARFrz7Ut","Oz8yZpT8wu",
+"tvdkD0Wr5y","IKxdLFPfSE","2DREsjS1aj","pvgjS4QMc9","OUYuFwiHrZ","oQ87rLDk6f","GXdoHqQxHP","Ss0Zu8U2nU","TwanoFFDui","rhl0J5VZjS",
+"bgJAz9rlg9","okgRiVjCZq","2DREsuvf7A","QChxsjeskS","TwanovOqCE","14FLRblLA9","OHaBzmz8gx","6AFT0lj07Q","GrDg75IhmG","fmIK1dhSuH",
+"MK07YgtCA5","QbxXcJKWYR","5drc6lkMUA","FjHXRRBhp0","gjUTuJkzUn","AIYUu4dEz6","wDajXCK5W7","QbxXcLDk6f","s93MlUmaEv","uPX7GQworu",
+"pv0i75VZjS","JRJQB4W0Tl","lpF6W48cHL","NcICAFLsph","VerEAdjsrv","tvdkDiqv4k","Fhtgl8TxD7","FjHXRjtn0X","yvOMIPYBf4","WPmlxaFFss",
+"i3pydaL6AJ","BGaQYru4UG","aFFssIKxdL","vLsmS7fsYM","gIYvEFFDui","NcICAvLsmS","NOHszpiJSk","8hJdtydG8U","2Yz7Elm0pD","2DREsTa8f6",
+"cShY2MmsIo","3otm6Pb1pa","IjTwPWMiS3","tAOsrlpF6W","brhlQjSjS3","pmeCd9iGoT","oVQp6JKWYR","lXFOBS2Dfu","SWfoulCMxy","Waim6BCxeC",
+"Uvlv4YOfrY","Q6hMCThjNn","FcWrWyluBx","Ul4a1dhSuH","SmGzvRzaZA","O3iyQAIYUu","Zv7z0BpYhV","gf8rIW3VFH","uN6r3pFrrl","Y1mC0FNYIM",
+"uPX7GZUnqt","GXdoH6q6L9","uQIczKASQ8","DcpWBGXdoH","uN6r3Zv7z0","y94nwiqv4k","Chuy3OHaBz","hUTw7jeskS","CqqaDG1RhS","AgJHQlweGy",
+"RBhp0WaWsv","fqypyW7cTs","16lHcjiVBP","HRxd8ZuDtD","07n1cK4GS8","zz4ZUStlDJ","9rlg9AgJHQ","qQxHPEdBKc","5nmWv9eoRc","bgJAzLbRTH",
+"RmDcrYf2Ec","YjB9tJXljW","W3VFHhe9IA","tvdkD4W0Tl","HzZT8Ul4a1","9rlg9AmdQd","pAhR17fKYU","7ku1paFFss","gdQsS8RCUA","64s8NbrhlQ",
+"y94nwnnP8o","0Wr5ytjQxs","BCxeCzmLYD","JXljWo8Uyd","3otm65Drn0","soy9tRACuj","UmaEvP6bcg","D6rByL7cGc","s4786QWxoT","SmGzvi3pyd",
+"i3pydhi5X7","brhlQZJTXH","BbwgAbgJAz","mX2GE64s8N","yEfy9nlaBy","OUqFMWmadA","SjskQCqqaD","AIYUuUlU3M","29QAzBCxeC","BbwgAZUnqt",
+"EoToPKASQ8","Pb1paYw2oU","iKqhrcQOnv","64s8NzbIYY","tuDySgIYvE","y94nwHlUbF","W3VFH64s8N","zHF1qogLgc","WreyPGXdoH","5Drn0RBhp0",
+"JKWYRlsQGo","WreyPW3VFH","AgJHQ2TRI7","45cIHqUJMd","G1RhSXyPZN","ZhwG1W7cTs","WDVWJ1v5hH","bZLvSFGzgp","lkMUA07n1c","i3pydNo0Qb",
+"dhSuHrhl0J","gIYvEazIWp","FcWrWWDVWJ","S77LHIKxdL","o8UydRACuj","FNYIMGSQwj","rhl0JGSQwj","ReKEWnFqik","hE1Qlsx5Gl","KZamHHfyNQ",
+"1LB1LNAFuw","ThjNnPYBf4","AIYUuHlUbF","cL0aExciqp","HzZT89eoRc","QbxXcMmKGJ","iB08llkMUA","ix74rqQxHP","jeskS2Nslm","5IhmGyofH3",
+"S77LHNAFuw","MmKGJ5ZaEz","h1zcHx3LDe","4W0TlSbRYy","bgJAzMmsIo","taOXKk85Ae","QChxsJXljW","QChxs5iGN5","C2IrcMmsIo","lkMUAazIWp",
+"FNYIMwDajX","6AFT0yluBx","Kr8ysW3VFH","DG4sT29QAz","pT8wuhUTw7","GXdoHfqypy","GrDg7zY1GY","m4bxUW3VFH","suY4xiwzGk","dQ586tjQxs",
+"O3iyQDcpWB","QWxoTBbwgA","0YAGHpv0i7","EoToPlCMxy","AXpwE4dEz6","uLtKsgjUTu","y94nwEdBKc","lCMxy5Drn0","FNYIMVerEA","oVQp6FFDui",
+"SbRYyQ6hMC","Yw2oU7ku1p","nnP8oL7cGc","YOfrYuJScX","9iGoTUvlv4","ciuWzFnPFB","618DiuTacx","2Nslmpv0i7","nFqikQbxXc","QYxC08TxD7",
+"RpBQmru4UG","7hyVvMm8si","QChxszY1GY","zmLYDHzZT8","t59lRVprf2","lsQGo7Ow5C","8U2nUQWxoT","9rlg9IKxdL","Q6Lixpv0i7","ZJTXHy94nw",
+"pmeCdChuy3","atef2oVQp6","M3zXLn8pJ9","QChxsPOUYS","d85a9Chuy3","GSQwjsoy9t","FhtglgIYvE","uQIczfFDrJ","Chuy3LbRTH","s7MxkFVMxo",
+"BFkb8B3qem","7ku1pTwano","WPmlxbZLvS","WDVWJ2ZHdk","AkKTkdQ586","tl72W0BmCy","s93MlM3zXL","1v5hH9GXkX","qUJMdZhwG1","QworuxXTI4",
+"pvgjSSbRYy","fmIK10Kyfs","XflUqCp3mZ","WDVWJWPmlx","vOqCE5Mg9r","gIYvEaez9y","8cVD30BmCy","ZhwG12hEEU","QWxoTsoy9t","GrDg7ECMvU",
+"m4bxUjS1aj","4dEz6LDk6f","guMb8Mm8si","ZUnqtFGzgp","jeskSFNYIM","ni2v124ARF","mz8gxuZPqg","rKDLJWaWsv","hYBCKAmdQd","Waim6faHir",
+"a00b54dEz6","1j5L8VerEA","0ao3ljzUqR","y94nwOUqFM","kB5nP2Nslm","Nxx9VS2Dfu","ZuDtDBFkb8","nlaByZJTXH","guMb80Wr5y","SWfouWDVWJ",
+"CxVEfpvgjS","pAhR1M6qcG","fFDrJn8pJ9","lCMxyJRJQB","uupzk48cHL","zY1GYBbwgA","bgJAzJkzUn","8xEKzMK07Y","ZzJHWVLTy6","D6rBy6AFT0",
+"9rlg9zHF1q","lpF6WjzUqR","zQt6QK4GS8","Gv3FqZJTXH","gf8rINAFuw","v2eC3G1RhS","uvf7AlViBv","m4bxU9y4lw","2Nslmzz4ZU","HRxd8mX2GE",
+"W7cTsCK5W7","uLtKsulk41","OxWIHCqqaD","tvdkDRsQUq","djsrvyToGW","ciuWzEOE1o","sqVrfmX2GE","qUJMdm4bxU","tjQxsAgJHQ","nlaBydpe1v",
+"NhXduuLtKs","8cVD3uvf7A","hYBCK8TxD7","5IhmGlXFOB","9GXkX29QAz","Cfgr3JJs5m","oVQp6lkMUA","NcICAs4786","azIWpIKxdL","zqH0WxXTI4",
+"uZPqgDQimp","QnJ1SAIYUu","0Wr5yK20wK","45cIHJXljW","kZANmQChxs","suY4xtlILt","14FLR07n1c","5Drn0tl72W","AOgEeFFDui","jS1ajX6Pin",
+"KsjRKTXQ0Z","ZzJHWO3iyQ","gdQsSOz8yZ","tvdkD5IhmG","Mm8sizmLYD","TCgPpuPX7G","2Nslm7Ow5C","euZA5AOgEe","HzZT8FxX9q","6q6L9FjHXR",
+"StlDJNOHsz","Ul4a17fsYM","8cVD3n1pmO","GrDg7bZLvS","5Mg9rWaWsv","8TxD7CxVEf","VerEAk85Ae","oVQp6FGzgp","t98iWatef2","LewvMJ2mQi",
+"No0QbUl4a1","W3VFHEOE1o","wiHrZFLsph","6q6L9CqqaD","FFDuiHfyNQ","iwzGkAmdQd","29QAzguMb8","ZuDtDl83Ud","M6qcGNhXdu","cL0aERpBQm",
+"vkCHHS77LH","WmadA55rfB","MGlTFokgRi","XyPZNpAhR1","No0Qb6AFT0","suY4xXyPZN","Ul4a1uZPqg","2hEEUqQxHP","FjHXRCK5W7","9GXkXjiVBP",
+"ydG8UXflUq","Nxx9VFFDui","fLNg8ThjNn","pmeCdUvlv4","618DiEdBKc","xXTI4Mm8si","HRxd8lXFOB","9eoRcguMb8","29QAzIn3NS","48cHLW3VFH",
+"4dEz6SmGzv","FxX9q2ZHdk","Uvlv4tAOsr","POUYSpWiOs","1v5hHUlU3M","e6e4zfLNg8","a00b548cHL","14FLRxXTI4","0MR5Xi3pyd","piJSkbZLvS",
+"7lUXZ9iGoT","Y1mC05IhmG","lXFOB2TRI7","dmoS707n1c","StlDJAXpwE","tvdkDAXpwE","e6e4zK20wK","OUqFMUl4a1","9y4lwD6rBy","Y1mC0ZUnqt",
+"64s8N5VZjS","FwEJzVIlwP","Y1mC0KASQ8","Yf2EcokgRi","8cVD3BpYhV","x3LDepiJSk","8RCUA1v5hH","LDk6fUl4a1","oVQp6t59lR","4QMc9Z4I1v",
+"nnP8ouQIcz","rhl0JGWqqX","0BmCyhe9IA","oGu6xqQxHP","0ao3lB3qem","AXpwE55rfB","07n1c0YAGH","uZPqg5IhmG","618DiWDVWJ","2TRI7fqypy",
+"Yf2Ecaez9y","BCxeCuvf7A","M6qcGzQt6Q","yvOMICxVEf","4W0TlPOUYS","YjB9t2Nslm","Uvlv4v2eC3","SWfoun8pJ9","WreyPD6rBy","iKqhrjiVBP",
+"RBhp09eoRc","0YAGHTwano","nnP8oHfyNQ","5Drn0s7Mxk","hSSvQdjsrv","iB08ljiVBP","zbIYYulk41","P6bcgFnPFB","FnPFBYw2oU","BCxeC0h1b1",
+"NcICAuvf7A","ZUnqtFNYIM","zbIYYhE1Ql","8RCUAFLsph","xReecfaHir","MGlTFK20wK","29QAz1LB1L","MezSWh1zcH","gdQsSZJTXH","FjHXROUYuF",
+"618Di5Drn0","uZPqglm0pD","jSjS3HfyNQ","hUTw7bZLvS","lm0pDWaim6","AkKTkGXdoH","16lHcLbRTH","1j5L8lm0pD","l83UdSmGzv","n1pmOQClRL",
+"580YDt59lR","qUJMdmX2GE","HzZT8VerEA","y94nw9XyT9","dmoS7Mm8si","mX2GEcQOnv","fqypyZzJHW","ni2v1WPmlx","CIShG3weIF","hYBCKdjsrv",
+"D6rByEdBKc","HRxd8zHF1q","RsQUqS77LH","1j5L864s8N","blLA9pT8wu","8hJdtfLNg8","MmsIouN6r3","lH1ktAkKTk","lXFOBsqVrf","Vprf2yofH3",
+"9eoRcMGlTF","Nxx9VtvdkD","8TxD79rlg9","CqqaDRBhp0","tuDySlpF6W","YjB9tIRh48","uN6r3BFkb8","zFgtBKr8ys","hi5X7IRh48","zz4ZUzmLYD",
+"nFqikMaJQs","CxVEfDQimp","S77LHgjUTu","L7cGc0Wr5y","OHaBz5ZaEz","7hyVv4QMc9","Yh1hFGWqqX","nnP8o14FLR","Uvlv4W3VFH","n8pJ97X3uy",
+"FnPFBJKWYR","3weIFGrDg7","FFDuiFPfSE","yofH3F6PT2","SWfou0YAGH","BFkb8aDGtS","QChxsqUJMd","ZuDtDcL0aE","taOXKatef2","hi5X7CqqaD",
+"9y4lwCIShG","FjHXRPYBf4","Cp3mZNo0Qb","d7vjM24ARF","D6rByMm8si","X6Pinatef2","y94nws93Ml","qaofNuoStw","lViBv7hyVv","0h1b1RsQUq",
+"NOHszD6rBy","O3iyQChuy3","8RCUA6q6L9","X6PinMezSW","zHF1qRzaZA","FVMxoyofH3","FNYIMlj07Q","JRJQBt98iW","580YDjSjS3","618Di5VZjS",
+"6q6L99iGoT","suY4x9rlg9","3weIFAkKTk","JXljWQworu","jSjS3Dz1R3","i3pydWaWsv","DLhzMs4786","Dz1R3ZuDtD","FxX9q6AFT0","uoStwjtn0X",
+"k85Ae0BmCy","JXljWPb1pa","aFFss2TRI7","AkKTkYjB9t","pWiOsCK5W7","9XyT9oQ87r","O3iyQgdQsS","KsjRKC2Irc","m4bxUEOE1o","HfyNQAIYUu",
+"OUqFMEdBKc","0ao3lpiJSk","2hEEUWreyP","FwEJz3otm6","9XyT96q6L9","QYxC0KASQ8","Kr8yswiHrZ","8RCUAsoy9t","euZA57lUXZ","LDk6fQ6hMC",
+"XyPZNYw2oU","QChxsX6Pin","DG4sTKZamH","fqypy8cVD3","uQIczMm8si","29QAz5ZaEz","lsQGolH1kt","8cVD3Ss0Zu","M3zXLRzaZA","U3yw58cVD3",
+"gf8rIThjNn","aFFss5Mg9r","mX2GEaez9y","hE1QlM6qcG","jzUqRyEfy9","RxrsmMkgy8","Gv3FqGv3Fq","8RCUA6AFT0","wDajXsqVrf","Ul4a17hyVv",
+"zz4ZUcL0aE","DcpWBnlaBy","lweGyXflUq","O3iyQuN6r3","AmdQdgIYvE","Mkgy8tvdkD","lj07QuPX7G","BGaQYUl4a1","VNCPdguMb8","s4786xciqp",
+"2hEEUHP433","RzaZAAmdQd","WPmlxFwEJz","HP433pv0i7","BFkb8lsQGo","NOHszIRh48","C2IrcpmeCd","VNCPd4dEz6","DcpWBRzaZA","Kr8yspiJSk",
+"2ZHdkCNHmv","t98iWZhwG1","IjTwP7fKYU","JJs5mhUTw7","tl72WWPmlx","ThjNni3pyd","Y1mC0IBe8k","5iGN5uQIcz","KASQ87lUXZ","QChxsJkzUn",
+"i7WMQDG4sT","1v5hHRmDcr","wDajXJJs5m","TXQ0ZMaJQs","RkQkefcJOy","In3NSbrhlQ","8TxD72DREs","JXljWtl72W","07n1cFxX9q","b29RJpAhR1",
+"zHF1qIKxdL","W3VFHazIWp","faHirmz8gx","xciqpfcwDa","55rfB16lHc","JRJQBWDVWJ","MezSWlH1kt","gIYvE0Wr5y","LDk6fKr8ys","FLsphBGaQY",
+"7fsYMbrhlQ","ix74rokgRi","I7p2aWMiS3","hE1QlZUnqt","16lHczz4ZU","zqH0WBCxeC","4dEz6fcJOy","G1RhSuPX7G","x3LDetAOsr","L7cGcVprf2",
+"KASQ8sx5Gl","MmKGJ3weIF","In3NSYjB9t","M3zXLFNYIM","LbRTHFNYIM","vOqCE0YAGH","EdBKcdhSuH","Q6hMCAXpwE","FVMxo1LB1L","yEfy9WPmlx",
+"QworunnP8o","DQimptvdkD","FhtglEoToP","tl72W5Namm","Q6hMCFhtgl","BbwgA5IhmG","ulk414dEz6","8hJdtzqH0W","Gv3FqiKqhr","0Wr5ypT8wu",
+"VjCZqSmGzv","a00b5kZANm","24ARFtAOsr","2Yz7EVBjhz","JRJQBxReec","hYBCKy94nw","FcWrWAOgEe","UmaEvFVMxo","jfREuCNHmv","VerEAJXljW",
+"VNCPdPb1pa","FwEJzaez9y","o8UydS77LH","tl72WpiJSk","fqypyuQIcz","3weIFZUnqt","tl72WJXljW","KZamHCK5W7","JKWYR1LB1L","Ss0ZupAhR1",
+"lXFOBDQimp","i3pydEoToP","DLhzMJXljW","KZamHJKWYR","sqVrfVerEA","45cIH8TxD7","Zv7z0guMb8","ZzJHWoGu6x","Pb1paG1RhS","Kr8ys2Yz7E",
+"StlDJlH1kt","yEfy9uTacx","hYBCKUlU3M","ydG8Us7Mxk","AmdQdWmadA","CNHmvhe9IA","FVMxoGWqqX","Ul4a1VIlwP","RzaZAjtn0X","djsrvZhwG1",
+"5Drn0b29RJ","euZA5uQIcz","8U2nUtvdkD","x3LDe55rfB","Dz1R3gIYvE","64s8Nd7vjM","QssNCFxX9q","4QMc9t98iW","7hyVv6AFT0","tvdkDjiVBP",
+"n1pmOhSSvQ","64s8NStlDJ","tvdkD5drc6","K4GS8yluBx","LDk6fVNCPd","POUYSMm8si","9XyT92TRI7","n1pmOxReec","0YAGHMGlTF","BFkb8zmLYD",
+"k85AeksJby","lViBvZ4I1v","iB08lzHF1q","k85Aeix74r","KZamHzqH0W","1v5hH1v5hH","fcJOyFhtgl","O3iyQuJScX","6AFT0FwEJz","7ku1pDG4sT",
+"8FmFHVerEA","gtCA5gtCA5","lm0pDS2Dfu","aez9yVBjhz","AmdQd5nmWv","rKDLJazIWp","oQ87rLbRTH","iKqhrokgRi","zbIYYWMiS3","ECMvUiKqhr",
+"8xEKzs4786","ZJTXHyluBx","QChxsDz1R3","TXQ0ZFLsph","K20wK618Di","HlUbFhSSvQ","soy9ttvdkD","bZLvSVIlwP","MmsIooGu6x","LbRTHSmGzv",
+"lViBvB3qem","RzaZAx3LDe","Zv7z0i7WMQ","lpF6WHlUbF","d85a9brhlQ","Q6LixuQIcz","KASQ8lweGy","RsQUqZuDtD","lweGyfcwDa","D6rBy4dEz6",
+"HzZT85Namm","m4bxUBpYhV","2Nslm64s8N","NcICAguMb8","aez9ypFrrl","WmadAUlU3M","xReecQChxs","fFDrJThjNn","Oz8yZTa8f6","okgRigf8rI",
+"2NslmyofH3","Ss0ZuO3iyQ","s4786WDVWJ","FLsph0Wr5y","faHirVNCPd","uupzkZ4I1v","QssNCMezSW","jfREumz8gx","MmKGJiwzGk","yluBxXflUq",
+"s4786zbIYY","Cp3mZv1Hln","JKWYRlkMUA","rKDLJ7fsYM","NAFuwQYxC0","OUqFMiqv4k","6q6L9taOXK","D6rBy5nmWv","WmadAFGzgp","NhXduY1mC0",
+"IBe8k0Kyfs","0h1b1QbxXc","vLsmSWreyP","6q6L9nnP8o","6AFT0faHir","AmdQdiwzGk","v1Hln580YD","RmDcryluBx","uupzkaez9y","J2mQiZv7z0",
+"XyPZNHRxd8","qUJMdVBjhz","FhtglLDk6f","oQ87rpWiOs","SjskQAkKTk","bZLvSdhSuH","KsjRKGWqqX","okgRiStlDJ","ZUnqt4W0Tl","X6PinZzJHW",
+"StlDJaL6AJ","AOgEeJIqXi","45cIH2Yz7E","FhtgluoStw","LbRTH5Namm","FPfSEvkCHH","uAWypqaofN","MK07YjiVBP","cShY2RpBQm","BbwgAKr8ys",
+"BpYhVL7cGc","OUYuFQnJ1S","WMiS3uvf7A","blLA9HRxd8","YjB9tqUJMd","lpF6WazIWp","FGzgp07n1c","WPmlxSs0Zu","Ss0ZulXFOB","JKWYRzFgtB",
+"piJSk7Ow5C","ciuWzNxx9V","blLA9B3qem","3weIFi3pyd","Yh1hFF6PT2","Ss0ZuQWxoT","ReKEWcQOnv","JIqXiOz8yZ","lj07QyvOMI","n1pmOlXFOB",
+"lCMxyzqH0W","D6rByQbxXc","Cp3mZuAWyp","h1zcHJRJQB","suY4x2Yz7E","tlILtPOUYS","tlILtBFkb8","xXTI40BmCy","fFDrJ5VZjS","aL6AJhSSvQ",
+"i7WMQMmKGJ","OUqFMOUqFM","wDajX2DREs","F6PT2hE1Ql","cShY2BFkb8","TXQ0ZdQ586","Pb1pa16lHc","uvf7AprNT6","atef2MK07Y","2Nslm2ZHdk",
+"dmoS7BFkb8","aFFssBGaQY","rz7UtSbRYy","OxWIHNxx9V","uLtKsydG8U","2TRI7BpYhV","J2mQitjQxs","lm0pDCK5W7","8hJdtiwzGk","ksJbybgJAz",
+"yvOMIgIYvE","JkzUnTwano","zqH0W8RCUA","VjCZq7hyVv","v8yFNpvgjS","AIYUu07n1c","45cIHNOHsz","jeskSfcJOy","suY4xTa8f6","HP433bZLvS",
+"64s8NvLsmS","5NammSWfou","gtCA5OUYuF","RBhp0kZANm","ciuWzokgRi","RkQke9rlg9","lkMUAni2v1","RBhp0xXTI4","s93MlSjskQ","fcwDasx5Gl",
+"2TRI7atef2","ogLgc8xEKz","tAOsrzqH0W","yEfy9I7p2a","2Nslmd85a9","WDVWJYf2Ec","1v5hHWreyP","5iGN5F6PT2","o8Uyd2DREs","FFDui29QAz",
+"CIShGm4bxU","0YAGHgtCA5","8hJdt0h1b1","dhSuHxReec","C2IrclkMUA","okgRiNxx9V","yEfy9JRJQB","h1zcHQ6hMC","8U2nUbZLvS","2hEEUAkKTk",
+"Uvlv4GrDg7","lViBvGrDg7","he9IAvOqCE","brhlQFjHXR","faHirix74r","uN6r3S2Dfu","FVMxozY1GY","uAWypyToGW","5ZaEzAOgEe","gIYvEIjTwP",
+"Y1mC0suY4x","ulk41HlUbF","gIYvEJRJQB","F6PT29GXkX","yvOMIqaofN","DLhzMni2v1","QbxXc1LB1L","0MR5XPOUYS","suY4x1j5L8","tvdkDcL0aE",
+"Kr8ysQClRL","y94nwMmsIo","HRxd8UmaEv","FPfSEEOE1o","WDVWJqaofN","Oz8yZQnJ1S","P6bcglkMUA","pmeCd618Di","5Drn09iGoT","OUqFMUmaEv",
+"MK07Ydjsrv","s93Ml48cHL","U3yw5CxVEf","TwanopAhR1","GWqqXLDk6f","FFDui7fKYU","Ss0Zu9iGoT","mX2GEzqH0W","pWiOszHF1q","9GXkXQ6Lix",
+"SmGzvjfREu","qUJMdBFkb8","tvdkD6AFT0","X6PincmXIX","zqH0WIKxdL","pAhR1iB08l","9eoRcuN6r3","AgJHQ6AFT0","IRh48jzUqR","HfyNQSjskQ",
+"a00b5ydG8U","Kr8yspAhR1","guMb8yluBx","JXljWxciqp","pFrrlnFqik","lCMxyFnPFB","L7cGcFFDui","v8yFN2hEEU","QssNC2DREs","7lUXZhe9IA",
+"2TRI7jS1aj","0ao3lvOqCE","48cHLiB08l","VIlwPydG8U","GrDg7JIqXi","uAWyp5nmWv","Waim6FxX9q","TXQ0Zlj07Q","JkzUn2hEEU","euZA54W0Tl",
+"8cVD3d7vjM","8cVD37hyVv","djsrvlsQGo","vLsmSNcICA","uPX7GFGzgp","UlU3M2hEEU","nlaByIBe8k","piJSkpFrrl","SmGzvjzUqR","uJScXWaWsv",
+"lXFOBdQ586","xReecJIqXi","nnP8opAhR1","yluBx1LB1L","Yh1hFKZamH","nnP8oMmKGJ","618Dis93Ml","YOfrYuLtKs","n8pJ9jS1aj","uvf7AOxWIH",
+"dQ586ZUnqt","e6e4z9XyT9","pv0i7yEfy9","AOgEe29QAz","fLNg8G1RhS","AXpwEF6PT2","jeskSS77LH","0ao3lS77LH","blLA9lsQGo","h1zcHsx5Gl",
+"BCxeCfmIK1","aL6AJQYxC0","jzUqR9y4lw","iwzGkXflUq","8xEKz0MR5X","VjCZqLDk6f","rKDLJQYxC0","YOfrYmX2GE","iwzGklkMUA","FPfSE5iGN5",
+"Nxx9VfFDrJ","NAFuwfqypy","2NslmiwzGk","qQxHPQWxoT","a00b5IjTwP","azIWpKASQ8","kZANmVLTy6","DG4sT0PktI","x3LDeWaWsv","euZA5d7vjM",
+"W7cTsuLtKs","n8pJ91LB1L","uPX7GAXpwE","n8pJ9IKxdL","qQxHP5drc6","jSjS37hyVv","0KyfsF6PT2","uoStwVNCPd","5iGN5qQxHP","U3yw5hE1Ql",
+"Ss0ZueuZA5","iwzGk7fKYU","yEfy9KASQ8","RkQkeRsQUq","zbIYYru4UG","SmGzvZv7z0","K20wK7Ow5C","ogLgcNhXdu","No0QbSmGzv","nlaByDz1R3",
+"yvOMIOHaBz","gjUTuSs0Zu","14FLRuZPqg","soy9togLgc","gdQsSGWqqX","EoToPDQimp","0Kyfs4W0Tl","pAhR1l83Ud","EoToPbrhlQ","l83UdGXdoH",
+"0YAGHFLsph","lXFOBStlDJ","Vprf2MK07Y","hSSvQMaJQs","JKWYRzQt6Q","580YDjiVBP","lpF6WAXpwE","07n1cQnJ1S","s7Mxk8cVD3","xReecMmsIo",
+"QWxoTfcJOy","ksJby45cIH","EOE1omz8gx","4dEz6e6e4z","cQOnvC2Irc","Vprf2bZLvS","No0Qbsx5Gl","ZUnqtdhSuH","0ao3lRACuj","KsjRKtvdkD",
+"5VZjSEoToP","O3iyQzmLYD","kB5nPZuDtD","l83UdZhwG1","Dz1R3lm0pD","fqypy0BmCy","Gv3Fq5IhmG","jiVBPAmdQd","Mm8sipv0i7","VjCZqCfgr3",
+"29QAz7lUXZ","y94nwzbIYY","VNCPdoGu6x","pmeCdrKDLJ","MezSW9y4lw","yluBxMK07Y","G1RhSqQxHP","m4bxUPYBf4","b29RJKASQ8","azIWpkB5nP",
+"yEfy9aL6AJ","Gv3FqC2Irc","1v5hHO3iyQ","blLA90Wr5y","kB5nP0Kyfs","XyPZNJKWYR","AOgEeFxX9q","DQimp0Wr5y","QChxsCNHmv","MojnPCxVEf",
+"2NslmGrDg7","EOE1oCIShG","ZhwG1RBhp0","0Wr5y3weIF","tAOsrGSQwj","Ul4a14W0Tl","gdQsSlViBv","Oz8yZyofH3","gjUTuJXljW","YOfrYGv3Fq",
+"JIqXiQ6hMC","5nmWvY1mC0","tuDySfaHir","VBjhzgdQsS","jzUqRcQOnv","dpe1vNhXdu","zbIYY55rfB","QnJ1SuoStw","Nxx9VJkzUn","NcICAzQt6Q",
+"TCgPpM3zXL","5iGN5IRh48","iqv4kYf2Ec","FhtgldhSuH","0KyfsjS1aj","Waim6Vprf2","5VZjSPYBf4","8FmFHFnPFB","tAOsr5Drn0","atef25Mg9r",
+"xReecSjskQ","t98iW5IhmG","oQ87r1j5L8","Nxx9VqUJMd","QWxoT8cVD3","uvf7ACp3mZ","ix74rVLTy6","FjHXR9XyT9","d85a95Mg9r","8U2nUuLtKs",
+"i7WMQKsjRK","FVMxoHzZT8","CIShGguMb8","QworuzFgtB","xXTI4Oz8yZ","7fKYUyluBx","GSQwjQssNC","Yw2oUqUJMd","JIqXiBFkb8","rz7UtReKEW",
+"jeskSVBjhz","Ul4a12Yz7E","soy9tnlaBy","S2DfuAOgEe","XyPZNAIYUu","Ta8f6ydG8U","gjUTu5VZjS","d7vjMfcwDa","lpF6WVerEA","KZamHYh1hF",
+"2TRI707n1c","cQOnvPOUYS","cmXIXGWqqX","M6qcGrz7Ut","HRxd8o8Uyd","7lUXZCp3mZ","oGu6xFGzgp","SbRYyuPX7G","iKqhr6AFT0","2TRI7l83Ud",
+"FLsphiKqhr","DG4sTru4UG","9iGoTFPfSE","i3pydJXljW","zqH0WJXljW","pFrrlrz7Ut","aDGtSPOUYS","NOHszdpe1v","4dEz60Kyfs","I7p2aBbwgA",
+"8TxD7jeskS","lCMxyW3VFH","GrDg7djsrv","CqqaDKsjRK","Ul4a1vOqCE","FLsphQClRL","vkCHHZzJHW","o8UydnlaBy","WreyP1v5hH","JXljWuJScX",
+"5Mg9r2ZHdk","L7cGcCIShG","VBjhzd7vjM","GSQwjEdBKc","zY1GYtlILt","Ta8f6dQ586","SmGzvpiJSk","7lUXZWMiS3","RmDcrEoToP","s4786FcWrW",
+"oGu6xWPmlx","ydG8UFwEJz","gdQsSrKDLJ","9XyT99XyT9","RpBQmGSQwj","zFgtB5IhmG","X6PinWmadA","FLsphPOUYS","tuDySoQ87r","bZLvSIKxdL",
+"BbwgARxrsm","fFDrJhe9IA","uTacxdhSuH","fFDrJrhl0J","i3pydNxx9V","9y4lw5IhmG","BCxeCXflUq","lXFOBv2eC3","5Drn0Waim6","Ta8f6Rxrsm",
+"rz7UtblLA9","uvf7AhSSvQ","ix74ri3pyd","MmsIoKASQ8","lweGy2DREs","G1RhSReKEW","HP433oVQp6","uoStwF6PT2","dhSuHuQIcz","qUJMdtaOXK",
+"tlILtIn3NS","5VZjS580YD","AkKTkSjskQ","MK07YHRxd8","TXQ0Z07n1c","Mm8six3LDe","oVQp68U2nU","0Wr5yVBjhz","CdyBVdmoS7","618DiK4GS8",
+"M3zXLZUnqt","NhXdurhl0J","4dEz68TxD7","XflUq9XyT9","580YDYh1hF","FwEJzblLA9","AkKTk3weIF","tvdkDK4GS8","FNYIMaDGtS","d7vjM0h1b1",
+"fcJOy9XyT9","VBjhz2hEEU","7fsYMv2eC3","07n1cCIShG","RpBQmFjHXR","Vprf2GSQwj","tAOsrjS1aj","Cp3mZ55rfB","QChxsHzZT8","tjQxsFxX9q",
+"WMiS3VLTy6","MmsIoRBhp0","Nxx9VnnP8o","MK07YcQOnv","QnJ1SKr8ys","AIYUuMK07Y","uJScXFFDui","FwEJzQ6hMC","cL0aEJKWYR","14FLRNAFuw",
+"yvOMIlXFOB","LewvMJIqXi","MezSWJKWYR","JRJQBGv3Fq","RkQkeDcpWB","D6rByGrDg7","FwEJzhe9IA","lkMUAoVQp6","QworuDLhzM","vkCHHHP433",
+"ZUnqtWPmlx","YOfrY8FmFH","G1RhSGSQwj","8xEKzMm8si","FVMxojfREu","In3NSjfREu","7lUXZUmaEv","wiHrZFnPFB","L7cGcO3iyQ","2Yz7ECxVEf",
+"djsrv0BmCy","jzUqRFLsph","2NslmIn3NS","lm0pDdjsrv","XyPZNAgJHQ","tl72WVjCZq","FwEJz4dEz6","FcWrWyvOMI","IjTwP7hyVv","Chuy3580YD",
+"m4bxU5Mg9r","Pb1paLbRTH","ydG8UBGaQY","vkCHHs7Mxk","HzZT845cIH","fmIK1Dz1R3","NOHszgdQsS","VLTy6Dz1R3","GWqqXhSSvQ","VIlwPHzZT8",
+"7lUXZlXFOB","VjCZqNAFuw","uLtKsWPmlx","nnP8orhl0J","uLtKsWmadA","AgJHQlCMxy","AmdQduTacx","XflUqOUqFM","Q6LixoQ87r","JIqXivLsmS",
+"48cHLOUqFM","8cVD3suY4x","7fKYUnnP8o","ydG8UCfgr3","NOHsz5drc6","gIYvE48cHL","9y4lw3weIF","gtCA5faHir","cQOnvIRh48","VerEApFrrl",
+"8U2nU5Drn0","OUqFMo8Uyd","xReectvdkD","In3NSHRxd8","nFqiklsQGo","zmLYDYOfrY","ni2v1UlU3M","iwzGk0MR5X","5VZjSVprf2","hE1QlSs0Zu",
+"tvdkDIKxdL","QClRLJkzUn","QClRLrz7Ut","ZJTXHksJby","k85AekB5nP","v2eC3CxVEf","0PktIiwzGk","SbRYyulk41","n8pJ9CxVEf","6q6L9okgRi",
+"DG4sTix74r","aez9ylsQGo","L7cGc6q6L9","vOqCEk85Ae","580YDblLA9","i7WMQy94nw","zY1GYaDGtS","5VZjSaFFss","FnPFBsuY4x","tl72WcmXIX",
+"P6bcgcQOnv","iKqhr45cIH","5NammUl4a1","AIYUuMaJQs","QbxXcNOHsz","AkKTkpv0i7","FLsphQbxXc","zY1GYQClRL","FFDuiC2Irc","QnJ1SSbRYy",
+"uAWypiqv4k","fLNg8uJScX","UlU3MoGu6x","nnP8oQbxXc","Zv7z0xReec","0ao3lMGlTF","TXQ0Z8xEKz","8U2nUs4786","iB08lVIlwP","5IhmGO3iyQ",
+"HfyNQqUJMd","VBjhzFcWrW","jS1ajQClRL","tuDySVerEA","CIShGru4UG","t59lRs7Mxk","M3zXLTXQ0Z","JXljWzqH0W","lsQGo9rlg9","pT8wuv1Hln",
+"WMiS3IjTwP","Mm8siNhXdu","8FmFHWDVWJ","580YDnlaBy","Q6hMCuJScX","xciqpHzZT8","faHir55rfB","MGlTFNcICA","yvOMIFFDui","618DiI7p2a",
+"NAFuwQ6Lix","MojnP0BmCy","RpBQm8hJdt","dmoS7e6e4z","I7p2a3weIF","UmaEvCK5W7","taOXK1v5hH","t59lRRmDcr","FVMxowiHrZ","IRh48nlaBy",
+"s47868TxD7","nnP8ouvf7A","lm0pD7fKYU","t59lRguMb8","v8yFNe6e4z","5Drn0AOgEe","Ta8f6xReec","RACujt59lR","Dz1R3L7cGc","SjskQBFkb8",
+"VLTy6d7vjM","7fsYMAOgEe","jeskSSs0Zu","MezSWK4GS8","uvf7Av1Hln","cShY2lkMUA","FxX9qCdyBV","pFrrlSjskQ","SjskQzz4ZU","4QMc9C2Irc",
+"xReec16lHc","PYBf4Ta8f6","Q6hMCGv3Fq","pT8wuFwEJz","jSjS39GXkX","dmoS7n1pmO","5IhmGAIYUu","FVMxoThjNn","EdBKcksJby","6q6L9oQ87r",
+"NcICANcICA","7ku1pVIlwP","HP4339iGoT","o8UydVBjhz","LewvMQssNC","aDGtSBbwgA","ksJby0Wr5y","VBjhzprNT6","POUYSHP433","RBhp0yvOMI",
+"RxrsmNAFuw","mz8gxB3qem","djsrvvLsmS","GXdoH7ku1p","X6PinMm8si","JXljW0ao3l","7X3uy9y4lw","fcwDaUl4a1","9XyT9hSSvQ","Qworuxciqp",
+"vLsmSrhl0J","Ss0ZuqUJMd","lXFOB48cHL","uoStweuZA5","C2IrcFhtgl","zQt6Q9GXkX","4QMc9LbRTH","yEfy9QbxXc","rKDLJRpBQm","XflUqzHF1q",
+"5Mg9r9rlg9","jfREuFNYIM","5iGN5uJScX","Chuy3J2mQi","SmGzvJRJQB","OUYuFdjsrv","y94nwpT8wu","5NammFwEJz","5drc6piJSk","jtn0XuQIcz",
+"ThjNnLewvM","euZA51LB1L","RpBQmRpBQm","JXljWOHaBz","OUYuFlj07Q","BCxeCCNHmv","jzUqRLbRTH","RzaZA7Ow5C","F6PT2LDk6f","brhlQMmsIo",
+"Ul4a1Zv7z0","5iGN5ydG8U","HRxd8FwEJz","VNCPd2ZHdk","VIlwPB3qem","ZzJHWG1RhS","aFFssrz7Ut","uvf7AwiHrZ","mz8gxJJs5m","jeskSydG8U",
+"m4bxUSbRYy","Chuy3bgJAz","tuDyS5VZjS","Q6LixjfREu","CK5W7MmsIo","hi5X7AXpwE","5Drn0JkzUn","NcICAhSSvQ","55rfByToGW","jeskS8FmFH",
+"UmaEvzQt6Q","pvgjS1LB1L","7hyVvGWqqX","CNHmv0MR5X","0BmCyMK07Y","DQimpAgJHQ","MmsIoNhXdu","i7WMQoQ87r","2NslmwiHrZ","IjTwP580YD",
+"FjHXRZ4I1v","2ZHdk48cHL","iKqhrjeskS","hYBCKOHaBz","SWfouReKEW","m4bxUWreyP","07n1cY1mC0","zQt6QydG8U","Uvlv429QAz","aez9yCp3mZ",
+"WmadAv1Hln","DG4sTQworu","GSQwjgjUTu","fcwDa14FLR","Ul4a1Kr8ys","NhXduRxrsm","FcWrW0h1b1","C2Irc8cVD3","VjCZq8U2nU","VBjhzhYBCK",
+"ZhwG1h1zcH","tl72WThjNn","guMb85Namm","bgJAz29QAz","FnPFBi3pyd","oGu6xW3VFH","yEfy9RBhp0","07n1c9y4lw","NOHsz9iGoT","o8UydSWfou",
+"8FmFHhYBCK","SmGzvydG8U","rhl0JQClRL","o8UydChuy3","uupzkv2eC3","cShY2DG4sT","5drc6nnP8o","FNYIMFhtgl","5drc6WPmlx","KsjRK8RCUA",
+"iwzGkSbRYy","XflUqIKxdL","4dEz6gtCA5","l83UdlpF6W","fcwDaZ4I1v","zqH0WzqH0W","5Mg9rMK07Y","1j5L82TRI7","4W0TlMK07Y","7fsYMzz4ZU",
+"pvgjSHRxd8","5drc6lj07Q","lXFOBBGaQY","s7MxkwDajX","v1HlnyvOMI","NOHszydG8U","soy9tFGzgp","pAhR1S2Dfu","azIWpmz8gx","DLhzM618Di",
+"okgRiTa8f6","iKqhrAkKTk","oQ87rsuY4x","8xEKzQYxC0","D6rByAIYUu","cmXIX0BmCy","Gv3Fq55rfB","W7cTsuTacx","uN6r3tlILt","B3qemK4GS8",
+"mX2GEQssNC","uvf7AEoToP","AgJHQ2Yz7E","pT8wujtn0X","Waim6zbIYY","cL0aElCMxy","l83Uddjsrv","Gv3FqtlILt","K4GS8euZA5","s47869XyT9",
+"ulk41fLNg8","Cp3mZ8cVD3","8FmFHBFkb8","okgRiokgRi","2TRI7hE1Ql","n8pJ9lViBv","Ta8f62TRI7","5IhmGtl72W","djsrvKr8ys","RkQke07n1c",
+"uPX7GTXQ0Z","580YDRmDcr","ulk41Yh1hF","2DREsQworu","Nxx9VMmsIo","5Drn0oVQp6","FFDuiCK5W7","14FLRlH1kt","OUqFMjS1aj","cmXIXStlDJ",
+"lCMxycL0aE","wDajXulk41","NcICACxVEf","iB08lciuWz","v1HlnQClRL","9iGoTWMiS3","djsrvJRJQB","jtn0Xzz4ZU","uLtKsK20wK","fqypyCp3mZ",
+"ksJby48cHL","5NammVBjhz","QYxC0C2Irc","suY4xKr8ys","blLA9jtn0X","K20wKWPmlx","BFkb8IKxdL","6q6L9Oz8yZ","fmIK1ydG8U","EoToPPb1pa",
+"s7MxkWMiS3","m4bxUSjskQ","WaWsvWreyP","suY4xkZANm","d85a92Nslm","D6rBy9GXkX","5Nammulk41","P6bcgcL0aE","fqypy7fsYM","FcWrWwiHrZ",
+"7fsYMHfyNQ","zFgtBuAWyp","MezSWlXFOB","NcICA8hJdt","ix74rMmKGJ","JJs5m8cVD3","uZPqguN6r3","t59lRZ4I1v","FVMxoS77LH","tl72W9eoRc",
+"zHF1qn8pJ9","CK5W78TxD7","ZuDtD2Nslm","FFDuis7Mxk","pAhR1piJSk","yluBx0YAGH","x3LDelweGy","suY4xGSQwj","ThjNnZUnqt","Yw2oUCK5W7",
+"fcJOy5IhmG","ni2v1y94nw","W3VFHlsQGo","7Ow5CEoToP","MGlTF9GXkX","EoToPhUTw7","NhXdujzUqR","aDGtStl72W","fmIK1WMiS3","mX2GElm0pD",
+"zY1GYzbIYY","ru4UGZzJHW","48cHL7Ow5C","jfREuni2v1","ksJbyAmdQd","ni2v17lUXZ","WaWsvGXdoH","JRJQBlpF6W","SjskQNxx9V","BGaQYfcJOy",
+"64s8N8cVD3","VBjhzIRh48","lH1ktzbIYY","VLTy6gtCA5","GXdoHv2eC3","iqv4kQssNC","64s8NzFgtB","hSSvQ29QAz","9GXkXlweGy","kB5nPZv7z0",
+"ECMvU618Di","45cIHAIYUu","MmKGJeuZA5","MmKGJRACuj","WaWsvVerEA","zqH0W7fsYM","pAhR1xXTI4","iwzGkMojnP","FwEJzkZANm","fmIK1prNT6",
+"tvdkDIjTwP","GrDg7VerEA","JJs5mRxrsm","h1zcHbgJAz","KsjRKRACuj","jfREuCIShG","zFgtB45cIH","uAWypfmIK1","0Wr5yWDVWJ","QbxXcuJScX",
+"uoStwYh1hF","HRxd8RmDcr","0Kyfs0MR5X","TCgPpciuWz","UmaEvFNYIM","QbxXczz4ZU","WPmlxGXdoH","5iGN5Cfgr3","9XyT9RmDcr","0Wr5yGXdoH",
+"OUqFMZv7z0","uLtKsIn3NS","VNCPdt98iW","FcWrWt59lR","AIYUuVjCZq","KASQ86AFT0","14FLRMmsIo","C2IrcTXQ0Z","hUTw724ARF","vkCHHCdyBV",
+"zHF1qRmDcr","oQ87rCdyBV","5VZjSv2eC3","rKDLJD6rBy","aez9yZzJHW","IKxdLpFrrl","zz4ZU0BmCy","RzaZA0YAGH","2ZHdkHzZT8","t59lRk85Ae",
+"tjQxsVNCPd","HRxd8IBe8k","M3zXLTwano","ZUnqtRxrsm","DG4sT9GXkX","FNYIMQssNC","i3pyd3otm6","tjQxsEOE1o","pWiOsGWqqX","aDGtSlm0pD",
+"CxVEfCp3mZ","MojnPF6PT2","FFDuigjUTu","xciqpcQOnv","Qworu0PktI","iB08l6AFT0","uJScXAXpwE","RpBQm2TRI7","RpBQmhE1Ql","cmXIXcQOnv",
+"jiVBPStlDJ","NhXdu9rlg9","fqypyJIqXi","nnP8o6AFT0","qUJMdG1RhS","Zv7z0vkCHH","zbIYYsuY4x","GSQwjYjB9t","lj07Qulk41","QChxs8cVD3",
+"FFDuigIYvE","fFDrJ5iGN5","CqqaDlpF6W","ZzJHWDz1R3","gjUTuxReec","8hJdtsoy9t","pvgjSTCgPp","pFrrlSWfou","aDGtSJJs5m","xXTI42ZHdk",
+"l83Uds7Mxk","OUqFMn1pmO","TXQ0Z4W0Tl","zQt6QWmadA","0YAGHuAWyp","QClRLFxX9q","OUYuFo8Uyd","ZzJHWQChxs","07n1cuupzk","2TRI7gjUTu",
+"2TRI7djsrv","OxWIHtl72W","EdBKc9rlg9","VBjhzKASQ8","CqqaDYh1hF","MezSWFPfSE","C2Irc5iGN5","i7WMQU3yw5","bZLvSVerEA","I7p2aJIqXi",
+"0h1b14QMc9","5drc6AOgEe","ZJTXHuoStw","1j5L8fLNg8","yToGWWreyP","MojnP29QAz","ix74r4QMc9","RsQUqCfgr3","BbwgAIjTwP","ydG8Ul83Ud",
+"ECMvUx3LDe","7fKYU1v5hH","In3NSk85Ae","xciqpv2eC3","yvOMIkZANm","NhXdujS1aj","4W0TlKZamH","WaWsvh1zcH","dmoS7uZPqg","Q6LixWaim6",
+"fcwDajSjS3","No0QbxXTI4","jS1ajoVQp6","pvgjSyofH3","9rlg9OUYuF","KZamHBFkb8","piJSktvdkD","lweGyUmaEv","ZzJHWHfyNQ","RzaZAWaWsv",
+"pvgjSFGzgp","RpBQmqaofN","HzZT8S77LH","MezSW0Kyfs","3otm6HP433","IKxdLQChxs","yluBxjSjS3","uoStwzQt6Q","WPmlx2DREs","FjHXRpvgjS",
+"JJs5mUl4a1","Twanoa00b5","dhSuHJ2mQi","FjHXRzbIYY","HzZT8soy9t","SbRYytl72W","FxX9qXyPZN","FGzgpix74r","gf8rIksJby","QChxszz4ZU",
+"h1zcHUl4a1","gf8rIOz8yZ","b29RJzmLYD","d85a9QClRL","EoToPZv7z0","NcICAgjUTu","4QMc9dmoS7","ZhwG1iqv4k","Yh1hF9XyT9","zFgtBuZPqg",
+"UmaEvIKxdL","8cVD3Rxrsm","MojnPrz7Ut","1j5L88U2nU","piJSkydG8U","3weIFyluBx","xciqpfLNg8","EOE1oQChxs","9GXkXh1zcH","5NammiwzGk",
+"5IhmGJ2mQi","o8UydW7cTs","lH1kt3weIF","pv0i7BpYhV","HfyNQ2hEEU","Yf2EcPb1pa","WPmlxWmadA","AgJHQlH1kt","No0Qbhi5X7","J2mQidpe1v",
+"nFqikAmdQd","NAFuwhi5X7","MK07YEdBKc","VNCPdhYBCK","Nxx9VMm8si","WMiS3gIYvE","NcICAXflUq","FGzgpZzJHW","618DiciuWz","pFrrlpAhR1",
+"rz7UthE1Ql","DcpWBJ2mQi","2hEEUfLNg8","tAOsr8RCUA","W3VFHaFFss","ciuWzxXTI4","Y1mC02Nslm","zbIYYQClRL","euZA5ydG8U","Yh1hFs93Ml",
+"Yw2oUuN6r3","ZUnqt9XyT9","JXljWyToGW","fFDrJcL0aE","yluBx8U2nU","tvdkDb29RJ","D6rByl83Ud","QbxXcMezSW","0BmCySWfou","Mm8sihYBCK",
+"U3yw5x3LDe","ThjNnlweGy","5drc6FLsph","iKqhrBpYhV","QssNC5Namm","P6bcgCxVEf","5NammiKqhr","Z4I1vP6bcg","wDajXvkCHH","S2DfutaOXK",
+"UmaEv0YAGH","hYBCKprNT6","1v5hHZzJHW","ZUnqtI7p2a","uJScXDz1R3","DQimp5Mg9r","rKDLJW3VFH","5Mg9rgtCA5","mX2GEs7Mxk","CNHmvBpYhV",
+"RkQkeuPX7G","yluBx2TRI7","SjskQCIShG","zY1GYMaJQs","FNYIMoQ87r","AIYUunlaBy","9XyT9lweGy","qaofNWDVWJ","ru4UGKsjRK","EOE1oMkgy8",
+"FPfSECdyBV","e6e4zZUnqt","pFrrlnnP8o","ThjNnuTacx","45cIHxXTI4","dhSuHMaJQs","ydG8UVIlwP","vOqCEEoToP","2TRI7K20wK","dmoS75nmWv",
+"qaofNVprf2","5Drn0zY1GY","CxVEflj07Q","D6rBypWiOs","jS1aji7WMQ","WPmlxQworu","piJSkLbRTH","jtn0XIBe8k","dmoS7pFrrl","tuDySYh1hF",
+"guMb8MGlTF","jtn0XKsjRK","7X3uyfcwDa","uLtKszHF1q","WPmlx580YD","5drc6MezSW","hUTw7ZhwG1","oVQp6JRJQB","tlILttuDyS","JIqXiNhXdu",
+"TXQ0Zn1pmO","o8UydMK07Y","VBjhz8cVD3","iqv4kfLNg8","8RCUAOUYuF","WMiS3MK07Y","n8pJ90Wr5y","No0QbRsQUq","QnJ1SNhXdu","StlDJTa8f6",
+"LewvMuAWyp","QChxsZJTXH","RzaZAcmXIX","cShY2zFgtB","brhlQsoy9t","jS1ajfcJOy","5Mg9rfmIK1","bZLvSM3zXL","4W0TlTwano","1v5hHKr8ys",
+"CIShGpFrrl","dQ586FcWrW","WDVWJlpF6W","t59lR4W0Tl","FwEJzdmoS7","i3pydWMiS3","ogLgcHP433","zbIYYBCxeC","HzZT8QClRL","k85AeZJTXH",
+"RACuj16lHc","gjUTu9rlg9","uJScXulk41","qQxHPBCxeC","OxWIHs4786","fmIK18FmFH","QYxC0QnJ1S","uupzkt59lR","ciuWzMezSW","Waim6ni2v1",
+"aFFss48cHL","i3pydC2Irc","zFgtB7hyVv","yEfy9lsQGo","lH1ktguMb8","ciuWzsoy9t","fLNg8x3LDe","tlILtX6Pin","iB08luZPqg","CdyBVpT8wu",
+"BGaQY0Kyfs","DLhzMrhl0J","TXQ0Z7Ow5C","2Yz7EFGzgp","QssNCatef2","wiHrZciuWz","iKqhrzHF1q","h1zcH3weIF","jS1ajB3qem","k85Ae4dEz6",
+"U3yw5ZhwG1","45cIH45cIH","jS1ajCp3mZ","ZuDtDZzJHW","2NslmW3VFH","RzaZAru4UG","6q6L9hUTw7","JkzUn0YAGH","3weIFfmIK1","2DREsnnP8o",
+"uupzkdhSuH","atef2zz4ZU","7Ow5CGWqqX","JKWYRdpe1v","tvdkDYw2oU","Uvlv4CqqaD","qUJMdZv7z0","Oz8yZU3yw5","0Wr5y7X3uy","HfyNQfqypy",
+"SmGzvFVMxo","9eoRcAOgEe","BbwgAVLTy6","0Wr5ylj07Q","i3pydDz1R3","VNCPduvf7A","OHaBze6e4z","Ta8f6U3yw5","8TxD72TRI7","yofH37ku1p",
+"s93Mlfqypy","5IhmGKsjRK","No0Qbk85Ae","HP43324ARF","5nmWv6AFT0","cmXIXpvgjS","DLhzMvOqCE","prNT6tuDyS","ni2v1pWiOs","zz4ZUZv7z0",
+"Dz1R3ydG8U","HlUbFIjTwP","AmdQdHlUbF","xReecRmDcr","Q6hMCCp3mZ","9y4lw5Mg9r","AkKTkRpBQm","dQ586CNHmv","Waim6n1pmO","HRxd8tAOsr",
+"VBjhz0YAGH","NOHszgIYvE","7fsYMfmIK1","Yh1hFiB08l","iB08llweGy","16lHcJRJQB","TCgPp16lHc","0KyfsQ6Lix","zFgtBCp3mZ","FjHXRUmaEv",
+"sqVrfI7p2a","tlILtlkMUA","OHaBzMkgy8","2NslmZuDtD","uN6r3ru4UG","iwzGklpF6W","DLhzM9iGoT","zbIYY9y4lw","lH1ktuupzk","ZzJHW2ZHdk",
+"EdBKcGSQwj","2DREsWaim6","7fKYUydG8U","C2IrcJkzUn","jS1aj16lHc","9GXkXZ4I1v","0MR5X29QAz","8TxD7O3iyQ","Q6LixEoToP","Mm8siMmsIo",
+"faHirvkCHH","i7WMQdhSuH","Yf2EcvOqCE","JIqXiDz1R3","zY1GYHRxd8","pFrrl2DREs","LewvM8hJdt","Oz8yZHP433","o8UydM3zXL","RzaZABFkb8",
+"OUYuFNAFuw","o8UydgtCA5","8FmFHrhl0J","8RCUAatef2","C2IrcuAWyp","fcwDal83Ud","tjQxsMmsIo","lm0pDKZamH","VNCPdHlUbF","In3NSbgJAz",
+"kZANmlH1kt","2ZHdkn1pmO","Ta8f624ARF","uZPqgU3yw5","MGlTFjzUqR","BGaQYyofH3","8FmFH7X3uy","1j5L8MmKGJ","wiHrZC2Irc","GXdoHVerEA",
+"ogLgcStlDJ","W3VFHuTacx","MaJQszFgtB","MmKGJt98iW","ru4UGjeskS","ZUnqtHP433","VerEAv1Hln","HlUbFZ4I1v","NAFuwqUJMd","s7MxkNo0Qb",
+"ru4UGlViBv","taOXKulk41","EdBKcZzJHW","Ss0Zuhi5X7","FPfSE24ARF","UlU3M4QMc9","AOgEeS77LH","Mm8si45cIH","yluBxjeskS","v8yFNru4UG",
+"nnP8owiHrZ","Kr8ysix74r","WDVWJlCMxy","WDVWJfqypy","aDGtS3weIF","O3iyQLbRTH","l83Ud1j5L8","HfyNQhSSvQ","7fKYUm4bxU","uAWypFwEJz",
+"4W0TlcmXIX","uQIcznnP8o","v2eC3Oz8yZ","dQ5869XyT9","VerEAJkzUn","Ul4a11v5hH","MK07YU3yw5","xReecpT8wu","a00b5s93Ml","pFrrlFNYIM",
+"yToGWIRh48","I7p2aNxx9V","rz7UtCIShG","QworulH1kt","lH1ktFGzgp","FLsphY1mC0","ReKEWtlILt","Chuy33otm6","5Mg9rn8pJ9","Yh1hFyToGW",
+"8FmFH7fsYM","0h1b1FjHXR","XflUqZJTXH","AkKTk8TxD7","Mkgy8gIYvE","8RCUAIKxdL","0BmCylXFOB","KsjRKCp3mZ","Ss0ZulsQGo","7hyVvNhXdu",
+"uQIcz7X3uy","WMiS3Cp3mZ","OHaBzRzaZA","dhSuH7fKYU","jS1ajQYxC0","cQOnvzmLYD","LewvMCp3mZ","55rfBI7p2a","FhtglgtCA5","SbRYyQ6Lix",
+"QnJ1Slj07Q","GWqqXGWqqX","L7cGctvdkD","DQimpdhSuH","yofH3yvOMI","CK5W7v1Hln","0YAGHEdBKc","CdyBV5VZjS","cmXIXn8pJ9","iB08lfqypy",
+"CNHmv9eoRc","ni2v1cQOnv","vLsmSdmoS7","NhXduSs0Zu","LDk6fVjCZq","AkKTkxReec","JKWYRCIShG","J2mQiK20wK","YjB9tiKqhr","3otm66q6L9",
+"cShY2uTacx","618DivOqCE","Z4I1v2ZHdk","SjskQ0Wr5y","zQt6QsqVrf","FjHXRI7p2a","OUYuF16lHc","m4bxUThjNn","G1RhS8RCUA","K4GS8he9IA",
+"XflUq7X3uy","S2DfuoVQp6","CxVEfVBjhz","BbwgAi3pyd","0Wr5ySWfou","aFFssrhl0J","sqVrfEdBKc","WreyPSjskQ","F6PT2KASQ8","VjCZq8RCUA",
+"ciuWzuTacx","7lUXZcShY2","ThjNn5VZjS","Yw2oUmX2GE","FcWrW5Namm","n1pmOgIYvE","uQIcztvdkD","O3iyQS2Dfu","FPfSESjskQ","lkMUAQYxC0",
+"TXQ0ZcShY2","14FLRXflUq","HP433No0Qb","d85a9Gv3Fq","DLhzMsoy9t","ThjNnGSQwj","tl72Ws93Ml","QnJ1SgtCA5","AOgEeVerEA","HP433IjTwP",
+"XflUqkZANm","RpBQm7Ow5C","qUJMdhE1Ql","MmKGJZv7z0","dhSuHK4GS8","5drc6hSSvQ","mz8gxsx5Gl","uupzknFqik","G1RhSdpe1v","QssNCdjsrv",
+"2hEEUEoToP","Kr8ysIBe8k","jfREu5ZaEz","0h1b14dEz6","CIShGUl4a1","No0QbZUnqt","WMiS3oVQp6","QYxC0fcwDa","mz8gxuvf7A","hi5X7jtn0X",
+"s93MlblLA9","AOgEe8TxD7","Yf2EcgtCA5","45cIHtlILt","JIqXigIYvE","7fKYUpv0i7","XyPZNNcICA","yvOMIIBe8k","LDk6fHfyNQ","5Mg9riB08l",
+"Y1mC0Kr8ys","Qworus4786","Dz1R3bgJAz","pv0i7VerEA","ZUnqtJkzUn","Mm8silkMUA","atef2M3zXL","FGzgpi7WMQ","MojnPLDk6f","lm0pDnnP8o",
+"he9IAnFqik","oGu6xQworu","dQ586cL0aE","SmGzvP6bcg","lj07QUmaEv","suY4x3otm6","Q6hMCsoy9t","lXFOBhYBCK","nFqikaDGtS","CNHmvG1RhS",
+"CxVEfIn3NS","zmLYDZ4I1v","JRJQBcShY2","uPX7GVprf2","fLNg8RsQUq","guMb8zHF1q","Q6LixFcWrW","VLTy6oGu6x","No0QbsqVrf","ulk41Cp3mZ",
+"cQOnvEdBKc","ReKEWIRh48","BCxeCDz1R3","Nxx9VhYBCK","iwzGkBpYhV","GWqqXHfyNQ","WmadA0ao3l","yluBxChuy3","7lUXZl83Ud","Rxrsmfqypy",
+"gf8rIdjsrv","vOqCEs7Mxk","MezSW8U2nU","MaJQsni2v1","lm0pDtvdkD","qUJMdlpF6W","StlDJB3qem","9y4lwCqqaD","pWiOslCMxy","h1zcHAIYUu",
+"pAhR1TXQ0Z","djsrvCfgr3","uupzkJkzUn","K4GS8Gv3Fq","soy9tjtn0X","KsjRKe6e4z","WDVWJdhSuH","W3VFHGXdoH","qUJMd0Wr5y","e6e4zYjB9t",
+"1j5L8ogLgc","HzZT8tAOsr","55rfBZ4I1v","hi5X70Wr5y","cmXIXguMb8","ZuDtDBbwgA","JRJQB16lHc","YjB9t3weIF","5Drn0pT8wu","2hEEUxciqp",
+"FcWrWe6e4z","QssNCpmeCd","Waim6s93Ml","vLsmS5nmWv","lH1kt9eoRc","iqv4kK20wK","G1RhS9y4lw","GSQwjxXTI4","OHaBzFxX9q","fcJOy55rfB",
+"NhXduDLhzM","TwanoRkQke","hE1QlSbRYy","WreyP0Kyfs","29QAznnP8o","S77LHDQimp","Ta8f6kB5nP","Qworu580YD","O3iyQ4dEz6","BbwgAJJs5m",
+"FFDui2hEEU","t59lR1v5hH","MGlTFWDVWJ","0MR5Xv8yFN","G1RhSSjskQ","gjUTuS2Dfu","KASQ8jfREu","gjUTuRkQke","NAFuw7Ow5C","HlUbF5ZaEz",
+"dhSuHd85a9","7fKYUyToGW","MaJQslH1kt","K4GS8oGu6x","prNT6qaofN","zqH0Ws7Mxk","0Wr5yMkgy8","x3LDeAkKTk","ulk41GrDg7","lCMxyo8Uyd",
+"b29RJJXljW","FPfSE0BmCy","mX2GEnlaBy","0BmCyYw2oU","WDVWJBCxeC","d7vjMMmKGJ","LDk6fRpBQm","uQIcz0Kyfs","kZANmiwzGk","S77LHFwEJz",
+"jzUqRv2eC3","lH1ktyvOMI","XyPZNHP433","ZhwG1zQt6Q","uAWypDQimp","blLA9zbIYY","OUYuFKZamH","SmGzvtuDyS","m4bxUJkzUn","atef2vkCHH",
+"tlILtfLNg8","t98iWwDajX","VIlwPVprf2","he9IAjtn0X","CqqaDcShY2","ulk41zbIYY","YjB9tjiVBP","zHF1q8FmFH","4dEz6MK07Y","n8pJ9qUJMd",
+"GWqqXYh1hF","7fsYMSs0Zu","uoStwoGu6x","n8pJ9rKDLJ","Mm8siOHaBz","GWqqXfLNg8","D6rByFLsph","bgJAzhSSvQ","FnPFB8FmFH","DLhzMciuWz",
+"8TxD7zqH0W","rhl0JL7cGc","uAWyps7Mxk","EoToPRsQUq","y94nw5VZjS","m4bxUMkgy8","Yh1hFzqH0W","tuDySqaofN","ZUnqtZ4I1v","48cHLKZamH",
+"d7vjMStlDJ","VerEACK5W7","lj07QdQ586","KsjRKsoy9t","fcJOyTCgPp","RzaZAMGlTF","uupzkPYBf4","DLhzMazIWp","VNCPdMmKGJ","ReKEWfmIK1",
+"AOgEelsQGo","prNT6blLA9","jS1ajStlDJ","TCgPp1LB1L","tuDySHP433","HlUbFaFFss","bgJAzYOfrY","i3pydguMb8","hYBCKZv7z0","sqVrfFFDui",
+"lj07Qn8pJ9","mX2GEtlILt","oQ87rbgJAz","3weIFjiVBP","kZANmkB5nP","RxrsmvLsmS","k85AetvdkD","d7vjMQbxXc","azIWpOUqFM","WmadAgIYvE",
+"5ZaEzWaim6","Rxrsmi7WMQ","NhXdufFDrJ","prNT6Qworu","Vprf2QClRL","pT8wunFqik","ru4UGYjB9t","24ARF24ARF","Q6hMC2TRI7","jSjS3cL0aE",
+"Cfgr3s7Mxk","uN6r3uPX7G","TCgPpBpYhV","Waim6uZPqg","tuDySb29RJ","QClRLfcwDa","zQt6QM6qcG","zz4ZUGrDg7","zmLYDVNCPd","1LB1LGXdoH",
+"7fsYMtjQxs","zqH0WU3yw5","gjUTurKDLJ","pvgjSVLTy6","pFrrlL7cGc","0KyfsiKqhr","MezSWksJby","ZzJHWIBe8k","wiHrZfLNg8","QWxoTMK07Y",
+"pWiOsUvlv4","zbIYYVprf2","pFrrlRpBQm","JJs5m2ZHdk","8cVD3CdyBV","RpBQms7Mxk","UlU3M3otm6","0h1b1mz8gx","ogLgccL0aE","TXQ0ZuTacx",
+"ni2v1zqH0W","s4786e6e4z","45cIHOxWIH","5iGN58TxD7","OUqFMZuDtD","5NammlCMxy","ZJTXH5Namm","aez9yFcWrW","RBhp0uZPqg","ciuWzWreyP",
+"yToGWTa8f6","zQt6QSjskQ","pWiOstjQxs","QnJ1SVLTy6","Yh1hFCIShG","lXFOB29QAz","Y1mC0uoStw","8hJdtWDVWJ","FnPFBPb1pa","JIqXigf8rI",
+"4QMc9ZUnqt","OUqFMThjNn","QbxXcQnJ1S","G1RhSUl4a1","xReecOUYuF","W3VFHRACuj","Nxx9VPYBf4","In3NSnnP8o","AgJHQfcwDa","TXQ0ZkB5nP",
+"jeskSn8pJ9","FNYIMzqH0W","K4GS8In3NS","JkzUnY1mC0","yluBxprNT6","W7cTsm4bxU","LewvM0PktI","lj07QQWxoT","KZamHuLtKs","s4786XflUq",
+"MGlTFguMb8","Uvlv4BGaQY","8cVD3piJSk","zmLYDOHaBz","9GXkXFnPFB","prNT6S2Dfu","zY1GYQYxC0","FPfSE2DREs","7lUXZW3VFH","1j5L8lpF6W",
+"d85a9lH1kt","RzaZAhE1Ql","Q6Lix64s8N","Rxrsmdjsrv","tAOsrpFrrl","jzUqR0BmCy","guMb8NcICA","BGaQYHlUbF","uQIczOz8yZ","uJScXtjQxs",
+"FGzgpfaHir","vkCHHX6Pin","piJSk4dEz6","ZUnqt8cVD3","55rfBK4GS8","dhSuHiB08l","NcICAciuWz","YjB9tStlDJ","tAOsr3weIF","SbRYylXFOB",
+"ydG8UMGlTF","mz8gxlkMUA","SjskQjS1aj","gf8rImz8gx","s93MlFVMxo","No0QbCNHmv","QChxs5Drn0","2NslmWaim6","qQxHPM6qcG","8xEKzG1RhS",
+"K4GS8iKqhr","he9IA8U2nU","he9IA3weIF","2TRI7In3NS","cL0aE7lUXZ","0h1b1iqv4k","IBe8kQ6Lix","i3pydcQOnv","FPfSEcShY2","8U2nUMK07Y",
+"K4GS8fFDrJ","faHirVIlwP","he9IAtaOXK","3otm6HlUbF","lsQGoprNT6","cL0aEmX2GE","piJSks4786","QbxXcNhXdu","VjCZqaFFss","i3pydi7WMQ",
+"OxWIH9XyT9","bZLvScQOnv","FnPFBIKxdL","uPX7GzbIYY","m4bxUZhwG1","qQxHPMmKGJ","hSSvQ5IhmG","gtCA5uN6r3","Chuy3Gv3Fq","yToGWjS1aj",
+"OUqFMtuDyS","LbRTHBCxeC","gf8rIs93Ml","taOXKRACuj","DLhzMIn3NS","FxX9qQbxXc","BbwgAFGzgp","vkCHHQ6hMC","NOHszQWxoT","vOqCEzz4ZU",
+"Dz1R3LewvM","aDGtSd7vjM","QworuAkKTk","zY1GYv1Hln","iwzGkXyPZN","NOHsz0Kyfs","7hyVvS77LH","Gv3FquoStw","zY1GYVBjhz","zFgtBD6rBy",
+"pT8wuKr8ys","lweGyiqv4k","ZhwG1pmeCd","n8pJ9lkMUA","OxWIHJXljW","fcwDa9iGoT","ZhwG1P6bcg","s7MxkMkgy8","9y4lwMaJQs","rhl0JtvdkD",
+"Cfgr364s8N","2ZHdkzFgtB","8xEKzZJTXH","lXFOBGWqqX","7fsYMuJScX","WreyPgjUTu","Q6hMCCdyBV","s4786d7vjM","YOfrYrhl0J","G1RhSxXTI4",
+"vOqCEnnP8o","suY4x3weIF","Yw2oUS2Dfu","uPX7GReKEW","FnPFBPOUYS","a00b5OUYuF","0PktIRkQke","S77LHTa8f6","jiVBP48cHL","nnP8oPb1pa",
+"GXdoHBCxeC","AXpwEGv3Fq","7fsYMGWqqX","9GXkXOHaBz","suY4xoGu6x","uoStwaDGtS","RmDcrFGzgp","RkQkeFVMxo","aL6AJThjNn","suY4xD6rBy",
+"gdQsSix74r","xciqp9GXkX","xciqp0BmCy","FGzgpFPfSE","pv0i7suY4x","9iGoTCfgr3","YOfrYhSSvQ","oQ87rm4bxU","KASQ8x3LDe","lweGyyToGW",
+"HfyNQVBjhz","RxrsmlkMUA","7ku1pksJby","RACujaFFss","VBjhzhi5X7","618DiuQIcz","lm0pDgjUTu","Ta8f6iwzGk","4dEz6HfyNQ","yluBxm4bxU",
+"Kr8yshYBCK","SjskQChuy3","Gv3Fql83Ud","8TxD7k85Ae","QWxoTMezSW","JIqXiMojnP","qQxHPMaJQs","AgJHQRmDcr","Cp3mZUlU3M","Oz8yZwDajX",
+"OxWIHiB08l","FxX9qSmGzv","brhlQFFDui","GWqqXHRxd8","pWiOsJJs5m","zQt6QMaJQs","CxVEfiB08l","wiHrZ8RCUA","QnJ1ScL0aE","S2DfuCNHmv",
+"vLsmSxReec","VLTy6mX2GE","Qworu7X3uy","LbRTH6q6L9","QssNCfmIK1","UlU3MwiHrZ","RkQkeSjskQ","7X3uy8FmFH","FLsphoQ87r","W7cTsGv3Fq",
+"Mkgy88cVD3","jfREupT8wu","KZamHVjCZq","jeskSStlDJ","BFkb82DREs","Oz8yZtl72W","JJs5ms7Mxk","pmeCdkZANm","oQ87rgjUTu","jeskSOz8yZ",
+"8hJdtRkQke","aFFsshSSvQ","AgJHQulk41","P6bcgXflUq","QworuDG4sT","5ZaEzEOE1o","JKWYRmX2GE","azIWpPOUYS","pFrrlGWqqX","zmLYDoQ87r",
+"k85AeOxWIH","GrDg7ZzJHW","h1zcHEoToP","iB08lKASQ8","HRxd8v2eC3","JXljWvLsmS","WPmlx45cIH","uAWypMGlTF","uN6r3DLhzM","s93MlAXpwE",
+"n1pmOFjHXR","uN6r3FGzgp","QWxoTQChxs","fFDrJo8Uyd","yToGWCp3mZ","PYBf4QChxs","cShY2v8yFN","nFqik1LB1L","ZuDtDUmaEv","pvgjSVNCPd",
+"GSQwjKr8ys","zY1GYVjCZq","lViBvFGzgp","DG4sTS77LH","I7p2aNhXdu","0ao3ltAOsr","1j5L8Rxrsm","ru4UGs93Ml","B3qemfLNg8","sqVrf7X3uy",
+"i3pydRsQUq","wiHrZzQt6Q","2Yz7Ed85a9","J2mQibZLvS","dQ586CIShG","uJScXv8yFN","Chuy3Yf2Ec","5Drn0Ul4a1","iKqhrv1Hln","QworuHP433",
+"GrDg7iKqhr","cQOnvkB5nP","ulk41Mm8si","XflUqjS1aj","FhtglmX2GE","5ZaEzciuWz","5drc6vOqCE","he9IAuAWyp","ix74rjzUqR","KsjRKZhwG1",
+"KASQ8s93Ml","cmXIXdhSuH","dpe1v3otm6","7lUXZ29QAz","qaofNe6e4z","9rlg9BpYhV","pWiOshSSvQ","24ARFyToGW","Mm8sihSSvQ","jS1ajuAWyp",
+"5ZaEzfcJOy","cShY29GXkX","No0QbOxWIH","qQxHPDcpWB","hE1Ql9eoRc","5drc6Cp3mZ","uupzkuPX7G","8cVD3YOfrY","MaJQsx3LDe","OUqFMY1mC0",
+"rz7UtgdQsS","fcwDaDG4sT","tjQxsSmGzv","KZamHZ4I1v","VerEALbRTH","xReecVerEA","Y1mC0a00b5","e6e4zru4UG","14FLR8FmFH","5drc6HzZT8",
+"lXFOBuQIcz","zFgtBoQ87r","G1RhSAXpwE","v8yFNzQt6Q","9iGoT8hJdt","NcICACdyBV","Ss0Zuh1zcH","ix74rBGaQY","pWiOsJKWYR","FcWrW55rfB",
+"s4786CdyBV","C2IrcaL6AJ","jzUqRpAhR1","Yf2EcDz1R3","KsjRKk85Ae","tlILtOz8yZ","uJScX8U2nU","2TRI7FVMxo","G1RhSbrhlQ","ZUnqtMaJQs",
+"5NammVNCPd","5Drn0jiVBP","AOgEe6q6L9","9rlg97X3uy","fcJOyU3yw5","lkMUAix74r","QClRLTwano","uPX7GyluBx","2hEEUFcWrW","0MR5XjfREu",
+"pT8wuaL6AJ","FLsph7lUXZ","m4bxU7fsYM","ZuDtDSjskQ","RpBQmuAWyp","o8UydEdBKc","CIShGQssNC","In3NSCqqaD","BbwgAI7p2a","55rfBNcICA",
+"FnPFBFFDui","lViBvWDVWJ","AIYUuECMvU","J2mQizmLYD","7hyVvBpYhV","cQOnvtaOXK","iB08lM3zXL","NhXdupmeCd","FLsphm4bxU","W7cTsCNHmv",
+"DQimptaOXK","hi5X7fcwDa","ru4UGBGaQY","fmIK1NAFuw","lViBvQChxs","wiHrZRxrsm","l83Ud9eoRc","k85AeVBjhz","lH1ktTa8f6","VNCPdlCMxy",
+"uTacxReKEW","taOXKkB5nP","AkKTkguMb8","07n1cM6qcG","No0QbLDk6f","16lHcv2eC3","LbRTHs4786","nlaByNo0Qb","AIYUu9eoRc","8U2nUW3VFH",
+"LbRTHuLtKs","AgJHQ7lUXZ","n1pmOoGu6x","zbIYY5Namm","1LB1LDQimp","pFrrlhUTw7","14FLRhSSvQ","IBe8k1j5L8","6q6L9gjUTu","uPX7GjzUqR",
+"55rfBydG8U","soy9t2ZHdk","xciqpzQt6Q","0KyfsRpBQm","hSSvQUmaEv","5Namm0PktI","xXTI4UlU3M","GXdoHvLsmS","6AFT0VLTy6","IRh482DREs",
+"jtn0XjzUqR","7fKYU7fKYU","fcJOylViBv","gIYvEfqypy","TCgPpDLhzM","dQ586POUYS","ciuWzpiJSk","FGzgpYjB9t","FnPFBhYBCK","IRh48Dz1R3",
+"SjskQBCxeC","MmKGJ2ZHdk","iKqhrfLNg8","e6e4z618Di","OHaBzaez9y","kZANmAmdQd","soy9tksJby","jS1ajgIYvE","sqVrfAkKTk","aFFssVNCPd",
+"Gv3FqprNT6","yvOMI1LB1L","5IhmGZhwG1","8U2nUhe9IA","DcpWBJkzUn","Ss0ZuRmDcr","Dz1R3MK07Y","IKxdLjiVBP","brhlQ4W0Tl","J2mQiVjCZq",
+"lH1kt2DREs","aFFssazIWp","In3NSP6bcg","Q6hMCAgJHQ","QYxC0Cfgr3","0PktITCgPp","RkQke2ZHdk","pvgjSuoStw","5ZaEzguMb8","rz7UtVIlwP",
+"QClRL2TRI7","qQxHPL7cGc","lsQGo24ARF","fmIK1QClRL","Yw2oU5Mg9r","iwzGk9y4lw","3otm6brhlQ","0MR5XiB08l","piJSkMkgy8","aez9ylViBv",
+"HzZT8SmGzv","G1RhSWPmlx","Ss0ZuBCxeC","lXFOBmX2GE","14FLRVprf2","v8yFNmX2GE","Ul4a1pvgjS","taOXKpWiOs","5iGN5FVMxo","jiVBPVjCZq",
+"4dEz6ECMvU","VBjhzTCgPp","uJScXRpBQm","nlaByIKxdL","580YDuN6r3","7ku1pgIYvE","RxrsmQnJ1S","cL0aEIBe8k","GrDg72ZHdk","0MR5XP6bcg",
+"POUYSXflUq","XyPZNuJScX","t59lRZzJHW","uAWypM6qcG","FcWrWO3iyQ","aFFssni2v1","n1pmO8hJdt","D6rByNhXdu","nlaByWmadA","fqypyru4UG",
+"1LB1L580YD","AOgEe45cIH","MmKGJ1j5L8","Y1mC0BFkb8","OUqFM618Di","Z4I1v0PktI","kB5nPXyPZN","yofH3aL6AJ","sqVrfyToGW","7fKYUyEfy9",
+"MojnP5Namm","DQimp9XyT9","b29RJ5Namm","qaofNtuDyS","b29RJKr8ys","jeskScQOnv","rhl0JSs0Zu","Oz8yZPOUYS","8hJdtGrDg7","Zv7z0Gv3Fq",
+"EOE1ogdQsS","s4786mz8gx","CdyBVydG8U","7fsYMEOE1o","K20wKlCMxy","0PktIzY1GY","KASQ8fcJOy","FPfSEPb1pa","Cfgr3OxWIH","Mm8si4dEz6",
+"8FmFHru4UG","lViBvSbRYy","P6bcgfqypy","hE1Ql0PktI","0ao3lblLA9","TCgPpUl4a1","k85Aezz4ZU","a00b5tl72W","o8UydS2Dfu","7X3uyHlUbF",
+"CIShGgf8rI","HRxd8ECMvU","s7Mxkdjsrv","M3zXLs93Ml","dhSuHNxx9V","4QMc92TRI7","hYBCKulk41","5Namml83Ud","suY4x45cIH","jfREuY1mC0",
+"yEfy97fsYM","9eoRcFGzgp","zz4ZUMojnP","Nxx9VbgJAz","d7vjMJKWYR","1LB1LgdQsS","U3yw5AgJHQ","mX2GEK20wK","OUqFMlsQGo","DLhzMS2Dfu",
+"yluBxWDVWJ","QChxsMaJQs","dQ586D6rBy","faHirbZLvS","oGu6xtvdkD","wDajX5Mg9r","a00b5Chuy3","BFkb824ARF","jeskSHfyNQ","U3yw5Z4I1v",
+"JJs5mPb1pa","5iGN5Kr8ys","BFkb8s7Mxk","QYxC0YjB9t","0PktIciuWz","MmsIoRxrsm","Yh1hFlH1kt","OHaBzFVMxo","16lHc0h1b1","tAOsrjSjS3",
+"HfyNQzz4ZU","WaWsvxXTI4","wDajXThjNn","Fhtgl0ao3l","AkKTkFxX9q","AOgEeIjTwP","lViBvazIWp","RACujjeskS","GSQwjCNHmv","rhl0JS2Dfu",
+"FGzgpOxWIH","s4786S77LH","xReecQworu","hSSvQix74r","SWfoupAhR1","jeskS9iGoT","Ul4a1CqqaD","YjB9tt98iW","cQOnvSWfou","55rfBNOHsz",
+"cQOnvJRJQB","uAWypW7cTs","Oz8yZNcICA","jzUqRksJby","pAhR1zFgtB","9eoRcUlU3M","No0QbK4GS8","bZLvSix74r","dmoS7Twano","uvf7AGSQwj",
+"KsjRKRmDcr","kB5nP24ARF","x3LDe5iGN5","7Ow5CnFqik","JJs5mNOHsz","IKxdLZJTXH","K4GS8fcJOy","QbxXcfLNg8","he9IAGrDg7","prNT67ku1p",
+"4W0TlzmLYD","IKxdL2hEEU","F6PT2gtCA5","ZzJHWd7vjM","ReKEWsuY4x","2hEEUt59lR","uQIczi3pyd","qaofNtvdkD","zY1GYlsQGo","pvgjSuvf7A",
+"0h1b18cVD3","O3iyQuZPqg","LbRTHdjsrv","0Kyfsix74r","y94nwUvlv4","xReecguMb8","SbRYyjiVBP","zHF1q2DREs","cmXIXOz8yZ","jS1ajAOgEe",
+"M3zXLazIWp","P6bcgJJs5m","WDVWJpT8wu","PYBf4HzZT8","Q6LixDcpWB","Pb1paNxx9V","zz4ZUm4bxU","GrDg7MGlTF","tlILtuvf7A","RkQkeFjHXR",
+"vkCHHEOE1o","Zv7z0jiVBP","ReKEW5nmWv","QWxoTpFrrl","x3LDepv0i7","ru4UGJKWYR","fcJOyDcpWB","FPfSEGXdoH","UlU3Mt59lR","cmXIXZzJHW",
+"uQIczgIYvE","MmKGJjiVBP","GrDg7yvOMI","KASQ8aez9y","WaWsvzQt6Q","Dz1R3GWqqX","wiHrZFVMxo","MK07YWaWsv","JJs5mAXpwE","Cfgr35iGN5",
+"uupzkCfgr3","BGaQYb29RJ","ZUnqtMmsIo","W3VFHaL6AJ","fmIK18cVD3","VBjhzQnJ1S","C2IrcHfyNQ","M3zXLd7vjM","tAOsrQbxXc","JKWYRNOHsz",
+"fqypy0Kyfs","nlaBy2DREs","5ZaEzv8yFN","cmXIXokgRi","VLTy62hEEU","HfyNQJIqXi","n1pmOdmoS7","QnJ1SNcICA","K20wKy94nw","MojnPjS1aj",
+"7X3uyjzUqR","S2Dfupv0i7","0PktIUlU3M","7X3uyh1zcH","IKxdL2Yz7E","n1pmOtjQxs","NhXduprNT6","RkQke7X3uy","d85a9In3NS","M6qcGFxX9q",
+"LbRTHMojnP","BbwgAzFgtB","8U2nUatef2","ciuWz8xEKz","7fsYMjS1aj","TXQ0ZOz8yZ","Pb1pa8RCUA","9rlg97ku1p","rhl0JblLA9","l83UdAOgEe",
+"K4GS8dpe1v","CK5W7qaofN","07n1cJIqXi","5drc6ix74r","ix74rF6PT2","HfyNQpvgjS","t98iWWmadA","MK07YqQxHP","RzaZARkQke","Zv7z0uJScX",
+"pAhR1v2eC3","8hJdtl83Ud","YjB9tMkgy8","sx5GlJKWYR","HRxd8pv0i7","fmIK1U3yw5","jfREuFPfSE","QYxC01LB1L","4QMc9iKqhr","hE1QltaOXK",
+"vLsmSHlUbF","mX2GEbZLvS","yToGWuZPqg","55rfB64s8N","6q6L98hJdt","Fhtglhi5X7","lH1kttuDyS","VBjhzDz1R3","VLTy6SWfou","gjUTuWmadA",
+"9eoRcOHaBz","yvOMIRmDcr","D6rByHfyNQ","ksJbyFcWrW","0ao3l8TxD7","8U2nUsoy9t","5drc6ni2v1","zFgtBo8Uyd","tAOsr8TxD7","d85a9i7WMQ",
+"GXdoHMmsIo","8TxD78RCUA","BFkb8dhSuH","W7cTsGXdoH","brhlQCp3mZ","FxX9qk85Ae","TwanoZhwG1","ix74rNAFuw","U3yw5kZANm","okgRi1LB1L",
+"dQ586JIqXi","jeskSIKxdL","lpF6WW7cTs","gjUTuGWqqX","Oz8yZHfyNQ","lsQGoBbwgA","zQt6QIn3NS","ZuDtDtl72W","IjTwPwiHrZ","EOE1ovLsmS",
+"K20wKLDk6f","07n1cy94nw","jfREuFnPFB","gtCA5VBjhz","HRxd8SWfou","hYBCKv2eC3","cL0aEOHaBz","IjTwPRsQUq","lH1ktSWfou","n1pmOMkgy8",
+"QYxC0sqVrf","ECMvUQ6Lix","azIWpQworu","nFqikTwano","h1zcHcL0aE","Q6hMCWaim6","ix74rZ4I1v","kZANmIBe8k","BFkb83weIF","pmeCdYjB9t",
+"FcWrWQWxoT","pv0i7pmeCd","5nmWvQYxC0","O3iyQ1v5hH","7hyVva00b5","Yh1hFdpe1v","2Yz7EW3VFH","9GXkXCdyBV","C2IrcQnJ1S","uPX7GZ4I1v",
+"HRxd8XyPZN","yofH32Nslm","NhXduJRJQB","RpBQmxReec","5Mg9rzFgtB","9iGoTJRJQB","07n1cfcwDa","QworuFxX9q","B3qemk85Ae","5iGN5HRxd8",
+"m4bxUFjHXR","DG4sT5nmWv","t98iWFxX9q","wiHrZatef2","ZJTXHJRJQB","G1RhSl83Ud","8hJdtAOgEe","Cfgr329QAz","07n1cCp3mZ","hUTw7n8pJ9",
+"oGu6xfmIK1","pmeCdIKxdL","qQxHPsoy9t","SbRYy5nmWv","OUqFM3weIF","SjskQoQ87r","4dEz6XyPZN","VIlwPQChxs","8U2nUW7cTs","J2mQijzUqR",
+"rKDLJRACuj","VNCPdCK5W7","uPX7GBCxeC","5NammFLsph","QYxC0n1pmO","HRxd8AIYUu","QYxC029QAz","aDGtSiKqhr","lj07Qi7WMQ","C2IrcCfgr3",
+"jzUqRC2Irc","s93MlbZLvS","fFDrJAIYUu","7X3uyFFDui","d85a9FNYIM","oQ87rDG4sT","7hyVvyEfy9","FxX9qnnP8o","vkCHH8U2nU","FNYIMECMvU",
+"ZUnqtZuDtD","QnJ1S2DREs","m4bxUuvf7A","8hJdtSs0Zu","VLTy6PYBf4","t59lREoToP","atef2cL0aE","Dz1R3dQ586","lViBvjzUqR","Mm8siGXdoH",
+"ksJbyQ6hMC","sx5GlcShY2","ni2v18TxD7","s93Mlv2eC3","ReKEWlm0pD","NhXduBbwgA","lj07QwiHrZ","cL0aEZv7z0","MmsIo2DREs","rKDLJlj07Q",
+"rhl0JAIYUu","FhtglFLsph","guMb8RsQUq","Ss0ZuaFFss","NOHszCK5W7","NcICAGSQwj","b29RJCxVEf","ZJTXHGWqqX","FPfSEaez9y","v8yFNWreyP",
+"Pb1paKZamH","FLsphhYBCK","rKDLJuAWyp","BpYhViKqhr","5VZjSsuY4x","VLTy6F6PT2","KZamHuvf7A","prNT6CIShG","v2eC3dmoS7","9y4lwNhXdu",
+"5Mg9rjtn0X","AXpwEprNT6","uupzkQClRL","cmXIXk85Ae","zFgtBUl4a1","ru4UGwiHrZ","S77LHWmadA","OxWIHWaWsv","yToGWpT8wu","OUqFMVLTy6",
+"jfREuyluBx","taOXKfqypy","tjQxsFcWrW","FGzgpWmadA","qUJMd64s8N","NOHszThjNn","rz7UtZzJHW","2hEEUuvf7A","7lUXZ7hyVv","v2eC3GrDg7",
+"FGzgpksJby","hE1Ql5Mg9r","mX2GEP6bcg","BCxeCydG8U","ix74rGrDg7","9eoRc9GXkX","Z4I1vIKxdL","UlU3MSjskQ","k85Aeuupzk","0PktIgdQsS",
+"FPfSEhSSvQ","gjUTulpF6W","GXdoHuupzk","WreyPazIWp","y94nw48cHL","D6rByAgJHQ","bZLvSHRxd8","hSSvQni2v1","NOHszHzZT8","AkKTkBCxeC",
+"2DREsPb1pa","6q6L964s8N","IKxdL7X3uy","lH1ktn8pJ9","lXFOBTa8f6","ciuWzyEfy9","5IhmGMezSW","FPfSEJkzUn","CIShGjSjS3","BbwgAyvOMI",
+"zY1GYh1zcH","qaofNFPfSE","iKqhrgf8rI","lH1kt7Ow5C","taOXKSmGzv","O3iyQCfgr3","Y1mC09iGoT","MmsIopv0i7","gf8rIRACuj","aez9y2DREs",
+"jeskSGSQwj","F6PT2RkQke","azIWpW3VFH","nFqikYf2Ec","FFDui8hJdt","ReKEWQnJ1S","YjB9t9eoRc","5ZaEzVLTy6","AkKTkHlUbF","oQ87rzmLYD",
+"FVMxoReKEW","BFkb8dpe1v","8FmFH14FLR","WPmlxpiJSk","618DiJJs5m","WPmlxZ4I1v","v8yFNZJTXH","dhSuHMkgy8","Cp3mZa00b5","BbwgApvgjS",
+"8cVD3MaJQs","mX2GEW3VFH","DLhzMuQIcz","s93MlTXQ0Z","o8UydcShY2","W3VFHD6rBy","RzaZAlkMUA","pT8wuMkgy8","AIYUuF6PT2","IjTwPd7vjM",
+"4W0TlFPfSE","JJs5mDQimp","Zv7z0wDajX","UlU3MJ2mQi","taOXKChuy3","tvdkDd7vjM","RkQkeB3qem","ix74rl83Ud","RkQkeJIqXi","ZJTXHUvlv4",
+"JRJQBCp3mZ","CxVEf1j5L8","jSjS3jS1aj","GWqqX1j5L8","Q6LixWMiS3","d7vjMIKxdL","mz8gxDLhzM","i7WMQS2Dfu","FhtgllpF6W","7hyVvfcwDa",
+"VIlwPAgJHQ","BbwgAazIWp","s7MxkCIShG","jzUqRF6PT2","64s8NMm8si","uvf7AcQOnv","IRh48AkKTk","LewvM5nmWv","tuDySyToGW","HfyNQuAWyp",
+"Cp3mZtAOsr","jSjS3hE1Ql","RkQke0YAGH","dpe1vuN6r3","lsQGohUTw7","Q6LixuN6r3","v1HlnFnPFB","UmaEvlsQGo","8xEKzpFrrl","PYBf47fKYU",
+"64s8NlViBv","K20wKAmdQd","BpYhVI7p2a","dmoS77fsYM","SbRYy0Kyfs","JIqXiru4UG","MaJQsGXdoH","dhSuHqQxHP","I7p2aQ6hMC","uAWypCfgr3",
+"IBe8krz7Ut","5nmWvGSQwj","x3LDeYh1hF","ksJbyQWxoT","FGzgpYw2oU","Uvlv49rlg9","cShY2CqqaD","5iGN5Mkgy8","CNHmvMm8si","jzUqR3weIF",
+"JKWYRvkCHH","dhSuHuLtKs","RmDcrCNHmv","oVQp6AmdQd","FFDuiTCgPp","Chuy3U3yw5","AkKTkWaim6","gIYvEzY1GY","BGaQYv8yFN","1LB1Lsoy9t",
+"uvf7AAkKTk","K20wKlXFOB","fqypyn8pJ9","JRJQBMmsIo","ulk41hUTw7","jS1ajuTacx","5Drn0Mkgy8","1v5hHIjTwP","6q6L9X6Pin","iqv4kQWxoT",
+"prNT68U2nU","faHirfFDrJ","dhSuHHfyNQ","5IhmGLewvM","GSQwjNo0Qb","X6PinfaHir","XyPZNs4786","iwzGkJJs5m","CqqaDEdBKc","NAFuwdhSuH",
+"W3VFHVjCZq","D6rByCNHmv","cL0aEkB5nP","IBe8ktlILt","2Yz7EF6PT2","euZA5FFDui","MaJQstaOXK","MGlTFVprf2","zY1GY2Yz7E","IRh48d7vjM",
+"iKqhrdjsrv","FwEJzv8yFN","b29RJrKDLJ","uTacxAmdQd","XyPZNOUYuF","DLhzML7cGc","uupzkqUJMd","FwEJzS2Dfu","mX2GEqUJMd","FLsphxXTI4",
+"jzUqRfmIK1","Z4I1vaL6AJ","WMiS3WaWsv","DcpWBuupzk","uTacxFVMxo","POUYS8xEKz","AmdQd07n1c","HzZT8K4GS8","Q6hMCrKDLJ","5iGN5a00b5",
+"MaJQswDajX","W7cTstvdkD","5Mg9rIBe8k","uoStwlm0pD","fLNg8lm0pD","ydG8UaL6AJ","sx5GlvOqCE","zmLYD8TxD7","lH1ktatef2","oQ87razIWp",
+"b29RJFFDui","QssNCQYxC0","xXTI4OHaBz","16lHchE1Ql","TXQ0ZGWqqX","jeskSYh1hF","ksJbyhe9IA","64s8NhE1Ql","Kr8ysb29RJ","uupzkECMvU",
+"Q6hMCZv7z0","gjUTupT8wu","d7vjMFnPFB","Oz8yZCK5W7","2DREs4QMc9","Yh1hFAXpwE","RkQkeyluBx","gf8rIm4bxU","LDk6f7fsYM","QYxC08xEKz",
+"Y1mC0aDGtS","IjTwPdQ586","jzUqRDLhzM","VBjhz45cIH","AXpwECNHmv","Twano4dEz6","SWfoul83Ud","QbxXcECMvU","9XyT9gjUTu","5VZjSzY1GY",
+"QClRLhi5X7","AgJHQa00b5","BpYhVtAOsr","prNT6n1pmO","x3LDeulk41","VNCPdXyPZN","VBjhzReKEW","StlDJStlDJ","MezSWZJTXH","5NammOUYuF",
+"Ul4a10Kyfs","Nxx9VwDajX","uvf7Arz7Ut","JRJQBgf8rI","bgJAzCfgr3","618DiBGaQY","zHF1qXyPZN","lsQGorz7Ut","FVMxolCMxy","0PktIb29RJ",
+"jfREubgJAz","1j5L8GXdoH","zmLYDBFkb8","d7vjM16lHc","C2IrcmX2GE","sqVrfTa8f6","16lHc5ZaEz","Y1mC0vLsmS","zqH0WY1mC0","B3qemGSQwj",
+"TwanolXFOB","uAWypvOqCE","ydG8UuZPqg","WmadA8FmFH","7Ow5Clm0pD","5IhmGaez9y","CNHmv9iGoT","yluBxeuZA5","euZA5sx5Gl","C2IrcZJTXH",
+"blLA9TCgPp","ciuWzPOUYS","qQxHPRACuj","No0QbWreyP","0PktIKsjRK","QWxoTFhtgl","NAFuwW7cTs","iKqhrpiJSk","AgJHQzHF1q","taOXKMmKGJ",
+"pAhR1QYxC0","POUYS9GXkX","C2IrcRmDcr","MezSWuLtKs","MojnPJIqXi","e6e4zVerEA","n1pmOh1zcH","Waim6hUTw7","ThjNnFwEJz","X6PinhSSvQ",
+"yEfy9CK5W7","IjTwPIKxdL","Zv7z0OUYuF","FjHXRkB5nP","KASQ8lH1kt","fmIK1RzaZA","StlDJBpYhV","lweGyyofH3","5drc6uQIcz","RxrsmsuY4x",
+"xXTI45Namm","nlaBy7Ow5C","FnPFBUl4a1","BFkb8zY1GY","2TRI7MezSW","RACuji3pyd","n1pmOYw2oU","KASQ8tl72W","qaofN7fKYU","uQIczt59lR",
+"9rlg95drc6","GrDg7vLsmS","mX2GE3otm6","BFkb8ix74r","oVQp6VBjhz","P6bcgP6bcg","Yf2Ec4QMc9","OUYuFzbIYY","S2DfuC2Irc","pAhR1GXdoH",
+"rhl0JyluBx","Mkgy82TRI7","s93Mls7Mxk","MK07Y9eoRc","ni2v1AmdQd","iB08lgjUTu","RzaZAoQ87r","D6rByB3qem","ydG8U0MR5X","jfREuhSSvQ",
+"RBhp0v1Hln","BbwgAjS1aj","h1zcHOxWIH","uAWypWaWsv","FNYIMn8pJ9","GWqqXs93Ml","1LB1LzHF1q","9XyT94W0Tl","fmIK1vkCHH","SjskQVerEA",
+"fcwDaQClRL","DLhzMnnP8o","lCMxyPb1pa","6q6L9L7cGc","aez9yjS1aj","16lHcjtn0X","8hJdte6e4z","SmGzvuLtKs","m4bxUZJTXH","s7MxkYOfrY",
+"uTacxXflUq","K20wKSmGzv","O3iyQMmKGJ","0Wr5yMmsIo","VIlwPYjB9t","suY4xulk41","FjHXRAmdQd","yluBxFVMxo","HlUbFDcpWB","GSQwj4W0Tl",
+"uZPqgyEfy9","uvf7AfFDrJ","14FLRM6qcG","FcWrWx3LDe","CK5W729QAz","Mm8siQ6hMC","Oz8yZ4dEz6","lkMUAAXpwE","9XyT9Cp3mZ","5VZjSNOHsz",
+"gdQsSbZLvS","No0Qb7lUXZ","brhlQciuWz","Yf2EcdmoS7","taOXK48cHL","M6qcGtAOsr","ydG8UdQ586","F6PT2Twano","gdQsSzFgtB","bZLvSCIShG",
+"FxX9qS77LH","okgRitl72W","EdBKcMmKGJ","Q6hMCi7WMQ","XyPZNAkKTk","POUYSQbxXc","5nmWvi7WMQ","4W0TlqaofN","IKxdLRACuj","LDk6fLewvM",
+"S2Dfudpe1v","iqv4kVNCPd","6AFT0HRxd8","fLNg8ciuWz","gdQsShE1Ql","KZamHGv3Fq","7Ow5CG1RhS","618DiokgRi","YjB9tHP433","FjHXRoQ87r",
+"0BmCy07n1c","ThjNnfcJOy","KASQ8hYBCK","Ss0ZuJRJQB","oGu6x7lUXZ","QworuChuy3","X6PinTwano","BFkb8MojnP","pT8wudmoS7","O3iyQIjTwP",
+"qQxHPPb1pa","CqqaDWPmlx","AgJHQ7Ow5C","h1zcH7ku1p","618DicmXIX","lweGy8FmFH","ZzJHWzqH0W","lj07QDcpWB","guMb8Vprf2","BCxeC1v5hH",
+"v8yFNtlILt","jfREuru4UG","Mkgy8ZzJHW","lViBvblLA9","F6PT2dmoS7","No0QbAkKTk","5VZjSuoStw","Chuy3EdBKc","hSSvQlkMUA","i3pydCqqaD",
+"zz4ZUlCMxy","lViBvGSQwj","uLtKs2Nslm","6AFT0BGaQY","gjUTuRpBQm","fcwDaDQimp","lsQGoAmdQd","iKqhrx3LDe","hE1Ql0h1b1","qaofNulk41",
+"MezSWG1RhS","s7MxkQworu","vkCHHi3pyd","wiHrZQChxs","jeskS0BmCy","aDGtS9iGoT","P6bcgcShY2","qQxHPy94nw","pmeCdyToGW","SWfoueuZA5",
+"BCxeCOHaBz","qQxHPcmXIX","CK5W7GrDg7","7lUXZAOgEe","WaWsvaFFss","ix74rZJTXH","TCgPpy94nw","fFDrJK4GS8","4W0TlDG4sT","hE1QlfLNg8",
+"RkQkewDajX","okgRiyvOMI","CK5W72Yz7E","2NslmjiVBP","uAWyptvdkD","PYBf4S2Dfu","Ta8f6pWiOs","Twano0YAGH","Yh1hFFFDui","29QAzStlDJ",
+"8RCUAFwEJz","gjUTuHzZT8","RzaZAsoy9t","5VZjSCxVEf","cQOnv7fKYU","DcpWB8cVD3","blLA916lHc","C2IrcNcICA","YjB9tBFkb8","lpF6WfmIK1",
+"x3LDezqH0W","F6PT2zmLYD","hSSvQfqypy","14FLRWPmlx","tuDySWMiS3","9XyT96AFT0","AOgEeOUYuF","4W0TlSmGzv","MezSWhYBCK","o8UydKr8ys",
+"QClRL7fKYU","MojnPOxWIH","vkCHHZuDtD","s7Mxki7WMQ","AXpwETXQ0Z","fmIK1xciqp","5IhmGs4786","45cIHqaofN","5ZaEzBGaQY","45cIH5ZaEz",
+"l83UdyToGW","Ul4a1W7cTs","580YDJ2mQi","Yf2Ecix74r","0KyfsUl4a1","OHaBzDz1R3","ogLgclCMxy","VNCPd0Kyfs","JKWYRMK07Y","IBe8kIRh48",
+"Yh1hFY1mC0","2TRI7dQ586","KsjRKZv7z0","oQ87rQClRL","8cVD3uQIcz","jtn0X45cIH","5nmWvlweGy","S2DfuYh1hF","EOE1oZ4I1v","zQt6QBFkb8",
+"WmadAFcWrW","m4bxU0Kyfs","zqH0W9GXkX","zFgtB0h1b1","iqv4kIn3NS","1LB1L9rlg9","jSjS3MojnP","QWxoTBCxeC","14FLR0Kyfs","wDajX5drc6",
+"HfyNQru4UG","cShY20MR5X","IRh48pT8wu","atef2Q6Lix","n1pmOO3iyQ","gtCA5FLsph","x3LDelpF6W","jS1ajKZamH","hSSvQFPfSE","P6bcgHP433",
+"k85Ae5Drn0","pAhR1brhlQ","pWiOslweGy","14FLRfaHir","EoToPaFFss","IRh48dpe1v","GXdoH0Wr5y","G1RhSy94nw","NOHszDcpWB","7fKYU8hJdt",
+"8FmFHfmIK1","0ao3llj07Q","07n1cfaHir","qaofNsuY4x","FLsph0MR5X","prNT6djsrv","WreyP2ZHdk","FPfSERsQUq","cL0aE45cIH","kB5nPF6PT2",
+"HP433WreyP","SbRYyZhwG1","fFDrJa00b5","GXdoHd85a9","ECMvUpWiOs","9iGoTCqqaD","RBhp0C2Irc","aFFssK4GS8","tlILtRzaZA","3otm6FLsph",
+"ZUnqtpiJSk","NOHszCNHmv","VjCZqbZLvS","zqH0WMmsIo","SbRYy0YAGH","AXpwEW7cTs","29QAzsqVrf","9GXkXuupzk","n1pmOSmGzv","ciuWzdhSuH",
+"yEfy9W3VFH","tAOsrVjCZq","S2DfuogLgc","uoStwcL0aE","3otm6WMiS3","2Nslm0MR5X","7Ow5CfmIK1","t98iWHP433","UmaEvOHaBz","16lHcWMiS3",
+"jS1aj5nmWv","xciqpdQ586","NOHszcL0aE","8cVD3I7p2a","uPX7GgjUTu","9eoRcG1RhS","7X3uyfcJOy","n8pJ9v8yFN","taOXKxciqp","rKDLJZUnqt",
+"0YAGHpiJSk","VLTy6FnPFB","1LB1Ls7Mxk","e6e4zjSjS3","VjCZqBbwgA","SWfouuupzk","GSQwjZJTXH","1j5L8DcpWB","guMb8gtCA5","SmGzvG1RhS",
+"VIlwPyvOMI","prNT6RkQke","PYBf47lUXZ","SjskQprNT6","cmXIXJkzUn","yToGW4dEz6","uZPqgZzJHW","FLsphkZANm","s4786oGu6x","580YDxciqp",
+"ni2v1JIqXi","580YDzFgtB","CK5W7ZhwG1","ix74rAXpwE","suY4xzz4ZU","lj07QJ2mQi","x3LDeyluBx","Zv7z0djsrv","2Yz7E7fsYM","gf8rIUl4a1",
+"Twano2hEEU","StlDJtl72W","9y4lwFcWrW","TwanooQ87r","FGzgpJRJQB","HzZT8hE1Ql","OxWIHRsQUq","uJScX6q6L9","QbxXc5Mg9r","brhlQ2ZHdk",
+"8U2nUnlaBy","Yf2EcUmaEv","kZANmW7cTs","OUYuFQWxoT","QssNCFcWrW","b29RJmz8gx","JkzUnlj07Q","0PktIJIqXi","F6PT2piJSk","5drc616lHc",
+"oQ87rsx5Gl","IBe8kLDk6f","taOXKjeskS","StlDJMezSW","Cp3mZWaim6","5iGN5cQOnv","IKxdLblLA9","aFFssyluBx","RACujyofH3","SbRYyAIYUu",
+"7ku1pcQOnv","RkQke4QMc9","8TxD7uupzk","7fsYM4W0Tl","lkMUAGrDg7","QClRLDcpWB","FGzgpTCgPp","yEfy9EOE1o","Uvlv4Waim6","CdyBVNOHsz",
+"45cIH8xEKz","uQIczfmIK1","JIqXiFNYIM","KsjRKNxx9V","DLhzMDLhzM","1v5hHKASQ8","0PktIlsQGo","LDk6fiwzGk","D6rByhE1Ql","MK07YjSjS3",
+"OUqFMuZPqg","K4GS8AkKTk","s7MxkpFrrl","RpBQmdpe1v","lweGyYOfrY","VLTy6euZA5","JXljWhe9IA","0PktIprNT6","uJScXUl4a1","blLA9mX2GE",
+"RBhp0IBe8k","aL6AJyluBx","FxX9qRACuj","wiHrZzqH0W","NhXduGSQwj","FnPFBoGu6x","pFrrlW7cTs","NAFuwfcJOy","zbIYYGv3Fq","Cp3mZzmLYD",
+"qUJMdpT8wu","tuDySyvOMI","pT8wuhSSvQ","aDGtSrKDLJ","B3qem2Nslm","UmaEvZzJHW","I7p2aGv3Fq","jeskSnlaBy","2TRI7DLhzM","atef2jSjS3",
+"t59lRVIlwP","7lUXZpT8wu","okgRi5drc6","VNCPddQ586","F6PT2lj07Q","G1RhSs93Ml","jfREupv0i7","y94nwPOUYS","AOgEenlaBy","2hEEUMK07Y",
+"UlU3M1LB1L","dQ586vkCHH","Cfgr39rlg9","BFkb8t59lR","zY1GYn1pmO","v1HlnVBjhz","TXQ0ZlCMxy","0YAGHFxX9q","QnJ1SJRJQB","7lUXZHfyNQ",
+"Yh1hFvkCHH","bgJAzWaim6","i3pyddpe1v","uupzkJKWYR","hE1QlzbIYY","piJSkNhXdu","0ao3lkZANm","Yw2oUFGzgp","JKWYR29QAz","bZLvSBpYhV",
+"5IhmGjiVBP","5ZaEzuQIcz","5Mg9rFwEJz","dmoS7KASQ8","Cp3mZ0Wr5y","W3VFH45cIH","AIYUuzFgtB","2TRI7CK5W7","prNT6JkzUn","5ZaEzpvgjS",
+"uLtKshUTw7","Zv7z05Namm","Pb1paTCgPp","FPfSES2Dfu","zmLYDOxWIH","atef2mz8gx","BbwgAVIlwP","guMb8CIShG","FcWrWfFDrJ","tAOsrgdQsS",
+"aez9yTCgPp","azIWps7Mxk","PYBf4lm0pD","gjUTuiKqhr","9eoRcDG4sT","QClRLEdBKc","5Namm3weIF","blLA9ReKEW","ogLgcaL6AJ","gIYvEPOUYS",
+"0BmCy4QMc9","oVQp6VLTy6","uoStwNcICA","gf8rIzHF1q","Q6LixQClRL","S77LH5Namm","cShY2VerEA","lCMxyIKxdL","G1RhSSmGzv","1v5hHFwEJz",
+"b29RJECMvU","UlU3MlXFOB","v2eC3h1zcH","mz8gxpmeCd","QssNCeuZA5","uZPqgYh1hF","ni2v1kB5nP","a00b5pvgjS","Pb1paF6PT2","HlUbFxXTI4",
+"Ss0ZulViBv","ECMvUGv3Fq","HlUbF5Mg9r","fqypyoQ87r","a00b5h1zcH","5ZaEz1v5hH","MaJQsb29RJ","jS1ajlweGy","QYxC0oQ87r","fLNg8Q6hMC",
+"S2DfuvkCHH","jeskSe6e4z","24ARFPYBf4","i7WMQZuDtD","6AFT0VBjhz","Gv3FqokgRi","GrDg7uTacx","FLsphmz8gx","Waim6m4bxU","GXdoHyluBx",
+"OHaBzqaofN","h1zcHYh1hF","jS1ajKsjRK","Oz8yZkZANm","PYBf4NcICA","5IhmGF6PT2","ogLgcjSjS3","9rlg9GWqqX","ix74rMmsIo","RsQUqDcpWB",
+"Mm8siQbxXc","VerEAMK07Y","8hJdti7WMQ","b29RJsuY4x","TXQ0Zdpe1v","QYxC0UmaEv","uZPqgvOqCE","No0QbwDajX","AIYUueuZA5","Y1mC00PktI",
+"7Ow5Ch1zcH","uAWypGrDg7","7X3uyoQ87r","CqqaD5Drn0","XflUqTCgPp","lViBv9iGoT","7ku1p5VZjS","hE1QliwzGk","ECMvUiB08l","Cfgr3zqH0W",
+"RzaZAECMvU","MGlTFmX2GE","VerEAy94nw","Cfgr3IKxdL","2Yz7EJRJQB","gf8rIguMb8","X6PinQ6hMC","KsjRKDG4sT","24ARFfLNg8","FcWrWCNHmv",
+"WDVWJciuWz","bZLvSF6PT2","0KyfsLbRTH","FGzgpLDk6f","pT8wuWaWsv","lweGyWaWsv","3weIFuZPqg","ZhwG1k85Ae","uTacxY1mC0","GrDg7cmXIX",
+"1v5hHrhl0J","3otm6nFqik","okgRiQworu","oVQp6WaWsv","Dz1R3n8pJ9","WmadAd85a9","JIqXiAkKTk","GWqqXMK07Y","7fKYUEdBKc","24ARFMkgy8",
+"aez9yn8pJ9","ru4UGStlDJ","BCxeCy94nw","FxX9qjfREu","dhSuH29QAz","t98iWm4bxU","7lUXZuZPqg","Uvlv4o8Uyd","v1Hln2ZHdk","NAFuwfmIK1",
+"VerEAMezSW","6q6L9NOHsz","d85a9i3pyd","pv0i7AkKTk","wiHrZ6AFT0","48cHLG1RhS","LbRTHKASQ8","07n1cfLNg8","fLNg82hEEU","ru4UGQClRL",
+"CNHmvBbwgA","brhlQ1LB1L","fcJOyDG4sT","7X3uylpF6W","hYBCKW7cTs","tuDySBCxeC","9GXkXgIYvE","zFgtB48cHL","zFgtBprNT6","RACujVerEA",
+"aDGtSzQt6Q","FhtglbgJAz","EdBKclsQGo","n1pmOU3yw5","45cIHTXQ0Z","wDajXdmoS7","n8pJ9uLtKs","l83Udsx5Gl","M6qcGK20wK","zFgtBM6qcG",
+"WmadAJRJQB","yvOMIfqypy","mz8gxhYBCK","mX2GEzHF1q","VNCPdSWfou","9rlg9MezSW","RxrsmpT8wu","tuDyShi5X7","ksJbyPb1pa","5nmWvh1zcH",
+"Mm8siIBe8k","SWfounnP8o","DcpWBOz8yZ","ksJbyFLsph","2DREsydG8U","kB5nPFVMxo","soy9tSs0Zu","i3pyde6e4z","16lHcdpe1v","J2mQiiB08l",
+"LbRTHAmdQd","k85AeAIYUu","VerEAOz8yZ","okgRiJRJQB","lXFOB7ku1p","ECMvUm4bxU","l83UdciuWz","2DREsF6PT2","1v5hH07n1c","xciqpQssNC",
+"oVQp6K4GS8","QClRLiqv4k","Yf2Ec2ZHdk","o8UydGv3Fq","YjB9tIKxdL","cL0aEtvdkD","iqv4kUl4a1","h1zcHNcICA","atef2AgJHQ","lViBvguMb8",
+"S2DfubgJAz","cL0aEI7p2a","aDGtSsqVrf","Gv3Fq7fsYM","he9IAU3yw5","Yw2oUEdBKc","NOHsz0YAGH","ydG8Uzz4ZU","8RCUA48cHL","t98iWTCgPp",
+"Ul4a1M3zXL","RmDcrMojnP","tlILtJ2mQi","tuDySIjTwP","cQOnvlH1kt","uN6r37ku1p","ZzJHWl83Ud","lViBv7ku1p","Q6LixHRxd8","Mkgy8ni2v1",
+"Vprf2t59lR","l83UdWreyP","RxrsmBGaQY","48cHLHfyNQ","iwzGk5Mg9r","rKDLJVjCZq","l83Udv1Hln","mX2GEhE1Ql","faHirUvlv4","EoToPlViBv",
+"GXdoHni2v1","I7p2a5VZjS","v8yFNCdyBV","sx5GlMmsIo","ix74rO3iyQ","sqVrfuupzk","hi5X7OUYuF","s7MxkdmoS7","RsQUqkB5nP","ThjNntlILt",
+"qUJMd4dEz6","lViBvs7Mxk","EoToPn8pJ9","29QAztAOsr","9GXkXBGaQY","zqH0WStlDJ","lCMxyCdyBV","zY1GYQbxXc","tuDySgtCA5","7hyVvciuWz",
+"1j5L8Z4I1v","FGzgpzbIYY","8hJdtNcICA","gtCA5QnJ1S","NcICAAOgEe","dpe1vUmaEv","oQ87rv1Hln","3weIFjfREu","4QMc9jSjS3","StlDJru4UG",
+"LbRTHt59lR","ZuDtDx3LDe","FcWrWzFgtB","QbxXcnnP8o","dhSuHGWqqX","zHF1qi3pyd","lXFOBYOfrY","7hyVvCqqaD","ECMvUni2v1","yToGW8hJdt",
+"CNHmvvLsmS","4W0TlCp3mZ","yToGWKr8ys","azIWpcShY2","QnJ1SydG8U","RkQkeuoStw","uLtKsFPfSE","wDajXEdBKc","64s8NuN6r3","ulk41TCgPp",
+"t98iWFPfSE","CNHmvaL6AJ","v8yFNdpe1v","cShY2m4bxU","Y1mC0bZLvS","jtn0XhYBCK","7hyVvoVQp6","Uvlv4uPX7G","VNCPdFNYIM","Z4I1v9rlg9",
+"UmaEvv2eC3","atef2zQt6Q","RzaZApmeCd","rz7UtGWqqX","K4GS8ECMvU","aFFssPOUYS","zY1GYWaWsv","yluBxpWiOs","9GXkXAkKTk","5VZjSvOqCE",
+"X6PinQChxs","X6PinF6PT2","FLsphM3zXL","s7Mxk9y4lw","ksJby8xEKz","tvdkD7hyVv","prNT6WMiS3","qUJMdAmdQd","uPX7Gi7WMQ","uTacxfcJOy",
+"x3LDefmIK1","fmIK12ZHdk","IjTwPPYBf4","ogLgcQ6hMC","Waim6K4GS8","TwanotuDyS","tuDySgdQsS","7hyVvdQ586","In3NSRACuj","MezSWI7p2a",
+"gtCA514FLR","580YDP6bcg","gdQsSmX2GE","8RCUA618Di","In3NSvOqCE","0KyfspmeCd","KASQ8wiHrZ","7lUXZqUJMd","580YDVprf2","tlILtAgJHQ",
+"oQ87rprNT6","14FLRMkgy8","POUYSI7p2a","HfyNQh1zcH","JXljWVNCPd","CqqaD2Nslm","ZzJHWuupzk","iB08lB3qem","ru4UGVLTy6","K4GS8OHaBz",
+"9XyT9HRxd8","dpe1vfcJOy","yEfy9s93Ml","CxVEfQWxoT","MmsIoHlUbF","M3zXLCp3mZ","gf8rIRBhp0","iKqhro8Uyd","n8pJ9v2eC3","ZJTXHni2v1",
+"pvgjSaez9y","Q6hMCBpYhV","XflUqLDk6f","aez9yVjCZq","3weIFydG8U","QssNCW3VFH","0PktIHzZT8","AmdQd0BmCy","nFqik9eoRc","2Yz7EHzZT8",
+"RmDcrlweGy","0MR5XprNT6","Twano6q6L9","FLsph5Drn0","FxX9qaL6AJ","7Ow5CXflUq","fcwDaOxWIH","qaofNZv7z0","aez9yhSSvQ","WreyP9rlg9",
+"FnPFBNhXdu","iB08l2DREs","AOgEeC2Irc","ThjNnJRJQB","FLsphzFgtB","fqypym4bxU","v8yFNbrhlQ","DG4sTulk41","8U2nUpAhR1","wDajXY1mC0",
+"tAOsrMmKGJ","oGu6xGXdoH","a00b5LbRTH","lCMxyNAFuw","GXdoH580YD","NhXduJ2mQi","ZzJHWkZANm","gf8rIjSjS3","C2IrcDLhzM","WmadAulk41",
+"mz8gxOUYuF","CNHmv16lHc","Yw2oUbgJAz","guMb8hUTw7","16lHcgtCA5","b29RJjfREu","mz8gxUmaEv","lweGyStlDJ","cL0aEiB08l","KZamH0BmCy",
+"07n1cL7cGc","QssNCHRxd8","9eoRcNOHsz","xXTI4AXpwE","xXTI4IjTwP","rKDLJ1j5L8","2hEEU8U2nU","hSSvQrhl0J","xXTI4IKxdL","SbRYyFPfSE",
+"UlU3MJJs5m","iKqhr7fsYM","RsQUqRmDcr","FcWrWpiJSk","48cHLfcJOy","16lHcpWiOs","Z4I1vpWiOs","QWxoTFcWrW","9y4lws4786","v1HlnnlaBy",
+"hYBCKi7WMQ","ksJbyCxVEf","ydG8UFnPFB","rKDLJv8yFN","GXdoHXyPZN","lkMUA0h1b1","FNYIMX6Pin","FwEJzWreyP","o8Uyd7Ow5C","atef2gf8rI",
+"x3LDeG1RhS","iKqhrNcICA","Kr8ys55rfB","CxVEf5IhmG","2Yz7ERsQUq","QChxslXFOB","cShY2Kr8ys","Z4I1v5ZaEz","S77LHzmLYD","zqH0Wt98iW",
+"uZPqgiKqhr","guMb8MK07Y","9y4lw1v5hH","aez9yEOE1o","O3iyQYOfrY","zz4ZUaL6AJ","RACujPb1pa","iKqhrCdyBV","iB08ltlILt","QworuqQxHP",
+"M6qcG5iGN5","Pb1paDz1R3","W7cTsRBhp0","yToGWSjskQ","QssNCogLgc","aL6AJyToGW","HzZT8fcwDa","atef2qaofN","oQ87rWMiS3","POUYS7fKYU",
+"uN6r3GXdoH","FGzgphSSvQ","2hEEUI7p2a","JKWYRCqqaD","zz4ZUeuZA5","yvOMIFPfSE","K4GS8SbRYy","FcWrWh1zcH","pWiOsAkKTk","uTacxOz8yZ",
+"hi5X7WDVWJ","FwEJz8RCUA","cShY2PYBf4","9XyT9i7WMQ","5nmWvRxrsm","XflUqvLsmS","580YDRACuj","Gv3FqlXFOB","pT8wuVIlwP","CIShG5drc6",
+"LDk6fru4UG","cmXIX0ao3l","7fKYU7Ow5C","n8pJ9FFDui","uQIczru4UG","FGzgpC2Irc","Y1mC0WDVWJ","JIqXi1v5hH","29QAz7fsYM","I7p2as4786",
+"G1RhStjQxs","KsjRKguMb8","D6rByWreyP","vOqCEVerEA","1v5hHjS1aj","d7vjMCqqaD","2ZHdkoQ87r","VNCPdjzUqR","NOHszuLtKs","GrDg7Oz8yZ",
+"9GXkX9eoRc","t59lR55rfB","2Yz7ElH1kt","O3iyQVprf2","uZPqgHRxd8","W3VFHo8Uyd","blLA9lCMxy","tjQxsSbRYy","MmsIomX2GE","o8UydQ6hMC",
+"BbwgATwano","brhlQQYxC0","5IhmG0PktI","pv0i7OxWIH","ni2v1uupzk","gf8rIzmLYD","8TxD70Wr5y","dmoS7B3qem","aez9yAOgEe","M3zXLcL0aE",
+"9GXkXd7vjM","8xEKz9y4lw","I7p2aIBe8k","WaWsvi7WMQ","HP433AXpwE","he9IAhE1Ql","o8UydSs0Zu","O3iyQRzaZA","hi5X7zz4ZU","nnP8oo8Uyd",
+"ZJTXHlXFOB","RACujjiVBP","AmdQdwiHrZ","guMb8Ul4a1","o8Uyd8cVD3","euZA514FLR","Ss0Zu5ZaEz","s47869iGoT","4dEz6rhl0J","8cVD3Yf2Ec",
+"dmoS7X6Pin","IjTwPSWfou","JJs5mpv0i7","zqH0WPYBf4","Fhtglrhl0J","QChxsnFqik","Z4I1vMojnP","vOqCE0h1b1","Q6hMCfqypy","i3pydprNT6",
+"uupzkW3VFH","0ao3llViBv","xciqpfqypy","hYBCK5Drn0","IjTwPlXFOB","0PktIHlUbF","3otm6guMb8","euZA5ix74r","rKDLJpWiOs","s93Mlhe9IA",
+"ru4UGRxrsm","nnP8ouoStw","0MR5XZzJHW","zqH0WDQimp","bgJAzl83Ud","SWfouECMvU","P6bcgnFqik","7X3uyogLgc","0ao3lTwano","No0QbPYBf4",
+"2TRI7RBhp0","8xEKz9eoRc","oGu6x55rfB","M6qcGlH1kt","Cp3mZPYBf4","tuDyStjQxs","k85AeYw2oU","hSSvQaez9y","7fsYMWPmlx","yluBxy94nw",
+"Mm8si0h1b1","0ao3ltl72W","Oz8yZ2Yz7E","pFrrlru4UG","GWqqXuLtKs","Uvlv44W0Tl","IKxdLzbIYY","Nxx9VRpBQm","yvOMI4QMc9","azIWp0PktI",
+"Cp3mZHfyNQ","KZamHHP433","ciuWzcmXIX","MGlTF14FLR","aL6AJd85a9","d85a916lHc","lpF6WPYBf4","zQt6QxXTI4","DG4sTStlDJ","L7cGcRxrsm",
+"K4GS8VjCZq","he9IANAFuw","fmIK1FjHXR","6q6L90ao3l","vkCHHzHF1q","CNHmvBFkb8","7hyVvnlaBy","Gv3Fq5iGN5","618DiCp3mZ","F6PT2QChxs",
+"yToGW9rlg9","tlILtv1Hln","uLtKsMGlTF","nlaByKr8ys","kB5nPkZANm","SWfoulweGy","8FmFHzQt6Q","jiVBPCIShG","prNT6oQ87r","FPfSE9y4lw",
+"GSQwjvOqCE","d85a9POUYS","ciuWzSjskQ","NAFuwQssNC","Yf2EcYh1hF","8xEKzWaWsv","ReKEWjSjS3","BbwgA618Di","ogLgctaOXK","7ku1p0ao3l",
+"EoToPpAhR1","cShY2uAWyp","OHaBzVLTy6","tlILtUvlv4","n1pmO7hyVv","SmGzvfLNg8","NcICAhE1Ql","jeskSkB5nP","7lUXZfmIK1","JKWYRStlDJ",
+"bgJAzuLtKs","KsjRKXflUq","rhl0JFcWrW","pmeCdt98iW","tjQxssx5Gl","piJSkZJTXH","dhSuHTCgPp","4W0TlUvlv4","pmeCdgIYvE","SbRYyt98iW",
+"QChxs45cIH","RsQUqru4UG","tjQxs580YD","d7vjMpWiOs","gf8rIWMiS3","CqqaDPYBf4","sx5GlpT8wu","gjUTuatef2","cmXIX5ZaEz","WDVWJblLA9",
+"ciuWz8U2nU","O3iyQMK07Y","n8pJ9MojnP","D6rByZuDtD","FhtglciuWz","7X3uyv8yFN","t98iWfcJOy","OUqFMNOHsz","2DREsatef2","2DREstvdkD",
+"L7cGcHP433","jSjS3tjQxs","iKqhrFxX9q","9GXkXY1mC0","2TRI7i7WMQ","uvf7AEdBKc","5nmWvGrDg7","HlUbFFnPFB","45cIHzz4ZU","okgRiMmsIo",
+"zY1GY7lUXZ","0PktIuvf7A","ulk41Cfgr3","uQIczQnJ1S","WPmlxn1pmO","DG4sTlweGy","sx5GlzFgtB","dhSuHsqVrf","CK5W7uZPqg","k85AeFwEJz",
+"n1pmOWreyP","yluBxatef2","Z4I1vDcpWB","8TxD73otm6","pT8wuAkKTk","FhtglK4GS8","vLsmSWDVWJ","tvdkDFPfSE","kZANmCIShG","hi5X7ogLgc",
+"IKxdLRkQke","hE1QlGWqqX","mX2GERACuj","K4GS8HfyNQ","zz4ZUS2Dfu","5NammHfyNQ","Ul4a1v2eC3","Y1mC07fKYU","ZUnqtGv3Fq","16lHcFNYIM",
+"v8yFN0PktI","Oz8yZNo0Qb","qaofN5ZaEz","BFkb8W3VFH","MaJQsfLNg8","Cfgr3ZhwG1","aDGtSlweGy","HRxd8jtn0X","45cIHOz8yZ","zbIYYY1mC0",
+"4dEz6wiHrZ","AmdQddQ586","tAOsrWPmlx","i3pydiKqhr","Ta8f6iB08l","WPmlxfcJOy","IKxdL9rlg9","jSjS3AgJHQ","M6qcGuLtKs","v8yFNJXljW",
+"aez9yCIShG","AkKTkCdyBV","M3zXLgf8rI","pmeCdFnPFB","rz7UtlViBv","7hyVvOUqFM","FPfSEK20wK","QworuiB08l","ru4UGMGlTF","DLhzM0BmCy",
+"LewvMs7Mxk","DG4sT8TxD7","Chuy3sx5Gl","8cVD3jzUqR","prNT664s8N","OUqFMjeskS","jSjS3U3yw5","F6PT2MmKGJ","s93Ml5drc6","24ARFfaHir",
+"TCgPpQ6hMC","24ARF9rlg9","s7MxkyvOMI","QnJ1SbgJAz","jtn0XNxx9V","yvOMIB3qem","AIYUuS2Dfu","gdQsSU3yw5","sqVrfazIWp","7ku1pTXQ0Z",
+"okgRiIjTwP","F6PT2zqH0W","jSjS3fqypy","yluBxJJs5m","d85a9K4GS8","v2eC3jfREu","8TxD7aez9y","jeskSFFDui","Gv3Fq8U2nU","C2IrczqH0W",
+"Yf2EcAXpwE","0KyfslViBv","BpYhVydG8U","8RCUAMkgy8","X6PinUvlv4","8U2nUKZamH","QssNCAOgEe","lH1ktd7vjM","s7MxkIRh48","ZuDtDFxX9q",
+"aFFssyEfy9","2DREsHzZT8","In3NSjzUqR","FPfSEAkKTk","aez9yCdyBV","aFFssEoToP","DLhzMB3qem","qQxHPQ6hMC","yofH3lH1kt","WmadAcmXIX",
+"JJs5mbrhlQ","EOE1olm0pD","RsQUqWPmlx","uZPqg2TRI7","7fsYMpvgjS","tuDySyluBx","F6PT2Ss0Zu","blLA9yEfy9","LDk6fKsjRK","5iGN5GrDg7",
+"gjUTu07n1c","Yw2oUy94nw","ZuDtDWPmlx","ciuWzvkCHH","24ARFHP433","Nxx9VRmDcr","gIYvEhSSvQ","QssNCFPfSE","dhSuHNOHsz","lj07QsqVrf",
+"uJScXBFkb8","xReec5Mg9r","QClRLDQimp","nnP8oBbwgA","ru4UGlkMUA","0YAGHwiHrZ","m4bxUb29RJ","gtCA57X3uy","KASQ8Ul4a1","MmKGJ14FLR",
+"blLA9Rxrsm","uPX7G5nmWv","vOqCEIBe8k","dmoS7Y1mC0","MmKGJfFDrJ","uupzkZv7z0","RkQkeMaJQs","uZPqgaDGtS","0ao3lnnP8o","5Mg9rkZANm",
+"TCgPpRkQke","3weIFJXljW","CqqaDfcwDa","vLsmSRzaZA","aL6AJlj07Q","EoToP9GXkX","Cfgr37lUXZ","KASQ848cHL","lpF6W2ZHdk","SWfouVBjhz",
+"CK5W7h1zcH","zz4ZU9XyT9","nlaBy8U2nU","aFFsslpF6W","rKDLJFcWrW","b29RJzQt6Q","oVQp6G1RhS","VerEA2TRI7","IRh48MmsIo","Fhtglatef2",
+"VjCZqiB08l","uZPqgRpBQm","ReKEWmX2GE","euZA5CdyBV","t59lROHaBz","BFkb8ydG8U","ulk417fKYU","MK07YQClRL","XyPZNW7cTs","Y1mC0MmsIo",
+"I7p2a8cVD3","7hyVvRpBQm","taOXKlH1kt","kB5nPJRJQB","GWqqXeuZA5","AmdQdd7vjM","S77LHuoStw","NOHszCp3mZ","TXQ0ZaDGtS","5drc69iGoT",
+"7Ow5CuQIcz","AgJHQCdyBV","o8Uydb29RJ","FwEJzHlUbF","7Ow5Cuvf7A","Fhtglgf8rI","uPX7Gatef2","GWqqX4QMc9","RsQUqAIYUu","I7p2ani2v1",
+"zmLYDRkQke","ZzJHWhE1Ql","hE1QlM3zXL","lsQGol83Ud","6AFT055rfB","nFqiklj07Q","pFrrl24ARF","Vprf2AkKTk","FjHXRUlU3M","P6bcgNhXdu",
+"QssNCcQOnv","8TxD7oQ87r","Fhtglmz8gx","ciuWzWDVWJ","DQimp5Namm","Z4I1v9XyT9","U3yw5MaJQs","ECMvUJkzUn","hSSvQFwEJz","sqVrfGv3Fq",
+"5ZaEzv1Hln","y94nwydG8U","RkQkeix74r","5Mg9r5nmWv","HfyNQFwEJz","Cp3mZpAhR1","ru4UGl83Ud","7Ow5CzHF1q","Pb1pafaHir","vLsmSVBjhz",
+"aFFssQworu","lweGyJ2mQi","euZA5AkKTk","wDajX9XyT9","qQxHP6q6L9","piJSkTa8f6","aL6AJaL6AJ","9rlg9hSSvQ","piJSk5Mg9r","P6bcgTwano",
+"9y4lwMGlTF","ECMvUUl4a1","oVQp6he9IA","G1RhSO3iyQ","cL0aEBpYhV","x3LDePb1pa","djsrvVBjhz","ZuDtD9y4lw","ZuDtDAgJHQ","soy9tlm0pD",
+"KZamHTa8f6","jfREuOUqFM","ksJby1v5hH","8cVD3xciqp","CK5W7pv0i7","lkMUAuLtKs","okgRi5Namm","QnJ1SlViBv","5VZjSOUYuF","CqqaDVprf2",
+"lViBvtvdkD","DLhzMiB08l","uTacxxXTI4","HzZT8cmXIX","lsQGoCNHmv","cQOnvYw2oU","y94nwzz4ZU","fqypyCqqaD","RsQUqMK07Y","EoToP7hyVv",
+"OHaBzyofH3","pvgjSGWqqX","DcpWBNhXdu","L7cGcjSjS3","07n1cydG8U","U3yw5i3pyd","VBjhzsoy9t","SmGzvS77LH","gdQsSMojnP","DLhzMmX2GE",
+"nFqik8RCUA","IKxdLFhtgl","07n1cGWqqX","OUYuFL7cGc","TCgPpn8pJ9","5IhmGe6e4z","iqv4kt59lR","ReKEWJIqXi","uupzkt98iW","3otm60MR5X",
+"64s8Nmz8gx","RmDcroQ87r","fmIK1v1Hln","yToGWi3pyd","iKqhrpWiOs","JIqXi6q6L9","he9IAMGlTF","v8yFNtAOsr","QbxXcwiHrZ","uoStwVIlwP",
+"lj07QqQxHP","aL6AJtl72W","nnP8oMkgy8","o8Uyd1v5hH","t98iWpmeCd","tjQxsfaHir","suY4xdmoS7","iwzGkCNHmv","QYxC0IKxdL","uZPqgOxWIH",
+"jiVBPUvlv4","9rlg9oQ87r","Dz1R3gf8rI","lj07QEoToP","TwanoVprf2","ZzJHW2hEEU","M3zXLb29RJ","NOHszciuWz","iKqhr5IhmG","In3NSni2v1",
+"dpe1vBCxeC","v2eC3oGu6x","uPX7Gv8yFN","GSQwjGv3Fq","WPmlxYjB9t","P6bcgOUqFM","ZhwG1Kr8ys","pv0i724ARF","VLTy6nlaBy","lpF6Wt98iW",
+"euZA5FGzgp","7fKYUsoy9t","aDGtSsuY4x","580YDlweGy","GXdoHfcJOy","blLA9Cp3mZ","RsQUqcQOnv","lj07QYw2oU","BpYhVx3LDe","9y4lwcQOnv",
+"4dEz6s7Mxk","FFDuilweGy","7ku1pD6rBy","MK07YNAFuw","QssNCSWfou","O3iyQECMvU","RzaZAQClRL","BCxeCIBe8k","ZhwG1Cfgr3","Ul4a1HzZT8",
+"YjB9t55rfB","tAOsr7lUXZ","7hyVvCIShG","In3NSQssNC","Z4I1vzz4ZU","YOfrYQ6hMC","jiVBPazIWp","e6e4zQnJ1S","9eoRcwiHrZ","jeskSBFkb8",
+"wiHrZtlILt","pFrrl45cIH","mz8gxC2Irc","CxVEfbrhlQ","aL6AJRxrsm","Yh1hFmz8gx","4dEz6xciqp","GSQwjAOgEe","a00b5n8pJ9","bZLvSpAhR1",
+"5ZaEzpWiOs","GrDg7jfREu","HlUbFNo0Qb","0BmCyEoToP","fcJOyoQ87r","JJs5mM6qcG","KASQ8euZA5","RzaZAVBjhz","MmsIozz4ZU","16lHctl72W",
+"4W0TlHfyNQ","Z4I1vfcJOy","yvOMIuQIcz","QYxC0tl72W","y94nweuZA5","MK07YqUJMd","ZJTXHC2Irc","GrDg7h1zcH","GSQwj5Drn0","tuDySGXdoH",
+"h1zcHlH1kt","5VZjS9y4lw","2Nslm5iGN5","B3qemOUqFM","TCgPpjeskS","ix74rh1zcH","Pb1paFhtgl","azIWpHRxd8","ogLgchi5X7","JJs5mOz8yZ",
+"KZamHBpYhV","Ul4a1CNHmv","ZUnqtjSjS3","aFFssU3yw5","29QAzAXpwE","6q6L9fFDrJ","s7Mxkt98iW","FPfSE9eoRc","5nmWvs4786","uZPqgv1Hln",
+"0KyfsKASQ8","zY1GYMmKGJ","i3pyd2DREs","sx5Glxciqp","K20wK1j5L8","uJScXnlaBy","LewvMjS1aj","ulk417Ow5C","nlaByJRJQB","jS1ajlCMxy",
+"NOHszs93Ml","fcJOyOHaBz","ulk41Z4I1v","dmoS79XyT9","S2Dfub29RJ","jiVBPuZPqg","VLTy6jeskS","Q6hMCdQ586","Chuy3qUJMd","J2mQiru4UG",
+"tuDySWaWsv","CIShGFwEJz","tuDyS1v5hH","BCxeCuZPqg","OUYuFK20wK","0BmCyguMb8","ReKEWTwano","Ta8f6dmoS7","CIShGSs0Zu","yvOMIFwEJz",
+"NAFuwNOHsz","S77LHUlU3M","MK07Ydpe1v","CK5W78cVD3","OUqFMuupzk","7X3uyU3yw5","Yh1hFaFFss","5NammksJby","8hJdtuN6r3","Cfgr3Gv3Fq",
+"2ZHdk2Yz7E","EdBKcrKDLJ","FnPFBjS1aj","yluBxF6PT2","cQOnvTXQ0Z","7lUXZF6PT2","fcwDaAXpwE","VNCPdaL6AJ","gdQsSvOqCE","pv0i7sqVrf",
+"MaJQsfqypy","iB08lOxWIH","suY4xRsQUq","i7WMQRBhp0","jeskSAOgEe","suY4xVerEA","Gv3FqzmLYD","0BmCyiwzGk","oQ87rRBhp0","bgJAzuZPqg",
+"3weIFhSSvQ","Gv3Fq5Drn0","FjHXRtvdkD","qQxHPZv7z0","dpe1vt59lR","ix74rW7cTs","5VZjSP6bcg","8U2nUdpe1v","yofH35IhmG","FLspht98iW",
+"he9IA9GXkX","Zv7z0Ta8f6","No0Qb618Di","RzaZAgjUTu","zY1GYTa8f6","Y1mC00ao3l","dpe1vuupzk","Ss0ZuUvlv4","JKWYRk85Ae","ni2v1ciuWz",
+"7lUXZJRJQB","5Mg9rZzJHW","uTacxRpBQm","AOgEeVIlwP","ZzJHWeuZA5","GWqqXpmeCd","Q6Lix0ao3l","ZhwG1Z4I1v","0YAGHReKEW","NhXduv1Hln",
+"yvOMIPOUYS","AXpwErKDLJ","atef2SWfou","0h1b1FxX9q","aez9yAIYUu","9XyT9StlDJ","zbIYYDcpWB","M3zXLxciqp","he9IAni2v1","W7cTsCqqaD",
+"jtn0XuoStw","ThjNnFLsph","AXpwEiB08l","m4bxUJJs5m","Q6LixB3qem","oQ87roGu6x","hE1QlAmdQd","1LB1Ldpe1v","WreyPCNHmv","Waim6t98iW",
+"gjUTurz7Ut","HzZT82Nslm","GXdoHVLTy6","uLtKsuLtKs","2ZHdk8FmFH","s93MlFFDui","soy9tuupzk","pT8wuXflUq","WmadAtuDyS","M3zXL5nmWv",
+"OHaBzBpYhV","OUqFMs93Ml","YOfrYPYBf4","4QMc95Mg9r","pWiOsKr8ys","K4GS8GSQwj","VNCPdfqypy","tvdkDlkMUA","8FmFHYh1hF","AIYUu9GXkX",
+"jtn0XOUYuF","9eoRczQt6Q","JRJQBJRJQB","5NammJJs5m","fcwDatuDyS","jzUqROUYuF","lViBv8FmFH","djsrvJXljW","Twano8xEKz","Mm8siBpYhV",
+"soy9ttlILt","gf8rIjeskS","AXpwE5ZaEz","XflUqOHaBz","oGu6xZJTXH","RkQkeIKxdL","9y4lwAgJHQ","GSQwjpAhR1","QworuLbRTH","k85AeWmadA",
+"5Mg9rtvdkD","7ku1pRxrsm","sqVrfn8pJ9","qaofNoVQp6","guMb8Yf2Ec","14FLRuupzk","lweGyl83Ud","LewvMlm0pD","uTacxP6bcg","lkMUAgf8rI",
+"zY1GYP6bcg","AmdQdC2Irc","cQOnvQClRL","m4bxUhi5X7","Ta8f6sqVrf","Nxx9VjiVBP","L7cGcJJs5m","RkQke0Wr5y","L7cGcydG8U","64s8NpvgjS",
+"Oz8yZcShY2","QssNC0Wr5y","9GXkXlsQGo","ogLgcTCgPp","JkzUnoVQp6","JIqXicL0aE","LbRTHJJs5m","FFDuiMmKGJ","tjQxszY1GY","BbwgAn8pJ9",
+"s93Ml0Wr5y","uupzkvLsmS","6q6L9K20wK","9XyT9IBe8k","4dEz6KZamH","AOgEeEOE1o","L7cGciKqhr","RBhp0yEfy9","Nxx9VUmaEv","IjTwPcShY2",
+"hYBCKDz1R3","gf8rINcICA","SWfouHzZT8","GrDg7suY4x","IjTwPiKqhr","a00b5uJScX","K20wKjeskS","EoToPRpBQm","5NammZuDtD","ZUnqt0MR5X",
+"Y1mC0v2eC3","S2DfuFGzgp","d85a9CIShG","hE1Ql0Kyfs","kZANmUl4a1","7X3uy2Yz7E","5drc6vkCHH","L7cGcblLA9","5VZjS7fsYM","cShY2No0Qb",
+"5nmWvM3zXL","yToGWfcJOy","Ss0ZuOUYuF","mz8gxMmKGJ","qQxHP2Yz7E","WDVWJMmKGJ","cL0aEQworu","K20wKn1pmO","Q6Lixdjsrv","BbwgAlsQGo",
+"ECMvUrhl0J","cShY20YAGH","rhl0JM3zXL","CK5W7FGzgp","K4GS87Ow5C","1v5hHgf8rI","FGzgpYh1hF","8RCUAQnJ1S","IRh48iB08l","FcWrWMezSW",
+"7lUXZ5IhmG","7fKYUYOfrY","prNT6Yw2oU","8cVD3k85Ae","07n1ciwzGk","55rfBZJTXH","64s8NVNCPd","0h1b1tuDyS","aFFssRzaZA","m4bxUru4UG",
+"FhtglSmGzv","hUTw7v8yFN","gf8rILewvM","RkQkeAgJHQ","NcICA1j5L8","uJScXuQIcz","faHirLewvM","ni2v1CNHmv","m4bxUFNYIM","9GXkXguMb8",
+"uZPqgVIlwP","uoStw5nmWv","d85a9CNHmv","jiVBPaDGtS","ThjNngIYvE","dpe1vS2Dfu","SjskQPYBf4","TCgPptaOXK","2ZHdk45cIH","Kr8yshSSvQ",
+"iKqhrlH1kt","dhSuH1j5L8","s4786Uvlv4","9XyT9uupzk","Yf2EczHF1q","M6qcG1v5hH","Gv3FqzqH0W","AmdQdLewvM","FjHXRdQ586","uvf7ANo0Qb",
+"8TxD78cVD3","RBhp0Pb1pa","qQxHPuoStw","QClRLgf8rI","RmDcrBpYhV","IRh48uAWyp","oGu6xOxWIH","dhSuHaez9y","rz7UtMkgy8","IKxdLBGaQY",
+"OxWIHyluBx","kB5nPLewvM","5nmWv45cIH","lViBvyluBx","i3pydgtCA5","0ao3lCNHmv","OHaBzHzZT8","uTacxpv0i7","ciuWzuLtKs","EoToPnnP8o",
+"EOE1opiJSk","GXdoHGrDg7","QClRLjS1aj","ydG8UIBe8k","WMiS3WreyP","he9IAHRxd8","t98iWGrDg7","7fsYMXyPZN","lViBvHzZT8","QWxoTHP433",
+"9rlg9cShY2","7lUXZxReec","d85a9CxVEf","Chuy3v8yFN","s7Mxky94nw","v1HlnkZANm","UlU3Mb29RJ","QWxoTI7p2a","XflUqNOHsz","aDGtSuoStw",
+"55rfBsx5Gl","tAOsrXyPZN","VjCZqcShY2","iB08lJRJQB","rhl0JlkMUA","LewvMi7WMQ","U3yw5pFrrl","gtCA5zFgtB","fqypydpe1v","AmdQdd85a9",
+"h1zcHciuWz","TwanoQClRL","W3VFHRsQUq","LbRTHciuWz","dpe1vfcwDa","Gv3Fqi3pyd","5iGN55ZaEz","580YDWPmlx","O3iyQAXpwE","o8Uydn1pmO",
+"vkCHH9y4lw","580YDAkKTk","X6PingjUTu","8xEKzqQxHP","HzZT88FmFH","jtn0XS2Dfu","EOE1o3otm6","jfREuuoStw","uvf7AjiVBP","ZhwG1F6PT2",
+"t59lRCIShG","m4bxUdpe1v","QYxC0ru4UG","S77LHW3VFH","Gv3FqFPfSE","GWqqXh1zcH","d85a9hUTw7","5Mg9rF6PT2","0ao3luQIcz","7Ow5CUlU3M",
+"jS1ajfmIK1","xXTI4SjskQ","yvOMIhE1Ql","vOqCEwDajX","DLhzMgf8rI","14FLRbgJAz","yvOMI0h1b1","hSSvQtl72W","hYBCKOUYuF","BbwgA2Nslm",
+"0h1b17ku1p","EoToPuN6r3","GSQwjs4786","2DREsL7cGc","mX2GExReec","RACuj48cHL","In3NSb29RJ","pvgjSJ2mQi","In3NSFFDui","7fKYU7hyVv",
+"NhXduyvOMI","0KyfstuDyS","XyPZNRkQke","QWxoT5Mg9r","zFgtBIRh48","ciuWzGv3Fq","ulk41n1pmO","dmoS7AgJHQ","lXFOBLDk6f","KsjRK9iGoT",
+"O3iyQRkQke","VjCZq9rlg9","guMb8OUqFM","gjUTuQChxs","JIqXiBpYhV","d85a9GWqqX","YjB9tU3yw5","gtCA5AIYUu","DLhzMJKWYR","HP433VBjhz",
+"MezSWk85Ae","OUYuF9y4lw","OUqFM2ZHdk","QClRL24ARF","0Wr5yoGu6x","KZamHZuDtD","gf8rI8TxD7","ThjNnzz4ZU","MezSWOUqFM","MmsIo0ao3l",
+"dhSuH8cVD3","In3NSCxVEf","oVQp6JIqXi","WPmlx2Nslm","7X3uyZhwG1","5Drn0zbIYY","jeskSAmdQd","sqVrfCqqaD","OUqFMSs0Zu","Ta8f6AXpwE",
+"5iGN5fcJOy","RsQUqZJTXH","0Wr5yciuWz","uZPqgFPfSE","rz7UtbZLvS","ru4UGoGu6x","TCgPpfqypy","pvgjS5Namm","BbwgAoGu6x","qaofNuZPqg",
+"FjHXRzz4ZU","fmIK1KsjRK","7fsYMx3LDe","CxVEfYjB9t","tl72WPYBf4","v1HlnAmdQd","yToGWvLsmS","dmoS70BmCy","I7p2awiHrZ","x3LDea00b5",
+"0PktIdmoS7","WDVWJJJs5m","9iGoTGrDg7","9eoRcatef2","wiHrZ5iGN5","pFrrl7ku1p","dmoS7dQ586","JIqXi29QAz","Pb1paiwzGk","wDajXjeskS",
+"DcpWBYw2oU","55rfBYf2Ec","EoToPZUnqt","oVQp6Z4I1v","Pb1paQnJ1S","G1RhSsuY4x","5VZjSAkKTk","BbwgAHlUbF","lCMxyOHaBz","ydG8UTa8f6",
+"FjHXRvOqCE","BbwgAs4786","BbwgAY1mC0","tAOsrKZamH","Z4I1vuupzk","TXQ0ZlpF6W","WPmlx618Di","SjskQMK07Y","CqqaDZ4I1v","HRxd8lCMxy",
+"QssNCWmadA","0Kyfsfqypy","KZamHAkKTk","iKqhrNxx9V","8TxD7lpF6W","Waim6WMiS3","BCxeCRpBQm","cShY2HP433","gdQsSuupzk","Zv7z03weIF",
+"nnP8olweGy","0ao3lVLTy6","kZANmLDk6f","WDVWJKsjRK","2hEEUMmKGJ","zmLYDGXdoH","KASQ8F6PT2","GXdoHzFgtB","OxWIHhSSvQ","8FmFHJIqXi",
+"iwzGk5drc6","a00b5bZLvS","FxX9q8U2nU","WDVWJXflUq","uN6r3FwEJz","d7vjMBCxeC","okgRiix74r","SmGzvqUJMd","5nmWvFNYIM","5Drn0v1Hln",
+"cQOnv2ZHdk","UmaEvlH1kt","RkQkeBFkb8","WPmlxIKxdL","Mm8sibgJAz","zY1GYFwEJz","gdQsS9GXkX","UlU3M0PktI","gdQsSECMvU","lj07QzHF1q",
+"dhSuHLbRTH","mz8gxqQxHP","ZzJHWFGzgp","s4786618Di","t59lRvOqCE","7lUXZDLhzM","jtn0XPYBf4","5IhmGjSjS3","5nmWvulk41","uN6r30YAGH",
+"lm0pDUmaEv","2Yz7ETXQ0Z","tvdkDG1RhS","zbIYYjtn0X","JRJQB8xEKz","uN6r3StlDJ","MmKGJpWiOs","5Drn04QMc9","AIYUuFGzgp","gf8rIh1zcH",
+"pFrrlQbxXc","FNYIMFjHXR","Ta8f6X6Pin","JXljWk85Ae","8hJdt29QAz","fLNg8ix74r","24ARF5ZaEz","1v5hHs4786","DG4sTCK5W7","LewvMU3yw5",
+"CK5W7KZamH","QworuJIqXi","Ss0ZuC2Irc","uJScXprNT6","brhlQLDk6f","lXFOBRzaZA","Qworu8U2nU","ru4UGfcwDa","L7cGcKASQ8","Chuy3pFrrl",
+"FVMxo5VZjS","piJSk55rfB","zFgtB5Namm","In3NSK20wK","Zv7z0VNCPd","POUYS8cVD3","zbIYYoVQp6","uAWypOHaBz","lsQGocmXIX","tjQxsgIYvE",
+"4QMc9P6bcg","sqVrfCp3mZ","jzUqR64s8N","3weIF9y4lw","uQIczJ2mQi","SWfouU3yw5","GrDg7yluBx","pT8wuLbRTH","gIYvE618Di","oQ87rGSQwj",
+"faHirs7Mxk","FwEJzciuWz","BCxeC7X3uy","AmdQdPOUYS","HfyNQgjUTu","uoStw1v5hH","uJScXgf8rI","JIqXirhl0J","qUJMdn8pJ9","rz7UtciuWz",
+"dmoS7qUJMd","WreyPbrhlQ","VNCPdW3VFH","yofH30MR5X","No0QbdhSuH","lpF6WZv7z0","Yh1hFi7WMQ","sqVrfqUJMd","CIShG5nmWv","LDk6fsqVrf",
+"IRh48MK07Y","kB5nPi3pyd","zFgtBYf2Ec","2Yz7ElXFOB","BbwgAlXFOB","s7MxksqVrf","WreyPRkQke","hYBCKFNYIM","gf8rIJIqXi","Cp3mZiwzGk",
+"Q6Lixrz7Ut","HP433tvdkD","djsrv5VZjS","zQt6Qi3pyd","vLsmSlj07Q","yToGWtvdkD","k85Ae9GXkX","rz7UtdhSuH","hUTw7aL6AJ","Zv7z0KsjRK",
+"7X3uy2TRI7","BpYhVFjHXR","DQimp14FLR","ulk41pWiOs","euZA5Vprf2","pmeCdQssNC","uN6r3OUqFM","vkCHH1j5L8","zz4ZUDG4sT","uN6r3jfREu",
+"MK07Y7Ow5C","LbRTHgjUTu","5VZjSx3LDe","Yf2Ec618Di","uTacxHfyNQ","lViBvfqypy","brhlQGXdoH","rhl0JIKxdL","gIYvEZhwG1","QWxoTpmeCd",
+"GrDg7TCgPp","LDk6fZ4I1v","14FLRBFkb8","AXpwEDLhzM","Twano8TxD7","taOXKCNHmv","BFkb8zHF1q","t98iW7X3uy","UmaEvTCgPp","d7vjMWDVWJ",
+"lViBv5Namm","he9IAi3pyd","2Yz7EHRxd8","aez9y3otm6","O3iyQ0h1b1","gIYvEsqVrf","JKWYRWDVWJ","rhl0JhUTw7","dpe1v5Drn0","618DiyluBx",
+"LbRTH14FLR","jzUqR0MR5X","gIYvE6q6L9","Fhtgl8hJdt","DQimpOz8yZ","lpF6WOz8yZ","XyPZN1v5hH","y94nwW3VFH","vOqCE6AFT0","64s8N2TRI7",
+"yofH3GSQwj","0YAGHdpe1v","MGlTFrhl0J","8xEKzuZPqg","uTacxhUTw7","cShY29y4lw","RsQUq9GXkX","Dz1R37ku1p","HlUbFVerEA","vOqCEsqVrf",
+"jiVBPC2Irc","55rfB7hyVv","BFkb8Cp3mZ","9iGoTSWfou","JXljWK4GS8","Mkgy8gtCA5","AIYUu0YAGH","W7cTsRkQke","MmsIoHRxd8","a00b5yvOMI",
+"G1RhS5Mg9r","tjQxs24ARF","vLsmS0YAGH","djsrvsx5Gl","v8yFNKsjRK","x3LDenlaBy","Dz1R3uZPqg","i7WMQBGaQY","k85AeVprf2","pFrrlogLgc",
+"1v5hH0YAGH","JkzUnFLsph","e6e4zXyPZN","FGzgpFjHXR","vLsmS9rlg9","djsrvatef2","QnJ1S0YAGH","WaWsv1v5hH","AIYUuIn3NS","LewvMAXpwE",
+"PYBf4DLhzM","GXdoHnlaBy","zFgtBuupzk","a00b5suY4x","jtn0XVBjhz","KASQ8HzZT8","9iGoTVIlwP","ydG8UEOE1o","C2Ircix74r","DLhzMHP433",
+"PYBf4EOE1o","s93MlStlDJ","h1zcHpvgjS","gIYvECK5W7","4W0TlblLA9","64s8NjiVBP","OUqFM0YAGH","Mkgy8XyPZN","b29RJ6AFT0","RkQkeHzZT8",
+"Zv7z0a00b5","RpBQmKZamH","euZA5vLsmS","OUqFMP6bcg","LewvMZJTXH","SbRYyMm8si","TXQ0ZzFgtB","zbIYYJXljW","MojnPGrDg7","oGu6xru4UG",
+"fqypy8FmFH","ni2v1Ta8f6","618DijS1aj","7hyVvJJs5m","OUYuFSWfou","vkCHH1LB1L","gIYvECp3mZ","hSSvQzFgtB","CNHmvhYBCK","mz8gxChuy3",
+"RkQkeWMiS3","jiVBPdhSuH","ZJTXHM6qcG","9rlg9ReKEW","GrDg7AkKTk","4W0TlOxWIH","e6e4zO3iyQ","Oz8yZksJby","3weIF9eoRc","BbwgAhe9IA",
+"K4GS8FFDui","yluBx7ku1p","CK5W7Yw2oU","EdBKcuJScX","Twano2Yz7E","ix74rAmdQd","8U2nU2Nslm","QbxXcVIlwP","580YD2Nslm","XyPZNcShY2",
+"nnP8oEoToP","C2Irc2Yz7E","9eoRcWreyP","qQxHP14FLR","lViBvRsQUq","VerEACdyBV","0MR5XcmXIX","uPX7Gs93Ml","Mm8siGSQwj","Y1mC0ru4UG",
+"GSQwjW7cTs","Zv7z09eoRc","55rfB0PktI","BFkb807n1c","UlU3MblLA9","Fhtglulk41","1LB1LjiVBP","7hyVvMaJQs","CdyBVWmadA","ydG8Ud85a9",
+"tAOsrlkMUA","RkQketAOsr","JXljWFhtgl","tuDySUlU3M","UlU3MG1RhS","AmdQd4QMc9","AkKTkQ6hMC","0ao3lHlUbF","y94nwfmIK1","zY1GYulk41",
+"MojnPTXQ0Z","xReechE1Ql","AmdQd0Kyfs","SmGzvJ2mQi","ThjNnK4GS8","gtCA5ZzJHW","uvf7AfmIK1","HP433zbIYY","8FmFH29QAz","DQimps7Mxk",
+"WreyPQnJ1S","5drc6qUJMd","DG4sTMojnP","8xEKzpWiOs","he9IAFFDui","lweGyrKDLJ","SbRYyUlU3M","cmXIXmz8gx","5NammXflUq","wDajXOxWIH",
+"h1zcH1j5L8","JkzUnCNHmv","tuDySsqVrf","tl72WW3VFH","5VZjSNxx9V","Ta8f6jS1aj","FPfSEMGlTF","WDVWJfLNg8","8RCUAru4UG","618Dik85Ae",
+"MojnPhe9IA","t98iWMkgy8","QnJ1SRpBQm","No0QbJRJQB","XflUqMezSW","Kr8ysyluBx","pv0i7ksJby","W3VFH7fKYU","t98iWiKqhr","iB08li7WMQ",
+"nFqikJkzUn","X6PinZ4I1v","VIlwPazIWp","IBe8kyofH3","0KyfsKZamH","4dEz6OUqFM","sqVrf7Ow5C","zqH0WKZamH","soy9teuZA5","NhXduWaim6",
+"WaWsvGrDg7","AgJHQRACuj","pT8wuZhwG1","pWiOsuN6r3","hYBCKhi5X7","ThjNniwzGk","uoStw8hJdt","ZuDtDRsQUq","7X3uy7ku1p","cmXIXEdBKc",
+"EoToPwiHrZ","uoStwBpYhV","Y1mC0guMb8","VerEA8FmFH","v2eC37ku1p","KsjRKBCxeC","In3NSGWqqX","ksJbyBbwgA","Uvlv4MmKGJ","tAOsruJScX",
+"iB08luQIcz","45cIHFNYIM","kZANmciuWz","aez9yIKxdL","bZLvSyluBx","0KyfsZuDtD","mX2GEYOfrY","qUJMd9iGoT","lpF6WVLTy6","kB5nP64s8N",
+"GWqqXzQt6Q","a00b5zHF1q","D6rBy7Ow5C","FnPFBWmadA","lweGylsQGo","07n1c9iGoT","Yh1hFjSjS3","55rfBhi5X7","ZzJHW14FLR","gtCA5S77LH",
+"vkCHHMojnP","5ZaEzhUTw7","FjHXRHzZT8","iKqhrYOfrY","FGzgpL7cGc","gdQsS16lHc","euZA5GrDg7","1LB1LzY1GY","3otm6lH1kt","OUYuFiB08l",
+"hi5X7FjHXR","OUYuF7fsYM","48cHLlj07Q","FGzgpFFDui","qQxHPx3LDe","7Ow5CwiHrZ","xXTI4uupzk","Cfgr3FNYIM","P6bcgzQt6Q","jzUqR9iGoT",
+"taOXKWmadA","iKqhrQworu","zz4ZUZzJHW","l83UdHlUbF","GSQwj07n1c","pvgjSrKDLJ","VjCZqyvOMI","JXljWPYBf4","uJScXyofH3","FGzgpo8Uyd",
+"2TRI7jzUqR","v8yFNCxVEf","lH1kt2ZHdk","iB08lDLhzM","rhl0JEdBKc","dmoS7WMiS3","Q6hMCIjTwP","jSjS3AkKTk","OHaBz580YD","d7vjMOHaBz",
+"Yf2Ecv1Hln","JKWYRQYxC0","l83UdDQimp","pvgjSDQimp","jiVBP618Di","azIWpWreyP","Zv7z0LewvM","uPX7GhSSvQ","JRJQBGXdoH","M6qcGMGlTF",
+"6AFT0pvgjS","VLTy6U3yw5","TCgPpKZamH","Cp3mZ1LB1L","yofH3RkQke","0Wr5yTCgPp","Mkgy8atef2","jtn0X8FmFH","EdBKcReKEW","ZUnqtZhwG1",
+"rKDLJDQimp","uZPqgD6rBy","3otm6tjQxs","QworuJ2mQi","wDajXSbRYy","blLA9v8yFN","lj07QRBhp0","lm0pDl83Ud","I7p2a5Mg9r","7fKYUguMb8",
+"DcpWBQ6Lix","OUYuFThjNn","8TxD7M6qcG","ZJTXHQ6hMC","WaWsv5Namm","1v5hH4QMc9","mX2GEhe9IA","dmoS7taOXK","Vprf2FxX9q","hSSvQO3iyQ",
+"CK5W76AFT0","FNYIM0MR5X","oVQp6uvf7A","Yw2oUI7p2a","FNYIMFFDui","45cIHTwano","ECMvUhYBCK","d85a9mz8gx","8FmFHjfREu","mX2GEuAWyp",
+"b29RJU3yw5","ogLgcQbxXc","i7WMQQ6Lix","Ta8f6BbwgA","FNYIMRpBQm","dmoS7azIWp","W7cTsSWfou","2NslmtAOsr","24ARFv8yFN","Q6hMCFNYIM",
+"SWfouhUTw7","0KyfsuN6r3","IRh48v2eC3","FFDuiUl4a1","Dz1R3Chuy3","WmadAwDajX","oGu6x8U2nU","sx5Gl5Mg9r","piJSk24ARF","tjQxsQWxoT",
+"EdBKco8Uyd","2Yz7EqQxHP","RzaZA7fsYM","lj07QBCxeC","VIlwPs7Mxk","07n1cUvlv4","dmoS7prNT6","yofH3OUYuF","qaofNKsjRK","NcICA2ZHdk",
+"KASQ89GXkX","jSjS35iGN5","aFFssTCgPp","fmIK1piJSk","W7cTsfmIK1","8RCUA3otm6","JJs5mjS1aj","iqv4khe9IA","CNHmv5nmWv","lH1ktXyPZN",
+"jfREuoQ87r","CqqaDRmDcr","8cVD3ZhwG1","SjskQUmaEv","zQt6QblLA9","uAWypKsjRK","JKWYR45cIH","BpYhVNo0Qb","pT8wukZANm","hSSvQ1v5hH",
+"xciqpYw2oU","WaWsv55rfB","5iGN5s7Mxk","5IhmG0h1b1","In3NSMaJQs","suY4xMmKGJ","yofH3Qworu","Oz8yZ55rfB","9y4lwCNHmv","Ss0Zu64s8N",
+"kB5nP5IhmG","lViBv7Ow5C","pv0i7v8yFN","Gv3FqYOfrY","jeskSkZANm","8U2nUyToGW","0BmCyY1mC0","0PktIFNYIM","BbwgANcICA","ni2v1xXTI4",
+"x3LDesuY4x","zHF1qFGzgp","HfyNQG1RhS","NAFuw2TRI7","IjTwPBpYhV","2DREsY1mC0","FwEJznlaBy","qaofNni2v1","5iGN5rhl0J","faHir2hEEU",
+"oQ87rtjQxs","oVQp68xEKz","tAOsrokgRi","lweGym4bxU","ydG8Uk85Ae","yluBxbrhlQ","MK07Ygf8rI","n1pmOulk41","4dEz6Q6Lix","8RCUADz1R3",
+"LDk6f580YD","2TRI7NcICA","uZPqgyToGW","Q6LixLewvM","v8yFNNhXdu","G1RhSChuy3","lj07QfaHir","RsQUqAgJHQ","a00b50Wr5y","LbRTH1LB1L",
+"uN6r3Ul4a1","Q6LixW3VFH","Dz1R3EoToP","5ZaEzsqVrf","FPfSEciuWz","FwEJzM3zXL","P6bcgvLsmS","StlDJEOE1o","Uvlv4ZuDtD","uN6r3M3zXL",
+"4W0TlAmdQd","G1RhSuN6r3","lweGyFLsph","GSQwjFLsph","aDGtSBFkb8","lsQGoFGzgp","POUYSnlaBy","5nmWvwiHrZ","JIqXioQ87r","WPmlxxReec",
+"pv0i7lH1kt","pAhR1lH1kt","QbxXcwDajX","sx5Gliqv4k","5Namm9eoRc","QbxXcJIqXi","fLNg8TCgPp","KsjRK2Yz7E","lpF6W3weIF","tAOsrfqypy",
+"n1pmOAkKTk","2DREs8U2nU","dhSuH07n1c","CqqaD0YAGH","KsjRKv1Hln","OxWIHhe9IA","EOE1oJ2mQi","Y1mC0JkzUn","lweGy1j5L8","POUYSpmeCd",
+"qaofNKr8ys","RsQUqVIlwP","Mkgy8Vprf2","kB5nPgdQsS","CdyBVy94nw","cmXIX2ZHdk","gf8rInnP8o","yofH3okgRi","ydG8UcQOnv","iB08lZzJHW",
+"NhXduHlUbF","n8pJ9Mm8si","I7p2aFhtgl","XflUq2ZHdk","Cp3mZYf2Ec","MmKGJIjTwP","MGlTFy94nw","QworuLewvM","soy9t0h1b1","FxX9qI7p2a",
+"uTacxd85a9","8RCUAb29RJ","iKqhrKr8ys","VjCZqNcICA","U3yw5BbwgA","O3iyQyToGW","d85a9fFDrJ","5Mg9rQ6Lix","kB5nPwDajX","U3yw5S77LH",
+"lXFOBQClRL","ulk41KsjRK","oQ87r07n1c","hi5X7D6rBy","dpe1vW7cTs","he9IACIShG","yluBxhUTw7","5IhmGJIqXi","s4786dhSuH","0h1b1XyPZN",
+"cL0aEjfREu","ZuDtDW3VFH","iB08l7fKYU","zFgtBYw2oU","8TxD7faHir","pT8wutaOXK","RxrsmHlUbF","7fKYUAXpwE","GrDg7GrDg7","9GXkXdQ586",
+"Q6LixCfgr3","NOHszVLTy6","hi5X75Mg9r","ciuWzk85Ae","Ss0ZuFLsph","KZamHtjQxs","HlUbFkZANm","s7Mxkaez9y","580YDiB08l","HfyNQlj07Q",
+"7hyVvuupzk","jiVBPhE1Ql","0PktIJKWYR","XflUqThjNn","0PktIdhSuH","lkMUAo8Uyd","AgJHQCp3mZ","QnJ1SB3qem","ZzJHWZzJHW","l83UdPYBf4",
+"i7WMQ9rlg9","NOHszwiHrZ","uN6r3EOE1o","lm0pD5ZaEz","WaWsvF6PT2","HfyNQsx5Gl","i3pydbgJAz","uN6r3s7Mxk","Yw2oU9XyT9","h1zcH0ao3l",
+"ulk41aL6AJ","soy9t55rfB","55rfBdhSuH","fcJOyb29RJ","NhXduEoToP","8RCUAMaJQs","uZPqgRkQke","pvgjSDz1R3","lH1kttl72W","5iGN5CdyBV",
+"t59lRX6Pin","9iGoTQ6Lix","8RCUAfLNg8","kZANm1v5hH","zqH0WydG8U","VBjhzXflUq","cQOnvblLA9","VBjhzFnPFB","RpBQmiB08l","xciqpHfyNQ",
+"nnP8ozFgtB","Vprf2OUqFM","oGu6xsqVrf","2TRI7xReec","7Ow5CpmeCd","3otm6yvOMI","EdBKcmz8gx","Waim6MGlTF","29QAzuJScX","BpYhVXflUq",
+"atef2CK5W7","F6PT2HRxd8","v2eC3P6bcg","8U2nUSbRYy","pv0i7fcwDa","lm0pD5drc6","3weIF29QAz","DcpWB2Yz7E","bZLvSYjB9t","dQ586fLNg8",
+"BGaQYQnJ1S","2NslmdmoS7","yvOMI9y4lw","brhlQWaim6","FcWrWzHF1q","4QMc93otm6","zY1GYuPX7G","RBhp0i3pyd","VjCZqlj07Q","14FLRhUTw7",
+"FjHXRQChxs","sx5GlHzZT8","VerEAVerEA","zQt6QjfREu","IjTwPECMvU","CK5W72Nslm","uN6r3MojnP","tlILtCK5W7","580YDG1RhS","vLsmSWMiS3",
+"fcwDaEdBKc","brhlQk85Ae","B3qemdpe1v","Y1mC0Zv7z0","1v5hHNo0Qb","StlDJo8Uyd","8FmFHRBhp0","MmsIot59lR","5drc6Mm8si","oVQp6zY1GY",
+"SbRYyNAFuw","xReecOUqFM","FnPFBVerEA","Oz8yZ9eoRc","uLtKsvLsmS","MojnP1LB1L","PYBf4uvf7A","5VZjSS2Dfu","QClRLRmDcr","SWfouWreyP",
+"AIYUu7fKYU","vOqCEfaHir","X6Pinhi5X7","FVMxo5drc6","WPmlxhE1Ql","OUqFMlXFOB","BGaQYatef2","S77LHFFDui","5Drn0fFDrJ","JJs5m9y4lw",
+"faHirWreyP","9rlg9QssNC","pWiOsAgJHQ","VIlwPd85a9","FLsphgIYvE","I7p2ahE1Ql","Yw2oUmz8gx","MezSWru4UG","HzZT8Zv7z0","M6qcGlweGy",
+"jfREu0Wr5y","WMiS3C2Irc","fcJOyG1RhS","jeskS0YAGH","uJScXVLTy6","cShY28TxD7","sqVrfReKEW","8RCUAYh1hF","FwEJzOxWIH","EoToPjzUqR",
+"Cfgr3DcpWB","k85AegtCA5","y94nw14FLR","D6rByyluBx","HRxd8gtCA5","Waim6s4786","WreyPyEfy9","64s8N5drc6","Cfgr3lkMUA","NcICAk85Ae",
+"Qworux3LDe","9GXkXRzaZA","x3LDeKZamH","PYBf4OUYuF","4QMc9NcICA","FxX9qzFgtB","dQ586tvdkD","ReKEW8RCUA","jzUqRFcWrW","i3pydBbwgA",
+"yToGWLewvM","Vprf2CIShG","JRJQBHlUbF","OUYuFSmGzv","AIYUuUl4a1","VjCZqv1Hln","5Drn0RzaZA","prNT6M3zXL","IjTwPfmIK1","6q6L9Gv3Fq",
+"9XyT9a00b5","cL0aEblLA9","HP433m4bxU","KZamHNAFuw","PYBf4lkMUA","0KyfsCfgr3","9XyT9faHir","lsQGoiqv4k","WMiS35Drn0","FhtglsuY4x",
+"S77LHWMiS3","tl72W5Mg9r","WaWsvru4UG","M3zXLcShY2","uJScXhi5X7","prNT6GXdoH","uupzkGXdoH","Mkgy8BGaQY","FLsphulk41","FFDuidQ586",
+"QworuuTacx","0YAGHSWfou","uPX7G2DREs","QClRLZv7z0","v2eC35iGN5","VBjhziKqhr","TXQ0ZZv7z0","h1zcHUvlv4","QClRLfcJOy","0PktI0Wr5y",
+"MGlTF7lUXZ","DLhzMCp3mZ","aL6AJJRJQB","45cIH5Drn0","jfREuix74r","9iGoTStlDJ","jS1ajzFgtB","ciuWzO3iyQ","55rfB7Ow5C","5drc6Twano",
+"fmIK1vOqCE","lpF6WVBjhz","AXpwEs4786","Y1mC0hSSvQ","RACuj4QMc9","oGu6x6AFT0","MojnPRsQUq","pAhR1mX2GE","cL0aEuJScX","Waim6guMb8",
+"RkQkei3pyd","Y1mC0uvf7A","fLNg89iGoT","QClRLRACuj","pAhR1SWfou","Ul4a1pmeCd","HRxd8lH1kt","gjUTuprNT6","5drc6atef2","MojnPeuZA5",
+"Ss0ZucL0aE","24ARFxXTI4","UlU3Md7vjM","RkQkeZJTXH","MojnPRmDcr","PYBf4QnJ1S","WMiS3Y1mC0","aFFssuPX7G","d7vjMHRxd8","8xEKzx3LDe",
+"hYBCKRACuj","K20wKyvOMI","0BmCyydG8U","Oz8yZ4W0Tl","S77LHDz1R3","cL0aEVerEA","QbxXcgdQsS","8U2nU9rlg9","Q6LixU3yw5","h1zcHuJScX",
+"gjUTukZANm","Q6Lix2TRI7","QWxoTaDGtS","hSSvQatef2","uJScX16lHc","0YAGHRkQke","CqqaDJIqXi","iwzGkGXdoH","DcpWBAOgEe","WmadANhXdu",
+"fmIK1gtCA5","VBjhzZuDtD","o8UydMkgy8","5drc6faHir","P6bcgY1mC0","CIShGcShY2","AgJHQrz7Ut","Yh1hFWaim6","t59lR5nmWv","NAFuw5iGN5",
+"SWfou5iGN5","K20wKG1RhS","iKqhr3otm6","BpYhVJkzUn","6q6L9i7WMQ","ThjNnsoy9t","RACujlweGy","5VZjSFPfSE","brhlQlXFOB","ZUnqtVNCPd",
+"Cp3mZ1j5L8","v2eC39y4lw","okgRiVNCPd","yEfy9Ul4a1","IRh48CK5W7","ksJbytuDyS","lkMUAm4bxU","VLTy6FLsph","DLhzMEdBKc","pFrrl6AFT0",
+"S2Dfu14FLR","uupzklj07Q","AIYUuksJby","lXFOBRBhp0","ZJTXHOUqFM","5drc6QYxC0","x3LDeOUYuF","v1Hlnsoy9t","EoToP5nmWv","wDajXBFkb8",
+"lH1ktIjTwP","zmLYDvOqCE","55rfBWaWsv","jeskSTwano","jzUqR9eoRc","5IhmGPb1pa","aDGtSOHaBz","tAOsrMGlTF","cQOnv4QMc9","8FmFHl83Ud",
+"faHir9y4lw","1LB1L3weIF","iwzGkI7p2a","uTacxJIqXi","jiVBPChuy3","ZUnqtfqypy","Qworu0MR5X","dpe1vZJTXH","0Kyfsaez9y","wDajX9eoRc",
+"zFgtBaDGtS","LewvMXyPZN","d85a9lweGy","ThjNnMkgy8","k85Aefqypy","EOE1oCxVEf","0BmCyFLsph","OHaBzGSQwj","FLsphSmGzv","VIlwPjtn0X",
+"0ao3lsoy9t","sqVrfy94nw","DQimpKsjRK","piJSksuY4x","jSjS3SjskQ","yluBxpv0i7","O3iyQReKEW","fcJOyy94nw","SjskQJkzUn","JIqXitaOXK",
+"uJScX0YAGH","djsrv7fKYU","bZLvSMaJQs","PYBf4soy9t","jiVBPNcICA","5Mg9rQbxXc","fcwDaMezSW","SWfoulj07Q","uvf7AuAWyp","5nmWv9y4lw",
+"FhtglbrhlQ","I7p2awDajX","hi5X7618Di","i7WMQMGlTF","AmdQd5Mg9r","HzZT8lXFOB","HlUbFrhl0J","CNHmvFxX9q","zz4ZUAOgEe","8TxD7OUYuF",
+"J2mQi24ARF","CIShGdpe1v","jtn0XMkgy8","ix74rK4GS8","pFrrl2Yz7E","16lHcBbwgA","iKqhrPOUYS","lkMUARkQke","ix74rlweGy","v8yFNkZANm",
+"LbRTHzY1GY","BbwgAX6Pin","brhlQuPX7G","ni2v1uTacx","TCgPpxciqp","rhl0JJ2mQi","IjTwPMmKGJ","Yf2EcblLA9","JkzUnUlU3M","JIqXio8Uyd",
+"Q6Lix8RCUA","mX2GE2Nslm","zQt6Q0MR5X","RxrsmTa8f6","B3qemYf2Ec","iqv4kRsQUq","i3pydyEfy9","J2mQiEdBKc","1v5hHwDajX","RkQkedjsrv",
+"MK07YgIYvE","jtn0Xuvf7A","M3zXL7ku1p","OxWIHK20wK","MezSWbrhlQ","pAhR1qUJMd","faHirRpBQm","JXljWvOqCE","D6rByCK5W7","TCgPpJXljW",
+"vkCHHHRxd8","XflUqVBjhz","kB5nPEoToP","Nxx9Vh1zcH","Gv3FqCqqaD","guMb8In3NS","Y1mC0VIlwP","POUYSKZamH","i7WMQiwzGk","W7cTsNo0Qb",
+"uZPqglweGy","D6rByQWxoT","fcwDauupzk","djsrvHfyNQ","fFDrJlj07Q","wDajXRzaZA","pvgjSdjsrv","AkKTkfmIK1","Gv3Fqpv0i7","mz8gxguMb8",
+"GWqqXjeskS","OUqFMpv0i7","qaofNxciqp","0ao3lFjHXR","okgRi7hyVv","B3qemVjCZq","wiHrZeuZA5","BGaQYIBe8k","NOHszMezSW","OxWIHaFFss",
+"xReeckB5nP","LbRTHydG8U","B3qemzQt6Q","580YDyvOMI","FPfSE2ZHdk","U3yw5QbxXc","kB5nPqQxHP","Uvlv47Ow5C","x3LDev2eC3","lViBvQnJ1S",
+"BpYhV9eoRc","RzaZA9XyT9","vOqCEuAWyp","lj07Q8FmFH","GSQwjuPX7G","JKWYRfLNg8","mz8gxt59lR","HfyNQ7ku1p","M3zXLmX2GE","s4786k85Ae",
+"1j5L824ARF","lm0pDQYxC0","lCMxyt98iW","iB08lO3iyQ","uAWypStlDJ","UlU3M2TRI7","lm0pDOHaBz","lweGypmeCd","580YDix74r","5Mg9rjeskS",
+"QClRLzQt6Q","gf8rI5ZaEz","zz4ZU5drc6","qUJMdjeskS","0h1b1lCMxy","DLhzMFwEJz","bZLvSblLA9","O3iyQWreyP","WmadAZzJHW","lsQGogIYvE",
+"ThjNn9rlg9","kZANmNAFuw","Cp3mZQClRL","MGlTF1j5L8","DQimpiKqhr","Gv3FqRxrsm","UlU3MMaJQs","yvOMIuPX7G","vkCHHvOqCE","pWiOszmLYD",
+"JIqXil83Ud","jiVBPi3pyd","DLhzMPYBf4","14FLRtAOsr","FLsph9rlg9","XyPZNmX2GE","okgRi9iGoT","X6PinRpBQm","POUYS7X3uy","DcpWBNAFuw",
+"hUTw72Nslm","VBjhzpAhR1","EoToP7lUXZ","ZzJHWYf2Ec","RBhp0Nxx9V","VjCZqcQOnv","RmDcrGv3Fq","9GXkXCfgr3","iwzGkpWiOs","9eoRc14FLR",
+"HRxd8bZLvS","Ta8f6S77LH","t59lRo8Uyd","5VZjSQ6hMC","8TxD7BCxeC","45cIH7ku1p","9GXkX9XyT9","Ta8f6d85a9","FPfSEMm8si","No0QbQYxC0",
+"FNYIMguMb8","YjB9tMaJQs","s7MxkkB5nP","XyPZNuTacx","lm0pDlsQGo","jtn0XSbRYy","AgJHQyvOMI","CNHmvB3qem","nFqikuPX7G","5VZjS1v5hH",
+"WmadAfcJOy","Y1mC0l83Ud","uLtKsSs0Zu","5Mg9r8RCUA","fFDrJgdQsS","IjTwPDQimp","SmGzvcmXIX","29QAzIjTwP","ECMvUVLTy6","uTacxFGzgp",
+"580YDXflUq","faHirlj07Q","ZuDtD4W0Tl","S77LHfFDrJ","MGlTFv8yFN","DcpWBTXQ0Z","5drc69rlg9","C2IrcJRJQB","lXFOBksJby","M3zXLNOHsz",
+"9GXkXIKxdL","ix74rjSjS3","soy9thYBCK","K20wKgjUTu","BpYhVDz1R3","ZJTXHzbIYY","LbRTHZUnqt","uoStwK4GS8","FPfSE0PktI","zQt6QHRxd8",
+"AgJHQix74r","SmGzv8hJdt","okgRiHlUbF","kZANmbrhlQ","iqv4kCIShG","Fhtglsx5Gl","QnJ1SKsjRK","SmGzviKqhr","FVMxoZ4I1v","VNCPdKASQ8",
+"pFrrlO3iyQ","29QAzK4GS8","DcpWBlj07Q","Chuy3x3LDe","gdQsSTCgPp","AXpwESbRYy","0YAGHbZLvS","Yh1hF8xEKz","lsQGoYf2Ec","OxWIHwDajX",
+"D6rByoGu6x","WaWsvIBe8k","h1zcHHlUbF","UmaEvlXFOB","QbxXcyluBx","ZhwG1Uvlv4","TCgPpEdBKc","aFFss580YD","DQimpcQOnv","lH1kt5IhmG",
+"4dEz6SjskQ","55rfBYw2oU","v8yFN2Yz7E","W3VFHRzaZA","xXTI4lkMUA","BpYhVqQxHP","kZANmzY1GY","P6bcgJkzUn","TXQ0ZRACuj","S2DfuoQ87r",
+"5VZjSUvlv4","5ZaEzuLtKs","zbIYYMojnP","RxrsmW3VFH","O3iyQWPmlx","vLsmSlm0pD","8hJdtjSjS3","WDVWJiB08l","IBe8kHlUbF","ru4UGIKxdL",
+"vkCHHL7cGc","6AFT0KASQ8","DG4sT2DREs","2NslmCIShG","lkMUA4dEz6","i3pyd0PktI","ZhwG1bgJAz","CNHmv14FLR","SmGzv0Wr5y","x3LDe9GXkX",
+"DLhzM1LB1L","In3NSMmKGJ","GXdoH8TxD7","JRJQBZ4I1v","EoToPJKWYR","pvgjSxciqp","ix74rcQOnv","QYxC0JIqXi","n1pmOcL0aE","K20wKWmadA",
+"M6qcGCIShG","piJSkQbxXc","9XyT9EdBKc","WreyPuTacx","Ss0ZufaHir","CK5W71j5L8","wiHrZ2Yz7E","Zv7z0ZzJHW","pvgjSZuDtD","azIWpNxx9V",
+"GWqqXLewvM","BFkb8JkzUn","WPmlx5Drn0","BpYhVo8Uyd","lsQGoYw2oU","1j5L848cHL","7fsYMHP433","pmeCdd85a9","JXljWn8pJ9","KASQ8PYBf4",
+"dmoS7Q6hMC","64s8NK4GS8","suY4xfaHir","16lHcEoToP","lj07QkZANm","9iGoTksJby","8hJdt6q6L9","ksJbyDG4sT","qQxHPCfgr3","SWfouS77LH",
+"QnJ1SHP433","ru4UGL7cGc","yToGWNAFuw","d7vjM7fsYM","QClRLFFDui","d85a92DREs","8TxD7F6PT2","EOE1opWiOs","J2mQil83Ud","WreyPL7cGc",
+"lpF6W0ao3l","OUqFMYf2Ec","uoStws4786","NcICAOUqFM","PYBf4jS1aj","WaWsvlpF6W","OHaBzIKxdL","lH1kt2Nslm","RACujPOUYS","WmadAvOqCE",
+"wiHrZD6rBy","vLsmS0PktI","ECMvUBpYhV","i7WMQTXQ0Z","GXdoHIn3NS","5ZaEz5Mg9r","jiVBPlXFOB","FFDuidjsrv","FxX9qblLA9","Dz1R3VjCZq",
+"8FmFHPOUYS","HzZT8iqv4k","DLhzMM3zXL","uN6r3fLNg8","NOHszulk41","JIqXifFDrJ","48cHLFhtgl","zmLYDFNYIM","7fKYUOz8yZ","AOgEeogLgc",
+"piJSkh1zcH","WreyPDcpWB","L7cGcZv7z0","JJs5mxReec","6AFT0Z4I1v","s478629QAz","zFgtBn1pmO","nFqikru4UG","8FmFHsqVrf","Uvlv4Dz1R3",
+"NhXduuJScX","uvf7As93Ml","Mm8siPb1pa","bgJAz8U2nU","zz4ZUZUnqt","SmGzv5IhmG","pWiOslkMUA","nlaByi7WMQ","HfyNQZv7z0","v1HlnYf2Ec",
+"CIShGW7cTs","45cIHMK07Y","xciqpPOUYS","zbIYYReKEW","tlILtfcwDa","GrDg7Cp3mZ","RmDcrpWiOs","WreyPlH1kt","nFqikfmIK1","U3yw5lkMUA",
+"FnPFBpAhR1","J2mQiMaJQs","fcJOyjeskS","CNHmvzQt6Q","yEfy9sqVrf","No0QbaFFss","S2Dfu5nmWv","MGlTFJRJQB","s93MlNOHsz","ulk41LewvM",
+"sx5GlO3iyQ","yluBxAXpwE","O3iyQzHF1q","KASQ88TxD7","uTacxxReec","uJScXo8Uyd","Q6LixuTacx","v1Hln9y4lw","fLNg85IhmG","pAhR1d85a9",
+"t98iWl83Ud","ZJTXHtlILt","DLhzMGXdoH","jiVBP3weIF","45cIHDQimp","618DiWaim6","2DREsAXpwE","ni2v1b29RJ","VBjhzLbRTH","kB5nPtAOsr",
+"TwanoDLhzM","IKxdLHP433","nFqikcQOnv","7hyVvECMvU","JXljWzz4ZU","X6PinIRh48","hSSvQOUYuF","45cIHfmIK1","lsQGob29RJ","C2Ircru4UG",
+"jtn0Xjtn0X","qQxHPzmLYD","M6qcGhi5X7","Dz1R355rfB","QChxsoQ87r","OHaBzRpBQm","ZUnqtU3yw5","fFDrJ4W0Tl","BCxeC5nmWv","WPmlxJRJQB",
+"dQ586W7cTs","HP433Yh1hF","07n1ci3pyd","ru4UGCK5W7","lm0pDvLsmS","0PktINhXdu","Qworuaez9y","Zv7z05nmWv","hi5X7MaJQs","vkCHH4QMc9",
+"X6PinLDk6f","RkQkeFPfSE","9XyT95Mg9r","9eoRcpiJSk","9eoRc0MR5X","ZUnqtprNT6","5Namm2TRI7","Ta8f6yEfy9","Ul4a1AXpwE","W3VFH580YD",
+"5ZaEzwiHrZ","uoStwbrhlQ","iqv4kRBhp0","t98iWulk41","vOqCEtvdkD","zqH0WBFkb8","Gv3Fqjtn0X","LDk6fS2Dfu","OUqFMCNHmv","CqqaDU3yw5",
+"In3NSuupzk","okgRiLewvM","soy9tQnJ1S","lsQGoy94nw","8hJdtdmoS7","BCxeChi5X7","fmIK1oVQp6","IjTwPyToGW","FGzgpMmKGJ","ydG8UfcJOy",
+"zz4ZUF6PT2","F6PT2QssNC","taOXK9XyT9","lsQGo4W0Tl","rKDLJhe9IA","ZzJHWOUqFM","HlUbF1v5hH","djsrvfqypy","uQIcz7fKYU","7hyVvFwEJz",
+"SjskQ6q6L9","RBhp04dEz6","Mm8siMGlTF","NOHszzHF1q","mz8gxQClRL","BCxeCPb1pa","YOfrYni2v1","LbRTHNo0Qb","8cVD3rhl0J","B3qemdmoS7",
+"gtCA5P6bcg","2Yz7EydG8U","s4786uPX7G","0ao3lWMiS3","jS1ajWreyP","S77LHPOUYS","k85AeIjTwP","AkKTkHzZT8","jSjS3Nxx9V","tl72WFGzgp",
+"qUJMd7hyVv","HzZT8VBjhz","brhlQGrDg7","iB08ln1pmO","W7cTss93Ml","NcICAnFqik","1LB1LJkzUn","4dEz6BCxeC","pT8wud7vjM","wiHrZHlUbF",
+"pFrrll83Ud","JIqXiAIYUu","F6PT2FxX9q","ulk4124ARF","sx5GluZPqg","Y1mC0dQ586","lCMxyatef2","VerEARxrsm","Nxx9VAXpwE","yofH3QWxoT",
+"yluBxcL0aE","qUJMdB3qem","suY4xTCgPp","7ku1ppAhR1","No0QbKASQ8","Ta8f6lpF6W","7hyVvmX2GE","Mkgy8ksJby","yofH3zmLYD","55rfBMmKGJ",
+"pFrrlJJs5m","CqqaD14FLR","UmaEvRsQUq","07n1cjzUqR","K4GS8OxWIH","0Wr5yTXQ0Z","5Mg9rydG8U","IjTwPuPX7G","zz4ZUFVMxo","SWfouhSSvQ",
+"VLTy6uQIcz","U3yw54W0Tl","8FmFHvOqCE","AIYUu5Drn0","gjUTuMmsIo","Dz1R3dpe1v","lCMxyFFDui","mz8gxn8pJ9","QChxstlILt","8U2nUTa8f6",
+"zHF1qjSjS3","ThjNngjUTu","jiVBPDLhzM","QYxC064s8N","9GXkXeuZA5","RxrsmMmsIo","iB08l7X3uy","Kr8ysDz1R3","SWfouKr8ys","1LB1LIRh48",
+"pv0i7WDVWJ","OUYuFRmDcr","pT8wusoy9t","uZPqgiB08l","AXpwEFxX9q","AOgEe9y4lw","dpe1vUvlv4","WPmlxLewvM","48cHLX6Pin","2Yz7EdQ586",
+"gf8rIReKEW","0MR5XThjNn","zHF1qru4UG","rKDLJBGaQY","Mkgy816lHc","0Kyfs6AFT0","3otm6mX2GE","64s8NuoStw","gIYvEkB5nP","xciqpFxX9q",
+"EoToPW3VFH","suY4xpmeCd","ZuDtDaez9y","FjHXRFcWrW","9y4lwo8Uyd","n1pmOwDajX","n8pJ9AmdQd","qQxHP5nmWv","KZamHk85Ae","EdBKci3pyd",
+"yToGWRBhp0","YOfrYt98iW","jS1ajuN6r3","vOqCEzY1GY","lViBvHlUbF","aDGtSBpYhV","CqqaDfFDrJ","UmaEviqv4k","CqqaDJKWYR","pFrrluupzk",
+"GSQwjv2eC3","RzaZAL7cGc","O3iyQmz8gx","JJs5mgtCA5","MmsIoblLA9","VerEA8TxD7","FVMxoJJs5m","CIShGHzZT8","5Drn0FnPFB","MK07YJJs5m",
+"atef2sqVrf","ECMvUcShY2","sqVrfG1RhS","7X3uyWaWsv","VNCPd7Ow5C","Nxx9V4dEz6","Y1mC0FFDui","TwanobZLvS","LbRTHgdQsS","guMb8GSQwj",
+"WMiS3K20wK","mz8gxRACuj","J2mQiQClRL","sx5GlLbRTH","8cVD3VNCPd","zz4ZUpvgjS","h1zcHZUnqt","2hEEUDLhzM","uN6r3lj07Q","Q6Lixv1Hln",
+"i7WMQfaHir","BFkb8F6PT2","Zv7z0EoToP","cL0aEpFrrl","8TxD70YAGH","BCxeC5drc6","uJScXJRJQB","MGlTFYjB9t","uvf7AQssNC","IBe8kciuWz",
+"ksJbyAXpwE","s4786ZuDtD","y94nwzmLYD","8hJdtuAWyp","SjskQ55rfB","yEfy9gjUTu","y94nwGWqqX","CdyBVFLsph","xXTI4HzZT8","0ao3lRkQke",
+"AgJHQ0PktI","VNCPdGWqqX","pv0i75Drn0","0ao3l29QAz","JIqXigjUTu","iKqhrOUYuF","YjB9t5Mg9r","7ku1pChuy3","5drc6jeskS","jtn0XXyPZN",
+"ogLgcBFkb8","xReecX6Pin","guMb88U2nU","zQt6QCp3mZ","yofH3DcpWB","bZLvSydG8U","8xEKzlm0pD","Oz8yZeuZA5","ThjNnpFrrl","MaJQsvLsmS",
+"b29RJLDk6f","oGu6xJIqXi","ksJbytvdkD","No0Qbni2v1","hSSvQPOUYS","Waim6AmdQd","JXljWlXFOB","ydG8UCdyBV","RBhp0J2mQi","zY1GY5drc6",
+"YOfrYjfREu","zHF1qdhSuH","Waim6SbRYy","1j5L80Kyfs","0Wr5yn8pJ9","FVMxonlaBy","lkMUAuQIcz","HP433LbRTH","VLTy67fsYM","VIlwPvOqCE",
+"618DiAOgEe","fcJOy45cIH","Y1mC0Cfgr3","C2IrcAXpwE","2TRI7JXljW","0KyfsNhXdu","ydG8UzbIYY","JRJQBU3yw5","BCxeCNxx9V","StlDJUmaEv",
+"QClRLlm0pD","lsQGo0MR5X","s93MlpAhR1","LewvMBbwgA","t98iWi3pyd","5Drn0QnJ1S","Chuy314FLR","ZhwG1WDVWJ","uvf7AVprf2","cShY20Kyfs",
+"pmeCdUmaEv","AkKTk0Kyfs","oGu6xZzJHW","xXTI40PktI","F6PT2Z4I1v","zFgtBBCxeC","uAWypzY1GY","RpBQm1LB1L","jS1ajFVMxo","tjQxsSWfou",
+"B3qemt59lR","Oz8yZUmaEv","8U2nUlXFOB","CIShGqaofN","hYBCKxReec","9iGoTxciqp","IBe8kVIlwP","Ul4a17Ow5C","5IhmG2Yz7E","F6PT2OHaBz",
+"ReKEWe6e4z","fcwDad7vjM","M3zXLOHaBz","1v5hHatef2","VerEAru4UG","uLtKsdQ586","iqv4km4bxU","dhSuHbZLvS","ciuWzXflUq","FGzgp8U2nU",
+"YjB9tCIShG","Dz1R39XyT9","zmLYDv1Hln","Yw2oUgIYvE","uAWypiB08l","blLA99GXkX","7fsYMmz8gx","5NammNhXdu","KASQ8cShY2","AkKTkNxx9V",
+"BpYhV5ZaEz","s4786iqv4k","Mkgy8PYBf4","B3qemfqypy","Q6hMCFwEJz","zz4ZUHP433","NhXduFxX9q","rz7Ut7hyVv","WmadAQbxXc","uAWypatef2",
+"55rfBpWiOs","ZUnqtCxVEf","fcJOyZJTXH","jfREu2DREs","JIqXibrhlQ","o8Uyd5VZjS","pT8wuhYBCK","618DiGWqqX","8xEKz9GXkX","L7cGcChuy3",
+"zz4ZUlViBv","Chuy3P6bcg","FPfSEZUnqt","k85Ae55rfB","HlUbFlsQGo","MGlTFPb1pa","FjHXRsuY4x","TCgPpFNYIM","OHaBzOUYuF","lH1kts7Mxk",
+"EoToP2Nslm","45cIHgtCA5","cShY245cIH","6q6L9WreyP","EOE1oo8Uyd","cmXIXn1pmO","ECMvUjfREu","d85a9qQxHP","S2DfupT8wu","WmadALewvM",
+"9eoRc0YAGH","29QAz5drc6","kB5nPpmeCd","dmoS7F6PT2","Mkgy8FGzgp","Q6LixyToGW","7fKYUv1Hln","6q6L9SbRYy","fmIK1ksJby","rz7UtNOHsz",
+"9y4lwHzZT8","HlUbFdhSuH","wiHrZblLA9","5NammEdBKc","mX2GENhXdu","n8pJ9uAWyp","LDk6f5Namm","ni2v1prNT6","M3zXLtl72W","ni2v1QWxoT",
+"5IhmGXyPZN","dmoS7VerEA","hi5X7HP433","0BmCyThjNn","QYxC0QbxXc","AOgEe5IhmG","MK07YCdyBV","FcWrWtuDyS","s7MxkHzZT8","O3iyQ4QMc9",
+"55rfBe6e4z","X6Pin6q6L9","DG4sTkZANm","bgJAztlILt","i3pydBpYhV","G1RhSrhl0J","a00b5AkKTk","MezSWHP433","RACuj45cIH","i7WMQWmadA",
+"BGaQYiKqhr","soy9tMGlTF","FwEJzOUYuF","FwEJzuQIcz","MGlTFReKEW","5Drn0ZzJHW","tl72WZ4I1v","gIYvE0h1b1","Y1mC09rlg9","ZuDtDIKxdL",
+"618Diix74r","RmDcrtlILt","9rlg9LewvM","JIqXi7hyVv","JIqXifcwDa","Z4I1va00b5","AXpwE7fsYM","jS1ajmz8gx","6AFT03otm6","e6e4zRxrsm",
+"soy9tt98iW","RsQUqNOHsz","t59lRiB08l","0h1b19XyT9","iwzGkHRxd8","s4786G1RhS","IKxdLIjTwP","t59lRjfREu","iKqhr1v5hH","qQxHPAgJHQ",
+"POUYSwiHrZ","7fsYMJRJQB","SmGzvQbxXc","4dEz6MmKGJ","fmIK11j5L8","MaJQspmeCd","k85AeuQIcz","kZANmNOHsz","J2mQim4bxU","48cHLiKqhr",
+"WmadARkQke","k85Aen8pJ9","i3pydQbxXc","0MR5XIKxdL","zY1GYVprf2","faHirHzZT8","JXljWlweGy","KASQ8SmGzv","1j5L8AkKTk","G1RhSDcpWB",
+"0Wr5yiKqhr","Gv3Fq0YAGH","ZhwG13weIF","8xEKza00b5","48cHLZUnqt","0KyfsZJTXH","zFgtBZhwG1","5nmWvrhl0J","16lHcXflUq","iKqhrFLsph",
+"zz4ZUTCgPp","8TxD7iwzGk","DQimpRACuj","Nxx9Vjtn0X","Y1mC0Ta8f6","YOfrYUmaEv","0BmCyulk41","yvOMIS2Dfu","tAOsrVIlwP","gIYvEHP433",
+"VerEAnFqik","gf8rIKZamH","brhlQQClRL","s4786tuDyS","2Nslm2DREs","8U2nUhE1Ql","8xEKzsx5Gl","AXpwEUl4a1","5ZaEzYw2oU","dhSuH2Nslm",
+"QWxoTAXpwE","0MR5XMezSW","pT8wuJKWYR","2hEEU55rfB","MK07YVprf2","NcICAjS1aj","ReKEWDz1R3","RzaZAyluBx","FNYIMfLNg8","v1Hln9rlg9",
+"HfyNQbrhlQ","uPX7Gd7vjM","7fsYMgdQsS","n1pmOdjsrv","29QAzi3pyd","JkzUnCp3mZ","suY4xQChxs","lH1ktLbRTH","faHirJkzUn","lViBvTCgPp",
+"pvgjStuDyS","4QMc9iwzGk","J2mQikZANm","2TRI7FPfSE","4W0TllsQGo","dmoS7fcJOy","tAOsrGXdoH","lCMxyd7vjM","AXpwESs0Zu","J2mQilCMxy",
+"Yh1hFtvdkD","dpe1vQ6Lix","GXdoHjSjS3","okgRiqUJMd","wDajX5VZjS","yToGWqUJMd","HzZT8WmadA","GXdoHh1zcH","UmaEvAkKTk","RzaZANo0Qb",
+"x3LDepWiOs","5IhmGQworu","fFDrJpFrrl","d7vjM29QAz","8TxD7L7cGc","blLA97X3uy","QssNCl83Ud","AIYUuStlDJ","zQt6QdhSuH","NhXduCK5W7",
+"NOHszb29RJ","4dEz6Oz8yZ","oGu6xVLTy6","okgRiAmdQd","FjHXRWreyP","uupzk8hJdt","Q6LixFPfSE","pWiOsksJby","CdyBV2Nslm","HRxd8hSSvQ",
+"yluBxru4UG","fFDrJjtn0X","Ta8f6BCxeC","Dz1R3YjB9t","J2mQiVNCPd","lweGyJKWYR","gf8rIZhwG1","LDk6fuJScX","b29RJvLsmS","wiHrZPYBf4",
+"8U2nU2hEEU","b29RJVIlwP","K4GS8Vprf2","QYxC0uJScX","VNCPdhi5X7","aL6AJAmdQd","2Yz7Ea00b5","618Dis4786","07n1cMaJQs","ZUnqt7lUXZ",
+"FFDuiVerEA","nnP8oCdyBV","Nxx9VZ4I1v","0Wr5yi3pyd","29QAzHRxd8","1LB1LjSjS3","5VZjSZuDtD","jS1ajxReec","5VZjSm4bxU","FnPFBFwEJz",
+"v1HlnvLsmS","IKxdLcShY2","GWqqXdmoS7","y94nwfaHir","cQOnvfcwDa","Cfgr3ni2v1","O3iyQfLNg8","pmeCdSjskQ","RsQUquPX7G","Cp3mZFNYIM",
+"Q6hMCYjB9t","Mm8siQssNC","M6qcGVIlwP","v1HlnciuWz","Nxx9Vix74r","lCMxyzz4ZU","5nmWvfFDrJ","0ao3lS2Dfu","pWiOsOUYuF","QworuaDGtS",
+"0PktIh1zcH","wiHrZDQimp","JRJQB0YAGH","GrDg7gdQsS","BCxeCX6Pin","BbwgAxXTI4","Mm8siuZPqg","FcWrWWmadA","0h1b1hE1Ql","IKxdLCdyBV",
+"Yf2EcReKEW","0BmCygIYvE","RkQkeDLhzM","55rfBprNT6","lweGypWiOs","Twano5nmWv","1LB1L9eoRc","7fsYMIKxdL","RpBQmxXTI4","HfyNQIjTwP",
+"618Di3weIF","jfREuFhtgl","F6PT2zz4ZU","xciqpSjskQ","fcwDaCqqaD","fLNg8F6PT2","Zv7z0QbxXc","Kr8ysBGaQY","8cVD3vLsmS","YOfrYnFqik",
+"8hJdtjfREu","ECMvUVNCPd","FPfSE14FLR","0BmCyuLtKs","GSQwj0ao3l","cQOnvs7Mxk","uN6r3MmsIo","Pb1paFNYIM","b29RJKZamH","n1pmOk85Ae",
+"Pb1paM3zXL","CqqaDzY1GY","lXFOBTCgPp","9y4lwazIWp","LewvMjiVBP","s7Mxk55rfB","8TxD7FVMxo","brhlQAkKTk","S2Dfurz7Ut","o8UydWmadA",
+"8RCUAy94nw","Mm8siWMiS3","hi5X7I7p2a","n8pJ9mz8gx","mX2GEn1pmO","wiHrZprNT6","B3qemReKEW","s4786Fhtgl","pWiOs07n1c","JXljW9eoRc",
+"In3NSFjHXR","jzUqRhSSvQ","2Yz7ENAFuw","iKqhrYjB9t","FVMxoMK07Y","AXpwE5iGN5","NcICACp3mZ","n1pmO4dEz6","Fhtglni2v1","OHaBzqQxHP",
+"pmeCdprNT6","NhXdu4QMc9","iB08lt59lR","nlaByBFkb8","kZANmOxWIH","9XyT9QWxoT","MmKGJJIqXi","sx5Gli7WMQ","NcICA7lUXZ","YOfrYcQOnv",
+"tlILtdpe1v","Mm8silj07Q","UmaEvEoToP","DcpWB0ao3l","16lHc9GXkX","fFDrJAOgEe","azIWpTa8f6","atef2MezSW","Waim6FLsph","FGzgptAOsr",
+"64s8NtlILt","Oz8yZIjTwP","iB08luupzk","YjB9tzHF1q","wDajX7ku1p","B3qem2ZHdk","rhl0J29QAz","55rfBtlILt","guMb8O3iyQ","tjQxsRsQUq",
+"9y4lwQbxXc","S77LHQ6Lix","FnPFBTa8f6","L7cGc0YAGH","WmadAd7vjM","RBhp0iqv4k","MK07YCp3mZ","sqVrfJIqXi","oQ87rjfREu","2TRI7piJSk",
+"0Wr5yyvOMI","pWiOsFNYIM","FPfSEv2eC3","jtn0XNAFuw","MojnPkB5nP","Q6LixTCgPp","bgJAzRpBQm","SWfouwiHrZ","CNHmv7X3uy","LDk6fReKEW",
+"dmoS75ZaEz","prNT6JJs5m","fLNg8Fhtgl","bZLvSo8Uyd","OUqFMfmIK1","s93MlQWxoT","5ZaEztvdkD","DQimpfFDrJ","QWxoTJRJQB","XflUqgf8rI",
+"8FmFHguMb8","lH1kt48cHL","5Mg9rhSSvQ","5Mg9rd85a9","VNCPdFjHXR","8xEKzhSSvQ","ZJTXHpiJSk","WDVWJgIYvE","uQIczuvf7A","Q6hMCDz1R3",
+"No0Qb9eoRc","ru4UGECMvU","uvf7AAXpwE","SWfouvLsmS","BbwgAGWqqX","uTacxCfgr3","AXpwEjS1aj","atef25IhmG","lkMUAnFqik","x3LDeiwzGk",
+"cQOnvMkgy8","s93Mlt98iW","29QAzGv3Fq","ThjNnMK07Y","JkzUnOxWIH","fLNg8Kr8ys","guMb8zFgtB","5iGN57fsYM","s4786JJs5m","OHaBzn8pJ9",
+"9iGoThYBCK","ZhwG1d7vjM","uN6r35ZaEz","Ss0ZuZ4I1v","v1HlnThjNn","tjQxspmeCd","l83Ud0PktI","AgJHQOHaBz","MaJQsZJTXH","iwzGkRmDcr",
+"pAhR11LB1L","HP433Mm8si","tlILt1v5hH","QssNCBGaQY","e6e4z7Ow5C","DG4sT4QMc9","29QAzCxVEf","BFkb8SmGzv","TCgPpyofH3","IBe8kRsQUq",
+"ru4UGjzUqR","s4786JkzUn","MezSWHRxd8","OxWIHWreyP","e6e4zLDk6f","tuDySIBe8k","JIqXiJRJQB","euZA5FnPFB","Ss0Zut98iW","FLsphYw2oU",
+"yvOMIl83Ud","ru4UGm4bxU","HlUbFru4UG","ydG8UtvdkD","0BmCyFhtgl","2TRI75VZjS","uAWypPb1pa","tjQxsguMb8","uQIczAXpwE","TCgPp0BmCy",
+"i3pyd07n1c","F6PT25Namm","5drc6XflUq","xXTI4s4786","o8UydCfgr3","2Nslmx3LDe","MmsIoGrDg7","soy9tRxrsm","tvdkDNhXdu","d85a90BmCy",
+"zz4ZUdhSuH","QChxsSbRYy","bgJAzt98iW","hUTw70Kyfs","TCgPpvOqCE","ThjNn2Yz7E","uZPqgpv0i7","AmdQd0h1b1","YjB9tCK5W7","SjskQhi5X7",
+"AgJHQxciqp","S2DfublLA9","fqypy29QAz","zz4ZU9eoRc","x3LDeOHaBz","Vprf2QnJ1S","JkzUn5Drn0","JRJQBhSSvQ","pFrrluoStw","StlDJpAhR1",
+"oQ87r0MR5X","BGaQY45cIH","WreyPuZPqg","uN6r3FVMxo","NcICA5Namm","9XyT9x3LDe","aL6AJh1zcH","5VZjS2hEEU","soy9tVBjhz","0BmCyStlDJ",
+"y94nw64s8N","Dz1R3taOXK","IBe8k8cVD3","aez9yfLNg8","tlILt5Mg9r","oGu6xMkgy8","6AFT0B3qem","64s8NJJs5m","kZANm0h1b1","GXdoHaFFss",
+"s7MxkHlUbF","BGaQYFwEJz","tvdkDy94nw","JJs5mlCMxy","he9IAZ4I1v","hYBCKLbRTH","1v5hHgdQsS","fqypyFjHXR","2TRI7Z4I1v","NcICAl83Ud",
+"cmXIXydG8U","v8yFNMGlTF","FxX9qv8yFN","RzaZAzqH0W","hUTw7GrDg7","M3zXLiB08l","SbRYyzFgtB","uAWyp8U2nU","3otm616lHc","FFDuiOxWIH",
+"soy9tSWfou","5NammtjQxs","RzaZA9eoRc","FPfSEStlDJ","YjB9tfqypy","ReKEWOHaBz","64s8NGXdoH","atef2zbIYY","DcpWBRxrsm","vOqCEv2eC3",
+"DcpWBd7vjM","618DilCMxy","QworuQChxs","9GXkXIn3NS","FVMxoCfgr3","HP4331LB1L","v1HlnM3zXL","UmaEvpAhR1","VNCPd55rfB","No0Qbd7vjM",
+"6q6L9Q6Lix","tvdkDaez9y","sqVrf4dEz6","t98iWQChxs","zY1GYOxWIH","euZA5atef2","P6bcg5drc6","0KyfsDcpWB","tjQxsuQIcz","tjQxsrz7Ut",
+"dmoS7YjB9t","Q6Lixfqypy","b29RJMaJQs","MK07YbrhlQ","QChxs5Namm","5iGN5No0Qb","7lUXZ07n1c","FFDuiAkKTk","VLTy6VNCPd","RBhp07hyVv",
+"4W0TlW7cTs","pvgjS1v5hH","ZJTXHKr8ys","IKxdL5Namm","AOgEes4786","WaWsvCdyBV","Q6Lix8U2nU","fFDrJ9GXkX","prNT6Gv3Fq","5nmWvdjsrv",
+"IRh48Gv3Fq","SbRYyLDk6f","5drc6CdyBV","WMiS3IKxdL","uTacxO3iyQ","QnJ1SJXljW","brhlQUvlv4","4dEz6X6Pin","WreyPuN6r3","uJScXNAFuw",
+"6AFT0SjskQ","lH1ktfLNg8","BFkb8S2Dfu","0PktI7fsYM","9y4lwRkQke","9y4lwFPfSE","JIqXi8U2nU","FNYIMQYxC0","VjCZqjtn0X","2DREs8xEKz",
+"HlUbF0PktI","gjUTu5Drn0","GWqqXv1Hln","vOqCEjS1aj","pv0i7djsrv","h1zcHZv7z0","24ARFoGu6x","ZJTXHMmsIo","5Drn0No0Qb","0YAGHRmDcr",
+"wDajXZuDtD","7lUXZ5drc6","RzaZAuZPqg","SWfouSjskQ","RBhp0aez9y","0KyfsCNHmv","CK5W7DQimp","zbIYY0YAGH","gjUTuBFkb8","dQ586taOXK",
+"StlDJ9iGoT","Yf2EcFFDui","guMb8guMb8","rz7UtfcJOy","EoToPFnPFB","Vprf2ReKEW","K20wKDLhzM","gf8rIDG4sT","9eoRcmX2GE","8xEKzkZANm",
+"qQxHPVIlwP","d85a9YjB9t","aez9y5VZjS","wiHrZLbRTH","fLNg8kB5nP","Zv7z0uQIcz","FNYIM64s8N","AOgEebrhlQ","l83UdO3iyQ","qUJMdMmKGJ",
+"MGlTFCfgr3","Dz1R3gdQsS","GXdoHCp3mZ","0Wr5yFFDui","4W0Tl8RCUA","y94nw8TxD7","EOE1ox3LDe","lj07QbZLvS","G1RhSzbIYY","rz7UtYf2Ec",
+"yluBxQssNC","AOgEexReec","FcWrWtaOXK","WmadAZv7z0","Mm8siNxx9V","zmLYDy94nw","JkzUnCxVEf","gIYvE8hJdt","CqqaDZJTXH","FjHXRgtCA5",
+"Cfgr35nmWv","n1pmOn1pmO","RkQkeJkzUn","GSQwji3pyd","MmKGJn1pmO","he9IAulk41","Y1mC0ThjNn","nnP8ojS1aj","8hJdtM3zXL","FxX9qvOqCE",
+"cShY2azIWp","ru4UGJXljW","2NslmzbIYY","8xEKznFqik","v2eC3FVMxo","pv0i7HRxd8","uTacxfLNg8","L7cGc5Drn0","JJs5mt98iW","AmdQdOz8yZ",
+"OxWIHydG8U","4QMc9euZA5","uvf7AnlaBy","VIlwPblLA9","tAOsrfmIK1","gtCA5djsrv","MGlTFKsjRK","wiHrZUlU3M","yvOMIKASQ8","ru4UG618Di",
+"cShY2zmLYD","SjskQi3pyd","BCxeC6q6L9","gdQsSC2Irc","FnPFBjtn0X","O3iyQVNCPd","OxWIHeuZA5","Mkgy85Drn0","1j5L8KASQ8","RBhp0cmXIX",
+"4dEz6jzUqR","5IhmGNo0Qb","0ao3ldhSuH","M6qcG2Yz7E","rKDLJIKxdL","FPfSE5Drn0","M3zXLzqH0W","jzUqRjS1aj","Zv7z0zqH0W","Rxrsm6q6L9",
+"F6PT2hYBCK","EOE1oWDVWJ","fcJOyJIqXi","2DREsy94nw","BFkb8hUTw7","Cfgr3AkKTk","hE1QllpF6W","iKqhrQbxXc","8xEKzJIqXi","TCgPp1j5L8",
+"RpBQmrKDLJ","brhlQIKxdL","LewvMFPfSE","0KyfsqUJMd","wiHrZDz1R3","CxVEfRACuj","KZamHt98iW","AgJHQeuZA5","CdyBVAXpwE","X6PinFjHXR",
+"VLTy67ku1p","v2eC3DLhzM","QbxXcVjCZq","pvgjSydG8U","FPfSEpv0i7","HfyNQfaHir","HRxd8blLA9","hSSvQJ2mQi","RkQkeOUqFM","JRJQBhe9IA",
+"UmaEv9rlg9","2DREsl83Ud","qQxHPD6rBy","MaJQsOz8yZ","QYxC0h1zcH","ZJTXHThjNn","ZUnqtPb1pa","ix74rKZamH","suY4x2TRI7","jtn0XWmadA",
+"SWfouyvOMI","Uvlv43weIF","FcWrW8FmFH","bgJAzStlDJ","HP433dmoS7","5ZaEzqaofN","2TRI7cmXIX","DG4sTh1zcH","Cfgr3iwzGk","iKqhrIKxdL",
+"lsQGofqypy","7fsYMn8pJ9","d85a9jfREu","n1pmOPYBf4","KZamH7lUXZ","7fKYUe6e4z","QYxC05Mg9r","7Ow5CYjB9t","uZPqgL7cGc","nnP8oLDk6f",
+"0MR5XDz1R3","DG4sTlH1kt","0ao3l8xEKz","wiHrZRsQUq","QYxC0wDajX","ThjNn2TRI7","64s8NVIlwP","fLNg8jfREu","HfyNQ6q6L9","9GXkXjeskS",
+"zFgtBZJTXH","hUTw7ogLgc","lViBvGv3Fq","a00b5y94nw","X6PinqQxHP","b29RJi3pyd","zFgtBzz4ZU","lsQGoRkQke","5IhmGQWxoT","MaJQsFLsph",
+"o8Uyd6AFT0","jtn0XBCxeC","ZhwG1B3qem","BFkb8CdyBV","FFDuiRpBQm","VBjhzaL6AJ","SmGzvWmadA","uvf7AWMiS3","Cfgr3ReKEW","0PktI0ao3l",
+"8hJdtatef2","d7vjMHlUbF","FwEJzCp3mZ","nlaByL7cGc","AOgEeBCxeC","QClRLG1RhS","s47862Yz7E","d85a9Dz1R3","B3qemyEfy9","64s8Nzz4ZU",
+"M6qcGMojnP","a00b5CIShG","24ARFUvlv4","Nxx9VRsQUq","qaofNiwzGk","gIYvEQssNC","5drc6aez9y","Dz1R3GXdoH","jS1ajFwEJz","BCxeCFPfSE",
+"okgRiCK5W7","In3NSQClRL","2NslmDz1R3","e6e4z24ARF","nnP8opv0i7","dhSuHD6rBy","Z4I1v5drc6","fcJOyuJScX","1j5L8qQxHP","aez9yS77LH",
+"wiHrZuZPqg","OUqFM4QMc9","ZJTXHFNYIM","cL0aEYh1hF","lkMUA8RCUA","VerEAb29RJ","2NslmmX2GE","HP433Yw2oU","14FLRulk41","IKxdLpiJSk",
+"14FLRC2Irc","fFDrJxciqp","DG4sTvLsmS","b29RJDcpWB","ZuDtDprNT6","SbRYyQworu","pv0i7NcICA","lH1ktxReec","VLTy6yofH3","AgJHQRBhp0",
+"s4786C2Irc","0YAGHuoStw","07n1czmLYD","aL6AJ5Drn0","lCMxyYjB9t","UmaEvpmeCd","QChxsWmadA","0Wr5yFNYIM","LDk6fQworu","CIShGQnJ1S",
+"jS1ajJKWYR","7fsYMRkQke","MmKGJVNCPd","VerEA9eoRc","8xEKzBGaQY","Uvlv4yEfy9","EdBKcpFrrl","K4GS8AgJHQ","d7vjMHzZT8","TCgPpiwzGk",
+"Pb1paQWxoT","U3yw5vOqCE","mX2GEKsjRK","8FmFHcQOnv","aFFssK20wK","6q6L9i3pyd","uLtKsLewvM","07n1cOz8yZ","tAOsrjzUqR","QChxspFrrl",
+"aez9ya00b5","xReecRxrsm","Yw2oUpiJSk","StlDJpv0i7","TwanoBpYhV","KsjRKs7Mxk","pWiOsNhXdu","24ARFMmsIo","s7MxkPOUYS","atef2GXdoH",
+"cQOnvVprf2","tl72WDQimp","lpF6WBGaQY","9XyT9KZamH","ZhwG1MmsIo","LbRTHJKWYR","Cp3mZl83Ud","45cIHCfgr3","t98iWYh1hF","Cp3mZX6Pin",
+"WaWsvk85Ae","xReecqaofN","MK07YHlUbF","KsjRKQYxC0","HRxd8nFqik","ZuDtDnnP8o","uAWypDG4sT","dhSuHpiJSk","K20wKCxVEf","v8yFNqUJMd",
+"wiHrZe6e4z","cQOnvVNCPd","FxX9qpmeCd","FNYIMY1mC0","J2mQiGXdoH","MaJQsUmaEv","QWxoTNAFuw","QYxC0hYBCK","SjskQHRxd8","7fKYUM6qcG",
+"2hEEUoGu6x","QssNCOHaBz","bZLvSFjHXR","1v5hHtjQxs","aDGtSb29RJ","D6rByk85Ae","gIYvEMezSW","X6PinAXpwE","24ARFRkQke","SbRYyNOHsz",
+"CIShGzHF1q","VBjhzWDVWJ","xReec14FLR","CIShGJIqXi","JIqXiTa8f6","ZuDtDjzUqR","cShY2DQimp","l83UdQYxC0","HP433KASQ8","Mm8siB3qem",
+"5Mg9razIWp","ZuDtDJXljW","7Ow5CjfREu","TXQ0ZZhwG1","QssNCW7cTs","TwanooGu6x","djsrvTCgPp","DcpWB7fsYM","Gv3FqSmGzv","0h1b1okgRi",
+"cL0aEX6Pin","gdQsSFLsph","RACujyluBx","4QMc9ZzJHW","VNCPdyvOMI","0BmCyECMvU","Gv3FqO3iyQ","nlaByNcICA","QChxsn8pJ9","Yh1hFzz4ZU",
+"P6bcgC2Irc","x3LDe29QAz","Cfgr35drc6","Q6LixblLA9","xXTI47ku1p","d85a9P6bcg","CqqaDdmoS7","Chuy30PktI","t98iWVerEA","8cVD364s8N",
+"pFrrlRACuj","1LB1LAOgEe","hi5X7S77LH","uoStwFVMxo","fLNg81v5hH","JRJQBX6Pin","RACujB3qem","MaJQsYOfrY","RmDcrKsjRK","JXljWwDajX",
+"hYBCK580YD","gjUTulXFOB","MK07Y45cIH","7fKYUn8pJ9","zqH0Wjtn0X","pv0i7Zv7z0","cShY20PktI","Yf2EcP6bcg","HlUbF1LB1L","b29RJ9y4lw",
+"pAhR1Yf2Ec","gjUTujeskS","EoToPk85Ae","qaofNTCgPp","Ta8f6Dz1R3","6q6L95VZjS","oVQp6yluBx","GXdoHhSSvQ","2hEEUCp3mZ","YjB9tBbwgA",
+"0KyfsAkKTk","7lUXZdhSuH","7hyVvJRJQB","zQt6Qt59lR","8cVD3aez9y","bgJAzCNHmv","v2eC38hJdt","CIShGAXpwE","IBe8kokgRi","h1zcHeuZA5",
+"tvdkDEoToP","GrDg7Z4I1v","7hyVvm4bxU","zQt6Qs7Mxk","yvOMIdmoS7","AXpwEoGu6x","OxWIHStlDJ","BpYhVhUTw7","blLA9mz8gx","8U2nUbgJAz",
+"9y4lwFVMxo","hE1QlKr8ys","L7cGcAgJHQ","MmKGJs7Mxk","nlaByatef2","6AFT0cL0aE","cQOnvuAWyp","FwEJzrKDLJ","RmDcrazIWp","D6rBy45cIH",
+"jS1ajHzZT8","4dEz6IjTwP","24ARFYw2oU","VLTy6hYBCK","OUYuF9eoRc","uJScXqQxHP","hYBCKRpBQm","WaWsvWaWsv","ix74rSjskQ","MGlTFatef2",
+"yToGWZhwG1","CNHmvCIShG","l83UdCK5W7","0KyfsWaim6","oQ87rlsQGo","FwEJzzz4ZU","FnPFBS2Dfu","gdQsSjiVBP","IjTwPdpe1v","d7vjMh1zcH",
+"2DREspAhR1","uN6r3GrDg7","dQ586a00b5","VBjhz3otm6","CIShGOxWIH","euZA5WaWsv","1j5L814FLR","7X3uyJKWYR","LbRTHuoStw","0MR5Xmz8gx",
+"QnJ1SCfgr3","qQxHPguMb8","OxWIHlpF6W","gIYvEWPmlx","nnP8o7X3uy","RACujIBe8k","4QMc9POUYS","v1HlnpvgjS","Mm8siXyPZN","okgRiv8yFN",
+"LewvMKr8ys","POUYSmz8gx","lXFOBQWxoT","DLhzM7ku1p","ReKEW55rfB","5ZaEzgtCA5","XflUq24ARF","aFFsss93Ml","FVMxoIn3NS","qaofNfmIK1",
+"NhXduAmdQd","sx5Gllm0pD","VjCZqKZamH","dhSuHFcWrW","ZUnqtb29RJ","14FLRBbwgA","07n1cfcJOy","pv0i7h1zcH","piJSkOUYuF","BpYhVVjCZq",
+"tvdkDlViBv","Pb1pacL0aE","s7MxkZ4I1v","7hyVvzY1GY","RsQUqStlDJ","jiVBPokgRi","AIYUuhe9IA","ZUnqtpvgjS","BFkb8ZJTXH","LewvMzHF1q",
+"QssNCLewvM","QChxs55rfB","bZLvSfqypy","i3pydsoy9t","pWiOsSbRYy","48cHL07n1c","dQ586oVQp6","VBjhzF6PT2","GSQwjguMb8","lpF6WPb1pa",
+"dmoS7k85Ae","h1zcHd85a9","FnPFBKr8ys","Yw2oUKZamH","n8pJ9soy9t","Q6hMCv1Hln","zbIYYgtCA5","d7vjMGXdoH","ECMvUO3iyQ","zbIYYKASQ8",
+"9iGoTy94nw","48cHLMojnP","fLNg8zqH0W","zHF1qMGlTF","d85a9nnP8o","M6qcGQnJ1S","xciqpNcICA","Kr8ysKr8ys","8hJdtMojnP","OUYuF7hyVv",
+"sqVrfjfREu","cQOnvcQOnv","rKDLJEoToP","14FLRvLsmS","uZPqgxReec","ogLgcrz7Ut","16lHclpF6W","2TRI7wiHrZ","uQIczb29RJ","8TxD7FNYIM",
+"Ss0ZulpF6W","tuDySfqypy","nlaByh1zcH","1LB1L8cVD3","QChxsMK07Y","tAOsrYh1hF","VNCPdMGlTF","In3NSIBe8k","D6rByNOHsz","DLhzMdQ586",
+"55rfBZUnqt","8hJdtAkKTk","yvOMIAmdQd","azIWpIBe8k","Yf2EcJXljW","dhSuHCNHmv","lweGylH1kt","azIWp2ZHdk","wDajXokgRi","POUYSulk41",
+"UlU3MBCxeC","ulk41JKWYR","tAOsro8Uyd","CIShGUlU3M","aFFss24ARF","24ARFguMb8","MezSWTXQ0Z","xReech1zcH","1LB1LFwEJz","b29RJWPmlx",
+"7X3uyPYBf4","GWqqXkZANm","NAFuw8RCUA","GWqqXAgJHQ","iB08lK4GS8","UmaEvTa8f6","GWqqXAXpwE","ulk418FmFH","7ku1prz7Ut","jfREuazIWp",
+"S77LHCdyBV","gjUTuwiHrZ","O3iyQVIlwP","tjQxsvOqCE","lCMxyAgJHQ","3otm69XyT9","ZhwG1t59lR","lsQGoVerEA","fcwDaGXdoH","NOHsz29QAz",
+"taOXKJ2mQi","lm0pDdpe1v","djsrv9eoRc","t59lRQYxC0","gtCA5Oz8yZ","jzUqRtaOXK","zQt6QlViBv","S77LH64s8N","MaJQsLDk6f","ECMvUMmsIo",
+"BCxeC9XyT9","64s8NKr8ys","S2DfuazIWp","NhXduDcpWB","t98iW6q6L9","lkMUASbRYy","QChxsVerEA","UlU3M9XyT9","8TxD7i3pyd","L7cGcHRxd8",
+"prNT6uvf7A","d85a9nlaBy","FhtglGv3Fq","D6rByFxX9q","vLsmSFwEJz","uTacxBGaQY","K20wKt59lR","24ARFWMiS3","gIYvE5IhmG","CIShGFNYIM",
+"lsQGoChuy3","e6e4zAIYUu","2Nslms93Ml","azIWpIRh48","2TRI7dmoS7","F6PT2FwEJz","djsrvUmaEv","3weIFIRh48","FxX9qqaofN","EOE1oFNYIM",
+"6q6L9AXpwE","HzZT8JKWYR","0ao3lokgRi","QYxC0nnP8o","rhl0JYh1hF","zmLYDC2Irc","piJSk14FLR","DcpWBW7cTs","ZuDtDIBe8k","VNCPduAWyp",
+"gtCA50BmCy","y94nw3weIF","CxVEfZ4I1v","EdBKc4W0Tl","xciqpXyPZN","dpe1vKASQ8","DQimpGWqqX","WreyP64s8N","RkQkezz4ZU","uvf7AQWxoT",
+"qUJMd0MR5X","CqqaDRxrsm","zHF1qPYBf4","0PktIhE1Ql","XflUqiqv4k","lpF6WReKEW","pmeCd0BmCy","b29RJDQimp","2DREsv1Hln","OUqFMJkzUn",
+"POUYS8TxD7","QYxC0FLsph","fqypy3otm6","faHirpWiOs","StlDJBGaQY","XyPZNfcwDa","nnP8ob29RJ","gdQsS5Namm","vOqCEvkCHH","t98iWnlaBy",
+"uLtKsEoToP","ThjNnZ4I1v","JRJQBFGzgp","7X3uyOHaBz","AkKTkYw2oU","RkQke9eoRc","pFrrlBCxeC","BpYhVni2v1","55rfBRACuj","blLA9brhlQ",
+"WmadA5Namm","d85a9BpYhV","GXdoHhE1Ql","VLTy6Waim6","C2IrcuN6r3","uupzkksJby","UmaEvx3LDe","QbxXcGv3Fq","HRxd8yToGW","M3zXL2TRI7",
+"IBe8k0BmCy","euZA5YOfrY","0h1b1l83Ud","Dz1R3jiVBP","IjTwPlj07Q","v1Hlnv2eC3","zqH0WqaofN","Mm8si8TxD7","tvdkDqUJMd","1LB1Lpv0i7",
+"lXFOBs7Mxk","s4786FwEJz","4W0TlkZANm","7Ow5CFPfSE","wiHrZlm0pD","IjTwPHlUbF","qQxHPjtn0X","hi5X7ThjNn","RpBQmjfREu","hUTw7Z4I1v",
+"hi5X7uQIcz","s47860h1b1","8FmFHWmadA","uQIczCp3mZ","ru4UG5ZaEz","RmDcrix74r","uTacxGv3Fq","lXFOBWaim6","45cIHHRxd8","gtCA5ydG8U",
+"VIlwPoQ87r","TCgPpguMb8","mX2GEDLhzM","B3qemCK5W7","Oz8yZChuy3","a00b5SmGzv","ZuDtD1LB1L","Ul4a1MmsIo","Ta8f6Ss0Zu","Mkgy8JRJQB",
+"ReKEWChuy3","fmIK1C2Irc","uZPqgUmaEv","QChxsAOgEe","D6rByIn3NS","Rxrsm2Yz7E","B3qemblLA9","K20wKGXdoH","7fsYM9iGoT","djsrvyEfy9",
+"9eoRc0h1b1","EdBKcd85a9","SWfouBGaQY","ReKEWzqH0W","mX2GEzz4ZU","h1zcH9GXkX","uPX7GQ6Lix","uQIczs93Ml","WDVWJTXQ0Z","48cHLjS1aj",
+"ulk41uZPqg","HRxd816lHc","i3pydrz7Ut","7lUXZcQOnv","uoStwMK07Y","CK5W76q6L9","t59lRksJby","VBjhzcL0aE","pmeCdOxWIH","zFgtBiwzGk",
+"FnPFBd7vjM","tAOsr6q6L9","2ZHdkOUqFM","8xEKzQWxoT","MGlTF6AFT0","8hJdtMm8si","YOfrYOxWIH","9iGoT0MR5X","dpe1vzQt6Q","tvdkD7fKYU",
+"MaJQsfaHir","tvdkDfqypy","uJScXxciqp","a00b5x3LDe","t98iWuvf7A","k85Aes4786","RmDcrjSjS3","7fsYMUlU3M","0BmCyaez9y","Yh1hFdmoS7",
+"Mkgy8iqv4k","JJs5mEoToP","zQt6QW7cTs","taOXKFNYIM","vLsmSQ6Lix","8RCUAv2eC3","WmadApFrrl","YjB9tFVMxo","azIWpGv3Fq","m4bxUm4bxU",
+"EoToP8RCUA","ReKEW45cIH","OUqFMWMiS3","WreyPTCgPp","8cVD35Namm","ulk41J2mQi","JkzUnhYBCK","uLtKsHzZT8","t98iWVIlwP","gjUTuaFFss",
+"e6e4zoQ87r","7fsYMAmdQd","AIYUupmeCd","nnP8oNAFuw","5NammhUTw7","7fKYU2Yz7E","taOXK2Nslm","14FLRWDVWJ","aDGtSJXljW","9rlg99GXkX",
+"GXdoHMojnP","oGu6xzFgtB","lkMUA3otm6","lViBviKqhr","Cp3mZfLNg8","L7cGc8hJdt","HP433VjCZq","fqypycShY2","Mkgy8IBe8k","KsjRKWaim6",
+"nnP8oUlU3M","uPX7GCdyBV","cmXIXG1RhS","UlU3Mpv0i7","NOHszJXljW","b29RJqaofN","xXTI4Ul4a1","dQ586t59lR","2ZHdkcL0aE","aez9yS2Dfu",
+"jiVBPCqqaD","0YAGH9iGoT","y94nwStlDJ","F6PT2gjUTu","2ZHdkyEfy9","gdQsSiqv4k","pFrrlS2Dfu","SbRYyuupzk","l83UdNo0Qb","n8pJ9VNCPd",
+"wiHrZ0PktI","t98iWd7vjM","7fKYUJ2mQi","BFkb85ZaEz","gdQsShUTw7","D6rByyEfy9","jiVBPOUqFM","Vprf25iGN5","iB08lYw2oU","FGzgpVBjhz",
+"fcJOyAOgEe","0PktIv8yFN","NcICAjeskS","xciqpKr8ys","tjQxsJJs5m","v8yFNfmIK1","8hJdtVBjhz","GXdoHCIShG","MojnPblLA9","OUqFMWaim6",
+"Cp3mZ2hEEU","EOE1o5ZaEz","h1zcHL7cGc","gf8rI9y4lw","5Drn0WDVWJ","lCMxyl83Ud","zz4ZUChuy3","14FLRDG4sT","X6PinprNT6","8cVD3uupzk",
+"WmadAx3LDe","zQt6QZuDtD","ZhwG1CIShG","VerEAFFDui","8RCUA0h1b1","ZhwG1DLhzM","9y4lw4dEz6","atef2Yw2oU","WMiS3v8yFN","suY4xY1mC0",
+"EoToPfcwDa","v8yFNgf8rI","kZANmM3zXL","QChxs7fsYM","uQIczi7WMQ","blLA9hSSvQ","3weIFtl72W","n1pmOuupzk","GXdoHFNYIM","AOgEeqaofN",
+"0h1b1uLtKs","Vprf2SmGzv","vLsmSYOfrY","MojnPHP433","7lUXZRkQke","4W0TlAkKTk","Cfgr30Wr5y","lViBvAgJHQ","In3NSRxrsm","yluBxVNCPd",
+"KASQ8HlUbF","QssNC7ku1p","6AFT0n1pmO","Ta8f60BmCy","jSjS3zY1GY","HzZT8YOfrY","dpe1vJXljW","BbwgAFhtgl","iqv4kWaWsv","fcwDa5Namm",
+"NAFuwOUqFM","9XyT9gtCA5","SmGzvt98iW","ZhwG1hE1Ql","ulk41hi5X7","ZUnqt0Kyfs","tjQxstlILt","RkQkelViBv","S77LHLDk6f","Dz1R38xEKz",
+"tlILtni2v1","jS1aj6AFT0","JkzUntlILt","fFDrJlpF6W","Uvlv4CxVEf","dmoS7tjQxs","zFgtBfcwDa","CqqaDjeskS","djsrvCp3mZ","AgJHQdhSuH",
+"2hEEUK4GS8","8FmFHG1RhS","CdyBVni2v1","zqH0Wlm0pD","M6qcGyEfy9","KASQ8GWqqX","pFrrlvOqCE","QbxXcfFDrJ","7fsYMMaJQs","cShY2DcpWB",
+"DLhzMZuDtD","MmsIocQOnv","d85a914FLR","hE1QlvOqCE","NAFuw9y4lw","QChxs8FmFH","MmsIo7hyVv","oGu6xQ6hMC","I7p2aJXljW","uQIczMezSW",
+"HzZT8XyPZN","QWxoTs7Mxk","5Drn0QClRL","djsrvzFgtB","OUqFM9y4lw","zz4ZUfaHir","StlDJuvf7A","GSQwj14FLR","SWfouTa8f6","gf8rIfmIK1",
+"FFDuijeskS","zz4ZUCdyBV","m4bxUuQIcz","FcWrW9GXkX","0h1b1FcWrW","G1RhSMezSW","lm0pDulk41","QClRLOHaBz","jeskSDcpWB","Cp3mZZv7z0",
+"FwEJzt98iW","Ul4a1wDajX","0h1b1pFrrl","Y1mC0lpF6W","C2Ircv1Hln","cL0aEZuDtD","YOfrYBGaQY","MK07YTa8f6","dpe1viKqhr","hYBCKPYBf4",
+"S77LHOz8yZ","iKqhrL7cGc","RmDcrfmIK1","SbRYyMojnP","t98iWhi5X7","5Namm0MR5X","580YDPYBf4","0Wr5yiB08l","zFgtBQbxXc","7fKYUfFDrJ",
+"Q6LixRxrsm","v8yFNHP433","WaWsvCp3mZ","MmKGJ5VZjS","4dEz6Ul4a1","HfyNQGv3Fq","VerEABbwgA","vLsmS7lUXZ","l83Uduupzk","zqH0WHP433",
+"16lHc2hEEU","s4786kB5nP","v1Hlnn1pmO","Cfgr30ao3l","16lHcYh1hF","5nmWvwDajX","POUYSuAWyp","aDGtS5iGN5","yEfy90Kyfs","LewvMlViBv",
+"atef2zY1GY","QYxC02hEEU","i7WMQB3qem","uTacxTCgPp","4W0TlBbwgA","L7cGcuZPqg","KsjRKEoToP","Yh1hFNxx9V","nlaByU3yw5","qUJMdQnJ1S",
+"vOqCEhi5X7","14FLRFcWrW","LewvMNo0Qb","AgJHQRpBQm","rhl0JuN6r3","ix74r7fKYU","uZPqgatef2","D6rByciuWz","S77LHOUqFM","PYBf4CIShG",
+"9iGoT5Mg9r","zbIYYiwzGk","5IhmGZJTXH","KsjRKZuDtD","pWiOsTXQ0Z","lj07QFjHXR","uTacx0Wr5y","Yf2EcpWiOs","WMiS3jfREu","hUTw7WaWsv",
+"9XyT9DLhzM","aL6AJd7vjM","Oz8yZGWqqX","djsrvy94nw","ksJbysuY4x","FNYIMBFkb8","W7cTsZJTXH","IKxdL8hJdt","AgJHQ7hyVv","MaJQstlILt",
+"FxX9q8TxD7","SbRYys4786","v1Hlnk85Ae","K20wKYh1hF","QClRLEoToP","vLsmS8U2nU","jiVBPRmDcr","lpF6WaL6AJ","fcJOy7Ow5C","FxX9qguMb8",
+"O3iyQmX2GE","tuDySatef2","MGlTFNxx9V","4W0TlChuy3","aL6AJNOHsz","bgJAzECMvU","rhl0JpAhR1","HRxd88hJdt","k85AeRmDcr","HzZT8S2Dfu",
+"HfyNQBFkb8","CqqaDpAhR1","QChxsxXTI4","7ku1pSs0Zu","GSQwj7fKYU","FLsphsoy9t","i7WMQ5nmWv","cShY2QChxs","lCMxypv0i7","pWiOsX6Pin",
+"iwzGk5iGN5","D6rBy0BmCy","sx5GlOHaBz","MezSWVerEA","ZzJHWCp3mZ","sqVrfd85a9","Kr8ys2hEEU","3otm61LB1L","WDVWJjiVBP","qUJMdZuDtD",
+"cShY2uZPqg","7Ow5C1v5hH","6q6L9l83Ud","uN6r3GSQwj","cmXIX9GXkX","VjCZqDLhzM","RsQUq07n1c","DcpWBi3pyd","9GXkXVprf2","iwzGkZuDtD",
+"l83Ud0Kyfs","taOXKuupzk","zmLYDM6qcG","tAOsr0YAGH","8cVD3fcJOy","No0QbjS1aj","ulk41ZUnqt","zmLYDhE1Ql","Uvlv4iKqhr","RmDcrCK5W7",
+"aFFssFhtgl","AkKTkdjsrv","RxrsmS2Dfu","PYBf45drc6","yEfy9G1RhS","55rfBciuWz","ksJbyQClRL","faHir0PktI","WDVWJUvlv4","BFkb8fcwDa",
+"dQ586vLsmS","29QAzjeskS","JRJQB7lUXZ","RkQke5VZjS","7lUXZuAWyp","4QMc9gIYvE","JJs5muLtKs","BGaQYx3LDe","pmeCdpFrrl","DcpWB7X3uy",
+"Cp3mZMmKGJ","ThjNnb29RJ","0h1b17Ow5C","lpF6WokgRi","t59lRFwEJz","Pb1pauPX7G","Cp3mZUl4a1","ZhwG1BbwgA","RACuj0BmCy","uAWyp0BmCy",
+"Cp3mZDz1R3","brhlQXyPZN","ZuDtDsx5Gl","TXQ0ZCNHmv","v1HlnRsQUq","0ao3lqQxHP","Ta8f6ciuWz","i3pydo8Uyd","pWiOsrKDLJ","ulk41B3qem",
+"rKDLJzFgtB","7fsYMI7p2a","piJSk2ZHdk","RkQkeFLsph","uAWypzmLYD","EOE1o9iGoT","HfyNQyofH3","WreyPTa8f6","UmaEvuoStw","dhSuHCK5W7",
+"4dEz6prNT6","2Yz7EStlDJ","6AFT0fqypy","DcpWBFNYIM","SjskQi7WMQ","qQxHPkZANm","DcpWBHRxd8","pFrrlmX2GE","JRJQBpvgjS","BGaQYOUYuF",
+"QWxoT0Kyfs","y94nwciuWz","DcpWBAmdQd","W3VFHY1mC0","DQimpOUYuF","X6PinlweGy","RsQUq5nmWv","HRxd8ni2v1","qUJMdZUnqt","dQ586DcpWB",
+"prNT6StlDJ","OUYuFCp3mZ","ZuDtDkZANm","GrDg7FGzgp","WmadAjtn0X","5ZaEz7Ow5C","vkCHHGSQwj","djsrvsqVrf","ZhwG1UlU3M","JRJQBHfyNQ",
+"pv0i7Kr8ys","LbRTHpmeCd","W3VFHxciqp","Y1mC09y4lw","2hEEUNAFuw","RxrsmL7cGc","J2mQiCIShG","LbRTHs7Mxk","IBe8kiKqhr","9GXkX24ARF",
+"uupzkVjCZq","uTacx0MR5X","i7WMQzqH0W","yToGWCNHmv","G1RhSNxx9V","CdyBVDQimp","SjskQUvlv4","Yh1hFfcJOy","B3qemU3yw5","EOE1oMaJQs",
+"AmdQdUmaEv","FjHXRvLsmS","ZUnqt8hJdt","tAOsrKASQ8","jfREuUlU3M","0MR5Xiqv4k","uoStwY1mC0","fmIK1J2mQi","mX2GEQWxoT","atef2pAhR1",
+"ni2v1QnJ1S","8TxD7lj07Q","CK5W7nlaBy","AmdQdLbRTH","brhlQni2v1","7X3uyni2v1","RpBQmjS1aj","ZUnqtKZamH","DG4sT0Kyfs","4QMc9okgRi",
+"dQ5864dEz6","wDajXuupzk","lj07QGWqqX","jeskSOHaBz","b29RJSWfou","YjB9tlj07Q","Mm8sipmeCd","uAWypprNT6","9eoRcSs0Zu","i7WMQDQimp",
+"VIlwPpWiOs","6q6L9aL6AJ","VLTy6yvOMI","TCgPp9iGoT","WaWsvs4786","AkKTkpFrrl","LDk6fs93Ml","7hyVvuJScX","HzZT8Q6Lix","Cfgr3pAhR1",
+"gdQsSLbRTH","P6bcg8FmFH","0YAGHRsQUq","uTacxv2eC3","B3qemMojnP","KZamHdQ586","jSjS3yEfy9","jzUqRfLNg8","5ZaEzGWqqX","qQxHPgf8rI",
+"HfyNQ8FmFH","Pb1paHP433","2NslmuN6r3","m4bxUMK07Y","atef2yEfy9","2DREsNcICA","JIqXiUmaEv","45cIHdjsrv","aDGtSVLTy6","G1RhSuoStw",
+"iwzGkRzaZA","G1RhSEOE1o","24ARFpmeCd","hYBCKo8Uyd","iB08lpWiOs","XflUq5ZaEz","EdBKcVjCZq","NAFuwuLtKs","b29RJhSSvQ","D6rByhi5X7",
+"ThjNnLDk6f","BCxeCuLtKs","KsjRK9y4lw","NhXdu1v5hH","29QAzhE1Ql","JRJQBAXpwE","FjHXRKr8ys","3otm6dhSuH","pT8wuVjCZq","jtn0XWreyP",
+"SbRYy4dEz6","MmsIoaDGtS","8hJdtFVMxo","HRxd8Waim6","ni2v18hJdt","CxVEfGXdoH","Cfgr3QChxs","SbRYyiB08l","OxWIHQssNC","S77LHUl4a1",
+"zmLYDHfyNQ","FnPFBni2v1","5IhmGD6rBy","48cHLTXQ0Z","yToGWYOfrY","FVMxomz8gx","fFDrJ24ARF","Mm8sifLNg8","nnP8o9eoRc","aDGtSK4GS8",
+"nFqik7Ow5C","x3LDeQworu","618DiStlDJ","HRxd864s8N","lpF6WguMb8","5Mg9rK20wK","RkQkeVLTy6","s7MxkCxVEf","U3yw5QYxC0","9rlg9pFrrl",
+"CdyBVQClRL","KsjRKcShY2","xciqpd85a9","zHF1qGrDg7","ogLgctjQxs","v8yFNFxX9q","NhXduAkKTk","MK07YSs0Zu","GWqqXfFDrJ","BbwgAIn3NS",
+"yToGWb29RJ","ZuDtDOUqFM","Q6hMCpWiOs","RmDcrprNT6","SbRYycmXIX","xXTI4NcICA","RBhp07lUXZ","5Mg9rnFqik","0PktIuQIcz","0h1b1ulk41",
+"JXljWt59lR","G1RhSYw2oU","CxVEftAOsr","n8pJ9yvOMI","Ta8f6Ta8f6","OUYuFNOHsz","QClRLKZamH","S77LHeuZA5","WmadAKZamH","SjskQ618Di",
+"5ZaEztAOsr","MaJQsQworu","zHF1qjfREu","14FLRsx5Gl","TwanoNAFuw","uTacxyluBx","zmLYDS77LH","brhlQNo0Qb","U3yw5prNT6","5Mg9rSbRYy",
+"24ARF5IhmG","RBhp0qaofN","uTacxni2v1","jfREulweGy","EOE1o14FLR","aDGtS7lUXZ","d7vjMlpF6W","tvdkDGrDg7","s4786lH1kt","QWxoTGXdoH",
+"zHF1qh1zcH","ksJbyHP433","FcWrWwDajX","faHirRBhp0","JIqXi8RCUA","lViBvQ6hMC","gIYvEQChxs","o8UydLDk6f","tAOsri3pyd","qUJMdOxWIH",
+"MaJQsNAFuw","v8yFNhYBCK","DQimplsQGo","jiVBPGSQwj","XflUqzFgtB","QChxs5nmWv","SWfou4W0Tl","RpBQmiKqhr","SjskQ7lUXZ","7X3uyM3zXL",
+"n8pJ9CdyBV","BCxeC1j5L8","tuDyS64s8N","uLtKst98iW","BCxeCUl4a1","iB08lfFDrJ","BbwgAKZamH","hSSvQuTacx","VBjhzoQ87r","kB5nPdQ586",
+"BbwgAChuy3","SmGzvlH1kt","CxVEfFjHXR","FcWrWrhl0J","0PktIPb1pa","4W0TltlILt","uupzkL7cGc","0Wr5yulk41","ZJTXHZ4I1v","NAFuwTwano",
+"DQimptuDyS","RsQUq5iGN5","LDk6fzqH0W","0YAGHLewvM","0KyfsLewvM","OxWIHoQ87r","O3iyQ5Namm","tAOsrIjTwP","yofH3hi5X7","Chuy3ni2v1",
+"qQxHPIjTwP","ZJTXHWreyP","qQxHP8RCUA","Uvlv4WPmlx","5nmWvBpYhV","ix74r9iGoT","QnJ1SQworu","5NammIRh48","EoToP0ao3l","JRJQB1v5hH",
+"soy9tZuDtD","UlU3MpFrrl","jSjS3QbxXc","ksJbyWPmlx","14FLR0YAGH","FxX9q7fKYU","JIqXi14FLR","uAWypbgJAz","jzUqRyToGW","RsQUqogLgc",
+"lsQGoAgJHQ","QbxXcaDGtS","AXpwEpv0i7","1v5hHcQOnv","RBhp0vkCHH","t59lReuZA5","ThjNnKsjRK","NAFuw3otm6","QbxXcFLsph","Chuy3NOHsz",
+"suY4xeuZA5","ni2v1XflUq","RACuj1v5hH","B3qem7X3uy","bgJAzQssNC","07n1cdjsrv","CK5W7ciuWz","WDVWJQworu","hE1QlEdBKc","1LB1LgjUTu",
+"bgJAzaL6AJ","ReKEWx3LDe","SbRYyDcpWB","In3NSyluBx","zFgtBdmoS7","euZA5x3LDe","7lUXZs7Mxk","ZuDtD7X3uy","i3pyd0h1b1","CqqaDoVQp6",
+"ZUnqtqQxHP","9rlg9yofH3","W3VFHoGu6x","jSjS3y94nw","W3VFHt98iW","MezSWvkCHH","Gv3FqGXdoH","e6e4zpiJSk","B3qemK20wK","QbxXccQOnv",
+"lkMUArhl0J","wiHrZ2DREs","4QMc9xReec","cL0aEzqH0W","VLTy6suY4x","Vprf2SWfou","SmGzv8xEKz","9y4lws7Mxk","lj07QCqqaD","BGaQYCdyBV",
+"yluBxFLsph","U3yw5AkKTk","Pb1pa0YAGH","sqVrf618Di","zHF1quJScX","rKDLJPb1pa","8hJdt9GXkX","6q6L9wDajX","AgJHQDQimp","MezSWprNT6",
+"POUYSUlU3M","BpYhVsx5Gl","cmXIXCIShG","sx5Gl4dEz6","B3qem7lUXZ","G1RhSOUYuF","oQ87rni2v1","FFDuiyvOMI","IjTwP5Namm","JkzUnaL6AJ",
+"ulk41iB08l","7fKYUFxX9q","hSSvQlCMxy","7ku1py94nw","WmadAvLsmS","tl72WokgRi","GWqqXru4UG","YjB9tYw2oU","Mkgy8nFqik","RACujzbIYY",
+"qUJMdpv0i7","5Namm9rlg9","v8yFNs7Mxk","uPX7GLDk6f","yToGWVerEA","pmeCdsoy9t","qUJMdIRh48","pvgjS2DREs","MK07Yk85Ae","pAhR1Yh1hF",
+"5Drn0hSSvQ","5VZjSM6qcG","7fKYUCqqaD","Gv3Fquupzk","bZLvS8cVD3","WmadATa8f6","taOXKe6e4z","a00b5oVQp6","AIYUu618Di","4dEz6QWxoT",
+"ZuDtDFNYIM","9eoRcGWqqX","brhlQvLsmS","0Wr5yQWxoT","2Yz7Eo8Uyd","nlaByM6qcG","lweGyAIYUu","XyPZNlCMxy","7ku1pe6e4z","XyPZNKr8ys",
+"2TRI7AmdQd","JkzUn07n1c","5NammvLsmS","1LB1LYjB9t","Zv7z0ReKEW","ulk41rKDLJ","1v5hH9rlg9","NAFuwbgJAz","AkKTkHfyNQ","fmIK1Qworu",
+"7hyVvYOfrY","Cfgr3WDVWJ","8RCUAtlILt","F6PT24QMc9","jtn0X7Ow5C","JJs5mqaofN","9rlg9guMb8","Gv3Fq9rlg9","gIYvE7fKYU","0PktIMm8si",
+"rz7UtuQIcz","RzaZA5Namm","Mkgy8EOE1o","RACujaez9y","tvdkDydG8U","jS1ajOUqFM","9rlg9zQt6Q","RxrsmjSjS3","0BmCyxXTI4","0MR5X5nmWv",
+"zHF1qpFrrl","gIYvEBGaQY","3otm6EoToP","CxVEfoQ87r","Yw2oUC2Irc","8FmFHrKDLJ","RsQUqxciqp","5Drn0gtCA5","iqv4kn1pmO","QClRLguMb8",
+"7lUXZ2Yz7E","gf8rIQ6hMC","7fKYURzaZA","8FmFHCIShG","8FmFH07n1c","FnPFBCfgr3","KASQ8ZhwG1","ksJbysx5Gl","pAhR1YjB9t","VBjhz0h1b1",
+"h1zcHrKDLJ","07n1cDcpWB","TXQ0ZQnJ1S","StlDJFVMxo","zqH0WSs0Zu","nFqikZv7z0","AgJHQHRxd8","KZamHTCgPp","DcpWBfqypy","HRxd8jzUqR",
+"48cHLAIYUu","d7vjMrhl0J","n1pmOguMb8","GWqqXCdyBV","Uvlv4TCgPp","Yw2oUVIlwP","MmsIojiVBP","wDajXpvgjS","pAhR1Zv7z0","O3iyQokgRi",
+"W3VFHO3iyQ","ThjNnEOE1o","OUqFMtvdkD","4W0TlgdQsS","DcpWBgf8rI","ZuDtD5iGN5","9rlg9U3yw5","Kr8ysnFqik","0YAGH14FLR","0BmCyRxrsm",
+"BGaQYYf2Ec","n8pJ9bZLvS","ni2v1Kr8ys","Waim6jiVBP","h1zcHMmsIo","ZUnqtNhXdu","v2eC3YOfrY","cL0aECNHmv","WreyPBFkb8","iB08l9XyT9",
+"2DREssqVrf","I7p2aRzaZA","guMb8vLsmS","uAWypYjB9t","h1zcH7fsYM","BCxeCZ4I1v","i7WMQL7cGc","euZA516lHc","9y4lwpmeCd","brhlQGWqqX",
+"FLsphx3LDe","nnP8ocShY2","55rfBMaJQs","WreyPJ2mQi","1LB1LQYxC0","ZUnqt2Yz7E","gf8rIHlUbF","29QAziqv4k","ZhwG1EdBKc","lm0pDAOgEe",
+"M6qcGlkMUA","qaofN8U2nU","zbIYYWDVWJ","iKqhrWMiS3","WMiS3gjUTu","ReKEWDG4sT","G1RhS2Yz7E","Zv7z0qQxHP","29QAzBGaQY","n8pJ9BpYhV",
+"S77LHYjB9t","OUqFMRzaZA","dhSuHGrDg7","GXdoHZv7z0","AgJHQv2eC3","vOqCE0BmCy","hSSvQoQ87r","Z4I1viB08l","o8UydKASQ8","7ku1pl83Ud",
+"0ao3lM3zXL","HRxd8GrDg7","aFFssAOgEe","WPmlx3otm6","29QAzMezSW","hUTw79eoRc","ru4UG7ku1p","BGaQYBFkb8","B3qem29QAz","FLsphcQOnv",
+"rhl0JIRh48","JKWYRazIWp","oGu6xrhl0J","fqypyAIYUu","Mm8siDcpWB","tuDySwDajX","rKDLJRBhp0","WMiS30PktI","tlILt2Nslm","No0Qb0PktI",
+"IBe8kIKxdL","uvf7ANOHsz","OxWIHZzJHW","zbIYYaez9y","pAhR1a00b5","xReecgIYvE","fLNg8FLsph","2TRI7Pb1pa","i3pyd8hJdt","zz4ZUXyPZN",
+"J2mQiix74r","RBhp0OUYuF","0Wr5y7fsYM","uQIczDG4sT","tlILtdjsrv","OUYuFy94nw","SbRYyFNYIM","HRxd8QChxs","iB08lD6rBy","FnPFBSjskQ",
+"RBhp0bZLvS","0Wr5ypmeCd","VBjhzuupzk","SWfouRpBQm","ZhwG1kZANm","JXljWlH1kt","suY4xAOgEe","VNCPd2DREs","RBhp0vOqCE","OUqFMVIlwP",
+"bgJAz5IhmG","ECMvU0MR5X","IjTwPhUTw7","uZPqgDz1R3","iwzGkAkKTk","1j5L8tvdkD","2ZHdkgIYvE","HlUbFbrhlQ","tjQxs9rlg9","W7cTsazIWp",
+"uoStwnlaBy","DcpWBoQ87r","e6e4zi7WMQ","LbRTHVIlwP","iB08lokgRi","Vprf2Dz1R3","HP433FjHXR","gtCA5QYxC0","BGaQYIjTwP","5Mg9rSs0Zu",
+"Pb1patAOsr","FLsphSjskQ","azIWpTwano","7lUXZpFrrl","x3LDe9iGoT","ulk41iwzGk","uupzkuZPqg","7fKYU9GXkX","16lHcZ4I1v","7fsYM5IhmG",
+"h1zcHa00b5","k85AezmLYD","zbIYYHzZT8","i3pydMm8si","Ta8f6a00b5","yluBxHRxd8","qUJMdDG4sT","zQt6QtAOsr","8xEKzOHaBz","64s8NFnPFB",
+"djsrvMmKGJ","sqVrfJKWYR","K4GS8pAhR1","14FLRaDGtS","ulk41VerEA","lm0pDVLTy6","Yw2oUZUnqt","XflUq5IhmG","D6rBy29QAz","SbRYymX2GE",
+"UlU3MFnPFB","sx5Gl5nmWv","CNHmvKsjRK","29QAzRBhp0","IRh48MojnP","VLTy6ix74r","RsQUqmX2GE","5NammWreyP","1j5L89iGoT","JRJQBSmGzv",
+"NOHszsqVrf","Nxx9VFGzgp","Pb1pa9GXkX","FVMxofLNg8","lj07QgjUTu","0MR5XOxWIH","Oz8yZBpYhV","4QMc9Ss0Zu","Chuy3dmoS7","b29RJChuy3",
+"uupzk3otm6","S77LHQssNC","nlaByxReec","taOXK9GXkX","NOHsziqv4k","tvdkDLewvM","AIYUulm0pD","0BmCy0PktI","y94nw7X3uy","M3zXLOz8yZ",
+"8FmFHFFDui","uZPqg0YAGH","vkCHH5nmWv","BFkb8lj07Q","dhSuHoGu6x","FnPFBHRxd8","4W0TlOUYuF","BCxeC9GXkX","MmsIoyToGW","jSjS3OUYuF",
+"zz4ZUFjHXR","NcICAQworu","0PktIfFDrJ","2TRI7FwEJz","dhSuH9rlg9","MmsIoRmDcr","TXQ0ZlH1kt","D6rByn8pJ9","uJScXYh1hF","zHF1qhE1Ql",
+"JIqXiokgRi","HlUbFuQIcz","ulk415Mg9r","FjHXRmz8gx","lpF6WzbIYY","wDajXyofH3","AIYUuRACuj","cL0aEFcWrW","OHaBzEOE1o","6q6L9cmXIX",
+"9XyT9HlUbF","tvdkDbgJAz","O3iyQAmdQd","3otm6n8pJ9","DQimprz7Ut","Uvlv46AFT0","8TxD7uN6r3","JJs5matef2","MK07YIjTwP","brhlQcmXIX",
+"AXpwEAXpwE","64s8NHP433","v2eC3AXpwE","KsjRKUmaEv","zbIYYQssNC","1LB1LVLTy6","29QAzrz7Ut","rhl0JvkCHH","xciqpaDGtS","0Wr5ydpe1v",
+"2hEEUIjTwP","uupzkzQt6Q","Waim6RpBQm","RxrsmcQOnv","W3VFH5VZjS","uoStwFcWrW","HP433uAWyp","WDVWJBpYhV","Gv3Fq7hyVv","618DiSmGzv",
+"taOXKC2Irc","W7cTsiqv4k","rz7Ut7fsYM","xXTI4pWiOs","FGzgpzFgtB","StlDJ29QAz","LewvMQChxs","ksJbyVNCPd","FVMxouN6r3","yToGW4QMc9",
+"P6bcgNcICA","dhSuHBFkb8","ydG8UQbxXc","7ku1pdmoS7","7fsYMjfREu","Chuy3QssNC","uupzkQ6hMC","S2DfuReKEW","AOgEe7lUXZ","JIqXiSs0Zu",
+"Vprf2QssNC","mz8gx5ZaEz","tAOsrRACuj","GSQwj7hyVv","BGaQYlweGy","DQimprKDLJ","nnP8oJ2mQi","Uvlv4bZLvS","dmoS7O3iyQ","Ul4a1Fhtgl",
+"AOgEeUl4a1","2hEEUlH1kt","lViBvpAhR1","Vprf2jSjS3","BCxeCAOgEe","FVMxoTwano","1LB1LTCgPp","L7cGcdpe1v","xXTI4SWfou","zmLYDzmLYD",
+"Waim6Waim6","8FmFHhSSvQ","Ss0ZuK20wK","OUYuFl83Ud","zmLYDlm0pD","AXpwE9iGoT","FLsphHlUbF","dpe1vpWiOs","Vprf2ix74r","Ul4a1CdyBV",
+"WmadAeuZA5","qaofNRpBQm","qQxHPRkQke","s93MlKASQ8","RACuj5VZjS","xciqpuJScX","FFDui0PktI","SmGzv5Mg9r","Kr8ys7X3uy","y94nwJIqXi",
+"5Mg9rThjNn","9GXkXGrDg7","AkKTkyofH3","Waim6SmGzv","8TxD7dpe1v","O3iyQ7fKYU","NcICA8TxD7","DLhzMmz8gx","tl72WVerEA","kZANm7lUXZ",
+"XyPZNRsQUq","sqVrfX6Pin","d85a9AkKTk","lkMUA1LB1L","ydG8Usoy9t","LewvM48cHL","TCgPpzY1GY","JJs5myvOMI","fqypyMezSW","SjskQyvOMI",
+"MmKGJaDGtS","oGu6xSjskQ","nnP8ouLtKs","W7cTs55rfB","Dz1R3SmGzv","8hJdthe9IA","RmDcrNAFuw","VLTy69XyT9","0BmCyfmIK1","vkCHHtl72W",
+"pFrrlblLA9","jiVBPn1pmO","VIlwPx3LDe","Yw2oU0MR5X","oVQp66q6L9","QnJ1SMaJQs","xXTI464s8N","CxVEf0BmCy","lsQGoyofH3","KZamH8hJdt",
+"rKDLJFVMxo","a00b5UlU3M","NOHsz5iGN5","RxrsmiwzGk","XflUqhUTw7","prNT6Rxrsm","F6PT2lViBv","xXTI4KZamH","0ao3lQnJ1S","16lHcbZLvS",
+"D6rByjfREu","NAFuw24ARF","AkKTkLewvM","ogLgcQWxoT","5drc65VZjS","7fKYUhUTw7","NhXduFcWrW","oGu6xCxVEf","zqH0WwiHrZ","FFDuifLNg8",
+"zFgtBBbwgA","BbwgAdpe1v","uPX7G3weIF","CdyBVRBhp0","Mm8siFLsph","HP433iB08l","ydG8UX6Pin","azIWpxReec","1LB1LRACuj","DcpWBBbwgA",
+"nFqikuTacx","K20wKThjNn","AXpwEAkKTk","tlILts4786","F6PT2lweGy","2Yz7Ev2eC3","BFkb8uQIcz","QssNCuJScX","3otm6G1RhS","3otm64W0Tl",
+"WMiS3YjB9t","Kr8ysWDVWJ","8cVD3jtn0X","2Yz7E5ZaEz","cmXIXRmDcr","W7cTsjfREu","AmdQdZJTXH","fmIK15VZjS","G1RhSEdBKc","gjUTu0Kyfs",
+"WmadAI7p2a","zFgtBVjCZq","QClRLuAWyp","yofH3Chuy3","AkKTkcQOnv","AmdQdLDk6f","iwzGkb29RJ","zqH0WpT8wu","EdBKcyEfy9","pWiOsJ2mQi",
+"BpYhVlsQGo","0YAGHZJTXH","n1pmO7lUXZ","SmGzv0Kyfs","lm0pDiwzGk","uLtKsAmdQd","iqv4kbgJAz","hi5X7m4bxU","gf8rIaL6AJ","D6rByjiVBP",
+"QClRL4W0Tl","8FmFH8RCUA","MmKGJd85a9","0YAGHuN6r3","QWxoTG1RhS","taOXKkZANm","lpF6Ws7Mxk","nFqikd7vjM","64s8NYOfrY","XyPZNzQt6Q",
+"Pb1padjsrv","gf8rI1LB1L","pT8wu1LB1L","aL6AJwDajX","0PktIEoToP","55rfBtvdkD","Yf2EcZuDtD","OUYuFyluBx","NcICARxrsm","RxrsmFLsph",
+"FjHXRlXFOB","Q6hMC1LB1L","FLsphguMb8","aez9yUvlv4","Yf2EcEOE1o","ZuDtDNcICA","uJScXjeskS","2hEEUgtCA5","4QMc9XflUq","5drc6lH1kt",
+"1LB1Lv1Hln","brhlQ0Kyfs","Y1mC0W7cTs","EoToPuupzk","QworuksJby","s7MxkMK07Y","NcICAv2eC3","WreyP2Nslm","iKqhr0MR5X","IBe8kEOE1o",
+"VjCZqjeskS","2DREsHP433","FwEJzjiVBP","nFqikMezSW","1LB1LJRJQB","ZuDtDd7vjM","TCgPpMK07Y","gjUTu4W0Tl","CdyBViqv4k","atef2WPmlx",
+"OHaBzCfgr3","IRh487fKYU","fFDrJuTacx","s93MlGSQwj","4W0TluAWyp","Yw2oU8xEKz","8U2nUrz7Ut","BCxeCKASQ8","64s8NFGzgp","O3iyQuAWyp",
+"xciqpydG8U","TCgPpsoy9t","JXljWMojnP","pmeCdMmKGJ","jSjS3xciqp","K4GS8azIWp","4dEz61v5hH","lkMUAZJTXH","CK5W75Mg9r","DLhzMQWxoT",
+"OUqFMuAWyp","CNHmv7fKYU","9rlg9K20wK","qUJMdAXpwE","qQxHPix74r","5iGN5Uvlv4","Pb1paLDk6f","fmIK1y94nw","oVQp6JJs5m","ZuDtD3otm6",
+"suY4xHP433","euZA52Nslm","Q6Lixrhl0J","MmKGJ7X3uy","ZzJHWlsQGo","zbIYYjeskS","n8pJ97Ow5C","blLA9pv0i7","SWfou0PktI","lweGyXyPZN",
+"KASQ87Ow5C","2TRI7EOE1o","9XyT9y94nw","uLtKsO3iyQ","fcJOyuoStw","HRxd8Chuy3","l83UdXyPZN","rz7Utiqv4k","uTacxZJTXH","faHirMGlTF",
+"gdQsSxXTI4","6AFT0YjB9t","lweGylweGy","cL0aE8U2nU","HfyNQdhSuH","U3yw5lweGy","DLhzM14FLR","jtn0XQChxs","Yf2EcX6Pin","2NslmVLTy6",
+"nlaBycShY2","VjCZqZhwG1","FxX9qAXpwE","4W0TlQnJ1S","Dz1R3yofH3","ciuWzBGaQY","MaJQsyToGW","cQOnvNAFuw","1LB1Ld7vjM","fFDrJlH1kt",
+"lXFOBQssNC","iqv4ktuDyS","48cHLZ4I1v","DG4sTuPX7G","zqH0WRmDcr","Z4I1vJJs5m","Yh1hFZuDtD","FPfSEyvOMI","45cIHiwzGk","cL0aEQChxs",
+"ZhwG19XyT9","sqVrfAIYUu","Kr8yslXFOB","4dEz6lweGy","fcJOy3weIF","CdyBVIn3NS","VjCZqRzaZA","MGlTF48cHL","0PktIGv3Fq","s478614FLR",
+"6q6L9MaJQs","lsQGo0BmCy","gIYvEpvgjS","1v5hHTwano","StlDJokgRi","vkCHH2Yz7E","P6bcgyvOMI","Mkgy8vLsmS","BCxeCMmKGJ","ru4UGhi5X7",
+"pFrrlsoy9t","zz4ZUix74r","HfyNQUmaEv","dmoS7tlILt","HRxd8jSjS3","KsjRKCNHmv","JXljWNhXdu","suY4xEdBKc","jfREuYw2oU","5nmWvrz7Ut",
+"MmsIoU3yw5","n8pJ9ulk41","WmadAt59lR","qaofN9XyT9","OHaBzBFkb8","cL0aEO3iyQ","OUYuFJJs5m","zz4ZUdjsrv","qUJMd45cIH","POUYS64s8N",
+"jiVBPSs0Zu","6q6L9lpF6W","zY1GYEoToP","Yh1hFcmXIX","lpF6WzqH0W","iwzGkoQ87r","1v5hHguMb8","C2IrcbgJAz","azIWpYOfrY","5drc6guMb8",
+"IBe8k618Di","jiVBPlm0pD","tAOsrFFDui","xReecsoy9t","P6bcgW7cTs","d7vjMTa8f6","AXpwElweGy","VBjhzlXFOB","Mm8siMaJQs","v2eC3l83Ud",
+"Nxx9VDQimp","uJScX0ao3l","zz4ZU0YAGH","LDk6fzHF1q","WMiS3prNT6","i7WMQ2DREs","FPfSEZhwG1","G1RhS9XyT9","t98iW9y4lw","m4bxUn8pJ9",
+"dpe1vv2eC3","uPX7GDLhzM","oQ87rZzJHW","lkMUAYOfrY","SmGzvZhwG1","XflUq5Mg9r","uvf7AY1mC0","9GXkX8hJdt","2TRI7GXdoH","uN6r3BbwgA",
+"4dEz6aez9y","lCMxyQWxoT","7X3uylXFOB","BbwgAcL0aE","J2mQioVQp6","piJSkDLhzM","YOfrYOHaBz","IRh48lj07Q","IjTwPMaJQs","8RCUA8hJdt",
+"o8UydVIlwP","piJSkP6bcg","IBe8kdmoS7","MezSWt98iW","WDVWJGv3Fq","AIYUuNOHsz","nnP8oydG8U","pmeCdcL0aE","hYBCKNo0Qb","n1pmO4QMc9",
+"okgRit59lR","l83UdrKDLJ","16lHcL7cGc","m4bxUjfREu","5IhmGHRxd8","cL0aE4QMc9","WDVWJsoy9t","TXQ0Z0PktI","IBe8kHzZT8","bZLvSPb1pa",
+"9GXkXNOHsz","yToGWD6rBy","x3LDeuZPqg","14FLRiwzGk","GWqqXNcICA","8xEKzs7Mxk","xXTI41v5hH","Zv7z08xEKz","ix74r5iGN5","lXFOBFGzgp",
+"gjUTuWPmlx","48cHLqQxHP","blLA9vOqCE","tlILty94nw","fqypyChuy3","s4786W3VFH","gf8rIaDGtS","J2mQiWDVWJ","OUYuFHRxd8","Q6LixVBjhz",
+"K20wKLewvM","b29RJHlUbF","8U2nU5VZjS","HRxd8i7WMQ","fmIK13otm6","0YAGHWaim6","8FmFHvkCHH","In3NSF6PT2","xReeclXFOB","iqv4k2ZHdk",
+"14FLRWmadA","MojnPNxx9V","k85AeWaWsv","rz7UtFhtgl","CqqaDjtn0X","ThjNn0BmCy","Uvlv4BpYhV","oVQp6aL6AJ","WMiS3uoStw","dQ586DG4sT",
+"0h1b1rKDLJ","k85AeGWqqX","9y4lwhSSvQ","618DiHP433","iqv4kcQOnv","LewvMpT8wu","GrDg7fcwDa","5drc6x3LDe","FwEJzs4786","zQt6QWDVWJ",
+"GWqqXn1pmO","NhXdusx5Gl","h1zcHYjB9t","DG4sTNcICA","uQIczs4786","MezSW5Drn0","kB5nPQnJ1S","s7Mxke6e4z","5ZaEzKr8ys","yofH3yToGW",
+"W3VFH3otm6","v1HlnoVQp6","hSSvQGSQwj","oGu6x2Yz7E","Waim6Ul4a1","pAhR1sqVrf","fLNg8ogLgc","2NslmFcWrW","uvf7AU3yw5","5IhmGuTacx",
+"tvdkDMezSW","sqVrf8cVD3","uAWypnlaBy","hE1Ql2Yz7E","IjTwPOUYuF","t59lRm4bxU","mX2GE9XyT9","Q6Lixk85Ae","4QMc9uoStw","zmLYDYw2oU",
+"IRh48zQt6Q","6AFT06q6L9","dQ586KsjRK","dpe1vaez9y","TwanomX2GE","lXFOBMojnP","NhXduzbIYY","6AFT0Q6Lix","pAhR1Vprf2","Z4I1vIn3NS",
+"okgRiuoStw","24ARFcmXIX","zY1GY3weIF","suY4xrKDLJ","lm0pDRsQUq","nlaByjSjS3","0BmCyJRJQB","djsrvEoToP","24ARFhi5X7","5VZjSfLNg8",
+"55rfBHP433","aFFssHRxd8","d85a9ZJTXH","7ku1paDGtS","rKDLJk85Ae","dhSuH7X3uy","v2eC3ReKEW","VBjhzzHF1q","QYxC0WaWsv","8TxD7blLA9",
+"gtCA5pT8wu","W7cTsv2eC3","7ku1pX6Pin","BGaQYi7WMQ","IKxdL7ku1p","2TRI7hUTw7","64s8Nx3LDe","5Drn0pmeCd","16lHcWreyP","F6PT27lUXZ",
+"pmeCdSbRYy","L7cGcpvgjS","ECMvUsoy9t","TCgPpn1pmO","FVMxoKsjRK","5IhmGMaJQs","8TxD75VZjS","ZzJHWyToGW","FLsph24ARF","iwzGkx3LDe",
+"JKWYRxReec","FjHXR5VZjS","l83UdeuZA5","MojnPhi5X7","4dEz6l83Ud","SjskQMaJQs","ZuDtDzY1GY","7Ow5CMezSW","RBhp0a00b5","vLsmSWaWsv",
+"b29RJrz7Ut","prNT61v5hH","djsrvuTacx","HlUbFBCxeC","3otm6uZPqg","8U2nU580YD","gjUTucQOnv","GrDg76q6L9","lj07QCp3mZ","hUTw7MmKGJ",
+"Yh1hFYh1hF","DG4sTWMiS3","9GXkXhYBCK","Cfgr3VNCPd","lpF6WnlaBy","TXQ0ZuQIcz","lCMxyBbwgA","6AFT024ARF","UmaEvhSSvQ","pT8wu29QAz",
+"QworulpF6W","EOE1ouN6r3","B3qemcShY2","tAOsr48cHL","bgJAzsqVrf","hi5X7HlUbF","iB08la00b5","lXFOBo8Uyd","I7p2aU3yw5","EoToPMmKGJ",
+"jfREuZJTXH","In3NSGrDg7","RBhp0MojnP","rKDLJX6Pin","azIWpGrDg7","uvf7AgdQsS","NcICASbRYy","K20wKjtn0X","9XyT9TXQ0Z","JXljWNo0Qb",
+"J2mQiuJScX","jfREu618Di","nlaByguMb8","RsQUq8hJdt","Chuy345cIH","suY4xhUTw7","Nxx9VOUqFM","kB5nPW7cTs","sx5Gl0Kyfs","ECMvUZUnqt",
+"Zv7z0ZJTXH","BFkb8tl72W","uTacxOxWIH","9eoRcqUJMd","7ku1p14FLR","FNYIMBCxeC","0ao3luLtKs","XflUq6q6L9","QChxsaFFss","jS1ajUlU3M",
+"0h1b1y94nw","5IhmGQssNC","tuDySvLsmS","RzaZAzz4ZU","NcICAzHF1q","GrDg7No0Qb","jtn0XF6PT2","BpYhV0Kyfs","zqH0Wsx5Gl","brhlQokgRi",
+"KsjRKfcwDa","s4786yluBx","ZzJHW5nmWv","DG4sTOz8yZ","WMiS3dhSuH","FwEJzUl4a1","uoStwNo0Qb","9rlg94dEz6","vkCHHVprf2","b29RJjiVBP",
+"Uvlv4yofH3","QbxXcWmadA","LbRTHuN6r3","Oz8yZ8hJdt","zHF1qNcICA","I7p2a1v5hH","0PktIWaWsv","jS1ajtvdkD","MGlTFpvgjS","GXdoH2hEEU",
+"JJs5m9iGoT","piJSkguMb8","FVMxoB3qem","64s8NtjQxs","ydG8U8TxD7","VLTy6m4bxU","UlU3M3weIF","yluBx5ZaEz","aFFsszmLYD","Gv3FqDG4sT",
+"G1RhSjtn0X","RACuj7X3uy","BFkb8piJSk","XflUqReKEW","cQOnvAgJHQ","Yw2oUzmLYD","WMiS3faHir","lj07Q0Wr5y","aez9y9iGoT","0MR5XvOqCE",
+"iKqhrHRxd8","64s8N5IhmG","FnPFB64s8N","MK07YAIYUu","bgJAzm4bxU","gdQsSJ2mQi","HzZT8CxVEf","8U2nUMm8si","uoStwD6rBy","lkMUA7Ow5C",
+"lm0pDjSjS3","8RCUAChuy3","lsQGoHfyNQ","MaJQslsQGo","piJSkK4GS8","G1RhSWDVWJ","uoStwtl72W","580YDHlUbF","8cVD35VZjS","fcwDapAhR1",
+"BbwgA5Mg9r","e6e4zaL6AJ","MaJQsi3pyd","MK07Y4W0Tl","IKxdL4dEz6","gtCA5h1zcH","y94nwb29RJ","lH1ktpAhR1","OxWIHs7Mxk","y94nwqaofN",
+"aFFssuvf7A","In3NSs7Mxk","EoToPlm0pD","t98iWBpYhV","DQimpGv3Fq","AOgEeWDVWJ","oQ87rxXTI4","fLNg8K20wK","rz7UttaOXK","he9IAdjsrv",
+"MmsIoyEfy9","5IhmGM6qcG","MaJQspFrrl","POUYSJIqXi","F6PT2GSQwj","n1pmORkQke","VerEAFjHXR","YOfrYMmsIo","rKDLJguMb8","wDajXiKqhr",
+"QssNC5VZjS","GSQwjYw2oU","PYBf42TRI7","yofH39iGoT","faHir8U2nU","xXTI4dmoS7","0YAGH0BmCy","v1HlnjSjS3","P6bcgQClRL","PYBf4vLsmS",
+"0PktIqQxHP","7lUXZcL0aE","JkzUn7fKYU","AkKTkSbRYy","55rfBQYxC0","1v5hHmz8gx","ksJbyqQxHP","fcwDan1pmO","Vprf2YjB9t","RzaZANhXdu",
+"9GXkXvOqCE","YjB9tFGzgp","8TxD7SWfou","brhlQK4GS8","JkzUnS77LH","tjQxsyvOMI","JkzUn5Namm","k85Ae6AFT0","8FmFHgjUTu","FnPFB5Mg9r",
+"guMb8rhl0J","vOqCE0Kyfs","FVMxoFPfSE","9GXkXAIYUu","YOfrY9eoRc","uLtKsBCxeC","i3pydK4GS8","RzaZADz1R3","Vprf2Twano","jS1ajhi5X7",
+"a00b5BCxeC","K20wKhUTw7","sqVrfpmeCd","1LB1LtaOXK","K20wKn8pJ9","Cp3mZKsjRK","dpe1vQ6hMC","SmGzvO3iyQ","he9IA8TxD7","gf8rIfLNg8",
+"8RCUA2Yz7E","FLsph580YD","zFgtBaez9y","aFFssTa8f6","HlUbFMGlTF","Ul4a1lCMxy","WaWsv0h1b1","BbwgAwDajX","ZJTXHFnPFB","aFFssOUYuF",
+"aFFssuTacx","k85Ae2Yz7E","3weIFZv7z0","pmeCdSWfou","suY4xrz7Ut","gjUTu8TxD7","zY1GY1LB1L","Nxx9V48cHL","sx5Gl8RCUA","OUYuFLbRTH",
+"TwanoAOgEe","45cIHStlDJ","aDGtSIjTwP","hUTw7POUYS","CxVEfRzaZA","Q6hMCs4786","vOqCECp3mZ","9rlg9Ss0Zu","2ZHdkRxrsm","9rlg9RsQUq",
+"cmXIXI7p2a","lpF6Wsoy9t","pFrrltlILt","ZuDtDMGlTF","0BmCy7Ow5C","Pb1paMezSW","Gv3FqYjB9t","GrDg7Ss0Zu","hi5X7QnJ1S","HzZT80Kyfs",
+"qaofNzmLYD","lm0pDZ4I1v","CK5W7qUJMd","2ZHdkuN6r3","lkMUARmDcr","EoToPNAFuw","Ta8f6JKWYR","K4GS85VZjS","BCxeCVBjhz","gtCA5aDGtS",
+"7Ow5C8hJdt","x3LDe7ku1p","EdBKchi5X7","rz7UtQ6hMC","Pb1pa0Wr5y","tvdkDdQ586","7Ow5CNxx9V","zmLYDG1RhS","hi5X77X3uy","7hyVvyofH3",
+"lkMUAMGlTF","7fKYUBFkb8","uoStwmz8gx","pT8wuF6PT2","iB08l0h1b1","5drc6JIqXi","vOqCE0MR5X","fqypybrhlQ","ogLgc07n1c","WDVWJuJScX",
+"hUTw7lkMUA","t98iWogLgc","7fKYUd85a9","5VZjSh1zcH","suY4xMezSW","uQIczWPmlx","uQIcziB08l","6q6L9JJs5m","uQIczfcJOy","7lUXZZUnqt",
+"8TxD7jiVBP","hi5X7UlU3M","Q6hMCQ6Lix","IjTwPX6Pin","k85AeVNCPd","HRxd8OUqFM","In3NSJRJQB","HfyNQFcWrW","JIqXik85Ae","Ta8f6t59lR",
+"gjUTuAgJHQ","faHirjeskS","Zv7z05Mg9r","2hEEUBGaQY","0ao3laFFss","o8UydCNHmv","DG4sTIBe8k","kZANmuLtKs","xciqppvgjS","M6qcG9rlg9",
+"HRxd8soy9t","2hEEUbrhlQ","he9IAQChxs","16lHc3otm6","bZLvSSbRYy","Yf2EcAIYUu","e6e4zdQ586","BCxeCJIqXi","QChxscQOnv","6q6L9vkCHH",
+"9iGoTZv7z0","O3iyQRsQUq","6q6L98cVD3","BpYhVdhSuH","jeskS1j5L8","yToGWRmDcr","piJSkRxrsm","IBe8k5nmWv","AmdQdHzZT8","O3iyQJKWYR",
+"ECMvUv1Hln","y94nw5Mg9r","Pb1pa24ARF","7fsYMoGu6x","IRh48uZPqg","CK5W7DLhzM","7hyVvRsQUq","ZhwG1VerEA","J2mQi618Di","uLtKsQClRL",
+"7fKYUhSSvQ","yvOMIYOfrY","lpF6W0Kyfs","taOXKyvOMI","MmsIovOqCE","9iGoTpAhR1","rKDLJJJs5m","soy9tWaim6","OHaBzCIShG","JkzUnpT8wu",
+"qaofNSs0Zu","wDajXQChxs","I7p2aZuDtD","Chuy3Qworu","lweGytuDyS","5nmWvPOUYS","5NammkB5nP","07n1cRmDcr","JRJQBK20wK","ix74rQbxXc",
+"C2IrcF6PT2","qUJMdyofH3","azIWpqQxHP","FFDuitvdkD","yEfy9WreyP","fFDrJSbRYy","HfyNQStlDJ","BFkb8tlILt","ulk41Twano","MGlTFk85Ae",
+"Pb1paBGaQY","AgJHQVLTy6","qQxHPFjHXR","EOE1ofmIK1","RxrsmNOHsz","qQxHPLbRTH","cL0aEs93Ml","pWiOslXFOB","m4bxURzaZA","NhXduhi5X7",
+"CNHmvNo0Qb","lpF6WSjskQ","Oz8yZpFrrl","hi5X7VNCPd","yofH3M6qcG","0BmCyogLgc","fcJOyhe9IA","lXFOBlm0pD","29QAzVIlwP","Chuy3M6qcG",
+"5drc6ydG8U","64s8N0Wr5y","WreyPeuZA5","QWxoTn1pmO","8U2nUOHaBz","9GXkXcQOnv","mz8gxkZANm","0BmCyciuWz","YOfrYS2Dfu","Waim66q6L9",
+"2ZHdkoGu6x","ZJTXHRkQke","n1pmOY1mC0","GWqqXiB08l","HP433i3pyd","hi5X79iGoT","jeskSNAFuw","ulk41a00b5","5IhmGn1pmO","7lUXZBCxeC",
+"JJs5m5Drn0","jiVBPlj07Q","atef27X3uy","0MR5XKr8ys","lkMUAkZANm","W3VFHx3LDe","IRh48NOHsz","atef20BmCy","FhtglvkCHH","oVQp6ZhwG1",
+"lm0pD14FLR","uTacx6AFT0","HP433FcWrW","9GXkX2hEEU","ulk41Ul4a1","5Drn0FLsph","MmKGJQWxoT","nFqikuoStw","uoStwsqVrf","MK07YIRh48",
+"lCMxyjiVBP","uQIczbgJAz","8cVD3ulk41","Waim6In3NS","SjskQHfyNQ","nnP8oYjB9t","zQt6QCqqaD","jzUqRlpF6W","l83Ud4QMc9","64s8N7X3uy",
+"lm0pDVprf2","OUqFMAkKTk","AgJHQydG8U","RmDcrvOqCE","gjUTuMm8si","aDGtSYh1hF","dpe1vGrDg7","MojnP1j5L8","BCxeCv2eC3","ulk415Drn0",
+"pmeCdlm0pD","UmaEvZ4I1v","7Ow5Csoy9t","jfREudpe1v","lXFOBAOgEe","jfREu3otm6","brhlQOHaBz","TwanoP6bcg","TCgPpNAFuw","aL6AJdmoS7",
+"XyPZNi3pyd","AOgEeyofH3","FcWrW0BmCy","ThjNnOHaBz","NhXduLDk6f","8hJdtLDk6f","0PktIoQ87r","ZhwG1nlaBy","yEfy9jtn0X","tvdkD2TRI7",
+"m4bxUJIqXi","uQIcz6AFT0","ZuDtDNo0Qb","NcICA0YAGH","D6rByUvlv4","HP433aez9y","VerEAWmadA","lViBvn8pJ9","7ku1p0YAGH","9GXkXfcJOy",
+"FVMxo14FLR","K20wKblLA9","iwzGkRBhp0","rKDLJhYBCK","DQimpjfREu","7X3uy7X3uy","AIYUuuQIcz","Q6Lix6AFT0","ZJTXHXyPZN","qQxHPtlILt",
+"TXQ0Zh1zcH","gtCA5sx5Gl","FwEJz9XyT9","M3zXLBbwgA","0Kyfs55rfB","9y4lwI7p2a","VerEARACuj","5iGN5QnJ1S","ZJTXHKsjRK","OUqFMzqH0W",
+"dhSuHFPfSE","pAhR1No0Qb","FFDuiyToGW","5iGN5nFqik","y94nwOz8yZ","ZuDtDuAWyp","FVMxofqypy","K4GS8taOXK","FjHXRfcJOy","ksJbyNcICA",
+"RACujfcwDa","POUYStjQxs","dhSuHmz8gx","HRxd88TxD7","AXpwEuQIcz","tvdkDpFrrl","DLhzMFcWrW","Kr8ysatef2","qQxHPd7vjM","zHF1qJ2mQi",
+"dhSuH5iGN5","lm0pDAIYUu","AXpwEmz8gx","GXdoHdmoS7","v2eC3Ta8f6","blLA9yluBx","jtn0XpvgjS","t59lRIjTwP","O3iyQtuDyS","uJScX48cHL",
+"XyPZNdmoS7","gf8rISjskQ","fcwDaNAFuw","pFrrlJkzUn","vOqCEC2Irc","MezSWChuy3","9iGoTVprf2","1j5L8t98iW","9rlg9ulk41","tjQxsuPX7G",
+"BFkb8cL0aE","fFDrJQssNC","ZJTXHIRh48","QWxoTUl4a1","LbRTHMkgy8","F6PT2WaWsv","SmGzvUmaEv","NcICAzFgtB","ksJbyS77LH","AkKTkdpe1v",
+"XyPZNzFgtB","7ku1puTacx","DLhzMOz8yZ","ix74r8xEKz","lViBvs4786","Yw2oUaL6AJ","iqv4kRkQke","2Nslm5IhmG","n8pJ9fcwDa","WPmlxFjHXR",
+"Gv3FqHzZT8","U3yw5uAWyp","FwEJzcQOnv","CxVEf7X3uy","xXTI4RkQke","fqypy2hEEU","vkCHHaez9y","YjB9tK4GS8","yofH3lweGy","uupzkgjUTu",
+"yluBxtuDyS","2Yz7EAOgEe","EdBKcxXTI4","LbRTHChuy3","OxWIH1j5L8","m4bxUdmoS7","zQt6Q2hEEU","EOE1ohUTw7","WaWsvFnPFB","RzaZAC2Irc",
+"24ARFBFkb8","yluBxQClRL","SmGzv4W0Tl","ni2v19y4lw","580YDhYBCK","29QAzvkCHH","kZANmP6bcg","5VZjSFLsph","cmXIX7X3uy","RzaZAO3iyQ",
+"d7vjMbZLvS","W3VFHM3zXL","NhXduydG8U","lH1ktHzZT8","24ARFRsQUq","HzZT8uJScX","HzZT8AkKTk","ydG8USjskQ","DLhzMQnJ1S","HzZT8dmoS7",
+"OxWIHFGzgp","9eoRc2ZHdk","Yf2EcTwano","zmLYDxciqp","JKWYRfmIK1","TwanoECMvU","n1pmOhi5X7","pAhR1JXljW","uZPqgpT8wu","Chuy3B3qem",
+"Cfgr3l83Ud","fLNg89GXkX","cQOnva00b5","hi5X7kB5nP","Chuy3Nxx9V","RACujpFrrl","aez9yWreyP","zqH0WZhwG1","uQIcz24ARF","oGu6xcShY2",
+"Mkgy8FjHXR","7hyVvDLhzM","o8UydJkzUn","FjHXRzQt6Q","QworuBpYhV","jiVBPdmoS7","lj07QWmadA","pT8wut98iW","dhSuH0PktI","55rfBtl72W",
+"4dEz6I7p2a","7X3uy1j5L8","uAWypNxx9V","Gv3Fqa00b5","RxrsmK20wK","EoToPQChxs","CIShGxciqp","oVQp624ARF","lkMUA1v5hH","SbRYylpF6W",
+"8FmFHlkMUA","LbRTHCqqaD","lm0pDSmGzv","NhXduWPmlx","nnP8oAgJHQ","xReecWMiS3","VerEAEOE1o","aez9ytl72W","gdQsS55rfB","mX2GE7fKYU",
+"Ul4a1Waim6","IjTwPyofH3","5nmWvcQOnv","7lUXZBFkb8","IKxdLfcwDa","4dEz6B3qem","i7WMQThjNn","cQOnviwzGk","BbwgAOxWIH","d85a9s7Mxk",
+"BbwgAG1RhS","d7vjMMm8si","Ul4a164s8N","FhtglFFDui","Mm8sin1pmO","580YD16lHc","BCxeCiKqhr","WaWsv2DREs","2DREsChuy3","uAWypcL0aE",
+"QClRLDG4sT","qaofNhSSvQ","nFqikYjB9t","Zv7z0gjUTu","AIYUupT8wu","yToGWLDk6f","ix74rhi5X7","RBhp09XyT9","uupzkn1pmO","64s8NAIYUu",
+"euZA55VZjS","RmDcrMezSW","16lHcs93Ml","GWqqXJRJQB","Yf2Eculk41","Yh1hFbZLvS","2hEEUNo0Qb","MK07YcmXIX","8RCUAC2Irc","oQ87rru4UG",
+"Yh1hFdjsrv","0BmCyksJby","AXpwEcQOnv","CxVEfblLA9","jiVBPQ6Lix","1LB1LZhwG1","CK5W7pAhR1","iB08lQ6Lix","sqVrfB3qem","n8pJ90Kyfs",
+"o8UydhSSvQ","JRJQBiqv4k","ZUnqts4786","lpF6WNxx9V","8TxD7GWqqX","VerEAqUJMd","JkzUnnnP8o","fmIK1HP433","AOgEelj07Q","IjTwPxReec",
+"55rfBLbRTH","QssNCtvdkD","RkQkejtn0X","I7p2aFjHXR","nlaBygjUTu","KZamHWaWsv","tl72WHfyNQ","lViBvCdyBV","hYBCKMojnP","vOqCEfFDrJ",
+"48cHL4dEz6","M6qcGpWiOs","AXpwEdQ586","HlUbFFFDui","WDVWJYh1hF","NcICA8xEKz","uupzkJXljW","2TRI7ru4UG","14FLRBCxeC","Oz8yZMojnP",
+"FGzgpS2Dfu","ydG8UUl4a1","Mkgy8zY1GY","0Wr5yYw2oU","ZzJHWNOHsz","TCgPpuQIcz","DG4sTTwano","fmIK1VLTy6","n8pJ98U2nU","uTacxuvf7A",
+"CqqaDzmLYD","piJSk5ZaEz","n8pJ9VjCZq","RmDcr0PktI","Ul4a1lpF6W","gjUTulCMxy","MmKGJ07n1c","uJScXtuDyS","hi5X7uLtKs","FwEJz16lHc",
+"UmaEvrz7Ut","gjUTuQWxoT","pmeCdZuDtD","Mkgy8ZUnqt","v8yFNQYxC0","zbIYYIjTwP","7fKYU5IhmG","ThjNn9y4lw","7fsYMQnJ1S","Uvlv4pAhR1",
+"JkzUnru4UG","07n1cSWfou","zFgtBMK07Y","5iGN5QClRL","JkzUnLewvM","fmIK1MojnP","618DipWiOs","SbRYynlaBy","MmsIozmLYD","KASQ8Ta8f6",
+"5drc60h1b1","FNYIMrz7Ut","Waim6CqqaD","FVMxolViBv","azIWp0MR5X","NAFuwJRJQB","jS1ajuoStw","euZA5nnP8o","xciqp4W0Tl","jtn0XlweGy",
+"djsrvlm0pD","mz8gxzbIYY","jeskSQ6hMC","jfREuTwano","0YAGHSs0Zu","lm0pDhE1Ql","dQ586Cp3mZ","UmaEvOUYuF","SbRYyksJby","29QAzkB5nP",
+"yluBx7Ow5C","Chuy3cShY2","zY1GYydG8U","kZANmzmLYD","ZUnqt0YAGH","B3qem5Mg9r","ZhwG1s7Mxk","5nmWv5VZjS","X6PinIjTwP","Cfgr3MaJQs",
+"W3VFHQ6Lix","16lHcdQ586","9y4lwHRxd8","h1zcH48cHL","Kr8ysP6bcg","v1Hln29QAz","ZJTXHiwzGk","G1RhScShY2","lsQGouoStw","vLsmSjtn0X",
+"CNHmviKqhr","hYBCKXyPZN","WmadAqaofN","pvgjSAOgEe","hSSvQmz8gx","xXTI4yToGW","zFgtBFxX9q","CxVEfzY1GY","NOHsz0PktI","J2mQiFLsph",
+"2Yz7EyvOMI","VIlwPQworu","ThjNn14FLR","5drc60MR5X","BGaQYlsQGo","Ul4a1mX2GE","55rfBuZPqg","oGu6xdhSuH","vkCHHU3yw5","cQOnvk85Ae",
+"IBe8klkMUA","0h1b1Chuy3","8RCUAzbIYY","4W0Tlsoy9t","IjTwP2DREs","ogLgcWDVWJ","nnP8oh1zcH","pT8wuzmLYD","cShY2HlUbF","QYxC0WmadA",
+"7ku1pzz4ZU","fmIK1guMb8","5Drn0lweGy","S77LHSmGzv","m4bxU29QAz","zbIYYiB08l","14FLRpT8wu","UlU3M55rfB","8cVD3e6e4z","FLsphzqH0W",
+"7fKYUDG4sT","uZPqgZJTXH","FxX9qRxrsm","EoToP1LB1L","618DiTXQ0Z","prNT6JXljW","EdBKccmXIX","580YDpAhR1","vLsmSpWiOs","GSQwjlViBv",
+"5drc6soy9t","FGzgpVerEA","0PktIogLgc","s7Mxk0MR5X","CK5W7aFFss","uZPqgyofH3","55rfBpT8wu","s93MlRzaZA","LDk6fMmsIo","i7WMQ8FmFH",
+"YjB9tazIWp","AgJHQMmKGJ","dpe1vydG8U","cShY2jtn0X","ru4UG1v5hH","pWiOs4W0Tl","IjTwP29QAz","QnJ1SSmGzv","RsQUqi7WMQ","jeskSI7p2a",
+"EoToPRmDcr","lkMUAfLNg8","dhSuHzz4ZU","iqv4kJkzUn","JkzUnqQxHP","HzZT8M6qcG","uZPqggdQsS","vkCHHzFgtB","IBe8kKASQ8","pT8wugIYvE",
+"zHF1qbgJAz","0ao3lJ2mQi","AkKTkCK5W7","gIYvEYjB9t","AmdQdn1pmO","KZamH45cIH","v2eC32ZHdk","zY1GYpmeCd","jzUqRfaHir","v8yFNi7WMQ",
+"QworublLA9","lweGya00b5","07n1cCdyBV","ZJTXHIBe8k","ulk41RsQUq","POUYSaez9y","HfyNQPb1pa","W3VFHIBe8k","2TRI7ulk41","OUqFMlweGy",
+"rz7UtlsQGo","QWxoTRkQke","Q6hMCuoStw","0ao3lU3yw5","y94nwuvf7A","7lUXZblLA9","atef2IjTwP","bZLvSS77LH","OxWIHPOUYS","S77LHrKDLJ",
+"IRh48qQxHP","WmadAWmadA","gdQsSY1mC0","8FmFHCqqaD","ksJbyKASQ8","uZPqgtlILt","Uvlv4jS1aj","xReectaOXK","atef29y4lw","14FLRqQxHP",
+"TCgPpwiHrZ","HRxd8M6qcG","s4786EdBKc","W7cTsa00b5","VerEAL7cGc","NAFuw618Di","TCgPpni2v1","EdBKcFnPFB","Vprf28FmFH","uAWypgtCA5",
+"s7MxkfFDrJ","lCMxy64s8N","Chuy3zQt6Q","uoStwIKxdL","KsjRKYjB9t","MojnPEoToP","MK07YpWiOs","4QMc9zFgtB","IBe8kFFDui","n8pJ9U3yw5",
+"euZA5uN6r3","In3NSciuWz","jfREuwiHrZ","zQt6QLewvM","kB5nPMmKGJ","zHF1qfLNg8","MezSWoVQp6","EOE1ojSjS3","GrDg7POUYS","M3zXLhi5X7",
+"aDGtSIn3NS","nFqikhE1Ql","lpF6WMezSW","8FmFHzqH0W","lViBvpv0i7","TXQ0ZbrhlQ","24ARFKZamH","Oz8yZt98iW","CIShG0PktI","okgRigIYvE",
+"14FLRGWqqX","FPfSECqqaD","ciuWzVLTy6","5Mg9rzHF1q","0h1b14W0Tl","pAhR1lj07Q","QbxXcMmsIo","VIlwPjSjS3","euZA5QssNC","a00b5NhXdu",
+"FFDuiokgRi","GSQwjY1mC0","k85Aesx5Gl","5drc6lweGy","bZLvSZzJHW","uupzkF6PT2","RACuj618Di","mX2GEIRh48","MaJQsfcwDa","RpBQmQ6hMC",
+"pvgjSm4bxU","gtCA5Waim6","BGaQY24ARF","ZuDtDReKEW","LbRTHlm0pD","b29RJYf2Ec","Y1mC0rKDLJ","hYBCK7fsYM","lkMUAAmdQd","Q6LixuoStw",
+"fFDrJAkKTk","FFDuisqVrf","8TxD7NhXdu","n1pmOaL6AJ","CNHmvO3iyQ","s93Mlsoy9t","kB5nP2Yz7E","qaofNn1pmO","55rfBdQ586","Waim6IRh48",
+"8hJdtZhwG1","brhlQ7X3uy","iKqhrhYBCK","suY4xb29RJ","gtCA5s7Mxk","14FLRzqH0W","x3LDe9XyT9","FLsphP6bcg","Kr8ysokgRi","M6qcG7Ow5C",
+"618Disx5Gl","ZhwG1EoToP","JXljWZv7z0","U3yw5uPX7G","IjTwPEoToP","fLNg8l83Ud","sx5GlRBhp0","Yh1hFOUqFM","580YD9eoRc","ogLgc5Mg9r",
+"1j5L8QYxC0","LDk6fDQimp","uoStwGWqqX","5nmWvWPmlx","t59lRpmeCd","jSjS3AmdQd","uLtKslXFOB","24ARFt59lR","y94nwGrDg7","ciuWze6e4z",
+"TXQ0ZtAOsr","aL6AJ3weIF","lXFOBfcwDa","h1zcHPOUYS","o8UyduoStw","NOHszv2eC3","8xEKzJKWYR","KZamH7Ow5C","s4786LewvM","FLsphpiJSk",
+"FxX9qtvdkD","zmLYDJIqXi","lXFOBzHF1q","qQxHPtaOXK","ulk41ZJTXH","pWiOsK4GS8","JKWYRKsjRK","B3qemsx5Gl","uvf7AHP433","i7WMQhi5X7",
+"QYxC05VZjS","FLsphFwEJz","a00b5QYxC0","uN6r35IhmG","ZhwG1HzZT8","0YAGHjS1aj","9y4lwY1mC0","Y1mC0zz4ZU","aDGtS1j5L8","AOgEeuupzk",
+"Pb1paXyPZN","SbRYyVNCPd","fcwDaSbRYy","0YAGHIRh48","v2eC3nFqik","gIYvE1LB1L","C2Ircpv0i7","0YAGHaez9y","3weIF5Namm","Q6LixwDajX",
+"RBhp07fsYM","S77LHDcpWB","1LB1LZJTXH","DLhzM5nmWv","5nmWvzQt6Q","aFFsszFgtB","Gv3FqFjHXR","Ul4a1hSSvQ","iwzGk8RCUA","Z4I1vjSjS3",
+"y94nwokgRi","JkzUnTa8f6","YOfrY7fsYM","MmKGJrKDLJ","1j5L8VIlwP","jzUqRU3yw5","Kr8yszbIYY","G1RhSOz8yZ","KZamHx3LDe","nlaByIRh48",
+"YjB9tZzJHW","RpBQmiwzGk","45cIH5drc6","8xEKzvkCHH","zz4ZUSWfou","Yf2EcCIShG","ciuWzDG4sT","5Mg9rt59lR","CxVEfMm8si","1LB1L4QMc9",
+"Ta8f664s8N","CdyBVZ4I1v","pT8wuMGlTF","QChxsuTacx","CK5W7JJs5m","MezSWsqVrf","M6qcGRsQUq","tlILt55rfB","ZUnqtxXTI4","Vprf2BpYhV",
+"he9IAoQ87r","yluBxhYBCK","aDGtStAOsr","0PktID6rBy","fmIK1v8yFN","xciqpW7cTs","yofH3FjHXR","WaWsvrKDLJ","vkCHHLDk6f","KZamHKsjRK",
+"Yw2oUrz7Ut","o8UydPb1pa","he9IARpBQm","8RCUAJkzUn","VIlwP24ARF","pT8wuDz1R3","DcpWBReKEW","SbRYy7ku1p","lCMxy14FLR","uTacxK20wK",
+"QworuMezSW","m4bxU7Ow5C","qUJMdF6PT2","aDGtSpFrrl","55rfBxciqp","45cIHv2eC3","ReKEW6q6L9","mz8gxbgJAz","bZLvS55rfB","GSQwjxReec",
+"gjUTuIjTwP","uoStwNAFuw","VIlwPhe9IA","hYBCKQ6hMC","uoStwblLA9","WDVWJQYxC0","jtn0XMezSW","cQOnvaL6AJ","RxrsmVLTy6","8cVD38U2nU",
+"uQIczlj07Q","SWfoublLA9","Q6LixIRh48","zmLYD5VZjS","iwzGkeuZA5","cQOnvEOE1o","2hEEUFLsph","cL0aEGXdoH","YjB9tRsQUq","W7cTsVprf2",
+"VerEA0ao3l","M6qcG5Namm","aL6AJuJScX","K20wKzFgtB","UmaEvlCMxy","JJs5mEdBKc","SWfouQClRL","AgJHQvOqCE","45cIHKZamH","gIYvEOz8yZ",
+"FcWrWQ6hMC","WaWsvCNHmv","55rfBPYBf4","faHirgf8rI","MmKGJdQ586","FjHXREOE1o","zQt6QIBe8k","sx5GlnlaBy","hYBCKBbwgA","lpF6WMaJQs",
+"5ZaEzQChxs","k85AeDcpWB","Yf2EcFVMxo","4QMc9uN6r3","9rlg9M3zXL","dQ586Zv7z0","FxX9qcQOnv","iB08lhE1Ql","Nxx9VDG4sT","Twanoi3pyd",
+"TXQ0Z580YD","2ZHdke6e4z","0YAGHGWqqX","k85AeZuDtD","2DREs0Kyfs","hSSvQFVMxo","CNHmvhSSvQ","SjskQrKDLJ","CIShGDcpWB","HlUbFcQOnv",
+"DQimpVprf2","FNYIMKZamH","K4GS8sqVrf","DG4sTKr8ys","iwzGkB3qem","tAOsrNOHsz","9XyT9gf8rI","gtCA5qQxHP","lkMUAY1mC0","WDVWJFjHXR",
+"FNYIMtjQxs","NhXduqUJMd","s7MxkfLNg8","vOqCEMaJQs","4dEz62TRI7","ZUnqtlCMxy","8xEKz2TRI7","FjHXRi7WMQ","yluBx8hJdt","GWqqXVprf2",
+"dQ586ZuDtD","4dEz6xReec","nlaByjzUqR","aFFssJJs5m","55rfBQworu","aDGtSUvlv4","QChxs7fKYU","guMb8nFqik","aDGtSFNYIM","UlU3MqaofN",
+"fLNg8SWfou","vLsmSpv0i7","pWiOs7ku1p","fcwDaJXljW","RsQUq8FmFH","oQ87rQYxC0","GXdoHCqqaD","l83UdsqVrf","KZamH2hEEU","Q6hMCHzZT8",
+"AmdQdFVMxo","CIShGLewvM","zqH0WlViBv","2Yz7EuN6r3","Yf2EcFhtgl","RBhp0FjHXR","UlU3MKr8ys","nlaBy0BmCy","i7WMQWaim6","bgJAzYf2Ec",
+"lj07QlweGy","BGaQYbZLvS","SmGzvl83Ud","h1zcHrhl0J","guMb8tAOsr","k85Aemz8gx","RBhp08cVD3","S77LH0BmCy","iKqhr14FLR","ECMvUkB5nP",
+"RkQke2TRI7","FcWrWtAOsr","fFDrJY1mC0","fcwDa0Kyfs","W7cTsZv7z0","dmoS7U3yw5","jfREuvOqCE","dhSuH8FmFH","Yf2Ecy94nw","AmdQdEdBKc",
+"OUqFMnnP8o","HRxd8OxWIH","Pb1paRpBQm","dmoS7ThjNn","FxX9q2hEEU","ciuWzIn3NS","24ARFQbxXc","TCgPpRzaZA","RACujVjCZq","RkQkecQOnv",
+"uupzkfmIK1","Pb1paOHaBz","dhSuHLewvM","2Yz7EzQt6Q","lkMUAeuZA5","ksJbyMkgy8","TwanoW7cTs","ulk412Yz7E","dQ5862Nslm","fcJOyNAFuw",
+"DG4sTqQxHP","GrDg7FVMxo","EoToPMGlTF","B3qem7fsYM","BCxeCQWxoT","Chuy38U2nU","O3iyQdjsrv","VIlwPzbIYY","HlUbF64s8N","580YDwDajX",
+"SjskQNcICA","dhSuHd7vjM","Yf2Eclm0pD","e6e4z0MR5X","lsQGoYjB9t","v1Hln2TRI7","BpYhVNOHsz","fFDrJm4bxU","FVMxoRpBQm","LDk6fl83Ud",
+"W3VFH8FmFH","v8yFNCqqaD","7Ow5COxWIH","POUYSlkMUA","5VZjSFVMxo","yToGWv2eC3","oVQp62DREs","FjHXRGWqqX","Yw2oUEoToP","7hyVv5VZjS",
+"xReechSSvQ","RzaZAs7Mxk","DG4sTk85Ae","euZA5jfREu","VLTy6soy9t","brhlQVjCZq","a00b5AIYUu","5Drn0Twano","FjHXRv2eC3","hSSvQQClRL",
+"xciqp7fsYM","suY4xru4UG","9y4lwokgRi","rKDLJMmsIo","DQimpmX2GE","KZamHTXQ0Z","yEfy9QChxs","lkMUAbrhlQ","DQimphE1Ql","TCgPpo8Uyd",
+"EOE1oIjTwP","VNCPd2hEEU","v1Hlnl83Ud","UlU3MyluBx","0KyfsFwEJz","CIShG2ZHdk","SWfoulsQGo","QnJ1SFwEJz","YjB9tgjUTu","9GXkXqaofN",
+"9y4lwlj07Q","ciuWzcL0aE","FnPFBzz4ZU","nnP8oAkKTk","ZJTXHFwEJz","BpYhVQssNC","Mm8sicQOnv","rKDLJ7lUXZ","JJs5mblLA9","lXFOBHzZT8",
+"Kr8ysSbRYy","soy9t4dEz6","nnP8ok85Ae","JkzUnS2Dfu","guMb8jiVBP","FwEJzfqypy","BpYhVMezSW","KsjRKx3LDe","tl72WSbRYy","jfREublLA9",
+"1LB1L5ZaEz","GWqqXy94nw","L7cGcdmoS7","gjUTuhYBCK","VjCZq1v5hH","24ARF2DREs","5VZjS1LB1L","EoToPuAWyp","M3zXLjtn0X","hi5X7tl72W",
+"W7cTssx5Gl","nnP8oxciqp","2Yz7EazIWp","G1RhS7hyVv","atef29iGoT","PYBf4azIWp","JkzUnogLgc","WMiS3KsjRK","5iGN5VBjhz","nnP8ohUTw7",
+"guMb8uoStw","pvgjSReKEW","uoStwuJScX","Mkgy8Rxrsm","jtn0Xiqv4k","m4bxUTa8f6","RpBQmAmdQd","Mm8si9y4lw","bZLvS8FmFH","RBhp02Yz7E",
+"jzUqR0Kyfs","8cVD31j5L8","CK5W7o8Uyd","MmsIoguMb8","zbIYY8U2nU","SjskQStlDJ","6AFT09iGoT","VerEAQ6Lix","24ARFNxx9V","RBhp0XflUq",
+"K4GS83weIF","0MR5XQYxC0","1v5hHAOgEe","dQ586QbxXc","BFkb8NOHsz","MezSWJIqXi","hE1QlPYBf4","VNCPds4786","suY4xtjQxs","MezSWTwano",
+"24ARFsuY4x","ZJTXHwDajX","GrDg79rlg9","BbwgAJ2mQi","s47869eoRc","FjHXRG1RhS","Mkgy8ulk41","yofH3GWqqX","ru4UGK4GS8","JKWYRRsQUq",
+"EoToP0Kyfs","gtCA59eoRc","fcJOyvkCHH","SjskQ4dEz6","n1pmOjzUqR","F6PT2zHF1q","gtCA5SjskQ","gtCA59rlg9","fqypywDajX","MaJQsDLhzM",
+"1LB1LJKWYR","lweGy5VZjS","tl72W4dEz6","d85a90ao3l","No0QbMezSW","oQ87rReKEW","Y1mC0DQimp","9GXkXGXdoH","5VZjSjiVBP","O3iyQ7hyVv",
+"FwEJzgIYvE","ix74rogLgc","RkQket59lR","TCgPpQbxXc","MGlTFOUYuF","lpF6WcShY2","e6e4zaez9y","Yw2oUxReec","qaofNEoToP","OUqFMlpF6W",
+"KZamH5IhmG","In3NS0YAGH","QYxC0CNHmv","GXdoHokgRi","tlILtG1RhS","xXTI4dQ586","fLNg8oVQp6","SmGzvlj07Q","d7vjMgtCA5","ThjNnRBhp0",
+"aez9yJ2mQi","VBjhzHRxd8","qQxHP0h1b1","Mm8si1j5L8","lH1ktIBe8k","0h1b1pv0i7","dQ586KZamH","IKxdLLewvM","29QAzpAhR1","VLTy6RzaZA",
+"zQt6QfmIK1","AkKTkAXpwE","MGlTFMm8si","h1zcHPYBf4","Yh1hFEoToP","5VZjSK4GS8","ru4UG0BmCy","4QMc9JkzUn","FLsphaDGtS","NOHszSjskQ",
+"i7WMQW7cTs","VNCPd0YAGH","MaJQsoGu6x","GSQwjSmGzv","brhlQe6e4z","9rlg9lXFOB","xXTI4OUYuF","pvgjSBCxeC","ni2v17fKYU","guMb8brhlQ",
+"EoToP6q6L9","NOHszpvgjS","SbRYyqUJMd","FwEJzfaHir","v1Hln9iGoT","CNHmvnnP8o","Ul4a1LDk6f","ReKEWUmaEv","MK07Ys93Ml","QworuM3zXL",
+"RsQUqdmoS7","Pb1paRsQUq","sx5GluLtKs","zFgtBGXdoH","uLtKslH1kt","ZuDtDKr8ys","nFqikbgJAz","vkCHHJJs5m","yvOMIRkQke","MezSWxciqp",
+"7ku1p0BmCy","xXTI4WaWsv","zmLYDDLhzM","sqVrfbrhlQ","rz7Utru4UG","i7WMQ48cHL","wDajXzQt6Q","5iGN5EdBKc","8TxD7d7vjM","EOE1obZLvS",
+"UmaEvECMvU","Waim6JKWYR","uPX7G2Yz7E","uoStw1j5L8","AmdQdt98iW","VBjhzO3iyQ","lm0pD9rlg9","618Di9XyT9","LbRTHzHF1q","d85a9FGzgp",
+"jeskSDG4sT","IjTwPa00b5","RBhp0WmadA","GWqqXNOHsz","pT8wuZzJHW","Cp3mZlkMUA","qQxHP8U2nU","pWiOsNxx9V","zmLYDFFDui","8TxD7xReec",
+"dQ586FNYIM","fLNg8NcICA","Zv7z0D6rBy","ZJTXHiB08l","HP433nFqik","618Di8cVD3","QYxC0atef2","pmeCdThjNn","POUYSni2v1","4dEz6ksJby",
+"uupzkBFkb8","o8UydAmdQd","DQimpzbIYY","rKDLJThjNn","5VZjShe9IA","lsQGo8FmFH","wDajXvOqCE","F6PT2Yf2Ec","s7MxknnP8o","lm0pDYh1hF",
+"EoToPix74r","CdyBVtl72W","8RCUAdmoS7","5ZaEzNOHsz","FnPFBs93Ml","FcWrWhi5X7","lkMUA24ARF","CqqaDuoStw","lweGycQOnv","1v5hHlViBv",
+"FhtglS2Dfu","JkzUnlCMxy","xXTI4aL6AJ","JXljW1j5L8","hSSvQIBe8k","4W0TlJJs5m","45cIHksJby","7fsYMtAOsr","iqv4kd85a9","dQ5869GXkX",
+"t59lRuoStw","Yf2EczY1GY","P6bcgsx5Gl","ZuDtDfcJOy","ZhwG1ciuWz","ciuWzoQ87r","d85a99rlg9","zmLYDrz7Ut","IjTwPMGlTF","1j5L86q6L9",
+"l83UdMm8si","9iGoT2ZHdk","8cVD329QAz","zQt6Q2TRI7","v2eC3GWqqX","Kr8ysQYxC0","yofH3OHaBz","4W0TlP6bcg","Ul4a1suY4x","DcpWBn8pJ9",
+"fLNg8BbwgA","xciqpRmDcr","SbRYyRzaZA","hUTw7vOqCE","WmadAChuy3","K20wKsqVrf","M6qcGSWfou","DLhzMBpYhV","B3qem5VZjS","EoToP4dEz6",
+"IRh48Zv7z0","6AFT0MGlTF","AgJHQQbxXc","HzZT8OHaBz","AmdQdCK5W7","JXljWiKqhr","Pb1paCNHmv","mX2GEFVMxo","Mkgy8QYxC0","i3pyd8cVD3",
+"580YDTwano","WmadAn1pmO","uPX7GuQIcz","RzaZAD6rBy","cShY2oGu6x","DQimp7fKYU","jzUqRTXQ0Z","gdQsS8hJdt","Nxx9V64s8N","lH1ktEoToP",
+"RsQUqAkKTk","sqVrfCfgr3","RmDcrvkCHH","pmeCdguMb8","K20wKQbxXc","2Yz7EdhSuH","QworuydG8U","ix74rQssNC","7X3uylm0pD","zmLYD1LB1L",
+"AIYUu5Mg9r","o8Uyd7fKYU","0PktI5nmWv","RsQUqe6e4z","5nmWvvLsmS","DQimphUTw7","StlDJPYBf4","xXTI4MGlTF","fcJOyHRxd8","yEfy9YOfrY",
+"64s8NaL6AJ","tl72Wo8Uyd","Vprf2Mm8si","fLNg8he9IA","2hEEU9eoRc","C2IrcSbRYy","brhlQulk41","blLA9OUqFM","ix74rW3VFH","IjTwPI7p2a",
+"fFDrJO3iyQ","ydG8Uy94nw","2hEEUeuZA5","pAhR1tAOsr","iKqhryEfy9","7fsYMZJTXH","5Mg9rhe9IA","t59lRaez9y","v2eC3v2eC3","Vprf2djsrv",
+"pmeCduoStw","SWfouHfyNQ","0YAGHFPfSE","jiVBPgdQsS","HzZT8lj07Q","tAOsrJkzUn","s93MluN6r3","atef2v8yFN","5Drn0prNT6","ZJTXHmz8gx",
+"8cVD3KASQ8","5iGN59GXkX","WaWsvkZANm","yToGWQnJ1S","JJs5mNxx9V","FFDuiQWxoT","5VZjSqaofN","5Mg9rDG4sT","ECMvU0Wr5y","YjB9t7X3uy",
+"TXQ0ZSbRYy","xciqplweGy","Waim6dhSuH","fLNg8GXdoH","In3NS2Nslm","IRh48xReec","JRJQBVLTy6","lXFOBVjCZq","MmKGJdpe1v","JRJQBFVMxo",
+"JRJQBmz8gx","K20wKFnPFB","v8yFNOHaBz","K4GS8WPmlx","3weIFoGu6x","YOfrYfFDrJ","Uvlv4sx5Gl","SjskQMmsIo","TXQ0ZNOHsz","AOgEerz7Ut",
+"hYBCKbgJAz","zHF1qyToGW","uupzkpT8wu","gtCA5hUTw7","8hJdtnlaBy","hUTw7pvgjS","XyPZNCIShG","QChxssuY4x","Pb1pavkCHH","FPfSEQworu",
+"rz7UtVBjhz","djsrvFxX9q","cQOnvP6bcg","FPfSE0ao3l","0PktIe6e4z","NhXdu9GXkX","lkMUAqUJMd","ZUnqtyluBx","tlILtciuWz","BFkb8faHir",
+"RxrsmiB08l","pv0i70BmCy","Q6LixVLTy6","7hyVvBGaQY","5nmWv618Di","29QAzb29RJ","dhSuHvOqCE","J2mQiGv3Fq","VjCZqlCMxy","Oz8yZSs0Zu",
+"rKDLJgdQsS","J2mQifmIK1","h1zcHMaJQs","he9IANcICA","tlILtcQOnv","5IhmGRmDcr","zbIYYWmadA","S77LHZuDtD","OHaBzIjTwP","s7MxkKr8ys",
+"fLNg8qaofN","tl72WfLNg8","RsQUqokgRi","CK5W7HfyNQ","GSQwjOz8yZ","QYxC02TRI7","2TRI7IKxdL","Mkgy8rKDLJ","BpYhVQClRL","jtn0XHzZT8",
+"HfyNQuZPqg","hUTw7kZANm","ZhwG1n8pJ9","zmLYDFVMxo","zQt6QyvOMI","UlU3MvkCHH","QnJ1StAOsr","16lHcQ6Lix","uZPqgTa8f6","fmIK1Cp3mZ",
+"tl72W07n1c","WaWsvDLhzM","16lHce6e4z","VLTy6hSSvQ","RkQkeFcWrW","Mkgy8JKWYR","ix74r0PktI","b29RJlViBv","8RCUAZzJHW","JKWYRsx5Gl",
+"t98iWQworu","YjB9ts4786","2Yz7E7hyVv","W7cTsvkCHH","3weIFStlDJ","uoStwReKEW","HzZT8cL0aE","l83UdprNT6","pT8wutuDyS","fFDrJAmdQd",
+"ni2v1s4786","jfREuv2eC3","8U2nUYjB9t","i7WMQJIqXi","ZuDtDh1zcH","taOXKh1zcH","MGlTFDcpWB","t98iWgtCA5","5IhmGcL0aE","FnPFB16lHc",
+"JJs5mNhXdu","YjB9t7fsYM","okgRisoy9t","AmdQduZPqg","5ZaEzgjUTu","yluBxIRh48","vkCHHjS1aj","Q6LixBFkb8","FwEJzThjNn","VBjhzFGzgp",
+"vLsmSKr8ys","KASQ8RzaZA","VLTy69iGoT","I7p2aiB08l","oQ87r9eoRc","JRJQBtl72W","s93Mli7WMQ","QClRLpmeCd","24ARFv1Hln","ksJbytAOsr",
+"gtCA5S2Dfu","Ul4a1cL0aE","FVMxoVprf2","45cIHGXdoH","zY1GYSWfou","WMiS316lHc","tuDySeuZA5","Vprf2YOfrY","MaJQs14FLR","x3LDeRpBQm",
+"RACujNhXdu","lkMUAB3qem","EoToPOUYuF","2DREsrKDLJ","OUYuF2DREs","l83UduJScX","dpe1vDz1R3","S2DfuTwano","pv0i7iKqhr","AkKTkYOfrY",
+"pmeCdzmLYD","1LB1LQWxoT","DG4sTFnPFB","QYxC09GXkX","Ss0ZuMaJQs","5IhmGTa8f6","5nmWvAIYUu","MGlTFQChxs","hYBCKyvOMI","n1pmOWaim6",
+"3otm6aDGtS","DLhzMfqypy","WreyPvLsmS","MezSWYh1hF","MK07YtjQxs","BpYhVGXdoH","Waim6k85Ae","RsQUqyvOMI","JIqXijS1aj","cL0aEprNT6",
+"MGlTFazIWp","K20wKRBhp0","gdQsSBCxeC","lsQGoxciqp","xXTI4BbwgA","BbwgApiJSk","5nmWvVIlwP","wiHrZS77LH","RpBQmcQOnv","580YDciuWz",
+"kB5nPTa8f6","S77LHG1RhS","gtCA56AFT0","WaWsvKZamH","uTacxDz1R3","Yf2Ectl72W","24ARFJXljW","MezSW14FLR","FLsphWmadA","pT8wuFGzgp",
+"pT8wuJkzUn","BpYhVyEfy9","Mkgy8fcwDa","prNT6UmaEv","GSQwj45cIH","zQt6Q8TxD7","d7vjM2hEEU","VNCPd5Drn0","LDk6fNxx9V","cmXIXOUqFM",
+"lj07QThjNn","yluBxlweGy","MGlTFNOHsz","45cIHQbxXc","hE1Ql1j5L8","0h1b1hYBCK","S77LHYf2Ec","gdQsSO3iyQ","Q6hMC14FLR","FLsphWaWsv",
+"tuDySEoToP","ECMvUKASQ8","5IhmGSjskQ","DG4sT24ARF","y94nwCp3mZ","Ss0ZuHlUbF","5Mg9rhE1Ql","5Drn0D6rBy","QYxC05Namm","CqqaDdpe1v",
+"uAWypcmXIX","0PktIS2Dfu","aez9yHRxd8","HzZT8ksJby","Q6LixfFDrJ","faHirFhtgl","FjHXRWaWsv","No0QbprNT6","IjTwPru4UG","k85AeQbxXc",
+"RzaZA5ZaEz","KsjRKJRJQB","rz7UtThjNn","2hEEUuQIcz","5NammFxX9q","bZLvSRpBQm","ogLgcQworu","FLsphMmKGJ","tlILtn8pJ9","ThjNnfFDrJ",
+"7ku1plpF6W","Rxrsmrz7Ut","HRxd8HRxd8","M3zXLVNCPd","lViBvjfREu","DcpWBStlDJ","D6rByK4GS8","jfREu14FLR","yluBx0Wr5y","FwEJza00b5",
+"jSjS3a00b5","C2IrcrKDLJ","jiVBPjS1aj","Ta8f62hEEU","QWxoTaez9y","WPmlx5ZaEz","jzUqRYw2oU","qaofNblLA9","ZzJHW8FmFH","7fKYUWaWsv",
+"KZamHFPfSE","uJScXL7cGc","vkCHHNOHsz","9eoRcJ2mQi","StlDJ1v5hH","ThjNnlpF6W","guMb8L7cGc","jzUqRzbIYY","tjQxsh1zcH","ZJTXHn8pJ9",
+"OxWIHcShY2","MmKGJU3yw5","CIShG29QAz","gf8rIogLgc","8TxD7zmLYD","ix74raez9y","taOXKs93Ml","QChxsS2Dfu","oGu6xnlaBy","WDVWJjeskS",
+"ciuWz2Nslm","d7vjMHfyNQ","0h1b1vkCHH","cShY2HRxd8","Vprf2lCMxy","FGzgpKASQ8","Z4I1vn8pJ9","sqVrfoQ87r","NAFuwRBhp0","xciqpVerEA",
+"fqypy5drc6","IBe8kjSjS3","Cfgr3gIYvE","tjQxsHRxd8","suY4x4QMc9","4QMc9KASQ8","Yf2EcoVQp6","CK5W7ZuDtD","1v5hH8TxD7","0h1b1IKxdL",
+"BGaQYdjsrv","lj07QAXpwE","s4786OHaBz","hi5X7iwzGk","euZA5fcJOy","Z4I1vk85Ae","7hyVvrz7Ut","45cIHBCxeC","FxX9q9XyT9","7fKYUThjNn",
+"X6Pingf8rI","45cIHZJTXH","5VZjSogLgc","Ss0ZufmIK1","6AFT0QnJ1S","1j5L8DQimp","S77LHaFFss","s93Ml7ku1p","HlUbFFjHXR","HfyNQQClRL",
+"cShY2WaWsv","aFFsscShY2","5NammQClRL","MK07Y14FLR","CNHmvhi5X7","55rfBru4UG","K20wKMK07Y","FwEJzb29RJ","LbRTHdmoS7","HP433fqypy",
+"oVQp6iKqhr","VIlwPuTacx","S2DfufaHir","0Wr5yZuDtD","5ZaEzaez9y","WPmlxzmLYD","VNCPdC2Irc","tlILtaez9y","zbIYYzFgtB","55rfBCqqaD",
+"s4786uupzk","1LB1LuTacx","9XyT95ZaEz","zqH0W580YD","NcICAHzZT8","ZJTXHQnJ1S","Cfgr3FxX9q","K4GS8SmGzv","lCMxyPYBf4","580YDWDVWJ",
+"8xEKz8RCUA","RsQUqAXpwE","ZUnqtS77LH","zz4ZU0MR5X","vLsmSM6qcG","WPmlxnnP8o","Ss0Zujtn0X","fcJOyS77LH","2TRI7RpBQm","SjskQiKqhr",
+"0YAGHMmsIo","okgRiVIlwP","3otm6d7vjM","tjQxsPOUYS","ix74riKqhr","ZUnqtECMvU","5ZaEzHzZT8","45cIHZhwG1","FLsphcL0aE","tuDySDQimp",
+"BCxeCguMb8","fqypyaez9y","iKqhrsuY4x","VerEAZJTXH","IjTwP1j5L8","uLtKsy94nw","JJs5mi3pyd","X6PinmX2GE","HlUbFe6e4z","lkMUA7fsYM",
+"yToGWxReec","IKxdLxReec","ru4UG7X3uy","MezSWfcJOy","Q6hMClH1kt","iqv4kKASQ8","yEfy90BmCy","fcJOyokgRi","XyPZNI7p2a","Kr8ysuZPqg",
+"8xEKzjzUqR","uvf7ARkQke","wiHrZAOgEe","cL0aEWaWsv","M6qcGprNT6","rKDLJksJby","WPmlxXflUq","k85AefcwDa","bgJAzzz4ZU","Q6hMCRACuj",
+"aDGtSBCxeC","s7MxkjSjS3","cmXIXMm8si","BbwgAnlaBy","8hJdtUl4a1","4QMc9WPmlx","jiVBPm4bxU","SWfouoGu6x","AXpwE5VZjS","L7cGcCK5W7",
+"55rfBSmGzv","atef2kZANm","vOqCEGrDg7","4W0TlQbxXc","ogLgcgtCA5","1v5hHhSSvQ","24ARFaFFss","ThjNnjiVBP","hYBCKlweGy","Waim6ulk41",
+"jfREu2Nslm","BGaQYhUTw7","lkMUAOUqFM","FxX9qsqVrf","sqVrfDLhzM","GWqqXlpF6W","5ZaEz5drc6","W3VFHGrDg7","7ku1pvkCHH","ru4UGyluBx",
+"mX2GEBpYhV","tl72WsqVrf","h1zcHfcwDa","0YAGHk85Ae","v2eC3uQIcz","Vprf2HRxd8","lViBvvkCHH","AIYUuFPfSE","taOXKQWxoT","v8yFNCK5W7",
+"Cp3mZ64s8N","nnP8o5nmWv","HP433fcwDa","fcJOyBGaQY","JIqXiFhtgl","gtCA52DREs","fLNg8jeskS","hi5X7RpBQm","64s8NZhwG1","FFDuilsQGo",
+"ksJbya00b5","MaJQs2Nslm","ydG8UQClRL","lm0pDMK07Y","iKqhrhe9IA","5VZjS0MR5X","fFDrJ3otm6","FFDuiMGlTF","CdyBVUmaEv","iKqhrQYxC0",
+"uLtKssuY4x","v1Hln3otm6","fmIK1Rxrsm","UmaEvni2v1","FjHXRIjTwP","48cHL0Wr5y","O3iyQK20wK","RzaZA8FmFH","DLhzMlj07Q","Z4I1vTa8f6",
+"ksJbyulk41","2Yz7EfLNg8","i3pydJ2mQi","L7cGcTwano","0MR5XtjQxs","CxVEf9XyT9","7Ow5C0PktI","FLsphIRh48","nnP8oZuDtD","1j5L8t59lR",
+"7ku1pgtCA5","Nxx9Vl83Ud","KZamHQ6hMC","8U2nULewvM","h1zcHuTacx","EdBKc7fKYU","FVMxoJKWYR","pT8wu14FLR","B3qemRzaZA","J2mQiv8yFN",
+"Zv7z0W3VFH","07n1cs4786","YjB9tdjsrv","KsjRKJIqXi","pAhR1yToGW","k85AepAhR1","Nxx9V7fsYM","jzUqRWPmlx","azIWpb29RJ","uZPqgt98iW",
+"0MR5XZ4I1v","RxrsmRBhp0","618DicL0aE","dmoS7cShY2","dmoS7zz4ZU","Q6hMC9XyT9","lsQGoC2Irc","vkCHHJKWYR","QbxXczbIYY","yofH3lkMUA",
+"uupzkD6rBy","pFrrlAkKTk","xciqpQWxoT","0PktIWreyP","2hEEUSWfou","2hEEUSjskQ","MojnP0YAGH","wiHrZ3weIF","MojnPFxX9q","djsrv7ku1p",
+"uLtKspAhR1","nFqikAIYUu","ZuDtDtjQxs","guMb8tjQxs","t59lRbrhlQ","ulk41O3iyQ","v1HlnuZPqg","ZzJHWB3qem","UmaEvZJTXH","zz4ZUUl4a1",
+"taOXKW7cTs","nFqikL7cGc","ZuDtDzqH0W","aez9yoGu6x","nFqikhUTw7","Vprf2zHF1q","CIShGsx5Gl","mX2GEQ6hMC","WPmlxYf2Ec","AOgEesuY4x",
+"S2Dfu6AFT0","Q6hMC8cVD3","l83UdOxWIH","fqypyGWqqX","GWqqXZzJHW","UlU3MDLhzM","55rfBAkKTk","5drc67X3uy","Yh1hFzFgtB","0PktIdpe1v",
+"cQOnv1v5hH","AIYUu3weIF","GWqqXW7cTs","Ul4a1uTacx","dpe1vYOfrY","VLTy6ZUnqt","Waim6x3LDe","0PktIVjCZq","DQimpYh1hF","29QAza00b5",
+"IBe8k2Yz7E","618DiuoStw","uupzkNo0Qb","8TxD7JXljW","5iGN5hi5X7","EdBKc16lHc","W3VFHMaJQs","2Yz7Eb29RJ","S2DfuzQt6Q","DLhzMwiHrZ",
+"Ss0ZuQChxs","EOE1ooQ87r","zFgtBhUTw7","55rfBUl4a1","WMiS36q6L9","UlU3MnnP8o","07n1cguMb8","jiVBPuJScX","OUYuFYw2oU","lsQGo8hJdt",
+"a00b5uN6r3","NhXdu8TxD7","azIWpRzaZA","fLNg80MR5X","Mkgy8Ta8f6","lpF6WaFFss","QWxoTlViBv","oVQp6WmadA","5iGN5prNT6","fcJOySbRYy",
+"8FmFHHzZT8","Pb1paFFDui","Waim6QChxs","Q6hMCwDajX","iKqhrCNHmv","LewvMTa8f6","WaWsv0ao3l","OUqFMAmdQd","pT8wuVerEA","tjQxse6e4z",
+"5Mg9rZv7z0","cmXIXs4786","ECMvU9rlg9","Yw2oUMaJQs","x3LDeiB08l","Mkgy8dhSuH","ix74rM3zXL","1j5L8WPmlx","sx5GlcQOnv","8U2nUCp3mZ",
+"WDVWJOHaBz","nnP8oVLTy6","jtn0XW7cTs","rhl0JlXFOB","TCgPpTa8f6","fFDrJtl72W","soy9t9GXkX","ECMvUS2Dfu","NAFuwd7vjM","BGaQYCNHmv",
+"n8pJ9Yw2oU","WaWsvzz4ZU","iKqhrjS1aj","lCMxyVBjhz","qaofNyluBx","hSSvQzz4ZU","3weIFguMb8","zqH0W7Ow5C","9eoRcix74r","pAhR1AmdQd",
+"DcpWBni2v1","6q6L9ZUnqt","cShY2CK5W7","AIYUuiqv4k","uoStwuPX7G","m4bxUpmeCd","PYBf4nlaBy","bgJAzEoToP","RmDcrtAOsr","pv0i75iGN5",
+"ni2v1tl72W","okgRiFNYIM","BFkb8CIShG","580YDaL6AJ","yToGW1LB1L","gjUTuVIlwP","fLNg8pAhR1","zFgtBfmIK1","FxX9qlH1kt","Ta8f6zHF1q",
+"wDajXcShY2","x3LDetl72W","MaJQsRACuj","ydG8UZzJHW","F6PT2JKWYR","WDVWJAOgEe","LewvMpvgjS","oQ87rv8yFN","OUqFMgjUTu","lj07Qdjsrv",
+"jS1ajy94nw","AgJHQOz8yZ","piJSk9GXkX","8xEKzfqypy","Qworulj07Q","4W0TldhSuH","VNCPd1LB1L","IRh48O3iyQ","JKWYRIjTwP","B3qemgf8rI",
+"7ku1phSSvQ","zHF1qlCMxy","FcWrWWaWsv","FnPFBv8yFN","Qworuiqv4k","VjCZqHlUbF","Oz8yZuoStw","yluBx1j5L8","lm0pDjfREu","In3NSWPmlx",
+"YjB9t6q6L9","DLhzMYjB9t","zY1GYPYBf4","0YAGHHlUbF","TXQ0ZgdQsS","C2Irc5ZaEz","m4bxUaez9y","FhtglAIYUu","5iGN5hYBCK","X6PinfFDrJ",
+"pv0i71v5hH","0YAGHFNYIM","Q6Lixsx5Gl","GWqqX2hEEU","dmoS7VBjhz","YOfrY2DREs","m4bxUReKEW","S77LHAgJHQ","RACuj2hEEU","WmadAWaim6",
+"dhSuHMGlTF","fmIK11v5hH","s4786Dz1R3","MmsIoRpBQm","618DiMkgy8","5iGN5n8pJ9","euZA5MaJQs","VIlwPUlU3M","2DREsFPfSE","BGaQYKr8ys",
+"O3iyQRBhp0","ksJbylj07Q","07n1cI7p2a","AkKTkGrDg7","pmeCdjfREu","0PktII7p2a","IjTwPFjHXR","aL6AJJXljW","HfyNQZuDtD","kB5nPVIlwP",
+"qaofNQ6Lix","0MR5XNo0Qb","45cIH0h1b1","IKxdLpT8wu","0YAGHAOgEe","vOqCE0PktI","RmDcryToGW","prNT6Chuy3","n1pmO5Drn0","gtCA5G1RhS",
+"yToGWYjB9t","5IhmGazIWp","pT8wubgJAz","EoToPIKxdL","Cp3mZRzaZA","jSjS3HRxd8","n8pJ9M6qcG","OHaBzP6bcg","kZANmEOE1o","2Yz7EMmsIo",
+"fmIK1t59lR","t98iW8TxD7","lj07QDG4sT","piJSkvLsmS","n8pJ9jzUqR","5IhmGYjB9t","7hyVv5Mg9r","9eoRc3weIF","M6qcGQClRL","ix74rUl4a1",
+"uTacxjSjS3","CxVEf14FLR","8xEKzuoStw","v8yFNuAWyp","fmIK114FLR","ZhwG1euZA5","AOgEeaDGtS","atef20PktI","K20wKhE1Ql","C2IrcBbwgA",
+"AIYUuuZPqg","Nxx9VZJTXH","JKWYRni2v1","P6bcgZJTXH","rKDLJB3qem","In3NSxXTI4","L7cGcMGlTF","K4GS8dhSuH","Mm8si7lUXZ","Yw2oUOHaBz",
+"atef2lkMUA","618Di1v5hH","lpF6WrKDLJ","yEfy9zQt6Q","xReecFcWrW","s93MlECMvU","oGu6xpvgjS","618DidhSuH","Y1mC0pFrrl","5iGN5POUYS",
+"VjCZqP6bcg","OxWIHMGlTF","b29RJfcJOy","MezSW8xEKz","jfREuhi5X7","s93MlK20wK","Nxx9VFVMxo","jtn0X7X3uy","prNT6mX2GE","BCxeC8xEKz",
+"Zv7z016lHc","suY4xv2eC3","FNYIM7X3uy","FnPFBiKqhr","brhlQSWfou","kZANmYf2Ec","5drc6aFFss","0PktIgjUTu","9GXkXtvdkD","gtCA5gdQsS",
+"nlaByOUYuF","gtCA5M6qcG","FPfSEWaim6","e6e4zn8pJ9","7fsYMIRh48","jzUqRiqv4k","pWiOsZhwG1","IRh48AmdQd","2ZHdkBFkb8","48cHLsuY4x",
+"2hEEUfcwDa","1LB1LCfgr3","TwanonnP8o","Gv3FqlsQGo","BpYhVHP433","VLTy6iqv4k","a00b555rfB","580YDAOgEe","0YAGHYf2Ec","RpBQmIjTwP",
+"fqypylXFOB","piJSkCIShG","WaWsvAIYUu","9XyT9fLNg8","5NammWaWsv","8xEKzv8yFN","SWfoudjsrv","Yw2oUDcpWB","ix74rHRxd8","8TxD7In3NS",
+"Vprf2l83Ud","S77LHgIYvE","4dEz6Qworu","xXTI4X6Pin","zHF1qAkKTk","IBe8kWreyP","9eoRcDQimp","P6bcglXFOB","Pb1paYOfrY","t59lRSjskQ",
+"ZhwG1VNCPd","S2DfuJkzUn","KASQ8oQ87r","AkKTkS77LH","JRJQBzbIYY","y94nwi7WMQ","FhtglVerEA","07n1cYjB9t","KZamHnFqik","7lUXZBGaQY",
+"piJSkkB5nP","KsjRKlViBv","8xEKzAkKTk","2DREsdmoS7","VBjhz0PktI","8xEKzEOE1o","MezSWJJs5m","FxX9q0ao3l","xXTI4jiVBP","iqv4klm0pD",
+"AXpwENxx9V","StlDJKASQ8","lXFOBlpF6W","B3qem55rfB","9XyT97Ow5C","5NammyToGW","cL0aElpF6W","Pb1pa64s8N","aDGtSeuZA5","D6rBydmoS7",
+"FVMxodQ586","uQIcz618Di","okgRiJXljW","ZuDtDeuZA5","EoToPAIYUu","euZA5jSjS3","D6rBys7Mxk","HlUbFNOHsz","pmeCdTa8f6","uQIczRsQUq",
+"RpBQmzz4ZU","16lHcMaJQs","55rfBiwzGk","D6rByECMvU","uTacxeuZA5","OUYuFJRJQB","hYBCKK4GS8","NcICA2hEEU","YOfrYjeskS","qUJMduZPqg",
+"aez9yuTacx","Ul4a1ZJTXH","aFFsstvdkD","2ZHdk8hJdt","XyPZNm4bxU","guMb8SWfou","brhlQCdyBV","kZANmmz8gx","hUTw7I7p2a","gdQsSfaHir",
+"uZPqgK20wK","VIlwPIjTwP","tvdkD5Namm","pmeCd07n1c","uJScXRxrsm","t98iWXyPZN","uTacxv1Hln","blLA9ydG8U","4dEz6soy9t","7fKYUk85Ae",
+"XflUqk85Ae","a00b5vLsmS","MojnPVNCPd","Yw2oUzHF1q","9eoRc7X3uy","h1zcH5iGN5","YOfrYuZPqg","xReecNcICA","zmLYD4dEz6","azIWpBpYhV",
+"Gv3FqCxVEf","d7vjM4W0Tl","VerEAOUqFM","faHirQYxC0","t59lRRzaZA","mz8gxNAFuw","jSjS3Oz8yZ","KZamHKASQ8","atef2DLhzM","BCxeCdjsrv",
+"64s8NHlUbF","9XyT9bZLvS","HlUbF4dEz6","nnP8o9y4lw","jSjS3azIWp","AOgEeIn3NS","ni2v1Cfgr3","kB5nPRxrsm","k85AeOz8yZ","ksJbyhE1Ql",
+"iqv4k4dEz6","y94nwhSSvQ","EOE1oSjskQ","RpBQmL7cGc","M3zXLaDGtS","W3VFHrz7Ut","MojnPFVMxo","Q6LixIBe8k","suY4xBFkb8","TCgPpRxrsm",
+"gf8rICp3mZ","AOgEe0ao3l","brhlQJJs5m","Zv7z08U2nU","a00b55ZaEz","dQ586TCgPp","2Yz7ElpF6W","SmGzvmz8gx","tl72WkB5nP","8TxD7AIYUu",
+"jfREuF6PT2","6AFT0he9IA","7X3uyUlU3M","nlaByn1pmO","MGlTFOxWIH","uLtKsjeskS","iB08loQ87r","iqv4kFxX9q","uQIczRxrsm","mz8gxzqH0W",
+"JIqXiiwzGk","1LB1LIn3NS","64s8NhUTw7","XyPZNpvgjS","KZamHyluBx","v8yFNCIShG","lweGyNAFuw","MmKGJAkKTk","euZA50MR5X","580YDQYxC0",
+"8FmFHnlaBy","lCMxy8hJdt","StlDJUl4a1","OUqFMBCxeC","SbRYyhE1Ql","uN6r3lkMUA","aL6AJBCxeC","JRJQBRmDcr","6AFT0ECMvU","SbRYyt59lR",
+"AIYUusoy9t","RzaZAaez9y","ksJby618Di","8TxD7K20wK","uQIczFnPFB","LewvMECMvU","uLtKsi3pyd","cShY2tl72W","FNYIM5IhmG","VLTy6rz7Ut",
+"SjskQWaim6","FnPFBpiJSk","FhtglGrDg7","zz4ZU8U2nU","HP433faHir","zqH0WRpBQm","oQ87rFxX9q","HRxd8brhlQ","wiHrZnnP8o","d7vjMMojnP",
+"CdyBV4QMc9","No0Qb1LB1L","okgRiFwEJz","0Wr5yKASQ8","NcICAJJs5m","jzUqRSWfou","uAWypzz4ZU","FnPFBfcJOy","yToGWhSSvQ","WreyPt98iW",
+"HfyNQOz8yZ","zY1GYDcpWB","jzUqREoToP","h1zcHrz7Ut","yToGWxciqp","yToGW2hEEU","WmadAW3VFH","i3pydzHF1q","SjskQDz1R3","No0Qb0Wr5y",
+"QnJ1SDcpWB","jS1ajhE1Ql","2Nslmh1zcH","tl72W9rlg9","8U2nUlsQGo","1v5hHQnJ1S","4W0TlDcpWB","vOqCEIRh48","Mm8siZv7z0","zY1GYtjQxs",
+"lm0pDCqqaD","yEfy9QWxoT","bZLvSx3LDe","iqv4krz7Ut","QChxsdhSuH","FPfSEs7Mxk","lXFOBjS1aj","hi5X7kZANm","ZUnqtZv7z0","tAOsr5Mg9r",
+"LewvMGSQwj","v8yFNM6qcG","s93Mlv1Hln","Ta8f6zQt6Q","SjskQzqH0W","9eoRcStlDJ","Uvlv47hyVv","OxWIH8xEKz","CqqaDVerEA","Waim69GXkX",
+"fqypyni2v1","DG4sTlsQGo","7X3uyYf2Ec","8U2nUCIShG","pT8wuAIYUu","Nxx9VuQIcz","EOE1oaFFss","qQxHPDQimp","M3zXL5iGN5","MojnPRACuj",
+"tjQxshi5X7","BFkb8iB08l","Pb1pa5drc6","EOE1oyofH3","NhXdusoy9t","G1RhS0MR5X","aL6AJECMvU","GSQwj8xEKz","t98iW1v5hH","d7vjMtvdkD",
+"8RCUAZhwG1","qQxHPJ2mQi","580YDGv3Fq","CdyBVLbRTH","RsQUq8RCUA","gIYvEQbxXc","Chuy3vkCHH","NhXduPb1pa","16lHcuTacx","yEfy9Vprf2",
+"vLsmSjfREu","VLTy6tlILt","YjB9tMmKGJ","RpBQmjeskS","gtCA5ZuDtD","lm0pDk85Ae","SjskQFNYIM","IKxdLn8pJ9","0YAGHZhwG1","FxX9q7ku1p",
+"pmeCdoVQp6","14FLRxciqp","Y1mC0OUYuF","5nmWvzY1GY","0h1b1v1Hln","Rxrsmulk41","nnP8oNhXdu","yofH3jS1aj","FjHXRx3LDe","rz7UtU3yw5",
+"3weIFgdQsS","zY1GYcL0aE","mX2GEtvdkD","jeskSP6bcg","YOfrYLbRTH","uupzkzFgtB","7Ow5CHRxd8","XflUqpWiOs","jfREuS2Dfu","OHaBzs4786",
+"aDGtSfcJOy","rKDLJ5nmWv","yvOMIfaHir","tAOsrDQimp","brhlQKr8ys","D6rByRxrsm","uvf7AbgJAz","s7Mxklm0pD","AOgEeTXQ0Z","aL6AJuPX7G",
+"hYBCKHRxd8","tlILtzqH0W","uJScXzFgtB","ydG8U7ku1p","lH1ktJkzUn","WMiS3M3zXL","v1HlnzHF1q","ThjNnrhl0J","AOgEeL7cGc","8RCUAdjsrv",
+"FNYIMGv3Fq","zHF1qlweGy","FnPFBAgJHQ","2hEEUsoy9t","JRJQBa00b5","d7vjMRmDcr","pT8wuxReec","uvf7ARzaZA","Yf2Ecxciqp","48cHL9y4lw",
+"uQIczVprf2","HP433BCxeC","64s8NBbwgA","CdyBVK20wK","JkzUnF6PT2","cmXIXb29RJ","ZJTXHlkMUA","5nmWvtAOsr","0BmCyM6qcG","K20wKgf8rI",
+"9GXkX0Wr5y","Kr8ysFNYIM","qUJMdP6bcg","MGlTFIjTwP","xReec5drc6","JkzUnm4bxU","BpYhVK20wK","t59lRCNHmv","fcwDazY1GY","ciuWzEdBKc",
+"55rfBY1mC0","LbRTHx3LDe","HP4338hJdt","yofH3BpYhV","7lUXZ3weIF","gf8rIoVQp6","s93MlS77LH","PYBf4dQ586","VIlwPgdQsS","14FLRMaJQs",
+"MmKGJpAhR1","s4786OUYuF","rz7UtRkQke","iwzGkv2eC3","v1HlnpFrrl","7Ow5C48cHL","JXljWQYxC0","W3VFHciuWz","hSSvQfFDrJ","Twano24ARF",
+"fFDrJQYxC0","uPX7GfLNg8","ru4UGtAOsr","FLsphDcpWB","HRxd8e6e4z","Cp3mZrz7Ut","580YDEOE1o","pmeCdStlDJ","rhl0Jt98iW","hUTw7d7vjM",
+"h1zcH0MR5X","1j5L8VjCZq","7ku1pJ2mQi","v8yFN5nmWv","AmdQdMkgy8","oQ87rHP433","tuDyStvdkD","FPfSEEdBKc","aDGtSjeskS","lCMxyQnJ1S",
+"oGu6xyEfy9","euZA5TXQ0Z","8TxD7POUYS","jtn0XuN6r3","24ARFWaWsv","Dz1R3tvdkD","uZPqgKr8ys","WmadAHzZT8","yEfy9RACuj","WPmlxQWxoT",
+"pAhR1fFDrJ","MmsIoReKEW","8RCUAo8Uyd","pmeCdQ6Lix","KZamH0Wr5y","ZzJHWX6Pin","zFgtB5drc6","uupzk7ku1p","qQxHP7ku1p","hUTw748cHL",
+"Pb1paSs0Zu","lsQGouZPqg","D6rByFnPFB","55rfBaez9y","x3LDeKASQ8","QnJ1SjzUqR","Q6LixfLNg8","SWfoun1pmO","mz8gxwDajX","RpBQmbrhlQ",
+"5drc6fcJOy","QChxsVjCZq","hSSvQ45cIH","OUqFMxReec","jS1ajUl4a1","uAWyp9rlg9","K4GS81v5hH","DLhzMuTacx","0KyfscQOnv","i3pydKr8ys",
+"2hEEUHlUbF","d85a9oGu6x","BCxeCVprf2","vLsmSAOgEe","In3NS7ku1p","24ARFRmDcr","soy9txReec","qQxHPFFDui","qaofNoGu6x","SWfou580YD",
+"pv0i7DG4sT","nlaByix74r","Yw2oUgdQsS","U3yw5AOgEe","sx5GlZzJHW","WMiS3In3NS","Dz1R3G1RhS","d7vjMEOE1o","WPmlxAkKTk","kB5nPYOfrY",
+"2Nslmi7WMQ","ThjNnuupzk","07n1c5IhmG","9y4lwy94nw","RsQUq45cIH","55rfB07n1c","BpYhV4QMc9","IRh48HzZT8","a00b5SbRYy","JKWYRKr8ys",
+"Mm8si0YAGH","RpBQmQssNC","dpe1vGXdoH","v1HlnYh1hF","JRJQBAmdQd","i7WMQY1mC0","qQxHP4W0Tl","pv0i7gf8rI","s93MljSjS3","UmaEvs93Ml",
+"uupzkpFrrl","uLtKsDcpWB","aFFssv2eC3","P6bcgLbRTH","aL6AJiqv4k","WMiS3Q6hMC","n8pJ9QbxXc","BbwgAlj07Q","jS1ajNxx9V","mz8gxG1RhS",
+"jzUqRAkKTk","5VZjSSWfou","b29RJ6q6L9","uAWypHfyNQ","DcpWB16lHc","Pb1paQworu","RpBQm64s8N","FPfSEksJby","VerEAJKWYR","9rlg9n1pmO",
+"BFkb8ZhwG1","LbRTH5drc6","CK5W7pWiOs","v1HlnMaJQs","Gv3FqVLTy6","Q6hMCkB5nP","fLNg8NAFuw","CxVEfGrDg7","d85a9RACuj","DG4sTNhXdu",
+"K4GS8pWiOs","sx5GluoStw","In3NSi7WMQ","aFFssfcJOy","KASQ8suY4x","y94nwFnPFB","AIYUuciuWz","qQxHPPYBf4","8TxD7l83Ud","jS1aj9iGoT",
+"QChxsFxX9q","ZJTXHuLtKs","uvf7A48cHL","5ZaEzZuDtD","580YDs4786","dpe1vEOE1o","tl72WkZANm","oGu6xUl4a1","64s8Nn8pJ9","jiVBPRzaZA",
+"o8Uyd8TxD7","HfyNQv1Hln","8xEKzuLtKs","4W0Tl4W0Tl","cmXIXnnP8o","ksJbyNo0Qb","uoStwBFkb8","Yf2EcOxWIH","MezSWjeskS","bZLvS8hJdt",
+"9GXkXk85Ae","5Drn048cHL","TXQ0ZgtCA5","fcJOy9y4lw","7lUXZD6rBy","yEfy9KsjRK","5nmWvFVMxo","FwEJzK4GS8","DLhzMVNCPd","zmLYDXyPZN",
+"FnPFBkB5nP","pvgjSs7Mxk","Mkgy85ZaEz","dhSuHYOfrY","bZLvStl72W","zQt6Qb29RJ","he9IACfgr3","aDGtSRzaZA","lweGyTwano","aL6AJprNT6",
+"MaJQsFwEJz","W7cTstlILt","mz8gxqaofN","a00b5KZamH","2Yz7EQbxXc","MaJQs6q6L9","CIShGoGu6x","9eoRcQnJ1S","RkQkem4bxU","Uvlv4ni2v1",
+"Gv3FqbgJAz","lH1ktBbwgA","RsQUq7Ow5C","LbRTHwiHrZ","sqVrfJXljW","Ss0ZulkMUA","y94nw2Yz7E","uupzkyToGW","MGlTFUlU3M","Cp3mZkZANm",
+"fLNg8rKDLJ","No0QbM3zXL","kB5nPSbRYy","uJScXFxX9q","L7cGcqaofN","s7MxkprNT6","BpYhV1LB1L","tjQxsRmDcr","9GXkXWMiS3","AXpwE1v5hH",
+"2TRI7uJScX","oQ87rAkKTk","uPX7GDcpWB","CdyBVlpF6W","xciqpP6bcg","8hJdtPYBf4","EoToPHRxd8","1j5L8OxWIH","580YDHfyNQ","K20wKv1Hln",
+"pvgjSRmDcr","0ao3lzz4ZU","DQimpfLNg8","RxrsmpmeCd","yluBxBbwgA","MaJQsW7cTs","uTacxtuDyS","hE1QlDcpWB","iqv4k07n1c","O3iyQydG8U",
+"Cfgr3rz7Ut","HlUbF8cVD3","IKxdLWreyP","618Diulk41","lViBvKsjRK","B3qemRACuj","P6bcgRmDcr","tl72W64s8N","cL0aEBCxeC","zmLYDZhwG1",
+"CqqaDFVMxo","JKWYR7hyVv","0ao3luupzk","xciqpuZPqg","jfREuxXTI4","ksJbysoy9t","Waim6gdQsS","07n1cksJby","9XyT9Pb1pa","VerEA2hEEU",
+"rKDLJIRh48","0Wr5ys7Mxk","9iGoTbrhlQ","0KyfsIn3NS","FnPFBBGaQY","HP433iwzGk","CqqaDBFkb8","IBe8k0MR5X","Nxx9VJJs5m","FFDui9iGoT",
+"7Ow5CdmoS7","BbwgAfcJOy","FGzgpbrhlQ","Y1mC0NhXdu","PYBf4yvOMI","CdyBVlj07Q","xciqp6AFT0","prNT6VLTy6","wDajXtjQxs","GSQwjOxWIH",
+"lpF6WRACuj","3otm6RmDcr","Ta8f6fcJOy","soy9tRmDcr","QssNCY1mC0","FLsphjfREu","0ao3ltaOXK","mz8gxIjTwP","WreyPzY1GY","okgRiC2Irc",
+"aFFss8FmFH","CxVEfWmadA","gjUTu8RCUA","Z4I1vOHaBz","aFFssQnJ1S","NcICARmDcr","K20wKcShY2","uJScXciuWz","s4786lpF6W","BbwgAOz8yZ",
+"azIWpzbIYY","Zv7z0QnJ1S","ulk41pAhR1","uPX7GbrhlQ","ZUnqttuDyS","rKDLJpT8wu","48cHLVprf2","Chuy3mX2GE","6AFT0uLtKs","LewvMIBe8k",
+"9iGoTZuDtD","14FLR16lHc","pT8wut59lR","uJScXgtCA5","RmDcrTwano","gIYvEgtCA5","atef2LDk6f","VBjhzWaWsv","0Wr5yhe9IA","YjB9tgf8rI",
+"aL6AJQClRL","FxX9quoStw","uAWyphE1Ql","ZuDtDgjUTu","ECMvUNAFuw","2NslmUmaEv","0MR5XnFqik","zQt6QlXFOB","ni2v12TRI7","Cfgr3NOHsz",
+"8RCUAh1zcH","07n1c2DREs","gf8rIiwzGk","pFrrlokgRi","Fhtgl9GXkX","AXpwETa8f6","d85a9v1Hln","8cVD35nmWv","SjskQs4786","AmdQdrKDLJ",
+"sx5GlAOgEe","iKqhrdpe1v","uLtKsfcJOy","zz4ZU0PktI","M6qcGnFqik","4dEz6YjB9t","JKWYR580YD","Z4I1vqQxHP","7fKYUPYBf4","NcICAuN6r3",
+"AOgEetjQxs","ksJbyW3VFH","5iGN5BpYhV","l83UdJ2mQi","cmXIXzFgtB","rKDLJSmGzv","JIqXioVQp6","dpe1v8U2nU","Waim6xciqp","Gv3Fqiqv4k",
+"580YDhUTw7","F6PT28hJdt","brhlQDLhzM","5iGN52Yz7E","xReecIKxdL","gIYvEbrhlQ","rKDLJ2hEEU","ksJby5VZjS","WaWsv7fKYU","VBjhzZ4I1v",
+"uupzkv8yFN","Ta8f6suY4x","e6e4ziqv4k","uAWypBbwgA","D6rByM6qcG","WreyPh1zcH","k85Ae5drc6","0MR5X7lUXZ","uPX7GpT8wu","D6rByuQIcz",
+"QChxsMGlTF","lweGyZhwG1","5VZjSpFrrl","LbRTHmz8gx","OUqFMZJTXH","uoStwDQimp","5NammjeskS","tuDySM3zXL","WaWsvatef2","s7Mxkrhl0J",
+"aFFss0PktI","07n1ce6e4z","RpBQmDcpWB","DcpWBlViBv","U3yw59XyT9","oGu6xhE1Ql","aL6AJCIShG","hYBCKKZamH","MaJQstl72W","VNCPduJScX",
+"RBhp08hJdt","MGlTFi3pyd","0MR5XCqqaD","FFDui0MR5X","SmGzvvOqCE","Ul4a1qQxHP","2DREsBbwgA","guMb8WPmlx","FFDuiY1mC0","ix74rGv3Fq",
+"5IhmGCfgr3","atef2brhlQ","8FmFHNxx9V","CdyBVfFDrJ","StlDJOz8yZ","L7cGc2hEEU","prNT6QWxoT","KsjRK5Namm","BGaQY3otm6","taOXK4dEz6",
+"iB08l618Di","QnJ1SlkMUA","RACujfLNg8","QnJ1SnnP8o","2NslmjeskS","G1RhSgIYvE","Oz8yZOUqFM","lkMUAJKWYR","0MR5XHzZT8","tvdkDZ4I1v",
+"4dEz6Nxx9V","VLTy6y94nw","JJs5mpmeCd","55rfB5Mg9r","lH1kthUTw7","29QAzqaofN","bgJAz2TRI7","tuDySPYBf4","Mkgy855rfB","gtCA52ZHdk",
+"0BmCyQworu","he9IAkB5nP","suY4xZzJHW","SbRYy7lUXZ","m4bxUMmsIo","i7WMQtl72W","xciqpTwano","ZUnqt7ku1p","he9IA2ZHdk","xReeclj07Q",
+"fcJOy0YAGH","lj07QtuDyS","M6qcGcL0aE","ECMvU2TRI7","24ARFi7WMQ","wDajXuZPqg","AXpwEQ6Lix","jzUqRWaWsv","ni2v1CK5W7","WPmlx8xEKz",
+"CNHmvM6qcG","lH1ktMaJQs","24ARFjtn0X","ZUnqtCp3mZ","9y4lwIBe8k","wiHrZYf2Ec","vLsmS0Wr5y","3otm6K4GS8","7fsYM8hJdt","bgJAz64s8N",
+"24ARFpvgjS","NOHszAkKTk","1v5hH0MR5X","5VZjSSmGzv","OxWIHqQxHP","7hyVvI7p2a","euZA58cVD3","v1HlnCIShG","MmKGJpvgjS","s4786dpe1v",
+"SmGzv5iGN5","JXljWdQ586","WDVWJs93Ml","jSjS3NhXdu","fcJOy0PktI","yvOMIrz7Ut","K20wK2TRI7","jSjS3618Di","FLsphpAhR1","hi5X7a00b5",
+"U3yw5uupzk","iqv4kgtCA5","DcpWBhYBCK","uvf7AeuZA5","Y1mC0lkMUA","BGaQY8FmFH","0BmCyDG4sT","QWxoTMmKGJ","2NslmJXljW","yToGWsoy9t",
+"FPfSEVIlwP","8U2nUCK5W7","fLNg848cHL","Q6hMChi5X7","9eoRcRmDcr","NAFuwzY1GY","pvgjSUmaEv","gdQsSOUYuF","tjQxsuTacx","3otm6VIlwP",
+"Cp3mZtl72W","ZhwG1RpBQm","0BmCyHlUbF","BpYhVJRJQB","m4bxU16lHc","fLNg82TRI7","JJs5mJIqXi","Y1mC0Qworu","gdQsSo8Uyd","Kr8ysVjCZq",
+"lViBvpvgjS","Zv7z05VZjS","nlaByECMvU","ZuDtD7fKYU","FPfSE5nmWv","1LB1LpFrrl","aDGtSe6e4z","d7vjM8xEKz","JRJQBokgRi","MmKGJBFkb8",
+"yvOMI0PktI","ksJby5Drn0","wiHrZcShY2","LewvMChuy3","wDajXuAWyp","Cp3mZOUYuF","6AFT0k85Ae","mX2GEECMvU","zHF1qOUYuF","EdBKcHzZT8",
+"fmIK1azIWp","dmoS7fqypy","gdQsSt98iW","dQ586AmdQd","0PktIfaHir","gtCA5OxWIH","7hyVvuvf7A","VBjhzlweGy","HP433uvf7A","29QAzMojnP",
+"Yw2oUCqqaD","rKDLJXyPZN","FGzgp9XyT9","WreyPYjB9t","5iGN5mz8gx","In3NSsuY4x","rhl0JF6PT2","n1pmO5IhmG","zz4ZUSs0Zu","tjQxs5nmWv",
+"taOXK9rlg9","IKxdL1j5L8","MojnPECMvU","PYBf4K4GS8","K20wK0BmCy","jSjS3Y1mC0","580YDlm0pD","cmXIX8cVD3","CNHmvaez9y","29QAzyToGW",
+"zHF1qvOqCE","OHaBzyEfy9","Yf2EcFLsph","oQ87r9y4lw","1LB1LqQxHP","wiHrZm4bxU","OxWIHOxWIH","LbRTHVLTy6","hSSvQI7p2a","618DiSs0Zu",
+"oGu6xdjsrv","0BmCyKsjRK","wDajXl83Ud","3weIFfqypy","SbRYy1v5hH","S2Dfud7vjM","gdQsSprNT6","MGlTFB3qem","CIShGkB5nP","lXFOBqaofN",
+"d7vjMYjB9t","2NslmJIqXi","48cHLgf8rI","fcwDaxXTI4","EOE1oQworu","3otm6IKxdL","IKxdLAgJHQ","FxX9qbZLvS","2ZHdk3weIF","fqypyjiVBP",
+"zY1GY5VZjS","ThjNnHP433","uZPqg1LB1L","jtn0XGXdoH","7Ow5CfaHir","BpYhVVLTy6","YjB9tgdQsS","64s8NLDk6f","YjB9tP6bcg","ThjNnRkQke",
+"2Yz7EReKEW","gtCA5fmIK1","UmaEvIBe8k","lj07QBFkb8","MmKGJMojnP","fLNg8LewvM","ix74r3otm6","YOfrYNxx9V","pAhR1vOqCE","RxrsmNcICA",
+"jzUqRVIlwP","0h1b1Z4I1v","gf8rIyvOMI","xciqphYBCK","CdyBVgf8rI","iB08lRxrsm","BbwgAJRJQB","7hyVvIRh48","8U2nUDLhzM","pAhR1AXpwE",
+"29QAzIRh48","2hEEUMmsIo","jSjS3zbIYY","QworuuN6r3","RkQkeCp3mZ","oVQp6HP433","QbxXcuvf7A","B3qem2hEEU","fqypyqQxHP","HRxd80Wr5y",
+"0ao3lcL0aE","atef2C2Irc","fqypyHRxd8","FVMxoQnJ1S","DcpWBnFqik","SbRYyLewvM","ni2v1QYxC0","hUTw7uAWyp","14FLRX6Pin","bZLvSDLhzM",
+"NAFuwTXQ0Z","U3yw5KZamH","FNYIMtlILt","SjskQKZamH","rKDLJt59lR","uTacxtl72W","ni2v1uoStw","ciuWzv2eC3","Q6hMChe9IA","Uvlv4QYxC0",
+"U3yw5uZPqg","QYxC0OxWIH","VIlwPOUqFM","Mm8sinnP8o","DcpWBVIlwP","ni2v1BpYhV","YjB9tNAFuw","rKDLJPOUYS","k85AeW7cTs","Ta8f6JRJQB",
+"vOqCEFcWrW","XyPZNQnJ1S","0Wr5yRACuj","cmXIXFGzgp","lCMxyWmadA","SmGzvksJby","ZUnqtbgJAz","ZuDtD1j5L8","8hJdtFFDui","tl72Wtl72W",
+"rKDLJxReec","9iGoTKsjRK","Gv3FqMm8si","WreyPM3zXL","Zv7z0pT8wu","lXFOByEfy9","BFkb8gjUTu","uJScX0Kyfs","KsjRKtl72W","nFqikEOE1o",
+"8U2nUK4GS8","gIYvEt98iW","hE1QlRxrsm","Uvlv4NcICA","Oz8yZo8Uyd","rz7UtiwzGk","mz8gx5IhmG","s7MxkZJTXH","UmaEvPOUYS","CK5W70Wr5y",
+"FcWrWs4786","7Ow5CAkKTk","cL0aEdQ586","wiHrZ3otm6","J2mQin8pJ9","lm0pDNAFuw","U3yw5WPmlx","4W0TliKqhr","Cp3mZ0Kyfs","ZzJHWulk41",
+"GrDg72hEEU","SbRYyPOUYS","GSQwjlCMxy","FPfSEt98iW","F6PT2No0Qb","G1RhSFVMxo","brhlQtjQxs","wiHrZbgJAz","JKWYRtaOXK","QssNCCIShG",
+"5Drn0aFFss","FxX9qIjTwP","zQt6QK20wK","W3VFHqUJMd","d7vjMTXQ0Z","lsQGoYOfrY","brhlQ5iGN5","aFFsspAhR1","rKDLJl83Ud","5NammCIShG",
+"Vprf2RpBQm","TCgPpZhwG1","TXQ0ZwiHrZ","RpBQm9XyT9","yofH3BFkb8","m4bxUXflUq","WDVWJKASQ8","M6qcGk85Ae","AgJHQ14FLR","5NammNcICA",
+"lm0pDWMiS3","GrDg7Kr8ys","5iGN57X3uy","ZUnqtWDVWJ","RACujeuZA5","CK5W7CdyBV","pvgjS64s8N","IBe8kJRJQB","7fKYUHzZT8","gtCA5iwzGk",
+"GSQwjVerEA","fLNg8dmoS7","0MR5XUlU3M","L7cGcQWxoT","WreyPulk41","gjUTuhE1Ql","jSjS3fcJOy","0ao3l0h1b1","ZuDtDYf2Ec","8TxD7uJScX",
+"Ul4a1Chuy3","WreyPNcICA","BFkb8OHaBz","No0QbNhXdu","P6bcgydG8U","5drc6dhSuH","CK5W7OUqFM","DQimpnFqik","5ZaEzHP433","ZzJHWP6bcg",
+"FhtglZhwG1","FjHXRJRJQB","J2mQihYBCK","ZhwG1NhXdu","4dEz6s93Ml","POUYS5nmWv","b29RJlj07Q","GXdoHCfgr3","pWiOscL0aE","ru4UGrz7Ut",
+"CK5W7RpBQm","24ARFmX2GE","oQ87rAmdQd","fLNg8lsQGo","L7cGcyofH3","azIWpWPmlx","xReecFNYIM","LDk6fWDVWJ","pvgjSCxVEf","tAOsrs4786",
+"gtCA5oGu6x","t98iWJ2mQi","NOHszHRxd8","55rfBuvf7A","MezSWb29RJ","lsQGojeskS","NhXduFwEJz","SmGzvTa8f6","lkMUAqQxHP","ogLgcAXpwE",
+"rKDLJgf8rI","gf8rIdpe1v","cQOnvM3zXL","0MR5XNhXdu","hSSvQ8RCUA","cL0aEqQxHP","Y1mC05Namm","x3LDeru4UG","Z4I1vlj07Q","14FLRQWxoT",
+"FxX9q5drc6","x3LDeuN6r3","Z4I1vKZamH","dhSuHsoy9t","uJScX2TRI7","DLhzMkZANm","IjTwP3weIF","a00b55Drn0","Waim6KASQ8","uN6r3fcJOy",
+"HfyNQlkMUA","VIlwPokgRi","he9IAfcJOy","LDk6f8cVD3","yEfy9aDGtS","jtn0X1j5L8","MK07YIn3NS","lH1ktgtCA5","Ul4a1XflUq","ni2v1WreyP",
+"jiVBP2TRI7","Y1mC0tl72W","GXdoHFFDui","iB08lKr8ys","W3VFH0MR5X","F6PT2zbIYY","zQt6Q7fsYM","fqypyFLsph","XyPZNvkCHH","euZA5QClRL",
+"QWxoTTwano","e6e4zDcpWB","HP433Ss0Zu","CIShGs7Mxk","GWqqXSbRYy","55rfB5VZjS","uAWypFVMxo","vLsmShE1Ql","CK5W75nmWv","jfREuAOgEe",
+"tlILtZJTXH","pAhR1dhSuH","4dEz6DLhzM","L7cGcRACuj","zQt6QG1RhS","i3pydPYBf4","FLsphbZLvS","zFgtBxciqp","jtn0XQWxoT","jzUqRdQ586",
+"7ku1p5Drn0","gf8rIatef2","XyPZN29QAz","FhtglG1RhS","IRh48ZuDtD","FjHXRXyPZN","bZLvSe6e4z","QWxoTFnPFB","kB5nPuQIcz","zY1GYo8Uyd",
+"lkMUAcQOnv","m4bxU4QMc9","uZPqgcmXIX","9iGoT2Yz7E","ZzJHWRkQke","fLNg8EdBKc","ni2v1In3NS","Waim6uPX7G","lweGyjS1aj","7lUXZjtn0X",
+"7X3uyru4UG","djsrvRmDcr","k85AeBpYhV","x3LDeCxVEf","gjUTuJIqXi","JIqXi16lHc","oVQp6StlDJ","pWiOsF6PT2","HRxd8Nxx9V","uTacxSbRYy",
+"prNT6lpF6W","uoStw580YD","LewvMxXTI4","5IhmGfaHir","prNT6RACuj","JRJQBC2Irc","uTacxUmaEv","RBhp0K4GS8","DcpWB2TRI7","nFqikxReec",
+"nnP8oDz1R3","Ss0Zun1pmO","jfREuDz1R3","5IhmGvOqCE","zmLYDRACuj","mX2GE5nmWv","t59lR14FLR","GXdoHNAFuw","tuDyShSSvQ","uQIczFGzgp",
+"9y4lwlpF6W","BCxeCuAWyp","7hyVv2Yz7E","dhSuHuZPqg","RsQUqatef2","RsQUqjtn0X","AOgEehE1Ql","zbIYYfFDrJ","FFDuiXflUq","t59lRYjB9t",
+"RsQUq2Nslm","HfyNQW7cTs","POUYSSs0Zu","uJScXksJby","Gv3FqKr8ys","0BmCyzHF1q","NOHszRxrsm","v8yFNwDajX","Mm8siSs0Zu","AmdQdsoy9t",
+"IjTwPIBe8k","uZPqglXFOB","pT8wukB5nP","cmXIXZuDtD","brhlQNxx9V","vOqCE8FmFH","6AFT0XflUq","5VZjSulk41","lXFOBtjQxs","jiVBPhi5X7",
+"AIYUuUvlv4","BFkb8POUYS","CK5W7oQ87r","MmKGJzHF1q","zbIYYNAFuw","uTacx7X3uy","n1pmOKsjRK","24ARFaDGtS","SjskQhE1Ql","Cp3mZd85a9",
+"K4GS8lm0pD","P6bcgUvlv4","h1zcHiB08l","SmGzv9rlg9","b29RJ7ku1p","b29RJzHF1q","HlUbFF6PT2","t59lRd7vjM","cL0aEjzUqR","k85Ae3weIF",
+"UlU3MAOgEe","F6PT2yluBx","FnPFBprNT6","PYBf4618Di","YjB9taDGtS","TXQ0Z5Namm","dmoS7TXQ0Z","BpYhVBCxeC","5ZaEzdhSuH","fcJOyQssNC",
+"0Wr5yOz8yZ","v2eC3lViBv","e6e4zTXQ0Z","D6rByQChxs","vLsmS8FmFH","Waim6ZzJHW","FxX9qZhwG1","uPX7GWreyP","nlaByyToGW","16lHczqH0W",
+"t59lRjSjS3","In3NStvdkD","MezSWTCgPp","RmDcrLbRTH","4W0TlQ6Lix","Waim6FjHXR","k85AewiHrZ","lweGyJIqXi","tuDySWmadA","hSSvQ0BmCy",
+"bgJAzRsQUq","0ao3lReKEW","7Ow5CReKEW","Zv7z064s8N","Mm8siAmdQd","G1RhSoQ87r","fFDrJdjsrv","S77LHVLTy6","TwanoIn3NS","55rfBXflUq",
+"0KyfsNxx9V","cQOnvAXpwE","zqH0W0BmCy","I7p2aB3qem","uAWypv1Hln","48cHLrz7Ut","ZuDtDuJScX","taOXKVNCPd","3otm6VNCPd","14FLRaez9y",
+"tjQxsGv3Fq","NAFuwgdQsS","kZANmVNCPd","8U2nUIjTwP","7lUXZU3yw5","hYBCK8hJdt","RACujJXljW","FNYIMJKWYR","BCxeCGSQwj","HP433MezSW",
+"14FLRogLgc","YOfrYwDajX","nlaBysqVrf","0BmCyrz7Ut","tuDySWaim6","POUYSiKqhr","14FLRIjTwP","pFrrlY1mC0","Ss0ZuTwano","QChxsdQ586",
+"P6bcgPb1pa","FGzgpuQIcz","CxVEfFcWrW","55rfB5nmWv","Waim63otm6","AgJHQM3zXL","CqqaDHP433","48cHL9rlg9","AgJHQIn3NS","v8yFN1j5L8",
+"QClRLBpYhV","2Yz7EzbIYY","dmoS7zqH0W","fFDrJpWiOs","VBjhzgtCA5","e6e4zv1Hln","hE1QlAOgEe","FcWrWFGzgp","lpF6W9y4lw","uvf7A9XyT9",
+"s7MxkNcICA","Uvlv4Ta8f6","5ZaEzrz7Ut","gf8rImX2GE","yluBx7lUXZ","SWfoujeskS","IjTwP4dEz6","4QMc9pv0i7","kZANmm4bxU","fcJOyZv7z0",
+"pvgjSksJby","s93Ml1LB1L","zY1GYlweGy","G1RhSdQ586","2ZHdklXFOB","29QAzOz8yZ","Ss0ZucmXIX","qUJMdjtn0X","gtCA5StlDJ","yvOMIokgRi",
+"yvOMIa00b5","hE1Ql0Wr5y","prNT6Ss0Zu","C2IrcyluBx","2TRI72hEEU","LDk6ftlILt","RsQUqSWfou","zz4ZU3otm6","FLsphRACuj","CIShG2hEEU",
+"PYBf47hyVv","aFFssOz8yZ","LewvMfqypy","AmdQdSjskQ","6AFT0lViBv","s93MlLbRTH","0BmCyZUnqt","ydG8UQWxoT","uLtKsL7cGc","ReKEWI7p2a",
+"JIqXiRsQUq","suY4xFVMxo","07n1cuAWyp","RzaZAbrhlQ","e6e4zMmKGJ","ru4UGdhSuH","VjCZqi7WMQ","SmGzvokgRi","MK07YuQIcz","AkKTkGv3Fq",
+"pWiOspv0i7","Kr8ysJRJQB","d85a9zQt6Q","i3pyd1v5hH","dmoS7CdyBV","EoToPGrDg7","FNYIMyToGW","MmKGJ9iGoT","FjHXRRpBQm","JRJQBi7WMQ",
+"DLhzM5drc6","QChxsFhtgl","uoStwNOHsz","TXQ0ZiB08l","pvgjSQYxC0","oQ87ratef2","RACujKZamH","2ZHdkVIlwP","blLA9jeskS","7lUXZjfREu",
+"zbIYYcQOnv","qUJMd16lHc","RBhp0SjskQ","0h1b1Yh1hF","Z4I1v1v5hH","1LB1LChuy3","CxVEfG1RhS","rz7Utmz8gx","K20wKxciqp","y94nwyEfy9",
+"tvdkDWMiS3","gdQsSSbRYy","FLsph7Ow5C","ogLgcazIWp","ciuWzKASQ8","7ku1pGSQwj","Oz8yZQWxoT","suY4xZ4I1v","4W0TlxReec","RxrsmBCxeC",
+"9XyT95Namm","I7p2avLsmS","jiVBPDQimp","jfREuIn3NS","2ZHdkIjTwP","aDGtSL7cGc","dmoS72DREs","DG4sT0MR5X","uLtKs9y4lw","jeskSThjNn",
+"6AFT0OUYuF","cQOnvStlDJ","bZLvSChuy3","3otm60Kyfs","8RCUAiKqhr","dmoS7jS1aj","s4786jeskS","MojnPPOUYS","nnP8o29QAz","5iGN5ZUnqt",
+"guMb82ZHdk","suY4xHfyNQ","uQIczTCgPp","MaJQsWDVWJ","64s8NFwEJz","RkQkeWPmlx","h1zcHMm8si","BbwgA1LB1L","AkKTkRBhp0","pAhR1uZPqg",
+"uJScXFPfSE","8TxD7aFFss","Vprf2oQ87r","wDajXFFDui","ThjNnNOHsz","Q6hMCO3iyQ","tuDyS5ZaEz","iKqhrWaim6","XyPZNWDVWJ","mX2GEuoStw",
+"ThjNnyEfy9","Oz8yZJJs5m","euZA5hE1Ql","ogLgcDQimp","taOXKaDGtS","QworuLDk6f","X6Pin0ao3l","Mm8si0PktI","v1HlnS2Dfu","0h1b1RzaZA",
+"uQIczRpBQm","VIlwPzFgtB","uupzkoVQp6","iwzGkP6bcg","W7cTshYBCK","Cfgr3dhSuH","vOqCEfcJOy","yvOMIblLA9","L7cGcix74r","Q6LixHzZT8",
+"tlILtt98iW","Ul4a1StlDJ","taOXKIKxdL","5NammZJTXH","8xEKzZv7z0","Cp3mZPOUYS","IBe8kiqv4k","2ZHdkzz4ZU","AgJHQLDk6f","BFkb8VNCPd",
+"BGaQYNOHsz","RBhp0iB08l","In3NSKASQ8","zmLYDoGu6x","LDk6fuvf7A","aL6AJFFDui","FjHXRhYBCK","9rlg916lHc","yvOMID6rBy","suY4xjzUqR",
+"dpe1vP6bcg","F6PT2HP433","cmXIXlCMxy","9iGoTlweGy","atef2S77LH","lViBvECMvU","PYBf45VZjS","CK5W7mX2GE","VLTy64dEz6","zHF1qguMb8",
+"FNYIMOxWIH","Q6hMChE1Ql","yluBx8cVD3","2NslmfFDrJ","LbRTHGXdoH","hYBCKfqypy","ZuDtDMojnP","qUJMd0PktI","MmKGJ3otm6","0ao3lX6Pin",
+"9y4lwzFgtB","sx5Gl45cIH","xReecW7cTs","d85a9C2Irc","Cfgr3lXFOB","Pb1pajfREu","QnJ1SYjB9t","QYxC0O3iyQ","uQIczuPX7G","hUTw7e6e4z",
+"FwEJzWPmlx","cL0aEHlUbF","4QMc9zY1GY","kZANm7hyVv","MmKGJv8yFN","cL0aEKsjRK","618Diatef2","lm0pDs93Ml","DLhzMBFkb8","mX2GEaFFss",
+"Yf2Ecatef2","1v5hHHlUbF","zFgtB8cVD3","CNHmvwDajX","pFrrltvdkD","LewvMydG8U","ZzJHWYOfrY","pAhR1cShY2","AXpwEl83Ud","0Kyfs64s8N",
+"lj07Q8RCUA","uJScXpT8wu","pWiOsbgJAz","uupzkOxWIH","fqypy0PktI","tvdkD4QMc9","pvgjStAOsr","9iGoTSjskQ","faHirksJby","zQt6QoQ87r",
+"fFDrJni2v1","G1RhSgf8rI","mz8gxnnP8o","Oz8yZCNHmv","zY1GYYw2oU","QChxsCp3mZ","AmdQd7ku1p","tuDySv2eC3","pWiOsDG4sT","zmLYDAmdQd",
+"iB08lUmaEv","HzZT89rlg9","TXQ0Zm4bxU","Q6Lixdpe1v","FNYIMpvgjS","MmKGJxXTI4","oVQp6jfREu","C2Irc0Wr5y","6q6L9Cfgr3","fqypyIn3NS",
+"UlU3MogLgc","MmKGJ64s8N","lkMUAK4GS8","0MR5XMkgy8","HP433Cfgr3","Q6hMCTCgPp","zFgtBW7cTs","kB5nPru4UG","lViBv9GXkX","BGaQYd85a9",
+"yluBxQnJ1S","NOHszPb1pa","d85a9OHaBz","zmLYD2TRI7","8RCUAXyPZN","QChxseuZA5","0PktICNHmv","FwEJzNcICA","l83Ud0BmCy","fcJOyUl4a1",
+"lCMxyprNT6","2ZHdkMGlTF","tAOsr7Ow5C","AOgEeoQ87r","RsQUqQWxoT","GSQwjChuy3","CNHmvVprf2","l83UdK20wK","RzaZAqaofN","QnJ1SS2Dfu",
+"9iGoTjiVBP","iqv4kVIlwP","zFgtBSbRYy","Pb1pahUTw7","G1RhSpAhR1","pT8wuFnPFB","6AFT00ao3l","dpe1v5nmWv","In3NSiKqhr","uPX7GOUYuF",
+"rKDLJwiHrZ","U3yw5K4GS8","8cVD3okgRi","kZANmMGlTF","NcICApvgjS","zQt6QgjUTu","Yw2oUpFrrl","Mkgy8Mkgy8","ni2v1Mm8si","s93MlvLsmS",
+"TwanoQYxC0","LewvMyluBx","64s8NMezSW","QbxXcfcJOy","qaofNdpe1v","Yw2oUuJScX","Uvlv4qaofN","fqypyb29RJ","Ul4a15Drn0","ciuWzx3LDe",
+"ZJTXHIKxdL","DcpWBMmsIo","M6qcGRBhp0","Mkgy8QssNC","RsQUqFhtgl","2Yz7E9XyT9","uLtKsDQimp","Uvlv4lkMUA","NhXduMGlTF","5NammG1RhS",
+"Nxx9VzbIYY","6AFT00YAGH","I7p2ah1zcH","64s8NOHaBz","6q6L99y4lw","a00b54QMc9","vkCHH9XyT9","0BmCyW3VFH","FxX9qrz7Ut","lsQGosuY4x",
+"PYBf4gtCA5","I7p2aLbRTH","7X3uyfmIK1","yEfy92TRI7","QssNCyToGW","v2eC3NAFuw","K20wK9rlg9","4QMc9RBhp0","0YAGHZzJHW","WMiS3ulk41",
+"mX2GEYh1hF","4dEz6POUYS","S2Dfu8cVD3","EOE1oThjNn","7Ow5Cv8yFN","EdBKcQnJ1S","QworuXyPZN","StlDJYf2Ec","ECMvUgtCA5","S2DfuuN6r3",
+"fmIK1FwEJz","vLsmSDQimp","cQOnvRzaZA","lXFOBnnP8o","OUqFMDLhzM","qQxHPv2eC3","jzUqRVjCZq","7fKYUHfyNQ","vLsmS48cHL","iqv4k0MR5X",
+"pvgjS9y4lw","JKWYRd85a9","aL6AJHRxd8","XflUq8TxD7","CNHmvs93Ml","RkQkeTCgPp","hYBCKsx5Gl","ix74rvOqCE","Vprf2DG4sT","P6bcgRkQke",
+"n1pmOCIShG","FnPFBuQIcz","D6rByfcJOy","ulk41QClRL","FVMxoFhtgl","pWiOstlILt","Cp3mZdjsrv","oVQp6v2eC3","zz4ZUo8Uyd","RpBQmYf2Ec",
+"BFkb8618Di","3weIF14FLR","C2Irciqv4k","uupzkjzUqR","y94nwrz7Ut","vOqCEZJTXH","29QAzUmaEv","AXpwECIShG","6AFT0M3zXL","RACujNAFuw",
+"vLsmS9iGoT","v8yFNNOHsz","dmoS7MaJQs","gf8rIFPfSE","MmKGJFxX9q","O3iyQSWfou","FGzgptvdkD","CdyBVpWiOs","EdBKcpiJSk","5VZjSW7cTs",
+"MaJQs7X3uy","fcJOy0ao3l","kB5nPsoy9t","CIShGv8yFN","WMiS3hYBCK","0BmCys4786","euZA5Q6hMC","AXpwEd85a9","IBe8ki3pyd","8xEKzJkzUn",
+"Zv7z0uZPqg","WPmlx9eoRc","hUTw7yEfy9","CqqaD9GXkX","7lUXZ9XyT9","y94nwlkMUA","8TxD7vOqCE","yofH3KsjRK","7Ow5Caez9y","cQOnv5Drn0",
+"taOXKLewvM","djsrvAIYUu","2ZHdkqQxHP","O3iyQGv3Fq","xXTI4K20wK","45cIH4QMc9","1v5hHlj07Q","BbwgAD6rBy","4QMc9oVQp6","QClRL5Mg9r",
+"blLA9m4bxU","QClRLydG8U","RBhp0L7cGc","jSjS33otm6","KASQ8rz7Ut","5drc6prNT6","EOE1ozHF1q","wDajXnFqik","lm0pDlXFOB","K4GS8iB08l",
+"TCgPpPOUYS","WaWsvXflUq","4QMc9pvgjS","QworuwDajX","gtCA5DG4sT","48cHLAOgEe","uN6r3hYBCK","4dEz6zFgtB","wDajXuTacx","Nxx9VCdyBV",
+"ix74r8TxD7","jSjS3lCMxy","uvf7AJ2mQi","n1pmOXyPZN","okgRidjsrv","24ARFpiJSk","FwEJzLewvM","Vprf2okgRi","qaofNNcICA","4QMc9ZuDtD",
+"0MR5X6AFT0","pAhR1GrDg7","dmoS7RkQke","FNYIM2TRI7","rz7UtCNHmv","MmsIofcJOy","M3zXLCqqaD","SbRYyXyPZN","jzUqRnnP8o","S77LHIRh48",
+"iqv4kEdBKc","iqv4kNAFuw","d7vjM8cVD3","SWfou16lHc","9eoRcBGaQY","WreyPFhtgl","W7cTsM6qcG","zHF1qGv3Fq","v8yFNCfgr3","8cVD3QClRL",
+"pFrrl7fsYM","9eoRc5Mg9r","CIShGBpYhV","0MR5XcQOnv","2TRI7VBjhz","MmsIok85Ae","ulk41tl72W","lweGykB5nP","rhl0JvLsmS","fLNg8wDajX",
+"9y4lw4QMc9","fLNg8lweGy","0Kyfsuupzk","aFFsssuY4x","EOE1o3weIF","FGzgpThjNn","8U2nUKASQ8","S2Dfuuvf7A","7fKYUZv7z0","IjTwPuupzk",
+"o8UydMojnP","KASQ8KsjRK","lsQGotvdkD","i7WMQXyPZN","TwanoPYBf4","G1RhSkZANm","0Kyfs24ARF","Q6hMC8RCUA","Rxrsmsoy9t","xReecv1Hln",
+"5ZaEz7lUXZ","UlU3MIRh48","uAWypwiHrZ","2DREslXFOB","FcWrW9rlg9","DcpWBMaJQs","Gv3FqJIqXi","MK07YfmIK1","brhlQoVQp6","ThjNnEoToP",
+"RkQkeMojnP","s7Mxk9GXkX","24ARF9XyT9","mz8gxyToGW","CdyBVuZPqg","5VZjSVerEA","7hyVvzqH0W","7fsYMb29RJ","6q6L90PktI","dmoS7h1zcH",
+"yofH3VBjhz","0YAGHIjTwP","uPX7GI7p2a","a00b529QAz","O3iyQM3zXL","LewvMFNYIM","blLA9jfREu","vLsmSPb1pa","CIShGjiVBP","a00b5MaJQs",
+"yofH3rKDLJ","zFgtBhi5X7","lViBvOUYuF","ReKEW5Mg9r","AgJHQ45cIH","nnP8o9iGoT","Oz8yZZuDtD","M3zXLciuWz","5iGN5d7vjM","IjTwPF6PT2",
+"fLNg8HfyNQ","2ZHdk2DREs","lm0pDyluBx","lXFOBZv7z0","taOXKnFqik","zFgtBWPmlx","jtn0XIKxdL","M6qcGzz4ZU","iB08l9rlg9","hUTw7RsQUq",
+"IKxdLlm0pD","GWqqX7X3uy","aez9yVNCPd","pFrrlQWxoT","7lUXZMK07Y","cShY2gf8rI","Y1mC04dEz6","RkQkeMK07Y","C2IrcuoStw","6q6L924ARF",
+"7lUXZZv7z0","taOXKlweGy","yToGWhe9IA","x3LDehUTw7","sqVrfP6bcg","C2Ircatef2","8TxD7s7Mxk","zbIYYGSQwj","J2mQihi5X7","VBjhz8hJdt",
+"Twanorz7Ut","2DREsRkQke","LewvMs93Ml","1LB1LB3qem","HlUbF8hJdt","FjHXR24ARF","8RCUA8U2nU","VNCPd14FLR","rz7Ut9iGoT","qQxHP7hyVv",
+"2ZHdkrKDLJ","gjUTujtn0X","FcWrW4W0Tl","IRh48RmDcr","yluBxGXdoH","m4bxUzqH0W","pFrrlOUYuF","AkKTkmz8gx","yvOMIjSjS3","s4786pmeCd",
+"JKWYRzY1GY","CxVEfIjTwP","ix74rEoToP","MmsIoNcICA","AXpwEdmoS7","AXpwEC2Irc","pT8wu7Ow5C","x3LDeI7p2a","NAFuwOxWIH","J2mQi0Kyfs",
+"fqypygjUTu","uJScX64s8N","gIYvE5ZaEz","NOHszGrDg7","uJScXAIYUu","jSjS3LbRTH","b29RJLbRTH","rz7Utdpe1v","DG4sTQssNC","WaWsv2Yz7E",
+"16lHciB08l","OUqFMzbIYY","45cIH14FLR","fLNg89y4lw","piJSkcmXIX","LDk6f1v5hH","7fKYUh1zcH","kB5nP45cIH","WMiS38xEKz","aFFssMmsIo",
+"uTacx9rlg9","guMb8mz8gx","pmeCdQWxoT","fmIK1uQIcz","3otm69y4lw","P6bcgtaOXK","HRxd8VjCZq","7ku1pReKEW","pmeCds7Mxk","CdyBVGv3Fq",
+"ZhwG1l83Ud","Yf2Ec8xEKz","AkKTkD6rBy","i7WMQmX2GE","4W0TlXflUq","QssNCfaHir","KASQ8RkQke","iB08ltjQxs","rKDLJNcICA","qUJMdEdBKc",
+"I7p2aNcICA","P6bcguN6r3","7hyVvKZamH","YjB9ti7WMQ","MojnPyvOMI","5Drn0FwEJz","ZhwG15VZjS","B3qem8RCUA","9GXkXlXFOB","3weIF0h1b1",
+"FnPFBblLA9","tuDySFnPFB","QChxsi3pyd","iqv4ke6e4z","sqVrfFxX9q","FcWrWjSjS3","iB08lsoy9t","iKqhry94nw","yluBxAkKTk","i7WMQ16lHc",
+"BFkb8OxWIH","hE1QluAWyp","v1HlnyofH3","DQimp8RCUA","okgRiBpYhV","SmGzvsx5Gl","BFkb8VerEA","MezSWazIWp","FnPFBVjCZq","ix74rydG8U",
+"BFkb8pv0i7","pAhR1vLsmS","BbwgAzz4ZU","pFrrlRBhp0","NAFuwCxVEf","lsQGot59lR","wDajXa00b5","lCMxyuJScX","CK5W7XflUq","t59lRxciqp",
+"wiHrZjSjS3","UmaEv4dEz6","fmIK1aez9y","yluBx8TxD7","cQOnvgjUTu","0ao3lW7cTs","lsQGo7fsYM","hUTw7Ss0Zu","t98iWuLtKs","tl72W9iGoT",
+"fcwDazqH0W","WPmlxJXljW","8TxD745cIH","xXTI4fFDrJ","hSSvQ5drc6","MK07YlweGy","Z4I1vpFrrl","h1zcHi7WMQ","7fKYUQssNC","aL6AJB3qem",
+"VjCZqt98iW","JKWYRHzZT8","nnP8oECMvU","zQt6QTXQ0Z","TXQ0ZcmXIX","pmeCds4786","KZamHyToGW","gdQsS6AFT0","piJSkiKqhr","KsjRKAmdQd",
+"BpYhVOHaBz","5iGN5RmDcr","WDVWJkZANm","aez9yRsQUq","FcWrWAmdQd","QYxC0piJSk","POUYSrhl0J","BGaQYCp3mZ","0KyfsHzZT8","JJs5mMK07Y",
+"9iGoT16lHc","7Ow5CzY1GY","9y4lwhUTw7","AOgEeGWqqX","NAFuwJKWYR","pv0i70MR5X","xXTI4Kr8ys","v8yFNlsQGo","uZPqgNxx9V","1j5L85Namm",
+"IKxdLUmaEv","d7vjMEdBKc","2Yz7ESs0Zu","Kr8ysjSjS3","MmsIo7lUXZ","7fsYM55rfB","4QMc9i7WMQ","KsjRKvkCHH","RmDcrWaim6","hSSvQNAFuw",
+"RACujs4786","FVMxob29RJ","PYBf47X3uy","F6PT2OUYuF","O3iyQy94nw","VjCZqVBjhz","CK5W7FjHXR","GSQwj9rlg9","wiHrZRpBQm","FPfSEuoStw",
+"OHaBzRsQUq","FLsphhi5X7","CqqaDyluBx","EdBKccQOnv","0MR5Xuvf7A","tAOsrZzJHW","Chuy3Ul4a1","0KyfspFrrl","gIYvEiB08l","soy9tfFDrJ",
+"MojnPjzUqR","MezSWNhXdu","nnP8oulk41","JkzUn9XyT9","VerEA24ARF","ZzJHWxXTI4","UmaEvdmoS7","8TxD7vLsmS","mz8gxAIYUu","fFDrJiwzGk",
+"Mkgy8lm0pD","S77LHAOgEe","BbwgASWfou","euZA5pT8wu","pT8wuS2Dfu","nlaByRkQke","EdBKcBbwgA","hSSvQXflUq","v2eC3a00b5","Zv7z0jeskS",
+"Yh1hFStlDJ","OHaBzv2eC3","aDGtSmX2GE","kB5nPMGlTF","RsQUqReKEW","XflUqwDajX","hYBCKjtn0X","JXljWcShY2","aDGtSuPX7G","Uvlv41LB1L",
+"MK07YlCMxy","i7WMQ0Kyfs","v8yFNKZamH","nFqik7X3uy","YjB9tSWfou","aDGtS7Ow5C","Pb1pa2DREs","b29RJo8Uyd","NOHszNhXdu","YOfrY5iGN5",
+"h1zcHVjCZq","nlaByBbwgA","yofH3guMb8","9rlg9Waim6","Uvlv4d7vjM","KZamHWreyP","5NammZzJHW","iqv4kaL6AJ","rhl0JpT8wu","nlaBy64s8N",
+"1LB1LDcpWB","WreyPWDVWJ","OUYuFjiVBP","IjTwPdhSuH","AmdQd2ZHdk","LDk6fn8pJ9","uQIczuoStw","yvOMIogLgc","lXFOBv8yFN","FPfSEHRxd8",
+"uJScXEoToP","CNHmv7fsYM","VBjhzh1zcH","QYxC0U3yw5","Uvlv4piJSk","wDajXSs0Zu","0BmCyQChxs","NcICApiJSk","kB5nPjtn0X","soy9tTXQ0Z",
+"qQxHPOz8yZ","QYxC0HP433","Z4I1vQ6Lix","5Namm45cIH","580YDMGlTF","FcWrW8hJdt","NAFuwEOE1o","IBe8kSWfou","5VZjSv8yFN","LewvMWmadA",
+"ZzJHWReKEW","Cfgr3Ta8f6","qaofNCqqaD","JRJQBzz4ZU","ciuWzCK5W7","0PktIZJTXH","tuDyS5IhmG","BFkb8FnPFB","8cVD3RzaZA","taOXKdhSuH",
+"S77LHjtn0X","sx5GlYjB9t","tvdkD16lHc","ix74rzFgtB","tAOsrs7Mxk","FFDuiBbwgA","I7p2aOUqFM","n1pmOlsQGo","Uvlv4580YD","5VZjS0h1b1",
+"9GXkXbrhlQ","ZzJHWy94nw","3otm6pWiOs","Cfgr3vOqCE","mX2GEFGzgp","NAFuwFGzgp","mz8gxblLA9","L7cGcsqVrf","GSQwjI7p2a","BGaQYFNYIM",
+"AmdQdrhl0J","8FmFHciuWz","DcpWBuZPqg","iKqhrfmIK1","WMiS3FNYIM","MmKGJMmsIo","JIqXizz4ZU","29QAzEoToP","kZANmqUJMd","Gv3FqtjQxs",
+"QbxXcVBjhz","qaofNMojnP","55rfBS77LH","2Yz7ECdyBV","MezSWogLgc","HfyNQzQt6Q","CdyBVtvdkD","CdyBVKASQ8","LewvMdjsrv","5ZaEz24ARF",
+"t98iWWPmlx","JKWYRWaim6","QClRL5nmWv","2TRI7gdQsS","7hyVvCdyBV","jSjS3KZamH","8hJdtCIShG","Z4I1vrz7Ut","JRJQB7fKYU","JRJQBqaofN",
+"sqVrfhYBCK","piJSk8cVD3","WPmlxJJs5m","cQOnvhSSvQ","Gv3Fq580YD","RsQUqzqH0W","QChxsjSjS3","RsQUqTCgPp","ZzJHWQ6Lix","KZamHChuy3",
+"lCMxyzbIYY","2DREsdhSuH","7fsYM2Yz7E","6AFT0JkzUn","7Ow5CTXQ0Z","yToGWWmadA","MmsIoNAFuw","n8pJ9HP433","I7p2aJJs5m","v2eC3s93Ml",
+"dQ586dpe1v","n8pJ9tlILt","F6PT29XyT9","EoToPyvOMI","CxVEfLbRTH","ZJTXH8hJdt","L7cGcSjskQ","AmdQdEOE1o","Z4I1vjtn0X","lCMxyuN6r3",
+"kB5nPUl4a1","ZUnqtlsQGo","RBhp0fFDrJ","FwEJzRzaZA","Zv7z0blLA9","WMiS3J2mQi","RsQUqjS1aj","lweGyZUnqt","9XyT9MaJQs","VNCPdiKqhr",
+"qQxHPU3yw5","iKqhr7X3uy","xReecS77LH","s93MlQ6hMC","ru4UGC2Irc","lkMUAv2eC3","VjCZqRACuj","VLTy6Yh1hF","BbwgAzHF1q","qQxHPokgRi",
+"2DREs7hyVv","CK5W7VLTy6","48cHL1v5hH","QssNCFwEJz","GrDg755rfB","tlILt2ZHdk","dhSuHzqH0W","taOXKVLTy6","ru4UGeuZA5","64s8NYf2Ec",
+"faHirMezSW","1j5L8fmIK1","QbxXck85Ae","SjskQFFDui","GWqqXRzaZA","s93MlrKDLJ","tjQxslViBv","pAhR1PYBf4","7X3uygtCA5","29QAzSjskQ",
+"prNT6JKWYR","TXQ0ZThjNn","atef2QYxC0","aFFsspmeCd","VerEAZ4I1v","rz7Ut9rlg9","M6qcG5Mg9r","7Ow5C29QAz","8RCUARxrsm","RkQkev2eC3",
+"FFDui0ao3l","No0Qbm4bxU","fFDrJVprf2","Ss0Zu2TRI7","aez9y4dEz6","9eoRcOUqFM","BpYhVogLgc","qUJMd24ARF","euZA5EOE1o","0BmCyaDGtS",
+"ru4UGxXTI4","RmDcroGu6x","gIYvEQnJ1S","gjUTujSjS3","qaofN9iGoT","l83UdJKWYR","HfyNQpAhR1","64s8Nhi5X7","pWiOsKsjRK","ix74rtAOsr",
+"lViBvWMiS3","VLTy6wiHrZ","lpF6WQClRL","hi5X7NAFuw","29QAzv1Hln","kZANmDQimp","6q6L9BCxeC","pWiOs6q6L9","Cp3mZtaOXK","s7MxkUl4a1",
+"FxX9qMK07Y","Waim6VLTy6","Q6LixX6Pin","JIqXiUvlv4","2hEEUMGlTF","bgJAzHRxd8","y94nwfFDrJ","3otm63weIF","PYBf4taOXK","gIYvEW7cTs",
+"t59lRWMiS3","lH1ktZ4I1v","pv0i7hSSvQ","NAFuw0Wr5y","fcJOyhSSvQ","Uvlv4fcwDa","aez9y9GXkX","GrDg7uvf7A","SmGzvhi5X7","WaWsvKr8ys",
+"taOXKRpBQm","zz4ZUrhl0J","K4GS8uN6r3","soy9tmX2GE","hSSvQzmLYD","Cfgr3POUYS","n8pJ9WPmlx","x3LDennP8o","yvOMIydG8U","fmIK1UmaEv",
+"FLsphWMiS3","s7Mxkd85a9","5VZjSlweGy","uN6r3rhl0J","CNHmvpmeCd","ZzJHWni2v1","yluBxhe9IA","QworuWreyP","RmDcrJXljW","M6qcGD6rBy",
+"QbxXcDz1R3","PYBf4wDajX","Dz1R3PYBf4","azIWphi5X7","prNT6Mkgy8","yofH35Mg9r","zqH0W55rfB","d7vjMLDk6f","1LB1LKASQ8","uZPqgTXQ0Z",
+"FPfSEbgJAz","aFFsszHF1q","JkzUns4786","nlaByzY1GY","5Mg9rReKEW","Kr8ysuAWyp","IRh48MGlTF","piJSkJ2mQi","vOqCEazIWp","lH1ktMojnP",
+"LDk6fdhSuH","ix74riqv4k","4QMc9mz8gx","uupzkKr8ys","lCMxyuZPqg","tlILtLewvM","gf8rIeuZA5","pWiOsFPfSE","d85a9e6e4z","tjQxsTwano",
+"7ku1pgjUTu","aL6AJsx5Gl","aez9yJXljW","8U2nU2TRI7","QworuP6bcg","MmsIoni2v1","oGu6xTa8f6","zY1GYi3pyd","s4786iwzGk","uPX7Gdpe1v",
+"cL0aEWmadA","GWqqXQ6Lix","J2mQiaez9y","S77LHIn3NS","QnJ1SuTacx","BCxeCM6qcG","2NslmYOfrY","8FmFH24ARF","3otm6aFFss","RmDcrSWfou",
+"24ARFlXFOB","zmLYD5IhmG","RpBQmlViBv","WMiS3RBhp0","RmDcrWDVWJ","zHF1qcmXIX","sx5GlfmIK1","KZamH8U2nU","9GXkXM3zXL","TwanopmeCd",
+"k85AeSbRYy","FVMxoHlUbF","CqqaD5drc6","8FmFHTa8f6","FNYIMQWxoT","CdyBVQ6hMC","7lUXZ5nmWv","Z4I1vHzZT8","CxVEfECMvU","dmoS7ru4UG",
+"5Drn0JIqXi","B3qemNo0Qb","OUYuFQYxC0","WPmlxUlU3M","AmdQdprNT6","suY4xwDajX","AOgEeFVMxo","FjHXRVNCPd","CxVEfpT8wu","XyPZNL7cGc",
+"MK07Y55rfB","ru4UGuPX7G","HP4330Wr5y","okgRiRBhp0","s7MxkXyPZN","8FmFHOUqFM","Z4I1vFwEJz","MmKGJCIShG","tvdkDNcICA","EdBKcIn3NS",
+"MK07YQWxoT","FcWrWFFDui","d7vjMVerEA","In3NShE1Ql","taOXKG1RhS","zFgtBMezSW","SbRYy8RCUA","uLtKslpF6W","9iGoTRmDcr","QYxC0vOqCE",
+"DG4sTjfREu","dhSuHdpe1v","uTacxFnPFB","5iGN5uAWyp","JXljWO3iyQ","WMiS3AOgEe","tvdkDyToGW","8cVD3pT8wu","2DREscL0aE","okgRiRxrsm",
+"Gv3FqVprf2","9GXkXlViBv","fcJOyiB08l","cmXIXMmKGJ","MGlTFJIqXi","No0QbK20wK","fFDrJuN6r3","WMiS38RCUA","16lHclkMUA","2ZHdkkZANm",
+"VBjhzIn3NS","o8UydksJby","2hEEUQ6Lix","8hJdt14FLR","4dEz6uAWyp","3weIFLDk6f","6q6L9GXdoH","rz7Ut4QMc9","S77LHbgJAz","7hyVvXflUq",
+"ECMvUAmdQd","lweGyi7WMQ","S2DfuRsQUq","VjCZq5ZaEz","rhl0Jsoy9t","S2DfujS1aj","IKxdLVprf2","L7cGckB5nP","2Yz7EjS1aj","Yw2oUVBjhz",
+"9rlg9S77LH","s47865IhmG","X6PindmoS7","BGaQYjeskS","Twanogf8rI","nFqikfFDrJ","sx5Gl2DREs","X6PinXflUq","uTacxGXdoH","ZJTXHzHF1q",
+"64s8NF6PT2","ix74ruZPqg","jS1ajpmeCd","ulk41m4bxU","fcJOyzQt6Q","Q6hMCi3pyd","ulk41bgJAz","ni2v14dEz6","LbRTHa00b5","5Drn029QAz",
+"8U2nUs93Ml","7fsYMsx5Gl","uQIczHfyNQ","CxVEfqUJMd","9rlg9J2mQi","uZPqgjS1aj","5IhmG5nmWv","M6qcGcShY2","LbRTHsqVrf","ix74r5Namm",
+"gIYvECNHmv","fFDrJQworu","taOXKI7p2a","W7cTsfcJOy","VIlwPuLtKs","F6PT264s8N","Yw2oUyofH3","uoStw2TRI7","0Kyfssoy9t","2NslmOHaBz",
+"gIYvEaFFss","ReKEWCK5W7","WMiS3lweGy","IRh48HfyNQ","sx5Gli3pyd","Rxrsmdpe1v","tvdkDRxrsm","2ZHdkTCgPp","tl72WQ6Lix","Cfgr3blLA9",
+"QnJ1She9IA","ni2v1yluBx","x3LDe2Nslm","OxWIHi7WMQ","XflUqtuDyS","FPfSEwDajX","blLA9WreyP","WaWsvI7p2a","3weIFB3qem","0PktIjfREu",
+"ZuDtDFcWrW","RkQke2Nslm","HP43307n1c","lj07Qv2eC3","7fsYMix74r","AXpwERsQUq","hUTw7HzZT8","yofH3L7cGc","ksJbyRpBQm","64s8NgIYvE",
+"L7cGcfmIK1","MaJQsWmadA","lpF6Wiqv4k","ZUnqtfmIK1","zY1GYCdyBV","8xEKzBpYhV","OxWIH6q6L9","ECMvUEdBKc","VjCZqgdQsS","45cIHPYBf4",
+"2TRI7KsjRK","FcWrWzqH0W","ydG8UUvlv4","fcJOyd85a9","ZUnqt2hEEU","VNCPdOUYuF","5Mg9rG1RhS","7X3uyMkgy8","zY1GYpAhR1","piJSkIBe8k",
+"QWxoTciuWz","5nmWv3otm6","Ss0ZuXflUq","RsQUq4QMc9","PYBf416lHc","uTacxnnP8o","d7vjMJ2mQi","5ZaEzzmLYD","SWfouprNT6","7Ow5C7hyVv",
+"i3pydbZLvS","U3yw5Ul4a1","YOfrYIn3NS","a00b5X6Pin","t59lRRsQUq","lXFOBJKWYR","QbxXcIKxdL","HlUbFs4786","LewvMatef2","pFrrlgtCA5",
+"n8pJ9MmsIo","0MR5XqUJMd","RpBQmNOHsz","GWqqXpFrrl","9iGoTjzUqR","brhlQhSSvQ","OHaBzZhwG1","zQt6Qo8Uyd","gIYvEprNT6","blLA9QssNC",
+"azIWpLewvM","FjHXRyToGW","Nxx9V7fKYU","7fsYM6q6L9","bZLvSFwEJz","JkzUnd7vjM","hi5X7W7cTs","euZA5fLNg8","lpF6WKsjRK","Pb1paIKxdL",
+"hi5X7NhXdu","aDGtSRmDcr","d85a9FFDui","uAWypEdBKc","jtn0XZ4I1v","Uvlv4hUTw7","YOfrYuvf7A","16lHc618Di","AOgEe3otm6","s4786lXFOB",
+"9y4lwRzaZA","29QAzZhwG1","RsQUqzHF1q","3otm6tAOsr","fLNg8QChxs","MojnPZUnqt","UlU3MLbRTH","m4bxUAOgEe","soy9t64s8N","blLA9FnPFB",
+"jzUqRoVQp6","DQimp45cIH","FVMxoRzaZA","0ao3ljfREu","v2eC3zQt6Q","gdQsSogLgc","zbIYYXyPZN","5VZjSUl4a1","P6bcgYjB9t","24ARFoQ87r",
+"HP433yToGW","XyPZNatef2","8hJdtgjUTu","JXljWtjQxs","zqH0WMezSW","oGu6xVBjhz","In3NS5ZaEz","gjUTu8hJdt","tjQxstAOsr","s7MxkokgRi",
+"lH1kts4786","mX2GEs93Ml","7Ow5Che9IA","5drc6gf8rI","0KyfsWPmlx","h1zcH9eoRc","8cVD3JJs5m","WmadAS77LH","d7vjMDcpWB","uoStwh1zcH",
+"prNT6RsQUq","AOgEeLewvM","2hEEU4QMc9","4W0TlQYxC0","WDVWJ2DREs","RBhp0MaJQs","Dz1R3zFgtB","x3LDelj07Q","9eoRcFcWrW","uoStw1LB1L",
+"K20wKECMvU","2TRI7Cp3mZ","jiVBPFnPFB","ZuDtDYjB9t","suY4xIKxdL","3weIFoVQp6","Waim6prNT6","hSSvQCNHmv","aez9ypWiOs","5IhmGUvlv4",
+"n1pmOCNHmv","14FLRFnPFB","tAOsrXflUq","hSSvQfcwDa","okgRifmIK1","qUJMdSjskQ","zmLYDaDGtS","SmGzvcQOnv","lj07Qru4UG","h1zcHmX2GE",
+"lXFOBm4bxU","5Mg9rRxrsm","VerEAzY1GY","IBe8kh1zcH","t98iWRACuj","G1RhS6q6L9","24ARF5nmWv","hE1QlFGzgp","Oz8yZlViBv","tAOsriKqhr",
+"iwzGkiKqhr","5drc6dmoS7","WPmlxLDk6f","jeskSRkQke","0YAGHCxVEf","pFrrlhi5X7","atef2yluBx","lm0pDSWfou","hE1Ql07n1c","s7MxkGrDg7",
+"kZANmx3LDe","lj07QBpYhV","VerEAOxWIH","kZANmJIqXi","0Wr5yFPfSE","QChxsdpe1v","pWiOsPOUYS","atef2jiVBP","S77LHuZPqg","Ss0ZuK4GS8",
+"d7vjM3otm6","DG4sTuQIcz","5nmWv5Namm","FNYIMKsjRK","MmKGJ9eoRc","ksJbygIYvE","m4bxULbRTH","TXQ0ZvkCHH","t59lRWDVWJ","Waim6xReec",
+"lXFOB0ao3l","9iGoTNo0Qb","l83UdWPmlx","BCxeC9eoRc","MK07YUmaEv","8RCUAgIYvE","M3zXLPb1pa","jS1ajx3LDe","FFDuiGrDg7","1j5L8ciuWz",
+"OUYuFFcWrW","TCgPptl72W","ksJbylH1kt","HfyNQBpYhV","VIlwPtuDyS","FnPFBOUqFM","ciuWzW3VFH","HRxd8ydG8U","9y4lwuJScX","Y1mC0W3VFH",
+"7X3uyDcpWB","qUJMdFVMxo","Gv3FqIRh48","POUYS0BmCy","qQxHP7fsYM","vOqCE5nmWv","fcwDaoVQp6","qQxHPgdQsS","Pb1paMkgy8","I7p2atuDyS",
+"Zv7z0lj07Q","5nmWvJXljW","FjHXRpiJSk","WreyP6q6L9","kB5nPStlDJ","RsQUq5ZaEz","9iGoTRxrsm","o8Uyd0YAGH","iKqhr0YAGH","Cp3mZQWxoT",
+"tjQxsIjTwP","vkCHHYw2oU","6q6L9t98iW","Nxx9V0Kyfs","rKDLJbrhlQ","2DREsVerEA","vLsmSulk41","5iGN5OUYuF","zHF1qjtn0X","CIShGAIYUu",
+"KASQ8zHF1q","7ku1puvf7A","zHF1qd85a9","14FLR5Namm","RsQUqaL6AJ","FFDuiru4UG","StlDJWreyP","NcICA3otm6","uZPqgWmadA","yEfy9n1pmO",
+"pmeCdksJby","2Yz7Ed7vjM","lCMxyfcwDa","l83UdpT8wu","sx5GltAOsr","LewvMEoToP","4W0TlbgJAz","BbwgA8U2nU","s4786zz4ZU","BpYhVBFkb8",
+"vOqCEHzZT8","7fsYMeuZA5","0BmCyazIWp","6AFT02ZHdk","OxWIH8cVD3","pAhR1kZANm","xciqppv0i7","RsQUqCp3mZ","CNHmvCdyBV","GWqqX5Mg9r",
+"Cp3mZJ2mQi","v1Hln14FLR","HP433xciqp","Y1mC0SbRYy","rz7UttvdkD","lj07Q7fsYM","k85AeMK07Y","sx5Glh1zcH","5NammX6Pin","CK5W7RsQUq",
+"0h1b1jzUqR","wiHrZDG4sT","FnPFB7Ow5C","HRxd8k85Ae","JkzUnP6bcg","pmeCdzY1GY","lkMUA48cHL","aL6AJLewvM","7X3uyYjB9t","uN6r36q6L9",
+"dpe1vni2v1","Uvlv4jSjS3","07n1cTXQ0Z","jS1aj5Drn0","KsjRKQssNC","ix74rK20wK","GXdoH5nmWv","tjQxs0Wr5y","iqv4klViBv","TXQ0ZPYBf4",
+"s4786aez9y","v8yFNDLhzM","SbRYyfaHir","i3pyd580YD","taOXKWaim6","Ul4a1yluBx","JIqXiaL6AJ","jtn0XCIShG","W7cTshE1Ql","xReeclsQGo",
+"XyPZNtjQxs","XflUqyluBx","YjB9t0ao3l","uvf7Alj07Q","07n1c7X3uy","XflUq5VZjS","WPmlxXyPZN","8U2nUQ6hMC","Mkgy8Yf2Ec","zbIYYuLtKs",
+"jSjS3K4GS8","lCMxyguMb8","JRJQBQbxXc","suY4xrhl0J","VLTy6hi5X7","qaofNaL6AJ","P6bcgEoToP","55rfBzbIYY","tlILtMaJQs","ogLgcx3LDe",
+"CxVEf9iGoT","7fsYM9eoRc","5ZaEzWMiS3","9XyT9618Di","WreyP24ARF","hi5X7fqypy","64s8NiB08l","BGaQYaFFss","Gv3FqIn3NS","9iGoTjtn0X",
+"iwzGkjfREu","hUTw7zY1GY","FhtglydG8U","ECMvUNcICA","KZamHlpF6W","vOqCEoQ87r","AkKTky94nw","MmsIoFGzgp","BCxeC16lHc","Cp3mZAIYUu",
+"G1RhShe9IA","SWfouRmDcr","QssNCEoToP","IBe8kI7p2a","iKqhrRmDcr","pWiOsWPmlx","suY4xogLgc","lpF6Wulk41","jS1ajrKDLJ","uoStwksJby",
+"okgRipFrrl","7ku1piKqhr","cmXIX48cHL","Cp3mZW3VFH","9XyT9Ta8f6","m4bxUrhl0J","Vprf2QWxoT","JRJQBCNHmv","uPX7GXflUq","2hEEUdmoS7",
+"he9IAnlaBy","BpYhVUvlv4","WMiS3fFDrJ","s4786POUYS","ru4UGpWiOs","S77LHnnP8o","XflUqhi5X7","QClRL5IhmG","DQimpulk41","29QAzFhtgl",
+"CNHmvzmLYD","ciuWzGSQwj","POUYSF6PT2","5iGN5QYxC0","djsrvZv7z0","cShY2s7Mxk","2Yz7Esx5Gl","8xEKzPOUYS","oQ87rWmadA","NAFuwQClRL",
+"lCMxytaOXK","5VZjSfqypy","FwEJzs7Mxk","JXljWoVQp6","y94nwsuY4x","yofH3MojnP","uAWypmX2GE","BbwgAuQIcz","9y4lwkZANm","prNT6GrDg7",
+"guMb8kB5nP","Z4I1vRxrsm","07n1csoy9t","1j5L8qUJMd","EdBKcJkzUn","tlILtAkKTk","JkzUnWaWsv","he9IAhYBCK","3otm6h1zcH","lCMxyWreyP",
+"0Wr5ywiHrZ","i3pydKZamH","SmGzvHzZT8","vLsmSkB5nP","Mkgy8uZPqg","GSQwjsx5Gl","8xEKz9XyT9","29QAzJIqXi","0ao3lfcJOy","TwanoblLA9",
+"BFkb8lm0pD","SmGzvrz7Ut","zmLYDWMiS3","vLsmSokgRi","07n1cNcICA","fcwDacQOnv","Mkgy8W7cTs","s4786FGzgp","KZamH2Yz7E","IjTwPOUqFM",
+"tvdkDzqH0W","WaWsvBbwgA","soy9tAIYUu","FVMxohUTw7","gjUTuSWfou","1j5L8TCgPp","rKDLJcmXIX","RxrsmMezSW","1v5hHoQ87r","okgRiiKqhr",
+"pmeCdfcJOy","0YAGHJ2mQi","NOHszqQxHP","7fKYUpFrrl","ulk41Ss0Zu","QChxs2Yz7E","14FLRF6PT2","Nxx9Vuvf7A","Pb1patvdkD","RpBQmlXFOB",
+"RBhp0GWqqX","Yh1hFguMb8","lXFOBMkgy8","guMb8lXFOB","tlILtRBhp0","zY1GY0Kyfs","4W0TllViBv","k85Ae7X3uy","soy9tgf8rI","Q6hMCqUJMd",
+"Kr8ysoGu6x","i3pyd5VZjS","b29RJFjHXR","iwzGkBbwgA","HlUbFMezSW","BGaQYn1pmO","n1pmOVprf2","uZPqgX6Pin","AmdQdgjUTu","QssNCfcJOy",
+"5nmWvpFrrl","uAWypsoy9t","ogLgcJXljW","dpe1vNxx9V","hUTw7ydG8U","9XyT98RCUA","4W0TlJ2mQi","pv0i70YAGH","cQOnvru4UG","vkCHHHzZT8",
+"9rlg9BGaQY","M6qcGfqypy","ZuDtD2ZHdk","2DREsAgJHQ","Mkgy8zFgtB","QnJ1Suupzk","cShY2tlILt","9GXkX0PktI","RBhp0b29RJ","jeskS24ARF",
+"3otm6Cp3mZ","rKDLJ8hJdt","GSQwjfmIK1","6AFT0pv0i7","JkzUnoQ87r","KsjRKgjUTu","MGlTFK4GS8","s93MlLewvM","5VZjS7ku1p","v1HlndQ586",
+"MezSWL7cGc","5NammOHaBz","s4786MezSW","StlDJRBhp0","LDk6f5nmWv","14FLRYjB9t","zHF1qyluBx","EoToPTwano","K4GS8lH1kt","i3pyd0BmCy",
+"jtn0X24ARF","4dEz6Ss0Zu","s4786VIlwP","YOfrYZUnqt","LbRTHRxrsm","FhtglrKDLJ","t59lRZJTXH","RACuj5Drn0","FnPFB9rlg9","vOqCErz7Ut",
+"qQxHPAmdQd","VIlwP3weIF","ix74rjfREu","zFgtBTXQ0Z","BCxeCzFgtB","Y1mC0MezSW","VBjhzciuWz","W3VFHCqqaD","cShY2NAFuw","ZhwG1Waim6",
+"lweGydmoS7","dQ586LewvM","YOfrYgdQsS","0KyfsCK5W7","Dz1R3HP433","SmGzvTCgPp","oQ87reuZA5","LewvMHRxd8","GXdoHMm8si","piJSkF6PT2",
+"kB5nPfmIK1","XflUqx3LDe","lCMxyzFgtB","Yw2oU618Di","EdBKc5ZaEz","Y1mC0piJSk","fmIK1tvdkD","QbxXc5VZjS","pT8wuHlUbF","LewvMFjHXR",
+"KsjRKY1mC0","FFDuipvgjS","uN6r3yToGW","nFqikjS1aj","FVMxojS1aj","RACuj4W0Tl","In3NSMm8si","Dz1R3uJScX","SmGzvzFgtB","b29RJ1v5hH",
+"aFFssIRh48","FxX9qPOUYS","8RCUAiwzGk","jzUqR5ZaEz","VjCZqFwEJz","HP4330MR5X","FPfSEsqVrf","4dEz6y94nw","HfyNQdjsrv","QssNCKr8ys",
+"SWfou7hyVv","uTacxnlaBy","BFkb8SbRYy","HzZT8HlUbF","rKDLJP6bcg","fFDrJW3VFH","LbRTH9iGoT","5iGN50PktI","yvOMI45cIH","SWfouxReec",
+"uN6r3n1pmO","M6qcGIjTwP","oVQp6t98iW","Mkgy8guMb8","X6PincQOnv","JKWYRrKDLJ","U3yw5zqH0W","uTacx580YD","uTacxpFrrl","LewvMYw2oU",
+"DG4sTVIlwP","fqypyJ2mQi","yEfy914FLR","0YAGHlsQGo","No0QbOUqFM","KZamHhSSvQ","WaWsvFNYIM","tAOsr16lHc","t98iW8hJdt","24ARFHzZT8",
+"cmXIXjeskS","PYBf42Yz7E","soy9tbrhlQ","Mm8sizHF1q","No0QbiwzGk","fLNg8Ss0Zu","0YAGHxciqp","Chuy3MaJQs","14FLRJXljW","2hEEUlkMUA",
+"zFgtBZv7z0","4dEz65IhmG","DG4sTjeskS","nnP8ofqypy","ThjNnD6rBy","SjskQWDVWJ","Twano5iGN5","4dEz69XyT9","7ku1p5Mg9r","5ZaEzY1mC0",
+"IjTwPUlU3M","2NslmSbRYy","9rlg9azIWp","lCMxyXyPZN","aez9yOxWIH","KsjRKYh1hF","DLhzMzqH0W","l83Ud5VZjS","ZJTXHfqypy","fmIK1AOgEe",
+"SjskQP6bcg","K20wK9XyT9","t98iWB3qem","4QMc9bZLvS","8xEKzjfREu","tl72WtaOXK","MmKGJjS1aj","PYBf4WPmlx","aDGtSWDVWJ","WPmlxcL0aE",
+"CK5W7No0Qb","d7vjMyEfy9","yluBxM6qcG","tjQxsThjNn","MGlTF1v5hH","0KyfsChuy3","VerEACqqaD","s4786VerEA","uAWypNcICA","FVMxoHRxd8",
+"JKWYRFxX9q","o8Uydlj07Q","JkzUnsoy9t","D6rBydhSuH","QWxoTgIYvE","faHirRxrsm","TCgPpJJs5m","lm0pDBCxeC","I7p2a14FLR","BpYhVDLhzM",
+"iB08ltvdkD","IKxdL24ARF","RACujlXFOB","NcICAL7cGc","WaWsvokgRi","5nmWvChuy3","W3VFHX6Pin","8U2nUv1Hln","ni2v1i7WMQ","VNCPdsx5Gl",
+"uupzkRBhp0","he9IAYh1hF","RBhp0OUqFM","ZuDtDSs0Zu","oGu6xQYxC0","1LB1Ltl72W","dmoS78FmFH","tl72WyluBx","8FmFH55rfB","JRJQBCqqaD",
+"Gv3FqQssNC","lH1kt2TRI7","TXQ0Zk85Ae","ZzJHW2DREs","blLA929QAz","sqVrfyvOMI","zFgtB3otm6","n8pJ9iKqhr","aFFssVjCZq","9eoRcVLTy6",
+"SbRYym4bxU","k85AelkMUA","5Drn024ARF","WPmlxEdBKc","HlUbFfcwDa","VjCZq48cHL","zFgtBIjTwP","0PktI14FLR","jSjS3YjB9t","RxrsmP6bcg",
+"JkzUnqUJMd","TCgPpokgRi","2hEEU8hJdt","yEfy9GSQwj","RpBQms93Ml","fFDrJ2DREs","AIYUutuDyS","Cfgr3HlUbF","ZJTXHQssNC","e6e4zRkQke",
+"MmKGJ6AFT0","o8UydgdQsS","guMb85Drn0","8hJdtOxWIH","G1RhSlkMUA","mX2GEoVQp6","7fKYUvkCHH","2TRI7aez9y","zHF1qK20wK","W3VFHCNHmv",
+"Q6hMCzz4ZU","0YAGHPYBf4","hi5X7JkzUn","kB5nPlpF6W","QYxC08RCUA","e6e4zUvlv4","Vprf2EOE1o","nnP8o8FmFH","vOqCEKZamH","SWfouYjB9t",
+"I7p2agjUTu","9XyT9wDajX","Twanoxciqp","gjUTuFwEJz","OUYuFpiJSk","RxrsmsqVrf","RpBQmLewvM","MK07YhSSvQ","0BmCy5Mg9r","Vprf245cIH",
+"5VZjSiqv4k","uPX7Gmz8gx","zFgtBqUJMd","d7vjMQWxoT","nnP8oD6rBy","LewvMxReec","XyPZNWaWsv","618Di2TRI7","hYBCKJIqXi","yEfy9Q6Lix",
+"zqH0WZv7z0","FhtglGWqqX","5IhmGQnJ1S","WPmlxzz4ZU","lCMxyxciqp","l83UdguMb8","GXdoHK4GS8","a00b5lXFOB","HzZT8jfREu","Cp3mZYh1hF",
+"LbRTHIn3NS","VBjhzOz8yZ","t98iWiB08l","No0QbCfgr3","x3LDe7hyVv","4dEz6DG4sT","VjCZqFxX9q","Gv3Fqo8Uyd","CK5W7e6e4z","CNHmvP6bcg",
+"55rfBjtn0X","aFFsslweGy","rz7UtYOfrY","nFqikAkKTk","TCgPpY1mC0","brhlQS2Dfu","DcpWBKASQ8","v8yFNTa8f6","uvf7Adjsrv","W7cTsOUqFM",
+"OUYuF0ao3l","LDk6flj07Q","YOfrYVerEA","7lUXZsuY4x","hSSvQuAWyp","lm0pDVerEA","In3NSyToGW","azIWpFPfSE","ogLgcGXdoH","Dz1R3Cp3mZ",
+"pWiOstAOsr","GXdoHrz7Ut","blLA9Gv3Fq","F6PT207n1c","jeskSd85a9","Cp3mZ7fsYM","VNCPdYOfrY","Zv7z0rKDLJ","55rfBb29RJ","M6qcG8RCUA",
+"5Drn0blLA9","CK5W7wiHrZ","Yw2oUSs0Zu","IRh48X6Pin","7ku1pQ6Lix","mz8gxHP433","zQt6QDG4sT","MGlTFd7vjM","ydG8UxXTI4","64s8NzHF1q",
+"jSjS39rlg9","lweGy2Yz7E","v1HlntvdkD","OUqFMdjsrv","zmLYD2DREs","CK5W7rhl0J","TCgPptlILt","VLTy6yEfy9","POUYSuQIcz","Yh1hF9y4lw",
+"WMiS34dEz6","9y4lwbrhlQ","Mkgy8VNCPd","GWqqX1LB1L","D6rByjS1aj","fcwDa2TRI7","8U2nUVBjhz","euZA5uTacx","azIWpSs0Zu","lXFOBBFkb8",
+"618Di2Nslm","v2eC3CIShG","guMb82Yz7E","7hyVv2DREs","azIWpJXljW","Ul4a10BmCy","Cp3mZe6e4z","HzZT8AmdQd","t59lR5Namm","y94nwcShY2",
+"XyPZNuAWyp","5drc6qaofN","tjQxsJ2mQi","KASQ816lHc","Q6hMCRkQke","GXdoHMGlTF","FwEJzRACuj","vLsmSBCxeC","suY4xlH1kt","ZJTXH9rlg9",
+"MaJQsn8pJ9","cL0aE8RCUA","55rfBbrhlQ","4QMc9NOHsz","lCMxyM6qcG","WDVWJMm8si","iB08lAIYUu","9iGoTCK5W7","djsrvVprf2","0ao3l0MR5X",
+"618DiPb1pa","piJSkzQt6Q","QChxsCfgr3","CK5W7sx5Gl","DQimpL7cGc","YjB9tF6PT2","uQIczM3zXL","n8pJ9oVQp6","9XyT9WmadA","OUYuFfqypy",
+"5ZaEzOUYuF","dhSuHNAFuw","djsrvHP433","AgJHQ9y4lw","9rlg9bgJAz","45cIHRACuj","EoToP8U2nU","OUqFMPOUYS","KASQ8LewvM","hE1Ql9XyT9",
+"gtCA5vOqCE","iwzGkoGu6x","RmDcrgf8rI","4W0TlFhtgl","7fKYUGv3Fq","OxWIHsx5Gl","AgJHQhUTw7","IRh48vOqCE","aez9yDz1R3","IBe8khUTw7",
+"BCxeCThjNn","NOHszVprf2","uJScXk85Ae","DLhzMReKEW","1LB1L2DREs","vOqCEQYxC0","EdBKcvOqCE","DcpWBPb1pa","sx5Gl4W0Tl","sx5GlNOHsz",
+"WMiS3zY1GY","yvOMI7fKYU","7X3uyNo0Qb","uN6r3BGaQY","aez9yBCxeC","uvf7AIKxdL","JKWYRrz7Ut","TwanoVBjhz","Gv3FqtAOsr","djsrvuupzk",
+"5drc6MmsIo","3weIFMm8si","5IhmGatef2","NAFuwBGaQY","HRxd8HP433","0KyfssqVrf","CNHmvKr8ys","9rlg9euZA5","o8UyduN6r3","OUqFMVBjhz",
+"8FmFHGv3Fq","29QAzzbIYY","WmadADQimp","rz7UtHfyNQ","Q6hMC29QAz","9GXkXK20wK","Waim6Yw2oU","FwEJzTXQ0Z","dQ58607n1c","FjHXRv8yFN",
+"ECMvUsuY4x","TwanotAOsr","guMb82TRI7","sx5Gl5iGN5","pAhR1cL0aE","CdyBVZUnqt","FhtgluTacx","d85a91LB1L","RkQke5Drn0","pAhR1tjQxs",
+"StlDJe6e4z","5ZaEzEdBKc","zY1GYs93Ml","64s8NoQ87r","G1RhSpT8wu","ksJby5Namm","FPfSElweGy","jiVBPFwEJz","FhtglTa8f6","uPX7GEOE1o",
+"580YDFLsph","5NammOUqFM","StlDJQClRL","IBe8kcQOnv","qUJMdCIShG","KASQ8Pb1pa","lH1ktRsQUq","W3VFHMGlTF","0KyfsRmDcr","iKqhrD6rBy",
+"vkCHHtaOXK","cmXIXzbIYY","L7cGcjzUqR","fcwDaStlDJ","2ZHdkHP433","Yh1hFh1zcH","SbRYyGSQwj","OxWIHuN6r3","prNT64QMc9","MGlTFiwzGk",
+"hE1QldmoS7","xciqp3weIF","ru4UGFVMxo","GSQwjHRxd8","2ZHdk8RCUA","ECMvUCNHmv","MK07YwiHrZ","CdyBVqUJMd","RsQUq29QAz","pmeCdBpYhV",
+"soy9tv2eC3","CNHmvRsQUq","pvgjS618Di","sx5Gll83Ud","GrDg7QbxXc","fLNg8rz7Ut","9iGoT5Namm","1v5hH2Yz7E","uJScXS77LH","NhXdu2hEEU",
+"LewvMix74r","s7MxkQ6hMC","L7cGcRkQke","Yf2Ec8cVD3","JIqXiNo0Qb","7hyVvlH1kt","4dEz6Mkgy8","EoToPHP433","7X3uyguMb8","IRh48S2Dfu",
+"Zv7z0JkzUn","pv0i7vkCHH","X6Pinru4UG","SbRYyReKEW","NcICAI7p2a","NhXdulXFOB","aDGtS55rfB","0YAGHRBhp0","Z4I1vFhtgl","guMb8QssNC",
+"jfREul83Ud","IRh48iqv4k","RzaZAv2eC3","hUTw79iGoT","kZANmRmDcr","QnJ1S2ZHdk","tuDySnnP8o","jSjS3kZANm","pvgjSG1RhS","fLNg88RCUA",
+"yluBxXyPZN","5iGN58RCUA","jzUqREOE1o","5NammYf2Ec","yToGWFnPFB","QWxoTa00b5","cL0aEh1zcH","pv0i7pFrrl","O3iyQn8pJ9","16lHcix74r",
+"zmLYDW7cTs","5VZjSOHaBz","dpe1v8TxD7","MmsIoJXljW","FVMxojeskS","tlILtZUnqt","fLNg85Mg9r","IBe8kWMiS3","WDVWJWreyP","RBhp0SbRYy",
+"qaofNOUYuF","KZamHyvOMI","uAWypGv3Fq","2ZHdkjS1aj","Yh1hFHRxd8","ix74rix74r","pWiOsiB08l","tlILtIRh48","prNT6gtCA5","In3NSbZLvS",
+"WreyPOz8yZ","VIlwPkB5nP","i7WMQlkMUA","LDk6fRkQke","CNHmvnlaBy","7ku1pwDajX","VjCZq3weIF","ZJTXHMK07Y","9rlg9ogLgc","gtCA5QChxs",
+"fmIK15IhmG","8RCUAjeskS","1LB1LcShY2","POUYSVLTy6","RzaZARpBQm","SmGzvReKEW","soy9ts4786","WreyPqaofN","WaWsvxReec","WMiS3WDVWJ",
+"s4786Yw2oU","i3pydF6PT2","YOfrYulk41","gtCA5jfREu","yToGWQClRL","dhSuH6q6L9","Q6hMCStlDJ","64s8NCdyBV","pFrrlCqqaD","lj07QC2Irc",
+"AOgEeDz1R3","uJScXAmdQd","b29RJyvOMI","cmXIXrKDLJ","Z4I1vCIShG","tl72WFcWrW","n8pJ9Qworu","QssNC0PktI","lViBv3weIF","YjB9tlsQGo",
+"RmDcrSjskQ","uvf7AThjNn","v2eC3ix74r","lH1kt4dEz6","CdyBVP6bcg","HlUbFfmIK1","GrDg75drc6","mX2GEbgJAz","oGu6xtAOsr","BpYhVn8pJ9",
+"HzZT8euZA5","Ss0ZupT8wu","lsQGo8TxD7","iB08lFVMxo","4W0TleuZA5","SjskQhSSvQ","0PktIDz1R3","lkMUAtAOsr","AkKTks93Ml","2TRI7W3VFH",
+"M6qcGiKqhr","G1RhSlsQGo","SbRYyNxx9V","uvf7AvLsmS","SWfouQnJ1S","xXTI4WMiS3","i7WMQGSQwj","hi5X7azIWp","8TxD7QssNC","aFFsslCMxy",
+"FnPFBrKDLJ","2hEEUJIqXi","P6bcgAkKTk","zz4ZUFPfSE","Zv7z0NcICA","fqypyiKqhr","I7p2adhSuH","lsQGoNcICA","o8Uydhi5X7","GrDg73weIF",
+"MezSWOUYuF","rz7Ut1v5hH","JXljWmX2GE","WaWsvW3VFH","fcwDad85a9","6AFT0BCxeC","zFgtBpiJSk","Gv3FqBGaQY","guMb8OxWIH","JIqXipv0i7",
+"BGaQYZ4I1v","FGzgpJKWYR","DLhzMzY1GY","QChxs3weIF","9iGoTvkCHH","8FmFHcShY2","DLhzM48cHL","6AFT0mz8gx","aez9yGWqqX","FVMxoOHaBz",
+"S77LHHRxd8","WPmlxbgJAz","9GXkXgdQsS","WmadACfgr3","AIYUuEdBKc","DLhzMY1mC0","EdBKcMezSW","suY4xzY1GY","gdQsS3weIF","EdBKcTCgPp",
+"U3yw5BCxeC","HfyNQAOgEe","GWqqX4dEz6","iwzGkYjB9t","6q6L9RBhp0","hUTw77ku1p","QworuRBhp0","zHF1q6q6L9","pv0i7Nxx9V","s4786IjTwP",
+"BbwgAulk41","Uvlv45drc6","DcpWBhE1Ql","pFrrl5ZaEz","POUYSbZLvS","DQimpOxWIH","No0QbZhwG1","AOgEeYw2oU","EoToPpWiOs","XyPZNlViBv",
+"OHaBzUmaEv","AIYUu0h1b1","RpBQmvLsmS","mX2GEVNCPd","HlUbFv8yFN","LDk6fWMiS3","AmdQdJkzUn","WDVWJVNCPd","OHaBzpiJSk","6AFT0VIlwP",
+"n1pmO5drc6","GSQwjvkCHH","WPmlxvLsmS","2DREsQ6hMC","FPfSEIjTwP","CNHmvpiJSk","ZUnqtjtn0X","2DREsk85Ae","TXQ0Z7fKYU","14FLRCdyBV",
+"IRh48VBjhz","Chuy3VjCZq","kZANmIn3NS","0ao3lG1RhS","45cIHMmsIo","WPmlxP6bcg","kZANmTXQ0Z","9y4lwWaWsv","FLsphDLhzM","PYBf4YjB9t",
+"yluBxP6bcg","JJs5mVprf2","ThjNnGXdoH","P6bcg8U2nU","X6PinIn3NS","fqypyt98iW","lpF6WlsQGo","TXQ0Z2DREs","BbwgAhSSvQ","ydG8U4dEz6",
+"QnJ1SQbxXc","o8Uydru4UG","P6bcgogLgc","ulk41SjskQ","7X3uyIRh48","suY4xMkgy8","a00b5uvf7A","0YAGHCK5W7","rKDLJpAhR1","fcwDaydG8U",
+"24ARFM3zXL","9iGoTatef2","P6bcgaFFss","lkMUA5Namm","ydG8Um4bxU","VNCPdHP433","lCMxySbRYy","e6e4zQssNC","n8pJ9tuDyS","FVMxov1Hln",
+"fcwDafLNg8","IRh48POUYS","DQimpfaHir","jeskSGWqqX","Uvlv4HP433","BpYhVEdBKc","AmdQdCdyBV","yofH3KZamH","8TxD7FnPFB","Dz1R3aL6AJ",
+"iB08lAOgEe","RpBQmWaWsv","yToGWfqypy","C2Irci3pyd","oGu6xMK07Y","M6qcGs7Mxk","uPX7Gv1Hln","pAhR1D6rBy","XyPZNjtn0X","IKxdLKZamH",
+"pFrrlThjNn","Gv3FqYf2Ec","JRJQBaez9y","wDajXSjskQ","KsjRKy94nw","2TRI79eoRc","7Ow5C55rfB","lkMUANo0Qb","UmaEvbZLvS","EOE1oS77LH",
+"cShY2In3NS","zbIYYogLgc","TCgPpDz1R3","ciuWzNo0Qb","ZhwG1e6e4z","F6PT2Pb1pa","HlUbF7fsYM","8RCUALbRTH","9iGoTQWxoT","y94nwHP433",
+"wDajX6q6L9","AkKTk7ku1p","t59lRG1RhS","7X3uyFnPFB","5Nammn8pJ9","2TRI7HlUbF","QworuY1mC0","FcWrWThjNn","BGaQYRxrsm","M3zXLFLsph",
+"POUYSe6e4z","TXQ0ZjiVBP","jS1ajNcICA","WmadABbwgA","Yh1hFrz7Ut","tAOsrMojnP","S77LHuJScX","pmeCdnnP8o","CdyBVVIlwP","8xEKzAIYUu",
+"Qworu0Wr5y","QssNCDQimp","PYBf4k85Ae","VNCPdwiHrZ","Q6LixBCxeC","d85a9n1pmO","MmsIofqypy","yToGWQbxXc","55rfBYh1hF","pv0i707n1c",
+"ni2v1MK07Y","suY4xuTacx","wiHrZlpF6W","VjCZqbgJAz","0BmCyMmKGJ","FVMxorhl0J","jS1ajtuDyS","JKWYRlj07Q","y94nwy94nw","BCxeCvLsmS",
+"Zv7z0nFqik","hE1QlFnPFB","UmaEvfcJOy","v8yFNyluBx","9XyT9lpF6W","HP433M3zXL","lweGyFVMxo","JIqXiMezSW","y94nwzqH0W","cShY2Twano",
+"v8yFNHlUbF","QWxoTWDVWJ","ydG8UP6bcg","NAFuwgjUTu","HP433CdyBV","FPfSE55rfB","TCgPpFhtgl","atef2UmaEv","o8UydD6rBy","jS1ajBFkb8",
+"MmKGJoQ87r","uZPqgm4bxU","FGzgpvOqCE","vOqCEEOE1o","iwzGk2ZHdk","Z4I1vSs0Zu","lH1ktWPmlx","suY4xi7WMQ","7X3uyHzZT8","G1RhSpvgjS",
+"yEfy9FLsph","RBhp0NOHsz","ThjNnprNT6","bgJAzWMiS3","euZA5WreyP","Gv3FqjeskS","7X3uydhSuH","Pb1papvgjS","uN6r39eoRc","Nxx9VQbxXc",
+"KZamHjzUqR","GWqqXYw2oU","qQxHPo8Uyd","9GXkXHfyNQ","cQOnvAIYUu","jtn0XiB08l","mX2GEx3LDe","ix74rMGlTF","Oz8yZzz4ZU","Yf2EcguMb8",
+"lpF6WG1RhS","1LB1Lm4bxU","AOgEeiwzGk","brhlQs4786","M6qcGDQimp","CdyBVAgJHQ","e6e4zVNCPd","hSSvQ2Yz7E","0MR5XCxVEf","suY4xCfgr3",
+"4QMc97fsYM","NhXduFVMxo","UmaEvWaim6","OHaBzSs0Zu","kZANm0ao3l","4W0TlThjNn","Vprf2m4bxU","d7vjMokgRi","dmoS75Drn0","aDGtSS2Dfu",
+"ru4UGmz8gx","jS1ajiKqhr","K4GS8bgJAz","Y1mC0SmGzv","i7WMQt59lR","OxWIHTa8f6","m4bxU3weIF","LbRTH7hyVv","0KyfsMojnP","qQxHP5iGN5",
+"5nmWvCdyBV","BbwgAni2v1","FnPFB1v5hH","HP433Dz1R3","oVQp6guMb8","FGzgp8FmFH","IjTwPKsjRK","lXFOBFwEJz","QbxXcTwano","oVQp61j5L8",
+"QClRLB3qem","yluBxfqypy","y94nwUl4a1","gdQsS1LB1L","0Kyfs8TxD7","5Mg9rXflUq","m4bxUtl72W","oGu6xBpYhV","7Ow5CfFDrJ","FhtglFVMxo",
+"BbwgA29QAz","ZhwG1FPfSE","Z4I1vAXpwE","Vprf22ZHdk","l83UdfaHir","qQxHPzY1GY","EdBKcQ6hMC","TwanoJRJQB","RsQUqy94nw","RzaZAMezSW",
+"lCMxyfLNg8","faHirFNYIM","C2IrcKZamH","soy9tcL0aE","wDajXaL6AJ","X6PinjeskS","a00b5yEfy9","X6Pindjsrv","brhlQQWxoT","pT8wuv2eC3",
+"s4786mX2GE","QworuSmGzv","OUYuFUlU3M","0MR5XIRh48","1j5L8lj07Q","hYBCKv1Hln","xReecbgJAz","zY1GYyluBx","IBe8kn1pmO","i3pydaFFss",
+"gf8rIjiVBP","hi5X7hYBCK","kZANmWaim6","U3yw5QnJ1S","yvOMINcICA","m4bxUNhXdu","lCMxyZ4I1v","24ARFDG4sT","NhXduK4GS8","cmXIXFhtgl",
+"lpF6Wo8Uyd","0PktIAmdQd","zqH0WZuDtD","StlDJfLNg8","l83Uds93Ml","5drc6Rxrsm","LewvMSbRYy","okgRi3otm6","UmaEvRxrsm","M3zXLXflUq",
+"2hEEU0ao3l","3weIFQworu","QnJ1SzFgtB","YOfrYMojnP","AgJHQiB08l","VBjhzY1mC0","y94nwlj07Q","uN6r39XyT9","7lUXZqQxHP","lkMUAQ6hMC",
+"ru4UGzFgtB","tl72WyEfy9","uAWypReKEW","5Drn055rfB","FFDuiix74r","Y1mC05Drn0","oGu6xHlUbF","uPX7Gn8pJ9","MezSW0Wr5y","nFqikyluBx",
+"MmKGJNAFuw","yEfy9soy9t","jtn0XVNCPd","7X3uyzz4ZU","Waim65Namm","kB5nPkB5nP","BGaQY5iGN5","GrDg7M6qcG","xciqpDcpWB","pAhR1Dz1R3",
+"uZPqgBpYhV","nnP8owDajX","s47860PktI","GrDg77fsYM","FcWrWB3qem","HP433Y1mC0","he9IA8FmFH","Vprf2zmLYD","pWiOszY1GY","FcWrWEoToP",
+"0KyfsCxVEf","TXQ0Zi3pyd","pFrrlMojnP","GrDg7ThjNn","Z4I1v7ku1p","SjskQZJTXH","EoToPSs0Zu","soy9tYOfrY","MGlTFSWfou","s93MljfREu",
+"FjHXRlViBv","aFFssi3pyd","jtn0XaDGtS","QChxstl72W","5ZaEzRACuj","XflUqAXpwE","9rlg9pT8wu","GSQwjqaofN","b29RJAgJHQ","bgJAzjS1aj",
+"0PktI0MR5X","MGlTFFwEJz","Chuy3VBjhz","xReecQClRL","zY1GYlViBv","Cfgr3okgRi","ru4UGIRh48","WPmlxNOHsz","WMiS3Gv3Fq","NOHszjeskS",
+"bgJAzfLNg8","s7MxkjiVBP","EdBKc48cHL","dhSuH2ZHdk","pAhR1uvf7A","blLA9hYBCK","oGu6x0Kyfs","okgRiZUnqt","RkQkelj07Q","RpBQmZzJHW",
+"W7cTsuvf7A","W3VFHt59lR","K20wKZuDtD","gf8rIFjHXR","D6rBylm0pD","8TxD7RzaZA","IRh48ReKEW","euZA5Ta8f6","Chuy34QMc9","KsjRKPb1pa",
+"pmeCd0YAGH","0Wr5yS77LH","2NslmuZPqg","TCgPpFVMxo","HfyNQIRh48","yluBxNAFuw","FnPFBs4786","Ss0ZuOUqFM","aFFssuLtKs","XyPZNlpF6W",
+"fFDrJCNHmv","fcwDa8U2nU","tvdkDZUnqt","aFFssd85a9","M3zXL7fsYM","cL0aEEoToP","7ku1pLewvM","DG4sTLbRTH","MmKGJWreyP","U3yw5o8Uyd",
+"Yw2oU7hyVv","AgJHQ580YD","AOgEe6AFT0","5Mg9rEoToP","t98iWjSjS3","48cHLs7Mxk","FxX9qh1zcH","EOE1ol83Ud","Uvlv4tjQxs","Ss0Zu0BmCy",
+"yvOMIuLtKs","K4GS8gf8rI","IRh48okgRi","0Kyfs2Yz7E","8xEKzprNT6","kZANmWmadA","okgRiSbRYy","lCMxy0BmCy","AOgEenFqik","2Yz7EYOfrY",
+"24ARFlH1kt","IjTwPHP433","pv0i7Mkgy8","VerEASjskQ","e6e4zVBjhz","Oz8yZRxrsm","Cfgr3WmadA","GSQwjJ2mQi","OHaBza00b5","M3zXLBpYhV",
+"QChxsLDk6f","pmeCdDLhzM","aDGtSv1Hln","FnPFBUlU3M","jS1ajtlILt","bgJAzpv0i7","ksJbylweGy","J2mQi8U2nU","kB5nPaDGtS","gtCA5U3yw5",
+"MojnP0Wr5y","d7vjM8TxD7","Yw2oUv8yFN","tAOsrPYBf4","iqv4kydG8U","Q6LixYOfrY","K20wKRkQke","azIWpe6e4z","l83UdFhtgl","BFkb8HzZT8",
+"WMiS3yofH3","Q6Lixxciqp","x3LDepvgjS","0BmCyAmdQd","Yh1hFFPfSE","9eoRcxXTI4","aDGtSRkQke","6AFT0oVQp6","iKqhrSs0Zu","Pb1paCqqaD",
+"pvgjSFxX9q","JXljWuQIcz","qaofNF6PT2","suY4xlweGy","OxWIHjfREu","pWiOsEdBKc","2NslmNo0Qb","xReechYBCK","ix74rUlU3M","zHF1qGWqqX",
+"G1RhSVprf2","55rfB9y4lw","LbRTHUl4a1","9iGoTix74r","XyPZNY1mC0","lViBvpmeCd","DcpWBwiHrZ","ReKEW5ZaEz","8cVD3AOgEe","No0QbiB08l",
+"FxX9q9iGoT","rKDLJ5IhmG","QYxC0xReec","xXTI4EoToP","NOHszUmaEv","t98iWfLNg8","U3yw5NOHsz","uvf7AydG8U","pAhR1Mkgy8","RzaZACIShG",
+"m4bxUpFrrl","RzaZAKZamH","Ul4a1mz8gx","Q6hMCWmadA","WMiS3ECMvU","rhl0Julk41","MmKGJYOfrY","HRxd8D6rBy","lViBvFPfSE","oQ87rQWxoT",
+"a00b5dpe1v","hSSvQAXpwE","KsjRKdmoS7","hUTw7HRxd8","zFgtBNOHsz","uZPqgBFkb8","FwEJzmX2GE","zqH0WRsQUq","9GXkXVjCZq","FGzgp64s8N",
+"Waim6G1RhS","zHF1qtaOXK","5iGN5zFgtB","yToGWh1zcH","8TxD7bgJAz","mz8gx8cVD3","AmdQd2TRI7","JJs5msx5Gl","kZANmbgJAz","9eoRcW7cTs",
+"F6PT2MK07Y","yofH3MezSW","aDGtSxReec","JJs5mnlaBy","vLsmShYBCK","0KyfsZUnqt","8FmFH16lHc","jtn0XVjCZq","FxX9q9GXkX","5iGN5dQ586",
+"s93MlqUJMd","EoToP55rfB","2DREsEoToP","4QMc9U3yw5","CqqaDHlUbF","lH1ktVBjhz","FPfSEChuy3","zFgtBQYxC0","Zv7z0MojnP","4dEz6hi5X7",
+"J2mQisuY4x","7fsYMFnPFB","3weIFWaWsv","JKWYRUlU3M","9iGoTZzJHW","9iGoTM6qcG","uvf7ALbRTH","Uvlv49iGoT","cL0aE7fKYU","QChxs1LB1L",
+"tuDySZuDtD","iwzGkuN6r3","5NammUlU3M","5Mg9r618Di","prNT624ARF","BFkb80PktI","s7MxkfmIK1","RBhp0KZamH","WDVWJlsQGo","m4bxUECMvU",
+"Ul4a1pv0i7","azIWp7Ow5C","0PktIOHaBz","TXQ0ZtjQxs","JRJQByluBx","wDajXs93Ml","JkzUnyvOMI","a00b5qQxHP","QClRLkZANm","LDk6fGv3Fq",
+"hUTw7TCgPp","FGzgpGv3Fq","HRxd87fKYU","djsrv4W0Tl","ydG8U7Ow5C","TXQ0ZtaOXK","ZUnqtVjCZq","MK07YuN6r3","s93Mlsx5Gl","ni2v1Pb1pa",
+"UmaEv8RCUA","Pb1paRkQke","TCgPpHfyNQ","NAFuwuAWyp","dQ5865ZaEz","RpBQmTa8f6","pAhR1EOE1o","EdBKcVIlwP","s93MlUvlv4","55rfBB3qem",
+"i3pyd5Mg9r","dpe1vzY1GY","QClRL5VZjS","G1RhSmX2GE","UmaEvvOqCE","s93MleuZA5","Dz1R3nnP8o","2DREsAIYUu","SWfouo8Uyd","iB08lbZLvS",
+"0ao3l0ao3l","ydG8UZv7z0","NOHsztAOsr","POUYSxciqp","RzaZA07n1c","7lUXZBbwgA","yvOMIv1Hln","ZuDtDyvOMI","LDk6fIjTwP","W3VFH5iGN5",
+"kZANmpAhR1","lpF6W7X3uy","RxrsmFVMxo","QnJ1SjiVBP","JkzUnU3yw5","7X3uyzqH0W","MGlTFDG4sT","IBe8kRmDcr","FwEJzVNCPd","IjTwPxciqp",
+"fcwDaNxx9V","CdyBVWMiS3","0h1b12hEEU","9iGoT7X3uy","G1RhSMGlTF","5Mg9r5iGN5","No0Qb5VZjS","618DipvgjS","EOE1o9XyT9","RzaZAJJs5m",
+"9y4lwyEfy9","i3pydpWiOs","B3qemiwzGk","qaofNVLTy6","AgJHQprNT6","580YDQbxXc","aez9yjzUqR","Ss0ZuVerEA","yofH3HlUbF","hUTw7xXTI4",
+"SWfouC2Irc","zFgtBBpYhV","Y1mC09GXkX","iqv4klsQGo","AmdQdbgJAz","tl72WWmadA","FjHXRa00b5","48cHLZzJHW","AgJHQHlUbF","F6PT2d7vjM",
+"4dEz6aDGtS","K4GS8jeskS","9eoRcHP433","45cIHYf2Ec","IBe8kUvlv4","lViBvgtCA5","8RCUARmDcr","jiVBPpAhR1","X6PinjzUqR","tjQxspv0i7",
+"IjTwPkB5nP","4QMc9pFrrl","dmoS7Yh1hF","rhl0Jd85a9","K20wKcL0aE","S2DfuM3zXL","lViBv618Di","WMiS37ku1p","RACujfaHir","JKWYRcmXIX",
+"HlUbF7hyVv","9y4lwulk41","0PktIECMvU","1j5L8W7cTs","ZuDtDECMvU","FLsphRzaZA","K4GS8AmdQd","BFkb8Ul4a1","S77LHb29RJ","Cp3mZs4786",
+"FjHXRxciqp","BbwgAWDVWJ","cShY21j5L8","RBhp0pT8wu","sqVrfRBhp0","Vprf2uQIcz","xReecQssNC","07n1cRACuj","7fKYU0ao3l","In3NSEOE1o",
+"pT8wuo8Uyd","hUTw7YjB9t","UlU3McShY2","CK5W7djsrv","Dz1R3BpYhV","n8pJ948cHL","QworuSbRYy","AOgEeQworu","suY4x5VZjS","GSQwjhUTw7",
+"guMb8VLTy6","BbwgA4W0Tl","OUqFMFxX9q","sx5GlbgJAz","4dEz6kB5nP","ix74rtuDyS","dQ5862ZHdk","tl72WgIYvE","IBe8kAIYUu","ni2v1YjB9t",
+"zz4ZUECMvU","OHaBzjfREu","blLA9SbRYy","Mkgy8GSQwj","oVQp6uLtKs","vLsmSaFFss","Z4I1v7Ow5C","uAWyp7hyVv","yofH3FnPFB","2NslmRkQke",
+"Ss0ZuChuy3","07n1cYw2oU","L7cGcFnPFB","Z4I1vWaim6","StlDJtAOsr","5iGN5WreyP","DQimp9GXkX","JKWYRMaJQs","t59lRkB5nP","aL6AJMezSW",
+"ru4UGNOHsz","hSSvQt59lR","WMiS3uZPqg","ogLgclpF6W","W3VFHyToGW","U3yw5gjUTu","DLhzMSWfou","aDGtS7ku1p","SjskQMGlTF","IBe8kzz4ZU",
+"jtn0Xsoy9t","2Nslm7ku1p","RxrsmVNCPd","29QAzMmKGJ","zHF1qwiHrZ","IRh48t59lR","OHaBzgjUTu","suY4xFFDui","NOHszv1Hln","djsrvqQxHP",
+"gf8rIMmsIo","v2eC37X3uy","v2eC3jS1aj","Rxrsm8RCUA","gIYvERBhp0","s7Mxk5Mg9r","pAhR1hSSvQ","HP4338xEKz","07n1c7fsYM","cQOnvbrhlQ",
+"piJSkBCxeC","uupzkFjHXR","oGu6xOz8yZ","lsQGohE1Ql","9XyT9jiVBP","5IhmGIRh48","FGzgpuN6r3","NAFuwQnJ1S","MojnP64s8N","oQ87rmz8gx",
+"OHaBzOxWIH","lsQGoFPfSE","DG4sTt59lR","JIqXihSSvQ","0YAGHZv7z0","lj07QQ6Lix","zHF1qhUTw7","9rlg92hEEU","ZhwG17fsYM","djsrvnnP8o",
+"uPX7GyToGW","OHaBzqUJMd","uQIczprNT6","pmeCdjSjS3","yluBx7X3uy","sx5GlMkgy8","LDk6fydG8U","YOfrYNo0Qb","FxX9qC2Irc","FcWrWFVMxo",
+"Nxx9VaL6AJ","k85AeSWfou","2ZHdkjfREu","AIYUupWiOs","pv0i77fsYM","C2Irc2Nslm","FcWrWMaJQs","K20wKtAOsr","In3NSn8pJ9","OUYuFyToGW",
+"5drc67lUXZ","Ss0Zu8RCUA","soy9tHRxd8","brhlQvkCHH","FFDuis93Ml","yEfy9iKqhr","atef2fcJOy","CxVEf5drc6","FcWrWRsQUq","5ZaEzfLNg8",
+"he9IAa00b5","m4bxUWMiS3","ECMvUAXpwE","azIWpJ2mQi","AXpwEjeskS","ThjNnmz8gx","5Mg9rC2Irc","5Mg9rgjUTu","5IhmGQ6Lix","hSSvQRACuj",
+"8U2nUvLsmS","azIWpCIShG","8RCUAyluBx","1j5L8Dz1R3","ksJbyKZamH","DQimpRpBQm","OxWIHVIlwP","fcwDaCdyBV","RsQUqx3LDe","uJScXfcJOy",
+"xReec9iGoT","AgJHQjzUqR","Yh1hF5Drn0","K4GS8uupzk","aL6AJlpF6W","fmIK17Ow5C","Gv3FqBCxeC","oGu6xMezSW","atef2I7p2a","yofH3brhlQ",
+"lH1ktLDk6f","EoToPM3zXL","rKDLJ0Wr5y","BpYhVS77LH","JKWYRNcICA","blLA9K4GS8","dQ586S77LH","5NammL7cGc","prNT6xciqp","CxVEf4dEz6",
+"DG4sT0h1b1","ZzJHWfaHir","nlaBylH1kt","yluBx9y4lw","v2eC3WmadA","tvdkDYf2Ec","B3qemrz7Ut","JkzUnFFDui","ix74r3weIF","RsQUqMm8si",
+"jtn0XMojnP","1v5hHeuZA5","fLNg8y94nw","jS1ajNOHsz","4dEz6K20wK","8U2nUY1mC0","TCgPpRACuj","yEfy9dhSuH","WreyPZzJHW","zHF1qM6qcG",
+"rKDLJ6AFT0","x3LDegf8rI","tuDyS618Di","S77LHMkgy8","kB5nPksJby","VjCZqhSSvQ","xciqpdjsrv","In3NSpWiOs","16lHcQYxC0","29QAzMm8si",
+"t98iWtAOsr","yluBxMaJQs","5drc6StlDJ","7Ow5CFVMxo","IBe8kpvgjS","GSQwjtl72W","cShY2IjTwP","FVMxoPYBf4","POUYSQworu","RpBQmuvf7A",
+"iB08lvkCHH","tl72WtuDyS","QssNCMkgy8","uJScXNxx9V","fmIK1m4bxU","cL0aENxx9V","IjTwPVjCZq","sqVrfRsQUq","hE1Qli7WMQ","FwEJz24ARF",
+"UlU3MUmaEv","8U2nUdjsrv","No0QbCqqaD","dpe1v0Wr5y","PYBf4Q6Lix","7fsYMguMb8","0BmCyZv7z0","s7MxkVLTy6","Ul4a1QClRL","7lUXZm4bxU",
+"ZhwG1b29RJ","8hJdtzbIYY","gtCA58cVD3","MmsIov2eC3","16lHca00b5","Q6LixCNHmv","WaWsvPYBf4","zFgtBtlILt","ogLgcCxVEf","K4GS83otm6",
+"uAWypCp3mZ","brhlQrKDLJ","jSjS3tlILt","FcWrWCK5W7","soy9tix74r","gf8rIzqH0W","qUJMdyluBx","JJs5mJKWYR","pAhR19y4lw","MezSWuAWyp",
+"5NammThjNn","FGzgpQnJ1S","9y4lwQssNC","AIYUuUmaEv","ix74rgdQsS","XflUqDG4sT","n1pmO2TRI7","s4786ThjNn","pAhR15drc6","gtCA50Wr5y",
+"FjHXRcL0aE","oQ87r4dEz6","hi5X7d7vjM","s93MlbrhlQ","rz7UtzQt6Q","BpYhVPYBf4","ni2v1DQimp","JXljWyofH3","uupzkfqypy","t59lRZuDtD",
+"VLTy6ZhwG1","wDajX618Di","pv0i7LewvM","aFFssJkzUn","WDVWJYw2oU","lweGy580YD","Chuy3WDVWJ","wDajXUmaEv","SmGzvGSQwj","Gv3FqkZANm",
+"Ta8f6Yw2oU","XflUqqQxHP","uPX7G0MR5X","29QAz9rlg9","U3yw5Yf2Ec","FGzgpt98iW","CqqaDuPX7G","6q6L9lkMUA","prNT68xEKz","7ku1pEOE1o",
+"fLNg8K4GS8","J2mQiCp3mZ","xciqpi3pyd","7fKYURACuj","DG4sTSbRYy","tuDySlH1kt","lsQGoWreyP","16lHcprNT6","618DiguMb8","lpF6We6e4z",
+"2TRI7suY4x","SmGzvaDGtS","piJSkJXljW","8TxD7QChxs","5iGN54W0Tl","zbIYYvOqCE","P6bcgoGu6x","pv0i7qaofN","RACujOUYuF","8FmFHlH1kt",
+"Yw2oUjfREu","zmLYDRBhp0","9GXkXtlILt","uQIczuJScX","HzZT8jeskS","J2mQiLDk6f","ciuWzOz8yZ","bZLvSTCgPp","QWxoTpvgjS","8cVD3nnP8o",
+"XflUqrKDLJ","B3qempmeCd","7lUXZjiVBP","blLA9lXFOB","3otm68xEKz","tAOsrciuWz","Mm8si8xEKz","JJs5m5iGN5","i7WMQJJs5m","PYBf4AkKTk",
+"Fhtgls93Ml","tAOsreuZA5","oGu6xqUJMd","5VZjSnnP8o","uupzkcQOnv","2hEEUl83Ud","euZA5WDVWJ","4W0TlL7cGc","HP433hi5X7","jeskSNcICA",
+"t98iWAmdQd","0ao3l7Ow5C","Cp3mZSbRYy","jfREui3pyd","MmsIoMmsIo","BCxeClpF6W","blLA98xEKz","JkzUn6AFT0","uPX7GCqqaD","RACujW7cTs",
+"vLsmSW3VFH","dQ586l83Ud","FVMxokB5nP","XyPZNZhwG1","brhlQcL0aE","RzaZAs93Ml","jeskS45cIH","Yf2EcaFFss","nnP8oe6e4z","F6PT2pAhR1",
+"Pb1pakZANm","WmadAuupzk","DLhzMv8yFN","aFFsssoy9t","s7Mxk2Nslm","AmdQdYh1hF","CdyBVd7vjM","i3pydGSQwj","aDGtSkZANm","6AFT0W3VFH",
+"9XyT98xEKz","XflUq4dEz6","BFkb8uvf7A","QWxoTIKxdL","EdBKcQbxXc","x3LDeAIYUu","hi5X7FVMxo","WMiS3he9IA","Mkgy8wDajX","lXFOBReKEW",
+"L7cGclweGy","C2IrcRxrsm","7X3uyThjNn","No0QbIn3NS","lpF6Waez9y","s4786v2eC3","MGlTFpv0i7","BGaQYTXQ0Z","tlILtS2Dfu","mX2GEQ6Lix",
+"hSSvQpmeCd","FLsphbgJAz","aL6AJfqypy","jtn0Xx3LDe","5Mg9r1LB1L","tlILt3otm6","t98iWn8pJ9","Oz8yZS2Dfu","hYBCK29QAz","YjB9tm4bxU",
+"lweGyuupzk","EoToPuPX7G","VIlwPTwano","6q6L9uZPqg","zFgtBRpBQm","5Mg9rW7cTs","RzaZAAgJHQ","AgJHQGSQwj","qUJMdoVQp6","lkMUAlViBv",
+"RBhp0HRxd8","FGzgpSs0Zu","djsrvix74r","wiHrZdjsrv","aez9y1LB1L","2NslmxXTI4","M6qcGvOqCE","Z4I1vNAFuw","lm0pDMojnP","xXTI41LB1L",
+"Oz8yZd85a9","5IhmGEdBKc","QbxXcFPfSE","5NammLbRTH","v1HlnGWqqX","2TRI7lj07Q","v1HlnVprf2","1LB1L9GXkX","8U2nU9eoRc","KZamHJIqXi",
+"iwzGk8cVD3","qUJMdIBe8k","dpe1vbZLvS","6q6L9Qworu","QWxoT7ku1p","pv0i7atef2","taOXK0BmCy","ZzJHW29QAz","taOXKaez9y","hYBCKJXljW",
+"xciqpWaWsv","JKWYR9iGoT","v2eC3AgJHQ","FVMxolm0pD","iwzGkVIlwP","AgJHQsoy9t","DQimpkZANm","YjB9tn1pmO","LewvMvOqCE","LbRTHk85Ae",
+"FxX9qG1RhS","KsjRKfmIK1","5VZjS7hyVv","ciuWzlsQGo","jfREum4bxU","KZamH14FLR","jzUqR2hEEU","RmDcrFFDui","zqH0WZUnqt","VNCPdJKWYR",
+"HfyNQ5drc6","DQimpAOgEe","v2eC3OUqFM","B3qemJIqXi","uLtKsiqv4k","NcICAi7WMQ","M3zXL7hyVv","m4bxUuZPqg","vOqCElsQGo","48cHLiqv4k",
+"fFDrJNcICA","vOqCEJ2mQi","s7MxkPb1pa","In3NSFLsph","fFDrJmz8gx","fmIK1jS1aj","lkMUAGSQwj","wDajXRkQke","zz4ZUazIWp","MGlTFQworu",
+"SjskQd7vjM","DcpWBBpYhV","azIWpmX2GE","MGlTFnnP8o","FGzgpK4GS8","uvf7ANcICA","O3iyQ9GXkX","7hyVvd85a9","J2mQi2hEEU","MojnPKASQ8",
+"4QMc90YAGH","Cfgr36AFT0","jS1ajQWxoT","O3iyQqUJMd","aez9yWaWsv","lsQGoRsQUq","ru4UGFnPFB","ThjNnMojnP","cmXIXAXpwE","lweGy2Nslm",
+"JKWYRjiVBP","jiVBPnlaBy","FFDuiwiHrZ","FVMxoFNYIM","PYBf4GXdoH","UmaEv48cHL","HzZT8Dz1R3","hYBCKWaWsv","h1zcHcQOnv","QnJ1SJKWYR",
+"aL6AJt59lR","DG4sTWDVWJ","soy9tHzZT8","IjTwP5Drn0","faHirIn3NS","QChxsd85a9","5Mg9rcShY2","LDk6fRBhp0","F6PT23otm6","m4bxUQworu",
+"WDVWJAXpwE","jeskSBCxeC","bZLvSRkQke","WDVWJmz8gx","QYxC07lUXZ","M3zXLG1RhS","IKxdLG1RhS","pWiOsW7cTs","bgJAzksJby","Yf2Ec6q6L9",
+"7Ow5CKsjRK","m4bxU9XyT9","hSSvQ6AFT0","4dEz6StlDJ","pT8wuRpBQm","Yf2EcPYBf4","ZzJHWqQxHP","RBhp0ZUnqt","2ZHdkCK5W7","qUJMdaez9y",
+"5NammcL0aE","No0QbfcJOy","618DitAOsr","4QMc98cVD3","s4786sx5Gl","Gv3FqReKEW","sx5GlaL6AJ","uLtKsTwano","zY1GYYh1hF","blLA9gdQsS",
+"Ta8f6MmKGJ","Z4I1v7hyVv","xReeckZANm","Q6LixZzJHW","pv0i7yvOMI","5nmWvhSSvQ","v1HlnkB5nP","QYxC0VBjhz","Dz1R3Yf2Ec","FxX9qUl4a1",
+"JIqXi55rfB","lweGy1LB1L","U3yw5lpF6W","XflUqZ4I1v","tl72WMaJQs","uPX7G5Drn0","24ARFs93Ml","ogLgc7fKYU","guMb8DQimp","EoToPogLgc",
+"C2IrcRBhp0","ogLgcFwEJz","G1RhSUlU3M","cmXIXEoToP","IKxdLv2eC3","MGlTFfmIK1","AgJHQhYBCK","uAWypZzJHW","aL6AJFjHXR","Kr8ysOUYuF",
+"MezSWokgRi","vkCHHbrhlQ","3otm6cQOnv","Yw2oUwiHrZ","RzaZAzmLYD","aFFssQbxXc","dmoS748cHL","fLNg8TXQ0Z","RpBQmoGu6x","QworugtCA5",
+"No0Qbhe9IA","yvOMI7Ow5C","Yw2oUydG8U","EOE1o7X3uy","l83UduQIcz","RzaZAl83Ud","zFgtB2ZHdk","FhtgllH1kt","zqH0WXflUq","In3NSjSjS3",
+"d85a9Y1mC0","5NammGv3Fq","cQOnvLDk6f","2NslmogLgc","tjQxsqUJMd","3otm68FmFH","vOqCEWaim6","4QMc92Yz7E","5Drn00BmCy","5iGN5EOE1o",
+"zbIYY4dEz6","bZLvSUvlv4","D6rByv8yFN","cL0aE0h1b1","G1RhStvdkD","NAFuwdjsrv","uTacxbgJAz","uZPqgdmoS7","d85a9WMiS3","5iGN5UlU3M",
+"iqv4kTa8f6","OUqFMulk41","5nmWvEdBKc","BGaQYs7Mxk","pv0i7m4bxU","gtCA5lkMUA","hSSvQ8TxD7","MmsIoZv7z0","TCgPpB3qem","aL6AJF6PT2",
+"jeskSuTacx","soy9tU3yw5","MK07YkB5nP","In3NS7fsYM","Ul4a1Ta8f6","taOXKZzJHW","BbwgAMK07Y","okgRizY1GY","FLsphZuDtD","0Kyfsa00b5",
+"1v5hHlCMxy","brhlQ0Wr5y","MmKGJ8cVD3","GWqqXdjsrv","fFDrJFjHXR","qUJMdReKEW","fqypy0YAGH","d85a9BGaQY","Pb1palkMUA","C2IrcQworu",
+"i7WMQW3VFH","tvdkDogLgc","8RCUAvkCHH","MK07YgdQsS","zY1GYQ6Lix","QssNCGSQwj","t98iWDG4sT","Cfgr3n8pJ9","1LB1LGv3Fq","i7WMQpvgjS",
+"hYBCK7fKYU","SmGzvd85a9","IjTwPBCxeC","wiHrZBpYhV","0Wr5ylm0pD","he9IAXyPZN","pAhR18U2nU","QnJ1S1j5L8","oVQp6YOfrY","FFDui4QMc9",
+"Mkgy87fKYU","iKqhr7hyVv","XyPZNpFrrl","EOE1o2hEEU","b29RJ8RCUA","QworuMm8si","No0QbXflUq","RmDcrYOfrY","CIShGRzaZA","gtCA5tvdkD",
+"n1pmOQ6Lix","uLtKs24ARF","nlaByzQt6Q","1v5hHaDGtS","FjHXR8FmFH","2hEEU8RCUA","ReKEWpFrrl","WDVWJ48cHL","5VZjSQbxXc","jS1ajCIShG",
+"guMb8GWqqX","rKDLJ2Yz7E","t59lRzqH0W","jfREucQOnv","FGzgps4786","WMiS3HfyNQ","yluBxguMb8","6AFT029QAz","CK5W7ru4UG","55rfBC2Irc",
+"k85Aegf8rI","VLTy6zQt6Q","LewvMaez9y","FPfSEzqH0W","GrDg7aez9y","t98iWh1zcH","VjCZqtuDyS","hi5X7LewvM","uQIczvkCHH","yluBxqaofN",
+"4dEz6RACuj","lViBvStlDJ","2Yz7ECIShG","5drc6jzUqR","M3zXLlViBv","m4bxUI7p2a","uZPqgQYxC0","BpYhVDcpWB","EoToP5VZjS","dhSuHAXpwE",
+"UmaEvguMb8","ogLgc8RCUA","FLsphpT8wu","5drc69eoRc","POUYS5drc6","uTacxt59lR","ZUnqtm4bxU","t98iWyofH3","zQt6Qm4bxU","guMb8CqqaD",
+"jfREu5iGN5","i3pydpT8wu","S77LH9iGoT","BbwgAJKWYR","C2IrctjQxs","nlaByQ6hMC","xciqpwDajX","uvf7A6q6L9","zbIYYv2eC3","VerEAFxX9q",
+"lpF6WBbwgA","M6qcGCxVEf","sx5GlCNHmv","lsQGoazIWp","5IhmGzFgtB","lsQGojtn0X","qQxHPZUnqt","pFrrlh1zcH","Y1mC0ZuDtD","tAOsrNcICA",
+"gdQsSXyPZN","O3iyQpAhR1","gf8rI618Di","RBhp0iwzGk","euZA50ao3l","MmsIo0YAGH","jzUqRtuDyS","SmGzvZJTXH","lXFOB9eoRc","yluBxjfREu",
+"Q6Lix5Namm","MmsIoxciqp","tvdkDuZPqg","RBhp0yluBx","l83Ud2ZHdk","8RCUAWMiS3","k85AeJkzUn","FxX9qCK5W7","MmKGJYw2oU","SbRYyM6qcG",
+"FxX9qOUqFM","DcpWB1LB1L","K20wKuZPqg","a00b5Ta8f6","guMb8uLtKs","fFDrJaL6AJ","VLTy6lXFOB","ReKEWb29RJ","Chuy3VNCPd","dhSuHyToGW",
+"U3yw5lXFOB","JkzUntaOXK","7fsYM0h1b1","taOXKpmeCd","uvf7A2hEEU","ZJTXHbZLvS","J2mQimX2GE","HP433Kr8ys","gIYvEMojnP","fmIK1wDajX",
+"MmKGJStlDJ","K4GS8LDk6f","zz4ZUMmsIo","45cIHJRJQB","pWiOs3weIF","TwanoJ2mQi","07n1cMezSW","CdyBVn8pJ9","8RCUA7ku1p","zY1GYlkMUA",
+"hE1QllkMUA","CdyBV580YD","zmLYDCNHmv","tlILt5nmWv","AkKTkFjHXR","hE1QlDG4sT","RxrsmWaWsv","2hEEUCfgr3","WPmlxyToGW","mz8gxIn3NS",
+"I7p2aWmadA","oVQp6uTacx","NOHsztlILt","tlILtRmDcr","BbwgAoQ87r","POUYScL0aE","ix74r9eoRc","U3yw5pAhR1","aDGtSix74r","suY4xDcpWB",
+"EoToPciuWz","yEfy9l83Ud","64s8NyvOMI","Nxx9VGXdoH","yToGWhYBCK","W7cTsoGu6x","fqypyQWxoT","U3yw5aDGtS","7ku1puLtKs","QChxss93Ml",
+"pmeCdfqypy","Yw2oUFVMxo","ydG8UuTacx","8xEKzm4bxU","DcpWBm4bxU","QssNCZzJHW","djsrvpv0i7","l83Ud4dEz6","he9IAiB08l","Zv7z0FwEJz",
+"1LB1L0MR5X","nlaBy7X3uy","SbRYyFjHXR","ix74rs93Ml","C2IrcEdBKc","VIlwPZv7z0","GrDg7tlILt","SWfouuN6r3","9iGoTpWiOs","LDk6feuZA5",
+"BbwgA24ARF","okgRiWaim6","2ZHdkBGaQY","VerEABFkb8","FLsphZhwG1","2Yz7EWPmlx","gdQsSJkzUn","ogLgcIn3NS","2hEEU6AFT0","uoStwpvgjS",
+"oGu6xsoy9t","lsQGoIjTwP","jS1ajaDGtS","vkCHHWaWsv","29QAzpiJSk","tAOsruAWyp","In3NSFxX9q","d85a9AOgEe","Q6LixwiHrZ","2hEEUD6rBy",
+"No0QbGWqqX","okgRiB3qem","Vprf2y94nw","fqypyCxVEf","JkzUnMezSW","NcICAiqv4k","lsQGolweGy","MojnP7ku1p","QYxC00PktI","7fsYMDLhzM",
+"JIqXi580YD","45cIHyEfy9","aL6AJBFkb8","U3yw5EdBKc","dpe1v9y4lw","fcwDay94nw","ZJTXHLbRTH","zQt6QAOgEe","ZhwG1ECMvU","D6rByMmKGJ",
+"NAFuwM3zXL","hE1Ql1v5hH","K4GS8tjQxs","tAOsrWDVWJ","Uvlv4Rxrsm","tvdkDOxWIH","OUqFMokgRi","guMb88xEKz","atef2EdBKc","aL6AJTa8f6",
+"t59lRJkzUn","pv0i76AFT0","2Yz7EpFrrl","MmKGJhi5X7","FcWrWaL6AJ","fFDrJ2hEEU","o8UydIjTwP","FNYIMjfREu","AgJHQS2Dfu","G1RhSYjB9t",
+"djsrvUlU3M","uN6r3AkKTk","oGu6x29QAz","zmLYDsoy9t","uAWyppvgjS","SbRYyh1zcH","uQIczhe9IA","In3NSuZPqg","29QAz7ku1p","guMb86q6L9",
+"iqv4kaDGtS","UmaEvGXdoH","0h1b1NhXdu","BpYhV7Ow5C","b29RJQworu","ZUnqtiwzGk","piJSkhe9IA","BCxeCRkQke","sx5GlRxrsm","Yf2EcVNCPd",
+"rKDLJfFDrJ","P6bcguJScX","lweGyjiVBP","IKxdLmX2GE","BCxeCh1zcH","5drc6pWiOs","t98iW2DREs","aL6AJ5Mg9r","xReecuQIcz","wiHrZlH1kt",
+"NOHszJJs5m","lH1ktOUYuF","5drc6tvdkD","b29RJG1RhS","SjskQOUYuF","JJs5mGWqqX","K4GS8RsQUq","5VZjSBGaQY","KsjRKm4bxU","ogLgcPb1pa",
+"G1RhSjiVBP","29QAzsoy9t","8xEKz6q6L9","KZamHGXdoH","l83UdFFDui","FFDuilj07Q","KsjRKaFFss","XflUqZUnqt","mX2GEb29RJ","ReKEWuoStw",
+"DcpWBAXpwE","WaWsvOUYuF","nlaByaFFss","lViBvsqVrf","Yw2oUgf8rI","lViBvjSjS3","KsjRKS2Dfu","QssNCFVMxo","mX2GEfFDrJ","MK07Y16lHc",
+"aFFssVIlwP","iB08lAkKTk","iKqhrGXdoH","jiVBP7Ow5C","pT8wuMaJQs","tvdkDx3LDe","m4bxUuTacx","NAFuwuZPqg","EOE1oF6PT2","prNT6dhSuH",
+"nFqikWMiS3","hSSvQAkKTk","Nxx9V7lUXZ","vLsmSM3zXL","HlUbFxReec","Yf2EcFnPFB","7hyVvvOqCE","l83UduoStw","C2IrciKqhr","l83Ud8FmFH",
+"9XyT9t59lR","F6PT2qUJMd","tjQxso8Uyd","C2IrcChuy3","OxWIHDz1R3","h1zcHpmeCd","8FmFH5Drn0","tAOsraDGtS","bZLvSMGlTF","VLTy6DQimp",
+"StlDJ8xEKz","C2Irculk41","0MR5X7hyVv","4dEz6ZUnqt","soy9t7X3uy","d7vjMlXFOB","1v5hH4W0Tl","zFgtBuLtKs","jzUqR5Drn0","fFDrJRBhp0",
+"yluBx29QAz","0YAGHXflUq","8FmFHlm0pD","Chuy3iKqhr","HRxd8BGaQY","uQIczlViBv","lm0pDmX2GE","SjskQGv3Fq","RzaZAP6bcg","M3zXL16lHc",
+"ulk417ku1p","TXQ0ZQWxoT","8RCUAS77LH","HzZT8azIWp","8TxD71j5L8","Vprf2x3LDe","7fsYMCqqaD","ogLgcRxrsm","AXpwEk85Ae","S77LHQYxC0",
+"cL0aEazIWp","QworuzbIYY","wiHrZaL6AJ","he9IAlCMxy","yToGW1v5hH","Yh1hFVNCPd","FhtgluZPqg","k85AeGSQwj","aFFssZUnqt","7fsYMuN6r3",
+"uLtKs7Ow5C","QworuRpBQm","FNYIMDcpWB","MGlTFkZANm","tjQxszHF1q","d85a9Ul4a1","kB5nPpv0i7","P6bcgWPmlx","ru4UGDG4sT","tlILtmz8gx",
+"OUYuFpvgjS","blLA9S77LH","zY1GYAkKTk","Vprf2yEfy9","pmeCdM3zXL","oQ87rbrhlQ","wiHrZ64s8N","jiVBPQnJ1S","cQOnvJkzUn","KsjRKHP433",
+"AgJHQFxX9q","XyPZN9GXkX","6q6L92DREs","jiVBPOUYuF","I7p2aC2Irc","CxVEf2TRI7","JKWYRSbRYy","t59lRJXljW","NOHszfcJOy","3weIFyToGW",
+"7Ow5CuLtKs","m4bxUZ4I1v","ksJbynnP8o","SjskQGWqqX","PYBf4iqv4k","9eoRcv1Hln","JJs5m5Mg9r","uJScXkB5nP","5IhmG16lHc","P6bcgmX2GE",
+"2hEEU0Wr5y","b29RJuTacx","POUYSGSQwj","uupzkQnJ1S","i3pydgjUTu","tlILt0BmCy","lsQGoMkgy8","OxWIH5IhmG","ciuWzYf2Ec","zz4ZUNhXdu",
+"Ul4a19eoRc","ZUnqtEoToP","ZUnqt8U2nU","9y4lwuupzk","StlDJCIShG","bgJAzlpF6W","2NslmM3zXL","y94nwLewvM","WreyPSs0Zu","RBhp0aDGtS",
+"d7vjMl83Ud","9y4lwiB08l","xciqpuupzk","ru4UGWMiS3","gjUTu9y4lw","zY1GYBGaQY","9y4lwLbRTH","NAFuw1j5L8","S77LH3weIF","aDGtSiqv4k",
+"b29RJlCMxy","AgJHQt59lR","Chuy3fFDrJ","29QAzPOUYS","uQIczC2Irc","qQxHPiB08l","MGlTF8FmFH","WreyPe6e4z","uTacxru4UG","aL6AJYjB9t",
+"bZLvSWaim6","KsjRKM3zXL","W7cTsMm8si","GXdoHt98iW","5Drn02ZHdk","MezSWIjTwP","IjTwPiwzGk","jS1ajKr8ys","IBe8kSbRYy","KsjRKBpYhV",
+"ZhwG12ZHdk","EOE1o7fKYU","1v5hHbZLvS","FhtglVjCZq","7lUXZUl4a1","o8UydK20wK","kB5nPK20wK","SmGzvbZLvS","dQ586SjskQ","SmGzvVBjhz",
+"ZhwG17lUXZ","sx5GluTacx","d7vjMFVMxo","sx5Gluvf7A","CK5W7jzUqR","tAOsrzY1GY","FNYIMs4786","8hJdtogLgc","W3VFHJIqXi","v8yFN9XyT9",
+"7Ow5CM3zXL","qQxHPwiHrZ","RBhp0BCxeC","FGzgpIn3NS","BbwgAlweGy","sx5GlguMb8","SjskQuAWyp","W7cTssuY4x","L7cGcJXljW","JXljWSbRYy",
+"a00b55iGN5","OHaBzX6Pin","BpYhViB08l","RmDcrqQxHP","WDVWJbZLvS","5VZjSHRxd8","KZamHEdBKc","zbIYYFxX9q","ru4UG6q6L9","yToGWI7p2a",
+"MaJQsQWxoT","K4GS89rlg9","IRh48GWqqX","FGzgpiB08l","QClRLcL0aE","hUTw7MmsIo","RmDcrJKWYR","HfyNQhYBCK","tl72W0h1b1","uN6r3HzZT8",
+"WPmlxNcICA","0Wr5yxXTI4","8hJdtFwEJz","U3yw58U2nU","jeskSIBe8k","uAWyppAhR1","2hEEU0MR5X","cShY2yEfy9","pv0i7Ss0Zu","pAhR1oGu6x",
+"QYxC0BFkb8","UmaEvQYxC0","ZzJHW4W0Tl","580YDAIYUu","2DREsKsjRK","0h1b1wDajX","FcWrWfLNg8","7lUXZKASQ8","AkKTkFhtgl","t98iWPOUYS",
+"7X3uycmXIX","HfyNQ0YAGH","MaJQsiB08l","uJScXVIlwP","azIWpzFgtB","PYBf4pFrrl","qUJMd5nmWv","XflUqgjUTu","QYxC0y94nw","uAWypkB5nP",
+"7X3uyFjHXR","NAFuw6q6L9","8FmFHuoStw","ogLgctAOsr","07n1c07n1c","qUJMdChuy3","vLsmSHfyNQ","pmeCdFLsph","uJScXVNCPd","VNCPduPX7G",
+"ciuWzBpYhV","TwanofLNg8","HRxd8BpYhV","uJScXm4bxU","e6e4zIKxdL","5Drn0y94nw","lpF6WRsQUq","cShY2ZJTXH","AmdQdnFqik","L7cGczqH0W",
+"ru4UGbZLvS","580YDDcpWB","Cp3mZgf8rI","FxX9qIKxdL","cL0aE9GXkX","dpe1vHzZT8","0PktIuN6r3","29QAz5Namm","Ul4a1pAhR1","0BmCy7ku1p",
+"tl72WzFgtB","fqypyC2Irc","VIlwPd7vjM","M3zXLKsjRK","8TxD7ix74r","jtn0XCxVEf","yEfy9lpF6W","tjQxs0ao3l","WDVWJ4dEz6","SmGzvzQt6Q",
+"6AFT0hE1Ql","fcwDagf8rI","F6PT2Mm8si","i7WMQqaofN","fcwDa5nmWv","tlILt9XyT9","FGzgp6AFT0","6q6L9HP433","16lHcZuDtD","MK07Y2TRI7",
+"GSQwjyvOMI","kB5nPjfREu","JJs5mVBjhz","lXFOBG1RhS","nlaByni2v1","xciqpJKWYR","5Drn0LbRTH","MezSWwDajX","wiHrZWaim6","lj07QMmKGJ",
+"GSQwjAkKTk","ZJTXHQClRL","zbIYYMmsIo","Cfgr35Drn0","ru4UGOUYuF","8cVD3cShY2","uPX7GhUTw7","IjTwPNAFuw","n8pJ9d7vjM","NOHszjSjS3",
+"14FLRNcICA","dhSuHGXdoH","RkQkePb1pa","rKDLJjfREu","M6qcGpiJSk","AkKTkuQIcz","pAhR1fqypy","dhSuHnFqik","L7cGcbgJAz","Dz1R3Cfgr3",
+"Ta8f6uvf7A","uPX7GciuWz","ulk41uoStw","sx5GlFGzgp","8xEKzv2eC3","azIWpZJTXH","ThjNnuZPqg","iKqhrStlDJ","5IhmG7fsYM","iKqhrblLA9",
+"0ao3lBFkb8","s47860YAGH","uPX7GVBjhz","e6e4zwDajX","OHaBzDG4sT","tjQxsNOHsz","lm0pD2Yz7E","In3NSS2Dfu","AkKTkLDk6f","0h1b1iB08l",
+"IKxdLYh1hF","NOHszCfgr3","29QAzSbRYy","i7WMQ9GXkX","HRxd8KASQ8","prNT6SjskQ","0PktItaOXK","QssNCB3qem","9y4lwKsjRK","bZLvS8U2nU",
+"Z4I1vix74r","vkCHHJ2mQi","tvdkDMaJQs","ZuDtDL7cGc","vLsmSyofH3","Yf2Ec0h1b1","AgJHQQYxC0","W3VFHgdQsS","ECMvU1LB1L","prNT6euZA5",
+"qQxHP9eoRc","WDVWJsqVrf","8hJdtNOHsz","5iGN5Ss0Zu","5drc6BFkb8","FjHXRjeskS","QWxoTChuy3","5Drn0i7WMQ","L7cGcksJby","5Mg9rguMb8",
+"JKWYRzqH0W","yToGWSbRYy","FNYIMS77LH","1v5hHYjB9t","PYBf464s8N","i7WMQChuy3","lweGyWreyP","POUYS2TRI7","AgJHQSWfou","AXpwEsoy9t",
+"U3yw5Uvlv4","TCgPpbgJAz","xXTI49XyT9","mX2GE8RCUA","X6PinWreyP","MGlTFJ2mQi","gjUTuNo0Qb","lH1ktDG4sT","8U2nUReKEW","VerEAuPX7G",
+"W7cTsK4GS8","iKqhrVBjhz","cmXIXMK07Y","gjUTub29RJ","DcpWBPYBf4","X6PinjfREu","jeskSjiVBP","QworutvdkD","WaWsv580YD","VNCPdAgJHQ",
+"jzUqRn8pJ9","9eoRcSWfou","VjCZqjzUqR","kB5nPzHF1q","5Mg9r8hJdt","45cIHXyPZN","zz4ZUY1mC0","FNYIMRACuj","EOE1ohi5X7","BCxeCKsjRK",
+"64s8N0ao3l","3otm6CxVEf","FNYIMaFFss","9y4lwPOUYS","uJScX2hEEU","uoStwS2Dfu","3weIFuPX7G","guMb8AmdQd","Chuy3jiVBP","0h1b1QYxC0",
+"QYxC0MmKGJ","FjHXRECMvU","Kr8ysVBjhz","lpF6WzmLYD","ulk41NcICA","lj07Qn1pmO","e6e4zJRJQB","AmdQdlH1kt","hYBCKFnPFB","mX2GEQnJ1S",
+"a00b5PYBf4","n1pmOdpe1v","CIShGMkgy8","1v5hHkZANm","v2eC3Qworu","dpe1vChuy3","QbxXcyvOMI","8FmFHe6e4z","Kr8ysFhtgl","RACuj0PktI",
+"P6bcgCp3mZ","uLtKs8xEKz","dhSuHMK07Y","PYBf4guMb8","9y4lwF6PT2","9GXkXpAhR1","XyPZNoGu6x","HlUbFix74r","gf8rIIKxdL","CxVEfF6PT2",
+"zbIYY2TRI7","IBe8kpAhR1","fcJOyfqypy","Dz1R3i3pyd","XyPZNfaHir","fFDrJv8yFN","580YDCK5W7","Kr8ysMK07Y","Q6hMC9GXkX","lH1ktcL0aE",
+"AIYUuEoToP","CIShGokgRi","h1zcHoQ87r","GWqqXhe9IA","5IhmGKr8ys","FFDui9eoRc","64s8NZv7z0","rhl0JAOgEe","jfREuQssNC","pWiOsSjskQ",
+"y94nwIBe8k","2ZHdkW3VFH","AOgEeYOfrY","XflUqEoToP","t59lR64s8N","4W0TlsqVrf","5ZaEzpiJSk","MezSWpv0i7","YOfrY9rlg9","IBe8ksqVrf",
+"RsQUq4W0Tl","JRJQBpT8wu","X6Pindpe1v","DcpWBcL0aE","RBhp0guMb8","IjTwPn8pJ9","5iGN5I7p2a","wiHrZdhSuH","Chuy3yEfy9","8U2nU29QAz",
+"o8Uyd7fsYM","NhXdutjQxs","MmsIolj07Q","7Ow5CJkzUn","djsrvFLsph","WPmlxAOgEe","hi5X7qQxHP","Dz1R35Mg9r","s7MxkGXdoH","lweGyCNHmv",
+"AmdQdZuDtD","RpBQmpvgjS","ZzJHWWaWsv","5drc6Cfgr3","Mm8siBCxeC","0h1b1XflUq","FxX9qNo0Qb","FwEJzjzUqR","2Yz7EGSQwj","sx5GlRpBQm",
+"jS1ajdmoS7","lkMUAOUYuF","faHirO3iyQ","QssNCdpe1v","nlaBy5Mg9r","VerEAzbIYY","FPfSEuvf7A","OUqFM7lUXZ","ru4UGx3LDe","bgJAzs7Mxk",
+"WDVWJlkMUA","07n1cSs0Zu","vkCHH7ku1p","5Drn0he9IA","64s8NI7p2a","n8pJ9Zv7z0","NhXduLbRTH","jfREu2Yz7E","QWxoTuJScX","pvgjSni2v1",
+"nnP8oMaJQs","k85AeFVMxo","CxVEfZJTXH","ulk41UlU3M","jtn0XDcpWB","gjUTuBCxeC","VIlwPsx5Gl","0PktIhYBCK","s7MxkTXQ0Z","BpYhV9GXkX",
+"NhXduYf2Ec","cQOnv1j5L8","pWiOsU3yw5","P6bcguAWyp","NOHszDQimp","5VZjS8U2nU","DG4sTtlILt","i7WMQQbxXc","24ARFfcwDa","ulk417X3uy",
+"aez9yfqypy","n8pJ9OxWIH","cShY2GWqqX","5ZaEzt59lR","48cHLFFDui","RsQUqZ4I1v","Ss0ZuZzJHW","BCxeCjfREu","yToGWoVQp6","5NammoGu6x",
+"No0QbSs0Zu","MezSWD6rBy","e6e4zlH1kt","NhXduSWfou","M3zXLWDVWJ","azIWpn8pJ9","8TxD7gIYvE","SbRYyCIShG","FVMxoW7cTs","gIYvEhUTw7",
+"MmKGJuN6r3","Qworuulk41","QworuoGu6x","29QAzUvlv4","4QMc9Mkgy8","G1RhSazIWp","m4bxUgIYvE","pT8wuIBe8k","HRxd8L7cGc","EOE1oNAFuw",
+"S2DfuzmLYD","Oz8yZsx5Gl","uupzkHzZT8","LewvMY1mC0","Kr8ystl72W","5ZaEzqQxHP","azIWp580YD","F6PT2O3iyQ","zqH0WB3qem","h1zcH45cIH",
+"IRh48FPfSE","5Drn0iwzGk","Y1mC0Yw2oU","fqypyWreyP","qUJMd8TxD7","EoToPjeskS","4W0Tl5iGN5","Qworu5Mg9r","Q6hMC6AFT0","lweGy0BmCy",
+"QnJ1SyvOMI","kB5nPJ2mQi","HlUbFHzZT8","nlaByUvlv4","piJSkuN6r3","BbwgA48cHL","O3iyQiwzGk","J2mQi8cVD3","uPX7GCK5W7","O3iyQP6bcg",
+"pT8wuUvlv4","Q6hMCHRxd8","v2eC3okgRi","0YAGH5VZjS","suY4xAgJHQ","0BmCyuJScX","qaofN2DREs","1LB1LFVMxo","MojnP2Yz7E","QworutlILt",
+"CIShGYw2oU","GWqqXQ6hMC","RpBQmG1RhS","IjTwP5VZjS","Ta8f6nFqik","W7cTs24ARF","pmeCdMmsIo","HRxd8QWxoT","BbwgAECMvU","rhl0J2hEEU",
+"ulk41Pb1pa","24ARFAmdQd","SWfou9iGoT","FGzgp0BmCy","VIlwPRmDcr","MmKGJCqqaD","yToGWvkCHH","i7WMQaDGtS","lpF6WuoStw","oGu6x5Drn0",
+"5nmWvHfyNQ","QworuVerEA","mX2GEpAhR1","lm0pDReKEW","rz7UtTCgPp","16lHcJJs5m","NAFuw55rfB","fcwDaMGlTF","VjCZqVprf2","xciqpWPmlx",
+"lj07QaDGtS","XyPZNRmDcr","OUYuFzY1GY","x3LDeHP433","QYxC0HRxd8","nlaBypmeCd","bgJAzdjsrv","4dEz6FxX9q","xReecJKWYR","G1RhSCNHmv",
+"9iGoTYf2Ec","Gv3Fq6AFT0","oGu6xuLtKs","FNYIMxciqp","rz7UtFnPFB","RxrsmhSSvQ","8RCUA580YD","IjTwP6q6L9","9iGoTlsQGo","v2eC31v5hH",
+"gf8rIHP433","WPmlxOz8yZ","mz8gx64s8N","2Nslm4W0Tl","VBjhzHzZT8","AXpwEVerEA","ciuWzThjNn","QssNCCdyBV","uTacxDLhzM","oQ87r24ARF",
+"7X3uyFwEJz","SmGzvSWfou","2hEEU9GXkX","MmsIoFhtgl","fmIK1yofH3","cmXIXfLNg8","pFrrlGv3Fq","4W0TlCIShG","tAOsrWMiS3","x3LDeDz1R3",
+"FNYIM8FmFH","Z4I1vSbRYy","K4GS824ARF","soy9tKsjRK","SbRYyRmDcr","1j5L89GXkX","gf8rIQ6Lix","rz7UtChuy3","e6e4znlaBy","P6bcgeuZA5",
+"fqypyk85Ae","ksJby8hJdt","PYBf4jeskS","tvdkDUvlv4","uvf7AguMb8","0BmCyuN6r3","K20wK4dEz6","tvdkDuAWyp","CxVEfaDGtS","No0QbhYBCK",
+"oGu6xn8pJ9","K20wKHfyNQ","hi5X7MojnP","580YDlpF6W","hYBCKAXpwE","SWfoukZANm","lCMxygIYvE","iqv4klXFOB","16lHcd7vjM","mz8gxGv3Fq",
+"fFDrJQ6Lix","VIlwPFwEJz","2hEEU9rlg9","kB5nP55rfB","pT8wuK4GS8","vOqCEWmadA","gjUTuzmLYD","QChxsprNT6","1j5L8JJs5m","MK07YUvlv4",
+"ECMvURxrsm","45cIHoVQp6","i3pydzY1GY","K4GS807n1c","uPX7G5drc6","ru4UGgjUTu","5iGN5cL0aE","Ss0Zu0YAGH","qQxHPQ6Lix","7fKYUU3yw5",
+"mX2GEnFqik","0KyfsgdQsS","hUTw7Nxx9V","iqv4kZv7z0","jSjS3GWqqX","faHirk85Ae","oVQp6gjUTu","618DidQ586","oGu6x7hyVv","6q6L9fmIK1",
+"GSQwjNAFuw","SjskQtl72W","lkMUAFnPFB","jiVBPzQt6Q","9rlg9ni2v1","Q6hMCmX2GE","atef2FVMxo","7fKYU6AFT0","0KyfsokgRi","RACujzQt6Q",
+"Mkgy8gdQsS","BGaQYO3iyQ","YjB9tuPX7G","ZhwG148cHL","7hyVvZzJHW","ogLgczmLYD","wDajXQ6Lix","NOHszWDVWJ","G1RhSMm8si","oGu6x1v5hH",
+"9GXkXyvOMI","dhSuHQYxC0","YjB9thi5X7","dpe1vNAFuw","OHaBzlsQGo","dQ586HfyNQ","5Mg9rJKWYR","s93MljzUqR","lweGyciuWz","9GXkXOxWIH",
+"e6e4z0BmCy","Ul4a17fKYU","14FLRCNHmv","DLhzMt98iW","8RCUAJKWYR","CqqaD2Yz7E","AOgEecQOnv","LewvMCIShG","D6rByIBe8k","zQt6QRzaZA",
+"d7vjMTCgPp","TCgPpfLNg8","yluBxdjsrv","AgJHQjeskS","PYBf4d85a9","CqqaD580YD","FcWrW64s8N","M3zXLQYxC0","jS1ajS2Dfu","kB5nPIKxdL",
+"07n1cZhwG1","s7Mxk2Yz7E","Yh1hFuoStw","U3yw5580YD","FLsphQChxs","O3iyQLewvM","D6rByQ6Lix","Uvlv4jeskS","Ta8f6Zv7z0","tuDySfcJOy",
+"POUYSS77LH","uPX7GiwzGk","KZamHQnJ1S","tl72WhYBCK","RmDcrZuDtD","FGzgpReKEW","QworupWiOs","fqypyY1mC0","0YAGH3weIF","djsrvIn3NS",
+"QChxsiKqhr","azIWpfqypy","K20wK580YD","nnP8oUl4a1","ciuWzzQt6Q","GrDg7bgJAz","0h1b1zmLYD","qaofNyofH3","QYxC0lCMxy","9eoRcaFFss",
+"0Wr5y9GXkX","pvgjSdmoS7","gtCA56q6L9","iqv4kkZANm","7Ow5CbrhlQ","Oz8yZ5drc6","qaofNnFqik","MGlTFS2Dfu","7fsYMEdBKc","tjQxsuAWyp",
+"29QAzHlUbF","vLsmSJkzUn","rhl0JVprf2","OxWIHSs0Zu","pWiOsQbxXc","NAFuw0BmCy","lXFOBZ4I1v","RBhp07Ow5C","UlU3Mxciqp","W3VFHmX2GE",
+"pWiOsP6bcg","2Yz7EhE1Ql","VIlwPfaHir","8U2nUtl72W","GWqqXuQIcz","rz7Ut64s8N","v8yFNYOfrY","iKqhr4QMc9","pAhR1VBjhz","YOfrYlweGy",
+"iqv4kJIqXi","1j5L8JKWYR","8RCUAoVQp6","atef2v2eC3","B3qemMm8si","P6bcguoStw","guMb8hYBCK","WaWsvAkKTk","Mkgy8jtn0X","Cp3mZVerEA",
+"FPfSEZuDtD","FGzgpZuDtD","zz4ZUAXpwE","Pb1paOUYuF","n1pmOgf8rI","1LB1LCK5W7","lkMUACxVEf","29QAzfFDrJ","0BmCyLDk6f","dhSuHZzJHW",
+"Waim6MK07Y","zHF1qlViBv","6q6L9tAOsr","WPmlxhe9IA","WreyPzmLYD","Dz1R3sx5Gl","AkKTkqUJMd","Oz8yZ7hyVv","JIqXiatef2","Yw2oUCdyBV",
+"pvgjSCIShG","FxX9qMaJQs","cL0aELDk6f","vOqCEKr8ys","Gv3FqTwano","v1HlniwzGk","fcJOyXflUq","he9IAdhSuH","BFkb8h1zcH","9rlg9v2eC3",
+"uQIcz0PktI","tlILtTXQ0Z","nlaByFNYIM","CqqaD07n1c","FjHXRuQIcz","uQIczBCxeC","8TxD7S2Dfu","AIYUua00b5","W7cTsY1mC0","LDk6fnlaBy",
+"RmDcrn1pmO","SWfouK4GS8","K20wKiwzGk","Yf2EcHlUbF","sqVrfW7cTs","pT8wumz8gx","F6PT2BFkb8","aL6AJIBe8k","bZLvSpv0i7","v1HlnQbxXc",
+"FGzgpuAWyp","YOfrYtaOXK","14FLRuoStw","qUJMdtlILt","1LB1LVjCZq","prNT67fKYU","5IhmGVNCPd","pFrrlMGlTF","kZANmPOUYS","MojnPUlU3M",
+"StlDJ5iGN5","pvgjSfcwDa","Gv3FqWDVWJ","SWfougIYvE","dQ586uupzk","soy9tCfgr3","BbwgAhYBCK","rz7Ut0YAGH","ulk415drc6","CNHmvFwEJz",
+"45cIHFnPFB","ulk41BGaQY","guMb8X6Pin","v8yFNFVMxo","v1HlnZuDtD","RACujpT8wu","SWfouYh1hF","D6rByWDVWJ","FFDuihUTw7","jzUqR8FmFH",
+"SjskQQ6hMC","x3LDexXTI4","e6e4z1j5L8","Chuy37X3uy","yvOMIiqv4k","ni2v1NAFuw","GrDg7UlU3M","KASQ82Yz7E","RpBQm9rlg9","lViBvSs0Zu",
+"Ta8f6h1zcH","ksJby2Nslm","mz8gxRBhp0","MmKGJaL6AJ","gjUTuqQxHP","uTacx2ZHdk","pv0i71j5L8","euZA5Ss0Zu","Dz1R3TXQ0Z","OxWIHtvdkD",
+"QssNCpvgjS","jS1ajMkgy8","VIlwPdmoS7","jeskSgIYvE","0h1b1taOXK","Mm8si9rlg9","IKxdL4QMc9","cmXIXUmaEv","kZANmUlU3M","pFrrl07n1c",
+"OUYuFgf8rI","jiVBPpFrrl","5iGN50h1b1","0PktI8hJdt","t98iW16lHc","lpF6WpFrrl","taOXKNo0Qb","xciqp5Namm","Yh1hF2hEEU","Q6hMCzbIYY",
+"uTacxBCxeC","pFrrlUvlv4","VLTy6vLsmS","9eoRciwzGk","qUJMduPX7G","5drc69GXkX","zY1GYsuY4x","BFkb8Pb1pa","rhl0JQnJ1S","5iGN5JRJQB",
+"fqypyRxrsm","VNCPd24ARF","CdyBVYOfrY","FGzgpsx5Gl","pAhR1JIqXi","0ao3lCIShG","WreyPlXFOB","2DREsv8yFN","U3yw5mX2GE","WmadAxXTI4",
+"VNCPdEdBKc","oVQp6Uvlv4","5nmWvxReec","C2Irck85Ae","Waim6yluBx","vOqCEMkgy8","rz7UtBFkb8","hYBCKblLA9","RBhp0SWfou","uupzkAXpwE",
+"0Wr5y64s8N","5drc64W0Tl","kZANm24ARF","FxX9qdQ586","5Mg9ra00b5","t98iW618Di","QbxXcjS1aj","s4786tvdkD","UlU3MzQt6Q","oVQp6fmIK1",
+"GrDg7uLtKs","iqv4kFNYIM","2ZHdkTa8f6","sqVrfYOfrY","8U2nUU3yw5","sx5GlIn3NS","s7MxkUmaEv","bgJAzhYBCK","oQ87rKr8ys","CqqaD7lUXZ",
+"BGaQYguMb8","Mkgy8LbRTH","v2eC3CdyBV","tjQxsi3pyd","jtn0XtjQxs","5Namm64s8N","aL6AJGv3Fq","ciuWzAOgEe","2Nslms7Mxk","WreyPdmoS7",
+"HP433S2Dfu","3otm6uAWyp","618Disoy9t","FVMxoS2Dfu","CK5W77hyVv","m4bxUNOHsz","P6bcgS77LH","Gv3FqStlDJ","mX2GE3weIF","pWiOsEoToP",
+"zqH0Wgf8rI","vkCHHdQ586","i7WMQpWiOs","YjB9t580YD","lpF6W3otm6","QWxoTuAWyp","NAFuwwiHrZ","jiVBPrKDLJ","Uvlv4AgJHQ","v1HlnGrDg7",
+"ZhwG1jfREu","tAOsrStlDJ","fFDrJatef2","zY1GYlm0pD","BFkb8lCMxy","8xEKzQ6Lix","SWfoutvdkD","RxrsmuQIcz","Waim6uN6r3","QChxsW3VFH",
+"9eoRcYjB9t","brhlQ4dEz6","AOgEeyvOMI","WaWsvMaJQs","B3qemDcpWB","QbxXcqaofN","yToGWkZANm","NhXdud85a9","Ta8f69iGoT","9XyT9o8Uyd",
+"I7p2alkMUA","SbRYy2hEEU","7ku1pI7p2a","pT8wuY1mC0","MezSWMmKGJ","xciqpAOgEe","YjB9tM3zXL","i3pydWDVWJ","7Ow5CDz1R3","ru4UGRBhp0",
+"2TRI7tl72W","Yf2Ecfqypy","24ARFdhSuH","lpF6WTwano","U3yw5oQ87r","zbIYYK20wK","LDk6fAgJHQ","prNT6RBhp0","G1RhSuupzk","5drc6OUYuF",
+"Ss0ZuECMvU","DLhzMcL0aE","5drc6Dz1R3","VBjhzJXljW","B3qemKZamH","piJSkhYBCK","29QAzZuDtD","RkQkedpe1v","55rfB0MR5X","DcpWBlkMUA",
+"jSjS3dhSuH","gIYvEuZPqg","7X3uyRBhp0","x3LDeAXpwE","48cHLRzaZA","s93MlprNT6","FjHXR16lHc","tAOsrM3zXL","AmdQdyToGW","hSSvQrKDLJ",
+"2Yz7E2Yz7E","1LB1LjS1aj","uLtKsKr8ys","uN6r3FxX9q","VjCZq8cVD3","gjUTuulk41","I7p2aCdyBV","fmIK1brhlQ","NcICAsuY4x","jfREutaOXK",
+"iKqhrlCMxy","CqqaDOUYuF","5ZaEzX6Pin","FVMxoChuy3","8FmFHP6bcg","pvgjSCqqaD","ydG8Udjsrv","CqqaDzqH0W","yEfy9a00b5","Kr8ys5Drn0",
+"RBhp0ksJby","jSjS3okgRi","MezSWUmaEv","lViBvIRh48","AIYUu8RCUA","UlU3MAmdQd","NcICAZzJHW","U3yw5FNYIM","64s8NVerEA","iwzGkEdBKc",
+"Ss0Zuru4UG","FLsphCdyBV","JIqXiQnJ1S","EOE1ofLNg8","3weIF0MR5X","gdQsSpv0i7","Mkgy8FcWrW","hYBCKFVMxo","MGlTF5IhmG","t59lRgf8rI",
+"VBjhzuZPqg","Waim607n1c","yEfy9uJScX","lm0pDydG8U","wDajXEoToP","e6e4zXflUq","faHirazIWp","qaofNpvgjS","VjCZq7lUXZ","SjskQ8U2nU",
+"v8yFNv8yFN","qaofN8xEKz","WPmlxiwzGk","OUYuF5nmWv","LDk6fv1Hln","uN6r3RzaZA","AkKTkC2Irc","55rfBzY1GY","RmDcrnFqik","M3zXLbrhlQ",
+"jzUqR2ZHdk","9XyT9CqqaD","lkMUAzqH0W","t98iWG1RhS","lViBvuPX7G","cQOnvbgJAz","5iGN5iqv4k","aFFssFcWrW","zFgtByEfy9","9rlg9hUTw7",
+"pAhR1Rxrsm","Dz1R3sqVrf","RzaZAFFDui","EOE1oQbxXc","aDGtSVBjhz","pFrrlfFDrJ","NhXduIBe8k","P6bcgdjsrv","2hEEU4W0Tl","pT8wupiJSk",
+"Uvlv4xXTI4","IRh48CIShG","WMiS3FLsph","iB08lbgJAz","KsjRKOUqFM","CK5W7ZUnqt","AXpwEWMiS3","Cp3mZhUTw7","fLNg8cmXIX","vOqCEru4UG",
+"gjUTufFDrJ","n1pmOQbxXc","5IhmGzqH0W","uN6r3PYBf4","nlaByuPX7G","AgJHQVjCZq","FNYIMIKxdL","hUTw7LDk6f","ReKEWix74r","s93MlHlUbF",
+"ZJTXH7Ow5C","G1RhS5VZjS","fcwDaNo0Qb","okgRit98iW","7fKYUTwano","jiVBPTwano","0PktIQ6hMC","FnPFBZUnqt","618Di9y4lw","0Wr5yRpBQm",
+"2DREszmLYD","cL0aElXFOB","DQimp2Yz7E","RsQUqlH1kt","xciqpgtCA5","RzaZAK4GS8","W3VFHEdBKc","2DREs2hEEU","o8UydtAOsr","29QAzuTacx",
+"QssNCaez9y","1v5hHQWxoT","sqVrfblLA9","fmIK1JkzUn","ksJby5ZaEz","BGaQYQssNC","JXljWfqypy","0ao3l6q6L9","4dEz6FcWrW","brhlQ7fsYM",
+"CIShGZJTXH","ix74rOHaBz","tl72Wx3LDe","5Mg9r9iGoT","pT8wuxciqp","O3iyQ07n1c","BFkb8lweGy","lweGyqaofN","ZhwG1Y1mC0","FFDuiPb1pa",
+"0ao3lLbRTH","v2eC33weIF","h1zcH29QAz","C2IrcFjHXR","5iGN5zY1GY","AXpwEsuY4x","brhlQBbwgA","VNCPdgIYvE","HRxd8b29RJ","5iGN55Namm",
+"NOHsziwzGk","jfREun1pmO","S77LH7fKYU","gf8rI7X3uy","zz4ZUHlUbF","5Drn0cL0aE","cL0aEdmoS7","oVQp6xXTI4","MmKGJjtn0X","y94nwlweGy",
+"xReecRkQke","8TxD7Twano","W7cTsxXTI4","HRxd8StlDJ","5IhmGprNT6","0BmCyCfgr3","WmadAprNT6","jiVBPFVMxo","StlDJChuy3","AkKTkIKxdL",
+"uLtKsAIYUu","iB08lni2v1","xXTI4CIShG","O3iyQBFkb8","v1Hln8cVD3","zQt6Qs93Ml","NcICA0h1b1","v8yFNjSjS3","7hyVvFVMxo","8hJdt580YD",
+"n1pmOIRh48","tlILtmX2GE","IBe8kNAFuw","xXTI4uQIcz","AXpwEChuy3","9rlg9nFqik","lsQGo9eoRc","FjHXRFxX9q","vOqCEh1zcH","2Nslmiqv4k",
+"GXdoH9rlg9","b29RJCIShG","MmsIoo8Uyd","StlDJi7WMQ","LDk6fTa8f6","FNYIM14FLR","piJSkdjsrv","gIYvEUlU3M","29QAzyvOMI","1LB1Lh1zcH",
+"ksJbyru4UG","t59lRUmaEv","SbRYypiJSk","2Nslm580YD","29QAz580YD","iqv4kfqypy","ciuWzuPX7G","24ARFTa8f6","tAOsrLbRTH","b29RJjtn0X",
+"OHaBz9GXkX","uQIczK4GS8","DQimpP6bcg","AmdQdVprf2","ciuWzlj07Q","Mm8si9eoRc","v2eC3NcICA","pmeCdPOUYS","uZPqgrKDLJ","14FLR7hyVv",
+"cShY2suY4x","0h1b1jeskS","lpF6WM6qcG","wDajXx3LDe","ix74rHzZT8","lXFOBv1Hln","ix74rOUYuF","AIYUu1LB1L","Ta8f6Cp3mZ","Q6LixtAOsr",
+"G1RhS1LB1L","QbxXcM6qcG","zqH0WBGaQY","VBjhzcQOnv","AIYUuQssNC","5drc6GXdoH","K4GS8Qworu","zFgtBVIlwP","WPmlxru4UG","fcwDa3weIF",
+"kZANm9y4lw","S77LHlpF6W","SbRYykZANm","iKqhroVQp6","tjQxsvLsmS","Ta8f6WMiS3","aDGtSfmIK1","VIlwPFVMxo","5VZjSFNYIM","suY4xs7Mxk",
+"lpF6W618Di","2DREsuZPqg","8hJdtm4bxU","lweGy0MR5X","OUYuFzFgtB","s7MxkuoStw","5Drn05VZjS","n1pmOM3zXL","gjUTuZzJHW","qUJMdlm0pD",
+"WMiS30BmCy","Y1mC007n1c","DLhzM55rfB","lsQGo5Drn0","MmKGJlweGy","SjskQFxX9q","HlUbFWPmlx","WaWsvFPfSE","gf8rIF6PT2","cL0aEydG8U",
+"Pb1pa618Di","lm0pDxciqp","8TxD7aL6AJ","0YAGHYOfrY","blLA9Ul4a1","PYBf4fcJOy","OxWIHYw2oU","ZJTXHFcWrW","DLhzMhe9IA","WPmlxJKWYR",
+"Chuy3qQxHP","lpF6WCxVEf","uJScXFcWrW","48cHLoVQp6","K4GS8FcWrW","16lHcnnP8o","DG4sT1LB1L","uN6r3zqH0W","AOgEeuTacx","fcJOyWPmlx",
+"lweGyn1pmO","Yw2oUU3yw5","KsjRKVNCPd","uN6r3hE1Ql","FxX9qciuWz","v1HlnNAFuw","ReKEWogLgc","J2mQiWPmlx","SmGzvfcwDa","4W0TlyluBx",
+"lViBvBCxeC","mz8gxFVMxo","55rfBtaOXK","RACujMkgy8","gdQsSWPmlx","4W0TlguMb8","IjTwPsqVrf","azIWpYjB9t","Q6hMCblLA9","HfyNQ2TRI7",
+"RsQUqBFkb8","JIqXiNcICA","fmIK1FNYIM","euZA5IKxdL","wDajXXyPZN","jSjS3RACuj","7X3uyd85a9","CqqaDFNYIM","Q6LixtaOXK","MojnPBFkb8",
+"24ARFQnJ1S","MmsIosqVrf","Z4I1vJ2mQi","n8pJ9O3iyQ","JkzUnlkMUA","euZA56q6L9","580YDZhwG1","uAWypdjsrv","lm0pDaL6AJ","9GXkXRBhp0",
+"aez9y55rfB","WMiS3pFrrl","QbxXc9GXkX","qaofNFFDui","LewvMuvf7A","azIWpY1mC0","jiVBPGXdoH","SmGzv0h1b1","xReecXflUq","yluBx07n1c",
+"gIYvEv2eC3","2ZHdkFjHXR","qaofNlsQGo","M3zXLkB5nP","uupzkTwano","hUTw7jfREu","zQt6QbgJAz","0BmCylm0pD","jSjS3aDGtS","MK07YAOgEe",
+"taOXKGv3Fq","JRJQBVNCPd","M3zXLvkCHH","EoToPGv3Fq","OUYuFMK07Y","hSSvQM6qcG","i7WMQQnJ1S","AOgEet59lR","v1Hln4dEz6","jSjS355rfB",
+"QWxoTv2eC3","lsQGouAWyp","FPfSEv8yFN","No0QbPOUYS","NAFuwIn3NS","n1pmOjeskS","tlILtuPX7G","MK07Y618Di","d85a9K20wK","lXFOBChuy3",
+"P6bcgAmdQd","0h1b1GXdoH","JRJQBjtn0X","No0QbzQt6Q","Yw2oU5Drn0","k85AeyvOMI","FGzgprKDLJ","tvdkDC2Irc","hi5X7QWxoT","RpBQmOz8yZ",
+"dmoS7K4GS8","hE1Qly94nw","qQxHPwDajX","64s8NThjNn","ZUnqtDcpWB","OUYuFIBe8k","gdQsS8xEKz","tAOsrAgJHQ","uPX7G5Mg9r","kZANmQnJ1S",
+"GWqqXo8Uyd","U3yw5TCgPp","ReKEWVerEA","okgRiNo0Qb","FNYIMaez9y","cmXIXDz1R3","XyPZNaL6AJ","RkQkeCqqaD","TXQ0ZDQimp","Nxx9V6AFT0",
+"AmdQd4dEz6","FPfSEPOUYS","Mm8si14FLR","FFDuiAOgEe","zQt6QNOHsz","Nxx9VAOgEe","azIWpWmadA","uTacxMkgy8","uvf7AyofH3","xReecZ4I1v",
+"OUYuF5VZjS","Q6LixVNCPd","lm0pDgdQsS","iKqhrEdBKc","IBe8khSSvQ","2NslmTCgPp","brhlQnnP8o","aDGtS8cVD3","7hyVvFxX9q","e6e4zWmadA",
+"lkMUAJRJQB","7fKYUfmIK1","jtn0XLDk6f","guMb8Nxx9V","FNYIMCfgr3","wiHrZ5ZaEz","1j5L8pFrrl","HlUbFGrDg7","QbxXc2Yz7E","fcwDalm0pD",
+"DQimpZuDtD","rz7UtJJs5m","piJSkv2eC3","okgRiGWqqX","qQxHPi3pyd","v2eC3618Di","gf8rI9iGoT","QWxoTMmsIo","AIYUucShY2","jfREu9rlg9",
+"OUqFMhSSvQ","UlU3M9GXkX","zQt6Q1LB1L","jeskSgf8rI","lH1kt2hEEU","uPX7GaL6AJ","yluBx55rfB","hE1QliB08l","2ZHdkGXdoH","SbRYy8hJdt",
+"VjCZqzHF1q","2ZHdkM6qcG","TwanorKDLJ","OUYuFBGaQY","CNHmv0Kyfs","oGu6xyluBx","AmdQdBFkb8","KASQ8mz8gx","Chuy3HlUbF","IRh48NAFuw",
+"8U2nUuQIcz","7hyVvt98iW","Q6Lixd85a9","oVQp6RsQUq","AgJHQcL0aE","pAhR10Kyfs","JJs5mQ6Lix","WDVWJW7cTs","tuDyS7X3uy","5drc6ulk41",
+"s4786rKDLJ","64s8NsqVrf","TwanoU3yw5","Ss0ZuZUnqt","S77LHOHaBz","uZPqgCp3mZ","CNHmvZUnqt","7fKYU5nmWv","dmoS7K20wK","pmeCd2DREs",
+"5nmWvMGlTF","fFDrJ7ku1p","EoToPUmaEv","C2IrcuPX7G","tjQxsWmadA","lweGy7fKYU","gtCA5nFqik","55rfBuQIcz","RpBQmM6qcG","gtCA5atef2",
+"5Drn08RCUA","SmGzv9y4lw","3weIFZ4I1v","1LB1Lsx5Gl","ZUnqtOUYuF","No0Qb7hyVv","2NslmNhXdu","Chuy3lsQGo","MK07YlsQGo","wiHrZU3yw5",
+"euZA5bgJAz","4dEz6WDVWJ","AkKTknlaBy","tjQxsfcJOy","CdyBVsuY4x","PYBf4jfREu","hi5X7POUYS","xReecEdBKc","vLsmSuAWyp","soy9taL6AJ",
+"gtCA5rz7Ut","FhtglMm8si","brhlQO3iyQ","rKDLJ618Di","qUJMdVIlwP","ZUnqtRkQke","IjTwPWPmlx","brhlQyvOMI","FFDuiuAWyp","K20wKReKEW",
+"FFDui5Drn0","Yh1hF7fKYU","XflUqzmLYD","CNHmvoVQp6","FnPFBNcICA","qaofN6q6L9","VLTy6MaJQs","tjQxslCMxy","TXQ0ZqQxHP","VBjhzEdBKc",
+"mz8gxix74r","TwanovLsmS","sqVrfS77LH","DQimpCK5W7","oGu6xHfyNQ","GWqqXOxWIH","In3NSVLTy6","x3LDePYBf4","FGzgpM6qcG","AOgEeTCgPp",
+"fqypyM6qcG","gIYvEuPX7G","bZLvSsuY4x","AkKTkoVQp6","5drc66q6L9","cmXIXFcWrW","uAWypZuDtD","MmsIoMmKGJ","v8yFNxXTI4","45cIHazIWp",
+"7lUXZSmGzv","zbIYYOUqFM","2ZHdkzQt6Q","l83UduN6r3","G1RhSHRxd8","VNCPdi7WMQ","jS1ajMojnP","a00b5Qworu","jzUqRNhXdu","blLA94QMc9",
+"Cfgr3Ul4a1","atef2hYBCK","lViBvMaJQs","jS1ajcQOnv","OUYuF9iGoT","DLhzMsqVrf","tjQxs8hJdt","I7p2a7ku1p","ksJbyRsQUq","2DREsTXQ0Z",
+"M3zXLCNHmv","POUYSFwEJz","m4bxUIn3NS","soy9tVerEA","s47862Nslm","FLsphdjsrv","IRh48FLsph","ZJTXHuvf7A","ni2v164s8N","vOqCE7ku1p",
+"fqypyS77LH","YOfrYKZamH","b29RJM6qcG","RACujuTacx","RBhp0Mm8si","TXQ0Z9rlg9","GrDg7IBe8k","IKxdLMGlTF","LewvMWPmlx","prNT6n8pJ9",
+"BCxeC45cIH","soy9tY1mC0","SmGzvBGaQY","ZJTXH6q6L9","0YAGHFFDui","n1pmOGSQwj","FVMxotlILt","nnP8oKr8ys","gdQsSs93Ml","EdBKcjzUqR",
+"atef2KZamH","brhlQMkgy8","fcwDauvf7A","yvOMIW7cTs","prNT6FFDui","piJSkoQ87r","5VZjSWreyP","Oz8yZhUTw7","580YDSjskQ","QssNCCp3mZ",
+"ECMvUZuDtD","0YAGHX6Pin","o8UydJXljW","5IhmG8U2nU","uQIcze6e4z","MaJQsaDGtS","CdyBVBpYhV","5Drn0XyPZN","CIShGjzUqR","W3VFHOHaBz",
+"okgRiQWxoT","Y1mC0kZANm","jeskSatef2","NhXdulViBv","ksJbyQ6Lix","QssNCpFrrl","JKWYRO3iyQ","lViBvnlaBy","WDVWJMaJQs","5drc6FnPFB",
+"Chuy3LewvM","pvgjSQssNC","aL6AJ5iGN5","AIYUuSjskQ","S2Dfua00b5","s7MxkOz8yZ","FcWrWfcJOy","dmoS7Q6Lix","Yw2oU3otm6","XyPZNpT8wu",
+"6q6L9ogLgc","RACujBFkb8","faHirFPfSE","No0QbRmDcr","8TxD7TCgPp","tvdkDSmGzv","5nmWvWaim6","2DREsNo0Qb","Gv3Fq5ZaEz","5IhmGL7cGc",
+"NhXduYjB9t","5iGN5rz7Ut","NhXduni2v1","Mm8siRxrsm","K20wKguMb8","5Nammhi5X7","he9IAWMiS3","aDGtS2Yz7E","CdyBVNxx9V","7hyVvSs0Zu",
+"KASQ8t98iW","BCxeCF6PT2","kB5nPazIWp","pFrrltaOXK","BbwgAFnPFB","RsQUqNhXdu","oQ87r8FmFH","8FmFHix74r","yEfy9jzUqR","W3VFHXyPZN",
+"tl72Wmz8gx","48cHLNxx9V","Y1mC0tvdkD","WaWsv45cIH","MmKGJqQxHP","s7MxkjeskS","QworuQYxC0","WDVWJzQt6Q","dQ586s93Ml","5drc6a00b5",
+"KZamHSmGzv","uTacxaDGtS","d7vjMLbRTH","jzUqRNOHsz","TwanoUvlv4","Ul4a1Y1mC0","guMb8n8pJ9","xXTI4rz7Ut","aDGtSAXpwE","pv0i72TRI7",
+"0h1b114FLR","UmaEvaFFss","bgJAzvOqCE","hE1QlXflUq","soy9tatef2","S2DfuZv7z0","5iGN54QMc9","QnJ1SJJs5m","zmLYDNOHsz","29QAzB3qem",
+"QworuhSSvQ","v1HlnmX2GE","ReKEWsqVrf","qaofNmX2GE","FcWrWReKEW","yToGWG1RhS","CIShGuoStw","XyPZN5Namm","aL6AJCfgr3","uupzkeuZA5",
+"o8Uyd9eoRc","YOfrYzY1GY","lViBvyvOMI","HzZT8s93Ml","zbIYYlj07Q","gtCA5NcICA","GrDg7gIYvE","FGzgpGrDg7","9y4lwoQ87r","4dEz6RsQUq",
+"vkCHHRACuj","jeskSlj07Q","pvgjSBbwgA","brhlQfcwDa","1v5hH55rfB","9XyT9blLA9","6q6L9ThjNn","W7cTscL0aE","aFFssqQxHP","uAWypFLsph",
+"Cp3mZJIqXi","mz8gx3otm6","HP433L7cGc","Yh1hFuN6r3","FPfSEd85a9","HfyNQ48cHL","Yh1hFBbwgA","fcwDajfREu","yofH3fcJOy","DQimpfqypy",
+"i3pydU3yw5","kZANmWreyP","0PktIuTacx","AOgEeFGzgp","5VZjSRzaZA","mz8gxuPX7G","Yw2oUM3zXL","a00b5euZA5","pv0i7uTacx","euZA5yvOMI",
+"WmadADcpWB","FGzgpk85Ae","QClRLkB5nP","K4GS8jtn0X","Oz8yZQ6Lix","cmXIXSWfou","ZhwG1uPX7G","fLNg8pFrrl","5NammW7cTs","0MR5XPb1pa",
+"nFqikjSjS3","suY4xyluBx","QbxXcCK5W7","lkMUAcL0aE","okgRipT8wu","P6bcgLDk6f","d85a9sx5Gl","FnPFBiqv4k","AOgEegdQsS","uPX7G3otm6",
+"k85Aeatef2","JJs5mrz7Ut","2Yz7ECp3mZ","tl72WM3zXL","djsrvni2v1","Waim6o8Uyd","hi5X7lViBv","JRJQBIRh48","9eoRccQOnv","OUqFMWaWsv",
+"hi5X75ZaEz","C2IrcsuY4x","nlaBycQOnv","azIWpNOHsz","Oz8yZgIYvE","a00b5Uvlv4","zbIYYlkMUA","aFFssoGu6x","uN6r34W0Tl","bZLvS1LB1L",
+"soy9tydG8U","W3VFHMmsIo","WDVWJFFDui","t59lR3weIF","GSQwjdpe1v","JKWYRRxrsm","DLhzMpWiOs","zQt6Q4W0Tl","VjCZqFVMxo","7ku1pNAFuw",
+"AXpwEMkgy8","ru4UGtjQxs","fLNg8yofH3","I7p2auJScX","HlUbFulk41","rKDLJMaJQs","3otm6s7Mxk","jS1ajJkzUn","45cIHzHF1q","HfyNQ07n1c",
+"RACujMaJQs","BFkb8vLsmS","MmKGJ48cHL","soy9tCxVEf","JIqXiYOfrY","cQOnvuPX7G","Yf2Ecn8pJ9","dhSuHWaWsv","rz7UtWPmlx","nlaByMK07Y",
+"jfREuDLhzM","Vprf22Nslm","oQ87rAIYUu","Y1mC0Twano","IjTwPQYxC0","zY1GY0BmCy","FLsphrhl0J","tvdkDnnP8o","MojnPRBhp0","ZzJHW7Ow5C",
+"lm0pD07n1c","guMb8vOqCE","Q6hMCOHaBz","14FLRl83Ud","Zv7z0SbRYy","2DREs16lHc","uQIczL7cGc","5nmWvpv0i7","NcICAYjB9t","64s8NYw2oU",
+"JIqXihUTw7","55rfBHzZT8","8xEKz0Kyfs","ix74rpv0i7","0PktI6AFT0","uAWypoVQp6","vLsmSHP433","NOHszuupzk","qQxHPuTacx","RBhp0zqH0W",
+"ECMvUpmeCd","fcJOys4786","K20wKOxWIH","ECMvUtaOXK","l83UdwDajX","uPX7GGSQwj","ix74rbgJAz","0BmCyjtn0X","F6PT2HlUbF","Qworu6AFT0",
+"U3yw5MojnP","Mkgy8gf8rI","uQIczIKxdL","Twanomz8gx","Mm8silXFOB","atef2GrDg7","In3NSVprf2","d7vjMm4bxU","UlU3MIBe8k","gIYvEfaHir",
+"5NammPOUYS","FNYIMzHF1q","jzUqRs7Mxk","NhXduxciqp","yluBxFwEJz","brhlQlm0pD","StlDJVIlwP","64s8NblLA9","5ZaEzP6bcg","dhSuHIRh48",
+"tjQxsSjskQ","CqqaDNhXdu","Y1mC0zQt6Q","RACujhe9IA","s93MlEdBKc","Uvlv4MaJQs","IKxdLl83Ud","AgJHQvLsmS","U3yw5iwzGk","pv0i7QYxC0",
+"7Ow5CWmadA","tAOsrDG4sT","5NammJRJQB","QWxoT5nmWv","1LB1LhUTw7","GXdoHNOHsz","ydG8UMaJQs","CdyBVatef2","5iGN555rfB","YOfrYRsQUq",
+"FVMxo9rlg9","1v5hH5ZaEz","dpe1vyofH3","5drc62Nslm","IKxdLQWxoT","uPX7GNhXdu","fmIK17hyVv","UlU3MVerEA","5nmWvMaJQs","fLNg8tAOsr",
+"I7p2afmIK1","ogLgc5Namm","SmGzvVerEA","8xEKzWreyP","pAhR1BbwgA","MGlTF2TRI7","EOE1ov1Hln","zQt6Qk85Ae","NcICAUvlv4","1LB1LyvOMI",
+"t98iWFcWrW","rhl0JRACuj","pWiOsFVMxo","07n1cKASQ8","RpBQmJXljW","QnJ1SjS1aj","9eoRcUl4a1","WDVWJoGu6x","8U2nUQChxs","X6PinnnP8o",
+"OHaBzQssNC","zY1GYAIYUu","GWqqXUmaEv","rz7UtUlU3M","tuDySjiVBP","bZLvSZUnqt","mz8gxxXTI4","wDajXiB08l","qaofNAIYUu","JJs5mZuDtD",
+"Mm8siaDGtS","okgRiOUYuF","Dz1R3HzZT8","QssNCix74r","gdQsS0BmCy","i7WMQAgJHQ","piJSkb29RJ","mz8gxZhwG1","gf8rIhYBCK","0ao3ll83Ud",
+"1j5L8HlUbF","ThjNnFNYIM","xXTI4zbIYY","hSSvQKr8ys","EOE1ouvf7A","CNHmvokgRi","vLsmSZUnqt","i3pydmz8gx","pmeCd29QAz","cQOnvZuDtD",
+"0BmCyOHaBz","pv0i7prNT6","LbRTHvOqCE","n8pJ9Dz1R3","Zv7z0FcWrW","QnJ1S29QAz","zHF1qdpe1v","fcwDaJJs5m","7ku1piqv4k","uoStw64s8N",
+"FFDuijSjS3","3weIFd85a9","ydG8UGWqqX","zmLYDVprf2","24ARFkZANm","2hEEUuLtKs","pWiOsfcJOy","No0QbMkgy8","fmIK1VNCPd","FjHXRtuDyS",
+"ksJby9eoRc","gjUTu7Ow5C","KZamHRmDcr","No0Qbx3LDe","zqH0Wrz7Ut","Nxx9VZv7z0","JkzUnSmGzv","JRJQBi3pyd","QnJ1SdQ586","n1pmOdhSuH",
+"AmdQds4786","618DiQChxs","Kr8ysa00b5","v1Hln4W0Tl","14FLR8U2nU","BGaQYk85Ae","s4786gIYvE","OxWIHt98iW","djsrvguMb8","AkKTkuvf7A",
+"OxWIHuZPqg","BpYhVaDGtS","cShY2W3VFH","6q6L9MmKGJ","OxWIHMmsIo","FVMxoCK5W7","S2DfufcwDa","sqVrfsqVrf","Vprf2tlILt","pvgjSoGu6x",
+"wDajXVNCPd","5Drn0uPX7G","iqv4k2Yz7E","tAOsrOUYuF","zz4ZUzz4ZU","Mkgy8FPfSE","5VZjS5Namm","ECMvUcL0aE","HzZT8uupzk","dhSuHjiVBP",
+"W3VFHsqVrf","FjHXRY1mC0","s7MxkRkQke","QYxC0lpF6W","DLhzMI7p2a","zz4ZUVBjhz","oVQp6uupzk","RBhp02hEEU","fqypyzz4ZU","tl72W8RCUA",
+"JXljWvkCHH","PYBf47fsYM","jfREu5IhmG","ZuDtDYh1hF","OUYuFlH1kt","9iGoT2TRI7","7fsYMhe9IA","Dz1R3Kr8ys","s4786VNCPd","i7WMQAmdQd",
+"dQ586i7WMQ","7hyVv9XyT9","5VZjSRmDcr","0BmCy9XyT9","oVQp6xciqp","ZzJHWNxx9V","yEfy9AIYUu","yvOMIYf2Ec","K4GS8rz7Ut","ECMvU16lHc",
+"Cp3mZ8xEKz","Q6hMCW7cTs","I7p2aQYxC0","3weIFFcWrW","DQimpk85Ae","S77LHBbwgA","iB08ljeskS","blLA9rz7Ut","RACujIn3NS","uZPqgNOHsz",
+"0BmCy14FLR","dQ586gdQsS","NOHszzbIYY","BpYhVBGaQY","9GXkXYjB9t","5IhmGFNYIM","RzaZALDk6f","ydG8Ua00b5","OUYuF0Kyfs","Yh1hFtaOXK",
+"lH1kt0Kyfs","tAOsrUvlv4","zz4ZUni2v1","IRh480PktI","9rlg93weIF","NAFuwpv0i7","uupzkZzJHW","zqH0W07n1c","zFgtBOHaBz","ciuWzpAhR1",
+"Pb1pacmXIX","dhSuHt98iW","4dEz67hyVv","sqVrfC2Irc","7hyVvHP433","lH1ktQChxs","8cVD3WreyP","DQimpECMvU","OHaBzzFgtB","Yf2EccQOnv",
+"MaJQsNxx9V","JXljWSjskQ","aez9yP6bcg","l83Ud6q6L9","lViBvqaofN","CNHmvNcICA","ZzJHWAXpwE","Dz1R38hJdt","RmDcrP6bcg","QWxoTnnP8o",
+"s7MxkyluBx","piJSkHzZT8","jtn0XiKqhr","RkQkeru4UG","gIYvE9XyT9","fqypyfqypy","CNHmv45cIH","ogLgcSWfou","jiVBPsqVrf","RpBQmuTacx",
+"7fsYMFLsph","K20wKWMiS3","QChxsuAWyp","zbIYYOxWIH","ksJbykZANm","MK07YuLtKs","jtn0XoQ87r","WreyP7X3uy","LDk6fS77LH","StlDJDz1R3",
+"Gv3FqgtCA5","M6qcGG1RhS","lViBv14FLR","14FLRt59lR","lpF6WKASQ8","Mkgy8oQ87r","wiHrZCK5W7","aL6AJnlaBy","J2mQiUl4a1","618Dis7Mxk",
+"fFDrJ55rfB","5iGN5HlUbF","Y1mC0nlaBy","rKDLJlpF6W","GWqqXni2v1","NAFuw9iGoT","hUTw7v1Hln","oQ87rqQxHP","6q6L9Yw2oU","QWxoTCxVEf",
+"GWqqXyvOMI","hE1QllViBv","k85AeVerEA","QYxC0gf8rI","RkQkemX2GE","K4GS8lCMxy","6q6L9kB5nP","IKxdLAOgEe","CK5W7lViBv","o8UydOHaBz",
+"faHirrz7Ut","pvgjSzz4ZU","FwEJzUmaEv","pmeCdzbIYY","4dEz6hE1Ql","zmLYDatef2","v1HlnBpYhV","lpF6W0YAGH","AOgEe5Namm","lCMxy9iGoT",
+"kB5nPpAhR1","ru4UGqQxHP","KASQ8uupzk","No0QbuoStw","B3qemyofH3","7lUXZTCgPp","bZLvSeuZA5","LbRTHFFDui","ksJbyfaHir","gjUTuI7p2a",
+"5iGN5YOfrY","xciqpZzJHW","yluBxFPfSE","WmadAM6qcG","BpYhVmz8gx","JkzUnD6rBy","JRJQBECMvU","No0QbSbRYy","QnJ1Ssoy9t","DG4sT7fKYU",
+"djsrv8U2nU","sx5GlRACuj","TCgPpuvf7A","29QAzQChxs","WmadAzHF1q","UlU3MDcpWB","FcWrWStlDJ","NOHszMGlTF","nlaByWPmlx","cShY2soy9t",
+"uJScXqaofN","4dEz6tuDyS","pv0i7JJs5m","S77LHyToGW","lm0pDK20wK","xciqpAkKTk","2Yz7EMmKGJ","fcJOytjQxs","7X3uyn1pmO","lsQGomX2GE",
+"MGlTFCxVEf","No0QbYh1hF","CxVEfVNCPd","cL0aEXflUq","7hyVvEoToP","nlaByVjCZq","b29RJt59lR","Mkgy8pT8wu","DQimpLbRTH","In3NSfaHir",
+"hUTw7k85Ae","M3zXLMojnP","JXljWFxX9q","5drc6JKWYR","tlILtFFDui","AIYUuyToGW","MGlTFZJTXH","iqv4kpWiOs","zHF1q5Drn0","oVQp6pWiOs",
+"b29RJlXFOB","LbRTHuJScX","Q6hMCjfREu","GrDg7wiHrZ","BFkb8NAFuw","580YDC2Irc","lm0pDQChxs","Waim6mz8gx","aFFss6AFT0","Mkgy8L7cGc",
+"FwEJz2TRI7","t59lRFhtgl","Q6hMCReKEW","Zv7z0C2Irc","d7vjMv8yFN","yEfy9LbRTH","nnP8o6q6L9","4W0Tl45cIH","WMiS3t98iW","9rlg9XyPZN",
+"5nmWv64s8N","CqqaD5iGN5","6AFT0ZUnqt","9eoRcpFrrl","FnPFBCqqaD","2Yz7EkB5nP","oGu6xWreyP","OHaBzbZLvS","gdQsSVprf2","VIlwPi7WMQ",
+"7X3uyblLA9","S2DfudmoS7","lkMUA7ku1p","BbwgAblLA9","i3pydxciqp","l83UdgdQsS","fcJOy8U2nU","AIYUuy94nw","2DREsZUnqt","IKxdLKsjRK",
+"jfREunlaBy","07n1cThjNn","BFkb8aez9y","suY4xyofH3","8FmFHxReec","NOHszjzUqR","ix74rL7cGc","CdyBVSmGzv","55rfBksJby","gdQsSFVMxo",
+"1j5L8pmeCd","RkQkeIn3NS","MezSWTa8f6","lXFOBRxrsm","Chuy3Rxrsm","yEfy9nnP8o","jSjS30MR5X","5NammIn3NS","jtn0Xv1Hln","5VZjSNo0Qb",
+"lj07Qv1Hln","uLtKsogLgc","s7Mxkatef2","FFDuilm0pD","bZLvSRsQUq","2ZHdkuvf7A","KsjRKwiHrZ","WMiS3MojnP","oVQp60h1b1","a00b59XyT9",
+"AIYUuRxrsm","S2DfuMmsIo","0h1b1lpF6W","8U2nUStlDJ","okgRi5Mg9r","Uvlv4AIYUu","hSSvQFGzgp","5Drn0s93Ml","faHiryluBx","Mm8siFNYIM",
+"CxVEfuZPqg","aDGtSVprf2","QnJ1SVIlwP","5iGN5kB5nP","pv0i7FwEJz","pmeCdC2Irc","uJScX4dEz6","MK07YdmoS7","Uvlv4M3zXL","VLTy6Cp3mZ",
+"cmXIXSs0Zu","faHirfcwDa","zQt6QdQ586","yToGWgdQsS","B3qeml83Ud","DcpWBfLNg8","3otm6tlILt","1v5hHS77LH","ZJTXHrhl0J","yToGWlCMxy",
+"JIqXiguMb8","8RCUA8cVD3","qQxHPn1pmO","jfREufcJOy","FFDuiKZamH","1LB1LNo0Qb","fqypyIBe8k","9iGoTt98iW","aL6AJI7p2a","FnPFBydG8U",
+"n1pmOAOgEe","8FmFHx3LDe","fFDrJVerEA","FjHXRDQimp","pv0i7StlDJ","ZJTXHZv7z0","FxX9qgtCA5","UmaEvWreyP","KASQ88cVD3","K4GS82DREs",
+"blLA95drc6","vkCHHiB08l","5nmWvReKEW","Oz8yZZzJHW","WMiS3iqv4k","iwzGkF6PT2","QnJ1SuJScX","ksJbydpe1v","wiHrZTwano","oVQp65IhmG",
+"FNYIMYOfrY","y94nwhUTw7","jzUqRVerEA","29QAzAIYUu","uZPqgCK5W7","pmeCdGXdoH","rKDLJlViBv","JkzUnn1pmO","DLhzMW3VFH","o8UydfcJOy",
+"16lHcFwEJz","uQIczyvOMI","VLTy6MmKGJ","JKWYRs93Ml","MezSWqQxHP","pAhR1jtn0X","5VZjS0ao3l","Ta8f629QAz","0YAGHY1mC0","LbRTHBFkb8",
+"DG4sTqaofN","BCxeCFhtgl","GWqqXQssNC","DG4sT7lUXZ","IBe8kFPfSE","NOHszpFrrl","uLtKs0YAGH","y94nwBCxeC","s93MlyluBx","rz7UtzqH0W",
+"P6bcgQnJ1S","v8yFNeuZA5","uPX7GSmGzv","RzaZAy94nw","EoToPNo0Qb","Ul4a18TxD7","i3pydblLA9","XflUq5iGN5","M3zXLzQt6Q","Cp3mZIn3NS",
+"0h1b1AgJHQ","FLsphVerEA","vLsmSFcWrW","zqH0Ws4786","lViBvaL6AJ","64s8NZzJHW","WMiS3Chuy3","4W0Tl580YD","M3zXLReKEW","5NammsuY4x",
+"piJSk1v5hH","GrDg7BGaQY","ReKEWG1RhS","uJScXCxVEf","6q6L9wiHrZ","oGu6xcL0aE","YjB9tuAWyp","Mm8siCIShG","FjHXRSjskQ","pvgjSa00b5",
+"RACujVBjhz","jS1ajU3yw5","jfREuulk41","Y1mC0fLNg8","ulk41StlDJ","b29RJv2eC3","yEfy9HlUbF","Dz1R3jSjS3","t59lRYOfrY","a00b5lViBv",
+"jSjS3WPmlx","ZJTXH9GXkX","zHF1qv1Hln","DLhzM64s8N","FnPFBtl72W","G1RhSfqypy","ulk41K4GS8","7Ow5CIjTwP","Cp3mZD6rBy","DcpWBGWqqX",
+"nFqik8xEKz","JJs5mazIWp","CqqaD7Ow5C","64s8NCqqaD","tlILtokgRi","In3NS9y4lw","Nxx9VWMiS3","5nmWvjzUqR","8FmFHGrDg7","vOqCE45cIH",
+"XflUq8cVD3","6AFT0I7p2a","Cp3mZuPX7G","Rxrsmni2v1","ix74ryEfy9","hi5X7BbwgA","Z4I1vpAhR1","Z4I1vIjTwP","8cVD3lViBv","U3yw5m4bxU",
+"9GXkXNo0Qb","HRxd8fmIK1","iB08lNo0Qb","gtCA5ulk41","bgJAzjzUqR","ZuDtDoVQp6","qUJMdCfgr3","I7p2a9GXkX","Cp3mZ9eoRc","ksJby4dEz6",
+"taOXK2ZHdk","HzZT87X3uy","VIlwPlkMUA","SjskQCp3mZ","1LB1LRkQke","GWqqXFxX9q","W7cTsFxX9q","Waim6jfREu","OUqFMlkMUA","uN6r3SmGzv",
+"5nmWvKsjRK","hi5X7Yw2oU","fmIK17lUXZ","OUYuFoQ87r","fFDrJiB08l","fqypytlILt","0Kyfs2ZHdk","ciuWzRsQUq","5VZjSHfyNQ","NcICAQbxXc",
+"dpe1vlweGy","FnPFBaFFss","zbIYYn1pmO","CqqaDmz8gx","EoToPM6qcG","SmGzvogLgc","8TxD7yvOMI","QChxsfFDrJ","ECMvUYjB9t","Oz8yZOxWIH",
+"NhXduyEfy9","QssNCWaim6","9GXkXjtn0X","X6PinjiVBP","uPX7GuTacx","s93MlxReec","xXTI4FVMxo","C2IrcyofH3","t59lRokgRi","euZA5QYxC0",
+"pT8wuEOE1o","5VZjSaL6AJ","1j5L8pT8wu","In3NSNAFuw","wDajXG1RhS","lXFOB580YD","zQt6Qaez9y","CNHmvhE1Ql","ru4UGlm0pD","Pb1pafFDrJ",
+"ix74rbZLvS","LbRTHSbRYy","hYBCKSs0Zu","o8Uyddjsrv","UmaEvs4786","JkzUn7X3uy","2TRI7MaJQs","ogLgcoVQp6","FxX9q0PktI","FcWrWQbxXc",
+"CNHmvQClRL","7X3uyydG8U","oGu6xksJby","JJs5mkB5nP","lm0pD7X3uy","yluBxh1zcH","7ku1pRmDcr","5VZjSWMiS3","fLNg8M3zXL","zz4ZUG1RhS",
+"ZUnqtd7vjM","9y4lwQYxC0","Waim6GXdoH","uupzkFwEJz","W7cTss7Mxk","NAFuwzz4ZU","SbRYysqVrf","2TRI7fcwDa","BCxeCatef2","ogLgc9iGoT",
+"tAOsr2ZHdk","mX2GEO3iyQ","iqv4kECMvU","QworutaOXK","pAhR1uJScX","5drc6pvgjS","2Yz7EM6qcG","FVMxogIYvE","QbxXcAXpwE","qUJMdNcICA",
+"euZA5qaofN","VjCZqrKDLJ","vOqCEMojnP","IjTwPpiJSk","azIWpGWqqX","hYBCKi3pyd","ECMvUK4GS8","HP433QbxXc","SbRYyyofH3","Pb1paZUnqt",
+"8RCUAZJTXH","JKWYRlpF6W","ZUnqtpFrrl","QYxC0BbwgA","4dEz6he9IA","e6e4zvLsmS","QClRL7Ow5C","azIWp7ku1p","ogLgcdhSuH","guMb8G1RhS",
+"BGaQYix74r","RzaZA8cVD3","nlaBydQ586","0ao3llXFOB","s93Ml0ao3l","NcICAlCMxy","P6bcg64s8N","MojnPh1zcH","7X3uyRmDcr","Waim6LbRTH",
+"vLsmSAmdQd","KsjRKpmeCd","BCxeCOxWIH","fqypyVBjhz","XflUq45cIH","LewvMk85Ae","WmadA8xEKz","Vprf28xEKz","hYBCKJRJQB","tAOsrdjsrv",
+"MK07Y7ku1p","lViBvWaim6","CxVEfsuY4x","he9IAiKqhr","RkQkezQt6Q","EdBKcIBe8k","MK07YjzUqR","RBhp0hi5X7","s47868FmFH","ciuWz6q6L9",
+"xciqpt59lR","gjUTuGrDg7","8U2nUaDGtS","64s8NfaHir","uTacxksJby","lpF6W0MR5X","tl72WtjQxs","RkQketvdkD","zY1GYCIShG","WDVWJ9eoRc",
+"S2Dfulm0pD","3otm6okgRi","LbRTH8RCUA","jiVBP9XyT9","v1HlnMK07Y","HRxd83weIF","yToGWMK07Y","aFFssdmoS7","uQIczaFFss","7hyVvFnPFB",
+"2TRI7M3zXL","QssNCQ6Lix","faHir9XyT9","WMiS3GrDg7","pAhR1okgRi","Cp3mZnnP8o","lm0pD8RCUA","AIYUuAmdQd","xXTI4fcwDa","2hEEUHfyNQ",
+"7fsYM2ZHdk","HfyNQdQ586","CxVEfe6e4z","EoToPprNT6","HlUbFMojnP","fFDrJgjUTu","AkKTkDLhzM","BGaQYuTacx","lsQGoHzZT8","W7cTsQbxXc",
+"64s8NWMiS3","fLNg8KsjRK","JJs5mJ2mQi","OUYuFqUJMd","a00b53weIF","Waim6618Di","BbwgArz7Ut","Yf2EcMmKGJ","jS1ajtAOsr","8hJdt64s8N",
+"Nxx9V8cVD3","uupzkMm8si","HP433vLsmS","s4786Mm8si","16lHcWaWsv","NhXdu7ku1p","ZUnqt6AFT0","iKqhrSmGzv","RACuj7ku1p","0Kyfs8RCUA",
+"soy9tn1pmO","ZuDtDMkgy8","n1pmOJJs5m","tjQxsjtn0X","ZUnqtazIWp","CIShGWPmlx","i3pydRmDcr","Dz1R3K20wK","Yw2oUyToGW","7hyVvMkgy8",
+"ReKEWWPmlx","I7p2atlILt","WreyPSmGzv","Yh1hFIn3NS","JXljW7lUXZ","UlU3MEoToP","VNCPdYf2Ec","PYBf4Pb1pa","J2mQi4dEz6","aFFssn8pJ9",
+"IKxdLfLNg8","8hJdtmX2GE","lCMxyaFFss","jiVBPWreyP","8U2nUQbxXc","Z4I1vGv3Fq","taOXKHzZT8","5Mg9raFFss","XflUqLewvM","7lUXZEoToP",
+"ZUnqtgIYvE","hE1QlLewvM","pAhR1JKWYR","sx5Gl580YD","s4786MojnP","Qworu7hyVv","S77LHVBjhz","Oz8yZ5iGN5","2ZHdk5IhmG","WaWsvGSQwj",
+"HRxd86AFT0","uLtKsXflUq","ZzJHWOHaBz","Ss0ZuDG4sT","jzUqRTa8f6","sqVrfuoStw","IRh48FnPFB","Y1mC0vkCHH","s93MlI7p2a","WMiS3cShY2",
+"he9IAksJby","faHir16lHc","StlDJ5VZjS","blLA9ZuDtD","POUYS3otm6","iwzGkQworu","jtn0XKZamH","0BmCyBCxeC","v1Hlns7Mxk","4W0TltuDyS",
+"8cVD33otm6","uvf7AjSjS3","xciqp618Di","JIqXiStlDJ","1v5hHFGzgp","EoToPbgJAz","GrDg716lHc","pvgjSsqVrf","ZJTXH29QAz","pmeCdqQxHP",
+"YOfrYP6bcg","GWqqXjS1aj","KsjRKBbwgA","ciuWzRpBQm","StlDJMkgy8","tvdkD55rfB","WMiS3uupzk","VBjhz7fKYU","JRJQBo8Uyd","taOXKStlDJ",
+"aL6AJFNYIM","29QAzX6Pin","x3LDeIn3NS","MmsIo4W0Tl","9eoRcChuy3","blLA9OHaBz","o8Uyds4786","t59lRgIYvE","W3VFHFNYIM","oQ87rlXFOB",
+"k85AeAmdQd","FPfSE7ku1p","JRJQBVIlwP","Gv3FqlH1kt","vkCHH618Di","OxWIH8TxD7","UmaEvDLhzM","MK07YogLgc","2Yz7EOHaBz","5nmWvUmaEv",
+"b29RJMK07Y","ni2v1Z4I1v","lkMUA8TxD7","7fsYMd85a9","guMb8cShY2","aez9yXflUq","cmXIXX6Pin","3otm6IBe8k","0Wr5ypv0i7","hYBCKazIWp",
+"0PktICfgr3","UmaEvjS1aj","ydG8Us4786","Vprf2XflUq","Y1mC0pvgjS","oQ87riB08l","0BmCyAIYUu","ogLgcru4UG","9XyT9RsQUq","NcICAuQIcz",
+"CK5W7iB08l","ogLgc2Nslm","TXQ0ZzbIYY","64s8NKZamH","pv0i7nnP8o","7Ow5Cd85a9","KsjRKuAWyp","C2IrcKr8ys","yvOMIxciqp","fqypyFGzgp",
+"cL0aEP6bcg","WMiS3n8pJ9","3otm6v8yFN","HlUbFReKEW","IKxdLxciqp","yvOMI5ZaEz","gIYvEvLsmS","2DREsXflUq","aDGtSpv0i7","5NammBCxeC",
+"djsrv2ZHdk","faHirkZANm","FVMxo7hyVv","vkCHHMK07Y","M3zXLWaWsv","dQ586JJs5m","HzZT8hi5X7","Dz1R3pFrrl","6q6L9mX2GE","HP433DLhzM",
+"ZuDtDgIYvE","Mkgy8FwEJz","k85AelCMxy","WDVWJMGlTF","FxX9qJXljW","JIqXiiKqhr","bgJAz7hyVv","M3zXLGSQwj","Nxx9VogLgc","CdyBVuJScX",
+"FGzgp48cHL","kZANmTCgPp","gIYvE07n1c","kZANmsx5Gl","xciqplH1kt","azIWpqUJMd","jiVBPuvf7A","CNHmvjS1aj","MezSWZUnqt","16lHc1j5L8",
+"9GXkXWmadA","uQIcz8hJdt","AgJHQ2DREs","J2mQipAhR1","nlaByXflUq","X6PinI7p2a","8hJdtuupzk","d7vjMVprf2","pAhR124ARF","dpe1vyEfy9",
+"2Yz7E5IhmG","hUTw74QMc9","GSQwj4QMc9","fFDrJkB5nP","BpYhVY1mC0","ReKEWzz4ZU","yToGWYf2Ec","8TxD7MezSW","zz4ZUZuDtD","9iGoTjeskS",
+"pT8wuazIWp","KZamHfcwDa","MGlTFhYBCK","dQ586MaJQs","uN6r3AgJHQ","tAOsrcL0aE","WaWsv07n1c","wDajX48cHL","hUTw7Uvlv4","rKDLJCK5W7",
+"8U2nU14FLR","YjB9tSjskQ","9XyT9CIShG","xXTI4ThjNn","WmadAPYBf4","7Ow5CyluBx","XflUqxXTI4","t59lRVBjhz","JRJQBlCMxy","okgRiL7cGc",
+"POUYS9iGoT","ZJTXHF6PT2","5NammSmGzv","djsrvIKxdL","pWiOsiqv4k","YjB9tNxx9V","iqv4k1j5L8","a00b5jfREu","4dEz6FnPFB","8cVD32DREs",
+"2hEEUVerEA","pvgjSfFDrJ","jfREuiwzGk","cL0aEThjNn","K4GS8KsjRK","pv0i7XyPZN","GSQwjRsQUq","XyPZNt98iW","HfyNQaez9y","pmeCda00b5",
+"DG4sT5drc6","Q6hMCpT8wu","iB08lX6Pin","AXpwEtaOXK","X6PinuAWyp","Cp3mZIBe8k","AIYUuzY1GY","ZhwG1IjTwP","JkzUnRzaZA","aFFssJXljW",
+"5ZaEzRpBQm","JRJQByvOMI","ksJbySjskQ","blLA98TxD7","DcpWBaez9y","MezSW2Yz7E","WmadA2hEEU","JXljW2Nslm","he9IAWDVWJ","iwzGkZv7z0",
+"wiHrZCNHmv","Pb1paReKEW","azIWp48cHL","ni2v1soy9t","ru4UGkZANm","JRJQBpmeCd","jtn0XTa8f6","TXQ0Zs7Mxk","sx5Gla00b5","HzZT8JkzUn",
+"pmeCdOUqFM","yvOMIvLsmS","JKWYR0Kyfs","vOqCEI7p2a","fcJOy580YD","JXljWpv0i7","ReKEW2Nslm","atef2lViBv","rhl0Jiqv4k","OUqFMDQimp",
+"aez9ysqVrf","uJScXxReec","14FLR0MR5X","VerEAB3qem","OxWIHm4bxU","07n1cRBhp0","S2Dfu5iGN5","UlU3MFLsph","Nxx9Vuupzk","dhSuHPYBf4",
+"NcICAsoy9t","KASQ8SjskQ","EoToPU3yw5","lXFOBAkKTk","DQimpuQIcz","8cVD3CxVEf","lweGylCMxy","FPfSEoGu6x","lCMxyIRh48","faHiratef2",
+"lXFOBfqypy","uLtKsS77LH","zHF1qQChxs","Ul4a1e6e4z","gIYvEs7Mxk","FLsphIn3NS","jfREuGWqqX","i7WMQxReec","h1zcH7fKYU","CdyBV7hyVv",
+"rKDLJ64s8N","F6PT2CIShG","0Wr5yhSSvQ","yToGWEdBKc","Mkgy8AOgEe","24ARFuupzk","wDajXTCgPp","1LB1LDz1R3","9eoRc5Namm","QnJ1Saez9y",
+"8xEKzL7cGc","XflUqcL0aE","Mkgy8rhl0J","5drc6hi5X7","29QAzru4UG","NAFuwWreyP","Yh1hFKr8ys","WMiS3QClRL","djsrvxReec","uZPqg8hJdt",
+"s7MxkhSSvQ","GSQwj48cHL","xciqpIRh48","HlUbFWMiS3","lkMUACqqaD","b29RJSmGzv","pAhR1K20wK","8xEKzI7p2a","kZANmfFDrJ","soy9tMaJQs",
+"tlILtlpF6W","tAOsrogLgc","zqH0Waez9y","sqVrflkMUA","Waim6W3VFH","yEfy93otm6","fmIK1uN6r3","5drc6CqqaD","O3iyQrz7Ut","45cIHCp3mZ",
+"ThjNnogLgc","5IhmGQYxC0","VerEALDk6f","NOHszzz4ZU","uZPqgpWiOs","IBe8k8U2nU","wDajXIn3NS","CqqaDTCgPp","hSSvQ0h1b1","EoToPmX2GE",
+"i3pyd64s8N","vOqCEgjUTu","5nmWvRpBQm","CqqaDyvOMI","hSSvQCK5W7","pWiOs14FLR","azIWpv2eC3","zmLYDZUnqt","QYxC0GWqqX","gf8rI55rfB",
+"ECMvU8FmFH","k85Ae14FLR","v1Hlny94nw","TXQ0ZGSQwj","faHirFxX9q","aDGtSt59lR","M6qcG45cIH","2hEEUvkCHH","0Wr5yFhtgl","zY1GYnFqik",
+"taOXKNAFuw","dmoS7ni2v1","7fKYUMGlTF","5Mg9rFVMxo","hi5X7e6e4z","Uvlv4VBjhz","TCgPpVNCPd","rhl0JVBjhz","2ZHdk7hyVv","SbRYyQbxXc",
+"Ul4a1uLtKs","LbRTHCK5W7","b29RJRxrsm","Dz1R3XflUq","yofH3580YD","lCMxyRsQUq","5VZjSoQ87r","6AFT09y4lw","yofH3jeskS","ogLgc14FLR",
+"lsQGoqUJMd","CIShG8TxD7","fcwDaTCgPp","ReKEWJRJQB","W7cTsix74r","0BmCysuY4x","zHF1qB3qem","dmoS7FLsph","Waim6Zv7z0","1v5hHx3LDe",
+"lkMUAMmsIo","fqypylj07Q","7hyVvxReec","jS1ajQssNC","Z4I1v9y4lw","BFkb88U2nU","LDk6fm4bxU","Zv7z0BCxeC","sqVrfDz1R3","nnP8oMGlTF",
+"ogLgc2ZHdk","45cIHPOUYS","StlDJFLsph","RACujPYBf4","lH1kt0MR5X","euZA5HP433","mX2GEPb1pa","pT8wulpF6W","uPX7GtAOsr","W7cTsO3iyQ",
+"CqqaDCNHmv","M3zXLFwEJz","L7cGcFVMxo","zY1GYlj07Q","Pb1padmoS7","DQimppiJSk","gtCA5pAhR1","5Namm7ku1p","AgJHQ0h1b1","D6rBy55rfB",
+"VLTy6ThjNn","Pb1paJXljW","uLtKs5iGN5","AkKTkEoToP","hSSvQkZANm","DQimpjtn0X","8RCUAW3VFH","hi5X72TRI7","VjCZqZv7z0","64s8NMaJQs",
+"Vprf25drc6","tuDySazIWp","JRJQBmX2GE","uZPqgJXljW","lj07QprNT6","I7p2aVNCPd","29QAzfqypy","MaJQspT8wu","ZuDtD5IhmG","CNHmvuAWyp",
+"wiHrZFNYIM","M6qcG5IhmG","W3VFHFFDui","FNYIMSjskQ","zz4ZUxciqp","0ao3lFPfSE","DG4sTZv7z0","QYxC0iB08l","iKqhr4dEz6","guMb8fqypy",
+"DQimp5nmWv","VLTy6BFkb8","Ta8f6SWfou","dmoS7pT8wu","0PktI2ZHdk","4QMc92ZHdk","QssNC24ARF","TCgPpMojnP","8RCUAKZamH","GrDg7d85a9",
+"2TRI79GXkX","2Yz7Eru4UG","suY4xblLA9","No0Qb2Nslm","C2Irc9iGoT","1LB1LLewvM","vOqCEDG4sT","0ao3l7fsYM","wiHrZjiVBP","CxVEfVLTy6",
+"VjCZqsuY4x","K20wKXflUq","7hyVvjiVBP","8U2nUM6qcG","Chuy3iB08l","OHaBztl72W","CxVEfuoStw","nlaByhe9IA","pvgjSThjNn","jS1ajQworu",
+"zY1GY8xEKz","SWfouuTacx","lm0pDChuy3","IjTwPydG8U","DQimp8cVD3","uN6r3NhXdu","uvf7AuLtKs","4dEz6aL6AJ","ix74rU3yw5","ZhwG1Nxx9V",
+"k85AeZhwG1","vLsmSuoStw","JXljWuPX7G","pAhR1FVMxo","qQxHPZJTXH","IjTwPDG4sT","xciqpWmadA","6q6L9Ta8f6","DG4sTGSQwj","IKxdLZzJHW",
+"NOHszFcWrW","fcJOyZzJHW","UlU3MO3iyQ","FwEJzCdyBV","JXljWWaim6","uTacxqaofN","GrDg77Ow5C","ogLgcix74r","Nxx9VnFqik","8cVD3Kr8ys",
+"CK5W7uoStw","zqH0WUl4a1","1j5L8xXTI4","ThjNnvkCHH","ThjNntl72W","9GXkXa00b5","Yf2EcGWqqX","FcWrWvLsmS","ReKEW64s8N","GXdoHI7p2a",
+"RBhp0bgJAz","o8Uydgf8rI","1LB1Lo8Uyd","3otm6HzZT8","48cHLjzUqR","Ul4a1gjUTu","OxWIHdhSuH","0ao3lIn3NS","6q6L9s4786","WmadA9iGoT",
+"CdyBVJIqXi","y94nwFGzgp","GXdoHL7cGc","QYxC07hyVv","KsjRKvLsmS","cShY2ksJby","Nxx9VdmoS7","1j5L8d85a9","1v5hH64s8N","L7cGcQnJ1S",
+"8U2nUjSjS3","VIlwPpT8wu","BpYhVNcICA","8xEKz5Drn0","gjUTu9XyT9","o8UydazIWp","vLsmSoGu6x","vLsmSY1mC0","ciuWzDz1R3","AkKTkAgJHQ",
+"RzaZASmGzv","yEfy9hUTw7","Ta8f67fKYU","uJScXBbwgA","l83UdLDk6f","BpYhVSbRYy","16lHcQnJ1S","GXdoHGSQwj","lkMUAlweGy","djsrvkB5nP",
+"hSSvQZ4I1v","RsQUqGSQwj","Q6Lix1j5L8","4dEz6JIqXi","uJScX5iGN5","mz8gxPOUYS","SWfouIjTwP","s93MlpWiOs","yluBxzQt6Q","HfyNQaFFss",
+"hSSvQi3pyd","pvgjSciuWz","0BmCyD6rBy","ciuWz07n1c","CIShG5Mg9r","zQt6QMmsIo","FVMxo5Namm","MmsIoF6PT2","LDk6fEoToP","brhlQsuY4x",
+"uN6r3zmLYD","cShY20Wr5y","K4GS8h1zcH","1v5hHPOUYS","8FmFHqaofN","0BmCySs0Zu","QClRL0Kyfs","t59lRzFgtB","yEfy9RkQke","HfyNQn1pmO",
+"IRh48vLsmS","x3LDeXyPZN","IRh48HlUbF","AIYUuL7cGc","WaWsv618Di","k85AelViBv","RzaZA0Wr5y","JKWYRoQ87r","7fsYM48cHL","Pb1pa5iGN5",
+"guMb8pv0i7","45cIHgjUTu","8RCUAt59lR","No0QbWaWsv","9iGoTzFgtB","Mkgy8YjB9t","ciuWzI7p2a","mz8gxdhSuH","5drc6uTacx","lj07QjzUqR",
+"QYxC0GXdoH","TCgPpjfREu","PYBf4Rxrsm","5NammguMb8","8hJdtNo0Qb","FnPFBgdQsS","lweGyFwEJz","580YDEdBKc","taOXKQClRL","gIYvEIBe8k",
+"HRxd8JXljW","FcWrWuN6r3","Yh1hF2ZHdk","uJScX8cVD3","3weIFy94nw","0YAGHcL0aE","FcWrW24ARF","Uvlv4MK07Y","fLNg8gtCA5","iB08lU3yw5",
+"fqypy16lHc","TwanoMmKGJ","bgJAz0PktI","IBe8koQ87r","MojnPfqypy","FjHXRJ2mQi","SbRYyOxWIH","QClRLjiVBP","NOHszmX2GE","xXTI4HlUbF",
+"ZuDtDTXQ0Z","G1RhS0h1b1","pT8wutAOsr","CNHmvdpe1v","U3yw57fKYU","taOXKciuWz","Z4I1vI7p2a","WPmlxfqypy","d85a9EoToP","5iGN55Mg9r",
+"ni2v1tlILt","M6qcGRkQke","qUJMdn1pmO","FwEJzTCgPp","0BmCyHRxd8","WmadAPOUYS","UmaEvZhwG1","CqqaDnnP8o","8cVD3UmaEv","pvgjSNOHsz",
+"gIYvEblLA9","fFDrJzFgtB","uTacxuZPqg","jeskSCIShG","uPX7GYf2Ec","618DiM6qcG","suY4xpWiOs","vOqCEJkzUn","zQt6QazIWp","RmDcrcShY2",
+"5IhmGuQIcz","QWxoTjSjS3","FcWrWIRh48","GrDg7Qworu","NcICAatef2","K20wKjiVBP","4dEz6dpe1v","1v5hHuTacx","ThjNndpe1v","G1RhSv2eC3",
+"d85a9dmoS7","nlaByGSQwj","SWfouoVQp6","7hyVvMK07Y","K20wKVBjhz","WaWsvQbxXc","FLsphW7cTs","lpF6WOUqFM","ogLgcuN6r3","5ZaEz14FLR",
+"WreyPpvgjS","WPmlxsuY4x","IRh48atef2","8xEKzIn3NS","uvf7AfcwDa","pmeCdaL6AJ","yluBxMojnP","euZA5hYBCK","iB08ld85a9","RmDcr0BmCy",
+"KZamHlViBv","In3NSmX2GE","QworujfREu","ix74rsuY4x","pWiOss7Mxk","Uvlv4GWqqX","0ao3lgf8rI","07n1cb29RJ","45cIHy94nw","FGzgpVprf2",
+"nFqikhSSvQ","F6PT214FLR","VIlwPQnJ1S","k85Ae8TxD7","gf8rIGSQwj","d7vjMJXljW","vLsmSuN6r3","MK07Ylm0pD","VjCZqfcwDa","MmsIo2TRI7",
+"tlILtYw2oU","faHirRmDcr","yvOMIoQ87r","Zv7z0EOE1o","ydG8UQssNC","guMb8W3VFH","0PktIWMiS3","LDk6fIKxdL","dmoS7nFqik","VjCZqNo0Qb",
+"C2IrcZv7z0","2TRI7sqVrf","16lHcVNCPd","rKDLJCfgr3","580YDoQ87r","iKqhrX6Pin","lm0pDlkMUA","J2mQilH1kt","fcJOyeuZA5","0PktIXflUq",
+"lweGyiwzGk","WPmlx9GXkX","580YDni2v1","CxVEffmIK1","atef2atef2","OUYuFsoy9t","VerEAfqypy","LbRTHxReec","Chuy3xXTI4","RzaZAjSjS3",
+"GrDg7lm0pD","IRh48Fhtgl","gIYvEYOfrY","EOE1oO3iyQ","48cHLEdBKc","yEfy9Z4I1v","MezSWWreyP","7fsYMuTacx","bgJAzPOUYS","rz7Ut2ZHdk",
+"kB5nPzqH0W","DcpWBM3zXL","ulk411v5hH","SbRYyvLsmS","QbxXcFwEJz","Vprf2WmadA","pmeCdzFgtB","CqqaDd7vjM","oGu6xZv7z0","zmLYDWaim6",
+"AgJHQsuY4x","NOHsziB08l","OUYuFTa8f6","xReeche9IA","WDVWJJRJQB","W3VFHiKqhr","zbIYY2hEEU","EoToPIRh48","lH1ktdjsrv","7fKYUmz8gx",
+"s93MlpvgjS","2Yz7EjiVBP","J2mQitl72W","ksJbyMGlTF","m4bxUIKxdL","Pb1paCxVEf","0Kyfs9rlg9","dmoS764s8N","k85AejS1aj","aL6AJnFqik",
+"MmsIo55rfB","SjskQYOfrY","JRJQBbgJAz","jzUqRvkCHH","55rfB2ZHdk","O3iyQwiHrZ","hYBCKI7p2a","QworuzQt6Q","AgJHQwDajX","C2IrcMojnP",
+"4QMc9fLNg8","i7WMQIn3NS","7Ow5CMm8si","fFDrJtjQxs","OxWIH9eoRc","NAFuwYjB9t","aFFsszQt6Q","lsQGo5IhmG","QssNCNhXdu","fcJOyS2Dfu",
+"FxX9q3otm6","soy9tX6Pin","14FLRHlUbF","MojnPlXFOB","s7MxkHP433","zQt6Q618Di","b29RJvOqCE","jeskSQChxs","FFDuitjQxs","xReec0PktI",
+"L7cGcJ2mQi","FxX9qlkMUA","cShY2ix74r","5NammlXFOB","vLsmSMm8si","iKqhrMmsIo","EOE1oNOHsz","45cIH55rfB","QnJ1Se6e4z","U3yw5fmIK1",
+"NOHszChuy3","pmeCddpe1v","WPmlxoGu6x","lpF6W9eoRc","Fhtgl2Yz7E","Yh1hF7ku1p","HlUbFYw2oU","oVQp6S2Dfu","bZLvS7fsYM","lm0pD5Drn0",
+"L7cGc7fsYM","dpe1vEoToP","hSSvQQYxC0","lj07QRACuj","IRh48AOgEe","ThjNnBbwgA","x3LDeVBjhz","FnPFBCxVEf","fmIK1IBe8k","fLNg814FLR",
+"HzZT8yluBx","AgJHQpAhR1","7Ow5CazIWp","yofH3m4bxU","tjQxs9eoRc","aDGtS618Di","KZamHO3iyQ","MojnPgtCA5","s93Mlt59lR","ReKEWoVQp6",
+"7X3uyFVMxo","GWqqXRpBQm","9y4lwblLA9","POUYSfcJOy","FGzgpuPX7G","VNCPdTXQ0Z","tl72W6AFT0","dhSuHlj07Q","uAWypv2eC3","6q6L90h1b1",
+"45cIHTa8f6","2hEEUS2Dfu","piJSkzbIYY","ciuWzhE1Ql","48cHLuZPqg","KsjRKzmLYD","AXpwEM3zXL","PYBf4KsjRK","WmadAAkKTk","KsjRKYf2Ec",
+"hSSvQtvdkD","HlUbFIBe8k","Vprf2BFkb8","M6qcGm4bxU","zY1GYNcICA","MojnPpiJSk","hE1QlWMiS3","i7WMQ5drc6","zmLYDdpe1v","e6e4zuJScX",
+"kZANmHP433","n8pJ9EdBKc","5Drn0jSjS3","faHirrhl0J","0PktI07n1c","8cVD3pWiOs","zHF1quvf7A","BbwgAbZLvS","OHaBz9eoRc","JXljWiB08l",
+"s47867hyVv","cL0aEdhSuH","M3zXLprNT6","Uvlv4prNT6","9iGoTuJScX","5VZjSzqH0W","ogLgcjtn0X","prNT62Nslm","DQimpdQ586","0ao3llkMUA",
+"0ao3l7lUXZ","yofH3LewvM","JkzUnpWiOs","uZPqgMmKGJ","cShY2FPfSE","KsjRKv8yFN","2Nslm0Wr5y","D6rBylj07Q","45cIHjzUqR","fcJOyn8pJ9",
+"zQt6Qv8yFN","Cp3mZ5drc6","fcwDaxReec","gIYvE0PktI","8FmFHqUJMd","ZJTXHiKqhr","zz4ZUNxx9V","ReKEWTCgPp","FnPFBxciqp","vLsmSB3qem",
+"OUqFMjSjS3","FGzgpsqVrf","3weIFSjskQ","gjUTulweGy","zz4ZUThjNn","jS1aj0Kyfs","uLtKsQnJ1S","VLTy63otm6","FFDuieuZA5","guMb8s4786",
+"gjUTu618Di","euZA5DLhzM","2Yz7EO3iyQ","fqypytl72W","vOqCE2TRI7","prNT6iKqhr","DcpWBrKDLJ","lH1ktfFDrJ","0PktIfqypy","F6PT2pT8wu",
+"tlILtvOqCE","QChxsjiVBP","VBjhzogLgc","prNT6CqqaD","lj07QG1RhS","dQ586GXdoH","gtCA5e6e4z","GXdoHoGu6x","uLtKse6e4z","mX2GEBFkb8",
+"4dEz6tvdkD","5ZaEzksJby","tAOsrzz4ZU","d85a9DLhzM","Mkgy8CxVEf","QYxC0fLNg8","SjskQLewvM","s7MxkCdyBV","gf8rIcL0aE","9iGoTkZANm",
+"FjHXRK4GS8","bZLvSQnJ1S","AmdQdFFDui","RzaZAGWqqX","CxVEfBpYhV","5NammAIYUu","7lUXZ0PktI","Zv7z0FNYIM","pmeCdOUYuF","8FmFHM3zXL",
+"mX2GEl83Ud","OHaBz0YAGH","tl72WDLhzM","uoStwHzZT8","RACujLDk6f","POUYSFFDui","blLA90BmCy","tlILtVprf2","P6bcgjSjS3","P6bcgsqVrf",
+"24ARFVIlwP","fFDrJFhtgl","IRh48aL6AJ","WreyPfLNg8","X6PinpT8wu","vOqCE3weIF","1j5L83weIF","MmKGJOz8yZ","jSjS3tAOsr","XyPZNydG8U",
+"oQ87rWPmlx","C2IrcKASQ8","mz8gxzY1GY","55rfBqaofN","tlILttaOXK","Vprf2hSSvQ","tjQxsru4UG","uQIcztuDyS","Mm8si48cHL","FcWrWBFkb8",
+"1j5L8K20wK","ogLgcuoStw","ZUnqtfLNg8","l83UdJXljW","bZLvSfFDrJ","cShY2ydG8U","QbxXc29QAz","zbIYYpFrrl","FNYIMVLTy6","QClRLuvf7A",
+"No0QbFxX9q","O3iyQo8Uyd","rhl0JuAWyp","tvdkDoGu6x","CNHmvru4UG","GWqqXlViBv","CxVEfyofH3","64s8NGrDg7","DQimpvLsmS","OxWIHOHaBz",
+"P6bcgzHF1q","fLNg8ZUnqt","Q6hMCG1RhS","U3yw5L7cGc","1LB1LKZamH","F6PT2o8Uyd","QbxXcG1RhS","uoStwyluBx","v8yFNiqv4k","1j5L855rfB",
+"YOfrYO3iyQ","WaWsvvLsmS","SmGzvPOUYS","BbwgAPb1pa","UlU3MXyPZN","Y1mC0LbRTH","DLhzMFxX9q","v8yFNIjTwP","16lHcFxX9q","Twano580YD",
+"oVQp6FjHXR","atef23otm6","d85a9t59lR","JKWYRi7WMQ","VerEApiJSk","kZANmix74r","ni2v1oVQp6","ciuWzulk41","CNHmvv1Hln","nFqiknnP8o",
+"jiVBPzz4ZU","uLtKstAOsr","2TRI7t59lR","fcwDa7fsYM","9eoRc45cIH","jSjS3RkQke","S2Dfu7hyVv","pmeCdGv3Fq","No0QbqUJMd","jfREuogLgc",
+"0Kyfs8xEKz","zz4ZUtvdkD","s4786F6PT2","AXpwEJkzUn","YOfrY14FLR","SmGzvIjTwP","iKqhrW7cTs","XflUqLbRTH","0PktIgIYvE","Nxx9Vlj07Q",
+"dpe1vZUnqt","m4bxUVerEA","v8yFNgIYvE","vkCHHulk41","tuDyS55rfB","pWiOsMaJQs","x3LDehYBCK","C2Irc48cHL","FNYIM0h1b1","2DREsrhl0J",
+"VjCZqFPfSE","Ss0ZuMmKGJ","ru4UGGXdoH","M3zXLCxVEf","2DREsYOfrY","CdyBVgIYvE","hE1QlRzaZA","ZUnqtLewvM","ydG8U9eoRc","LbRTHy94nw",
+"J2mQitvdkD","hE1QlGv3Fq","qaofNVjCZq","gtCA5SWfou","16lHcQClRL","euZA5bZLvS","J2mQiNxx9V","VjCZqMK07Y","WDVWJ8FmFH","Vprf2cmXIX",
+"Ss0Zu5Mg9r","B3qem9rlg9","d85a9NOHsz","StlDJm4bxU","WMiS32ZHdk","07n1cyofH3","2ZHdk9GXkX","8TxD7s93Ml","v8yFN9rlg9","ThjNnDQimp",
+"BpYhVX6Pin","2TRI7ZUnqt","LewvMSs0Zu","kZANmlsQGo","Cfgr3zz4ZU","0MR5XXflUq","AkKTkxciqp","Y1mC0fcJOy","GSQwjMm8si","Cp3mZ7hyVv",
+"uZPqgM6qcG","jiVBPVprf2","e6e4zQWxoT","QClRLuupzk","L7cGcYf2Ec","pWiOslH1kt","o8UydyvOMI","TXQ0ZFnPFB","W3VFHTa8f6","ulk41pFrrl",
+"gIYvEIRh48","BFkb8QYxC0","WreyPuQIcz","DLhzMb29RJ","580YDJJs5m","C2IrcQssNC","cmXIXCdyBV","S77LHs7Mxk","MojnPFNYIM","ZuDtDdjsrv",
+"a00b5ECMvU","CNHmvCp3mZ","24ARFGv3Fq","vLsmSjzUqR","lViBvkB5nP","fLNg816lHc","QssNC3weIF","TCgPpOHaBz","2Yz7EQ6Lix","8RCUAxReec",
+"zQt6QVLTy6","M3zXL9GXkX","tjQxsReKEW","0PktI7lUXZ","Mkgy8n8pJ9","2hEEU7fsYM","taOXKiKqhr","4dEz6KASQ8","lkMUAPb1pa","FGzgpIRh48",
+"euZA5JJs5m","uAWyp48cHL","SjskQWaWsv","a00b5Z4I1v","brhlQtvdkD","AOgEeuLtKs","rKDLJkB5nP","8RCUA2ZHdk","L7cGcHzZT8","580YD45cIH",
+"UlU3MzmLYD","cShY2XflUq","cShY2pmeCd","lH1kts93Ml","9XyT95drc6","4dEz6wDajX","cL0aESmGzv","QClRLRpBQm","POUYS0h1b1","fLNg8Rxrsm",
+"8xEKzHRxd8","tl72WWreyP","lj07QQnJ1S","P6bcgrhl0J","3weIFEoToP","hE1QljSjS3","xXTI4StlDJ","lXFOBI7p2a","Cp3mZiKqhr","aez9yhi5X7",
+"Yw2oUQnJ1S","AIYUulpF6W","cmXIXGSQwj","EdBKcpvgjS","jSjS3K20wK","QClRLIRh48","tvdkD2Nslm","9y4lwUvlv4","uJScX45cIH","4W0Tl3weIF",
+"VjCZquTacx","FGzgpX6Pin","WaWsvS2Dfu","FNYIMjzUqR","7Ow5CzFgtB","Kr8ysdmoS7","zz4ZU2Nslm","XflUqPOUYS","S77LH5iGN5","NOHsz9rlg9",
+"Fhtgl5Namm","QChxsru4UG","0MR5XCdyBV","1j5L8JkzUn","atef2wDajX","0KyfslpF6W","nFqikOz8yZ","0KyfsvkCHH","SjskQ9rlg9","VjCZqnlaBy",
+"lH1ktsoy9t","J2mQigf8rI","45cIHs7Mxk","lCMxy8xEKz","aDGtSjSjS3","uPX7GEoToP","iB08lW7cTs","GWqqXFFDui","RmDcrMkgy8","RzaZAsqVrf",
+"F6PT2VBjhz","SWfousuY4x","m4bxU8xEKz","uJScXW3VFH","0PktIYw2oU","GrDg77fKYU","24ARFuJScX","7X3uy5Drn0","3otm65Namm","gdQsSQ6Lix",
+"YOfrYIBe8k","DQimpZJTXH","2DREsZzJHW","RxrsmjfREu","uTacxjS1aj","CdyBVguMb8","3otm6uJScX","0PktISmGzv","Ta8f6M6qcG","tuDySx3LDe",
+"FxX9qMkgy8","MaJQsNhXdu","dhSuHciuWz","sqVrflpF6W","he9IAwiHrZ","AOgEeZzJHW","7ku1pTa8f6","RACujmX2GE","0MR5XxReec","5VZjSZzJHW",
+"C2Ircuvf7A","cL0aEUl4a1","tjQxs5ZaEz","VIlwPhi5X7","SWfouaez9y","zbIYYuvf7A","vOqCEK20wK","soy9ttuDyS","jzUqRWreyP","AkKTk3otm6",
+"EOE1oTa8f6","WmadAOz8yZ","PYBf4MmsIo","k85AesqVrf","guMb8wiHrZ","Yh1hFK4GS8","gdQsSgIYvE","pFrrlQnJ1S","jtn0XNhXdu","0ao3lQ6hMC",
+"d7vjMfcJOy","kB5nPQWxoT","W7cTspFrrl","d7vjMfaHir","WreyPdhSuH","ciuWz2Yz7E","Y1mC0faHir","BFkb8azIWp","Q6LixlpF6W","9XyT9s7Mxk",
+"LewvMMm8si","iB08luPX7G","ZhwG1o8Uyd","qQxHPCNHmv","oQ87r48cHL","he9IA45cIH","CNHmvVNCPd","tvdkDSWfou","l83Udzz4ZU","L7cGc5Namm",
+"m4bxUAXpwE","Q6hMCjSjS3","yToGWtAOsr","JKWYRvOqCE","aDGtSuJScX","OxWIHU3yw5","JXljWgtCA5","QworuCxVEf","CK5W7tjQxs","QChxsiqv4k",
+"n8pJ9C2Irc","8cVD3ReKEW","lweGyCp3mZ","0Wr5yblLA9","MK07YRACuj","29QAzU3yw5","6q6L9EOE1o","BbwgAMojnP","zmLYD6q6L9","lsQGoQssNC",
+"ZUnqtksJby","t98iWlCMxy","NOHsz2hEEU","No0Qb7fKYU","HP433sqVrf","1j5L8l83Ud","jeskSiB08l","QbxXc9eoRc","sqVrfFjHXR","6AFT0n8pJ9",
+"2Yz7EcQOnv","2hEEUciuWz","uvf7ANxx9V","VjCZqEdBKc","JIqXi3otm6","jiVBPZzJHW","jS1ajIBe8k","mz8gxCqqaD","CNHmv0YAGH","kB5nPi7WMQ",
+"48cHLNOHsz","i3pydpAhR1","POUYSjSjS3","9eoRcTCgPp","VjCZqFnPFB","cmXIXsuY4x","rKDLJni2v1","hE1QlbZLvS","taOXKvOqCE","pWiOsHlUbF",
+"Pb1paazIWp","Uvlv4n8pJ9","faHirPYBf4","dhSuHgjUTu","IRh48G1RhS","iKqhrrz7Ut","S77LHydG8U","K20wKgIYvE","nFqikzQt6Q","7X3uyyluBx",
+"2hEEUjzUqR","d85a9QWxoT","24ARFUl4a1","SWfou5nmWv","Q6LixlCMxy","s93MlAIYUu","2DREs7X3uy","ZzJHWIKxdL","dpe1vIRh48","ydG8U9XyT9",
+"QWxoTHRxd8","S77LHsx5Gl","ydG8ULewvM","FPfSELewvM","16lHcBpYhV","8cVD3580YD","uN6r329QAz","rhl0J48cHL","7X3uyjtn0X","Ta8f6ru4UG",
+"MezSWCK5W7","0PktIC2Irc","29QAzHfyNQ","WreyPjfREu","5NammHlUbF","IBe8kjS1aj","yofH3tlILt","JXljWVjCZq","QChxs14FLR","zqH0WFNYIM",
+"3weIFhe9IA","vOqCEbgJAz","WMiS3qQxHP","y94nwlXFOB","CIShGIjTwP","HlUbFOz8yZ","W7cTsBGaQY","GSQwj1LB1L","8FmFHtlILt","ni2v1OUYuF",
+"faHir5iGN5","jzUqRS2Dfu","HzZT8suY4x","TCgPpFxX9q","MGlTFs4786","PYBf4ZUnqt","QworuVIlwP","tlILtjS1aj","BFkb8QnJ1S","BbwgAjfREu",
+"0KyfsThjNn","6AFT0M6qcG","7hyVvwiHrZ","WmadA0Kyfs","0YAGHyToGW","n1pmOL7cGc","RpBQmIKxdL","okgRi5nmWv","h1zcHKr8ys","YOfrYiwzGk",
+"jfREuaDGtS","JIqXixciqp","9XyT9nlaBy","8xEKzjtn0X","iwzGkUvlv4","jSjS3P6bcg","wiHrZ1LB1L","tAOsr5ZaEz","BpYhVzFgtB","45cIHs93Ml",
+"guMb8okgRi","aDGtSTwano","lkMUAjtn0X","X6Pinsoy9t","ThjNnbZLvS","F6PT2S2Dfu","HfyNQblLA9","gdQsSEOE1o","NcICAbgJAz","tl72WuQIcz",
+"Vprf20Wr5y","nnP8oUmaEv","kZANmrz7Ut","KASQ8RmDcr","tjQxs8U2nU","3otm6oQ87r","X6Pind7vjM","OHaBzHlUbF","UlU3MfaHir","ZhwG1vLsmS",
+"lsQGoDcpWB","h1zcHWaWsv","Q6hMCogLgc","0MR5X8U2nU","lpF6WYjB9t","uvf7AtaOXK","yofH3RpBQm","d85a97fKYU","FcWrWFhtgl","IKxdLDLhzM",
+"ZhwG1QClRL","AkKTklH1kt","piJSkgtCA5","8xEKzKr8ys","In3NSUl4a1","8RCUAm4bxU","5drc67ku1p","POUYS2DREs","kZANmk85Ae","3weIFv1Hln",
+"fcwDaFLsph","ThjNnHlUbF","ogLgcd7vjM","WreyPSWfou","8cVD3W3VFH","FnPFBgjUTu","yluBxokgRi","MaJQsyofH3","5nmWvjS1aj","2DREs8FmFH",
+"iwzGkK20wK","DLhzMuZPqg","OUqFMJXljW","GSQwjRxrsm","kB5nPv1Hln","piJSk4W0Tl","xciqpFFDui","v8yFNqaofN","ydG8UpT8wu","B3qem580YD",
+"POUYSMmKGJ","SmGzvyvOMI","5drc6brhlQ","v8yFNm4bxU","tlILti3pyd","zY1GYlXFOB","jeskStaOXK","QssNC5Mg9r","t98iWQClRL","5Drn0HzZT8",
+"8RCUAQWxoT","v8yFNwiHrZ","618DiMaJQs","16lHcyofH3","CxVEf4W0Tl","hE1QlChuy3","VBjhzatef2","AkKTkd85a9","YjB9tSs0Zu","uoStwuoStw",
+"cL0aEXyPZN","s4786S2Dfu","WMiS3M6qcG","cL0aEsoy9t","iqv4kCqqaD","d7vjMPb1pa","6q6L9BFkb8","5iGN5FwEJz","tl72W5IhmG","v8yFNY1mC0",
+"07n1cdhSuH","ZhwG1aFFss","JXljWS2Dfu","ReKEWpiJSk","nFqikJ2mQi","atef21v5hH","2hEEUVIlwP","HlUbF5Namm","mX2GEZzJHW","7fsYMcmXIX",
+"8xEKz7fKYU","ni2v1HP433","LDk6fYf2Ec","Waim6aFFss","t59lRoQ87r","i3pyd7fsYM","16lHcogLgc","tjQxsd85a9","16lHc55rfB","dQ586WPmlx",
+"kZANm29QAz","Yh1hFfcwDa","7fsYMNhXdu","Zv7z0IRh48","LbRTHDG4sT","FjHXR3weIF","Zv7z0QssNC","pWiOsjSjS3","gjUTuydG8U","45cIHxReec",
+"BFkb8XflUq","k85AeBFkb8","lkMUAfFDrJ","hUTw7GSQwj","Zv7z06AFT0","QnJ1SFLsph","TCgPp7hyVv","7fKYUJXljW","SjskQksJby","VerEAvkCHH",
+"AIYUu9iGoT","SjskQpT8wu","VjCZqvkCHH","L7cGcCNHmv","b29RJNOHsz","blLA9nFqik","TXQ0ZO3iyQ","yToGWCK5W7","GWqqX5drc6","0h1b15Namm",
+"5IhmG7Ow5C","FNYIMzY1GY","xciqpHlUbF","blLA964s8N","SWfoud85a9","hE1QldQ586","fFDrJLewvM","atef2RmDcr","OHaBztjQxs","d7vjMi7WMQ",
+"IKxdLKr8ys","iKqhrv2eC3","0YAGH5iGN5","jtn0X580YD","9GXkXpWiOs","lj07Q55rfB","zFgtB5Drn0","HRxd8S2Dfu","IBe8kZ4I1v","wiHrZfmIK1",
+"gdQsStuDyS","ReKEW3weIF","2Nslm0ao3l","0ao3lv1Hln","wDajX0PktI","VBjhzRmDcr","fLNg8RACuj","s7MxkzHF1q","Chuy3CdyBV","Mm8sidpe1v",
+"OxWIHECMvU","5drc6uJScX","fFDrJ5ZaEz","J2mQinFqik","0BmCyZuDtD","lCMxyCp3mZ","brhlQWMiS3","BbwgAYf2Ec","v8yFNi3pyd","OxWIH9y4lw",
+"ThjNnfmIK1","48cHLhE1Ql","pv0i7RkQke","tl72WogLgc","8TxD7pWiOs","BbwgAYOfrY","tjQxsNAFuw","M6qcGMK07Y","HP433blLA9","XflUqIRh48",
+"ix74r618Di","QWxoTAgJHQ","JXljWSWfou","Nxx9VFLsph","lCMxy0ao3l","v1HlnNcICA","QbxXcUl4a1","JKWYR8FmFH","QClRLo8Uyd","ZuDtDAIYUu",
+"uupzkTa8f6","6q6L9IjTwP","b29RJVprf2","gf8rIZ4I1v","qQxHPKsjRK","hi5X7KZamH","64s8NpWiOs","jiVBP5Mg9r","0MR5XuoStw","tjQxsBGaQY",
+"LbRTHK20wK","8xEKzHzZT8","0ao3lCK5W7","WDVWJAmdQd","7hyVvFPfSE","FLsphzmLYD","ZJTXHv2eC3","O3iyQfaHir","YOfrYVprf2","yToGWbrhlQ",
+"CdyBVCp3mZ","pFrrllsQGo","wDajXfmIK1","aez9yFFDui","qUJMd8U2nU","a00b5tjQxs","M6qcGSbRYy","mz8gxuupzk","2ZHdkWreyP","ECMvU7ku1p",
+"K4GS8bZLvS","7hyVvuZPqg","0KyfsmX2GE","cL0aEtl72W","soy9tdpe1v","pWiOsDcpWB","k85AeCdyBV","8RCUA3weIF","BFkb8k85Ae","Gv3FqZ4I1v",
+"fFDrJ9iGoT","7fsYMbgJAz","gIYvEJ2mQi","faHir7fsYM","X6Pin1j5L8","MezSWQ6Lix","dmoS7HlUbF","VjCZqECMvU","jSjS3zqH0W","azIWpAmdQd",
+"FLsphRxrsm","uoStwCNHmv","faHirHP433","lm0pDTa8f6","ZUnqtUl4a1","4dEz6zz4ZU","SbRYyHlUbF","AOgEegjUTu","nlaBy4W0Tl","gtCA5tuDyS",
+"yEfy9FNYIM","POUYSyToGW","CNHmvcmXIX","jSjS3zz4ZU","s93MlksJby","F6PT2B3qem","29QAz8TxD7","QWxoTFjHXR","FhtglPYBf4","aFFssqaofN",
+"pFrrl5Drn0","fcwDaOHaBz","TCgPpydG8U","fcJOyVprf2","fmIK1vLsmS","CNHmvdmoS7","jS1ajYw2oU","AmdQdBGaQY","Dz1R39y4lw","djsrvydG8U",
+"16lHct59lR","8U2nUm4bxU","QWxoTuupzk","jSjS3t59lR","jeskSjS1aj","FGzgp9iGoT","FjHXRfFDrJ","Vprf207n1c","b29RJSs0Zu","SWfouRBhp0",
+"he9IAv8yFN","MK07YAgJHQ","ydG8UhE1Ql","2Yz7E7fKYU","s4786s4786","LDk6f2ZHdk","uAWyp4QMc9","8hJdt618Di","KsjRKFVMxo","Yw2oUBFkb8",
+"lXFOBY1mC0","CxVEfguMb8","5Drn0xXTI4","TXQ0ZfFDrJ","ZJTXHWaWsv","uoStwbgJAz","0KyfshE1Ql","tl72Wh1zcH","iwzGkMmKGJ","pFrrl5IhmG",
+"7X3uyNxx9V","zqH0WW7cTs","MK07YMmKGJ","VIlwPSjskQ","KZamHStlDJ","y94nwzY1GY","OxWIHpv0i7","VNCPdcShY2","0PktIQWxoT","ogLgccmXIX",
+"Vprf27Ow5C","Yf2EclCMxy","ydG8UY1mC0","45cIHlj07Q","DG4sTHRxd8","QnJ1Sdpe1v","LbRTHFPfSE","zz4ZUO3iyQ","fcwDauN6r3","2ZHdkPOUYS",
+"dQ586iwzGk","prNT67lUXZ","uupzk5iGN5","JKWYRxXTI4","hSSvQXyPZN","uQIczQClRL","S2DfukZANm","JRJQBwDajX","piJSknnP8o","cL0aE0Kyfs",
+"yToGWFjHXR","RzaZA1v5hH","s4786s7Mxk","t59lRlXFOB","5Drn0OxWIH","guMb8Cp3mZ","Yw2oUlpF6W","618DiIKxdL","Chuy3hE1Ql","Pb1papmeCd",
+"iwzGkwiHrZ","n1pmO7fKYU","6q6L9gIYvE","M6qcG8U2nU","QClRLChuy3","fLNg8fFDrJ","GWqqXFwEJz","zqH0W0Wr5y","ZJTXH0YAGH","FwEJzCNHmv",
+"7lUXZNAFuw","ix74roQ87r","EdBKcIKxdL","oQ87rAOgEe","4QMc955rfB","Yw2oUChuy3","7lUXZRxrsm","5Drn0ZhwG1","MGlTFRACuj","aDGtSNhXdu",
+"lpF6WQssNC","OUqFMFLsph","pv0i7n8pJ9","Dz1R3DLhzM","W7cTsoVQp6","Gv3Fqrz7Ut","lkMUAFGzgp","9rlg9Gv3Fq","n1pmOaDGtS","OxWIHMaJQs",
+"DLhzMcQOnv","MojnPiwzGk","kZANmJ2mQi","soy9te6e4z","vOqCEThjNn","MezSWVNCPd","618DiAmdQd","24ARFS77LH","G1RhSOHaBz","FFDui5Namm",
+"CIShG580YD","lkMUAEdBKc","GWqqXDQimp","blLA9NhXdu","S77LHJ2mQi","24ARFQChxs","7hyVvQYxC0","ksJby2TRI7","0Wr5yOxWIH","BGaQYblLA9",
+"guMb8VNCPd","FLsphdmoS7","2ZHdkn8pJ9","5NammMojnP","0Wr5ydjsrv","ZhwG1wDajX","Gv3FqjS1aj","soy9tFjHXR","0KyfszbIYY","Uvlv45ZaEz",
+"FwEJzzmLYD","fLNg8t59lR","qUJMdxXTI4","QYxC0rhl0J","gjUTuU3yw5","OHaBzoQ87r","2NslmpAhR1","9y4lwFjHXR","QChxsGXdoH","tjQxsStlDJ",
+"ulk41AkKTk","WDVWJSbRYy","In3NSjtn0X","5Drn0Q6Lix","fcJOy24ARF","dQ586tlILt","SbRYyuN6r3","7ku1p1LB1L","2ZHdkUvlv4","soy9tDLhzM",
+"Qworurz7Ut","XyPZNStlDJ","I7p2aVIlwP","FcWrWdjsrv","Q6LixjeskS","i7WMQlweGy","v8yFN2Nslm","qQxHPuQIcz","Y1mC0ZhwG1","QworufmIK1",
+"9XyT9K4GS8","5ZaEzThjNn","fFDrJcShY2","5nmWvnnP8o","blLA9RBhp0","DcpWBS2Dfu","wDajXuQIcz","cShY25drc6","lCMxy5iGN5","Pb1paZzJHW",
+"Pb1parhl0J","s4786ZJTXH","mX2GEM6qcG","uoStwatef2","7lUXZvOqCE","m4bxUdjsrv","GWqqXCxVEf","ZUnqtWmadA","faHirCp3mZ","yofH3xciqp",
+"pvgjS29QAz","iwzGk1j5L8","ogLgcfcwDa","QWxoTi7WMQ","7hyVvl83Ud","ksJby8U2nU","K4GS8BbwgA","IjTwPJKWYR","BpYhVhe9IA","7ku1pOUqFM",
+"WreyPzQt6Q","tvdkDd85a9","5nmWvM6qcG","gtCA5Chuy3","Yw2oUyEfy9","euZA5U3yw5","vOqCEtAOsr","IKxdL55rfB","ReKEWSmGzv","OUYuF0h1b1",
+"i3pydlweGy","8U2nUy94nw","6q6L9JXljW","uAWypJIqXi","LewvMNOHsz","2ZHdkfLNg8","gjUTupv0i7","cShY2IRh48","TCgPpuAWyp","atef2ciuWz",
+"hUTw7wDajX","8TxD79y4lw","cShY2b29RJ","nFqik0ao3l","xXTI4KsjRK","MK07YjS1aj","5NammY1mC0","IKxdLhSSvQ","FPfSEBFkb8","pvgjSS77LH",
+"lViBvSjskQ","VerEAmz8gx","JIqXiBCxeC","lViBvW3VFH","ZuDtDMmKGJ","cL0aEksJby","v1Hln5drc6","RzaZAB3qem","Z4I1vmz8gx","DLhzMMmKGJ",
+"L7cGciB08l","hSSvQ9XyT9","WreyPIRh48","ix74rCK5W7","gjUTugdQsS","azIWpWaWsv","i3pyd0YAGH","ydG8UChuy3","xXTI4M6qcG","nlaByAgJHQ",
+"ksJbyi7WMQ","Mm8sipvgjS","2ZHdkEdBKc","jtn0XL7cGc","n1pmOG1RhS","pv0i7he9IA","yvOMIulk41","NAFuwnlaBy","WPmlx7hyVv","S77LHzqH0W",
+"aDGtSzbIYY","jeskSRsQUq","AgJHQKsjRK","5drc62hEEU","QbxXcVerEA","7X3uyDLhzM","WreyPnnP8o","0BmCyk85Ae","8RCUAjzUqR","0Wr5yYh1hF",
+"2DREsNhXdu","HRxd8uTacx","M6qcGBbwgA","IjTwPYh1hF","L7cGc4dEz6","64s8NazIWp","MmKGJ8hJdt","AIYUunnP8o","v1Hln7fsYM","tjQxsuZPqg",
+"k85AehUTw7","WMiS3IRh48","tAOsrG1RhS","gdQsSCp3mZ","atef2WDVWJ","ECMvUWMiS3","8xEKzK4GS8","ZuDtDlj07Q","lkMUAFLsph","FnPFBpmeCd",
+"WreyPZ4I1v","2ZHdkOHaBz","2Yz7EDz1R3","QnJ1SpAhR1","hE1QlwiHrZ","P6bcgaDGtS","ksJbyUlU3M","7hyVvCNHmv","0Kyfs6q6L9","s4786xXTI4",
+"0KyfsM3zXL","uupzksqVrf","HlUbFAmdQd","FGzgpWMiS3","ReKEWlpF6W","d7vjMd7vjM","zz4ZUCp3mZ","4QMc9S2Dfu","fFDrJJkzUn","rhl0JWDVWJ",
+"oVQp6Fhtgl","fFDrJfcJOy","v8yFNW3VFH","5IhmGqUJMd","y94nw0MR5X","16lHcqaofN","iB08lxReec","cmXIX618Di","FjHXREdBKc","M3zXL2Nslm",
+"pmeCde6e4z","uJScX7hyVv","EdBKcZUnqt","pv0i7FjHXR","In3NSTXQ0Z","tAOsrhSSvQ","gdQsS580YD","M3zXL24ARF","9y4lwfmIK1","DcpWBDz1R3",
+"wDajXHzZT8","Ul4a1B3qem","Kr8ysx3LDe","3weIFYh1hF","7ku1pcmXIX","s93MlcmXIX","7hyVvqUJMd","Dz1R39eoRc","jiVBPThjNn","h1zcHFLsph",
+"gIYvEIKxdL","P6bcgWMiS3","vkCHHzz4ZU","RsQUqvkCHH","lsQGoi7WMQ","gIYvEnFqik","fmIK19rlg9","FFDui7hyVv","rhl0JOHaBz","I7p2alH1kt",
+"SbRYy9rlg9","UlU3MuLtKs","guMb8uAWyp","S2DfujfREu","mX2GEIjTwP","AXpwEatef2","JIqXitl72W","vOqCE2DREs","ThjNnGWqqX","vOqCEY1mC0",
+"guMb8bgJAz","e6e4z7hyVv","CIShG5ZaEz","JJs5mFjHXR","Cp3mZzFgtB","VerEANOHsz","fcJOy4W0Tl","EOE1oP6bcg","HP433U3yw5","Q6LixtjQxs",
+"XflUqiwzGk","pAhR1pv0i7","OxWIHn8pJ9","hYBCK24ARF","oGu6xIBe8k","JIqXilpF6W","hE1QlhUTw7","SjskQ0ao3l","pFrrlpv0i7","jS1ajEdBKc",
+"7fKYU2hEEU","HRxd8CqqaD","d7vjMJIqXi","9iGoTBCxeC","MK07Y8xEKz","bZLvS2DREs","lH1ktChuy3","WMiS3lkMUA","VIlwPMezSW","Kr8ysh1zcH",
+"CK5W70PktI","45cIH9y4lw","wDajXqQxHP","L7cGc8xEKz","VIlwPEoToP","JXljWThjNn","Vprf2iwzGk","8TxD78xEKz","HP433cL0aE","FnPFBzmLYD",
+"QnJ1Sv8yFN","zmLYDn1pmO","FPfSE8RCUA","yvOMIStlDJ","7fKYUazIWp","lm0pDZUnqt","WreyPbgJAz","Zv7z0k85Ae","RmDcr8U2nU","aFFssmz8gx",
+"tl72WtAOsr","RACuj7Ow5C","d7vjMdmoS7","W7cTssoy9t","jtn0XY1mC0","2ZHdk5Namm","iwzGksqVrf","X6Pin4dEz6","zqH0WtaOXK","iwzGkYOfrY",
+"dpe1v45cIH","gf8rIy94nw","2hEEUQ6hMC","Uvlv4BFkb8","lj07QBbwgA","atef2FcWrW","hSSvQ8cVD3","lViBvuZPqg","ciuWzOUYuF","bZLvSazIWp",
+"oVQp6dQ586","fFDrJ580YD","pWiOslm0pD","GWqqXKZamH","jSjS3ydG8U","zHF1qzqH0W","t59lRKr8ys","HfyNQQworu","8TxD7yToGW","QnJ1SuQIcz",
+"jSjS3OUqFM","5nmWvlm0pD","ni2v1x3LDe","s7Mxk8hJdt","CxVEflm0pD","CqqaD16lHc","9eoRclCMxy","pv0i7tAOsr","ECMvUsx5Gl","45cIHvOqCE",
+"NhXdu0PktI","nlaByWDVWJ","BGaQYGWqqX","brhlQ8xEKz","SbRYysuY4x","mX2GElXFOB","xXTI4GSQwj","8U2nUYOfrY","ZuDtDXyPZN","WreyP7ku1p",
+"QClRLSWfou","bgJAz5iGN5","QWxoTJkzUn","CxVEfQnJ1S","rKDLJBpYhV","cmXIXuJScX","IjTwPUvlv4","AgJHQyluBx","n8pJ9NhXdu","29QAzChuy3",
+"rz7Ut580YD","KZamHQYxC0","yEfy9tjQxs","Q6hMCulk41","580YDWMiS3","TXQ0ZbgJAz","vOqCE9eoRc","Mkgy8WPmlx","lm0pDzz4ZU","zqH0WWaWsv",
+"IKxdLzmLYD","G1RhSqUJMd","n8pJ9a00b5","IKxdLdpe1v","618DiNcICA","pWiOsix74r","hSSvQjS1aj","2Yz7Exciqp","I7p2akZANm","MezSW7lUXZ",
+"0MR5XJRJQB","zqH0WrKDLJ","K4GS8lsQGo","JRJQBaDGtS","FxX9qhE1Ql","Yw2oUtl72W","AmdQdNAFuw","FxX9qnFqik","1LB1LOz8yZ","SmGzvWDVWJ",
+"lXFOB2hEEU","SjskQeuZA5","SjskQlH1kt","VLTy629QAz","BpYhVAIYUu","M3zXL580YD","atef2jzUqR","J2mQiVerEA","Nxx9VazIWp","uJScXCK5W7",
+"FGzgpfLNg8","oVQp6tjQxs","lpF6Ws4786","AgJHQThjNn","7fKYUFnPFB","TCgPp8FmFH","8cVD35IhmG","ZUnqtG1RhS","sx5GlReKEW","nnP8ohSSvQ",
+"7Ow5CAXpwE","LewvMKASQ8","fLNg8e6e4z","FVMxopAhR1","1j5L8UlU3M","Y1mC0tjQxs","FnPFBQssNC","Q6hMC9rlg9","L7cGcfqypy","zFgtB1LB1L",
+"yEfy9SmGzv","gtCA5IjTwP","CxVEfuQIcz","0YAGHlm0pD","VBjhz4dEz6","J2mQiqUJMd","guMb8JkzUn","In3NSKZamH","fmIK1n8pJ9","lXFOBAIYUu",
+"W7cTs0Kyfs","Uvlv407n1c","2ZHdktaOXK","AgJHQciuWz","29QAzMmsIo","oQ87rzz4ZU","FGzgpuJScX","xciqp1v5hH","bgJAzCp3mZ","45cIHlXFOB",
+"gIYvE9rlg9","MK07YGWqqX","ECMvUSWfou","9iGoTHzZT8","QChxsCIShG","yvOMIAOgEe","C2IrcFwEJz","0Wr5yWmadA","GXdoHVNCPd","lweGytaOXK",
+"3otm6J2mQi","5drc6uZPqg","8U2nUuZPqg","LewvMKZamH","euZA50Wr5y","nFqikdmoS7","sqVrf55rfB","piJSk8hJdt","Uvlv49XyT9","LewvMuZPqg",
+"QssNC0BmCy","BpYhVAmdQd","djsrvNcICA","C2Irc8U2nU","Chuy3fLNg8","CqqaDpWiOs","QChxsTwano","TXQ0Zgf8rI","atef25iGN5","BpYhVRsQUq",
+"wDajXGv3Fq","5drc6mX2GE","2TRI79XyT9","1LB1LIBe8k","k85AeIKxdL","MmKGJpmeCd","POUYS618Di","FVMxojSjS3","Yh1hFuPX7G","2Yz7EMm8si",
+"Kr8ystvdkD","NcICAQChxs","0BmCyJIqXi","uZPqg9y4lw","pT8wux3LDe","zbIYYtAOsr","WaWsvUmaEv","gjUTuuupzk","MaJQs4QMc9","IKxdLyluBx",
+"BpYhVs93Ml","ciuWzcQOnv","14FLRguMb8","lCMxyTa8f6","hSSvQsx5Gl","7fKYUfcJOy","HzZT8h1zcH","Y1mC07X3uy","NhXduKZamH","MojnPDG4sT",
+"Z4I1vU3yw5","fFDrJKsjRK","ReKEWLewvM","QYxC0CK5W7","ciuWz9eoRc","e6e4z5IhmG","GrDg7J2mQi","DLhzMaDGtS","IBe8kRBhp0","LbRTHC2Irc",
+"7X3uy8U2nU","lweGy0h1b1","xReecGWqqX","NAFuwt59lR","BGaQYnlaBy","k85AeHlUbF","BFkb8L7cGc","Gv3Fq9eoRc","FnPFB5Namm","DcpWB4QMc9",
+"SbRYy9eoRc","tAOsre6e4z","lweGyZzJHW","VerEAAIYUu","jfREuOz8yZ","618DizmLYD","BFkb8WreyP","DG4sTECMvU","2TRI7Y1mC0","jtn0XECMvU",
+"Chuy35IhmG","FwEJzuvf7A","i3pydksJby","RzaZA580YD","prNT60YAGH","wiHrZ9GXkX","y94nwTXQ0Z","okgRi4W0Tl","i3pydMojnP","jtn0Xl83Ud",
+"BCxeCzz4ZU","FhtglBbwgA","QworubgJAz","xReecVIlwP","uPX7GfmIK1","Chuy3SmGzv","MojnPHlUbF","CNHmvPYBf4","CIShGU3yw5","RACujuLtKs",
+"Mkgy8Fhtgl","TwanoguMb8","VBjhzFwEJz","tvdkDB3qem","ZUnqtpT8wu","9y4lwSmGzv","o8UydDQimp","GrDg71j5L8","guMb8xReec","h1zcHFGzgp",
+"k85AeCK5W7","BGaQYzmLYD","zHF1qoGu6x","gjUTuSmGzv","ZuDtDHP433","lViBv24ARF","vkCHHlXFOB","QworuDz1R3","v2eC3Nxx9V","v8yFNpiJSk",
+"580YDB3qem","mX2GE0h1b1","tAOsraez9y","FFDuixciqp","CK5W7UlU3M","hSSvQ5Namm","5VZjSCqqaD","soy9tYjB9t","FVMxoRkQke","8U2nU0PktI",
+"HfyNQZJTXH","F6PT2lCMxy","x3LDe8FmFH","ZUnqtcmXIX","jSjS3x3LDe","5IhmGU3yw5","djsrvAgJHQ","1v5hHqaofN","kB5nP5Namm","KZamHksJby",
+"oGu6x2DREs","MmsIo5Namm","HRxd89iGoT","uoStwaez9y","LbRTHFnPFB","FcWrWJJs5m","5Mg9rGv3Fq","cQOnve6e4z","uN6r3aFFss","fqypyKASQ8",
+"CdyBVYw2oU","jtn0XqaofN","CIShGaDGtS","OUYuFCqqaD","SWfouix74r","uoStwe6e4z","lH1kta00b5","i7WMQReKEW","JRJQBTa8f6","ulk419iGoT",
+"fFDrJUvlv4","0MR5X3weIF","MojnP7Ow5C","yluBxjS1aj","SmGzv2DREs","1LB1LzFgtB","SjskQ8TxD7","0Kyfsx3LDe","GWqqX3otm6","YOfrYWreyP",
+"euZA5d85a9","aFFssWmadA","vOqCEGXdoH","Zv7z0yvOMI","C2IrcOUqFM","rhl0J5Mg9r","t98iW0Kyfs","aL6AJo8Uyd","BFkb8uAWyp","fFDrJ7lUXZ",
+"9y4lwM3zXL","soy9tYf2Ec","yofH3RmDcr","ThjNndmoS7","CK5W7sqVrf","0KyfsFGzgp","14FLRjSjS3","QYxC0bgJAz","y94nwFwEJz","uAWypdmoS7",
+"oQ87rHRxd8","v8yFNQChxs","7ku1p16lHc","ZzJHWx3LDe","ksJbyCNHmv","IRh48fcJOy","7fsYMC2Irc","gIYvE0Kyfs","guMb8ru4UG","VerEAgtCA5",
+"uoStw0MR5X","0Wr5yqaofN","PYBf4MaJQs","uN6r3nlaBy","7fsYML7cGc","k85Aeo8Uyd","gIYvEwiHrZ","fqypyRzaZA","ThjNnVLTy6","HP433FGzgp",
+"blLA9pAhR1","djsrvm4bxU","0KyfsJKWYR","AkKTkdmoS7","jS1ajOxWIH","vLsmSatef2","lm0pDzQt6Q","9iGoTBpYhV","5iGN5azIWp","FnPFBJRJQB",
+"DLhzMZhwG1","1v5hHtvdkD","uupzkKsjRK","0Wr5yxReec","S2DfuVjCZq","m4bxU4W0Tl","t98iWpAhR1","lXFOBTwano","OUqFMHRxd8","MmsIo5nmWv",
+"pT8wu5drc6","W7cTsRxrsm","7Ow5Cb29RJ","Mm8siXflUq","uPX7G2Nslm","Twano1LB1L","t98iWlweGy","uN6r3BpYhV","tjQxsYw2oU","WaWsvdpe1v",
+"1LB1L64s8N","GXdoHSbRYy","Ta8f6jSjS3","RkQkeuAWyp","m4bxUChuy3","In3NSFVMxo","soy9thE1Ql","tl72W8xEKz","I7p2auLtKs","suY4xpT8wu",
+"brhlQbgJAz","x3LDeAmdQd","bZLvSulk41","pFrrldmoS7","5ZaEzsx5Gl","gdQsSQssNC","sx5GlIBe8k","VBjhzVjCZq","xXTI4JkzUn","Kr8ysECMvU",
+"sx5GlpWiOs","7X3uyStlDJ","AXpwEK4GS8","FjHXRo8Uyd","QYxC07Ow5C","2ZHdkjeskS","7fKYUWDVWJ","MaJQslViBv","iqv4kWaim6","pv0i7kB5nP",
+"v1Hln5nmWv","8U2nUbrhlQ","jS1ajuupzk","x3LDek85Ae","9GXkXQssNC","tuDySRxrsm","FVMxouvf7A","ni2v1xciqp","FxX9qmz8gx","cL0aEs7Mxk",
+"0MR5XkB5nP","e6e4zUl4a1","Pb1pas7Mxk","4dEz6n8pJ9","CIShG0ao3l","3otm6lm0pD","GXdoHS77LH","VLTy6aFFss","0h1b1nnP8o","uZPqg8U2nU",
+"jfREuNxx9V","FnPFB2TRI7","hUTw7Yh1hF","7fsYMsuY4x","fcJOygtCA5","nlaByMm8si","MmsIoi7WMQ","n1pmO8xEKz","tvdkD3otm6","iwzGko8Uyd",
+"KASQ8uZPqg","pWiOsJXljW","B3qemXyPZN","RACujkB5nP","zbIYY5drc6","rz7UtzHF1q","WreyP8RCUA","fqypyEdBKc","WDVWJazIWp","NhXduAXpwE",
+"Nxx9VNAFuw","QWxoTRpBQm","VLTy6ru4UG","pmeCdReKEW","ZhwG1gtCA5","he9IAJkzUn","ksJbyRzaZA","yofH3NcICA","nlaByjS1aj","k85AeUmaEv",
+"No0Qb7ku1p","FFDuiK20wK","7lUXZ5ZaEz","NOHszaL6AJ","pv0i7KASQ8","YjB9tHzZT8","MojnPOUqFM","LDk6fuupzk","QWxoT8hJdt","EOE1o55rfB",
+"ulk41qQxHP","lkMUAuTacx","zbIYYRkQke","fFDrJqaofN","fFDrJ16lHc","cmXIXEOE1o","QssNCprNT6","faHir7ku1p","kZANmJJs5m","Chuy3CNHmv",
+"fcwDapiJSk","m4bxUKASQ8","uLtKstaOXK","24ARFCfgr3","BpYhVOUYuF","mX2GE7fsYM","AmdQdVjCZq","zY1GY07n1c","uAWypJRJQB","pvgjSkZANm",
+"suY4xtAOsr","gjUTu9GXkX","9rlg9bZLvS","OUYuFiqv4k","pvgjSW7cTs","SjskQfLNg8","dmoS7BbwgA","Mm8siK4GS8","2Nslm55rfB","RmDcrlj07Q",
+"7Ow5C7Ow5C","J2mQi9eoRc","DcpWB5IhmG","AgJHQi7WMQ","pAhR1n8pJ9","IjTwPKASQ8","e6e4zW3VFH","lm0pDDQimp","ECMvU0Kyfs","x3LDeSbRYy",
+"LDk6fcL0aE","pmeCdUl4a1","KASQ80Kyfs","FjHXRBbwgA","3weIFm4bxU","wiHrZMojnP","Zv7z0oVQp6","uoStwuN6r3","y94nwNOHsz","jS1ajCxVEf",
+"P6bcg7X3uy","FwEJz618Di","LDk6fQssNC","55rfBMezSW","5drc6QChxs","Yh1hFRBhp0","gIYvElsQGo","ZUnqtydG8U","uQIczulk41","Oz8yZW7cTs",
+"faHirCqqaD","K20wKFFDui","s4786t98iW","RzaZAzbIYY","7Ow5CFNYIM","NOHszFnPFB","9XyT9v1Hln","J2mQifLNg8","IjTwPJkzUn","IKxdLuN6r3",
+"lsQGoatef2","kZANmcL0aE","FcWrWuZPqg","7fsYMxXTI4","BFkb8FLsph","EdBKcGWqqX","580YD9GXkX","yofH3FLsph","Vprf2FVMxo","M6qcG7ku1p",
+"dQ586he9IA","2DREsIKxdL","zz4ZUQ6Lix","MojnPuupzk","IKxdLQClRL","LewvMuN6r3","0h1b1W3VFH","jeskSjSjS3","FFDuiNhXdu","prNT6lkMUA",
+"FhtglNAFuw","Q6Lixb29RJ","Yw2oU07n1c","G1RhSRzaZA","Q6LixzQt6Q","1v5hHaez9y","m4bxUHfyNQ","7hyVvQWxoT","aFFsslViBv","RzaZAKr8ys",
+"xReec0ao3l","FnPFBJkzUn","AkKTkqaofN","Waim6KZamH","IRh48QYxC0","X6Pin2TRI7","uTacxkZANm","HfyNQD6rBy","hE1QlcQOnv","ru4UGM6qcG",
+"1LB1LfaHir","45cIHpmeCd","F6PT2pmeCd","CqqaD4dEz6","RxrsmFhtgl","UlU3MOHaBz","RBhp00MR5X","Yw2oUQworu","lH1ktEdBKc","GXdoHPb1pa",
+"e6e4zmz8gx","FxX9q1v5hH","Mkgy8y94nw","fmIK17ku1p","LbRTHlCMxy","aez9yMm8si","GWqqXtlILt","jeskSuQIcz","suY4xbZLvS","2ZHdkgjUTu",
+"Oz8yZ1v5hH","Ul4a1KsjRK","Vprf2FwEJz","QworuiwzGk","nnP8onFqik","l83UdtuDyS","BbwgA9eoRc","m4bxUfcwDa","2TRI7WmadA","2NslmnFqik",
+"VLTy6B3qem","jeskSlsQGo","5ZaEzjSjS3","IKxdLguMb8","Cp3mZFGzgp","Cfgr3Fhtgl","gjUTuFLsph","618DimX2GE","prNT6Kr8ys","DQimp7X3uy",
+"v8yFN2TRI7","l83UdoQ87r","suY4xFGzgp","LewvMMezSW","7fKYUcL0aE","jfREux3LDe","M3zXLfFDrJ","4dEz6Mm8si","pv0i7RpBQm","YOfrYFLsph",
+"MojnPWreyP","VBjhz1v5hH","lj07QSmGzv","Y1mC0QbxXc","he9IAblLA9","hSSvQOz8yZ","CNHmvTwano","RBhp0Kr8ys","580YDDQimp","LDk6flkMUA",
+"kZANmW3VFH","Rxrsmx3LDe","xciqp2ZHdk","jSjS3lH1kt","s7MxkS2Dfu","CdyBVjSjS3","yluBxJ2mQi","uZPqgAOgEe","4dEz67fKYU","tl72WAkKTk",
+"I7p2aK20wK","VIlwPpvgjS","GWqqX7ku1p","kZANm4W0Tl","tl72WgdQsS","JJs5mBGaQY","iB08l0PktI","uLtKs5nmWv","rhl0JK20wK","ReKEWOUYuF",
+"5VZjSyofH3","qUJMd29QAz","cShY24dEz6","QWxoTtjQxs","0MR5Xn1pmO","W7cTsfLNg8","7lUXZiwzGk","3weIFDz1R3","BFkb8DLhzM","e6e4z14FLR",
+"D6rByuZPqg","SmGzvuupzk","uTacxQYxC0","qUJMdTXQ0Z","o8UydWMiS3","Y1mC0uTacx","ECMvURBhp0","Vprf2FNYIM","WPmlxQnJ1S","tuDySoVQp6",
+"5drc6xXTI4","Qworu9GXkX","suY4x8RCUA","lsQGo2hEEU","0MR5X0MR5X","ydG8Utl72W","M6qcGZJTXH","9GXkXaDGtS","TXQ0ZRpBQm","mz8gxBCxeC",
+"d85a9fcJOy","QnJ1SwDajX","bZLvSpmeCd","Ta8f6IRh48","2hEEUv2eC3","zqH0WAOgEe","EdBKcHRxd8","xReec5Drn0","9rlg9v1Hln","ReKEWLDk6f",
+"MGlTFrz7Ut","dhSuHYf2Ec","W3VFHQChxs","KASQ8EoToP","55rfBeuZA5","hSSvQ2ZHdk","3weIFBGaQY","MaJQssqVrf","ulk41DcpWB","1LB1L5Mg9r",
+"pFrrlpmeCd","JXljW5Drn0","BGaQYFGzgp","wDajXni2v1","RpBQmBFkb8","lCMxy7fsYM","FcWrWatef2","LbRTHv2eC3","d85a9AXpwE","Vprf2No0Qb",
+"CNHmv1v5hH","Ss0Zufqypy","M3zXL1v5hH","Chuy3k85Ae","TXQ0ZB3qem","M6qcGYjB9t","ciuWzuQIcz","14FLRI7p2a","kZANmvLsmS","uoStwv2eC3",
+"O3iyQ5IhmG","0h1b1qQxHP","zz4ZUKsjRK","ksJbylViBv","xReecZuDtD","GSQwj9iGoT","1j5L8FNYIM","JXljWni2v1","FGzgpJ2mQi","oGu6x5nmWv",
+"JIqXiEdBKc","pmeCdQClRL","F6PT2yToGW","No0QbEOE1o","0YAGHnlaBy","8FmFHlsQGo","ru4UG9GXkX","WPmlxNo0Qb","Y1mC0yToGW","MmKGJ9GXkX",
+"euZA5n1pmO","KASQ8X6Pin","tjQxsMojnP","SbRYy24ARF","cShY2QWxoT","djsrvDLhzM","4dEz6t98iW","9XyT93otm6","WreyPtuDyS","TXQ0ZZzJHW",
+"n8pJ9FPfSE","C2IrcRsQUq","qQxHPYf2Ec","2NslmpiJSk","v1HlnlkMUA","TwanoQChxs","7Ow5CFhtgl","Ul4a1AgJHQ","B3qem4W0Tl","blLA9WaWsv",
+"Pb1pa0MR5X","UmaEvAgJHQ","TXQ0ZzqH0W","AgJHQHfyNQ","ZhwG18FmFH","DLhzMMK07Y","WaWsvjeskS","wDajXqaofN","3weIFUlU3M","Zv7z0xciqp",
+"JkzUnfLNg8","580YD2ZHdk","nnP8oMmsIo","Cfgr30Kyfs","Q6LixyofH3","piJSkRzaZA","zQt6QVNCPd","Kr8ysJXljW","CxVEfQ6hMC","7X3uyv2eC3",
+"I7p2aOz8yZ","ru4UGgtCA5","2NslmQ6hMC","M3zXLMK07Y","l83Ud3weIF","1j5L8WreyP","Vprf2X6Pin","FhtglFwEJz","NOHszjfREu","hSSvQGrDg7",
+"WPmlxlCMxy","4W0TlRsQUq","UlU3MjS1aj","Q6Lixa00b5","48cHLVIlwP","B3qemVprf2","QClRL7X3uy","lm0pDh1zcH","7ku1pZUnqt","I7p2axXTI4",
+"ZhwG10MR5X","No0QbEdBKc","EOE1ocmXIX","JXljWDG4sT","lj07QAkKTk","yEfy9Chuy3","Waim6uJScX","CdyBVlweGy","0ao3l55rfB","faHirsqVrf",
+"JkzUnAmdQd","guMb8Yh1hF","JkzUnB3qem","uJScXI7p2a","nlaByzbIYY","yEfy9iqv4k","pAhR1RBhp0","Oz8yZh1zcH","2hEEUJkzUn","4dEz6WreyP",
+"29QAzM3zXL","VLTy6mz8gx","7hyVvhUTw7","5VZjSRBhp0","No0Qb5Mg9r","RsQUqMaJQs","h1zcHhSSvQ","jeskS3otm6","5IhmGKZamH","M6qcGsuY4x",
+"faHirSWfou","WmadApiJSk","e6e4zlXFOB","sx5Glt98iW","lweGyBbwgA","Oz8yZuvf7A","oVQp69y4lw","dpe1vdhSuH","uLtKs5IhmG","ZzJHWatef2",
+"nFqikZUnqt","aFFssJKWYR","hSSvQSWfou","POUYSS2Dfu","VerEANcICA","cmXIXBFkb8","7lUXZtjQxs","1j5L80PktI","t59lRv8yFN","8xEKzdjsrv",
+"7lUXZtlILt","guMb8lCMxy","MojnPFcWrW","JRJQBjiVBP","ZhwG1piJSk","qaofNK4GS8","v8yFNhi5X7","fmIK1nlaBy","faHirtAOsr","AgJHQTXQ0Z",
+"KZamHokgRi","fLNg8uAWyp","1v5hHnnP8o","5IhmGBbwgA","mX2GEjS1aj","S2Dfuuupzk","ni2v1JXljW","zFgtB5ZaEz","0Wr5yzY1GY","tvdkD0PktI",
+"RkQkeQnJ1S","e6e4zeuZA5","Yf2EclkMUA","9XyT98U2nU","lViBv0PktI","fLNg8vLsmS","24ARFatef2","lH1ktF6PT2","In3NSjeskS","CqqaD2ZHdk",
+"uTacxJkzUn","8hJdtAgJHQ","618Di7hyVv","WDVWJ1j5L8","dQ586t98iW","KsjRKIRh48","hSSvQpFrrl","FLsphVIlwP","I7p2aix74r","NhXdunnP8o",
+"2TRI7jSjS3","pWiOsQworu","RkQkennP8o","JKWYR8cVD3","CIShGFVMxo","7ku1pQWxoT","7hyVvoGu6x","ciuWzlweGy","fFDrJnlaBy","rhl0JAXpwE",
+"HfyNQRACuj","W3VFHLDk6f","VBjhzCK5W7","Q6hMCBCxeC","zqH0WfFDrJ","QChxs5Mg9r","rhl0Je6e4z","DLhzMfLNg8","Q6LixQnJ1S","BFkb8tjQxs",
+"BpYhVlViBv","oQ87r29QAz","7fKYUFNYIM","F6PT2QClRL","lXFOBX6Pin","d85a9a00b5","tlILtZhwG1","GSQwjjzUqR","ulk41nlaBy","8TxD7dmoS7",
+"lCMxydmoS7","AmdQd2Yz7E","RACujJkzUn","0Wr5y0PktI","FhtglcL0aE","M3zXL7X3uy","okgRiogLgc","zY1GY0Wr5y","hSSvQFhtgl","NhXdu0h1b1",
+"ru4UGMaJQs","fFDrJpv0i7","Rxrsmzz4ZU","dmoS7IjTwP","ZUnqt0PktI","VBjhz2ZHdk","L7cGcqUJMd","Yw2oUBpYhV","CdyBVaez9y","aDGtStvdkD",
+"1j5L8WDVWJ","DcpWBQChxs","pT8wun1pmO","No0QbAOgEe","hUTw7VNCPd","iB08ldpe1v","Mm8sifmIK1","gjUTugIYvE","P6bcgrKDLJ","yvOMInFqik",
+"2Yz7E3otm6","POUYSs93Ml","o8UydO3iyQ","QssNCjeskS","8FmFHCxVEf","5iGN5yToGW","JXljWtaOXK","AOgEeDG4sT","lm0pDFPfSE","mz8gxMGlTF",
+"zqH0WpAhR1","rKDLJtuDyS","suY4xPOUYS","BbwgAStlDJ","0ao3lGrDg7","QChxsKsjRK","hUTw7uN6r3","v2eC3QWxoT","5ZaEzsuY4x","DQimpbZLvS",
+"EOE1oReKEW","vkCHHLewvM","atef2h1zcH","y94nwMmKGJ","RmDcrd85a9","ix74rM6qcG","JIqXiblLA9","n8pJ9cShY2","VjCZqeuZA5","5drc6MojnP",
+"mX2GEJJs5m","MojnPdmoS7","h1zcHIRh48","uLtKsJIqXi","VerEAwiHrZ","v8yFNlj07Q","Mkgy8tl72W","FFDuiDcpWB","ix74rxReec","d85a97fsYM",
+"BbwgA2TRI7","2ZHdkpT8wu","8TxD7s4786","Pb1paFLsph","uLtKsuPX7G","RpBQmUmaEv","WmadAG1RhS","8RCUAyEfy9","3weIF5IhmG","GXdoHfaHir",
+"W3VFHlH1kt","StlDJL7cGc","zY1GYdhSuH","CqqaDy94nw","Vprf2JKWYR","hi5X7vOqCE","euZA5Nxx9V","Y1mC00YAGH","cmXIXaFFss","3weIFt59lR",
+"ZJTXHAOgEe","ru4UGBpYhV","6q6L9k85Ae","hYBCKhUTw7","8U2nUOz8yZ","gIYvEChuy3","2TRI7QWxoT","JKWYRfqypy","pWiOs0PktI","yEfy9IKxdL",
+"WDVWJyEfy9","rKDLJBFkb8","6AFT0EOE1o","AmdQd7fKYU","dhSuH5nmWv","48cHLyvOMI","0MR5XfFDrJ","3weIFRBhp0","okgRitvdkD","lj07QS2Dfu",
+"29QAzogLgc","0Wr5yoQ87r","GSQwjix74r","7Ow5CPb1pa","RpBQmQClRL","zHF1qx3LDe","tuDySDz1R3","G1RhSYf2Ec","hYBCKkB5nP","FNYIMiwzGk",
+"K4GS8brhlQ","3otm6ReKEW","ix74r8FmFH","O3iyQpvgjS","Qworuix74r","618Di5Namm","pvgjSyToGW","ni2v1EoToP","DcpWBs7Mxk","v2eC3ZUnqt",
+"uQIczXflUq","suY4xzbIYY","P6bcgjiVBP","uupzkjfREu","Gv3FqZuDtD","yluBxWmadA","Q6hMCvLsmS","dQ586PYBf4","MmsIojfREu","e6e4z5VZjS",
+"i3pydx3LDe","ThjNniKqhr","0Wr5yksJby","3otm6t98iW","bZLvSlm0pD","2TRI7oGu6x","sx5GlkZANm","ThjNnd85a9","9iGoTW3VFH","yofH3AmdQd",
+"No0QbgjUTu","0BmCy0MR5X","0YAGHlj07Q","lViBv0Kyfs","C2IrcVLTy6","D6rByn1pmO","FFDuiG1RhS","qaofNOz8yZ","iKqhr64s8N","Cfgr30h1b1",
+"qUJMdQssNC","dmoS7MmKGJ","WaWsvFGzgp","FPfSEhYBCK","ydG8UQnJ1S","zY1GY8cVD3","xReecHP433","rKDLJECMvU","o8UydFcWrW","vLsmSguMb8",
+"Vprf2aFFss","AXpwEjzUqR","SWfouni2v1","CK5W7CxVEf","RkQkehSSvQ","sx5GlRzaZA","ZUnqtEOE1o","9y4lwogLgc","mz8gxlj07Q","UmaEv4QMc9",
+"ZuDtDzFgtB","tl72WDG4sT","hYBCKhSSvQ","KASQ8ogLgc","7fsYMIBe8k","4QMc9jiVBP","FcWrWtlILt","0KyfsRBhp0","O3iyQJ2mQi","48cHLQWxoT",
+"POUYS2Yz7E","Mkgy829QAz","5ZaEzCdyBV","0MR5Xs7Mxk","NOHszYh1hF","8U2nUjeskS","Oz8yZlH1kt","a00b5uTacx","48cHLxciqp","Mm8siKZamH",
+"oVQp6zQt6Q","m4bxUzz4ZU","ogLgczQt6Q","gtCA5580YD","5ZaEzjS1aj","jtn0XyluBx","y94nwni2v1","5iGN5Q6hMC","Q6hMCZzJHW","iB08lStlDJ",
+"KASQ8No0Qb","yToGWRACuj","jtn0Xlm0pD","nFqikC2Irc","s93MlHRxd8","k85AefaHir","9eoRcv2eC3","QworuokgRi","Z4I1v580YD","In3NSfFDrJ",
+"FLsphWPmlx","he9IACdyBV","x3LDeogLgc","d85a9KZamH","QnJ1Sn1pmO","Cfgr3580YD","618Dii3pyd","h1zcH0YAGH","t59lRVjCZq","zFgtBd7vjM",
+"uZPqgb29RJ","t98iWNAFuw","5Mg9r4dEz6","U3yw5oGu6x","kZANmRACuj","Ul4a1nFqik","d85a9ydG8U","5nmWvKr8ys","iwzGk580YD","CdyBVNo0Qb",
+"0h1b12Yz7E","5IhmGMmsIo","9GXkXQWxoT","K20wKl83Ud","dhSuHY1mC0","yofH3M3zXL","xciqpK4GS8","pAhR1MmsIo","m4bxU9eoRc","EoToPlXFOB",
+"AIYUuuoStw","WmadASs0Zu","FFDuii3pyd","QssNCECMvU","Oz8yZs4786","lsQGopT8wu","RzaZA9iGoT","s7MxkRACuj","GSQwjd85a9","v1Hlnaez9y",
+"yvOMIU3yw5","pv0i7QChxs","suY4xFxX9q","RkQkeVIlwP","CdyBVxXTI4","ydG8U55rfB","v8yFNHRxd8","Cp3mZWmadA","hSSvQIjTwP","StlDJ4W0Tl",
+"iwzGk29QAz","e6e4zQbxXc","vkCHHQnJ1S","24ARF4QMc9","tjQxsMkgy8","s7MxkQChxs","8xEKz5Mg9r","8TxD7ulk41","FLsph5VZjS","zz4ZU9GXkX",
+"VIlwPWaim6","JKWYRsoy9t","BbwgAMkgy8","blLA9tl72W","Z4I1vazIWp","J2mQiuLtKs","JkzUnv1Hln","5Nammpv0i7","C2IrcbrhlQ","JJs5mcL0aE",
+"he9IAtvdkD","UmaEvhYBCK","5IhmGVprf2","taOXKPYBf4","MojnPYh1hF","xReecK4GS8","brhlQYh1hF","rz7UtuoStw","ru4UGFGzgp","HRxd8FxX9q",
+"7lUXZOUqFM","qUJMdCp3mZ","5nmWvjeskS","16lHcChuy3","uQIczix74r","ksJby7ku1p","RsQUqni2v1","JKWYRB3qem","qaofNhUTw7","QClRL14FLR",
+"IKxdLtaOXK","uoStw5IhmG","aL6AJCp3mZ","5Mg9rFPfSE","TwanoGXdoH","5drc65Drn0","wiHrZd7vjM","nFqikDz1R3","BpYhVJJs5m","BGaQYs93Ml",
+"CK5W7t59lR","xciqps7Mxk","CqqaDb29RJ","Chuy3Pb1pa","RsQUqBCxeC","WMiS3tuDyS","RsQUqlj07Q","9GXkXzbIYY","5iGN5Yh1hF","KZamHaL6AJ",
+"ECMvUaez9y","guMb8gjUTu","Cp3mZaL6AJ","7fsYMiqv4k","HP433CIShG","2Yz7EQworu","s93MlRsQUq","Pb1pa2hEEU","v2eC3C2Irc","BpYhVsoy9t",
+"a00b5pFrrl","ru4UGFxX9q","BpYhV9XyT9","gf8rIiKqhr","7lUXZGSQwj","fcwDaYh1hF","ni2v10MR5X","pmeCdfcwDa","ksJbyTa8f6","5VZjSgf8rI",
+"CNHmvksJby","BpYhVZv7z0","Cp3mZogLgc","Ul4a1MGlTF","O3iyQStlDJ","ix74rtjQxs","jSjS3Pb1pa","lViBva00b5","D6rBy2Nslm","ulk41ZuDtD",
+"vLsmSK20wK","uupzksx5Gl","zmLYDlj07Q","9eoRcNo0Qb","FnPFB7fKYU","Waim6Fhtgl","taOXKlViBv","qaofNEdBKc","SjskQIn3NS","iqv4kBFkb8",
+"s4786wDajX","pAhR1n1pmO","azIWpMmsIo","C2IrcS2Dfu","hUTw7Pb1pa","t98iWRpBQm","Yw2oUzQt6Q","uQIcz2Yz7E","0PktIF6PT2","dhSuH45cIH",
+"9eoRcrhl0J","h1zcHnlaBy","8U2nUWaim6","FLsphOHaBz","QssNCQnJ1S","n8pJ9D6rBy","faHirsx5Gl","5ZaEzMmKGJ","2TRI7HP433","Ul4a1vLsmS",
+"rz7UtzFgtB","prNT6o8Uyd","lweGybrhlQ","Waim6M6qcG","MmsIoM3zXL","AmdQdUlU3M","CK5W70BmCy","Gv3FqyvOMI","uQIczogLgc","RpBQmOHaBz",
+"taOXKn8pJ9","ThjNnCIShG","AOgEeWreyP","FcWrWZzJHW","8FmFHdhSuH","m4bxUmz8gx","S2DfuZuDtD","iKqhrCqqaD","UmaEvC2Irc","3weIFYOfrY",
+"DG4sTpWiOs","Cp3mZjSjS3","MGlTF0Kyfs","jiVBPd85a9","IBe8kRpBQm","dhSuHVjCZq","yvOMIC2Irc","SjskQ5iGN5","4dEz6ix74r","K4GS8qaofN",
+"fmIK1RpBQm","uJScXZv7z0","0BmCyAOgEe","JRJQBni2v1","CxVEfiKqhr","rKDLJMezSW","GWqqXRxrsm","JIqXiM6qcG","Yw2oUuPX7G","gtCA50h1b1",
+"qaofNM3zXL","t98iWSbRYy","LbRTHTwano","nFqikYOfrY","Ss0ZupmeCd","jtn0Xy94nw","NhXduZ4I1v","aDGtSOxWIH","DG4sTFxX9q","jeskSC2Irc",
+"ZUnqtdpe1v","8U2nUYw2oU","6q6L92Yz7E","oGu6xcQOnv","3weIFokgRi","XflUq2DREs","BGaQYrz7Ut","4QMc9gdQsS","9y4lwlm0pD","G1RhSTa8f6",
+"gtCA5EOE1o","HlUbFuPX7G","OUYuFxReec","14FLRQYxC0","oQ87r0PktI","x3LDeCqqaD","pvgjSjtn0X","JkzUn9iGoT","dpe1vlpF6W","X6PinChuy3",
+"Dz1R3Dz1R3","0Kyfst59lR","vkCHHiKqhr","I7p2aJkzUn","yEfy98TxD7","CqqaDyEfy9","Yf2Ec48cHL","mX2GEi3pyd","B3qemdQ586","bZLvS6AFT0",
+"a00b5yluBx","2hEEUWDVWJ","StlDJ6q6L9","VNCPdjtn0X","i7WMQFnPFB","SjskQOz8yZ","okgRiFcWrW","IRh48tvdkD","OUqFM0Wr5y","uAWyplViBv",
+"RACuj7lUXZ","Cfgr3uLtKs","XflUqNxx9V","brhlQAOgEe","NAFuwyToGW","ix74rpT8wu","7fKYUdhSuH","8cVD3uLtKs","faHirOUYuF","ni2v1o8Uyd",
+"Q6LixOUqFM","rKDLJatef2","MGlTFMaJQs","Chuy3oQ87r","ThjNnCqqaD","mX2GEpFrrl","JKWYRIKxdL","8TxD7Yh1hF","AXpwElCMxy","29QAzs4786",
+"xciqpI7p2a","fcwDaI7p2a","uupzkYjB9t","uPX7GGWqqX","8U2nUKsjRK","IRh48JKWYR","5IhmGStlDJ","fcJOy7fsYM","vLsmSyluBx","16lHcNo0Qb",
+"FVMxoECMvU","gf8rIDQimp","RACujb29RJ","lpF6WCqqaD","wDajXVBjhz","O3iyQgjUTu","SbRYyJ2mQi","NAFuwuPX7G","DG4sTpvgjS","uLtKsksJby",
+"9rlg9VjCZq","J2mQiNcICA","yluBxiqv4k","uZPqg2hEEU","9rlg9VBjhz","Pb1paEoToP","VNCPd8FmFH","UmaEvVNCPd","yEfy9hYBCK","4dEz6n1pmO",
+"8U2nU16lHc","IKxdLQbxXc","kB5nPOUqFM","fcJOyWmadA","kZANmb29RJ","Yh1hFPb1pa","hUTw7HfyNQ","StlDJ16lHc","lXFOBU3yw5","RACujnFqik",
+"XflUqWPmlx","FVMxojtn0X","0Wr5yuvf7A","JKWYR8xEKz","VNCPdo8Uyd","cL0aEoGu6x","pFrrlD6rBy","VIlwPG1RhS","dhSuHC2Irc","jeskSMK07Y",
+"AIYUu45cIH","3otm6X6Pin","BGaQY9iGoT","cQOnvvkCHH","4QMc9Chuy3","lCMxysx5Gl","Nxx9V2Yz7E","AIYUuqUJMd","fcwDaVIlwP","45cIHmX2GE",
+"ni2v1Oz8yZ","guMb8ksJby","iqv4kkB5nP","piJSkEoToP","CdyBVK4GS8","QChxsrhl0J","JRJQBS2Dfu","Uvlv47ku1p","Uvlv4WDVWJ","piJSkWaWsv",
+"bgJAzKr8ys","zbIYYuN6r3","POUYSuupzk","RsQUqMojnP","AXpwEMmsIo","SWfouGXdoH","FwEJzyEfy9","8hJdtqUJMd","ciuWzIBe8k","7fsYMBFkb8",
+"blLA9VerEA","nlaByQWxoT","yToGWWaim6","e6e4znnP8o","4dEz6MmsIo","5VZjSBCxeC","hYBCKMmKGJ","ciuWz0Wr5y","uvf7AkB5nP","xReec1LB1L",
+"IKxdLgjUTu","lm0pDI7p2a","WMiS314FLR","uoStwTXQ0Z","JkzUn3otm6","Ta8f6WreyP","EOE1olH1kt","tuDySxciqp","RACujGSQwj","48cHL9XyT9",
+"FhtglQnJ1S","qQxHPFPfSE","x3LDeMkgy8","pT8wu8RCUA","Yh1hFd7vjM","OUqFM0PktI","2hEEURkQke","OUqFM14FLR","AmdQdSWfou","yToGWrz7Ut",
+"RkQkeuvf7A","wDajXWreyP","bZLvSNo0Qb","x3LDelsQGo","Oz8yZY1mC0","WPmlxdmoS7","xciqpQbxXc","lweGyEdBKc","wDajXs7Mxk","s7Mxk2TRI7",
+"vLsmSDz1R3","zqH0WBpYhV","zQt6QJJs5m","pAhR1ulk41","gdQsSBpYhV","Y1mC0blLA9","hUTw7JIqXi","7Ow5CvLsmS","cShY22Yz7E","MmsIoVIlwP",
+"ni2v1a00b5","S77LHcShY2","rKDLJzHF1q","xXTI4WPmlx","brhlQ580YD","qaofNHzZT8","RBhp0RpBQm","5drc6lViBv","tlILtD6rBy","9eoRca00b5",
+"sqVrfECMvU","RzaZAuN6r3","JXljWzHF1q","BbwgA7ku1p","gjUTuCqqaD","hYBCK2hEEU","BbwgAhE1Ql","W3VFHTCgPp","hi5X7lweGy","8FmFHIRh48",
+"Dz1R3hi5X7","k85AejeskS","lkMUAKr8ys","0PktIjtn0X","7X3uyfLNg8","jS1ajv2eC3","i7WMQRxrsm","9iGoTTCgPp","qUJMdbgJAz","7ku1pFPfSE",
+"mz8gx4W0Tl","dhSuHni2v1","NhXdulH1kt","K4GS8tuDyS","FcWrWEOE1o","uAWypsx5Gl","kB5nPk85Ae","h1zcHQClRL","tjQxsMezSW","zqH0WnlaBy",
+"d7vjMdhSuH","45cIHCIShG","uQIcz14FLR","wDajXFLsph","AIYUuSmGzv","7lUXZyofH3","Ta8f6Mm8si","lViBvC2Irc","ydG8UTXQ0Z","mX2GE5Namm",
+"YjB9tEdBKc","Gv3FqyluBx","JJs5mtuDyS","O3iyQkZANm","64s8NQYxC0","BGaQYcShY2","uQIczWMiS3","Mkgy8LDk6f","pAhR1pmeCd","BpYhVlweGy",
+"5VZjSZJTXH","h1zcHLDk6f","FNYIMuLtKs","s7MxkSbRYy","uJScXuoStw","pmeCdRACuj","55rfBgIYvE","WPmlxVLTy6","brhlQQChxs","Mkgy8Yw2oU",
+"F6PT2L7cGc","tuDyS2DREs","Ta8f6nnP8o","JJs5mX6Pin","2NslmjS1aj","qaofN4dEz6","yofH3b29RJ","v2eC3Cp3mZ","m4bxUhE1Ql","atef2K20wK",
+"7hyVvQbxXc","uJScXFjHXR","OUqFMCqqaD","oGu6xnnP8o","8U2nUFhtgl","7ku1pzFgtB","QbxXcVLTy6","2Nslmm4bxU","iwzGkO3iyQ","Ss0Zu0Wr5y",
+"gIYvElpF6W","Cp3mZQssNC","QnJ1SVBjhz","wiHrZzz4ZU","Mkgy8cShY2","FFDuiQ6Lix","Waim6S77LH","5IhmGSbRYy","2Yz7Eix74r","Yw2oUfqypy",
+"qaofNhi5X7","RmDcrpmeCd","3otm6pFrrl","AOgEejtn0X","7hyVv0YAGH","lsQGoni2v1","24ARFLbRTH","8U2nU0Wr5y","nnP8ozHF1q","lj07Q5iGN5",
+"GWqqXGv3Fq","SWfouCNHmv","NhXduqaofN","jeskSzFgtB","Kr8ys8hJdt","0ao3lfcwDa","rKDLJokgRi","n8pJ9W7cTs","yofH3iqv4k","Q6LixRBhp0",
+"hi5X7ZhwG1","zz4ZUhSSvQ","lpF6WOHaBz","lj07Q29QAz","gjUTu0Wr5y","580YDChuy3","aL6AJv2eC3","iwzGkzHF1q","t98iW64s8N","iB08llViBv",
+"HzZT8HzZT8","0ao3l48cHL","Mm8si9GXkX","VLTy67X3uy","PYBf4EoToP","RBhp0WPmlx","XyPZN8U2nU","d7vjMZzJHW","5drc6jSjS3","Ta8f6rhl0J",
+"8xEKzd85a9","pv0i7F6PT2","uAWypJ2mQi","K4GS8uTacx","FjHXRZzJHW","kB5nPjzUqR","y94nwuQIcz","jtn0XlXFOB","rKDLJHfyNQ","VerEAyvOMI",
+"soy9tM3zXL","HfyNQQChxs","M3zXL4W0Tl","LDk6f2DREs","SjskQfFDrJ","0KyfsKsjRK","v1Hln8xEKz","45cIHWaim6","RzaZAfcJOy","ogLgceuZA5",
+"vkCHH07n1c","KASQ8uAWyp","S77LHgtCA5","zmLYDv8yFN","fcwDaeuZA5","VBjhzzbIYY","hUTw7WMiS3","FhtglCK5W7","Vprf29rlg9","tuDySvkCHH",
+"Yw2oUX6Pin","POUYSY1mC0","n1pmONcICA","Cp3mZ8U2nU","48cHLd7vjM","8TxD7Mkgy8","dQ586HRxd8","tvdkDX6Pin","x3LDegtCA5","Mm8siiKqhr",
+"WDVWJThjNn","ReKEWC2Irc","9y4lwv1Hln","ReKEWdpe1v","POUYSIRh48","DQimpUl4a1","guMb8piJSk","GXdoHqUJMd","cL0aEtuDyS","24ARFlsQGo",
+"prNT6QChxs","JIqXi7fKYU","Vprf2ksJby","v2eC3ogLgc","L7cGc24ARF","fmIK1BbwgA","8RCUA1LB1L","YOfrYfmIK1","uvf7A7fsYM","2hEEUe6e4z",
+"Kr8ysv1Hln","MmsIoSjskQ","t98iWVprf2","cL0aEMGlTF","AmdQdQbxXc","Q6LixGv3Fq","fcwDa7hyVv","fcwDahSSvQ","J2mQiCfgr3","0PktI4W0Tl",
+"NhXduTa8f6","MmKGJAOgEe","VLTy6M3zXL","lCMxym4bxU","VNCPdP6bcg","hSSvQgdQsS","0ao3lDQimp","wiHrZ8hJdt","JIqXiqQxHP","Cfgr3GrDg7",
+"580YDBFkb8","ksJbyReKEW","C2Irczz4ZU","9rlg9dpe1v","9iGoTPYBf4","s7Mxkv1Hln","jeskSEOE1o","14FLRpAhR1","hE1QlYjB9t","UmaEvMmKGJ",
+"8FmFH9eoRc","FVMxoguMb8","euZA5t59lR","tl72W24ARF","he9IAjfREu","8xEKzGWqqX","EdBKck85Ae","tAOsrQ6Lix","O3iyQnnP8o","SjskQBbwgA",
+"lViBvMojnP","uvf7AzQt6Q","IRh48hSSvQ","AmdQdBbwgA","Uvlv48FmFH","RBhp0zHF1q","jtn0XzY1GY","BFkb8IBe8k","gtCA5WMiS3","VLTy6he9IA",
+"SjskQxReec","5drc6uPX7G","HlUbFQClRL","NAFuwI7p2a","8xEKztaOXK","zqH0WzFgtB","0ao3l24ARF","BFkb8Q6Lix","BFkb8RBhp0","jtn0XCqqaD",
+"RBhp0RmDcr","uPX7GnnP8o","SmGzv7fsYM","i3pydI7p2a","yluBxhSSvQ","o8UydC2Irc","5ZaEzBFkb8","aFFssWreyP","lXFOBk85Ae","0PktISWfou",
+"NAFuwnFqik","zQt6Qni2v1","CK5W7xReec","GWqqX45cIH","JRJQBYw2oU","Chuy3MmKGJ","fFDrJhUTw7","9y4lwFwEJz","taOXKzz4ZU","DQimpNAFuw",
+"brhlQAXpwE","JIqXi48cHL","6q6L9Z4I1v","RzaZA16lHc","HP433QYxC0","uQIcz4QMc9","QbxXcU3yw5","lpF6W2DREs","OUYuFJXljW","Ss0ZusqVrf",
+"29QAzprNT6","s93MlcShY2","CIShGB3qem","d7vjMUlU3M","NAFuwx3LDe","16lHcfcJOy","CK5W7xXTI4","BpYhVatef2","MK07Y580YD","FNYIMVprf2",
+"QClRLYf2Ec","8TxD7o8Uyd","5Mg9r55rfB","yEfy9xReec","ogLgcQnJ1S","atef2xciqp","cmXIXsoy9t","n8pJ9AIYUu","FwEJztaOXK","64s8N55rfB",
+"VLTy6faHir","7Ow5CHfyNQ","xReecfcwDa","o8UydfmIK1","zbIYY7ku1p","yEfy9mz8gx","dmoS7GWqqX","RpBQm9GXkX","MmsIodpe1v","G1RhSuQIcz",
+"h1zcHKASQ8","IBe8kSmGzv","jtn0XLewvM","CqqaDQYxC0","FVMxoqUJMd","U3yw5HRxd8","W7cTsydG8U","YjB9tThjNn","n1pmOOUYuF","oQ87rNAFuw",
+"L7cGc1LB1L","FwEJz1j5L8","SbRYyzz4ZU","oQ87rGXdoH","d85a9v2eC3","7lUXZh1zcH","FwEJzlCMxy","Yw2oUguMb8","QssNCiqv4k","QssNCOUYuF",
+"2hEEUqUJMd","EoToPtAOsr","55rfB29QAz","uZPqgDG4sT","FFDuiv8yFN","cmXIXIn3NS","0KyfsI7p2a","D6rByStlDJ","ZhwG1RmDcr","7X3uy48cHL",
+"4W0TlRmDcr","uupzkvOqCE","gtCA5GrDg7","FxX9qFwEJz","K20wKoVQp6","7fKYUNxx9V","Cfgr3DG4sT","TwanogIYvE","vOqCEcL0aE","IjTwPgIYvE",
+"AmdQdOxWIH","l83Ud8cVD3","d85a9zFgtB","fmIK1dpe1v","BCxeCTCgPp","0KyfsJ2mQi","uPX7G4dEz6","ni2v1KsjRK","ZUnqtmz8gx","C2IrcBCxeC",
+"6AFT048cHL","tlILtjSjS3","qaofNLewvM","5IhmGokgRi","0BmCyQ6Lix","HRxd8Y1mC0","QWxoTM3zXL","tvdkDru4UG","Zv7z07hyVv","KZamHWPmlx",
+"jS1ajDz1R3","FxX9q8RCUA","4dEz6atef2","cQOnvD6rBy","CxVEfuAWyp","JKWYR5nmWv","tuDySMmsIo","No0Qb07n1c","yEfy9OUqFM","CdyBVtuDyS",
+"uupzkUvlv4","2Nslmru4UG","okgRiaez9y","Uvlv4e6e4z","HzZT8M3zXL","OHaBzaL6AJ","gtCA5uLtKs","DcpWB2Nslm","5ZaEzUl4a1","Y1mC05iGN5",
+"zQt6QS2Dfu","FnPFBSs0Zu","NOHszKASQ8","9eoRcsx5Gl","Ul4a1J2mQi","3otm6vOqCE","yToGWdhSuH","zmLYDlsQGo","dmoS7QWxoT","K4GS8zFgtB",
+"yEfy9taOXK","iKqhrM6qcG","5Mg9rPb1pa","qUJMd4W0Tl","POUYSqUJMd","lm0pD16lHc","jtn0XOxWIH","24ARFQworu","9GXkX5Drn0","s47868hJdt",
+"HRxd8tlILt","UmaEv0BmCy","2ZHdkNxx9V","DQimpjiVBP","2Nslm5nmWv","jfREu0h1b1","No0Qbl83Ud","lweGyokgRi","pv0i7FPfSE","QworuuJScX",
+"S77LH7ku1p","dmoS7ciuWz","ZuDtDQYxC0","vLsmSJIqXi","hE1Qlo8Uyd","BCxeCQbxXc","QChxs2ZHdk","fqypyXflUq","Yh1hFCqqaD","FcWrWJXljW",
+"vOqCEFPfSE","CNHmvW7cTs","FGzgp580YD","TXQ0ZzHF1q","Mm8sim4bxU","EOE1oSbRYy","azIWpK4GS8","VerEAlsQGo","DQimpazIWp","0Wr5yzQt6Q",
+"Waim6uoStw","oVQp6WDVWJ","MmKGJFwEJz","v1HlnHlUbF","QworuFcWrW","P6bcg55rfB","HRxd8O3iyQ","uoStw2Yz7E","X6PinGWqqX","zqH0WqUJMd",
+"0Kyfsb29RJ","OHaBzazIWp","8FmFHFwEJz","gdQsS7lUXZ","X6PinyvOMI","07n1cUl4a1","NAFuwX6Pin","MGlTFtl72W","HfyNQZzJHW","mz8gxyvOMI",
+"yofH36AFT0","taOXKY1mC0","faHirFFDui","ydG8UvOqCE","XflUquLtKs","QChxsAkKTk","suY4xguMb8","hUTw745cIH","0Wr5yMezSW","QYxC0NhXdu",
+"jSjS3d85a9","ZJTXH14FLR","OxWIHdmoS7","2NslmrKDLJ","K4GS8Pb1pa","UlU3Mzz4ZU","BpYhVjiVBP","wDajXF6PT2","tAOsrfLNg8","9y4lwpvgjS",
+"brhlQCNHmv","zY1GYi7WMQ","5ZaEzMezSW","0YAGH2ZHdk","yvOMIk85Ae","QssNCzFgtB","HRxd8JKWYR","IKxdLoGu6x","tvdkD580YD","FFDuiBGaQY",
+"wiHrZs4786","GrDg7WreyP","48cHLRxrsm","xXTI4taOXK","lweGynlaBy","gdQsS3otm6","F6PT2faHir","YjB9tUmaEv","fcJOyVIlwP","J2mQi0YAGH",
+"piJSkDQimp","xciqpgjUTu","YjB9tBpYhV","EoToPAOgEe","9rlg9cQOnv","VBjhz5IhmG","AkKTk2hEEU","SWfoufqypy","x3LDebrhlQ","J2mQi5iGN5",
+"AkKTk9eoRc","0YAGHvLsmS","lpF6WAkKTk","l83UdZJTXH","pFrrl16lHc","BFkb8LbRTH","8TxD7JIqXi","64s8NpT8wu","IRh48ZUnqt","pWiOsCIShG",
+"D6rByTwano","zHF1q7hyVv","SWfouStlDJ","P6bcgqQxHP","wDajXogLgc","VerEAcQOnv","HP433TCgPp","WPmlxOHaBz","7Ow5CStlDJ","No0QbbgJAz",
+"pAhR1Pb1pa","CqqaDjzUqR","rhl0Jpv0i7","cmXIXRxrsm","uvf7As4786","zQt6QzqH0W","WmadAZ4I1v","FLsphrKDLJ","AkKTkgtCA5","CK5W755rfB",
+"LDk6fNhXdu","n1pmOB3qem","IjTwPkZANm","ZzJHW8cVD3","zFgtBFjHXR","jeskSa00b5","L7cGcSbRYy","NcICA3weIF","pT8wuRBhp0","xciqpGWqqX",
+"oGu6xjS1aj","5iGN524ARF","TCgPpVIlwP","DLhzMk85Ae","uN6r3t98iW","XflUqYjB9t","piJSkWreyP","FNYIMNo0Qb","3otm6Zv7z0","W3VFHl83Ud",
+"4QMc9EoToP","qQxHPX6Pin","jiVBPBGaQY","zqH0WI7p2a","UmaEvm4bxU","9rlg9qUJMd","3weIFKr8ys","l83UdcmXIX","i7WMQcL0aE","9iGoTcQOnv",
+"CxVEfTCgPp","cShY2rKDLJ","JXljWBCxeC","VjCZq4dEz6","POUYSJRJQB","OxWIHQ6hMC","pvgjSEoToP","EdBKcZuDtD","LbRTHn1pmO","GSQwjaL6AJ",
+"djsrv8RCUA","ZzJHWZv7z0","k85Ae48cHL","07n1cFnPFB","v1HlnbgJAz","16lHcb29RJ","9y4lwoGu6x","yEfy9jfREu","4dEz6uoStw","7hyVvs93Ml",
+"FLsphbrhlQ","xReect98iW","6q6L9RsQUq","Twanos93Ml","8TxD7IjTwP","MmsIopT8wu","XflUqPYBf4","jeskSnnP8o","wiHrZMezSW","jS1ajfLNg8",
+"6AFT02Nslm","4QMc9l83Ud","kZANmiqv4k","HfyNQ7hyVv","C2IrcO3iyQ","3otm6i3pyd","FNYIMciuWz","mX2GECp3mZ","fLNg8prNT6","ni2v1Nxx9V",
+"TCgPpzmLYD","2TRI7Ta8f6","QClRLjfREu","aL6AJkZANm","zHF1qciuWz","5drc6nFqik","yEfy9HRxd8","s4786i3pyd","LewvMThjNn","ZuDtDv1Hln",
+"QYxC0pWiOs","zHF1qQ6Lix","lkMUAzHF1q","uupzk580YD","uoStwMGlTF","QYxC0JXljW","pWiOs3otm6","1LB1Lrz7Ut","5iGN5BCxeC","0KyfsyEfy9",
+"0KyfsBbwgA","AmdQduJScX","B3qemZhwG1","580YDOHaBz","yluBxDQimp","cQOnvOHaBz","IjTwPlCMxy","KASQ8SWfou","aez9yRmDcr","OUYuFOUYuF",
+"NcICADcpWB","tuDySv1Hln","zHF1qFcWrW","5nmWvQWxoT","atef2qUJMd","JJs5m9GXkX","CIShGWaWsv","C2Ircn1pmO","WreyP618Di","9eoRche9IA",
+"wiHrZvLsmS","2hEEU7lUXZ","suY4xDLhzM","vOqCE7fKYU","qaofNiB08l","jS1ajblLA9","ReKEWKZamH","SmGzvMmsIo","vkCHHRkQke","JIqXiIKxdL",
+"LewvMuJScX","n8pJ9RBhp0","9iGoTAXpwE","POUYSW3VFH","s7Mxksx5Gl","6q6L9bZLvS","64s8Nru4UG","uQIczfaHir","fcJOyZuDtD","atef2Dz1R3",
+"dhSuHwiHrZ","Oz8yZWDVWJ","0YAGHlweGy","Yf2EchYBCK","CxVEfFFDui","k85AeI7p2a","8hJdtHzZT8","Ul4a1NhXdu","atef2AkKTk","aez9yqQxHP",
+"Dz1R3ZUnqt","4dEz6G1RhS","SbRYyiwzGk","1j5L8tlILt","9eoRcFhtgl","2hEEUTa8f6","ulk41HzZT8","zz4ZUX6Pin","ZzJHWsuY4x","5nmWv0MR5X",
+"GXdoHs93Ml","JRJQBhE1Ql","FwEJzFwEJz","AgJHQ29QAz","Gv3FqWaWsv","aL6AJMojnP","fLNg8Cfgr3","JIqXiFPfSE","uoStwrKDLJ","0MR5XIjTwP",
+"0MR5XzHF1q","W3VFHFLsph","s7MxkaDGtS","pFrrlni2v1","o8UydZhwG1","GXdoHLbRTH","fLNg8JkzUn","i3pydCdyBV","5NammcmXIX","FGzgpDcpWB",
+"MaJQsJXljW","uvf7AK4GS8","8TxD7OUqFM","jSjS3ulk41","FnPFBpFrrl","7X3uyMmKGJ","C2IrclweGy","WMiS3kB5nP","soy9tS2Dfu","gf8rIVLTy6",
+"jSjS3i3pyd","blLA9SWfou","rz7UtMojnP","HlUbF45cIH","Dz1R3QWxoT","yvOMIzY1GY","lpF6WAOgEe","mX2GEsoy9t","JJs5mHfyNQ","uTacxlH1kt",
+"GSQwjlH1kt","QbxXcHRxd8","2DREs2Yz7E","uAWypNo0Qb","VerEA0PktI","No0Qb8hJdt","HRxd8Qworu","Y1mC0zmLYD","MmKGJvOqCE","AXpwEECMvU",
+"ni2v1BGaQY","7Ow5CY1mC0","MaJQsVNCPd","1j5L8iB08l","5VZjSRxrsm","RkQketaOXK","hYBCKP6bcg","NcICATa8f6","FxX9qt98iW","lsQGoUlU3M",
+"AOgEePYBf4","2Yz7Elj07Q","7Ow5CJJs5m","9rlg90Kyfs","l83UdhE1Ql","n1pmO8RCUA","0Wr5yIBe8k","Q6hMC0Wr5y","24ARFZJTXH","U3yw5XflUq",
+"QssNCOUqFM","S2DfucQOnv","1j5L807n1c","KsjRK0PktI","lweGy5IhmG","n1pmO9GXkX","M3zXLdhSuH","5ZaEzECMvU","0MR5XtAOsr","S2Dfu8FmFH",
+"K4GS8fqypy","lm0pDsqVrf","OxWIHKZamH","RzaZANcICA","BpYhVlCMxy","Uvlv4xReec","SWfouFhtgl","FcWrWBCxeC","zbIYYpWiOs","lsQGoOxWIH",
+"W3VFHqaofN","CxVEftaOXK","EOE1ooGu6x","BGaQY9y4lw","jfREuEdBKc","uLtKsuupzk","ECMvUTXQ0Z","tl72WYh1hF","OUYuF9XyT9","xReec9y4lw",
+"Yf2EcNcICA","48cHLJKWYR","SbRYys93Ml","iB08lS77LH","FVMxo64s8N","aez9yQworu","580YDOz8yZ","d85a9iqv4k","CIShGQ6Lix","RpBQm8cVD3",
+"hSSvQ5Mg9r","Fhtgllm0pD","fcJOy7hyVv","nFqik7fsYM","CqqaDjfREu","sx5GllXFOB","s7MxkFNYIM","4QMc9KZamH","M3zXLP6bcg","cQOnvfcJOy",
+"ksJbyGXdoH","Q6LixhSSvQ","M6qcGlCMxy","FjHXRAOgEe","7ku1pRzaZA","gtCA5prNT6","pT8wulViBv","nlaByb29RJ","uN6r3mz8gx","24ARF580YD",
+"WMiS33weIF","1LB1LQbxXc","ECMvULbRTH","SWfouVNCPd","DQimpOUqFM","JRJQBpFrrl","hSSvQfcJOy","t59lRwDajX","ECMvU5nmWv","dmoS7cQOnv",
+"3otm6cShY2","vkCHHjiVBP","WaWsvuZPqg","9iGoTguMb8","5Mg9ri7WMQ","BFkb80Kyfs","prNT6ZhwG1","n1pmOAXpwE","qQxHPDz1R3","ZUnqtGrDg7",
+"fLNg8yToGW","ydG8UGSQwj","XflUq7lUXZ","UlU3MdhSuH","MK07YBCxeC","pmeCd14FLR","ix74rAIYUu","RBhp06AFT0","0YAGHP6bcg","KASQ8cmXIX",
+"5VZjSuJScX","0Kyfsrhl0J","2TRI77lUXZ","BpYhVy94nw","RACujAIYUu","uN6r3xXTI4","9y4lw2DREs","iwzGks7Mxk","IBe8kt59lR","EOE1oK4GS8",
+"9eoRcy94nw","lCMxyeuZA5","tvdkDLbRTH","uZPqgJkzUn","MezSWUvlv4","WreyPTXQ0Z","KASQ8KZamH","7lUXZ8xEKz","5IhmGwiHrZ","uLtKs6AFT0",
+"a00b58TxD7","IRh48AIYUu","vLsmS24ARF","jfREudQ586","ThjNnv8yFN","ThjNnwDajX","uZPqg6AFT0","qUJMdzQt6Q","WaWsvlViBv","faHirNhXdu",
+"rhl0JciuWz","TCgPp3otm6","BCxeCC2Irc","hYBCK2DREs","hUTw7djsrv","aL6AJmX2GE","hE1QlzqH0W","tvdkDS2Dfu","0ao3lciuWz","mX2GEZv7z0",
+"m4bxUGv3Fq","EoToPCdyBV","euZA58hJdt","hSSvQX6Pin","uvf7A5nmWv","atef2he9IA","zbIYYqUJMd","TwanodQ586","Dz1R3Vprf2","pAhR19XyT9",
+"bZLvSt59lR","MmsIo8xEKz","qUJMdatef2","yofH3AOgEe","QssNC7X3uy","sqVrfSmGzv","KsjRKatef2","ReKEWW3VFH","IjTwPoVQp6","UmaEvNAFuw",
+"D6rBy0PktI","taOXK5drc6","9y4lwt59lR","hUTw7BGaQY","yEfy90PktI","UlU3MNcICA","7fKYUIjTwP","DG4sTjzUqR","lXFOBL7cGc","NAFuwC2Irc",
+"F6PT25drc6","aL6AJGrDg7","s7Mxksoy9t","Yh1hFuZPqg","0h1b1gIYvE","uJScXWaim6","AOgEeChuy3","soy9ty94nw","iKqhrzY1GY","cShY2UlU3M",
+"suY4xzHF1q","MojnPVjCZq","NcICAMGlTF","fmIK1blLA9","UlU3MEOE1o","bgJAzOUYuF","JIqXiRmDcr","0MR5XFjHXR","LewvMrz7Ut","JKWYRlViBv",
+"t98iW3weIF","tuDyS7fsYM","h1zcHo8Uyd","ni2v1aDGtS","Gv3FqoGu6x","aDGtSRpBQm","blLA9qaofN","9XyT9oGu6x","Pb1pa0PktI","k85AezY1GY",
+"blLA9taOXK","G1RhSsoy9t","yluBxs4786","LbRTHM6qcG","NcICAP6bcg","QssNCCqqaD","VBjhzuoStw","IjTwPWDVWJ","O3iyQXyPZN","tjQxsbgJAz",
+"FPfSEM6qcG","JJs5m2Nslm","Oz8yZv1Hln","580YDv1Hln","uJScX8FmFH","8hJdtyToGW","rz7UtVNCPd","S2Dfu3weIF","IKxdLdjsrv","EdBKc5IhmG",
+"hYBCK07n1c","NcICAx3LDe","IBe8k7hyVv","ydG8UTwano","zY1GYYjB9t","uvf7AnFqik","5Nammd85a9","5ZaEzTXQ0Z","RBhp0ZuDtD","0KyfsiwzGk",
+"DQimp8U2nU","SWfoujSjS3","vkCHH29QAz","QChxsfcwDa","JkzUnFjHXR","S2DfuY1mC0","YOfrYMezSW","ZhwG15IhmG","J2mQiOUYuF","P6bcgCIShG",
+"Q6hMCZJTXH","ix74rjeskS","2ZHdkAkKTk","AOgEed7vjM","TCgPpyluBx","KZamHfFDrJ","iKqhrv8yFN","UlU3MydG8U","Yh1hFhUTw7","VLTy6jzUqR",
+"W7cTsDz1R3","dpe1vjiVBP","Ta8f6RpBQm","Cp3mZ0MR5X","16lHcWmadA","Uvlv4Twano","tl72WCp3mZ","ogLgcbZLvS","suY4x29QAz","0h1b1GWqqX",
+"Mm8siRACuj","W3VFHFwEJz","QssNCni2v1","FPfSE618Di","7hyVvzbIYY","sqVrfdpe1v","tuDySzQt6Q","B3qem6AFT0","14FLRFPfSE","DLhzMJkzUn",
+"okgRiwiHrZ","pWiOsRmDcr","7lUXZzmLYD","IKxdLvkCHH","7hyVvx3LDe","wDajXpWiOs","GXdoH0ao3l","No0QbGXdoH","In3NSKsjRK","t59lRU3yw5",
+"FwEJzzFgtB","pT8wu4QMc9","euZA5jS1aj","cQOnvQbxXc","2NslmCqqaD","dQ586ksJby","8FmFH7ku1p","OUqFMsuY4x","mX2GEThjNn","BpYhVS2Dfu",
+"GXdoH16lHc","GSQwjfaHir","wDajXn1pmO","e6e4zaFFss","guMb8Mkgy8","2TRI7POUYS","yluBxnFqik","vLsmSpAhR1","TXQ0Z0MR5X","CNHmvFPfSE",
+"nnP8o7Ow5C","oVQp6aFFss","vLsmSBGaQY","taOXK2hEEU","CdyBVBbwgA","45cIH6q6L9","IRh48tAOsr","AIYUuSbRYy","nnP8ofcwDa","ni2v1Qworu",
+"DLhzMMaJQs","RsQUqK4GS8","TwanogdQsS","HP433Uvlv4","0BmCyB3qem","8TxD7fmIK1","s93MllXFOB","StlDJM3zXL","Ta8f6hUTw7","CIShGMezSW",
+"0Wr5yW7cTs","lCMxyWPmlx","8cVD3RkQke","0h1b19rlg9","IjTwPv8yFN","sx5GluQIcz","MmsIojzUqR","tAOsrrKDLJ","MK07YuPX7G","xciqpsqVrf",
+"NcICA24ARF","uTacxyToGW","v1HlnZhwG1","OUqFMuN6r3","618DiWreyP","Dz1R35IhmG","CdyBVU3yw5","07n1cs93Ml","a00b5NcICA","fcwDazFgtB",
+"ZzJHWWaim6","5Mg9rWreyP","8TxD7pFrrl","tuDySWPmlx","nnP8onlaBy","CNHmvtuDyS","uPX7GX6Pin","qUJMd8hJdt","Uvlv4tlILt","64s8Nuvf7A",
+"tlILtK4GS8","y94nwtuDyS","DLhzMWreyP","FLsphru4UG","FxX9qvLsmS","SbRYyJkzUn","FjHXRIn3NS","3weIFsuY4x","zbIYYWreyP","5ZaEzTa8f6",
+"bZLvS9eoRc","Q6hMCAmdQd","uvf7AHlUbF","AgJHQNhXdu","ZJTXHdmoS7","9eoRcgdQsS","HRxd8I7p2a","uN6r3CK5W7","rz7Ut8RCUA","1LB1LaL6AJ",
+"bZLvSxXTI4","JRJQBqQxHP","rz7Ut48cHL","CNHmvni2v1","9XyT9AkKTk","OUqFMPYBf4","cmXIXeuZA5","uN6r3Waim6","5Drn007n1c","lXFOBEoToP",
+"lCMxyzmLYD","FhtglP6bcg","qQxHPMkgy8","ZJTXHEoToP","TXQ0ZjzUqR","okgRinFqik","TXQ0ZxXTI4","RxrsmRzaZA","dhSuHIBe8k","rKDLJy94nw",
+"e6e4z8TxD7","fcwDauJScX","ZuDtDFnPFB","xXTI4uoStw","4W0Tlt98iW","MmsIosoy9t","AkKTkMGlTF","cmXIXDcpWB","lkMUAP6bcg","FcWrWni2v1",
+"07n1ciB08l","OUqFMjiVBP","hSSvQokgRi","cmXIXZhwG1","580YDdhSuH","5Drn02hEEU","yluBxydG8U","QWxoTfqypy","blLA9Oz8yZ","OHaBz5Namm",
+"BbwgAjiVBP","Zv7z0zQt6Q","QWxoTlXFOB","Cfgr3tlILt","RpBQmoQ87r","Twano5Namm","uupzkLDk6f","SbRYyJXljW","8cVD3aL6AJ","WMiS3DQimp",
+"mz8gxzz4ZU","lsQGoJJs5m","VNCPdJRJQB","dmoS7W3VFH","mX2GETa8f6","618DiqUJMd","Cp3mZStlDJ","7lUXZyToGW","uTacxcmXIX","s47862TRI7",
+"0BmCyFVMxo","FwEJzRmDcr","RsQUqIn3NS","uJScXZ4I1v","DcpWB0Wr5y","ZzJHWKsjRK","VIlwPKr8ys","WmadACNHmv","QworuAIYUu","i7WMQbgJAz",
+"7fsYMStlDJ","SmGzvWPmlx","W7cTs9iGoT","Y1mC0gjUTu","QnJ1STCgPp","he9IAjiVBP","Waim6lViBv","tAOsr2Yz7E","K20wKCdyBV","Yh1hFx3LDe",
+"0ao3lpT8wu","2hEEUNxx9V","8cVD3TCgPp","FPfSEmX2GE","hUTw70BmCy","O3iyQCqqaD","d85a9uAWyp","aFFssQClRL","v1HlnCK5W7","h1zcHS2Dfu",
+"jfREuChuy3","jiVBP24ARF","VNCPd0MR5X","Zv7z0WmadA","uPX7GZv7z0","QWxoT8RCUA","gIYvEpFrrl","uQIcz5IhmG","y94nwMaJQs","JIqXi2TRI7",
+"U3yw5VerEA","wiHrZZzJHW","FxX9qSs0Zu","K20wK0PktI","FxX9qAkKTk","nlaBybgJAz","qaofNvkCHH","aL6AJStlDJ","RzaZAQ6hMC","3weIFHlUbF",
+"hE1Ql8cVD3","o8Uydaez9y","55rfBl83Ud","cL0aEDG4sT","zmLYDUvlv4","0h1b1zFgtB","t59lR5VZjS","Kr8ysWmadA","48cHL1j5L8","Mm8sirKDLJ",
+"blLA97fKYU","rz7UtSmGzv","tl72WO3iyQ","Mm8si7fsYM","rz7Ut2TRI7","o8UydIn3NS","sx5GlpmeCd","fmIK19eoRc","WDVWJRACuj","ulk41Dz1R3",
+"lweGyaL6AJ","pT8wuksJby","uoStwgjUTu","DcpWBvLsmS","DQimpC2Irc","VLTy6D6rBy","uQIczPYBf4","CqqaDF6PT2","v2eC3lm0pD","t59lR2Nslm",
+"atef2dQ586","xReecYf2Ec","WPmlxZv7z0","hUTw7n1pmO","lH1ktZhwG1","U3yw55Namm","64s8NCxVEf","n1pmO0h1b1","Nxx9Vhe9IA","5Drn07hyVv",
+"9y4lwUmaEv","WMiS3Q6Lix","Q6hMCaez9y","2ZHdk0Wr5y","FcWrW2DREs","24ARFoVQp6","TXQ0ZbZLvS","5VZjSJ2mQi","FjHXRQWxoT","9XyT924ARF",
+"VjCZqFLsph","7Ow5CfLNg8","rz7UtMK07Y","lweGySWfou","zQt6QnFqik","k85Ae9iGoT","atef2zHF1q","9XyT91v5hH","RsQUqaez9y","x3LDejSjS3",
+"9iGoTHP433","FjHXRzY1GY","CxVEfRBhp0","1LB1LMojnP","fFDrJpiJSk","piJSkMaJQs","lpF6WC2Irc","Dz1R3bZLvS","uZPqg2DREs","IRh48cShY2",
+"2Yz7EBpYhV","16lHcNAFuw","ix74ro8Uyd","zFgtBfcJOy","LbRTHAkKTk","Y1mC0i7WMQ","VjCZqKr8ys","FFDui7X3uy","lsQGohYBCK","GrDg75nmWv",
+"Cp3mZLDk6f","kZANmPYBf4","AgJHQk85Ae","pv0i7fqypy","HfyNQ0PktI","8xEKz2DREs","UlU3MhUTw7","brhlQUmaEv","oVQp6QssNC","X6PinQnJ1S",
+"Dz1R3Nxx9V","qQxHP3weIF","s47860Kyfs","bZLvS5nmWv","y94nw6q6L9","FjHXRMojnP","Vprf2WPmlx","oGu6xn1pmO","6q6L95Namm","45cIHdpe1v",
+"a00b5AgJHQ","dmoS79rlg9","RzaZALbRTH","gdQsShSSvQ","Uvlv4MmsIo","HfyNQ2Yz7E","5Mg9rIKxdL","IjTwPJ2mQi","24ARFiqv4k","WaWsvStlDJ",
+"4QMc95drc6","lsQGopmeCd","AgJHQCfgr3","wiHrZ0h1b1","jS1ajIKxdL","tlILttvdkD","cL0aELewvM","gIYvEQYxC0","euZA5SWfou","pFrrlRmDcr",
+"mX2GERxrsm","rz7UtMm8si","uPX7GRpBQm","J2mQi2DREs","7ku1pAIYUu","WDVWJhSSvQ","HRxd8zFgtB","Cp3mZMmsIo","piJSktaOXK","JRJQBZv7z0",
+"16lHc8xEKz","OUqFMgdQsS","dmoS77X3uy","U3yw5zQt6Q","0Kyfs7hyVv","o8UydTwano","RkQke6q6L9","yEfy94QMc9","CxVEfru4UG","Cp3mZtuDyS",
+"sx5Glhe9IA","nlaByGWqqX","Cp3mZsx5Gl","lH1ktnFqik","7ku1pfFDrJ","ZuDtDsqVrf","No0Qblj07Q","8xEKz618Di","BCxeC5ZaEz","DcpWBFnPFB",
+"fcJOyvLsmS","HRxd845cIH","guMb8RACuj","GXdoHCNHmv","xciqpmz8gx","MK07YoQ87r","ZJTXHKASQ8","3otm6NAFuw","FwEJz1LB1L","fLNg8JXljW",
+"TwanoaL6AJ","4QMc9a00b5","bZLvSNxx9V","JRJQBru4UG","n8pJ9Waim6","uLtKsEOE1o","OxWIHlweGy","ciuWzF6PT2","jSjS3s4786","MojnP7fsYM",
+"jfREuuZPqg","hi5X73otm6","uPX7Gy94nw","5ZaEzl83Ud","WaWsvQssNC","FFDui7fsYM","RmDcr7hyVv","FwEJzWaWsv","7Ow5CAIYUu","Cp3mZ9rlg9",
+"No0Qb29QAz","dQ586hSSvQ","hUTw7No0Qb","yvOMI0ao3l","lj07QFPfSE","3otm6FxX9q","7fsYMQChxs","fmIK1pT8wu","5Drn0G1RhS","WDVWJ8RCUA",
+"bgJAzFGzgp","VBjhzjiVBP","pv0i7I7p2a","UlU3MJKWYR","gdQsSwDajX","7hyVvUl4a1","J2mQiqQxHP","fcJOyNcICA","QnJ1SWaim6","0Kyfs7fsYM",
+"lpF6WvOqCE","S77LHcL0aE","OxWIH2TRI7","dpe1vGv3Fq","PYBf4bgJAz","faHirzFgtB","RACujHP433","Ul4a1K20wK","0YAGHL7cGc","Q6hMCCNHmv",
+"Pb1paWreyP","jiVBPzmLYD","8hJdtvOqCE","yofH3zY1GY","a00b5M6qcG","x3LDet98iW","In3NSZ4I1v","sqVrfksJby","Y1mC05nmWv","GWqqXK20wK",
+"16lHctvdkD","7lUXZZzJHW","tAOsrhUTw7","5NammCfgr3","rKDLJ9iGoT","0Wr5yTwano","Dz1R3RsQUq","5iGN5BGaQY","uupzklCMxy","zbIYYZuDtD",
+"hSSvQTCgPp","HP433QssNC","vLsmSP6bcg","RxrsmtlILt","RpBQmhYBCK","xReeczbIYY","IBe8kfaHir","MaJQszY1GY","zbIYYSbRYy","TXQ0Zulk41",
+"WaWsvlCMxy","tl72Wn8pJ9","QYxC0SWfou","piJSk8RCUA","29QAzdpe1v","tuDyS07n1c","hUTw7lViBv","JKWYRjzUqR","prNT6OUqFM","Gv3FqZv7z0",
+"9rlg9Dz1R3","iqv4klCMxy","4dEz6rKDLJ","WDVWJHP433","9y4lw2Nslm","zQt6QzY1GY","DG4sTnnP8o","RsQUqD6rBy","RpBQmXyPZN","zY1GY3otm6",
+"tl72WyvOMI","IKxdLt98iW","2NslmLewvM","gdQsSK20wK","nFqikfqypy","yEfy955rfB","EoToPlH1kt","ulk41MGlTF","uJScX2Nslm","zQt6QdmoS7",
+"xciqpeuZA5","B3qemru4UG","oGu6xCqqaD","24ARFokgRi","5ZaEzO3iyQ","RmDcrlXFOB","pT8wuuZPqg","0BmCyEOE1o","ZuDtDrhl0J","TCgPp7fsYM",
+"rz7Ut07n1c","J2mQitaOXK","yofH3pWiOs","VLTy6RsQUq","qQxHPpFrrl","4dEz67lUXZ","W7cTsWDVWJ","VjCZqdmoS7","5IhmG3otm6","K20wKIKxdL",
+"0KyfsjiVBP","L7cGcUvlv4","7hyVvSmGzv","fcwDagjUTu","m4bxU5drc6","ZuDtDSWfou","No0QbyToGW","d85a9WaWsv","ECMvUgdQsS","b29RJdpe1v",
+"16lHcFhtgl","RACuj2Nslm","vkCHHvLsmS","pvgjSru4UG","2NslmRmDcr","AOgEetlILt","I7p2aRkQke","5VZjSAOgEe","MK07YpFrrl","VerEA2Nslm",
+"lpF6WhE1Ql","lj07QazIWp","5Namm1v5hH","wDajXrKDLJ","5ZaEzLbRTH","m4bxU7fKYU","2TRI7lCMxy","uQIczDQimp","48cHLpmeCd","55rfBhUTw7",
+"5nmWvZ4I1v","tl72WC2Irc","14FLR4W0Tl","OUqFMksJby","IRh48jiVBP","YjB9tru4UG","QbxXctvdkD","IBe8kWmadA","FjHXRVerEA","rhl0JrKDLJ",
+"yofH3tuDyS","DLhzM6AFT0","i3pydogLgc","yofH3zHF1q","5nmWvcShY2","9GXkXSmGzv","tAOsrThjNn","rz7UtFVMxo","HfyNQprNT6","ThjNniqv4k",
+"0KyfsRkQke","RsQUq1v5hH","YjB9thUTw7","GWqqXK4GS8","2hEEUFNYIM","BCxeCiwzGk","tAOsrqQxHP","BCxeCyvOMI","zY1GYnlaBy","MGlTFFnPFB",
+"b29RJ7lUXZ","7lUXZazIWp","UlU3M0BmCy","KsjRKvOqCE","UlU3MUlU3M","2hEEUlj07Q","F6PT2fFDrJ","Ta8f67X3uy","RxrsmFnPFB","POUYSfmIK1",
+"yluBxxReec","AgJHQBFkb8","JkzUnatef2","uN6r3ksJby","2ZHdkx3LDe","gIYvELewvM","i3pydjS1aj","gIYvEMmsIo","VBjhzFxX9q","lViBv29QAz",
+"Yh1hFiwzGk","ciuWzaL6AJ","M3zXLAkKTk","kB5nPRACuj","x3LDehE1Ql","s4786aFFss","0YAGHlViBv","AgJHQi3pyd","XyPZNQYxC0","9iGoTGWqqX",
+"y94nws7Mxk","5drc6WMiS3","QnJ1Sh1zcH","uPX7GFwEJz","5Mg9rxXTI4","GSQwjpWiOs","taOXK3weIF","FVMxoF6PT2","7Ow5CKASQ8","s4786Twano",
+"S2DfuBbwgA","CxVEfdQ586","ZJTXHGXdoH","XyPZN2DREs","EOE1o5Namm","xReechUTw7","s7MxkNAFuw","7X3uy45cIH","TXQ0ZFjHXR","gIYvEuvf7A",
+"S2Dfuulk41","djsrvbrhlQ","d7vjMn8pJ9","8U2nUn8pJ9","Zv7z0zY1GY","0PktIO3iyQ","hi5X7faHir","ni2v1ydG8U","UlU3Mix74r","Ss0ZubgJAz",
+"piJSksx5Gl","zqH0WPOUYS","qQxHP24ARF","uZPqgaFFss","Zv7z0fFDrJ","VjCZqgjUTu","EoToPAkKTk","AXpwEaez9y","WMiS3s7Mxk","BpYhV8TxD7",
+"2DREsoQ87r","7fsYM5Mg9r","lXFOB2ZHdk","BCxeCIjTwP","M3zXL5Mg9r","GXdoHWreyP","s93MlWMiS3","vkCHHyofH3","Yw2oUTa8f6","TXQ0Zuupzk",
+"jfREufqypy","CIShGwDajX","oVQp6i3pyd","Dz1R3mz8gx","L7cGckZANm","Oz8yZyluBx","t98iWDcpWB","azIWpGSQwj","ZzJHWpAhR1","mz8gx6AFT0",
+"QChxsZhwG1","tlILtU3yw5","In3NSmz8gx","wDajXWaim6","MmKGJfcJOy","faHirOz8yZ","Yw2oUVjCZq","JKWYRjfREu","hE1QlMGlTF","5Drn0uupzk",
+"FPfSEY1mC0","5nmWvZhwG1","pT8wuXyPZN","e6e4zPb1pa","zHF1q6AFT0","Vprf2zbIYY","L7cGc29QAz","S2DfupmeCd","IRh48sx5Gl","fcJOyatef2",
+"iqv4kjtn0X","jSjS316lHc","tvdkDRBhp0","Oz8yZlj07Q","0h1b1W7cTs","zY1GY7X3uy","tlILtru4UG","d85a9cL0aE","0PktIpvgjS","NcICA8U2nU",
+"s7MxkVNCPd","U3yw5oVQp6","uQIcz5drc6","M3zXLWPmlx","DLhzMECMvU","RmDcrzz4ZU","nnP8o9XyT9","dQ5863otm6","8FmFHMK07Y","VBjhzguMb8",
+"BGaQYCK5W7","NcICAokgRi","tvdkD5nmWv","ru4UGlH1kt","dmoS78RCUA","07n1cReKEW","qUJMd48cHL","gdQsSulk41","t98iW4W0Tl","he9IA0Wr5y",
+"x3LDejfREu","RmDcr2Nslm","tjQxspvgjS","n1pmOpT8wu","aDGtSjfREu","WMiS3L7cGc","1LB1LFjHXR","JXljWWMiS3","B3qemMK07Y","WmadAbgJAz",
+"cmXIXru4UG","jfREujSjS3","OxWIHv8yFN","TwanoEoToP","IKxdLuQIcz","JXljWS77LH","3otm6sqVrf","S2Dfu8TxD7","Cfgr3FjHXR","2ZHdkSs0Zu",
+"fqypy2TRI7","RsQUqd85a9","1v5hHtAOsr","nFqik5nmWv","mz8gx7fsYM","OHaBzuZPqg","Q6LixXflUq","AOgEeSbRYy","bgJAzFjHXR","J2mQiDG4sT",
+"pFrrl14FLR","taOXKjiVBP","xXTI4gIYvE","CNHmvwiHrZ","QworuWmadA","FjHXRNo0Qb","zqH0WVprf2","uLtKsCp3mZ","CIShGLbRTH","uoStwSWfou",
+"uJScXJJs5m","J2mQiBFkb8","xReec7Ow5C","RsQUqJkzUn","4W0TlWPmlx","uZPqgW3VFH","JkzUnNOHsz","Mkgy8J2mQi","48cHLvkCHH","NcICAhYBCK",
+"ni2v1DcpWB","hE1QlVBjhz","UmaEvbrhlQ","gIYvEx3LDe","3otm6M6qcG","4dEz624ARF","S2Dfun8pJ9","580YDdmoS7","y94nwZzJHW","2ZHdk618Di",
+"dhSuHnnP8o","ZzJHWfcJOy","nFqik0Wr5y","i7WMQMK07Y","7ku1p2hEEU","IjTwPMmsIo","gjUTuDG4sT","sx5GlUl4a1","0h1b1YOfrY","RzaZAulk41",
+"QbxXcv2eC3","v2eC3Cfgr3","sx5GlHRxd8","M6qcGRpBQm","cShY2W7cTs","8RCUAx3LDe","soy9tmz8gx","MGlTF64s8N","AIYUulweGy","FnPFBB3qem",
+"cmXIXuupzk","IjTwPIjTwP","dQ586fcJOy","L7cGcPb1pa","S2DfuaFFss","gIYvEWMiS3","he9IAFGzgp","ZJTXH2DREs","16lHcokgRi","zmLYDYh1hF",
+"Yw2oUnlaBy","gjUTuaez9y","uJScXaFFss","Q6LixYh1hF","YjB9tpiJSk","RsQUqnFqik","prNT6qQxHP","aez9ymX2GE","t59lRt59lR","AmdQdlCMxy",
+"ReKEWYf2Ec","aez9yNo0Qb","uLtKsh1zcH","StlDJaFFss","Kr8ys0h1b1","TwanohUTw7","v8yFNQworu","HRxd8RpBQm","v8yFNK4GS8","RACujZuDtD",
+"euZA5v8yFN","s4786rhl0J","7ku1pRBhp0","QClRLGSQwj","8RCUAuPX7G","8TxD7b29RJ","S77LHv8yFN","k85AetAOsr","RACujAgJHQ","kZANmQYxC0",
+"fcJOyL7cGc","aL6AJS2Dfu","ReKEW580YD","1LB1LeuZA5","ThjNn1j5L8","2hEEU8cVD3","MmsIoDcpWB","i3pydzFgtB","DQimptlILt","jzUqRDQimp",
+"5Mg9r8U2nU","zbIYYs4786","KASQ82DREs","zbIYYs7Mxk","VLTy6ciuWz","YjB9thE1Ql","7ku1pblLA9","QssNCPb1pa","POUYSFnPFB","fcJOyJRJQB",
+"ZJTXHCdyBV","RzaZArKDLJ","pAhR1guMb8","MGlTF580YD","2ZHdkAXpwE","DG4sTSmGzv","EdBKctuDyS","45cIHzQt6Q","1j5L86AFT0","dmoS70YAGH",
+"bgJAzZJTXH","U3yw514FLR","sx5GlVNCPd","BCxeCtlILt","ksJbyuN6r3","jtn0X5Namm","jSjS3Mm8si","x3LDeQ6Lix","VNCPdtuDyS","aez9yPYBf4",
+"P6bcg2TRI7","S77LH9rlg9","dQ586djsrv","rz7UtcQOnv","uPX7GuZPqg","9XyT9hYBCK","wDajXkB5nP","fFDrJyEfy9","8hJdtMezSW","Yw2oUlj07Q",
+"lViBvy94nw","HzZT8zFgtB","n8pJ95drc6","uLtKsfqypy","HzZT8RpBQm","uJScXQworu","gIYvEHRxd8","EdBKcYjB9t","DcpWBiwzGk","2ZHdkhe9IA",
+"HzZT89GXkX","cmXIXzqH0W","2ZHdkCqqaD","ZJTXHfaHir","ECMvUYh1hF","bZLvSprNT6","W3VFHRmDcr","Mkgy80PktI","2NslmQClRL","8cVD3pvgjS",
+"7hyVvuoStw","1v5hHFnPFB","x3LDeWMiS3","aDGtSQssNC","7lUXZFLsph","yofH3sqVrf","aFFssB3qem","UmaEv5ZaEz","v8yFNAkKTk","bgJAzQWxoT",
+"7fKYU0MR5X","tuDySo8Uyd","8hJdtFjHXR","RmDcrl83Ud","MK07YX6Pin","RkQkezbIYY","y94nw5drc6","x3LDe64s8N","QnJ1SMK07Y","zFgtBGSQwj",
+"7fKYU24ARF","iqv4k55rfB","NhXdubgJAz","zY1GYeuZA5","AgJHQiqv4k","B3qemHRxd8","RmDcrW3VFH","tAOsrlweGy","O3iyQoVQp6","Dz1R30BmCy",
+"tvdkDDLhzM","nFqikWaWsv","piJSknlaBy","Cp3mZjeskS","iB08lOUYuF","FPfSEQChxs","Nxx9Vt98iW","DcpWBKr8ys","o8UydFPfSE","pmeCdBFkb8",
+"mz8gxsuY4x","zqH0WVLTy6","KASQ8uLtKs","Ss0Zu4W0Tl","aL6AJxReec","aez9yni2v1","Vprf2gtCA5","0BmCy5IhmG","GrDg7cShY2","F6PT2dpe1v",
+"618DiVLTy6","5iGN5LewvM","UlU3MZuDtD","soy9tFxX9q","64s8NdmoS7","Pb1paIBe8k","tl72W3otm6","YOfrYSbRYy","24ARFaez9y","HzZT8OxWIH",
+"45cIHJJs5m","VLTy6lj07Q","lweGy9GXkX","2hEEUGrDg7","Ul4a15drc6","VBjhztlILt","FVMxoNcICA","azIWp5Drn0","8hJdtcShY2","48cHLfqypy",
+"8xEKz8FmFH","uupzk0Wr5y","o8UydZzJHW","2ZHdkW7cTs","9y4lwdjsrv","pWiOss93Ml","4W0Tll83Ud","cQOnvuvf7A","nFqikThjNn","zqH0WWDVWJ",
+"lweGyGSQwj","G1RhSYOfrY","Zv7z0yofH3","48cHLS2Dfu","GXdoHAmdQd","LDk6f0MR5X","iKqhr8U2nU","MezSWNo0Qb","MGlTFCqqaD","mX2GE0MR5X",
+"AkKTkCqqaD","JkzUnzHF1q","YOfrYru4UG","LbRTHRmDcr","U3yw5Kr8ys","GrDg7cQOnv","DcpWBh1zcH","7hyVvZUnqt","ydG8UNxx9V","v8yFNEdBKc",
+"gtCA5v8yFN","t59lRuN6r3","Yh1hFP6bcg","KsjRKFLsph","O3iyQ8xEKz","KZamH9rlg9","lCMxyHfyNQ","brhlQn8pJ9","SmGzv7lUXZ","OxWIHSjskQ",
+"iqv4kHlUbF","RkQkeMkgy8","8hJdtB3qem","jfREudjsrv","yEfy9M3zXL","ECMvU9y4lw","Cfgr34W0Tl","HfyNQuQIcz","aDGtSCxVEf","pvgjStaOXK",
+"uAWyplm0pD","jS1ajFhtgl","zqH0WUlU3M","kZANmWPmlx","WDVWJv2eC3","brhlQ8U2nU","cShY25iGN5","MmKGJNhXdu","MaJQsjSjS3","9eoRcIjTwP",
+"Nxx9VVNCPd","aFFssMm8si","yofH3VLTy6","iwzGkjeskS","7fKYUTa8f6","JIqXiNAFuw","IKxdLhi5X7","14FLRvOqCE","AOgEeqQxHP","MaJQsgIYvE",
+"yvOMIvkCHH","X6PinJRJQB","SbRYy6q6L9","AOgEeMGlTF","lkMUAD6rBy","HfyNQi3pyd","4QMc9MojnP","BbwgAFLsph","jS1aj0BmCy","aDGtSzqH0W",
+"blLA9gtCA5","LewvMDLhzM","jS1ajwiHrZ","TXQ0Ziqv4k","atef2NOHsz","brhlQVBjhz","XflUqFnPFB","lH1ktMmKGJ","KsjRKzFgtB","faHir5ZaEz",
+"ru4UG5Drn0","gtCA5JJs5m","JXljWprNT6","fcJOyM3zXL","azIWp8U2nU","xXTI4Q6Lix","7lUXZ0ao3l","zz4ZUOHaBz","aL6AJa00b5","Cfgr3uJScX",
+"dmoS7ZJTXH","ZuDtDThjNn","qUJMdv8yFN","ciuWz1v5hH","ulk410MR5X","TwanoVNCPd","In3NS5VZjS","cL0aEuTacx","6AFT0jS1aj","W3VFHFjHXR",
+"atef2dhSuH","yToGWBFkb8","7ku1pjiVBP","jSjS35Drn0","fFDrJciuWz","DLhzMFFDui","uAWyphUTw7","WPmlx55rfB","mz8gxxciqp","pvgjSOUYuF",
+"yvOMIwiHrZ","5Drn0jeskS","QWxoTe6e4z","jiVBPpWiOs","EOE1oGSQwj","pWiOsqUJMd","5NammReKEW","MGlTFVNCPd","VNCPdI7p2a","ECMvUgjUTu",
+"FjHXRWaim6","vLsmSaDGtS","Cp3mZGWqqX","Chuy38RCUA","sx5GlblLA9","jfREuHlUbF","rKDLJCxVEf","WMiS3lsQGo","XflUqGv3Fq","AIYUuKr8ys",
+"tAOsrJIqXi","l83Udsoy9t","D6rBy7fKYU","7fKYU9rlg9","2Yz7EVLTy6","FFDuinlaBy","In3NS3otm6","Ul4a15VZjS","8TxD7t59lR","RkQkelCMxy",
+"StlDJZuDtD","fLNg8lViBv","hE1QlhSSvQ","ECMvU2Yz7E","8xEKzuQIcz","brhlQMK07Y","Cfgr3k85Ae","Uvlv4d85a9","dQ58664s8N","n8pJ9mX2GE",
+"GrDg7gjUTu","G1RhSjeskS","QClRLix74r","ru4UGvLsmS","CIShGXflUq","IBe8kSs0Zu","oQ87r8hJdt","0h1b1hi5X7","s7MxkuAWyp","piJSkCK5W7",
+"xReecQbxXc","uZPqguTacx","Chuy3DQimp","OUYuFTwano","lm0pDmz8gx","NhXduJJs5m","3weIFiqv4k","16lHcMkgy8","GrDg729QAz","Vprf2MojnP",
+"aDGtSFhtgl","Uvlv4lj07Q","8RCUAYjB9t","0Wr5ycmXIX","2NslmRxrsm","dhSuHru4UG","Zv7z0mz8gx","x3LDe1j5L8","jfREuNOHsz","fcwDa4W0Tl",
+"uPX7GMezSW","IjTwPazIWp","LbRTHZ4I1v","fLNg8VNCPd","P6bcgGv3Fq","LDk6fjtn0X","W7cTs16lHc","nFqiksoy9t","lkMUAguMb8","ru4UGMmsIo",
+"v1HlnFFDui","8xEKzRBhp0","P6bcgVerEA","Oz8yZ5ZaEz","CNHmvyEfy9","lj07QjSjS3","QworuSWfou","WmadA9eoRc","pWiOsKASQ8","9rlg9P6bcg",
+"aDGtSbrhlQ","lsQGoCIShG","7fsYMIn3NS","No0Qb2TRI7","fqypyJRJQB","aL6AJNhXdu","HP433MaJQs","azIWpeuZA5","aL6AJEoToP","m4bxUguMb8",
+"cQOnvlCMxy","9rlg94W0Tl","O3iyQsqVrf","NAFuwYh1hF","DG4sT6q6L9","L7cGcBFkb8","VLTy6Mkgy8","X6Pin6AFT0","soy9tfcwDa","VjCZqIBe8k",
+"FcWrWKASQ8","uPX7GOxWIH","oQ87rkB5nP","Qworu8hJdt","VLTy6S2Dfu","QssNCk85Ae","8RCUAZv7z0","RBhp0Dz1R3","nFqikni2v1","WPmlxBFkb8",
+"OUqFM580YD","JXljWb29RJ","Ss0ZutAOsr","fcJOyVBjhz","FVMxov8yFN","lweGyFxX9q","FVMxoZJTXH","e6e4zt59lR","KsjRKix74r","BpYhVoGu6x",
+"yToGW7fKYU","b29RJ5nmWv","WDVWJzY1GY","vLsmSUlU3M","55rfBNo0Qb","sqVrfo8Uyd","i7WMQlH1kt","zHF1qjeskS","618DiFVMxo","QWxoTfmIK1",
+"Dz1R3Uvlv4","RkQkevkCHH","dhSuHVNCPd","h1zcHazIWp","TXQ0ZlsQGo","nlaByIjTwP","DcpWB8FmFH","RxrsmQWxoT","ZhwG1AkKTk","W3VFHS2Dfu",
+"zbIYYix74r","yofH35Drn0","a00b5K4GS8","EdBKcOUqFM","24ARF7fsYM","ZUnqt9rlg9","cmXIXJKWYR","rKDLJDcpWB","faHirFwEJz","QnJ1SRzaZA",
+"9y4lw0PktI","ZJTXHm4bxU","cShY2VLTy6","LDk6fX6Pin","gjUTujS1aj","aFFssNAFuw","nnP8oNOHsz","CIShGMojnP","Chuy3OUqFM","3otm62TRI7",
+"b29RJh1zcH","uAWypFjHXR","JkzUn64s8N","FGzgpkB5nP","v2eC3hi5X7","F6PT2cL0aE","VNCPdHfyNQ","4W0TlYOfrY","CIShGKr8ys","SbRYyguMb8",
+"brhlQDG4sT","yvOMIbgJAz","HzZT8CqqaD","KsjRKQWxoT","oQ87rYw2oU","S77LHm4bxU","lm0pDOUqFM","v2eC35drc6","W3VFHZuDtD","piJSktuDyS",
+"5ZaEzhE1Ql","ThjNn4QMc9","gIYvETXQ0Z","W7cTs5IhmG","CxVEfdmoS7","hSSvQaFFss","uPX7GIRh48","TCgPplweGy","DG4sTwDajX","lsQGoY1mC0",
+"pFrrlm4bxU","Uvlv42TRI7","4W0TlokgRi","Cp3mZMaJQs","zHF1qlkMUA","Chuy3ydG8U","FjHXR0BmCy","0BmCyhi5X7","zqH0WtAOsr","uupzkzbIYY",
+"QChxs9eoRc","zz4ZU8FmFH","rz7UtAgJHQ","hSSvQy94nw","iB08lwDajX","ix74rlkMUA","2Yz7EFhtgl","hE1QlMK07Y","KASQ8vkCHH","ECMvUC2Irc",
+"2DREsW3VFH","tlILtqUJMd","pmeCduLtKs","IjTwP9y4lw","qUJMdEOE1o","7fsYMCNHmv","ogLgcs93Ml","lH1kt7fKYU","FcWrWDz1R3","FNYIMv1Hln",
+"ReKEWuTacx","2TRI7YjB9t","VIlwPI7p2a","bgJAzyToGW","Nxx9VkB5nP","nFqikDQimp","dQ586xXTI4","AIYUu5Namm","brhlQC2Irc","XyPZNpv0i7",
+"fcwDaxciqp","JRJQBW7cTs","i3pydMK07Y","Waim6vkCHH","HRxd8J2mQi","a00b5VIlwP","7Ow5Chi5X7","lkMUA5ZaEz","dhSuHtlILt","0YAGHZuDtD",
+"BGaQYUlU3M","2Yz7E48cHL","7fsYM9GXkX","VjCZql83Ud","OHaBzJIqXi","QbxXcQ6Lix","8xEKzFFDui","5drc6wDajX","uPX7G5iGN5","2ZHdkThjNn",
+"lj07Q8xEKz","JJs5msqVrf","0PktIYh1hF","7fsYMiB08l","5NammQYxC0","JKWYRVNCPd","HzZT8gdQsS","faHir0YAGH","16lHccShY2","5nmWvJJs5m",
+"cQOnvtl72W","W3VFHNo0Qb","zFgtBZ4I1v","OUYuFlCMxy","BCxeCix74r","dhSuHnlaBy","Cfgr3hE1Ql","9eoRcnFqik","RkQkegjUTu","uJScXECMvU",
+"QChxshUTw7","7fsYMi3pyd","SjskQ2ZHdk","ru4UGt59lR","TXQ0ZMmsIo","64s8NIBe8k","mX2GE2hEEU","nlaBy9y4lw","Y1mC0hUTw7","FwEJzQYxC0",
+"LbRTH4QMc9","uQIczNxx9V","F6PT2Vprf2","dmoS7Chuy3","hUTw7i3pyd","HzZT8bgJAz","NhXduQChxs","I7p2ajtn0X","0h1b1iwzGk","ReKEWFhtgl",
+"h1zcH8U2nU","MmsIoThjNn","1j5L8nlaBy","HP433BbwgA","ReKEWWDVWJ","618DiBpYhV","zFgtBpFrrl","POUYSru4UG","NOHszHlUbF","Q6hMC3otm6",
+"Ta8f6Q6hMC","iwzGkYf2Ec","y94nwCNHmv","jzUqRCK5W7","W7cTsuupzk","OxWIH1LB1L","euZA5LewvM","U3yw5s93Ml","nlaByC2Irc","S77LHfmIK1",
+"CK5W7piJSk","2NslmcShY2","JKWYR14FLR","Uvlv4cL0aE","Mkgy8h1zcH","4W0TlaL6AJ","YjB9tfFDrJ","Chuy3QChxs","AmdQdzHF1q","GXdoHMezSW",
+"IjTwPeuZA5","Mm8sih1zcH","8hJdtix74r","lXFOBfmIK1","IBe8kwiHrZ","07n1cqaofN","LbRTHzqH0W","gdQsSuQIcz","Vprf29iGoT","bZLvSHzZT8",
+"GSQwjNOHsz","x3LDeFwEJz","v2eC3Dz1R3","JkzUnZJTXH","WPmlxRACuj","Twanoni2v1","K20wKlj07Q","lsQGoZhwG1","MaJQs0BmCy","KASQ8AXpwE",
+"cQOnvdhSuH","QChxsTCgPp","jS1ajGrDg7","B3qemuPX7G","nnP8obrhlQ","pWiOs2ZHdk","55rfByEfy9","tuDySZJTXH","M3zXLs7Mxk","S77LHCNHmv",
+"lViBvRzaZA","2hEEULbRTH","qQxHPKr8ys","zQt6QlpF6W","0YAGHjSjS3","FcWrWgf8rI","BpYhV5VZjS","EOE1odpe1v","kB5nPeuZA5","PYBf4HRxd8",
+"hi5X7Rxrsm","M3zXL0BmCy","hYBCKMGlTF","jeskSbgJAz","uoStwfLNg8","gtCA5HlUbF","OUqFML7cGc","s4786FjHXR","qQxHPThjNn","bgJAzoVQp6",
+"SbRYy2ZHdk","OUqFMBGaQY","24ARFs7Mxk","i7WMQOz8yZ","LbRTHhSSvQ","ciuWzAIYUu","CK5W716lHc","pmeCdYh1hF","24ARF5Drn0","dQ586S2Dfu",
+"ZzJHW55rfB","cQOnv4W0Tl","45cIHKASQ8","guMb87lUXZ","4QMc9DLhzM","cmXIXfaHir","Mkgy8fcJOy","vOqCECxVEf","gdQsSsuY4x","prNT61j5L8",
+"o8UydjeskS","DQimp0BmCy","LbRTHfcJOy","l83Ud16lHc","t98iWguMb8","n8pJ9suY4x","5NammWaim6","2TRI7C2Irc","tjQxstaOXK","W7cTs0h1b1",
+"FxX9qyofH3","yofH3tjQxs","ulk41FnPFB","ZhwG1FVMxo","dmoS7pvgjS","DQimpQssNC","2ZHdktAOsr","ciuWzMmKGJ","SbRYy7fKYU","WDVWJMezSW",
+"NAFuwAmdQd","hi5X7QbxXc","0YAGHuvf7A","2ZHdkIKxdL","uLtKsRmDcr","Mkgy8Cp3mZ","guMb8Dz1R3","MojnPBbwgA","RkQkeRmDcr","AXpwEYw2oU",
+"lpF6WEdBKc","guMb8QbxXc","zY1GY8TxD7","YOfrYSjskQ","QnJ1STwano","fmIK1lViBv","x3LDeuoStw","ThjNn0PktI","B3qemZzJHW","cShY2JJs5m",
+"JRJQBwiHrZ","Waim6YOfrY","JXljWd7vjM","8hJdt0Kyfs","MojnPNo0Qb","BCxeCogLgc","VBjhzAOgEe","fmIK1pWiOs","DLhzMbrhlQ","bZLvSiqv4k",
+"MGlTFFLsph","lj07QuZPqg","9iGoTIKxdL","ciuWzZUnqt","AgJHQP6bcg","5nmWvQbxXc","24ARFRpBQm","yEfy9Dz1R3","QssNCSbRYy","xciqpEOE1o",
+"uvf7AcL0aE","MGlTFeuZA5","5VZjSW3VFH","hi5X7M3zXL","IRh48tjQxs","lkMUAJkzUn","hSSvQ2DREs","dmoS7OUYuF","HzZT8RkQke","CqqaDblLA9",
+"lweGytjQxs","LDk6fZUnqt","580YDCdyBV","FjHXRbrhlQ","DLhzM2Yz7E","2hEEUgIYvE","RmDcrZzJHW","RkQkeNcICA","FLsphl83Ud","HlUbFjS1aj",
+"Cfgr3rhl0J","s4786580YD","FVMxoTa8f6","hi5X7o8Uyd","07n1c48cHL","mz8gxXyPZN","MmsIolkMUA","jS1aj2Yz7E","MGlTFZuDtD","soy9tpiJSk",
+"aez9yzY1GY","7X3uyKASQ8","QYxC0s93Ml","16lHcZv7z0","nnP8oYh1hF","WmadAru4UG","2DREsdpe1v","iB08lkB5nP","8cVD3t98iW","i3pydsx5Gl",
+"yToGWFPfSE","fcwDa9eoRc","cmXIXdmoS7","pAhR1yvOMI","yofH3FcWrW","kZANmatef2","LewvMv1Hln","5IhmG4W0Tl","vOqCEciuWz","VIlwP9XyT9",
+"SWfouydG8U","G1RhSBFkb8","RBhp0FnPFB","v8yFN3otm6","Fhtglfqypy","zz4ZUYh1hF","9iGoTTwano","mX2GEjiVBP","9XyT9oVQp6","D6rByMezSW",
+"pAhR1iqv4k","hYBCKru4UG","mz8gxlXFOB","9rlg9WMiS3","2DREspiJSk","RkQkefFDrJ","JRJQBe6e4z","0Wr5yWaim6","KsjRKQbxXc","VjCZqlXFOB",
+"6q6L9ECMvU","Ul4a10YAGH","64s8N7ku1p","Z4I1vO3iyQ","uTacxaFFss","piJSkGWqqX","ru4UGhYBCK","mz8gxvOqCE","7fKYUqQxHP","yToGW5Drn0",
+"cL0aEQ6Lix","yofH3ECMvU","DcpWB0BmCy","uupzkNOHsz","iKqhrS77LH","WaWsvRBhp0","SmGzvM6qcG","uLtKsYw2oU","5Drn0J2mQi","uupzkix74r",
+"KsjRK0ao3l","6q6L9n1pmO","v1HlnyToGW","bZLvSMkgy8","MK07YZ4I1v","lm0pD45cIH","FwEJz7X3uy","tuDyS0Wr5y","5NammFFDui","S2Dfu8U2nU",
+"lsQGo7X3uy","oGu6xe6e4z","JKWYRtlILt","4dEz6QbxXc","azIWp8xEKz","ZuDtDG1RhS","JJs5mD6rBy","GWqqXi3pyd","tuDySuoStw","s4786ulk41",
+"0BmCyOUqFM","ReKEWQssNC","v2eC3OHaBz","gjUTuJ2mQi","TCgPp55rfB","Vprf2VLTy6","e6e4zuZPqg","zqH0WuQIcz","zY1GYfcwDa","MGlTFxXTI4",
+"wiHrZn8pJ9","2NslmFLsph","djsrvlViBv","MojnPCqqaD","QYxC0qQxHP","M3zXLOUYuF","jSjS3tl72W","ZUnqtaez9y","Yw2oUogLgc","lm0pDCp3mZ",
+"uupzkLbRTH","W3VFHqQxHP","FwEJzMojnP","2ZHdkNOHsz","jeskSMGlTF","O3iyQ2DREs","TCgPpatef2","YOfrY4W0Tl","8hJdtAIYUu","MK07YW7cTs",
+"yToGWaL6AJ","Ta8f66q6L9","okgRiKsjRK","m4bxUP6bcg","7X3uyEoToP","MojnPjSjS3","jS1ajlm0pD","okgRijfREu","FFDui8U2nU","8xEKzaDGtS",
+"xReecuupzk","n8pJ95Namm","618Dirz7Ut","lH1ktReKEW","MmsIoI7p2a","UlU3Mv2eC3","oQ87rfqypy","tuDySUmaEv","hYBCKM6qcG","Chuy3d85a9",
+"FjHXRrhl0J","cQOnvfLNg8","lH1ktX6Pin","ciuWz4QMc9","CxVEfCxVEf","GSQwjVIlwP","xXTI40Kyfs","hUTw7AOgEe","EOE1oGrDg7","Yw2oUFNYIM",
+"lpF6WQworu","VNCPd5Namm","Zv7z0AgJHQ","hSSvQmX2GE","7fKYUSjskQ","M3zXL4QMc9","FxX9q618Di","FVMxozz4ZU","7fsYM8xEKz","fLNg8BpYhV",
+"RpBQmTXQ0Z","zFgtBKASQ8","48cHLYOfrY","2Yz7ERmDcr","IRh48SjskQ","TCgPpCNHmv","OxWIHWaim6","2hEEUt98iW","v1Hlntl72W","nFqikFLsph",
+"IRh48cQOnv","rKDLJ2ZHdk","QbxXc7ku1p","tlILt9eoRc","Qworu8RCUA","CK5W7ECMvU","uupzkDcpWB","KASQ8NhXdu","MaJQsuJScX","uQIczpvgjS",
+"9iGoTQnJ1S","FNYIMbrhlQ","faHirAXpwE","4QMc97Ow5C","Ss0Zu0ao3l","POUYSW7cTs","wDajX1v5hH","xciqpCNHmv","y94nwTCgPp","0h1b18RCUA",
+"ZhwG1JRJQB","AOgEeCfgr3","TwanoC2Irc","iB08l14FLR","3weIFrz7Ut","QnJ1S8FmFH","bZLvSW7cTs","FFDuiNxx9V","3otm6D6rBy","cQOnvJ2mQi",
+"o8Uydm4bxU","FhtgljeskS","XyPZNFhtgl","OHaBzzbIYY","yvOMIprNT6","55rfBECMvU","NcICAUlU3M","pT8wuUlU3M","pAhR1WPmlx","dpe1vMaJQs",
+"uLtKsFjHXR","QChxsStlDJ","FNYIMMaJQs","7hyVvAmdQd","GWqqXZUnqt","4QMc9MGlTF","NOHsz64s8N","BpYhVyofH3","RsQUqX6Pin","JkzUnkB5nP",
+"l83UdC2Irc","ECMvUFNYIM","faHir8hJdt","pAhR1Cfgr3","9iGoTrKDLJ","Vprf2zz4ZU","ni2v1okgRi","fcJOyIBe8k","NOHsz4dEz6","kB5nPoVQp6",
+"8cVD3Oz8yZ","jfREukB5nP","StlDJjfREu","atef2ZzJHW","v8yFNvLsmS","rKDLJDz1R3","s93MldhSuH","Cfgr34dEz6","5ZaEznFqik","CNHmvyvOMI",
+"8RCUA55rfB","EdBKcYOfrY","7fsYMYw2oU","n1pmORmDcr","hYBCK7lUXZ","yluBxe6e4z","ix74rtvdkD","GSQwjvLsmS","oVQp6DcpWB","ix74rhSSvQ",
+"C2IrcCqqaD","JkzUnPOUYS","ulk414W0Tl","L7cGcguMb8","JKWYR9eoRc","FFDuiJ2mQi","7X3uy5iGN5","VNCPdNhXdu","FhtglpvgjS","Uvlv4atef2",
+"FxX9qtlILt","8U2nUFxX9q","8FmFHXflUq","aL6AJFLsph","FFDuiW7cTs","lweGyMmsIo","b29RJv1Hln","7hyVv0h1b1","djsrv4QMc9","QChxsuvf7A",
+"v2eC32Nslm","9iGoT48cHL","2TRI74QMc9","ksJbyzmLYD","5IhmGWaWsv","L7cGcNcICA","M3zXLjeskS","8hJdtwiHrZ","gf8rIru4UG","OUqFMChuy3",
+"dQ586QChxs","GXdoHIKxdL","rKDLJNAFuw","J2mQiDQimp","hUTw7atef2","pAhR1gtCA5","brhlQxReec","FNYIMe6e4z","OHaBzaFFss","i7WMQbZLvS",
+"s7MxkXflUq","CxVEfAOgEe","soy9t5Drn0","zQt6QNo0Qb","K20wKFGzgp","CqqaD9eoRc","QssNCLbRTH","CNHmvzz4ZU","b29RJ8cVD3","zHF1qYOfrY",
+"e6e4zQChxs","JJs5mRsQUq","mz8gx5Namm","lkMUAwiHrZ","4QMc9WreyP","dhSuHQClRL","5Mg9rcmXIX","n8pJ95iGN5","s93MlMezSW","zFgtBXyPZN",
+"aL6AJjtn0X","64s8N7fKYU","uAWypCIShG","xXTI4Rxrsm","ix74rgIYvE","XyPZNblLA9","QnJ1SMezSW","d7vjMjS1aj","8TxD77lUXZ","zz4ZUDz1R3",
+"2DREszbIYY","K4GS8CK5W7","4dEz6CIShG","prNT65iGN5","tlILt5IhmG","ZUnqtiqv4k","ru4UGCp3mZ","lpF6W9XyT9","0YAGHblLA9","zY1GYHfyNQ",
+"F6PT23weIF","l83UdF6PT2","lkMUAuvf7A","G1RhSECMvU","yluBxSjskQ","Ul4a1cQOnv","v2eC3wDajX","s93MltAOsr","TwanoFnPFB","FFDuiZv7z0",
+"AgJHQhe9IA","9y4lwDcpWB","y94nw1v5hH","NOHsz8cVD3","JKWYRZhwG1","DLhzMVIlwP","RsQUq0ao3l","5IhmGGv3Fq","W3VFHQClRL","pAhR1Oz8yZ",
+"W7cTs618Di","tlILtBGaQY","HRxd89eoRc","oGu6xlCMxy","i3pydaDGtS","HRxd8LbRTH","azIWpW7cTs","C2IrcvOqCE","0ao3lpvgjS","0YAGHBpYhV",
+"O3iyQ618Di","OUqFMFjHXR","LewvMIjTwP","t98iWxciqp","fcwDa0BmCy","IKxdLYOfrY","guMb8NOHsz","RpBQmuPX7G","s7MxkWDVWJ","t59lR0YAGH",
+"FVMxoDLhzM","SWfouWPmlx","tjQxsKr8ys","a00b50MR5X","uAWypZv7z0","AkKTktuDyS","6q6L9CxVEf","n1pmOAIYUu","s4786BFkb8","VLTy64W0Tl",
+"aFFsslXFOB","No0Qbatef2","AOgEes93Ml","fcwDaJkzUn","W3VFHWreyP","POUYSLbRTH","dmoS7In3NS","6AFT0Dz1R3","WreyPs4786","EoToPY1mC0",
+"F6PT2WDVWJ","QWxoTcQOnv","RBhp0DG4sT","1LB1LTwano","n8pJ9qQxHP","0Wr5ynnP8o","PYBf4jiVBP","9rlg9W7cTs","StlDJUvlv4","PYBf4K20wK",
+"lsQGoZJTXH","7fKYUVBjhz","7fsYM0Kyfs","qUJMdJkzUn","In3NSX6Pin","tvdkDRpBQm","hi5X7x3LDe","guMb88cVD3","fFDrJb29RJ","B3qem2TRI7",
+"RmDcrqaofN","Ta8f6ZJTXH","euZA5KZamH","JKWYRFhtgl","gdQsSeuZA5","ulk41lH1kt","FjHXROHaBz","8U2nU8hJdt","Yf2Ec0BmCy","kZANmyvOMI",
+"bZLvSrhl0J","WreyPa00b5","fqypyuLtKs","n8pJ98hJdt","kB5nPhi5X7","gf8rIydG8U","atef2BFkb8","4QMc9m4bxU","gIYvElj07Q","F6PT2gdQsS",
+"jeskSRzaZA","RzaZAnFqik","pT8wuzFgtB","AOgEecmXIX","GrDg7iqv4k","lsQGofmIK1","d7vjMjzUqR","lpF6W6q6L9","GXdoHIjTwP","4W0TlPYBf4",
+"ciuWzzqH0W","IKxdLlj07Q","QWxoTIn3NS","D6rByIKxdL","qQxHPBGaQY","M6qcGs4786","uN6r3Rxrsm","tuDySgjUTu","fLNg8HzZT8","t59lRhi5X7",
+"aL6AJG1RhS","55rfBv2eC3","QssNCO3iyQ","KZamHFVMxo","Zv7z0HP433","6q6L9zqH0W","LbRTHjS1aj","MezSWIn3NS","4W0Tl7fsYM","zz4ZUmz8gx",
+"6q6L9EdBKc","EdBKcjS1aj","FLsphiB08l","JRJQBl83Ud","OHaBzWaWsv","TwanocmXIX","4QMc9lj07Q","L7cGcNAFuw","oGu6xJ2mQi","StlDJzQt6Q",
+"MmKGJHlUbF","WmadAokgRi","VBjhzYjB9t","DcpWBHfyNQ","TCgPplj07Q","618Dirhl0J","FjHXR9rlg9","iKqhrzz4ZU","uoStwBbwgA","XyPZN8FmFH",
+"gjUTux3LDe","dQ5867ku1p","ru4UGuAWyp","pvgjS7ku1p","zqH0WtvdkD","Pb1paHRxd8","x3LDebZLvS","5iGN5WmadA","SjskQW3VFH","jzUqR5nmWv",
+"pvgjSJRJQB","gIYvEhi5X7","ZJTXH48cHL","jeskSQ6Lix","kZANmTa8f6","M3zXL8U2nU","i7WMQqUJMd","hYBCKZhwG1","2Yz7Edjsrv","jeskSWDVWJ",
+"FVMxoRmDcr","14FLR618Di","7lUXZVerEA","7lUXZDz1R3","RsQUqEdBKc","lCMxyNcICA","zHF1qRxrsm","Vprf25IhmG","uPX7G1v5hH","FhtglWMiS3",
+"0YAGHuupzk","M6qcGW7cTs","DQimpYOfrY","rhl0JfcJOy","4QMc99XyT9","pFrrl29QAz","lXFOBqUJMd","cQOnvxXTI4","uN6r3F6PT2","Gv3FqlkMUA",
+"RACujYh1hF","GSQwjy94nw","yluBxStlDJ","MGlTFlH1kt","qaofN9rlg9","iwzGk618Di","Gv3Fqfqypy","ru4UGBCxeC","yToGWprNT6","LDk6flsQGo",
+"9eoRcS77LH","okgRiO3iyQ","CqqaD6AFT0","YjB9t14FLR","d7vjMCdyBV","brhlQprNT6","uAWypMmsIo","2Yz7EpmeCd","IKxdLmz8gx","ECMvUBGaQY",
+"3weIF9rlg9","d85a9jiVBP","7X3uyK20wK","HzZT8618Di","fcJOyOz8yZ","ix74r8cVD3","zbIYYrKDLJ","FjHXRkZANm","SWfouB3qem","KZamHpmeCd",
+"LbRTHNOHsz","uTacxCIShG","uZPqgWDVWJ","LDk6fhUTw7","WPmlxW7cTs","uAWypjeskS","yvOMIi3pyd","zmLYDQClRL","JXljWQWxoT","cQOnvjiVBP",
+"NOHsz6q6L9","FGzgptaOXK","0BmCydQ586","Yw2oUOz8yZ","t59lRBFkb8","RxrsmKASQ8","HP433MGlTF","IKxdLQworu","FNYIMx3LDe","pvgjSOHaBz",
+"NAFuwuTacx","I7p2aPb1pa","AmdQdGXdoH","0h1b15nmWv","TCgPpWMiS3","lj07Q9y4lw","5VZjSMezSW","h1zcH2hEEU","FnPFBwDajX","dpe1vzbIYY",
+"K20wKGWqqX","DLhzMJJs5m","lm0pDC2Irc","fFDrJOxWIH","cShY2CdyBV","atef2QbxXc","DQimpFVMxo","0BmCye6e4z","GSQwjFnPFB","uJScXyToGW",
+"FxX9qO3iyQ","9rlg9FVMxo","oVQp6jtn0X","mX2GEWmadA","gdQsSrhl0J","Q6hMCSs0Zu","oGu6xECMvU","he9IAcmXIX","1LB1Liqv4k","EoToPlsQGo",
+"4QMc9ZJTXH","QssNCqaofN","5IhmGBFkb8","gdQsSdjsrv","POUYSMGlTF","Rxrsmuvf7A","HlUbFd85a9","7fKYUTCgPp","dmoS7SmGzv","mX2GEAgJHQ",
+"okgRis7Mxk","y94nwTwano","OUqFMwDajX","16lHciwzGk","3otm68RCUA","s93MlWaWsv","k85Ae4QMc9","yToGWMojnP","6AFT05VZjS","dpe1vQWxoT",
+"lViBvM3zXL","W7cTsWreyP","taOXKFcWrW","CxVEfhE1Ql","ni2v1IRh48","M3zXLIn3NS","0YAGHmX2GE","5IhmGCNHmv","Q6Lixulk41","vkCHHQWxoT",
+"yvOMIJkzUn","5drc6JRJQB","a00b5tAOsr","FNYIMJkzUn","nnP8o16lHc","WDVWJIRh48","5VZjSni2v1","4dEz6lkMUA","3weIFksJby","vkCHHpvgjS",
+"guMb8taOXK","FcWrWOxWIH","cQOnv6AFT0","YOfrYyToGW","9XyT9Chuy3","LewvMo8Uyd","M3zXL8xEKz","CK5W7IjTwP","ni2v1QClRL","Cp3mZ2ZHdk",
+"Uvlv45nmWv","No0QbvkCHH","FFDuipWiOs","FxX9q29QAz","OxWIHcQOnv","m4bxUlweGy","aL6AJMkgy8","iwzGkGSQwj","W3VFHOUYuF","AmdQdMGlTF",
+"7X3uyDz1R3","5iGN5FPfSE","0BmCyFcWrW","dpe1voVQp6","SWfouHlUbF","QssNCEdBKc","7ku1prKDLJ","yToGWoGu6x","ZuDtDJJs5m","Z4I1vCfgr3",
+"n8pJ9aez9y","UmaEv07n1c","aDGtScL0aE","CIShGWMiS3","7ku1pd7vjM","FwEJzoVQp6","ZzJHWTXQ0Z","GrDg7sqVrf","9iGoTGSQwj","yvOMIpmeCd",
+"d7vjMNo0Qb","48cHL0Kyfs","HlUbFMaJQs","AkKTkVLTy6","tjQxszz4ZU","xciqptAOsr","CNHmvJ2mQi","FPfSEhe9IA","azIWpCqqaD","QnJ1SS77LH",
+"cQOnvRxrsm","Kr8ysTXQ0Z","5Mg9r8xEKz","45cIHru4UG","Vprf22TRI7","4QMc9cShY2","fcJOyfcwDa","EOE1olsQGo","8FmFHMkgy8","CK5W71LB1L",
+"mX2GE0BmCy","fcwDaiB08l","Yf2Ec0MR5X","Uvlv4hi5X7","FPfSEQbxXc","YOfrYFFDui","0Wr5yU3yw5","uN6r3YOfrY","fcwDa0Wr5y","FLsphuZPqg",
+"POUYSFVMxo","hi5X7J2mQi","S2DfuhSSvQ","GXdoHbZLvS","5IhmGOHaBz","yluBxRACuj","jS1aj0YAGH","aDGtSMkgy8","uZPqgK4GS8","SWfou5VZjS",
+"h1zcH7Ow5C","aez9ylpF6W","24ARFyvOMI","zY1GYhe9IA","FPfSEprNT6","FjHXRQworu","NOHszdQ586","Cfgr3JIqXi","s4786Yf2Ec","NOHszXyPZN",
+"zbIYYhUTw7","LbRTHU3yw5","iwzGkciuWz","hYBCK5ZaEz","07n1cFjHXR","4W0Tl0PktI","4W0TlRxrsm","StlDJrz7Ut","KASQ8k85Ae","0ao3lBpYhV",
+"vkCHHFVMxo","pWiOsRBhp0","d7vjMv2eC3","DLhzMyofH3","MojnPRpBQm","jiVBPTa8f6","5IhmGv2eC3","5Drn00Wr5y","StlDJxReec","iqv4kiB08l",
+"jeskSHzZT8","fLNg8VerEA","VBjhzvkCHH","zz4ZUpFrrl","suY4x48cHL","jfREus7Mxk","lkMUAJJs5m","07n1cMK07Y","cmXIX9iGoT","l83UdlXFOB",
+"dhSuHi7WMQ","7hyVv9GXkX","lkMUAOz8yZ","HRxd8jiVBP","Mm8siHzZT8","7X3uyEdBKc","hYBCKEoToP","Waim6pFrrl","No0QbThjNn","LDk6f24ARF",
+"9GXkXqUJMd","Waim6zQt6Q","QClRLVNCPd","1v5hHK4GS8","5VZjStvdkD","HRxd87X3uy","hi5X72hEEU","suY4xVprf2","AIYUuWMiS3","fmIK1QWxoT",
+"b29RJQWxoT","uPX7Gsoy9t","VerEAt98iW","WaWsvkB5nP","8TxD7aDGtS","CIShGOHaBz","YOfrYRmDcr","v2eC31j5L8","MmKGJnFqik","4dEz6IBe8k",
+"jeskSWPmlx","vLsmSOUqFM","Ta8f6K20wK","9eoRczY1GY","NcICAlViBv","lViBv16lHc","fcwDaulk41","Cfgr3BbwgA","5VZjSDQimp","K20wKdmoS7",
+"tlILtIKxdL","AmdQdS2Dfu","CIShGx3LDe","VerEAwDajX","No0Qbdjsrv","piJSk7fKYU","7X3uyyofH3","iB08ldhSuH","1LB1LO3iyQ","vkCHHG1RhS",
+"WPmlxoVQp6","5Mg9r0BmCy","IjTwPEOE1o","2TRI7b29RJ","yEfy9Uvlv4","y94nwmX2GE","fqypy55rfB","ciuWzAmdQd","HRxd8MK07Y","fmIK1FPfSE",
+"2NslmpWiOs","jiVBPRsQUq","aez9yVIlwP","uTacxFPfSE","IjTwPhi5X7","Waim6gf8rI","v2eC3tvdkD","CIShGVprf2","2Nslmv8yFN","vkCHHxciqp",
+"Uvlv4okgRi","aez9yX6Pin","JJs5m2Yz7E","uAWypYf2Ec","s7Mxk0ao3l","5Mg9rvkCHH","ZUnqtcQOnv","RsQUq9XyT9","zz4ZUEdBKc","580YDRkQke",
+"Yh1hFuupzk","gjUTuOxWIH","No0QbFcWrW","JKWYRZv7z0","POUYSYOfrY","TwanojzUqR","FLsphEOE1o","kZANmuQIcz","5drc60YAGH","AmdQdl83Ud",
+"TCgPp2Yz7E","hE1QlzQt6Q","lsQGoKsjRK","hi5X7OxWIH","MezSWpT8wu","aDGtSn1pmO","tlILtuAWyp","EOE1oQ6Lix","rz7UtYjB9t","8xEKztl72W",
+"s93MlkB5nP","zY1GYFPfSE","SWfougf8rI","LewvMLDk6f","Nxx9VTa8f6","W3VFHG1RhS","rhl0JHzZT8","lViBvGWqqX","IBe8kK20wK","8RCUAkZANm",
+"fcJOyZhwG1","s7Mxk9eoRc","hUTw7L7cGc","GSQwjPOUYS","O3iyQcL0aE","IjTwP5Mg9r","t59lR24ARF","uvf7AdQ586","zY1GYKsjRK","AIYUu7fsYM",
+"1j5L8jfREu","2Yz7EpWiOs","FPfSETwano","618DiCNHmv","DQimpSjskQ","TXQ0ZhSSvQ","OUYuF3otm6","AOgEeK20wK","LewvMbZLvS","lj07QjeskS",
+"ix74rYf2Ec","s4786FPfSE","I7p2apAhR1","Yf2EcLDk6f","6q6L9ciuWz","KZamHSWfou","Z4I1vQClRL","9rlg9Mkgy8","WaWsvVjCZq","RkQkeuQIcz",
+"lpF6W5Namm","RsQUqJRJQB","QClRLIBe8k","sx5GlWaWsv","iB08ldmoS7","9iGoTWmadA","ReKEWuJScX","i3pydUmaEv","5iGN5XflUq","1j5L8brhlQ",
+"LewvMX6Pin","uupzkjS1aj","2TRI72DREs","vkCHHiwzGk","tjQxsbZLvS","FGzgpRBhp0","tAOsrRzaZA","oVQp6okgRi","hSSvQ07n1c","cL0aEtaOXK",
+"5IhmGMK07Y","jfREudmoS7","In3NS8cVD3","ZuDtDcQOnv","lsQGodpe1v","6AFT0MaJQs","UlU3M0YAGH","Q6hMCl83Ud","lkMUAU3yw5","4W0TloGu6x",
+"Cfgr35VZjS","5Mg9rpmeCd","1LB1LguMb8","IBe8kDG4sT","pFrrlksJby","ZzJHW0h1b1","blLA9suY4x","CK5W7RACuj","gIYvEpv0i7","e6e4zLewvM",
+"suY4xAkKTk","FVMxowDajX","C2IrcJIqXi","TCgPpXyPZN","AXpwES2Dfu","i7WMQFPfSE","rz7Utb29RJ","HP433jzUqR","dpe1vulk41","0ao3lVNCPd",
+"QworuMmsIo","lXFOB7fsYM","fcJOyJ2mQi","gf8rIuoStw","vLsmSuTacx","Ta8f6OUYuF","TCgPp5ZaEz","jzUqRmX2GE","Q6hMCJRJQB","xciqpAXpwE",
+"ni2v1618Di","l83UdRACuj","gdQsSRsQUq","pFrrlLewvM","9eoRcThjNn","55rfBIKxdL","FPfSEyEfy9","aez9ys93Ml","DG4sTiwzGk","Qworudpe1v",
+"ru4UGIn3NS","yEfy97hyVv","M6qcGt59lR","MGlTFWMiS3","Yw2oUazIWp","K4GS8Q6hMC","IRh480h1b1","lm0pDWreyP","IjTwPZv7z0","07n1cxXTI4",
+"e6e4zdhSuH","2TRI78RCUA","guMb80YAGH","atef25Namm","uoStwni2v1","tuDySCNHmv","YjB9ta00b5","QChxsSmGzv","TCgPpblLA9","RpBQmNxx9V",
+"ix74rRsQUq","faHiruZPqg","euZA55Drn0","uQIczdhSuH","5Mg9rZUnqt","lH1ktTwano","ReKEWfcJOy","jeskSW7cTs","Mkgy8lkMUA","CxVEfJ2mQi",
+"GXdoH5Drn0","zmLYDzY1GY","W7cTsjzUqR","W7cTsrhl0J","bZLvS64s8N","hi5X7jeskS","B3qeme6e4z","UmaEvDG4sT","uQIczpT8wu","aFFssdhSuH",
+"FPfSEaFFss","5iGN5ReKEW","dmoS7Oz8yZ","yEfy90h1b1","DG4sT7Ow5C","JRJQBKr8ys","14FLRgdQsS","In3NSPOUYS","fcJOyni2v1","gf8rISbRYy",
+"fcJOyo8Uyd","CNHmvlsQGo","gIYvEjtn0X","hYBCKRmDcr","lkMUAIn3NS","wDajXjiVBP","tAOsruLtKs","POUYSrz7Ut","FNYIMVNCPd","U3yw5RBhp0",
+"uTacxpiJSk","jiVBPbrhlQ","GWqqXRACuj","fmIK1s93Ml","xReecFjHXR","yvOMISs0Zu","yEfy916lHc","lm0pD24ARF","gf8rItvdkD","ix74rQnJ1S",
+"zY1GYuAWyp","hi5X7Qworu","7fsYMt59lR","OUYuFcmXIX","SjskQNAFuw","e6e4zMK07Y","wDajXDcpWB","fqypyBGaQY","qUJMdEoToP","VerEA8RCUA",
+"S2DfuuAWyp","I7p2aF6PT2","CxVEf8TxD7","SmGzv45cIH","tAOsr0ao3l","Dz1R3RkQke","xReecZUnqt","Yw2oU0Wr5y","jeskS2ZHdk","29QAzGSQwj",
+"lm0pDSbRYy","29QAzyofH3","2NslmMaJQs","1LB1LUmaEv","Ul4a1soy9t","UmaEvpvgjS","cShY2uLtKs","C2Ircd7vjM","yvOMIgf8rI","0BmCyC2Irc",
+"uPX7GfcJOy","2Yz7ElsQGo","gdQsSyofH3","LewvMguMb8","EoToPVprf2","e6e4zlViBv","QssNCQChxs","I7p2aUmaEv","POUYSNo0Qb","FjHXRjzUqR",
+"HRxd8MezSW","mz8gxRzaZA","jS1ajs4786","Ul4a1AIYUu","vkCHHqaofN","1v5hHFjHXR","HRxd82Yz7E","LbRTH7fKYU","S2DfuYf2Ec","0YAGHFGzgp",
+"zFgtBFLsph","hE1QlY1mC0","zbIYYF6PT2","GrDg7SmGzv","tuDyShUTw7","jtn0XO3iyQ","uLtKsVBjhz","8FmFHFhtgl","QWxoTAOgEe","ni2v1ogLgc",
+"oQ87r5VZjS","suY4x7fsYM","i7WMQpAhR1","yToGWHfyNQ","CIShGKZamH","0h1b1jS1aj","7fsYMfqypy","Rxrsm0ao3l","uTacxjeskS","SmGzvpT8wu",
+"8RCUAtvdkD","a00b5okgRi","5nmWvECMvU","atef2ni2v1","euZA5pv0i7","M3zXLFVMxo","MmKGJB3qem","lm0pDoGu6x","atef2JRJQB","cShY2WDVWJ",
+"0KyfstjQxs","gf8rIWDVWJ","gIYvEzQt6Q","bgJAzsoy9t","Yw2oU8U2nU","55rfB0Wr5y","hE1QlksJby","5NammCK5W7","UlU3MkB5nP","OxWIHG1RhS",
+"RkQkejS1aj","WaWsvjiVBP","4W0TlNo0Qb","IBe8kNxx9V","JXljWCNHmv","ru4UGlweGy","ogLgcMm8si","DcpWBMojnP","nlaBy4QMc9","MaJQsFPfSE",
+"hE1Qltl72W","CxVEfAkKTk","o8Uyd2TRI7","prNT6P6bcg","RBhp0Ta8f6","7X3uyJRJQB","XflUqSbRYy","xXTI4LewvM","NhXduQ6hMC","lweGyOUYuF",
+"lm0pD0BmCy","0BmCyKr8ys","5Mg9rWmadA","mz8gx8hJdt","0BmCy0YAGH","9GXkX14FLR","VerEA7hyVv","v1HlnAXpwE","lm0pDTCgPp","9GXkXS77LH",
+"MK07Y5ZaEz","VerEAkB5nP","Ss0Zu5Drn0","lsQGofFDrJ","fcJOyuvf7A","6AFT0cShY2","QWxoTRsQUq","FjHXR9GXkX","prNT6AgJHQ","5Mg9rHP433",
+"tvdkDhe9IA","s4786MK07Y","dhSuHiKqhr","iqv4kMkgy8","RkQke0ao3l","55rfBWMiS3","lweGy16lHc","VBjhzfmIK1","Mkgy8bgJAz","bgJAze6e4z",
+"I7p2aKr8ys","n1pmORACuj","FhtglUlU3M","hi5X7euZA5","GrDg7UmaEv","gf8rI2Nslm","uupzks4786","7ku1p0Wr5y","FPfSEydG8U","aFFssCp3mZ",
+"jfREuQ6hMC","uQIcziKqhr","3weIFazIWp","aDGtSW7cTs","VBjhz9GXkX","FPfSEhi5X7","suY4xyvOMI","D6rByfqypy","VLTy6s4786","CK5W7cQOnv",
+"mX2GEi7WMQ","0Kyfs29QAz","618DinlaBy","ZJTXHSmGzv","CNHmvcShY2","RBhp0hUTw7","MK07Yt98iW","RBhp0MezSW","Mkgy8FxX9q","IRh48i7WMQ",
+"0BmCy5ZaEz","xXTI4fmIK1","P6bcghE1Ql","Mkgy8zmLYD","GXdoHQbxXc","7fsYMjzUqR","LewvM29QAz","Ss0Zugf8rI","s7Mxki3pyd","jS1ajEoToP",
+"s93MlgtCA5","i3pydSjskQ","Ul4a1ksJby","RzaZAwiHrZ","m4bxUtaOXK","t59lRb29RJ","x3LDeJkzUn","0PktI7hyVv","JkzUnJKWYR","gdQsSxciqp",
+"VNCPdfFDrJ","he9IAEdBKc","tl72W580YD","okgRikZANm","ECMvUTCgPp","brhlQ16lHc","2TRI7GSQwj","BGaQYJXljW","JJs5mBCxeC","vLsmSuZPqg",
+"uJScXYw2oU","5ZaEz8xEKz","fFDrJqUJMd","bZLvS4dEz6","h1zcHWDVWJ","OUYuFrz7Ut","0KyfsFLsph","XflUqQbxXc","5Mg9rJXljW","VNCPdDLhzM",
+"5VZjSKZamH","ru4UGHP433","gIYvEuN6r3","GWqqXpWiOs","CNHmvuQIcz","tlILttl72W","F6PT2RpBQm","yofH39XyT9","sqVrfVBjhz","Nxx9VvLsmS",
+"CK5W7In3NS","pFrrlYjB9t","dhSuH7Ow5C","QChxsUl4a1","azIWpGXdoH","uN6r3P6bcg","uPX7GWmadA","S2Dfuzz4ZU","rz7Ut2Nslm","4W0TlCfgr3",
+"n1pmO0PktI","YjB9tJKWYR","QYxC05iGN5","8cVD3AgJHQ","zY1GYs7Mxk","8RCUAi3pyd","hi5X7Ss0Zu","9GXkXWreyP","AmdQdD6rBy","oGu6x48cHL",
+"JKWYRgtCA5","7Ow5CNhXdu","CIShGQChxs","G1RhSjSjS3","JJs5m4QMc9","hSSvQjeskS","0ao3lRpBQm","CNHmvC2Irc","ZJTXHzFgtB","fmIK1StlDJ",
+"lweGymz8gx","FPfSEKsjRK","JRJQBQYxC0","Pb1paQClRL","wiHrZVprf2","CxVEfa00b5","iB08l8FmFH","HfyNQ5ZaEz","o8UydlkMUA","rz7UtyofH3",
+"5nmWvQssNC","VLTy6Ss0Zu","prNT6xReec","Yw2oUoVQp6","4QMc9uLtKs","v2eC345cIH","CNHmvzY1GY","VLTy6zqH0W","MojnPmX2GE","jSjS34W0Tl",
+"4W0Tl2Nslm","lweGy8xEKz","RmDcrdQ586","UlU3M5iGN5","Ss0Zu24ARF","7Ow5CZJTXH","Ss0ZuIn3NS","6q6L9cShY2","MezSWyluBx","v2eC3EOE1o",
+"0BmCyBbwgA","5iGN57ku1p","CdyBV9rlg9","3weIFtuDyS","hSSvQ2hEEU","CxVEfpv0i7","MGlTFm4bxU","8xEKzCxVEf","45cIHI7p2a","QClRLlH1kt",
+"MGlTFzz4ZU","MGlTFMojnP","8cVD3aFFss","NhXducQOnv","7ku1pxXTI4","hYBCKFwEJz","FNYIMaL6AJ","JKWYRgdQsS","BCxeCyluBx","NcICApT8wu",
+"CIShGuLtKs","yvOMIpiJSk","ThjNnuPX7G","0BmCy618Di","gjUTuK4GS8","fcJOyEOE1o","No0Qb7Ow5C","yofH3y94nw","nFqik9GXkX","v1HlnY1mC0",
+"8xEKzokgRi","0BmCysoy9t","s7MxkZv7z0","uAWypuAWyp","iKqhrlweGy","CNHmvSWfou","ReKEWMkgy8","Mm8si8RCUA","Mkgy864s8N","lsQGonnP8o",
+"euZA5jzUqR","LbRTHNhXdu","XflUqRpBQm","5Drn0cQOnv","M3zXLJXljW","MmKGJUvlv4","WreyP7fKYU","FnPFBRsQUq","Dz1R36AFT0","D6rBy7X3uy",
+"5Nammt98iW","HP433J2mQi","618DiiwzGk","wDajXguMb8","pT8wugtCA5","cL0aELbRTH","lsQGoDz1R3","O3iyQNhXdu","oQ87rokgRi","v2eC3lXFOB",
+"0Wr5yNhXdu","NAFuw5nmWv","pAhR1aFFss","XyPZNokgRi","UlU3MC2Irc","soy9t1v5hH","5drc6YjB9t","BpYhVfqypy","QbxXciB08l","VBjhzpT8wu",
+"580YDgjUTu","qUJMdWreyP","5Mg9rMezSW","Cfgr3he9IA","FGzgp0Wr5y","NOHszUvlv4","BGaQYoQ87r","Mkgy8HP433","gIYvE8xEKz","W7cTsuZPqg",
+"VLTy6RACuj","Zv7z0hE1Ql","KZamH9iGoT","RkQke48cHL","64s8NlweGy","LbRTH0MR5X","MaJQsZ4I1v","mX2GE2TRI7","cmXIXrz7Ut","16lHc8RCUA",
+"taOXKi7WMQ","pvgjSiqv4k","Cp3mZpWiOs","QbxXcS2Dfu","wDajXFGzgp","Fhtgl8RCUA","Nxx9V5IhmG","lH1ktYf2Ec","1v5hHLDk6f","VIlwPRpBQm",
+"GWqqXmz8gx","HlUbFyluBx","OUYuFYh1hF","5VZjSJKWYR","LewvMjzUqR","14FLR1LB1L","rhl0JAkKTk","0h1b1jtn0X","vOqCERxrsm","GSQwjYOfrY",
+"lkMUAWPmlx","ECMvUW3VFH","s4786HRxd8","WMiS3QWxoT","HfyNQOUYuF","QClRLNxx9V","wiHrZKZamH","QClRLHfyNQ","dQ586lH1kt","qaofNGv3Fq",
+"Yf2EctuDyS","64s8NgdQsS","0Wr5ylweGy","GrDg78TxD7","JIqXin1pmO","gIYvEpAhR1","aDGtSkB5nP","UmaEvlm0pD","fqypyThjNn","Yw2oU5drc6",
+"SjskQBpYhV","Mkgy8nnP8o","gjUTuXflUq","fmIK1RsQUq","Ta8f6hSSvQ","D6rBySs0Zu","WaWsv4W0Tl","jSjS3XflUq","Y1mC0AmdQd","7fKYUUmaEv",
+"ni2v1uvf7A","oVQp6JkzUn","lH1kt8RCUA","5iGN5oQ87r","QbxXcokgRi","Zv7z0MGlTF","BpYhVZ4I1v","ECMvUn8pJ9","3weIFFxX9q","NhXduCdyBV",
+"jSjS3Mkgy8","lpF6WFnPFB","nlaByQssNC","8hJdtBCxeC","7fsYM0YAGH","Nxx9VyEfy9","hi5X7C2Irc","W3VFHfcwDa","OUYuFOUqFM","5ZaEzdpe1v",
+"ZhwG18TxD7","7ku1puupzk","8RCUA9iGoT","UlU3MlkMUA","kB5nPix74r","AgJHQJIqXi","AkKTkFNYIM","MGlTFStlDJ","SWfouOUYuF","Yf2Ecdpe1v",
+"jeskSRpBQm","KsjRKzbIYY","gjUTuF6PT2","lsQGoFjHXR","Yw2oUxXTI4","0YAGHcmXIX","lH1ktQ6hMC","OxWIH0MR5X","dhSuHdQ586","e6e4z4dEz6",
+"6q6L9e6e4z","gf8rIzbIYY","hUTw7CK5W7","dmoS7xciqp","uLtKsbZLvS","Fhtgl16lHc","faHirqQxHP","5Mg9r5IhmG","7lUXZaez9y","iB08lEoToP",
+"DcpWBTwano","jzUqRVNCPd","9eoRc6q6L9","NhXduThjNn","uZPqgAmdQd","t98iW580YD","DQimpMmsIo","M6qcG7fsYM","J2mQiG1RhS","lsQGoD6rBy",
+"IRh48J2mQi","k85AedhSuH","IBe8kyToGW","5IhmGuZPqg","Vprf2cShY2","pAhR1yofH3","VerEApvgjS","NhXduUvlv4","ZzJHW5Drn0","XyPZNni2v1",
+"S2DfuQClRL","ZUnqtBFkb8","BpYhVYh1hF","Yf2EctaOXK","S77LHpmeCd","TCgPpuZPqg","StlDJjzUqR","piJSkwiHrZ","fcwDaa00b5","gIYvEZuDtD",
+"QssNC9eoRc","Nxx9VAgJHQ","HzZT8PYBf4","lj07QRmDcr","zqH0WAkKTk","zHF1q16lHc","xciqpazIWp","0Wr5ycQOnv","pFrrlprNT6","IBe8kjfREu",
+"64s8NS77LH","CNHmvPOUYS","BFkb8FxX9q","gf8rIs4786","rz7UtCfgr3","rKDLJcShY2","WPmlxStlDJ","9eoRcogLgc","Mm8sifqypy","zY1GYlpF6W",
+"RkQke0h1b1","8hJdtdjsrv","2hEEU1LB1L","QworuOHaBz","JIqXiMm8si","y94nwSjskQ","tuDySVIlwP","dQ586dQ586","Ta8f6KsjRK","JIqXisoy9t",
+"ZuDtD55rfB","4QMc9SmGzv","h1zcHcShY2","HP4335nmWv","EOE1oCNHmv","Ta8f6s93Ml","MGlTFzQt6Q","9y4lwiKqhr","7fsYMdmoS7","D6rBysuY4x",
+"KZamH2ZHdk","ThjNncL0aE","lj07QuTacx","oVQp6QbxXc","t59lRlsQGo","9eoRcHzZT8","blLA9uQIcz","5Mg9rMmsIo","AOgEeMojnP","tlILt5VZjS",
+"MmKGJni2v1","48cHL0BmCy","aDGtSVIlwP","hi5X7ECMvU","prNT62Yz7E","lm0pDHlUbF","vLsmS5VZjS","XyPZNKZamH","C2Ircs93Ml","Vprf2Y1mC0",
+"7fsYMm4bxU","QnJ1SK4GS8","FNYIMuQIcz","7ku1pDcpWB","xReeccL0aE","NcICA2Yz7E","EdBKc0YAGH","Ta8f6KASQ8","FPfSEsoy9t","v2eC30Wr5y",
+"Q6hMCpAhR1","VBjhz8xEKz","5Drn0faHir","xReecFhtgl","ogLgclj07Q","xReecVBjhz","Yf2Ec8hJdt","iwzGkpiJSk","lkMUAdjsrv","ZUnqttl72W",
+"Y1mC0xReec","8hJdtprNT6","faHirlViBv","lm0pDLDk6f","uQIczqQxHP","s93Ml8hJdt","oQ87rhYBCK","prNT6tvdkD","nnP8o24ARF","1v5hHgIYvE",
+"VNCPdciuWz","lViBvGXdoH","OUYuFFxX9q","FVMxo7fsYM","FwEJzX6Pin","aez9yfaHir","jtn0Xa00b5","ulk41Qworu","Uvlv41j5L8","FjHXRIKxdL",
+"BbwgAC2Irc","Gv3Fq618Di","2Yz7EMK07Y","tjQxsIKxdL","Waim6BGaQY","48cHLWaWsv","d7vjMPYBf4","Dz1R307n1c","8xEKzYjB9t","PYBf4KASQ8",
+"Kr8ysv8yFN","hi5X7BpYhV","s93Mln8pJ9","CK5W7DG4sT","oGu6xRzaZA","2DREsMezSW","d7vjMOxWIH","GrDg75iGN5","ZhwG1Yh1hF","QClRLY1mC0",
+"ulk41F6PT2","2TRI7BFkb8","AIYUu8TxD7","azIWpjeskS","xXTI4fcJOy","Rxrsm5Mg9r","iB08l580YD","tjQxs1v5hH","Z4I1vMGlTF","ciuWziKqhr",
+"StlDJuoStw","BGaQYGSQwj","KZamHmX2GE","euZA555rfB","0BmCyzQt6Q","SjskQHzZT8","HP433zmLYD","fqypytAOsr","yofH3ksJby","ECMvUKsjRK",
+"QChxsuJScX","d85a9UmaEv","t98iWAXpwE","prNT60PktI","L7cGc1v5hH","3weIFuvf7A","D6rByuLtKs","G1RhSVLTy6","bgJAzMojnP","HP4337X3uy",
+"jfREuSs0Zu","t59lRK4GS8","mX2GESmGzv","qUJMdyEfy9","Kr8yslH1kt","azIWpuoStw","zFgtBFPfSE","AkKTkbrhlQ","pWiOs5IhmG","Y1mC07lUXZ",
+"tvdkDKZamH","zQt6QTwano","hi5X7bZLvS","okgRiWmadA","gtCA5Y1mC0","8TxD7HfyNQ","WreyP0ao3l","Ss0Zu5nmWv","7X3uylweGy","POUYSlpF6W",
+"JKWYRaL6AJ","tvdkDM3zXL","W3VFHyEfy9","h1zcHY1mC0","nFqikTXQ0Z","2hEEUmz8gx","9iGoToGu6x","OUYuFs7Mxk","e6e4zjiVBP","B3qemFFDui",
+"SjskQzFgtB","RpBQmfcwDa","MezSWzQt6Q","IRh480Kyfs","pvgjS8TxD7","Z4I1vv8yFN","KsjRKlkMUA","uvf7AtvdkD","brhlQpiJSk","4W0TlVprf2",
+"lsQGo5ZaEz","MmKGJRpBQm","0YAGHAmdQd","gIYvERmDcr","uN6r3iKqhr","7ku1pP6bcg","zFgtB7ku1p","fqypy8xEKz","atef2FxX9q","0BmCy6q6L9",
+"yofH3MaJQs","J2mQiZJTXH","FxX9qAmdQd","y94nwprNT6","jtn0XFLsph","3weIFTa8f6","bgJAzGSQwj","8U2nUgIYvE","ZUnqt2ZHdk","2hEEU7X3uy",
+"RsQUqOxWIH","2ZHdk4dEz6","bgJAzK4GS8","Uvlv48RCUA","9GXkXdmoS7","0BmCymz8gx","AOgEepiJSk","dpe1vlXFOB","MGlTFuJScX","Oz8yZDz1R3",
+"P6bcgd7vjM","48cHLn1pmO","NAFuwP6bcg","AkKTkblLA9","64s8NCfgr3","lpF6WYw2oU","QworuEOE1o","S77LHtaOXK","FGzgp45cIH","7X3uyZJTXH",
+"wDajXPOUYS","m4bxUgjUTu","QnJ1SFjHXR","zFgtB2Yz7E","OUYuF0BmCy","VLTy6DLhzM","pv0i7ThjNn","UlU3Mrz7Ut","CNHmv48cHL","8U2nUVerEA",
+"8U2nUMaJQs","14FLRMojnP","Ul4a1Q6hMC","Kr8ysgtCA5","djsrvjS1aj","1j5L85VZjS","oGu6xQnJ1S","uAWyphi5X7","BCxeCZzJHW","xXTI4WDVWJ",
+"P6bcgFxX9q","hSSvQpAhR1","JXljWHlUbF","No0QbzFgtB","ix74rQChxs","0Wr5yv8yFN","KZamHFGzgp","pAhR1EdBKc","zz4ZU5Mg9r","zbIYY48cHL",
+"2Yz7EHlUbF","07n1c1v5hH","HlUbFuJScX","VIlwPnFqik","X6Pinn1pmO","d85a9ZhwG1","1v5hHJIqXi","2Yz7Eatef2","9rlg9dhSuH","i7WMQrhl0J",
+"l83UdUvlv4","QbxXcNxx9V","5drc6suY4x","fqypyDz1R3","v8yFNBGaQY","4W0TlnlaBy","QWxoTsqVrf","pT8wuUl4a1","RBhp0YjB9t","1j5L8RACuj",
+"CxVEfSmGzv","rKDLJyluBx","uAWyp4W0Tl","ni2v1ThjNn","ydG8UCxVEf","zY1GY9eoRc","PYBf4uQIcz","FVMxouJScX","kZANmzbIYY","RBhp0VNCPd",
+"B3qem5Drn0","AOgEedmoS7","2ZHdklViBv","lweGyTCgPp","UmaEvNo0Qb","vOqCEgIYvE","BCxeCM3zXL","s4786qQxHP","8FmFHMm8si","CNHmvnFqik",
+"x3LDeMGlTF","Dz1R3JXljW","dpe1vFPfSE","pv0i7zmLYD","FFDuixXTI4","Nxx9VcShY2","lXFOBtvdkD","fFDrJYw2oU","YOfrYoGu6x","SbRYyTwano",
+"hYBCKhe9IA","7ku1pVprf2","POUYSAkKTk","GXdoHwDajX","iwzGkVerEA","0ao3lAkKTk","djsrvFwEJz","pFrrl7hyVv","suY4x9XyT9","soy9t48cHL",
+"1LB1LYh1hF","0PktIRsQUq","QClRLazIWp","EoToPECMvU","0ao3lFwEJz","yluBxaFFss","M3zXLFGzgp","iwzGk8FmFH","Nxx9VlpF6W","4dEz6QClRL",
+"U3yw5M6qcG","ECMvURmDcr","0MR5X5Drn0","soy9tlsQGo","n1pmOQ6hMC","24ARFjS1aj","fqypydhSuH","hE1QlIRh48","FLsphCqqaD","9GXkXjS1aj",
+"yEfy9ciuWz","RmDcr48cHL","ciuWzyvOMI","0BmCyJXljW","n8pJ92Yz7E","PYBf42hEEU","sx5GljzUqR","Dz1R3qaofN","lsQGoRzaZA","DLhzMQ6hMC",
+"AXpwEhE1Ql","Yh1hFe6e4z","AkKTk14FLR","NhXdu2DREs","XyPZN8RCUA","uoStwVerEA","yvOMIZJTXH","CK5W78hJdt","dhSuHChuy3","v2eC3i3pyd",
+"tvdkDlH1kt","uAWypZhwG1","lweGyzz4ZU","DG4sTuvf7A","OUqFMzHF1q","UlU3M5nmWv","I7p2auAWyp","n1pmOYjB9t","lCMxylkMUA","pv0i7QClRL",
+"iwzGkjzUqR","s7MxktuDyS","yToGW9eoRc","0h1b1GSQwj","CNHmvLewvM","M6qcGb29RJ","dpe1vTwano","YOfrYsqVrf","MezSW8TxD7","ciuWzM3zXL",
+"uoStwJXljW","4W0TlpAhR1","n1pmO64s8N","EoToPpv0i7","5NammwDajX","gf8rIfaHir","blLA9zHF1q","7ku1piB08l","pWiOsMm8si","euZA5uZPqg",
+"45cIH2ZHdk","BFkb8EOE1o","xXTI4IRh48","sqVrfQ6Lix","M6qcGOUYuF","2Yz7EX6Pin","h1zcHpv0i7","vOqCENo0Qb","oQ87raez9y","kB5nP0h1b1",
+"ZzJHWTwano","DLhzMRpBQm","kB5nPnFqik","kZANmQssNC","9GXkXTwano","iwzGkcShY2","aL6AJP6bcg","GWqqXDLhzM","t98iWOUYuF","0KyfsL7cGc",
+"lsQGozQt6Q","DLhzMtlILt","t98iW8U2nU","Mkgy8YOfrY","B3qemYjB9t","9eoRccmXIX","vOqCEo8Uyd","kB5nP6AFT0","xReecs7Mxk","lm0pDzqH0W",
+"9GXkXQnJ1S","QWxoTBGaQY","ZzJHWzbIYY","oQ87rjiVBP","wiHrZqUJMd","NOHszFGzgp","MGlTFtvdkD","X6PinM6qcG","l83UdBFkb8","uZPqgZUnqt",
+"KASQ8v1Hln","b29RJ0h1b1","DQimpCdyBV","zqH0W5ZaEz","gtCA5gIYvE","lm0pDpiJSk","AkKTkAOgEe","GXdoH0h1b1","CqqaDAmdQd","ciuWzjSjS3",
+"J2mQiYh1hF","y94nwO3iyQ","5VZjSZ4I1v","zqH0WtuDyS","7Ow5CWaWsv","t98iWjtn0X","FhtglYw2oU","8FmFH0MR5X","hYBCKs7Mxk","KsjRKKr8ys",
+"hUTw70YAGH","8cVD3Mkgy8","aez9y4QMc9","pT8wuThjNn","d7vjMuvf7A","hi5X7aL6AJ","aDGtSSWfou","pT8wuNhXdu","Nxx9V16lHc","uvf7A5ZaEz",
+"45cIHkZANm","LewvMyEfy9","zbIYYSjskQ","ix74rFnPFB","e6e4z07n1c","jtn0XC2Irc","2DREsZJTXH","gdQsSWaWsv","UlU3My94nw","aez9yQnJ1S",
+"iKqhrxXTI4","M6qcGOz8yZ","n1pmOLDk6f","29QAz8hJdt","zmLYDFGzgp","i3pydnlaBy","JkzUnuvf7A","Q6LixVerEA","KASQ8BpYhV","FNYIMXyPZN",
+"ZJTXHZuDtD","BCxeCAkKTk","PYBf4rKDLJ","Uvlv4J2mQi","FnPFBmz8gx","dpe1vFxX9q","Vprf2jfREu","zHF1qNOHsz","gjUTuUlU3M","uN6r3Ta8f6",
+"rz7UtStlDJ","ulk41jS1aj","ix74rPYBf4","S77LHoVQp6","zbIYYEdBKc","uZPqgCIShG","y94nwn1pmO","lkMUAX6Pin","F6PT28RCUA","lweGyP6bcg",
+"DG4sTAIYUu","i3pydFPfSE","lpF6WMojnP","fqypyHlUbF","CdyBVDz1R3","NhXdus93Ml","zY1GY1j5L8","jiVBPLewvM","l83UddmoS7","Vprf2Vprf2",
+"8TxD7Gv3Fq","IRh48JXljW","yofH3mX2GE","FxX9qYf2Ec","0BmCyuAWyp","7fKYUY1mC0","45cIHoGu6x","t59lR07n1c","AgJHQFLsph","KASQ81v5hH",
+"JIqXi7fsYM","hE1QlMojnP","kB5nPRpBQm","xciqpfcJOy","2ZHdkiKqhr","Y1mC0lXFOB","ZhwG1suY4x","U3yw5tuDyS","qUJMddQ586","HP4332Yz7E",
+"gf8rIM6qcG","RmDcrCdyBV","b29RJtl72W","l83UdvLsmS","EdBKche9IA","FcWrWydG8U","C2IrcZhwG1","Cfgr3cShY2","K20wKEoToP","ZzJHWS77LH",
+"tuDySkB5nP","i3pydFhtgl","Q6hMCQnJ1S","BGaQYIKxdL","uAWypt98iW","t59lRx3LDe","HlUbF0ao3l","k85AeaDGtS","RpBQm14FLR","Qworus7Mxk",
+"he9IAsx5Gl","IKxdLWDVWJ","yToGWtuDyS","lm0pDCNHmv","AXpwE8U2nU","dmoS7QClRL","v2eC3O3iyQ","Ul4a1C2Irc","v8yFNjS1aj","x3LDe580YD",
+"uQIczAgJHQ","7ku1pYOfrY","tlILt7Ow5C","gjUTuo8Uyd","vLsmSuPX7G","uTacxv8yFN","WaWsvtjQxs","TCgPpsuY4x","VBjhzfqypy","29QAzUl4a1",
+"mz8gxuAWyp","yofH364s8N","2ZHdk0PktI","5NammQnJ1S","FwEJzuJScX","pvgjScL0aE","6q6L9IRh48","n1pmOkZANm","CdyBVuPX7G","MezSW3weIF",
+"pv0i7Yh1hF","zY1GYqUJMd","0h1b1oVQp6","pv0i7bZLvS","In3NSru4UG","Yh1hFMaJQs","5Drn0SbRYy","MaJQshe9IA","OUYuFtvdkD","QClRLKr8ys",
+"F6PT2NOHsz","O3iyQUvlv4","Cp3mZQ6hMC","CdyBV64s8N","cShY2zQt6Q","nnP8o7lUXZ","gf8rId7vjM","5VZjSjzUqR","M3zXLO3iyQ","yvOMIjfREu",
+"ZUnqtiB08l","Oz8yZsqVrf","KsjRKlsQGo","nlaByjeskS","jzUqR9GXkX","P6bcgVIlwP","2Nslmaez9y","Gv3FqWmadA","t59lR0BmCy","fqypyAXpwE",
+"n8pJ94QMc9","XyPZNAXpwE","Cp3mZ3weIF","ZzJHWAOgEe","GSQwjpvgjS","l83UdfFDrJ","ZhwG1FxX9q","taOXKO3iyQ","yEfy9azIWp","pv0i7lViBv",
+"24ARFsqVrf","FnPFB24ARF","zFgtByToGW","9eoRcAkKTk","v1Hlnrhl0J","OHaBzStlDJ","sx5Gl6AFT0","rhl0JZJTXH","AIYUugtCA5","GXdoHaL6AJ",
+"uvf7A07n1c","jeskS5drc6","LewvMuTacx","EOE1oWPmlx","sqVrfVjCZq","EdBKcDG4sT","Oz8yZAXpwE","VLTy6GrDg7","mX2GE4dEz6","LbRTHHzZT8",
+"8U2nUPYBf4","P6bcgjfREu","m4bxUzQt6Q","iwzGkVBjhz","StlDJRkQke","GXdoHpWiOs","brhlQtlILt","xciqpM6qcG","rKDLJMojnP","No0Qbn8pJ9",
+"mz8gxTXQ0Z","5nmWvEOE1o","hYBCKMaJQs","4dEz63weIF","J2mQiyluBx","sqVrfDQimp","t59lRni2v1","L7cGc7X3uy","9y4lwDG4sT","pFrrlCIShG",
+"0YAGHfcJOy","P6bcgQbxXc","S2DfukB5nP","brhlQuTacx","8xEKz4QMc9","lm0pDCIShG","vLsmSbgJAz","n8pJ9jtn0X","AkKTks4786","QnJ1Spv0i7",
+"hE1Qls7Mxk","gf8rI16lHc","zmLYD0Kyfs","JkzUn5nmWv","yToGWciuWz","bgJAzuvf7A","oGu6xrz7Ut","v1HlnuAWyp","ydG8U9y4lw","blLA91j5L8",
+"zQt6Q2Nslm","Dz1R3ThjNn","7fsYMpT8wu","IjTwPjS1aj","iwzGkhUTw7","uAWypVBjhz","FhtgllCMxy","8RCUA4W0Tl","ReKEWvOqCE","BCxeCVerEA",
+"Q6Lixn1pmO","8hJdt9y4lw","oVQp60Wr5y","sx5Gl7fKYU","soy9tBGaQY","gIYvE6AFT0","faHirhi5X7","EOE1obrhlQ","hE1Ql6AFT0","gf8rIuZPqg",
+"vOqCEQWxoT","Z4I1vvLsmS","nnP8oBGaQY","POUYS9y4lw","FNYIM6AFT0","ZzJHWWreyP","0BmCyIjTwP","PYBf4fFDrJ","hE1Ql4W0Tl","StlDJWaWsv",
+"K20wKPOUYS","oQ87rpiJSk","nlaByMkgy8","RzaZA0BmCy","gf8rIStlDJ","8U2nUpmeCd","uN6r3zFgtB","6q6L9dmoS7","WmadAy94nw","HRxd8ru4UG",
+"xXTI45VZjS","iKqhrKZamH","uPX7Gsx5Gl","uN6r3qQxHP","GWqqXciuWz","guMb8HfyNQ","2TRI7yofH3","nFqikMmsIo","VerEAaFFss","cQOnvlkMUA",
+"yluBxCdyBV","mX2GEqaofN","RACujGv3Fq","h1zcHvkCHH","zqH0WsqVrf","okgRiY1mC0","Cp3mZRxrsm","XflUqGWqqX","lH1ktn1pmO","kZANm07n1c",
+"8xEKziB08l","TCgPpFnPFB","RBhp0uN6r3","tAOsruvf7A","n8pJ9RkQke","QnJ1SpiJSk","AgJHQMm8si","guMb8cL0aE","TCgPp0Kyfs","Y1mC0qUJMd",
+"cQOnvFwEJz","s7Mxks7Mxk","s93MlPOUYS","618DiRxrsm","HfyNQSbRYy","k85AeoQ87r","RACujuoStw","v1HlnzFgtB","y94nwCfgr3","K4GS8JXljW",
+"DcpWBW3VFH","fqypyGrDg7","RxrsmjeskS","8xEKzk85Ae","pv0i72DREs","VjCZqEoToP","RzaZAWmadA","StlDJAmdQd","dmoS7v8yFN","iB08luTacx",
+"ReKEWhe9IA","Cfgr3Cfgr3","ReKEWM6qcG","5VZjSv1Hln","yEfy929QAz","qQxHPRsQUq","Oz8yZv8yFN","Nxx9VDcpWB","ZJTXHFjHXR","uTacxQChxs",
+"n8pJ9NOHsz","uvf7ADQimp","0ao3lWmadA","djsrvFhtgl","lCMxykZANm","XflUq5nmWv","W7cTs6AFT0","n8pJ9CqqaD","VLTy6o8Uyd","NhXduQnJ1S",
+"0h1b1IjTwP","FwEJzIRh48","zHF1qiKqhr","jeskSK4GS8","9eoRckB5nP","AXpwE1j5L8","dpe1vCdyBV","0h1b1JJs5m","jfREuIKxdL","48cHLVLTy6",
+"yofH3ciuWz","lH1ktBGaQY","Kr8ysJJs5m","W3VFHCfgr3","i3pydrhl0J","MmKGJlj07Q","Nxx9VWaWsv","hSSvQvLsmS","9eoRc9XyT9","VLTy6No0Qb",
+"Pb1pan1pmO","uQIczOUYuF","tlILtuZPqg","lpF6WMm8si","pv0i78U2nU","jfREuiB08l","soy9tguMb8","piJSkRsQUq","yofH3rz7Ut","FnPFB0h1b1",
+"pFrrlrhl0J","xReecKsjRK","WDVWJgjUTu","zQt6QOxWIH","5VZjSXyPZN","DG4sTlCMxy","VBjhzpiJSk","aez9yGXdoH","uZPqgni2v1","QssNClm0pD",
+"dmoS7WreyP","8FmFHqQxHP","FGzgpuoStw","2Yz7EMGlTF","jS1ajjeskS","CqqaDtvdkD","FnPFBF6PT2","MK07YFcWrW","8U2nU9XyT9","pFrrlIBe8k",
+"QYxC0HfyNQ","FxX9qoQ87r","HP433tAOsr","s7Mxk7Ow5C","Cp3mZt59lR","MK07Ylj07Q","x3LDedjsrv","pv0i7W7cTs","MK07YRBhp0","hSSvQKASQ8",
+"B3qemAXpwE","QssNCQ6hMC","9GXkXv8yFN","VjCZqStlDJ","9iGoTAkKTk","OxWIH7X3uy","wDajX0BmCy","2ZHdkNhXdu","6AFT08hJdt","aFFsscL0aE",
+"jtn0Xt59lR","s4786PYBf4","FxX9qECMvU","uQIcz8FmFH","fLNg8v2eC3","cShY25VZjS","ru4UGprNT6","8U2nUSmGzv","GWqqXsuY4x","7fsYMyEfy9",
+"cmXIXTCgPp","aDGtSjzUqR","NcICAReKEW","AXpwESjskQ","qQxHPkB5nP","ThjNnFGzgp","iB08lQbxXc","sqVrfZzJHW","KZamHMGlTF","K4GS8ydG8U",
+"bZLvSNAFuw","cmXIXpv0i7","zbIYYgf8rI","Yh1hFi3pyd","FNYIMnlaBy","yluBx8RCUA","8cVD3uoStw","ZhwG1Yw2oU","FFDuii7WMQ","faHirFLsph",
+"euZA5lsQGo","WaWsvzqH0W","Yw2oU1j5L8","fLNg8cQOnv","gIYvEix74r","U3yw5MmsIo","HRxd8WPmlx","J2mQiuAWyp","YjB9tulk41","RmDcrwiHrZ",
+"NAFuwQ6hMC","hUTw7M6qcG","FVMxot98iW","lXFOBJkzUn","5drc6fmIK1","tl72WWaim6","pmeCdlkMUA","9GXkXdjsrv","soy9ti3pyd","DcpWB48cHL",
+"ZUnqtRsQUq","gtCA5lweGy","8cVD3Uvlv4","GXdoHHfyNQ","GWqqXMm8si","VerEAUmaEv","CdyBVOz8yZ","Cp3mZAOgEe","fmIK1t98iW","Q6hMCFVMxo",
+"7hyVv7Ow5C","K4GS86q6L9","dhSuHDz1R3","QnJ1SzHF1q","aez9yVerEA","0ao3l6AFT0","WaWsvQWxoT","O3iyQt59lR","LbRTH2DREs","FnPFBjeskS",
+"uQIcza00b5","NAFuwCfgr3","UmaEvMezSW","W3VFHVIlwP","580YDBGaQY","tuDyS5iGN5","OxWIHX6Pin","aFFssS77LH","jzUqRMezSW","uJScXQYxC0",
+"QnJ1SO3iyQ","HRxd8fFDrJ","uAWypAXpwE","Waim6LDk6f","ydG8UvLsmS","PYBf4XyPZN","aFFss2Nslm","n8pJ9nlaBy","sqVrfjSjS3","5Mg9r14FLR",
+"ZUnqtk85Ae","Y1mC0VNCPd","ReKEWlsQGo","S77LHQChxs","RkQkeGrDg7","piJSkOUqFM","O3iyQQ6Lix","KZamHL7cGc","CdyBVh1zcH","zbIYY4QMc9",
+"D6rByogLgc","SmGzv9XyT9","IjTwPHzZT8","SWfouyofH3","5nmWvOz8yZ","fFDrJDG4sT","jeskSv1Hln","QbxXcMK07Y","jS1ajZv7z0","CqqaD3weIF",
+"sqVrf3otm6","4QMc9B3qem","9XyT9Nxx9V","FcWrWb29RJ","lXFOBSs0Zu","zmLYDWmadA","AIYUuuJScX","MGlTFF6PT2","iKqhrBCxeC","8TxD7nlaBy",
+"prNT6TCgPp","pAhR1hi5X7","XyPZNJXljW","DcpWBBGaQY","618DidmoS7","t98iWuTacx","VLTy6xciqp","xXTI4piJSk","nnP8os93Ml","qQxHPIKxdL",
+"Oz8yZfLNg8","i7WMQgdQsS","zQt6QpWiOs","ni2v1h1zcH","DcpWB45cIH","azIWpfcwDa","iKqhruQIcz","Cp3mZGSQwj","uTacxNcICA","vLsmSTwano",
+"v2eC3azIWp","OxWIHQbxXc","ZUnqtSbRYy","zFgtBjzUqR","BbwgA9GXkX","jzUqRZ4I1v","HzZT8AgJHQ","MmKGJK20wK","7fsYMQYxC0","cmXIXXyPZN",
+"yEfy9fcJOy","uTacxd7vjM","IRh487ku1p","8FmFHtl72W","AOgEe5VZjS","faHir0ao3l","Kr8ysuTacx","nFqiklViBv","vLsmSqaofN","SjskQ7fKYU",
+"9y4lwvOqCE","CdyBV0PktI","MmsIoogLgc","LewvMlXFOB","bgJAzSbRYy","ThjNn5iGN5","WDVWJtvdkD","No0Qbjtn0X","1v5hH3weIF","lweGyazIWp",
+"AgJHQbZLvS","zqH0WJRJQB","VNCPdS77LH","45cIHpvgjS","5iGN5uTacx","ni2v1X6Pin","Mkgy8FLsph","SjskQAIYUu","7X3uy6q6L9","kB5nPCxVEf",
+"BpYhVuvf7A","7ku1pQYxC0","iwzGkrKDLJ","v8yFNoQ87r","Cfgr3yofH3","NOHszSbRYy","wiHrZRBhp0","5nmWvZv7z0","xXTI4uLtKs","NcICAdpe1v",
+"uAWypRACuj","HlUbF0BmCy","k85AeQClRL","L7cGcdjsrv","Cp3mZxReec","AOgEejiVBP","xXTI4tl72W","bZLvSy94nw","QworutuDyS","fmIK1bgJAz",
+"IjTwPJRJQB","uPX7GIn3NS","Ss0Zu9GXkX","TCgPpkZANm","t59lRDz1R3","brhlQgdQsS","HzZT8ReKEW","xciqpbgJAz","faHirgdQsS","ECMvUblLA9",
+"MaJQsTwano","rz7Uth1zcH","Ta8f6HP433","55rfBKsjRK","Z4I1vfFDrJ","DG4sTvkCHH","e6e4zOz8yZ","vkCHH3weIF","FLsphyluBx","lCMxyCNHmv",
+"7X3uygjUTu","WmadAazIWp","uLtKsHRxd8","RBhp0JIqXi","mX2GEgtCA5","a00b5taOXK","K20wKKASQ8","AgJHQd85a9","gtCA5Vprf2","HP433JkzUn",
+"ciuWzS77LH","M6qcGVjCZq","2TRI7Q6Lix","FFDuiNAFuw","mz8gxpT8wu","48cHL14FLR","jeskS64s8N","sqVrfkB5nP","OUqFMMojnP","kB5nPO3iyQ",
+"OHaBzReKEW","BbwgAEOE1o","he9IAqUJMd","8U2nURpBQm","WMiS3HlUbF","i3pydQworu","9GXkXRACuj","BbwgASs0Zu","fcJOyl83Ud","VNCPdk85Ae",
+"C2IrcjzUqR","azIWpEOE1o","uupzkI7p2a","WmadAMmsIo","djsrvLbRTH","XflUqfqypy","prNT6tAOsr","iwzGkrz7Ut","KZamHQ6Lix","W7cTsP6bcg",
+"t59lRblLA9","dpe1vkZANm","QssNCvkCHH","POUYSiqv4k","euZA5MezSW","2hEEU1v5hH","ZzJHWMK07Y","azIWpuJScX","W7cTsHP433","uAWypGWqqX",
+"CIShGfLNg8","KZamHPb1pa","0Wr5ySmGzv","Kr8ysSs0Zu","JJs5m1j5L8","uZPqg8FmFH","ZzJHWpWiOs","VBjhzU3yw5","yEfy9D6rBy","CqqaDSs0Zu",
+"8FmFHs7Mxk","mz8gx8xEKz","kB5nPM6qcG","zFgtBdjsrv","9XyT9ECMvU","GrDg7QnJ1S","nnP8oK4GS8","FLsphpvgjS","brhlQdhSuH","rz7UtuJScX",
+"Mm8sis4786","PYBf49rlg9","MaJQsGv3Fq","lweGyDz1R3","Kr8ysRBhp0","OUqFMFhtgl","ReKEWHfyNQ","oGu6xTwano","xReecn8pJ9","uupzkP6bcg",
+"5ZaEz8FmFH","tl72WuAWyp","7X3uyuTacx","M3zXLRACuj","fmIK1uAWyp","QworuECMvU","rhl0JFPfSE","ix74ruTacx","v1HlnuPX7G","QYxC00YAGH",
+"fcwDauPX7G","IjTwPFwEJz","rz7UtgjUTu","lpF6WgjUTu","C2IrcqQxHP","MezSWWaWsv","U3yw59y4lw","zY1GYfLNg8","BbwgAaez9y","7ku1pguMb8",
+"lpF6WtaOXK","AgJHQbgJAz","Mm8sioGu6x","nlaByRBhp0","S77LHNhXdu","QnJ1SHzZT8","2ZHdkBbwgA","AgJHQ8FmFH","0PktIy94nw","lweGyOz8yZ",
+"e6e4zJkzUn","AXpwELewvM","gf8rIqQxHP","suY4xksJby","lm0pDpv0i7","zQt6QRpBQm","WmadANAFuw","BpYhVQ6hMC","Zv7z0QChxs","lweGyhE1Ql",
+"TXQ0ZnlaBy","JIqXid7vjM","VjCZqaL6AJ","FVMxodjsrv","Ss0ZutvdkD","TCgPp2DREs","Ul4a1kZANm","uQIczZzJHW","7X3uyM6qcG","t59lRjzUqR",
+"mX2GEfLNg8","Chuy3d7vjM","azIWpv1Hln","lj07QW3VFH","v1Hlnb29RJ","CxVEf5iGN5","IRh48XflUq","RpBQmtAOsr","1v5hHNcICA","7ku1pHP433",
+"FwEJzpvgjS","XyPZNIBe8k","O3iyQQssNC","jS1ajRsQUq","OHaBzd7vjM","VNCPd7X3uy","NcICApFrrl","qUJMdIn3NS","2Yz7EQnJ1S","TCgPpFGzgp",
+"rhl0J14FLR","0ao3lJIqXi","FNYIMlkMUA","M6qcGiB08l","RsQUqIRh48","QworuoQ87r","s93Ml0BmCy","CdyBVWreyP","wDajXFxX9q","HlUbFrKDLJ",
+"EOE1oHRxd8","gIYvEEOE1o","lj07QEOE1o","nlaByFhtgl","pv0i7jzUqR","prNT6Fhtgl","uupzkK20wK","VerEAtlILt","taOXK618Di","QWxoT0MR5X",
+"6AFT0AIYUu","0YAGHGrDg7","zQt6Q14FLR","KASQ8Q6Lix","wiHrZIBe8k","rhl0Jv8yFN","AkKTk7lUXZ","lH1ktIRh48","cShY2pWiOs","jzUqRulk41",
+"ZUnqt8FmFH","WmadA45cIH","48cHLZv7z0","faHirZuDtD","uAWypSjskQ","HRxd8NhXdu","oQ87r0Wr5y","kB5nPAkKTk","qaofNlViBv","pFrrlCNHmv",
+"RACujjS1aj","GrDg7QChxs","5nmWvlH1kt","nFqikeuZA5","Uvlv4ru4UG","uTacxDG4sT","jtn0X4W0Tl","RpBQmvkCHH","BFkb8GXdoH","7lUXZSjskQ",
+"d85a9JRJQB","JkzUnuN6r3","5VZjSTa8f6","RmDcr5ZaEz","wDajXBGaQY","9eoRcRzaZA","Cfgr3lj07Q","0Wr5yk85Ae","1LB1LZzJHW","rhl0JChuy3",
+"HP433O3iyQ","TCgPpW7cTs","HzZT8TCgPp","NhXdukZANm","DcpWBfcJOy","SbRYyC2Irc","taOXKKr8ys","cmXIXiqv4k","QChxsQworu","DG4sTOUqFM",
+"soy9tyToGW","8hJdtMK07Y","Kr8ysS2Dfu","lXFOBpWiOs","CqqaDUvlv4","y94nwo8Uyd","M6qcG1j5L8","RkQkei7WMQ","hSSvQCxVEf","Chuy3uZPqg",
+"1v5hH24ARF","lpF6WEoToP","gdQsSB3qem","lweGyDcpWB","xXTI429QAz","5IhmGG1RhS","M6qcGIRh48","WDVWJGWqqX","qQxHPGWqqX","JJs5mPOUYS",
+"k85Aeulk41","lH1ktP6bcg","cQOnvSs0Zu","U3yw5FnPFB","RzaZAhUTw7","uZPqgLDk6f","O3iyQe6e4z","JJs5m7X3uy","jeskS0Wr5y","gjUTu7fsYM",
+"nlaBy8hJdt","ydG8UGrDg7","Cfgr3v2eC3","wiHrZMm8si","07n1cBFkb8","he9IAIBe8k","Zv7z0I7p2a","kB5nPatef2","7ku1pzmLYD","2DREsFLsph",
+"AIYUum4bxU","yluBx7fKYU","e6e4zVLTy6","2TRI7s93Ml","8RCUApT8wu","NcICAsx5Gl","BpYhVd7vjM","wiHrZk85Ae","0h1b1euZA5","jiVBPIRh48",
+"VerEADLhzM","NcICAJRJQB","0h1b1WmadA","azIWppT8wu","ksJbypT8wu","pvgjS0PktI","TCgPp8cVD3","RpBQmJRJQB","ix74rFxX9q","bgJAzxReec",
+"yEfy92Yz7E","Q6Lix9y4lw","FNYIMd85a9","SbRYy580YD","QbxXcdQ586","48cHLVBjhz","0MR5XEOE1o","I7p2aBFkb8","uvf7ApiJSk","jtn0XFNYIM",
+"prNT6ru4UG","nFqikZJTXH","24ARFUmaEv","45cIHjSjS3","6q6L9s93Ml","WaWsvX6Pin","gjUTusuY4x","QssNCZuDtD","ogLgcrKDLJ","VLTy6Yw2oU",
+"G1RhSwiHrZ","ZJTXHxciqp","pv0i74QMc9","v8yFNjzUqR","uN6r314FLR","6AFT0ciuWz","ydG8UTCgPp","4W0TlcQOnv","pT8wui7WMQ","14FLR9y4lw",
+"2NslmJRJQB","lXFOBDcpWB","zFgtBRmDcr","sqVrflsQGo","cShY2Gv3Fq","AOgEeMm8si","MojnPuJScX","P6bcgprNT6","ThjNnX6Pin","5NammGSQwj",
+"DQimpBGaQY","a00b5J2mQi","ReKEWdjsrv","5ZaEz2TRI7","fcJOyW7cTs","KsjRK55rfB","d7vjMcL0aE","FPfSEAIYUu","VIlwPh1zcH","Cp3mZcQOnv",
+"qQxHPVBjhz","RzaZA5Drn0","ni2v1SbRYy","Y1mC08xEKz","U3yw5xReec","Pb1pa0ao3l","LDk6fxXTI4","Cp3mZFcWrW","pFrrlv1Hln","qQxHPIBe8k",
+"AXpwEMezSW","cL0aEuPX7G","FVMxoAOgEe","zqH0Whe9IA","24ARFMm8si","IKxdLIRh48","M3zXLYf2Ec","dpe1vpv0i7","d85a9bgJAz","In3NSBGaQY",
+"RmDcruAWyp","qQxHPFxX9q","tjQxsCIShG","4QMc914FLR","1v5hH5IhmG","zqH0WReKEW","ogLgcVjCZq","Mm8siOUYuF","s93MlCNHmv","v8yFNGWqqX",
+"L7cGc7Ow5C","AXpwEs93Ml","gtCA5FGzgp","uTacxRBhp0","gdQsSOxWIH","TCgPpC2Irc","brhlQQ6hMC","xXTI4FxX9q","lXFOBrz7Ut","nFqikHRxd8",
+"Pb1pavOqCE","cmXIXuN6r3","hUTw7BCxeC","BCxeC2Yz7E","cQOnvZJTXH","XflUqCqqaD","W7cTsEdBKc","KsjRKokgRi","faHirGWqqX","OUYuF29QAz",
+"HP4332ZHdk","Gv3Fq7fKYU","Ta8f6atef2","2Yz7EAkKTk","fLNg8aL6AJ","FcWrWMK07Y","4dEz6uupzk","i7WMQWaWsv","WPmlx9iGoT","14FLR2hEEU",
+"MezSWhE1Ql","ydG8UXyPZN","KASQ8CK5W7","45cIHlCMxy","taOXKaFFss","FjHXRBGaQY","o8UydQnJ1S","HfyNQuupzk","lj07QksJby","ReKEWGXdoH",
+"vOqCErhl0J","5VZjSBbwgA","t59lRuQIcz","oVQp6HfyNQ","xReecdjsrv","5IhmG48cHL","uTacxWDVWJ","jtn0XjiVBP","2hEEUaez9y","NOHszyluBx",
+"RxrsmCfgr3","aez9yoQ87r","lViBvsuY4x","Cp3mZ07n1c","aL6AJy94nw","UlU3MFcWrW","i7WMQRsQUq","UlU3Mni2v1","BFkb80Wr5y","XyPZNd85a9",
+"AkKTksuY4x","NOHszdhSuH","tjQxseuZA5","NOHszNOHsz","Z4I1vOxWIH","lH1kt9XyT9","Chuy35Mg9r","POUYSCIShG","uJScXM3zXL","CK5W7gIYvE",
+"BGaQYzQt6Q","jeskScShY2","BGaQYiB08l","uN6r3lweGy","SbRYyBCxeC","4dEz60ao3l","NOHszMK07Y","uTacxZUnqt","S77LHY1mC0","0Kyfs7fKYU",
+"QClRLNAFuw","1j5L8bgJAz","7lUXZpWiOs","RsQUqDLhzM","sx5Glm4bxU","RACujQ6Lix","cQOnvjeskS","B3qemogLgc","Vprf2zqH0W","o8UydoQ87r",
+"5drc6FGzgp","gf8rIP6bcg","iwzGkQbxXc","0ao3lVerEA","DQimpguMb8","piJSkOHaBz","iKqhrbrhlQ","NcICApAhR1","IBe8kFwEJz","MmsIohE1Ql",
+"X6PinuLtKs","tjQxsAXpwE","dhSuHJKWYR","s7MxkFwEJz","h1zcHMGlTF","FnPFBThjNn","MGlTFNAFuw","MezSWgjUTu","2DREsSWfou","dhSuHgIYvE",
+"5ZaEzuupzk","VjCZq6AFT0","HzZT8ZhwG1","EOE1o8xEKz","prNT6a00b5","ReKEWlkMUA","cQOnvy94nw","Yh1hFgf8rI","L7cGc5nmWv","7ku1pkB5nP",
+"FxX9q6q6L9","ZUnqtZJTXH","HzZT8lkMUA","Uvlv4lViBv","i7WMQJ2mQi","HzZT8yToGW","G1RhSvkCHH","Ul4a19rlg9","I7p2aQClRL","mX2GEMmKGJ",
+"LbRTHStlDJ","y94nwAOgEe","GrDg7Mm8si","xXTI4vOqCE","5Drn0Gv3Fq","lj07QuAWyp","8cVD3gIYvE","l83UdP6bcg","6AFT0gtCA5","Oz8yZjS1aj",
+"jSjS31LB1L","lkMUA9eoRc","n1pmOt98iW","LbRTHKr8ys","KASQ8nFqik","jSjS3VLTy6","OUYuFxXTI4","MmKGJtjQxs","OUYuFwDajX","NAFuwyvOMI",
+"s7Mxk1LB1L","ix74r5nmWv","3weIFgIYvE","6q6L9m4bxU","oQ87rVIlwP","tlILtNxx9V","OHaBziwzGk","a00b5ReKEW","HzZT8Cp3mZ","FxX9qazIWp",
+"Mm8siKASQ8","fFDrJS2Dfu","FnPFB2hEEU","YjB9t8FmFH","SmGzvHlUbF","d85a9QChxs","cL0aEIKxdL","5IhmGWmadA","kB5nPJXljW","aL6AJY1mC0",
+"HRxd8cQOnv","tl72WfFDrJ","Pb1paguMb8","tvdkDuN6r3","QClRLuLtKs","PYBf4StlDJ","lCMxyNOHsz","AmdQdoQ87r","16lHcn8pJ9","6AFT0ru4UG",
+"tvdkDyEfy9","zY1GY7hyVv","LbRTHd7vjM","gjUTuWreyP","AOgEeW3VFH","aez9yzqH0W","TwanobrhlQ","Mm8siNcICA","0BmCyTwano","ix74r0ao3l",
+"mz8gxM6qcG","t59lR5ZaEz","5nmWvogLgc","HP433CqqaD","qaofN2ZHdk","ThjNnMmsIo","VIlwP4QMc9","zHF1qLDk6f","QssNCIn3NS","vkCHH2DREs",
+"Fhtgl5Drn0","WaWsvhE1Ql","azIWpAgJHQ","Z4I1v6AFT0","ZUnqtAXpwE","v8yFNLewvM","zmLYDkB5nP","uPX7GPYBf4","EoToPHfyNQ","hYBCKMmsIo",
+"jS1ajReKEW","K20wKAkKTk","VBjhzNhXdu","tvdkDaDGtS","ZhwG1AOgEe","9eoRcbrhlQ","ZUnqt9iGoT","Uvlv4FjHXR","mX2GEazIWp","Z4I1vqaofN",
+"TCgPpoGu6x","zHF1q0PktI","a00b5rKDLJ","vkCHH0Kyfs","7ku1pulk41","NOHsz9GXkX","uJScXUmaEv","SbRYyAXpwE","1j5L8cShY2","lweGyru4UG",
+"PYBf4s93Ml","JRJQBgIYvE","F6PT2PYBf4","Mkgy8fFDrJ","guMb8JKWYR","hYBCKs93Ml","aez9yL7cGc","45cIHlViBv","ciuWzQworu","pvgjSOz8yZ",
+"HlUbFGv3Fq","VLTy6ZzJHW","qQxHPjfREu","7lUXZStlDJ","hE1Ql7lUXZ","AOgEeRACuj","B3qem0Wr5y","AOgEefcwDa","6AFT02DREs","o8UydoGu6x",
+"3otm6CIShG","MK07YZUnqt","fcwDaU3yw5","guMb8zmLYD","Uvlv4HfyNQ","Mm8siatef2","UmaEvOxWIH","wiHrZtl72W","x3LDeZUnqt","8TxD7piJSk",
+"AmdQdZv7z0","5VZjSdjsrv","K20wKdhSuH","1v5hHhYBCK","o8Uyd9XyT9","sx5GlzmLYD","Gv3FqMK07Y","VNCPdSs0Zu","zmLYDCdyBV","Yh1hFsuY4x",
+"ThjNnEdBKc","0Wr5yWaWsv","9XyT94QMc9","v8yFNU3yw5","t98iWFLsph","5Mg9rZ4I1v","MmsIozHF1q","EoToPsx5Gl","5ZaEzhi5X7","M6qcGlsQGo",
+"UlU3Mdjsrv","S77LHMK07Y","xciqpuN6r3","CIShGvOqCE","taOXKl83Ud","Y1mC0jfREu","AgJHQQ6Lix","zz4ZU14FLR","F6PT2DG4sT","K20wKlsQGo",
+"FcWrWiKqhr","i7WMQjiVBP","sx5GlTXQ0Z","AgJHQGrDg7","Ss0Zu2Yz7E","aez9yuupzk","MK07YMGlTF","mz8gxi3pyd","NOHszyvOMI","EOE1oFVMxo",
+"zY1GYv8yFN","tvdkDkZANm","S77LHbrhlQ","Q6LixJRJQB","FLsphQWxoT","QbxXch1zcH","WmadA9XyT9","VLTy6Rxrsm","LDk6f8FmFH","K4GS8ThjNn",
+"uJScXXflUq","t59lRfcwDa","OUYuFk85Ae","XyPZNB3qem","rKDLJuupzk","Twanoi7WMQ","ECMvU5Mg9r","atef2m4bxU","YOfrYjtn0X","cmXIXGv3Fq",
+"5NammS2Dfu","BCxeCfqypy","GrDg7NOHsz","v1HlnNo0Qb","wiHrZZ4I1v","QnJ1SzqH0W","uupzkJRJQB","aez9yyluBx","uLtKsMaJQs","Yf2EcUvlv4",
+"uQIczpiJSk","IKxdLMojnP","LDk6fjeskS","cQOnvlXFOB","BbwgAtuDyS","07n1cLDk6f","580YDjeskS","djsrvY1mC0","SjskQFPfSE","oVQp6uN6r3",
+"jtn0XFwEJz","dpe1vVNCPd","KsjRKn1pmO","M6qcGAmdQd","azIWpVjCZq","yToGW9XyT9","cmXIXt98iW","0BmCy8RCUA","07n1c580YD","ydG8Uo8Uyd",
+"2TRI7tuDyS","M6qcGyToGW","taOXKogLgc","dQ586Twano","aL6AJbrhlQ","FwEJzNxx9V","HP43355rfB","0Wr5yfcJOy","qQxHPQworu","GSQwjCK5W7",
+"s4786l83Ud","cQOnv16lHc","sqVrfx3LDe","64s8NDG4sT","h1zcHLbRTH","m4bxUdhSuH","HzZT8IBe8k","WaWsvaez9y","No0QbJ2mQi","pFrrlxciqp",
+"Z4I1vy94nw","lweGyksJby","DQimpQbxXc","vLsmSx3LDe","ZJTXHfFDrJ","KZamH48cHL","zbIYYLewvM","AgJHQdQ586","4W0Tlzz4ZU","HRxd8ogLgc",
+"d7vjMAgJHQ","tAOsrO3iyQ","cL0aEvOqCE","Ta8f6dpe1v","IRh48djsrv","vOqCEYjB9t","cmXIXUl4a1","rKDLJTwano","hE1QlIKxdL","JKWYRhE1Ql",
+"wDajXm4bxU","qQxHPFGzgp","cmXIXoQ87r","S2Dfu5VZjS","SbRYyCqqaD","nlaByBGaQY","IBe8kDQimp","UlU3MuQIcz","v8yFNaDGtS","lpF6WdmoS7",
+"Dz1R3JJs5m","9iGoTtl72W","s7MxkjzUqR","tlILtfmIK1","UlU3MKZamH","guMb8yofH3","yEfy9TCgPp","lsQGoWaWsv","JIqXiyEfy9","iKqhrS2Dfu",
+"ciuWz2TRI7","HRxd8S77LH","K4GS8U3yw5","FLsphhE1Ql","0Kyfs48cHL","0MR5Xfqypy","MmKGJ5IhmG","FGzgpciuWz","8RCUAn1pmO","aFFss8U2nU",
+"9XyT92hEEU","taOXKhi5X7","TXQ0Z48cHL","tlILtiKqhr","tlILtcmXIX","pmeCdG1RhS","Vprf2qUJMd","4QMc9MmsIo","0MR5X0Kyfs","zz4ZUoVQp6",
+"QClRLRBhp0","iqv4kcL0aE","WDVWJUl4a1","Kr8ys5iGN5","MojnPG1RhS","Q6hMC55rfB","blLA9AmdQd","LDk6fbrhlQ","Ss0ZuCIShG","tjQxsB3qem",
+"MGlTFECMvU","cmXIX9y4lw","Cfgr3hYBCK","uLtKsJJs5m","uJScXhYBCK","rKDLJYh1hF","FNYIMI7p2a","DQimp4W0Tl","WaWsvaL6AJ","nFqikGWqqX",
+"Uvlv4Yw2oU","WaWsvsx5Gl","QWxoTiKqhr","s4786U3yw5","IRh485Namm","tvdkD0MR5X","2DREsRBhp0","I7p2aIjTwP","J2mQiRsQUq","cShY2IBe8k",
+"48cHLDz1R3","uPX7Gx3LDe","7fsYMkB5nP","Mkgy8s4786","ZJTXH24ARF","VBjhzTa8f6","sx5GlZuDtD","fcJOyTa8f6","zbIYYFGzgp","y94nw0Kyfs",
+"Zv7z0QWxoT","Y1mC0HlUbF","WDVWJvkCHH","MmKGJUmaEv","zY1GYcmXIX","uQIczhE1Ql","vLsmSEOE1o","Nxx9VWreyP","BbwgA0YAGH","lj07QpT8wu",
+"WDVWJcShY2","7ku1pO3iyQ","5Drn0Yf2Ec","Zv7z0DQimp","faHirogLgc","QssNCe6e4z","e6e4zl83Ud","QClRLOUYuF","C2IrcJJs5m","QClRLyvOMI",
+"yofH3AIYUu","3otm6Mkgy8","uLtKsaez9y","cQOnvHzZT8","AkKTkOHaBz","WreyPuLtKs","3weIFFFDui","dmoS7l83Ud","Ul4a1oGu6x","LDk6fAXpwE",
+"b29RJ9XyT9","NAFuwMGlTF","IjTwPnnP8o","5Drn0wiHrZ","aez9yFnPFB","I7p2alXFOB","TXQ0ZYjB9t","WmadAQnJ1S","9y4lwMmsIo","soy9tFwEJz",
+"prNT6ciuWz","9eoRculk41","gf8rIb29RJ","8U2nUBpYhV","uN6r3o8Uyd","uvf7AWreyP","CIShGM6qcG","hUTw7Fhtgl","uupzkpv0i7","ydG8UFFDui",
+"tl72WSWfou","W3VFHydG8U","lCMxyyEfy9","BFkb8RsQUq","GXdoHydG8U","5NammDcpWB","Uvlv49y4lw","o8UydTCgPp","jzUqRRpBQm","ksJbyv8yFN",
+"ZzJHWfqypy","WaWsvB3qem","5drc6GrDg7","jSjS3DQimp","NAFuwM6qcG","uN6r3In3NS","GWqqXMojnP","9rlg9F6PT2","DG4sTaFFss","sqVrfyofH3",
+"J2mQi0Wr5y","YjB9tiwzGk","MmsIos4786","ReKEWXflUq","9y4lwCfgr3","lkMUAzz4ZU","55rfB9eoRc","pmeCdZzJHW","VerEAPb1pa","5nmWvaL6AJ",
+"W3VFHi7WMQ","XyPZNC2Irc","IKxdLJKWYR","aL6AJ0h1b1","e6e4zjeskS","SbRYyCK5W7","XyPZNrKDLJ","ulk41JRJQB","atef2Z4I1v","OxWIH5Mg9r",
+"16lHcIBe8k","blLA9x3LDe","5nmWvWreyP","F6PT2zY1GY","aFFssFLsph","0h1b1Ss0Zu","wiHrZWPmlx","oQ87rYf2Ec","DLhzMfcwDa","FPfSE0Wr5y",
+"vkCHHPb1pa","dhSuHS2Dfu","fFDrJzHF1q","dmoS7iqv4k","DQimpFwEJz","Ta8f6WaWsv","lm0pDtl72W","RACujsoy9t","Kr8ysVerEA","RsQUqEoToP",
+"1LB1LYOfrY","o8Uydjtn0X","tuDySi7WMQ","jzUqRsx5Gl","xReecM6qcG","lm0pD0PktI","x3LDe5nmWv","aez9yl83Ud","Q6LixnlaBy","lpF6WFPfSE",
+"Uvlv4qUJMd","FNYIMPYBf4","oGu6xzmLYD","Mm8siP6bcg","NOHsz5IhmG","F6PT2K20wK","WmadAJIqXi","FPfSEogLgc","uvf7AHzZT8","yEfy9RsQUq",
+"Vprf2Ss0Zu","GSQwjsqVrf","v2eC3dpe1v","Ss0ZucShY2","ulk41CIShG","SWfous7Mxk","AXpwERkQke","qQxHPXflUq","dQ586yluBx","fcJOyDz1R3",
+"YOfrYGXdoH","lH1kt1LB1L","cL0aEpvgjS","YjB9tCp3mZ","v8yFNChuy3","No0QblH1kt","ECMvURpBQm","gIYvEFVMxo","MmsIoTa8f6","TCgPp45cIH",
+"ThjNnyluBx","jzUqRcShY2","t98iWCp3mZ","lH1ktFhtgl","IjTwP0h1b1","4W0TlbZLvS","wiHrZ5nmWv","Nxx9V0PktI","VjCZq2hEEU","L7cGcMK07Y",
+"MaJQsOxWIH","lViBvWPmlx","JIqXiFVMxo","FwEJzJXljW","a00b5Q6Lix","55rfB7fsYM","VLTy6atef2","K4GS8QnJ1S","zz4ZU0ao3l","AIYUu3otm6",
+"l83Udk85Ae","FwEJzlj07Q","IKxdLydG8U","euZA5uJScX","CqqaDzz4ZU","Yh1hFazIWp","TCgPpGrDg7","h1zcHHP433","XyPZNCK5W7","Cfgr3SbRYy",
+"lm0pDS77LH","DLhzM8RCUA","5ZaEzPOUYS","Ul4a1Mm8si","8RCUACIShG","t59lRQssNC","nlaByzFgtB","tAOsrmX2GE","AXpwElkMUA","vOqCEuZPqg",
+"AIYUuAXpwE","e6e4zBGaQY","ni2v1Chuy3","gf8rISs0Zu","e6e4z0h1b1","K20wKjzUqR","VBjhzGSQwj","DG4sTMezSW","Cfgr3n1pmO","VNCPdksJby",
+"lCMxyU3yw5","uoStw7ku1p","fLNg84dEz6","qUJMdFPfSE","VerEA5Drn0","NAFuwgIYvE","aDGtS7hyVv","CdyBVhe9IA","IjTwPvOqCE","oQ87rpT8wu",
+"gtCA5B3qem","5NammDz1R3","QChxslpF6W","zQt6Qd7vjM","atef29eoRc","aez9yNAFuw","NOHszYOfrY","5drc6iKqhr","0KyfspiJSk","Q6LixQssNC",
+"WPmlx5iGN5","XflUqHzZT8","JRJQBiB08l","cShY2HfyNQ","tl72Wrz7Ut","5VZjSuupzk","Vprf20MR5X","8RCUANOHsz","F6PT2JXljW","55rfBOUqFM",
+"PYBf4FcWrW","Dz1R3ix74r","jiVBPJIqXi","ksJbyIKxdL","uTacx2Nslm","SmGzvgIYvE","fFDrJ9eoRc","jeskSRBhp0","PYBf4C2Irc","Pb1pa7lUXZ",
+"gtCA5k85Ae","JXljWFVMxo","ydG8U07n1c","8xEKzoGu6x","K4GS8xciqp","zz4ZUBCxeC","MmKGJMm8si","0PktIbgJAz","EdBKcPYBf4","s93MlQClRL",
+"uTacxo8Uyd","StlDJgf8rI","t98iWxXTI4","FcWrWgjUTu","xXTI4580YD","zmLYDFnPFB","IRh48Q6Lix","iB08lBFkb8","8xEKzRzaZA","5drc6uN6r3",
+"Cfgr3ru4UG","HlUbFtlILt","BGaQYmz8gx","SWfouSmGzv","uvf7AksJby","ulk41AgJHQ","y94nwpFrrl","l83Uduvf7A","FxX9qKASQ8","gf8rIuPX7G",
+"YOfrYpv0i7","8U2nUlH1kt","uAWypazIWp","jeskSd7vjM","VNCPd5IhmG","StlDJFxX9q","POUYS55rfB","6AFT0FxX9q","VIlwP0h1b1","lm0pDVIlwP",
+"BpYhVM6qcG","vOqCEIjTwP","JJs5mTwano","vLsmS16lHc","DG4sTRpBQm","a00b5Fhtgl","YjB9tGSQwj","rKDLJm4bxU","BbwgAvOqCE","aez9ySWfou",
+"2DREsZ4I1v","lH1ktYjB9t","zz4ZUhi5X7","7Ow5CS77LH","WreyPC2Irc","EOE1olweGy","G1RhSxciqp","2NslmCdyBV","FPfSEMmKGJ","qUJMdnlaBy",
+"jzUqRuN6r3","BFkb8ZuDtD","dmoS7BGaQY","FcWrWiB08l","C2Irc1LB1L","BGaQYS77LH","IRh48W7cTs","0PktIAXpwE","hYBCKoQ87r","0KyfsEOE1o",
+"NcICAzY1GY","L7cGchUTw7","In3NSO3iyQ","9y4lwzmLYD","kB5nPqaofN","ZhwG14dEz6","piJSkCxVEf","QClRLrhl0J","Ta8f6uupzk","dhSuH4QMc9",
+"t98iWFwEJz","WPmlxi3pyd","rKDLJAmdQd","Ss0Zu5IhmG","KASQ8b29RJ","fLNg8fmIK1","yluBxlkMUA","vkCHHOUqFM","OUYuFMojnP","NAFuw4dEz6",
+"rhl0JB3qem","tlILtQ6hMC","GSQwjjtn0X","ReKEW4dEz6","LbRTHFwEJz","JkzUnhi5X7","BFkb8uJScX","Chuy3djsrv","mz8gxHRxd8","WPmlxpFrrl",
+"iqv4kFjHXR","1j5L8CK5W7","Mm8si55rfB","jzUqRt59lR","a00b5uZPqg","9y4lwqUJMd","5VZjSRsQUq","5Mg9rSmGzv","djsrv1v5hH","BbwgADQimp",
+"8xEKzCfgr3","VjCZqD6rBy","jzUqRxXTI4","5ZaEzs7Mxk","zQt6Qi7WMQ","JkzUnWMiS3","ni2v1s93Ml","RzaZAjeskS","lViBvoGu6x","uoStwWPmlx",
+"9rlg9ciuWz","ZUnqtDQimp","7Ow5C4QMc9","AIYUujSjS3","qaofNO3iyQ","7X3uy1v5hH","dmoS75Namm","Y1mC0RmDcr","SmGzv5ZaEz","uPX7GNo0Qb",
+"0ao3lUvlv4","BFkb8580YD","JRJQBQClRL","5Drn0hYBCK","lj07QY1mC0","guMb8CK5W7","aDGtSNAFuw","JKWYRWreyP","Zv7z0RpBQm","sqVrfBGaQY",
+"Mm8sijiVBP","JkzUncShY2","rKDLJM3zXL","5drc67fsYM","5iGN5s4786","WmadAYOfrY","Cp3mZ7X3uy","Ta8f6gjUTu","S77LHKsjRK","pvgjSSjskQ",
+"RpBQmIn3NS","QYxC0FcWrW","Q6hMCzFgtB","3weIFCK5W7","uoStwBGaQY","xXTI4lH1kt","blLA9uoStw","Ss0ZuuZPqg","DcpWBhi5X7","zFgtBpWiOs",
+"CNHmvo8Uyd","8RCUACNHmv","SWfouhi5X7","pFrrlFcWrW","8TxD77X3uy","0PktIni2v1","aDGtSOUqFM","mz8gxGrDg7","9GXkXiwzGk","LDk6fiKqhr",
+"AgJHQatef2","uLtKsjtn0X","5Namm0Kyfs","OxWIH2DREs","v1HlnFjHXR","hi5X7jfREu","Rxrsm5Drn0","zqH0WlCMxy","Yh1hFPYBf4","2DREsjtn0X",
+"a00b5FPfSE","RmDcrCIShG","K4GS8v8yFN","U3yw5D6rBy","0ao3lEdBKc","W3VFHHlUbF","ogLgcRBhp0","2ZHdkxciqp","C2Ircs4786","0MR5XKZamH",
+"K4GS8uJScX","2TRI7lsQGo","piJSkTCgPp","xXTI4jzUqR","fqypyQbxXc","CdyBV16lHc","zbIYY07n1c","AkKTk16lHc","uLtKsIRh48","DQimpPOUYS",
+"S77LHQbxXc","FnPFBulk41","Chuy3Mkgy8","VIlwP618Di","HP433y94nw","2ZHdk4W0Tl","vkCHHtuDyS","XflUqaFFss","In3NSzQt6Q","taOXK0Kyfs",
+"v2eC3Q6hMC","o8UydbZLvS","VjCZqdhSuH","VIlwPPOUYS","JXljW8cVD3","29QAzfaHir","mX2GEdjsrv","y94nw8cVD3","Gv3FqG1RhS","0KyfscmXIX",
+"fmIK1P6bcg","HP433ReKEW","vOqCE4dEz6","tAOsrTwano","RpBQmi7WMQ","WaWsvSjskQ","AmdQdmX2GE","IBe8kFcWrW","8hJdtoQ87r","Waim6n8pJ9",
+"jtn0XXflUq","QbxXcStlDJ","JJs5mzQt6Q","XyPZNlkMUA","DG4sTEdBKc","9GXkXYOfrY","ulk41yEfy9","4W0Tls4786","MmKGJsoy9t","iwzGk0YAGH",
+"jS1ajVprf2","J2mQiRpBQm","GXdoH5ZaEz","fqypy8U2nU","FwEJzulk41","yToGWMGlTF","EdBKcQssNC","5iGN5yEfy9","okgRi3weIF","blLA9dQ586",
+"0MR5XeuZA5","nFqik1j5L8","0MR5XlweGy","Pb1paTXQ0Z","lm0pDYw2oU","jiVBPB3qem","xXTI4v1Hln","BbwgAv8yFN","PYBf4PYBf4","9iGoTFhtgl",
+"ulk41t59lR","WPmlxTa8f6","ogLgcuQIcz","S77LHlweGy","YOfrYUvlv4","AmdQdP6bcg","5IhmG0MR5X","7Ow5ClH1kt","JkzUn8RCUA","J2mQinlaBy",
+"aL6AJUlU3M","2ZHdkIBe8k","7X3uyCK5W7","zmLYDjeskS","618DiNxx9V","b29RJhE1Ql","lj07QpmeCd","ZuDtDjfREu","iKqhrlXFOB","tjQxshe9IA",
+"Cfgr31v5hH","HlUbFQYxC0","guMb8LewvM","pmeCd5Namm","DcpWByvOMI","2hEEUAOgEe","VerEAM3zXL","FVMxoCqqaD","AmdQdmz8gx","7fKYUgtCA5",
+"lXFOBHlUbF","ydG8UMmsIo","wDajXfcwDa","brhlQv1Hln","4W0TlzbIYY","sqVrffmIK1","he9IApv0i7","FxX9qChuy3","J2mQilpF6W","64s8NUlU3M",
+"P6bcg45cIH","mz8gxnFqik","7fsYMCdyBV","M6qcGNxx9V","ydG8UuoStw","45cIHuupzk","NhXduFPfSE","lH1ktjfREu","PYBf47Ow5C","tl72W0ao3l",
+"VjCZqO3iyQ","JKWYRzHF1q","580YDk85Ae","uZPqg8TxD7","9rlg94QMc9","rhl0JM6qcG","BFkb8UmaEv","gIYvEogLgc","FcWrWLbRTH","s478624ARF",
+"M3zXLIBe8k","M6qcGlViBv","dmoS7WDVWJ","FVMxoUl4a1","pWiOsi3pyd","Zv7z0Kr8ys","LewvMhSSvQ","pFrrlgf8rI","Pb1paJIqXi","D6rByBpYhV",
+"L7cGcdQ586","VLTy6oVQp6","0Wr5yChuy3","brhlQfmIK1","zHF1qgIYvE","RBhp09iGoT","0MR5XBpYhV","OUYuFogLgc","Nxx9VeuZA5","JKWYRHfyNQ",
+"MezSWzqH0W","n1pmOIn3NS","Kr8ysjfREu","yEfy9Ta8f6","OHaBz4dEz6","0ao3llweGy","wiHrZQ6Lix","RACujgdQsS","16lHcguMb8","O3iyQZzJHW",
+"lCMxyOUYuF","FcWrWPYBf4","ZJTXHzqH0W","S77LHuupzk","Waim6POUYS","KZamH5Namm","4dEz6hUTw7","8hJdtqaofN","ni2v1gtCA5","BpYhVs4786",
+"45cIHK20wK","MojnPCIShG","wiHrZ580YD","i7WMQC2Irc","Yf2EcDcpWB","lpF6Wd7vjM","pWiOsSmGzv","2NslmI7p2a","Ss0Zus7Mxk","zmLYDgf8rI",
+"yluBxNhXdu","24ARFDcpWB","5IhmGciuWz","vOqCEzQt6Q","aez9yDcpWB","ulk41uTacx","EOE1oNhXdu","iKqhr7Ow5C","euZA5IRh48","0BmCy5Namm",
+"JkzUnzz4ZU","ru4UGFjHXR","rhl0J7X3uy","D6rBy7ku1p","IRh48k85Ae","29QAzs93Ml","v1Hlnt98iW","djsrvQ6Lix","FnPFBTCgPp","RxrsmksJby",
+"v8yFNOz8yZ","16lHcYw2oU","cShY2rz7Ut","No0QblweGy","AIYUuKZamH","5VZjSi3pyd","6AFT0Twano","BFkb88FmFH","VjCZqJRJQB","W7cTs5ZaEz",
+"Yf2EchE1Ql","4dEz6Twano","GXdoHNhXdu","HzZT86AFT0","5ZaEzlsQGo","BGaQYVprf2","uZPqgqQxHP","7Ow5Ciqv4k","VNCPd45cIH","JKWYRHlUbF",
+"ciuWzWmadA","580YDydG8U","JRJQBulk41","RpBQmRBhp0","TXQ0ZDG4sT","OxWIHnFqik","aL6AJ7fKYU","nnP8oLewvM","KASQ8hE1Ql","GWqqXNhXdu",
+"NcICAFhtgl","cL0aEuN6r3","VLTy6Nxx9V","d85a9yofH3","ZJTXH580YD","wDajXUlU3M","StlDJlm0pD","gjUTuCIShG","lViBvChuy3","Q6hMCVLTy6",
+"uLtKs16lHc","EOE1oD6rBy","tl72WReKEW","euZA5C2Irc","xReec0h1b1","AmdQdYf2Ec","M6qcGhYBCK","O3iyQFcWrW","FLsphs4786","lpF6WuTacx",
+"hUTw7Ul4a1","jeskS4QMc9","zmLYDCK5W7","xciqpCxVEf","qaofNzFgtB","tvdkDnFqik","a00b5t98iW","Dz1R3i7WMQ","t59lRh1zcH","VerEAhE1Ql",
+"tlILtJKWYR","l83UdlCMxy","mz8gx16lHc","v2eC3JRJQB","yofH3Uvlv4","J2mQi4QMc9","UmaEvhUTw7","K20wKyofH3","FhtglQClRL","DQimpcL0aE",
+"Cfgr3v1Hln","CIShGYh1hF","5drc6ECMvU","Yh1hF16lHc","Uvlv4dmoS7","VIlwPCK5W7","oVQp6AOgEe","rz7UtoVQp6","t59lRpvgjS","5nmWvHP433",
+"Chuy3RpBQm","Kr8ysRsQUq","WmadAblLA9","uQIczdjsrv","kZANmSmGzv","JIqXim4bxU","7X3uycL0aE","5Drn0VLTy6","C2IrcSjskQ","2hEEU3otm6",
+"0h1b1o8Uyd","ZzJHWPYBf4","uvf7AIRh48","7ku1pPYBf4","J2mQiKZamH","JIqXiMkgy8","GWqqXDcpWB","t59lRyvOMI","HfyNQFnPFB","h1zcHXflUq",
+"3otm6ZJTXH","VerEAQClRL","uQIcz29QAz","0Wr5yb29RJ","MaJQssoy9t","hE1Ql7hyVv","KZamHNhXdu","618Dim4bxU","EoToPAXpwE","MojnPWDVWJ",
+"ciuWzMm8si","qQxHP48cHL","e6e4zqUJMd","ru4UGfqypy","o8Uyd64s8N","ulk41xciqp","oVQp6F6PT2","uLtKsOHaBz","9XyT9LbRTH","EdBKcCxVEf",
+"Yf2EcStlDJ","14FLRQnJ1S","s7MxkpWiOs","bgJAzlH1kt","ZUnqtlweGy","MmKGJChuy3","FPfSEjS1aj","Pb1pa9rlg9","FnPFBuoStw","GWqqXVLTy6",
+"FhtglbZLvS","uvf7ASjskQ","C2IrchYBCK","v1HlnVjCZq","bgJAzFnPFB","hUTw7cmXIX","brhlQQ6Lix","UmaEvpv0i7","QbxXcYOfrY","d85a9lsQGo",
+"jeskS5ZaEz","FVMxoFFDui","L7cGcWreyP","P6bcgcmXIX","Zv7z07ku1p","KASQ8DLhzM","MojnP2TRI7","ydG8Uaez9y","Oz8yZMezSW","LbRTHJIqXi",
+"uPX7G0h1b1","gtCA50Kyfs","blLA9GWqqX","9y4lwOUqFM","l83UdfcJOy","zY1GYNOHsz","TXQ0ZDz1R3","CdyBVSs0Zu","QClRLfmIK1","uZPqglsQGo",
+"PYBf41v5hH","5iGN5ZhwG1","7X3uyMGlTF","SmGzvgf8rI","jeskSWmadA","gtCA5t59lR","gdQsSbrhlQ","lH1ktStlDJ","rKDLJRsQUq","bgJAzJIqXi",
+"IjTwPZ4I1v","MojnPS77LH","J2mQiUvlv4","bgJAzUvlv4","zY1GYbrhlQ","2DREsOxWIH","DLhzMpFrrl","cShY2v2eC3","JKWYRAmdQd","vkCHHl83Ud",
+"QworuTCgPp","KASQ8aDGtS","ZJTXHBGaQY","5drc6cShY2","Ss0ZuydG8U","FwEJzzbIYY","pmeCdlpF6W","GWqqX0h1b1","tjQxsdpe1v","wDajX29QAz",
+"OxWIHFhtgl","KASQ8HRxd8","1LB1Ljtn0X","RkQkes93Ml","lweGyGrDg7","Twanom4bxU","WDVWJB3qem","uvf7AwDajX","sx5GlFPfSE","5Drn0qQxHP",
+"hSSvQuPX7G","pvgjSgjUTu","lH1ktY1mC0","6q6L97fKYU","pvgjSgtCA5","azIWplm0pD","0BmCySbRYy","v2eC3SWfou","aez9yrKDLJ","KZamHzFgtB",
+"EoToPh1zcH","uPX7GaFFss","1LB1LQClRL","n8pJ9bgJAz","LbRTHrhl0J","RxrsmwDajX","uPX7GjfREu","lH1ktWreyP","mX2GE29QAz","NhXduQYxC0",
+"3weIF8xEKz","v8yFNaez9y","cL0aEKASQ8","9eoRcSbRYy","OHaBzeuZA5","8FmFHSbRYy","pmeCdl83Ud","SWfouJRJQB","i7WMQnFqik","VNCPdEoToP",
+"zHF1qfqypy","K4GS8JkzUn","8xEKzxReec","oVQp6zbIYY","qaofNlXFOB","zbIYYZJTXH","ReKEWnnP8o","24ARF1j5L8","ZuDtDxXTI4","IRh48d85a9",
+"DG4sThSSvQ","OHaBzguMb8","uupzkrhl0J","aDGtS5VZjS","J2mQiL7cGc","MojnP5Drn0","B3qem5iGN5","F6PT2uZPqg","CIShGk85Ae","5nmWvBGaQY",
+"5IhmGxciqp","FhtgltvdkD","Chuy30h1b1","xXTI4Vprf2","2hEEUaFFss","lm0pDGXdoH","C2IrcPOUYS","ksJby2hEEU","QWxoTHfyNQ","ReKEWjfREu",
+"FhtglYjB9t","EoToP5IhmG","UmaEvMkgy8","9iGoToVQp6","RkQkelpF6W","P6bcgKZamH","LewvMa00b5","sqVrfO3iyQ","FnPFBNOHsz","YOfrYCdyBV",
+"rhl0JRmDcr","UlU3MuJScX","qaofNrKDLJ","jS1ajhUTw7","14FLRiKqhr","aez9yCNHmv","rz7UtBbwgA","7Ow5CJ2mQi","tuDySJJs5m","Ss0ZuHP433",
+"uvf7AyvOMI","uPX7GRBhp0","Pb1paAkKTk","pFrrllweGy","GXdoH4W0Tl","3otm6Q6Lix","7fsYMYjB9t","lkMUAn8pJ9","BCxeCvOqCE","FVMxopmeCd",
+"JRJQBzHF1q","AgJHQksJby","JRJQBiKqhr","GXdoHJJs5m","0BmCybgJAz","sx5GldmoS7","jS1aj7ku1p","24ARF7hyVv","lm0pDpmeCd","48cHLIBe8k",
+"MmKGJs93Ml","BpYhVuZPqg","aFFsstAOsr","AOgEeKZamH","l83UdydG8U","YjB9tAXpwE","Cp3mZRpBQm","GSQwjtuDyS","oGu6xUlU3M","Cp3mZdpe1v",
+"QbxXcP6bcg","oGu6xVIlwP","jiVBPMmsIo","S77LHIBe8k","xReeciB08l","okgRi0Wr5y","S77LHoGu6x","hYBCKKsjRK","BFkb8ni2v1","8TxD7PYBf4",
+"aFFss0h1b1","O3iyQksJby","QClRLTXQ0Z","8TxD7IKxdL","VjCZqxXTI4","GXdoHi3pyd","9rlg9lViBv","StlDJVBjhz","rKDLJnlaBy","blLA9QnJ1S",
+"C2IrcAgJHQ","QworuYw2oU","JkzUnKZamH","iB08l5VZjS","djsrvdpe1v","M6qcG7fKYU","hUTw7y94nw","pvgjSL7cGc","WaWsvEoToP","LbRTHd85a9",
+"lkMUApWiOs","ZUnqtUmaEv","YjB9td85a9","RxrsmDcpWB","BpYhV5drc6","uZPqgwiHrZ","HRxd8hYBCK","VjCZqGSQwj","1LB1L7fsYM","2DREsPYBf4",
+"WmadAk85Ae","9XyT9BbwgA","AOgEeblLA9","7fsYMs7Mxk","5VZjSNcICA","fcwDa8hJdt","ZzJHWksJby","pWiOs8cVD3","QYxC0uPX7G","8U2nU0h1b1",
+"iwzGkvLsmS","5Drn0d85a9","euZA5MmKGJ","sx5GluAWyp","MmKGJPb1pa","TCgPp2Nslm","dhSuHNhXdu","zz4ZUIRh48","ulk41k85Ae","Kr8ysuQIcz",
+"CIShGS2Dfu","5drc6OHaBz","HP433mz8gx","SbRYyjS1aj","WDVWJFxX9q","ulk416q6L9","BpYhVJXljW","Kr8ysJKWYR","FFDui5iGN5","9rlg9UmaEv",
+"64s8Natef2","Yw2oUOxWIH","ulk4129QAz","B3qemOxWIH","FhtglQChxs","NOHsz7hyVv","7ku1psx5Gl","SjskQzY1GY","cShY2Ul4a1","Mkgy8ZhwG1",
+"vkCHHrhl0J","ThjNnRpBQm","5VZjSMmsIo","24ARFyluBx","2ZHdkPYBf4","Z4I1v0YAGH","5Namm2hEEU","9GXkX6q6L9","2hEEUokgRi","zqH0W9eoRc",
+"fLNg88U2nU","4dEz6i7WMQ","Oz8yZ5Mg9r","4W0TlcShY2","W7cTsZhwG1","1j5L8mz8gx","K20wKnlaBy","9XyT9CNHmv","WMiS3FVMxo","aFFss7lUXZ",
+"Dz1R3Gv3Fq","lweGyt98iW","l83UdJRJQB","J2mQijSjS3","GXdoHOHaBz","okgRia00b5","ru4UGVjCZq","kZANmv8yFN","uPX7G5Namm","YjB9tFcWrW",
+"0MR5XfmIK1","okgRi1j5L8","pT8wuFPfSE","MezSWl83Ud","nlaByuupzk","fcwDanFqik","JKWYRThjNn","0Wr5yQ6hMC","lViBvQClRL","jiVBPiwzGk",
+"8hJdtn1pmO","BGaQYcmXIX","Zv7z0iB08l","I7p2aDG4sT","618Dilm0pD","fFDrJWMiS3","BpYhV1v5hH","9XyT9yEfy9","yvOMIfcwDa","Y1mC0FxX9q",
+"6q6L9fcwDa","uZPqg9iGoT","k85AeQworu","In3NS16lHc","suY4xQ6Lix","ciuWz5iGN5","ZhwG1i3pyd","Cp3mZ24ARF","UlU3MSWfou","jfREuAXpwE",
+"WPmlxjzUqR","zHF1qZ4I1v","WDVWJpFrrl","2TRI74dEz6","Q6LixSjskQ","zFgtBt98iW","pWiOsFhtgl","GWqqXCqqaD","QWxoTWPmlx","EdBKcRzaZA",
+"DG4sTU3yw5","8TxD75nmWv","7X3uy9XyT9","NcICAZUnqt","prNT65IhmG","aL6AJwiHrZ","X6PinP6bcg","In3NSWaim6","CNHmvF6PT2","Mkgy8vOqCE",
+"FVMxopiJSk","Ul4a19iGoT","BCxeCRBhp0","cShY22hEEU","yToGWyofH3","48cHL5VZjS","x3LDeDLhzM","euZA548cHL","uQIczEoToP","AXpwEuoStw",
+"ZhwG1bZLvS","xciqp2TRI7","0MR5XhE1Ql","2TRI7yvOMI","jfREuO3iyQ","tAOsr2TRI7","JRJQBOHaBz","M6qcGVLTy6","uPX7GP6bcg","KZamHhi5X7",
+"DQimpyToGW","M3zXLCIShG","FhtglTwano","ni2v1HlUbF","6q6L9GSQwj","s47866q6L9","dpe1vksJby","HzZT8OUYuF","RxrsmUl4a1","jS1ajHlUbF",
+"Zv7z0OxWIH","uoStwDz1R3","GSQwjDcpWB","GSQwjo8Uyd","OHaBzCdyBV","WMiS3jeskS","xXTI4VIlwP","ThjNnzqH0W","zY1GYW3VFH","No0QbC2Irc",
+"MGlTFiqv4k","hE1QllXFOB","2Yz7EVerEA","3otm68hJdt","ZhwG1m4bxU","5nmWvOUqFM","oVQp6v8yFN","m4bxUQ6hMC","U3yw51LB1L","taOXKFGzgp",
+"FGzgpYf2Ec","pWiOsDQimp","QworuuLtKs","IKxdLNo0Qb","2hEEUZ4I1v","yluBxdmoS7","HlUbFW7cTs","OUYuF4dEz6","7Ow5CRBhp0","dpe1vG1RhS",
+"29QAzuPX7G","gjUTufaHir","Cfgr39GXkX","NcICAY1mC0","JIqXixXTI4","16lHc5VZjS","iB08lWaWsv","HP433zQt6Q","VerEAhYBCK","jiVBP2Yz7E",
+"QbxXcThjNn","MezSWSs0Zu","v8yFN0ao3l","Dz1R3JRJQB","iwzGkCqqaD","aDGtSAkKTk","FhtglUl4a1","pT8wu9GXkX","RACujFLsph","xciqpzmLYD",
+"FjHXRiwzGk","zHF1qZhwG1","bgJAzHP433","fmIK1Fhtgl","t59lRLbRTH","FnPFB9y4lw","gIYvE2hEEU","MK07YF6PT2","Nxx9V14FLR","P6bcgL7cGc",
+"he9IAThjNn","8U2nUVprf2","M3zXLSjskQ","GrDg7ZUnqt","6q6L9kZANm","NOHszt98iW","7fsYMRsQUq","9XyT9AIYUu","618DiVerEA","FLsphKZamH",
+"Yw2oUhYBCK","0PktIlXFOB","SbRYyy94nw","VLTy6Q6Lix","JKWYRuN6r3","iKqhrmz8gx","9eoRcRxrsm","h1zcHFjHXR","blLA9bZLvS","FjHXR4W0Tl",
+"fmIK1OHaBz","AOgEeYf2Ec","S77LHlm0pD","AIYUu55rfB","Dz1R3d7vjM","Nxx9VM3zXL","uTacxlm0pD","FVMxoxXTI4","SjskQ580YD","tlILt8U2nU",
+"9XyT9D6rBy","CNHmvNOHsz","G1RhSyToGW","i7WMQDz1R3","Oz8yZDG4sT","uvf7AChuy3","ulk41FGzgp","8xEKzUl4a1","In3NSTa8f6","s7MxkF6PT2",
+"ZJTXHpFrrl","uPX7GzHF1q","FGzgppmeCd","WmadABFkb8","J2mQiBGaQY","jzUqRJkzUn","Q6hMCuupzk","9GXkXgtCA5","FPfSEfqypy","Chuy3Yw2oU",
+"07n1cix74r","NcICATCgPp","TwanoPb1pa","45cIHKsjRK","1v5hHhE1Ql","uAWypEOE1o","i3pydDG4sT","07n1cM3zXL","MmKGJJRJQB","IKxdL48cHL",
+"Ss0ZudQ586","brhlQqUJMd","RzaZAdhSuH","dpe1vKZamH","618DiRzaZA","O3iyQVLTy6","K20wKlweGy","lm0pDDLhzM","GrDg7JkzUn","jtn0XHP433",
+"xReecNAFuw","hYBCKzbIYY","zY1GYuQIcz","lsQGoRBhp0","ECMvUChuy3","MezSWyofH3","0Wr5yWPmlx","uAWypNhXdu","fcwDaSs0Zu","tuDySRACuj",
+"oQ87raFFss","WDVWJFhtgl","4W0Tlgf8rI","QbxXcRBhp0","YjB9tWmadA","16lHc8hJdt","ReKEWrKDLJ","FwEJzBFkb8","3otm6hE1Ql","I7p2aFFDui",
+"MmsIoRACuj","AmdQdMK07Y","vOqCEX6Pin","VjCZquAWyp","W7cTspv0i7","QClRLx3LDe","WaWsvpWiOs","jtn0XFFDui","GWqqXYf2Ec","CNHmv8hJdt",
+"yofH3Cp3mZ","EOE1oB3qem","ydG8UpWiOs","vLsmSy94nw","WreyPdQ586","cmXIXqUJMd","8RCUA64s8N","5VZjSFhtgl","t98iWqaofN","5ZaEzNhXdu",
+"8TxD7Cfgr3","4W0TlVLTy6","n8pJ9MezSW","YOfrY3otm6","45cIHMGlTF","lCMxy2DREs","fcJOyqUJMd","2ZHdkhUTw7","NhXduAgJHQ","MojnPC2Irc",
+"wDajXciuWz","yofH3n1pmO","7hyVvxciqp","JKWYRvLsmS","U3yw5djsrv","lweGy2ZHdk","jfREu9y4lw","HRxd8wDajX","QChxsBGaQY","HfyNQbgJAz",
+"FLsphAIYUu","9GXkXVNCPd","jiVBP9y4lw","8xEKz0YAGH","v1Hln8U2nU","K4GS80MR5X","i3pydzqH0W","StlDJQYxC0","kB5nPiB08l","gtCA5Kr8ys",
+"pv0i7YOfrY","aez9yqUJMd","7ku1pFcWrW","fcJOy618Di","8RCUAU3yw5","tl72W0MR5X","hUTw71j5L8","JkzUnFNYIM","a00b5Yh1hF","v8yFNjiVBP",
+"X6PinqaofN","WmadA1j5L8","AgJHQNxx9V","FnPFBM3zXL","QYxC0Ul4a1","sx5GluN6r3","nFqik5Namm","QYxC0J2mQi","NcICArKDLJ","ksJbyJRJQB",
+"B3qemX6Pin","cmXIXVerEA","QWxoTfcwDa","Cp3mZCxVEf","AgJHQFVMxo","QChxszFgtB","2hEEUYf2Ec","oVQp6W3VFH","5ZaEzhYBCK","8hJdtulk41",
+"Uvlv4LDk6f","i7WMQOxWIH","FxX9q4dEz6","XflUqCdyBV","7ku1p6AFT0","4dEz6jeskS","7fKYUDcpWB","bgJAzW3VFH","l83UdBCxeC","zQt6QAXpwE",
+"rKDLJHzZT8","Kr8yszHF1q","L7cGcStlDJ","uTacxzY1GY","TCgPpVerEA","Z4I1vtl72W","ix74rTa8f6","soy9t07n1c","9eoRcKsjRK","vkCHHyluBx",
+"7fKYUvOqCE","hE1Qli3pyd","EdBKcEoToP","MK07YCIShG","x3LDeQChxs","CK5W7n1pmO","8RCUAUlU3M","fcwDaUlU3M","dhSuHn8pJ9","iqv4kh1zcH",
+"MezSWAOgEe","hE1QlWmadA","CK5W72TRI7","lweGyZv7z0","fLNg8RkQke","0Wr5ySjskQ","lm0pDGrDg7","BFkb8C2Irc","cShY25Mg9r","0YAGHFcWrW",
+"zmLYD8FmFH","VerEADz1R3","lpF6WOUYuF","iKqhrCfgr3","Y1mC0Vprf2","ksJbyfcwDa","fmIK1k85Ae","7ku1plCMxy","BGaQYQbxXc","tvdkDfmIK1",
+"Zv7z0Cp3mZ","0h1b1gf8rI","FwEJzjeskS","CIShGi3pyd","SbRYy0BmCy","pWiOsQChxs","lj07QpAhR1","gf8rI0YAGH","5Drn0BFkb8","M3zXL1LB1L",
+"HzZT8blLA9","Dz1R30PktI","BpYhVuN6r3","7fKYUX6Pin","zbIYYyEfy9","RzaZAlH1kt","BCxeCKZamH","NcICAgtCA5","7X3uyix74r","K4GS8AXpwE",
+"ReKEWFwEJz","uAWypMkgy8","FVMxovkCHH","Q6hMCDG4sT","i7WMQwDajX","6q6L9DG4sT","NAFuwNxx9V","aL6AJZJTXH","6q6L9lsQGo","pFrrl4W0Tl",
+"MK07Yjtn0X","Zv7z0VerEA","FNYIMCp3mZ","d85a9HP433","F6PT2Y1mC0","uTacxx3LDe","Dz1R3s7Mxk","7hyVvJIqXi","Yw2oUxciqp","X6PinSmGzv",
+"HRxd8tuDyS","RkQkeVBjhz","5NammydG8U","guMb8Twano","I7p2aHlUbF","dQ586tAOsr","FxX9qTa8f6","M3zXLru4UG","dmoS7ulk41","lsQGoSWfou",
+"s4786No0Qb","TCgPp9y4lw","MGlTFlj07Q","n1pmOCdyBV","QChxsoGu6x","5Mg9rMm8si","yvOMIs93Ml","hSSvQ2TRI7","UlU3MYOfrY","atef2BbwgA",
+"CdyBVoGu6x","b29RJGXdoH","HzZT8zmLYD","lH1ktaDGtS","dpe1vZuDtD","3weIFSbRYy","48cHLbgJAz","RzaZAzHF1q","kZANmhi5X7","t59lRs93Ml",
+"MmsIoqQxHP","rz7Utaez9y","tvdkDMmKGJ","ogLgcjeskS","t59lRxXTI4","y94nwQYxC0","7fKYUmX2GE","KZamH1LB1L","JXljWlkMUA","AmdQdAgJHQ",
+"xXTI4euZA5","t59lR7Ow5C","ogLgcuTacx","yluBxCfgr3","SbRYyJJs5m","pv0i7OHaBz","ZUnqtqUJMd","lpF6WydG8U","DcpWBJIqXi","fqypyv2eC3",
+"dmoS7GrDg7","NcICAxReec","GrDg7OxWIH","tl72WFPfSE","BGaQYcL0aE","d7vjMxXTI4","SjskQK4GS8","jzUqRMaJQs","48cHLECMvU","piJSkRBhp0",
+"GSQwjhYBCK","KZamHqaofN","ECMvUdQ586","pAhR11j5L8","jS1ajMezSW","BFkb8QbxXc","wDajXsoy9t","07n1c8FmFH","FjHXRtjQxs","pFrrlaez9y",
+"kZANmMaJQs","uN6r3Kr8ys","IjTwPoGu6x","gdQsSTXQ0Z","uupzkHRxd8","nlaByokgRi","FNYIMv8yFN","EdBKcDQimp","0h1b1cQOnv","JXljWSs0Zu",
+"29QAzQbxXc","Cp3mZQnJ1S","EOE1oQssNC","Vprf2Gv3Fq","lpF6WqaofN","cmXIXMaJQs","MezSWdpe1v","ix74r24ARF","cmXIXzQt6Q","NAFuwcQOnv",
+"OxWIHfqypy","nlaBysuY4x","BGaQYzz4ZU","Vprf2vOqCE","8U2nUUmaEv","QWxoTQssNC","jS1ajVerEA","TwanoZUnqt","n1pmOTwano","he9IA4QMc9",
+"WaWsv8cVD3","XflUqeuZA5","Waim6Kr8ys","nnP8o48cHL","B3qemMaJQs","Chuy3Q6hMC","WreyPCp3mZ","5NammxReec","MaJQs8TxD7","2Yz7EvOqCE",
+"Vprf2OHaBz","CNHmvKZamH","RACujQworu","uTacxy94nw","29QAzJJs5m","ydG8UtjQxs","aFFsss4786","Yw2oUTCgPp","rKDLJd7vjM","cQOnv5ZaEz",
+"14FLRzY1GY","W3VFHprNT6","uLtKs5ZaEz","TwanoydG8U","EdBKcOxWIH","pFrrlCfgr3","TwanocShY2","0Wr5ytaOXK","tuDySU3yw5","Q6hMCHfyNQ",
+"brhlQ618Di","he9IA8cVD3","3otm6XflUq","nlaBy1LB1L","ix74roVQp6","2Yz7EJ2mQi","WMiS3s93Ml","yvOMIW3VFH","16lHc5iGN5","5ZaEzVNCPd",
+"Cfgr3lweGy","K4GS88FmFH","NOHsz5Namm","JIqXiI7p2a","SWfoulViBv","Q6hMCJ2mQi","K4GS8o8Uyd","zqH0WJ2mQi","HP433kZANm","2DREsDLhzM",
+"ru4UGRmDcr","prNT69iGoT","MojnPD6rBy","DQimppWiOs","WMiS3JKWYR","dhSuHEdBKc","soy9t29QAz","8U2nU8U2nU","Dz1R3uoStw","LewvM0ao3l",
+"L7cGcEOE1o","zqH0WyToGW","nlaByuAWyp","5iGN5pvgjS","MojnPQbxXc","Nxx9V9rlg9","4QMc9FFDui","IKxdLW7cTs","MmKGJ2Nslm","Ta8f6euZA5",
+"m4bxUDcpWB","WmadAVNCPd","prNT6AOgEe","IRh48NcICA","djsrvYOfrY","GSQwjOHaBz","HzZT8Gv3Fq","DLhzMm4bxU","QClRLksJby","gIYvElkMUA",
+"7fKYUCK5W7","S77LH2Yz7E","7fKYUsqVrf","BCxeC9y4lw","kZANm2DREs","MK07YdhSuH","7X3uyK4GS8","BGaQYQChxs","JJs5mv1Hln","vOqCEWDVWJ",
+"TCgPpStlDJ","8hJdtF6PT2","uupzkxciqp","QssNCFNYIM","D6rByG1RhS","uQIczhSSvQ","5Drn0Ss0Zu","VjCZquQIcz","NAFuwnnP8o","GWqqXcQOnv",
+"GSQwjIKxdL","GrDg75Namm","CdyBVkB5nP","djsrvFjHXR","HRxd8GSQwj","oGu6xs7Mxk","Yf2EcCp3mZ","mX2GExciqp","iwzGk5IhmG","RzaZAtlILt",
+"FGzgp5Mg9r","CdyBVv8yFN","FhtglFcWrW","KsjRKaDGtS","1j5L8uTacx","dmoS7JKWYR","C2IrcCxVEf","lkMUAt59lR","t59lR5Mg9r","Oz8yZ48cHL",
+"cL0aEEdBKc","uupzkzmLYD","uAWypogLgc","IBe8ko8Uyd","45cIH9XyT9","lCMxytuDyS","uvf7A5VZjS","CqqaDix74r","gdQsSJJs5m","vLsmS0Kyfs",
+"CK5W7VerEA","QnJ1SK20wK","FxX9qQssNC","ciuWzciuWz","YjB9tVIlwP","Zv7z0RmDcr","AIYUui7WMQ","n8pJ9zqH0W","NcICAuupzk","AkKTkd7vjM",
+"8cVD3zHF1q","WPmlxKr8ys","NOHsz48cHL","nnP8oFGzgp","t59lRJ2mQi","StlDJYOfrY","AmdQdBpYhV","o8UydHzZT8","zHF1qFVMxo","24ARFVNCPd",
+"POUYSMojnP","h1zcHG1RhS","iB08l7Ow5C","Ul4a1sx5Gl","CxVEfMezSW","0ao3lIRh48","45cIH0YAGH","RzaZAsx5Gl","EdBKc0PktI","m4bxUQClRL",
+"pmeCdyvOMI","oVQp6lXFOB","tl72WGXdoH","MmsIoxXTI4","Oz8yZoQ87r","64s8N3weIF","QClRLtuDyS","okgRifFDrJ","K20wKm4bxU","WPmlx3weIF",
+"BGaQYYw2oU","QnJ1SFGzgp","Ta8f6FLsph","TXQ0ZpAhR1","kZANm6AFT0","lCMxyC2Irc","FLsphogLgc","6AFT0hUTw7","MaJQszQt6Q","SbRYy2TRI7",
+"Mm8siVLTy6","Z4I1vnlaBy","5ZaEz0YAGH","POUYSFjHXR","MmsIo9XyT9","L7cGcs7Mxk","d7vjMoVQp6","rz7UtGSQwj","0YAGHNAFuw","8cVD3dhSuH",
+"i3pyd6AFT0","v8yFNNcICA","v1Hln6AFT0","he9IAZhwG1","xciqp64s8N","Ul4a1ZzJHW","taOXK9y4lw","LDk6fBpYhV","5nmWvfLNg8","Ss0ZuMGlTF",
+"cmXIXdQ586","48cHLMmsIo","8cVD3gdQsS","8xEKz9rlg9","t98iWHfyNQ","UlU3MRmDcr","AkKTk8cVD3","1v5hHlpF6W","RACujCqqaD","Kr8ysMaJQs",
+"W3VFH0Wr5y","hUTw77fsYM","jS1ajYh1hF","tAOsrBGaQY","LbRTHAIYUu","XyPZNjiVBP","QnJ1SvOqCE","JIqXiciuWz","DG4sTrz7Ut","pvgjSWPmlx",
+"Oz8yZkB5nP","jeskSMojnP","B3qem9y4lw","8RCUABCxeC","IRh48HP433","VjCZqlH1kt","t98iWa00b5","In3NSSmGzv","TwanoCfgr3","Q6LixIn3NS",
+"x3LDeSmGzv","AOgEeFcWrW","a00b5G1RhS","FxX9q0MR5X","bgJAzFcWrW","G1RhSiKqhr","vLsmSVerEA","0h1b1In3NS","uPX7G8cVD3","QbxXcrhl0J",
+"QbxXctaOXK","gtCA5M3zXL","EoToPb29RJ","uQIczGrDg7","QWxoTfFDrJ","7lUXZ9y4lw","SWfou7Ow5C","atef245cIH","HlUbFt98iW","7lUXZzHF1q",
+"HP4331v5hH","aL6AJuvf7A","WPmlxJ2mQi","FwEJzsoy9t","48cHLjtn0X","Kr8ysY1mC0","vOqCEECMvU","lsQGomz8gx","jeskSJ2mQi","14FLRlXFOB",
+"lkMUAb29RJ","JJs5m16lHc","lkMUAciuWz","IRh48uJScX","FLsphSs0Zu","JRJQBTCgPp","dQ586iqv4k","a00b5XyPZN","guMb8IKxdL","vLsmSQworu",
+"JRJQBUvlv4","rKDLJuJScX","8U2nUMezSW","AkKTknFqik","xXTI4SmGzv","yEfy9lViBv","16lHc24ARF","sqVrfWMiS3","vOqCENxx9V","hE1QlQChxs",
+"WaWsvbgJAz","QnJ1SReKEW","faHirVerEA","hYBCKdhSuH","pWiOsuoStw","FGzgp7hyVv","Ul4a1RkQke","TwanoLewvM","C2IrcWMiS3","Mm8sivkCHH",
+"HP433brhlQ","KsjRKdpe1v","WreyPFFDui","sx5GllsQGo","uN6r38FmFH","5VZjS5drc6","BGaQYJ2mQi","0BmCy8xEKz","QssNCrhl0J","yvOMI8U2nU",
+"Kr8ysGrDg7","dQ586uN6r3","IRh48ZJTXH","WmadAlH1kt","s93MlReKEW","POUYSFPfSE","tlILtuJScX","POUYSzQt6Q","KsjRKDQimp","Yf2Ecs4786",
+"AOgEeWPmlx","ZhwG1sx5Gl","In3NSLewvM","VjCZqMkgy8","F6PT2DLhzM","fcJOynlaBy","tvdkDJkzUn","t59lRFjHXR","0MR5XWmadA","Cfgr39iGoT",
+"Kr8ys2TRI7","MK07Y0Wr5y","WmadAgf8rI","fmIK19y4lw","FwEJzuZPqg","n8pJ9NAFuw","WPmlx64s8N","lH1ktUlU3M","DQimpzz4ZU","X6PindQ586",
+"J2mQidmoS7","VLTy645cIH","WaWsvNcICA","zHF1qCK5W7","RBhp00BmCy","h1zcHUmaEv","atef24QMc9","VLTy6a00b5","cShY2B3qem","qUJMdeuZA5",
+"Chuy3i7WMQ","VjCZqpAhR1","pT8wuRmDcr","v2eC3fcwDa","NAFuwRmDcr","0PktIhUTw7","P6bcgb29RJ","JkzUniqv4k","ZUnqt8RCUA","2hEEUuAWyp",
+"s4786GSQwj","X6Pin7fKYU","zqH0WlweGy","kB5nP618Di","HP433uoStw","BFkb8SWfou","WPmlxt59lR","s93Ml618Di","KZamHFNYIM","y94nwxciqp",
+"AkKTkTCgPp","h1zcHfLNg8","JIqXifcJOy","l83UdblLA9","16lHcUvlv4","ZUnqtfcJOy","okgRi45cIH","MmsIorhl0J","qUJMdVjCZq","MaJQshSSvQ",
+"tuDySBFkb8","LDk6fFPfSE","Y1mC0MGlTF","gdQsSd7vjM","sqVrf5IhmG","JJs5mFFDui","uN6r3rKDLJ","uTacxaL6AJ","Waim6WreyP","FFDuisx5Gl",
+"8cVD3QWxoT","tjQxsJkzUn","AIYUuAOgEe","Kr8ysyofH3","cmXIXMmsIo","0h1b1UmaEv","Cfgr3RpBQm","lXFOBXflUq","Zv7z0Twano","JXljWiwzGk",
+"EoToPrz7Ut","AOgEemX2GE","FhtglfLNg8","RpBQmHfyNQ","NhXdu8hJdt","lXFOBgtCA5","ZJTXHL7cGc","FcWrW7X3uy","SbRYyzY1GY","FVMxo4W0Tl",
+"QbxXcQWxoT","ni2v1ZUnqt","Ul4a1jeskS","jiVBPni2v1","SWfouuLtKs","B3qemSs0Zu","3otm6zz4ZU","lkMUAKASQ8","Yh1hFYOfrY","fqypyGXdoH",
+"Vprf2Qworu","WDVWJ2TRI7","azIWp2Nslm","Nxx9Vfqypy","No0QbbZLvS","8U2nUK20wK","O3iyQHRxd8","Yf2EcIKxdL","IBe8k14FLR","VjCZq0BmCy",
+"wiHrZyToGW","8xEKzcL0aE","soy9tiB08l","ZzJHWlkMUA","POUYSlsQGo","ix74rRpBQm","Uvlv4pFrrl","Mm8siM6qcG","jS1aja00b5","dhSuHSjskQ",
+"yluBx45cIH","RzaZAn1pmO","HfyNQpT8wu","RpBQm8U2nU","cL0aEZJTXH","n1pmOMGlTF","s4786NcICA","BCxeCFVMxo","fFDrJIRh48","FhtglBGaQY",
+"QClRLtlILt","zFgtBMojnP","xciqpa00b5","VLTy6dQ586","mX2GEFPfSE","oGu6xsx5Gl","lm0pDsuY4x","RsQUqFVMxo","0KyfsFPfSE","RzaZAiKqhr",
+"7lUXZNcICA","QChxsOHaBz","Cp3mZydG8U","oVQp6l83Ud","tlILt9rlg9","nnP8o1v5hH","y94nwVNCPd","1j5L8vkCHH","VBjhzYh1hF","DQimpzQt6Q",
+"t98iWoGu6x","pAhR1NAFuw","MezSWCdyBV","taOXKGWqqX","AgJHQpmeCd","MK07YpmeCd","gjUTuqUJMd","BpYhVyluBx","WaWsvd7vjM","rhl0JaDGtS",
+"2hEEUulk41","lkMUA0Wr5y","MK07YRmDcr","8RCUAuTacx","9XyT97fsYM","fmIK1gjUTu","1LB1LWaWsv","QssNC2ZHdk","HzZT82hEEU","WPmlxaL6AJ",
+"VIlwPBpYhV","xXTI4fqypy","Dz1R3oVQp6","RsQUq5drc6","Waim6P6bcg","pWiOsfLNg8","zbIYYfaHir","K4GS8DcpWB","tjQxsjSjS3","i3pydXflUq",
+"FwEJzECMvU","8hJdtuoStw","EoToPWmadA","5IhmGcQOnv","7lUXZ1LB1L","wDajXt98iW","3otm6Ul4a1","FFDui48cHL","NAFuwazIWp","WreyPfFDrJ",
+"W3VFHZzJHW","fcwDaWmadA","7lUXZlpF6W","2NslmK4GS8","DcpWBRBhp0","B3qemQbxXc","jtn0XSWfou","iqv4kO3iyQ","TwanoVjCZq","4dEz6EdBKc",
+"uQIczHzZT8","tl72WZuDtD","W3VFHbrhlQ","Z4I1vrKDLJ","euZA5X6Pin","TXQ0ZNhXdu","Zv7z0qaofN","Uvlv4uQIcz","ZUnqtZUnqt","uN6r3QChxs",
+"tAOsr0h1b1","b29RJkB5nP","9iGoTmz8gx","NOHszuPX7G","lViBvuN6r3","uAWypgjUTu","8RCUAydG8U","OUYuF7X3uy","1v5hHYf2Ec","rKDLJG1RhS",
+"zY1GYm4bxU","lCMxy6q6L9","ydG8U5Drn0","yofH3cQOnv","IKxdLFNYIM","QworuvLsmS","aez9ydjsrv","h1zcHdhSuH","Q6hMCd7vjM","rhl0JqUJMd",
+"i3pyd0ao3l","AXpwEBFkb8","Ss0ZuhE1Ql","Q6LixBbwgA","29QAzuN6r3","ZuDtD5Mg9r","No0QbDz1R3","oGu6xpiJSk","HRxd8suY4x","StlDJ0MR5X",
+"FVMxocShY2","oVQp6QnJ1S","dmoS71LB1L","iqv4k4W0Tl","4QMc9OxWIH","xReec7lUXZ","uZPqg5ZaEz","SbRYyl83Ud","AmdQdQnJ1S","2ZHdk5drc6",
+"i3pydFwEJz","kB5nPMm8si","fmIK1kB5nP","BFkb8brhlQ","FGzgppWiOs","P6bcgIn3NS","9XyT9xReec","AXpwENhXdu","NhXdu6q6L9","5drc63weIF",
+"kZANmCNHmv","pmeCd0MR5X","yofH3uLtKs","uJScXlm0pD","NAFuw580YD","yToGWvOqCE","48cHL6AFT0","TXQ0ZW7cTs","5VZjSM3zXL","QbxXcuLtKs",
+"45cIHpAhR1","45cIHt98iW","taOXKbrhlQ","0Wr5yyofH3","ECMvUP6bcg","QssNCBpYhV","9y4lwbZLvS","Vprf2zQt6Q","RACujQnJ1S","FjHXRSmGzv",
+"rz7UtZ4I1v","Twano48cHL","GSQwja00b5","8FmFHVjCZq","i3pydrKDLJ","uJScXGWqqX","prNT6v8yFN","l83Ud6AFT0","ZhwG18hJdt","Vprf2iB08l",
+"Cp3mZs7Mxk","yluBxJXljW","VjCZq580YD","F6PT2AIYUu","3otm6P6bcg","BGaQY7hyVv","5VZjS6AFT0","Pb1paqQxHP","Oz8yZStlDJ","5drc6FVMxo",
+"Y1mC0pmeCd","jzUqRGXdoH","blLA9yofH3","lj07QDz1R3","AOgEe2Yz7E","Vprf22DREs","D6rByni2v1","WmadAFPfSE","tlILtAIYUu","IBe8k7Ow5C",
+"IjTwPOz8yZ","7lUXZAmdQd","YOfrYiB08l","HlUbFsx5Gl","jfREuStlDJ","hYBCK9eoRc","lweGyjSjS3","sx5GlPOUYS","VIlwPZhwG1","Kr8ys5Mg9r",
+"h1zcHe6e4z","StlDJDQimp","iKqhrVjCZq","tuDySM6qcG","SbRYygdQsS","qaofNfFDrJ","jfREuMojnP","WDVWJtl72W","azIWpvLsmS","DLhzMhSSvQ",
+"lViBv6AFT0","0Kyfsgf8rI","AgJHQZJTXH","ru4UGjSjS3","suY4x0Wr5y","gIYvEDz1R3","lXFOBFVMxo","0MR5XzFgtB","lXFOBzz4ZU","MezSW5drc6",
+"5Mg9rfqypy","wiHrZlXFOB","hUTw7VjCZq","d7vjMoQ87r","7hyVvlkMUA","wiHrZOz8yZ","kB5nPuPX7G","F6PT29iGoT","sqVrfGXdoH","rz7Utuupzk",
+"ECMvUZhwG1","M6qcGn1pmO","sqVrf7hyVv","5Mg9rfFDrJ","nlaByDQimp","SbRYyLbRTH","Zv7z0POUYS","MojnPZv7z0","xReecJ2mQi","pv0i75nmWv",
+"QssNCVBjhz","POUYSsx5Gl","Ss0ZuuoStw","cQOnvHP433","Q6hMCL7cGc","9iGoTpFrrl","h1zcHMezSW","CIShGzqH0W","618Di2Yz7E","n1pmOZhwG1",
+"F6PT2Rxrsm","1v5hHZuDtD","07n1cIKxdL","ulk41Q6Lix","WDVWJK4GS8","M3zXLRkQke","hi5X7ksJby","24ARF0MR5X","POUYSQWxoT","dpe1vJIqXi",
+"5drc6uoStw","OUYuFrhl0J","GWqqX5Drn0","d85a90Kyfs","tl72WSjskQ","zmLYD2Nslm","CqqaDJ2mQi","QYxC0Dz1R3","9XyT9ZUnqt","FjHXRn8pJ9",
+"2Yz7EK4GS8","NOHszWaWsv","zz4ZUQ6hMC","8FmFHm4bxU","Oz8yZbZLvS","dQ586LDk6f","gdQsSuZPqg","QssNC6AFT0","QnJ1S0BmCy","Mkgy8Twano",
+"v2eC3FcWrW","ksJby4W0Tl","uoStwfcJOy","8TxD7NOHsz","1LB1L24ARF","aez9yMK07Y","K4GS8v1Hln","JJs5m8RCUA","oQ87rVLTy6","LewvMG1RhS",
+"9iGoTjfREu","b29RJFNYIM","DQimp0MR5X","fmIK1CxVEf","8xEKzcQOnv","uAWypyofH3","nFqikwDajX","n1pmOVNCPd","FFDui0Wr5y","0MR5XS77LH",
+"ogLgcOUYuF","pFrrlaDGtS","ni2v1wiHrZ","ni2v1HRxd8","7fsYMOUYuF","XflUqK4GS8","iB08lcmXIX","nFqikpAhR1","XyPZNFGzgp","d85a99iGoT",
+"5Drn0dQ586","XyPZN0h1b1","t59lRJJs5m","9iGoTmX2GE","1j5L8XflUq","BGaQYuQIcz","M6qcGhUTw7","bgJAzMaJQs","7Ow5C5Drn0","BFkb8GrDg7",
+"xciqpMGlTF","BFkb8Kr8ys","LDk6fSs0Zu","GXdoHi7WMQ","5Drn0zqH0W","iKqhrG1RhS","16lHcaL6AJ","G1RhSThjNn","7fKYUuZPqg","zQt6QEoToP",
+"BGaQYHfyNQ","tlILtFcWrW","HfyNQrz7Ut","FwEJzt59lR","Q6hMCpFrrl","Ul4a1euZA5","h1zcHVBjhz","uoStwVjCZq","5iGN56AFT0","RmDcrtaOXK",
+"S77LH8U2nU","hYBCKuvf7A","Kr8yss93Ml","9XyT9AmdQd","Z4I1v4dEz6","QClRLk85Ae","Mkgy8zz4ZU","64s8N2Nslm","6AFT0lsQGo","soy9tCp3mZ",
+"atef2WMiS3","tlILtcShY2","0h1b13otm6","wiHrZJkzUn","vkCHHlViBv","4W0TlFNYIM","lsQGouQIcz","MGlTFni2v1","KASQ8UmaEv","FPfSEFcWrW",
+"618DizFgtB","euZA5xXTI4","07n1cGSQwj","HRxd8C2Irc","FcWrW7hyVv","7fsYMZzJHW","P6bcguQIcz","uTacx5nmWv","8xEKzjSjS3","l83Ud24ARF",
+"U3yw5W3VFH","tjQxsQYxC0","NhXdu5drc6","5IhmGyToGW","xReecaDGtS","AkKTkWMiS3","ciuWzuAWyp","GSQwjcQOnv","AXpwEyvOMI","ogLgcyofH3",
+"2ZHdkZJTXH","gdQsSZ4I1v","fqypyhi5X7","iqv4kQnJ1S","K4GS8JKWYR","2Yz7EFxX9q","ni2v1uPX7G","v2eC3JkzUn","jS1ajRpBQm","CdyBVFnPFB",
+"cShY2zz4ZU","TCgPpgtCA5","mX2GEtl72W","DG4sTsoy9t","AXpwE8FmFH","Mm8sigjUTu","P6bcgHzZT8","SWfou5Drn0","FVMxoxciqp","StlDJ9y4lw",
+"ydG8UgdQsS","ThjNnciuWz","RpBQmI7p2a","UlU3MPYBf4","OUYuFBbwgA","rz7UtKsjRK","7ku1p1v5hH","xReecyluBx","AkKTkSs0Zu","I7p2aOUYuF",
+"24ARFlj07Q","hYBCKSmGzv","tAOsrVLTy6","JJs5mMkgy8","C2IrcReKEW","MK07YiB08l","DQimpCIShG","lXFOBNxx9V","HfyNQFVMxo","k85AecQOnv",
+"lm0pDIjTwP","aez9y16lHc","EOE1oiB08l","y94nwS2Dfu","vkCHHB3qem","pWiOsWaim6","55rfBFxX9q","5Mg9rpv0i7","Z4I1vuPX7G","ZhwG1pT8wu",
+"9XyT97hyVv","okgRiGXdoH","gjUTuuAWyp","24ARFnnP8o","djsrvU3yw5","DLhzMd85a9","HzZT8he9IA","5nmWvCfgr3","i7WMQfqypy","aFFssEOE1o",
+"fFDrJVBjhz","3weIFIKxdL","t98iWVNCPd","BbwgASmGzv","EdBKcFcWrW","uupzkGv3Fq","RpBQmMmKGJ","Q6hMCoGu6x","piJSkDG4sT","GWqqXzY1GY",
+"JkzUnuQIcz","X6Pinulk41","ydG8U7fKYU","9GXkXRkQke","uoStwVLTy6","ru4UGru4UG","2TRI7prNT6","pmeCdh1zcH","Qworu8xEKz","FVMxol83Ud",
+"uZPqgIKxdL","uQIczxXTI4","8hJdtiqv4k","5IhmGNOHsz","FwEJzSjskQ","lm0pDjtn0X","7fKYUzHF1q","yEfy9v2eC3","2TRI7fFDrJ","BFkb8LDk6f",
+"7lUXZd85a9","CNHmvoGu6x","WDVWJzqH0W","lm0pDFhtgl","QssNCh1zcH","bZLvS48cHL","lCMxynFqik","Nxx9V8RCUA","lH1ktGWqqX","uN6r3Qworu",
+"mz8gxydG8U","K20wKCfgr3","C2IrcIBe8k","uoStwgdQsS","RACujtvdkD","4QMc9tuDyS","i3pydRzaZA","CK5W7QClRL","FwEJzydG8U","16lHcZJTXH",
+"yluBxGrDg7","iKqhr2Nslm","QssNCv2eC3","cShY2pT8wu","QClRLzbIYY","yofH3S77LH","zz4ZUgdQsS","zmLYDBGaQY","W3VFHfqypy","gtCA5WDVWJ",
+"GXdoHYw2oU","euZA5s7Mxk","NAFuwzqH0W","mX2GECK5W7","bZLvSrKDLJ","Rxrsmhi5X7","Q6hMCuN6r3","b29RJZv7z0","uvf7ATXQ0Z","SjskQxciqp",
+"O3iyQDG4sT","QssNC14FLR","nFqikFwEJz","M3zXLlH1kt","5ZaEzy94nw","ni2v1aL6AJ","LDk6fNcICA","hE1QlgtCA5","RpBQmYh1hF","3otm6qQxHP",
+"ZuDtD9GXkX","tAOsr55rfB","7Ow5Ci3pyd","8xEKzv1Hln","618DijSjS3","lweGyRpBQm","5IhmGP6bcg","7fsYM3otm6","AmdQd6AFT0","DcpWBXflUq",
+"pvgjSZzJHW","D6rByd7vjM","qaofNPYBf4","uQIczEdBKc","OUqFMogLgc","AOgEe0PktI","tAOsrFVMxo","14FLRi7WMQ","lm0pDhYBCK","fmIK1aFFss",
+"7fsYMprNT6","07n1cYh1hF","BFkb8JIqXi","iqv4kwDajX","pFrrl3otm6","SbRYyPb1pa","t59lRJKWYR","rhl0JbrhlQ","e6e4z16lHc","tl72WsuY4x",
+"zY1GYyvOMI","48cHLGSQwj","Yh1hFIKxdL","xXTI4rKDLJ","DLhzMF6PT2","WmadAiqv4k","L7cGcuoStw","CdyBVIBe8k","TXQ0Z0Wr5y","KASQ8Dz1R3",
+"LbRTHlweGy","VNCPd618Di","HRxd8ZhwG1","NhXduyToGW","U3yw55nmWv","Cp3mZlXFOB","jtn0XStlDJ","CdyBVQbxXc","y94nwpWiOs","kB5nPprNT6",
+"M6qcGatef2","EOE1oatef2","v2eC32Yz7E","uAWyp9y4lw","2Nslm8TxD7","lweGyd7vjM","WmadARzaZA","BFkb8TCgPp","Ta8f6VIlwP","9rlg9t98iW",
+"HlUbFNcICA","Vprf2618Di","CIShGciuWz","JXljWxReec","okgRiwDajX","F6PT2lH1kt","fcJOyYh1hF","uQIczLewvM","CNHmvCqqaD","uN6r3s93Ml",
+"rhl0J55rfB","GWqqXJkzUn","y94nw7hyVv","7Ow5CIn3NS","VIlwPVjCZq","SbRYyD6rBy","hUTw7t59lR","iqv4kTwano","BpYhVzHF1q","bZLvSO3iyQ",
+"SmGzvt59lR","uAWyplj07Q","WmadAAIYUu","a00b5jeskS","Mkgy8GXdoH","oVQp6sqVrf","AIYUutvdkD","SbRYy8TxD7","9GXkX3otm6","ni2v1HzZT8",
+"lkMUASs0Zu","CK5W78FmFH","QClRLxciqp","hYBCKpiJSk","QClRLuJScX","FxX9qJJs5m","OUYuFpWiOs","0BmCy580YD","JXljWLewvM","RmDcrPb1pa",
+"fFDrJazIWp","XyPZNLbRTH","FwEJzZuDtD","uTacxhE1Ql","HP433cmXIX","JkzUnJkzUn","tvdkD1LB1L","FNYIMblLA9","a00b51v5hH","VBjhzbZLvS",
+"ZhwG1K20wK","piJSkJIqXi","atef2iwzGk","xciqp4QMc9","MezSWWPmlx","tAOsr2DREs","8RCUAuoStw","djsrvtl72W","zz4ZUFxX9q","KsjRKfFDrJ",
+"mz8gxZJTXH","8xEKzfcwDa","fcwDaBGaQY","TXQ0ZUlU3M","zY1GYuJScX","fqypygf8rI","8xEKz14FLR","d7vjMiwzGk","DLhzMMGlTF","lXFOBsoy9t",
+"7Ow5CqQxHP","F6PT26q6L9","e6e4zo8Uyd","yEfy99eoRc","uN6r3QClRL","v1HlndmoS7","iqv4kJRJQB","Cp3mZWreyP","rz7Ut1j5L8","MaJQs64s8N",
+"uupzkZUnqt","ydG8U2Nslm","lXFOBNAFuw","TXQ0ZRsQUq","jS1ajnFqik","9eoRcyToGW","vLsmS8TxD7","07n1cqUJMd","9y4lwWaim6","29QAz5Mg9r",
+"Yw2oUJRJQB","oQ87rVjCZq","tuDyS8RCUA","xciqpo8Uyd","XyPZNVNCPd","ZzJHWMojnP","ZUnqtUlU3M","CIShG6q6L9","pFrrld85a9","a00b5jSjS3",
+"9GXkXrhl0J","wiHrZfFDrJ","5Drn0IBe8k","he9IAVIlwP","AkKTkMm8si","VIlwPBbwgA","S2Dfu9eoRc","aL6AJuLtKs","uTacxFNYIM","x3LDeni2v1",
+"Vprf2Ta8f6","UmaEvL7cGc","QChxsyluBx","hSSvQdmoS7","8hJdtt98iW","S77LHOUYuF","JRJQB0BmCy","MGlTFVLTy6","MmKGJDLhzM","d85a9gjUTu",
+"5Drn0P6bcg","sx5Glmz8gx","6q6L9zmLYD","Kr8ysOUqFM","FFDuiFFDui","uoStwVBjhz","LDk6fix74r","2Nslm14FLR","zqH0Wx3LDe","VjCZqfmIK1",
+"MaJQsSs0Zu","CNHmvix74r","Ta8f6RzaZA","BbwgA8xEKz","jtn0XuZPqg","NhXdufqypy","IKxdLaDGtS","5drc6GSQwj","OxWIHuupzk","Cp3mZhYBCK",
+"0KyfsWreyP","ZzJHWuZPqg","pv0i7xciqp","Q6LixtvdkD","Ul4a1x3LDe","uAWyp9GXkX","fqypyUmaEv","LDk6fwDajX","D6rBy618Di","RzaZACp3mZ",
+"IRh48OxWIH","wiHrZiKqhr","euZA52Yz7E","5ZaEzQnJ1S","cL0aE7hyVv","aL6AJRACuj","taOXKDcpWB","2hEEUZzJHW","aFFssM3zXL","VBjhz580YD",
+"pFrrlyToGW","J2mQiuupzk","pT8wuAgJHQ","uoStwhe9IA","EoToPguMb8","CqqaDpvgjS","VjCZqulk41","CNHmvfmIK1","AXpwEfaHir","ZzJHWOz8yZ",
+"BCxeC3weIF","sx5Gl9GXkX","Vprf2TXQ0Z","FwEJztlILt","Q6hMCSjskQ","VLTy6BpYhV","9rlg9BbwgA","PYBf4zz4ZU","zHF1q2Yz7E","kZANmuPX7G",
+"xciqpix74r","y94nwPYBf4","7lUXZLewvM","bgJAz45cIH","s7MxkhYBCK","jS1ajgjUTu","oGu6xNcICA","vLsmSpiJSk","lViBvCfgr3","blLA91LB1L",
+"yToGWgf8rI","CIShGhE1Ql","GSQwjCxVEf","0h1b1OxWIH","bZLvSTXQ0Z","ThjNn7ku1p","AOgEe3weIF","v8yFN8TxD7","QssNCRkQke","tvdkDuupzk",
+"yofH3TXQ0Z","vkCHH0ao3l","lsQGoBCxeC","AmdQdTwano","jSjS3W3VFH","OxWIHY1mC0","7fsYMfaHir","jfREuv1Hln","SjskQPOUYS","jtn0XyEfy9",
+"RpBQmBGaQY","uupzk5drc6","ReKEWhYBCK","RpBQmGWqqX","prNT6sqVrf","D6rBy8TxD7","tuDySTXQ0Z","0PktIaDGtS","4W0TljS1aj","lCMxytlILt",
+"55rfBWDVWJ","pAhR1XyPZN","2Yz7ErKDLJ","BGaQY4dEz6","OUqFMaFFss","ReKEWCNHmv","8xEKz16lHc","tlILtGWqqX","bZLvS7hyVv","UmaEvFGzgp",
+"EdBKciqv4k","l83Udd7vjM","CqqaDydG8U","0PktIQbxXc","W7cTs0ao3l","StlDJtvdkD","WaWsv0Kyfs","C2IrcIjTwP","hUTw7Ta8f6","MmsIolXFOB",
+"XyPZNDcpWB","2Yz7EtAOsr","7X3uysx5Gl","RACujO3iyQ","hYBCK6AFT0","m4bxUlm0pD","RxrsmnlaBy","jSjS3MaJQs","v8yFNHzZT8","J2mQiVLTy6",
+"BbwgAZuDtD","IjTwPpAhR1","Chuy3v2eC3","ZJTXHOHaBz","fLNg8tl72W","5ZaEzQbxXc","JIqXiWPmlx","gdQsSpAhR1","Uvlv4W7cTs","NAFuwtAOsr",
+"QWxoTPOUYS","uQIczDz1R3","DLhzMIjTwP","taOXKQworu","fcwDapv0i7","uupzkhi5X7","NOHszrKDLJ","RACujFnPFB","rKDLJAXpwE","hSSvQYjB9t",
+"azIWpSjskQ","ulk41AXpwE","soy9t0BmCy","Yf2EcZJTXH","ReKEWP6bcg","JXljW5IhmG","GrDg7t59lR","fLNg8zQt6Q","0BmCynlaBy","SWfouFVMxo",
+"IRh48zFgtB","VerEAuAWyp","vLsmSK4GS8","J2mQirz7Ut","fLNg8ZzJHW","Yw2oULbRTH","OUYuFNhXdu","NhXduBGaQY","zmLYDtAOsr","uQIczlCMxy",
+"0BmCyNxx9V","1j5L8tjQxs","lsQGoAIYUu","pWiOsGrDg7","FFDuiGXdoH","UmaEvzFgtB","OHaBzLewvM","ReKEWgf8rI","Ul4a1IjTwP","5ZaEzfaHir",
+"O3iyQ3otm6","i3pyd5Namm","45cIHCK5W7","kZANm5iGN5","ZJTXHvOqCE","pWiOsI7p2a","2ZHdkfqypy","ReKEW8U2nU","X6PiniB08l","QYxC0QChxs",
+"rz7Utv8yFN","uAWypCxVEf","fmIK1lCMxy","iKqhr9y4lw","uvf7A0YAGH","zqH0WyofH3","KZamHU3yw5","KsjRKtAOsr","M6qcGHzZT8","hUTw7UmaEv",
+"CxVEfv1Hln","AOgEeS2Dfu","v8yFN7fsYM","580YDFVMxo","hi5X7ciuWz","nlaByJKWYR","Pb1paAOgEe","pWiOsjiVBP","ciuWz24ARF","lViBvRxrsm",
+"ZuDtDGrDg7","dmoS76AFT0","BbwgAjSjS3","qUJMdqQxHP","48cHLa00b5","pvgjSMGlTF","OHaBzb29RJ","SWfou0MR5X","XyPZN6q6L9","prNT6Ul4a1",
+"Dz1R3BCxeC","MK07YhE1Ql","Mkgy8RBhp0","Z4I1vpv0i7","8cVD3n8pJ9","DcpWB5Mg9r","EoToPQYxC0","tlILt64s8N","nFqikX6Pin","AOgEepvgjS",
+"7lUXZAIYUu","No0QbBCxeC","ThjNn29QAz","IjTwP6AFT0","aDGtSdQ586","FjHXRuZPqg","BGaQYhE1Ql","Yw2oUZJTXH","8cVD3i3pyd","uQIczB3qem",
+"Chuy3FNYIM","uoStwjeskS","FNYIMVBjhz","uN6r3gtCA5","soy9t0Kyfs","QWxoTReKEW","dpe1vtuDyS","zmLYDfLNg8","rhl0JWaWsv","NhXduVprf2",
+"3weIFMK07Y","Yf2Ecl83Ud","JkzUnRBhp0","VNCPdLDk6f","Mm8siPOUYS","oVQp65Namm","s47867fKYU","ECMvUa00b5","zHF1q24ARF","iqv4kYjB9t",
+"s478645cIH","Kr8ysUlU3M","JRJQBgjUTu","BFkb85Drn0","faHirtjQxs","zz4ZUVprf2","pFrrl2Nslm","Twanolm0pD","d7vjMU3yw5","HzZT8l83Ud",
+"yofH3LDk6f","MmsIoDz1R3","C2IrcpvgjS","VBjhzuAWyp","piJSkFnPFB","pT8wu7lUXZ","UlU3MRsQUq","cL0aE2DREs","QnJ1Srhl0J","Yh1hFL7cGc",
+"L7cGcWDVWJ","5Namm9iGoT","tAOsrn8pJ9","AgJHQ8cVD3","ni2v1Yf2Ec","blLA9gjUTu","BbwgA8FmFH","Cfgr3cmXIX","JkzUnuoStw","rhl0Js7Mxk",
+"55rfBnlaBy","hE1Ql8FmFH","iqv4kuAWyp","5drc6s4786","CxVEfNhXdu","zHF1qt98iW","hE1Qlrhl0J","lweGyM6qcG","tlILtKsjRK","lm0pD5iGN5",
+"v2eC3KASQ8","VNCPdoQ87r","O3iyQ580YD","OUqFMi3pyd","s4786cmXIX","U3yw5MezSW","pmeCdatef2","580YDokgRi","S77LHBpYhV","1LB1LvLsmS",
+"FjHXRcShY2","gjUTuuPX7G","xciqpJ2mQi","tAOsrFPfSE","Nxx9VChuy3","In3NSDG4sT","OUqFMD6rBy","5Drn07lUXZ","NOHszdjsrv","prNT6uAWyp",
+"qaofNdjsrv","5VZjSFxX9q","F6PT28U2nU","t59lRd85a9","FjHXR45cIH","tl72W8U2nU","dpe1vRmDcr","tlILtWDVWJ","brhlQtAOsr","Yh1hFCdyBV",
+"jeskSNxx9V","M6qcGKASQ8","5iGN5Y1mC0","o8Uyd8xEKz","XflUquTacx","BpYhVa00b5","0KyfsuJScX","hi5X7XflUq","ECMvUUlU3M","I7p2aFLsph",
+"Y1mC0QYxC0","kZANmlm0pD","RmDcrZJTXH","CxVEfb29RJ","RBhp0pmeCd","2hEEUxXTI4","he9IAuJScX","Qworus93Ml","CK5W7lsQGo","0MR5XiwzGk",
+"wiHrZNxx9V","t98iWRkQke","dQ586k85Ae","RACujRBhp0","uupzk6AFT0","HzZT807n1c","yvOMIWaWsv","s7MxkZzJHW","RACujdmoS7","AOgEeRsQUq",
+"POUYSoVQp6","07n1cS2Dfu","lpF6WhUTw7","Cfgr3VBjhz","OHaBzJkzUn","t98iWNcICA","64s8NtvdkD","0h1b18TxD7","X6PinuTacx","BbwgAfaHir",
+"Chuy3aL6AJ","HlUbFCK5W7","JkzUnCK5W7","Q6Lix0Wr5y","oVQp6FnPFB","ydG8UDz1R3","sqVrfjS1aj","VBjhzokgRi","dpe1v8hJdt","No0QbRkQke",
+"tuDyS2hEEU","RACujjtn0X","m4bxUulk41","jzUqRjzUqR","ZuDtDpvgjS","YOfrYCp3mZ","xReecFFDui","ogLgcaDGtS","W3VFHUlU3M","HRxd8oGu6x",
+"TwanoIjTwP","oGu6xRpBQm","yofH3Yf2Ec","U3yw5ru4UG","5IhmG580YD","Yh1hFcShY2","v2eC3aFFss","ksJby0MR5X","gf8rIGXdoH","ogLgcxReec",
+"euZA5FwEJz","lsQGoFnPFB","VIlwPWmadA","ReKEW7fKYU","BFkb8a00b5","6q6L9nlaBy","RsQUqlm0pD","ksJbyP6bcg","StlDJdhSuH","7fsYMhUTw7",
+"euZA5AmdQd","VjCZq618Di","gjUTulm0pD","ydG8UVNCPd","gjUTuPb1pa","BCxeCkB5nP","EOE1oyToGW","4W0TlWreyP","5Mg9rRACuj","0YAGHWaWsv",
+"EOE1oCp3mZ","1LB1LtuDyS","9rlg9qaofN","RsQUq618Di","zY1GYJRJQB","t59lRQWxoT","RsQUqRkQke","Ss0ZuCfgr3","AIYUuBpYhV","2hEEUJJs5m",
+"xciqpzbIYY","MmsIoJkzUn","RpBQmeuZA5","Yh1hFyluBx","YOfrYatef2","X6PinRzaZA","NAFuwTCgPp","fLNg85nmWv","GSQwjRkQke","7ku1pyvOMI",
+"14FLRJIqXi","4dEz6FPfSE","GWqqXVjCZq","Z4I1vTwano","Chuy3ZzJHW","AIYUu8cVD3","tjQxscmXIX","gjUTuWMiS3","StlDJNhXdu","iwzGkjtn0X",
+"Yh1hFThjNn","TCgPp580YD","SmGzvQ6hMC","JJs5mOUqFM","TCgPpKASQ8","FnPFB580YD","Mkgy8580YD","lH1kttaOXK","FLsphC2Irc","7ku1pNxx9V",
+"ulk412TRI7","jzUqRpvgjS","WmadAciuWz","fmIK1HlUbF","NhXdu9XyT9","MojnP0h1b1","QClRL0Wr5y","Y1mC05VZjS","ECMvUix74r","B3qemFhtgl",
+"oVQp6fFDrJ","RACujuvf7A","jtn0XaFFss","x3LDeFGzgp","wDajXZ4I1v","tuDySDG4sT","GSQwjQYxC0","AIYUus7Mxk","gjUTuFGzgp","No0QbYOfrY",
+"8FmFHK20wK","uQIczYf2Ec","7fsYMWmadA","rhl0J5ZaEz","RACujRsQUq","ksJbyzY1GY","KASQ8pT8wu","lkMUA55rfB","iqv4k9eoRc","sx5Gl6q6L9",
+"MK07Yxciqp","P6bcgFhtgl","uPX7GiB08l","G1RhSguMb8","MmKGJuJScX","9y4lwk85Ae","zHF1qM3zXL","45cIHd85a9","zqH0WFFDui","24ARFD6rBy",
+"DLhzMrz7Ut","jzUqRX6Pin","ZuDtDMmsIo","VIlwPFPfSE","Q6hMCP6bcg","sqVrfWPmlx","lkMUAdpe1v","IjTwPiqv4k","m4bxUcShY2","AmdQd9XyT9",
+"Cfgr3M3zXL","tvdkDNAFuw","8FmFHBbwgA","QnJ1Sn8pJ9","Mkgy8uupzk","24ARFfcJOy","DLhzMD6rBy","FFDuim4bxU","DG4sTQbxXc","UlU3MGv3Fq",
+"TCgPpnnP8o","Q6Lix9iGoT","taOXKNOHsz","d85a9yvOMI","HlUbFJRJQB","s4786Q6Lix","SjskQMojnP","ulk41BFkb8","QbxXclCMxy","CK5W7EOE1o",
+"lXFOBvkCHH","NAFuwsx5Gl","tjQxs1LB1L","IjTwPThjNn","nlaByl83Ud","X6PinJKWYR","JXljWIBe8k","rKDLJU3yw5","yToGWa00b5","5VZjSs7Mxk",
+"i3pyduTacx","Kr8ysMmKGJ","0Kyfshi5X7","07n1c8U2nU","piJSklpF6W","djsrv5drc6","iKqhrqUJMd","WDVWJJkzUn","t59lRfFDrJ","s47865Drn0",
+"cL0aEReKEW","jSjS3lpF6W","IBe8kVprf2","2TRI7StlDJ","FwEJzDLhzM","618DiyvOMI","rz7Uti7WMQ","Q6Lixru4UG","IKxdLCfgr3","yvOMIDG4sT",
+"VerEAIRh48","DG4sTDLhzM","vLsmSzqH0W","BpYhV6AFT0","4dEz6WMiS3","k85AeKsjRK","fqypyyEfy9","Nxx9VprNT6","JKWYR7fsYM","JXljWrhl0J",
+"zFgtBzqH0W","uLtKsOUqFM","FjHXRguMb8","8cVD3Q6Lix","ogLgcVIlwP","P6bcgReKEW","Dz1R3wDajX","MezSWaDGtS","16lHcmz8gx","ogLgcKZamH",
+"HP433yofH3","B3qem5IhmG","0KyfsVNCPd","CxVEf8RCUA","bZLvSBbwgA","sqVrf5nmWv","ni2v10PktI","AgJHQD6rBy","okgRiuupzk","mX2GEqQxHP",
+"t59lRtAOsr","lsQGoDG4sT","CdyBVTXQ0Z","lViBvm4bxU","I7p2agIYvE","lj07Qhi5X7","ECMvUvOqCE","lm0pDt98iW","XyPZNa00b5","zz4ZUuJScX",
+"aez9yRzaZA","M6qcGFhtgl","wiHrZJXljW","WmadAuJScX","x3LDeFhtgl","ZzJHWk85Ae","yEfy9faHir","UlU3MS77LH","2Yz7EUmaEv","o8UydyofH3",
+"GrDg7soy9t","5drc6UlU3M","WaWsvQClRL","Gv3FqChuy3","YOfrY2Yz7E","ru4UGCxVEf","lkMUA5Drn0","HzZT8Nxx9V","gIYvERpBQm","taOXKhe9IA",
+"y94nw7Ow5C","aez9ypmeCd","gjUTuhUTw7","NhXduDG4sT","Yw2oUzqH0W","No0QbpiJSk","S2DfuyToGW","jeskS9y4lw","pWiOs6AFT0","s7Mxk4dEz6",
+"Ss0ZubZLvS","FxX9qSjskQ","48cHLFcWrW","zQt6QiB08l","QYxC0lH1kt","wDajXD6rBy","55rfBxXTI4","qUJMduoStw","7X3uys4786","tuDySrhl0J",
+"e6e4zlCMxy","RBhp0QbxXc","pv0i7pT8wu","aL6AJ5Namm","dpe1vO3iyQ","AmdQdDcpWB","LewvMn1pmO","vLsmSYjB9t","fcJOyCfgr3","faHirpT8wu",
+"n8pJ9W3VFH","y94nwNxx9V","7fKYUix74r","BFkb88RCUA","vkCHHECMvU","euZA5DcpWB","Chuy3sqVrf","CdyBVVBjhz","24ARFtuDyS","soy9tL7cGc",
+"uJScXEdBKc","9eoRcHRxd8","bZLvSd85a9","0YAGHvkCHH","tl72WM6qcG","RkQkeEOE1o","ZhwG1PYBf4","RBhp0Qworu","FhtglhUTw7","WmadA5ZaEz",
+"vLsmSSjskQ","lsQGo45cIH","v8yFNrKDLJ","QClRL5Drn0","YjB9tb29RJ","bgJAzUl4a1","ZuDtDIjTwP","QClRLfLNg8","mz8gxMkgy8","MmsIoAgJHQ",
+"LDk6fs4786","gIYvE5drc6","CxVEfQ6Lix","SjskQCdyBV","zmLYDeuZA5","ReKEWM3zXL","tuDySydG8U","Ul4a1i7WMQ","cQOnv7X3uy","zY1GYRmDcr",
+"ydG8UHzZT8","Mm8siTXQ0Z","atef2tl72W","VerEAFcWrW","v8yFNJJs5m","iwzGkyvOMI","NAFuwtlILt","0Kyfsni2v1","Y1mC08U2nU","lCMxylj07Q",
+"Cfgr324ARF","7Ow5Cm4bxU","cmXIX5nmWv","XyPZNTCgPp","5VZjSfcwDa","iwzGkfFDrJ","3otm6MmsIo","rhl0Jb29RJ","2Nslm8FmFH","hi5X7Yh1hF",
+"1v5hHydG8U","CxVEfbgJAz","LDk6fpv0i7","ciuWzprNT6","FxX9qFhtgl","QWxoTLDk6f","FhtglnlaBy","Ul4a1Mkgy8","O3iyQyEfy9","Yh1hFJXljW",
+"U3yw5fcwDa","0MR5XSbRYy","FLsphGrDg7","zFgtBRxrsm","5ZaEzLDk6f","7lUXZMkgy8","MGlTFzHF1q","L7cGcfLNg8","qQxHPMmsIo","tjQxs55rfB",
+"MojnPZJTXH","VLTy655rfB","bZLvSDz1R3","FcWrWMm8si","EdBKcVNCPd","HlUbFPOUYS","SjskQLbRTH","zQt6QDcpWB","UmaEvdhSuH","t98iWuQIcz",
+"0h1b1SbRYy","he9IA1j5L8","G1RhSHzZT8","wDajXzmLYD","WDVWJ7ku1p","16lHcdmoS7","U3yw5rhl0J","AIYUuK4GS8","7ku1pECMvU","ThjNnix74r",
+"MaJQsWaWsv","FFDuizz4ZU","FwEJzMaJQs","iqv4kS2Dfu","IjTwPSmGzv","taOXK8RCUA","D6rByU3yw5","2ZHdkQssNC","iqv4k3weIF","Ul4a13weIF",
+"M6qcGzqH0W","hYBCKlm0pD","5nmWvy94nw","Mm8siOxWIH","55rfBoVQp6","DcpWBYf2Ec","VNCPd0PktI","Ta8f68RCUA","PYBf445cIH","guMb8dpe1v",
+"v1HlnGSQwj","580YD8TxD7","lkMUAiB08l","YjB9tx3LDe","KZamHGSQwj","dQ586FFDui","QYxC0FVMxo","i7WMQlpF6W","lH1ktRkQke","aFFssSs0Zu",
+"qaofN5Drn0","EoToP29QAz","tuDySHfyNQ","GWqqXbZLvS","4QMc9VerEA","29QAzBpYhV","gf8rIlpF6W","DQimpsuY4x","1v5hHCNHmv","9XyT9Yh1hF",
+"RBhp0MGlTF","fqypyCfgr3","djsrv7fsYM","7hyVvDz1R3","yofH3MmKGJ","Mm8siIKxdL","UmaEveuZA5","2ZHdkMmKGJ","MaJQsMGlTF","Yf2EcL7cGc",
+"bgJAzS77LH","jfREugf8rI","LewvMVLTy6","FnPFBv2eC3","Mkgy8VLTy6","ciuWzWPmlx","WMiS3ru4UG","I7p2aWaim6","D6rBylpF6W","ogLgcZ4I1v",
+"Vprf2mX2GE","jS1ajlXFOB","o8UydQClRL","2hEEUsuY4x","cmXIXuvf7A","iwzGkFLsph","LDk6fOxWIH","lweGyh1zcH","RsQUq6q6L9","a00b5s7Mxk",
+"NhXduCIShG","TCgPpXflUq","uN6r3XflUq","MojnPDQimp","blLA9lH1kt","JJs5mfqypy","VLTy6BGaQY","ECMvUgf8rI","RkQkeZv7z0","hSSvQtuDyS",
+"ni2v1nlaBy","FhtglhSSvQ","guMb8pT8wu","ogLgcL7cGc","D6rByx3LDe","m4bxUB3qem","9iGoTuQIcz","vkCHHF6PT2","QnJ1SECMvU","7Ow5C8RCUA",
+"k85AeL7cGc","gf8rIl83Ud","gdQsSfFDrJ","8RCUAgjUTu","55rfB1LB1L","SjskQnFqik","1LB1LW7cTs","uZPqgkZANm","CdyBV45cIH","2TRI7i3pyd",
+"GrDg7RBhp0","tuDySdpe1v","NAFuwlCMxy","ydG8UzqH0W","zbIYYIBe8k","brhlQzbIYY","tuDyS29QAz","uPX7GqUJMd","16lHcMmsIo","8hJdtOz8yZ",
+"fcJOyJKWYR","K4GS8J2mQi","3weIFuN6r3","n8pJ9guMb8","TCgPpqQxHP","dhSuHBbwgA","VerEAe6e4z","WreyP9GXkX","FhtglRzaZA","RzaZAIKxdL",
+"I7p2a9XyT9","MojnPFwEJz","s7Mxkru4UG","gf8rIU3yw5","pvgjSIRh48","O3iyQguMb8","ZUnqtVLTy6","WPmlx2ZHdk","uAWypRsQUq","I7p2aAIYUu",
+"lm0pDKASQ8","GWqqX618Di","v1Hlno8Uyd","MGlTFjiVBP","lViBvaDGtS","ciuWz6AFT0","MaJQsatef2","24ARFSWfou","d7vjM5iGN5","Pb1pa14FLR",
+"gtCA5jS1aj","RACujZv7z0","rz7UtjS1aj","tjQxsiB08l","i7WMQguMb8","gdQsSCIShG","aL6AJAOgEe","5drc6e6e4z","0KyfsTwano","Yh1hFOz8yZ",
+"lj07Q0YAGH","hUTw7cQOnv","Waim67fsYM","ydG8UYh1hF","16lHczY1GY","rhl0J5IhmG","Chuy3IRh48","s7MxkVjCZq","qaofNZUnqt","Cp3mZlm0pD",
+"MojnPGWqqX","GSQwjdhSuH","guMb8FnPFB","QChxsOUqFM","B3qemuTacx","dQ586xciqp","OHaBzZJTXH","LDk6fUvlv4","sqVrf2DREs","fLNg85Namm",
+"qUJMdlCMxy","yofH3QClRL","SbRYy1j5L8","aL6AJ2ZHdk","uPX7GFjHXR","Y1mC0OUqFM","Q6Lix55rfB","hE1QltAOsr","TXQ0ZYw2oU","5IhmGwDajX",
+"dhSuHogLgc","VBjhz14FLR","IjTwPGrDg7","U3yw5nlaBy","9XyT9azIWp","8TxD7KASQ8","5nmWvNcICA","tuDySaFFss","8hJdtWMiS3","J2mQigtCA5",
+"TCgPp7fKYU","zqH0Wv1Hln","uZPqgzbIYY","aDGtSFPfSE","atef2yofH3","QWxoTK4GS8","CqqaD7X3uy","AXpwEgtCA5","cmXIXpiJSk","Waim6580YD",
+"0BmCytvdkD","JKWYRDz1R3","OxWIHjeskS","7ku1pMojnP","0h1b1AXpwE","FxX9qhSSvQ","cQOnvHRxd8","MaJQsB3qem","bgJAzYjB9t","NhXdulsQGo",
+"RzaZADcpWB","KZamHJkzUn","dpe1vXyPZN","CxVEflH1kt","Cp3mZTCgPp","taOXKsqVrf","55rfBHlUbF","iwzGkMK07Y","ZuDtD5Drn0","5iGN5k85Ae",
+"X6Pin5nmWv","FxX9qHzZT8","1v5hHSbRYy","C2Irc4QMc9","aDGtS6q6L9","9iGoTt59lR","rz7UtX6Pin","ru4UGWPmlx","3otm6NOHsz","guMb8dhSuH",
+"iKqhruTacx","BpYhVNxx9V","2DREsgjUTu","uQIczzHF1q","48cHLazIWp","MGlTF24ARF","prNT61LB1L","JXljWQChxs","BbwgA0Kyfs","nlaByUlU3M",
+"faHirQChxs","aFFssFnPFB","9iGoTD6rBy","Nxx9VjfREu","s7MxklCMxy","brhlQYOfrY","AIYUuJRJQB","CdyBVFVMxo","8FmFH0PktI","7Ow5CrKDLJ",
+"QClRLuQIcz","FxX9qRkQke","5drc6zbIYY","RpBQmFwEJz","CxVEftuDyS","tjQxsrhl0J","GrDg7SWfou","tuDySL7cGc","s7MxkqaofN","5drc6tuDyS",
+"8xEKzt59lR","TCgPpQ6Lix","s4786rz7Ut","0Wr5yjtn0X","JJs5moVQp6","iwzGkd7vjM","MmsIoTCgPp","0PktIVerEA","EOE1oStlDJ","zY1GYfmIK1",
+"5iGN5mX2GE","aL6AJ1j5L8","7Ow5C5VZjS","BbwgA3otm6","JRJQB9rlg9","rz7Ut5Mg9r","qUJMdLDk6f","JRJQB8hJdt","In3NSMGlTF","RsQUqlpF6W",
+"9rlg9JRJQB","0MR5XU3yw5","FhtgluQIcz","FVMxoVNCPd","7fKYURkQke","YOfrYdpe1v","FwEJzcL0aE","5Mg9rCfgr3","nlaByO3iyQ","v1HlnIjTwP",
+"jSjS3MGlTF","uLtKstlILt","2TRI7kZANm","i3pyd2Yz7E","iqv4kAmdQd","IjTwPatef2","ZzJHWDLhzM","oQ87r8U2nU","b29RJUvlv4","P6bcglweGy",
+"M6qcGt98iW","lsQGowiHrZ","lm0pDni2v1","FLsphGSQwj","J2mQicL0aE","RxrsmcShY2","NcICAK20wK","SjskQECMvU","BCxeCpAhR1","uAWypSbRYy",
+"W3VFH0ao3l","dpe1vhE1Ql","RxrsmjzUqR","djsrvBFkb8","RACuj0h1b1","CxVEfJkzUn","pWiOsIjTwP","ydG8UpvgjS","LewvMQWxoT","G1RhSpv0i7",
+"JKWYRd7vjM","tlILtQ6Lix","Ul4a1ulk41","zz4ZURxrsm","AkKTk7fsYM","qUJMd0h1b1","RACujMGlTF","pWiOsni2v1","S2DfuU3yw5","Oz8yZBFkb8",
+"X6PinMK07Y","jzUqRFhtgl","lXFOB8FmFH","FhtglzFgtB","y94nwuLtKs","bgJAzoQ87r","v1Hln07n1c","0Wr5yfcwDa","soy9tFcWrW","FFDuiVLTy6",
+"uupzk9iGoT","zz4ZUtlILt","rz7UtQbxXc","J2mQicQOnv","EoToPWaim6","v2eC3QnJ1S","hYBCKAOgEe","QYxC0nFqik","qaofNS2Dfu","5NammjiVBP",
+"M3zXLLewvM","piJSkjzUqR","EoToPBpYhV","M6qcGgdQsS","cQOnvaFFss","FnPFBQClRL","NcICAvOqCE","Cfgr3uoStw","S2DfuGrDg7","5ZaEzOxWIH",
+"i3pydpFrrl","8FmFHEdBKc","cmXIXOUYuF","dpe1vVjCZq","EoToP0BmCy","b29RJuLtKs","M6qcGbgJAz","fcwDaJKWYR","tAOsrTCgPp","JXljWdjsrv",
+"piJSkWmadA","fcJOyiwzGk","BpYhVxciqp","P6bcgh1zcH","aDGtSqaofN","l83UdcQOnv","yEfy98cVD3","iwzGk5Drn0","piJSkGXdoH","Dz1R3t59lR",
+"iqv4kSmGzv","prNT6XyPZN","KASQ8YOfrY","nFqikt98iW","AIYUuguMb8","QClRLv8yFN","BFkb82hEEU","piJSkVNCPd","M6qcGxciqp","jeskStuDyS",
+"9y4lw5ZaEz","WMiS3B3qem","0KyfsYjB9t","yvOMIRzaZA","Rxrsm1LB1L","0PktIsx5Gl","Pb1pad85a9","uJScXRkQke","FhtglNhXdu","cL0aEG1RhS",
+"fcwDa1v5hH","UmaEvCp3mZ","jS1ajzQt6Q","t59lR7hyVv","s93Mlrhl0J","FFDuiaFFss","he9IAB3qem","aFFsspiJSk","i7WMQdQ586","16lHcBCxeC",
+"SbRYyvkCHH","AIYUun1pmO","yluBxFhtgl","uupzk9GXkX","VLTy6I7p2a","OUqFMMGlTF","BFkb8EoToP","YOfrYfLNg8","QWxoT14FLR","d7vjM45cIH",
+"Yf2EcuN6r3","D6rByMkgy8","AOgEeFNYIM","1LB1L8FmFH","16lHcSWfou","uPX7GnFqik","JkzUnAIYUu","Vprf2GXdoH","9y4lwMojnP","y94nwQworu",
+"ZhwG1K4GS8","ZUnqtaL6AJ","zFgtBQ6hMC","Pb1paK4GS8","rz7UtoGu6x","jiVBPoQ87r","EdBKcVLTy6","GrDg748cHL","UmaEvUl4a1","WPmlxQChxs",
+"7X3uyoVQp6","vkCHH7fKYU","jiVBPPb1pa","k85AeMGlTF","2TRI7tjQxs","M3zXLulk41","FnPFBi7WMQ","CxVEf16lHc","4QMc90MR5X","KZamHQChxs",
+"8RCUAe6e4z","WreyPAOgEe","In3NSzY1GY","NcICAy94nw","7X3uyXyPZN","jeskSHP433","BpYhVpT8wu","KASQ8i3pyd","pmeCdVNCPd","1j5L8GSQwj",
+"IBe8kguMb8","VIlwPzmLYD","9y4lwyluBx","YOfrYQWxoT","VIlwPAkKTk","QbxXcOxWIH","CqqaDzHF1q","qUJMdazIWp","XflUq1v5hH","U3yw5LDk6f",
+"YjB9tVerEA","bZLvSAIYUu","hYBCKlkMUA","h1zcHYw2oU","Q6hMCNOHsz","fcwDas4786","2Nslm5VZjS","7ku1pFxX9q","h1zcHWMiS3","jeskSsqVrf",
+"hi5X7WPmlx","ZhwG1NAFuw","8xEKzM3zXL","WMiS3ZUnqt","7ku1pYjB9t","B3qem3weIF","VerEArKDLJ","bgJAzlm0pD","euZA5dhSuH","xciqpv8yFN",
+"a00b5hUTw7","5drc6W7cTs","ThjNnOUqFM","gdQsSNOHsz","ciuWzFxX9q","2DREs29QAz","RmDcrqUJMd","RxrsmEdBKc","tAOsrpmeCd","29QAzYh1hF",
+"OUqFM8xEKz","8cVD3xXTI4","ZUnqtzbIYY","oGu6xhUTw7","M6qcGSs0Zu","uN6r3No0Qb","In3NSG1RhS","IBe8kvLsmS","RBhp0EdBKc","5VZjSAXpwE",
+"gdQsSsoy9t","ThjNnWaWsv","hi5X7IBe8k","djsrviKqhr","RmDcruoStw","24ARF5VZjS","suY4xNo0Qb","sx5GlCp3mZ","yEfy9BbwgA","RmDcraL6AJ",
+"JIqXiReKEW","uPX7GXyPZN","Ss0Zui3pyd","jSjS32TRI7","MmKGJzbIYY","aDGtSzFgtB","DQimp9rlg9","NOHsza00b5","Oz8yZ0Kyfs","0h1b1QClRL",
+"a00b5DQimp","rKDLJdjsrv","CxVEfrhl0J","cQOnvtjQxs","X6PinQClRL","FPfSEdpe1v","X6Pin7hyVv","D6rBy0Kyfs","MezSWoQ87r","YjB9tzbIYY",
+"CNHmvRxrsm","y94nwUmaEv","cmXIXy94nw","tl72W2TRI7","lj07QIKxdL","ReKEWUlU3M","SmGzvMGlTF","zFgtBStlDJ","Nxx9VBCxeC","v2eC39iGoT",
+"xciqp8U2nU","uJScX1LB1L","FxX9qWreyP","JKWYRGrDg7","pFrrl64s8N","Uvlv4MezSW","mX2GEKr8ys","K4GS88hJdt","uAWyp0MR5X","TCgPpuLtKs",
+"Waim6VNCPd","uoStwFLsph","rhl0JcmXIX","yluBx4dEz6","ECMvUBCxeC","4QMc9prNT6","lH1kthi5X7","WaWsvOxWIH","ru4UG2hEEU","tAOsr9iGoT",
+"Pb1paW7cTs","55rfBuLtKs","S77LH8TxD7","7Ow5C9y4lw","7lUXZhi5X7","vkCHHM3zXL","DG4sTPYBf4","uAWypfFDrJ","Cp3mZNOHsz","Dz1R3lpF6W",
+"Q6hMC2Yz7E","HRxd8FjHXR","9rlg9YjB9t","2Yz7EYjB9t","I7p2aYf2Ec","kZANmcQOnv","QnJ1SnlaBy","v8yFNAIYUu","mz8gxzQt6Q","RkQkeKASQ8",
+"KASQ8kB5nP","CqqaDlweGy","MK07YWmadA","1j5L8SjskQ","QYxC048cHL","cQOnvChuy3","yofH3HfyNQ","0BmCy0Kyfs","D6rBybZLvS","aL6AJ2Nslm",
+"VNCPdDG4sT","2DREsuQIcz","aez9yHzZT8","BFkb8WDVWJ","ydG8UgIYvE","TXQ0Z6q6L9","SbRYy0PktI","Ss0ZuFwEJz","kB5nPdjsrv","nlaBym4bxU",
+"CxVEfQChxs","45cIHuoStw","QYxC0jeskS","zz4ZUjS1aj","bgJAzlweGy","gdQsSMmKGJ","14FLRjzUqR","580YDzqH0W","2DREsaDGtS","tl72WB3qem",
+"HzZT8EdBKc","ulk41OUYuF","AXpwEuupzk","X6PinYh1hF","QbxXcIn3NS","pWiOsv1Hln","CxVEfyToGW","lj07QWMiS3","BpYhVJKWYR","ZUnqtNAFuw",
+"RzaZAGrDg7","8FmFHpvgjS","AkKTke6e4z","lsQGouupzk","s93Ml9GXkX","HzZT8F6PT2","Cfgr38TxD7","uLtKswiHrZ","FjHXRaez9y","NhXduHP433",
+"vOqCECqqaD","faHiruTacx","zbIYYQnJ1S","MezSWfcwDa","9eoRctjQxs","yvOMIK4GS8","MGlTFpT8wu","gIYvEzbIYY","I7p2aS77LH","5iGN5pFrrl",
+"TCgPpgf8rI","0ao3lPYBf4","Vprf21j5L8","BbwgAQssNC","OxWIHQWxoT","jtn0Xsx5Gl","StlDJhE1Ql","iB08lpvgjS","t59lRhYBCK","7fKYUSmGzv",
+"HRxd8dQ586","zQt6QbrhlQ","ZhwG1MGlTF","MmsIouPX7G","zY1GYVIlwP","AOgEeVLTy6","v1HlnprNT6","Vprf2AXpwE","iB08lAgJHQ","t98iWStlDJ",
+"QnJ1S8TxD7","GXdoHpFrrl","euZA5lCMxy","qaofNxReec","ydG8Ue6e4z","SjskQDQimp","6q6L9uPX7G","YOfrYWMiS3","IjTwPcQOnv","AmdQdaL6AJ",
+"CxVEf5nmWv","mX2GE0Wr5y","0Wr5ydmoS7","ThjNn7Ow5C","2hEEUGv3Fq","VerEA16lHc","kB5nPBCxeC","CxVEfVIlwP","8FmFHhi5X7","M6qcGpFrrl",
+"Cp3mZCK5W7","ogLgcFhtgl","Ta8f6gdQsS","uLtKsUvlv4","ydG8UIRh48","ulk41OHaBz","W7cTslsQGo","TXQ0ZpmeCd","MojnPNcICA","9eoRclViBv",
+"t98iW8xEKz","MojnPMezSW","QClRLMezSW","fcwDalweGy","48cHLCp3mZ","618Di07n1c","6q6L9hSSvQ","Oz8yZAmdQd","W3VFH4dEz6","YOfrYNcICA",
+"48cHLYw2oU","oVQp6Gv3Fq","Q6LixAmdQd","BFkb848cHL","NAFuwbrhlQ","l83UdzQt6Q","k85Aed85a9","jtn0XK4GS8","ulk41MmKGJ","J2mQiIKxdL",
+"v8yFNReKEW","MK07Y2DREs","5Nammhe9IA","GSQwjaDGtS","1v5hH16lHc","oGu6xMm8si","lCMxy0Wr5y","rz7UtS77LH","14FLRVIlwP","IKxdLTXQ0Z",
+"dpe1vWMiS3","lXFOBoVQp6","cL0aE0BmCy","VBjhzVerEA","nnP8ozQt6Q","CxVEfnFqik","Yw2oUcmXIX","zFgtBaL6AJ","WaWsvzmLYD","ogLgcBpYhV",
+"wDajXRBhp0","wiHrZ7fsYM","KsjRKqUJMd","WreyPUmaEv","brhlQOUYuF","EoToPF6PT2","6AFT0yEfy9","cL0aEuZPqg","TXQ0Z2ZHdk","55rfBjfREu",
+"IBe8k9GXkX","J2mQiUmaEv","HRxd8XflUq","IKxdLlsQGo","I7p2a48cHL","atef2lXFOB","uoStwgtCA5","a00b5uAWyp","0BmCys7Mxk","uTacxLDk6f",
+"UlU3MTa8f6","GXdoHRmDcr","2hEEU2DREs","ix74r2DREs","zz4ZU7hyVv","jtn0X618Di","dhSuHLDk6f","oQ87rFjHXR","lj07QkB5nP","S77LHyEfy9",
+"azIWp45cIH","iwzGkatef2","x3LDeqQxHP","VerEA3otm6","kZANm0MR5X","suY4xZUnqt","Q6LixfaHir","M6qcGyluBx","hUTw7pFrrl","v8yFNFnPFB",
+"ZUnqt5ZaEz","TXQ0ZC2Irc","BGaQYs4786","mX2GELDk6f","t98iW1LB1L","Qworuy94nw","ReKEWY1mC0","jSjS3NOHsz","aFFsstl72W","TwanoHlUbF",
+"Y1mC0S2Dfu","qUJMdl83Ud","X6PinksJby","uvf7AQbxXc","6AFT0JXljW","pAhR10BmCy","29QAzFGzgp","yvOMISbRYy","RACuj7fKYU","mz8gxrhl0J",
+"CIShGlkMUA","FhtglvOqCE","0h1b1C2Irc","618Dia00b5","CqqaD0h1b1","rz7UtyEfy9","nlaByNAFuw","PYBf4blLA9","xReecmX2GE","VLTy6i7WMQ",
+"nnP8ov1Hln","XflUqjeskS","ZuDtD2Yz7E","Q6LixJkzUn","MGlTF0Wr5y","45cIH24ARF","prNT6AXpwE","yluBxdhSuH","suY4xjeskS","ThjNngdQsS",
+"45cIHVBjhz","Ul4a1IBe8k","oQ87rM3zXL","Mm8sipWiOs","lH1ktjSjS3","FwEJzpAhR1","0ao3lCp3mZ","FnPFBQworu","uZPqgZ4I1v","2Yz7EFVMxo",
+"faHirhUTw7","Oz8yZQClRL","SjskQzmLYD","kB5nPSmGzv","uQIczxReec","U3yw5CdyBV","zmLYD24ARF","ix74rEdBKc","IjTwPC2Irc","i7WMQVerEA",
+"kZANmJXljW","azIWp1LB1L","FjHXRulk41","8hJdto8Uyd","QnJ1SMGlTF","ZhwG1pvgjS","Cfgr3d7vjM","fLNg8OxWIH","n8pJ9XflUq","EdBKcCIShG",
+"CNHmv5drc6","VBjhz8U2nU","2DREs8cVD3","VIlwPBCxeC","lm0pDvkCHH","jtn0Xaez9y","M3zXL0Wr5y","IRh48m4bxU","suY4xBGaQY","3otm6lpF6W",
+"LbRTHiqv4k","0KyfsfcwDa","n8pJ9OUqFM","CqqaDO3iyQ","jS1aj0Wr5y","Yw2oUYh1hF","gjUTulj07Q","580YDIKxdL","FPfSEQ6hMC","djsrv618Di",
+"iKqhraDGtS","lj07QO3iyQ","In3NSlkMUA","CdyBVx3LDe","lpF6WfLNg8","4QMc9kZANm","KZamHSs0Zu","MGlTFtjQxs","K20wKzHF1q","ZzJHW16lHc",
+"M3zXL0ao3l","G1RhSn1pmO","tl72WhSSvQ","lH1kt5iGN5","jtn0XUvlv4","K20wKOz8yZ","l83UdSbRYy","24ARFIn3NS","zz4ZUydG8U","jzUqRDz1R3",
+"hYBCK5VZjS","LbRTHqUJMd","6q6L9QnJ1S","dmoS7jzUqR","7Ow5C5Mg9r","Mm8siwiHrZ","pAhR1Waim6","M6qcGsoy9t","Yf2EcTCgPp","wiHrZlkMUA",
+"FhtgluN6r3","s7MxkTa8f6","8hJdtRzaZA","ZhwG1FjHXR","oGu6x0h1b1","piJSkVIlwP","RBhp0m4bxU","dpe1v0YAGH","07n1cUmaEv","pAhR1Q6Lix",
+"jtn0Xv8yFN","x3LDeVprf2","TCgPps4786","W3VFHtAOsr","S77LHF6PT2","0PktIJXljW","qUJMdRmDcr","uvf7AlsQGo","618DiKZamH","Y1mC0ogLgc",
+"fLNg8guMb8","48cHLbZLvS","azIWpVNCPd","aL6AJix74r","uTacxb29RJ","0PktIRpBQm","YOfrYdmoS7","rhl0JuLtKs","v2eC3gf8rI","e6e4zWMiS3",
+"WDVWJOUqFM","VNCPd48cHL","W7cTsdjsrv","iKqhrXyPZN","hE1Qlhi5X7","WmadAEoToP","Ss0ZuSjskQ","IRh48rKDLJ","d7vjMQssNC","B3qemWPmlx",
+"uZPqgrz7Ut","JJs5mGXdoH","piJSkuvf7A","zbIYYcL0aE","NOHszEoToP","7fsYMydG8U","DLhzMi7WMQ","BpYhVgtCA5","7X3uyulk41","OxWIHo8Uyd",
+"GSQwjGXdoH","QChxstvdkD","MmsIoChuy3","J2mQie6e4z","7ku1pUmaEv","BFkb8PYBf4","zmLYDd7vjM","XflUqDcpWB","yvOMIdjsrv","Q6LixZv7z0",
+"Nxx9VzQt6Q","OxWIH5ZaEz","nFqik5VZjS","Uvlv4FFDui","oQ87rkZANm","gdQsSuvf7A","d85a9kZANm","pFrrlC2Irc","5nmWv5Mg9r","RpBQmrhl0J",
+"t59lRAmdQd","D6rBySjskQ","AmdQdcShY2","CK5W7618Di","uQIczG1RhS","Z4I1vuZPqg","5iGN5FNYIM","JKWYRh1zcH","AOgEeSmGzv","fLNg8X6Pin",
+"I7p2auTacx","HfyNQCqqaD","WDVWJ8hJdt","lXFOBTXQ0Z","5drc6KZamH","29QAzv2eC3","BbwgAXflUq","Waim68TxD7","U3yw5piJSk","48cHLdhSuH",
+"pmeCdZ4I1v","uJScXSmGzv","2TRI7Gv3Fq","WaWsvaDGtS","o8UydNxx9V","lViBvpT8wu","ECMvUFhtgl","MmsIodQ586","ksJbyiKqhr","24ARFk85Ae",
+"zz4ZUU3yw5","b29RJHzZT8","G1RhSoVQp6","EoToPVBjhz","Gv3FqFGzgp","FjHXRQClRL","ydG8Uulk41","0KyfsU3yw5","nnP8oWDVWJ","OUqFMNo0Qb",
+"CK5W7580YD","pvgjS07n1c","piJSkoGu6x","fFDrJWaim6","aez9yxReec","XyPZN16lHc","0YAGHHzZT8","lCMxyk85Ae","JkzUnGSQwj","VerEALewvM",
+"lViBvTa8f6","lweGyAmdQd","t59lRuvf7A","UmaEvEdBKc","S77LH1LB1L","5ZaEzvLsmS","POUYS5Drn0","7Ow5Crhl0J","Oz8yZaez9y","0YAGHVIlwP",
+"ciuWzblLA9","gdQsS9y4lw","M6qcGhE1Ql","QYxC0JkzUn","EdBKcuLtKs","F6PT2s93Ml","d7vjMlCMxy","FxX9qAOgEe","xciqppT8wu","16lHcJ2mQi",
+"4W0TlPb1pa","16lHc6q6L9","Nxx9V8U2nU","Yf2Ec2Yz7E","aL6AJMm8si","QnJ1SlCMxy","GXdoHReKEW","pFrrl5nmWv","3otm6ix74r","9XyT9uLtKs",
+"jtn0XAgJHQ","Pb1pa7X3uy","prNT6jzUqR","GWqqXTCgPp","HlUbFWmadA","sx5GlgdQsS","48cHLKr8ys","soy9tZv7z0","IKxdLuLtKs","FGzgpAgJHQ",
+"JIqXiNxx9V","Ul4a1MaJQs","faHirbrhlQ","SjskQTCgPp","ZuDtD8FmFH","ulk41FjHXR","XyPZNFnPFB","ydG8Ux3LDe","OxWIHhYBCK","LbRTHi7WMQ",
+"ru4UGo8Uyd","vOqCEyofH3","uLtKsFcWrW","tlILtVLTy6","7lUXZy94nw","W7cTs2Yz7E","d7vjM6AFT0","IKxdLyToGW","5IhmGguMb8","5Drn0WaWsv",
+"JIqXiW3VFH","i7WMQS77LH","hi5X7JJs5m","VLTy6QWxoT","hYBCKvkCHH","uPX7GmX2GE","zqH0WFGzgp","1LB1LQssNC","QClRLFcWrW","aL6AJ8cVD3",
+"AOgEem4bxU","Oz8yZcmXIX","9GXkX9GXkX","Ul4a1FGzgp","7Ow5CFwEJz","Cfgr32Nslm","NcICA0Wr5y","vkCHHK20wK","dQ586OHaBz","9y4lwmX2GE",
+"gIYvEWaim6","vOqCEzqH0W","iB08lyluBx","2NslmRzaZA","xciqp6q6L9","ZzJHWIRh48","StlDJQbxXc","zFgtBFwEJz","tvdkDEOE1o","yofH3dpe1v",
+"7fsYMksJby","5Nammrhl0J","fqypyJXljW","kB5nPvOqCE","lViBvogLgc","hUTw707n1c","SbRYyKsjRK","VNCPdChuy3","k85Aehi5X7","jSjS3h1zcH",
+"zY1GYx3LDe","9iGoT2DREs","TwanoB3qem","SbRYyd7vjM","qQxHPCxVEf","5Namm2DREs","RACujzY1GY","x3LDe2ZHdk","o8Uydv1Hln","lpF6WPOUYS",
+"vOqCEqUJMd","Yh1hFQssNC","cL0aEQbxXc","BbwgAuAWyp","D6rBylH1kt","rKDLJlXFOB","S2DfulCMxy","CK5W7TCgPp","EoToPSmGzv","8xEKziwzGk",
+"9eoRcCNHmv","POUYSlXFOB","ru4UGuTacx","AOgEefLNg8","WPmlxyluBx","5ZaEzZ4I1v","ThjNn1LB1L","fFDrJRzaZA","h1zcHJKWYR","i3pydZ4I1v",
+"brhlQ6q6L9","taOXK7fKYU","tlILt2Yz7E","lsQGo3weIF","JXljW24ARF","zY1GYKr8ys","ksJbyvLsmS","FVMxo0BmCy","uoStw0h1b1","jiVBPt98iW",
+"J2mQiFwEJz","hi5X7K20wK","prNT68RCUA","l83UdyofH3","aL6AJM3zXL","FnPFBBbwgA","QnJ1SFnPFB","FLsphsqVrf","lkMUAtaOXK","S2DfucL0aE",
+"jS1ajn1pmO","ydG8UHRxd8","7hyVvpFrrl","DcpWB3weIF","ksJbyAOgEe","HP433580YD","ciuWzMaJQs","EOE1o9eoRc","0ao3lMmsIo","yofH3v1Hln",
+"64s8NiKqhr","iqv4kpAhR1","WmadA0MR5X","5ZaEzaL6AJ","TXQ0ZAmdQd","hE1QlFhtgl","zz4ZUHRxd8","cmXIXlkMUA","IBe8kJkzUn","BGaQYFnPFB",
+"QbxXc9rlg9","jeskSCdyBV","CxVEfhSSvQ","nnP8oaFFss","lpF6WjS1aj","5ZaEz8TxD7","mX2GEvkCHH","fLNg864s8N","uJScXd85a9","7fKYUNAFuw",
+"F6PT21v5hH","l83UdW7cTs","oVQp6CIShG","WMiS3qUJMd","RzaZAvOqCE","zz4ZUD6rBy","Yh1hFlkMUA","djsrvrhl0J","D6rBy5Namm","cShY2IKxdL",
+"cL0aE8xEKz","4W0TlnFqik","FPfSEI7p2a","d85a9UlU3M","EdBKcIjTwP","Oz8yZGSQwj","QChxsFPfSE","5Drn0QWxoT","QssNC16lHc","WmadAFLsph",
+"ThjNnW3VFH","EoToPoGu6x","OUqFMFwEJz","lj07QjS1aj","vLsmSJJs5m","lH1ktuZPqg","x3LDe1v5hH","1LB1LpAhR1","wDajX07n1c","1j5L80MR5X",
+"F6PT2D6rBy","0BmCyGXdoH","64s8NQClRL","1LB1LCxVEf","W3VFH2ZHdk","KZamHIRh48","K4GS8lViBv","2hEEUNOHsz","CIShGThjNn","Q6LixvLsmS",
+"1LB1LFPfSE","QYxC0AIYUu","5ZaEzWPmlx","prNT6Ta8f6","Yf2EcnlaBy","BFkb8Nxx9V","2NslmydG8U","IKxdLn1pmO","yToGWOxWIH","jfREuKr8ys",
+"0YAGHgIYvE","9GXkXmz8gx","ECMvUwDajX","pFrrlAIYUu","HP433d7vjM","W3VFHRBhp0","VNCPdvkCHH","xXTI45drc6","RpBQmFLsph","CNHmvK4GS8",
+"Y1mC0soy9t","tuDySNcICA","Yw2oUtjQxs","x3LDes7Mxk","zY1GYJIqXi","lweGy8U2nU","5nmWvqaofN","5drc6hYBCK","ulk41MaJQs","ksJby8FmFH",
+"HzZT8xXTI4","Waim60ao3l","8FmFH9XyT9","X6PinfcwDa","U3yw5pWiOs","0MR5Xpv0i7","kB5nPuAWyp","4W0TlRzaZA","UmaEvQChxs","ogLgcJ2mQi",
+"nFqik2TRI7","EdBKcl83Ud","iwzGkIBe8k","14FLRRBhp0","Vprf2tAOsr","jfREuGv3Fq","6AFT0rz7Ut","O3iyQCdyBV","d85a9d7vjM","dpe1vaL6AJ",
+"sx5GljeskS","2hEEUUl4a1","gtCA5azIWp","X6PinZUnqt","QClRLRsQUq","ReKEW5IhmG","IBe8kRkQke","sx5GlZv7z0","WPmlxwiHrZ","vLsmStuDyS",
+"aL6AJNo0Qb","hYBCKLDk6f","uJScXmz8gx","uvf7AoQ87r","K20wKS2Dfu","cShY2NhXdu","SmGzvW3VFH","07n1c4dEz6","8U2nUC2Irc","MmKGJWDVWJ",
+"Cp3mZuoStw","zqH0WRxrsm","ru4UG9eoRc","7fKYUatef2","fLNg8jtn0X","JRJQB5iGN5","dhSuHiqv4k","s47868xEKz","7hyVv7ku1p","O3iyQ5nmWv",
+"uLtKslweGy","hYBCKjSjS3","rz7UtK20wK","ECMvULDk6f","gtCA5brhlQ","a00b54W0Tl","0PktIVIlwP","HzZT82ZHdk","3otm6UlU3M","2Nslm7fKYU",
+"blLA9Pb1pa","ZhwG1tAOsr","pFrrlM3zXL","5Nammdjsrv","9GXkXSs0Zu","vkCHHGv3Fq","8RCUAVLTy6","lsQGoo8Uyd","NcICAtjQxs","IKxdLGSQwj",
+"O3iyQWaim6","jiVBPdpe1v","MaJQs07n1c","QWxoTni2v1","WmadApT8wu","he9IACqqaD","HRxd88U2nU","m4bxUs7Mxk","jeskSDLhzM","0YAGH0YAGH",
+"GXdoHTa8f6","FnPFB1j5L8","YjB9t64s8N","YjB9tLDk6f","h1zcHfqypy","JRJQBHzZT8","BFkb8gtCA5","KZamHBGaQY","vLsmSFGzgp","UmaEvPb1pa",
+"iKqhrF6PT2","0ao3lMezSW","s47865drc6","618DiHRxd8","X6PinMojnP","IKxdLQ6Lix","U3yw5yluBx","Mm8si29QAz","5VZjS618Di","Zv7z0K20wK",
+"Dz1R37X3uy","ZJTXHDQimp","JkzUnqaofN","jtn0X2hEEU","LDk6flm0pD","h1zcHuQIcz","RmDcrjfREu","iB08luN6r3","l83UdqUJMd","ReKEWguMb8",
+"Waim6hi5X7","3otm6tvdkD","wDajX4dEz6","JkzUnBGaQY","MaJQsUl4a1","pvgjSzmLYD","Dz1R3zqH0W","GXdoH64s8N","VNCPdBpYhV","MK07Ymz8gx",
+"55rfBJRJQB","ogLgc0MR5X","zQt6QvOqCE","t59lR8cVD3","gtCA5LDk6f","xciqpRACuj","zmLYD0Wr5y","yEfy9uvf7A","NAFuwprNT6","aFFssGv3Fq",
+"JKWYRnFqik","PYBf4HP433","ksJbygdQsS","P6bcgNxx9V","hSSvQzHF1q","gdQsSv2eC3","KASQ88U2nU","MK07YQChxs","4W0TlS2Dfu","ThjNnrKDLJ",
+"7Ow5CQClRL","okgRibrhlQ","MezSWzHF1q","5VZjS5iGN5","L7cGcuQIcz","24ARFM6qcG","okgRi2DREs","6AFT0MmKGJ","CxVEffcJOy","zY1GYzQt6Q",
+"Oz8yZO3iyQ","aL6AJMK07Y","yEfy9lCMxy","WaWsvZUnqt","MaJQs9eoRc","JJs5m7Ow5C","NhXduZhwG1","BpYhVFnPFB","RACujZJTXH","rz7Ut0Kyfs",
+"ZzJHWsqVrf","uZPqg0Wr5y","RpBQm0BmCy","KsjRKRxrsm","tjQxs4dEz6","FPfSERpBQm","QChxsy94nw","Qworu07n1c","Qworuuupzk","F6PT2wDajX",
+"LbRTHGWqqX","JXljWCIShG","uTacx5ZaEz","WPmlxECMvU","prNT6uJScX","RsQUqhSSvQ","2TRI7lkMUA","yvOMI618Di","pWiOsQYxC0","XyPZN64s8N",
+"M3zXLQnJ1S","jtn0XP6bcg","5IhmG2Nslm","vkCHH0YAGH","45cIHWmadA","cQOnvQWxoT","mX2GECIShG","iB08l7lUXZ","t59lRKASQ8","48cHLfmIK1",
+"m4bxUsuY4x","blLA9BFkb8","ZJTXHdjsrv","uQIczRACuj","5VZjSpiJSk","oVQp6oQ87r","RpBQmn1pmO","kB5nP8RCUA","kB5nPpFrrl","uupzkru4UG",
+"kZANmprNT6","NOHszEdBKc","tuDyS2ZHdk","vOqCEblLA9","h1zcHNo0Qb","7lUXZK20wK","ni2v1dhSuH","G1RhS5Namm","8hJdtuZPqg","qQxHPqaofN",
+"Mkgy8O3iyQ","i3pydStlDJ","RBhp0ogLgc","5nmWvS2Dfu","cQOnvFLsph","a00b5QWxoT","uTacxuAWyp","Dz1R3x3LDe","0BmCyjeskS","Oz8yZOHaBz",
+"cL0aEQssNC","sx5Glb29RJ","ru4UGuLtKs","5NammJKWYR","zQt6Qa00b5","yofH3uPX7G","uvf7AAgJHQ","U3yw5SWfou","Ss0ZuMezSW","gjUTuTa8f6",
+"Gv3FqjzUqR","M3zXLOUqFM","TXQ0ZYh1hF","IRh48Pb1pa","HzZT8MGlTF","4dEz648cHL","IBe8kBGaQY","AgJHQMkgy8","djsrvuZPqg","VNCPdStlDJ",
+"CdyBVS2Dfu","UlU3MOUqFM","s7MxkWmadA","ZzJHWgtCA5","jSjS3pFrrl","gf8rIhE1Ql","Ss0ZukB5nP","v2eC3qQxHP","jSjS3uN6r3","hUTw7h1zcH",
+"FNYIMW7cTs","0h1b19eoRc","pv0i78hJdt","uZPqgnFqik","OxWIHdQ586","hi5X7v1Hln","NhXduIn3NS","WmadAIRh48","hSSvQ7Ow5C","Ul4a1FVMxo",
+"J2mQis7Mxk","m4bxUQbxXc","JKWYRv8yFN","580YDK4GS8","OxWIHChuy3","Pb1pauZPqg","yvOMIBpYhV","RmDcr2ZHdk","HzZT8v8yFN","LbRTHkB5nP",
+"euZA5Z4I1v","Ss0ZuyToGW","FGzgpzQt6Q","WDVWJ24ARF","CqqaDbZLvS","aL6AJoVQp6","ciuWzHP433","kZANmVerEA","vLsmSzHF1q","v1HlnrKDLJ",
+"zHF1qrKDLJ","IjTwP5IhmG","ogLgcEoToP","Y1mC0F6PT2","0BmCyhE1Ql","SmGzvMmKGJ","5Drn0U3yw5","v2eC30ao3l","uTacxAIYUu","JkzUn0MR5X",
+"KZamHqQxHP","OUYuFdmoS7","6AFT0ni2v1","ciuWzuupzk","ni2v1lkMUA","jeskSqaofN","uupzkYh1hF","8xEKz29QAz","yEfy9uPX7G","yEfy9QClRL",
+"RsQUq14FLR","1j5L8s93Ml","ZzJHWJXljW","14FLRL7cGc","oGu6xGSQwj","AmdQdFwEJz","4QMc9vLsmS","XflUq2TRI7","RxrsmbrhlQ","D6rByMaJQs",
+"rz7Ut5iGN5","FPfSEkZANm","ru4UGpv0i7","Ss0ZuEOE1o","lweGyhi5X7","zbIYYNcICA","aDGtSo8Uyd","DG4sTCdyBV","0KyfsvLsmS","Yf2EcYOfrY",
+"PYBf4YOfrY","v8yFN14FLR","mX2GEatef2","oGu6xjfREu","s93Mlxciqp","MojnPVIlwP","blLA9CNHmv","FPfSEIn3NS","hYBCKlXFOB","tl72WOUqFM",
+"NcICAWaWsv","5drc6RACuj","5iGN5Gv3Fq","s7MxkzqH0W","BCxeCWPmlx","8cVD348cHL","8hJdtpvgjS","IRh48KASQ8","9rlg9FcWrW","prNT64dEz6",
+"QClRLWMiS3","7fKYUS77LH","l83UdMGlTF","0ao3ljtn0X","DLhzMfaHir","tvdkDJXljW","zmLYDuvf7A","W3VFHlXFOB","dhSuHRACuj","64s8NoGu6x",
+"Yf2EcUlU3M","RsQUqpWiOs","dhSuHuJScX","14FLRAgJHQ","bgJAzzbIYY","yToGWiKqhr","16lHcdhSuH","IBe8kdpe1v","mz8gxVerEA","d7vjMM6qcG",
+"xReec6q6L9","oGu6xCfgr3","CIShGs93Ml","AOgEeCNHmv","AOgEeSjskQ","jzUqR7Ow5C","6q6L9WaWsv","uupzk0ao3l","Waim67lUXZ","S2DfuDz1R3",
+"e6e4zQworu","JXljWMm8si","EdBKc24ARF","ix74rSmGzv","guMb8fcJOy","U3yw59iGoT","9rlg9Y1mC0","6AFT0h1zcH","jzUqRCIShG","FNYIM8cVD3",
+"8hJdttAOsr","jS1aj7X3uy","jiVBPWmadA","gjUTus4786","D6rByhYBCK","dpe1vs93Ml","Twano7fsYM","o8UydFFDui","EoToPzz4ZU","XflUqfaHir",
+"7fKYUD6rBy","ix74ruvf7A","n1pmONAFuw","t98iWP6bcg","K20wKHlUbF","D6rBysx5Gl","FPfSElCMxy","QssNC8FmFH","uJScX0Wr5y","uJScXNOHsz",
+"lpF6W14FLR","he9IAYOfrY","lViBvJ2mQi","jSjS3VerEA","n1pmO0BmCy","ogLgcReKEW","uQIczFhtgl","8hJdtZuDtD","C2IrcQClRL","6q6L9uJScX",
+"HP4332Nslm","pT8wuZJTXH","9XyT90YAGH","hSSvQwDajX","3weIFmX2GE","ulk41prNT6","uoStwI7p2a","Ul4a18U2nU","7ku1pzQt6Q","n1pmODQimp",
+"In3NSDQimp","CxVEfJKWYR","zqH0W7ku1p","0KyfsB3qem","pvgjSQnJ1S","MaJQsd85a9","5NammCxVEf","G1RhS3weIF","CxVEfKZamH","JJs5mJkzUn",
+"zHF1qazIWp","SmGzvRpBQm","xciqpn8pJ9","QbxXc0h1b1","lkMUA3weIF","EdBKcFwEJz","bgJAzuPX7G","m4bxUh1zcH","MezSWQnJ1S","Ss0Zu8cVD3",
+"6q6L9tvdkD","h1zcHmz8gx","x3LDecL0aE","hE1QlMaJQs","kZANmXflUq","cShY2ThjNn","C2IrctlILt","Cp3mZMGlTF","qaofNFjHXR","nnP8o3weIF",
+"y94nw24ARF","Waim6Ta8f6","CK5W7pmeCd","9iGoTiqv4k","yEfy9b29RJ","tjQxsNo0Qb","vOqCEjeskS","No0QbogLgc","D6rByzFgtB","FxX9qgIYvE",
+"24ARFfFDrJ","hYBCKYw2oU","ThjNn7lUXZ","DLhzMQbxXc","MmKGJIRh48","brhlQQbxXc","SWfouEOE1o","OHaBz5VZjS","nnP8oNxx9V","piJSkSjskQ",
+"Ul4a14dEz6","prNT6fcwDa","pAhR1suY4x","NcICAYw2oU","FGzgpQChxs","zmLYDzz4ZU","BCxeCWmadA","0MR5Xdpe1v","i7WMQI7p2a","OxWIHoGu6x",
+"Fhtgl9rlg9","2ZHdkFcWrW","CIShGlm0pD","ECMvUQ6hMC","NOHszblLA9","bgJAzIBe8k","GrDg7hUTw7","07n1c2Yz7E","qQxHPIn3NS","xXTI4PYBf4",
+"NAFuwjtn0X","dpe1vOHaBz","FnPFBOHaBz","wDajXpv0i7","gtCA5F6PT2","hE1Qljtn0X","x3LDeKr8ys","7Ow5CtvdkD","tjQxsWaim6","In3NSQbxXc",
+"yofH3tl72W","1v5hHyToGW","lXFOB64s8N","RACujIjTwP","ThjNnUmaEv","0BmCya00b5","5Mg9rtAOsr","Yh1hF2Nslm","uvf7An8pJ9","2TRI7WDVWJ",
+"RmDcriqv4k","QChxsRxrsm","IKxdLOxWIH","In3NS6AFT0","k85Ae9rlg9","LbRTHoGu6x","Nxx9VYh1hF","JXljWru4UG","BCxeCdQ586","Z4I1vPOUYS",
+"CqqaDuN6r3","Zv7z09y4lw","ksJbyuupzk","9y4lwnnP8o","d7vjMZuDtD","Dz1R3OHaBz","mz8gxSbRYy","2NslmECMvU","OHaBz64s8N","55rfB5Namm",
+"7Ow5CLDk6f","CdyBV618Di","Zv7z04dEz6","MGlTFuoStw","G1RhSprNT6","1j5L8IKxdL","16lHcAXpwE","NcICAO3iyQ","LDk6fi3pyd","fcwDaL7cGc",
+"qaofNW7cTs","lsQGobZLvS","SbRYyEoToP","0Wr5ys4786","tuDyS7fKYU","24ARFZuDtD","FNYIM618Di","AXpwEsqVrf","ReKEWciuWz","VIlwPs4786",
+"SmGzvjSjS3","a00b5BFkb8","CqqaDIKxdL","FnPFBDz1R3","hi5X729QAz","8cVD3cL0aE","RACujpWiOs","ciuWz0MR5X","vkCHHSjskQ","Kr8ysRACuj",
+"5nmWvk85Ae","16lHcZhwG1","7X3uyGXdoH","ogLgcLDk6f","nFqikiB08l","8RCUAsx5Gl","ZzJHWQnJ1S","Mkgy85Namm","QworutAOsr","I7p2aZzJHW",
+"s47868U2nU","iwzGkaDGtS","tjQxsdhSuH","blLA948cHL","QssNCHfyNQ","1v5hHogLgc","8RCUADG4sT","ThjNnK20wK","8RCUA4dEz6","VNCPdTwano",
+"VNCPd9iGoT","hE1Ql5ZaEz","IjTwPXyPZN","Cfgr3soy9t","RBhp0W3VFH","cL0aEMkgy8","9iGoTFGzgp","MmKGJNo0Qb","a00b5L7cGc","s4786Ul4a1",
+"jzUqRMK07Y","lCMxyMaJQs","oQ87ruZPqg","Waim6qaofN","IKxdL2TRI7","fqypyzHF1q","ksJbyy94nw","KZamHFwEJz","zHF1qMK07Y","AXpwEfcwDa",
+"lsQGos4786","ZUnqtbrhlQ","D6rByKZamH","QClRLStlDJ","taOXKQbxXc","9iGoTFnPFB","jiVBPpT8wu","NcICAyvOMI","cL0aEAgJHQ","DLhzMdmoS7",
+"uTacxAgJHQ","Kr8ys8U2nU","vOqCEPb1pa","soy9t7hyVv","cL0aEbrhlQ","t98iWk85Ae","blLA9KsjRK","7lUXZWDVWJ","QssNCtAOsr","RmDcrnnP8o",
+"s93MlOUqFM","9XyT9X6Pin","ZhwG1EOE1o","uN6r3v8yFN","prNT62hEEU","pvgjSSs0Zu","Y1mC0rhl0J","hYBCKlViBv","jtn0XZv7z0","LDk6fAkKTk",
+"Waim6v1Hln","h1zcHOUYuF","POUYSsqVrf","jiVBPQ6hMC","pmeCdFjHXR","soy9tvOqCE","FxX9q9rlg9","8hJdt9iGoT","rhl0JQChxs","EdBKc5Drn0",
+"Waim6zHF1q","cQOnvJXljW","FPfSEqaofN","OUqFMQClRL","RxrsmzY1GY","XyPZNS2Dfu","Yw2oUni2v1","Gv3FqLbRTH","SWfouDcpWB","jS1ajkZANm",
+"EOE1otlILt","Ul4a1i3pyd","pT8wu55rfB","DcpWB0YAGH","iKqhrfcwDa","fmIK1HRxd8","QnJ1SMmsIo","Nxx9VokgRi","zY1GYJkzUn","zz4ZUUvlv4",
+"XflUq2Yz7E","FjHXRM3zXL","FhtglzqH0W","t98iWjeskS","jfREuciuWz","ru4UGQnJ1S","F6PT2WMiS3","zHF1qkB5nP","HzZT8iKqhr","faHirm4bxU",
+"uoStwyvOMI","RxrsmfcJOy","lkMUAuoStw","No0QbjeskS","x3LDevLsmS","mz8gxhe9IA","VjCZquZPqg","AmdQdK20wK","pWiOscShY2","hSSvQIRh48",
+"29QAzIBe8k","LbRTHL7cGc","K4GS8AIYUu","ZhwG10ao3l","Pb1paFVMxo","Zv7z02hEEU","x3LDe4QMc9","In3NSo8Uyd","POUYSWPmlx","kZANmvkCHH",
+"rhl0J5iGN5","s4786v1Hln","KsjRKOz8yZ","Yf2Ec5nmWv","yvOMIfFDrJ","MGlTFwDajX","AOgEey94nw","0h1b12ZHdk","7lUXZbZLvS","TwanofcwDa",
+"Z4I1vECMvU","QbxXcNAFuw","Dz1R3ECMvU","48cHL2hEEU","GrDg7Yf2Ec","fcJOyrhl0J","8U2nUd7vjM","WmadAThjNn","Waim6CK5W7","xXTI4k85Ae",
+"o8Uyd0PktI","lkMUAuN6r3","5Drn08hJdt","K20wKU3yw5","taOXK0MR5X","RACujpmeCd","TwanopWiOs","aez9yHP433","OUYuFokgRi","Cp3mZU3yw5",
+"RsQUq9rlg9","2NslmuPX7G","qQxHPlj07Q","ogLgcKASQ8","yluBxtjQxs","wiHrZMGlTF","AOgEeM3zXL","cShY2C2Irc","Ul4a1Uvlv4","CdyBV3otm6",
+"CxVEfXflUq","9XyT945cIH","QnJ1SNOHsz","JRJQBt59lR","dpe1v2hEEU","a00b5DG4sT","1LB1LWreyP","OxWIHi3pyd","WreyPOxWIH","cQOnv55rfB",
+"jeskSlweGy","piJSkIn3NS","okgRiEOE1o","n8pJ9I7p2a","h1zcHuupzk","lj07QVLTy6","vOqCEjSjS3","s7MxkazIWp","vkCHHUmaEv","GXdoHHP433",
+"ZuDtDbrhlQ","tuDySPOUYS","Z4I1v07n1c","3otm6SjskQ","djsrvUl4a1","7Ow5CVIlwP","VNCPdokgRi","7ku1p8RCUA","2DREsQbxXc","BbwgAaFFss",
+"2Yz7EKZamH","QWxoTZhwG1","cShY2QYxC0","EOE1oWaWsv","IRh48PYBf4","hE1QlpAhR1","mz8gx0Wr5y","0BmCy16lHc","he9IAGWqqX","Y1mC0wiHrZ",
+"rhl0J8xEKz","he9IABFkb8","djsrvdmoS7","hi5X7580YD","4W0Tl0BmCy","9GXkXfFDrJ","SjskQgjUTu","v1HlnQ6hMC","EOE1oJKWYR","zz4ZUHzZT8",
+"PYBf4piJSk","QssNCTa8f6","K20wKtlILt","ECMvUazIWp","BFkb8ru4UG","GWqqXblLA9","h1zcH0h1b1","pT8wurhl0J","suY4xSWfou","G1RhSCxVEf",
+"MK07YMojnP","v8yFNxciqp","AgJHQn8pJ9","8hJdts7Mxk","nFqikgjUTu","uQIcz5nmWv","8xEKzVBjhz","In3NSm4bxU","gf8rIEdBKc","GWqqX16lHc",
+"C2IrcVprf2","tuDySVprf2","wiHrZQnJ1S","hE1QlYf2Ec","okgRiyToGW","64s8N2DREs","nlaBylpF6W","ogLgclViBv","k85Aed7vjM","yofH3jfREu",
+"PYBf4wiHrZ","brhlQ0PktI","jfREuzz4ZU","dpe1vatef2","ru4UGW7cTs","AXpwEXyPZN","n1pmOOHaBz","ZUnqtlXFOB","jzUqR29QAz","VLTy6Qworu",
+"VerEAjiVBP","MaJQsBCxeC","24ARF618Di","GrDg7ZJTXH","aez9yMaJQs","zqH0W5Drn0","9GXkXuQIcz","dpe1v7Ow5C","CNHmvCNHmv","iqv4kfcwDa",
+"n1pmOxciqp","vLsmSpmeCd","qQxHPrhl0J","I7p2alm0pD","3weIFdQ586","sqVrfWreyP","rhl0JQbxXc","5VZjSKASQ8","UmaEvChuy3","WMiS3CxVEf",
+"lCMxylsQGo","618Di0MR5X","aFFsst98iW","yToGWJ2mQi","5VZjSX6Pin","kB5nPlsQGo","xXTI414FLR","uAWypuN6r3","mX2GEzbIYY","8hJdtFnPFB",
+"M3zXL14FLR","JJs5mDcpWB","16lHcCp3mZ","2hEEURBhp0","zY1GYBCxeC","VBjhzuQIcz","48cHLIRh48","he9IApiJSk","kB5nPAIYUu","gtCA55ZaEz",
+"ix74r580YD","7lUXZPb1pa","nnP8o618Di","dmoS75iGN5","dmoS7Gv3Fq","StlDJpvgjS","BGaQYuoStw","uupzk29QAz","6q6L948cHL","5Drn0GSQwj",
+"ciuWziwzGk","7lUXZn8pJ9","vOqCEdjsrv","djsrvqUJMd","JkzUn0BmCy","e6e4zFGzgp","0YAGHDcpWB","L7cGc1j5L8","618DiwiHrZ","HRxd8uLtKs",
+"Yf2EcpT8wu","lkMUA8hJdt","BGaQYWaim6","EoToPSWfou","tvdkDgjUTu","gIYvE29QAz","HzZT8VjCZq","xReeczqH0W","piJSkBFkb8","QworuZuDtD",
+"faHirQnJ1S","IKxdLlpF6W","48cHLZuDtD","piJSk9XyT9","P6bcgQWxoT","EoToPcL0aE","tl72WNAFuw","pWiOs5Namm","t98iWzQt6Q","aez9ygtCA5",
+"jS1ajaFFss","XyPZNUvlv4","DG4sTcQOnv","yluBx5Drn0","Z4I1vFPfSE","No0Qb7X3uy","ReKEWbZLvS","ReKEWh1zcH","QClRLMGlTF","Ul4a1d7vjM",
+"6q6L95ZaEz","7X3uyGrDg7","7fKYUru4UG","jeskSYjB9t","ciuWzrhl0J","5iGN5zqH0W","tlILtguMb8","9XyT9Vprf2","IBe8kC2Irc","iB08ltl72W",
+"vLsmSPYBf4","4QMc9lm0pD","TXQ0ZY1mC0","y94nwRACuj","fcJOyUvlv4","zHF1qlpF6W","pWiOsO3iyQ","piJSkOxWIH","0h1b1dpe1v","zHF1qZJTXH",
+"UlU3MVNCPd","QClRLM3zXL","tvdkDjeskS","n1pmOFcWrW","24ARFCdyBV","MGlTFSjskQ","ECMvUdjsrv","pvgjSaFFss","ulk41he9IA","vkCHHjtn0X",
+"sx5Gl7hyVv","kZANmzQt6Q","uZPqgguMb8","k85AehYBCK","VBjhzVNCPd","L7cGcOHaBz","LbRTHQ6Lix","ydG8UU3yw5","L7cGch1zcH","7fsYMFxX9q",
+"jSjS3aez9y","VIlwPYf2Ec","wDajXFcWrW","Kr8ys580YD","uQIczUl4a1","RkQkeAOgEe","zQt6QuTacx","580YD2Yz7E","Yf2Ecn1pmO","AXpwELDk6f",
+"blLA9faHir","48cHLSbRYy","yToGWlkMUA","9eoRcCK5W7","Ul4a1G1RhS","aez9yeuZA5","KASQ8IBe8k","AOgEeKsjRK","lm0pDJIqXi","s93MlMGlTF",
+"cL0aE3weIF","RpBQmQnJ1S","lpF6WDG4sT","MK07Yv8yFN","fqypyiwzGk","xReecWreyP","Y1mC07Ow5C","CK5W7gdQsS","5IhmGulk41","JRJQBWaWsv",
+"4QMc9QbxXc","HfyNQ1j5L8","s4786cL0aE","0MR5XGXdoH","fqypyblLA9","he9IAZuDtD","pvgjSn1pmO","Mm8sigf8rI","Cp3mZvLsmS","Cfgr31j5L8",
+"taOXKMojnP","2DREsK4GS8","SWfoupv0i7","ix74rRBhp0","fFDrJgf8rI","tlILtuupzk","e6e4z0PktI","2Yz7EbZLvS","Cp3mZZJTXH","hSSvQprNT6",
+"JJs5mFGzgp","48cHL9GXkX","MK07YQssNC","8RCUAMm8si","tAOsr8hJdt","AkKTkjS1aj","OHaBz618Di","zY1GYFcWrW","bZLvSbrhlQ","lkMUAfqypy",
+"ThjNnFnPFB","SjskQB3qem","C2Ircaez9y","QnJ1SpT8wu","azIWpCdyBV","uTacxiB08l","CqqaDo8Uyd","MmKGJn8pJ9","QbxXcUmaEv","QssNC8U2nU",
+"tuDySVjCZq","QworuFhtgl","RsQUqpAhR1","AmdQd1j5L8","xciqpUmaEv","8RCUAbZLvS","8RCUADLhzM","fLNg81LB1L","SmGzvzbIYY","B3qemRmDcr",
+"CdyBV8hJdt","rhl0JUl4a1","lCMxyhUTw7","zHF1qb29RJ","S2Dfu2Yz7E","kZANmdmoS7","14FLRDz1R3","lH1ktazIWp","UmaEvQ6hMC","IKxdLCNHmv",
+"tuDySpvgjS","8RCUAhYBCK","UlU3MkZANm","0h1b1fqypy","RmDcrWaWsv","lm0pDUlU3M","JRJQBsuY4x","SbRYy0h1b1","D6rByblLA9","VBjhzuJScX",
+"SbRYysoy9t","MGlTFW3VFH","kB5nPsqVrf","RkQkea00b5","4W0TlFVMxo","rhl0J16lHc","VBjhzPb1pa","VIlwPTa8f6","Pb1pagtCA5","euZA5kB5nP",
+"pmeCdNxx9V","bgJAzblLA9","bZLvSCfgr3","QbxXccL0aE","faHir5drc6","MezSW4dEz6","TwanotlILt","8U2nUVIlwP","aez9y7X3uy","QnJ1Smz8gx",
+"16lHciqv4k","2TRI7aDGtS","XyPZN1LB1L","wDajX0YAGH","In3NSkZANm","In3NSCNHmv","piJSkjfREu","8xEKztvdkD","hSSvQsoy9t","4W0Tl0Kyfs",
+"X6PinrKDLJ","BCxeCBCxeC","xReecv2eC3","Ul4a1d85a9","7ku1pxciqp","DLhzMJRJQB","4dEz6suY4x","aez9y7hyVv","blLA9l83Ud","lXFOB8cVD3",
+"v1HlnVIlwP","BbwgAk85Ae","v8yFNX6Pin","M3zXLl83Ud","OUYuFCdyBV","OHaBzuTacx","YjB9tpT8wu","pmeCdxXTI4","B3qem16lHc","hUTw7IjTwP",
+"m4bxUCxVEf","StlDJMGlTF","pAhR1Uvlv4","yluBx5iGN5","8U2nU7X3uy","AmdQdtjQxs","TCgPpd85a9","QYxC0l83Ud","JKWYRtl72W","RBhp0t59lR",
+"rhl0JEoToP","48cHLM3zXL","guMb8S77LH","lCMxys7Mxk","4QMc9WMiS3","ThjNnSs0Zu","7ku1p5nmWv","IjTwPTa8f6","ZJTXHjeskS","0Kyfsuvf7A",
+"Yf2EcS2Dfu","9eoRcAIYUu","0KyfsnlaBy","blLA97fsYM","NhXduDQimp","DQimpaez9y","uvf7AM3zXL","6AFT0tvdkD","JkzUnuLtKs","fLNg8tlILt",
+"StlDJZUnqt","cQOnvCNHmv","MaJQsv1Hln","FFDuipFrrl","KASQ8ksJby","0h1b1Gv3Fq","8hJdtHRxd8","xXTI4Z4I1v","tlILtbZLvS","rz7UtaDGtS",
+"VjCZqdQ586","AmdQdzbIYY","mz8gxl83Ud","AIYUuqQxHP","faHirTXQ0Z","v8yFNl83Ud","tvdkDReKEW","Mm8siTCgPp","HP433d85a9","LewvMsoy9t",
+"faHiruupzk","rz7UtFxX9q","kZANmLbRTH","45cIHn8pJ9","RkQkes7Mxk","m4bxUfaHir","hi5X7aez9y","zQt6QO3iyQ","piJSkKASQ8","oVQp6pFrrl",
+"GWqqXQnJ1S","48cHLP6bcg","d85a9IKxdL","bgJAzyvOMI","xXTI448cHL","HRxd8VerEA","v1HlnOUYuF","AXpwEQssNC","fcJOyFGzgp","AmdQdFLsph",
+"RACuj0MR5X","sx5GlLDk6f","EdBKczY1GY","5drc6zqH0W","FLsphCp3mZ","tvdkDQbxXc","5IhmGFLsph","MK07YJ2mQi","aL6AJ8U2nU","Gv3FqpiJSk",
+"yEfy9ulk41","KASQ8U3yw5","3otm6AgJHQ","M6qcGZhwG1","xciqpQYxC0","YOfrYZv7z0","fmIK1tl72W","fLNg8i3pyd","aDGtS580YD","vOqCEm4bxU",
+"hYBCKciuWz","7lUXZwiHrZ","UmaEvtAOsr","Cfgr3ix74r","VBjhzECMvU","n1pmOQWxoT","IjTwPVNCPd","K4GS8FPfSE","FFDuipiJSk","uTacxAXpwE",
+"RpBQmS77LH","BGaQYSs0Zu","Vprf2AmdQd","a00b5MmsIo","5VZjSt98iW","0Wr5y8FmFH","ogLgcyvOMI","5drc6zY1GY","Vprf2ZUnqt","5IhmG7ku1p",
+"sqVrfStlDJ","taOXKrhl0J","WPmlxO3iyQ","VIlwP8FmFH","faHir9eoRc","v8yFNt98iW","7fsYMThjNn","29QAz2Nslm","EoToPni2v1","hE1QliKqhr",
+"jzUqRLewvM","MmsIoSs0Zu","o8UydW3VFH","Gv3FqS77LH","fcwDahYBCK","16lHcOz8yZ","HP433Pb1pa","8cVD3JIqXi","NhXduS2Dfu","7hyVvsuY4x",
+"azIWpzqH0W","pWiOsTa8f6","RsQUqFjHXR","2DREsiB08l","fFDrJQ6hMC","4W0Tlx3LDe","h1zcHZzJHW","v1HlnJJs5m","aL6AJciuWz","W7cTsQssNC",
+"8hJdt8FmFH","Yh1hFvLsmS","VBjhzLDk6f","uN6r3sqVrf","jSjS3FPfSE","NAFuwK20wK","okgRiPb1pa","RkQkepFrrl","jtn0X2DREs","faHirfcJOy",
+"qUJMda00b5","GSQwjzbIYY","CIShG1v5hH","RpBQmsuY4x","AXpwE0MR5X","uZPqgAkKTk","P6bcgFjHXR","B3qematef2","DLhzMNAFuw","mX2GEv1Hln",
+"CqqaDRzaZA","uoStw7Ow5C","pAhR1SmGzv","48cHLydG8U","MaJQsW3VFH","bZLvSiwzGk","ru4UGcShY2","uJScXblLA9","29QAzLbRTH","fcwDafFDrJ",
+"vOqCEQssNC","P6bcgRACuj","aL6AJFxX9q","cShY2OUYuF","fLNg8Vprf2","Ul4a129QAz","IBe8k2Nslm","blLA97Ow5C","HlUbFpvgjS","0h1b1MmKGJ",
+"7X3uyG1RhS","Oz8yZGrDg7","7X3uy5VZjS","tl72WuN6r3","9iGoTokgRi","U3yw5h1zcH","n8pJ9QClRL","WMiS3Waim6","qUJMdgtCA5","64s8NHzZT8",
+"pAhR17Ow5C","RsQUqOHaBz","8U2nUguMb8","P6bcgpv0i7","2DREs6AFT0","tvdkDY1mC0","64s8NUl4a1","i3pyd14FLR","faHirRACuj","AgJHQs7Mxk",
+"yvOMI2Nslm","zmLYDt59lR","rKDLJ45cIH","zbIYYlpF6W","cL0aES77LH","WDVWJFcWrW","cL0aEFNYIM","qaofNcShY2","MaJQs5Drn0","PYBf4zqH0W",
+"Yf2EcW3VFH","xXTI46q6L9","TCgPpP6bcg","pT8wufcJOy","TXQ0ZtuDyS","Pb1pa9y4lw","FNYIMbZLvS","fcJOyW3VFH","a00b5YjB9t","uLtKst59lR",
+"CK5W75ZaEz","qQxHPZzJHW","5IhmGFPfSE","GWqqXazIWp","Cfgr3gjUTu","48cHLRpBQm","NhXduUlU3M","guMb8jtn0X","hE1QlFPfSE","16lHcReKEW",
+"uLtKsTCgPp","pmeCdVBjhz","pAhR1Chuy3","UlU3M5Namm","TwanoThjNn","2ZHdkQWxoT","DQimpe6e4z","iKqhrQnJ1S","yluBxLewvM","HRxd87Ow5C",
+"QWxoTGSQwj","n8pJ9RACuj","v1HlnaDGtS","azIWp5drc6","BFkb8okgRi","jeskSKZamH","0PktIQ6Lix","EoToPBFkb8","pmeCdW7cTs","hSSvQuN6r3",
+"I7p2aCfgr3","TXQ0ZGrDg7","sx5Gl16lHc","Z4I1v5nmWv","xReecFwEJz","uPX7GPb1pa","v1HlnOHaBz","dQ586sqVrf","8xEKzn8pJ9","MaJQsVjCZq",
+"KsjRKdhSuH","OHaBzSbRYy","M6qcGHP433","vOqCEhe9IA","F6PT2Q6Lix","P6bcg0YAGH","lXFOBYh1hF","brhlQWmadA","uAWypLewvM","jSjS3BCxeC",
+"rz7Utsoy9t","uoStwtlILt","euZA5gdQsS","RzaZAdQ586","oQ87roQ87r","mz8gxWreyP","FxX9qDz1R3","pAhR11v5hH","5VZjSzHF1q","Ul4a12TRI7",
+"zHF1qe6e4z","y94nwQClRL","ZUnqtB3qem","qUJMdAgJHQ","XyPZNyEfy9","2hEEUUvlv4","okgRinnP8o","iwzGkS77LH","StlDJdmoS7","GXdoH55rfB",
+"HP4330YAGH","4QMc9Zv7z0","okgRiJJs5m","VLTy6JKWYR","FGzgpeuZA5","RzaZA48cHL","3otm6WaWsv","piJSkIRh48","WMiS3pAhR1","WDVWJF6PT2",
+"EdBKcOHaBz","xReeclweGy","5Mg9rS77LH","cmXIXFjHXR","zQt6Qfqypy","XflUqNcICA","FVMxoK20wK","tuDySFNYIM","14FLRyofH3","AgJHQY1mC0",
+"29QAzpT8wu","QWxoTF6PT2","tuDyS8TxD7","yToGWWMiS3","IjTwPReKEW","kZANmFPfSE","d7vjMaDGtS","ogLgchSSvQ","MK07YYf2Ec","HfyNQMK07Y",
+"EOE1otjQxs","VjCZqYw2oU","brhlQAmdQd","Ul4a1ZUnqt","45cIH5Namm","n1pmOS2Dfu","FxX9qU3yw5","P6bcgCqqaD","faHirhe9IA","1v5hH7X3uy",
+"W7cTs2ZHdk","VBjhz0MR5X","X6PinWDVWJ","uN6r348cHL","DG4sTReKEW","OUYuFM3zXL","HRxd8mz8gx","VerEA5iGN5","MmKGJLewvM","YjB9tlViBv",
+"SbRYycL0aE","AIYUuFhtgl","TwanoKr8ys","QChxsTXQ0Z","TCgPpIn3NS","7ku1pZ4I1v","5iGN5FcWrW","lCMxyn1pmO","XflUqtjQxs","DcpWBy94nw",
+"SbRYyjeskS","IjTwPuAWyp","DcpWBaFFss","2Yz7E8FmFH","uJScXChuy3","yToGWS2Dfu","9rlg9ZhwG1","5drc6fLNg8","RsQUqGXdoH","ZUnqtru4UG",
+"Uvlv4G1RhS","zqH0W2ZHdk","bgJAzKsjRK","S77LHcmXIX","6AFT0xXTI4","3otm6s93Ml","9GXkXDcpWB","FwEJzy94nw","Yh1hFMGlTF","wiHrZXyPZN",
+"lXFOBO3iyQ","RACuj07n1c","Dz1R3QClRL","jSjS3lj07Q","BFkb8y94nw","2TRI7blLA9","uJScXbrhlQ","iqv4kvkCHH","Y1mC024ARF","jS1ajPOUYS",
+"7lUXZPOUYS","9rlg98RCUA","zY1GYFFDui","FwEJzksJby","t59lRciuWz","ECMvUCK5W7","tuDySYw2oU","6q6L955rfB","zmLYDMaJQs","okgRiFnPFB",
+"0h1b1prNT6","uupzkS2Dfu","brhlQAgJHQ","oVQp6kB5nP","HzZT8JXljW","OUYuFFjHXR","s4786JXljW","K4GS8ni2v1","yToGWix74r","hSSvQ5Drn0",
+"16lHcTCgPp","wiHrZpFrrl","FNYIMuZPqg","mz8gxo8Uyd","piJSk6AFT0","kB5nPRmDcr","dpe1v5iGN5","VIlwPReKEW","5Drn0rKDLJ","0Wr5y2Nslm",
+"aL6AJfaHir","PYBf4UlU3M","IjTwPs4786","6q6L9SmGzv","6AFT0X6Pin","Ta8f67Ow5C","FPfSEOUqFM","SjskQQYxC0","0KyfsMkgy8","OHaBzyluBx",
+"HP433Ta8f6","lViBvSmGzv","FhtglaFFss","POUYSoGu6x","FwEJzU3yw5","qQxHPK20wK","8xEKztlILt","ogLgcdpe1v","lH1ktWaWsv","In3NS7fKYU",
+"pT8wu2Yz7E","Q6hMCksJby","he9IA6AFT0","vkCHHs4786","gIYvEGWqqX","AXpwED6rBy","RsQUqgdQsS","yofH3prNT6","vLsmSoVQp6","Waim6KsjRK",
+"YjB9t5IhmG","LbRTHSs0Zu","Y1mC0yvOMI","jzUqR1j5L8","yvOMI8cVD3","HfyNQt98iW","5VZjSoGu6x","vkCHHciuWz","gf8rIHzZT8","QnJ1SOz8yZ",
+"CdyBVzHF1q","piJSk0YAGH","kZANmKZamH","lCMxyfcJOy","s4786wiHrZ","No0QbpvgjS","8FmFHYjB9t","55rfBjzUqR","8hJdt5Namm","lCMxygf8rI",
+"Ul4a1ogLgc","oQ87rs7Mxk","HfyNQ580YD","VBjhze6e4z","NcICARACuj","yluBxx3LDe","BCxeCQChxs","5NammgIYvE","jiVBPWaim6","cQOnvoGu6x",
+"GrDg7m4bxU","RACujFwEJz","fLNg8d85a9","Vprf2tvdkD","UlU3MdmoS7","AXpwEKsjRK","KZamHI7p2a","Yh1hFUmaEv","RzaZAEdBKc","JJs5mYOfrY",
+"5nmWv2TRI7","Cfgr3lm0pD","MmsIozY1GY","8cVD36q6L9","ksJbyxXTI4","No0QbIKxdL","hE1QlOz8yZ","IRh48hi5X7","Mkgy89rlg9","hSSvQeuZA5",
+"t59lRNxx9V","NOHszC2Irc","x3LDeCp3mZ","8xEKzt98iW","BCxeCblLA9","hYBCKx3LDe","NhXdupAhR1","HzZT8fcJOy","uoStw9y4lw","piJSkX6Pin",
+"bgJAza00b5","AgJHQRsQUq","VLTy6O3iyQ","SmGzvtvdkD","5Drn0RkQke","BbwgAzQt6Q","xXTI4oVQp6","uvf7ACfgr3","Kr8ysNxx9V","gf8rIAkKTk",
+"IKxdLVjCZq","jiVBPDcpWB","yEfy9BGaQY","hUTw7uLtKs","lj07QXyPZN","8xEKzpAhR1","2ZHdkazIWp","5NammxXTI4","BpYhV2ZHdk","7ku1pFnPFB",
+"oGu6xX6Pin","MmsIo8hJdt","jfREu0MR5X","k85AeJIqXi","brhlQjS1aj","KASQ8Zv7z0","JXljWRpBQm","3otm6zQt6Q","7lUXZRpBQm","cmXIXSmGzv",
+"MaJQsGSQwj","pFrrlSbRYy","NOHsz7Ow5C","dQ586FGzgp","29QAz2DREs","Yw2oU9GXkX","vkCHHpWiOs","NOHszLbRTH","b29RJ5Drn0","tvdkDQWxoT",
+"rz7UtIRh48","Q6LixyEfy9","AXpwEHP433","aFFsstjQxs","dmoS7VIlwP","8RCUA5drc6","kB5nPydG8U","zFgtBv2eC3","OUYuF8RCUA","QssNCNOHsz",
+"07n1cuN6r3","QYxC0v8yFN","Yf2EcGv3Fq","guMb8t59lR","8cVD3Yh1hF","lweGyI7p2a","k85AeK20wK","Yh1hFuLtKs","sqVrfWDVWJ","P6bcg9eoRc",
+"ZhwG1HlUbF","yvOMINhXdu","BCxeCK4GS8","8xEKzoVQp6","prNT6bgJAz","7lUXZCdyBV","yofH3hYBCK","JRJQB2ZHdk","5nmWvJIqXi","ru4UGv2eC3",
+"7fsYM580YD","gdQsSQWxoT","pWiOspvgjS","IKxdLjtn0X","x3LDe9rlg9","W7cTsv1Hln","uN6r3l83Ud","Dz1R3d85a9","ulk41FxX9q","8cVD3FVMxo",
+"kB5nP8U2nU","jeskS5nmWv","lpF6W07n1c","BbwgAQ6Lix","D6rBy0MR5X","CdyBVmX2GE","4dEz6pv0i7","h1zcHt59lR","Cfgr3XflUq","Gv3FqRBhp0",
+"J2mQi8FmFH","07n1cIBe8k","NcICAVIlwP","K4GS8oQ87r","tl72WTCgPp","lH1ktZzJHW","ciuWz48cHL","ZhwG1Mkgy8","uupzkQ6Lix","CIShGrhl0J",
+"5iGN5v2eC3","rhl0JKASQ8","Oz8yZK4GS8","qUJMdOHaBz","faHirlXFOB","7fKYUKsjRK","BFkb84W0Tl","zz4ZU7ku1p","dhSuHzQt6Q","DcpWBix74r",
+"5iGN5580YD","B3qemYh1hF","HlUbF9iGoT","GWqqX2ZHdk","Dz1R30ao3l","Gv3FqtaOXK","0YAGHuZPqg","5iGN5uupzk","DcpWBUl4a1","atef2Ta8f6",
+"yEfy9ydG8U","Cp3mZWaWsv","RsQUqzY1GY","Pb1pa1LB1L","tvdkD0BmCy","0Wr5y4W0Tl","UmaEvlweGy","FxX9q8cVD3","cShY2QnJ1S","ReKEWIBe8k",
+"ciuWz3otm6","rKDLJZzJHW","5nmWvNxx9V","Yf2EcM3zXL","bZLvSOxWIH","xXTI48TxD7","S2DfuUmaEv","sqVrfJRJQB","GrDg7OUYuF","8U2nUzY1GY",
+"LDk6fyofH3","WreyPY1mC0","uvf7AFhtgl","lH1ktiwzGk","7hyVvsqVrf","VIlwPXflUq","TCgPpTwano","uupzkQWxoT","MmsIoVprf2","s47865VZjS",
+"lkMUA7fKYU","okgRizFgtB","HP43316lHc","YOfrYMm8si","atef2HfyNQ","6q6L9OUqFM","SjskQlXFOB","zFgtBfLNg8","CdyBVOxWIH","sqVrfIBe8k",
+"Kr8ysWaim6","e6e4zFLsph","CqqaDpT8wu","MmKGJLbRTH","0ao3l7X3uy","d85a9FxX9q","PYBf4RmDcr","rhl0Jxciqp","taOXKQChxs","gf8rIyluBx",
+"Vprf2JIqXi","uupzkPb1pa","FnPFBW7cTs","RsQUqCdyBV","S77LH7Ow5C","Qworu7Ow5C","zbIYY2DREs","0BmCy8U2nU","ulk41lViBv","C2IrcguMb8",
+"CK5W7SmGzv","i3pydFGzgp","G1RhSv1Hln","45cIHIKxdL","uupzktl72W","QChxsPYBf4","pT8wu0MR5X","djsrvOUYuF","hi5X7hE1Ql","B3qemCp3mZ",
+"AmdQd8RCUA","5iGN52hEEU","DG4sTuZPqg","oVQp6ix74r","brhlQWDVWJ","kB5nPDG4sT","yluBxBFkb8","Gv3FqCfgr3","d85a9okgRi","3weIFbgJAz",
+"RzaZAQbxXc","jfREufLNg8","uTacxTwano","VBjhzHfyNQ","Z4I1vAOgEe","kZANmogLgc","IjTwPix74r","v2eC3xXTI4","cQOnvCIShG","ydG8UoGu6x",
+"lCMxyIBe8k","BGaQYJKWYR","tuDySFjHXR","RpBQmSbRYy","CIShGlXFOB","d85a9JkzUn","SWfou5Mg9r","8FmFH0BmCy","fcJOyDQimp","VIlwP5Mg9r",
+"faHirdjsrv","aFFssJRJQB","oVQp62ZHdk","ZuDtDaDGtS","v1Hln0YAGH","iqv4kBbwgA","lViBvhi5X7","NhXduaL6AJ","Zv7z0atef2","RACujL7cGc",
+"dpe1vQssNC","WaWsva00b5","ZUnqt5drc6","jfREuhe9IA","gtCA5x3LDe","piJSkGrDg7","wiHrZHRxd8","pAhR18RCUA","DG4sTgf8rI","uQIczKsjRK",
+"brhlQB3qem","8hJdtBGaQY","SmGzvhSSvQ","RsQUqQYxC0","WDVWJ3weIF","LDk6fJIqXi","fcwDaIBe8k","CxVEf580YD","jtn0XMm8si","atef2GWqqX",
+"NOHszOz8yZ","PYBf448cHL","JJs5mi7WMQ","djsrvCNHmv","sqVrfuvf7A","SbRYy07n1c","s93MllsQGo","XyPZNThjNn","2Yz7EFPfSE","iwzGkCxVEf",
+"UmaEvYf2Ec","0MR5XBCxeC","14FLR7ku1p","C2IrcuTacx","HfyNQZ4I1v","5iGN5C2Irc","Q6hMCDcpWB","d7vjMFPfSE","dmoS7tvdkD","Ul4a1uJScX",
+"iB08l5drc6","FLsphEoToP","bZLvSGv3Fq","rKDLJUlU3M","In3NSdhSuH","m4bxUtAOsr","48cHLt98iW","gdQsSW7cTs","dQ586fmIK1","GWqqXfaHir",
+"ZzJHWzFgtB","S77LH9eoRc","HfyNQs7Mxk","zY1GYU3yw5","tvdkDpvgjS","vkCHHuPX7G","ksJbyECMvU","TwanouAWyp","s7MxkIn3NS","lm0pDHRxd8",
+"zFgtBDcpWB","2ZHdkuAWyp","5nmWvt59lR","i7WMQydG8U","HlUbFCxVEf","DQimpv2eC3","uAWypWreyP","VjCZqhYBCK","soy9tGWqqX","G1RhSNOHsz",
+"9iGoTIRh48","YjB9tYh1hF","IjTwPWreyP","jiVBPiKqhr","wiHrZvkCHH","ZzJHWFxX9q","zqH0WSmGzv","faHiraDGtS","9GXkXuAWyp","PYBf4SbRYy",
+"BbwgAHzZT8","uQIcz07n1c","Yh1hFMK07Y","ni2v1atef2","sqVrf9iGoT","QWxoTxXTI4","yvOMI2hEEU","gdQsSgf8rI","BpYhV5IhmG","aFFsst59lR",
+"BFkb8zbIYY","s93MlzY1GY","ru4UGHRxd8","TXQ0ZX6Pin","uAWyp1LB1L","lCMxylm0pD","Yf2EchUTw7","8cVD35ZaEz","9XyT9VBjhz","G1RhSBCxeC",
+"DLhzMtl72W","IKxdLNhXdu","kB5nP1v5hH","gtCA5vkCHH","7lUXZhUTw7","xReecuLtKs","FxX9qcShY2","Kr8yst59lR","okgRi6q6L9","HP433AmdQd",
+"uLtKsfFDrJ","YjB9tjSjS3","tl72W0PktI","DG4sTGv3Fq","9eoRc8FmFH","CdyBVt98iW","ECMvUhE1Ql","SjskQqQxHP","cmXIXdpe1v","oQ87rwiHrZ",
+"yEfy9uZPqg","Mkgy80Kyfs","uPX7G16lHc","45cIHMm8si","9iGoT9rlg9","ciuWz0Kyfs","S77LHrz7Ut","8xEKzpmeCd","QbxXcMojnP","QnJ1SVjCZq",
+"ulk410ao3l","9XyT98cVD3","zz4ZUFnPFB","cL0aETCgPp","zFgtBcQOnv","RpBQmLbRTH","JJs5mXflUq","WmadAzmLYD","yvOMIDz1R3","ni2v1QbxXc",
+"Oz8yZ24ARF","55rfBpvgjS","t59lRGXdoH","2ZHdkciuWz","qQxHPzFgtB","qUJMdxReec","UlU3MlH1kt","580YDfqypy","pmeCdDz1R3","lj07QaFFss",
+"5nmWvDG4sT","i3pydKsjRK","FwEJzHfyNQ","n8pJ9OHaBz","MezSWzbIYY","9GXkXoQ87r","blLA9prNT6","AIYUuZUnqt","nnP8oZ4I1v","YOfrYTCgPp",
+"he9IApWiOs","gdQsSQYxC0","sqVrfM6qcG","W3VFHzY1GY","CIShG45cIH","yEfy9ZJTXH","Q6LixQYxC0","zmLYDa00b5","uPX7GRmDcr","KZamHEOE1o",
+"qaofNsqVrf","pAhR1zbIYY","Ul4a1K4GS8","k85Aes7Mxk","5nmWvW3VFH","hE1QlG1RhS","QnJ1SeuZA5","y94nwhi5X7","RxrsmCNHmv","AXpwEQClRL",
+"QClRLS77LH","GSQwji7WMQ","TXQ0ZQbxXc","VerEAStlDJ","tl72W4W0Tl","ThjNnAIYUu","pAhR107n1c","Fhtglv1Hln","GWqqXpT8wu","GSQwjlpF6W",
+"WmadA7Ow5C","8TxD7UlU3M","guMb8k85Ae","iKqhrtaOXK","B3qemRsQUq","8TxD7m4bxU","Q6hMCHP433","guMb8VBjhz","OUYuFFwEJz","aez9yd7vjM",
+"DLhzM9GXkX","EOE1olXFOB","dpe1vt98iW","Yh1hF4W0Tl","1v5hHv1Hln","mX2GE2DREs","VBjhzQClRL","t98iWKASQ8","FnPFBNo0Qb","uAWypPOUYS",
+"Yf2EcrKDLJ","CxVEf3otm6","O3iyQ5VZjS","pvgjSzqH0W","1v5hHU3yw5","F6PT2FcWrW","zFgtBtl72W","Cfgr3tvdkD","29QAzzFgtB","U3yw57fsYM",
+"OHaBzNOHsz","KsjRKW7cTs","rz7Ut8TxD7","Oz8yZ6q6L9","L7cGchE1Ql","lCMxyJXljW","JKWYRCNHmv","MGlTFQnJ1S","UmaEvsqVrf","gdQsSaFFss",
+"dhSuHHP433","0Wr5yMmKGJ","ogLgcZUnqt","SbRYyhi5X7","29QAz16lHc","2ZHdkQClRL","J2mQiOHaBz","FPfSErKDLJ","v2eC3tl72W","pT8wuyluBx",
+"aez9y5Drn0","jeskS5iGN5","nlaByfcJOy","zY1GYzHF1q","CdyBVwiHrZ","iB08lRmDcr","uN6r3prNT6","Z4I1vn1pmO","8hJdtuTacx","aL6AJHfyNQ",
+"nlaBywiHrZ","zqH0W5IhmG","Dz1R3xXTI4","DG4sTVBjhz","ogLgcFLsph","Chuy3guMb8","9XyT99GXkX","P6bcgxReec","3otm6uPX7G","OxWIHaez9y",
+"dhSuHfqypy","hYBCKIBe8k","blLA9WmadA","zmLYDlCMxy","nlaByMGlTF","HP433HRxd8","4dEz6bZLvS","S2Dfui3pyd","8xEKzCqqaD","Kr8ysBbwgA",
+"O3iyQUlU3M","uLtKsb29RJ","Chuy3zmLYD","8U2nUBGaQY","9iGoTY1mC0","tjQxsxXTI4","taOXKOxWIH","VjCZqUlU3M","hYBCKTwano","W3VFHPb1pa",
+"BGaQYAIYUu","ECMvU64s8N","cL0aElj07Q","Chuy3QbxXc","iwzGk6q6L9","jS1ajzqH0W","mX2GE4W0Tl","nFqikvLsmS","VNCPdFxX9q","QWxoTprNT6",
+"FhtglECMvU","s93Ml0Kyfs","v8yFND6rBy","NhXdu9eoRc","lpF6WnnP8o","PYBf4d7vjM","M6qcGPOUYS","24ARFyEfy9","NcICAXyPZN","2ZHdkIRh48",
+"Vprf2LewvM","GXdoHgIYvE","qQxHPcL0aE","ydG8UqUJMd","uQIczUmaEv","AkKTkru4UG","QClRLhE1Ql","fcJOyBFkb8","uupzkdpe1v","CIShGCIShG",
+"IBe8krKDLJ","JkzUn7fsYM","uZPqg0MR5X","lm0pDaFFss","AIYUuVerEA","5drc6BCxeC","fFDrJuvf7A","NAFuwlweGy","QYxC0yvOMI","pmeCdWmadA",
+"uZPqgVBjhz","SmGzvqaofN","y94nwgjUTu","i7WMQWMiS3","prNT6NOHsz","Mm8sidQ586","9XyT9RzaZA","wiHrZBFkb8","Ss0ZuCNHmv","CK5W7IBe8k",
+"7ku1pFGzgp","RmDcrM3zXL","uupzkEOE1o","K4GS8Nxx9V","M6qcGOUqFM","M6qcGFwEJz","fqypy7lUXZ","uPX7GFLsph","AmdQd5ZaEz","gf8rIazIWp",
+"h1zcHtAOsr","ru4UGwDajX","StlDJuupzk","yluBxjiVBP","P6bcgQworu","2hEEUQChxs","fmIK1uupzk","GrDg7l83Ud","cmXIXlViBv","LewvM5drc6",
+"iB08lfcJOy","2ZHdkJkzUn","CIShGRpBQm","MK07YRkQke","pv0i7Vprf2","iqv4kPOUYS","OUqFMnFqik","ZhwG1sqVrf","djsrvs93Ml","2Nslm07n1c",
+"cQOnvazIWp","aFFsszz4ZU","HP433IBe8k","BpYhVtvdkD","lCMxyMojnP","xXTI4U3yw5","3weIFn1pmO","9iGoTpT8wu","k85Ae29QAz","IKxdLJRJQB",
+"MGlTFwiHrZ","DLhzMhYBCK","7X3uyFGzgp","FwEJzEoToP","vLsmS6AFT0","7Ow5CF6PT2","zHF1qtvdkD","1j5L8QChxs","0Wr5yvLsmS","QClRLVBjhz",
+"x3LDedpe1v","W7cTsOz8yZ","Pb1paSmGzv","hSSvQNOHsz","29QAz9iGoT","QnJ1S5drc6","16lHche9IA","qUJMdbrhlQ","iwzGk2Yz7E","FLsphAOgEe",
+"XflUqNhXdu","s4786cShY2","HlUbFHRxd8","7fKYUMmKGJ","0Wr5yaez9y","4QMc94QMc9","dmoS7FPfSE","Waim6pT8wu","FFDuix3LDe","Mkgy8BpYhV",
+"WmadAfaHir","yToGWCxVEf","nnP8oAXpwE","mz8gxRpBQm","BpYhVt59lR","xciqpVIlwP","lj07Q2Yz7E","dpe1v8xEKz","fmIK1Vprf2","rhl0JfaHir",
+"7fsYMsqVrf","aDGtS0h1b1","BCxeCyToGW","JIqXijfREu","W3VFHC2Irc","55rfBvkCHH","6q6L9cL0aE","0PktIulk41","atef2lH1kt","zz4ZUDLhzM",
+"DG4sTGWqqX","7hyVvlweGy","ZUnqtSs0Zu","S77LHiqv4k","Nxx9VZhwG1","MGlTFPOUYS","C2Irc1j5L8","MmKGJatef2","RsQUqn8pJ9","qUJMdmz8gx",
+"ni2v1kZANm","Z4I1vatef2","fmIK1nFqik","zFgtBJJs5m","HzZT8SWfou","IjTwPLDk6f","mz8gxdQ586","x3LDe5VZjS","mz8gxxReec","uQIcziqv4k",
+"yvOMIs7Mxk","AgJHQMK07Y","tuDySNhXdu","hi5X7QChxs","cQOnvprNT6","lViBvYOfrY","LDk6fOUqFM","6AFT08cVD3","cmXIXMojnP","TCgPpdmoS7",
+"07n1cuLtKs","gjUTu2ZHdk","TXQ0ZAgJHQ","9rlg9EdBKc","FcWrW6q6L9","zQt6Qh1zcH","vkCHHWDVWJ","uvf7AzqH0W","2ZHdky94nw","8U2nUBFkb8",
+"e6e4zCp3mZ","ydG8UNAFuw","QnJ1SNAFuw","ksJby9y4lw","RBhp0OHaBz","YjB9taez9y","7fsYMdQ586","jtn0XfcJOy","s4786taOXK","tuDyScL0aE",
+"RkQke8RCUA","5iGN5VLTy6","rhl0JcShY2","dhSuHCp3mZ","rKDLJ07n1c","0h1b1vLsmS","QChxs5drc6","LbRTHuAWyp","QbxXckZANm","cQOnvuupzk",
+"y94nwulk41","hSSvQWreyP","FGzgpfmIK1","5iGN5iKqhr","nnP8o0PktI","ksJbyzbIYY","faHirKsjRK","jeskSfqypy","n8pJ9dmoS7","No0Qbgf8rI",
+"KsjRKSbRYy","6q6L9pAhR1","TCgPpMmsIo","8FmFHdpe1v","ReKEWJJs5m","RxrsmG1RhS","X6Pinxciqp","Mm8siuAWyp","rhl0J2DREs","piJSkpWiOs",
+"lj07QokgRi","cmXIXuPX7G","4dEz6AXpwE","4W0TlCNHmv","yvOMIaL6AJ","2NslmpFrrl","ru4UGFNYIM","8xEKzZUnqt","QworupvgjS","7fsYMyluBx",
+"07n1cJkzUn","KASQ8I7p2a","VjCZqs93Ml","s93MlaDGtS","wiHrZ0MR5X","rKDLJfLNg8","K20wK0MR5X","NAFuwk85Ae","lViBvDG4sT","prNT6nFqik",
+"suY4xCK5W7","0h1b1Q6Lix","EdBKcM3zXL","ZUnqtmX2GE","VNCPdlXFOB","aL6AJSmGzv","lXFOBgIYvE","OxWIHuLtKs","MK07Y0ao3l","1LB1LCp3mZ",
+"iwzGkVjCZq","CIShGt59lR","WreyPGWqqX","nlaByazIWp","5iGN5pv0i7","a00b545cIH","M3zXLv2eC3","5Drn0FGzgp","BFkb89XyT9","n8pJ9IBe8k",
+"3otm6RsQUq","G1RhSNAFuw","xciqpQ6hMC","djsrvSs0Zu","P6bcgs7Mxk","DG4sTfaHir","Fhtgl6q6L9","v2eC3piJSk","i3pyds7Mxk","lweGylkMUA",
+"ni2v1zQt6Q","0KyfsBGaQY","JXljWqaofN","aDGtSnlaBy","bZLvS07n1c","BGaQYAmdQd","DcpWBl83Ud","4QMc9lkMUA","QssNClsQGo","1v5hHfcJOy",
+"AOgEennP8o","SmGzv0PktI","5NammlkMUA","WDVWJaL6AJ","IRh48cmXIX","oGu6xtuDyS","RxrsmMK07Y","MGlTF5drc6","fLNg8CdyBV","QssNCM3zXL",
+"zHF1qnlaBy","OxWIHCK5W7","KZamHCNHmv","MezSW2TRI7","FLsphXflUq","9XyT9cShY2","9iGoTv2eC3","ulk41W7cTs","gjUTu1LB1L","sqVrf0Wr5y",
+"nFqikYw2oU","QClRLVjCZq","1j5L8hUTw7","xXTI4FnPFB","3otm6JJs5m","W3VFHhi5X7","HP433gdQsS","16lHcLDk6f","ReKEWQbxXc","yToGW2TRI7",
+"Chuy364s8N","BGaQYXyPZN","QClRLhYBCK","xciqpMmKGJ","UlU3M1j5L8","S77LHnFqik","GXdoH1LB1L","0Wr5y7lUXZ","sx5GliwzGk","uTacxBFkb8",
+"DQimpjSjS3","CdyBVKZamH","gf8rI8xEKz","6AFT016lHc","pWiOsgjUTu","Vprf2suY4x","djsrv2Yz7E","s7MxkpiJSk","0ao3lHRxd8","MmKGJuPX7G",
+"DcpWBFVMxo","FPfSEdQ586","gdQsSFcWrW","07n1cQssNC","HlUbF8RCUA","Mkgy8WmadA","K20wKfaHir","0KyfszmLYD","yluBxvLsmS","VLTy6YjB9t",
+"Mkgy8EdBKc","VjCZq07n1c","QYxC02ZHdk","Dz1R3580YD","Gv3Fq4W0Tl","4W0TllCMxy","VIlwPSs0Zu","8hJdtuvf7A","48cHLPOUYS","cShY2Yw2oU",
+"HlUbFk85Ae","ru4UGiqv4k","v2eC3B3qem","Q6LixcQOnv","uTacxiqv4k","ReKEWQ6Lix","VNCPdWmadA","fLNg8SjskQ","aDGtSMm8si","ZzJHWHRxd8",
+"vOqCE5IhmG","VLTy6Fhtgl","zY1GYFGzgp","ZhwG1CdyBV","Ss0ZuOxWIH","s93MlMkgy8","Vprf21LB1L","YOfrYuPX7G","QnJ1SDz1R3","55rfBo8Uyd",
+"iqv4kciuWz","FxX9qCp3mZ","XflUq9rlg9","14FLRRACuj","HfyNQDG4sT","JJs5mnFqik","DLhzMRkQke","GSQwjlj07Q","Cfgr3CqqaD","aez9ynnP8o",
+"Zv7z08RCUA","kZANm7X3uy","9iGoTCxVEf","5ZaEzBbwgA","okgRiyluBx","SWfou6AFT0","pvgjSD6rBy","zHF1q14FLR","No0QbAgJHQ","RACujciuWz",
+"uAWypmz8gx","16lHcl83Ud","l83UdGSQwj","Mkgy8QbxXc","D6rByDLhzM","dmoS7EdBKc","suY4xpAhR1","K4GS81j5L8","6q6L9KASQ8","FFDuiuupzk",
+"jiVBPGrDg7","Yh1hFFVMxo","lkMUAjS1aj","7Ow5Cni2v1","VNCPdm4bxU","In3NS0ao3l","64s8NFcWrW","uJScXfFDrJ","1LB1L5iGN5","RzaZAAXpwE",
+"48cHLO3iyQ","FFDuiDG4sT","RBhp08U2nU","VLTy6HRxd8","lj07Qo8Uyd","x3LDeK20wK","yvOMI7fsYM","piJSk2DREs","AmdQd9iGoT","RmDcrlH1kt",
+"ReKEWwDajX","AgJHQC2Irc","blLA9KZamH","ulk41ZzJHW","FwEJziqv4k","5iGN53weIF","iqv4kdmoS7","FhtglMK07Y","aL6AJZv7z0","ThjNnzbIYY",
+"VjCZqAXpwE","L7cGc5Mg9r","i3pyduAWyp","i3pydQWxoT","OHaBzKZamH","S77LHJkzUn","QChxsUmaEv","B3qemDLhzM","64s8NMK07Y","5iGN5pWiOs",
+"djsrv3otm6","45cIHhUTw7","ReKEWFGzgp","VLTy65Namm","yToGWYh1hF","iwzGkiB08l","ru4UGQbxXc","Ul4a1PYBf4","24ARFEdBKc","Twanod7vjM",
+"zz4ZUi7WMQ","NcICACqqaD","atef2Mm8si","pWiOsC2Irc","lsQGo8cVD3","JRJQBY1mC0","lpF6WTCgPp","YOfrYL7cGc","lCMxyoQ87r","FjHXRRACuj",
+"Y1mC0iKqhr","lCMxy5IhmG","Cp3mZzHF1q","1v5hH6AFT0","gjUTu1v5hH","VBjhzfLNg8","MezSWYf2Ec","zqH0WzHF1q","Ta8f6qQxHP","HP433tlILt",
+"xciqp7fKYU","ZUnqt16lHc","07n1c6q6L9","5Mg9rLewvM","ZhwG1KASQ8","zFgtBAgJHQ","nFqikvOqCE","B3qem9GXkX","7ku1pgf8rI","zQt6Q1j5L8",
+"XyPZNrz7Ut","LDk6fsx5Gl","Uvlv4uTacx","WmadABpYhV","8hJdtuPX7G","RkQkeQworu","s7MxkcShY2","MezSWZv7z0","LDk6fa00b5","ZUnqtAgJHQ",
+"0BmCy5VZjS","zqH0WGWqqX","pT8wuX6Pin","Waim6CdyBV","ZuDtD2hEEU","No0Qb8cVD3","0h1b1CIShG","4W0Tlrhl0J","0BmCyK20wK","e6e4z5ZaEz",
+"D6rByJJs5m","K20wK8xEKz","AmdQdRsQUq","hYBCKdmoS7","3weIF7hyVv","guMb8y94nw","pvgjSpv0i7","BCxeC7fKYU","5Drn0qUJMd","9eoRclH1kt",
+"8cVD3lCMxy","EOE1oX6Pin","FPfSEWMiS3","0BmCyvLsmS","tlILtn1pmO","ksJby9XyT9","prNT6OxWIH","B3qemFPfSE","y94nwSbRYy","0Wr5y5IhmG",
+"M6qcGh1zcH","lH1ktDQimp","uLtKso8Uyd","VIlwPiwzGk","qaofN7hyVv","vLsmSLDk6f","W7cTs3weIF","wiHrZiwzGk","taOXKuN6r3","TXQ0ZHzZT8",
+"MK07YFLsph","JIqXi5drc6","16lHcfmIK1","RxrsmZhwG1","tAOsrZJTXH","CK5W7Ul4a1","5IhmG8hJdt","sx5Gls7Mxk","t98iWKZamH","9y4lwEoToP",
+"nFqikciuWz","OHaBzQWxoT","AkKTkpvgjS","sqVrfuPX7G","AgJHQ2ZHdk","o8UydQWxoT","x3LDev1Hln","t59lRGWqqX","nFqiknFqik","e6e4zkZANm",
+"ciuWzlH1kt","JXljWkB5nP","0YAGHguMb8","FLsphFLsph","K4GS8WDVWJ","Yh1hFOHaBz","7fKYU7X3uy","lsQGouLtKs","07n1c14FLR","o8UydjSjS3",
+"FPfSEnFqik","tuDyS48cHL","lH1ktPOUYS","QnJ1SQ6hMC","Oz8yZzY1GY","ECMvUQbxXc","pFrrlF6PT2","lweGyPb1pa","9XyT9nFqik","WPmlxGv3Fq",
+"Yf2EcKASQ8","GXdoH0PktI","h1zcHlpF6W","ulk41guMb8","zbIYYydG8U","VerEATwano","JRJQBNhXdu","xciqpoQ87r","lH1ktuTacx","7fKYUciuWz",
+"G1RhSVNCPd","ZhwG1BpYhV","zqH0WgIYvE","QnJ1SxReec","S2DfunlaBy","MaJQsRmDcr","DG4sT2TRI7","iKqhrGv3Fq","oQ87rzbIYY","0Wr5yFVMxo",
+"uJScXhE1Ql","s4786jS1aj","yofH3DG4sT","pmeCdKr8ys","taOXKdQ586","vLsmSUvlv4","prNT6gdQsS","O3iyQtjQxs","zQt6QWaWsv","JkzUnfFDrJ",
+"S77LHVprf2","WaWsvIjTwP","zY1GYsqVrf","L7cGcWaWsv","dQ586qQxHP","QnJ1S48cHL","brhlQFxX9q","HlUbFWreyP","9iGoThi5X7","rz7Utv2eC3",
+"nFqikpvgjS","Waim6UlU3M","zbIYYzHF1q","FcWrWbrhlQ","8TxD7Kr8ys","djsrv6q6L9","64s8NFNYIM","5iGN5S2Dfu","HzZT8VNCPd","1j5L8sx5Gl",
+"HRxd84QMc9","9GXkXhUTw7","Vprf2RACuj","yluBxv1Hln","OUqFM0Kyfs","2Yz7E5iGN5","hi5X7P6bcg","y94nwgtCA5","B3qemFLsph","AkKTkuLtKs",
+"uJScXRACuj","ECMvUDcpWB","oGu6xMGlTF","Z4I1vtvdkD","0YAGHgjUTu","a00b5Yw2oU","CqqaDOHaBz","14FLRWaim6","pv0i7jiVBP","tl72WVBjhz",
+"5IhmGDLhzM","sx5Gl7ku1p","l83UdyvOMI","MmsIoprNT6","prNT6Cfgr3","29QAzjiVBP","OHaBzfmIK1","jtn0X3otm6","wDajXmX2GE","HfyNQrhl0J",
+"W3VFHFcWrW","L7cGcGrDg7","jSjS3Chuy3","MmKGJhe9IA","AOgEetl72W","v2eC3uZPqg","xXTI4ECMvU","9rlg9Uvlv4","ZuDtDVIlwP","pvgjS7Ow5C",
+"8xEKz64s8N","LewvMcmXIX","NhXdujeskS","pWiOsVprf2","MojnPVBjhz","6q6L9vOqCE","lXFOBQ6Lix","AXpwEjfREu","lm0pD580YD","uLtKsRzaZA",
+"Kr8ysMmsIo","VBjhz5Namm","k85AeuPX7G","JkzUnCqqaD","7lUXZUvlv4","xXTI4tvdkD","AXpwE0PktI","fLNg8Yf2Ec","d85a9djsrv","W7cTszz4ZU",
+"b29RJEoToP","9iGoT2hEEU","2ZHdkh1zcH","vkCHH7fsYM","jfREuprNT6","Uvlv416lHc","ZJTXH1j5L8","QbxXcoVQp6","m4bxUVjCZq","MaJQsFGzgp",
+"B3qemzFgtB","RBhp0VIlwP","EOE1oiKqhr","JJs5mfaHir","POUYS7ku1p","rKDLJFLsph","NAFuw5Mg9r","AXpwEJ2mQi","OUqFMDz1R3","iB08lVjCZq",
+"lpF6W0PktI","zz4ZUReKEW","gtCA57hyVv","HP433HlUbF","0Wr5y1LB1L","55rfBGrDg7","CK5W7jiVBP","FhtglAXpwE","zqH0WCIShG","bZLvSVBjhz",
+"AIYUuU3yw5","2DREsStlDJ","F6PT2ciuWz","AgJHQcQOnv","jSjS3ksJby","yluBxTCgPp","yofH3ni2v1","wiHrZ5Namm","9y4lwM6qcG","DcpWBIKxdL",
+"wDajX1LB1L","zbIYYVLTy6","1j5L87fKYU","JJs5mkZANm","xReecNOHsz","OHaBzjeskS","MK07YyluBx","i3pydhSSvQ","StlDJQnJ1S","WDVWJAgJHQ",
+"he9IAaL6AJ","NAFuwVjCZq","jiVBPhe9IA","Mm8siUvlv4","IjTwP9iGoT","CqqaDQssNC","RsQUqDG4sT","EOE1oyvOMI","nnP8oTCgPp","s4786tlILt",
+"taOXKLbRTH","ZJTXH1v5hH","NhXdubrhlQ","atef2cQOnv","ksJbyiB08l","ulk41d7vjM","9rlg948cHL","i3pydEOE1o","BCxeCNo0Qb","M6qcGx3LDe",
+"S2DfuFwEJz","rKDLJvkCHH","fLNg83otm6","zbIYYyToGW","S2DfuTCgPp","6AFT0x3LDe","bZLvSiKqhr","4QMc9o8Uyd","nFqiks93Ml","rKDLJXflUq",
+"xciqpC2Irc","yluBxyvOMI","zHF1qFPfSE","l83UdQssNC","jiVBPMm8si","iwzGkmz8gx","uTacx2Yz7E","2ZHdkaez9y","kZANmQWxoT","Q6hMCPYBf4",
+"1LB1LI7p2a","AkKTkbZLvS","ZJTXHPOUYS","MGlTF2hEEU","BFkb82Yz7E","qQxHPdjsrv","U3yw5CK5W7","yEfy99GXkX","7Ow5CwDajX","Ss0ZuKsjRK",
+"I7p2aS2Dfu","WmadANOHsz","MK07Yiqv4k","9rlg9lpF6W","KASQ8GXdoH","4QMc9jfREu","Q6LixTXQ0Z","GXdoHiB08l","Q6hMC8FmFH","DcpWBdjsrv",
+"RACujW3VFH","AmdQdO3iyQ","UlU3MFxX9q","jS1ajs93Ml","B3qemJRJQB","MaJQsydG8U","uoStwJRJQB","uvf7AjzUqR","aDGtSBGaQY","CNHmvfLNg8",
+"Z4I1vZhwG1","iB08lqaofN","VIlwP5Namm","MezSWtAOsr","SjskQZuDtD","J2mQijiVBP","FGzgprhl0J","2NslmfLNg8","2TRI7D6rBy","AkKTkFPfSE",
+"sx5Gl9eoRc","9XyT9WPmlx","ulk41RBhp0","yToGWfmIK1","brhlQ9eoRc","dQ586b29RJ","iKqhruN6r3","6AFT0o8Uyd","WPmlx9y4lw","b29RJzFgtB",
+"WDVWJaez9y","lXFOBLbRTH","L7cGceuZA5","I7p2aK4GS8","uZPqgHfyNQ","Chuy3s93Ml","9XyT9JXljW","dQ5860Wr5y","ni2v1VLTy6","14FLRbZLvS",
+"HfyNQtlILt","CNHmvEoToP","P6bcgIKxdL","Yw2oUQssNC","dmoS7L7cGc","FVMxoAmdQd","pAhR1yEfy9","gjUTuVerEA","RmDcraez9y","dQ586Kr8ys",
+"zz4ZURBhp0","n1pmOuoStw","ZhwG1lXFOB","sx5GlGv3Fq","WreyPQWxoT","DcpWBblLA9","KZamHbgJAz","tjQxsFPfSE","9y4lwDz1R3","ciuWziB08l",
+"xciqpFNYIM","h1zcH4W0Tl","zQt6QEOE1o","FxX9qtuDyS","d85a98TxD7","he9IAgjUTu","DcpWBprNT6","U3yw5WMiS3","Mkgy8oVQp6","OHaBzlH1kt",
+"zHF1qTCgPp","kB5nPoQ87r","m4bxUFcWrW","fLNg8azIWp","4QMc9Gv3Fq","uN6r3FPfSE","FnPFBjiVBP","lH1ktrhl0J","b29RJ64s8N","n1pmOzQt6Q",
+"dQ586G1RhS","cmXIX8U2nU","uvf7AjS1aj","k85AehE1Ql","HzZT8aFFss","b29RJD6rBy","FPfSE1LB1L","UmaEv9XyT9","QnJ1SWMiS3","64s8NTCgPp",
+"MojnPFPfSE","4dEz66q6L9","cShY2d7vjM","yvOMIMezSW","guMb8ReKEW","x3LDeuJScX","pT8wuzHF1q","2DREsb29RJ","oQ87rFPfSE","suY4xh1zcH",
+"3otm6In3NS","24ARFRACuj","Q6hMCMK07Y","BCxeCsx5Gl","8TxD7yluBx","MK07Yl83Ud","2hEEUOz8yZ","ZJTXHMaJQs","Nxx9VVLTy6","Mm8siJIqXi",
+"JXljW0h1b1","Mm8siWmadA","sqVrfpFrrl","nnP8ozY1GY","RpBQmcShY2","xciqp7ku1p","Mm8siYOfrY","FFDuibZLvS","uJScXv2eC3","0YAGHAXpwE",
+"gf8rIlweGy","Cp3mZi7WMQ","cL0aEUvlv4","580YDOUqFM","oVQp68hJdt","ix74rWaWsv","2DREsxXTI4","BGaQYlkMUA","HlUbFRkQke","he9IAjzUqR",
+"NhXduVBjhz","uPX7GpAhR1","Ss0ZuYOfrY","FxX9qzbIYY","Kr8ysydG8U","5nmWvZzJHW","MojnPd7vjM","HzZT8MK07Y","euZA5he9IA","FcWrWVNCPd",
+"RxrsmiKqhr","uTacxwDajX","W3VFHIRh48","lweGyYw2oU","v2eC3GSQwj","uvf7AxXTI4","pv0i7piJSk","hi5X7StlDJ","fcwDaQ6Lix","7fsYMTwano",
+"DcpWBO3iyQ","Gv3FqIKxdL","e6e4zNxx9V","zqH0W7lUXZ","OUqFMNhXdu","FnPFBQWxoT","nnP8oIjTwP","GSQwjK20wK","QbxXcKZamH","jS1ajWmadA",
+"48cHLMmKGJ","1LB1Lrhl0J","brhlQn1pmO","J2mQiuTacx","5VZjS7Ow5C","L7cGcFhtgl","suY4xYOfrY","bgJAzbgJAz","HlUbFpmeCd","2NslmlCMxy",
+"Ss0ZuyvOMI","qQxHPPOUYS","ThjNnqQxHP","Kr8ysEoToP","bgJAzDz1R3","pAhR1qQxHP","Fhtgl9XyT9","7fsYM7Ow5C","BCxeC29QAz","oQ87rCfgr3",
+"No0QbQChxs","lXFOBFxX9q","GrDg7BFkb8","qQxHPv8yFN","8cVD3dQ586","zqH0W0Kyfs","W3VFHMmKGJ","XyPZNdjsrv","qaofNQClRL","SjskQoVQp6",
+"lXFOBogLgc","lCMxyogLgc","cQOnvOz8yZ","fmIK1QChxs","VNCPdzbIYY","VLTy6WMiS3","soy9tjzUqR","zqH0WnFqik","FVMxoRBhp0","JRJQBJJs5m",
+"F6PT2s7Mxk","uJScXCdyBV","P6bcg2hEEU","nnP8os7Mxk","Oz8yZa00b5","LDk6fyToGW","7Ow5CCqqaD","IKxdLlH1kt","Chuy35iGN5","rhl0Jgf8rI",
+"ZUnqtReKEW","euZA51j5L8","aL6AJvOqCE","t98iWMmsIo","HzZT8okgRi","8RCUAHfyNQ","CIShGatef2","2NslmReKEW","0MR5XaDGtS","uupzkUl4a1",
+"ThjNnVIlwP","VBjhzwiHrZ","OUYuFiKqhr","QbxXcjSjS3","CqqaDyToGW","EOE1oRpBQm","s4786Cp3mZ","1v5hHv2eC3","zqH0WprNT6","5Drn0Qworu",
+"azIWpuLtKs","FwEJzMmsIo","Chuy3yvOMI","lm0pD6q6L9","PYBf4fqypy","EoToPfaHir","45cIHRkQke","Vprf24dEz6","OxWIH4QMc9","UmaEvK20wK",
+"i7WMQm4bxU","faHiry94nw","i3pydBCxeC","yToGWQWxoT","NAFuwCdyBV","ZUnqtW3VFH","Yh1hFGrDg7","No0QbfmIK1","8FmFHulk41","FVMxoCxVEf",
+"t98iWx3LDe","L7cGcCdyBV","t59lRjS1aj","jzUqRFNYIM","o8UydBFkb8","9eoRcGSQwj","sx5Gl8hJdt","Cp3mZYOfrY","AmdQdKr8ys","G1RhSix74r",
+"aDGtShSSvQ","S2DfuyofH3","Q6hMCsx5Gl","4W0Tlxciqp","0Wr5y7hyVv","FjHXRMmKGJ","O3iyQHfyNQ","Pb1payofH3","Q6hMC45cIH","Yh1hFpWiOs",
+"n8pJ9tAOsr","FnPFBm4bxU","lpF6WIn3NS","yluBxZzJHW","nFqikCp3mZ","0PktINAFuw","zqH0WNhXdu","AOgEeMezSW","Waim62hEEU","In3NS9rlg9",
+"Fhtglhe9IA","y94nwsqVrf","fcwDaM6qcG","qUJMdzFgtB","7hyVvF6PT2","C2IrcblLA9","Zv7z0hYBCK","MojnPFFDui","5Mg9rOUYuF","aez9ypiJSk",
+"ZUnqtdmoS7","i3pyduQIcz","uQIcz9XyT9","gf8rIix74r","hUTw7HP433","qaofNtaOXK","rKDLJpvgjS","fFDrJ1v5hH","yEfy9oQ87r","5drc6ogLgc",
+"JIqXi8cVD3","fqypy0MR5X","S2DfuFFDui","ciuWzpvgjS","1v5hHBGaQY","S77LHxXTI4","uAWypFPfSE","9y4lwXyPZN","euZA5uoStw","gtCA5O3iyQ",
+"gdQsS5Mg9r","rhl0Jv1Hln","v8yFNXflUq","aL6AJjfREu","3weIFPYBf4","Zv7z0Y1mC0","QWxoTydG8U","WPmlxpAhR1","0YAGHIKxdL","pT8wu0PktI",
+"ix74rVjCZq","n8pJ9zQt6Q","CNHmvaFFss","Ul4a1jzUqR","Y1mC029QAz","HfyNQJ2mQi","uQIczguMb8","JXljWlm0pD","tvdkDcShY2","JkzUnfaHir",
+"9rlg9wiHrZ","taOXKWreyP","7fKYUEOE1o","Vprf2FFDui","djsrvlkMUA","Yw2oU2Yz7E","BFkb829QAz","BGaQYZJTXH","RmDcrSs0Zu","2Nslmulk41",
+"5VZjSJIqXi","KZamHv8yFN","IjTwPG1RhS","x3LDeVIlwP","S2Dfu0h1b1","IRh48aez9y","RACujd7vjM","qQxHPmX2GE","B3qemuoStw","GSQwjTwano",
+"580YDpiJSk","cL0aEn8pJ9","D6rByPYBf4","7fsYMY1mC0","uLtKsazIWp","k85AeQWxoT","GXdoHhi5X7","TCgPppiJSk","Uvlv4FGzgp","FPfSEFwEJz",
+"16lHcS2Dfu","guMb816lHc","GXdoHOUqFM","jtn0X14FLR","VerEACp3mZ","TCgPps7Mxk","EdBKch1zcH","s4786WmadA","BCxeCn8pJ9","SmGzv8FmFH",
+"9rlg9MK07Y","zFgtB6q6L9","iKqhrsoy9t","soy9t4QMc9","e6e4zWDVWJ","D6rByGXdoH","9eoRcFxX9q","lXFOB0BmCy","Ss0ZuBbwgA","XflUqydG8U",
+"hE1QljeskS","2DREsWaWsv","VIlwPRBhp0","v1HlnlpF6W","tjQxsUlU3M","taOXKo8Uyd","Z4I1vQworu","hSSvQAmdQd","FGzgpjSjS3","iB08lBpYhV",
+"7X3uyFhtgl","rz7UtGrDg7","Q6hMCVjCZq","AkKTkO3iyQ","U3yw5ZuDtD","aL6AJzbIYY","rz7UtXflUq","ReKEW9y4lw","zQt6QMezSW","2DREsFnPFB",
+"DcpWBdQ586","ix74rAgJHQ","Q6Lix5IhmG","d85a9Yw2oU","k85Ae8FmFH","BGaQYbrhlQ","Y1mC0jS1aj","uvf7A618Di","zqH0WblLA9","oQ87rHzZT8",
+"MmKGJzmLYD","azIWps93Ml","MGlTFsuY4x","KZamHiKqhr","VjCZqIRh48","Yw2oUO3iyQ","5Mg9rVLTy6","DQimp0YAGH","FNYIMM3zXL","5drc6QbxXc",
+"AgJHQfFDrJ","fLNg8DG4sT","SmGzvuTacx","vOqCE4QMc9","StlDJyluBx","YjB9tjzUqR","S77LHzbIYY","7ku1pfqypy","pFrrlciuWz","IBe8kDLhzM",
+"Zv7z0Ss0Zu","J2mQiOxWIH","suY4xFcWrW","FVMxoZv7z0","SmGzvNxx9V","jSjS3VjCZq","yvOMICp3mZ","suY4xFhtgl","v1HlnFNYIM","48cHLFwEJz",
+"GSQwjgdQsS","lkMUAZUnqt","ydG8UlkMUA","zQt6QVIlwP","VLTy6SmGzv","aDGtSCdyBV","pWiOsDLhzM","9rlg9CqqaD","fLNg8C2Irc","fcJOyaL6AJ",
+"Waim6HP433","prNT6Uvlv4","jSjS3n1pmO","fFDrJJJs5m","Waim6t59lR","jSjS3dpe1v","FPfSEzz4ZU","0ao3lmX2GE","OUqFMGWqqX","dpe1vzHF1q",
+"GSQwj6AFT0","gIYvEd85a9","ZUnqtNxx9V","No0QbWMiS3","AXpwEhSSvQ","kB5nP7lUXZ","lCMxyF6PT2","DG4sTjiVBP","KsjRKbgJAz","AXpwEjSjS3",
+"9y4lwprNT6","BFkb8gIYvE","RpBQmksJby","qQxHPWmadA","8U2nUyluBx","zHF1qEOE1o","CIShGuN6r3","O3iyQS77LH","FnPFBpT8wu","kB5nP0MR5X",
+"6AFT0uTacx","Z4I1vciuWz","JKWYRKZamH","8cVD3ECMvU","OUYuFksJby","i7WMQNhXdu","D6rByatef2","ksJby5Mg9r","Uvlv4Z4I1v","lXFOBl83Ud",
+"JXljWcQOnv","9y4lwBpYhV","zz4ZU0Kyfs","n1pmODz1R3","JIqXi45cIH","6q6L9uAWyp","zHF1qVIlwP","Mkgy8hSSvQ","8xEKzTXQ0Z","64s8NnlaBy",
+"aez9yjfREu","cQOnvJIqXi","2Nslmfqypy","mX2GEGv3Fq","Oz8yZUlU3M","M3zXLUmaEv","QbxXc0PktI","uAWypFFDui","AOgEePb1pa","1v5hHNhXdu",
+"RzaZAi7WMQ","2ZHdkI7p2a","55rfBs7Mxk","1j5L8yEfy9","XyPZNYOfrY","WaWsvlj07Q","wiHrZDcpWB","ydG8U4QMc9","JKWYRWmadA","Kr8ysC2Irc",
+"DLhzMyToGW","1j5L8QbxXc","ciuWzs93Ml","yEfy9fmIK1","wiHrZrz7Ut","PYBf4HfyNQ","rz7Uti3pyd","0BmCyzbIYY","StlDJwiHrZ","5IhmGfqypy",
+"VIlwPYw2oU","s93MlokgRi","cmXIXCfgr3","n8pJ9ZuDtD","iwzGkaez9y","pAhR1bZLvS","uTacxjzUqR","aFFssrKDLJ","zz4ZUi3pyd","uZPqgYOfrY",
+"Yw2oU0YAGH","TwanoWPmlx","OHaBzYf2Ec","9iGoTuoStw","JRJQBn8pJ9","KZamHMm8si","rKDLJuZPqg","t59lRuPX7G","8FmFHO3iyQ","ix74rWPmlx",
+"SmGzvFwEJz","pWiOspiJSk","pT8wuoGu6x","Cp3mZM3zXL","aDGtSRBhp0","dmoS7HRxd8","gf8rIRkQke","AOgEe8U2nU","Mkgy8Chuy3","vLsmS5Mg9r",
+"d85a9D6rBy","zmLYDtl72W","aL6AJsuY4x","0ao3lksJby","45cIHJkzUn","BFkb80h1b1","lkMUAoQ87r","b29RJF6PT2","guMb8pmeCd","qUJMdWDVWJ",
+"ogLgc1LB1L","Q6Lixt59lR","fcJOy9rlg9","Ta8f6AgJHQ","Waim664s8N","yToGWdmoS7","jzUqRuQIcz","MK07YsqVrf","jfREujfREu","7fsYMy94nw",
+"FFDuiAmdQd","Ta8f6FVMxo","FjHXRtlILt","FjHXRKZamH","W3VFHU3yw5","he9IAOUqFM","AmdQdydG8U","zz4ZUQWxoT","BpYhVuLtKs","zqH0WHfyNQ",
+"Waim6SjskQ","jeskSIn3NS","NcICAuoStw","a00b56q6L9","jiVBPv2eC3","NhXduRBhp0","jzUqRv8yFN","0KyfsIjTwP","GSQwj8RCUA","Oz8yZEdBKc",
+"guMb8gf8rI","DLhzMcShY2","No0Qbtl72W","uvf7ACqqaD","6q6L9Waim6","atef2pmeCd","CdyBV5Namm","CdyBVsx5Gl","uN6r3WPmlx","7hyVvcmXIX",
+"uZPqgsqVrf","FNYIMAOgEe","FNYIM2Nslm","0YAGHzHF1q","FjHXR6AFT0","Cfgr37ku1p","MmKGJuupzk","vOqCEWreyP","cL0aE0PktI","5Drn0BbwgA",
+"8RCUAguMb8","WMiS3UlU3M","v1HlnMm8si","ulk410Wr5y","mz8gxy94nw","55rfBgf8rI","U3yw545cIH","8FmFH1j5L8","NcICA07n1c","4dEz65nmWv",
+"7fKYULewvM","Yh1hF9eoRc","AkKTk9iGoT","FcWrWK20wK","Mkgy8sqVrf","nnP8o8hJdt","S77LHFjHXR","lCMxyFxX9q","kZANmJKWYR","jzUqRNAFuw",
+"IBe8k7fsYM","RpBQmnFqik","dmoS716lHc","aDGtSJRJQB","TwanoK4GS8","0YAGHsoy9t","Kr8ysnnP8o","Dz1R38FmFH","5nmWvv2eC3","ReKEWuN6r3",
+"bZLvSDG4sT","jeskS4W0Tl","SWfouAIYUu","NcICAcmXIX","aDGtSfaHir","JKWYRYh1hF","AmdQdRBhp0","NAFuwkB5nP","O3iyQ0ao3l","IRh48gf8rI",
+"In3NSpvgjS","NcICAGWqqX","nFqikZzJHW","lViBvQWxoT","QYxC0pmeCd","LewvMIn3NS","taOXKDQimp","Ta8f68cVD3","OxWIHk85Ae","9rlg9OxWIH",
+"lj07Qs93Ml","9y4lw618Di","jzUqR6AFT0","RBhp0tuDyS","jSjS3Ss0Zu","zFgtByluBx","Kr8ysCxVEf","gIYvEoGu6x","Yw2oUtaOXK","uLtKsxReec",
+"HzZT8t59lR","xXTI40YAGH","iwzGkbgJAz","7hyVvpAhR1","uJScX7Ow5C","0h1b1M6qcG","YOfrYnlaBy","RmDcr0Wr5y","uAWypS2Dfu","iqv4k0Kyfs",
+"gjUTuyToGW","DLhzM2DREs","lkMUA6AFT0","vkCHH5IhmG","Zv7z0ulk41","8FmFH7hyVv","gtCA5D6rBy","0Kyfspv0i7","PYBf4e6e4z","FjHXRVprf2",
+"1v5hHMmKGJ","d85a9pmeCd","rhl0J2Nslm","AkKTkxXTI4","TXQ0ZW3VFH","pmeCdFhtgl","QYxC0FFDui","VjCZqOUqFM","24ARFqQxHP","BCxeCVLTy6",
+"sqVrf2ZHdk","K4GS8jfREu","soy9tNOHsz","IjTwPlH1kt","9XyT9piJSk","yluBxFNYIM","Cp3mZBFkb8","blLA9aDGtS","5IhmG3weIF","Kr8yso8Uyd",
+"JkzUnx3LDe","Kr8ysfcJOy","fcwDa0MR5X","0YAGH618Di","BpYhV48cHL","NcICAfLNg8","7hyVv5Namm","y94nw9rlg9","2hEEUrKDLJ","o8Uydatef2",
+"Mkgy8qQxHP","8xEKzCK5W7","xXTI4QYxC0","v1Hln618Di","VNCPdydG8U","Uvlv40Kyfs","i7WMQYw2oU","0BmCyFxX9q","4W0TlHRxd8","AkKTkGSQwj",
+"zY1GY16lHc","x3LDeb29RJ","2ZHdk2Nslm","zY1GYDz1R3","EOE1ojfREu","qaofN9y4lw","ogLgcFGzgp","SjskQZhwG1","Nxx9V5Drn0","d7vjMru4UG",
+"o8Uydt98iW","tjQxsGSQwj","7Ow5CogLgc","jzUqRRsQUq","IKxdLYw2oU","AIYUuoQ87r","BpYhVVNCPd","gdQsS8TxD7","UlU3MY1mC0","45cIHi3pyd",
+"fcwDayEfy9","rKDLJ0PktI","D6rByOUYuF","FnPFBlCMxy","ix74r14FLR","brhlQVerEA","Ta8f6XyPZN","zQt6QBpYhV","dQ586FxX9q","DcpWBP6bcg",
+"TwanoBbwgA","QYxC0b29RJ","Qworut98iW","8TxD70PktI","zY1GY8U2nU","2Yz7EWaWsv","lXFOByofH3","tAOsrJ2mQi","JXljW5ZaEz","BbwgANOHsz",
+"jeskSb29RJ","9XyT9In3NS","0BmCyru4UG","okgRiI7p2a","YOfrYAgJHQ","ulk41TXQ0Z","5nmWvNAFuw","G1RhSFNYIM","MojnPhSSvQ","1j5L8cQOnv",
+"cQOnv24ARF","TXQ0ZKsjRK","24ARFFNYIM","atef2ECMvU","WMiS3pmeCd","JkzUnSWfou","yEfy9dQ586","3weIFlCMxy","BCxeCDLhzM","mX2GEzY1GY",
+"6AFT0GWqqX","vOqCEOxWIH","9rlg9OUqFM","8U2nUcQOnv","1j5L8X6Pin","SWfouQWxoT","Cp3mZW7cTs","zqH0WNOHsz","Rxrsm8cVD3","45cIHDLhzM",
+"AXpwEQbxXc","iwzGkzmLYD","atef29XyT9","CdyBVlsQGo","IBe8kNo0Qb","vLsmSQChxs","ZUnqtCIShG","uZPqgd7vjM","ru4UGoVQp6","t98iWZzJHW",
+"lCMxy6AFT0","MaJQs5iGN5","tl72WI7p2a","qaofNlkMUA","W7cTs2TRI7","pvgjSokgRi","MGlTFhe9IA","POUYSNhXdu","UlU3MTCgPp","KZamHsoy9t",
+"8cVD3S2Dfu","xReecpv0i7","v8yFNLbRTH","HlUbFHlUbF","7X3uyJXljW","3otm6oVQp6","xReecd85a9","W3VFHVNCPd","Oz8yZ5nmWv","a00b5lj07Q",
+"Vprf2B3qem","BFkb8FcWrW","qQxHP0ao3l","ogLgcOz8yZ","BGaQYJkzUn","IBe8kwDajX","HRxd8K20wK","YOfrYlsQGo","kB5nPa00b5","Q6hMC8U2nU",
+"TCgPpazIWp","rz7Ut5nmWv","Uvlv4CdyBV","2DREsuJScX","2Yz7ECK5W7","OxWIHEdBKc","vkCHHdmoS7","Kr8ysFLsph","EOE1oAkKTk","Pb1paMojnP",
+"tvdkDRACuj","Oz8yZsuY4x","pAhR1bgJAz","kZANm9GXkX","pvgjSVprf2","yofH3C2Irc","ksJbyZzJHW","QClRLpiJSk","cmXIX580YD","uoStwIBe8k",
+"Rxrsmxciqp","SmGzvDQimp","qaofNv1Hln","9eoRchi5X7","JJs5maDGtS","Y1mC0FnPFB","tAOsrlsQGo","580YD0PktI","hYBCK8xEKz","1j5L8M6qcG",
+"9iGoTQworu","KASQ8bgJAz","Q6hMCNxx9V","9rlg9mX2GE","Gv3Fq0h1b1","9iGoToQ87r","HzZT8LDk6f","EoToPVjCZq","QWxoT07n1c","Z4I1v5Mg9r",
+"a00b58xEKz","Vprf2hYBCK","FGzgpTXQ0Z","aL6AJ8TxD7","Waim6FnPFB","YOfrY8U2nU","DG4sT8U2nU","VLTy6Z4I1v","3otm65IhmG","qQxHPUvlv4",
+"Yh1hFprNT6","wDajXYjB9t","pT8wumX2GE","24ARFcL0aE","ThjNn1v5hH","16lHcNhXdu","y94nwZhwG1","8hJdtS77LH","tvdkDI7p2a","oVQp6xReec",
+"5Mg9rLDk6f","8cVD3iqv4k","2ZHdkSmGzv","FNYIMvkCHH","zQt6Q5iGN5","GXdoHnnP8o","guMb8vkCHH","suY4xmX2GE","NhXduQClRL","MmsIouoStw",
+"16lHcOUqFM","JXljWG1RhS","AkKTkQnJ1S","pvgjSbrhlQ","P6bcgfFDrJ","Cfgr3Vprf2","Ta8f6UmaEv","zqH0WEOE1o","JJs5mYf2Ec","n1pmOSbRYy",
+"2hEEUWPmlx","pWiOsRzaZA","U3yw5jeskS","JJs5mZhwG1","rKDLJ9eoRc","POUYSlj07Q","FxX9q0h1b1","CIShGY1mC0","tvdkD29QAz","FjHXRMmsIo",
+"8TxD7ni2v1","14FLRW7cTs","d7vjMUl4a1","mz8gxksJby","45cIHgf8rI","MaJQszHF1q","S2Dfu5ZaEz","uQIczBGaQY","sx5Gl9rlg9","5Mg9rUvlv4",
+"9y4lwNxx9V","qQxHPLDk6f","WMiS3F6PT2","Q6hMCuvf7A","FLsphYOfrY","tjQxscShY2","KsjRKZ4I1v","lpF6WsqVrf","pFrrlFLsph","0h1b1AOgEe",
+"hSSvQUvlv4","WreyP55rfB","azIWpyvOMI","iB08lvLsmS","VBjhzJRJQB","hE1QlaDGtS","fqypyK4GS8","gtCA5J2mQi","QWxoTpiJSk","dhSuHulk41",
+"BCxeCaDGtS","OUYuFOHaBz","QnJ1S8RCUA","O3iyQpiJSk","OUYuFX6Pin","VerEAYh1hF","O3iyQlCMxy","iB08lZUnqt","NcICAK4GS8","GXdoHru4UG",
+"WaWsvzbIYY","Zv7z0FGzgp","TXQ0ZOxWIH","kB5nPCp3mZ","pAhR1J2mQi","sx5Gl14FLR","gjUTuKsjRK","WDVWJNOHsz","RACujHfyNQ","Mkgy8dQ586",
+"QYxC0tuDyS","dhSuHDLhzM","GWqqXcmXIX","NcICA7fKYU","7Ow5C6AFT0","KASQ8LbRTH","RxrsmThjNn","9rlg964s8N","S2Dfu7lUXZ","8FmFHoVQp6",
+"jSjS3QnJ1S","lCMxyMkgy8","L7cGcOUYuF","WPmlx7X3uy","WreyPbZLvS","5iGN5GWqqX","JkzUnGrDg7","FFDuiGv3Fq","nnP8oxXTI4","yvOMIMmsIo",
+"prNT6MGlTF","sx5GlZUnqt","M6qcGQChxs","JJs5ma00b5","ZuDtD0Kyfs","rz7Ut2Yz7E","GSQwjLewvM","lsQGotuDyS","kZANm4dEz6","7hyVvbrhlQ",
+"tuDyS6q6L9","CxVEfhe9IA","8RCUAOHaBz","YOfrY29QAz","MezSWMGlTF","tl72WS77LH","RACujQ6hMC","MmKGJ1v5hH","jtn0X7hyVv","D6rBytaOXK",
+"48cHL8cVD3","Cfgr3X6Pin","Oz8yZF6PT2","ni2v1K20wK","Y1mC0JKWYR","Mkgy8l83Ud","cL0aETwano","MmKGJvLsmS","nFqiklm0pD","oVQp6Yw2oU",
+"hi5X7RkQke","DG4sTaDGtS","AgJHQXyPZN","zmLYDxReec","d85a9atef2","fFDrJ0BmCy","l83Udiqv4k","2DREsi7WMQ","n8pJ9NcICA","RmDcrFVMxo",
+"In3NScQOnv","AgJHQuoStw","AXpwEG1RhS","brhlQTXQ0Z","tuDySKr8ys","WDVWJpWiOs","uupzkgtCA5","yEfy9hi5X7","qaofNChuy3","QnJ1SpWiOs",
+"6q6L9mz8gx","piJSkUvlv4","SbRYySs0Zu","zz4ZUuTacx","IKxdL8FmFH","K20wK7fsYM","W3VFHhSSvQ","B3qemksJby","BpYhVh1zcH","x3LDel83Ud",
+"CdyBVZJTXH","9iGoT5nmWv","nFqikAXpwE","FGzgpa00b5","I7p2apv0i7","2NslmzqH0W","MmKGJRsQUq","AIYUurz7Ut","s93MlazIWp","Y1mC0C2Irc",
+"ZJTXHpvgjS","AXpwEuPX7G","RxrsmWmadA","7lUXZnnP8o","0KyfsuPX7G","6AFT0FcWrW","7X3uyFcWrW","7fKYUNcICA","qUJMdDLhzM","FNYIMni2v1",
+"dmoS7M6qcG","7fsYMQssNC","zqH0WMkgy8","C2IrcPYBf4","7Ow5CBGaQY","Qworu0h1b1","KASQ8tAOsr","fcwDaSmGzv","AIYUut59lR","AkKTk5VZjS",
+"pvgjSmX2GE","cmXIXL7cGc","LbRTHCIShG","KsjRKjtn0X","taOXKK4GS8","NAFuwhSSvQ","lXFOBhe9IA","OHaBzXflUq","Vprf2rKDLJ","I7p2aMmsIo",
+"Gv3Fqtl72W","Kr8ysHfyNQ","FhtgllkMUA","okgRin8pJ9","JRJQBIn3NS","LbRTHbrhlQ","dQ586lCMxy","SjskQh1zcH","I7p2aJRJQB","AIYUuOHaBz",
+"RkQkedQ586","tl72WCIShG","lViBvNo0Qb","lpF6WThjNn","uAWypaDGtS","uN6r3ogLgc","EdBKczFgtB","KASQ8qQxHP","QClRLjSjS3","Dz1R3O3iyQ",
+"IRh48Yf2Ec","nnP8ohe9IA","9iGoTuZPqg","vOqCEFxX9q","7X3uyZv7z0","QWxoT9y4lw","OUqFMEOE1o","dmoS7uJScX","tAOsrAOgEe","lkMUAKZamH",
+"uJScXy94nw","VjCZqCp3mZ","lH1ktYh1hF","Gv3FqX6Pin","S2DfuMGlTF","lXFOBjeskS","7fsYMpmeCd","S77LH4dEz6","TXQ0Z9eoRc","hE1QlrKDLJ",
+"RkQkehUTw7","MojnPTwano","uupzkCNHmv","dpe1vZv7z0","lCMxyiB08l","uPX7GzmLYD","nFqikxciqp","QssNC5drc6","iB08lcQOnv","uQIcz1j5L8",
+"pv0i7i7WMQ","FVMxoGrDg7","FNYIM0Kyfs","taOXKjfREu","P6bcg0h1b1","n8pJ9Kr8ys","SmGzv16lHc","M3zXLvOqCE","5iGN548cHL","QYxC0tlILt",
+"lweGyFNYIM","RBhp0JRJQB","dQ586suY4x","gtCA548cHL","BCxeCPOUYS","aDGtSPYBf4","uvf7Ao8Uyd","cL0aEyvOMI","48cHLRACuj","dhSuHThjNn",
+"vOqCEaFFss","M3zXLK4GS8","AOgEezQt6Q","8TxD7Zv7z0","8xEKzlH1kt","d7vjMhe9IA","prNT6AmdQd","IKxdLxXTI4","7fsYMRxrsm","mX2GECfgr3",
+"HzZT8GSQwj","5drc6wiHrZ","blLA9aL6AJ","HlUbFL7cGc","gf8rIOHaBz","Waim6yEfy9","MmsIoIBe8k","14FLRnFqik","XyPZNO3iyQ","v8yFNDG4sT",
+"uvf7Ah1zcH","b29RJ29QAz","I7p2aQ6Lix","5IhmG5Namm","a00b5yToGW","he9IAfaHir","WaWsvm4bxU","uQIczQssNC","FFDuiBpYhV","Q6hMCiwzGk",
+"uN6r34QMc9","gjUTuWaim6","xciqprz7Ut","fmIK1lsQGo","azIWpd85a9","4W0TltjQxs","aDGtS8hJdt","16lHcVerEA","dhSuHZJTXH","uQIcz45cIH",
+"n1pmONOHsz","djsrvi3pyd","UmaEvfLNg8","GXdoHB3qem","vkCHHprNT6","xXTI4zFgtB","MGlTFnlaBy","8cVD3FwEJz","0BmCyYh1hF","NAFuwrz7Ut",
+"piJSkyofH3","AkKTkJKWYR","pFrrljfREu","8FmFHOz8yZ","Ul4a1Cfgr3","2NslmKASQ8","JkzUn9GXkX","5IhmGyluBx","QWxoTCfgr3","OHaBzC2Irc",
+"LewvMFxX9q","OxWIHBGaQY","a00b5oQ87r","gtCA5Mkgy8","iKqhrFnPFB","QWxoTQYxC0","FVMxo4dEz6","RBhp0pAhR1","e6e4zZv7z0","kB5nPulk41",
+"JIqXiJkzUn","NOHszJIqXi","FwEJzlH1kt","ZhwG1s4786","3otm6wDajX","DcpWBAkKTk","VerEAYw2oU","tvdkDStlDJ","TCgPpKsjRK","qQxHPfcwDa",
+"AIYUujeskS","tl72W29QAz","jiVBPprNT6","Ss0ZuOHaBz","7fsYMVBjhz","Uvlv4m4bxU","0PktIaez9y","FFDuid85a9","LDk6fAmdQd","cQOnvCdyBV",
+"yofH3fFDrJ","yofH3Yh1hF","XflUqmX2GE","WMiS3LbRTH","WreyPuvf7A","AOgEeQ6hMC","FcWrWd7vjM","9XyT9ReKEW","YjB9tuvf7A","wiHrZS2Dfu",
+"fLNg8blLA9","8TxD755rfB","nlaByprNT6","RzaZApiJSk","45cIHv1Hln","t59lRtlILt","s4786fcwDa","StlDJlkMUA","AOgEeU3yw5","wiHrZazIWp",
+"EOE1o5Mg9r","0YAGHM6qcG","WreyPkZANm","QChxs0ao3l","AXpwEIjTwP","n8pJ9OUYuF","5NammQworu","FxX9qUvlv4","Yf2EcfcwDa","prNT6SbRYy",
+"UmaEvSmGzv","ThjNn24ARF","0ao3lni2v1","iwzGkIjTwP","Ul4a1a00b5","C2IrcFcWrW","9XyT9UmaEv","lXFOBKASQ8","RmDcr45cIH","GXdoHS2Dfu",
+"jS1ajIRh48","EOE1om4bxU","wiHrZTCgPp","s93MlDQimp","8cVD3AmdQd","cQOnvwDajX","jzUqRa00b5","hSSvQIn3NS","Mm8sisx5Gl","FPfSEWmadA",
+"rKDLJ14FLR","lsQGoX6Pin","azIWpt59lR","Cp3mZpiJSk","W7cTs7fKYU","14FLRDcpWB","XflUqX6Pin","2hEEUJXljW","AgJHQPYBf4","5IhmGkB5nP",
+"K20wKlpF6W","8hJdtjiVBP","0ao3lZzJHW","SWfouYf2Ec","FnPFBmX2GE","WDVWJ5drc6","QworuyvOMI","8RCUA5Namm","Yh1hF5Namm","WMiS3WMiS3",
+"QnJ1StvdkD","7Ow5CKr8ys","WPmlxDz1R3","K20wK4QMc9","EOE1oazIWp","45cIH7X3uy","hUTw7xReec","RmDcrS2Dfu","AIYUu0BmCy","lXFOB8U2nU",
+"CqqaDulk41","t98iWhE1Ql","IKxdL7Ow5C","W7cTsCdyBV","HP4334QMc9","7Ow5CSmGzv","EoToP2DREs","Chuy3ulk41","prNT6dQ586","FnPFBZhwG1",
+"tvdkDQssNC","zz4ZUFGzgp","2TRI7QssNC","HP433lCMxy","IRh48pmeCd","Pb1paqaofN","618DibgJAz","FFDuiWreyP","iwzGk7fsYM","EOE1ouAWyp",
+"pT8wudpe1v","uJScXt98iW","Twano0ao3l","0ao3l2DREs","FVMxo9eoRc","KZamHgIYvE","nnP8o9GXkX","POUYSgdQsS","Pb1pazFgtB","QnJ1SZzJHW",
+"i3pydDQimp","IKxdLpAhR1","Q6hMC1v5hH","5nmWvnFqik","LewvMd7vjM","5iGN5VerEA","MaJQsiKqhr","lViBvru4UG","Pb1paokgRi","7ku1pFjHXR",
+"GrDg7CNHmv","uQIczUvlv4","n8pJ9JKWYR","8RCUAlpF6W","0Wr5yJKWYR","7hyVv4W0Tl","Y1mC00Kyfs","QWxoTX6Pin","euZA5ZUnqt","RzaZAsuY4x",
+"gf8rI1j5L8","jeskSPb1pa","nnP8ov2eC3","MmsIopWiOs","9iGoTs4786","tAOsrlCMxy","9rlg9Z4I1v","9rlg9jS1aj","Vprf2WDVWJ","5ZaEzMm8si",
+"X6Pin45cIH","uPX7GVLTy6","ZuDtDuvf7A","djsrvprNT6","nlaByJIqXi","wiHrZHzZT8","lViBvUvlv4","Oz8yZZJTXH","hi5X75IhmG","B3qemKASQ8",
+"4QMc9pmeCd","d85a9oQ87r","dpe1vU3yw5","POUYS5IhmG","x3LDetaOXK","pFrrl5VZjS","WMiS3k85Ae","8RCUAYOfrY","pWiOsZJTXH","VLTy6fFDrJ",
+"VjCZqsqVrf","Kr8ysksJby","okgRiQ6hMC","uZPqgFVMxo","U3yw52DREs","Chuy3uQIcz","zqH0W24ARF","VerEAxXTI4","M3zXLSWfou","7Ow5CChuy3",
+"D6rByKASQ8","QssNCFjHXR","9rlg9Kr8ys","euZA5suY4x","D6rByW3VFH","5drc6Q6hMC","nlaBydmoS7","C2IrcRkQke","lXFOBx3LDe","qUJMdS77LH",
+"S2DfuxXTI4","taOXKReKEW","VBjhz7fsYM","KASQ8Qworu","tAOsrFxX9q","i7WMQzQt6Q","ogLgcGrDg7","C2IrcUvlv4","UlU3M24ARF","MK07Yni2v1",
+"9eoRc0Kyfs","BbwgA4QMc9","FwEJzPYBf4","okgRiD6rBy","uupzkS77LH","fFDrJUl4a1","BGaQYMm8si","0ao3luN6r3","nFqikoVQp6","oGu6x1LB1L",
+"2hEEUBpYhV","0Kyfsn1pmO","Q6hMCiB08l","8xEKzM6qcG","Ss0ZuGWqqX","BGaQYD6rBy","Mm8siqUJMd","GXdoHix74r","cmXIX1v5hH","prNT6CdyBV",
+"5Drn0Yh1hF","NOHszPYBf4","dpe1vuLtKs","WPmlxWreyP","VerEApv0i7","6AFT0Pb1pa","zbIYYJ2mQi","HRxd8FPfSE","C2IrcI7p2a","ZhwG1d85a9",
+"zqH0WuN6r3","Gv3FqDLhzM","HlUbFBpYhV","tAOsr45cIH","48cHLTa8f6","3otm6azIWp","FxX9qQChxs","sqVrfFwEJz","U3yw52TRI7","t98iWhe9IA",
+"CxVEfuLtKs","aL6AJgtCA5","CK5W745cIH","2ZHdkgf8rI","b29RJuZPqg","s7MxkKZamH","rKDLJ5drc6","VBjhzQWxoT","mz8gx9GXkX","brhlQSbRYy",
+"s4786IRh48","DG4sTI7p2a","i3pydxReec","nlaBygdQsS","OUYuFgtCA5","iB08lzFgtB","yofH3lj07Q","uJScXaL6AJ","OUqFM5nmWv","ZUnqtF6PT2",
+"brhlQFGzgp","ReKEWJXljW","suY4xG1RhS","piJSkfcwDa","3weIFv8yFN","MK07YTXQ0Z","8FmFHRACuj","mX2GExXTI4","FcWrWPb1pa","YOfrY5IhmG",
+"24ARFLDk6f","uJScXlCMxy","zFgtBKsjRK","K20wKBFkb8","Z4I1vb29RJ","FwEJzQnJ1S","FcWrWru4UG","3otm6KsjRK","MGlTFZhwG1","9y4lwaez9y",
+"xciqpm4bxU","JIqXiix74r","aFFssRpBQm","djsrvjzUqR","faHirt98iW","oQ87rrKDLJ","RsQUqM6qcG","OUYuFAkKTk","Waim6Mm8si","hi5X7nnP8o",
+"YjB9tD6rBy","Dz1R3ciuWz","FLsph0ao3l","uupzkReKEW","QworulsQGo","9y4lwjS1aj","POUYSUvlv4","oVQp655rfB","QnJ1S5Mg9r","J2mQiHfyNQ",
+"7fKYUa00b5","16lHci7WMQ","7hyVvTCgPp","0Wr5ya00b5","RkQkek85Ae","9iGoTSs0Zu","8TxD7uZPqg","Pb1pa8U2nU","Yh1hFWmadA","P6bcgIBe8k",
+"GWqqXMezSW","TCgPpReKEW","7Ow5Cdjsrv","CxVEfqQxHP","ZJTXHRzaZA","iqv4k7ku1p","OUqFMRkQke","FVMxoMm8si","tvdkDIBe8k","4W0TlRpBQm",
+"GXdoHuTacx","zmLYD4W0Tl","d7vjM8FmFH","RkQke5iGN5","qUJMdQbxXc","iqv4kRACuj","gIYvEY1mC0","FLsphpv0i7","ulk41SbRYy","U3yw5lCMxy",
+"gtCA5KsjRK","uupzkM6qcG","d85a9gf8rI","8U2nUPb1pa","9rlg9lj07Q","he9IAuvf7A","MmsIoQ6Lix","m4bxUo8Uyd","HlUbFoVQp6","QChxsYh1hF",
+"ni2v1F6PT2","guMb8he9IA","QbxXcxciqp","yEfy9GXdoH","MaJQst59lR","YOfrYyluBx","Z4I1vYOfrY","FnPFBzFgtB","MGlTFRmDcr","4dEz6jS1aj",
+"AgJHQS77LH","oVQp68RCUA","ReKEWMaJQs","sqVrfTwano","SWfouiKqhr","HfyNQMaJQs","soy9t9eoRc","G1RhSU3yw5","DcpWBx3LDe","Yf2EcSjskQ",
+"FGzgpaFFss","v8yFNd85a9","J2mQiWreyP","In3NSqQxHP","mz8gxQWxoT","mX2GEgdQsS","UmaEvMK07Y","jtn0XEOE1o","Mkgy8i3pyd","vkCHHdhSuH",
+"bZLvSJ2mQi","v1HlnWaWsv","ulk41AOgEe","UmaEve6e4z","tl72WG1RhS","Yw2oUk85Ae","Mm8siqQxHP","n8pJ9YjB9t","iB08l45cIH","FjHXRP6bcg",
+"2TRI74W0Tl","uvf7A5drc6","sx5Gl7X3uy","I7p2aSWfou","hUTw7VIlwP","yvOMIIKxdL","7X3uyECMvU","In3NSs93Ml","uTacxZzJHW","VIlwPNcICA",
+"Mkgy8HRxd8","In3NSprNT6","uPX7G580YD","Twano0Kyfs","DQimp5drc6","uQIczTwano","xXTI4LbRTH","QChxs0PktI","QbxXcdmoS7","RBhp0Cp3mZ",
+"14FLRn1pmO","hYBCKMkgy8","i7WMQ6AFT0","FPfSEHfyNQ","zmLYDuoStw","zqH0Wt59lR","o8UydTXQ0Z","OxWIHh1zcH","uoStwSbRYy","tl72WY1mC0",
+"55rfBnnP8o","TCgPpBFkb8","e6e4zBbwgA","pFrrlkZANm","azIWp9rlg9","Yw2oUnnP8o","Kr8yspWiOs","0YAGHfaHir","djsrvMezSW","9rlg9YOfrY",
+"FPfSE7fKYU","JKWYR6q6L9","Ul4a1nlaBy","fqypyTCgPp","16lHcBFkb8","gtCA5NOHsz","jtn0XprNT6","aez9yv1Hln","618DipT8wu","64s8NnFqik",
+"5nmWvSs0Zu","VBjhzFjHXR","djsrvYjB9t","pmeCdGWqqX","Twanofqypy","k85AelpF6W","BGaQY5Namm","cShY2Q6hMC","jSjS3jeskS","ZUnqt64s8N",
+"faHirWMiS3","O3iyQMGlTF","uN6r3faHir","yEfy9NAFuw","iwzGkxXTI4","64s8NGWqqX","AgJHQWreyP","Yh1hF618Di","L7cGcGv3Fq","MaJQsRzaZA",
+"4dEz6lsQGo","GXdoHWaim6","9iGoTIn3NS","QbxXcyEfy9","BFkb85drc6","djsrvgf8rI","WmadAVIlwP","FwEJzoQ87r","3weIFNcICA","8FmFHCdyBV",
+"F6PT2t59lR","5NammNo0Qb","0BmCyuPX7G","9eoRcQ6hMC","uvf7AZhwG1","OUYuFHP433","6AFT0tAOsr","Mkgy8TXQ0Z","NOHsz0MR5X","ZUnqtCNHmv",
+"5Mg9rVjCZq","ni2v1fcwDa","dhSuHoVQp6","qUJMdVerEA","uLtKsjzUqR","LbRTHThjNn","JkzUnMmKGJ","NAFuwaDGtS","pmeCdWPmlx","uPX7GJkzUn",
+"blLA9cmXIX","MojnP0Kyfs","JXljW7fKYU","48cHLfLNg8","Chuy3uN6r3","y94nwYw2oU","7fsYMJ2mQi","ECMvUfaHir","lViBvFwEJz","hi5X7y94nw",
+"xXTI4iwzGk","8cVD3t59lR","64s8NqUJMd","vOqCElH1kt","lXFOBFnPFB","Oz8yZ7lUXZ","0KyfsLDk6f","1v5hHMm8si","ZzJHWdmoS7","2DREsMaJQs",
+"UlU3Ms93Ml","Kr8ys6AFT0","U3yw5AmdQd","5nmWvRBhp0","zY1GY4dEz6","jS1ajVIlwP","CxVEfnnP8o","Uvlv4ulk41","tAOsrtAOsr","ReKEWAkKTk",
+"lH1ktlm0pD","8RCUArKDLJ","a00b57hyVv","3otm6zHF1q","lweGyTXQ0Z","k85AeTwano","Kr8ysSWfou","29QAzP6bcg","JKWYRiqv4k","hi5X7AkKTk",
+"JJs5mhSSvQ","s7MxklH1kt","tlILtReKEW","mX2GEJIqXi","9GXkXK4GS8","brhlQ9GXkX","7hyVvMmKGJ","JJs5mCfgr3","Waim6pv0i7","ydG8UZJTXH",
+"atef2JXljW","VNCPd8RCUA","K4GS8NhXdu","gIYvEyToGW","0ao3l4W0Tl","jiVBPcShY2","dhSuHcQOnv","YOfrYVLTy6","he9IA14FLR","rhl0J580YD",
+"8RCUAWmadA","L7cGcv8yFN","BpYhVTCgPp","MmsIo5VZjS","HfyNQNcICA","AIYUuNxx9V","pFrrlTCgPp","e6e4zTCgPp","QClRLeuZA5","CdyBVX6Pin",
+"pWiOswDajX","RsQUqVerEA","b29RJSjskQ","uN6r3RsQUq","VNCPdXflUq","gIYvEUmaEv","VNCPdfcwDa","nFqik07n1c","5IhmGBGaQY","BCxeCYOfrY",
+"dmoS7DQimp","Mm8sipT8wu","zQt6Q8hJdt","7fKYUDz1R3","TCgPp8TxD7","S2DfuF6PT2","0KyfshSSvQ","0YAGHtjQxs","aDGtSguMb8","oGu6xiwzGk",
+"AmdQdDLhzM","Y1mC01v5hH","vkCHHzY1GY","lXFOBThjNn","ZzJHWgf8rI","cQOnvFGzgp","FVMxodmoS7","DLhzMOHaBz","k85AefmIK1","ZuDtDQ6Lix",
+"zqH0WNAFuw","JIqXi0PktI","s7Mxkuvf7A","0KyfsjeskS","CqqaDWaWsv","iKqhrC2Irc","yEfy9Q6hMC","cQOnvksJby","Ss0Zu618Di","1j5L8b29RJ",
+"MaJQsEdBKc","29QAzydG8U","DLhzMSs0Zu","IKxdLlViBv","AgJHQxReec","fcwDaAkKTk","P6bcgGSQwj","uZPqgMaJQs","9y4lwZzJHW","nlaBypv0i7",
+"nlaByx3LDe","gtCA564s8N","No0QbP6bcg","NhXduGv3Fq","EoToPtjQxs","CqqaDQWxoT","CIShGNo0Qb","s7MxkWaWsv","pv0i7ix74r","uvf7Ad85a9",
+"pAhR1lCMxy","K4GS8cShY2","CqqaDaFFss","6AFT0RzaZA","Cfgr38U2nU","okgRi2Yz7E","6AFT0lXFOB","gIYvErz7Ut","QWxoTuQIcz","pT8wuStlDJ",
+"Pb1paKsjRK","DQimpUlU3M","EoToPB3qem","Pb1paMGlTF","lj07QfmIK1","jzUqRrhl0J","BCxeCokgRi","0YAGHCdyBV","No0QbBbwgA","b29RJhi5X7",
+"suY4xCIShG","OHaBzMojnP","S77LHCK5W7","K4GS8GrDg7","VjCZqkB5nP","vOqCEJRJQB","9iGoTgtCA5","OHaBzW3VFH","lsQGoBFkb8","2TRI77fsYM",
+"RpBQmIBe8k","RxrsmFcWrW","fqypyEoToP","DQimpZUnqt","UlU3Mn8pJ9","8hJdtx3LDe","I7p2as7Mxk","tl72WjeskS","BCxeCJXljW","MGlTFZUnqt",
+"jeskS2hEEU","jeskSGrDg7","jeskSVerEA","Cp3mZ0BmCy","In3NSs4786","RzaZApv0i7","OxWIHgf8rI","yvOMIcL0aE","L7cGcv1Hln","PYBf4KZamH",
+"MezSWpAhR1","qUJMdLbRTH","uAWyp580YD","hSSvQ6q6L9","gtCA5WmadA","6AFT0uQIcz","KZamHa00b5","dmoS7nnP8o","AmdQdkZANm","O3iyQlweGy",
+"QnJ1Six74r","ydG8Uv2eC3","FPfSEFnPFB","RmDcrEOE1o","VNCPd9rlg9","v1HlnUvlv4","GWqqXTXQ0Z","J2mQiLbRTH","Mkgy8XflUq","2TRI7pv0i7",
+"qUJMdNo0Qb","lkMUAGWqqX","VerEAO3iyQ","9GXkXVIlwP","gf8rIrhl0J","QssNCdmoS7","5drc6WmadA","VerEAMaJQs","azIWpix74r","BCxeCMojnP",
+"Ss0ZupFrrl","Uvlv4Q6Lix","gf8rIHfyNQ","WMiS3DG4sT","CxVEfhYBCK","guMb8nnP8o","6q6L9FxX9q","HzZT8SbRYy","gdQsSa00b5","QChxsyEfy9",
+"JIqXijSjS3","7ku1pjtn0X","WMiS3NcICA","QClRLru4UG","m4bxUAgJHQ","wiHrZXflUq","hE1Qls4786","rKDLJL7cGc","brhlQiKqhr","kZANm9XyT9",
+"s7MxkBFkb8","JkzUntl72W","n8pJ9uZPqg","zbIYY29QAz","AOgEefFDrJ","hUTw7sqVrf","HlUbFdmoS7","9rlg9yToGW","8RCUAfaHir","WaWsv7lUXZ",
+"djsrvCqqaD","nFqikXyPZN","YjB9t5drc6","55rfBTXQ0Z","MmKGJFGzgp","mX2GEMkgy8","pT8wuQbxXc","lj07QyofH3","djsrv5Mg9r","3otm6I7p2a",
+"Dz1R3FLsph","CdyBVJ2mQi","9GXkXdhSuH","tAOsr4dEz6","Kr8ysMkgy8","BGaQYNxx9V","rhl0Jd7vjM","rKDLJ4QMc9","Y1mC0YOfrY","RmDcrRACuj",
+"uAWyp14FLR","EOE1oSmGzv","WaWsve6e4z","zQt6QFPfSE","RACujJRJQB","AkKTkF6PT2","Y1mC0cmXIX","7ku1p9XyT9","CdyBVmz8gx","nFqikWmadA",
+"9y4lwFnPFB","soy9tiKqhr","aez9ylkMUA","lweGyEoToP","o8Uyd5Mg9r","DcpWBZ4I1v","SWfouogLgc","B3qemYw2oU","s7MxkbgJAz","HP433F6PT2",
+"ZhwG1lj07Q","gtCA5ReKEW","blLA9atef2","aFFssM6qcG","yEfy9HfyNQ","fcJOyFLsph","JXljWyvOMI","mX2GEgjUTu","xReecCdyBV","6AFT0qaofN",
+"BCxeCbZLvS","yEfy97ku1p","ni2v1v8yFN","oVQp6580YD","Zv7z0jSjS3","XflUqAIYUu","rKDLJhi5X7","C2IrcjS1aj","B3qemGWqqX","QWxoT7fsYM",
+"FVMxozHF1q","64s8NBGaQY","k85AeS77LH","fFDrJ0PktI","3otm6y94nw","yluBxlXFOB","5Mg9rjiVBP","piJSk7X3uy","XyPZNgjUTu","Rxrsm07n1c",
+"ogLgcK4GS8","AXpwEGSQwj","MGlTF5VZjS","jfREuJkzUn","MK07YMK07Y","v2eC3kB5nP","QYxC0brhlQ","VNCPdDz1R3","24ARFAkKTk","he9IAyEfy9",
+"ReKEWxReec","y94nw2hEEU","zHF1qkZANm","xReecDLhzM","xciqpyofH3","IKxdLPb1pa","7hyVvfcJOy","xReecvLsmS","YOfrYhi5X7","QClRLMkgy8",
+"Pb1pa1v5hH","ogLgcFnPFB","sqVrfMmsIo","7Ow5CSWfou","WDVWJEoToP","Y1mC0CNHmv","rz7UtjzUqR","BGaQYNcICA","4W0TlZUnqt","gjUTutaOXK",
+"WmadAnFqik","D6rByTXQ0Z","CdyBVhUTw7","SWfoutjQxs","uQIczv8yFN","0Wr5y7fKYU","RpBQmtaOXK","LewvMZv7z0","W7cTs7X3uy","P6bcgbZLvS",
+"Z4I1vGrDg7","KZamHqUJMd","iqv4kfcJOy","Nxx9VblLA9","taOXK5Drn0","UmaEvGrDg7","7fsYMXflUq","t59lR9rlg9","JKWYR2ZHdk","VerEASs0Zu",
+"Chuy3D6rBy","tvdkDh1zcH","BpYhVs7Mxk","DLhzMnlaBy","M6qcGWDVWJ","m4bxU55rfB","uQIczYjB9t","KZamH7hyVv","2DREs07n1c","6q6L98xEKz",
+"FLsphCK5W7","QnJ1SkB5nP","ogLgc7hyVv","zFgtB8hJdt","pWiOsatef2","AkKTk48cHL","dQ586qUJMd","DLhzMfmIK1","QnJ1Sv2eC3","ogLgcGSQwj",
+"7hyVvHzZT8","Ss0Zu4dEz6","IjTwPQssNC","AkKTkYf2Ec","mz8gxNo0Qb","qaofNHfyNQ","StlDJ9rlg9","ix74rVprf2","2DREs8hJdt","m4bxUd85a9",
+"rKDLJFwEJz","14FLRAkKTk","IKxdLSWfou","PYBf4t98iW","VerEA55rfB","5ZaEzk85Ae","tvdkDSjskQ","iKqhr55rfB","8hJdtUvlv4","TCgPpL7cGc",
+"xciqpkZANm","nlaByiqv4k","CIShGHRxd8","GSQwjfqypy","kB5nPFFDui","LDk6fFnPFB","HfyNQ0Kyfs","QWxoT5Namm","GrDg7VBjhz","8TxD78U2nU",
+"J2mQi5nmWv","uvf7AUl4a1","07n1cVBjhz","piJSkm4bxU","FNYIMCqqaD","CK5W7taOXK","FwEJzXyPZN","AXpwEEdBKc","MGlTFXflUq","HfyNQChuy3",
+"CNHmvd7vjM","hUTw7FxX9q","AIYUu5VZjS","he9IAuPX7G","WDVWJQWxoT","55rfBSWfou","Q6LixpFrrl","KsjRKNAFuw","lm0pD1v5hH","aFFssoVQp6",
+"HzZT8vOqCE","ciuWz618Di","AXpwElH1kt","Cfgr3CNHmv","iwzGkDQimp","XflUqRkQke","sqVrfFLsph","4dEz6qQxHP","k85AeciuWz","Cfgr3uTacx",
+"DQimp8FmFH","EoToPQClRL","rhl0Jjtn0X","h1zcHNxx9V","SmGzvNhXdu","y94nwru4UG","EOE1oUl4a1","5Mg9rbgJAz","gjUTukB5nP","29QAzZzJHW",
+"9GXkXlH1kt","yEfy9qUJMd","FFDuiKASQ8","dhSuH0MR5X","iKqhrFjHXR","CxVEfMmKGJ","FGzgpHlUbF","bZLvS7ku1p","GrDg78U2nU","gjUTus93Ml",
+"8FmFH3weIF","6q6L9HfyNQ","i7WMQ5iGN5","Mkgy8SjskQ","uupzkoGu6x","wDajXL7cGc","2TRI78TxD7","Ta8f6BFkb8","NhXduiqv4k","In3NStAOsr",
+"0Wr5yrz7Ut","FnPFBiwzGk","qUJMdFNYIM","jSjS3piJSk","v1HlnYjB9t","8FmFHfFDrJ","I7p2atAOsr","BGaQYlpF6W","zY1GYZzJHW","1v5hHDcpWB",
+"RACujtAOsr","F6PT2cmXIX","bZLvSFnPFB","2ZHdk7X3uy","LbRTHO3iyQ","d7vjMnnP8o","yluBxLDk6f","CqqaDQnJ1S","xReecMkgy8","zz4ZUl83Ud",
+"v8yFNRxrsm","AmdQdSs0Zu","ydG8U1LB1L","4dEz6sqVrf","VIlwPsuY4x","iKqhrLbRTH","QnJ1S5Drn0","5VZjSpvgjS","JkzUnmz8gx","5Drn0vLsmS",
+"yToGWQ6Lix","lCMxySs0Zu","G1RhSlViBv","e6e4zIjTwP","uAWyp29QAz","2Yz7Epv0i7","QssNCMmKGJ","VIlwPvLsmS","Oz8yZFPfSE","jiVBPuoStw",
+"ni2v1fqypy","0YAGH580YD","7X3uyWmadA","YjB9tlXFOB","lCMxyRkQke","MezSWd85a9","cQOnvUvlv4","vkCHHatef2","Y1mC0ksJby","v8yFN5IhmG",
+"suY4xCp3mZ","tAOsrNo0Qb","AmdQdRpBQm","CdyBVzY1GY","8cVD3TXQ0Z","8TxD7hE1Ql","CK5W7W3VFH","YjB9ts7Mxk","Q6Lixs7Mxk","lj07QwDajX",
+"HP433JRJQB","yToGWfLNg8","t98iWrhl0J","7X3uypFrrl","guMb83weIF","64s8NvkCHH","BpYhVoVQp6","0MR5XgdQsS","uTacx55rfB","t98iWdhSuH",
+"lH1kt2Yz7E","jeskS7Ow5C","M6qcGRmDcr","No0Qb5ZaEz","l83UdW3VFH","HfyNQix74r","M3zXLCdyBV","4W0Tliqv4k","uZPqgPb1pa","zQt6QRACuj",
+"POUYSjzUqR","d7vjMZUnqt","FFDuiyofH3","jeskSNo0Qb","L7cGcgtCA5","YjB9tJ2mQi","Vprf2MmsIo","0MR5XzY1GY","taOXKpAhR1","6q6L9FFDui",
+"pFrrlOxWIH","5Drn0uN6r3","mX2GEulk41","HP433hUTw7","dpe1viqv4k","FLsphNhXdu","POUYSv1Hln","55rfBguMb8","O3iyQGrDg7","2Yz7EJIqXi",
+"ksJbyuoStw","tl72WUmaEv","9y4lwFFDui","zFgtBaFFss","GXdoHAIYUu","nlaByWreyP","7fKYUuLtKs","uTacx8FmFH","mX2GEFFDui","djsrvpFrrl",
+"fmIK15ZaEz","atef2580YD","uPX7G1LB1L","zz4ZUHfyNQ","jiVBPyToGW","iqv4kVerEA","kZANmoVQp6","TCgPpk85Ae","tvdkDVNCPd","yluBx580YD",
+"euZA5OUqFM","lm0pDpvgjS","e6e4zkB5nP","0BmCyi3pyd","VBjhzFNYIM","7Ow5CyToGW","Oz8yZmX2GE","hUTw7CqqaD","FNYIM7fsYM","B3qem5ZaEz",
+"Cp3mZcL0aE","VBjhz4QMc9","MK07YQ6hMC","UlU3MiKqhr","UlU3MRzaZA","lweGyuPX7G","JIqXizqH0W","9eoRcL7cGc","0KyfswiHrZ","QworuOxWIH",
+"pvgjSsuY4x","y94nwuZPqg","oVQp6lViBv","JKWYRK20wK","JJs5mGrDg7","y94nwnlaBy","zqH0W6AFT0","FxX9qs7Mxk","Ul4a1tl72W","KASQ8MezSW",
+"Ss0ZuhSSvQ","6AFT0SmGzv","BGaQYOz8yZ","uTacxGrDg7","gf8rIYOfrY","RACujOz8yZ","In3NSiwzGk","Y1mC0n8pJ9","L7cGczY1GY","2DREslj07Q",
+"MmKGJokgRi","n8pJ9JRJQB","jfREuFVMxo","bgJAz0YAGH","LDk6f5ZaEz","618DiK20wK","MmsIoOxWIH","5VZjSpWiOs","lH1ktMGlTF","W3VFHWMiS3",
+"azIWpuPX7G","0MR5XWMiS3","FGzgpSbRYy","v2eC37lUXZ","6AFT0jiVBP","HP4335Namm","lweGypv0i7","WPmlxiqv4k","zFgtB2hEEU","CIShG2Nslm",
+"oVQp6vkCHH","KsjRKciuWz","8cVD3GWqqX","HlUbFjtn0X","dpe1v9eoRc","RsQUqCK5W7","FFDui8FmFH","zbIYYFFDui","F6PT2RBhp0","Mm8sigtCA5",
+"GXdoHDcpWB","14FLR5Mg9r","uN6r3tl72W","64s8NzmLYD","suY4xStlDJ","SWfouvOqCE","5iGN59y4lw","1j5L8G1RhS","PYBf4Cp3mZ","ZuDtDjeskS",
+"piJSk8TxD7","4dEz6Yh1hF","BCxeCY1mC0","FjHXRFLsph","cShY2pvgjS","iB08lxXTI4","SmGzvxXTI4","uZPqgOHaBz","24ARFJKWYR","NhXduix74r",
+"LbRTHYOfrY","lsQGoyToGW","5nmWvpAhR1","JkzUnM6qcG","0YAGHPOUYS","2hEEUazIWp","vOqCETCgPp","lsQGoVBjhz","CNHmvjSjS3","lsQGoQbxXc",
+"MmKGJxReec","S77LHZJTXH","8TxD7X6Pin","0MR5XLewvM","6AFT0qQxHP","X6PinhE1Ql","Dz1R32DREs","Vprf2lj07Q","aDGtSa00b5","jzUqRlCMxy",
+"hE1QlUlU3M","4W0Tlrz7Ut","gtCA5aL6AJ","45cIHP6bcg","M6qcGThjNn","l83Udt59lR","oQ87rPb1pa","ZUnqtBpYhV","aFFssMezSW","oVQp6yvOMI",
+"VerEAl83Ud","HzZT8t98iW","jtn0Xdjsrv","mX2GElH1kt","OHaBzLDk6f","s93Ml2DREs","fmIK1GXdoH","KASQ8cQOnv","0YAGH8TxD7","nnP8oCfgr3",
+"9iGoTxReec","SmGzv55rfB","kB5nPuupzk","5ZaEzOz8yZ","7hyVvCp3mZ","zz4ZUJIqXi","HzZT8yofH3","he9IA3otm6","brhlQjfREu","zFgtBQClRL",
+"ZzJHWsoy9t","UmaEvs7Mxk","mz8gxDcpWB","hE1Ql5iGN5","5iGN5CqqaD","WmadADz1R3","yToGWKZamH","VjCZq0YAGH","cmXIXIBe8k","nnP8ogtCA5",
+"ciuWzWMiS3","5ZaEziB08l","fcJOyjS1aj","uN6r3t59lR","JkzUnUmaEv","5VZjSB3qem","pv0i7hE1Ql","UlU3MazIWp","B3qemmX2GE","QbxXcuZPqg",
+"8xEKzWaim6","W3VFHix74r","CIShGChuy3","vOqCEZuDtD","mX2GE8TxD7","8xEKzVprf2","lsQGocShY2","1j5L8zFgtB","SmGzvWMiS3","rz7Ut0Wr5y",
+"Ss0ZuqaofN","dmoS76q6L9","ZzJHW7fKYU","KsjRKi3pyd","qaofNtjQxs","QbxXcFxX9q","CIShGiqv4k","JIqXiSmGzv","MmKGJlCMxy","soy9tulk41",
+"9iGoTKZamH","0YAGHrhl0J","MmsIooVQp6","s7MxktAOsr","CqqaDQbxXc","0YAGHM3zXL","DQimpyEfy9","NcICAcShY2","v8yFNa00b5","PYBf4pT8wu",
+"fcJOyjSjS3","lCMxyTwano","ECMvUxXTI4","sqVrfix74r","ZzJHWNo0Qb","9GXkXfmIK1","IjTwPuoStw","yToGWNhXdu","lweGyThjNn","AmdQdguMb8",
+"ni2v1S2Dfu","cL0aEtlILt","v1Hlns93Ml","FcWrWgdQsS","zFgtBM3zXL","MmKGJh1zcH","AXpwEMojnP","djsrvQssNC","lsQGoMaJQs","QssNCDz1R3",
+"ogLgc0ao3l","9y4lwdhSuH","BFkb8Zv7z0","3otm6OHaBz","5ZaEzzQt6Q","zY1GYjeskS","9XyT9GSQwj","MK07YzHF1q","brhlQ29QAz","uupzkXflUq",
+"jtn0XpWiOs","Mm8siHfyNQ","pAhR17X3uy","14FLRNo0Qb","K20wKFPfSE","oQ87rSjskQ","iqv4kMK07Y","pmeCd3weIF","ru4UGn8pJ9","RsQUqMGlTF",
+"gIYvEBCxeC","K20wKeuZA5","P6bcgtjQxs","RpBQmWDVWJ","i3pydni2v1","SjskQM3zXL","WaWsvfcwDa","ru4UGGv3Fq","pT8wuWaim6","uPX7GqQxHP",
+"yluBxbZLvS","BbwgApv0i7","0h1b1v2eC3","jSjS3M6qcG","s7MxkpmeCd","WMiS3pWiOs","GWqqXoVQp6","VNCPdLewvM","EdBKcblLA9","F6PT2gIYvE",
+"lweGyaDGtS","QbxXcuAWyp","aDGtS0MR5X","s93Mljtn0X","zmLYDEOE1o","bZLvSMm8si","jSjS3JKWYR","lpF6WZuDtD","0h1b1OUqFM","guMb8lkMUA",
+"uupzk0Kyfs","1LB1Lru4UG","Yh1hFsoy9t","X6PinVLTy6","8U2nUcShY2","LbRTHSjskQ","9eoRcECMvU","618DiWmadA","suY4x4W0Tl","Waim6F6PT2",
+"Kr8ysZJTXH","7Ow5CjS1aj","0PktIl83Ud","lj07QYOfrY","taOXK5VZjS","P6bcgDG4sT","tvdkD8FmFH","faHirZUnqt","ZzJHWxReec","P6bcgpFrrl",
+"Oz8yZ1j5L8","Dz1R3AgJHQ","F6PT2QWxoT","blLA9JkzUn","azIWpMojnP","n1pmO5iGN5","07n1cF6PT2","RxrsmeuZA5","GWqqXSs0Zu","CqqaDprNT6",
+"vkCHH0MR5X","RmDcr0Kyfs","euZA5oQ87r","jfREuv8yFN","7fsYMcL0aE","jfREuLewvM","iqv4k7fsYM","MmKGJUlU3M","vOqCEni2v1","pvgjSFPfSE",
+"oQ87rtl72W","Mm8sijS1aj","SbRYyni2v1","EoToPJRJQB","FPfSEe6e4z","MmKGJOHaBz","tvdkDatef2","0PktIX6Pin","ReKEWzHF1q","fcwDaMojnP",
+"CdyBV5iGN5","lpF6W5Drn0","X6PinLbRTH","UlU3MpiJSk","WreyPjzUqR","zY1GYdmoS7","OUqFMOHaBz","qQxHP64s8N","d7vjMAXpwE","SmGzvYf2Ec",
+"azIWpFFDui","gdQsSReKEW","CNHmvuTacx","cL0aEQ6hMC","O3iyQlj07Q","JkzUnlsQGo","brhlQGv3Fq","ZhwG114FLR","uvf7Amz8gx","NhXduRsQUq",
+"zmLYDtaOXK","Dz1R3MaJQs","v1HlnG1RhS","okgRiIBe8k","FnPFBFVMxo","XflUq9iGoT","Uvlv4K4GS8","QYxC0SbRYy","qQxHPOUYuF","8U2nUIn3NS",
+"tuDySJXljW","rz7UtKZamH","FFDuikZANm","CIShGGWqqX","tvdkDsoy9t","M6qcG0YAGH","pT8wuJRJQB","F6PT2euZA5","QChxsiwzGk","3weIFx3LDe",
+"BCxeCpiJSk","rKDLJZuDtD","fcwDaaez9y","ksJbylpF6W","ThjNnTa8f6","Uvlv4Gv3Fq","AXpwE7ku1p","FwEJzfcJOy","wiHrZO3iyQ","azIWprKDLJ",
+"pv0i729QAz","suY4xEoToP","MezSWbZLvS","Ta8f6W7cTs","piJSk16lHc","dpe1v0Kyfs","fFDrJGXdoH","Mkgy8SWfou","rhl0J9GXkX","Dz1R30Wr5y",
+"a00b5d7vjM","QYxC0ZuDtD","CdyBVdQ586","s7MxkI7p2a","yToGWuQIcz","0ao3lVIlwP","14FLR9GXkX","ulk41hYBCK","Pb1paciuWz","ksJbym4bxU",
+"5Mg9rECMvU","AOgEezFgtB","lj07QI7p2a","ZuDtDRxrsm","QnJ1SLewvM","oQ87rgIYvE","JXljW7hyVv","5Drn0OHaBz","lCMxyoGu6x","RsQUqYjB9t",
+"3weIFk85Ae","24ARFUlU3M","07n1coQ87r","4W0TloVQp6","zbIYYZhwG1","t98iWWreyP","07n1cjS1aj","uJScXKASQ8","S2DfuJ2mQi","Uvlv4QChxs",
+"t59lR7fKYU","AXpwEZUnqt","ciuWzB3qem","jtn0XJJs5m","Cp3mZuvf7A","t98iWrKDLJ","1v5hHuJScX","Y1mC0Yf2Ec","VBjhzfFDrJ","JRJQBVjCZq",
+"FjHXRSWfou","IRh48hE1Ql","jfREuVerEA","7ku1pStlDJ","QClRL5iGN5","he9IA5Namm","7lUXZru4UG","tjQxsPYBf4","ZuDtDtAOsr","TXQ0ZJKWYR",
+"OHaBzv8yFN","TXQ0ZfLNg8","RACujrhl0J","hi5X748cHL","Rxrsm9eoRc","blLA96AFT0","uJScX1v5hH","0Kyfs3otm6","e6e4z5drc6","16lHccL0aE",
+"yEfy9L7cGc","StlDJMmKGJ","MmKGJguMb8","xciqpDz1R3","MojnP14FLR","b29RJbgJAz","hSSvQBpYhV","FwEJz1v5hH","ZUnqtuJScX","Gv3Fq4QMc9",
+"DQimp07n1c","DLhzM4dEz6","VNCPdatef2","h1zcHsoy9t","vkCHHxReec","8FmFHbrhlQ","hUTw7Mkgy8","LbRTHpT8wu","Uvlv4JKWYR","No0QblViBv",
+"8hJdtzQt6Q","GrDg7tvdkD","Mm8sifaHir","WaWsvEOE1o","S2DfujiVBP","lm0pDECMvU","kZANms7Mxk","X6PinMmsIo","Uvlv4EoToP","J2mQiTwano",
+"BCxeCCK5W7","Zv7z0W7cTs","yvOMIS77LH","kZANmuupzk","2TRI7Waim6","GSQwj0BmCy","CqqaDFwEJz","CIShGprNT6","fqypyMK07Y","No0QbMm8si",
+"FPfSEFGzgp","L7cGcMm8si","fmIK1qaofN","HlUbF24ARF","ulk41n8pJ9","5iGN5Yw2oU","GWqqXaFFss","Yh1hFgIYvE","lXFOBIKxdL","RACujSs0Zu",
+"8xEKzJJs5m","lCMxy8U2nU","OUqFM3otm6","aDGtSRACuj","I7p2aX6Pin","5iGN5FjHXR","Vprf2s7Mxk","taOXKZhwG1","IKxdL7fKYU","0MR5XFPfSE",
+"Mm8silH1kt","DLhzMKZamH","ni2v1NOHsz","hUTw7FcWrW","5Mg9ri3pyd","tl72W0Wr5y","DG4sToQ87r","BbwgAtl72W","BGaQYYjB9t","CxVEfEOE1o",
+"nnP8ozmLYD","9iGoTThjNn","jeskSh1zcH","lCMxyFVMxo","5NammQbxXc","9XyT914FLR","16lHcx3LDe","vOqCEWMiS3","brhlQzqH0W","GSQwjFFDui",
+"9y4lwB3qem","taOXKPb1pa","CxVEfUlU3M","1LB1L6q6L9","HP433ZJTXH","5VZjSuvf7A","oQ87r5drc6","QChxsXyPZN","D6rByK20wK","PYBf49XyT9",
+"X6Pin29QAz","aFFss2ZHdk","n1pmORsQUq","64s8Nrhl0J","lm0pDbrhlQ","lkMUAZv7z0","Uvlv49GXkX","t98iWBGaQY","14FLRfcJOy","0BmCycmXIX",
+"Yf2EctjQxs","LDk6fprNT6","VerEArz7Ut","bgJAziB08l","ciuWzgdQsS","bZLvSBFkb8","lsQGoVNCPd","YjB9t4dEz6","0PktIFhtgl","2NslmuJScX",
+"RmDcrQYxC0","SbRYy8U2nU","0BmCyCdyBV","Yf2EcIjTwP","F6PT2580YD","KsjRKlj07Q","jS1ajDQimp","uJScXAkKTk","nnP8oWmadA","nlaBy2hEEU",
+"atef2MmsIo","hYBCKFFDui","SWfouFLsph","pv0i7AXpwE","nnP8okZANm","uLtKsWreyP","7hyVvRACuj","VNCPdOxWIH","jS1ajpvgjS","HzZT8W7cTs",
+"iqv4knlaBy","StlDJI7p2a","7lUXZIBe8k","fmIK1pv0i7","JRJQBK4GS8","O3iyQiB08l","ZuDtD7fsYM","7lUXZpvgjS","VIlwPyToGW","9XyT9brhlQ",
+"ydG8USbRYy","MezSWx3LDe","4W0TlksJby","W3VFH9y4lw","i7WMQQ6hMC","ThjNnOUYuF","xXTI4zqH0W","ReKEWCIShG","0MR5XTXQ0Z","8hJdtMkgy8",
+"ru4UGsuY4x","SmGzvhE1Ql","yvOMI2DREs","JkzUnKASQ8","cShY2taOXK","2DREsuN6r3","O3iyQyvOMI","t98iWoVQp6","zqH0WjS1aj","2DREsC2Irc",
+"DQimp2DREs","fLNg8ksJby","vLsmSMmKGJ","KsjRKSmGzv","0BmCyoVQp6","AXpwEn1pmO","IBe8ks7Mxk","h1zcH618Di","aDGtSpT8wu","aFFssOUqFM",
+"KsjRKjiVBP","qUJMdt59lR","uLtKsguMb8","QbxXcOz8yZ","S2DfuNxx9V","x3LDe4W0Tl","dhSuH9y4lw","B3qem0ao3l","5ZaEztjQxs","lH1kt4W0Tl",
+"lXFOBMK07Y","16lHc4QMc9","5iGN564s8N","Dz1R3fqypy","fcJOyEoToP","7lUXZv8yFN","bgJAzK20wK","MmKGJNOHsz","nnP8oOUYuF","vkCHHD6rBy",
+"i3pydVIlwP","Yw2oUStlDJ","EOE1ohSSvQ","l83Ud5nmWv","euZA5CNHmv","dhSuHSmGzv","ZuDtDU3yw5","580YDFFDui","mz8gx4dEz6","aez9yKASQ8",
+"tvdkDpiJSk","CxVEfFPfSE","1j5L8K4GS8","9GXkXCqqaD","mz8gxStlDJ","CxVEfkB5nP","5Drn0QbxXc","AIYUuQClRL","iB08lhi5X7","7hyVvAOgEe",
+"HlUbFRsQUq","VerEAMojnP","XflUqQWxoT","0h1b124ARF","tAOsrRxrsm","Nxx9V618Di","QssNC8cVD3","HRxd8tl72W","yvOMIFLsph","POUYS8U2nU",
+"8cVD3djsrv","a00b5cmXIX","soy9tfaHir","iqv4kMm8si","tl72WCK5W7","QWxoTVjCZq","fcJOyhi5X7","oGu6xqaofN","2Yz7E2Nslm","Zv7z0rhl0J",
+"BbwgAix74r","8RCUApvgjS","sx5Gl8cVD3","FGzgp5iGN5","nlaByCNHmv","5NammQ6hMC","uvf7AJJs5m","FGzgpAkKTk","618Di5Mg9r","oVQp64W0Tl",
+"gjUTupFrrl","6q6L9oGu6x","LewvMkZANm","JIqXiXflUq","DLhzMVBjhz","Ta8f62Yz7E","dpe1vpFrrl","5VZjSMK07Y","580YDIRh48","d85a9RkQke",
+"8TxD70BmCy","s7MxkS77LH","HlUbFzQt6Q","CdyBVJJs5m","Yf2Ec07n1c","blLA9GSQwj","MmKGJThjNn","blLA9DLhzM","NAFuwoGu6x","RzaZAF6PT2",
+"lpF6WWaim6","Cfgr3HzZT8","QClRLZ4I1v","RpBQmlpF6W","8RCUAJIqXi","5nmWvO3iyQ","vLsmSgjUTu","d85a92Yz7E","CIShG7lUXZ","dhSuHWMiS3",
+"ni2v1bgJAz","JkzUn5IhmG","5Mg9r9GXkX","RmDcrhi5X7","DLhzM5iGN5","ReKEW0Kyfs","lH1kt5Mg9r","oQ87r0h1b1","StlDJSWfou","580YDNhXdu",
+"No0QbtvdkD","QbxXcKsjRK","OHaBztaOXK","CK5W7Q6Lix","pT8wus4786","FjHXR5ZaEz","AgJHQ0BmCy","FFDuihE1Ql","jtn0X0BmCy","QbxXcyofH3",
+"pFrrlMK07Y","aez9ykB5nP","45cIHW7cTs","GrDg7Rxrsm","UmaEviKqhr","AOgEeP6bcg","8xEKzQChxs","Pb1pa4QMc9","JRJQBzmLYD","FcWrWW3VFH",
+"XflUq0ao3l","0YAGHMmKGJ","zHF1q9GXkX","aez9y9rlg9","No0QbHzZT8","DG4sTzY1GY","BpYhVvkCHH","lj07QReKEW","iB08lJXljW","AOgEeHRxd8",
+"hE1Qlb29RJ","Yw2oUFFDui","Oz8yZvOqCE","QYxC0zz4ZU","d85a9W7cTs","IjTwPlweGy","HP4330h1b1","mX2GEJRJQB","HlUbFlj07Q","AgJHQQ6hMC",
+"9iGoTd7vjM","qaofNlweGy","t59lRnlaBy","Nxx9V07n1c","6AFT01LB1L","VLTy6IRh48","ReKEWRmDcr","FPfSElkMUA","aFFssS2Dfu","EOE1oK20wK",
+"ZJTXHWaim6","14FLRuN6r3","kB5nPaez9y","CNHmvCfgr3","7ku1pG1RhS","XyPZNgdQsS","dpe1vRxrsm","16lHcqQxHP","ni2v10ao3l","ydG8UIjTwP",
+"MGlTFv2eC3","Kr8ysJkzUn","9GXkXxXTI4","fqypyQnJ1S","zmLYDU3yw5","hSSvQyToGW","Z4I1vru4UG","rKDLJtAOsr","OxWIH5drc6","MezSW4W0Tl",
+"o8Uyd5nmWv","uN6r3fmIK1","5Drn0uTacx","OUYuFBFkb8","CIShGZzJHW","uPX7GGrDg7","MmsIofFDrJ","0MR5XzqH0W","tl72Wxciqp","0Kyfs8cVD3",
+"CxVEfmX2GE","bgJAzNOHsz","fFDrJ4dEz6","cmXIXQWxoT","VBjhzD6rBy","fcJOyt98iW","jiVBPQbxXc","h1zcHWmadA","9iGoTTa8f6","guMb8WreyP",
+"S77LHAXpwE","0BmCycQOnv","rhl0JWPmlx","UlU3MaFFss","FcWrWF6PT2","9GXkXKZamH","jiVBP0MR5X","NOHsz45cIH","zbIYYbrhlQ","ksJbyFhtgl",
+"dpe1vuZPqg","oGu6xatef2","lj07QQbxXc","dpe1vLDk6f","lH1kt5nmWv","qUJMdLewvM","djsrvfcJOy","yluBxNxx9V","fcJOyd7vjM","M6qcGNo0Qb",
+"tuDySlweGy","QYxC0qaofN","QChxsTa8f6","fcJOy1j5L8","faHirdpe1v","DLhzMQClRL","Zv7z0aFFss","JXljWHfyNQ","y94nwRxrsm","fFDrJ1LB1L",
+"dmoS75VZjS","oVQp6zHF1q","ydG8UyofH3","5VZjSNhXdu","oGu6xFhtgl","No0QbtuDyS","zQt6QAgJHQ","GWqqXgf8rI","8RCUAVBjhz","jS1ajqaofN",
+"0YAGH9y4lw","gjUTulsQGo","y94nwZUnqt","14FLRlViBv","RBhp0Fhtgl","Chuy3KsjRK","GSQwj5Mg9r","ECMvUIBe8k","v8yFNZUnqt","VNCPdL7cGc",
+"8RCUAcShY2","W7cTsd85a9","BCxeC4dEz6","8TxD7FjHXR","Mm8si2ZHdk","Yf2Ec5Namm","Pb1pa7Ow5C","uupzkBbwgA","5drc6EdBKc","a00b5n1pmO",
+"zqH0W7X3uy","ksJbyW7cTs","FwEJzRpBQm","HP433SWfou","IBe8ka00b5","nlaByAmdQd","CNHmvcL0aE","SbRYyzbIYY","48cHLL7cGc","FNYIMdQ586",
+"Yh1hFgjUTu","xciqp07n1c","JXljW07n1c","DG4sT2Yz7E","AIYUuZ4I1v","Uvlv4No0Qb","FnPFBMGlTF","Yf2EczmLYD","GWqqXlsQGo","8xEKzdpe1v",
+"ECMvUB3qem","gtCA5BCxeC","4QMc9GXdoH","AgJHQfmIK1","3otm6m4bxU","uZPqggjUTu","2DREszQt6Q","IKxdLNcICA","ix74r5ZaEz","5ZaEzjeskS",
+"fcJOytl72W","MezSWwiHrZ","hUTw7AgJHQ","kB5nPguMb8","5Drn0zz4ZU","9eoRcjeskS","n1pmOrhl0J","UmaEvkB5nP","SWfous4786","7lUXZn1pmO",
+"GWqqXtaOXK","HlUbFXflUq","6AFT0t98iW","jSjS3OxWIH","aFFss9GXkX","lsQGofLNg8","WreyPI7p2a","RzaZAyofH3","SbRYyqQxHP","euZA5pAhR1",
+"0h1b1JXljW","SbRYypv0i7","WmadAcL0aE","LDk6fhi5X7","tuDyS8hJdt","M6qcGBGaQY","QChxsMkgy8","Gv3Fqk85Ae","m4bxUBFkb8","U3yw5y94nw",
+"0BmCyuupzk","vLsmSDG4sT","xciqpOHaBz","FnPFBnFqik","1LB1LZUnqt","5iGN5yvOMI","7Ow5Cs7Mxk","aez9yRpBQm","pAhR1WDVWJ","CdyBV48cHL",
+"mz8gxpv0i7","ru4UGdpe1v","oQ87rO3iyQ","VLTy60YAGH","618DiPOUYS","Q6hMC4dEz6","jzUqRYh1hF","29QAzlkMUA","VLTy6pv0i7","CIShGS77LH",
+"5iGN5K4GS8","IKxdLiqv4k","tvdkDFxX9q","EoToPcmXIX","tAOsrkZANm","m4bxUiKqhr","IRh48C2Irc","SWfou8RCUA","WmadAIjTwP","uN6r38TxD7",
+"qUJMd8cVD3","mX2GEXyPZN","CNHmvjiVBP","RxrsmrKDLJ","GXdoHBpYhV","jSjS3LewvM","ZJTXHKZamH","U3yw5FFDui","FjHXR1LB1L","fFDrJUlU3M",
+"AkKTkBbwgA","jtn0Xk85Ae","lsQGoGv3Fq","8U2nUn1pmO","CIShGlj07Q","In3NSyEfy9","QssNCzHF1q","64s8NokgRi","SmGzvD6rBy","fFDrJpAhR1",
+"mz8gxm4bxU","2Yz7ELewvM","QssNCJJs5m","Z4I1vMaJQs","lm0pDfFDrJ","2ZHdkPb1pa","JKWYRAXpwE","6AFT0OUqFM","lpF6WTXQ0Z","hE1QlCdyBV",
+"NAFuwlpF6W","0PktI5IhmG","ni2v1RACuj","tAOsrPOUYS","pv0i7cQOnv","qQxHPJJs5m","8hJdtDcpWB","FFDuiQnJ1S","bgJAz7ku1p","QnJ1SZUnqt",
+"W7cTslViBv","uPX7GKsjRK","7lUXZY1mC0","CqqaDMGlTF","jzUqRFFDui","lsQGoiwzGk","ZhwG1pWiOs","5Mg9rHRxd8","K20wKwDajX","tuDySOHaBz",
+"7fKYUJJs5m","WMiS3Twano","Ss0ZuksJby","UmaEv0h1b1","cmXIXyEfy9","Q6hMC3weIF","0ao3lxXTI4","nnP8oFnPFB","bgJAzciuWz","wiHrZuN6r3",
+"uJScXuN6r3","AXpwEgf8rI","IjTwP5drc6","fcwDaECMvU","8hJdtLewvM","djsrvs7Mxk","uN6r3HRxd8","4W0TlyEfy9","NcICAxXTI4","x3LDe5Drn0",
+"okgRi4dEz6","9eoRc3otm6","1LB1LUl4a1","guMb8BbwgA","a00b5WDVWJ","VjCZqAOgEe","AgJHQYh1hF","uTacxYh1hF","Uvlv4ciuWz","ZzJHWlj07Q",
+"ogLgc9XyT9","DQimp7hyVv","suY4xReKEW","GrDg7qUJMd","HP433rKDLJ","jSjS3zFgtB","P6bcgguMb8","hSSvQiKqhr","FwEJzJKWYR","4dEz6lCMxy",
+"lH1ktuQIcz","nlaByhYBCK","Q6hMCJkzUn","l83UdAgJHQ","4dEz6IRh48","zY1GYgIYvE","ThjNn0Wr5y","Chuy3EoToP","HfyNQnlaBy","7hyVvDcpWB",
+"Ul4a1lXFOB","QbxXclpF6W","iwzGkHP433","okgRiIn3NS","BpYhVUlU3M","0PktIhSSvQ","GWqqXqUJMd","Q6Lixv8yFN","5VZjSGSQwj","oQ87rFGzgp",
+"d85a9MmKGJ","Oz8yZxciqp","k85AeSs0Zu","wiHrZ2TRI7","KZamHzY1GY","FPfSEoQ87r","GSQwjhSSvQ","d85a9t98iW","Q6hMCtAOsr","k85Aerz7Ut",
+"WPmlxhYBCK","RpBQm0YAGH","MK07Yi3pyd","EoToPWMiS3","MmKGJa00b5","DcpWBuvf7A","K4GS8fmIK1","mz8gx2TRI7","SWfoud7vjM","RkQkerz7Ut",
+"9rlg95IhmG","cShY2GXdoH","RxrsmzbIYY","5Mg9riqv4k","DQimpDG4sT","o8UydZuDtD","n8pJ9TXQ0Z","Q6LixIjTwP","yluBxC2Irc","S77LHP6bcg",
+"jeskSWaim6","RACujazIWp","KASQ8he9IA","7fsYM7fKYU","55rfBni2v1","4dEz6rz7Ut","1LB1LpmeCd","uupzkGrDg7","QYxC0hSSvQ","suY4xgf8rI",
+"ZUnqtsqVrf","iKqhr5iGN5","WDVWJCfgr3","uoStwuAWyp","Kr8ysYf2Ec","iqv4kJJs5m","y94nwYjB9t","he9IAiqv4k","FNYIM9XyT9","KsjRKStlDJ",
+"atef2yvOMI","Ul4a1VjCZq","IKxdLFLsph","jfREuAgJHQ","QbxXciwzGk","3weIFPb1pa","2ZHdkOxWIH","Gv3Fqzz4ZU","prNT6NcICA","hUTw7QnJ1S",
+"t98iWuZPqg","JkzUn14FLR","GrDg7GSQwj","gtCA5pmeCd","uZPqgRmDcr","5ZaEzYh1hF","Z4I1vUmaEv","X6Pin0YAGH","soy9tNxx9V","Ul4a1QnJ1S",
+"MojnP2ZHdk","cmXIXHRxd8","9rlg9Ta8f6","t98iWtaOXK","CNHmvDG4sT","EdBKcUl4a1","O3iyQJIqXi","soy9tzY1GY","5nmWvKASQ8","ZuDtD9eoRc",
+"IKxdLaFFss","qQxHPQnJ1S","55rfBx3LDe","dpe1v9iGoT","2ZHdktuDyS","L7cGcrhl0J","atef2djsrv","JRJQBRACuj","MojnPLbRTH","uJScXyluBx",
+"FjHXRxReec","FhtglgjUTu","iwzGkpFrrl","5VZjSiwzGk","ECMvUVBjhz","s4786ksJby","iqv4kHP433","TXQ0ZWreyP","24ARF4dEz6","suY4xazIWp",
+"6AFT0Waim6","ydG8U8U2nU","0Kyfs0PktI","D6rBy5Mg9r","uN6r3Q6hMC","TXQ0ZgjUTu","FwEJzh1zcH","U3yw5QChxs","brhlQBpYhV","NhXdujtn0X",
+"djsrvfmIK1","RkQkeCxVEf","jzUqR4dEz6","XflUqd7vjM","AgJHQpiJSk","VBjhzM3zXL","v1Hln7X3uy","7ku1pFFDui","x3LDeksJby","jzUqRqQxHP",
+"1v5hHhe9IA","8U2nULbRTH","O3iyQGXdoH","lpF6Wrhl0J","RmDcrLewvM","yofH3ReKEW","YOfrY5ZaEz","lH1ktSmGzv","tAOsr1LB1L","P6bcgiKqhr",
+"dQ586RpBQm","zz4ZUYOfrY","kZANm5Mg9r","v1Hln7ku1p","5IhmGRxrsm","nnP8ozqH0W","ECMvU7hyVv","oGu6xmz8gx","vLsmSAIYUu","t59lRt98iW",
+"HP433RmDcr","29QAziB08l","s7Mxkn1pmO","YjB9tMGlTF","Mm8sinFqik","JRJQBCfgr3","tuDyScmXIX","Twano5Mg9r","RzaZAv8yFN","fLNg8KASQ8",
+"YjB9tDQimp","t59lRfLNg8","o8UydiKqhr","JIqXiCp3mZ","oGu6xpv0i7","HfyNQ5Mg9r","GSQwj2DREs","POUYSZ4I1v","qUJMdMGlTF","sx5GlW3VFH",
+"zY1GY6AFT0","uQIczmX2GE","aez9yFjHXR","2ZHdk8U2nU","RzaZAatef2","lH1kt580YD","lweGyt59lR","MGlTFQWxoT","SjskQMmKGJ","NAFuwVprf2",
+"POUYSRpBQm","yluBxt98iW","3weIFhi5X7","aez9yXyPZN","nFqikIKxdL","WDVWJuLtKs","ZJTXHuAWyp","M3zXLAOgEe","dhSuHs93Ml","6q6L9euZA5",
+"YjB9tRkQke","mz8gxru4UG","fcwDaQ6hMC","xXTI4AkKTk","nlaByRzaZA","HzZT8Yf2Ec","QbxXcpT8wu","bZLvSnFqik","55rfBM6qcG","4W0TluoStw",
+"9eoRcP6bcg","G1RhShi5X7","EOE1oLbRTH","7hyVvlXFOB","9XyT99eoRc","ix74rEOE1o","sqVrffaHir","7Ow5CFGzgp","O3iyQ7ku1p","nlaBy55rfB",
+"uAWyp8TxD7","yvOMIZhwG1","soy9tzFgtB","07n1ck85Ae","7ku1pAgJHQ","AmdQd16lHc","8cVD3azIWp","MGlTFa00b5","hUTw7FVMxo","8U2nUQworu",
+"piJSkbgJAz","8FmFHRzaZA","uZPqgazIWp","pv0i7ZUnqt","iqv4kuPX7G","FwEJziB08l","e6e4z8RCUA","L7cGctlILt","MGlTFZv7z0","4W0Tls93Ml",
+"JJs5m0ao3l","2NslmTa8f6","WmadAdjsrv","0Wr5yI7p2a","FNYIMzbIYY","djsrvP6bcg","5VZjSkZANm","GWqqXStlDJ","Nxx9VyvOMI","AOgEezqH0W",
+"0ao3liKqhr","lViBvEOE1o","S77LHPYBf4","9iGoTHRxd8","9GXkXFjHXR","9XyT9VLTy6","VIlwPbrhlQ","0ao3lrKDLJ","tuDySPb1pa","lweGyzFgtB",
+"MK07YM6qcG","Uvlv4lpF6W","blLA96q6L9","kB5nPgf8rI","yEfy9In3NS","dmoS7ogLgc","hUTw71v5hH","AmdQdxXTI4","mz8gxUl4a1","J2mQi48cHL",
+"WaWsvAOgEe","UmaEvQ6Lix","XflUqbrhlQ","yvOMIFhtgl","NAFuw9XyT9","SbRYymz8gx","aFFssQWxoT","FhtglRkQke","7ku1ptl72W","VIlwPuJScX",
+"0Wr5ycShY2","VjCZqo8Uyd","W7cTsnnP8o","pv0i7IRh48","faHirUlU3M","x3LDeIRh48","CNHmvyofH3","BGaQYFLsph","X6PinRkQke","Cfgr3Kr8ys",
+"29QAzdmoS7","7ku1pru4UG","M6qcGLewvM","QssNCZUnqt","8U2nUyEfy9","s4786BbwgA","8cVD3QbxXc","ECMvUvkCHH","NhXduguMb8","VIlwPQ6Lix",
+"7hyVvWmadA","0ao3loGu6x","M6qcG5ZaEz","BCxeCxReec","64s8NguMb8","soy9tv1Hln","BbwgAEdBKc","RzaZAQWxoT","MojnPS2Dfu","n1pmO16lHc",
+"gjUTufcwDa","RBhp0jfREu","ReKEWRACuj","MmKGJ24ARF","In3NS8RCUA","9iGoTcL0aE","In3NSIjTwP","7fsYMSWfou","VIlwPoVQp6","CNHmvlXFOB",
+"rhl0Jdpe1v","iwzGkRxrsm","v8yFNfaHir","VjCZqHP433","Kr8ysgdQsS","jzUqR5drc6","fFDrJ6AFT0","lpF6WHRxd8","No0Qb8U2nU","zbIYYIRh48",
+"5Drn0MezSW","RkQkeaL6AJ","BCxeCaFFss","PYBf48FmFH","F6PT20Wr5y","IKxdLzQt6Q","7ku1psoy9t","fcwDaRBhp0","WreyPKsjRK","lCMxyQworu",
+"9y4lwzbIYY","UmaEvNxx9V","VerEA9GXkX","guMb8P6bcg","lsQGoFVMxo","RkQkeeuZA5","aFFss0Wr5y","K20wKFLsph","zQt6Qs4786","MmKGJix74r",
+"24ARFStlDJ","1LB1Ln1pmO","K20wK14FLR","0MR5XGSQwj","M6qcGWMiS3","ZhwG19GXkX","Yf2EcuPX7G","ru4UGs7Mxk","DcpWBlsQGo","FFDuiAIYUu",
+"No0QbuLtKs","WmadAyToGW","FjHXRm4bxU","Q6LixSWfou","MGlTFFGzgp","dQ586L7cGc","XflUqpFrrl","zHF1q8U2nU","azIWpyofH3","lpF6WGSQwj",
+"s93Ml16lHc","tjQxs2DREs","6q6L9h1zcH","oQ87r8xEKz","VNCPdX6Pin","7X3uyCNHmv","sqVrfRACuj","VLTy6DG4sT","QssNCJkzUn","kB5nPrhl0J",
+"MojnPQworu","lXFOBAgJHQ","4W0TlprNT6","IBe8klViBv","hi5X77hyVv","KZamHYjB9t","HlUbFmX2GE","fcwDa2Nslm","MaJQsulk41","W3VFHm4bxU",
+"2Yz7Ek85Ae","i7WMQ9eoRc","7fKYURmDcr","VLTy6HzZT8","h1zcHru4UG","JRJQBdjsrv","FcWrWdpe1v","soy9tGrDg7","0ao3ljiVBP","pvgjS7X3uy",
+"UlU3Mgf8rI","tAOsrHfyNQ","tjQxsKASQ8","d7vjMQ6Lix","wiHrZSmGzv","KASQ8rKDLJ","EOE1oRBhp0","he9IApAhR1","SmGzvGv3Fq","FPfSESmGzv",
+"lH1ktdmoS7","0YAGH24ARF","StlDJHfyNQ","cQOnvtAOsr","UlU3MVIlwP","uvf7A0Kyfs","uvf7AuQIcz","a00b53otm6","Waim6RACuj","VBjhz7hyVv",
+"ZUnqt5VZjS","CqqaDuZPqg","AIYUuJIqXi","l83UduPX7G","pvgjS9GXkX","ZzJHWzz4ZU","gjUTuuvf7A","QnJ1Sjtn0X","fcwDa5ZaEz","GWqqXs7Mxk",
+"QChxslkMUA","6q6L90BmCy","14FLRVLTy6","Oz8yZ9GXkX","ZhwG10BmCy","8FmFHzHF1q","JkzUnIBe8k","lpF6WjeskS","S77LHfcwDa","JKWYRyToGW",
+"0MR5XOz8yZ","iKqhrni2v1","azIWpxciqp","QClRLC2Irc","K4GS8M3zXL","AkKTkhe9IA","Mkgy8NOHsz","uZPqgQWxoT","W3VFHMojnP","zHF1q7ku1p",
+"9XyT9pWiOs","Vprf2oGu6x","v8yFNuZPqg","suY4xHlUbF","t59lRRxrsm","lH1ktYw2oU","Uvlv4zmLYD","CIShGFGzgp","07n1cZUnqt","sqVrfUl4a1",
+"t59lRAOgEe","DcpWBv1Hln","jiVBPiqv4k","SjskQF6PT2","QChxsK20wK","JIqXiKASQ8","RmDcrgjUTu","rhl0JZzJHW","guMb8prNT6","W7cTsQChxs",
+"Pb1pabZLvS","J2mQiwiHrZ","hSSvQC2Irc","ix74rFwEJz","FcWrW14FLR","IRh48zqH0W","2TRI7qaofN","RsQUqtlILt","64s8NzY1GY","GSQwjHzZT8",
+"Y1mC0pWiOs","oQ87rZv7z0","rhl0Jix74r","nlaByZ4I1v","SjskQJRJQB","8hJdtS2Dfu","QworuSs0Zu","Pb1paOz8yZ","JKWYRsqVrf","2Yz7Eaez9y",
+"bZLvSvkCHH","n1pmO9iGoT","No0QbgIYvE","Twanotl72W","cShY2ni2v1","yluBx9XyT9","ZzJHWFNYIM","ciuWzhYBCK","Vprf2KZamH","FGzgphYBCK",
+"GWqqXMmKGJ","Y1mC0WreyP","cL0aEpT8wu","DcpWBCIShG","CK5W74QMc9","7fKYUlXFOB","KASQ8Q6hMC","SjskQAOgEe","FcWrW5iGN5","yvOMINo0Qb",
+"5IhmGrKDLJ","7fsYMsoy9t","LewvMM6qcG","GSQwjXyPZN","M6qcGkZANm","fcJOywDajX","GWqqXsx5Gl","5NammZv7z0","QssNCUvlv4","zqH0WbgJAz",
+"ulk41FPfSE","xXTI4O3iyQ","Kr8ys4dEz6","uTacxyvOMI","Dz1R30h1b1","jSjS35drc6","VNCPdpT8wu","HlUbFQWxoT","Gv3FqpmeCd","aFFssC2Irc",
+"7fKYUHlUbF","DQimpyvOMI","AgJHQuLtKs","XyPZNuoStw","FGzgptuDyS","IBe8kBFkb8","QYxC0uoStw","VjCZqI7p2a","HzZT8BpYhV","lViBv45cIH",
+"v1HlnAkKTk","tAOsr9XyT9","Yw2oUGXdoH","5Mg9rTCgPp","pT8wuxXTI4","okgRipmeCd","b29RJQChxs","CIShGGv3Fq","0PktIix74r","Kr8ysvkCHH",
+"07n1cOUYuF","RzaZABpYhV","RxrsmzqH0W","LbRTHJkzUn","7hyVviqv4k","tAOsrM6qcG","ru4UGDQimp","jzUqRBbwgA","h1zcHzHF1q","RzaZAfFDrJ",
+"BpYhV5Drn0","9rlg96AFT0","rhl0JhYBCK","zY1GYFxX9q","ReKEWZ4I1v","v2eC3TXQ0Z","JkzUnhSSvQ","YOfrY45cIH","lm0pDIRh48","fFDrJprNT6",
+"Mm8siQChxs","OUqFMsx5Gl","TXQ0Z5VZjS","rhl0JzFgtB","kZANm580YD","vLsmSFhtgl","Dz1R3mX2GE","QssNC55rfB","DQimp5iGN5","DcpWBbZLvS",
+"L7cGciwzGk","BGaQYBpYhV","s93MlKr8ys","fmIK1AIYUu","sqVrf5iGN5","hYBCKMK07Y","NOHszaFFss","lH1ktDcpWB","VBjhzcmXIX","nnP8osx5Gl",
+"qQxHPfmIK1","pWiOsblLA9","FNYIM7ku1p","yluBxJkzUn","aL6AJPYBf4","yofH3TCgPp","Nxx9ViB08l","JIqXiWmadA","7fKYUFVMxo","ni2v1zFgtB",
+"MGlTFSbRYy","MmsIouupzk","hE1QlHlUbF","4QMc99GXkX","UmaEvDcpWB","GWqqXFPfSE","iKqhrfaHir","FLsph0h1b1","CdyBVtjQxs","pT8wuv8yFN",
+"8hJdtPb1pa","QssNC7hyVv","NcICAStlDJ","TwanozHF1q","WPmlx48cHL","jtn0XAOgEe","580YDfLNg8","pmeCdblLA9","WPmlxmz8gx","QnJ1SJIqXi",
+"tAOsrazIWp","KASQ85Drn0","qQxHPfqypy","t59lRn8pJ9","zz4ZUUlU3M","7Ow5C6q6L9","a00b5GrDg7","FwEJzChuy3","W3VFHdjsrv","TwanopFrrl",
+"fcwDadhSuH","Uvlv4AXpwE","HfyNQ8xEKz","HRxd8WaWsv","45cIHSbRYy","dmoS7CxVEf","FhtglMojnP","aDGtSECMvU","POUYSVprf2","ciuWzFwEJz",
+"atef2Zv7z0","rz7UtZv7z0","3otm6uQIcz","UmaEvrhl0J","MmKGJ7ku1p","gjUTu1j5L8","fqypyuupzk","BGaQYbgJAz","v1HlnDcpWB","uQIcz9rlg9",
+"rKDLJKsjRK","FhtglzQt6Q","s7Mxkdpe1v","EOE1oFFDui","VjCZqlweGy","yluBxd85a9","h1zcHl83Ud","djsrvv2eC3","BCxeCRACuj","iwzGky94nw",
+"RBhp05iGN5","cQOnvCfgr3","618DiDcpWB","dQ586lkMUA","5VZjSYOfrY","SWfouNxx9V","UlU3MFFDui","AIYUu0ao3l","JIqXiRACuj","aL6AJyEfy9",
+"rhl0J5Drn0","jzUqR0Wr5y","jiVBPQWxoT","pvgjSv8yFN","FnPFBlj07Q","WaWsvtuDyS","dhSuHgtCA5","zbIYYlH1kt","dQ5867Ow5C","24ARF9eoRc",
+"StlDJsoy9t","rz7UtRBhp0","nlaByoQ87r","yofH3oVQp6","Oz8yZFVMxo","cShY2nnP8o","mz8gxPb1pa","ciuWzjfREu","VjCZquN6r3","KsjRKNcICA",
+"nFqiklpF6W","Y1mC0lsQGo","fcJOyCxVEf","5ZaEzhe9IA","F6PT25ZaEz","0h1b1618Di","zqH0W8U2nU","FnPFB14FLR","hi5X7FFDui","djsrvXyPZN",
+"MmKGJ16lHc","MmKGJtvdkD","oVQp6RzaZA","SbRYyF6PT2","taOXKsx5Gl","29QAzCp3mZ","2ZHdk5ZaEz","Chuy3yluBx","M6qcGhSSvQ","FLsphIBe8k",
+"FxX9qEdBKc","HlUbFsuY4x","QssNCHzZT8","lsQGov8yFN","pmeCdX6Pin","cQOnvMezSW","VerEAsqVrf","4dEz6NOHsz","FFDuifcwDa","Oz8yZNAFuw",
+"nnP8omX2GE","NcICAsqVrf","Oz8yZM6qcG","GrDg7WDVWJ","TCgPpiqv4k","TCgPpaL6AJ","lweGycShY2","Nxx9VaDGtS","0PktIpv0i7","vLsmSThjNn",
+"14FLRZzJHW","yluBxVLTy6","Zv7z0lm0pD","NcICARpBQm","fLNg8yvOMI","KsjRKSs0Zu","nFqik6q6L9","fFDrJ618Di","WPmlxRkQke","Mkgy8NhXdu",
+"WMiS3S77LH","WreyPS77LH","hSSvQ0Wr5y","EoToP48cHL","K20wKFNYIM","JRJQBOUqFM","ciuWz14FLR","NOHsz0h1b1","FVMxo5nmWv","s4786vkCHH",
+"0MR5XRACuj","y94nwFVMxo","x3LDeFnPFB","GSQwj5drc6","ReKEWs7Mxk","S77LH0YAGH","HRxd8TCgPp","jzUqRCp3mZ","Cp3mZfFDrJ","StlDJt98iW",
+"EdBKcKASQ8","8U2nUuPX7G","7fKYUv2eC3","rKDLJK4GS8","4dEz6Dz1R3","xReecl83Ud","F6PT28FmFH","J2mQilj07Q","kB5nPReKEW","yluBxMm8si",
+"VBjhzJIqXi","7Ow5CcQOnv","bgJAzgf8rI","Mm8siVIlwP","0Kyfsdjsrv","B3qemFxX9q","v8yFNlkMUA","fqypyx3LDe","FnPFBFxX9q","hi5X7NOHsz",
+"5drc6oQ87r","KZamH5nmWv","JRJQBoVQp6","0PktI7Ow5C","SbRYyJKWYR","KASQ80YAGH","6q6L9RmDcr","ni2v15IhmG","7X3uyF6PT2","8TxD7EdBKc",
+"RBhp0uupzk","gf8rIcmXIX","48cHLh1zcH","JKWYRBpYhV","fcJOy8RCUA","Dz1R3KsjRK","dpe1v0MR5X","Kr8ysaL6AJ","HlUbFB3qem","5Mg9r7X3uy",
+"2ZHdkVerEA","t98iWGv3Fq","gIYvEfFDrJ","Uvlv4EdBKc","QnJ1SfaHir","SWfouxciqp","tAOsrbrhlQ","45cIHvLsmS","1v5hHWDVWJ","TCgPpGv3Fq",
+"IRh485ZaEz","DLhzM2ZHdk","Ta8f64dEz6","aFFssgf8rI","uN6r3uLtKs","64s8Nrz7Ut","5iGN5AgJHQ","UlU3Mulk41","uQIczQWxoT","FFDuimX2GE",
+"45cIHo8Uyd","TwanolkMUA","AIYUuxXTI4","v2eC3ZhwG1","hi5X78cVD3","tuDySzHF1q","3otm6FnPFB","lweGyWaim6","D6rByYw2oU","fmIK1yToGW",
+"No0Qbv1Hln","vLsmSPOUYS","5nmWvFwEJz","RzaZA9rlg9","Cp3mZ5iGN5","dQ58624ARF","MezSWZzJHW","Chuy3mz8gx","1j5L8azIWp","8RCUAlXFOB",
+"8cVD3gtCA5","hi5X7Q6Lix","FwEJz8cVD3","F6PT2aFFss","Vprf2ZJTXH","LewvM0Kyfs","B3qemy94nw","Ss0ZuTa8f6","MmKGJ9rlg9","zHF1q5VZjS",
+"EOE1ouZPqg","IKxdLs7Mxk","jfREu0YAGH","atef2TCgPp","BbwgAAXpwE","pmeCdEdBKc","ydG8UWMiS3","7hyVvsoy9t","ogLgcyEfy9","M3zXLpv0i7",
+"uoStwkB5nP","Vprf2LDk6f","t59lR9eoRc","ZzJHWI7p2a","YOfrYFxX9q","FnPFBStlDJ","MGlTFJKWYR","aez9ys7Mxk","X6Pin2ZHdk","D6rBy3weIF",
+"Cfgr3BpYhV","suY4xatef2","D6rByS77LH","ZUnqtSmGzv","nFqiktjQxs","qQxHPHfyNQ","Nxx9VhUTw7","WreyPCqqaD","sx5Gl0BmCy","4dEz6PYBf4",
+"TCgPpK4GS8","48cHLUmaEv","K4GS8Mm8si","RkQkeStlDJ","CxVEfNo0Qb","JkzUnQworu","RmDcr7lUXZ","Dz1R3qQxHP","55rfBReKEW","zz4ZUMGlTF",
+"s93MlXyPZN","55rfBuupzk","bgJAz7lUXZ","Yh1hFVerEA","RsQUqpvgjS","wDajXoGu6x","I7p2aQChxs","gIYvEBFkb8","5IhmGYh1hF","JkzUn0PktI",
+"CNHmvDLhzM","POUYSFLsph","5ZaEzFFDui","7lUXZW7cTs","5drc6tlILt","rhl0JMmsIo","RmDcr6AFT0","AIYUusuY4x","CxVEfvOqCE","ciuWzhe9IA",
+"JKWYRwDajX","taOXKtAOsr","tAOsrPb1pa","dQ586prNT6","IRh48FwEJz","LDk6faDGtS","8FmFHRxrsm","5nmWvOHaBz","tuDySRzaZA","FPfSEGv3Fq",
+"jzUqRjiVBP","uPX7G07n1c","aez9yiKqhr","OUqFMUlU3M","zFgtBxXTI4","FVMxobZLvS","AmdQdjzUqR","gIYvEfmIK1","No0QbhUTw7","J2mQiyofH3",
+"7lUXZDG4sT","tuDySDLhzM","8cVD3gf8rI","s47865Namm","QClRLAmdQd","blLA9MaJQs","lsQGoECMvU","uPX7GhE1Ql","MojnPQYxC0","7X3uyGSQwj",
+"jiVBPciuWz","oQ87rn8pJ9","pmeCdDG4sT","XflUquAWyp","xXTI4Uvlv4","KsjRKpWiOs","zmLYDEdBKc","piJSkFwEJz","ZUnqtfFDrJ","YOfrY6AFT0",
+"WMiS307n1c","i3pydlsQGo","brhlQuJScX","64s8N5nmWv","iB08l1LB1L","jtn0Xn8pJ9","W3VFH1v5hH","WPmlxhUTw7","07n1cGXdoH","AkKTk7hyVv",
+"o8UydUmaEv","qQxHPAOgEe","tjQxsuN6r3","29QAzrKDLJ","9eoRcZv7z0","TwanoCK5W7","0KyfsQnJ1S","s47861j5L8","IBe8k55rfB","AmdQdNOHsz",
+"Chuy3BCxeC","U3yw5aL6AJ","lkMUA2ZHdk","0YAGHb29RJ","5VZjSzFgtB","iB08lb29RJ","MaJQsdjsrv","SjskQulk41","ZhwG16q6L9","lViBvtl72W",
+"WmadAAOgEe","hSSvQFxX9q","AXpwEh1zcH","brhlQuAWyp","8FmFHFNYIM","zY1GYgtCA5","nnP8opiJSk","0ao3lSWfou","HlUbFjzUqR","aFFssfaHir",
+"zz4ZUNo0Qb","CxVEfZzJHW","xciqpEoToP","K20wKi3pyd","YjB9tZJTXH","uTacxS2Dfu","i3pyd2TRI7","lXFOBcQOnv","VIlwP1LB1L","pvgjSWaWsv",
+"0h1b1yToGW","fLNg8Qworu","yofH3MmsIo","fcwDaNhXdu","IjTwPogLgc","3weIFxciqp","NOHszZUnqt","WreyP3otm6","l83Udaez9y","4QMc9QWxoT",
+"14FLRjeskS","SbRYyECMvU","i7WMQaFFss","Yf2EcWmadA","Q6hMCa00b5","i3pydZJTXH","OHaBz7ku1p","FPfSEzQt6Q","uLtKsAOgEe","IjTwPyluBx",
+"P6bcgRBhp0","yvOMIXyPZN","RzaZAs4786","nFqikLDk6f","QWxoT0Wr5y","pAhR1zz4ZU","ThjNnx3LDe","VLTy62Yz7E","yEfy9aFFss","Ta8f6he9IA",
+"CIShGnlaBy","0BmCyrhl0J","n1pmOK4GS8","fcwDaMmsIo","fqypyAOgEe","VjCZqWMiS3","suY4xVLTy6","LbRTHqQxHP","l83Uddpe1v","F6PT2aL6AJ",
+"OUqFMWPmlx","hYBCKBFkb8","gIYvEBpYhV","jSjS3Qworu","Ta8f6hE1Ql","ix74rY1mC0","FNYIMNOHsz","DcpWBNcICA","vOqCEatef2","ZuDtDIRh48",
+"QChxsKZamH","s7MxkW7cTs","cmXIXuTacx","HfyNQJKWYR","n8pJ9Oz8yZ","Ul4a1FNYIM","oQ87rSbRYy","OHaBzfLNg8","pv0i7RsQUq","faHirzz4ZU",
+"VNCPdQWxoT","5ZaEz3weIF","Ul4a1zqH0W","HP433DQimp","AOgEe9XyT9","hSSvQRxrsm","gIYvEFcWrW","FhtglIn3NS","CdyBVGSQwj","0PktI580YD",
+"ThjNnFcWrW","uAWyplpF6W","618DiGXdoH","HRxd8jfREu","yluBxni2v1","hUTw7azIWp","2ZHdkYf2Ec","zz4ZUKZamH","5NammM6qcG","Oz8yZYOfrY",
+"WMiS3ZhwG1","I7p2aFcWrW","Fhtglrz7Ut","iqv4k9iGoT","qaofNReKEW","7fKYUCfgr3","LDk6fEdBKc","MezSWhUTw7","P6bcgpmeCd","7fKYUUl4a1",
+"Yw2oUatef2","0KyfsGSQwj","FxX9qgdQsS","JIqXinnP8o","iqv4kvLsmS","Mm8sitl72W","5VZjSpmeCd","hYBCKdpe1v","prNT6prNT6","IBe8kQssNC",
+"RACujiwzGk","4QMc9uupzk","OxWIHe6e4z","KZamHpiJSk","FxX9qb29RJ","mX2GEEdBKc","RBhp02TRI7","CIShGzmLYD","fmIK1gf8rI","MaJQsDz1R3",
+"kZANmi3pyd","dhSuHlweGy","QnJ1SPOUYS","SmGzvFhtgl","5VZjS48cHL","rKDLJEOE1o","yvOMIHP433","IKxdLVIlwP","CK5W7uN6r3","FNYIMtuDyS",
+"zQt6QFcWrW","9rlg9Chuy3","0Wr5yK4GS8","VNCPd0ao3l","VjCZq7fKYU","tlILtuN6r3","1v5hH8RCUA","QClRLgdQsS","lweGyrhl0J","HlUbFStlDJ",
+"LewvMOz8yZ","UlU3MtaOXK","JIqXirKDLJ","ydG8UlCMxy","ydG8U2ZHdk","i7WMQyofH3","O3iyQ5Drn0","IRh485iGN5","sqVrfUlU3M","GXdoHVBjhz",
+"WreyPKr8ys","vOqCE9y4lw","AgJHQ7fKYU","8TxD7Oz8yZ","5drc6AXpwE","2NslmYjB9t","Uvlv4a00b5","hYBCKkZANm","5drc6uvf7A","lj07QNxx9V",
+"ogLgcIjTwP","In3NS5Mg9r","yofH3ru4UG","SmGzvgdQsS","VBjhzK4GS8","yEfy9zmLYD","F6PT21LB1L","BCxeCpWiOs","MK07YDQimp","rz7UtUmaEv",
+"QYxC0SmGzv","iKqhrguMb8","FnPFBAIYUu","8RCUAcQOnv","KsjRKlCMxy","NOHszKsjRK","5VZjSU3yw5","JKWYRlXFOB","cQOnvcL0aE","ReKEW5Namm",
+"FVMxovLsmS","FnPFB8RCUA","KsjRKLbRTH","AmdQd7hyVv","HRxd89rlg9","aL6AJcShY2","QssNCUlU3M","EoToPiwzGk","4dEz6ZhwG1","wDajXFhtgl",
+"gdQsSK4GS8","gdQsSVjCZq","fLNg8v1Hln","nlaByPOUYS","DQimpksJby","UmaEvzqH0W","MezSWdhSuH","Vprf27X3uy","D6rBy5iGN5","48cHLBbwgA",
+"lXFOBMaJQs","atef2hi5X7","YOfrY7X3uy","GrDg79eoRc","lXFOBIn3NS","s4786ReKEW","lCMxy9XyT9","0h1b1fLNg8","4dEz6ReKEW","29QAzlXFOB",
+"2Yz7EIn3NS","14FLRuvf7A","FnPFBO3iyQ","JIqXiPOUYS","MaJQsLewvM","lViBvgf8rI","NAFuwXyPZN","zmLYDCIShG","kZANmLewvM","In3NSblLA9",
+"jSjS3e6e4z","YjB9tReKEW","C2Irc0BmCy","0PktIQChxs","QssNCQClRL","yToGWWaWsv","dpe1v16lHc","VNCPdMaJQs","GWqqXGSQwj","KZamHXflUq",
+"n8pJ9DG4sT","GrDg70PktI","sqVrfKsjRK","FxX9qMmKGJ","RsQUqCxVEf","AOgEeAgJHQ","iqv4kuoStw","Pb1paBFkb8","cL0aEMaJQs","sx5Gl618Di",
+"0h1b10PktI","No0QbB3qem","S77LHgf8rI","m4bxU48cHL","jS1ajtl72W","MK07YVNCPd","hUTw7m4bxU","iKqhrdmoS7","4W0Tl5ZaEz","7Ow5CgjUTu",
+"JIqXifLNg8","RACujv1Hln","HfyNQCfgr3","uLtKscShY2","AgJHQIBe8k","48cHL2ZHdk","VBjhzqaofN","lpF6WCIShG","prNT6jSjS3","IRh48ogLgc",
+"AgJHQZzJHW","Q6hMCdjsrv","n1pmOlH1kt","DcpWBFhtgl","b29RJazIWp","Cp3mZSjskQ","7X3uyCp3mZ","8hJdtoVQp6","lweGyQ6Lix","1v5hHe6e4z",
+"hYBCKNhXdu","sx5GlYf2Ec","K4GS8ogLgc","oVQp6v1Hln","zY1GYFVMxo","t59lRqQxHP","0MR5XpT8wu","AkKTkU3yw5","wiHrZpv0i7","dpe1vHfyNQ",
+"aL6AJfmIK1","M6qcGMezSW","wDajXO3iyQ","fcJOyLbRTH","TwanoSs0Zu","zHF1qiwzGk","iwzGk9GXkX","9eoRcv8yFN","v8yFNzFgtB","hE1QlzY1GY",
+"Q6LixCxVEf","2NslmZhwG1","GSQwj3otm6","BCxeCgdQsS","StlDJ580YD","cQOnvDG4sT","4W0TlD6rBy","0BmCy0Wr5y","jSjS3rKDLJ","Uvlv4wDajX",
+"Pb1paQssNC","KsjRKRBhp0","FVMxoPOUYS","U3yw5Chuy3","dpe1vW3VFH","s7MxkRpBQm","WDVWJDQimp","i3pydLDk6f","GWqqXvOqCE","6AFT0blLA9",
+"ulk4155rfB","5drc6ReKEW","hSSvQQ6hMC","6AFT0d85a9","EdBKc45cIH","iKqhr0Kyfs","cL0aEK20wK","Ul4a1Dz1R3","rz7UtzbIYY","P6bcgSWfou",
+"iB08lFFDui","K20wKGv3Fq","pv0i7Chuy3","OHaBzVjCZq","M3zXLqUJMd","2ZHdkCIShG","tjQxs2hEEU","hSSvQn1pmO","uZPqgix74r","Kr8ysQWxoT",
+"ciuWzjeskS","Q6hMCzQt6Q","ix74rgjUTu","wDajX0Kyfs","lm0pDAXpwE","HzZT87fsYM","MmsIoMGlTF","vkCHHRxrsm","dQ5865drc6","sx5GljiVBP",
+"F6PT2CK5W7","IKxdL9eoRc","hUTw7WreyP","o8UydpiJSk","fLNg8GWqqX","OUqFMprNT6","h1zcHgjUTu","RpBQmDz1R3","RkQkefqypy","POUYS0PktI",
+"ZJTXHlm0pD","SmGzvEoToP","2TRI7FjHXR","TwanoWMiS3","sqVrfyluBx","yToGWQYxC0","lkMUAmX2GE","xXTI4RpBQm","faHirAOgEe","MmsIoB3qem",
+"GXdoHOxWIH","ulk413otm6","618Dit59lR","XyPZNDQimp","Q6hMCyofH3","gIYvECxVEf","Waim6pAhR1","a00b5uoStw","zFgtBWDVWJ","IKxdL9GXkX",
+"wDajXoVQp6","i7WMQ8xEKz","29QAzYf2Ec","EdBKcOz8yZ","16lHckB5nP","9y4lwThjNn","JIqXiK20wK","HfyNQlH1kt","hSSvQ0YAGH","Qworud85a9",
+"9eoRcWmadA","9XyT9sx5Gl","oVQp6n8pJ9","aFFssuAWyp","5NammMezSW","0YAGHuJScX","IjTwPh1zcH","9iGoTzQt6Q","K4GS8hYBCK","QChxslCMxy",
+"aFFss5nmWv","pAhR1RkQke","GrDg7JXljW","ciuWzSWfou","tjQxssqVrf","KASQ8t59lR","F6PT2618Di","SmGzvfaHir","uJScXFhtgl","lpF6WvkCHH",
+"WMiS3aFFss","8xEKzAmdQd","gtCA5hE1Ql","uN6r3Yf2Ec","FVMxoy94nw","vLsmS9XyT9","qUJMd1j5L8","tvdkD0ao3l","QbxXcQYxC0","oQ87rxReec",
+"zz4ZUFhtgl","FxX9qRpBQm","No0Qb4W0Tl","GSQwj16lHc","suY4xiB08l","lj07QM6qcG","hUTw7D6rBy","aez9ynFqik","qUJMdHfyNQ","lXFOBCfgr3",
+"LbRTHuQIcz","Uvlv4rKDLJ","4QMc9brhlQ","iKqhra00b5","iwzGknFqik","ZhwG1jeskS","1LB1Lx3LDe","nFqikQYxC0","HfyNQHP433","uAWypZUnqt",
+"uJScXlj07Q","RACujS77LH","2NslmlweGy","xciqplkMUA","oVQp61LB1L","0YAGHiqv4k","aL6AJ4W0Tl","2NslmlpF6W","8FmFHTXQ0Z","zY1GYzY1GY",
+"CIShGlH1kt","QChxszHF1q","aFFss0Kyfs","BpYhV4dEz6","uPX7Ggf8rI","pAhR1RsQUq","pT8wuy94nw","ThjNnyvOMI","tAOsr8xEKz","Y1mC0K20wK",
+"FnPFBCIShG","7X3uyPb1pa","8FmFHStlDJ","9iGoTRACuj","1v5hHiqv4k","JkzUnFwEJz","O3iyQKASQ8","piJSkBbwgA","uTacxOUYuF","SjskQuZPqg",
+"DLhzMPOUYS","uupzk64s8N","Ss0ZuWaim6","07n1cVLTy6","Q6hMCwiHrZ","uoStwaFFss","55rfBQChxs","zbIYYW7cTs","jeskS7lUXZ","RsQUqCqqaD",
+"48cHLYh1hF","gdQsSuoStw","No0QbpmeCd","Gv3FqW7cTs","0PktIFFDui","8hJdtfmIK1","2TRI7FxX9q","yluBxJIqXi","vLsmStAOsr","brhlQt98iW",
+"VIlwPzHF1q","rKDLJnFqik","yEfy9dpe1v","O3iyQ0MR5X","zbIYYS77LH","iwzGkY1mC0","Cfgr3VerEA","8RCUAWaWsv","CNHmvChuy3","QworuQbxXc",
+"OHaBz9iGoT","lm0pDAkKTk","yEfy97lUXZ","W3VFHRpBQm","8xEKzUvlv4","euZA5Rxrsm","MezSWM3zXL","1v5hHIn3NS","tjQxsnFqik","zY1GYNhXdu",
+"ZuDtDt98iW","pT8wuOUYuF","uTacxoVQp6","AIYUud85a9","RBhp0QYxC0","Chuy3FjHXR","GrDg7yofH3","aFFss5drc6","lH1ktfaHir","WPmlxYOfrY",
+"CqqaDZuDtD","fcJOyjzUqR","8TxD7nnP8o","S2DfuIn3NS","d7vjMX6Pin","prNT6piJSk","guMb8POUYS","mX2GEJ2mQi","wiHrZ14FLR","07n1ckB5nP",
+"JJs5mx3LDe","lweGyjtn0X","IBe8kGrDg7","0KyfsjfREu","ru4UGnlaBy","KASQ8StlDJ","uZPqglH1kt","WMiS348cHL","XflUqJJs5m","uAWypQbxXc",
+"29QAzFFDui","pmeCdCp3mZ","HlUbFY1mC0","9XyT9n8pJ9","he9IAd7vjM","0Wr5yJ2mQi","Mkgy8I7p2a","soy9tciuWz","MaJQsVprf2","Yw2oUd7vjM",
+"QnJ1SRxrsm","0KyfskB5nP","i3pydFxX9q","tvdkDSs0Zu","LewvM14FLR","RBhp0FFDui","WaWsv8TxD7","AXpwE7lUXZ","d7vjMFjHXR","8cVD3Vprf2",
+"CK5W7ogLgc","0BmCyiqv4k","uupzkVNCPd","Dz1R3GrDg7","1j5L8MmsIo","m4bxUHzZT8","CK5W7CIShG","hE1QlQworu","rz7UtbgJAz","nlaBy0h1b1",
+"WDVWJ5Drn0","ReKEWi7WMQ","BGaQYdQ586","pvgjSGXdoH","DcpWBuQIcz","G1RhSZ4I1v","FhtglKr8ys","OUYuFv1Hln","kB5nPChuy3","s7MxkTCgPp",
+"MojnPZzJHW","FLsphoVQp6","7lUXZokgRi","kZANmD6rBy","WreyPpiJSk","JIqXiWreyP","MezSWcShY2","xciqp2Nslm","JKWYRwiHrZ","xXTI455rfB",
+"TXQ0ZS77LH","b29RJciuWz","WMiS3euZA5","S2Dfu0ao3l","uQIczTa8f6","2TRI7S77LH","Y1mC0Nxx9V","7hyVvM6qcG","oGu6xZhwG1","MezSWSmGzv",
+"sqVrfEoToP","LbRTHbZLvS","NhXduCxVEf","L7cGcyEfy9","LewvM2Yz7E","8FmFHcL0aE","t59lRzz4ZU","BpYhV6q6L9","jeskS7ku1p","nlaBy9XyT9",
+"MGlTFQbxXc","blLA9EOE1o","JIqXitlILt","L7cGculk41","FVMxoWDVWJ","vOqCEM6qcG","NAFuwAOgEe","dmoS7SjskQ","HfyNQfcJOy","jfREu55rfB",
+"2DREs0YAGH","EdBKc64s8N","IRh48IKxdL","1LB1LOHaBz","fmIK1FxX9q","v2eC3zY1GY","qQxHP9GXkX","7lUXZlm0pD","pvgjSVjCZq","v1HlnTCgPp",
+"lweGyPOUYS","K20wKRmDcr","bgJAzpiJSk","Oz8yZMmKGJ","uQIczrKDLJ","aez9yW3VFH","CK5W7QChxs","6q6L9MojnP","F6PT2ydG8U","WPmlxlkMUA",
+"29QAzlsQGo","WaWsvDQimp","Cp3mZyEfy9","2DREs5VZjS","NAFuwFjHXR","D6rBy7lUXZ","16lHcjSjS3","7Ow5C64s8N","BbwgA5drc6","Kr8ysCK5W7",
+"fcwDadpe1v","nlaBykZANm","0h1b1L7cGc","iKqhrk85Ae","uAWyp0YAGH","NOHszRmDcr","kZANmuvf7A","yToGWuAWyp","64s8NYjB9t","F6PT2sqVrf",
+"xReec5iGN5","Yh1hFydG8U","tjQxsDLhzM","o8UydzbIYY","M6qcGWmadA","uZPqg8cVD3","7ku1pm4bxU","bgJAz9eoRc","uAWypL7cGc","KZamHAOgEe",
+"MojnPnnP8o","0BmCy55rfB","VerEAUlU3M","7fsYMLDk6f","a00b5MmKGJ","1LB1LSjskQ","IKxdLUlU3M","ydG8Uh1zcH","5Drn0uJScX","4dEz6uJScX",
+"v1HlnyEfy9","rz7Ut14FLR","AOgEe4W0Tl","2Nslmmz8gx","tlILtm4bxU","K4GS8G1RhS","jzUqRru4UG","gIYvE9eoRc","9XyT9uN6r3","zFgtBChuy3",
+"wiHrZ0Kyfs","2ZHdkaFFss","9iGoTjS1aj","CdyBVo8Uyd","NAFuw0ao3l","pv0i7S2Dfu","Waim6mX2GE","QbxXcCqqaD","OUqFMU3yw5","WPmlxWMiS3",
+"tlILtJIqXi","he9IA0h1b1","JRJQBQChxs","QClRLtvdkD","tvdkDQworu","atef2fmIK1","jiVBPHRxd8","rhl0JFjHXR","WMiS3dmoS7","Q6hMCLewvM",
+"VIlwP5Drn0","OxWIHqaofN","VerEAix74r","BCxeCuoStw","Fhtgla00b5","s7Mxks4786","55rfB2Yz7E","tl72WHP433","Ul4a1okgRi","sqVrfPb1pa",
+"FPfSEZJTXH","FLsphMaJQs","nFqikD6rBy","wDajXNAFuw","lpF6WfcwDa","pv0i77lUXZ","0ao3lK4GS8","faHirDLhzM","yluBxZv7z0","2Nslmn8pJ9",
+"WPmlxuLtKs","xciqpuAWyp","pAhR1WmadA","MojnPYf2Ec","piJSkThjNn","0PktIFwEJz","5VZjSuAWyp","J2mQi7ku1p","YOfrYCK5W7","pv0i7zY1GY",
+"In3NSM3zXL","GrDg7Vprf2","8TxD7Q6Lix","IKxdL14FLR","NcICA7hyVv","JRJQBlm0pD","vOqCERACuj","VLTy6VLTy6","NAFuwSbRYy","uoStwmX2GE",
+"5ZaEz2DREs","iKqhr07n1c","kZANmYh1hF","B3qemqQxHP","lCMxyDLhzM","d7vjMbrhlQ","gdQsSqUJMd","d7vjMqQxHP","OxWIHjtn0X","K20wKF6PT2",
+"EOE1ogf8rI","7ku1pCdyBV","yToGW7X3uy","zbIYYni2v1","FGzgp2ZHdk","MmKGJlpF6W","bgJAzB3qem","9y4lw9iGoT","LbRTHGv3Fq","brhlQMmKGJ",
+"5VZjStjQxs","lsQGoLDk6f","uQIczrhl0J","zQt6QoVQp6","lm0pDcShY2","0Kyfs0BmCy","AIYUuyluBx","FwEJzOUqFM","M6qcG7X3uy","xciqpVLTy6",
+"fcwDaDLhzM","dhSuHsuY4x","7X3uyyEfy9","DcpWBaL6AJ","oVQp6SWfou","uN6r3WaWsv","QYxC0FPfSE","48cHLpAhR1","lpF6WzFgtB","AmdQdpAhR1",
+"nnP8oC2Irc","7Ow5C7ku1p","D6rByTa8f6","pT8wu0ao3l","faHir1j5L8","0Wr5ygdQsS","RBhp0Z4I1v","Z4I1vVerEA","HzZT8580YD","n8pJ9GXdoH",
+"lH1ktuPX7G","ix74rzQt6Q","pmeCdNOHsz","GSQwjFxX9q","2ZHdk7fsYM","GSQwjEoToP","2hEEUYjB9t","HRxd8DcpWB","prNT6618Di","t98iWNOHsz",
+"ECMvUzY1GY","FFDuiReKEW","GXdoHThjNn","QbxXc7fsYM","MojnPhYBCK","cL0aEuvf7A","yToGWd85a9","ix74rJkzUn","VNCPdhSSvQ","AgJHQRxrsm",
+"RzaZAuoStw","JJs5mFPfSE","LewvMCK5W7","qUJMdwDajX","zHF1qYh1hF","s4786WMiS3","jtn0X2Nslm","WmadAX6Pin","ZzJHWru4UG","dmoS7tuDyS",
+"soy9tUmaEv","1v5hHfmIK1","kZANmv1Hln","suY4xsoy9t","lweGy7Ow5C","vkCHH2ZHdk","Vprf2BGaQY","pFrrluTacx","Zv7z0tuDyS","SjskQcQOnv",
+"kB5nPU3yw5","tlILtrKDLJ","tl72WqUJMd","mX2GEVBjhz","PYBf4Kr8ys","ru4UGW3VFH","BpYhVIjTwP","b29RJulk41","VerEAVIlwP","8TxD7jzUqR",
+"7X3uyQYxC0","14FLRYOfrY","gIYvETCgPp","RkQkegtCA5","5ZaEzlCMxy","PYBf4lCMxy","h1zcHTwano","FNYIMYw2oU","IRh4829QAz","G1RhSzFgtB",
+"RACujFNYIM","Ss0Zu2DREs","14FLR7fsYM","ZzJHWYw2oU","4QMc9hSSvQ","FxX9qYjB9t","O3iyQn1pmO","qQxHPuN6r3","D6rByv2eC3","8cVD3MGlTF",
+"G1RhScmXIX","jzUqR4W0Tl","W7cTs7hyVv","MmsIoiqv4k","pWiOsfmIK1","ydG8U29QAz","FPfSEJIqXi","RBhp0tl72W","DLhzMvLsmS","MaJQsX6Pin",
+"BbwgAVBjhz","guMb8mX2GE","7fKYUzQt6Q","ogLgc8FmFH","uAWyptaOXK","t59lRmX2GE","s4786vLsmS","CqqaDhUTw7","Uvlv4GSQwj","iqv4kyofH3",
+"GrDg7jzUqR","PYBf4AmdQd","zqH0W45cIH","14FLR2TRI7","DcpWBqQxHP","s47867lUXZ","pWiOsbZLvS","uQIczQChxs","QssNC45cIH","lH1kt0ao3l",
+"ru4UGMm8si","i7WMQPb1pa","lH1ktFLsph","AgJHQ5nmWv","ZzJHWaDGtS","2TRI7PYBf4","fcwDafaHir","pv0i745cIH","MezSW29QAz","HP433B3qem",
+"uTacxYf2Ec","BCxeCoGu6x","gf8rIIRh48","NhXduvLsmS","RBhp0RACuj","Yh1hFQnJ1S","pAhR1gjUTu","JXljWVBjhz","uoStwFGzgp","FNYIMIn3NS",
+"vOqCEiwzGk","AIYUuKsjRK","P6bcgRxrsm","yEfy9ReKEW","AIYUuYOfrY","gjUTutAOsr","s4786Zv7z0","MK07Y9y4lw","AmdQdNxx9V","X6PinoVQp6",
+"aFFss3otm6","uAWypRBhp0","IBe8k0h1b1","suY4xuPX7G","lj07QlsQGo","FGzgpMK07Y","5drc6Uvlv4","ulk41tuDyS","Mkgy8Waim6","CK5W7lweGy",
+"RsQUqhe9IA","jzUqRaL6AJ","lweGyCxVEf","8xEKzpvgjS","kZANml83Ud","VIlwPCp3mZ","0Wr5yJkzUn","LDk6fZuDtD","JKWYRaDGtS","SjskQFjHXR",
+"ZUnqtoQ87r","i3pydfqypy","AgJHQ55rfB","6q6L96AFT0","ogLgclm0pD","Yw2oUcL0aE","VerEAjS1aj","d7vjM0PktI","wiHrZ48cHL","okgRicmXIX",
+"JXljWVIlwP","FVMxoMezSW","No0QbKZamH","Ta8f6OHaBz","Vprf2fmIK1","2hEEUoQ87r","zbIYY3weIF","IjTwP7ku1p","yofH3s7Mxk","YOfrYRpBQm",
+"0YAGHvOqCE","uvf7AtAOsr","AIYUuaez9y","W7cTsXflUq","gf8rI29QAz","o8UydogLgc","lweGyd85a9","WDVWJOUYuF","GSQwj55rfB","aez9yFPfSE",
+"Yf2EcMmsIo","VIlwP14FLR","gf8rIa00b5","tvdkDksJby","Waim6qQxHP","JkzUnni2v1","vkCHH2TRI7","OUqFMBpYhV","prNT6dpe1v","MojnPiKqhr",
+"64s8Nl83Ud","RkQkeogLgc","fFDrJoGu6x","KASQ8ciuWz","DG4sTni2v1","gdQsS7ku1p","Q6LixKr8ys","yToGWzQt6Q","ulk41jfREu","i3pydv2eC3",
+"WaWsvDz1R3","yvOMIP6bcg","No0QbguMb8","fmIK1xReec","dhSuHMmKGJ","CdyBVSbRYy","sx5GlIRh48","tlILtOUYuF","atef2FLsph","CxVEfCIShG",
+"oQ87r7fsYM","VNCPdiwzGk","Oz8yZ7fsYM","9eoRcdjsrv","2DREsJIqXi","CNHmv5ZaEz","8hJdtgdQsS","Mkgy88TxD7","DQimplweGy","7Ow5C45cIH",
+"2NslmciuWz","yToGWPYBf4","aez9y8U2nU","TwanolViBv","KZamHsx5Gl","Q6hMCYf2Ec","0Kyfs45cIH","CxVEfn8pJ9","1LB1Luvf7A","45cIHuAWyp",
+"0KyfsOUYuF","TXQ0ZVBjhz","HzZT8RACuj","Gv3FqOUqFM","QnJ1SX6Pin","DcpWBUvlv4","Dz1R3v2eC3","CNHmveuZA5","ru4UGO3iyQ","Yw2oUa00b5",
+"Nxx9VyToGW","07n1cjiVBP","CIShGuTacx","jzUqRo8Uyd","MojnPRkQke","okgRiguMb8","JRJQBgtCA5","48cHL8TxD7","iwzGkhYBCK","RsQUqtaOXK",
+"gIYvEL7cGc","euZA52DREs","d7vjMmz8gx","vOqCEMK07Y","Oz8yZ9rlg9","vOqCEVBjhz","yvOMISmGzv","hYBCKW3VFH","AgJHQFjHXR","BFkb8AIYUu",
+"FGzgp0PktI","W3VFHhYBCK","0YAGHlpF6W","U3yw5SjskQ","v2eC3MK07Y","pFrrlo8Uyd","B3qem0MR5X","LDk6fFGzgp","U3yw5WmadA","5Mg9rlpF6W",
+"TCgPpeuZA5","BCxeCzHF1q","ZUnqt3otm6","64s8NLbRTH","3weIFYjB9t","0h1b1pmeCd","X6PindhSuH","zmLYD8hJdt","ni2v1sx5Gl","dpe1vdpe1v",
+"5drc6t98iW","ni2v1U3yw5","RsQUqfmIK1","C2IrctvdkD","Oz8yZm4bxU","uQIczJRJQB","DcpWB2hEEU","o8UydSjskQ","Zv7z0gIYvE","HRxd8euZA5",
+"HlUbFpT8wu","cShY2WreyP","7hyVvoQ87r","yEfy94dEz6","9XyT9kB5nP","uZPqgB3qem","BpYhVSWfou","qUJMdqaofN","CNHmvyluBx","yvOMIyEfy9",
+"QbxXc9XyT9","iB08lCK5W7","C2IrclXFOB","tl72WP6bcg","CIShGgtCA5","e6e4z55rfB","FGzgpMojnP","Yf2Ec64s8N","FnPFBTXQ0Z","CxVEfPYBf4",
+"blLA9bgJAz","580YD5IhmG","9GXkXIRh48","zbIYYKZamH","ThjNnaFFss","5NammGrDg7","uQIczKZamH","B3qem0YAGH","M6qcGFNYIM","BGaQYzFgtB",
+"WDVWJECMvU","07n1cJXljW","CqqaDRACuj","FFDuitl72W","cmXIX0YAGH","7X3uydpe1v","8cVD3lj07Q","ulk41UmaEv","MGlTFChuy3","rKDLJJkzUn",
+"0YAGHyEfy9","v1HlnKsjRK","gdQsSVLTy6","ciuWzzHF1q","azIWp2TRI7","24ARFVBjhz","7lUXZMm8si","FcWrWprNT6","zqH0WLDk6f","580YDX6Pin",
+"fFDrJjS1aj","29QAztjQxs","i3pyd45cIH","kZANmcShY2","9iGoTFFDui","x3LDeMezSW","hUTw70PktI","iwzGkkB5nP","hYBCKIjTwP","he9IAuupzk",
+"9y4lwJIqXi","5NammRBhp0","lkMUAQnJ1S","nnP8oHRxd8","sqVrfFcWrW","7fKYUbZLvS","0h1b1NAFuw","uQIcz7ku1p","fqypyjtn0X","RkQkeCIShG",
+"ZhwG1v2eC3","fLNg8brhlQ","y94nwdmoS7","guMb8Qworu","RBhp0AgJHQ","ZuDtD9rlg9","ZUnqtFhtgl","RmDcrpvgjS","0PktIUmaEv","DG4sTzbIYY",
+"FLsph4QMc9","ksJbyBGaQY","dmoS7Ss0Zu","ReKEWAIYUu","sqVrftjQxs","S2DfuyvOMI","NcICAb29RJ","WmadAC2Irc","h1zcHn8pJ9","QbxXcpvgjS",
+"gdQsS2ZHdk","2ZHdk3otm6","MK07Ym4bxU","Nxx9V5VZjS","FcWrWCfgr3","JRJQByofH3","6q6L92Nslm","dpe1vZhwG1","dmoS7Yw2oU","RmDcryEfy9",
+"JRJQBNxx9V","sx5GlazIWp","UmaEvfqypy","i3pydNOHsz","vOqCE55rfB","ksJbyOxWIH","8FmFH4W0Tl","M3zXLQWxoT","k85AeNOHsz","OUYuFv8yFN",
+"uQIczjS1aj","vkCHHd7vjM","Oz8yZjzUqR","iKqhrprNT6","iKqhrzbIYY","DcpWBFFDui","v1Hln7Ow5C","v2eC3Rxrsm","o8UydYf2Ec","RzaZAmX2GE",
+"fLNg8YOfrY","jtn0XciuWz","OHaBzQbxXc","7hyVvFcWrW","HzZT87lUXZ","B3qemLewvM","AgJHQ8RCUA","GXdoHazIWp","HlUbFksJby","8cVD3ZzJHW",
+"oGu6xM6qcG","QChxsIjTwP","gIYvEpWiOs","ydG8UyluBx","BpYhVsqVrf","uLtKsOxWIH","5Drn0ZuDtD","yvOMIx3LDe","M6qcGJ2mQi","7fKYUMojnP",
+"ZzJHWpvgjS","d85a9OUqFM","DQimpStlDJ","FnPFBogLgc","CxVEfReKEW","lm0pD0Kyfs","ECMvUJ2mQi","ydG8UsuY4x","yvOMIv8yFN","QClRLNo0Qb",
+"zmLYD5Namm","Q6hMCYOfrY","RzaZA8RCUA","uLtKsMmKGJ","BFkb8i7WMQ","JkzUnfmIK1","iwzGkkZANm","B3qem7ku1p","lweGyVjCZq","n1pmObrhlQ",
+"ogLgc7ku1p","45cIHpT8wu","n8pJ9kB5nP","RmDcrFnPFB","7X3uyMojnP","gf8rIxciqp","he9IA9rlg9","d7vjMJRJQB","zFgtB4dEz6","lweGyHlUbF",
+"JRJQByToGW","lweGyhSSvQ","djsrvTXQ0Z","hUTw78FmFH","SWfounFqik","sx5Gl8U2nU","FPfSENcICA","0ao3l5iGN5","618DiB3qem","ni2v1cmXIX",
+"cShY2SbRYy","GWqqXNAFuw","Kr8ysyEfy9","NhXdupWiOs","AkKTkuAWyp","blLA90Kyfs","CK5W7QWxoT","WreyPQbxXc","uZPqgMojnP","M3zXLhE1Ql",
+"CK5W7O3iyQ","k85AeIRh48","uTacxpmeCd","he9IAAOgEe","yToGWpAhR1","Yw2oUFPfSE","uZPqgThjNn","hE1QlKsjRK","ZJTXHvkCHH","tlILtdmoS7",
+"dQ586zmLYD","AmdQdMaJQs","xReecuTacx","EOE1o1v5hH","dQ586faHir","JJs5mPYBf4","ciuWzBCxeC","BGaQYMmKGJ","IjTwP1LB1L","P6bcgDQimp",
+"ZhwG15iGN5","NAFuw5VZjS","J2mQi2Nslm","s93MloQ87r","RsQUqS2Dfu","wDajX580YD","a00b5fFDrJ","uvf7AVBjhz","JkzUnuPX7G","BpYhVYOfrY",
+"PYBf407n1c","HlUbFGXdoH","lViBvBGaQY","FFDuiulk41","HzZT88RCUA","CK5W7vkCHH","uvf7AS77LH","zbIYYtuDyS","n1pmOoVQp6","aFFssGrDg7",
+"ulk410BmCy","JXljWa00b5","BbwgABFkb8","fqypymX2GE","24ARFFwEJz","t98iWzY1GY","55rfBGSQwj","x3LDewDajX","y94nwX6Pin","Yh1hFWPmlx",
+"8RCUAPOUYS","UmaEv7Ow5C","KsjRK2TRI7","2TRI7tAOsr","taOXKaL6AJ","ix74rzqH0W","tvdkDDQimp","ECMvUjSjS3","uoStwrz7Ut","2Yz7EzmLYD",
+"No0QbjiVBP","FhtglCNHmv","pAhR1cmXIX","pAhR1WMiS3","6AFT0Yw2oU","h1zcHjS1aj","uPX7GS77LH","EdBKcLbRTH","QnJ1SOUYuF","b29RJPb1pa",
+"rhl0Jn8pJ9","07n1c7fKYU","cQOnvuJScX","pT8wuokgRi","FFDuiQYxC0","suY4xi3pyd","NOHszMmKGJ","0YAGHDLhzM","gIYvEulk41","1v5hHB3qem",
+"pmeCdSmGzv","ZuDtDsuY4x","JKWYR6AFT0","tlILtGrDg7","7ku1p5drc6","lXFOBlsQGo","Ss0Zuulk41","AIYUuuLtKs","F6PT2Zv7z0","14FLRoVQp6",
+"MK07YvkCHH","he9IAY1mC0","Ul4a1WMiS3","2Yz7Es7Mxk","ZUnqtzFgtB","FNYIMKr8ys","FcWrWXflUq","Z4I1vJRJQB","Yf2EcQssNC","0BmCyd7vjM",
+"s93Ml6AFT0","yofH3K20wK","iwzGkIn3NS","RACujM6qcG","CIShGzz4ZU","brhlQ6AFT0","cL0aE8TxD7","XyPZNRpBQm","BCxeClj07Q","JkzUn16lHc",
+"W7cTsNcICA","pAhR1uAWyp","vkCHHQChxs","xReeccQOnv","kB5nPokgRi","5drc6QssNC","CqqaD618Di","oVQp6bZLvS","piJSkMmKGJ","XflUqe6e4z",
+"atef2s93Ml","sx5GlprNT6","7fsYMjeskS","8RCUApv0i7","S2Dfu9y4lw","wiHrZX6Pin","uN6r3kB5nP","okgRi8cVD3","Mkgy84dEz6","1LB1LHRxd8",
+"pv0i7pvgjS","OUYuFStlDJ","FxX9qPb1pa","nlaByulk41","EdBKc8hJdt","HP433v8yFN","zHF1qtl72W","RxrsmXyPZN","QWxoTd7vjM","tl72W0YAGH",
+"FFDuihi5X7","CK5W7bZLvS","jeskSt98iW","1v5hHh1zcH","euZA54QMc9","1v5hHHP433","LDk6fFxX9q","atef25Drn0","OUqFMLbRTH","FFDuiTa8f6",
+"zz4ZUulk41","GrDg7WaWsv","ciuWzDQimp","1j5L8pAhR1","iwzGkG1RhS","M6qcGgf8rI","WPmlxTXQ0Z","HP433pWiOs","5Drn0SmGzv","W7cTs1v5hH",
+"v8yFN0Wr5y","Chuy3atef2","HzZT8POUYS","POUYSZhwG1","guMb8PYBf4","y94nwxXTI4","zQt6QDQimp","gIYvEC2Irc","n1pmO24ARF","CK5W7JkzUn",
+"he9IADz1R3","xXTI4Q6hMC","fLNg8Z4I1v","rhl0JCp3mZ","e6e4zHzZT8","QClRLAIYUu","8RCUAHRxd8","kB5nPnlaBy","n8pJ9blLA9","Yf2EcXflUq",
+"24ARF29QAz","Q6Lixlj07Q","cShY2aFFss","SWfouBpYhV","JIqXifqypy","sx5GlXyPZN","aDGtSuupzk","dmoS7y94nw","fmIK1wiHrZ","7fKYU1j5L8",
+"WreyPNAFuw","lj07QDQimp","RpBQmni2v1","4dEz6zbIYY","uLtKsZuDtD","oVQp6ciuWz","v2eC3QssNC","F6PT2FFDui","RACujtlILt","pAhR1AOgEe",
+"yvOMIRBhp0","iqv4kzY1GY","nlaByyEfy9","jiVBPMkgy8","TwanoMGlTF","L7cGcL7cGc","d7vjMuAWyp","Mkgy8RACuj","P6bcgCdyBV","NOHszlViBv",
+"EOE1osqVrf","CqqaD55rfB","QssNCFFDui","cQOnvpAhR1","Dz1R3pvgjS","cmXIXHlUbF","lkMUACp3mZ","vkCHHpv0i7","9GXkXJKWYR","BFkb8EdBKc",
+"CK5W7KASQ8","t98iWL7cGc","16lHcOxWIH","0ao3lZv7z0","QbxXc4dEz6","suY4xhe9IA","Ta8f65IhmG","I7p2a3otm6","rz7UtlH1kt","faHircmXIX",
+"EoToP1j5L8","s93Mllm0pD","No0QbgtCA5","IRh48lpF6W","2Yz7EMezSW","JXljWQbxXc","FjHXRIRh48","lkMUAlj07Q","3otm6atef2","7lUXZFjHXR",
+"ru4UG7fKYU","x3LDesqVrf","s4786Y1mC0","FVMxozqH0W","Zv7z0okgRi","lweGyblLA9","3otm6jzUqR","e6e4zHP433","DG4sTK20wK","mX2GEYf2Ec",
+"k85AeoGu6x","iwzGk14FLR","pT8wuKsjRK","RsQUqv1Hln","dmoS7KsjRK","GSQwjaez9y","NcICAD6rBy","Ta8f6n1pmO","BFkb8Gv3Fq","ksJbyk85Ae",
+"bgJAz16lHc","Z4I1viKqhr","NAFuwXflUq","IjTwP8U2nU","WaWsvzHF1q","SWfoupFrrl","PYBf4brhlQ","AmdQdDQimp","IBe8k1LB1L","ciuWzNhXdu",
+"AkKTkyToGW","zFgtBtuDyS","S77LH14FLR","OHaBznnP8o","RzaZA5iGN5","EdBKcFLsph","Mm8siAgJHQ","sx5GlQClRL","mX2GEK4GS8","FcWrWNxx9V",
+"lH1ktOz8yZ","AgJHQpv0i7","prNT6RzaZA","b29RJblLA9","rKDLJQChxs","iqv4kd7vjM","Oz8yZZ4I1v","6q6L9bgJAz","WMiS3uAWyp","M6qcGjtn0X",
+"LewvMZ4I1v","taOXKIn3NS","9iGoT4W0Tl","uPX7Gulk41","MK07YZv7z0","piJSkU3yw5","LewvMuoStw","9rlg9FNYIM","580YDWaWsv","ydG8UDG4sT",
+"ZuDtDuQIcz","lkMUAFNYIM","kZANmSs0Zu","X6Pini3pyd","0BmCy45cIH","brhlQRmDcr","In3NS2Yz7E","s7MxkIjTwP","ECMvUlsQGo","48cHL7fsYM",
+"yluBxzHF1q","Waim6zFgtB","cShY2wiHrZ","mz8gxt98iW","K20wKO3iyQ","YOfrY1LB1L","RsQUq9eoRc","24ARF1LB1L","WaWsvtlILt","yluBxciuWz",
+"5ZaEzQYxC0","uQIczuLtKs","8cVD30PktI","M3zXLjzUqR","iqv4ktvdkD","8hJdtkZANm","2TRI7ThjNn","dhSuHfFDrJ","fLNg8LDk6f","5iGN5vOqCE",
+"k85AeOHaBz","6AFT0FnPFB","0YAGHtuDyS","VBjhzuTacx","LDk6fRzaZA","QChxsHP433","he9IA0MR5X","zQt6Q0PktI","hi5X7uPX7G","P6bcg4W0Tl",
+"Q6hMCK4GS8","Pb1paDG4sT","0MR5X2DREs","tvdkDL7cGc","M3zXLmz8gx","uLtKsrz7Ut","JKWYRRACuj","oGu6xzHF1q","Waim63weIF","HP433XyPZN",
+"HfyNQzY1GY","0BmCys93Ml","tjQxsIBe8k","LewvMlweGy","dpe1vJ2mQi","tl72WzmLYD","GrDg7y94nw","uTacx0ao3l","QbxXce6e4z","zY1GYCp3mZ",
+"atef2O3iyQ","CdyBVTa8f6","U3yw5sqVrf","GXdoHOUYuF","prNT6KASQ8","NOHszF6PT2","xXTI4VLTy6","s7MxknFqik","NhXduEOE1o","8cVD3rz7Ut",
+"In3NS0Wr5y","Ta8f6pT8wu","8xEKzKsjRK","uTacxRkQke","e6e4ze6e4z","m4bxUwiHrZ","Gv3Fq2DREs","EOE1oe6e4z","prNT6Vprf2","2Yz7E5Namm",
+"gjUTuJRJQB","8U2nUuN6r3","VLTy6UmaEv","yToGWzY1GY","euZA5ciuWz","AOgEee6e4z","zqH0W4dEz6","LbRTH7lUXZ","soy9tEoToP","BpYhVvOqCE",
+"S77LHMezSW","ZzJHWfLNg8","2NslmHzZT8","MojnPMaJQs","yofH3kB5nP","7Ow5CYh1hF","EoToPiqv4k","4dEz6zHF1q","HRxd8GWqqX","Q6LixnnP8o",
+"dmoS75Mg9r","PYBf4i3pyd","4W0Tl9eoRc","fcJOyuPX7G","FjHXR5IhmG","AIYUuQWxoT","9iGoTfFDrJ","lweGyAkKTk","9GXkXW7cTs","1j5L8Gv3Fq",
+"uvf7ADLhzM","AOgEe7hyVv","FjHXRyofH3","Q6hMCOUqFM","WmadAS2Dfu","HfyNQkB5nP","9eoRcUmaEv","t59lRUl4a1","Vprf2rz7Ut","ulk41mX2GE",
+"QClRLprNT6","0BmCyS2Dfu","lH1ktpvgjS","2Yz7EZ4I1v","ydG8UiB08l","iqv4kCK5W7","7X3uybrhlQ","K20wKfcJOy","aDGtSChuy3","ni2v1RzaZA",
+"MaJQs0ao3l","IBe8kJKWYR","QworuBCxeC","IKxdLy94nw","s93MlP6bcg","MK07YjeskS","S77LHgdQsS","EoToPQWxoT","ReKEWiwzGk","SjskQbZLvS",
+"jSjS324ARF","lpF6WoVQp6","8hJdtkB5nP","U3yw5JIqXi","i7WMQStlDJ","MaJQsDG4sT","O3iyQzz4ZU","1j5L8BGaQY","No0QbMmsIo","HfyNQHRxd8",
+"SmGzv7fKYU","Y1mC0IjTwP","WDVWJiKqhr","bgJAzvLsmS","HfyNQuLtKs","WDVWJzHF1q","guMb8ogLgc","ECMvUOxWIH","v2eC3VBjhz","WMiS3pT8wu",
+"07n1ccQOnv","pmeCdazIWp","yvOMIlkMUA","BbwgAGrDg7","uPX7GBGaQY","580YDuZPqg","yofH3YOfrY","GWqqXgdQsS","45cIHe6e4z","5drc6O3iyQ",
+"qQxHPW7cTs","OUqFMBbwgA","hYBCKrz7Ut","Q6hMCQworu","PYBf4WreyP","QClRLLbRTH","0MR5Xsoy9t","UmaEvBpYhV","zz4ZUiqv4k","VNCPdzQt6Q",
+"s93MliB08l","uN6r3he9IA","TwanoAmdQd","YOfrYCIShG","GXdoHZJTXH","DLhzMtvdkD","nFqiknlaBy","wiHrZwiHrZ","Kr8ysYOfrY","tlILtqaofN",
+"qQxHP618Di","wiHrZKr8ys","Mm8siFxX9q","29QAzHzZT8","guMb8cQOnv","s93MlY1mC0","M6qcGNAFuw","iB08lBbwgA","0PktIjiVBP","7hyVvdhSuH",
+"dQ586P6bcg","RsQUqlsQGo","5VZjSJRJQB","WPmlxciuWz","iB08lDz1R3","2ZHdkhi5X7","5IhmGYw2oU","t59lRW7cTs","d7vjMMezSW","0MR5XCNHmv",
+"fqypypFrrl","jzUqRbgJAz","x3LDepFrrl","x3LDeuTacx","SmGzvMaJQs","FFDuizbIYY","QssNCFLsph","azIWp8FmFH","Nxx9Vaez9y","ksJbymX2GE",
+"rz7UtFNYIM","EoToPcShY2","0BmCyChuy3","0KyfsOUqFM","Ta8f6CK5W7","t98iWW3VFH","RkQkeHP433","RpBQmW7cTs","iqv4kfmIK1","azIWpwiHrZ",
+"s93Ml8xEKz","0MR5XVprf2","2ZHdkBpYhV","b29RJ8xEKz","gdQsSrz7Ut","Yh1hFIBe8k","M3zXL8RCUA","tuDyStl72W","16lHcsoy9t","55rfBUmaEv",
+"IRh48Yh1hF","SjskQ6AFT0","qaofN45cIH","DG4sTX6Pin","TCgPppWiOs","uPX7Gjtn0X","NAFuwTa8f6","uJScXdjsrv","gIYvE4QMc9","aFFssBCxeC",
+"e6e4zpAhR1","BbwgAFFDui","FwEJzC2Irc","Q6hMCx3LDe","yvOMIpv0i7","iqv4kzz4ZU","0KyfsaFFss","suY4xWPmlx","8RCUA14FLR","GXdoHcQOnv",
+"o8UydxXTI4","tvdkDCIShG","wDajXtAOsr","h1zcHuZPqg","Z4I1vxciqp","NcICAtaOXK","jeskS16lHc","zqH0WJIqXi","cShY2bZLvS","8U2nUFNYIM",
+"gtCA57lUXZ","n1pmOECMvU","5drc6fqypy","UlU3MnFqik","IRh48aDGtS","ReKEWYjB9t","MmKGJ7Ow5C","KZamH0YAGH","9y4lwcShY2","mX2GERkQke",
+"Kr8ysHRxd8","CIShGy94nw","W3VFHUmaEv","DLhzMEoToP","Yh1hFSs0Zu","he9IAO3iyQ","CdyBVrz7Ut","TwanowiHrZ","29QAzoGu6x","FjHXRZuDtD",
+"MaJQsn1pmO","uLtKslkMUA","FGzgpd85a9","CK5W7NhXdu","0Kyfsiqv4k","0Wr5yl83Ud","S2Dfu6q6L9","jzUqRprNT6","5VZjSCdyBV","QClRLogLgc",
+"S77LH580YD","BbwgAjzUqR","yluBx8FmFH","0KyfsCIShG","MmKGJkZANm","JKWYRjeskS","8RCUA7lUXZ","ZhwG18cVD3","uTacxsuY4x","TCgPptjQxs",
+"Yf2EcHP433","QClRLAOgEe","bZLvSpiJSk","faHirL7cGc","FPfSE9iGoT","K4GS8UlU3M","tjQxsC2Irc","GXdoHU3yw5","NcICAqaofN","oGu6xiB08l",
+"BpYhVUl4a1","JkzUni3pyd","1LB1LIKxdL","2DREsfFDrJ","BCxeC8U2nU","OHaBzG1RhS","tjQxslkMUA","nnP8oFNYIM","jiVBP0Wr5y","FGzgpPb1pa",
+"jiVBPNhXdu","M6qcGWPmlx","nlaByZUnqt","HRxd8IKxdL","kZANmlpF6W","dpe1vM6qcG","CIShGKsjRK","Kr8yskB5nP","SmGzvPb1pa","ZUnqt07n1c",
+"4W0TlNcICA","SmGzvZ4I1v","OUqFMnlaBy","MGlTFtAOsr","pv0i7cL0aE","hYBCKStlDJ","uoStwcShY2","FPfSELbRTH","6q6L9DQimp","64s8N6AFT0",
+"ZhwG1FGzgp","3weIFIn3NS","Oz8yZazIWp","qQxHPUmaEv","5NammuZPqg","FcWrW29QAz","7fKYUuQIcz","s4786ciuWz","SjskQSjskQ","prNT68hJdt",
+"oVQp6bgJAz","8TxD7RsQUq","t59lRdmoS7","JJs5mDLhzM","Waim6FFDui","In3NSQ6Lix","FFDuiZJTXH","9eoRc0Wr5y","cmXIXuoStw","GXdoHlsQGo",
+"FwEJzM6qcG","jeskS5IhmG","0PktIcQOnv","1LB1LlweGy","Qworu1j5L8","pvgjSWaim6","cShY2hi5X7","ECMvU6AFT0","8FmFHmX2GE","BGaQYGv3Fq",
+"jzUqRJ2mQi","8TxD79iGoT","618Di48cHL","RzaZAgIYvE","rKDLJhUTw7","0h1b15VZjS","v2eC3iKqhr","Yf2Ecs7Mxk","6q6L9tjQxs","cmXIXPb1pa",
+"pvgjSQClRL","1LB1L1v5hH","zbIYYdmoS7","9eoRcjiVBP","6AFT0CxVEf","9XyT9MmKGJ","No0QbCxVEf","GrDg7uupzk","RpBQmix74r","Oz8yZ0PktI",
+"d7vjMvkCHH","YOfrYQnJ1S","rKDLJzqH0W","uZPqgQnJ1S","soy9tPb1pa","jS1aje6e4z","JIqXiHfyNQ","pvgjSyvOMI","CxVEfOUYuF","UmaEvBFkb8",
+"LbRTHMK07Y","t98iWxReec","nnP8ojfREu","8RCUAtaOXK","qUJMdlH1kt","RACujJIqXi","uvf7AJKWYR","gIYvEZ4I1v","s7Mxkb29RJ","K4GS8pT8wu",
+"t98iW29QAz","Yf2EclweGy","S77LHVIlwP","I7p2ai7WMQ","atef2J2mQi","1j5L88FmFH","BpYhVuQIcz","Vprf29y4lw","l83UdvkCHH","L7cGc9y4lw",
+"WaWsvBCxeC","BpYhVksJby","XyPZN9rlg9","ZUnqtnlaBy","8TxD7v8yFN","MmsIoZhwG1","CK5W7EdBKc","SbRYyBFkb8","AkKTkZUnqt","kZANmQbxXc",
+"uN6r3dpe1v","nlaByTXQ0Z","7ku1pVNCPd","Z4I1vMmKGJ","CqqaDJkzUn","gtCA5BpYhV","uupzkm4bxU","DQimppFrrl","RACujCK5W7","gjUTuB3qem",
+"IKxdLyofH3","suY4xHRxd8","LDk6fQWxoT","uN6r3Y1mC0","3otm6RpBQm","gtCA53otm6","jfREuP6bcg","Mm8siSWfou","45cIHQ6hMC","IBe8kM6qcG",
+"DG4sT2ZHdk","8U2nUv2eC3","AIYUuReKEW","pAhR1HzZT8","uZPqgsx5Gl","MaJQsEoToP","DG4sTAXpwE","h1zcH1v5hH","0h1b1ZuDtD","HP433KZamH",
+"ZJTXHEdBKc","nnP8oUvlv4","3weIFuQIcz","kB5nPQYxC0","bgJAzDLhzM","xReec5Namm","Gv3FqVerEA","uoStwU3yw5","Cfgr31LB1L","sqVrfYh1hF",
+"1LB1L8xEKz","Nxx9V9GXkX","vOqCEXflUq","EOE1oWreyP","TCgPpGWqqX","2Yz7Eh1zcH","VerEAh1zcH","ksJbyfcJOy","h1zcHgtCA5","CdyBVokgRi",
+"tjQxsRkQke","POUYS7Ow5C","a00b5Cfgr3","9eoRcOz8yZ","GSQwjMmKGJ","8cVD3qaofN","QworujzUqR","7ku1ppmeCd","Nxx9VWaim6","6q6L9ZzJHW",
+"aDGtS5Mg9r","I7p2aWreyP","bZLvSStlDJ","aL6AJ9XyT9","7lUXZuN6r3","2NslmPYBf4","PYBf4oVQp6","580YDMojnP","8FmFHzmLYD","a00b5DcpWB",
+"AkKTkuZPqg","t98iWhYBCK","pFrrl5Namm","GWqqXbrhlQ","7Ow5CVerEA","AXpwE2TRI7","FjHXR07n1c","StlDJ9GXkX","6AFT0tlILt","D6rByuJScX",
+"jS1ajMmsIo","YjB9taFFss","BGaQYvLsmS","Yw2oUZ4I1v","7fKYU48cHL","zmLYDi7WMQ","FnPFBOxWIH","lj07QJXljW","QbxXccmXIX","d7vjMAIYUu",
+"uQIczZUnqt","Z4I1voQ87r","v2eC3RzaZA","NcICAtuDyS","tuDySZUnqt","LewvMaDGtS","8TxD7Z4I1v","MK07YlpF6W","zqH0WhSSvQ","faHirPOUYS",
+"7lUXZMojnP","LbRTH0h1b1","pAhR1RmDcr","OxWIHGXdoH","DLhzMTwano","FcWrWOUYuF","okgRiS77LH","3weIFMkgy8","tjQxs45cIH","iB08lWPmlx",
+"Vprf2NAFuw","lCMxy5drc6","x3LDeLbRTH","MezSWKsjRK","HRxd8iqv4k","8xEKzLbRTH","suY4xoQ87r","Gv3FqS2Dfu","zQt6QWMiS3","he9IAdpe1v",
+"KsjRKuupzk","RxrsmdmoS7","BFkb8MaJQs","8hJdt2ZHdk","Oz8yZlm0pD","fcJOypT8wu","iqv4khYBCK","sqVrf2Nslm","9GXkXQworu","24ARF5iGN5",
+"Yh1hFcL0aE","CNHmvh1zcH","CIShG4W0Tl","AIYUuO3iyQ","fcJOybrhlQ","qaofNyToGW","RzaZA6q6L9","CqqaDpiJSk","CNHmvRpBQm","RsQUqOUqFM",
+"0PktIFnPFB","HlUbF2ZHdk","OUqFMpWiOs","NhXdu8RCUA","euZA5MojnP","Pb1pa5Namm","QYxC0S2Dfu","kB5nPyluBx","16lHczQt6Q","fFDrJzqH0W",
+"l83UdEOE1o","RsQUqHP433","DQimpJIqXi","RxrsmzmLYD","CqqaDIBe8k","TXQ0Z5nmWv","FLsphRpBQm","580YDjzUqR","0MR5XkZANm","MmKGJYf2Ec",
+"uoStwQChxs","9iGoTCp3mZ","cL0aEL7cGc","5Drn0bZLvS","LewvMCxVEf","Chuy3F6PT2","uN6r3tvdkD","F6PT27fKYU","2ZHdkNcICA","xciqpU3yw5",
+"gf8rIIn3NS","55rfB5iGN5","jiVBP16lHc","O3iyQKr8ys","3weIFfLNg8","9y4lwMm8si","s7Mxkhe9IA","gf8rIMojnP","WaWsv5Mg9r","qaofNDG4sT",
+"W3VFHIKxdL","D6rByv1Hln","FcWrWgtCA5","5ZaEzDQimp","hUTw7OHaBz","NOHszlH1kt","5VZjSIKxdL","n8pJ9FLsph","JIqXidjsrv","fcJOyD6rBy",
+"fmIK1Mm8si","8FmFHhUTw7","iKqhrJJs5m","Ta8f6cShY2","tjQxsW7cTs","8xEKzfcJOy","No0QbuN6r3","bZLvSI7p2a","GWqqXSWfou","taOXKZ4I1v",
+"5ZaEzuZPqg","CK5W7s93Ml","WMiS3No0Qb","tlILtCfgr3","MmKGJQChxs","lH1kt7X3uy","FnPFB2ZHdk","MojnPpWiOs","PYBf4zQt6Q","M3zXLWaim6",
+"WreyPQClRL","lkMUAfmIK1","64s8NWaWsv","Z4I1vvkCHH","5IhmGuupzk","LDk6fUlU3M","zbIYY9GXkX","ulk41KZamH","YjB9tZ4I1v","piJSkiwzGk",
+"0BmCyWMiS3","5nmWvcmXIX","7fKYUMaJQs","7ku1pThjNn","lpF6W1j5L8","yvOMIXflUq","Cp3mZFwEJz","s4786Ss0Zu","2hEEUTwano","24ARFJ2mQi",
+"HlUbFOUYuF","M6qcGsx5Gl","nFqiki3pyd","fqypy618Di","Chuy3lXFOB","cShY2580YD","yEfy9s4786","3otm6xciqp","AmdQdWreyP","ZJTXH1LB1L",
+"DG4sTaL6AJ","S2DfuQworu","7Ow5CUmaEv","t59lRydG8U","FGzgpB3qem","IKxdLCxVEf","fqypyh1zcH","BbwgAU3yw5","ZUnqtVIlwP","ulk41gtCA5",
+"uQIczNhXdu","XyPZNFjHXR","oQ87roVQp6","DQimpi3pyd","blLA98FmFH","3otm6AmdQd","JJs5mlj07Q","CdyBVCdyBV","9eoRcblLA9","FVMxoGXdoH",
+"ZuDtDiKqhr","Chuy3AIYUu","Oz8yZJIqXi","07n1cn1pmO","S2DfuuQIcz","QssNCv1Hln","pmeCdQChxs","fcJOyaFFss","Ta8f6Chuy3","4W0TlaFFss",
+"SbRYyv8yFN","zmLYDh1zcH","n8pJ9fFDrJ","rhl0JP6bcg","0Wr5yjzUqR","pAhR1euZA5","cShY2zbIYY","mz8gx0YAGH","o8Uyd0MR5X","Yf2Eck85Ae",
+"9XyT9xciqp","Cp3mZy94nw","K20wKM6qcG","pT8wutjQxs","m4bxU45cIH","v1HlnBbwgA","Mkgy80BmCy","v2eC3o8Uyd","RmDcrFxX9q","xciqp7hyVv",
+"i3pydW3VFH","WreyP29QAz","MmKGJPYBf4","zz4ZUCxVEf","StlDJRmDcr","zFgtBYh1hF","FFDuiCfgr3","FVMxoQworu","OUqFMiwzGk","3otm6JXljW",
+"suY4xZuDtD","y94nwgdQsS","IRh485drc6","dmoS7QYxC0","vkCHHuoStw","KZamHNOHsz","IKxdL8xEKz","I7p2aGXdoH","KZamHIn3NS","QChxslH1kt",
+"KZamHJJs5m","16lHcMK07Y","y94nwJkzUn","F6PT2W3VFH","he9IAfqypy","uN6r3cQOnv","FcWrWjzUqR","CdyBVi7WMQ","jiVBPvkCHH","5NammuPX7G",
+"6q6L9Fhtgl","JIqXiuLtKs","d85a9b29RJ","1j5L8S2Dfu","jtn0XM6qcG","QChxsMmsIo","uZPqgs4786","LbRTHm4bxU","BpYhVzY1GY","KASQ8wDajX",
+"5ZaEzazIWp","uupzkx3LDe","xciqpBpYhV","AkKTkPYBf4","uJScX3otm6","8xEKzFPfSE","pT8wu8cVD3","WmadASWfou","brhlQ5VZjS","4dEz6tl72W",
+"QClRLCNHmv","qQxHPjeskS","Cp3mZ48cHL","AXpwEiwzGk","LDk6fSjskQ","FGzgp5drc6","NAFuw2Yz7E","lm0pDZv7z0","pv0i7d85a9","Ta8f6lm0pD",
+"DG4sThYBCK","O3iyQ1j5L8","5Namm55rfB","TCgPp8RCUA","WreyPtlILt","xciqp5ZaEz","AgJHQh1zcH","UmaEv7X3uy","t98iW45cIH","4dEz6UlU3M",
+"zY1GYhi5X7","gtCA5UmaEv","nlaByZuDtD","lsQGok85Ae","kB5nP3otm6","GXdoHcL0aE","Vprf2WaWsv","AkKTkKr8ys","PYBf4kB5nP","ru4UGNAFuw",
+"AIYUuzmLYD","jSjS3DLhzM","xciqpReKEW","TXQ0ZFcWrW","ZuDtDOxWIH","lCMxy8FmFH","dmoS7No0Qb","J2mQi7Ow5C","iKqhrbgJAz","zqH0WTCgPp",
+"kB5nPhYBCK","Cfgr3Pb1pa","e6e4zC2Irc","Waim6BFkb8","n8pJ9faHir","he9IAHfyNQ","SWfouFxX9q","2Yz7EB3qem","tvdkDxciqp","WDVWJuZPqg",
+"Rxrsmt98iW","FxX9qiwzGk","8hJdthE1Ql","Twanouupzk","Cfgr3t98iW","8hJdtpWiOs","HfyNQIBe8k","FVMxo07n1c","suY4xlCMxy","W3VFHAgJHQ",
+"jeskSxXTI4","fcJOyiKqhr","SbRYyHRxd8","2hEEUQbxXc","ogLgcYOfrY","euZA5QnJ1S","xciqpblLA9","LbRTHYjB9t","dmoS7gdQsS","LbRTHcL0aE",
+"S2DfubrhlQ","Chuy36q6L9","pT8wuBbwgA","KZamH8xEKz","2DREsulk41","aFFss8xEKz","s4786CNHmv","vkCHHcL0aE","EoToPLbRTH","ix74rIRh48",
+"S2DfulweGy","guMb89rlg9","n1pmOHRxd8","2ZHdkQbxXc","WmadAOxWIH","64s8NlXFOB","S2DfuChuy3","2NslmtaOXK","aFFss5Namm","h1zcHy94nw",
+"FGzgpWDVWJ","dQ586jzUqR","tjQxsVerEA","FnPFBgIYvE","qaofN24ARF","lCMxyNo0Qb","MGlTFb29RJ","n8pJ99XyT9","FGzgpbgJAz","pWiOsnnP8o",
+"CdyBV0h1b1","pmeCdAmdQd","IBe8kZJTXH","5ZaEzRzaZA","0YAGHfFDrJ","RBhp0s7Mxk","qUJMdo8Uyd","5nmWvksJby","6q6L9x3LDe","fmIK1pvgjS",
+"hSSvQi7WMQ","fmIK1IKxdL","lXFOBkZANm","Z4I1v9iGoT","cL0aEaDGtS","HP433VLTy6","iKqhraFFss","Ss0ZupiJSk","tAOsrReKEW","sqVrfMK07Y",
+"KsjRK2hEEU","zz4ZUlH1kt","iB08liKqhr","No0QbhE1Ql","n8pJ9ru4UG","7Ow5CoQ87r","dpe1vPOUYS","k85AebrhlQ","fFDrJBpYhV","sqVrflH1kt",
+"lsQGoK4GS8","vLsmSECMvU","MezSWQworu","zmLYDKr8ys","LbRTHksJby","RmDcrWPmlx","0YAGHkB5nP","d7vjMGSQwj","FNYIMRBhp0","RxrsmQ6Lix",
+"MmsIoSbRYy","tl72WSmGzv","rz7UtD6rBy","MaJQs24ARF","0Wr5yogLgc","SjskQ0Kyfs","No0QbTwano","Mm8siCK5W7","0MR5XJ2mQi","4dEz65drc6",
+"iqv4kjS1aj","0h1b1ReKEW","X6PinnFqik","n1pmOZuDtD","l83UdFwEJz","RzaZA55rfB","OxWIHBFkb8","lweGyfLNg8","YOfrYlm0pD","J2mQihUTw7",
+"Oz8yZyToGW","uN6r3L7cGc","5VZjS0Kyfs","FxX9qNOHsz","FPfSE7hyVv","No0Qb3otm6","ksJbymz8gx","yToGWuLtKs","5Drn0F6PT2","2ZHdkFxX9q",
+"mX2GEAmdQd","2Yz7EFwEJz","Cfgr3UlU3M","k85AeZzJHW","HlUbFn1pmO","BpYhVn1pmO","0MR5XtaOXK","QWxoT6q6L9","faHiryEfy9","blLA9CdyBV",
+"8xEKzMezSW","0MR5XFGzgp","Q6hMClViBv","tl72WU3yw5","MGlTFVerEA","0PktIIBe8k","Cfgr3W7cTs","45cIHiKqhr","pvgjSatef2","16lHcDG4sT",
+"xciqpqQxHP","BFkb8blLA9","DcpWByEfy9","pFrrluPX7G","x3LDeU3yw5","29QAzjSjS3","lpF6WMmKGJ","VNCPdSmGzv","8RCUA2DREs","DcpWBRpBQm",
+"5ZaEzXyPZN","ksJbygtCA5","xXTI4prNT6","JKWYRZzJHW","6AFT0WaWsv","OUYuFe6e4z","QssNCIBe8k","Ta8f6n8pJ9","J2mQiJKWYR","GSQwjs7Mxk",
+"KASQ8MojnP","s7MxkeuZA5","RsQUqjfREu","4W0Tl1LB1L","Qworu5Drn0","L7cGcnnP8o","YOfrYx3LDe","BFkb8s93Ml","m4bxUnnP8o","cShY2kZANm",
+"lpF6WEOE1o","lj07QOz8yZ","ReKEWt59lR","JXljWgdQsS","zFgtByvOMI","9rlg9UlU3M","v2eC3Mkgy8","CdyBVMGlTF","Zv7z0AOgEe","iwzGkgIYvE",
+"RACujaL6AJ","OxWIHOz8yZ","NOHszWmadA","iB08lgf8rI","pmeCdlViBv","CNHmvlkMUA","s93MlWPmlx","yofH3NhXdu","vLsmSZzJHW","x3LDerKDLJ",
+"fLNg8mz8gx","i7WMQlXFOB","rKDLJSjskQ","Dz1R3jzUqR","AkKTkIBe8k","fcwDavkCHH","5NammbgJAz","euZA5i3pyd","s7MxkhE1Ql","MojnPZuDtD",
+"YjB9tpv0i7","fcwDafqypy","azIWp6q6L9","pAhR1tvdkD","WaWsvRxrsm","RxrsmMGlTF","gjUTupAhR1","prNT6ZzJHW","Mkgy8aez9y","NcICAKZamH",
+"YjB9tC2Irc","VBjhzRsQUq","uPX7GKASQ8","pT8wuYf2Ec","AkKTkJkzUn","fFDrJjiVBP","HRxd8cL0aE","a00b5FFDui","cShY2h1zcH","xXTI47hyVv",
+"VLTy6QClRL","brhlQblLA9","s4786KASQ8","PYBf4zmLYD","5Namm0ao3l","iKqhrcmXIX","m4bxUblLA9","y94nw8hJdt","guMb8oQ87r","3weIFqaofN",
+"kB5nPY1mC0","cL0aEn1pmO","9GXkXAmdQd","hE1Ql3weIF","hUTw75VZjS","o8UydTa8f6","hUTw7he9IA","Q6hMCguMb8","2TRI7QnJ1S","8TxD7ydG8U",
+"zqH0W9y4lw","Z4I1vRkQke","MaJQs9iGoT","S2DfuwDajX","Nxx9Vv2eC3","Cp3mZI7p2a","atef20YAGH","gIYvE5Namm","8FmFH580YD","tjQxsK4GS8",
+"dQ586v2eC3","cL0aEy94nw","wiHrZOxWIH","OUYuFfaHir","rhl0JuQIcz","IKxdLK20wK","1v5hH2ZHdk","i3pydY1mC0","HzZT8JJs5m","S2Dfuv8yFN",
+"48cHLQYxC0","xXTI4zz4ZU","5ZaEzi3pyd","Y1mC02TRI7","C2IrcJKWYR","bZLvSzQt6Q","Yh1hFWaWsv","WmadAAXpwE","v8yFNM3zXL","5iGN5oGu6x",
+"WreyPIKxdL","azIWpChuy3","WaWsv24ARF","t59lRatef2","FwEJzguMb8","NOHszBGaQY","8hJdtXflUq","FVMxoYOfrY","D6rByuN6r3","ksJbydjsrv",
+"mX2GEBCxeC","jS1ajsx5Gl","jeskSjfREu","DcpWB4W0Tl","zFgtB9eoRc","EdBKcnnP8o","tvdkDqaofN","Q6hMCBbwgA","hSSvQMGlTF","mX2GEGXdoH",
+"L7cGca00b5","VBjhzpWiOs","RACujYOfrY","nFqike6e4z","lViBv2ZHdk","ZuDtDFLsph","atef2MmKGJ","8U2nUAOgEe","IRh48fcwDa","s93MlHfyNQ",
+"lH1ktcmXIX","2Yz7E6q6L9","jzUqR48cHL","s7Mxk0PktI","RzaZAPYBf4","rhl0JjiVBP","U3yw5jzUqR","X6PinMmKGJ","1v5hHulk41","Mkgy88U2nU",
+"dpe1vD6rBy","ciuWzqUJMd","VerEAlkMUA","guMb8580YD","jtn0XqUJMd","Chuy35ZaEz","fcJOyazIWp","uJScXS2Dfu","L7cGc2Nslm","jSjS3uJScX",
+"TCgPpLbRTH","sqVrfZhwG1","zmLYDjSjS3","GrDg7v8yFN","Ul4a1o8Uyd","Nxx9VRACuj","gIYvE7X3uy","s93MlYw2oU","7fKYUx3LDe","qaofNnlaBy",
+"IjTwPk85Ae","FxX9qZ4I1v","0PktIaL6AJ","SbRYyKASQ8","JXljWguMb8","WPmlxMmKGJ","ZUnqtRmDcr","FNYIMyofH3","hE1QlnnP8o","ZJTXHxXTI4",
+"In3NS64s8N","ru4UGYh1hF","NOHszuAWyp","lkMUAXflUq","uoStwsx5Gl","45cIHl83Ud","uLtKss7Mxk","L7cGcfFDrJ","Kr8ysqUJMd","EoToPd85a9",
+"580YDVBjhz","EoToPMezSW","29QAz6q6L9","QWxoTeuZA5","v8yFNzY1GY","tlILtjzUqR","dpe1vfaHir","uN6r3QssNC","HlUbFvOqCE","QClRLFPfSE",
+"FFDuiVIlwP","HRxd8IRh48","lXFOBOxWIH","uupzkcmXIX","Uvlv4tl72W","guMb8C2Irc","4W0Tlk85Ae","e6e4zxciqp","Yw2oUKr8ys","gIYvE7Ow5C",
+"guMb8WMiS3","pAhR1pT8wu","3otm6fLNg8","TCgPpHzZT8","sqVrfPOUYS","lXFOBsx5Gl","FxX9q5Drn0","RpBQmgjUTu","EoToPTXQ0Z","aez9y48cHL",
+"RmDcrdpe1v","B3qemaL6AJ","pmeCdWaim6","nlaByuvf7A","7fsYMblLA9","XflUqYw2oU","lCMxyZv7z0","7fKYUgf8rI","lViBvkZANm","fqypy64s8N",
+"3otm6MezSW","ru4UGdjsrv","07n1cNo0Qb","Z4I1vM6qcG","OUYuFx3LDe","C2IrcX6Pin","P6bcgECMvU","ReKEWOUqFM","bgJAz580YD","7fKYUFFDui",
+"UmaEvY1mC0","Y1mC0he9IA","Qworurhl0J","IjTwPNcICA","azIWpMmKGJ","k85AeyluBx","KASQ85IhmG","U3yw5dmoS7","ix74rtlILt","4QMc9JKWYR",
+"RkQkedmoS7","MaJQsiwzGk","FnPFBhUTw7","MojnPwDajX","gdQsSBGaQY","Uvlv4JIqXi","Q6LixFnPFB","0h1b11v5hH","HP43345cIH","kZANm8RCUA",
+"fmIK1Waim6","PYBf4vkCHH","HRxd8sqVrf","he9IAguMb8","Gv3FquTacx","Waim6MezSW","EdBKciB08l","MmKGJCxVEf","ECMvUpAhR1","pFrrlIn3NS",
+"zHF1qMmsIo","zHF1qAIYUu","16lHcuJScX","L7cGcPYBf4","RmDcrwDajX","5ZaEznlaBy","NhXduYh1hF","CK5W7WPmlx","KASQ8Yh1hF","FnPFBReKEW",
+"WDVWJfmIK1","4dEz6ulk41","piJSktlILt","CIShGd85a9","No0Qb0YAGH","gdQsSM6qcG","taOXKGXdoH","FjHXRNhXdu","Ss0Zud85a9","jzUqRi3pyd",
+"8hJdtKsjRK","QYxC0GSQwj","aL6AJhe9IA","2hEEUCIShG","Q6hMCRpBQm","KsjRKnnP8o","YOfrYvLsmS","uLtKs0ao3l","LewvMVjCZq","5iGN5XyPZN",
+"soy9t7Ow5C","he9IAFNYIM","QssNCRmDcr","QssNCWreyP","v8yFNIBe8k","i7WMQuTacx","FhtglW7cTs","ydG8UAOgEe","S77LH2Nslm","7fKYUsuY4x",
+"D6rByAkKTk","jeskS8RCUA","v1Hln0BmCy","uJScXOxWIH","OxWIH5VZjS","MmKGJTa8f6","HlUbF9eoRc","KASQ8Ss0Zu","7Ow5Clj07Q","brhlQyEfy9",
+"qaofNuvf7A","HzZT8d7vjM","tlILtgdQsS","FGzgpVIlwP","MGlTFix74r","m4bxUjeskS","m4bxUWaim6","pv0i7zz4ZU","SjskQzHF1q","WreyPlsQGo",
+"MezSW0h1b1","14FLRQworu","C2IrcQChxs","nFqikm4bxU","IKxdLFFDui","HP4335VZjS","C2IrclViBv","Cp3mZ9XyT9","hE1QlCIShG","VNCPdlsQGo",
+"1LB1LxReec","8xEKzRpBQm","580YDJIqXi","Waim6EOE1o","qUJMdi7WMQ","RkQkeDQimp","Uvlv4EOE1o","GrDg7EOE1o","piJSkGv3Fq","Cp3mZKr8ys",
+"Cfgr3tjQxs","yToGWKASQ8","TXQ0ZCIShG","W3VFHBCxeC","BpYhV8FmFH","Cp3mZtlILt","Mkgy8G1RhS","NOHszMaJQs","2TRI7VerEA","6q6L97ku1p",
+"yofH3Vprf2","WMiS3SmGzv","2DREsVNCPd","zz4ZUWaWsv","VBjhzSbRYy","hSSvQksJby","uN6r3uTacx","1j5L8LewvM","Rxrsm9XyT9","QWxoTTa8f6",
+"BGaQYfcwDa","lm0pD55rfB","RxrsmCp3mZ","zmLYD580YD","Uvlv4BCxeC","LbRTHe6e4z","8U2nUzz4ZU","5ZaEz45cIH","9rlg92DREs","CdyBV0Kyfs",
+"Ul4a1oQ87r","RzaZAVjCZq","MojnPGXdoH","e6e4z8hJdt","No0QbJKWYR","2NslmNAFuw","rKDLJn1pmO","EoToPGXdoH","s7Mxk16lHc","a00b5lkMUA",
+"StlDJfcJOy","5ZaEzo8Uyd","zz4ZUSbRYy","IjTwPWmadA","o8UydOUYuF","ydG8U5VZjS","4QMc98TxD7","QClRL7lUXZ","RzaZAdjsrv","KsjRK0MR5X",
+"NAFuw8xEKz","QYxC0pv0i7","X6PinWaim6","kB5nPn8pJ9","POUYSOHaBz","zFgtBCxVEf","IjTwPaDGtS","IRh48Cp3mZ","jzUqRLDk6f","ogLgcFFDui",
+"2DREssuY4x","FPfSElj07Q","lCMxy7X3uy","Z4I1vnFqik","2DREsuPX7G","NhXdutlILt","suY4x7fKYU","MGlTF16lHc","1v5hHMezSW","iKqhrCK5W7",
+"0Wr5yJJs5m","LewvMYf2Ec","GWqqXEOE1o","Uvlv4lsQGo","VBjhzhUTw7","Kr8ysCNHmv","8cVD3mX2GE","YOfrYuoStw","sqVrfi7WMQ","lXFOBuJScX",
+"FPfSECp3mZ","QWxoTs4786","8hJdtgIYvE","7hyVvk85Ae","7hyVv3weIF","iB08lgIYvE","BbwgAt98iW","nlaByTa8f6","QbxXc2DREs","S2DfuXflUq",
+"9y4lwCdyBV","GXdoHM6qcG","Yf2EcG1RhS","m4bxU580YD","0ao3lHP433","v8yFNVBjhz","FxX9q7fsYM","pmeCdtvdkD","7fKYU2ZHdk","lj07QcmXIX",
+"2TRI75drc6","zqH0WMojnP","n8pJ9K4GS8","h1zcHAkKTk","HRxd88FmFH","Ul4a1YOfrY","uvf7AqaofN","S2Dful83Ud","i3pydZhwG1","BbwgAdjsrv",
+"29QAz0ao3l","brhlQDcpWB","hSSvQGv3Fq","suY4xyEfy9","lsQGoStlDJ","ulk41zqH0W","Pb1pabrhlQ","s93MlbgJAz","AIYUu0MR5X","n8pJ9oQ87r",
+"CNHmvYh1hF","e6e4zjfREu","7fKYUs93Ml","HlUbFAIYUu","v1Hln5Namm","Rxrsmy94nw","zQt6QZhwG1","rhl0JjSjS3","64s8NSs0Zu","580YDM6qcG",
+"RpBQmlm0pD","ksJbyWaWsv","7Ow5C9GXkX","xReecPYBf4","618DilH1kt","uAWypBpYhV","FFDuiMezSW","G1RhSMmKGJ","vLsmSa00b5","FLsph8FmFH",
+"OUYuFQbxXc","atef2Uvlv4","VBjhzAgJHQ","t98iWoQ87r","FwEJz0Wr5y","ydG8UcShY2","gdQsS4dEz6","55rfBzQt6Q","atef224ARF","U3yw54QMc9",
+"FLsphtlILt","ix74rCxVEf","ZhwG1I7p2a","tl72WTwano","lsQGoEoToP","D6rByqaofN","J2mQi9y4lw","iwzGkksJby","zz4ZU2ZHdk","Q6hMCuTacx",
+"brhlQfFDrJ","0BmCyF6PT2","soy9tnnP8o","tvdkDCqqaD","sx5GlOUqFM","ThjNnAgJHQ","HP4332DREs","KZamHRzaZA","2ZHdkuQIcz","euZA5PYBf4",
+"VBjhz48cHL","WreyPFjHXR","lsQGoe6e4z","AXpwECxVEf","D6rBykZANm","yvOMIUl4a1","pFrrlfqypy","ni2v1RkQke","n1pmOQworu","uAWypgf8rI",
+"Pb1paYjB9t","7fsYMHlUbF","RkQkeKZamH","suY4x2DREs","UlU3MZ4I1v","k85AetaOXK","he9IARxrsm","s7Mxkiqv4k","FPfSEaDGtS","In3NSuAWyp",
+"HP433EOE1o","yluBxtAOsr","XyPZNsx5Gl","CNHmvYf2Ec","TXQ0Zhi5X7","KZamHaez9y","M3zXL8FmFH","SmGzvru4UG","uPX7GzY1GY","euZA5ogLgc",
+"ThjNnThjNn","pFrrl8FmFH","5NammHRxd8","nFqik4dEz6","8FmFHpT8wu","G1RhSokgRi","euZA5nlaBy","jiVBPhUTw7","s7MxkzQt6Q","MmsIoGv3Fq",
+"lkMUAJIqXi","FcWrWdmoS7","RzaZAOxWIH","CIShGcL0aE","Uvlv4QWxoT","ni2v1guMb8","VerEASmGzv","d7vjMSWfou","HfyNQSmGzv","hUTw72DREs",
+"zY1GYGrDg7","zQt6Q7X3uy","vkCHHru4UG","RzaZAUlU3M","aDGtSWaim6","LDk6f4dEz6","tl72WTa8f6","i7WMQSjskQ","5iGN5cShY2","64s8NuTacx",
+"FGzgpS77LH","ru4UGJRJQB","O3iyQuupzk","ECMvUiqv4k","5IhmGfLNg8","iKqhr48cHL","8hJdtQbxXc","RmDcrFcWrW","W3VFH8cVD3","NAFuwjiVBP",
+"Q6hMCPOUYS","7ku1pMm8si","ogLgcXflUq","sqVrfv8yFN","TXQ0ZM6qcG","HlUbFLDk6f","2hEEUKsjRK","618Di0Wr5y","aFFsse6e4z","7lUXZI7p2a",
+"jiVBPNAFuw","ulk41WreyP","lXFOBaez9y","sx5Gl5ZaEz","DLhzM45cIH","3weIF2DREs","okgRiDz1R3","jzUqRPOUYS","B3qemNOHsz","sqVrfEOE1o",
+"ZuDtDru4UG","Cp3mZZhwG1","BGaQY0YAGH","xReecxReec","ZuDtDo8Uyd","Q6hMCokgRi","F6PT2X6Pin","tl72WQworu","StlDJ2TRI7","dmoS7lXFOB",
+"StlDJcShY2","Yh1hFQYxC0","RmDcrDcpWB","9y4lwChuy3","LDk6fAOgEe","QChxsNcICA","Z4I1vMK07Y","jS1ajrz7Ut","lCMxytl72W","CNHmvW3VFH",
+"7Ow5CgtCA5","k85AeGrDg7","OxWIHJkzUn","4QMc9Rxrsm","Y1mC0lm0pD","fmIK1IRh48","b29RJ5IhmG","tjQxsfqypy","7hyVvHlUbF","FwEJzVjCZq",
+"pT8wujiVBP","JkzUnlH1kt","fcwDaRACuj","SbRYyDG4sT","y94nwFPfSE","IBe8kyvOMI","xXTI4soy9t","LbRTHYw2oU","JkzUnSs0Zu","uvf7AQ6hMC",
+"2DREs0MR5X","Pb1pa8xEKz","CK5W7JRJQB","29QAz0MR5X","EoToPO3iyQ","U3yw524ARF","fFDrJG1RhS","ogLgcuPX7G","lXFOBprNT6","FxX9qogLgc",
+"EoToPFjHXR","iqv4kLewvM","Q6LixlweGy","K4GS8IRh48","XyPZNVBjhz","5VZjSi7WMQ","6AFT0QClRL","NhXduVerEA","QbxXcM3zXL","s4786aDGtS",
+"lH1ktKASQ8","FLsphBbwgA","ECMvURsQUq","dQ586zY1GY","uN6r3C2Irc","jeskSJkzUn","pAhR13otm6","Gv3FqjSjS3","6q6L9v2eC3","oQ87rKASQ8",
+"RzaZAokgRi","WDVWJIn3NS","rKDLJjSjS3","QbxXcZzJHW","mz8gx29QAz","d7vjMyvOMI","qUJMddmoS7","SbRYy4QMc9","zY1GYQChxs","aez9ygdQsS",
+"hUTw7zz4ZU","VBjhzs4786","aFFssaL6AJ","MGlTF5Mg9r","cmXIXMGlTF","6AFT0580YD","fFDrJfmIK1","24ARFdpe1v","Uvlv4uZPqg","Yh1hFs7Mxk",
+"xciqplm0pD","AgJHQnnP8o","5VZjSThjNn","Ta8f6CqqaD","b29RJoVQp6","uAWypFNYIM","9GXkXStlDJ","JIqXiFLsph","3otm6DG4sT","VLTy6v8yFN",
+"NAFuwuQIcz","EoToPWaWsv","fLNg8D6rBy","LbRTHOz8yZ","BbwgAlViBv","d85a9lpF6W","Pb1palsQGo","4W0Tlt59lR","VLTy60Wr5y","KASQ8DcpWB",
+"aL6AJeuZA5","0BmCyaFFss","5nmWvMojnP","y94nw0ao3l","M3zXL3weIF","jfREucShY2","Zv7z0BbwgA","JKWYRulk41","W7cTsuJScX","hi5X70ao3l",
+"tl72WQWxoT","ThjNnoGu6x","5IhmGi3pyd","pmeCdVprf2","t59lRuTacx","zY1GYqQxHP","l83UdZv7z0","WDVWJIKxdL","cQOnv9rlg9","OUqFMm4bxU",
+"4dEz66AFT0","HRxd85Namm","h1zcH55rfB","fmIK1fcJOy","jS1aj5Namm","KZamHv2eC3","iqv4kb29RJ","CNHmvBGaQY","SbRYySWfou","zbIYYD6rBy",
+"0KyfsW3VFH","K20wKMGlTF","JKWYR64s8N","DQimpwDajX","qUJMdgIYvE","Ul4a1IRh48","lH1ktFFDui","aL6AJdpe1v","M3zXLUlU3M","tAOsruupzk",
+"9iGoTaFFss","HzZT8lH1kt","KASQ8lViBv","5IhmGJkzUn","s93Ml2ZHdk","1v5hH9y4lw","EoToPfmIK1","16lHcRACuj","cShY2nFqik","Rxrsm1j5L8",
+"i7WMQ6q6L9","djsrvWaWsv","M3zXL8cVD3","RmDcrlsQGo","IjTwPlm0pD","zHF1qs7Mxk","sqVrfTCgPp","0Wr5yAgJHQ","KASQ8ix74r","ydG8U618Di",
+"CIShGa00b5","FNYIMmX2GE","m4bxUIBe8k","Gv3FqFhtgl","HfyNQyEfy9","J2mQi580YD","tvdkDpWiOs","NOHszzFgtB","ni2v1BbwgA","Pb1paO3iyQ",
+"n8pJ9FwEJz","OxWIHUlU3M","PYBf4ZzJHW","ni2v1JKWYR","MezSW5ZaEz","1v5hHtuDyS","StlDJyToGW","uN6r3jtn0X","Q6LixqUJMd","zqH0WCfgr3",
+"t59lRlj07Q","Q6hMC8xEKz","dhSuHhUTw7","nnP8ojeskS","t98iWEoToP","O3iyQpT8wu","pAhR1gIYvE","64s8NPOUYS","JXljWCfgr3","In3NSguMb8",
+"suY4xWMiS3","MGlTF6q6L9","hi5X7uvf7A","Yw2oUWPmlx","Z4I1vCdyBV","0MR5XNAFuw","KASQ8yvOMI","KZamH4W0Tl","16lHcuupzk","FGzgpLewvM",
+"pWiOshe9IA","dhSuHx3LDe","U3yw5rKDLJ","pmeCdMGlTF","Oz8yZLbRTH","Ta8f68hJdt","MGlTFYf2Ec","uTacxQbxXc","faHir9rlg9","brhlQPYBf4",
+"9rlg9soy9t","zFgtBjtn0X","FhtglWaim6","JKWYRVIlwP","tvdkD3weIF","wiHrZ5VZjS","dhSuHjS1aj","lH1ktlpF6W","Chuy3BpYhV","soy9tpAhR1",
+"9XyT9MmsIo","kB5nPOHaBz","VjCZqZ4I1v","uupzkAgJHQ","jtn0X9eoRc","rKDLJpFrrl","Ss0ZuP6bcg","RBhp0NAFuw","hUTw7FGzgp","0BmCylweGy",
+"i3pydgIYvE","PYBf4xReec","IjTwPmX2GE","wiHrZAIYUu","x3LDeSWfou","v8yFNFcWrW","Chuy3blLA9","TXQ0ZNxx9V","BCxeCHP433","Mm8si07n1c",
+"IBe8kfmIK1","CxVEfzmLYD","Q6Lixs93Ml","ydG8UcL0aE","AgJHQOUqFM","CNHmvkZANm","7fsYMt98iW","QnJ1SgdQsS","lj07QZuDtD","JKWYRv1Hln",
+"uQIczP6bcg","yofH3blLA9","TwanozqH0W","ciuWzAXpwE","oGu6x3weIF","AXpwErz7Ut","RpBQmjiVBP","9eoRctl72W","sx5GlYOfrY","suY4xsqVrf",
+"oQ87rJ2mQi","Ss0ZuM6qcG","5IhmGQClRL","prNT6hi5X7","JXljWFjHXR","Mm8sijSjS3","I7p2atvdkD","pWiOsyofH3","blLA90PktI","RzaZADLhzM",
+"JJs5mzmLYD","BFkb8CK5W7","DcpWBFjHXR","jeskSqQxHP","xXTI4CdyBV","NAFuwtjQxs","yvOMITwano","OUqFMeuZA5","618DibrhlQ","QChxsQbxXc",
+"kZANmYjB9t","CdyBVgtCA5","CqqaD5Namm","jiVBPZ4I1v","5VZjS9iGoT","OUqFMpvgjS","YjB9tnlaBy","aFFssjS1aj","ZuDtDrKDLJ","QChxsSs0Zu",
+"WaWsvD6rBy","VNCPdt59lR","ThjNnJIqXi","RACujv2eC3","NhXdurKDLJ","yToGWl83Ud","yToGWWDVWJ","3weIF1j5L8","zz4ZU7X3uy","IRh48taOXK",
+"Z4I1v8TxD7","Yf2EcCK5W7","0h1b1ciuWz","EoToPReKEW","5VZjSQChxs","WPmlx8cVD3","45cIH8cVD3","OUYuF0PktI","tAOsrYw2oU","8RCUAnnP8o",
+"7hyVvjtn0X","pFrrlBFkb8","5Drn0bgJAz","Ta8f6pvgjS","U3yw50Wr5y","Z4I1vo8Uyd","8hJdtzFgtB","8hJdtTwano","xciqpChuy3","FxX9q9eoRc",
+"S77LH8FmFH","fmIK1lkMUA","3otm6uvf7A","yluBxuupzk","LDk6fmX2GE","lsQGoWPmlx","K4GS8lweGy","AXpwEpmeCd","uLtKsMmsIo","tuDySQbxXc",
+"CIShG3otm6","QworupmeCd","5IhmG0ao3l","d7vjM5drc6","fqypyOUYuF","ZuDtDbgJAz","Waim6cQOnv","QChxsRBhp0","RpBQmqQxHP","WaWsvfcJOy",
+"UlU3MKsjRK","euZA5FjHXR","8RCUAO3iyQ","1LB1LuZPqg","s93Ml7hyVv","LDk6fHlUbF","pmeCdMaJQs","JIqXieuZA5","CNHmvSs0Zu","qUJMdYf2Ec",
+"RsQUqO3iyQ","pFrrlcShY2","okgRifcwDa","ulk41BpYhV","lpF6Wi7WMQ","lm0pDuN6r3","nlaByKZamH","5NammKZamH","I7p2auQIcz","lpF6WjSjS3",
+"2NslmMojnP","bgJAzZhwG1","yvOMIThjNn","FcWrWv1Hln","XflUqv8yFN","Waim6M3zXL","aL6AJFhtgl","2TRI7VjCZq","cmXIXVNCPd","BpYhVv8yFN",
+"rhl0Ji7WMQ","HzZT8JRJQB","FPfSECK5W7","PYBf4WaWsv","b29RJCdyBV","brhlQM6qcG","DcpWBGSQwj","s7Mxk3weIF","FVMxoJ2mQi","mX2GESjskQ",
+"pmeCd8U2nU","uLtKsiKqhr","Q6hMC7lUXZ","Nxx9V5nmWv","Yh1hFru4UG","a00b5oGu6x","DcpWBDG4sT","7hyVvYw2oU","FcWrWJkzUn","hSSvQ2Nslm",
+"JJs5mK4GS8","ydG8UlH1kt","tAOsrCK5W7","W3VFHuQIcz","rz7UtnnP8o","16lHcMGlTF","ECMvUJIqXi","2hEEUlViBv","hYBCKRBhp0","prNT607n1c",
+"Z4I1vTXQ0Z","dmoS7FVMxo","soy9tdmoS7","SWfouAmdQd","1j5L8FVMxo","uTacxguMb8","Mkgy8AmdQd","K4GS80ao3l","WDVWJxReec","4W0TlYf2Ec",
+"gdQsSs4786","hE1QlqaofN","jeskSNOHsz","vOqCEXyPZN","TCgPpAIYUu","QClRLh1zcH","uAWypO3iyQ","WmadAQChxs","GWqqXoGu6x","lsQGo7fKYU",
+"MojnPcmXIX","TXQ0Zi7WMQ","4dEz6LbRTH","ThjNnZuDtD","NOHszTXQ0Z","lsQGoVLTy6","IRh48IRh48","MK07YaFFss","azIWpJIqXi","DcpWB3otm6",
+"Chuy3qaofN","i7WMQ580YD","atef2X6Pin","soy9tC2Irc","7ku1pAOgEe","gtCA5Q6Lix","W3VFH4W0Tl","1LB1LRmDcr","v1HlnjeskS","1LB1LgtCA5",
+"taOXKxXTI4","y94nwDLhzM","7hyVvPOUYS","ZzJHWjSjS3","hUTw7VerEA","HP433ZhwG1","WDVWJ8TxD7","Cp3mZ29QAz","uN6r3v2eC3","zQt6QFVMxo",
+"OHaBzZv7z0","WmadANxx9V","S2DfuI7p2a","QbxXc7fKYU","uLtKs5Mg9r","XflUqd85a9","Cp3mZCdyBV","DLhzM2TRI7","Gv3FqWreyP","he9IAv2eC3",
+"xXTI4cQOnv","aDGtSP6bcg","VIlwP7X3uy","EOE1oVprf2","Y1mC0k85Ae","5IhmGuJScX","gjUTuNAFuw","Oz8yZVerEA","7ku1pHlUbF","fLNg8CIShG",
+"ciuWzBFkb8","guMb8yvOMI","DcpWBQbxXc","lj07QW7cTs","GWqqXx3LDe","uLtKsPOUYS","Uvlv4YjB9t","Q6Lix580YD","NAFuwcShY2","pFrrl5Mg9r",
+"BGaQYWMiS3","pWiOsJRJQB","Zv7z0580YD","XflUqVIlwP","MojnP9GXkX","b29RJJ2mQi","zmLYDQssNC","cL0aED6rBy","QWxoTDG4sT","LewvMfcJOy",
+"M3zXLFcWrW","OUqFM6AFT0","FwEJzd7vjM","5iGN5he9IA","wDajXjS1aj","6AFT0d7vjM","SbRYy3weIF","8cVD3ZUnqt","C2IrcRpBQm","2TRI7GWqqX",
+"pvgjSLDk6f","nnP8otAOsr","CNHmvIn3NS","s7MxkyEfy9","d85a96AFT0","5nmWvaDGtS","QYxC0x3LDe","VBjhzlm0pD","RkQkeU3yw5","prNT6lH1kt",
+"MK07YFxX9q","07n1caFFss","O3iyQB3qem","dpe1vSs0Zu","iKqhri7WMQ","0ao3lTCgPp","K4GS8TCgPp","UmaEvgIYvE","O3iyQ7Ow5C","vkCHHDQimp",
+"ru4UGEoToP","blLA9Yf2Ec","pAhR1WaWsv","0h1b1kZANm","XyPZNgf8rI","QworufcwDa","7X3uyXflUq","hE1QlMezSW","0MR5XqaofN","lCMxyydG8U",
+"vkCHHm4bxU","lkMUAQ6Lix","D6rByi3pyd","1v5hHEoToP","GSQwjpiJSk","YjB9txciqp","nFqikYh1hF","Ta8f6cL0aE","HfyNQaDGtS","HRxd85ZaEz",
+"Vprf2i3pyd","tvdkDVIlwP","Cp3mZuTacx","LDk6fRsQUq","OxWIHhi5X7","hYBCKtvdkD","ogLgcYjB9t","lViBvlweGy","JIqXizHF1q","lViBvlViBv",
+"RmDcrSmGzv","jtn0XJKWYR","OUYuFAIYUu","FNYIMHzZT8","SjskQSs0Zu","ciuWzjtn0X","fLNg8sx5Gl","J2mQi9iGoT","FwEJzpWiOs","zmLYD0YAGH",
+"lsQGo5Namm","MezSWReKEW","ZhwG1TCgPp","ni2v114FLR","gf8rIs7Mxk","3weIFFVMxo","KZamHatef2","gjUTuOz8yZ","5ZaEzrhl0J","okgRisqVrf",
+"o8UydX6Pin","atef2W7cTs","Cp3mZRkQke","XflUqSWfou","5NammU3yw5","HfyNQWaim6","iqv4koVQp6","07n1crhl0J","pv0i7QWxoT","ZzJHWAIYUu",
+"hE1QlGXdoH","gjUTuUl4a1","MmsIoM6qcG","POUYSnnP8o","h1zcHzqH0W","t98iWEOE1o","QYxC0s4786","GSQwjoQ87r","yvOMIWPmlx","uQIczpWiOs",
+"RmDcr4QMc9","zbIYYciuWz","suY4xVIlwP","HfyNQOHaBz","In3NSoGu6x","0ao3lfaHir","MojnPuvf7A","JXljWMmKGJ","pvgjSNo0Qb","EoToP8FmFH",
+"UmaEva00b5","CK5W7a00b5","2NslmFVMxo","S2DfuLewvM","48cHLk85Ae","SmGzviwzGk","7ku1pZJTXH","jiVBPTXQ0Z","L7cGcRpBQm","CqqaDe6e4z",
+"Vprf2DLhzM","v8yFN2DREs","tlILtFPfSE","uoStwThjNn","uupzkjiVBP","i3pydDcpWB","0MR5XG1RhS","lpF6WogLgc","OUqFMJRJQB","gIYvE8FmFH",
+"qaofNHP433","GSQwj7fsYM","ksJby9iGoT","lm0pDPOUYS","HlUbFQnJ1S","brhlQJkzUn","GSQwjTa8f6","uJScXCqqaD","07n1cJKWYR","ciuWzPb1pa",
+"5VZjSuPX7G","5ZaEzMmsIo","BbwgALbRTH","gjUTuTXQ0Z","xXTI4QChxs","7X3uytjQxs","aDGtSKsjRK","C2Irc7lUXZ","580YDVNCPd","Yw2oU5nmWv",
+"RsQUq580YD","VjCZqiKqhr","sqVrfwDajX","580YDlsQGo","1j5L8ulk41","IBe8kP6bcg","oQ87rt59lR","SjskQni2v1","7fKYUOxWIH","7X3uyNcICA",
+"euZA59iGoT","AOgEefaHir","LDk6fCqqaD","QWxoTzmLYD","n1pmOgjUTu","tl72WEoToP","FNYIMFGzgp","yvOMIgdQsS","RmDcr1LB1L","ni2v15drc6",
+"prNT648cHL","SmGzv1v5hH","jS1aj2DREs","S77LHpvgjS","RpBQmReKEW","v8yFNlweGy","gjUTuQbxXc","Uvlv4VLTy6","P6bcgpiJSk","v8yFNuvf7A",
+"uZPqgS77LH","ReKEWtl72W","hE1QlRBhp0","lCMxylH1kt","uAWypHRxd8","Zv7z0b29RJ","nFqiktvdkD","5Mg9rKASQ8","Yf2EcQClRL","No0QbVBjhz",
+"GWqqXrKDLJ","nnP8oIBe8k","Ss0Zu5iGN5","l83UdRxrsm","2DREs9y4lw","KsjRKDz1R3","uLtKsqaofN","yofH3d85a9","RzaZA0h1b1","x3LDeW7cTs",
+"14FLR0h1b1","BCxeCHRxd8","lXFOBuN6r3","piJSkFPfSE","MaJQslpF6W","ni2v1TCgPp","RpBQmDG4sT","WmadA0h1b1","QbxXc5drc6","Y1mC0POUYS",
+"StlDJ3weIF","ThjNncmXIX","5ZaEzyluBx","vOqCEIn3NS","h1zcHiKqhr","Gv3FqAgJHQ","s47860ao3l","hE1Ql6q6L9","LewvMru4UG","uupzklm0pD",
+"tlILtgjUTu","G1RhSM6qcG","FFDuijzUqR","8hJdtuQIcz","PYBf4SjskQ","aez9yprNT6","dmoS7GSQwj","JIqXirz7Ut","lweGy5iGN5","CqqaDv8yFN",
+"cShY2Q6Lix","Yw2oUZhwG1","jSjS3VNCPd","pAhR1jSjS3","C2Irc9XyT9","ThjNnDLhzM","QWxoTAIYUu","sqVrfdmoS7","64s8NSjskQ","e6e4ztvdkD",
+"fLNg8OUYuF","dmoS78xEKz","MaJQsuoStw","Fhtgl9iGoT","y94nwuJScX","WaWsvDG4sT","jzUqRMm8si","NcICAJXljW","CxVEf2Nslm","qUJMd2DREs",
+"Zv7z0NhXdu","wDajXuoStw","hE1QlSWfou","i7WMQdjsrv","QYxC0e6e4z","VIlwPRzaZA","FPfSEazIWp","MojnP3otm6","iB08lXyPZN","Gv3FqQworu",
+"kB5nPVBjhz","MK07YGv3Fq","sqVrfQ6hMC","cShY2n1pmO","4QMc9qUJMd","tuDySB3qem","BpYhVJIqXi","Mkgy845cIH","uJScX0BmCy","suY4xk85Ae",
+"iKqhrpT8wu","WmadArKDLJ","X6PinStlDJ","0PktImX2GE","jfREu8TxD7","wiHrZ4QMc9","VerEAatef2","I7p2auZPqg","jS1ajtjQxs","DLhzMn1pmO",
+"RACujECMvU","HfyNQFLsph","bgJAzDcpWB","m4bxU8U2nU","HfyNQK4GS8","Mkgy848cHL","9eoRc9iGoT","l83UdDz1R3","aFFssx3LDe","9GXkXyluBx",
+"BpYhVaFFss","FjHXRvkCHH","lweGykZANm","Ul4a17lUXZ","Ta8f6Yf2Ec","xciqppmeCd","Waim6cL0aE","xciqppWiOs","4QMc9cL0aE","iKqhrlpF6W",
+"ECMvUOHaBz","BbwgAL7cGc","ZzJHWblLA9","euZA5XyPZN","FLsphJKWYR","8FmFHQssNC","fLNg8Mm8si","WMiS3h1zcH","5Mg9rW3VFH","WPmlx6q6L9",
+"MGlTFXyPZN","blLA9VBjhz","ZJTXHuPX7G","TwanoX6Pin","8TxD7ECMvU","prNT6cQOnv","blLA9XflUq","M3zXLn1pmO","B3qemQYxC0","t59lR1j5L8",
+"Uvlv40YAGH","uoStwiB08l","ksJbyv2eC3","4QMc95nmWv","x3LDeRkQke","2TRI7BGaQY","LewvM9XyT9","1LB1LMkgy8","oGu6x0BmCy","QnJ1SqQxHP",
+"64s8NNAFuw","nFqik7lUXZ","KZamHxReec","45cIHdhSuH","tjQxsoQ87r","JIqXioGu6x","kZANm7Ow5C","StlDJKZamH","uQIczCfgr3","FxX9qF6PT2",
+"M3zXLRmDcr","hE1QlX6Pin","POUYSQChxs","C2IrcLbRTH","CqqaDAIYUu","wiHrZNcICA","VjCZqZJTXH","hSSvQlsQGo","pvgjSzFgtB","5Namm1j5L8",
+"QssNCo8Uyd","ZuDtDuPX7G","Cp3mZ0PktI","EoToPxReec","9GXkXd85a9","blLA95iGN5","5nmWv7X3uy","hUTw72hEEU","vkCHHQYxC0","8hJdtiKqhr",
+"MmsIoix74r","LDk6fTCgPp","bZLvSzz4ZU","CIShGVLTy6","Ta8f6OxWIH","F6PT2vLsmS","he9IAD6rBy","0PktIyEfy9","BpYhVnFqik","suY4xM6qcG",
+"IRh48lXFOB","yEfy99iGoT","fqypyv8yFN","AXpwE5nmWv","d85a9RsQUq","lm0pD0YAGH","AmdQdfLNg8","ru4UG24ARF","uLtKspT8wu","45cIHcShY2",
+"HRxd8NOHsz","0PktIfmIK1","J2mQi7fsYM","VIlwPvkCHH","b29RJdhSuH","64s8Nn1pmO","qUJMdhYBCK","v1HlnvOqCE","TXQ0ZMK07Y","24ARFzY1GY",
+"yToGWJKWYR","BFkb8prNT6","jiVBPrz7Ut","lpF6WMGlTF","HzZT8tlILt","s93MlD6rBy","ulk41OUqFM","s47869rlg9","K20wKkB5nP","5Drn0VNCPd",
+"1j5L8v1Hln","i7WMQ07n1c","QYxC0Yw2oU","0KyfsMGlTF","I7p2a0ao3l","i3pydbrhlQ","wDajXECMvU","n1pmOJKWYR","VIlwPQClRL","FVMxoFxX9q",
+"zY1GYGSQwj","RkQke2Yz7E","X6PinzmLYD","U3yw59rlg9","VNCPdKZamH","3weIFNxx9V","uAWyp16lHc","5NammBbwgA","taOXKMaJQs","64s8Nsx5Gl",
+"pAhR1ECMvU","n1pmO4W0Tl","M6qcGmz8gx","ECMvUlkMUA","ogLgciwzGk","5Drn0WreyP","lkMUAydG8U","pFrrlVIlwP","ru4UG5VZjS","JXljW1LB1L",
+"Chuy3OUYuF","2TRI7Twano","L7cGcpiJSk","AgJHQlXFOB","JXljW2hEEU","MmKGJuZPqg","lj07Qdpe1v","ZJTXHTa8f6","wDajXMaJQs","xReec0BmCy",
+"rKDLJWmadA","3weIFK4GS8","QWxoTx3LDe","m4bxUzHF1q","uTacx2hEEU","zY1GYciuWz","5ZaEz9rlg9","RACujk85Ae","MmKGJ7hyVv","RmDcrtvdkD",
+"tAOsrHlUbF","9iGoT3otm6","yToGWuPX7G","tAOsrDLhzM","Zv7z0bZLvS","d85a9yEfy9","JkzUnciuWz","mX2GE1v5hH","7lUXZ8TxD7","uoStwLbRTH",
+"AmdQd7lUXZ","dmoS7yvOMI","dmoS7OHaBz","uLtKsaFFss","t59lRS77LH","xReecogLgc","he9IAChuy3","fmIK1tlILt","tuDySZ4I1v","2DREsuoStw",
+"AIYUuHzZT8","fLNg8iB08l","CNHmvQnJ1S","0h1b1a00b5","XflUq3otm6","QbxXcSjskQ","1LB1Ly94nw","atef2QWxoT","jtn0X5IhmG","EdBKcTXQ0Z",
+"gIYvELDk6f","DG4sTVLTy6","GWqqXiqv4k","s7Mxks93Ml","pWiOsydG8U","atef2euZA5","sqVrf9rlg9","ulk41yToGW","2Yz7E0Kyfs","14FLRLewvM",
+"8FmFHsoy9t","5Drn0GWqqX","MK07Yn1pmO","djsrvazIWp","ksJbyMezSW","zbIYYpT8wu","vOqCEaDGtS","K20wKHP433","VerEATXQ0Z","qaofNHlUbF",
+"0PktIFVMxo","3otm61j5L8","CIShGAOgEe","VIlwPv1Hln","bZLvSyofH3","CqqaDksJby","zqH0WiKqhr","7fsYMSbRYy","qaofNAmdQd","n8pJ9zbIYY",
+"yToGWs7Mxk","v2eC307n1c","JJs5maL6AJ","2ZHdkwDajX","ZUnqtt59lR","lj07Q0PktI","Q6LixjS1aj","lCMxyUvlv4","jSjS3UmaEv","9GXkXy94nw",
+"BCxeCZUnqt","7lUXZrz7Ut","fcwDauoStw","Kr8ysTCgPp","sqVrfpT8wu","NAFuwNAFuw","ZzJHW0PktI","48cHLnnP8o","xReecsuY4x","lj07QRpBQm",
+"atef2ZUnqt","jzUqRHP433","x3LDebgJAz","RmDcr64s8N","No0QbRzaZA","ksJbyX6Pin","vLsmS2hEEU","Uvlv4gjUTu","iB08lLbRTH","gtCA5KZamH",
+"d85a9vOqCE","sx5GlvkCHH","OxWIHtAOsr","rhl0J7fKYU","WMiS3Cfgr3","M6qcGuoStw","S2Dfu7fsYM","CxVEfi3pyd","zY1GYGv3Fq","POUYSFxX9q",
+"SbRYys7Mxk","7fKYU3otm6","uZPqgksJby","Ta8f6b29RJ","2Yz7ETwano","8U2nUtaOXK","qaofNs4786","FFDuizqH0W","TXQ0Ze6e4z","JRJQBuJScX",
+"PYBf4faHir","Uvlv4vLsmS","suY4xIRh48","JJs5mcQOnv","RBhp0he9IA","oVQp69XyT9","piJSkB3qem","ThjNnbrhlQ","kB5nPsuY4x","nlaByRsQUq",
+"14FLRt98iW","0YAGH4dEz6","LbRTHD6rBy","D6rByVBjhz","tjQxsfmIK1","gtCA5W7cTs","W7cTsLewvM","sqVrfzFgtB","fLNg8faHir","sx5Gls93Ml",
+"yluBxvOqCE","s93MlF6PT2","RkQke3weIF","gIYvEtuDyS","AkKTklm0pD","VLTy6uPX7G","FjHXRgdQsS","24ARFzQt6Q","W7cTs8U2nU","3weIFsoy9t",
+"HzZT8tuDyS","AkKTk580YD","ydG8UuLtKs","F6PT2Fhtgl","MGlTFY1mC0","dpe1vlH1kt","Cp3mZiqv4k","okgRiOHaBz","0PktIUl4a1","SbRYyUvlv4",
+"7lUXZrhl0J","0KyfsyluBx","8xEKz5ZaEz","7fKYUVprf2","YjB9tzFgtB","Mm8sik85Ae","VIlwPM6qcG","oVQp6Nxx9V","NOHszZJTXH","0PktIJ2mQi",
+"n8pJ9Mkgy8","Q6hMCprNT6","h1zcHk85Ae","M6qcGL7cGc","uZPqguQIcz","LewvMciuWz","v2eC3S77LH","0ao3lOHaBz","uPX7GWDVWJ","K4GS8uQIcz",
+"aL6AJFnPFB","NOHszKr8ys","dmoS7CqqaD","Mkgy8Zv7z0","s4786o8Uyd","Q6hMC7X3uy","uvf7ABCxeC","8RCUAtAOsr","RmDcriKqhr","lpF6WgIYvE",
+"8hJdttaOXK","QYxC0618Di","CxVEfgtCA5","atef2uPX7G","ThjNnksJby","7lUXZJ2mQi","DLhzMi3pyd","L7cGcDz1R3","uLtKsm4bxU","FFDuilCMxy",
+"s7Mxk9XyT9","ThjNnRsQUq","HzZT87fKYU","JRJQB5Namm","Z4I1vG1RhS","yToGW580YD","07n1cLbRTH","8xEKz0Wr5y","kB5nP5drc6","0h1b1uZPqg",
+"SmGzvLDk6f","ru4UGtaOXK","uJScX24ARF","b29RJyToGW","M6qcGo8Uyd","AOgEeWaim6","uLtKs55rfB","uJScXiwzGk","hSSvQh1zcH","M6qcGulk41",
+"bZLvSQChxs","jiVBPQYxC0","xReec0Kyfs","suY4xNcICA","JIqXiMmKGJ","OHaBz1j5L8","8TxD75drc6","k85AeRxrsm","7ku1pTCgPp","yToGWBGaQY",
+"QChxslViBv","aL6AJ4dEz6","HP433Qworu","ThjNnjSjS3","CdyBVpv0i7","xReecFxX9q","AgJHQ7fsYM","KASQ8FPfSE","RkQked7vjM","MaJQsfFDrJ",
+"soy9tMmKGJ","jtn0XDLhzM","QssNCUmaEv","tjQxsa00b5","rKDLJfaHir","FwEJzjfREu","I7p2afaHir","JXljWzbIYY","I7p2a8FmFH","POUYSOUqFM",
+"MmsIoBbwgA","oGu6xHzZT8","MGlTFxReec","WMiS3AXpwE","piJSksqVrf","7fsYMqUJMd","2ZHdkVLTy6","pFrrljS1aj","mz8gxlweGy","QnJ1Srz7Ut",
+"UmaEvVprf2","OxWIHSWfou","5drc60ao3l","JJs5m3weIF","pT8wujfREu","qaofNuupzk","hi5X77fsYM","8xEKztjQxs","guMb8Y1mC0","zFgtB0BmCy",
+"pFrrli7WMQ","yluBxcQOnv","hi5X7CdyBV","5ZaEzoVQp6","2Yz7Emz8gx","P6bcgiB08l","FcWrWHzZT8","SWfouulk41","aDGtSM6qcG","faHir7X3uy",
+"Dz1R314FLR","2ZHdkjSjS3","Nxx9VMK07Y","UlU3MNxx9V","qUJMdHRxd8","QChxsIn3NS","FVMxo7X3uy","OUqFMb29RJ","EoToP5drc6","CdyBVRzaZA",
+"4W0TlyvOMI","jSjS3OHaBz","C2IrcCp3mZ","n8pJ9yToGW","aFFssThjNn","dhSuH4dEz6","Ss0Zuhe9IA","pWiOsY1mC0","In3NS5nmWv","DcpWBzQt6Q",
+"ulk41Fhtgl","ZhwG1BGaQY","MK07YWDVWJ","blLA9QYxC0","uoStw29QAz","7ku1pFVMxo","Kr8yscQOnv","4dEz6MojnP","48cHL2Yz7E","nnP8ogf8rI",
+"0PktIFjHXR","FnPFB4dEz6","faHirZhwG1","JKWYR2TRI7","GWqqXJKWYR","yvOMItAOsr","AIYUuMmsIo","bZLvS7fKYU","0KyfsVprf2","lCMxyi7WMQ",
+"dQ586pFrrl","dpe1vQYxC0","CqqaDYf2Ec","2Yz7EECMvU","MojnPk85Ae","RzaZA14FLR","7hyVvBbwgA","Ta8f6ogLgc","pv0i7P6bcg","dpe1va00b5",
+"EdBKcuZPqg","8xEKzBFkb8","D6rByzbIYY","FhtglOUqFM","KsjRKuTacx","JkzUnsqVrf","Yw2oUm4bxU","ksJbyqaofN","vkCHHlpF6W","JkzUnxXTI4",
+"t98iWK20wK","VIlwP5ZaEz","5ZaEzgf8rI","nlaByuZPqg","uTacxuupzk","EoToPYOfrY","CqqaDJXljW","a00b59rlg9","y94nwgf8rI","v8yFNSjskQ",
+"1LB1LKr8ys","WDVWJFnPFB","AOgEepT8wu","RACujoVQp6","0ao3l8FmFH","5Mg9ruoStw","lViBvQ6Lix","mz8gxMmsIo","uLtKsFnPFB","IKxdLL7cGc",
+"lm0pDRxrsm","7fKYUPb1pa","uLtKsni2v1","jeskSlH1kt","Y1mC0WmadA","piJSki3pyd","zmLYD5drc6","RsQUqeuZA5","AOgEeKr8ys","WaWsvQYxC0",
+"XflUqy94nw","fLNg8zmLYD","Zv7z0he9IA","8TxD7WaWsv","Q6hMCuZPqg","aFFssiKqhr","8FmFHW7cTs","9XyT9fcJOy","Rxrsml83Ud","PYBf44QMc9",
+"24ARFlpF6W","Cp3mZjS1aj","6AFT0HP433","uZPqgNo0Qb","9GXkXRsQUq","fcwDaVLTy6","cL0aENOHsz","GrDg74W0Tl","QClRL07n1c","TCgPpQworu",
+"MK07YDz1R3","vkCHHlj07Q","aez9ygjUTu","Uvlv4faHir","suY4x5ZaEz","nlaByi3pyd","Cfgr3Zv7z0","oVQp6Oz8yZ","6AFT0EoToP","7Ow5CZuDtD",
+"rKDLJS77LH","CqqaDoGu6x","RpBQmyToGW","K20wK5iGN5","iKqhr2hEEU","azIWpprNT6","hUTw7KZamH","0BmCy7X3uy","k85Ae1LB1L","ni2v1QChxs",
+"8xEKzxXTI4","WmadAlViBv","9rlg9tAOsr","WMiS3uLtKs","16lHcaez9y","zFgtBRACuj","2NslmgjUTu","uZPqgiqv4k","IjTwPM6qcG","uoStwiqv4k",
+"s4786NhXdu","DcpWBfmIK1","HlUbFJXljW","M3zXLpT8wu","rhl0JprNT6","HzZT89y4lw","5Drn0ydG8U","lpF6WRpBQm","618DiFhtgl","zz4ZU2TRI7",
+"fcJOy48cHL","JKWYRCfgr3","QnJ1SUlU3M","FjHXR0PktI","StlDJcL0aE","CNHmvy94nw","NcICAlm0pD","In3NSlweGy","45cIHL7cGc","XflUqprNT6",
+"RkQketjQxs","gdQsSzY1GY","Q6hMCcShY2","BpYhVlpF6W","lkMUA618Di","v8yFNAgJHQ","yvOMI5IhmG","LbRTHRBhp0","nlaByStlDJ","yToGWuN6r3",
+"StlDJpmeCd","uZPqguZPqg","FFDuiMojnP","S2DfuiKqhr","Rxrsm7X3uy","jfREubZLvS","MojnPVprf2","wDajXHP433","Ss0ZuThjNn","kZANmCxVEf",
+"pT8wuRzaZA","ZuDtDhE1Ql","Z4I1v5IhmG","yToGWFNYIM","LewvMprNT6","64s8NrKDLJ","Cfgr3xciqp","hYBCK14FLR","6q6L9Uvlv4","CdyBVBFkb8",
+"IjTwP7X3uy","cL0aEuQIcz","S77LH48cHL","C2IrcazIWp","rKDLJYw2oU","uJScXZuDtD","EOE1oM6qcG","MojnP5VZjS","4W0TldmoS7","WMiS3CqqaD",
+"gdQsSRpBQm","9GXkXlm0pD","yvOMIxXTI4","5iGN5P6bcg","RpBQmY1mC0","FhtglFjHXR","5Drn0pAhR1","CK5W7lXFOB","VLTy6iwzGk","ZJTXHHP433",
+"9rlg9pv0i7","8RCUAJXljW","VIlwPOz8yZ","Cp3mZni2v1","5ZaEzm4bxU","nFqiks4786","2NslmQ6Lix","NhXduB3qem","yofH3zz4ZU","NAFuw45cIH",
+"CxVEfFnPFB","0YAGH29QAz","i3pydWPmlx","HlUbFlCMxy","64s8N3otm6","FGzgph1zcH","Z4I1vUl4a1","14FLRfmIK1","Dz1R329QAz","KASQ8WPmlx",
+"uZPqgdQ586","lm0pDP6bcg","MmKGJCK5W7","k85Ae8hJdt","W7cTsVjCZq","LewvMB3qem","lpF6WuN6r3","nnP8opmeCd","lpF6Wdjsrv","mX2GENo0Qb",
+"taOXK7hyVv","NAFuwVBjhz","Zv7z0WPmlx","qUJMdWaim6","y94nwLDk6f","VIlwPxReec","SjskQm4bxU","rhl0JhE1Ql","OUYuFZuDtD","Mkgy8JXljW",
+"16lHcrhl0J","DQimpgtCA5","IjTwPaL6AJ","Vprf2euZA5","zHF1qFhtgl","zHF1qQ6hMC","LbRTHpFrrl","FcWrWECMvU","lm0pDtaOXK","hE1Ql8RCUA",
+"iwzGkSmGzv","dhSuHlXFOB","I7p2aWPmlx","lkMUAO3iyQ","HP433tjQxs","fcwDacL0aE","kZANmlweGy","WDVWJ7fKYU","6q6L9lH1kt","kZANms93Ml",
+"IBe8kkZANm","EdBKctlILt","M3zXLC2Irc","n8pJ92hEEU","tl72Wulk41","zbIYYyvOMI","bgJAzBFkb8","Vprf2CK5W7","5VZjSEOE1o","5nmWv4W0Tl",
+"jSjS3i7WMQ","dQ586mz8gx","atef28TxD7","vLsmSaL6AJ","o8UydvLsmS","SbRYyDz1R3","uTacxWMiS3","ZzJHWMkgy8","LbRTHfqypy","yEfy9jiVBP",
+"jeskSPYBf4","5Mg9rlkMUA","uvf7A5Drn0","BGaQYFjHXR","iKqhrrKDLJ","jSjS3Gv3Fq","JIqXiHP433","WaWsv6q6L9","zFgtBuPX7G","HzZT8XflUq",
+"2DREsHlUbF","s93MljeskS","mz8gxkB5nP","Waim6HzZT8","7fKYUoVQp6","4QMc9S77LH","FcWrWW7cTs","3otm6BFkb8","NhXduaFFss","hYBCK9GXkX",
+"0BmCyMGlTF","OUqFMoGu6x","RBhp07ku1p","1LB1Latef2","nlaByS2Dfu","I7p2aXflUq","IjTwPv1Hln","okgRiWaWsv","0h1b1wiHrZ","ECMvUAIYUu",
+"POUYSDQimp","2TRI7Kr8ys","gdQsSk85Ae","pv0i7b29RJ","55rfBoQ87r","zY1GYReKEW","hi5X7GrDg7","KZamHMmsIo","oGu6xEOE1o","lViBvZuDtD",
+"h1zcH5Namm","7ku1pHzZT8","QWxoTguMb8","jSjS3uPX7G","Ss0ZuxXTI4","Yw2oUMm8si","wDajXeuZA5","tvdkDbZLvS","IjTwPpvgjS","i7WMQWDVWJ",
+"HzZT8HP433","qQxHPhE1Ql","5ZaEzReKEW","BFkb8RkQke","jtn0XBFkb8","b29RJyofH3","0BmCydmoS7","gf8rIIjTwP","bgJAzIKxdL","uZPqgS2Dfu",
+"6AFT0sqVrf","hE1QlRsQUq","dhSuHzHF1q","FjHXRBpYhV","oGu6xvLsmS","hSSvQdQ586","zY1GYK4GS8","Ss0Zuxciqp","FFDuiVprf2","uJScXs93Ml",
+"No0QbjfREu","8cVD3Pb1pa","oVQp6rhl0J","5Drn0AXpwE","AXpwElsQGo","FPfSEW7cTs","Kr8ysI7p2a","5nmWv7Ow5C","TCgPp5drc6","EoToPjtn0X",
+"zmLYDK4GS8","3weIFKsjRK","Ss0ZuguMb8","pmeCdRBhp0","AmdQdHRxd8","VIlwPzY1GY","FwEJzuLtKs","lpF6WS2Dfu","GWqqXKASQ8","prNT6FcWrW",
+"5iGN5d85a9","7hyVvQChxs","Cp3mZazIWp","uTacxCK5W7","Cfgr3fLNg8","nFqik5IhmG","Uvlv4soy9t","dmoS7ReKEW","HlUbFoGu6x","9eoRcuJScX",
+"IRh48ksJby","QnJ1S5ZaEz","lViBv2hEEU","3otm6C2Irc","ZzJHW5IhmG","iqv4kl83Ud","KZamHECMvU","5drc6xciqp","lH1ktb29RJ","qaofND6rBy",
+"ZUnqtHlUbF","oVQp6gIYvE","O3iyQPb1pa","9iGoTKr8ys","sx5Gl0YAGH","CK5W7AkKTk","XyPZNDz1R3","SmGzv14FLR","jS1ajVLTy6","djsrvAXpwE",
+"Cp3mZAmdQd","KsjRKVerEA","zFgtBd85a9","uPX7GlkMUA","lXFOBtlILt","9GXkXrz7Ut","SjskQRmDcr","IRh480MR5X","DG4sTTa8f6","Pb1paa00b5",
+"SjskQZUnqt","CK5W7i3pyd","mz8gxP6bcg","VjCZqCK5W7","zz4ZUvkCHH","uPX7G8FmFH","nFqikWreyP","i7WMQ14FLR","7X3uygdQsS","lsQGo4dEz6",
+"vkCHHLbRTH","mX2GEdQ586","fcJOybZLvS","RpBQmuLtKs","OUqFMzQt6Q","GWqqX8TxD7","SbRYyxReec","x3LDeP6bcg","taOXKHfyNQ","SjskQFVMxo",
+"vkCHHgjUTu","LewvMOUqFM","MezSWStlDJ","BbwgAWmadA","iwzGk9rlg9","CNHmvpWiOs","nlaBy7ku1p","Cfgr3K20wK","Ul4a1ZuDtD","x3LDeuLtKs",
+"pWiOsjeskS","SWfouJIqXi","RsQUqiB08l","Gv3FqAXpwE","hYBCKQssNC","WMiS3wDajX","NhXdut98iW","0Wr5yzHF1q","YjB9to8Uyd","MaJQsIRh48",
+"W7cTsbZLvS","t98iWRsQUq","2DREsHRxd8","iKqhrulk41","okgRijeskS","OUqFMoQ87r","L7cGcYh1hF","9XyT9HP433","FPfSEGrDg7","YOfrYYw2oU",
+"POUYSZuDtD","o8UydtvdkD","FGzgpNhXdu","VjCZqksJby","s47868RCUA","ZhwG19eoRc","okgRiPOUYS","Q6hMCTXQ0Z","gtCA5tAOsr","1v5hHwiHrZ",
+"uoStwix74r","ksJbyjS1aj","gdQsSJRJQB","cShY207n1c","QChxsM3zXL","QnJ1S0Kyfs","e6e4zpvgjS","B3qemP6bcg","IKxdL5iGN5","K4GS8QWxoT",
+"jfREuFGzgp","B3qem1v5hH","kB5nPDcpWB","ydG8U0ao3l","AgJHQVerEA","o8Uyd7lUXZ","CK5W7ZJTXH","lkMUAMkgy8","FcWrWUvlv4","uvf7AGXdoH",
+"7ku1pXyPZN","SmGzvOz8yZ","3weIFiB08l","aDGtSMmKGJ","blLA9he9IA","lpF6W5drc6","QYxC0DLhzM","iwzGkyluBx","okgRihi5X7","NOHszDG4sT",
+"RxrsmWaim6","uN6r3NcICA","jeskSZ4I1v","JkzUnxReec","Vprf2SjskQ","suY4xCNHmv","EdBKcoGu6x","WDVWJyluBx","C2Irc1v5hH","4QMc9BFkb8",
+"RkQkeMGlTF","9XyT9ydG8U","v2eC3Ul4a1","AkKTk5Namm","AkKTkReKEW","t98iW7ku1p","ksJbylkMUA","JXljWiqv4k","uoStw7fKYU","AIYUuCfgr3",
+"45cIHJIqXi","cL0aEiqv4k","Z4I1vfmIK1","9GXkXFcWrW","TwanoHfyNQ","RACujG1RhS","RACujRxrsm","i7WMQjeskS","o8Uyd5Namm","Z4I1vMm8si",
+"atef2Cp3mZ","uJScXlXFOB","1j5L8IRh48","PYBf4Ul4a1","Waim6tvdkD","x3LDeRmDcr","djsrvAmdQd","yEfy96AFT0","KZamH3weIF","Uvlv4CIShG",
+"Yw2oUhUTw7","Z4I1vUvlv4","hYBCKRkQke","k85AezqH0W","M6qcGvLsmS","JRJQBJKWYR","xReecLDk6f","CdyBVZv7z0","hYBCK55rfB","8cVD3K20wK",
+"KsjRK3weIF","bZLvSoVQp6","HzZT8zz4ZU","OUqFMHfyNQ","8FmFHdjsrv","zQt6Q9y4lw","RBhp0EOE1o","0Wr5yy94nw","NcICA9GXkX","XyPZNReKEW",
+"rKDLJ5Namm","9y4lwFNYIM","Chuy3cL0aE","ZUnqtlkMUA","OUqFMxciqp","lH1ktAgJHQ","JJs5mFnPFB","lCMxynnP8o","0BmCyi7WMQ","iqv4khE1Ql",
+"OUqFM7fsYM","M3zXLS77LH","t59lRiqv4k","gtCA5cmXIX","Ta8f60MR5X","v1HlngjUTu","AgJHQKr8ys","7X3uy4dEz6","HlUbFCqqaD","MmsIoyofH3",
+"n8pJ98FmFH","PYBf4JKWYR","uvf7AQClRL","1v5hH0PktI","lj07QNo0Qb","HRxd8WmadA","MezSWpiJSk","RxrsmAXpwE","MaJQsoVQp6","oQ87ro8Uyd",
+"AmdQdFnPFB","fcwDapvgjS","DcpWBKsjRK","lweGyHzZT8","ZuDtDyofH3","ThjNnNhXdu","oQ87ryEfy9","ix74rciuWz","Waim64QMc9","StlDJuJScX",
+"Q6hMCoVQp6","8FmFHh1zcH","J2mQiaFFss","gf8rIMmKGJ","9eoRcQWxoT","5nmWv16lHc","LbRTHOHaBz","o8UydFLsph","d7vjMCK5W7","i7WMQix74r",
+"NhXduulk41","29QAzjfREu","pAhR1BCxeC","NAFuwfcwDa","rhl0J1LB1L","6AFT0zHF1q","kZANmXyPZN","580YDd7vjM","5ZaEzd85a9","Q6LixRmDcr",
+"v1Hln45cIH","cQOnvydG8U","TXQ0ZMojnP","guMb85IhmG","5drc6DcpWB","uN6r3LewvM","8U2nUokgRi","JJs5mgjUTu","HP433Nxx9V","lkMUAYjB9t",
+"ulk41uJScX","2DREsEdBKc","euZA5YjB9t","uZPqgkB5nP","HlUbFv1Hln","blLA9hi5X7","uoStwQbxXc","5nmWvRACuj","k85AeYh1hF","AOgEeHzZT8",
+"7lUXZa00b5","AgJHQOUYuF","yEfy90YAGH","kB5nPVjCZq","MmsIo8TxD7","Yh1hFVBjhz","Yw2oUQWxoT","lsQGo2DREs","TCgPpWreyP","i3pydJJs5m",
+"UmaEvGSQwj","Yf2Ec9eoRc","zQt6Qlm0pD","WreyPBbwgA","CqqaDY1mC0","ni2v12Yz7E","J2mQiDLhzM","fcwDa7ku1p","WmadAMmKGJ","QYxC07X3uy",
+"lsQGoZzJHW","uTacxtlILt","dhSuHZUnqt","9XyT97X3uy","zqH0WMm8si","pFrrlhe9IA","WmadApvgjS","ZzJHWaFFss","suY4xYh1hF","RsQUqi3pyd",
+"ECMvUdpe1v","cmXIX2TRI7","m4bxUsqVrf","5Nammv8yFN","Mm8sie6e4z","Yh1hFMkgy8","StlDJlXFOB","zqH0WSjskQ","JJs5mogLgc","MmsIoPb1pa",
+"zz4ZUrKDLJ","lj07QIn3NS","d7vjMiqv4k","fLNg86AFT0","Ul4a1cmXIX","2hEEUuupzk","FGzgpZJTXH","8cVD3dpe1v","4W0TluZPqg","atef27ku1p",
+"xciqpJkzUn","X6PinyToGW","Gv3FqazIWp","L7cGcLbRTH","IRh48iwzGk","JkzUnTXQ0Z","zqH0Wm4bxU","WPmlxCK5W7","HP433k85Ae","oQ87rpmeCd",
+"CK5W7lj07Q","0ao3lprNT6","iKqhrThjNn","0PktIK4GS8","IjTwPvkCHH","hYBCKtlILt","pvgjSGSQwj","AIYUuQworu","5ZaEztl72W","Ss0ZuUlU3M",
+"Pb1payToGW","pT8wutl72W","pFrrlpWiOs","3weIF7ku1p","No0QbkB5nP","Mm8sikB5nP","SbRYylweGy","vLsmSzz4ZU","QClRLWmadA","ni2v1P6bcg",
+"ECMvUhi5X7","dhSuHF6PT2","C2IrcW7cTs","k85Aelj07Q","RzaZA1LB1L","YjB9t16lHc","dpe1vtl72W","Yw2oURkQke","cQOnvwiHrZ","ZuDtDDLhzM",
+"ThjNn7fKYU","FjHXRRxrsm","0ao3lzY1GY","CK5W7VNCPd","CdyBVMK07Y","KZamH16lHc","zQt6Ql83Ud","DLhzMWDVWJ","zz4ZUS77LH","WreyPaL6AJ",
+"Q6hMCbrhlQ","jfREuQ6Lix","5nmWviKqhr","Ta8f6WmadA","D6rBy0YAGH","5Mg9rQYxC0","nlaByFjHXR","bZLvS5Mg9r","zY1GYpWiOs","s7MxkP6bcg",
+"StlDJ8U2nU","suY4xdhSuH","FcWrWzQt6Q","MmKGJ7fKYU","xReecuPX7G","guMb8uJScX","RzaZAt98iW","faHirVjCZq","BpYhVNAFuw","Yh1hFdhSuH",
+"HzZT8uPX7G","Q6LixXyPZN","h1zcH8TxD7","2TRI745cIH","ReKEWhi5X7","s47868cVD3","b29RJ5ZaEz","QYxC09eoRc","HlUbFZzJHW","ksJbylXFOB",
+"AXpwEfmIK1","hYBCKWreyP","atef27fKYU","hYBCKCfgr3","uoStw14FLR","qQxHPqUJMd","rhl0J0MR5X","7ku1pQworu","1j5L8dQ586","CIShGi7WMQ",
+"5IhmGd7vjM","lXFOBjtn0X","StlDJgIYvE","gIYvEzmLYD","HzZT8GWqqX","IKxdLF6PT2","jSjS30Wr5y","D6rByRpBQm","pAhR1aL6AJ","hYBCKb29RJ",
+"MmKGJJkzUn","WMiS3FjHXR","FVMxogdQsS","jSjS3IjTwP","HlUbF16lHc","AIYUuaL6AJ","taOXKHRxd8","580YDPOUYS","5Mg9rzz4ZU","D6rByW7cTs",
+"DLhzM24ARF","580YDtl72W","pv0i7EOE1o","0ao3lo8Uyd","ZUnqtogLgc","uZPqgJRJQB","bgJAzFVMxo","jS1ajAIYUu","fqypy3weIF","JJs5mY1mC0",
+"ix74rMezSW","JIqXie6e4z","WDVWJlViBv","fcwDaQssNC","GSQwjulk41","qaofNWMiS3","VBjhzZUnqt","Uvlv4Uvlv4","9XyT9Oz8yZ","24ARFIKxdL",
+"55rfBQnJ1S","zqH0WK4GS8","pT8wuprNT6","oQ87rl83Ud","tl72WSs0Zu","VerEAAgJHQ","zFgtBzY1GY","zmLYDyofH3","FcWrW0YAGH","3weIFK20wK",
+"HzZT8uZPqg","FxX9qVjCZq","0ao3lAXpwE","zQt6QFwEJz","kZANmUmaEv","FNYIMJ2mQi","sqVrfm4bxU","vkCHHTCgPp","s93MllViBv","vOqCEwiHrZ",
+"Waim6v2eC3","5Mg9rKr8ys","FcWrWksJby","jeskSzbIYY","uoStwJIqXi","7fsYM29QAz","euZA5RmDcr","LbRTH3weIF","nlaByhi5X7","TXQ0ZMkgy8",
+"Yh1hF8U2nU","JJs5mS77LH","U3yw5n8pJ9","HRxd8580YD","POUYSWaim6","FNYIMgjUTu","0PktIa00b5","TCgPp5VZjS","JRJQBeuZA5","v1HlnoQ87r",
+"EoToPoQ87r","aL6AJQChxs","0Kyfsv1Hln","RmDcrv8yFN","FcWrWqQxHP","aez9yIRh48","24ARFuZPqg","SbRYyVIlwP","QYxC0he9IA","W7cTsWmadA",
+"29QAzn1pmO","ksJbyFVMxo","JkzUnOUYuF","lH1ktjeskS","uQIcz1LB1L","fLNg8VjCZq","iKqhrOHaBz","zqH0W0PktI","3otm6U3yw5","7X3uylkMUA",
+"55rfBQClRL","7hyVvQ6hMC","dpe1vpT8wu","okgRiSWfou","vLsmSLewvM","tuDySFxX9q","prNT6ThjNn","VjCZqRmDcr","WDVWJuvf7A","LewvM1j5L8",
+"8cVD3Cp3mZ","5nmWv0YAGH","QClRLCp3mZ","WmadAUvlv4","aFFssjSjS3","IBe8kS2Dfu","x3LDeQ6hMC","FPfSE580YD","bZLvSAkKTk","kB5nPCdyBV",
+"lkMUAThjNn","5Namm7X3uy","14FLR5VZjS","hE1QlDQimp","FnPFBuTacx","Yh1hFWMiS3","vLsmSVprf2","5VZjSjeskS","AmdQdQChxs","CdyBVWPmlx",
+"qQxHPGSQwj","atef2bgJAz","5VZjSvkCHH","Vprf2dmoS7","Yh1hFOxWIH","IBe8k2DREs","s4786Qworu","CqqaDNo0Qb","Mkgy8zHF1q","yEfy9WDVWJ",
+"lpF6W29QAz","7Ow5CWMiS3","9iGoTtaOXK","48cHLMGlTF","wiHrZUmaEv","O3iyQuQIcz","Cp3mZaDGtS","tlILtQClRL","RxrsmWMiS3","S77LHRpBQm",
+"RkQkeTa8f6","lpF6WSs0Zu","StlDJCdyBV","EoToPFVMxo","1LB1L0ao3l","POUYSb29RJ","YOfrYDcpWB","k85Ae0Wr5y","AIYUuRkQke","euZA57fKYU",
+"0PktItjQxs","5nmWvIBe8k","Oz8yZSmGzv","8FmFHi7WMQ","QworuCK5W7","HlUbFyEfy9","9y4lwd7vjM","zQt6Q07n1c","s4786jzUqR","brhlQPOUYS",
+"CK5W7VBjhz","atef2xReec","ZzJHWKr8ys","zbIYYVIlwP","QWxoTZ4I1v","QChxsLbRTH","In3NSjS1aj","bgJAzv8yFN","QWxoTBFkb8","yToGWcQOnv",
+"VIlwPn1pmO","hSSvQBCxeC","iB08l0BmCy","Cp3mZMK07Y","RmDcrguMb8","jfREuLDk6f","tAOsrjeskS","Z4I1vWMiS3","M6qcG0Wr5y","9rlg9o8Uyd",
+"9XyT9AXpwE","soy9tRzaZA","FhtglD6rBy","CIShGFxX9q","SmGzvPYBf4","lkMUAcShY2","16lHcyEfy9","soy9tWDVWJ","Mkgy8a00b5","suY4x0PktI",
+"HfyNQm4bxU","DG4sToGu6x","cShY2tuDyS","XyPZNMmsIo","wiHrZ4W0Tl","bgJAzKASQ8","cQOnvNcICA","9iGoT9iGoT","2TRI78hJdt","618DiGSQwj",
+"RzaZAlweGy","qUJMdgdQsS","zY1GYgdQsS","AIYUuhE1Ql","kZANm5ZaEz","AIYUu8xEKz","uJScXx3LDe","ni2v1qUJMd","SmGzvjtn0X","ZJTXH5iGN5",
+"ix74rxciqp","55rfBFGzgp","9rlg9IBe8k","2NslmKZamH","KZamHVerEA","s7Mxk5Namm","BbwgAdQ586","IKxdLFcWrW","v1HlnMkgy8","K20wK2Yz7E",
+"gdQsSxReec","OUqFM7hyVv","wDajX55rfB","ulk418U2nU","ydG8UAIYUu","uPX7G29QAz","580YDjS1aj","7fKYUIRh48","Cp3mZgjUTu","AIYUuYf2Ec",
+"NAFuwMK07Y","gdQsSdhSuH","0PktIlkMUA","580YDh1zcH","Cfgr3EdBKc","7X3uyUvlv4","618DizqH0W","LDk6f5iGN5","C2Ircb29RJ","lkMUA2Nslm",
+"0ao3lQbxXc","EdBKcqaofN","d85a92ZHdk","prNT6dmoS7","FxX9qzY1GY","CqqaDa00b5","zbIYYCdyBV","ReKEWZuDtD","QChxs9rlg9","i7WMQnlaBy",
+"MmsIoZ4I1v","2NslmKr8ys","W7cTsru4UG","hYBCKCqqaD","pvgjS8FmFH","blLA9fFDrJ","JJs5m3otm6","VLTy60Kyfs","jS1ajcShY2","SbRYy16lHc",
+"jS1ajvkCHH","uAWypBGaQY","lpF6WJIqXi","Vprf2b29RJ","XyPZNBbwgA","2DREsFNYIM","1j5L8F6PT2","UmaEvCdyBV","C2IrcC2Irc","Y1mC0NOHsz",
+"uN6r3tjQxs","AgJHQYf2Ec","ZJTXHFPfSE","nlaByuN6r3","KsjRKgtCA5","Ss0ZuSmGzv","wiHrZB3qem","Yf2EcFjHXR","zz4ZU9iGoT","Y1mC0AkKTk",
+"bZLvSYOfrY","pFrrlqQxHP","NhXduzHF1q","dhSuH24ARF","Yf2EcI7p2a","Yw2oU6AFT0","RzaZARxrsm","ix74rQ6Lix","piJSks7Mxk","sx5Gle6e4z",
+"Nxx9VJ2mQi","MmsIohUTw7","VBjhzaez9y","QssNCxReec","l83UdWaWsv","k85AeZUnqt","i7WMQoGu6x","fmIK1jSjS3","Yf2EcCdyBV","hYBCKMezSW",
+"i7WMQdmoS7","5IhmGv8yFN","CNHmvStlDJ","580YDFNYIM","EdBKcMojnP","pvgjSaDGtS","SjskQdhSuH","HzZT87hyVv","prNT6lm0pD","U3yw5s7Mxk",
+"HlUbFcL0aE","faHir14FLR","uLtKsn1pmO","EdBKcs7Mxk","AOgEe7fKYU","CxVEfRmDcr","Z4I1viwzGk","zHF1qxXTI4","xReecL7cGc","lkMUABGaQY",
+"SWfouGrDg7","DQimpOHaBz","QssNCL7cGc","NcICAbrhlQ","uN6r3yvOMI","faHirJRJQB","hSSvQjiVBP","XflUqF6PT2","BpYhVGrDg7","7X3uyx3LDe",
+"i3pydlkMUA","EOE1oNxx9V","8U2nUaez9y","8xEKz2Nslm","Oz8yZni2v1","0BmCynnP8o","zHF1qksJby","dmoS724ARF","aez9yKsjRK","nFqikBGaQY",
+"9eoRcTwano","0MR5XyToGW","4W0TlzqH0W","tAOsrUmaEv","pWiOs0Wr5y","hYBCKnFqik","k85Ae5nmWv","ix74r48cHL","faHirlkMUA","a00b5SWfou",
+"64s8Ndpe1v","l83UdQClRL","v8yFNC2Irc","Y1mC055rfB","Pb1pas93Ml","O3iyQOUYuF","hYBCKB3qem","MaJQsa00b5","ksJbyXflUq","v1HlnblLA9",
+"i7WMQ5IhmG","Ul4a1I7p2a","ru4UGgdQsS","D6rBymX2GE","oGu6xlH1kt","FGzgpFGzgp","Kr8ysWaWsv","Cfgr3jfREu","mX2GEEoToP","JJs5m4W0Tl",
+"rhl0JC2Irc","WreyPRACuj","WaWsv5nmWv","hSSvQd85a9","16lHcDLhzM","SjskQ48cHL","Ss0ZuLDk6f","5drc6DQimp","hE1Qluvf7A","CK5W79GXkX",
+"07n1cpFrrl","3otm6hi5X7","8U2nUEoToP","Chuy3uJScX","XflUqjtn0X","zFgtB16lHc","1j5L85ZaEz","14FLRAmdQd","5NammYjB9t","MmsIoCK5W7",
+"TCgPpFFDui","lH1ktDLhzM","Waim6JkzUn","blLA9IRh48","ru4UG3otm6","Ta8f6uAWyp","RzaZA9y4lw","CxVEfvLsmS","QWxoTTCgPp","IKxdLStlDJ",
+"8FmFHaL6AJ","nFqikBCxeC","Dz1R32Nslm","MGlTFfLNg8","Uvlv4hE1Ql","StlDJWPmlx","zHF1qDcpWB","M3zXLv8yFN","5drc68RCUA","RsQUqXyPZN",
+"hSSvQMojnP","yEfy9oVQp6","iwzGktuDyS","uQIcztAOsr","s4786Q6hMC","No0Qb8xEKz","yEfy9wiHrZ","JkzUnRsQUq","uPX7Gk85Ae","8hJdt55rfB",
+"jiVBPUlU3M","ru4UGSjskQ","O3iyQWMiS3","Ta8f6WDVWJ","07n1cogLgc","uLtKswDajX","lCMxyP6bcg","0h1b1EOE1o","nnP8oKZamH","CNHmvWMiS3",
+"DG4sTdpe1v","580YDW7cTs","gdQsSSWfou","0ao3lgjUTu","cQOnvRBhp0","0BmCyqUJMd","W3VFHBGaQY","1v5hHlH1kt","qQxHPbZLvS","lpF6Wv2eC3",
+"8U2nUtjQxs","zY1GYvkCHH","07n1cSbRYy","cShY2CNHmv","5iGN5Oz8yZ","W7cTsM3zXL","ksJbyzFgtB","DQimpuJScX","lj07QPOUYS","5Mg9rb29RJ",
+"Ta8f6Nxx9V","h1zcH5ZaEz","uN6r3Vprf2","29QAz8cVD3","WaWsvjSjS3","0h1b1ydG8U","jzUqRZUnqt","Z4I1vQ6hMC","Oz8yZwiHrZ","e6e4zjS1aj",
+"0ao3ldQ586","ulk41euZA5","VjCZqQnJ1S","GWqqXpv0i7","VerEAdpe1v","jfREuWmadA","I7p2aRxrsm","RBhp0lj07Q","K4GS8fLNg8","CdyBVl83Ud",
+"gIYvE14FLR","v8yFNcmXIX","5Drn0v8yFN","8U2nU618Di","55rfBVerEA","xXTI4FcWrW","StlDJ1LB1L","07n1cgf8rI","guMb8rz7Ut","8RCUAThjNn",
+"jiVBP7X3uy","Gv3FqWMiS3","lkMUAlCMxy","7X3uyoGu6x","580YDKr8ys","O3iyQulk41","5NammEoToP","FxX9qX6Pin","KsjRK3otm6","1j5L8SWfou",
+"Mm8si2hEEU","5IhmGt98iW","cL0aElweGy","QworuFwEJz","gtCA52hEEU","In3NSJkzUn","yvOMIEdBKc","2ZHdkprNT6","5iGN5NcICA","5Drn0nFqik",
+"tjQxsm4bxU","MezSWyToGW","6AFT0zz4ZU","7lUXZHzZT8","v2eC3YjB9t","tl72WAXpwE","VLTy6IBe8k","v1Hlnd7vjM","YOfrYQ6Lix","CqqaDFjHXR",
+"ru4UGkB5nP","ix74rt59lR","djsrvhE1Ql","vOqCEReKEW","0PktInnP8o","M3zXLjfREu","a00b5BpYhV","8RCUANhXdu","tl72WdhSuH","9y4lwVIlwP",
+"4dEz6pmeCd","1v5hH7Ow5C","qUJMdOUYuF","6q6L9SjskQ","TwanozmLYD","ECMvU7fKYU","euZA50YAGH","Yw2oUOUYuF","FxX9qwiHrZ","k85AenlaBy",
+"FGzgpWaWsv","pv0i7Oz8yZ","CqqaDVIlwP","XyPZNhi5X7","7Ow5CuTacx","kB5nPLbRTH","2DREsciuWz","YOfrYlCMxy","MojnPM6qcG","4W0Tlni2v1",
+"B3qem5Namm","n8pJ9atef2","dpe1vsx5Gl","iB08lWMiS3","MGlTF3otm6","fcwDaYf2Ec","ZJTXHECMvU","ru4UGNhXdu","cQOnvjfREu","5drc6Ul4a1",
+"d7vjMdjsrv","D6rByfmIK1","Y1mC0yofH3","FjHXRCNHmv","MmsIoSWfou","ulk41Mkgy8","jzUqRWDVWJ","zY1GYiwzGk","soy9tprNT6","GXdoHxReec",
+"cmXIX07n1c","In3NSksJby","Nxx9VThjNn","cShY2cmXIX","ciuWzZhwG1","64s8NfLNg8","FxX9qsoy9t","ydG8UFVMxo","tl72WPb1pa","D6rBym4bxU",
+"QYxC007n1c","Q6Lix2Yz7E","LbRTHAgJHQ","TwanoGrDg7","Chuy33weIF","gf8rIJXljW","Zv7z0aDGtS","wiHrZUvlv4","8cVD3FjHXR","BFkb8K20wK",
+"Mm8siQWxoT","Mm8sijzUqR","WaWsvTwano","zFgtBYOfrY","45cIH5IhmG","RkQkejSjS3","iKqhrZhwG1","J2mQizz4ZU","J2mQixXTI4","Yf2Ec2Nslm",
+"qUJMd8xEKz","24ARFpv0i7","14FLR5drc6","hi5X7DQimp","fcwDaEOE1o","AgJHQaez9y","dpe1vokgRi","4W0TlfaHir","wiHrZK4GS8","mz8gxWaWsv",
+"QbxXcru4UG","lweGydhSuH","oVQp62TRI7","DLhzM7Ow5C","QnJ1S9iGoT","Nxx9V0h1b1","jSjS3RsQUq","SWfou55rfB","y94nwoQ87r","ZJTXHBFkb8",
+"hi5X7EdBKc","RsQUqK20wK","d7vjMtl72W","iB08liqv4k","xciqprKDLJ","GSQwjSjskQ","DG4sT4W0Tl","gIYvESs0Zu","O3iyQzY1GY","ZJTXHLDk6f",
+"Q6hMCn1pmO","Mm8siThjNn","iKqhrXflUq","lCMxyYh1hF","O3iyQ3weIF","Kr8ysdjsrv","PYBf4Q6hMC","ix74rJXljW","tvdkDYOfrY","nlaBynFqik",
+"FVMxoNOHsz","Yw2oUjzUqR","pAhR15Mg9r","iqv4kaez9y","Ss0ZuBpYhV","b29RJpiJSk","fcwDa48cHL","mX2GEni2v1","gtCA5yluBx","gf8rIIBe8k",
+"MaJQs8RCUA","ru4UGydG8U","Z4I1vFFDui","5Drn0UlU3M","NAFuwzmLYD","CxVEfgjUTu","FVMxoFLsph","45cIHX6Pin","JIqXi8FmFH","zQt6QpAhR1",
+"taOXK9eoRc","uupzki7WMQ","Mm8siYf2Ec","SmGzvm4bxU","WPmlxFVMxo","ZuDtDCqqaD","kZANmQ6hMC","l83Ud618Di","Ss0ZuNo0Qb","MmKGJs4786",
+"t98iWpFrrl","qUJMd2ZHdk","Waim6NOHsz","Mm8siG1RhS","uTacxAkKTk","tAOsr9eoRc","zmLYDTCgPp","0MR5X5VZjS","pmeCdVerEA","wDajXK20wK",
+"ogLgcWaWsv","he9IAlkMUA","vLsmSm4bxU","RxrsmKZamH","gIYvEWreyP","1j5L80h1b1","lj07QTXQ0Z","5Namm8RCUA","s93MlMaJQs","AIYUuvkCHH",
+"lm0pDGWqqX","IjTwPZuDtD","0Kyfs1j5L8","n8pJ914FLR","DG4sTokgRi","CqqaDFLsph","bgJAzBCxeC","HP433VIlwP","8U2nUnnP8o","fmIK1Ta8f6",
+"GXdoH7fKYU","In3NSlsQGo","fLNg829QAz","45cIHMkgy8","cL0aERzaZA","P6bcg0PktI","Oz8yZXyPZN","07n1ctuDyS","HfyNQGSQwj","JkzUn9eoRc",
+"qUJMdU3yw5","n1pmOs4786","h1zcH580YD","In3NSsx5Gl","K4GS8QClRL","RmDcrZv7z0","nnP8olViBv","ZUnqtoGu6x","uN6r39rlg9","M3zXLiwzGk",
+"0Wr5ym4bxU","JXljWI7p2a","RACujAmdQd","rKDLJVprf2","AmdQd29QAz","W3VFHLewvM","yluBxl83Ud","5Drn05Drn0","In3NSulk41","zz4ZUtuDyS",
+"Ta8f6k85Ae","SjskQ2TRI7","uQIczy94nw","uLtKstvdkD","JKWYRnlaBy","Kr8ys5nmWv","DcpWB8hJdt","lXFOBeuZA5","NAFuwW3VFH","9GXkXksJby",
+"x3LDeB3qem","9GXkXCNHmv","pT8wu5ZaEz","OUqFMECMvU","ksJbye6e4z","0ao3l45cIH","K20wKFwEJz","zFgtB0MR5X","1LB1L2Yz7E","sx5GlaDGtS",
+"v2eC3gdQsS","wDajXW3VFH","uN6r3uZPqg","Gv3Fq16lHc","JRJQBfcwDa","pv0i7a00b5","2TRI7VNCPd","VerEAi7WMQ","piJSk618Di","fFDrJNo0Qb",
+"14FLRzQt6Q","Z4I1vJKWYR","Ss0ZudmoS7","WreyPoQ87r","Ss0Zutl72W","NcICAG1RhS","uJScXMezSW","h1zcHyluBx","MojnPnlaBy","48cHLQbxXc",
+"lweGyCK5W7","WmadA0BmCy","NAFuwru4UG","lH1ktMK07Y","uAWyp5Namm","vkCHHqQxHP","FnPFBJIqXi","Oz8yZiwzGk","RsQUq9iGoT","RxrsmcmXIX",
+"Ss0ZuQbxXc","s4786NOHsz","7X3uyS77LH","lsQGoK20wK","VIlwPfLNg8","X6PinOHaBz","jiVBPuLtKs","HP433okgRi","KZamHhE1Ql","aez9yZUnqt",
+"FxX9quPX7G","pvgjSpFrrl","tAOsrt59lR","NhXdunlaBy","tlILt0Kyfs","24ARFDz1R3","GWqqXCNHmv","RxrsmRACuj","AOgEeAIYUu","MK07YazIWp",
+"9iGoTPOUYS","xXTI4P6bcg","5NammNOHsz","jeskS0h1b1","yvOMIlm0pD","hSSvQCIShG","IRh48DG4sT","BGaQY5nmWv","uAWypuZPqg","gdQsSNAFuw",
+"2hEEUReKEW","JJs5mRBhp0","tvdkD64s8N","MK07YRsQUq","azIWpUmaEv","jeskSVIlwP","F6PT25Mg9r","XflUqsx5Gl","NhXdud7vjM","Z4I1vgdQsS",
+"gdQsSIn3NS","3weIF8hJdt","Y1mC0CdyBV","zbIYYLbRTH","5Drn0piJSk","sqVrfjeskS","hUTw729QAz","1LB1Lv8yFN","cQOnviB08l","Mkgy8uoStw",
+"ZJTXH7hyVv","9XyT9pT8wu","hi5X7lH1kt","OxWIHS2Dfu","HlUbFhe9IA","QChxsn1pmO","aL6AJPb1pa","o8UydYh1hF","4W0Tlmz8gx","BCxeC5iGN5",
+"7fKYU4W0Tl","piJSkVjCZq","XyPZNb29RJ","FVMxo3otm6","RACujzHF1q","tl72WZv7z0","7hyVvhYBCK","GrDg7uQIcz","3otm6CdyBV","nFqikJRJQB",
+"UlU3MStlDJ","zFgtBUvlv4","5drc6JJs5m","K20wKJRJQB","U3yw5e6e4z","uLtKsCNHmv","fqypysx5Gl","TXQ0ZHP433","0Wr5yOUYuF","EoToPy94nw",
+"RpBQm9eoRc","Mkgy8EoToP","5IhmGaDGtS","n8pJ9zmLYD","gjUTuRxrsm","RsQUqzQt6Q","fqypyIKxdL","1v5hHQworu","5drc648cHL","ZuDtDRACuj",
+"9rlg9yEfy9","yluBxUmaEv","ni2v1i3pyd","Uvlv4ksJby","DQimpcmXIX","zqH0Whi5X7","ZJTXH55rfB","QbxXcqUJMd","Cp3mZlsQGo","Cp3mZsuY4x",
+"KZamHBCxeC","zQt6QHP433","Mm8siQworu","Ta8f6soy9t","faHirdmoS7","fcJOyVNCPd","ydG8UjSjS3","vLsmSAXpwE","Chuy32hEEU","B3qemRkQke",
+"BpYhVnlaBy","jiVBPNOHsz","blLA9Yh1hF","OHaBz3weIF","0Wr5y5VZjS","bgJAzsuY4x","7X3uyQ6Lix","cShY2WPmlx","In3NSzHF1q","tlILtdhSuH",
+"a00b5hi5X7","7fsYMlkMUA","iwzGkEoToP","rKDLJhSSvQ","dhSuHQssNC","sx5GlyToGW","MezSW9iGoT","s93MlW7cTs","fqypyzqH0W","RmDcrdmoS7",
+"U3yw5ydG8U","Yh1hF3otm6","FNYIMOz8yZ","uQIczzFgtB","rKDLJyvOMI","yEfy9lm0pD","lH1kttvdkD","B3qemlkMUA","StlDJfmIK1","bZLvSECMvU",
+"9XyT9ni2v1","KsjRKkB5nP","d7vjMksJby","KsjRKRkQke","FwEJzIjTwP","2DREsB3qem","MGlTFWaWsv","QWxoTQnJ1S","s7Mxk1j5L8","Pb1pa5Mg9r",
+"rhl0J0BmCy","KZamHMkgy8","rz7Ut4dEz6","7ku1pJIqXi","pT8wuguMb8","M3zXLlm0pD","qQxHP5IhmG","hi5X7gjUTu","v8yFNQ6Lix","Kr8ysHP433",
+"LbRTHHP433","bZLvSuN6r3","x3LDeoQ87r","jiVBP5VZjS","lXFOBECMvU","MezSWAXpwE","wDajXaez9y","5Drn08FmFH","QworuHRxd8","RACujZzJHW",
+"e6e4zSjskQ","Yf2EcTXQ0Z","dQ586IKxdL","FnPFBksJby","d7vjMQChxs","AXpwE14FLR","K20wKt98iW","OUqFM45cIH","Dz1R3MmsIo","zqH0WGXdoH",
+"vOqCEAmdQd","cShY2qQxHP","vkCHHOxWIH","ECMvUKZamH","wiHrZhi5X7","9rlg9lCMxy","k85Ae618Di","kB5nPuZPqg","uQIczpv0i7","lCMxyKASQ8",
+"lH1ktHRxd8","WMiS3AkKTk","vkCHHiqv4k","x3LDeBpYhV","WDVWJdQ586","IBe8kxciqp","ydG8UC2Irc","XyPZNzY1GY","QnJ1SZv7z0","MaJQsY1mC0",
+"iKqhrfcJOy","kZANmaL6AJ","CNHmvIBe8k","fqypyatef2","hUTw72ZHdk","M3zXLEoToP","FVMxoGSQwj","7ku1pbZLvS","hi5X7RsQUq","ECMvUQworu",
+"sqVrffFDrJ","pT8wu1j5L8","M3zXLfqypy","zQt6QyofH3","8FmFHUlU3M","9rlg9IRh48","iqv4k64s8N","uLtKs2Yz7E","zQt6QfcJOy","hUTw7EOE1o",
+"FPfSEIRh48","RACuj7hyVv","4QMc9Ta8f6","JKWYRatef2","hE1QlEoToP","xReecwiHrZ","HfyNQcQOnv","zqH0WFjHXR","fLNg8Ta8f6","GWqqX8U2nU",
+"7fsYMVerEA","v8yFN7hyVv","aL6AJ24ARF","xReecdQ586","55rfBTCgPp","kB5nPdpe1v","oGu6x9XyT9","5Mg9rzqH0W","v1HlnPb1pa","CIShGSWfou",
+"EoToPt98iW","EoToPsuY4x","Cp3mZqaofN","AkKTkoQ87r","TwanoRxrsm","ECMvU7lUXZ","azIWpDLhzM","Ss0ZubrhlQ","DLhzMtaOXK","fcwDaZuDtD",
+"Q6hMCOxWIH","dhSuHpAhR1","J2mQiWMiS3","0YAGH4QMc9","AkKTkVIlwP","wDajXRpBQm","lViBvNOHsz","t59lR6q6L9","FGzgpFNYIM","29QAz1j5L8",
+"qQxHP5ZaEz","G1RhSaL6AJ","AOgEev1Hln","W7cTsvLsmS","Oz8yZatef2","b29RJQssNC","0ao3l1LB1L","QChxsuPX7G","55rfBi3pyd","bZLvSiB08l",
+"tvdkDKASQ8","BFkb8b29RJ","azIWppWiOs","i7WMQKr8ys","IRh48EdBKc","FGzgpBpYhV","0MR5X618Di","brhlQEdBKc","U3yw5Gv3Fq","Oz8yZWMiS3",
+"ECMvUCp3mZ","blLA9Ta8f6","VIlwPyluBx","DQimplXFOB","ZhwG1nnP8o","7X3uy7fKYU","B3qem8cVD3","KASQ8P6bcg","atef2ZhwG1","JIqXiTwano",
+"h1zcHNOHsz","Zv7z0FLsph","brhlQCqqaD","yofH3FxX9q","jiVBPU3yw5","W7cTs5nmWv","FhtgljSjS3","XyPZNBCxeC","0MR5XY1mC0","QClRLyEfy9",
+"In3NSVNCPd","8cVD3RmDcr","G1RhSfFDrJ","I7p2aMmKGJ","WMiS3zz4ZU","5Drn0dmoS7","5Drn0StlDJ","W3VFHnlaBy","2ZHdkcmXIX","yvOMIRsQUq",
+"Yw2oU9rlg9","RsQUqJKWYR","yvOMI0YAGH","ZuDtDCK5W7","XyPZN7lUXZ","iwzGkMkgy8","iwzGkAgJHQ","9XyT9tuDyS","Pb1pas4786","Ta8f6RBhp0",
+"qQxHPAkKTk","9rlg9WaWsv","IjTwPd85a9","fcJOyGv3Fq","6AFT09eoRc","QssNCGrDg7","0PktIzHF1q","3otm65iGN5","hE1Qln8pJ9","48cHLpv0i7",
+"Y1mC0FjHXR","JJs5mlkMUA","0BmCyCxVEf","UlU3Matef2","EoToP1v5hH","OUqFMuoStw","QWxoTzqH0W","AXpwEuTacx","Ul4a1hi5X7","WPmlxX6Pin",
+"DQimpvOqCE","iqv4kazIWp","0ao3lChuy3","zHF1qVNCPd","fcwDaqUJMd","24ARFfmIK1","Mm8siuPX7G","W7cTsdmoS7","nFqikyToGW","soy9t5iGN5",
+"nnP8oEOE1o","m4bxUYw2oU","taOXKoVQp6","oVQp6oVQp6","IBe8kx3LDe","J2mQiMK07Y","0BmCy2Nslm","RzaZAuJScX","k85AepvgjS","dQ586RsQUq",
+"Y1mC0oQ87r","zFgtB2DREs","lH1ktHP433","RsQUqEOE1o","FwEJzDG4sT","iKqhrCIShG","16lHcSbRYy","wDajXsuY4x","fmIK1Mkgy8","DG4sToVQp6",
+"J2mQi7hyVv","CqqaDS2Dfu","ydG8U1v5hH","jfREu5nmWv","rz7UtDz1R3","JJs5m0h1b1","dpe1vIBe8k","QChxsWPmlx","4dEz6HzZT8","jzUqRni2v1",
+"lkMUA0MR5X","SWfou4QMc9","jiVBPMmKGJ","l83UdWDVWJ","DG4sT7fsYM","aez9yI7p2a","ni2v1v2eC3","Yh1hFiKqhr","WreyPMmsIo","OUYuFWPmlx",
+"i3pydAXpwE","BGaQY48cHL","GSQwjt98iW","NOHszO3iyQ","jiVBPlViBv","QssNC0YAGH","GrDg7aFFss","cL0aEcmXIX","uPX7GY1mC0","lsQGoB3qem",
+"8FmFHfLNg8","618DiJKWYR","cmXIXgtCA5","uJScXjfREu","GWqqXn8pJ9","ru4UG1LB1L","JKWYRCp3mZ","zHF1q2Nslm","9GXkXMojnP","WMiS39y4lw",
+"tuDySQworu","VIlwPiB08l","rKDLJHP433","tjQxsciuWz","uAWyptl72W","9XyT9WMiS3","ZuDtDcShY2","KsjRKW3VFH","Q6Lixix74r","Pb1pazz4ZU",
+"8U2nUMGlTF","euZA5piJSk","J2mQiksJby","2TRI7QClRL","DLhzMFPfSE","AXpwE9eoRc","UlU3MsqVrf","FxX9qMmsIo","faHirx3LDe","29QAzpmeCd",
+"6AFT0C2Irc","o8Uydrz7Ut","0h1b1ix74r","ZUnqtAIYUu","TCgPpcQOnv","9GXkXZJTXH","8cVD3WPmlx","dQ586hi5X7","he9IAciuWz","6q6L9rz7Ut",
+"mX2GE9iGoT","9eoRcWPmlx","blLA9wDajX","2hEEUGWqqX","ulk41atef2","ZJTXHs93Ml","aez9yZv7z0","uAWyp3weIF","7X3uytlILt","9XyT9lViBv",
+"FGzgplH1kt","O3iyQTwano","yToGWulk41","pT8wuRkQke","OxWIHiwzGk","XflUqaDGtS","HRxd8uZPqg","i3pydyToGW","9eoRcXflUq","VIlwPD6rBy",
+"v2eC3F6PT2","7Ow5C2DREs","7hyVv45cIH","SbRYyeuZA5","HlUbFa00b5","NAFuwrhl0J","Z4I1vbgJAz","5IhmGOUYuF","vkCHHIRh48","JRJQB2Yz7E",
+"9XyT9ogLgc","uupzk16lHc","lpF6Wmz8gx","pWiOsCxVEf","WmadApAhR1","fcJOyO3iyQ","CdyBVFcWrW","IRh48s93Ml","nnP8oRxrsm","pFrrlVerEA",
+"vOqCEOz8yZ","7Ow5Ct59lR","6q6L90Wr5y","QChxsD6rBy","DLhzMMkgy8","pv0i7YjB9t","MmKGJyluBx","4W0TlEOE1o","Dz1R3NcICA","uZPqgXyPZN",
+"W3VFHjSjS3","gjUTusx5Gl","WmadASjskQ","WmadAaDGtS","FNYIMQChxs","uPX7GtaOXK","HzZT8WDVWJ","OxWIHlCMxy","bgJAzdpe1v","5nmWvYf2Ec",
+"pT8wu2ZHdk","x3LDeeuZA5","7lUXZQssNC","AIYUuVprf2","QClRL4QMc9","GWqqXTa8f6","tl72WIBe8k","gjUTuhi5X7","piJSkCqqaD","KASQ82TRI7",
+"JXljWatef2","CdyBVlXFOB","oVQp6hE1Ql","v1HlnWPmlx","pT8wuiwzGk","suY4x9y4lw","LewvMZzJHW","taOXKWMiS3","Ta8f6aDGtS","RBhp0Yw2oU",
+"ulk41DLhzM","9XyT9lH1kt","dpe1vhi5X7","Q6LixaL6AJ","ZzJHWRxrsm","jtn0Xulk41","55rfBVprf2","5nmWvKZamH","CNHmvdjsrv","W7cTsEoToP",
+"hYBCKlCMxy","J2mQit59lR","GSQwjHfyNQ","uTacxEOE1o","HRxd8IjTwP","Zv7z0uPX7G","euZA5fmIK1","uZPqgtuDyS","fcwDa0h1b1","Ul4a1hUTw7",
+"B3qemlXFOB","CIShG7ku1p","BCxeCChuy3","rKDLJuvf7A","NhXdu5Namm","Uvlv4PYBf4","kB5nPWaWsv","CK5W7OUYuF","1j5L8zY1GY","7lUXZzQt6Q",
+"vkCHHVerEA","Oz8yZSbRYy","RxrsmYw2oU","tjQxs4W0Tl","taOXKcL0aE","WreyP7fsYM","guMb8x3LDe","brhlQkB5nP","8xEKz1v5hH","s7MxkyofH3",
+"0YAGHHfyNQ","Yh1hF64s8N","RsQUqdQ586","BpYhVW3VFH","oGu6xhi5X7","LbRTHBGaQY","WmadAZJTXH","BbwgAfFDrJ","JIqXid85a9","QClRLZUnqt",
+"8hJdtFLsph","9GXkX0ao3l","FNYIM3weIF","WmadAoGu6x","jtn0XRsQUq","mz8gxlViBv","oGu6xNo0Qb","LDk6fCK5W7","2hEEUBFkb8","hi5X7SbRYy",
+"fLNg82ZHdk","hUTw7hi5X7","CqqaDgtCA5","M3zXLFxX9q","zY1GYxReec","faHirK20wK","FjHXRdmoS7","n1pmOKASQ8","2ZHdkJRJQB","8U2nUfmIK1",
+"HP4339XyT9","DLhzM7fsYM","9GXkXNAFuw","MmKGJyEfy9","1v5hHpT8wu","D6rBySbRYy","X6PinTXQ0Z","KASQ8QssNC","uoStwsuY4x","zz4ZUFLsph",
+"fmIK1QbxXc","kB5nPjiVBP","VIlwPlpF6W","Chuy3JKWYR","qQxHP16lHc","0BmCyPb1pa","9rlg9tvdkD","2Yz7E07n1c","LDk6fECMvU","AmdQdpFrrl",
+"pFrrlTXQ0Z","lj07QYf2Ec","8cVD3VLTy6","Vprf2KASQ8","cShY2iqv4k","uvf7Aatef2","gjUTu4dEz6","vLsmSOz8yZ","5ZaEz5nmWv","FFDuiIRh48",
+"lkMUAhi5X7","vOqCEpWiOs","0KyfsoVQp6","i3pydOUqFM","d7vjMnlaBy","gtCA5pFrrl","Waim6AOgEe","guMb8JIqXi","cShY2nlaBy","MojnPv8yFN",
+"HRxd8zY1GY","k85AeHfyNQ","iqv4kxReec","YOfrYogLgc","gIYvEsuY4x","dhSuHFNYIM","W7cTscShY2","dQ586uoStw","bZLvSQClRL","M6qcGVerEA",
+"okgRiYh1hF","X6PinyluBx","LbRTHv8yFN","Q6Lix7fKYU","Y1mC0aFFss","Cp3mZdhSuH","lweGyHfyNQ","QChxsi7WMQ","uN6r3ZuDtD","XyPZNXyPZN",
+"bZLvSCdyBV","KZamHxciqp","2hEEU5ZaEz","xciqpLbRTH","Yh1hFuQIcz","iB08lFwEJz","0BmCyWmadA","2DREsLbRTH","0BmCyRkQke","ru4UG9y4lw",
+"8hJdtpmeCd","lCMxycmXIX","euZA5oVQp6","cL0aE1j5L8","VerEAni2v1","CNHmvQ6hMC","lkMUAQWxoT","gf8rITwano","WDVWJSjskQ","C2IrcFNYIM",
+"lweGy3weIF","m4bxUPOUYS","BbwgA45cIH","TCgPp8U2nU","zbIYYPYBf4","POUYSuTacx","Chuy3Kr8ys","Q6hMCh1zcH","0BmCyTa8f6","OUqFMuTacx",
+"aez9y5Mg9r","v1HlnfaHir","Vprf2nnP8o","Nxx9VRBhp0","KASQ8JXljW","qaofNDQimp","3otm6YjB9t","F6PT2tvdkD","sx5Glo8Uyd","FPfSEHzZT8",
+"nlaByYf2Ec","tl72WCfgr3","qQxHPRBhp0","Mkgy8NcICA","lm0pDiB08l","d7vjMlm0pD","blLA9AgJHQ","hUTw7FLsph","yToGWTwano","UmaEvFcWrW",
+"RpBQmMm8si","nlaBylkMUA","Nxx9VRxrsm","DG4sTCxVEf","AIYUudpe1v","5ZaEzS2Dfu","K20wKVjCZq","d85a9ciuWz","Q6LixUl4a1","2TRI7cL0aE",
+"FhtglRxrsm","gtCA5b29RJ","QClRLxReec","FPfSE4dEz6","CxVEf8hJdt","fFDrJS77LH","hSSvQhi5X7","QworutjQxs","8RCUA45cIH","0YAGHJIqXi",
+"IKxdLgIYvE","5ZaEzFcWrW","LbRTHyToGW","cL0aEVjCZq","qQxHPFVMxo","JJs5mbgJAz","okgRisx5Gl","Mm8sizQt6Q","CK5W7FnPFB","zbIYYOz8yZ",
+"YjB9tTwano","NhXduxReec","24ARFgdQsS","YOfrYSmGzv","CqqaDkB5nP","TXQ0Z2TRI7","QChxsuQIcz","zY1GYGXdoH","ix74ruJScX","lsQGo14FLR",
+"VBjhzW3VFH","oQ87rGv3Fq","s7Mxkuupzk","CxVEfW3VFH","7hyVvy94nw","ReKEWDQimp","AXpwENo0Qb","t59lRMmKGJ","QClRL5drc6","azIWpWaim6",
+"zFgtBi7WMQ","KsjRK7ku1p","Mm8si24ARF","BpYhVMmsIo","atef2XyPZN","Ta8f6NcICA","MojnPrhl0J","8TxD7VjCZq","CNHmvQssNC","NOHszlm0pD",
+"sqVrfFNYIM","5VZjSK20wK","uQIcz0ao3l","CK5W7QnJ1S","64s8N8RCUA","NOHszMojnP","e6e4zYh1hF","kZANmFLsph","tvdkDPb1pa","Zv7z0uupzk",
+"Mm8siLDk6f","qUJMduJScX","uN6r3zY1GY","ru4UGQChxs","BFkb8bZLvS","AgJHQUmaEv","taOXKgjUTu","NOHszLDk6f","uZPqg618Di","W3VFH0Kyfs",
+"JKWYRoVQp6","aFFssnFqik","SmGzvlsQGo","aez9yv2eC3","lj07QJJs5m","sx5GlHfyNQ","ZUnqt5IhmG","RzaZAtaOXK","AkKTkIjTwP","55rfBblLA9",
+"M3zXLlXFOB","OUYuFRpBQm","wiHrZjS1aj","WDVWJrz7Ut","zHF1qSWfou","okgRiMojnP","fLNg8WaWsv","55rfB8FmFH","FNYIMazIWp","he9IAVprf2",
+"JIqXicQOnv","b29RJnnP8o","3weIF2TRI7","ECMvUqUJMd","EoToPrhl0J","DLhzMhE1Ql","618DiMezSW","FGzgpwiHrZ","5Drn0KZamH","WMiS355rfB",
+"pFrrlhYBCK","prNT6qUJMd","2hEEUiwzGk","64s8NpFrrl","kZANmpvgjS","Waim6RsQUq","VIlwPnlaBy","vLsmSTCgPp","bgJAzJKWYR","IKxdLFxX9q",
+"Mm8siuoStw","KZamHpAhR1","X6PinKZamH","580YD0BmCy","nnP8okB5nP","y94nwaDGtS","ReKEWPYBf4","uQIcz8RCUA","cShY2RkQke","n1pmOQnJ1S",
+"Mm8sikZANm","i3pydqaofN","5NammWDVWJ","ni2v1G1RhS","FhtglMmsIo","AOgEeRxrsm","5nmWvm4bxU","Mm8siWreyP","zHF1qIjTwP","Q6hMCYw2oU",
+"he9IAAXpwE","yofH35ZaEz","6q6L9DcpWB","uN6r36AFT0","uN6r3uN6r3","FGzgpGXdoH","xciqpFhtgl","Z4I1v48cHL","zQt6Qjtn0X","Pb1paxReec",
+"5Mg9rnlaBy","ix74rsoy9t","d7vjM4dEz6","Cfgr3OHaBz","pFrrlzqH0W","DQimpd85a9","0Kyfs9eoRc","kB5nPLDk6f","MojnPM3zXL","suY4xB3qem",
+"M6qcGjzUqR","Cp3mZnlaBy","WDVWJjtn0X","jtn0XMmKGJ","14FLRxReec","VjCZqzmLYD","FLsphLDk6f","OUYuFrKDLJ","KZamHZUnqt","IBe8kTCgPp",
+"K20wKMezSW","0YAGHLDk6f","Chuy3POUYS","yvOMIuupzk","8FmFHNOHsz","ogLgcQssNC","CqqaDvOqCE","0ao3lnlaBy","GSQwjhi5X7","X6PinMGlTF",
+"K4GS8CIShG","mX2GEHzZT8","Q6Lix0Kyfs","0PktIDG4sT","580YDaFFss","zz4ZU24ARF","t98iWtlILt","yofH30BmCy","9eoRcW3VFH","hYBCKlpF6W",
+"kZANm2hEEU","brhlQxXTI4","5VZjSlj07Q","dmoS7ZzJHW","RACujEdBKc","29QAzsuY4x","MojnPxciqp","ru4UGi3pyd","2Yz7EZzJHW","Z4I1vbrhlQ",
+"jtn0Xi7WMQ","FcWrW8xEKz","pWiOsi7WMQ","gf8rItl72W","29QAz55rfB","GXdoHWMiS3","tvdkDfLNg8","MezSWQWxoT","LewvMQworu","guMb8gdQsS",
+"GXdoHStlDJ","ECMvUHlUbF","2DREsJ2mQi","VIlwPF6PT2","oVQp6TXQ0Z","LewvM618Di","Q6hMCNhXdu","vLsmSvOqCE","t59lRI7p2a","lsQGoTCgPp",
+"Dz1R3EOE1o","jiVBPhSSvQ","MGlTFFxX9q","wiHrZ7lUXZ","G1RhSGXdoH","RzaZAPb1pa","ZuDtDCp3mZ","d7vjMsqVrf","uvf7AoGu6x","uJScXoGu6x",
+"FnPFBHP433","VBjhzDQimp","hi5X7VjCZq","2TRI716lHc","tuDyS8U2nU","m4bxUa00b5","MGlTFP6bcg","JkzUniKqhr","0BmCyVerEA","wDajXtl72W",
+"Cp3mZlViBv","qUJMdogLgc","a00b52hEEU","tlILtS77LH","5ZaEzTCgPp","lViBvYjB9t","iqv4kWmadA","fmIK1GSQwj","LbRTH45cIH","a00b5jS1aj",
+"580YDGSQwj","x3LDedhSuH","MK07Y1j5L8","NhXduzqH0W","jzUqROz8yZ","S77LHcQOnv","lkMUAtjQxs","pT8wu2TRI7","v1HlnydG8U","7hyVvn8pJ9",
+"okgRiXyPZN","mz8gxLbRTH","8FmFHKsjRK","nlaByzHF1q","ciuWzCp3mZ","DQimpqQxHP","uJScXhSSvQ","taOXKUvlv4","9eoRciqv4k","M6qcGblLA9",
+"cmXIXhi5X7","RxrsmqaofN","FFDuid7vjM","DG4sTtuDyS","5VZjSrhl0J","XflUqiB08l","zFgtBnlaBy","uN6r3jiVBP","Cfgr35Namm","8TxD7sx5Gl",
+"lsQGogjUTu","GrDg7FLsph","kB5nP4W0Tl","CqqaDqUJMd","m4bxUpv0i7","29QAzuAWyp","ECMvUyluBx","IRh48WreyP","cShY2aDGtS","FwEJzQbxXc",
+"FhtglVNCPd","2Yz7ElViBv","StlDJzqH0W","pv0i7PYBf4","okgRisuY4x","UlU3MW3VFH","ZUnqtv1Hln","7ku1p2DREs","Y1mC0azIWp","cQOnvK4GS8",
+"jS1ajAmdQd","ulk41NhXdu","Ul4a1EdBKc","jSjS3iwzGk","Gv3FqQ6hMC","WDVWJwiHrZ","1j5L8uN6r3","8FmFHcmXIX","MmsIot98iW","Mkgy8B3qem",
+"Z4I1vpvgjS","tAOsrUl4a1","EOE1opv0i7","IKxdLLbRTH","9XyT9Waim6","zz4ZUIBe8k","DG4sT07n1c","jS1ajsuY4x","gtCA5zz4ZU","Gv3FqFLsph",
+"uLtKsjfREu","FVMxoiqv4k","ydG8Uuupzk","SmGzvW7cTs","HRxd8zqH0W","uupzk4QMc9","CIShGn8pJ9","zbIYYUmaEv","soy9tQworu","ECMvUoQ87r",
+"UmaEv9GXkX","jS1ajCNHmv","D6rByru4UG","ru4UGRsQUq","fLNg8hUTw7","prNT6t98iW","StlDJK4GS8","m4bxUyToGW","AkKTk2Yz7E","8RCUAwDajX",
+"ydG8UOz8yZ","48cHL4QMc9","MaJQsIKxdL","C2IrcdhSuH","jeskSTa8f6","VIlwPjzUqR","5drc6NcICA","hE1QlpvgjS","TXQ0Z7ku1p","Vprf2O3iyQ",
+"29QAz4dEz6","45cIH2Nslm","Q6hMCgjUTu","aFFss7ku1p","lsQGoeuZA5","atef2dmoS7","jSjS3S77LH","cL0aEnlaBy","fLNg8jS1aj","WmadAMaJQs",
+"oQ87rvOqCE","ZhwG1zbIYY","jeskSuLtKs","Yh1hFJkzUn","gIYvEm4bxU","Zv7z02ZHdk","oVQp6iwzGk","O3iyQ8RCUA","MojnPnFqik","vkCHH3otm6",
+"0MR5XdhSuH","FLsphfLNg8","IjTwPY1mC0","BpYhViqv4k","9GXkXiqv4k","xXTI4BpYhV","ECMvUogLgc","tl72WDcpWB","FGzgp4W0Tl","VBjhzJKWYR",
+"0h1b13weIF","FhtglZ4I1v","FLsphL7cGc","d85a9JIqXi","4QMc93weIF","XyPZNfmIK1","hi5X7W3VFH","piJSk64s8N","IjTwPD6rBy","fqypyGv3Fq",
+"tl72W2Nslm","WMiS3BGaQY","qaofNd7vjM","pAhR1Ss0Zu","euZA5RzaZA","Fhtgl8cVD3","pAhR1qaofN","ECMvUQClRL","aDGtSYw2oU","5ZaEzpFrrl",
+"uoStwMaJQs","9XyT9AgJHQ","7X3uyaFFss","soy9tD6rBy","lViBvcmXIX","CdyBVtlILt","2TRI7MGlTF","faHirLbRTH","RsQUq7fKYU","S77LHKZamH",
+"pv0i7tlILt","ulk41MezSW","zz4ZUTwano","6AFT0vLsmS","JkzUndhSuH","zmLYDnlaBy","MaJQs2ZHdk","o8UydUvlv4","l83Ud7Ow5C","EoToPxXTI4",
+"sx5GlIjTwP","lj07Qs7Mxk","9XyT9GrDg7","U3yw5JJs5m","VBjhzix74r","jtn0XcmXIX","tlILtNhXdu","VLTy6d85a9","hYBCKGSQwj","prNT6FxX9q",
+"CdyBVcQOnv","uPX7G0BmCy","9iGoTK4GS8","Cp3mZQYxC0","ThjNnJkzUn","yluBxTXQ0Z","sqVrfAOgEe","gtCA57Ow5C","2ZHdknnP8o","BFkb8jSjS3",
+"yluBx0ao3l","cQOnvdpe1v","MojnP618Di","64s8NOUYuF","ThjNnIKxdL","NhXduZJTXH","tlILtY1mC0","IBe8kUl4a1","jSjS3lweGy","IjTwPn1pmO",
+"MaJQsdmoS7","wDajXWmadA","vLsmS0BmCy","16lHcWPmlx","MaJQsjeskS","t98iW2ZHdk","uoStwUmaEv","TCgPpWaim6","JXljWOz8yZ","tl72WVprf2",
+"ThjNna00b5","sqVrfzqH0W","HRxd8aez9y","HP433SbRYy","rKDLJ5Drn0","No0QbD6rBy","4dEz614FLR","SjskQIRh48","fcwDapFrrl","suY4xt59lR",
+"B3qemuN6r3","mX2GEGWqqX","YOfrYoQ87r","oGu6xy94nw","ydG8UprNT6","Cp3mZ5ZaEz","jiVBP4W0Tl","uTacxmz8gx","aL6AJVprf2","2TRI7QbxXc",
+"0YAGH6q6L9","KsjRKhUTw7","Q6LixuJScX","b29RJni2v1","xciqpBGaQY","B3qemFGzgp","OUYuF5Drn0","MmKGJTCgPp","QworuWPmlx","3weIFXyPZN",
+"gf8rIRzaZA","sqVrfMm8si","B3qemo8Uyd","taOXKJRJQB","v1HlnogLgc","FwEJz8FmFH","t59lRSbRYy","hi5X7FGzgp","Yw2oUYjB9t","hE1QljzUqR",
+"cmXIXzz4ZU","jfREutlILt","GWqqX5IhmG","1v5hHiwzGk","BFkb8FVMxo","MojnPlkMUA","QClRLPb1pa","O3iyQrhl0J","aez9y07n1c","uupzkuAWyp",
+"Dz1R37Ow5C","uPX7GYw2oU","9XyT9cmXIX","o8UydCxVEf","BFkb8Cfgr3","Kr8ysaez9y","RsQUqQ6hMC","4W0Tl8TxD7","RsQUqgtCA5","aL6AJMmKGJ",
+"dQ586MGlTF","nnP8o07n1c","bgJAzqQxHP","0Wr5yqQxHP","a00b5aDGtS","jtn0XW3VFH","lkMUAMm8si","yEfy9WaWsv","P6bcgYh1hF","uvf7AnnP8o",
+"CIShG14FLR","FhtglzHF1q","NcICAzbIYY","lm0pDrz7Ut","MezSWBGaQY","K20wKpWiOs","5nmWvyToGW","fFDrJB3qem","4QMc9oQ87r","a00b5s4786",
+"MezSWni2v1","5nmWvuAWyp","t59lRtuDyS","5iGN5CxVEf","7Ow5CK4GS8","0h1b1sqVrf","FGzgp16lHc","GSQwjOUqFM","MmsIocL0aE","2TRI7n1pmO",
+"M3zXLRBhp0","0Kyfsd7vjM","s7Mxkm4bxU","cQOnviqv4k","0h1b1WreyP","4QMc9ogLgc","WaWsv5IhmG","OUYuFChuy3","fqypypAhR1","ksJby5iGN5",
+"djsrvHRxd8","FnPFBCNHmv","EdBKclweGy","4QMc9FPfSE","v8yFNiB08l","BFkb8uoStw","DcpWB5Namm","Yh1hFOUYuF","X6Pin5drc6","7fsYMaez9y",
+"48cHLIjTwP","dhSuHjzUqR","EoToPLewvM","fqypyfaHir","16lHc9rlg9","Gv3FqSs0Zu","HRxd8yEfy9","P6bcgiwzGk","nlaByUmaEv","pmeCdP6bcg",
+"JkzUnG1RhS","s7MxkOUqFM","cmXIX4W0Tl","YOfrYJXljW","8TxD7VBjhz","HzZT8ECMvU","MmsIo2Yz7E","VjCZqMm8si","jfREuIRh48","lViBvX6Pin",
+"lkMUA8xEKz","Mkgy82ZHdk","BbwgA5Drn0","9GXkXOUqFM","v1Hlnpv0i7","S2DfuS2Dfu","Q6LixMkgy8","faHiryofH3","TXQ0ZaL6AJ","9eoRcpvgjS",
+"tuDySs4786","7lUXZaL6AJ","oVQp67fKYU","fcwDa9XyT9","IKxdL0ao3l","oQ87rRxrsm","XflUqQYxC0","G1RhSDz1R3","bZLvSvLsmS","SjskQOxWIH",
+"CqqaDgIYvE","rKDLJRzaZA","tuDySMK07Y","zFgtBmX2GE","faHir8FmFH","5IhmGHfyNQ","jzUqREdBKc","YjB9tiB08l","07n1cXflUq","ix74rC2Irc",
+"OUqFMzmLYD","5ZaEzIn3NS","tuDySoGu6x","faHirDG4sT","CdyBVxReec","C2Irc14FLR","M6qcG2hEEU","AmdQdjtn0X","n8pJ9uvf7A","0YAGHn8pJ9",
+"v1Hlnlj07Q","5VZjS2TRI7","JRJQBSs0Zu","zFgtB7lUXZ","5Drn0VerEA","2ZHdkCfgr3","1LB1L7lUXZ","s47861v5hH","5VZjSrKDLJ","s93Ml7Ow5C",
+"DLhzMpAhR1","VIlwPlCMxy","FVMxoOz8yZ","0MR5XjS1aj","aFFssxXTI4","yluBxNcICA","iB08lk85Ae","3weIFAmdQd","IRh48AXpwE","o8UydRxrsm",
+"mz8gxmz8gx","4dEz6O3iyQ","kB5nPS2Dfu","ni2v1CIShG","2hEEUblLA9","5VZjSMGlTF","PYBf45ZaEz","pWiOsd85a9","M3zXLCK5W7","Pb1paC2Irc",
+"n8pJ95Mg9r","JXljW4dEz6","s7Mxkgf8rI","wiHrZYw2oU","YjB9t8RCUA","FGzgpNcICA","jzUqRStlDJ","7fsYMOUqFM","gdQsSIBe8k","FjHXRs7Mxk",
+"64s8NEoToP","a00b5zY1GY","HzZT8IKxdL","0YAGHpFrrl","0ao3lIjTwP","POUYSyofH3","3otm6lsQGo","iqv4kuvf7A","tAOsr618Di","e6e4zlkMUA",
+"vLsmSblLA9","b29RJBGaQY","aFFssFjHXR","9eoRc4dEz6","M3zXLuQIcz","64s8Niqv4k","24ARF5drc6","FxX9qWMiS3","piJSkhi5X7","VBjhzM6qcG",
+"lpF6WCfgr3","B3qemdhSuH","ulk41faHir","HzZT88U2nU","GSQwjiwzGk","AmdQdIn3NS","QbxXcyToGW","FLsphNcICA","C2Irchi5X7","MGlTFRBhp0",
+"uupzkulk41","MmsIoBFkb8","pWiOsrhl0J","pvgjSIKxdL","euZA5sqVrf","VBjhzSmGzv","ksJbyd85a9","uPX7Guvf7A","WmadAlj07Q","QClRLfqypy",
+"EoToPxciqp","K20wKs7Mxk","xciqpStlDJ","OUqFMCp3mZ","J2mQiAmdQd","lm0pDqQxHP","I7p2aCK5W7","Gv3FqfaHir","s93MlFxX9q","zY1GY5Namm",
+"2ZHdkAIYUu","kZANmydG8U","FcWrWSjskQ","GSQwjF6PT2","7lUXZsqVrf","OUYuFZv7z0","cQOnvpvgjS","vOqCElweGy","fFDrJNhXdu","Pb1paYh1hF",
+"oGu6x5IhmG","TwanoTa8f6","gtCA5Nxx9V","AgJHQhi5X7","Chuy3s7Mxk","zHF1q7lUXZ","L7cGc9iGoT","Cfgr37fKYU","9GXkX07n1c","5Drn0Zv7z0",
+"Mm8siiqv4k","gIYvEuoStw","rhl0JRzaZA","6AFT0zbIYY","l83Udulk41","RzaZAzFgtB","KZamHZJTXH","UlU3M0MR5X","uAWypVjCZq","0ao3lvkCHH",
+"rz7UtQworu","WDVWJZUnqt","9XyT9SbRYy","QYxC0FNYIM","gjUTus7Mxk","OxWIHsoy9t","5VZjS0Wr5y","ix74rMaJQs","gtCA5kB5nP","QssNClH1kt",
+"tAOsrLewvM","ZuDtDO3iyQ","TwanouTacx","VLTy69rlg9","IBe8k0PktI","DcpWBlXFOB","MaJQstuDyS","EoToPXyPZN","Twano5VZjS","Oz8yZRsQUq",
+"9rlg9nlaBy","HRxd8Uvlv4","2NslmqQxHP","zmLYDzFgtB","EoToPFwEJz","oQ87rIKxdL","Yh1hFzQt6Q","LDk6fEOE1o","MmsIoSmGzv","NcICAnlaBy",
+"he9IAPYBf4","AkKTk2Nslm","Q6hMCjiVBP","CdyBV8cVD3","gIYvEt59lR","dpe1vM3zXL","fmIK1CIShG","ru4UGCIShG","LDk6fpmeCd","8cVD3Twano",
+"ru4UGxReec","pWiOs9GXkX","lH1ktv2eC3","zqH0WaFFss","ulk41QWxoT","piJSk45cIH","prNT6JRJQB","zmLYD8U2nU","RsQUqd7vjM","QChxsRzaZA",
+"WaWsv9XyT9","6AFT0s93Ml","8RCUAX6Pin","WDVWJNcICA","uPX7GFhtgl","0PktIv1Hln","a00b5Pb1pa","uZPqgtjQxs","ZJTXHzz4ZU","hSSvQ4dEz6",
+"pv0i7oVQp6","QnJ1S4QMc9","3weIFFnPFB","P6bcghi5X7","QClRLzY1GY","GXdoHSjskQ","SjskQ9eoRc","uZPqgP6bcg","FjHXRAXpwE","LewvMhE1Ql",
+"45cIHcQOnv","v1HlnRACuj","k85AeBGaQY","rhl0JNhXdu","azIWp0h1b1","iKqhrZzJHW","RACujzqH0W","0PktI2Nslm","vkCHHk85Ae","gIYvEOUYuF",
+"i3pydn1pmO","hE1Qlmz8gx","W7cTszHF1q","KASQ8CNHmv","WDVWJgdQsS","24ARFjeskS","LewvMNhXdu","KsjRKFFDui","LewvMni2v1","9iGoTs93Ml",
+"iwzGkvkCHH","LbRTHni2v1","ru4UGzqH0W","Pb1paSjskQ","sqVrfMmKGJ","OHaBzECMvU","lj07QMmsIo","6AFT0gdQsS","rKDLJcL0aE","618DiNOHsz",
+"FcWrWTXQ0Z","AmdQdaez9y","B3qemZv7z0","wiHrZIjTwP","bZLvS14FLR","hYBCKzmLYD","CK5W7Ss0Zu","he9IAZzJHW","0KyfsM6qcG","Ta8f63otm6",
+"yluBxrKDLJ","Ul4a1dmoS7","M3zXLix74r","brhlQ45cIH","7lUXZOz8yZ","HRxd8zz4ZU","Vprf2o8Uyd","kZANm618Di","14FLROUqFM","jtn0XFGzgp",
+"yToGWAkKTk","5nmWvFPfSE","No0QbOz8yZ","uJScXOUqFM","zFgtBJKWYR","DLhzMVerEA","tuDySqUJMd","5NammuQIcz","1LB1L29QAz","jeskSLewvM",
+"1LB1LogLgc","xReectlILt","M3zXLdQ586","kZANmhSSvQ","mz8gxlH1kt","07n1cvLsmS","FVMxoQWxoT","WDVWJFVMxo","tAOsrSjskQ","pFrrlsuY4x",
+"d7vjMS77LH","P6bcgYw2oU","pT8wuWDVWJ","FPfSExciqp","U3yw5tjQxs","wiHrZCxVEf","Q6hMCtl72W","YjB9tlH1kt","fmIK1sqVrf","t59lRVLTy6",
+"2hEEUtuDyS","soy9tsuY4x","wDajXBpYhV","VIlwPVerEA","6q6L9o8Uyd","55rfB0Kyfs","Ta8f6XflUq","cQOnvW7cTs","ReKEWRzaZA","wDajXi7WMQ",
+"tjQxspFrrl","RACuj2Yz7E","prNT6v2eC3","K4GS8QbxXc","BGaQYgjUTu","I7p2a5nmWv","Q6LixDz1R3","TCgPpogLgc","FcWrWl83Ud","16lHcKASQ8",
+"JkzUnNAFuw","yluBxi3pyd","uN6r3lXFOB","bgJAzI7p2a","OUYuFpv0i7","Gv3FqhUTw7","xciqp16lHc","MezSWfFDrJ","IBe8khe9IA","OHaBzKASQ8",
+"5Drn0RACuj","JXljWFFDui","hi5X7RACuj","VIlwP9GXkX","1j5L8tl72W","4W0TlfcwDa","yToGWC2Irc","s93MlVBjhz","jS1ajcL0aE","iB08lJJs5m",
+"zFgtBKZamH","2Yz7Ei7WMQ","faHirMaJQs","cShY25Drn0","ydG8UcmXIX","zqH0WmX2GE","0MR5XMm8si","iKqhryvOMI","KZamHUvlv4","HRxd8lweGy",
+"5VZjSBpYhV","HRxd8Yf2Ec","ni2v1WMiS3","jiVBP5ZaEz","RACuj580YD","gf8rIBCxeC","16lHcuvf7A","TCgPplViBv","CqqaDStlDJ","NAFuwksJby",
+"FPfSED6rBy","5iGN58xEKz","4W0TlazIWp","MK07YqaofN","v2eC3AmdQd","vOqCEFLsph","CqqaDThjNn","MK07YL7cGc","sx5GlQ6hMC","NAFuwMojnP",
+"ZhwG12Yz7E","oGu6xd85a9","aFFssCdyBV","Ta8f6cmXIX","ix74rZUnqt","wDajXdjsrv","CxVEf9y4lw","prNT6RmDcr","5Drn0jzUqR","Q6hMCru4UG",
+"GWqqXjfREu","ydG8UvkCHH","lH1kt5Drn0","l83UdYh1hF","Chuy3KASQ8","5ZaEzlH1kt","G1RhSbZLvS","a00b5ru4UG","KsjRKTCgPp","D6rByY1mC0",
+"WmadA5nmWv","SjskQjSjS3","ZJTXHGrDg7","KZamHMmKGJ","9rlg9In3NS","ni2v1uZPqg","0Wr5yPOUYS","9XyT9RpBQm","RACuj8RCUA","LewvMaFFss",
+"yToGW2Nslm","IBe8kZUnqt","soy9tiwzGk","n8pJ9pv0i7","v2eC3WaWsv","xXTI49GXkX","ru4UGqUJMd","uupzk9rlg9","8cVD3qQxHP","e6e4zRmDcr",
+"x3LDe48cHL","iwzGk45cIH","QChxscL0aE","C2Irc8xEKz","48cHLwDajX","Yw2oUWaim6","oQ87r55rfB","jSjS3Uvlv4","No0QbqaofN","oGu6xpFrrl",
+"Cp3mZh1zcH","TXQ0ZFPfSE","5VZjSQ6Lix","v2eC3HfyNQ","h1zcHQ6Lix","tlILtSs0Zu","k85AedQ586","7ku1ptaOXK","X6Pin7lUXZ","VBjhzvLsmS",
+"fcwDaO3iyQ","gtCA5FnPFB","OUqFMK4GS8","0ao3lECMvU","QnJ1SDG4sT","VjCZqru4UG","SbRYyfmIK1","0Wr5ytuDyS","DcpWBfFDrJ","2TRI7OxWIH",
+"ZJTXH8U2nU","fFDrJCqqaD","hYBCKzY1GY","xReeclm0pD","VerEAiqv4k","ogLgcChuy3","nlaByYw2oU","vkCHHDLhzM","uZPqgfmIK1","aL6AJfFDrJ",
+"8FmFHAkKTk","Z4I1vuLtKs","NhXdujfREu","Pb1paY1mC0","Oz8yZIBe8k","aFFssGWqqX","WPmlxRpBQm","qQxHPJKWYR","KASQ8BGaQY","8cVD37fsYM",
+"Rxrsms93Ml","ZhwG1gdQsS","Cp3mZ5Namm","Kr8ysrhl0J","lm0pDG1RhS","SmGzvfcJOy","G1RhSlCMxy","1v5hHuvf7A","7X3uyWreyP","HzZT85VZjS",
+"VIlwP3otm6","8TxD7AOgEe","v8yFNzqH0W","FwEJzprNT6","CIShGt98iW","7Ow5C0h1b1","lpF6W16lHc","9y4lwQnJ1S","xReecTXQ0Z","djsrvKASQ8",
+"cL0aEtjQxs","GSQwjDG4sT","YOfrYIRh48","Oz8yZKsjRK","tlILtMmsIo","0YAGHOUYuF","8TxD7lXFOB","JRJQBRBhp0","SjskQlpF6W","ciuWzxciqp",
+"dQ586ReKEW","9XyT9FNYIM","BbwgAiB08l","DcpWB6q6L9","SbRYyMaJQs","DQimpzFgtB","HfyNQd85a9","TCgPpUlU3M","I7p2aP6bcg","sqVrftvdkD",
+"nFqikmX2GE","bgJAzuoStw","5NammoQ87r","n1pmOOUqFM","CqqaD0PktI","guMb8KASQ8","C2IrctaOXK","yEfy9CqqaD","8TxD7FLsph","YjB9tIjTwP",
+"MojnPzbIYY","wiHrZRACuj","9eoRci3pyd","FnPFBsqVrf","guMb8e6e4z","lCMxyJ2mQi","Gv3Fq3otm6","AIYUuFcWrW","24ARFW7cTs","MojnP4dEz6",
+"cQOnvGXdoH","7X3uyYw2oU","uTacxYjB9t","YOfrYnnP8o","lkMUAaDGtS","n8pJ9VerEA","0KyfsOz8yZ","iB08l8hJdt","NAFuwRzaZA","F6PT2ZJTXH",
+"8FmFH0Wr5y","KZamHulk41","7ku1p24ARF","ZuDtDYw2oU","gjUTuiqv4k","VerEAHP433","mX2GEkB5nP","LewvMFFDui","l83UdhSSvQ","jeskSfmIK1",
+"LewvMJXljW","l83UdMmKGJ","lweGyxXTI4","0KyfstlILt","VBjhzv8yFN","NcICAYOfrY","KASQ82hEEU","BpYhVRkQke","4dEz6cmXIX","WDVWJ16lHc",
+"J2mQiprNT6","NAFuwlH1kt","okgRizmLYD","TwanoyEfy9","wiHrZSWfou","euZA57ku1p","Pb1paL7cGc","6q6L9rhl0J","CK5W7vOqCE","lXFOBuoStw",
+"yvOMIyvOMI","zbIYYYw2oU","MK07Y3otm6","RACujbrhlQ","618DiuLtKs","8cVD38TxD7","6AFT0MmsIo","P6bcgRsQUq","Dz1R3WDVWJ","ciuWzsqVrf",
+"lm0pDVjCZq","55rfBtuDyS","7lUXZtuDyS","2hEEUfmIK1","a00b5soy9t","lkMUAiwzGk","hE1QlogLgc","CIShGQbxXc","KASQ8gjUTu","FcWrWa00b5",
+"VerEAWMiS3","Gv3FqRkQke","HRxd80MR5X","5ZaEzLewvM","uJScXrz7Ut","1v5hHsqVrf","v8yFN0Kyfs","AXpwEFGzgp","aL6AJRkQke","9rlg9KASQ8",
+"FhtglnnP8o","hSSvQNo0Qb","QYxC0LbRTH","hYBCKd7vjM","QChxsXflUq","WMiS3soy9t","X6PinfmIK1","qaofNOUqFM","uupzk9y4lw","ciuWzzbIYY",
+"4W0Tlv1Hln","kB5nPhSSvQ","pvgjSwDajX","RkQkeAXpwE","d7vjMtjQxs","O3iyQjS1aj","X6PinFLsph","GrDg7jtn0X","48cHLx3LDe","IBe8kStlDJ",
+"tl72WFVMxo","JXljWaFFss","OxWIHLDk6f","RsQUqlXFOB","XflUqsoy9t","gjUTuPYBf4","iwzGk7ku1p","jiVBP29QAz","0h1b1bZLvS","C2IrcK20wK",
+"WMiS3JRJQB","aL6AJbZLvS","jS1ajiB08l","Yw2oUCxVEf","tvdkDjtn0X","n1pmOK20wK","o8UydnFqik","aFFssMmKGJ","XyPZNLDk6f","dQ586In3NS",
+"SmGzvtAOsr","MGlTFqaofN","lH1kt8FmFH","ru4UGQssNC","S77LHhi5X7","fFDrJSs0Zu","7Ow5C2ZHdk","WaWsvOHaBz","7lUXZi7WMQ","S2DfuVBjhz",
+"a00b5iqv4k","dhSuHStlDJ","RsQUq64s8N","VIlwPi3pyd","zqH0WDz1R3","dQ586M6qcG","UlU3Msoy9t","cShY2xReec","pWiOsWaWsv","jtn0XGWqqX",
+"dpe1vv8yFN","Mkgy8hE1Ql","n1pmOLbRTH","VerEAgIYvE","rhl0JzQt6Q","ydG8UYOfrY","e6e4zFhtgl","MmKGJ2TRI7","Waim6ogLgc","WPmlx07n1c",
+"yEfy95ZaEz","piJSkRACuj","uTacxjfREu","uZPqglkMUA","cL0aEciuWz","blLA95ZaEz","s93Mlru4UG","Z4I1v16lHc","okgRiCfgr3","7lUXZRACuj",
+"zmLYDciuWz","ThjNnG1RhS","0ao3lIBe8k","LbRTHQnJ1S","OxWIHPb1pa","VerEAQbxXc","mz8gxMm8si","jS1ajM3zXL","sqVrfsx5Gl","OxWIHhUTw7",
+"5drc6l83Ud","SWfouguMb8","ZJTXHQbxXc","ZhwG1FLsph","dpe1v2TRI7","NAFuws93Ml","JKWYRbgJAz","uQIczdQ586","wDajXDQimp","fcwDa9rlg9",
+"zQt6QOHaBz","AOgEeAXpwE","sqVrfeuZA5","HfyNQOUqFM","EOE1oYOfrY","pvgjShi5X7","Waim655rfB","YOfrYa00b5","Zv7z0gf8rI","HRxd8vOqCE",
+"C2Irc9rlg9","K20wKoQ87r","RsQUqjeskS","7fsYMv1Hln","m4bxU4dEz6","tuDyS2Yz7E","uupzkWPmlx","ReKEWZUnqt","tlILt24ARF","7Ow5CNcICA",
+"Rxrsmrhl0J","DQimpK4GS8","K4GS8mX2GE","G1RhS5iGN5","iB08lfmIK1","K20wKs4786","h1zcHuN6r3","07n1cNOHsz","QssNCJKWYR","uN6r3i7WMQ",
+"oGu6xuoStw","RsQUqhi5X7","Ss0Zu0Kyfs","oVQp6ru4UG","W7cTsaL6AJ","iKqhr580YD","yvOMIuAWyp","BbwgA0PktI","O3iyQBpYhV","VNCPdh1zcH",
+"brhlQI7p2a","Gv3FqQ6Lix","RACuj8FmFH","7X3uyrKDLJ","3otm6nnP8o","5ZaEzUvlv4","yEfy9uupzk","pWiOsCdyBV","rKDLJbZLvS","VIlwPFNYIM",
+"NOHszhSSvQ","QClRL9rlg9","kZANmIKxdL","vLsmSlkMUA","cQOnvNOHsz","RsQUq24ARF","JRJQBjfREu","W7cTsb29RJ","8RCUA0BmCy","pvgjSEOE1o",
+"jeskS9XyT9","s93Ml55rfB","vLsmSVIlwP","t59lRpFrrl","pT8wuBFkb8","cmXIXWmadA","0h1b1RBhp0","fLNg8lkMUA","Kr8ysCqqaD","IBe8k4dEz6",
+"C2IrcWDVWJ","Q6hMCSbRYy","J2mQiRACuj","8RCUAs7Mxk","P6bcghe9IA","0PktIrKDLJ","9XyT92ZHdk","gf8rIDz1R3","Pb1pav1Hln","4W0TlZuDtD",
+"K4GS8IBe8k","5IhmGblLA9","JRJQBMm8si","pvgjSB3qem","7fKYUrz7Ut","pFrrlChuy3","qQxHPmz8gx","NcICAfqypy","5VZjS8cVD3","JkzUnbgJAz",
+"580YDMm8si","pT8wu7X3uy","ThjNnpiJSk","OUYuFm4bxU","29QAzSs0Zu","7Ow5CtaOXK","rKDLJEdBKc","WPmlxvOqCE","FhtglReKEW","SmGzvAOgEe",
+"B3qemtAOsr","zz4ZUcQOnv","t59lRUvlv4","FhtglGXdoH","Chuy3Ta8f6","O3iyQVerEA","jfREuD6rBy","XflUq8hJdt","euZA5FcWrW","zFgtBK20wK",
+"Waim69rlg9","AXpwERACuj","rKDLJuLtKs","pFrrluQIcz","K20wKuLtKs","0YAGH1j5L8","NhXduokgRi","MaJQs0YAGH","QbxXcaez9y","Gv3FqSWfou",
+"VBjhzyofH3","QnJ1S2hEEU","taOXKOUqFM","BGaQY8cVD3","5NammYw2oU","fLNg85ZaEz","yToGWDz1R3","m4bxUIjTwP","gIYvEni2v1","IKxdLlCMxy",
+"POUYSNcICA","zQt6Qhi5X7","SWfouaL6AJ","guMb8MmsIo","qUJMd55rfB","cShY2yvOMI","AOgEeSs0Zu","d85a9hSSvQ","aez9yfmIK1","DQimpa00b5",
+"Q6hMCqaofN","P6bcgNAFuw","WDVWJ7lUXZ","NhXduwDajX","JXljWU3yw5","ni2v15Mg9r","Mm8siuJScX","Ta8f6nlaBy","GSQwj0h1b1","gf8rIfcJOy",
+"FxX9qNAFuw","WDVWJ2hEEU","oVQp6m4bxU","618DiFwEJz","ReKEW1LB1L","2hEEUAXpwE","Chuy329QAz","yofH3QYxC0","n1pmOfcwDa","CqqaDhYBCK",
+"K4GS85iGN5","d85a9sqVrf","29QAzhe9IA","ogLgcoGu6x","HfyNQ1v5hH","yvOMIFGzgp","uJScXFwEJz","0YAGHWmadA","2TRI7HzZT8","aez9yUl4a1",
+"l83UdpAhR1","MmKGJQworu","wDajXHfyNQ","MK07YMmsIo","NAFuwiqv4k","uAWypx3LDe","lH1kt5VZjS","xReecThjNn","b29RJk85Ae","TCgPpF6PT2",
+"4dEz6m4bxU","yvOMIzFgtB","5Mg9r5Mg9r","MezSWuN6r3","dpe1vTXQ0Z","TwanoDQimp","F6PT2uJScX","zbIYYFnPFB","pvgjSQworu","16lHclm0pD",
+"SmGzvkZANm","3otm6qUJMd","b29RJpWiOs","Yf2EcRBhp0","DG4sTM3zXL","pvgjS9XyT9","7Ow5C7fsYM","aDGtSQ6hMC","2ZHdkD6rBy","lXFOBxReec",
+"K20wKsuY4x","IKxdLWaWsv","n1pmO1v5hH","x3LDeRxrsm","8hJdtIjTwP","OHaBzVBjhz","fcJOyFVMxo","OUqFMlH1kt","POUYSIBe8k","atef216lHc",
+"YjB9tbrhlQ","LDk6f9rlg9","uJScXpmeCd","FGzgpNOHsz","jfREucL0aE","9y4lw5nmWv","JkzUnzmLYD","xciqpTCgPp","Waim6qUJMd","24ARFO3iyQ",
+"580YDFjHXR","zmLYD4QMc9","lj07Q9iGoT","lweGyIKxdL","8hJdtG1RhS","lj07QQClRL","cmXIXIjTwP","FVMxod7vjM","oGu6xaez9y","2ZHdkCdyBV",
+"fcJOylj07Q","VLTy6618Di","v1HlnQ6Lix","RsQUqt59lR","iB08lSs0Zu","NAFuwaez9y","FhtglaDGtS","NhXduM3zXL","yEfy9OxWIH","pmeCdEOE1o",
+"EdBKcGv3Fq","XyPZN7fKYU","tjQxsOUqFM","IKxdLuupzk","QnJ1Sv1Hln","5nmWvblLA9","QnJ1SiKqhr","VIlwPZJTXH","aFFssCNHmv","16lHcIjTwP",
+"29QAzi7WMQ","i7WMQdpe1v","lj07QvLsmS","D6rBycmXIX","prNT6C2Irc","2ZHdkWaWsv","guMb8QWxoT","VIlwPlm0pD","k85AeMojnP","zbIYYuupzk",
+"RpBQmCdyBV","S77LHAkKTk","Y1mC0OHaBz","brhlQWreyP","bgJAztl72W","WDVWJtuDyS","l83UdK4GS8","jiVBPpvgjS","8TxD7BbwgA","FPfSEzY1GY",
+"2DREshe9IA","v1HlnJIqXi","Q6hMCtjQxs","ThjNnSbRYy","KsjRKgf8rI","m4bxUMezSW","QClRLMojnP","AOgEeQbxXc","HRxd8xXTI4","FwEJzDcpWB",
+"F6PT2YOfrY","dmoS7SWfou","FjHXRTa8f6","wDajXfcJOy","FVMxoBpYhV","Cp3mZCIShG","5VZjSHlUbF","Yw2oUrhl0J","i3pyd8RCUA","iKqhrDz1R3",
+"aDGtSoVQp6","vLsmSMkgy8","2NslmOxWIH","KASQ8FxX9q","k85Ae9eoRc","qQxHPpT8wu","8xEKzWDVWJ","fFDrJd85a9","hE1QlLDk6f","d7vjMYf2Ec",
+"tvdkDFGzgp","9rlg9ZzJHW","fmIK1SWfou","dpe1vguMb8","8cVD3uJScX","AkKTkMojnP","wiHrZBCxeC","HlUbFQ6hMC","uoStwx3LDe","uJScXlH1kt",
+"pFrrlJ2mQi","7Ow5Cl83Ud","OUYuF45cIH","YOfrYHRxd8","hSSvQRkQke","W7cTsn8pJ9","wDajXgIYvE","FVMxofmIK1","1j5L8PYBf4","pv0i7soy9t",
+"RsQUqU3yw5","45cIH0Kyfs","ogLgcjfREu","jzUqR5VZjS","ni2v1tAOsr","S2DfuZUnqt","RACujy94nw","jfREuUl4a1","cL0aEoVQp6","t59lRJIqXi",
+"8TxD7yEfy9","VLTy6HP433","5iGN5wDajX","zmLYDpiJSk","pmeCdMK07Y","ZzJHWtjQxs","ogLgcCK5W7","9XyT9tjQxs","DcpWBIn3NS","rhl0JSjskQ",
+"v2eC3oVQp6","9GXkXLbRTH","Cfgr316lHc","faHirnFqik","jfREuHzZT8","cmXIXXflUq","hSSvQuZPqg","5drc6CNHmv","LDk6ffaHir","gf8rI7Ow5C",
+"GXdoHXflUq","sqVrf5drc6","jSjS34QMc9","618DiIBe8k","s4786HlUbF","7fsYMlXFOB","s7MxkCfgr3","xciqpZUnqt","DLhzMe6e4z","pAhR19iGoT",
+"8FmFH9rlg9","Ta8f6guMb8","a00b5pWiOs","2DREsWPmlx","zQt6Q8FmFH","guMb87fKYU","9XyT9lj07Q","64s8NkB5nP","0h1b1yEfy9","jfREurz7Ut",
+"BpYhVtlILt","lViBvzFgtB","hYBCKtAOsr","IKxdLDG4sT","OUYuFlViBv","wDajX7hyVv","Ul4a1CxVEf","WDVWJOxWIH","ru4UGaFFss","QClRL2Nslm",
+"5drc6VLTy6","UlU3MRxrsm","VIlwPlsQGo","EOE1oDLhzM","hE1QlDz1R3","tl72Wiqv4k","Mkgy8rz7Ut","OxWIHgjUTu","KZamHlm0pD","oVQp6zz4ZU",
+"lweGyJRJQB","y94nwCIShG","9GXkX9iGoT","LDk6f3otm6","QnJ1SGSQwj","Ul4a1aDGtS","5Drn0RmDcr","jeskSdmoS7","QnJ1SEoToP","TCgPp0h1b1",
+"OUqFMcmXIX","pFrrlyluBx","gtCA5RACuj","X6Pintl72W","uoStwpFrrl","MGlTFl83Ud","kB5nPDLhzM","0YAGHRACuj","fmIK1hSSvQ","5Nammdpe1v",
+"VBjhzk85Ae","nlaBypAhR1","n1pmOuLtKs","YOfrYe6e4z","nlaByzz4ZU","jfREuuQIcz","29QAzzz4ZU","uQIczzY1GY","Zv7z0yluBx","2NslmbZLvS",
+"9y4lwS77LH","hi5X7iB08l","MezSWPYBf4","KZamHMojnP","FwEJzGWqqX","lkMUAVjCZq","7hyVvAgJHQ","jiVBPiB08l","dQ586FVMxo","KsjRK5Mg9r",
+"zmLYD7ku1p","HfyNQ4W0Tl","zqH0WcShY2","Q6hMC2Nslm","ciuWzjS1aj","4W0TlVBjhz","ogLgc64s8N","RzaZAWreyP","EOE1oiqv4k","uZPqgCNHmv",
+"WreyPKZamH","8hJdtQYxC0","SbRYyaDGtS","RkQke8FmFH","TCgPpYOfrY","fcwDacmXIX","fcJOyRpBQm","CdyBVW7cTs","nnP8oVerEA","fmIK1W3VFH",
+"I7p2aaez9y","jfREupmeCd","Qworui7WMQ","gIYvERsQUq","prNT6lXFOB","Kr8ys9rlg9","SbRYyblLA9","WmadAwiHrZ","No0QbvOqCE","3otm6GXdoH",
+"6q6L9qUJMd","W3VFHsx5Gl","qaofN5IhmG","YjB9tUl4a1","pT8wuLDk6f","lXFOBnFqik","fcwDa580YD","9eoRcaL6AJ","0h1b1zbIYY","FjHXR7fKYU",
+"G1RhSni2v1","QssNCpiJSk","7X3uymz8gx","brhlQdpe1v","2hEEUhUTw7","4dEz6KsjRK","7fKYU5Mg9r","8RCUA2Nslm","No0QbiKqhr","JIqXi5ZaEz",
+"9GXkXMmKGJ","64s8Nk85Ae","MmKGJzQt6Q","prNT6ReKEW","dpe1vBpYhV","jzUqRUmaEv","vkCHH6q6L9","K4GS8XflUq","7fKYU0YAGH","C2Ircv2eC3",
+"WmadAK20wK","45cIHuLtKs","MojnPuZPqg","zY1GYxciqp","wDajXsx5Gl","dpe1vv1Hln","G1RhSjzUqR","5Drn09eoRc","pWiOsjzUqR","KZamH618Di",
+"29QAzksJby","64s8NJRJQB","Ul4a1gdQsS","8cVD3qUJMd","v2eC3fLNg8","7fsYM64s8N","xReecW3VFH","ZuDtDnlaBy","W3VFHAIYUu","7lUXZjeskS",
+"MaJQsQssNC","lH1kt7fsYM","ciuWz7hyVv","pv0i7HzZT8","HfyNQVerEA","G1RhSUvlv4","9GXkXs93Ml","DQimpVBjhz","EOE1opFrrl","d85a9RpBQm",
+"taOXKpFrrl","7ku1pogLgc","l83Ud2TRI7","y94nwv8yFN","rhl0JStlDJ","hE1QlZ4I1v","WaWsvv2eC3","5IhmGhYBCK","0BmCy2TRI7","pT8wufaHir",
+"CIShGCK5W7","MK07YLDk6f","xciqp8RCUA","TCgPpdhSuH","FnPFBP6bcg","y94nwBbwgA","OUqFMrz7Ut","QChxsYw2oU","AmdQdo8Uyd","brhlQStlDJ",
+"EOE1o7fsYM","LbRTHcQOnv","TwanoGSQwj","BpYhVRmDcr","DcpWBcShY2","ZuDtDNOHsz","WMiS3cQOnv","ZzJHW8RCUA","RACujlpF6W","ZuDtD5Namm",
+"W7cTsNAFuw","BpYhVFwEJz","WDVWJCdyBV","ni2v1suY4x","jiVBPcL0aE","48cHLxReec","zqH0WDLhzM","ciuWz0PktI","tjQxsDQimp","QChxsAXpwE",
+"mX2GE8hJdt","EdBKcAgJHQ","FFDuiWPmlx","rhl0JguMb8","qQxHPQssNC","BbwgA0Wr5y","bZLvS9y4lw","uupzkOz8yZ","cShY2YjB9t","taOXKpiJSk",
+"pvgjSCdyBV","K20wKWaim6","uTacx4QMc9","4W0Tl29QAz","v1Hln8TxD7","hUTw7fqypy","lweGyix74r","KsjRKKsjRK","v2eC3BGaQY","xReecydG8U",
+"rz7UtmX2GE","FVMxosx5Gl","hUTw71LB1L","0Wr5y2TRI7","uQIczjtn0X","O3iyQ2Yz7E","pFrrloQ87r","l83UdiB08l","atef2Kr8ys","WMiS3oQ87r",
+"guMb8fcwDa","IBe8kVNCPd","cShY2kB5nP","b29RJdQ586","mz8gx3weIF","xReeczQt6Q","uJScXpvgjS","48cHLvLsmS","wDajX16lHc","NAFuwYOfrY",
+"HP4338RCUA","s93MlDLhzM","uupzkNcICA","RmDcrulk41","i7WMQQssNC","soy9ttaOXK","OxWIH618Di","MmKGJLDk6f","AkKTkDz1R3","bZLvSuJScX",
+"Z4I1v64s8N","EoToPpvgjS","WaWsvY1mC0","wiHrZ9eoRc","4W0TlSWfou","aDGtSMaJQs","d7vjM64s8N","RpBQmHzZT8","Chuy39XyT9","Pb1patl72W",
+"7ku1p5IhmG","JKWYRFPfSE","6AFT0iB08l","VNCPdVLTy6","2hEEU5nmWv","RmDcrokgRi","Z4I1vXyPZN","W7cTsUlU3M","cQOnvXyPZN","yofH3qUJMd",
+"uoStw8U2nU","zz4ZUtjQxs","gtCA5JkzUn","Oz8yZy94nw","RsQUqKASQ8","gf8rIcShY2","uupzkCIShG","JJs5mfLNg8","FwEJzI7p2a","rhl0JpvgjS",
+"NAFuwuoStw","s7Mxk2DREs","DcpWBZJTXH","hUTw7FnPFB","RpBQm8RCUA","CxVEfoGu6x","uLtKsK4GS8","JXljWnlaBy","7fsYMfcwDa","uoStw2Nslm",
+"8cVD3uZPqg","vLsmSRxrsm","8hJdt8RCUA","I7p2aAXpwE","k85AeECMvU","DQimpbgJAz","qUJMdru4UG","CNHmvReKEW","AgJHQuZPqg","HP4330ao3l",
+"iKqhrFVMxo","sx5GlvLsmS","faHirpvgjS","M6qcGEOE1o","dpe1vCxVEf","kB5nP5Drn0","NAFuwBpYhV","RsQUqVNCPd","2NslmFwEJz","zz4ZUksJby",
+"5NammMK07Y","WmadAjiVBP","lpF6W5VZjS","LDk6fDLhzM","FGzgpMaJQs","k85AeydG8U","W3VFHHzZT8","YjB9tuJScX","ciuWzjiVBP","MaJQsVerEA",
+"BbwgAKASQ8","G1RhSRpBQm","Mm8si5drc6","ni2v1RpBQm","P6bcgU3yw5","TwanokZANm","Chuy3G1RhS","Mkgy8fmIK1","4dEz6DQimp","gtCA5MmsIo",
+"4W0Tl7X3uy","suY4xCqqaD","RxrsmLbRTH","JRJQBn1pmO","hi5X7SWfou","v2eC3VjCZq","uvf7AVNCPd","qUJMdECMvU","i7WMQpT8wu","a00b5gdQsS",
+"zbIYYokgRi","BGaQYVerEA","RsQUq0Wr5y","3weIFRmDcr","7Ow5CAOgEe","Waim6NAFuw","7lUXZguMb8","SjskQYjB9t","wDajXbrhlQ","lpF6WFxX9q",
+"2NslmVerEA","tlILtQYxC0","2hEEUcL0aE","uQIczv1Hln","xXTI4K4GS8","Gv3Fq1LB1L","hi5X70BmCy","8FmFHrz7Ut","tjQxszmLYD","GSQwjcmXIX",
+"k85Aea00b5","ydG8UmX2GE","VerEAP6bcg","MmsIo64s8N","0Wr5yaFFss","zbIYYJkzUn","rKDLJZJTXH","GXdoHFPfSE","8U2nUuJScX","SbRYyHfyNQ",
+"fLNg8xReec","WMiS3FPfSE","0h1b1cL0aE","YjB9tiqv4k","VjCZqC2Irc","n8pJ9In3NS","pFrrlDQimp","SmGzvpAhR1","Cfgr32Yz7E","taOXK8cVD3",
+"EoToPnlaBy","WDVWJQbxXc","BFkb89rlg9","Dz1R3QbxXc","IBe8kGXdoH","QnJ1Sulk41","45cIHF6PT2","K20wKbZLvS","wDajXIRh48","IBe8kVjCZq",
+"jfREuuN6r3","BCxeCRxrsm","guMb8StlDJ","lViBvnnP8o","t98iWBFkb8","M6qcG2TRI7","0MR5XpvgjS","1LB1LzmLYD","gdQsSFwEJz","lm0pDM3zXL",
+"gtCA50MR5X","jS1ajyluBx","MK07YQnJ1S","FcWrWCp3mZ","hE1QlbrhlQ","lweGyJJs5m","FFDuiWDVWJ","CxVEfRxrsm","tvdkD7fsYM","tuDySVNCPd",
+"TXQ0ZpWiOs","Gv3FqMkgy8","VIlwPQssNC","EOE1oix74r","pFrrl48cHL","qaofNQYxC0","ReKEWBFkb8","ZUnqt5nmWv","UmaEvMmsIo","8RCUAIBe8k",
+"ix74rGSQwj","n1pmOgdQsS","DLhzMAOgEe","MmsIo9iGoT","he9IAoGu6x","uTacxfcwDa","X6PinJkzUn","8TxD7CK5W7","8FmFHlpF6W","ZJTXH9y4lw",
+"0Kyfslm0pD","pmeCdDQimp","m4bxUoVQp6","Kr8ys8cVD3","S2DfuJJs5m","o8UydIBe8k","cQOnvIn3NS","uZPqgdhSuH","Fhtglt59lR","sqVrfNAFuw",
+"sx5GlC2Irc","nFqikAOgEe","StlDJjtn0X","AmdQdSmGzv","nlaByWMiS3","5nmWvCIShG","oGu6xfqypy","AIYUuprNT6","7Ow5Cv1Hln","uvf7AsqVrf",
+"9rlg9Q6Lix","FnPFBtlILt","vOqCEQ6hMC","8xEKzEdBKc","oGu6xIRh48","24ARFtlILt","3otm6kB5nP","e6e4z2DREs","ECMvU45cIH","x3LDeHfyNQ",
+"hUTw75drc6","OxWIHM3zXL","JkzUnIn3NS","9XyT99iGoT","prNT6s93Ml","uQIczZv7z0","d85a9suY4x","uAWyppWiOs","GrDg745cIH","StlDJlsQGo",
+"QssNC4QMc9","3otm6jiVBP","s4786yofH3","QssNChe9IA","fcJOyFPfSE","lweGylpF6W","okgRiTwano","vkCHHVBjhz","dQ586uJScX","uLtKsQYxC0",
+"M6qcGJKWYR","C2Irch1zcH","i7WMQXflUq","2Yz7E5drc6","GXdoHLDk6f","PYBf4pv0i7","uvf7AyEfy9","ZUnqttAOsr","GSQwjWmadA","ZhwG1M6qcG",
+"yluBxYw2oU","2ZHdklCMxy","B3qemgIYvE","In3NSSjskQ","2Yz7Eni2v1","xXTI4rhl0J","W3VFH5Drn0","NhXduMmsIo","2hEEUdjsrv","9XyT9Rxrsm",
+"RBhp07X3uy","OUYuFaDGtS","OUYuFWMiS3","qUJMddpe1v","aL6AJqaofN","n8pJ964s8N","ix74rOz8yZ","xReecoGu6x","QnJ1SAgJHQ","dQ586BpYhV",
+"jeskSB3qem","AIYUuFFDui","2Yz7EgdQsS","s47867Ow5C","BCxeCfaHir","HfyNQSWfou","Q6hMCQClRL","9iGoTvOqCE","MmsIowiHrZ","2TRI7he9IA",
+"brhlQv8yFN","ix74rd85a9","M6qcGqUJMd","uupzkLewvM","45cIHprNT6","P6bcg6AFT0","C2IrcqaofN","hSSvQFNYIM","POUYSkZANm","DLhzM0ao3l",
+"Kr8ysqaofN","5IhmGM3zXL","uLtKsRACuj","StlDJQ6Lix","Kr8ysS77LH","OHaBz0Wr5y","pvgjSZv7z0","zFgtBVNCPd","WPmlxyEfy9","pvgjSUlU3M",
+"JXljWDz1R3","FnPFBazIWp","uTacxrKDLJ","Pb1paoVQp6","YOfrYh1zcH","Chuy3HP433","DLhzMjzUqR","NcICA2Nslm","i3pyd1j5L8","i7WMQF6PT2",
+"MGlTFtaOXK","KASQ8zQt6Q","fmIK1lXFOB","TXQ0Zuvf7A","F6PT224ARF","FNYIMhUTw7","EdBKcpWiOs","tl72WHzZT8","POUYSguMb8","8FmFH9y4lw",
+"rhl0JazIWp","gIYvEhe9IA","rhl0JI7p2a","2hEEUuZPqg","uN6r33weIF","i3pydQnJ1S","5VZjShYBCK","5Drn0CxVEf","bZLvSVLTy6","oQ87rFcWrW",
+"QClRLi7WMQ","e6e4zguMb8","BGaQYPYBf4","7Ow5C14FLR","soy9tuJScX","5ZaEzW7cTs","qUJMdoQ87r","e6e4zEOE1o","9y4lw0MR5X","1j5L8KZamH",
+"2hEEUyEfy9","6AFT0HlUbF","lViBvlCMxy","nlaByFLsph","gdQsSFNYIM","07n1cB3qem","ZUnqt24ARF","FGzgpQ6hMC","Yh1hFmX2GE","MGlTFGXdoH",
+"U3yw5Pb1pa","LewvMWMiS3","v2eC3ru4UG","aez9yiqv4k","jS1ajbgJAz","4QMc9soy9t","HP433MK07Y","2hEEUxReec","uLtKsDG4sT","sx5Glk85Ae",
+"B3qemix74r","HRxd8nlaBy","t98iWuPX7G","0h1b1FPfSE","pWiOs5drc6","IBe8k5Mg9r","i3pyd2Nslm","7hyVv6q6L9","O3iyQ6q6L9","NhXduQssNC",
+"brhlQaDGtS","suY4xgdQsS","azIWp0ao3l","UlU3MfFDrJ","4dEz6SWfou","QWxoTZv7z0","ZuDtDDQimp","rz7UtAmdQd","hYBCKtjQxs","8FmFHFcWrW",
+"euZA5L7cGc","RpBQmi3pyd","tvdkDPYBf4","yToGW5iGN5","M3zXLgjUTu","MojnP2Nslm","RACuj55rfB","F6PT2prNT6","JkzUnIjTwP","vLsmS1j5L8",
+"HzZT8lCMxy","gjUTuvOqCE","lkMUAAkKTk","guMb8W7cTs","FNYIMsuY4x","EOE1oLewvM","580YD14FLR","pmeCdvOqCE","uvf7AMkgy8","piJSkd85a9",
+"Cp3mZOz8yZ","9eoRcBFkb8","LDk6fdjsrv","CqqaD7fsYM","LewvMVIlwP","K20wKOUYuF","8hJdtnnP8o","gf8rIX6Pin","ulk41XflUq","No0QbnlaBy",
+"F6PT2AgJHQ","uJScX55rfB","6q6L9yluBx","tl72WRpBQm","MK07Y2Yz7E","l83Ud8hJdt","Yf2EcuQIcz","SbRYytvdkD","0KyfsUlU3M","zFgtB580YD",
+"wDajXvLsmS","qUJMdy94nw","n8pJ9hE1Ql","aL6AJRBhp0","d7vjMRBhp0","Uvlv4Zv7z0","dhSuHPb1pa","W7cTspmeCd","pvgjS5ZaEz","Z4I1v0Wr5y",
+"CNHmvY1mC0","2Nslme6e4z","qQxHP5VZjS","gf8rIuTacx","sqVrf45cIH","kZANmOUYuF","AgJHQW7cTs","2Yz7E1LB1L","Chuy3VIlwP","tjQxsDz1R3",
+"2Yz7E7X3uy","OUYuFB3qem","atef2IRh48","kB5nPzz4ZU","oGu6xuupzk","s4786s93Ml","0MR5X3otm6","ydG8UAmdQd","cL0aEpv0i7","cShY2OHaBz",
+"7fsYMatef2","mz8gxgjUTu","suY4xZJTXH","BpYhVdpe1v","FLsphjSjS3","XflUq07n1c","ZzJHWn1pmO","MK07Y64s8N","gtCA5nlaBy","yofH3Oz8yZ",
+"TwanouLtKs","8TxD7Chuy3","s4786nlaBy","lViBv48cHL","0YAGH7ku1p","5IhmG7lUXZ","s7MxkMojnP","J2mQiAgJHQ","MmsIoh1zcH","Vprf2ThjNn",
+"jtn0XRzaZA","L7cGcYjB9t","zQt6QYh1hF","8hJdtThjNn","5ZaEzCK5W7","JXljWOxWIH","jzUqRqUJMd","uZPqg0Kyfs","EoToP8hJdt","Nxx9VMmKGJ",
+"YOfrYFVMxo","W7cTsUmaEv","Kr8ysFwEJz","jzUqR7fKYU","FwEJzhi5X7","yToGWpiJSk","soy9tjfREu","iqv4kAXpwE","2DREsNOHsz","WMiS3zHF1q",
+"KsjRKGXdoH","L7cGcEoToP","SmGzv2Nslm","0YAGH7fsYM","KZamHCIShG","45cIHlweGy","zQt6Qrz7Ut","uvf7ANhXdu","rz7Ut5Drn0","zqH0Wd7vjM",
+"2DREsWreyP","JIqXipWiOs","MmKGJO3iyQ","8RCUAQssNC","FVMxoCNHmv","8FmFHFjHXR","Ss0ZuaL6AJ","s93MlCfgr3","AkKTkb29RJ","aez9yPb1pa",
+"cShY2S2Dfu","C2Irc2DREs","wDajXTwano","ZUnqtGWqqX","RsQUqYw2oU","suY4xS2Dfu","x3LDeYOfrY","8xEKzKZamH","LewvMWreyP","Y1mC0rz7Ut",
+"WPmlxs7Mxk","e6e4zZzJHW","QworuyofH3","AIYUubZLvS","7fsYMcShY2","RzaZAFhtgl","djsrv9y4lw","suY4xcmXIX","taOXKnnP8o","1LB1LksJby",
+"uJScXjiVBP","s7MxkVprf2","W7cTsXyPZN","a00b5lpF6W","pT8wu0h1b1","Yw2oURzaZA","1v5hHJ2mQi","2DREslsQGo","kZANmfaHir","tlILt0YAGH",
+"uTacxvkCHH","Z4I1vZJTXH","ZzJHWbrhlQ","1LB1LK4GS8","ECMvU2hEEU","9rlg9fcwDa","atef2k85Ae","7hyVvs7Mxk","rz7UthUTw7","580YDb29RJ",
+"BbwgA1j5L8","lweGy5Mg9r","jiVBPcmXIX","RsQUqMmsIo","8cVD3zY1GY","OUYuFC2Irc","SjskQy94nw","v8yFNguMb8","3otm6PYBf4","IKxdLHRxd8",
+"x3LDeLDk6f","soy9tVIlwP","yofH3soy9t","I7p2aRmDcr","taOXK29QAz","WDVWJ64s8N","ZuDtDKsjRK","uoStwIjTwP","aez9yuLtKs","8cVD31v5hH",
+"x3LDeUmaEv","ciuWz9XyT9","8FmFHzz4ZU","FnPFBRACuj","WaWsvBFkb8","ydG8UwiHrZ","Zv7z0hi5X7","G1RhSVerEA","GSQwjfLNg8","MezSWEdBKc",
+"BbwgAwiHrZ","QChxsZ4I1v","W3VFH618Di","zQt6QaDGtS","ThjNnqUJMd","suY4xhSSvQ","IKxdLtAOsr","Ss0ZuPOUYS","he9IA0Kyfs","piJSkjSjS3",
+"tvdkD8xEKz","4W0Tl8cVD3","lpF6W2Nslm","HfyNQCdyBV","RsQUq1j5L8","zmLYD3weIF","3otm6ulk41","v2eC3AOgEe","6q6L9ZhwG1","MmKGJ5Mg9r",
+"ECMvU4QMc9","azIWp5ZaEz","dQ586IjTwP","0KyfsBpYhV","Cp3mZokgRi","jS1ajpAhR1","faHirlweGy","64s8NtuDyS","Dz1R3s4786","YOfrYhe9IA",
+"dpe1vrKDLJ","RxrsmyofH3","sx5GlaFFss","In3NSZhwG1","9XyT9Dz1R3","8hJdtDz1R3","hSSvQWDVWJ","4dEz6v2eC3","5drc6qQxHP","2Yz7EAgJHQ",
+"ZuDtD29QAz","s7MxkblLA9","RzaZA8TxD7","CxVEfgf8rI","uPX7GqaofN","v1HlnFhtgl","okgRiblLA9","5NammsqVrf","IKxdL0Kyfs","cL0aEpiJSk",
+"JJs5mzz4ZU","XyPZNFPfSE","7hyVvvLsmS","yEfy9FnPFB","Zv7z0fqypy","jeskSQbxXc","RxrsmlCMxy","he9IACp3mZ","W3VFHpWiOs","Kr8ys4QMc9",
+"MK07YtuDyS","uoStw9eoRc","QChxstjQxs","e6e4zb29RJ","WMiS3LDk6f","pmeCd8FmFH","pv0i7Fhtgl","CxVEfK20wK","9GXkXaFFss","Q6hMCCK5W7",
+"MojnPB3qem","uZPqgl83Ud","zFgtBblLA9","YjB9tZuDtD","IBe8kgdQsS","8TxD7MojnP","0ao3lzmLYD","5nmWvNo0Qb","JkzUnChuy3","tjQxsuupzk",
+"YjB9twiHrZ","fcJOyzz4ZU","b29RJzY1GY","2NslmOUYuF","y94nwNhXdu","Nxx9VgtCA5","bZLvS7X3uy","7X3uyt59lR","fLNg82DREs","rKDLJ9y4lw",
+"QnJ1StlILt","rhl0JMkgy8","7ku1pK20wK","8FmFHt98iW","lViBv5iGN5","Dz1R3jfREu","JIqXitjQxs","pv0i7MK07Y","FnPFBt59lR","blLA9FxX9q",
+"C2IrcMGlTF","8cVD39rlg9","pv0i7ogLgc","nnP8odmoS7","FFDuidpe1v","o8Uyd9rlg9","wiHrZydG8U","uN6r3MGlTF","CNHmvFFDui","oQ87rpvgjS",
+"OxWIH2Nslm","Z4I1vQnJ1S","O3iyQjSjS3","tl72Waez9y","uTacxM6qcG","euZA507n1c","SmGzv0YAGH","uZPqgyluBx","QnJ1ScShY2","9GXkX2TRI7",
+"MojnPQChxs","L7cGcGXdoH","e6e4zRpBQm","QssNCGWqqX","EoToPBGaQY","oQ87r9rlg9","fmIK1K20wK","P6bcgtlILt","i7WMQ7X3uy","LbRTHyEfy9",
+"K4GS8hE1Ql","RACujMK07Y","xciqpIjTwP","ZJTXHOz8yZ","pAhR1he9IA","FGzgpWaim6","oVQp6x3LDe","pWiOszbIYY","jfREu0PktI","pvgjSAmdQd",
+"wDajXZv7z0","zY1GY1v5hH","5drc6BpYhV","2ZHdkDcpWB","NOHsz7X3uy","dpe1vFcWrW","RmDcrzFgtB","AOgEe0Kyfs","yToGW8U2nU","x3LDemX2GE",
+"SmGzvKZamH","5ZaEzFVMxo","pWiOs24ARF","7fsYMMK07Y","HP433NOHsz","vOqCECK5W7","D6rByQYxC0","aFFssRsQUq","y94nwfcwDa","6AFT0SbRYy",
+"ulk41SmGzv","JRJQBCK5W7","l83Ude6e4z","Dz1R3Pb1pa","ksJbyx3LDe","3otm6CqqaD","2ZHdkUl4a1","QbxXcQssNC","9y4lwfqypy","S2DfuZzJHW",
+"yToGWZv7z0","EoToPqQxHP","KZamHmz8gx","8TxD7fcJOy","gf8rI5nmWv","5VZjSAIYUu","9rlg98TxD7","RkQke9iGoT","ZzJHW4QMc9","ReKEWFLsph",
+"nlaBypvgjS","Yh1hFl83Ud","GrDg7JJs5m","Gv3FqbZLvS","o8Uydx3LDe","B3qemQWxoT","7fKYUdpe1v","ReKEWVLTy6","i3pydFLsph","k85AeLbRTH",
+"hi5X7zY1GY","fFDrJCp3mZ","jS1ajxciqp","blLA9ThjNn","HzZT8pWiOs","h1zcHK4GS8","a00b5QbxXc","pFrrliB08l","kB5nP580YD","gdQsS9rlg9",
+"JkzUnyEfy9","ZUnqt1LB1L","8FmFHvLsmS","pWiOsLewvM","OxWIHRkQke","RsQUquN6r3","9GXkXJ2mQi","6AFT0e6e4z","AIYUuazIWp","yluBxrhl0J",
+"64s8NFPfSE","MmsIoQChxs","jfREuatef2","K4GS8dQ586","oVQp6TCgPp","StlDJGrDg7","IKxdLM6qcG","Gv3FqlCMxy","JXljWi3pyd","jSjS3JXljW",
+"Z4I1vBGaQY","ix74rIjTwP","AgJHQSmGzv","Cp3mZB3qem","TXQ0ZazIWp","7fsYM7X3uy","7lUXZ580YD","GSQwjrhl0J","0BmCyiB08l","5VZjSqUJMd",
+"5Drn0dhSuH","euZA5JRJQB","RmDcr0MR5X","RACujv8yFN","lpF6W7Ow5C","8xEKze6e4z","StlDJuLtKs","jzUqRZJTXH","07n1c29QAz","AXpwE9GXkX",
+"8hJdtyluBx","B3qemtaOXK","k85Aehe9IA","TXQ0ZP6bcg","FNYIMsqVrf","9y4lwzHF1q","DcpWBWmadA","rhl0JlweGy","G1RhSCfgr3","SbRYyfFDrJ",
+"iqv4kDLhzM","HlUbF2Yz7E","0MR5XaFFss","8xEKzcmXIX","WreyP6AFT0","QYxC0RACuj","48cHLOUYuF","he9IA2DREs","pAhR1CNHmv","MojnPZ4I1v",
+"vkCHHPYBf4","Ta8f6VerEA","MojnPMGlTF","fcJOyxciqp","Ta8f61v5hH","ZuDtDwDajX","NOHszJRJQB","dhSuH580YD","2Yz7EVNCPd","Dz1R3W7cTs",
+"IBe8kmX2GE","piJSk1LB1L","Q6LixReKEW","pT8wuTCgPp","tvdkDJ2mQi","VerEA0BmCy","HP433Yf2Ec","KASQ8WMiS3","5Drn0NcICA","Zv7z02TRI7",
+"x3LDeVLTy6","rhl0JWaim6","s4786hSSvQ","lm0pDHP433","0ao3lBbwgA","zqH0WCdyBV","bgJAz1j5L8","cmXIXVjCZq","QnJ1SAmdQd","HfyNQ5Namm",
+"3otm60Wr5y","tlILt5iGN5","6q6L9fcJOy","lCMxy2Nslm","580YDulk41","TXQ0Zl83Ud","dpe1vQworu","7X3uyk85Ae","bgJAz8hJdt","QbxXcjfREu",
+"zmLYDzbIYY","2TRI7UmaEv","WmadA3weIF","LDk6fsoy9t","CxVEfZUnqt","5nmWvK20wK","9iGoTNhXdu","HP433Fhtgl","VLTy6pT8wu","d7vjMZv7z0",
+"pT8wulH1kt","hYBCKdQ586","9XyT9guMb8","EdBKcuN6r3","LewvM8xEKz","tAOsryofH3","m4bxUk85Ae","sx5GlyluBx","ix74rfcwDa","IBe8kCK5W7",
+"UlU3M5Drn0","pvgjSRxrsm","yofH3nnP8o","y94nwpAhR1","aL6AJEdBKc","sx5GlFxX9q","RACuj14FLR","DcpWBpvgjS","bZLvSOHaBz","YOfrYwiHrZ",
+"iwzGkLDk6f","Kr8ysazIWp","BbwgAuZPqg","XflUqaez9y","fFDrJOUYuF","lj07QL7cGc","14FLR4QMc9","HfyNQUl4a1","HRxd8SmGzv","MK07Yrz7Ut",
+"d85a9No0Qb","zQt6Q4QMc9","pFrrlFnPFB","9XyT9iB08l","BFkb8S77LH","UlU3MF6PT2","7lUXZksJby","IRh48e6e4z","9XyT9Twano","StlDJTCgPp",
+"lsQGoWDVWJ","X6PinHzZT8","FcWrWVIlwP","8FmFHU3yw5","VLTy69GXkX","ECMvUuJScX","b29RJru4UG","hUTw7X6Pin","oQ87ruupzk","hi5X7wDajX",
+"EOE1osx5Gl","fqypyyvOMI","uTacxSs0Zu","nFqikIn3NS","NAFuw1v5hH","VjCZq5IhmG","S2DfuRACuj","blLA9BbwgA","2Yz7EnnP8o","tlILtpiJSk",
+"5ZaEzQ6hMC","TCgPpxXTI4","yToGWMmsIo","8TxD7K4GS8","ZzJHWvLsmS","MK07Y2Nslm","7fsYM4dEz6","SjskQSWfou","Dz1R3n1pmO","okgRiDLhzM",
+"MojnP8U2nU","fFDrJZJTXH","v2eC3XyPZN","1v5hHvkCHH","QYxC0IBe8k","JIqXiWaWsv","UmaEvpiJSk","5VZjSe6e4z","tvdkDP6bcg","0BmCyokgRi",
+"aL6AJDLhzM","QWxoTXflUq","2hEEUksJby","QworulViBv","Cp3mZPb1pa","MojnP1v5hH","BCxeCqaofN","24ARFJkzUn","I7p2aKsjRK","FjHXRTCgPp",
+"QnJ1SjSjS3","RmDcrsuY4x","OHaBz0MR5X","5IhmG9XyT9","S2DfuRBhp0","d7vjMFFDui","5Mg9rhYBCK","tlILtKr8ys","16lHcHRxd8","8xEKzCp3mZ",
+"vOqCEogLgc","DLhzMrKDLJ","qUJMdThjNn","5VZjSy94nw","atef2SbRYy","9y4lwYjB9t","Yh1hFGSQwj","ZzJHWLbRTH","tvdkDazIWp","OUYuF6AFT0",
+"8RCUA8xEKz","VNCPdRBhp0","K4GS8suY4x","L7cGcjeskS","nlaBy9GXkX","S77LHt59lR","v2eC3yEfy9","EOE1oAmdQd","618DiZhwG1","Chuy3fqypy",
+"NOHszgf8rI","uPX7GAgJHQ","VjCZqJIqXi","K4GS845cIH","DG4sTRkQke","0ao3lm4bxU","o8Uydi7WMQ","kZANmZv7z0","y94nw5IhmG","7fKYUReKEW",
+"S77LHTCgPp","HRxd8yluBx","J2mQiXflUq","BCxeC14FLR","2ZHdkpiJSk","suY4xJXljW","YjB9tnFqik","b29RJK20wK","t59lRQ6Lix","ni2v1rhl0J",
+"qaofNjfREu","Cfgr3uvf7A","9rlg9he9IA","MmsIoRkQke","64s8N2hEEU","SbRYyW7cTs","0Wr5ybZLvS","SmGzvs93Ml","uLtKsnnP8o","VIlwPFnPFB",
+"DLhzM580YD","uLtKsa00b5","JJs5mfcJOy","HzZT8J2mQi","cmXIX7fKYU","IBe8kYf2Ec","Yh1hFYjB9t","C2IrcLewvM","MaJQsd7vjM","9XyT9k85Ae",
+"S2Dfu1LB1L","n1pmOLewvM","580YDJRJQB","4dEz60h1b1","fcJOyNhXdu","0BmCyUmaEv","e6e4zS77LH","RpBQmblLA9","5iGN5ciuWz","cShY2MK07Y",
+"0PktIHRxd8","jiVBP5drc6","FwEJzgjUTu","DG4sTCp3mZ","5drc6zQt6Q","Ta8f648cHL","618DiQ6Lix","ZuDtDtaOXK","ZUnqtMGlTF","iqv4kcmXIX",
+"IKxdLazIWp","OxWIHnlaBy","TXQ0ZciuWz","VIlwPprNT6","StlDJQssNC","MmKGJsx5Gl","MmsIo4QMc9","3otm6xXTI4","7fsYMPOUYS","ZuDtDjS1aj",
+"BpYhVCNHmv","MojnPy94nw","i7WMQ1LB1L","AgJHQwiHrZ","D6rByjeskS","2Nslm7X3uy","EOE1os4786","ksJbyHzZT8","d85a9Mkgy8","FcWrWKr8ys",
+"jS1ajVBjhz","7fsYMCfgr3","P6bcgzqH0W","n1pmO5Namm","VerEAtvdkD","GSQwjRmDcr","EoToPjfREu","RzaZAnlaBy","uTacx3otm6","zFgtBpT8wu",
+"fqypykB5nP","MmKGJC2Irc","FGzgp7fKYU","PYBf4RACuj","RACujzmLYD","b29RJoGu6x","In3NS0Kyfs","16lHcyvOMI","Pb1paQbxXc","W7cTsZzJHW",
+"brhlQQssNC","guMb8QChxs","hE1QlQssNC","i3pydiB08l","uAWypuoStw","FVMxoulk41","U3yw5faHir","yToGWUmaEv","7fsYMazIWp","JXljWLDk6f",
+"HlUbFjfREu","gf8rIAmdQd","zqH0WcL0aE","RBhp0Q6Lix","IRh48ZhwG1","fLNg8hYBCK","nlaBytAOsr","HP4337fsYM","OUqFMvOqCE","CdyBVWaim6",
+"brhlQv2eC3","HfyNQv2eC3","9rlg9uvf7A","jzUqRQYxC0","FwEJz14FLR","MmsIoHfyNQ","yofH3BGaQY","nFqikOUqFM","MmKGJAXpwE","m4bxUOz8yZ",
+"fFDrJ5Namm","yluBxi7WMQ","lXFOByvOMI","QYxC0EdBKc","9GXkXSbRYy","tvdkD45cIH","hYBCK0PktI","SmGzvyEfy9","DcpWBFwEJz","Zv7z0uN6r3",
+"2TRI7zmLYD","StlDJ8hJdt","2hEEU48cHL","QbxXc618Di","Fhtgl8xEKz","o8UydtjQxs","5NammzFgtB","dmoS7KZamH","m4bxUGSQwj","guMb8xciqp",
+"5IhmGzY1GY","Rxrsmh1zcH","jzUqRBFkb8","iqv4kmX2GE","ZuDtDyToGW","UmaEv29QAz","fcJOyDLhzM","zmLYDulk41","hSSvQyluBx","QClRLd7vjM",
+"Waim65drc6","I7p2ajzUqR","VerEACxVEf","rKDLJFnPFB","zQt6QL7cGc","FwEJzgtCA5","M6qcGS2Dfu","TXQ0ZQssNC","AmdQd14FLR","hUTw7JkzUn",
+"jtn0Xrz7Ut","n1pmOBGaQY","prNT6cL0aE","jSjS3BGaQY","5nmWvFcWrW","pvgjSWmadA","WmadAP6bcg","ni2v1XyPZN","5nmWvaFFss","J2mQiRBhp0",
+"MmKGJlm0pD","RxrsmBpYhV","a00b5rhl0J","VjCZq7X3uy","I7p2afcJOy","48cHLEoToP","Cp3mZksJby","v1HlnzmLYD","JIqXizFgtB","brhlQzY1GY",
+"RsQUqGv3Fq","LewvMHfyNQ","QWxoTiwzGk","In3NSMmsIo","jfREuGXdoH","8RCUAfcwDa","v8yFN8RCUA","9iGoT9XyT9","JKWYR4dEz6","9rlg9xciqp",
+"lkMUAM3zXL","4dEz664s8N","zHF1qaFFss","CNHmv2DREs","POUYSFcWrW","9y4lwpiJSk","gIYvEnnP8o","Mm8siFhtgl","sqVrfuQIcz","0ao3llCMxy",
+"OUqFMMaJQs","0YAGH7X3uy","TXQ0ZgIYvE","NAFuwMmsIo","WaWsvulk41","iwzGkOxWIH","FPfSE0Kyfs","AkKTki7WMQ","JXljWBpYhV","mz8gxjSjS3",
+"RxrsmlViBv","oVQp62hEEU","Vprf2MGlTF","Dz1R3B3qem","QClRL64s8N","zz4ZUaez9y","K4GS8S77LH","Ss0ZuI7p2a","uupzkiwzGk","zFgtBnnP8o",
+"iqv4kLbRTH","WPmlxThjNn","FhtglpiJSk","RmDcruJScX","xXTI4mz8gx","0Wr5yFxX9q","fcJOyzY1GY","XflUqhSSvQ","GXdoHhe9IA","fLNg8h1zcH",
+"VIlwPHfyNQ","iB08lKsjRK","P6bcgt59lR","tlILtVBjhz","gdQsSKZamH","pT8wugjUTu","oQ87rM6qcG","lH1ktC2Irc","MGlTFBFkb8","taOXKcmXIX",
+"ru4UGsoy9t","hUTw7tlILt","e6e4zCdyBV","lm0pDv2eC3","FVMxon1pmO","nFqikbrhlQ","ciuWzhSSvQ","MaJQsMezSW","JIqXiYh1hF","FGzgpyEfy9",
+"MK07YG1RhS","B3qemtuDyS","7lUXZyvOMI","b29RJbZLvS","DcpWBVprf2","CxVEfMmsIo","Mkgy8uTacx","lH1ktK20wK","lm0pDKsjRK","Dz1R32Yz7E",
+"BpYhVAkKTk","2hEEUTCgPp","G1RhSTXQ0Z","zY1GYY1mC0","MK07YCfgr3","AIYUublLA9","lXFOBCp3mZ","uPX7GHRxd8","i3pydFjHXR","5iGN5DcpWB",
+"BbwgAzbIYY","XflUqRACuj","0MR5Xhe9IA","Chuy3GSQwj","S77LHlsQGo","CxVEfHRxd8","tl72WFFDui","IjTwPy94nw","Uvlv4QClRL","MojnPuQIcz",
+"a00b5Mm8si","FnPFBDLhzM","rhl0JCNHmv","Waim6AgJHQ","azIWp0YAGH","gIYvE5iGN5","X6PinkB5nP","IRh481LB1L","lweGyBFkb8","CqqaDrKDLJ",
+"y94nws4786","NAFuwDQimp","RmDcrSbRYy","CIShGOUqFM","lXFOBpv0i7","RxrsmOz8yZ","5IhmGC2Irc","VerEA07n1c","GXdoHuAWyp","k85AennP8o",
+"ru4UGb29RJ","QYxC0cL0aE","JJs5mzHF1q","5drc6M3zXL","HzZT8VIlwP","uLtKs6q6L9","Pb1paFwEJz","I7p2aokgRi","QYxC0Waim6","FjHXRxXTI4",
+"X6PinEdBKc","16lHc29QAz","580YDbgJAz","okgRi29QAz","MGlTFlweGy","DQimpKASQ8","Pb1paNo0Qb","MmsIoDLhzM","tuDySQnJ1S","fqypyhe9IA",
+"lCMxyQ6Lix","CxVEfLewvM","Waim6cShY2","JXljWoQ87r","Dz1R3yvOMI","VBjhzRzaZA","U3yw5dhSuH","EoToPoVQp6","CqqaD5IhmG","he9IAe6e4z",
+"KASQ8uvf7A","rz7Utrz7Ut","FxX9qrKDLJ","s93Mlrz7Ut","7ku1p7hyVv","WDVWJHRxd8","7Ow5CBbwgA","W7cTsdQ586","NcICAChuy3","NAFuwGrDg7",
+"CxVEf0ao3l","ZJTXH0PktI","yEfy9Twano","yToGW5Mg9r","jtn0Xh1zcH","lm0pD48cHL","4dEz6guMb8","pWiOsKZamH","K4GS8RmDcr","FVMxo580YD",
+"NhXduzmLYD","FLsph7fKYU","AkKTklkMUA","5Namm8cVD3","5drc6aDGtS","cL0aEJRJQB","AgJHQl83Ud","Ss0ZunFqik","Cp3mZ5Mg9r","Yh1hFpmeCd",
+"hYBCKaFFss","dhSuH9XyT9","K20wKazIWp","3weIFMojnP","mX2GES2Dfu","ni2v1Uvlv4","yToGWpFrrl","zmLYDdhSuH","Mkgy8xciqp","nFqik0Kyfs",
+"uvf7ApFrrl","hYBCKk85Ae","GSQwjXflUq","Cfgr3MezSW","KASQ8Nxx9V","F6PT2xciqp","qUJMd9XyT9","OxWIHuQIcz","gIYvEEoToP","nFqikv1Hln",
+"Zv7z00PktI","uLtKsoGu6x","k85AePYBf4","bgJAzlCMxy","sqVrfogLgc","EoToPfqypy","In3NSFhtgl","s7MxkIKxdL","jtn0X2TRI7","hi5X7prNT6",
+"zmLYDbZLvS","fFDrJZuDtD","qaofNGXdoH","ix74rWmadA","nFqiktl72W","ru4UGReKEW","rz7UtJ2mQi","0h1b1IBe8k","lsQGoZv7z0","BGaQY0BmCy",
+"Yh1hFI7p2a","DQimpRmDcr","e6e4zfcJOy","GWqqXlj07Q","lweGyzQt6Q","IRh48WDVWJ","nlaByZhwG1","rz7UtNcICA","RBhp0euZA5","yEfy9d7vjM",
+"No0QbaDGtS","Fhtgl2Nslm","0BmCyyluBx","FwEJzfLNg8","5Mg9rlH1kt","14FLRv1Hln","pvgjSYjB9t","2ZHdkHlUbF","8U2nUCfgr3","Yf2EclsQGo",
+"EdBKclH1kt","9rlg9gdQsS","Yh1hFFGzgp","Chuy3ZuDtD","FcWrWi7WMQ","Waim6kZANm","aDGtSuZPqg","CdyBV2hEEU","lkMUAAOgEe","DcpWB8xEKz",
+"n8pJ9Q6hMC","BFkb8MmKGJ","FFDui8RCUA","qQxHPtuDyS","8RCUAECMvU","o8UydFNYIM","JIqXivOqCE","HP433pFrrl","1j5L8RpBQm","64s8NJKWYR",
+"SmGzvdmoS7","xciqpBbwgA","5ZaEzSmGzv","5VZjS0BmCy","NAFuwDcpWB","8TxD77hyVv","zqH0WpiJSk","UmaEvSbRYy","lm0pDOz8yZ","WmadA8U2nU",
+"KZamHGrDg7","jS1ajm4bxU","FxX9qbrhlQ","uN6r31v5hH","16lHcrKDLJ","4W0TlZzJHW","JXljWbZLvS","rhl0JDcpWB","azIWpaL6AJ","YjB9t5VZjS",
+"SjskQuLtKs","jS1ajiwzGk","gf8rIBFkb8","0MR5XFNYIM","Y1mC09eoRc","DLhzMXyPZN","tjQxsEoToP","CdyBVRxrsm","nFqikNAFuw","JkzUnd85a9",
+"jzUqRhYBCK","WMiS3m4bxU","FxX9qxciqp","HzZT8VLTy6","s7Mxk8FmFH","ZzJHWGSQwj","0BmCyWPmlx","Ss0ZuzbIYY","t98iWO3iyQ","FjHXRX6Pin",
+"y94nwrhl0J","8cVD3HfyNQ","oQ87rguMb8","IBe8kG1RhS","pFrrlP6bcg","9rlg9FLsph","lpF6WVprf2","No0QbkZANm","dpe1vb29RJ","ru4UGGSQwj",
+"qUJMdiKqhr","RsQUqtjQxs","DcpWBazIWp","ni2v1tjQxs","4W0TlkB5nP","zqH0WX6Pin","UlU3MRkQke","C2IrcfcwDa","HzZT8zHF1q","7fsYM7fsYM",
+"jiVBPzbIYY","2TRI7kB5nP","uQIczHRxd8","2Yz7E5Drn0","WPmlx8RCUA","4QMc9tAOsr","v8yFNsx5Gl","2TRI7JIqXi","uoStwbZLvS","FPfSEfFDrJ",
+"NOHszi7WMQ","tAOsrcQOnv","NAFuwciuWz","i3pydCNHmv","cmXIX4dEz6","lweGyKZamH","v2eC3tjQxs","uoStwAOgEe","uZPqg4dEz6","5IhmG9GXkX",
+"29QAzgjUTu","n8pJ9HzZT8","5IhmGcmXIX","8xEKzYw2oU","Kr8ysK4GS8","oVQp6C2Irc","MaJQslkMUA","ZhwG1zmLYD","lXFOB0PktI","7fKYUogLgc",
+"JIqXiDQimp","0BmCyM3zXL","X6Pina00b5","zbIYYnnP8o","0BmCypWiOs","HlUbFlH1kt","lsQGoxReec","wiHrZAgJHQ","ZUnqtFcWrW","0ao3luvf7A",
+"BGaQYzqH0W","QnJ1SlXFOB","CqqaD24ARF","DG4sTC2Irc","aFFsslkMUA","lj07Q8U2nU","OxWIHWmadA","No0QbIRh48","0YAGH2hEEU","vkCHHpT8wu",
+"Ss0Zu4QMc9","RkQke29QAz","ReKEW0h1b1","azIWpzz4ZU","SjskQv8yFN","jzUqRK4GS8","iqv4kQChxs","W3VFH16lHc","yToGWzFgtB","U3yw5SmGzv",
+"uLtKsBFkb8","sx5Glru4UG","SjskQRzaZA","Q6LixfmIK1","yEfy98RCUA","FjHXRblLA9","yofH3WMiS3","ix74rSs0Zu","hE1QlgjUTu","NhXduRpBQm",
+"0Wr5y5Namm","m4bxURBhp0","GrDg7ni2v1","RsQUqdhSuH","iKqhrgjUTu","fcwDaNOHsz","BpYhVMojnP","vLsmS8xEKz","Vprf2lkMUA","gdQsShe9IA",
+"uvf7AMmKGJ","RmDcrGrDg7","8U2nUWmadA","6AFT0piJSk","O3iyQlkMUA","hUTw7taOXK","ReKEWl83Ud","i3pydFcWrW","vOqCE8U2nU","U3yw5lj07Q",
+"uZPqgn1pmO","OHaBzokgRi","0Wr5yZUnqt","FjHXRsoy9t","vkCHHb29RJ","2hEEUtAOsr","b29RJFxX9q","iB08lfaHir","zz4ZUdpe1v","zFgtBcmXIX",
+"JKWYRrhl0J","2ZHdkCxVEf","8cVD3X6Pin","DQimpAmdQd","aL6AJVNCPd","e6e4zDz1R3","5nmWvPYBf4","SjskQHlUbF","nFqikPb1pa","zqH0W3otm6",
+"Y1mC0wDajX","FVMxoWMiS3","8xEKzqUJMd","OUqFMhi5X7","euZA545cIH","brhlQSjskQ","55rfBOHaBz","FcWrWVBjhz","DG4sTBbwgA","WreyPuPX7G",
+"YjB9tqaofN","C2IrcwiHrZ","fLNg87ku1p","JKWYRUl4a1","JRJQB2DREs","WaWsvxciqp","QbxXc2ZHdk","zFgtBJkzUn","rhl0JWMiS3","2NslmJKWYR",
+"aFFssZJTXH","yToGWe6e4z","tvdkDPOUYS","tuDyS0h1b1","8U2nUDQimp","pT8wuYjB9t","rhl0J2Yz7E","dmoS7StlDJ","Ta8f6lsQGo","oVQp6Q6Lix",
+"S77LHWaim6","9eoRcxciqp","jS1ajoGu6x","uJScXZUnqt","xciqpS2Dfu","L7cGc6AFT0","WPmlxd85a9","t98iWnFqik","lH1kt4QMc9","8U2nUB3qem",
+"8RCUA7Ow5C","SmGzvJkzUn","lweGyL7cGc","W7cTsiwzGk","fFDrJWreyP","F6PT2d85a9","dmoS7SbRYy","mz8gx0Kyfs","JXljWkZANm","YjB9tVLTy6",
+"piJSkfFDrJ","G1RhSStlDJ","29QAznlaBy","ZzJHW5Namm","mz8gxXflUq","9iGoTbgJAz","0Wr5yvkCHH","fmIK1SjskQ","hi5X7sqVrf","xciqpK20wK",
+"K4GS87X3uy","AmdQdAmdQd","G1RhSVIlwP","uJScXIjTwP","HlUbFuLtKs","8cVD3Ta8f6","BGaQYAkKTk","W3VFHguMb8","Yw2oUNo0Qb","Q6hMC2hEEU",
+"ZzJHWUmaEv","2TRI7TCgPp","cL0aE14FLR","OUqFMVNCPd","dhSuHblLA9","In3NSpAhR1","ulk41RkQke","b29RJFwEJz","IjTwPuJScX","2Yz7EK20wK",
+"DLhzM9eoRc","9y4lwBCxeC","45cIHfaHir","v8yFNlH1kt","oVQp6Ta8f6","QClRL9XyT9","Nxx9VRkQke","IjTwPOHaBz","VLTy6ECMvU","RmDcrZ4I1v",
+"qQxHPru4UG","ReKEWsoy9t","s4786pvgjS","6q6L92TRI7","BCxeCBpYhV","fmIK1rhl0J","fmIK1rz7Ut","sx5GlWDVWJ","QChxsOxWIH","s7MxkFxX9q",
+"jS1ajzmLYD","dQ586hUTw7","pmeCdKsjRK","jtn0Xs4786","618DiZuDtD","iqv4kzqH0W","NhXduCqqaD","t98iWlj07Q","dhSuHWaim6","VNCPdmz8gx",
+"rhl0JnFqik","Chuy3t59lR","MaJQsaez9y","8TxD7soy9t","JKWYR0PktI","n1pmOuAWyp","prNT6v1Hln","5drc6X6Pin","hSSvQ24ARF","FnPFB6q6L9",
+"G1RhSoGu6x","FNYIMmz8gx","7hyVv7lUXZ","QClRLgjUTu","Ta8f60h1b1","O3iyQi7WMQ","uPX7GOHaBz","wiHrZtaOXK","jtn0XD6rBy","0KyfsZv7z0",
+"euZA5uLtKs","JIqXiuJScX","KASQ8guMb8","he9IAMmsIo","OUqFMtjQxs","Yw2oUtuDyS","TXQ0ZRkQke","M3zXLoGu6x","uupzkFGzgp","hUTw7b29RJ",
+"OxWIH48cHL","GWqqXIn3NS","FGzgpBCxeC","sqVrf48cHL","fmIK1cmXIX","fLNg80ao3l","fmIK1lweGy","gf8rIxXTI4","9rlg9aDGtS","uAWypThjNn",
+"SWfouatef2","NcICASmGzv","QnJ1SRACuj","VerEAK20wK","vLsmSMojnP","HP4339rlg9","MaJQsS77LH","MGlTFuupzk","5drc6Zv7z0","0PktIY1mC0",
+"zHF1qsoy9t","EdBKcG1RhS","uN6r3JKWYR","lCMxyaL6AJ","WreyPCfgr3","vkCHHhSSvQ","jfREuEOE1o","v1HlnQworu","ZzJHWkB5nP","QYxC0FnPFB",
+"hi5X7VBjhz","CK5W77ku1p","h1zcHJkzUn","EoToP45cIH","soy9tLewvM","IKxdLtjQxs","ECMvUpT8wu","2ZHdkm4bxU","RBhp0v8yFN","k85Aek85Ae",
+"VBjhzSs0Zu","uTacxs7Mxk","ThjNnHzZT8","BGaQY2ZHdk","iKqhrvLsmS","FPfSEnnP8o","lj07QFLsph","HzZT8yEfy9","gjUTuoGu6x","euZA52hEEU",
+"9XyT9FPfSE","dpe1vOz8yZ","GSQwjDz1R3","uTacxulk41","zbIYYazIWp","Yf2Ec1v5hH","kB5nP7fKYU","NhXdu14FLR","CIShGgdQsS","uTacxJKWYR",
+"pAhR1gdQsS","2DREsOUYuF","FLsphWreyP","2Yz7EcmXIX","uPX7GcL0aE","n1pmO48cHL","uTacxMK07Y","xXTI4hYBCK","CIShGulk41","iB08ltAOsr",
+"JJs5mQssNC","Y1mC0U3yw5","2hEEU8xEKz","DQimpv1Hln","faHiriqv4k","JXljWe6e4z","a00b5DLhzM","No0QbFGzgp","pmeCdY1mC0","i3pydv1Hln",
+"prNT6cmXIX","v2eC3iqv4k","jtn0XZhwG1","Mkgy8djsrv","HlUbFy94nw","iwzGkKsjRK","JJs5mG1RhS","5VZjSdpe1v","fcwDajtn0X","8RCUAAmdQd",
+"ZuDtDPOUYS","FPfSEFhtgl","5Mg9rm4bxU","OUqFM24ARF","lj07QlViBv","5NammnFqik","zY1GYRACuj","0BmCyNAFuw","EOE1oMojnP","cmXIX0Wr5y",
+"S77LH1v5hH","OUYuFjeskS","JXljWD6rBy","lweGyIBe8k","RBhp0h1zcH","16lHcydG8U","sx5GlK20wK","RBhp0GrDg7","aDGtSJIqXi","CqqaDGrDg7",
+"VLTy6hUTw7","FnPFBuZPqg","O3iyQhUTw7","CxVEfx3LDe","s7MxkuPX7G","dhSuHpT8wu","ru4UGYw2oU","JJs5mW3VFH","s7MxkMmKGJ","lH1ktJIqXi",
+"Dz1R3J2mQi","9XyT9yvOMI","y94nwn8pJ9","i3pydEdBKc","tAOsr7hyVv","RmDcre6e4z","gf8rIfFDrJ","Y1mC0cShY2","FjHXRtaOXK","dmoS7WPmlx",
+"LDk6fZJTXH","VBjhz0Wr5y","ru4UGYOfrY","S77LHuLtKs","NOHszfmIK1","UmaEvCxVEf","EOE1oVIlwP","OxWIHEOE1o","xReecOHaBz","tuDySksJby",
+"XflUqjfREu","Y1mC08TxD7","GXdoHAOgEe","vLsmShe9IA","OUYuFVLTy6","nnP8oWMiS3","jS1ajGSQwj","ZhwG1IKxdL","WaWsvix74r","3otm6FcWrW",
+"o8UydFGzgp","taOXKXyPZN","Q6LixQWxoT","3weIFCp3mZ","ZuDtD5nmWv","FNYIMfcJOy","J2mQi1v5hH","Twano2DREs","64s8NVprf2","dmoS7lsQGo",
+"Dz1R3lweGy","JXljWRxrsm","jSjS3SmGzv","SmGzvlkMUA","0KyfsPOUYS","8TxD7NcICA","rKDLJYf2Ec","LewvMmz8gx","GrDg7G1RhS","WaWsvM3zXL",
+"hUTw7gjUTu","55rfBtjQxs","S77LHGWqqX","SbRYy1LB1L","hUTw7mz8gx","cQOnvLewvM","PYBf43otm6","yEfy9fqypy","JKWYRuQIcz","BCxeCS2Dfu",
+"wiHrZpiJSk","ZzJHW8hJdt","YOfrYn1pmO","7X3uySs0Zu","ogLgcZhwG1","0h1b1lXFOB","5VZjSciuWz","fcJOyKZamH","QChxsEoToP","I7p2aVprf2",
+"lsQGoW3VFH","pT8wucL0aE","gdQsSRxrsm","7ku1pQbxXc","BGaQY0MR5X","pFrrlwDajX","2hEEUWmadA","JkzUn2DREs","0PktI9y4lw","5IhmGiwzGk",
+"h1zcHBGaQY","8FmFH618Di","DG4sTZJTXH","HzZT8HRxd8","7ku1plH1kt","2DREszqH0W","k85Aeb29RJ","9rlg9zz4ZU","5iGN5JXljW","FVMxoEdBKc",
+"ZUnqtBGaQY","RBhp0MK07Y","OxWIHDQimp","HP433C2Irc","4W0TlFGzgp","RxrsmzHF1q","1v5hHEdBKc","jzUqRZv7z0","9iGoT5VZjS","l83UdHfyNQ",
+"KASQ8iB08l","55rfBQssNC","brhlQFNYIM","Ul4a15IhmG","cL0aEFxX9q","Fhtgli7WMQ","ECMvUNxx9V","QClRLbrhlQ","0Wr5ymX2GE","VIlwPOUYuF",
+"rKDLJW7cTs","euZA5JXljW","cShY2pFrrl","BCxeC5Drn0","8RCUACK5W7","5drc6rhl0J","piJSkblLA9","5nmWvZuDtD","4W0TloQ87r","jtn0X6q6L9",
+"pmeCdb29RJ","n1pmOMmsIo","pvgjS7fKYU","dmoS7lm0pD","BpYhVOz8yZ","ZJTXHYOfrY","x3LDeOxWIH","DcpWBMGlTF","W7cTsi7WMQ","zbIYY5IhmG",
+"kZANmuAWyp","7lUXZ2hEEU","lXFOBdpe1v","CIShGhe9IA","kZANmRBhp0","Ul4a1piJSk","0ao3lQssNC","y94nwlCMxy","X6PinDG4sT","RpBQmQworu",
+"iKqhrJkzUn","Yh1hFksJby","zQt6QhSSvQ","EoToPGSQwj","blLA9QbxXc","4QMc9dhSuH","FLsphlpF6W","AmdQdpT8wu","RxrsmoQ87r","azIWpKsjRK",
+"QYxC0HlUbF","5ZaEzHlUbF","kB5nPM3zXL","2DREsdjsrv","NhXduk85Ae","RkQkeChuy3","BFkb8HP433","fqypy5nmWv","soy9tDQimp","GrDg70YAGH",
+"okgRi0BmCy","RxrsmqUJMd","5NammzbIYY","580YDsoy9t","FVMxopv0i7","CxVEfX6Pin","o8UydGSQwj","hYBCKYjB9t","MK07YIKxdL","MmKGJBCxeC",
+"iwzGkCdyBV","yToGWzmLYD","JKWYRzz4ZU","jS1aj5iGN5","xReecYOfrY","Yf2EctlILt","lViBv1LB1L","faHirxXTI4","uAWyp2ZHdk","JRJQBlH1kt",
+"mX2GERpBQm","AmdQdQ6Lix","oGu6xXflUq","y94nwSmGzv","nnP8ouupzk","7fsYMlH1kt","TwanoQbxXc","16lHcaFFss","S2DfuMojnP","y94nwwDajX",
+"QWxoTFwEJz","pFrrlMmsIo","MezSWCIShG","ulk41iKqhr","suY4xlViBv","iwzGkl83Ud","fcJOy2Nslm","2ZHdkF6PT2","l83UdQbxXc","kZANm8hJdt",
+"L7cGcx3LDe","fcJOyTwano","tjQxsMK07Y","Ss0Zuix74r","v1Hln5Mg9r","7ku1pSbRYy","G1RhS0ao3l","KASQ8xReec","VNCPdpmeCd","B3qemzY1GY",
+"HRxd8RBhp0","AXpwE0Wr5y","uupzk8xEKz","hSSvQ7hyVv","MmsIoRsQUq","zqH0W5nmWv","Kr8ysyToGW","FnPFBGrDg7","ni2v1FwEJz","5ZaEzVIlwP",
+"he9IAdmoS7","d85a9Yf2Ec","hE1Ql1LB1L","brhlQvOqCE","GrDg7fmIK1","pmeCdNcICA","55rfBRBhp0","G1RhSlpF6W","HlUbFi7WMQ","Qworu24ARF",
+"UmaEvsuY4x","tjQxs9XyT9","qaofNSWfou","zmLYD1j5L8","RzaZAblLA9","yluBxKr8ys","EOE1oWmadA","blLA9s4786","JJs5mF6PT2","48cHLt59lR",
+"7lUXZix74r","i3pydHP433","2DREsi3pyd","qUJMdQworu","W3VFHNhXdu","WMiS3VerEA","ZUnqti7WMQ","0BmCyyvOMI","MaJQsfmIK1","yofH3CIShG",
+"i7WMQfLNg8","euZA5yluBx","7ku1p5Namm","Chuy3uTacx","7hyVv8U2nU","8U2nU48cHL","nlaBypWiOs","DLhzMs7Mxk","BGaQYxXTI4","KASQ8ZuDtD",
+"S2Dfusx5Gl","ReKEW5drc6","e6e4zDG4sT","55rfBaDGtS","8xEKzVIlwP","pFrrl7Ow5C","Dz1R3CNHmv","lkMUAdQ586","5drc6o8Uyd","yToGWFxX9q",
+"EdBKcHfyNQ","HlUbFU3yw5","QClRLW7cTs","uQIczECMvU","HRxd8M3zXL","jeskSprNT6","bgJAzQworu","vOqCE48cHL","tl72W5ZaEz","07n1cVerEA",
+"LDk6frKDLJ","DcpWBChuy3","VIlwPTCgPp","v1Hlnx3LDe","lm0pDMkgy8","i7WMQuAWyp","dhSuHxciqp","AOgEejfREu","qaofNpFrrl","WDVWJ7X3uy",
+"4W0TlKASQ8","Chuy3lj07Q","ZuDtDXflUq","n1pmOKZamH","5NammdQ586","WmadAQ6hMC","lm0pD8FmFH","VerEAKASQ8","guMb8AgJHQ","RzaZAcL0aE",
+"rz7UtDG4sT","W7cTsguMb8","HlUbFDLhzM","zHF1qtAOsr","oVQp6DG4sT","aFFss8cVD3","MojnPIn3NS","s7MxkJkzUn","Z4I1vhUTw7","Z4I1vDQimp",
+"ciuWz9y4lw","OUYuFS77LH","d85a907n1c","BbwgApFrrl","ZzJHWlH1kt","xXTI4ZhwG1","lCMxypWiOs","okgRiSjskQ","uLtKsqQxHP","lweGyX6Pin",
+"JXljW5Mg9r","gtCA5CxVEf","zz4ZUSjskQ","2hEEUF6PT2","iKqhrCxVEf","dpe1vOxWIH","fmIK1NhXdu","jiVBPFNYIM","dhSuHfcJOy","Nxx9Vni2v1",
+"VerEARpBQm","Chuy3FxX9q","qQxHPRmDcr","Chuy3No0Qb","uoStwFFDui","8RCUAlCMxy","JRJQB7X3uy","WMiS3DLhzM","DG4sTMm8si","RACujYw2oU",
+"vkCHHlweGy","2NslmFnPFB","Q6LixVIlwP","WmadAMGlTF","qaofNIjTwP","jzUqRtjQxs","qaofNcmXIX","VBjhzAkKTk","n1pmOJkzUn","K4GS80PktI",
+"7lUXZDcpWB","t59lRQChxs","8cVD3hYBCK","FcWrWpvgjS","Ss0ZuD6rBy","3otm6JRJQB","rhl0JeuZA5","n8pJ91j5L8","zbIYYtl72W","AgJHQZv7z0",
+"P6bcgGrDg7","TXQ0ZjSjS3","QYxC0L7cGc","MaJQs5Mg9r","pvgjSNhXdu","7fsYMCp3mZ","AXpwEtl72W","Dz1R3ni2v1","HP433i7WMQ","QnJ1SbrhlQ",
+"B3qemRBhp0","16lHcuQIcz","Z4I1vK20wK","iKqhrVerEA","nFqikcShY2","VerEAfcwDa","nlaByVprf2","sx5Gl48cHL","wiHrZQbxXc","tuDySbrhlQ",
+"lpF6WBFkb8","WPmlxHlUbF","No0QbZuDtD","5ZaEzNo0Qb","qaofNFVMxo","HfyNQSs0Zu","HfyNQyluBx","taOXKZUnqt","9GXkX2DREs","UmaEvjiVBP",
+"MezSWm4bxU","618DiMmKGJ","CqqaDWaim6","Nxx9VVIlwP","5ZaEzAkKTk","IKxdL8cVD3","hE1QljfREu","fcwDagtCA5","jfREuS77LH","8hJdtsx5Gl",
+"sqVrf0MR5X","he9IA16lHc","6q6L9suY4x","prNT6O3iyQ","0ao3lSmGzv","iwzGktaOXK","B3qemtl72W","No0QbcQOnv","16lHc9eoRc","QbxXcRkQke",
+"OHaBz8hJdt","FNYIMQ6hMC","uoStwhi5X7","ni2v1tvdkD","xReecjzUqR","W7cTsl83Ud","0PktIiqv4k","0PktIQssNC","guMb8fLNg8","1v5hH29QAz",
+"Dz1R3RzaZA","b29RJcL0aE","7Ow5CcL0aE","lXFOBSWfou","yToGWEOE1o","YOfrYzbIYY","W3VFHhUTw7","HP433DcpWB","taOXKLDk6f","cL0aERkQke",
+"zz4ZULDk6f","OHaBzM3zXL","GWqqXJIqXi","tAOsr5nmWv","taOXKhE1Ql","FNYIMd7vjM","AkKTkfqypy","CdyBVhYBCK","fcJOys93Ml","FGzgpoVQp6",
+"oQ87rzqH0W","7Ow5CfcwDa","uPX7G7Ow5C","cL0aEru4UG","FnPFBbZLvS","s4786b29RJ","Yw2oUWMiS3","ZhwG1ksJby","d7vjMogLgc","dQ586HlUbF",
+"8FmFH5drc6","NAFuwiKqhr","zqH0WQ6hMC","uupzklViBv","LDk6ftaOXK","CIShGMK07Y","MojnPsoy9t","StlDJqUJMd","Q6LixKZamH","QClRLuTacx",
+"s93MlQworu","xciqpCqqaD","bZLvSlweGy","W7cTsy94nw","vLsmSzmLYD","Mkgy8CNHmv","zqH0WwDajX","Oz8yZOz8yZ","i7WMQulk41","pWiOsAOgEe",
+"JJs5mHlUbF","DQimpIBe8k","MojnPn1pmO","uTacxtvdkD","0BmCyyEfy9","Yf2EcMGlTF","AmdQdFGzgp","oGu6xoVQp6","9y4lwK4GS8","rz7Utuvf7A",
+"Chuy3Oz8yZ","RkQke8cVD3","Waim6X6Pin","azIWpqaofN","mX2GEtAOsr","qaofNlCMxy","FNYIMvOqCE","Yf2Ec16lHc","MmKGJv2eC3","JKWYRJ2mQi",
+"NOHszzY1GY","IKxdLCK5W7","ix74ryluBx","GWqqX6AFT0","jfREuguMb8","FGzgpv2eC3","VLTy6JRJQB","zmLYDStlDJ","64s8ND6rBy","G1RhS9GXkX",
+"9XyT9mz8gx","wiHrZiB08l","LDk6fMezSW","L7cGcUl4a1","kB5nPFLsph","GXdoH7hyVv","0PktIvLsmS","pFrrltl72W","Pb1pal83Ud","Nxx9VI7p2a",
+"FVMxorz7Ut","LbRTHEOE1o","yEfy9pT8wu","tjQxsMGlTF","Cp3mZblLA9","Cfgr3DLhzM","jSjS30YAGH","TCgPpzQt6Q","AXpwEMmKGJ","wiHrZwDajX",
+"JkzUn3weIF","2ZHdk0Kyfs","EOE1oKASQ8","7fKYUFcWrW","8TxD76AFT0","Q6Lixs4786","iB08lWDVWJ","zmLYDjiVBP","BCxeCIn3NS","Twano29QAz",
+"No0Qbzz4ZU","tuDySQ6hMC","t98iWpT8wu","MGlTFjfREu","tlILtpWiOs","lpF6W4QMc9","AmdQd9GXkX","HP433GSQwj","No0Qb2DREs","6AFT04dEz6",
+"xReecCfgr3","y94nwgIYvE","GrDg7W3VFH","BpYhVe6e4z","8U2nU5drc6","M3zXLVprf2","RxrsmlXFOB","MmKGJMGlTF","G1RhS5drc6","VLTy6taOXK",
+"7fsYM16lHc","8hJdtfqypy","5IhmGd85a9","QbxXcni2v1","XyPZNvLsmS","HzZT80BmCy","JkzUnXflUq","4W0TlUlU3M","FhtglQWxoT","4QMc99iGoT",
+"rhl0JcL0aE","5Nammt59lR","oGu6xThjNn","Chuy3vLsmS","bgJAzt59lR","fmIK1MmKGJ","4W0TlQClRL","GWqqXzFgtB","QWxoTHlUbF","uPX7G2ZHdk",
+"GSQwjWPmlx","FPfSEReKEW","0MR5XuPX7G","8hJdtbgJAz","IjTwPFGzgp","uLtKsGWqqX","prNT6tl72W","Yh1hFoVQp6","aez9yFwEJz","rhl0JJRJQB",
+"Vprf2Q6hMC","I7p2a07n1c","jeskSoVQp6","fcwDaWaWsv","MojnPTCgPp","16lHcCqqaD","dmoS7RzaZA","JRJQBjeskS","h1zcHRpBQm","QYxC0CIShG",
+"wDajXU3yw5","hSSvQAOgEe","MmKGJVprf2","MGlTFbrhlQ","CxVEfd7vjM","ZzJHW0MR5X","L7cGcaez9y","bZLvSQssNC","F6PT2VerEA","MmsIo2hEEU",
+"2hEEU14FLR","Waim648cHL","aL6AJgIYvE","Yf2Ecsoy9t","RACujMezSW","MmKGJiKqhr","WaWsvJXljW","WDVWJsuY4x","JKWYRfcJOy","sqVrfhi5X7",
+"W7cTs14FLR","lweGyYf2Ec","BbwgA5nmWv","tlILtzmLYD","EoToPOHaBz","CIShGZv7z0","fcJOySmGzv","TCgPpgjUTu","nnP8oKsjRK","DLhzMuoStw",
+"StlDJrKDLJ","Mkgy8ogLgc","oGu6xFNYIM","1v5hHpiJSk","WaWsv5ZaEz","pmeCdLbRTH","4W0Tl0h1b1","5Drn0ZJTXH","zmLYDsuY4x","lpF6WciuWz",
+"45cIHuJScX","VNCPdjS1aj","jzUqRiKqhr","AgJHQmX2GE","wDajXuN6r3","Q6hMCgIYvE","WDVWJPb1pa","lj07Quvf7A","6AFT0y94nw","pmeCdfmIK1",
+"In3NS2DREs","s7MxkQYxC0","IjTwPKZamH","YOfrYyofH3","8cVD3QssNC","DG4sTjS1aj","gIYvEcShY2","UmaEvJIqXi","MK07Yulk41","jSjS38xEKz",
+"fmIK1618Di","azIWpFhtgl","uoStwkZANm","guMb8BpYhV","RzaZAUl4a1","EOE1ozqH0W","fcwDa2Yz7E","FnPFBMmKGJ","bgJAzLewvM","HzZT8ZJTXH",
+"aL6AJChuy3","FPfSEtjQxs","yToGWUlU3M","FGzgpQbxXc","ReKEWAgJHQ","6AFT0W7cTs","zHF1q0Wr5y","M3zXLuvf7A","qaofNKASQ8","S2DfuRzaZA",
+"lm0pDxXTI4","atef21LB1L","zHF1qKsjRK","S2DfuO3iyQ","W3VFHuAWyp","uZPqgjeskS","uupzkoQ87r","zY1GYfqypy","pv0i7Pb1pa","vkCHH2Nslm",
+"xReec3weIF","Ul4a107n1c","mX2GEuZPqg","uJScXQChxs","VLTy6pmeCd","FwEJzWDVWJ","4QMc9HfyNQ","s4786oQ87r","OxWIHQ6Lix","zFgtBUmaEv",
+"pmeCd8RCUA","5NammlViBv","ZzJHWyEfy9","Zv7z0hUTw7","qUJMdCxVEf","VIlwPW7cTs","CdyBVbZLvS","guMb89GXkX","AgJHQDG4sT","8hJdtcmXIX",
+"h1zcHCIShG","qaofNaFFss","ZUnqtpv0i7","pvgjSGv3Fq","580YDQ6Lix","s93MlkZANm","W3VFHDLhzM","KZamHgtCA5","Nxx9VFnPFB","SbRYy2Yz7E",
+"1v5hHd7vjM","pv0i7CK5W7","AIYUuWDVWJ","16lHczbIYY","ogLgcLbRTH","580YDZuDtD","FwEJzEOE1o","pFrrl6q6L9","WreyP9eoRc","fLNg8QbxXc",
+"SjskQFhtgl","AIYUuatef2","QYxC0F6PT2","aFFsswiHrZ","K4GS8piJSk","45cIHMojnP","AXpwEWPmlx","BpYhVfcwDa","LDk6fzQt6Q","ciuWzpFrrl",
+"5Mg9ruQIcz","ZhwG1taOXK","5NammdhSuH","2TRI7t98iW","EdBKclm0pD","F6PT2zQt6Q","jeskSOUYuF","Q6Lix8cVD3","8TxD7jfREu","K4GS88RCUA",
+"BCxeCni2v1","oQ87rOHaBz","2Yz7EWaim6","d85a9qaofN","qUJMdJIqXi","4dEz69GXkX","CIShGIBe8k","2TRI7e6e4z","m4bxUG1RhS","kB5nPMK07Y",
+"7Ow5COUYuF","OxWIHQYxC0","POUYSRsQUq","jiVBP14FLR","gtCA5QssNC","Q6LixOHaBz","uZPqguLtKs","M3zXLeuZA5","piJSkXyPZN","U3yw5tvdkD",
+"JIqXibZLvS","cmXIXRkQke","FLsphQssNC","ZhwG1BFkb8","d85a9m4bxU","rhl0J0Wr5y","i3pydazIWp","n8pJ9dhSuH","ECMvUVerEA","Ta8f62ZHdk",
+"azIWpJKWYR","ThjNnlXFOB","zqH0W5VZjS","uPX7GwiHrZ","9eoRcd7vjM","DG4sTl83Ud","5NammSbRYy","WPmlxReKEW","zY1GY9iGoT","kB5nPhe9IA",
+"ciuWz5Mg9r","o8Uyd9iGoT","hi5X76q6L9","2Yz7Eiqv4k","qQxHP45cIH","uAWypY1mC0","M3zXLYh1hF","RzaZADG4sT","6AFT0K20wK","fFDrJI7p2a",
+"ru4UGdQ586","FPfSEQnJ1S","kZANm5Namm","l83UdHRxd8","qUJMdt98iW","ru4UGlXFOB","DcpWBoVQp6","gIYvE580YD","FwEJzAIYUu","7ku1pIjTwP",
+"n1pmOt59lR","Waim6ReKEW","6AFT0NhXdu","M6qcGi7WMQ","1j5L8fFDrJ","CdyBVtaOXK","BGaQYVBjhz","jSjS3Kr8ys","LDk6fhE1Ql","G1RhSUmaEv",
+"CIShGBbwgA","cL0aElViBv","b29RJtlILt","7hyVvYjB9t","yluBxgjUTu","zbIYYStlDJ","580YDgIYvE","ix74rs7Mxk","MK07YCqqaD","O3iyQK4GS8",
+"14FLRReKEW","Ul4a1FLsph","7hyVvaez9y","uQIcz5VZjS","QWxoTblLA9","FnPFByofH3","FFDuiZ4I1v","IKxdLIBe8k","7lUXZ16lHc","AkKTkaez9y",
+"7ku1pqQxHP","uZPqgFwEJz","I7p2ajeskS","K20wK8RCUA","oGu6xRBhp0","pvgjSguMb8","1j5L8MojnP","bgJAzzHF1q","0KyfsC2Irc","gtCA5uPX7G",
+"oGu6xSmGzv","okgRiXflUq","b29RJGrDg7","POUYSjfREu","VBjhz6q6L9","9y4lwbgJAz","piJSkl83Ud","pT8wu4dEz6","3otm6gf8rI","W3VFHuLtKs",
+"DQimpWmadA","bZLvSGWqqX","Pb1pauQIcz","CNHmvWPmlx","SjskQG1RhS","CxVEf5VZjS","Chuy3StlDJ","hSSvQReKEW","EOE1oZzJHW","zHF1qi7WMQ",
+"I7p2aW3VFH","yofH3IRh48","zbIYY2Nslm","suY4xfqypy","y94nwFcWrW","VBjhzS77LH","dhSuHhSSvQ","8cVD39iGoT","W3VFH6q6L9","8cVD3uTacx",
+"Twano0PktI","taOXKJIqXi","Waim6dmoS7","618Di2DREs","uoStwFxX9q","2TRI7oVQp6","dQ5860PktI","ru4UGiB08l","8TxD7XyPZN","0KyfsTXQ0Z",
+"JKWYRSs0Zu","NAFuwokgRi","hUTw7RpBQm","xciqplsQGo","XflUqUmaEv","qaofNNOHsz","fFDrJdhSuH","uLtKsC2Irc","0ao3ldmoS7","Y1mC0uJScX",
+"euZA5VLTy6","aFFss7fsYM","OxWIHFNYIM","GrDg7C2Irc","No0Qb16lHc","uAWypqQxHP","suY4xTwano","ciuWznFqik","Zv7z0NAFuw","9XyT9dpe1v",
+"CIShGTXQ0Z","taOXKRkQke","lH1ktZuDtD","ZUnqtokgRi","CdyBVStlDJ","UmaEv0PktI","CxVEfWaim6","ix74rrz7Ut","9GXkXkB5nP","5VZjSn1pmO",
+"i7WMQlsQGo","GXdoHBGaQY","F6PT2x3LDe","L7cGc45cIH","7hyVvi3pyd","FPfSE7X3uy","8FmFH7Ow5C","euZA59rlg9","POUYSKASQ8","uTacxdjsrv",
+"lkMUAEoToP","FcWrWGrDg7","nlaByEOE1o","mX2GEvLsmS","8U2nUogLgc","64s8NM6qcG","9XyT9cL0aE","FnPFBMaJQs","7hyVvjSjS3","O3iyQaez9y",
+"Rxrsmiqv4k","Ul4a1EoToP","KsjRKwDajX","VerEAzmLYD","2DREsd85a9","14FLRy94nw","HP433sx5Gl","B3qempiJSk","l83Udn8pJ9","CNHmvAIYUu",
+"faHirWaWsv","WDVWJ1LB1L","dpe1vazIWp","fcJOyydG8U","xXTI4tuDyS","jiVBPIjTwP","7ku1pMmKGJ","UlU3MQworu","BbwgAkZANm","Chuy3cQOnv",
+"Q6LixzqH0W","lkMUAVNCPd","JIqXiUlU3M","POUYSblLA9","5IhmGjtn0X","AmdQduN6r3","rhl0JYOfrY","5Drn0ZUnqt","FFDuiWMiS3","rhl0J5nmWv",
+"MK07Y3weIF","uQIczDLhzM","ECMvUStlDJ","SjskQs93Ml","d85a9ThjNn","hYBCKKr8ys","CIShGCdyBV","QWxoTlkMUA","8TxD7Ta8f6","DLhzMGrDg7",
+"5iGN52ZHdk","vOqCE2Nslm","M6qcG9eoRc","ECMvUReKEW","UmaEvFnPFB","faHirb29RJ","CIShG4QMc9","RmDcr5Namm","qQxHPdQ586","L7cGce6e4z",
+"AXpwE0ao3l","2Yz7EGv3Fq","uZPqgvLsmS","DQimpCxVEf","DLhzMCK5W7","Y1mC0K4GS8","SmGzvMK07Y","FhtglEdBKc","5nmWvdQ586","suY4xOUYuF",
+"FxX9q2TRI7","ZzJHW2TRI7","Dz1R3oQ87r","1v5hHTCgPp","ix74rBbwgA","16lHcuZPqg","1j5L89XyT9","hYBCKBpYhV","QworuaL6AJ","1LB1LQworu",
+"WreyPCK5W7","rhl0JW7cTs","OxWIHSmGzv","5Namm0YAGH","580YD55rfB","pv0i78FmFH","euZA5DQimp","S77LH7hyVv","IRh48lCMxy","hi5X7Mm8si",
+"he9IAJKWYR","ru4UGHzZT8","zQt6Q2DREs","pWiOsaFFss","n8pJ9iB08l","Dz1R3nFqik","3weIFkZANm","FNYIMQbxXc","KASQ8S77LH","MmKGJSs0Zu",
+"9y4lwcL0aE","lH1ktVjCZq","pFrrliKqhr","fmIK1fcwDa","t59lRyluBx","gf8rIlj07Q","SmGzvIRh48","GXdoHyofH3","FcWrWaFFss","VIlwPPb1pa",
+"sqVrffqypy","Dz1R3IKxdL","BCxeCfFDrJ","rhl0JjfREu","K20wKgdQsS","qaofNdmoS7","UlU3Mfqypy","kZANmFhtgl","jeskShe9IA","oQ87rGrDg7",
+"WDVWJDcpWB","aez9ylH1kt","y94nw580YD","Waim64W0Tl","LewvMrhl0J","PYBf4QYxC0","Zv7z0v2eC3","JKWYRuoStw","aL6AJL7cGc","i7WMQ5Drn0",
+"fFDrJy94nw","fFDrJjeskS","suY4xRmDcr","XflUqAmdQd","RACujIKxdL","hUTw7C2Irc","SWfouS2Dfu","lm0pD9GXkX","cShY2prNT6","Cfgr3jtn0X",
+"8RCUAblLA9","Zv7z0CxVEf","OUYuFoGu6x","W7cTsyvOMI","6AFT0Qworu","zbIYYfLNg8","zY1GYlCMxy","lpF6WO3iyQ","zQt6QReKEW","Cfgr3ECMvU",
+"K20wKgtCA5","fcJOyuN6r3","VerEA1j5L8","1j5L8GrDg7","DLhzMWaim6","RmDcryvOMI","uQIczWaim6","EdBKcn1pmO","TwanoAkKTk","QYxC0blLA9",
+"NhXduOz8yZ","8U2nUNcICA","gIYvEcmXIX","JKWYRTCgPp","n8pJ9KsjRK","hSSvQEdBKc","nnP8o7ku1p","Mm8sit98iW","Gv3FqAkKTk","AmdQd0PktI",
+"W3VFHFhtgl","RmDcrbrhlQ","Ta8f6gf8rI","v2eC3M6qcG","pv0i7lpF6W","MaJQsm4bxU","vOqCEZ4I1v","ReKEWuAWyp","fmIK1jeskS","oGu6x5drc6",
+"3weIFPOUYS","s4786tjQxs","ECMvUJXljW","Mkgy8mX2GE","Y1mC0i3pyd","gjUTuiB08l","RACujTa8f6","aDGtSvkCHH","s7MxkDG4sT","qQxHPdhSuH",
+"WDVWJuoStw","oGu6xrKDLJ","SmGzvjS1aj","d85a9Rxrsm","QworuL7cGc","GXdoHzz4ZU","lViBvI7p2a","tjQxs07n1c","K4GS88cVD3","hYBCKCxVEf",
+"RpBQmFNYIM","F6PT2Nxx9V","Mkgy8DG4sT","JKWYRy94nw","h1zcHXyPZN","MezSW1LB1L","QssNCjzUqR","Mm8siyEfy9","x3LDeqUJMd","7ku1pHfyNQ",
+"WaWsvMojnP","iqv4kFFDui","t98iWOz8yZ","uAWypi7WMQ","lCMxyOz8yZ","guMb85nmWv","FPfSEDz1R3","48cHLv8yFN","FhtglBpYhV","JIqXiv8yFN",
+"IBe8kXflUq","8U2nUVNCPd","uvf7Aru4UG","Waim6FGzgp","07n1ctjQxs","RmDcrAgJHQ","jSjS3FwEJz","8U2nUSjskQ","lViBvhUTw7","EoToPD6rBy",
+"WPmlxv1Hln","Vprf2dQ586","sqVrf0BmCy","24ARFECMvU","9rlg9rhl0J","ulk419XyT9","ksJbyYh1hF","oQ87rD6rBy","QworupT8wu","ni2v1CdyBV",
+"fFDrJ5IhmG","NhXdu64s8N","HRxd8kB5nP","ZUnqt48cHL","JXljW2DREs","TwanoazIWp","hYBCKFxX9q","uJScXSjskQ","RmDcrLDk6f","5IhmGCqqaD",
+"9y4lwtlILt","jfREuoGu6x","POUYSmX2GE","djsrvuQIcz","bgJAzaFFss","ZUnqt618Di","zY1GYRxrsm","pAhR1ZJTXH","vLsmShUTw7","v8yFN3weIF",
+"16lHcPYBf4","gdQsSdQ586","xReecs4786","OHaBzSjskQ","uQIczydG8U","BGaQYn8pJ9","he9IAzz4ZU","Z4I1vkB5nP","nlaBySs0Zu","s93MllweGy",
+"WmadAs7Mxk","6q6L9JIqXi","07n1cPb1pa","oQ87r618Di","ZJTXHx3LDe","FFDuiuQIcz","yEfy9IBe8k","EOE1oMezSW","9y4lwVprf2","RBhp0lm0pD",
+"lViBvhSSvQ","pWiOsHP433","Waim6Gv3Fq","Ta8f6ReKEW","GXdoHCdyBV","ciuWz8RCUA","uQIczx3LDe","JXljWzQt6Q","4W0Tlulk41","AkKTkokgRi",
+"brhlQWPmlx","XflUqYf2Ec","GXdoHHlUbF","0Wr5yLDk6f","iB08lx3LDe","aL6AJIKxdL","MGlTFCK5W7","8xEKz5nmWv","GSQwj7lUXZ","RACujvOqCE",
+"gIYvE3otm6","1j5L8Ta8f6","Gv3FqRsQUq","ix74rAOgEe","P6bcgYOfrY","0MR5XbZLvS","W3VFHIn3NS","2hEEU5Drn0","RxrsmaDGtS","7fsYMMmsIo",
+"0YAGHEOE1o","d85a9FjHXR","Rxrsmv1Hln","CqqaDOxWIH","2DREsx3LDe","prNT63otm6","M3zXLoVQp6","0MR5XFxX9q","AXpwEU3yw5","brhlQaez9y",
+"iqv4k618Di","HlUbFQworu","JXljWZ4I1v","fLNg8NOHsz","zbIYYPb1pa","lpF6WCNHmv","5IhmGZuDtD","zFgtBydG8U","2Nslmsx5Gl","S2DfuGXdoH",
+"lm0pDnlaBy","CK5W7I7p2a","uQIczCNHmv","hi5X7RBhp0","vLsmSs7Mxk","CK5W7RBhp0","UlU3Ma00b5","DG4sTJXljW","n1pmOjSjS3","yvOMIlH1kt",
+"euZA5i7WMQ","2DREszY1GY","Oz8yZYh1hF","8cVD3HP433","QClRLgtCA5","n1pmO2hEEU","Ta8f6blLA9","QbxXclm0pD","SmGzv4QMc9","IBe8kQbxXc",
+"o8UydqQxHP","he9IA8hJdt","iKqhrIBe8k","0MR5XVBjhz","l83Udix74r","yofH3ogLgc","3weIFzbIYY","fmIK1G1RhS","zqH0WYjB9t","7ku1pyofH3",
+"C2Irci7WMQ","MezSWECMvU","DLhzMVjCZq","kZANmVprf2","gjUTuIKxdL","S2Dfugf8rI","HzZT8hYBCK","sqVrflj07Q","faHirlm0pD","8RCUAW7cTs",
+"07n1cW7cTs","pT8wuMm8si","euZA5ZuDtD","lsQGoM3zXL","RkQkeKsjRK","XyPZNZuDtD","ni2v1ReKEW","AmdQdY1mC0","yEfy9GrDg7","iwzGkpv0i7",
+"ogLgczFgtB","KASQ8cL0aE","9eoRc618Di","cL0aEVBjhz","soy9tzmLYD","8RCUAKASQ8","PYBf4rhl0J","qaofNAOgEe","WmadAyEfy9","MGlTF618Di",
+"cL0aECfgr3","dmoS7D6rBy","2ZHdkRBhp0","7fKYUkZANm","6AFT0wDajX","Zv7z0GXdoH","CIShGzQt6Q","9eoRczbIYY","BFkb87ku1p","2DREsRxrsm",
+"48cHL0YAGH","J2mQi0BmCy","Dz1R3yluBx","azIWp7lUXZ","cShY2LDk6f","3weIFwDajX","K20wKe6e4z","HfyNQM3zXL","pmeCduN6r3","8U2nUnFqik",
+"zmLYDwDajX","FnPFBXyPZN","WaWsvNxx9V","v1HlnhUTw7","7fsYM7ku1p","StlDJqaofN","y94nwatef2","d7vjMNOHsz","YOfrYMmKGJ","BFkb8iwzGk",
+"NOHszGWqqX","WmadAnlaBy","pv0i7WmadA","ogLgc8hJdt","9GXkXqQxHP","nFqikQClRL","d85a9ReKEW","8xEKzJ2mQi","tlILtfcJOy","FNYIM45cIH",
+"CdyBVBCxeC","Twanoo8Uyd","lH1ktbZLvS","FcWrWi3pyd","pFrrlaFFss","FnPFB6AFT0","RACujjzUqR","Mkgy8tjQxs","NAFuwv2eC3","L7cGc2DREs",
+"FwEJzfcwDa","ECMvUt59lR","WMiS3U3yw5","tlILtFLsph","Q6hMC5ZaEz","0ao3lO3iyQ","Q6Lixaez9y","iKqhrVNCPd","zHF1qbZLvS","FcWrWsx5Gl",
+"KsjRKFGzgp","guMb88hJdt","K20wKzbIYY","ZUnqtWaim6","nFqikwiHrZ","nnP8oGv3Fq","y94nwtAOsr","64s8NAXpwE","14FLRWreyP","tuDySQClRL",
+"0YAGHsqVrf","tlILtNcICA","gtCA5I7p2a","8xEKz4W0Tl","MmsIojeskS","jeskSDz1R3","AgJHQm4bxU","29QAzFjHXR","2Nslm2TRI7","LDk6fQYxC0",
+"tAOsrMaJQs","S77LHK20wK","Nxx9Vrz7Ut","RkQkeNxx9V","lweGyWDVWJ","TwanodhSuH","WDVWJfcwDa","blLA9IBe8k","xReecDQimp","Ta8f6Waim6",
+"7fKYUgIYvE","FPfSEsuY4x","16lHcCIShG","euZA5uupzk","K20wKQssNC","pmeCdHRxd8","5IhmGru4UG","ru4UGzQt6Q","uPX7GLewvM","5IhmGFnPFB",
+"zHF1qL7cGc","uvf7AblLA9","qQxHPEoToP","7X3uyIBe8k","UlU3MHfyNQ","Q6LixuAWyp","fcJOyvOqCE","16lHcuoStw","CK5W7pT8wu","QClRLlsQGo",
+"QYxC0mz8gx","Oz8yZlXFOB","djsrvgjUTu","HRxd8piJSk","45cIHlkMUA","Yh1hFRpBQm","jtn0XzmLYD","hUTw7DG4sT","uQIczI7p2a","dmoS7lweGy",
+"n8pJ9d85a9","Ss0Zuv2eC3","faHirni2v1","Nxx9VrKDLJ","QnJ1SzbIYY","qaofNS77LH","hYBCKZJTXH","hYBCK7X3uy","Uvlv4xciqp","3weIFNAFuw",
+"1v5hHJkzUn","JKWYR1j5L8","t59lRCqqaD","TwanooVQp6","fqypySs0Zu","lpF6WBCxeC","pAhR1MGlTF","6AFT0PYBf4","AOgEesx5Gl","ulk41ciuWz",
+"aDGtSC2Irc","Yf2EcHfyNQ","euZA59XyT9","dQ5862TRI7","M3zXLQClRL","7X3uyRkQke","aL6AJuAWyp","HP433GWqqX","cmXIXOHaBz","9eoRcJkzUn",
+"n1pmOn8pJ9","6AFT08RCUA","Yh1hFMmsIo","LDk6fFcWrW","ru4UGVBjhz","ulk41Yw2oU","tlILtAOgEe","brhlQhYBCK","zqH0WQssNC","jS1ajoQ87r",
+"uoStwHRxd8","tjQxs7ku1p","UlU3MHRxd8","JIqXi5nmWv","iwzGkWaim6","gf8rIJ2mQi","DLhzMpv0i7","ni2v1AgJHQ","48cHLMkgy8","iB08lpT8wu",
+"0YAGHuLtKs","oGu6xUmaEv","UmaEv2hEEU","ciuWzatef2","YjB9tMm8si","9GXkXFxX9q","HlUbFhYBCK","Y1mC0vOqCE","2TRI7pvgjS","5iGN5pmeCd",
+"rhl0JUmaEv","P6bcgdpe1v","fLNg8QssNC","5iGN5jeskS","45cIHnlaBy","VBjhz55rfB","Oz8yZFnPFB","faHiriB08l","0KyfsOHaBz","zqH0WlsQGo",
+"vLsmSd85a9","Nxx9VjS1aj","tlILtCNHmv","IRh48brhlQ","QClRLGrDg7","b29RJ8TxD7","djsrvmX2GE","tAOsr7fsYM","7X3uy3otm6","t98iWi7WMQ",
+"gIYvEDG4sT","bgJAz55rfB","Cfgr3QWxoT","16lHccmXIX","6q6L9hYBCK","Y1mC0FwEJz","dQ586C2Irc","9eoRce6e4z","gjUTuCp3mZ","AmdQdIRh48",
+"Ta8f6GXdoH","AXpwEuZPqg","tjQxszQt6Q","bZLvSdQ586","zQt6QlkMUA","djsrvnlaBy","fqypyi7WMQ","lViBvFLsph","lkMUA1j5L8","nnP8o8RCUA",
+"580YDI7p2a","WmadASbRYy","Ta8f6t98iW","X6PinKr8ys","HlUbFVLTy6","Q6LixkB5nP","rz7Ut9y4lw","iqv4kVprf2","tlILtulk41","SWfouUlU3M",
+"pFrrlFVMxo","uLtKsyvOMI","aL6AJVIlwP","VjCZqqaofN","aez9yKZamH","cL0aEfLNg8","0KyfsaL6AJ","7X3uyVLTy6","jSjS3WmadA","1LB1LHlUbF",
+"5Drn0t59lR","Ss0ZuHfyNQ","pv0i7Dz1R3","3otm6K20wK","5Drn0C2Irc","brhlQjzUqR","8cVD3AkKTk","ZUnqthi5X7","y94nwqQxHP","GSQwjHP433",
+"pv0i7ZuDtD","LDk6fYjB9t","djsrvZuDtD","IBe8k2ZHdk","oVQp67ku1p","SjskQ9GXkX","HzZT8UmaEv","0PktIHP433","sx5GlRmDcr","prNT6lj07Q",
+"tjQxsQnJ1S","FNYIMQ6Lix","zqH0Wru4UG","hSSvQ9eoRc","oQ87rNo0Qb","uoStwjSjS3","mz8gxIBe8k","5IhmG5Drn0","jS1aj14FLR","Cp3mZF6PT2",
+"24ARFGSQwj","0PktIMmKGJ","kZANmIRh48","VNCPdSbRYy","ni2v1ZuDtD","qaofNAXpwE","Oz8yZ9XyT9","v8yFNKASQ8","soy9tOUqFM","zY1GYfcJOy",
+"v1HlnWaim6","a00b5gf8rI","FhtglDLhzM","QClRLS2Dfu","iKqhr0h1b1","618Di2ZHdk","0KyfsD6rBy","uupzkjSjS3","aFFssPb1pa","vOqCEb29RJ",
+"FwEJzxReec","9GXkXpT8wu","6AFT0fmIK1","rz7UtcL0aE","HfyNQ9eoRc","v1Hln0Kyfs","dmoS7s4786","e6e4zM3zXL","vLsmShSSvQ","Yw2oUIjTwP",
+"uLtKsprNT6","8U2nUWaWsv","JXljWsqVrf","brhlQYw2oU","mX2GEHfyNQ","mz8gxWPmlx","b29RJfqypy","QbxXc7lUXZ","fcJOyiqv4k","0MR5Xv2eC3",
+"uN6r3POUYS","v8yFNMojnP","s47865ZaEz","lkMUA64s8N","hUTw78cVD3","X6Pin618Di","HfyNQs4786","prNT6t59lR","0YAGHU3yw5","4QMc9k85Ae",
+"v2eC3LDk6f","YOfrYeuZA5","2hEEUvLsmS","LewvMS2Dfu","J2mQi1LB1L","iqv4ks4786","BCxeC7ku1p","iKqhrpAhR1","NOHszd85a9","YOfrYQChxs",
+"NhXduRmDcr","kB5nPWmadA","K20wKcmXIX","FVMxoWPmlx","sx5GldhSuH","zHF1qMm8si","I7p2a55rfB","sqVrfpv0i7","Mkgy87hyVv","CxVEf0YAGH",
+"FnPFBh1zcH","8hJdtfaHir","ydG8UDcpWB","nlaBySmGzv","kZANmI7p2a","s4786lViBv","tAOsryvOMI","FNYIMCxVEf","gf8rIQChxs","IBe8klH1kt",
+"lsQGogdQsS","Dz1R3KZamH","29QAzTa8f6","BbwgAS2Dfu","Yf2Ec8RCUA","QbxXcsqVrf","HP433aFFss","FGzgpi3pyd","piJSkZUnqt","AIYUuHfyNQ",
+"TXQ0ZrKDLJ","jSjS3qQxHP","s93Ml580YD","OxWIH8hJdt","9y4lwwDajX","MojnPCNHmv","tjQxsjS1aj","OUYuFsqVrf","YjB9tMezSW","tuDySn8pJ9",
+"pv0i7HfyNQ","okgRijzUqR","BpYhVpFrrl","TXQ0Z1j5L8","Z4I1vChuy3","uoStwRsQUq","SmGzv3weIF","Kr8ysulk41","QYxC0QClRL","hSSvQVBjhz",
+"HfyNQtaOXK","fLNg8qUJMd","14FLRvkCHH","pWiOsK20wK","jfREudhSuH","14FLRJkzUn","fmIK1i3pyd","ru4UGgIYvE","2DREslpF6W","7hyVvrKDLJ",
+"TwanouJScX","zmLYDTXQ0Z","dpe1vyToGW","WmadA7X3uy","dmoS7jiVBP","Waim6h1zcH","fFDrJC2Irc","P6bcgtAOsr","XyPZNVIlwP","5VZjS3weIF",
+"tvdkDs4786","IBe8ksuY4x","hYBCK3weIF","pAhR12hEEU","pFrrliqv4k","FxX9q0Kyfs","W3VFHKsjRK","0KyfsqaofN","i7WMQM3zXL","4W0TlgIYvE",
+"dpe1vWaWsv","QClRLECMvU","yEfy9RzaZA","tlILtSmGzv","Yf2EcVprf2","lH1kt1j5L8","WPmlxKsjRK","L7cGcTCgPp","oGu6xVjCZq","ZUnqtFLsph",
+"ciuWzFNYIM","ZuDtDvkCHH","t98iWCK5W7","aDGtS7fsYM","BbwgAl83Ud","xXTI4W3VFH","Vprf2JXljW","VIlwPrKDLJ","OHaBzAIYUu","aFFssZv7z0",
+"rhl0Juvf7A","DQimpvkCHH","C2IrcoVQp6","iKqhriKqhr","VBjhzqQxHP","k85AeyToGW","0Wr5y3otm6","uupzklkMUA","zY1GY5Mg9r","sx5Glatef2",
+"cShY2qaofN","8FmFH2Nslm","xXTI4WreyP","OUYuFWaim6","Ul4a1uoStw","OHaBzFwEJz","S2Dfuxciqp","3otm6OUYuF","UlU3MyvOMI","VLTy65iGN5",
+"gdQsSmz8gx","14FLRZJTXH","zqH0Wn1pmO","QssNC9iGoT","AOgEejzUqR","bgJAzKZamH","Chuy3RzaZA","I7p2a7fsYM","QYxC0ECMvU","x3LDeuQIcz",
+"0Kyfsm4bxU","WMiS3ZzJHW","CqqaDs4786","LewvMHzZT8","n8pJ9MK07Y","5NammChuy3","n1pmOMmKGJ","C2IrcuZPqg","v2eC3MmKGJ","wDajXiwzGk",
+"AmdQdtaOXK","7X3uyKsjRK","GSQwjJRJQB","lXFOBlViBv","KZamH2TRI7","FGzgpNo0Qb","AkKTkbgJAz","aDGtSlH1kt","cShY2StlDJ","QYxC0yToGW",
+"RkQkeFhtgl","QssNCWPmlx","VNCPdkZANm","StlDJdjsrv","uZPqg5iGN5","zmLYDMkgy8","5IhmGNcICA","7ku1pNhXdu","MGlTFDQimp","cL0aEbZLvS",
+"AIYUuZzJHW","s93MlIKxdL","G1RhS9eoRc","pv0i7RzaZA","48cHLcQOnv","ThjNn8U2nU","7ku1pL7cGc","K4GS8tAOsr","GrDg7MmKGJ","4QMc9ksJby",
+"zqH0Wsoy9t","OUYuFECMvU","ydG8UMezSW","Ta8f6RmDcr","B3qemAkKTk","7Ow5CRpBQm","uoStw0YAGH","DLhzMDQimp","KsjRKMojnP","VNCPdru4UG",
+"0PktIThjNn","iKqhrPYBf4","jSjS39iGoT","6q6L9ix74r","FjHXRoGu6x","FGzgpCNHmv","atef2OUqFM","yToGWFwEJz","55rfBiB08l","Y1mC0JRJQB",
+"vLsmSZ4I1v","wDajXcL0aE","X6PinpiJSk","vOqCE14FLR","FjHXRhE1Ql","9eoRc8U2nU","ksJbyFwEJz","618DiyToGW","cL0aEzQt6Q","Vprf2xReec",
+"7hyVvZv7z0","EoToPEOE1o","FjHXR1v5hH","a00b5jzUqR","0YAGHNOHsz","FxX9qStlDJ","9rlg9FxX9q","AIYUuMezSW","TXQ0ZFFDui","G1RhSPb1pa",
+"pFrrl9iGoT","Mkgy8M3zXL","pvgjScmXIX","RpBQmXflUq","QworuQnJ1S","Waim6aL6AJ","FPfSElH1kt","SjskQC2Irc","uJScXNhXdu","2ZHdkyluBx",
+"i3pydKASQ8","zbIYYmX2GE","zY1GYyToGW","h1zcHFxX9q","AgJHQaL6AJ","k85AeRACuj","x3LDeX6Pin","WMiS3Kr8ys","Ss0ZuQssNC","AmdQdgdQsS",
+"45cIHsuY4x","X6Pinaez9y","soy9tUl4a1","IKxdLRxrsm","9rlg98FmFH","HRxd82ZHdk","NhXduVIlwP","pFrrlDG4sT","9GXkX580YD","zQt6QU3yw5",
+"Q6hMCxXTI4","Q6LixAgJHQ","MmsIoKZamH","7fKYUpT8wu","cQOnvZzJHW","64s8NRpBQm","0h1b1uupzk","djsrvHzZT8","1v5hHXyPZN","iqv4k5nmWv",
+"WPmlxFcWrW","AIYUuulk41","SjskQPb1pa","jeskS3weIF","pmeCdzHF1q","5IhmGn8pJ9","blLA9tjQxs","pT8wu5IhmG","ciuWzUl4a1","3otm69iGoT",
+"zz4ZUk85Ae","rKDLJbgJAz","KZamHRBhp0","hE1QlHRxd8","v8yFNJRJQB","zz4ZUQYxC0","i7WMQZ4I1v","7fKYUiqv4k","0YAGHy94nw","fcwDas7Mxk",
+"mX2GE8FmFH","yToGWuoStw","tAOsrlViBv","k85AecL0aE","xciqpOz8yZ","aez9yokgRi","yluBxfmIK1","HlUbFd7vjM","RBhp064s8N","HfyNQQ6hMC",
+"nFqik8TxD7","atef2CNHmv","lViBvS77LH","NAFuw4W0Tl","7X3uyhYBCK","t59lRv1Hln","KASQ8m4bxU","VIlwPDG4sT","he9IAUmaEv","gf8rIYf2Ec",
+"uAWypQYxC0","S77LHRmDcr","7ku1pYw2oU","RACujNo0Qb","IBe8klCMxy","UlU3MtlILt","qQxHPnlaBy","OUqFMQbxXc","AgJHQ48cHL","GWqqXfcwDa",
+"5nmWvFjHXR","ZhwG164s8N","wDajXSWfou","5nmWvd85a9","bZLvSSmGzv","suY4x2hEEU","CqqaDM3zXL","Nxx9Vsx5Gl","ni2v1LDk6f","I7p2aChuy3",
+"fcJOyRACuj","QssNCI7p2a","yofH30YAGH","v8yFNWDVWJ","fmIK1nnP8o","zY1GYzFgtB","zz4ZU2hEEU","prNT6QbxXc","Cfgr3nlaBy","0h1b1d85a9",
+"lViBvLbRTH","lXFOBZhwG1","lpF6WCdyBV","SmGzvXflUq","iqv4kReKEW","Chuy3aFFss","WaWsvuupzk","tjQxs2Nslm","o8UyduLtKs","IBe8kQWxoT",
+"B3qemciuWz","7fsYMuLtKs","dhSuHSWfou","7ku1pXflUq","AmdQdfmIK1","CxVEf0Wr5y","UlU3MJkzUn","uoStwwiHrZ","lViBvDz1R3","UlU3MD6rBy",
+"ksJbyIBe8k","2hEEUpWiOs","lj07QRzaZA","xReecgjUTu","ni2v1iwzGk","YjB9tkB5nP","RpBQm8FmFH","8cVD3Cfgr3","8cVD34dEz6","SmGzvRmDcr",
+"mX2GE6q6L9","Q6Lix45cIH","djsrvMaJQs","UmaEvOUqFM","0PktIcmXIX","fmIK1POUYS","yToGW0Kyfs","pmeCdTXQ0Z","Mkgy8IRh48","soy9tPOUYS",
+"Yh1hFBpYhV","xXTI424ARF","SjskQzQt6Q","POUYSMmsIo","ZuDtDCdyBV","xciqpRBhp0","6AFT05Drn0","3otm6yofH3","FPfSEfmIK1","D6rBymz8gx",
+"dmoS7cL0aE","QnJ1SJ2mQi","2Yz7EyEfy9","MmKGJuoStw","618DilXFOB","Gv3Fq1j5L8","FFDuini2v1","NOHszGXdoH","oVQp69iGoT","qQxHPtl72W",
+"Zv7z0HlUbF","DcpWBRACuj","qUJMd07n1c","MojnP07n1c","hi5X7JRJQB","uN6r3SbRYy","uAWypgIYvE","l83Ud2Nslm","uQIczAOgEe","yvOMIjzUqR",
+"lpF6W1v5hH","faHirpFrrl","CqqaD9y4lw","O3iyQHzZT8","zmLYD9iGoT","OHaBzWaim6","D6rByOz8yZ","v2eC3K20wK","jSjS37Ow5C","BbwgAZhwG1",
+"S77LHiB08l","ksJbyF6PT2","cL0aETa8f6","zmLYDguMb8","JJs5mjiVBP","LDk6f55rfB","BGaQYRsQUq","HP433In3NS","WDVWJRzaZA","0h1b1sx5Gl",
+"8xEKzU3yw5","y94nwAmdQd","0YAGHTCgPp","XyPZNP6bcg","XyPZNLewvM","piJSk7fsYM","AmdQdzqH0W","IKxdLQYxC0","ru4UGyvOMI","YOfrY64s8N",
+"7fKYUFGzgp","lsQGo9XyT9","cQOnvDLhzM","uZPqg7Ow5C","HP433I7p2a","Z4I1v0ao3l","Q6LixD6rBy","hSSvQxciqp","uPX7G7fsYM","tvdkDhE1Ql",
+"BFkb87X3uy","FLsphgjUTu","hi5X7Twano","uupzkIKxdL","jeskSmX2GE","n8pJ9CK5W7","4W0TlCxVEf","FFDuihYBCK","dpe1vYf2Ec","M3zXLIKxdL",
+"WMiS3hi5X7","iqv4kJKWYR","LDk6f3weIF","16lHcEOE1o","LDk6fzz4ZU","0BmCynFqik","64s8Nhe9IA","kZANmjtn0X","RACuj64s8N","Vprf2F6PT2",
+"jiVBP7lUXZ","pv0i7G1RhS","jS1ajlViBv","FnPFBaez9y","9eoRctvdkD","MGlTFlpF6W","dhSuHazIWp","NcICAOUYuF","JIqXipmeCd","9GXkXGWqqX",
+"jtn0X4QMc9","qUJMdksJby","s7MxkpT8wu","MmKGJ8xEKz","1v5hHrKDLJ","OUqFMv2eC3","uupzkyvOMI","s7Mxkk85Ae","FnPFBbrhlQ","Mkgy8M6qcG",
+"AXpwEjtn0X","MojnPNOHsz","fcJOyKr8ys","uPX7G24ARF","fFDrJdmoS7","POUYSKr8ys","5Drn0Kr8ys","Kr8ysRpBQm","FFDuiKr8ys","djsrvoQ87r",
+"CIShGZ4I1v","NAFuw0h1b1","QssNCS77LH","QWxoTkZANm","e6e4zbrhlQ","cmXIX8TxD7","uZPqg24ARF","Yf2EcQ6Lix","Vprf264s8N","RBhp0RBhp0",
+"vOqCEfmIK1","nnP8oWPmlx","RzaZAxciqp","29QAztuDyS","cQOnvv8yFN","F6PT2tAOsr","azIWplCMxy","8TxD7WreyP","n1pmOMaJQs","lH1kth1zcH",
+"Yw2oUZzJHW","d7vjM9y4lw","yofH3gdQsS","azIWpsx5Gl","yofH38FmFH","0YAGHDz1R3","iwzGkn1pmO","nFqikjeskS","HfyNQJJs5m","blLA9WMiS3",
+"OHaBzjSjS3","Oz8yZnlaBy","yvOMIwDajX","MmKGJrz7Ut","UlU3MZv7z0","F6PT2uoStw","OxWIHblLA9","cQOnvYf2Ec","fFDrJzmLYD","29QAz29QAz",
+"lj07QOUYuF","MmsIoBGaQY","b29RJqQxHP","48cHLAkKTk","ECMvUCIShG","tuDySMGlTF","6AFT0ydG8U","DQimpFnPFB","LDk6fcQOnv","YOfrYFPfSE",
+"KsjRKdQ586","5IhmG4dEz6","sqVrfcShY2","RsQUqyEfy9","pFrrlvLsmS","IKxdLBFkb8","h1zcHF6PT2","v1HlnJKWYR","RpBQmy94nw","hi5X7uAWyp",
+"AgJHQqaofN","s7Mxk1v5hH","ECMvURkQke","zz4ZUAkKTk","K20wKIRh48","2Yz7E1j5L8","lkMUADQimp","lViBv4QMc9","mz8gxd85a9","zHF1q7fsYM",
+"9rlg9tjQxs","azIWp2DREs","RkQkejeskS","B3qemqaofN","VLTy6Oz8yZ","EoToPa00b5","iB08lpmeCd","KsjRKlweGy","yEfy9Kr8ys","b29RJMm8si",
+"AgJHQpWiOs","5Mg9rPOUYS","LDk6fTwano","NhXdu0Wr5y","YOfrYb29RJ","RmDcreuZA5","qUJMdDcpWB","5nmWvQ6Lix","MmKGJNxx9V","aDGtSStlDJ",
+"C2IrcIn3NS","5Mg9rVNCPd","KASQ8LDk6f","zmLYDfmIK1","ciuWzFVMxo","uLtKsx3LDe","IjTwPWaim6","0ao3liqv4k","RBhp0CxVEf","lkMUAlm0pD",
+"6q6L9JKWYR","YOfrYcmXIX","QChxsM6qcG","cShY21LB1L","NcICA55rfB","SWfoue6e4z","L7cGcyToGW","piJSkZv7z0","t59lRzbIYY","JIqXiGrDg7",
+"FPfSETa8f6","l83UdEdBKc","QClRLhe9IA","yluBx64s8N","DG4sTOxWIH","he9IAyvOMI","Ss0ZutlILt","MezSWuPX7G","0Wr5yt59lR","tlILteuZA5",
+"5Drn0i3pyd","xReecFLsph","FxX9qPYBf4","DQimpWDVWJ","iB08lL7cGc","vLsmStjQxs","7ku1pOxWIH","Kr8ysLbRTH","VerEAcShY2","CIShGCfgr3",
+"AOgEeK4GS8","B3qemsoy9t","d85a9jtn0X","s93Mldjsrv","v2eC3SjskQ","9iGoTyToGW","NOHsz8U2nU","C2IrcZUnqt","jS1ajfcwDa","8hJdtKASQ8",
+"0h1b10YAGH","i3pydvLsmS","B3qemhe9IA","D6rByVerEA","JKWYREoToP","DLhzMy94nw","qaofNI7p2a","VjCZqHzZT8","RkQkeVjCZq","SmGzvStlDJ",
+"9XyT9OHaBz","guMb85VZjS","dmoS7DLhzM","UlU3MWMiS3","brhlQuLtKs","zQt6QpiJSk","uJScXwDajX","0ao3lCqqaD","zY1GYlH1kt","oVQp6qQxHP",
+"5Mg9rtlILt","ZUnqti3pyd","5iGN5dpe1v","0BmCyb29RJ","yofH3ZJTXH","fFDrJZUnqt","1v5hHEOE1o","xciqplpF6W","FxX9qFNYIM","atef20ao3l",
+"ECMvU9XyT9","FxX9q1j5L8","AmdQdFPfSE","Chuy3lm0pD","DQimpEOE1o","LbRTHhE1Ql","64s8NWreyP","uTacxrhl0J","hSSvQ5nmWv","ciuWz64s8N",
+"Z4I1vVIlwP","hYBCKU3yw5","Mm8sizqH0W","zmLYDiKqhr","yluBx4W0Tl","Waim6okgRi","oVQp6KZamH","qQxHPB3qem","zmLYDAkKTk","zmLYD2Yz7E",
+"gjUTudQ586","VIlwPAmdQd","pmeCd24ARF","uPX7GIjTwP","suY4xd85a9","TCgPp9GXkX","FGzgppFrrl","a00b5FnPFB","gjUTuuZPqg","NcICA8cVD3",
+"QbxXcGSQwj","2hEEUThjNn","Nxx9V5drc6","L7cGcfaHir","FGzgps93Ml","lpF6WkZANm","nFqikFcWrW","W3VFHaez9y","taOXKa00b5","lpF6WECMvU",
+"K20wKaDGtS","Z4I1v8cVD3","BpYhVZzJHW","IjTwPs7Mxk","29QAzRmDcr","S2Dfulj07Q","2Nslm4QMc9","8FmFHWaim6","9y4lwEOE1o","7lUXZxXTI4",
+"gf8rI0BmCy","HzZT8i7WMQ","suY4x64s8N","MGlTFnFqik","WMiS3tvdkD","1v5hHW3VFH","RxrsmZUnqt","9y4lw9y4lw","atef2uJScX","kB5nPOUYuF",
+"pAhR1lsQGo","fFDrJEOE1o","AIYUu7ku1p","D6rBycL0aE","faHirB3qem","nnP8oiqv4k","8hJdtaez9y","Twanoru4UG","blLA95Namm","8TxD7JRJQB",
+"lm0pDOxWIH","zmLYDm4bxU","YOfrY2Nslm","8hJdtjS1aj","D6rByqUJMd","QbxXctAOsr","7ku1pQnJ1S","qUJMdRACuj","8U2nUCxVEf","ni2v1pvgjS",
+"cmXIXcmXIX","NAFuwvkCHH","kB5nP8FmFH","gtCA5uZPqg","QbxXcJkzUn","iwzGk4W0Tl","3weIF5ZaEz","Mkgy84QMc9","TCgPpVLTy6","AXpwEX6Pin",
+"wDajX8hJdt","618DiW3VFH","Yf2Ecrhl0J","G1RhS2ZHdk","8FmFHydG8U","i3pydOxWIH","Yf2EcVLTy6","FhtglM3zXL","vLsmS5drc6","pT8wuk85Ae",
+"POUYSyEfy9","3otm6RzaZA","S77LHkZANm","RkQkeblLA9","JIqXiQYxC0","jzUqRKsjRK","2DREs5drc6","gjUTuYh1hF","LDk6fvOqCE","UlU3M64s8N",
+"MGlTFU3yw5","piJSkpmeCd","U3yw5iKqhr","fLNg8OHaBz","DG4sTydG8U","FGzgp1j5L8","FcWrWZJTXH","8RCUAK4GS8","SjskQuN6r3","S77LHdQ586",
+"ydG8UFjHXR","VjCZqzY1GY","QssNC618Di","J2mQieuZA5","NAFuwiB08l","In3NSDcpWB","zHF1q1LB1L","i3pydfcJOy","07n1clH1kt","pvgjSC2Irc",
+"aFFss16lHc","pmeCdyofH3","5drc6GWqqX","NcICAtvdkD","ydG8UnlaBy","jSjS3brhlQ","lsQGo5VZjS","lH1ktCK5W7","zbIYY4W0Tl","n8pJ9WmadA",
+"atef2Fhtgl","vkCHHJXljW","lViBvnFqik","iKqhrwDajX","580YDe6e4z","okgRiK4GS8","v1HlnFGzgp","hUTw7ZUnqt","CIShGxReec","SWfouoQ87r",
+"aFFssSjskQ","jiVBPWDVWJ","nFqik9y4lw","CK5W7X6Pin","Zv7z0oQ87r","LDk6fUmaEv","HRxd8lj07Q","IBe8kzFgtB","o8UydQbxXc","07n1ctlILt",
+"lweGyS77LH","RsQUqSbRYy","7lUXZ2DREs","lj07Qlm0pD","qQxHP4QMc9","b29RJgIYvE","guMb80h1b1","cShY216lHc","MK07YVerEA","O3iyQ7X3uy",
+"hYBCKs4786","3weIFS2Dfu","ZJTXHgtCA5","6q6L91LB1L","zHF1qLewvM","LewvM3weIF","qQxHPpWiOs","Vprf2Waim6","8cVD3atef2","WDVWJ0Wr5y",
+"jeskS2Yz7E","Ss0Zu3otm6","fcJOydQ586","BFkb8tvdkD","iKqhrHfyNQ","lsQGo0h1b1","SmGzvGrDg7","d85a9x3LDe","Nxx9V24ARF","14FLRRsQUq",
+"qUJMdciuWz","BFkb8VLTy6","F6PT2RzaZA","s93MlZv7z0","GXdoHJ2mQi","gdQsSFxX9q","lsQGoQClRL","QbxXchSSvQ","dpe1v5Mg9r","QbxXcgf8rI",
+"7fKYU7fsYM","lH1kto8Uyd","7hyVvLbRTH","In3NSpiJSk","MezSW5IhmG","Z4I1vcShY2","8xEKzhi5X7","Mm8sioQ87r","7fsYMs4786","JJs5mzY1GY",
+"gIYvEs93Ml","e6e4zQ6hMC","pAhR1k85Ae","MGlTF5nmWv","ZzJHWVjCZq","QYxC0uvf7A","G1RhSWreyP","h1zcHZhwG1","GWqqXNo0Qb","cmXIXYjB9t",
+"5ZaEzlpF6W","d85a9uJScX","i7WMQ0Wr5y","wiHrZrKDLJ","XflUqUlU3M","FwEJzVerEA","RzaZA0PktI","ZuDtDmX2GE","wDajXe6e4z","J2mQiv1Hln",
+"oQ87rCNHmv","MaJQsF6PT2","JKWYRFwEJz","kZANmFnPFB","xciqpQworu","GSQwj24ARF","8cVD3FNYIM","D6rByJXljW","jfREuhUTw7","n1pmOmz8gx",
+"G1RhSWmadA","RpBQmK20wK","0Wr5yVjCZq","IBe8kpT8wu","K20wKCNHmv","MmsIoyvOMI","iwzGkJ2mQi","pv0i75Mg9r","tjQxslm0pD","JXljWulk41",
+"dQ586h1zcH","pvgjS2TRI7","2NslmfcwDa","WPmlx0Kyfs","Uvlv4cQOnv","QClRLQnJ1S","I7p2av1Hln","jtn0XBpYhV","B3qemAOgEe","prNT67hyVv",
+"JIqXiVerEA","jtn0XVerEA","tvdkDiB08l","uQIczyofH3","7ku1pv8yFN","blLA9Q6hMC","tuDySBpYhV","xciqpxciqp","uoStwIRh48","OUqFM2hEEU",
+"Waim6WDVWJ","WDVWJs7Mxk","jfREu2hEEU","C2IrcZuDtD","U3yw5ThjNn","s93MloVQp6","AmdQdStlDJ","dmoS7M3zXL","uLtKs8FmFH","KsjRKGv3Fq",
+"aFFssdjsrv","ZuDtDlsQGo","nFqikhi5X7","gdQsSF6PT2","zqH0WCxVEf","Uvlv4suY4x","5IhmGnlaBy","ydG8UpFrrl","POUYSx3LDe","tuDySIKxdL",
+"BbwgAB3qem","ulk41YjB9t","Cp3mZECMvU","RsQUquQIcz","WMiS3CIShG","WPmlxTwano","jfREuNAFuw","8RCUAtjQxs","aL6AJ8hJdt","J2mQiZ4I1v",
+"FGzgpTa8f6","vLsmSKZamH","HlUbFWaim6","HRxd8bgJAz","fFDrJqQxHP","soy9tGXdoH","l83UdtAOsr","WPmlxb29RJ","JKWYR3weIF","rz7Utn1pmO",
+"In3NSIKxdL","lViBvReKEW","guMb8n1pmO","UlU3MuPX7G","jSjS3pvgjS","sx5Gldjsrv","GWqqXIBe8k","uoStwb29RJ","e6e4z7fKYU","M6qcGtaOXK",
+"9rlg9WreyP","lCMxygdQsS","taOXK3otm6","he9IAl83Ud","Pb1pam4bxU","Gv3FqcQOnv","ZJTXHYw2oU","Ul4a13otm6","GSQwjRpBQm","SmGzvMezSW",
+"FhtglQssNC","7fsYMNcICA","FcWrWuQIcz","0BmCyl83Ud","9iGoTCdyBV","fcwDaix74r","lH1kt07n1c","s7Mxk2hEEU","Ss0ZuX6Pin","FwEJzKr8ys",
+"tlILtSbRYy","fqypy5IhmG","i7WMQ7lUXZ","2Yz7EguMb8","1LB1Lhi5X7","KsjRK4W0Tl","16lHcJIqXi","zHF1qlH1kt","0Wr5yCqqaD","uupzkpAhR1",
+"W3VFHChuy3","fqypyLewvM","yofH3QChxs","7fKYUfLNg8","8cVD3DG4sT","JKWYR48cHL","WDVWJTwano","7fKYUpAhR1","MaJQs0h1b1","7lUXZKr8ys",
+"GWqqXlkMUA","5drc6F6PT2","prNT60Wr5y","hE1QlzmLYD","IRh48hUTw7","0h1b1Mkgy8","S2DfuThjNn","Ta8f6wiHrZ","lCMxyWMiS3","hSSvQFjHXR",
+"lXFOBi3pyd","dQ5865Namm","zbIYY45cIH","zHF1qyEfy9","Dz1R3CxVEf","piJSkTwano","LbRTHwDajX","9iGoTWDVWJ","QworuZJTXH","hYBCKtaOXK",
+"uPX7GdhSuH","yToGWGXdoH","BpYhVpv0i7","LewvMe6e4z","v2eC39GXkX","i7WMQx3LDe","NcICA14FLR","h1zcHI7p2a","s93MlIjTwP","uPX7Grhl0J",
+"zQt6QjeskS","0h1b1MK07Y","5IhmGIBe8k","QWxoTVBjhz","MmsIoFFDui","2Nslm8RCUA","4W0TlIKxdL","lXFOBhUTw7","VerEAVprf2","ksJbyjfREu",
+"J2mQiWaWsv","BCxeCJKWYR","tAOsrdhSuH","jfREuL7cGc","4QMc907n1c","WPmlxBCxeC","2DREsFVMxo","LDk6flCMxy","G1RhS8U2nU","gjUTuX6Pin",
+"Cfgr3SWfou","piJSkLDk6f","lkMUAWreyP","piJSk5iGN5","hUTw7zHF1q","zmLYDv2eC3","pvgjSM3zXL","uJScXDG4sT","P6bcg9iGoT","0BmCywDajX",
+"DG4sTYjB9t","a00b5pmeCd","5Drn0HfyNQ","Waim65VZjS","8TxD75Drn0","X6PinCK5W7","jfREuDQimp","IjTwP9GXkX","lm0pDW3VFH","9y4lwlH1kt",
+"DG4sTWreyP","L7cGcFNYIM","Oz8yZdhSuH","hYBCKpvgjS","Zv7z0YOfrY","CIShGsoy9t","NcICAa00b5","OUqFMMmsIo","JKWYRLewvM","Ul4a1hE1Ql",
+"EOE1onnP8o","Yw2oUlm0pD","S77LHSjskQ","M3zXLlpF6W","X6PinokgRi","618Di5nmWv","tlILtcL0aE","Cfgr3C2Irc","MGlTFuN6r3","CxVEfGSQwj",
+"5Mg9rJkzUn","MezSWVjCZq","jfREuJ2mQi","tvdkDyluBx","t59lRCp3mZ","zz4ZUjeskS","TwanoFjHXR","VIlwPBFkb8","hSSvQRpBQm","YjB9txReec",
+"0Wr5yEoToP","SWfouwDajX","uoStwMm8si","MezSWlCMxy","RzaZA2Nslm","CdyBVReKEW","2hEEUpmeCd","fcJOyhUTw7","sqVrfJkzUn","zqH0WhUTw7",
+"5VZjSIRh48","ECMvUI7p2a","S77LH9GXkX","3otm6l83Ud","dQ586oGu6x","oVQp6pT8wu","oGu6xb29RJ","KASQ8VerEA","dQ586Ss0Zu","QYxC0IjTwP",
+"Yw2oU4dEz6","Yw2oUv1Hln","5NammRxrsm","WaWsvwDajX","FFDuiS77LH","kZANmlXFOB","hi5X7yluBx","Pb1paogLgc","CK5W7aDGtS","LDk6fnFqik",
+"NAFuwYf2Ec","O3iyQ5iGN5","lpF6WZhwG1","cShY2hUTw7","zbIYYIKxdL","OxWIHn1pmO","Fhtglk85Ae","M6qcGuPX7G","0ao3l64s8N","lj07QMaJQs",
+"4W0TlwDajX","Cfgr3ZUnqt","JKWYRpv0i7","C2IrcwDajX","l83UdAkKTk","4W0TlbrhlQ","nFqikK4GS8","faHirZzJHW","AXpwEVjCZq","kB5nPEOE1o",
+"wDajXQWxoT","guMb8b29RJ","Q6LixS77LH","AOgEeaez9y","2Nslmgf8rI","14FLRdhSuH","1j5L8zQt6Q","lj07QHfyNQ","ulk41618Di","QworuuoStw",
+"lj07QzQt6Q","brhlQ2hEEU","YjB9tmz8gx","ECMvU7X3uy","kB5nPdmoS7","BFkb8BbwgA","sqVrfOz8yZ","1v5hHpFrrl","K4GS848cHL","LbRTH7ku1p",
+"LewvMlH1kt","FcWrW4dEz6","DQimpSbRYy","QClRL2ZHdk","16lHc5nmWv","MGlTFgf8rI","Mkgy8DQimp","WmadA8hJdt","BFkb8d85a9","LbRTHMezSW",
+"NhXdujiVBP","FnPFBru4UG","Q6Lix5drc6","v2eC3ECMvU","vOqCE5Namm","dmoS7iB08l","zHF1qlm0pD","cL0aEM6qcG","CIShGblLA9","xXTI4Waim6",
+"IjTwP9XyT9","7hyVvS2Dfu","cShY21v5hH","5Drn09GXkX","L7cGcHfyNQ","yluBxReKEW","5IhmGtvdkD","FPfSEa00b5","RkQkeX6Pin","TCgPpqUJMd",
+"BCxeCEOE1o","tlILtzbIYY","rKDLJ24ARF","QnJ1S4dEz6","MmsIofmIK1","07n1cPYBf4","tuDySuN6r3","x3LDeSs0Zu","a00b5guMb8","vLsmSgdQsS",
+"b29RJUlU3M","RpBQmyofH3","uLtKs0Kyfs","PYBf4AXpwE","SbRYyGrDg7","FLsph6q6L9","No0Qb8TxD7","aFFssXflUq","XyPZNQbxXc","ulk41GSQwj",
+"fqypy9y4lw","Mkgy8Nxx9V","dQ586U3yw5","tAOsrhe9IA","lViBvi7WMQ","he9IAfFDrJ","gf8rID6rBy","yToGWk85Ae","16lHc0Kyfs","SWfouZhwG1",
+"ZUnqtQbxXc","vkCHHguMb8","8xEKzYOfrY","jSjS37X3uy","RzaZA7X3uy","GrDg7TXQ0Z","HP433soy9t","yluBxcShY2","ZuDtDi7WMQ","Kr8ys64s8N",
+"uN6r3zHF1q","FwEJzJRJQB","d85a9M6qcG","wDajXfFDrJ","blLA9JIqXi","lH1kt8U2nU","Q6Lixsoy9t","k85AeuJScX","dhSuH6AFT0","NcICAM6qcG",
+"StlDJix74r","Fhtgldpe1v","n1pmOlCMxy","pFrrlS77LH","Yf2Ec9GXkX","t59lRFGzgp","WaWsv2Nslm","WreyPW7cTs","Mm8sib29RJ","qaofNsx5Gl",
+"h1zcHLewvM","ZzJHWwDajX","RpBQmQWxoT","7fKYUQChxs","7Ow5ClpF6W","hi5X7v2eC3","FjHXRfqypy","VLTy6X6Pin","MojnPlCMxy","I7p2ahi5X7",
+"QYxC0I7p2a","ydG8Ugf8rI","JKWYR3otm6","nlaByuQIcz","8xEKzsuY4x","i7WMQnnP8o","Rxrsm9iGoT","x3LDeazIWp","s7MxkRxrsm","uoStwuZPqg",
+"fcJOyQ6Lix","VerEAYOfrY","fFDrJ7fsYM","AOgEerhl0J","uQIczSbRYy","Yh1hFyofH3","W3VFHZUnqt","W7cTsuPX7G","UmaEvMm8si","zY1GYZUnqt",
+"gf8rIQworu","Yw2oUvOqCE","taOXKFPfSE","zY1GYXyPZN","xXTI4pFrrl","IRh48DcpWB","guMb8uPX7G","uvf7Alm0pD","tuDyS45cIH","EOE1o7lUXZ",
+"GrDg7OUqFM","16lHcFVMxo","LewvMokgRi","RpBQmlH1kt","TwanoJkzUn","uPX7GVIlwP","i7WMQ9y4lw","yvOMIgtCA5","uoStwi7WMQ","BGaQYdmoS7",
+"zHF1q4dEz6","dhSuHW7cTs","2TRI7F6PT2","n1pmOZv7z0","SmGzvaez9y","HlUbFHfyNQ","blLA9a00b5","gdQsSiB08l","BpYhVfmIK1","blLA99iGoT",
+"yEfy9IRh48","GXdoHHRxd8","xXTI4G1RhS","suY4x14FLR","9iGoTQChxs","Yf2Ec2TRI7","GWqqXuvf7A","CIShGdhSuH","HfyNQBbwgA","14FLRtlILt",
+"NAFuwv1Hln","P6bcgVNCPd","yluBx5nmWv","KZamHs7Mxk","WaWsv7ku1p","b29RJxciqp","lXFOB9iGoT","UlU3M0h1b1","QworuaFFss","1v5hHAkKTk",
+"8RCUA2hEEU","tjQxskZANm","LDk6fuPX7G","8xEKzFcWrW","ZhwG1Chuy3","FhtglhYBCK","gIYvEoVQp6","07n1cWmadA","0ao3lWaim6","bgJAz2DREs",
+"Pb1paVerEA","xXTI4sx5Gl","Yh1hFgdQsS","7fsYMogLgc","8RCUAGv3Fq","cmXIXQnJ1S","okgRiLbRTH","faHirzmLYD","S77LHX6Pin","piJSkqQxHP",
+"Z4I1vgtCA5","h1zcHThjNn","sqVrfdhSuH","EdBKcqUJMd","ReKEWs4786","ni2v1IKxdL","ciuWzmz8gx","Q6LixNcICA","M6qcGIBe8k","ix74raFFss",
+"s93Ml0h1b1","BbwgASbRYy","CK5W7VjCZq","4W0TlqUJMd","taOXKD6rBy","S2Dfu45cIH","ZuDtDuLtKs","tjQxsiKqhr","Waim6Twano","K4GS8hi5X7",
+"MGlTFEoToP","RACujCdyBV","1LB1LCqqaD","uJScXzz4ZU","In3NSoQ87r","MGlTFFVMxo","MojnPEdBKc","DQimpKZamH","zFgtBGv3Fq","I7p2aaFFss",
+"FxX9qn8pJ9","gjUTu5drc6","m4bxU9GXkX","WMiS30Kyfs","sx5GlSs0Zu","uLtKs5Drn0","dhSuHaFFss","nlaBymz8gx","WMiS3uTacx","MaJQslweGy",
+"jzUqRFnPFB","RmDcrD6rBy","wDajXlCMxy","S77LHiKqhr","AgJHQgtCA5","QClRLW3VFH","ksJbyChuy3","FnPFBG1RhS","2hEEUJKWYR","580YDGWqqX",
+"2ZHdkzqH0W","bgJAzBpYhV","AkKTk45cIH","brhlQatef2","MGlTFZ4I1v","iKqhr9rlg9","yToGWrhl0J","lCMxyUmaEv","rhl0JFGzgp","okgRirhl0J",
+"o8UydbgJAz","VjCZqTwano","rhl0J8FmFH","Rxrsmtl72W","fFDrJuLtKs","OUYuF7Ow5C","QworuFNYIM","JRJQBogLgc","1v5hHHRxd8","580YDzbIYY",
+"AXpwE5Drn0","Nxx9VlXFOB","8xEKzl83Ud","8TxD7HlUbF","MK07Yfqypy","C2IrcOUYuF","dpe1vAgJHQ","ZJTXHHlUbF","zFgtBFcWrW","RxrsmO3iyQ",
+"qQxHP7fKYU","DLhzM8xEKz","ECMvUNo0Qb","cQOnv0Wr5y","Dz1R39rlg9","5Drn0oQ87r","24ARFTwano","ZuDtDJIqXi","aL6AJCxVEf","2Yz7E6AFT0",
+"NOHszBbwgA","VIlwP1v5hH","jtn0XwDajX","W7cTsaFFss","NhXdum4bxU","0YAGHC2Irc","lsQGoUmaEv","2hEEUSs0Zu","aDGtSs7Mxk","J2mQiKr8ys",
+"M6qcGKZamH","3otm6djsrv","7fsYMMGlTF","WDVWJM6qcG","8FmFHJXljW","yToGWlpF6W","07n1cC2Irc","NcICASjskQ","2TRI7uAWyp","xciqpCIShG",
+"dpe1vX6Pin","faHirguMb8","QssNCKsjRK","tlILtUl4a1","zmLYDMmsIo","FjHXRFPfSE","J2mQi5IhmG","Ul4a1SmGzv","aez9yyofH3","W3VFH1j5L8",
+"GrDg7B3qem","Chuy32TRI7","Zv7z0pAhR1","EdBKcJ2mQi","FVMxoBGaQY","y94nw2Nslm","IKxdLm4bxU","2NslmHRxd8","ZzJHW7lUXZ","K20wKaFFss",
+"5drc68FmFH","NhXduW3VFH","CxVEflViBv","e6e4zqaofN","XflUqnnP8o","7lUXZt59lR","QnJ1SjfREu","C2Irc2ZHdk","rKDLJgjUTu","ru4UGatef2",
+"CIShGydG8U","BFkb8xXTI4","v2eC3SmGzv","tlILtfaHir","M3zXLzY1GY","iwzGkDLhzM","Y1mC02DREs","pAhR1ogLgc","AmdQddjsrv","OHaBzWDVWJ",
+"6q6L9U3yw5","piJSkcQOnv","i7WMQDLhzM","aDGtSdmoS7","0BmCyv8yFN","nlaBylm0pD","9XyT9IKxdL","P6bcgvkCHH","ksJby5nmWv","jS1ajfFDrJ",
+"lweGyv2eC3","tl72WUl4a1","pFrrlFxX9q","iqv4kzHF1q","xReecWDVWJ","In3NSy94nw","Mm8siGrDg7","pvgjSU3yw5","ksJbyHRxd8","xXTI4cShY2",
+"LbRTHguMb8","UlU3MgtCA5","FFDuiuvf7A","P6bcgpWiOs","KASQ8G1RhS","FnPFBn8pJ9","1j5L88RCUA","9GXkXO3iyQ","RsQUqzz4ZU","vkCHHdpe1v",
+"tl72WJKWYR","Cp3mZ3otm6","ZJTXHgf8rI","suY4xP6bcg","VjCZqrhl0J","BFkb8i3pyd","D6rByNo0Qb","BCxeCFFDui","AgJHQtlILt","ru4UGBbwgA",
+"4dEz6RBhp0","pWiOsoGu6x","5IhmGjS1aj","cQOnv8xEKz","7hyVv7fKYU","I7p2alj07Q","Pb1paUvlv4","hUTw75Drn0","9iGoTVLTy6","tAOsrru4UG",
+"lm0pDD6rBy","ZuDtDGXdoH","hSSvQYw2oU","hE1QlW3VFH","NcICAX6Pin","uQIcz3otm6","MojnP8RCUA","SmGzvHRxd8","5VZjSVNCPd","L7cGcY1mC0",
+"IKxdLs93Ml","mX2GEZJTXH","DQimpoQ87r","Yf2Ecm4bxU","BFkb8x3LDe","vLsmSbZLvS","JKWYRbrhlQ","uoStwd85a9","yToGWMm8si","K20wKQworu",
+"okgRiKZamH","gIYvEfcwDa","CK5W7WmadA","taOXKEdBKc","jzUqRReKEW","piJSkK20wK","VerEApT8wu","JXljWGv3Fq","Y1mC014FLR","Mkgy86AFT0",
+"CdyBVW3VFH","RACujRACuj","K4GS87fKYU","In3NSnlaBy","RpBQm45cIH","LbRTH5IhmG","jiVBPgjUTu","Zv7z0ThjNn","uoStwM6qcG","9GXkXsuY4x",
+"1j5L8gjUTu","TCgPpyvOMI","zHF1qsx5Gl","5Mg9rrhl0J","vLsmS0h1b1","7Ow5CRxrsm","dhSuHkZANm","RkQkeYf2Ec","ogLgcciuWz","BbwgAfcwDa",
+"djsrvW3VFH","7Ow5CFFDui","VerEA580YD","jzUqRW3VFH","QYxC0lXFOB","YOfrYqaofN","kZANmlj07Q","lm0pDIBe8k","jeskSxciqp","MGlTFrKDLJ",
+"pmeCdVjCZq","DLhzMO3iyQ","pmeCdJIqXi","y94nwB3qem","uLtKszbIYY","9XyT9dmoS7","RzaZAYh1hF","brhlQQnJ1S","SjskQt59lR","1LB1LfcwDa",
+"FcWrWk85Ae","NhXduMojnP","d85a9ZzJHW","uTacx8xEKz","dQ586AOgEe","pWiOstl72W","vkCHH9rlg9","2DREscmXIX","RmDcrNhXdu","EdBKc2Yz7E",
+"jiVBPlweGy","QClRLK20wK","9GXkXuJScX","s4786bZLvS","CdyBV6AFT0","TXQ0ZFVMxo","8FmFHkZANm","dmoS75IhmG","uoStwAkKTk","n8pJ9qaofN",
+"24ARFi3pyd","9GXkXv1Hln","iB08lKZamH","7hyVvXyPZN","y94nwjiVBP","zbIYYC2Irc","Z4I1vzFgtB","WreyPlpF6W","QnJ1SfcJOy","qaofNDz1R3",
+"0Kyfs9y4lw","i3pydO3iyQ","O3iyQtvdkD","2hEEUx3LDe","VerEA5IhmG","LbRTHpWiOs","QWxoTSs0Zu","9XyT9fmIK1","G1RhSt59lR","lm0pDTwano",
+"9y4lwNOHsz","4W0TlZhwG1","1j5L8Qworu","OUqFM8cVD3","cQOnvVjCZq","0h1b1cShY2","gtCA59iGoT","gjUTuZUnqt","bZLvSTwano","KASQ81LB1L",
+"JIqXiVBjhz","VLTy6tl72W","oGu6xhYBCK","580YDprNT6","5NammfaHir","fmIK1EdBKc","OxWIHt59lR","VIlwPjiVBP","55rfBM3zXL","yEfy9Mm8si",
+"DQimp7fsYM","5NammW3VFH","U3yw5ReKEW","0MR5X0ao3l","bgJAzMmKGJ","RsQUqo8Uyd","2ZHdkk85Ae","RsQUqrKDLJ","JkzUnuAWyp","h1zcHGSQwj",
+"hSSvQ5iGN5","dQ586VBjhz","K20wKFcWrW","Mm8siUmaEv","6q6L9MGlTF","QssNCi7WMQ","tvdkDs7Mxk","djsrv55rfB","vOqCEOHaBz","FNYIMRzaZA",
+"8cVD3uAWyp","o8Uyd9y4lw","rz7UtsuY4x","Dz1R3lj07Q","BbwgAW3VFH","CNHmvEdBKc","ix74rLewvM","d85a9zbIYY","EOE1oxXTI4","Vprf2BCxeC",
+"uJScXatef2","BCxeCpv0i7","vkCHHTXQ0Z","vLsmSEoToP","pv0i7v2eC3","uPX7GZuDtD","4QMc9SWfou","QnJ1SYh1hF","cShY2ZhwG1","d7vjMUvlv4",
+"BGaQYni2v1","iwzGkqQxHP","QYxC0tvdkD","pAhR1ydG8U","rhl0JyvOMI","xciqpOUqFM","uJScX7fKYU","dQ586No0Qb","hUTw7ru4UG","580YDVjCZq",
+"FnPFB5Drn0","zmLYDS2Dfu","NAFuwIjTwP","lweGylj07Q","mz8gxazIWp","618DiAXpwE","CxVEfuupzk","QWxoTdhSuH","FLsphJIqXi","uoStwM3zXL",
+"gjUTuAOgEe","8xEKzzQt6Q","yEfy9580YD","ni2v1jeskS","NOHszhYBCK","dpe1vWPmlx","In3NS48cHL","t59lRa00b5","soy9tKASQ8","8U2nU45cIH",
+"CxVEfcShY2","MGlTFzmLYD","TwanookgRi","yEfy9yofH3","MaJQsSbRYy","3otm6lXFOB","pv0i7IBe8k","Ul4a12ZHdk","dmoS77fKYU","C2IrcFnPFB",
+"lXFOBF6PT2","prNT69eoRc","W7cTsjtn0X","uAWypxXTI4","uvf7A7hyVv","StlDJs7Mxk","yToGWVIlwP","tlILtWreyP","FVMxo45cIH","WreyPn1pmO",
+"Yf2EcprNT6","LDk6f7Ow5C","pAhR1F6PT2","WMiS3OUqFM","6AFT0dpe1v","zqH0W0ao3l","OUYuFgIYvE","hi5X7aDGtS","WreyP4W0Tl","MezSW618Di",
+"fcwDa618Di","jfREuuJScX","JKWYROUYuF","NcICALDk6f","U3yw5Yh1hF","gIYvEkZANm","FPfSEJXljW","guMb8XyPZN","FFDui2TRI7","ZzJHW8xEKz",
+"zHF1q0h1b1","RxrsmAgJHQ","LbRTH9eoRc","ydG8Ujtn0X","L7cGcokgRi","x3LDetuDyS","xXTI4S2Dfu","bZLvSi7WMQ","KZamHrKDLJ","dhSuHX6Pin",
+"JIqXiCNHmv","3weIFVLTy6","ZUnqtFnPFB","dQ586zz4ZU","StlDJt59lR","prNT6brhlQ","O3iyQlsQGo","5Drn0tuDyS","Nxx9VFNYIM","Rxrsm2TRI7",
+"OUYuFTCgPp","zY1GY4QMc9","pAhR1WreyP","uupzk8FmFH","ThjNnyofH3","WaWsvRsQUq","G1RhSuTacx","IRh48IjTwP","Yw2oU2hEEU","djsrvReKEW",
+"7Ow5C5IhmG","X6Pinv2eC3","bgJAzQnJ1S","ksJbyIn3NS","HlUbFYf2Ec","pmeCdpmeCd","oVQp6zFgtB","sx5GlVBjhz","3weIFtaOXK","I7p2ahYBCK",
+"45cIHlpF6W","I7p2aoVQp6","azIWp0Kyfs","KASQ8yofH3","ciuWzCfgr3","wiHrZ6q6L9","64s8NxReec","tl72WjS1aj","FnPFBQYxC0","fLNg8MojnP",
+"ni2v1W7cTs","Zv7z05Drn0","uZPqg7lUXZ","nnP8oLbRTH","DQimpn8pJ9","14FLR7X3uy","16lHcLewvM","D6rByZzJHW","7fsYM7lUXZ","gIYvEZUnqt",
+"FGzgpv8yFN","fmIK1TXQ0Z","kB5nPHfyNQ","x3LDeiqv4k","y94nw5iGN5","XflUq8U2nU","7lUXZKZamH","s93MlGXdoH","F6PT2pv0i7","AOgEeWmadA",
+"AgJHQyofH3","NOHszTCgPp","YjB9tguMb8","LDk6fgjUTu","soy9tsx5Gl","HlUbFfaHir","Ul4a19y4lw","piJSkIKxdL","VLTy68RCUA","FFDuiGWqqX",
+"Ss0ZuWreyP","v1HlndhSuH","StlDJ7hyVv","ksJbytl72W","he9IAGSQwj","0Wr5y48cHL","XflUqBpYhV","EOE1oKZamH","vOqCEJKWYR","zbIYYOHaBz",
+"CqqaDMmKGJ","o8UydWreyP","GWqqXuJScX","pAhR1JkzUn","OHaBzS77LH","C2IrczY1GY","PYBf49y4lw","jSjS32ZHdk","fqypy7ku1p","7lUXZCK5W7",
+"djsrv0h1b1","5Mg9rX6Pin","RzaZABCxeC","wiHrZHP433","GSQwjCp3mZ","580YD7lUXZ","dhSuHksJby","AOgEeFjHXR","BGaQYPOUYS","v8yFNprNT6",
+"IRh48M3zXL","tAOsrVNCPd","S2Dfu16lHc","MaJQsgtCA5","HP433uupzk","7Ow5CGv3Fq","jiVBP2Nslm","FFDuiprNT6","7X3uyokgRi","6q6L9blLA9",
+"YjB9tL7cGc","pmeCdlCMxy","VerEAYf2Ec","D6rBy580YD","Y1mC0oGu6x","zQt6QZv7z0","0h1b1F6PT2","lCMxy9GXkX","IBe8kQnJ1S","VjCZqb29RJ",
+"0YAGHVprf2","ydG8UjfREu","BCxeCpvgjS","TXQ0Zaez9y","lm0pDThjNn","AOgEetaOXK","yEfy9ru4UG","NcICA7Ow5C","W7cTsRpBQm","FcWrWM6qcG",
+"YjB9tokgRi","9y4lwn8pJ9","vkCHHlsQGo","QClRLiB08l","yofH30Kyfs","vkCHHKr8ys","VBjhzdQ586","cmXIXFxX9q","kB5nPRBhp0","cmXIXAmdQd",
+"WDVWJuQIcz","pWiOsStlDJ","Ul4a1NAFuw","e6e4zmX2GE","t98iWbrhlQ","i7WMQCqqaD","uZPqgDLhzM","pvgjSnlaBy","piJSk8xEKz","BpYhVru4UG",
+"dhSuHUlU3M","OHaBztvdkD","YjB9tSmGzv","qQxHPrKDLJ","OHaBzfqypy","rz7UtNhXdu","JkzUn8FmFH","t98iWksJby","8TxD7D6rBy","i7WMQs4786",
+"2hEEUwiHrZ","RsQUqOz8yZ","X6Pins93Ml","1v5hH48cHL","Ta8f60Kyfs","QClRLwDajX","9y4lwAIYUu","lweGyKsjRK","bgJAzjiVBP","pWiOsuTacx",
+"gIYvEO3iyQ","QWxoTgtCA5","azIWpnFqik","M3zXLoQ87r","bZLvSwDajX","d7vjMIjTwP","iB08l5Namm","4W0TlG1RhS","HzZT824ARF","rhl0JydG8U",
+"cL0aEJJs5m","taOXK8U2nU","RzaZAKASQ8","5Mg9rEOE1o","8xEKzUmaEv","WreyPQworu","uupzkFxX9q","bgJAzeuZA5","FLsphyofH3","pT8wuogLgc",
+"BGaQYHP433","POUYS9XyT9","iqv4ktjQxs","0Wr5yYjB9t","45cIHOUqFM","uupzkBCxeC","ydG8UgtCA5","4dEz6CNHmv","a00b5I7p2a","d7vjMpFrrl",
+"yEfy948cHL","jtn0XEoToP","0YAGHBFkb8","0Wr5yNcICA","zmLYDcShY2","qaofNv8yFN","0YAGHF6PT2","pAhR1aez9y","W3VFHQYxC0","zbIYYGrDg7",
+"14FLRVBjhz","ulk41jiVBP","IjTwPMojnP","3otm6zFgtB","Gv3Fqxciqp","1v5hHCqqaD","nFqikRkQke","ydG8UKASQ8","vkCHHQbxXc","In3NSvkCHH",
+"QChxs48cHL","tl72WQYxC0","AXpwExReec","9GXkXnlaBy","0YAGHs93Ml","jzUqRgtCA5","IKxdLzz4ZU","t59lR2hEEU","D6rByQworu","yToGWlXFOB",
+"zbIYYCfgr3","ZzJHWAmdQd","FhtglIKxdL","aL6AJSs0Zu","2Nslm9iGoT","S2DfuFjHXR","BpYhVMmKGJ","HlUbFhE1Ql","AkKTk2TRI7","0YAGHt59lR",
+"lkMUAfcJOy","bgJAzpWiOs","JKWYR7lUXZ","tuDySThjNn","DLhzMl83Ud","FjHXRLbRTH","rKDLJ0Kyfs","RsQUqQnJ1S","3otm62hEEU","AkKTkv2eC3",
+"DcpWBs93Ml","2ZHdkZhwG1","Ss0ZuIKxdL","RBhp0AIYUu","QWxoTDz1R3","aez9yYjB9t","5ZaEz7fKYU","CqqaDlj07Q","FLsphjeskS","1LB1LFhtgl",
+"CxVEfAgJHQ","JKWYRiKqhr","i3pydciuWz","SbRYyFnPFB","taOXKBFkb8","Waim6IBe8k","ZuDtDa00b5","14FLRmz8gx","yofH3uQIcz","C2Irc7fsYM",
+"2hEEUlsQGo","O3iyQFPfSE","U3yw5soy9t","Qworu4QMc9","SjskQVBjhz","Q6LixHfyNQ","29QAzuQIcz","Yw2oUhSSvQ","gIYvEjeskS","Yf2EcEdBKc",
+"5Drn0B3qem","07n1c618Di","tjQxsrKDLJ","SmGzvYh1hF","K20wKrKDLJ","VerEATCgPp","HRxd8lkMUA","s7MxkYjB9t","UmaEv9iGoT","djsrvjSjS3",
+"5iGN5uLtKs","7hyVvi7WMQ","GWqqXrhl0J","m4bxUpWiOs","fLNg88xEKz","5nmWvuJScX","AkKTk29QAz","JIqXiWDVWJ","lm0pDK4GS8","VNCPd1j5L8",
+"m4bxUJ2mQi","0YAGHx3LDe","Chuy35Drn0","OUYuFmX2GE","JKWYRLDk6f","yluBxOUYuF","QnJ1S45cIH","Y1mC0RpBQm","rz7UtpiJSk","16lHcWDVWJ",
+"JkzUn2TRI7","fcwDatlILt","CK5W7JXljW","zHF1qP6bcg","YjB9t29QAz","9XyT9M3zXL","7X3uyJ2mQi","FnPFBOUYuF","s4786piJSk","7Ow5CiKqhr",
+"7hyVvSjskQ","KsjRK5ZaEz","uoStw0ao3l","Q6hMCCfgr3","Dz1R3Zv7z0","faHiriwzGk","WDVWJgtCA5","MaJQsPOUYS","pFrrlpvgjS","vkCHHlm0pD",
+"v2eC3WPmlx","9GXkXOz8yZ","7Ow5CDG4sT","yluBxBpYhV","Uvlv4JkzUn","In3NS07n1c","FGzgp7lUXZ","xXTI4WmadA","K20wKSs0Zu","uupzkZJTXH",
+"nFqikUl4a1","guMb8FjHXR","a00b5LewvM","bgJAzazIWp","yofH3euZA5","Yf2EcQworu","GSQwjjeskS","DQimpeuZA5","Waim62DREs","pFrrlAgJHQ",
+"0BmCyQYxC0","FhtglNo0Qb","Z4I1vFLsph","fcJOyZ4I1v","d85a9KsjRK","CK5W75IhmG","JRJQBFNYIM","jzUqRhE1Ql","Chuy3BbwgA","tuDySKsjRK",
+"pT8wu8FmFH","nnP8oG1RhS","ZhwG1xXTI4","F6PT2S77LH","v2eC30MR5X","NcICAU3yw5","jzUqRFGzgp","64s8NRkQke","fFDrJ2ZHdk","Gv3FqPb1pa",
+"e6e4zlj07Q","AOgEeD6rBy","v8yFNiwzGk","dQ586uTacx","ZJTXH8xEKz","M3zXLJ2mQi","8TxD7fcwDa","J2mQi3weIF","NOHszbZLvS","uvf7AgIYvE",
+"dQ586s4786","a00b5xciqp","LewvMzFgtB","uQIcz2ZHdk","ZhwG1Dz1R3","WPmlxDG4sT","F6PT2bZLvS","GSQwjtAOsr","Waim6e6e4z","tuDySS77LH",
+"soy9tWMiS3","iqv4k6q6L9","qQxHPl83Ud","618DiZzJHW","taOXK8xEKz","JKWYRTXQ0Z","7X3uyBFkb8","JXljWKr8ys","5Mg9rP6bcg","Nxx9VGWqqX",
+"v1Hln5Drn0","uN6r32Nslm","oGu6xjtn0X","WmadA4QMc9","Mm8sidjsrv","BFkb8dQ586","pv0i7FVMxo","Ss0ZuogLgc","HzZT8bZLvS","OUqFMZhwG1",
+"x3LDeQWxoT","VerEApWiOs","lViBvUlU3M","TCgPpGSQwj","lj07QPYBf4","8hJdtEOE1o","mX2GEOUYuF","ZUnqtvOqCE","vkCHHYf2Ec","oVQp6Yf2Ec",
+"G1RhSogLgc","wDajXlpF6W","i7WMQZJTXH","CdyBV7X3uy","5IhmGh1zcH","5Mg9rlCMxy","2NslmdhSuH","L7cGcuN6r3","9y4lw6AFT0","CqqaDdjsrv",
+"nFqikaFFss","ReKEW7Ow5C","5Mg9rYjB9t","tlILtAXpwE","In3NSTwano","Oz8yZnFqik","uvf7AVerEA","JRJQB9XyT9","45cIHaFFss","y94nwOHaBz",
+"WreyP2hEEU","CIShGtvdkD","QClRL0YAGH","atef2n1pmO","n8pJ955rfB","pv0i7FGzgp","JkzUnyToGW","9eoRcpWiOs","Yh1hFjeskS","ksJby9GXkX",
+"ulk41oGu6x","pvgjSlXFOB","7ku1pEdBKc","mX2GE7lUXZ","Q6LixtuDyS","uPX7GFxX9q","B3qemFjHXR","MojnPSs0Zu","0KyfsP6bcg","zY1GYpiJSk",
+"e6e4zy94nw","yvOMIIn3NS","W3VFHTwano","1LB1LbgJAz","lpF6WblLA9","2hEEUTXQ0Z","jSjS3L7cGc","Vprf2GWqqX","fcJOyWreyP","Mkgy8v8yFN",
+"lpF6WgdQsS","AXpwEKZamH","D6rByMK07Y","ReKEWMm8si","mX2GE55rfB","pAhR15Drn0","SjskQogLgc","gtCA5soy9t","7hyVveuZA5","2TRI7IRh48",
+"HP433Twano","Zv7z0JRJQB","l83UdRkQke","hi5X71j5L8","TCgPpWaWsv","qaofNBbwgA","W3VFH3weIF","uvf7A8cVD3","RsQUqZzJHW","zbIYYzQt6Q",
+"FLsphQnJ1S","14FLRlCMxy","nFqikLbRTH","MaJQsRBhp0","OUqFMtAOsr","U3yw5v1Hln","v1Hlnh1zcH","piJSkBpYhV","jtn0XcShY2","euZA5WMiS3",
+"F6PT248cHL","guMb8LbRTH","HRxd8y94nw","I7p2aKZamH","prNT6POUYS","pmeCdi3pyd","Mm8siI7p2a","pmeCdPb1pa","e6e4z9y4lw","lweGyeuZA5",
+"XyPZNX6Pin","i7WMQ2Yz7E","lm0pDuPX7G","xciqpsoy9t","5Nammd7vjM","CdyBVksJby","mX2GEjeskS","RkQkeJJs5m","14FLR9rlg9","WMiS3QssNC",
+"CdyBV9eoRc","lCMxylCMxy","J2mQijS1aj","29QAzuvf7A","zz4ZUkZANm","nlaByv8yFN","AmdQdlweGy","XflUqv2eC3","zQt6Qgf8rI","m4bxUy94nw",
+"Zv7z0OUqFM","G1RhSiB08l","X6PinciuWz","nnP8olH1kt","Nxx9VFxX9q","UlU3M8FmFH","fmIK124ARF","S77LHS77LH","ECMvUlj07Q","QssNCcmXIX",
+"P6bcgHfyNQ","b29RJFPfSE","5iGN5wiHrZ","iqv4kB3qem","8hJdtVjCZq","zHF1qhe9IA","jS1ajWMiS3","QnJ1SvkCHH","i7WMQCK5W7","8cVD3Dz1R3",
+"1LB1L7Ow5C","B3qemTa8f6","soy9tSmGzv","bgJAz5drc6","oVQp60ao3l","ECMvU2ZHdk","8cVD30MR5X","9rlg9uJScX","uPX7G7ku1p","0KyfseuZA5",
+"rKDLJ48cHL","wiHrZzHF1q","d85a9xReec","Mm8sizY1GY","NAFuwOUYuF","Q6Lix8TxD7","Yf2EctvdkD","MmKGJcL0aE","qUJMdGrDg7","kZANmuTacx",
+"AgJHQJXljW","MezSWQClRL","Nxx9VPb1pa","QChxsGrDg7","9XyT95IhmG","Mkgy8yluBx","8cVD3he9IA","JJs5mxciqp","oVQp6zqH0W","StlDJgtCA5",
+"L7cGczmLYD","AmdQdqaofN","UmaEvSjskQ","prNT6L7cGc","s4786dmoS7","SbRYyuJScX","BCxeCEdBKc","8cVD3a00b5","JKWYRhUTw7","29QAzFLsph",
+"pvgjS6q6L9","euZA57Ow5C","jzUqRBCxeC","EOE1ofcwDa","uJScX9y4lw","Ul4a18RCUA","FnPFBrhl0J","mz8gx0h1b1","suY4x5IhmG","nFqikaL6AJ",
+"14FLRuTacx","3weIFZuDtD","0YAGHFwEJz","lH1kt8hJdt","JJs5mTCgPp","CIShGAgJHQ","2hEEUn8pJ9","a00b524ARF","WDVWJRpBQm","G1RhS29QAz",
+"azIWpFnPFB","jeskS8xEKz","IRh48Qworu","1LB1Li3pyd","RACujjfREu","GXdoHsuY4x","M3zXLtlILt","azIWppiJSk","HzZT8W3VFH","MmsIoXyPZN",
+"a00b5XflUq","CK5W7lpF6W","LbRTHfFDrJ","yofH3v8yFN","dhSuH8U2nU","ThjNn7hyVv","9GXkXYw2oU","ReKEWa00b5","oGu6xciuWz","x3LDe07n1c",
+"DLhzMCIShG","HlUbF5VZjS","okgRiKr8ys","Mm8sifFDrJ","Cfgr3e6e4z","faHirlsQGo","RxrsmUvlv4","8TxD7Yf2Ec","7lUXZSbRYy","tjQxscQOnv",
+"Uvlv4Vprf2","NOHsz2DREs","FPfSE1j5L8","QChxsLewvM","KASQ8QClRL","dmoS7yEfy9","nFqikVerEA","IBe8kbgJAz","l83UdpmeCd","07n1cFLsph",
+"uN6r3O3iyQ","W3VFHZJTXH","VjCZqpiJSk","FcWrWqUJMd","CxVEf8FmFH","lViBv5Mg9r","5ZaEzRkQke","iKqhr1j5L8","gtCA5zY1GY","7fKYULbRTH",
+"IjTwPRBhp0","9rlg9mz8gx","uTacxX6Pin","6q6L94dEz6","NhXdufaHir","8FmFHAXpwE","he9IAIjTwP","DQimpDcpWB","oVQp6MezSW","JIqXib29RJ",
+"QYxC0uLtKs","t98iWgf8rI","RACujNOHsz","iwzGkFNYIM","aDGtSSmGzv","JXljW0Wr5y","RACujaDGtS","n8pJ9Chuy3","ksJbys7Mxk","yEfy9AmdQd",
+"lweGyFcWrW","W3VFHNxx9V","hUTw7tjQxs","faHirbgJAz","D6rByCfgr3","lCMxy7hyVv","v8yFNLDk6f","hYBCKAIYUu","sx5GlS2Dfu","0MR5XYjB9t",
+"CIShG7fKYU","hYBCKzqH0W","tAOsrVBjhz","FnPFBcL0aE","WMiS3FcWrW","EdBKczmLYD","oVQp6fLNg8","dhSuH5ZaEz","StlDJJKWYR","CK5W79rlg9",
+"BFkb8jS1aj","KsjRKnlaBy","Oz8yZS77LH","07n1cFFDui","POUYSQYxC0","WmadARpBQm","W7cTs9eoRc","cShY25Namm","FPfSEXyPZN","yToGWjzUqR",
+"cShY2aez9y","0MR5XMK07Y","GrDg7IRh48","dmoS7IRh48","LDk6f6q6L9","64s8NFjHXR","v8yFNv1Hln","ydG8UThjNn","8cVD3StlDJ","Pb1pauTacx",
+"CK5W7dmoS7","OHaBzPOUYS","X6Pinni2v1","MK07YblLA9","QClRLpWiOs","MGlTFo8Uyd","blLA9kZANm","64s8N29QAz","vOqCEdQ586","lkMUApFrrl",
+"vOqCEU3yw5","I7p2a5drc6","oVQp6QYxC0","4W0TlCdyBV","48cHL7X3uy","uQIczEOE1o","FPfSEMojnP","IKxdLFwEJz","QWxoTCIShG","QYxC0RzaZA",
+"BCxeCgtCA5","uoStwFNYIM","JIqXiO3iyQ","6q6L9CK5W7","D6rByHRxd8","hi5X7KASQ8","ReKEWEOE1o","tvdkD8U2nU","AOgEemz8gx","07n1cbgJAz",
+"fFDrJGSQwj","zmLYD8cVD3","PYBf4XflUq","EOE1ohe9IA","k85AeJXljW","PYBf4AOgEe","HlUbFJKWYR","Vprf2VerEA","lCMxy5nmWv","EoToPWDVWJ",
+"gtCA5rKDLJ","CNHmvVLTy6","Pb1paCp3mZ","4W0TljiVBP","Q6LixbgJAz","faHirfmIK1","0Wr5yt98iW","Dz1R3UlU3M","VjCZqrz7Ut","yvOMIdpe1v",
+"NOHszFNYIM","8xEKzbgJAz","hi5X7FPfSE","hUTw7SjskQ","zHF1qzFgtB","9y4lwQworu","2Yz7EVIlwP","jtn0XG1RhS","bgJAzbrhlQ","SWfou2ZHdk",
+"IRh48soy9t","fLNg8StlDJ","No0Qb64s8N","Nxx9VCp3mZ","AIYUuogLgc","BbwgA16lHc","aL6AJFwEJz","8TxD7RkQke","7fKYUuPX7G","n8pJ9jSjS3",
+"FVMxoRxrsm","Gv3Fq9GXkX","RkQkelsQGo","RzaZA0MR5X","VerEA7fKYU","5ZaEzvOqCE","yluBxWreyP","4W0Tl7fKYU","djsrvmz8gx","gdQsSfcwDa",
+"LbRTHtl72W","SmGzvulk41","ZhwG1lH1kt","CIShGZuDtD","OUYuFMaJQs","CNHmvRkQke","rKDLJ5Mg9r","uLtKssx5Gl","zmLYDDz1R3","16lHczmLYD",
+"618DiLewvM","5NammhYBCK","QworubZLvS","FFDui8cVD3","nnP8o7hyVv","D6rBy8cVD3","U3yw5HfyNQ","9rlg9fFDrJ","9eoRc8xEKz","GSQwjX6Pin",
+"gIYvEdjsrv","Z4I1v14FLR","CIShGazIWp","O3iyQFFDui","a00b52Nslm","fqypyPOUYS","okgRiEdBKc","e6e4zyToGW","hi5X7U3yw5","djsrvhSSvQ",
+"Q6hMCuAWyp","fcJOyHfyNQ","1j5L8uvf7A","FNYIMAXpwE","zmLYDrKDLJ","9GXkXprNT6","piJSkNAFuw","uAWypa00b5","iwzGkuJScX","rKDLJTCgPp",
+"GrDg7Q6hMC","a00b5S2Dfu","fqypygIYvE","aDGtSt98iW","45cIHyluBx","6AFT0NOHsz","0Wr5y0h1b1","07n1c8RCUA","LDk6f8hJdt","3otm60YAGH",
+"Mkgy8aDGtS","FFDuiEoToP","5drc6KsjRK","I7p2a6AFT0","DQimpS77LH","Ta8f6s7Mxk","AIYUu8U2nU","StlDJC2Irc","ksJbyXyPZN","2NslmZUnqt",
+"BGaQYFVMxo","SbRYyMGlTF","D6rByDz1R3","FVMxoMaJQs","Y1mC0lH1kt","FPfSEpmeCd","Mm8siuQIcz","3otm6lj07Q","lH1ktOHaBz","EOE1oZUnqt",
+"pAhR1zqH0W","jtn0Xs7Mxk","YOfrYblLA9","gtCA5DLhzM","2TRI7rhl0J","GSQwjUmaEv","HRxd81j5L8","qUJMd5Namm","rz7UtUvlv4","UlU3Mhi5X7",
+"3weIFsqVrf","yvOMIn1pmO","Yw2oUhE1Ql","HRxd8pmeCd","gdQsSb29RJ","45cIHGrDg7","SjskQQssNC","16lHcpiJSk","Z4I1vStlDJ","SbRYytuDyS",
+"FcWrWfqypy","7hyVvDG4sT","P6bcgBFkb8","MezSWSbRYy","45cIHSs0Zu","taOXK45cIH","7ku1pDQimp","2hEEU5iGN5","29QAzulk41","vkCHHazIWp",
+"VNCPd580YD","m4bxUTXQ0Z","vOqCEksJby","VerEAKZamH","5Mg9ruJScX","MmsIoOz8yZ","8cVD3s4786","QClRLs4786","K20wK45cIH","4dEz6Kr8ys",
+"4W0TlRBhp0","X6PinUl4a1","8RCUAjS1aj","FxX9qyvOMI","lH1ktI7p2a","P6bcgBGaQY","oVQp6In3NS","v8yFN5Drn0","MmsIorz7Ut","XflUqEdBKc",
+"TwanoxReec","OUYuFuLtKs","qaofNlpF6W","Ta8f6tvdkD","QssNChYBCK","KsjRKKZamH","Yf2EciKqhr","In3NSlj07Q","aFFssl83Ud","Oz8yZFGzgp",
+"gjUTuDLhzM","6AFT0tl72W","h1zcHpiJSk","gdQsSSs0Zu","zbIYY8hJdt","uJScXU3yw5","n8pJ97ku1p","RzaZAHzZT8","GSQwjzmLYD","GXdoHUl4a1",
+"AgJHQmz8gx","jSjS3cmXIX","IjTwPTCgPp","cL0aEhe9IA","ulk41OxWIH","zmLYDSbRYy","he9IADcpWB","wiHrZhe9IA","MojnPciuWz","uPX7GoVQp6",
+"iwzGkWmadA","NOHszvOqCE","AXpwEI7p2a","zY1GY618Di","dpe1vgtCA5","8cVD31LB1L","2TRI70YAGH","gjUTutjQxs","RpBQmd85a9","EdBKcNo0Qb",
+"ZuDtDKASQ8","Cfgr3ulk41","JXljWCqqaD","aez9yStlDJ","X6PinogLgc","lXFOBJ2mQi","lj07QB3qem","yofH3OxWIH","RpBQmCNHmv","24ARFt98iW",
+"xXTI4MmsIo","BCxeCCqqaD","45cIHM6qcG","uLtKs9eoRc","CqqaD1j5L8","9rlg9jzUqR","9iGoTe6e4z","pWiOsVerEA","5IhmGWMiS3","SWfoumX2GE",
+"RACujAOgEe","DcpWBv8yFN","ksJbyZv7z0","mz8gxK20wK","oGu6xs4786","LewvM2TRI7","CqqaDJJs5m","K4GS8CqqaD","MezSW7Ow5C","uAWypNOHsz",
+"5IhmGUl4a1","pvgjSHzZT8","lsQGoS2Dfu","F6PT2he9IA","HRxd8POUYS","OUqFMW3VFH","hi5X764s8N","W7cTsuAWyp","F6PT29eoRc","OUYuFFhtgl",
+"EOE1osoy9t","SjskQsqVrf","Cp3mZguMb8","JIqXiQChxs","2hEEUjeskS","lViBvOHaBz","RBhp0S2Dfu","vOqCE2Yz7E","55rfBDcpWB","EdBKciKqhr",
+"TXQ0Zjtn0X","zHF1qC2Irc","TXQ0ZOUYuF","yEfy9cmXIX","MaJQsk85Ae","Zv7z0uTacx","ZUnqtHRxd8","zbIYYd85a9","hUTw714FLR","8U2nUS2Dfu",
+"uN6r3FFDui","lViBvVjCZq","HRxd8DLhzM","JkzUna00b5","d85a9GXdoH","v1HlnPOUYS","6AFT0WreyP","e6e4zMezSW","gIYvEh1zcH","RkQkeAmdQd",
+"gtCA5v2eC3","Kr8ysKsjRK","OUqFMl83Ud","2DREsJJs5m","n8pJ96q6L9","WmadAM3zXL","Pb1paMm8si","2NslmC2Irc","QbxXc55rfB","5nmWvsx5Gl",
+"hE1QlHP433","ni2v1dQ586","nnP8ozbIYY","M6qcGaDGtS","aFFssuN6r3","lViBvFcWrW","CdyBVHP433","W3VFHzbIYY","s93MlCdyBV","Uvlv4lweGy",
+"oGu6x2TRI7","Oz8yZuJScX","v8yFN2ZHdk","EoToPJIqXi","jfREuVjCZq","mX2GESWfou","pv0i73weIF","hi5X7vLsmS","uvf7Ani2v1","oQ87rX6Pin",
+"TXQ0ZAXpwE","ix74rMK07Y","0Kyfs0h1b1","6q6L9J2mQi","uN6r3gIYvE","suY4x0BmCy","5Mg9r64s8N","Kr8ysFFDui","RBhp0fmIK1","prNT6ZJTXH",
+"L7cGcIjTwP","jtn0XqQxHP","d85a9S2Dfu","vkCHHAgJHQ","BGaQYC2Irc","Fhtgl4W0Tl","hE1QluLtKs","OHaBzYOfrY","ksJbyaFFss","fmIK1JRJQB",
+"QbxXcHzZT8","07n1cuJScX","Q6hMCKr8ys","AOgEeb29RJ","vLsmSv2eC3","EdBKcy94nw","NcICAeuZA5","aDGtShi5X7","BCxeC0BmCy","Gv3FqVIlwP",
+"Yf2Ec5IhmG","KsjRKPYBf4","iqv4k9y4lw","hi5X7Cfgr3","NcICA0PktI","Waim6hE1Ql","Waim6RmDcr","NcICAWreyP","LewvMSWfou","Yh1hFpAhR1",
+"uQIczoQ87r","qQxHPhYBCK","EOE1oCK5W7","SjskQEdBKc","BpYhV24ARF","prNT6suY4x","1LB1L0Kyfs","CxVEf5Mg9r","OUqFMlm0pD","1j5L8gtCA5",
+"MGlTFRsQUq","s7Mxkt59lR","v1HlnQnJ1S","HRxd8m4bxU","1v5hHjfREu","WmadALDk6f","ZzJHWaL6AJ","7hyVv7X3uy","s93MldmoS7","RACuja00b5",
+"lH1ktCNHmv","i3pydWaim6","2Yz7E618Di","CqqaD64s8N","TCgPpmX2GE","W3VFHK20wK","RACuj5drc6","t98iWqUJMd","yToGWVBjhz","Ta8f6v1Hln",
+"uupzkiB08l","iqv4kzQt6Q","7X3uy5nmWv","29QAzECMvU","cmXIXyluBx","uvf7ASmGzv","3weIFpT8wu","KASQ8s4786","5Mg9r3otm6","8hJdti3pyd",
+"he9IASmGzv","xXTI45Drn0","VNCPdG1RhS","sx5GloVQp6","hSSvQvkCHH","CdyBVQYxC0","DG4sThE1Ql","S77LHFLsph","gjUTuMK07Y","1LB1L07n1c",
+"qaofNRmDcr","W3VFH8RCUA","brhlQCxVEf","rz7UtwDajX","AkKTkNOHsz","h1zcHuoStw","7hyVvv1Hln","HP433aDGtS","EdBKc29QAz","VLTy6GSQwj",
+"FVMxoMGlTF","JRJQB8cVD3","cQOnv9y4lw","hE1QlNAFuw","1v5hHRpBQm","jeskSv8yFN","5NammgjUTu","RsQUqVLTy6","EOE1odhSuH","lpF6WcQOnv",
+"ydG8U16lHc","uPX7GK20wK","tlILtWMiS3","Kr8ysogLgc","Ta8f6LbRTH","XyPZNiqv4k","Cfgr30PktI","oQ87r9GXkX","FNYIMMojnP","dmoS7zY1GY",
+"HRxd8Q6Lix","Yf2EcMezSW","soy9tNcICA","X6Pin0MR5X","NcICAoQ87r","tl72WOUYuF","FwEJzSWfou","jSjS3rz7Ut","piJSkCfgr3","MezSWyEfy9",
+"JKWYR0Wr5y","X6Pinuvf7A","ECMvU0h1b1","nnP8oVIlwP","GrDg7EdBKc","Q6hMCC2Irc","7hyVvNo0Qb","Y1mC0ix74r","WmadAoQ87r","7lUXZuupzk",
+"AmdQd3weIF","IBe8kuZPqg","ksJbyrhl0J","azIWpZ4I1v","yToGWM3zXL","In3NS5Drn0","fqypys4786","ciuWzaez9y","CxVEf1v5hH","5drc6lpF6W",
+"HlUbFvLsmS","guMb89y4lw","OHaBz0PktI","48cHLReKEW","L7cGczHF1q","8U2nUzHF1q","rhl0JuZPqg","CxVEfKASQ8","NOHsz16lHc","azIWpblLA9",
+"PYBf4F6PT2","BpYhVD6rBy","zz4ZU2Yz7E","FFDuipv0i7","gjUTugtCA5","9eoRcJJs5m","aDGtS8RCUA","lViBvTwano","SbRYydQ586","yofH3qaofN",
+"lCMxy1j5L8","IKxdLMm8si","HzZT8HfyNQ","pAhR1uLtKs","K4GS8IjTwP","oQ87r1v5hH","2NslmChuy3","jS1ajmX2GE","pT8wubZLvS","8hJdtW7cTs",
+"Q6Lixtl72W","0KyfszHF1q","8xEKzfaHir","uAWyp7lUXZ","uPX7GWMiS3","7ku1pPb1pa","zQt6QoGu6x","EdBKcjfREu","JRJQB0h1b1","FcWrWRpBQm",
+"QssNCMm8si","7X3uytaOXK","hUTw7P6bcg","LbRTHB3qem","2ZHdklH1kt","RpBQmRmDcr","7fKYUfqypy","ksJby16lHc","hYBCKIRh48","oVQp6GSQwj",
+"jiVBP0YAGH","2NslmMezSW","OUYuFru4UG","QChxsKASQ8","8hJdty94nw","LDk6f0ao3l","s93MlVNCPd","zqH0Wmz8gx","uZPqgRACuj","OUqFMX6Pin",
+"v8yFNtuDyS","ksJbydmoS7","QbxXcTCgPp","45cIHk85Ae","MmKGJFNYIM","dQ586WMiS3","soy9tLDk6f","faHirQClRL","FcWrWCxVEf","dpe1vRACuj",
+"LbRTHQssNC","qUJMdnnP8o","Vprf2EdBKc","0PktIqaofN","5drc60BmCy","0PktILbRTH","FjHXRprNT6","rz7UtFFDui","7Ow5CeuZA5","m4bxUlXFOB",
+"Yh1hFuTacx","RACujCIShG","hi5X714FLR","L7cGcVIlwP","ni2v14W0Tl","M3zXLJkzUn","JRJQB64s8N","ix74r4dEz6","HRxd8Z4I1v","i7WMQfcwDa",
+"QYxC0RmDcr","FcWrWpv0i7","48cHLCdyBV","fLNg8FNYIM","QbxXcbZLvS","9y4lw07n1c","S77LHJKWYR","GSQwjjSjS3","YOfrYs7Mxk","RxrsmTwano",
+"GSQwjP6bcg","rhl0JgtCA5","8FmFHyEfy9","prNT68FmFH","UmaEvStlDJ","9XyT9tl72W","Q6LixpmeCd","24ARFBCxeC","ThjNnQClRL","JKWYRgf8rI",
+"XflUqa00b5","zY1GYtvdkD","8FmFHNo0Qb","kB5nPKr8ys","M3zXLZzJHW","pmeCdydG8U","VNCPdF6PT2","s7MxkVIlwP","jeskSYOfrY","pmeCdMm8si",
+"uZPqgUlU3M","MmsIoQWxoT","bZLvS6q6L9","HlUbF2TRI7","NcICAm4bxU","rz7UtRpBQm","uQIczBFkb8","WDVWJuupzk","jS1ajlpF6W","YOfrY55rfB",
+"9iGoTlCMxy","2Yz7EZuDtD","vkCHHnnP8o","StlDJFNYIM","RmDcrM6qcG","IjTwPzbIYY","e6e4z8cVD3","2ZHdkoVQp6","No0QbM6qcG","ydG8UCIShG",
+"2NslmVBjhz","07n1cprNT6","9eoRcQbxXc","GWqqXFVMxo","9GXkXfqypy","FxX9qHfyNQ","JkzUnsuY4x","fFDrJhYBCK","zmLYDnFqik","0Wr5yFjHXR",
+"mz8gxFjHXR","CNHmvx3LDe","9iGoTDG4sT","ZhwG1Gv3Fq","MojnP8TxD7","EdBKcjeskS","0MR5XXyPZN","KZamHHzZT8","KsjRKMK07Y","atef27hyVv",
+"O3iyQW3VFH","5iGN5Twano","JRJQBoQ87r","d85a99XyT9","fcJOy4dEz6","BGaQYY1mC0","29QAzdhSuH","7lUXZFcWrW","FnPFBzQt6Q","FGzgpRsQUq",
+"DcpWByofH3","DQimpQworu","YjB9tvkCHH","yluBxuN6r3","piJSkW7cTs","W3VFHRkQke","5VZjSt59lR","Zv7z0SjskQ","55rfBMm8si","uTacxYw2oU",
+"8xEKzSjskQ","No0Qb2ZHdk","FGzgpXyPZN","4QMc9he9IA","v8yFNs93Ml","tuDySGrDg7","JIqXiY1mC0","e6e4zhSSvQ","lweGyS2Dfu","wDajX2Yz7E",
+"d7vjMsuY4x","jS1ajCqqaD","cQOnvt59lR","WmadA14FLR","zY1GYWMiS3","qQxHPUlU3M","e6e4zQYxC0","OHaBzzmLYD","faHirzqH0W","jzUqRk85Ae",
+"fqypyLDk6f","JRJQBgdQsS","HfyNQjfREu","HRxd8s7Mxk","AmdQd9rlg9","5iGN5ogLgc","LbRTHIKxdL","yEfy9suY4x","U3yw5G1RhS","pWiOs0Kyfs",
+"fmIK16AFT0","nFqikDLhzM","guMb8Ss0Zu","mX2GEguMb8","JkzUnHlUbF","Rxrsm0Kyfs","uLtKspvgjS","FLsphtvdkD","JJs5mAmdQd","2hEEUWaWsv",
+"Oz8yZWPmlx","pT8wuydG8U","RxrsmXflUq","zQt6QWaim6","4QMc9lCMxy","WaWsvK4GS8","piJSk2TRI7","LDk6fgtCA5","rz7UtvkCHH","QnJ1Ss93Ml",
+"Ta8f6SmGzv","QWxoTvLsmS","tlILtpvgjS","2DREsJRJQB","Zv7z0MK07Y","FNYIMyvOMI","FPfSEs93Ml","lpF6WJkzUn","rhl0JOUqFM","X6PinPb1pa",
+"2hEEUP6bcg","EdBKcJJs5m","1v5hH2TRI7","WmadAdpe1v","5ZaEzGv3Fq","0Kyfsru4UG","0Wr5yHzZT8","vkCHHTwano","lj07Q0Kyfs","Uvlv4zqH0W",
+"jiVBPVIlwP","HzZT8Pb1pa","NAFuwjSjS3","14FLRM3zXL","SmGzviB08l","jS1ajlsQGo","7fsYMVNCPd","cQOnvY1mC0","580YDn8pJ9","tvdkDciuWz",
+"EdBKchUTw7","MmKGJKZamH","dmoS70h1b1","WreyPs93Ml","aez9yvLsmS","OUYuFFPfSE","ZUnqt2DREs","JXljWHP433","d7vjMK4GS8","7hyVvSWfou",
+"t59lR8FmFH","hi5X7CIShG","BCxeCBGaQY","HRxd8atef2","Zv7z0lViBv","1j5L8pvgjS","uZPqg1v5hH","Uvlv4IBe8k","zFgtBdpe1v","tl72WNxx9V",
+"lsQGodjsrv","Chuy3GWqqX","KsjRKHfyNQ","JKWYRcQOnv","zqH0WBbwgA","rz7UtqaofN","JRJQBrhl0J","Qworu29QAz","SjskQCNHmv","U3yw5v8yFN",
+"8TxD7BGaQY","CxVEfC2Irc","4dEz6blLA9","mz8gxTa8f6","azIWpVLTy6","8xEKzuvf7A","0h1b1gtCA5","uPX7GTa8f6","Fhtgl64s8N","SbRYyCxVEf",
+"9eoRcCxVEf","VerEAaDGtS","CxVEfWPmlx","K4GS8Uvlv4","tuDyStlILt","Nxx9VlsQGo","XyPZN7hyVv","SmGzvCdyBV","5Drn0WPmlx","0Wr5y8RCUA",
+"QnJ1SF6PT2","aL6AJru4UG","dhSuHM6qcG","cmXIXblLA9","piJSkiB08l","IRh48Q6hMC","kB5nPMojnP","qaofNSjskQ","tl72WydG8U","oGu6x5ZaEz",
+"HP433aL6AJ","aDGtSpiJSk","aFFssY1mC0","NcICAix74r","ulk41hE1Ql","dhSuHZ4I1v","pT8wujSjS3","xXTI4W7cTs","ThjNnVBjhz","oVQp60BmCy",
+"5NammvOqCE","guMb8LDk6f","JIqXiQWxoT","0Wr5yatef2","tvdkDvLsmS","wDajX7Ow5C","okgRigdQsS","MmKGJ45cIH","D6rByprNT6","DQimpgjUTu",
+"pWiOsbrhlQ","i7WMQP6bcg","M6qcGC2Irc","tl72Wi7WMQ","aez9ytaOXK","2Yz7EkZANm","JIqXiK4GS8","yToGWi7WMQ","GWqqXD6rBy","Q6LixNOHsz",
+"BpYhVP6bcg","zY1GYwiHrZ","2hEEUVjCZq","yEfy9Waim6","ECMvU0BmCy","djsrvtuDyS","GSQwjn8pJ9","lXFOBHP433","Chuy3rKDLJ","NcICA8FmFH",
+"azIWpF6PT2","5Drn0NOHsz","24ARF0Wr5y","KsjRKuPX7G","faHirDQimp","b29RJjSjS3","8TxD7KZamH","0YAGHW3VFH","TCgPpFcWrW","fcwDannP8o",
+"Yf2EcZhwG1","pmeCdIjTwP","3otm6VjCZq","QnJ1SpFrrl","brhlQK20wK","FwEJzS77LH","X6Pin7Ow5C","tuDySRpBQm","MK07YThjNn","LDk6fPb1pa",
+"5Drn05nmWv","CNHmvguMb8","VIlwPSWfou","ThjNnBpYhV","cQOnvWPmlx","i7WMQjtn0X","P6bcgEdBKc","okgRilm0pD","DQimpCfgr3","aez9yVLTy6",
+"RsQUqgIYvE","yofH3ZuDtD","FwEJzFhtgl","rhl0JiwzGk","hUTw7l83Ud","16lHc4dEz6","I7p2as93Ml","5Mg9rY1mC0","2Nslmt98iW","KsjRKblLA9",
+"FcWrW2TRI7","K4GS85drc6","fqypyhUTw7","KZamHuAWyp","Y1mC0kB5nP","6AFT0JKWYR","FwEJzdQ586","J2mQipFrrl","DQimpPb1pa","guMb8FPfSE",
+"Rxrsmmz8gx","0MR5X1v5hH","pvgjScShY2","MmKGJru4UG","0BmCyAXpwE","brhlQpmeCd","lXFOBNOHsz","GXdoHlm0pD","fcJOylm0pD","0h1b1rhl0J",
+"64s8NTa8f6","yvOMIuvf7A","i3pydRkQke","fmIK10YAGH","SWfouTXQ0Z","BGaQY64s8N","iqv4k0BmCy","5nmWvuQIcz","W3VFHL7cGc","uTacxS77LH",
+"F6PT2JJs5m","he9IAIn3NS","cL0aEiKqhr","v1HlnNxx9V","WPmlxAmdQd","yEfy9SbRYy","xciqpAIYUu","lH1ktWmadA","Ta8f6AOgEe","AIYUuVIlwP",
+"Ta8f6QbxXc","Ss0ZuUl4a1","WmadA9y4lw","WreyPVjCZq","5nmWvtlILt","3weIF5Drn0","cmXIX0h1b1","fFDrJ0ao3l","RmDcrhSSvQ","X6PinNo0Qb",
+"taOXKS2Dfu","Q6hMCyEfy9","SWfouUmaEv","Q6hMCtlILt","WaWsv3otm6","aDGtSAIYUu","XflUq5Drn0","8xEKz0BmCy","64s8NlH1kt","7hyVvni2v1",
+"9y4lw7fKYU","suY4xXflUq","uoStwTwano","16lHcpvgjS","SbRYyDLhzM","5Mg9rAXpwE","iwzGk5ZaEz","yToGWB3qem","0BmCyoQ87r","lweGygIYvE",
+"d7vjMjtn0X","TCgPpiKqhr","B3qemzmLYD","5iGN514FLR","7fKYUaL6AJ","kB5nP5Mg9r","EoToPVerEA","CK5W7zFgtB","PYBf4S77LH","AIYUut98iW",
+"0BmCyVLTy6","k85Aeni2v1","jiVBPulk41","D6rBy5drc6","CqqaDBbwgA","No0QbfFDrJ","Cfgr3Y1mC0","uLtKskZANm","fqypytaOXK","S2DfuDLhzM",
+"CK5W72ZHdk","QWxoTjS1aj","RxrsmjiVBP","8RCUA7hyVv","he9IAtAOsr","Waim645cIH","IRh48fmIK1","No0QbpWiOs","CqqaDguMb8","uN6r3ThjNn",
+"taOXKgf8rI","fFDrJ8hJdt","h1zcHsuY4x","gdQsSVBjhz","0ao3lix74r","YOfrYlXFOB","euZA5BpYhV","9GXkX8TxD7","CqqaDGXdoH","tuDyS9GXkX",
+"a00b514FLR","Qworun1pmO","pv0i75IhmG","nlaByru4UG","blLA9CqqaD","xciqpCK5W7","WPmlx1LB1L","UmaEvvLsmS","WreyPVIlwP","gf8rIRsQUq",
+"0PktIgtCA5","48cHLAmdQd","AkKTkS2Dfu","KASQ8ZUnqt","6AFT09GXkX","hUTw7t98iW","guMb82DREs","LDk6fCxVEf","sqVrfUmaEv","LbRTHru4UG",
+"WDVWJGXdoH","WaWsvRmDcr","WMiS3hSSvQ","Uvlv4oQ87r","iB08lGSQwj","Q6LixlH1kt","dmoS7jtn0X","y94nwECMvU","zHF1quTacx","29QAzlpF6W",
+"618DiFjHXR","5Drn0CdyBV","MmKGJAgJHQ","MmsIox3LDe","BFkb8TXQ0Z","7ku1pCIShG","jzUqR7lUXZ","ix74rPOUYS","cShY2FxX9q","48cHLl83Ud",
+"s7MxkbZLvS","F6PT2bgJAz","5drc607n1c","FwEJzzY1GY","Pb1pa7hyVv","07n1cOxWIH","b29RJfFDrJ","P6bcgX6Pin","MojnPlH1kt","W7cTsVBjhz",
+"RxrsmDz1R3","Nxx9VfaHir","HfyNQcShY2","ECMvUVprf2","lsQGobrhlQ","pvgjSdhSuH","fcJOyuZPqg","Z4I1vsuY4x","pT8wuUmaEv","djsrvo8Uyd",
+"Y1mC0Mkgy8","AkKTkFwEJz","ZUnqtVerEA","WreyPAIYUu","5Drn0L7cGc","B3qemfaHir","qQxHPC2Irc","JKWYRlCMxy","9iGoTEdBKc","mz8gxHzZT8",
+"taOXKMezSW","XflUqVjCZq","fcwDaBbwgA","dmoS7a00b5","faHir2Nslm","mX2GEW7cTs","NAFuwO3iyQ","hYBCKRzaZA","lsQGookgRi","ZhwG1GSQwj",
+"X6Pin24ARF","I7p2aPOUYS","RzaZAI7p2a","FVMxohE1Ql","Z4I1vYh1hF","iB08lkZANm","POUYS7hyVv","sqVrfcL0aE","HzZT80h1b1","jtn0XRBhp0",
+"yluBxVjCZq","wiHrZVIlwP","JKWYRY1mC0","No0QbJkzUn","fqypyU3yw5","v2eC38FmFH","zY1GYrz7Ut","okgRid85a9","DLhzMpmeCd","GWqqXoQ87r",
+"ThjNnyToGW","uvf7AxReec","Chuy3FVMxo","StlDJv8yFN","euZA5S77LH","gdQsSNxx9V","WreyPOUYuF","zbIYY2ZHdk","Ul4a1GWqqX","pmeCd48cHL",
+"VNCPdogLgc","aez9yEoToP","5iGN5Vprf2","5ZaEzuN6r3","aDGtSyvOMI","OHaBzUlU3M","FGzgpW3VFH","fcwDaiwzGk","i7WMQAOgEe","i7WMQGrDg7",
+"d7vjMRkQke","9rlg99iGoT","v8yFN4dEz6","Rxrsm9GXkX","uZPqg4W0Tl","CdyBVqQxHP","AkKTkfcJOy","1LB1LPYBf4","dQ586e6e4z","yToGWS77LH",
+"4dEz60Wr5y","pT8wu8U2nU","MojnPs7Mxk","9iGoT5IhmG","Twanopv0i7","IjTwPCqqaD","FjHXRpWiOs","9GXkXCK5W7","AOgEeuJScX","QssNCNo0Qb",
+"fcwDaCp3mZ","ydG8UyToGW","fcwDaCxVEf","VIlwPNo0Qb","SWfouTCgPp","RzaZAdmoS7","1LB1LjeskS","sx5GlBGaQY","zHF1q7Ow5C","yofH345cIH",
+"ogLgci7WMQ","ECMvU9eoRc","QWxoT2Nslm","AXpwELbRTH","AkKTklCMxy","WMiS3nlaBy","vOqCEpv0i7","8hJdtVerEA","lXFOBpFrrl","G1RhSlm0pD",
+"DQimpTwano","i3pyd8FmFH","IBe8kuupzk","mz8gxQnJ1S","hYBCKuTacx","vkCHHydG8U","8TxD72hEEU","s4786QssNC","Yf2Ecru4UG","AkKTkzmLYD",
+"SjskQCK5W7","DQimpzmLYD","Ul4a1tjQxs","RsQUqVBjhz","WaWsvMkgy8","0BmCylpF6W","atef27lUXZ","WMiS3FnPFB","GXdoHjeskS","WMiS3yToGW",
+"VjCZq0ao3l","4W0Tl5drc6","2TRI7M6qcG","hUTw7Waim6","RsQUqLewvM","YjB9tQssNC","JJs5m7fKYU","TCgPpMkgy8","X6Pin5Namm","XflUqru4UG",
+"zFgtBW3VFH","yluBxdpe1v","MezSWgIYvE","48cHLeuZA5","CK5W7uupzk","cQOnvs4786","Gv3FqHlUbF","tlILtIBe8k","QssNCHP433","dmoS7gIYvE",
+"MojnP9rlg9","HzZT8Mkgy8","Yf2EcwiHrZ","cQOnvCK5W7","tAOsrWreyP","In3NSqUJMd","ciuWzzFgtB","tlILtL7cGc","vOqCEfcwDa","In3NSJXljW",
+"LDk6f0Wr5y","mX2GEd7vjM","5IhmGAXpwE","5Mg9r8cVD3","m4bxUix74r","TwanoaFFss","FVMxos7Mxk","dpe1v0ao3l","MojnPgdQsS","jiVBPDz1R3",
+"NcICACK5W7","mX2GE07n1c","8RCUAdQ586","IRh48s4786","5drc6DG4sT","nnP8ozz4ZU","FGzgpWreyP","jeskSpmeCd","mX2GEX6Pin","bZLvSCK5W7",
+"xReecni2v1","s93MlPb1pa","29QAzOUYuF","MmsIonlaBy","Fhtgl5nmWv","lViBvU3yw5","KsjRKbZLvS","iqv4kxciqp","uupzkdQ586","SjskQpFrrl",
+"BCxeC07n1c","zqH0W8hJdt","LbRTH618Di","qaofNIRh48","s47864W0Tl","azIWpHP433","x3LDem4bxU","BGaQY16lHc","7hyVvFNYIM","uAWypUvlv4",
+"BCxeCt59lR","ciuWzyofH3","fLNg8soy9t","ReKEWaL6AJ","zqH0WQworu","uN6r3d85a9","lweGy9iGoT","xReecUlU3M","JXljWjfREu","zbIYYHfyNQ",
+"dhSuHkB5nP","QworuStlDJ","fcwDawDajX","b29RJoQ87r","kB5nPHlUbF","hSSvQcL0aE","Pb1pagf8rI","7fKYUlH1kt","n8pJ9P6bcg","SjskQaFFss",
+"MezSWFxX9q","wDajX8U2nU","QnJ1StjQxs","hUTw7iB08l","CqqaDM6qcG","XflUqbgJAz","zbIYYUl4a1","IKxdLrKDLJ","KsjRKYw2oU","HzZT8Uvlv4",
+"tl72WBCxeC","Fhtgl8U2nU","64s8NL7cGc","TwanouoStw","gdQsSokgRi","8FmFHZhwG1","8hJdt8TxD7","zQt6QxReec","FjHXRVBjhz","OUYuFyEfy9",
+"AIYUu7hyVv","KASQ8zFgtB","HfyNQb29RJ","ZhwG1yofH3","4W0Tl5Drn0","azIWps4786","FFDui6q6L9","MmsIo14FLR","hi5X7jS1aj","jS1aj8U2nU",
+"m4bxUprNT6","d85a9JXljW","Cfgr3wiHrZ","CIShGFnPFB","45cIHRmDcr","IRh486AFT0","zbIYYAXpwE","64s8NwDajX","ZuDtDuZPqg","i3pyd4dEz6",
+"6AFT0ZuDtD","s4786VBjhz","0BmCy0BmCy","uoStwiKqhr","AOgEeCdyBV","dmoS7zHF1q","t98iWpvgjS","aFFsstaOXK","EdBKcBGaQY","Q6Lix1v5hH",
+"5iGN5soy9t","LbRTHcmXIX","7lUXZ7lUXZ","uvf7AAIYUu","Dz1R3hYBCK","cL0aE6AFT0","ksJbyTCgPp","UmaEvxXTI4","AXpwEokgRi","dQ586DQimp",
+"RBhp0HP433","piJSkMGlTF","Uvlv4SWfou","MmKGJVBjhz","guMb824ARF","0KyfsxReec","KASQ8oVQp6","8hJdtfcwDa","euZA5FNYIM","JRJQBPOUYS",
+"29QAzZUnqt","lkMUAi7WMQ","JJs5mjfREu","tuDySG1RhS","gjUTuMaJQs","FwEJz9iGoT","1LB1LbZLvS","Dz1R3GSQwj","sx5GlStlDJ","W7cTsChuy3",
+"CqqaDjS1aj","OxWIHAOgEe","n8pJ9hi5X7","WreyPs7Mxk","blLA9JRJQB","l83UdVerEA","zHF1qVBjhz","Zv7z0vLsmS","XyPZNKASQ8","Cp3mZJkzUn",
+"jzUqRXyPZN","pAhR1jzUqR","uQIczzqH0W","Qworu64s8N","KZamHDQimp","ReKEWFNYIM","VerEAzqH0W","7Ow5CZ4I1v","FVMxoW3VFH","CNHmvDcpWB",
+"v1HlngdQsS","Ul4a1fLNg8","azIWpMkgy8","xXTI48xEKz","ZJTXHJKWYR","v1HlnLDk6f","U3yw5DLhzM","WmadAWPmlx","lViBvFFDui","fqypyDQimp",
+"OHaBzcQOnv","8xEKzMojnP","EoToPhSSvQ","07n1cRzaZA","iB08lyvOMI","FGzgpKZamH","45cIHwiHrZ","9iGoTZJTXH","3otm6QssNC","D6rBypiJSk",
+"TCgPp2TRI7","gdQsS64s8N","hSSvQSjskQ","d7vjMKr8ys","Ta8f6P6bcg","JkzUnaFFss","zHF1qCdyBV","gIYvEGv3Fq","piJSkL7cGc","ZuDtDlXFOB",
+"GrDg7zHF1q","3weIFWmadA","MmKGJqUJMd","CqqaD6q6L9","pWiOsgf8rI","SjskQb29RJ","Z4I1vL7cGc","64s8NRxrsm","AkKTkEOE1o","FcWrWNo0Qb",
+"LDk6f48cHL","okgRidmoS7","FxX9q2DREs","5Drn0OUYuF","a00b5FwEJz","S2DfupWiOs","In3NSY1mC0","M3zXLrz7Ut","pFrrlB3qem","NAFuw2DREs",
+"sx5Gl9y4lw","yToGW7ku1p","RACujHlUbF","QClRL9GXkX","QYxC0XflUq","vLsmSS77LH","S2Dfu1v5hH","brhlQnFqik","Dz1R33weIF","zmLYDtuDyS",
+"yvOMI5Namm","blLA9y94nw","AIYUuxReec","BFkb8AmdQd","9y4lwSbRYy","0PktIUvlv4","qUJMdd85a9","tl72W7lUXZ","0PktIOUYuF","45cIHhE1Ql",
+"fFDrJL7cGc","3weIFoQ87r","zY1GYtl72W","ThjNn45cIH","kZANm3weIF","3weIFwiHrZ","RACujRzaZA","WmadAYh1hF","MmKGJM3zXL","HzZT8RzaZA",
+"ZzJHW07n1c","n8pJ9yluBx","GWqqXPOUYS","mz8gxdjsrv","nlaBynlaBy","RpBQmbZLvS","Waim6MmKGJ","K20wKQ6Lix","2ZHdkJIqXi","8RCUAHP433",
+"HlUbFgf8rI","Ul4a1nnP8o","EOE1oPOUYS","gIYvEPYBf4","uJScXpWiOs","NhXdueuZA5","pFrrlHRxd8","nlaBy4dEz6","FnPFB2DREs","v8yFNix74r",
+"rz7UtMmKGJ","5iGN5RkQke","k85AeF6PT2","v8yFNd7vjM","wiHrZL7cGc","zbIYYiqv4k","zQt6QpFrrl","8RCUAprNT6","cmXIX6AFT0","pv0i7jSjS3",
+"AgJHQaDGtS","NAFuw0YAGH","zQt6Qsx5Gl","Yh1hFRsQUq","piJSk4QMc9","DLhzMzHF1q","atef2GSQwj","B3qemjzUqR","2DREsLDk6f","U3yw5lm0pD",
+"NcICAMkgy8","prNT6QnJ1S","OUqFMM6qcG","C2Ircgf8rI","OUqFMFNYIM","dhSuHWDVWJ","5drc6dQ586","nlaByaez9y","blLA9aFFss","QbxXc9iGoT",
+"y94nwNcICA","RpBQmJKWYR","CIShG07n1c","2TRI7s7Mxk","2TRI7EoToP","kZANmHzZT8","UmaEvWPmlx","vLsmSS2Dfu","W3VFHQworu","5Mg9ryEfy9",
+"9eoRczz4ZU","MK07YJXljW","5IhmGRpBQm","aFFssDLhzM","qaofNCxVEf","2ZHdkblLA9","7fsYMMkgy8","oGu6xIjTwP","blLA9HP433","MojnPa00b5",
+"pWiOsvkCHH","0KyfsFFDui","lViBvRkQke","618DifcwDa","xXTI4ciuWz","WDVWJSmGzv","VNCPdpiJSk","L7cGc9GXkX","Q6hMCHlUbF","0MR5XBGaQY",
+"ulk41dpe1v","HlUbFRzaZA","JkzUnlm0pD","tuDySLewvM","Pb1patlILt","hUTw7rhl0J","b29RJZJTXH","ECMvUCqqaD","lCMxyrhl0J","FnPFBhSSvQ",
+"JXljWtlILt","8TxD7MmKGJ","lXFOB5VZjS","RzaZAAkKTk","PYBf4J2mQi","9y4lwa00b5","mX2GEgIYvE","djsrvRxrsm","RmDcrEdBKc","Chuy3L7cGc",
+"6q6L9S77LH","SWfouK20wK","HlUbFtuDyS","CIShGuJScX","fqypysoy9t","dQ586SWfou","yluBxSbRYy","Q6Lixhi5X7","5NammFhtgl","uTacxWPmlx",
+"W3VFHIjTwP","UlU3MFNYIM","2hEEUkZANm","AOgEeyluBx","IKxdLuPX7G","t59lROz8yZ","JRJQBcQOnv","FVMxogf8rI","bgJAz5nmWv","zbIYYYjB9t",
+"GXdoH24ARF","7X3uyOxWIH","Q6hMCbZLvS","CK5W7s7Mxk","0YAGHFVMxo","KASQ8d7vjM","1LB1LuLtKs","MaJQs5nmWv","Z4I1v0BmCy","FGzgpdmoS7",
+"zbIYYm4bxU","HP4337hyVv","BCxeCWaWsv","EdBKcRBhp0","M3zXLrKDLJ","EdBKcd7vjM","M6qcGB3qem","Z4I1v55rfB","CxVEfDG4sT","suY4x1LB1L",
+"l83Ud48cHL","azIWpjSjS3","guMb8i3pyd","2hEEUCxVEf","dhSuHhe9IA","HlUbFO3iyQ","qQxHP8TxD7","lXFOBzFgtB","G1RhSFFDui","tAOsrh1zcH",
+"2hEEUs4786","WMiS3rhl0J","VLTy68TxD7","vOqCEVjCZq","GWqqXFGzgp","soy9tAXpwE","qaofNtl72W","lj07Qd85a9","x3LDes4786","ZUnqtNcICA",
+"0YAGHjiVBP","tuDySUl4a1","5Mg9rAIYUu","DQimp8xEKz","i3pydh1zcH","fFDrJAXpwE","h1zcHdjsrv","5Drn0uoStw","jtn0XZUnqt","iB08l0YAGH",
+"S2DfuPOUYS","tjQxsiwzGk","guMb8uQIcz","cmXIXazIWp","sqVrfi3pyd","NOHszx3LDe","hUTw7W3VFH","QClRLHP433","t98iWIn3NS","CNHmvJIqXi",
+"VLTy6uupzk","MojnPUl4a1","HzZT8fFDrJ","yluBxgdQsS","EdBKcuvf7A","QChxsyToGW","NOHsz0Wr5y","yluBxQYxC0","I7p2aZJTXH","0YAGHFnPFB",
+"zHF1qSs0Zu","pFrrl0ao3l","YjB9tCqqaD","D6rBye6e4z","CIShGpvgjS","cmXIXVBjhz","580YDrhl0J","d85a9FVMxo","ReKEWk85Ae","RxrsmfcwDa",
+"RmDcrWMiS3","cmXIX2Yz7E","fqypyuAWyp","MojnPfcJOy","FwEJzMGlTF","aez9yatef2","SjskQL7cGc","QYxC0bZLvS","taOXKazIWp","5Mg9rTa8f6",
+"e6e4zYOfrY","kZANmFGzgp","ydG8URsQUq","lH1ktiB08l","lCMxyuAWyp","soy9t3otm6","7Ow5CblLA9","soy9t2hEEU","1v5hHQChxs","gf8rIkZANm",
+"gf8rI7fsYM","F6PT2JIqXi","2Nslmhe9IA","ix74rKsjRK","jeskSk85Ae","Q6hMCtvdkD","FxX9qtjQxs","QChxsQssNC","TXQ0ZTwano","pv0i7NOHsz",
+"tvdkDZzJHW","azIWpxXTI4","CxVEfBCxeC","yEfy9RpBQm","b29RJjzUqR","brhlQpWiOs","pAhR15nmWv","8cVD3EOE1o","G1RhSWaWsv","uupzkMmKGJ",
+"VLTy6BbwgA","24ARFPOUYS","IKxdLtlILt","QWxoT7lUXZ","ix74rVBjhz","FFDuie6e4z","ReKEWD6rBy","2hEEUPb1pa","StlDJNAFuw","WMiS3zFgtB",
+"ru4UGmX2GE","CNHmvlpF6W","FwEJzuupzk","cmXIXNcICA","RxrsmFxX9q","WMiS3vkCHH","JIqXilkMUA","xXTI4okgRi","nFqikgIYvE","0Wr5yfFDrJ",
+"8xEKzChuy3","BbwgAsoy9t","s7MxkK20wK","9XyT9ZhwG1","AkKTkQWxoT","9GXkX5Namm","RACuj6q6L9","NAFuwMaJQs","ReKEWMmKGJ","2TRI7O3iyQ",
+"5iGN5RzaZA","No0QbdmoS7","BbwgA0h1b1","yofH3yEfy9","07n1czqH0W","64s8NRzaZA","iwzGkguMb8","IBe8kKZamH","gdQsSQnJ1S","3otm6ZhwG1",
+"7fKYUVerEA","QbxXcaFFss","QWxoTEoToP","d7vjMC2Irc","Yf2EcksJby","YOfrYJkzUn","uupzk0PktI","MojnPBGaQY","kB5nPUmaEv","1v5hHbgJAz",
+"5nmWvnlaBy","lweGy0Wr5y","ReKEWS2Dfu","zqH0WhE1Ql","5drc6MK07Y","ZJTXHn1pmO","v1Hlnuupzk","mz8gxQYxC0","AgJHQ9GXkX","fLNg8aez9y",
+"kB5nPqUJMd","dmoS7Fhtgl","vkCHHAIYUu","Waim6RkQke","2DREsM6qcG","G1RhSAgJHQ","dpe1vuTacx","FVMxosoy9t","ogLgc8cVD3","Twano2Nslm",
+"fmIK1I7p2a","5Mg9rkB5nP","In3NS7Ow5C","CdyBVyvOMI","soy9tHP433","U3yw5l83Ud","v8yFN64s8N","0Wr5yIjTwP","48cHLuPX7G","OHaBzZuDtD",
+"NOHszmz8gx","brhlQ8FmFH","W3VFHdpe1v","KsjRK4dEz6","yluBxyluBx","ZJTXHokgRi","DcpWB2DREs","mz8gxgf8rI","Yf2EcJkzUn","mX2GEt98iW",
+"b29RJJkzUn","t98iW0YAGH","2TRI7LewvM","8U2nUv8yFN","48cHLcShY2","JXljWLbRTH","d85a98cVD3","K4GS89GXkX","OxWIHgdQsS","dhSuHECMvU",
+"8U2nUMmsIo","cL0aEuupzk","Dz1R3vkCHH","7X3uyW7cTs","8FmFHXyPZN","jS1aji3pyd","64s8NCK5W7","9y4lwzqH0W","zmLYD7fsYM","AOgEeJkzUn",
+"iKqhrJKWYR","EoToPs7Mxk","QYxC0kZANm","JRJQBGSQwj","GSQwjkZANm","qUJMduvf7A","GrDg72Yz7E","yluBxblLA9","pFrrlUl4a1","FwEJzd85a9",
+"WMiS3kZANm","SbRYyJRJQB","taOXKqQxHP","7hyVv8cVD3","9iGoTwiHrZ","GXdoHlXFOB","jSjS3jfREu","piJSkyluBx","kZANmO3iyQ","GrDg7CK5W7",
+"cmXIXoGu6x","DLhzMHlUbF","CIShG48cHL","W3VFHy94nw","zmLYDaL6AJ","ZUnqtaDGtS","W3VFHQbxXc","YjB9tXyPZN","o8UydReKEW","gjUTuuoStw",
+"K20wK6AFT0","2ZHdkJKWYR","5nmWvfqypy","d7vjM5VZjS","Oz8yZpWiOs","fcJOymz8gx","aFFsspFrrl","MmKGJjfREu","lweGytvdkD","WaWsvdQ586",
+"AIYUu9XyT9","dQ586tl72W","qUJMdjSjS3","QYxC0fFDrJ","taOXKQssNC","dmoS7BpYhV","6AFT0v8yFN","oGu6xChuy3","YOfrYDQimp","ciuWzlXFOB",
+"BGaQYt98iW","uupzkStlDJ","IRh48y94nw","ulk41ksJby","B3qemSmGzv","07n1cru4UG","n8pJ9HfyNQ","J2mQi8RCUA","hYBCKWmadA","9rlg9dmoS7",
+"Yw2oUMmsIo","OUqFMzz4ZU","9GXkXbgJAz","atef2d7vjM","J2mQiD6rBy","uupzkBpYhV","suY4xlpF6W","ZuDtDUlU3M","uN6r3CxVEf","RBhp0kB5nP",
+"yEfy9HP433","rz7Utzz4ZU","VBjhzdmoS7","VNCPdCdyBV","aL6AJC2Irc","XyPZNs7Mxk","GSQwjFNYIM","VNCPdaDGtS","SjskQ7fsYM","MmsIomz8gx",
+"pvgjSv2eC3","2hEEUzbIYY","dpe1vbgJAz","uvf7Aaez9y","n1pmO9XyT9","AIYUu7Ow5C","t59lRFFDui","OHaBzgdQsS","fcwDapT8wu","FwEJztl72W",
+"s93MlAmdQd","a00b5VNCPd","7X3uyQworu","FjHXRlweGy","XyPZNOz8yZ","uJScXni2v1","4dEz6ThjNn","MmsIo0h1b1","t98iWnnP8o","d85a9Uvlv4",
+"Mm8siyluBx","6q6L9MK07Y","45cIH0PktI","ThjNn64s8N","v8yFN7ku1p","BpYhV9rlg9","qaofNm4bxU","ZzJHWGv3Fq","QYxC0B3qem","zqH0W7fKYU",
+"wiHrZzbIYY","ZUnqtK4GS8","Yh1hFt59lR","VNCPd16lHc","2TRI7jeskS","Nxx9V0YAGH","TwanoMojnP","ThjNnhUTw7","GWqqXC2Irc","uAWyp2Yz7E",
+"RzaZATa8f6","0PktIsoy9t","he9IAP6bcg","hUTw7JJs5m","AOgEeUvlv4","LDk6fiqv4k","zmLYDDQimp","fFDrJLbRTH","MGlTFThjNn","ZuDtDuupzk",
+"yofH36q6L9","jiVBPFcWrW","L7cGcuupzk","QWxoTs93Ml","pvgjSJKWYR","JRJQB8U2nU","hE1QlCxVEf","t98iWLDk6f","Dz1R35ZaEz","Cp3mZru4UG",
+"hUTw7lpF6W","uQIczPb1pa","pvgjSsx5Gl","e6e4zjtn0X","kB5nPYw2oU","X6Pin9XyT9","1j5L8Pb1pa","iwzGki3pyd","OUYuFjfREu","d85a9Yh1hF",
+"yEfy94W0Tl","faHirn8pJ9","9eoRcIBe8k","hYBCKFcWrW","ZUnqt9GXkX","tl72WoQ87r","8TxD7kB5nP","D6rByLDk6f","VjCZqMezSW","Uvlv4S77LH",
+"MaJQsQbxXc","MezSWlkMUA","JIqXiZ4I1v","lViBv0BmCy","8FmFH4QMc9","Ul4a1lViBv","KASQ88hJdt","X6Pin1v5hH","RzaZAQYxC0","qUJMdFGzgp",
+"2TRI7mX2GE","FNYIMzQt6Q","mX2GEG1RhS","wDajXCIShG","VIlwPogLgc","uTacx29QAz","0YAGHTXQ0Z","0KyfsHRxd8","VerEAEdBKc","ydG8UFGzgp",
+"BCxeCnlaBy","uN6r3hSSvQ","pvgjSdpe1v","TXQ0ZJXljW","L7cGcuJScX","pmeCd8hJdt","XyPZNqaofN","7Ow5Co8Uyd","1LB1LhE1Ql","cShY2ZuDtD",
+"fqypyUl4a1","aez9yPOUYS","prNT6zz4ZU","7hyVvPb1pa","X6PinkZANm","POUYSZv7z0","QssNCydG8U","ciuWzbgJAz","DLhzMpiJSk","gf8rIWaim6",
+"l83UdUlU3M","9GXkXYh1hF","LbRTHtlILt","QbxXcoQ87r","RkQke9GXkX","KsjRKMezSW","5IhmGTwano","zz4ZUqQxHP","blLA9vLsmS","0PktIWPmlx",
+"zmLYDnnP8o","RzaZAAIYUu","IKxdLdhSuH","QssNCAgJHQ","fqypyRsQUq","s7MxkAgJHQ","CK5W7yEfy9","MmKGJbgJAz","aFFssNo0Qb","zHF1qBbwgA",
+"aFFssYw2oU","Mm8si5IhmG","o8UydguMb8","hYBCKZ4I1v","zY1GY4W0Tl","dmoS7S2Dfu","PYBf42DREs","euZA5580YD","OxWIHGWqqX","ciuWzpmeCd",
+"aL6AJW3VFH","LbRTH6AFT0","8hJdth1zcH","dpe1vlm0pD","yofH3hSSvQ","xXTI4Cp3mZ","uLtKsPYBf4","zQt6QCIShG","tl72WuTacx","MaJQsprNT6",
+"5drc6In3NS","9y4lw5Drn0","3otm6MmKGJ","SjskQjeskS","oQ87rlkMUA","guMb8RBhp0","QClRLUmaEv","tl72WECMvU","hUTw7x3LDe","s4786iB08l",
+"SWfou9XyT9","wDajXKZamH","CqqaDUlU3M","pFrrl8xEKz","gtCA5Rxrsm","kZANmeuZA5","qUJMdBCxeC","ni2v1cShY2","prNT65nmWv","DQimp9iGoT",
+"UlU3MxXTI4","WaWsvNOHsz","UmaEv9y4lw","5nmWvbgJAz","QYxC07fKYU","5drc6ZhwG1","2Yz7EG1RhS","3otm6TXQ0Z","QChxscShY2","W7cTsd7vjM",
+"euZA5TCgPp","faHirNOHsz","SWfouqaofN","RzaZA6AFT0","lm0pD5VZjS","oGu6xHP433","cL0aEKr8ys","RACujni2v1","zQt6QP6bcg","ciuWzQbxXc",
+"CxVEfJJs5m","lViBvPb1pa","rhl0JWreyP","8FmFH6AFT0","QssNCi3pyd","RkQkebrhlQ","StlDJnnP8o","Oz8yZuN6r3","5nmWvYh1hF","s47864dEz6",
+"F6PT2Yw2oU","MGlTFfFDrJ","G1RhSkB5nP","AmdQduQIcz","dmoS7he9IA","uQIczbrhlQ","QClRLuPX7G","GXdoH6AFT0","VBjhzo8Uyd","JKWYRQClRL",
+"Mkgy8ciuWz","d7vjMazIWp","L7cGcQworu","ZhwG10YAGH","FcWrWJIqXi","TCgPpzz4ZU","9XyT9v2eC3","okgRi2Nslm","iqv4kSjskQ","Nxx9VHlUbF",
+"jfREuC2Irc","WmadAv8yFN","hi5X7FcWrW","aL6AJ5IhmG","fmIK1JKWYR","NOHszQworu","RACuj0ao3l","nlaByjiVBP","suY4xU3yw5","ksJbycQOnv",
+"cmXIXQYxC0","5iGN5OxWIH","WmadApWiOs","WaWsvThjNn","LbRTHaL6AJ","2hEEUhe9IA","3otm6yEfy9","5IhmGlsQGo","5NammOz8yZ","vkCHHaFFss",
+"ni2v1Q6hMC","CNHmvXflUq","Yh1hFfLNg8","Pb1paVjCZq","zHF1qTXQ0Z","X6PinQ6Lix","S2DfuaL6AJ","Kr8ysVIlwP","wDajX7X3uy","yvOMI9iGoT",
+"RkQkeJKWYR","xXTI4jtn0X","Yw2oUpT8wu","5nmWvl83Ud","HfyNQYf2Ec","FFDuijfREu","Y1mC0P6bcg","zqH0WQ6Lix","MmsIobZLvS","i3pyduvf7A",
+"zFgtBjS1aj","yvOMIvOqCE","0YAGHogLgc","OxWIH5Namm","t98iWo8Uyd","IBe8kCxVEf","ogLgcO3iyQ","ZhwG1jiVBP","ydG8Ub29RJ","b29RJzz4ZU",
+"MaJQsAOgEe","Rxrsmk85Ae","MmsIoYjB9t","9eoRcGv3Fq","RpBQmSjskQ","DG4sTb29RJ","BFkb8pFrrl","0MR5XDLhzM","O3iyQ0Kyfs","W3VFHReKEW",
+"gjUTuGv3Fq","BbwgAnFqik","Mm8siL7cGc","hSSvQMkgy8","7fKYUfcwDa","Q6LixMaJQs","ZzJHWcL0aE","SWfouuoStw","2hEEU2TRI7","9rlg9RzaZA",
+"dmoS7oGu6x","OxWIHgtCA5","lH1ktJRJQB","pAhR1ksJby","8U2nUMkgy8","ix74r07n1c","fqypyrhl0J","l83UdM6qcG","OUqFMXflUq","S2Dfu0PktI",
+"VjCZqJJs5m","Twano7ku1p","CIShGBGaQY","YjB9tSbRYy","VIlwPtAOsr","RsQUqtAOsr","FFDuiM3zXL","v8yFNSmGzv","3weIFVerEA","7fKYUBCxeC",
+"0MR5XO3iyQ","B3qemQChxs","Kr8ysYh1hF","dpe1vWaim6","sqVrfxciqp","ThjNnBGaQY","cShY2uQIcz","v2eC3uJScX","fcwDaFnPFB","AOgEex3LDe",
+"Waim61LB1L","y94nwRpBQm","y94nwAXpwE","WaWsvlsQGo","Gv3FqJkzUn","8U2nUlViBv","fFDrJWDVWJ","iKqhrRxrsm","hE1QlNhXdu","IKxdLiwzGk",
+"ZhwG1VLTy6","brhlQIBe8k","RzaZAThjNn","tjQxs5drc6","ni2v1ksJby","gtCA5MezSW","kB5nPBpYhV","yvOMIn8pJ9","8FmFHjeskS","7fKYUy94nw",
+"IBe8kuAWyp","yluBxiwzGk","taOXK14FLR","aFFssChuy3","5VZjSVjCZq","euZA5In3NS","QssNCKASQ8","6AFT0LewvM","jSjS3StlDJ","NhXduSbRYy",
+"lCMxy3otm6","cShY23otm6","ECMvUU3yw5","Ta8f6Z4I1v","9rlg9ksJby","16lHcru4UG","uoStwzmLYD","uTacx5drc6","nFqiko8Uyd","6AFT0nFqik",
+"LewvMTwano","guMb8oVQp6","CqqaD2hEEU","14FLRnnP8o","ZzJHWMGlTF","oQ87rMmsIo","gtCA5Yh1hF","FVMxoKr8ys","cQOnv5IhmG","xReecRpBQm",
+"jS1aj2hEEU","FwEJzogLgc","WaWsv5iGN5","FcWrW5VZjS","VBjhzt98iW","WreyPzz4ZU","S77LH7X3uy","mz8gxWaim6","Mkgy8yofH3","lH1ktzqH0W",
+"VNCPdaez9y","vLsmSMGlTF","14FLRzHF1q","SjskQ8hJdt","CdyBVfqypy","wiHrZgtCA5","xXTI4oGu6x","3weIFTCgPp","W7cTsoQ87r","jiVBPsuY4x",
+"AOgEeHlUbF","IBe8khi5X7","TXQ0ZzmLYD","7X3uyRpBQm","sqVrfiqv4k","zHF1qWreyP","kZANm0Wr5y","gf8rIwDajX","RmDcrK4GS8","gdQsSWmadA",
+"HzZT8zQt6Q","YjB9t8U2nU","OUqFMuJScX","X6Pin9GXkX","0Wr5yUlU3M","8hJdtSbRYy","QWxoTFVMxo","yluBx3otm6","tlILthE1Ql","RpBQm7fsYM",
+"VerEA0Kyfs","bgJAzAXpwE","jeskSVNCPd","wiHrZ7X3uy","In3NSQChxs","2DREsFcWrW","t59lRMezSW","VNCPdi3pyd","1v5hHQYxC0","yluBxRzaZA",
+"Yf2Ec0Kyfs","vkCHHNxx9V","yvOMI16lHc","Q6hMCFxX9q","bZLvSRmDcr","2DREs2TRI7","U3yw5he9IA","atef2lm0pD","MmKGJ0Wr5y","3weIFpv0i7",
+"CIShGQYxC0","s4786HzZT8","6AFT02TRI7","QnJ1SuPX7G","EdBKc5nmWv","pT8wublLA9","v2eC3BCxeC","OxWIHulk41","EdBKcAOgEe","gjUTulkMUA",
+"IRh48vkCHH","ZzJHWi7WMQ","B3qemRpBQm","7lUXZBpYhV","s7Mxk0h1b1","5VZjShi5X7","l83UdWaim6","v2eC3HRxd8","DcpWBgdQsS","Q6LixgIYvE",
+"7ku1psqVrf","6AFT0FFDui","jS1ajulk41","CdyBVpmeCd","uAWypo8Uyd","fLNg8zHF1q","4QMc9HRxd8","CK5W7VIlwP","7fsYMgIYvE","7hyVv0MR5X",
+"K20wKRACuj","fqypyNcICA","BCxeCFcWrW","KASQ8dpe1v","EdBKcx3LDe","618DicShY2","7lUXZQbxXc","yvOMIuoStw","2TRI7NhXdu","gIYvEQClRL",
+"618Di618Di","YOfrYDLhzM","5nmWvi3pyd","s93MlNhXdu","2DREsGXdoH","5VZjShSSvQ","5ZaEzkZANm","qQxHPogLgc","SWfouiqv4k","nFqik9iGoT",
+"QbxXcY1mC0","ni2v1Cp3mZ","BCxeC5Mg9r","MaJQsP6bcg","pT8wuL7cGc","4dEz6iqv4k","9eoRcuLtKs","RmDcrU3yw5","CqqaDiKqhr","aFFssFFDui",
+"pv0i7ECMvU","BCxeCRzaZA","DG4sTatef2","64s8N24ARF","FnPFBvkCHH","gdQsSlsQGo","DLhzMW7cTs","zFgtBnFqik","4W0TlFnPFB","OHaBz5IhmG",
+"tuDySh1zcH","VjCZq7fsYM","t98iWlsQGo","brhlQ14FLR","JJs5mFxX9q","FjHXRhSSvQ","pvgjSYw2oU","45cIH580YD","hi5X7dhSuH","1v5hHAgJHQ",
+"NcICAM3zXL","uPX7GQ6hMC","fcJOykZANm","6AFT0Fhtgl","ZJTXHDLhzM","8hJdtVprf2","W7cTsatef2","AOgEekZANm","jS1aj8TxD7","MezSWHzZT8",
+"G1RhS8cVD3","PYBf4tAOsr","suY4xUmaEv","kB5nPrKDLJ","CNHmvZzJHW","ru4UGaez9y","qQxHPsx5Gl","lXFOBGrDg7","soy9tzQt6Q","4W0Tltl72W",
+"FxX9qY1mC0","WaWsv3weIF","8RCUAzHF1q","BpYhVQbxXc","QWxoT7Ow5C","aFFssUvlv4","ciuWz8TxD7","CNHmvfqypy","pv0i75ZaEz","ECMvUlm0pD",
+"zHF1qCfgr3","64s8NOxWIH","Waim6C2Irc","piJSkdmoS7","AmdQdTCgPp","TwanoyvOMI","nlaByCqqaD","WDVWJC2Irc","2TRI7iB08l","FhtglpAhR1",
+"RBhp05Namm","ulk41IRh48","CdyBVDcpWB","uTacxoQ87r","Oz8yZrKDLJ","0MR5X8cVD3","0PktIM6qcG","l83UdQChxs","hE1Ql5VZjS","cmXIX6q6L9",
+"he9IAhSSvQ","ni2v1DG4sT","AgJHQQworu","1j5L8RBhp0","K4GS89y4lw","GWqqX2DREs","ni2v1SWfou","aDGtSZv7z0","3otm6oGu6x","uJScXSbRYy",
+"IjTwP0Wr5y","MmsIokZANm","Cfgr3aez9y","DcpWBtvdkD","bZLvSK20wK","brhlQFVMxo","HfyNQlCMxy","oVQp6jeskS","MaJQspiJSk","TCgPp0MR5X",
+"BbwgAVprf2","mX2GEWDVWJ","lXFOBWreyP","JXljWRsQUq","tvdkDwDajX","EdBKc9y4lw","i3pydYw2oU","v1Hln8RCUA","xReecjfREu","5ZaEzkB5nP",
+"Gv3FqlViBv","lsQGoQ6hMC","0PktIo8Uyd","XflUqJ2mQi","ulk41dQ586","XflUqgdQsS","o8UydaDGtS","L7cGcW7cTs","618DiF6PT2","faHir0Wr5y",
+"7fsYMrKDLJ","W3VFH5ZaEz","I7p2abgJAz","MojnPO3iyQ","3otm6ksJby","JIqXini2v1","45cIHAgJHQ","VNCPdn8pJ9","5drc6SjskQ","9eoRcqQxHP",
+"SjskQsoy9t","SmGzv9GXkX","pAhR1uupzk","TCgPpFwEJz","xXTI4ogLgc","soy9tlpF6W","HRxd8iwzGk","W3VFHjtn0X","Dz1R3FFDui","Ss0ZuVLTy6",
+"WPmlxvkCHH","okgRiZzJHW","BCxeCIRh48","jtn0XQYxC0","7lUXZlkMUA","580YDCfgr3","gjUTuzqH0W","JXljWx3LDe","8TxD7mz8gx","ZhwG10Wr5y",
+"fLNg8RmDcr","x3LDeYf2Ec","OxWIHRpBQm","ZzJHW9eoRc","ZJTXHYf2Ec","8U2nUjS1aj","FVMxoiKqhr","Z4I1vFNYIM","EOE1obgJAz","mz8gxVBjhz",
+"ZJTXHi3pyd","OUqFMi7WMQ","tAOsrIRh48","dpe1vFGzgp","64s8NQWxoT","VNCPd3weIF","zHF1qFwEJz","Dz1R3fFDrJ","euZA5MK07Y","rz7UtaFFss",
+"jtn0Xdpe1v","UlU3MMK07Y","3weIFTXQ0Z","JRJQB5ZaEz","OUqFMuLtKs","xXTI4FLsph","AmdQdOUYuF","bZLvSogLgc","yofH3JRJQB","ReKEWlXFOB",
+"AgJHQx3LDe","m4bxURpBQm","QWxoT618Di","QChxsyofH3","jeskSfaHir","uTacxRsQUq","n1pmOsuY4x","OHaBzuvf7A","SbRYyP6bcg","qaofNZJTXH",
+"Gv3FqJKWYR","7lUXZUlU3M","JkzUnWaim6","580YDOUYuF","ZUnqtDz1R3","v1HlnRpBQm","ReKEWIKxdL","S2DfuMezSW","UlU3MpvgjS","cQOnvdQ586",
+"14FLRNxx9V","SWfoufFDrJ","618Di0ao3l","RBhp0blLA9","oQ87rWaim6","wDajXBbwgA","uQIcztjQxs","OxWIHvkCHH","8RCUAuvf7A","FLsphXyPZN",
+"07n1cKr8ys","QWxoT64s8N","CxVEflweGy","djsrvlCMxy","0BmCy4W0Tl","7hyVvhE1Ql","yToGWru4UG","aL6AJ3otm6","NhXdu5nmWv","EdBKcmX2GE",
+"fcJOyuupzk","Q6hMCxciqp","oQ87rTwano","ThjNnv2eC3","UmaEvAIYUu","Pb1paIRh48","FFDuiTwano","W3VFH14FLR","JXljWn1pmO","xciqp2DREs",
+"fcwDa0PktI","v2eC3pvgjS","tuDySS2Dfu","LDk6f6AFT0","dQ586Fhtgl","sqVrfVprf2","aFFssP6bcg","JRJQB5drc6","DG4sTNo0Qb","rKDLJiKqhr",
+"Pb1paaFFss","Q6LixCqqaD","pvgjSVerEA","gIYvEWDVWJ","EOE1oCfgr3","WDVWJ8xEKz","Nxx9VMaJQs","Q6LixJKWYR","yofH3bgJAz","okgRiJ2mQi",
+"0MR5XcL0aE","y94nwcQOnv","uN6r3VjCZq","wDajXMK07Y","ReKEWo8Uyd","J2mQiiqv4k","sx5Gllj07Q","soy9tfmIK1","Oz8yZMGlTF","QWxoTKZamH",
+"QYxC0Ta8f6","sqVrfCIShG","POUYSt59lR","uQIczVBjhz","CqqaDNcICA","Waim6DQimp","ZhwG1soy9t","WDVWJt59lR","gIYvEdQ586","jzUqR9XyT9",
+"VLTy6blLA9","FVMxoyluBx","pv0i7Y1mC0","sx5GlCIShG","ru4UGk85Ae","BbwgAGv3Fq","aDGtSru4UG","wDajXNo0Qb","8cVD35Mg9r","24ARFnFqik",
+"he9IAs4786","lweGyWMiS3","wiHrZqQxHP","7ku1phe9IA","Z4I1vzmLYD","ThjNnlViBv","ix74rTwano","9GXkXIBe8k","OUYuF3weIF","KsjRKazIWp",
+"QYxC0uZPqg","EoToPDG4sT","GSQwjLbRTH","9y4lwOUYuF","5Mg9raDGtS","iKqhrTa8f6","guMb8S2Dfu","jzUqRI7p2a","Nxx9VY1mC0","KsjRKqQxHP",
+"9iGoTOUYuF","d85a9blLA9","mz8gxK4GS8","b29RJn8pJ9","FGzgpoGu6x","9iGoTuAWyp","uLtKsFFDui","iwzGk64s8N","UmaEvWMiS3","azIWpS77LH",
+"J2mQi5Mg9r","lm0pDYjB9t","TCgPp2hEEU","OHaBzkB5nP","lm0pDX6Pin","aL6AJguMb8","FPfSEJJs5m","2ZHdkpv0i7","EoToPFNYIM","uZPqgHP433",
+"FLsph8U2nU","mX2GEy94nw","piJSkcL0aE","C2IrcuJScX","1v5hHVprf2","J2mQit98iW","24ARFhE1Ql","WMiS3fLNg8","gf8rIpvgjS","tAOsr64s8N",
+"QChxswiHrZ","iB08lRzaZA","DcpWBpv0i7","W3VFHW7cTs","BGaQYNAFuw","9GXkXix74r","WDVWJhE1Ql","GXdoHHzZT8","64s8N1LB1L","i3pydQChxs",
+"ni2v1lm0pD","BFkb8AgJHQ","vOqCECNHmv","7Ow5CjiVBP","e6e4zMaJQs","7Ow5CFnPFB","gf8rIWreyP","uLtKsFNYIM","QbxXcCp3mZ","aFFssZuDtD",
+"lCMxyVerEA","7X3uyjeskS","0PktIksJby","euZA5pmeCd","VjCZqQssNC","tAOsrHzZT8","ZUnqtIKxdL","TXQ0Z64s8N","d85a9dQ586","DcpWBQssNC",
+"tlILt2hEEU","KsjRKjfREu","SbRYyStlDJ","zHF1qFxX9q","qUJMdXyPZN","pFrrliwzGk","o8Uyd55rfB","3weIF5VZjS","JXljW5nmWv","i7WMQQYxC0",
+"Waim6Z4I1v","RACujGXdoH","k85AezQt6Q","SjskQvOqCE","D6rByNAFuw","HlUbFt59lR","RACuj8cVD3","9iGoT0ao3l","x3LDepAhR1","pmeCd0Wr5y",
+"2hEEU7Ow5C","gtCA5MaJQs","5ZaEzgIYvE","AkKTknnP8o","CxVEfYOfrY","pvgjSqQxHP","v1HlnRxrsm","UlU3Miqv4k","5ZaEzuPX7G","iB08lFGzgp",
+"he9IAvkCHH","oQ87rs93Ml","lkMUAs93Ml","k85AeNo0Qb","Mkgy8he9IA","t98iWBbwgA","pmeCdAOgEe","ix74rI7p2a","Oz8yZpv0i7","iqv4kgdQsS",
+"0BmCy7fKYU","OUqFMTa8f6","RxrsmHfyNQ","LbRTH64s8N","JkzUnNxx9V","VBjhzfaHir","GrDg7KASQ8","pAhR1rKDLJ","QbxXcRsQUq","KsjRKO3iyQ",
+"HzZT8UlU3M","Y1mC0yluBx","Z4I1vDLhzM","JRJQB0MR5X","oGu6xRkQke","uLtKsl83Ud","fqypyPb1pa","WDVWJMK07Y","Ss0ZuRzaZA","5IhmGuoStw",
+"4W0TlpvgjS","lpF6WHzZT8","yofH3iwzGk","s7MxkSmGzv","zz4ZUVjCZq","EoToPwDajX","POUYStuDyS","5VZjSksJby","EoToP8cVD3","Gv3FqMaJQs",
+"RmDcrNo0Qb","aez9yh1zcH","azIWphe9IA","CqqaDFFDui","FNYIM9rlg9","yEfy9fLNg8","tjQxs7Ow5C","soy9tqQxHP","EdBKcbrhlQ","FNYIMOUYuF",
+"55rfBdpe1v","RpBQm0Wr5y","UlU3MFhtgl","FhtglDQimp","GrDg7RkQke","DQimp4QMc9","0MR5XmX2GE","C2Irc7ku1p","BFkb8ciuWz","D6rByi7WMQ",
+"UlU3MVLTy6","n1pmOgtCA5","atef2zFgtB","3weIFlsQGo","gdQsSpFrrl","WaWsvfqypy","MGlTFgIYvE","WPmlxwDajX","tvdkDcQOnv","8FmFHPYBf4",
+"HP433zHF1q","RmDcrQ6Lix","K4GS8EOE1o","QChxsb29RJ","TCgPpFjHXR","he9IABCxeC","zqH0Watef2","9y4lw0ao3l","S2DfuK20wK","MezSWAkKTk",
+"pv0i7AmdQd","UmaEvYh1hF","Y1mC0dmoS7","gdQsS1v5hH","qaofNpT8wu","CxVEfSs0Zu","EoToPJ2mQi","e6e4zIn3NS","uN6r3mX2GE","Nxx9Vgf8rI",
+"9iGoT5iGN5","4W0TlJKWYR","Ta8f6zqH0W","aDGtSXflUq","uQIczjiVBP","StlDJDcpWB","QChxsCqqaD","Cfgr37Ow5C","mz8gx8TxD7","5Mg9rNhXdu",
+"0PktI2Yz7E","euZA5cShY2","KASQ8oGu6x","AkKTkKASQ8","rz7UtvOqCE","QworuZv7z0","WaWsvQ6Lix","GWqqXCfgr3","07n1cFGzgp","n8pJ9fqypy",
+"tvdkDzz4ZU","e6e4zhe9IA","aDGtS07n1c","zFgtBh1zcH","yToGWW3VFH","C2Irca00b5","AOgEeJ2mQi","ZJTXHWPmlx","WMiS3fqypy","hSSvQwiHrZ",
+"AgJHQrhl0J","ECMvUW7cTs","l83UdtjQxs","D6rBygdQsS","cQOnvQworu","Zv7z0ni2v1","Gv3FqwDajX","ydG8U5ZaEz","618DiydG8U","MaJQszmLYD",
+"7X3uyAgJHQ","Z4I1vokgRi","KsjRKAIYUu","l83UdkB5nP","9eoRcReKEW","fcwDa7X3uy","EdBKcuAWyp","FwEJzCxVEf","dQ586n1pmO","GXdoHs7Mxk",
+"JKWYRZuDtD","aez9ybZLvS","BpYhVVIlwP","faHir1v5hH","rz7UtOUqFM","aez9yReKEW","0YAGHm4bxU","QWxoTrKDLJ","FGzgpVLTy6","MojnPfmIK1",
+"FGzgpAmdQd","lsQGoPOUYS","TCgPphYBCK","I7p2aRACuj","WreyPogLgc","s4786DG4sT","lj07QOxWIH","he9IATCgPp","lweGy8hJdt","Ul4a1zFgtB",
+"ZhwG1x3LDe","ni2v1yofH3","ZUnqtxReec","IRh48gjUTu","gtCA55drc6","aDGtSFwEJz","8U2nUFGzgp","fcJOyi7WMQ","LbRTHjfREu","W7cTsMmsIo",
+"ulk41P6bcg","QbxXc6q6L9","AmdQdSbRYy","uPX7Gt98iW","07n1cuTacx","TwanoJXljW","d7vjMWreyP","djsrvxciqp","M3zXLZhwG1","3weIFgjUTu",
+"8TxD7QClRL","WDVWJQssNC","CK5W79y4lw","2Yz7Ey94nw","Vprf2RBhp0","taOXKokgRi","mz8gxHfyNQ","IBe8koGu6x","14FLRv8yFN","7lUXZQYxC0",
+"zFgtBB3qem","QYxC01j5L8","5drc6PYBf4","JRJQB2TRI7","7fsYMWaim6","Mkgy8d85a9","618DiRACuj","8cVD3mz8gx","lCMxy48cHL","fcwDamz8gx",
+"VerEAcmXIX","d85a9zHF1q","rhl0JVIlwP","S77LH8xEKz","CNHmv5Drn0","9XyT9Zv7z0","JRJQBblLA9","Dz1R3JKWYR","9y4lwPYBf4","yvOMIAgJHQ",
+"5Mg9rogLgc","lCMxyWDVWJ","JIqXiECMvU","taOXKB3qem","xciqpzqH0W","FjHXRpv0i7","mX2GEY1mC0","9iGoTbZLvS","wDajXkZANm","RpBQm3weIF",
+"5ZaEzulk41","FcWrWfaHir","JRJQBQ6Lix","faHirtvdkD","M3zXLLDk6f","JkzUn24ARF","rz7Utrhl0J","ThjNncShY2","Ta8f6ulk41","cL0aEZhwG1",
+"X6Pin5Drn0","suY4xpFrrl","dhSuHl83Ud","yluBxt59lR","7lUXZCxVEf","RxrsmPb1pa","dQ5861v5hH","IBe8kVBjhz","16lHcRpBQm","l83UdJJs5m",
+"cQOnvZ4I1v","1j5L8yToGW","ZuDtDF6PT2","PYBf4RkQke","gjUTuZuDtD","P6bcgix74r","D6rBy5Drn0","ix74rYOfrY","NcICA8RCUA","atef2VLTy6",
+"BpYhVuoStw","dpe1vyvOMI","Waim6piJSk","FxX9qJkzUn","mz8gxZUnqt","LbRTHlsQGo","ZuDtDy94nw","xXTI47fsYM","5drc6Fhtgl","x3LDelXFOB",
+"cL0aEYjB9t","HzZT8AXpwE","MojnPqaofN","1j5L8yofH3","atef2pvgjS","OHaBzjS1aj","BpYhVcQOnv","ZuDtDrz7Ut","LewvMJkzUn","uN6r3iwzGk",
+"YjB9tY1mC0","IjTwP8TxD7","FPfSEM3zXL","L7cGcAmdQd","soy9t8xEKz","ZuDtDMK07Y","UlU3McmXIX","S77LHuvf7A","piJSkoVQp6","IjTwPfFDrJ",
+"lH1ktFVMxo","ZhwG1a00b5","WMiS3D6rBy","24ARF14FLR","uupzkv1Hln","iqv4kD6rBy","L7cGc8cVD3","dmoS7piJSk","i3pydYjB9t","AgJHQ9rlg9",
+"ZhwG1lpF6W","Nxx9VKZamH","prNT6oVQp6","HzZT8AOgEe","9y4lwRpBQm","atef22hEEU","580YDRzaZA","VLTy6lCMxy","Ta8f61LB1L","9XyT9aDGtS",
+"Mkgy8nlaBy","AXpwEtAOsr","pT8wuZuDtD","cL0aE0YAGH","zmLYDFxX9q","ReKEWtjQxs","aDGtSuAWyp","TXQ0Z7fsYM","CxVEfv2eC3","24ARFaL6AJ",
+"d7vjMY1mC0","uZPqgs7Mxk","5Drn045cIH","a00b5iKqhr","uvf7At59lR","FwEJzni2v1","0MR5X9y4lw","FPfSEpvgjS","WaWsvOz8yZ","uZPqgmX2GE",
+"zFgtBCfgr3","pmeCdsqVrf","aez9yQChxs","atef2dpe1v","aL6AJ7hyVv","aDGtSUmaEv","CdyBVuN6r3","WMiS3e6e4z","2ZHdkv2eC3","O3iyQfqypy",
+"aDGtSHzZT8","rKDLJdpe1v","qaofNkB5nP","NhXduJkzUn","uQIczRzaZA","HP433jtn0X","Yh1hFtAOsr","Zv7z0Nxx9V","JKWYR618Di","NhXduRzaZA",
+"NcICA64s8N","MojnPIRh48","CxVEfDz1R3","HP433StlDJ","WaWsvuAWyp","8FmFHMmKGJ","EOE1oU3yw5","NAFuwHzZT8","AmdQdChuy3","7lUXZO3iyQ",
+"2NslmDcpWB","y94nwVLTy6","cL0aECqqaD","fqypyZv7z0","fcJOyMojnP","nFqikqUJMd","tvdkDtaOXK","lj07Q618Di","X6Piny94nw","s4786JRJQB",
+"3otm6QnJ1S","fmIK1HfyNQ","hSSvQtAOsr","0h1b1FwEJz","v1HlnNOHsz","SjskQFGzgp","RkQke5Namm","F6PT2suY4x","gdQsSfLNg8","WMiS3bZLvS",
+"AXpwEEOE1o","5Drn0gf8rI","ZzJHWLDk6f","0MR5XCK5W7","WaWsvciuWz","faHirSjskQ","CIShG5VZjS","fqypy5Namm","yvOMIYjB9t","fqypytjQxs",
+"0YAGHJXljW","zbIYY9rlg9","pWiOsYh1hF","ydG8Us93Ml","2DREsnFqik","AgJHQjfREu","Oz8yZ0h1b1","64s8NIRh48","hE1QlBGaQY","Waim6FPfSE",
+"Mm8siU3yw5","gIYvEjfREu","nnP8ouTacx","FLsphQYxC0","hSSvQRzaZA","t59lRWaWsv","ciuWzFhtgl","Nxx9VoGu6x","fFDrJVjCZq","F6PT2v1Hln",
+"jfREutuDyS","5Drn0QYxC0","n1pmOFLsph","8U2nUi3pyd","0PktIP6bcg","CK5W75VZjS","i7WMQokgRi","tl72WjfREu","8U2nUZuDtD","uLtKsQChxs",
+"29QAzt98iW","mX2GE0Kyfs","nnP8olj07Q","zHF1qyvOMI","dhSuHyluBx","G1RhSLewvM","uPX7GksJby","QYxC0yEfy9","n8pJ9EOE1o","tl72WpWiOs",
+"In3NSyvOMI","No0QbrKDLJ","2Yz7EhYBCK","EdBKc618Di","MaJQsjiVBP","VLTy65IhmG","cmXIXYOfrY","0YAGHOUqFM","ix74rv8yFN","d7vjMAkKTk",
+"ZhwG116lHc","ru4UGa00b5","tjQxsaL6AJ","zmLYD7fKYU","lkMUA6q6L9","5VZjSazIWp","M3zXLCfgr3","pmeCdaDGtS","5iGN5MGlTF","Cp3mZaFFss",
+"HRxd85iGN5","M6qcGiwzGk","uN6r3euZA5","AgJHQDLhzM","Dz1R3Mm8si","h1zcHSbRYy","uTacxpvgjS","soy9tM6qcG","618Di7X3uy","WreyPEOE1o",
+"FLsph48cHL","uoStwB3qem","QworuCdyBV","ni2v1FVMxo","OUqFM7fKYU","GWqqXChuy3","tlILte6e4z","Ta8f6FPfSE","mz8gx5Mg9r","EOE1o0Wr5y",
+"Cp3mZ0h1b1","JKWYRKASQ8","7fsYMUl4a1","JIqXi5Namm","fcJOypiJSk","l83UdfLNg8","9GXkXWaWsv","7fKYUkB5nP","No0QbMK07Y","24ARFhe9IA",
+"y94nwpv0i7","EOE1o0PktI","hUTw78U2nU","EoToPRzaZA","KsjRKOxWIH","No0Qbt59lR","v8yFNS77LH","hE1QlguMb8","tuDySv8yFN","PYBf4QClRL",
+"RpBQmOUqFM","aL6AJIjTwP","hE1QltlILt","48cHLmz8gx","7hyVvTXQ0Z","zbIYYRxrsm","xciqpVNCPd","jtn0X64s8N","MaJQscShY2","FFDuilpF6W",
+"KsjRKUvlv4","48cHLaez9y","y94nwWreyP","4QMc9ReKEW","CIShGPOUYS","C2IrcJ2mQi","zHF1qtuDyS","Zv7z0vOqCE","s7MxkAIYUu","lXFOBDLhzM",
+"iKqhrFcWrW","Oz8yZL7cGc","RsQUqThjNn","Z4I1vPb1pa","RpBQmEOE1o","3weIF7fKYU","n8pJ9WreyP","BpYhV5Mg9r","rz7UtHRxd8","W3VFHZ4I1v",
+"tlILtxReec","2NslmNxx9V","zHF1qStlDJ","ZUnqtt98iW","lpF6WW3VFH","29QAzW3VFH","brhlQLbRTH","lweGyyluBx","5Drn02Nslm","pFrrlsqVrf",
+"yEfy9n8pJ9","jS1ajdhSuH","IRh48i3pyd","M3zXLuoStw","Cfgr3AgJHQ","29QAzMaJQs","DG4sTEOE1o","lweGy3otm6","8U2nUCqqaD","jSjS3ogLgc",
+"Dz1R3ulk41","pmeCdyEfy9","VjCZquvf7A","rhl0J3otm6","gtCA5jiVBP","MezSWYw2oU","W7cTsdpe1v","qUJMdfLNg8","9rlg9nnP8o","FxX9quJScX",
+"DG4sTFGzgp","zqH0Wulk41","K4GS8WMiS3","RkQkeydG8U","LewvMdmoS7","PYBf4tlILt","GrDg7VjCZq","WPmlxZhwG1","Vprf2uPX7G","ix74r9GXkX",
+"MaJQsKZamH","JkzUnuZPqg","W3VFHkB5nP","6AFT0RmDcr","Q6Lix5VZjS","Yh1hFWreyP","7ku1pQClRL","vOqCE6q6L9","8RCUA5IhmG","tAOsrD6rBy",
+"zz4ZU1LB1L","WDVWJ3otm6","ksJbyGrDg7","2ZHdkru4UG","WaWsvfmIK1","FxX9qQ6hMC","7X3uyDG4sT","ZJTXHtvdkD","gf8rIZzJHW","yluBxK4GS8",
+"ulk41tvdkD","QworuC2Irc","QWxoTyofH3","fqypyRpBQm","WPmlxBpYhV","zY1GYguMb8","7lUXZ9rlg9","euZA5pFrrl","gf8rIOUYuF","2Yz7EtvdkD",
+"45cIH0ao3l","EdBKcWDVWJ","0KyfsOxWIH","F6PT2iB08l","FGzgpY1mC0","2hEEUKZamH","FFDuin8pJ9","Rxrsm5ZaEz","soy9t8RCUA","gtCA58U2nU",
+"pWiOsZv7z0","YOfrYIjTwP","mz8gxdmoS7","BGaQYsoy9t","tAOsrEdBKc","gdQsSlXFOB","he9IAqaofN","3otm6kZANm","Oz8yZDLhzM","FcWrWoQ87r",
+"pmeCdM6qcG","J2mQiQworu","CqqaDn8pJ9","lpF6WKr8ys","EdBKcZ4I1v","ogLgcnnP8o","FjHXRpFrrl","0ao3lNAFuw","uQIczO3iyQ","0Wr5yC2Irc",
+"dmoS7bZLvS","W3VFHtlILt","e6e4zydG8U","QnJ1SEdBKc","wiHrZvOqCE","7hyVv5nmWv","okgRioQ87r","Nxx9VYw2oU","AIYUuPb1pa","QWxoT0ao3l",
+"pvgjSFcWrW","HlUbFGWqqX","hi5X7h1zcH","ZhwG1cmXIX","WDVWJ5Namm","MK07Yd7vjM","aDGtS8FmFH","9eoRc7ku1p","hi5X79GXkX","n8pJ9J2mQi",
+"ix74rkZANm","RzaZAMmKGJ","5iGN5FLsph","Z4I1vx3LDe","fLNg87fKYU","1j5L85nmWv","RBhp0djsrv","HlUbFQ6Lix","2NslmK20wK","FwEJzqaofN",
+"0h1b1zqH0W","DG4sTyEfy9","ZhwG1prNT6","FcWrWNhXdu","GXdoHfFDrJ","ksJbyQYxC0","zHF1qYw2oU","5iGN5e6e4z","brhlQRzaZA","FcWrWqaofN",
+"5Namm24ARF","oGu6xi3pyd","5Mg9rjfREu","djsrvVNCPd","fmIK1GrDg7","SjskQfcwDa","BGaQY55rfB","y94nwwiHrZ","0h1b1tlILt","tjQxsCxVEf",
+"RsQUqWaWsv","azIWptvdkD","h1zcHkZANm","4W0TlAXpwE","FcWrWyToGW","uPX7GKZamH","xXTI4l83Ud","JJs5mokgRi","BCxeCFjHXR","d85a9VerEA",
+"gtCA5Ss0Zu","LDk6fh1zcH","wiHrZFcWrW","QWxoTSmGzv","azIWpJkzUn","W3VFH7ku1p","FFDuigdQsS","lViBvjiVBP","NAFuwOz8yZ","lj07QDLhzM",
+"cL0aErhl0J","zqH0WfaHir","LbRTHLewvM","jzUqRn1pmO","KZamHyEfy9","hSSvQQ6Lix","CdyBVZuDtD","ZhwG1zz4ZU","lkMUA4W0Tl","SWfoutaOXK",
+"1v5hHaL6AJ","AgJHQYw2oU","okgRiOUqFM","SjskQWMiS3","Cp3mZQbxXc","9rlg9uAWyp","LbRTHFcWrW","hE1QlJ2mQi","5VZjSVBjhz","l83Udx3LDe",
+"AIYUuzQt6Q","Z4I1vVBjhz","POUYSzmLYD","JRJQBs93Ml","JRJQBEOE1o","W7cTsEOE1o","SmGzv5drc6","VNCPdU3yw5","hi5X7G1RhS","SWfouWaim6",
+"W7cTs5VZjS","MojnPJkzUn","gdQsSt59lR","gdQsSJIqXi","euZA5Q6Lix","xReecSWfou","m4bxURmDcr","MojnPazIWp","nnP8ouPX7G","HP433OUqFM",
+"Q6hMCciuWz","7fsYMl83Ud","FxX9qlj07Q","guMb8FGzgp","tlILt0MR5X","lj07QFVMxo","9eoRco8Uyd","qQxHP1j5L8","ZhwG1uoStw","tAOsrcmXIX",
+"VerEAChuy3","wiHrZoGu6x","2hEEUlCMxy","D6rByaDGtS","suY4xVjCZq","fLNg8uoStw","KZamHB3qem","4W0TlS77LH","M3zXLzFgtB","qUJMdrhl0J",
+"oGu6xgf8rI","1v5hHL7cGc","8FmFHEOE1o","GrDg7Q6Lix","mX2GEMmsIo","9iGoT3weIF","mz8gxnlaBy","ECMvUuAWyp","FNYIM8RCUA","rz7UtJIqXi",
+"2ZHdkEOE1o","FwEJz6AFT0","BGaQY9rlg9","uTacxjiVBP","Chuy3O3iyQ","LbRTHFGzgp","pAhR1FLsph","9y4lwhe9IA","5Drn0CIShG","ZzJHWoQ87r",
+"ZzJHWjtn0X","ni2v1vLsmS","0MR5X48cHL","4W0Tlatef2","lCMxyJJs5m","Yw2oUBGaQY","lj07QECMvU","zmLYDAXpwE","5Mg9r1v5hH","v8yFNjfREu",
+"bgJAzOz8yZ","5nmWvn8pJ9","5NammjSjS3","L7cGcnFqik","zHF1qaez9y","0h1b1JKWYR","1LB1LK20wK","wDajXHlUbF","CdyBVKr8ys","FxX9qMezSW",
+"nnP8oY1mC0","ZzJHWAgJHQ","ogLgcy94nw","TXQ0ZVprf2","jeskSzHF1q","5drc6IRh48","gdQsSpvgjS","uupzkaL6AJ","5IhmG9y4lw","0YAGH5Mg9r",
+"K20wKiqv4k","3weIFQnJ1S","WaWsviB08l","SjskQiB08l","0BmCyprNT6","1LB1LNhXdu","S2DfubZLvS","jSjS3pv0i7","hi5X7jzUqR","2Yz7Es93Ml",
+"SbRYyjzUqR","QChxsazIWp","MK07YOHaBz","RkQkev8yFN","7hyVvd7vjM","WaWsvVNCPd","6AFT0guMb8","y94nwnFqik","rKDLJY1mC0","M3zXLNxx9V",
+"OHaBz7hyVv","Uvlv455rfB","7fKYUKZamH","jS1ajJXljW","MezSW45cIH","3weIF3weIF","RzaZAfLNg8","tvdkDtlILt","618Di5iGN5","S77LHhe9IA",
+"S2DfuIKxdL","djsrvvkCHH","WmadAogLgc","zqH0Wpv0i7","B3qemW7cTs","Zv7z0Yw2oU","3otm6pAhR1","hE1QlMmKGJ","hYBCKksJby","5NammpAhR1",
+"QChxsaDGtS","4QMc9CqqaD","BCxeCZv7z0","LewvM2ZHdk","atef2pv0i7","zFgtBfFDrJ","l83UdDLhzM","FcWrWxReec","UlU3M2DREs","9y4lwRxrsm",
+"ni2v1B3qem","hUTw7euZA5","ix74rb29RJ","gIYvE24ARF","FwEJzjSjS3","gjUTui3pyd","2DREsbZLvS","3weIFCNHmv","QworuVprf2","CdyBVCqqaD",
+"t98iW5drc6","rz7UtC2Irc","Oz8yZlpF6W","Qworu2ZHdk","24ARFSbRYy","xciqp9rlg9","0BmCySjskQ","dpe1v5IhmG","v1HlnvkCHH","lm0pDe6e4z",
+"TXQ0ZcL0aE","UlU3MDG4sT","RBhp0l83Ud","m4bxUvkCHH","StlDJTwano","TCgPpaDGtS","pT8wuyofH3","JRJQBStlDJ","v2eC3IRh48","2Yz7Edpe1v",
+"In3NSoVQp6","UmaEv8cVD3","aDGtSLbRTH","DQimpHzZT8","MaJQsQnJ1S","QbxXcazIWp","FxX9qOxWIH","iqv4ktaOXK","LDk6fuAWyp","lCMxyx3LDe",
+"9GXkXEoToP","fcwDafcwDa","WDVWJa00b5","zz4ZU29QAz","bgJAz5Drn0","VBjhzBCxeC","5iGN5K20wK","lm0pDDG4sT","F6PT22hEEU","i3pydJIqXi",
+"GXdoHRsQUq","Fhtgl0h1b1","jSjS3yvOMI","hUTw7QClRL","gtCA5IBe8k","4W0TlXyPZN","tAOsrblLA9","3weIFXflUq","v8yFNRpBQm","zz4ZUWMiS3",
+"2hEEUVLTy6","azIWpMm8si","jSjS3cQOnv","ru4UGaDGtS","BFkb8YjB9t","FnPFB55rfB","O3iyQKZamH","8hJdtYw2oU","lj07QqaofN","Gv3FqCIShG",
+"n8pJ9MmKGJ","2DREslkMUA","lsQGoogLgc","8U2nU2DREs","zFgtB0Kyfs","iwzGkzbIYY","uN6r35drc6","ciuWz7Ow5C","pvgjS2Nslm","aez9yOUYuF",
+"Dz1R3vLsmS","FFDuiqQxHP","GWqqXGXdoH","qUJMdtAOsr","atef2uN6r3","t59lREOE1o","piJSkQWxoT","5NammQChxs","8xEKz1LB1L","QClRLM6qcG",
+"Q6LixJIqXi","ksJby2ZHdk","JRJQBqUJMd","UlU3MnlaBy","DLhzMGWqqX","qUJMd0YAGH","LbRTHMmsIo","5IhmG24ARF","zHF1qU3yw5","QbxXcMm8si",
+"m4bxU7hyVv","Q6Lix16lHc","7X3uy5Mg9r","CqqaDFPfSE","aFFssSmGzv","ru4UGJ2mQi","HfyNQhi5X7","JXljWRACuj","2DREsCxVEf","WDVWJatef2",
+"LewvMjSjS3","aL6AJXyPZN","9GXkX0Kyfs","M6qcG48cHL","qaofNyEfy9","DG4sTlj07Q","tlILtatef2","vLsmSlsQGo","SjskQSbRYy","PYBf4BpYhV",
+"FPfSEhE1Ql","9iGoTgjUTu","ogLgcD6rBy","1LB1LLDk6f","0h1b1Vprf2","jzUqRJIqXi","7X3uys93Ml","FLsphFNYIM","IjTwPDLhzM","U3yw5Nxx9V",
+"DcpWB580YD","PYBf4uPX7G","wiHrZ5drc6","lH1ktuAWyp","hE1Ql7fKYU","mX2GEzmLYD","StlDJ8TxD7","gjUTu29QAz","uoStwC2Irc","AIYUu6q6L9",
+"VerEAblLA9","dQ586i3pyd","xciqp14FLR","In3NSpv0i7","uZPqgqaofN","WPmlxZuDtD","QClRL48cHL","W7cTspiJSk","9XyT9QClRL","yToGWwDajX",
+"MmKGJgf8rI","pFrrlVjCZq","4QMc9gf8rI","lH1ktHlUbF","lweGyG1RhS","d7vjMBGaQY","nFqikaez9y","Cp3mZVjCZq","aDGtSDz1R3","YOfrYfaHir",
+"JJs5mdmoS7","v8yFNMmKGJ","DG4sT5VZjS","FVMxolXFOB","t59lRHfyNQ","DQimpRxrsm","GrDg7Gv3Fq","yvOMIs4786","v2eC3MGlTF","zmLYDaez9y",
+"ThjNn7X3uy","2hEEUd7vjM","VLTy616lHc","MojnPyEfy9","IjTwPo8Uyd","Qworugf8rI","GXdoHZuDtD","5VZjSd7vjM","rz7Utlm0pD","CqqaDFhtgl",
+"8hJdt7hyVv","VBjhz9eoRc","okgRimz8gx","Nxx9VM6qcG","QClRLd85a9","pmeCd5IhmG","lsQGo0Wr5y","YjB9t5ZaEz","FNYIMFcWrW","FjHXROz8yZ",
+"zQt6QLDk6f","o8UydHRxd8","TXQ0Z5Mg9r","GWqqXQClRL","ReKEW4QMc9","WreyPfcwDa","VerEAHRxd8","rz7Ut8cVD3","5drc6RsQUq","vOqCEMm8si",
+"5drc6h1zcH","VLTy6IKxdL","ReKEWGSQwj","cL0aESbRYy","dhSuHYjB9t","rz7UtcmXIX","I7p2aAmdQd","GWqqXlCMxy","L7cGcgf8rI","AXpwEhUTw7",
+"IRh48KZamH","pAhR15IhmG","XyPZNhSSvQ","atef2tAOsr","pWiOsVBjhz","wDajXix74r","S77LH16lHc","FnPFBM6qcG","2TRI7oQ87r","aL6AJcQOnv",
+"VerEA5VZjS","8hJdt5ZaEz","e6e4zzqH0W","Q6hMCGrDg7","uN6r3aL6AJ","t98iWjiVBP","tuDySQWxoT","jzUqRyvOMI","NAFuwfLNg8","fqypyaDGtS",
+"SbRYyoQ87r","jtn0X7ku1p","a00b5NAFuw","6q6L9QWxoT","9rlg955rfB","JRJQBMmKGJ","3weIFlXFOB","Ss0ZuNxx9V","FcWrWoVQp6","gdQsSnlaBy",
+"he9IAbgJAz","piJSko8Uyd","lpF6WOxWIH","fcwDayvOMI","0BmCyTCgPp","Yh1hFAkKTk","m4bxULewvM","SjskQe6e4z","Cfgr3qaofN","MaJQsFxX9q",
+"Kr8yshi5X7","dhSuHKr8ys","nnP8oMK07Y","d85a9azIWp","x3LDeWreyP","CK5W7LbRTH","Y1mC0zqH0W","MGlTFlsQGo","5nmWv29QAz","gIYvEFGzgp",
+"ciuWzuJScX","rKDLJNxx9V","dhSuH9GXkX","KASQ8pmeCd","L7cGcWMiS3","QbxXczHF1q","5Drn0DLhzM","1v5hHJXljW","cL0aErz7Ut","BCxeCAgJHQ",
+"7fsYMUvlv4","RmDcr2DREs","atef2HP433","7X3uySmGzv","0Kyfss4786","iwzGkiqv4k","WDVWJnFqik","ulk41uAWyp","k85AeogLgc","ksJbyDLhzM",
+"brhlQi3pyd","M6qcGQ6hMC","8TxD7ogLgc","fcwDaCNHmv","PYBf4D6rBy","TCgPpQssNC","MojnPFhtgl","he9IAIRh48","oGu6x9iGoT","bZLvSPOUYS",
+"4W0TlUl4a1","pT8wu9y4lw","TCgPphi5X7","atef2oGu6x","6q6L929QAz","9y4lwqaofN","Zv7z0iKqhr","yEfy99XyT9","Cp3mZyToGW","2TRI7uZPqg",
+"fFDrJVIlwP","pAhR1nnP8o","e6e4zwiHrZ","EdBKcFxX9q","rz7UtlCMxy","rhl0J7ku1p","FLsph5ZaEz","t59lR8U2nU","9rlg9QYxC0","lpF6WjiVBP",
+"WreyP9y4lw","okgRifLNg8","OUYuFAmdQd","DQimppv0i7","hSSvQ7ku1p","ulk41v2eC3","0h1b1No0Qb","618DiaL6AJ","FcWrWHRxd8","pFrrlPOUYS",
+"brhlQNcICA","1j5L8QssNC","VIlwPfmIK1","16lHcD6rBy","atef25ZaEz","FPfSEKZamH","BCxeC5VZjS","pT8wua00b5","fFDrJM3zXL","3otm6FGzgp",
+"RmDcr07n1c","lj07QFxX9q","DcpWBtuDyS","uupzk9XyT9","tlILtlCMxy","W7cTsTa8f6","WreyPStlDJ","s93MlzqH0W","hSSvQRsQUq","RkQkemz8gx",
+"1v5hHjtn0X","lj07QUlU3M","zQt6Q4dEz6","ThjNn9GXkX","9GXkXFFDui","cShY2Z4I1v","iwzGkRkQke","gdQsScmXIX","TCgPpa00b5","IBe8k16lHc",
+"YOfrYHlUbF","Nxx9VWPmlx","ZzJHWa00b5","HP4338FmFH","x3LDeDQimp","i7WMQtlILt","Q6hMCNAFuw","UmaEvLewvM","AXpwEZv7z0","TXQ0ZCfgr3",
+"dmoS7yluBx","n1pmOuPX7G","xciqpn1pmO","uvf7AjfREu","i3pydHlUbF","sqVrflXFOB","Uvlv40PktI","AIYUuCNHmv","zHF1qbrhlQ","NhXduFhtgl",
+"MK07YCK5W7","GrDg7Uvlv4","dpe1vvLsmS","k85AebZLvS","2TRI7qQxHP","FLsphVjCZq","bgJAzfmIK1","HfyNQlXFOB","8FmFHDLhzM","8hJdtru4UG",
+"ksJbyJkzUn","QWxoTYOfrY","POUYS1j5L8","G1RhSiwzGk","0Wr5yQworu","fmIK1yvOMI","WreyPIn3NS","o8UydQ6Lix","0ao3lMkgy8","nFqikmz8gx",
+"XflUquPX7G","BGaQYdhSuH","EOE1oC2Irc","n1pmOVjCZq","EOE1oi3pyd","2TRI77Ow5C","uN6r3v1Hln","OHaBzWMiS3","MmsIoPOUYS","Cp3mZfqypy",
+"Dz1R3Z4I1v","tjQxsksJby","5IhmGlj07Q","n8pJ97hyVv","s93MlCqqaD","MmsIonFqik","KZamHCxVEf","hE1QlyluBx","K4GS8ZhwG1","Uvlv4RpBQm",
+"gf8rI4QMc9","ogLgcFPfSE","kB5nPYh1hF","FnPFBK20wK","C2IrcWPmlx","M3zXLdmoS7","5ZaEziqv4k","jfREuAIYUu","lCMxy0Kyfs","1v5hHS2Dfu",
+"BFkb8xReec","ZzJHWSWfou","48cHL24ARF","J2mQiY1mC0","OHaBzfcJOy","mz8gxs7Mxk","iqv4kWPmlx","i3pyddhSuH","ix74rCIShG","jeskSuAWyp",
+"CdyBV2Yz7E","v8yFN4W0Tl","GXdoHprNT6","Pb1pafcwDa","e6e4zuAWyp","0MR5Xuupzk","b29RJiwzGk","24ARFBpYhV","ZUnqtgdQsS","S2DfulH1kt",
+"hUTw7JRJQB","nlaBys7Mxk","DQimpxXTI4","CK5W7Chuy3","e6e4z7fsYM","UlU3Me6e4z","FjHXRThjNn","BpYhVWreyP","KsjRKlXFOB","9XyT9Fhtgl",
+"Cfgr3piJSk","5Mg9rQssNC","Q6LixZ4I1v","7ku1phUTw7","9XyT9aez9y","S77LHYOfrY","2hEEUSmGzv","0YAGHFhtgl","29QAzlViBv","qUJMdaDGtS",
+"uQIczD6rBy","GrDg70Wr5y","Uvlv4pWiOs","lj07QOUqFM","faHir8RCUA","tuDySOUYuF","4W0Tlru4UG","uvf7AKr8ys","Zv7z0y94nw","b29RJDLhzM",
+"JRJQB7fsYM","5IhmG6q6L9","AXpwEPOUYS","e6e4zpT8wu","RkQkezHF1q","ciuWzEoToP","8xEKzni2v1","lweGy7hyVv","M6qcGFjHXR","Vprf2MaJQs",
+"uupzkd7vjM","oQ87rG1RhS","vkCHH4dEz6","aL6AJJ2mQi","S77LHmX2GE","G1RhSC2Irc","SmGzvKsjRK","pFrrl0BmCy","ReKEWv2eC3","VIlwPAOgEe",
+"dpe1v6q6L9","yluBxG1RhS","wDajXRsQUq","mX2GENxx9V","VerEA8xEKz","ni2v1t98iW","In3NSQnJ1S","yEfy9FGzgp","SmGzvRsQUq","Mkgy8dpe1v",
+"jSjS3gjUTu","lpF6WX6Pin","SbRYyMmKGJ","HfyNQy94nw","aFFssTwano","t59lRIRh48","Oz8yZVjCZq","jzUqRuTacx","VNCPd2TRI7","7ku1puQIcz",
+"4QMc9KsjRK","OUYuFtaOXK","VBjhzIjTwP","tl72WtvdkD","DLhzM5VZjS","U3yw5bZLvS","SjskQdpe1v","3otm6RkQke","0h1b1xReec","FPfSEd7vjM",
+"v2eC364s8N","VBjhzbrhlQ","RxrsmTXQ0Z","AgJHQAIYUu","WDVWJiqv4k","soy9tEdBKc","14FLRpFrrl","Cp3mZv8yFN","wDajXlsQGo","hE1QlFVMxo",
+"WaWsvNAFuw","ix74rv2eC3","azIWp5IhmG","uJScXWDVWJ","JkzUnjS1aj","jeskS8cVD3","zqH0WUmaEv","J2mQiFhtgl","HRxd8W3VFH","vLsmSRBhp0",
+"hE1QlyEfy9","MK07YK20wK","NcICASs0Zu","KsjRK6AFT0","JIqXiaFFss","L7cGcMmsIo","5Mg9r2Nslm","VjCZqfFDrJ","FLsphuupzk","EdBKcnlaBy",
+"vkCHHKZamH","HzZT8mz8gx","uPX7GQYxC0","ZhwG1FFDui","CdyBV4W0Tl","TXQ0ZcQOnv","uN6r3AIYUu","FnPFBuLtKs","YjB9tdmoS7","suY4xaFFss",
+"0ao3lCfgr3","1j5L8WmadA","4dEz6v1Hln","4QMc9F6PT2","MGlTF4QMc9","n1pmODcpWB","45cIH3otm6","618DiQWxoT","S77LHM6qcG","qaofNhe9IA",
+"NcICASWfou","ydG8U2DREs","CdyBVyofH3","0BmCyjfREu","WPmlx7lUXZ","uQIczY1mC0","WPmlxFxX9q","5Drn0BGaQY","mX2GEjfREu","VBjhzzY1GY",
+"8U2nUtlILt","b29RJGWqqX","In3NSHfyNQ","K20wK5Mg9r","GWqqXcShY2","SbRYyFLsph","euZA5tjQxs","aFFssGSQwj","K20wKW3VFH","JXljWM6qcG",
+"UmaEvYw2oU","DLhzMKsjRK","M6qcGFLsph","jS1ajBCxeC","lsQGo6AFT0","pFrrlDz1R3","WDVWJjSjS3","MezSWvOqCE","ZJTXHix74r","hSSvQrz7Ut",
+"KASQ8Fhtgl","taOXKhSSvQ","D6rBy2TRI7","DcpWBgjUTu","fqypycQOnv","FGzgpKsjRK","uupzk5Drn0","v1Hln16lHc","kB5nP7fsYM","7Ow5ClsQGo",
+"tl72WdmoS7","3otm6ZuDtD","14FLRHP433","zbIYYRmDcr","uLtKspiJSk","aez9y8TxD7","qQxHP2TRI7","prNT6BbwgA","uupzkfFDrJ","O3iyQ14FLR",
+"WreyPy94nw","uJScXt59lR","jtn0XkZANm","ciuWzY1mC0","GSQwjM6qcG","L7cGcKZamH","WaWsvMm8si","pT8wupFrrl","iKqhrqaofN","RkQkehE1Ql",
+"lkMUAUl4a1","S77LHa00b5","nFqikSs0Zu","9GXkXuvf7A","t59lRqUJMd","Yw2oUUvlv4","0MR5XDcpWB","SWfou5IhmG","QbxXclj07Q","uLtKs7fKYU",
+"bZLvS24ARF","DcpWB7lUXZ","zHF1qRpBQm","MezSWRpBQm","cmXIXv1Hln","b29RJAIYUu","OUYuFFNYIM","LDk6fvLsmS","XflUqblLA9","Yw2oUK20wK",
+"dpe1vK20wK","FhtglxReec","JkzUnEdBKc","2DREs5Mg9r","yluBxsoy9t","7ku1prhl0J","AXpwEvLsmS","2TRI7wDajX","FjHXR7hyVv","yofH3wiHrZ",
+"7fKYUblLA9","oVQp6lj07Q","4QMc9Waim6","uPX7G618Di","2hEEUOUqFM","hSSvQbgJAz","uupzkQssNC","piJSkaL6AJ","uupzkBGaQY","618Di45cIH",
+"OxWIH0Wr5y","he9IAYjB9t","EoToP3otm6","0MR5Xrhl0J","fmIK1tjQxs","t98iWVBjhz","L7cGc55rfB","uQIczwiHrZ","SWfouIRh48","HlUbFqaofN",
+"G1RhSB3qem","YOfrYgf8rI","RACujcmXIX","cQOnv8U2nU","uvf7A5Mg9r","VerEA4QMc9","ksJbyzz4ZU","zHF1qWmadA","a00b5gtCA5","euZA5HRxd8",
+"zHF1qO3iyQ","jeskS55rfB","pv0i72ZHdk","d85a9Zv7z0","9eoRczHF1q","7fsYM5nmWv","MmsIoZJTXH","aFFssqUJMd","3weIFBpYhV","lpF6WzQt6Q",
+"S77LHwiHrZ","iB08lulk41","l83Ud0h1b1","GXdoHZhwG1","dhSuHuupzk","QWxoTd85a9","sqVrfuAWyp","JkzUnBbwgA","Ta8f6W3VFH","qQxHPGXdoH",
+"v8yFNAOgEe","0MR5X6q6L9","RkQkeDz1R3","IBe8kEoToP","2Yz7EOz8yZ","OxWIHIBe8k","SjskQ45cIH","RxrsmWDVWJ","Yf2EchSSvQ","o8UydlpF6W",
+"cmXIXNxx9V","uoStwguMb8","ni2v18FmFH","OUYuFiwzGk","uupzklH1kt","ZzJHWChuy3","7hyVvG1RhS","Gv3Fq9XyT9","ciuWzXyPZN","AOgEeciuWz",
+"gtCA5ru4UG","aFFssHzZT8","0YAGHlXFOB","pvgjSs93Ml","8xEKzpT8wu","lweGyMK07Y","wDajXJKWYR","6q6L9djsrv","MK07Yrhl0J","xXTI4VNCPd",
+"aL6AJogLgc","jeskSEdBKc","fcwDa1LB1L","VIlwPuN6r3","m4bxUMaJQs","O3iyQlViBv","xXTI4xReec","4W0TlpFrrl","Q6LixEOE1o","RACujWMiS3",
+"LDk6ftuDyS","QClRLRzaZA","hi5X7ZuDtD","Yw2oUL7cGc","ciuWzBbwgA","SjskQFwEJz","0Kyfssx5Gl","0h1b17fsYM","yofH3tvdkD","FVMxoQClRL",
+"5Drn0uvf7A","AkKTkChuy3","CqqaDKASQ8","yvOMImz8gx","hYBCKZUnqt","QClRLUl4a1","tuDyS7hyVv","SWfouYw2oU","vOqCEGSQwj","DLhzMSjskQ",
+"QChxsQnJ1S","s93MlMmsIo","uAWypQ6Lix","OUYuFQClRL","bZLvSSjskQ","tAOsr2Nslm","taOXKqaofN","Twano7Ow5C","HlUbFVIlwP","Ul4a1jtn0X",
+"MezSWVprf2","xciqpNhXdu","QClRLQworu","9iGoTnlaBy","RmDcrGWqqX","lH1ktzz4ZU","ThjNnwiHrZ","gf8rI6q6L9","jfREu0Kyfs","MmKGJ5drc6",
+"Cp3mZfaHir","WreyPQYxC0","e6e4z0YAGH","Nxx9VSjskQ","C2Irctl72W","kZANm64s8N","Y1mC0ZzJHW","tuDySYjB9t","Yw2oUHP433","jfREuBFkb8",
+"o8UydMmKGJ","6q6L95nmWv","bgJAzP6bcg","gtCA5TXQ0Z","a00b5Twano","POUYSJKWYR","gtCA5oQ87r","0ao3lhUTw7","Chuy3C2Irc","14FLRECMvU",
+"FLsph0PktI","he9IAOz8yZ","3weIFjSjS3","Kr8ysBpYhV","fcwDajiVBP","uvf7Ai7WMQ","pWiOsOz8yZ","hi5X7pAhR1","P6bcgzY1GY","FFDuigtCA5",
+"P6bcgJKWYR","FNYIMrhl0J","14FLR48cHL","taOXKVprf2","gjUTu5Namm","hE1QlFjHXR","sqVrfZJTXH","0h1b1FNYIM","zFgtBatef2","2DREs55rfB",
+"fcwDaIn3NS","CdyBV0MR5X","W7cTsDcpWB","DQimpHP433","EoToPuJScX","GXdoHQChxs","ydG8UuN6r3","POUYSReKEW","fqypyCdyBV","7ku1ppT8wu",
+"Yw2oUSWfou","b29RJjS1aj","0PktIlm0pD","TwanoZ4I1v","LDk6fJ2mQi","MezSWMK07Y","v8yFNpWiOs","G1RhSMojnP","zHF1qk85Ae","5ZaEzfcwDa",
+"cL0aEY1mC0","t59lRUlU3M","29QAzy94nw","uTacxWaWsv","GrDg7FxX9q","vOqCEn1pmO","7fsYMfLNg8","uPX7GhYBCK","hYBCKuoStw","AmdQdru4UG",
+"s93MlyEfy9","zz4ZUYw2oU","9eoRcuoStw","euZA5cL0aE","4QMc9VIlwP","d85a99GXkX","5nmWvCxVEf","tuDyS2Nslm","euZA5IjTwP","RsQUqfqypy",
+"ThjNnulk41","7X3uyFLsph","2DREsix74r","KZamHIBe8k","OUqFMKZamH","zHF1q2hEEU","TXQ0ZdmoS7","POUYSK4GS8","0h1b1rz7Ut","blLA9D6rBy",
+"NhXdu48cHL","wDajXQYxC0","AOgEeHP433","618DiNAFuw","4W0TlBGaQY","8TxD7oGu6x","Oz8yZVNCPd","lViBvP6bcg","gIYvEMkgy8","FjHXRQYxC0",
+"djsrvDQimp","ZuDtDpT8wu","7fKYUtuDyS","tl72WD6rBy","l83UdThjNn","SbRYyuvf7A","7fsYMtvdkD","AmdQd6q6L9","14FLRtuDyS","Twano9XyT9",
+"0YAGH0Wr5y","3weIFatef2","I7p2aHP433","JXljWblLA9","vkCHHMm8si","J2mQi16lHc","Rxrsm5iGN5","VNCPdmX2GE","uLtKsJXljW","9iGoTBbwgA",
+"ZJTXHU3yw5","Mkgy8suY4x","9rlg9suY4x","vLsmS4dEz6","In3NSt59lR","POUYSxXTI4","fcwDaX6Pin","JIqXiQbxXc","HP433NhXdu","OxWIHjSjS3",
+"QYxC0EOE1o","55rfBNhXdu","7ku1pni2v1","fFDrJCxVEf","iKqhrCp3mZ","BpYhVMK07Y","uPX7GLbRTH","G1RhSHP433","oGu6xuJScX","RACujyEfy9",
+"KASQ85VZjS","jtn0XnnP8o","GWqqX580YD","9y4lw1LB1L","OHaBz14FLR","VjCZqYh1hF","jS1ajt59lR","F6PT2SbRYy","rz7UtYh1hF","TwanogjUTu",
+"CdyBVa00b5","RsQUqP6bcg","JJs5mSs0Zu","YjB9tOz8yZ","MK07Y9GXkX","JIqXia00b5","m4bxUK4GS8","F6PT2brhlQ","iB08lW3VFH","0KyfsDQimp",
+"gtCA5Qworu","SmGzvU3yw5","JXljWnFqik","QssNCt59lR","5IhmGx3LDe","iKqhrFwEJz","8TxD7MaJQs","taOXKgdQsS","GXdoHmz8gx","PYBf4aDGtS",
+"07n1clCMxy","VIlwPaFFss","rhl0JQ6Lix","GSQwjKZamH","bZLvSkB5nP","NhXdue6e4z","5Mg9ryvOMI","55rfBSjskQ","hi5X7uJScX","aFFssdpe1v",
+"NcICAjSjS3","MK07Yix74r","IBe8kcL0aE","yofH3suY4x","rhl0JCdyBV","EdBKc1LB1L","sqVrfChuy3","P6bcgRpBQm","5nmWvuN6r3","1j5L85iGN5",
+"AOgEeGrDg7","iKqhrZUnqt","jfREuLbRTH","WDVWJ7fsYM","Twanox3LDe","cmXIXQbxXc","ZhwG1QbxXc","In3NS9GXkX","cQOnvv1Hln","v1HlnjfREu",
+"uQIczjeskS","FNYIMZhwG1","HlUbFBbwgA","okgRiZv7z0","dQ586s7Mxk","uLtKsX6Pin","7lUXZxciqp","Z4I1vs4786","WPmlxlViBv","MK07YEOE1o",
+"0MR5XnlaBy","IKxdLfqypy","lViBv8cVD3","iB08lblLA9","FGzgpDz1R3","UlU3Mtl72W","gdQsStaOXK","cmXIXRzaZA","TwanotvdkD","BpYhVfFDrJ",
+"FxX9qpFrrl","uoStw2hEEU","G1RhSIn3NS","QssNCMojnP","guMb8lViBv","Yh1hFo8Uyd","pWiOsG1RhS","IRh48prNT6","NOHszBFkb8","RpBQmpWiOs",
+"16lHcuPX7G","J2mQinnP8o","lj07QzqH0W","NOHszxReec","a00b5ni2v1","pvgjSKsjRK","GSQwjBpYhV","uAWypiwzGk","POUYS14FLR","VerEA14FLR",
+"jS1aj0PktI","xXTI4GXdoH","MaJQs4dEz6","FPfSE9rlg9","DQimplkMUA","WreyP5drc6","RACujU3yw5","cmXIXt59lR","hYBCKVjCZq","9eoRckZANm",
+"yluBxulk41","vOqCE9XyT9","t98iWMojnP","lXFOBQ6hMC","P6bcgHRxd8","64s8NcShY2","FVMxoM6qcG","Oz8yZru4UG","lViBvcShY2","4QMc9uvf7A",
+"ZJTXH9XyT9","yEfy9VerEA","cL0aEDcpWB","0Wr5yBGaQY","KsjRKo8Uyd","9XyT9yToGW","Mm8sis7Mxk","55rfB8xEKz","oGu6xRmDcr","hi5X7xXTI4",
+"J2mQiEoToP","zmLYDIRh48","Mkgy8yToGW","HlUbFCp3mZ","dhSuH5Namm","GSQwjv8yFN","Ul4a1Ss0Zu","BFkb8CNHmv","pv0i7JIqXi","MaJQslXFOB",
+"tAOsrpWiOs","d7vjMCp3mZ","bgJAzmX2GE","NhXdufcJOy","uJScXQ6Lix","zqH0W8TxD7","9XyT9BGaQY","K4GS80YAGH","l83Udlm0pD","hUTw7Zv7z0",
+"JkzUn0h1b1","LewvMUmaEv","fmIK116lHc","zmLYDlXFOB","nlaByWaim6","5NammAgJHQ","yToGWpv0i7","zHF1qdQ586","GSQwjO3iyQ","MGlTFGSQwj",
+"M6qcGMm8si","gjUTuNcICA","t59lRzY1GY","uTacx6q6L9","uAWyphe9IA","FwEJzQChxs","P6bcg4dEz6","QWxoTPYBf4","2DREsjzUqR","BGaQYiwzGk",
+"OUYuFtuDyS","No0Qb14FLR","x3LDeZuDtD","PYBf48TxD7","8RCUAkB5nP","fLNg8iqv4k","atef2lj07Q","AXpwENOHsz","pWiOsPYBf4","9GXkXoVQp6",
+"NAFuwJ2mQi","FwEJzP6bcg","uupzkhUTw7","jS1ajJ2mQi","7lUXZ0MR5X","jiVBPCxVEf","I7p2a5Namm","vkCHHIBe8k","dhSuHTXQ0Z","uJScXEOE1o",
+"Pb1pa07n1c","zQt6QpT8wu","Uvlv4RACuj","fqypyVIlwP","Ta8f6FnPFB","HzZT8pv0i7","s93Ml8RCUA","POUYSn1pmO","i7WMQFFDui","ZJTXHt59lR",
+"cL0aEUmaEv","tuDySt59lR","QbxXcxReec","VNCPdNcICA","7Ow5CZhwG1","ciuWzwDajX","2DREseuZA5","jzUqRIKxdL","StlDJOxWIH","S77LHzHF1q",
+"UlU3MPb1pa","DQimpQClRL","h1zcHtlILt","ciuWzCNHmv","yToGWoQ87r","Y1mC0x3LDe","suY4x7lUXZ","7hyVvVBjhz","QYxC0NOHsz","tjQxsni2v1",
+"ZJTXHpmeCd","HlUbFuoStw","QClRLKASQ8","3weIFWreyP","nFqikyofH3","NOHszVIlwP","NAFuwxReec","ksJby2Yz7E","ix74rv1Hln","HzZT8s7Mxk",
+"v1HlnCxVEf","No0Qbpv0i7","pWiOs8xEKz","5nmWvWMiS3","m4bxUWmadA","uoStwaL6AJ","C2Irc07n1c","mz8gxiKqhr","FVMxohe9IA","8cVD3JXljW",
+"s93MlfaHir","CxVEfs93Ml","GWqqXlweGy","RzaZAJkzUn","sx5GljSjS3","W7cTsQ6hMC","gtCA5s93Ml","8U2nUAIYUu","nlaBy0ao3l","Mkgy8okgRi",
+"C2IrcZzJHW","WMiS3WmadA","cmXIXfcwDa","fLNg8Twano","NhXdufLNg8","StlDJjS1aj","IKxdL7fsYM","J2mQiFPfSE","blLA9IjTwP","kZANmX6Pin",
+"guMb8sx5Gl","Yh1hFpT8wu","WmadAjSjS3","xReecyvOMI","cShY2KsjRK","VjCZq5Drn0","Pb1paECMvU","cShY248cHL","jfREuEoToP","lkMUA16lHc",
+"Ss0Zu0PktI","LDk6fLDk6f","cShY22ZHdk","48cHLlCMxy","JXljWYf2Ec","16lHcqUJMd","VNCPdS2Dfu","i3pydWreyP","VLTy6W7cTs","MK07YYh1hF",
+"9GXkX3weIF","tvdkD2DREs","mX2GEBbwgA","zmLYDIKxdL","zqH0WWMiS3","Cfgr39eoRc","pT8wuW7cTs","7fKYUQbxXc","tuDySd85a9","OxWIHAmdQd",
+"vOqCEuupzk","EOE1ouLtKs","W7cTsWaWsv","Pb1patjQxs","dhSuHCfgr3","5Drn0M6qcG","bZLvSQbxXc","X6PinBpYhV","rz7UtCxVEf","euZA58RCUA",
+"qaofNBFkb8","In3NSOxWIH","QbxXc14FLR","FxX9qaez9y","8xEKznlaBy","ciuWz45cIH","lCMxynlaBy","MmsIofcwDa","0Wr5yBpYhV","pWiOsOUqFM",
+"VLTy6MGlTF","AmdQdPYBf4","gIYvE8U2nU","dpe1vmz8gx","0BmCypFrrl","BbwgARBhp0","9GXkXJIqXi","fmIK1zmLYD","gIYvE5VZjS","n8pJ9b29RJ",
+"Cp3mZRBhp0","VjCZq1LB1L","CK5W7tvdkD","FLsphciuWz","qUJMdlsQGo","D6rByJIqXi","lsQGoKASQ8","iwzGkfaHir","6q6L9W3VFH","aez9y7lUXZ",
+"okgRiZJTXH","0h1b10MR5X","lweGyuN6r3","VjCZqBpYhV","7Ow5ChE1Ql","DQimpv8yFN","FjHXRuAWyp","K20wKuN6r3","4QMc9X6Pin","Mkgy807n1c",
+"fFDrJChuy3","ydG8UhYBCK","BGaQYGXdoH","ThjNn580YD","Zv7z0zHF1q","FxX9qD6rBy","HzZT8K20wK","ydG8URxrsm","iKqhrs4786","IKxdLEdBKc",
+"AIYUu0Wr5y","nFqik0BmCy","ThjNnWaim6","KsjRKMmKGJ","No0QbQ6Lix","t59lRAXpwE","d85a9AgJHQ","pmeCdwiHrZ","3weIFCqqaD","G1RhSTwano",
+"C2IrcK4GS8","Cp3mZHlUbF","pv0i7Ul4a1","In3NSJKWYR","HfyNQe6e4z","azIWpPYBf4","i7WMQhUTw7","UmaEvCfgr3","MezSWFNYIM","zqH0W5Mg9r",
+"14FLRAIYUu","YOfrYqQxHP","lj07QHP433","gIYvEP6bcg","ZhwG1qQxHP","NAFuwlj07Q","fcwDa5Mg9r","gtCA5RkQke","ni2v16AFT0","W7cTsogLgc",
+"uupzkAOgEe","FwEJzaDGtS","CIShGhSSvQ","SmGzvK20wK","tl72Wy94nw","okgRiNhXdu","MmsIoX6Pin","1v5hHhUTw7","x3LDeFjHXR","iqv4kGrDg7",
+"v1HlnAgJHQ","5nmWvbZLvS","AgJHQFcWrW","zmLYDFhtgl","YOfrYd85a9","VIlwPQbxXc","QWxoTtuDyS","IKxdLtl72W","RpBQmgIYvE","lsQGod85a9",
+"guMb83otm6","QbxXcMGlTF","HRxd8WMiS3","hE1QlSmGzv","U3yw5guMb8","nFqik4W0Tl","sx5GlGSQwj","yEfy9BFkb8","jSjS3NAFuw","tAOsrFcWrW",
+"tAOsrZv7z0","7Ow5Ci7WMQ","XflUqni2v1","FPfSE6q6L9","LewvMRxrsm","ZhwG14W0Tl","07n1cEoToP","iKqhrhUTw7","Yh1hFNAFuw","AOgEet98iW",
+"aL6AJuTacx","guMb8s93Ml","WmadAuvf7A","4dEz6AmdQd","S77LHD6rBy","vkCHHsoy9t","RpBQm3otm6","hi5X7Fhtgl","rz7UtWmadA","jiVBPOHaBz",
+"faHirYh1hF","5VZjSgjUTu","FxX9qni2v1","n1pmO29QAz","nnP8oHzZT8","iB08lNcICA","ZzJHWSjskQ","nnP8os4786","1LB1LpT8wu","D6rBypFrrl",
+"7fsYMe6e4z","xReecuAWyp","yEfy9mX2GE","nnP8oP6bcg","Yh1hFk85Ae","lm0pDuvf7A","WaWsv6AFT0","FFDuiuoStw","t59lRF6PT2","ZuDtDFwEJz",
+"lCMxyh1zcH","fqypyJJs5m","vOqCEjiVBP","Fhtgltl72W","pWiOsWMiS3","IBe8kBpYhV","qaofNZ4I1v","KZamHOz8yZ","JRJQBJkzUn","Chuy3zFgtB",
+"UmaEvFxX9q","Pb1paBbwgA","djsrvFFDui","gdQsSyEfy9","5IhmGZzJHW","FFDuipmeCd","MK07Yd85a9","Chuy3ZhwG1","uN6r3MezSW","AmdQdni2v1",
+"kB5nPjS1aj","0MR5XFFDui","5NammMkgy8","wDajXDz1R3","9GXkXMmsIo","16lHcXyPZN","RACujFjHXR","uLtKsgIYvE","jzUqRAXpwE","FPfSEru4UG",
+"sqVrfzmLYD","qQxHPO3iyQ","gf8rI9XyT9","FNYIMFPfSE","Mm8siHP433","sx5GlfLNg8","fFDrJCK5W7","BpYhV2Yz7E","4QMc9G1RhS","qQxHPMezSW",
+"FGzgpokgRi","U3yw5AIYUu","BCxeCJkzUn","DG4sTcShY2","zFgtB0YAGH","AmdQdx3LDe","DQimpFPfSE","x3LDeMK07Y","CNHmvmX2GE","uTacxTXQ0Z",
+"azIWpRkQke","FPfSEqQxHP","KZamHW3VFH","cShY2ogLgc","MojnP9eoRc","zFgtBDG4sT","dQ5865VZjS","8hJdtbZLvS","zbIYYHP433","LDk6fzmLYD",
+"HRxd8zmLYD","VjCZqF6PT2","RzaZA2DREs","zz4ZUv2eC3","Q6hMC64s8N","CqqaDbrhlQ","DcpWBtAOsr","Ss0Zumz8gx","FPfSEjtn0X","L7cGc2TRI7",
+"Dz1R3atef2","RkQkeSbRYy","Dz1R3DcpWB","IKxdLeuZA5","CNHmve6e4z","MmKGJGXdoH","yEfy9hSSvQ","azIWpuN6r3","yEfy9VIlwP","3weIF16lHc",
+"GSQwj9y4lw","EOE1od85a9","BbwgAuJScX","Mm8siGWqqX","Q6hMCcmXIX","Zv7z0pFrrl","yToGW9y4lw","t98iWrz7Ut","uZPqgQ6Lix","16lHctlILt",
+"POUYSBFkb8","uoStwBCxeC","8TxD7MmsIo","EoToPBbwgA","5nmWvI7p2a","XflUqRmDcr","4QMc9WDVWJ","fcwDaQChxs","rKDLJtvdkD","LbRTHuvf7A",
+"lH1ktvkCHH","U3yw55VZjS","5VZjS9eoRc","he9IAtlILt","ZhwG10PktI","he9IA7fsYM","9y4lw8FmFH","uupzkhYBCK","okgRib29RJ","m4bxUydG8U",
+"n8pJ9piJSk","5drc6UmaEv","uN6r3Ss0Zu","rKDLJb29RJ","lXFOB1j5L8","UmaEv2Yz7E","bgJAz3otm6","iwzGkK4GS8","VBjhz618Di","e6e4zzmLYD",
+"8FmFHuPX7G","X6PinTCgPp","xReecTCgPp","OUqFMAIYUu","6q6L9v8yFN","vLsmSVjCZq","S2DfuJKWYR","fmIK1uoStw","b29RJlkMUA","rz7Utpv0i7",
+"8FmFH5nmWv","MezSW7hyVv","NOHszjS1aj","oVQp6lweGy","OHaBzHP433","5drc6SWfou","cQOnv7fsYM","7ku1ppvgjS","ru4UGPYBf4","0MR5XAIYUu",
+"bZLvSAXpwE","MmKGJ0Kyfs","pAhR1LDk6f","24ARFEOE1o","MaJQsuAWyp","k85AeuAWyp","QssNCvLsmS","tl72WYjB9t","OxWIHlm0pD","pv0i7zFgtB",
+"uN6r3Z4I1v","atef2WmadA","VNCPd5iGN5","xciqpni2v1","IKxdLtvdkD","Chuy3QWxoT","JKWYRK4GS8","uAWypyEfy9","XflUq4W0Tl","8RCUAt98iW",
+"SWfou8TxD7","ZUnqtKASQ8","WPmlxlsQGo","ZuDtDn1pmO","UlU3MP6bcg","4QMc9x3LDe","lCMxy0h1b1","JRJQBkZANm","I7p2aGSQwj","fFDrJ5Drn0",
+"VIlwPuAWyp","OxWIHOUqFM","AOgEed85a9","UmaEvI7p2a","K20wKL7cGc","uLtKs0MR5X","29QAziwzGk","07n1cVIlwP","7fsYMBCxeC","7hyVv2ZHdk",
+"I7p2aNAFuw","DG4sTYh1hF","Vprf2zY1GY","Y1mC0d85a9","ciuWzU3yw5","iB08lRsQUq","gtCA51j5L8","2TRI77hyVv","uoStwnnP8o","0PktIMmsIo",
+"vLsmSCfgr3","WMiS3NhXdu","SbRYyuAWyp","dmoS7qQxHP","Waim6zmLYD","pAhR1nFqik","No0Qb0MR5X","SWfouEdBKc","IjTwPCp3mZ","ksJby580YD",
+"OxWIHDG4sT","FxX9qjtn0X","GXdoH618Di","1LB1LSmGzv","Yw2oUfcwDa","9y4lwjfREu","8FmFHLbRTH","8hJdtJRJQB","J2mQiVprf2","JXljWQ6Lix",
+"AmdQdi7WMQ","JkzUnydG8U","uvf7AokgRi","S77LH29QAz","pvgjSGrDg7","rz7UtOHaBz","jS1aj4QMc9","uZPqgReKEW","MezSWaL6AJ","Dz1R3Ss0Zu",
+"Yw2oUfmIK1","HfyNQ618Di","HlUbFprNT6","Ss0ZuHzZT8","NAFuwHlUbF","FwEJzD6rBy","MmKGJy94nw","d85a9LDk6f","M3zXL2DREs","pFrrl1v5hH",
+"Cp3mZuN6r3","0MR5XSWfou","vkCHH4W0Tl","rKDLJVBjhz","HP433s7Mxk","BGaQYIRh48","L7cGcv2eC3","gf8rIgdQsS","CNHmvAgJHQ","QbxXcCdyBV",
+"bgJAzSmGzv","nlaByrhl0J","cL0aEfFDrJ","PYBf4TCgPp","rKDLJi3pyd","0KyfsNcICA","8xEKzPYBf4","soy9t2Yz7E","vLsmSn8pJ9","RACujm4bxU",
+"JJs5mguMb8","4W0TlQworu","HzZT82TRI7","n8pJ9Gv3Fq","U3yw5gIYvE","lpF6WlweGy","o8Uyd8U2nU","lpF6Wn1pmO","oQ87rJXljW","PYBf45Mg9r",
+"zQt6Q5nmWv","pT8wuaFFss","ni2v1mX2GE","9rlg9BFkb8","v8yFNuPX7G","QnJ1SVerEA","K20wKzqH0W","QWxoTqUJMd","618Di8U2nU","ThjNnGv3Fq",
+"MGlTFUl4a1","PYBf4oQ87r","l83UdPb1pa","iB08lIjTwP","K4GS8DQimp","taOXKsuY4x","MK07YZhwG1","xReecSbRYy","GXdoHs4786","tuDySlm0pD",
+"48cHLY1mC0","7hyVvNcICA","5iGN5JJs5m","uN6r3FLsph","5Drn06q6L9","fqypypmeCd","BFkb8lH1kt","8RCUAgf8rI","4W0TlDz1R3","9iGoTni2v1",
+"D6rByfLNg8","W7cTsYjB9t","RACujokgRi","tvdkDXflUq","Mkgy8Uvlv4","MK07Ya00b5","zY1GYzqH0W","jSjS3bgJAz","29QAzVprf2","jtn0XYjB9t",
+"gtCA5WPmlx","5IhmG5VZjS","lpF6WUl4a1","tl72WzqH0W","FnPFBDG4sT","RkQkejfREu","FLsphCfgr3","tvdkDlCMxy","bgJAz8RCUA","Yf2EciwzGk",
+"GrDg7ReKEW","cShY2POUYS","ReKEWGWqqX","8FmFH7fKYU","fLNg8HlUbF","Y1mC0Waim6","DLhzMFjHXR","aFFss07n1c","dhSuHFVMxo","S2DfuCp3mZ",
+"oVQp6O3iyQ","wiHrZJKWYR","iqv4kFnPFB","VLTy6zbIYY","FLsphqQxHP","HRxd824ARF","In3NSlpF6W","uZPqg07n1c","uAWypWMiS3","C2IrcdQ586",
+"sx5GlXflUq","55rfBAmdQd","d7vjMcShY2","lXFOB8TxD7","0KyfsfcJOy","CK5W7HzZT8","D6rByVIlwP","9GXkX8xEKz","brhlQFLsph","5nmWv8TxD7",
+"618DiuPX7G","prNT60BmCy","tuDySe6e4z","gtCA55Namm","S77LHDG4sT","5drc6RkQke","djsrv7Ow5C","QWxoTuTacx","0YAGHciuWz","GWqqXM6qcG",
+"FNYIMHfyNQ","lkMUAAIYUu","4QMc9StlDJ","AgJHQzQt6Q","nFqik7fKYU","WreyPwiHrZ","8U2nUzqH0W","FjHXRs93Ml","ru4UGFhtgl","2TRI7hi5X7",
+"QnJ1S07n1c","bgJAzDQimp","JIqXiogLgc","Cp3mZXflUq","RpBQm5iGN5","gjUTu9eoRc","W3VFHzHF1q","8U2nU7Ow5C","0PktIn1pmO","RpBQmNo0Qb",
+"BGaQYo8Uyd","0Wr5yOHaBz","uoStw5iGN5","5Namm7fKYU","gjUTumX2GE","L7cGcBGaQY","ciuWzzY1GY","J2mQiFnPFB","Fhtgl5ZaEz","KZamHSjskQ",
+"uAWyp5Drn0","fcwDaPOUYS","mX2GELbRTH","tvdkDUmaEv","RxrsmDQimp","7X3uyuupzk","5IhmGMmKGJ","XflUqlViBv","7fKYUjeskS","ciuWzJJs5m",
+"kZANmF6PT2","4QMc90ao3l","ru4UGVerEA","Gv3FqCdyBV","4dEz6hSSvQ","v8yFNZ4I1v","pvgjSMaJQs","2NslmS77LH","8xEKziKqhr","ZuDtDFPfSE",
+"okgRiCp3mZ","C2IrcCNHmv","gjUTuBGaQY","d7vjMFGzgp","n8pJ9JIqXi","9iGoTBGaQY","CqqaDv2eC3","Kr8ys48cHL","HP4336q6L9","RBhp00YAGH",
+"uoStwS77LH","1v5hHdpe1v","oVQp60Kyfs","3otm6rz7Ut","QClRL7ku1p","HzZT8tjQxs","tjQxs7lUXZ","fqypy5VZjS","BCxeCcmXIX","AXpwEjiVBP",
+"D6rBybgJAz","NOHsz8TxD7","Dz1R3UmaEv","OUqFMFnPFB","C2IrcYf2Ec","MGlTFVjCZq","lsQGorKDLJ","RpBQmS2Dfu","LbRTHGSQwj","ThjNnTXQ0Z",
+"I7p2aciuWz","TXQ0ZFNYIM","4QMc9faHir","NcICAgf8rI","F6PT2jeskS","he9IAbZLvS","POUYSU3yw5","YjB9teuZA5","F6PT2lXFOB","48cHLzz4ZU",
+"hSSvQCp3mZ","fcJOyNxx9V","AIYUuWreyP","mX2GEWaim6","AXpwEo8Uyd","HP433P6bcg","24ARFs4786","hYBCKGrDg7","Uvlv48xEKz","48cHLzqH0W",
+"EOE1odmoS7","RsQUq7lUXZ","jzUqR0PktI","RBhp0sqVrf","14FLREdBKc","t59lRpWiOs","48cHLWreyP","zqH0Wlj07Q","6AFT0vOqCE","wDajXpT8wu",
+"lkMUAFcWrW","guMb8ZzJHW","uN6r3ZUnqt","blLA9euZA5","zFgtBOUYuF","K4GS89eoRc","UmaEvPYBf4","FhtglfaHir","n1pmOCqqaD","2TRI7iwzGk",
+"Q6LixLbRTH","suY4x0Kyfs","zqH0Wi7WMQ","45cIH7lUXZ","zQt6QRxrsm","P6bcgk85Ae","MmKGJrhl0J","zFgtBECMvU","yvOMIuTacx","Vprf2OUYuF",
+"LDk6fThjNn","Cp3mZM6qcG","7hyVvOHaBz","uupzkpmeCd","55rfBBGaQY","mX2GEogLgc","WMiS3zbIYY","BCxeCVNCPd","OHaBzJRJQB","gdQsStvdkD",
+"MmKGJgjUTu","Oz8yZtaOXK","Zv7z0piJSk","2NslmThjNn","YOfrYl83Ud","NOHszM3zXL","gtCA5uupzk","rz7Ut0MR5X","Nxx9VUvlv4","ZzJHWfmIK1",
+"prNT6sx5Gl","o8UydprNT6","VIlwPUvlv4","580YDZv7z0","fqypyFNYIM","RpBQmTwano","uoStwCK5W7","vkCHHMkgy8","ni2v145cIH","WreyPoGu6x",
+"PYBf4P6bcg","m4bxUPb1pa","7Ow5CjzUqR","8cVD3GXdoH","xReecDz1R3","5NammnnP8o","TXQ0ZReKEW","5Mg9rCIShG","MGlTFru4UG","AIYUujfREu",
+"5ZaEzS77LH","MojnPlj07Q","KZamHLewvM","HlUbFFNYIM","RsQUqbZLvS","hi5X7NcICA","OxWIHtuDyS","aFFssogLgc","cL0aEOz8yZ","RsQUqb29RJ",
+"Pb1pai3pyd","jfREuXyPZN","s7Mxkn8pJ9","lweGy14FLR","taOXKKZamH","6AFT0atef2","CxVEfLDk6f","CdyBVD6rBy","POUYS8hJdt","azIWpUlU3M",
+"zz4ZUWDVWJ","EoToPVNCPd","S77LHGXdoH","1LB1LRzaZA","djsrv8xEKz","WreyPcmXIX","8cVD3oVQp6","h1zcHSmGzv","9GXkXlkMUA","UmaEvuN6r3",
+"uoStwP6bcg","jtn0XlsQGo","In3NS4QMc9","EOE1oY1mC0","FjHXRdpe1v","zQt6Qn1pmO","EoToPRACuj","t98iWe6e4z","fcJOyzqH0W","NhXdut59lR",
+"tuDySjeskS","pT8wuFNYIM","IKxdLni2v1","RxrsmYOfrY","MaJQsD6rBy","dpe1v6AFT0","EOE1o1j5L8","GWqqXECMvU","RBhp0P6bcg","VIlwP07n1c",
+"zHF1qCqqaD","y94nwYf2Ec","lm0pDLewvM","16lHcpT8wu","0h1b1TXQ0Z","pT8wusqVrf","VBjhzRkQke","aez9y2Nslm","b29RJOxWIH","zQt6Qx3LDe",
+"fcwDaBpYhV","LDk6fJkzUn","fcwDaY1mC0","Mm8siD6rBy","zqH0WxReec","qaofNMK07Y","Vprf2Chuy3","618DiRpBQm","ThjNnKASQ8","VIlwPhE1Ql",
+"GrDg7euZA5","ZUnqtQWxoT","S77LHS2Dfu","CIShGn1pmO","GSQwjlkMUA","Q6hMC5iGN5","Kr8ysoQ87r","7lUXZCIShG","oGu6xv2eC3","Uvlv48cVD3",
+"nnP8ofcJOy","JRJQB0PktI","FVMxociuWz","FhtglKASQ8","dmoS7lCMxy","FnPFBuJScX","6q6L9a00b5","5iGN5MezSW","TXQ0ZoVQp6","a00b5zz4ZU",
+"J2mQifaHir","yofH38xEKz","wDajXOUYuF","AkKTkulk41","dpe1vXflUq","D6rBy9XyT9","ZJTXHOxWIH","tjQxsWreyP","VBjhzjtn0X","zbIYYAgJHQ",
+"tl72WIRh48","BbwgAMaJQs","VjCZqoVQp6","s4786QClRL","K20wKmX2GE","gf8rIY1mC0","FPfSEZ4I1v","WmadA29QAz","Dz1R3kB5nP","atef2gjUTu",
+"DG4sT7X3uy","3weIFuTacx","5drc6U3yw5","2Yz7EBbwgA","nlaByVNCPd","uJScXW7cTs","uJScXUlU3M","UlU3M8xEKz","zmLYDksJby","5Drn0FcWrW",
+"lH1ktpmeCd","wiHrZlj07Q","Yw2oUFhtgl","WPmlxd7vjM","nnP8o5IhmG","nnP8oFwEJz","o8UydDcpWB","uTacxm4bxU","S2Dfu0Wr5y","JJs5mlpF6W",
+"d85a9ogLgc","CqqaDtl72W","ZzJHWEOE1o","WreyPXyPZN","ix74rru4UG","lpF6WqQxHP","Cfgr3AOgEe","7lUXZQworu","0ao3lXyPZN","dhSuHaL6AJ",
+"VjCZqguMb8","kZANmiB08l","tlILtDG4sT","IRh48fqypy","uQIczW7cTs","zY1GYe6e4z","s7MxkL7cGc","atef22Nslm","EOE1o8RCUA","Vprf2PYBf4",
+"lm0pDQ6hMC","yEfy9MK07Y","BbwgAuvf7A","BpYhVl83Ud","FPfSEKASQ8","bgJAzFLsph","tAOsrqaofN","24ARFX6Pin","zQt6QfaHir","rz7UtprNT6",
+"FwEJzgdQsS","i7WMQhSSvQ","CK5W7Nxx9V","L7cGcNOHsz","lj07Q0BmCy","jtn0XeuZA5","zqH0WSbRYy","7fKYUWaim6","7lUXZ7fsYM","yofH3s93Ml",
+"MezSWThjNn","Q6LixPOUYS","s4786lj07Q","OUqFMqaofN","lCMxydQ586","gdQsSDcpWB","QnJ1SFNYIM","tlILtOxWIH","aFFssDQimp","pAhR1faHir",
+"Nxx9Vtl72W","K4GS8No0Qb","fcwDaAIYUu","n1pmOFPfSE","bZLvSsx5Gl","dQ58645cIH","lj07Qrz7Ut","dhSuH7ku1p","0MR5Xni2v1","TXQ0ZWMiS3",
+"7fsYM1j5L8","jSjS3Zv7z0","lj07QIBe8k","J2mQipmeCd","kB5nPs93Ml","YOfrYtvdkD","oVQp6QWxoT","xReec618Di","EOE1oKr8ys","WPmlxUmaEv",
+"hi5X7KsjRK","h1zcHvLsmS","CdyBVFPfSE","KZamHuQIcz","l83UdQnJ1S","n1pmOVerEA","S2DfuTa8f6","FFDuiuPX7G","29QAzm4bxU","jiVBPtaOXK",
+"7ku1pjzUqR","Kr8yse6e4z","Yh1hFaL6AJ","OHaBzdhSuH","gjUTuMmKGJ","580YDLbRTH","MGlTFWPmlx","OHaBzVIlwP","aFFssk85Ae","3otm6aez9y",
+"QWxoT5drc6","Nxx9VOHaBz","h1zcHTa8f6","8U2nUGWqqX","lXFOBs93Ml","ni2v1mz8gx","rKDLJ5VZjS","LewvMBFkb8","vkCHHReKEW","sx5GlVIlwP",
+"Uvlv4L7cGc","yvOMI14FLR","WreyPNxx9V","sx5GlpFrrl","0PktITXQ0Z","AXpwEuN6r3","VLTy61LB1L","guMb85Mg9r","yEfy9t59lR","IBe8kCfgr3",
+"piJSk48cHL","gjUTuVjCZq","580YDsuY4x","oQ87rCqqaD","ru4UG45cIH","pmeCdpv0i7","xciqpgIYvE","rhl0JokgRi","14FLRFNYIM","Chuy3ru4UG",
+"aFFssFVMxo","Q6hMCWreyP","29QAzzY1GY","HP433gtCA5","7lUXZgtCA5","fLNg8FxX9q","OHaBzM6qcG","RsQUqKZamH","SjskQQWxoT","ru4UG0Kyfs",
+"RBhp05VZjS","dmoS7fcwDa","SjskQlCMxy","yToGWGWqqX","YjB9tk85Ae","EoToPtl72W","QbxXcuTacx","sqVrf5Mg9r","faHirGrDg7","uN6r3RkQke",
+"jS1ajksJby","WMiS3NOHsz","hE1QlRkQke","lpF6WNhXdu","48cHL0PktI","kB5nPFhtgl","AIYUuBGaQY","W7cTslH1kt","zmLYDQnJ1S","7X3uyRxrsm",
+"1j5L8NOHsz","8cVD3IjTwP","0YAGHECMvU","Oz8yZYw2oU","B3qemd85a9","16lHcAOgEe","1LB1LlkMUA","pvgjSpiJSk","pAhR17fsYM","GWqqXFnPFB",
+"9y4lwi3pyd","9iGoTG1RhS","FnPFB29QAz","Gv3FqqaofN","X6PinSjskQ","v2eC3lweGy","F6PT2MezSW","FwEJz48cHL","gIYvERxrsm","SjskQjfREu",
+"SbRYyU3yw5","UmaEvXyPZN","VNCPdRsQUq","VerEASWfou","hi5X7PYBf4","mX2GErKDLJ","qQxHPYw2oU","s93MlQ6Lix","X6PinKsjRK","3otm6hUTw7",
+"LDk6f0YAGH","RmDcr4dEz6","m4bxU1LB1L","UlU3MuTacx","b29RJpT8wu","uoStwdhSuH","AgJHQLbRTH","7ku1paez9y","uvf7ARACuj","64s8NLewvM",
+"jzUqReuZA5","NcICANOHsz","kB5nPDQimp","x3LDeChuy3","ZhwG1uupzk","BFkb8o8Uyd","h1zcH4dEz6","aL6AJhi5X7","4QMc9CIShG","Cp3mZwDajX",
+"MK07YyofH3","fqypy4QMc9","fcwDalpF6W","W7cTsWPmlx","uAWyp0PktI","v2eC3Y1mC0","5ZaEz07n1c","taOXKlj07Q","CK5W7hSSvQ","uN6r3uAWyp",
+"jiVBPL7cGc","ZJTXHRACuj","pAhR1Ta8f6","GrDg7XyPZN","OHaBzFhtgl","DcpWB6AFT0","iwzGk07n1c","MK07YlXFOB","F6PT2In3NS","RACujDQimp",
+"X6PinEoToP","AXpwEdhSuH","24ARFFhtgl","VIlwP2hEEU","bgJAzTCgPp","zqH0Wtl72W","K20wKQnJ1S","MK07YlViBv","Pb1pazHF1q","0BmCy29QAz",
+"tvdkDuJScX","ix74rRkQke","SjskQcL0aE","CNHmvsuY4x","CqqaDVBjhz","ZuDtDFVMxo","JJs5m0YAGH","In3NS9iGoT","BpYhVWmadA","m4bxUS77LH",
+"i3pydiqv4k","CqqaDW7cTs","l83Udfqypy","0ao3ljeskS","uvf7Av8yFN","iwzGkJKWYR","mX2GENOHsz","Mkgy8hYBCK","ThjNnsx5Gl","NhXdudmoS7",
+"uvf7Ak85Ae","KsjRK29QAz","5Namm7fsYM","SWfouhE1Ql","QYxC0hUTw7","GXdoHpAhR1","uJScXFnPFB","brhlQ55rfB","h1zcHm4bxU","dhSuHCdyBV",
+"FcWrW3weIF","QssNCyofH3","GSQwjVprf2","Y1mC05Mg9r","n1pmO618Di","v2eC3uPX7G","WaWsvSmGzv","4W0Tl24ARF","lH1ktbrhlQ","h1zcHOz8yZ",
+"NhXdui3pyd","SjskQ5VZjS","zmLYDdjsrv","soy9tyvOMI","rKDLJ7fKYU","Chuy3oVQp6","ni2v1aFFss","Pb1pa2Nslm","618DivLsmS","taOXK8FmFH",
+"brhlQhUTw7","8U2nUNAFuw","Ss0ZuDcpWB","QbxXcB3qem","QnJ1S3weIF","qaofNjzUqR","BbwgACqqaD","BbwgAfmIK1","BbwgAQClRL","W7cTsgtCA5",
+"iqv4kuupzk","uPX7G8U2nU","VerEAFwEJz","QClRLMm8si","v1HlnlCMxy","taOXKFnPFB","CNHmv0ao3l","VNCPdsoy9t","5Mg9ruvf7A","lkMUAokgRi",
+"S2DfuFnPFB","hSSvQAgJHQ","5drc6bgJAz","he9IA1v5hH","ydG8U24ARF","lH1ktgIYvE","QChxsgdQsS","Nxx9VD6rBy","F6PT2Yh1hF","W7cTsF6PT2",
+"64s8NQssNC","BGaQYtlILt","pv0i7BCxeC","QworuCqqaD","BpYhVzqH0W","5Mg9rVBjhz","zqH0WfLNg8","JJs5mzqH0W","wDajXX6Pin","FGzgpoQ87r",
+"CK5W7StlDJ","WDVWJD6rBy","CK5W7hUTw7","55rfB7X3uy","jiVBP8FmFH","7lUXZLbRTH","dpe1vkB5nP","EdBKcLewvM","lm0pDHzZT8","lH1ktm4bxU",
+"iwzGkHfyNQ","uQIczfLNg8","2DREsECMvU","uAWypaez9y","HP433W3VFH","O3iyQFhtgl","lCMxypiJSk","FVMxoFcWrW","hSSvQguMb8","2ZHdkUlU3M",
+"8TxD75ZaEz","zmLYDHlUbF","VjCZqhE1Ql","MmKGJmX2GE","i3pyd0Wr5y","NhXduDz1R3","uPX7GoGu6x","0Wr5y24ARF","W3VFHv1Hln","VLTy6qaofN",
+"U3yw5NAFuw","M6qcGX6Pin","JIqXiRzaZA","HfyNQatef2","zHF1q9rlg9","8U2nUIKxdL","qaofN7X3uy","5Mg9rRzaZA","9eoRc7Ow5C","Chuy3W7cTs",
+"b29RJlsQGo","uLtKsQ6hMC","48cHLD6rBy","Chuy3W3VFH","lm0pDgtCA5","ciuWzmX2GE","9rlg9EoToP","v2eC314FLR","jS1ajQnJ1S","JJs5mCNHmv",
+"2DREsCqqaD","uN6r3VNCPd","l83Udd85a9","zHF1qzz4ZU","FFDuiuLtKs","2DREs48cHL","5NammAkKTk","tl72WXflUq","RkQkeMm8si","IRh488RCUA",
+"WPmlxokgRi","L7cGc0BmCy","yluBx9iGoT","Twano07n1c","KASQ8RBhp0","SWfouQYxC0","6AFT0UmaEv","lj07Q64s8N","CqqaDjiVBP","Q6Lix4W0Tl",
+"JXljWdpe1v","h1zcHFPfSE","xXTI4ulk41","gtCA5cL0aE","P6bcgG1RhS","d85a9jzUqR","48cHLM6qcG","PYBf4v8yFN","55rfBaFFss","S77LH5Drn0",
+"gtCA5RsQUq","IKxdLyvOMI","KASQ81j5L8","HlUbFgdQsS","QClRLQWxoT","NcICAuAWyp","QbxXc0Kyfs","ECMvUDz1R3","1v5hHlXFOB","HfyNQ2Nslm",
+"vOqCEuQIcz","MK07YyvOMI","45cIHpFrrl","Qworu5IhmG","tl72WdQ586","BFkb8ZzJHW","zFgtB0PktI","RzaZAkB5nP","NOHszKZamH","v1HlnRmDcr",
+"mX2GE7X3uy","nlaByKsjRK","ksJbyhSSvQ","0MR5Xb29RJ","Q6LixPYBf4","tvdkDlm0pD","9iGoTFNYIM","EOE1oRxrsm","hi5X7nFqik","POUYS9rlg9",
+"Zv7z0euZA5","UmaEvAOgEe","lViBvoVQp6","jfREuaFFss","5iGN5zbIYY","kZANmNxx9V","Vprf27fKYU","fFDrJvkCHH","iqv4k8RCUA","JXljWEdBKc",
+"fcJOypAhR1","QWxoT4W0Tl","tuDySRkQke","k85AeRzaZA","fLNg8tjQxs","HRxd81LB1L","tl72WAmdQd","AgJHQ0YAGH","pvgjSIn3NS","zz4ZUPb1pa",
+"WreyPWreyP","wiHrZlCMxy","zbIYY7fsYM","tAOsry94nw","16lHcAkKTk","n1pmOCfgr3","0MR5X5ZaEz","pAhR1b29RJ","VBjhzjS1aj","U3yw5GWqqX",
+"14FLRFFDui","ni2v1NhXdu","IjTwP0MR5X","yEfy907n1c","bgJAzWaWsv","d85a92hEEU","0KyfsyToGW","8cVD30ao3l","9GXkX7fKYU","MGlTFsqVrf",
+"Kr8ys5Namm","k85Aee6e4z","rKDLJLDk6f","CIShGVerEA","F6PT2AOgEe","2DREsyToGW","dpe1ve6e4z","kZANmWMiS3","xXTI48cVD3","bgJAzFhtgl",
+"Yf2EclpF6W","C2Irc0h1b1","ReKEWFFDui","64s8NGv3Fq","bZLvS0BmCy","iB08lTXQ0Z","G1RhSFwEJz","Uvlv4FVMxo","WmadAe6e4z","Yh1hFTCgPp",
+"lH1ktokgRi","uJScXPYBf4","s93MlWreyP","RpBQmRzaZA","ydG8Un1pmO","55rfBWPmlx","ulk41L7cGc","uPX7G0YAGH","jtn0X7fsYM","EdBKcWPmlx",
+"GrDg7AOgEe","Ta8f6ZzJHW","piJSki7WMQ","rhl0JxReec","CqqaDPb1pa","S2DfuHfyNQ","s93MlJkzUn","pvgjS5IhmG","5VZjSuLtKs","ydG8Ut59lR",
+"xXTI4GrDg7","XyPZN9eoRc","24ARFy94nw","qUJMdprNT6","GXdoH8hJdt","GrDg75Drn0","IRh48UlU3M","0BmCyYf2Ec","0KyfsY1mC0","JKWYRs7Mxk",
+"RpBQmMK07Y","o8UydCqqaD","s7MxkfcJOy","ciuWzgjUTu","pT8wuvkCHH","07n1c5ZaEz","48cHL5Mg9r","lH1ktJJs5m","okgRiRpBQm","aFFssBpYhV",
+"jS1ajyofH3","uAWyp6AFT0","KsjRKmz8gx","qQxHPFwEJz","prNT6ZuDtD","iKqhrK4GS8","KsjRKECMvU","5Drn0rz7Ut","nnP8oK20wK","lViBv7fKYU",
+"pv0i7K20wK","0BmCyQ6hMC","SbRYyuTacx","Yf2EcHRxd8","t59lRs4786","AXpwES77LH","e6e4zRzaZA","8cVD3iB08l","U3yw516lHc","ru4UGCqqaD",
+"prNT6VIlwP","Mm8sid85a9","i7WMQxciqp","k85AeC2Irc","ReKEWzFgtB","dpe1vJkzUn","ulk41NOHsz","B3qemdjsrv","AOgEe5Mg9r","ZzJHWPOUYS",
+"FwEJziwzGk","RzaZAStlDJ","29QAzaDGtS","uZPqgzmLYD","5Drn0580YD","t59lRlViBv","yToGWLbRTH","5drc6HlUbF","QbxXcjtn0X","uPX7GHlUbF",
+"Mkgy80h1b1","FLsphzY1GY","8hJdtt59lR","lj07QvOqCE","cL0aEzHF1q","ulk41IKxdL","7ku1pWMiS3","CdyBVAIYUu","QChxsFwEJz","YjB9tydG8U",
+"tAOsrIn3NS","2Nslm3weIF","8FmFHzbIYY","t59lR8RCUA","RzaZAHP433","X6PinuPX7G","DG4sTPb1pa","uN6r37hyVv","s93Ml8FmFH","zmLYDMmKGJ",
+"djsrvOz8yZ","In3NSsoy9t","9iGoTB3qem","55rfBjSjS3","CNHmvmz8gx","NAFuwCNHmv","QssNCpT8wu","RBhp0O3iyQ","IRh489eoRc","gjUTufmIK1",
+"8U2nUTwano","5nmWv8hJdt","FnPFBfcwDa","lweGyOHaBz","s93MlcQOnv","i7WMQsuY4x","HzZT8e6e4z","m4bxUCqqaD","8RCUAzqH0W","RpBQm7X3uy",
+"MK07YpAhR1","uvf7AoVQp6","NAFuwWMiS3","oGu6x16lHc","oQ87r2ZHdk","lsQGonlaBy","cQOnvdmoS7","o8UydAkKTk","fmIK18hJdt","brhlQQworu",
+"WreyPt59lR","7hyVvHRxd8","P6bcgsoy9t","M6qcGPb1pa","3weIFQbxXc","8FmFHnFqik","aDGtSCqqaD","16lHc9iGoT","FnPFB7X3uy","CIShGRBhp0",
+"9GXkXo8Uyd","pmeCd9rlg9","RmDcrru4UG","RsQUq8U2nU","okgRiiqv4k","QnJ1SUvlv4","lViBvfmIK1","lpF6W55rfB","OHaBzsx5Gl","QWxoTS2Dfu",
+"qaofNs93Ml","mz8gx2Yz7E","IRh485nmWv","POUYSvLsmS","xXTI4HP433","OUqFMcL0aE","lXFOBfFDrJ","fqypyulk41","h1zcHyToGW","580YDtaOXK",
+"ZzJHWJIqXi","BpYhVK4GS8","ECMvUjeskS","pAhR1MaJQs","iwzGkLewvM","FxX9q16lHc","ZuDtDLewvM","5IhmGVLTy6","dhSuHFLsph","s7MxkuN6r3",
+"guMb8Q6hMC","7fKYU5Drn0","IjTwPtvdkD","4dEz6In3NS","i7WMQFhtgl","fcwDaogLgc","GrDg7tAOsr","BCxeCLbRTH","1LB1LkZANm","618DiRBhp0",
+"Cp3mZlCMxy","GWqqX3weIF","yvOMIHzZT8","FcWrWAkKTk","pWiOslViBv","8cVD3brhlQ","yluBxoGu6x","2ZHdkqUJMd","h1zcHZJTXH","5Mg9rdpe1v",
+"JJs5mLbRTH","9XyT9ciuWz","HzZT8MezSW","6AFT0RACuj","0MR5XCp3mZ","VLTy6FFDui","WPmlxDcpWB","soy9ttjQxs","jS1ajlkMUA","HRxd81v5hH",
+"K20wKMmsIo","9iGoTNxx9V","0MR5XFVMxo","HP433Q6hMC","atef2blLA9","DcpWBCNHmv","9rlg9DQimp","lpF6WhYBCK","Waim6B3qem","l83Ud7X3uy",
+"MmsIohYBCK","8FmFHL7cGc","MK07YGrDg7","kZANmVjCZq","0PktIZUnqt","6AFT0jfREu","FVMxookgRi","aL6AJWreyP","zz4ZUv1Hln","In3NSFnPFB",
+"MezSWRzaZA","pvgjSlj07Q","lXFOBiKqhr","0MR5XqQxHP","BFkb8M3zXL","he9IAn1pmO","v2eC3atef2","1LB1LXyPZN","Zv7z0rz7Ut","CqqaDBpYhV",
+"O3iyQDz1R3","nnP8oCp3mZ","ECMvUn1pmO","Yh1hFnnP8o","uvf7AlkMUA","Cfgr3ZzJHW","ksJbyYOfrY","YjB9tAkKTk","Q6hMCjS1aj","pv0i7JKWYR",
+"nlaByhE1Ql","FGzgpCK5W7","HfyNQFPfSE","QssNC0ao3l","fcJOygIYvE","tuDySsx5Gl","NcICAQssNC","mX2GE9GXkX","5drc6i3pyd","S2DfuFVMxo",
+"Ta8f6faHir","rz7Uthi5X7","ciuWzVerEA","6q6L9uupzk","uupzki3pyd","HzZT8sqVrf","55rfB8TxD7","o8UyduTacx","n1pmOa00b5","MojnPlm0pD",
+"QChxsFcWrW","I7p2a5IhmG","LDk6fIn3NS","lH1ktMm8si","Cfgr3aFFss","9XyT9NcICA","BFkb8WaWsv","CIShG0h1b1","wDajXnnP8o","0h1b1uoStw",
+"W7cTsU3yw5","gdQsS4QMc9","JIqXilsQGo","wiHrZyEfy9","HfyNQ2ZHdk","NcICAs93Ml","K20wKs93Ml","m4bxUuoStw","uQIcz6q6L9","HfyNQ3weIF",
+"gIYvEJKWYR","zbIYYuJScX","VerEAfFDrJ","azIWpYf2Ec","POUYSEdBKc","WmadA16lHc","rKDLJKASQ8","0ao3ltvdkD","MezSWSWfou","jiVBPqUJMd",
+"ksJbyiqv4k","AXpwEpWiOs","iB08ll83Ud","fmIK1dmoS7","BGaQYDQimp","Ss0ZuL7cGc","Ul4a1LewvM","Yw2oU7Ow5C","gdQsSQChxs","RkQkeQ6hMC",
+"SbRYyIKxdL","Nxx9V9y4lw","U3yw5P6bcg","tAOsrVprf2","WaWsvqaofN","6q6L9lj07Q","Uvlv4lXFOB","rhl0JdQ586","Oz8yZUl4a1","HlUbFFhtgl",
+"5Mg9rFjHXR","YjB9tZhwG1","4QMc9uJScX","jfREuvkCHH","RmDcrO3iyQ","In3NSrhl0J","cQOnvb29RJ","D6rBy14FLR","ogLgc6AFT0","MaJQsEOE1o",
+"OUYuFcL0aE","faHir7lUXZ","IRh48K20wK","7X3uyKZamH","0PktI2hEEU","GXdoHYf2Ec","lCMxysqVrf","jfREuSmGzv","uTacxCqqaD","NAFuwQChxs",
+"lkMUAMK07Y","O3iyQJkzUn","WreyPdjsrv","9XyT9VjCZq","0KyfsWMiS3","t59lRgtCA5","C2IrcpFrrl","FLsphpmeCd","IBe8kd7vjM","MaJQspAhR1",
+"zqH0WThjNn","HRxd8CxVEf","K20wK7fKYU","fqypyOUqFM","RBhp0FGzgp","guMb8azIWp","v8yFNn8pJ9","pvgjSKASQ8","Uvlv4JRJQB","QClRLCqqaD",
+"gf8rItaOXK","MezSW1v5hH","n8pJ98RCUA","8hJdtReKEW","Mkgy8618Di","d7vjMqaofN","rKDLJ1v5hH","7Ow5CoGu6x","9rlg9AkKTk","YjB9tuLtKs",
+"zY1GY29QAz","iwzGk5Namm","48cHLwiHrZ","VBjhzt59lR","XyPZNPOUYS","MmsIo29QAz","s4786yvOMI","F6PT2Q6hMC","2DREsxReec","m4bxUuLtKs",
+"bZLvSW3VFH","nnP8orz7Ut","QYxC0NcICA","ECMvUKr8ys","AkKTkuPX7G","LbRTHs93Ml","soy9tPYBf4","GWqqXzHF1q","3weIFjS1aj","t98iWvOqCE",
+"KASQ8uN6r3","KsjRKcL0aE","dpe1vI7p2a","i7WMQaL6AJ","X6Pin9iGoT","lkMUApvgjS","4W0Tln1pmO","HfyNQjSjS3","pAhR1C2Irc","8hJdtAXpwE",
+"AXpwEY1mC0","uPX7GlH1kt","WmadAdQ586","J2mQiIBe8k","KsjRKpvgjS","gtCA5yEfy9","jeskSxReec","7fKYUMkgy8","Pb1papAhR1","xciqpZuDtD",
+"yEfy9CdyBV","WMiS3uQIcz","ThjNnOz8yZ","MmsIoeuZA5","No0QbuZPqg","yvOMI8RCUA","O3iyQRxrsm","HP433rhl0J","sx5GlHlUbF","7X3uysqVrf",
+"iqv4k8hJdt","yEfy9EoToP","MojnPKr8ys","i7WMQ7fKYU","uZPqgzHF1q","UlU3MDz1R3","Yw2oUpvgjS","lXFOBwDajX","v1Hlnni2v1","2DREsWMiS3",
+"FwEJzRxrsm","Z4I1vThjNn","7X3uyksJby","fLNg8XyPZN","tvdkDJKWYR","he9IA48cHL","ksJbyOz8yZ","16lHc7X3uy","lweGy1v5hH","5VZjSblLA9",
+"ZhwG15Drn0","FxX9qEOE1o","0h1b1KZamH","48cHLpvgjS","CxVEf07n1c","bgJAzQ6hMC","vOqCEtlILt","FjHXRru4UG","ThjNnokgRi","2ZHdkS77LH",
+"SjskQhYBCK","DQimp5Drn0","No0QbdQ586","FjHXRfmIK1","C2IrcfFDrJ","WreyPlweGy","zY1GYiKqhr","FNYIMOHaBz","1j5L8uLtKs","uN6r31LB1L",
+"G1RhSQYxC0","pv0i7Z4I1v","1j5L8uZPqg","3otm6Q6hMC","t98iWWaim6","3otm6fmIK1","v8yFNk85Ae","uZPqgMK07Y","lkMUAyEfy9","2ZHdkgdQsS",
+"DcpWBmX2GE","mz8gxgdQsS","BbwgAe6e4z","lm0pDM6qcG","d85a9FwEJz","bZLvSZhwG1","pAhR14W0Tl","4dEz6uPX7G","dQ586IRh48","QClRLBFkb8",
+"lj07QhYBCK","zFgtB1v5hH","x3LDeStlDJ","tl72WAOgEe","ZuDtDciuWz","iKqhrjtn0X","XflUqqaofN","8cVD3UlU3M","SjskQRBhp0","VNCPduQIcz",
+"ydG8U7X3uy","Yw2oUHRxd8","MK07YzqH0W","kB5nP8xEKz","W3VFHYh1hF","CxVEfqaofN","xReeck85Ae","uJScXTCgPp","uAWypJkzUn","zqH0WXyPZN",
+"v2eC3pWiOs","D6rByuPX7G","n8pJ9TCgPp","uZPqgFFDui","dmoS7580YD","55rfBP6bcg","lpF6W2Yz7E","FhtglZJTXH","5VZjSBFkb8","Q6hMCpvgjS",
+"RBhp0TXQ0Z","suY4x6q6L9","yluBxv2eC3","euZA5BCxeC","mz8gxX6Pin","uoStwWaWsv","5drc6rz7Ut","9iGoT07n1c","NAFuwBCxeC","DcpWBHlUbF",
+"AkKTkx3LDe","SjskQYw2oU","uQIcz7lUXZ","i7WMQHP433","8RCUAGrDg7","dhSuHt59lR","HRxd85nmWv","cmXIX8xEKz","gIYvE9GXkX","HP4338cVD3",
+"pAhR1azIWp","EoToP3weIF","HlUbFh1zcH","lCMxy2ZHdk","7ku1pfcJOy","M6qcGuJScX","zY1GY2DREs","fFDrJDz1R3","prNT6oGu6x","hYBCKDLhzM",
+"l83UdZUnqt","No0QbFjHXR","s93MlM6qcG","rhl0JlViBv","W7cTs7ku1p","SmGzvv1Hln","Chuy3bZLvS","o8Uyd4QMc9","aFFssX6Pin","O3iyQs93Ml",
+"KASQ8piJSk","9GXkXzqH0W","JIqXi2DREs","BpYhV8RCUA","y94nwblLA9","JXljW7ku1p","7fsYM5iGN5","pFrrlfLNg8","AmdQdJRJQB","CIShGMmsIo",
+"e6e4zOUYuF","iKqhroGu6x","tlILtjiVBP","ksJby64s8N","1v5hHAXpwE","Uvlv4mz8gx","WreyP0Wr5y","RBhp0tvdkD","vOqCEM3zXL","KASQ87ku1p",
+"hE1Ql8TxD7","zY1GYSs0Zu","CxVEfGv3Fq","580YD07n1c","K20wK8U2nU","Cfgr3gdQsS","pWiOsYjB9t","EdBKcJXljW","CNHmv0h1b1","8FmFHjS1aj",
+"2Yz7ES77LH","mz8gxVNCPd","OUqFM9XyT9","RmDcrFjHXR","nFqikazIWp","pAhR1hE1Ql","t98iWuAWyp","pv0i7OUYuF","pWiOszqH0W","45cIHAkKTk",
+"Zv7z0MmKGJ","euZA5Dz1R3","EoToPeuZA5","YjB9t0YAGH","OxWIHXyPZN","Kr8ysF6PT2","hYBCKaez9y","9GXkXzFgtB","tjQxsjfREu","pmeCdNAFuw",
+"nnP8otuDyS","uTacx4dEz6","KASQ8dmoS7","7fsYMFVMxo","FwEJzsqVrf","aFFssiqv4k","MaJQso8Uyd","IBe8katef2","CxVEfciuWz","Yh1hF14FLR",
+"I7p2apvgjS","rKDLJvLsmS","FFDui6AFT0","sqVrfulk41","POUYSJ2mQi","No0QbNcICA","ThjNndQ586","d7vjMuQIcz","W3VFHKZamH","5Drn0LewvM",
+"IKxdLoVQp6","KsjRKAXpwE","9GXkXuLtKs","VjCZqfqypy","VjCZqK4GS8","B3qem3otm6","7fsYMpiJSk","zmLYDZuDtD","x3LDeCNHmv","CNHmv8TxD7",
+"YOfrYaDGtS","OHaBzNAFuw","fqypytuDyS","5IhmGpFrrl","gjUTu2Yz7E","gjUTu0h1b1","dpe1vFLsph","Ul4a1FPfSE","AXpwERBhp0","OUYuFuTacx",
+"v1HlnXyPZN","8hJdtzY1GY","VerEApAhR1","piJSk580YD","s4786B3qem","MojnPSmGzv","QWxoTy94nw","iB08logLgc","5ZaEzbrhlQ","brhlQHRxd8",
+"48cHLZhwG1","Mkgy8NAFuw","FFDuiJXljW","jiVBPjiVBP","Y1mC0fmIK1","piJSkQChxs","29QAz9y4lw","fcwDaqQxHP","h1zcHgf8rI","hE1Qlv8yFN",
+"Ul4a14QMc9","SmGzvy94nw","uN6r35nmWv","CIShGbZLvS","WreyPPYBf4","iB08lFnPFB","QYxC0cmXIX","x3LDeZJTXH","SWfouzHF1q","Gv3FqKASQ8",
+"StlDJZ4I1v","Waim6atef2","rz7Ut2hEEU","IBe8kJ2mQi","x3LDesx5Gl","qQxHPM3zXL","lH1ktO3iyQ","Zv7z0NOHsz","8FmFHiB08l","CxVEfpmeCd",
+"IjTwPPb1pa","ZhwG1No0Qb","KsjRK7lUXZ","AIYUumz8gx","lj07Q2DREs","RpBQmUvlv4","IKxdLkB5nP","AmdQdfFDrJ","VjCZqRkQke","QChxsYOfrY",
+"soy9tECMvU","4QMc9IRh48","fcJOyRmDcr","DLhzMiwzGk","s7MxkMaJQs","0YAGHBCxeC","gIYvEjiVBP","Q6hMCfmIK1","JXljWTXQ0Z","Q6LixOz8yZ",
+"5nmWv2Yz7E","e6e4zDLhzM","nlaByAkKTk","hSSvQuvf7A","hSSvQ8xEKz","Yh1hFiqv4k","VLTy6k85Ae","SmGzvv8yFN","8U2nUmX2GE","FFDuizQt6Q",
+"VNCPdZ4I1v","pT8wuulk41","FNYIM6q6L9","M3zXLNcICA","9eoRcRpBQm","UlU3Mk85Ae","VjCZqyofH3","jzUqR0ao3l","e6e4zGrDg7","KASQ8QnJ1S",
+"KASQ8VBjhz","rKDLJZv7z0","M3zXLMmsIo","VLTy6SbRYy","2Yz7E64s8N","pWiOsQ6hMC","oVQp6gdQsS","UlU3MHP433","bZLvSwiHrZ","JkzUnSjskQ",
+"Uvlv4fLNg8","oGu6xtlILt","uZPqgRxrsm","iKqhrvOqCE","wDajXzHF1q","oQ87r2Nslm","XyPZNXflUq","2DREspv0i7","oQ87r0YAGH","qaofNfcJOy",
+"AkKTksx5Gl","CxVEf3weIF","uoStwTCgPp","aL6AJzQt6Q","aDGtSlsQGo","OUYuFPb1pa","brhlQ4QMc9","lpF6Wb29RJ","DQimpRkQke","uN6r3EoToP",
+"wDajXCNHmv","qQxHPXyPZN","jzUqRzHF1q","zY1GYgf8rI","QChxstaOXK","Z4I1vSWfou","QbxXc1v5hH","YjB9tUvlv4","FLsphBFkb8","NhXduP6bcg",
+"TwanoRsQUq","9XyT9JIqXi","45cIHJKWYR","0Kyfs0YAGH","GXdoH07n1c","Cfgr3jeskS","8U2nUd85a9","8cVD3S77LH","In3NSJJs5m","K20wKJkzUn",
+"gtCA5NAFuw","Yw2oUMezSW","zmLYDuPX7G","0PktIZzJHW","7lUXZWPmlx","kB5nP0Wr5y","1LB1LAmdQd","5IhmGlViBv","uLtKsv1Hln","qUJMd2TRI7",
+"I7p2a6q6L9","QClRLjzUqR","AkKTkzHF1q","CxVEf6AFT0","CNHmvcQOnv","x3LDeJIqXi","yofH3MGlTF","Yw2oUQYxC0","S2DfuZ4I1v","cmXIXHzZT8",
+"zqH0WlpF6W","55rfB6q6L9","8RCUAAOgEe","AIYUuY1mC0","x3LDei3pyd","uJScXFLsph","NcICABCxeC","ZJTXHQworu","FwEJzaL6AJ","0BmCyS77LH",
+"Q6hMC580YD","1v5hHv8yFN","tlILtxXTI4","8FmFHEoToP","Ta8f62Nslm","vOqCEt98iW","prNT6BCxeC","0Kyfs5IhmG","0ao3lOUqFM","VNCPd5VZjS",
+"SWfouMojnP","ZzJHWjiVBP","gIYvEn8pJ9","gIYvEDLhzM","D6rByaFFss","HRxd8fcJOy","0MR5XzQt6Q","5ZaEzdmoS7","Oz8yZWreyP","FnPFBD6rBy",
+"qQxHPm4bxU","yEfy9FPfSE","nFqikprNT6","x3LDeUvlv4","MGlTFyvOMI","dhSuHe6e4z","W7cTsTCgPp","4dEz6t59lR","IjTwPblLA9","XflUqbZLvS",
+"uQIczKr8ys","a00b5ZhwG1","4W0Tle6e4z","JJs5mgIYvE","gIYvEiKqhr","8cVD3uPX7G","WaWsv1j5L8","GWqqXuupzk","MezSWv2eC3","JkzUne6e4z",
+"zHF1qMmKGJ","QbxXcmz8gx","zQt6QjS1aj","bZLvSGSQwj","BCxeCnnP8o","gtCA5HzZT8","fFDrJ07n1c","hSSvQ7lUXZ","29QAz3otm6","Y1mC0uupzk",
+"QChxshE1Ql","zQt6QNAFuw","B3qemCdyBV","24ARFB3qem","atef2iqv4k","v8yFNDz1R3","Cfgr3In3NS","Vprf2pT8wu","i3pydRACuj","fLNg8uZPqg",
+"Twano8FmFH","ru4UGuvf7A","gf8rIHRxd8","yToGWKsjRK","BFkb8uLtKs","Ta8f6LDk6f","No0QbksJby","k85Ae0ao3l","t59lRIKxdL","14FLRFhtgl",
+"FjHXRFNYIM","G1RhShE1Ql","WaWsvl83Ud","BCxeCk85Ae","M6qcGdjsrv","ogLgcCdyBV","oGu6x7X3uy","X6PinRxrsm","FVMxojiVBP","JKWYRFnPFB",
+"fmIK19GXkX","lm0pDhe9IA","uN6r3ydG8U","Cfgr3oGu6x","AXpwEWreyP","CIShGSmGzv","aL6AJuupzk","iB08lo8Uyd","9y4lw5VZjS","NcICARzaZA",
+"Vprf2M6qcG","MmsIoaez9y","GSQwjogLgc","uoStwulk41","kZANmAIYUu","0PktICdyBV","xReec8U2nU","IRh48lm0pD","VNCPdBFkb8","IjTwPlkMUA",
+"yToGW55rfB","i7WMQh1zcH","mX2GEjtn0X","OUYuF0Wr5y","fqypyTa8f6","WMiS3OHaBz","o8Uydl83Ud","prNT6hUTw7","FPfSE8FmFH","dmoS7FNYIM",
+"WDVWJhe9IA","Vprf2jS1aj","SWfouFGzgp","atef2ydG8U","GXdoHfmIK1","lweGypT8wu","guMb82Nslm","y94nw2DREs","4dEz67ku1p","FNYIMzmLYD",
+"s4786Cfgr3","uN6r3MK07Y","BCxeCO3iyQ","MK07Yv1Hln","9eoRcHfyNQ","m4bxUEdBKc","vOqCEzHF1q","jSjS33weIF","RkQkeUlU3M","GWqqXCK5W7",
+"Q6hMCrhl0J","faHirLDk6f","2DREsgf8rI","zmLYDpWiOs","NOHszGv3Fq","Q6hMCrz7Ut","FcWrWVjCZq","BGaQYSWfou","yofH3NOHsz","QnJ1SokgRi",
+"hi5X7pT8wu","QYxC07fsYM","mz8gxhi5X7","M3zXLMm8si","SmGzvfqypy","Q6LixbrhlQ","kB5nPciuWz","5drc6JkzUn","5IhmGHP433","RBhp03otm6",
+"cShY20ao3l","J2mQiReKEW","UlU3Mo8Uyd","ZhwG11LB1L","tvdkDFVMxo","i7WMQ0ao3l","Cp3mZoQ87r","soy9tlH1kt","e6e4zAmdQd","IRh4855rfB",
+"yofH39GXkX","Pb1paB3qem","1j5L8hSSvQ","7ku1pS77LH","FGzgpJkzUn","RzaZAYw2oU","K4GS8Ta8f6","ix74rQClRL","XflUqs4786","M3zXLfmIK1",
+"29QAz0Kyfs","XflUq0PktI","AgJHQRzaZA","ogLgczz4ZU","EdBKcPOUYS","StlDJlViBv","S2DfuOUYuF","Ul4a1JIqXi","VIlwPNxx9V","XflUqcmXIX",
+"45cIHChuy3","VNCPdyToGW","fmIK1OxWIH","KsjRKzHF1q","BpYhVpiJSk","qQxHPKZamH","No0QbQssNC","dQ586IBe8k","5nmWv9XyT9","CdyBVfcwDa",
+"XflUqb29RJ","yofH37Ow5C","8cVD3Yw2oU","GSQwjazIWp","jzUqRGrDg7","24ARFReKEW","uoStwStlDJ","OHaBzB3qem","lViBvMezSW","y94nwcL0aE",
+"zY1GYTwano","dQ586aL6AJ","m4bxU2TRI7","X6Pin5VZjS","5nmWvAgJHQ","L7cGcVjCZq","QbxXciKqhr","fcJOye6e4z","b29RJd85a9","IKxdLwiHrZ",
+"QbxXcYh1hF","RzaZAaFFss","ThjNn3weIF","jSjS3ni2v1","UmaEv2TRI7","faHirCK5W7","rz7Ut0PktI","Yf2EcVBjhz","soy9tTa8f6","tjQxssuY4x",
+"No0QbAmdQd","bZLvSni2v1","CK5W7dQ586","MaJQs16lHc","jfREuk85Ae","nFqikRmDcr","6q6L98U2nU","RACujyvOMI","4dEz6W3VFH","Gv3FqCK5W7",
+"LewvMv2eC3","TXQ0ZEOE1o","MojnPaFFss","55rfB8cVD3","VBjhztjQxs","W3VFHnFqik","YjB9t5iGN5","1j5L816lHc","OxWIHs93Ml","jS1ajSWfou",
+"rz7UtGv3Fq","VNCPdtAOsr","jS1ajRxrsm","Oz8yZW3VFH","v2eC3WreyP","FhtgluPX7G","n1pmOvLsmS","8xEKzyofH3","QClRLFNYIM","lkMUAvOqCE",
+"gf8rIn8pJ9","BpYhVWDVWJ","RACujhYBCK","IjTwPFPfSE","VIlwPIBe8k","jS1aj1v5hH","zHF1qsqVrf","AmdQd2DREs","ECMvUCxVEf","LewvMFGzgp",
+"AIYUuFLsph","CdyBVbgJAz","taOXKBpYhV","MaJQsCp3mZ","9y4lwG1RhS","ni2v1sqVrf","5iGN5jSjS3","X6Pinjtn0X","7fsYMX6Pin","hUTw7qQxHP",
+"VLTy6TXQ0Z","jeskSsoy9t","pWiOsCfgr3","9GXkX8RCUA","zbIYY5Mg9r","TCgPptvdkD","48cHLkB5nP","guMb8AOgEe","QWxoT1v5hH","nnP8osoy9t",
+"lm0pD8xEKz","MGlTF9rlg9","VNCPdyofH3","v2eC3wiHrZ","0BmCym4bxU","M3zXL4dEz6","7ku1pFwEJz","G1RhSS2Dfu","jfREuW3VFH","vOqCEYw2oU",
+"FcWrW5IhmG","IKxdLBpYhV","soy9t618Di","FGzgpru4UG","k85AeGXdoH","bZLvSzY1GY","cShY2xXTI4","AXpwEB3qem","BpYhVk85Ae","tAOsrEoToP",
+"t98iWkZANm","XflUqgtCA5","FjHXRnFqik","iKqhruLtKs","RzaZAhSSvQ","okgRii3pyd","wiHrZWDVWJ","RmDcrlCMxy","faHir8TxD7","Kr8ystuDyS",
+"CdyBVogLgc","MmsIoUvlv4","MK07Y8RCUA","ReKEWazIWp","5drc655rfB","J2mQirhl0J","1LB1LRpBQm","6AFT0ThjNn","POUYSzY1GY","atef2OHaBz",
+"cShY2P6bcg","zHF1q0Kyfs","Mkgy8lweGy","ZhwG17Ow5C","J2mQi7X3uy","FxX9qCxVEf","QWxoTDcpWB","hE1QlC2Irc","he9IAzqH0W","v8yFNlCMxy",
+"IRh48rz7Ut","iB08lwiHrZ","Z4I1vfcwDa","Q6hMCCqqaD","FxX9qhYBCK","WaWsvgjUTu","QssNCulk41","rhl0J6q6L9","FVMxouupzk","jeskSzmLYD",
+"FPfSEgdQsS","cShY2GrDg7","W7cTsVIlwP","JkzUndjsrv","DQimpaL6AJ","FwEJzYOfrY","iB08lQClRL","5Drn0v2eC3","HRxd8BCxeC","SbRYywDajX",
+"b29RJXyPZN","cmXIXrhl0J","nnP8oogLgc","580YDQnJ1S","FLsphlweGy","F6PT2b29RJ","nlaByFFDui","hE1Ql4QMc9","dmoS7J2mQi","Dz1R3uQIcz",
+"d85a9ksJby","0MR5X1j5L8","pvgjSWDVWJ","MK07YiKqhr","NcICAuLtKs","XflUqlj07Q","fcwDaQYxC0","FVMxocQOnv","FVMxoYjB9t","lCMxyyluBx",
+"ZJTXHMmKGJ","ksJbyCqqaD","5drc6D6rBy","ciuWzfcJOy","zFgtBvOqCE","fcJOylpF6W","fmIK1WaWsv","FxX9quLtKs","618DicQOnv","9y4lwRmDcr",
+"9y4lwgjUTu","LewvMzbIYY","Yf2Ec3otm6","MGlTFv1Hln","RpBQmWreyP","nlaBylCMxy","FNYIMUlU3M","nlaByiwzGk","dQ586fcwDa","s4786Yh1hF",
+"MezSWrz7Ut","TwanoWmadA","5Mg9rs7Mxk","zQt6Q9iGoT","QssNCsqVrf","nFqikfcJOy","PYBf4JkzUn","atef2FjHXR","LDk6fgIYvE","OUYuFKsjRK",
+"OUYuFEOE1o","d85a9s93Ml","QYxC0fmIK1","vLsmSOxWIH","7lUXZQ6Lix","jfREu0ao3l","RpBQmZhwG1","ThjNnazIWp","dQ586LbRTH","4QMc97lUXZ",
+"Dz1R3pmeCd","i3pydVprf2","2DREsrz7Ut","uoStws7Mxk","Twanot59lR","rKDLJRkQke","jS1ajFFDui","gf8rI7lUXZ","wDajX1j5L8","l83UdyEfy9",
+"2ZHdkrz7Ut","14FLRXyPZN","gjUTu0MR5X","55rfBDz1R3","FNYIMHlUbF","Kr8ysGWqqX","9XyT9PYBf4","zbIYYk85Ae","D6rByeuZA5","9iGoTWreyP",
+"0YAGHAgJHQ","s47867X3uy","7hyVvRxrsm","JkzUnX6Pin","ZuDtDVNCPd","WDVWJCK5W7","0YAGHBGaQY","TCgPpDG4sT","CIShGpv0i7","jzUqR8U2nU",
+"CNHmvNAFuw","Pb1pa7ku1p","zFgtBzQt6Q","faHirsuY4x","zQt6QUmaEv","nFqikMK07Y","zmLYDUl4a1","lViBvrz7Ut","5Mg9r5Namm","HRxd8G1RhS",
+"QYxC02DREs","pFrrl1j5L8","7fsYMuPX7G","uLtKsWaim6","Mkgy8RkQke","QssNCbZLvS","FNYIMRxrsm","FjHXRWmadA","hSSvQlXFOB","HlUbFlXFOB",
+"5VZjSStlDJ","uvf7AYOfrY","55rfBJ2mQi","jzUqRRACuj","S2DfuDG4sT","7Ow5CSbRYy","5ZaEzmX2GE","dmoS714FLR","7fsYMtl72W","aFFssReKEW",
+"uAWypyluBx","piJSklsQGo","zbIYY5Drn0","uPX7Gb29RJ","FNYIMWreyP","UlU3M9rlg9","jfREupWiOs","dmoS7FjHXR","fmIK10BmCy","CxVEf0Kyfs",
+"2DREsM3zXL","uvf7AiKqhr","uvf7A7fKYU","ZUnqtnnP8o","Cp3mZ7lUXZ","4dEz6RpBQm","nlaByXyPZN","O3iyQU3yw5","soy9tZzJHW","t98iW5Mg9r",
+"l83Ud5Namm","Cp3mZuJScX","tvdkDJRJQB","atef2hUTw7","FGzgp29QAz","iqv4kdhSuH","EOE1o0MR5X","SbRYyprNT6","5VZjSSbRYy","I7p2aiwzGk",
+"hUTw7aFFss","jzUqRIn3NS","1j5L8uupzk","vOqCEqQxHP","uLtKsd7vjM","zqH0WJKWYR","cQOnv0PktI","ZJTXHlpF6W","IjTwPO3iyQ","ECMvUjtn0X",
+"7lUXZK4GS8","Mm8si5VZjS","7fKYUzqH0W","SbRYyS77LH","QbxXcuN6r3","5IhmGtAOsr","14FLRix74r","yofH3AgJHQ","O3iyQMmsIo","tvdkDQChxs",
+"RmDcrCqqaD","FhtglZUnqt","HRxd8YjB9t","7X3uyciuWz","aez9yBGaQY","Ul4a1guMb8","fcwDaS77LH","2Yz7EvLsmS","azIWpzmLYD","dpe1v7ku1p",
+"jtn0XoGu6x","h1zcHhYBCK","uoStwqaofN","In3NS0BmCy","dmoS7JIqXi","TXQ0Zrz7Ut","hUTw7MaJQs","KsjRKHRxd8","8RCUAzz4ZU","tlILtsoy9t",
+"64s8NWPmlx","618DifcJOy","HfyNQCNHmv","XflUqGXdoH","iKqhrhE1Ql","Nxx9VBbwgA","HRxd8guMb8","Yw2oUt98iW","a00b5S77LH","yluBxHfyNQ",
+"C2IrcgtCA5","IBe8kLewvM","NOHszTa8f6","P6bcgHlUbF","JKWYRW3VFH","VNCPdvLsmS","QworuNxx9V","NhXduQ6Lix","dhSuHJXljW","SmGzv0MR5X",
+"7fsYMTa8f6","WDVWJNxx9V","HfyNQS77LH","gjUTuStlDJ","TCgPpTCgPp","580YDuTacx","8RCUA5Mg9r","7Ow5CBFkb8","Gv3FqzY1GY","P6bcgatef2",
+"fcJOyfmIK1","1LB1LOUqFM","DLhzMFVMxo","DG4sTAmdQd","e6e4zJJs5m","wiHrZJJs5m","d7vjMZ4I1v","NcICA7ku1p","Q6hMCoQ87r","Cp3mZzz4ZU",
+"0ao3ljS1aj","AgJHQlm0pD","iKqhrtuDyS","JkzUnReKEW","8FmFHS77LH","hE1QlVerEA","LewvMFLsph","NcICAQ6hMC","cL0aEnnP8o","8FmFHoQ87r",
+"zQt6QuPX7G","TwanodmoS7","Cfgr3I7p2a","FwEJzReKEW","HzZT8kB5nP","5iGN5JKWYR","qaofNpv0i7","OUqFMfLNg8","MezSWYOfrY","OxWIHQnJ1S",
+"9GXkXFPfSE","zqH0WZJTXH","Q6LixlsQGo","AIYUupvgjS","Zv7z0LbRTH","lH1kt0YAGH","a00b5i7WMQ","BFkb8ThjNn","Yh1hFqaofN","NcICARkQke",
+"45cIHeuZA5","VNCPdxReec","Cp3mZWMiS3","tvdkDqQxHP","gIYvEM3zXL","HfyNQCxVEf","QworuhUTw7","LDk6fkZANm","BbwgAZ4I1v","GSQwjnnP8o",
+"VNCPdVNCPd","oGu6xKr8ys","QClRLF6PT2","5ZaEzjiVBP","lm0pDy94nw","0h1b18hJdt","StlDJn8pJ9","JKWYR5iGN5","YOfrY16lHc","IjTwPfLNg8",
+"ni2v1Fhtgl","NOHszYw2oU","vOqCEt59lR","RACujI7p2a","ulk415nmWv","MmKGJhSSvQ","GWqqXRkQke","yofH3lsQGo","2Yz7E0MR5X","s7MxkAXpwE",
+"F6PT2WreyP","0MR5XQnJ1S","v8yFNn1pmO","IRh489GXkX","J2mQizHF1q","AXpwEGrDg7","G1RhSpWiOs","rKDLJDLhzM","v1HlnMojnP","0PktIpWiOs",
+"YjB9tX6Pin","djsrvYh1hF","RBhp0POUYS","JKWYRtjQxs","MojnPs4786","Cfgr3StlDJ","gIYvElCMxy","OxWIHWMiS3","FFDuiwDajX","WMiS3mz8gx",
+"Uvlv4Ss0Zu","xReec7hyVv","QnJ1Slm0pD","nnP8o2DREs","CxVEfPOUYS","n8pJ9UmaEv","oGu6xoGu6x","6q6L9IBe8k","FnPFBlViBv","ksJbylm0pD",
+"WMiS39GXkX","24ARFSjskQ","zmLYDQYxC0","5IhmGGSQwj","hUTw77fKYU","1LB1LW3VFH","CdyBVi3pyd","pmeCdSs0Zu","B3qempv0i7","vOqCEAgJHQ",
+"WaWsvRkQke","POUYSJkzUn","zz4ZUVNCPd","PYBf4CdyBV","9eoRcs93Ml","k85AefcJOy","M3zXL5Namm","QWxoTQ6Lix","hYBCKDG4sT","uQIczv2eC3",
+"s4786I7p2a","8hJdtUlU3M","7lUXZdmoS7","JJs5m7hyVv","ZzJHWZhwG1","UlU3MVBjhz","8FmFHv1Hln","i3pydK20wK","Ta8f6Uvlv4","xXTI4vLsmS",
+"WmadADG4sT","5nmWvTXQ0Z","FcWrW45cIH","aDGtSIKxdL","Twanon1pmO","0Wr5ynlaBy","aFFssyofH3","OxWIHatef2","azIWpbrhlQ","XyPZNCqqaD",
+"48cHLWMiS3","Waim6PYBf4","GrDg7GXdoH","pWiOsQ6Lix","RACujdQ586","xciqpb29RJ","Z4I1vyofH3","k85AeQChxs","VjCZqvOqCE","FVMxoY1mC0",
+"rhl0JPOUYS","BCxeCVIlwP","qUJMd7Ow5C","QClRL5ZaEz","6q6L9FwEJz","ciuWza00b5","Mm8siFwEJz","QssNCSs0Zu","NAFuwSjskQ","0MR5XSmGzv",
+"RzaZAciuWz","QnJ1S2Nslm","FnPFBOz8yZ","soy9t5nmWv","prNT6atef2","SmGzv5VZjS","7X3uycShY2","QworujeskS","B3qemlH1kt","tjQxslXFOB",
+"qaofNTXQ0Z","t98iWYw2oU","zz4ZUIjTwP","uJScXHzZT8","Fhtgl8FmFH","SjskQn8pJ9","0YAGHhi5X7","FjHXRfLNg8","WPmlxjiVBP","ZuDtD7hyVv",
+"uN6r3jS1aj","uvf7ACNHmv","DG4sTlpF6W","JXljW2Yz7E","RkQkebgJAz","pAhR1oQ87r","Ta8f6oGu6x","o8UydiwzGk","qQxHPtvdkD","a00b5CdyBV",
+"fcwDagIYvE","ix74r7fsYM","aFFss2Yz7E","zqH0WaL6AJ","Zv7z0FVMxo","QChxs0YAGH","hE1QlZhwG1","pFrrltuDyS","ciuWzFLsph","hSSvQK4GS8",
+"9XyT9MojnP","QbxXcmX2GE","d85a9he9IA","wDajXlXFOB","uAWypfcJOy","IBe8kMaJQs","LewvMW7cTs","RkQke580YD","iKqhrRACuj","Ul4a1OHaBz",
+"uTacx24ARF","5Nammi3pyd","GrDg7RmDcr","CxVEfSbRYy","IjTwPQ6Lix","5drc6d85a9","qaofNOxWIH","OxWIHJKWYR","7ku1p1j5L8","zHF1qoVQp6",
+"nnP8oB3qem","b29RJQbxXc","HP4338U2nU","pWiOsogLgc","uJScXcQOnv","Ul4a1S77LH","uvf7Am4bxU","QworuoVQp6","AXpwEHfyNQ","suY4xGWqqX",
+"8xEKzlj07Q","sx5GlpAhR1","hUTw7uTacx","n1pmOkB5nP","9rlg9ZUnqt","9iGoTdjsrv","AkKTktAOsr","ZUnqtzHF1q","Mkgy81j5L8","brhlQKsjRK",
+"FhtglMaJQs","FLsphi3pyd","QChxsni2v1","7hyVvIjTwP","RkQkeIBe8k","Ul4a1RBhp0","lweGygtCA5","SmGzvLewvM","LewvMAmdQd","9y4lwyvOMI",
+"okgRipAhR1","zQt6Q6AFT0","CNHmv8RCUA","tjQxsdQ586","l83UdTXQ0Z","W3VFHSs0Zu","64s8NFLsph","CNHmvJJs5m","QChxsCxVEf","pAhR1CIShG",
+"Pb1paQChxs","v2eC3Mm8si","HRxd8VLTy6","J2mQiGrDg7","O3iyQZuDtD","n1pmOokgRi","RmDcr7ku1p","yofH3aFFss","e6e4zHfyNQ","jSjS3fFDrJ",
+"KASQ8SbRYy","9GXkXWDVWJ","faHird85a9","RxrsmSWfou","djsrve6e4z","mz8gxFGzgp","OHaBzPYBf4","iKqhrKsjRK","YOfrYuAWyp","jzUqRCfgr3",
+"AmdQdv2eC3","24ARFBGaQY","uPX7GYOfrY","2DREslCMxy","C2IrcY1mC0","L7cGcS77LH","WreyPSbRYy","JRJQBs7Mxk","XflUqdmoS7","Ul4a1X6Pin",
+"HzZT8v1Hln","MmsIolViBv","guMb8pWiOs","AgJHQPb1pa","lm0pDlj07Q","9rlg9hYBCK","QWxoTGv3Fq","Yw2oUJkzUn","HRxd8kZANm","azIWpHlUbF",
+"64s8NzqH0W","RzaZAJKWYR","Ta8f6i3pyd","vkCHHOz8yZ","2NslmUl4a1","M6qcGDz1R3","soy9tTCgPp","fLNg8fLNg8","QClRLPYBf4","XflUqsuY4x",
+"QssNCsx5Gl","i7WMQd85a9","StlDJFGzgp","FVMxoSbRYy","9rlg9jSjS3","Mm8sii3pyd","7ku1p0Kyfs","ciuWzJkzUn","s93MlMmKGJ","atef2Vprf2",
+"uvf7AZJTXH","0Wr5y6q6L9","FNYIMIRh48","I7p2aaL6AJ","HRxd8taOXK","lViBvv8yFN","Cfgr35ZaEz","faHir5Mg9r","No0QbfcwDa","WDVWJ4W0Tl",
+"yToGW29QAz","RBhp00Kyfs","uoStws93Ml","mz8gxZzJHW","GXdoHulk41","QChxsuN6r3","jS1ajAkKTk","CdyBVThjNn","55rfBHfyNQ","9rlg9lweGy",
+"jeskSAgJHQ","1v5hHOz8yZ","0Wr5yJXljW","TwanoaDGtS","DcpWB7ku1p","pmeCdnFqik","580YD5ZaEz","3weIFFjHXR","M3zXLyofH3","2TRI7QChxs",
+"MojnPSWfou","48cHLEOE1o","cL0aERxrsm","nlaByFnPFB","dQ586UlU3M","ciuWz9rlg9","v8yFNv2eC3","d7vjMfFDrJ","NcICAVjCZq","aDGtSaDGtS",
+"K20wK5drc6","cL0aEHP433","HP433hYBCK","yEfy9K4GS8","29QAzni2v1","aez9yAmdQd","618Di0PktI","StlDJd7vjM","yEfy9guMb8","48cHLmX2GE",
+"8FmFH8U2nU","S2DfudhSuH","618DixReec","KZamHFFDui","W7cTsqaofN","vOqCETa8f6","2DREsWDVWJ","VIlwPCfgr3","RmDcrAXpwE","gf8rIAIYUu",
+"IBe8kjiVBP","ThjNnoVQp6","kZANmC2Irc","VjCZqGrDg7","djsrvCIShG","CdyBVdjsrv","GWqqXThjNn","JJs5m24ARF","5Mg9rbrhlQ","TwanopvgjS",
+"Mkgy8jeskS","xXTI4ni2v1","Vprf2Yf2Ec","BbwgAPOUYS","hSSvQhSSvQ","ZhwG1djsrv","UlU3Mt98iW","BpYhVyvOMI","dpe1vvkCHH","K20wKAgJHQ",
+"GrDg78FmFH","pAhR1VLTy6","lweGy0Kyfs","SWfouFwEJz","azIWpQbxXc","QWxoTxReec","jeskSY1mC0","fqypy1v5hH","cShY2d85a9","U3yw564s8N",
+"bZLvS7Ow5C","uQIczSjskQ","i7WMQRkQke","VLTy6K20wK","wiHrZG1RhS","h1zcH0Kyfs","AgJHQsqVrf","x3LDejiVBP","zFgtBMGlTF","Gv3Fqru4UG",
+"D6rByaez9y","zFgtBRBhp0","QClRLmz8gx","In3NSYf2Ec","lCMxyMGlTF","Pb1paGWqqX","hi5X7cmXIX","Zv7z0BGaQY","xciqpTXQ0Z","7ku1pZuDtD",
+"qaofNatef2","HRxd8Kr8ys","iB08lix74r","cQOnvRmDcr","tjQxsJXljW","tl72WCNHmv","IBe8kd85a9","taOXKsoy9t","pWiOsIRh48","4dEz6faHir",
+"kZANmSjskQ","cL0aEHfyNQ","uoStwYw2oU","AIYUulXFOB","W7cTsFhtgl","lViBvO3iyQ","ReKEW9eoRc","jfREuzqH0W","8hJdtJKWYR","5Drn0IRh48",
+"tlILtUmaEv","2ZHdkSjskQ","hUTw7OUqFM","Z4I1vhi5X7","9XyT9ZzJHW","5iGN51LB1L","Ul4a1lm0pD","nFqikMm8si","Mm8siZJTXH","pmeCdlweGy",
+"zmLYDOUqFM","7fsYMgtCA5","LDk6fx3LDe","LewvMhYBCK","ZUnqtwiHrZ","zz4ZUOUYuF","FhtglB3qem","oQ87r3weIF","ciuWzMojnP","3weIFs7Mxk",
+"RBhp0RzaZA","dQ586W3VFH","GrDg7KsjRK","5Mg9rn1pmO","uAWyp45cIH","IBe8kNOHsz","QworuTa8f6","hE1QlNo0Qb","7fKYU4dEz6","C2IrcHlUbF",
+"pT8wuVNCPd","vLsmStaOXK","0Wr5yNOHsz","pvgjStvdkD","qQxHPs93Ml","In3NSiB08l","Kr8ysAXpwE","v8yFNhe9IA","ECMvUS77LH","uZPqgGrDg7",
+"qQxHPNAFuw","14FLRaL6AJ","WDVWJHlUbF","ni2v1uN6r3","m4bxUAmdQd","zqH0WG1RhS","EdBKcn8pJ9","618Di14FLR","9y4lwydG8U","Cp3mZ7ku1p",
+"MmKGJP6bcg","W7cTs8cVD3","GXdoHdQ586","AkKTksoy9t","iqv4ki3pyd","P6bcgDcpWB","Yf2EcCfgr3","hE1QlFwEJz","Mm8siZ4I1v","AIYUuThjNn",
+"vOqCEW7cTs","zmLYDM3zXL","gdQsS4W0Tl","taOXKlpF6W","VBjhzOUqFM","b29RJZ4I1v","CqqaDI7p2a","1LB1Ld85a9","0KyfsoQ87r","9iGoTrhl0J",
+"WmadAzY1GY","s93MljiVBP","dQ586CxVEf","CxVEfcQOnv","9GXkXwiHrZ","1LB1L9XyT9","OHaBzRACuj","gdQsSJKWYR","RxrsmVprf2","7ku1pgdQsS",
+"ZuDtDHRxd8","aDGtSKr8ys","4W0TlK4GS8","4dEz6dhSuH","MGlTFGv3Fq","RsQUqtl72W","ru4UGy94nw","jS1aj64s8N","vLsmS618Di","W3VFHh1zcH",
+"NOHszl83Ud","cL0aES2Dfu","5nmWvyEfy9","RACujDz1R3","YjB9tnnP8o","5Mg9rokgRi","blLA9djsrv","tvdkDDcpWB","fqypyFVMxo","JKWYRMkgy8",
+"cL0aENo0Qb","uLtKsoQ87r","mX2GEZuDtD","fmIK1YjB9t","618DiDz1R3","t98iWjzUqR","sx5GlBbwgA","JkzUni7WMQ","RBhp0CK5W7","7hyVv8xEKz",
+"HRxd8B3qem","45cIHFcWrW","WmadARmDcr","rKDLJOUYuF","dpe1vKsjRK","YjB9tQ6Lix","ydG8UWPmlx","48cHLuQIcz","SbRYyOHaBz","vOqCEMGlTF",
+"9rlg95Namm","v8yFNQ6hMC","FjHXR7lUXZ","okgRihUTw7","ru4UGZuDtD","pFrrlQ6Lix","CNHmvSmGzv","UlU3MM3zXL","ni2v1gdQsS","Yw2oUfcJOy",
+"NOHszdmoS7","Ul4a1ReKEW","iwzGk9XyT9","gtCA5vLsmS","8hJdtrz7Ut","XflUqvOqCE","W3VFHZhwG1","hUTw7i7WMQ","Fhtgl7ku1p","qaofNOHaBz",
+"0PktI9iGoT","MezSWdQ586","0YAGHWMiS3","b29RJCK5W7","F6PT2ReKEW","fcJOyyluBx","aFFssFNYIM","ni2v1Vprf2","s4786RsQUq","o8UydP6bcg",
+"zQt6QuN6r3","580YD7hyVv","k85AeStlDJ","YOfrYMkgy8","P6bcgM6qcG","DG4sT5iGN5","QYxC0uTacx","zz4ZUQworu","uPX7Gd85a9","ReKEWhUTw7",
+"hSSvQ16lHc","soy9t2TRI7","9rlg9lm0pD","lH1ktsx5Gl","AkKTkcShY2","d85a9ECMvU","blLA9GXdoH","iB08lRACuj","qQxHPBpYhV","blLA97ku1p",
+"Mkgy8pFrrl","0Wr5y0ao3l","Zv7z0SWfou","EdBKcHP433","lkMUAStlDJ","9y4lwd85a9","sx5Gl5Namm","QChxswDajX","5VZjSZhwG1","vOqCEhE1Ql",
+"JKWYR4QMc9","s4786Waim6","n8pJ9aL6AJ","Y1mC0ReKEW","1LB1LgIYvE","BbwgA7Ow5C","iB08laDGtS","oGu6x4dEz6","uoStwuLtKs","jSjS3o8Uyd",
+"tjQxskB5nP","k85AeAkKTk","d7vjMECMvU","ZzJHWSbRYy","FcWrWQ6Lix","kB5nPtlILt","sx5GlAXpwE","HzZT8nlaBy","MK07YKsjRK","fmIK1lH1kt",
+"0ao3lJJs5m","jeskS7hyVv","lViBvFnPFB","t98iWdQ586","tvdkDZJTXH","HfyNQ8cVD3","yEfy9AXpwE","i7WMQQWxoT","kB5nPjeskS","tuDySciuWz",
+"fcwDaYjB9t","Vprf2KsjRK","FGzgpx3LDe","IBe8kNhXdu","WPmlxCxVEf","5Namm0BmCy","pv0i7CIShG","07n1cpiJSk","DLhzMlweGy","pFrrlX6Pin",
+"IBe8kOUYuF","Uvlv4fFDrJ","xXTI4S77LH","atef2jfREu","d85a9MezSW","VBjhzEOE1o","k85Ae64s8N","Chuy3tlILt","d85a95ZaEz","DG4sT8xEKz",
+"uAWypDcpWB","dpe1vMezSW","s93Mltl72W","2NslmStlDJ","JRJQB2hEEU","QworuzY1GY","FLsphK20wK","7fsYMHRxd8","AkKTksqVrf","OUYuFYjB9t",
+"7lUXZFwEJz","prNT6kB5nP","jfREu7hyVv","QChxsydG8U","Dz1R3JIqXi","F6PT2XflUq","4QMc9n1pmO","Vprf2QChxs","UmaEvi7WMQ","zHF1qGXdoH",
+"WaWsvK20wK","Nxx9VJXljW","x3LDeuupzk","ix74rmX2GE","lsQGo07n1c","3otm6WPmlx","jeskSAXpwE","FLsphEdBKc","9rlg9HfyNQ","MK07YK4GS8",
+"BGaQYTwano","ciuWzAkKTk","HRxd8lViBv","mz8gxRkQke","ix74rThjNn","HlUbFThjNn","vOqCE1v5hH","gjUTuazIWp","In3NSd85a9","fcwDaBCxeC",
+"QssNCCNHmv","Oz8yZGv3Fq","AIYUuuvf7A","FFDuiQChxs","QWxoTKASQ8","ThjNnuvf7A","QChxsaL6AJ","RACujHRxd8","l83UdQWxoT","9XyT9LewvM",
+"0ao3l5Mg9r","EOE1ojiVBP","8TxD7v2eC3","zQt6QjSjS3","S2Dfui7WMQ","iqv4kgf8rI","VBjhzgjUTu","3weIFJ2mQi","In3NStuDyS","KsjRK5nmWv",
+"8RCUAQworu","8cVD3jSjS3","vOqCEyEfy9","zbIYYbZLvS","2NslmJkzUn","vOqCEDcpWB","9eoRcyluBx","hUTw7VLTy6","0PktIKr8ys","zHF1q0ao3l",
+"GrDg7zbIYY","2NslmAXpwE","Dz1R3v8yFN","NOHszk85Ae","MmKGJFjHXR","WmadAPb1pa","cShY2iKqhr","HRxd829QAz","kZANmRkQke","8cVD3PYBf4",
+"Nxx9VlkMUA","yEfy92DREs","Mkgy85IhmG","O3iyQoQ87r","iB08l55rfB","P6bcg5VZjS","5Drn0FVMxo","i7WMQni2v1","t59lRcQOnv","h1zcHiqv4k",
+"DLhzM5ZaEz","QworuIBe8k","IRh48o8Uyd","Mm8si7fKYU","8U2nUjiVBP","uoStwoVQp6","d85a9BbwgA","SbRYyHP433","9iGoTfaHir","L7cGcpWiOs",
+"Mm8siCdyBV","Q6hMCQWxoT","No0QbS77LH","JkzUnK4GS8","BFkb8P6bcg","yluBx0MR5X","2ZHdkL7cGc","MmsIoFnPFB","uoStwhUTw7","AkKTkzFgtB",
+"yluBxlj07Q","55rfBVLTy6","14FLRzbIYY","9GXkXfLNg8","Yw2oUUl4a1","ZzJHWQClRL","tlILt14FLR","uupzknnP8o","VerEADG4sT","t98iW8FmFH",
+"AmdQdFxX9q","P6bcgfaHir","CNHmvfcJOy","Mkgy88hJdt","xciqp8cVD3","d7vjMiB08l","ksJby0Kyfs","qaofNWaim6","oGu6xLbRTH","PYBf4OHaBz",
+"cL0aEDLhzM","QssNCrKDLJ","lsQGoksJby","HfyNQDQimp","AOgEeEdBKc","6q6L9jS1aj","No0QbzqH0W","pmeCdAkKTk","hYBCKWPmlx","0PktIru4UG",
+"RzaZANOHsz","6AFT0BFkb8","euZA5xciqp","P6bcgfcJOy","9eoRcs4786","16lHccQOnv","zbIYYv1Hln","8hJdtCNHmv","sx5GlYw2oU","cQOnvxReec",
+"ECMvUtjQxs","cShY2Dz1R3","cShY2hE1Ql","O3iyQzFgtB","Yw2oUW7cTs","b29RJL7cGc","Waim6Q6Lix","9y4lwciuWz","mX2GE8cVD3","blLA9CxVEf",
+"VBjhzFVMxo","zqH0Wix74r","aDGtS9eoRc","IjTwPDz1R3","ogLgciKqhr","n8pJ92Nslm","29QAzuupzk","rKDLJmz8gx","uoStw5Namm","tl72WyofH3",
+"tl72WciuWz","lpF6WWDVWJ","v8yFNGSQwj","jtn0XfmIK1","0BmCyDLhzM","ix74rYh1hF","7hyVvbgJAz","RpBQmYw2oU","vOqCEjzUqR","OHaBzpFrrl",
+"v8yFN5VZjS","e6e4zhE1Ql","WreyPiB08l","OxWIH1v5hH","AXpwERxrsm","rKDLJfcwDa","b29RJWMiS3","Z4I1vVjCZq","s93MluJScX","IBe8kAkKTk",
+"4dEz6iKqhr","fFDrJKASQ8","uQIczfcwDa","i7WMQMkgy8","zQt6QzFgtB","2DREsCdyBV","GSQwjoVQp6","KASQ8JkzUn","n1pmOSjskQ","dpe1vo8Uyd",
+"SbRYyfqypy","NhXdu7X3uy","dQ586XyPZN","8hJdtzz4ZU","1LB1LJIqXi","FwEJzk85Ae","BCxeCiB08l","EOE1oPb1pa","8TxD7Uvlv4","WmadAXflUq",
+"pFrrllViBv","WMiS3l83Ud","QbxXc8TxD7","uPX7GUl4a1","CdyBVKsjRK","s4786J2mQi","pT8wupT8wu","5Mg9rAOgEe","Yw2oUCp3mZ","VjCZqVIlwP",
+"QssNCIRh48","lweGyHRxd8","kZANmuoStw","6q6L9GWqqX","ix74rD6rBy","SbRYytaOXK","zqH0W9rlg9","5Mg9rOUqFM","VNCPdjeskS","fcJOyaDGtS",
+"W3VFHokgRi","fqypyDcpWB","uJScX5Drn0","IBe8kb29RJ","pvgjS1j5L8","L7cGcuTacx","ZUnqtxciqp","U3yw55iGN5","0ao3lcmXIX","tuDyS1j5L8",
+"ix74rzHF1q","RBhp0y94nw","JKWYRRkQke","Ta8f6CIShG","CIShGd7vjM","P6bcgBpYhV","DcpWBjS1aj","AkKTkCNHmv","zY1GYyofH3","2Yz7ELbRTH",
+"UmaEv5nmWv","AkKTkQworu","pAhR1QChxs","EdBKcguMb8","3weIF2ZHdk","ksJbyMm8si","FjHXRQnJ1S","jeskSulk41","jiVBPfaHir","aFFssIBe8k",
+"CK5W7IKxdL","fcwDalkMUA","h1zcHyEfy9","uvf7Aiqv4k","7Ow5CGXdoH","JKWYRYOfrY","lpF6WKZamH","FPfSEiqv4k","GXdoH0Kyfs","s4786Nxx9V",
+"uPX7GfaHir","BpYhVdQ586","JIqXiv1Hln","WreyPLewvM","3otm6Rxrsm","7fsYMDz1R3","Gv3FqpT8wu","h1zcH1LB1L","IBe8kv8yFN","uZPqgQClRL",
+"9GXkXb29RJ","0MR5X8TxD7","vOqCE4W0Tl","faHir64s8N","AIYUudjsrv","FFDuiCNHmv","t98iWQYxC0","1j5L8580YD","AIYUuPOUYS","oGu6xnFqik",
+"euZA5P6bcg","SjskQ5nmWv","ZhwG1LbRTH","DG4sTNOHsz","Gv3Fqhi5X7","faHirF6PT2","djsrv2hEEU","FPfSE5ZaEz","zQt6QZ4I1v","zbIYYMmKGJ",
+"x3LDeMaJQs","RkQke8U2nU","Oz8yZRBhp0","EOE1oyEfy9","nFqikSmGzv","OUqFM0MR5X","i3pydAgJHQ","azIWpiwzGk","YOfrYFjHXR","Yf2EcfLNg8",
+"oVQp6Pb1pa","580YDmz8gx","HP433CK5W7","MmKGJgtCA5","X6PinS77LH","fmIK1AgJHQ","IjTwPqUJMd","i7WMQMmsIo","zQt6Q0Kyfs","zFgtBF6PT2",
+"VNCPdzFgtB","iKqhrNhXdu","Mm8simX2GE","yEfy9t98iW","RACujdjsrv","ru4UGOz8yZ","P6bcgSjskQ","HRxd8aL6AJ","vOqCEChuy3","VjCZqIKxdL",
+"NcICA5Mg9r","VjCZqprNT6","14FLRgtCA5","O3iyQCK5W7","yofH3JkzUn","uPX7GJXljW","B3qemIjTwP","0ao3lJKWYR","hi5X79eoRc","BGaQYG1RhS",
+"RzaZAUvlv4","9y4lwW7cTs","jtn0XHRxd8","JRJQBChuy3","2ZHdkfcwDa","hE1QlBbwgA","Ss0Zus93Ml","QYxC00ao3l","RxrsmwiHrZ","Q6hMCEoToP",
+"ru4UG0PktI","6q6L9prNT6","Q6Lix6q6L9","9GXkXUl4a1","Chuy3Cp3mZ","gtCA5nnP8o","AmdQdeuZA5","FGzgpblLA9","2hEEU5drc6","WreyPIBe8k",
+"SjskQxXTI4","4QMc9K20wK","prNT6vOqCE","brhlQ9rlg9","UmaEvd85a9","JkzUnVNCPd","4QMc9AOgEe","blLA9cQOnv","dhSuHydG8U","jiVBPYOfrY",
+"bgJAzhe9IA","e6e4zSbRYy","580YDzY1GY","gdQsSjfREu","zz4ZUuN6r3","Ss0ZuMkgy8","IBe8kuPX7G","U3yw5suY4x","8hJdtRACuj","FNYIM48cHL",
+"WreyPZuDtD","D6rByCxVEf","tvdkDSbRYy","n8pJ9s7Mxk","iwzGkSWfou","UmaEv580YD","NOHszNo0Qb","VBjhzWaim6","ix74rsqVrf","WDVWJx3LDe",
+"4dEz69y4lw","ZzJHWCK5W7","prNT6jeskS","Vprf2s4786","B3qemI7p2a","3otm6jeskS","ksJbylsQGo","AIYUuhSSvQ","No0QbMojnP","lXFOBHfyNQ",
+"QssNCVjCZq","BCxeCx3LDe","FjHXRGrDg7","EdBKc7hyVv","K4GS8ZUnqt","taOXKYOfrY","ZJTXH0Wr5y","FFDuik85Ae","3otm62Nslm","wDajXt59lR",
+"iqv4kjfREu","zHF1qmz8gx","7Ow5ClXFOB","PYBf4b29RJ","MK07Yhi5X7","jSjS35nmWv","JXljWpAhR1","OxWIHvOqCE","soy9trz7Ut","K4GS8XyPZN",
+"Cfgr3hSSvQ","5VZjSvLsmS","LbRTHF6PT2","4QMc9Q6Lix","GrDg7uJScX","NhXduKsjRK","FhtglCdyBV","GrDg7oVQp6","QnJ1Sx3LDe","hE1QljiVBP",
+"uQIczIjTwP","Dz1R3BFkb8","FxX9qMojnP","a00b5hE1Ql","RxrsmBbwgA","NAFuwGv3Fq","ciuWzStlDJ","5NammRpBQm","lsQGoru4UG","dpe1v0PktI",
+"0MR5XdmoS7","4W0Tlv8yFN","iwzGkdhSuH","5NammBpYhV","UlU3M7fsYM","uAWypKr8ys","WmadAGSQwj","fcJOyBbwgA","vOqCEVNCPd","JIqXii3pyd",
+"CIShGO3iyQ","Q6LixHlUbF","zQt6QbZLvS","JKWYR7Ow5C","fmIK1Ul4a1","QworuIKxdL","QYxC0dQ586","n1pmOWDVWJ","vOqCENhXdu","lweGyLDk6f",
+"o8UydfLNg8","zQt6QNcICA","bgJAz0h1b1","qQxHPcQOnv","KsjRKd85a9","vkCHHYjB9t","07n1cpv0i7","PYBf4gjUTu","FwEJznFqik","SbRYyRsQUq",
+"uJScXd7vjM","UmaEvFjHXR","0PktIBGaQY","Vprf2HfyNQ","lsQGoBpYhV","FPfSE5drc6","Cp3mZCNHmv","xciqplViBv","07n1cmX2GE","D6rByKsjRK",
+"ru4UGi7WMQ","CxVEfXyPZN","KASQ8GSQwj","Q6Lixi3pyd","5iGN5U3yw5","StlDJtuDyS","9GXkXpiJSk","QWxoT8FmFH","s4786EoToP","lViBvuoStw",
+"h1zcHhe9IA","OHaBzzY1GY","vkCHHSmGzv","mz8gxEdBKc","FNYIMxReec","n1pmOjfREu","Cfgr3fmIK1","RkQke7fsYM","Ss0ZuWmadA","AXpwEi3pyd",
+"2TRI7bgJAz","bgJAzDG4sT","JIqXi9GXkX","GrDg7kZANm","0YAGHv8yFN","ix74rReKEW","QClRLUlU3M","MaJQsMK07Y","VerEABCxeC","h1zcH8xEKz",
+"oGu6xIn3NS","YjB9tO3iyQ","9XyT9W7cTs","7Ow5CJXljW","6AFT0pWiOs","QssNCsuY4x","zQt6QYf2Ec","1LB1LStlDJ","pFrrlulk41","xXTI4Ta8f6",
+"hUTw7aez9y","2TRI78xEKz","L7cGcPOUYS","Dz1R3oGu6x","24ARFKsjRK","uTacxF6PT2","WmadAbrhlQ","x3LDeblLA9","FnPFBFNYIM","sx5GlJ2mQi",
+"CNHmvn8pJ9","MmKGJ1LB1L","ZJTXHNxx9V","Vprf2pWiOs","AOgEe5drc6","ZuDtDHfyNQ","K4GS8StlDJ","FxX9q0BmCy","In3NSReKEW","dQ586Cfgr3",
+"ksJbyb29RJ","YOfrYtAOsr","JJs5mfcwDa","i7WMQ9iGoT","lH1kt14FLR","ZzJHW0YAGH","rhl0JYjB9t","dhSuH2Yz7E","tvdkDzmLYD","1v5hHChuy3",
+"Chuy3RsQUq","9eoRcuPX7G","prNT614FLR","NAFuwpiJSk","dmoS7P6bcg","aDGtSydG8U","9XyT91j5L8","x3LDe0h1b1","55rfB7fKYU","FwEJz0YAGH",
+"VNCPdCfgr3","OHaBz7X3uy","KASQ8jSjS3","HRxd8uPX7G","HzZT88xEKz","S77LHYh1hF","zHF1qNAFuw","taOXKTwano","tvdkDwiHrZ","KASQ8WaWsv",
+"hE1QlwDajX","uJScXQ6hMC","S2DfuMm8si","GSQwjKsjRK","VNCPdl83Ud","lXFOBC2Irc","4QMc9QnJ1S","Ss0ZujeskS","dmoS7okgRi","hi5X71LB1L",
+"gIYvErhl0J","64s8NMmKGJ","RxrsmDLhzM","ZJTXHlViBv","8U2nU2Yz7E","Dz1R3FxX9q","Yf2EcfmIK1","BGaQYv1Hln","5VZjSFGzgp","x3LDen1pmO",
+"Z4I1vdQ586","CqqaDCqqaD","wiHrZlsQGo","l83Ud0ao3l","7ku1pmz8gx","AIYUu0PktI","jSjS3TXQ0Z","FGzgpGSQwj","iB08l2TRI7","gIYvERzaZA",
+"KZamHOxWIH","rz7Ut0ao3l","580YDUlU3M","lweGyk85Ae","0PktIBbwgA","kZANm55rfB","uN6r3djsrv","Zv7z0taOXK","oVQp6BGaQY","lH1ktFjHXR",
+"NOHszEOE1o","Uvlv4OUYuF","UmaEvgdQsS","hUTw7s7Mxk","soy9tlkMUA","lCMxyzQt6Q","qQxHPjiVBP","tjQxsWPmlx","fLNg8YjB9t","7Ow5CaL6AJ",
+"Ss0ZunlaBy","aFFssZzJHW","fmIK1WPmlx","uTacxlsQGo","FxX9qHlUbF","3otm6ogLgc","Ss0ZuFhtgl","BpYhVaez9y","IjTwPzFgtB","VjCZqPb1pa",
+"ReKEWulk41","uPX7GStlDJ","dmoS7Kr8ys","64s8Ni7WMQ","aez9yHlUbF","cmXIXoVQp6","uZPqgGXdoH","fcJOypv0i7","9y4lwlViBv","tAOsr14FLR",
+"AIYUu14FLR","aez9yIjTwP","OHaBzciuWz","x3LDezQt6Q","uvf7AfaHir","Uvlv4WmadA","BFkb8rz7Ut","SmGzvtjQxs","QworuUlU3M","PYBf40ao3l",
+"o8Uyd45cIH","fcwDaQWxoT","CIShGJJs5m","QnJ1SStlDJ","OHaBzulk41","BCxeClm0pD","NAFuwQWxoT","HRxd8ulk41","6q6L9t59lR","hSSvQqaofN",
+"lm0pDbZLvS","Waim62ZHdk","Oz8yZlsQGo","atef2b29RJ","5Mg9rYh1hF","QnJ1SzmLYD","BGaQYpAhR1","prNT6IKxdL","lkMUA0YAGH","JIqXiZUnqt",
+"AmdQdMojnP","aFFssKr8ys","uAWypjSjS3","RBhp0lpF6W","d85a9uupzk","RpBQmMezSW","lweGyjfREu","5VZjShE1Ql","uAWypMK07Y","IKxdLW3VFH",
+"n1pmOlm0pD","XflUqfcwDa","7lUXZLDk6f","rhl0Jk85Ae","fqypyMaJQs","QYxC0X6Pin","VLTy6kZANm","bgJAz7X3uy","0h1b1SjskQ","RzaZAoVQp6",
+"hYBCK48cHL","IjTwPYjB9t","FVMxoUlU3M","t98iWC2Irc","zFgtB8RCUA","HP433EdBKc","64s8NZUnqt","8TxD7tuDyS","MezSWYjB9t","VjCZqyToGW",
+"MojnP8FmFH","Ta8f6FjHXR","7lUXZeuZA5","F6PT2oVQp6","ksJbypmeCd","7fKYUlpF6W","8xEKzguMb8","0Wr5yhE1Ql","P6bcggIYvE","s93Mlulk41",
+"o8UydCdyBV","zFgtB5VZjS","7fKYUn1pmO","hUTw7iqv4k","16lHcgf8rI","Mkgy8MmsIo","uQIcz2DREs","OHaBzfFDrJ","Fhtgl5VZjS","i7WMQzFgtB",
+"k85AeM6qcG","AOgEetuDyS","AXpwEpT8wu","nnP8o7fKYU","he9IArKDLJ","WDVWJgf8rI","0h1b1x3LDe","Y1mC0jeskS","a00b5KsjRK","TwanoSjskQ",
+"WaWsvpFrrl","wDajXyToGW","ogLgcSs0Zu","8xEKzbrhlQ","qQxHPt59lR","5nmWvjiVBP","jtn0XLbRTH","55rfBVIlwP","BCxeCFNYIM","618DihSSvQ",
+"RzaZA45cIH","0KyfsdmoS7","jiVBPgIYvE","TwanoCqqaD","VBjhz8RCUA","MezSW9eoRc","xXTI4Yf2Ec","29QAz8FmFH","h1zcHt98iW","ru4UGpFrrl",
+"AgJHQfcJOy","pT8wutvdkD","ksJby29QAz","D6rByksJby","wDajXhUTw7","GrDg70BmCy","KASQ85Namm","taOXKK20wK","cShY2RACuj","vkCHHx3LDe",
+"D6rBysoy9t","zmLYDJkzUn","uQIczvOqCE","FFDuiQbxXc","GSQwjbgJAz","mz8gx24ARF","aFFssCfgr3","yToGWjtn0X","i7WMQNAFuw","wiHrZ45cIH",
+"0PktIEdBKc","3weIF7Ow5C","qaofNQssNC","ZJTXHTCgPp","iKqhr5Mg9r","O3iyQdpe1v","YjB9tGXdoH","9rlg9KsjRK","pAhR1lpF6W","ECMvUyToGW",
+"BbwgARkQke","NhXduX6Pin","FLsphfcwDa","CxVEfjfREu","UlU3Mmz8gx","yEfy9uQIcz","ZzJHWECMvU","VNCPdRkQke","Q6hMCaL6AJ","t98iWReKEW",
+"iwzGk7hyVv","XflUqL7cGc","WDVWJJIqXi","jiVBPIBe8k","y94nwOxWIH","m4bxUKZamH","fqypywiHrZ","prNT65Drn0","b29RJP6bcg","1j5L8Chuy3",
+"AXpwEFjHXR","Gv3FqQWxoT","S2DfuK4GS8","pmeCdB3qem","BFkb8pmeCd","ZzJHWL7cGc","0ao3lk85Ae","64s8NDLhzM","tl72WFwEJz","ksJbycL0aE",
+"16lHcQChxs","pmeCdbgJAz","uZPqgPYBf4","Mkgy8QnJ1S","29QAztlILt","JkzUnJIqXi","WaWsv8FmFH","VIlwPaDGtS","HlUbF4W0Tl","VjCZqoGu6x",
+"tl72Wd85a9","QChxsnnP8o","oVQp6Dz1R3","Nxx9VqQxHP","7hyVvmz8gx","16lHc8TxD7","AIYUuuPX7G","lkMUAWmadA","HRxd8KsjRK","8RCUAix74r",
+"nFqikv2eC3","yEfy9B3qem","yvOMIhi5X7","v1HlnsqVrf","0Wr5yix74r","MaJQsAIYUu","fmIK10ao3l","ZzJHWgdQsS","9rlg9QClRL","0PktI4QMc9",
+"HfyNQd7vjM","lXFOBh1zcH","djsrvdjsrv","29QAzEdBKc","lkMUARBhp0","VNCPdPOUYS","zQt6QCdyBV","7fsYMvLsmS","Cfgr3CIShG","Ta8f6GSQwj",
+"W7cTsdhSuH","uvf7A0PktI","JIqXiyToGW","gdQsStAOsr","ru4UG0Wr5y","KsjRKHlUbF","pv0i77hyVv","iqv4kiqv4k","OHaBzaDGtS","WMiS3mX2GE",
+"M6qcGfmIK1","nnP8oi7WMQ","8RCUArz7Ut","t98iWlkMUA","pFrrlyEfy9","i7WMQMm8si","hE1QlpFrrl","6AFT0aez9y","suY4x1v5hH","DG4sTAkKTk",
+"xciqp5Drn0","7lUXZ8FmFH","MojnPjfREu","BbwgApAhR1","FnPFBGSQwj","djsrv3weIF","zFgtBWmadA","bgJAz7fKYU","d7vjM0YAGH","MojnPKZamH",
+"BGaQY1j5L8","JJs5mcShY2","Z4I1vDG4sT","Vprf2CdyBV","0BmCyU3yw5","HlUbFFVMxo","IKxdLbgJAz","lXFOBrhl0J","i7WMQjzUqR","MK07YGSQwj",
+"5Nammsx5Gl","7lUXZThjNn","HfyNQFGzgp","mz8gxKr8ys","BpYhVjzUqR","tl72WMezSW","GWqqXzz4ZU","YjB9tpFrrl","dQ586MmsIo","aFFssfmIK1",
+"zmLYD7X3uy","D6rByD6rBy","6AFT0hi5X7","Q6hMCU3yw5","uZPqg5Drn0","cQOnvMaJQs","uN6r3IjTwP","POUYSAgJHQ","dhSuHpWiOs","MezSW24ARF",
+"PYBf4VjCZq","RxrsmPYBf4","8U2nUFnPFB","4dEz6OxWIH","uZPqgQChxs","0PktICqqaD","3otm614FLR","gjUTuvkCHH","uLtKs4QMc9","cL0aEjtn0X",
+"8FmFHs93Ml","S2DfuSs0Zu","bZLvS8TxD7","iB08l29QAz","jiVBPAXpwE","ydG8U9GXkX","e6e4zblLA9","NhXduh1zcH","G1RhS6AFT0","yvOMIpT8wu",
+"5nmWv1j5L8","Ta8f6lkMUA","taOXKKsjRK","atef2uQIcz","VBjhzd85a9","n8pJ9FNYIM","VBjhzNo0Qb","MojnPtlILt","RmDcrRBhp0","xXTI4e6e4z",
+"GSQwjVLTy6","ReKEWxXTI4","zbIYYSs0Zu","Gv3FqFNYIM","oGu6xK4GS8","cShY2JIqXi","mz8gxhE1Ql","aDGtSSjskQ","POUYS7fsYM","CK5W7S77LH",
+"dQ586NhXdu","oGu6xB3qem","D6rByVprf2","Vprf2nFqik","gf8rIdQ586","uvf7A580YD","taOXKOHaBz","bgJAzMm8si","CNHmvtlILt","8U2nU0YAGH",
+"djsrvOHaBz","Zv7z0Waim6","0PktItl72W","BFkb8bgJAz","OUYuFQ6hMC","gIYvEYh1hF","dQ586lViBv","7X3uy7Ow5C","t98iW5VZjS","azIWpgf8rI",
+"618DiBCxeC","iB08lY1mC0","QChxsMm8si","GWqqXnnP8o","uoStwOz8yZ","EdBKcVerEA","y94nwMezSW","mX2GEpWiOs","ReKEWRkQke","ix74rn1pmO",
+"MGlTFQ6hMC","CK5W7Yh1hF","euZA5s4786","K4GS8b29RJ","TCgPpYjB9t","bgJAzVLTy6","QClRL8cVD3","gdQsSsqVrf","dpe1vjSjS3","vOqCEL7cGc",
+"6AFT0i7WMQ","yluBxQ6hMC","StlDJuN6r3","6AFT08FmFH","24ARFuAWyp","HzZT8KASQ8","Ss0ZuFPfSE","9y4lw1j5L8","ksJbyYf2Ec","M6qcGTXQ0Z",
+"faHirKZamH","X6PinzqH0W","KsjRKQ6Lix","FGzgp7Ow5C","oGu6xkB5nP","0YAGHd85a9","VNCPdhE1Ql","b29RJOUqFM","okgRii7WMQ","ThjNnYjB9t",
+"lweGyBCxeC","o8Uyd07n1c","29QAzWreyP","Y1mC0VBjhz","RmDcrQWxoT","HfyNQksJby","QbxXcQworu","VNCPdO3iyQ","faHirJ2mQi","XyPZNuvf7A",
+"RpBQmFnPFB","Y1mC0v1Hln","AgJHQdpe1v","DcpWBQnJ1S","2NslmfcJOy","k85AehSSvQ","jiVBPFPfSE","yvOMIbZLvS","QYxC0Vprf2","d7vjM2Nslm",
+"14FLRh1zcH","No0QbzbIYY","SbRYyhYBCK","WMiS3RzaZA","PYBf40MR5X","BFkb8pT8wu","dhSuHyvOMI","jS1ajJRJQB","8hJdtOUqFM","MmsIoiKqhr",
+"jzUqRPYBf4","VerEAfLNg8","EoToPYjB9t","DcpWBEdBKc","zHF1qjzUqR","cQOnvFFDui","Y1mC0tlILt","LewvMzQt6Q","8TxD70h1b1","4W0TlzY1GY",
+"d85a9pT8wu","XyPZNHzZT8","ThjNnJXljW","FxX9qsx5Gl","guMb8KZamH","uupzkPOUYS","0KyfsZ4I1v","nFqiktuDyS","AOgEe1v5hH","ydG8U8FmFH",
+"ZuDtDJ2mQi","HzZT89iGoT","ZzJHWVIlwP","piJSkUl4a1","CqqaDGWqqX","ulk41qUJMd","tuDySAmdQd","AmdQdksJby","JkzUnWmadA","guMb8CdyBV",
+"e6e4z2TRI7","dmoS7Ul4a1","14FLRQClRL","RxrsmZ4I1v","CxVEfS77LH","VerEA7X3uy","mz8gxPYBf4","ulk41Ta8f6","8hJdtdQ586","KsjRKFjHXR",
+"lsQGoUl4a1","2Yz7EDQimp","DLhzMblLA9","NOHszOxWIH","h1zcHprNT6","fLNg8cShY2","hUTw75nmWv","VerEAuTacx","VLTy6IjTwP","pFrrluLtKs",
+"5nmWvUl4a1","MGlTFhE1Ql","Zv7z0pvgjS","xciqpzFgtB","he9IAQWxoT","W3VFHoVQp6","uJScXReKEW","Oz8yZ2DREs","Q6LixCdyBV","8hJdtZv7z0",
+"Zv7z0OHaBz","NAFuwMmKGJ","pvgjSAXpwE","faHirAgJHQ","Waim6iKqhr","jS1ajnnP8o","0MR5Xatef2","dpe1vnFqik","MmsIoFNYIM","NhXduNAFuw",
+"qUJMdRxrsm","v2eC32hEEU","taOXKbZLvS","vLsmSMaJQs","Uvlv4WreyP","XyPZNjSjS3","JRJQBW3VFH","x3LDeaL6AJ","yvOMIksJby","2DREsReKEW",
+"B3qemrhl0J","KZamH0ao3l","1v5hHYOfrY","piJSkzz4ZU","0h1b1P6bcg","Pb1paPOUYS","FjHXRNxx9V","oVQp6BFkb8","jfREu580YD","StlDJOHaBz",
+"3otm6FFDui","IjTwPi7WMQ","d85a9JJs5m","8RCUAlj07Q","VBjhzFFDui","0PktI8cVD3","o8UydnnP8o","SjskQtuDyS","zz4ZURkQke","K4GS8MK07Y",
+"G1RhSlH1kt","O3iyQtAOsr","16lHcS77LH","BFkb80BmCy","tvdkDhYBCK","CdyBVMmKGJ","ru4UG7lUXZ","wDajXCqqaD","tlILtiwzGk","lH1ktoQ87r",
+"IjTwPbgJAz","2TRI7XflUq","Waim6lH1kt","RACuj9GXkX","jiVBPHP433","suY4xm4bxU","24ARF0Kyfs","Pb1palXFOB","5nmWvJkzUn","rKDLJpv0i7",
+"2NslmSmGzv","B3qempAhR1","mX2GEsuY4x","Z4I1vwDajX","v1Hln1v5hH","mz8gxUlU3M","zqH0Wuupzk","RzaZARzaZA","Dz1R3rz7Ut","JXljWuoStw",
+"qUJMdDz1R3","HfyNQVLTy6","Zv7z0RBhp0","B3qem24ARF","DLhzM1j5L8","QClRLU3yw5","Ul4a1jiVBP","tjQxsHlUbF","FhtglOxWIH","Mm8si7X3uy",
+"IKxdLB3qem","StlDJpFrrl","jeskSWMiS3","JKWYRGSQwj","RpBQm5Drn0","gIYvE9iGoT","n1pmOGrDg7","P6bcg580YD","VjCZqVNCPd","IjTwPUl4a1",
+"jS1ajFGzgp","uN6r3KASQ8","CK5W7uvf7A","FjHXRMm8si","1j5L82DREs","cmXIXKASQ8","6AFT0xReec","NOHsziKqhr","bgJAzMkgy8","CdyBVRACuj",
+"Nxx9VlH1kt","qaofNJKWYR","CdyBV2ZHdk","NcICAKsjRK","QnJ1S7X3uy","Ss0ZuuQIcz","14FLRgIYvE","uQIczNOHsz","Ta8f6v2eC3","8hJdtlm0pD",
+"3otm6ydG8U","euZA5ZJTXH","24ARFuvf7A","oVQp6Y1mC0","Gv3FqRACuj","Yf2EcpmeCd","P6bcgiqv4k","M3zXLJKWYR","NcICAMK07Y","B3qemWaWsv",
+"Kr8ysOHaBz","24ARFNOHsz","GWqqXbgJAz","JIqXiGXdoH","e6e4zK4GS8","1j5L88hJdt","VjCZqn8pJ9","k85AeeuZA5","5nmWvcL0aE","JkzUnaDGtS",
+"JRJQBtjQxs","4dEz6OUYuF","yvOMIVjCZq","0PktIK20wK","kB5nPfLNg8","s93Ml4dEz6","J2mQiydG8U","fcJOynFqik","4dEz6RmDcr","e6e4zCxVEf",
+"EOE1oUlU3M","y94nwi3pyd","5IhmGEoToP","Dz1R37lUXZ","7X3uykB5nP","OxWIHIKxdL","suY4xDQimp","K4GS8hSSvQ","8cVD3lXFOB","zmLYDB3qem",
+"yluBxGSQwj","jtn0XI7p2a","yluBxsx5Gl","K20wKnnP8o","xXTI4oQ87r","RzaZAVprf2","QWxoTlCMxy","YOfrYBpYhV","5IhmGoQ87r","pmeCdO3iyQ",
+"VNCPdZzJHW","n1pmOtlILt","Qworu9eoRc","faHirIKxdL","FVMxoHP433","16lHcFLsph","d85a9cQOnv","zmLYDhSSvQ","jfREuK4GS8","gIYvE45cIH",
+"POUYShe9IA","s7MxklXFOB","Cfgr3zQt6Q","QbxXcrKDLJ","Waim6XyPZN","7fsYM2hEEU","Vprf29eoRc","7lUXZJJs5m","fqypylH1kt","QbxXcn8pJ9",
+"5Drn0K20wK","sqVrfv2eC3","atef2cShY2","AIYUuAgJHQ","48cHL2TRI7","jzUqRzmLYD","QssNCzqH0W","Cfgr3RkQke","MaJQsRsQUq","K4GS8vLsmS",
+"cShY2618Di","FhtglThjNn","I7p2ayToGW","RzaZASs0Zu","CxVEf0h1b1","HfyNQC2Irc","uLtKsyluBx","iwzGkNOHsz","rz7UtxXTI4","4dEz6Ta8f6",
+"NcICAUl4a1","lXFOB7Ow5C","euZA5jiVBP","kZANmwDajX","ZhwG1vkCHH","GrDg7DcpWB","45cIHHlUbF","NAFuw9eoRc","VjCZqx3LDe","dhSuHFGzgp",
+"1LB1LwDajX","PYBf4MK07Y","Yh1hFK20wK","ZzJHWs93Ml","KZamH3otm6","cmXIX0MR5X","S2DfuS77LH","jtn0XgdQsS","atef2K4GS8","HRxd8i3pyd",
+"4dEz6ZzJHW","RzaZApT8wu","9XyT95iGN5","8TxD7zQt6Q","2hEEUEOE1o","9XyT9jeskS","zFgtB618Di","GWqqX9rlg9","ZzJHWlpF6W","Zv7z0SmGzv",
+"MmKGJCfgr3","MmsIoStlDJ","QChxsuupzk","fcJOydpe1v","guMb8Zv7z0","hi5X7lkMUA","0h1b1dmoS7","dpe1vi7WMQ","oQ87rDz1R3","ogLgcFjHXR",
+"0BmCyNo0Qb","yluBxGv3Fq","cmXIXYh1hF","CdyBVWDVWJ","AIYUuk85Ae","VjCZqM6qcG","uAWyp07n1c","XyPZNyToGW","In3NSJIqXi","yvOMInnP8o",
+"ZuDtDlH1kt","OxWIHUmaEv","5IhmG2hEEU","WaWsv5drc6","uTacxIjTwP","YOfrYQworu","prNT66q6L9","FcWrWnnP8o","G1RhSZuDtD","t59lRn1pmO",
+"v8yFNDQimp","Fhtglsoy9t","DG4sTyvOMI","6AFT0UlU3M","48cHLThjNn","J2mQiOz8yZ","QClRL7hyVv","8TxD7ThjNn","VjCZq64s8N","vLsmS29QAz",
+"tlILtWaWsv","580YDAXpwE","hUTw7PYBf4","K4GS8VBjhz","jzUqRfFDrJ","mz8gxulk41","4dEz65Namm","lsQGon1pmO","yluBx2Yz7E","GXdoHv8yFN",
+"he9IA7lUXZ","lj07Q2TRI7","gIYvEcL0aE","Z4I1vKr8ys","fFDrJk85Ae","MGlTFGWqqX","LDk6fTXQ0Z","9rlg93otm6","qQxHPgtCA5","B3qemtlILt",
+"NcICAVprf2","vkCHHC2Irc","yofH3he9IA","FxX9qxXTI4","8U2nUhUTw7","9rlg9RkQke","soy9th1zcH","FxX9qYw2oU","FNYIM5iGN5","QbxXckB5nP",
+"CdyBVnlaBy","IBe8kAmdQd","brhlQ1j5L8","prNT6NAFuw","8RCUAwiHrZ","aez9yYh1hF","8TxD7xXTI4","X6PinFNYIM","iwzGkfcwDa","C2IrcXflUq",
+"uTacxzz4ZU","FjHXRCdyBV","BbwgAs93Ml","9y4lwuN6r3","9y4lwzz4ZU","CIShG1LB1L","AkKTkFGzgp","Yw2oU7fKYU","kZANmQ6Lix","v8yFN8FmFH",
+"MmsIoUl4a1","uQIczReKEW","4QMc9kB5nP","JIqXiX6Pin","ni2v1fcJOy","yvOMIGrDg7","EdBKcNxx9V","lj07QjiVBP","HzZT8qaofN","FcWrWI7p2a",
+"K20wKprNT6","lj07Q2hEEU","dpe1vYw2oU","ZzJHWSs0Zu","UlU3MLewvM","AOgEeprNT6","MmsIoTXQ0Z","v2eC3he9IA","s47862hEEU","fmIK1MmsIo",
+"JIqXiydG8U","e6e4zVprf2","5Mg9rzbIYY","618DiUmaEv","gdQsSzHF1q","9iGoTzbIYY","atef2yToGW","ydG8U8xEKz","KASQ8FnPFB","618DiYf2Ec",
+"djsrvDz1R3","yluBxpFrrl","mz8gx5iGN5","NhXdun8pJ9","uZPqg9GXkX","AOgEeIKxdL","Nxx9VhE1Ql","0BmCyrKDLJ","Waim6Nxx9V","VNCPdQbxXc",
+"tuDySTCgPp","5ZaEzKASQ8","n1pmOFVMxo","TCgPpNcICA","24ARFJJs5m","tAOsrFNYIM","uLtKsRkQke","Ss0ZufcJOy","QWxoThE1Ql","gf8rIKr8ys",
+"cShY2iB08l","Yh1hFt98iW","v2eC3W3VFH","Yf2EcBGaQY","MK07YHzZT8","Waim6fcJOy","uJScXWPmlx","iqv4kzbIYY","uPX7Gn1pmO","Chuy3Zv7z0",
+"jfREuKZamH","m4bxUTCgPp","lj07QQssNC","gdQsSQ6hMC","7Ow5CvOqCE","RxrsmFGzgp","SbRYyjfREu","vkCHHQworu","jSjS3IKxdL","FjHXR0MR5X",
+"AXpwEeuZA5","atef2zqH0W","RpBQm8TxD7","BCxeCnFqik","oVQp6cmXIX","KASQ8lkMUA","UlU3MlsQGo","2Yz7ExReec","jeskSiKqhr","FjHXRtl72W",
+"Vprf2vLsmS","vOqCExReec","UmaEvHlUbF","618DiMGlTF","v8yFNsoy9t","bZLvSgdQsS","Ss0ZuIjTwP","FjHXRqaofN","Mm8sini2v1","uLtKs7fsYM",
+"29QAzWmadA","RACujd85a9","WaWsv4dEz6","uPX7GUmaEv","OHaBztAOsr","FcWrWjeskS","lViBvRACuj","WreyPZUnqt","Twanoulk41","tuDyShe9IA",
+"5iGN5M6qcG","3weIFvOqCE","t59lRY1mC0","v1Hlnt59lR","618Did7vjM","lm0pDBFkb8","s47860Wr5y","s93MlMojnP","9iGoTDcpWB","zHF1qDLhzM",
+"No0Qbdpe1v","8FmFHOUYuF","J2mQidQ586","ix74r7Ow5C","prNT6rKDLJ","jSjS3uLtKs","s4786GWqqX","aFFsspWiOs","GWqqXNxx9V","D6rByFVMxo",
+"Ss0ZuoGu6x","uPX7Gtl72W","HlUbFyofH3","y94nwuPX7G","ksJby1j5L8","HP433UlU3M","t59lRrhl0J","580YDqaofN","ogLgcnlaBy","CdyBV2TRI7",
+"ydG8Ulj07Q","ZJTXHAIYUu","v1HlnKASQ8","SbRYypFrrl","OHaBzNo0Qb","djsrvlpF6W","lm0pDogLgc","lsQGoCxVEf","he9IAlH1kt","RxrsmMm8si",
+"TCgPpMm8si","AOgEedpe1v","i3pyd8xEKz","TXQ0Zv2eC3","MmsIodmoS7","wDajXuJScX","Zv7z0No0Qb","NOHsz9XyT9","AkKTklpF6W","iB08lhYBCK",
+"7hyVvlj07Q","gIYvEhE1Ql","K4GS8pFrrl","zQt6QQWxoT","soy9tgdQsS","CqqaDmX2GE","0Wr5ypFrrl","zmLYD07n1c","s4786ydG8U","jSjS3jSjS3",
+"Z4I1vLewvM","8TxD7TXQ0Z","0ao3lFGzgp","AXpwEdjsrv","WMiS3O3iyQ","B3qemh1zcH","tvdkDsuY4x","qUJMdTa8f6","1j5L8QWxoT","taOXKv1Hln",
+"uupzk6q6L9","0BmCyuQIcz","ksJby5IhmG","gtCA5GSQwj","8cVD3oQ87r","a00b5Oz8yZ","9XyT9FwEJz","DG4sT618Di","hE1Qlxciqp","m4bxUJKWYR",
+"LbRTHlXFOB","K4GS8HRxd8","azIWpJRJQB","fmIK1djsrv","brhlQgtCA5","Z4I1vDz1R3","OxWIHAkKTk","0h1b1B3qem","KZamHJRJQB","FcWrWjtn0X",
+"Ss0ZuzmLYD","jS1ajO3iyQ","jfREuaL6AJ","Zv7z0pv0i7","9XyT9K20wK","YOfrYksJby","zz4ZUuLtKs","M3zXL48cHL","k85AeLDk6f","C2IrcWaim6",
+"WDVWJHfyNQ","ECMvUuLtKs","x3LDeyEfy9","Q6hMCKsjRK","zFgtBK4GS8","Vprf2uJScX","2ZHdkGSQwj","OUqFMgf8rI","Oz8yZdpe1v","WmadA5Mg9r",
+"yEfy9oGu6x","FwEJzBbwgA","s4786pT8wu","e6e4zMkgy8","s7MxkJJs5m","OUYuF5IhmG","SjskQlj07Q","In3NSx3LDe","ciuWzWaWsv","tjQxsMaJQs",
+"XflUqxReec","ThjNn2Nslm","guMb845cIH","ZUnqtMK07Y","UmaEvnnP8o","hSSvQciuWz","LbRTHfcwDa","hUTw7hE1Ql","9eoRcQClRL","7lUXZ7X3uy",
+"t59lRGv3Fq","5NammjzUqR","qQxHP0BmCy","pAhR1oVQp6","JXljWh1zcH","DcpWBbgJAz","Q6hMCpmeCd","16lHc8U2nU","8FmFH5ZaEz","CK5W7aL6AJ",
+"0ao3lSjskQ","Cp3mZBGaQY","0MR5X4W0Tl","M3zXLQ6hMC","atef2gdQsS","fFDrJdpe1v","jfREugIYvE","n8pJ9pT8wu","4W0TlogLgc","0MR5XuAWyp",
+"fcJOypmeCd","ix74rzY1GY","tuDySJkzUn","Chuy3gf8rI","lm0pDJJs5m","pmeCdIn3NS","5iGN5kZANm","e6e4zgIYvE","VIlwP55rfB","EoToPatef2",
+"qUJMd3otm6","aez9yt59lR","9XyT9GXdoH","iwzGkNAFuw","d7vjMWaim6","e6e4z8FmFH","ru4UG48cHL","ReKEW5VZjS","I7p2auvf7A","FjHXRVLTy6",
+"uAWyp0Wr5y","mz8gxDG4sT","AOgEetAOsr","KsjRKgIYvE","PYBf4LDk6f","o8UydRpBQm","pmeCdDcpWB","2Yz7E7Ow5C","zY1GYTCgPp","RkQke7ku1p",
+"zY1GYkB5nP","iKqhrUvlv4","RmDcr29QAz","BGaQYRzaZA","64s8NlkMUA","QnJ1ScQOnv","zqH0W8cVD3","9y4lwm4bxU","pFrrlQClRL","xciqpdmoS7",
+"W7cTsSjskQ","5IhmG0YAGH","0h1b1jSjS3","JXljWHzZT8","nlaByn8pJ9","ru4UG4W0Tl","L7cGcpFrrl","K4GS80BmCy","jS1ajBbwgA","QssNC7lUXZ",
+"ksJbyjeskS","qaofNVBjhz","XflUqFLsph","Gv3FqoVQp6","NAFuwpWiOs","UmaEvQworu","lpF6WpmeCd","AIYUuDQimp","C2Ircni2v1","CIShGF6PT2",
+"RBhp0Gv3Fq","RBhp0QnJ1S","5ZaEz5iGN5","QChxsoVQp6","x3LDeNo0Qb","ru4UGblLA9","D6rByHP433","FPfSEk85Ae","dhSuHKASQ8","n1pmO2Nslm",
+"4QMc9Cp3mZ","kZANmi7WMQ","e6e4zKr8ys","i3pyduupzk","FLsphmX2GE","CK5W7WreyP","FLsphy94nw","5iGN5dmoS7","Yf2EcuJScX","IRh48gIYvE",
+"ZuDtD0ao3l","Oz8yZFhtgl","FGzgplkMUA","0Wr5yhi5X7","7ku1p618Di","rz7Utsx5Gl","lCMxy7lUXZ","MmKGJFLsph","UmaEvnFqik","RxrsmJkzUn",
+"rz7UtQChxs","ulk41M3zXL","tlILtpv0i7","tvdkDv1Hln","3weIFciuWz","ix74rlCMxy","uoStwhYBCK","RkQke7Ow5C","4QMc9GrDg7","WreyP5Drn0",
+"P6bcggdQsS","EdBKcUvlv4","Q6hMC5drc6","1j5L8WaWsv","iKqhruPX7G","Zv7z0lCMxy","rKDLJM6qcG","ZUnqtuQIcz","iB08llCMxy","U3yw58RCUA",
+"JJs5mlsQGo","iKqhrMm8si","jS1ajMaJQs","x3LDeyvOMI","5Namm618Di","5VZjS4QMc9","XyPZNU3yw5","uN6r3y94nw","ZhwG1MaJQs","NAFuwZv7z0",
+"BpYhVcmXIX","ogLgcOxWIH","RxrsmyEfy9","IjTwPFxX9q","qQxHPCqqaD","vLsmSFjHXR","CNHmvrhl0J","7fsYMS77LH","h1zcHv1Hln","iwzGkFFDui",
+"Nxx9V9eoRc","yEfy9jSjS3","dQ586Q6Lix","yEfy98xEKz","Waim6kB5nP","Kr8yszmLYD","hE1QlThjNn","9iGoTDQimp","5Drn0iB08l","Ul4a1yToGW",
+"UmaEvNOHsz","fmIK1cShY2","Cfgr3fFDrJ","cmXIXyvOMI","U3yw5lH1kt","Mm8siWaim6","48cHLcmXIX","QssNCCfgr3","jS1ajyvOMI","qQxHPDG4sT",
+"azIWp9eoRc","ni2v1lCMxy","CNHmv2TRI7","x3LDe7lUXZ","0h1b1KsjRK","4W0TlWaWsv","StlDJ2ZHdk","prNT6BGaQY","dpe1vzz4ZU","U3yw5ulk41",
+"ECMvU8hJdt","8hJdt0PktI","KsjRK2DREs","aDGtSzmLYD","SjskQ4W0Tl","VjCZqRsQUq","4dEz6lViBv","Qworu14FLR","618DigdQsS","RBhp0M6qcG",
+"cL0aECp3mZ","Yf2EcgIYvE","pT8wuPb1pa","Z4I1vC2Irc","U3yw5fcJOy","blLA9tvdkD","oVQp6MK07Y","dQ586d85a9","yEfy90MR5X","BGaQYpv0i7",
+"aFFssVerEA","YjB9ttjQxs","7lUXZgf8rI","fLNg8SbRYy","tlILtvkCHH","nFqikFFDui","JXljWTwano","9XyT9v8yFN","QClRLuN6r3","MK07YBGaQY",
+"RxrsmpAhR1","QWxoTzY1GY","pFrrlxReec","NhXdu1LB1L","9rlg9CIShG","2ZHdkVNCPd","Uvlv4IKxdL","v2eC3Gv3Fq","v8yFNfcwDa","jfREu48cHL",
+"pvgjSjSjS3","pWiOslsQGo","i7WMQkB5nP","uupzkYOfrY","fcJOydjsrv","Cp3mZ4dEz6","U3yw55IhmG","FnPFBLewvM","5nmWvhe9IA","yluBxlsQGo",
+"h1zcH8FmFH","RmDcrtl72W","kB5nPlkMUA","RkQked85a9","RkQkeZhwG1","MGlTF29QAz","uAWypTa8f6","XyPZN8cVD3","XyPZNRACuj","FFDuiDQimp",
+"DG4sTVerEA","QworuYf2Ec","HzZT8kZANm","9GXkXuTacx","xXTI4J2mQi","DG4sTtaOXK","gIYvES77LH","lH1ktKr8ys","SjskQ2hEEU","16lHc5IhmG",
+"Gv3FqEoToP","oVQp65Mg9r","5VZjSjfREu","9XyT9QChxs","XyPZNkZANm","aFFsssqVrf","618DirKDLJ","hUTw7WmadA","ThjNnO3iyQ","wDajX0MR5X",
+"MmsIoJKWYR","ECMvUaL6AJ","SjskQ9y4lw","3otm6t59lR","VNCPdUmaEv","SjskQM6qcG","DQimpD6rBy","vLsmSEdBKc","5VZjSd85a9","lkMUA9XyT9",
+"yEfy9LewvM","9rlg97fKYU","Vprf2brhlQ","n1pmOWPmlx","Yw2oUMmKGJ","2hEEURmDcr","AkKTkW7cTs","hE1QlNOHsz","0h1b1fcJOy","aL6AJDG4sT",
+"nFqiktaOXK","WDVWJlweGy","FFDuiRBhp0","iB08lQYxC0","v8yFN7fKYU","x3LDeOUqFM","l83UdDG4sT","DcpWBb29RJ","2Yz7EgtCA5","suY4xdQ586",
+"7hyVvFFDui","iKqhrksJby","Waim6ZJTXH","5ZaEz1LB1L","Zv7z0fLNg8","D6rByhUTw7","FLsph5drc6","GrDg7S77LH","8hJdtv8yFN","M3zXLNo0Qb",
+"dQ586StlDJ","pmeCdNo0Qb","0h1b1ru4UG","k85AelweGy","zqH0WQClRL","zqH0WRkQke","K20wKFVMxo","uvf7AlweGy","oGu6xUvlv4","6AFT0lpF6W",
+"aL6AJ0BmCy","uJScXlpF6W","0Wr5ylkMUA","uJScXtAOsr","WMiS3Rxrsm","Mm8siCxVEf","M6qcGzFgtB","s93MlFnPFB","nnP8oRBhp0","ZhwG1J2mQi",
+"fmIK1AkKTk","0h1b1VBjhz","fqypy2Nslm","24ARFdQ586","RpBQmMmsIo","lsQGovkCHH","OUYuFJKWYR","uAWypUl4a1","9XyT9I7p2a","xReec8RCUA",
+"1LB1LUvlv4","e6e4zMmsIo","kB5nP2hEEU","fcwDaVjCZq","VerEAHfyNQ","piJSkbrhlQ","VNCPdY1mC0","sqVrfKr8ys","cQOnv5Namm","CdyBVWaWsv",
+"W7cTsxciqp","2ZHdkGWqqX","VerEAGrDg7","oGu6xW7cTs","64s8NuJScX","iwzGkYw2oU","O3iyQaL6AJ","1LB1LBpYhV","4dEz6UmaEv","Q6LixO3iyQ",
+"SWfoumz8gx","piJSkru4UG","StlDJbrhlQ","pv0i7zQt6Q","GXdoHtvdkD","M3zXLbZLvS","djsrvQChxs","GWqqXpiJSk","RxrsmHP433","TXQ0ZJ2mQi",
+"Ss0ZuSWfou","9iGoT9eoRc","POUYSAXpwE","618DiZUnqt","xReec0Wr5y","yEfy92ZHdk","suY4xQnJ1S","xReecUmaEv","tl72Wdpe1v","LbRTH0ao3l",
+"SWfoufcJOy","Y1mC05drc6","ciuWzqQxHP","1j5L8gIYvE","IBe8kPYBf4","VjCZqQbxXc","FjHXR64s8N","IRh48mz8gx","vkCHHaDGtS","n1pmOFxX9q",
+"uN6r3hi5X7","jS1aj580YD","oGu6xm4bxU","jeskSX6Pin","kZANmhUTw7","gf8rIfqypy","mX2GEJXljW","29QAzTwano","djsrvLDk6f","jSjS3IBe8k",
+"uQIczSs0Zu","lCMxy9eoRc","8xEKzd7vjM","djsrvSbRYy","tjQxsI7p2a","gdQsS0YAGH","uoStwEdBKc","BGaQY0PktI","Z4I1vlkMUA","MojnPNAFuw",
+"5iGN59iGoT","fFDrJtlILt","0h1b1lViBv","IKxdLVBjhz","yofH3SbRYy","TXQ0ZECMvU","Ss0Zua00b5","lm0pDguMb8","Y1mC0lj07Q","Uvlv4azIWp",
+"NOHsz9eoRc","gdQsS2Yz7E","zY1GY64s8N","uvf7AyToGW","M3zXLuTacx","ni2v17ku1p","kB5nPcL0aE","Nxx9VuN6r3","zY1GYjtn0X","vkCHHsqVrf",
+"ulk41RzaZA","Ta8f65Namm","Yf2Ecni2v1","8TxD7iqv4k","0YAGH2DREs","n1pmOStlDJ","nnP8oprNT6","v2eC3Zv7z0","gf8rIokgRi","8U2nUOUqFM",
+"FVMxo8cVD3","ulk41tjQxs","lH1kt7lUXZ","D6rByC2Irc","CdyBVHlUbF","tuDySpmeCd","O3iyQcShY2","KASQ8Yw2oU","k85Ae5Namm","sqVrfGrDg7",
+"F6PT2jiVBP","wDajXo8Uyd","4QMc9ix74r","8hJdtSjskQ","OxWIHpWiOs","9eoRcCdyBV","v8yFNhUTw7","SWfouRACuj","tlILtFNYIM","OxWIH2Yz7E",
+"7ku1plweGy","0PktIoGu6x","LDk6fFFDui","xXTI4n1pmO","b29RJ4dEz6","d85a9QnJ1S","XflUqNo0Qb","0Wr5y5ZaEz","y94nwa00b5","9iGoT8U2nU",
+"16lHcHP433","5NammtaOXK","GSQwje6e4z","ZJTXHQ6Lix","t98iWprNT6","nFqikQssNC","7fKYUYw2oU","MezSWFFDui","KsjRKFNYIM","wiHrZoQ87r",
+"ogLgcLewvM","zHF1qni2v1","rz7Ut8FmFH","uPX7Gm4bxU","QWxoTQbxXc","BbwgApmeCd","QClRLVprf2","FwEJzMkgy8","Ss0ZugtCA5","LbRTH0Wr5y",
+"O3iyQEOE1o","Yf2EcSmGzv","4QMc9lH1kt","VjCZqk85Ae","1j5L8sqVrf","MK07YCNHmv","tuDySSs0Zu","iKqhrIjTwP","NcICAiwzGk","X6Pind85a9",
+"v8yFNpv0i7","QnJ1SSs0Zu","FjHXRuoStw","nlaByQ6Lix","uN6r3gdQsS","ksJbyyluBx","7ku1pFLsph","L7cGcoQ87r","fqypydQ586","Dz1R3EdBKc",
+"5ZaEz4W0Tl","lViBv0ao3l","ZhwG1ReKEW","lpF6WbgJAz","hi5X7dpe1v","lj07QnFqik","lj07Q9rlg9","uvf7AYw2oU","BCxeCv8yFN","xReecy94nw",
+"uLtKsdpe1v","WPmlxCqqaD","RzaZA4W0Tl","CxVEfdhSuH","48cHLKASQ8","KsjRK8FmFH","X6PinhUTw7","azIWpAIYUu","pFrrlXyPZN","e6e4z3otm6",
+"DG4sTa00b5","QssNCfLNg8","F6PT22TRI7","Oz8yZVIlwP","IBe8kHfyNQ","hE1QlFNYIM","MK07YMm8si","8TxD7Rxrsm","brhlQ7lUXZ","KsjRKQClRL",
+"tvdkDn1pmO","OUYuFuPX7G","9GXkXIjTwP","KsjRKiB08l","l83UdBpYhV","zHF1q0BmCy","FjHXRnlaBy","KZamHe6e4z","EdBKcMK07Y","MojnPFjHXR",
+"HP433RACuj","8FmFHgtCA5","lH1ktQ6Lix","DcpWBU3yw5","v1HlnzY1GY","M6qcGFVMxo","cmXIXprNT6","aez9yDLhzM","sqVrflweGy","29QAzJ2mQi",
+"nlaByAOgEe","taOXKWDVWJ","XflUqciuWz","TwanocQOnv","fcwDahi5X7","QClRLVerEA","CNHmv55rfB","XflUqogLgc","0Wr5y0Wr5y","uPX7GOz8yZ",
+"v2eC3RpBQm","CIShGb29RJ","jS1aj5Mg9r","hi5X70YAGH","tjQxsIRh48","uN6r3W3VFH","618DifmIK1","NcICAFFDui","4dEz6Yw2oU","FxX9q5VZjS",
+"fqypy8TxD7","48cHLCNHmv","POUYSogLgc","Yf2EczbIYY","hSSvQpv0i7","MojnPWMiS3","he9IARzaZA","LDk6fuoStw","uvf7AogLgc","qaofN580YD",
+"9GXkXnFqik","jtn0XfcwDa","m4bxUl83Ud","HfyNQW3VFH","okgRi0h1b1","AgJHQJ2mQi","jiVBPVNCPd","iwzGklH1kt","B3qemwiHrZ","QnJ1Sy94nw",
+"s4786Rxrsm","MojnPe6e4z","lsQGoDQimp","hi5X7Uvlv4","piJSkS77LH","8U2nUDG4sT","RACujSWfou","mz8gxYOfrY","wDajX2TRI7","5ZaEzatef2",
+"CxVEf8U2nU","pvgjSRsQUq","fcwDabgJAz","uPX7G8xEKz","DQimpRsQUq","JJs5mmz8gx","s93Mle6e4z","JJs5mo8Uyd","Oz8yZJXljW","M6qcGv8yFN",
+"RsQUquJScX","uTacxMm8si","SWfoulkMUA","FGzgp8xEKz","dpe1v24ARF","n1pmOW3VFH","dpe1vCfgr3","i3pyduPX7G","G1RhSDLhzM","DcpWBGrDg7",
+"oVQp616lHc","iKqhrd7vjM","SjskQWPmlx","7fsYMpAhR1","iKqhrtAOsr","uLtKsVprf2","h1zcHh1zcH","AkKTk8U2nU","lsQGoHlUbF","QbxXcuoStw",
+"AIYUu1v5hH","JRJQBGWqqX","CqqaDLbRTH","BCxeCd85a9","m4bxUrz7Ut","dQ586yToGW","3weIFhYBCK","xReeczHF1q","lXFOBWMiS3","zFgtBZzJHW",
+"dmoS7v1Hln","JkzUnguMb8","CdyBVZzJHW","FPfSEL7cGc","4QMc9ECMvU","Pb1pauJScX","L7cGclCMxy","okgRil83Ud","ksJbyC2Irc","a00b5rz7Ut",
+"kB5nPlCMxy","zQt6Q5Namm","SbRYyZUnqt","W3VFHK4GS8","AkKTkt98iW","iB08lmz8gx","ZuDtD8hJdt","9iGoTEOE1o","ogLgcRkQke","NhXduTCgPp",
+"vLsmSlViBv","VjCZqi3pyd","LDk6faFFss","ECMvUaFFss","580YDVIlwP","gjUTuDz1R3","OxWIHVprf2","cmXIXMezSW","5IhmGa00b5","0h1b1t98iW",
+"ECMvUoGu6x","QWxoTRACuj","FnPFBBpYhV","qUJMduLtKs","iwzGkprNT6","FPfSEThjNn","HRxd8pvgjS","lpF6W5iGN5","lm0pDHfyNQ","jzUqRSs0Zu",
+"qQxHPgIYvE","ZzJHWM6qcG","RzaZAYjB9t","I7p2aL7cGc","kZANmY1mC0","HfyNQMGlTF","LbRTHW3VFH","zbIYYQWxoT","Yw2oUb29RJ","CIShGLDk6f",
+"7Ow5CMK07Y","HzZT8rhl0J","OUqFM7ku1p","L7cGcfcJOy","jiVBP0Kyfs","7lUXZlj07Q","CqqaDsx5Gl","CK5W7Ta8f6","5Drn0AIYUu","618Di29QAz",
+"taOXKt59lR","AOgEe8xEKz","NhXduNhXdu","x3LDesoy9t","pv0i7jS1aj","XyPZNciuWz","blLA9SmGzv","W7cTsVNCPd","2TRI7hYBCK","5NammkZANm",
+"uvf7AB3qem","uN6r3K20wK","YOfrYU3yw5","faHirpiJSk","QnJ1SAXpwE","RxrsmQworu","Cfgr3IRh48","xXTI4NhXdu","0YAGHOHaBz","WMiS3brhlQ",
+"S2DfuP6bcg","8RCUAQChxs","gdQsSdmoS7","TwanoNcICA","FjHXRi3pyd","XyPZNGSQwj","8hJdtTCgPp","mX2GEUmaEv","Kr8yslweGy","I7p2alpF6W",
+"K20wKb29RJ","M6qcGiqv4k","14FLRBpYhV","yEfy9O3iyQ","IKxdLhE1Ql","Uvlv4FnPFB","fmIK1S2Dfu","16lHcHfyNQ","YOfrYWmadA","QWxoTuZPqg",
+"5Namm5ZaEz","CIShG7Ow5C","5Drn0zQt6Q","xXTI4aFFss","8xEKzn1pmO","hYBCKJKWYR","pT8wuni2v1","SbRYy5Mg9r","ogLgcZv7z0","jfREuVIlwP",
+"BGaQYd7vjM","S2DfuuTacx","iwzGkBGaQY","TXQ0ZhYBCK","7fsYMoQ87r","64s8Nv2eC3","Mkgy83weIF","rKDLJi7WMQ","dmoS7PYBf4","IBe8kOHaBz",
+"FPfSEMaJQs","qaofNkZANm","AgJHQzz4ZU","vOqCEd85a9","YOfrY8TxD7","WmadAksJby","8RCUAEOE1o","HP43314FLR","G1RhSblLA9","qaofN2hEEU",
+"5nmWvFGzgp","FNYIM8hJdt","9GXkXMm8si","s7MxkM6qcG","24ARFnlaBy","oVQp6taOXK","48cHL3weIF","W3VFHBpYhV","uupzkW7cTs","Pb1palH1kt",
+"okgRiQClRL","nFqikdpe1v","vOqCE8RCUA","0YAGHThjNn","fcwDa0ao3l","LbRTHi3pyd","jiVBPFFDui","lsQGoh1zcH","ThjNnQworu","QbxXcpAhR1",
+"zFgtBO3iyQ","BbwgAAmdQd","azIWpZUnqt","0h1b1dQ586","Chuy37hyVv","FwEJzix74r","P6bcg7ku1p","WMiS30ao3l","LDk6fMK07Y","CK5W7M6qcG",
+"Pb1pab29RJ","0PktI8U2nU","NOHszQssNC","nnP8oBCxeC","jzUqRIjTwP","POUYSDcpWB","J2mQiuN6r3","JJs5mtAOsr","BGaQY9eoRc","AOgEehUTw7",
+"tlILt6AFT0","Cfgr3Nxx9V","tvdkDU3yw5","EdBKcBFkb8","M6qcGLbRTH","l83UdVBjhz","v1HlnU3yw5","QChxszbIYY","S2DfufLNg8","8U2nUiKqhr",
+"F6PT2BCxeC","3weIFVBjhz","GSQwjksJby","6q6L9FGzgp","fcwDakZANm","GrDg7YOfrY","lsQGoguMb8","55rfBsuY4x","FcWrWLewvM","ulk41VLTy6",
+"VNCPdOHaBz","aDGtSatef2","5IhmGWPmlx","MGlTFAXpwE","S77LHCxVEf","pv0i7KZamH","o8Uyds7Mxk","aFFssNOHsz","7lUXZ24ARF","taOXK2DREs",
+"X6PinFxX9q","GrDg7tjQxs","NOHszpT8wu","v1HlnOz8yZ","ciuWzqaofN","UlU3M8U2nU","SjskQaL6AJ","KZamHdpe1v","HRxd8WreyP","4W0TlyofH3",
+"2Yz7EgIYvE","FjHXR14FLR","9iGoTCIShG","S77LH5nmWv","uTacxtjQxs","48cHL1LB1L","lViBvqUJMd","fqypylsQGo","tjQxsVBjhz","Waim6ciuWz",
+"xReecn1pmO","v8yFNYf2Ec","07n1ccShY2","dhSuHguMb8","AXpwEzFgtB","lj07Q1j5L8","Ta8f6aFFss","hYBCKl83Ud","6AFT0gIYvE","b29RJBpYhV",
+"VLTy6VIlwP","KsjRKd7vjM","dpe1vMm8si","h1zcHUlU3M","07n1cWPmlx","fqypyuN6r3","1LB1Lni2v1","xXTI4v2eC3","64s8N618Di","iqv4kgIYvE",
+"VNCPdwDajX","uZPqglViBv","NhXduZUnqt","No0Qb1j5L8","Z4I1vaDGtS","24ARFqaofN","7ku1pcL0aE","yvOMIAIYUu","7ku1pCK5W7","WaWsvQ6hMC",
+"RACujpv0i7","Yw2oUAIYUu","0Wr5yYOfrY","F6PT2HzZT8","G1RhS8hJdt","9GXkXCIShG","M3zXLpAhR1","XyPZNKsjRK","9eoRcFNYIM","o8Uydd85a9",
+"CK5W7K4GS8","yEfy95drc6","bgJAzOHaBz","4dEz6Fhtgl","CxVEfKr8ys","Fhtgl4QMc9","QWxoTIRh48","yToGW24ARF","uN6r3d7vjM","o8Uyd5iGN5",
+"lweGyIRh48","M6qcG14FLR","rhl0JlH1kt","oQ87rRsQUq","VLTy6jiVBP","JRJQBcL0aE","618DiO3iyQ","Pb1paIn3NS","55rfBVjCZq","blLA9guMb8",
+"1LB1LlH1kt","BpYhVQYxC0","U3yw5FxX9q","aFFssBFkb8","fmIK1IjTwP","2DREsCIShG","pAhR1Q6hMC","VNCPdIjTwP","nlaByW7cTs","1j5L85Mg9r",
+"0MR5Xtl72W","VNCPdZhwG1","KZamHazIWp","DcpWBZv7z0","pmeCduupzk","MezSWXflUq","brhlQNhXdu","h1zcH5nmWv","BFkb814FLR","b29RJXflUq",
+"8U2nUxReec","4W0Tl0Wr5y","5drc6t59lR","m4bxUv2eC3","CK5W7jtn0X","zqH0WFnPFB","Yw2oUDLhzM","fqypyHzZT8","qUJMdFhtgl","lpF6WF6PT2",
+"BFkb8D6rBy","QChxs8RCUA","FLsph5nmWv","RpBQmydG8U","JIqXiJKWYR","lsQGojiVBP","8cVD3WDVWJ","ZJTXH9iGoT","5iGN5HzZT8","Zv7z0dpe1v",
+"iB08l5IhmG","29QAzfmIK1","5Drn0MojnP","AkKTk55rfB","d85a9oVQp6","BpYhV7ku1p","AIYUufcwDa","qaofNW3VFH","pmeCdZv7z0","zbIYYhYBCK",
+"XflUqdjsrv","5VZjS8FmFH","Yh1hFFhtgl","EoToPDz1R3","vLsmSKASQ8","Cp3mZ8FmFH","NAFuwatef2","yvOMIm4bxU","lm0pDZuDtD","YjB9tVjCZq",
+"FcWrWRBhp0","lm0pDMmKGJ","mX2GEFwEJz","uLtKszqH0W","Vprf2CNHmv","wiHrZY1mC0","Yf2EcqaofN","hE1QlaFFss","zHF1qt59lR","zFgtBEoToP",
+"lm0pDd7vjM","K4GS8JJs5m","JJs5mNAFuw","EoToPChuy3","580YDatef2","o8UydQssNC","JKWYRsuY4x","zFgtBLDk6f","CNHmvQ6Lix","m4bxU2hEEU",
+"rKDLJgtCA5","he9IAFcWrW","2hEEU2Nslm","Zv7z0t98iW","ksJbyWaim6","t98iWMaJQs","jiVBPlH1kt","2TRI7lm0pD","mX2GEyofH3","OUqFMRpBQm",
+"5VZjSI7p2a","uJScXIRh48","vLsmSfqypy","O3iyQqaofN","7X3uyhe9IA","FLsphUl4a1","SmGzvNo0Qb","lViBvh1zcH","iwzGkfmIK1","piJSkXflUq",
+"GrDg7lpF6W","FVMxo1v5hH","55rfB5ZaEz","RBhp0xciqp","NOHszt59lR","QssNCNAFuw","JIqXiAmdQd","8TxD7zz4ZU","GWqqXJJs5m","XyPZNzz4ZU",
+"24ARF7lUXZ","8U2nU6q6L9","FcWrWfcwDa","16lHchYBCK","FNYIMF6PT2","GrDg7RpBQm","fcwDaciuWz","8FmFHZ4I1v","MK07Y6AFT0","2TRI7tlILt",
+"7ku1puoStw","RzaZAWaim6","d85a9euZA5","CNHmv2Yz7E","14FLROUYuF","LewvMiqv4k","WPmlxFFDui","hSSvQVLTy6","tvdkD9y4lw","Dz1R3FGzgp",
+"YOfrY5drc6","tvdkDmz8gx","tlILtM6qcG","ogLgcDz1R3","4QMc9Uvlv4","Cfgr3O3iyQ","BFkb8VIlwP","ZhwG1IBe8k","M6qcGe6e4z","5Drn0WmadA",
+"IBe8k4QMc9","cL0aEHzZT8","t59lRIn3NS","k85AemX2GE","5nmWvDcpWB","lm0pDs4786","ogLgcguMb8","he9IA9y4lw","uPX7GlsQGo","sx5GlW7cTs",
+"8cVD3s7Mxk","guMb8K4GS8","64s8Nuupzk","W7cTszQt6Q","Chuy3hi5X7","580YD5VZjS","WmadACIShG","5drc6lsQGo","ogLgcyluBx","d7vjMtAOsr",
+"vkCHHfLNg8","DLhzMdhSuH","tjQxst98iW","wDajXfLNg8","uJScXWreyP","EOE1opAhR1","5Mg9r8FmFH","BCxeC2TRI7","uoStwGXdoH","x3LDeVNCPd",
+"YOfrY6q6L9","1j5L87X3uy","Uvlv4AOgEe","hE1QlTXQ0Z","O3iyQPYBf4","Zv7z0Vprf2","jSjS3xReec","yEfy97Ow5C","ydG8Umz8gx","QWxoTtaOXK",
+"faHirWaim6","VNCPdZuDtD","Ta8f6bgJAz","yEfy9tAOsr","lweGySmGzv","gjUTuMojnP","OxWIHRxrsm","C2IrcWaWsv","kZANmStlDJ","FwEJzpFrrl",
+"OxWIHyofH3","VBjhzgf8rI","Chuy3iwzGk","64s8NksJby","2ZHdkkB5nP","SWfou14FLR","EdBKcAXpwE","pT8wuuLtKs","07n1cFNYIM","yToGWxXTI4",
+"n8pJ9uJScX","aFFsszqH0W","oGu6xAXpwE","5IhmGuAWyp","BbwgAv2eC3","PYBf4fcwDa","WPmlxl83Ud","RpBQmHlUbF","9y4lwjzUqR","Cfgr3t59lR",
+"djsrvtAOsr","e6e4zulk41","uN6r3B3qem","GrDg7b29RJ","580YDM3zXL","n8pJ9xciqp","8RCUAfqypy","OUYuFCK5W7","x3LDeMm8si","8xEKzzbIYY",
+"e6e4zcShY2","lXFOB9GXkX","L7cGchYBCK","hUTw7QWxoT","RxrsmfFDrJ","9eoRcSjskQ","9eoRc2Nslm","CqqaDtjQxs","24ARFDQimp","zqH0WDG4sT",
+"O3iyQsx5Gl","kB5nPbgJAz","jzUqRrz7Ut","s7MxksuY4x","gdQsS24ARF","XyPZN4W0Tl","oQ87r2DREs","cQOnvtuDyS","guMb8lweGy","n1pmOHlUbF",
+"WaWsvd85a9","RkQkexXTI4","QworucShY2","KZamHRkQke","tl72WnlaBy","MaJQstvdkD","EOE1oGXdoH","bZLvSzFgtB","ix74r8hJdt","No0QbQ6hMC",
+"CK5W7YjB9t","YjB9tv1Hln","S77LHI7p2a","bgJAzAkKTk","QChxsZUnqt","CdyBVL7cGc","lXFOBuZPqg","oQ87ruLtKs","JXljW48cHL","fcJOyx3LDe",
+"8U2nUgjUTu","lViBvix74r","atef2MaJQs","FjHXR9y4lw","uQIczU3yw5","M3zXLSmGzv","uupzkuoStw","AXpwE29QAz","tuDySn1pmO","hYBCKwiHrZ",
+"8hJdtWaWsv","brhlQ3weIF","RsQUqiqv4k","uTacxuPX7G","aDGtS5ZaEz","piJSkFjHXR","CxVEfpFrrl","B3qem4QMc9","8hJdtCqqaD","GSQwjiqv4k",
+"lViBvUl4a1","hSSvQgtCA5","WPmlx29QAz","M3zXLt59lR","9rlg9t59lR","lCMxylpF6W","nFqik8hJdt","yToGWJRJQB","ZUnqttaOXK","lCMxy0MR5X",
+"F6PT2Mkgy8","nnP8oReKEW","BbwgA0MR5X","Ss0ZuQworu","5ZaEza00b5","U3yw56AFT0","gjUTu5iGN5","X6PinsqVrf","64s8NtaOXK","2Yz7EJKWYR",
+"ciuWzwiHrZ","cL0aEUlU3M","9y4lw8cVD3","VNCPdgf8rI","SjskQblLA9","okgRiuJScX","zY1GYMezSW","pvgjSix74r","BbwgAPYBf4","GSQwjIn3NS",
+"2hEEUzY1GY","4QMc9lXFOB","aL6AJoQ87r","VjCZq2TRI7","ZhwG1X6Pin","b29RJ2Nslm","pT8wuyvOMI","VIlwPlXFOB","fFDrJWPmlx","RkQkeiqv4k",
+"pT8wuFcWrW","nnP8oRzaZA","blLA9oQ87r","KsjRKRzaZA","8U2nUAgJHQ","ZzJHW24ARF","9iGoTRpBQm","NOHsztaOXK","KASQ8yEfy9","Vprf2AgJHQ",
+"wiHrZCdyBV","W7cTsuQIcz","BCxeCZhwG1","9rlg945cIH","ru4UGQ6Lix","9XyT9Z4I1v","JkzUnMkgy8","euZA59GXkX","NhXdumX2GE","jzUqRciuWz",
+"RzaZAY1mC0","pmeCdLewvM","qUJMdW3VFH","tAOsraL6AJ","0KyfspWiOs","FnPFBRBhp0","piJSkzFgtB","JIqXiDcpWB","P6bcgCK5W7","uLtKslsQGo",
+"tlILtMmKGJ","iwzGk2Nslm","Fhtgl0PktI","VNCPdMK07Y","uAWypciuWz","hYBCKFPfSE","FwEJzVBjhz","s4786okgRi","xXTI4i7WMQ","Oz8yZ7Ow5C",
+"4QMc9nnP8o","fLNg8QClRL","CIShGX6Pin","tvdkDAOgEe","UlU3MFGzgp","MmsIoG1RhS","YjB9tix74r","QnJ1S1v5hH","HP433rz7Ut","Y1mC0RACuj",
+"2ZHdklkMUA","jS1aj5ZaEz","ulk41YOfrY","7X3uyTwano","BpYhVZhwG1","d7vjMEoToP","oVQp6NhXdu","zY1GYoVQp6","QnJ1ShE1Ql","jzUqRZhwG1",
+"7ku1pGWqqX","suY4xBbwgA","StlDJReKEW","QYxC0Pb1pa","zz4ZUMkgy8","QbxXcMkgy8","TwanozQt6Q","hi5X7B3qem","xciqpIBe8k","9rlg9FwEJz",
+"oVQp6No0Qb","tvdkDuvf7A","pmeCdKASQ8","0h1b1dhSuH","atef2FwEJz","ni2v1piJSk","prNT6ogLgc","lweGyuZPqg","No0QbVIlwP","h1zcHcmXIX",
+"JIqXis4786","euZA5gf8rI","zQt6QFxX9q","Mkgy8SbRYy","5ZaEztlILt","SWfouMezSW","Cp3mZL7cGc","y94nwtl72W","mz8gxx3LDe","OUqFM5Namm",
+"LewvMDG4sT","pFrrlPb1pa","S2Dfus4786","vLsmSCK5W7","uZPqgDcpWB","zY1GYzz4ZU","s4786AOgEe","zqH0WMK07Y","IKxdLRzaZA","ZhwG1guMb8",
+"MojnPgf8rI","blLA94dEz6","Mkgy8OHaBz","J2mQi29QAz","uTacxVNCPd","iB08l07n1c","n1pmOyluBx","LbRTH48cHL","X6PinaFFss","OxWIHFLsph",
+"aez9yxXTI4","3weIFdjsrv","7X3uyOUYuF","EOE1oDcpWB","BCxeCMm8si","suY4xSjskQ","RsQUqgf8rI","2DREsSjskQ","CK5W7XyPZN","Q6hMCm4bxU",
+"uTacxzQt6Q","9eoRcokgRi","ciuWzhi5X7","piJSkFGzgp","okgRijtn0X","mX2GEOxWIH","suY4xHzZT8","Mkgy8k85Ae","HP433G1RhS","JkzUnVLTy6",
+"3otm6ECMvU","55rfBIjTwP","jiVBPxReec","FGzgpt59lR","uJScXcL0aE","HlUbFjSjS3","LDk6fVLTy6","YjB9tbgJAz","S2DfuBFkb8","yluBxFxX9q",
+"Uvlv4s4786","FLsphAkKTk","24ARF8hJdt","FxX9qvkCHH","GWqqXG1RhS","lweGyuvf7A","XyPZNfcJOy","dmoS7Uvlv4","JkzUniwzGk","vLsmSt59lR",
+"wDajXGSQwj","hE1QlCp3mZ","suY4xJkzUn","bZLvSuTacx","L7cGci3pyd","tlILtgf8rI","CIShGP6bcg","RxrsmIKxdL","v8yFNfcJOy","hE1QlsqVrf",
+"ThjNnbgJAz","ksJbyY1mC0","zQt6Q64s8N","lH1ktulk41","soy9ts7Mxk","WaWsv5Drn0","7X3uyvOqCE","6AFT0GXdoH","yofH37fsYM","aL6AJJKWYR",
+"0Wr5yNxx9V","QYxC0v2eC3","sqVrfzY1GY","ix74rJRJQB","DLhzMuvf7A","pWiOsgtCA5","qaofNgf8rI","guMb8ZhwG1","8TxD7vkCHH","16lHcjzUqR",
+"uupzka00b5","WMiS3pv0i7","8RCUAfcJOy","RkQkeulk41","zQt6Q7ku1p","G1RhSyEfy9","BGaQY5IhmG","qaofN1v5hH","Waim6QClRL","pFrrlBGaQY",
+"MmsIoFjHXR","i3pydVBjhz","S77LHZhwG1","No0QbFVMxo","rKDLJ9GXkX","tvdkD7X3uy","F6PT2m4bxU","ZUnqtn1pmO","tAOsrQYxC0","vkCHHnFqik",
+"FNYIMnnP8o","8U2nUfcJOy","LewvM2Nslm","K20wKQChxs","0Wr5ylCMxy","0BmCyix74r","t59lRNhXdu","C2Ircfqypy","mX2GEMGlTF","d85a9wiHrZ",
+"pAhR19eoRc","uZPqgnnP8o","QnJ1SCdyBV","KZamH5drc6","9y4lwZuDtD","2TRI79rlg9","2DREsFwEJz","sx5GlbZLvS","bgJAz4W0Tl","JkzUnNcICA",
+"DG4sTrhl0J","QssNCX6Pin","2TRI77fKYU","JXljWpFrrl","XflUqYOfrY","aFFssXyPZN","atef28hJdt","In3NSh1zcH","k85AeAOgEe","zz4ZUiKqhr",
+"0ao3la00b5","8U2nUcL0aE","nFqikFhtgl","xXTI4FFDui","4W0TlQssNC","Mkgy83otm6","FGzgpStlDJ","TwanoIRh48","ix74ruAWyp","OUqFM9eoRc",
+"gtCA5AgJHQ","B3qemrKDLJ","45cIH1LB1L","ydG8UtAOsr","t98iWWDVWJ","0YAGHpAhR1","Yw2oUTXQ0Z","bgJAzHfyNQ","NcICAUmaEv","RxrsmSmGzv",
+"9iGoTQssNC","uvf7APb1pa","9eoRcYOfrY","LbRTHhi5X7","he9IAsoy9t","lViBvb29RJ","VNCPdx3LDe","d7vjMDQimp","Fhtglru4UG","bgJAzwiHrZ",
+"RsQUqxReec","POUYSC2Irc","nFqikRACuj","rKDLJS2Dfu","CNHmvzqH0W","L7cGcFGzgp","2NslmSjskQ","hYBCKgjUTu","qUJMdbZLvS","tl72WpT8wu",
+"8TxD7fFDrJ","pFrrlWreyP","brhlQVIlwP","WaWsvfaHir","aez9y6AFT0","5ZaEzFLsph","cL0aEgtCA5","D6rByZhwG1","GWqqXguMb8","lsQGoU3yw5",
+"Oz8yZ3weIF","In3NSBbwgA","7lUXZIn3NS","jtn0XIn3NS","MmsIookgRi","JJs5mCdyBV","dhSuHcL0aE","pmeCdcQOnv","WaWsvFFDui","bZLvSv1Hln",
+"45cIHx3LDe","UlU3MSmGzv","dQ586CqqaD","0Wr5yAXpwE","ThjNndhSuH","ix74rVIlwP","uvf7ARmDcr","pvgjSsoy9t","J2mQidhSuH","fLNg8vOqCE",
+"xReecAgJHQ","IKxdLDQimp","WDVWJbrhlQ","M6qcGSjskQ","yofH3o8Uyd","ZuDtDRkQke","ZhwG16AFT0","Nxx9VW7cTs","sx5GlQworu","NOHszAmdQd",
+"Oz8yZaFFss","FGzgpnFqik","AmdQdhSSvQ","suY4xBpYhV","SmGzv07n1c","TCgPpDcpWB","lViBvQYxC0","uJScXIKxdL","vLsmSvkCHH","djsrvC2Irc",
+"ZzJHWOxWIH","BFkb845cIH","9eoRcdhSuH","ZuDtDAXpwE","7ku1pa00b5","ECMvUbgJAz","lweGyQYxC0","RxrsmReKEW","HP433JXljW","Ss0ZuNhXdu",
+"vkCHHMmsIo","jS1ajQbxXc","h1zcHFcWrW","lpF6WwiHrZ","LewvMFhtgl","rKDLJfqypy","fLNg8oQ87r","ulk41yluBx","QbxXci7WMQ","48cHLQworu",
+"fcJOy3otm6","GWqqXprNT6","hi5X7zqH0W","AOgEel83Ud","BGaQYpmeCd","FGzgpcL0aE","Uvlv47X3uy","IRh48jS1aj","5drc6VjCZq","JKWYR5IhmG",
+"BGaQYtAOsr","IKxdLVerEA","tl72WksJby","Vprf2IBe8k","QssNCZ4I1v","gdQsSZhwG1","bgJAzuTacx","lsQGoThjNn","4QMc9tvdkD","S77LHPb1pa",
+"POUYSvkCHH","UlU3M4dEz6","djsrvBbwgA","Uvlv4GXdoH","Uvlv4uvf7A","pv0i764s8N","vkCHHlkMUA","rhl0JFhtgl","OHaBzzqH0W","vkCHHQssNC",
+"lj07QYjB9t","wiHrZZuDtD","FxX9qFFDui","y94nwYh1hF","qaofNeuZA5","tAOsrfaHir","ix74rChuy3","1LB1L7X3uy","CxVEft59lR","CNHmvEOE1o",
+"FcWrWMmKGJ","KsjRKtaOXK","ksJbyVerEA","I7p2ai3pyd","NcICA0MR5X","Oz8yZQbxXc","pv0i7MezSW","zbIYYzY1GY","zFgtBBGaQY","CxVEf1LB1L",
+"RkQkeOUYuF","5Mg9r0YAGH","QworufcJOy","Uvlv4pmeCd","ZJTXHP6bcg","h1zcHRkQke","9rlg9Mm8si","a00b5AOgEe","7hyVvsx5Gl","hi5X7vkCHH",
+"M3zXLYw2oU","29QAz8xEKz","FPfSEFNYIM","xReecx3LDe","uupzkfLNg8","blLA9pWiOs","brhlQfLNg8","vLsmSNAFuw","Oz8yZjiVBP","D6rBy7fsYM",
+"yvOMIe6e4z","dQ586zqH0W","Mkgy8fqypy","GrDg7cL0aE","7hyVvlsQGo","uN6r3GWqqX","aez9ypAhR1","WDVWJix74r","aez9yblLA9","tlILtZuDtD",
+"YjB9tPOUYS","KsjRKVBjhz","pT8wul83Ud","I7p2aThjNn","Kr8yslViBv","AmdQdcmXIX","sqVrfd7vjM","t59lR4dEz6","HfyNQBGaQY","SWfouIBe8k",
+"ciuWzjzUqR","5VZjSbrhlQ","RkQkesuY4x","Cp3mZFFDui","AmdQd9y4lw","Yh1hFJKWYR","TXQ0ZJRJQB","lCMxyJIqXi","ogLgccShY2","yofH3IBe8k",
+"8xEKzIRh48","1j5L8WMiS3","HRxd8Gv3Fq","RpBQmBCxeC","HP433AOgEe","tAOsrFLsph","nnP8osuY4x","ydG8U5iGN5","J2mQii3pyd","t98iWLbRTH",
+"LewvMpiJSk","fqypyCNHmv","AkKTkciuWz","v1HlnP6bcg","pmeCdbZLvS","0MR5XpWiOs","7fKYUrhl0J","29QAz9eoRc","NcICAzqH0W","AXpwEkZANm",
+"MK07YRzaZA","xReec5VZjS","lsQGoNo0Qb","FcWrWP6bcg","MmsIouTacx","d85a9y94nw","29QAzmX2GE","7X3uyAXpwE","yvOMItvdkD","fcwDas93Ml",
+"jiVBPbZLvS","7ku1pciuWz","7hyVvD6rBy","WaWsvJIqXi","OxWIHzbIYY","DcpWBYh1hF","pvgjSCp3mZ","JkzUnM3zXL","yofH32TRI7","M6qcGM3zXL",
+"nlaByGrDg7","Z4I1vFcWrW","HP433jeskS","7lUXZjSjS3","FGzgpUvlv4","n8pJ9wDajX","AIYUuQChxs","pT8wuSWfou","OHaBzni2v1","EOE1ozQt6Q",
+"kB5nPOxWIH","2Yz7Et59lR","tAOsrBpYhV","ru4UG14FLR","AkKTkQChxs","gjUTuzz4ZU","RpBQmpiJSk","lsQGo29QAz","oVQp6atef2","yofH3BbwgA",
+"5Mg9ro8Uyd","BCxeCQssNC","uQIczMmKGJ","gdQsSFjHXR","ciuWzRkQke","he9IAJJs5m","FVMxozbIYY","0YAGHCfgr3","LDk6f9y4lw","AOgEe2Nslm",
+"NhXdu0ao3l","wiHrZaez9y","QbxXcYjB9t","s7MxkWaim6","X6PinRmDcr","bgJAztuDyS","atef24W0Tl","LewvMGv3Fq","CxVEf7hyVv","yofH3fcwDa",
+"I7p2a5Drn0","LewvMcShY2","s93MlNxx9V","uN6r3IKxdL","LDk6fuTacx","pmeCd2TRI7","BpYhVMm8si","fcJOy5iGN5","zbIYYdpe1v","uLtKsBpYhV",
+"dhSuHWmadA","S2DfuD6rBy","VLTy6FVMxo","atef248cHL","EdBKctAOsr","l83Udatef2","ciuWzni2v1","0BmCyYOfrY","l83UdSs0Zu","7hyVvqQxHP",
+"8hJdtYjB9t","uupzk24ARF","oQ87r7hyVv","mz8gx14FLR","2NslmzFgtB","tjQxsQ6hMC","v8yFN5ZaEz","EOE1olj07Q","5ZaEzfmIK1","14FLR4dEz6",
+"K4GS8VNCPd","Kr8ysM6qcG","RBhp0HlUbF","hUTw716lHc","oGu6xOUqFM","aez9yvOqCE","C2IrcVNCPd","No0Qb0h1b1","uJScXJKWYR","MGlTFEdBKc",
+"64s8NFVMxo","uTacxxciqp","5IhmGFFDui","VNCPd4QMc9","lm0pDlweGy","wDajXQbxXc","v2eC3yToGW","W7cTsfqypy","Cfgr3xReec","QnJ1S2Yz7E",
+"zz4ZUogLgc","wiHrZiqv4k","fmIK1DQimp","CqqaDFnPFB","Yf2EcU3yw5","gtCA5VerEA","14FLRhYBCK","QYxC0lj07Q","tvdkDGSQwj","VerEAeuZA5",
+"XyPZN0Kyfs","5Drn0Ta8f6","OHaBzRmDcr","xciqpJXljW","nnP8od7vjM","pAhR1VerEA","AOgEe7X3uy","5NammfLNg8","BGaQYhi5X7","FwEJzYf2Ec",
+"J2mQiCNHmv","ReKEWjeskS","s7MxkksJby","VjCZqUvlv4","mX2GEJkzUn","bZLvS9rlg9","uAWypSmGzv","brhlQ5Namm","NOHsz3weIF","CqqaDDLhzM",
+"wDajXYOfrY","azIWpP6bcg","FcWrWt98iW","prNT69y4lw","azIWpRxrsm","zmLYDPb1pa","tAOsrTa8f6","9XyT9h1zcH","0ao3lFxX9q","55rfBh1zcH",
+"guMb88FmFH","XflUqCNHmv","hUTw7Mm8si","8RCUATXQ0Z","v8yFNy94nw","CqqaD1LB1L","xXTI4MezSW","SbRYypT8wu","QWxoTOHaBz","n8pJ95ZaEz",
+"faHirhE1Ql","B3qem0PktI","CdyBVCIShG","S77LHuQIcz","S77LH5drc6","n1pmOTCgPp","64s8NVBjhz","JJs5m4dEz6","dpe1v1j5L8","XflUqMm8si",
+"h1zcHSjskQ","gf8rItuDyS","9GXkXuZPqg","OUqFMdpe1v","7fKYUtvdkD","pAhR1lkMUA","i7WMQZzJHW","CqqaD0ao3l","lXFOBpmeCd","EoToPPYBf4",
+"ThjNnt98iW","VBjhzoVQp6","FLsphjS1aj","IKxdL2Nslm","d7vjMCNHmv","WmadACdyBV","yToGWY1mC0","5Drn09y4lw","gtCA5t98iW","ru4UGhE1Ql",
+"jzUqRY1mC0","64s8NC2Irc","C2IrcyToGW","cL0aEBGaQY","S77LHWreyP","8U2nUjtn0X","k85AeWPmlx","HRxd85VZjS","FLsphZUnqt","Zv7z0VjCZq",
+"9rlg9xReec","iKqhrqQxHP","o8UydYjB9t","okgRijiVBP","rz7UtNAFuw","1LB1LSWfou","XflUq9y4lw","pvgjSStlDJ","D6rBy0Wr5y","mX2GEtjQxs",
+"QChxsh1zcH","YjB9tFjHXR","7ku1pokgRi","wiHrZ0ao3l","NcICAS2Dfu","7Ow5CsuY4x","TXQ0Z4dEz6","L7cGcdhSuH","XflUqmz8gx","0Wr5yprNT6",
+"07n1cChuy3","WMiS38U2nU","JIqXiyluBx","RpBQmhUTw7","he9IAmX2GE","FPfSEvOqCE","DG4sTOHaBz","3weIFqUJMd","55rfBuPX7G","2Yz7EoVQp6",
+"aDGtScmXIX","bgJAzhi5X7","Ul4a1FxX9q","uQIczBbwgA","xReecDG4sT","dQ586pmeCd","zQt6QokgRi","HfyNQuoStw","rKDLJaez9y","YjB9tprNT6",
+"ciuWzxReec","0PktI2TRI7","zHF1qnnP8o","fqypyvLsmS","FFDui4W0Tl","UmaEv618Di","EdBKc5VZjS","qUJMdyToGW","IKxdLJJs5m","e6e4zTwano",
+"hUTw78TxD7","ix74rBFkb8","bZLvSk85Ae","dpe1vwDajX","2ZHdkO3iyQ","IKxdLXyPZN","618Difqypy","29QAz2Yz7E","55rfBlH1kt","48cHLru4UG",
+"FxX9qZuDtD","ZzJHWiwzGk","P6bcgI7p2a","pWiOs48cHL","n1pmO07n1c","VjCZqvLsmS","8U2nUeuZA5","JJs5ms93Ml","2Nslm5ZaEz","tlILtblLA9",
+"8U2nU07n1c","GWqqXyToGW","cmXIXwiHrZ","fLNg85VZjS","AkKTkPb1pa","ZhwG1ydG8U","Ss0ZuNOHsz","0ao3luJScX","dmoS7blLA9","Yh1hFTwano",
+"zQt6QFhtgl","atef2F6PT2","AIYUuvLsmS","sqVrf8U2nU","07n1clkMUA","jS1ajSs0Zu","3otm6s4786","lkMUA4QMc9","S77LHvOqCE","NhXdu8U2nU",
+"atef2NAFuw","jfREuZ4I1v","zqH0WtjQxs","TXQ0ZVIlwP","6AFT0Vprf2","XflUqChuy3","LewvMoVQp6","Ul4a1W3VFH","UlU3MQYxC0","9eoRcciuWz",
+"hSSvQU3yw5","uQIczOHaBz","fcwDa24ARF","WreyPtvdkD","6AFT0Chuy3","55rfBpFrrl","ZhwG1StlDJ","S77LHhUTw7","8U2nUdmoS7","d7vjMRpBQm",
+"hUTw7WDVWJ","9rlg9QnJ1S","zz4ZUxReec","RzaZAyEfy9","l83UdYw2oU","Rxrsm0YAGH","fcwDabrhlQ","K4GS82hEEU","0PktIDcpWB","2Nslm0YAGH",
+"vLsmSJRJQB","jtn0XgIYvE","nnP8o5Namm","0h1b15drc6","5nmWvFxX9q","CxVEfZv7z0","hSSvQYh1hF","okgRiZ4I1v","gjUTuVprf2","d85a9vkCHH",
+"lH1ktni2v1","7X3uyvLsmS","BCxeCqQxHP","aDGtSfFDrJ","cL0aEMmsIo","lweGyfaHir","xciqppiJSk","hYBCKatef2","pFrrlvkCHH","BFkb86q6L9",
+"xciqpUlU3M","45cIH5VZjS","MojnPoGu6x","ZUnqts7Mxk","JRJQBBbwgA","dhSuHlH1kt","nnP8o0MR5X","tl72WvLsmS","QChxsdjsrv","NAFuwAgJHQ",
+"9XyT9EoToP","WaWsvXyPZN","2DREstlILt","55rfBCNHmv","gdQsSSmGzv","QWxoTwiHrZ","WaWsvpmeCd","jzUqR2Yz7E","14FLRKZamH","v2eC39XyT9",
+"VjCZqlm0pD","fFDrJLDk6f","StlDJnFqik","wiHrZ9XyT9","0MR5XwiHrZ","TCgPpAmdQd","YjB9tTXQ0Z","In3NSJ2mQi","mz8gxQworu","Kr8ysbrhlQ",
+"GXdoHx3LDe","Pb1pad7vjM","prNT6CxVEf","FxX9qm4bxU","RxrsmOUYuF","VLTy60ao3l","bgJAz2Nslm","wiHrZ0BmCy","lm0pDFjHXR","W3VFH2TRI7",
+"d85a9U3yw5","a00b5aez9y","S77LHOxWIH","RxrsmaFFss","hSSvQFcWrW","i7WMQuupzk","uTacx7ku1p","BpYhVjSjS3","m4bxU6q6L9","lH1ktQbxXc",
+"3weIFMezSW","4QMc9Ul4a1","uPX7GsuY4x","lm0pD9iGoT","nlaBy5nmWv","CdyBVMm8si","lCMxyDG4sT","cL0aE48cHL","1j5L8Vprf2","2ZHdk16lHc",
+"5Drn0aL6AJ","qQxHPSs0Zu","tl72WfcJOy","C2IrcgIYvE","nnP8o4W0Tl","XyPZNQssNC","xReecU3yw5","Kr8ysn1pmO","lsQGoSs0Zu","Yf2EcyluBx",
+"PYBf4s4786","uvf7AJkzUn","atef2tlILt","MGlTFFPfSE","rz7Utx3LDe","IRh48l83Ud","WaWsvWPmlx","CxVEfrKDLJ","s7MxkFLsph","FhtglQ6Lix",
+"hSSvQQnJ1S","gtCA5bgJAz","AOgEeStlDJ","Waim6brhlQ","MK07YBFkb8","FPfSEtaOXK","cShY2ru4UG","wDajXhe9IA","Dz1R3LDk6f","Pb1paiB08l",
+"YOfrYRBhp0","EoToP7fKYU","cShY2bgJAz","ydG8UMm8si","OUYuFd7vjM","LbRTHZJTXH","5drc6pT8wu","POUYSMezSW","pFrrlHfyNQ","SbRYyEdBKc",
+"lViBvmX2GE","4QMc9tlILt","jtn0XjfREu","xciqpZhwG1","P6bcgv1Hln","7Ow5Ct98iW","OUqFMNAFuw","atef264s8N","qaofNuQIcz","hSSvQECMvU",
+"VjCZqCxVEf","hYBCKCdyBV","XyPZNIjTwP","vLsmSX6Pin","K4GS82ZHdk","0PktIWmadA","lm0pDazIWp","yToGWQworu","JXljWzmLYD","nFqikQ6Lix",
+"2ZHdkFNYIM","jfREuG1RhS","e6e4zd85a9","uoStwWreyP","ZuDtDlCMxy","iKqhrzqH0W","FGzgpd7vjM","Ta8f6azIWp","ni2v1BFkb8","ZhwG1jSjS3",
+"TwanoiB08l","DQimpru4UG","oGu6xNAFuw","DG4sTe6e4z","t59lRqaofN","SWfouFcWrW","nlaByIn3NS","aL6AJtAOsr","uN6r3zbIYY","nnP8olCMxy",
+"zY1GY2hEEU","QworuWaim6","AgJHQuN6r3","GSQwjrz7Ut","pT8wuiqv4k","t98iWCdyBV","EoToPJXljW","sx5Gl64s8N","45cIHhi5X7","zz4ZUuZPqg",
+"sqVrfQbxXc","jzUqRRBhp0","KASQ8gIYvE","v2eC3JIqXi","vLsmSiKqhr","Cp3mZThjNn","K4GS8BFkb8","5VZjSChuy3","OUqFMhe9IA","uoStwcmXIX",
+"WmadAuTacx","9rlg9ydG8U","HRxd8OUYuF","mX2GEfcwDa","O3iyQAgJHQ","64s8Nv8yFN","XflUqBFkb8","zqH0WMaJQs","F6PT2M3zXL","W7cTs8FmFH",
+"KZamHzmLYD","oGu6xlj07Q","MaJQsvOqCE","618Di7ku1p","GWqqX07n1c","DLhzMU3yw5","gtCA5euZA5","jiVBPZv7z0","07n1ckZANm","StlDJxXTI4",
+"2Yz7EW7cTs","jiVBPuupzk","7fsYMU3yw5","atef2ReKEW","SWfoutuDyS","WmadARACuj","Kr8ysYw2oU","DLhzMuPX7G","l83UdECMvU","zY1GYni2v1",
+"ogLgcwDajX","pT8wuyEfy9","F6PT2fLNg8","XflUqFVMxo","Waim6Cp3mZ","0MR5XReKEW","uJScXkZANm","Waim6pvgjS","guMb8ZUnqt","zmLYDGv3Fq",
+"Z4I1v8xEKz","IBe8k0Wr5y","brhlQy94nw","5NammwiHrZ","vOqCELbRTH","4dEz6mX2GE","tAOsrFnPFB","lm0pD1j5L8","QChxsJ2mQi","K4GS8zY1GY",
+"JIqXixReec","PYBf4okgRi","U3yw5zz4ZU","NcICAIBe8k","HP433TXQ0Z","gtCA555rfB","RkQkenFqik","In3NSFwEJz","lXFOB0MR5X","MK07Y0BmCy",
+"qUJMdiB08l","AOgEefcJOy","oVQp69GXkX","VNCPdrz7Ut","n1pmO6AFT0","jzUqR45cIH","HzZT86q6L9","MGlTFWreyP","qQxHPJkzUn","1v5hHCdyBV",
+"FGzgpYOfrY","QworuuAWyp","Chuy3wiHrZ","W3VFH0PktI","K20wKUvlv4","pv0i7OUqFM","NAFuwGWqqX","1j5L8M3zXL","K4GS8W7cTs","0YAGHQWxoT",
+"nlaByMojnP","h1zcHlXFOB","WmadA4dEz6","zqH0WYw2oU","618DiMmsIo","ThjNnVjCZq","7fsYMBbwgA","gIYvE4W0Tl","AIYUufcJOy","ciuWznlaBy",
+"GXdoH4QMc9","QssNCMK07Y","POUYS16lHc","ru4UG2TRI7","PYBf4zY1GY","WPmlxVerEA","iKqhrHP433","No0Qb9rlg9","kZANmThjNn","lXFOB24ARF",
+"uLtKsHlUbF","XyPZN2ZHdk","iwzGkfcJOy","RmDcrKZamH","fLNg8dQ586","MGlTFAgJHQ","RACujOUqFM","I7p2aZhwG1","StlDJAgJHQ","sx5GlS77LH",
+"k85Aen1pmO","O3iyQFwEJz","MGlTF7Ow5C","HlUbFaDGtS","7hyVvkZANm","okgRiiwzGk","Z4I1vkZANm","YjB9tn8pJ9","DcpWBDLhzM","nFqikfaHir",
+"Dz1R3hE1Ql","b29RJyEfy9","VjCZqWreyP","i7WMQuPX7G","2hEEUVBjhz","Ta8f6EdBKc","SjskQn1pmO","K4GS816lHc","djsrvZUnqt","5Mg9rD6rBy",
+"MmKGJt59lR","fFDrJMaJQs","DLhzMzQt6Q","MezSWnnP8o","sx5Glaez9y","UmaEvo8Uyd","YjB9tGv3Fq","HfyNQ24ARF","nnP8ojtn0X","yEfy9pAhR1",
+"zHF1qUlU3M","zHF1qs4786","K20wKfcwDa","07n1cgIYvE","S2Dfu618Di","RzaZAGSQwj","QbxXclweGy","580YDMezSW","P6bcg7fKYU","JXljWpT8wu",
+"6q6L9Chuy3","2ZHdkGv3Fq","RmDcrHzZT8","QssNCD6rBy","t59lR29QAz","M6qcGlm0pD","fFDrJhE1Ql","gtCA5DQimp","MojnPbgJAz","DQimpFNYIM",
+"L7cGcMezSW","gdQsSFFDui","9XyT9C2Irc","07n1cyToGW","SbRYyv2eC3","WaWsvCK5W7","48cHLJ2mQi","TCgPpSmGzv","l83UdfcwDa","oQ87r7fKYU",
+"CdyBVMezSW","jeskSU3yw5","s7MxkDcpWB","fcJOy0Wr5y","x3LDe8TxD7","O3iyQTXQ0Z","xReecJRJQB","pWiOs8FmFH","MezSWMkgy8","gtCA5RmDcr",
+"JkzUncmXIX","lCMxyqUJMd","IKxdL6AFT0","QClRLPOUYS","24ARFqUJMd","rKDLJfmIK1","v2eC3IKxdL","jfREu7fsYM","B3qemlViBv","prNT6G1RhS",
+"Gv3FqDQimp","uPX7GpiJSk","d7vjMFNYIM","VNCPd9eoRc","QnJ1Sgf8rI","zz4ZUs93Ml","Yh1hFbgJAz","uJScX0PktI","RBhp0sx5Gl","uN6r3TXQ0Z",
+"dQ586Q6hMC","Yf2Echi5X7","cQOnvoVQp6","POUYSFGzgp","kB5nPNAFuw","pv0i714FLR","RACujK4GS8","djsrvulk41","zmLYDCqqaD","IKxdLZv7z0",
+"RpBQmGv3Fq","LDk6fmz8gx","bZLvSqQxHP","xReecJkzUn","W7cTshe9IA","UmaEvFPfSE","WMiS3Mkgy8","SjskQCfgr3","AgJHQ5VZjS","0Wr5ybgJAz",
+"0Kyfsxciqp","RpBQmuZPqg","24ARFlViBv","5iGN5bgJAz","wDajXFnPFB","uZPqg5nmWv","iKqhrMojnP","FGzgpQworu","J2mQi5ZaEz","J2mQi6AFT0",
+"zQt6QwiHrZ","LewvMqaofN","AIYUuP6bcg","BpYhVVBjhz","d85a9EOE1o","8cVD3faHir","NAFuwFPfSE","vOqCEOUqFM","JXljWcmXIX","JXljWjeskS",
+"9XyT9W3VFH","hE1Qllm0pD","0MR5XuN6r3","TCgPpEOE1o","QssNCblLA9","zY1GYhYBCK","ZuDtDTwano","cmXIXB3qem","m4bxUt59lR","DLhzMIKxdL",
+"14FLR8cVD3","x3LDeQYxC0","WPmlxLbRTH","64s8Ny94nw","QYxC08hJdt","OUYuFS2Dfu","FcWrWS2Dfu","IBe8kix74r","soy9ttAOsr","IjTwPZhwG1",
+"djsrvzqH0W","jfREu5drc6","mz8gxThjNn","zmLYDVjCZq","TXQ0Z8TxD7","yEfy9pWiOs","IRh48MmKGJ","580YDYOfrY","QWxoTThjNn","S2Dfu5IhmG",
+"sqVrfdQ586","JRJQBDz1R3","8cVD3wDajX","5nmWvhi5X7","UmaEvazIWp","Yh1hFnFqik","ZJTXHHfyNQ","RBhp0prNT6","prNT6m4bxU","jS1ajvLsmS",
+"8hJdtHfyNQ","NhXduNcICA","yEfy98FmFH","v1Hln5VZjS","hUTw7tl72W","16lHcOHaBz","mX2GEEOE1o","tjQxsTCgPp","5VZjSdQ586","jiVBP8cVD3",
+"dpe1v2ZHdk","AXpwEqaofN","RsQUqUlU3M","uAWypix74r","zQt6QlsQGo","8TxD7WDVWJ","CxVEfYw2oU","QClRLzqH0W","07n1cBpYhV","VerEAVLTy6",
+"kZANm2TRI7","IjTwPFhtgl","WreyP7hyVv","VjCZqY1mC0","o8UydHP433","7X3uyReKEW","k85AeokgRi","QssNChUTw7","CqqaDCp3mZ","9rlg98cVD3",
+"vOqCEUmaEv","0Wr5yKr8ys","0PktI3weIF","bgJAzGWqqX","AmdQduoStw","lXFOBFFDui","Z4I1vlsQGo","zQt6Q3weIF","DcpWB0PktI","BGaQYyToGW",
+"pFrrlZuDtD","lm0pD3otm6","M6qcG8hJdt","MK07YmX2GE","dpe1vIjTwP","blLA9tAOsr","5Mg9rUl4a1","uZPqgC2Irc","VNCPdhUTw7","TCgPp5Drn0",
+"tAOsrMkgy8","iqv4kiwzGk","9GXkXdpe1v","HfyNQCp3mZ","3weIFpFrrl","OxWIHzz4ZU","G1RhSSWfou","zbIYYoQ87r","ZhwG1HRxd8","uupzkFhtgl",
+"DcpWBLDk6f","rz7UtwiHrZ","BFkb8yvOMI","Ul4a1U3yw5","U3yw5sx5Gl","GrDg74QMc9","jeskSJKWYR","KsjRK14FLR","AXpwEXflUq","580YDi7WMQ",
+"C2Ircsx5Gl","jiVBPG1RhS","LewvMIRh48","CdyBVFxX9q","OUYuFjzUqR","Ta8f6QYxC0","MezSWyvOMI","tuDySNxx9V","6AFT04W0Tl","45cIHJ2mQi",
+"2TRI7yToGW","tuDySprNT6","WPmlxVjCZq","1j5L8pWiOs","W7cTs2Nslm","5NammIjTwP","o8UydpWiOs","Z4I1v45cIH","StlDJhYBCK","9iGoTMK07Y",
+"djsrvzbIYY","5NammlH1kt","a00b59iGoT","cL0aEzFgtB","VjCZqmz8gx","ni2v17fsYM","HRxd85Drn0","FxX9qNhXdu","tl72WJIqXi","zFgtBQChxs",
+"Mkgy8pWiOs","dmoS7ksJby","7X3uyBbwgA","fcwDaWPmlx","M6qcGCdyBV","CdyBVAOgEe","oQ87rzQt6Q","Y1mC0Rxrsm","i3pydQClRL","OUYuFs4786",
+"I7p2adpe1v","5NammK4GS8","Z4I1vQWxoT","kB5nPWaim6","07n1cWMiS3","JIqXiZzJHW","DcpWBXyPZN","fcwDaFhtgl","nFqikn1pmO","29QAzcShY2",
+"Oz8yZb29RJ","bgJAz5VZjS","atef29GXkX","pmeCdRkQke","xXTI4nFqik","5IhmGI7p2a","oVQp6FxX9q","RxrsmuZPqg","YOfrYPOUYS","s93MlS2Dfu",
+"wiHrZuQIcz","0YAGHru4UG","55rfBqQxHP","djsrvh1zcH","1v5hHWPmlx","ix74r7lUXZ","7ku1pBCxeC","azIWpWDVWJ","HP433qaofN","l83Ud7fsYM",
+"hE1QlZzJHW","ThjNnZv7z0","nFqik0YAGH","fmIK1b29RJ","qaofNMaJQs","GXdoHyToGW","ZUnqtIBe8k","ReKEWjtn0X","VLTy6sqVrf","2Yz7EjSjS3",
+"9iGoTDLhzM","zHF1qK4GS8","soy9tv8yFN","uLtKs2hEEU","D6rBy2hEEU","LbRTHHRxd8","o8UydThjNn","cQOnvWDVWJ","xXTI4mX2GE","lCMxyFNYIM",
+"i3pydOz8yZ","W3VFH07n1c","rz7UtydG8U","8U2nUQssNC","DLhzM29QAz","Yf2EcsuY4x","EOE1o0h1b1","tvdkDNo0Qb","QnJ1SQChxs","yofH3hE1Ql",
+"Vprf28hJdt","BpYhV55rfB","ZuDtDfqypy","s93MlSWfou","IKxdLZ4I1v","RkQkeGSQwj","0ao3lfLNg8","cQOnvd85a9","soy9tyEfy9","tjQxsZUnqt",
+"WPmlx16lHc","gjUTuM3zXL","K4GS85Drn0","tlILtiqv4k","jS1ajOz8yZ","KsjRKCK5W7","M3zXLdjsrv","rKDLJWreyP","BGaQYmX2GE","CdyBVHRxd8",
+"9eoRcYf2Ec","s93MlSbRYy","W3VFHjzUqR","uTacxlj07Q","KASQ8ThjNn","yofH3pv0i7","45cIHIRh48","In3NSSs0Zu","RxrsmuoStw","gdQsSwiHrZ",
+"euZA5s93Ml","fcwDaZJTXH","fLNg8Yw2oU","IRh48uvf7A","d85a9LbRTH","Cfgr3Mm8si","d7vjMDG4sT","RmDcratef2","Vprf2NcICA","QbxXcsoy9t",
+"8TxD7Pb1pa","ECMvUIjTwP","lpF6WpWiOs","xciqpFVMxo","uvf7A16lHc","WreyPAkKTk","yToGWmX2GE","0Wr5yjiVBP","VjCZqkZANm","pFrrluAWyp",
+"uQIcz4dEz6","4W0Tl4dEz6","5nmWvIRh48","xciqp3otm6","3otm6XyPZN","BpYhVXyPZN","4W0TlYjB9t","bgJAz9y4lw","JRJQBThjNn","NhXduFLsph",
+"soy9tvkCHH","lj07QCIShG","F6PT2P6bcg","ZUnqt0BmCy","29QAz7X3uy","lH1ktQClRL","LbRTH29QAz","Q6LixYw2oU","pWiOs5Drn0","2DREsCfgr3",
+"07n1c9XyT9","QnJ1S8cVD3","3weIFECMvU","QssNCbgJAz","ZzJHWe6e4z","v2eC3brhlQ","KZamH580YD","SjskQ1v5hH","S77LHn1pmO","JJs5mix74r",
+"4QMc9n8pJ9","v8yFNhE1Ql","MaJQsU3yw5","CNHmvSbRYy","GXdoHuJScX","ru4UGiwzGk","k85AeaFFss","ydG8UciuWz","qQxHPxciqp","Chuy3dpe1v",
+"IBe8kn8pJ9","tvdkDdpe1v","gjUTudjsrv","0BmCyFNYIM","gIYvEStlDJ","BCxeCb29RJ","B3qemnnP8o","No0Qba00b5","vOqCEpAhR1","atef29rlg9",
+"oGu6xydG8U","OUYuFVNCPd","29QAzJXljW","TXQ0Z7X3uy","8FmFHECMvU","ZuDtDQssNC","RkQkeoVQp6","zFgtBHzZT8","MmsIoVNCPd","jiVBP6AFT0",
+"9rlg9MmsIo","wiHrZIn3NS","Yf2Ecuvf7A","a00b5tuDyS","zmLYD64s8N","Pb1papv0i7","2ZHdkMm8si","zQt6QNhXdu","9eoRcRkQke","taOXK7Ow5C",
+"SWfouOz8yZ","cL0aEPb1pa","t59lRpiJSk","C2IrcGWqqX","lweGyEOE1o","Cp3mZtjQxs","Twanodjsrv","8U2nUGrDg7","IBe8kL7cGc","6AFT0In3NS",
+"RBhp0dhSuH","hYBCKt59lR","QworuRmDcr","IjTwPuvf7A","VNCPdsuY4x","3otm6pmeCd","RzaZA5VZjS","lj07QSjskQ","W7cTsZUnqt","v8yFNS2Dfu",
+"Yw2oUCIShG","GXdoH8xEKz","QbxXcOUYuF","JRJQBuLtKs","0ao3lYjB9t","jSjS3s7Mxk","x3LDeRBhp0","Zv7z0LDk6f","W7cTsAgJHQ","iwzGkZhwG1",
+"Pb1panFqik","uvf7AVLTy6","pmeCdm4bxU","brhlQTCgPp","sx5GlJkzUn","SWfouqQxHP","WPmlxuN6r3","14FLRqUJMd","EdBKcnFqik","gf8rIFLsph",
+"LewvMhUTw7","YOfrYEdBKc","nFqikStlDJ","ThjNngtCA5","lCMxyvLsmS","U3yw5618Di","64s8N0Kyfs","cQOnvHlUbF","CK5W7zbIYY","In3NSRkQke",
+"blLA9LewvM","Mm8siuupzk","hSSvQpWiOs","MojnPJXljW","X6PinDz1R3","IRh48zz4ZU","CqqaDB3qem","tuDySNo0Qb","2hEEUZhwG1","7X3uyQClRL",
+"ciuWz7fsYM","s93MlChuy3","Cp3mZDcpWB","FLsphF6PT2","SjskQdQ586","yofH3dhSuH","AmdQdcQOnv","zbIYY0h1b1","BFkb8G1RhS","VLTy6OUYuF",
+"jeskSFGzgp","ksJbyMojnP","RmDcrBFkb8","taOXKMm8si","S2DfuKASQ8","Chuy3hSSvQ","soy9tCqqaD","2NslmIKxdL","7hyVvP6bcg","BCxeCSbRYy",
+"7X3uyfaHir","EoToP2ZHdk","lCMxyIn3NS","C2Ircn8pJ9","0ao3lRzaZA","rhl0JoQ87r","J2mQi14FLR","IRh48FNYIM","jSjS35Namm","YOfrYKr8ys",
+"pmeCdzz4ZU","D6rByZUnqt","Cp3mZ16lHc","e6e4zokgRi","JIqXi9y4lw","S77LHn8pJ9","uZPqge6e4z","D6rByCdyBV","SmGzvMkgy8","fLNg8S77LH",
+"8cVD3BbwgA","uAWypMezSW","cmXIXYf2Ec","cQOnvI7p2a","0PktI0PktI","AXpwE8xEKz","5drc6tAOsr","lweGy6AFT0","QbxXcTa8f6","AgJHQ8xEKz",
+"9XyT9Qworu","Dz1R3lsQGo","DQimpSmGzv","8xEKzi3pyd","HlUbFzz4ZU","h1zcHDG4sT","x3LDei7WMQ","MaJQsSjskQ","djsrvXflUq","soy9thSSvQ",
+"Q6LixjiVBP","VIlwPfcJOy","vkCHHWreyP","Twano0MR5X","ZJTXHhSSvQ","DG4sTmz8gx","2Yz7ENhXdu","QYxC0FjHXR","BFkb8pvgjS","6AFT0gjUTu",
+"0BmCyfFDrJ","atef20MR5X","VBjhzOHaBz","zHF1qcQOnv","M3zXLaL6AJ","vkCHHhe9IA","Y1mC0aL6AJ","0YAGHaDGtS","aFFss7hyVv","jfREuZv7z0",
+"0ao3lFcWrW","RxrsmtvdkD","nlaBy618Di","0Wr5yCxVEf","MmsIo7X3uy","uvf7ASWfou","Y1mC0L7cGc","ulk41taOXK","sqVrfXflUq","cQOnvqQxHP",
+"pT8wu48cHL","Kr8ysQ6Lix","ECMvUlweGy","VNCPdCqqaD","1LB1LCIShG","FVMxoNo0Qb","StlDJRpBQm","pAhR1QClRL","2NslmlXFOB","QworuQClRL",
+"jS1ajDcpWB","SbRYygtCA5","07n1ctaOXK","faHirulk41","W7cTsFGzgp","NAFuwuvf7A","mz8gxrKDLJ","16lHcYf2Ec","HfyNQydG8U","x3LDeCIShG",
+"14FLRUmaEv","zFgtBFnPFB","y94nw9y4lw","FLsphD6rBy","0BmCyGSQwj","KsjRKt59lR","OHaBzJKWYR","8xEKzmX2GE","IRh48M6qcG","Oz8yZprNT6",
+"580YDxXTI4","MK07YfcJOy","IKxdLNAFuw","uN6r345cIH","DLhzMWPmlx","FFDui5IhmG","ZUnqtOHaBz","3weIFlm0pD","Twano0h1b1","yToGWpmeCd",
+"OUqFMAXpwE","RACujhE1Ql","14FLRS2Dfu","LewvMVNCPd","BGaQYtuDyS","0YAGHdjsrv","d85a9gdQsS","ogLgcfLNg8","5Mg9r4QMc9","pWiOs2hEEU",
+"ZJTXHB3qem","WPmlxk85Ae","l83UdS77LH","5Mg9rv1Hln","F6PT2mX2GE","Pb1pa6q6L9","zbIYYAOgEe","G1RhSaFFss","F6PT2MGlTF","TXQ0ZSjskQ",
+"qUJMdjfREu","AgJHQnlaBy","brhlQM3zXL","F6PT2lm0pD","8U2nUL7cGc","EoToPyToGW","JIqXiZJTXH","EdBKcyvOMI","t59lRCK5W7","lXFOBBCxeC",
+"lViBvzHF1q","48cHLCqqaD","Cp3mZFVMxo","1j5L8ReKEW","VBjhzBpYhV","NOHszZv7z0","IRh487lUXZ","fcJOysqVrf","qQxHPRpBQm","ZzJHWpmeCd",
+"guMb8WmadA","OHaBzNcICA","I7p2azQt6Q","CdyBVVLTy6","Q6LixAOgEe","EOE1oTCgPp","Oz8yZxReec","mX2GEJKWYR","QbxXcZv7z0","XyPZNoQ87r",
+"zY1GYMkgy8","jzUqR8cVD3","suY4xni2v1","JIqXilViBv","yToGWiqv4k","zY1GYTXQ0Z","wiHrZP6bcg","t98iWvLsmS","oQ87rhi5X7","9rlg9iwzGk",
+"fmIK1ix74r","zQt6QhUTw7","gf8rIGrDg7","8TxD7ksJby","LDk6f8RCUA","VerEAs4786","MaJQsVLTy6","7X3uypmeCd","ReKEW8cVD3","jtn0XCfgr3",
+"FNYIM9iGoT","lXFOBlXFOB","5VZjSFjHXR","JKWYRyofH3","cmXIXHP433","SmGzvFxX9q","64s8N8U2nU","SWfouzbIYY","rKDLJOxWIH","4W0Tljtn0X",
+"FcWrWn1pmO","uTacxAOgEe","WaWsvlm0pD","5iGN5xciqp","KZamHS2Dfu","7fKYUuvf7A","07n1cAIYUu","v2eC316lHc","TCgPpVjCZq","Kr8ysl83Ud",
+"zqH0WoQ87r","okgRiAgJHQ","pmeCdkB5nP","d7vjMDLhzM","d7vjMPOUYS","XflUqW7cTs","nlaBylsQGo","a00b5k85Ae","WDVWJZzJHW","Y1mC0gdQsS",
+"XyPZN3weIF","uQIczFcWrW","wiHrZStlDJ","DG4sTjtn0X","4dEz6MaJQs","sx5GlGWqqX","VjCZqThjNn","vLsmS3weIF","bgJAzzQt6Q","S2DfuYOfrY",
+"M3zXLS2Dfu","Gv3FqzQt6Q","HRxd8AOgEe","NhXduUmaEv","h1zcH5IhmG","8U2nU4W0Tl","48cHL2DREs","lj07QfFDrJ","qQxHPdpe1v","RACuj24ARF",
+"RmDcrlpF6W","8cVD3yluBx","pFrrlMm8si","16lHcbrhlQ","FNYIMuupzk","sqVrfDcpWB","MaJQsjtn0X","zz4ZUru4UG","nnP8ocL0aE","5drc68xEKz",
+"EdBKcuupzk","CqqaDHzZT8","MojnPNhXdu","sqVrftuDyS","ECMvUFxX9q","JRJQB1LB1L","hi5X7jSjS3","14FLRMmKGJ","Kr8yssqVrf","ru4UGYf2Ec",
+"16lHclsQGo","QWxoT0h1b1","EdBKcvkCHH","mX2GE0ao3l","lViBvx3LDe","lj07QUl4a1","uLtKsW3VFH","GrDg71LB1L","dQ5867X3uy","CxVEfM3zXL",
+"fcwDaChuy3","IjTwPgtCA5","Kr8ysQbxXc","Cp3mZnFqik","dpe1v5drc6","DLhzM4QMc9","fcwDarz7Ut","pv0i7ru4UG","uvf7AmX2GE","8TxD75Namm",
+"W3VFHd7vjM","BpYhVQ6Lix","lsQGo580YD","Twanoatef2","Mkgy8s93Ml","KASQ8MK07Y","taOXKv8yFN","FcWrWG1RhS","K4GS87fsYM","7Ow5CB3qem",
+"FhtglcmXIX","CK5W79iGoT","AIYUuFxX9q","0KyfsUvlv4","s4786yToGW","d85a9IjTwP","iB08ln8pJ9","XflUqFxX9q","tl72WZJTXH","WDVWJo8Uyd",
+"FPfSEDLhzM","prNT6580YD","Z4I1vqUJMd","FFDuisoy9t","JKWYRQ6hMC","fcJOyksJby","hi5X78xEKz","P6bcgs93Ml","K20wKlm0pD","5nmWvNOHsz",
+"5VZjSDcpWB","dmoS7rKDLJ","GXdoH2Nslm","MaJQss93Ml","Mkgy8IKxdL","VBjhzX6Pin","45cIHvkCHH","0h1b15iGN5","ECMvUMkgy8","pAhR1FnPFB",
+"M3zXLnlaBy","ogLgcRzaZA","HlUbFRBhp0","9rlg9PYBf4","Q6hMC6q6L9","0h1b1hSSvQ","QnJ1Siqv4k","8TxD7VIlwP","rhl0J0YAGH","lpF6WFVMxo",
+"bgJAzSs0Zu","zz4ZUZJTXH","55rfB8U2nU","okgRiCdyBV","jSjS3qaofN","ThjNnzY1GY","tvdkD0h1b1","gdQsS0h1b1","uQIczpFrrl","zQt6QyEfy9",
+"qQxHPSmGzv","VIlwPP6bcg","WPmlxn8pJ9","7ku1pIRh48","FGzgpaDGtS","RmDcrlkMUA","IjTwP8hJdt","nFqikGrDg7","580YDYw2oU","MmsIobgJAz",
+"uZPqgcL0aE","Kr8ysFnPFB","FcWrWL7cGc","aL6AJnnP8o","sqVrfOUqFM","s4786FLsph","QWxoThi5X7","NAFuwogLgc","MojnPMmKGJ","cShY2cL0aE",
+"FcWrWbZLvS","aez9yi7WMQ","M6qcGAXpwE","n1pmOFFDui","3weIFNo0Qb","M3zXLYjB9t","QbxXcGWqqX","MojnPokgRi","dpe1v9GXkX","SWfoutlILt",
+"5Drn0YOfrY","CxVEf5Namm","9y4lwDLhzM","POUYS5iGN5","tlILtRpBQm","QbxXchUTw7","WmadAOUYuF","7hyVvtuDyS","MaJQsHRxd8","fFDrJNAFuw",
+"ZuDtDEoToP","gtCA5JIqXi","8hJdtL7cGc","ogLgcIRh48","gtCA5Ul4a1","t59lR7lUXZ","5IhmGjzUqR","MezSWi3pyd","e6e4zvOqCE","K4GS8l83Ud",
+"JkzUnuTacx","iqv4kRmDcr","0ao3lbrhlQ","J2mQiFGzgp","ZhwG1tl72W","ni2v1yToGW","b29RJ8hJdt","G1RhSGrDg7","yEfy9zbIYY","W7cTsMK07Y",
+"m4bxUZzJHW","9XyT94dEz6","6AFT0hSSvQ","DQimp55rfB","e6e4zPYBf4","pWiOsD6rBy","9GXkXsqVrf","GWqqX29QAz","rz7UtRzaZA","soy9tIRh48",
+"Dz1R3F6PT2","lsQGozz4ZU","FNYIMiqv4k","uQIczlm0pD","6AFT0AOgEe","618Dio8Uyd","zmLYD45cIH","CK5W7BCxeC","SmGzv8cVD3","5iGN5ni2v1",
+"0ao3l1j5L8","Q6hMCyvOMI","POUYSBGaQY","YOfrYCfgr3","LewvMvLsmS","CIShG5Drn0","S77LH2TRI7","JIqXi618Di","16lHcYjB9t","G1RhSuZPqg",
+"RsQUqfFDrJ","EOE1o24ARF","ECMvU1j5L8","vkCHHGWqqX","9eoRclweGy","fLNg8tvdkD","XflUqMmsIo","dQ586azIWp","JIqXiyofH3","oQ87rd7vjM",
+"OxWIHlXFOB","FjHXRRsQUq","UmaEvfmIK1","Zv7z0WMiS3","VBjhz07n1c","EOE1ot98iW","FwEJzJ2mQi","GSQwjl83Ud","CK5W70h1b1","e6e4zpmeCd",
+"LbRTH4W0Tl","vkCHHCxVEf","Oz8yZtvdkD","Uvlv4RBhp0","Mkgy8FFDui","uAWypfcwDa","Yf2EcGrDg7","uAWypqUJMd","WPmlx0YAGH","azIWplpF6W",
+"KsjRK1j5L8","FFDuiRsQUq","BbwgAUlU3M","gdQsSAkKTk","FjHXR48cHL","OUqFMcQOnv","OxWIHzY1GY","s4786RACuj","7lUXZ2Nslm","RzaZAhYBCK",
+"ZhwG1UmaEv","9XyT9NAFuw","FjHXRDcpWB","L7cGcru4UG","Dz1R3VBjhz","nlaByv2eC3","tl72Whe9IA","zHF1qfcJOy","s93MlnFqik","8FmFH4dEz6",
+"iqv4kbrhlQ","RzaZARsQUq","n8pJ9VLTy6","gIYvEa00b5","6q6L9iqv4k","OxWIH3weIF","hYBCKHlUbF","gIYvENhXdu","OxWIHvLsmS","pmeCdMojnP",
+"RmDcrAIYUu","qaofN4QMc9","s7MxkHRxd8","a00b5MK07Y","PYBf4ogLgc","rhl0JSbRYy","5IhmG5Mg9r","Waim6OxWIH","fcJOyv1Hln","QWxoTtAOsr",
+"SjskQvLsmS","rKDLJKZamH","AXpwEFPfSE","8cVD3618Di","5iGN5fmIK1","t59lRFLsph","m4bxUpAhR1","Vprf2I7p2a","BCxeC0Kyfs","AgJHQfqypy",
+"d85a9FnPFB","QYxC08FmFH","yofH3UmaEv","x3LDe16lHc","s93Ml7fsYM","0BmCy9iGoT","9iGoTMGlTF","Twano1v5hH","fcJOytuDyS","XyPZNxReec",
+"uQIczzQt6Q","1j5L8iKqhr","BpYhVrKDLJ","x3LDeoGu6x","Q6hMCnFqik","OxWIHfmIK1","qaofN7fsYM","wDajXPb1pa","CqqaD0BmCy","Kr8ysBCxeC",
+"Y1mC0Y1mC0","uupzkxReec","b29RJatef2","RkQkeiKqhr","hYBCKCp3mZ","brhlQdmoS7","48cHL16lHc","aFFsspvgjS","soy9t5drc6","6AFT00Kyfs",
+"Mkgy8ru4UG","618DiXyPZN","MGlTFzqH0W","TXQ0ZwDajX","5drc6XyPZN","cShY2hSSvQ","B3qemoQ87r","uoStwru4UG","xciqpMojnP","EOE1oHfyNQ",
+"cmXIXlj07Q","piJSkmz8gx","ciuWzNOHsz","HzZT8zbIYY","fqypyB3qem","24ARFuoStw","iKqhrU3yw5","uAWypCdyBV","SbRYykB5nP","FPfSEMezSW",
+"NcICAZJTXH","sqVrfiwzGk","blLA9S2Dfu","5drc6CIShG","jfREuOHaBz","yvOMIcQOnv","0ao3lxciqp","blLA9JKWYR","Dz1R348cHL","ZzJHWRpBQm",
+"WPmlxaDGtS","24ARFIBe8k","W7cTsFPfSE","OHaBzZUnqt","HfyNQKr8ys","Yw2oUuoStw","m4bxU2DREs","aDGtSCK5W7","8U2nUDcpWB","8FmFH1v5hH",
+"Ta8f6jtn0X","Chuy3ciuWz","fcwDaBFkb8","Uvlv4b29RJ","YOfrYDz1R3","ZhwG1CNHmv","FhtglOHaBz","1v5hHZUnqt","FLsphVNCPd","FGzgpkZANm",
+"WMiS3dQ586","Waim6jSjS3","Vprf2pAhR1","WDVWJSs0Zu","9GXkXGv3Fq","FxX9quupzk","ciuWzQ6hMC","UlU3Mm4bxU","W7cTsKASQ8","lXFOBAXpwE",
+"KZamHoQ87r","U3yw5RACuj","euZA55IhmG","JKWYRbZLvS","CNHmv2Nslm","xciqpzY1GY","6q6L9oVQp6","5VZjSlViBv","P6bcgVBjhz","jSjS3k85Ae",
+"WreyPzbIYY","4dEz65Mg9r","5ZaEz9y4lw","tlILtrz7Ut","jfREuMaJQs","qaofNmz8gx","Ss0ZuLbRTH","NAFuwzHF1q","0YAGHl83Ud","SjskQYh1hF",
+"MmKGJIKxdL","WMiS3OUYuF","Oz8yZCxVEf","S77LHi7WMQ","zQt6QCxVEf","jfREuJXljW","16lHcG1RhS","bZLvSJIqXi","M6qcG7lUXZ","l83UdzqH0W",
+"4dEz6S77LH","8RCUA5nmWv","hE1Qlsoy9t","RxrsmOHaBz","FPfSEn1pmO","0YAGHlkMUA","ogLgcIBe8k","XyPZNvOqCE","LbRTH8TxD7","mz8gx2Nslm",
+"TXQ0ZkZANm","yofH3BCxeC","BGaQYdpe1v","AkKTkeuZA5","EOE1o8TxD7","BbwgAMGlTF","guMb8AXpwE","UlU3MXflUq","2TRI7FnPFB","jtn0XVLTy6",
+"U3yw529QAz","e6e4ziwzGk","ZzJHWgjUTu","45cIHRpBQm","No0Qb5Drn0","JIqXiCdyBV","QChxs29QAz","mz8gxBFkb8","AkKTkAkKTk","fcJOyVjCZq",
+"K4GS8zHF1q","VerEAECMvU","HfyNQ5IhmG","1j5L82hEEU","AmdQdv8yFN","aez9yyEfy9","bgJAzYw2oU","GrDg75VZjS","azIWpQnJ1S","QChxslm0pD",
+"POUYSyvOMI","QnJ1SkZANm","WreyPQssNC","M3zXLokgRi","5IhmGfmIK1","rKDLJulk41","lXFOBuAWyp","0BmCy2ZHdk","tAOsrgtCA5","Cfgr3jS1aj",
+"lj07QSbRYy","FnPFB5IhmG","VNCPduupzk","8TxD7hi5X7","uAWypKASQ8","lkMUAd85a9","dQ5867fKYU","HzZT8FGzgp","RBhp01LB1L","S2DfuVprf2",
+"4dEz6SbRYy","LbRTH8hJdt","uoStwPb1pa","cmXIXvkCHH","HRxd8CIShG","EdBKcyofH3","J2mQiPb1pa","yluBxsuY4x","24ARFMGlTF","ThjNnpT8wu",
+"DcpWBVBjhz","580YDs7Mxk","29QAzRkQke","RpBQmdQ586","MmKGJi7WMQ","JXljWZJTXH","tvdkDxXTI4","uPX7GQWxoT","SmGzv1LB1L","lCMxyAIYUu",
+"ogLgcbgJAz","29QAzZ4I1v","0ao3lv2eC3","xXTI42hEEU","9rlg9dQ586","RkQkeFwEJz","14FLRsoy9t","1v5hHhi5X7","JJs5mECMvU","55rfBAgJHQ",
+"wiHrZOHaBz","WMiS3618Di","aL6AJAIYUu","s7Mxk7X3uy","m4bxUgf8rI","bZLvSFPfSE","8xEKzDQimp","U3yw5hSSvQ","sqVrfwiHrZ","mz8gxW7cTs",
+"i7WMQyToGW","S77LH5VZjS","rKDLJSbRYy","zqH0WOUYuF","TXQ0ZQYxC0","fcwDalCMxy","zbIYYnlaBy","RpBQmfqypy","M3zXL0YAGH","OUYuFDG4sT",
+"ZzJHWpT8wu","ThjNnF6PT2","XflUqyToGW","DcpWBdmoS7","FPfSEJ2mQi","5ZaEzDG4sT","5ZaEzSs0Zu","s7MxkFnPFB","WreyPVBjhz","S2Dfu9rlg9",
+"EoToPBCxeC","hUTw7RkQke","jiVBPs93Ml","JJs5mdjsrv","ZJTXHTXQ0Z","StlDJPb1pa","qUJMdUlU3M","mX2GE0YAGH","Yw2oUdhSuH","lm0pDKr8ys",
+"4W0TlHzZT8","0ao3lSbRYy","ru4UGrKDLJ","1LB1LU3yw5","EOE1oqQxHP","mX2GElj07Q","JXljWrz7Ut","zQt6QD6rBy","No0QbydG8U","s7MxkzbIYY",
+"QssNCDLhzM","gdQsSksJby","618DiCqqaD","5drc6I7p2a","2DREsMkgy8","JXljWZUnqt","NAFuwRxrsm","GSQwjiB08l","rz7UtZhwG1","d7vjMgdQsS",
+"Z4I1vzY1GY","GrDg7lj07Q","nnP8oNcICA","CNHmvS2Dfu","fmIK1WreyP","07n1cv8yFN","MmsIol83Ud","jSjS3QYxC0","qaofN0Kyfs","s7MxktjQxs",
+"4dEz6JKWYR","n1pmOAgJHQ","zY1GYjS1aj","s7Mxka00b5","Cp3mZG1RhS","7ku1pJJs5m","nnP8oZzJHW","DLhzMprNT6","oQ87rh1zcH","RACujFhtgl",
+"iqv4kv1Hln","Q6Lixt98iW","618DiCdyBV","CNHmvOUYuF","YjB9tMK07Y","yEfy9MmKGJ","1v5hHFNYIM","OUYuFZJTXH","uLtKs1j5L8","Q6LixZUnqt",
+"lpF6WMmsIo","fcJOy2DREs","nlaBySjskQ","0KyfspAhR1","dhSuHo8Uyd","zHF1qgdQsS","uAWypOUYuF","P6bcgmz8gx","jzUqRJRJQB","Yw2oUulk41",
+"sx5GltvdkD","5Drn0WMiS3","AXpwEblLA9","zFgtBZUnqt","ru4UGyToGW","pT8wuM3zXL","n1pmOAmdQd","MmsIos7Mxk","yofH3WmadA","Yh1hFzY1GY",
+"OxWIHBpYhV","OUYuFIjTwP","POUYSGWqqX","gtCA5HfyNQ","dmoS7uvf7A","h1zcHlm0pD","24ARFbZLvS","a00b5Kr8ys","BbwgAOHaBz","lj07QKZamH",
+"5IhmGDQimp","lViBv5ZaEz","Uvlv4yvOMI","HzZT85ZaEz","zbIYYqQxHP","7Ow5CM6qcG","lH1kt0h1b1","faHirU3yw5","QYxC04W0Tl","y94nw6AFT0",
+"IBe8kFLsph","zz4ZUsx5Gl","oGu6xgdQsS","zFgtBVBjhz","lkMUAFVMxo","ReKEWBGaQY","3weIFEOE1o","4dEz6jiVBP","ZzJHWEoToP","Twanob29RJ",
+"yluBxCIShG","IRh48b29RJ","GWqqXdpe1v","Z4I1vuTacx","Pb1paWMiS3","ZJTXH45cIH","1LB1LfFDrJ","piJSkYOfrY","jeskSwiHrZ","pFrrlCK5W7",
+"yluBxhi5X7","jfREuJJs5m","29QAzx3LDe","2hEEUcmXIX","brhlQ8RCUA","pAhR1h1zcH","RkQkeVerEA","aDGtSNOHsz","0YAGHFjHXR","wDajXyEfy9",
+"yEfy97fKYU","n8pJ9lm0pD","aFFss618Di","GSQwjQClRL","aDGtSjS1aj","5iGN5nlaBy","ECMvUeuZA5","oVQp6HzZT8","Pb1paKASQ8","NhXduv8yFN",
+"ZUnqta00b5","zY1GYBpYhV","uAWypZ4I1v","MezSWy94nw","wiHrZdpe1v","e6e4zNhXdu","VjCZqlkMUA","GrDg7RzaZA","F6PT2fmIK1","LDk6fk85Ae",
+"wiHrZFPfSE","kB5nP5ZaEz","faHirgjUTu","iB08lksJby","vkCHHd85a9","Kr8ysiqv4k","B3qemuAWyp","2Yz7EWmadA","W7cTsqUJMd","AIYUuG1RhS",
+"L7cGcTXQ0Z","RBhp0BbwgA","KsjRKgdQsS","8cVD3MojnP","HzZT80ao3l","MmKGJxciqp","ZzJHW2Yz7E","OUqFMQ6Lix","i7WMQQChxs","FjHXRCIShG",
+"BGaQYFFDui","zHF1qprNT6","uJScXGXdoH","VjCZqjS1aj","djsrvQClRL","aDGtSxciqp","Q6hMCuPX7G","KZamHTwano","VLTy6JkzUn","Waim6lj07Q",
+"hE1Qlix74r","ZJTXHrz7Ut","ZzJHWU3yw5","ulk41D6rBy","FxX9qJ2mQi","zmLYDSs0Zu","ZuDtDv8yFN","OxWIHLbRTH","OxWIHL7cGc","nFqik618Di",
+"DQimpKr8ys","jSjS3FjHXR","ZJTXHVjCZq","dQ5860MR5X","B3qemXflUq","guMb8EdBKc","GSQwjWaim6","RmDcrJIqXi","oGu6xCK5W7","uoStwpmeCd",
+"StlDJydG8U","dQ586OUYuF","QClRLHzZT8","2hEEUyToGW","8hJdt5VZjS","Yh1hFECMvU","ix74rWDVWJ","cL0aEnFqik","CxVEfuJScX","MojnPGSQwj",
+"RACujwDajX","9rlg9wDajX","h1zcH0BmCy","SjskQwiHrZ","vLsmSkZANm","O3iyQQnJ1S","fLNg8JIqXi","2Yz7EprNT6","yofH3EOE1o","pWiOsB3qem",
+"lCMxy7Ow5C","zY1GYIn3NS","pvgjSuAWyp","azIWpZuDtD","tjQxstjQxs","8FmFHOxWIH","0MR5X8hJdt","24ARFThjNn","tlILtOUqFM","taOXKZJTXH",
+"hi5X7HfyNQ","jiVBPjfREu","uoStwokgRi","QYxC0a00b5","ZzJHWguMb8","8U2nUjfREu","QnJ1S9rlg9","uupzkuTacx","UmaEvaez9y","ogLgcAkKTk",
+"BpYhVSmGzv","9eoRc7hyVv","Mkgy8AgJHQ","djsrvIjTwP","MmKGJprNT6","Z4I1voGu6x","2ZHdkQYxC0","uvf7AZ4I1v","ksJby0PktI","No0QbRACuj",
+"iB08lFxX9q","QWxoT16lHc","JKWYR2DREs","FGzgpjS1aj","cmXIXIRh48","JKWYRgIYvE","5ZaEzoGu6x","7fKYU0BmCy","UlU3MiB08l","QWxoTLbRTH",
+"TCgPpWmadA","AkKTkazIWp","faHirtl72W","uLtKsjSjS3","W3VFHjfREu","yluBxoQ87r","CdyBVrhl0J","ECMvUfFDrJ","lpF6WoQ87r","LewvMRpBQm",
+"2DREsqQxHP","JXljWv2eC3","ZzJHW9y4lw","Cp3mZJJs5m","l83UdaDGtS","0Wr5y5Drn0","xXTI4CK5W7","2Nslmxciqp","S77LH45cIH","4QMc9EOE1o",
+"a00b5RBhp0","F6PT2fcwDa","djsrv5ZaEz","M3zXLHzZT8","QClRLMmsIo","cL0aEVNCPd","ciuWzo8Uyd","uAWyp1j5L8","6AFT0m4bxU","zz4ZUBpYhV",
+"WaWsv4QMc9","tjQxsFhtgl","azIWp7fKYU","Q6LixiB08l","ThjNnSWfou","Z4I1vRACuj","EOE1oa00b5","7Ow5Cs93Ml","v2eC3rhl0J","VBjhzPYBf4",
+"2Nslm6q6L9","nlaByX6Pin","WMiS34W0Tl","Kr8ysCfgr3","StlDJVjCZq","5ZaEz0BmCy","qUJMdKZamH","MojnPKsjRK","Chuy38xEKz","t98iWv2eC3",
+"lm0pDsoy9t","2Nslml83Ud","Cfgr3jSjS3","i7WMQO3iyQ","3weIFJkzUn","F6PT24dEz6","2TRI79iGoT","7fsYMnFqik","24ARF2Yz7E","gf8rIsqVrf",
+"55rfBOz8yZ","Ul4a1BFkb8","POUYS0YAGH","QClRLn1pmO","Cfgr3tAOsr","2hEEU580YD","dmoS7EoToP","SbRYyciuWz","ni2v1JkzUn","FhtgljS1aj",
+"fqypynnP8o","AgJHQb29RJ","a00b5GXdoH","UlU3MfmIK1","TXQ0ZI7p2a","6q6L9uTacx","IBe8kPb1pa","rKDLJBCxeC","2Yz7En1pmO","d7vjMP6bcg",
+"NAFuwFnPFB","FwEJzpmeCd","U3yw5IRh48","OUqFMfaHir","8TxD78TxD7","NAFuwIKxdL","rhl0JG1RhS","4dEz6x3LDe","pmeCdiwzGk","JJs5mgdQsS",
+"pvgjSlH1kt","SWfouDLhzM","MezSWiqv4k","piJSkgjUTu","s93MlYjB9t","taOXKFVMxo","0BmCy7hyVv","NOHszY1mC0","ogLgcGWqqX","v8yFNRkQke",
+"tjQxsFwEJz","xXTI43otm6","0h1b1LDk6f","ZUnqtBbwgA","vkCHHBbwgA","lViBvlH1kt","hSSvQDcpWB","e6e4zzQt6Q","Kr8ysZUnqt","tl72WFjHXR",
+"55rfBS2Dfu","JXljWzFgtB","Ss0ZuYjB9t","uvf7AReKEW","zqH0WjSjS3","jiVBP9GXkX","1LB1Lhe9IA","K4GS8SWfou","lsQGo2Nslm","2ZHdkXyPZN",
+"zQt6QcmXIX","vLsmSYh1hF","yvOMIqUJMd","8TxD7Yw2oU","EoToPtaOXK","rhl0JBFkb8","8TxD7pv0i7","pmeCdRpBQm","azIWpBGaQY","Pb1payluBx",
+"wDajXiqv4k","NhXdu16lHc","L7cGci7WMQ","cQOnvgIYvE","UlU3M4W0Tl","NcICABbwgA","zqH0WZ4I1v","v8yFNTwano","fmIK1Uvlv4","s4786jiVBP",
+"SmGzvguMb8","FNYIMgtCA5","FGzgpHzZT8","8RCUARACuj","Z4I1vhe9IA","pvgjSIBe8k","5ZaEzlViBv","DG4sTnlaBy","okgRiUlU3M","iB08lnFqik",
+"POUYSuZPqg","uN6r30ao3l","k85AeUlU3M","nnP8oVNCPd","hE1Ql5Drn0","uupzkhe9IA","jS1aj5IhmG","lkMUAd7vjM","zY1GYWaim6","X6Pins4786",
+"a00b5CqqaD","gdQsSPb1pa","lkMUAtlILt","NhXduiKqhr","AmdQd45cIH","D6rByrKDLJ","piJSkuoStw","djsrv5IhmG","SmGzvpv0i7","In3NSFNYIM",
+"dmoS7MojnP","F6PT2Gv3Fq","9y4lwLDk6f","n1pmOQChxs","zz4ZUfqypy","JJs5mxXTI4","5iGN5WaWsv","DcpWBmz8gx","GWqqXdhSuH","VBjhzXyPZN",
+"gtCA5XyPZN","MezSWd7vjM","AIYUub29RJ","K20wKokgRi","nFqikReKEW","48cHLLbRTH","EoToPKsjRK","jtn0XhE1Ql","ZzJHWt98iW","DQimp2TRI7",
+"tlILtHlUbF","iwzGksuY4x","RBhp0tlILt","FLsphsx5Gl","64s8N5ZaEz","JRJQB45cIH","rKDLJiwzGk","M3zXLsuY4x","64s8Nt98iW","0KyfsO3iyQ",
+"O3iyQIKxdL","5nmWvqQxHP","l83UdNOHsz","0BmCyX6Pin","faHirHlUbF","ThjNnXflUq","HzZT8FNYIM","0KyfsSWfou","AOgEeix74r","JRJQBfFDrJ",
+"1j5L8faHir","x3LDeHlUbF","i7WMQzHF1q","QYxC0Mkgy8","OUqFMJKWYR","hUTw7faHir","RxrsmVjCZq","uTacx7fsYM","IBe8kQYxC0","hYBCKgdQsS",
+"cQOnvjtn0X","16lHcUl4a1","QbxXcEdBKc","StlDJRxrsm","pv0i7dhSuH","F6PT2XyPZN","KASQ83otm6","kZANmjeskS","SmGzvtlILt","xXTI4uN6r3",
+"pmeCd0h1b1","xXTI4SbRYy","S77LH8hJdt","Kr8ys4W0Tl","YjB9tZv7z0","oGu6x580YD","d85a9iwzGk","OUqFM2DREs","No0QbYw2oU","DG4sTnFqik",
+"YOfrYjiVBP","VNCPdlweGy","1j5L8VBjhz","RpBQmYOfrY","Z4I1vD6rBy","ECMvUzbIYY","CNHmvOxWIH","Yf2EcPOUYS","kB5nPFjHXR","aDGtS24ARF",
+"8cVD3yvOMI","qaofN618Di","ZzJHW48cHL","pFrrla00b5","QYxC0jiVBP","aL6AJjS1aj","fLNg8Gv3Fq","WreyPuJScX","fmIK1O3iyQ","BCxeChUTw7",
+"JJs5mhe9IA","ydG8UJKWYR","Uvlv47fKYU","dQ5860BmCy","xciqp48cHL","XyPZNdpe1v","BGaQYQWxoT","pWiOsyluBx","tlILtW7cTs","mz8gxfFDrJ",
+"CxVEfjtn0X","TXQ0ZBCxeC","No0QbAIYUu","hSSvQRmDcr","AgJHQo8Uyd","aez9yCqqaD","W7cTsCp3mZ","ZuDtDjiVBP","ru4UGaL6AJ","tl72WBpYhV",
+"gtCA5RBhp0","1LB1L7ku1p","faHirS77LH","RpBQmVIlwP","VBjhzCdyBV","0PktIOz8yZ","jfREuRxrsm","uLtKsn8pJ9","45cIHYw2oU","hUTw75ZaEz",
+"aDGtSFjHXR","3weIF7lUXZ","oVQp6lm0pD","5Drn02DREs","BGaQYTCgPp","y94nwRkQke","hYBCKY1mC0","Yh1hF4dEz6","B3qemGXdoH","uAWypcQOnv",
+"gf8rICxVEf","S77LHSs0Zu","CIShGKASQ8","GXdoHuPX7G","jSjS3m4bxU","OUYuF6q6L9","9GXkXYf2Ec","oGu6xCdyBV","yEfy9MaJQs","RzaZAK20wK",
+"24ARFgIYvE","0h1b1Cp3mZ","OHaBzKsjRK","wDajXEOE1o","o8Uyd3weIF","Nxx9VIKxdL","ZUnqttlILt","lkMUAWaim6","GWqqXYOfrY","s7MxkRmDcr",
+"D6rBycQOnv","WPmlxlj07Q","zY1GYsoy9t","uQIcz0MR5X","cShY28FmFH","M6qcGtjQxs","uvf7AQworu","zbIYYjfREu","5ZaEz1j5L8","euZA5hSSvQ",
+"zqH0Wxciqp","uupzkVLTy6","MGlTFt98iW","djsrv6AFT0","8xEKzAXpwE","lpF6WiB08l","7X3uypvgjS","hE1QlEOE1o","3weIFCfgr3","taOXKXflUq",
+"WaWsvP6bcg","M6qcGVprf2","CK5W7Yf2Ec","n8pJ9uPX7G","6AFT0DLhzM","GWqqXtuDyS","lm0pD29QAz","d7vjML7cGc","dhSuHI7p2a","QChxsyvOMI",
+"No0Qb45cIH","W3VFHyluBx","pAhR1jfREu","EoToPCp3mZ","1v5hHJKWYR","FFDuivLsmS","IRh48JIqXi","QClRLNOHsz","zFgtBuTacx","pvgjSXyPZN",
+"pWiOsh1zcH","K4GS8faHir","1v5hHpmeCd","DQimp6q6L9","FVMxoLDk6f","piJSk0Kyfs","i7WMQCxVEf","azIWpaez9y","JIqXiVjCZq","cL0aEjeskS",
+"yToGWqaofN","I7p2aW7cTs","7ku1pPOUYS","uupzkfcwDa","UmaEvzz4ZU","jSjS3fmIK1","lsQGonFqik","hSSvQfLNg8","uupzkDLhzM","AXpwElpF6W",
+"soy9tQChxs","zHF1qv2eC3","ZhwG1D6rBy","oGu6xFnPFB","iB08llm0pD","v8yFN5Mg9r","oVQp629QAz","FNYIMFxX9q","s7MxkAkKTk","tjQxshE1Ql",
+"HzZT8b29RJ","zz4ZUMezSW","hUTw7gIYvE","L7cGcMmKGJ","uvf7A0h1b1","Yf2EcRmDcr","s93Mla00b5","tuDySuAWyp","cmXIXKr8ys","ksJbyuAWyp",
+"CxVEfatef2","QChxsgtCA5","lH1ktdhSuH","cShY2Pb1pa","nFqikFPfSE","8RCUAhe9IA","s93MlCp3mZ","1LB1L0YAGH","FGzgpAOgEe","64s8NsuY4x",
+"zFgtBU3yw5","Q6hMCb29RJ","6AFT0b29RJ","IKxdLTwano","uAWypokgRi","yvOMI7X3uy","HP433jS1aj","4QMc9nlaBy","hi5X7L7cGc","yvOMIAkKTk",
+"uLtKssqVrf","sx5GlkB5nP","9y4lwXflUq","RACujSmGzv","4W0TlBpYhV","o8UydzHF1q","RsQUqa00b5","580YDhSSvQ","FcWrWbgJAz","5VZjSprNT6",
+"qUJMdvkCHH","Dz1R3brhlQ","fFDrJlXFOB","CIShGQClRL","fFDrJokgRi","NcICAgIYvE","5nmWvkB5nP","5ZaEzSWfou","LewvMlj07Q","gIYvEXyPZN",
+"VBjhzJ2mQi","F6PT2cShY2","fcJOySs0Zu","qQxHPSbRYy","QbxXchi5X7","64s8N1j5L8","ECMvUuN6r3","J2mQi0h1b1","8RCUA4QMc9","SWfouJ2mQi",
+"Yh1hFFLsph","gjUTutuDyS","AmdQdvkCHH","55rfB5drc6","MojnPWaWsv","pAhR1fcwDa","55rfB1j5L8","BCxeCjSjS3","MezSWdmoS7","WaWsv0MR5X",
+"8RCUA7fKYU","OxWIHCxVEf","tlILtYjB9t","MGlTFbZLvS","2DREsv2eC3","WDVWJy94nw","ksJby9rlg9","07n1c64s8N","WmadAhYBCK","Nxx9VCNHmv",
+"QYxC0FGzgp","tlILt7X3uy","prNT6AIYUu","3weIFOUqFM","0KyfsBCxeC","pT8wulCMxy","0MR5Xa00b5","3weIF07n1c","580YDAmdQd","yvOMIazIWp",
+"16lHcAgJHQ","M6qcGZ4I1v","GWqqXFNYIM","xReec48cHL","xReec64s8N","14FLRjiVBP","FPfSEB3qem","FcWrW16lHc","OxWIHxXTI4","YjB9tRBhp0",
+"lH1ktaL6AJ","v2eC3POUYS","vkCHHjfREu","2Nslmrz7Ut","LbRTHIRh48","ZUnqto8Uyd","WaWsvguMb8","tjQxsfFDrJ","1v5hHuoStw","Qworuk85Ae",
+"WPmlxY1mC0","lViBvQssNC","1j5L8oGu6x","uPX7GvkCHH","45cIHGSQwj","d85a97X3uy","m4bxU07n1c","fFDrJX6Pin","CNHmvprNT6","AOgEeSWfou",
+"M3zXLjSjS3","k85AeU3yw5","AIYUuFnPFB","atef2t98iW","IBe8k64s8N","iwzGkFGzgp","9GXkXcmXIX","Gv3Fqix74r","1LB1LzqH0W","iwzGkxReec",
+"uTacxmX2GE","ogLgcTXQ0Z","MGlTFpiJSk","MmsIoMK07Y","lj07QXflUq","0h1b1Twano","EdBKczbIYY","7fsYMvOqCE","QClRLuZPqg","oVQp6Cfgr3",
+"hi5X7Z4I1v","QssNCYOfrY","L7cGcni2v1","EOE1olkMUA","JKWYRydG8U","lsQGolpF6W","qUJMdS2Dfu","QYxC0Uvlv4","xXTI42Yz7E","aL6AJuoStw",
+"QYxC01v5hH","IRh48VLTy6","i3pyd7lUXZ","a00b5Gv3Fq","zY1GYIKxdL","580YDCNHmv","iB08ls93Ml","nnP8ooVQp6","ThjNnkZANm","SWfouazIWp",
+"ogLgc5nmWv","rKDLJBbwgA","Ta8f6YjB9t","pvgjSbgJAz","prNT6FPfSE","fcJOyv8yFN","0BmCyd85a9","WPmlxS77LH","8cVD3VjCZq","NAFuwZhwG1",
+"IBe8kfcJOy","DcpWB9XyT9","QYxC0t98iW","X6PinAIYUu","KZamHcmXIX","In3NSuLtKs","aDGtSpmeCd","EoToPzY1GY","h1zcHuLtKs","Twano7fKYU",
+"JkzUnjSjS3","okgRiqQxHP","GrDg7Zv7z0","Oz8yZBbwgA","okgRiyofH3","QworuyToGW","nFqikMGlTF","uAWyp7fsYM","1v5hH8U2nU","SbRYyQYxC0",
+"yvOMIUmaEv","yEfy9NcICA","SbRYyOUqFM","uPX7GoQ87r","ZJTXHtAOsr","vLsmSCdyBV","No0QbMaJQs","QYxC0RsQUq","lViBvjtn0X","FwEJzsx5Gl",
+"EdBKc2Nslm","cShY2VNCPd","0Kyfs2DREs","D6rBy7hyVv","faHirJIqXi","9y4lwSWfou","zqH0WWaim6","9GXkX2Nslm","lH1ktlH1kt","guMb8Ta8f6",
+"GSQwjBCxeC","580YD9y4lw","kZANmFFDui","FhtglMezSW","QssNCVLTy6","KASQ8HfyNQ","ECMvUt98iW","ru4UGUvlv4","t98iWdpe1v","9iGoTMojnP",
+"fLNg8QWxoT","dpe1vUl4a1","MmKGJoVQp6","580YDY1mC0","RmDcrI7p2a","fcJOyhE1Ql","fqypyrKDLJ","Z4I1vOUYuF","RmDcr7X3uy","pv0i7GSQwj",
+"ksJbyuZPqg","1j5L8JRJQB","DLhzM5Namm","e6e4zECMvU","BGaQYXflUq","2Yz7EiKqhr","EOE1orhl0J","fcwDaVNCPd","zbIYYguMb8","8cVD3h1zcH",
+"BpYhVb29RJ","tAOsriqv4k","k85AeJ2mQi","ZzJHW8U2nU","JkzUngdQsS","K4GS8aL6AJ","OxWIHF6PT2","07n1cd7vjM","pAhR129QAz","EdBKc8xEKz",
+"CNHmvQworu","VjCZq2ZHdk","hSSvQ1j5L8","FGzgpFcWrW","M3zXLMmKGJ","Ss0ZuKZamH","CK5W7hYBCK","gf8rI0Wr5y","d7vjMQClRL","Oz8yZ7ku1p",
+"0MR5XgIYvE","b29RJFVMxo","rhl0JSWfou","7lUXZQClRL","VIlwPpv0i7","dpe1vcQOnv","hE1QlfmIK1","GXdoHt59lR","HlUbFcmXIX","BbwgAJXljW",
+"jfREupAhR1","pmeCdpWiOs","kB5nPVerEA","Dz1R3uvf7A","8cVD3fmIK1","iB08lQ6hMC","lH1ktqUJMd","o8UydhUTw7","i7WMQi3pyd","suY4xnnP8o",
+"RBhp0jeskS","pWiOseuZA5","qUJMdCdyBV","o8Uyduvf7A","aez9yOz8yZ","MojnP7hyVv","fLNg8xXTI4","FcWrWRxrsm","iwzGk2DREs","fcwDakB5nP",
+"cmXIXkB5nP","zz4ZUCqqaD","XyPZN0PktI","cShY2faHir","tlILtBpYhV","pmeCdW3VFH","n1pmOnFqik","AXpwEhYBCK","y94nwHfyNQ","gIYvEksJby",
+"HlUbFS2Dfu","yluBxOHaBz","2DREs9GXkX","IKxdLh1zcH","bgJAzlViBv","FVMxoLbRTH","nnP8oFhtgl","7fKYUlj07Q","fqypyjS1aj","CxVEfjSjS3",
+"uLtKsUlU3M","8FmFHpWiOs","ZJTXHjS1aj","Yh1hFqQxHP","AgJHQokgRi","lXFOBuupzk","jS1aj0ao3l","0Wr5ypAhR1","RBhp0ru4UG","XflUqokgRi",
+"n1pmOD6rBy","HzZT8y94nw","fLNg8EoToP","CqqaDAkKTk","Uvlv4OxWIH","zHF1q4W0Tl","lsQGo8RCUA","iB08l9eoRc","G1RhSS77LH","lsQGoOUYuF",
+"BbwgAcShY2","3weIFi7WMQ","yofH3vOqCE","n8pJ9AXpwE","KASQ8EdBKc","MmsIoMm8si","uJScXqUJMd","48cHL55rfB","HRxd8FGzgp","uZPqgI7p2a",
+"mz8gxatef2","2DREsbgJAz","guMb848cHL","IBe8kJIqXi","i3pyd9iGoT","FPfSECxVEf","kZANmMezSW","Mkgy8Y1mC0","sx5GlF6PT2","jfREuo8Uyd",
+"s4786ZzJHW","cShY2k85Ae","fLNg85Drn0","BpYhV618Di","n8pJ9AkKTk","zHF1qJkzUn","pmeCdRmDcr","mz8gxlsQGo","jiVBPKASQ8","VNCPdulk41",
+"lXFOBFcWrW","XyPZNo8Uyd","gtCA5K4GS8","L7cGc8FmFH","y94nwEoToP","GrDg79GXkX","Mm8siy94nw","KASQ8NOHsz","AOgEeVprf2","MmsIoLewvM",
+"ECMvUFGzgp","1v5hHGv3Fq","k85AeIBe8k","K20wKpAhR1","jSjS3guMb8","L7cGchi5X7","KZamHfqypy","LewvMStlDJ","G1RhS9iGoT","azIWp9y4lw",
+"d7vjMaez9y","gjUTut59lR","0MR5XyEfy9","ZuDtDC2Irc","5Drn05IhmG","tl72W7Ow5C","O3iyQwDajX","WPmlx2hEEU","djsrvQnJ1S","dhSuHqUJMd",
+"iKqhrQssNC","rhl0JXflUq","fqypyprNT6","azIWp24ARF","lXFOB7lUXZ","iqv4kAgJHQ","7ku1pk85Ae","AXpwEqUJMd","gjUTu14FLR","zHF1qlsQGo",
+"fLNg8yEfy9","i3pydt98iW","zz4ZUEOE1o","zbIYYNhXdu","OHaBzgf8rI","vLsmSXyPZN","7X3uypAhR1","n1pmOChuy3","atef2D6rBy","jeskSdjsrv",
+"zY1GYQworu","QssNCuQIcz","RzaZAIBe8k","azIWpiB08l","MGlTF9eoRc","taOXKQYxC0","5drc624ARF","YjB9tv2eC3","blLA9W3VFH","MmsIotAOsr",
+"pmeCdaFFss","8xEKzjiVBP","EoToPZJTXH","AmdQdB3qem","gdQsSAIYUu","Chuy37ku1p","euZA5F6PT2","m4bxUsoy9t","618DiaDGtS","FnPFBGv3Fq",
+"KASQ8soy9t","ECMvUXyPZN","Ss0ZuTXQ0Z","hE1QlRmDcr","1v5hHtl72W","Y1mC0CIShG","MmsIovLsmS","ReKEWdQ586","No0Qb1v5hH","jiVBPVBjhz",
+"DLhzMQ6Lix","WaWsvhi5X7","OUYuFGv3Fq","MmsIopiJSk","ru4UGbgJAz","zFgtBG1RhS","D6rBy5IhmG","WaWsvtvdkD","7fsYMaDGtS","PYBf4FVMxo",
+"i7WMQLbRTH","uupzkRmDcr","3otm68TxD7","NcICAkB5nP","FVMxoSjskQ","IKxdLFnPFB","07n1cBGaQY","pvgjSgIYvE","JXljWKASQ8","IjTwPKr8ys",
+"16lHcxciqp","zFgtB4QMc9","gjUTuVLTy6","sx5Gl07n1c","EOE1oOz8yZ","rhl0JNcICA","ydG8UZuDtD","JkzUnQWxoT","7Ow5ClCMxy","fqypyokgRi",
+"Mkgy8GWqqX","uZPqgSjskQ","J2mQicmXIX","ZUnqtOz8yZ","5IhmGFGzgp","yToGW5drc6","uvf7A3weIF","Oz8yZiqv4k","C2IrcpWiOs","GrDg7iwzGk",
+"ZJTXH4QMc9","Gv3FqOUYuF","ydG8UMojnP","9rlg9a00b5","Vprf2xciqp","8TxD7FGzgp","zHF1qAOgEe","euZA5cmXIX","Ul4a1MojnP","oGu6xxXTI4",
+"zHF1q8hJdt","pT8wuEdBKc","cQOnv48cHL","uAWypjtn0X","h1zcHWaim6","0Wr5yUvlv4","0MR5XQClRL","hE1Qlv2eC3","suY4xcQOnv","F6PT2pvgjS",
+"t98iWIjTwP","IjTwPGv3Fq","FNYIMWMiS3","JkzUnoGu6x","i3pydNcICA","WMiS3uN6r3","s7MxktvdkD","EOE1opmeCd","BbwgAFxX9q","s4786BpYhV",
+"2DREsPOUYS","QbxXcK20wK","EOE1oPYBf4","ogLgcKsjRK","MK07YTwano","FxX9qjzUqR","580YDzz4ZU","e6e4zs4786","DQimpQWxoT","580YD5Namm",
+"CqqaDQChxs","0ao3lQYxC0","k85Aelm0pD","tAOsrDz1R3","Ss0ZuGrDg7","jiVBP580YD","K20wKdQ586","lsQGotlILt","lCMxyHzZT8","aFFssd7vjM",
+"xReec2Nslm","sqVrfUvlv4","JXljWStlDJ","580YDVerEA","l83UdMK07Y","gf8rIaFFss","euZA52ZHdk","v2eC3WMiS3","RsQUqYf2Ec","LDk6ffcwDa",
+"ZhwG1MezSW","W3VFHs93Ml","4QMc9d85a9","WreyPmz8gx","ThjNn9eoRc","FFDuiydG8U","QWxoTmX2GE","1v5hHECMvU","QYxC0jtn0X","5ZaEz3otm6",
+"IRh48RkQke","FnPFB0PktI","QnJ1SG1RhS","mz8gxcL0aE","4QMc9FVMxo","BbwgALDk6f","Yh1hFjfREu","euZA5XflUq","JkzUngf8rI","pFrrluJScX",
+"48cHLprNT6","5Drn01v5hH","bgJAzZUnqt","MaJQsCxVEf","CdyBVlViBv","e6e4zNAFuw","tAOsrCNHmv","QssNCMaJQs","VerEANAFuw","5Drn0hi5X7",
+"lweGy0ao3l","uLtKs64s8N","MezSWzz4ZU","WaWsvFwEJz","1LB1LTXQ0Z","Y1mC08RCUA","TXQ0ZtlILt","cmXIXuLtKs","yluBxVIlwP","9iGoTLewvM",
+"Dz1R345cIH","AXpwEQ6hMC","ECMvUtAOsr","jSjS3AIYUu","gjUTuAmdQd","WreyPMojnP","CdyBVGWqqX","Nxx9VWDVWJ","S2Dfu8RCUA","2DREsU3yw5",
+"WreyPDQimp","dpe1v7hyVv","he9IAoVQp6","55rfBbgJAz","Uvlv4ZzJHW","iB08lnnP8o","DG4sTs7Mxk","gdQsSUvlv4","MmKGJRmDcr","uLtKsYOfrY",
+"tjQxs48cHL","fqypyyluBx","GWqqXKr8ys","9XyT9suY4x","9rlg9VNCPd","aDGtS9GXkX","7Ow5Cs4786","RkQkeECMvU","v1HlnjiVBP","HP433b29RJ",
+"BGaQYlj07Q","pv0i77X3uy","gtCA5MGlTF","AgJHQJRJQB","HfyNQQbxXc","P6bcgVjCZq","FwEJzfFDrJ","euZA5hUTw7","MmsIo7Ow5C","rKDLJOz8yZ",
+"9rlg9uTacx","soy9tzHF1q","uTacxfFDrJ","NcICAfcwDa","jzUqRiwzGk","ZUnqtYh1hF","QWxoTnFqik","IRh48lsQGo","kB5nPvLsmS","qQxHP6AFT0",
+"RACujXflUq","6q6L9PYBf4","jfREuU3yw5","AmdQdtAOsr","suY4xfFDrJ","WreyPpFrrl","Cfgr30YAGH","2Nslm8U2nU","WreyP8xEKz","UmaEvD6rBy",
+"gf8rIMaJQs","MK07YAkKTk","okgRifcJOy","9rlg9piJSk","qaofNiKqhr","9iGoTPb1pa","t98iWXflUq","nlaByFwEJz","sqVrf4W0Tl","lsQGoblLA9",
+"MmKGJjeskS","14FLRY1mC0","HlUbFMmsIo","e6e4zJXljW","FPfSEtAOsr","fqypyMmsIo","kB5nPUvlv4","pvgjSNxx9V","BGaQYReKEW","SWfoutl72W",
+"RpBQmoVQp6","zqH0WogLgc","lpF6W7lUXZ","45cIH2TRI7","ulk41fcJOy","djsrvM6qcG","FNYIMhe9IA","sx5GlQChxs","IBe8kBCxeC","n8pJ9ksJby",
+"HfyNQMmKGJ","t59lR7X3uy","6q6L9KZamH","wDajXydG8U","lViBviB08l","EOE1oZuDtD","dhSuHJIqXi","m4bxUYjB9t","uZPqgQssNC","Ta8f6jeskS",
+"oGu6xlsQGo","618Did85a9","Vprf2P6bcg","TwanoyofH3","piJSkGSQwj","1LB1LuJScX","ogLgcJJs5m","48cHLBGaQY","EdBKcdjsrv","a00b5tvdkD",
+"pWiOsHRxd8","zY1GYX6Pin","Ss0ZuwiHrZ","m4bxUhe9IA","VBjhz5iGN5","lkMUADz1R3","zQt6QksJby","KASQ8CIShG","GWqqXQworu","Z4I1vRsQUq",
+"MmKGJ0ao3l","IKxdLHlUbF","dpe1v580YD","9XyT9ZJTXH","pWiOsMmKGJ","zQt6QtuDyS","cQOnvFhtgl","BpYhVIKxdL","Ta8f6MmsIo","jSjS3POUYS",
+"BCxeCFLsph","K20wKuupzk","vOqCEdpe1v","yofH3U3yw5","Vprf2fLNg8","h1zcHRsQUq","0BmCyDcpWB","NcICAHfyNQ","I7p2a0h1b1","F6PT2SmGzv",
+"5NammokgRi","fLNg8RBhp0","5drc6WDVWJ","618Di8xEKz","YjB9tyEfy9","GWqqXhi5X7","24ARFKr8ys","euZA5ThjNn","lH1ktJXljW","x3LDe7fsYM",
+"JIqXiCK5W7","SbRYyX6Pin","pAhR16AFT0","hSSvQYOfrY","jtn0XNcICA","HzZT8faHir","qQxHPtAOsr","5iGN5tuDyS","ix74rzz4ZU","AkKTkhi5X7",
+"sx5GlUmaEv","8xEKzFGzgp","OHaBzcShY2","QnJ1SIBe8k","zHF1quN6r3","8xEKzlsQGo","pWiOsmX2GE","RkQkeoQ87r","W7cTsAIYUu","Yw2oUh1zcH",
+"FnPFB0Wr5y","Ta8f6oQ87r","BCxeCtl72W","0Wr5y2ZHdk","fFDrJMezSW","lsQGoEOE1o","BbwgAZv7z0","0Kyfslj07Q","EoToPgf8rI","YOfrYlj07Q",
+"DQimpJKWYR","tAOsrfcJOy","v2eC30YAGH","RxrsmBFkb8","AgJHQ5IhmG","KsjRKUlU3M","7hyVvuTacx","B3qemoGu6x","FNYIM7lUXZ","h1zcHguMb8",
+"pFrrluZPqg","v8yFNzbIYY","YOfrYkZANm","gIYvEZJTXH","HlUbFatef2","2Yz7EsuY4x","jfREusx5Gl","ciuWzKsjRK","i7WMQciuWz","K4GS8uLtKs",
+"mX2GEwDajX","0YAGHSjskQ","pv0i75Namm","5drc6Ss0Zu","IjTwPNOHsz","lweGyIn3NS","7hyVv5iGN5","OHaBzGWqqX","ECMvUdhSuH","HfyNQ55rfB",
+"aFFssprNT6","VjCZqGWqqX","hUTw7Y1mC0","NcICAPYBf4","UlU3MhYBCK","5Namm14FLR","x3LDefLNg8","zqH0W1LB1L","mz8gxprNT6","CqqaDReKEW",
+"KZamHcQOnv","zmLYDtjQxs","SmGzvgjUTu","K4GS8VIlwP","D6rByfaHir","OUYuFZ4I1v","9y4lw8hJdt","8FmFHHRxd8","WreyPatef2","fFDrJECMvU",
+"ydG8UokgRi","t98iWQbxXc","WPmlxU3yw5","e6e4zVIlwP","CxVEfogLgc","Dz1R3t98iW","0BmCyvkCHH","4W0TlMmsIo","HzZT8n8pJ9","vkCHHtAOsr",
+"FwEJz5ZaEz","XflUqfmIK1","gtCA50YAGH","0h1b12Nslm","lCMxyfmIK1","64s8N64s8N","d7vjMt98iW","ThjNnn1pmO","4dEz6lH1kt","FPfSECNHmv",
+"S2Dfu1j5L8","FhtglHlUbF","t98iW5Drn0","bZLvS5IhmG","b29RJMmKGJ","EdBKcfqypy","MK07YWreyP","bZLvSlCMxy","07n1cBCxeC","14FLRcQOnv",
+"NOHszReKEW","NhXduru4UG","h1zcHEOE1o","iKqhr4W0Tl","7hyVvW3VFH","RzaZARACuj","0h1b1zz4ZU","azIWplkMUA","iB08lNhXdu","Uvlv4XflUq",
+"OUqFMIjTwP","atef2uTacx","dpe1vfLNg8","zY1GYpv0i7","LbRTH0Kyfs","FhtglguMb8","TXQ0Z3otm6","7hyVvNAFuw","t98iW48cHL","blLA9ru4UG",
+"ThjNnQ6hMC","tuDySFVMxo","Z4I1vvOqCE","piJSk3otm6","QnJ1SM3zXL","sqVrfFnPFB","PYBf4sqVrf","8xEKzHfyNQ","d7vjMni2v1","wiHrZWreyP",
+"YOfrYpFrrl","Mkgy8FVMxo","JRJQBMezSW","BGaQYi3pyd","xXTI48RCUA","IKxdLCp3mZ","zY1GYW7cTs","uLtKsuQIcz","brhlQuZPqg","7fKYUGWqqX",
+"t59lRjiVBP","618DiRkQke","TCgPpKr8ys","tlILt0PktI","Kr8ysru4UG","pvgjSRBhp0","WDVWJ5VZjS","Yh1hFBCxeC","9GXkXmX2GE","qUJMdkZANm",
+"B3qemECMvU","wiHrZsoy9t","GrDg7lXFOB","v1HlntAOsr","C2Irc64s8N","5Namm8hJdt","WDVWJkB5nP","uoStwazIWp","IBe8kdhSuH","EOE1oQWxoT",
+"xReecyofH3","AOgEecL0aE","tAOsrsuY4x","wiHrZfcwDa","zFgtB9rlg9","OHaBz3otm6","s93Ml5iGN5","FhtglTXQ0Z","v2eC3JXljW","iwzGkThjNn",
+"W3VFHCIShG","No0Qb0BmCy","5Drn00Kyfs","NAFuwmX2GE","vkCHHBFkb8","yofH30h1b1","xXTI445cIH","Pb1paLewvM","OUqFMs7Mxk","SbRYynFqik",
+"Yf2EcJRJQB","9XyT9uTacx","9y4lwdQ586","Ss0ZuBGaQY","sqVrf4QMc9","zmLYDCp3mZ","WmadAs4786","Ta8f6DQimp","8hJdt5iGN5","dmoS74dEz6",
+"aL6AJ9GXkX","1j5L8ThjNn","Zv7z0CqqaD","pv0i7uQIcz","pvgjSd85a9","Zv7z0ZhwG1","sx5GlNo0Qb","gIYvEWmadA","S2DfuoGu6x","AkKTkOUYuF",
+"iwzGkPOUYS","4W0TlhYBCK","TwanoMezSW","v8yFNuLtKs","yToGWfaHir","5iGN55Drn0","uupzkMaJQs","lViBvAOgEe","i3pyd2hEEU","AOgEeDQimp",
+"yEfy9gdQsS","GrDg7Fhtgl","Y1mC0OxWIH","7X3uyzmLYD","1LB1LdQ586","8TxD7lCMxy","Q6LixEdBKc","55rfBjS1aj","Y1mC0DLhzM","5NammFGzgp",
+"Uvlv4ogLgc","BpYhVtuDyS","OUYuFtAOsr","OUYuFkZANm","ulk41FNYIM","B3qemS2Dfu","iKqhrsx5Gl","lkMUAKsjRK","4W0TlJRJQB","hSSvQ48cHL",
+"KsjRK8cVD3","QnJ1SOHaBz","GXdoH5IhmG","b29RJuN6r3","oVQp6qUJMd","SbRYyYw2oU","JJs5m8U2nU","n8pJ9YOfrY","RzaZAfmIK1","16lHcksJby",
+"pT8wus7Mxk","suY4xRACuj","OUqFMVjCZq","Z4I1vFGzgp","RBhp0lweGy","NAFuwsuY4x","zz4ZUQssNC","tl72Wv8yFN","wiHrZMaJQs","tuDySCp3mZ",
+"XyPZNd7vjM","cL0aEIRh48","IjTwPni2v1","AgJHQNAFuw","1v5hH9XyT9","lCMxyJKWYR","b29RJIKxdL","Cp3mZCp3mZ","Mm8siuvf7A","gjUTunnP8o",
+"Waim60h1b1","EdBKcJIqXi","oGu6xkZANm","9GXkX1v5hH","D6rBytjQxs","JJs5muZPqg","zqH0WFLsph","45cIHM3zXL","Vprf2zFgtB","5ZaEzK4GS8",
+"zz4ZUiwzGk","24ARF45cIH","s93MlzbIYY","StlDJsuY4x","brhlQ0YAGH","FwEJz0h1b1","uLtKsZJTXH","S2DfuLDk6f","djsrv14FLR","okgRi9eoRc",
+"1j5L8fcwDa","zmLYDGrDg7","KZamH5Drn0","W7cTsFNYIM","zFgtB7X3uy","rKDLJRmDcr","VIlwPl83Ud","hSSvQsuY4x","rhl0JMm8si","VIlwPGSQwj",
+"he9IAuTacx","h1zcHZ4I1v","fcwDalsQGo","M3zXL6AFT0","kB5nPCK5W7","nFqik1v5hH","5iGN5MmsIo","2hEEURpBQm","WPmlxyvOMI","fqypyogLgc",
+"8hJdthYBCK","JRJQB4QMc9","In3NSOHaBz","zmLYD29QAz","Ss0ZuzY1GY","GrDg7IKxdL","LbRTHsoy9t","sqVrfRmDcr","azIWpAXpwE","QChxslsQGo",
+"zHF1qOUqFM","JKWYRQChxs","WaWsvOUqFM","jiVBPx3LDe","jtn0XiwzGk","fcJOy1LB1L","uvf7AtuDyS","uLtKsd85a9","ydG8UReKEW","vLsmS4W0Tl",
+"Q6hMCKZamH","vkCHHjeskS","DLhzMBGaQY","ReKEWjiVBP","NhXduyluBx","oVQp6CqqaD","RBhp06q6L9","AgJHQ4dEz6","piJSkQnJ1S","RkQkefmIK1",
+"Q6hMCQbxXc","FNYIM5Namm","FnPFBqQxHP","lH1ktG1RhS","ThjNn8FmFH","s4786RzaZA","NhXduuZPqg","Q6hMCk85Ae","CdyBVLDk6f","5Drn0QssNC",
+"vOqCEHRxd8","MezSW9rlg9","Kr8ysFxX9q","bgJAzprNT6","hYBCKzz4ZU","1LB1LpvgjS","uJScXe6e4z","QworuEoToP","gIYvES2Dfu","7fsYMM6qcG",
+"wDajXd7vjM","8xEKzsqVrf","ni2v1uJScX","v1HlnO3iyQ","48cHLS77LH","Mkgy8BCxeC","0YAGHXyPZN","5NammVIlwP","Nxx9V9XyT9","pWiOs7fsYM",
+"iwzGkgtCA5","8RCUAFnPFB","LewvMMK07Y","8TxD76q6L9","fqypyyofH3","oGu6xpmeCd","In3NS24ARF","LDk6fWPmlx","aez9yKr8ys","MmKGJM6qcG",
+"zbIYYksJby","fcwDaPYBf4","U3yw5tlILt","Ss0Zu6AFT0","FwEJzJkzUn","7X3uyuLtKs","lpF6W24ARF","JJs5myEfy9","pFrrl0h1b1","ZzJHWD6rBy",
+"d85a9lkMUA","QworuPb1pa","TCgPpTXQ0Z","9XyT91LB1L","uQIczPOUYS","Yw2oUAOgEe","zFgtBHlUbF","FjHXRVIlwP","pWiOsBCxeC","Zv7z048cHL",
+"WreyPpAhR1","dmoS7xReec","8cVD3d85a9","GSQwjwiHrZ","atef2pWiOs","WMiS3CK5W7","Q6hMCSWfou","v8yFNbgJAz","Mkgy8tAOsr","AOgEe8RCUA",
+"gf8rIXflUq","aDGtSDG4sT","suY4xM3zXL","HzZT8ZUnqt","Ta8f6MGlTF","fFDrJIKxdL","Oz8yZBCxeC","pAhR1L7cGc","CNHmviB08l","4W0TltvdkD",
+"oVQp6CxVEf","WPmlxuQIcz","NcICA2DREs","G1RhSZzJHW","aez9yZ4I1v","lkMUA45cIH","CK5W7uLtKs","8cVD3tuDyS","x3LDe0Kyfs","NOHsz2ZHdk",
+"2DREsQnJ1S","zHF1qYjB9t","WMiS3POUYS","pAhR1OHaBz","xciqpguMb8","ReKEW2ZHdk","7hyVvhi5X7","uvf7AcShY2","atef2Cfgr3","2ZHdkUmaEv",
+"Yh1hF45cIH","LewvMiB08l","14FLRni2v1","Nxx9VG1RhS","o8Uyd618Di","Q6hMCMmsIo","VNCPdZUnqt","AXpwEFLsph","0BmCypAhR1","wiHrZlweGy",
+"D6rByYjB9t","YOfrYprNT6","tl72WTXQ0Z","lViBvG1RhS","yEfy9XyPZN","RmDcruLtKs","lCMxyZzJHW","sx5GlFhtgl","Vprf2Mkgy8","5NammVprf2",
+"WMiS3vOqCE","blLA9lm0pD","Zv7z0WDVWJ","NcICAaez9y","gdQsSi3pyd","y94nwDQimp","ZJTXHfLNg8","29QAz6AFT0","djsrv4dEz6","GrDg7QWxoT",
+"blLA9yvOMI","J2mQiVBjhz","iKqhrix74r","Chuy3ix74r","RBhp0hSSvQ","618DiUlU3M","C2IrcNOHsz","vOqCE24ARF","1j5L81v5hH","pv0i7s93Ml",
+"5nmWvB3qem","HRxd8Mm8si","qQxHPksJby","7ku1pdpe1v","DcpWBFLsph","oGu6xpWiOs","JkzUnxciqp","taOXKyToGW","0YAGH0MR5X","yToGWNxx9V",
+"M3zXLnFqik","bZLvSuPX7G","zz4ZU7lUXZ","WPmlxOUqFM","7Ow5CDQimp","64s8N5iGN5","ix74rRACuj","WaWsvv8yFN","OUYuFmz8gx","gtCA5PYBf4",
+"rz7UtlkMUA","JRJQBIKxdL","0Wr5y8TxD7","Kr8ystAOsr","LDk6f0BmCy","VBjhzVLTy6","mz8gxjtn0X","bgJAzfaHir","48cHLuAWyp","fcJOyMezSW",
+"lpF6WtlILt","8xEKzatef2","W7cTsDQimp","QnJ1SWmadA","FVMxonnP8o","uLtKsKZamH","ciuWzksJby","SbRYyyToGW","sqVrfzHF1q","zmLYDt98iW",
+"45cIHzbIYY","uvf7AWmadA","jfREuM6qcG","5IhmGfcwDa","JIqXihE1Ql","QworucQOnv","KASQ8OUYuF","okgRiBbwgA","Ul4a1fmIK1","jzUqRAOgEe",
+"v2eC3J2mQi","IKxdLSbRYy","618DipFrrl","AIYUuWaim6","dhSuHvkCHH","lXFOBdjsrv","CIShGvLsmS","TXQ0ZyluBx","DQimpiB08l","Gv3FqaFFss",
+"wiHrZv2eC3","8FmFHJJs5m","JIqXiQworu","oVQp6mz8gx","gf8rIo8Uyd","uN6r32Yz7E","t98iWFjHXR","Uvlv4dhSuH","pvgjSlm0pD","1j5L8djsrv",
+"rKDLJxciqp","KASQ85drc6","ogLgcM6qcG","iwzGk0h1b1","4dEz6okgRi","zQt6QEdBKc","sx5Gl8FmFH","QWxoTOz8yZ","tlILt8cVD3","LbRTHfLNg8",
+"XflUqP6bcg","x3LDeAgJHQ","O3iyQXflUq","iKqhrpmeCd","rKDLJWMiS3","CK5W7rz7Ut","uJScXZzJHW","pWiOsGSQwj","x3LDezFgtB","QYxC0zbIYY",
+"8xEKzfLNg8","F6PT2MojnP","GWqqXAkKTk","7Ow5CmX2GE","dpe1vdjsrv","0PktIEOE1o","FNYIMNhXdu","s4786XyPZN","8hJdt7fKYU","DQimp24ARF",
+"POUYSGrDg7","POUYSzHF1q","prNT6k85Ae","lViBvWmadA","9iGoTFLsph","RACujpiJSk","v2eC31LB1L","yluBxQ6Lix","zFgtBS77LH","16lHcK20wK",
+"CIShGFLsph","oGu6xU3yw5","lCMxyfFDrJ","fmIK1PYBf4","Fhtgl7fsYM","TXQ0Zlm0pD","Rxrsm5nmWv","faHir4dEz6","P6bcgMaJQs","azIWp7hyVv",
+"kZANmjS1aj","BFkb8KZamH","lj07QAgJHQ","hE1QlYOfrY","RmDcr5Mg9r","7ku1phE1Ql","Y1mC0s4786","yofH3hUTw7","0BmCyhYBCK","kZANmFjHXR",
+"hi5X7Ta8f6","Dz1R3WmadA","s93MlThjNn","DcpWBSbRYy","cQOnv9iGoT","8RCUAZuDtD","JIqXiGSQwj","9eoRcgjUTu","qUJMdSbRYy","07n1c0ao3l",
+"fLNg88hJdt","dhSuH1LB1L","3weIF7fsYM","Nxx9VCqqaD","DG4sTVNCPd","tl72WoGu6x","YOfrYQssNC","OHaBz9y4lw","5Mg9rBGaQY","blLA9jiVBP",
+"5IhmGbrhlQ","Ul4a1atef2","cL0aEKZamH","5VZjSOUqFM","uupzkOUqFM","yEfy90ao3l","IjTwPStlDJ","MezSWZhwG1","BFkb8ogLgc","FGzgpfcJOy",
+"No0Qbs7Mxk","L7cGcS2Dfu","mz8gxOUqFM","KZamHIjTwP","uN6r3cmXIX","NAFuwcL0aE","t59lRprNT6","Nxx9VgIYvE","h1zcH14FLR","5IhmGpv0i7",
+"9eoRch1zcH","euZA529QAz","EoToP5ZaEz","AkKTkzQt6Q","QYxC00Wr5y","oVQp6BCxeC","POUYSlweGy","BbwgARmDcr","O3iyQQbxXc","0YAGHUl4a1",
+"fcJOyTXQ0Z","zqH0WF6PT2","FPfSEb29RJ","K4GS8Yw2oU","yofH324ARF","dmoS7uupzk","zY1GYB3qem","t98iWPYBf4","uN6r355rfB","SjskQciuWz",
+"Waim6FVMxo","SjskQtAOsr","64s8NCNHmv","pWiOsFwEJz","RsQUqMmKGJ","ix74rvLsmS","Nxx9VpiJSk","CxVEfI7p2a","IBe8kk85Ae","RsQUqW7cTs",
+"rKDLJWaim6","J2mQiuPX7G","HfyNQ3otm6","djsrvJIqXi","cShY2jS1aj","FPfSE8U2nU","Uvlv4oVQp6","W7cTsZ4I1v","45cIH8RCUA","KASQ8pv0i7",
+"48cHL0h1b1","yofH3DQimp","24ARFMezSW","Nxx9VVerEA","euZA5uPX7G","fFDrJrz7Ut","QYxC09iGoT","XyPZNlXFOB","LDk6f5drc6","ru4UGzHF1q",
+"k85AefFDrJ","yToGWhE1Ql","l83Ud7hyVv","lH1ktL7cGc","Kr8ysMezSW","DLhzMnFqik","yluBxSs0Zu","KASQ8DG4sT","0Wr5yUl4a1","Mm8si0Wr5y",
+"FjHXRChuy3","ECMvUxReec","ThjNnY1mC0","Ss0ZuyofH3","Cp3mZ8RCUA","hE1QlHzZT8","BbwgABGaQY","zqH0WJJs5m","AkKTkgdQsS","xReecvkCHH",
+"5Mg9rBFkb8","MaJQs9XyT9","JXljWXyPZN","OUYuFNcICA","SmGzvlm0pD","POUYSUl4a1","lm0pDRBhp0","QssNCx3LDe","AgJHQHzZT8","FxX9qLbRTH",
+"uZPqgYf2Ec","Kr8ysXflUq","P6bcgAXpwE","VerEAZv7z0","aFFssm4bxU","8U2nUZv7z0","gjUTudhSuH","fFDrJ2Yz7E","pvgjSVIlwP","JXljWBGaQY",
+"VIlwPuZPqg","gjUTuG1RhS","FGzgpZv7z0","VjCZq0Wr5y","FcWrWvOqCE","Kr8ysZ4I1v","lpF6WlCMxy","aL6AJiKqhr","bZLvSWDVWJ","faHir5Namm",
+"ni2v18cVD3","6AFT0CIShG","FnPFBVIlwP","lCMxyjS1aj","vkCHHhE1Ql","SbRYygjUTu","5ZaEzcQOnv","yofH3Gv3Fq","CxVEf7fsYM","pAhR1NcICA",
+"U3yw5jiVBP","48cHLpFrrl","suY4x9iGoT","uupzkk85Ae","7lUXZb29RJ","7X3uy580YD","MmKGJIn3NS","dpe1vYjB9t","FcWrWDQimp","FcWrWNcICA",
+"FNYIMvLsmS","5Mg9rh1zcH","xReecaL6AJ","SmGzvAIYUu","zmLYDmX2GE","djsrvx3LDe","lH1ktVIlwP","lsQGoMezSW","2TRI729QAz","SWfougtCA5",
+"CIShGGrDg7","v1HlnFVMxo","pFrrlhSSvQ","mz8gx618Di","MGlTFs7Mxk","6q6L9CNHmv","G1RhSJRJQB","WDVWJs4786","55rfBMojnP","NAFuwWaWsv",
+"uoStw8cVD3","prNT6wiHrZ","lsQGotl72W","Cp3mZqQxHP","0h1b16q6L9","i7WMQKASQ8","EdBKc0ao3l","5Namm580YD","RsQUquLtKs","ogLgcmz8gx",
+"VNCPdQClRL","d7vjMmX2GE","MezSWZ4I1v","kB5nPPb1pa","pv0i7i3pyd","7fKYUtlILt","WreyPU3yw5","fLNg8Dz1R3","5drc6JXljW","8hJdtMGlTF",
+"lXFOBIRh48","QYxC0M3zXL","yToGWrKDLJ","9y4lw5iGN5","Q6LixpT8wu","SjskQjzUqR","HlUbF7fKYU","5NammJkzUn","55rfBOUYuF","YOfrYWPmlx",
+"SWfouk85Ae","Dz1R316lHc","UlU3MlViBv","2NslmQworu","lweGy9rlg9","0ao3lfmIK1","Cp3mZbZLvS","x3LDefFDrJ","AmdQdlj07Q","uZPqgfqypy",
+"8hJdtCxVEf","uZPqgSmGzv","MmsIoVBjhz","45cIH2DREs","MK07Y7fsYM","s7Mxkd7vjM","uPX7GCxVEf","SWfou2TRI7","PYBf4he9IA","DLhzMNo0Qb",
+"WmadAix74r","s7Mxk0Wr5y","CK5W7prNT6","lweGytAOsr","lCMxypmeCd","lCMxyTCgPp","aFFssIn3NS","WreyPiqv4k","wDajXGWqqX","aL6AJ7fsYM",
+"ydG8Uxciqp","RmDcrYjB9t","7fKYU2DREs","EOE1ookgRi","55rfBO3iyQ","DLhzMX6Pin","cmXIXDG4sT","2NslmXflUq","kZANmYw2oU","0h1b1yvOMI",
+"5Namm5VZjS","h1zcHW3VFH","lXFOB4W0Tl","CIShGyEfy9","Z4I1v7lUXZ","Z4I1vJXljW","DG4sTyofH3","hSSvQo8Uyd","QWxoTkB5nP","o8Uydo8Uyd",
+"Nxx9Vs7Mxk","hi5X7FLsph","y94nwyvOMI","GSQwjJIqXi","guMb8lj07Q","7ku1pLbRTH","oQ87rTXQ0Z","FVMxo2ZHdk","gIYvEThjNn","xReecO3iyQ",
+"BbwgATa8f6","2ZHdkWmadA","5ZaEzaFFss","0KyfsyvOMI","S2DfuIjTwP","LewvM0YAGH","ThjNnuJScX","IKxdLyEfy9","EdBKcWaim6","8TxD7nFqik",
+"cmXIXAkKTk","xXTI48FmFH","FcWrW580YD","QbxXcsuY4x","yEfy9ksJby","NhXdu4W0Tl","lpF6WUvlv4","s4786zFgtB","5VZjSlCMxy","8hJdt7Ow5C",
+"FwEJzYjB9t","Rxrsmv8yFN","IKxdLReKEW","dhSuHOUqFM","ulk41BbwgA","jfREua00b5","XyPZNAOgEe","ZzJHWHzZT8","s4786OUqFM","P6bcgdhSuH",
+"4QMc9qaofN","KsjRKBGaQY","MGlTFtuDyS","CK5W7MojnP","uN6r35iGN5","I7p2aUl4a1","gdQsSG1RhS","QWxoTOUYuF","VBjhz6AFT0","Dz1R3ReKEW",
+"7fKYU2Nslm","zmLYDKZamH","VjCZqUmaEv","2NslmbrhlQ","azIWpZzJHW","S2DfuCfgr3","0h1b1CK5W7","5IhmG1LB1L","pWiOsazIWp","2DREsZuDtD",
+"GWqqXm4bxU","Waim6QssNC","jiVBP0h1b1","LbRTHPOUYS","hi5X7pmeCd","P6bcgUlU3M","fqypyzbIYY","lH1kt7hyVv","l83UdjSjS3","qUJMdM6qcG",
+"ReKEWt98iW","OUYuFi7WMQ","ZzJHWOUYuF","CdyBV24ARF","JJs5miKqhr","aL6AJpvgjS","64s8NEdBKc","OHaBz7fKYU","brhlQMGlTF","gIYvElweGy",
+"QWxoTpT8wu","Yf2Ecpv0i7","8RCUAJ2mQi","GrDg7hi5X7","BpYhVOUqFM","CNHmv8FmFH","RpBQmD6rBy","AOgEe55rfB","WreyPfqypy","BGaQYB3qem",
+"lkMUASWfou","HzZT8JIqXi","S77LHpv0i7","WreyPlm0pD","OUqFMuQIcz","bZLvS9XyT9","d7vjMOUqFM","gjUTugf8rI","lH1ktMezSW","FnPFB8TxD7",
+"C2IrcQYxC0","ReKEWUvlv4","VLTy6RpBQm","XyPZNzmLYD","GXdoHGXdoH","RsQUqzbIYY","EOE1o16lHc","7lUXZzz4ZU","d7vjMlH1kt","Waim62Nslm",
+"o8Uydrhl0J","8xEKzHP433","jS1ajIjTwP","8xEKzFVMxo","hi5X7O3iyQ","MmsIoIjTwP","uQIczokgRi","FLsphni2v1","XyPZNCxVEf","djsrvBpYhV",
+"WmadAhE1Ql","xciqpQ6Lix","1LB1Lzz4ZU","HP4337lUXZ","FVMxovOqCE","pAhR1G1RhS","gtCA5FxX9q","pWiOs29QAz","lXFOBgdQsS","k85AepWiOs",
+"zz4ZUsoy9t","Yh1hF1j5L8","lsQGouvf7A","uZPqgrhl0J","Yf2EcpvgjS","GSQwjwDajX","C2IrctAOsr","VBjhzmX2GE","IKxdLKASQ8","dmoS7MGlTF",
+"5IhmGFwEJz","AmdQdlm0pD","qaofNGSQwj","HP433he9IA","NAFuwQbxXc","DQimpkB5nP","lsQGoGrDg7","azIWpokgRi","5VZjS6q6L9","ZJTXHSbRYy",
+"okgRiUl4a1","piJSkzY1GY","In3NSW7cTs","i7WMQs93Ml","djsrvwDajX","LDk6fCfgr3","EOE1oFjHXR","5IhmGS2Dfu","KZamHn1pmO","b29RJW3VFH",
+"Ul4a1VBjhz","K20wKSjskQ","m4bxUHlUbF","TCgPpJRJQB","ru4UG5iGN5","uPX7GlweGy","prNT6MK07Y","vLsmSuJScX","OHaBzCqqaD","2Yz7EJJs5m",
+"9XyT9gdQsS","24ARFo8Uyd","ECMvU6q6L9","i7WMQ618Di","cQOnvU3yw5","lweGy07n1c","24ARFYOfrY","OxWIHYOfrY","KsjRKAgJHQ","7lUXZTwano",
+"KZamHiqv4k","CIShGFjHXR","kB5nPrz7Ut","HP433Ul4a1","lkMUAhUTw7","sx5Glv2eC3","tuDySC2Irc","FVMxoAXpwE","okgRiydG8U","Oz8yZvkCHH",
+"Dz1R3aFFss","RxrsmkB5nP","OHaBzCp3mZ","a00b5AmdQd","gtCA5uAWyp","Gv3Fq7lUXZ","8FmFHLewvM","n1pmOMK07Y","1v5hHBCxeC","d7vjMW3VFH",
+"9eoRcfLNg8","lXFOBRpBQm","0YAGHzQt6Q","tl72Wv2eC3","Dz1R3HfyNQ","lViBvk85Ae","IBe8kB3qem","ciuWz3weIF","FxX9qThjNn","x3LDeC2Irc",
+"fFDrJVNCPd","guMb84dEz6","m4bxUlViBv","qUJMdd7vjM","uLtKsAXpwE","X6PinlCMxy","ru4UGnnP8o","9rlg9Twano","Yf2EcSbRYy","vLsmSdjsrv",
+"IBe8k8xEKz","FnPFBo8Uyd","uTacxfaHir","m4bxUi3pyd","Gv3FqIjTwP","e6e4zuPX7G","kZANmyEfy9","L7cGcpmeCd","BFkb8lkMUA","atef2RBhp0",
+"jzUqRjeskS","lCMxyyvOMI","nnP8oS77LH","X6PinWPmlx","uTacxhSSvQ","lH1ktwDajX","FLsphDz1R3","No0Qb0ao3l","JKWYRBGaQY","14FLRcL0aE",
+"Dz1R3Q6Lix","bgJAzAIYUu","jfREuYh1hF","LewvMQ6Lix","mX2GEZ4I1v","1j5L8Twano","5Mg9rQChxs","L7cGcW3VFH","CqqaDaez9y","v2eC3SbRYy",
+"MK07YokgRi","VIlwPFFDui","BCxeCP6bcg","Gv3FqksJby","29QAzNOHsz","QClRLOz8yZ","uJScXgdQsS","tlILtiB08l","RACujlCMxy","IRh4848cHL",
+"EoToPQbxXc","StlDJtaOXK","lkMUA8FmFH","IBe8k0YAGH","atef2AOgEe","piJSkgIYvE","pmeCd5drc6","PYBf4y94nw","piJSknFqik","NhXdugIYvE",
+"8U2nUqUJMd","jeskSzz4ZU","GWqqX5iGN5","Mm8siMezSW","EOE1oOHaBz","pAhR1EoToP","RkQkeVNCPd","aDGtSazIWp","RmDcrzQt6Q","WmadA3otm6",
+"lViBv5nmWv","Oz8yZAkKTk","Y1mC0DcpWB","ulk41hSSvQ","ni2v15Namm","1LB1LP6bcg","0MR5X5Namm","ZzJHWzHF1q","xXTI4gtCA5","zY1GYjiVBP",
+"fqypyNo0Qb","uJScXn8pJ9","LDk6f7fKYU","5Mg9rK4GS8","yluBxWaWsv","C2IrcDG4sT","M3zXLNAFuw","LbRTHuZPqg","uupzkokgRi","NAFuwWmadA",
+"uPX7GQbxXc","S77LH4W0Tl","7Ow5CcmXIX","KASQ8uJScX","uupzk45cIH","aL6AJfLNg8","0Wr5yMm8si","OUYuFRsQUq","ZuDtDFFDui","ydG8UJIqXi",
+"QworuCfgr3","hUTw7vLsmS","5Mg9rFhtgl","UmaEvQClRL","2Yz7EbrhlQ","pv0i7RBhp0","yEfy9ogLgc","IjTwPhE1Ql","pmeCdlXFOB","lj07QVjCZq",
+"CK5W7oGu6x","K4GS8Cp3mZ","24ARFix74r","K4GS8Zv7z0","JKWYR5Mg9r","fLNg8Q6Lix","WreyP45cIH","1v5hHzbIYY","QworuuQIcz","zbIYYpv0i7",
+"RzaZAbgJAz","TCgPpzFgtB","zz4ZUSmGzv","nnP8ookgRi","SjskQD6rBy","0Kyfsv8yFN","iwzGkgdQsS","aDGtShYBCK","CqqaDuLtKs","GSQwjbZLvS",
+"uAWyp0Kyfs","djsrv7lUXZ","K20wKmz8gx","v8yFNgtCA5","vOqCEJJs5m","o8UydzY1GY","5iGN5tvdkD","9iGoTv8yFN","ogLgcHlUbF","9eoRcEOE1o",
+"8hJdtIBe8k","lsQGo7ku1p","7hyVv7fsYM","K20wKsx5Gl","ru4UGBFkb8","qUJMdNxx9V","ru4UGDz1R3","K4GS8CNHmv","LewvMGrDg7","5Drn08cVD3",
+"gdQsSMm8si","tuDySDcpWB","i3pyduJScX","piJSkUlU3M","t59lRDLhzM","jS1ajix74r","kB5nPiqv4k","bZLvSru4UG","n8pJ9s4786","9XyT9OUqFM",
+"iwzGkStlDJ","pFrrlNo0Qb","CdyBVyluBx","hE1Ql5nmWv","JXljW3otm6","lViBvYh1hF","VBjhzeuZA5","a00b5HzZT8","AkKTkDG4sT","soy9tjeskS",
+"zFgtBNcICA","Mm8sieuZA5","JRJQB5nmWv","lXFOB6AFT0","JXljWydG8U","fcJOy6AFT0","sqVrfNxx9V","55rfBYjB9t","BbwgAa00b5","HfyNQ9iGoT",
+"tvdkDFFDui","qUJMdni2v1","HzZT85iGN5","RxrsmciuWz","L7cGcMojnP","xReec7X3uy","RzaZAHfyNQ","HP433zz4ZU","3otm6QClRL","n8pJ97fKYU",
+"5nmWv8RCUA","45cIHuZPqg","ogLgcblLA9","uupzkbZLvS","7fKYUvLsmS","ZhwG1fLNg8","zqH0WyvOMI","Dz1R3uN6r3","No0QbTa8f6","Twanouvf7A",
+"he9IAQbxXc","Kr8ysTa8f6","Waim6TCgPp","CIShG7fsYM","mz8gxNhXdu","cQOnvFcWrW","GSQwjJJs5m","Rxrsmt59lR","8FmFHoGu6x","DG4sTK4GS8",
+"9eoRcYh1hF","iqv4kBGaQY","MojnP5IhmG","wDajXpmeCd","Yf2EcyEfy9","Kr8ysmz8gx","vkCHHogLgc","djsrvb29RJ","GWqqXMkgy8","5nmWvpiJSk",
+"RzaZAXflUq","K4GS8EdBKc","xciqp1j5L8","ThjNnQssNC","zmLYDoVQp6","fLNg8pmeCd","yvOMI0Wr5y","OUqFMF6PT2","P6bcg0BmCy","x3LDeuvf7A",
+"lj07Qi3pyd","faHirEdBKc","W7cTsokgRi","Ta8f6brhlQ","5ZaEzuTacx","L7cGc64s8N","24ARFQ6hMC","BGaQYDG4sT","BpYhV0MR5X","CIShGUmaEv",
+"1j5L8FLsph","pT8wuPOUYS","wiHrZ7Ow5C","oGu6x07n1c","MK07Y7hyVv","JKWYRW7cTs","CNHmv7lUXZ","CK5W78U2nU","brhlQJRJQB","WMiS3jSjS3",
+"XyPZNQWxoT","guMb81j5L8","zQt6QOz8yZ","WMiS3Z4I1v","bZLvSZv7z0","b29RJokgRi","Ss0Zuatef2","nnP8oKASQ8","HlUbFChuy3","Yh1hFFwEJz",
+"2hEEU7hyVv","9rlg9cL0aE","M3zXLZuDtD","bgJAz07n1c","uoStwGSQwj","uoStwUlU3M","NcICApmeCd","ix74rhe9IA","Nxx9VoQ87r","FjHXRLewvM",
+"W7cTsMmKGJ","ogLgcpFrrl","zHF1qHRxd8","618DivkCHH","7fKYU7ku1p","VjCZqK20wK","DG4sTChuy3","jeskSM3zXL","StlDJAOgEe","MojnPCK5W7",
+"GWqqX5ZaEz","DQimpo8Uyd","FnPFBv1Hln","rz7UtP6bcg","pFrrleuZA5","s4786kZANm","L7cGche9IA","yEfy9618Di","uLtKsyToGW","BbwgA580YD",
+"iB08lbrhlQ","sx5Glv8yFN","PYBf4GrDg7","hi5X7JKWYR","cQOnvzQt6Q","7Ow5CpvgjS","KsjRKhYBCK","BpYhVHlUbF","Chuy3FLsph","07n1ctl72W",
+"jSjS3lsQGo","JJs5mFhtgl","MmsIoGWqqX","2DREsJKWYR","AmdQdaFFss","Mkgy8kZANm","he9IAsqVrf","8U2nUGSQwj","QworulweGy","IBe8kuTacx",
+"JRJQBB3qem","BGaQYhSSvQ","azIWpyEfy9","uvf7AzHF1q","2NslmyToGW","yToGWblLA9","n1pmOJRJQB","lsQGo2Yz7E","Pb1paRxrsm","jtn0XMaJQs",
+"TXQ0ZYf2Ec","dpe1vRkQke","ulk41QYxC0","WaWsvYw2oU","S2DfuguMb8","NOHszoVQp6","K4GS8lj07Q","jeskSrhl0J","9rlg9W3VFH","ogLgche9IA",
+"i7WMQpiJSk","NcICAzmLYD","Nxx9VnlaBy","SbRYy618Di","fcJOyix74r","OHaBzatef2","o8Uyd580YD","Pb1pavLsmS","Mkgy8hi5X7","7ku1pjeskS",
+"2Nslm1v5hH","QnJ1StuDyS","WreyPDz1R3","5ZaEzAgJHQ","sqVrfW3VFH","WmadAcShY2","gf8rIzz4ZU","mX2GEksJby","jS1ajRACuj","J2mQigjUTu",
+"fFDrJaez9y","mX2GEjzUqR","dQ586OUqFM","J2mQijtn0X","2TRI70h1b1","Vprf2bgJAz","SmGzvlCMxy","dmoS7wDajX","2Yz7EcL0aE","okgRiEoToP",
+"iKqhrRzaZA","LbRTHVNCPd","uZPqgSbRYy","IBe8kOUqFM","ciuWzQClRL","NcICAYh1hF","FVMxo5Drn0","VLTy6uAWyp","y94nwZ4I1v","4W0TlmX2GE",
+"FFDuiRzaZA","zmLYDRzaZA","VBjhzdhSuH","2hEEU2ZHdk","UmaEvVLTy6","Yh1hFQworu","ZzJHWQWxoT","2DREs0h1b1","uZPqgNhXdu","uLtKssoy9t",
+"qaofNdhSuH","gIYvE2Yz7E","VLTy6t59lR","ydG8UJJs5m","2Yz7E9iGoT","LbRTHW7cTs","G1RhS07n1c","No0QbWmadA","9rlg9aez9y","ZUnqtWMiS3",
+"vkCHHFxX9q","FNYIMrKDLJ","Yw2oUhe9IA","HRxd8OHaBz","iKqhrgtCA5","Cfgr3JKWYR","0h1b1K20wK","1v5hHZ4I1v","hSSvQkB5nP","IBe8k7ku1p",
+"5ZaEzJKWYR","jSjS3fcwDa","rKDLJGXdoH","cQOnvOUqFM","oVQp6EdBKc","soy9tx3LDe","lweGy7X3uy","DQimpx3LDe","ogLgctl72W","nFqikpmeCd",
+"Uvlv43otm6","xciqp2hEEU","VNCPdn1pmO","fqypyNOHsz","5Mg9rtaOXK","48cHLaDGtS","rKDLJ3otm6","8FmFHSWfou","tl72WlH1kt","BFkb8FwEJz",
+"POUYSCNHmv","lViBvni2v1","k85AeGv3Fq","EdBKcThjNn","gjUTuHlUbF","qQxHPAIYUu","k85AeCp3mZ","lpF6WtuDyS","tvdkDWaim6","24ARFZUnqt",
+"SbRYyQChxs","tuDySbgJAz","K4GS8BCxeC","ThjNnsqVrf","8U2nUrKDLJ","Q6LixS2Dfu","aL6AJzHF1q","uPX7GcShY2","hYBCKRxrsm","mz8gxSs0Zu",
+"tvdkDIn3NS","RACujuZPqg","HfyNQRmDcr","azIWp4W0Tl","0BmCyyofH3","YOfrY5Mg9r","CxVEfwDajX","IKxdLwDajX","fqypyix74r","WmadAGWqqX",
+"he9IAjeskS","DcpWBTa8f6","WreyPxciqp","0BmCyIBe8k","5Drn05Mg9r","JIqXiAXpwE","F6PT2ogLgc","v2eC3ZuDtD","aez9y3weIF","oVQp6brhlQ",
+"ZzJHWtvdkD","16lHc1v5hH","HfyNQ5VZjS","Y1mC0J2mQi","zqH0WuPX7G","OUYuFn8pJ9","FFDui9XyT9","X6Pin64s8N","uZPqgCfgr3","CNHmvUlU3M",
+"uvf7APYBf4","fmIK1tuDyS","jeskSfLNg8","VBjhzStlDJ","8xEKzNAFuw","uN6r32hEEU","J2mQixReec","sx5Gltl72W","JXljWhUTw7","4dEz65iGN5",
+"Twanos4786","TXQ0ZSs0Zu","jS1ajni2v1","LbRTHblLA9","IBe8knFqik","QClRLcQOnv","s7Mxk0Kyfs","x3LDeGv3Fq","aFFssDG4sT","AOgEe580YD",
+"v8yFNGrDg7","he9IAt98iW","L7cGco8Uyd","Dz1R3euZA5","v8yFN7Ow5C","0PktI618Di","4W0TlhSSvQ","vkCHHAmdQd","fcwDaF6PT2","580YD8xEKz",
+"1v5hHNAFuw","VLTy6JIqXi","aL6AJn8pJ9","4W0TlCqqaD","he9IApvgjS","iqv4kqaofN","580YDNAFuw","gjUTu2TRI7","uJScXoVQp6","oQ87rvkCHH",
+"8xEKzaFFss","hE1QlVLTy6","StlDJOUqFM","ksJby24ARF","VjCZqMmsIo","7X3uylj07Q","ulk4116lHc","zz4ZUaDGtS","lpF6WIBe8k","pvgjSZhwG1",
+"mz8gxcShY2","XyPZNqUJMd","2hEEUuoStw","RxrsmCK5W7","AkKTk0ao3l","CNHmv2ZHdk","TXQ0ZKASQ8","dpe1vIKxdL","CxVEfkZANm","UmaEvM6qcG",
+"fLNg8pvgjS","jSjS3cShY2","d85a9MaJQs","ogLgcuvf7A","hi5X74QMc9","v1HlntjQxs","jfREujiVBP","W3VFHa00b5","BpYhVCdyBV","lH1ktZJTXH",
+"9XyT9Mkgy8","zY1GYpFrrl","cShY2mz8gx","yEfy9CxVEf","U3yw5FjHXR","xReecbrhlQ","QWxoTO3iyQ","RsQUqvLsmS","iB08lzmLYD","K4GS8NOHsz",
+"3otm6MojnP","ksJbyQssNC","bZLvSLbRTH","Cfgr3euZA5","0ao3lMK07Y","VLTy65nmWv","9eoRcl83Ud","MezSW64s8N","VBjhzwDajX","FcWrWlH1kt",
+"2ZHdkmX2GE","CqqaDLDk6f","CxVEfFLsph","Fhtgl0MR5X","HP433Chuy3","azIWpI7p2a","1j5L88TxD7","Oz8yZfaHir","AkKTkOz8yZ","Q6LixprNT6",
+"BGaQYyluBx","uTacx7fKYU","y94nwIjTwP","07n1cdpe1v","DLhzMxReec","jtn0XsuY4x","AOgEe8FmFH","lj07Ql83Ud","IjTwPQnJ1S","pT8wuJIqXi",
+"Waim6VerEA","9iGoTk85Ae","hUTw7uoStw","zz4ZUrz7Ut","KsjRKF6PT2","jeskSSbRYy","QYxC04QMc9","t59lRIBe8k","gdQsSjtn0X","X6PinD6rBy",
+"v2eC3cQOnv","Pb1papFrrl","bgJAz9GXkX","M6qcGdQ586","vLsmSBFkb8","fcJOy0MR5X","aez9yxciqp","LDk6fFNYIM","BpYhVlkMUA","45cIHZzJHW",
+"5Mg9rulk41","OxWIHC2Irc","sx5GlU3yw5","7Ow5CfcJOy","GSQwjFPfSE","EdBKc2DREs","lXFOBUl4a1","8cVD3zz4ZU","YOfrYDG4sT","MmsIozQt6Q",
+"uZPqg29QAz","jS1ajY1mC0","RpBQm24ARF","7Ow5ChYBCK","pv0i7tvdkD","5iGN5sqVrf","VerEA1LB1L","pFrrl9y4lw","JKWYRCdyBV","n8pJ9gtCA5",
+"uTacxlXFOB","D6rBys4786","piJSkRkQke","TwanoYf2Ec","B3qemKsjRK","YOfrYLDk6f","U3yw5qaofN","CNHmvgdQsS","7lUXZNo0Qb","9iGoTyEfy9",
+"Kr8ysgjUTu","aL6AJMaJQs","9XyT9hUTw7","5NammZUnqt","8TxD78FmFH","jfREu7ku1p","aL6AJZhwG1","MmKGJ0h1b1","jS1ajUmaEv","ciuWzRxrsm",
+"fFDrJoQ87r","FwEJzv1Hln","MezSWFLsph","ix74r0BmCy","BCxeCYf2Ec","WMiS32hEEU","gdQsSfcJOy","i7WMQPYBf4","S2DfuG1RhS","K20wK0Kyfs",
+"cQOnv0h1b1","L7cGczz4ZU","o8UydOxWIH","GWqqXTwano","aDGtSlj07Q","uLtKsJRJQB","lsQGodQ586","1j5L8FjHXR","hE1QlVjCZq","AmdQdAIYUu",
+"GXdoHFhtgl","d7vjMSs0Zu","2hEEUjiVBP","9XyT9d7vjM","0YAGH0ao3l","PYBf4ciuWz","gjUTudmoS7","Ul4a1Oz8yZ","OUqFMYh1hF","v2eC3jiVBP",
+"HRxd8uJScX","qQxHPpv0i7","VjCZqNOHsz","NcICAhUTw7","29QAztaOXK","zQt6QCK5W7","GXdoHsqVrf","jSjS3VBjhz","t98iWyluBx","0h1b1HzZT8",
+"a00b58cVD3","mX2GEblLA9","5NammWMiS3","4QMc9lsQGo","BGaQYLewvM","mz8gxvLsmS","jiVBPru4UG","VLTy69eoRc","hYBCKEOE1o","580YDECMvU",
+"4QMc9aDGtS","jiVBPSmGzv","7fKYUDLhzM","uvf7AMmsIo","AXpwEYf2Ec","s7MxkECMvU","guMb8UmaEv","5NammDQimp","ZJTXHJXljW","aFFss2DREs",
+"djsrvCK5W7","Yw2oUNcICA","24ARFpFrrl","U3yw5MK07Y","blLA9SjskQ","Fhtgldjsrv","cQOnvAOgEe","AXpwElXFOB","lH1ktWDVWJ","OxWIHFwEJz",
+"14FLRG1RhS","hYBCKLewvM","qQxHPrz7Ut","fLNg8Zv7z0","7X3uyYh1hF","gjUTuRsQUq","gtCA516lHc","DcpWBJJs5m","VNCPdQChxs","a00b5U3yw5",
+"euZA5lpF6W","No0QbI7p2a","3otm6FwEJz","Nxx9VxXTI4","VLTy67Ow5C","uJScXQClRL","3weIF8U2nU","rKDLJHlUbF","lweGycmXIX","blLA9XyPZN",
+"tuDyS3weIF","5VZjS24ARF","uupzk1LB1L","lm0pDVBjhz","d85a9Ss0Zu","U3yw548cHL","i3pyd5drc6","ZuDtDs7Mxk","W7cTsKsjRK","kZANmguMb8",
+"FNYIMs7Mxk","AOgEeThjNn","azIWpiqv4k","ECMvUwiHrZ","fFDrJFLsph","WmadAFVMxo","GWqqXS2Dfu","HlUbFb29RJ","ThjNnjfREu","iwzGkRsQUq",
+"dpe1vs4786","24ARF9y4lw","Nxx9VuZPqg","HfyNQulk41","HlUbFaez9y","lweGyprNT6","SjskQyofH3","8TxD7lkMUA","zqH0WzQt6Q","B3qemlpF6W",
+"S77LHwDajX","GXdoH7Ow5C","yofH35Namm","qaofNWPmlx","IjTwPx3LDe","5NammcQOnv","VIlwPni2v1","HzZT8cShY2","8cVD3RBhp0","5Drn0fLNg8",
+"Q6LixCIShG","v2eC30BmCy","9XyT929QAz","OUqFMcShY2","2DREsni2v1","k85AeRsQUq","qaofNAgJHQ","1LB1LJ2mQi","yToGWatef2","AOgEeeuZA5",
+"faHirPb1pa","2ZHdkXflUq","JIqXiuQIcz","lCMxyqaofN","NcICANo0Qb","0KyfsJIqXi","O3iyQEdBKc","Yw2oUHfyNQ","AgJHQuJScX","gtCA5suY4x",
+"yToGWsqVrf","qUJMd14FLR","4QMc9wiHrZ","C2IrcFxX9q","lm0pD9y4lw","hUTw7d85a9","tvdkDK20wK","pv0i7DcpWB","kZANmMkgy8","WmadAFjHXR",
+"lkMUAksJby","fcJOyChuy3","dmoS70PktI","Q6LixVprf2","tlILtaL6AJ","iqv4klj07Q","oQ87rhe9IA","M6qcG5Drn0","mX2GEGSQwj","NAFuwNo0Qb",
+"CdyBVn1pmO","e6e4zKZamH","AOgEeJJs5m","MK07YY1mC0","nnP8oGXdoH","NcICAlweGy","JXljWfaHir","aez9yQ6Lix","hi5X78RCUA","dQ586aez9y",
+"e6e4zFxX9q","NhXduAIYUu","WreyPYh1hF","gtCA5uJScX","rz7UtQssNC","Cp3mZLbRTH","rKDLJs7Mxk","7fsYMFcWrW","L7cGcUmaEv","5IhmGs7Mxk",
+"suY4xGv3Fq","uJScXXyPZN","n8pJ90ao3l","JJs5mFNYIM","JJs5mb29RJ","XyPZN2Nslm","0KyfsZzJHW","i7WMQblLA9","FLsph4W0Tl","CdyBVHfyNQ",
+"0h1b17fKYU","aDGtSSbRYy","wDajXRmDcr","AgJHQyToGW","Yw2oUWaWsv","AIYUuwDajX","s4786a00b5","POUYSNxx9V","Uvlv4lH1kt","soy9t5VZjS",
+"SjskQkZANm","Q6LixnFqik","CIShGMmKGJ","IBe8ki7WMQ","BGaQYZv7z0","2NslmpT8wu","TwanoFNYIM","NhXdusuY4x","uJScXdpe1v","Chuy3gjUTu",
+"2DREsyluBx","GWqqXGrDg7","24ARFHRxd8","tlILtlViBv","IKxdLWaim6","dpe1vNOHsz","L7cGcMaJQs","lViBv64s8N","SWfouMGlTF","uN6r34dEz6",
+"W7cTsSmGzv","Kr8yshUTw7","Vprf2ni2v1","ogLgce6e4z","gf8rIEoToP","lXFOBBbwgA","nlaBylXFOB","AmdQdblLA9","CNHmvzbIYY","8FmFHQbxXc",
+"NOHszhUTw7","cL0aEuoStw","lsQGom4bxU","nlaByFPfSE","uN6r3fqypy","I7p2an8pJ9","pmeCdv1Hln","zmLYDni2v1","LDk6foQ87r","FjHXRMkgy8",
+"In3NS1LB1L","BCxeCIKxdL","Ta8f6tl72W","yToGWTXQ0Z","IRh48RzaZA","gIYvEQ6hMC","tl72WLbRTH","SbRYyiKqhr","S77LHi3pyd","uupzkCdyBV",
+"jS1ajThjNn","s4786AIYUu","FLsphMkgy8","0PktIQnJ1S","L7cGcOz8yZ","MezSWW3VFH","jeskSlXFOB","2DREsGv3Fq","uLtKsi7WMQ","MezSWpvgjS",
+"XflUqQ6hMC","G1RhS7fKYU","VBjhz7lUXZ","BCxeCNcICA","vLsmSSs0Zu","vkCHHpAhR1","rz7UtzmLYD","jeskS0ao3l","CdyBVsqVrf","taOXKJXljW",
+"2DREsKZamH","RsQUqZv7z0","Yf2EcvkCHH","4QMc9HlUbF","qUJMdk85Ae","7Ow5CIKxdL","fFDrJOz8yZ","faHirGSQwj","Y1mC0ZJTXH","WDVWJtAOsr",
+"DLhzMNOHsz","zmLYDYjB9t","IKxdLbrhlQ","uoStwlCMxy","RBhp0ZJTXH","In3NS2ZHdk","tAOsr1j5L8","lViBvciuWz","WMiS3Vprf2","CqqaD1v5hH",
+"t98iWGXdoH","W7cTsMaJQs","2ZHdkatef2","D6rByRsQUq","CxVEfiwzGk","8xEKz45cIH","HRxd8aFFss","MmsIon1pmO","RxrsmEOE1o","ZJTXHAXpwE",
+"ydG8U0BmCy","GWqqXuZPqg","zFgtBlj07Q","faHirtlILt","m4bxUtuDyS","618Diy94nw","IBe8klXFOB","vkCHHO3iyQ","Chuy3azIWp","AIYUu2DREs",
+"07n1c7hyVv","nFqikfLNg8","FwEJzAOgEe","wiHrZBbwgA","8cVD3bZLvS","CqqaDCxVEf","uupzkuvf7A","hUTw7FPfSE","Y1mC0WPmlx","lj07Qb29RJ",
+"aez9yU3yw5","hYBCKUl4a1","FjHXRn1pmO","pT8wuNAFuw","JKWYRYf2Ec","uTacxuN6r3","o8UydY1mC0","9rlg9lH1kt","9rlg90Wr5y","xReecBpYhV",
+"55rfBuAWyp","mX2GERBhp0","Zv7z09iGoT","StlDJ0Kyfs","tlILtx3LDe","Yh1hFaDGtS","WmadAo8Uyd","tlILtVNCPd","lweGyO3iyQ","Cfgr3EOE1o",
+"0YAGHoVQp6","2DREsn1pmO","qUJMdsuY4x","Ss0Zusx5Gl","8U2nUzmLYD","ZzJHWdjsrv","xReecjtn0X","AXpwEIKxdL","o8UydStlDJ","pT8wuaDGtS",
+"7X3uyaDGtS","WmadAdhSuH","pFrrl4dEz6","uTacxMmsIo","WmadA8RCUA","okgRi07n1c","HlUbFDz1R3","i3pyduZPqg","hYBCK2TRI7","Vprf2XyPZN",
+"zqH0WAgJHQ","YjB9tqQxHP","9GXkXpFrrl","POUYSuLtKs","L7cGcGWqqX","7lUXZhE1Ql","zmLYDzqH0W","jzUqRMkgy8","S2DfuOUqFM","WMiS3d7vjM",
+"SmGzveuZA5","nFqikEoToP","hSSvQW7cTs","ix74rSbRYy","lViBvfaHir","QChxsa00b5","8FmFH2ZHdk","BbwgAaDGtS","HfyNQ0Wr5y","YOfrY0ao3l",
+"M3zXL0PktI","IKxdLIKxdL","7ku1puZPqg","9eoRcC2Irc","K20wKVIlwP","RpBQmQ6Lix","LDk6fo8Uyd","AIYUuydG8U","lweGyhYBCK","B3qemn1pmO",
+"dQ586UmaEv","Ta8f6ksJby","MK07YRxrsm","FNYIMZv7z0","d85a9TCgPp","ZUnqt5Namm","yvOMIGWqqX","QworuW3VFH","Chuy31LB1L","WaWsvFjHXR",
+"2hEEU16lHc","kB5nPBbwgA","xXTI4iB08l","mX2GErz7Ut","yvOMI5Drn0","B3qemQ6hMC","9eoRctuDyS","BbwgAMezSW","Mm8siFPfSE","FNYIM9y4lw",
+"FhtglgdQsS","jeskSQworu","VjCZqG1RhS","Gv3FqVjCZq","guMb8BGaQY","YjB9t4W0Tl","vOqCE64s8N","5NammECMvU","Mm8sizz4ZU","1v5hHiB08l",
+"M6qcGbZLvS","ZhwG1O3iyQ","uvf7AcmXIX","ECMvUuZPqg","gtCA5FcWrW","k85AezbIYY","uPX7Gs7Mxk","hE1QlQYxC0","BGaQYh1zcH","CIShGnnP8o",
+"In3NS9eoRc","YjB9tG1RhS","MaJQsFcWrW","RACujHzZT8","IRh48OUqFM","KASQ8NcICA","9GXkXcL0aE","i3pydVerEA","9iGoTQ6hMC","nlaByYjB9t",
+"RkQke0MR5X","lCMxyK4GS8","07n1cnlaBy","iwzGkW3VFH","WaWsvUl4a1","cQOnvrKDLJ","lViBvK20wK","okgRi5VZjS","okgRiKASQ8","FwEJzlViBv",
+"Cp3mZoVQp6","FwEJzrhl0J","Dz1R3djsrv","DcpWBQworu","jS1ajXflUq","lm0pDQ6Lix","5nmWvUvlv4","FhtglSWfou","zz4ZUokgRi","lViBv2DREs",
+"5iGN5D6rBy","Vprf2FLsph","0Wr5ylpF6W","5VZjSlpF6W","5iGN5QWxoT","rhl0JQ6hMC","8TxD7n8pJ9","B3qemydG8U","PYBf4VLTy6","ru4UG5IhmG",
+"YOfrY0MR5X","rz7UtY1mC0","FxX9qOz8yZ","FNYIMoGu6x","tlILtzFgtB","0MR5XguMb8","mz8gxpAhR1","7Ow5CRsQUq","QbxXciqv4k","WMiS32TRI7",
+"DLhzMlCMxy","a00b5xXTI4","y94nwXyPZN","brhlQW3VFH","8cVD3CNHmv","7Ow5CAgJHQ","QssNCmz8gx","bZLvSguMb8","zQt6QFNYIM","cShY2Nxx9V",
+"qaofN48cHL","aFFsstlILt","MmKGJQYxC0","FGzgpl83Ud","BCxeCSs0Zu","XflUqlXFOB","BbwgAuTacx","D6rBy1v5hH","Fhtgl24ARF","tuDySi3pyd",
+"pFrrlrKDLJ","F6PT22Nslm","SmGzv0ao3l","MezSW6AFT0","qUJMdWaWsv","oGu6x0Wr5y","h1zcHFnPFB","s93MlGv3Fq","s7MxkuLtKs","5VZjSxXTI4",
+"2hEEUjSjS3","t59lRrKDLJ","LewvMjeskS","BpYhVzz4ZU","1v5hHfFDrJ","OxWIHzFgtB","16lHcVBjhz","FxX9qBCxeC","55rfBlsQGo","24ARFMmKGJ",
+"48cHLF6PT2","W3VFHEoToP","atef2JJs5m","7fsYMW3VFH","QWxoTk85Ae","yofH3Q6hMC","6AFT0Uvlv4","ZhwG1pFrrl","s7Mxk9iGoT","okgRiOz8yZ",
+"BCxeCzbIYY","O3iyQ9y4lw","qQxHPpAhR1","0YAGHprNT6","W3VFHBbwgA","Q6LixaDGtS","OUYuFydG8U","aL6AJ8RCUA","J2mQijeskS","G1RhSpiJSk",
+"580YDUmaEv","2TRI75Namm","ru4UG4QMc9","lm0pDpAhR1","BpYhVPOUYS","QssNCcShY2","xReeczFgtB","yToGWcmXIX","2TRI7NAFuw","RzaZARmDcr",
+"J2mQiFNYIM","8hJdtNxx9V","aL6AJgf8rI","HfyNQI7p2a","NcICAblLA9","l83UdtlILt","pFrrllm0pD","Y1mC0hYBCK","lkMUANxx9V","VBjhz7X3uy",
+"zmLYDHRxd8","xciqpru4UG","IRh48Mkgy8","7X3uynnP8o","CqqaDs7Mxk","Yw2oUSmGzv","rz7UtpmeCd","lkMUAIjTwP","tl72W5nmWv","lCMxyIjTwP",
+"zQt6QYw2oU","jSjS3QClRL","IRh482Nslm","IKxdLogLgc","MK07YQbxXc","7fsYMkZANm","0MR5XFnPFB","zY1GYZ4I1v","5ZaEzRxrsm","prNT6iqv4k",
+"o8UydVjCZq","POUYSgjUTu","DLhzMTXQ0Z","ksJbyZuDtD","uvf7Afqypy","1j5L8qaofN","VLTy6VjCZq","POUYSIKxdL","Z4I1vX6Pin","zQt6QuZPqg",
+"IBe8kWaim6","TCgPp29QAz","guMb8CxVEf","8hJdtNAFuw","uupzkuJScX","JJs5mydG8U","Mkgy8lH1kt","CqqaDGv3Fq","uAWyp55rfB","oQ87rfcwDa",
+"FxX9qaFFss","WreyPYOfrY","d85a9fcwDa","i7WMQ3otm6","FVMxo8xEKz","rz7Ut5drc6","HRxd8okgRi","zmLYDx3LDe","lweGywiHrZ","ix74rfmIK1",
+"hE1QlHfyNQ","24ARFNAFuw","hYBCKHfyNQ","brhlQ7Ow5C","gdQsS7fsYM","ogLgcKr8ys","nnP8ovOqCE","xReecBbwgA","WmadAl83Ud","Twano6AFT0",
+"wDajXB3qem","uoStwGrDg7","14FLRSWfou","hSSvQJKWYR","hUTw7mX2GE","CxVEffcwDa","VLTy6K4GS8","S2Dfuk85Ae","Mkgy8CqqaD","lCMxyZhwG1",
+"StlDJEdBKc","2Nslm9GXkX","Kr8ys3weIF","hUTw77Ow5C","2NslmLDk6f","ZUnqttjQxs","45cIHBbwgA","aDGtSPb1pa","HlUbFYh1hF","M3zXL9rlg9",
+"yEfy9POUYS","4QMc9LDk6f","Cp3mZulk41","8hJdtMmKGJ","aDGtSksJby","JRJQBiwzGk","zFgtBLewvM","StlDJaez9y","ECMvUNhXdu","nFqikpT8wu",
+"5NammfmIK1","gf8rI8U2nU","Ta8f6uTacx","sx5GlyvOMI","FVMxoKZamH","oVQp6I7p2a","DLhzMLDk6f","SWfouUvlv4","l83UdLewvM","CIShGM3zXL",
+"ZhwG1RACuj","9iGoTOz8yZ","55rfBX6Pin","8xEKzAOgEe","Twano9GXkX","atef2BCxeC","Rxrsm5VZjS","5IhmGMojnP","VLTy6sx5Gl","L7cGcK4GS8",
+"EOE1on1pmO","4dEz6djsrv","iKqhrUmaEv","dpe1vogLgc","AkKTkfaHir","45cIHSWfou","5ZaEzW3VFH","ZhwG1vOqCE","RsQUqh1zcH","lpF6WZ4I1v",
+"yEfy9NhXdu","ksJby7fKYU","Y1mC0jSjS3","pFrrlfmIK1","DG4sT64s8N","QWxoTGWqqX","0MR5XjiVBP","2Yz7EFjHXR","9rlg9L7cGc","gdQsSVIlwP",
+"sx5Gl5drc6","CxVEfIRh48","lj07Qrhl0J","rKDLJmX2GE","IjTwPRpBQm","UmaEvK4GS8","iKqhr0Wr5y","FLsphX6Pin","uZPqgLewvM","zQt6QUvlv4",
+"kZANms4786","XyPZNQworu","9rlg9WDVWJ","Gv3Fq2hEEU","d85a9WDVWJ","Yw2oUMGlTF","azIWpFxX9q","VIlwP6AFT0","mz8gxMK07Y","i7WMQVNCPd",
+"ZJTXHeuZA5","GWqqXUvlv4","tlILtwDajX","uoStw5Mg9r","lpF6WDLhzM","ix74rZhwG1","29QAzaL6AJ","BpYhVv2eC3","aDGtSRsQUq","RACujkZANm",
+"hUTw7ZJTXH","xXTI4NAFuw","Cp3mZKASQ8","JXljW1v5hH","8TxD7jSjS3","VBjhzQ6hMC","wiHrZyvOMI","L7cGcm4bxU","1LB1LXflUq","Dz1R39GXkX",
+"5Mg9rWaim6","Mm8siQ6Lix","5Mg9rQClRL","Oz8yZgtCA5","JKWYRa00b5","2ZHdkVprf2","1j5L8Waim6","2Yz7EI7p2a","t98iWpv0i7","DcpWBThjNn",
+"2TRI7DG4sT","lpF6WpAhR1","2Yz7E8U2nU","euZA5POUYS","s7Mxk8RCUA","7fKYUjiVBP","zFgtBjfREu","WreyPWmadA","taOXKNcICA","9rlg9aFFss",
+"jtn0XJkzUn","9y4lwn1pmO","kZANmtl72W","dQ586okgRi","Chuy3pv0i7","LDk6f9GXkX","8FmFHFLsph","WaWsvnnP8o","ydG8U0Wr5y","jeskSAkKTk",
+"VerEAWreyP","CxVEfMK07Y","n8pJ9t98iW","jzUqRNcICA","Chuy3soy9t","n8pJ9QnJ1S","AgJHQRkQke","16lHcwiHrZ","QYxC0o8Uyd","cQOnvbZLvS",
+"MK07YOUqFM","aez9ylweGy","x3LDe5Namm","lweGyzHF1q","pT8wuOz8yZ","ulk415ZaEz","Dz1R3tuDyS","lj07QFnPFB","tl72Wfqypy","fmIK1cL0aE",
+"FGzgp5Drn0","9eoRcGXdoH","SbRYy5IhmG","zHF1qhi5X7","G1RhSJkzUn","HzZT8iB08l","8RCUAlweGy","I7p2aVerEA","W3VFH2hEEU","YjB9tOUYuF",
+"W7cTsqQxHP","1j5L8SmGzv","lj07QWDVWJ","Z4I1vMezSW","BFkb89GXkX","v1HlnhE1Ql","DLhzMLewvM","FwEJzfmIK1","1LB1LqaofN","0h1b1lj07Q",
+"dmoS7UmaEv","7fsYMpWiOs","CK5W7uTacx","RkQkezmLYD","cmXIXZUnqt","jzUqRwDajX","s4786uLtKs","k85AetuDyS","VNCPdJ2mQi","VjCZqJKWYR",
+"YOfrYX6Pin","618DikB5nP","cShY2WmadA","9y4lwpv0i7","brhlQazIWp","KASQ8J2mQi","VjCZq3otm6","QYxC0WreyP","jiVBPdQ586","ydG8UzmLYD",
+"WaWsvQnJ1S","RBhp0cL0aE","NOHsz7fKYU","gdQsS0MR5X","NAFuws7Mxk","d85a929QAz","hE1QlAXpwE","7fKYUwDajX","y94nwazIWp","zbIYYCqqaD",
+"YjB9t8hJdt","suY4xDz1R3","FwEJz7fKYU","5drc6VBjhz","Yh1hF2Yz7E","9rlg929QAz","kB5nPTwano","lpF6Wni2v1","iqv4kZzJHW","pFrrl8TxD7",
+"lj07QiKqhr","ZzJHWMaJQs","Oz8yZlweGy","2ZHdkxXTI4","uTacxogLgc","Cfgr3uAWyp","i7WMQ0h1b1","cL0aE2Nslm","6AFT0prNT6","xXTI4a00b5",
+"Kr8ysFVMxo","In3NSNxx9V","o8Uyd9GXkX","qUJMdZJTXH","cL0aE7Ow5C","b29RJOUYuF","PYBf4v2eC3","jfREuAkKTk","5IhmGlpF6W","07n1c8TxD7",
+"BCxeCtjQxs","NcICA0BmCy","gtCA57fKYU","8TxD7okgRi","zY1GYYOfrY","FNYIMNAFuw","faHirSbRYy","MmsIowDajX","2DREsn8pJ9","LDk6f8U2nU",
+"Mkgy8zqH0W","ECMvUuPX7G","OxWIHtjQxs","WDVWJ4QMc9","FVMxo7fKYU","lXFOBVBjhz","WaWsvHRxd8","gjUTuBpYhV","9GXkX0BmCy","Ul4a1iKqhr",
+"NhXdublLA9","Pb1pabgJAz","LbRTHFLsph","lm0pDFVMxo","t59lRtl72W","Dz1R3vOqCE","ksJbyix74r","s93Ml7X3uy","uN6r3QYxC0","64s8NCIShG",
+"WreyPB3qem","JkzUnnlaBy","Mm8si8hJdt","BGaQYAgJHQ","WreyPX6Pin","SjskQhUTw7","Oz8yZAgJHQ","LbRTHfmIK1","2Yz7EUlU3M","cmXIXvLsmS",
+"LDk6fCdyBV","uN6r3VBjhz","WreyP7lUXZ","xciqpVprf2","x3LDeD6rBy","i7WMQhE1Ql","Cfgr3VLTy6","tvdkDiKqhr","jzUqRRzaZA","C2IrcaFFss",
+"lCMxyjSjS3","oGu6xWDVWJ","K20wK9eoRc","zbIYYuPX7G","t59lRix74r","nnP8oDcpWB","FxX9qbgJAz","1j5L8OUqFM","OHaBzbrhlQ","FFDuijiVBP",
+"cmXIXFwEJz","wiHrZru4UG","soy9tGv3Fq","taOXKs4786","CxVEfeuZA5","zz4ZUQChxs","yEfy9x3LDe","PYBf40h1b1","tjQxsUvlv4","pT8wuChuy3",
+"0PktI0h1b1","B3qemfcwDa","2Nslm5drc6","9eoRcXyPZN","dhSuHQworu","b29RJtAOsr","QClRLblLA9","vkCHHCIShG","VerEAnlaBy","zFgtB7Ow5C",
+"K20wK1LB1L","SbRYyiqv4k","wDajXPYBf4","mX2GETwano","bgJAzk85Ae","jiVBPtjQxs","FVMxoC2Irc","Ss0ZuCp3mZ","sx5GlVLTy6","Qworutl72W",
+"k85AeQ6Lix","5Drn0Cp3mZ","0h1b1DQimp","uTacxpWiOs","X6PinguMb8","qQxHPuLtKs","FjHXRNcICA","0h1b1v8yFN","7lUXZcmXIX","O3iyQ9rlg9",
+"6q6L9UlU3M","OUqFMbrhlQ","k85AeXyPZN","cShY2uJScX","DcpWBokgRi","SmGzvYOfrY","sx5GlyofH3","aDGtSsx5Gl","guMb864s8N","DcpWBvOqCE",
+"uN6r3QbxXc","4dEz6euZA5","KZamHFhtgl","n1pmOpv0i7","Nxx9V8xEKz","lCMxyBFkb8","KZamHYOfrY","P6bcgMkgy8","AgJHQZuDtD","dpe1v8RCUA",
+"GXdoHFcWrW","nFqikUlU3M","8U2nUiB08l","prNT6i7WMQ","MmKGJSbRYy","HlUbF6q6L9","S77LHJIqXi","618Dini2v1","2ZHdkQ6hMC","zHF1qCxVEf",
+"uAWypChuy3","tAOsrdmoS7","o8UydmX2GE","iqv4k5VZjS","QYxC0vkCHH","MojnPt59lR","64s8N0h1b1","ZzJHWtaOXK","MojnPHzZT8","oVQp6FLsph",
+"GWqqXZv7z0","jiVBPCNHmv","WreyPQ6hMC","ZzJHW4dEz6","prNT68TxD7","SmGzvBCxeC","8hJdtv1Hln","BCxeCMaJQs","jeskSlpF6W","2TRI7sx5Gl",
+"Fhtgl0BmCy","fmIK1BCxeC","fcwDaJRJQB","suY4xnFqik","vkCHHFGzgp","Gv3Fqs93Ml","BFkb87fKYU","ciuWz8hJdt","3otm6EdBKc","b29RJvkCHH",
+"piJSklCMxy","hSSvQlweGy","hE1QlAgJHQ","Mkgy8cL0aE","MmKGJGrDg7","t98iWdmoS7","NcICAkZANm","RpBQml83Ud","hUTw7FjHXR","VLTy6CxVEf",
+"FhtgltAOsr","nlaBy7lUXZ","RpBQmWMiS3","FPfSElsQGo","qaofNU3yw5","PYBf4CxVEf","JkzUn5drc6","DG4sTZ4I1v","8xEKzeuZA5","Z4I1v4QMc9",
+"S77LH2DREs","jSjS3C2Irc","KASQ8Uvlv4","iwzGkW7cTs","07n1cgtCA5","ThjNnVNCPd","Mkgy8RzaZA","FwEJzWMiS3","2Nslm4dEz6","GWqqXksJby",
+"ZUnqtTXQ0Z","FGzgp1LB1L","iB08l64s8N","Yf2EcJIqXi","jS1ajguMb8","tlILtO3iyQ","zz4ZUsuY4x","2TRI7KZamH","dhSuH0Kyfs","4QMc9Yw2oU",
+"S77LHMm8si","EoToPCIShG","FLsphuTacx","pT8wuQ6hMC","t98iWni2v1","kB5nPt98iW","oVQp6Qworu","MmsIoiwzGk","GrDg7HfyNQ","he9IArhl0J",
+"EdBKcAmdQd","tuDySxXTI4","n1pmOaez9y","i3pydGWqqX","prNT6FwEJz","lXFOBoQ87r","JKWYR55rfB","pT8wuCNHmv","xciqp0MR5X","9GXkX4dEz6",
+"zQt6QBGaQY","WPmlxrhl0J","zz4ZUMaJQs","ThjNnydG8U","bgJAzUlU3M","yluBxSWfou","TwanoD6rBy","POUYSqQxHP","jSjS3gIYvE","7ku1pCp3mZ",
+"9GXkXFVMxo","lCMxyFwEJz","fFDrJDLhzM","k85Ae5IhmG","euZA50h1b1","fqypyazIWp","vkCHHVjCZq","07n1c4W0Tl","cmXIXl83Ud","gtCA5POUYS",
+"uoStw0BmCy","P6bcgFcWrW","0BmCyIKxdL","t98iWv1Hln","JkzUnGXdoH","jS1aj2Nslm","2hEEUW3VFH","hYBCKiwzGk","HfyNQZhwG1","UmaEv5Namm",
+"soy9tjiVBP","uAWypjzUqR","Yf2EcDQimp","M3zXLIRh48","MK07Y9iGoT","AIYUuAIYUu","rhl0J6AFT0","lH1ktFwEJz","i3pydP6bcg","iB08l8U2nU",
+"ZuDtD6AFT0","Cp3mZVprf2","QClRLJJs5m","MmsIonnP8o","MmKGJiqv4k","Yw2oUJJs5m","24ARF2hEEU","F6PT2IRh48","cmXIX5VZjS","LDk6fJJs5m",
+"LewvM7X3uy","cL0aElH1kt","55rfBRxrsm","Zv7z08FmFH","IRh48v8yFN","ksJby7fsYM","9y4lwfcJOy","pFrrlatef2","0Wr5ysuY4x","FFDuinnP8o",
+"JJs5mAkKTk","OUqFM5ZaEz","ogLgcs7Mxk","qQxHPydG8U","BFkb8s4786","rz7UtHP433","n1pmOFNYIM","7Ow5CJIqXi","gf8rIjS1aj","9GXkXru4UG",
+"VNCPddhSuH","yluBxBGaQY","GXdoH0BmCy","9rlg9CNHmv","pFrrls4786","ix74rFLsph","lweGyo8Uyd","MmKGJKr8ys","zHF1qZzJHW","0h1b1BbwgA",
+"pWiOsRkQke","J2mQiciuWz","5VZjSfFDrJ","JIqXiQssNC","a00b5fcJOy","Mkgy8Kr8ys","QClRLWDVWJ","W7cTsS77LH","Pb1pat59lR","MGlTFQYxC0",
+"soy9tMK07Y","suY4xOxWIH","nFqikiwzGk","CdyBVzQt6Q","PYBf4IBe8k","7X3uyt98iW","7X3uyKr8ys","i3pydfFDrJ","NhXduYw2oU","MezSWWDVWJ",
+"YjB9tNcICA","5Drn0e6e4z","0Wr5yxciqp","cmXIX9rlg9","uAWypk85Ae","QssNCFhtgl","pvgjS48cHL","1v5hHI7p2a","StlDJLewvM","zHF1qrz7Ut",
+"ciuWzkB5nP","5IhmGgdQsS","8hJdtni2v1","KZamHDz1R3","azIWppFrrl","YOfrYNhXdu","3otm6d85a9","GXdoHZUnqt","M3zXLZJTXH","ReKEWbgJAz",
+"EoToPqUJMd","MGlTFzbIYY","QWxoTIBe8k","FjHXR2hEEU","VNCPd4W0Tl","WreyPGrDg7","MmKGJMmKGJ","K4GS8yofH3","ksJby3weIF","y94nwogLgc",
+"IBe8kZuDtD","soy9tFNYIM","ZzJHWBbwgA","ThjNn8RCUA","vkCHH7Ow5C","uoStwZJTXH","QssNCRzaZA","fmIK15drc6","QnJ1Si3pyd","tjQxsqQxHP",
+"W3VFHGSQwj","vLsmSyvOMI","VIlwP2ZHdk","FcWrWIn3NS","Cfgr3Uvlv4","Yf2EcYf2Ec","gIYvEs4786","brhlQlj07Q","MaJQsAgJHQ","a00b5HRxd8",
+"4QMc9MaJQs","v1HlnFwEJz","64s8NVjCZq","ThjNnlj07Q","taOXKjS1aj","suY4xjtn0X","D6rByQnJ1S","CK5W77X3uy","QbxXcFVMxo","jzUqR5Namm",
+"VIlwPFcWrW","5Mg9rs93Ml","uvf7A2Nslm","QYxC0uQIcz","ZhwG1Ul4a1","k85AeWMiS3","n8pJ90h1b1","AIYUuo8Uyd","8xEKzuAWyp","zbIYYQbxXc",
+"aDGtSCIShG","GXdoHxciqp","dQ586vOqCE","hSSvQ580YD","RACuj5ZaEz","4QMc9ZhwG1","55rfBogLgc","Zv7z0uAWyp","U3yw5Yw2oU","uPX7GJIqXi",
+"zHF1qd7vjM","FxX9qjS1aj","M6qcGTa8f6","mX2GEiwzGk","ZUnqtRpBQm","he9IA580YD","s4786VLTy6","uoStwRBhp0","okgRiJIqXi","1v5hHgtCA5",
+"VLTy6uvf7A","Y1mC0UmaEv","prNT6Y1mC0","ru4UGB3qem","AXpwE7X3uy","8U2nUD6rBy","WMiS3JkzUn","b29RJl83Ud","KZamHpT8wu","AIYUuokgRi",
+"48cHLXflUq","BGaQYBCxeC","QYxC0Q6hMC","nFqikG1RhS","tjQxsn1pmO","8U2nUKr8ys","cQOnv7lUXZ","d85a9VNCPd","okgRilkMUA","b29RJd7vjM",
+"M6qcGOHaBz","uoStwtaOXK","NcICAMaJQs","hi5X7lm0pD","NAFuwDG4sT","pFrrlK20wK","K20wK5nmWv","Ul4a1UlU3M","7X3uy9rlg9","M6qcG4dEz6",
+"NhXduFjHXR","AIYUuJJs5m","uoStwJ2mQi","zHF1qHzZT8","MaJQsuupzk","blLA9NcICA","pAhR1M3zXL","DG4sT0BmCy","S77LHGv3Fq","WDVWJ5iGN5",
+"QnJ1SgIYvE","hi5X7CNHmv","Kr8ysiwzGk","55rfBpv0i7","rhl0JpFrrl","zqH0Wl83Ud","Dz1R3VIlwP","MezSWWMiS3","uoStwv1Hln","I7p2a8U2nU",
+"F6PT2pWiOs","fqypyL7cGc","580YDuAWyp","Yw2oUl83Ud","k85Ae2hEEU","iB08ltaOXK","fFDrJiqv4k","n8pJ9KASQ8","lm0pDs7Mxk","pFrrlzFgtB",
+"IjTwPVprf2","16lHcgjUTu","In3NSfqypy","bgJAzfqypy","ZuDtDpFrrl","DLhzMs93Ml","580YD3weIF","WMiS3oGu6x","EdBKclXFOB","FNYIM2hEEU",
+"GWqqX9iGoT","NcICAdQ586","jfREupvgjS","WDVWJQ6Lix","ZzJHWNcICA","oGu6xZ4I1v","WPmlxbrhlQ","C2IrcjiVBP","s4786lm0pD","PYBf4RpBQm",
+"KZamHdhSuH","In3NS8hJdt","sqVrfMezSW","Rxrsm0BmCy","uTacxVLTy6","nlaByaDGtS","9iGoTtjQxs","P6bcgyluBx","gf8rI7fKYU","0YAGH8RCUA",
+"ECMvUs7Mxk","EdBKcLDk6f","Waim6l83Ud","SmGzvQworu","CIShGiKqhr","0Wr5ysx5Gl","UlU3MCqqaD","x3LDeFcWrW","jiVBP5Drn0","SbRYyxciqp",
+"QbxXcpv0i7","lweGyaez9y","VIlwPjS1aj","WaWsvSbRYy","yofH3FVMxo","JJs5mjtn0X","RxrsmZJTXH","UmaEvS2Dfu","mz8gxYf2Ec","9GXkXpvgjS",
+"blLA9qUJMd","Fhtgl3weIF","0Kyfs7ku1p","cShY27fsYM","RBhp0BpYhV","1j5L8m4bxU","HfyNQ7fKYU","B3qemzqH0W","fFDrJGrDg7","zQt6QUlU3M",
+"45cIHQChxs","hE1QlpWiOs","cmXIX7hyVv","Cfgr3SmGzv","2Yz7EP6bcg","wDajXn8pJ9","bgJAz14FLR","v1Hlnm4bxU","M6qcG0h1b1","Mkgy8lpF6W",
+"AIYUutl72W","5iGN5W7cTs","fLNg8Pb1pa","pvgjSbZLvS","LbRTHTXQ0Z","dpe1vMGlTF","rKDLJVIlwP","s7MxkfcwDa","gf8rIdmoS7","bZLvSOz8yZ",
+"U3yw5VNCPd","lXFOBJRJQB","HfyNQjS1aj","DG4sTB3qem","y94nwx3LDe","uJScXHlUbF","uAWypsuY4x","QYxC0ZUnqt","QworuZ4I1v","2ZHdkLewvM",
+"Cfgr3J2mQi","GXdoHpT8wu","hYBCK9XyT9","JRJQB9iGoT","hE1QlK4GS8","NOHsze6e4z","48cHLDLhzM","Mkgy8uJScX","l83Ud5Mg9r","7ku1pFNYIM",
+"hUTw7xciqp","WmadArhl0J","QssNCAmdQd","D6rBypvgjS","ksJby4QMc9","zbIYYLDk6f","aDGtSMK07Y","wDajXaFFss","he9IANxx9V","0PktItuDyS",
+"Ss0ZuReKEW","gjUTuyvOMI","StlDJIn3NS","K4GS829QAz","ciuWzrKDLJ","uQIczQworu","DG4sTd85a9","pT8wuGWqqX","5NammC2Irc","Waim6I7p2a",
+"s7Mxk5Drn0","zFgtBuvf7A","Yf2Eczz4ZU","StlDJsx5Gl","0YAGH07n1c","fqypycL0aE","RmDcr16lHc","9eoRcvLsmS","mz8gxiqv4k","JJs5m5ZaEz",
+"I7p2aMezSW","zHF1qlXFOB","DG4sTCqqaD","t98iWZUnqt","9eoRcRACuj","vLsmSAgJHQ","BGaQYFhtgl","he9IAAIYUu","gIYvENxx9V","lXFOBdmoS7",
+"SjskQTXQ0Z","TwanoChuy3","BCxeCHzZT8","pmeCdulk41","yvOMITCgPp","FVMxoYf2Ec","VjCZqblLA9","dQ586pvgjS","Yf2EcIBe8k","gf8rIVIlwP",
+"No0Qb4QMc9","tuDySuvf7A","s93MltvdkD","v2eC3aez9y","CdyBVpvgjS","8FmFHwiHrZ","CIShG8hJdt","8FmFHM6qcG","FFDuiYOfrY","O3iyQgIYvE",
+"ZhwG1uN6r3","MmKGJZ4I1v","dmoS7W7cTs","Y1mC0Uvlv4","hi5X7No0Qb","taOXKuJScX","JXljWlj07Q","7lUXZvkCHH","aFFssWaim6","HlUbFUvlv4",
+"lCMxyuoStw","bZLvSD6rBy","pv0i7cmXIX","GXdoHMaJQs","mX2GEwiHrZ","BbwgA0BmCy","J2mQi07n1c","07n1cFwEJz","nlaByBCxeC","5Drn0AmdQd",
+"WreyPUlU3M","I7p2a8TxD7","QClRLRxrsm","pFrrl5iGN5","J2mQiiwzGk","iB08lVerEA","MmKGJEdBKc","JKWYRDQimp","CxVEfbZLvS","mz8gxzHF1q",
+"FNYIMyluBx","AmdQdxciqp","oQ87rYOfrY","7fKYUQnJ1S","HRxd8HlUbF","uZPqgoVQp6","gf8rIZUnqt","Ul4a1he9IA","5Namm4QMc9","pAhR1RzaZA",
+"M6qcGGv3Fq","Gv3FqMojnP","tAOsrNAFuw","CIShGWaim6","07n1cZ4I1v","Z4I1vZUnqt","0MR5XlkMUA","hE1QluJScX","AmdQdAXpwE","HzZT855rfB",
+"K20wK7lUXZ","QWxoTjfREu","8FmFHRkQke","aFFsskB5nP","In3NStjQxs","IBe8kaez9y","jzUqRGWqqX","HfyNQk85Ae","M6qcGLDk6f","FxX9qRmDcr",
+"VerEAcL0aE","ydG8UOxWIH","4W0TllpF6W","CqqaDfLNg8","dhSuHcmXIX","7hyVvRkQke","kB5nPAXpwE","qUJMdCqqaD","v8yFNvOqCE","azIWpCfgr3",
+"sx5GloQ87r","QnJ1S14FLR","jzUqRogLgc","aL6AJGSQwj","vLsmSReKEW","pmeCdgf8rI","wiHrZOUYuF","euZA5GSQwj","OUYuFUl4a1","XyPZNK4GS8",
+"uTacxHP433","gf8rIfcwDa","FNYIM0PktI","AXpwEM6qcG","pv0i7fLNg8","fLNg8kZANm","ZJTXH7fKYU","uJScXRzaZA","RmDcri3pyd","guMb81v5hH",
+"Zv7z0iqv4k","lXFOByluBx","lkMUAZhwG1","uPX7GAmdQd","IRh48K4GS8","he9IAgf8rI","v8yFNWPmlx","jeskSs93Ml","n8pJ9brhlQ","2hEEUFGzgp",
+"L7cGcCfgr3","9y4lwhi5X7","GrDg7zQt6Q","HfyNQPYBf4","4QMc9TXQ0Z","t59lRbgJAz","I7p2aSmGzv","3weIFFGzgp","618DiM3zXL","lpF6WLbRTH",
+"jtn0Xtl72W","0ao3lStlDJ","6q6L9xReec","7X3uypT8wu","pvgjS8RCUA","SmGzvJJs5m","8U2nUciuWz","uupzkhE1Ql","5iGN5o8Uyd","JKWYRQbxXc",
+"0ao3lRsQUq","SWfouNAFuw","fcwDa6q6L9","Y1mC0n1pmO","TCgPpi7WMQ","FjHXR2DREs","jtn0XdhSuH","07n1cpvgjS","guMb8TXQ0Z","fcwDaMkgy8",
+"FwEJz8xEKz","POUYSi3pyd","s93MlhSSvQ","GXdoHblLA9","xciqp5VZjS","s7MxkydG8U","yvOMI7ku1p","gf8rIQnJ1S","45cIHQnJ1S","n8pJ9No0Qb",
+"P6bcg1j5L8","BFkb8Mkgy8","CNHmvHfyNQ","EdBKcSWfou","lCMxyhe9IA","5nmWvyluBx","Q6LixiKqhr","FhtglAgJHQ","qUJMdYw2oU","KASQ8FLsph",
+"HRxd8xciqp","SWfouWaWsv","lCMxylweGy","zY1GYhUTw7","580YD0ao3l","tAOsrv2eC3","he9IA2Yz7E","WPmlxCIShG","NcICAd85a9","OUqFM9iGoT",
+"7Ow5CuJScX","0PktIRxrsm","pWiOsIKxdL","BCxeCwiHrZ","F6PT2soy9t","Uvlv4Chuy3","29QAze6e4z","GSQwj64s8N","2Yz7EMojnP","0Wr5yru4UG",
+"FVMxoFjHXR","blLA9wiHrZ","GrDg7Dz1R3","jzUqRdhSuH","K20wKjfREu","tuDyS2TRI7","L7cGclXFOB","vOqCEAOgEe","tl72Wt59lR","kB5nPQChxs",
+"YOfrYaFFss","5Namm2Yz7E","SmGzvFGzgp","ECMvUYOfrY","uQIczkB5nP","dpe1vDcpWB","lCMxyb29RJ","AIYUu9rlg9","tvdkDeuZA5","8U2nUsuY4x",
+"MojnP16lHc","JRJQBzY1GY","kB5nPxReec","b29RJ0MR5X","GWqqX8cVD3","QnJ1SWPmlx","tvdkDzQt6Q","zbIYYsqVrf","faHiraFFss","8FmFHokgRi",
+"6q6L9sx5Gl","QssNCChuy3","s7Mxkv8yFN","iqv4kI7p2a","Cfgr3FGzgp","yToGW45cIH","1LB1LciuWz","gtCA59y4lw","C2IrcBFkb8","IBe8kF6PT2",
+"BbwgAv1Hln","CNHmvLbRTH","EdBKc580YD","zQt6Q0h1b1","pv0i72Yz7E","sx5GlydG8U","vLsmS4QMc9","Chuy34W0Tl","kZANmCfgr3","ogLgcpiJSk",
+"5IhmGlweGy","hE1QljS1aj","yluBxRsQUq","DcpWBhe9IA","5NammpT8wu","s93MlCxVEf","DG4sTF6PT2","XflUqXyPZN","azIWpCNHmv","7X3uyVjCZq",
+"atef2YOfrY","FjHXRbZLvS","JXljWNxx9V","5Drn0HP433","Oz8yZ2ZHdk","BCxeCFGzgp","8TxD7fLNg8","pAhR1y94nw","jeskSi7WMQ","FxX9qfaHir",
+"Chuy3m4bxU","cL0aEJ2mQi","s7MxkuTacx","sx5GlDQimp","fcJOy7lUXZ","O3iyQru4UG","8xEKzSs0Zu","Gv3FqnnP8o","Vprf27hyVv","hSSvQa00b5",
+"ThjNnxXTI4","M6qcGXflUq","gdQsSuJScX","v1HlnS77LH","Yh1hFDz1R3","8U2nUoVQp6","hi5X7K4GS8","WMiS3GXdoH","TXQ0Z0Kyfs","9y4lwgtCA5",
+"9y4lwtvdkD","7lUXZX6Pin","NOHszsx5Gl","soy9tJIqXi","7ku1pyEfy9","TXQ0Z9GXkX","S77LHQworu","v2eC37hyVv","XflUqt59lR","GrDg7QYxC0",
+"4W0Tli7WMQ","P6bcgni2v1","dQ58655rfB","16lHcUmaEv","v2eC3RBhp0","NcICArz7Ut","b29RJVNCPd","5Nammrz7Ut","vLsmSlCMxy","uLtKshi5X7",
+"FxX9qTwano","sx5Glni2v1","580YD1LB1L","StlDJVerEA","0PktI1LB1L","5nmWvF6PT2","gIYvERkQke","VNCPdCxVEf","AIYUuMmKGJ","0YAGHnnP8o",
+"ydG8UsqVrf","QssNC8RCUA","WmadABCxeC","SbRYyuLtKs","uTacxuLtKs","ZuDtDyEfy9","taOXKVBjhz","hi5X7dQ586","uZPqgKASQ8","RzaZArhl0J",
+"yvOMII7p2a","sqVrfaez9y","ogLgcEOE1o","Chuy3YOfrY","B3qemsuY4x","Twano0Wr5y","MojnPzY1GY","ix74rfqypy","a00b5kB5nP","OHaBzs93Ml",
+"IRh48IBe8k","s93MlB3qem","uoStwciuWz","0KyfstaOXK","s93MlIRh48","jtn0XpT8wu","5ZaEzIBe8k","5VZjSlsQGo","Mkgy8iB08l","d7vjM3weIF",
+"CNHmvoQ87r","tjQxsoGu6x","fcJOy6q6L9","d85a9iB08l","MezSWGSQwj","OHaBzGv3Fq","qUJMdjS1aj","dpe1vnlaBy","lpF6WFwEJz","In3NSNo0Qb",
+"ydG8UOUYuF","uN6r3NOHsz","n8pJ9RzaZA","SbRYyo8Uyd","DQimps93Ml","KsjRKIn3NS","hUTw77X3uy","brhlQqaofN","ThjNntvdkD","vOqCEJIqXi",
+"MK07Yn8pJ9","QbxXcQChxs","ZhwG1WreyP","Cfgr3hUTw7","2hEEUzmLYD","9y4lwjeskS","ZzJHWTCgPp","POUYSXyPZN","5iGN5FGzgp","DcpWBB3qem",
+"JRJQByEfy9","lViBvRBhp0","atef2QClRL","Kr8ysuvf7A","jeskSJXljW","Z4I1vhE1Ql","RkQkeDG4sT","Chuy3ThjNn","FGzgp9rlg9","he9IAMm8si",
+"618DiuAWyp","yofH3FwEJz","24ARFxReec","sqVrfRxrsm","Waim6ZuDtD","5VZjSFFDui","nlaBytl72W","LDk6fguMb8","LDk6f4QMc9","jfREuDG4sT",
+"JkzUnhe9IA","5nmWvv8yFN","soy9tfLNg8","MmsIoFcWrW","Gv3FqKZamH","5nmWvSjskQ","zY1GYMojnP","iwzGkMezSW","2Nslm5Drn0","UmaEvdQ586",
+"14FLRTa8f6","ru4UGTa8f6","FcWrWEdBKc","gjUTuAkKTk","cL0aEW3VFH","8hJdtlkMUA","J2mQiJkzUn","KZamH4QMc9","Mkgy8ix74r","2Yz7En8pJ9",
+"aez9yQbxXc","VIlwPDQimp","iwzGkMGlTF","YjB9t5Drn0","580YDHRxd8","GWqqXfcJOy","55rfBlm0pD","6q6L9In3NS","S2Dfuatef2","y94nwWPmlx",
+"8xEKzOUqFM","OHaBzt98iW","WMiS39eoRc","IRh48WaWsv","ydG8UZ4I1v","3otm6TCgPp","RBhp0e6e4z","KASQ87hyVv","RxrsmECMvU","Oz8yZn1pmO",
+"XyPZNJRJQB","5IhmGmX2GE","2NslmgtCA5","2ZHdkokgRi","Chuy3NhXdu","0Wr5yAOgEe","ru4UGguMb8","CqqaDdhSuH","RzaZAFGzgp","dhSuHhi5X7",
+"W3VFHLbRTH","ogLgcsoy9t","pWiOs9rlg9","IRh4824ARF","a00b5fqypy","b29RJzbIYY","lsQGocQOnv","zbIYYwDajX","JRJQBMGlTF","IjTwP5ZaEz",
+"soy9tRpBQm","FxX9qZv7z0","W7cTsQYxC0","pFrrlpT8wu","RpBQm2hEEU","2TRI7ReKEW","i7WMQtjQxs","Gv3Fqlj07Q","Ss0ZuciuWz","5iGN5uoStw",
+"7fsYMMezSW","euZA5ni2v1","2NslmtjQxs","0MR5XS2Dfu","AmdQduLtKs","FVMxoAIYUu","EoToPuQIcz","x3LDezz4ZU","jfREuMGlTF","fmIK10Wr5y",
+"dhSuHtjQxs","HfyNQFFDui","64s8NWmadA","ni2v1nnP8o","cShY2Uvlv4","Oz8yZQChxs","B3qemxciqp","7X3uy0h1b1","07n1crz7Ut","a00b5JKWYR",
+"zFgtBFFDui","9XyT9WaWsv","RBhp0FVMxo","atef2B3qem","RzaZAjS1aj","RpBQmiqv4k","S2DfuqaofN","tl72Wk85Ae","euZA5VIlwP","LewvMjtn0X",
+"RxrsmdQ586","0KyfsgjUTu","ogLgcQ6Lix","M3zXLECMvU","5Drn0MK07Y","x3LDe3otm6","C2IrcCdyBV","wDajXIBe8k","d7vjMFLsph","hE1Qlni2v1",
+"rz7UtuAWyp","OUYuFgdQsS","IBe8kl83Ud","580YDQ6hMC","Zv7z0ogLgc","uvf7A8U2nU","QClRL55rfB","cShY2rhl0J","Vprf2iKqhr","HfyNQ9GXkX",
+"5nmWvrKDLJ","suY4xGrDg7","VNCPdv2eC3","5drc6b29RJ","UlU3M14FLR","7fsYMG1RhS","8FmFHni2v1","Kr8ysgIYvE","vOqCESWfou","EoToPRBhp0",
+"gIYvEi7WMQ","9GXkXXyPZN","lweGyRzaZA","Q6Lix7lUXZ","C2IrcGSQwj","Twano5ZaEz","1LB1LSbRYy","VNCPdQ6Lix","dpe1vjzUqR","wDajXlkMUA",
+"FFDui1j5L8","6AFT0a00b5","DcpWB9rlg9","CK5W7NcICA","gjUTuIRh48","Z4I1vjS1aj","gIYvEVBjhz","djsrv9GXkX","zHF1qaL6AJ","5Mg9r5VZjS",
+"lm0pDYf2Ec","RACujlj07Q","CqqaDogLgc","e6e4zbgJAz","WMiS3Ta8f6","HRxd8Cfgr3","W7cTsHlUbF","RzaZAvLsmS","fmIK10h1b1","7hyVvcShY2",
+"bZLvSIjTwP","jiVBPblLA9","EoToPzmLYD","5drc6M6qcG","jzUqRfcJOy","ru4UG6AFT0","AOgEeOHaBz","Oz8yZ2TRI7","8FmFH6q6L9","Waim616lHc",
+"JIqXiTCgPp","e6e4zFFDui","QWxoTOxWIH","m4bxUlsQGo","UmaEvNhXdu","24ARFGXdoH","bZLvSMmKGJ","ThjNns93Ml","AmdQduupzk","64s8NMmsIo",
+"9y4lwWMiS3","ksJby0ao3l","Y1mC016lHc","Yh1hFTXQ0Z","8RCUAaFFss","07n1cCNHmv","fLNg8WmadA","CK5W7qQxHP","yvOMI1j5L8","yofH3XyPZN",
+"XflUqxciqp","NAFuwJJs5m","t98iWgdQsS","W3VFH8U2nU","4W0TlB3qem","TXQ0ZUl4a1","Yw2oUix74r","pFrrlWaWsv","yluBxzY1GY","VNCPdxXTI4",
+"ix74rIKxdL","FLsphfqypy","2hEEU0Kyfs","blLA9OUYuF","s7MxkB3qem","QbxXcZuDtD","2hEEUtvdkD","hSSvQOHaBz","zbIYYatef2","7hyVvzHF1q",
+"RzaZAjiVBP","29QAzCqqaD","RBhp0FcWrW","9eoRcI7p2a","lXFOBciuWz","lsQGolViBv","tvdkD24ARF","Q6LixaFFss","atef2aez9y","7ku1phYBCK",
+"vOqCEnlaBy","cL0aEECMvU","BGaQYtl72W","zHF1qVprf2","5Mg9rMkgy8","jSjS3KASQ8","uupzkSmGzv","FGzgp55rfB","In3NSfLNg8","QClRLVIlwP",
+"tl72WJ2mQi","aDGtS0BmCy","WaWsvUvlv4","faHir5VZjS","Cfgr3MGlTF","JIqXihi5X7","Ta8f6iKqhr","AOgEe8hJdt","Zv7z0hSSvQ","tlILtF6PT2",
+"HlUbFVNCPd","lpF6WL7cGc","8FmFHsuY4x","pT8wub29RJ","sx5GlcmXIX","i7WMQhe9IA","FVMxoWmadA","fmIK1s4786","QYxC0euZA5","QChxsk85Ae",
+"CK5W7k85Ae","hE1Ql9iGoT","hSSvQEoToP","oVQp6NOHsz","zFgtBlXFOB","pAhR1RACuj","RsQUqJ2mQi","aDGtS64s8N","7hyVvvkCHH","ThjNnlCMxy",
+"ECMvUGXdoH","QnJ1SlH1kt","lH1ktrz7Ut","CIShGfqypy","tvdkDHP433","Yh1hFLewvM","uupzkFLsph","5Mg9rNo0Qb","sx5GllkMUA","Cfgr3CxVEf",
+"Z4I1ve6e4z","MojnPzmLYD","DG4sTuAWyp","7hyVvYh1hF","Yh1hFPOUYS","jzUqRChuy3","MmsIoQClRL","lm0pDdQ586","cmXIXNo0Qb","Q6hMCMmKGJ",
+"NhXdujSjS3","vLsmSogLgc","iwzGkZzJHW","pWiOsIBe8k","zQt6QhE1Ql","hi5X7uoStw","MezSWMojnP","qQxHPzQt6Q","uoStwydG8U","HP433pAhR1",
+"CK5W7ydG8U","9XyT9Kr8ys","fFDrJ8cVD3","VBjhzNAFuw","SmGzv2hEEU","zFgtBCIShG","BpYhVcL0aE","lpF6WQYxC0","8xEKz7hyVv","Z4I1vpmeCd",
+"pWiOsyvOMI","QYxC0Yf2Ec","pWiOst98iW","48cHLaL6AJ","lH1ktfqypy","0h1b1jiVBP","atef2jeskS","OxWIHuPX7G","tvdkDThjNn","gf8rI5Drn0",
+"YOfrYK20wK","EdBKcSs0Zu","M6qcGW3VFH","Nxx9Vy94nw","YOfrYTwano","nFqikcmXIX","rhl0J7lUXZ","cShY2F6PT2","9GXkXZhwG1","ydG8U48cHL",
+"MGlTFcQOnv","P6bcgQChxs","JRJQBd7vjM","29QAzRACuj","xciqpRxrsm","oGu6x0PktI","CIShGv2eC3","faHirJXljW","07n1cJJs5m","BFkb8AkKTk",
+"ciuWzVIlwP","AkKTkZv7z0","6AFT05drc6","14FLRokgRi","jSjS3KsjRK","okgRi7fsYM","FNYIMpAhR1","QnJ1SUmaEv","n8pJ9S2Dfu","dQ5864W0Tl",
+"nlaByvkCHH","Kr8ysDG4sT","Pb1pa8TxD7","ECMvUK20wK","QnJ1SGXdoH","BFkb8l83Ud","CqqaDDG4sT","48cHLulk41","hi5X78U2nU","DQimp5VZjS",
+"cmXIXBbwgA","a00b5FxX9q","m4bxUDz1R3","Uvlv4LbRTH","aez9yFLsph","8TxD7hSSvQ","GXdoHfcwDa","jtn0XVprf2","RxrsmFjHXR","lkMUAtl72W",
+"uTacxMezSW","vOqCENcICA","FjHXRgf8rI","P6bcgTa8f6","1j5L8C2Irc","Q6LixK20wK","14FLRdpe1v","ulk41CNHmv","SmGzvn1pmO","IKxdLCqqaD",
+"BGaQYPb1pa","W7cTsyofH3","aez9yogLgc","G1RhSfcwDa","zFgtBn8pJ9","ECMvU9iGoT","TXQ0ZMezSW","8xEKzIBe8k","4dEz6NhXdu","uQIczsx5Gl",
+"PYBf4ydG8U","Cfgr3bZLvS","he9IAECMvU","tl72WuoStw","AgJHQYOfrY","vOqCEJXljW","IjTwPzHF1q","pAhR1jiVBP","vOqCErKDLJ","No0QbeuZA5",
+"I7p2aQbxXc","AmdQd24ARF","qQxHPxXTI4","aDGtSKASQ8","okgRi7Ow5C","atef2WreyP","45cIHGWqqX","LDk6flpF6W","CqqaDFGzgp","FjHXRcmXIX",
+"hSSvQ1LB1L","RsQUqzFgtB","zY1GYK20wK","MmsIoMojnP","rhl0J3weIF","zbIYYMK07Y","uLtKsciuWz","uupzkrKDLJ","BGaQYokgRi","RBhp05nmWv",
+"5iGN5zmLYD","0Wr5yZv7z0","xciqpprNT6","Yh1hF07n1c","d85a9hYBCK","GrDg75ZaEz","MmKGJvkCHH","YOfrY9XyT9","HP433618Di","7fsYMwDajX",
+"sqVrf1j5L8","o8Uydi3pyd","blLA9U3yw5","8U2nUzQt6Q","55rfB4W0Tl","m4bxUfqypy","jS1ajuZPqg","rhl0JoVQp6","WmadAaFFss","EoToPYw2oU",
+"AOgEeDLhzM","6AFT0iwzGk","FcWrWv8yFN","faHirKASQ8","4dEz6FGzgp","RsQUqIKxdL","pmeCdTwano","RzaZAi3pyd","3otm6Kr8ys","v8yFNokgRi",
+"POUYSZUnqt","FVMxoZuDtD","48cHLRmDcr","uTacxs4786","AOgEe7Ow5C","n1pmO14FLR","24ARFn8pJ9","hE1Ql5Namm","3otm6Fhtgl","gjUTusoy9t",
+"HP433YOfrY","uvf7A8hJdt","cmXIXxReec","4QMc9Pb1pa","pFrrlWPmlx","5Namms93Ml","cShY2piJSk","MojnPK4GS8","SmGzvuAWyp","Yf2EcnnP8o",
+"tlILtaDGtS","fFDrJ7hyVv","JkzUnZUnqt","sx5Gl2hEEU","VerEAIKxdL","EOE1oXflUq","48cHLlm0pD","tAOsrx3LDe","5drc6HRxd8","jS1aj8hJdt",
+"9y4lwRACuj","Ta8f6OUqFM","O3iyQMm8si","RkQkeBpYhV","IKxdLuJScX","7hyVvOz8yZ","gjUTuzbIYY","8U2nUoQ87r","Yw2oUuAWyp","U3yw5pT8wu",
+"i3pydjeskS","No0Qb4dEz6","ix74rDcpWB","KASQ8ZzJHW","8U2nUo8Uyd","ix74raL6AJ","WDVWJFGzgp","lViBvmz8gx","0h1b1zY1GY","jSjS3vLsmS",
+"uJScXCNHmv","2DREsUlU3M","2TRI7zHF1q","ydG8Un8pJ9","Ss0Zu7Ow5C","5ZaEzJIqXi","580YD8FmFH","n1pmOo8Uyd","DcpWBdhSuH","HfyNQjzUqR",
+"0BmCyuvf7A","QWxoT580YD","lXFOB6q6L9","9XyT9Gv3Fq","5VZjScmXIX","lsQGoTa8f6","pmeCd9GXkX","XyPZN8hJdt","wiHrZpAhR1","7fsYMWreyP",
+"OxWIHkZANm","lj07QHlUbF","jSjS3hUTw7","aez9yK20wK","9eoRcdQ586","KASQ8fmIK1","8xEKzVLTy6","2TRI7RkQke","yToGWfcwDa","jfREuQnJ1S",
+"Zv7z0RzaZA","7X3uyIKxdL","3otm6dpe1v","HlUbFVBjhz","FPfSEzmLYD","DG4sTQWxoT","djsrvkZANm","CxVEffaHir","In3NSix74r","uJScXLewvM",
+"SmGzv29QAz","IjTwP0YAGH","TCgPpm4bxU","RpBQmuupzk","Zv7z00Kyfs","5Drn0FPfSE","m4bxUoQ87r","lpF6Wlj07Q","7Ow5CzQt6Q","FVMxoK4GS8",
+"uvf7Axciqp","mz8gxEOE1o","vkCHH9eoRc","9GXkXHzZT8","8FmFHxciqp","jiVBPjtn0X","WPmlxjtn0X","dQ586y94nw","djsrvW7cTs","YOfrYpiJSk",
+"zHF1q9y4lw","BCxeCWMiS3","0h1b1BCxeC","Ss0Zurhl0J","aL6AJDz1R3","8FmFHSs0Zu","No0QbqQxHP","Yh1hFv8yFN","HRxd8x3LDe","OUqFMBFkb8",
+"xciqpaL6AJ","NhXdulCMxy","ZUnqtwDajX","m4bxUQ6Lix","7hyVv0PktI","ZhwG1RkQke","lkMUAuPX7G","4W0Tl7lUXZ","lweGyBGaQY","0KyfsnFqik",
+"6q6L9yofH3","HlUbF55rfB","brhlQ48cHL","8hJdtdhSuH","bgJAz6q6L9","sqVrfzbIYY","Ta8f6YOfrY","oQ87riKqhr","9rlg9pmeCd","8RCUA5VZjS",
+"6AFT0lweGy","fqypyI7p2a","tvdkDHzZT8","l83UdzFgtB","48cHLpiJSk","RzaZApAhR1","jeskSYf2Ec","lweGy5nmWv","a00b5WMiS3","uAWypLbRTH",
+"hSSvQlm0pD","Vprf2QYxC0","ZhwG1uvf7A","zbIYY1LB1L","djsrvrKDLJ","fmIK1ru4UG","wDajX2Nslm","RzaZAQ6Lix","4QMc9pAhR1","t59lR9XyT9",
+"zqH0Wdjsrv","O3iyQv2eC3","d7vjMzQt6Q","he9IAvLsmS","nFqikSjskQ","iwzGkWreyP","VBjhzrKDLJ","cmXIXgdQsS","gdQsSyvOMI","7lUXZatef2",
+"0ao3l0Kyfs","l83Udjtn0X","Kr8yslm0pD","5ZaEzyToGW","TCgPpFLsph","2Nslms4786","v8yFNJIqXi","BGaQYxReec","uPX7G0PktI","P6bcg14FLR",
+"WreyPydG8U","BFkb84QMc9","m4bxUSWfou","OxWIHcL0aE","WaWsv0BmCy","FjHXR580YD","M6qcG2DREs","rKDLJtl72W","jzUqRP6bcg","xReecIRh48",
+"dmoS7UlU3M","wiHrZ55rfB","cL0aEvkCHH","guMb8Yw2oU","guMb8ZJTXH","3otm6Twano","SmGzvlViBv","blLA9fLNg8","he9IAJRJQB","JJs5m29QAz",
+"K4GS8RACuj","NhXdu7hyVv","fLNg8aDGtS","Twanov1Hln","5Drn0NAFuw","9y4lwFLsph","MaJQsJKWYR","nlaByMmsIo","DcpWBI7p2a","0Kyfs8FmFH",
+"1j5L8ZUnqt","24ARFni2v1","Y1mC0ni2v1","aFFssDcpWB","0ao3lBCxeC","QbxXcWMiS3","8U2nUhi5X7","2hEEU5VZjS","bgJAz7Ow5C","IjTwPiB08l",
+"1j5L8gf8rI","qUJMdv1Hln","WreyPYw2oU","xXTI4jfREu","48cHLdmoS7","55rfBn1pmO","LDk6fWreyP","TCgPpprNT6","uAWypU3yw5","MGlTFBbwgA",
+"7ku1p8cVD3","JKWYRM6qcG","ThjNn8TxD7","0YAGHzz4ZU","nlaBy5drc6","VLTy6nnP8o","zQt6Qy94nw","POUYSQ6hMC","HRxd8oVQp6","lsQGoFxX9q",
+"Q6LixOxWIH","W7cTslpF6W","LewvMsqVrf","0BmCyUvlv4","fmIK1h1zcH","CNHmvThjNn","Z4I1vtAOsr","NOHszs7Mxk","5drc6Mkgy8","oGu6xRsQUq",
+"M3zXL55rfB","v1Hln2DREs","lViBv7X3uy","ogLgc7Ow5C","xReecYjB9t","v2eC3pT8wu","G1RhSsqVrf","MaJQs8xEKz","bZLvSpFrrl","VerEA5Mg9r",
+"AkKTkYh1hF","0h1b1CqqaD","W3VFHyofH3","yofH38TxD7","EdBKcIRh48","jSjS3oVQp6","rKDLJlkMUA","0PktIMojnP","gtCA5qUJMd","OUqFMCxVEf",
+"rhl0JtAOsr","FPfSEpT8wu","s4786FxX9q","AkKTkXflUq","SmGzvBpYhV","29QAzKZamH","a00b5fmIK1","mz8gxv8yFN","atef27Ow5C","AkKTkgIYvE",
+"tjQxsYOfrY","XyPZNPb1pa","b29RJiqv4k","JJs5mI7p2a","IjTwPgjUTu","GWqqXXyPZN","FNYIMUvlv4","WreyPaFFss","VjCZqa00b5","RxrsmSjskQ",
+"16lHclCMxy","nFqikW3VFH","uTacx45cIH","2hEEUyvOMI","OHaBzNhXdu","Fhtgl5Mg9r","pWiOsyToGW","fcJOyY1mC0","DQimpqaofN","QYxC0rz7Ut",
+"C2IrcBpYhV","2DREsvkCHH","dmoS7EOE1o","FhtglSs0Zu","ThjNnqaofN","OHaBzfaHir","No0QbGv3Fq","zFgtBgf8rI","n8pJ9zz4ZU","TwanolH1kt",
+"lkMUAbZLvS","OUYuF14FLR","oGu6x4QMc9","xXTI4BGaQY","8hJdtvkCHH","DcpWBK4GS8","618Di8FmFH","IKxdLpv0i7","6AFT0djsrv","jfREugjUTu",
+"prNT6WreyP","s7MxkLDk6f","FwEJzmz8gx","EOE1oi7WMQ","5iGN5OHaBz","2ZHdk5iGN5","7fsYMReKEW","29QAzFwEJz","1j5L8DG4sT","KsjRKXyPZN",
+"VNCPdUlU3M","QworuXflUq","8hJdtpT8wu","ciuWzTCgPp","D6rByDcpWB","0PktI0BmCy","e6e4zyofH3","cL0aEaFFss","uAWypCqqaD","tAOsrjfREu",
+"lViBvPYBf4","gf8rI2ZHdk","v1HlneuZA5","M6qcGrKDLJ","ReKEWlCMxy","TCgPpgIYvE","lCMxyS2Dfu","l83UdjeskS","kB5nPaFFss","Yw2oUzbIYY",
+"8FmFHTwano","3otm6pvgjS","8FmFHIn3NS","ZhwG1SmGzv","JXljW7Ow5C","uQIczVerEA","FFDuiWmadA","IRh48HRxd8","GWqqXjtn0X","O3iyQNOHsz",
+"7fsYM0MR5X","5ZaEzYOfrY","hSSvQjtn0X","v8yFNgjUTu","MK07Y6q6L9","hE1QlTa8f6","JKWYR2hEEU","07n1cU3yw5","suY4xQClRL","StlDJHlUbF",
+"jS1ajTCgPp","uZPqgRsQUq","Y1mC0Chuy3","y94nwdhSuH","jS1ajOHaBz","s93MlAOgEe","VBjhzNOHsz","VNCPdTa8f6","W7cTs9GXkX","07n1cRxrsm",
+"RsQUqLDk6f","zFgtBOxWIH","d7vjM8RCUA","0ao3lFNYIM","JRJQBlj07Q","8RCUACp3mZ","oGu6x0MR5X","taOXK0Wr5y","5drc6NhXdu","l83Udru4UG",
+"SmGzv5Namm","qaofNZzJHW","iB08lzbIYY","lpF6Wl83Ud","lsQGoix74r","tvdkDWaWsv","zHF1qOz8yZ","dpe1vHlUbF","16lHc2Nslm","xciqpF6PT2",
+"v1HlncL0aE","lXFOBguMb8","7fsYMB3qem","qUJMdzY1GY","uvf7AkZANm","lkMUAzFgtB","JRJQBy94nw","BpYhVRpBQm","FhtglM6qcG","okgRizz4ZU",
+"cL0aE9iGoT","ix74rGWqqX","FwEJzCqqaD","uupzklpF6W","yEfy9pv0i7","07n1cuQIcz","zQt6QMK07Y","fFDrJxXTI4","uJScX7X3uy","2NslmhSSvQ",
+"h1zcHX6Pin","fmIK1MaJQs","xReecWaim6","qUJMdBpYhV","m4bxUHRxd8","fFDrJlViBv","djsrvvOqCE","J2mQiRxrsm","2hEEUZuDtD","G1RhSZUnqt",
+"1LB1LdhSuH","Ss0ZuZuDtD","ZUnqtulk41","CdyBVXyPZN","S2Dfu580YD","uN6r3I7p2a","U3yw5WaWsv","2ZHdkRkQke","LewvMnlaBy","FVMxoJkzUn",
+"AmdQduvf7A","okgRiRzaZA","6q6L9YOfrY","bgJAzogLgc","VerEA9y4lw","fcJOy8FmFH","n1pmOs93Ml","aL6AJvLsmS","QbxXcn1pmO","cShY2aL6AJ",
+"ZzJHW64s8N","iqv4kFLsph","zbIYYt59lR","aez9yAkKTk","1LB1Llm0pD","Chuy3pvgjS","iwzGklm0pD","hSSvQcShY2","Vprf2ZzJHW","VNCPdJkzUn",
+"Mkgy87fsYM","FjHXR55rfB","RpBQmaez9y","prNT6ulk41","lkMUAQClRL","9rlg9SjskQ","RkQkesqVrf","EoToPJkzUn","Q6hMCZUnqt","taOXK4W0Tl",
+"I7p2aD6rBy","5ZaEzokgRi","wiHrZAXpwE","OUYuF5Mg9r","Dz1R3Qworu","4dEz6FVMxo","xciqphSSvQ","lj07QVNCPd","2TRI7No0Qb","K4GS8yEfy9",
+"h1zcHQnJ1S","qUJMdwiHrZ","i3pydZuDtD","wDajXBCxeC","i7WMQBbwgA","SbRYy4W0Tl","JKWYR8RCUA","HlUbFtaOXK","sqVrflm0pD","iB08lsqVrf",
+"tlILt16lHc","cmXIXVLTy6","YOfrYLewvM","cmXIXbrhlQ","a00b5l83Ud","FFDuiyEfy9","Q6hMCB3qem","tl72WjSjS3","0KyfsECMvU","0h1b1oQ87r",
+"zQt6Q7lUXZ","Fhtglv8yFN","jtn0XdQ586","1LB1LQChxs","Uvlv4Qworu","LDk6fCp3mZ","AgJHQFNYIM","0BmCyDz1R3","pFrrllpF6W","ZhwG1JkzUn",
+"QbxXcrz7Ut","JkzUnk85Ae","4QMc95ZaEz","b29RJ14FLR","6AFT0bgJAz","vLsmSJ2mQi","iqv4kRzaZA","9eoRcnnP8o","uupzkqQxHP","vkCHHfcJOy",
+"Chuy3y94nw","7lUXZ3otm6","yToGWm4bxU","VBjhzZzJHW","dhSuHuoStw","L7cGcBpYhV","aFFssFPfSE","FxX9q55rfB","LDk6fi7WMQ","9eoRc580YD",
+"v2eC35Drn0","FVMxozmLYD","jiVBPvLsmS","y94nwjfREu","zQt6QQworu","YOfrYW3VFH","gf8rI6AFT0","WaWsvtAOsr","cShY2lH1kt","s93MlciuWz",
+"S77LHBGaQY","cmXIXhYBCK","5iGN5bZLvS","S77LHiwzGk","1v5hH7hyVv","cmXIX2Nslm","pFrrlI7p2a","uupzkMK07Y","TXQ0ZKr8ys","Dz1R3soy9t",
+"fmIK1uPX7G","uN6r3lm0pD","VLTy6gjUTu","WmadAQworu","1LB1LxXTI4","yluBxJKWYR","AIYUuJkzUn","gdQsSEoToP","WMiS3K4GS8","4W0TlIBe8k",
+"9rlg9brhlQ","Ss0Zuzz4ZU","48cHL2Nslm","iqv4kYOfrY","Vprf2Oz8yZ","0PktIQYxC0","45cIHjiVBP","pFrrl8U2nU","uTacx5Drn0","Waim6JRJQB",
+"piJSkYjB9t","FNYIMzFgtB","s93MlG1RhS","IKxdL5Drn0","HlUbFlViBv","14FLRRmDcr","POUYSfFDrJ","hi5X70MR5X","JXljWCdyBV","W3VFHuZPqg",
+"L7cGcJKWYR","I7p2apFrrl","k85AeMmsIo","VBjhzlViBv","ZUnqtatef2","SbRYylj07Q","KASQ8QWxoT","mX2GEQbxXc","e6e4zhYBCK","4W0TlGSQwj",
+"G1RhSulk41","C2IrcGrDg7","faHirZv7z0","fcJOylXFOB","faHir29QAz","IjTwPOxWIH","jfREuuvf7A","iwzGk55rfB","jSjS3MezSW","KsjRKaez9y",
+"yToGWVprf2","cQOnvvLsmS","0h1b1LbRTH","5Drn0QChxs","xReecfcJOy","WaWsvksJby","h1zcHK20wK","hE1Ql9rlg9","bgJAzHzZT8","1v5hH0h1b1",
+"vLsmSQssNC","Waim6ix74r","n1pmOIKxdL","v1HlnMezSW","1v5hHjSjS3","jeskSZv7z0","9iGoTYh1hF","5Mg9ruPX7G","fcwDaCIShG","QnJ1SzY1GY",
+"PYBf4uoStw","ZUnqtsoy9t","8TxD7W7cTs","wiHrZGv3Fq","jzUqRguMb8","O3iyQatef2","M3zXLt98iW","blLA9No0Qb","JJs5mUlU3M","GSQwjgf8rI",
+"8hJdtWPmlx","OUYuFFnPFB","Waim6AkKTk","vkCHHeuZA5","2TRI7DQimp","AkKTkOxWIH","K4GS82Nslm","rhl0Ji3pyd","48cHLQnJ1S","s7MxkciuWz",
+"ZhwG1ZhwG1","CqqaDbgJAz","Cfgr3WPmlx","jeskSix74r","7lUXZbrhlQ","C2Irc3otm6","HfyNQUlU3M","pvgjSlsQGo","DG4sTZuDtD","8hJdtQ6Lix",
+"IKxdLOUYuF","rKDLJGSQwj","dhSuH64s8N","5VZjSDLhzM","4dEz6fFDrJ","MojnPHfyNQ","JkzUnfcwDa","EdBKc0h1b1","yToGW0h1b1","xciqptlILt",
+"P6bcg5Mg9r","GSQwjReKEW","Qworu0YAGH","oVQp6IBe8k","2NslmDG4sT","uupzkFVMxo","2Yz7EPOUYS","NOHszB3qem","v2eC3Q6Lix","lsQGouN6r3",
+"jS1ajSmGzv","djsrvFcWrW","7lUXZs93Ml","K4GS8djsrv","55rfBMK07Y","sx5GlEOE1o","lViBvSWfou","ZhwG1HfyNQ","I7p2a618Di","hSSvQJXljW",
+"7fKYUNOHsz","FFDuiIjTwP","lXFOBVerEA","ZzJHWtlILt","5drc6zmLYD","L7cGcgjUTu","PYBf4HlUbF","580YDjtn0X","MK07YjfREu","ogLgcS2Dfu",
+"FxX9qVIlwP","CdyBVVprf2","FNYIMSWfou","pAhR1tuDyS","W7cTsRmDcr","SjskQqUJMd","brhlQ9XyT9","soy9tBbwgA","lViBvJkzUn","Z4I1vWPmlx",
+"zY1GYRBhp0","cmXIXsqVrf","45cIHBFkb8","9y4lw7lUXZ","iqv4kTCgPp","7fKYUksJby","0h1b1D6rBy","nnP8oyToGW","Chuy3QYxC0","v1HlnBGaQY",
+"3weIFUvlv4","55rfB9iGoT","1j5L8jtn0X","RkQkeXyPZN","7hyVvFjHXR","45cIH64s8N","IKxdLDz1R3","PYBf4EdBKc","pT8wuFjHXR","jfREuBCxeC",
+"VerEAsx5Gl","gjUTubrhlQ","0PktIuAWyp","29QAzjzUqR","fFDrJbrhlQ","okgRi9XyT9","ulk412hEEU","yofH3gf8rI","JKWYRAkKTk","9y4lwZUnqt",
+"uoStw0PktI","xciqpWMiS3","x3LDexReec","wDajXHRxd8","nnP8oJJs5m","JJs5mEOE1o","X6PingtCA5","Waim60YAGH","uN6r3OxWIH","VBjhz5nmWv",
+"cL0aEFVMxo","pWiOsPb1pa","GWqqXuAWyp","LewvMiKqhr","Mm8siCp3mZ","Cp3mZOUqFM","mz8gxD6rBy","ogLgc0BmCy","No0Qbru4UG","Ss0ZuMm8si",
+"7lUXZgdQsS","AkKTkIRh48","BbwgAOUYuF","BbwgAyluBx","dpe1vNo0Qb","xReecZhwG1","BCxeCNAFuw","AIYUu8hJdt","C2IrcNAFuw","gf8rICNHmv",
+"RxrsmSbRYy","RzaZAcShY2","X6Pinrhl0J","64s8NJXljW","DLhzMLbRTH","2DREsjeskS","tuDyS9XyT9","MaJQsGWqqX","v2eC3FnPFB","mz8gx9y4lw",
+"pmeCdtl72W","rz7UtLbRTH","jiVBPS2Dfu","9y4lwYOfrY","0ao3lYf2Ec","9rlg9Cp3mZ","o8UydNcICA","BCxeCru4UG","ydG8UiKqhr","MGlTFKASQ8",
+"blLA9POUYS","HlUbFD6rBy","580YDQssNC","t59lRVerEA","7fKYUzY1GY","faHirEoToP","0BmCylsQGo","5Mg9rFnPFB","KZamHC2Irc","Ul4a1xciqp",
+"rKDLJQnJ1S","ZzJHWDcpWB","zmLYDl83Ud","zbIYYhSSvQ","tAOsrJXljW","yEfy9i3pyd","NhXduNOHsz","o8Uyd4W0Tl","taOXKTXQ0Z","HlUbFKr8ys",
+"Mkgy8ReKEW","MK07YXflUq","t98iWQ6hMC","LewvM8FmFH","djsrvM3zXL","uvf7A29QAz","Dz1R3zbIYY","zz4ZUFFDui","FnPFBMojnP","uvf7AIn3NS",
+"ogLgcJKWYR","pT8wun8pJ9","6AFT05iGN5","2hEEUh1zcH","guMb8Pb1pa","jeskSKsjRK","sqVrf1LB1L","pv0i7Mm8si","5Drn0OUqFM","U3yw5OxWIH",
+"DcpWBfcwDa","FGzgpWPmlx","0BmCypiJSk","fcwDa8TxD7","0BmCyJkzUn","oVQp6AIYUu","Y1mC0StlDJ","nnP8o4dEz6","hUTw7soy9t","7ku1p7fsYM",
+"VIlwP2TRI7","8hJdtFNYIM","vOqCEcmXIX","nnP8oMm8si","BpYhVbZLvS","RmDcruQIcz","ZhwG1lweGy","24ARF2Nslm","JKWYROz8yZ","vOqCEFnPFB",
+"oVQp6qaofN","F6PT2qaofN","K20wKhSSvQ","v1HlnFLsph","vLsmSjSjS3","rhl0Jn1pmO","D6rByCqqaD","faHirGv3Fq","55rfBkB5nP","S77LHNo0Qb",
+"5ZaEzwDajX","7fKYUOUYuF","RkQkekZANm","Zv7z0JJs5m","B3qemzz4ZU","Gv3Fqgf8rI","yofH3WPmlx","0ao3lMojnP","pWiOsQnJ1S","vLsmSi3pyd",
+"KsjRKs93Ml","7hyVv2hEEU","ZuDtDaL6AJ","dhSuHgdQsS","m4bxUW7cTs","hYBCKxXTI4","YOfrY0h1b1","atef2Qworu","tlILtjtn0X","Nxx9VQworu",
+"QWxoT1j5L8","lkMUA5VZjS","QWxoTjzUqR","taOXKJKWYR","TwanoZuDtD","5NammRkQke","dpe1vjtn0X","0BmCyPYBf4","jfREuQChxs","6AFT0mX2GE",
+"RkQkeFNYIM","sx5Gl5Drn0","NOHsz14FLR","h1zcHdQ586","ZzJHWvkCHH","XyPZNCNHmv","QChxslj07Q","soy9tXyPZN","FxX9qCNHmv","BbwgAUl4a1",
+"AmdQdZ4I1v","ciuWzs7Mxk","Pb1paFPfSE","S2DfuCdyBV","RBhp08TxD7","9eoRchE1Ql","WmadAIBe8k","NcICAQnJ1S","EdBKcVBjhz","TCgPpQChxs",
+"StlDJ07n1c","7Ow5CNAFuw","GrDg79iGoT","s93MlcL0aE","5IhmGRACuj","BGaQY5ZaEz","xciqp5Mg9r","he9IAix74r","okgRiYw2oU","uAWypQClRL",
+"3otm6dmoS7","1j5L8ru4UG","0BmCyt98iW","FnPFBVBjhz","Z4I1vrhl0J","uvf7AMaJQs","Kr8ysGv3Fq","GSQwjFjHXR","t98iWW7cTs","RzaZAxXTI4",
+"KASQ89XyT9","aL6AJBbwgA","he9IAUvlv4","lm0pDokgRi","Dz1R34QMc9","OHaBzEdBKc","618DiBbwgA","oGu6xP6bcg","WmadAFhtgl","O3iyQG1RhS",
+"tAOsrRmDcr","OUYuFeuZA5","v8yFNIn3NS","vkCHH8xEKz","gf8rIXyPZN","6q6L9pv0i7","pAhR1RpBQm","RmDcrpiJSk","1LB1LVBjhz","48cHLOxWIH",
+"Vprf2DcpWB","FNYIMWPmlx","uTacxQClRL","9y4lwgdQsS","Q6Lix48cHL","oVQp6s4786","ciuWzdjsrv","fcwDasqVrf","zmLYDs7Mxk","lH1ktl83Ud",
+"QClRLKsjRK","4QMc9BbwgA","lpF6WVNCPd","AgJHQblLA9","sqVrf24ARF","tlILtpmeCd","AgJHQ16lHc","SbRYy5Drn0","y94nw45cIH","16lHc7ku1p",
+"Qworu5ZaEz","v8yFN1v5hH","azIWp5iGN5","0h1b1fFDrJ","No0QbyluBx","QbxXcHlUbF","5drc6IBe8k","07n1cpmeCd","JXljWs7Mxk","7lUXZNOHsz",
+"MGlTFD6rBy","IjTwPCfgr3","VerEAzQt6Q","BCxeCgIYvE","JKWYRBCxeC","dmoS7mz8gx","IRh48Ss0Zu","jSjS3oQ87r","QbxXcsx5Gl","Pb1paMmsIo",
+"FjHXRtAOsr","aDGtS0ao3l","SjskQX6Pin","tl72WQbxXc","AmdQdHfyNQ","cQOnv5nmWv","atef2uAWyp","rhl0J8cVD3","4dEz69eoRc","i3pydIBe8k",
+"uPX7GfcwDa","3otm6hYBCK","cL0aE8FmFH","CxVEfQworu","nnP8ofmIK1","yEfy9gIYvE","fcJOytvdkD","UmaEv2Nslm","5IhmGfcJOy","lpF6WiwzGk",
+"zmLYDJXljW","FFDui618Di","M3zXLm4bxU","gIYvEokgRi","NOHszkZANm","5drc6kZANm","SWfouTwano","8cVD3zFgtB","tuDySAOgEe","2NslmNcICA",
+"QYxC0Nxx9V","14FLRm4bxU","P6bcgv8yFN","XyPZNs93Ml","oQ87rQChxs","gdQsS8cVD3","vkCHHKsjRK","tl72WzQt6Q","QssNC7fsYM","5ZaEz0ao3l",
+"dpe1vUlU3M","QChxsOUYuF","ZzJHWn8pJ9","cL0aEwDajX","bgJAzpvgjS","QssNCxXTI4","QnJ1SfLNg8","tjQxst59lR","AXpwExXTI4","taOXKHP433",
+"ydG8U9iGoT","dmoS7Qworu","pT8wugdQsS","ECMvUbZLvS","brhlQnlaBy","Gv3FqLewvM","i7WMQ2hEEU","X6PinblLA9","aL6AJYf2Ec","aez9yW7cTs",
+"kB5nP8cVD3","9rlg9Pb1pa","dhSuHgf8rI","QClRLuoStw","D6rByGWqqX","jtn0XPb1pa","lweGyRkQke","pFrrlNhXdu","faHireuZA5","D6rBy4QMc9",
+"RzaZADQimp","gf8rIOxWIH","fFDrJPOUYS","Gv3Fqi7WMQ","TCgPpRmDcr","0YAGHgdQsS","rKDLJa00b5","4dEz60PktI","d85a9tuDyS","gtCA5zQt6Q",
+"P6bcg3weIF","IKxdLZUnqt","pFrrlQworu","8U2nUJJs5m","W3VFHZv7z0","0BmCy24ARF","JJs5mSWfou","soy9tO3iyQ","RkQkeQssNC","uvf7AvkCHH",
+"580YDyofH3","No0QbFhtgl","G1RhSa00b5","VLTy6FGzgp","U3yw5kB5nP","d7vjMtaOXK","XflUqSs0Zu","Ul4a1djsrv","prNT6BFkb8","FLsphFxX9q",
+"jtn0X2ZHdk","OHaBzi7WMQ","JJs5m0PktI","ZJTXHMGlTF","5iGN50YAGH","yluBxBCxeC","pFrrl3weIF","CqqaDHRxd8","580YDLDk6f","yvOMI07n1c",
+"bgJAzXflUq","Kr8ys45cIH","IRh48I7p2a","5Mg9rPYBf4","lkMUAtuDyS","AIYUul83Ud","IBe8knlaBy","pvgjSfqypy","DLhzM2Nslm","n1pmOFhtgl",
+"TwanoNxx9V","9GXkXl83Ud","Kr8ys0MR5X","W7cTsn1pmO","pv0i7blLA9","suY4xMm8si","FFDuiIKxdL","nlaByVerEA","qUJMds93Ml","2Yz7EzHF1q",
+"VBjhzGrDg7","I7p2aksJby","n1pmOsqVrf","8hJdtRsQUq","FwEJzJJs5m","s7Mxkzz4ZU","VNCPdkB5nP","14FLRdQ586","k85AevkCHH","ydG8UlViBv",
+"J2mQis4786","d7vjMF6PT2","NcICAAkKTk","SWfoufcwDa","Cfgr3uPX7G","ni2v1ZzJHW","EoToPNxx9V","StlDJh1zcH","UmaEvlkMUA","tvdkDni2v1",
+"cL0aESjskQ","cL0aECIShG","uoStwdjsrv","Vprf20h1b1","vLsmSFFDui","2Yz7EEdBKc","pvgjSgf8rI","K4GS8iwzGk","suY4xuN6r3","14FLRQbxXc",
+"yofH3fmIK1","hUTw7QYxC0","Chuy3MojnP","ru4UGMojnP","oVQp6iqv4k","DcpWBkZANm","t59lRe6e4z","MK07YMezSW","aDGtSdjsrv","y94nwuAWyp",
+"J2mQiMmKGJ","JkzUn55rfB","JRJQBrz7Ut","6AFT0TCgPp","OUqFMjtn0X","ni2v1Ul4a1","LewvMLbRTH","QClRLdpe1v","VLTy6Uvlv4","6AFT0sx5Gl",
+"UlU3MsuY4x","0KyfsEoToP","MezSW8RCUA","GXdoHkZANm","580YDyToGW","lsQGoTwano","atef2n8pJ9","aez9yJkzUn","Z4I1v8FmFH","K4GS8ZzJHW",
+"euZA5yToGW","Yh1hF1v5hH","OxWIHNOHsz","jtn0XYw2oU","I7p2aTa8f6","rKDLJ8RCUA","ECMvUD6rBy","64s8NX6Pin","Z4I1vBbwgA","BbwgA5ZaEz",
+"jSjS3wDajX","lweGyNhXdu","ReKEW5Drn0","NcICAKr8ys","4QMc9zqH0W","pv0i7SWfou","s4786xReec","D6rByRkQke","mX2GEdhSuH","W3VFHmz8gx",
+"FxX9qYOfrY","8hJdttjQxs","9GXkXEdBKc","3weIFgtCA5","Vprf2jtn0X","8TxD7FxX9q","7Ow5C9iGoT","ZzJHWZJTXH","WPmlx5VZjS","yEfy9zY1GY",
+"U3yw5ZJTXH","UlU3M5IhmG","wiHrZjfREu","DLhzMyEfy9","uoStwWmadA","gdQsSlj07Q","pAhR114FLR","HP433ksJby","iB08l7fsYM","U3yw5CqqaD",
+"EdBKc8U2nU","tlILtydG8U","pmeCdjiVBP","HzZT8xciqp","Nxx9V5Mg9r","5drc60Kyfs","M3zXL0h1b1","tlILtOHaBz","zQt6QQ6Lix","EdBKc7X3uy",
+"QClRL0BmCy","QWxoTt98iW","8RCUA07n1c","YOfrYQYxC0","RsQUqWmadA","ksJbyQbxXc","GrDg7jSjS3","ydG8UQ6hMC","iqv4kn8pJ9","DcpWBBCxeC",
+"tAOsrrhl0J","J2mQid7vjM","CIShGzbIYY","M6qcGVNCPd","qaofNVerEA","MGlTF5iGN5","UmaEvuvf7A","zqH0WCp3mZ","Q6Lix8hJdt","MmKGJFhtgl",
+"soy9tIBe8k","X6PintaOXK","DQimpoVQp6","Y1mC0fFDrJ","3otm6MaJQs","CNHmvd85a9","aez9yJIqXi","StlDJvLsmS","PYBf4ni2v1","GSQwjaFFss",
+"DG4sT0YAGH","FcWrWUlU3M","0BmCyJ2mQi","RpBQmPOUYS","sqVrf0PktI","1LB1L0BmCy","i3pydlj07Q","FNYIM55rfB","0ao3li3pyd","ZuDtDStlDJ",
+"GSQwjQWxoT","8xEKzuupzk","618DiQnJ1S","iwzGkS2Dfu","fcJOyOUqFM","2DREsFjHXR","ZuDtDPYBf4","CqqaDlm0pD","JJs5ms4786","PYBf4yToGW",
+"fmIK1VBjhz","Qworuuvf7A","SmGzvrhl0J","WDVWJwDajX","s93MlFNYIM","djsrvjiVBP","i7WMQRmDcr","24ARFLewvM","5iGN5lj07Q","mX2GELewvM",
+"I7p2a64s8N","nFqik5ZaEz","8xEKzECMvU","2TRI7okgRi","pT8wu7ku1p","hE1QluoStw","Twanoe6e4z","48cHLQ6Lix","sx5GlMojnP","Q6hMCRzaZA",
+"ZzJHWBpYhV","HfyNQnFqik","b29RJx3LDe","kB5nPhE1Ql","5iGN5fqypy","O3iyQs4786","IBe8kbrhlQ","nFqikWPmlx","UmaEvl83Ud","dpe1vtaOXK",
+"I7p2aCp3mZ","MmKGJGSQwj","NAFuwWPmlx","Gv3FqNAFuw","azIWpydG8U","VjCZqpv0i7","FxX9qoVQp6","DQimpTCgPp","rhl0JnnP8o","Dz1R34dEz6",
+"NcICA618Di","brhlQNAFuw","IBe8kUmaEv","nFqikCfgr3","4dEz6zY1GY","FxX9qRsQUq","EOE1ouTacx","fFDrJRACuj","In3NSlm0pD","OHaBzlkMUA",
+"rKDLJoGu6x","ZuDtDS2Dfu","fmIK1uvf7A","QChxsgjUTu","WPmlxL7cGc","OUqFMk85Ae","4W0TlStlDJ","fmIK1Z4I1v","jeskSaL6AJ","s93MlsqVrf",
+"rz7UtMGlTF","AmdQdpmeCd","wiHrZI7p2a","uLtKsdhSuH","Mkgy87ku1p","QClRLQ6hMC","K20wK7hyVv","5iGN5jS1aj","uZPqgJKWYR","YjB9tsqVrf",
+"24ARFd85a9","CNHmvbgJAz","gdQsSn1pmO","WmadAXyPZN","ni2v1LewvM","48cHLRBhp0","6AFT0Q6hMC","0ao3l9GXkX","IKxdL29QAz","vLsmScL0aE",
+"vkCHHTa8f6","NcICAIjTwP","MmKGJfLNg8","cShY2okgRi","Dz1R3No0Qb","W3VFHQ6hMC","LbRTHo8Uyd","OHaBzAOgEe","x3LDe9y4lw","BGaQYKsjRK",
+"zmLYD5ZaEz","nnP8ogdQsS","PYBf4ix74r","7ku1pt98iW","XflUqKASQ8","pmeCd9y4lw","VBjhzMGlTF","wiHrZzmLYD","i7WMQIBe8k","hSSvQIKxdL",
+"JKWYRC2Irc","KsjRKCfgr3","pmeCdGrDg7","24ARFCNHmv","0MR5XlViBv","8U2nUZ4I1v","Y1mC06AFT0","0MR5XHRxd8","iwzGkoVQp6","16lHckZANm",
+"yToGWnlaBy","BFkb81j5L8","KASQ8GrDg7","rhl0JkZANm","WaWsv9y4lw","yEfy98U2nU","W3VFHMK07Y","AXpwEru4UG","XyPZNh1zcH","pvgjSMm8si",
+"pvgjSLbRTH","QChxs8U2nU","1v5hHCIShG","FcWrWRzaZA","FxX9qwDajX","OUqFM0h1b1","WaWsvoVQp6","YjB9tgIYvE","6AFT0618Di","QbxXcl83Ud",
+"IjTwPNhXdu","B3qemWMiS3","dQ5868cVD3","prNT6yluBx","v8yFNTXQ0Z","t98iWt59lR","1j5L87Ow5C","fqypyIjTwP","3weIFaez9y","BbwgAYjB9t",
+"EoToPjiVBP","BCxeCTwano","0YAGHjtn0X","xXTI4o8Uyd","RxrsmaL6AJ","KASQ8QYxC0","uupzkIjTwP","5NammNAFuw","Cfgr3Waim6","QssNCQworu",
+"Twano9eoRc","tl72WblLA9","KASQ8ydG8U","Ta8f6tlILt","azIWpFwEJz","tjQxscL0aE","UlU3MNOHsz","5Nammy94nw","a00b5Zv7z0","RkQkeGXdoH",
+"kZANmGv3Fq","LbRTHuPX7G","Uvlv4n1pmO","YjB9tuN6r3","tlILtuQIcz","tAOsrsoy9t","S77LHtvdkD","8FmFHZv7z0","mz8gx1j5L8","JIqXi64s8N",
+"8xEKz55rfB","aFFssVprf2","nnP8ogIYvE","0BmCyMaJQs","ZuDtDazIWp","Yh1hFtjQxs","7fsYMa00b5","o8Uyd0Kyfs","29QAzZv7z0","fqypydmoS7",
+"CK5W7fLNg8","5iGN5aFFss","ReKEWTa8f6","SmGzvCxVEf","n8pJ9pmeCd","TwanoHRxd8","jiVBPn8pJ9","OUYuFP6bcg","guMb8jzUqR","pv0i79GXkX",
+"oQ87rW7cTs","y94nwdQ586","XyPZNRBhp0","ZJTXH3otm6","d7vjMdpe1v","he9IAqQxHP","rKDLJaDGtS","lH1ktvOqCE","k85AeMezSW","Vprf20ao3l",
+"CK5W7atef2","QChxsMojnP","S2Dfuy94nw","QChxsDG4sT","Cfgr3XyPZN","ni2v1MGlTF","qUJMduupzk","mX2GEVprf2","OUYuFtl72W","FLsphd7vjM",
+"FwEJzAXpwE","8hJdtlCMxy","FNYIM2DREs","9GXkX45cIH","VNCPdIBe8k","ThjNny94nw","FhtglZzJHW","F6PT2taOXK","zHF1qpv0i7","14FLRJKWYR",
+"FnPFBsx5Gl","5ZaEzVjCZq","wDajXQClRL","oQ87r4W0Tl","2NslmoVQp6","SWfouRkQke","aL6AJiB08l","xXTI4nlaBy","h1zcHW7cTs","Chuy3JXljW",
+"RBhp0UmaEv","cL0aEgdQsS","zY1GY7fsYM","fFDrJDcpWB","QWxoTuvf7A","8hJdt4dEz6","QssNCy94nw","qUJMdPb1pa","Yf2EcNo0Qb","HlUbFEOE1o",
+"RxrsmFwEJz","mz8gxQssNC","HlUbFP6bcg","PYBf4nFqik","SjskQKr8ys","cQOnvS77LH","3otm6Yf2Ec","ZhwG1zY1GY","Q6LixciuWz","WMiS3MGlTF",
+"RkQkev1Hln","ni2v1KZamH","atef2HRxd8","taOXKUl4a1","mX2GEm4bxU","ZUnqtzY1GY","dQ586Uvlv4","lXFOB9XyT9","atef2uupzk","0KyfsK20wK",
+"CIShGuQIcz","iwzGkJkzUn","Yh1hFix74r","CK5W7Uvlv4","FLsphyvOMI","jfREu9eoRc","jSjS3zmLYD","nnP8omz8gx","0h1b1tjQxs","i7WMQwiHrZ",
+"7fKYU2TRI7","0MR5Xh1zcH","8cVD35drc6","jfREuRACuj","n1pmOYh1hF","M3zXLFhtgl","7ku1pVBjhz","7ku1pMGlTF","AIYUu2Yz7E","K20wKzQt6Q",
+"Ul4a1taOXK","nnP8oBpYhV","zHF1qECMvU","HRxd8Ta8f6","F6PT2J2mQi","YOfrYOUqFM","2NslmRACuj","FcWrWyofH3","IjTwPUmaEv","FGzgpUlU3M",
+"SjskQs7Mxk","HfyNQ8U2nU","0PktIyofH3","8U2nUmz8gx","i7WMQ5Mg9r","yluBxW3VFH","14FLR9eoRc","5iGN5uZPqg","Ul4a1rKDLJ","v1HlnnFqik",
+"5drc6zz4ZU","DG4sTRmDcr","n8pJ9MaJQs","yofH3nFqik","nlaBySbRYy","tAOsrSWfou","0PktIjzUqR","QbxXc0MR5X","VBjhzWPmlx","IBe8khE1Ql",
+"MojnPFGzgp","TXQ0Z16lHc","WDVWJLDk6f","aDGtStjQxs","FnPFBEdBKc","BFkb8X6Pin","a00b57Ow5C","5Drn0pv0i7","WPmlxQssNC","FhtglU3yw5",
+"VIlwPWPmlx","5VZjStuDyS","NcICAHP433","lweGytlILt","FVMxoyEfy9","RzaZAJRJQB","YjB9tChuy3","djsrvAOgEe","WMiS3JIqXi","Nxx9VQYxC0",
+"Yh1hFUlU3M","gIYvEtaOXK","tl72W7X3uy","OUYuFY1mC0","TCgPpoVQp6","ZzJHWhi5X7","SbRYy9y4lw","3weIFDQimp","JIqXiM3zXL","n1pmOOxWIH",
+"BpYhVCxVEf","VjCZqyEfy9","WmadAFxX9q","FjHXRoVQp6","HP433fFDrJ","s4786v8yFN","Ul4a11LB1L","W7cTsJKWYR","FjHXRgjUTu","2TRI7uvf7A",
+"UlU3MKASQ8","W3VFHThjNn","VjCZqOz8yZ","zFgtB8xEKz","GrDg7ciuWz","dhSuHpFrrl","TwanoLbRTH","e6e4zlweGy","RmDcrQClRL","i7WMQJXljW",
+"uZPqgF6PT2","8FmFHMojnP","NAFuwvLsmS","ogLgc0Kyfs","Nxx9VDLhzM","y94nwQWxoT","k85Ae2TRI7","LDk6fMkgy8","BCxeCZJTXH","CxVEfCK5W7",
+"e6e4ztjQxs","Oz8yZjSjS3","FcWrWZhwG1","7Ow5CMGlTF","580YDoVQp6","HzZT8CdyBV","iB08lpAhR1","qUJMdWmadA","J2mQi6q6L9","MmsIoCxVEf",
+"aL6AJgjUTu","lViBv5drc6","cShY2v1Hln","Kr8ysguMb8","zqH0WECMvU","Q6hMChSSvQ","EdBKcs4786","dhSuHpmeCd","5ZaEzNcICA","B3qemM3zXL",
+"ulk41oQ87r","uoStwsoy9t","7fKYU1LB1L","HlUbFdpe1v","b29RJ4QMc9","DLhzMDG4sT","C2IrcSs0Zu","WaWsv7hyVv","wDajXlj07Q","M6qcGHRxd8",
+"gf8rIFFDui","uupzkxXTI4","1j5L8xciqp","qUJMdMkgy8","4QMc9HzZT8","lm0pD2hEEU","WMiS3QbxXc","VerEAMGlTF","jiVBPzFgtB","piJSkt59lR",
+"prNT6ECMvU","jeskSFwEJz","v1Hlniqv4k","Nxx9V0MR5X","l83UdtaOXK","QworuKsjRK","64s8Ns4786","FVMxo8TxD7","2Nslm618Di","yluBxlCMxy",
+"cL0aE24ARF","KsjRKDcpWB","RxrsmQYxC0","2TRI7ydG8U","oQ87rZUnqt","2Yz7E4W0Tl","Yh1hFoQ87r","SmGzvuQIcz","5ZaEzuAWyp","ZJTXHcL0aE",
+"0h1b1HlUbF","4QMc9JIqXi","D6rByyofH3","AXpwE3otm6","48cHLMm8si","5Drn0CqqaD","t59lRLDk6f","DQimpdjsrv","ThjNnDz1R3","fmIK1LbRTH",
+"faHirn1pmO","ydG8Upv0i7","CqqaDDcpWB","QChxs618Di","9eoRcLewvM","xXTI4uTacx","ZJTXHpAhR1","Zv7z0IjTwP","RpBQmyvOMI","VLTy6iB08l",
+"pT8wuEoToP","Rxrsm29QAz","aFFssUmaEv","sx5GllViBv","MGlTFhUTw7","k85Ae2Nslm","VBjhz9y4lw","SmGzvlweGy","RpBQmAIYUu","jzUqRD6rBy",
+"pvgjShe9IA","tl72WRxrsm","pWiOsYw2oU","zmLYDMGlTF","xXTI4lm0pD","0ao3lOz8yZ","EOE1oNcICA","b29RJtaOXK","16lHci3pyd","VLTy6oQ87r",
+"1j5L8Q6hMC","kB5nPlweGy","AIYUuRzaZA","D6rByazIWp","EOE1oFcWrW","uLtKsmz8gx","StlDJlweGy","JkzUnb29RJ","uPX7Gv2eC3","rhl0JNAFuw",
+"vLsmSlweGy","No0QbMmKGJ","ReKEWQ6hMC","aFFss8hJdt","cQOnvVBjhz","2TRI7ECMvU","LDk6f2Yz7E","vLsmSfFDrJ","StlDJSmGzv","yluBxU3yw5",
+"ThjNnCp3mZ","UlU3MSbRYy","HzZT8yvOMI","1LB1LGSQwj","yToGWlweGy","4W0TlQ6hMC","EOE1oEOE1o","W3VFH7fsYM","QYxC0xXTI4","RpBQmzY1GY",
+"0BmCyRzaZA","xXTI4I7p2a","IBe8kMmKGJ","EoToPv8yFN","Yf2EccL0aE","yluBxFFDui","v2eC3gIYvE","RACujNxx9V","WDVWJhUTw7","0MR5XPYBf4",
+"tlILtgtCA5","ZhwG1uJScX","QClRLiwzGk","CIShG9GXkX","580YDpT8wu","rhl0Js4786","FwEJzNo0Qb","DLhzM8FmFH","2NslmqaofN","EOE1o48cHL",
+"7X3uyCIShG","IKxdLMmsIo","fqypyO3iyQ","EoToPOz8yZ","yofH3azIWp","EoToPPOUYS","DQimpMm8si","GXdoH5iGN5","uupzkXyPZN","djsrvECMvU",
+"jzUqRpFrrl","rhl0JIBe8k","dmoS77lUXZ","0Wr5ys93Ml","DcpWBMkgy8","9iGoTAmdQd","8xEKz0PktI","djsrvhe9IA","uTacxKZamH","HRxd8uN6r3",
+"0MR5XM6qcG","gf8rIyEfy9","piJSkEdBKc","IBe8kZv7z0","BCxeCTa8f6","QYxC0iwzGk","k85AeCfgr3","blLA9WDVWJ","Uvlv4nnP8o","1j5L8Uvlv4",
+"Uvlv448cHL","JIqXidQ586","1v5hHHzZT8","X6PinIKxdL","aFFss5IhmG","UlU3MFPfSE","atef2RzaZA","Zv7z0zbIYY","jS1ajTwano","LDk6fhYBCK",
+"zQt6Q5ZaEz","o8UydzmLYD","29QAzl83Ud","BpYhVpAhR1","W3VFHHRxd8","jtn0X8cVD3","GWqqXP6bcg","48cHL3otm6","J2mQiBbwgA","L7cGcQClRL",
+"GrDg7zz4ZU","9y4lwJ2mQi","cQOnvWMiS3","tuDySdQ586","0MR5Xs4786","1j5L8a00b5","ogLgcCqqaD","lH1kt16lHc","IKxdL618Di","QYxC0s7Mxk",
+"HfyNQQnJ1S","RmDcr8RCUA","KZamHrz7Ut","tvdkDMK07Y","prNT6rhl0J","5IhmG4QMc9","O3iyQ8U2nU","yEfy9C2Irc","8RCUA9XyT9","9GXkXI7p2a",
+"wDajXAgJHQ","No0QboQ87r","sqVrfIn3NS","e6e4zqQxHP","8RCUAzQt6Q","v1HlnDLhzM","lkMUAru4UG","VIlwPYh1hF","OUYuFIKxdL","cmXIX8RCUA",
+"StlDJBFkb8","RpBQmpFrrl","mz8gxsoy9t","a00b5m4bxU","ZzJHWFhtgl","OUqFM5iGN5","FVMxoGv3Fq","o8Uydt59lR","sqVrfQworu","pFrrlUlU3M",
+"cL0aEAOgEe","pv0i7dpe1v","7X3uyBpYhV","WPmlx0ao3l","uTacxFjHXR","uN6r3KZamH","gtCA5CK5W7","HfyNQNhXdu","t98iWFGzgp","Cfgr3yluBx",
+"wiHrZuoStw","ciuWzVNCPd","ThjNnmX2GE","h1zcHhi5X7","GSQwjSbRYy","14FLRpWiOs","uvf7AjeskS","aFFssuoStw","ciuWzQChxs","BGaQYWreyP",
+"t59lR4QMc9","lweGyjzUqR","HlUbFVprf2","ulk41aDGtS","2TRI7rz7Ut","7lUXZOHaBz","8RCUAsuY4x","HfyNQDz1R3","xciqpaFFss","ZhwG145cIH",
+"2NslmZJTXH","s4786MmsIo","ZhwG1cL0aE","L7cGcpv0i7","qaofNzY1GY","7lUXZhYBCK","No0QbnnP8o","prNT6hSSvQ","FPfSErz7Ut","RBhp0wiHrZ",
+"BbwgAs7Mxk","HlUbFuupzk","1v5hHdmoS7","jtn0Xatef2","Yf2EcRzaZA","I7p2a9y4lw","sqVrfFhtgl","lCMxyYOfrY","Pb1pamz8gx","5nmWv5Drn0",
+"6q6L9xciqp","ZuDtDZv7z0","zmLYDP6bcg","lkMUA9GXkX","wiHrZyofH3","CqqaDQworu","YOfrYxciqp","7fsYMZ4I1v","pT8wu6q6L9","P6bcglH1kt",
+"KsjRKfqypy","yluBxWaim6","MGlTF2DREs","0YAGH0Kyfs","fFDrJgIYvE","gjUTuM6qcG","HzZT8hSSvQ","uTacxn1pmO","KZamHbZLvS","guMb8xXTI4",
+"WMiS3guMb8","oGu6xEdBKc","lkMUANcICA","Mkgy8bZLvS","6AFT00PktI","S2DfuKsjRK","24ARFjzUqR","FjHXRl83Ud","faHirFVMxo","KsjRKOHaBz",
+"ogLgcprNT6","XyPZN4dEz6","fqypysqVrf","0ao3logLgc","3weIFYw2oU","ydG8UW3VFH","ix74rdmoS7","8xEKzMkgy8","i3pyd7hyVv","ReKEWlViBv",
+"J2mQiYf2Ec","euZA5Y1mC0","ix74rpiJSk","2Yz7EfcwDa","No0QboVQp6","s93MlAgJHQ","ru4UG9XyT9","UlU3M7lUXZ","Rxrsm48cHL","RsQUqFwEJz",
+"VLTy66q6L9","aez9yFxX9q","55rfBuJScX","PYBf4zbIYY","fcJOyAmdQd","Waim624ARF","tuDySvOqCE","48cHLtvdkD","l83Uda00b5","W7cTsDG4sT",
+"4W0TlfFDrJ","xXTI4QnJ1S","Q6hMCTwano","LewvMkB5nP","TwanoAIYUu","vOqCEdhSuH","jiVBP8TxD7","rKDLJFhtgl","In3NStlILt","QbxXcIRh48",
+"618Di9rlg9","TXQ0ZyofH3","TXQ0Z8U2nU","RzaZAOz8yZ","No0QbuPX7G","0BmCyCp3mZ","pv0i7TXQ0Z","bZLvSMojnP","MojnPsx5Gl","Nxx9Vv8yFN",
+"1j5L8CqqaD","WMiS364s8N","VBjhzC2Irc","VerEAD6rBy","s7Mxkx3LDe","brhlQFcWrW","aez9yLbRTH","W7cTsrKDLJ","mX2GESbRYy","WDVWJVjCZq",
+"B3qemLbRTH","iKqhrru4UG","QYxC0lsQGo","8TxD7IRh48","ReKEWtuDyS","0BmCy0h1b1","tl72W48cHL","GWqqXhYBCK","MmsIo7fsYM","vkCHHFLsph",
+"64s8NtAOsr","djsrvFVMxo","y94nwK20wK","ReKEWyvOMI","FwEJzCfgr3","UmaEvsx5Gl","d7vjMzz4ZU","GSQwjL7cGc","jtn0X9rlg9","Cfgr3fcJOy",
+"x3LDeFNYIM","uoStwzFgtB","DcpWBtaOXK","suY4xYw2oU","Ta8f6d7vjM","1v5hHZJTXH","d85a9OUYuF","VjCZqMaJQs","X6PinBGaQY","UlU3MbrhlQ",
+"5IhmGEOE1o","tuDyS0ao3l","hUTw7Oz8yZ","POUYSpiJSk","ZJTXHoQ87r","vOqCEQbxXc","S77LHtjQxs","OUqFMjzUqR","fqypy2DREs","6q6L9Ul4a1",
+"sx5GlQYxC0","ydG8U5Namm","8RCUAYw2oU","8RCUAPb1pa","55rfBKr8ys","7X3uyo8Uyd","W3VFHKr8ys","Mm8sigIYvE","Cfgr3rKDLJ","y94nw5ZaEz",
+"pT8wuru4UG","TCgPpO3iyQ","0h1b1VLTy6","kZANmOz8yZ","TCgPpU3yw5","8U2nUsqVrf","SbRYy0MR5X","Rxrsm8xEKz","nFqikRpBQm","8U2nUVjCZq",
+"8FmFHQYxC0","s93MluoStw","9GXkXVLTy6","BCxeCtAOsr","jtn0XCNHmv","J2mQijfREu","4W0TlMaJQs","BCxeC8cVD3","mX2GEiqv4k","aFFssfqypy",
+"brhlQuoStw","lpF6WtAOsr","ECMvU5Drn0","tjQxsokgRi","K4GS8JRJQB","uN6r3lpF6W","fFDrJCdyBV","OHaBzzz4ZU","t98iWCfgr3","0BmCyLbRTH",
+"lH1ktzQt6Q","AgJHQFFDui","pmeCd7fsYM","4dEz6ydG8U","pAhR1atef2","TXQ0ZhUTw7","zqH0Wv8yFN","MGlTFlCMxy","VNCPdprNT6","cQOnvgdQsS",
+"m4bxU7X3uy","jS1ajqUJMd","rz7UtEdBKc","RzaZAgf8rI","BCxeCjeskS","FxX9qpT8wu","s7Mxk4QMc9","16lHchi5X7","okgRiAIYUu","o8Uydn8pJ9",
+"guMb8faHir","QClRLzz4ZU","0PktIzmLYD","JkzUnwiHrZ","AmdQdF6PT2","nlaByuJScX","uTacxiKqhr","s7MxkEdBKc","sx5GlDcpWB","WreyPCdyBV",
+"AOgEerKDLJ","ix74rlH1kt","IKxdLEOE1o","ThjNn0YAGH","tAOsrQssNC","RsQUq1LB1L","lkMUAPYBf4","YOfrYzmLYD","uLtKsQ6Lix","Chuy3lpF6W",
+"RACujh1zcH","W3VFHlj07Q","Pb1paSbRYy","oGu6xjiVBP","QssNCQWxoT","ogLgcwiHrZ","aDGtSUl4a1","AkKTkix74r","7lUXZrKDLJ","WPmlxVBjhz",
+"Y1mC06q6L9","S77LHlViBv","lCMxytvdkD","2hEEU3weIF","iKqhrNAFuw","ZUnqt5Drn0","jiVBPXflUq","ciuWzbZLvS","GrDg7hE1Ql","StlDJpiJSk",
+"4QMc9CdyBV","piJSkHP433","MaJQsFhtgl","zFgtBix74r","Ta8f60Wr5y","WmadA7fsYM","UlU3M0ao3l","GXdoHzqH0W","ZuDtDQbxXc","FVMxoWaWsv",
+"aL6AJTXQ0Z","OxWIH9iGoT","8RCUAoQ87r","tlILtnnP8o","nFqikHP433","cShY2XyPZN","J2mQiMkgy8","6AFT0soy9t","he9IAK4GS8","JIqXi24ARF",
+"VIlwPkZANm","SjskQkB5nP","NOHszMm8si","UmaEvaL6AJ","9eoRcJXljW","hSSvQ618Di","FGzgpG1RhS","d85a9soy9t","S2DfuMaJQs","okgRiZhwG1",
+"Vprf2StlDJ","ciuWzdpe1v","FPfSEtlILt","P6bcgoVQp6","fmIK1Y1mC0","lH1ktv8yFN","lkMUAhYBCK","v2eC3NhXdu","GSQwjcL0aE","OUqFMStlDJ",
+"fFDrJe6e4z","yofH3x3LDe","yToGWlH1kt","CK5W7brhlQ","2hEEUFFDui","QChxsBCxeC","Ss0Zu07n1c","uupzk7X3uy","uTacxThjNn","W3VFHMezSW",
+"hE1QloGu6x","blLA9DcpWB","hSSvQ5ZaEz","okgRiyEfy9","CxVEfQYxC0","SjskQgIYvE","pv0i7jtn0X","jiVBPF6PT2","Q6hMCK20wK","yToGWnnP8o",
+"8hJdtguMb8","zQt6Q24ARF","Yf2EcCNHmv","aDGtSMojnP","07n1cMkgy8","2ZHdkECMvU","nFqikWaim6","soy9taFFss","JKWYRi3pyd","wiHrZfcJOy",
+"kB5nPGSQwj","fcJOyxXTI4","5drc6AmdQd","ZuDtDKZamH","QbxXcAmdQd","lkMUALbRTH","Q6Lix24ARF","Chuy3uvf7A","uTacx0h1b1","Ul4a1SjskQ",
+"4QMc9FNYIM","JJs5mBbwgA","RACuj8U2nU","cQOnvyToGW","t59lRThjNn","iqv4kKsjRK","KASQ8lsQGo","CIShGDQimp","tl72WGWqqX","No0Qbo8Uyd",
+"618DijzUqR","4dEz607n1c","2hEEUDG4sT","Oz8yZguMb8","7lUXZZJTXH","BGaQYtaOXK","euZA5SjskQ","Pb1pa5nmWv","POUYSlH1kt","5nmWviwzGk",
+"HRxd8NAFuw","1LB1Lb29RJ","kZANm0PktI","NOHsztvdkD","ZJTXHyToGW","Yf2Ec8TxD7","5NammJIqXi","b29RJCp3mZ","IjTwPzz4ZU","UlU3MyToGW",
+"ReKEWzbIYY","kB5nP5VZjS","ZhwG1jS1aj","t98iWpWiOs","UlU3M8cVD3","a00b5Dz1R3","QWxoTFFDui","8U2nUHRxd8","NAFuweuZA5","Waim67X3uy",
+"6q6L9Mkgy8","JKWYRSmGzv","uvf7Ai3pyd","CIShGxXTI4","8U2nUP6bcg","5Drn0lm0pD","b29RJydG8U","ZUnqtTCgPp","Mm8sivOqCE","Yw2oUVprf2",
+"FxX9qd85a9","RzaZAydG8U","8xEKzQ6hMC","FnPFBWaim6","JRJQB0Wr5y","JKWYR2Nslm","1j5L8CNHmv","azIWpNo0Qb","Q6hMC5VZjS","IBe8kOz8yZ",
+"FPfSEn8pJ9","29QAz5Drn0","VBjhzaDGtS","4W0TliB08l","jfREuB3qem","VNCPdYh1hF","0PktIlweGy","XflUqMGlTF","kB5nPGv3Fq","l83UdoGu6x",
+"AgJHQoVQp6","rz7UtjfREu","l83UdFjHXR","5VZjS4W0Tl","XflUquvf7A","QChxs1j5L8","oGu6xjSjS3","qQxHPRzaZA","zQt6QuoStw","Oz8yZRkQke",
+"vLsmSxciqp","HRxd80Kyfs","MK07Y2ZHdk","HfyNQVprf2","Waim69y4lw","piJSkCNHmv","ECMvUaDGtS","cQOnvnnP8o","JIqXiS2Dfu","JkzUnv2eC3",
+"8TxD7StlDJ","guMb8SjskQ","dQ5861j5L8","5IhmGDz1R3","POUYSCfgr3","dmoS7ix74r","zHF1qpvgjS","9iGoTX6Pin","hSSvQbrhlQ","Yw2oUW3VFH",
+"EdBKcECMvU","lkMUAx3LDe","Fhtgll83Ud","14FLR64s8N","qQxHP9y4lw","uQIczhYBCK","fmIK1DG4sT","HRxd8MojnP","CqqaDokgRi","WPmlx5Mg9r",
+"s93MlwiHrZ","LDk6fyvOMI","QClRL8hJdt","Yf2Ec5VZjS","piJSkNo0Qb","YOfrYo8Uyd","bZLvSZuDtD","Ta8f6VLTy6","0ao3lbgJAz","45cIHVjCZq",
+"fqypyRkQke","0h1b16AFT0","soy9toGu6x","hSSvQnFqik","hE1QlQ6hMC","AOgEeuZPqg","sqVrfZUnqt","gdQsSuTacx","7ku1pAXpwE","n8pJ9y94nw",
+"5ZaEzyofH3","SjskQNo0Qb","StlDJ64s8N","0ao3lFFDui","JRJQBd85a9","HzZT8ni2v1","Ss0ZuwDajX","guMb8a00b5","GXdoHEOE1o","4dEz6tjQxs",
+"BCxeCFwEJz","Pb1pao8Uyd","e6e4zd7vjM","GSQwj2Yz7E","QbxXcPb1pa","DLhzM8TxD7","prNT6EoToP","DQimpAXpwE","VIlwPoGu6x","WaWsv9iGoT",
+"BbwgADG4sT","TCgPps93Ml","uoStwXyPZN","MGlTF0PktI","zqH0WS2Dfu","BCxeClCMxy","ni2v1qQxHP","K4GS8vkCHH","Gv3Fqhe9IA","dhSuHfmIK1",
+"pvgjSjeskS","7lUXZFVMxo","Pb1pa7fKYU","tuDySdjsrv","zbIYY64s8N","ru4UG7hyVv","OUYuF5Namm","P6bcgGWqqX","Mkgy8QChxs","wDajXtlILt",
+"uAWypQworu","mX2GEM3zXL","C2IrcogLgc","K20wKAIYUu","rz7UtKr8ys","qUJMdpvgjS","yofH3k85Ae","zmLYDn8pJ9","JXljWM3zXL","AgJHQpT8wu",
+"6AFT0D6rBy","SbRYyBGaQY","0MR5XfaHir","pFrrlIRh48","s4786StlDJ","WmadA7lUXZ","uQIczQYxC0","WreyPRsQUq","e6e4zGv3Fq","pvgjSulk41",
+"vLsmSYf2Ec","faHiruJScX","X6PingIYvE","gtCA5FPfSE","soy9tuZPqg","lCMxypAhR1","pmeCd7X3uy","5IhmGy94nw","fLNg8MaJQs","fLNg8rhl0J",
+"QssNCn1pmO","zmLYD9XyT9","ReKEWJkzUn","L7cGcThjNn","Q6LixydG8U","e6e4zhUTw7","lj07QRkQke","euZA5tlILt","2Yz7E0YAGH","9GXkXn8pJ9",
+"ix74rP6bcg","iB08lDQimp","rz7UtnlaBy","Qworut59lR","yvOMIJRJQB","jiVBPatef2","aL6AJksJby","yluBx2hEEU","Kr8ysJ2mQi","UlU3MMmKGJ",
+"KASQ8y94nw","d85a91j5L8","WDVWJpmeCd","0Wr5yF6PT2","S77LHFnPFB","BbwgA2hEEU","uoStwtuDyS","BbwgAdmoS7","Ta8f6BpYhV","ni2v1No0Qb",
+"hi5X7Yf2Ec","fmIK1FGzgp","LewvM580YD","lkMUA580YD","jS1ajZ4I1v","vkCHHuZPqg","VLTy6zY1GY","GrDg7L7cGc","yvOMIhSSvQ","FxX9qKsjRK",
+"Waim65nmWv","IKxdLdmoS7","Q6Lix14FLR","Ul4a1Twano","cL0aEFhtgl","FGzgpOHaBz","S2DfupFrrl","oQ87rFVMxo","16lHcsuY4x","mz8gxGSQwj",
+"FwEJzkB5nP","EOE1orKDLJ","jSjS3nFqik","sqVrfMojnP","0ao3lDG4sT","fcwDaW3VFH","KASQ8FjHXR","zHF1qnFqik","ciuWzGWqqX","8TxD7C2Irc",
+"i3pydfLNg8","FhtglKZamH","8cVD30Wr5y","djsrviqv4k","vLsmS8hJdt","8cVD3tjQxs","GSQwjjiVBP","B3qemZuDtD","soy9tJXljW","pT8wuCIShG",
+"hE1QlU3yw5","pvgjSI7p2a","AmdQdZUnqt","jSjS3nnP8o","9eoRcprNT6","m4bxU5IhmG","ZhwG1S77LH","EoToPFGzgp","FPfSEOxWIH","zY1GYvLsmS",
+"x3LDeNhXdu","xReecMm8si","qQxHPuPX7G","GrDg7ZuDtD","AOgEeBbwgA","Rxrsm16lHc","y94nwGSQwj","LDk6frz7Ut","brhlQKASQ8","gf8rIAOgEe",
+"lkMUAsx5Gl","F6PT2TXQ0Z","iwzGk0PktI","8RCUAFVMxo","MaJQsMkgy8","2DREsuTacx","JJs5mjzUqR","9XyT9KsjRK","QworuqaofN","vOqCES77LH",
+"KsjRK9GXkX","AkKTkMmsIo","4W0TlQWxoT","48cHLtAOsr","1j5L8Kr8ys","prNT6IjTwP","TCgPplsQGo","7X3uyEOE1o","ECMvUSmGzv","07n1c1j5L8",
+"4dEz6TCgPp","Yw2oU8hJdt","TCgPplm0pD","kZANmsqVrf","lj07Q9GXkX","NOHszh1zcH","F6PT2BbwgA","Cp3mZ14FLR","1v5hHM3zXL","v2eC3nlaBy",
+"4QMc9AIYUu","dmoS7gf8rI","Pb1pa2Yz7E","8U2nUqQxHP","uupzktjQxs","HlUbF0YAGH","Q6Lix2Nslm","C2IrcEoToP","CIShG24ARF","oGu6xRACuj",
+"nlaByfaHir","aL6AJPOUYS","jS1ajtaOXK","oGu6xyvOMI","FxX9qCIShG","tlILt618Di","5nmWvpT8wu","dQ586M3zXL","IjTwP4QMc9","zbIYYuoStw",
+"Cfgr3UmaEv","HlUbF2Nslm","Q6Lixhe9IA","bZLvSoGu6x","SbRYydpe1v","StlDJMojnP","OUYuFuAWyp","QnJ1S16lHc","Dz1R3MmKGJ","8xEKzZhwG1",
+"VerEAo8Uyd","9GXkXBbwgA","QssNCLDk6f","FGzgphUTw7","fcJOy64s8N","Oz8yZWaWsv","pT8wuRxrsm","lsQGozmLYD","mz8gxKASQ8","fqypy580YD",
+"8FmFHJRJQB","AXpwEEoToP","dQ586FLsph","8U2nUAXpwE","MGlTFFhtgl","iB08lprNT6","YOfrYI7p2a","MK07YwDajX","dpe1vAmdQd","sqVrf7ku1p",
+"a00b55nmWv","Chuy3JRJQB","lkMUAIKxdL","Kr8ysSmGzv","pv0i7lj07Q","zY1GYnnP8o","3weIFDG4sT","vLsmSk85Ae","uoStwFjHXR","24ARFgf8rI",
+"3otm6Yw2oU","prNT6WPmlx","aFFssPYBf4","jtn0XMmsIo","ECMvUtuDyS","Chuy3VLTy6","G1RhS0PktI","ru4UGzbIYY","oVQp6CdyBV","JIqXipFrrl",
+"uAWypRzaZA","ru4UGQWxoT","s7MxkYf2Ec","Oz8yZQssNC","faHirIBe8k","DLhzM0PktI","hE1Ql4dEz6","TwanoPOUYS","9rlg9DG4sT","uvf7AuJScX",
+"FcWrWhYBCK","MaJQsbgJAz","8FmFHJkzUn","tvdkDiwzGk","0BmCyh1zcH","iqv4kNhXdu","lXFOBWaWsv","zFgtBzFgtB","Q6LixgtCA5","Nxx9VjSjS3",
+"ZuDtD14FLR","ZUnqtjS1aj","KZamH5Mg9r","djsrv0YAGH","0PktIpmeCd","0Wr5yuupzk","lkMUATXQ0Z","tl72Wru4UG","piJSkqUJMd","lj07Qzz4ZU",
+"Cp3mZhi5X7","3weIFRkQke","RsQUq5Namm","brhlQMezSW","uupzkd85a9","AOgEe5ZaEz","VjCZqCIShG","tuDySNOHsz","uQIczZuDtD","n1pmOS77LH",
+"uvf7A0Wr5y","6AFT07hyVv","Zv7z0o8Uyd","2DREsoVQp6","uQIczMK07Y","NcICAn1pmO","GrDg7i3pyd","ni2v1jS1aj","8U2nUZzJHW","Chuy30BmCy",
+"cL0aEuAWyp","5Drn0TCgPp","ydG8U8hJdt","WreyPTwano","he9IADQimp","gjUTuMezSW","LewvM0MR5X","7hyVvydG8U","t59lRulk41","No0QbQbxXc",
+"CK5W7l83Ud","QChxs7X3uy","gf8rIUvlv4","QnJ1SWreyP","SjskQyToGW","pmeCdn8pJ9","ZzJHWFPfSE","14FLRsqVrf","0PktI64s8N","HP433BFkb8",
+"RBhp0aL6AJ","AmdQdv1Hln","55rfBxReec","gtCA5v1Hln","0ao3lI7p2a","pAhR1x3LDe","6AFT0lCMxy","RzaZASjskQ","oGu6xprNT6","WDVWJAIYUu",
+"OUqFMS2Dfu","gIYvEzz4ZU","a00b5EoToP","uLtKsmX2GE","gf8rI9GXkX","BCxeC2hEEU","ZUnqt0ao3l","yluBxs93Ml","KsjRK7fsYM","MK07Y7X3uy",
+"RBhp007n1c","JXljWWmadA","oVQp6D6rBy","LDk6fP6bcg","kB5nPGXdoH","O3iyQsoy9t","FjHXRksJby","s93MlVjCZq","L7cGcprNT6","4QMc9zHF1q",
+"hYBCKaL6AJ","faHirIRh48","U3yw5jfREu","UlU3MK4GS8","LewvMt98iW","W7cTsYh1hF","4QMc95VZjS","RpBQmm4bxU","hSSvQpT8wu","n8pJ9wiHrZ",
+"nFqikiKqhr","Cfgr3v8yFN","FxX9ql83Ud","W7cTsCfgr3","MGlTFcShY2","55rfBfcJOy","QChxsblLA9","MezSWcQOnv","GrDg7FwEJz","mz8gxZuDtD",
+"5drc6xReec","kZANmtuDyS","MojnPAkKTk","kB5nPv8yFN","HzZT848cHL","fqypyFPfSE","ZhwG1tlILt","Pb1paZv7z0","ZJTXHtuDyS","gtCA5Ta8f6",
+"In3NSfmIK1","h1zcHVIlwP","JRJQBm4bxU","h1zcH8RCUA","GSQwjUvlv4","uPX7GCNHmv","45cIHulk41","bgJAzv2eC3","zHF1qS2Dfu","QworuMaJQs",
+"S77LH07n1c","dQ586uLtKs","NhXduWDVWJ","9iGoTo8Uyd","Oz8yZWaim6","uAWypaL6AJ","Vprf2piJSk","pWiOs5VZjS","dQ586JRJQB","FFDuiaez9y",
+"AIYUu580YD","Vprf2fqypy","ru4UGVIlwP","BCxeCn1pmO","b29RJ0ao3l","hE1Ql29QAz","S2DfuNo0Qb","uZPqgru4UG","StlDJzbIYY","P6bcgJIqXi",
+"rhl0J618Di","WPmlxe6e4z","lm0pDjS1aj","hUTw7hSSvQ","QworugIYvE","v2eC3tuDyS","8hJdtQworu","EoToPFxX9q","7X3uyCxVEf","n8pJ9Y1mC0",
+"NhXdudpe1v","zbIYYZv7z0","uvf7A5IhmG","8hJdtaL6AJ","n8pJ9prNT6","K4GS8ix74r","hSSvQ55rfB","OUqFMRACuj","TXQ0ZfmIK1","YOfrYYh1hF",
+"hE1QluPX7G","CdyBVuAWyp","pv0i7pv0i7","29QAzd85a9","VNCPdDQimp","l83Ud0MR5X","9GXkXKr8ys","o8UydzQt6Q","MmKGJHfyNQ","oQ87rAXpwE",
+"0PktIzz4ZU","AkKTkgf8rI","5iGN5vkCHH","0Wr5yWreyP","nFqikUvlv4","ulk41lweGy","In3NSBCxeC","YjB9tOHaBz","pT8wupAhR1","fcwDajzUqR",
+"FhtglMGlTF","B3qemjS1aj","zmLYD5iGN5","GXdoHpvgjS","LewvM5Namm","iwzGkQWxoT","VerEAs93Ml","hSSvQaL6AJ","vOqCEpvgjS","7X3uyYOfrY",
+"nnP8ofaHir","Yh1hFhe9IA","fcJOyjtn0X","iB08l2Yz7E","cShY2Chuy3","5VZjStAOsr","lViBvulk41","xReecRBhp0","wDajXJ2mQi","sx5Glix74r",
+"OHaBz8xEKz","IRh48Twano","nnP8o8xEKz","OUYuFoVQp6","4QMc9fcwDa","i7WMQZhwG1","Y1mC0NAFuw","SWfouFFDui","pv0i7uN6r3","b29RJBFkb8",
+"lsQGobgJAz","5drc6ZUnqt","KASQ8FGzgp","FjHXRlH1kt","hSSvQQbxXc","uQIczlXFOB","MmsIoOUqFM","tlILtgIYvE","b29RJpv0i7","dQ5863weIF",
+"5iGN53otm6","EdBKcNcICA","iB08luJScX","9GXkX1LB1L","7fsYMrz7Ut","pvgjSrz7Ut","0h1b1RmDcr","Ss0ZufLNg8","W7cTslj07Q","sx5GlM6qcG",
+"CxVEfTwano","Q6LixvkCHH","BCxeCs7Mxk","WDVWJiwzGk","h1zcHNhXdu","nFqikblLA9","s93MlhYBCK","n8pJ9dQ586","XyPZNJIqXi","07n1c0Kyfs",
+"aez9yJRJQB","v8yFN48cHL","i3pydyofH3","TXQ0ZyToGW","vOqCEVLTy6","FVMxopFrrl","guMb8lm0pD","MojnP8cVD3","WDVWJaFFss","ksJbyuTacx",
+"aez9yaez9y","VLTy6C2Irc","FnPFBMkgy8","9rlg9SbRYy","5Mg9rnnP8o","U3yw5VjCZq","euZA5yofH3","pvgjSs4786","7fKYUxReec","618DiQClRL",
+"9eoRc64s8N","qUJMdpWiOs","Dz1R3cmXIX","StlDJWMiS3","JIqXi5Drn0","0MR5XogLgc","lCMxyAXpwE","zmLYDuZPqg","uZPqgCdyBV","okgRiGrDg7",
+"iB08lZv7z0","cShY2i7WMQ","29QAz1v5hH","ogLgcuLtKs","M3zXLlkMUA","AgJHQqUJMd","SbRYy8cVD3","FLsphAmdQd","lsQGoxXTI4","VNCPdVerEA",
+"zQt6Qdpe1v","4W0TljzUqR","DQimpzqH0W","HP433qUJMd","lweGyQWxoT","LDk6f0Kyfs","07n1cTCgPp","5NammpWiOs","9GXkXCxVEf","s7MxklkMUA",
+"9iGoT5drc6","atef2guMb8","faHir4W0Tl","Cfgr3i3pyd","xciqpiqv4k","e6e4zI7p2a","ECMvUDQimp","580YDWmadA","jS1aj2TRI7","J2mQiatef2",
+"he9IAMmKGJ","CxVEfVprf2","POUYSokgRi","d7vjMlj07Q","xciqpgdQsS","s4786cQOnv","U3yw5bgJAz","pv0i7vOqCE","B3qembrhlQ","JXljWix74r",
+"ni2v1zmLYD","ZhwG1ZzJHW","MGlTFxciqp","8U2nUZUnqt","QWxoTzz4ZU","dQ586nlaBy","B3qemEOE1o","LewvMAkKTk","Uvlv4SjskQ","WaWsvx3LDe",
+"9GXkXZuDtD","6AFT00MR5X","jS1ajK20wK","7fKYUcmXIX","lj07QWreyP","PYBf4yEfy9","SmGzvFPfSE","oVQp6PYBf4","ReKEWK4GS8","8xEKzyvOMI",
+"ZzJHWDQimp","OHaBz2ZHdk","C2IrcNhXdu","YOfrYt59lR","MaJQsrKDLJ","QnJ1SWDVWJ","KASQ8ECMvU","6q6L9lXFOB","jiVBPyofH3","B3qemC2Irc",
+"StlDJIBe8k","qaofNNo0Qb","h1zcHQChxs","gdQsSKASQ8","QworuZhwG1","FjHXRB3qem","AgJHQhSSvQ","QChxspmeCd","M6qcGAkKTk","fLNg8AkKTk",
+"okgRiMaJQs","ZJTXHuQIcz","DQimpUmaEv","8FmFHaDGtS","QnJ1SRsQUq","1j5L8zbIYY","QChxsSjskQ","QClRL0MR5X","Mkgy8tuDyS","UmaEvgf8rI",
+"ogLgcv2eC3","0ao3li7WMQ","0BmCyfcwDa","hYBCKt98iW","rz7UtJXljW","O3iyQIBe8k","1v5hHlweGy","XyPZNaez9y","ReKEWm4bxU","Fhtgls7Mxk",
+"6AFT0nnP8o","In3NSatef2","v8yFNWmadA","DLhzMZv7z0","RACujRmDcr","faHirfqypy","k85AejSjS3","Mm8si2Nslm","7hyVvZ4I1v","gtCA5ksJby",
+"P6bcgnnP8o","8U2nU8xEKz","2TRI7UlU3M","F6PT29y4lw","mX2GEv8yFN","ulk41pT8wu","bZLvSsoy9t","ZUnqtYf2Ec","zbIYY8xEKz","tAOsrZhwG1",
+"gtCA5taOXK","piJSkulk41","Waim6zz4ZU","OUYuF8hJdt","dhSuHXflUq","lCMxyfaHir","WreyPd7vjM","6AFT0GSQwj","3weIFulk41","fcwDaJ2mQi",
+"2ZHdkt98iW","1LB1L7hyVv","3weIFt98iW","brhlQdjsrv","MezSWGXdoH","lpF6WuQIcz","pvgjS5nmWv","DG4sTZUnqt","ksJbyIRh48","UmaEvjSjS3",
+"BCxeCrz7Ut","GWqqX55rfB","HP433W7cTs","MaJQsxXTI4","Cp3mZ9iGoT","CIShG64s8N","d7vjMRxrsm","KsjRKWPmlx","W7cTsYw2oU","ydG8UdmoS7",
+"L7cGcDLhzM","8U2nUThjNn","wDajXzz4ZU","ulk415iGN5","5iGN5UmaEv","8TxD7JkzUn","7X3uybZLvS","Mm8sit59lR","FcWrWOHaBz","ZUnqth1zcH",
+"WMiS3GWqqX","jSjS3hi5X7","MojnPjiVBP","8xEKzuN6r3","K4GS8tlILt","pAhR1uN6r3","RxrsmGrDg7","WmadAyofH3","ZzJHW5iGN5","v1HlnzQt6Q",
+"9XyT9dQ586","k85Ae07n1c","RkQkezFgtB","jfREu0BmCy","v1HlntlILt","7X3uyMaJQs","QworuRzaZA","MK07YaDGtS","9eoRcWDVWJ","gIYvEMK07Y",
+"5IhmGNhXdu","ZzJHWBGaQY","ReKEWAOgEe","55rfBQ6Lix","M6qcGix74r","aez9y5ZaEz","07n1csuY4x","5ZaEzaDGtS","2ZHdkjzUqR","0PktIIKxdL",
+"d7vjMWmadA","fcwDa5Drn0","k85AeXflUq","GSQwjFVMxo","Yw2oUNOHsz","IjTwPRxrsm","tjQxs7hyVv","GrDg7lkMUA","FPfSE2Nslm","uQIczGSQwj",
+"x3LDerhl0J","O3iyQ0Wr5y","QssNCyluBx","rhl0JyToGW","7fsYMW7cTs","CK5W7blLA9","StlDJiB08l","azIWp14FLR","jSjS35ZaEz","brhlQt59lR",
+"RmDcrMaJQs","QYxC0oVQp6","6q6L9StlDJ","2hEEUXyPZN","HfyNQlpF6W","WmadAfqypy","5nmWv8U2nU","OHaBzksJby","VIlwPK20wK","uLtKsaDGtS",
+"blLA9b29RJ","Cfgr3Yh1hF","FLsph2TRI7","tl72Wsx5Gl","jS1ajbZLvS","RpBQmzbIYY","oVQp6cQOnv","G1RhSfcJOy","P6bcgWaWsv","DLhzMZzJHW",
+"zFgtBlpF6W","xReecazIWp","1v5hHCK5W7","mz8gxFnPFB","Oz8yZfFDrJ","9XyT9Cfgr3","FxX9qUmaEv","IjTwPL7cGc","Zv7z00MR5X","JJs5mzFgtB",
+"580YDFxX9q","azIWpaFFss","Nxx9VQ6hMC","FcWrWo8Uyd","FwEJzuTacx","v2eC3d7vjM","PYBf4WmadA","k85AetlILt","RsQUq2DREs","aDGtSTCgPp",
+"jiVBPpv0i7","8U2nUwiHrZ","qaofNDLhzM","mz8gxtlILt","he9IAcShY2","MmsIoEdBKc","gdQsSRmDcr","mX2GE9y4lw","MK07YFVMxo","zqH0WRzaZA",
+"lj07QP6bcg","uZPqgQ6hMC","WreyPokgRi","S2DfutAOsr","7X3uyNhXdu","GrDg7KZamH","W3VFHcmXIX","QClRLnlaBy","HlUbFS77LH","lViBvIBe8k",
+"S77LHBCxeC","RmDcrChuy3","hi5X7XyPZN","RpBQm0PktI","Yh1hFRkQke","D6rBygf8rI","lCMxy7fKYU","uJScXi7WMQ","k85AebgJAz","sqVrfuLtKs",
+"qQxHPHP433","KASQ8pvgjS","ni2v1pmeCd","Q6hMCEOE1o","gjUTuP6bcg","Yw2oUS77LH","ZzJHWhUTw7","O3iyQOHaBz","AgJHQKASQ8","lViBvWaWsv",
+"StlDJlj07Q","8TxD70Kyfs","DG4sTuLtKs","L7cGcAkKTk","C2Irce6e4z","BGaQYM3zXL","MmKGJtAOsr","lj07QBGaQY","hYBCKuAWyp","GXdoHK20wK",
+"QssNClViBv","YOfrY0BmCy","qaofNECMvU","5IhmGdpe1v","LewvMQbxXc","Ss0ZuXyPZN","HzZT8BbwgA","Mkgy8StlDJ","jzUqRHlUbF","ReKEWCdyBV",
+"9iGoTlViBv","2hEEUCK5W7","Mm8siCNHmv","JkzUntuDyS","fcJOyRBhp0","Vprf2kB5nP","euZA5QWxoT","ydG8UYf2Ec","0h1b1RACuj","uZPqgjiVBP",
+"uTacxlkMUA","KZamHPYBf4","FLsphVBjhz","Mkgy8azIWp","LewvM6AFT0","SmGzvcShY2","5Drn0suY4x","JRJQBpiJSk","oQ87r2hEEU","QbxXcL7cGc",
+"CNHmvTa8f6","OHaBzuJScX","SjskQpAhR1","IKxdLS2Dfu","M6qcGGrDg7","14FLR7lUXZ","d85a9yToGW","CK5W7Kr8ys","i3pydtvdkD","iKqhrQClRL",
+"8RCUAF6PT2","tjQxsS2Dfu","cmXIXZJTXH","No0QbGrDg7","mz8gxJ2mQi","Ss0Zudjsrv","zFgtBSmGzv","JIqXiOxWIH","TCgPpCxVEf","Mkgy8JIqXi",
+"aFFss6q6L9","cShY2zqH0W","jzUqRB3qem","qUJMdiwzGk","sx5GlgIYvE","Cfgr3pT8wu","7ku1pfmIK1","pAhR1ZUnqt","lkMUAogLgc","HP433RzaZA",
+"kB5nPTCgPp","djsrvNxx9V","8hJdtBFkb8","pT8wuRsQUq","QworuHzZT8","MK07Yt59lR","x3LDeUl4a1","1LB1L2TRI7","CdyBVt59lR","CNHmv4W0Tl",
+"G1RhShYBCK","5ZaEzWreyP","Gv3Fqt98iW","WreyPjiVBP","prNT6Zv7z0","euZA5CxVEf","Kr8ysQ6hMC","LewvMzz4ZU","W3VFHzz4ZU","Vprf2uupzk",
+"RACuj5Mg9r","okgRi0ao3l","rhl0Jmz8gx","prNT6HP433","FcWrWuvf7A","CqqaDlXFOB","v1HlnbrhlQ","NOHszfqypy","oVQp6SjskQ","W7cTskB5nP",
+"lweGys93Ml","Ta8f6IBe8k","bgJAzaez9y","OUqFMK20wK","FNYIMChuy3","MmsIoMezSW","atef2P6bcg","yToGWECMvU","0Wr5y0MR5X","Z4I1vzqH0W",
+"JKWYRF6PT2","cQOnvfmIK1","LDk6fzY1GY","FcWrWDG4sT","h1zcHfaHir","yluBxfcwDa","EoToPMmsIo","9iGoTUlU3M","kB5nPgjUTu","48cHLiwzGk",
+"UlU3MBpYhV","CK5W7JKWYR","4dEz60YAGH","9eoRc0PktI","KASQ8qaofN","faHirFcWrW","618DihYBCK","7fsYMQ6hMC","ZuDtDY1mC0","sqVrfpiJSk",
+"MojnPFnPFB","S2DfuvOqCE","ru4UGt98iW","guMb8fFDrJ","AkKTkUlU3M","P6bcgChuy3","0BmCyFPfSE","lweGyMGlTF","618DiYh1hF","VLTy6gIYvE",
+"Yh1hFZ4I1v","NhXdulweGy","rz7UtCdyBV","lm0pDqaofN","pT8wuhi5X7","RACujUmaEv","dhSuHB3qem","TwanoUmaEv","zz4ZUM3zXL","WmadAHfyNQ",
+"Cp3mZbrhlQ","Chuy3RBhp0","tjQxs29QAz","No0QbNOHsz","7fKYUqaofN","RpBQmBbwgA","sqVrfaFFss","LDk6fWaim6","Pb1pa7fsYM","lsQGooQ87r",
+"nFqikZ4I1v","B3qemEdBKc","NOHsz3otm6","a00b58FmFH","rhl0JlCMxy","GrDg7P6bcg","29QAzzQt6Q","QssNCwDajX","jS1ajlH1kt","v8yFNvkCHH",
+"v2eC3W7cTs","D6rByO3iyQ","G1RhSCqqaD","euZA59eoRc","pFrrlPYBf4","IRh48jfREu","uQIczVjCZq","aDGtSnFqik","JXljWeuZA5","nlaBycL0aE",
+"xXTI4GWqqX","Q6LixWreyP","2Yz7El83Ud","okgRizbIYY","sqVrfvLsmS","MmsIolpF6W","QworueuZA5","3weIFcQOnv","d7vjMs93Ml","Twanol83Ud",
+"14FLRKASQ8","DQimpuoStw","0YAGHO3iyQ","QClRLO3iyQ","s7MxkoQ87r","HzZT8WPmlx","9eoRcCp3mZ","ciuWzKZamH","OxWIHGrDg7","Oz8yZ618Di",
+"IKxdLY1mC0","K4GS8MGlTF","fFDrJZ4I1v","l83UdOUqFM","HP433yEfy9","Qworu5iGN5","cQOnvnlaBy","Waim6uQIcz","29QAzDLhzM","FwEJzi7WMQ",
+"Nxx9VyofH3","cShY29iGoT","2NslmFNYIM","TCgPpnFqik","soy9t24ARF","07n1cG1RhS","U3yw5xciqp","yluBxlpF6W","Oz8yZJ2mQi","GrDg7W7cTs",
+"iqv4kVjCZq","7ku1pfLNg8","o8UydBpYhV","1j5L8atef2","TXQ0ZRzaZA","M6qcGdmoS7","8TxD7yofH3","pFrrlwiHrZ","CNHmvqUJMd","1LB1L2ZHdk",
+"RBhp0lsQGo","Mkgy8lj07Q","1v5hHoVQp6","FhtglUvlv4","SWfouqUJMd","07n1clsQGo","ogLgcuupzk","6q6L98FmFH","U3yw5RkQke","v8yFNFPfSE",
+"0h1b164s8N","6AFT0S2Dfu","UmaEv7lUXZ","x3LDeZzJHW","9XyT9QYxC0","VjCZqlsQGo","JIqXiOUqFM","lj07QHzZT8","AmdQdsx5Gl","J2mQilkMUA",
+"XflUqFPfSE","jtn0XxXTI4","VjCZqciuWz","dQ5865Mg9r","l83Udi7WMQ","wiHrZdmoS7","W3VFHb29RJ","tuDySFGzgp","07n1cyEfy9","D6rBy0h1b1",
+"prNT6bZLvS","9GXkXjSjS3","atef2Twano","7hyVvThjNn","JRJQBMaJQs","ru4UG8U2nU","vLsmSuQIcz","gdQsSAmdQd","MmKGJQbxXc","uoStwxReec",
+"MGlTFdmoS7","v8yFNuupzk","Vprf2Kr8ys","8TxD7jS1aj","gdQsSQworu","2TRI7Qworu","Mkgy8OxWIH","XyPZNHlUbF","0BmCyGv3Fq","QssNCBFkb8",
+"J2mQiNAFuw","AOgEeRkQke","JXljWsx5Gl","m4bxUIRh48","MmKGJdhSuH","x3LDeMmsIo","C2IrcFPfSE","NcICA2TRI7","lsQGo5nmWv","WPmlxzQt6Q",
+"jSjS3BFkb8","zqH0W2DREs","RkQkeYjB9t","M6qcG2Nslm","8RCUAaL6AJ","s4786K20wK","FjHXRdhSuH","24ARFgjUTu","Nxx9VNcICA","M6qcG07n1c",
+"MaJQsPYBf4","ZzJHWdhSuH","W3VFHDcpWB","taOXKtlILt","GWqqXF6PT2","TXQ0Zzz4ZU","Ta8f6LewvM","s7MxkLewvM","SWfous93Ml","dhSuHDcpWB",
+"rz7UtM6qcG","I7p2aqQxHP","uJScXoQ87r","e6e4zB3qem","taOXKuZPqg","ogLgcMaJQs","djsrvIRh48","Yw2oUn8pJ9","48cHL8RCUA","Vprf2tjQxs",
+"No0QbYjB9t","taOXKx3LDe","dpe1vsuY4x","soy9td85a9","ZuDtDMezSW","LbRTH2Nslm","IKxdLRsQUq","kB5nPOz8yZ","jeskSFPfSE","pAhR1vkCHH",
+"48cHL5nmWv","v1HlnxXTI4","RsQUqcmXIX","5ZaEzJJs5m","14FLRDQimp","0BmCyQnJ1S","ksJbyaez9y","RsQUqv2eC3","M3zXLpiJSk","16lHc0ao3l",
+"JIqXi5IhmG","Nxx9V0BmCy","CdyBVUl4a1","jS1ajJIqXi","LDk6fBFkb8","5IhmGnFqik","HfyNQlweGy","JJs5mt59lR","sqVrf5VZjS","XflUqM6qcG",
+"lH1ktt59lR","45cIHblLA9","jS1ajpWiOs","1j5L8ECMvU","uoStwiwzGk","GSQwjmz8gx","Uvlv4gtCA5","rKDLJCp3mZ","gtCA5jzUqR","G1RhSD6rBy",
+"fcJOySWfou","9eoRcMaJQs","Gv3FqxReec","7lUXZ4dEz6","iB08latef2","uTacxs93Ml","JRJQBpv0i7","rhl0JZ4I1v","2DREs5IhmG","07n1coGu6x",
+"Ss0ZuEdBKc","OxWIHpFrrl","MaJQspWiOs","RkQkeTXQ0Z","pvgjSFjHXR","hYBCKThjNn","uJScXPb1pa","ZJTXHSs0Zu","v2eC3DG4sT","FGzgpjtn0X",
+"MaJQsi7WMQ","0KyfsAmdQd","JkzUn9rlg9","dmoS7FwEJz","jfREucmXIX","h1zcHpFrrl","3otm6NcICA","ZuDtD5drc6","jzUqRatef2","QssNCtl72W",
+"RmDcrbZLvS","QYxC0XyPZN","tl72WHRxd8","AgJHQfaHir","zbIYYMaJQs","ZUnqtVprf2","RmDcrCp3mZ","SjskQv2eC3","RzaZACqqaD","jeskSQWxoT",
+"QworuJXljW","qQxHPSWfou","lm0pDJXljW","tl72W2hEEU","jzUqRhe9IA","taOXKuQIcz","sx5GlNcICA","FjHXRuN6r3","yToGW0MR5X","HzZT8Qworu",
+"uN6r3M6qcG","618DiLbRTH","CNHmvAmdQd","6q6L9VjCZq","7hyVvTwano","iB08llsQGo","8RCUABFkb8","DG4sTRACuj","gf8rIGWqqX","Zv7z06q6L9",
+"U3yw54dEz6","jeskSyofH3","IKxdLBCxeC","xXTI4CNHmv","CdyBVpAhR1","ReKEWOz8yZ","e6e4zuoStw","azIWpgtCA5","dmoS7aDGtS","GSQwjkB5nP",
+"EdBKcCNHmv","24ARFblLA9","45cIHciuWz","lj07Q0ao3l","pv0i7VjCZq","6AFT0cmXIX","oQ87r1LB1L","FwEJzZzJHW","55rfBa00b5","IjTwPP6bcg",
+"CK5W7CK5W7","ZhwG1dQ586","i3pyd16lHc","zY1GYMK07Y","QbxXcOHaBz","WDVWJZv7z0","uN6r3ZzJHW","m4bxUcQOnv","fcJOy9GXkX","VNCPdQ6hMC",
+"PYBf4zFgtB","i3pydb29RJ","FnPFBBCxeC","5IhmGdjsrv","GXdoHsx5Gl","blLA9IKxdL","mz8gxbZLvS","0KyfsQClRL","jS1aj7Ow5C","a00b5MGlTF",
+"Zv7z0lsQGo","9y4lwl83Ud","MezSWMezSW","ReKEWn1pmO","uTacx8U2nU","2Nslm1LB1L","uPX7GC2Irc","OxWIH8U2nU","VBjhztAOsr","fqypyMm8si",
+"aDGtSJKWYR","QworuNhXdu","k85AesuY4x","uQIczyluBx","MezSWgtCA5","bZLvSQworu","CxVEfO3iyQ","GSQwjzz4ZU","aFFssWaWsv","FPfSEF6PT2",
+"JkzUnjiVBP","WDVWJzmLYD","FhtglLbRTH","RmDcrjtn0X","1j5L8No0Qb","8xEKzGv3Fq","IBe8kFhtgl","6AFT0CK5W7","5nmWv0PktI","bZLvStjQxs",
+"48cHLMaJQs","VNCPdSjskQ","M6qcGa00b5","VLTy6OxWIH","guMb8ix74r","KsjRKX6Pin","4dEz6VIlwP","sqVrfxXTI4","S2DfuKZamH","jtn0X5Drn0",
+"48cHLhe9IA","wDajX8FmFH","RzaZAbZLvS","qUJMdh1zcH","QChxsY1mC0","yToGWgjUTu","LbRTHBbwgA","b29RJLewvM","dpe1vhUTw7","RBhp0FwEJz",
+"WPmlxdhSuH","ulk41KASQ8","UmaEvEOE1o","v1HlnqaofN","iKqhr9eoRc","2NslmzY1GY","QworuGv3Fq","Ul4a1v1Hln","EOE1oOxWIH","RmDcrIn3NS",
+"i7WMQ8cVD3","0Wr5yjSjS3","0Wr5y9rlg9","a00b5M3zXL","ru4UGM3zXL","POUYSCdyBV","5Drn0lj07Q","i3pydyvOMI","JKWYR16lHc","9XyT99y4lw",
+"VIlwPMm8si","lm0pDo8Uyd","Q6LixQ6Lix","a00b5iwzGk","Vprf2jzUqR","pWiOsfcwDa","t59lRMK07Y","tl72WuLtKs","9rlg9iB08l","HfyNQciuWz",
+"9XyT9qaofN","gtCA5JXljW","48cHLpWiOs","Q6LixqaofN","RxrsmnnP8o","yofH3Ta8f6","uPX7GSjskQ","ydG8Ui7WMQ","lViBvK4GS8","Waim6tl72W",
+"Twano8U2nU","zmLYDiB08l","0KyfsRzaZA","UlU3MU3yw5","3otm69rlg9","VjCZqzqH0W","IBe8kcmXIX","brhlQoQ87r","Mm8siAXpwE","MmsIo3weIF",
+"kZANmFwEJz","8TxD7QYxC0","PYBf4VerEA","zQt6QOUYuF","ulk41fmIK1","0Wr5yQnJ1S","jeskS580YD","lH1ktQWxoT","0ao3lyEfy9","14FLREoToP",
+"yofH3RACuj","fFDrJxReec","8U2nUZJTXH","i3pydoQ87r","RkQkegIYvE","LewvM7fKYU","IKxdL3otm6","s4786RmDcr","uN6r3Dz1R3","VBjhzdpe1v",
+"gjUTuS77LH","MK07Y48cHL","Waim6tjQxs","aez9yNxx9V","suY4xK20wK","FGzgpUl4a1","2DREss7Mxk","lXFOBKr8ys","0PktIAOgEe","NOHszRzaZA",
+"3weIFWaim6","pv0i7lkMUA","tuDySMm8si","M6qcGwDajX","Cp3mZzqH0W","45cIHQ6Lix","aez9yTa8f6","FFDuizmLYD","piJSkOz8yZ","AgJHQlViBv",
+"ogLgcU3yw5","RmDcrJkzUn","EdBKcQWxoT","oGu6xfcJOy","Z4I1vjiVBP","KZamHhUTw7","8TxD7HRxd8","4QMc9CxVEf","tlILt8hJdt","gf8rIC2Irc",
+"tjQxs6q6L9","gdQsSjS1aj","RBhp0Y1mC0","1LB1LnnP8o","ReKEWn8pJ9","xReecMojnP","MmsIoEoToP","bgJAz2Yz7E","POUYSCK5W7","EdBKcwDajX",
+"yluBxxciqp","HzZT88cVD3","lH1ktlj07Q","ZJTXHd85a9","RBhp00ao3l","d85a93otm6","prNT6zbIYY","6q6L9ni2v1","pFrrlDLhzM","3otm6soy9t",
+"tAOsrzFgtB","5VZjS5ZaEz","jSjS3MK07Y","14FLRTCgPp","1v5hHK20wK","0KyfsAgJHQ","9y4lwpFrrl","Ta8f645cIH","mz8gxhSSvQ","rz7UtSs0Zu",
+"FwEJzLbRTH","HfyNQU3yw5","prNT645cIH","fmIK164s8N","lj07Q3otm6","xciqpDG4sT","AmdQdK4GS8","ogLgcVerEA","ZJTXH2ZHdk","9iGoTHfyNQ",
+"QClRLcShY2","MK07Yzz4ZU","m4bxUC2Irc","CqqaDAXpwE","lm0pD8cVD3","wDajXoQ87r","BGaQYThjNn","JIqXiW7cTs","WMiS31LB1L","n1pmO5VZjS",
+"1LB1LL7cGc","okgRixciqp","FPfSE6AFT0","CK5W7EoToP","pmeCdpvgjS","ciuWzHfyNQ","PYBf4xXTI4","9iGoT7lUXZ","n1pmO8cVD3","2DREsThjNn",
+"RBhp0Uvlv4","MmsIoL7cGc","zFgtBkZANm","FnPFBCp3mZ","2TRI75ZaEz","xciqpgf8rI","HfyNQO3iyQ","xXTI4zmLYD","ZzJHWuPX7G","mz8gxYh1hF",
+"cL0aEjSjS3","QbxXc2TRI7","hi5X7ydG8U","gtCA5yofH3","WaWsvpv0i7","kB5nPMaJQs","zFgtBlkMUA","uJScXFGzgp","AOgEeZ4I1v","16lHcxXTI4",
+"zFgtBFGzgp","zQt6Q45cIH","EdBKcYh1hF","W3VFHQnJ1S","uQIcz9eoRc","fcwDaReKEW","S77LHHlUbF","W7cTsCIShG","7fsYMUmaEv","K4GS8nFqik",
+"B3qemcmXIX","sx5GlNxx9V","LbRTHIBe8k","sx5GlQbxXc","cmXIXGrDg7","jSjS3GXdoH","SmGzvBFkb8","gIYvE9y4lw","pAhR1uoStw","cShY2cShY2",
+"JkzUnHfyNQ","2Nslmjtn0X","Zv7z0ksJby","tjQxsLDk6f","piJSk7hyVv","16lHcFjHXR","Q6LixQChxs","VBjhzRACuj","5IhmGChuy3","5Mg9rNOHsz",
+"QChxsMezSW","nlaBypFrrl","jiVBPnnP8o","gdQsSs7Mxk","sqVrfD6rBy","Yf2Ecd7vjM","5Mg9ruAWyp","bgJAzs93Ml","rKDLJsqVrf","Mkgy8VerEA",
+"DQimpogLgc","lpF6WRxrsm","I7p2a24ARF","YOfrYHzZT8","16lHcaDGtS","i7WMQNo0Qb","F6PT2K4GS8","0BmCyQClRL","hSSvQb29RJ","yEfy92Nslm",
+"CdyBV5IhmG","ogLgcpAhR1","nFqikn8pJ9","m4bxUyofH3","4dEz67fsYM","qQxHPs4786","OxWIHM6qcG","OUYuFW3VFH","29QAzpvgjS","aDGtS2Nslm",
+"pFrrlcQOnv","QWxoTDLhzM","iB08lHlUbF","8FmFHuQIcz","lCMxyLDk6f","Rxrsmi3pyd","TXQ0ZVerEA","hSSvQhYBCK","WDVWJDG4sT","MmKGJQnJ1S",
+"guMb8h1zcH","azIWp9GXkX","cShY2x3LDe","jzUqRlj07Q","aL6AJUl4a1","0h1b1LewvM","M3zXLv1Hln","xXTI4Mkgy8","64s8NoVQp6","MezSWsoy9t",
+"45cIHsqVrf","1LB1LHfyNQ","pAhR1GSQwj","ZhwG1qaofN","uoStwZUnqt","RzaZA64s8N","G1RhSe6e4z","5Drn0gIYvE","0KyfsVjCZq","prNT6LewvM",
+"Yf2Ec0YAGH","0BmCy1j5L8","BbwgAO3iyQ","Yw2oU3weIF","WmadAsoy9t","RkQketl72W","EOE1o4QMc9","MmsIoIRh48","NcICAuPX7G","pvgjS0ao3l",
+"IRh48Kr8ys","JRJQBJIqXi","RxrsmMojnP","RzaZA9GXkX","45cIHjeskS","8FmFH64s8N","qUJMdblLA9","POUYSJXljW","PYBf4fLNg8","tvdkDtvdkD",
+"iqv4kXflUq","tjQxs5VZjS","9iGoT8RCUA","KsjRKpFrrl","lweGyfFDrJ","KASQ8XyPZN","bZLvS2TRI7","BpYhVCIShG","DG4sTLDk6f","C2Irc5Namm",
+"JIqXimX2GE","s93MllCMxy","lsQGojzUqR","xReecAXpwE","n8pJ9lj07Q","tAOsruZPqg","fLNg8ZhwG1","OxWIHxReec","Mm8sis93Ml","ZUnqtjiVBP",
+"iB08laFFss","dQ58614FLR","K20wK07n1c","VIlwPbgJAz","580YD8RCUA","I7p2anFqik","dQ5865iGN5","TXQ0ZzY1GY","taOXKYh1hF","JKWYRx3LDe",
+"QClRL9eoRc","ksJbyB3qem","0ao3ld7vjM","DcpWBjiVBP","jS1ajlj07Q","prNT6DLhzM","AgJHQguMb8","oVQp6fcJOy","D6rBydQ586","oGu6xVNCPd",
+"7fsYMZUnqt","4QMc9W3VFH","Kr8ys1LB1L","580YDuupzk","pT8wuNo0Qb","Y1mC0BbwgA","QWxoT7hyVv","djsrvv8yFN","RBhp045cIH","TwanolCMxy",
+"QYxC0MmsIo","I7p2avkCHH","Q6Lixl83Ud","4dEz655rfB","tlILtXyPZN","POUYSdQ586","IjTwPulk41","CNHmvCxVEf","1j5L8mX2GE","3otm6AIYUu",
+"lm0pDXyPZN","BGaQYyEfy9","0BmCySmGzv","nFqikfcwDa","he9IA2TRI7","jtn0X9GXkX","TwanoqUJMd","DG4sTtl72W","DcpWBS77LH","lViBvzqH0W",
+"vOqCEDLhzM","LDk6fXyPZN","MaJQsOUYuF","x3LDezmLYD","9rlg9uQIcz","YjB9tDLhzM","MojnP9iGoT","lweGyRsQUq","0PktIxReec","StlDJHRxd8",
+"FLsphBpYhV","e6e4z2hEEU","I7p2ayEfy9","lXFOBi7WMQ","UlU3MReKEW","HRxd8ThjNn","guMb8HzZT8","Oz8yZk85Ae","HRxd87ku1p","W7cTsWMiS3",
+"PYBf44dEz6","JKWYRBFkb8","FLsphix74r","ydG8UFhtgl","yofH3jiVBP","KsjRKReKEW","e6e4zogLgc","qUJMdsqVrf","48cHLFnPFB","RkQkefLNg8",
+"lsQGolj07Q","8U2nUiqv4k","OxWIHK4GS8","S2DfuCK5W7","VLTy6HlUbF","JkzUngjUTu","0KyfscShY2","HP433xReec","FNYIMa00b5","VLTy6lsQGo",
+"lj07QQChxs","yToGWCqqaD","iwzGk9eoRc","hYBCKcShY2","WaWsvvOqCE","RxrsmGv3Fq","HfyNQvkCHH","cL0aEB3qem","Dz1R3Q6hMC","gf8rII7p2a",
+"d85a9yluBx","Yf2Eciqv4k","8TxD7lH1kt","MK07YaL6AJ","3otm67hyVv","QnJ1SVprf2","dpe1vWmadA","dpe1vTa8f6","lm0pD5nmWv","LDk6ffcJOy",
+"ZuDtD1v5hH","uZPqguvf7A","ZuDtDzbIYY","JIqXijeskS","WreyPZv7z0","WaWsv16lHc","QssNCRBhp0","8cVD3yofH3","oQ87rnnP8o","VjCZqh1zcH",
+"uPX7GyofH3","CqqaDcmXIX","mX2GEpv0i7","yofH3lViBv","tlILtSjskQ","QbxXcs93Ml","X6Pin5Mg9r","K20wKCp3mZ","Waim6O3iyQ","RsQUqwiHrZ",
+"lViBvD6rBy","QChxshi5X7","MK07YzFgtB","gjUTuwDajX","NhXdu7fsYM","kZANmqaofN","uLtKsAgJHQ","FwEJzIKxdL","qaofN0h1b1","nFqikS2Dfu",
+"S77LHqaofN","sx5Gl8xEKz","fLNg87hyVv","x3LDeEdBKc","HzZT8Kr8ys","KsjRKLDk6f","FwEJzMK07Y","uZPqgjtn0X","9eoRct59lR","xReecK20wK",
+"VIlwPOxWIH","FNYIMuN6r3","NOHszwDajX","aFFssLewvM","7ku1pGv3Fq","M6qcGZuDtD","FLsphOUqFM","8FmFHi3pyd","soy9tWPmlx","fmIK1SmGzv",
+"Q6LixL7cGc","Zv7z0pWiOs","M6qcGGWqqX","hUTw79rlg9","t98iWgjUTu","JIqXi8TxD7","SWfou1LB1L","In3NSYw2oU","gdQsSVNCPd","QWxoTNo0Qb",
+"aFFsssx5Gl","uJScXYjB9t","hYBCKIKxdL","i3pyd4QMc9","ciuWzFjHXR","CNHmvfaHir","Yw2oUdpe1v","KASQ8nlaBy","guMb8dmoS7","AOgEebgJAz",
+"EOE1o1LB1L","07n1cTa8f6","DcpWBcmXIX","CdyBVMojnP","9GXkXXflUq","FnPFByvOMI","faHirQbxXc","07n1c8xEKz","5VZjSMojnP","ciuWz29QAz",
+"GSQwjMGlTF","tl72W7fKYU","1j5L8Ss0Zu","hUTw7K20wK","JRJQBbZLvS","aDGtSK20wK","8xEKzix74r","Fhtgli3pyd","6AFT0F6PT2","yToGWt59lR",
+"a00b5CK5W7","1j5L8AOgEe","VBjhzrhl0J","C2IrcoQ87r","blLA9t98iW","BGaQY6q6L9","2Yz7EaFFss","guMb8RkQke","4QMc98RCUA","StlDJRsQUq",
+"NOHsz07n1c","VerEAogLgc","7fKYUHRxd8","tuDySiwzGk","cQOnvsx5Gl","FGzgpFxX9q","nnP8oAmdQd","oQ87riwzGk","iwzGk9iGoT","hE1Ql618Di",
+"0KyfsfFDrJ","CqqaDpmeCd","lsQGoydG8U","uPX7GzFgtB","e6e4z1LB1L","gjUTud85a9","i3pydwDajX","TXQ0ZHlUbF","LbRTH5ZaEz","Kr8ysuPX7G",
+"5ZaEz48cHL","IjTwPtuDyS","VIlwPW3VFH","t98iWU3yw5","dQ5868U2nU","jtn0XUlU3M","JKWYRIn3NS","uN6r3LbRTH","DcpWBguMb8","k85AePOUYS",
+"5IhmG0Kyfs","3otm6W3VFH","aL6AJIn3NS","9rlg9MGlTF","bgJAzZzJHW","lkMUAGv3Fq","brhlQNOHsz","JkzUnBFkb8","RpBQmVjCZq","CxVEf9rlg9",
+"TXQ0ZJIqXi","oVQp6M6qcG","wDajX5ZaEz","CdyBVM6qcG","s93MlBGaQY","NAFuwn8pJ9","BGaQYEdBKc","Ss0Zu7hyVv","EoToP5iGN5","aez9ycShY2",
+"MojnPoQ87r","i7WMQNcICA","tuDySgf8rI","aez9yNOHsz","uvf7AzmLYD","PYBf4jtn0X","Mm8si8FmFH","cShY2lXFOB","uPX7Gi3pyd","tl72WZhwG1",
+"JJs5mWDVWJ","FxX9qDG4sT","bZLvSjzUqR","lkMUAtvdkD","sx5GlWaim6","AkKTktlILt","b29RJAmdQd","jzUqRtAOsr","RpBQmnlaBy","bgJAzx3LDe",
+"VerEAAXpwE","hYBCKuJScX","jiVBPFLsph","fFDrJHfyNQ","WreyP0YAGH","tl72WStlDJ","jtn0XjeskS","HP433taOXK","s93Mlv8yFN","ru4UGCfgr3",
+"3otm6faHir","WPmlxm4bxU","ZJTXHHRxd8","0Wr5yuLtKs","lCMxyBGaQY","Vprf2d7vjM","pWiOsChuy3","EdBKc2TRI7","9XyT9QnJ1S","i7WMQMojnP",
+"atef2t59lR","aDGtSZzJHW","cShY2iwzGk","m4bxUzbIYY","POUYSpT8wu","M3zXL29QAz","Pb1pa0h1b1","F6PT2nlaBy","jS1ajZzJHW","aL6AJkB5nP",
+"07n1cciuWz","tuDySrKDLJ","DQimpCqqaD","LbRTHdQ586","Cp3mZMm8si","0YAGHKr8ys","VjCZqn1pmO","CqqaDru4UG","Ul4a1AmdQd","7fsYMwiHrZ",
+"y94nwZJTXH","zFgtBMm8si","8U2nUUlU3M","QChxsQYxC0","9eoRcKZamH","ksJbyRkQke","Q6LixoVQp6","VLTy6StlDJ","07n1co8Uyd","oGu6xAIYUu",
+"5IhmG8FmFH","YjB9tcQOnv","580YDPb1pa","9GXkXtaOXK","MojnPzz4ZU","uJScXiB08l","WaWsvhYBCK","GSQwjDQimp","djsrv2DREs","Mkgy8jzUqR",
+"2Yz7EsqVrf","CqqaD9rlg9","OHaBzsqVrf","jfREuJIqXi","uoStwRmDcr","kB5nPTXQ0Z","Vprf20YAGH","7lUXZyluBx","LbRTH0BmCy","14FLRd85a9",
+"FjHXRhe9IA","4W0TlfmIK1","kB5nPG1RhS","X6PinXyPZN","4dEz6NcICA","W7cTsGWqqX","5Mg9r2DREs","MaJQsuLtKs","uQIczS77LH","CdyBVru4UG",
+"pmeCdv2eC3","WPmlxqUJMd","CdyBVhi5X7","AIYUuvOqCE","LDk6fC2Irc","4W0Tln8pJ9","AkKTka00b5","5Mg9rIn3NS","d85a9uLtKs","ZuDtDpmeCd",
+"Twano1j5L8","uAWyp8xEKz","8U2nUaL6AJ","WaWsvHfyNQ","MaJQsL7cGc","Waim6lm0pD","AXpwEwDajX","BGaQYUmaEv","yofH3RBhp0","FnPFBoQ87r",
+"ydG8UFxX9q","W7cTs4W0Tl","IKxdLaez9y","h1zcHqaofN","AIYUukB5nP","HfyNQvLsmS","5drc6MmKGJ","FNYIM0Wr5y","pvgjSXflUq","8TxD7Ul4a1",
+"WmadAjeskS","0KyfsbrhlQ","n1pmOiwzGk","3otm6KASQ8","v1Hln55rfB","sx5Gl55rfB","VNCPdtlILt","Pb1paNhXdu","MK07YfFDrJ","n1pmOBpYhV",
+"0h1b1I7p2a","FPfSEDG4sT","S77LHMGlTF","M3zXLDLhzM","hE1QltjQxs","ulk41zQt6Q","7lUXZNxx9V","Zv7z0TXQ0Z","QChxsAmdQd","pAhR1hYBCK",
+"fLNg8iwzGk","l83Ud9rlg9","jS1aj9y4lw","XflUql83Ud","WDVWJpvgjS","RsQUqrhl0J","2ZHdk9eoRc","G1RhS3otm6","azIWpQChxs","CNHmvhUTw7",
+"RxrsmDG4sT","8FmFHQChxs","i7WMQ24ARF","Uvlv40ao3l","K4GS8aFFss","guMb8qUJMd","uTacxOHaBz","QworuI7p2a","MmKGJyToGW","qQxHP9XyT9",
+"QnJ1SazIWp","LDk6f7X3uy","5VZjS2Nslm","GrDg7a00b5","d85a9J2mQi","ZhwG1L7cGc","uTacxWaim6","vLsmSGSQwj","Y1mC04QMc9","lCMxyQ6hMC",
+"pAhR1pWiOs","FxX9qru4UG","GWqqXVBjhz","MmsIoW7cTs","2NslmHfyNQ","Ta8f6e6e4z","Ul4a1gf8rI","XyPZNZ4I1v","blLA955rfB","NAFuw8FmFH",
+"D6rBypAhR1","vOqCEGWqqX","uoStwTa8f6","HfyNQi7WMQ","5nmWvBFkb8","JJs5msuY4x","QworunlaBy","Cfgr3TCgPp","aL6AJZuDtD","07n1crKDLJ",
+"FwEJzYw2oU","guMb8618Di","GrDg7hSSvQ","fcJOyQnJ1S","S77LHjfREu","FnPFBn1pmO","d7vjMRzaZA","Mkgy8x3LDe","BCxeCWreyP","fmIK1QnJ1S",
+"G1RhSFcWrW","tuDySVLTy6","cQOnvd7vjM","uPX7GuoStw","UmaEvHP433","Vprf2C2Irc","lH1ktCfgr3","lXFOBOUYuF","jeskSlViBv","gtCA5MK07Y",
+"pvgjSi3pyd","uZPqgWMiS3","OUYuF7fKYU","OUYuFEoToP","BpYhVWMiS3","14FLRfcwDa","pAhR1fcJOy","he9IACNHmv","ECMvUjS1aj","IRh48mX2GE",
+"HRxd8qaofN","dpe1vzmLYD","h1zcHTXQ0Z","yEfy9xXTI4","ZUnqtjfREu","7hyVvKASQ8","GSQwj7X3uy","0ao3l8hJdt","JXljWXflUq","U3yw5fqypy",
+"ciuWz8FmFH","lj07QStlDJ","5ZaEz5ZaEz","i7WMQIRh48","9eoRczqH0W","NcICAAIYUu","gIYvExReec","7lUXZ2TRI7","HzZT8RsQUq","HlUbF7X3uy",
+"nnP8oOxWIH","iwzGkhSSvQ","8FmFHjSjS3","o8UydBCxeC","LewvMXflUq","7Ow5CpiJSk","D6rByFNYIM","FwEJzo8Uyd","9rlg91j5L8","xReecoVQp6",
+"sqVrf9eoRc","9eoRc0BmCy","HlUbFJ2mQi","t59lRhUTw7","atef2qQxHP","ix74rECMvU","B3qemjtn0X","bZLvSB3qem","x3LDekZANm","iB08l7hyVv",
+"MmsIoFPfSE","BCxeCyofH3","HlUbFJkzUn","uZPqgo8Uyd","DG4sTxXTI4","NAFuw9GXkX","ogLgcX6Pin","ulk41VjCZq","lXFOBPOUYS","Yh1hFCK5W7",
+"jzUqRG1RhS","mz8gx580YD","FVMxoVIlwP","NOHszDz1R3","XyPZNGv3Fq","QYxC0P6bcg","uZPqg5VZjS","5iGN5pAhR1","QClRLJ2mQi","uQIczZJTXH",
+"BFkb8yluBx","Cp3mZHP433","zFgtBhE1Ql","AgJHQReKEW","Ul4a1Vprf2","16lHclH1kt","tuDySFhtgl","In3NSWaWsv","QworuU3yw5","lj07Qy94nw",
+"4W0TlGXdoH","v2eC30Kyfs","guMb8TCgPp","5drc64dEz6","KZamHpv0i7","WMiS3VjCZq","jfREulViBv","3otm6No0Qb","SWfouksJby","ReKEWBpYhV",
+"9rlg9OHaBz","WPmlxBGaQY","M6qcGlpF6W","29QAzh1zcH","iwzGkdmoS7","v2eC3UlU3M","jfREuZzJHW","NAFuwBbwgA","suY4x55rfB","bZLvSmX2GE",
+"SjskQru4UG","e6e4zRsQUq","GrDg7MaJQs","7fKYUChuy3","Ss0ZuprNT6","WPmlxcmXIX","ciuWzYw2oU","ReKEWfaHir","rz7Ut5ZaEz","a00b5gIYvE",
+"JIqXicmXIX","CNHmvGSQwj","0h1b1JkzUn","IKxdLru4UG","sqVrfbgJAz","RxrsmkZANm","Gv3Fq7ku1p","JXljWOUqFM","Yw2oU580YD","faHirJJs5m",
+"FFDuiLDk6f","7fKYUjtn0X","fcJOyMK07Y","0BmCyNOHsz","4QMc9YOfrY","oQ87rRkQke","Zv7z0lH1kt","tuDyS8FmFH","0Wr5ypWiOs","ReKEW7fsYM",
+"iKqhrWmadA","Ul4a1TCgPp","qQxHPnnP8o","t98iWMezSW","xReeclCMxy","uoStwOHaBz","X6PinGSQwj","uJScXBpYhV","rhl0JqQxHP","D6rByzqH0W",
+"xciqp7Ow5C","iKqhrlViBv","hE1QlFLsph","hi5X78hJdt","Mm8siuTacx","zz4ZUQnJ1S","IjTwPpFrrl","Ss0ZuokgRi","b29RJeuZA5","pWiOssuY4x",
+"X6PinVIlwP","QYxC05IhmG","fFDrJD6rBy","RmDcrt59lR","UmaEv64s8N","MmKGJ5nmWv","b29RJ0BmCy","d7vjM7hyVv","Pb1pawiHrZ","euZA5jtn0X",
+"rz7UtNo0Qb","fLNg8IKxdL","NAFuwReKEW","cShY2WMiS3","zFgtBfqypy","HRxd8rz7Ut","3weIFnnP8o","nFqik0PktI","64s8N2ZHdk","Zv7z0zz4ZU",
+"VLTy62ZHdk","lsQGoJKWYR","QWxoTQ6hMC","hSSvQNxx9V","7lUXZwDajX","FGzgpaL6AJ","IjTwPTXQ0Z","lsQGozHF1q","Oz8yZaL6AJ","VNCPdMkgy8",
+"CK5W7F6PT2","ydG8Uiqv4k","RxrsmSs0Zu","7fsYMPb1pa","WmadAgtCA5","2hEEUv8yFN","jeskSFhtgl","sx5GlSjskQ","KsjRKHzZT8","618DiL7cGc",
+"CIShGpT8wu","uAWypHlUbF","PYBf4tuDyS","14FLR5IhmG","GSQwjbrhlQ","ciuWzReKEW","14FLRwDajX","WPmlxgtCA5","O3iyQZhwG1","7Ow5CuoStw",
+"RkQke0BmCy","dQ586KASQ8","ZUnqtX6Pin","OxWIHMmKGJ","IjTwPQWxoT","sqVrfcQOnv","4dEz6zmLYD","fmIK1BGaQY","aFFssNhXdu","pmeCdFNYIM",
+"zz4ZUwDajX","zbIYY7Ow5C","WaWsvyluBx","lCMxyjtn0X","VerEACIShG","dpe1vn8pJ9","oVQp607n1c","pv0i7SbRYy","oGu6xWaWsv","Z4I1vjfREu",
+"RpBQm9y4lw","ZhwG1y94nw","sx5Glzz4ZU","VNCPdLbRTH","AmdQdwDajX","OHaBzIn3NS","l83UdcShY2","VBjhzlH1kt","WMiS3TCgPp","yvOMI6AFT0",
+"t59lRYw2oU","9GXkXReKEW","okgRihE1Ql","FNYIMcQOnv","MojnPBpYhV","ciuWzdQ586","zQt6QZJTXH","zqH0WqQxHP","AXpwE48cHL","he9IAYf2Ec",
+"9eoRcyvOMI","AIYUuaFFss","y94nwtvdkD","HP433BpYhV","pWiOsRxrsm","FVMxo5ZaEz","AmdQd5iGN5","S2DfutlILt","Ul4a1DcpWB","Q6LixSs0Zu",
+"9y4lwU3yw5","oVQp6nFqik","W3VFHMm8si","JIqXiHlUbF","zQt6QXflUq","QWxoTru4UG","In3NSfcwDa","nFqik9XyT9","QbxXcvLsmS","QssNCRsQUq",
+"ksJbyjSjS3","gtCA5yToGW","ciuWz7X3uy","Yh1hFM6qcG","lweGyMezSW","dQ586QYxC0","Gv3FqgIYvE","FnPFBYf2Ec","xXTI4pv0i7","MmKGJQClRL",
+"lCMxyCfgr3","NhXduatef2","AIYUuOxWIH","BGaQYm4bxU","mX2GES77LH","RsQUquoStw","JkzUnvLsmS","blLA9MGlTF","MmKGJOxWIH","zFgtBAOgEe",
+"euZA5yEfy9","cmXIXpWiOs","S77LHMaJQs","qUJMdJRJQB","oQ87rfaHir","0h1b1uvf7A","GSQwj5nmWv","0MR5XTCgPp","t98iWMGlTF","WPmlxsx5Gl",
+"kZANm1LB1L","IjTwP0Kyfs","rz7UtfcwDa","ulk41wiHrZ","Cfgr3ThjNn","qQxHPFLsph","B3qemhE1Ql","tlILtlj07Q","DQimp2hEEU","TCgPpRpBQm",
+"07n1czbIYY","QWxoTJKWYR","NcICAiKqhr","8TxD74dEz6","tuDySiB08l","VBjhz8TxD7","pT8wu2Nslm","SjskQuPX7G","TwanoUl4a1","5drc6fFDrJ",
+"lXFOBwiHrZ","qaofNIBe8k","uN6r3k85Ae","CqqaD9iGoT","8hJdtlH1kt","fmIK16q6L9","xciqpS77LH","WMiS3fcJOy","7ku1plXFOB","m4bxUZuDtD",
+"ZzJHW6AFT0","sqVrfRzaZA","aFFssjtn0X","Pb1paNOHsz","kB5nPFnPFB","DQimppAhR1","7ku1piwzGk","jSjS3AOgEe","b29RJRkQke","CxVEfzQt6Q",
+"aDGtSokgRi","I7p2aQworu","7X3uyfFDrJ","gjUTuqaofN","WMiS3W3VFH","bgJAzIn3NS","14FLRoQ87r","XyPZNNOHsz","CIShGhi5X7","IKxdLMezSW",
+"5VZjSOz8yZ","qQxHP0Kyfs","bZLvSXflUq","0h1b1CNHmv","AXpwEFhtgl","oQ87rDQimp","DcpWBOxWIH","pAhR1Fhtgl","QbxXcfcwDa","hYBCKbZLvS",
+"fLNg8AgJHQ","GWqqX0PktI","K20wKsoy9t","PYBf429QAz","FwEJzGSQwj","4W0TlWMiS3","Oz8yZe6e4z","iqv4kW7cTs","QChxspT8wu","64s8NAkKTk",
+"ZuDtDYOfrY","QworucL0aE","RBhp0nFqik","3weIFjtn0X","CIShGDLhzM","9iGoT29QAz","M6qcGQYxC0","MaJQsjS1aj","tuDySOz8yZ","t98iWuoStw",
+"cL0aEWPmlx","djsrvtvdkD","CdyBVaL6AJ","8RCUAG1RhS","JkzUn8hJdt","UlU3M6q6L9","jfREulH1kt","sx5Gl0MR5X","9eoRcoGu6x","JRJQBRxrsm",
+"FLsph5IhmG","fcwDaP6bcg","aFFsso8Uyd","blLA9Mkgy8","0MR5XuJScX","2hEEURsQUq","kZANm0YAGH","zFgtBoVQp6","AkKTkCfgr3","ix74r5Mg9r",
+"Yw2oUM6qcG","AXpwExciqp","Ul4a1FFDui","5Mg9rUmaEv","AkKTkWaWsv","LewvMSmGzv","faHirVLTy6","ZhwG1uLtKs","0PktIBCxeC","Oz8yZzHF1q",
+"oVQp6S77LH","NAFuwRsQUq","brhlQChuy3","W3VFHDG4sT","v2eC3JKWYR","uupzkkB5nP","VLTy6pWiOs","WMiS37fsYM","rhl0J0h1b1","FLsphiwzGk",
+"9rlg9B3qem","M3zXLlsQGo","djsrvYw2oU","vLsmSC2Irc","TCgPplCMxy","oGu6xDcpWB","Kr8ysuLtKs","zz4ZUL7cGc","CdyBV7fKYU","FGzgp0h1b1",
+"6AFT0kZANm","WPmlxeuZA5","9XyT9Ss0Zu","YOfrYokgRi","Y1mC0gf8rI","gtCA5gjUTu","pmeCdrhl0J","o8UydEOE1o","uZPqgOUqFM","7X3uygf8rI",
+"9iGoTjSjS3","sqVrfThjNn","ZJTXHqQxHP","zQt6QPb1pa","Yw2oUJ2mQi","WmadAQssNC","Uvlv4VjCZq","uAWypyvOMI","WmadAlweGy","RzaZAFnPFB",
+"hYBCKrhl0J","Qworuv8yFN","ciuWzIjTwP","Waim6rz7Ut","HzZT8I7p2a","uN6r3QnJ1S","SbRYycShY2","v2eC3uupzk","8TxD7BpYhV","jSjS3l83Ud",
+"QChxsDLhzM","djsrvuN6r3","kZANmBpYhV","MojnPrKDLJ","iqv4k14FLR","WaWsv1LB1L","uvf7AbZLvS","QChxsqQxHP","CqqaDqaofN","WmadA6AFT0",
+"NOHszoGu6x","n8pJ9RmDcr","9iGoT14FLR","S77LHHfyNQ","yvOMIKr8ys","kZANm1j5L8","FnPFBuupzk","FxX9qIRh48","24ARFXyPZN","rKDLJrKDLJ",
+"LbRTHmX2GE","ZzJHW8TxD7","tjQxsRzaZA","pFrrl9GXkX","YOfrYciuWz","dQ586QClRL","Mm8siBGaQY","OUqFMRBhp0","TCgPpOxWIH","5NammWmadA",
+"soy9tMmsIo","wDajX5IhmG","FhtglZuDtD","EdBKcix74r","iB08lYh1hF","EoToPyluBx","ksJby7Ow5C","tl72WNcICA","JRJQBtAOsr","AmdQd580YD",
+"ogLgc7fsYM","kB5nPPOUYS","HzZT8gIYvE","1LB1LQnJ1S","VNCPdoVQp6","5iGN5SmGzv","2Nslm0PktI","he9IAOxWIH","lm0pDtAOsr","lpF6WIRh48",
+"qaofNlm0pD","2ZHdka00b5","QClRLNcICA","ix74rqUJMd","LewvMhe9IA","b29RJiB08l","zHF1qjS1aj","oGu6xG1RhS","8cVD3vkCHH","Nxx9VJRJQB",
+"e6e4zVjCZq","cQOnv9GXkX","yEfy9Cfgr3","m4bxUhSSvQ","Cfgr3ydG8U","IKxdLhUTw7","Q6hMCVIlwP","OUqFM6q6L9","fqypye6e4z","t59lRB3qem",
+"M3zXLIjTwP","zY1GYG1RhS","Yw2oUzFgtB","9GXkXDz1R3","iwzGkwDajX","VLTy6cmXIX","Ta8f6B3qem","Waim6euZA5","gdQsSW3VFH","yluBx5Namm",
+"2Yz7EPYBf4","F6PT2azIWp","jeskSlm0pD","Mm8siTwano","DQimphi5X7","OxWIHZ4I1v","FwEJz9eoRc","FGzgpEoToP","KASQ8hSSvQ","piJSkkZANm",
+"UlU3MAkKTk","FxX9qNcICA","atef26AFT0","Cp3mZNhXdu","Yf2EcciuWz","X6PinlH1kt","W3VFH5Namm","Chuy3s4786","uoStw618Di","guMb8Waim6",
+"Z4I1vWDVWJ","uoStwUl4a1","Cfgr35IhmG","MaJQsJIqXi","jSjS37fKYU","Nxx9VReKEW","ix74rt98iW","6q6L9FNYIM","tAOsrECMvU","ZzJHWJkzUn",
+"0MR5X24ARF","WmadAWaWsv","FhtglK20wK","Yf2EcWaWsv","StlDJoGu6x","EOE1oWaim6","In3NSI7p2a","uQIcz0Wr5y","UmaEvcmXIX","oGu6xZuDtD",
+"l83UdKsjRK","55rfBCdyBV","hUTw7MezSW","P6bcgFFDui","8TxD7prNT6","5iGN58cVD3","uPX7GYh1hF","iB08lDcpWB","rz7UtQ6Lix","piJSk7ku1p",
+"o8UyddQ586","uoStwpWiOs","wDajXAOgEe","hE1QlciuWz","K4GS8uPX7G","BFkb8RzaZA","Uvlv464s8N","AmdQdZzJHW","StlDJzHF1q","DLhzMAgJHQ",
+"VIlwPFjHXR","qQxHPiKqhr","pv0i7ulk41","sx5GlPYBf4","P6bcgo8Uyd","ix74r2Yz7E","lj07QAmdQd","WPmlxAIYUu","ZhwG1hi5X7","ZuDtDDz1R3",
+"O3iyQuPX7G","ZuDtDMaJQs","4dEz65Drn0","jeskS48cHL","SbRYyn8pJ9","uupzkK4GS8","he9IA8RCUA","AOgEes7Mxk","DcpWBLewvM","lpF6WNAFuw",
+"XflUqtl72W","pFrrlRkQke","3otm6GrDg7","s7MxkRsQUq","1v5hH45cIH","Y1mC0fqypy","ix74rAkKTk","CK5W7HP433","lsQGoFcWrW","vLsmSjiVBP",
+"45cIHfqypy","euZA5uAWyp","9rlg99XyT9","Vprf28U2nU","qUJMdHP433","RmDcr8TxD7","0YAGHsx5Gl","IBe8kyluBx","JkzUnjzUqR","MmKGJksJby",
+"DcpWB9iGoT","ZhwG1VBjhz","jeskSG1RhS","qaofN0ao3l","aDGtSn8pJ9","cQOnvZv7z0","cQOnvhUTw7","0Kyfs5Namm","aez9yjSjS3","GXdoHYh1hF",
+"48cHLhSSvQ","Y1mC0FVMxo","Q6hMCtuDyS","8xEKzwDajX","fmIK1580YD","nlaBywDajX","yvOMINAFuw","oGu6xAgJHQ","i3pydCp3mZ","uvf7AZv7z0",
+"0MR5XZUnqt","n8pJ9lweGy","pWiOs0BmCy","48cHL7lUXZ","3otm6i7WMQ","8xEKzNo0Qb","TXQ0Z8cVD3","fcwDaQnJ1S","HP433ciuWz","jS1ajRmDcr",
+"euZA5taOXK","580YDNcICA","K20wKa00b5","IKxdLGXdoH","HlUbFjeskS","jeskSBbwgA","i7WMQyluBx","QClRLTCgPp","yvOMIFcWrW","uLtKs0PktI",
+"7ku1pb29RJ","K4GS8QChxs","SjskQcmXIX","P6bcgi3pyd","wiHrZtjQxs","t59lRsx5Gl","48cHL7ku1p","618DijeskS","14FLRgf8rI","CxVEfCqqaD",
+"BpYhVKsjRK","lj07Q2Nslm","ZzJHWwiHrZ","aL6AJjiVBP","Kr8ysDLhzM","Nxx9VQWxoT","hE1QlVNCPd","cShY2MaJQs","Q6LixChuy3","nlaByVLTy6",
+"l83UdnlaBy","FNYIMjS1aj","MK07YS77LH","6AFT0aDGtS","7X3uy6AFT0","WDVWJTCgPp","RpBQmBpYhV","yEfy9zz4ZU","3weIFOUYuF","2hEEUFhtgl",
+"uupzk3weIF","WMiS3Nxx9V","BpYhVprNT6","vLsmSzbIYY","gf8rIRpBQm","0h1b1i3pyd","1v5hHyvOMI","AmdQduPX7G","soy9the9IA","dQ586J2mQi",
+"24ARFJIqXi","azIWpThjNn","azIWpQYxC0","t59lRFcWrW","aDGtShe9IA","jtn0XgtCA5","lj07Qix74r","aDGtSciuWz","taOXKZuDtD","d85a9Nxx9V",
+"taOXKMK07Y","8cVD355rfB","wiHrZW7cTs","Kr8ysNhXdu","iqv4k8U2nU","7X3uyzbIYY","IjTwP7fsYM","OxWIHdjsrv","8hJdthUTw7","DG4sT1v5hH",
+"jSjS3QWxoT","In3NSaFFss","Ul4a1iqv4k","aL6AJ1LB1L","S77LHDLhzM","4dEz69rlg9","FGzgpQssNC","Q6hMCXyPZN","qUJMdlj07Q","Twano5drc6",
+"Q6LixNxx9V","XyPZNuupzk","t98iWzmLYD","AgJHQO3iyQ","hUTw7JXljW","vLsmS55rfB","vLsmSrKDLJ","pWiOsUmaEv","G1RhSs7Mxk","ZuDtDsoy9t",
+"rhl0JnlaBy","jS1ajzY1GY","8TxD7y94nw","Oz8yZ5Drn0","faHiroGu6x","Q6LixWDVWJ","cmXIX64s8N","uLtKsXyPZN","h1zcHtjQxs","2TRI7jtn0X",
+"Cfgr3WreyP","y94nwbZLvS","oGu6xSs0Zu","VerEAtl72W","ZhwG19iGoT","atef2fFDrJ","lkMUAvkCHH","brhlQW7cTs","IjTwPi3pyd","0YAGHpWiOs",
+"XyPZN0YAGH","uLtKsyEfy9","TCgPpAgJHQ","Qworuzz4ZU","bZLvSWmadA","yofH3mz8gx","1j5L8BbwgA","uZPqgBbwgA","mz8gxUvlv4","lXFOBzY1GY",
+"HlUbFQChxs","lm0pDUvlv4","RmDcrk85Ae","CqqaDiqv4k","GWqqXUlU3M","aez9yjtn0X","uoStw7lUXZ","FLsphZJTXH","gf8rIOUqFM","blLA9v1Hln",
+"azIWpCK5W7","QbxXcI7p2a","DQimp9eoRc","MezSW5VZjS","IRh48Ul4a1","0ao3liB08l","vkCHHVNCPd","n8pJ9ydG8U","GrDg79XyT9","DcpWBvkCHH",
+"JkzUnyluBx","Qworusx5Gl","WaWsvVLTy6","WaWsv2ZHdk","lsQGov2eC3","UmaEv24ARF","6AFT0uAWyp","tAOsrCIShG","rhl0JvOqCE","WDVWJDLhzM",
+"SbRYyNhXdu","gf8rIEOE1o","t59lRMm8si","dhSuHlm0pD","14FLRQ6Lix","iwzGkAXpwE","bZLvS1j5L8","cL0aEPOUYS","7ku1p9rlg9","BFkb8MGlTF",
+"gf8rI9eoRc","cShY2jeskS","mz8gxGWqqX","zqH0WlXFOB","ReKEWVjCZq","gdQsSUlU3M","2hEEUsqVrf","MmKGJRkQke","LbRTHMmKGJ","pAhR19GXkX",
+"AkKTkNo0Qb","FcWrW7fKYU","FcWrWfmIK1","fcJOyIKxdL","JKWYRokgRi","2NslmBpYhV","jzUqRJKWYR","8TxD7Q6hMC","yluBxMmsIo","zQt6QuLtKs",
+"zqH0WMmKGJ","NhXdugf8rI","x3LDeGSQwj","LDk6fB3qem","vkCHHS2Dfu","SbRYywiHrZ","8hJdt2hEEU","K20wK3weIF","rhl0JWmadA","580YDQChxs",
+"618DiJ2mQi","hUTw7fmIK1","yofH3zFgtB","AkKTktaOXK","suY4xaez9y","oVQp6MGlTF","JIqXiKsjRK","lH1kt8xEKz","a00b5CxVEf","KZamHvkCHH",
+"MmsIoKsjRK","qaofNpmeCd","KASQ8v2eC3","piJSkSmGzv","gf8rIe6e4z","7X3uyFxX9q","vOqCEuTacx","v1HlnKr8ys","VIlwPXyPZN","aFFssHlUbF",
+"Gv3FqZUnqt","BFkb8QChxs","7X3uyVBjhz","KZamHtaOXK","ReKEWWMiS3","X6PinazIWp","zbIYY580YD","Cfgr3o8Uyd","1v5hHYh1hF","PYBf4CK5W7",
+"9eoRcFPfSE","uN6r3lViBv","tjQxsyofH3","Yf2EcMkgy8","Dz1R3VerEA","EoToPZuDtD","CK5W78xEKz","piJSkNcICA","WDVWJ0PktI","FVMxoTCgPp",
+"djsrv0Kyfs","lH1kthE1Ql","rKDLJdhSuH","MmsIoS77LH","v2eC39rlg9","vOqCE5drc6","jzUqRd85a9","HlUbF8TxD7","LDk6fni2v1","jS1ajhYBCK",
+"SmGzvix74r","fcwDa2ZHdk","8FmFHGXdoH","DcpWBxReec","GrDg7Y1mC0","7fsYMqQxHP","jSjS3DcpWB","Uvlv4FwEJz","8cVD32Yz7E","zHF1q5iGN5",
+"ReKEWSs0Zu","7fKYUTXQ0Z","LewvMcL0aE","RpBQmx3LDe","uAWyphSSvQ","Gv3FqtvdkD","gjUTuaDGtS","2hEEURACuj","zY1GYuvf7A","JJs5mv2eC3",
+"Q6LixSbRYy","M3zXLWMiS3","lXFOBlCMxy","HP433dpe1v","jiVBPWMiS3","FwEJz2Nslm","0YAGHKASQ8","ZzJHW5drc6","yEfy95Drn0","uvf7AQ6Lix",
+"bgJAzGrDg7","sx5GlSbRYy","CqqaDhe9IA","FcWrWcShY2","lkMUAaFFss","Oz8yZEOE1o","Kr8ysAmdQd","RzaZAZUnqt","DcpWB14FLR","AkKTkZ4I1v",
+"24ARF9iGoT","5nmWvuTacx","wiHrZrhl0J","K20wKQYxC0","W3VFHMkgy8","1v5hHIKxdL","In3NSxReec","gf8rIpFrrl","fFDrJFNYIM","uPX7G9iGoT",
+"sqVrfxReec","suY4x7Ow5C","JJs5mL7cGc","jeskSD6rBy","nnP8od85a9","x3LDenFqik","M6qcGU3yw5","4dEz6vkCHH","soy9tni2v1","zz4ZUVIlwP",
+"hYBCKYh1hF","LbRTHlj07Q","HRxd8jeskS","fLNg8FjHXR","kB5nPfaHir","gtCA5BbwgA","n1pmOydG8U","s4786In3NS","t59lR3otm6","8hJdtuJScX",
+"a00b5dQ586","pAhR1SjskQ","iqv4klH1kt","QbxXcjzUqR","xciqpyluBx","fLNg8B3qem","ZhwG12DREs","EdBKclCMxy","dmoS7POUYS","lH1ktFPfSE",
+"3otm6yluBx","OUYuFF6PT2","WDVWJNhXdu","GSQwjLDk6f","FjHXRwiHrZ","7Ow5C618Di","3weIFFPfSE","DQimp29QAz","CK5W748cHL","suY4xzFgtB",
+"MaJQsbZLvS","1v5hHCxVEf","WDVWJDz1R3","he9IAcQOnv","SbRYyTa8f6","uJScX8TxD7","FcWrWFcWrW","BFkb8Q6hMC","djsrvksJby","LewvMO3iyQ",
+"lkMUAcmXIX","prNT6K20wK","LDk6fpAhR1","qQxHP8cVD3","9y4lwWPmlx","iwzGkL7cGc","tl72WOz8yZ","uPX7GMm8si","KsjRKFhtgl","2Yz7E8TxD7",
+"jS1ajXyPZN","zFgtBvLsmS","RpBQmNcICA","rz7UtO3iyQ","xXTI4XyPZN","lCMxyCK5W7","BpYhVIRh48","pWiOs8U2nU","QworuFPfSE","S2DfuB3qem",
+"fqypyv1Hln","FcWrW4QMc9","hYBCKSjskQ","fqypyX6Pin","tuDySGv3Fq","aFFss9XyT9","JXljWMaJQs","ulk41uvf7A","uZPqgTwano","BbwgAqQxHP",
+"okgRiVprf2","StlDJ8cVD3","fFDrJsoy9t","oVQp6pmeCd","Ta8f6EoToP","nFqikDcpWB","45cIHsx5Gl","AOgEeYh1hF","Ta8f6SbRYy","lweGydQ586",
+"zmLYDprNT6","QClRLni2v1","WPmlxRBhp0","JKWYRDcpWB","RpBQmKsjRK","lkMUAhe9IA","yEfy9y94nw","iKqhrQ6Lix","k85Ae5VZjS","B3qemCIShG",
+"uQIczjSjS3","djsrvJ2mQi","qUJMdaFFss","AkKTkpmeCd","FVMxo0YAGH","YOfrYsx5Gl","ydG8UazIWp","atef2mX2GE","mX2GEfcJOy","ulk41CqqaD",
+"5IhmG9eoRc","WMiS3XflUq","K20wKd85a9","jeskS8TxD7","UlU3MaL6AJ","0KyfshYBCK","CdyBVd85a9","guMb8QYxC0","ZzJHWBCxeC","zmLYDfaHir",
+"tuDySK4GS8","64s8Nb29RJ","48cHLi7WMQ","FNYIM5Mg9r","U3yw5tl72W","NAFuwIRh48","d7vjMhi5X7","5IhmGaFFss","i3pyd8TxD7","cQOnvO3iyQ",
+"EOE1o2Yz7E","pvgjSzHF1q","guMb8ECMvU","Q6LixTwano","4W0TlMm8si","s93Mldpe1v","blLA9blLA9","bZLvSAOgEe","gtCA5ogLgc","LDk6fatef2",
+"EOE1ouoStw","I7p2azbIYY","prNT6kZANm","K20wKfqypy","OUYuF1j5L8","HP433DG4sT","ulk41EoToP","UlU3MUl4a1","CqqaDvkCHH","tvdkDe6e4z",
+"8TxD7wiHrZ","lXFOBQChxs","Mm8siNo0Qb","cQOnvRACuj","nlaByJJs5m","djsrvKsjRK","dQ5867lUXZ","pAhR1fmIK1","Ul4a1pWiOs","5Mg9rSWfou",
+"yEfy9uLtKs","G1RhSciuWz","lViBvFVMxo","KZamHrhl0J","1j5L8EdBKc","uJScXLbRTH","618DinFqik","BGaQY8hJdt","GSQwjTCgPp","3otm6lkMUA",
+"2hEEUgdQsS","djsrvgdQsS","I7p2aQnJ1S","BCxeC9rlg9","X6Pint98iW","0Kyfs5VZjS","uPX7GSbRYy","t59lRfmIK1","RpBQme6e4z","vOqCEi7WMQ",
+"uAWypCK5W7","Zv7z0MaJQs","uvf7AK20wK","rKDLJ0MR5X","QnJ1St98iW","8cVD3HzZT8","64s8NQworu","LDk6fSmGzv","n8pJ9LewvM","pWiOs9XyT9",
+"0BmCy2hEEU","WMiS3lXFOB","WaWsvVBjhz","uLtKs8RCUA","L7cGcuAWyp","jiVBPECMvU","euZA5QbxXc","CNHmvKASQ8","HzZT8n1pmO","P6bcgazIWp",
+"DcpWBtjQxs","RBhp0gdQsS","pmeCdgjUTu","zFgtBjiVBP","7hyVv9eoRc","a00b5qUJMd","618DiS2Dfu","1v5hHBpYhV","580YDpv0i7","oVQp6Ul4a1",
+"8TxD764s8N","Nxx9VpT8wu","OUYuFdhSuH","0MR5XMmKGJ","d7vjMThjNn","14FLRD6rBy","yofH30ao3l","Pb1paoQ87r","AmdQdXyPZN","oVQp6aez9y",
+"14FLRyToGW","5Mg9rMmKGJ","OHaBz07n1c","k85Ae8U2nU","1j5L8aDGtS","ZuDtDCxVEf","No0QbDQimp","KASQ8Chuy3","NcICAoGu6x","pFrrlZUnqt",
+"FjHXRpT8wu","8cVD3ix74r","OUYuFcQOnv","FwEJz0ao3l","nlaByHfyNQ","EOE1ozz4ZU","XyPZNhe9IA","QbxXcm4bxU","lCMxyfqypy","gjUTufcJOy",
+"Waim6MaJQs","K4GS8yToGW","7ku1p48cHL","uAWypEoToP","8xEKzdQ586","xReecOxWIH","sqVrf0ao3l","ECMvUWaWsv","YOfrYvOqCE","WreyPlViBv",
+"sx5GlP6bcg","uAWyp5drc6","DG4sTgIYvE","5VZjSECMvU","brhlQlkMUA","OUYuFMkgy8","Ta8f6jzUqR","8U2nUZhwG1","qaofNaez9y","5iGN5aDGtS",
+"Chuy3OxWIH","BFkb8iqv4k","Gv3Fqd85a9","2hEEUyofH3","7lUXZ6q6L9","DcpWBJRJQB","v8yFN8U2nU","VLTy6i3pyd","GrDg7lViBv","3otm65drc6",
+"SWfou618Di","Vprf27fsYM","aDGtSHP433","vLsmSJKWYR","0h1b1Cfgr3","16lHcNcICA","B3qem64s8N","gdQsSlCMxy","CNHmvTCgPp","b29RJO3iyQ",
+"ZhwG1fqypy","Waim6Yh1hF","X6PinHRxd8","2DREsS2Dfu","xciqpO3iyQ","O3iyQfcJOy","iB08lCdyBV","o8Uyd0h1b1","yofH35iGN5","QssNCgf8rI",
+"BbwgAFVMxo","ZJTXHNOHsz","ydG8UbZLvS","WMiS345cIH","UmaEv5iGN5","aez9yMmKGJ","brhlQyToGW","pv0i7WaWsv","QworuqUJMd","vkCHHgtCA5",
+"lpF6W6AFT0","0BmCysx5Gl","CIShGyluBx","iB08llH1kt","J2mQiyToGW","IBe8k1v5hH","0KyfsQChxs","yvOMIKZamH","14FLRciuWz","uupzkWaim6",
+"NOHszQClRL","nnP8oNo0Qb","Q6LixRkQke","lViBvzz4ZU","Yf2EcSWfou","MGlTFdQ586","ZhwG11j5L8","ogLgcBCxeC","ZuDtDhe9IA","8RCUAM6qcG",
+"4W0Tlo8Uyd","yToGWIKxdL","FFDui45cIH","sx5GlfcJOy","yvOMIOz8yZ","JkzUnHP433","BbwgAogLgc","ZUnqt8xEKz","ulk41ix74r","pWiOsjtn0X",
+"d85a9VLTy6","zQt6QMm8si","8TxD7zFgtB","64s8NZ4I1v","okgRiMkgy8","ksJbyfmIK1","8hJdtk85Ae","aez9yNhXdu","SmGzvM3zXL","uN6r3SWfou",
+"ni2v1C2Irc","PYBf40Wr5y","0MR5XKASQ8","6q6L9ZuDtD","SmGzvCfgr3","CqqaDuTacx","ZuDtDUl4a1","zHF1q55rfB","yvOMIGv3Fq","ni2v1WmadA",
+"O3iyQQWxoT","In3NSYOfrY","v2eC3MezSW","0MR5X0Wr5y","6AFT05Mg9r","lj07QtaOXK","U3yw53weIF","s93MlDG4sT","s93MlyToGW","Ss0ZuWPmlx",
+"AmdQdHP433","NcICAmz8gx","DQimpWaWsv","GSQwjWaWsv","HRxd8uAWyp","GWqqX8FmFH","DcpWB2ZHdk","Qworu2hEEU","d7vjMguMb8","lH1ktlsQGo",
+"nFqikGSQwj","oQ87rfmIK1","taOXKlXFOB","jSjS3HP433","AXpwE0h1b1","ksJby2DREs","StlDJ0ao3l","he9IA2hEEU","24ARF3weIF","WDVWJuPX7G",
+"uZPqgdjsrv","YOfrYRACuj","0BmCy5drc6","P6bcgSmGzv","kZANmtvdkD","qaofNgtCA5","LewvMRmDcr","IRh48a00b5","OUYuFn1pmO","hE1Qlaez9y",
+"QworusuY4x","K4GS85IhmG","2TRI7OHaBz","Q6hMCIn3NS","2ZHdksuY4x","pAhR1pFrrl","9eoRc7fsYM","MezSWaFFss","Chuy30Wr5y","4QMc9OUqFM",
+"TCgPpuN6r3","C2Irc45cIH","fcJOyWDVWJ","ECMvUydG8U","7ku1p7X3uy","RkQke6AFT0","yToGWtlILt","lm0pDSjskQ","taOXKnlaBy","cQOnv7Ow5C",
+"yofH3oGu6x","pAhR1iwzGk","Vprf2lsQGo","QClRLlkMUA","1LB1LFcWrW","CxVEfWDVWJ","i3pydfaHir","M6qcGsqVrf","iqv4kRpBQm","yvOMILbRTH",
+"AXpwEHlUbF","G1RhSGWqqX","9eoRc1v5hH","ix74rCqqaD","Nxx9VSmGzv","EoToPW7cTs","gtCA52Yz7E","vOqCEPYBf4","5ZaEzuoStw","2TRI7618Di",
+"uZPqgjzUqR","yToGWazIWp","0BmCygf8rI","B3qemDG4sT","t98iW7fKYU","Pb1pa29QAz","ZzJHWxciqp","RsQUq3weIF","he9IAKZamH","cL0aENhXdu",
+"1j5L8CdyBV","8cVD39eoRc","7fsYMQworu","TCgPpyToGW","WmadAtl72W","JJs5mwDajX","RkQke3otm6","1v5hHSWfou","mz8gxh1zcH","FVMxo7ku1p",
+"8xEKzo8Uyd","uZPqghUTw7","BbwgAgf8rI","lViBvd7vjM","vkCHH8cVD3","Ss0ZuG1RhS","brhlQzFgtB","DcpWBjzUqR","8RCUAuQIcz","QChxskZANm",
+"45cIHQClRL","he9IAJIqXi","Ul4a1aL6AJ","piJSkMmsIo","B3qemUvlv4","kB5nPJIqXi","W3VFHP6bcg","uQIczTXQ0Z","P6bcgblLA9","CxVEfksJby",
+"1j5L8S77LH","fcwDav2eC3","dmoS7d85a9","pWiOsuJScX","lj07QLDk6f","uvf7AOUYuF","S2DfuhE1Ql","Cp3mZpvgjS","QbxXcbgJAz","8cVD3iwzGk",
+"No0QbX6Pin","UmaEvDz1R3","lsQGotAOsr","ru4UGKZamH","tuDySUvlv4","O3iyQ0BmCy","qQxHPhSSvQ","KASQ87X3uy","EOE1oFhtgl","wiHrZ618Di",
+"aDGtSWaWsv","v1HlngtCA5","blLA95VZjS","7fKYUaFFss","lsQGoRpBQm","VjCZqqQxHP","B3qem0h1b1","In3NSVBjhz","Ul4a1RACuj","IBe8kru4UG",
+"ksJby5drc6","F6PT2uupzk","wDajXcmXIX","W7cTs6q6L9","v2eC3xciqp","EoToPZ4I1v","LDk6fsuY4x","K20wKW7cTs","o8Uydsx5Gl","F6PT2uvf7A",
+"Gv3FqfcJOy","0Wr5yTa8f6","d7vjMWMiS3","DcpWBsuY4x","Nxx9VZUnqt","In3NSXflUq","K20wKiKqhr","4QMc9FxX9q","VBjhzCxVEf","v8yFNxReec",
+"ru4UGlpF6W","In3NSOz8yZ","pvgjSVBjhz","yofH3i3pyd","Vprf2uLtKs","BbwgA1v5hH","uLtKsYf2Ec","BCxeCksJby","S2Dfut98iW","faHirgtCA5",
+"n1pmO5ZaEz","DG4sTxciqp","lm0pD9XyT9","LewvMtjQxs","euZA5UlU3M","iKqhrK20wK","0PktIv2eC3","nnP8oqQxHP","Cfgr3x3LDe","8xEKzOz8yZ",
+"JkzUnHRxd8","lpF6Whe9IA","3otm6o8Uyd","29QAz14FLR","QYxC0D6rBy","lm0pDfqypy","DG4sTGXdoH","blLA95Drn0","2ZHdkeuZA5","ZzJHWfcwDa",
+"0h1b1suY4x","0MR5XFhtgl","wDajXMm8si","8hJdtK20wK","VerEAWaWsv","gtCA5EdBKc","VerEAFLsph","aL6AJ0YAGH","suY4xMaJQs","CdyBVFjHXR",
+"Z4I1vzHF1q","taOXKCdyBV","wDajXAkKTk","WMiS3KZamH","rhl0JxXTI4","QWxoT1LB1L","d7vjMYh1hF","xXTI4UmaEv","ni2v1t59lR","piJSkn8pJ9",
+"blLA9hUTw7","X6PinDQimp","FVMxoWaim6","nnP8oyluBx","IBe8k4W0Tl","hE1QlWaim6","oVQp6SmGzv","QnJ1SKASQ8","2NslmNOHsz","lsQGoGXdoH",
+"AIYUufFDrJ","618DikZANm","n8pJ9LDk6f","yvOMIfLNg8","NcICAv8yFN","Ss0ZuYw2oU","zmLYDokgRi","8xEKzyEfy9","jtn0X5drc6","b29RJuAWyp",
+"UmaEvWDVWJ","In3NSrz7Ut","SjskQuJScX","GWqqX7fKYU","qQxHPlweGy","m4bxUWaWsv","RmDcrni2v1","0KyfsNAFuw","JXljWAkKTk","Mm8sii7WMQ",
+"cmXIXZv7z0","No0QbEoToP","LewvM8TxD7","QWxoTgjUTu","Q6hMCQssNC","Ta8f6StlDJ","HRxd8CdyBV","W7cTsTwano","HRxd8tjQxs","uQIcz9GXkX",
+"blLA9HzZT8","MojnPYOfrY","StlDJ7fsYM","OUYuF0MR5X","lm0pDJ2mQi","8TxD7MGlTF","iqv4kDcpWB","lpF6WgtCA5","euZA5gtCA5","VjCZq8hJdt",
+"bgJAzMGlTF","5VZjSLewvM","dhSuHQbxXc","dmoS729QAz","iqv4kF6PT2","Yf2EcjS1aj","lXFOBRsQUq","Pb1paAXpwE","o8Uyd48cHL","IKxdLsx5Gl",
+"CK5W74W0Tl","GWqqXM3zXL","2DREsyofH3","FNYIMuJScX","aDGtSqQxHP","lkMUAv8yFN","HP433dhSuH","AXpwEix74r","zY1GY580YD","DG4sTIn3NS",
+"IBe8k9y4lw","he9IASbRYy","EOE1oulk41","fmIK14QMc9","rKDLJpmeCd","he9IANo0Qb","RBhp0wDajX","djsrvFPfSE","0BmCyJKWYR","b29RJQYxC0",
+"aez9ygf8rI","CK5W7JIqXi","VjCZqFGzgp","WDVWJtaOXK","2TRI7K4GS8","e6e4zOUqFM","Yw2oUrKDLJ","nFqikzbIYY","jSjS3ciuWz","2Nslm5Mg9r",
+"Cp3mZm4bxU","5iGN5Cp3mZ","M3zXLbgJAz","lj07Qatef2","4QMc9IKxdL","guMb8wDajX","lH1ktaFFss","YOfrY0Kyfs","xciqpuPX7G","Mkgy8brhlQ",
+"FcWrWm4bxU","gjUTuv1Hln","ZzJHWbZLvS","pFrrlZ4I1v","atef2lpF6W","KASQ8Waim6","v8yFNEOE1o","lXFOBWmadA","ZhwG1FNYIM","4W0TluTacx",
+"9XyT9WreyP","8RCUASbRYy","CxVEfHfyNQ","FGzgp2Yz7E","aL6AJulk41","fcJOylweGy","Ss0ZulH1kt","JIqXiFcWrW","i3pydS77LH","Mm8si5nmWv",
+"5VZjSpT8wu","OxWIHGv3Fq","FFDui5ZaEz","5IhmGjfREu","3weIF0ao3l","RpBQmtuDyS","OUYuFCfgr3","24ARFWmadA","EdBKcAkKTk","dmoS7ZuDtD",
+"0BmCypv0i7","ksJby6AFT0","soy9tt59lR","WreyPAgJHQ","FFDuiYh1hF","9XyT9djsrv","mX2GEUl4a1","2ZHdkiB08l","M6qcGFPfSE","RkQkeM3zXL",
+"wDajXKsjRK","AXpwEFcWrW","QbxXcqQxHP","No0QbAXpwE","9XyT9uJScX","QnJ1S6q6L9","ciuWz0YAGH","UlU3MBbwgA","2Yz7EU3yw5","5ZaEzMojnP",
+"ECMvU5ZaEz","TwanoEOE1o","2hEEUQworu","DQimphe9IA","JJs5m8TxD7","EoToP2Yz7E","s4786hE1Ql","JJs5mIKxdL","cL0aE4W0Tl","FGzgpm4bxU",
+"vOqCEMmKGJ","QbxXcFcWrW","BbwgACfgr3","vkCHHQClRL","taOXK2Yz7E","ZuDtD4QMc9","9y4lwrz7Ut","Waim65Mg9r","xciqpGSQwj","OxWIHx3LDe",
+"1j5L8FxX9q","okgRiv1Hln","FNYIMo8Uyd","QssNCVNCPd","5Mg9rqQxHP","m4bxUDG4sT","55rfBn8pJ9","XflUqM3zXL","O3iyQL7cGc","S2DfuprNT6",
+"cShY2uN6r3","uupzkZuDtD","MGlTF0h1b1","0PktITwano","8U2nUHlUbF","jtn0XsqVrf","G1RhSOxWIH","S2Dfuhi5X7","iB08lQWxoT","0BmCyjiVBP",
+"JJs5m5Namm","4W0Tlaez9y","yofH3HRxd8","hi5X7k85Ae","zmLYDWreyP","JXljWCxVEf","8xEKzF6PT2","2hEEUMaJQs","X6PinoQ87r","iwzGkNxx9V",
+"zQt6QJKWYR","wiHrZ0Wr5y","FNYIMGrDg7","QssNCWMiS3","C2IrcOHaBz","rKDLJ8cVD3","i3pydeuZA5","nnP8oaDGtS","AgJHQlkMUA","lXFOBhi5X7",
+"fmIK1ZhwG1","ZuDtDvOqCE","CqqaD5Mg9r","xXTI4t98iW","fFDrJYf2Ec","xciqpbrhlQ","iKqhrtvdkD","azIWp4dEz6","ZzJHW3otm6","24ARFVprf2",
+"0KyfsprNT6","pAhR1FxX9q","aez9yQYxC0","y94nw9eoRc","Cp3mZChuy3","jeskSMmsIo","LDk6fL7cGc","NcICAuZPqg","jiVBPKsjRK","QWxoTlsQGo",
+"zbIYYRACuj","L7cGcn1pmO","lXFOBGSQwj","UlU3MZhwG1","UmaEv3otm6","9XyT9fcwDa","L7cGcl83Ud","azIWpd7vjM","3weIFJKWYR","JIqXiv2eC3",
+"Q6hMCdhSuH","5Drn0FxX9q","cQOnvlViBv","pWiOs1j5L8","HzZT8jSjS3","AOgEeQYxC0","FPfSEPYBf4","iKqhryofH3","ydG8UWreyP","blLA9QWxoT",
+"FhtglVIlwP","bZLvS580YD","MmKGJcmXIX","uN6r3b29RJ","5iGN57lUXZ","8hJdt8xEKz","bgJAzzmLYD","K20wK2hEEU","MmKGJFnPFB","iqv4kulk41",
+"48cHL0MR5X","C2IrcUl4a1","pT8wuZ4I1v","1j5L8oVQp6","GXdoHVjCZq","FFDuiKsjRK","he9IAo8Uyd","HP433IKxdL","Dz1R3tlILt","IBe8kYh1hF",
+"TwanoNo0Qb","DQimpU3yw5","tAOsr0MR5X","d7vjM2ZHdk","GXdoHYOfrY","CIShGVBjhz","Uvlv4aez9y","NOHszaDGtS","s4786x3LDe","G1RhSZhwG1",
+"NcICAjiVBP","1v5hHQbxXc","EOE1o0BmCy","FnPFByluBx","TwanoeuZA5","FFDui9GXkX","2NslmxReec","QbxXc1j5L8","oVQp6OUqFM","t98iWlm0pD",
+"Yh1hFpiJSk","zY1GY9rlg9","8hJdtXyPZN","5Drn0s4786","kZANm3otm6","TCgPpv8yFN","5VZjSVLTy6","euZA5MmsIo","QworuvkCHH","BbwgA9y4lw",
+"EOE1oFnPFB","LewvMDz1R3","B3qemb29RJ","fFDrJWaWsv","7Ow5Cuupzk","AmdQddhSuH","pv0i7v1Hln","2TRI7MK07Y","J2mQiy94nw","Twanoiqv4k",
+"8U2nU1j5L8","ksJbyU3yw5","O3iyQ6AFT0","blLA93otm6","BbwgA0ao3l","y94nwVjCZq","tvdkDMm8si","FjHXRyEfy9","rz7UtHlUbF","hYBCKgf8rI",
+"tvdkDNxx9V","oVQp65Drn0","prNT62DREs","nnP8oU3yw5","IjTwP7Ow5C","C2Irct98iW","Vprf2D6rBy","FwEJz5IhmG","FGzgp5ZaEz","t98iWM6qcG",
+"h1zcHAXpwE","C2IrcVjCZq","zHF1q3weIF","SWfouOUqFM","QbxXcFNYIM","d85a99y4lw","vLsmSWmadA","uJScXlViBv","yofH3lXFOB","6q6L9M3zXL",
+"VjCZq9y4lw","UmaEvW3VFH","9iGoTulk41","piJSkECMvU","zbIYYkZANm","HlUbF9y4lw","K4GS82Yz7E","uZPqghi5X7","hUTw7guMb8","J2mQizbIYY",
+"U3yw5d7vjM","3weIFL7cGc","JIqXiwiHrZ","ulk41lCMxy","FPfSEaL6AJ","48cHLU3yw5","580YDd85a9","5Mg9rCp3mZ","ThjNnMaJQs","oQ87rDLhzM",
+"qQxHPWaWsv","29QAzwDajX","QYxC0KsjRK","S2Dfus93Ml","L7cGc618Di","NAFuwHRxd8","0KyfstvdkD","8U2nUlCMxy","yvOMI1v5hH","QClRLCdyBV",
+"I7p2acShY2","AXpwEaDGtS","8cVD3FcWrW","RzaZAVerEA","HRxd8FVMxo","Q6hMCpv0i7","XflUqix74r","pv0i7k85Ae","oQ87rL7cGc","Cfgr3mX2GE",
+"xciqpZJTXH","vLsmSzY1GY","Qworufqypy","MezSWQ6hMC","0h1b1CxVEf","TCgPpLewvM","P6bcgSbRYy","BbwgAzmLYD","zz4ZUgjUTu","ksJbylCMxy",
+"ZuDtDDcpWB","jS1aj3weIF","Q6LixFLsph","t98iWTa8f6","16lHcRmDcr","euZA5LbRTH","hE1QlkB5nP","TwanoVIlwP","HzZT8Ss0Zu","RACujZUnqt",
+"DLhzMqUJMd","gjUTuZ4I1v","jeskSpvgjS","K20wKqaofN","VLTy6cL0aE","sqVrf07n1c","k85AefLNg8","ZzJHWuAWyp","8hJdtZJTXH","ThjNnrz7Ut",
+"TXQ0Zv8yFN","Dz1R3XyPZN","8hJdtZzJHW","pv0i7lweGy","AgJHQTa8f6","uN6r30h1b1","QChxsBFkb8","xReecRACuj","VLTy6QYxC0","OUqFM07n1c",
+"JJs5mni2v1","iKqhrGSQwj","AXpwEv8yFN","B3qemguMb8","Dz1R3BbwgA","RkQke16lHc","IKxdLgdQsS","SWfou7X3uy","MezSWjS1aj","QClRLciuWz",
+"ZJTXHdhSuH","HzZT8qQxHP","8hJdtY1mC0","WmadAYf2Ec","hi5X7M6qcG","HlUbFkB5nP","suY4xoVQp6","JXljWRzaZA","5VZjSOxWIH","ZJTXHtl72W",
+"580YDFGzgp","he9IAKsjRK","vLsmSChuy3","ZJTXH4W0Tl","lCMxyMezSW","8U2nUTCgPp","iKqhrrhl0J","OxWIHNhXdu","K20wKB3qem","pmeCd7lUXZ",
+"hE1QlxXTI4","uQIczZhwG1","Mm8sitaOXK","iqv4kfFDrJ","0Wr5y1j5L8","QChxsjS1aj","AkKTkVBjhz","QbxXc64s8N","e6e4zF6PT2","8RCUAuZPqg",
+"yluBxEdBKc","soy9tHfyNQ","uvf7ApvgjS","iB08l9GXkX","djsrvdQ586","lj07QQworu","4dEz65VZjS","29QAz7fKYU","JKWYR8TxD7","IRh48uLtKs",
+"euZA5EdBKc","dhSuHEOE1o","ogLgc1v5hH","48cHLuN6r3","RBhp0o8Uyd","FVMxotuDyS","8cVD3W7cTs","cmXIXFVMxo","qQxHPCIShG","Q6hMClsQGo",
+"2hEEUiqv4k","zbIYY24ARF","uupzkDz1R3","jeskSMaJQs","hSSvQcQOnv","ogLgcb29RJ","azIWpjzUqR","JIqXiRpBQm","RmDcrfcJOy","lpF6WlkMUA",
+"n8pJ945cIH","vLsmSIBe8k","VBjhz0BmCy","rhl0JRsQUq","uupzkCxVEf","QworuCNHmv","k85AeMmKGJ","SWfouJKWYR","Y1mC0AIYUu","lViBvLDk6f",
+"7Ow5CjeskS","5iGN5xReec","7ku1pdjsrv","aL6AJCK5W7","AmdQd8xEKz","2ZHdkNo0Qb","fcwDataOXK","qUJMdOz8yZ","fmIK1zbIYY","zFgtB2Nslm",
+"5ZaEzB3qem","WMiS3QYxC0","RpBQm0ao3l","Yw2oUru4UG","uvf7AazIWp","FcWrWlsQGo","1v5hH2DREs","n1pmOpmeCd","vOqCEFjHXR","RmDcrQChxs",
+"RpBQmatef2","JXljWIRh48","x3LDe8RCUA","yluBxfcJOy","zbIYYcShY2","WmadAiKqhr","7hyVvRmDcr","Oz8yZt59lR","kB5nPQ6Lix","mz8gx55rfB",
+"ydG8UEdBKc","lViBvpWiOs","lj07Qaez9y","tuDySO3iyQ","16lHc3weIF","Q6Lixm4bxU","jzUqRokgRi","pvgjSPYBf4","oQ87rMK07Y","gf8rI4dEz6",
+"m4bxUYh1hF","RBhp0fcJOy","8TxD7h1zcH","RmDcruZPqg","1LB1L1j5L8","jzUqRHRxd8","d7vjMi3pyd","DG4sTAOgEe","LewvMC2Irc","uLtKspv0i7",
+"Zv7z0fmIK1","M3zXLh1zcH","6q6L9WmadA","uTacxFwEJz","jzUqR7hyVv","FhtgluLtKs","3weIF2Nslm","nFqikRsQUq","QssNCt98iW","nnP8ojzUqR",
+"QnJ1S7fsYM","CqqaDuQIcz","suY4xciuWz","nlaByCK5W7","29QAzxciqp","l83UdRmDcr","UmaEvBCxeC","mz8gxCNHmv","cmXIXpFrrl","HzZT8pvgjS",
+"jiVBP5iGN5","gjUTuogLgc","AgJHQAOgEe","SbRYyPYBf4","pWiOszz4ZU","8xEKzQClRL","RACujtjQxs","x3LDeatef2","wDajXCdyBV","HRxd87fsYM",
+"Ss0ZuGv3Fq","MGlTFQ6Lix","zQt6QAIYUu","xciqpuLtKs","In3NS8TxD7","e6e4zFwEJz","Z4I1vt98iW","EoToPsqVrf","n1pmOUmaEv","0KyfsPYBf4",
+"FPfSEni2v1","GXdoHv1Hln","ksJby3otm6","XyPZNQ6hMC","7fKYUv8yFN","dmoS7sx5Gl","X6PineuZA5","U3yw5Q6Lix","FGzgp1v5hH","0Kyfs8hJdt",
+"W7cTsNxx9V","he9IAuoStw","Gv3Fq2ZHdk","ReKEWcL0aE","gf8rIgIYvE","uoStwLDk6f","NOHsz0ao3l","ZJTXHogLgc","Nxx9VLDk6f","lCMxydjsrv",
+"BCxeCfLNg8","ogLgcvkCHH","4QMc9wDajX","fLNg8djsrv","dpe1vSjskQ","ECMvUIKxdL","tvdkDlweGy","GXdoH2ZHdk","WPmlxy94nw","9iGoTcShY2",
+"LewvM07n1c","LbRTHhe9IA","1v5hHD6rBy","zbIYYaL6AJ","Chuy3XyPZN","nFqikJJs5m","gf8rIlViBv","uZPqghSSvQ","d85a95nmWv","WMiS3blLA9",
+"ECMvUl83Ud","BGaQYK4GS8","0YAGHrKDLJ","FLsphRsQUq","7Ow5CnnP8o","nlaBygf8rI","Dz1R3pWiOs","VjCZqVLTy6","9GXkXG1RhS","RBhp0Oz8yZ",
+"uoStwKASQ8","IKxdLzFgtB","piJSkrKDLJ","ZJTXHjSjS3","v1HlnCp3mZ","KASQ8AIYUu","FLsphMmsIo","guMb8uTacx","bgJAzX6Pin","ZJTXHzQt6Q",
+"uLtKsCIShG","Yw2oUUlU3M","tlILtd85a9","zz4ZUlm0pD","aez9ykZANm","cmXIXRACuj","Kr8yspvgjS","hE1QlJKWYR","pT8wuBCxeC","F6PT2ulk41",
+"lj07Qjtn0X","WmadA2TRI7","he9IAXflUq","0Wr5y0Kyfs","5Namm6AFT0","jtn0XyToGW","m4bxUe6e4z","Rxrsm7hyVv","i7WMQUvlv4","EoToPUvlv4",
+"4dEz6GSQwj","CxVEf7Ow5C","dmoS7soy9t","DcpWBpiJSk","lH1ktt98iW","Q6hMCDQimp","55rfBQWxoT","brhlQcQOnv","s4786DQimp","o8UydIRh48",
+"MmsIoQnJ1S","W7cTsFcWrW","pWiOshi5X7","LbRTHEoToP","B3qemnlaBy","8xEKz5VZjS","KASQ8n8pJ9","OHaBzChuy3","DQimpdmoS7","CdyBVIKxdL",
+"TXQ0ZlViBv","iqv4kChuy3","FhtgluAWyp","Yf2EcuZPqg","t59lRHRxd8","cL0aEe6e4z","P6bcgFNYIM","tjQxsWMiS3","lkMUA0Kyfs","Mkgy8Z4I1v",
+"tjQxs2ZHdk","7hyVvfqypy","64s8NMojnP","55rfBzFgtB","k85Ae0Kyfs","l83UdLbRTH","Pb1paPYBf4","Chuy3UmaEv","2Yz7EgjUTu","2Nslmv2eC3",
+"i7WMQa00b5","aL6AJHlUbF","MojnPWaim6","Fhtgluupzk","S77LHni2v1","9rlg98U2nU","cL0aEsqVrf","ZhwG1zFgtB","lm0pDFLsph","uN6r3618Di",
+"CxVEfzFgtB","EOE1o8FmFH","aL6AJhE1Ql","ni2v1Twano","Y1mC0bgJAz","SWfou2DREs","Yw2oUtlILt","iqv4k2TRI7","pmeCdt59lR","WaWsvKASQ8",
+"pFrrln8pJ9","StlDJThjNn","JkzUnprNT6","3weIFaL6AJ","bZLvSMmsIo","hSSvQbZLvS","K4GS8fcwDa","RmDcrJ2mQi","7X3uy07n1c","WreyP5Namm",
+"cmXIXgf8rI","Yf2EcWPmlx","dhSuHvLsmS","2NslmkB5nP","FjHXR2Yz7E","FGzgphE1Ql","5VZjSkB5nP","mX2GEQYxC0","OxWIHJ2mQi","9iGoTO3iyQ",
+"Mm8sil83Ud","MaJQsCdyBV","ZzJHW0Wr5y","2Yz7EY1mC0","TwanoFGzgp","iB08l7ku1p","tAOsrCdyBV","FFDuiFjHXR","Q6LixUlU3M","bgJAz0Kyfs",
+"WreyPlkMUA","uvf7AL7cGc","2hEEUHzZT8","KZamHReKEW","1j5L8uQIcz","Uvlv4Yh1hF","AmdQdJIqXi","gdQsSUmaEv","Nxx9V8FmFH","7hyVv24ARF",
+"9XyT9Yw2oU","atef2sx5Gl","8cVD3BCxeC","RACujJKWYR","prNT6pvgjS","0MR5XDG4sT","k85AeQ6hMC","2TRI7G1RhS","m4bxUUl4a1","iwzGkcmXIX",
+"O3iyQfcwDa","pAhR1Cp3mZ","hUTw7dhSuH","zbIYYcmXIX","iwzGkUmaEv","piJSkuQIcz","uLtKsLDk6f","EOE1oYh1hF","fLNg8gjUTu","zbIYYKr8ys",
+"lm0pD2Nslm","RsQUqZUnqt","8TxD72Nslm","aFFsszbIYY","W3VFHpT8wu","faHirThjNn","wiHrZGSQwj","1j5L8aL6AJ","gdQsSWMiS3","cL0aEoQ87r",
+"qQxHPWMiS3","VLTy6n8pJ9","QClRL7fsYM","BGaQYJJs5m","tl72WVLTy6","lH1ktbgJAz","EdBKcRmDcr","YjB9the9IA","QWxoTh1zcH","SjskQ1LB1L",
+"prNT6h1zcH","4dEz6pT8wu","djsrvpWiOs","zqH0W14FLR","hi5X7i3pyd","mX2GE2ZHdk","CdyBViB08l","8TxD7Qworu","jSjS3faHir","QChxsG1RhS",
+"AmdQdAkKTk","8TxD7tjQxs","XyPZN45cIH","lj07Qa00b5","CIShG5iGN5","qQxHPyluBx","5VZjS7X3uy","v2eC3580YD","QYxC0uN6r3","bgJAz8FmFH",
+"QworuPYBf4","uZPqgCqqaD","Pb1pahi5X7","yluBx24ARF","iqv4kQYxC0","K20wKtjQxs","t59lRXflUq","Dz1R3zHF1q","0PktIPOUYS","FcWrWRmDcr",
+"0YAGHydG8U","zFgtBtAOsr","WMiS3RsQUq","AgJHQZUnqt","8FmFHCNHmv","JXljWUvlv4","hYBCKZzJHW","AOgEeazIWp","l83UdbgJAz","rKDLJ1LB1L",
+"aFFssG1RhS","0KyfsVerEA","45cIHMmKGJ","OxWIH4dEz6","suY4xVBjhz","IKxdLix74r","suY4xsuY4x","JJs5m9XyT9","oQ87rBbwgA","SWfounlaBy",
+"yvOMIBGaQY","qaofNFNYIM","nlaByD6rBy","5iGN5Qworu","zmLYDqaofN","OUYuFuJScX","i3pydPb1pa","7Ow5C3weIF","iB08ldjsrv","suY4xKZamH",
+"Oz8yZ7fKYU","gf8rI5drc6","d7vjMJJs5m","UmaEvzbIYY","NcICAWDVWJ","2Nslm8cVD3","QworuD6rBy","MaJQsK20wK","0YAGHzmLYD","6q6L9CdyBV",
+"lXFOBe6e4z","0h1b1580YD","9rlg9yvOMI","5Mg9rxReec","xXTI4hi5X7","YOfrYFNYIM","iwzGkn8pJ9","uN6r3K4GS8","uN6r3G1RhS","tAOsr3otm6",
+"8U2nUSs0Zu","zY1GY9XyT9","F6PT2Ta8f6","VerEAlViBv","aL6AJzz4ZU","IRh48Vprf2","uZPqgn8pJ9","9iGoTlH1kt","ZuDtDVprf2","K20wKP6bcg",
+"Ta8f6uQIcz","FLsphSWfou","iwzGkydG8U","HP4335ZaEz","1v5hHVBjhz","suY4x8hJdt","TCgPpjiVBP","6AFT0Yh1hF","kB5nPpvgjS","DQimpn1pmO",
+"SmGzvoGu6x","rhl0JMmKGJ","ZJTXHru4UG","ulk41zY1GY","dhSuHjtn0X","Ta8f6AmdQd","GWqqXEoToP","x3LDe0ao3l","FxX9q64s8N","5nmWv0Wr5y",
+"2DREsfcwDa","O3iyQHP433","VLTy6ZuDtD","Q6hMCgf8rI","Yf2Ecx3LDe","gtCA5KASQ8","14FLRlj07Q","Y1mC0MK07Y","jfREuWDVWJ","i7WMQAXpwE",
+"uAWypuJScX","kZANmh1zcH","NOHszS77LH","Ul4a1JRJQB","Vprf29GXkX","pFrrlRxrsm","FcWrWTa8f6","y94nwpiJSk","gdQsSKr8ys","M6qcGpv0i7",
+"cQOnvogLgc","RACujWaim6","t59lRNo0Qb","SmGzvyofH3","lpF6WtjQxs","zmLYDsqVrf","2TRI7uPX7G","YjB9tVprf2","9rlg9X6Pin","POUYSM3zXL",
+"sx5Glhi5X7","oQ87rTa8f6","gdQsSYh1hF","lXFOBlH1kt","W3VFHFVMxo","8TxD7Fhtgl","Mm8siJKWYR","uN6r3DG4sT","OUqFM5VZjS","pmeCd5Drn0",
+"Yh1hFlj07Q","bgJAz9iGoT","QworuJJs5m","brhlQhi5X7","FnPFBqaofN","1j5L8he9IA","okgRidhSuH","FLsph45cIH","JRJQBjS1aj","zY1GY0h1b1",
+"s7MxkaL6AJ","v1HlnpT8wu","fcJOyRxrsm","14FLRK4GS8","FPfSEdjsrv","jiVBP8xEKz","yluBxZuDtD","5drc629QAz","jfREuFjHXR","WreyP2Yz7E",
+"2Yz7EOUYuF","DcpWBhUTw7","FLsphblLA9","taOXKv2eC3","Cfgr3ciuWz","iB08lI7p2a","5nmWvCNHmv","Uvlv4tvdkD","iB08lyEfy9","7hyVvW7cTs",
+"4W0TltaOXK","pv0i7e6e4z","Yf2EcQYxC0","SmGzvk85Ae","uvf7ABpYhV","GXdoHBbwgA","5IhmGWreyP","uLtKs0Wr5y","jS1ajdpe1v","Q6hMCydG8U",
+"uZPqgUl4a1","iKqhrMGlTF","k85Ae6q6L9","prNT6Waim6","CxVEfFwEJz","DQimpPYBf4","WPmlxfmIK1","RzaZAFjHXR","jSjS3ThjNn","GSQwjCqqaD",
+"TwanoO3iyQ","hYBCK4dEz6","RACujtaOXK","rhl0JDz1R3","VBjhzvOqCE","NcICAjtn0X","soy9toVQp6","L7cGcIBe8k","atef2WaWsv","vkCHHpFrrl",
+"ZhwG1WMiS3","s7Mxk5iGN5","JIqXiVIlwP","ksJbyFnPFB","45cIHWMiS3","RBhp0jtn0X","okgRitjQxs","FcWrWuAWyp","AmdQdh1zcH","7X3uyS2Dfu",
+"fFDrJiKqhr","iqv4k5IhmG","iwzGk0BmCy","U3yw5hi5X7","JRJQB9eoRc","tlILtd7vjM","Cp3mZ2TRI7","jzUqR6q6L9","dQ586x3LDe","uupzkfcJOy",
+"pWiOs0ao3l","VLTy6LewvM","W3VFH0YAGH","BGaQYt59lR","TCgPplXFOB","kZANmtaOXK","tuDySD6rBy","y94nwThjNn","8hJdtQClRL","zHF1q9iGoT",
+"8xEKz6AFT0","fFDrJMm8si","QbxXcatef2","D6rByoQ87r","cmXIXi3pyd","cShY2dpe1v","uoStwvOqCE","iB08ljtn0X","PYBf4AIYUu","FPfSEdmoS7",
+"GXdoHfLNg8","ZuDtDFhtgl","JIqXiuTacx","MK07YvLsmS","atef2iKqhr","kZANmSWfou","1v5hHDz1R3","SmGzv48cHL","2TRI7x3LDe","oVQp6uZPqg",
+"aDGtSZ4I1v","uN6r3YjB9t","MaJQstjQxs","5Drn07fKYU","ciuWzRBhp0","ZhwG1YOfrY","4W0TlGWqqX","atef2QnJ1S","hSSvQ3otm6","l83UdsuY4x",
+"RzaZAS2Dfu","VLTy63weIF","b29RJX6Pin","gjUTu2DREs","FVMxomX2GE","oQ87rHlUbF","8hJdt6AFT0","NOHszy94nw","0h1b1lm0pD","y94nwTa8f6",
+"RsQUqNcICA","Vprf2W3VFH","YOfrYtjQxs","ZhwG1GXdoH","JJs5mVIlwP","5VZjSL7cGc","fFDrJTwano","SmGzv0BmCy","uupzkNhXdu","ZUnqtcL0aE",
+"xciqpKASQ8","QChxsv1Hln","lj07QeuZA5","lViBv2TRI7","JIqXiC2Irc","ix74rk85Ae","6q6L9HlUbF","2NslmaL6AJ","2hEEUzz4ZU","Waim6RzaZA",
+"WaWsvsoy9t","EdBKcfcJOy","W7cTsrz7Ut","JkzUnRmDcr","ReKEWqaofN","Zv7z0KASQ8","euZA5okgRi","9iGoTJIqXi","n8pJ9XyPZN","FGzgp5IhmG",
+"FPfSERzaZA","uupzkVprf2","zQt6QprNT6","JKWYRMm8si","nnP8oxReec","55rfB2Nslm","pv0i70Kyfs","RpBQmn8pJ9","lm0pDprNT6","48cHLfcwDa",
+"StlDJO3iyQ","FFDuiSs0Zu","KZamHRsQUq","NhXduNo0Qb","FPfSELDk6f","ThjNn618Di","tlILt7ku1p","FnPFBcmXIX","Zv7z0zmLYD","jiVBPlpF6W",
+"bZLvSFVMxo","I7p2ablLA9","lpF6WAgJHQ","2hEEU618Di","ZhwG18U2nU","jiVBPAIYUu","qaofN7Ow5C","nFqik0MR5X","lweGyoGu6x","lViBvgdQsS",
+"8xEKzWmadA","UmaEvmX2GE","MK07Y0PktI","i3pydL7cGc","b29RJWmadA","fcJOycShY2","5Mg9rjSjS3","KsjRKs4786","i3pydUvlv4","pvgjSQChxs",
+"64s8N4W0Tl","MK07YGXdoH","FxX9qFLsph","ReKEWiB08l","uZPqg580YD","fcJOyn1pmO","Zv7z0dhSuH","yEfy9e6e4z","zmLYDZJTXH","fcJOyk85Ae",
+"RxrsmfmIK1","cShY2HzZT8","QworuDcpWB","LewvMRBhp0","lCMxybZLvS","uvf7AiwzGk","lm0pDuoStw","blLA99y4lw","HfyNQv8yFN","v2eC3FNYIM",
+"WMiS3JJs5m","qaofN8RCUA","DLhzMAXpwE","e6e4zUlU3M","atef2aFFss","iqv4kZUnqt","jzUqRb29RJ","IBe8kzqH0W","ZuDtDTa8f6","RkQkeThjNn",
+"jSjS32hEEU","HlUbFFwEJz","i3pydTXQ0Z","IjTwPbrhlQ","uZPqgHzZT8","yToGWFFDui","lm0pDMm8si","2DREsiqv4k","F6PT27X3uy","i3pyd48cHL",
+"0MR5Xt98iW","IKxdL5IhmG","vkCHHvkCHH","AIYUuXyPZN","pAhR1YOfrY","0ao3lfFDrJ","Q6LixAkKTk","OHaBz6q6L9","lH1ktnnP8o","he9IA0PktI",
+"XyPZNOxWIH","aFFssO3iyQ","C2Irc0Kyfs","8hJdtazIWp","OxWIHMkgy8","14FLRtjQxs","Cp3mZfcJOy","iB08lFNYIM","BCxeCjzUqR","sx5GlBFkb8",
+"5IhmGt59lR","9XyT9Q6hMC","Uvlv4M6qcG","yvOMIJXljW","2NslmFhtgl","uZPqgiwzGk","AkKTkJIqXi","b29RJgjUTu","b29RJGSQwj","OxWIHZv7z0",
+"RsQUqciuWz","i7WMQYf2Ec","uPX7GyvOMI","QWxoTTXQ0Z","ThjNnKr8ys","MaJQsaL6AJ","jiVBPFxX9q","jzUqRqaofN","lweGywDajX","ogLgcatef2",
+"CK5W7cL0aE","4W0Tl07n1c","MojnPtvdkD","GrDg7nnP8o","b29RJ0PktI","WreyPhYBCK","9eoRcjzUqR","atef2U3yw5","J2mQiuZPqg","ThjNnUlU3M",
+"48cHLNo0Qb","DQimpJXljW","lsQGoXyPZN","ogLgcIKxdL","CxVEffLNg8","HzZT8AIYUu","uJScXMojnP","U3yw5F6PT2","PYBf4ru4UG","dQ586dhSuH",
+"ulk41i3pyd","VerEA3weIF","ZJTXHJJs5m","8RCUAStlDJ","Y1mC0FLsph","9eoRcFFDui","WaWsvFcWrW","VIlwPcL0aE","SmGzvWaWsv","UmaEvokgRi",
+"QbxXcy94nw","VjCZqtAOsr","wiHrZogLgc","CIShGQ6hMC","JXljWtuDyS","hi5X7xReec","580YDXyPZN","CxVEfdjsrv","DcpWBCK5W7","580YDSs0Zu",
+"LewvM9y4lw","jSjS3FFDui","FNYIM7Ow5C","i3pydoVQp6","Vprf2dpe1v","vLsmSRsQUq","uoStwoQ87r","9iGoT64s8N","K20wKuAWyp","tuDySpWiOs",
+"yofH37hyVv","HfyNQ4QMc9","WreyPMaJQs","NOHszrhl0J","Z4I1vl83Ud","CxVEf2DREs","Ss0ZuFFDui","nnP8oZJTXH","580YDtvdkD","16lHc7fsYM",
+"wiHrZGrDg7","wDajX3otm6","tl72WL7cGc","8RCUAVjCZq","jeskShi5X7","pmeCd2Yz7E","jeskS9GXkX","Dz1R3azIWp","Waim6YjB9t","a00b56AFT0",
+"DLhzMlsQGo","3weIFOxWIH","GSQwjMaJQs","QWxoTcmXIX","ZuDtDJRJQB","KASQ8nnP8o","MGlTF7ku1p","4W0TlAgJHQ","IjTwPuLtKs","cmXIXQ6Lix",
+"VjCZqCdyBV","suY4x5iGN5","WreyPyluBx","RBhp05Mg9r","lkMUAHP433","C2IrcW3VFH","AXpwElj07Q","FFDui0h1b1","vOqCEGv3Fq","e6e4zdmoS7",
+"BCxeCW3VFH","lweGyfcJOy","HlUbFNxx9V","FxX9qfqypy","zY1GYt59lR","HlUbFZJTXH","uvf7AOUqFM","djsrvcQOnv","rKDLJ0h1b1","hUTw7U3yw5",
+"0ao3lCdyBV","n1pmOCK5W7","ru4UGpvgjS","JXljWd85a9","7X3uy2hEEU","n8pJ9zY1GY","rz7UtazIWp","JRJQBWMiS3","DLhzMYh1hF","zQt6Qd85a9",
+"sx5GlsqVrf","CqqaDaDGtS","gIYvEIn3NS","lXFOBn1pmO","ulk41jSjS3","VerEAgjUTu","wDajXd85a9","RkQkeUvlv4","J2mQiYw2oU","euZA5iKqhr",
+"Kr8ysIRh48","zz4ZU0h1b1","7Ow5CDLhzM","pAhR1IKxdL","MojnP7lUXZ","Gv3FqUl4a1","IjTwPVBjhz","EOE1ogIYvE","ECMvUsqVrf","gtCA5wDajX",
+"oQ87rJJs5m","2ZHdk8TxD7","zz4ZUatef2","X6PinPOUYS","DLhzMa00b5","UmaEvn8pJ9","S2Dfuv1Hln","fmIK1faHir","C2IrcfmIK1","TCgPpfFDrJ",
+"fmIK1e6e4z","9XyT9zHF1q","9iGoTTXQ0Z","azIWphUTw7","djsrvaez9y","vkCHHGXdoH","v1HlnBCxeC","0ao3lHzZT8","NhXdu0MR5X","iqv4kMaJQs",
+"qQxHPLewvM","Q6LixWPmlx","FnPFBNAFuw","M6qcGd7vjM","cQOnv3weIF","IRh48uPX7G","nFqikZuDtD","VBjhzulk41","JkzUnzbIYY","jzUqRwiHrZ",
+"MojnPuoStw","8FmFHHlUbF","M3zXL9eoRc","No0QbaL6AJ","jS1ajFcWrW","RkQkeQClRL","ksJbywDajX","o8UydjfREu","FNYIMHRxd8","W3VFHru4UG",
+"aFFssMojnP","FGzgpMm8si","WDVWJRmDcr","9eoRcMojnP","KASQ8OUqFM","fFDrJydG8U","ix74riwzGk","No0QbSWfou","L7cGcI7p2a","0PktIGXdoH",
+"uAWypMojnP","oGu6xVerEA","X6PinZuDtD","aL6AJQssNC","tjQxsLewvM","FnPFBwiHrZ","9y4lwZJTXH","hSSvQF6PT2","64s8NgtCA5","Q6hMCnnP8o",
+"K4GS8kB5nP","0YAGH7fKYU","1v5hH14FLR","k85Aeru4UG","64s8N16lHc","4QMc9bgJAz","8FmFHZuDtD","618Dit98iW","3otm6JIqXi","QChxsL7cGc",
+"fmIK1zz4ZU","mX2GEAXpwE","M3zXLChuy3","J2mQi2Yz7E","VNCPdB3qem","Mm8siHlUbF","zmLYDCfgr3","7Ow5CuN6r3","2hEEUU3yw5","tlILtRsQUq",
+"uJScX14FLR","euZA5vOqCE","IKxdLZhwG1","uPX7GBbwgA","hSSvQZUnqt","Waim6NhXdu","5nmWvmX2GE","No0QbJIqXi","ECMvUgIYvE","CdyBVRmDcr",
+"FLsphRBhp0","NhXduMmKGJ","B3qemFwEJz","FjHXR0YAGH","RmDcrVNCPd","zmLYDazIWp","5drc6ThjNn","MaJQsGrDg7","0YAGHd7vjM","uPX7GKr8ys",
+"Ul4a15Namm","tl72W5iGN5","2DREsksJby","WMiS3FwEJz","jzUqRkB5nP","xReecB3qem","ZzJHWs7Mxk","CNHmv07n1c","29QAzhYBCK","iwzGkblLA9",
+"dQ586Y1mC0","5IhmGyEfy9","WaWsvChuy3","CqqaDTwano","Yh1hF7hyVv","s7MxkjfREu","RzaZAWDVWJ","NhXduO3iyQ","NcICA0ao3l","oGu6xuTacx",
+"0h1b10Wr5y","WDVWJyofH3","x3LDeQssNC","vOqCEv1Hln","yToGW0Wr5y","2NslmjfREu","9iGoTgIYvE","AIYUuuAWyp","ksJbyfqypy","iB08l3weIF",
+"RxrsmvOqCE","2NslmvOqCE","7fKYUokgRi","wDajXb29RJ","0Wr5yeuZA5","EOE1odjsrv","OHaBzru4UG","yEfy9qQxHP","ulk41fcwDa","pAhR1AgJHQ",
+"QworufLNg8","0h1b1EoToP","FFDuiatef2","m4bxUwDajX","fmIK1SbRYy","WmadATwano","yofH3JIqXi","SWfou45cIH","djsrvs4786","0KyfsW7cTs",
+"RmDcruupzk","7lUXZFFDui","OxWIHqUJMd","RkQket98iW","KZamHVprf2","SbRYyUl4a1","FwEJz0Kyfs","mz8gxCIShG","W3VFHVLTy6","6AFT0JIqXi",
+"DcpWBpFrrl","ECMvUXflUq","faHirZ4I1v","BCxeC618Di","RsQUq48cHL","RkQkesx5Gl","uoStw8TxD7","NOHsznFqik","U3yw5NhXdu","uQIczLDk6f",
+"WmadAtjQxs","lpF6WFcWrW","b29RJStlDJ","7X3uyqUJMd","HRxd8Oz8yZ","9iGoTdpe1v","UmaEvFhtgl","hE1Qlt98iW","brhlQOxWIH","uTacxk85Ae",
+"4dEz6uvf7A","EOE1otl72W","8FmFHI7p2a","QChxsNxx9V","MaJQs7Ow5C","AgJHQVNCPd","07n1cX6Pin","Zv7z0UmaEv","cQOnv7ku1p","2ZHdkuupzk",
+"HlUbFfFDrJ","VIlwPM3zXL","h1zcHHRxd8","Mkgy8t98iW","ZUnqtQnJ1S","Gv3FqU3yw5","QWxoTFxX9q","ThjNnsuY4x","mX2GE9rlg9","4QMc9DG4sT",
+"4W0TluN6r3","fmIK1iKqhr","ksJbypFrrl","Uvlv4blLA9","a00b5No0Qb","xReecpiJSk","IjTwPfaHir","s7MxkdQ586","J2mQipvgjS","W7cTsKr8ys",
+"tvdkDyofH3","QYxC0AkKTk","d85a9Cfgr3","yToGWFGzgp","B3qemAgJHQ","a00b5e6e4z","hYBCKGWqqX","0YAGHcQOnv","jS1ajatef2","2NslmCNHmv",
+"W3VFHFPfSE","DLhzMAmdQd","d7vjMMkgy8","7ku1pB3qem","ksJby7hyVv","Vprf2fFDrJ","he9IAW3VFH","OUYuFEdBKc","WPmlx0BmCy","QworuzmLYD",
+"tuDySHRxd8","2ZHdkogLgc","d7vjMVIlwP","blLA9uN6r3","S2Dfue6e4z","QYxC0pFrrl","aez9ylj07Q","uLtKs14FLR","t98iWgIYvE","Ul4a19XyT9",
+"jtn0Xrhl0J","CIShGJKWYR","jfREuQworu","pAhR1K4GS8","uJScXpAhR1","Gv3FqYh1hF","lsQGohe9IA","s7MxkM3zXL","0YAGHOxWIH","MmsIotvdkD",
+"aDGtSuvf7A","ECMvUpiJSk","FFDuiBFkb8","YjB9t24ARF","euZA50PktI","1LB1LX6Pin","0PktIvOqCE","QnJ1S0PktI","Chuy3cmXIX","5nmWvRkQke",
+"oQ87r8TxD7","QssNCuPX7G","1v5hH9iGoT","pFrrlyofH3","RmDcrDQimp","BGaQYMaJQs","euZA5wiHrZ","RxrsmYf2Ec","U3yw5s4786","X6PinoGu6x",
+"BbwgAFNYIM","1j5L8YOfrY","MGlTFTCgPp","VNCPdEOE1o","VBjhzAmdQd","S2DfujeskS","n8pJ9MGlTF","pWiOskZANm","BCxeCtvdkD","SjskQUl4a1",
+"Cp3mZrKDLJ","azIWpEoToP","fmIK1NcICA","0BmCylkMUA","jzUqRIBe8k","GSQwjFcWrW","7fsYMS2Dfu","RmDcrVjCZq","pvgjSjS1aj","Cfgr3NhXdu",
+"AkKTkiwzGk","GrDg7618Di","azIWpDG4sT","ydG8UydG8U","CK5W7U3yw5","I7p2afLNg8","sx5GlfaHir","Yw2oU45cIH","Z4I1vdmoS7","LbRTH2hEEU",
+"pT8wuwDajX","lCMxyuTacx","wDajXcQOnv","D6rByAXpwE","uLtKsatef2","RxrsmFFDui","uupzkHfyNQ","uJScX5nmWv","DLhzMuN6r3","EoToPhE1Ql",
+"n8pJ9uN6r3","In3NSdjsrv","n8pJ9djsrv","kB5nP2TRI7","yofH3uN6r3","YOfrYFnPFB","FNYIMWaim6","v2eC3suY4x","qUJMdWMiS3","MGlTFFNYIM",
+"GSQwjprNT6","OUqFMMm8si","zY1GYQnJ1S","gjUTuix74r","In3NSRzaZA","pmeCd2ZHdk","mz8gxaDGtS","OxWIHlViBv","l83Udo8Uyd","2TRI7guMb8",
+"XflUq2hEEU","2TRI72ZHdk","9rlg9okgRi","3weIFZhwG1","CdyBVcmXIX","euZA5No0Qb","RkQkeqUJMd","OHaBzvOqCE","qUJMdgf8rI","JRJQBHP433",
+"OxWIHtaOXK","FNYIM1j5L8","RzaZAIn3NS","tl72WhE1Ql","pmeCdpT8wu","YjB9tzmLYD","aDGtS29QAz","24ARF7X3uy","NhXduwiHrZ","hSSvQDG4sT",
+"uPX7GaDGtS","Oz8yZhE1Ql","CqqaDuJScX","zY1GY48cHL","580YDKASQ8","NOHszQ6Lix","d7vjMDz1R3","LewvMqQxHP","mz8gxM3zXL","5NammFNYIM",
+"Waim6Yf2Ec","HRxd8fcwDa","HzZT8o8Uyd","yEfy9UlU3M","uN6r3tAOsr","WPmlxuPX7G","ru4UGIBe8k","soy9tFPfSE","UmaEvKASQ8","GrDg7LewvM",
+"MK07Y4dEz6","S2DfuMmKGJ","AkKTk4W0Tl","oQ87rJkzUn","y94nwiwzGk","JJs5mP6bcg","vLsmSQnJ1S","9rlg9WPmlx","AkKTk9XyT9","pv0i7POUYS",
+"Vprf2hi5X7","3otm6gjUTu","VIlwPMmsIo","8FmFHMmsIo","d85a9Ta8f6","v1HlnaL6AJ","W3VFHjS1aj","WDVWJEdBKc","uAWypuLtKs","NhXdu2Yz7E",
+"YjB9tDz1R3","MmsIoY1mC0","ksJbyRACuj","taOXKblLA9","fmIK1dQ586","QWxoTWaWsv","n1pmOcmXIX","xReeciKqhr","Zv7z01LB1L","BFkb8Chuy3",
+"i7WMQFjHXR","5ZaEzvkCHH","oGu6xYjB9t","Waim6JJs5m","RBhp05Drn0","pFrrlBpYhV","faHirlpF6W","ru4UGh1zcH","6AFT07ku1p","VerEA45cIH",
+"Y1mC0Ss0Zu","FGzgpOz8yZ","POUYSRzaZA","ZUnqtuLtKs","SjskQd85a9","9rlg9jeskS","0ao3lLDk6f","ksJbyni2v1","Zv7z0MmsIo","ulk41POUYS",
+"Vprf2MezSW","Ul4a1v8yFN","rKDLJNOHsz","MK07YCxVEf","cQOnvReKEW","lkMUA5IhmG","YjB9tQYxC0","d85a9fmIK1","atef2XflUq","L7cGczbIYY",
+"gtCA5yvOMI","aFFsspv0i7","soy9t3weIF","JRJQB5IhmG","oQ87r5IhmG","uQIczaL6AJ","sqVrftaOXK","KsjRKGSQwj","NAFuwDLhzM","ReKEWWreyP",
+"FGzgplsQGo","Yh1hF0MR5X","yToGWOUqFM","EOE1o6AFT0","nnP8oksJby","CIShG2Yz7E","5nmWvgf8rI","ReKEWni2v1","azIWpjiVBP","jS1ajQChxs",
+"SbRYy0ao3l","NOHszqUJMd","fFDrJ0h1b1","5Drn0ThjNn","OUqFMIKxdL","pT8wu7hyVv","2DREsIjTwP","djsrvzY1GY","uZPqgFnPFB","1j5L8x3LDe",
+"Q6LixogLgc","GSQwjyEfy9","y94nwI7p2a","8cVD3QChxs","45cIHDG4sT","tjQxsvkCHH","Ta8f6FcWrW","6q6L9POUYS","I7p2aFGzgp","i7WMQHfyNQ",
+"MmKGJVerEA","b29RJOHaBz","fmIK1Twano","GrDg7vOqCE","qQxHPjzUqR","fcJOyulk41","PYBf4Yf2Ec","hUTw7S77LH","5ZaEzQClRL","0ao3l07n1c",
+"fcwDa2hEEU","d7vjMGv3Fq","MGlTFuLtKs","3otm6CNHmv","vkCHHmX2GE","VLTy6zFgtB","NOHszcQOnv","fmIK1iwzGk","jeskSQClRL","zQt6QgtCA5",
+"Ul4a1tlILt","xciqpX6Pin","9eoRcUvlv4","BGaQYiqv4k","X6PinlkMUA","azIWpvOqCE","t98iWOHaBz","v1HlnQWxoT","8xEKzK20wK","CIShGK20wK",
+"55rfBJXljW","Uvlv4ydG8U","BFkb8fFDrJ","kB5nPMezSW","uJScXzHF1q","5ZaEzSbRYy","FjHXRjiVBP","fcJOyLewvM","EoToPuZPqg","QYxC0ydG8U",
+"EOE1oKsjRK","TXQ0Zsoy9t","gdQsSkB5nP","gjUTugjUTu","9GXkXiKqhr","v8yFNb29RJ","16lHcZzJHW","BFkb85Namm","5ZaEzoQ87r","W7cTsMGlTF",
+"cL0aEhSSvQ","0YAGHQClRL","bgJAz5Mg9r","jSjS3S2Dfu","IRh48QChxs","lXFOBOHaBz","taOXKwiHrZ","iB08lHfyNQ","4QMc9aFFss","StlDJXyPZN",
+"oGu6xF6PT2","2hEEUdQ586","FFDuiciuWz","YOfrYbrhlQ","pvgjSOxWIH","OUYuFDz1R3","LewvMReKEW","J2mQiLewvM","lpF6Wv8yFN","prNT6jtn0X",
+"W3VFHVprf2","BCxeCOUYuF","QChxs9XyT9","FLsph14FLR","lj07QD6rBy","OHaBzPb1pa","Yf2Ec0PktI","CdyBV8xEKz","qUJMdlweGy","OUqFMrKDLJ",
+"9GXkX5Mg9r","2TRI7AOgEe","B3qemIKxdL","L7cGcazIWp","MezSW07n1c","azIWpHfyNQ","4dEz6jSjS3","9XyT9POUYS","tuDySaDGtS","qaofNazIWp",
+"C2Irc29QAz","zqH0WAXpwE","tAOsrS77LH","FGzgp2Nslm","VerEAbrhlQ","zbIYYtlILt","PYBf4G1RhS","uZPqgtl72W","o8Uydmz8gx","uN6r3xReec",
+"AgJHQazIWp","JRJQBVerEA","I7p2admoS7","RACujuupzk","iB08llXFOB","Ta8f6C2Irc","yEfy9gtCA5","Q6hMCaFFss","qUJMdpAhR1","ogLgcydG8U",
+"jSjS35Mg9r","SbRYyFVMxo","MK07YFwEJz","LewvMblLA9","iwzGkNhXdu","h1zcHFFDui","45cIH9rlg9","RkQkeWreyP","FjHXR5Mg9r","jfREuzQt6Q",
+"2hEEUQClRL","VLTy65ZaEz","QbxXcFnPFB","n8pJ99eoRc","MezSWDG4sT","AgJHQ07n1c","o8Uydzz4ZU","Mm8siOUqFM","RmDcrzmLYD","580YDUvlv4",
+"UlU3MQ6Lix","pWiOstvdkD","ogLgc6q6L9","P6bcgJRJQB","GXdoHDQimp","5Mg9rpAhR1","24ARFQYxC0","hSSvQhUTw7","rz7UtuLtKs","RpBQmW3VFH",
+"gdQsSMGlTF","ZhwG1ZUnqt","m4bxUkB5nP","XyPZNnnP8o","zFgtBsoy9t","C2IrcThjNn","Q6hMCfcwDa","0Wr5yJIqXi","VNCPdAkKTk","NAFuwlsQGo",
+"pWiOsBpYhV","16lHcECMvU","BCxeCoQ87r","zQt6QGrDg7","pvgjS8U2nU","prNT6CK5W7","M3zXLxXTI4","zqH0WuoStw","fcwDayluBx","ReKEWblLA9",
+"ZhwG1zqH0W","Yf2EcChuy3","X6PinFcWrW","4QMc9LewvM","qQxHPuupzk","hUTw7YOfrY","aFFssfFDrJ","Y1mC0FPfSE","X6Pin7X3uy","4W0TlSs0Zu",
+"bZLvSuQIcz","rKDLJZ4I1v","BpYhVW7cTs","HzZT8Yh1hF","DLhzM7fKYU","IRh48RpBQm","hSSvQBGaQY","Pb1paWmadA","IRh48blLA9","M6qcGJIqXi",
+"vOqCE5ZaEz","PYBf4Ss0Zu","BFkb8jzUqR","XyPZNwDajX","GXdoHRBhp0","bZLvSKZamH","aFFssaez9y","taOXKF6PT2","7ku1pnFqik","EOE1oVBjhz",
+"xXTI4dhSuH","3weIFBCxeC","2TRI7RsQUq","RxrsmOxWIH","K4GS8HlUbF","MojnPuN6r3","8FmFHpAhR1","HzZT8vLsmS","kZANmzFgtB","5drc6B3qem",
+"vkCHH24ARF","MmsIoyluBx","n8pJ9CIShG","tuDyS5Drn0","BCxeCo8Uyd","dQ586WDVWJ","QnJ1SM6qcG","dhSuHfaHir","14FLR29QAz","5drc6Gv3Fq",
+"0PktIdjsrv","TCgPplpF6W","Gv3FqM6qcG","3weIFHRxd8","1v5hHPYBf4","oQ87rCxVEf","uQIczk85Ae","RzaZAeuZA5","7hyVvHfyNQ","ThjNnQYxC0",
+"uTacxVerEA","gIYvE7hyVv","qaofNC2Irc","mX2GEMaJQs","iB08lNOHsz","OHaBzDcpWB","FcWrWWMiS3","DG4sTSWfou","yluBxjtn0X","QnJ1SpvgjS",
+"blLA92Yz7E","2ZHdklpF6W","k85AeSjskQ","Ta8f67ku1p","FhtglRmDcr","2ZHdkRzaZA","uJScXlsQGo","l83UdKZamH","SmGzv1j5L8","HzZT8gjUTu",
+"xReecgtCA5","d85a9piJSk","M6qcGFnPFB","X6Pin9eoRc","64s8NWaim6","dQ586uZPqg","L7cGcLDk6f","POUYSRBhp0","lpF6Watef2","6q6L9Rxrsm",
+"HlUbFjiVBP","2hEEU4dEz6","Qworu5nmWv","s4786fLNg8","YjB9tmX2GE","CxVEflpF6W","5drc6VIlwP","7hyVvMezSW","SjskQbrhlQ","5drc6kB5nP",
+"uupzkAkKTk","uTacx3weIF","b29RJDG4sT","Yh1hFulk41","QWxoTWaim6","YOfrYtlILt","5ZaEzZv7z0","VerEAyluBx","tAOsrMK07Y","ksJby0YAGH",
+"jiVBPvOqCE","uTacxECMvU","0Wr5yFGzgp","jfREu6q6L9","S2DfuX6Pin","FNYIMDG4sT","55rfBMGlTF","RpBQm4dEz6","QworuWMiS3","KsjRK07n1c",
+"zFgtBNxx9V","HfyNQK20wK","hSSvQqUJMd","yofH3pvgjS","lkMUABFkb8","ThjNnuQIcz","a00b5v2eC3","1j5L8Ul4a1","5VZjSWaWsv","JJs5m0MR5X",
+"atef2Nxx9V","5Mg9r3weIF","MGlTFuAWyp","5iGN5BFkb8","lCMxyEoToP","bZLvSWPmlx","07n1cDLhzM","CNHmv3weIF","Z4I1vksJby","HRxd8KZamH",
+"Ta8f6MK07Y","No0QbIjTwP","AgJHQIRh48","zFgtBP6bcg","Vprf2VjCZq","mX2GEv2eC3","AkKTk6q6L9","64s8NcQOnv","uJScXFVMxo","fqypy24ARF",
+"RkQkeMmKGJ","55rfB24ARF","hSSvQ8hJdt","uN6r3Pb1pa","wiHrZbZLvS","zHF1qy94nw","0PktIZhwG1","5VZjSWaim6","cShY2I7p2a","qUJMdFwEJz",
+"2ZHdkCp3mZ","QYxC0ThjNn","RzaZAwDajX","yToGWSWfou","o8UydcL0aE","pFrrld7vjM","POUYSsoy9t","lH1ktWaim6","QClRLyToGW","uQIczlkMUA",
+"FcWrWCIShG","iwzGkAIYUu","JKWYRhi5X7","W7cTsS2Dfu","BGaQYW3VFH","uZPqgGSQwj","tuDySW7cTs","JKWYRnnP8o","2NslmRBhp0","4dEz6HRxd8",
+"0BmCyBGaQY","jiVBPguMb8","GrDg7FcWrW","Zv7z0WreyP","618Di9iGoT","Nxx9VTwano","SbRYygIYvE","SWfouzFgtB","In3NSgIYvE","pFrrlxXTI4",
+"CNHmvuvf7A","YOfrYjS1aj","mX2GEReKEW","I7p2aKASQ8","TXQ0ZBbwgA","blLA9TXQ0Z","YjB9tzQt6Q","5drc6EoToP","QbxXcBbwgA","QYxC0IRh48",
+"h1zcHoGu6x","dhSuHv2eC3","vkCHH45cIH","nFqikdjsrv","9eoRcY1mC0","G1RhS4W0Tl","9rlg907n1c","MmsIoCp3mZ","2Yz7EeuZA5","MaJQsYf2Ec",
+"FLsphNOHsz","uupzkRkQke","yofH3gtCA5","KZamHQssNC","UlU3MHlUbF","MK07YFhtgl","ThjNnhYBCK","Zv7z0oGu6x","BpYhVtjQxs","9GXkXhe9IA",
+"K20wK0YAGH","lViBviwzGk","IBe8kKsjRK","QChxs0MR5X","ZuDtDpAhR1","blLA9PYBf4","ru4UG16lHc","aDGtS16lHc","ksJbyydG8U","RpBQmpAhR1",
+"prNT6ydG8U","29QAzJkzUn","aDGtShUTw7","7hyVvZuDtD","LDk6fFwEJz","IjTwPtjQxs","4W0TlNOHsz","Pb1pafqypy","n1pmOHP433","s4786DcpWB",
+"ni2v1ix74r","QClRLlCMxy","LbRTHZv7z0","nnP8oI7p2a","oGu6xpT8wu","tvdkDcmXIX","HRxd8sx5Gl","3weIF6AFT0","nFqikF6PT2","0PktIlH1kt",
+"yluBxaDGtS","NcICAFPfSE","xciqpOxWIH","0YAGHGv3Fq","P6bcgJ2mQi","MaJQs8U2nU","JIqXiFxX9q","8xEKzFwEJz","5nmWvciuWz","Ta8f6Y1mC0",
+"7Ow5CWPmlx","lkMUACdyBV","7ku1pWPmlx","1v5hHpWiOs","dmoS7MezSW","ksJbyRmDcr","vOqCEkZANm","QworuWaWsv","euZA5nFqik","tjQxsGrDg7",
+"U3yw5gdQsS","ZUnqt29QAz","nlaBy9iGoT","QnJ1SXyPZN","iKqhrt59lR","yToGWjeskS","v1Hlnv8yFN","lm0pDRpBQm","zQt6QCfgr3","t59lRfcJOy",
+"CIShG0MR5X","uTacxUlU3M","3weIFfaHir","MmsIoCNHmv","cShY2OUqFM","guMb8YOfrY","8cVD37lUXZ","Zv7z0yEfy9","1v5hHDQimp","iwzGklCMxy",
+"3otm6UmaEv","jiVBPIKxdL","QbxXc07n1c","Q6LixRzaZA","gf8rIM3zXL","rhl0JDLhzM","8FmFHGSQwj","EOE1oRACuj","Gv3Fqdpe1v","Ta8f65iGN5",
+"MojnPVLTy6","Cfgr33weIF","3otm6prNT6","29QAzOHaBz","sx5GlFcWrW","I7p2aTwano","fFDrJZv7z0","C2Irc6q6L9","brhlQ0MR5X","DQimpVIlwP",
+"djsrvpAhR1","5Drn0KsjRK","atef2Waim6","HRxd8Ul4a1","LDk6fOz8yZ","jS1ajIn3NS","Oz8yZxXTI4","L7cGcRmDcr","i7WMQfmIK1","sqVrfNhXdu",
+"JRJQBS77LH","9y4lwYf2Ec","8TxD7gtCA5","zbIYYlsQGo","TXQ0ZCdyBV","ydG8UguMb8","KZamHgdQsS","kZANmHlUbF","K4GS8Chuy3","ZJTXHuupzk",
+"MojnP5iGN5","tvdkDRkQke","piJSkPOUYS","n8pJ99y4lw","P6bcg8xEKz","uupzkgIYvE","wDajXVLTy6","YOfrYv8yFN","K4GS8soy9t","rKDLJzQt6Q",
+"14FLRuQIcz","nlaByRACuj","FLsphcmXIX","zFgtBuQIcz","JKWYR9y4lw","Mkgy8QClRL","Kr8ysNAFuw","VerEANhXdu","B3qemNcICA","5ZaEzCNHmv",
+"JKWYRhYBCK","POUYSNAFuw","Chuy3MezSW","Cfgr314FLR","FjHXRStlDJ","tuDySMezSW","nFqikM6qcG","he9IARkQke","7lUXZYOfrY","Vprf2jeskS",
+"JRJQBMkgy8","NOHszlsQGo","IRh482hEEU","QWxoTWreyP","ECMvUnFqik","mX2GEBGaQY","OUqFMkZANm","zY1GY7Ow5C","P6bcgO3iyQ","jzUqRQbxXc",
+"iKqhrAmdQd","cL0aE0Wr5y","In3NSQWxoT","oGu6xlpF6W","No0QbUlU3M","IRh487X3uy","sx5GlAgJHQ","QnJ1SuN6r3","AXpwE618Di","GWqqX0MR5X",
+"QnJ1SHfyNQ","mz8gxpFrrl","tjQxsX6Pin","NcICAjfREu","lViBvHfyNQ","EoToPMojnP","cL0aElkMUA","7X3uyX6Pin","yToGWjiVBP","i7WMQoVQp6",
+"ZhwG1WPmlx","qaofNxXTI4","dmoS7Nxx9V","vkCHHIjTwP","GrDg7M3zXL","cShY2fFDrJ","v2eC3jSjS3","KsjRKaL6AJ","rz7UtSjskQ","2ZHdkJ2mQi",
+"t98iWOxWIH","S77LHbZLvS","EoToPZzJHW","tuDySXflUq","ix74rlXFOB","tjQxsYh1hF","y94nwPb1pa","TXQ0ZG1RhS","he9IAfLNg8","48cHLi3pyd",
+"MaJQsiqv4k","580YD5Drn0","wDajXTXQ0Z","tlILtogLgc","9eoRcjfREu","rhl0Jlj07Q","7hyVvWaim6","CK5W7ksJby","Kr8ysFjHXR","hE1QlfcwDa",
+"W7cTsReKEW","VNCPdxciqp","Chuy3xciqp","ThjNnSjskQ","JRJQBJXljW","uN6r3guMb8","JXljWQssNC","LbRTH0PktI","o8Uydni2v1","fLNg8qQxHP",
+"xciqp5IhmG","tuDySbZLvS","s7Mxk5VZjS","ZzJHWlCMxy","MojnPDcpWB","VNCPd8hJdt","sx5GlSWfou","Dz1R3WreyP","faHir2TRI7","7Ow5C0BmCy",
+"wiHrZFwEJz","wiHrZIKxdL","No0Qby94nw","8U2nUHP433","gjUTuThjNn","qUJMdGSQwj","rKDLJVNCPd","0ao3lMmKGJ","0Wr5y5drc6","I7p2aBpYhV",
+"CqqaDEoToP","pAhR1yluBx","RpBQm0MR5X","GXdoHcmXIX","5IhmGSWfou","lCMxyv8yFN","CdyBV7ku1p","AkKTk1j5L8","jSjS36q6L9","6q6L97fsYM",
+"HlUbFYOfrY","RkQken1pmO","VIlwPcmXIX","uN6r3Mm8si","BpYhVHfyNQ","lXFOB1v5hH","BpYhVfcJOy","qaofNoQ87r","rz7Ut8xEKz","t98iWDLhzM",
+"UmaEvt98iW","JRJQBnnP8o","In3NSpT8wu","S77LHsoy9t","WPmlxM6qcG","xciqpmX2GE","suY4xMGlTF","2NslmjSjS3","Gv3Fq2Yz7E","aFFssokgRi",
+"yluBxW7cTs","8cVD3sx5Gl","pT8wuHzZT8","euZA5hi5X7","OUqFM2TRI7","WMiS3Oz8yZ","0ao3lQWxoT","b29RJSbRYy","1j5L8FGzgp","MGlTFgjUTu",
+"Yh1hF5drc6","bZLvSlViBv","618Di8hJdt","2Yz7EQ6hMC","v2eC3i7WMQ","prNT65VZjS","OHaBzDLhzM","Yh1hFlsQGo","4W0TlvOqCE","Chuy3prNT6",
+"RkQke4W0Tl","pv0i7O3iyQ","7hyVvcL0aE","7fKYUSWfou","uupzkRsQUq","FxX9q9y4lw","nlaByqQxHP","VBjhzRxrsm","FFDuizY1GY","LbRTHaDGtS",
+"vkCHH5iGN5","lweGysqVrf","QssNCjtn0X","VBjhzL7cGc","qQxHPOHaBz","IKxdLkZANm","5IhmGYOfrY","0Wr5yCNHmv","TXQ0ZxReec","G1RhS4QMc9",
+"b29RJMkgy8","VLTy6aez9y","lH1ktBFkb8","lweGySs0Zu","oGu6xYh1hF","uJScXtlILt","Zv7z04QMc9","yluBxtvdkD","618DiZ4I1v","NAFuw2ZHdk",
+"BGaQYAXpwE","oGu6xsuY4x","Z4I1v2hEEU","pFrrlVNCPd","TXQ0Zo8Uyd","HP433GXdoH","EdBKceuZA5","FNYIMv2eC3","ZhwG1LewvM","VerEAFNYIM",
+"kB5nPtaOXK","POUYSYw2oU","MezSWmz8gx","45cIHFhtgl","MezSWtl72W","QWxoTMm8si","jiVBPs4786","Yf2Ec2hEEU","YjB9tS77LH","i7WMQFLsph",
+"5nmWvxciqp","uupzkyluBx","hi5X7rhl0J","aFFssTXQ0Z","Y1mC0EoToP","zbIYY6q6L9","S2DfuIRh48","gf8rI14FLR","ydG8U2TRI7","JKWYRciuWz",
+"QssNCIjTwP","Chuy37lUXZ","ZhwG1AXpwE","uvf7AhE1Ql","07n1cwDajX","GrDg7hYBCK","v1HlnECMvU","Q6hMC5Namm","kB5nP5iGN5","16lHc580YD",
+"RmDcrMGlTF","YOfrYgIYvE","4dEz6fLNg8","dhSuHYw2oU","9iGoT45cIH","FcWrWSWfou","v1HlnVNCPd","SmGzvOHaBz","vOqCETXQ0Z","lpF6Wuupzk",
+"M3zXL7lUXZ","m4bxUYOfrY","CxVEfcmXIX","0PktIXyPZN","7lUXZbgJAz","blLA9pvgjS","W7cTs64s8N","hUTw78hJdt","Qworu2Yz7E","lm0pD1LB1L",
+"n1pmOSs0Zu","K4GS8qQxHP","In3NS618Di","he9IAQClRL","Vprf2K20wK","Yh1hFlXFOB","64s8Npv0i7","dpe1vqUJMd","JKWYRksJby","kB5nPXflUq",
+"Chuy3uPX7G","jS1ajjfREu","0Wr5yqUJMd","No0QbQWxoT","e6e4zQ6Lix","QYxC0W3VFH","nnP8oW3VFH","EOE1ovOqCE","5VZjSLbRTH","KASQ8VIlwP",
+"MK07Y8hJdt","F6PT2guMb8","piJSkFcWrW","16lHcCdyBV","hE1Qlzz4ZU","Chuy37fsYM","Gv3FqWPmlx","h1zcHStlDJ","QYxC0Y1mC0","Cp3mZgtCA5",
+"suY4xuvf7A","5Drn0n1pmO","uN6r37fKYU","uTacxI7p2a","3otm6CK5W7","Zv7z0h1zcH","xXTI4JRJQB","WPmlxMmsIo","cShY214FLR","hSSvQv1Hln",
+"qUJMdFcWrW","Yh1hFC2Irc","yofH3uZPqg","RACujOHaBz","kB5nPlXFOB","W7cTsW3VFH","L7cGcFxX9q","BGaQYAOgEe","KASQ84dEz6","Oz8yZ7X3uy",
+"brhlQl83Ud","QChxsFVMxo","1LB1L8RCUA","n1pmOcShY2","VjCZq55rfB","pWiOsJkzUn","Yw2oUtAOsr","QworudmoS7","7X3uywDajX","Twanolj07Q",
+"Cp3mZLewvM","PYBf4tjQxs","FnPFBAmdQd","24ARFIjTwP","iqv4kPYBf4","tlILtEoToP","D6rByJ2mQi","EdBKcydG8U","UlU3MGXdoH","JIqXiP6bcg",
+"lViBvtAOsr","FhtglQ6hMC","cmXIXdjsrv","Zv7z0kB5nP","FPfSEEoToP","CqqaDuAWyp","Zv7z0v8yFN","MmsIofaHir","DcpWB07n1c","ulk41CdyBV",
+"DQimp16lHc","JRJQBUl4a1","QnJ1SprNT6","NAFuwAXpwE","l83UdCdyBV","Dz1R3xReec","kZANmM6qcG","StlDJSjskQ","nnP8oYf2Ec","mX2GEI7p2a",
+"gtCA5Fhtgl","Cfgr3KsjRK","2DREsCK5W7","EoToPYh1hF","0MR5XfcwDa","pvgjS3weIF","2TRI75Drn0","YOfrYk85Ae","jeskS14FLR","oVQp63weIF",
+"8RCUAeuZA5","JRJQBVprf2","jzUqRGSQwj","s7MxkUvlv4","ReKEWBCxeC","B3qemGv3Fq","uupzkzY1GY","14FLRFwEJz","lweGyB3qem","pAhR1ZzJHW",
+"m4bxUNo0Qb","uupzkUlU3M","VjCZqsx5Gl","AmdQdW3VFH","qQxHPlCMxy","7Ow5Crz7Ut","hSSvQiB08l","cL0aEFjHXR","dQ586GWqqX","fmIK1No0Qb",
+"Q6LixrKDLJ","2hEEUDcpWB","EoToPCNHmv","2ZHdkuTacx","6q6L9iwzGk","NcICAVNCPd","Nxx9Vmz8gx","ix74rQYxC0","0ao3l5drc6","Nxx9VEdBKc",
+"Yh1hF8hJdt","1j5L8pv0i7","1j5L8taOXK","7fKYUSs0Zu","t98iWF6PT2","Y1mC0gIYvE","SjskQ0YAGH","ZuDtD0YAGH","45cIHqQxHP","yvOMIChuy3",
+"uvf7Ab29RJ","tlILtyToGW","dhSuHs7Mxk","d7vjM7fKYU","9rlg9SmGzv","uZPqgVerEA","tl72Wi3pyd","fmIK1pmeCd","v8yFN5iGN5","Kr8ysRzaZA",
+"FnPFB2Nslm","IBe8k0ao3l","16lHcUlU3M","9XyT9aFFss","zz4ZUzQt6Q","IjTwP8FmFH","uTacxRmDcr","BCxeCzY1GY","8xEKzs93Ml","GXdoHRACuj",
+"k85AeZv7z0","GWqqXuoStw","MGlTFMmsIo","7lUXZGrDg7","lViBvMK07Y","FwEJzqQxHP","K20wKoGu6x","14FLRS77LH","Q6Lix7ku1p","9y4lwP6bcg",
+"Uvlv4qQxHP","he9IAs93Ml","G1RhSbgJAz","yvOMIMojnP","AmdQd8hJdt","QYxC0AgJHQ","d7vjMCIShG","7fKYUJIqXi","K20wKKr8ys","jeskSbrhlQ",
+"SWfoudhSuH","W3VFHQssNC","9GXkXiB08l","Waim6sqVrf","FFDuiEOE1o","HlUbFSjskQ","J2mQiyvOMI","fqypyDG4sT","K4GS89XyT9","K20wK0Wr5y",
+"OxWIHru4UG","lXFOB16lHc","faHirCNHmv","WDVWJrhl0J","L7cGcWaim6","uQIczWreyP","5nmWvJRJQB","48cHLb29RJ","lViBvVBjhz","Zv7z0StlDJ",
+"C2IrcTwano","t98iWY1mC0","SWfoulm0pD","8TxD7CIShG","HRxd8lm0pD","FjHXR1j5L8","JIqXi9rlg9","BGaQYHzZT8","d85a9Mm8si","Uvlv4Kr8ys",
+"gf8rIlm0pD","YOfrYgtCA5","JJs5mHzZT8","tvdkDRzaZA","SbRYyvOqCE","tuDyS5drc6","2hEEUBbwgA","VLTy6rhl0J","xXTI4lsQGo","pvgjSb29RJ",
+"5nmWv7fsYM","v8yFNciuWz","8RCUAvOqCE","aFFssxciqp","fqypyF6PT2","7hyVvZJTXH","45cIHWDVWJ","FNYIMD6rBy","tuDySSjskQ","fcJOy7ku1p",
+"DG4sTsqVrf","piJSkVLTy6","dpe1vhYBCK","ZUnqtIn3NS","h1zcHyofH3","VLTy6Y1mC0","n1pmOogLgc","sx5GlCfgr3","QnJ1SGv3Fq","he9IAxReec",
+"sx5Gl9iGoT","FnPFBe6e4z","ZzJHW2Nslm","7X3uy0PktI","VNCPdjiVBP","tuDySuQIcz","5NammiB08l","GWqqXHP433","hYBCK4QMc9","fLNg8hSSvQ",
+"Pb1paaDGtS","ni2v12hEEU","X6PinjS1aj","24ARFxciqp","2Yz7Euupzk","P6bcgF6PT2","MmsIoYf2Ec","BpYhVYjB9t","9eoRcuQIcz","7ku1pK4GS8",
+"1v5hHuAWyp","k85AeOUYuF","iKqhrNOHsz","ydG8UOHaBz","ogLgcHzZT8","WreyPix74r","zbIYYfcJOy","MGlTFRpBQm","L7cGcyvOMI","GrDg70h1b1",
+"Dz1R3OxWIH","JRJQB3weIF","L7cGcRzaZA","iwzGkcQOnv","5VZjSsqVrf","n1pmORxrsm","Yw2oUSbRYy","FNYIMW3VFH","Uvlv4MojnP","3weIFs4786",
+"gtCA5pvgjS","8U2nUru4UG","jSjS3O3iyQ","iqv4k580YD","MK07YprNT6","45cIHuvf7A","lm0pDBGaQY","djsrvG1RhS","7fsYMYh1hF","FjHXRYw2oU",
+"9GXkXKsjRK","wDajXZUnqt","UlU3Ms4786","MezSWS77LH","yToGWgIYvE","BCxeClsQGo","azIWpKr8ys","lCMxyGSQwj","5iGN54dEz6","i7WMQuLtKs",
+"WMiS38TxD7","ZzJHWJ2mQi","No0Qb2Yz7E","bgJAzyEfy9","m4bxUmX2GE","kB5nP5nmWv","FnPFBrz7Ut","RzaZASbRYy","VjCZqHfyNQ","W7cTsuN6r3",
+"KsjRKjeskS","lsQGo8U2nU","OUYuFb29RJ","lCMxyqQxHP","JkzUnWPmlx","tvdkDjSjS3","U3yw5euZA5","VerEATa8f6","mz8gxuTacx","K4GS8FxX9q",
+"uvf7Ay94nw","6q6L9Y1mC0","5Drn0yEfy9","h1zcHjfREu","ydG8UMkgy8","atef2CxVEf","Zv7z0ydG8U","MaJQs55rfB","hi5X7RzaZA","djsrvSjskQ",
+"FLsphtjQxs","RACujrz7Ut","d85a9nFqik","Yh1hFoGu6x","jSjS3ZhwG1","YjB9t9iGoT","GrDg7lsQGo","JXljWAIYUu","dpe1v1v5hH","ZzJHWY1mC0",
+"IRh48s7Mxk","I7p2aZv7z0","i7WMQsqVrf","zqH0WKr8ys","8RCUAY1mC0","hUTw7RACuj","RkQketuDyS","G1RhSIKxdL","EdBKcBCxeC","ReKEWThjNn",
+"4W0TlEoToP","0BmCygtCA5","9rlg9uPX7G","RmDcrbgJAz","OHaBzCxVEf","TXQ0ZQworu","QbxXcgtCA5","vkCHHpmeCd","WreyPPb1pa","hi5X7hi5X7",
+"tlILtkB5nP","MezSWQYxC0","qUJMdK20wK","h1zcHatef2","CK5W7NOHsz","OUqFMciuWz","X6PinNOHsz","7Ow5ChUTw7","pAhR1ciuWz","K4GS8uoStw",
+"0BmCygdQsS","O3iyQ24ARF","RzaZARBhp0","zQt6QkB5nP","NcICAIRh48","CIShGW3VFH","JRJQBL7cGc","4dEz6oVQp6","XflUqNAFuw","W7cTsmX2GE",
+"7fKYU9y4lw","atef2o8Uyd","FxX9qWPmlx","5IhmGlkMUA","lweGyrz7Ut","7Ow5Cfqypy","RACujgtCA5","45cIHQssNC","zFgtBNo0Qb","jfREut59lR",
+"JRJQB4dEz6","xXTI4D6rBy","Z4I1vRpBQm","Mkgy8xXTI4","64s8N9GXkX","4QMc9jtn0X","0PktICp3mZ","9eoRcEdBKc","lViBvn1pmO","zmLYDNhXdu",
+"sx5GlD6rBy","4QMc9RpBQm","2ZHdkSbRYy","QChxspv0i7","TwanozFgtB","0PktIRmDcr","MaJQsaFFss","POUYSpvgjS","AIYUupFrrl","In3NSUmaEv",
+"jSjS3RBhp0","FcWrWs7Mxk","bZLvShSSvQ","7Ow5CcShY2","5IhmGFVMxo","s4786gdQsS","IjTwPFNYIM","pWiOsuLtKs","S77LHtlILt","2ZHdkWPmlx",
+"aez9y8xEKz","lH1ktzY1GY","OxWIHHRxd8","FLsphgf8rI","lweGy4dEz6","4dEz6pAhR1","uTacxQssNC","KsjRKRsQUq","GWqqXzbIYY","JKWYRuPX7G",
+"yofH3s4786","Q6LixG1RhS","GSQwjtlILt","ix74r2Nslm","tvdkDMojnP","tvdkDix74r","tvdkDKsjRK","FnPFBL7cGc","QnJ1SyluBx","AIYUugf8rI",
+"hSSvQOUqFM","Mkgy81v5hH","RsQUqix74r","FcWrW5Mg9r","5Nammfqypy","4QMc9BpYhV","dQ586F6PT2","nnP8odpe1v","zQt6QRkQke","tAOsrVerEA",
+"aDGtSFFDui","0BmCyatef2","oVQp6ZUnqt","WaWsvi3pyd","pT8wuqUJMd","piJSkJKWYR","SbRYyi3pyd","hSSvQPYBf4","yluBxCxVEf","ThjNnuN6r3",
+"0h1b1MmsIo","O3iyQlH1kt","FPfSEv1Hln","ReKEW8TxD7","wiHrZYh1hF","v2eC3Uvlv4","Uvlv4QssNC","tAOsrSs0Zu","FxX9qJIqXi","9eoRcNhXdu",
+"JRJQBsqVrf","5drc6uupzk","JkzUnsx5Gl","RmDcrnlaBy","FGzgptlILt","WDVWJL7cGc","i7WMQlViBv","O3iyQaDGtS","MGlTF4W0Tl","jS1ajWDVWJ",
+"piJSkAOgEe","5Mg9r580YD","5iGN5FnPFB","prNT6yEfy9","dmoS7aL6AJ","FLsphRkQke","cL0aEBbwgA","2TRI7zY1GY","ZJTXHQChxs","1v5hH1j5L8",
+"JRJQB8FmFH","bZLvSyvOMI","guMb8FLsph","POUYS07n1c","cL0aEhYBCK","7Ow5CMmKGJ","0ao3l4QMc9","i7WMQpv0i7","cShY2EoToP","45cIHwDajX",
+"FcWrWlCMxy","Waim6IKxdL","TXQ0ZuAWyp","RkQkeAIYUu","kB5nPiKqhr","FVMxohi5X7","fcJOyM6qcG","dmoS7ECMvU","n1pmOwiHrZ","ZUnqtkZANm",
+"CxVEfFGzgp","Chuy3okgRi","W3VFH1LB1L","VIlwPrz7Ut","0h1b1blLA9","Mkgy8MGlTF","1j5L8bZLvS","bZLvS45cIH","618DiIjTwP","ksJbyjzUqR",
+"FPfSElm0pD","IKxdL0Wr5y","pT8wu5Drn0","Dz1R3zQt6Q","NAFuwmz8gx","FFDuiMK07Y","WaWsvYjB9t","8hJdtGXdoH","cShY2mX2GE","he9IAuQIcz",
+"oVQp6tlILt","G1RhS1v5hH","kZANmni2v1","9GXkXuPX7G","suY4xx3LDe","x3LDe45cIH","tjQxs9iGoT","UlU3MChuy3","zz4ZU07n1c","S2DfuTXQ0Z",
+"4dEz6gIYvE","M6qcGnlaBy","2NslmIBe8k","nnP8oQ6hMC","ulk41cmXIX","RBhp0Yf2Ec","iKqhrDLhzM","sx5Gln8pJ9","zHF1quoStw","IBe8kCqqaD",
+"IjTwPGSQwj","OUqFMbZLvS","SmGzvsoy9t","qQxHPdmoS7","S2DfuFcWrW","QWxoTW3VFH","45cIHaez9y","0Wr5yNo0Qb","uZPqgbrhlQ","B3qemazIWp",
+"pAhR1HRxd8","I7p2a8xEKz","MGlTFGrDg7","ZUnqtJRJQB","hi5X75Namm","FjHXRQbxXc","dmoS7brhlQ","hE1QloVQp6","azIWpa00b5","WPmlxBbwgA",
+"zqH0WGv3Fq","Mkgy89XyT9","ru4UGJIqXi","yToGW1j5L8","ThjNn07n1c","x3LDeaDGtS","AIYUuyEfy9","G1RhStlILt","FLsph6AFT0","SmGzvyluBx",
+"s4786GXdoH","n1pmOtuDyS","pv0i7s4786","bgJAzCqqaD","Uvlv4KsjRK","ix74ryvOMI","MmsIo5IhmG","MmKGJsqVrf","i7WMQyvOMI","b29RJ1LB1L",
+"24ARFAgJHQ","YjB9tcShY2","OUqFMQYxC0","Ul4a1VNCPd","14FLRBGaQY","BbwgADz1R3","DcpWBlH1kt","suY4xe6e4z","gf8rIulk41","FPfSEuN6r3",
+"VBjhz16lHc","07n1cXyPZN","0ao3l0YAGH","s47867fsYM","7lUXZv1Hln","prNT67X3uy","uupzkMkgy8","JXljWUlU3M","Z4I1vyluBx","AIYUuWaWsv",
+"Yh1hF7lUXZ","nlaByyvOMI","Q6hMCvkCHH","KsjRKulk41","zbIYYCNHmv","LbRTH7X3uy","QChxsHlUbF","07n1chYBCK","qQxHPyofH3","lkMUAzbIYY",
+"JXljW0BmCy","5Mg9r7fsYM","xciqpVBjhz","DcpWBOHaBz","fmIK1CK5W7","7fKYUlkMUA","SmGzvciuWz","cQOnvAmdQd","Ul4a1rz7Ut","fcwDagdQsS",
+"cmXIXjfREu","HfyNQ9y4lw","QnJ1SC2Irc","hYBCKFLsph","BpYhVChuy3","UmaEvlViBv","5nmWvydG8U","hYBCKuQIcz","atef2RsQUq","MojnP55rfB",
+"yEfy9pFrrl","VjCZqcL0aE","LewvMVerEA","blLA9aez9y","lm0pDfmIK1","1v5hHVjCZq","AgJHQK20wK","lViBvF6PT2","P6bcggf8rI","Dz1R3KASQ8",
+"n1pmOzmLYD","hUTw7Rxrsm","Ta8f6v8yFN","dhSuHMezSW","vkCHHAkKTk","M6qcGFFDui","Oz8yZvLsmS","yofH3SmGzv","1LB1LlCMxy","7Ow5C8U2nU",
+"rz7UtjSjS3","TXQ0Z5ZaEz","IBe8k29QAz","AgJHQUvlv4","dQ586MK07Y","MmsIo7ku1p","W7cTsECMvU","O3iyQVBjhz","VjCZqfLNg8","FVMxodpe1v",
+"rhl0JFNYIM","FxX9qQWxoT","ydG8UCqqaD","HP433UmaEv","2ZHdk9XyT9","IjTwPAgJHQ","2DREs5ZaEz","zQt6QiwzGk","blLA9ZhwG1","IBe8kydG8U",
+"JRJQBuN6r3","RACujfmIK1","zqH0Wdpe1v","5Mg9rMaJQs","TwanoBGaQY","jzUqRtlILt","mz8gxF6PT2","k85AeEdBKc","Mkgy8o8Uyd","WmadAtvdkD",
+"a00b5uQIcz","IRh48faHir","m4bxUCp3mZ","djsrvNOHsz","faHirDcpWB","fmIK1zFgtB","GXdoHRxrsm","mz8gxv2eC3","v1HlnqQxHP","t98iW0h1b1",
+"brhlQh1zcH","8U2nURkQke","48cHLFNYIM","MojnPtaOXK","5NammWPmlx","7fKYU4QMc9","xXTI4Chuy3","jzUqRhUTw7","xXTI4RACuj","ogLgcm4bxU",
+"6q6L9aDGtS","Waim68hJdt","QWxoTBpYhV","cQOnvsuY4x","ThjNnDG4sT","ZzJHWcmXIX","lpF6WGXdoH","FwEJzKASQ8","he9IAVjCZq","zz4ZUd85a9",
+"dmoS7x3LDe","ReKEWHRxd8","CNHmvYjB9t","DLhzMKr8ys","S2Dfuix74r","ciuWz2ZHdk","ksJbyNOHsz","9rlg9Q6hMC","jfREuwDajX","9y4lwGrDg7",
+"RxrsmxReec","sx5GlWmadA","0ao3lx3LDe","lXFOBjfREu","KZamHD6rBy","RkQkeEdBKc","Chuy3JkzUn","ZUnqtCqqaD","SWfouaDGtS","SWfouMkgy8",
+"qaofNksJby","UlU3MFVMxo","h1zcHfmIK1","B3qemSWfou","0MR5Xulk41","lH1ktdQ586","B3qemuZPqg","8TxD7Vprf2","4QMc9UlU3M","faHirjzUqR",
+"i3pyd9eoRc","tlILtvLsmS","lsQGooGu6x","ECMvU5IhmG","BCxeCI7p2a","b29RJprNT6","1j5L8euZA5","M3zXLzbIYY","MmsIokB5nP","tuDySxReec",
+"CqqaD5nmWv","FLsphk85Ae","NAFuwni2v1","zY1GYv2eC3","DcpWB5drc6","VLTy6xXTI4","ECMvUY1mC0","fcwDa5VZjS","LbRTH4dEz6","FLsphUlU3M",
+"Gv3FqUlU3M","atef2AmdQd","piJSkChuy3","EOE1od7vjM","lm0pDuTacx","KsjRKjzUqR","Cp3mZYjB9t","PYBf45iGN5","yEfy9blLA9","zqH0W0MR5X",
+"2TRI7pWiOs","5iGN5zHF1q","QClRLaDGtS","MmsIozFgtB","CqqaD48cHL","RsQUqJJs5m","9XyT9Uvlv4","aDGtSZuDtD","DcpWBuLtKs","L7cGc9XyT9",
+"jtn0Xb29RJ","ni2v1qaofN","yluBxJRJQB","JRJQBRsQUq","StlDJl83Ud","Vprf2a00b5","atef2KASQ8","7Ow5CS2Dfu","AOgEeF6PT2","aez9y6q6L9",
+"ulk41uLtKs","5Drn0aDGtS","0MR5XnnP8o","Z4I1vFnPFB","ZhwG1QWxoT","1v5hHQ6Lix","64s8NuAWyp","JkzUnlViBv","JkzUnRkQke","cL0aEguMb8",
+"NAFuwqaofN","U3yw52Yz7E","RBhp0JkzUn","K4GS8d85a9","JIqXiWMiS3","0h1b19GXkX","MaJQs1LB1L","OUYuF7lUXZ","UlU3M16lHc","29QAz0h1b1",
+"ZuDtDhUTw7","P6bcgK20wK","S77LHlkMUA","1j5L8jS1aj","55rfBEOE1o","0Wr5yuAWyp","fqypyQssNC","In3NSZzJHW","DG4sTlViBv","NOHszAOgEe",
+"6AFT0K4GS8","Q6hMCdpe1v","tuDySfLNg8","9iGoTVNCPd","vkCHHxXTI4","h1zcHblLA9","s93Ml5Drn0","QWxoTlH1kt","QYxC0hi5X7","JkzUnECMvU",
+"hE1QlaL6AJ","mz8gxfcJOy","5drc69y4lw","D6rByOUqFM","1v5hHlsQGo","uvf7AYjB9t","Dz1R3AOgEe","P6bcglm0pD","lXFOBWDVWJ","7fsYMuupzk",
+"lpF6W580YD","pmeCd6q6L9","lkMUAM6qcG","uAWypGXdoH","lj07Q48cHL","bZLvS5Namm","uAWypzHF1q","e6e4z0ao3l","BFkb855rfB","4dEz6YOfrY",
+"NOHszuTacx","ReKEWZzJHW","mX2GEAIYUu","k85Aei3pyd","pv0i7ni2v1","VBjhzgIYvE","HRxd89y4lw","ulk410YAGH","jtn0X1LB1L","tvdkDKr8ys",
+"WaWsvhUTw7","rhl0J07n1c","dmoS7faHir","X6Pin5iGN5","ulk415IhmG","uoStwfqypy","h1zcHFwEJz","6q6L9Zv7z0","gdQsS07n1c","yToGWjSjS3",
+"Vprf248cHL","S77LHRsQUq","GrDg7QClRL","K20wKNAFuw","vkCHH8TxD7","StlDJDLhzM","07n1cpAhR1","FNYIMVjCZq","CxVEfS2Dfu","9iGoTyvOMI",
+"ciuWzhUTw7","9XyT9uvf7A","dmoS7suY4x","7hyVvaDGtS","RpBQmgtCA5","hYBCK5drc6","BbwgAuPX7G","OUYuFnnP8o","5Drn0kB5nP","5IhmGlCMxy",
+"vOqCEi3pyd","lCMxysuY4x","No0QbU3yw5","ogLgclXFOB","i3pydSmGzv","vOqCElpF6W","IKxdL5ZaEz","TXQ0ZvOqCE","iqv4kDz1R3","5iGN55iGN5",
+"ZuDtDOz8yZ","3weIFVjCZq","Yw2oUEOE1o","iwzGkJRJQB","fFDrJuJScX","oGu6xI7p2a","CNHmvQbxXc","ksJbyMmKGJ","VBjhzJJs5m","9iGoTOHaBz",
+"sx5GlFnPFB","fcJOyNo0Qb","hYBCKgtCA5","gdQsSTa8f6","FxX9qGSQwj","jfREuJRJQB","tl72Wuvf7A","pv0i7MaJQs","Q6hMC8hJdt","EdBKcxReec",
+"nlaBytuDyS","7hyVvIn3NS","MmKGJblLA9","wiHrZn1pmO","2hEEUlm0pD","jS1aj1LB1L","FVMxooGu6x","mz8gxdpe1v","JkzUnMm8si","W7cTsyToGW",
+"4QMc9jS1aj","d85a9tvdkD","s93MlJRJQB","9GXkXlCMxy","gjUTu8U2nU","ZUnqt4QMc9","fLNg8ZuDtD","zmLYDJ2mQi","7ku1ptuDyS","X6PinNhXdu",
+"jiVBP64s8N","fLNg8DQimp","L7cGcyluBx","jfREu4QMc9","fLNg8tuDyS","dmoS7FcWrW","Oz8yZdjsrv","FnPFBfLNg8","9iGoTMaJQs","iwzGk4QMc9",
+"mX2GEPOUYS","b29RJgdQsS","piJSkpiJSk","uAWypOz8yZ","WreyP7Ow5C","NhXduoVQp6","YOfrYStlDJ","wiHrZNo0Qb","2Yz7EtjQxs","9rlg9EOE1o",
+"AIYUuCIShG","YjB9tAOgEe","6q6L9BGaQY","EdBKcWaWsv","2ZHdkBCxeC","Z4I1vogLgc","SWfouM6qcG","Kr8ysHzZT8","uZPqgRBhp0","YjB9t2Yz7E",
+"MezSWbgJAz","uZPqguPX7G","hYBCKJJs5m","jSjS3pAhR1","0YAGHVerEA","zHF1qW3VFH","4QMc9jeskS","fcJOy14FLR","v2eC329QAz","7ku1paL6AJ",
+"jfREuuupzk","5nmWvlpF6W","YOfrYWaWsv","pAhR1DLhzM","mX2GEpmeCd","7hyVvqaofN","Q6Lixatef2","9rlg9I7p2a","Uvlv4WaWsv","MGlTFzFgtB",
+"qQxHPWreyP","AkKTkhE1Ql","16lHclj07Q","7X3uy9GXkX","EoToP7Ow5C","vLsmSGXdoH","MK07YYjB9t","B3qemvLsmS","DQimpgf8rI","ZuDtDQnJ1S",
+"ReKEWoQ87r","Twano45cIH","uQIczzmLYD","Z4I1v8hJdt","hi5X70Kyfs","Ss0ZulCMxy","ydG8USmGzv","tvdkDQYxC0","fFDrJFGzgp","FwEJzlsQGo",
+"Yw2oUWmadA","uN6r3dhSuH","Dz1R3suY4x","HP433KsjRK","BbwgAtvdkD","taOXKAgJHQ","Yw2oUSjskQ","taOXKy94nw","MmKGJhE1Ql","0BmCyRmDcr",
+"zHF1qSmGzv","ThjNnm4bxU","v8yFN580YD","FwEJzatef2","9XyT9iKqhr","jfREuX6Pin","HlUbFUmaEv","0PktIvkCHH","uvf7AEOE1o","HfyNQjtn0X",
+"EOE1o7hyVv","KZamHpvgjS","Pb1paJKWYR","yluBxzFgtB","MGlTFRxrsm","BGaQY5drc6","ZuDtDoGu6x","hYBCKQYxC0","d7vjMjfREu","S77LHpT8wu",
+"Yh1hFfmIK1","hE1Ql0MR5X","1v5hHfcwDa","ulk41Waim6","Z4I1vFVMxo","FGzgpFLsph","WmadA0YAGH","d85a9ni2v1","RzaZAaDGtS","QChxspiJSk",
+"FxX9qHP433","iKqhr7lUXZ","s93MlNo0Qb","GSQwjuQIcz","vLsmS14FLR","2TRI7qUJMd","VjCZqL7cGc","8xEKzBbwgA","Rxrsm2ZHdk","M3zXLHlUbF",
+"9XyT9e6e4z","FxX9qP6bcg","taOXKRzaZA","Zv7z00ao3l","Y1mC0ulk41","0Wr5yVprf2","Q6hMC0BmCy","vLsmShi5X7","5nmWvuLtKs","pFrrluN6r3",
+"kZANmEoToP","2ZHdkzY1GY","Zv7z0XyPZN","S2DfuwiHrZ","FxX9qaDGtS","QssNC0MR5X","7lUXZ8RCUA","618Diuvf7A","oVQp6uQIcz","lXFOBQYxC0",
+"kB5nPYf2Ec","SWfouZ4I1v","Vprf2lXFOB","lm0pDcQOnv","F6PT2RmDcr","O3iyQ2hEEU","ru4UGuupzk","WPmlxtuDyS","RpBQm2DREs","9XyT9tAOsr",
+"FFDuiv1Hln","5Mg9rDLhzM","Ta8f6DG4sT","NhXduKASQ8","VIlwPeuZA5","I7p2aM3zXL","QssNCXyPZN","pWiOs0h1b1","1LB1LEoToP","oVQp6POUYS",
+"5Namm5Drn0","okgRirz7Ut","F6PT2QnJ1S","dQ586Waim6","29QAzlH1kt","ogLgcsx5Gl","lweGyni2v1","pAhR18FmFH","B3qemd7vjM","DLhzM3weIF",
+"rKDLJcQOnv","QbxXcpFrrl","NhXdunFqik","KsjRKyvOMI","CdyBVF6PT2","ZUnqtrz7Ut","S2DfuWaim6","BpYhVRzaZA","1j5L8nFqik","KZamHDG4sT",
+"iwzGkGWqqX","NhXdugtCA5","ZUnqtYOfrY","hUTw7618Di","IBe8kaDGtS","Yf2EcVIlwP","lCMxyBCxeC","X6PinbgJAz","OxWIHQworu","WMiS3QChxs",
+"0BmCyMkgy8","ECMvUlH1kt","dhSuH14FLR","ogLgcWreyP","16lHc0PktI","NOHszWPmlx","UmaEv7fsYM","8TxD79GXkX","580YDSbRYy","CIShG7hyVv",
+"C2IrcaDGtS","fmIK1D6rBy","XyPZNyluBx","azIWplsQGo","pAhR1kB5nP","FPfSEHlUbF","hi5X7i7WMQ","VBjhzGXdoH","Dz1R3IjTwP","wDajX2ZHdk",
+"QYxC0zY1GY","WPmlx5nmWv","soy9tIjTwP","Waim6vLsmS","zQt6QOUqFM","hYBCKuLtKs","sx5Gld85a9","MaJQsBGaQY","fcJOyOxWIH","vLsmSIn3NS",
+"RBhp0zz4ZU","wiHrZVBjhz","KZamHK20wK","Yh1hFHfyNQ","pmeCdWaWsv","RmDcrdjsrv","6AFT0AXpwE","ix74rpWiOs","CIShGpWiOs","dmoS7HP433",
+"bgJAznlaBy","h1zcHzFgtB","EdBKcuoStw","zz4ZUuupzk","Yh1hFaez9y","W3VFH6AFT0","EdBKcFVMxo","8TxD70ao3l","Yf2Ecb29RJ","Gv3FqvkCHH",
+"TXQ0Z0YAGH","4dEz6Vprf2","rz7UtM3zXL","NhXdupT8wu","64s8NjzUqR","fcwDat98iW","0MR5XoGu6x","mz8gxZv7z0","iqv4kFVMxo","Q6Lixe6e4z",
+"48cHLuTacx","uupzkVIlwP","CK5W7rKDLJ","ru4UGGrDg7","zbIYYa00b5","VjCZq6q6L9","AmdQd9eoRc","29QAzQWxoT","In3NSqaofN","OUYuFdQ586",
+"WreyP0BmCy","OHaBzWmadA","FNYIMKASQ8","618DiC2Irc","Vprf25VZjS","d85a9taOXK","Fhtgl7lUXZ","nFqikpWiOs","lkMUAhE1Ql","FLsph9y4lw",
+"WPmlxZUnqt","zQt6QFjHXR","CIShGe6e4z","DG4sTrKDLJ","AmdQdbrhlQ","JKWYRpWiOs","xciqpB3qem","KsjRKJ2mQi","azIWpgjUTu","ZhwG1AmdQd",
+"l83Udpv0i7","NAFuw14FLR","uN6r3HP433","a00b5RkQke","EoToPhe9IA","45cIHVerEA","fFDrJjzUqR","7hyVvIKxdL","DQimpIn3NS","8FmFHReKEW",
+"VIlwPv2eC3","Yw2oUAkKTk","TXQ0ZNAFuw","6AFT0uoStw","AmdQdtlILt","HzZT87ku1p","b29RJWaim6","CNHmvsqVrf","uQIcz16lHc","0BmCyBpYhV",
+"MK07YlH1kt","LbRTHokgRi","IRh48jtn0X","GSQwjVBjhz","DQimpJRJQB","rz7UtZJTXH","hSSvQblLA9","L7cGcjfREu","8FmFHdQ586","GSQwjU3yw5",
+"Cp3mZv2eC3","5iGN5ZJTXH","Yw2oUv2eC3","atef2nnP8o","cmXIX5Mg9r","MojnPxReec","MaJQsQChxs","RBhp0VLTy6","soy9tNo0Qb","ReKEWpAhR1",
+"9y4lwfLNg8","0MR5X0h1b1","Cp3mZuZPqg","he9IA0YAGH","m4bxUGXdoH","i7WMQd7vjM","cShY2Mm8si","he9IAzbIYY","VNCPdNAFuw","oGu6xlm0pD",
+"WaWsvQChxs","FwEJzRBhp0","QClRLJRJQB","J2mQifqypy","s7MxkogLgc","No0QbZ4I1v","yluBxOUqFM","7fKYUAmdQd","FPfSE2Yz7E","t98iWKsjRK",
+"9XyT9tlILt","8hJdt9XyT9","aez9yd85a9","BGaQYX6Pin","nlaByB3qem","uQIczjfREu","zz4ZUpT8wu","v8yFN6q6L9","pv0i7KsjRK","guMb8t98iW",
+"CxVEf2ZHdk","EdBKcXflUq","qUJMdfcwDa","B3qemQssNC","iwzGktl72W","yvOMIBbwgA","SWfouCqqaD","y94nwdjsrv","2DREsaL6AJ","tvdkD2Yz7E",
+"HlUbFRxrsm","KZamHMaJQs","J2mQipv0i7","7hyVvtAOsr","YjB9t0BmCy","0BmCyWaim6","Nxx9V0ao3l","QbxXcnlaBy","zFgtBlCMxy","zQt6QKZamH",
+"0Wr5yi7WMQ","aez9yv8yFN","EdBKca00b5","VIlwP2Nslm","vkCHHIKxdL","mX2GEzFgtB","QssNCyEfy9","FLsphFPfSE","rKDLJYOfrY","5IhmGm4bxU",
+"9GXkXblLA9","fmIK1QssNC","Gv3Fq0Wr5y","CNHmvFNYIM","dQ586xReec","tAOsrHRxd8","dpe1vPb1pa","Chuy3QClRL","Ta8f6L7cGc","yvOMICqqaD",
+"14FLR2Nslm","xciqptaOXK","SbRYysx5Gl","TwanopiJSk","oVQp6k85Ae","5Drn0ru4UG","sqVrfSs0Zu","jS1ajHRxd8","vOqCEgf8rI","3otm6ZUnqt",
+"ZhwG15ZaEz","FLsphi7WMQ","fcJOyyEfy9","s7MxkQWxoT","prNT6mz8gx","7X3uydQ586","ru4UGLewvM","uJScXzqH0W","Pb1paU3yw5","W3VFHlweGy",
+"lweGyQClRL","NAFuwEdBKc","vOqCEsoy9t","ru4UGXflUq","Cp3mZOHaBz","iKqhr0PktI","KZamHCdyBV","SjskQ24ARF","pWiOsMmsIo","ReKEWQYxC0",
+"K4GS8rhl0J","tuDyS8cVD3","JkzUnUvlv4","l83UdIBe8k","D6rBybrhlQ","0MR5XF6PT2","6AFT0CqqaD","uupzkCqqaD","pWiOsZUnqt","2DREst59lR",
+"m4bxUsx5Gl","0Wr5y16lHc","i7WMQ5ZaEz","fLNg87lUXZ","gtCA54dEz6","RxrsmCxVEf","ThjNn5IhmG","lH1ktRpBQm","rhl0JRxrsm","uN6r3gf8rI",
+"0Wr5yuN6r3","EoToP9rlg9","WmadACp3mZ","EdBKccShY2","BGaQYQ6Lix","BGaQYprNT6","45cIHOUYuF","kZANme6e4z","FFDuiU3yw5","3weIFIBe8k",
+"lj07QPb1pa","B3qemuvf7A","uoStw0Kyfs","AOgEeG1RhS","0h1b1cmXIX","yvOMIcShY2","9y4lwix74r","jS1ajhe9IA","Yf2EcBpYhV","iKqhr2TRI7",
+"HfyNQXyPZN","lkMUAdhSuH","D6rByxciqp","gf8rIMkgy8","FLsphokgRi","VLTy6Gv3Fq","jSjS38cVD3","8RCUAUvlv4","7X3uyAIYUu","JkzUnCIShG",
+"AkKTk8RCUA","NhXduBFkb8","gIYvE2ZHdk","LewvMgjUTu","jzUqRv1Hln","YOfrYGWqqX","TCgPp5Mg9r","Yh1hFS77LH","FwEJz9GXkX","64s8NAOgEe",
+"brhlQguMb8","48cHLYjB9t","lkMUATa8f6","JKWYRix74r","ksJbyVIlwP","piJSkpT8wu","5VZjSIBe8k","9GXkXs4786","fLNg8s93Ml","Yw2oUkZANm",
+"VIlwP0MR5X","XflUqFwEJz","azIWpru4UG","M6qcG0PktI","2TRI7IBe8k","OUYuFJ2mQi","U3yw5yvOMI","wiHrZ24ARF","2hEEU5Namm","Mkgy8piJSk",
+"a00b5C2Irc","guMb82hEEU","CK5W7FNYIM","Mm8sisqVrf","9iGoTlj07Q","FwEJzF6PT2","Kr8ysNOHsz","qaofNuJScX","yvOMIMK07Y","t59lRL7cGc",
+"0PktIDLhzM","pT8wu4W0Tl","fcwDao8Uyd","Mkgy8U3yw5","8hJdtxciqp","n8pJ9hYBCK","DQimpK20wK","CNHmvGWqqX","16lHc5Drn0","LewvMHlUbF",
+"KASQ8MmsIo","Waim6fcwDa","07n1c16lHc","tuDySFFDui","nlaBy5ZaEz","i7WMQrz7Ut","jzUqRtvdkD","vLsmSU3yw5","v1HlnsuY4x","WaWsvhSSvQ",
+"580YDgf8rI","b29RJ9eoRc","OxWIHYh1hF","No0QbFLsph","gtCA5xReec","FLsphuAWyp","uoStwvLsmS","tvdkDfcwDa","a00b5HlUbF","iqv4kZ4I1v",
+"yvOMIWaim6","CdyBVuvf7A","taOXKFjHXR","HlUbFtjQxs","lkMUAvLsmS","JJs5m07n1c","suY4xprNT6","lm0pD64s8N","GWqqXZ4I1v","pAhR1lweGy",
+"FNYIMgdQsS","xReeciqv4k","ru4UGn1pmO","5ZaEzMK07Y","2TRI7HfyNQ","Nxx9VlViBv","uZPqglCMxy","7hyVvGrDg7","MojnPru4UG","GSQwj618Di",
+"ZuDtD8RCUA","48cHLfaHir","jfREuSWfou","rz7UtOz8yZ","2TRI7FLsph","pvgjSuZPqg","fFDrJMojnP","8hJdtM6qcG","iB08lG1RhS","t98iWOUqFM",
+"RBhp0ydG8U","IBe8ktl72W","OUYuFJIqXi","2Yz7E2ZHdk","2DREsRACuj","I7p2agtCA5","wiHrZ1j5L8","n1pmOMm8si","BbwgAuLtKs","2NslmhE1Ql",
+"Zv7z0Chuy3","QbxXcXyPZN","ciuWzd85a9","lH1ktxciqp","jS1ajNAFuw","OUqFMhYBCK","Ul4a1BpYhV","2ZHdkxReec","D6rByEOE1o","TXQ0ZWPmlx",
+"DQimpGXdoH","VjCZqtl72W","CNHmv5iGN5","blLA9Uvlv4","AXpwE5Namm","EOE1o580YD","k85AeLewvM","BFkb8wiHrZ","FhtglRACuj","0h1b1HfyNQ",
+"WPmlxxXTI4","rhl0JOxWIH","EdBKcW3VFH","FNYIMhSSvQ","24ARFtjQxs","HP433guMb8","Kr8ysQworu","7Ow5CMojnP","8cVD3XflUq","uoStwa00b5",
+"XflUqdpe1v","ZzJHWv2eC3","uupzkTXQ0Z","xReec29QAz","uAWypTXQ0Z","O3iyQ1LB1L","vOqCERkQke","y94nwl83Ud","t98iWzHF1q","JKWYRWaWsv",
+"qQxHP7Ow5C","AmdQdG1RhS","PYBf4IjTwP","5nmWvhE1Ql","pAhR1NOHsz","Zv7z0Mkgy8","NcICAn8pJ9","5iGN5In3NS","FLsphuLtKs","dpe1vsoy9t",
+"gtCA5lpF6W","MmsIo5Drn0","QClRL3weIF","jS1aj9rlg9","cL0aEyEfy9","AkKTkG1RhS","faHirS2Dfu","Pb1paVprf2","ThjNnNo0Qb","nnP8oFPfSE",
+"5iGN5uvf7A","djsrvnFqik","0PktICIShG","FNYIM8U2nU","CNHmvRACuj","yToGWSs0Zu","7hyVvgf8rI","xXTI4CqqaD","fFDrJ45cIH","W7cTs8TxD7",
+"K20wK8FmFH","RxrsmoVQp6","I7p2aLewvM","8TxD7uTacx","zmLYDBpYhV","iqv4kGWqqX","oQ87ri3pyd","OHaBz1v5hH","45cIHEOE1o","AOgEeIRh48",
+"ZhwG1nFqik","K20wKpiJSk","fqypyZJTXH","JIqXiJ2mQi","5drc6Z4I1v","CNHmvQYxC0","tuDySChuy3","ulk41xXTI4","m4bxUYf2Ec","uTacxL7cGc",
+"Nxx9VFwEJz","SjskQGSQwj","ni2v1yEfy9","F6PT2xReec","5Mg9rGWqqX","LDk6fNOHsz","fLNg8JRJQB","dpe1vVprf2","CNHmv9GXkX","kZANmU3yw5",
+"FPfSEYh1hF","iqv4k29QAz","aL6AJWaim6","0KyfspT8wu","NcICAo8Uyd","oQ87rhE1Ql","ZhwG1SbRYy","m4bxU5ZaEz","atef2YjB9t","VerEAIn3NS",
+"BCxeCd7vjM","i7WMQ3weIF","RkQkeYh1hF","fLNg807n1c","ThjNn5drc6","tuDyS5Namm","F6PT2RACuj","8hJdtlViBv","XflUqBbwgA","SmGzv24ARF",
+"uQIczgdQsS","YOfrYHfyNQ","5VZjSguMb8","e6e4zyluBx","yofH3Y1mC0","uTacxVIlwP","jSjS3LDk6f","0MR5XC2Irc","bZLvSJJs5m","EoToPjS1aj",
+"zY1GYSmGzv","RACujYf2Ec","jfREuMm8si","euZA5Kr8ys","S77LHKr8ys","7Ow5CyvOMI","8RCUAJRJQB","QssNC4W0Tl","dpe1vMK07Y","GWqqXhUTw7",
+"QChxsogLgc","M6qcGogLgc","tjQxs7X3uy","FNYIM8xEKz","Kr8ysoVQp6","QChxs2TRI7","zHF1qSjskQ","1v5hHdhSuH","FVMxo2Nslm","UmaEvuJScX",
+"aDGtSReKEW","FnPFBIn3NS","Dz1R3blLA9","oQ87rtuDyS","OUqFMGrDg7","4QMc9FwEJz","zQt6QQChxs","4dEz6iB08l","Mm8si2DREs","GWqqXix74r",
+"M6qcGcmXIX","uupzk1v5hH","Yh1hFn1pmO","mz8gxCdyBV","YOfrY7lUXZ","YjB9tYOfrY","yofH3Twano","JJs5mKASQ8","iwzGkru4UG","FFDuituDyS",
+"GrDg7gf8rI","qaofNjeskS","4dEz68cVD3","lCMxyy94nw","RpBQmogLgc","taOXKMGlTF","lweGy5Drn0","MaJQsVBjhz","cmXIXFnPFB","3otm6LbRTH",
+"FwEJzpT8wu","VLTy6t98iW","VBjhzs7Mxk","zHF1qv8yFN","1LB1LS2Dfu","0PktIokgRi","SbRYybgJAz","jfREugdQsS","zqH0WpvgjS","FGzgp4QMc9",
+"9iGoTeuZA5","WPmlxVNCPd","XflUqGrDg7","FFDuiFLsph","prNT6GWqqX","J2mQik85Ae","7hyVvtlILt","GSQwjh1zcH","S2DfuqQxHP","RBhp0ix74r",
+"2DREsIRh48","uZPqgG1RhS","5drc61j5L8","Yh1hFpFrrl","RACujuPX7G","W3VFHTXQ0Z","Oz8yZ07n1c","FNYIMkB5nP","16lHcC2Irc","VIlwPJJs5m",
+"dpe1vix74r","ZUnqtjeskS","jS1ajt98iW","jSjS3FNYIM","tvdkDsx5Gl","QWxoTogLgc","n1pmOlkMUA","Ss0ZuVBjhz","SWfouQ6Lix","iKqhr9iGoT",
+"LDk6fhe9IA","Ss0ZuuPX7G","POUYSTwano","yvOMIpvgjS","FjHXRzHF1q","pv0i7zHF1q","RkQkeFnPFB","FjHXR2Nslm","soy9tZ4I1v","B3qema00b5",
+"tlILtRkQke","AOgEeZv7z0","uN6r3IRh48","Uvlv4RkQke","FxX9qVNCPd","29QAzThjNn","s4786blLA9","5Nammv2eC3","XflUq8xEKz","D6rBygtCA5",
+"W3VFH4QMc9","yofH3Q6Lix","cL0aEfmIK1","uupzkX6Pin","oVQp6ni2v1","VNCPdJJs5m","FcWrWokgRi","Z4I1vhYBCK","Dz1R3StlDJ","AXpwEIn3NS",
+"Zv7z0cL0aE","0Wr5yS2Dfu","rhl0JcQOnv","FFDuiOUYuF","DQimp0h1b1","tuDyS5Mg9r","Vprf2Zv7z0","yToGW14FLR","tuDyS14FLR","QChxsvLsmS",
+"29QAzo8Uyd","uN6r3RBhp0","djsrvoGu6x","1LB1LyluBx","Q6LixQ6hMC","RACujCp3mZ","rz7Ut6q6L9","blLA9FPfSE","brhlQs7Mxk","VjCZqAIYUu",
+"QbxXcHfyNQ","M3zXLlCMxy","pT8wuhe9IA","7hyVvVerEA","7hyVvdmoS7","jfREuPOUYS","Cfgr36q6L9","DcpWBUlU3M","U3yw5zmLYD","7X3uylsQGo",
+"MojnPkZANm","m4bxU9rlg9","yToGWokgRi","CxVEfKsjRK","Ta8f67hyVv","3weIFMmKGJ","IjTwPEdBKc","ksJbypiJSk","FVMxozQt6Q","5drc6C2Irc",
+"618Di5drc6","s7Mxk7fsYM","fqypyuJScX","MojnPYw2oU","ogLgc8U2nU","QYxC0FwEJz","pmeCd6AFT0","ru4UGlj07Q","5drc68U2nU","cmXIXVIlwP",
+"e6e4zxXTI4","uAWypguMb8","SjskQNOHsz","pT8wum4bxU","J2mQiThjNn","RsQUqRBhp0","soy9t16lHc","iKqhrIn3NS","pWiOsJIqXi","9GXkXaez9y",
+"ix74r0Kyfs","SmGzvNAFuw","AmdQdUvlv4","prNT67fsYM","Ta8f6J2mQi","FFDuiguMb8","Yh1hF5nmWv","AXpwE7hyVv","8xEKzrhl0J","L7cGcQYxC0",
+"K4GS8FnPFB","cmXIXa00b5","fcJOy2Yz7E","6AFT0cQOnv","iB08lpiJSk","QChxsZuDtD","7fsYMRmDcr","IRh48618Di","uZPqgVNCPd","DG4sTFjHXR",
+"UlU3MguMb8","atef2Pb1pa","azIWpTXQ0Z","2TRI7vLsmS","RzaZAReKEW","Uvlv4euZA5","YjB9tNhXdu","AgJHQzqH0W","RzaZACdyBV","iB08lSjskQ",
+"7lUXZpv0i7","VIlwPS2Dfu","8xEKz07n1c","3otm6suY4x","vkCHHlH1kt","FjHXRTwano","HlUbFsoy9t","5nmWvix74r","uJScXOUYuF","45cIHOHaBz",
+"POUYSEOE1o","Pb1padhSuH","TCgPpOUYuF","Cfgr3wDajX","pv0i7JRJQB","WPmlxQbxXc","7Ow5CCIShG","5iGN58U2nU","pv0i7EoToP","vOqCEkB5nP",
+"fFDrJulk41","RmDcrCfgr3","Qworue6e4z","Twanoaez9y","zmLYDru4UG","aDGtS4QMc9","0YAGH6AFT0","tlILt0ao3l","pAhR1FFDui","0Wr5yuoStw",
+"NAFuw5IhmG","ThjNnlH1kt","s7MxkMGlTF","o8UydGXdoH","EOE1oFxX9q","DG4sTzFgtB","rKDLJd85a9","sqVrfhSSvQ","55rfBOxWIH","Dz1R3D6rBy",
+"zHF1ql83Ud","azIWpwDajX","No0QblsQGo","M3zXLi3pyd","fmIK1CdyBV","b29RJReKEW","1j5L8jzUqR","rKDLJJXljW","ogLgcMGlTF","BpYhVJ2mQi",
+"UlU3MTXQ0Z","IRh482Yz7E","VIlwPWMiS3","pT8wulweGy","8TxD7FwEJz","ReKEWaez9y","45cIHLDk6f","W7cTsfcwDa","4QMc9ThjNn","cL0aEo8Uyd",
+"Pb1paHlUbF","FGzgpSWfou","U3yw5ix74r","uoStwhE1Ql","UlU3MBGaQY","s4786SjskQ","aDGtSi7WMQ","VBjhzGWqqX","POUYSaL6AJ","dhSuHqaofN",
+"Gv3Fq0BmCy","nlaByG1RhS","nFqikSWfou","yofH3CNHmv","CIShGECMvU","FnPFBChuy3","3weIF1v5hH","FLsphMezSW","n8pJ9QssNC","n1pmOTXQ0Z",
+"14FLR14FLR","ZUnqtl83Ud","P6bcgFLsph","IKxdLjfREu","48cHLyluBx","i7WMQ2ZHdk","I7p2aoQ87r","v1HlnK4GS8","WmadAfLNg8","n8pJ94dEz6",
+"t59lR5drc6","OUqFMhE1Ql","Yw2oUG1RhS","0YAGHtvdkD","MmKGJEoToP","uLtKsvkCHH","8xEKzydG8U","ni2v10h1b1","BGaQYZhwG1","JJs5mZUnqt",
+"vLsmS1v5hH","PYBf4JJs5m","zqH0WYh1hF","S2DfupAhR1","CNHmvJXljW","FhtglC2Irc","gdQsSRBhp0","6q6L9dhSuH","fLNg8SmGzv","n8pJ9tjQxs",
+"Mm8sin8pJ9","0ao3lwDajX","CIShGaFFss","PYBf4tl72W","Yw2oUY1mC0","POUYS2Nslm","9rlg9FnPFB","xReecxXTI4","pWiOszFgtB","xciqpiB08l",
+"Oz8yZ4QMc9","RmDcra00b5","fLNg8AmdQd","X6PinEOE1o","D6rByrz7Ut","HlUbFtAOsr","pT8wu618Di","S2DfuZJTXH","gf8rI5VZjS","F6PT2EOE1o",
+"tlILtzQt6Q","Q6hMCOUYuF","Twano64s8N","K20wKPYBf4","2TRI7AIYUu","ix74rS2Dfu","dpe1vL7cGc","pv0i7GrDg7","Cp3mZzQt6Q","ydG8UQYxC0",
+"v1Hln3weIF","AXpwEciuWz","3weIFWDVWJ","t59lRAgJHQ","5iGN5Z4I1v","s4786Pb1pa","piJSkxXTI4","pT8wuciuWz","AgJHQVIlwP","IKxdLjS1aj",
+"vOqCEFhtgl","2NslmhUTw7","lCMxyhE1Ql","K4GS8Kr8ys","16lHcMm8si","uLtKskB5nP","yToGWdpe1v","taOXKiwzGk","VLTy6NAFuw","5IhmGAmdQd",
+"6q6L99eoRc","Pb1paatef2","WPmlxydG8U","StlDJ2Yz7E","iKqhrFhtgl","7X3uyJkzUn","n1pmO7Ow5C","HfyNQx3LDe","ZhwG13otm6","TwanoSmGzv",
+"F6PT2HfyNQ","UlU3MhE1Ql","UlU3MdQ586","FVMxoksJby","Gv3FqEOE1o","DcpWBYOfrY","rhl0J0Kyfs","o8UydIKxdL","ni2v1yvOMI","he9IAlViBv",
+"BFkb89y4lw","FLsphThjNn","7Ow5Cy94nw","bgJAz0Wr5y","CxVEflkMUA","0KyfsydG8U","FPfSEzHF1q","8U2nU8TxD7","tvdkDHlUbF","MmsIo5iGN5",
+"uvf7AC2Irc","XyPZNQ6Lix","rhl0JPYBf4","Chuy30Kyfs","KsjRKP6bcg","i3pyd9GXkX","aL6AJRzaZA","lpF6WyToGW","L7cGcEdBKc","RsQUqQChxs",
+"7Ow5CdQ586","uoStwdpe1v","3otm64dEz6","ciuWztvdkD","Cfgr3d85a9","M3zXLRxrsm","qQxHP8hJdt","IjTwP2Yz7E","MaJQsuZPqg","ECMvUdmoS7",
+"Kr8yszQt6Q","AIYUui3pyd","ZzJHWzmLYD","J2mQilsQGo","Yw2oUgtCA5","7fKYUI7p2a","7lUXZmX2GE","mz8gxRxrsm","vkCHHUl4a1","djsrvlweGy",
+"QWxoTNxx9V","DG4sT5Mg9r","ReKEW07n1c","MojnPAOgEe","jeskSRACuj","oVQp66AFT0","8xEKzzqH0W","FnPFBuPX7G","FxX9qBGaQY","DcpWB0Kyfs",
+"Mm8siyofH3","tAOsr0BmCy","TwanoYjB9t","oQ87rOxWIH","pv0i7xXTI4","jiVBPlsQGo","5nmWvZUnqt","7hyVvReKEW","YOfrYix74r","QChxsP6bcg",
+"v2eC3mz8gx","kZANmcmXIX","n1pmOqaofN","gtCA5VjCZq","aDGtSJ2mQi","n8pJ9uupzk","8TxD7WPmlx","SbRYyRpBQm","vOqCEYh1hF","hSSvQtjQxs",
+"bZLvSQWxoT","WMiS3ogLgc","5drc6RpBQm","8xEKzVerEA","v2eC324ARF","a00b5QClRL","8TxD7JKWYR","lH1ktlkMUA","Nxx9V4QMc9","LbRTHJXljW",
+"HfyNQpmeCd","W3VFHJJs5m","yofH3fLNg8","aez9y2ZHdk","ThjNn7fsYM","zqH0WzbIYY","0h1b1i7WMQ","l83UdFnPFB","DcpWBUmaEv","fcJOyMmKGJ",
+"0h1b1OHaBz","nnP8oyofH3","0PktI8RCUA","xReecjSjS3","ZJTXHHzZT8","Oz8yZyEfy9","suY4xZhwG1","iwzGklsQGo","FFDuiB3qem","RACujQssNC",
+"AIYUuSWfou","8xEKz8hJdt","Z4I1vaez9y","55rfBs4786","Ss0Zupv0i7","K4GS8618Di","C2Ircuupzk","jiVBPcQOnv","uJScX5VZjS","ix74r0h1b1",
+"JIqXigtCA5","d85a9G1RhS","Z4I1v2Yz7E","b29RJC2Irc","7fsYMh1zcH","CK5W7P6bcg","aDGtSdpe1v","QChxsmX2GE","W3VFHgIYvE","fLNg8yluBx",
+"pWiOsWDVWJ","VIlwPGWqqX","Nxx9Vdpe1v","CK5W7HRxd8","ksJbyQChxs","hUTw7blLA9","i3pydlXFOB","NOHszAXpwE","o8UydfcwDa","AkKTkRzaZA",
+"45cIHFVMxo","hSSvQDQimp","lm0pDrhl0J","rz7Utdjsrv","45cIHS77LH","K20wKJIqXi","v2eC3soy9t","0MR5XK20wK","pT8wudhSuH","2Yz7ELDk6f",
+"DQimpcShY2","xXTI4wDajX","D6rBy9iGoT","F6PT2KZamH","0Kyfs7X3uy","07n1cHP433","1j5L8aFFss","M6qcGuAWyp","NOHszOUYuF","AmdQdoVQp6",
+"S2DfumX2GE","KZamH8FmFH","TXQ0ZiwzGk","lj07QblLA9","lj07Q1LB1L","QClRLL7cGc","iB08lVNCPd","aFFssQ6hMC","BGaQYZUnqt","QClRLdmoS7",
+"ZhwG1brhlQ","BbwgAW7cTs","QnJ1StaOXK","uvf7AdhSuH","2hEEUwDajX","HP4333weIF","AXpwEcmXIX","Twanoh1zcH","NcICA9eoRc","VjCZqm4bxU",
+"s93MlJXljW","d85a9xXTI4","Yf2EcoQ87r","euZA5AIYUu","DG4sTs4786","yofH3HzZT8","vOqCEgdQsS","GXdoHgtCA5","8U2nUhSSvQ","VjCZqLewvM",
+"5ZaEzx3LDe","GXdoHMmKGJ","QClRLoVQp6","W7cTszbIYY","9y4lwIjTwP","S2DfuAIYUu","I7p2aatef2","ydG8UDLhzM","hSSvQBbwgA","0KyfsMm8si",
+"AOgEeNcICA","gjUTu4QMc9","Uvlv4S2Dfu","7X3uyMm8si","uPX7GTwano","euZA5MGlTF","ogLgcpvgjS","m4bxUQWxoT","piJSkaez9y","yofH3GXdoH",
+"6AFT07lUXZ","lweGyiB08l","kB5nPD6rBy","9eoRcyofH3","XflUqyEfy9","ZhwG1Yf2Ec","n1pmOnnP8o","FLsphOxWIH","qUJMdCK5W7","MojnPCfgr3",
+"i7WMQ0YAGH","h1zcH0Wr5y","jtn0X8U2nU","LewvMtAOsr","FLsphvOqCE","MmKGJzY1GY","7fsYMs93Ml","lweGytl72W","0PktIqUJMd","UmaEv1j5L8",
+"wiHrZCqqaD","DG4sTNxx9V","VLTy6HfyNQ","rhl0JOUYuF","h1zcHzmLYD","nnP8oRmDcr","DLhzMYf2Ec","ECMvUb29RJ","DQimpS2Dfu","azIWpkZANm",
+"wiHrZi3pyd","QChxshe9IA","v8yFNcShY2","piJSkjtn0X","45cIHWreyP","Uvlv4DLhzM","NhXduSmGzv","DQimpuN6r3","9eoRcPYBf4","tAOsrlH1kt",
+"gjUTuDcpWB","Mkgy8JkzUn","7X3uyuQIcz","2NslmF6PT2","gtCA5jtn0X","Nxx9VCK5W7","5NammHzZT8","ulk41CxVEf","RsQUqnnP8o","uN6r3pvgjS",
+"BpYhVCqqaD","Cfgr3yToGW","VNCPdKr8ys","ZUnqthSSvQ","8FmFHZzJHW","brhlQDQimp","HlUbF14FLR","8RCUAni2v1","hUTw7jtn0X","IjTwPuZPqg",
+"qQxHPzz4ZU","he9IAQssNC","t59lR2DREs","2TRI75IhmG","8hJdt2Nslm","YOfrYBFkb8","X6PinVjCZq","jeskSeuZA5","sqVrfVIlwP","0h1b1U3yw5",
+"VBjhz24ARF","Mkgy8WaWsv","HzZT84W0Tl","pv0i7euZA5","ix74rQworu","AOgEewiHrZ","XyPZNtAOsr","lCMxyn8pJ9","zY1GYCqqaD","FGzgpulk41",
+"WMiS3UmaEv","mX2GEWPmlx","ECMvU580YD","gIYvEcQOnv","pT8wuQnJ1S","yluBxsqVrf","I7p2auupzk","48cHL5Drn0","EoToPAmdQd","7X3uyChuy3",
+"vLsmSksJby","m4bxUjSjS3","Ul4a1iwzGk","guMb807n1c","pmeCdmX2GE","oQ87rEoToP","AgJHQd7vjM","MK07YRpBQm","uLtKsECMvU","VNCPdbgJAz",
+"VNCPdBGaQY","DLhzMCxVEf","B3qemfmIK1","CNHmvtvdkD","7Ow5CbgJAz","HzZT8v2eC3","45cIH0MR5X","GrDg7ru4UG","gdQsSaL6AJ","vOqCEKsjRK",
+"MaJQsuTacx","CNHmv2hEEU","IjTwPvLsmS","NAFuwsqVrf","yEfy9VNCPd","0YAGHQYxC0","nlaBy7hyVv","vkCHHDcpWB","WDVWJjfREu","BpYhVFLsph",
+"14FLR2ZHdk","ECMvUJJs5m","zmLYDO3iyQ","vOqCEydG8U","oVQp6lH1kt","D6rByZJTXH","VIlwPS77LH","9y4lwfFDrJ","XflUq48cHL","5Mg9rtjQxs",
+"CxVEfBGaQY","uN6r3hUTw7","Vprf2Cp3mZ","14FLRYh1hF","ZUnqt7hyVv","s4786n8pJ9","8xEKz7Ow5C","AmdQdzY1GY","6AFT0CdyBV","taOXKoGu6x",
+"HRxd8cmXIX","B3qemv8yFN","zY1GYDG4sT","jfREu4dEz6","hSSvQ8FmFH","VjCZqUl4a1","55rfBfFDrJ","suY4x580YD","pmeCdHfyNQ","jtn0XMK07Y",
+"pv0i7guMb8","pvgjSAkKTk","XyPZNnlaBy","zqH0WfcJOy","ix74r0Wr5y","In3NSM6qcG","b29RJY1mC0","oGu6xaFFss","ECMvUVjCZq","8cVD3cQOnv",
+"48cHLBpYhV","FNYIMuoStw","CK5W7ix74r","v1HlniKqhr","WreyPRzaZA","UmaEvMaJQs","pWiOs1LB1L","xciqpxReec","IRh48FxX9q","C2Irc5Mg9r",
+"fmIK1jzUqR","fFDrJTXQ0Z","yEfy9cQOnv","yEfy9k85Ae","X6PinW7cTs","GWqqXQWxoT","CxVEfDLhzM","FxX9qUlU3M","WreyPWMiS3","jSjS3jiVBP",
+"ZUnqtKr8ys","X6Pin55rfB","gf8rIpT8wu","Nxx9VXyPZN","tlILtdQ586","7fsYMjSjS3","x3LDeDcpWB","ru4UGokgRi","zFgtBkB5nP","1j5L8JXljW",
+"CK5W7hE1Ql","Nxx9Vdjsrv","BpYhVIBe8k","TCgPpjtn0X","xXTI4hSSvQ","hUTw7s93Ml","Ss0ZuMK07Y","Q6hMCgtCA5","AgJHQ5drc6","D6rByP6bcg",
+"jzUqRtl72W","blLA9UlU3M","FhtglCxVEf","jiVBPX6Pin","I7p2ahSSvQ","Waim6OUqFM","h1zcHuAWyp","48cHL8FmFH","Yw2oU7fsYM","ksJbyGWqqX",
+"n8pJ9FcWrW","hi5X7yofH3","aDGtSv2eC3","ThjNnfqypy","aFFssCqqaD","AmdQdYjB9t","LDk6ftvdkD","RpBQmPb1pa","v2eC3VerEA","dpe1v2DREs",
+"aez9yaDGtS","0ao3lmz8gx","VIlwPZuDtD","Y1mC0Cp3mZ","taOXKqUJMd","fmIK1cQOnv","aFFssblLA9","CNHmvxReec","0PktIPYBf4","BCxeCi3pyd",
+"Ul4a1RpBQm","fmIK1x3LDe","aez9y7fsYM","FGzgpK20wK","J2mQi7fKYU","K20wKwiHrZ","ru4UG55rfB","lsQGoQYxC0","aDGtSUlU3M","X6Pinuupzk",
+"Ul4a1l83Ud","zbIYYOUYuF","FnPFBMezSW","y94nwaez9y","L7cGcn8pJ9","n8pJ916lHc","WmadArz7Ut","UmaEvJkzUn","kZANmxReec","ZhwG1oVQp6",
+"Nxx9VfLNg8","ZUnqtFxX9q","i3pydXyPZN","ksJbyD6rBy","ZJTXHhe9IA","VBjhzB3qem","VerEA7lUXZ","3otm6O3iyQ","XflUqs93Ml","nnP8oJKWYR",
+"MK07YJKWYR","jSjS38RCUA","MaJQs7fKYU","C2IrcYw2oU","fLNg88cVD3","hYBCKpWiOs","BFkb8he9IA","tvdkDbrhlQ","lm0pDb29RJ","QChxsSWfou",
+"lm0pDfcwDa","d85a9lViBv","5Drn0okgRi","lH1ktRmDcr","3weIFThjNn","HP433JJs5m","x3LDe2hEEU","Chuy3Fhtgl","OUYuFtlILt","2DREsSmGzv",
+"5IhmGCdyBV","KASQ8mX2GE","5Drn07fsYM","y94nw5nmWv","uTacxprNT6","NcICA4W0Tl","2ZHdk1j5L8","tl72WhUTw7","lsQGowDajX","sx5GltaOXK",
+"rKDLJgIYvE","U3yw51j5L8","XyPZNIKxdL","vOqCEzmLYD","8hJdtn8pJ9","uTacxazIWp","VLTy6CIShG","C2IrclsQGo","xciqpFcWrW","dQ586oQ87r",
+"CIShGlweGy","RsQUqvOqCE","7ku1pMaJQs","VIlwP5iGN5","JJs5mB3qem","uZPqgW7cTs","hSSvQLewvM","EoToPksJby","5Drn016lHc","StlDJmX2GE",
+"tuDySkZANm","BGaQY5Drn0","pAhR1prNT6","9XyT9OxWIH","I7p2ahe9IA","k85AeqUJMd","vkCHH9GXkX","iB08lSWfou","pmeCd5Mg9r","mX2GErhl0J",
+"7fsYMQClRL","7ku1p64s8N","cmXIXW3VFH","YjB9tfcwDa","Gv3Fqe6e4z","hYBCKyToGW","Twano8cVD3","ZuDtDQChxs","lkMUA8cVD3","sqVrfguMb8",
+"Ta8f69y4lw","pvgjS2Yz7E","9rlg9blLA9","atef2LewvM","vkCHHJRJQB","yvOMIGSQwj","cL0aEhi5X7","v1Hln5IhmG","rKDLJ9XyT9","aDGtSzHF1q",
+"Mkgy8In3NS","Twanohi5X7","yEfy9ThjNn","3weIFn8pJ9","hi5X7FnPFB","ulk4114FLR","x3LDeWPmlx","GrDg7xXTI4","9y4lwaDGtS","blLA9Twano",
+"VBjhzv2eC3","lweGyxReec","jSjS3uupzk","8xEKzFnPFB","iqv4klkMUA","KsjRKBFkb8","OxWIHyToGW","bgJAzguMb8","Yf2EcK4GS8","Kr8yszz4ZU",
+"QssNC6q6L9","8hJdtC2Irc","O3iyQzbIYY","dpe1vzqH0W","ZJTXHUlU3M","L7cGclm0pD","l83UdFPfSE","FPfSEDQimp","pv0i73otm6","IKxdLgf8rI",
+"DG4sTIKxdL","MmsIoaFFss","piJSkJkzUn","Uvlv4VNCPd","LewvMCqqaD","nlaBygtCA5","yluBxdQ586","K4GS8Ss0Zu","9rlg9Cfgr3","cQOnv8cVD3",
+"POUYSQssNC","YjB9t2DREs","fcJOytlILt","SbRYyxXTI4","QWxoTKr8ys","16lHcFFDui","qaofNMm8si","EdBKcpv0i7","JJs5mlViBv","lpF6WQChxs",
+"5ZaEzU3yw5","ru4UGP6bcg","B3qemZJTXH","bgJAznnP8o","Fhtglb29RJ","aL6AJi3pyd","RpBQm55rfB","prNT6iB08l","MmsIoO3iyQ","bZLvSuZPqg",
+"y94nwEOE1o","lm0pDNcICA","45cIH7hyVv","yEfy91v5hH","xXTI4VBjhz","5Namm5iGN5","fmIK1ni2v1","lsQGolm0pD","QChxsFjHXR","i7WMQAIYUu",
+"45cIHtAOsr","XflUqIjTwP","Chuy3zqH0W","14FLRrKDLJ","Ul4a1xXTI4","uZPqgsuY4x","CK5W75iGN5","Gv3Fq0ao3l","7X3uy8hJdt","b29RJpvgjS",
+"RkQkefaHir","PYBf4fmIK1","BGaQYCqqaD","okgRiM3zXL","QChxsFnPFB","5NammqaofN","pFrrlCdyBV","5VZjSDz1R3","fqypyTwano","45cIHNxx9V",
+"VerEAoVQp6","aDGtSs4786","hUTw7WPmlx","5VZjSo8Uyd","brhlQVLTy6","JRJQB3otm6","4QMc9AgJHQ","v8yFNUl4a1","AIYUugjUTu","X6PinFhtgl",
+"8cVD3NAFuw","29QAzFPfSE","9XyT9DcpWB","B3qemvkCHH","16lHcsqVrf","s93MltlILt","ix74rSWfou","0BmCyRsQUq","a00b5SjskQ","GSQwjZhwG1",
+"nlaByAXpwE","ix74r29QAz","580YDVLTy6","rKDLJeuZA5","PYBf4M3zXL","yvOMIoVQp6","1LB1LZ4I1v","fcwDaOUqFM","7fKYU55rfB","oQ87r7X3uy",
+"bgJAzQ6Lix","wDajXM6qcG","UlU3MzbIYY","pWiOsuQIcz","vOqCE580YD","OHaBz6AFT0","piJSkW3VFH","Oz8yZDQimp","s4786sqVrf","KASQ8AgJHQ",
+"DcpWBQWxoT","v2eC3FPfSE","2Yz7EwDajX","MaJQsYw2oU","nFqikogLgc","MGlTFfcJOy","kB5nPZzJHW","MmsIofLNg8","vkCHHzbIYY","Pb1paRBhp0",
+"FhtglY1mC0","XflUqQssNC","uJScXvOqCE","pmeCdBCxeC","uQIcz9y4lw","GrDg70ao3l","n1pmOP6bcg","07n1cv1Hln","guMb87fsYM","FPfSE8hJdt",
+"6q6L9uvf7A","t59lRMaJQs","Z4I1vReKEW","OHaBz29QAz","l83UdvOqCE","QChxsgIYvE","X6Pine6e4z","VerEAiKqhr","WPmlxhSSvQ","hi5X7n1pmO",
+"7hyVvB3qem","Mm8si6q6L9","7fKYU8cVD3","d7vjMzHF1q","BpYhVi3pyd","iKqhrECMvU","M6qcGS77LH","8xEKzksJby","cQOnv5drc6","VBjhzblLA9",
+"YjB9t3otm6","Dz1R3MGlTF","POUYS8RCUA","GrDg7uPX7G","s7MxkiwzGk","ZzJHWb29RJ","2TRI7SbRYy","IjTwPt59lR","hSSvQVIlwP","fLNg845cIH",
+"9y4lwBFkb8","nnP8o5ZaEz","0BmCy7lUXZ","CNHmvqQxHP","xXTI42TRI7","FFDuiiB08l","HlUbFuN6r3","VLTy67lUXZ","okgRi2ZHdk","fmIK1jtn0X",
+"Nxx9Vi7WMQ","CNHmv5VZjS","tAOsrpv0i7","OUqFMQChxs","tl72WgjUTu","1v5hHOxWIH","kZANmVBjhz","vOqCE5Drn0","n8pJ9LbRTH","2hEEUpFrrl",
+"I7p2ad7vjM","FPfSEWDVWJ","FLsphkB5nP","Cp3mZo8Uyd","C2IrcYjB9t","9GXkXChuy3","v1HlnjS1aj","soy9ttl72W","djsrvGv3Fq","KASQ8zY1GY",
+"fFDrJ5nmWv","LDk6f64s8N","7hyVvY1mC0","QWxoTIjTwP","ECMvUL7cGc","s4786hi5X7","s7MxkCK5W7","WreyPHfyNQ","8cVD3U3yw5","Q6hMCRBhp0",
+"EOE1ok85Ae","bZLvSCxVEf","B3qemBGaQY","fcwDauLtKs","uTacxBbwgA","vOqCE5VZjS","StlDJrhl0J","FPfSE0h1b1","mX2GEGrDg7","FxX9qt59lR",
+"MezSW7X3uy","v2eC3MojnP","lsQGojS1aj","CdyBVix74r","iKqhrAXpwE","oGu6xOUYuF","L7cGcKr8ys","2ZHdkJXljW","QnJ1SuLtKs","mX2GE45cIH",
+"lweGyyEfy9","M3zXLOxWIH","LDk6fWaWsv","U3yw5Vprf2","5Mg9rAmdQd","WreyPprNT6","FcWrWlm0pD","W3VFHlViBv","prNT6QYxC0","uvf7A5iGN5",
+"9y4lwGSQwj","lpF6WZUnqt","yvOMI55rfB","hi5X7yToGW","VjCZqzz4ZU","LewvMEOE1o","jiVBPSWfou","iqv4kfaHir","UmaEvuPX7G","O3iyQuvf7A",
+"ThjNnl83Ud","B3qemokgRi","iKqhrmX2GE","K4GS8TXQ0Z","sqVrfOUYuF","BFkb8BCxeC","fmIK1KASQ8","8U2nUWMiS3","d7vjMvLsmS","VerEAxciqp",
+"s93Ml9XyT9","pv0i7taOXK","zmLYDcQOnv","KZamH29QAz","qaofNRBhp0","HzZT8fmIK1","AOgEe1j5L8","brhlQ7hyVv","P6bcgIRh48","24ARFe6e4z",
+"0KyfsS2Dfu","5nmWvx3LDe","ciuWzt98iW","aL6AJrz7Ut","xXTI4FwEJz","HRxd8Cp3mZ","29QAzd7vjM","sx5Gl0PktI","0h1b1S2Dfu","7fKYUK20wK",
+"2TRI7ZzJHW","OxWIHHlUbF","mz8gxSjskQ","Yw2oUCNHmv","nnP8o2hEEU","JJs5m5nmWv","9eoRc4QMc9","6q6L9G1RhS","7ku1pWreyP","pFrrlFFDui",
+"pT8wuMK07Y","zqH0WM6qcG","s7MxkiKqhr","EOE1oLDk6f","5Namm4W0Tl","7lUXZFGzgp","Z4I1vMkgy8","HlUbFblLA9","TXQ0ZHRxd8","JKWYRpFrrl",
+"Waim6uTacx","DLhzMCqqaD","nnP8oQYxC0","ECMvUzFgtB","yvOMI2TRI7","1v5hHjiVBP","QWxoT2ZHdk","iB08lqQxHP","J2mQiuvf7A","5drc6Qworu",
+"HRxd88xEKz","euZA5RkQke","WPmlxhi5X7","ru4UGS77LH","MmsIozbIYY","v1HlnB3qem","X6PincL0aE","9GXkXzmLYD","J2mQiPYBf4","cmXIX2DREs",
+"NAFuwpvgjS","jS1ajk85Ae","EdBKcdQ586","RsQUq0BmCy","gf8rI2TRI7","cL0aE64s8N","rKDLJlm0pD","WDVWJokgRi","LDk6fGrDg7","d7vjMtlILt",
+"sqVrfY1mC0","U3yw5gtCA5","7Ow5CWaim6","uJScXQbxXc","580YDL7cGc","iKqhrOxWIH","K20wKuQIcz","tuDySZhwG1","Oz8yZqaofN","zmLYDpT8wu",
+"ZhwG1Fhtgl","BpYhVgdQsS","uvf7AGrDg7","s7MxkEoToP","FxX9qSbRYy","aFFsscmXIX","K20wKIn3NS","Pb1pakB5nP","FPfSEWaWsv","zz4ZUdmoS7",
+"NAFuwy94nw","W7cTsJXljW","Waim6GSQwj","2hEEUVprf2","cQOnvfqypy","jfREuSbRYy","pWiOs9y4lw","NAFuwyluBx","hE1QlcL0aE","I7p2a2Yz7E",
+"0BmCylj07Q","pT8wuuupzk","VNCPdzz4ZU","RBhp0nnP8o","blLA9VIlwP","Cfgr3pv0i7","RxrsmWreyP","9GXkXbZLvS","h1zcHKZamH","jS1aj1j5L8",
+"Gv3FqciuWz","ksJbyokgRi","5Mg9r7hyVv","JkzUnThjNn","VIlwPVBjhz","8RCUAWreyP","lH1ktOUqFM","IRh48DLhzM","d85a9CdyBV","Cfgr3BFkb8",
+"dmoS7ZUnqt","NhXdu580YD","9eoRc8hJdt","CNHmvsx5Gl","WPmlx4W0Tl","Nxx9VBFkb8","K20wKVLTy6","O3iyQ0PktI","G1RhS0BmCy","vOqCEVprf2",
+"5IhmGksJby","GXdoHuQIcz","ZUnqtvkCHH","gtCA5l83Ud","vLsmSsuY4x","QWxoTi3pyd","MojnPMmsIo","AOgEeZhwG1","0Wr5y2Yz7E","suY4xvLsmS",
+"gtCA58xEKz","BpYhV0YAGH","n1pmOcQOnv","guMb8VIlwP","jS1ajI7p2a","fmIK1In3NS","0BmCyVNCPd","VLTy6CdyBV","CNHmvWaim6","8RCUAsqVrf",
+"IBe8kYOfrY","BCxeCbgJAz","t59lRy94nw","Dz1R38U2nU","OUYuFKASQ8","aez9yYOfrY","0YAGHGSQwj","dmoS7uoStw","v2eC35Mg9r","zQt6Qiqv4k",
+"M6qcGReKEW","48cHLC2Irc","n8pJ9sqVrf","e6e4zi3pyd","i3pydRBhp0","ZUnqtgtCA5","ZhwG1YjB9t","Pb1pav8yFN","ulk41djsrv","Nxx9VaFFss",
+"GSQwjJKWYR","OHaBzm4bxU","8hJdtksJby","Yw2oUlXFOB","fcJOyWaim6","JKWYRFVMxo","lpF6WbZLvS","9eoRcoVQp6","Gv3Fqy94nw","9GXkXsoy9t",
+"azIWpZhwG1","Cp3mZGv3Fq","zqH0WpWiOs","BCxeCsuY4x","he9IARACuj","sqVrfK20wK","TXQ0Zpv0i7","dmoS79iGoT","CNHmvJkzUn","uZPqgGWqqX",
+"iqv4kY1mC0","ReKEWNo0Qb","VBjhzKsjRK","JkzUnRxrsm","cmXIXWreyP","NhXdudQ586","djsrvSmGzv","HzZT8ciuWz","9y4lwECMvU","0Wr5yL7cGc",
+"gIYvEzFgtB","b29RJ7hyVv","zY1GYIBe8k","S2DfuLbRTH","s4786nFqik","gjUTuFjHXR","Ul4a1IKxdL","7lUXZo8Uyd","5Drn064s8N","s93MlVLTy6",
+"xXTI4uZPqg","7lUXZiKqhr","VLTy6GWqqX","rhl0JlpF6W","oQ87rFFDui","QWxoTAmdQd","RxrsmfaHir","FLsphksJby","lViBvNAFuw","wDajXFPfSE",
+"yvOMInlaBy","BGaQY2Yz7E","Ul4a1AOgEe","Chuy3lkMUA","5Drn0JRJQB","AXpwElViBv","ulk41gdQsS","Ta8f6BGaQY","W7cTsOxWIH","bgJAzJ2mQi",
+"pWiOsGXdoH","LbRTHkZANm","IjTwPaFFss","7ku1p7lUXZ","FNYIMUl4a1","GSQwjBFkb8","pT8wuoVQp6","Ul4a114FLR","hSSvQdhSuH","o8UydvOqCE",
+"wiHrZgjUTu","nnP8oAOgEe","VLTy6x3LDe","uTacxFcWrW","Q6LixMmsIo","DLhzMIBe8k","8U2nUYh1hF","YOfrYazIWp","uTacxcShY2","ksJbyprNT6",
+"No0Qbh1zcH","FGzgpgdQsS","ydG8UFNYIM","uAWypWaim6","F6PT21j5L8","Zv7z0tl72W","5NammyofH3","lpF6WwDajX","NcICAGXdoH","RpBQmqUJMd",
+"WMiS3SjskQ","FLsphHfyNQ","l83Ud2Yz7E","l83UdIKxdL","l83UdXflUq","CIShGFPfSE","5IhmGrz7Ut","tjQxsdmoS7","xReec8FmFH","CxVEfBbwgA",
+"gIYvElm0pD","suY4xaDGtS","iqv4kM3zXL","t98iWSmGzv","ZUnqtguMb8","CqqaD8FmFH","Ul4a1sqVrf","OUqFMMmKGJ","0PktIs4786","uPX7GDz1R3",
+"jiVBP2hEEU","Yh1hFSmGzv","lViBvCqqaD","fFDrJ2Nslm","OxWIHhE1Ql","he9IAM6qcG","Waim60Kyfs","2NslmGWqqX","v1Hln7fKYU","PYBf4euZA5",
+"RkQke9XyT9","8cVD3ZJTXH","IRh48wiHrZ","2Nslm8hJdt","FwEJzStlDJ","yToGWEoToP","iKqhrhi5X7","tAOsrLDk6f","oGu6xGrDg7","FVMxo7Ow5C",
+"yvOMIRxrsm","IKxdL1LB1L","580YDRpBQm","3weIFVIlwP","D6rBygjUTu","Gv3FqMmsIo","d7vjMW7cTs","C2IrcL7cGc","jSjS3jtn0X","b29RJNcICA",
+"PYBf4uAWyp","580YDv8yFN","fLNg8Ul4a1","48cHLRkQke","dQ586brhlQ","4QMc9Kr8ys","LewvMS77LH","Waim6JIqXi","Cp3mZHRxd8","VIlwPY1mC0",
+"CxVEftlILt","i3pydNhXdu","KZamHi7WMQ","JKWYRVjCZq","GXdoHpmeCd","aez9yQWxoT","U3yw5QWxoT","Uvlv45iGN5","OHaBzmX2GE","CqqaDIn3NS",
+"J2mQiFcWrW","4W0TlYw2oU","vOqCE29QAz","B3qemIRh48","iB08lNAFuw","soy9tQ6Lix","pmeCdhSSvQ","IRh48pv0i7","gjUTuW7cTs","2DREszz4ZU",
+"lm0pDzFgtB","VIlwPKZamH","Waim6jtn0X","nlaByK20wK","YOfrY7ku1p","QbxXcRACuj","HP433iKqhr","djsrvPYBf4","hE1QlblLA9","X6PinWMiS3",
+"taOXK7X3uy","jfREuHfyNQ","9GXkX7Ow5C","HfyNQPOUYS","brhlQm4bxU","SjskQ5ZaEz","azIWpoQ87r","LDk6fiB08l","s7MxkNxx9V","4W0TlReKEW",
+"4W0Tl9rlg9","GrDg77X3uy","Mkgy85Mg9r","CIShGIRh48","NhXdu2TRI7","4dEz6F6PT2","YOfrY3weIF","AIYUuYh1hF","uJScXX6Pin","ZJTXHhUTw7",
+"JKWYRX6Pin","GXdoH48cHL","JIqXiTXQ0Z","blLA9HlUbF","CxVEfChuy3","vOqCEprNT6","qUJMdNhXdu","VLTy6S77LH","l83UduZPqg","lkMUAyluBx",
+"e6e4zP6bcg","zFgtBY1mC0","Vprf2uvf7A","PYBf4MGlTF","K4GS8Twano","2hEEU2Yz7E","atef2JIqXi","MmsIoRzaZA","DQimp7Ow5C","KsjRK45cIH",
+"3weIFX6Pin","SjskQk85Ae","FxX9qVprf2","K20wK2DREs","FGzgpuLtKs","iwzGk6AFT0","POUYSd7vjM","5drc6ZuDtD","2TRI764s8N","NhXduzz4ZU",
+"xReecokgRi","YjB9tJkzUn","NOHsz5ZaEz","DLhzMaFFss","o8UydG1RhS","s93MliKqhr","lCMxyRxrsm","M6qcG24ARF","MmKGJpT8wu","OUYuF5drc6",
+"VLTy66AFT0","FVMxo2DREs","uZPqg2ZHdk","vLsmS64s8N","VIlwPHP433","wiHrZJRJQB","ZhwG1OHaBz","9y4lwWreyP","JJs5mDG4sT","IBe8kMkgy8",
+"HRxd8W7cTs","zz4ZUgIYvE","tjQxsM3zXL","XflUqOxWIH","Oz8yZPYBf4","pFrrlOz8yZ","jfREu9iGoT","lH1ktiKqhr","FhtgltaOXK","zqH0WIBe8k",
+"lweGyoVQp6","ulk41NAFuw","Ta8f6G1RhS","580YDpvgjS","7X3uy0YAGH","NOHszWMiS3","MK07YfaHir","FwEJzUvlv4","Oz8yZRmDcr","WPmlxqaofN",
+"fFDrJHRxd8","bZLvSv2eC3","Cp3mZmX2GE","YjB9tv8yFN","5ZaEz4QMc9","cmXIX0PktI","VIlwPVLTy6","FLsphMm8si","RpBQmdhSuH","CdyBVdpe1v",
+"oGu6x7fsYM","soy9tReKEW","KZamHFLsph","EdBKc7fsYM","xReecZzJHW","ZJTXHTwano","5iGN529QAz","qaofNd85a9","oQ87r3otm6","9XyT916lHc",
+"WaWsvJJs5m","gdQsSqQxHP","HP4339eoRc","45cIHRsQUq","wiHrZksJby","WaWsvfFDrJ","CNHmva00b5","t59lR16lHc","ZJTXHStlDJ","RmDcr7Ow5C",
+"LbRTHzz4ZU","5nmWvs93Ml","bgJAzNAFuw","In3NSMezSW","JXljWEOE1o","GrDg7i7WMQ","Gv3FqCp3mZ","LDk6fb29RJ","aL6AJzqH0W","FGzgpiwzGk",
+"VjCZq9eoRc","faHirKr8ys","i7WMQLDk6f","SbRYydhSuH","gtCA5uQIcz","2Nslmk85Ae","cL0aEulk41","vLsmSsx5Gl","hE1QlxReec","qUJMdpmeCd",
+"zHF1qDG4sT","RpBQmuN6r3","JKWYR24ARF","oQ87ruJScX","8FmFHyofH3","aez9ycmXIX","8cVD3tlILt","QYxC0DG4sT","NhXdua00b5","lsQGoaFFss",
+"5Mg9r0PktI","MmsIoaL6AJ","JXljWUl4a1","2DREsvLsmS","48cHLnFqik","jiVBPZuDtD","jtn0XYf2Ec","zbIYY0PktI","fFDrJRxrsm","vLsmSrz7Ut",
+"v2eC3kZANm","mz8gx7lUXZ","tjQxsNhXdu","JKWYRMmsIo","SWfouzY1GY","ECMvUMezSW","VerEA5Namm","In3NStaOXK","Mm8siMkgy8","Yw2oUuQIcz",
+"6q6L9Cp3mZ","RpBQm618Di","ZhwG1CqqaD","AXpwE2Yz7E","07n1cCK5W7","WaWsvn8pJ9","gtCA5YOfrY","LDk6fdpe1v","Chuy3tuDyS","1j5L88xEKz",
+"ulk41kB5nP","QClRL8RCUA","fFDrJBbwgA","gf8rIn1pmO","Ss0ZuoVQp6","GrDg7rKDLJ","nlaBy6AFT0","4W0TlKr8ys","ReKEWYOfrY","prNT6nlaBy",
+"CdyBVaDGtS","RmDcrVLTy6","soy9tVLTy6","0h1b19iGoT","ECMvUYw2oU","dQ586Pb1pa","i3pydB3qem","AXpwEzqH0W","Gv3Fq7Ow5C","16lHcP6bcg",
+"ReKEWjS1aj","CqqaDP6bcg","MojnPvLsmS","CxVEfjeskS","5Drn0fqypy","U3yw5UlU3M","CK5W7fqypy","P6bcgzz4ZU","Gv3FqAOgEe","QYxC0rKDLJ",
+"Qworu0ao3l","MGlTFjtn0X","euZA5HlUbF","zmLYD0MR5X","KsjRKFxX9q","UlU3MRpBQm","SWfouI7p2a","suY4xvkCHH","tAOsrzmLYD","soy9tsoy9t",
+"brhlQS77LH","VBjhzlpF6W","ECMvUM3zXL","zmLYDDG4sT","uLtKsVjCZq","gIYvEiqv4k","tAOsrSmGzv","BFkb8fcJOy","k85AeCxVEf","3weIFhUTw7",
+"5Mg9r6q6L9","3otm6W7cTs","ciuWz1j5L8","16lHcRBhp0","NcICAHRxd8","0YAGHi3pyd","sqVrfni2v1","n1pmOBCxeC","LewvMQnJ1S","cQOnvzbIYY",
+"iB08lChuy3","gIYvE2DREs","ulk41ZhwG1","RkQkee6e4z","okgRiG1RhS","tAOsrb29RJ","yofH38hJdt","ksJbyIjTwP","t59lR580YD","lsQGopv0i7",
+"Ta8f67lUXZ","sx5GlogLgc","Cp3mZcmXIX","BFkb8vOqCE","0KyfsVLTy6","9XyT9BpYhV","Mm8si7hyVv","Vprf2HP433","LewvM5Drn0","5NammMmsIo",
+"gf8rIYh1hF","EoToPdhSuH","HzZT8LbRTH","4W0TlOUqFM","CK5W7SjskQ","HP433nlaBy","29QAzjS1aj","LDk6fGXdoH","qUJMdfmIK1","oQ87ry94nw",
+"Vprf2Yh1hF","SmGzvDG4sT","pT8wufFDrJ","ZhwG1dhSuH","ogLgc5IhmG","l83UdVjCZq","IBe8kqaofN","pFrrl2TRI7","azIWp9XyT9","wiHrZcmXIX",
+"v8yFNNxx9V","RxrsmdhSuH","QssNCnnP8o","2NslmWaWsv","oVQp6ReKEW","U3yw5zY1GY","oQ87rcQOnv","Ul4a18cVD3","DLhzMlXFOB","StlDJguMb8",
+"5Mg9r2hEEU","9iGoTM3zXL","VjCZqJXljW","7lUXZRzaZA","HRxd8ZzJHW","QChxsRmDcr","faHirxciqp","uN6r3UmaEv","AXpwEGWqqX","soy9tI7p2a",
+"RACujuQIcz","SWfouhe9IA","xXTI4OxWIH","DG4sTWaim6","MaJQsZUnqt","9iGoTs7Mxk","07n1cd85a9","QnJ1S7ku1p","WPmlxJIqXi","B3qemFnPFB",
+"LDk6fs7Mxk","0BmCydpe1v","14FLRQChxs","m4bxUFFDui","zbIYYyofH3","tuDySru4UG","RpBQm0Kyfs","CK5W7jS1aj","0ao3lK20wK","4W0TlFjHXR",
+"DLhzMokgRi","7ku1pzbIYY","lweGy7ku1p","gdQsSNcICA","NOHszfcwDa","0Kyfs5drc6","OHaBzEoToP","uZPqgfFDrJ","OHaBzuAWyp","M3zXLLbRTH",
+"UlU3MNAFuw","pmeCd3otm6","wDajXK4GS8","prNT6zqH0W","gIYvEEdBKc","J2mQiECMvU","S77LHjS1aj","v8yFNPb1pa","rKDLJ3weIF","lj07QRsQUq",
+"SjskQW7cTs","x3LDeix74r","Waim6zqH0W","b29RJ5iGN5","VjCZqB3qem","jS1ajCfgr3","tAOsrZuDtD","0Wr5yOUqFM","zY1GYFjHXR","9eoRcBCxeC",
+"ksJbyMaJQs","ix74rnnP8o","pWiOsCNHmv","0Wr5y8hJdt","Oz8yZcL0aE","a00b5Cp3mZ","SmGzvxciqp","e6e4zzHF1q","e6e4z2ZHdk","sqVrf9y4lw",
+"ulk41v8yFN","RkQkeXflUq","lweGyQChxs","FnPFB0Kyfs","lXFOBOUqFM","S2DfuokgRi","XflUqFhtgl","cL0aEFLsph","xReecprNT6","d7vjMB3qem",
+"yvOMIM6qcG","8RCUAOxWIH","M3zXLQbxXc","2TRI75nmWv","ECMvUi7WMQ","14FLRZ4I1v","dmoS7LDk6f","ZJTXH7fsYM","0YAGHt98iW","UlU3McL0aE",
+"RmDcr6q6L9","prNT6jS1aj","D6rByKr8ys","cL0aEAmdQd","5iGN5xXTI4","pAhR10ao3l","uN6r364s8N","jfREuzY1GY","CqqaDsqVrf","pAhR1IBe8k",
+"JXljWuupzk","RmDcruvf7A","AkKTk24ARF","7Ow5Cjtn0X","Pb1paulk41","aDGtS8TxD7","0BmCyqaofN","faHirnnP8o","FLsphJRJQB","vOqCE1LB1L",
+"KsjRKSWfou","fcJOya00b5","7Ow5C8xEKz","jeskSUvlv4","sx5GlMezSW","YjB9tCNHmv","dpe1vReKEW","2NslmAOgEe","RBhp0xReec","hi5X7OHaBz",
+"kZANmAkKTk","FFDuio8Uyd","AIYUuoVQp6","xReeciwzGk","yofH3EdBKc","8RCUAuJScX","yofH3a00b5","8RCUADcpWB","Uvlv4bgJAz","VLTy6vOqCE",
+"jSjS3kB5nP","FcWrWQnJ1S","faHirBbwgA","1LB1LcL0aE","tAOsrRkQke","wiHrZhUTw7","Nxx9VCxVEf","zFgtBfaHir","hE1QlS77LH","0KyfsTCgPp",
+"GXdoH7fsYM","kZANmWDVWJ","9y4lwMK07Y","7Ow5CkB5nP","OHaBzzQt6Q","ZuDtDfLNg8","OxWIHNcICA","BFkb8Waim6","0YAGHiwzGk","580YDlH1kt",
+"ReKEW14FLR","9eoRc29QAz","WPmlxQ6Lix","atef2kB5nP","nlaByfLNg8","fcwDalj07Q","azIWpB3qem","TXQ0ZZUnqt","IjTwPrKDLJ","KsjRKlpF6W",
+"G1RhSFGzgp","lm0pDZhwG1","OUYuFyvOMI","RkQkel83Ud","Uvlv45Mg9r","JkzUntvdkD","kZANmBFkb8","8cVD3WaWsv","1v5hHsx5Gl","Cp3mZ6AFT0",
+"s47861LB1L","NhXduKr8ys","m4bxU14FLR","UmaEv2DREs","zFgtB0Wr5y","jtn0XM3zXL","i7WMQ7fsYM","dhSuHM3zXL","yluBxMezSW","tjQxsv8yFN",
+"b29RJ0Kyfs","dhSuH2TRI7","IBe8k6q6L9","Pb1paAIYUu","0PktIlCMxy","pWiOsZuDtD","e6e4zY1mC0","QWxoTFGzgp","5NammpiJSk","2Yz7EqUJMd",
+"7hyVvKsjRK","BbwgAjtn0X","OUqFMzFgtB","RxrsmpFrrl","Zv7z0Uvlv4","2NslmRpBQm","VerEAUvlv4","FxX9qokgRi","VjCZqQClRL","QYxC0EoToP",
+"NcICAECMvU","okgRiX6Pin","MojnPzFgtB","OUYuFU3yw5","HlUbFfcJOy","fmIK1fmIK1","yEfy9qaofN","Z4I1vlm0pD","Q6LixfcwDa","QssNCSmGzv",
+"VjCZqix74r","WMiS39rlg9","KASQ8EOE1o","RACujNcICA","XyPZNChuy3","zqH0WgdQsS","MmKGJyofH3","okgRieuZA5","uoStwOUqFM","FjHXRatef2",
+"cL0aEQnJ1S","oVQp6OUYuF","v1Hlnv1Hln","fcwDa29QAz","uQIczqaofN","v2eC3AkKTk","WMiS3EOE1o","JIqXi9iGoT","GWqqXDz1R3","s4786JKWYR",
+"cmXIXpAhR1","BpYhV07n1c","m4bxUBCxeC","45cIHyvOMI","piJSkuAWyp","HRxd8rhl0J","5VZjSKr8ys","zqH0WWreyP","yvOMIQClRL","DcpWBQClRL",
+"MK07YxReec","0BmCy9rlg9","wDajXxciqp","uN6r3nFqik","qaofNFnPFB","jiVBPHfyNQ","4W0Tl9iGoT","P6bcg8TxD7","ECMvUNOHsz","lXFOBsuY4x",
+"L7cGc9eoRc","07n1cKsjRK","2DREspFrrl","NAFuwwDajX","16lHc8cVD3","Pb1palCMxy","euZA5djsrv","F6PT2oQ87r","O3iyQOUqFM","IKxdLcQOnv",
+"HRxd8Ss0Zu","atef26q6L9","5iGN5taOXK","fFDrJOUqFM","QbxXcBCxeC","S77LHtAOsr","SWfouF6PT2","JKWYR5VZjS","Ta8f6tjQxs","oGu6x618Di",
+"iB08l6q6L9","ReKEWECMvU","0ao3lcQOnv","AIYUupv0i7","uAWyp9iGoT","b29RJB3qem","wiHrZokgRi","h1zcHIn3NS","bgJAzVNCPd","BbwgAXyPZN",
+"CNHmvMK07Y","uPX7G9y4lw","Gv3Fqn1pmO","lXFOBWPmlx","DLhzMhUTw7","zQt6QPOUYS","JKWYRJXljW","9eoRc07n1c","Pb1paGSQwj","X6PinUlU3M",
+"I7p2a2hEEU","XflUq5drc6","d85a9fqypy","fcwDalViBv","vLsmSStlDJ","lweGygjUTu","dhSuHBGaQY","FNYIMy94nw","6q6L97X3uy","l83UdCNHmv",
+"tuDySuupzk","yluBxFnPFB","gjUTuXyPZN","9eoRclm0pD","0PktIuPX7G","kZANmoGu6x","MmKGJW3VFH","ix74rtaOXK","oGu6xlXFOB","vLsmSVNCPd",
+"dhSuHRzaZA","WaWsvoGu6x","HfyNQjeskS","Yh1hFn8pJ9","PYBf4Zv7z0","2hEEUWaim6","ZhwG1AgJHQ","KsjRKTwano","MGlTFoQ87r","hE1QlJJs5m",
+"MaJQsBpYhV","14FLRprNT6","uvf7AG1RhS","M6qcGRACuj","dmoS7CNHmv","ECMvUoVQp6","L7cGc4W0Tl","DQimpdpe1v","RBhp01j5L8","Vprf2hUTw7",
+"VLTy6pvgjS","5Mg9rVprf2","OUYuF8TxD7","O3iyQuTacx","MojnPzqH0W","uQIczzz4ZU","d7vjM0MR5X","soy9t0YAGH","SjskQ29QAz","KsjRKtjQxs",
+"Nxx9Vrhl0J","okgRioGu6x","ZUnqtuPX7G","oVQp6FPfSE","oGu6xix74r","KsjRKni2v1","TXQ0ZZ4I1v","5drc6sqVrf","0MR5XVLTy6","FPfSElXFOB",
+"MezSWeuZA5","s7Mxk7hyVv","GrDg7SjskQ","CNHmv0BmCy","P6bcg2ZHdk","XflUqpT8wu","Ss0Zu5drc6","wDajXYw2oU","lXFOBDz1R3","ciuWzuZPqg",
+"tlILttjQxs","QworuNo0Qb","v8yFN9eoRc","s47860BmCy","v1Hln6q6L9","0BmCyP6bcg","TwanoMaJQs","RzaZAyToGW","tl72WUlU3M","24ARFbrhlQ",
+"hYBCKSbRYy","Ss0ZuVprf2","mz8gxECMvU","atef2Yh1hF","VLTy6MK07Y","Q6LixFxX9q","JKWYRWPmlx","h1zcHRmDcr","VjCZqsoy9t","FxX9qnlaBy",
+"8hJdtuLtKs","POUYSVBjhz","FcWrWlkMUA","IRh48pFrrl","BpYhVPb1pa","9rlg9GSQwj","TwanoOHaBz","o8UyduQIcz","ciuWzOHaBz","BCxeC4W0Tl",
+"rhl0JY1mC0","RACujlm0pD","o8UydydG8U","AgJHQX6Pin","HzZT80YAGH","CK5W7gf8rI","Yf2EcHzZT8","h1zcHRBhp0","pAhR1nlaBy","mX2GEeuZA5",
+"ksJbyWMiS3","SjskQDcpWB","Yw2oUdQ586","5NammogLgc","W3VFHFGzgp","ru4UGazIWp","KZamH64s8N","8U2nUpT8wu","U3yw5Qworu","0YAGH8cVD3",
+"TCgPpd7vjM","yToGWZJTXH","X6Pin48cHL","HzZT8brhlQ","KsjRKK4GS8","NAFuwxciqp","k85AeQnJ1S","zQt6QeuZA5","In3NS0h1b1","uN6r3JRJQB",
+"FFDuiFVMxo","9y4lwuQIcz","kZANmzHF1q","dpe1vJKWYR","64s8NVLTy6","1j5L8Cfgr3","gIYvEAgJHQ","M6qcG580YD","ix74rVerEA","64s8NUvlv4",
+"7hyVvgdQsS","WDVWJAkKTk","9y4lwhYBCK","VBjhz1LB1L","MezSWblLA9","StlDJZhwG1","x3LDeiKqhr","0MR5XGv3Fq","QClRLGXdoH","FLsph8cVD3",
+"C2IrcP6bcg","NAFuwPb1pa","mX2GEiKqhr","uvf7AGWqqX","SWfouy94nw","LbRTHEdBKc","pmeCdix74r","Waim6pWiOs","FNYIMMGlTF","C2IrcfaHir",
+"0ao3lEOE1o","aL6AJCdyBV","2ZHdkYh1hF","hUTw7CIShG","M3zXLSs0Zu","jS1ajYjB9t","GWqqXVNCPd","Yf2EcFcWrW","0BmCytaOXK","Q6hMCMm8si",
+"RsQUq8TxD7","FLsph9iGoT","BGaQYJRJQB","QssNC5Drn0","k85AeW3VFH","SWfoujS1aj","cQOnvDQimp","pAhR1rz7Ut","zmLYDjtn0X","iB08lazIWp",
+"d85a948cHL","xXTI4VjCZq","8hJdtP6bcg","pT8wuDG4sT","hSSvQ4QMc9","cmXIXQClRL","Vprf2ciuWz","16lHctAOsr","CxVEfTa8f6","yluBxVBjhz",
+"lj07QNOHsz","FcWrWGWqqX","Uvlv4uN6r3","soy9tB3qem","JkzUn5Mg9r","2hEEUcShY2","WPmlxogLgc","WMiS3lm0pD","t59lRhe9IA","ZuDtD4dEz6",
+"IRh48QbxXc","TCgPpCdyBV","Pb1paxXTI4","cShY2BCxeC","lweGyGWqqX","Q6hMC4W0Tl","0ao3ltjQxs","IRh48TXQ0Z","QssNCqQxHP","jtn0XIjTwP",
+"a00b5QssNC","8U2nU4QMc9","NOHszv8yFN","5NammzQt6Q","RmDcry94nw","StlDJCxVEf","uQIczFPfSE","mz8gxNcICA","dpe1vLewvM","FLsphNxx9V",
+"ogLgcZzJHW","dmoS7S77LH","7lUXZyEfy9","uoStwXflUq","J2mQi64s8N","ogLgclweGy","Nxx9VHfyNQ","FxX9qWmadA","okgRiU3yw5","wDajXXflUq",
+"RzaZAZv7z0","Cfgr3mz8gx","aez9yk85Ae","kB5nPAOgEe","hSSvQ9y4lw","iwzGkZ4I1v","4W0Tllm0pD","9rlg9Yh1hF","pT8wuIjTwP","Cfgr3TXQ0Z",
+"6q6L9hi5X7","CK5W7AXpwE","2ZHdk7Ow5C","soy9tYw2oU","D6rByzmLYD","GSQwjuvf7A","MezSWRxrsm","5nmWvd7vjM","IRh48YOfrY","5Mg9rDcpWB",
+"zFgtBdQ586","tuDySMojnP","5VZjSVIlwP","YjB9t1v5hH","GWqqXxciqp","JkzUnDz1R3","xReecVprf2","S77LHjeskS","UlU3MRBhp0","Kr8ysJIqXi",
+"fLNg8sqVrf","bZLvSjSjS3","MK07Yb29RJ","nlaByCp3mZ","FcWrWZuDtD","tl72WYw2oU","SWfoulpF6W","MGlTFC2Irc","0BmCyt59lR","pvgjS4W0Tl",
+"M6qcGy94nw","8hJdt1v5hH","BbwgAyEfy9","0MR5XdQ586","zQt6QtjQxs","IBe8kIBe8k","FFDuiSbRYy","QChxsNOHsz","vLsmSUmaEv","ulk41pmeCd",
+"7Ow5Catef2","tvdkDuTacx","gf8rIChuy3","ulk41ReKEW","tvdkDjzUqR","NOHszYjB9t","hi5X7atef2","nnP8oAIYUu","14FLRChuy3","3weIFNhXdu",
+"QYxC055rfB","FhtglyofH3","sx5GllpF6W","C2IrcIRh48","qaofNWmadA","UlU3MzY1GY","9eoRcIRh48","MmsIo8cVD3","hYBCK7hyVv","M3zXLhYBCK",
+"2DREskB5nP","nnP8oatef2","GSQwjZuDtD","soy9ts93Ml","U3yw5IKxdL","uLtKscmXIX","8xEKzVjCZq","5Drn0Q6hMC","GXdoHKZamH","lj07QChuy3",
+"jiVBPHlUbF","CqqaDMojnP","JkzUnuJScX","29QAzBbwgA","9iGoTb29RJ","ZzJHWK20wK","Z4I1v6q6L9","uAWypPYBf4","xReecBFkb8","iwzGkD6rBy",
+"DQimpmz8gx","ZuDtD8cVD3","iwzGkuZPqg","hYBCKhYBCK","xXTI4DcpWB","n8pJ9gdQsS","FnPFBguMb8","JJs5mhYBCK","fcwDaMm8si","JIqXi2Nslm",
+"Uvlv4IjTwP","QssNCEOE1o","t98iWiwzGk","JXljW29QAz","uN6r3s4786","YOfrYMGlTF","M3zXLksJby","AOgEeQWxoT","W7cTspvgjS","uAWypksJby",
+"HRxd8FLsph","BCxeC580YD","fqypyStlDJ","HlUbF1j5L8","M6qcGtl72W","2DREspT8wu","gIYvEAmdQd","k85Ael83Ud","8U2nUQYxC0","cmXIXTa8f6",
+"zQt6Qzz4ZU","RBhp0Zv7z0","14FLRfLNg8","7fKYUQ6hMC","kZANmCK5W7","DG4sTpT8wu","d85a9faHir","ni2v1pv0i7","he9IAJXljW","W7cTswDajX",
+"IRh4807n1c","aez9yRxrsm","9rlg95Mg9r","bZLvSlkMUA","FNYIMDz1R3","Vprf214FLR","lpF6WyluBx","Z4I1vlViBv","BFkb8U3yw5","jfREuQClRL",
+"jtn0XSjskQ","Uvlv4QbxXc","Uvlv4NOHsz","QbxXc7Ow5C","yvOMIsuY4x","AXpwEtuDyS","zmLYD8RCUA","BFkb8m4bxU","uPX7GuAWyp","FjHXRWPmlx",
+"Uvlv4D6rBy","No0QbCK5W7","NcICAazIWp","RBhp04QMc9","FVMxofcwDa","taOXK6q6L9","l83UdpiJSk","FLsph8xEKz","dQ5867fsYM","Cfgr3P6bcg",
+"KASQ8W3VFH","xXTI4t59lR","cmXIXU3yw5","yEfy9ECMvU","xReecsqVrf","BCxeC64s8N","MGlTF0BmCy","n1pmO1LB1L","HP4339y4lw","SWfouDQimp",
+"lkMUARACuj","RkQkewiHrZ","1v5hHfLNg8","14FLRwiHrZ","pWiOsAXpwE","Ta8f6JJs5m","zQt6Qsoy9t","Kr8ysPb1pa","pWiOsMK07Y","tjQxsQssNC",
+"LbRTHK4GS8","VerEAoGu6x","jfREu5VZjS","OUqFMe6e4z","FGzgpBbwgA","ksJbyksJby","RpBQmSmGzv","HP433ECMvU","i7WMQOUYuF","ZhwG1TXQ0Z",
+"2DREslViBv","JJs5mSjskQ","16lHc7Ow5C","cQOnvJKWYR","SmGzvTwano","EdBKcoVQp6","1LB1Luupzk","FVMxoo8Uyd","ZhwG1ru4UG","MmsIouLtKs",
+"SmGzvatef2","Cp3mZxciqp","DcpWBYjB9t","StlDJzY1GY","lm0pDEdBKc","2Yz7EFLsph","wiHrZPb1pa","0PktI5Mg9r","SbRYyFhtgl","FPfSE1v5hH",
+"ZhwG10h1b1","FGzgpHRxd8","pvgjSh1zcH","QChxsB3qem","rz7UtGXdoH","bZLvSi3pyd","aDGtSni2v1","WreyPFVMxo","iqv4kHRxd8","K4GS8RBhp0",
+"kZANmTwano","qQxHP1LB1L","K4GS8Oz8yZ","JKWYRkB5nP","IjTwPVerEA","lpF6WMK07Y","XflUqS2Dfu","QWxoTWmadA","Kr8ysL7cGc","lsQGoZUnqt",
+"gf8rIRmDcr","RsQUq5IhmG","k85AeWDVWJ","MmKGJcQOnv","DG4sTv1Hln","MGlTFHzZT8","blLA9ECMvU","580YD1j5L8","4W0TlVIlwP","Ss0ZuyEfy9",
+"AXpwEy94nw","tAOsr7fKYU","P6bcgMmsIo","J2mQiIRh48","8TxD7LbRTH","FcWrWzz4ZU","lkMUAsqVrf","RkQkeCK5W7","9iGoT6q6L9","tvdkDChuy3",
+"azIWpHzZT8","aDGtSZhwG1","jfREulXFOB","No0QbJJs5m","VIlwPAXpwE","yEfy9cShY2","Ul4a1TXQ0Z","KZamH7fKYU","8xEKz24ARF","dQ586BbwgA",
+"NOHszuvf7A","cQOnvni2v1","NAFuwDz1R3","5Mg9rksJby","s4786EOE1o","CxVEf0PktI","ZzJHWuTacx","OUYuFvOqCE","SmGzvQYxC0","tuDyS0MR5X",
+"lsQGoRmDcr","OHaBzpmeCd","55rfB2TRI7","yToGWM6qcG","xReecSs0Zu","9y4lw55rfB","DLhzMNxx9V","K4GS8FLsph","jiVBPTCgPp","uJScXtvdkD",
+"wDajXJXljW","nlaByjfREu","AmdQdWMiS3","P6bcgZ4I1v","OxWIHYjB9t","ydG8UMK07Y","BGaQYFxX9q","55rfB0BmCy","soy9tuAWyp","W7cTsxReec",
+"rhl0JzqH0W","48cHLTCgPp","EOE1oOUqFM","wiHrZZv7z0","QYxC0Mm8si","cQOnvQChxs","CIShG6AFT0","FVMxoNhXdu","K20wKx3LDe","uAWypFcWrW",
+"hUTw7NhXdu","zY1GYPOUYS","Y1mC0MaJQs","Kr8ysn8pJ9","IjTwPAmdQd","TXQ0ZuoStw","rz7UtEoToP","2DREsBFkb8","fmIK1zQt6Q","o8UydhE1Ql",
+"VNCPdnnP8o","i7WMQlm0pD","Z4I1vlpF6W","FVMxoMkgy8","pv0i7QbxXc","6q6L9BpYhV","jfREueuZA5","QnJ1S64s8N","16lHcnlaBy","0KyfsEdBKc",
+"8xEKzgf8rI","MmKGJBGaQY","Mm8sitAOsr","KASQ87fsYM","ZuDtD2DREs","Y1mC0PYBf4","4QMc9Oz8yZ","tAOsr8FmFH","Mm8si4QMc9","OxWIH24ARF",
+"PYBf4lH1kt","m4bxU7ku1p","Twano7X3uy","ZzJHWCqqaD","yvOMIhe9IA","gf8rIpAhR1","zY1GYSjskQ","JIqXi7ku1p","lkMUAChuy3","xReecpmeCd",
+"618DiOUYuF","tlILtMkgy8","NOHszW3VFH","ulk418cVD3","e6e4ztuDyS","lXFOBRACuj","FPfSEi3pyd","dhSuHfcwDa","QClRLBGaQY","djsrvjtn0X",
+"i7WMQ0PktI","8hJdtpv0i7","IBe8kqUJMd","lweGyVerEA","5iGN5piJSk","Cp3mZsoy9t","iKqhrVIlwP","07n1c5Mg9r","TXQ0ZK4GS8","Vprf2yToGW",
+"GrDg7CdyBV","Zv7z0FPfSE","IBe8kZhwG1","uvf7ADz1R3","Zv7z0Dz1R3","QnJ1SguMb8","JkzUnpAhR1","KZamHQClRL","Pb1paZJTXH","ru4UG3weIF",
+"Q6LixjSjS3","iKqhrZ4I1v","618Di24ARF","RsQUq0YAGH","SWfougdQsS","CNHmvtAOsr","VNCPdAIYUu","W3VFH5drc6","6q6L9FLsph","RBhp0jSjS3",
+"zmLYD7hyVv","CNHmvvkCHH","rz7UtPYBf4","iB08lSbRYy","Oz8yZuZPqg","lpF6W8FmFH","Q6hMCIBe8k","45cIHlsQGo","FLsph29QAz","2hEEUhYBCK",
+"iKqhr0BmCy","SjskQOUqFM","ix74rBpYhV","k85Aei7WMQ","XyPZNsqVrf","tl72WYOfrY","zY1GYUl4a1","DcpWBMK07Y","WmadAm4bxU","lCMxyv2eC3",
+"TCgPpSbRYy","jeskS8U2nU","k85Aexciqp","tAOsrYOfrY","5ZaEzYf2Ec","uJScXpFrrl","QbxXcK4GS8","Kr8ystjQxs","5iGN5KZamH","hE1QlReKEW",
+"WPmlxyofH3","24ARF8RCUA","tvdkDjS1aj","cQOnv45cIH","5drc6Ta8f6","2Yz7EC2Irc","Z4I1vMmsIo","Kr8ysnlaBy","ReKEWfLNg8","9iGoTJ2mQi",
+"IKxdLFGzgp","S77LHqUJMd","BFkb8KsjRK","WmadAjfREu","GWqqXDG4sT","soy9tCNHmv","DG4sTMkgy8","M3zXLtvdkD","lCMxyDz1R3","Kr8ysyvOMI",
+"cShY2fqypy","M6qcGKsjRK","cShY2Mkgy8","fFDrJKr8ys","8cVD3bgJAz","v1Hln5iGN5","yToGWJJs5m","O3iyQuLtKs","6q6L9d7vjM","oQ87rMezSW",
+"nlaBycmXIX","lweGy0PktI","0MR5XyofH3","JJs5mmX2GE","W7cTsQClRL","FFDuiOUqFM","d7vjMlViBv","W3VFHuvf7A","rKDLJvOqCE","VIlwPMaJQs",
+"aDGtSaL6AJ","blLA90YAGH","KZamHHlUbF","24ARFhYBCK","zz4ZUWaim6","CdyBVFwEJz","MaJQsv2eC3","ogLgcXyPZN","uAWypd85a9","taOXKDz1R3",
+"48cHL7fKYU","tAOsrEOE1o","UlU3Md85a9","oGu6x2ZHdk","Cfgr3ogLgc","VBjhzlkMUA","QYxC0CdyBV","FcWrWOUqFM","jtn0XThjNn","POUYSsuY4x",
+"PYBf4UmaEv","Y1mC0RsQUq","DG4sTiB08l","fcwDaKsjRK","ZzJHW9GXkX","M6qcGKr8ys","uN6r30Kyfs","mz8gx9rlg9","pWiOsTCgPp","5NammIKxdL",
+"zQt6QWPmlx","WaWsvECMvU","hSSvQxReec","Chuy3MGlTF","OxWIHCIShG","1v5hHMmsIo","jSjS3lkMUA","zqH0WuAWyp","jS1ajF6PT2","v1HlnlViBv",
+"5nmWvfaHir","IjTwPoQ87r","lViBvo8Uyd","MmKGJx3LDe","FNYIMZzJHW","rhl0Jrhl0J","x3LDey94nw","lViBvcQOnv","RzaZAFVMxo","Z4I1vt59lR",
+"QClRL1v5hH","BFkb80ao3l","NOHszVerEA","AOgEeBFkb8","W7cTsIn3NS","qQxHPd85a9","jfREuVLTy6","piJSkhE1Ql","vLsmSdhSuH","5nmWvzmLYD",
+"G1RhSyluBx","pFrrl8hJdt","yEfy9zHF1q","FcWrWpmeCd","pFrrl0YAGH","uLtKsbgJAz","PYBf4hE1Ql","7fsYMWMiS3","VIlwP6q6L9","L7cGctaOXK",
+"FjHXRy94nw","MmKGJAmdQd","ZUnqtyofH3","QnJ1S5Namm","QWxoTpWiOs","nlaByLbRTH","b29RJHRxd8","zmLYDi3pyd","m4bxUMm8si","cQOnvpT8wu",
+"dQ586X6Pin","t59lRQ6hMC","VBjhz5ZaEz","EOE1o9y4lw","hi5X7yvOMI","nnP8oGSQwj","8xEKz5drc6","RmDcrtjQxs","Yf2EcWaim6","lpF6WMkgy8",
+"KZamHuN6r3","QworuvOqCE","e6e4zfaHir","ciuWzTa8f6","7fsYMRpBQm","suY4xjfREu","CIShGYjB9t","MGlTFlkMUA","24ARFNo0Qb","y94nwIKxdL",
+"v2eC3ksJby","GSQwjzFgtB","5VZjSuZPqg","8cVD3kB5nP","YOfrYsoy9t","EOE1o4dEz6","VLTy6lViBv","55rfBBpYhV","FwEJzSmGzv","2TRI7y94nw",
+"t59lRM6qcG","hYBCKqaofN","oGu6xfcwDa","suY4xO3iyQ","8RCUALewvM","jS1aj8RCUA","K4GS8K20wK","GrDg7DLhzM","4QMc9GWqqX","AgJHQW3VFH",
+"Waim6BpYhV","hYBCK0MR5X","5VZjSYjB9t","Q6hMCs7Mxk","UmaEv5VZjS","wiHrZsqVrf","KASQ8e6e4z","faHirFnPFB","QChxsulk41","jSjS3CqqaD",
+"lXFOBM6qcG","sqVrf7lUXZ","tl72WcQOnv","1LB1LFGzgp","DQimpFLsph","580YDS77LH","ix74rHP433","WaWsvuLtKs","HzZT8rKDLJ","lXFOB2DREs",
+"cQOnvMojnP","3otm69GXkX","SmGzvhYBCK","SjskQvkCHH","2Yz7EGrDg7","8xEKzZuDtD","Pb1paDcpWB","blLA9k85Ae","FNYIMuvf7A","kB5nPCqqaD",
+"8TxD7iB08l","i7WMQiKqhr","kB5nPcQOnv","Q6hMCFPfSE","QnJ1S6AFT0","b29RJ24ARF","TXQ0ZlkMUA","wiHrZpT8wu","uJScXIBe8k","AkKTkqQxHP",
+"BFkb8fmIK1","EdBKcgtCA5","0ao3lBGaQY","ZJTXHsqVrf","8hJdt9eoRc","U3yw5FcWrW","fmIK1QYxC0","POUYSZJTXH","QClRLJXljW","jeskSoGu6x",
+"okgRiWDVWJ","GrDg7dQ586","IKxdLsuY4x","v1HlnD6rBy","vkCHHJkzUn","tvdkD8hJdt","tvdkDl83Ud","IjTwP3otm6","LDk6fblLA9","tjQxsMmKGJ",
+"vOqCEoVQp6","8RCUAnlaBy","AIYUuQnJ1S","7lUXZFxX9q","2NslmblLA9","s7MxkbrhlQ","uvf7AgtCA5","5NammGWqqX","AmdQdyofH3","uN6r3Twano",
+"tjQxsCK5W7","ni2v1faHir","zz4ZUpWiOs","4W0TlRkQke","9GXkXB3qem","oGu6xMmsIo","0Wr5yaDGtS","O3iyQMojnP","faHirJKWYR","cmXIXv2eC3",
+"tAOsrzHF1q","CK5W7tl72W","WaWsv9GXkX","azIWpQClRL","7fsYMFPfSE","pFrrlt98iW","pmeCdokgRi","uJScXazIWp","guMb89XyT9","pvgjSM6qcG",
+"x3LDeS77LH","uAWyph1zcH","In3NSWMiS3","Q6hMClkMUA","JKWYRn1pmO","5Mg9rYf2Ec","lpF6WD6rBy","07n1cNAFuw","JRJQBydG8U","tl72WWMiS3",
+"yToGWmz8gx","ZUnqtP6bcg","4dEz67X3uy","CNHmvD6rBy","WaWsvEdBKc","StlDJhUTw7","FFDuiFNYIM","MaJQsFVMxo","ZhwG1OxWIH","YjB9t9rlg9",
+"Uvlv42Nslm","O3iyQs7Mxk","Cfgr3dpe1v","LDk6fK4GS8","kB5nPCNHmv","zFgtBRkQke","lweGyuLtKs","yToGW3weIF","fmIK1XyPZN","UlU3MGrDg7",
+"hYBCKVNCPd","i3pydkZANm","9eoRcfaHir","LbRTHvkCHH","HzZT8aDGtS","suY4xMojnP","BCxeC2Nslm","tAOsrjtn0X","S77LHzz4ZU","faHir48cHL",
+"d7vjMIn3NS","0BmCyCIShG","dmoS7vLsmS","DLhzMuJScX","U3yw5blLA9","uupzkl83Ud","0MR5XFcWrW","Cfgr33otm6","lkMUAMezSW","1v5hHWaim6",
+"64s8NprNT6","lm0pD5IhmG","RkQkeAkKTk","0MR5XksJby","iqv4kmz8gx","oVQp63otm6","K20wKxReec","Mkgy8No0Qb","5VZjSWPmlx","48cHLgdQsS",
+"soy9tFLsph","MmKGJPOUYS","9rlg9zFgtB","6AFT0MezSW","9y4lw8RCUA","VerEADcpWB","DcpWBOUqFM","d7vjMzqH0W","YOfrYm4bxU","jzUqRM3zXL",
+"2TRI70Kyfs","gIYvEb29RJ","uJScX8RCUA","7Ow5COz8yZ","CdyBVB3qem","e6e4zKASQ8","ZJTXH8RCUA","RBhp0pv0i7","sx5GlhYBCK","24ARFCqqaD",
+"BpYhVqUJMd","0ao3lW3VFH","EdBKcJKWYR","7X3uyhE1Ql","rz7Ut8hJdt","16lHc9XyT9","64s8NW7cTs","2Yz7EpAhR1","yvOMIFNYIM","iwzGkFcWrW",
+"KsjRKS77LH","hE1Ql8U2nU","Vprf2uAWyp","FGzgpgf8rI","EOE1opvgjS","RmDcrVIlwP","TXQ0ZfaHir","fqypyaL6AJ","t59lRHP433","a00b5FcWrW",
+"SjskQo8Uyd","Zv7z0RkQke","64s8Nlm0pD","ZuDtDgdQsS","2Yz7E9GXkX","Yw2oUiKqhr","UlU3MAIYUu","cShY2tjQxs","0ao3lYw2oU","d85a9ZuDtD",
+"RxrsmAIYUu","MK07YBpYhV","OHaBz8TxD7","qUJMdMm8si","Gv3FqgdQsS","16lHcWaim6","Mkgy8b29RJ","djsrvlXFOB","qUJMddjsrv","yToGWZzJHW",
+"oQ87rksJby","TXQ0Z0BmCy","dQ5860h1b1","Yf2EcjfREu","Yh1hFDLhzM","lXFOBEdBKc","yEfy9Yw2oU","tAOsriwzGk","ZuDtD5VZjS","uJScXZhwG1",
+"Waim6bgJAz","RzaZAaL6AJ","guMb86AFT0","JkzUnyofH3","atef2piJSk","TXQ0ZIKxdL","5IhmGOz8yZ","zbIYYQworu","VjCZqDz1R3","uJScXMK07Y",
+"B3qem4dEz6","5nmWvdhSuH","mX2GEnnP8o","Nxx9VjzUqR","NOHszS2Dfu","hYBCKuN6r3","1v5hHRACuj","FjHXRDz1R3","lm0pD7lUXZ","QYxC0lm0pD",
+"yToGW7fsYM","Pb1paFjHXR","QClRLWaWsv","8RCUANxx9V","8RCUAXflUq","CqqaD7hyVv","s4786m4bxU","FGzgpzz4ZU","Chuy3GXdoH","m4bxUdQ586",
+"d85a9gIYvE","yToGW6q6L9","uJScX5drc6","PYBf4pWiOs","WmadAAmdQd","FhtglLewvM","djsrvlH1kt","QssNCn8pJ9","nFqikECMvU","L7cGcVNCPd",
+"xReec8TxD7","6AFT0euZA5","ECMvUzz4ZU","MojnP0MR5X","taOXK5IhmG","xXTI4pT8wu","AIYUuLbRTH","GXdoHFxX9q","2DREsfLNg8","tuDySyEfy9",
+"ogLgcQYxC0","AgJHQ64s8N","JKWYRoGu6x","soy9to8Uyd","Y1mC0zHF1q","J2mQidjsrv","M6qcGdpe1v","Waim6CxVEf","zz4ZUzY1GY","5IhmGcShY2",
+"G1RhSRkQke","blLA945cIH","jiVBPgf8rI","OUqFMM3zXL","9GXkXni2v1","azIWpOHaBz","FNYIMQnJ1S","Ul4a12DREs","VBjhzzmLYD","Ss0ZuQ6hMC",
+"FhtglSjskQ","OUYuF4QMc9","BbwgApT8wu","ZzJHWsx5Gl","Vprf2fcJOy","Mkgy8MojnP","zz4ZUpAhR1","d7vjMlkMUA","HfyNQiqv4k","StlDJprNT6",
+"iB08lGv3Fq","1j5L8vLsmS","RkQke5drc6","oVQp6MmKGJ","LbRTH1v5hH","yofH3WaWsv","PYBf4aez9y","2Yz7Esoy9t","s7MxkAmdQd","zQt6QtlILt",
+"P6bcguupzk","v2eC3LewvM","7fsYMokgRi","gdQsSzz4ZU","NhXduuAWyp","Ta8f6taOXK","uupzkYf2Ec","JXljWJkzUn","MGlTFprNT6","rz7UtS2Dfu",
+"kZANmRpBQm","EdBKcQChxs","K20wKuPX7G","lCMxyru4UG","MGlTFuvf7A","HP433M6qcG","euZA5SmGzv","No0Qbxciqp","2TRI70ao3l","Mm8siDQimp",
+"SbRYyNcICA","azIWpi3pyd","xXTI45IhmG","WreyPEdBKc","NhXdulj07Q","4dEz6VerEA","KZamHy94nw","WDVWJ5Mg9r","nnP8oeuZA5","8TxD7taOXK",
+"Uvlv4Ul4a1","y94nw8FmFH","I7p2apT8wu","RBhp0MmsIo","uN6r3Cfgr3","QYxC0TCgPp","pv0i79y4lw","Y1mC0uAWyp","jtn0X5iGN5","QYxC0Yh1hF",
+"cL0aEWreyP","3otm6jSjS3","4W0TlIRh48","7hyVv29QAz","zQt6QFFDui","5drc6lXFOB","Oz8yZi3pyd","gf8rIPb1pa","zY1GY5Drn0","8xEKzD6rBy",
+"tlILtLbRTH","5nmWvUlU3M","29QAztvdkD","Dz1R3YOfrY","Ta8f6l83Ud","RxrsmZzJHW","b29RJJIqXi","s93Mlni2v1","0h1b1pAhR1","gf8rIciuWz",
+"pT8wu8hJdt","WmadAa00b5","vLsmSJXljW","2ZHdk5VZjS","QWxoTrhl0J","Cfgr3uZPqg","ni2v12DREs","BGaQYOUqFM","e6e4zsx5Gl","F6PT2jzUqR",
+"MmsIoTwano","jS1ajkB5nP","UmaEvThjNn","iqv4kZhwG1","ni2v1uAWyp","16lHcHzZT8","Ta8f6jiVBP","m4bxUCIShG","2Yz7Ejtn0X","qUJMdStlDJ",
+"iB08l16lHc","KsjRKnFqik","l83UduAWyp","LewvMd85a9","vOqCECfgr3","WDVWJCIShG","Vprf2wDajX","4QMc9yluBx","MK07YzQt6Q","MGlTFqUJMd",
+"SjskQlweGy","DLhzMzz4ZU","FwEJzrz7Ut","iKqhrAIYUu","5Mg9rCdyBV","NhXdub29RJ","FLsph2Nslm","Q6LixFFDui","3weIFe6e4z","lkMUAVIlwP",
+"618DiQworu","OxWIHy94nw","he9IA9XyT9","tvdkDTCgPp","FxX9qa00b5","WreyPK20wK","QChxsxciqp","SjskQVjCZq","6q6L9jtn0X","RBhp0TCgPp",
+"K20wKBpYhV","WDVWJRBhp0","0ao3lcShY2","6q6L9VNCPd","fcwDa3otm6","RsQUqFFDui","soy9tqaofN","RBhp0yofH3","lweGyguMb8","1j5L87ku1p",
+"uoStwLewvM","7fsYMyofH3","wiHrZix74r","FwEJzwiHrZ","JIqXiB3qem","ZUnqtJKWYR","NAFuwa00b5","2ZHdkZzJHW","xReecPOUYS","K20wKyToGW",
+"uZPqgBGaQY","AgJHQ0MR5X","Uvlv47lUXZ","4QMc9i3pyd","MmKGJ618Di","soy9tbgJAz","nnP8oTwano","0YAGHNo0Qb","J2mQiNhXdu","brhlQsx5Gl",
+"ru4UGZ4I1v","9y4lwtaOXK","MK07YD6rBy","azIWpoVQp6","rKDLJWDVWJ","XyPZNGXdoH","5NammLewvM","FGzgpyvOMI","RmDcrrKDLJ","Waim6K20wK",
+"AgJHQJJs5m","4dEz6o8Uyd","iqv4kIKxdL","CqqaDIjTwP","aL6AJAkKTk","KASQ82ZHdk","JKWYRcL0aE","ciuWzb29RJ","AIYUulj07Q","DcpWBzFgtB",
+"MK07YW3VFH","KsjRKIKxdL","POUYSjtn0X","WmadALbRTH","C2IrczQt6Q","qaofNk85Ae","NAFuwoVQp6","mX2GEdmoS7","8hJdtwDajX","4QMc9Fhtgl",
+"ru4UG07n1c","d7vjMx3LDe","ECMvUyEfy9","MmKGJZJTXH","iwzGkDz1R3","580YDhE1Ql","M3zXLhe9IA","tuDySHlUbF","4QMc9v1Hln","atef2tvdkD",
+"fqypyFwEJz","GWqqX9GXkX","uZPqgJIqXi","yvOMId7vjM","xciqpYjB9t","lH1ktMkgy8","i3pydVLTy6","C2IrcUmaEv","tAOsrzQt6Q","FhtglGSQwj",
+"B3qemStlDJ","XyPZNnFqik","4W0TlMmKGJ","Oz8yZhe9IA","DcpWBWreyP","K20wK7ku1p","8RCUAAkKTk","prNT6uN6r3","s7Mxklj07Q","AXpwEDQimp",
+"fmIK1qUJMd","J2mQiFjHXR","B3qemulk41","uPX7GM6qcG","uPX7GprNT6","VIlwP0PktI","5ZaEzWmadA","7fKYUG1RhS","zmLYDlViBv","AkKTkuTacx",
+"tjQxs4QMc9","BGaQYgtCA5","dQ586wDajX","U3yw5FwEJz","StlDJv2eC3","PYBf40Kyfs","mX2GEkZANm","In3NSStlDJ","CIShGlsQGo","qUJMdpFrrl",
+"jSjS3X6Pin","IKxdLLDk6f","8FmFHfcwDa","xciqpkB5nP","qUJMd2hEEU","1j5L8fqypy","uPX7GtuDyS","WPmlxAgJHQ","MezSWn1pmO","5drc6y94nw",
+"t59lRiwzGk","7fsYMFwEJz","8FmFHUvlv4","VerEAazIWp","m4bxUWDVWJ","VerEAFnPFB","P6bcg16lHc","AXpwE3weIF","5Drn0yToGW","Waim6VIlwP",
+"K20wKVerEA","3weIFMGlTF","OHaBzFFDui","JKWYRfcwDa","dQ586yvOMI","MK07Yatef2","bZLvSaDGtS","taOXKYw2oU","WMiS3AIYUu","iwzGkzqH0W",
+"Waim6Q6hMC","AgJHQn1pmO","NhXduuoStw","zY1GYVNCPd","7fKYUC2Irc","C2Irc618Di","Nxx9VuoStw","W7cTsv8yFN","fcwDaZhwG1","ZUnqty94nw",
+"suY4xSmGzv","MaJQsJJs5m","i3pydRpBQm","0MR5XK4GS8","uoStwFnPFB","UlU3MNo0Qb","nlaBy8cVD3","8RCUAjtn0X","StlDJa00b5","Q6LixMmKGJ",
+"TXQ0ZRBhp0","pWiOstuDyS","M6qcGM6qcG","2DREshi5X7","8RCUAPYBf4","WMiS3iB08l","v1HlnMmsIo","uupzkYw2oU","AXpwEJJs5m","uupzklweGy",
+"tl72Wgf8rI","lkMUADcpWB","kZANmIjTwP","ZzJHWogLgc","lH1ktqaofN","2DREs2Nslm","pvgjSOUqFM","yvOMIlViBv","pAhR1BGaQY","aFFssvOqCE",
+"FNYIMqUJMd","0KyfsMaJQs","2ZHdklsQGo","Q6LixGXdoH","yvOMIgjUTu","7Ow5CyofH3","lm0pDgIYvE","HRxd8NcICA","L7cGccQOnv","uoStwcQOnv",
+"soy9tru4UG","i7WMQFcWrW","v2eC3K4GS8","ReKEW2hEEU","GSQwjzHF1q","MaJQs2Yz7E","4dEz6GrDg7","U3yw5Rxrsm","yluBxyToGW","Ul4a15nmWv",
+"uLtKsZUnqt","5nmWvprNT6","gdQsSNo0Qb","FPfSEUvlv4","FGzgpydG8U","ni2v1Q6Lix","9XyT9NhXdu","ZUnqtuAWyp","Yf2EcZUnqt","nFqikatef2",
+"FnPFBZzJHW","DcpWBatef2","Ta8f69XyT9","NAFuwpT8wu","jiVBPLDk6f","RpBQmtvdkD","6q6L99rlg9","8cVD3L7cGc","B3qem6q6L9","Nxx9VzqH0W",
+"uLtKsRxrsm","yluBxb29RJ","48cHLcL0aE","uAWyp5IhmG","jS1aj7hyVv","2ZHdkfFDrJ","XyPZNBFkb8","zz4ZUhE1Ql","BpYhVZJTXH","8RCUAZUnqt",
+"n1pmOru4UG","3weIFRsQUq","s4786QChxs","e6e4zpFrrl","BbwgAlH1kt","yofH3zbIYY","Ss0Zulm0pD","Ss0ZuSs0Zu","WMiS3bgJAz","TCgPpQnJ1S",
+"MGlTFG1RhS","UmaEvcShY2","Dz1R31v5hH","tl72WHlUbF","WreyPAXpwE","FjHXRRmDcr","Mm8silweGy","8hJdtRBhp0","OUYuFvkCHH","d7vjMt59lR",
+"lH1ktMmsIo","0Wr5yWMiS3","StlDJkB5nP","uQIczSmGzv","RkQkeBGaQY","FcWrWD6rBy","MGlTFLbRTH","JJs5mRmDcr","5ZaEzMaJQs","a00b55IhmG",
+"4dEz6JRJQB","DQimpDLhzM","Cfgr3iB08l","jtn0XzqH0W","t98iWHRxd8","Mkgy8qaofN","HzZT8uQIcz","DLhzMix74r","l83UdOz8yZ","IBe8kgjUTu",
+"hi5X7Nxx9V","XflUqCIShG","yvOMINOHsz","iB08lAXpwE","a00b50PktI","0h1b1BFkb8","yToGWF6PT2","5drc6LDk6f","XyPZNjfREu","NhXduUl4a1",
+"MGlTF7X3uy","ydG8UtlILt","7X3uy8TxD7","fLNg8gdQsS","2Nslm9eoRc","uLtKsVNCPd","HzZT8YjB9t","i7WMQ5Namm","x3LDelm0pD","RBhp0n8pJ9",
+"14FLRMK07Y","VjCZqpT8wu","Z4I1vVNCPd","FwEJzlweGy","pWiOsk85Ae","ni2v1blLA9","14FLRGXdoH","8RCUA0MR5X","U3yw5wiHrZ","gdQsSSjskQ",
+"7X3uyCqqaD","oGu6xOHaBz","SjskQaDGtS","fqypyBpYhV","atef2gIYvE","NcICA9rlg9","RpBQmNAFuw","rKDLJ4W0Tl","qQxHPOxWIH","jzUqRnFqik",
+"4dEz6MezSW","8hJdtjzUqR","hUTw7NcICA","UlU3M7Ow5C","B3qem5nmWv","ReKEWaDGtS","Dz1R3MezSW","jS1ajo8Uyd","VjCZqJkzUn","8TxD7i7WMQ",
+"2ZHdkdmoS7","mX2GE48cHL","1LB1LprNT6","iB08lPOUYS","lXFOBXyPZN","24ARFWaim6","0Kyfsi7WMQ","ZuDtDzz4ZU","QYxC0WPmlx","M3zXLyluBx",
+"FwEJz4QMc9","NcICAB3qem","S2DfuQ6hMC","2ZHdktjQxs","k85AeSmGzv","NAFuwtaOXK","16lHco8Uyd","n1pmOW7cTs","jiVBPzHF1q","uTacxtaOXK",
+"Oz8yZC2Irc","mX2GE8U2nU","cQOnvMGlTF","JJs5mMmsIo","VerEAWPmlx","pv0i7In3NS","QworufaHir","ThjNnNxx9V","dhSuHUmaEv","UmaEvJ2mQi",
+"fFDrJ1j5L8","FNYIM07n1c","pAhR1SbRYy","aL6AJFVMxo","Yf2Eca00b5","ZJTXHl83Ud","hSSvQlpF6W","K4GS8WmadA","PYBf4BbwgA","mX2GEfqypy",
+"RsQUqZhwG1","nlaByRmDcr","7fsYM5Drn0","QClRLAkKTk","QbxXc5ZaEz","vkCHHEdBKc","fqypy9eoRc","Q6LixFGzgp","jzUqROUqFM","1j5L8LbRTH",
+"ZuDtD6q6L9","LbRTHUlU3M","KASQ8M3zXL","CNHmvCK5W7","Kr8ysKZamH","ksJbyO3iyQ","WDVWJCNHmv","8hJdtTa8f6","HP433cShY2","aez9y9eoRc",
+"KASQ87fKYU","8hJdthSSvQ","MojnPuPX7G","Mm8siZhwG1","yEfy9VjCZq","8U2nUuTacx","k85AeuZPqg","CNHmvs4786","oGu6xXyPZN","In3NSQYxC0",
+"BbwgAuoStw","8U2nUWreyP","X6Pini7WMQ","wDajXjzUqR","VLTy6s7Mxk","iwzGkvOqCE","ogLgcuJScX","HlUbFKASQ8","LDk6ftl72W","Q6Lix7Ow5C",
+"suY4x4dEz6","uoStw16lHc","SbRYynnP8o","b29RJFhtgl","M6qcGY1mC0","LewvMRsQUq","OUYuFQChxs","HfyNQKASQ8","0h1b1ksJby","azIWpFLsph",
+"UmaEv7fKYU","07n1cSjskQ","NhXduOxWIH","U3yw5BpYhV","5Drn0qaofN","TwanoBFkb8","aL6AJjzUqR","okgRixXTI4","aez9yLDk6f","JJs5mAgJHQ",
+"C2IrcCK5W7","WDVWJKZamH","yofH3faHir","iqv4kMmKGJ","Yw2oUECMvU","ulk41fqypy","DLhzMZUnqt","S77LHFGzgp","QssNC48cHL","IRh48tl72W",
+"HfyNQgIYvE","vLsmSgtCA5","FPfSEvLsmS","pAhR12DREs","QworuReKEW","Q6LixqQxHP","yEfy9vOqCE","qUJMdrz7Ut","ydG8UZUnqt","5nmWvFFDui",
+"FNYIMcmXIX","v8yFNnlaBy","uupzk7fKYU","RACuj9iGoT","LbRTHAOgEe","Pb1paQYxC0","BbwgAatef2","POUYSgf8rI","8FmFHC2Irc","FjHXROUqFM",
+"CNHmvZhwG1","5Namm0Wr5y","55rfBL7cGc","HP4331j5L8","fcwDawiHrZ","BFkb8lXFOB","jzUqRCdyBV","qUJMduAWyp","QssNCpWiOs","n8pJ9xXTI4",
+"QYxC0aDGtS","zFgtBMaJQs","0MR5XRxrsm","DLhzMuLtKs","BbwgAmX2GE","s93MluLtKs","Y1mC0zbIYY","0KyfsJkzUn","euZA5e6e4z","piJSk9rlg9",
+"QChxsVNCPd","MaJQs8FmFH","KZamHNcICA","9rlg9Fhtgl","gjUTusqVrf","pWiOsv2eC3","lpF6W8RCUA","GXdoHuvf7A","k85AeQYxC0","K20wK55rfB",
+"zqH0WuZPqg","4W0TlvLsmS","NAFuwt98iW","U3yw5PYBf4","uJScXrKDLJ","W7cTs9y4lw","0ao3lVBjhz","hi5X7tuDyS","4dEz6TXQ0Z","OUqFMfqypy",
+"zmLYDWPmlx","suY4xlm0pD","wDajXdpe1v","o8UydkZANm","9eoRctaOXK","JJs5mC2Irc","he9IAhe9IA","5drc6blLA9","jSjS3WMiS3","pvgjSWMiS3",
+"blLA9EoToP","CIShGCp3mZ","RsQUqsqVrf","FxX9qYh1hF","8U2nUgtCA5","CK5W70YAGH","VjCZqRBhp0","zY1GY9GXkX","SjskQ7hyVv","hUTw7BFkb8",
+"2Yz7EKASQ8","oQ87rQ6Lix","VBjhzUl4a1","iKqhrY1mC0","cmXIXK20wK","D6rBy2Yz7E","Zv7z0BFkb8","WDVWJbgJAz","YjB9tEOE1o","4dEz6CxVEf",
+"VIlwPCxVEf","gtCA5piJSk","SjskQlViBv","atef2ix74r","Cfgr3aL6AJ","VjCZqX6Pin","580YDcQOnv","cQOnvyofH3","MGlTFlXFOB","s7MxkU3yw5",
+"fcwDaZzJHW","VNCPddmoS7","M3zXLjS1aj","oVQp6Zv7z0","9y4lwUl4a1","djsrvciuWz","CNHmvWreyP","FhtglWreyP","ni2v1cL0aE","EdBKcCfgr3",
+"W3VFHblLA9","guMb8RpBQm","5NammtlILt","AIYUuhYBCK","WreyPpmeCd","1v5hH0Wr5y","B3qemuupzk","oQ87rzY1GY","0ao3lMaJQs","580YDs93Ml",
+"G1RhS0Kyfs","0MR5XEoToP","EoToPStlDJ","wiHrZy94nw","fqypyMojnP","FjHXRuupzk","CdyBVCK5W7","55rfBNxx9V","faHir6AFT0","ydG8U8RCUA",
+"blLA9RpBQm","euZA5Qworu","5drc6yofH3","tuDySCqqaD","taOXKQ6hMC","07n1culk41","AXpwEOz8yZ","7ku1phi5X7","HRxd8RkQke","kZANm5VZjS",
+"P6bcgMmKGJ","kZANmRzaZA","cShY2SWfou","pFrrlECMvU","24ARFFVMxo","1v5hHRsQUq","O3iyQ7fsYM","MmKGJGv3Fq","fFDrJYOfrY","SmGzvuJScX",
+"nFqikFVMxo","TwanoCp3mZ","tAOsr7ku1p","NcICAmX2GE","BbwgAThjNn","Oz8yZjtn0X","Yh1hFvOqCE","taOXKIjTwP","m4bxUvOqCE","FGzgp9GXkX",
+"WDVWJZhwG1","2TRI7rKDLJ","RzaZAhi5X7","EOE1oBCxeC","uZPqgqUJMd","HlUbFCfgr3","GXdoHKASQ8","TCgPpfcwDa","qUJMdQ6hMC","Mm8si9XyT9",
+"lsQGoIKxdL","uQIczFwEJz","TwanopT8wu","9y4lwqQxHP","Gv3FqsqVrf","QbxXcRxrsm","ulk41SWfou","JKWYRFLsph","SmGzvThjNn","taOXKOz8yZ",
+"1j5L85Drn0","iwzGkEOE1o","FcWrWFxX9q","AIYUuQbxXc","dQ586NcICA","y94nwd85a9","n1pmOfmIK1","m4bxUogLgc","Y1mC0RkQke","LDk6fO3iyQ",
+"NcICAv1Hln","In3NSRsQUq","euZA5KASQ8","X6PinC2Irc","JRJQBtaOXK","FwEJzjS1aj","xciqpdhSuH","5Mg9rni2v1","45cIHuTacx","tAOsr9rlg9",
+"i7WMQBpYhV","tuDySzY1GY","F6PT2nnP8o","ogLgcpT8wu","RACujtl72W","SbRYyRkQke","vkCHHyToGW","ydG8UGv3Fq","lH1ktOxWIH","zbIYYv8yFN",
+"lCMxyQClRL","uPX7GgIYvE","lXFOBK20wK","h1zcHfFDrJ","LbRTHpAhR1","XflUq0Wr5y","0KyfsNo0Qb","LDk6fAIYUu","618DigjUTu","CK5W7zY1GY",
+"zz4ZUAgJHQ","qaofNuPX7G","29QAzNhXdu","7ku1puJScX","FFDui5Mg9r","oQ87rqaofN","M3zXLwDajX","uJScXdhSuH","VBjhzChuy3","OUYuFUvlv4",
+"iqv4kyEfy9","5NammlweGy","nFqikJXljW","OUqFM64s8N","MmsIoqaofN","64s8Ne6e4z","IjTwPFLsph","piJSkksJby","0Wr5yD6rBy","No0QbLewvM",
+"SWfouNhXdu","pAhR1wDajX","VerEA618Di","HfyNQQssNC","zY1GYJ2mQi","29QAzhUTw7","9iGoTh1zcH","qUJMddhSuH","Q6hMC07n1c","YOfrYECMvU",
+"K4GS8HzZT8","qQxHPoQ87r","VIlwPYOfrY","iB08lXflUq","jiVBP0BmCy","M3zXLgIYvE","U3yw5OUYuF","P6bcgGXdoH","Ul4a1pT8wu","nlaBys4786",
+"l83UdqQxHP","5VZjSyluBx","gtCA5xXTI4","7Ow5Cmz8gx","JKWYRYjB9t","CIShGix74r","piJSkPb1pa","Nxx9VPOUYS","CxVEfFxX9q","AXpwEbrhlQ",
+"JIqXiuvf7A","B3qem8hJdt","CqqaDeuZA5","iKqhrYf2Ec","ru4UGWDVWJ","8hJdtQnJ1S","AXpwEiqv4k","5ZaEzJXljW","0BmCyzFgtB","jzUqRfcwDa",
+"HfyNQxXTI4","zFgtB5nmWv","zqH0Wrhl0J","StlDJLbRTH","JRJQBHRxd8","TwanoqQxHP","SWfoukB5nP","dmoS7NAFuw","Fhtglix74r","AmdQdVBjhz",
+"iqv4ktl72W","tvdkDulk41","lpF6WfaHir","gf8rIAgJHQ","FnPFBjfREu","v1HlnHP433","U3yw5ksJby","ThjNnMm8si","vkCHHkB5nP","Ta8f6HlUbF",
+"5NammSs0Zu","hSSvQHP433","tlILtAmdQd","M6qcGnnP8o","b29RJuJScX","vkCHH48cHL","aez9yix74r","2ZHdkKr8ys","yofH3Zv7z0","uTacxSjskQ",
+"hYBCKVIlwP","BbwgApWiOs","LbRTHt98iW","07n1c5VZjS","TCgPpYw2oU","pT8wuaez9y","JJs5mIBe8k","Zv7z0soy9t","oGu6xFcWrW","nnP8oyvOMI",
+"29QAzVLTy6","faHircShY2","ZJTXH2Nslm","IRh48suY4x","S77LHjSjS3","Kr8ysZuDtD","gtCA5Yf2Ec","WPmlx4dEz6","ciuWz2hEEU","AmdQdQssNC",
+"4W0TlU3yw5","rKDLJ2DREs","tvdkDpT8wu","he9IAMojnP","lj07Q7X3uy","RsQUqOUYuF","cShY2K20wK","GWqqXtl72W","Zv7z0yToGW","RBhp0IjTwP",
+"djsrvokgRi","FPfSE16lHc","7fsYMF6PT2","gf8rIFNYIM","a00b5sqVrf","B3qemUl4a1","uoStwAgJHQ","jiVBP1LB1L","Z4I1vHfyNQ","tuDySFwEJz",
+"8U2nUFVMxo","ZJTXHfmIK1","oVQp6Twano","jS1aj8cVD3","hUTw7QbxXc","2hEEUsx5Gl","D6rByAOgEe","zQt6Quvf7A","NAFuws4786","lXFOB618Di",
+"5iGN5AOgEe","cQOnvFnPFB","FjHXRjSjS3","VNCPdv1Hln","ogLgc45cIH","8hJdtfcJOy","bgJAzs4786","IjTwPokgRi","qaofNRACuj","QssNCb29RJ",
+"WaWsvlweGy","4W0TlVjCZq","vkCHHoQ87r","JKWYRVerEA","7Ow5CuPX7G","Mm8sitlILt","9iGoTtAOsr","vkCHHFFDui","blLA9F6PT2","MaJQsnFqik",
+"Cp3mZ2Yz7E","Dz1R3FPfSE","WreyP2DREs","KsjRKK20wK","IRh48iKqhr","t98iWGSQwj","4QMc9ni2v1","GSQwjru4UG","qaofNru4UG","vOqCEFFDui",
+"kB5nPni2v1","v1HlnM6qcG","2hEEU1j5L8","SmGzvOUqFM","No0QbW7cTs","SWfouSbRYy","wiHrZnFqik","QWxoTOUqFM","gIYvEMGlTF","Oz8yZnnP8o",
+"FcWrW1LB1L","Kr8ystaOXK","24ARFRxrsm","fqypyhSSvQ","CdyBVSjskQ","0KyfsDLhzM","RzaZAfqypy","FGzgp8hJdt","atef2ZJTXH","lCMxyYw2oU",
+"hE1Ql9y4lw","jiVBPYw2oU","MaJQsCIShG","48cHLFVMxo","0h1b1uQIcz","zFgtBLbRTH","AgJHQMojnP","NhXdu0YAGH","IKxdL5drc6","ReKEWU3yw5",
+"ksJbyCK5W7","aFFssMK07Y","OHaBzpAhR1","lpF6Wm4bxU","uJScXQssNC","OUYuFpFrrl","5ZaEz6AFT0","he9IApmeCd","FhtglqQxHP","l83UdRpBQm",
+"ReKEWHlUbF","StlDJvkCHH","bgJAzy94nw","SWfouM3zXL","oQ87rIRh48","WaWsvIn3NS","lj07Q45cIH","580YD3otm6","8TxD77fKYU","RACujfFDrJ",
+"Y1mC0jiVBP","IBe8k2hEEU","W7cTsMkgy8","MK07Y9rlg9","FhtglIBe8k","cShY20BmCy","7ku1pnlaBy","5ZaEzPYBf4","i7WMQ0BmCy","Ul4a1b29RJ",
+"Uvlv4oGu6x","AXpwE5drc6","uoStwQClRL","y94nw29QAz","7X3uyBGaQY","Gv3FqfcwDa","gdQsSpmeCd","HfyNQ0ao3l","0KyfsDG4sT","uTacxSWfou",
+"aFFssi7WMQ","SWfouuAWyp","FNYIMi7WMQ","ZzJHWNAFuw","LDk6frhl0J","qUJMd7fsYM","FVMxoaL6AJ","wDajXReKEW","DQimpGSQwj","aDGtS45cIH",
+"pmeCdFPfSE","bZLvSuoStw","2DREsSs0Zu","2DREs5iGN5","JRJQBprNT6","9eoRc9y4lw","NcICAtl72W","QssNC1j5L8","lm0pDZJTXH","Yh1hFGXdoH",
+"tvdkDaL6AJ","Y1mC0LewvM","tlILtCqqaD","he9IAt59lR","sqVrfjtn0X","FNYIMfmIK1","Y1mC0d7vjM","M3zXLGWqqX","RsQUqoVQp6","v1HlngIYvE",
+"IjTwPxXTI4","pWiOsFnPFB","lsQGoIRh48","5drc6cmXIX","FwEJzFnPFB","RBhp0RsQUq","4QMc9sqVrf","HRxd8dhSuH","5drc6jtn0X","RkQkex3LDe",
+"pv0i71LB1L","9XyT9Yf2Ec","1v5hHMK07Y","i7WMQRACuj","gf8rIhUTw7","zQt6Q8U2nU","AXpwEYh1hF","GrDg7ZhwG1","5ZaEzi7WMQ","yToGW8xEKz",
+"Dz1R3rKDLJ","xXTI4In3NS","vLsmSNhXdu","HlUbFTXQ0Z","okgRiHP433","fqypylm0pD","5IhmGRkQke","KASQ8OHaBz","JkzUnQChxs","Waim6gIYvE",
+"fFDrJlm0pD","oVQp6wDajX","kB5nPK4GS8","M6qcGzY1GY","Cfgr3lH1kt","JIqXiIBe8k","7ku1pkZANm","ni2v1lH1kt","ZJTXHJ2mQi","Yf2EcGXdoH",
+"VerEAGv3Fq","Mkgy8i7WMQ","5VZjSaDGtS","lViBvJJs5m","NAFuwS2Dfu","m4bxUkZANm","9rlg9jiVBP","RmDcrC2Irc","tl72W0Kyfs","tlILt7fsYM",
+"zqH0WVNCPd","9rlg9VIlwP","zHF1q618Di","W3VFHksJby","Dz1R3FcWrW","lViBv5VZjS","vOqCEyvOMI","G1RhSLbRTH","HlUbFWDVWJ","s4786SbRYy",
+"jtn0XpFrrl","dhSuHv1Hln","0YAGHWreyP","16lHcPOUYS","7Ow5Ca00b5","RsQUqfaHir","Z4I1vZv7z0","kB5nPblLA9","FxX9qs4786","e6e4zcQOnv",
+"IKxdLWPmlx","K4GS8Yh1hF","8hJdtJXljW","W3VFHtvdkD","WMiS3gf8rI","WMiS35IhmG","euZA5CK5W7","OxWIHHfyNQ","8RCUAVprf2","Z4I1vFxX9q",
+"CK5W7fmIK1","YOfrYpT8wu","48cHLjeskS","QssNCoQ87r","B3qemBbwgA","1v5hHqQxHP","DcpWB64s8N","xReecix74r","WMiS3VBjhz","JJs5mzbIYY",
+"pvgjSJIqXi","tlILtlXFOB","zFgtByofH3","Gv3Fqlm0pD","fcJOyRzaZA","lViBvLewvM","guMb8HRxd8","JkzUnlweGy","7lUXZtaOXK","K20wKrhl0J",
+"fcwDaZUnqt","xReecLewvM","FnPFBvOqCE","WMiS37lUXZ","e6e4zm4bxU","y94nwRsQUq","yluBxUl4a1","m4bxUaDGtS","FVMxos4786","uLtKshe9IA",
+"2ZHdks7Mxk","48cHL45cIH","KsjRKU3yw5","GWqqXokgRi","QbxXctuDyS","lj07QU3yw5","9y4lwaL6AJ","MmsIoHP433","gtCA5CdyBV","Q6hMC0ao3l",
+"fcwDaG1RhS","hi5X7JXljW","IjTwPIn3NS","WaWsv2TRI7","JXljWfLNg8","Yw2oUtvdkD","gIYvEnlaBy","uAWyprKDLJ","Kr8ysNo0Qb","cL0aEcShY2",
+"HfyNQB3qem","xXTI4v8yFN","Yf2Ec4dEz6","9y4lwOxWIH","i3pydfcwDa","n1pmO0Wr5y","UmaEvvkCHH","9eoRcLDk6f","45cIHCqqaD","s93MlYf2Ec",
+"IBe8k7fKYU","Fhtgl0Kyfs","ksJbyiwzGk","RmDcrlViBv","M3zXL0Kyfs","5NammO3iyQ","FNYIM5drc6","5VZjSn8pJ9","y94nwDcpWB","PYBf4CqqaD",
+"fcJOyRkQke","bZLvSnnP8o","JKWYRU3yw5","ThjNnvLsmS","uJScXCIShG","1j5L8B3qem","Yf2EccmXIX","JkzUngtCA5","VLTy6FxX9q","HP433v2eC3",
+"2NslmyvOMI","fLNg8FnPFB","4W0TluQIcz","U3yw5uoStw","o8UydyluBx","zbIYYFwEJz","DG4sTHP433","zQt6Q7Ow5C","48cHLuvf7A","kZANm9iGoT",
+"RpBQmaFFss","B3qem9eoRc","uLtKslViBv","oVQp6BpYhV","SWfouCIShG","0Wr5ytl72W","0PktIx3LDe","yofH307n1c","euZA56AFT0","RsQUquupzk",
+"ZJTXHcmXIX","8cVD3pFrrl","LDk6ffmIK1","EdBKcChuy3","JkzUnNo0Qb","AXpwE5IhmG","hE1QlpmeCd","fcwDahE1Ql","tl72WprNT6","Uvlv45VZjS",
+"hUTw7prNT6","tvdkDoVQp6","OUqFMuvf7A","o8UydVprf2","SWfoupT8wu","RkQkeZ4I1v","s4786he9IA","pAhR18cVD3","Twanoix74r","P6bcgNo0Qb",
+"uvf7AFxX9q","uvf7AJIqXi","piJSklViBv","rz7Uts93Ml","TCgPp48cHL","NcICAFnPFB","iwzGkqUJMd","LbRTH9rlg9","7ku1patef2","I7p2azqH0W",
+"o8UydFnPFB","lj07QWaWsv","L7cGcYOfrY","EdBKchYBCK","4W0Tlsx5Gl","7X3uyhi5X7","kB5nPWPmlx","gf8rICqqaD","8hJdt48cHL","M3zXLWmadA",
+"CdyBVPOUYS","CK5W7okgRi","0YAGHbgJAz","sx5GlxXTI4","FcWrWlj07Q","CxVEfJIqXi","WreyPDLhzM","dmoS7dpe1v","taOXKNhXdu","NOHszguMb8",
+"yofH3Ul4a1","NcICAPb1pa","jSjS3uTacx","SmGzvNcICA","TXQ0Z7lUXZ","48cHLCfgr3","ThjNnJKWYR","euZA5rKDLJ","ThjNni7WMQ","dpe1vCqqaD",
+"iKqhrAgJHQ","NcICAlH1kt","14FLRRpBQm","soy9ta00b5","ThjNnzHF1q","oVQp61v5hH","OUqFMvLsmS","dhSuH8RCUA","JJs5mHP433","rz7UtL7cGc",
+"b29RJs7Mxk","uZPqgWaim6","uJScXbZLvS","8TxD7qUJMd","iwzGkuLtKs","7fKYUFhtgl","RsQUq5Drn0","W7cTslkMUA","jfREuyEfy9","CdyBVsoy9t",
+"pv0i7wDajX","Mm8siSbRYy","oVQp6B3qem","hE1QlTwano","t59lRdhSuH","s4786QbxXc","lpF6WGWqqX","v2eC3ni2v1","EoToPi7WMQ","dQ586MojnP",
+"CK5W77lUXZ","Yf2EclViBv","MGlTFUvlv4","7Ow5CP6bcg","fcwDazHF1q","D6rByZ4I1v","yvOMITXQ0Z","CNHmv6AFT0","9iGoTHlUbF","NOHszHfyNQ",
+"EoToPL7cGc","OxWIHQChxs","taOXKni2v1","mz8gxpWiOs","uAWypJKWYR","xReectAOsr","W7cTsZuDtD","48cHLJRJQB","FjHXR2ZHdk","1LB1LfmIK1",
+"2ZHdk0BmCy","QWxoT6AFT0","Yw2oUlkMUA","Uvlv4s7Mxk","nFqikoGu6x","FcWrWSbRYy","jSjS3Vprf2","atef2d85a9","ECMvUFPfSE","IKxdLlXFOB",
+"JKWYRjtn0X","8hJdt2TRI7","oQ87rgf8rI","JkzUnMK07Y","8FmFHQ6Lix","LewvM55rfB","guMb8Chuy3","5Drn0GrDg7","9rlg90YAGH","GrDg714FLR",
+"GSQwj3weIF","n8pJ9580YD","nlaByt98iW","2NslmXyPZN","yToGWlj07Q","NAFuw6AFT0","mX2GEQChxs","xReeclpF6W","suY4xFPfSE","AkKTk5iGN5",
+"Ta8f6AkKTk","jSjS3wiHrZ","8FmFHy94nw","5Drn00ao3l","XflUqMkgy8","TCgPp14FLR","9rlg97Ow5C","5iGN5euZA5","gjUTuFcWrW","S77LH8RCUA",
+"Ul4a1fcJOy","QworuS77LH","yvOMIuJScX","IKxdLNOHsz","Yw2oURpBQm","ZJTXH2hEEU","aL6AJ7ku1p","lH1ktoGu6x","QYxC0M6qcG","fcJOygf8rI",
+"DLhzMlpF6W","D6rBywiHrZ","VerEAReKEW","WreyPv8yFN","45cIHbZLvS","lXFOBjSjS3","PYBf4LbRTH","16lHcVjCZq","WDVWJdpe1v","nnP8oTa8f6",
+"Pb1pa4dEz6","K20wKZJTXH","yvOMIBFkb8","HP433HP433","FFDuigf8rI","FNYIMAIYUu","Zv7z0uvf7A","ECMvUCdyBV","WDVWJMmsIo","NOHszd7vjM",
+"hUTw7fLNg8","W3VFH2DREs","EdBKcbZLvS","5NammCNHmv","9y4lwaFFss","ix74rFNYIM","AgJHQuTacx","8hJdtjtn0X","QssNCMmsIo","HzZT8wiHrZ",
+"LewvMAgJHQ","FVMxo7lUXZ","x3LDepT8wu","AgJHQU3yw5","Yf2EcyvOMI","64s8NJkzUn","7fsYMuZPqg","rKDLJfcJOy","OUYuFDQimp","0ao3lKASQ8",
+"Gv3FqguMb8","2NslmS2Dfu","UlU3MYf2Ec","a00b5vOqCE","okgRiuQIcz","yofH3Fhtgl","M6qcGIn3NS","piJSkyEfy9","X6PinVBjhz","DQimpBFkb8",
+"FjHXRHP433","aL6AJdhSuH","uLtKsP6bcg","HzZT8Oz8yZ","RACujn8pJ9","cShY24W0Tl","0MR5Xd7vjM","KASQ8RACuj","MaJQs7lUXZ","Yf2Ech1zcH",
+"taOXKyofH3","nnP8oSmGzv","2DREs5Namm","UlU3MVprf2","KsjRK7X3uy","ZhwG1GrDg7","ogLgc4dEz6","8FmFHWPmlx","LewvMPYBf4","9GXkX6AFT0",
+"Zv7z0prNT6","tAOsrQClRL","oGu6xJRJQB","QYxC0AmdQd","DG4sTFVMxo","a00b5Rxrsm","8FmFHRmDcr","QbxXc9y4lw","7hyVv580YD","7lUXZQ6hMC",
+"he9IATwano","I7p2aECMvU","HRxd8ZUnqt","Q6hMCBGaQY","TXQ0Zv1Hln","qUJMdMaJQs","1v5hH5drc6","L7cGcuPX7G","pAhR1X6Pin","VIlwPFxX9q",
+"BCxeCt98iW","0PktIzqH0W","S2DfuDQimp","7Ow5C8TxD7","iB08l2hEEU","WDVWJLbRTH","O3iyQOxWIH","In3NSMkgy8","YjB9tAmdQd","IKxdLVNCPd",
+"h1zcH9y4lw","MGlTFaez9y","WaWsvydG8U","nFqikokgRi","zQt6QuQIcz","ulk41vLsmS","FLsphcShY2","OUYuFzqH0W","JRJQBYh1hF","CIShG4dEz6",
+"WmadATCgPp","fqypyNhXdu","SWfou07n1c","zz4ZUhYBCK","0PktIblLA9","CK5W7YOfrY","lXFOBHRxd8","JXljWjtn0X","BCxeCECMvU","oGu6x1j5L8",
+"FGzgpyofH3","bZLvS2ZHdk","i7WMQazIWp","m4bxUVNCPd","SmGzvgtCA5","prNT6y94nw","guMb8uupzk","2ZHdkzHF1q","CqqaD45cIH","Yh1hF0ao3l",
+"kB5nP16lHc","Dz1R3l83Ud","aFFssF6PT2","VjCZqoQ87r","mz8gx6q6L9","4W0Tl5Namm","24ARF7fKYU","e6e4zn1pmO","StlDJmz8gx","9rlg9djsrv",
+"SbRYyZJTXH","7X3uyfqypy","618DiP6bcg","zbIYYkB5nP","Ul4a1In3NS","m4bxUeuZA5","HfyNQNxx9V","uupzkWreyP","pvgjSxReec","oVQp6K20wK",
+"djsrvQWxoT","FjHXRZUnqt","2ZHdknlaBy","In3NSCdyBV","DcpWBe6e4z","hE1Ql8xEKz","ogLgc8TxD7","he9IAsuY4x","9XyT9pvgjS","zmLYD55rfB",
+"29QAzzHF1q","7lUXZuTacx","pv0i7J2mQi","uJScX7ku1p","9GXkXyToGW","t59lRTa8f6","HRxd8n1pmO","7Ow5CpWiOs","NhXduTwano","ZzJHWJJs5m",
+"RkQkeRkQke","rhl0JBCxeC","JXljW618Di","AmdQdJ2mQi","8TxD716lHc","EoToPKr8ys","Ul4a17X3uy","ni2v1ulk41","HlUbFIKxdL","QClRLatef2",
+"bZLvSb29RJ","sqVrfh1zcH","piJSkgdQsS","29QAzC2Irc","FNYIMFwEJz","GXdoHLewvM","KASQ8uTacx","D6rBykB5nP","lweGy64s8N","FwEJzZhwG1",
+"Cfgr3zbIYY","U3yw52hEEU","SjskQpvgjS","mX2GEHP433","2Yz7E5VZjS","ReKEWQChxs","QWxoTfLNg8","lm0pDAmdQd","v8yFNStlDJ","VIlwPgIYvE",
+"Mkgy8pAhR1","gdQsS5ZaEz","bZLvSKr8ys","jSjS3Cfgr3","atef28xEKz","yToGWQChxs","pAhR1NhXdu","bZLvSYh1hF","IRh48rhl0J","FjHXRKASQ8",
+"G1RhS2TRI7","MojnPzQt6Q","hUTw70h1b1","ECMvUECMvU","0MR5XcShY2","FjHXRPOUYS","GSQwjRzaZA","lsQGoNxx9V","GXdoHGWqqX","SWfouFPfSE",
+"QssNCpv0i7","7Ow5C5iGN5","aDGtS0YAGH","NOHszfLNg8","GXdoHP6bcg","RxrsmK4GS8","BGaQYuAWyp","CqqaDrz7Ut","29QAzuZPqg","ni2v1RmDcr",
+"ZzJHWhYBCK","K4GS8zQt6Q","gjUTuuQIcz","bZLvSh1zcH","FGzgpcShY2","I7p2aIRh48","pv0i7CdyBV","1LB1LMm8si","GSQwjnFqik","PYBf40YAGH",
+"lj07QtvdkD","ksJbyCfgr3","ulk417fsYM","uPX7GdQ586","DG4sTW7cTs","29QAzqQxHP","FwEJz55rfB","POUYS0ao3l","LewvMt59lR","WreyP4QMc9",
+"oGu6xzbIYY","45cIHtl72W","RsQUq7hyVv","MezSW8cVD3","qQxHPpmeCd","ru4UGtuDyS","14FLRyluBx","uQIczLbRTH","Nxx9V7ku1p","v8yFNjtn0X",
+"uvf7AUlU3M","MaJQsJ2mQi","jzUqRpmeCd","Ss0ZuFNYIM","FNYIML7cGc","yvOMIoGu6x","AIYUuTa8f6","64s8NjSjS3","uQIczVLTy6","LbRTHZhwG1",
+"t59lROUYuF","euZA5ReKEW","Yw2oUuTacx","Kr8ysWPmlx","SbRYyW3VFH","CxVEf7lUXZ","OUqFMMezSW","tjQxsXflUq","Nxx9VKsjRK","Q6LixCp3mZ",
+"Yh1hFZJTXH","cL0aERACuj","0MR5XVNCPd","zHF1qmX2GE","nnP8o9rlg9","hUTw7lXFOB","64s8Ns7Mxk","S2DfuQ6Lix","5drc6BbwgA","tuDySaL6AJ",
+"FGzgpD6rBy","HP4330BmCy","cQOnvYh1hF","uJScXMmsIo","k85AeJJs5m","oGu6xAkKTk","he9IAjSjS3","W3VFH5Mg9r","t59lRStlDJ","K20wKfmIK1",
+"5Drn0Rxrsm","RsQUqFxX9q","XyPZNW3VFH","lCMxyd85a9","RzaZAlpF6W","kZANmtAOsr","W3VFHOUqFM","16lHcrz7Ut","2Yz7EhUTw7","iwzGkt59lR",
+"9iGoThSSvQ","0ao3lFhtgl","d7vjMKASQ8","24ARFiwzGk","nlaBypiJSk","yvOMI8TxD7","ECMvUFLsph","a00b5IRh48","FVMxo6q6L9","fcJOyIn3NS",
+"WMiS3jtn0X","KASQ8o8Uyd","0Kyfst98iW","Nxx9VAkKTk","cQOnvm4bxU","wDajXOHaBz","fcwDaru4UG","b29RJogLgc","v8yFNogLgc","QnJ1S2TRI7",
+"MezSWtaOXK","nFqikRBhp0","P6bcglpF6W","4dEz6jtn0X","UmaEvqUJMd","djsrvWaim6","RsQUqUl4a1","t59lR9GXkX","uLtKsJ2mQi","Uvlv4lCMxy",
+"cmXIXfqypy","0YAGHlH1kt","iwzGkUlU3M","OHaBzbgJAz","dmoS7I7p2a","ZJTXH5Drn0","JKWYROxWIH","2ZHdkP6bcg","jfREus93Ml","he9IAwDajX",
+"v1HlnksJby","uQIczyToGW","wiHrZs7Mxk","YOfrYpAhR1","b29RJ9iGoT","OHaBz0BmCy","ciuWzfLNg8","dhSuHRmDcr","RxrsmChuy3","QChxsQ6hMC",
+"gtCA5FVMxo","uZPqgpFrrl","cQOnvpFrrl","Ta8f6NOHsz","iKqhrn1pmO","VerEAfmIK1","ZzJHWjeskS","9GXkX9rlg9","0h1b1yofH3","Zv7z014FLR",
+"G1RhSBpYhV","K20wKhYBCK","pT8wuFxX9q","KZamHQworu","KASQ864s8N","HlUbFHP433","rKDLJDG4sT","tlILt45cIH","JKWYRjS1aj","hYBCKYOfrY",
+"9eoRcfcJOy","FcWrWYh1hF","ZUnqtJXljW","qaofNBCxeC","nlaByHzZT8","ru4UGMkgy8","1j5L8MK07Y","In3NSn1pmO","HzZT8fqypy","oVQp6VerEA",
+"NOHszK20wK","nnP8oHlUbF","X6PintuDyS","W7cTsIKxdL","Q6LixxXTI4","nnP8oVjCZq","Pb1pai7WMQ","k85AeoVQp6","5IhmGMGlTF","4QMc9uZPqg",
+"W3VFH9rlg9","ksJbyt59lR","QChxsokgRi","ZJTXHv1Hln","GSQwjK4GS8","iqv4kC2Irc","DQimp64s8N","7X3uyOUqFM","7fsYMtaOXK","Cp3mZzbIYY",
+"JRJQBD6rBy","hE1QlokgRi","l83UdjzUqR","JJs5mZv7z0","dmoS7OUqFM","bZLvSGXdoH","5nmWv5iGN5","0BmCyVBjhz","xReeclH1kt","5Drn0TXQ0Z",
+"nFqikIBe8k","jtn0XSmGzv","uTacx16lHc","HP433kB5nP","FhtglyEfy9","e6e4zSWfou","WreyPnFqik","uupzkdjsrv","qQxHPVLTy6","W3VFH8hJdt",
+"kB5nPZ4I1v","I7p2aGrDg7","jSjS3Cp3mZ","VBjhzBFkb8","ogLgcW7cTs","tvdkDZv7z0","FwEJz580YD","jeskSciuWz","yluBxEoToP","FLsphpWiOs",
+"7Ow5CAmdQd","MmsIojSjS3","QbxXcs4786","uZPqguoStw","FNYIMStlDJ","2DREsyvOMI","prNT6jfREu","QYxC0No0Qb","Cfgr3ZJTXH","pWiOsVNCPd",
+"8hJdtChuy3","bZLvSlH1kt","Fhtglx3LDe","9eoRclsQGo","BFkb8pAhR1","Dz1R35VZjS","2TRI72Nslm","07n1cQChxs","Uvlv4P6bcg","AkKTkjSjS3",
+"ReKEWL7cGc","fmIK1bZLvS","AXpwEgdQsS","uTacxQworu","QChxszQt6Q","aL6AJKsjRK","K20wKWaWsv","rz7UtRxrsm","AgJHQFnPFB","guMb8KsjRK",
+"lkMUAyToGW","AIYUu8FmFH","jSjS3pWiOs","hi5X7SmGzv","GXdoHgjUTu","ogLgcS77LH","Uvlv4djsrv","nFqikXflUq","hi5X7oGu6x","Nxx9Vs4786",
+"aez9yn1pmO","GWqqXrz7Ut","ZhwG1aez9y","BGaQYkZANm","Q6hMCW3VFH","Yh1hFrKDLJ","M3zXLPOUYS","lCMxyOxWIH","0PktIMaJQs","a00b5vkCHH",
+"Oz8yZfqypy","hi5X7FwEJz","gtCA5ECMvU","5VZjS9XyT9","bgJAz5ZaEz","oQ87rMaJQs","yofH3SjskQ","KZamHEoToP","S2Dfufqypy","kZANm2Yz7E",
+"MGlTFgtCA5","0MR5Xdjsrv","4dEz6h1zcH","Kr8ysU3yw5","uZPqg0PktI","S2DfuzqH0W","OUYuFsx5Gl","QChxsRsQUq","7X3uyFNYIM","AXpwEhi5X7",
+"v2eC3b29RJ","DLhzM1v5hH","mX2GEWMiS3","iKqhr29QAz","Yw2oUP6bcg","iB08lMK07Y","hUTw75iGN5","d7vjM6q6L9","NAFuwStlDJ","AXpwE580YD",
+"RACujprNT6","Q6hMCSmGzv","dQ586MmKGJ","24ARFY1mC0","VIlwPLewvM","uN6r3Mkgy8","Cfgr3IBe8k","tjQxspWiOs","NOHszhe9IA","k85Aedjsrv",
+"nlaByxciqp","lj07QuLtKs","xReecatef2","VjCZqKsjRK","Yf2EclH1kt","hi5X7okgRi","AkKTkK20wK","7hyVvMmsIo","0YAGHatef2","POUYSfcwDa",
+"VBjhz64s8N","uPX7GFFDui","Yh1hFQbxXc","hE1QlyvOMI","uTacxBpYhV","CIShGyToGW","D6rByQClRL","2Yz7EcShY2","zHF1qgjUTu","W7cTsJkzUn",
+"16lHcIn3NS","JJs5mdQ586","gdQsSDQimp","BCxeCwDajX","t98iWvkCHH","gIYvEqQxHP","OUqFMguMb8","5iGN5lCMxy","GSQwjPYBf4","WreyPFcWrW",
+"GrDg7pT8wu","jfREuHRxd8","Qworu45cIH","YjB9tatef2","VNCPdBbwgA","s4786MmKGJ","lm0pDi3pyd","rKDLJjzUqR","YOfrYjSjS3","7X3uyTCgPp",
+"5ZaEzuvf7A","5ZaEzFhtgl","Mkgy8DLhzM","cQOnvTwano","POUYSAOgEe","okgRilweGy","LbRTHNxx9V","2TRI7lViBv","BCxeCuTacx","i3pydwiHrZ",
+"7lUXZHRxd8","Q6Lixv2eC3","hi5X72ZHdk","v1HlnC2Irc","prNT6WaWsv","BFkb8v1Hln","JIqXiF6PT2","lm0pDNhXdu","JXljWF6PT2","ThjNnIBe8k",
+"2TRI7Uvlv4","bgJAztjQxs","0Wr5yIn3NS","5ZaEzC2Irc","zbIYYPOUYS","jS1ajWaim6","atef22ZHdk","JJs5mtjQxs","s93Ml7fKYU","MK07Y0MR5X",
+"AOgEegIYvE","hE1QlRACuj","uTacxIKxdL","uJScXSWfou","ksJbyWDVWJ","jfREu9XyT9","FwEJzcmXIX","55rfBokgRi","uQIczNAFuw","TCgPpMaJQs",
+"ru4UGG1RhS","pT8wuzz4ZU","6AFT0pAhR1","8RCUAHlUbF","5VZjSJXljW","PYBf4Dz1R3","jfREuoVQp6","P6bcghSSvQ","QClRLI7p2a","5NammFVMxo",
+"In3NSGSQwj","0PktIt59lR","Yw2oU1v5hH","1v5hHVNCPd","JXljWK20wK","CK5W7Pb1pa","i7WMQgIYvE","EOE1oBGaQY","jeskSVjCZq","uAWypK4GS8",
+"yofH3QnJ1S","29QAz0PktI","rKDLJStlDJ","n1pmOM6qcG","lCMxyFcWrW","aFFss9eoRc","QnJ1SuAWyp","uLtKsdjsrv","7hyVvUmaEv","Y1mC0cQOnv",
+"3otm6xReec","3otm655rfB","HfyNQECMvU","Mm8siX6Pin","jiVBPi7WMQ","xReecfLNg8","IjTwPFFDui","Chuy3zz4ZU","pWiOskB5nP","PYBf45Namm",
+"d7vjMFhtgl","yEfy9QnJ1S","lsQGotjQxs","gtCA5dpe1v","VBjhzyEfy9","9y4lwkB5nP","1v5hHuupzk","7X3uyyToGW","5drc6RmDcr","DG4sTfFDrJ",
+"F6PT2iKqhr","QChxs5ZaEz","EOE1o618Di","AOgEedQ586","FNYIMdhSuH","bgJAz9XyT9","Cfgr3hi5X7","fqypy8RCUA","GrDg7AmdQd","L7cGcVLTy6",
+"BbwgAWaWsv","pmeCdLDk6f","hE1QlGrDg7","M6qcGEoToP","DQimpuupzk","POUYSRACuj","SbRYy55rfB","AXpwEogLgc","VerEAi3pyd","cShY2Ss0Zu",
+"a00b5RsQUq","a00b5piJSk","bgJAzcmXIX","5ZaEze6e4z","s4786L7cGc","5iGN5b29RJ","hi5X79rlg9","qaofNYOfrY","cL0aE07n1c","ix74rjiVBP",
+"NOHsz4QMc9","v1Hln0Wr5y","LbRTHGrDg7","l83UdRBhp0","WMiS32Nslm","AmdQdhYBCK","pWiOspT8wu","7X3uyUl4a1","FVMxov2eC3","2Yz7EEOE1o",
+"ydG8Uru4UG","QWxoTU3yw5","zHF1qix74r","jS1ajogLgc","vOqCESjskQ","pv0i7X6Pin","FPfSE5Namm","vLsmSL7cGc","soy9txciqp","pWiOs5iGN5",
+"FwEJzBpYhV","y94nwtaOXK","fcJOy8xEKz","EdBKc14FLR","5Mg9rRmDcr","FhtglzmLYD","v2eC3s4786","bZLvSmz8gx","wiHrZbrhlQ","JXljWIKxdL",
+"zHF1qzQt6Q","MGlTFW7cTs","EOE1ojzUqR","9iGoTx3LDe","tlILtCp3mZ","FcWrWpWiOs","CNHmvRBhp0","tjQxsFjHXR","Dz1R3IBe8k","VerEAQssNC",
+"nnP8oQ6Lix","CqqaDDQimp","U3yw5uQIcz","sx5Gl5VZjS","LbRTHcShY2","B3qemgjUTu","yluBxYf2Ec","Dz1R35Drn0","b29RJ7Ow5C","yvOMIM3zXL",
+"VBjhzCfgr3","mz8gxBpYhV","KASQ814FLR","FLsph5Namm","HfyNQRsQUq","n1pmONhXdu","QClRL580YD","QworupFrrl","Yf2Ec2DREs","5nmWvaez9y",
+"SbRYyAOgEe","FwEJzNhXdu","fcJOyrKDLJ","MezSWNAFuw","VNCPdWaWsv","iqv4kLDk6f","IRh48GrDg7","Rxrsm3otm6","k85AeRpBQm","K4GS8ZJTXH",
+"BCxeCBbwgA","m4bxUMmKGJ","zQt6QMojnP","8TxD7W3VFH","uoStwhSSvQ","K4GS855rfB","dQ586pT8wu","s93MlJJs5m","AOgEeJKWYR","5Mg9rsx5Gl",
+"s93MlSs0Zu","OxWIHVNCPd","ZuDtDokgRi","ZuDtDmz8gx","0Wr5yVerEA","t59lR0PktI","W7cTsNhXdu","55rfB3otm6","9y4lw7ku1p","FNYIMlm0pD",
+"MmsIoVLTy6","t98iWJKWYR","hi5X7v8yFN","FPfSEWPmlx","Mm8siS77LH","Vprf2MmKGJ","BGaQYK20wK","AmdQdhi5X7","QChxsYf2Ec","GXdoHKr8ys",
+"FjHXRJIqXi","ogLgc5VZjS","ReKEWyluBx","4dEz6ni2v1","bgJAzb29RJ","Yf2EcbZLvS","ogLgcQClRL","RzaZACNHmv","0YAGHZUnqt","WreyPb29RJ",
+"M3zXLd85a9","PYBf45Drn0","BpYhVAXpwE","jfREu1j5L8","pFrrls7Mxk","6AFT0IRh48","LewvM4QMc9","BpYhVEoToP","okgRiGSQwj","JRJQB48cHL",
+"lH1ktFnPFB","iqv4kNOHsz","YjB9tni2v1","NhXduCfgr3","B3qem7hyVv","FjHXRs4786","OxWIHrKDLJ","Cp3mZuQIcz","7lUXZAXpwE","kB5nPIn3NS",
+"s7Mxkxciqp","FNYIMUmaEv","GXdoHlpF6W","JIqXi2Yz7E","ogLgcWPmlx","v2eC3t59lR","RpBQmrz7Ut","ReKEWrz7Ut","BGaQYZzJHW","AkKTkzz4ZU",
+"OHaBzDQimp","1j5L8uPX7G","7X3uyqaofN","2NslmdQ586","xciqpjS1aj","pAhR18xEKz","jiVBPWaWsv","RsQUq2TRI7","cQOnvrhl0J","5VZjS8hJdt",
+"e6e4z8U2nU","FFDuia00b5","O3iyQciuWz","580YDMaJQs","CxVEfzz4ZU","5Drn0HlUbF","uupzkRzaZA","ogLgc9eoRc","ni2v1K4GS8","RzaZAFwEJz",
+"D6rByMmsIo","jiVBP7ku1p","MezSWuZPqg","i7WMQCdyBV","JIqXiCxVEf","v1HlnzbIYY","0ao3l7ku1p","580YDt98iW","DQimpy94nw","K4GS8ZuDtD",
+"XyPZNUmaEv","rhl0JSmGzv","VNCPd8cVD3","ECMvUIRh48","618DioVQp6","O3iyQvLsmS","2Yz7EiB08l","zbIYYsoy9t","pT8wu45cIH","v1HlntaOXK",
+"soy9t2DREs","RpBQmSWfou","soy9tMm8si","jzUqR580YD","lXFOBQnJ1S","zY1GYQWxoT","FLsphfFDrJ","DcpWBQYxC0","BCxeCCIShG","rz7UtFLsph",
+"FLsphAXpwE","RxrsmJXljW","J2mQiTCgPp","9iGoT7fsYM","VIlwPRACuj","8TxD7qQxHP","BpYhVrhl0J","SbRYyK4GS8","JKWYRhe9IA","guMb8atef2",
+"14FLRYw2oU","FLsphReKEW","soy9tlXFOB","LewvMGWqqX","zz4ZUlpF6W","SmGzvdjsrv","ZhwG1aDGtS","zbIYYDz1R3","9GXkXM6qcG","LDk6ft59lR",
+"5VZjSgtCA5","Yf2EcOUqFM","HRxd8fqypy","rhl0JDQimp","uJScX580YD","piJSkFFDui","d85a99eoRc","suY4xLbRTH","RsQUqG1RhS","jS1ajD6rBy",
+"yToGWv8yFN","yEfy9ZUnqt","EoToP4QMc9","lpF6WqUJMd","7fsYM8cVD3","MaJQsHfyNQ","b29RJ7fsYM","rz7UtjiVBP","8TxD77fsYM","VNCPdgtCA5",
+"fFDrJPYBf4","IjTwP2hEEU","16lHcTa8f6","CNHmvJRJQB","QChxsfcJOy","0YAGH5IhmG","KsjRK7hyVv","MGlTFydG8U","bgJAzcShY2","In3NS0PktI",
+"580YDyEfy9","brhlQlweGy","s93MlhE1Ql","ThjNncQOnv","PYBf4QssNC","x3LDeS2Dfu","16lHcoGu6x","No0QbFPfSE","oGu6xSbRYy","d7vjMiKqhr",
+"gtCA54W0Tl","Oz8yZs7Mxk","5drc6dpe1v","GWqqXEdBKc","sx5GlokgRi","64s8NqQxHP","iKqhrJXljW","6AFT0pFrrl","iwzGkqaofN","k85Aex3LDe",
+"ZUnqt7fsYM","MezSWP6bcg","aFFssbgJAz","blLA9ZzJHW","GWqqX7Ow5C","tvdkDBFkb8","wDajXS77LH","d7vjM4QMc9","yofH3B3qem","Vprf2gIYvE",
+"VerEAdQ586","Chuy3l83Ud","FGzgpTwano","F6PT2tl72W","lCMxyKZamH","C2Irc7fKYU","xciqp0h1b1","Uvlv4fqypy","2TRI7VLTy6","gtCA5ZJTXH",
+"xReecv8yFN","zQt6Qt98iW","brhlQVNCPd","MaJQsyluBx","0BmCyzmLYD","JXljWgIYvE","i3pydkB5nP","IjTwPzY1GY","MezSWFwEJz","Z4I1v24ARF",
+"RpBQmhe9IA","CqqaDKr8ys","GWqqX0YAGH","dpe1viB08l","POUYSK20wK","v8yFNVNCPd","S77LHAIYUu","OHaBzjzUqR","jSjS3vOqCE","jeskSgjUTu",
+"ThjNno8Uyd","jzUqR3otm6","07n1c9rlg9","3weIF2Yz7E","vOqCEyToGW","6AFT0NcICA","Nxx9Vt59lR","vOqCEl83Ud","C2Ircxciqp","RpBQmLDk6f",
+"ZhwG1mX2GE","OUqFMix74r","s93Ml8U2nU","QYxC0gIYvE","W7cTs7fsYM","s7Mxkni2v1","GWqqX0BmCy","rKDLJpiJSk","wiHrZkZANm","Uvlv4HlUbF",
+"iKqhrkZANm","Oz8yZHRxd8","CxVEfrz7Ut","MGlTFmz8gx","zHF1qa00b5","JJs5mcmXIX","oVQp6DQimp","EdBKc3weIF","QworuFnPFB","B3qemiKqhr",
+"0MR5XUvlv4","VBjhzxXTI4","8TxD748cHL","Cfgr3GSQwj","55rfBIn3NS","IjTwPhe9IA","ZJTXH5Mg9r","o8UydFVMxo","B3qem618Di","YOfrY2TRI7",
+"PYBf46q6L9","o8UydFxX9q","ReKEWwiHrZ","Nxx9V1j5L8","ZUnqthUTw7","i7WMQ1j5L8","1j5L8IBe8k","he9IAiwzGk","Ul4a1WDVWJ","aez9yaFFss",
+"Yw2oUdjsrv","x3LDe8hJdt","D6rByyToGW","4QMc9rhl0J","48cHLlkMUA","zqH0WyluBx","prNT6ni2v1","qaofNGWqqX","lViBvQworu","WMiS3cmXIX",
+"jzUqRy94nw","07n1cbrhlQ","dmoS7JXljW","J2mQiZuDtD","2Yz7E8RCUA","uLtKsM6qcG","1LB1LuPX7G","tlILtjeskS","AmdQdKZamH","9rlg97hyVv",
+"AkKTkGWqqX","WmadA8TxD7","zHF1quLtKs","aFFssECMvU","oVQp6GrDg7","mz8gx5Drn0","MaJQsdhSuH","soy9tfqypy","ZuDtDgf8rI","rz7Utt59lR",
+"2TRI7v8yFN","FhtgltuDyS","ThjNnZzJHW","3weIFIjTwP","FPfSEx3LDe","9GXkXlpF6W","hUTw7qUJMd","9y4lwZv7z0","ZJTXHReKEW","tuDySOUqFM",
+"4W0TlzHF1q","VerEAQYxC0","jtn0XfaHir","euZA5WPmlx","brhlQIRh48","S2DfuBCxeC","dhSuHFhtgl","ZzJHWuLtKs","JRJQBnFqik","WPmlxYh1hF",
+"fmIK1Yw2oU","NhXduReKEW","djsrvQ6hMC","lH1kt9iGoT","ix74rKASQ8","1j5L8L7cGc","BFkb8cShY2","iKqhriwzGk","v8yFNAmdQd","oVQp6lCMxy",
+"brhlQFnPFB","24ARFjSjS3","euZA57fsYM","TCgPp64s8N","CIShGVNCPd","lsQGosqVrf","EOE1ojeskS","zHF1qhYBCK","Cfgr3b29RJ","oVQp6Waim6",
+"xciqptvdkD","euZA5I7p2a","okgRitlILt","Zv7z0dmoS7","xXTI41j5L8","29QAz07n1c","LDk6ffFDrJ","okgRiMK07Y","Kr8ysRkQke","uLtKszY1GY",
+"5drc65nmWv","Ss0ZuAgJHQ","4dEz6J2mQi","45cIHEdBKc","bgJAzdmoS7","gjUTuOUqFM","D6rBytlILt","M3zXLuAWyp","WMiS3yEfy9","2Yz7EuQIcz",
+"L7cGcaL6AJ","FNYIMTwano","5Drn0xReec","FGzgp0MR5X","I7p2aQWxoT","AIYUuuupzk","fLNg8L7cGc","JkzUny94nw","M6qcGCNHmv","EOE1oEdBKc",
+"lj07QoVQp6","ZuDtDpiJSk","Ul4a10h1b1","MojnPL7cGc","Pb1paMaJQs","No0Qb5drc6","pvgjSHfyNQ","gdQsSyToGW","v2eC3vkCHH","9y4lwLewvM",
+"xciqpRkQke","JkzUnCdyBV","GSQwjEOE1o","zY1GYWPmlx","Q6LixTa8f6","jfREupiJSk","lViBvVprf2","OUqFMHzZT8","tjQxslj07Q","okgRiSmGzv",
+"qQxHPECMvU","QWxoTUvlv4","taOXKprNT6","iqv4k0h1b1","24ARFOxWIH","jeskSnFqik","5drc6TCgPp","taOXKFFDui","l83Udn1pmO","pvgjSoVQp6",
+"618Di7Ow5C","RpBQmDQimp","QbxXcNcICA","3otm6QbxXc","uN6r3rz7Ut","7fsYMtuDyS","MK07YhUTw7","4W0Tl7Ow5C","8U2nUazIWp","VLTy6lkMUA",
+"tjQxs5Namm","TXQ0Z8FmFH","yluBxfFDrJ","lm0pDCxVEf","0h1b1QssNC","Uvlv4RsQUq","xReec2Yz7E","tlILtECMvU","Z4I1vBFkb8","ZzJHWtl72W",
+"YjB9t5Namm","5IhmGbgJAz","iqv4kQClRL","HzZT8No0Qb","BpYhV7fKYU","DcpWBVjCZq","8hJdt9rlg9","MezSWt59lR","pWiOs0MR5X","OHaBzxXTI4",
+"P6bcg9GXkX","SWfouVIlwP","6AFT0L7cGc","XyPZNMGlTF","DQimpW3VFH","uTacxdmoS7","NcICAlj07Q","atef2Chuy3","1j5L8RsQUq","s93MlQssNC",
+"uZPqgk85Ae","xXTI4xciqp","SjskQNhXdu","No0QbfLNg8","uQIczlweGy","QYxC0Gv3Fq","fcJOytAOsr","gdQsSjzUqR","QssNCuAWyp","t98iWDz1R3",
+"B3qemyvOMI","blLA9RACuj","29QAzYOfrY","vOqCExXTI4","9XyT9F6PT2","Dz1R3C2Irc","nnP8oTXQ0Z","CK5W7Rxrsm","s7MxkStlDJ","Ss0ZuvLsmS",
+"QYxC0StlDJ","tAOsr29QAz","MmKGJVLTy6","VIlwP0Kyfs","qQxHPh1zcH","MezSW9GXkX","Zv7z0gtCA5","NhXduuvf7A","1v5hHUvlv4","Ta8f69eoRc",
+"lH1ktmX2GE","FxX9qv1Hln","pFrrlFwEJz","RACujOxWIH","IRh48jeskS","I7p2abZLvS","sx5GlnnP8o","l83UdlsQGo","Mkgy8soy9t","d85a90PktI",
+"AgJHQgf8rI","lCMxymz8gx","iwzGk2TRI7","6q6L9UmaEv","v1HlnJ2mQi","FLsphFcWrW","jzUqRSbRYy","3otm6iKqhr","Gv3FquPX7G","vLsmSFLsph",
+"QChxso8Uyd","dpe1vblLA9","24ARFlkMUA","5ZaEzhSSvQ","zz4ZULbRTH","zz4ZUfcJOy","cQOnvFxX9q","x3LDeprNT6","MaJQssx5Gl","sx5GlKZamH",
+"jzUqRuJScX","MezSWo8Uyd","6AFT0GrDg7","BpYhVYf2Ec","lCMxyAOgEe","wDajXFNYIM","W7cTsTXQ0Z","1v5hHkB5nP","KZamHW7cTs","QssNCm4bxU",
+"K20wKQWxoT","nFqikoQ87r","LDk6fOHaBz","JkzUnQ6Lix","uQIcz64s8N","fcJOyVerEA","JIqXi0Wr5y","0h1b1SWfou","No0QbtaOXK","pmeCd0PktI",
+"GrDg7kB5nP","cShY2MezSW","hi5X7DcpWB","3otm6FVMxo","SjskQJJs5m","U3yw58hJdt","lj07Q3weIF","RxrsmgdQsS","guMb8WaWsv","zmLYDKASQ8",
+"gjUTuGSQwj","n8pJ9B3qem","0ao3lnFqik","NcICA4QMc9","WmadA2DREs","s478648cHL","IRh483weIF","JRJQBksJby","v8yFNOUYuF","WreyPChuy3",
+"U3yw5TXQ0Z","bgJAziqv4k","qUJMd9rlg9","9eoRcD6rBy","FPfSEjzUqR","LbRTHBpYhV","nFqik5Drn0","VLTy6WreyP","8xEKzJRJQB","CIShGtuDyS",
+"rKDLJuN6r3","No0Qbs93Ml","QworuQssNC","0PktInlaBy","yluBxpiJSk","zHF1qMkgy8","Vprf2JkzUn","cQOnvKsjRK","7X3uy8RCUA","uJScXmX2GE",
+"taOXKmz8gx","yluBx9GXkX","HRxd8ix74r","FLsphhSSvQ","0h1b19y4lw","VjCZqMojnP","Fhtgl2hEEU","LewvMuQIcz","Dz1R3uLtKs","4W0TljSjS3",
+"tlILtWPmlx","rhl0JAmdQd","C2Irc5IhmG","ThjNnFxX9q","h1zcHBCxeC","jS1ajZhwG1","Zv7z0RsQUq","AOgEezbIYY","WaWsv0YAGH","tjQxs8FmFH",
+"xciqpFwEJz","AOgEejS1aj","618DiCIShG","1v5hHzQt6Q","4QMc9fcJOy","s4786X6Pin","Q6hMCM6qcG","FcWrWQssNC","ydG8UDQimp","HfyNQ14FLR",
+"5NammtvdkD","5iGN5s93Ml","iB08lEOE1o","ThjNn5Namm","MGlTFuZPqg","55rfByofH3","qUJMdtvdkD","8xEKzh1zcH","o8UydXyPZN","i7WMQFVMxo",
+"tAOsrl83Ud","xXTI4RsQUq","atef2EOE1o","JkzUn1v5hH","RBhp05IhmG","gf8rIFGzgp","OxWIH9GXkX","zFgtBS2Dfu","AgJHQ6q6L9","aFFss5iGN5",
+"QWxoTgf8rI","l83Ud9y4lw","vLsmSOHaBz","KsjRKpv0i7","BFkb8Oz8yZ","0MR5XW3VFH","5VZjS8xEKz","v2eC3ZJTXH","ydG8UeuZA5","BpYhVuAWyp",
+"POUYSCqqaD","7X3uy24ARF","JKWYR5drc6","AgJHQSs0Zu","1LB1LMmKGJ","ECMvU5iGN5","nFqikMojnP","Y1mC0NcICA","HlUbFzFgtB","5Mg9rOxWIH",
+"QworuZzJHW","AIYUudQ586","lsQGoJXljW","9GXkXaL6AJ","dQ586RmDcr","0PktIpFrrl","uvf7AIBe8k","0YAGHD6rBy","JXljWdmoS7","wDajXMmKGJ",
+"LDk6fxReec","B3qemqUJMd","oGu6xFLsph","FLsphh1zcH","zqH0WS77LH","BbwgARzaZA","iwzGkVLTy6","07n1caDGtS","8U2nU8FmFH","ru4UGrhl0J",
+"OUYuFBCxeC","Ss0Zu8TxD7","kZANmsuY4x","7fsYM24ARF","RpBQmwDajX","0BmCyLewvM","jfREuWMiS3","0MR5Xk85Ae","5iGN5Ul4a1","RsQUqjzUqR",
+"0h1b1he9IA","GWqqXOUqFM","WaWsvdhSuH","gIYvEtAOsr","ksJbyFGzgp","5nmWvlViBv","VjCZqgIYvE","zbIYYGXdoH","zQt6Qatef2","lm0pDfaHir",
+"Q6hMCLDk6f","s4786DLhzM","UlU3MprNT6","FFDuirKDLJ","aL6AJ618Di","fmIK1ulk41","JXljWqQxHP","Ul4a1EOE1o","dpe1vxReec","mX2GEgf8rI",
+"Pb1paGXdoH","CqqaDUl4a1","5Mg9rQnJ1S","xciqpuTacx","SbRYyQWxoT","lpF6WNo0Qb","7hyVvv8yFN","MaJQsTa8f6","i3pyd0MR5X","ReKEWpmeCd",
+"ReKEWWaim6","Yf2EcNxx9V","SmGzvUvlv4","S2Dfu2ZHdk","9GXkX0h1b1","l83UdVprf2","DcpWBiKqhr","tuDyS16lHc","uvf7ABFkb8","Kr8ysaFFss",
+"VjCZqJ2mQi","FhtglTCgPp","SWfouRxrsm","QClRLRkQke","RsQUqWDVWJ","s93MluZPqg","JIqXiFjHXR","fcwDaWDVWJ","okgRi24ARF","Gv3Fq7X3uy",
+"14FLRJRJQB","yofH3JJs5m","6q6L9LDk6f","t98iWRmDcr","StlDJG1RhS","gjUTudpe1v","uTacxlpF6W","JkzUnUl4a1","ThjNnWreyP","gIYvEKZamH",
+"NAFuw7fsYM","jeskSuZPqg","hUTw72TRI7","XflUqnlaBy","rhl0JNo0Qb","O3iyQSmGzv","I7p2aWaWsv","qaofNEOE1o","piJSkG1RhS","FxX9qiKqhr",
+"CIShGtl72W","AOgEeguMb8","Chuy3XflUq","X6PinQworu","M6qcGzbIYY","Nxx9VB3qem","zQt6Q0Wr5y","qUJMdiqv4k","hE1QlWPmlx","RzaZAe6e4z",
+"ksJbyThjNn","Z4I1v1j5L8","ru4UGDLhzM","W3VFHkZANm","Z4I1v2TRI7","5Drn0lsQGo","Ta8f6Vprf2","lpF6W8xEKz","dpe1vDLhzM","YOfrYRkQke",
+"Q6LixMezSW","v1Hlnatef2","ru4UGZhwG1","oVQp6M3zXL","pAhR1tlILt","hi5X7tlILt","0Wr5ybrhlQ","qQxHP9rlg9","x3LDeQnJ1S","qUJMdGXdoH",
+"Waim6DcpWB","RBhp0mX2GE","aL6AJWPmlx","uZPqg7fKYU","FxX9qQ6Lix","TXQ0Zb29RJ","soy9tTwano","aL6AJe6e4z","gIYvEjS1aj","aFFssiB08l",
+"Q6hMCCIShG","FhtgllViBv","OUqFM8hJdt","oGu6xBCxeC","8xEKz48cHL","6q6L95iGN5","S77LH1j5L8","vkCHHcmXIX","b29RJPOUYS","7lUXZVNCPd",
+"kZANmgf8rI","xciqpSs0Zu","NOHsz5VZjS","cL0aEv2eC3","7fsYMlCMxy","dQ586Vprf2","XyPZNuZPqg","QbxXcReKEW","vkCHHDG4sT","2Yz7EyToGW",
+"IBe8k8RCUA","16lHcBGaQY","ZuDtDqQxHP","M3zXL2ZHdk","jiVBPbgJAz","qQxHPk85Ae","2ZHdkKsjRK","Waim6VBjhz","7fKYULDk6f","CNHmvBCxeC",
+"8cVD3aDGtS","D6rByVjCZq","n1pmORpBQm","zmLYD618Di","bgJAzdQ586","HP433suY4x","ReKEWy94nw","2hEEUMezSW","GrDg7MezSW","iB08lTCgPp",
+"BbwgAqUJMd","64s8Nlj07Q","jfREuuPX7G","wiHrZuJScX","lkMUAlXFOB","QClRLy94nw","M3zXLNhXdu","8cVD3SbRYy","5nmWvlsQGo","zz4ZU618Di",
+"hE1QlvkCHH","7X3uyxReec","djsrvblLA9","yluBxHP433","cL0aE2Yz7E","mz8gxtAOsr","QWxoTQClRL","DcpWBC2Irc","4QMc9hYBCK","MaJQsAXpwE",
+"gjUTuVBjhz","QYxC0suY4x","IBe8kfFDrJ","ciuWzCxVEf","D6rByYf2Ec","m4bxUVLTy6","uupzk7lUXZ","Yh1hF8FmFH","4QMc924ARF","jSjS3PYBf4",
+"5Drn05iGN5","zmLYDSjskQ","K20wKciuWz","M6qcGs93Ml","y94nwfcJOy","HP433RsQUq","kZANm8U2nU","45cIHjS1aj","TCgPpzbIYY","xciqpIKxdL",
+"8cVD3yEfy9","C2Irc9eoRc","vkCHHFjHXR","kZANmxciqp","HfyNQeuZA5","FjHXRsqVrf","mz8gx07n1c","6AFT07X3uy","Waim6CIShG","qUJMdPOUYS",
+"MK07YeuZA5","oQ87r580YD","HP4336AFT0","v2eC3xReec","gIYvEzqH0W","ThjNn9XyT9","t59lRlCMxy","tuDySlsQGo","Ss0ZuaDGtS","uLtKsjS1aj",
+"BbwgAK20wK","VBjhzDcpWB","zHF1qfFDrJ","MmKGJBbwgA","VBjhzVIlwP","jzUqRzqH0W","lj07QlkMUA","gIYvECfgr3","Gv3FqoQ87r","aDGtSGXdoH",
+"x3LDezbIYY","pT8wuzbIYY","CdyBV0BmCy","MmsIoydG8U","Uvlv4aL6AJ","BpYhV2TRI7","aDGtStlILt","lViBvksJby","CNHmvi7WMQ","VNCPd7hyVv",
+"5drc63otm6","9eoRcNAFuw","HfyNQni2v1","ZhwG1DQimp","iwzGkgjUTu","FNYIM4dEz6","dQ586VNCPd","RkQkeK4GS8","uoStwW7cTs","8TxD7v1Hln",
+"5ZaEzfqypy","6AFT0fFDrJ","v1HlnpmeCd","5Mg9rWPmlx","6AFT0iKqhr","8RCUAWDVWJ","fqypyHP433","hE1QlDLhzM","FPfSETXQ0Z","6q6L93otm6",
+"07n1ccL0aE","Cfgr3y94nw","zbIYYEOE1o","Chuy3WaWsv","5NammMmKGJ","AOgEepWiOs","07n1cqQxHP","Nxx9VuJScX","RBhp0rhl0J","BGaQYEOE1o",
+"3otm6Dz1R3","WMiS31j5L8","C2IrcD6rBy","piJSkAmdQd","o8UydkB5nP","Ul4a1DG4sT","zmLYDNo0Qb","IBe8kogLgc","i3pydAOgEe","vOqCEOUYuF",
+"8RCUAS2Dfu","jiVBP07n1c","fcwDaokgRi","ru4UG64s8N","MezSWtvdkD","55rfBFcWrW","tvdkDWreyP","618DiazIWp","xXTI4DLhzM","5drc6tjQxs",
+"0Wr5y9y4lw","HzZT85Drn0","Gv3FqrKDLJ","pWiOscQOnv","No0Qb5nmWv","cQOnvgtCA5","RBhp0Ul4a1","jSjS3QssNC","HzZT8nFqik","FcWrWLDk6f",
+"HlUbFAXpwE","jfREu8U2nU","v1HlnXflUq","8xEKzMmKGJ","DcpWBsqVrf","v2eC3TCgPp","nnP8oix74r","UlU3MECMvU","S77LHy94nw","Ss0Zurz7Ut",
+"t59lRsqVrf","HfyNQZUnqt","soy9tn8pJ9","YjB9tRmDcr","uJScXHRxd8","JkzUnStlDJ","Vprf2uTacx","PYBf4lsQGo","okgRiuN6r3","s93MlZzJHW",
+"vLsmSRpBQm","FNYIMix74r","OHaBziqv4k","aL6AJRpBQm","J2mQiVIlwP","s4786euZA5","48cHLgIYvE","uupzkFcWrW","hi5X7piJSk","vLsmSW7cTs",
+"NcICAwDajX","tlILt8FmFH","YOfrYIKxdL","Mkgy86q6L9","faHirQ6hMC","ZJTXHVIlwP","oVQp6AkKTk","9y4lw45cIH","aL6AJ2TRI7","WPmlxsoy9t",
+"Mkgy8WMiS3","tuDyS7Ow5C","7fKYUyvOMI","U3yw5Cfgr3","JXljWFLsph","GXdoHY1mC0","aFFssFxX9q","OHaBzk85Ae","RmDcrX6Pin","2DREsogLgc",
+"7ku1plViBv","XflUqjiVBP","ZuDtDtvdkD","C2IrchE1Ql","azIWpTCgPp","rz7Ut9XyT9","IBe8ktuDyS","gf8rIsoy9t","ZhwG1GWqqX","gtCA5oVQp6",
+"IjTwPB3qem","StlDJF6PT2","bZLvS2Yz7E","VjCZqlpF6W","m4bxUgtCA5","nlaBy16lHc","rz7UtpT8wu","2hEEUDz1R3","jS1ajydG8U","YOfrYrz7Ut",
+"FVMxopT8wu","uZPqgoGu6x","cL0aE2ZHdk","WaWsvO3iyQ","lkMUAFxX9q","J2mQiS77LH","n8pJ9BbwgA","FNYIMoVQp6","Uvlv4BbwgA","oVQp645cIH",
+"soy9tBpYhV","L7cGcZzJHW","0BmCyXflUq","FwEJzMmKGJ","EoToP5Drn0","cmXIXfcJOy","ix74rdjsrv","7lUXZJKWYR","YOfrYF6PT2","pmeCdNhXdu",
+"rKDLJF6PT2","3weIFzmLYD","pT8wuuAWyp","tvdkDBpYhV","CxVEfwiHrZ","pFrrlzHF1q","n8pJ929QAz","ciuWzs4786","HfyNQmz8gx","K4GS8Waim6",
+"qQxHPBFkb8","FhtglksJby","uJScXD6rBy","CK5W7MK07Y","xXTI4QbxXc","LDk6fcmXIX","9y4lwRsQUq","pv0i70PktI","wDajXRxrsm","AkKTkZhwG1",
+"atef207n1c","suY4xhYBCK","djsrvyluBx","P6bcgOxWIH","DG4sTJ2mQi","9GXkXazIWp","CIShGqUJMd","fmIK12hEEU","AgJHQFhtgl","K20wKRzaZA",
+"EdBKcS77LH","Oz8yZQ6hMC","iwzGkazIWp","W7cTspAhR1","n1pmOrKDLJ","0BmCy9eoRc","2DREss93Ml","b29RJYjB9t","faHirvLsmS","Yw2oU4W0Tl",
+"ZJTXHUmaEv","zqH0Wy94nw","uoStwy94nw","GXdoHSWfou","2DREsX6Pin","PYBf4lpF6W","TCgPpfmIK1","uvf7Auvf7A","zY1GY8hJdt","FxX9qKr8ys",
+"WmadAxciqp","uPX7Gh1zcH","pAhR1DQimp","FcWrWguMb8","IjTwPMezSW","9eoRc5Drn0","ulk41VBjhz","X6PinVerEA","hi5X7WaWsv","OxWIHiKqhr",
+"UmaEvpWiOs","rhl0JgjUTu","QWxoTbgJAz","tAOsrWmadA","O3iyQMezSW","8FmFH2Yz7E","uQIczn1pmO","lkMUApv0i7","JIqXiBbwgA","ReKEWd85a9",
+"FhtglQbxXc","Zv7z0K4GS8","2ZHdk7ku1p","J2mQi0ao3l","NcICAFxX9q","uvf7AStlDJ","azIWpvkCHH","ksJbyFjHXR","guMb8FNYIM","BbwgAQ6hMC",
+"lpF6WksJby","AgJHQF6PT2","qaofNFhtgl","vLsmS5iGN5","RACuj6AFT0","RACujjSjS3","d85a9I7p2a","cQOnvzqH0W","9rlg9BCxeC","J2mQiWaim6",
+"hUTw7G1RhS","CNHmvpv0i7","BGaQYSmGzv","9iGoTL7cGc","zY1GYRzaZA","FnPFBnnP8o","7X3uyRsQUq","5drc6QnJ1S","tuDySSmGzv","MGlTF8hJdt",
+"nFqiklH1kt","aL6AJ8FmFH","uN6r3sx5Gl","0BmCy1v5hH","vOqCE7lUXZ","Cp3mZFjHXR","rz7UtvLsmS","e6e4zMGlTF","FVMxoblLA9","cQOnvmz8gx",
+"07n1cdQ586","HfyNQDcpWB","LbRTHaez9y","yofH32DREs","OHaBz5nmWv","prNT6aDGtS","F6PT2UmaEv","QYxC0AXpwE","YOfrYRzaZA","Zv7z055rfB",
+"m4bxUDQimp","WreyPNOHsz","Ss0ZuWMiS3","taOXKL7cGc","3otm6zY1GY","DQimpMkgy8","0h1b1brhlQ","rz7Ut6AFT0","a00b5Nxx9V","0YAGHtaOXK",
+"SmGzv9iGoT","QChxsF6PT2","aL6AJrhl0J","nlaBybZLvS","OxWIHMm8si","VjCZqpmeCd","TXQ0ZDcpWB","taOXKd85a9","FnPFBQ6hMC","Nxx9VtAOsr",
+"RBhp0BFkb8","JJs5mQChxs","Dz1R3P6bcg","C2Ircv8yFN","618DiblLA9","7hyVvQClRL","6AFT0ix74r","TXQ0ZlXFOB","7X3uynlaBy","No0QbcmXIX",
+"FNYIM5nmWv","ix74rblLA9","Mkgy82Yz7E","gIYvEtjQxs","aDGtSlkMUA","VjCZqqUJMd","FVMxoL7cGc","k85AeBCxeC","Yw2oUcQOnv","0h1b1Waim6",
+"iB08lPb1pa","iB08lZhwG1","ciuWzrz7Ut","9rlg9Nxx9V","Pb1paFGzgp","8xEKzNcICA","Pb1pahE1Ql","lH1ktiqv4k","LewvM7hyVv","K20wKni2v1",
+"Z4I1v8RCUA","i7WMQNOHsz","faHirNxx9V","KsjRK16lHc","b29RJTXQ0Z","5iGN5Pb1pa","Y1mC0HP433","KZamHuTacx","VIlwPsoy9t","dpe1v2Yz7E",
+"y94nwrKDLJ","m4bxUBGaQY","Oz8yZQYxC0","pmeCdbrhlQ","okgRibZLvS","EoToPv2eC3","FPfSEMK07Y","yofH3Z4I1v","QnJ1SChuy3","Cfgr3BCxeC",
+"lweGyPYBf4","IBe8knnP8o","sqVrfvOqCE","jfREuUmaEv","atef2l83Ud","he9IAYw2oU","KZamHuJScX","cShY2FLsph","i3pydNAFuw","lXFOBdhSuH",
+"55rfBatef2","ReKEWNAFuw","L7cGcciuWz","CNHmv5Namm","LewvMAOgEe","CK5W7CqqaD","dmoS7xXTI4","ksJbyn1pmO","n8pJ9F6PT2","2hEEUFwEJz",
+"xciqpBFkb8","MmKGJmz8gx","MaJQsIBe8k","aDGtSuN6r3","LDk6fYw2oU","tjQxsY1mC0","FPfSEJKWYR","BbwgAy94nw","580YDsqVrf","StlDJ5nmWv",
+"ogLgcRACuj","mz8gx2ZHdk","aFFssuJScX","DG4sTfcwDa","OUYuFVerEA","VIlwPrhl0J","QWxoTCNHmv","d7vjMdQ586","he9IACxVEf","OUqFMa00b5",
+"wDajXlweGy","nFqikb29RJ","blLA9fqypy","2DREsaFFss","dhSuHFFDui","nnP8olpF6W","ciuWzIKxdL","S77LHCfgr3","CIShGgIYvE","P6bcguPX7G",
+"brhlQCfgr3","5NammeuZA5","Dz1R3ZzJHW","RxrsmStlDJ","n8pJ9pvgjS","BGaQYrKDLJ","14FLR0Wr5y","x3LDe5Mg9r","NhXduOHaBz","JRJQBLewvM",
+"uJScXjS1aj","pvgjSSWfou","pv0i7FLsph","Mkgy8aFFss","Chuy39iGoT","kZANmzz4ZU","0MR5X7ku1p","QWxoT7X3uy","WmadAlpF6W","fcJOyGSQwj",
+"EdBKcDz1R3","CqqaDzbIYY","AIYUu6AFT0","fLNg8vkCHH","CdyBViwzGk","rKDLJCqqaD","gIYvEHzZT8","gtCA5tl72W","Cp3mZ6q6L9","faHir2Yz7E",
+"M6qcGwiHrZ","pWiOs5nmWv","fcwDaK20wK","fcJOymX2GE","S2DfuuoStw","tlILtI7p2a","14FLRd7vjM","StlDJWmadA","WMiS34QMc9","1j5L8lsQGo",
+"0YAGH9rlg9","RsQUqUvlv4","yEfy9ZhwG1","DQimpNxx9V","64s8NXyPZN","taOXKtjQxs","KASQ80MR5X","5drc6d7vjM","W7cTsJ2mQi","Mm8siK20wK",
+"nlaBynnP8o","BbwgA2ZHdk","pWiOsaL6AJ","xXTI4FPfSE","HzZT8ix74r","QYxC0CqqaD","cShY2a00b5","FnPFBpv0i7","fqypygtCA5","gjUTu45cIH",
+"64s8N0YAGH","9eoRcuAWyp","IBe8kRzaZA","NOHsz7fsYM","suY4xQWxoT","MaJQsXyPZN","C2IrcIKxdL","BGaQYjS1aj","oGu6xBFkb8","1j5L8cL0aE",
+"4W0TljeskS","t59lRFVMxo","hi5X7QYxC0","zFgtBJ2mQi","tl72WCxVEf","t98iWlXFOB","aL6AJQworu","JJs5mk85Ae","I7p2aFxX9q","zY1GYfFDrJ",
+"IBe8kY1mC0","CNHmv9rlg9","MmsIoUmaEv","U3yw5RzaZA","9iGoTa00b5","DcpWBgIYvE","zHF1qAXpwE","TCgPpS77LH","VIlwPpAhR1","aDGtSM3zXL",
+"zY1GYbZLvS","RxrsmpvgjS","Yh1hFlweGy","GXdoHrKDLJ","a00b5580YD","yofH316lHc","xXTI4AgJHQ","5VZjSlXFOB","ogLgclH1kt","UmaEvG1RhS",
+"0MR5Xm4bxU","atef2suY4x","t98iWAIYUu","2ZHdknFqik","VLTy664s8N","yEfy9pvgjS","uJScXK4GS8","pFrrlMmKGJ","FVMxos93Ml","LbRTHCp3mZ",
+"No0Qbfqypy","IjTwPtl72W","5nmWvazIWp","Ta8f6FNYIM","t59lR8TxD7","Y1mC0aez9y","L7cGcRBhp0","AXpwEStlDJ","aDGtSEdBKc","WMiS3JXljW",
+"Chuy3gIYvE","taOXKCfgr3","0YAGHCIShG","5NammhSSvQ","zY1GYtuDyS","POUYScQOnv","2NslmEoToP","mX2GEhi5X7","uJScX3weIF","DQimp7lUXZ",
+"Ta8f6dhSuH","TCgPpcL0aE","k85AepT8wu","oGu6xJKWYR","Kr8yslkMUA","cmXIXnlaBy","AOgEea00b5","EoToPI7p2a","yofH3RsQUq","P6bcgWaim6",
+"QbxXc5nmWv","CK5W72DREs","5Drn07X3uy","taOXKUlU3M","FxX9q5Namm","3otm6fqypy","ZhwG15drc6","oVQp67Ow5C","jeskSFjHXR","7hyVvAIYUu",
+"0YAGHS77LH","HfyNQJkzUn","5VZjSG1RhS","I7p2aHfyNQ","CK5W7fFDrJ","AmdQdvLsmS","HlUbF4QMc9","W3VFHYf2Ec","2NslmTXQ0Z","GXdoHpv0i7",
+"DQimphSSvQ","taOXKlCMxy","LewvM45cIH","AkKTkWmadA","7hyVvBFkb8","G1RhSVjCZq","gjUTuciuWz","HlUbF7lUXZ","Z4I1vcQOnv","HfyNQyvOMI",
+"oGu6x3otm6","RzaZAMK07Y","dpe1vMojnP","9iGoTqQxHP","jSjS3s93Ml","07n1cQWxoT","jzUqR1v5hH","tAOsrhE1Ql","zqH0WaDGtS","Waim6OUYuF",
+"F6PT2v8yFN","2Yz7E580YD","v1HlnWDVWJ","WaWsvn1pmO","Uvlv4Mm8si","GSQwj8TxD7","vOqCEuoStw","7fsYMfcJOy","qQxHPJRJQB","C2IrcpAhR1",
+"AXpwEulk41","atef2PYBf4","v2eC38U2nU","uLtKscQOnv","vOqCEs93Ml","FNYIM2Yz7E","lpF6W2hEEU","JRJQB6AFT0","RmDcrsoy9t","pv0i7CxVEf",
+"9GXkXPYBf4","hSSvQuJScX","uLtKsM3zXL","ru4UGCdyBV","ThjNnvOqCE","WDVWJCp3mZ","Ta8f6vkCHH","n1pmO5Mg9r","CxVEfyvOMI","XyPZNRxrsm",
+"4dEz6s4786","KZamHwiHrZ","M6qcGTwano","0YAGHbrhlQ","uvf7AWPmlx","x3LDeGXdoH","ThjNn4W0Tl","aDGtS9y4lw","AkKTklj07Q","uZPqgv2eC3",
+"HfyNQoQ87r","sx5GlCdyBV","s93MlVprf2","cShY2lsQGo","9XyT948cHL","Gv3FqlweGy","yToGW0PktI","rKDLJkZANm","M6qcG1LB1L","fFDrJQnJ1S",
+"5Mg9rJJs5m","qaofN16lHc","VIlwP0BmCy","0Kyfsl83Ud","qUJMdKsjRK","SWfouQworu","guMb8YjB9t","VerEAuLtKs","Dz1R3K4GS8","FFDuiqaofN",
+"P6bcgpvgjS","64s8NQbxXc","8TxD714FLR","8TxD7bZLvS","W7cTsStlDJ","ni2v1hUTw7","yToGW64s8N","zbIYYWaim6","ZhwG1faHir","SjskQpv0i7",
+"ThjNnQnJ1S","aFFssa00b5","lj07QVIlwP","5VZjSDG4sT","FxX9qBbwgA","prNT6ksJby","tAOsrgjUTu","OxWIHAIYUu","FhtglprNT6","ZJTXHzmLYD",
+"FwEJzuAWyp","ReKEWuupzk","Kr8ysM3zXL","zbIYYCIShG","iqv4k45cIH","hYBCKyEfy9","4QMc9yEfy9","yvOMIjeskS","d7vjMuPX7G","9eoRclpF6W",
+"0h1b1QnJ1S","uPX7GsqVrf","Waim6suY4x","8hJdtIRh48","14FLRThjNn","X6Pin0Kyfs","brhlQEOE1o","XyPZNDLhzM","JRJQBZUnqt","F6PT2i7WMQ",
+"NhXduMezSW","XyPZNoVQp6","uupzk0YAGH","vLsmSciuWz","uJScXB3qem","HRxd8aDGtS","0PktIwDajX","7fKYUYjB9t","CK5W7Qworu","n1pmO2Yz7E",
+"iB08lNxx9V","BpYhV5iGN5","t98iW0MR5X","EOE1oMm8si","t59lR8hJdt","zQt6QnlaBy","24ARFgtCA5","DG4sTFFDui","5NammoVQp6","9rlg9StlDJ",
+"WmadAgdQsS","tl72W7ku1p","KASQ8uPX7G","LbRTH7fsYM","vOqCE7Ow5C","RBhp0WMiS3","X6Pin8FmFH","Pb1paP6bcg","RpBQmCp3mZ","i3pydW7cTs",
+"JKWYRZJTXH","jSjS3suY4x","v2eC3JJs5m","BpYhVhYBCK","cQOnvGv3Fq","o8UydeuZA5","iKqhrRpBQm","jfREumX2GE","BFkb8UlU3M","GSQwj5IhmG",
+"JXljW3weIF","zQt6QMkgy8","wDajXv2eC3","ni2v1EOE1o","W3VFH9XyT9","2Yz7EiwzGk","cL0aEdpe1v","yEfy9s7Mxk","x3LDeECMvU","FnPFBuvf7A",
+"I7p2aYjB9t","FGzgpPOUYS","h1zcH64s8N","suY4xd7vjM","580YDn1pmO","he9IAZJTXH","AIYUuiB08l","0ao3lRBhp0","d85a9vLsmS","ReKEWdhSuH",
+"wiHrZPOUYS","NOHszOHaBz","rz7UtIBe8k","okgRiDG4sT","ECMvUi3pyd","RzaZAv1Hln","3otm6v2eC3","LDk6fFjHXR","tAOsrBFkb8","7fsYMJkzUn",
+"tvdkD9rlg9","0h1b1lkMUA","jeskSyToGW","8xEKzThjNn","hUTw79GXkX","iB08lgtCA5","i7WMQgtCA5","SjskQ9iGoT","hi5X7tAOsr","24ARFHfyNQ",
+"QbxXcdjsrv","QworuMkgy8","aL6AJ07n1c","45cIHpiJSk","DQimpEoToP","UmaEvXflUq","azIWpQssNC","aL6AJZ4I1v","uLtKsFGzgp","VBjhz9rlg9",
+"hE1QlCK5W7","FnPFBt98iW","4dEz69iGoT","yluBxn8pJ9","5IhmGJKWYR","MmsIoZUnqt","AgJHQs4786","55rfBWaim6","Oz8yZd7vjM","t59lRECMvU",
+"jSjS38TxD7","nFqikQChxs","SjskQjiVBP","ulk4148cHL","Z4I1vsqVrf","1LB1L2hEEU","uupzk1j5L8","MK07YWaim6","ni2v15VZjS","ksJby6q6L9",
+"zQt6QFLsph","POUYSRmDcr","rz7Utxciqp","JIqXitvdkD","v1HlnZUnqt","n8pJ9AgJHQ","9rlg95iGN5","8cVD3ru4UG","FFDui8TxD7","xciqpv1Hln",
+"faHirl83Ud","y94nwOUYuF","L7cGcxciqp","5iGN5IKxdL","1LB1LVprf2","U3yw5Oz8yZ","WPmlxFNYIM","TCgPp4dEz6","580YDIjTwP","7fsYMCxVEf",
+"VjCZqxReec","cmXIXhe9IA","yEfy9OHaBz","yToGWs4786","Ta8f68xEKz","iwzGklViBv","mz8gxjS1aj","OxWIHfFDrJ","RmDcrRxrsm","okgRiQChxs",
+"s93MlPYBf4","29QAzFcWrW","2DREss4786","JJs5mpAhR1","WreyPqQxHP","GSQwjrKDLJ","StlDJ7fKYU","HfyNQRxrsm","v1HlnZ4I1v","Gv3FqJ2mQi",
+"Z4I1v618Di","e6e4zIRh48","NhXduL7cGc","CdyBVnFqik","NAFuw8TxD7","oVQp6IjTwP","jfREunFqik","fFDrJt98iW","uTacxoGu6x","KsjRK8U2nU",
+"6q6L9soy9t","uJScXru4UG","tuDyStuDyS","2NslmoQ87r","UmaEvhe9IA","PYBf4ReKEW","0MR5X2Yz7E","nlaByMaJQs","5NammYOfrY","fFDrJjfREu",
+"uPX7G8RCUA","b29RJ7X3uy","zz4ZUPYBf4","QbxXctlILt","3weIFeuZA5","MezSWVBjhz","TXQ0ZJJs5m","FPfSEU3yw5","MojnPQWxoT","TCgPptAOsr",
+"7fKYUCIShG","AIYUuDLhzM","9rlg9d85a9","RkQke45cIH","piJSkKr8ys","NcICAFVMxo","bgJAzEOE1o","iB08l48cHL","yEfy9cL0aE","jfREubrhlQ",
+"n8pJ9fLNg8","VIlwPIKxdL","F6PT2CNHmv","tuDySogLgc","azIWpnnP8o","vLsmS7fKYU","tvdkDHfyNQ","taOXKOUYuF","JRJQBfmIK1","QYxC02Yz7E",
+"K20wKYf2Ec","WDVWJ5IhmG","TwanoYOfrY","Q6hMCECMvU","ZUnqtzQt6Q","WaWsv7fsYM","Kr8ysQnJ1S","5ZaEzK20wK","Yf2Eci7WMQ","SjskQJ2mQi",
+"dQ586rz7Ut","xXTI42DREs","soy9tZUnqt","S2DfuStlDJ","a00b5iB08l","FwEJzLDk6f","fcwDaThjNn","MezSWIKxdL","0Kyfsatef2","OHaBzwDajX",
+"i3pyd618Di","h1zcHDcpWB","ksJbyaDGtS","S77LHaL6AJ","9y4lwBGaQY","D6rBy6q6L9","lsQGopWiOs","fFDrJXflUq","SbRYypWiOs","2Yz7EEoToP",
+"5Mg9r7fKYU","StlDJaDGtS","yToGWAXpwE","djsrvpvgjS","2Yz7EWreyP","IKxdLuTacx","fLNg84W0Tl","atef2LbRTH","7hyVvJkzUn","qQxHPjS1aj",
+"fcwDatAOsr","Yw2oUK4GS8","W7cTs2DREs","ksJbyVprf2","VIlwPcShY2","HlUbF5nmWv","OUqFMsqVrf","NAFuwSmGzv","Chuy3AXpwE","t59lRyToGW",
+"Q6hMCWPmlx","QChxs7Ow5C","d7vjMQYxC0","aez9yVprf2","kZANmuJScX","CK5W7kB5nP","AmdQdfqypy","TCgPpaez9y","hSSvQn8pJ9","tl72WS2Dfu",
+"BFkb8qQxHP","B3qemCqqaD","6q6L9tlILt","qaofNprNT6","tl72WfcwDa","v1HlnaFFss","UmaEvwiHrZ","CK5W7BGaQY","SbRYy5ZaEz","1LB1Ln8pJ9",
+"uupzkpvgjS","HRxd8JkzUn","0MR5XKsjRK","uoStwlsQGo","Yf2EcwDajX","ulk41oVQp6","LbRTHAXpwE","d85a95VZjS","jSjS3ru4UG","azIWp5Namm",
+"Ta8f6hi5X7","S2DfuNAFuw","7fsYMAgJHQ","FGzgpEOE1o","atef2SmGzv","LewvMhi5X7","8U2nUlweGy","i3pydD6rBy","C2IrcMkgy8","0BmCyZ4I1v",
+"oVQp6Cp3mZ","0BmCyCK5W7","ciuWzZJTXH","M6qcGBFkb8","dQ586v1Hln","iwzGk48cHL","8cVD3C2Irc","MmKGJSWfou","8U2nUFLsph","2NslmMGlTF",
+"FcWrWNOHsz","nnP8ot59lR","taOXKfLNg8","v2eC348cHL","rhl0JZv7z0","uupzkEoToP","qQxHPbrhlQ","rz7UtJKWYR","2Yz7E8cVD3","yvOMItlILt",
+"Cp3mZVNCPd","t98iWaFFss","I7p2ajfREu","NAFuw16lHc","sqVrf8hJdt","AmdQdn8pJ9","LewvMfaHir","IjTwPnFqik","cShY2BGaQY","iKqhrHzZT8",
+"suY4xECMvU","Mm8siTa8f6","2ZHdkuZPqg","K20wKfFDrJ","07n1cgjUTu","cShY2MojnP","ZUnqtW7cTs","ReKEWFnPFB","uupzkY1mC0","55rfBRzaZA",
+"lkMUA7X3uy","AOgEeHfyNQ","qUJMdyvOMI","0YAGHkZANm","5NammPb1pa","euZA5fFDrJ","7ku1p9GXkX","kZANmdpe1v","2hEEUnlaBy","NAFuwZ4I1v",
+"8FmFHatef2","iqv4kNcICA","bZLvSdpe1v","a00b5he9IA","0h1b1Dz1R3","0ao3lHfyNQ","xXTI416lHc","v1HlnFxX9q","7fsYMGSQwj","CIShGrKDLJ",
+"L7cGcU3yw5","RsQUqQbxXc","6AFT0Ul4a1","HRxd8lpF6W","fLNg8HP433","QChxs5VZjS","24ARF0BmCy","HP433Vprf2","LbRTHazIWp","9eoRcn8pJ9",
+"LbRTHtvdkD","fqypy14FLR","CNHmvpFrrl","DcpWB8U2nU","iqv4k6AFT0","OUYuFFLsph","lXFOBYjB9t","t59lRVNCPd","piJSkDcpWB","pFrrlMaJQs",
+"fFDrJ4QMc9","6AFT0VerEA","Nxx9VOxWIH","HfyNQlViBv","NOHsz5Drn0","RBhp00PktI","jeskSuvf7A","XflUqWDVWJ","MojnPQClRL","IjTwPl83Ud",
+"FNYIMprNT6","rKDLJjtn0X","5nmWvguMb8","qQxHPHlUbF","GrDg7ksJby","BpYhVjeskS","zz4ZUs4786","fLNg80PktI","14FLRpmeCd","IRh48Waim6",
+"MezSW16lHc","faHirrKDLJ","cShY2KASQ8","C2IrcsqVrf","F6PT2W7cTs","piJSk07n1c","QbxXcIjTwP","tjQxsHfyNQ","cmXIXlweGy","2TRI7CNHmv",
+"vOqCEcQOnv","FxX9qrhl0J","6AFT0fcwDa","soy9tIKxdL","9iGoTvLsmS","3otm62Yz7E","29QAzCfgr3","aFFssHP433","jeskSSWfou","t98iWv8yFN",
+"uTacxi3pyd","BFkb8Rxrsm","8RCUAiqv4k","0PktI16lHc","5iGN5jiVBP","x3LDeTCgPp","bZLvS1v5hH","6q6L9F6PT2","QbxXcW7cTs","RmDcrVerEA",
+"QbxXcvkCHH","kZANmfqypy","M3zXL45cIH","fcJOyUlU3M","GWqqXb29RJ","4QMc99rlg9","lXFOBni2v1","8RCUAbgJAz","zbIYYpvgjS","EoToPt59lR",
+"CIShGMaJQs","48cHLUvlv4","hi5X7zFgtB","iqv4kYh1hF","lCMxyni2v1","kZANmKsjRK","lXFOBpvgjS","QChxstuDyS","3weIF2hEEU","gf8rIjtn0X",
+"tjQxsK20wK","B3qemsqVrf","t98iWK4GS8","pT8wuI7p2a","MmsIouQIcz","s4786QYxC0","jtn0X7lUXZ","uJScXO3iyQ","7hyVvuN6r3","XflUq7fsYM",
+"OHaBzXyPZN","mz8gxKsjRK","Uvlv4uoStw","GSQwjb29RJ","qQxHPqQxHP","9y4lw9XyT9","d85a9MK07Y","4dEz6Gv3Fq","X6PinQWxoT","pv0i76q6L9",
+"GWqqXW3VFH","t98iW0Wr5y","LDk6flViBv","b29RJNhXdu","cShY28RCUA","LbRTHFjHXR","IjTwP2ZHdk","QWxoThYBCK","BFkb8ksJby","Gv3Fq2TRI7",
+"sx5GlFwEJz","0ao3lPb1pa","fmIK1ECMvU","3otm67fsYM","mX2GE5iGN5","gf8rIaez9y","jSjS3ReKEW","JKWYRGWqqX","MmsIo5Mg9r","yvOMIiKqhr",
+"jtn0XlH1kt","oVQp6tl72W","YOfrYy94nw","nFqikB3qem","Waim6uAWyp","SWfoupiJSk","AkKTkVerEA","nlaBy2Nslm","qaofNb29RJ","CNHmvVjCZq",
+"JXljW6q6L9","QYxC0JRJQB","8cVD3y94nw","16lHcv8yFN","L7cGcIRh48","Ta8f63weIF","pvgjSChuy3","KZamHd85a9","Pb1paMmKGJ","y94nwpvgjS",
+"FVMxoa00b5","FwEJzBGaQY","FcWrWzmLYD","StlDJogLgc","WmadAb29RJ","euZA5VBjhz","OxWIHFnPFB","TwanofcJOy","UmaEv1LB1L","zmLYD16lHc",
+"B3qemhi5X7","FwEJzJIqXi","hUTw7ZuDtD","FcWrWlweGy","mz8gxSmGzv","uQIczd85a9","J2mQiFFDui","iwzGktlILt","lXFOBpT8wu","HlUbF0Kyfs",
+"HzZT8RBhp0","zmLYD0BmCy","BbwgAru4UG","8cVD38cVD3","8RCUANAFuw","h1zcH5VZjS","euZA5AXpwE","OUqFMlj07Q","UmaEvhE1Ql","7fsYMuvf7A",
+"RmDcrG1RhS","oQ87rNOHsz","5VZjS8TxD7","pWiOsYOfrY","AkKTkX6Pin","48cHL5ZaEz","VBjhzEoToP","SbRYy64s8N","7fsYMlViBv","yluBxnnP8o",
+"LewvM5iGN5","uAWypOUqFM","tvdkDD6rBy","pmeCdhi5X7","29QAzRzaZA","CNHmvuPX7G","16lHcgdQsS","UlU3MQnJ1S","3weIF4dEz6","MGlTFdhSuH",
+"XyPZNZUnqt","SbRYyVBjhz","Yh1hFdQ586","RzaZALewvM","5ZaEzFjHXR","d7vjM580YD","sqVrfWmadA","x3LDegIYvE","RACujpAhR1","kB5nPQworu",
+"faHiroVQp6","uPX7GuPX7G","OUYuFaL6AJ","BGaQY07n1c","FFDuirhl0J","dpe1vjS1aj","AOgEeni2v1","EOE1oFLsph","2Yz7EWDVWJ","FNYIMtAOsr",
+"Y1mC0MmKGJ","2hEEUAIYUu","I7p2abrhlQ","soy9t5ZaEz","uvf7AfLNg8","yluBxO3iyQ","2Yz7ENOHsz","x3LDe2Yz7E","RpBQms4786","Mm8siqaofN",
+"7X3uyd7vjM","GrDg7blLA9","e6e4zgtCA5","djsrvRkQke","4dEz6RkQke","dmoS79GXkX","IRh489rlg9","No0QbWPmlx","BpYhVzbIYY","Rxrsm9y4lw",
+"y94nw8xEKz","MaJQsRpBQm","ZhwG1Q6hMC","AXpwE5Mg9r","AkKTkY1mC0","OUYuFYOfrY","ni2v1ZhwG1","D6rByjtn0X","580YDvLsmS","uJScX4W0Tl",
+"0ao3lMm8si","ni2v1iKqhr","jtn0X8hJdt","uAWypbrhlQ","jtn0X2Yz7E","qaofNfqypy","wiHrZTa8f6","07n1cZv7z0","KZamHt59lR","lm0pDQClRL",
+"Uvlv4FPfSE","iB08lReKEW","9eoRcyEfy9","wDajXUvlv4","lsQGo5Mg9r","n1pmObgJAz","IjTwPguMb8","AIYUulkMUA","3otm664s8N","QChxsECMvU",
+"VIlwPlH1kt","FnPFBlpF6W","55rfBCxVEf","SmGzv6q6L9","C2Irc16lHc","QnJ1SCIShG","QworuKASQ8","cL0aEv1Hln","Cp3mZtvdkD","8xEKzoQ87r",
+"In3NS1j5L8","24ARFpWiOs","l83UdwiHrZ","5ZaEz8U2nU","MezSWAgJHQ","2hEEUgjUTu","AOgEepFrrl","gIYvE0BmCy","e6e4zt98iW","azIWptAOsr",
+"hUTw7FNYIM","WDVWJ55rfB","ZJTXHZzJHW","uN6r3kZANm","MezSWmX2GE","Q6LixK4GS8","K4GS8KZamH","DLhzMaL6AJ","QssNCazIWp","d85a9X6Pin",
+"piJSkaDGtS","gIYvEpT8wu","uoStwWDVWJ","2TRI70Wr5y","lj07Q9eoRc","W3VFHxXTI4","dQ586ThjNn","2DREsMK07Y","Z4I1v7fsYM","vOqCEuPX7G",
+"cmXIXtAOsr","l83UdCp3mZ","t98iWydG8U","sx5Gld7vjM","Kr8yshe9IA","5Mg9rXyPZN","jtn0XWPmlx","uTacx0BmCy","Zv7z0Z4I1v","v2eC3zHF1q",
+"CxVEfnlaBy","QClRLm4bxU","pv0i7LDk6f","rhl0JhSSvQ","uAWyps4786","iB08lpv0i7","9XyT9BFkb8","7fKYUHP433","pWiOs4QMc9","RACuj5nmWv",
+"WaWsvCxVEf","KZamHvOqCE","MaJQsjfREu","n1pmOF6PT2","ZzJHWdQ586","SWfoulXFOB","9rlg9oGu6x","JIqXicShY2","KZamHdjsrv","fmIK1K4GS8",
+"Z4I1vyvOMI","RpBQmjSjS3","RBhp0okgRi","GWqqXXflUq","QbxXcAkKTk","CK5W7B3qem","piJSkjS1aj","Pb1pav2eC3","7fsYMvkCHH","m4bxUQnJ1S",
+"MmsIoP6bcg","Pb1papiJSk","CdyBVbrhlQ","fcJOypWiOs","DLhzMStlDJ","lweGyReKEW","8xEKzkB5nP","RxrsmlsQGo","K20wKv8yFN","yvOMI4W0Tl",
+"6q6L9pvgjS","yvOMIyToGW","BCxeCUvlv4","h1zcHQworu","JKWYRYw2oU","LDk6fjiVBP","Dz1R3HRxd8","AOgEeh1zcH","LDk6fRxrsm","8FmFHRpBQm",
+"uoStwKsjRK","hi5X7fLNg8","8FmFHgf8rI","mX2GEFhtgl","jtn0XjSjS3","blLA9StlDJ","55rfB3weIF","x3LDeO3iyQ","RpBQmX6Pin","EdBKcP6bcg",
+"ni2v17hyVv","qaofNFwEJz","Ul4a1uPX7G","Y1mC0Yh1hF","0h1b1Yw2oU","QClRL1LB1L","NOHszQnJ1S","aDGtS2ZHdk","8cVD32Nslm","1v5hH1LB1L",
+"hYBCKiqv4k","yEfy9v8yFN","QssNCcL0aE","hi5X7s4786","2NslmWMiS3","FPfSEpWiOs","pvgjSFVMxo","LDk6fPYBf4","pvgjS8cVD3","tjQxsL7cGc",
+"OxWIHRzaZA","EdBKczQt6Q","VBjhzuvf7A","8hJdtW3VFH","Ss0ZuW3VFH","7ku1p29QAz","uoStwqUJMd","8xEKzzY1GY","yvOMItuDyS","kZANmMmsIo",
+"xReecfmIK1","o8UydQworu","xciqpzz4ZU","7X3uyIn3NS","RBhp0GSQwj","lXFOB0h1b1","jzUqRpT8wu","HlUbFKZamH","h1zcHgIYvE","cmXIXJXljW",
+"6AFT0zmLYD","Q6hMCzHF1q","5iGN5B3qem","Dz1R3NAFuw","TCgPpChuy3","0PktIydG8U","soy9t45cIH","fqypyjSjS3","2DREssoy9t","Z4I1vQYxC0",
+"9GXkXTXQ0Z","NcICAQYxC0","yofH3Rxrsm","MmsIoIKxdL","dpe1v4dEz6","sx5GlQWxoT","GrDg78RCUA","2DREsD6rBy","Waim6QWxoT","yEfy9HzZT8",
+"VerEAlpF6W","I7p2aUlU3M","FGzgpFhtgl","tAOsrFhtgl","HP43348cHL","lsQGoLewvM","M6qcGDLhzM","S77LHFVMxo","bgJAzTXQ0Z","mX2GEuPX7G",
+"n8pJ9Uvlv4","F6PT2yvOMI","RmDcrGXdoH","WmadAEOE1o","XyPZNQClRL","29QAzokgRi","pv0i7kZANm","Yf2Ec7ku1p","KASQ8fcwDa","jzUqRaDGtS",
+"nFqik14FLR","Pb1palweGy","AIYUuOz8yZ","64s8NlsQGo","5drc6v2eC3","0KyfsNOHsz","OHaBzlXFOB","JJs5mdhSuH","3weIFdpe1v","pT8wudQ586",
+"8U2nUOUYuF","4QMc9lweGy","jS1ajJJs5m","0YAGHKsjRK","FVMxolj07Q","FwEJz5iGN5","Kr8ysThjNn","FFDuiJKWYR","ZJTXHQWxoT","7ku1pIBe8k",
+"he9IA7hyVv","WDVWJpiJSk","Yw2oU24ARF","d85a9Kr8ys","FLsphHP433","LbRTHpv0i7","AIYUuI7p2a","iqv4kEOE1o","y94nwW7cTs","6q6L9P6bcg",
+"pAhR1BFkb8","djsrvt59lR","NcICA4dEz6","5Mg9r6AFT0","d85a9580YD","X6Pin4QMc9","pmeCdy94nw","MGlTFfcwDa","RBhp0jzUqR","618DiFFDui",
+"W3VFH7hyVv","hYBCKGv3Fq","8cVD3nFqik","qUJMdTCgPp","64s8NkZANm","FjHXR29QAz","rz7UttlILt","YjB9trz7Ut","IRh48guMb8","Kr8ysHlUbF",
+"Cp3mZQworu","8U2nUSWfou","e6e4zHRxd8","GrDg7HP433","fmIK1TCgPp","gdQsSLewvM","prNT6soy9t","FLsphe6e4z","d7vjMQworu","qUJMdNOHsz",
+"uoStw07n1c","WPmlxrKDLJ","0MR5XQWxoT","ogLgcF6PT2","kB5nP7Ow5C","JKWYRMojnP","t59lRdjsrv","RkQkeatef2","DcpWBG1RhS","atef2BGaQY",
+"YjB9tsuY4x","BFkb8nFqik","aFFssgjUTu","dhSuH5IhmG","s7MxkvLsmS","Dz1R3Waim6","xReecfqypy","tl72WMmsIo","7hyVvGv3Fq","i7WMQD6rBy",
+"VIlwPpFrrl","vkCHHHlUbF","M3zXL5ZaEz","3otm607n1c","G1RhSgtCA5","U3yw58TxD7","Chuy3xReec","P6bcgy94nw","7fKYUQ6Lix","TwanoJIqXi",
+"lCMxyGrDg7","Kr8ys9eoRc","JXljWwiHrZ","h1zcHM6qcG","QssNCKZamH","FPfSEXflUq","FhtglhE1Ql","LewvMW3VFH","dhSuHlCMxy","SmGzvsuY4x",
+"WPmlxPb1pa","QbxXcCfgr3","a00b5prNT6","Rxrsm6AFT0","d85a9bZLvS","QClRLlXFOB","k85AeFhtgl","FNYIMb29RJ","Y1mC0S77LH","pv0i7W3VFH",
+"5iGN5S77LH","3weIFTwano","XyPZNprNT6","hSSvQMmsIo","3weIFGv3Fq","rhl0JLewvM","QChxsUvlv4","RsQUqpv0i7","FcWrWzY1GY","hUTw7uvf7A",
+"0MR5X580YD","2ZHdk7lUXZ","GrDg7v2eC3","8FmFHlweGy","QworudQ586","5Mg9ruLtKs","0Wr5y0BmCy","CqqaDt59lR","k85Ae5Mg9r","RxrsmRxrsm",
+"wiHrZpvgjS","soy9tUlU3M","Y1mC0qQxHP","TXQ0Z1LB1L","Zv7z0XflUq","AkKTkDQimp","pAhR1QWxoT","yEfy9okgRi","cQOnv2TRI7","d7vjMIBe8k",
+"HRxd8MmKGJ","brhlQP6bcg","b29RJi7WMQ","oVQp6rz7Ut","uTacxqUJMd","uAWypBFkb8","DLhzMbZLvS","MK07YJRJQB","gjUTuv2eC3","G1RhSx3LDe",
+"618DiFNYIM","FPfSEnlaBy","No0QbY1mC0","5Mg9rzQt6Q","MezSWPOUYS","9rlg90ao3l","lj07Q5nmWv","3weIFY1mC0","GrDg7fqypy","VNCPda00b5",
+"zY1GY0MR5X","QChxs9GXkX","4dEz6fqypy","cQOnv3otm6","AXpwElm0pD","FhtglwiHrZ","h1zcHn1pmO","7ku1pOz8yZ","bZLvSzbIYY","tl72WQnJ1S",
+"64s8NU3yw5","djsrv8TxD7","O3iyQFGzgp","UlU3Mi3pyd","vkCHHIn3NS","CNHmvYOfrY","hSSvQuupzk","lsQGoOUqFM","P6bcgciuWz","QssNCAkKTk",
+"tlILt6q6L9","Waim6taOXK","azIWpzY1GY","tl72W2ZHdk","fLNg8iKqhr","X6PinyEfy9","AXpwE2DREs","Pb1paVBjhz","ZzJHWydG8U","9iGoTNOHsz",
+"ksJbyFNYIM","hYBCKguMb8","9GXkXAgJHQ","RsQUqM3zXL","HlUbF0Wr5y","hE1QlIjTwP","IjTwP2TRI7","x3LDecShY2","5ZaEzQWxoT","VNCPdWPmlx",
+"m4bxUzY1GY","jiVBPxciqp","AIYUuEOE1o","cL0aEMezSW","dpe1vFjHXR","jtn0XSs0Zu","07n1ct59lR","XyPZN9y4lw","lsQGokZANm","Dz1R3OUYuF",
+"MGlTFsoy9t","tlILt5drc6","TXQ0ZPOUYS","7lUXZsx5Gl","BFkb8HfyNQ","sx5Gl8TxD7","Ss0ZuCqqaD","9y4lw24ARF","soy9trKDLJ","hi5X7S2Dfu",
+"uPX7G48cHL","IRh48MaJQs","C2Irc9y4lw","J2mQiSbRYy","lsQGolCMxy","SjskQMezSW","Cfgr3IjTwP","s4786Chuy3","D6rByWaim6","iwzGkzQt6Q",
+"oQ87rI7p2a","CxVEfokgRi","CK5W7OxWIH","Q6hMC2DREs","iwzGk3otm6","ZUnqtO3iyQ","7X3uytuDyS","fcJOysuY4x","SbRYyqaofN","55rfBFPfSE",
+"ogLgccQOnv","gjUTuReKEW","yluBxVprf2","iB08llj07Q","zQt6QuJScX","VLTy6WDVWJ","hi5X7AmdQd","X6PinX6Pin","QClRL4dEz6","B3qemtvdkD",
+"jeskSW3VFH","FPfSE7Ow5C","uupzkjeskS","MezSWEOE1o","QssNCoVQp6","M6qcG618Di","MaJQs48cHL","nnP8oS2Dfu","DG4sTCNHmv","QYxC0jzUqR",
+"K20wKEOE1o","KsjRKrKDLJ","IjTwPuN6r3","lViBvHRxd8","y94nwVprf2","hYBCKhE1Ql","IKxdLHzZT8","KsjRKM6qcG","yofH348cHL","BCxeC8hJdt",
+"lXFOBFhtgl","Kr8ysGSQwj","QYxC0DcpWB","9eoRc5ZaEz","AmdQdFNYIM","SWfousoy9t","rKDLJ8xEKz","FjHXR2TRI7","Gv3FquZPqg","xReecrKDLJ",
+"jiVBP6q6L9","wiHrZJ2mQi","xciqpG1RhS","FVMxouQIcz","prNT6zY1GY","oQ87rK20wK","pmeCdv8yFN","guMb8MojnP","iKqhr8RCUA","zmLYDcmXIX",
+"zqH0WWmadA","HfyNQzFgtB","OxWIH8RCUA","OUYuFCIShG","zFgtB5iGN5","OUYuFaez9y","FxX9q4W0Tl","45cIHVLTy6","HzZT8B3qem","gIYvEmz8gx",
+"Vprf2oVQp6","uLtKsJkzUn","Pb1paHzZT8","v2eC3Pb1pa","tjQxsChuy3","5drc6zFgtB","oQ87rTCgPp","MmsIo5drc6","uQIczThjNn","t98iWn1pmO",
+"h1zcHGv3Fq","RACujbZLvS","F6PT2OxWIH","PYBf4580YD","X6Pin8xEKz","uLtKs0BmCy","xXTI4yvOMI","t98iWs7Mxk","BCxeC0ao3l","BGaQYI7p2a",
+"JIqXiazIWp","pWiOsNcICA","KsjRK9rlg9","v8yFNatef2","qQxHP5Drn0","gjUTuzQt6Q","FPfSEpiJSk","oVQp6Mm8si","X6PinYf2Ec","LbRTHoQ87r",
+"64s8NIjTwP","Z4I1vpT8wu","uoStwRxrsm","Q6hMCMezSW","JRJQBv1Hln","soy9tlweGy","HP433lH1kt","ECMvUfqypy","RxrsmAOgEe","Mm8siAkKTk",
+"9GXkXGSQwj","QbxXcRmDcr","uPX7GkB5nP","GrDg71v5hH","29QAzNo0Qb","CqqaDFcWrW","QssNCjfREu","lj07Q07n1c","pv0i7hi5X7","gf8rIQbxXc",
+"y94nwQssNC","i3pydSbRYy","QWxoTwDajX","P6bcgQ6Lix","UlU3M5VZjS","IjTwPhYBCK","l83UdChuy3","d7vjMVNCPd","uvf7A5Namm","ni2v1VBjhz",
+"W3VFHzFgtB","qaofNNhXdu","Yw2oUi3pyd","GrDg75Mg9r","MmsIoWDVWJ","64s8Nm4bxU","5drc6tl72W","zHF1qOHaBz","1j5L8fcJOy","4W0Tl14FLR",
+"P6bcgdQ586","Gv3FqdhSuH","gf8rIyofH3","Nxx9VGv3Fq","GXdoH9iGoT","UlU3MiwzGk","uJScXa00b5","7ku1poVQp6","xciqpKZamH","cL0aE5IhmG",
+"Yh1hFLbRTH","xReeclViBv","e6e4zFVMxo","D6rByOxWIH","F6PT2G1RhS","FFDuib29RJ","o8UydVLTy6","FLsph2hEEU","uTacxOUqFM","POUYSazIWp",
+"ZhwG17hyVv","uupzkSbRYy","5Mg9rFNYIM","7X3uy7fsYM","o8Uyd16lHc","aDGtSMGlTF","4W0TlFxX9q","S2DfuuJScX","HlUbFiB08l","JRJQBtlILt",
+"MGlTFhi5X7","hYBCKJ2mQi","ThjNnnlaBy","fcwDaHlUbF","FnPFBdjsrv","Mkgy8BFkb8","hi5X7cShY2","blLA9I7p2a","CdyBVyToGW","6q6L9jiVBP",
+"suY4xJKWYR","hUTw7brhlQ","618Div1Hln","lj07Q0h1b1","NcICAfmIK1","cL0aE8hJdt","JKWYRzmLYD","Yf2EcRpBQm","MaJQsxReec","lH1ktQworu",
+"tjQxsnnP8o","DLhzMsx5Gl","D6rBylsQGo","gdQsSv8yFN","9eoRcNcICA","Qworu3weIF","okgRiECMvU","pv0i7yToGW","ydG8UCK5W7","16lHcRkQke",
+"iKqhrdhSuH","vLsmSDLhzM","yEfy9MojnP","v8yFNJ2mQi","W3VFHk85Ae","7fsYMMojnP","AmdQdy94nw","uPX7GMojnP","aL6AJatef2","oQ87rfFDrJ",
+"BbwgAM3zXL","yEfy9jS1aj","mz8gxoVQp6","VerEAaez9y","uoStwYf2Ec","Vprf2yluBx","5NammcShY2","0ao3laez9y","Zv7z0MezSW","fcwDaCK5W7",
+"MmsIoAIYUu","AIYUusqVrf","FxX9qWaWsv","gIYvEJXljW","6AFT0dhSuH","1v5hHLbRTH","IjTwPAIYUu","1j5L8y94nw","5IhmGIKxdL","5iGN5gf8rI",
+"S77LHd7vjM","ZUnqt0h1b1","EoToPOUqFM","d7vjMnFqik","1j5L8oQ87r","wDajXIjTwP","RpBQmJIqXi","AIYUuHRxd8","jSjS3qUJMd","StlDJ4dEz6",
+"jfREuMezSW","uvf7AXyPZN","IKxdLS77LH","5VZjSfcJOy","zY1GYs4786","ulk41sqVrf","vOqCElCMxy","Vprf2CqqaD","EoToPpT8wu","UlU3Mjtn0X",
+"5VZjS14FLR","48cHLBCxeC","29QAzyluBx","AkKTkyluBx","5VZjStlILt","7ku1puN6r3","uQIczmz8gx","soy9tVNCPd","yluBx3weIF","y94nw0BmCy",
+"QClRLXflUq","K4GS8zz4ZU","zQt6Q7hyVv","tvdkDpAhR1","ksJbyrz7Ut","uN6r3vkCHH","e6e4zJIqXi","Vprf28TxD7","FjHXRS2Dfu","XflUqpiJSk",
+"GWqqXBFkb8","IRh48t98iW","ZuDtDn8pJ9","tuDySlCMxy","BbwgAWaim6","aL6AJ64s8N","BGaQYhYBCK","0h1b1aL6AJ","zz4ZUK4GS8","FVMxoprNT6",
+"tlILtQbxXc","BGaQYqUJMd","Zv7z0VLTy6","VIlwPwDajX","qaofN8TxD7","RpBQmAkKTk","iKqhraez9y","CNHmvOz8yZ","CdyBVjeskS","hi5X7soy9t",
+"cL0aEEOE1o","BCxeCyEfy9","soy9tcmXIX","QnJ1Ss4786","EdBKcGXdoH","In3NSQworu","7fKYUKASQ8","pT8wuNxx9V","uQIcz9iGoT","jeskSRmDcr",
+"zHF1q7X3uy","Z4I1vB3qem","a00b55drc6","7Ow5C1j5L8","2hEEUmX2GE","OxWIHxciqp","vkCHHMmKGJ","Dz1R3zmLYD","7X3uy7lUXZ","PYBf424ARF",
+"lkMUAJXljW","v2eC3pmeCd","Gv3FqWaim6","qaofNL7cGc","SbRYyb29RJ","sx5GlQ6Lix","0BmCyOz8yZ","Cfgr3suY4x","AXpwEYOfrY","OUYuF0YAGH",
+"fLNg8FVMxo","n1pmOUlU3M","Twanodpe1v","OUqFMvkCHH","uupzkIBe8k","4QMc9h1zcH","qaofNi3pyd","lkMUANOHsz","QClRLGv3Fq","EdBKcsqVrf",
+"zqH0WSWfou","KZamHkB5nP","0YAGH8FmFH","zz4ZUjtn0X","L7cGcNo0Qb","MojnPtl72W","VjCZqAgJHQ","K4GS8jS1aj","3weIFrhl0J","he9IAJ2mQi",
+"Z4I1vcL0aE","prNT6x3LDe","cL0aECdyBV","ZuDtDyluBx","yvOMIReKEW","BpYhV5Namm","yluBxPb1pa","aL6AJbgJAz","AOgEei3pyd","BpYhV16lHc",
+"AIYUuuN6r3","hUTw78RCUA","guMb8kZANm","9iGoTqaofN","8U2nUVLTy6","EOE1o07n1c","fmIK1RBhp0","pv0i7fFDrJ","jSjS3MmsIo","he9IAL7cGc",
+"CIShGfaHir","rz7Ut7ku1p","jiVBP45cIH","YOfrYWDVWJ","HP433t98iW","e6e4zgdQsS","cQOnvuLtKs","zz4ZUMmKGJ","hi5X7AOgEe","cQOnvv2eC3",
+"AXpwE9rlg9","X6PinO3iyQ","bZLvSLewvM","Oz8yZmz8gx","F6PT25IhmG","AmdQdYOfrY","48cHLy94nw","gjUTujiVBP","aL6AJ5nmWv","GWqqXVerEA",
+"yofH37X3uy","JXljWMkgy8","he9IA7fKYU","sqVrfvkCHH","NAFuw5Namm","8xEKzCdyBV","WaWsvzY1GY","C2IrclpF6W","O3iyQSjskQ","VLTy6BCxeC",
+"X6PinWaWsv","djsrvGXdoH","45cIHfLNg8","XyPZNlj07Q","X6PinQYxC0","CxVEf9eoRc","3otm6fcwDa","9y4lwQChxs","uJScXogLgc","s93Mlmz8gx",
+"2DREsprNT6","MezSWiKqhr","3otm629QAz","LbRTHIjTwP","tjQxsVprf2","i3pydOHaBz","0MR5XpiJSk","SbRYyWPmlx","55rfBk85Ae","6q6L9XyPZN",
+"SmGzvHP433","WPmlx5IhmG","EdBKcStlDJ","n1pmO0YAGH","wiHrZ9rlg9","hUTw7In3NS","5Nammv1Hln","Ul4a1ni2v1","VBjhzqUJMd","0BmCyn8pJ9",
+"lViBvwiHrZ","hi5X7t98iW","RkQkeuLtKs","QworuyEfy9","MK07Yo8Uyd","K4GS85nmWv","yToGWbZLvS","RpBQmVLTy6","xXTI4Pb1pa","zQt6QW3VFH",
+"ECMvUDG4sT","Chuy35Namm","8hJdtOUYuF","faHirtaOXK","M3zXLAXpwE","vOqCEtjQxs","soy9tMojnP","b29RJtvdkD","Uvlv4gf8rI","Cfgr348cHL",
+"MmKGJulk41","yToGWW7cTs","DcpWBpWiOs","oQ87r5Namm","YjB9t1LB1L","zbIYYNo0Qb","P6bcg48cHL","RpBQmPYBf4","07n1cS77LH","aDGtSB3qem",
+"Nxx9VqaofN","0KyfslXFOB","2hEEUQYxC0","AOgEeCqqaD","C2IrcvkCHH","jeskSCfgr3","JRJQBSjskQ","nFqikiqv4k","ECMvU7Ow5C","MezSWqUJMd",
+"4dEz6XflUq","Ul4a11j5L8","ydG8UPb1pa","29QAzAmdQd","0MR5XpAhR1","dhSuH2DREs","gf8rICK5W7","EdBKcCdyBV","In3NSK4GS8","FhtglpmeCd",
+"24ARFFxX9q","XflUq580YD","I7p2aqUJMd","IjTwP07n1c","SjskQQChxs","uN6r3RpBQm","Zv7z0HRxd8","W3VFHogLgc","lweGypFrrl","gtCA5i7WMQ",
+"7Ow5C5Namm","k85Aedpe1v","JXljWRkQke","Ta8f6TCgPp","Vprf24QMc9","0YAGHChuy3","d85a9qUJMd","FNYIMfqypy","P6bcgPYBf4","Yf2EcaDGtS",
+"7Ow5CpT8wu","uAWypzQt6Q","QYxC0RkQke","FxX9q0Wr5y","t98iWYOfrY","Pb1paqUJMd","RkQkeSmGzv","uAWypVprf2","QWxoTRxrsm","nFqik9rlg9",
+"2DREsMmsIo","6q6L9TCgPp","suY4xtuDyS","S77LHJRJQB","BFkb8hE1Ql","d85a9cmXIX","uQIczIn3NS","QClRLIjTwP","t59lR2Yz7E","TCgPpt98iW",
+"GSQwjx3LDe","s93MluTacx","MmsIo07n1c","0h1b1GrDg7","5iGN5zQt6Q","uN6r3FjHXR","WPmlxi7WMQ","aFFssSbRYy","OUqFM2Yz7E","FwEJzvOqCE",
+"tAOsrMezSW","HlUbFX6Pin","lCMxyO3iyQ","0h1b1SmGzv","BGaQYkB5nP","ZUnqt6q6L9","xciqp55rfB","VjCZqBFkb8","OHaBz5iGN5","iwzGkQssNC",
+"atef2ogLgc","Yw2oU7X3uy","9y4lwt98iW","aFFssIjTwP","9XyT9jS1aj","24ARFOUYuF","6AFT0QbxXc","tAOsrQChxs","aFFssFGzgp","O3iyQThjNn",
+"LewvMzqH0W","IjTwP9eoRc","cQOnv8TxD7","ix74rZzJHW","PYBf4pmeCd","RpBQm6AFT0","S2DfuVNCPd","ydG8U14FLR","FPfSE5Mg9r","djsrvoVQp6",
+"dhSuHpv0i7","hSSvQjfREu","hSSvQK20wK","ciuWzW7cTs","WreyPZJTXH","IKxdL4W0Tl","StlDJSs0Zu","mX2GEpT8wu","OUYuFzQt6Q","POUYS580YD",
+"QClRLLDk6f","9y4lwxReec","FwEJzazIWp","WDVWJRxrsm","WmadAgjUTu","zQt6QY1mC0","RACujGWqqX","OHaBzMK07Y","fLNg8DcpWB","FcWrWWaim6",
+"QClRLlweGy","QnJ1SmX2GE","RzaZA7lUXZ","mX2GECxVEf","VerEAOUYuF","fqypyfLNg8","BbwgA8RCUA","ZhwG107n1c","VerEAuQIcz","FPfSEFPfSE",
+"QssNCksJby","Yh1hFBFkb8","KZamHAgJHQ","qaofNCIShG","RmDcrZhwG1","uN6r3KsjRK","gtCA5WreyP","dQ586ciuWz","iqv4kwiHrZ","WreyP5VZjS",
+"zY1GYqaofN","lkMUAxReec","RsQUqW3VFH","FjHXR618Di","zFgtBAXpwE","FxX9qLewvM","t98iWb29RJ","GXdoHG1RhS","rKDLJtaOXK","bgJAzd7vjM",
+"RxrsmogLgc","0PktIyluBx","5NammAmdQd","UlU3MlweGy","JKWYRlm0pD","9GXkXvLsmS","VjCZqQWxoT","oVQp6wiHrZ","xciqpCfgr3","Yh1hFciuWz",
+"d7vjM8hJdt","KsjRKpAhR1","i3pydjSjS3","dpe1vyluBx","In3NSiqv4k","2DREs8TxD7","uoStw4dEz6","OHaBzd85a9","M3zXLtuDyS","0Kyfs5nmWv",
+"uJScXY1mC0","a00b55Namm","zmLYDmz8gx","S77LHTwano","tjQxsjeskS","jiVBP0PktI","bZLvS29QAz","8RCUA24ARF","qQxHPNhXdu","RpBQmcmXIX",
+"9GXkXrKDLJ","7fsYM9y4lw","GWqqXvkCHH","VLTy6LbRTH","rhl0JHRxd8","FxX9qo8Uyd","brhlQIn3NS","3weIFvLsmS","64s8NB3qem","3otm6hSSvQ",
+"9iGoTZhwG1","2Yz7EIjTwP","prNT6aL6AJ","1LB1LAgJHQ","16lHc0BmCy","zHF1qS77LH","rhl0JfFDrJ","v8yFNAXpwE","In3NS0MR5X","WmadAiwzGk",
+"OHaBzRkQke","X6Pin5ZaEz","CqqaDoQ87r","zqH0WuTacx","0KyfsFcWrW","s93MlNcICA","lj07QuoStw","n8pJ9aDGtS","dhSuHtaOXK","RzaZAk85Ae",
+"5Mg9re6e4z","MmKGJHRxd8","dQ586cShY2","EdBKcuTacx","Yf2EcyofH3","zY1GYaFFss","NhXdu1j5L8","55rfBiqv4k","29QAzReKEW","9XyT9tvdkD",
+"gjUTuEdBKc","Ss0ZudhSuH","v2eC3hE1Ql","QChxsFLsph","oQ87rU3yw5","29QAz24ARF","i3pyd3weIF","zHF1qm4bxU","QbxXcEoToP","SWfouRsQUq",
+"ydG8UlXFOB","tuDySulk41","CK5W75Namm","LDk6fyluBx","tlILt580YD","gjUTuRmDcr","AOgEedhSuH","FVMxo24ARF","k85Aet98iW","8RCUAFGzgp",
+"MmsIo7fKYU","fcJOyMGlTF","mX2GElCMxy","07n1cK20wK","FPfSEix74r","hE1Qls93Ml","AgJHQiwzGk","FjHXRKsjRK","xXTI47X3uy","LbRTH8FmFH",
+"Q6LixGSQwj","tvdkDVLTy6","0ao3lZJTXH","7ku1pzHF1q","HfyNQ64s8N","RsQUqSjskQ","TCgPpbrhlQ","qQxHPpvgjS","lweGyQnJ1S","ogLgcxciqp",
+"MezSWzmLYD","vOqCE3otm6","FwEJzIn3NS","4W0Tl0ao3l","JRJQB8TxD7","a00b5fcwDa","dQ586bZLvS","Q6hMClj07Q","xciqpjtn0X","07n1c4QMc9",
+"580YDSmGzv","gIYvElXFOB","LDk6f0PktI","gtCA5ix74r","No0QbTXQ0Z","pmeCdJKWYR","iKqhr5Drn0","Pb1pat98iW","Zv7z0fcJOy","4QMc9e6e4z",
+"OHaBzK20wK","JIqXiwDajX","HzZT8m4bxU","ksJby07n1c","wiHrZZJTXH","KZamHhYBCK","LbRTHWaim6","CK5W7BFkb8","7X3uyZuDtD","blLA9uPX7G",
+"lweGy0YAGH","8FmFHPb1pa","vkCHHUvlv4","yToGWydG8U","iB08luAWyp","CK5W7Mm8si","FxX9qgjUTu","5ZaEzGSQwj","o8Uyd6q6L9","uTacxbZLvS",
+"e6e4znFqik","UlU3M5drc6","FnPFBS77LH","fFDrJP6bcg","bZLvSnlaBy","Mm8sicShY2","zY1GYvOqCE","NOHsz9y4lw","MGlTFaFFss","S2DfuXyPZN",
+"EoToPi3pyd","64s8Nni2v1","fmIK18xEKz","0YAGHfmIK1","8cVD3v2eC3","sqVrfHRxd8","cmXIXCqqaD","jSjS3yToGW","LbRTH07n1c","fqypybgJAz",
+"CK5W7zz4ZU","1v5hHCfgr3","HRxd8FnPFB","JIqXivkCHH","WreyPP6bcg","7fKYUiwzGk","3weIFtjQxs","WMiS3HP433","tjQxsQClRL","uQIcztaOXK",
+"JKWYRDLhzM","GXdoHyvOMI","tlILtIjTwP","GWqqXHlUbF","fcJOyIjTwP","RmDcrStlDJ","8cVD32hEEU","RpBQm8xEKz","fFDrJcQOnv","ZuDtDjSjS3",
+"pvgjSMkgy8","5iGN5L7cGc","aDGtSoQ87r","XflUqlm0pD","ZUnqtJIqXi","QworugdQsS","VerEAJ2mQi","rhl0JZuDtD","J2mQiaDGtS","C2IrcSmGzv",
+"hi5X7OUqFM","K20wKtuDyS","pT8wuQWxoT","s4786FFDui","jiVBPM3zXL","ECMvUnlaBy","atef2HlUbF","Mm8siZuDtD","l83UdKASQ8","fFDrJpmeCd",
+"hi5X7BFkb8","8cVD30h1b1","2DREsd7vjM","QssNC5iGN5","L7cGct98iW","wDajXmz8gx","8TxD7LDk6f","3weIFJRJQB","BGaQYNo0Qb","VNCPdWDVWJ",
+"WaWsvJKWYR","SjskQlsQGo","FNYIMhE1Ql","0Wr5yCK5W7","MGlTFvLsmS","3weIFlH1kt","SmGzvCp3mZ","fLNg8fcJOy","taOXK55rfB","QChxsNAFuw",
+"Chuy3aDGtS","ix74rwDajX","6AFT0uJScX","Nxx9VvkCHH","OUqFMaL6AJ","5NammCp3mZ","HzZT81v5hH","FLsphv1Hln","zqH0WKASQ8","8TxD7I7p2a",
+"QChxsS77LH","XflUqpmeCd","euZA50BmCy","OHaBzThjNn","K4GS8DG4sT","B3qemoVQp6","lCMxyMm8si","iB08l3otm6","5nmWvru4UG","S77LHCqqaD",
+"W7cTsMezSW","GrDg74dEz6","zQt6QIKxdL","QClRLdhSuH","ciuWzZv7z0","MGlTFfqypy","zqH0WpmeCd","7hyVvnnP8o","HP433ZUnqt","hSSvQS77LH",
+"d85a9MojnP","uTacxhe9IA","v2eC3mX2GE","No0QbpAhR1","e6e4zS2Dfu","Nxx9VMGlTF","TXQ0ZNo0Qb","l83Udi3pyd","LewvMUl4a1","KZamHzHF1q",
+"618DifFDrJ","i7WMQGWqqX","1LB1LmX2GE","2ZHdkhSSvQ","X6Pino8Uyd","7fKYUEoToP","AmdQd5IhmG","4W0TlIjTwP","ni2v18RCUA","5IhmGuLtKs",
+"9GXkXThjNn","7fKYU0PktI","Yh1hF3weIF","uQIcz5Mg9r","CK5W7uQIcz","iwzGkHzZT8","zbIYYJIqXi","ydG8UPOUYS","fFDrJYjB9t","4QMc9Y1mC0",
+"faHirjtn0X","zFgtB4W0Tl","tuDySCfgr3","i3pydqQxHP","0MR5Xix74r","WmadA0Wr5y","oGu6xwiHrZ","CqqaDzFgtB","5Mg9rFxX9q","zFgtB07n1c",
+"K4GS8cmXIX","QYxC0LewvM","ix74ruupzk","HzZT8vkCHH","s93Mlb29RJ","tvdkDXyPZN","uAWypuQIcz","SWfou8U2nU","KsjRKKASQ8","RmDcrWreyP",
+"I7p2ajiVBP","TXQ0ZHfyNQ","Yw2oUJXljW","2Yz7Ezz4ZU","tjQxsFNYIM","o8UydBGaQY","EoToPDLhzM","lXFOBcShY2","e6e4zEdBKc","4dEz68U2nU",
+"ZJTXH0BmCy","5Mg9rGrDg7","9iGoTUl4a1","yToGWzz4ZU","s4786d85a9","0MR5XhUTw7","CK5W7azIWp","MGlTF7fKYU","d7vjMS2Dfu","Nxx9Vd7vjM",
+"prNT6AkKTk","HRxd8gf8rI","EoToPHlUbF","580YD0Kyfs","l83UdCxVEf","XflUq0YAGH","QClRLFLsph","wiHrZh1zcH","Ul4a1xReec","W3VFHHP433",
+"oVQp6ThjNn","UmaEv0Kyfs","hYBCKPOUYS","FVMxohSSvQ","GXdoHD6rBy","qaofNnnP8o","euZA5fqypy","FPfSEfcwDa","GrDg7guMb8","x3LDe5IhmG",
+"9XyT9ThjNn","U3yw5qUJMd","HfyNQ7Ow5C","jiVBPMK07Y","JkzUnZzJHW","ydG8UbgJAz","0ao3lpAhR1","lCMxywiHrZ","aFFss8RCUA","Yh1hFVjCZq",
+"Y1mC0618Di","CqqaDK20wK","zqH0Wo8Uyd","uvf7ALDk6f","X6PincShY2","24ARFprNT6","djsrvRpBQm","tAOsrm4bxU","faHiruvf7A","X6PinZJTXH",
+"Q6hMC9iGoT","1v5hHQClRL","WreyPG1RhS","uupzk5IhmG","FjHXRqQxHP","CxVEf5Drn0","v8yFNWaWsv","azIWpx3LDe","cShY2SmGzv","hUTw7LbRTH",
+"Ss0Zu9y4lw","azIWpcQOnv","RBhp0Twano","HRxd82DREs","ydG8UVjCZq","1LB1LcmXIX","tuDyS0PktI","K20wKuTacx","i7WMQ4dEz6","zY1GY5nmWv",
+"MaJQsvkCHH","55rfBDG4sT","rz7Ut55rfB","okgRi5ZaEz","FFDui7ku1p","i3pydBGaQY","Waim60MR5X","8cVD3FxX9q","9XyT9HzZT8","fcJOy5VZjS",
+"FVMxoVLTy6","DQimpqUJMd","jeskSCqqaD","h1zcH9rlg9","b29RJVerEA","O3iyQD6rBy","ni2v1VjCZq","qUJMdX6Pin","KASQ8tuDyS","WaWsvs93Ml",
+"jzUqRjSjS3","7lUXZVLTy6","DcpWBSjskQ","8hJdtdpe1v","v8yFNYw2oU","8xEKz2ZHdk","VLTy607n1c","t59lRMkgy8","ru4UGlsQGo","TXQ0ZSWfou",
+"KASQ8jzUqR","OUYuFWaWsv","Chuy3Dz1R3","S2DfuVerEA","he9IAuZPqg","okgRi6AFT0","5IhmGK4GS8","5ZaEzlm0pD","FPfSEcL0aE","ZuDtDSbRYy",
+"AkKTkjzUqR","xXTI4y94nw","9GXkXfaHir","rKDLJOUqFM","t98iWYf2Ec","XflUqlH1kt","WreyPwDajX","UmaEvU3yw5","fmIK1okgRi","ReKEWcmXIX",
+"LbRTH580YD","hE1QlMm8si","iB08lDG4sT","lkMUAgIYvE","IjTwPFcWrW","uTacxZ4I1v","v8yFNlViBv","JkzUno8Uyd","oQ87rNhXdu","oGu6xNxx9V",
+"618DiGv3Fq","HzZT8ZuDtD","5ZaEzFxX9q","RxrsmIjTwP","GWqqXZJTXH","FwEJzZv7z0","ZUnqtkB5nP","n1pmOI7p2a","Y1mC0tAOsr","DQimpatef2",
+"o8UydwiHrZ","2Yz7EqaofN","dpe1vtAOsr","BbwgAx3LDe","WmadAReKEW","B3qemgdQsS","TCgPp8hJdt","pT8wunnP8o","hUTw7jSjS3","s7MxkWPmlx",
+"FGzgp5Namm","VerEAQChxs","lCMxySWfou","29QAzPb1pa","16lHcRzaZA","Dz1R3tjQxs","uJScXjzUqR","SbRYy9iGoT","tl72Wjtn0X","hi5X7YjB9t",
+"a00b5a00b5","uTacxrz7Ut","Q6LixMojnP","s93MllkMUA","QbxXcF6PT2","JJs5mUmaEv","cShY2QClRL","CNHmvciuWz","9eoRc5IhmG","5nmWvHlUbF",
+"gIYvERACuj","5ZaEzRsQUq","ECMvUbrhlQ","7fKYUWreyP","m4bxUnlaBy","lCMxyzY1GY","pT8wu5iGN5","5Nammru4UG","FGzgpXflUq","lsQGo55rfB",
+"jzUqRlweGy","lweGyzY1GY","MojnPY1mC0","qUJMdzHF1q","lpF6WZzJHW","3weIFGWqqX","G1RhSAmdQd","DG4sTLewvM","FPfSEyToGW","MaJQsECMvU",
+"2TRI7S2Dfu","uAWypW3VFH","AXpwEYjB9t","K20wK0h1b1","pAhR1cQOnv","ZJTXHZhwG1","s93Mlpv0i7","a00b5cQOnv","Qworum4bxU","taOXKDG4sT",
+"fLNg8XflUq","gdQsSTwano","L7cGcVerEA","uN6r35VZjS","oGu6xL7cGc","uN6r3uoStw","zz4ZU16lHc","8cVD3KZamH","RmDcrThjNn","d7vjMvOqCE",
+"s4786RpBQm","HzZT8oQ87r","tjQxsFnPFB","suY4xUl4a1","BCxeCBFkb8","RmDcrsqVrf","s4786KsjRK","uAWypzbIYY","pmeCdwDajX","n8pJ9fcJOy",
+"ksJbyPYBf4","QClRL1j5L8","cShY2TXQ0Z","aL6AJ1v5hH","rhl0JfcwDa","jtn0Xpv0i7","s93Mlaez9y","48cHLguMb8","faHiruAWyp","pvgjS45cIH",
+"PYBf4FjHXR","0YAGHxReec","M6qcGAOgEe","0h1b1pT8wu","GWqqXi7WMQ","yofH3VNCPd","AkKTkfcwDa","yEfy96q6L9","48cHLQ6hMC","SjskQS77LH",
+"bgJAzn8pJ9","vLsmSTa8f6","JRJQBUlU3M","e6e4zGWqqX","aez9ytvdkD","Ta8f6o8Uyd","tjQxsuLtKs","DG4sTpmeCd","6AFT0uvf7A","FNYIMt98iW",
+"2NslmwDajX","pAhR1ix74r","9y4lwxXTI4","x3LDeJXljW","GWqqX2TRI7","kB5nPzmLYD","soy9td7vjM","NAFuw2hEEU","zY1GYFNYIM","9iGoTQClRL",
+"RpBQm7hyVv","HP433WPmlx","FPfSEVNCPd","hUTw7okgRi","Ta8f65VZjS","tjQxsKsjRK","DQimpaDGtS","CdyBVe6e4z","JkzUnYw2oU","StlDJn1pmO",
+"ix74rulk41","FFDuiaL6AJ","618DilweGy","fcJOyK4GS8","QworuFGzgp","v1HlnuN6r3","QssNCSjskQ","hi5X7IjTwP","IBe8kv1Hln","VLTy6ni2v1",
+"7ku1pJXljW","HP433vOqCE","ni2v1uLtKs","gdQsS29QAz","5ZaEzZJTXH","zFgtBYjB9t","n8pJ9l83Ud","tl72WK20wK","6q6L9hE1Ql","FnPFBCdyBV",
+"BFkb8FFDui","zY1GY2TRI7","iB08lZ4I1v","uupzkb29RJ","qaofNQChxs","euZA5HzZT8","NAFuwLewvM","suY4xThjNn","7lUXZ48cHL","0Wr5yUmaEv",
+"nnP8ofLNg8","vOqCEdmoS7","Gv3FqyEfy9","FGzgpzY1GY","fmIK1lpF6W","In3NSWreyP","l83UdjfREu","7lUXZvLsmS","tl72WMGlTF","e6e4zk85Ae",
+"8cVD3LDk6f","EOE1ogjUTu","Cp3mZmz8gx","ni2v1I7p2a","ZzJHWyofH3","pFrrlzQt6Q","lpF6WjfREu","C2IrcokgRi","BGaQYU3yw5","bZLvSlsQGo",
+"l83Ud8RCUA","MK07Y8TxD7","soy9tgIYvE","jeskStjQxs","VIlwP7fKYU","ReKEWuQIcz","3weIFyofH3","dQ586YOfrY","4W0Tld85a9","Gv3FquQIcz",
+"GXdoHYjB9t","aDGtSKZamH","0KyfsTa8f6","FnPFBs7Mxk","ZJTXHkZANm","NcICAfaHir","QWxoT7fKYU","fFDrJSjskQ","dhSuHyofH3","xXTI4DG4sT",
+"qUJMd0ao3l","vOqCEEdBKc","SmGzvoQ87r","lkMUAnlaBy","dpe1vVLTy6","U3yw5iB08l","FhtglHRxd8","Q6hMCKASQ8","tAOsrC2Irc","dhSuH1v5hH",
+"tuDyS7ku1p","P6bcgAIYUu","i3pydv8yFN","OHaBzcmXIX","8TxD7e6e4z","djsrvYf2Ec","LewvMRzaZA","0KyfsQ6hMC","JkzUnrhl0J","uLtKs7X3uy",
+"IKxdLiB08l","gdQsSCK5W7","1j5L8d7vjM","7X3uyuAWyp","lH1ktd85a9","fcwDaVBjhz","5Mg9rWDVWJ","UlU3MPOUYS","AkKTk0h1b1","CdyBV5Drn0",
+"6q6L97hyVv","14FLRMm8si","d85a9QbxXc","gtCA5dQ586","VjCZqQ6hMC","e6e4zuN6r3","0Wr5yZhwG1","U3yw52ZHdk","QChxsfmIK1","3weIFF6PT2",
+"iB08le6e4z","Dz1R3ZJTXH","aL6AJsoy9t","9y4lwlCMxy","rz7Ut16lHc","4dEz6piJSk","NhXducmXIX","hUTw7SbRYy","bgJAzlsQGo","G1RhS64s8N",
+"DQimpuTacx","5VZjStaOXK","cQOnvx3LDe","azIWpdmoS7","VLTy6EoToP","2NslmhYBCK","1v5hHRkQke","pmeCdru4UG","rz7UtXyPZN","AIYUu2hEEU",
+"RzaZAM3zXL","x3LDeaFFss","Yw2oUAmdQd","azIWpFcWrW","gIYvE7fsYM","9iGoTReKEW","xReecSmGzv","v1HlnIn3NS","9eoRcrz7Ut","Vprf2v2eC3",
+"EoToPFcWrW","zz4ZUbgJAz","QClRLYjB9t","NhXdudjsrv","7fsYM6AFT0","hE1Qlk85Ae","b29RJ580YD","oVQp6pAhR1","0BmCyblLA9","Vprf25Mg9r",
+"PYBf4Uvlv4","2hEEUtaOXK","Ul4a1zY1GY","EOE1o7ku1p","Yh1hFtuDyS","16lHcU3yw5","CqqaDLewvM","tl72Ws7Mxk","RBhp0atef2","XflUqnFqik",
+"tjQxsJIqXi","CK5W7Zv7z0","5NammDLhzM","YjB9t07n1c","W7cTslCMxy","0Wr5ysqVrf","CIShGfcJOy","kB5nPKASQ8","48cHLlH1kt","CNHmvVIlwP",
+"cL0aEni2v1","brhlQIjTwP","QClRLBbwgA","RpBQmVerEA","aFFsshe9IA","s93Ml0PktI","QClRL618Di","pFrrl7X3uy","NOHsz8FmFH","s93Ml2TRI7",
+"2ZHdk55rfB","Rxrsmb29RJ","bgJAzlj07Q","iwzGkrhl0J","jtn0Xni2v1","qQxHPuvf7A","F6PT2mz8gx","ru4UGSmGzv","uQIcz2hEEU","FNYIMZJTXH",
+"uAWypfqypy","C2Irc2hEEU","Yf2EcOUYuF","bgJAzjtn0X","5Drn0tvdkD","zbIYY16lHc","POUYSQClRL","qaofNgdQsS","WreyPhUTw7","FjHXRiKqhr",
+"MmKGJuTacx","LDk6fzFgtB","16lHcKZamH","uPX7GWaim6","uQIczs7Mxk","VLTy6AOgEe","K20wKbgJAz","AgJHQtl72W","jSjS3he9IA","y94nwWmadA",
+"QbxXcC2Irc","DQimppT8wu","zbIYY9eoRc","t98iW7lUXZ","s4786gtCA5","ulk41EOE1o","No0Qbulk41","IjTwPCxVEf","3weIFa00b5","DLhzMoVQp6",
+"SbRYydmoS7","8U2nUBbwgA","v8yFN8cVD3","hYBCKFjHXR","Nxx9Vlm0pD","e6e4z8xEKz","cL0aENcICA","RxrsmD6rBy","S77LHdjsrv","RsQUqv8yFN",
+"lCMxy4dEz6","2Yz7EyluBx","D6rBygIYvE","lj07QvkCHH","AmdQd8TxD7","uvf7Arhl0J","iwzGkTXQ0Z","WmadAoVQp6","7X3uyPOUYS","Yw2oUoGu6x",
+"8U2nUlkMUA","wiHrZMkgy8","KZamHaFFss","taOXK5Namm","Nxx9VYjB9t","zHF1qJXljW","lXFOB7X3uy","AmdQdt59lR","J2mQiJJs5m","7fsYM5ZaEz",
+"SjskQGrDg7","RsQUqXflUq","8hJdt0ao3l","2Yz7Ev1Hln","5NammzY1GY","Oz8yZbrhlQ","Cfgr3cQOnv","SjskQ3otm6","5drc6RBhp0","EdBKc0Wr5y",
+"WreyPJJs5m","0PktI5iGN5","7fKYUECMvU","ZuDtDlkMUA","pT8wupv0i7","VjCZq24ARF","KZamHY1mC0","iKqhr8cVD3","29QAzsx5Gl","0MR5XCIShG",
+"uupzklsQGo","RACujJJs5m","jzUqR8xEKz","3weIFW7cTs","ZUnqtlH1kt","piJSkEOE1o","sqVrfjzUqR","Chuy3lH1kt","9y4lwfaHir","jzUqR7X3uy",
+"4dEz6No0Qb","SmGzvSbRYy","AXpwEaL6AJ","vkCHHmz8gx","n8pJ9SmGzv","9XyT9iqv4k","24ARFEoToP","fFDrJpvgjS","tuDySBbwgA","ZUnqtfcwDa",
+"o8UydFhtgl","Cp3mZUvlv4","uJScXjSjS3","t98iW5Namm","QnJ1SAOgEe","BbwgAfqypy","U3yw5Fhtgl","b29RJMezSW","he9IAEoToP","LewvM5VZjS",
+"Dz1R3VNCPd","2DREsbrhlQ","Kr8ys0BmCy","DcpWB8TxD7","qaofNpiJSk","0MR5Xsx5Gl","xXTI4atef2","v1HlnAOgEe","VBjhzoGu6x","uupzkIn3NS",
+"uN6r3ZhwG1","fLNg8IRh48","qaofNwDajX","pv0i7QssNC","BFkb8NhXdu","45cIHRzaZA","Z4I1vd85a9","Cfgr3tuDyS","ZUnqt45cIH","580YDTa8f6",
+"qQxHPn8pJ9","lj07QfLNg8","guMb8pFrrl","zz4ZUBGaQY","UlU3MpWiOs","1j5L8I7p2a","W3VFHGv3Fq","qQxHPyEfy9","WDVWJYOfrY","CxVEfgIYvE",
+"lpF6W4W0Tl","7hyVvb29RJ","IBe8kbZLvS","xReec580YD","1LB1LbrhlQ","FPfSEVLTy6","9GXkXJXljW","yluBxpT8wu","RkQkeh1zcH","7hyVvprNT6",
+"0ao3lhSSvQ","CxVEfsoy9t","0KyfsFhtgl","3otm6GWqqX","ZuDtDiwzGk","X6Pinv8yFN","S2DfuW7cTs","b29RJWaWsv","3weIF5nmWv","yToGWMaJQs",
+"FNYIM3otm6","RBhp0NcICA","xReec9GXkX","IKxdLoQ87r","6q6L9TXQ0Z","ru4UG5Mg9r","HlUbFLbRTH","CIShGpiJSk","nlaBytvdkD","ThjNnTwano",
+"Dz1R3POUYS","NcICAdmoS7","uAWypQWxoT","GSQwj5Namm","JIqXiuPX7G","pT8wuVLTy6","cQOnvECMvU","P6bcgFwEJz","wDajXuLtKs","IBe8kuJScX",
+"vOqCEG1RhS","WaWsvBGaQY","gdQsSQbxXc","iqv4kpT8wu","rhl0JECMvU","lViBvvOqCE","OHaBzoGu6x","s93MlmX2GE","I7p2a8RCUA","faHirK4GS8",
+"SbRYyY1mC0","618DiFcWrW","EdBKcDcpWB","BpYhVWPmlx","pmeCduAWyp","prNT6In3NS","iKqhrwiHrZ","SjskQpWiOs","2NslmEOE1o","cmXIXlpF6W",
+"s93Mli3pyd","lXFOBcL0aE","djsrv0MR5X","v8yFNfFDrJ","LbRTHvLsmS","9y4lwCK5W7","zz4ZUFwEJz","QChxsReKEW","zFgtBsuY4x","tvdkDnlaBy",
+"TCgPprz7Ut","RsQUquZPqg","tuDySnFqik","QWxoTCqqaD","RmDcrt98iW","7X3uykZANm","Ta8f6In3NS","B3qemlm0pD","sqVrfYjB9t","YOfrYs93Ml",
+"DQimpuZPqg","zQt6Q16lHc","hi5X7iqv4k","i3pydYf2Ec","zQt6Q8cVD3","i3pydWmadA","5Drn0S77LH","OHaBz9rlg9","5Mg9rVerEA","ix74rMojnP",
+"he9IApFrrl","HlUbF6AFT0","xciqpqUJMd","2TRI7v2eC3","iB08lM6qcG","7hyVvuAWyp","HP433MmsIo","16lHcMezSW","In3NSogLgc","pT8wuU3yw5",
+"7fsYMDQimp","xciqp8xEKz","qQxHPxReec","1j5L8RzaZA","FLsphJkzUn","2hEEUWMiS3","HP4335Drn0","yEfy9Yh1hF","RmDcrPYBf4","azIWpv8yFN",
+"3weIFHP433","dQ5865nmWv","2Yz7EogLgc","fLNg89XyT9","7fKYUGXdoH","TCgPpEoToP","oGu6xlViBv","HfyNQtuDyS","Ta8f6ni2v1","cL0aEGrDg7",
+"Pb1paFnPFB","ReKEWmz8gx","vkCHH5ZaEz","RpBQmRsQUq","WmadAydG8U","8TxD7uQIcz","NhXduD6rBy","suY4xa00b5","5ZaEzKZamH","WDVWJm4bxU",
+"NcICACIShG","QYxC0zqH0W","Pb1paZ4I1v","cShY26q6L9","guMb8BCxeC","he9IAFnPFB","bZLvS5ZaEz","Dz1R3jeskS","16lHcjeskS","ThjNngf8rI",
+"ydG8U0PktI","ni2v10YAGH","gf8rI8FmFH","blLA9BGaQY","nnP8o5drc6","Yh1hFUvlv4","580YDSWfou","gjUTunFqik","QClRLl83Ud","ogLgcpv0i7",
+"Ul4a1UmaEv","2ZHdkOz8yZ","5Mg9rqaofN","Pb1pa2ZHdk","DLhzMOxWIH","yToGWaDGtS","5drc65iGN5","BCxeC8FmFH","oGu6xd7vjM","h1zcH5drc6",
+"okgRiIKxdL","XyPZN5Mg9r","fLNg8Uvlv4","Cfgr3618Di","ni2v1FLsph","FcWrWSs0Zu","K20wKYw2oU","8cVD3Mm8si","Q6LixSmGzv","jeskS8hJdt",
+"AXpwEyEfy9","ECMvUQWxoT","OUqFMIn3NS","ECMvUZzJHW","uPX7Ga00b5","VNCPdeuZA5","NOHsz1LB1L","PYBf4lweGy","P6bcgkZANm","guMb8VerEA",
+"ogLgc3weIF","yvOMI2ZHdk","Mm8siReKEW","CK5W73weIF","0Wr5yv2eC3","BFkb88xEKz","dhSuH0ao3l","FFDuilkMUA","X6Pin2hEEU","BFkb8sx5Gl",
+"EOE1olpF6W","aez9yyToGW","2NslmJJs5m","zbIYYSWfou","ru4UGF6PT2","TwanofmIK1","aFFssRBhp0","M6qcGfcJOy","fqypyfmIK1","Ss0Zuuvf7A",
+"QworuJKWYR","FNYIMogLgc","rz7Ut7fKYU","Ss0ZufcwDa","k85AexXTI4","nnP8obgJAz","Cp3mZlH1kt","AIYUuCqqaD","gtCA5dhSuH","7X3uyD6rBy",
+"LDk6fXflUq","FPfSEHP433","580YDF6PT2","55rfBjeskS","DG4sTFNYIM","vkCHH0h1b1","gIYvEOUqFM","yluBxZ4I1v","fcwDa45cIH","taOXKX6Pin",
+"64s8N14FLR","pT8wu0BmCy","Uvlv4pv0i7","bZLvSgf8rI","i3pydpv0i7","blLA9gIYvE","8xEKzC2Irc","FxX9q5IhmG","CqqaDMezSW","i7WMQpmeCd",
+"lH1ktfmIK1","VBjhzRpBQm","7Ow5CQ6hMC","2ZHdkMojnP","OUqFMC2Irc","v8yFNQssNC","fqypy45cIH","v8yFNni2v1","blLA9C2Irc","piJSkvOqCE",
+"d85a9QYxC0","YjB9thYBCK","7lUXZtl72W","DcpWBv2eC3","cL0aEpmeCd","BFkb8djsrv","s93Ml0YAGH","oVQp6AXpwE","QWxoTEdBKc","OUYuFh1zcH",
+"G1RhSvLsmS","ZhwG1JJs5m","wiHrZkB5nP","ECMvUQssNC","Ul4a1KASQ8","BFkb85iGN5","FxX9qM3zXL","l83UdI7p2a","MmKGJZuDtD","hUTw7UlU3M",
+"WmadAO3iyQ","b29RJ5Mg9r","uoStw0Wr5y","2ZHdkVjCZq","djsrv9XyT9","zY1GYk85Ae","BCxeCMkgy8","CK5W7fcwDa","kZANmjfREu","qQxHPBbwgA",
+"n1pmOGWqqX","Y1mC0taOXK","K4GS8OUqFM","HfyNQFjHXR","ZJTXHGv3Fq","qUJMd5Mg9r","WDVWJ0BmCy","SWfouiwzGk","piJSkix74r","4QMc9v8yFN",
+"ix74r7ku1p","vLsmSFnPFB","iqv4k9XyT9","UmaEvtuDyS","ni2v116lHc","SjskQThjNn","s93MlGWqqX","nlaByMmKGJ","hi5X7Cp3mZ","uN6r38xEKz",
+"n8pJ90YAGH","hSSvQChuy3","Cfgr3PYBf4","yvOMIPb1pa","NAFuwFLsph","KZamHuupzk","mz8gx1LB1L","QChxs8xEKz","pv0i7fmIK1","EoToPVIlwP",
+"atef2uoStw","hYBCKlH1kt","RzaZAprNT6","uAWypIBe8k","M3zXLpvgjS","h1zcHaFFss","RBhp0uAWyp","n1pmOSWfou","Zv7z0Cfgr3","GWqqXOz8yZ",
+"MezSWJRJQB","RsQUqWMiS3","MezSWEoToP","mX2GEiB08l","cmXIXtjQxs","IRh48LDk6f","s93Ml5ZaEz","wDajXQssNC","BGaQYDcpWB","jtn0XjS1aj",
+"JkzUnEOE1o","HzZT8MmKGJ","B3qemzbIYY","UmaEvJJs5m","K4GS8POUYS","IRh485Drn0","4dEz6cQOnv","GXdoHqaofN","ReKEWQworu","pvgjS0Wr5y",
+"K20wKtaOXK","cQOnvMK07Y","Oz8yZKZamH","yvOMIMaJQs","iqv4kGSQwj","3otm67fKYU","0Kyfs7lUXZ","0ao3l2TRI7","24ARFuPX7G","9rlg9FGzgp",
+"MaJQsMaJQs","Z4I1vS77LH","WaWsvsuY4x","aDGtS5IhmG","Z4I1v0Kyfs","jiVBPtAOsr","Zv7z0VBjhz","RBhp0uLtKs","iwzGkzY1GY","VIlwPWDVWJ",
+"dQ586Mkgy8","5ZaEzAIYUu","uAWypP6bcg","zbIYY0ao3l","IRh48Chuy3","hE1Ql7Ow5C","CxVEfydG8U","cL0aE2hEEU","ru4UGWmadA","s4786brhlQ",
+"7Ow5CCdyBV","hYBCK1v5hH","2DREsG1RhS","ksJbyLewvM","GWqqX2Nslm","POUYSSWfou","64s8N2Yz7E","zQt6QS77LH","bgJAzaDGtS","WaWsvnFqik",
+"UmaEvhi5X7","brhlQY1mC0","jtn0X9iGoT","24ARFG1RhS","HRxd82hEEU","0KyfskZANm","Yw2oUMkgy8","rz7UtJkzUn","piJSkv1Hln","NcICALbRTH",
+"rhl0JVerEA","tlILtBbwgA","ZUnqtAkKTk","WPmlxMaJQs","fqypyQClRL","AOgEeuN6r3","d7vjMK20wK","9y4lwQClRL","TCgPpI7p2a","WmadA5iGN5",
+"xReecG1RhS","FPfSEjeskS","ThjNnLbRTH","WaWsvpAhR1","WPmlxh1zcH","HfyNQhe9IA","FwEJzyofH3","S77LHC2Irc","580YDiqv4k","jzUqRFxX9q",
+"In3NSECMvU","qaofN5nmWv","OHaBzlViBv","QClRLQ6Lix","5Mg9rdjsrv","vkCHH2hEEU","S77LHIjTwP","o8UydZv7z0","t98iWjS1aj","FwEJzeuZA5",
+"fmIK1BpYhV","mz8gxfmIK1","Gv3FqY1mC0","AXpwEFFDui","Q6hMC0YAGH","7hyVvM3zXL","StlDJMK07Y","lj07Q8cVD3","6AFT0IjTwP","s93MlUlU3M",
+"CqqaDazIWp","SWfoudQ586","BbwgAWPmlx","FwEJz4W0Tl","5VZjSwiHrZ","F6PT2FVMxo","KZamHi3pyd","OHaBzWreyP","ogLgcRmDcr","RkQkeRBhp0",
+"pAhR1v1Hln","O3iyQhE1Ql","zbIYYWaWsv","tjQxsHzZT8","0YAGHni2v1","azIWppv0i7","lCMxyZUnqt","HRxd8PYBf4","JRJQBjSjS3","OUqFMFcWrW",
+"Z4I1vm4bxU","tAOsroGu6x","LewvMxciqp","55rfBFVMxo","FGzgpuupzk","0MR5XGrDg7","I7p2ao8Uyd","yvOMIDQimp","AXpwEBpYhV","dpe1v29QAz",
+"HzZT8QWxoT","GrDg7zqH0W","Waim6FNYIM","1v5hH5nmWv","XyPZN5nmWv","JRJQBEoToP","WMiS3VIlwP","SWfouD6rBy","lj07Q7hyVv","nlaByFVMxo",
+"n8pJ9h1zcH","AOgEeCK5W7","Cp3mZIRh48","TCgPphe9IA","RmDcriwzGk","SjskQI7p2a","Ta8f6okgRi","In3NS8xEKz","zz4ZU55rfB","PYBf48xEKz",
+"No0QbDcpWB","JRJQBaFFss","IjTwPjeskS","yofH3e6e4z","xciqpLewvM","zFgtBpvgjS","rhl0JbgJAz","uJScXvkCHH","uN6r3Fhtgl","5NammqQxHP",
+"AIYUuiwzGk","jiVBPGWqqX","iqv4kXyPZN","0PktIJJs5m","WreyPNo0Qb","9XyT9Q6Lix","rz7UtEOE1o","Gv3FqCNHmv","DQimpprNT6","sx5GlEoToP",
+"EdBKcazIWp","2NslmkZANm","MmsIoCfgr3","rz7Uty94nw","uvf7AOHaBz","8TxD7he9IA","AIYUusx5Gl","CK5W73otm6","Y1mC0KZamH","he9IARsQUq",
+"6q6L9yvOMI","tl72WFNYIM","8hJdtYh1hF","lkMUAFjHXR","hSSvQWaWsv","OHaBzlCMxy","FGzgplweGy","ZhwG1FnPFB","S77LHUmaEv","CxVEfUvlv4",
+"8TxD7atef2","In3NSZJTXH","9y4lwSjskQ","VerEA6q6L9","Gv3FqFxX9q","NhXduYOfrY","qQxHP7X3uy","jeskSAIYUu","TXQ0ZF6PT2","FPfSEjiVBP",
+"QWxoT8TxD7","uupzkAIYUu","FPfSENo0Qb","Y1mC0prNT6","uZPqgv8yFN","RACuj5iGN5","v2eC3HzZT8","7Ow5CCNHmv","2TRI75iGN5","rhl0JYw2oU",
+"WmadAuN6r3","BpYhVC2Irc","uQIczgjUTu","s7MxkqUJMd","UlU3MvLsmS","5Namm7hyVv","48cHLNcICA","FGzgplj07Q","FLsphaL6AJ","ydG8UNo0Qb",
+"aez9yBbwgA","64s8NydG8U","s7MxkpAhR1","YjB9tHRxd8","Pb1patuDyS","0KyfsMezSW","DcpWBuN6r3","cShY2Cfgr3","azIWpG1RhS","Oz8yZiKqhr",
+"C2Irc4dEz6","uoStwCdyBV","0Wr5yguMb8","Yw2oUJIqXi","In3NSv8yFN","FPfSEblLA9","X6PinCxVEf","pAhR1pvgjS","48cHLogLgc","ulk41blLA9",
+"NhXdu29QAz","bgJAzjeskS","9GXkXe6e4z","v1HlnVerEA","45cIHAOgEe","qUJMdSs0Zu","FwEJzbgJAz","s93Ml5Mg9r","UlU3MZUnqt","EdBKcyToGW",
+"pmeCdhE1Ql","BbwgAsx5Gl","EoToP9y4lw","5IhmGfFDrJ","618DiQYxC0","i7WMQRpBQm","JRJQB55rfB","L7cGcTa8f6","y94nwJ2mQi","guMb88RCUA",
+"8cVD3Y1mC0","NcICA5VZjS","AIYUuDz1R3","580YD618Di","2Yz7EhSSvQ","Yw2oU6q6L9","fqypyNxx9V","dQ586rhl0J","S77LHsuY4x","EOE1oRkQke",
+"B3qemaFFss","ni2v1FNYIM","zqH0WfcwDa","5VZjS5nmWv","4QMc9qQxHP","pv0i7SmGzv","he9IAzFgtB","lweGyZJTXH","KZamHzQt6Q","dQ586yofH3",
+"suY4x16lHc","qUJMdVprf2","RACujAXpwE","lViBvIn3NS","GrDg7he9IA","dmoS7hUTw7","5ZaEzWDVWJ","yvOMIIjTwP","WDVWJZJTXH","n1pmOiB08l",
+"VLTy6vkCHH","7Ow5C9XyT9","WmadAMK07Y","pmeCdhYBCK","UlU3MMmsIo","JRJQBP6bcg","LDk6faL6AJ","djsrvhi5X7","mz8gxOHaBz","gjUTu8FmFH",
+"zHF1q5ZaEz","xReecNhXdu","ZuDtD618Di","sqVrfWaim6","HRxd82TRI7","5drc6pFrrl","ZJTXHaDGtS","7lUXZuJScX","bgJAzVerEA","zHF1qWDVWJ",
+"7Ow5CGrDg7","vOqCElj07Q","zbIYYfcwDa","QWxoTzFgtB","P6bcgv2eC3","G1RhSuvf7A","fFDrJQChxs","h1zcHD6rBy","xXTI4cL0aE","Yh1hFKsjRK",
+"JJs5muQIcz","MK07YZuDtD","BGaQY2hEEU","FVMxolweGy","dmoS7Zv7z0","s7MxkuZPqg","zHF1qpT8wu","CdyBVlm0pD","i3pydokgRi","OUqFMCIShG",
+"RpBQmVNCPd","7hyVvWaWsv","QbxXculk41","ciuWzpT8wu","C2IrcPb1pa","FNYIMReKEW","v2eC3D6rBy","v2eC3Yf2Ec","RmDcr55rfB","OxWIHAXpwE",
+"0PktIs7Mxk","ZJTXHMm8si","AOgEek85Ae","piJSkVerEA","HfyNQEOE1o","hYBCK2Yz7E","RpBQmtl72W","ksJbyjiVBP","MojnP6q6L9","WDVWJUmaEv",
+"0MR5XYOfrY","jtn0XFjHXR","No0QbRpBQm","uoStwPOUYS","uLtKs7lUXZ","POUYSpAhR1","RBhp0faHir","JIqXi7Ow5C","uLtKs5VZjS","AOgEe2hEEU",
+"W3VFHn1pmO","fcJOy1v5hH","bZLvSEOE1o","jzUqRQChxs","tlILtFnPFB","mX2GEStlDJ","RxrsmIRh48","1j5L8aez9y","FLsphjiVBP","QbxXcSWfou",
+"SmGzvprNT6","HzZT8U3yw5","yvOMIEOE1o","8cVD37ku1p","K4GS8M6qcG","J2mQiP6bcg","P6bcgW3VFH","nnP8o2TRI7","5drc6ZJTXH","MGlTFNhXdu",
+"lsQGoWMiS3","In3NSWmadA","pWiOsGv3Fq","24ARF0h1b1","piJSk5Drn0","VIlwPtlILt","iKqhrW3VFH","Yw2oU2ZHdk","nnP8oMezSW","07n1cVNCPd",
+"pT8wuSjskQ","OxWIHfaHir","wDajXLewvM","QChxsl83Ud","DLhzM0Kyfs","l83UdZzJHW","0ao3lNxx9V","bgJAzcQOnv","FnPFB618Di","EdBKcs93Ml",
+"oGu6xHRxd8","7Ow5ClweGy","FxX9qVBjhz","2TRI7d85a9","BbwgAzqH0W","aFFssydG8U","y94nwk85Ae","JKWYRpAhR1","zz4ZUJXljW","AXpwEaFFss",
+"FFDuiSWfou","ZhwG18xEKz","ciuWzQ6Lix","XflUqdQ586","t98iWQ6Lix","S2DfuGSQwj","ECMvUFFDui","RsQUq2Yz7E","5Mg9roGu6x","K20wKo8Uyd",
+"JRJQB7ku1p","zQt6QDz1R3","h1zcHzbIYY","YOfrYVjCZq","TCgPprhl0J","nlaByHRxd8","LDk6fY1mC0","oVQp6HRxd8","C2IrcydG8U","pvgjSBFkb8",
+"tuDySlViBv","yvOMIaFFss","Ss0ZuhYBCK","29QAzvOqCE","SWfouZJTXH","4W0Tl2hEEU","WreyPjSjS3","Zv7z0cQOnv","JJs5mJRJQB","v8yFNB3qem",
+"P6bcgzbIYY","WMiS37hyVv","v1HlnJkzUn","bZLvSjtn0X","FFDuiy94nw","VNCPdIKxdL","QnJ1SIjTwP","pvgjSMezSW","djsrvzQt6Q","VIlwPKASQ8",
+"CdyBVoVQp6","KASQ8YjB9t","5ZaEzrKDLJ","Yw2oUiB08l","JRJQBGrDg7","MmsIoNo0Qb","zz4ZUNOHsz","Oz8yZfcwDa","x3LDehSSvQ","jfREun8pJ9",
+"VNCPdpFrrl","AIYUu5drc6","FLsphs7Mxk","nlaByfcwDa","atef2CqqaD","No0QbCp3mZ","IRh48CxVEf","jfREuTXQ0Z","AIYUuGv3Fq","oVQp6sx5Gl",
+"sqVrfLDk6f","n1pmODLhzM","FcWrWJKWYR","P6bcgThjNn","GrDg7PYBf4","sx5GltuDyS","55rfBcShY2","uTacx0PktI","xciqppFrrl","MojnPPb1pa",
+"cShY2lj07Q","7fsYMCK5W7","7fsYMhYBCK","fFDrJwiHrZ","lViBvKASQ8","5NammFPfSE","DG4sTEoToP","7lUXZ6AFT0","Z4I1voVQp6","B3qemD6rBy",
+"s93MlSmGzv","B3qemHfyNQ","xReecyEfy9","v2eC3CNHmv","8hJdtAmdQd","soy9tQ6hMC","KsjRK0YAGH","29QAzbrhlQ","aez9yzHF1q","IjTwPfcwDa",
+"ZJTXHXflUq","1LB1LjzUqR","i3pydzQt6Q","2NslmAmdQd","VLTy6OHaBz","9eoRchUTw7","9eoRc8cVD3","WDVWJguMb8","vOqCEDz1R3","nlaBy5IhmG",
+"VNCPdlj07Q","O3iyQhSSvQ","tAOsroQ87r","lXFOBP6bcg","JKWYRFGzgp","Cfgr3CK5W7","FLsphGWqqX","lCMxy1v5hH","TCgPpBbwgA","4W0Tli3pyd",
+"FFDuiSmGzv","uAWypTCgPp","L7cGcd85a9","Waim6U3yw5","M6qcGksJby","AXpwE8cVD3","OUqFM7X3uy","Dz1R3DQimp","CK5W7lkMUA","lViBvsx5Gl",
+"2Yz7EKsjRK","KASQ8Y1mC0","K20wKMkgy8","y94nwQ6hMC","uQIczuZPqg","xXTI4zHF1q","7hyVvru4UG","FGzgpRACuj","lXFOBCK5W7","uLtKsD6rBy",
+"5Drn0JXljW","ThjNnZhwG1","580YDksJby","8xEKznnP8o","pWiOs2TRI7","l83UdJkzUn","Pb1pa8cVD3","KsjRKpiJSk","Q6LixAIYUu","9rlg9y94nw",
+"K20wKulk41","EoToP9XyT9","OUqFMaez9y","ciuWzkZANm","vkCHHrKDLJ","HfyNQoVQp6","S2Dfudjsrv","IRh48BFkb8","K20wKk85Ae","v8yFNQbxXc",
+"YjB9tlweGy","guMb8hi5X7","ix74rrKDLJ","9rlg9NcICA","lViBv2Nslm","lCMxyRACuj","nnP8oaez9y","7hyVvBCxeC","FLsphQworu","FNYIMatef2",
+"ZJTXHYh1hF","F6PT28TxD7","lCMxyvOqCE","45cIHFGzgp","jtn0XblLA9","NAFuw7lUXZ","uQIczl83Ud","mz8gx0ao3l","UmaEv5drc6","MK07Y5IhmG",
+"pv0i7nFqik","SmGzvNOHsz","5VZjSEdBKc","ru4UGTCgPp","pmeCdhUTw7","taOXKQ6Lix","s4786fmIK1","WMiS3RACuj","uLtKsDLhzM","vLsmSyEfy9",
+"tAOsrdQ586","TCgPpCp3mZ","S77LH5IhmG","fcwDa1j5L8","0PktIxXTI4","xReecm4bxU","0h1b1qaofN","fFDrJNOHsz","MmKGJfqypy","kZANmgdQsS",
+"HlUbF3otm6","i7WMQn8pJ9","Yh1hF4QMc9","uZPqgIn3NS","7Ow5Ck85Ae","y94nwhE1Ql","hE1QlazIWp","ni2v1StlDJ","Oz8yZi7WMQ","5iGN5O3iyQ",
+"zqH0W2TRI7","TwanofFDrJ","cmXIXBCxeC","cmXIX24ARF","zFgtBrhl0J","zY1GYD6rBy","Oz8yZThjNn","VLTy6TCgPp","QYxC0ZhwG1","QworuQ6hMC",
+"b29RJJRJQB","ksJbyUvlv4","0ao3lzFgtB","FVMxo0ao3l","IKxdL64s8N","Yf2EcAgJHQ","dQ586dmoS7","VjCZqSbRYy","ogLgczHF1q","KZamHCfgr3",
+"lViBv7fsYM","xciqp0Kyfs","yEfy9ZuDtD","s7Mxk9rlg9","1LB1LOxWIH","5nmWv7lUXZ","d85a9dpe1v","soy9tbZLvS","ogLgc7lUXZ","K20wKpvgjS",
+"he9IA0BmCy","ogLgc4W0Tl","X6PinuQIcz","BGaQY29QAz","DG4sT8FmFH","IKxdLCIShG","nFqikNhXdu","fqypylpF6W","29QAz2TRI7","580YDlj07Q",
+"iKqhrh1zcH","1v5hHxXTI4","wDajXIKxdL","CqqaDfmIK1","dpe1vcmXIX","OUYuFaFFss","4dEz6VBjhz","RkQkeZuDtD","AkKTkhSSvQ","CNHmvMojnP",
+"1LB1LC2Irc","Yw2oUs93Ml","SbRYyI7p2a","tAOsriB08l","Ss0ZuVjCZq","soy9tuN6r3","lH1ktjS1aj","gdQsSRACuj","CdyBVulk41","In3NSEoToP",
+"GSQwjS2Dfu","ulk41No0Qb","ogLgcgIYvE","1v5hHTXQ0Z","OUYuFW7cTs","55rfBs93Ml","ru4UGUl4a1","45cIH5nmWv","lH1ktkZANm","vLsmSnnP8o",
+"WaWsvCfgr3","POUYS7lUXZ","K4GS8ulk41","AmdQdcL0aE","OUqFMHP433","0BmCyuoStw","gtCA5guMb8","zmLYDhe9IA","5IhmGTCgPp","JKWYRPOUYS",
+"Uvlv4l83Ud","ydG8UjzUqR","8TxD7hYBCK","qQxHPK4GS8","UmaEvZv7z0","s4786lCMxy","2TRI7zqH0W","7lUXZ5iGN5","ZJTXHCp3mZ","v8yFN0BmCy",
+"pT8wuBpYhV","Cp3mZMezSW","5ZaEzKsjRK","zz4ZUoQ87r","RBhp0F6PT2","StlDJd85a9","Vprf2S2Dfu","iKqhrd85a9","MezSWlViBv","9iGoTBFkb8",
+"bgJAzJRJQB","X6Pin7fsYM","n1pmOFwEJz","XflUqhe9IA","ogLgcgf8rI","FhtglRsQUq","uN6r3soy9t","tlILttAOsr","Z4I1vlH1kt","ThjNnS2Dfu",
+"07n1czFgtB","l83UdX6Pin","hUTw7OUYuF","Oz8yZXflUq","U3yw57Ow5C","CIShGcQOnv","uQIczsuY4x","Pb1papWiOs","AXpwE9XyT9","nFqikBpYhV",
+"7fsYMJKWYR","IjTwPAOgEe","CNHmvb29RJ","aDGtSjtn0X","rKDLJoVQp6","G1RhSfLNg8","Yw2oUMojnP","IBe8kW3VFH","IKxdLpWiOs","2Yz7EMaJQs",
+"8TxD7RmDcr","k85Ae8cVD3","24ARFChuy3","cShY2gjUTu","BFkb87hyVv","Yh1hFCNHmv","ksJby14FLR","Chuy3fcwDa","faHirNcICA","VjCZq8xEKz",
+"KsjRKkZANm","2hEEUfFDrJ","tvdkDfcJOy","3otm6tl72W","NhXdus4786","i3pydHfyNQ","b29RJK4GS8","G1RhSL7cGc","FLsphZ4I1v","P6bcgpAhR1",
+"8cVD3AXpwE","AkKTkM6qcG","BbwgAF6PT2","9XyT9FjHXR","zmLYDjS1aj","CK5W7HlUbF","JkzUnJJs5m","VNCPdlm0pD","5Nammi7WMQ","4QMc91LB1L",
+"DG4sTlm0pD","oGu6xoQ87r","RpBQmv8yFN","GSQwj29QAz","brhlQZ4I1v","45cIHDz1R3","jiVBPZUnqt","TwanoVerEA","JXljW14FLR","W3VFHpmeCd",
+"ydG8UdhSuH","uN6r3uJScX","VIlwP0ao3l","MaJQsKr8ys","8hJdtRxrsm","tuDyS0YAGH","vLsmStl72W","s4786y94nw","29QAzWaWsv","HP433QnJ1S",
+"S2DfuFLsph","s93MlCK5W7","zqH0WYf2Ec","9XyT9xXTI4","he9IAbrhlQ","vLsmSRmDcr","jfREuECMvU","Mm8siMK07Y","8cVD3lpF6W","DQimpYf2Ec",
+"gIYvEKsjRK","zqH0WD6rBy","cQOnv8FmFH","zmLYDEoToP","WMiS3TXQ0Z","dQ586atef2","0PktIm4bxU","In3NSFcWrW","29QAzMK07Y","s47862DREs",
+"14FLRzFgtB","vOqCEP6bcg","LDk6fpWiOs","IRh487hyVv","W7cTs2hEEU","e6e4zhi5X7","24ARF2TRI7","guMb8v2eC3","SjskQ8FmFH","4W0TlM6qcG",
+"yluBxv8yFN","SmGzvdpe1v","brhlQiwzGk","ReKEWqUJMd","IBe8kuvf7A","JkzUnjeskS","RmDcrh1zcH","KASQ8Gv3Fq","7ku1pCfgr3","lsQGo1LB1L",
+"lm0pDFxX9q","LDk6fLbRTH","CIShGEdBKc","07n1c7ku1p","gjUTuOUYuF","CqqaDdQ586","fmIK11LB1L","iqv4kQbxXc","cQOnvCqqaD","uJScXAgJHQ",
+"ZhwG1uAWyp","Waim6jeskS","6q6L94W0Tl","AkKTk2DREs","LewvMMmKGJ","RBhp0StlDJ","cmXIXS2Dfu","HRxd8Fhtgl","FjHXRTXQ0Z","pmeCdaez9y",
+"FnPFBBFkb8","F6PT27Ow5C","JkzUnksJby","OHaBz1LB1L","7hyVvblLA9","QChxsxReec","xciqprhl0J","ogLgcJIqXi","JXljWbrhlQ","WDVWJyvOMI",
+"WreyPM6qcG","a00b5mX2GE","fFDrJ0MR5X","ZuDtDWMiS3","zHF1quPX7G","Ul4a1zz4ZU","jtn0XReKEW","W7cTsMojnP","XflUqB3qem","JJs5m6AFT0",
+"3otm6JkzUn","TCgPppvgjS","uN6r3Oz8yZ","uTacxQ6hMC","QbxXc3otm6","RsQUqt98iW","uupzkh1zcH","Gv3FqhYBCK","yToGWqQxHP","4QMc9azIWp",
+"580YD0MR5X","CqqaDMm8si","jiVBPAkKTk","SmGzvDcpWB","Y1mC0X6Pin","ReKEWbrhlQ","taOXKfcJOy","5NammCdyBV","BpYhVbgJAz","oVQp6Vprf2",
+"d85a9VIlwP","7fKYUMmsIo","RBhp0v2eC3","L7cGctjQxs","3otm6v1Hln","cL0aEb29RJ","FFDuiJRJQB","VerEA1v5hH","OxWIHMojnP","SWfout59lR",
+"wiHrZhSSvQ","vLsmSvLsmS","hi5X7lXFOB","Cfgr3QbxXc","oVQp6U3yw5","55rfBFnPFB","GSQwjd7vjM","F6PT2FGzgp","aez9y7fKYU","ciuWz5nmWv",
+"8TxD72ZHdk","VLTy6MezSW","BFkb8taOXK","AXpwECK5W7","Ul4a1QssNC","lViBvuAWyp","Zv7z0iwzGk","wiHrZgIYvE","MezSWxReec","07n1cUlU3M",
+"sqVrfVLTy6","Vprf2pvgjS","IRh48No0Qb","BCxeCciuWz","HfyNQfmIK1","Mkgy8iKqhr","azIWpBCxeC","No0QbTCgPp","KsjRKeuZA5","TXQ0Z1v5hH",
+"KZamHQWxoT","o8UydOz8yZ","Rxrsm2Nslm","LDk6fpFrrl","aFFsslsQGo","cL0aE1LB1L","7X3uyGv3Fq","DcpWBulk41","FnPFBKASQ8","LewvMZhwG1",
+"2DREsWmadA","IBe8kRxrsm","zbIYYmz8gx","iqv4kqQxHP","Yw2oU8TxD7","WreyPn8pJ9","Ul4a1CK5W7","lCMxyAmdQd","ThjNnjeskS","WMiS3rKDLJ",
+"Gv3FqZhwG1","SbRYy48cHL","fmIK1DLhzM","8RCUAVIlwP","FnPFB45cIH","UmaEvNcICA","618Diru4UG","KZamHWmadA","EdBKcFPfSE","WreyPVerEA",
+"UmaEv7ku1p","JJs5mv8yFN","U3yw5taOXK","MezSWlsQGo","Ul4a10PktI","lweGyUl4a1","pFrrlCxVEf","3weIFCdyBV","FcWrWFNYIM","CIShGjS1aj",
+"QWxoToGu6x","DcpWBiB08l","LewvM1v5hH","CIShGPb1pa","UmaEvBGaQY","zY1GYwDajX","IBe8kgIYvE","cShY2pAhR1","aL6AJGWqqX","14FLRW3VFH",
+"FFDuiblLA9","lj07QAIYUu","LewvMtl72W","jtn0XlpF6W","BCxeCzQt6Q","4QMc99eoRc","7lUXZB3qem","CNHmvogLgc","x3LDe0BmCy","lweGyKASQ8",
+"QbxXcNo0Qb","6q6L945cIH","JkzUnC2Irc","7hyVvyluBx","dpe1vlsQGo","v1HlnSbRYy","U3yw5VIlwP","lCMxyksJby","vLsmSo8Uyd","ciuWzP6bcg",
+"0ao3l5Namm","uvf7AsuY4x","m4bxUnFqik","hSSvQogLgc","a00b5WreyP","aFFssdQ586","AmdQdpWiOs","45cIHPb1pa","xReecCIShG","5Drn04W0Tl",
+"UlU3M9eoRc","tlILtPYBf4","9iGoTiKqhr","zmLYDzHF1q","s93MlBpYhV","uvf7AECMvU","BGaQYjiVBP","qaofN5Namm","dhSuHVBjhz","bZLvSYf2Ec",
+"Mm8siVprf2","NhXduJXljW","P6bcgMK07Y","uJScX9iGoT","soy9tzz4ZU","ydG8URkQke","uAWypoQ87r","ReKEWtvdkD","07n1cD6rBy","gIYvEuJScX",
+"8cVD3GrDg7","S77LHaez9y","W3VFHJKWYR","s7MxkMm8si","YOfrYOUYuF","m4bxUbgJAz","oGu6xDz1R3","Pb1pahYBCK","y94nwMkgy8","GXdoH8U2nU",
+"Gv3FqtuDyS","W7cTswiHrZ","6AFT05Namm","29QAz4W0Tl","OUqFMXyPZN","8U2nUlj07Q","MmKGJ8FmFH","lweGyC2Irc","v2eC3Kr8ys","IKxdLuAWyp",
+"nFqikgf8rI","wiHrZa00b5","4W0TlMojnP","LbRTH5Drn0","Y1mC0IRh48","55rfB0h1b1","he9IAzY1GY","SWfouHRxd8","AkKTkBGaQY","HzZT829QAz",
+"lViBvThjNn","VNCPdv8yFN","uN6r3MmKGJ","F6PT2qQxHP","gdQsSDLhzM","uoStw9rlg9","wDajXjSjS3","qaofNogLgc","0BmCycL0aE","LDk6fNo0Qb",
+"fcJOyPb1pa","fcwDacShY2","vkCHHK4GS8","FwEJzhSSvQ","wiHrZAkKTk","brhlQL7cGc","JIqXisx5Gl","Ul4a1yvOMI","HzZT8CIShG","uPX7GFcWrW",
+"D6rByYh1hF","2DREstaOXK","5VZjSQnJ1S","Mm8si1v5hH","lkMUAYw2oU","WreyP3weIF","No0Qbrhl0J","Q6hMCBFkb8","cmXIXiwzGk","Yf2EcnFqik",
+"AXpwEcL0aE","wiHrZF6PT2","LDk6fM6qcG","jS1ajcmXIX","2Yz7EHP433","pWiOslj07Q","okgRi0YAGH","wiHrZaDGtS","gtCA5sqVrf","5drc64QMc9",
+"0PktI5Namm","pvgjSjzUqR","Nxx9VAmdQd","HfyNQo8Uyd","KASQ8blLA9","MmKGJUl4a1","4QMc9UmaEv","EdBKc5drc6","bZLvSAgJHQ","aDGtSW3VFH",
+"XyPZNNhXdu","Q6LixW7cTs","rhl0JXyPZN","StlDJ5Mg9r","suY4xFnPFB","F6PT2QbxXc","kB5nPThjNn","rhl0J9rlg9","sx5GlJIqXi","9y4lwPb1pa",
+"zFgtB9GXkX","FnPFB5VZjS","VNCPdpv0i7","WmadAHP433","x3LDeokgRi","uLtKsChuy3","uQIczRBhp0","pAhR1lViBv","pAhR1ThjNn","QChxsQChxs",
+"a00b5wDajX","StlDJMm8si","QWxoTVprf2","zbIYY7lUXZ","Mm8siazIWp","lsQGoGSQwj","AgJHQFPfSE","JKWYRpiJSk","StlDJCp3mZ","rKDLJ580YD",
+"uupzkKASQ8","uZPqgEdBKc","Chuy3gtCA5","5NammfcwDa","xReecAOgEe","fLNg8Oz8yZ","RzaZAjfREu","t98iWSWfou","RkQkeO3iyQ","7X3uyjS1aj",
+"ECMvULewvM","jfREuJKWYR","GrDg72DREs","CxVEfoVQp6","ix74rFPfSE","5drc6FxX9q","9iGoTzHF1q","0BmCyjSjS3","JkzUn7hyVv","FxX9qdhSuH",
+"SbRYyMezSW","lj07QFcWrW","CqqaDW3VFH","lkMUA5nmWv","AgJHQQssNC","5NammyEfy9","Qworu5drc6","AOgEefmIK1","P6bcg5Namm","QWxoTJ2mQi",
+"Uvlv4guMb8","Ul4a1Rxrsm","EdBKcGrDg7","aDGtS2hEEU","taOXK0PktI","iqv4kuLtKs","yEfy924ARF","Y1mC0yEfy9","jzUqRxciqp","2TRI7uupzk",
+"0PktIfcwDa","GrDg707n1c","lweGy4QMc9","dpe1vRpBQm","SmGzvmX2GE","LbRTHWMiS3","FLsphv2eC3","yofH3In3NS","y94nwyluBx","Vprf2ogLgc",
+"5nmWvgdQsS","Dz1R3k85Ae","24ARF7Ow5C","rhl0JLbRTH","wiHrZVNCPd","uupzk2TRI7","kZANmMojnP","ZJTXHRBhp0","GXdoHogLgc","8RCUAfmIK1",
+"tvdkDJIqXi","9rlg9i3pyd","fcwDazz4ZU","s7MxkYh1hF","jS1ajjtn0X","PYBf4prNT6","29QAz64s8N","he9IAS77LH","zmLYDVBjhz","HfyNQbZLvS",
+"aFFssW3VFH","ThjNnM6qcG","D6rByGv3Fq","ulk41M6qcG","WMiS3cL0aE","TXQ0ZQClRL","O3iyQQClRL","JKWYRqUJMd","Dz1R3WaWsv","L7cGcatef2",
+"d85a9NAFuw","9GXkXFGzgp","DLhzMM6qcG","lXFOB07n1c","9rlg9b29RJ","XyPZN24ARF","JJs5mm4bxU","29QAzatef2","MojnPguMb8","suY4xOz8yZ",
+"lViBv9y4lw","AIYUuLDk6f","J2mQiAIYUu","DcpWBo8Uyd","he9IABGaQY","lCMxyiqv4k","soy9t0PktI","BGaQY4W0Tl","h1zcHlkMUA","RBhp0rz7Ut",
+"gtCA50ao3l","gtCA55Drn0","TwanogtCA5","RsQUqKr8ys","5IhmGYf2Ec","EdBKcni2v1","ZuDtD0PktI","sx5GlTa8f6","RpBQmo8Uyd","tuDySAkKTk",
+"5iGN5CIShG","BGaQYsqVrf","IjTwPRmDcr","ciuWz9GXkX","FGzgpvkCHH","fmIK15Namm","i3pydVjCZq","MmsIo618Di","8xEKzciuWz","WreyPx3LDe",
+"S77LHpFrrl","FVMxo2TRI7","gf8rIQClRL","X6PinDcpWB","RxrsmS77LH","EdBKc2ZHdk","gIYvEgdQsS","qQxHPNOHsz","uQIczciuWz","K20wK7X3uy",
+"Z4I1vzQt6Q","vLsmSMmsIo","yofH3ZUnqt","yofH31v5hH","FLsphECMvU","FnPFBFhtgl","azIWpguMb8","G1RhSiqv4k","Cp3mZyvOMI","2TRI7Chuy3",
+"okgRi7fKYU","yvOMIUvlv4","5ZaEz7X3uy","O3iyQhe9IA","UmaEvQbxXc","Zv7z0faHir","K4GS8jzUqR","d7vjM0BmCy","b29RJyluBx","IRh483otm6",
+"yvOMI0BmCy","ReKEWQWxoT","jeskSZhwG1","HfyNQTa8f6","0Kyfsn8pJ9","s4786FVMxo","tAOsrRpBQm","ru4UGGWqqX","LewvMpmeCd","7Ow5CiwzGk",
+"6AFT0OHaBz","n8pJ9Ta8f6","lsQGoNAFuw","dhSuH0BmCy","2hEEUXflUq","WMiS35nmWv","6q6L9KsjRK","mX2GEFNYIM","8RCUA5ZaEz","HlUbFMmKGJ",
+"2DREst98iW","v1Hlna00b5","5drc6VNCPd","RxrsmpWiOs","B3qemcQOnv","Mm8siKr8ys","yofH32ZHdk","v8yFNW7cTs","UlU3McQOnv","K4GS8iqv4k",
+"v2eC3guMb8","Waim6Dz1R3","SjskQYf2Ec","bgJAz0BmCy","OHaBzjiVBP","HRxd8TXQ0Z","b29RJPYBf4","piJSkJJs5m","mX2GEcL0aE","FGzgp2DREs",
+"MK07YfcwDa","faHiroQ87r","FcWrW8TxD7","tlILtVerEA","8FmFHiqv4k","OUYuFVjCZq","tlILtMGlTF","24ARFOz8yZ","8FmFHQ6hMC","okgRiFLsph",
+"b29RJ618Di","faHirBCxeC","fFDrJTa8f6","FGzgp8cVD3","nFqik8FmFH","RACujVNCPd","B3qemuLtKs","RpBQmxciqp","gdQsSpiJSk","8RCUA9rlg9",
+"GWqqX1v5hH","l83UdiKqhr","5Mg9rl83Ud","TwanoQ6hMC","K4GS8pv0i7","48cHLyEfy9","i7WMQrKDLJ","IRh48Ta8f6","sx5GlI7p2a","4dEz629QAz",
+"6q6L95IhmG","RACujDcpWB","WmadAStlDJ","Mm8siVNCPd","Ta8f6Fhtgl","RsQUqqQxHP","FnPFBQbxXc","0ao3l2Yz7E","7fsYMKr8ys","3weIF7X3uy",
+"azIWptuDyS","m4bxUazIWp","soy9tVprf2","VLTy6iKqhr","Z4I1vFjHXR","0MR5XNcICA","580YD8hJdt","MaJQsI7p2a","mz8gxfqypy","aL6AJpiJSk",
+"Pb1paDLhzM","7Ow5CU3yw5","uJScXiKqhr","5IhmG45cIH","ru4UG580YD","S77LHoQ87r","RkQkeOxWIH","uJScXlkMUA","0KyfsAXpwE","qUJMdUvlv4",
+"OHaBzYh1hF","ciuWzX6Pin","FwEJzL7cGc","i3pydsuY4x","zFgtBuoStw","QWxoTyluBx","uN6r3Cp3mZ","QWxoTM6qcG","pvgjS16lHc","v2eC3Yw2oU",
+"Gv3FqVBjhz","Y1mC0AgJHQ","3otm6618Di","1LB1Lfqypy","TCgPp7Ow5C","1v5hHVIlwP","CNHmvfcwDa","JRJQBv2eC3","lXFOBulk41","0BmCyy94nw",
+"LewvM9GXkX","rz7Uts4786","7fKYUZzJHW","vkCHHHfyNQ","PYBf4gf8rI","iqv4kt98iW","ulk41s93Ml","v2eC3gtCA5","kB5nPRzaZA","ThjNnUl4a1",
+"0KyfsJXljW","brhlQpAhR1","Waim6gjUTu","WDVWJVIlwP","Chuy3jfREu","b29RJuQIcz","v8yFNFhtgl","Yh1hF5VZjS","cL0aEfcJOy","CK5W7TXQ0Z",
+"OxWIHb29RJ","m4bxUzFgtB","GWqqXAmdQd","o8Uyd0BmCy","t98iWTXQ0Z","NcICA1LB1L","MmsIo580YD","kB5nPECMvU","LbRTHtuDyS","t59lRlm0pD",
+"CqqaDQClRL","cmXIXLewvM","KZamHpWiOs","S2DfuGv3Fq","W3VFHiB08l","vOqCEqaofN","v1Hlnfqypy","iB08laez9y","ThjNnIjTwP","uAWypgdQsS",
+"StlDJtlILt","zmLYDReKEW","9iGoTzY1GY","tAOsrTXQ0Z","JRJQBAIYUu","618Die6e4z","FjHXRzFgtB","aL6AJ9iGoT","FPfSEoVQp6","RACujK20wK",
+"uZPqglj07Q","he9IAlm0pD","gIYvESWfou","HfyNQKsjRK","GrDg7AXpwE","1LB1L48cHL","CdyBVs7Mxk","IjTwPHRxd8","euZA5SbRYy","ulk41jtn0X",
+"HzZT85drc6","RACujTCgPp","a00b5RpBQm","EoToPFFDui","iB08lRkQke","tvdkDUlU3M","MezSWFhtgl","iqv4k7Ow5C","9y4lwNcICA","Zv7z007n1c",
+"v2eC3lH1kt","LbRTH8xEKz","0MR5XgjUTu","WDVWJhYBCK","zmLYDfcwDa","OUYuFnlaBy","BGaQYqQxHP","CxVEfIKxdL","t59lRhSSvQ","ksJbyFPfSE",
+"cL0aEQClRL","6q6L93weIF","RmDcrjzUqR","FFDuisuY4x","gf8rIJRJQB","fLNg87X3uy","PYBf4i7WMQ","Waim67fKYU","xReecMaJQs","S77LHv1Hln",
+"8xEKzlXFOB","0MR5XVjCZq","Yw2oU5IhmG","AXpwEBbwgA","hUTw7MK07Y","5nmWvDLhzM","CIShGIn3NS","kB5nPAmdQd","ix74r5IhmG","ksJbyhUTw7",
+"xciqpnnP8o","9y4lwHfyNQ","2ZHdkVBjhz","Yw2oUwDajX","t98iWcShY2","QworuOz8yZ","Uvlv48TxD7","euZA5StlDJ","VIlwP5nmWv","S2DfuFPfSE",
+"sqVrfXyPZN","W7cTsFFDui","QClRLP6bcg","brhlQRpBQm","Z4I1vjzUqR","oVQp6Yh1hF","zqH0WO3iyQ","RkQke7lUXZ","JIqXizmLYD","S2DfuHRxd8",
+"5VZjSMaJQs","MaJQsMmKGJ","i7WMQCIShG","Cfgr3WMiS3","0Wr5y9eoRc","5nmWvRmDcr","WreyPyofH3","ogLgclsQGo","yvOMI48cHL","uPX7G4QMc9",
+"16lHculk41","2NslmuQIcz","lViBvfcJOy","dhSuHQWxoT","QChxsx3LDe","FGzgpMmsIo","AIYUun8pJ9","Pb1papT8wu","SbRYyWaim6","Twanot98iW",
+"i7WMQECMvU","he9IAFjHXR","0BmCyoGu6x","n1pmOhE1Ql","PYBf4Mkgy8","LbRTHjiVBP","dpe1voGu6x","4W0TlJXljW","FjHXRaL6AJ","K20wKvOqCE",
+"qaofNgjUTu","3otm6AkKTk","M3zXLKASQ8","RBhp02ZHdk","hE1Ql45cIH","pv0i7l83Ud","lweGyi3pyd","Cfgr3pWiOs","lXFOBK4GS8","8U2nUiwzGk",
+"S2DfuWaWsv","pFrrlpFrrl","AXpwEnFqik","qaofN7ku1p","n8pJ9fmIK1","uoStw7X3uy","JKWYRNo0Qb","bZLvSdjsrv","tAOsrcShY2","VerEA4W0Tl",
+"fqypyFcWrW","VNCPdfcJOy","FFDuiogLgc","uJScXix74r","FNYIMh1zcH","2hEEUv1Hln","POUYSOz8yZ","HRxd8MaJQs","TXQ0ZRmDcr","NAFuwS77LH",
+"9XyT9Ul4a1","okgRini2v1","cQOnv9XyT9","Oz8yZZhwG1","pmeCdlH1kt","RmDcrCxVEf","RACujZ4I1v","CNHmviqv4k","KASQ88xEKz","dQ586AXpwE",
+"2ZHdktl72W","qaofNi7WMQ","suY4x618Di","zFgtBDLhzM","ydG8UzHF1q","e6e4zuvf7A","he9IAk85Ae","14FLRB3qem","M3zXL6q6L9","KZamHjiVBP",
+"zY1GYru4UG","ogLgcgjUTu","wiHrZK20wK","v8yFNtl72W","CqqaDnFqik","NAFuwFwEJz","JJs5mrKDLJ","MmKGJgIYvE","XflUqo8Uyd","AmdQd1v5hH",
+"oQ87rKsjRK","UmaEv6AFT0","i7WMQfFDrJ","4dEz6BFkb8","n1pmOUvlv4","Zv7z0mX2GE","5Mg9r9y4lw","C2IrcyvOMI","WmadAt98iW","uAWyp2TRI7",
+"GrDg7I7p2a","iKqhrFFDui","Uvlv4NhXdu","uupzkuLtKs","QChxs8TxD7","aDGtSFVMxo","WmadAuPX7G","TwanouPX7G","ECMvUhUTw7","k85AeFjHXR",
+"Y1mC0t59lR","dmoS7jSjS3","mz8gxQChxs","qUJMdZzJHW","2TRI7d7vjM","RACujQYxC0","FVMxoSmGzv","Rxrsm55rfB","YjB9ttAOsr","lweGyW3VFH",
+"v8yFNt59lR","29QAz2hEEU","MezSW0PktI","y94nwpmeCd","ZzJHWK4GS8","k85AeHRxd8","fLNg8LbRTH","3otm6StlDJ","n1pmO2DREs","MezSWCp3mZ",
+"VjCZqv2eC3","2hEEUtlILt","7fKYU9XyT9","jSjS3hSSvQ","G1RhSfaHir","Q6LixYjB9t","7fsYMKASQ8","o8UydAOgEe","zFgtBgtCA5","pv0i74dEz6",
+"9XyT9qUJMd","POUYSUmaEv","J2mQivOqCE","cQOnv2Yz7E","uupzkhSSvQ","618Dib29RJ","LDk6f5VZjS","Yf2EcuAWyp","ulk41lj07Q","GXdoH7X3uy",
+"5nmWvuvf7A","YOfrY8RCUA","vLsmSmX2GE","2TRI7CdyBV","jeskSFcWrW","fcwDaLDk6f","55rfBQbxXc","nnP8opFrrl","jSjS36AFT0","vOqCE8xEKz",
+"Vprf28cVD3","ZhwG1DG4sT","Kr8ysrKDLJ","TXQ0ZnFqik","azIWpKZamH","8TxD7mX2GE","VerEAS2Dfu","ogLgcCIShG","MGlTFh1zcH","CxVEfyEfy9",
+"RpBQmkZANm","okgRiQYxC0","SWfouCp3mZ","uPX7Gfqypy","ZuDtDJKWYR","29QAzzqH0W","ZJTXHFFDui","o8UydvkCHH","5drc6NAFuw","uoStw8FmFH",
+"v2eC3v8yFN","v8yFNydG8U","WaWsvtaOXK","X6Pin07n1c","fcwDaPb1pa","gf8rIgf8rI","Cp3mZhe9IA","2DREsI7p2a","8RCUAUl4a1","DLhzMIRh48",
+"7lUXZpAhR1","WreyPfaHir","MGlTFOHaBz","BbwgANo0Qb","Yf2Ec1j5L8","hUTw7580YD","fcwDa4QMc9","HfyNQ9rlg9","s7Mxk8xEKz","WmadAJkzUn",
+"MaJQsrhl0J","zFgtBEOE1o","n1pmOfcJOy","Q6hMCt59lR","NAFuw5ZaEz","QYxC0YOfrY","CdyBVO3iyQ","P6bcgOz8yZ","NOHszn8pJ9","45cIHMaJQs",
+"hYBCK5iGN5","pWiOsOxWIH","uQIczW3VFH","Mm8siLewvM","3otm6VBjhz","lweGyzbIYY","aez9yzQt6Q","jSjS3rhl0J","cShY2yToGW","KZamH0PktI",
+"1LB1LVNCPd","48cHLyofH3","xReecoQ87r","2TRI7dhSuH","blLA9ulk41","QnJ1SNxx9V","vOqCEHlUbF","QClRLoQ87r","CIShGZhwG1","uZPqgpiJSk",
+"o8Uydy94nw","QWxoTZJTXH","BFkb87lUXZ","jS1ajn8pJ9","Pb1payEfy9","Ul4a10ao3l","BFkb8uN6r3","Gv3FqiB08l","prNT6YjB9t","hYBCKcQOnv",
+"9y4lwtjQxs","euZA5lm0pD","FcWrWjfREu","Z4I1vEOE1o","OHaBzrhl0J","8FmFHtuDyS","xReecS2Dfu","OxWIHjzUqR","ksJbyBpYhV","gIYvE5Drn0",
+"ru4UGHlUbF","v1HlnlXFOB","F6PT2BGaQY","lViBvt98iW","cShY2O3iyQ","7fsYMzY1GY","zFgtB3weIF","uZPqgM3zXL","s4786Gv3Fq","qQxHPlpF6W",
+"azIWpXflUq","gf8rINxx9V","K4GS8dmoS7","NAFuw8U2nU","Q6hMCni2v1","5Drn0m4bxU","7X3uyrz7Ut","piJSkt98iW","zY1GY2ZHdk","bZLvSCqqaD",
+"ZzJHWjzUqR","CdyBVCxVEf","HfyNQNAFuw","5Namm5drc6","CqqaDVjCZq","HzZT8uoStw","uJScXPOUYS","G1RhSWMiS3","lj07QIjTwP","fcwDayToGW",
+"DG4sTpAhR1","Chuy3AgJHQ","LbRTHLbRTH","kZANmBCxeC","FhtglVLTy6","6AFT0Yf2Ec","fcwDaS2Dfu","hYBCKEdBKc","VNCPdpvgjS","7lUXZoGu6x",
+"RBhp0Rxrsm","7Ow5CCfgr3","8hJdtqQxHP","Q6Lix8FmFH","cQOnvRpBQm","9iGoTi7WMQ","WMiS3jiVBP","BGaQYTa8f6","QssNCbrhlQ","VBjhzW7cTs",
+"DQimpiwzGk","pv0i7B3qem","v1HlnEOE1o","ru4UGFLsph","RsQUqJXljW","rhl0JuoStw","No0QbUmaEv","cQOnvtvdkD","n8pJ9vkCHH","AmdQdS77LH",
+"uvf7A2Yz7E","uTacx5Namm","MezSWRkQke","CNHmvMaJQs","v2eC37fsYM","VjCZqWPmlx","FnPFBWMiS3","OUYuFatef2","FPfSEQClRL","nFqik0h1b1",
+"okgRiCqqaD","Gv3Fq2Nslm","zbIYYtvdkD","t59lRWaim6","pmeCdciuWz","S2DfutjQxs","HlUbFMm8si","hi5X7ulk41","8TxD7ciuWz","qaofNa00b5",
+"BFkb8AXpwE","lj07QTCgPp","WPmlxSbRYy","dQ586mX2GE","Y1mC0ciuWz","tAOsrGWqqX","ulk41suY4x","blLA9P6bcg","ciuWzMK07Y","NcICAfcJOy",
+"SbRYyRACuj","AkKTkVjCZq","t98iWtvdkD","aDGtSWmadA","DcpWBZhwG1","zbIYYjzUqR","ydG8U1j5L8","UmaEvyofH3","uN6r3atef2","gjUTu7fKYU",
+"8FmFHuJScX","JIqXiRkQke","JKWYRuvf7A","djsrv9iGoT","ru4UGnFqik","Waim6Pb1pa","CdyBVzmLYD","taOXKcQOnv","2Yz7ETa8f6","JRJQBrKDLJ",
+"brhlQHzZT8","fmIK145cIH","LbRTHsuY4x","yofH3JXljW","t98iWyvOMI","taOXKzFgtB","JKWYR7ku1p","uoStwZhwG1","n1pmO9rlg9","7lUXZRsQUq",
+"SbRYyydG8U","S77LHZUnqt","SmGzvoVQp6","jeskSt59lR","xXTI4pmeCd","4QMc9uTacx","GXdoHlkMUA","zz4ZUI7p2a","0PktIG1RhS","kZANmfLNg8",
+"cmXIX7lUXZ","9y4lwCp3mZ","jzUqRaFFss","VNCPdcQOnv","GrDg7VIlwP","6AFT0rKDLJ","ZUnqtuTacx","M6qcGxXTI4","YjB9tCfgr3","ciuWz4W0Tl",
+"5IhmGJJs5m","I7p2a0PktI","Dz1R3yEfy9","aez9yK4GS8","rz7Uta00b5","4dEz6Waim6","pWiOs7fKYU","TwanoDz1R3","AgJHQMmsIo","VIlwPRkQke",
+"ru4UGQworu","F6PT2ix74r","ni2v1AkKTk","XflUqCK5W7","2hEEUix74r","W7cTsRACuj","i7WMQtvdkD","zQt6QWreyP","5drc6HP433","ZUnqtYjB9t",
+"Y1mC0VjCZq","7X3uy4QMc9","brhlQ2TRI7","TwanoXyPZN","WaWsvWmadA","zmLYD5Mg9r","v1Hlni7WMQ","lj07QlpF6W","uTacxgtCA5","8TxD77Ow5C",
+"xXTI4iKqhr","K20wKYjB9t","sqVrfjiVBP","IKxdLpvgjS","BpYhVHzZT8","n1pmOlj07Q","HfyNQMojnP","C2Irc55rfB","oGu6x5VZjS","brhlQru4UG",
+"FwEJzlm0pD","BbwgAjeskS","b29RJRBhp0","2ZHdkaL6AJ","uvf7Av2eC3","UlU3MzqH0W","MGlTFWmadA","ydG8UWmadA","BpYhVm4bxU","RmDcrOUqFM",
+"5Mg9rNxx9V","nlaBy5VZjS","JJs5m580YD","DG4sTbrhlQ","hi5X7EoToP","QClRL8xEKz","618DilsQGo","Pb1paD6rBy","Ul4a1SbRYy","RsQUq7ku1p",
+"oQ87rlViBv","KsjRKMGlTF","0Wr5yRkQke","taOXKtvdkD","gf8rIQYxC0","kZANmMK07Y","Q6LixuLtKs","VNCPdvOqCE","AOgEejSjS3","vLsmS2ZHdk",
+"xciqpt98iW","VNCPdZv7z0","OxWIHZJTXH","M3zXL64s8N","24ARFMK07Y","WPmlxC2Irc","5drc6Oz8yZ","bZLvS0MR5X","Yh1hFJRJQB","s7Mxk7fKYU",
+"rhl0JwiHrZ","k85AegjUTu","gjUTuHfyNQ","FcWrW7ku1p","8FmFHQworu","5nmWvHzZT8","7hyVviwzGk","aFFssmX2GE","d7vjM9rlg9","2DREsuLtKs",
+"IRh48yofH3","IBe8kGSQwj","GXdoHjiVBP","5Nammuvf7A","BGaQYjtn0X","Yw2oU8RCUA","2TRI7vkCHH","tjQxsk85Ae","tjQxsCp3mZ","IjTwPJXljW",
+"48cHLFLsph","b29RJ16lHc","JRJQBs4786","KZamHAmdQd","YOfrYJIqXi","ZzJHWWDVWJ","EdBKcKr8ys","QClRLCIShG","X6PinAgJHQ","y94nwG1RhS",
+"FNYIM2ZHdk","gdQsSFGzgp","jeskS618Di","OxWIHKsjRK","mX2GEHRxd8","5NammdmoS7","nnP8oFxX9q","tuDyS7lUXZ","prNT6e6e4z","tlILt1LB1L",
+"No0Qbn1pmO","mX2GEFjHXR","8TxD7U3yw5","Pb1pasuY4x","2Yz7E0Wr5y","7fsYM45cIH","kB5nPxXTI4","rhl0J1v5hH","lm0pD8U2nU","yEfy9SjskQ",
+"LbRTHRsQUq","NcICAtAOsr","VerEARzaZA","RBhp0FLsph","ogLgcuZPqg","FnPFByEfy9","WPmlxjSjS3","cmXIXPOUYS","zHF1qCIShG","s7Mxk5IhmG",
+"wDajXqUJMd","hE1QlFcWrW","WmadAfcwDa","oQ87rZhwG1","yluBxLbRTH","s4786pFrrl","gjUTuxXTI4","S77LHlH1kt","Twanorhl0J","OxWIHIn3NS",
+"XyPZNjS1aj","cmXIXqQxHP","zmLYDe6e4z","KASQ8aL6AJ","Kr8ysjtn0X","IBe8ke6e4z","pT8wuOHaBz","jtn0XpmeCd","X6PinFPfSE","LewvMnFqik",
+"gjUTuL7cGc","uupzk0MR5X","ix74ryofH3","ReKEWTXQ0Z","d85a9Oz8yZ","QnJ1SSjskQ","9eoRcZuDtD","ZuDtDTCgPp","TwanoNOHsz","XflUqFNYIM",
+"YjB9tBCxeC","QWxoTatef2","suY4xFNYIM","FNYIM9eoRc","0Kyfs2Nslm","hYBCKoGu6x","8xEKzyToGW","n1pmOuJScX","lkMUAFhtgl","aL6AJWMiS3",
+"lsQGoyEfy9","NhXduuN6r3","XyPZN2TRI7","ZhwG1lsQGo","RkQkeGv3Fq","ciuWziqv4k","tAOsra00b5","Zv7z0FFDui","suY4x7X3uy","o8Uyd2Yz7E",
+"OHaBztlILt","a00b5FLsph","VIlwPt98iW","0Wr5y55rfB","mX2GEFcWrW","IBe8kt98iW","s4786fFDrJ","NhXduIjTwP","OxWIH0PktI","MojnP5Mg9r",
+"7ku1pJKWYR","jtn0XHlUbF","zHF1qfmIK1","FxX9qfcwDa","taOXKIBe8k","d7vjM55rfB","NhXduEdBKc","7X3uy2DREs","9iGoTfLNg8","b29RJEOE1o",
+"hSSvQKsjRK","fqypyxReec","JKWYROUqFM","faHirydG8U","gjUTuTwano","GrDg7VNCPd","JJs5mpT8wu","FVMxo4QMc9","LDk6fkB5nP","5iGN5uN6r3",
+"KsjRKTa8f6","ydG8UYw2oU","jiVBPnFqik","SbRYytjQxs","S2DfuZhwG1","DG4sTtAOsr","FVMxoEoToP","uTacxFFDui","LewvMvkCHH","ogLgcqQxHP",
+"6AFT08TxD7","zz4ZUzbIYY","SbRYygf8rI","tuDySCdyBV","GrDg7Nxx9V","XyPZNtvdkD","tl72W55rfB","W7cTsQnJ1S","prNT6FGzgp","nnP8oM6qcG",
+"nFqikWDVWJ","i7WMQFxX9q","QWxoTmz8gx","lpF6WQ6Lix","DG4sTmX2GE","lXFOBuLtKs","6AFT0nlaBy","VBjhzJkzUn","NOHszK4GS8","tuDyS4QMc9",
+"FPfSEzFgtB","cL0aEfcwDa","soy9tfcJOy","tuDySrz7Ut","Ul4a1iB08l","P6bcge6e4z","D6rByPb1pa","O3iyQix74r","618DiOHaBz","tjQxsQbxXc",
+"gdQsS5iGN5","vkCHHBpYhV","zQt6QJRJQB","Yh1hF5iGN5","gIYvE0YAGH","fcwDaXflUq","tuDySIRh48","7X3uyVprf2","fcJOyFnPFB","qaofN14FLR",
+"StlDJLDk6f","dQ586VIlwP","HRxd8d85a9","RBhp0AmdQd","Ss0ZuZv7z0","Chuy3CK5W7","b29RJKsjRK","pv0i7AOgEe","5ZaEzWaWsv","jfREutvdkD",
+"aDGtS4W0Tl","UlU3MMm8si","0YAGHEoToP","sx5GlnFqik","xXTI4sqVrf","StlDJVNCPd","GSQwjgtCA5","PYBf48U2nU","I7p2axciqp","FLsph9XyT9",
+"2DREsxciqp","pAhR1zQt6Q","iwzGkZUnqt","5drc6NOHsz","bgJAzIRh48","yofH3D6rBy","W3VFHpv0i7","5NammQssNC","zz4ZU2DREs","aDGtSGv3Fq",
+"VBjhzFPfSE","2TRI7jiVBP","SmGzvFNYIM","ciuWzL7cGc","QworuzqH0W","Cfgr3RBhp0","hUTw7ReKEW","yofH3h1zcH","4dEz6618Di","fqypyBFkb8",
+"FLsph64s8N","K20wKNxx9V","RxrsmLDk6f","s93Ml2hEEU","8xEKzXyPZN","piJSkhSSvQ","6q6L907n1c","lCMxy8cVD3","o8UydL7cGc","qQxHPtjQxs",
+"SmGzvHfyNQ","07n1cblLA9","2hEEUMm8si","HP433fLNg8","RACujBGaQY","FNYIMSmGzv","FVMxofFDrJ","8xEKzhe9IA","x3LDeAOgEe","Yf2Ec7fsYM",
+"yvOMI24ARF","x3LDeRzaZA","gf8rIMK07Y","HlUbFbgJAz","s4786uAWyp","2hEEUO3iyQ","SWfouuZPqg","9y4lwcmXIX","55rfBCIShG","m4bxUOHaBz",
+"K20wKGSQwj","WreyPlCMxy","3weIFNOHsz","JJs5maez9y","AXpwETwano","YjB9tQWxoT","DLhzMzmLYD","rhl0Jhe9IA","2DREsAOgEe","QnJ1SRBhp0",
+"tlILtVIlwP","ksJbyQworu","fcJOypvgjS","pWiOsgdQsS","WMiS3i7WMQ","MezSWqaofN","0Wr5yY1mC0","aez9ySs0Zu","AIYUufaHir","jS1ajLbRTH",
+"DG4sTazIWp","pmeCdrz7Ut","2NslmFPfSE","lkMUAi3pyd","HlUbFgtCA5","QssNC1v5hH","cL0aEx3LDe","2DREsFhtgl","Waim62Yz7E","SbRYyXflUq",
+"5Drn0zFgtB","TCgPpsx5Gl","lCMxyuQIcz","m4bxUbrhlQ","CdyBVjfREu","iqv4kIBe8k","jiVBPRBhp0","QworulkMUA","uAWypMmKGJ","4dEz6WPmlx",
+"kZANmy94nw","RACujcL0aE","VIlwPK4GS8","XflUqzQt6Q","QYxC0580YD","uupzk8TxD7","lm0pDCdyBV","KZamHzbIYY","0KyfsFVMxo","MojnPaez9y",
+"Vprf2jiVBP","Dz1R38cVD3","pWiOsFFDui","RkQkeo8Uyd","v8yFNnFqik","t59lRgjUTu","7X3uyMmsIo","TwanovkCHH","gtCA5XflUq","MaJQsYjB9t",
+"soy9tlj07Q","ThjNntaOXK","8TxD7euZA5","8cVD3jS1aj","GXdoHJkzUn","zbIYYoGu6x","Z4I1vRzaZA","wiHrZFFDui","cmXIXi7WMQ","5Nammjtn0X",
+"pvgjSlweGy","TwanoSbRYy","Yf2EcFPfSE","1v5hHcmXIX","MmKGJqaofN","2Yz7ESjskQ","WMiS3YOfrY","5nmWvX6Pin","WDVWJYjB9t","55rfB1v5hH",
+"k85AeuoStw","uN6r3VIlwP","RmDcrcL0aE","Qworun8pJ9","gdQsStlILt","uupzkciuWz","OUYuFMm8si","K4GS8gdQsS","Zv7z0fcwDa","NOHszzmLYD",
+"POUYS5VZjS","h1zcHM3zXL","jiVBPOz8yZ","7fKYUdjsrv","prNT6cShY2","pAhR1tl72W","Zv7z07X3uy","WDVWJb29RJ","OUYuFhE1Ql","RBhp0lCMxy",
+"AgJHQWmadA","9rlg9fqypy","pAhR1MK07Y","lweGysoy9t","618Di2hEEU","DLhzMxciqp","hSSvQaDGtS","ulk41BCxeC","e6e4zAgJHQ","Waim65Drn0",
+"FxX9qReKEW","0MR5XOHaBz","s7MxkzY1GY","jeskSDQimp","DcpWBpT8wu","Gv3FqAmdQd","prNT6QssNC","brhlQRBhp0","2ZHdkWaim6","B3qemCfgr3",
+"lj07QhSSvQ","0PktIS77LH","fmIK1jfREu","oGu6xlkMUA","Nxx9VEOE1o","ni2v1euZA5","pAhR13weIF","vOqCElm0pD","v8yFNI7p2a","2ZHdkdjsrv",
+"BCxeC0YAGH","rKDLJoQ87r","TCgPpIBe8k","GWqqXiwzGk","O3iyQCIShG","yvOMI3weIF","RBhp05ZaEz","S2Dfu5Drn0","8U2nU3otm6","0ao3lru4UG",
+"pmeCdlsQGo","2DREshUTw7","24ARFAOgEe","TCgPpX6Pin","Cp3mZZ4I1v","MK07YVIlwP","L7cGcOxWIH","tAOsrv1Hln","zQt6QZUnqt","Yw2oUKASQ8",
+"gjUTuYOfrY","RkQkeQbxXc","qUJMdQChxs","hE1QlqUJMd","BbwgAFcWrW","lViBvpiJSk","ZJTXHydG8U","MaJQsWaim6","Rxrsm14FLR","uZPqgs93Ml",
+"WPmlxSmGzv","y94nwGv3Fq","qQxHPG1RhS","YjB9t0Kyfs","oQ87ruPX7G","hi5X716lHc","BpYhV2DREs","0YAGHZ4I1v","5ZaEzGXdoH","cL0aEpWiOs",
+"0MR5XBFkb8","IRh48zY1GY","yToGW5ZaEz","FPfSE29QAz","DLhzMMezSW","IKxdLOHaBz","FLsphB3qem","iwzGkM3zXL","7lUXZRBhp0","UmaEv4W0Tl",
+"MK07YiwzGk","G1RhSjfREu","pWiOs618Di","S77LHqQxHP","jzUqRhi5X7","e6e4z7lUXZ","5Namm0h1b1","dQ586ogLgc","RxrsmM3zXL","P6bcgqaofN",
+"n8pJ9vOqCE","PYBf4dhSuH","J2mQiZhwG1","O3iyQTCgPp","azIWpRACuj","oVQp6oGu6x","RBhp0Ss0Zu","0MR5XLbRTH","gdQsS5nmWv","4QMc9fmIK1",
+"No0QbECMvU","uZPqg2Yz7E","ni2v12Nslm","BCxeCQnJ1S","MmsIoAmdQd","lweGybgJAz","piJSkAkKTk","7X3uyxXTI4","fFDrJ3weIF","BFkb8cmXIX",
+"kZANmaFFss","RACuji7WMQ","0YAGH3otm6","QnJ1SsuY4x","yluBxQworu","FhtglX6Pin","v1HlnReKEW","FhtglChuy3","uLtKss93Ml","8RCUACdyBV",
+"CIShGpmeCd","GSQwjJkzUn","5IhmGVjCZq","4W0TlvkCHH","iB08lJ2mQi","9XyT9CxVEf","jfREufcwDa","16lHcfFDrJ","QworuprNT6","M3zXLAgJHQ",
+"uJScX8xEKz","8cVD38hJdt","QworuTXQ0Z","RBhp048cHL","FnPFBXflUq","X6PinOz8yZ","YOfrYpmeCd","5Drn0zHF1q","8hJdtK4GS8","Mm8si5ZaEz",
+"b29RJuPX7G","jfREufaHir","djsrvtaOXK","I7p2aCqqaD","sqVrfqQxHP","tlILtjfREu","Yf2EclXFOB","nFqikpv0i7","ThjNnfcwDa","W3VFHni2v1",
+"rz7Utlj07Q","F6PT2FnPFB","TwanoF6PT2","8cVD3G1RhS","3otm6fcJOy","xReecLbRTH","fqypyYf2Ec","9XyT9BCxeC","BFkb8DcpWB","pWiOsVLTy6",
+"VBjhzVprf2","8U2nU55rfB","FxX9qjeskS","brhlQtuDyS","Uvlv4rhl0J","zqH0WVjCZq","xReeci7WMQ","CNHmvUl4a1","45cIH0Wr5y","Y1mC0uPX7G",
+"Q6LixBGaQY","zz4ZUBbwgA","pvgjSBpYhV","jeskSVprf2","RpBQmkB5nP","cShY2J2mQi","0h1b11j5L8","Nxx9VQ6Lix","yluBx2Nslm","pAhR1xciqp",
+"h1zcHzY1GY","24ARFQWxoT","SmGzvpmeCd","PYBf45IhmG","y94nwzHF1q","KZamHBbwgA","ydG8ULDk6f","0KyfsRxrsm","ZUnqtFPfSE","AmdQdzmLYD",
+"ZUnqtHzZT8","5nmWvOxWIH","fmIK1Pb1pa","QChxspWiOs","fmIK1M6qcG","ZJTXHYjB9t","K4GS84QMc9","s4786pAhR1","45cIHK4GS8","EoToP2hEEU",
+"In3NSIn3NS","o8Uydd7vjM","1v5hHokgRi","zFgtBCdyBV","NOHszzQt6Q","RmDcr9iGoT","pmeCdqUJMd","KsjRKG1RhS","zqH0WLewvM","ru4UGKASQ8",
+"No0QbMGlTF","BbwgAksJby","RkQkeYw2oU","MojnPPYBf4","pv0i7azIWp","5Mg9rt98iW","5IhmGZUnqt","WDVWJEOE1o","2TRI724ARF","ix74rQWxoT",
+"MmKGJSmGzv","yluBxAIYUu","FwEJzzqH0W","VjCZqiwzGk","8RCUAqQxHP","2TRI7o8Uyd","7X3uy5drc6","yluBxksJby","NAFuwuN6r3","Vprf2ECMvU",
+"yEfy9OUYuF","rKDLJ7X3uy","Mkgy8Dz1R3","FwEJzHzZT8","RACujqUJMd","0MR5XQ6hMC","AgJHQru4UG","2TRI755rfB","0KyfsfLNg8","jSjS3DG4sT",
+"Pb1pagjUTu","0YAGHrz7Ut","NcICA5nmWv","jS1ajrhl0J","ru4UGAkKTk","5drc6bZLvS","3otm6FPfSE","6AFT0Y1mC0","JJs5m0Wr5y","JkzUnDG4sT",
+"RBhp0LbRTH","WreyPQ6Lix","HfyNQ16lHc","MaJQsogLgc","fFDrJFFDui","zmLYDdQ586","gtCA5ZhwG1","ReKEW9rlg9","5Drn0JJs5m","K20wKQ6hMC",
+"Zv7z0YjB9t","2NslmSWfou","VIlwPs93Ml","v1HlnGv3Fq","QClRLjtn0X","Ul4a1Q6Lix","t59lRAIYUu","I7p2a7Ow5C","Z4I1vYw2oU","Oz8yZ16lHc",
+"zz4ZU6AFT0","BbwgAMmKGJ","cmXIXVprf2","nFqikJIqXi","QClRLMmKGJ","DQimpfcwDa","i3pydcL0aE","LewvMBCxeC","VNCPdzY1GY","zFgtBpv0i7",
+"TXQ0Zxciqp","9GXkX0YAGH","B3qemQ6Lix","FPfSEdhSuH","FVMxoh1zcH","MmsIotaOXK","zQt6QtvdkD","faHirC2Irc","blLA9lweGy","580YDBpYhV",
+"aL6AJLbRTH","fqypyQworu","5Drn0NhXdu","uJScX9eoRc","cL0aEJkzUn","zbIYYeuZA5","atef24dEz6","Zv7z0lweGy","cL0aEt98iW","lCMxyyToGW",
+"WDVWJW3VFH","Z4I1v0MR5X","L7cGc7fKYU","pFrrlv2eC3","BFkb8CqqaD","RxrsmVIlwP","Vprf2RzaZA","SmGzv5Drn0","45cIHUlU3M","VIlwPaez9y",
+"Ss0ZuzFgtB","24ARFMaJQs","iwzGkdpe1v","hi5X7VerEA","pmeCd1v5hH","4QMc9xciqp","fmIK1Gv3Fq","RmDcrF6PT2","BbwgA7lUXZ","24ARFazIWp",
+"cmXIXlH1kt","uPX7G5ZaEz","K4GS8qUJMd","FxX9qZzJHW","djsrvogLgc","KASQ8v8yFN","F6PT2AXpwE","MmKGJlXFOB","2ZHdklweGy","aL6AJx3LDe",
+"xXTI40MR5X","WPmlxK20wK","RmDcrn8pJ9","RmDcr5VZjS","DG4sTYw2oU","Ul4a1lH1kt","48cHLNhXdu","blLA9M6qcG","UlU3MvOqCE","xXTI4suY4x",
+"bZLvSFNYIM","WPmlxSWfou","9XyT9euZA5","uupzkqaofN","QbxXcWaWsv","FxX9q45cIH","ZzJHWGXdoH","TXQ0Zni2v1","K20wKpmeCd","7ku1p0h1b1",
+"IBe8kNcICA","vOqCE0Wr5y","1LB1LydG8U","SjskQTa8f6","07n1cQbxXc","aL6AJJkzUn","FjHXRpAhR1","i7WMQCfgr3","Y1mC0TXQ0Z","fqypy5iGN5",
+"zqH0WiB08l","QWxoTEOE1o","Dz1R3NOHsz","XflUqgIYvE","Ul4a1WPmlx","SmGzvjiVBP","dmoS7XyPZN","oVQp6e6e4z","zQt6QaFFss","DLhzMn8pJ9",
+"580YDCxVEf","JXljWpvgjS","S2DfujzUqR","rKDLJYjB9t","YOfrYxReec","4dEz62DREs","MmKGJ4QMc9","9rlg9fLNg8","3weIFFNYIM","Pb1paKr8ys",
+"Chuy3RkQke","vOqCEKASQ8","Nxx9VksJby","9XyT9IRh48","i7WMQK20wK","P6bcgFGzgp","d7vjMgIYvE","1LB1LMaJQs","RzaZArz7Ut","ciuWz7lUXZ",
+"NhXdutAOsr","OHaBzxciqp","NOHsznlaBy","FcWrWAXpwE","OHaBzS2Dfu","7hyVvQworu","FVMxoOxWIH","tuDySTa8f6","rKDLJAkKTk","0Wr5yVIlwP",
+"jSjS3gdQsS","kZANmd85a9","7Ow5C0Kyfs","K4GS8Y1mC0","07n1cHzZT8","ksJbyxReec","NAFuwThjNn","14FLRIRh48","hYBCKfmIK1","4QMc9zQt6Q",
+"t59lR9iGoT","29QAz3weIF","GrDg7FNYIM","9eoRcDcpWB","0MR5XlpF6W","TCgPpgdQsS","uQIczpAhR1","JIqXi2hEEU","vkCHHNAFuw","blLA9i7WMQ",
+"0h1b1ZUnqt","YOfrYdQ586","wDajXtaOXK","a00b5BbwgA","5Drn0M3zXL","Yf2EcYw2oU","gjUTu7X3uy","HzZT8EoToP","IBe8klpF6W","QYxC0Oz8yZ",
+"Cp3mZNAFuw","yToGWhUTw7","2NslmY1mC0","lj07Qxciqp","FPfSEuQIcz","LewvMn8pJ9","ZUnqtoVQp6","5nmWvni2v1","zz4ZUJkzUn","0Wr5yni2v1",
+"FLsph618Di","Pb1paaez9y","GXdoHciuWz","tl72WfaHir","sx5GlG1RhS","Nxx9V4W0Tl","JKWYRSjskQ","ksJbyazIWp","lViBvlkMUA","HlUbFRmDcr",
+"L7cGcReKEW","0PktIVNCPd","F6PT2Uvlv4","uJScXDcpWB","5iGN5M3zXL","uoStwuTacx","guMb8No0Qb","Cfgr3VIlwP","O3iyQjiVBP","n1pmOBbwgA",
+"RBhp055rfB","soy9tzqH0W","RmDcrRsQUq","QnJ1S9XyT9","Waim68U2nU","zz4ZUPOUYS","POUYSlCMxy","uupzkwDajX","7fsYM9rlg9","a00b5OHaBz",
+"tlILt0h1b1","5Mg9rGXdoH","7lUXZJXljW","16lHcIKxdL","QWxoTzQt6Q","UlU3Mv1Hln","y94nwkB5nP","ydG8UlweGy","6q6L9n8pJ9","xXTI4bZLvS",
+"HlUbFPb1pa","BFkb8hYBCK","n1pmOdQ586","MojnPiqv4k","OUqFMOUYuF","v2eC3k85Ae","i3pydCK5W7","Z4I1vulk41","WmadAyvOMI","2Yz7EokgRi",
+"0ao3l9eoRc","yToGWRsQUq","X6PinuoStw","yvOMIWMiS3","HfyNQvOqCE","45cIHD6rBy","MmKGJCdyBV","qaofNhE1Ql","ulk41FVMxo","nFqikQ6hMC",
+"7X3uyRzaZA","24ARFhUTw7","QworujiVBP","F6PT2lsQGo","yToGW7hyVv","gdQsSzqH0W","uupzkNAFuw","cQOnvlpF6W","5Drn0fcwDa","sqVrfgjUTu",
+"zQt6QfcwDa","pWiOsXyPZN","FjHXRuJScX","ZzJHWpFrrl","2DREsO3iyQ","FcWrWpT8wu","cL0aE55rfB","7X3uyWDVWJ","zHF1qTwano","n8pJ9yofH3",
+"PYBf4aFFss","GrDg7sx5Gl","Ul4a1GSQwj","FPfSEYf2Ec","Mkgy8WDVWJ","RpBQmazIWp","AXpwE4W0Tl","lsQGoyluBx","Y1mC0jtn0X","QClRLCfgr3",
+"faHir618Di","X6Pin8RCUA","VIlwPgtCA5","taOXKrKDLJ","RzaZA29QAz","5nmWv4QMc9","NcICAaFFss","tvdkD5Mg9r","3otm65nmWv","o8UyduZPqg",
+"RzaZA1j5L8","zbIYY14FLR","WDVWJUlU3M","soy9t5Mg9r","0PktIJRJQB","hi5X7JIqXi","zqH0WokgRi","hYBCKnlaBy","dmoS7NOHsz","24ARFFcWrW",
+"MaJQs3otm6","ix74rDG4sT","UmaEvdjsrv","jS1ajHfyNQ","DcpWBECMvU","BFkb8VBjhz","rz7UtOUYuF","fLNg8JKWYR","piJSkZhwG1","Z4I1vWmadA",
+"uAWyp8FmFH","J2mQiW3VFH","t59lRXyPZN","4dEz6D6rBy","AgJHQ7X3uy","zQt6Q48cHL","QWxoT5Drn0","nnP8oHP433","y94nwWDVWJ","FxX9qOHaBz",
+"uPX7GVerEA","jSjS3mX2GE","7X3uyY1mC0","JkzUnVjCZq","AXpwEBGaQY","45cIHokgRi","e6e4zzFgtB","mz8gxGXdoH","WDVWJZuDtD","JkzUn9y4lw",
+"OUYuFlweGy","cL0aEGv3Fq","RpBQmRxrsm","t59lRPYBf4","0KyfsfaHir","U3yw5Mkgy8","MaJQsWMiS3","MmsIoD6rBy","29QAz8RCUA","2Nslmsoy9t",
+"KASQ8uQIcz","2TRI7WaWsv","sqVrfIRh48","fmIK15Mg9r","uQIczrz7Ut","B3qempWiOs","VerEAjzUqR","2TRI73weIF","uoStwprNT6","In3NS8FmFH",
+"9XyT97ku1p","nnP8oYOfrY","WMiS3lH1kt","G1RhSBbwgA","HfyNQRzaZA","lCMxyRzaZA","qaofNStlDJ","2NslmKsjRK","I7p2aBCxeC","cShY2jfREu",
+"lH1ktCxVEf","cQOnvzFgtB","MezSWZuDtD","ZUnqtL7cGc","Z4I1vjeskS","vLsmSn1pmO","07n1cxReec","0Wr5y1v5hH","taOXKiqv4k","29QAzUlU3M",
+"G1RhSuJScX","JRJQBuvf7A","1j5L8StlDJ","uLtKsJKWYR","9y4lwzY1GY","JXljWGXdoH","OHaBzfcwDa","aez9yG1RhS","fFDrJYh1hF","prNT68cVD3",
+"B3qemVBjhz","yluBxjzUqR","0Wr5yQYxC0","NOHszRACuj","fcJOyaez9y","IRh48RsQUq","QWxoTMkgy8","uLtKsvOqCE","QChxs8hJdt","16lHcJKWYR",
+"xciqpd7vjM","5VZjSWmadA","Ss0ZuRsQUq","iB08lTa8f6","prNT6U3yw5","lCMxy3weIF","1j5L8AXpwE","jeskSHRxd8","0h1b10BmCy","WMiS3MezSW",
+"uQIcz8cVD3","euZA50Kyfs","XyPZNCp3mZ","BbwgANhXdu","dpe1vCp3mZ","GWqqXv8yFN","FNYIM5ZaEz","6q6L9aFFss","ECMvUHfyNQ","FLsphMK07Y",
+"NAFuwo8Uyd","faHirMkgy8","yEfy9Y1mC0","piJSks93Ml","ECMvU9GXkX","MezSWGrDg7","x3LDeFVMxo","h1zcHCdyBV","MGlTFMezSW","HRxd8v8yFN",
+"uPX7GbZLvS","Waim6xXTI4","3otm6iqv4k","2NslmzQt6Q","tuDyScShY2","ksJby8cVD3","3weIF8RCUA","7fKYU5Namm","uZPqgvkCHH","ulk41cL0aE",
+"QssNC0h1b1","rz7UtBGaQY","07n1clm0pD","gjUTuy94nw","rKDLJSs0Zu","6q6L9RkQke","618DiEOE1o","0BmCyhSSvQ","aFFss4W0Tl","Cfgr3FLsph",
+"MGlTFCdyBV","e6e4z2Yz7E","0PktIsuY4x","d7vjMZJTXH","W3VFHcQOnv","blLA9lj07Q","ThjNnRACuj","hYBCK7Ow5C","DG4sTfcJOy","lsQGos7Mxk",
+"9rlg9MmKGJ","WmadA1v5hH","uvf7ApT8wu","5ZaEzFwEJz","zHF1qDz1R3","UlU3MLDk6f","7ku1pY1mC0","pWiOspFrrl","AkKTkcmXIX","WPmlxksJby",
+"2hEEUi7WMQ","64s8NHRxd8","MmKGJfmIK1","JIqXiMmsIo","iB08ltuDyS","SbRYyKr8ys","OUYuFfcwDa","EdBKcNOHsz","ZuDtDogLgc","FcWrW2hEEU",
+"0PktIgf8rI","XflUq8RCUA","gIYvEtlILt","GXdoHe6e4z","OxWIH5Drn0","0PktISbRYy","BpYhVlj07Q","RpBQmb29RJ","yEfy9lXFOB","a00b5ZUnqt",
+"aDGtSh1zcH","FGzgpfcwDa","BGaQYIn3NS","piJSkrhl0J","tjQxs0YAGH","uvf7AuoStw","sx5GlDG4sT","aez9yazIWp","uQIczbZLvS","Z4I1vQChxs",
+"BFkb8atef2","uoStwChuy3","uJScXKsjRK","EOE1oChuy3","1j5L8RmDcr","oQ87rBCxeC","uLtKsF6PT2","n8pJ9Twano","WaWsvyEfy9","4dEz6JJs5m",
+"QbxXcRpBQm","8xEKzpv0i7","zY1GYuoStw","m4bxUZv7z0","TwanoKsjRK","48cHLGv3Fq","64s8N580YD","RACujxXTI4","WDVWJxXTI4","yluBxpAhR1",
+"9y4lwtl72W","nnP8o0Kyfs","14FLRMezSW","PYBf4qQxHP","Uvlv4yluBx","1v5hHJRJQB","5Nammb29RJ","pmeCdVLTy6","FPfSEQWxoT","Oz8yZpmeCd",
+"8U2nUuAWyp","8TxD7MK07Y","1j5L8rz7Ut","07n1czQt6Q","MmKGJl83Ud","AkKTkrz7Ut","s93MlLDk6f","MmKGJjSjS3","sqVrfZv7z0","uvf7AzY1GY",
+"IRh48gtCA5","1j5L8v2eC3","i3pydM3zXL","ulk41QnJ1S","jS1ajgtCA5","1v5hHFLsph","SbRYy14FLR","EoToPrKDLJ","euZA5lViBv","4dEz6pvgjS",
+"D6rBy5VZjS","hYBCK5IhmG","RmDcrydG8U","LewvMuupzk","2TRI72Yz7E","tjQxs5IhmG","Nxx9VW3VFH","3otm6b29RJ","pFrrllkMUA","BFkb8tAOsr",
+"wiHrZcQOnv","pWiOsZ4I1v","lXFOB2Yz7E","PYBf4IRh48","prNT6WDVWJ","XflUqSmGzv","JJs5mCK5W7","Cp3mZn1pmO","bgJAzC2Irc","TCgPp6q6L9",
+"cmXIXUlU3M","gf8rIMm8si","BbwgAkB5nP","QClRLoGu6x","uvf7ACdyBV","7fsYMMmKGJ","LDk6fdmoS7","VjCZqReKEW","EOE1oxReec","L7cGcM3zXL",
+"v2eC3X6Pin","X6PinxReec","HlUbFiwzGk","jeskSKASQ8","xciqptl72W","Nxx9VIBe8k","1v5hH8hJdt","qaofNrz7Ut","HfyNQLbRTH","5IhmGdhSuH",
+"9iGoTCNHmv","kB5nPAgJHQ","0YAGHIBe8k","rhl0JJKWYR","AgJHQWaWsv","pvgjSlCMxy","0Wr5yKsjRK","uN6r38hJdt","CK5W7D6rBy","QYxC0Ss0Zu",
+"jeskSdQ586","7Ow5C580YD","Q6Lixn8pJ9","2NslmBCxeC","J2mQiCK5W7","KZamHLbRTH","rz7UtokgRi","GrDg72TRI7","nnP8oCxVEf","t59lRvLsmS",
+"suY4xCdyBV","RBhp0U3yw5","lsQGoJIqXi","KASQ8jS1aj","gf8rIxReec","iqv4ks7Mxk","zz4ZUZ4I1v","55rfBhe9IA","L7cGc0PktI","F6PT2uTacx",
+"9rlg9n8pJ9","hYBCKix74r","TCgPpaFFss","BFkb87Ow5C","1v5hH7ku1p","jSjS3tvdkD","6AFT0v1Hln","KsjRKksJby","GXdoHQClRL","v2eC35ZaEz",
+"pvgjSO3iyQ","AkKTkZzJHW","v8yFN1LB1L","ThjNnAOgEe","v8yFNL7cGc","XflUqcQOnv","Yw2oU9eoRc","MK07YpvgjS","lH1kt618Di","ru4UGyEfy9",
+"POUYS8FmFH","NOHszlkMUA","cQOnv5iGN5","tAOsrOHaBz","StlDJ5Namm","AIYUu7X3uy","618DijiVBP","0Wr5yNAFuw","yEfy9prNT6","In3NSL7cGc",
+"CNHmvzFgtB","tjQxsCdyBV","djsrvdhSuH","BbwgAgjUTu","tAOsrJRJQB","HzZT8WaWsv","mz8gxmX2GE","kB5nPNhXdu","WMiS3yvOMI","5IhmGK20wK",
+"uZPqgulk41","atef2TXQ0Z","Rxrsm8hJdt","zmLYDVerEA","dmoS7d7vjM","5VZjSO3iyQ","WMiS3FxX9q","faHirTwano","Waim6fqypy","d85a964s8N",
+"aez9yCK5W7","QClRLTa8f6","fcJOyGXdoH","fFDrJFVMxo","8xEKziqv4k","Zv7z0kZANm","xReec5ZaEz","TCgPprKDLJ","o8Uyd0ao3l","djsrvUvlv4",
+"2hEEUzHF1q","OUqFM4W0Tl","B3qemAmdQd","WaWsvIRh48","uLtKs9rlg9","B3qemv2eC3","xReecciuWz","5drc6pv0i7","NcICAFNYIM","ZuDtDQ6hMC",
+"FFDuixReec","1v5hHRBhp0","Kr8ysQChxs","S77LHblLA9","uQIcz0YAGH","dpe1v7fKYU","JRJQBk85Ae","AmdQdYw2oU","7fKYUi7WMQ","RzaZASWfou",
+"fqypynFqik","QssNCC2Irc","gf8rIi3pyd","lj07Qm4bxU","O3iyQkB5nP","qUJMdfcJOy","v8yFNrhl0J","kZANm8FmFH","POUYSpv0i7","BGaQYCxVEf",
+"jeskS6AFT0","FFDuiZzJHW","0h1b1AkKTk","ZUnqteuZA5","2Yz7EtaOXK","M6qcGFGzgp","yluBxqQxHP","aDGtSF6PT2","UmaEvJRJQB","vLsmSydG8U",
+"POUYSOUYuF","618DiVIlwP","Zv7z0M3zXL","t98iWFNYIM","No0QbWaim6","ReKEWRxrsm","Uvlv42hEEU","Pb1pa8hJdt","FLsphnlaBy","zqH0WnnP8o",
+"5Namm07n1c","zbIYYuZPqg","v2eC3CqqaD","cShY2lweGy","J2mQi8hJdt","4W0Tl7ku1p","ciuWzNcICA","AOgEeMK07Y","BFkb8uZPqg","euZA5guMb8",
+"5VZjSaez9y","RmDcrzbIYY","sx5Gl3weIF","bgJAz1v5hH","gIYvEjSjS3","SWfouAkKTk","mz8gxoQ87r","tuDySjSjS3","HlUbFZUnqt","bZLvSRzaZA",
+"s7MxkOUYuF","tjQxs2Yz7E","MmKGJY1mC0","AgJHQXflUq","suY4xRxrsm","tjQxsTXQ0Z","07n1cEOE1o","hE1Ql14FLR","faHirjS1aj","tAOsrd85a9",
+"uZPqg9eoRc","i7WMQuZPqg","4QMc9NhXdu","ZzJHWFnPFB","MK07YksJby","8cVD3euZA5","K20wKZhwG1","dQ586WmadA","8U2nUzbIYY","3otm68U2nU",
+"618Di7fKYU","pFrrlk85Ae","pAhR12Nslm","hYBCKbrhlQ","YjB9t48cHL","FnPFBX6Pin","EOE1oydG8U","I7p2aYh1hF","SbRYyd85a9","azIWpYw2oU",
+"EoToPQworu","Pb1pax3LDe","WPmlxWPmlx","VLTy6FNYIM","fqypy9iGoT","F6PT2jfREu","ni2v155rfB","wiHrZVLTy6","lm0pDdhSuH","a00b5b29RJ",
+"Q6LixRpBQm","qUJMdFxX9q","cL0aEzmLYD","F6PT2uPX7G","EdBKcF6PT2","F6PT2IjTwP","EOE1oksJby","8U2nUydG8U","a00b564s8N","cmXIXReKEW",
+"G1RhSJXljW","lm0pDpWiOs","rz7Utd85a9","jSjS32Yz7E","rhl0Jrz7Ut","cQOnvn1pmO","4dEz6yToGW","hSSvQyvOMI","MmsIo16lHc","618DiprNT6",
+"S77LH3otm6","RzaZA618Di","MezSWC2Irc","MmsIotuDyS","prNT6pmeCd","TCgPpuoStw","RxrsmWPmlx","Vprf26AFT0","CqqaDSjskQ","FjHXRSs0Zu",
+"DcpWBWDVWJ","2DREso8Uyd","LbRTHoVQp6","FnPFB7fsYM","Kr8ys14FLR","guMb8HlUbF","zHF1qdmoS7","DLhzMjSjS3","cQOnvpiJSk","tvdkDIRh48",
+"prNT6d85a9","pT8wuAOgEe","29QAzlweGy","sqVrfQnJ1S","FxX9qsuY4x","QssNClCMxy","O3iyQvkCHH","pT8wurz7Ut","TwanoKASQ8","9XyT9JKWYR",
+"L7cGcK20wK","hUTw7qaofN","hYBCKBGaQY","d7vjM0Kyfs","qQxHP07n1c","CdyBVgjUTu","8TxD7GSQwj","he9IA8xEKz","hSSvQ0Kyfs","GrDg7ulk41",
+"uupzkrz7Ut","jeskSSmGzv","WMiS35Mg9r","8TxD7pmeCd","fcwDasuY4x","2hEEUfaHir","lsQGoMojnP","zQt6QFGzgp","QWxoTB3qem","GXdoHl83Ud",
+"UlU3MuZPqg","FjHXR7fsYM","piJSkwDajX","yEfy9TXQ0Z","uN6r3vOqCE","guMb89eoRc","Yw2oUVNCPd","ECMvUs4786","1v5hHk85Ae","8TxD7GXdoH",
+"ZuDtDBpYhV","UmaEvzHF1q","HP433atef2","0PktI2DREs","Yh1hF7fsYM","07n1cvkCHH","vkCHHfcwDa","rz7UtuPX7G","UmaEvjzUqR","Ss0ZuiB08l",
+"KsjRKNo0Qb","B3qemFVMxo","qaofNPOUYS","oQ87rWreyP","OHaBzgtCA5","VjCZq16lHc","yofH3CqqaD","nlaByWaWsv","U3yw5No0Qb","In3NSDz1R3",
+"MmKGJb29RJ","ZzJHWprNT6","hYBCKyluBx","JIqXiHzZT8","L7cGcJkzUn","Pb1paVLTy6","VBjhzDLhzM","jSjS31v5hH","Qworu7ku1p","fcJOyStlDJ",
+"NOHszJKWYR","CxVEf5ZaEz","1j5L8s7Mxk","WmadAfmIK1","7ku1psuY4x","uupzkOHaBz","FFDuiMaJQs","8hJdtMaJQs","s7MxkFGzgp","I7p2aguMb8",
+"jtn0XuTacx","GXdoHvOqCE","7lUXZZ4I1v","6q6L9zbIYY","qaofNRxrsm","JJs5muJScX","8xEKzSbRYy","XyPZNuN6r3","POUYSjeskS","SbRYyDQimp",
+"MmsIoYw2oU","8TxD7uoStw","Oz8yZv2eC3","jiVBPs7Mxk","fqypy1LB1L","5ZaEz8cVD3","jSjS3Twano","MGlTFCIShG","fLNg89rlg9","h1zcHVerEA",
+"9XyT92Nslm","lm0pD2DREs","e6e4zrKDLJ","zQt6QB3qem","BpYhVLbRTH","zQt6QzmLYD","HzZT8LewvM","jeskSblLA9","0MR5X7fKYU","9eoRcwDajX",
+"uN6r3580YD","hYBCKCNHmv","JJs5mUvlv4","brhlQd85a9","uJScX0MR5X","tjQxsaDGtS","k85AelsQGo","OUqFMrhl0J","F6PT2NAFuw","29QAzNcICA",
+"MezSWs4786","7Ow5CCK5W7","5iGN5m4bxU","faHir580YD","GrDg7qQxHP","h1zcHZuDtD","LbRTHRpBQm","fcJOyMkgy8","9GXkXatef2","m4bxUM6qcG",
+"FwEJztuDyS","t59lRgdQsS","AmdQdFcWrW","NhXdulm0pD","ydG8UWaim6","VLTy6bgJAz","t98iWhUTw7","euZA5Chuy3","7lUXZ8cVD3","QYxC0pT8wu",
+"L7cGcXyPZN","qaofNuLtKs","QbxXcAOgEe","3otm65Mg9r","9XyT9JkzUn","GrDg7MmsIo","cL0aEJIqXi","euZA5S2Dfu","atef2lweGy","VjCZqtvdkD",
+"blLA9Z4I1v","2ZHdkni2v1","zQt6QNxx9V","iKqhr8TxD7","ix74rd7vjM","VerEA5drc6","xXTI4QssNC","hYBCKOxWIH","y94nw9iGoT","iB08li3pyd",
+"DG4sTbZLvS","8xEKz7fsYM","gIYvE16lHc","RpBQmWPmlx","t59lRlpF6W","2hEEU64s8N","DcpWB0MR5X","9iGoTF6PT2","9y4lwdmoS7","2ZHdkZuDtD",
+"K20wKVprf2","580YDtuDyS","IKxdLbZLvS","7ku1pt59lR","OxWIHTwano","JKWYRChuy3","VerEAWaim6","FNYIMFLsph","Ta8f6HzZT8","5iGN5sx5Gl",
+"3otm6cmXIX","LDk6f9iGoT","RkQkeF6PT2","n1pmOHfyNQ","QnJ1SCqqaD","DLhzM9XyT9","MGlTFS77LH","DQimpRBhp0","hYBCKNAFuw","KsjRKcQOnv",
+"blLA9piJSk","pT8wuAmdQd","RBhp0KsjRK","hE1Qlx3LDe","4QMc948cHL","9y4lwb29RJ","fqypyaFFss","2Yz7EAXpwE","bgJAzBbwgA","0PktIaFFss",
+"wDajXWMiS3","7hyVvpv0i7","OUYuF618Di","dQ586lpF6W","5drc6ciuWz","lsQGo48cHL","ru4UGRkQke","Uvlv4cShY2","U3yw5aFFss","3otm6OxWIH",
+"5nmWvuoStw","MmsIoJIqXi","jtn0XydG8U","KZamHdmoS7","cmXIXgIYvE","atef2uvf7A","7ku1pIKxdL","XflUqzqH0W","taOXK4QMc9","14FLRfFDrJ",
+"jiVBPfmIK1","fmIK1fFDrJ","FFDui14FLR","TwanojSjS3","okgRiNOHsz","jSjS3Q6hMC","kZANmPb1pa","M6qcGQbxXc","MK07YbZLvS","7ku1pHRxd8",
+"VjCZqYOfrY","Y1mC0RBhp0","ciuWzRzaZA","S2DfuHP433","MezSW6q6L9","tAOsrpAhR1","D6rByF6PT2","JIqXiprNT6","VBjhzzqH0W","tjQxslsQGo",
+"Gv3FqjiVBP","BGaQYtjQxs","7fsYM3weIF","oQ87ruN6r3","jfREu8RCUA","Mkgy85iGN5","2ZHdkyofH3","lXFOBjzUqR","aDGtS7X3uy","5VZjSYw2oU",
+"qaofN9eoRc","s93MlL7cGc","t59lR45cIH","Z4I1vOUqFM","5nmWvMezSW","K20wKv2eC3","QWxoT3otm6","9XyT9lXFOB","S2DfudQ586","Cp3mZMkgy8",
+"jeskSCNHmv","7Ow5CSjskQ","yEfy9atef2","5ZaEzpv0i7","LewvM2DREs","SmGzvAgJHQ","AkKTkn1pmO","24ARFTCgPp","JJs5mWaim6","nFqik2ZHdk",
+"RpBQmUl4a1","5drc6vLsmS","Q6LixRACuj","Waim6IjTwP","pT8wujS1aj","24ARFGWqqX","GWqqXRBhp0","ciuWzguMb8","Rxrsm7fKYU","nlaBy7fKYU",
+"SbRYyUmaEv","ZJTXH0ao3l","i7WMQWreyP","oVQp6nnP8o","suY4xydG8U","hYBCKcL0aE","WMiS3KASQ8","lpF6WvLsmS","Nxx9V2TRI7","hYBCKrKDLJ",
+"hYBCKFhtgl","gjUTuKr8ys","uN6r3DQimp","v1HlnlH1kt","FVMxoOUYuF","QYxC0k85Ae","In3NSRBhp0","aL6AJRsQUq","pWiOs9eoRc","Zv7z0HzZT8",
+"8TxD7EOE1o","QChxsFGzgp","hi5X7qaofN","vkCHHokgRi","MaJQs7hyVv","yvOMIAXpwE","Nxx9VvOqCE","QbxXcZhwG1","JRJQBFjHXR","bZLvScL0aE",
+"ciuWzCdyBV","2DREsqaofN","5Drn0DG4sT","jzUqRzFgtB","CK5W7pFrrl","jS1aj9XyT9","14FLRPYBf4","zbIYYIn3NS","TwanoIBe8k","tlILtl83Ud",
+"RACujMmsIo","Ss0ZuAOgEe","Chuy35VZjS","TwanoMK07Y","he9IAkZANm","ZhwG12Nslm","6q6L9guMb8","Yf2EcO3iyQ","OxWIHlH1kt","uTacx8RCUA",
+"48cHLSjskQ","sqVrfLewvM","PYBf4n8pJ9","14FLRpiJSk","XyPZNyofH3","yvOMIHRxd8","KZamHMezSW","SbRYy9GXkX","kB5nP4dEz6","SjskQCxVEf",
+"9eoRcGrDg7","cShY2Cp3mZ","7ku1pNo0Qb","FnPFBnlaBy","7fsYMFFDui","FLsphoGu6x","tvdkDa00b5","IBe8kni2v1","lXFOBSbRYy","HlUbFqQxHP",
+"UmaEvcQOnv","pT8wuVprf2","2DREsBpYhV","HzZT8RmDcr","VLTy6okgRi","FhtglJRJQB","LewvM8cVD3","7ku1ph1zcH","tAOsr2hEEU","euZA5UmaEv",
+"soy9tiqv4k","zqH0WHRxd8","rhl0JQYxC0","aez9yCxVEf","5nmWvmz8gx","Q6LixECMvU","NOHsz0BmCy","XyPZNlsQGo","pWiOsTwano","Ul4a1ix74r",
+"RxrsmfLNg8","yEfy9rz7Ut","oGu6xiqv4k","8xEKzX6Pin","QYxC0VIlwP","atef2S2Dfu","pAhR1QssNC","sqVrfGSQwj","JKWYRv2eC3","9GXkXvkCHH",
+"Ul4a1OUqFM","OxWIHO3iyQ","O3iyQFnPFB","0MR5Xv1Hln","OxWIHVjCZq","he9IA07n1c","n1pmOksJby","D6rByChuy3","wiHrZfaHir","dQ586WreyP",
+"Gv3FqNcICA","CqqaDkZANm","pmeCdsx5Gl","iwzGkReKEW","Mm8siRmDcr","jzUqRi7WMQ","WaWsvSWfou","StlDJX6Pin","euZA5RBhp0","IBe8kFGzgp",
+"7ku1pLDk6f","5Mg9rChuy3","FNYIMVIlwP","NcICAVBjhz","VBjhzYf2Ec","KASQ8djsrv","zqH0WEdBKc","Pb1paBCxeC","uZPqgbZLvS","jtn0XfLNg8",
+"zQt6QC2Irc","0Kyfs16lHc","AkKTkStlDJ","ZuDtDgtCA5","JJs5myToGW","5Drn0EOE1o","lH1ktGXdoH","dpe1v2Nslm","yofH3cmXIX","CNHmvqaofN",
+"16lHcZUnqt","wDajXdhSuH","cQOnvThjNn","lkMUABpYhV","L7cGc07n1c","v2eC3fmIK1","lH1kt24ARF","S77LHfLNg8","2Yz7EuJScX","nlaByFcWrW",
+"FLsphuN6r3","ix74rCp3mZ","2hEEU7fKYU","lH1ktVLTy6","v8yFNRzaZA","yEfy9CNHmv","yEfy9UmaEv","QYxC0zHF1q","QClRLJKWYR","OHaBzO3iyQ",
+"SWfouJXljW","DG4sTO3iyQ","i3pydiwzGk","VjCZqcmXIX","aDGtSoGu6x","Q6LixStlDJ","s93MlYOfrY","DG4sTdjsrv","VjCZq0PktI","SmGzvI7p2a",
+"jtn0XJ2mQi","okgRiAOgEe","GSQwj8U2nU","nlaByciuWz","M6qcGYOfrY","tAOsr1v5hH","dmoS78cVD3","ZUnqtTa8f6","Cfgr3vkCHH","nnP8orKDLJ",
+"618DijfREu","nnP8oStlDJ","nlaByyluBx","yofH3SWfou","5drc62Yz7E","uQIczYh1hF","GSQwjZ4I1v","D6rByFGzgp","dQ586lXFOB","WaWsvMGlTF",
+"RkQke24ARF","0MR5XzmLYD","D6rBynFqik","yofH3pT8wu","ydG8UZhwG1","5Mg9rrz7Ut","gtCA55iGN5","Pb1paru4UG","QChxsbrhlQ","TXQ0ZUmaEv",
+"lH1ktRBhp0","CIShGuPX7G","mz8gxokgRi","0PktICK5W7","djsrvF6PT2","FLsphxciqp","RBhp0zFgtB","zmLYDChuy3","VIlwPlj07Q","Gv3FqHP433",
+"hUTw7Yf2Ec","jtn0Xru4UG","yofH3YjB9t","U3yw5a00b5","dpe1vHRxd8","hUTw7Dz1R3","FhtglkZANm","Ta8f6vLsmS","he9IAtuDyS","2hEEUa00b5",
+"ReKEWSWfou","U3yw5KASQ8","16lHclXFOB","ThjNnuAWyp","M6qcG0ao3l","RpBQmECMvU","AgJHQIKxdL","SjskQTwano","B3qemLDk6f","Pb1pa5IhmG",
+"24ARFwDajX","xXTI4Ss0Zu","EOE1oHzZT8","QssNCBbwgA","fcwDaW7cTs","GSQwjt59lR","fcJOyFwEJz","5iGN58FmFH","16lHczFgtB","B3qem8xEKz",
+"LewvMpAhR1","tvdkDv8yFN","7X3uyuN6r3","Chuy3jSjS3","tAOsr0PktI","9GXkXNhXdu","gdQsSYOfrY","5Drn0d7vjM","vLsmS1LB1L","ni2v1dmoS7",
+"rKDLJMmKGJ","5ZaEzJ2mQi","2ZHdkvLsmS","X6PinQssNC","d85a94W0Tl","blLA9CIShG","FVMxo0MR5X","SjskQlm0pD","5IhmGix74r","FFDuiCqqaD",
+"fmIK1qQxHP","S2Dfujtn0X","Kr8ysFGzgp","Gv3FqJRJQB","55rfBKASQ8","FLsphlm0pD","3otm6jtn0X","9GXkXJJs5m","6q6L9he9IA","0Wr5ypvgjS",
+"FLsph0Kyfs","QbxXctjQxs","y94nwyofH3","piJSkk85Ae","lsQGoUvlv4","55rfBd85a9","HzZT8Mm8si","zmLYD0ao3l","zHF1quAWyp","Q6hMCEdBKc",
+"jiVBPaez9y","7Ow5CYf2Ec","F6PT2sx5Gl","tAOsrCfgr3","Pb1paksJby","2hEEU0YAGH","uAWypAgJHQ","tvdkDAgJHQ","tl72W8hJdt","lkMUACfgr3",
+"d7vjMo8Uyd","hYBCKHP433","oVQp6Q6hMC","suY4xQworu","BGaQYjzUqR","QClRLgIYvE","BCxeCDG4sT","FFDuiAXpwE","l83UddhSuH","5Mg9rwiHrZ",
+"tvdkDBGaQY","Y1mC08FmFH","0YAGHYjB9t","3weIFblLA9","VBjhzRBhp0","Ul4a1n8pJ9","WaWsvZhwG1","a00b5618Di","iKqhrSWfou","o8Uydfqypy",
+"CK5W764s8N","rKDLJJKWYR","XflUqn8pJ9","5iGN50BmCy","tAOsrHP433","0ao3lQClRL","fFDrJsuY4x","QssNC8hJdt","QbxXc5IhmG","HzZT8D6rBy",
+"NAFuwulk41","GXdoHIBe8k","2hEEUpvgjS","8FmFHfqypy","o8UydlH1kt","5Mg9rfcwDa","lweGysx5Gl","CK5W7GWqqX","lweGyMmKGJ","ydG8US2Dfu",
+"7ku1pSmGzv","FPfSEgf8rI","618DizY1GY","618DiEoToP","tlILtQnJ1S","9eoRc1j5L8","qQxHPaL6AJ","Cfgr3W3VFH","oQ87rS2Dfu","Cfgr30MR5X",
+"rhl0JMGlTF","Cp3mZsqVrf","RmDcrOz8yZ","pmeCdPYBf4","pvgjSTa8f6","5iGN516lHc","MmKGJRBhp0","S2DfuQbxXc","YOfrYhYBCK","24ARF0YAGH",
+"b29RJQClRL","Ta8f6pFrrl","pT8wu3weIF","uoStwJJs5m","L7cGcSmGzv","uvf7AZzJHW","hYBCKC2Irc","jeskSuJScX","ECMvUulk41","n8pJ9ogLgc",
+"No0QbDLhzM","rKDLJPYBf4","gf8rIv2eC3","i3pyds4786","ECMvUGWqqX","FnPFBjzUqR","kB5nPzbIYY","oQ87rd85a9","14FLRFxX9q","1LB1LkB5nP",
+"GrDg7BCxeC","0ao3lGWqqX","fFDrJv2eC3","gdQsSPYBf4","uN6r3ciuWz","bZLvSn8pJ9","CK5W7Waim6","KZamHuPX7G","lViBvfLNg8","FLsphQ6hMC",
+"PYBf4ECMvU","nnP8on1pmO","AkKTkhYBCK","x3LDe24ARF","Yh1hFD6rBy","okgRiGv3Fq","0Wr5yHfyNQ","gjUTu3weIF","GXdoHQ6Lix","tvdkDgf8rI",
+"HlUbFsqVrf","9rlg9C2Irc","C2IrceuZA5","aez9ynlaBy","M6qcGoGu6x","IRh48ciuWz","SmGzvs7Mxk","faHirRsQUq","16lHcFPfSE","rhl0JuPX7G",
+"618Didjsrv","EOE1oZJTXH","OxWIHtlILt","tlILtlsQGo","zz4ZU5IhmG","jiVBP7hyVv","tuDySSbRYy","3weIFG1RhS","BCxeCQworu","RxrsmuAWyp",
+"BFkb8oVQp6","pv0i7pWiOs","0BmCyo8Uyd","W3VFHUvlv4","FVMxoMojnP","iKqhrxciqp","4QMc9gtCA5","Cp3mZZuDtD","MaJQsO3iyQ","Cfgr3zmLYD",
+"uTacxIBe8k","DcpWBZzJHW","ciuWzfcwDa","fcwDauTacx","k85AeDQimp","zqH0WbrhlQ","pAhR10MR5X","8cVD3ZuDtD","5NammaL6AJ","uupzkWaWsv",
+"2TRI7dpe1v","euZA5azIWp","fLNg8dpe1v","oGu6xtaOXK","CxVEfRpBQm","14FLRSjskQ","dpe1v64s8N","2NslmlH1kt","dpe1v0BmCy","bgJAzJJs5m",
+"i7WMQ7ku1p","GSQwjMezSW","C2IrcgjUTu","tjQxswiHrZ","SjskQsuY4x","K4GS8zmLYD","MaJQsCK5W7","QssNCgdQsS","lH1ktFNYIM","gIYvEYf2Ec",
+"ReKEW7hyVv","TXQ0Zdjsrv","sqVrfqaofN","IRh48qUJMd","Yh1hFW3VFH","xciqp2Yz7E","lj07QoQ87r","atef2x3LDe","0MR5XQworu","AgJHQe6e4z",
+"CqqaDtAOsr","uvf7Ahi5X7","FjHXRcQOnv","Mkgy8F6PT2","5nmWvGXdoH","fqypypv0i7","lsQGoI7p2a","jzUqR2TRI7","W3VFHStlDJ","iB08lCfgr3",
+"d7vjMprNT6","POUYSiwzGk","RkQkeD6rBy","QnJ1S5iGN5","qUJMdkB5nP","uTacxdQ586","BCxeCOz8yZ","RpBQm7fKYU","jzUqR8RCUA","CdyBV0ao3l",
+"ogLgcdmoS7","7X3uyQ6hMC","y94nwNo0Qb","5Drn0l83Ud","kZANmZhwG1","cmXIXRpBQm","S2DfuQnJ1S","RpBQm1j5L8","sqVrfBpYhV","DQimpMojnP",
+"hYBCKjfREu","uZPqghYBCK","HfyNQWmadA","suY4xBCxeC","Chuy3rhl0J","7X3uyCdyBV","gIYvEVIlwP","QWxoTvOqCE","cQOnvFjHXR","UlU3ML7cGc",
+"P6bcgUl4a1","9XyT9zFgtB","3otm6uoStw","ECMvUZJTXH","XflUq618Di","RkQke5ZaEz","JIqXi6AFT0","7ku1pU3yw5","yofH3J2mQi","9y4lwQWxoT",
+"1v5hH8xEKz","FcWrWuupzk","QnJ1S580YD","uAWypaFFss","Yw2oU2TRI7","lsQGojSjS3","S77LHru4UG","fcwDaRzaZA","hYBCKjiVBP","hUTw73weIF",
+"FPfSEX6Pin","9GXkXW3VFH","lsQGo2ZHdk","pWiOspmeCd","oVQp6WPmlx","7hyVvzQt6Q","ZJTXHk85Ae","K4GS8DLhzM","FxX9qTXQ0Z","pT8wuZUnqt",
+"WPmlxQYxC0","s7MxkuQIcz","Yw2oUhi5X7","GWqqXReKEW","tlILtZzJHW","fLNg8suY4x","QnJ1Ssx5Gl","UmaEvyEfy9","DQimp4dEz6","iKqhrI7p2a",
+"Ul4a1jfREu","oVQp6nlaBy","xReec7fsYM","yvOMIaez9y","AkKTk4dEz6","fLNg8KZamH","0Wr5yB3qem","In3NScL0aE","3weIFJIqXi","sqVrf7fKYU",
+"5NammpvgjS","ciuWzFcWrW","lCMxys4786","gdQsSRzaZA","FwEJzEdBKc","tlILt5ZaEz","zz4ZUxXTI4","hi5X724ARF","0ao3l5Drn0","hi5X7TXQ0Z",
+"VerEAAkKTk","xReec2hEEU","Chuy348cHL","aDGtS5drc6","jfREu5Drn0","7ku1ps93Ml","L7cGcsx5Gl","MezSW580YD","gdQsSatef2","uupzkdmoS7",
+"FGzgpzHF1q","zQt6QSmGzv","hE1QlBCxeC","CxVEflsQGo","JKWYRUvlv4","uJScX4QMc9","2Yz7E5Mg9r","BCxeCWDVWJ","JkzUnVIlwP","JIqXiDLhzM",
+"Ss0ZuCxVEf","wiHrZjtn0X","55rfBix74r","Y1mC0CqqaD","CdyBVzFgtB","s93Mlhi5X7","7hyVvuQIcz","uoStwKZamH","Kr8ys0Wr5y","cQOnvUl4a1",
+"n8pJ9pWiOs","5drc67Ow5C","5nmWv6q6L9","v8yFNbZLvS","2hEEUfqypy","sqVrfpvgjS","l83UdCIShG","LbRTHMaJQs","aFFssxReec","YOfrYi7WMQ",
+"kZANm0BmCy","tvdkD07n1c","rhl0JtlILt","KASQ8L7cGc","vLsmSfcJOy","2DREsCNHmv","DLhzMMojnP","580YDDz1R3","faHirt59lR","tvdkDYjB9t",
+"HP433gIYvE","s7MxkgdQsS","8RCUAd85a9","B3qemuQIcz","VjCZqyluBx","C2IrccShY2","ZJTXH0MR5X","aL6AJ5ZaEz","faHirXyPZN","CxVEfRsQUq",
+"0MR5X9GXkX","WaWsvNo0Qb","qaofNFLsph","oQ87rjtn0X","ZUnqtCdyBV","Dz1R3CK5W7","1LB1LQ6Lix","yToGW48cHL","GWqqXJXljW","PYBf4NAFuw",
+"TXQ0ZWmadA","VIlwPtjQxs","zHF1qzHF1q","5IhmG5ZaEz","lsQGopiJSk","gtCA5hYBCK","7ku1p07n1c","ni2v1VNCPd","BpYhV45cIH","PYBf4BGaQY",
+"fFDrJIBe8k","azIWpMK07Y","lj07QydG8U","jiVBPPYBf4","Kr8ysSjskQ","VNCPdVBjhz","k85Aepv0i7","2TRI7X6Pin","4dEz6hYBCK","a00b5jtn0X",
+"WPmlxMkgy8","VLTy6jS1aj","AkKTk2ZHdk","Mm8siRzaZA","W7cTsCxVEf","OUYuFtjQxs","soy9tsqVrf","D6rBypT8wu","24ARFzz4ZU","TXQ0Z5IhmG",
+"I7p2afFDrJ","bgJAzhUTw7","Y1mC00BmCy","Kr8ys0YAGH","7hyVvGXdoH","nFqikzFgtB","I7p2aYOfrY","MezSW7fsYM","NAFuwd85a9","WmadAjS1aj",
+"d7vjMIRh48","rhl0JyofH3","VLTy6tjQxs","0BmCy8TxD7","5VZjSF6PT2","Yh1hFJIqXi","WmadAWDVWJ","uZPqgSs0Zu","O3iyQQworu","RpBQmyluBx",
+"pT8wuvOqCE","CdyBVfaHir","EoToPG1RhS","o8UydNOHsz","0BmCyjzUqR","EOE1o45cIH","8FmFHtAOsr","HlUbFbZLvS","No0QbpT8wu","pvgjSt98iW",
+"ZhwG1cQOnv","8U2nUl83Ud","piJSkFxX9q","7Ow5COUqFM","M3zXLQworu","NAFuwUmaEv","5IhmGrhl0J","GSQwjJXljW","DQimpzY1GY","9y4lw7X3uy",
+"jeskSo8Uyd","IRh48QnJ1S","Yh1hF0BmCy","ECMvUOUqFM","0YAGH0PktI","48cHLHzZT8","piJSkYf2Ec","fcwDa5drc6","jfREuCfgr3","pv0i7S77LH",
+"6AFT02hEEU","7hyVv5drc6","SWfou2Nslm","BbwgAvkCHH","HP433euZA5","Y1mC0Oz8yZ","OUqFMYw2oU","cmXIXjtn0X","FjHXRt59lR","jtn0XguMb8",
+"kB5nPYjB9t","okgRiy94nw","SmGzvi7WMQ","FLsphlj07Q","W3VFHe6e4z","EOE1osuY4x","VBjhzcShY2","0KyfsDz1R3","gjUTuQYxC0","8RCUAcmXIX",
+"2Yz7Ee6e4z","HRxd8ksJby","5iGN57hyVv","DG4sTZhwG1","FLsphCNHmv","hSSvQL7cGc","BGaQYMezSW","KZamHRxrsm","hUTw7kB5nP","2Nslmatef2",
+"IRh48nnP8o","gjUTu5ZaEz","uAWyplXFOB","M3zXLEdBKc","NcICAaL6AJ","TXQ0ZM3zXL","GXdoH29QAz","8TxD7Dz1R3","cShY2oQ87r","CIShG0BmCy",
+"AmdQdzFgtB","KZamHgf8rI","NhXduVLTy6","RBhp0VjCZq","m4bxU5iGN5","t59lRaL6AJ","Q6hMCWaWsv","i7WMQX6Pin","iKqhrxReec","AgJHQzY1GY",
+"yEfy9yluBx","45cIHyToGW","yvOMIguMb8","1j5L8618Di","NhXduU3yw5","lj07Q580YD","XyPZNt59lR","QClRLvOqCE","cmXIXWaWsv","Vprf2OxWIH",
+"dmoS7CK5W7","1LB1L45cIH","GrDg7BbwgA","29QAzlCMxy","zFgtBgIYvE","No0QbuAWyp","VerEAPYBf4","ni2v1PYBf4","qaofN3otm6","SbRYyzmLYD",
+"jfREuW7cTs","iKqhrQWxoT","rhl0JMezSW","AOgEeJRJQB","1LB1LyofH3","Z4I1vNhXdu","2TRI7ciuWz","1v5hH7lUXZ","fmIK1ZuDtD","a00b5MojnP",
+"8RCUAEoToP","WPmlxI7p2a","fmIK1W7cTs","5Drn0zmLYD","FPfSEFxX9q","lsQGoQChxs","MK07YkZANm","JKWYR0MR5X","QnJ1Sni2v1","CdyBVG1RhS",
+"aFFssv1Hln","ZUnqtuN6r3","ogLgcGv3Fq","euZA5Mkgy8","OUYuFMGlTF","hUTw7CxVEf","QYxC06q6L9","djsrvPb1pa","0MR5XWaWsv","t98iWlViBv",
+"5iGN545cIH","YjB9tUlU3M","XflUq5Namm","gtCA5Dz1R3","P6bcgZzJHW","GXdoHWPmlx","TCgPpqaofN","Yf2EcYjB9t","BpYhVfaHir","RBhp0JXljW",
+"ru4UGNo0Qb","UlU3M0Wr5y","uN6r3x3LDe","b29RJsqVrf","jtn0XlViBv","zqH0WRACuj","IjTwPCNHmv","CIShGsuY4x","SmGzv2ZHdk","IBe8kD6rBy",
+"JkzUn4QMc9","7fsYMi7WMQ","CdyBVChuy3","ECMvUPYBf4","VjCZq5Mg9r","qaofNuAWyp","8FmFHDQimp","lkMUAa00b5","1v5hHzmLYD","YjB9tAgJHQ",
+"NcICAJIqXi","FhtglHfyNQ","RxrsmMmKGJ","cmXIXFPfSE","SmGzvIBe8k","hE1Qla00b5","gdQsSXflUq","GrDg7t98iW","vkCHH6AFT0","5NammbZLvS",
+"gdQsSAgJHQ","ksJbyOHaBz","lH1ktmz8gx","1LB1LuN6r3","ix74rx3LDe","tlILtZ4I1v","OHaBzBbwgA","MK07YNo0Qb","5Mg9rNcICA","9rlg9sx5Gl",
+"DG4sTVjCZq","fmIK1lj07Q","MmKGJWaWsv","SmGzv7X3uy","ZhwG1t98iW","D6rByCIShG","WaWsvHP433","TXQ0Z24ARF","7fsYMlsQGo","OxWIHIjTwP",
+"7Ow5C5nmWv","6q6L9RzaZA","RsQUqtuDyS","BpYhV2Nslm","BGaQY7Ow5C","RsQUqaDGtS","3weIF45cIH","FjHXRQssNC","bZLvSzHF1q","pWiOsCqqaD",
+"WDVWJ07n1c","RmDcrfcwDa","gdQsS48cHL","6q6L9LbRTH","CIShGJkzUn","CdyBVYf2Ec","WmadA64s8N","rhl0Jsx5Gl","OHaBzFGzgp","XflUqTa8f6",
+"fLNg8euZA5","W7cTs5iGN5","MK07YHfyNQ","No0QbzHF1q","0h1b15Mg9r","Waim6Mkgy8","ZJTXHguMb8","lsQGoVprf2","s93Mld85a9","yToGWdQ586",
+"3weIFix74r","tl72WW7cTs","BFkb8RmDcr","dmoS7s93Ml","2TRI7uTacx","VBjhzjSjS3","tlILt8RCUA","jtn0XFhtgl","he9IAru4UG","0BmCyJJs5m",
+"FwEJz5drc6","jtn0X16lHc","RpBQmsqVrf","4QMc9uQIcz","dmoS7VNCPd","29QAz9GXkX","uQIczd7vjM","U3yw5t59lR","uvf7AaFFss","gjUTuWDVWJ",
+"FGzgphe9IA","2ZHdkTwano","sx5GlBCxeC","oVQp6jiVBP","pFrrlEoToP","dmoS7YOfrY","zFgtBPYBf4","b29RJBbwgA","IKxdLsqVrf","J2mQiAkKTk",
+"ECMvUyvOMI","UlU3MVjCZq","EOE1oECMvU","rhl0J9y4lw","P6bcgQ6hMC","NAFuwY1mC0","5nmWvTCgPp","NOHsz1j5L8","KZamHJ2mQi","ulk4145cIH",
+"QbxXczqH0W","GWqqXSjskQ","ulk41FFDui","rKDLJ5iGN5","okgRin1pmO","qUJMdokgRi","tl72W9XyT9","J2mQiXyPZN","3weIFCxVEf","PYBf41LB1L",
+"zqH0WCK5W7","piJSkAXpwE","AIYUuNAFuw","5nmWv48cHL","MGlTFyEfy9","faHir07n1c","0Kyfs0Kyfs","okgRiFFDui","iwzGkuoStw","7hyVvO3iyQ",
+"2NslmaDGtS","Cp3mZFnPFB","Waim6tAOsr","x3LDelH1kt","ZJTXHNAFuw","uN6r3FnPFB","CdyBVQnJ1S","EoToPRkQke","2Yz7Etl72W","FVMxogjUTu",
+"GrDg7K4GS8","5iGN5KASQ8","Vprf2yvOMI","AXpwEvOqCE","GWqqXqQxHP","MGlTFpWiOs","MmsIoOUYuF","0BmCyni2v1","uvf7AVjCZq","0Wr5yMojnP",
+"oQ87rnFqik","XflUqBGaQY","pv0i7oQ87r","IRh48W3VFH","2ZHdkFLsph","Dz1R3RACuj","cL0aEcQOnv","IjTwPLewvM","7fKYUIBe8k","uN6r3Nxx9V",
+"AgJHQWDVWJ","t59lRM3zXL","0KyfsgIYvE","s4786VjCZq","1LB1L5drc6","faHirUl4a1","DG4sTUlU3M","2TRI77X3uy","a00b5hSSvQ","jzUqR24ARF",
+"aL6AJ0MR5X","SbRYyS2Dfu","Cfgr3qUJMd","8RCUADQimp","t59lRCdyBV","uvf7ACIShG","DLhzMlH1kt","tl72Wv1Hln","KZamHNo0Qb","uN6r3cShY2",
+"faHirECMvU","CxVEfUl4a1","MmsIoPYBf4","IRh48Oz8yZ","Uvlv4MGlTF","9iGoT4dEz6","QWxoT9XyT9","MGlTFKr8ys","brhlQU3yw5","BCxeCMK07Y",
+"v1Hln9GXkX","jeskS7fsYM","Cp3mZpmeCd","45cIHFwEJz","MojnPJRJQB","piJSk2Nslm","ZuDtDatef2","Oz8yZCdyBV","ksJbyciuWz","9rlg91LB1L",
+"8FmFHFxX9q","s7MxktlILt","rKDLJMm8si","qQxHPTCgPp","fmIK1jiVBP","tvdkDZhwG1","i7WMQcQOnv","8RCUAazIWp","uoStwQ6hMC","BpYhVpWiOs",
+"X6PinQbxXc","fqypy07n1c","ksJbynlaBy","IBe8krhl0J","kB5nPC2Irc","lXFOBZJTXH","VIlwP2Yz7E","sx5GlPb1pa","4W0TlhUTw7","vkCHHZv7z0",
+"zmLYDOUYuF","LbRTHVprf2","HRxd89GXkX","l83Ud7ku1p","1v5hHru4UG","yluBxWPmlx","OHaBzpv0i7","SjskQatef2","dmoS7MK07Y","OHaBzSWfou",
+"hYBCKwDajX","RACujnnP8o","BFkb8n1pmO","RBhp0X6Pin","v1Hlndjsrv","LewvMZuDtD","8U2nUxXTI4","Ss0ZuYf2Ec","FPfSEulk41","Ul4a1cShY2",
+"YOfrYv1Hln","dQ586gIYvE","v8yFNfqypy","ECMvUatef2","uTacx8hJdt","iwzGkFwEJz","jSjS3CK5W7","uTacx5VZjS","XflUqZv7z0","580YDFnPFB",
+"uN6r3FcWrW","AXpwEQworu","MaJQsIn3NS","FLsphI7p2a","ciuWzFFDui","8RCUAi7WMQ","9GXkXMaJQs","hSSvQMezSW","FLsphwDajX","fcJOyQbxXc",
+"BCxeC0Wr5y","hUTw7oVQp6","MaJQsv8yFN","8FmFHZJTXH","RmDcr0ao3l","UlU3MtuDyS","6q6L9b29RJ","v2eC37Ow5C","Ul4a1HfyNQ","QChxs2hEEU",
+"2ZHdk7fKYU","jtn0XWDVWJ","NAFuw3weIF","2ZHdkguMb8","ReKEWgjUTu","JIqXiG1RhS","tlILtpT8wu","XflUqHlUbF","HfyNQAkKTk","580YDx3LDe",
+"1j5L8FcWrW","9rlg9lsQGo","ru4UGFFDui","ix74rRmDcr","55rfBZuDtD","oQ87rStlDJ","k85Aev8yFN","pFrrlfaHir","lkMUAK20wK","24ARFBbwgA",
+"MK07Y5nmWv","3otm6tuDyS","FPfSEP6bcg","NOHszuQIcz","RACujt98iW","DG4sTzmLYD","ZUnqtXyPZN","lViBvUmaEv","FNYIMTa8f6","HzZT8FjHXR",
+"WmadARsQUq","1LB1Lt59lR","b29RJaez9y","ThjNnIRh48","J2mQiMGlTF","EdBKctl72W","MezSW0BmCy","7ku1ppiJSk","aDGtSlXFOB","VjCZqokgRi",
+"hE1QlgIYvE","jfREuZuDtD","BCxeC1LB1L","tvdkDo8Uyd","ThjNnP6bcg","FLsphn1pmO","tlILtrhl0J","zFgtBsx5Gl","tAOsr4W0Tl","yToGW6AFT0",
+"uLtKsY1mC0","DQimpLDk6f","v1HlnX6Pin","jiVBPP6bcg","zz4ZU7fsYM","7hyVvAXpwE","azIWpuupzk","zmLYDbgJAz","7hyVvU3yw5","1j5L8yvOMI",
+"UlU3MhSSvQ","Ul4a1HlUbF","zHF1qZuDtD","Rxrsm5IhmG","LewvMuPX7G","RsQUqMkgy8","QChxs7lUXZ","AOgEeulk41","dmoS7OxWIH","2NslmvkCHH",
+"l83UdFLsph","h1zcHOUqFM","8TxD77ku1p","vLsmS2Yz7E","s7MxkLbRTH","HRxd8hUTw7","O3iyQ8FmFH","jiVBPKZamH","WMiS3aez9y","QnJ1SCp3mZ",
+"Cfgr3sqVrf","pv0i748cHL","RpBQmRACuj","lViBvlXFOB","7fKYUpmeCd","5drc6gtCA5","QworuBbwgA","16lHcyToGW","s4786SmGzv","ix74r9y4lw",
+"nFqiklkMUA","YjB9trhl0J","qUJMdDQimp","qQxHPQClRL","55rfBK20wK","IRh48S77LH","jtn0X9y4lw","yluBx2ZHdk","VBjhztvdkD","cmXIXuQIcz",
+"VLTy6lH1kt","55rfB5Drn0","e6e4zciuWz","xReecJXljW","CxVEfpAhR1","Chuy3FGzgp","TXQ0ZCK5W7","EOE1owiHrZ","qUJMdfFDrJ","3weIFWPmlx",
+"h1zcH6q6L9","sx5GlZJTXH","3otm6VerEA","JkzUncL0aE","9y4lwjiVBP","KASQ8DQimp","fmIK1d7vjM","ZJTXHRsQUq","Q6hMC9y4lw","SmGzvGXdoH",
+"fqypyOHaBz","J2mQiiKqhr","JRJQBRkQke","fcJOy0Kyfs","WmadA7fKYU","mX2GEuTacx","14FLRCfgr3","Waim6hSSvQ","v2eC3jzUqR","Yh1hFQChxs",
+"8hJdtEoToP","CK5W707n1c","IjTwPHfyNQ","b29RJIRh48","LbRTHJRJQB","DG4sT9XyT9","0PktIFxX9q","Ul4a15Mg9r","a00b51j5L8","jS1ajBpYhV",
+"POUYSL7cGc","lsQGoFhtgl","Vprf2gdQsS","zbIYYTa8f6","cShY2LewvM","zbIYYuAWyp","Gv3Fq29QAz","uoStwEOE1o","WmadAkZANm","7fKYUrKDLJ",
+"zz4ZUguMb8","d85a9GrDg7","NAFuwPYBf4","aDGtS8xEKz","dhSuHQ6Lix","FVMxouZPqg","VNCPdtjQxs","Yw2oUFLsph","cmXIXCp3mZ","GrDg7n8pJ9",
+"azIWpSmGzv","FxX9qiqv4k","Kr8ysVNCPd","64s8Na00b5","OUYuFuN6r3","TXQ0ZDLhzM","oVQp6hi5X7","KZamHlH1kt","580YDFcWrW","LbRTH1j5L8",
+"K20wKtl72W","64s8NW3VFH","AIYUubgJAz","s4786ECMvU","G1RhSmz8gx","xXTI4lweGy","zHF1qsuY4x","1LB1LBFkb8","mX2GEDG4sT","ThjNnaL6AJ",
+"SmGzvMm8si","AmdQdCxVEf","DQimpF6PT2","2Yz7EOxWIH","45cIHhe9IA","tjQxshYBCK","lm0pDoVQp6","48cHLDcpWB","AkKTkQClRL","y94nw4dEz6",
+"8RCUASjskQ","gtCA5SbRYy","uupzkFNYIM","5Nammk85Ae","t59lR7ku1p","JKWYRD6rBy","1LB1LMK07Y","MGlTFAkKTk","uN6r3RmDcr","OUYuFzmLYD",
+"Vprf2AOgEe","QWxoT48cHL","VBjhzni2v1","Mkgy80Wr5y","vLsmSIjTwP","0h1b1zQt6Q","2NslmX6Pin","ix74rDz1R3","NOHszru4UG","OUqFMkB5nP",
+"S2DfuECMvU","K4GS8rKDLJ","jeskShYBCK","JJs5mLDk6f","GSQwjUl4a1","yluBxRxrsm","vkCHHt59lR","uQIcz5iGN5","HfyNQ0BmCy","IBe8kDz1R3",
+"okgRiSs0Zu","S77LHEoToP","yToGWVLTy6","FhtglNOHsz","Kr8yslj07Q","xReecQnJ1S","W3VFH8TxD7","4QMc9BGaQY","YOfrYAOgEe","LbRTH5iGN5",
+"WMiS3v1Hln","KsjRK7fKYU","aDGtSFLsph","AkKTkprNT6","rKDLJRxrsm","HlUbFydG8U","ZJTXHgdQsS","CqqaDCIShG","gtCA5AkKTk","4dEz6GXdoH",
+"oGu6xpAhR1","ThjNnRxrsm","dmoS7618Di","0YAGHi7WMQ","QClRLsoy9t","v1Hlnhi5X7","580YDNo0Qb","lpF6WsuY4x","S77LHfqypy","lH1ktGSQwj",
+"DLhzMVLTy6","uN6r3yEfy9","Yf2EcGSQwj","bZLvShi5X7","5iGN5jzUqR","lpF6WkB5nP","D6rByokgRi","hSSvQD6rBy","yluBxX6Pin","CIShGoQ87r",
+"euZA5ksJby","8hJdtDQimp","5ZaEz5Drn0","RmDcrm4bxU","s7Mxk5ZaEz","Chuy3S77LH","v2eC3zbIYY","ZuDtD3weIF","fFDrJK20wK","9iGoTUmaEv",
+"07n1cmz8gx","piJSkNxx9V","QbxXcuPX7G","P6bcgKr8ys","FNYIMdpe1v","4W0TlK20wK","yvOMIFnPFB","gtCA5lCMxy","QbxXc5Namm","lXFOBgf8rI",
+"xXTI4uAWyp","FnPFBAXpwE","n1pmOxXTI4","cL0aEzY1GY","MGlTFTXQ0Z","G1RhSydG8U","tlILtGSQwj","fLNg8lH1kt","mX2GEuJScX","kZANmdQ586",
+"vOqCEulk41","cShY2gIYvE","lj07QVerEA","XyPZNTa8f6","Ta8f6xciqp","prNT6tjQxs","IKxdLGv3Fq","FFDuit98iW","SmGzvY1mC0","RmDcrIBe8k",
+"FxX9qfFDrJ","m4bxUiqv4k","gf8rIKASQ8","aDGtSGSQwj","QWxoTtvdkD","Oz8yZ9iGoT","jtn0XJIqXi","5VZjSQYxC0","I7p2a2Nslm","MGlTFWaim6",
+"0BmCylCMxy","hYBCKuPX7G","fLNg8zY1GY","zz4ZUlweGy","prNT6HRxd8","14FLRMGlTF","POUYS48cHL","GWqqXBGaQY","sx5GlqUJMd","XyPZNv2eC3",
+"BGaQYQYxC0","C2Ircdjsrv","v8yFNVLTy6","RmDcrx3LDe","piJSkPYBf4","gIYvEfcJOy","6q6L9gf8rI","he9IAaFFss","Yw2oUiwzGk","n8pJ9Vprf2",
+"lH1kt0BmCy","wiHrZYjB9t","k85AepiJSk","GSQwjWMiS3","QWxoT9eoRc","gIYvEqaofN","VNCPdOUqFM","yvOMIL7cGc","C2IrcnlaBy","48cHL8U2nU",
+"kB5nPogLgc","2hEEUpAhR1","MK07Y8FmFH","nlaByuLtKs","MGlTFciuWz","8cVD3jiVBP","oGu6xCNHmv","hi5X7s93Ml","MaJQsDcpWB","nnP8ol83Ud",
+"P6bcg8RCUA","pT8wulXFOB","FLsph0YAGH","ReKEWcShY2","GWqqXBCxeC","JIqXizQt6Q","TCgPpbZLvS","CK5W7bgJAz","lsQGoXflUq","NcICAhi5X7",
+"YjB9tKsjRK","gtCA5zqH0W","OHaBzvLsmS","EdBKcoQ87r","dhSuHIn3NS","soy9tK20wK","aDGtSD6rBy","LewvMMaJQs","euZA5GXdoH","P6bcgEOE1o",
+"l83UdxXTI4","tuDySMmKGJ","Ta8f6pv0i7","NcICAWPmlx","9GXkXMGlTF","jtn0XQworu","Dz1R3AmdQd","uLtKsI7p2a","aL6AJBpYhV","Ul4a1Qworu",
+"29QAzRpBQm","FGzgp618Di","5Mg9rHzZT8","S77LHdmoS7","hSSvQuLtKs","9iGoTIjTwP","cmXIXP6bcg","QnJ1S8hJdt","EdBKc3otm6","lViBvhE1Ql",
+"pT8wuD6rBy","dhSuHAgJHQ","oQ87rx3LDe","C2Ircrhl0J","CxVEfMGlTF","Pb1pazY1GY","zqH0WciuWz","gtCA5618Di","d7vjMjeskS","0h1b1NcICA",
+"e6e4zBFkb8","zQt6QcShY2","b29RJgf8rI","CxVEfNAFuw","Y1mC0mX2GE","XyPZNGWqqX","TCgPpuupzk","NAFuw48cHL","zFgtBdhSuH","ECMvUHRxd8",
+"7Ow5CKZamH","JXljWYOfrY","bZLvSOUYuF","fFDrJ0Wr5y","iB08lF6PT2","VNCPdKsjRK","uN6r3qaofN","ciuWzyToGW","suY4xlj07Q","1v5hHprNT6",
+"piJSkCp3mZ","iB08ljzUqR","tuDyS4dEz6","kZANm8cVD3","jSjS3FnPFB","uAWypJXljW","l83Udy94nw","BGaQYMkgy8","lweGy5ZaEz","lpF6W5nmWv",
+"14FLRsuY4x","BpYhVfLNg8","dhSuHHzZT8","B3qem0Kyfs","POUYSjS1aj","vOqCEs4786","MaJQs8hJdt","2Yz7EuZPqg","IRh48lH1kt","EoToP0YAGH",
+"m4bxUtvdkD","DG4sT5IhmG","piJSk2Yz7E","wiHrZThjNn","XyPZNVLTy6","lsQGogf8rI","YOfrYM3zXL","QChxsRkQke","RBhp03weIF","jSjS3uvf7A",
+"b29RJIBe8k","ZJTXHNcICA","U3yw5hYBCK","jtn0XUmaEv","HfyNQNOHsz","C2IrcdmoS7","FcWrWTwano","OxWIHfcJOy","piJSkmX2GE","24ARFKASQ8",
+"AkKTkuoStw","29QAzGWqqX","azIWpFVMxo","jfREuMmsIo","CNHmvTXQ0Z","KZamH1j5L8","soy9tkZANm","tjQxsfLNg8","HzZT8Yw2oU","jtn0XDG4sT",
+"FNYIMQClRL","KASQ88FmFH","wDajXMGlTF","W3VFHoQ87r","8TxD7YjB9t","a00b5uPX7G","GrDg7Ta8f6","zQt6QQYxC0","gjUTuru4UG","iqv4k7fKYU",
+"b29RJS2Dfu","RsQUqRsQUq","Z4I1veuZA5","FGzgppvgjS","oQ87rUmaEv","lkMUAoGu6x","9iGoT9y4lw","ReKEWru4UG","oQ87r6q6L9","aDGtSfqypy",
+"Chuy3n1pmO","S2Dfu64s8N","qUJMdHzZT8","yEfy9JkzUn","QClRLFwEJz","BbwgAIKxdL","AkKTkECMvU","BbwgA7hyVv","MezSWLewvM","zY1GYJJs5m",
+"MGlTFJJs5m","GXdoHguMb8","7ku1pNcICA","5Drn05ZaEz","RBhp0uvf7A","YOfrYuupzk","CxVEfjS1aj","NOHszlj07Q","SjskQRACuj","RBhp0FxX9q",
+"lCMxyokgRi","5Mg9ruN6r3","IKxdLJIqXi","BpYhVGv3Fq","hUTw7zFgtB","FPfSEy94nw","48cHLtjQxs","tuDySAIYUu","FLsphCIShG","K20wKdjsrv",
+"IRh48OUYuF","uupzkpiJSk","8FmFHBpYhV","ZuDtDdhSuH","ZuDtDzQt6Q","rhl0Jh1zcH","ECMvUcQOnv","piJSk2hEEU","P6bcgAgJHQ","yEfy9P6bcg",
+"Uvlv42Yz7E","1LB1L4W0Tl","rz7UttuDyS","gdQsSl83Ud","Cfgr3QClRL","TwanozY1GY","J2mQioQ87r","piJSkAIYUu","jtn0XDQimp","FFDuiFhtgl",
+"SjskQ2DREs","uQIczFjHXR","CqqaDfaHir","SWfouZv7z0","UmaEvyvOMI","AgJHQ9XyT9","ReKEWF6PT2","55rfBcQOnv","i3pydi3pyd","8RCUASmGzv",
+"7ku1pWaim6","2Yz7EYw2oU","JJs5mFcWrW","CdyBVjS1aj","pmeCd0ao3l","DcpWBogLgc","W7cTs45cIH","WDVWJFwEJz","VBjhzAXpwE","gdQsSm4bxU",
+"QbxXc7X3uy","618DiTCgPp","oQ87rMkgy8","VIlwP64s8N","YOfrYAIYUu","FNYIMO3iyQ","3otm6dQ586","5ZaEz9XyT9","1LB1LDLhzM","QbxXcBFkb8",
+"s7MxkDLhzM","uLtKsDz1R3","soy9tW3VFH","b29RJ4W0Tl","C2IrcUlU3M","kB5nPlj07Q","KsjRKyEfy9","jeskSl83Ud","bgJAzOxWIH","5Drn0Chuy3",
+"S77LHl83Ud","IKxdL3weIF","FcWrWsoy9t","tjQxsVLTy6","VjCZqAkKTk","e6e4z48cHL","JIqXiVprf2","Ta8f6uJScX","JKWYRAgJHQ","0ao3lyToGW",
+"Q6LixlViBv","FhtglyvOMI","s7MxkoVQp6","faHir3otm6","tvdkDvOqCE","M3zXLJJs5m","OUYuFRACuj","AgJHQ4W0Tl","HP433gf8rI","5Drn0euZA5",
+"Yw2oUGWqqX","nlaBy14FLR","MojnP48cHL","UlU3MYw2oU","fqypy0h1b1","euZA5brhlQ","lXFOBtuDyS","8TxD7tAOsr","NhXduGrDg7","sqVrfpWiOs",
+"fcwDapWiOs","MmKGJDG4sT","MK07YXyPZN","6q6L90Kyfs","JkzUnOHaBz","uN6r3WDVWJ","WPmlxgIYvE","FjHXRk85Ae","FjHXRgIYvE","i3pydRxrsm",
+"sx5GlK4GS8","atef2RkQke","ZJTXHO3iyQ","K20wKlH1kt","POUYSzbIYY","RmDcrGSQwj","oGu6xTCgPp","taOXKCIShG","dmoS7BCxeC","NAFuwhYBCK",
+"soy9tRsQUq","5iGN5oVQp6","HfyNQAmdQd","uTacx4W0Tl","0YAGHoQ87r","dmoS7QnJ1S","55rfBRsQUq","JIqXi1LB1L","EOE1oIBe8k","jiVBPqQxHP",
+"Yh1hF29QAz","0PktIwiHrZ","MGlTFDz1R3","pWiOsd7vjM","suY4xSs0Zu","QChxsQ6Lix","nFqikQnJ1S","XflUqHfyNQ","AXpwEJIqXi","xciqpdpe1v",
+"b29RJiKqhr","n8pJ9IjTwP","2Yz7EjeskS","ulk41y94nw","LbRTHyluBx","mX2GE24ARF","CdyBV8FmFH","i3pyddQ586","WPmlxK4GS8","a00b5QChxs",
+"k85AedmoS7","16lHc14FLR","kZANmhE1Ql","RkQkey94nw","64s8NyofH3","FwEJzPb1pa","Mkgy8taOXK","cShY2ulk41","lH1kte6e4z","uLtKsfmIK1",
+"lXFOBZzJHW","hSSvQ9GXkX","L7cGccL0aE","pWiOsFGzgp","RzaZAgtCA5","CqqaDn1pmO","oQ87riqv4k","MaJQs580YD","suY4xNAFuw","zz4ZUTXQ0Z",
+"HP433FFDui","Qworuhi5X7","fcwDaFFDui","JXljW8hJdt","dpe1vy94nw","WDVWJChuy3","UlU3MjiVBP","0YAGHVNCPd","s93MlKZamH","BbwgA7fsYM",
+"D6rByLewvM","euZA5dmoS7","WPmlx7fsYM","n8pJ9lCMxy","yToGWMmKGJ","FFDui4dEz6","uZPqgYjB9t","lm0pDciuWz","gIYvEHfyNQ","b29RJcShY2",
+"lCMxyuLtKs","fLNg8zFgtB","uAWypVNCPd","jtn0XK20wK","16lHcFnPFB","fFDrJDQimp","OUqFMn8pJ9","Oz8yZYf2Ec","okgRiFPfSE","hUTw7Qworu",
+"StlDJW3VFH","b29RJJJs5m","jSjS3SWfou","MaJQsYh1hF","tuDySlXFOB","gf8rIqaofN","JIqXiCfgr3","ciuWztaOXK","Dz1R38RCUA","FPfSEGWqqX",
+"JXljWYw2oU","WreyPGv3Fq","HP433s93Ml","5NammMGlTF","ZJTXHAmdQd","qQxHPTa8f6","cQOnvXflUq","0MR5XokgRi","Mm8siRsQUq","5drc67hyVv",
+"B3qemOHaBz","WaWsvdjsrv","AmdQdMezSW","aez9y8RCUA","Y1mC0EOE1o","ZuDtDzmLYD","HP433bgJAz","ECMvUAkKTk","1LB1L0Wr5y","F6PT255rfB",
+"uN6r3pWiOs","VLTy6580YD","2hEEUBCxeC","WaWsvHlUbF","BCxeCB3qem","BpYhVFhtgl","prNT6guMb8","1v5hHs93Ml","5Mg9rUlU3M","SbRYyn1pmO",
+"W3VFHpvgjS","jiVBPD6rBy","Uvlv4dQ586","Gv3FqnFqik","U3yw5M3zXL","jzUqRFjHXR","v8yFNBCxeC","aez9yMmsIo","JKWYRblLA9","oGu6xPOUYS",
+"cQOnvs93Ml","W7cTsmz8gx","64s8NTwano","9y4lwQ6Lix","iwzGkNo0Qb","hE1Ql16lHc","iKqhrlsQGo","HP433zY1GY","xXTI4gdQsS","jfREuCdyBV",
+"taOXKW3VFH","zz4ZU9rlg9","Ss0ZuIBe8k","8FmFHD6rBy","uJScXwiHrZ","vkCHHblLA9","uJScXpiJSk","FNYIMM6qcG","hE1Ql580YD","WDVWJnnP8o",
+"7fsYMKsjRK","WPmlxuAWyp","yvOMIGXdoH","MGlTFUmaEv","dpe1v4QMc9","ni2v1VerEA","fcJOyQWxoT","dhSuHdmoS7","AIYUuRpBQm","DG4sTDcpWB",
+"VIlwP9eoRc","aDGtSm4bxU","MaJQsC2Irc","d85a9Q6Lix","nnP8oCNHmv","Nxx9V7Ow5C","b29RJ07n1c","uZPqgZv7z0","zqH0WksJby","618Di16lHc",
+"aL6AJVerEA","fmIK1uZPqg","55rfBdmoS7","uTacxydG8U","5ZaEzn8pJ9","0YAGHaFFss","3weIFReKEW","FFDuiChuy3","DQimplH1kt","VIlwPqaofN",
+"dhSuH55rfB","hi5X7hUTw7","vOqCEQ6Lix","yToGW2Yz7E","s93MloGu6x","Pb1palm0pD","pmeCd7ku1p","jeskSzqH0W","lViBvhYBCK","VerEAa00b5",
+"8TxD7lsQGo","QWxoTNcICA","J2mQiMezSW","TXQ0ZaFFss","hYBCKKASQ8","ZJTXHoVQp6","euZA5RsQUq","5ZaEzVerEA","ReKEWHP433","45cIHB3qem",
+"dhSuHdjsrv","Uvlv4SmGzv","jfREu45cIH","m4bxUuN6r3","FNYIMNxx9V","aez9ylXFOB","14FLRksJby","POUYSGXdoH","VjCZqDcpWB","GXdoHBFkb8",
+"pFrrlFjHXR","okgRiJKWYR","piJSk9y4lw","FjHXRS77LH","MmsIociuWz","NhXdusqVrf","RzaZAWPmlx","YOfrYdhSuH","prNT6KZamH","KASQ8iqv4k",
+"faHiruQIcz","oGu6xtjQxs","nlaByiKqhr","TXQ0ZlweGy","lXFOB14FLR","b29RJ2hEEU","JKWYRPb1pa","HP433QWxoT","cQOnvpmeCd","ksJbyGv3Fq",
+"pFrrlfcwDa","fcJOyOUYuF","d85a9tjQxs","7hyVvUvlv4","fqypyhE1Ql","VBjhzazIWp","v1HlncShY2","FhtgltlILt","LewvMzmLYD","uupzkGWqqX",
+"5iGN5l83Ud","VIlwPjeskS","Qworuhe9IA","NOHsznnP8o","n1pmOOz8yZ","zz4ZU8RCUA","s4786uJScX","rhl0J45cIH","DcpWBjfREu","XyPZNFwEJz",
+"t98iWChuy3","aDGtSTXQ0Z","AXpwEBCxeC","StlDJgdQsS","IjTwP0BmCy","tuDyStaOXK","vLsmS9y4lw","RACujgjUTu","9eoRc8RCUA","s478607n1c",
+"RzaZAtl72W","WreyPEoToP","qUJMdzmLYD","n8pJ97fsYM","MezSWCNHmv","5IhmGHlUbF","07n1c1LB1L","d7vjM9eoRc","MmKGJJ2mQi","RACujWmadA",
+"F6PT2uAWyp","jeskSqUJMd","BFkb8qUJMd","5Drn0ECMvU","uLtKs3otm6","QWxoT5IhmG","RsQUq16lHc","OHaBzMezSW","i7WMQVLTy6","cQOnvCxVEf",
+"M6qcGDG4sT","nlaByQworu","OxWIHVBjhz","Uvlv4rz7Ut","LewvMQClRL","JIqXiLewvM","Vprf2Yw2oU","45cIHrz7Ut","GSQwjS77LH","Mm8situDyS",
+"iKqhrChuy3","MezSW5Mg9r","oVQp6ECMvU","VIlwPZzJHW","No0QbfaHir","bgJAzL7cGc","RsQUqAOgEe","lm0pDyToGW","BpYhVTa8f6","azIWpoGu6x",
+"7X3uyiwzGk","2ZHdklj07Q","uZPqgXflUq","1j5L845cIH","EdBKcZJTXH","lpF6WDcpWB","8hJdtFPfSE","GSQwj8cVD3","IKxdL8RCUA","v8yFNEoToP",
+"Uvlv4RzaZA","7fsYMLewvM","KZamHsqVrf","HfyNQfcwDa","CxVEfEdBKc","C2IrcECMvU","cQOnv0BmCy","ciuWzQssNC","9y4lwsuY4x","d7vjMBpYhV",
+"bgJAzn1pmO","ZzJHWvOqCE","B3qemNhXdu","DcpWBNo0Qb","uAWypru4UG","RxrsmJRJQB","aez9yO3iyQ","RpBQmbgJAz","1v5hHsoy9t","faHirAmdQd",
+"3weIFQ6hMC","HlUbF5iGN5","AgJHQ8U2nU","hYBCKd85a9","RkQkejiVBP","QWxoTsuY4x","4W0Tluupzk","Mkgy8Cfgr3","tl72WtlILt","2TRI7s4786",
+"FVMxoSs0Zu","lweGyUlU3M","Chuy3EOE1o","mX2GEru4UG","CIShGHfyNQ","TXQ0Zrhl0J","580YDBbwgA","D6rByjzUqR","aL6AJSjskQ","4QMc9O3iyQ",
+"45cIH48cHL","24ARFpAhR1","MojnPQ6hMC","UlU3MyEfy9","rhl0JzHF1q","X6PintAOsr","QssNCnlaBy","uoStwG1RhS","xciqpCdyBV","Chuy3yToGW",
+"J2mQixciqp","n1pmOiKqhr","B3qemB3qem","YjB9tI7p2a","S77LHLbRTH","qQxHPiqv4k","iwzGkAOgEe","iB08lLewvM","djsrvxXTI4","uvf7A7X3uy",
+"kZANm5Drn0","iKqhrUlU3M","2hEEU9XyT9","JRJQBlsQGo","UlU3MK20wK","CxVEfJXljW","n1pmOvkCHH","8FmFHKr8ys","rhl0JKsjRK","zHF1q2ZHdk",
+"lweGyJkzUn","0KyfsuZPqg","faHirkB5nP","HRxd8618Di","AXpwEx3LDe","DQimps4786","kZANmG1RhS","vkCHHuupzk","dhSuHzmLYD","TwanoZJTXH",
+"2DREs7fsYM","JJs5mfmIK1","14FLRn8pJ9","M6qcG5drc6","UmaEv5Drn0","vkCHHXyPZN","8xEKzhE1Ql","SjskQ5Namm","a00b5EdBKc","ciuWzJRJQB",
+"dhSuHtvdkD","ni2v1gjUTu","7Ow5CFLsph","fqypyciuWz","ThjNn5nmWv","S77LHGrDg7","kB5nPmX2GE","KASQ8Cfgr3","m4bxUv8yFN","VIlwPgf8rI",
+"oQ87rVerEA","zY1GYokgRi","M6qcGI7p2a","uJScXsqVrf","oVQp6GXdoH","cmXIXx3LDe","uTacxdpe1v","C2IrcAOgEe","In3NSuQIcz","5ZaEzChuy3",
+"TXQ0ZhE1Ql","RsQUqPOUYS","Chuy3IKxdL","MaJQsTCgPp","Q6LixIKxdL","Cfgr3faHir","prNT616lHc","Q6Lix5nmWv","8cVD3No0Qb","9XyT9DG4sT",
+"5VZjSfaHir","Z4I1vQbxXc","tuDyShE1Ql","azIWpiKqhr","atef2VNCPd","Kr8yseuZA5","DcpWBxciqp","8RCUAyToGW","CxVEfaFFss","Ss0ZuuN6r3",
+"uJScXn1pmO","VjCZqnFqik","h1zcHnFqik","HlUbFEdBKc","CxVEfZuDtD","8FmFHd7vjM","YjB9ts93Ml","v8yFN5drc6","D6rByvLsmS","pFrrlIKxdL",
+"D6rByHlUbF","uZPqgtAOsr","zmLYDuLtKs","kB5nPQssNC","ydG8UksJby","hE1QlfaHir","BpYhVyToGW","0ao3ljSjS3","OHaBzFnPFB","JIqXizY1GY",
+"Kr8yskZANm","4QMc92Nslm","0h1b1FnPFB","ZUnqtJJs5m","zmLYDiqv4k","I7p2asqVrf","7hyVvStlDJ","fFDrJfLNg8","Yh1hFuJScX","1j5L89y4lw",
+"EdBKcQClRL","RpBQmWaim6","xXTI4yEfy9","HlUbF8U2nU","XyPZNYjB9t","vLsmSG1RhS","MGlTFBpYhV","uAWypSs0Zu","RmDcrRmDcr","lweGy2TRI7",
+"BCxeCqUJMd","dhSuH3otm6","1v5hHrz7Ut","8FmFH9GXkX","lj07QSs0Zu","Zv7z029QAz","KASQ8pFrrl","2DREsvOqCE","LewvMCfgr3","FnPFBgtCA5",
+"blLA9lpF6W","tlILtStlDJ","qQxHPNxx9V","MojnPW3VFH","QChxsqaofN","Mm8siMm8si","9eoRcMkgy8","jtn0Xuupzk","rKDLJMK07Y","rKDLJJ2mQi",
+"5VZjSCfgr3","jzUqRRkQke","4dEz6gjUTu","FVMxolkMUA","v2eC3tlILt","0PktI5ZaEz","lH1ktcQOnv","Yf2EcFGzgp","8FmFHuLtKs","taOXKBGaQY",
+"BpYhVFxX9q","PYBf4a00b5","hSSvQ14FLR","Vprf2pv0i7","618DigIYvE","blLA9FLsph","0ao3lxReec","AmdQdU3yw5","K20wKzmLYD","KsjRKMkgy8",
+"ThjNnJJs5m","J2mQivLsmS","AOgEeRpBQm","blLA92Nslm","SbRYyThjNn","gjUTuC2Irc","P6bcgm4bxU","piJSk5drc6","okgRi0MR5X","2NslmYf2Ec",
+"lm0pDlpF6W","n8pJ90BmCy","jSjS3WreyP","aez9ybrhlQ","HRxd8uvf7A","ydG8UJRJQB","gdQsSCfgr3","pWiOshE1Ql","iwzGkKr8ys","DQimpWreyP",
+"oVQp6hUTw7","M6qcGQworu","FPfSEBpYhV","J2mQi9XyT9","lXFOBGv3Fq","MaJQsPb1pa","FxX9qGrDg7","gtCA55IhmG","Kr8ysy94nw","pT8wu6AFT0",
+"tAOsrRBhp0","yofH3uAWyp","C2IrccmXIX","JkzUnZuDtD","8FmFHVIlwP","jS1ajv1Hln","6q6L9ReKEW","YOfrYWaim6","pFrrljzUqR","uPX7G1j5L8",
+"0YAGHa00b5","580YDfFDrJ","hYBCK0Wr5y","Mm8siKsjRK","FcWrWUmaEv","zY1GYpvgjS","iB08l8TxD7","24ARFGrDg7","5NammI7p2a","GWqqXjiVBP",
+"XflUqJRJQB","CqqaDsoy9t","DG4sTGrDg7","zFgtBSjskQ","24ARFjfREu","FGzgpKr8ys","gf8rIvkCHH","OUYuFSjskQ","618DiQ6hMC","7Ow5CUl4a1",
+"zY1GYECMvU","qaofNlj07Q","oGu6xhe9IA","XyPZN5iGN5","M3zXLMkgy8","CdyBV9iGoT","vOqCE8TxD7","YjB9tfmIK1","Oz8yZBGaQY","F6PT2KsjRK",
+"StlDJZzJHW","5VZjSTCgPp","zFgtBbgJAz","EoToPTa8f6","guMb8cmXIX","QbxXcVNCPd","aFFssn1pmO","ZhwG1tvdkD","3weIFgf8rI","brhlQbZLvS",
+"fmIK1MK07Y","XflUqRzaZA","iKqhrkB5nP","lXFOB7hyVv","nlaBy1v5hH","tAOsrGrDg7","FVMxoRACuj","5drc6FFDui","L7cGcDQimp","pvgjS4dEz6",
+"JKWYRm4bxU","Cp3mZt98iW","dmoS7RpBQm","4dEz6lj07Q","cQOnvyEfy9","CxVEfaez9y","VIlwPulk41","5ZaEzNxx9V","SbRYyCfgr3","0BmCyv2eC3",
+"ni2v1d7vjM","CNHmvydG8U","BFkb8rKDLJ","3otm6NhXdu","JRJQBh1zcH","DG4sTAgJHQ","zz4ZUAmdQd","9rlg95ZaEz","zFgtBgdQsS","RzaZA24ARF",
+"55rfBFLsph","AkKTkJJs5m","RpBQmCIShG","5ZaEz2hEEU","o8UydpT8wu","uTacx1LB1L","JXljW0Kyfs","gf8rIYw2oU","s7Mxk5nmWv","PYBf4jSjS3",
+"K4GS87ku1p","OxWIH07n1c","WmadAW7cTs","ogLgcokgRi","5IhmGoGu6x","blLA9Cfgr3","prNT6DG4sT","jSjS3ZUnqt","ru4UG2DREs","bZLvSksJby",
+"RpBQm6q6L9","C2IrczmLYD","QnJ1S7fKYU","CIShG0Wr5y","F6PT2LbRTH","ZJTXHfcJOy","aDGtSprNT6","9y4lwjtn0X","uoStwnFqik","ix74rB3qem",
+"Cfgr30BmCy","P6bcgqUJMd","t98iWblLA9","S77LHulk41","ogLgc4QMc9","AIYUu29QAz","Vprf2ulk41","lweGyogLgc","okgRiMezSW","aDGtSDQimp",
+"64s8NbZLvS","dhSuHfLNg8","ix74riB08l","4dEz6P6bcg","cL0aEMm8si","dhSuHiwzGk","QWxoTv8yFN","hi5X7ZUnqt","55rfBW3VFH","d7vjM8U2nU",
+"LDk6ffqypy","AmdQdhe9IA","ru4UGv1Hln","9eoRcMmsIo","No0QbNxx9V","O3iyQzQt6Q","pmeCd9eoRc","qaofN07n1c","AIYUuFNYIM","8cVD3fqypy",
+"VIlwPdhSuH","FhtglMmKGJ","I7p2aUvlv4","QChxsK4GS8","SWfou1j5L8","kB5nP0PktI","WPmlxuTacx","cQOnvMmKGJ","fLNg8MezSW","0BmCyVIlwP",
+"kZANmiKqhr","o8Uyd5drc6","U3yw50YAGH","9rlg92Nslm","W7cTsiB08l","uN6r307n1c","uupzkNxx9V","07n1caL6AJ","IjTwPK20wK","VIlwP7ku1p",
+"mz8gxCp3mZ","Gv3FqTa8f6","iKqhrKASQ8","Vprf2s93Ml","4QMc9uPX7G","FjHXRhUTw7","xciqpSWfou","BbwgAQbxXc","v2eC3QYxC0","QClRLJIqXi",
+"d85a9uPX7G","SmGzvMojnP","VBjhzi7WMQ","Dz1R324ARF","d7vjMSbRYy","0BmCybrhlQ","5Drn02Yz7E","3otm6lViBv","PYBf4Mm8si","FcWrWBGaQY",
+"WmadAxReec","Yw2oU5iGN5","Yh1hFAgJHQ","hE1Ql0BmCy","5Mg9rzmLYD","OUqFMAgJHQ","AIYUuv2eC3","FnPFBuN6r3","RmDcrHlUbF","OHaBz48cHL",
+"m4bxUS2Dfu","hUTw7F6PT2","XflUqKr8ys","PYBf4MojnP","Ta8f60PktI","RzaZAuvf7A","tvdkD9XyT9","JJs5mSbRYy","uoStwgIYvE","P6bcgSs0Zu",
+"yvOMIpFrrl","JIqXiThjNn","5iGN5tAOsr","8TxD7brhlQ","vOqCEzFgtB","zY1GYd7vjM","vLsmSjS1aj","ReKEWGrDg7","I7p2aY1mC0","B3qemWaim6",
+"618DiuN6r3","VIlwPyEfy9","8xEKzzz4ZU","XyPZNEOE1o","QnJ1SYOfrY","JKWYRuAWyp","dhSuHU3yw5","24ARF3otm6","7fKYUlCMxy","Q6LixY1mC0",
+"UmaEvKZamH","fqypyuPX7G","QbxXcGrDg7","3weIFzFgtB","hYBCKYf2Ec","k85AepFrrl","OxWIH64s8N","tAOsrOxWIH","6AFT0FLsph","QbxXcb29RJ",
+"5iGN5Ta8f6","d7vjMhE1Ql","lkMUATwano","4QMc97ku1p","l83Ud5iGN5","IRh48CdyBV","lH1kt0PktI","Gv3FqKsjRK","jiVBPRkQke","BCxeCLewvM",
+"pFrrlW3VFH","Waim6CNHmv","aFFss1LB1L","xXTI4he9IA","S77LHh1zcH","VjCZquJScX","Z4I1vs7Mxk","UmaEvF6PT2","JXljWGWqqX","KsjRKCIShG",
+"m4bxUcmXIX","pWiOsm4bxU","cmXIXF6PT2","Dz1R3fmIK1","Z4I1vF6PT2","b29RJdjsrv","FcWrWXyPZN","3otm6QWxoT","e6e4zzbIYY","HfyNQFhtgl",
+"RzaZAa00b5","8cVD3M6qcG","zbIYYYh1hF","Gv3FqlpF6W","FnPFB5iGN5","dpe1vS77LH","4QMc9RmDcr","VerEAW3VFH","Uvlv4t98iW","wiHrZTXQ0Z",
+"JkzUnAXpwE","piJSkuLtKs","vOqCEhYBCK","4QMc9gjUTu","WreyPDG4sT","n8pJ9FjHXR","m4bxUqQxHP","i3pyd2ZHdk","jS1ajK4GS8","8FmFHhE1Ql",
+"FNYIMuPX7G","brhlQlH1kt","fFDrJbZLvS","0YAGH7lUXZ","vOqCEpmeCd","FGzgpfFDrJ","gjUTuChuy3","pWiOsVIlwP","Ss0ZuB3qem","JkzUn8U2nU",
+"mz8gx7X3uy","dmoS7ydG8U","LewvMBpYhV","hi5X7GSQwj","CdyBVwDajX","ZhwG1Twano","FnPFBhe9IA","5Nammgf8rI","IRh48yluBx","cQOnv8hJdt",
+"8U2nU5IhmG","h1zcHdpe1v","FPfSEzbIYY","7hyVvRBhp0","h1zcH9iGoT","1LB1LdmoS7","lkMUABCxeC","CqqaDgdQsS","mX2GEFxX9q","Gv3Fqn8pJ9",
+"ciuWzJ2mQi","SjskQVprf2","5IhmGpiJSk","9XyT9NOHsz","Y1mC0zFgtB","m4bxUxXTI4","HzZT8IRh48","F6PT2StlDJ","GrDg78hJdt","CIShGs4786",
+"Cp3mZJRJQB","d7vjMQ6hMC","gf8rIS77LH","7lUXZChuy3","i7WMQ5VZjS","zz4ZUciuWz","4dEz6AIYUu","618DiqaofN","8hJdtsuY4x","FcWrW0Kyfs",
+"RpBQmAOgEe","FFDuiNo0Qb","v1HlnYw2oU","tlILt8xEKz","580YDZzJHW","QworuCp3mZ","Z4I1vIRh48","MGlTFCNHmv","ThjNnjtn0X","ZUnqtv2eC3",
+"iKqhr5ZaEz","7hyVvChuy3","Vprf2uoStw","64s8NwiHrZ","d85a9lm0pD","5NammaFFss","0Wr5yCp3mZ","VNCPdQYxC0","29QAzcL0aE","s7MxkBGaQY",
+"lH1ktZv7z0","he9IAs7Mxk","sx5GlFLsph","14FLRFVMxo","2Yz7ECNHmv","cmXIXtlILt","ZJTXHZUnqt","zY1GYpT8wu","0BmCyfLNg8","580YDqUJMd",
+"uZPqgyvOMI","RsQUqdpe1v","VIlwPIRh48","MK07Y5Drn0","zHF1qCp3mZ","16lHcSmGzv","lm0pDBbwgA","JIqXi8xEKz","a00b5ZzJHW","FnPFBlXFOB",
+"5NammfcJOy","YOfrYJJs5m","0KyfsHlUbF","i7WMQ45cIH","J2mQid85a9","uupzk5nmWv","FVMxoSWfou","4QMc9FjHXR","TwanoTCgPp","euZA5zbIYY",
+"h1zcH2ZHdk","D6rBy9eoRc","Gv3Fquvf7A","nFqikO3iyQ","DLhzMsuY4x","I7p2asoy9t","QworuWDVWJ","Ta8f6QWxoT","t98iWtuDyS","MmKGJbZLvS",
+"dhSuHwDajX","rz7Utd7vjM","uvf7A9eoRc","I7p2av2eC3","Q6hMCFFDui","UlU3M8hJdt","SbRYyogLgc","iB08l0MR5X","tjQxsGWqqX","QYxC0dmoS7",
+"L7cGcYw2oU","7X3uylH1kt","vOqCERmDcr","aFFssVBjhz","OUYuFWreyP","BGaQYjfREu","t59lRZhwG1","RmDcrHP433","IKxdLcmXIX","hE1QlmX2GE",
+"JIqXi5VZjS","Zv7z05iGN5","oQ87rhUTw7","aDGtSlpF6W","t59lRWreyP","pmeCdI7p2a","C2IrcAkKTk","sqVrfIKxdL","55rfBlkMUA","hi5X7oVQp6",
+"hE1QlyofH3","WreyPmX2GE","AmdQdDG4sT","fcwDaEoToP","ZJTXHatef2","WMiS3iKqhr","AkKTkQssNC","nnP8ocQOnv","IKxdLPOUYS","SmGzvpvgjS",
+"FVMxoXflUq","AIYUuPYBf4","cmXIXO3iyQ","cmXIXjSjS3","07n1cCxVEf","hE1QlJXljW","iwzGkKZamH","MaJQsXflUq","8RCUAnFqik","y94nwKASQ8",
+"jfREuQbxXc","8hJdtCfgr3","1j5L8OHaBz","lkMUAXyPZN","cQOnvVLTy6","e6e4zaDGtS","uAWypFGzgp","QworupiJSk","blLA9jS1aj","fFDrJuPX7G",
+"KASQ8WreyP","fcJOyQClRL","9iGoT7Ow5C","TXQ0Z0h1b1","yEfy9yvOMI","FjHXRGv3Fq","jfREuzFgtB","lm0pDEOE1o","RsQUqjiVBP","l83Udh1zcH",
+"4QMc929QAz","Cfgr3zFgtB","BpYhVrz7Ut","zY1GYXflUq","VNCPdRzaZA","2ZHdkDQimp","Mm8siyvOMI","MGlTFHRxd8","KASQ8fFDrJ","JKWYRHP433",
+"FnPFBHzZT8","0ao3lpmeCd","vkCHHFPfSE","CK5W7Gv3Fq","0Wr5yMaJQs","AIYUucQOnv","618DiuJScX","lH1ktIn3NS","8FmFH0Kyfs","soy9tpmeCd",
+"IKxdLYjB9t","GSQwjqQxHP","StlDJNcICA","X6PinFVMxo","QChxs4QMc9","JXljW8RCUA","9rlg9ix74r","zbIYYd7vjM","ogLgczY1GY","3weIFDcpWB",
+"XyPZN2hEEU","KsjRKuLtKs","aez9yciuWz","zz4ZU8xEKz","MmsIo9rlg9","uupzkRxrsm","Q6Lix618Di","b29RJYh1hF","Zv7z0AmdQd","bZLvS9GXkX",
+"uupzk4dEz6","SjskQrhl0J","QnJ1SUl4a1","yofH3O3iyQ","gjUTu55rfB","CqqaD4W0Tl","tuDySiKqhr","9rlg9NOHsz","ciuWzZzJHW","5Mg9rIjTwP",
+"5IhmGdmoS7","IBe8kmz8gx","0h1b1K4GS8","fqypyuZPqg","okgRik85Ae","YOfrYM6qcG","ciuWzQWxoT","48cHLZJTXH","1v5hHbrhlQ","uLtKsfaHir",
+"ogLgcfFDrJ","RmDcruPX7G","TXQ0ZoGu6x","tlILtGXdoH","VIlwPjfREu","sqVrfGWqqX","oQ87r9XyT9","BGaQYl83Ud","KASQ8JRJQB","SjskQx3LDe",
+"CqqaDh1zcH","NAFuwtuDyS","JJs5mJXljW","K4GS8lkMUA","5VZjS2Yz7E","9iGoTwDajX","atef2FNYIM","5Namm8xEKz","GWqqXlm0pD","IRh486q6L9",
+"zFgtB64s8N","JJs5mtlILt","QYxC0cShY2","fFDrJyofH3","lViBvXflUq","CNHmv1j5L8","UmaEvHfyNQ","I7p2a4QMc9","a00b5Q6hMC","VNCPduZPqg",
+"JKWYRb29RJ","v1HlnZzJHW","ECMvUhSSvQ","cShY2vLsmS","lCMxyi3pyd","MmKGJOUqFM","blLA92TRI7","7ku1pRsQUq","mz8gxfLNg8","IjTwPCdyBV",
+"CqqaD8hJdt","I7p2avOqCE","OUYuFa00b5","Yw2oU8cVD3","HRxd8FFDui","ECMvUThjNn","s93MlgjUTu","lH1ktprNT6","AIYUuVBjhz","ZJTXHUl4a1",
+"pmeCdJkzUn","9rlg9d7vjM","Nxx9Vzz4ZU","rz7Ut7Ow5C","Chuy37fKYU","7Ow5CaDGtS","uvf7AFNYIM","Gv3FqOxWIH","D6rByh1zcH","HlUbFXyPZN",
+"d7vjMD6rBy","TCgPplkMUA","M6qcG3weIF","POUYSydG8U","uPX7Giqv4k","uN6r3jzUqR","GSQwjhE1Ql","LewvMogLgc","ix74rpmeCd","fqypyl83Ud",
+"2hEEUk85Ae","OxWIHpAhR1","8xEKzRACuj","AkKTkyvOMI","Cfgr3ZuDtD","gf8rIZJTXH","Cfgr3fqypy","Oz8yZ2hEEU","uLtKsGXdoH","ZuDtD9XyT9",
+"ZUnqtcShY2","jiVBPPOUYS","IKxdLJ2mQi","5Mg9rv8yFN","7fKYUl83Ud","8FmFHYf2Ec","Kr8ysAgJHQ","5drc6pmeCd","uLtKsFVMxo","2ZHdkfcJOy",
+"brhlQAIYUu","a00b5ogLgc","LbRTHxXTI4","FVMxo8U2nU","KZamH8cVD3","AOgEe24ARF","fLNg82Nslm","IBe8kECMvU","oQ87rMojnP","lweGyYh1hF",
+"uLtKsWMiS3","cQOnvvOqCE","DcpWBeuZA5","VNCPdUl4a1","rhl0J24ARF","fcwDav1Hln","gf8rISmGzv","brhlQix74r","4W0TlTCgPp","mz8gxAmdQd",
+"K4GS8pmeCd","UlU3MoQ87r","i3pyd7ku1p","580YDlViBv","5VZjSKsjRK","cShY2jzUqR","cQOnvX6Pin","WreyPzFgtB","MaJQslm0pD","m4bxUqaofN",
+"o8UydSbRYy","sx5GlmX2GE","iqv4kCNHmv","nnP8oQChxs","bgJAzqUJMd","guMb8dQ586","rz7UtzY1GY","DQimpuPX7G","FPfSEIBe8k","YjB9tK20wK",
+"cL0aE5drc6","C2Ircdpe1v","AXpwE16lHc","5drc6ru4UG","aL6AJSbRYy","jzUqRAgJHQ","ThjNnM3zXL","a00b5Yf2Ec","ni2v1e6e4z","pvgjSRpBQm",
+"0PktIazIWp","faHirCdyBV","JkzUnFnPFB","VerEAn8pJ9","5nmWvFnPFB","piJSkC2Irc","QssNCFnPFB","uLtKsuoStw","HRxd84W0Tl","QClRLSbRYy",
+"8FmFHdmoS7","64s8N07n1c","Waim6ZhwG1","64s8NRsQUq","lj07QKsjRK","S2DfueuZA5","t59lRZv7z0","No0QbGSQwj","6q6L9NhXdu","5ZaEzI7p2a",
+"7fKYUFPfSE","M3zXLxReec","n8pJ9pAhR1","RzaZAQnJ1S","7hyVvRzaZA","9rlg9m4bxU","BCxeC4QMc9","4W0Tl8xEKz","uZPqgJJs5m","45cIHbrhlQ",
+"Ta8f6CNHmv","pAhR1taOXK","0BmCyMezSW","Vprf2RkQke","m4bxUs93Ml","jSjS38hJdt","StlDJJkzUn","qQxHPiwzGk","jtn0XNo0Qb","IjTwPCIShG",
+"pvgjSQWxoT","24ARFsoy9t","RBhp0jiVBP","hE1QlZJTXH","Gv3Fqsx5Gl","1j5L8VLTy6","CIShGfcwDa","gtCA5VNCPd","7Ow5CW7cTs","yluBxOxWIH",
+"FFDuiqUJMd","QYxC0jfREu","k85AeCNHmv","yluBxogLgc","55rfBlpF6W","Cfgr3tl72W","CqqaDXflUq","MojnPdpe1v","nlaByZv7z0","fFDrJ0YAGH",
+"tAOsrhi5X7","WreyPni2v1","fmIK129QAz","ix74r64s8N","HfyNQ0h1b1","5drc6FPfSE","pmeCd7Ow5C","ksJbywiHrZ","lCMxygjUTu","VNCPdReKEW",
+"9iGoT5Drn0","gf8rIgtCA5","LewvMYjB9t","gtCA5GXdoH","9iGoTdQ586","6AFT0KsjRK","euZA5kZANm","QnJ1S1LB1L","yvOMIxReec","JJs5muoStw",
+"618DiwDajX","Yf2EcEoToP","dmoS7iKqhr","14FLRNhXdu","wDajXfqypy","n1pmO3weIF","o8UydaFFss","Uvlv4ZJTXH","29QAzfcJOy","MK07YQYxC0",
+"O3iyQ4W0Tl","lCMxyMmsIo","OUYuFRzaZA","aL6AJblLA9","OUYuFVprf2","lsQGoW7cTs","8cVD3EdBKc","MojnPtAOsr","HlUbFni2v1","L7cGcsoy9t",
+"jSjS3taOXK","FLsphuvf7A","BFkb8JXljW","s7Mxk7lUXZ","rhl0J1j5L8","mz8gxtaOXK","VIlwPMGlTF","5VZjSSjskQ","MGlTFMkgy8","IKxdL0YAGH",
+"guMb8suY4x","qaofNydG8U","C2Irc580YD","07n1cnnP8o","VjCZqSjskQ","In3NSpFrrl","SbRYyMkgy8","o8Uyduupzk","yofH3EoToP","GSQwjjfREu",
+"NOHszUlU3M","I7p2acQOnv","nlaByRxrsm","I7p2afqypy","BCxeCmX2GE","Kr8ysPOUYS","8FmFHWMiS3","vkCHHuTacx","h1zcHJJs5m","DQimpFhtgl",
+"M6qcGpmeCd","piJSk8U2nU","9eoRcK20wK","KsjRKlm0pD","t98iW0BmCy","blLA9AkKTk","taOXKKASQ8","MaJQshi5X7","6AFT0BbwgA","Ta8f6yvOMI",
+"07n1chE1Ql","oVQp65iGN5","mz8gxRmDcr","CqqaD29QAz","FjHXRK20wK","I7p2aHRxd8","FPfSElViBv","LbRTHh1zcH","DLhzMt59lR","W7cTszmLYD",
+"8U2nU24ARF","9XyT9580YD","CIShGFFDui","RACujKsjRK","fcwDax3LDe","Mkgy85VZjS","jiVBP7fsYM","VNCPd5ZaEz","9eoRcMK07Y","v8yFNoVQp6",
+"oVQp6pv0i7","KASQ8h1zcH","iKqhrpvgjS","UmaEvprNT6","wDajXAmdQd","FFDuiAgJHQ","zbIYYFPfSE","48cHLaFFss","FwEJzBCxeC","0KyfsblLA9",
+"tuDyS5nmWv","In3NSPb1pa","xciqplj07Q","X6PinzbIYY","AXpwEd7vjM","RsQUqnlaBy","AOgEe9rlg9","GrDg7lH1kt","O3iyQQChxs","Yw2oU48cHL",
+"X6Pink85Ae","yToGWyvOMI","4dEz62Nslm","0KyfsjzUqR","ydG8UiwzGk","NhXduVjCZq","0Wr5yfqypy","GSQwjoGu6x","suY4xdpe1v","XyPZN580YD",
+"iKqhrl83Ud","64s8NpiJSk","uTacx7Ow5C","16lHctaOXK","AmdQdRxrsm","jfREuMmKGJ","oVQp6ZuDtD","WDVWJFLsph","14FLRK20wK","atef2ThjNn",
+"QClRLQYxC0","xciqpWaim6","VjCZqzFgtB","0ao3lM6qcG","qQxHPUl4a1","FnPFBxXTI4","6q6L9I7p2a","dmoS7oQ87r","CxVEfL7cGc","G1RhSY1mC0",
+"fFDrJIn3NS","xReecrhl0J","piJSkQYxC0","64s8N7Ow5C","nFqikRxrsm","nnP8oFFDui","P6bcg7Ow5C","QssNCuvf7A","okgRi9y4lw","DG4sTWaWsv",
+"cmXIXbZLvS","IBe8kFxX9q","Oz8yZFFDui","oQ87rVNCPd","n1pmOhYBCK","LewvMfLNg8","0ao3lUlU3M","i7WMQt98iW","RmDcrjiVBP","CxVEfxReec",
+"CdyBVhE1Ql","tlILtDQimp","M6qcG0Kyfs","tl72WNo0Qb","AkKTkMmKGJ","xXTI4d85a9","48cHLCxVEf","29QAzuLtKs","8cVD3Z4I1v","iB08lVLTy6",
+"K4GS8BGaQY","QbxXcCxVEf","jS1ajzbIYY","RzaZAHlUbF","d85a9s4786","Nxx9VzmLYD","zY1GYl83Ud","MK07YVLTy6","yluBxQWxoT","vLsmSAkKTk",
+"KZamHvLsmS","iwzGkv1Hln","WDVWJCqqaD","8xEKzWPmlx","OUqFMLewvM","618Di0Kyfs","JIqXilm0pD","s7MxkThjNn","JkzUnulk41","djsrvd85a9",
+"tjQxsyluBx","7fKYUnFqik","piJSk9iGoT","Mm8siRpBQm","MmsIo8U2nU","DQimpfmIK1","ni2v1DLhzM","0PktIQworu","45cIHd7vjM","7fKYU8U2nU",
+"QssNCjSjS3","AmdQd0ao3l","FwEJzn1pmO","xReecCNHmv","jtn0Xi3pyd","RACujsx5Gl","oGu6xFxX9q","oGu6xStlDJ","7fKYUjS1aj","JIqXiNOHsz",
+"Q6LixjzUqR","suY4x5Drn0","AgJHQ5Namm","ogLgc16lHc","uAWyphYBCK","Z4I1vguMb8","kZANmtlILt","EOE1o5IhmG","AgJHQWaim6","2ZHdkMK07Y",
+"uQIcz55rfB","POUYSO3iyQ","VLTy6FjHXR","7fKYU29QAz","lViBv6q6L9","OxWIHjS1aj","Y1mC0GXdoH","WaWsvMmsIo","S2DfuNOHsz","CNHmvt59lR",
+"aFFss2hEEU","fmIK1Cfgr3","Ul4a1BGaQY","uN6r324ARF","yEfy9vLsmS","IBe8k45cIH","pT8wu9eoRc","zmLYD1v5hH","Y1mC0UlU3M","jfREulkMUA",
+"In3NSuvf7A","jiVBP4dEz6","YjB9tl83Ud","WmadADLhzM","9iGoTAOgEe","lpF6WJKWYR","4W0TlpWiOs","DG4sTvOqCE","qaofNWaWsv","HfyNQJRJQB",
+"XyPZNSWfou","lm0pD7fsYM","AIYUuX6Pin","SWfourz7Ut","tvdkDZuDtD","9GXkXSjskQ","okgRih1zcH","fFDrJuQIcz","vkCHHlCMxy","5IhmGgjUTu",
+"zY1GYAgJHQ","DG4sTOUYuF","fmIK1iqv4k","FwEJz5Mg9r","i3pydOUYuF","zmLYDyluBx","Mkgy8AXpwE","e6e4z5Namm","blLA95IhmG","zFgtBlH1kt",
+"WmadASmGzv","GSQwjIjTwP","Uvlv4HzZT8","jtn0XcQOnv","0Wr5yzFgtB","1j5L8P6bcg","sx5GluPX7G","JXljW64s8N","FLsph2ZHdk","NhXduyofH3",
+"l83UdxReec","d85a9v8yFN","i7WMQjfREu","5drc6he9IA","tlILtnlaBy","7fKYUIn3NS","ZuDtDRzaZA","d85a945cIH","hSSvQ9rlg9","n1pmOJIqXi",
+"BFkb8v2eC3","Yw2oUKsjRK","5IhmG5iGN5","14FLRiB08l","FGzgpUmaEv","v1HlnpWiOs","qaofNyvOMI","uLtKs4W0Tl","QClRLFVMxo","aez9yydG8U",
+"GrDg7mX2GE","POUYSdhSuH","ix74rbrhlQ","soy9tjS1aj","2NslmksJby","2ZHdkB3qem","2ZHdkbZLvS","pFrrlWMiS3","fFDrJJ2mQi","J2mQiJRJQB",
+"nlaByydG8U","nlaByYOfrY","atef2UlU3M","5Mg9rprNT6","7fKYUFjHXR","MK07Y5Mg9r","gjUTuDQimp","lpF6W7ku1p","JRJQBFFDui","RkQkeSWfou",
+"n8pJ9GSQwj","fFDrJ5drc6","uvf7AS2Dfu","uPX7GCp3mZ","uvf7A3otm6","oVQp6Chuy3","5ZaEzCqqaD","2DREs0BmCy","TwanoiKqhr","zFgtBoGu6x",
+"tl72WnnP8o","nnP8ooGu6x","J2mQiQChxs","RmDcrd7vjM","hi5X7ZJTXH","lkMUA2hEEU","aDGtSgdQsS","Pb1pauoStw","CNHmvFGzgp","WreyPVNCPd",
+"VIlwPlweGy","dhSuHprNT6","lpF6WWMiS3","t98iWmX2GE","L7cGcmX2GE","CqqaDnlaBy","mz8gx5nmWv","lCMxyQbxXc","MmsIoWreyP","WmadAAgJHQ",
+"OHaBzAgJHQ","Z4I1vM3zXL","ciuWz9iGoT","lsQGoOz8yZ","tjQxsv2eC3","okgRiRACuj","EOE1oVjCZq","7fKYUi3pyd","vkCHHChuy3","djsrvhUTw7",
+"b29RJRACuj","y94nwFjHXR","OUqFMfcJOy","atef2taOXK","JkzUnmX2GE","IRh48jSjS3","gIYvEW3VFH","uTacxzqH0W","4QMc945cIH","2NslmOUqFM",
+"FnPFBQ6Lix","RpBQmGrDg7","e6e4zFnPFB","5ZaEzStlDJ","gdQsS8FmFH","FFDuiStlDJ","2ZHdkAgJHQ","Dz1R3uPX7G","580YDYf2Ec","NAFuwpAhR1",
+"LDk6fU3yw5","a00b55VZjS","jfREu1LB1L","NAFuwYw2oU","W3VFHWDVWJ","RsQUqxXTI4","1v5hHJJs5m","No0QbReKEW","55rfBuoStw","G1RhS14FLR",
+"UmaEvv8yFN","F6PT2DQimp","ksJbygjUTu","Dz1R32hEEU","aez9ywDajX","HP4335drc6","tAOsrs93Ml","iB08lMmsIo","LDk6fwiHrZ","M3zXLjiVBP",
+"Chuy39eoRc","cL0aEHRxd8","x3LDedQ586","xciqps93Ml","ksJbyCdyBV","TXQ0ZOHaBz","G1RhSKASQ8","2DREsUl4a1","d7vjMjSjS3","X6PinLewvM",
+"a00b5azIWp","0MR5XSjskQ","IjTwP64s8N","uLtKsix74r","J2mQiIjTwP","h1zcHxXTI4","IKxdLMK07Y","m4bxUVprf2","14FLRPOUYS","RsQUqs4786",
+"OxWIHZUnqt","iqv4k5ZaEz","sqVrffLNg8","MK07YAmdQd","dpe1vd7vjM","tl72Wlm0pD","aDGtSvLsmS","0ao3lKZamH","lViBvCxVEf","guMb8MmKGJ",
+"2DREsVprf2","fmIK1ogLgc","55rfBbZLvS","Yf2EcThjNn","ECMvUlViBv","VjCZqChuy3","WaWsvMmKGJ","cShY2Oz8yZ","CqqaD5VZjS","DcpWBOUYuF",
+"jSjS30h1b1","618Diaez9y","jiVBPBpYhV","jiVBPo8Uyd","O3iyQjtn0X","S77LH6AFT0","Uvlv4tuDyS","hE1Ql5drc6","AkKTkLbRTH","rhl0JVLTy6",
+"vOqCEiKqhr","cL0aEZ4I1v","lXFOB8xEKz","Chuy3In3NS","LbRTHFVMxo","RkQkeSs0Zu","WDVWJfFDrJ","fLNg8S2Dfu","YOfrYvkCHH","DLhzM6q6L9",
+"MmsIoJRJQB","e6e4z1v5hH","MaJQs618Di","xciqpFnPFB","yofH3Pb1pa","1j5L8SbRYy","IRh48RBhp0","Vprf2taOXK","guMb8nlaBy","U3yw52Nslm",
+"jtn0XOz8yZ","zbIYYJKWYR","rz7UtWaWsv","fqypy6AFT0","wiHrZNAFuw","2hEEUM6qcG","WMiS3azIWp","jtn0XRpBQm","HP433fcJOy","zz4ZUcmXIX",
+"Y1mC0Mm8si","NhXdu7fKYU","HlUbFW3VFH","0ao3lThjNn","pmeCduQIcz","ydG8UCp3mZ","MaJQsBbwgA","s47864QMc9","J2mQiOUqFM","blLA914FLR",
+"G1RhSs4786","5ZaEzFnPFB","Waim6AXpwE","NAFuwb29RJ","VNCPdYjB9t","ZhwG1lm0pD","yluBxRmDcr","FxX9qlViBv","45cIHiqv4k","0ao3lpv0i7",
+"3weIFSWfou","BGaQY8RCUA","d85a9WPmlx","4W0Tl2TRI7","ciuWzcShY2","Yh1hFNcICA","oQ87rKZamH","0ao3lYh1hF","Pb1paThjNn","iB08l8xEKz",
+"vOqCEBFkb8","AXpwEZhwG1","W7cTsAmdQd","pFrrl0Wr5y","8hJdtWreyP","RmDcrs4786","K20wKTa8f6","VjCZq7ku1p","jiVBPlkMUA","uN6r35Mg9r",
+"zmLYDb29RJ","WaWsvRACuj","PYBf48RCUA","b29RJe6e4z","hi5X78FmFH","TXQ0ZydG8U","Gv3FqbrhlQ","s93MlRkQke","wiHrZ29QAz","qaofNjtn0X",
+"RkQkeni2v1","ulk410PktI","v1HlnwiHrZ","taOXK2TRI7","EOE1oJXljW","DQimpAkKTk","QbxXc7hyVv","o8UydcmXIX","lpF6Wrz7Ut","lsQGoPYBf4",
+"Cp3mZTwano","9GXkXDG4sT","VLTy69y4lw","WmadAatef2","DLhzMpT8wu","Uvlv4WMiS3","FPfSEAgJHQ","t98iW2Nslm","4W0Tl5VZjS","SmGzvCIShG",
+"SmGzvv2eC3","RACujX6Pin","jS1aj4dEz6","ReKEWFVMxo","ECMvUJKWYR","RzaZAChuy3","s93Mlix74r","cmXIXOxWIH","o8UydOUqFM","ni2v1VIlwP",
+"QworuQWxoT","RmDcryofH3","KASQ8okgRi","RBhp0fqypy","MojnPbZLvS","fFDrJHlUbF","3weIFlViBv","yluBx0h1b1","zmLYDgIYvE","Yw2oUYw2oU",
+"uQIczWaWsv","2TRI7OUqFM","uAWypb29RJ","CqqaDsuY4x","aFFssAgJHQ","OUYuFbrhlQ","JXljWaL6AJ","NhXduiB08l","FcWrWgIYvE","0KyfsRsQUq",
+"tvdkDWmadA","blLA9fmIK1","qQxHPoVQp6","zbIYYDQimp","rz7UtAkKTk","e6e4zgjUTu","ulk41jzUqR","Mm8sio8Uyd","guMb84W0Tl","FjHXRYh1hF",
+"h1zcHGWqqX","hi5X7rz7Ut","cmXIXKZamH","vLsmSuupzk","G1RhSBGaQY","o8Uyd2hEEU","gIYvEBbwgA","v8yFN8xEKz","aez9ySjskQ","mz8gx8U2nU",
+"7ku1p8FmFH","taOXKvLsmS","yToGW0BmCy","cL0aEAkKTk","gtCA5iKqhr","SmGzvYjB9t","64s8NjS1aj","F6PT2IKxdL","euZA5HfyNQ","jzUqRFwEJz",
+"IBe8kvkCHH","zmLYDrhl0J","KsjRKpT8wu","8FmFHDz1R3","y94nw3otm6","580YD0h1b1","MGlTFx3LDe","B3qemhUTw7","JXljWv1Hln","HfyNQ45cIH",
+"DG4sTM6qcG","tjQxsCqqaD","0Wr5y2hEEU","he9IAokgRi","TwanocL0aE","9eoRcSmGzv","lH1ktVprf2","YjB9t6AFT0","W7cTsIjTwP","azIWp6AFT0",
+"D6rBy9rlg9","GSQwj0Wr5y","nlaByd85a9","hYBCKjS1aj","x3LDemz8gx","qQxHPFNYIM","hUTw7FwEJz","pmeCdRxrsm","gtCA5a00b5","QYxC0qUJMd",
+"S2DfuYjB9t","yluBxFGzgp","Gv3FqDz1R3","iB08lmX2GE","9GXkX5nmWv","yvOMI0Kyfs","IjTwPt98iW","9eoRcM3zXL","WDVWJ29QAz","1j5L8xReec",
+"ix74r0YAGH","55rfBRpBQm","aFFssKsjRK","cmXIXsx5Gl","qQxHPAXpwE","RkQkepmeCd","24ARF8cVD3","aFFssRkQke","0h1b148cHL","tvdkDM6qcG",
+"7ku1pW3VFH","Q6hMCRsQUq","azIWpX6Pin","uPX7Guupzk","yvOMIJ2mQi","Ta8f6MaJQs","Uvlv4iwzGk","m4bxUNcICA","J2mQiokgRi","HfyNQhUTw7",
+"IBe8kWPmlx","hYBCKOUqFM","fqypyKsjRK","LewvMGXdoH","i3pydzmLYD","FVMxoO3iyQ","uPX7GAOgEe","ZUnqtyEfy9","BGaQY4QMc9","MGlTF5ZaEz",
+"JkzUnlpF6W","ru4UG5Namm","OHaBzTwano","vLsmSaez9y","U3yw5QClRL","he9IAeuZA5","AkKTkogLgc","uTacxzbIYY","F6PT2n1pmO","7X3uyuZPqg",
+"7Ow5CuAWyp","3otm6Yh1hF","qaofN2Nslm","v1Hln5ZaEz","Uvlv4brhlQ","CK5W7lH1kt","jzUqRaez9y","Yw2oUciuWz","4dEz67Ow5C","hi5X7CK5W7",
+"uLtKs5drc6","ZUnqtjzUqR","45cIH1v5hH","8cVD3prNT6","AkKTkfLNg8","FFDuiyluBx","Mm8sijeskS","FPfSExXTI4","pvgjSFhtgl","dQ586SbRYy",
+"t59lRrz7Ut","tAOsr5iGN5","uoStwMojnP","rhl0JJXljW","piJSkHlUbF","PYBf44W0Tl","QWxoTJJs5m","NcICAZhwG1","Ul4a1FwEJz","7ku1pqUJMd",
+"BGaQYfmIK1","HzZT8KsjRK","yofH3oQ87r","aDGtSiB08l","MezSWcmXIX","ksJbyogLgc","jzUqRPb1pa","lsQGox3LDe","MmKGJ8TxD7","LewvM7Ow5C",
+"qQxHP7lUXZ","8U2nUJRJQB","FLsphuoStw","Mm8sioVQp6","FhtglKsjRK","VLTy6fcwDa","jtn0XOUqFM","RBhp0fcwDa","XflUqoGu6x","C2IrcxXTI4",
+"s7Mxkpv0i7","64s8NWDVWJ","gtCA5K20wK","9y4lwuZPqg","FFDuitlILt","2hEEUK20wK","MmsIoHzZT8","vLsmSFPfSE","J2mQiKASQ8","iB08lPYBf4",
+"dmoS70ao3l","tjQxsl83Ud","5iGN5hSSvQ","OHaBzCK5W7","FxX9qyToGW","dhSuHQChxs","yofH3bZLvS","piJSk3weIF","Yh1hFGv3Fq","pv0i7ydG8U",
+"AOgEeAkKTk","cL0aEGSQwj","lXFOBS77LH","POUYS45cIH","ni2v1RBhp0","7hyVvkB5nP","MezSWrKDLJ","zbIYYfmIK1","OUYuFIn3NS","sqVrf580YD",
+"uQIczFLsph","tl72WMojnP","Dz1R3dhSuH","ulk41C2Irc","sqVrfYf2Ec","jSjS31j5L8","lpF6WlViBv","pWiOsulk41","Rxrsm3weIF","zQt6Q3otm6",
+"Nxx9Viqv4k","h1zcH7hyVv","FwEJzRsQUq","JkzUnLDk6f","5VZjSAgJHQ","8RCUAMmKGJ","QworuGWqqX","ydG8UB3qem","hi5X7pvgjS","RmDcrXflUq",
+"nnP8ouJScX","vkCHHKASQ8","TXQ0ZNcICA","AmdQd3otm6","aez9yqaofN","oVQp6EoToP","qaofNqQxHP","9GXkX5drc6","0ao3ls93Ml","djsrvpT8wu",
+"9iGoTogLgc","5NammVerEA","zz4ZUWPmlx","mX2GEuvf7A","TCgPpIKxdL","azIWpO3iyQ","RzaZAn8pJ9","uvf7AuN6r3","G1RhSRACuj","MK07YrKDLJ",
+"Yh1hFogLgc","P6bcgrz7Ut","cQOnvaDGtS","nnP8otjQxs","WreyPOUqFM","Cfgr3brhlQ","6q6L90MR5X","uTacx5iGN5","FLsphzbIYY","tuDySzFgtB",
+"d7vjMpvgjS","jSjS3iKqhr","B3qemkB5nP","0Wr5yhYBCK","jzUqRix74r","OUqFMmz8gx","GWqqXAIYUu","ydG8U4W0Tl","lpF6Wlm0pD","8TxD7VNCPd",
+"fFDrJGWqqX","Waim6ksJby","pv0i7o8Uyd","fFDrJd7vjM","he9IAF6PT2","tlILtaFFss","lXFOB3otm6","FPfSEpAhR1","RBhp01v5hH","QworuNcICA",
+"YOfrYtl72W","DQimplViBv","tjQxsZzJHW","CdyBVb29RJ","a00b5t59lR","VLTy68hJdt","5nmWvIjTwP","uAWypFnPFB","NhXdu5ZaEz","fcwDaIKxdL",
+"Zv7z0CNHmv","4dEz6ru4UG","hYBCKuupzk","zbIYYYf2Ec","hSSvQEOE1o","pmeCdWreyP","s93MlRmDcr","zFgtBNhXdu","AgJHQCqqaD","soy9tZhwG1",
+"lsQGo0PktI","0Wr5yDcpWB","6AFT0QWxoT","VLTy6yToGW","uJScXGrDg7","iB08lFPfSE","FPfSE0MR5X","AXpwEs7Mxk","iwzGkWDVWJ","0BmCyDQimp",
+"BbwgA3weIF","2DREsMmKGJ","MezSWW7cTs","i3pydYh1hF","X6PinCqqaD","jzUqRMGlTF","azIWpIjTwP","JIqXizbIYY","4QMc96q6L9","FGzgpdpe1v",
+"aez9yhE1Ql","580YDQClRL","AgJHQ7ku1p","DLhzM0Wr5y","5nmWvCK5W7","cShY2he9IA","1j5L80BmCy","RsQUqFcWrW","Vprf2Z4I1v","5drc6VerEA",
+"guMb8zz4ZU","dQ586jfREu","h1zcHDQimp","n8pJ9HlUbF","fqypyoGu6x","Ta8f614FLR","wiHrZW3VFH","DcpWB0h1b1","uZPqgFNYIM","jfREuBbwgA",
+"5VZjSCIShG","tuDySRmDcr","5nmWvSbRYy","MojnPgIYvE","ZhwG155rfB","s93Ml5Namm","FVMxo2hEEU","K4GS8UmaEv","mz8gxU3yw5","EOE1otvdkD",
+"NAFuwtvdkD","ix74r0MR5X","blLA9ciuWz","fmIK1WmadA","n1pmOtAOsr","9eoRcfmIK1","MGlTFaL6AJ","pT8wuQYxC0","BCxeCDQimp","pvgjSCK5W7",
+"7fKYU16lHc","2Yz7ETCgPp","d7vjMcQOnv","JkzUnh1zcH","Zv7z0Oz8yZ","JkzUnIRh48","jiVBPwiHrZ","IBe8kpmeCd","SmGzv618Di","0ao3l8RCUA",
+"5drc68cVD3","Nxx9VRzaZA","zFgtBQ6Lix","lViBve6e4z","07n1cpWiOs","LewvMOUYuF","5Drn0kZANm","FFDui24ARF","9rlg9aL6AJ","9iGoT2Nslm",
+"SbRYylH1kt","No0QblCMxy","Chuy3n8pJ9","SjskQOHaBz","5Namm4dEz6","kZANmulk41","MGlTFCp3mZ","pWiOsfqypy","EoToPdpe1v","lj07QCxVEf",
+"0BmCylH1kt","IjTwPlViBv","M3zXLDQimp","StlDJsqVrf","8xEKzGSQwj","pWiOsvLsmS","fFDrJ7X3uy","Yf2Ec5ZaEz","fmIK1VerEA","gtCA5Cp3mZ",
+"Kr8ys2Nslm","5IhmGlm0pD","tlILtUlU3M","YjB9tsx5Gl","gIYvEFhtgl","qUJMd2Nslm","HfyNQNo0Qb","yluBx5drc6","Mkgy8lViBv","pFrrlhE1Ql",
+"zbIYYCp3mZ","X6Pint59lR","gf8rIdhSuH","uvf7AqUJMd","5nmWv8FmFH","YOfrY7fKYU","QbxXcHP433","e6e4z5nmWv","dmoS7zbIYY","qaofNJIqXi",
+"4dEz6qUJMd","7hyVvOxWIH","pmeCdfLNg8","C2IrcB3qem","Zv7z0FnPFB","djsrveuZA5","4QMc97X3uy","okgRi2TRI7","bZLvSSWfou","atef2pT8wu",
+"MezSWe6e4z","iwzGkIKxdL","QnJ1SfcwDa","dQ586Oz8yZ","DG4sTQClRL","K4GS8GXdoH","iqv4kdQ586","IRh48euZA5","Mkgy8POUYS","JKWYRFNYIM",
+"yToGWRxrsm","AXpwEThjNn","7fsYMIjTwP","BGaQYuLtKs","I7p2aJKWYR","s7MxkNhXdu","hYBCKn8pJ9","0ao3lWPmlx","VjCZqIjTwP","6q6L9WPmlx",
+"vkCHHMezSW","MaJQsyEfy9","8TxD7gdQsS","C2IrcFLsph","MmsIobrhlQ","HfyNQl83Ud","AIYUuWPmlx","EdBKczz4ZU","QnJ1SciuWz","iKqhrb29RJ",
+"Q6LixpWiOs","WMiS3Yf2Ec","RkQkevLsmS","7Ow5C7X3uy","WmadAGXdoH","iqv4k0YAGH","RACujSjskQ","ZzJHWYh1hF","Chuy3YjB9t","7ku1puPX7G",
+"2Yz7E4QMc9","5NammFcWrW","uPX7GRACuj","zHF1qqQxHP","FVMxouAWyp","euZA5LDk6f","KASQ8l83Ud","zHF1qdjsrv","ix74rcL0aE","AmdQdpiJSk",
+"qaofNzbIYY","EOE1oaez9y","Zv7z0ix74r","WMiS3jzUqR","qaofNB3qem","tuDySJRJQB","LewvMgtCA5","VjCZqQworu","POUYSfqypy","8RCUAv8yFN",
+"4W0TlLDk6f","lXFOB5Namm","GrDg7RACuj","24ARFjiVBP","v8yFNKr8ys","SjskQyEfy9","618DiUl4a1","uTacxuTacx","i7WMQeuZA5","piJSksoy9t",
+"nFqika00b5","pAhR1xReec","5NammAXpwE","bZLvSyToGW","yluBxSmGzv","NhXduazIWp","xciqpokgRi","W3VFH5IhmG","rz7UtuN6r3","5iGN5HfyNQ",
+"nlaBy9eoRc","JKWYRkZANm","pAhR1zY1GY","yvOMImX2GE","16lHcOUYuF","Ta8f6qUJMd","Pb1pasoy9t","ru4UGksJby","zY1GYdjsrv","24ARFU3yw5",
+"XflUquN6r3","jtn0XokgRi","ni2v1GSQwj","yvOMItaOXK","QWxoThSSvQ","rKDLJ2Nslm","cmXIXfFDrJ","i7WMQzY1GY","SmGzvVLTy6","QClRLwiHrZ",
+"lXFOBVIlwP","OUqFMYjB9t","FnPFBDQimp","yvOMIlweGy","DcpWB5nmWv","5Drn0ulk41","Cp3mZyluBx","HlUbFv2eC3","SWfouMaJQs","s7MxklViBv",
+"16lHcbgJAz","Zv7z0v1Hln","i3pydTCgPp","JkzUnjfREu","4dEz6taOXK","ThjNnxciqp","gf8rIqUJMd","W3VFHSbRYy","WDVWJMkgy8","DcpWB5ZaEz",
+"QYxC00BmCy","ReKEWWaWsv","VLTy6GXdoH","WreyPJkzUn","XflUqKsjRK","cQOnvFNYIM","blLA97hyVv","OUYuFix74r","Q6hMClCMxy","n8pJ9FGzgp",
+"PYBf4BCxeC","9rlg9tlILt","hYBCKvOqCE","tvdkDF6PT2","dpe1vaFFss","wiHrZ2hEEU","pv0i7t98iW","Oz8yZfmIK1","WMiS32DREs","5iGN5yluBx",
+"jS1ajuLtKs","kB5nPBFkb8","jiVBP5IhmG","RxrsmTCgPp","FVMxobgJAz","U3yw5RsQUq","rz7UtksJby","JJs5m8hJdt","pT8wu0YAGH","Q6hMCd85a9",
+"5Namm9y4lw","D6rBytl72W","DcpWBlpF6W","7Ow5CECMvU","ZJTXHjtn0X","lj07QIRh48","LewvMuLtKs","QYxC0RBhp0","JRJQBQWxoT","Chuy3X6Pin",
+"prNT6UlU3M","TCgPpZ4I1v","aDGtS5Drn0","EOE1oSs0Zu","tjQxsv1Hln","FnPFBaL6AJ","nnP8oSbRYy","NcICAZuDtD","Waim6vOqCE","mX2GEL7cGc",
+"cShY2KZamH","Pb1pauupzk","RkQkecmXIX","ZuDtDD6rBy","IBe8kaFFss","9iGoTn8pJ9","ReKEW9GXkX","VLTy6NOHsz","s7MxkMezSW","5ZaEzFGzgp",
+"FnPFBtuDyS","JIqXihYBCK","Oz8yZOUYuF","SjskQhe9IA","cL0aEtAOsr","lViBvVLTy6","5Drn0MmsIo","jfREulpF6W","b29RJHfyNQ","xReecb29RJ",
+"o8UydpvgjS","a00b5GSQwj","dQ5866q6L9","yluBxDz1R3","uupzk5Mg9r","vkCHHFcWrW","zmLYDBCxeC","2Yz7EOUqFM","AmdQdCqqaD","RzaZAqUJMd",
+"3weIFhE1Ql","atef2s7Mxk","VIlwPhSSvQ","djsrvMm8si","8hJdttl72W","0Wr5yDLhzM","Chuy3piJSk","5nmWvC2Irc","mz8gxMezSW","JJs5mQYxC0",
+"16lHcni2v1","MmKGJS2Dfu","iqv4kFcWrW","Mkgy8s7Mxk","t98iWKr8ys","580YDRxrsm","v1Hlngf8rI","0Wr5yJRJQB","jfREuCK5W7","QssNCF6PT2",
+"cShY2AOgEe","0PktI0Kyfs","K20wK5IhmG","ZuDtDRmDcr","QYxC0K20wK","wiHrZulk41","SWfouv8yFN","tAOsrk85Ae","CK5W7fcJOy","GSQwj0PktI",
+"RkQkeyvOMI","AOgEeMmsIo","zbIYYvLsmS","v2eC3DQimp","he9IA5Mg9r","SjskQJXljW","lm0pD0h1b1","MmKGJnnP8o","5Mg9raL6AJ","VNCPdlkMUA",
+"7X3uyI7p2a","FLspht59lR","XyPZN3otm6","n8pJ9hUTw7","Nxx9VGrDg7","BbwgAHRxd8","xReecEOE1o","Q6hMCjtn0X","guMb8EOE1o","DQimpMezSW",
+"ydG8U3otm6","dpe1v4W0Tl","QssNC9rlg9","VIlwPZ4I1v","IjTwPksJby","LDk6fCNHmv","S2DfutuDyS","uupzkGSQwj","45cIHatef2","pWiOsS77LH",
+"1LB1LTa8f6","UmaEvSs0Zu","VLTy62TRI7","s7MxkaFFss","gjUTuQClRL","SbRYyCNHmv","QnJ1S618Di","L7cGcvkCHH","FxX9q5nmWv","Ul4a1fqypy",
+"cQOnvuN6r3","FLsph1v5hH","l83UdazIWp","hYBCKZuDtD","6q6L9pWiOs","Kr8ystlILt","hYBCKsqVrf","qUJMdtuDyS","hE1QlS2Dfu","FLsphjzUqR",
+"IKxdLiKqhr","uPX7GMGlTF","J2mQilm0pD","zHF1qHP433","AgJHQtuDyS","yvOMIsoy9t","Cp3mZFxX9q","DLhzMRxrsm","t98iWpiJSk","AIYUuzbIYY",
+"QYxC06AFT0","lpF6WDQimp","MmKGJ8U2nU","M6qcG9iGoT","Y1mC0oVQp6","YOfrYW7cTs","F6PT2h1zcH","qaofNVIlwP","kB5nPQbxXc","BbwgAm4bxU",
+"vkCHHksJby","jiVBPJRJQB","K20wK8cVD3","HzZT8BFkb8","ZUnqtAmdQd","1j5L8nnP8o","U3yw5vkCHH","FFDuiOHaBz","45cIHKr8ys","7ku1p3otm6",
+"xciqpBCxeC","HzZT8QnJ1S","pv0i7hYBCK","jfREu7fKYU","uPX7Gs4786","xXTI4nnP8o","nnP8oy94nw","zqH0WUvlv4","UmaEv9eoRc","WPmlx4QMc9",
+"ogLgc0h1b1","AkKTkI7p2a","EOE1oAOgEe","J2mQiFVMxo","IRh48he9IA","EdBKcMaJQs","EOE1o9rlg9","HfyNQLDk6f","pWiOsuAWyp","FPfSEeuZA5",
+"gf8rIv8yFN","DQimpSs0Zu","IBe8k5iGN5","zHF1q5Namm","AmdQdlkMUA","14FLRAXpwE","lCMxyTXQ0Z","CK5W7ThjNn","VBjhzn8pJ9","aez9y0h1b1",
+"8FmFHyToGW","jeskSBpYhV","GrDg7ogLgc","faHirQssNC","y94nwM6qcG","ZhwG1OUYuF","suY4x8FmFH","fcwDatjQxs","dQ586piJSk","iwzGks93Ml",
+"jS1ajECMvU","IRh48x3LDe","kZANmd7vjM","zbIYYFNYIM","Waim6i3pyd","FFDuiThjNn","vLsmSGv3Fq","pvgjS3otm6","8RCUAuupzk","cQOnv618Di",
+"tuDySuZPqg","fqypyjeskS","3weIFU3yw5","FjHXRWDVWJ","VjCZqW3VFH","pmeCdk85Ae","jS1ajDLhzM","X6PinW3VFH","KZamHX6Pin","Yw2oUThjNn",
+"WmadAU3yw5","55rfBrKDLJ","5iGN5RpBQm","Q6hMCix74r","jzUqRlViBv","5IhmG7hyVv","iqv4kx3LDe","kB5nPn1pmO","7ku1pi7WMQ","Gv3FqvLsmS",
+"7fsYMNo0Qb","a00b5i3pyd","OHaBzoVQp6","WmadAUmaEv","DQimpsoy9t","MezSWoGu6x","qQxHPfLNg8","MaJQseuZA5","fcwDaFcWrW","DQimpZhwG1",
+"m4bxUU3yw5","Yw2oUPOUYS","WmadA0PktI","jSjS3fLNg8","gf8rIgjUTu","tAOsruQIcz","24ARFK20wK","2Nslmy94nw","ciuWzfqypy","uJScXhe9IA",
+"AkKTkSmGzv","SWfouCK5W7","FNYIMK4GS8","euZA5zqH0W","pvgjS5Mg9r","fmIK1LDk6f","DQimpXflUq","9XyT93weIF","rz7Ut0BmCy","pT8wuQssNC",
+"uZPqgLbRTH","0YAGHgf8rI","FcWrWmz8gx","gIYvEFNYIM","0MR5XhYBCK","LbRTHQworu","ciuWzvOqCE","ZJTXHuN6r3","suY4xWDVWJ","uTacxzHF1q",
+"ZJTXHiqv4k","uLtKsB3qem","WaWsvWaim6","ZJTXH2TRI7","M3zXLAmdQd","VNCPdlH1kt","hE1QlcmXIX","64s8N8xEKz","atef2StlDJ","ydG8Uv1Hln",
+"QbxXcAIYUu","aDGtSCfgr3","S2DfuuPX7G","tl72WGv3Fq","FNYIMMm8si","s7Mxk45cIH","tjQxsHP433","VIlwPQWxoT","l83Ud2hEEU","14FLRCp3mZ",
+"soy9tQYxC0","bZLvSgtCA5","IRh488U2nU","580YDD6rBy","7ku1pqaofN","JXljWJIqXi","29QAzWPmlx","uPX7GDQimp","k85Ae2DREs","4QMc9vOqCE",
+"RzaZAguMb8","9iGoTuTacx","tvdkDOUYuF","yluBxAgJHQ","Waim6L7cGc","zHF1qWaim6","ru4UG5drc6","blLA9Waim6","gjUTu48cHL","07n1cMm8si",
+"o8UydQChxs","yEfy9XflUq","MezSWulk41","9rlg9CdyBV","jeskSMmKGJ","dpe1v8cVD3","hUTw7zbIYY","QbxXcUlU3M","U3yw5CNHmv","QChxsv2eC3",
+"CqqaDuupzk","sqVrf16lHc","Pb1pahe9IA","VIlwP4dEz6","uupzkcShY2","NOHszG1RhS","GrDg7tl72W","cShY2MGlTF","AmdQds93Ml","cQOnvNxx9V",
+"OUYuFMezSW","rKDLJjiVBP","jtn0XHfyNQ","tAOsrIKxdL","v8yFNIRh48","VNCPd07n1c","OHaBzKr8ys","Fhtgl6AFT0","Yw2oU2Nslm","fmIK1hYBCK",
+"CxVEfgdQsS","HP433S77LH","fLNg8CNHmv","POUYSfLNg8","l83Udv2eC3","No0QbvLsmS","45cIHFPfSE","HfyNQY1mC0","yluBxHlUbF","pAhR1hUTw7",
+"tl72WKZamH","RzaZAOUqFM","AXpwEJXljW","ogLgciqv4k","8hJdtokgRi","jS1ajUvlv4","vkCHHaL6AJ","zQt6QFnPFB","iqv4kRxrsm","cmXIXpmeCd",
+"iqv4kUmaEv","07n1clXFOB","Z4I1vW3VFH","7lUXZ4QMc9","aFFssZhwG1","jzUqRpWiOs","HzZT8oVQp6","NOHszLewvM","fFDrJrKDLJ","Q6LixlXFOB",
+"QbxXcbrhlQ","hE1QlYh1hF","VLTy614FLR","uJScXaez9y","IjTwPtlILt","9rlg9Yf2Ec","t98iWyToGW","zFgtBQnJ1S","U3yw5uN6r3","h1zcHtvdkD",
+"ECMvUJRJQB","pT8wusuY4x","yToGWIBe8k","zY1GYWreyP","fFDrJs7Mxk","kZANmHRxd8","EdBKc4dEz6","XflUq4QMc9","tlILtW3VFH","dQ586jSjS3",
+"JXljWfmIK1","lkMUAFwEJz","RkQkeFxX9q","IRh4814FLR","WPmlxjS1aj","0ao3lL7cGc","2Nslm9y4lw","WMiS3XyPZN","F6PT2tjQxs","BbwgAvLsmS",
+"7X3uywiHrZ","0YAGHVBjhz","dpe1vOUqFM","okgRiiB08l","4QMc9M6qcG","guMb8l83Ud","3weIFAgJHQ","FcWrWPOUYS","StlDJCfgr3","tAOsrZ4I1v",
+"ix74rMkgy8","Zv7z0PYBf4","4QMc95Namm","yToGWy94nw","GSQwjcShY2","zz4ZU8hJdt","FPfSEjSjS3","OxWIHMezSW","hYBCKh1zcH","CIShGDz1R3",
+"QnJ1SLDk6f","sx5GldQ586","FLsphW3VFH","k85AeqaofN","O3iyQbgJAz","2ZHdkzmLYD","FwEJzpv0i7","AkKTkuJScX","48cHLSWfou","WDVWJReKEW",
+"ulk41WDVWJ","K4GS8WaWsv","48cHLblLA9","ru4UGPb1pa","IRh48ru4UG","prNT6MojnP","WaWsv8hJdt","9iGoTYOfrY","wDajXazIWp","Waim6uLtKs",
+"d7vjM1j5L8","s4786FnPFB","5ZaEz29QAz","uQIczQ6Lix","29QAzJKWYR","2ZHdk6AFT0","0YAGHJkzUn","MGlTFVIlwP","zY1GYbgJAz","ZzJHWazIWp",
+"FGzgpW7cTs","tAOsrB3qem","5Namm48cHL","GSQwjtjQxs","JXljWNOHsz","RkQkeCfgr3","djsrvK4GS8","tjQxsUmaEv","7X3uyRACuj","Chuy30YAGH",
+"lweGyQworu","jfREu64s8N","JkzUnBCxeC","soy9tRkQke","LewvM6q6L9","kB5nPl83Ud","BFkb8GSQwj","jtn0XNOHsz","pmeCdqaofN","hi5X7TCgPp",
+"CNHmvGXdoH","ZuDtDVLTy6","QChxs0Kyfs","gIYvE2Nslm","16lHcfcwDa","0ao3l2ZHdk","5Mg9rRsQUq","qaofN5drc6","AIYUu4QMc9","FLsph5iGN5",
+"wiHrZAmdQd","oGu6x5iGN5","5iGN52TRI7","m4bxUXyPZN","2Yz7EzqH0W","GrDg7xciqp","dQ586K20wK","CdyBV2DREs","pv0i755rfB","5Mg9rTwano",
+"IBe8kuQIcz","FjHXRlCMxy","xciqpx3LDe","lweGyuAWyp","FVMxo48cHL","uvf7AI7p2a","1v5hHXflUq","Yh1hF5IhmG","GWqqXWaWsv","tAOsrmz8gx",
+"BbwgACNHmv","CxVEfPb1pa","d7vjMxReec","9y4lwVNCPd","29QAz2ZHdk","3otm6IjTwP","n1pmOqUJMd","HRxd80PktI","FnPFBd85a9","Chuy3CqqaD",
+"24ARFJRJQB","v2eC3FxX9q","WmadAYjB9t","yvOMICIShG","kB5nPuoStw","bZLvSfcwDa","580YDO3iyQ","WPmlx7fKYU","xReecFPfSE","OHaBzpT8wu",
+"ni2v10Kyfs","LDk6fDz1R3","lj07QmX2GE","B3qemYOfrY","8U2nUQ6Lix","OUqFMTwano","mX2GEZUnqt","0MR5Xx3LDe","Pb1paRACuj","zQt6Q9eoRc",
+"ThjNns4786","vLsmSDcpWB","FnPFB7hyVv","iwzGkOUYuF","5VZjSIn3NS","Yw2oUpmeCd","k85AeuLtKs","WDVWJFNYIM","sqVrfkZANm","uLtKsSWfou",
+"zmLYDWaWsv","azIWpMaJQs","I7p2alViBv","BCxeCJJs5m","ksJbyJJs5m","JXljW8TxD7","Nxx9V5iGN5","NhXdu3weIF","RmDcrAOgEe","jeskS5Drn0",
+"aDGtS2DREs","uZPqgPOUYS","Z4I1v5Namm","S2DfuFhtgl","bZLvS5iGN5","FVMxoX6Pin","AOgEegtCA5","wiHrZWaWsv","5iGN5HP433","PYBf4Oz8yZ",
+"1v5hHKsjRK","jiVBPFGzgp","2TRI7AkKTk","P6bcgt98iW","CK5W7UmaEv","EoToPCxVEf","1j5L8piJSk","NAFuw8hJdt","lm0pDzmLYD","wDajXMezSW",
+"AXpwEuAWyp","RACujQbxXc","9XyT9yluBx","yofH3WreyP","sx5GlM3zXL","cShY2vOqCE","JkzUnRACuj","RmDcrfaHir","Fhtglpv0i7","7hyVvguMb8",
+"48cHLoGu6x","RACujLbRTH","x3LDefaHir","7fKYUprNT6","MaJQsAmdQd","U3yw5HP433","uJScXQWxoT","M3zXLdpe1v","v1HlnF6PT2","Mm8siyToGW",
+"fFDrJHzZT8","QChxsU3yw5","2Yz7EDG4sT","i7WMQIKxdL","guMb8sqVrf","9GXkXRmDcr","In3NSdmoS7","FcWrWZUnqt","8cVD3NOHsz","24ARFCK5W7",
+"ix74rIBe8k","yvOMIpWiOs","fcJOyzHF1q","2TRI7B3qem","t98iWYjB9t","POUYSoQ87r","prNT6d7vjM","POUYS0Wr5y","uoStwRkQke","xXTI4L7cGc",
+"Z4I1vAIYUu","Y1mC0Ul4a1","wiHrZpmeCd","DG4sT9iGoT","5Mg9rCK5W7","s7MxkjS1aj","9GXkX64s8N","wiHrZRzaZA","M3zXL7fKYU","dmoS72ZHdk",
+"WPmlxuJScX","StlDJlCMxy","FGzgp0Kyfs","dQ586BFkb8","gdQsSn8pJ9","X6PinJIqXi","IRh48UmaEv","ZhwG1iKqhr","Rxrsmatef2","ThjNnpWiOs",
+"VerEAuupzk","uZPqg7fsYM","k85AeNhXdu","cShY2Fhtgl","JIqXiOUYuF","YjB9tyvOMI","NhXduv2eC3","dmoS7LewvM","gtCA5EoToP","iqv4kMGlTF",
+"k85AeyEfy9","S77LH7fsYM","QYxC0zFgtB","2hEEUqaofN","Dz1R3aez9y","0BmCyEdBKc","Nxx9VKr8ys","lH1ktuN6r3","lm0pDGSQwj","OHaBzOz8yZ",
+"DLhzMgdQsS","yofH3ix74r","4QMc9s93Ml","FNYIMZ4I1v","dQ5860Kyfs","LDk6fSWfou","2TRI7Rxrsm","HP433AgJHQ","lj07QJIqXi","ksJbyxciqp",
+"jzUqRh1zcH","Yf2EcMm8si","rKDLJChuy3","yToGWXyPZN","uvf7AuTacx","ulk412DREs","yvOMIlj07Q","nnP8oJRJQB","C2IrcZ4I1v","Chuy3hUTw7",
+"ni2v1pFrrl","RkQkepvgjS","xciqpiwzGk","8xEKzCNHmv","5IhmGv1Hln","gtCA5zHF1q","EdBKcb29RJ","2hEEUhi5X7","gIYvENcICA","Oz8yZFLsph",
+"FVMxoNAFuw","IRh48F6PT2","UlU3MzFgtB","uZPqgzFgtB","lpF6WJJs5m","i7WMQVjCZq","Waim69XyT9","JRJQBIBe8k","d85a9OxWIH","kB5nPcShY2",
+"NhXduuupzk","yEfy9Zv7z0","FhtgldmoS7","BCxeCuPX7G","RpBQmv2eC3","2TRI7FNYIM","KZamHXyPZN","POUYSDLhzM","Cfgr3yEfy9","BGaQY5Mg9r",
+"OUqFMTXQ0Z","s7Mxk3otm6","4dEz6bgJAz","JkzUnwDajX","9GXkXFhtgl","FcWrWlpF6W","gdQsSe6e4z","RBhp0CqqaD","wDajX14FLR","IjTwPMK07Y",
+"U3yw5KsjRK","RsQUqGrDg7","9GXkXL7cGc","YjB9tWaim6","TXQ0Zd85a9","Waim6JXljW","Y1mC0WaWsv","y94nwM3zXL","YOfrYFhtgl","8FmFHd85a9",
+"yEfy9lkMUA","WDVWJGrDg7","sx5Gl7fsYM","7hyVv2Nslm","dQ5869rlg9","s93MlQYxC0","0YAGHh1zcH","yToGWzbIYY","NOHszksJby","AIYUuFjHXR",
+"uupzkRACuj","4W0TlxXTI4","Zv7z0aL6AJ","GWqqXjzUqR","45cIHZv7z0","GSQwjWDVWJ","lj07QzY1GY","ECMvU5VZjS","zz4ZUa00b5","VLTy6prNT6",
+"xXTI4n8pJ9","O3iyQRpBQm","CIShGtjQxs","U3yw5nnP8o","IBe8klm0pD","sqVrfrhl0J","FnPFBlm0pD","RpBQmzQt6Q","yEfy9LDk6f","ciuWzCIShG",
+"24ARF8FmFH","ni2v1jiVBP","lViBvCIShG","uAWypAIYUu","Ss0ZugdQsS","2DREs0ao3l","BbwgAIBe8k","D6rBy07n1c","LDk6fjzUqR","W3VFHs4786",
+"fcJOy5Mg9r","o8UydSmGzv","48cHLgjUTu","F6PT2ZzJHW","v2eC38xEKz","ZzJHWPb1pa","zz4ZUCIShG","WaWsvuQIcz","ru4UGsx5Gl","yvOMINxx9V",
+"DcpWBuoStw","ulk41LDk6f","6q6L9No0Qb","Vprf2uZPqg","45cIHogLgc","ix74reuZA5","nlaByJ2mQi","3weIF9iGoT","FcWrWY1mC0","S77LH0PktI",
+"QbxXc5Drn0","FGzgpQWxoT","tlILt48cHL","x3LDehi5X7","gf8rIPOUYS","zY1GYoGu6x","1v5hHjzUqR","UlU3Muupzk","blLA9d7vjM","YjB9tdhSuH",
+"lpF6WB3qem","wiHrZ8FmFH","uAWypfaHir","uZPqgFjHXR","hi5X7nlaBy","uoStwZzJHW","prNT62TRI7","Ss0ZugIYvE","Kr8yss4786","gf8rIUmaEv",
+"oQ87rdmoS7","0PktIk85Ae","Yw2oU16lHc","BCxeCCdyBV","pFrrljiVBP","i7WMQvOqCE","JRJQBfcJOy","cmXIXm4bxU","FjHXRF6PT2","LbRTHOUYuF",
+"Zv7z0n8pJ9","lsQGo64s8N","gjUTuSjskQ","Pb1paaL6AJ","FLsph8RCUA","07n1c5Drn0","7fsYMlm0pD","JIqXiMaJQs","pT8wuS77LH","8xEKzsoy9t",
+"LDk6fHP433","tjQxsD6rBy","In3NSdQ586","FjHXRQ6hMC","zqH0WFVMxo","4dEz6Zv7z0","O3iyQZ4I1v","In3NS29QAz","4QMc90BmCy","CNHmvuJScX",
+"v1HlnJRJQB","zbIYY1j5L8","TCgPpb29RJ","RmDcrmz8gx","vkCHH7lUXZ","Vprf20BmCy","7Ow5CNo0Qb","gdQsS14FLR","Zv7z0pmeCd","suY4xaL6AJ",
+"n1pmOuZPqg","RzaZAlCMxy","1LB1LZuDtD","iKqhrOUqFM","3otm6rKDLJ","uZPqgVprf2","Dz1R3rhl0J","taOXKUmaEv","J2mQiC2Irc","zFgtBIBe8k",
+"faHirD6rBy","lm0pDJkzUn","e6e4zZuDtD","ix74rXflUq","gIYvEQ6Lix","9eoRcFjHXR","XflUqwiHrZ","dpe1vk85Ae","lj07QQ6hMC","ReKEWokgRi",
+"580YDkZANm","ogLgc9rlg9","zz4ZUfmIK1","ZzJHWAkKTk","VLTy6DcpWB","Twano2ZHdk","hUTw7ThjNn","WDVWJIjTwP","EdBKc5Namm","JRJQBkB5nP",
+"S77LH24ARF","WreyPJIqXi","4QMc9FnPFB","TCgPpG1RhS","9XyT9iwzGk","sqVrf64s8N","jfREuBpYhV","55rfBMmsIo","uTacxQ6Lix","FcWrWQClRL",
+"14FLRuAWyp","8xEKzY1mC0","QWxoTiqv4k","BGaQYJIqXi","k85AeHP433","yofH31j5L8","OUYuFd85a9","UlU3M7X3uy","dpe1vuoStw","Qworua00b5",
+"uQIcznlaBy","lsQGoAOgEe","16lHcJkzUn","K20wKi7WMQ","zQt6QMGlTF","0YAGH9XyT9","nFqikAgJHQ","blLA9hE1Ql","bZLvSjiVBP","zmLYDxXTI4",
+"pFrrlGrDg7","qaofNzHF1q","Zv7z0AkKTk","StlDJZJTXH","pvgjSfaHir","8RCUAd7vjM","5Mg9rTXQ0Z","xReecNo0Qb","JJs5mYw2oU","CqqaDMaJQs",
+"GXdoHuN6r3","D6rByguMb8","ZzJHWzQt6Q","Y1mC09XyT9","GrDg7jiVBP","W7cTs07n1c","F6PT2oGu6x","bZLvS0Wr5y","tvdkDWPmlx","OxWIH7fsYM",
+"blLA9iKqhr","3weIFQssNC","cmXIXpT8wu","AgJHQQWxoT","6q6L92ZHdk","0h1b1guMb8","kB5nPcmXIX","16lHcDQimp","he9IALewvM","0KyfsKr8ys",
+"pWiOsCp3mZ","RmDcr9GXkX","07n1cGv3Fq","Dz1R3pT8wu","9y4lwHP433","uZPqgpmeCd","0KyfsGWqqX","SmGzvb29RJ","Ul4a145cIH","5VZjSjS1aj",
+"k85AerKDLJ","No0QbZJTXH","9y4lwdpe1v","dmoS7MmsIo","2Yz7Euvf7A","5Drn0ksJby","SbRYyMmsIo","WMiS3Qworu","I7p2aVBjhz","sqVrfBbwgA",
+"lj07QxReec","1LB1LRsQUq","hE1QlAIYUu","cL0aEYw2oU","GSQwjyofH3","okgRilH1kt","jS1ajGWqqX","5drc6J2mQi","DG4sTx3LDe","2Nslmo8Uyd",
+"MezSWrhl0J","n8pJ9SWfou","2hEEUYOfrY","lpF6WxXTI4","0Wr5yrhl0J","WDVWJ0MR5X","2DREstAOsr","kB5nPNxx9V","VjCZqs7Mxk","lCMxyCxVEf",
+"yofH3Dz1R3","J2mQirKDLJ","zHF1qxciqp","e6e4zWreyP","AIYUuTCgPp","soy9taDGtS","Vprf2K4GS8","s7MxkZhwG1","Waim6OHaBz","b29RJksJby",
+"fcJOyCp3mZ","fLNg8nlaBy","ni2v1OxWIH","ZuDtDkB5nP","aDGtSQWxoT","1v5hHuLtKs","aDGtSbZLvS","y94nwAkKTk","Vprf2JRJQB","7fKYUbgJAz",
+"UlU3MWaim6","vOqCEtl72W","v8yFNSWfou","rz7Ut2DREs","uTacxFLsph","CIShGVjCZq","zmLYDQworu","pmeCds93Ml","X6PiniKqhr","gjUTuTCgPp",
+"zHF1qzbIYY","euZA5gIYvE","Yf2EcY1mC0","VLTy6RBhp0","MK07YtlILt","Pb1pazQt6Q","lpF6WlH1kt","gdQsSZuDtD","iwzGkTa8f6","fLNg8MmsIo",
+"ydG8UK4GS8","FxX9qi7WMQ","t59lRTwano","J2mQicShY2","aDGtSEOE1o","rhl0JMojnP","aL6AJ8xEKz","XyPZN0BmCy","JXljWtvdkD","pvgjSUl4a1",
+"d85a9aFFss","Gv3FqD6rBy","VLTy6P6bcg","lsQGo618Di","PYBf4h1zcH","2Yz7Ei3pyd","2ZHdkrhl0J","lm0pDLbRTH","jSjS3tuDyS","7X3uyZ4I1v",
+"hE1QlnlaBy","ZUnqtQssNC","CNHmvOUqFM","HzZT8NcICA","uQIczazIWp","fFDrJRpBQm","uZPqgChuy3","WreyP48cHL","XflUqTXQ0Z","Ul4a116lHc",
+"HzZT8a00b5","ThjNnhSSvQ","n8pJ95VZjS","6AFT0ulk41","CqqaDPOUYS","LewvM9iGoT","LbRTHlH1kt","5drc6yvOMI","VBjhzuLtKs","iqv4kjzUqR",
+"DLhzMChuy3","KZamH24ARF","brhlQb29RJ","AkKTkv1Hln","7fsYMNOHsz","nFqikHlUbF","gf8rItAOsr","lXFOBRmDcr","2TRI7DcpWB","5iGN5Mm8si",
+"48cHLzHF1q","JJs5m14FLR","580YDiKqhr","FjHXRhi5X7","EOE1ouupzk","faHire6e4z","TCgPpt59lR","sqVrf0h1b1","WmadAKr8ys","QWxoTxciqp",
+"he9IAVLTy6","KZamHuZPqg","AXpwEdpe1v","7fsYMxciqp","IjTwPpT8wu","SWfouAgJHQ","hi5X7n8pJ9","pv0i7Waim6","MGlTFZzJHW","AIYUujzUqR",
+"sqVrf9XyT9","RpBQmMkgy8","DG4sTyToGW","MmKGJaez9y","lweGy55rfB","Waim6StlDJ","NcICAwiHrZ","YOfrY4dEz6","QYxC0GrDg7","sqVrfgIYvE",
+"uAWypZJTXH","lXFOBCdyBV","djsrvMK07Y","O3iyQjeskS","FxX9qxReec","CqqaDTa8f6","DcpWBsoy9t","xReecZv7z0","s93Ml14FLR","d85a9pWiOs",
+"m4bxUokgRi","P6bcgJXljW","Waim6TXQ0Z","gjUTuWaWsv","fcwDaRpBQm","FGzgpAXpwE","NcICAiB08l","MK07YStlDJ","F6PT2rz7Ut","QssNCYjB9t",
+"OxWIHZuDtD","iKqhrGWqqX","tjQxsW3VFH","QssNCYh1hF","pv0i7MmKGJ","zbIYYTwano","ZuDtDblLA9","lCMxyrKDLJ","fLNg8dhSuH","QClRLtAOsr",
+"TwanoogLgc","Dz1R3b29RJ","ZJTXHgIYvE","OUYuFKr8ys","DG4sTfqypy","F6PT2fcJOy","aDGtSYf2Ec","FVMxoZzJHW","Mm8sitjQxs","CIShGXyPZN",
+"8hJdtxXTI4","aez9y8cVD3","ksJbyDz1R3","618DiReKEW","qQxHPhi5X7","14FLReuZA5","zz4ZUMm8si","24ARFv2eC3","24ARFtvdkD","Pb1paydG8U",
+"y94nwWaim6","5Drn0n8pJ9","yToGWBCxeC","qaofNIn3NS","GXdoH5Namm","fFDrJsx5Gl","s7MxkGSQwj","fqypy5Drn0","qUJMdix74r","Ul4a1dpe1v",
+"HRxd8djsrv","lsQGoNOHsz","5Drn0ix74r","FVMxo5iGN5","d7vjMatef2","29QAzQYxC0","QworuNAFuw","Mkgy8jS1aj","7fKYUt59lR","Uvlv4K20wK",
+"brhlQrhl0J","okgRihYBCK","TwanoHzZT8","dpe1vNcICA","aDGtSy94nw","AkKTkKZamH","x3LDevOqCE","UmaEvUmaEv","ru4UG0ao3l","FhtglAkKTk",
+"zHF1qgtCA5","qQxHPYOfrY","JkzUnhUTw7","JKWYRMmKGJ","WPmlx1j5L8","WMiS3ZJTXH","ciuWz5ZaEz","OUYuFguMb8","8TxD75IhmG","Uvlv4t59lR",
+"s93Mln1pmO","WreyPHzZT8","AmdQds7Mxk","piJSkKZamH","nFqikVIlwP","n8pJ90PktI","0h1b1AIYUu","M3zXLpWiOs","Pb1paW3VFH","jfREuWPmlx",
+"AgJHQni2v1","FPfSEfaHir","Nxx9VsuY4x","n1pmOWaWsv","lpF6W7hyVv","FNYIM29QAz","AOgEevkCHH","he9IAdQ586","7fsYMhSSvQ","16lHcRxrsm",
+"pvgjSLewvM","7X3uyuvf7A","Ss0Zu7fKYU","W7cTss4786","n8pJ9tl72W","K20wK2Nslm","JkzUnn8pJ9","FGzgpEdBKc","O3iyQFjHXR","VerEAhi5X7",
+"oVQp6djsrv","WreyPMGlTF","ZhwG1pAhR1","XflUqoVQp6","yToGWL7cGc","Ul4a18xEKz","b29RJwiHrZ","pT8wuhE1Ql","uQIczxciqp","DLhzMFNYIM",
+"dpe1vgf8rI","zY1GYCfgr3","m4bxUZUnqt","ZzJHWFcWrW","oQ87rFNYIM","YOfrYFGzgp","nnP8oM3zXL","Yf2EcXyPZN","FjHXRpmeCd","9iGoTOUqFM",
+"ogLgcSbRYy","zmLYDlkMUA","BbwgAOUqFM","MojnPcL0aE","blLA9dmoS7","2NslmpvgjS","MGlTFVBjhz","cShY2BpYhV","45cIHjtn0X","PYBf4zHF1q",
+"uJScXnnP8o","FhtglNxx9V","zFgtBuN6r3","uoStwk85Ae","tAOsrP6bcg","XyPZNTwano","CdyBV4dEz6","tuDySFPfSE","lweGyZuDtD","dpe1vmX2GE",
+"LDk6fogLgc","dhSuHHlUbF","dpe1v55rfB","Waim60PktI","PYBf4OUqFM","8xEKzOxWIH","ydG8UL7cGc","YjB9toQ87r","cShY229QAz","uvf7AZuDtD",
+"aL6AJrKDLJ","uLtKsKASQ8","FNYIM5VZjS","fcJOyzFgtB","0h1b1Ta8f6","MaJQsmz8gx","24ARFXflUq","aDGtSZUnqt","uN6r3SjskQ","DLhzMdpe1v",
+"uLtKsuJScX","YjB9tXflUq","jSjS3Waim6","pv0i7rKDLJ","LewvMAIYUu","RpBQmChuy3","yEfy99rlg9","zqH0WGrDg7","Gv3FqpFrrl","jzUqRt98iW",
+"7lUXZkZANm","StlDJAIYUu","2TRI7RzaZA","16lHcPb1pa","RACujUl4a1","cQOnvVerEA","EdBKcfFDrJ","euZA5faHir","8U2nU9iGoT","EdBKczqH0W",
+"EdBKcHlUbF","CqqaDK4GS8","Gv3FquAWyp","07n1chUTw7","In3NSEdBKc","1j5L8MGlTF","LewvMgdQsS","uLtKsTa8f6","UmaEvyToGW","sqVrfIjTwP",
+"LbRTHQ6hMC","zY1GYrhl0J","OHaBzNxx9V","JIqXiVLTy6","Rxrsm0MR5X","m4bxUoGu6x","ciuWzv8yFN","FnPFBix74r","fcwDaLbRTH","GSQwjMkgy8",
+"W3VFHuupzk","Zv7z08hJdt","d85a98xEKz","FLsphJ2mQi","VNCPdQssNC","2ZHdkZv7z0","wDajXpFrrl","OUYuFulk41","fcJOyAXpwE","P6bcgtl72W",
+"xXTI4djsrv","0PktIJkzUn","Mm8si2Yz7E","d7vjMGWqqX","In3NSYh1hF","RsQUqfcJOy","HlUbF5IhmG","FwEJz45cIH","RsQUqGWqqX","I7p2aFnPFB",
+"QworubrhlQ","8hJdtNhXdu","JRJQBfLNg8","lkMUASmGzv","7fKYUZhwG1","Q6LixJJs5m","hi5X7zHF1q","Yh1hFsqVrf","YOfrYlViBv","Mm8si5Namm",
+"HfyNQQ6Lix","t98iW55rfB","RBhp0580YD","pWiOsxXTI4","lViBvs93Ml","TwanoFVMxo","AgJHQt98iW","JIqXiSWfou","azIWpUvlv4","gIYvEk85Ae",
+"BCxeCjiVBP","GSQwj5ZaEz","DLhzMdjsrv","jfREuPb1pa","yofH3uvf7A","ThjNnCfgr3","IKxdL2ZHdk","pT8wufLNg8","JJs5mAIYUu","QYxC0AOgEe",
+"GWqqX8hJdt","9iGoTfcJOy","cL0aE580YD","he9IAyluBx","IjTwPS2Dfu","5VZjSydG8U","nlaByCxVEf","aL6AJ9y4lw","5ZaEz0h1b1","BGaQYWmadA",
+"5Drn0MGlTF","MaJQsNOHsz","Mm8si0BmCy","v8yFNRBhp0","mz8gxVIlwP","gtCA5UlU3M","rKDLJqQxHP","0h1b1ZzJHW","oQ87rHfyNQ","Q6LixOUYuF",
+"Gv3Fq8TxD7","fmIK1CNHmv","k85AeMm8si","iKqhrfFDrJ","YjB9tPYBf4","1v5hHThjNn","pmeCd2Nslm","mX2GEix74r","MezSW5nmWv","6q6L9azIWp",
+"v1HlnoGu6x","FjHXR6q6L9","RmDcrJRJQB","14FLR7Ow5C","DcpWBMmKGJ","lj07Q2ZHdk","fqypyK20wK","KASQ8BFkb8","oQ87r14FLR","5Drn0POUYS",
+"a00b5d85a9","L7cGcd7vjM","v2eC3aDGtS","v1HlnCfgr3","BFkb8RACuj","dQ586cmXIX","0h1b1MezSW","P6bcg6q6L9","Dz1R3iKqhr","qUJMd7lUXZ",
+"7fKYUVjCZq","8RCUA9GXkX","WPmlxB3qem","WPmlxPOUYS","XflUqfLNg8","e6e4zCK5W7","XyPZNFNYIM","G1RhSSbRYy","2ZHdkv1Hln","Gv3FqdmoS7",
+"I7p2a0YAGH","AmdQdWaWsv","8TxD7lm0pD","pmeCdogLgc","FjHXRU3yw5","Mkgy8MezSW","tvdkD7ku1p","C2Ircd85a9","x3LDe8cVD3","StlDJazIWp",
+"4QMc98hJdt","lweGypAhR1","XyPZNZJTXH","JXljWhYBCK","yToGWOUYuF","fFDrJW7cTs","aez9yiwzGk","zqH0WL7cGc","RBhp014FLR","jtn0XzQt6Q",
+"vkCHH7hyVv","gjUTuv8yFN","TXQ0Z9iGoT","HRxd8ZJTXH","atef2v1Hln","AXpwE64s8N","W3VFHF6PT2","jzUqRJXljW","ni2v1POUYS","fcwDaWMiS3",
+"4QMc9VjCZq","tjQxsnlaBy","nnP8ohE1Ql","lH1ktvLsmS","s7MxklweGy","O3iyQ64s8N","Vprf229QAz","ZuDtDtlILt","U3yw5aez9y","GrDg7CxVEf",
+"FGzgp6q6L9","4W0TllkMUA","Mkgy8SmGzv","CIShGDG4sT","9GXkXNxx9V","ReKEWKASQ8","WDVWJGSQwj","suY4xCxVEf","QbxXcjeskS","Y1mC0pv0i7",
+"rz7UttjQxs","RzaZAFLsph","uvf7AFcWrW","cQOnvYOfrY","yluBxNOHsz","EdBKcdpe1v","NcICA16lHc","xXTI4Fhtgl","okgRiksJby","jzUqRkZANm",
+"iB08lHRxd8","fFDrJFnPFB","dmoS7t59lR","Mkgy8pmeCd","WPmlxfFDrJ","HzZT8k85Ae","WDVWJfaHir","pmeCdCIShG","FcWrWsqVrf","7lUXZYw2oU",
+"StlDJjeskS","ZhwG1Pb1pa","RsQUqIjTwP","o8UydjiVBP","7X3uyJJs5m","pmeCd4dEz6","sqVrfDG4sT","GXdoHVIlwP","nFqikFGzgp","dpe1vl83Ud",
+"S2Dfu07n1c","NcICArhl0J","pv0i7Cfgr3","Oz8yZyvOMI","Ul4a1P6bcg","DcpWBSWfou","aL6AJ4QMc9","HlUbFlweGy","StlDJ2hEEU","Yw2oUsqVrf",
+"cmXIXAgJHQ","IKxdLb29RJ","wiHrZhE1Ql","8RCUARzaZA","lCMxySjskQ","uQIczAIYUu","5Mg9ruZPqg","Ta8f6SjskQ","SmGzvni2v1","2hEEUYh1hF",
+"KsjRK64s8N","blLA9uAWyp","BGaQYlH1kt","ni2v1fLNg8","3weIFsx5Gl","tvdkDBCxeC","W7cTs3otm6","RmDcrvLsmS","vkCHHDz1R3","ZUnqte6e4z",
+"AmdQdVLTy6","MmsIoBCxeC","s7MxkgtCA5","5Mg9rB3qem","JKWYRuZPqg","9XyT9lkMUA","Dz1R3lkMUA","CxVEf4QMc9","e6e4z64s8N","W7cTs7Ow5C",
+"Z4I1v3otm6","AOgEe5Drn0","MmsIoUlU3M","9rlg9v8yFN","iB08l4W0Tl","8TxD79eoRc","Ul4a1Yh1hF","SmGzv2Yz7E","BbwgACp3mZ","gtCA5lViBv",
+"2Yz7Erz7Ut","F6PT22DREs","ZuDtDAmdQd","IBe8kHP433","5Mg9rL7cGc","WDVWJNo0Qb","tjQxsOxWIH","3otm6SmGzv","GrDg7lweGy","AmdQdqUJMd",
+"U3yw5BGaQY","JRJQBatef2","Ul4a1M6qcG","ksJbyK20wK","b29RJAkKTk","9GXkXSWfou","0PktI9eoRc","45cIHUmaEv","Mkgy8oGu6x","Q6hMCS77LH",
+"7hyVvJXljW","pAhR1CdyBV","Pb1paGv3Fq","JXljWpmeCd","Ta8f6zY1GY","guMb8F6PT2","GWqqXa00b5","F6PT2rhl0J","QChxsO3iyQ","bZLvSCNHmv",
+"uN6r3wiHrZ","I7p2aogLgc","suY4xW7cTs","lj07QMezSW","Vprf2lm0pD","n8pJ9gf8rI","Pb1pa4W0Tl","lj07QyToGW","ThjNn48cHL","BpYhV7X3uy",
+"pmeCd16lHc","Vprf2BbwgA","fcwDaOz8yZ","W7cTsHfyNQ","v2eC3djsrv","vkCHHuvf7A","8cVD3MK07Y","ZuDtDPb1pa","JIqXit98iW","cShY2LbRTH",
+"iKqhr618Di","zz4ZUjfREu","LDk6fHzZT8","zz4ZUKr8ys","B3qemCNHmv","ECMvURACuj","dhSuHZuDtD","oVQp6EOE1o","DG4sTHfyNQ","7hyVvQnJ1S",
+"JJs5m0Kyfs","MK07YP6bcg","2TRI79y4lw","pWiOspAhR1","zY1GYuN6r3","nFqikh1zcH","vkCHH5Mg9r","MojnPReKEW","zHF1qW7cTs","nnP8ocmXIX",
+"taOXKfFDrJ","I7p2aDQimp","YOfrYfcwDa","fLNg8pv0i7","k85AeAgJHQ","CK5W7m4bxU","OHaBzlweGy","jSjS3IRh48","fcwDaIjTwP","Zv7z0RACuj",
+"v8yFNulk41","7Ow5CzmLYD","CK5W7uAWyp","x3LDeTwano","zbIYY7X3uy","Cp3mZZzJHW","7ku1pSWfou","cQOnvCp3mZ","Ul4a1BCxeC","kZANmQClRL",
+"7fsYMTXQ0Z","hE1QlgdQsS","0YAGHzbIYY","MojnPlpF6W","U3yw5Twano","JXljWhi5X7","MmKGJZUnqt","WDVWJY1mC0","uPX7GgdQsS","JXljWYjB9t",
+"MK07YbgJAz","8U2nUGXdoH","GXdoHWaWsv","WaWsvbZLvS","UmaEvb29RJ","lViBvzbIYY","t98iWSjskQ","Yf2EcRxrsm","VerEAXyPZN","jtn0XlCMxy",
+"S77LHfaHir","prNT6FVMxo","jzUqR7fsYM","pAhR1KASQ8","zHF1qRACuj","X6PinFGzgp","8xEKzFjHXR","5iGN50Wr5y","fLNg8uupzk","VNCPdnlaBy",
+"iKqhrSbRYy","brhlQYjB9t","sx5GlSmGzv","GrDg7wDajX","1LB1L5Namm","iKqhr7fKYU","ZuDtDb29RJ","kZANmDcpWB","gtCA5jeskS","cmXIXtl72W",
+"Waim6MojnP","ZJTXHblLA9","qUJMdBGaQY","WMiS35iGN5","l83UdTa8f6","5Drn0yvOMI","pT8wu2hEEU","BpYhVFNYIM","Pb1paCdyBV","LbRTHLDk6f",
+"kZANmAOgEe","uJScXokgRi","AIYUuhi5X7","x3LDeNcICA","tlILtix74r","SmGzvuvf7A","RxrsmGWqqX","W7cTsJIqXi","Ta8f6vOqCE","vOqCETwano",
+"RmDcrVBjhz","FwEJzOHaBz","DG4sT3weIF","GXdoHjtn0X","qUJMdpiJSk","YjB9tKr8ys","piJSkfqypy","lsQGo16lHc","jeskS29QAz","ZJTXHlH1kt",
+"EOE1onlaBy","ulk41tlILt","SjskQazIWp","BGaQYaL6AJ","xXTI4h1zcH","tAOsrI7p2a","bZLvS2Nslm","Y1mC0Dz1R3","QWxoTtlILt","64s8NSbRYy",
+"07n1cVjCZq","8cVD39y4lw","MezSWuTacx","D6rBylweGy","POUYSP6bcg","ix74rCNHmv","zFgtBHRxd8","jtn0X8TxD7","OxWIH8FmFH","9eoRcBbwgA",
+"jtn0XS77LH","lj07QguMb8","DQimpDQimp","jzUqRQWxoT","Gv3FqfFDrJ","ulk412Nslm","8RCUAMojnP","TwanoYw2oU","lXFOBMmsIo","HP433ThjNn",
+"Twano14FLR","JXljWOUYuF","OxWIH4W0Tl","F6PT2uLtKs","9iGoT0h1b1","fmIK18TxD7","U3yw59GXkX","W7cTstl72W","ogLgcksJby","VIlwP580YD",
+"GXdoHChuy3","LDk6fK20wK","WPmlx2Yz7E","i7WMQOHaBz","EdBKcI7p2a","blLA9FwEJz","DcpWBtl72W","AOgEeyToGW","F6PT2OUqFM","zbIYYlXFOB",
+"jS1ajv8yFN","y94nwQChxs","faHir7Ow5C","5nmWvOUYuF","ni2v1BCxeC","aFFssaFFss","QbxXcdpe1v","yofH3LbRTH","uN6r3W7cTs","aez9ytAOsr",
+"MezSWkZANm","nlaByfmIK1","Vprf2L7cGc","n1pmOXflUq","0ao3lNhXdu","GWqqXvLsmS","m4bxUjtn0X","hi5X7iKqhr","48cHLatef2","lpF6WLDk6f",
+"Oz8yZzFgtB","16lHc64s8N","wDajXzbIYY","9rlg9HlUbF","FcWrWzbIYY","FcWrW618Di","Q6LixP6bcg","tl72WxReec","ciuWzFPfSE","AOgEeksJby",
+"iwzGkfLNg8","ciuWzpv0i7","AgJHQ9iGoT","SmGzv8TxD7","Q6LixdmoS7","prNT6uPX7G","In3NS5drc6","YOfrYHP433","CK5W7v8yFN","Uvlv46q6L9",
+"FPfSEbZLvS","QssNCjiVBP","rz7UtfFDrJ","v1HlnBFkb8","bgJAzd85a9","FjHXRM6qcG","Yf2EcaL6AJ","Ta8f6Ul4a1","MaJQszz4ZU","lCMxy7ku1p",
+"580YDKsjRK","ciuWzUlU3M","HRxd8AmdQd","uoStwNhXdu","580YDuQIcz","jfREusuY4x","KASQ8CdyBV","aDGtSIRh48","2hEEUS77LH","5drc6Yw2oU",
+"EdBKcxciqp","zbIYY0BmCy","C2Irche9IA","azIWpfmIK1","suY4xbrhlQ","EOE1oW7cTs","6AFT0lm0pD","cQOnvGSQwj","Kr8ysEdBKc","JRJQBCdyBV",
+"blLA9jSjS3","8FmFHX6Pin","618DiFGzgp","OUqFMFGzgp","HlUbFuvf7A","B3qemjSjS3","gtCA5s4786","jSjS3WDVWJ","n8pJ9euZA5","FjHXRlpF6W",
+"Rxrsmjtn0X","MaJQsFFDui","Dz1R3zY1GY","OHaBz7Ow5C","zz4ZUJ2mQi","YOfrYJ2mQi","1LB1Llj07Q","2hEEUjS1aj","8FmFHMaJQs","O3iyQ5ZaEz",
+"J2mQikB5nP","O3iyQYh1hF","n8pJ9ni2v1","WDVWJ9GXkX","45cIHIBe8k","dQ586EoToP","tjQxs14FLR","TCgPpQYxC0","VIlwPUmaEv","UlU3M8RCUA",
+"Dz1R3cQOnv","aFFssSWfou","wDajX64s8N","euZA5ZhwG1","VIlwP0YAGH","aL6AJHzZT8","BGaQY7X3uy","zbIYYM3zXL","D6rBylCMxy","0KyfsYh1hF",
+"OUYuFLDk6f","gjUTu7hyVv","PYBf4FxX9q","0Kyfs5Mg9r","Yh1hFHzZT8","IRh48Z4I1v","wDajX4QMc9","Mm8siIjTwP","MmKGJMaJQs","aez9yF6PT2",
+"zmLYDRmDcr","jS1ajQ6hMC","BCxeCgf8rI","Ta8f6yToGW","rz7Utn8pJ9","kZANmpT8wu","M6qcGQssNC","QnJ1SQClRL","CqqaDvLsmS","fmIK1MGlTF",
+"D6rByReKEW","bZLvS3otm6","uZPqgIjTwP","VLTy6Ta8f6","9eoRcPOUYS","DcpWBZuDtD","VNCPddpe1v","KsjRKhe9IA","wiHrZFjHXR","W7cTs5Mg9r",
+"GXdoH2TRI7","tlILtFjHXR","uQIczAmdQd","CNHmvdhSuH","IKxdL9iGoT","Uvlv4F6PT2","55rfBWreyP","o8UydK4GS8","RkQke5Mg9r","gtCA5y94nw",
+"8cVD3Gv3Fq","Kr8yspT8wu","jfREuhYBCK","iwzGkuAWyp","6q6L9atef2","HRxd8SbRYy","yofH3CdyBV","Qworu9rlg9","s47869y4lw","FVMxoi7WMQ",
+"QClRLs93Ml","ReKEWRpBQm","VLTy6fmIK1","hE1QlpiJSk","7fsYMZv7z0","0YAGHfLNg8","Y1mC0QChxs","RpBQmEoToP","IBe8k5Namm","UlU3M1v5hH",
+"UmaEvyluBx","RkQke2hEEU","JKWYR9rlg9","d85a9LewvM","tlILtC2Irc","QClRL3otm6","GSQwj5iGN5","e6e4zChuy3","8hJdtCp3mZ","Cp3mZNxx9V",
+"AgJHQ8TxD7","Mkgy8fLNg8","StlDJGv3Fq","Kr8yst98iW","8xEKz5IhmG","QYxC0hE1Ql","zFgtBVprf2","gIYvEeuZA5","taOXKMkgy8","GSQwjD6rBy",
+"Mm8siC2Irc","zqH0W48cHL","Q6LixzHF1q","i3pyds93Ml","Vprf25nmWv","aL6AJ7lUXZ","pvgjSvkCHH","WmadAZUnqt","Ul4a1azIWp","GSQwjGrDg7",
+"e6e4zuQIcz","EdBKce6e4z","580YD1v5hH","yToGW7lUXZ","WmadAzQt6Q","45cIHnFqik","DLhzMv1Hln","JKWYRL7cGc","rz7UtdQ586","YjB9tuoStw",
+"Gv3Fq5VZjS","7hyVvuLtKs","5Mg9rmX2GE","taOXKQnJ1S","blLA95Mg9r","JXljWDLhzM","wiHrZmz8gx","M3zXLzHF1q","GWqqXB3qem","45cIHXflUq",
+"CdyBVRpBQm","IRh48B3qem","2hEEUhSSvQ","HzZT80Wr5y","pmeCdHlUbF","lm0pDtuDyS","lCMxyMK07Y","O3iyQyofH3","aFFssv8yFN","vLsmScQOnv",
+"sqVrfl83Ud","Nxx9VNxx9V","mz8gxcmXIX","ZhwG15Mg9r","OUYuF48cHL","lViBvZzJHW","I7p2aNo0Qb","S77LHv2eC3","Z4I1vTCgPp","2NslmIRh48",
+"Chuy30MR5X","16lHceuZA5","uZPqg7X3uy","Nxx9VUl4a1","ogLgcI7p2a","9rlg99eoRc","bZLvSjfREu","rKDLJyEfy9","hYBCKCIShG","ZhwG1SWfou",
+"QChxsNhXdu","WaWsvNhXdu","AkKTklsQGo","ZJTXHuTacx","gjUTuO3iyQ","SmGzvECMvU","2TRI7AgJHQ","cL0aEfqypy","yvOMIhYBCK","FGzgpxciqp",
+"Mkgy8CK5W7","ZuDtDJkzUn","ydG8Ut98iW","JRJQBOz8yZ","uTacxcQOnv","16lHc4W0Tl","U3yw50PktI","3weIFKASQ8","pFrrlKsjRK","2DREsSbRYy",
+"1LB1L5Drn0","4W0TlJkzUn","uQIcz0h1b1","xciqpD6rBy","tAOsrFwEJz","6AFT0IBe8k","K20wKNo0Qb","dhSuHrKDLJ","uLtKs9XyT9","lH1ktpFrrl",
+"NhXduStlDJ","OxWIH7fKYU","EdBKcv1Hln","lH1ktVerEA","GSQwj5VZjS","4dEz6d85a9","5Drn0aez9y","KsjRKPOUYS","zY1GYNo0Qb","BbwgAtAOsr",
+"hi5X7guMb8","euZA5m4bxU","LDk6f29QAz","JXljWjzUqR","2Yz7EnlaBy","ksJby7X3uy","n8pJ9RsQUq","lkMUAblLA9","NhXduoQ87r","7fKYUNhXdu",
+"lj07QM3zXL","Kr8ysD6rBy","RmDcrKASQ8","K20wKOHaBz","O3iyQFLsph","DLhzMlm0pD","7ku1pDz1R3","Fhtgl618Di","9y4lwKZamH","azIWpn1pmO",
+"Q6LixM3zXL","yEfy93weIF","soy9tS77LH","ru4UGpiJSk","45cIHEoToP","mX2GEQworu","hUTw75Mg9r","FLsphwiHrZ","S2DfuyEfy9","6AFT0KZamH",
+"NAFuw0Kyfs","blLA9ogLgc","m4bxUfFDrJ","y94nwIRh48","ThjNnZJTXH","soy9t5IhmG","JXljWfFDrJ","EOE1oYw2oU","QbxXcoGu6x","yToGW9iGoT",
+"BFkb8fLNg8","jzUqRECMvU","8xEKzNxx9V","jzUqRoGu6x","618DiCK5W7","1LB1LNOHsz","8RCUAL7cGc","tAOsrY1mC0","1v5hHOUYuF","IBe8kCp3mZ",
+"nlaByfqypy","7fKYU9eoRc","B3qemL7cGc","QWxoTDQimp","CIShGZUnqt","jtn0XpAhR1","Q6LixKASQ8","AmdQdgf8rI","618Div2eC3","45cIH3weIF",
+"qaofNHRxd8","b29RJlH1kt","BbwgAZzJHW","9XyT9CdyBV","vkCHHY1mC0","uoStw2ZHdk","L7cGcJIqXi","iB08l0Kyfs","Q6hMCJIqXi","CIShGzFgtB",
+"Rxrsmuupzk","2NslmuLtKs","x3LDeBbwgA","lpF6WRBhp0","JkzUnHzZT8","AkKTkkB5nP","oQ87rqUJMd","brhlQRkQke","FwEJz8U2nU","FPfSEuupzk",
+"QnJ1SSWfou","yEfy9S2Dfu","sx5GlEdBKc","GXdoHiqv4k","8RCUA8TxD7","ECMvUDLhzM","5Mg9r29QAz","gIYvEAXpwE","0h1b1DG4sT","uoStwFwEJz",
+"oVQp6n1pmO","VBjhzSWfou","SWfouW3VFH","DG4sTS2Dfu","mz8gxni2v1","UmaEv8xEKz","ru4UGbrhlQ","taOXKCqqaD","ECMvUAgJHQ","RkQkehYBCK",
+"8FmFHNAFuw","y94nwm4bxU","uTacxPOUYS","GSQwjdjsrv","MojnPsuY4x","v1HlnqUJMd","HlUbFK20wK","Q6hMCTa8f6","gf8rIWmadA","sqVrfL7cGc",
+"EdBKckZANm","PYBf4oGu6x","zz4ZUVerEA","FNYIMlpF6W","e6e4zAXpwE","d7vjMzY1GY","n8pJ9yEfy9","ix74re6e4z","Cp3mZ9y4lw","D6rByZv7z0",
+"s93MlZJTXH","qUJMdlViBv","gIYvESjskQ","oQ87rRzaZA","LbRTHPb1pa","QChxsmz8gx","uAWypKZamH","Ul4a1jSjS3","lsQGo4QMc9","HzZT8Cfgr3",
+"FnPFB3weIF","v1HlnMmKGJ","In3NS9XyT9","HfyNQX6Pin","kB5nP2DREs","Nxx9VydG8U","dmoS7lj07Q","0PktId7vjM","NOHszSs0Zu","dmoS74W0Tl",
+"BGaQY0h1b1","WPmlxxciqp","lj07QzFgtB","64s8NJ2mQi","0ao3lFVMxo","Z4I1vYf2Ec","FGzgpjfREu","Mm8siZzJHW","wiHrZ8U2nU","Nxx9VZzJHW",
+"FxX9qlweGy","FxX9qpWiOs","UlU3MMojnP","ZzJHW580YD","t98iWAkKTk","ogLgckB5nP","l83UdWmadA","d7vjMKZamH","HzZT8Waim6","W3VFHUl4a1",
+"YjB9tRACuj","Z4I1vAmdQd","48cHL64s8N","CdyBV7Ow5C","uoStwMmKGJ","tAOsrydG8U","cL0aE9y4lw","TCgPpIRh48","ThjNnjS1aj","QYxC05Drn0",
+"rhl0Jzz4ZU","ZzJHWnlaBy","Uvlv4zFgtB","AXpwEQYxC0","Ul4a1aez9y","iqv4k0Wr5y","hSSvQSmGzv","d7vjM2TRI7","4QMc9dpe1v","QYxC0kB5nP",
+"EOE1o8hJdt","JIqXiuupzk","zQt6QqUJMd","euZA5zz4ZU","UmaEvSWfou","QWxoTksJby","xXTI4d7vjM","bgJAzru4UG","S2Dfus7Mxk","F6PT2TCgPp",
+"L7cGcgdQsS","5VZjSPOUYS","Waim6aez9y","e6e4z0Wr5y","gIYvEReKEW","ZUnqtrhl0J","s4786IBe8k","uN6r35Drn0","RkQke1j5L8","lH1ktAOgEe",
+"ECMvUuoStw","uoStwFhtgl","VLTy6Pb1pa","fcJOyReKEW","BbwgAQChxs","0ao3lzqH0W","QworuQ6Lix","b29RJThjNn","Yw2oUQClRL","AIYUuMm8si",
+"MojnPWPmlx","nnP8o0ao3l","uPX7GMaJQs","5nmWvxXTI4","oQ87r7lUXZ","Y1mC0uN6r3","oQ87rDcpWB","ThjNns7Mxk","P6bcgXyPZN","aDGtSQbxXc",
+"OHaBzQYxC0","TCgPpfcJOy","Mm8siv1Hln","uAWypzqH0W","7fKYUlm0pD","M3zXLtjQxs","CNHmvsoy9t","zY1GYRpBQm","XflUqulk41","lm0pDFFDui",
+"fmIK1JIqXi","QYxC0ksJby","6q6L9uLtKs","lsQGo1v5hH","yvOMIyluBx","NhXdu8cVD3","ni2v1lweGy","P6bcg0Kyfs","8FmFHGWqqX","tlILtFVMxo",
+"dQ5866AFT0","zHF1qtjQxs","bZLvSAmdQd","ni2v1pAhR1","5nmWvAmdQd","qQxHPcShY2","1j5L8FFDui","RkQketlILt","EdBKc2hEEU","zz4ZUpiJSk",
+"lkMUAFPfSE","5nmWvQnJ1S","CdyBVJRJQB","VNCPdiqv4k","gIYvEbZLvS","vLsmSO3iyQ","0KyfsQWxoT","RACujMm8si","pmeCdZJTXH","b29RJ2ZHdk",
+"14FLR7fKYU","B3qemJJs5m","e6e4zYf2Ec","2hEEUs93Ml","oQ87rRmDcr","e6e4z6q6L9","iB08lvOqCE","azIWpl83Ud","aDGtSAOgEe","Yf2Eci3pyd",
+"6AFT0yvOMI","ksJbys4786","ZuDtD9iGoT","16lHc5Mg9r","CK5W7iKqhr","zY1GYuTacx","3weIF64s8N","KsjRKuN6r3","lj07QMK07Y","fLNg8n8pJ9",
+"gf8rItjQxs","1v5hHZv7z0","CNHmvZuDtD","CIShGyvOMI","SjskQtjQxs","64s8NRmDcr","S2DfuJXljW","lkMUAZuDtD","qQxHPni2v1","y94nwQ6Lix",
+"Yh1hFlm0pD","k85Aes93Ml","jeskS2TRI7","i7WMQFwEJz","CqqaD7ku1p","EOE1o4W0Tl","VLTy6ReKEW","n8pJ9QWxoT","uLtKsOz8yZ","9rlg95Drn0",
+"Nxx9VS77LH","piJSkSWfou","CNHmvRzaZA","X6Pin580YD","IBe8k7X3uy","AmdQdQworu","MmsIo2Nslm","FhtglPOUYS","mz8gxWmadA","xciqp9iGoT",
+"xXTI4tlILt","l83UdnFqik","kB5nPxciqp","kB5nPgtCA5","faHiri7WMQ","ZzJHWuJScX","i3pydLbRTH","QssNC4dEz6","AgJHQG1RhS","MmKGJtlILt",
+"9eoRcWaim6","aFFssRmDcr","hSSvQ64s8N","5VZjSQssNC","LewvM4W0Tl","iKqhr3weIF","HzZT8zqH0W","5Drn0lkMUA","ThjNnUvlv4","4QMc92DREs",
+"uoStwuQIcz","FGzgpgIYvE","JXljWzY1GY","DG4sTQChxs","S2DfuMK07Y","QbxXcKr8ys","l83UdPOUYS","lweGy2hEEU","DQimpt98iW","NOHszFxX9q",
+"9y4lwFhtgl","POUYSiB08l","ksJbyyEfy9","7lUXZlViBv","Ul4a1k85Ae","dpe1vqQxHP","Oz8yZMm8si","S77LH0Kyfs","CNHmvtaOXK","MK07YFGzgp",
+"ZUnqtFjHXR","618DixXTI4","TXQ0Z5Drn0","1LB1LvOqCE","jzUqRVprf2","Pb1paOUqFM","K4GS8wiHrZ","G1RhSFLsph","mz8gx4QMc9","UlU3MokgRi",
+"7fKYUBpYhV","lViBv0h1b1","AIYUuW3VFH","5ZaEzblLA9","NhXduWreyP","tuDyS24ARF","JRJQBDG4sT","zFgtBzHF1q","NAFuwjS1aj","64s8Naez9y",
+"WMiS3xReec","taOXKFwEJz","yToGWFhtgl","0YAGH9GXkX","lpF6W2TRI7","OxWIHThjNn","QnJ1STXQ0Z","EdBKcFhtgl","zY1GYn8pJ9","0ao3lLewvM",
+"fqypyGSQwj","pAhR1dmoS7","sx5Gl5IhmG","HfyNQEoToP","jiVBPEoToP","K20wKIBe8k","M3zXLX6Pin","OHaBzK4GS8","14FLRJ2mQi","lXFOB9rlg9",
+"MGlTFvOqCE","suY4xzmLYD","0Wr5yiqv4k","d7vjMO3iyQ","LDk6fQnJ1S","b29RJEdBKc","GWqqXcL0aE","guMb8euZA5","prNT6yvOMI","wDajXWaWsv",
+"F6PT22ZHdk","bZLvSNcICA","xXTI4QWxoT","8TxD7cShY2","n8pJ9S77LH","vOqCEpFrrl","hE1QlQnJ1S","0YAGHVjCZq","SjskQHP433","uQIczCqqaD",
+"o8UyduPX7G","hE1QlTCgPp","VNCPd6q6L9","yluBxo8Uyd","v2eC3jeskS","MmsIocmXIX","ZzJHWs4786","5Drn0JKWYR","KASQ8pWiOs","Zv7z0L7cGc",
+"xXTI4YOfrY","LbRTHVjCZq","RpBQmO3iyQ","AkKTkni2v1","FNYIMYjB9t","6AFT0VjCZq","k85AeRkQke","gtCA59XyT9","ulk411LB1L","vkCHHFwEJz",
+"In3NSlXFOB","Z4I1vSmGzv","24ARFzqH0W","RpBQmQChxs","Y1mC0fcwDa","S2DfuvLsmS","EoToPFhtgl","YOfrY5nmWv","StlDJDG4sT","580YD4QMc9",
+"uvf7ASbRYy","xReecvOqCE","OxWIHOUYuF","uTacxatef2","ogLgctlILt","vkCHHWMiS3","29QAzv8yFN","VNCPd8xEKz","FFDuiJJs5m","h1zcHO3iyQ",
+"SjskQ5IhmG","AXpwE7Ow5C","iwzGkm4bxU","OUqFMZUnqt","nlaByHlUbF","Waim6oGu6x","JXljWyEfy9","mz8gxtuDyS","M3zXLEOE1o","taOXKAmdQd",
+"3weIFkB5nP","QWxoTRzaZA","zHF1qQYxC0","h1zcHaL6AJ","zmLYDtlILt","2NslmsqVrf","he9IAMaJQs","Fhtgl5iGN5","bZLvSK4GS8","GWqqX2Yz7E",
+"sx5Glpv0i7","oVQp6mX2GE","d7vjMgjUTu","7X3uyjSjS3","ThjNnn8pJ9","StlDJFPfSE","HP433RpBQm","iKqhrnlaBy","xReec7ku1p","tvdkDoQ87r",
+"55rfBlCMxy","D6rByHzZT8","e6e4zCfgr3","jS1ajS77LH","NhXduM6qcG","zbIYYvkCHH","m4bxUGWqqX","5nmWvpWiOs","OUqFMv8yFN","s4786Kr8ys",
+"cShY2FNYIM","QworuQworu","MaJQshUTw7","CqqaDEOE1o","prNT6MmsIo","O3iyQblLA9","2hEEUb29RJ","HfyNQnnP8o","FGzgpdjsrv","SmGzvpWiOs",
+"jtn0XYh1hF","iB08lMm8si","QClRLAgJHQ","7Ow5CL7cGc","l83UdpvgjS","WDVWJ2Yz7E","HzZT8dhSuH","tjQxsDcpWB","pv0i7lsQGo","yToGWHRxd8",
+"n8pJ9Rxrsm","YOfrYD6rBy","cQOnvWreyP","8FmFH5iGN5","LDk6fQChxs","l83UdReKEW","Mm8siEdBKc","JkzUnFhtgl","2Yz7ERBhp0","WaWsvlkMUA",
+"QbxXcguMb8","6AFT08xEKz","TXQ0ZLbRTH","8cVD3Fhtgl","bgJAz24ARF","JIqXiQClRL","WPmlxjeskS","S2DfusqVrf","Ta8f6RsQUq","t98iWuJScX",
+"KASQ8jtn0X","FxX9qe6e4z","FLsphs93Ml","zmLYDpvgjS","ECMvUjiVBP","d85a97lUXZ","FGzgpDQimp","FxX9qprNT6","dpe1vVBjhz","yEfy9brhlQ",
+"7fsYMQWxoT","Q6hMC0MR5X","FNYIMXflUq","ydG8UQChxs","uN6r3AXpwE","atef2i3pyd","QYxC0TXQ0Z","yToGWyluBx","RACujnlaBy","5nmWv9iGoT",
+"xReeca00b5","FnPFBUmaEv","RmDcrZUnqt","GWqqXMGlTF","8xEKzNhXdu","W7cTsgjUTu","hUTw74W0Tl","F6PT2djsrv","2ZHdkulk41","lViBvY1mC0",
+"pAhR1DG4sT","pAhR1DcpWB","8cVD3dmoS7","8hJdtvLsmS","3weIFiKqhr","l83Udrz7Ut","Cp3mZSs0Zu","HzZT8jS1aj","SWfouNOHsz","XyPZNYf2Ec",
+"MmKGJjzUqR","0Wr5ye6e4z","mX2GERsQUq","yToGWO3iyQ","2ZHdkGrDg7","RsQUqIBe8k","dhSuHtuDyS","BGaQYpiJSk","pvgjSzbIYY","suY4xEOE1o",
+"WPmlxatef2","kZANmpFrrl","64s8NMkgy8","l83UdL7cGc","Ul4a1bZLvS","mX2GEmz8gx","zz4ZUuoStw","U3yw5DG4sT","dmoS70Wr5y","RpBQmmX2GE",
+"tuDySdhSuH","dQ586RkQke","s7MxkJXljW","azIWpFjHXR","ZzJHW0Kyfs","cmXIX3otm6","Cfgr3LbRTH","5nmWvLbRTH","5nmWvzqH0W","pAhR1dQ586",
+"uJScXMkgy8","gf8rIW7cTs","suY4xfLNg8","GSQwjW3VFH","aDGtSGrDg7","9iGoThUTw7","OUYuFsuY4x","OHaBz7fsYM","JXljWIjTwP","piJSkokgRi",
+"pvgjS5Drn0","RzaZApvgjS","blLA9s7Mxk","2TRI7fLNg8","JIqXiZhwG1","gf8rITCgPp","DG4sTXflUq","QworuYjB9t","dQ5864QMc9","ReKEWpvgjS",
+"fmIK1Oz8yZ","Cfgr3lCMxy","TXQ0ZMmKGJ","IKxdLZuDtD","gdQsSOUqFM","3weIFrKDLJ","C2IrcS77LH","8TxD7d85a9","FVMxo5IhmG","IRh48azIWp",
+"wiHrZSs0Zu","7fKYUd7vjM","fcJOyCNHmv","tAOsrK20wK","BpYhVpvgjS","x3LDeo8Uyd","3weIFDLhzM","5Drn0tjQxs","Q6hMC48cHL","AmdQdM3zXL",
+"BpYhV3weIF","Oz8yZNOHsz","taOXKlkMUA","NcICApWiOs","S2Dfun1pmO","MK07Y5iGN5","uPX7GAkKTk","8U2nUk85Ae","SWfoulH1kt","ix74rfFDrJ",
+"tl72W1LB1L","JIqXiOHaBz","pvgjSyluBx","4W0TlWmadA","aDGtSO3iyQ","lXFOBn8pJ9","FcWrWFwEJz","jeskSazIWp","ru4UGD6rBy","jS1ajKASQ8",
+"sx5GlDLhzM","ZhwG1S2Dfu","sx5GlQnJ1S","taOXKix74r","sqVrfMkgy8","FwEJzyvOMI","fmIK1uJScX","zqH0WoGu6x","WPmlxdpe1v","uZPqgMGlTF",
+"AOgEevLsmS","Q6LixyluBx","HfyNQ5iGN5","W3VFHuPX7G","2Yz7EFFDui","fqypyn1pmO","Mkgy8UlU3M","EoToPo8Uyd","vOqCEYf2Ec","t59lRFxX9q",
+"uAWypdpe1v","Yw2oUQbxXc","SbRYyAkKTk","oGu6xfaHir","lH1ktogLgc","yEfy9DG4sT","Nxx9VQssNC","djsrvDG4sT","X6Pin0BmCy","RxrsmM6qcG",
+"580YD0Wr5y","yluBxB3qem","8FmFHo8Uyd","8FmFH8hJdt","yEfy9tl72W","OUqFMd85a9","n1pmOGv3Fq","JkzUn8xEKz","VjCZqDG4sT","VIlwP7fsYM",
+"VNCPd3otm6","lpF6WQbxXc","nnP8o0YAGH","SbRYyfcwDa","HfyNQrKDLJ","CIShGL7cGc","RzaZAcQOnv","HlUbFzHF1q","StlDJGWqqX","IjTwPSbRYy",
+"jzUqRDG4sT","I7p2aru4UG","h1zcHCp3mZ","BGaQYKZamH","b29RJ55rfB","0MR5X07n1c","HRxd80YAGH","FNYIM4QMc9","xXTI4blLA9","1LB1LLbRTH",
+"n1pmOIjTwP","DLhzMpvgjS","iqv4kKZamH","IRh48ThjNn","wiHrZzY1GY","OUYuFDLhzM","kB5nPpT8wu","AmdQdWDVWJ","lsQGoi3pyd","FGzgpVjCZq",
+"8FmFH9iGoT","DcpWBL7cGc","gtCA5aez9y","kB5nPJKWYR","Yh1hFEdBKc","TXQ0ZUvlv4","Zv7z0JKWYR","OUYuFOz8yZ","lkMUAgtCA5","gjUTuNxx9V",
+"s93MlzmLYD","Kr8ysni2v1","DcpWBksJby","1LB1LEOE1o","OHaBzZzJHW","nlaByxXTI4","jS1ajHP433","2NslmMK07Y","ksJbybrhlQ","uoStwzqH0W",
+"tl72WzbIYY","vLsmSCp3mZ","uN6r3taOXK","dhSuHpvgjS","tlILt07n1c","8xEKzStlDJ","FNYIMzz4ZU","qUJMdK4GS8","WPmlxuoStw","HRxd8qQxHP",
+"HP433x3LDe","YjB9tQChxs","faHirYf2Ec","1j5L8Y1mC0","v8yFNx3LDe","taOXKpvgjS","DLhzMUlU3M","HRxd8fLNg8","iqv4kZJTXH","0KyfslCMxy",
+"I7p2a2ZHdk","aL6AJjeskS","ix74rDLhzM","uupzk2DREs","k85AezHF1q","XyPZN8TxD7","RmDcrTa8f6","hSSvQM3zXL","P6bcglj07Q","yluBxK20wK",
+"5IhmGbZLvS","9rlg9gf8rI","5drc6s7Mxk","ZzJHWjS1aj","Gv3FqkB5nP","WreyPv1Hln","VIlwPStlDJ","ZhwG1POUYS","iwzGkgf8rI","MGlTFt59lR",
+"S2DfuPYBf4","5Drn00YAGH","WPmlxFLsph","Q6hMCo8Uyd","zFgtBReKEW","MK07YC2Irc","aL6AJUmaEv","8TxD71LB1L","WMiS3Ul4a1","gIYvE55rfB",
+"Pb1pa580YD","gf8rI24ARF","FwEJzv2eC3","FLspheuZA5","uN6r3OHaBz","8cVD3POUYS","wDajXTa8f6","tuDySKASQ8","d7vjMuTacx","pv0i7WMiS3",
+"M6qcGZUnqt","lkMUAHfyNQ","0YAGHK20wK","lsQGo9y4lw","WPmlxpmeCd","dhSuHs4786","2NslmYh1hF","TwanoJJs5m","P6bcg5iGN5","DcpWBpmeCd",
+"K4GS8gtCA5","ulk41e6e4z","ydG8Uhe9IA","ogLgc9y4lw","BbwgA2DREs","2hEEUUlU3M","HfyNQfFDrJ","jS1aj24ARF","5VZjSdhSuH","i3pydJKWYR",
+"POUYSMaJQs","Oz8yZpAhR1","MmsIoCdyBV","JkzUnMojnP","ni2v1ru4UG","QYxC0iKqhr","Mm8sizFgtB","rKDLJlCMxy","FVMxo618Di","3otm6wiHrZ",
+"Mkgy824ARF","oGu6xYw2oU","W3VFHlCMxy","RkQkeuupzk","gf8rIFVMxo","iKqhr8hJdt","ix74rHfyNQ","GWqqXgIYvE","55rfBvLsmS","5NammKr8ys",
+"guMb87Ow5C","pWiOs2Nslm","64s8N9XyT9","4W0TlciuWz","WPmlxfcwDa","8FmFHuAWyp","gjUTupiJSk","tvdkDdhSuH","RpBQmDLhzM","IjTwPe6e4z",
+"Cfgr3sx5Gl","K20wKydG8U","lj07QpvgjS","RBhp0hE1Ql","fcwDaB3qem","uvf7AMGlTF","Cfgr3KASQ8","EdBKcjtn0X","kZANmMmKGJ","oQ87ryofH3",
+"oQ87rJKWYR","tAOsratef2","uAWyp4dEz6","FxX9qIBe8k","uoStwn8pJ9","jiVBPjzUqR","bgJAzJXljW","ulk41lkMUA","MmsIoDQimp","GXdoHTwano",
+"lsQGosoy9t","uLtKsru4UG","GWqqXl83Ud","JJs5mW7cTs","gf8rIbgJAz","W3VFHFxX9q","ZhwG1aL6AJ","oQ87rS77LH","7fsYMDcpWB","pFrrlOHaBz",
+"EoToPzFgtB","ZUnqtSWfou","fLNg83weIF","tlILtThjNn","SbRYy5iGN5","RmDcrIRh48","zqH0W5drc6","9y4lwuTacx","AkKTk64s8N","aFFssguMb8",
+"jfREuMkgy8","2DREsYh1hF","rhl0JjS1aj","zmLYDECMvU","RpBQm4QMc9","qQxHP5Namm","yEfy9FFDui","QnJ1SLbRTH","mX2GEKASQ8","cmXIXogLgc",
+"tvdkDlXFOB","CqqaDwiHrZ","pmeCdU3yw5","7X3uyVIlwP","8FmFHpFrrl","HP433Oz8yZ","mz8gxWMiS3","BFkb8hSSvQ","VerEAx3LDe","7ku1pMkgy8",
+"5drc6lCMxy","8cVD3OUqFM","v1HlnIKxdL","FFDuiRmDcr","NcICAgdQsS","Pb1pannP8o","a00b5zQt6Q","NcICAJKWYR","d85a9hi5X7","MK07Y5drc6",
+"hYBCKWMiS3","UlU3MpAhR1","HfyNQoGu6x","fLNg8IjTwP","ogLgcJkzUn","aDGtSd85a9","I7p2aDcpWB","OHaBzdjsrv","Dz1R3gtCA5","FNYIMxXTI4",
+"dQ586ECMvU","8xEKzS2Dfu","dpe1v7X3uy","fcJOyAIYUu","Chuy3FcWrW","07n1chi5X7","U3yw5QssNC","4dEz6QnJ1S","cmXIX5iGN5","tlILti7WMQ",
+"yEfy9W7cTs","14FLR5Drn0","fqypyVLTy6","OxWIH5nmWv","jiVBP3otm6","WmadAMkgy8","QbxXcFGzgp","n1pmONxx9V","euZA5h1zcH","zz4ZUK20wK",
+"v8yFNrz7Ut","WreyPcShY2","D6rByTCgPp","sx5GlCK5W7","0YAGHdmoS7","lj07Quupzk","t98iWy94nw","J2mQi55rfB","I7p2aFVMxo","v1HlnuQIcz",
+"8TxD7x3LDe","BCxeChE1Ql","iqv4kbZLvS","xReecnnP8o","cmXIXfmIK1","PYBf4SWfou","QClRL5Namm","NOHszni2v1","i3pydM6qcG","s4786P6bcg",
+"gIYvECIShG","29QAzAgJHQ","LbRTHQWxoT","9XyT9SWfou","FNYIMWmadA","L7cGcG1RhS","8U2nURmDcr","lsQGoMmsIo","5drc6WreyP","hUTw7IRh48",
+"K20wKZv7z0","ciuWzECMvU","QClRLpAhR1","ZuDtD48cHL","J2mQiS2Dfu","QWxoTokgRi","48cHLciuWz","ciuWz7ku1p","PYBf4dmoS7","cShY2wDajX",
+"MaJQsCNHmv","29QAz4QMc9","yluBxuAWyp","kB5nPW3VFH","B3qemv1Hln","AXpwEOUqFM","K4GS8GWqqX","e6e4zWaim6","xReecfFDrJ","yvOMIrhl0J",
+"d7vjMJkzUn","s93MlDz1R3","0Wr5ytvdkD","x3LDetvdkD","cQOnvBpYhV","MK07YUl4a1","55rfBFFDui","faHirdQ586","oGu6x7Ow5C","x3LDeoVQp6",
+"pmeCdAIYUu","Zv7z0zFgtB","faHirhYBCK","S2DfuzFgtB","BpYhVdjsrv","lj07Q5ZaEz","Nxx9Vx3LDe","MmKGJ0PktI","x3LDeF6PT2","GWqqXe6e4z",
+"uAWypLDk6f","J2mQipT8wu","hE1QlVIlwP","WaWsviqv4k","HzZT8NhXdu","IRh48CNHmv","UmaEvblLA9","07n1cMojnP","FnPFBtvdkD","8TxD7CdyBV",
+"24ARFZ4I1v","WMiS3okgRi","qaofN3weIF","yluBxfLNg8","Z4I1vKASQ8","dQ586BGaQY","FwEJzGrDg7","8FmFHuN6r3","fLNg89eoRc","LDk6ftAOsr",
+"lH1ktoVQp6","48cHLoQ87r","AOgEeUmaEv","HfyNQ2DREs","Kr8ys9GXkX","4QMc9IjTwP","YjB9t2TRI7","vLsmSRACuj","9iGoTQYxC0","IBe8klj07Q",
+"fLNg88TxD7","v8yFNuoStw","IBe8kblLA9","rKDLJaL6AJ","bgJAzNhXdu","14FLR6q6L9","RsQUqhE1Ql","fcJOyHP433","he9IAReKEW","AmdQdb29RJ",
+"xciqpMezSW","fqypyZhwG1","9GXkXU3yw5","tjQxsyEfy9","SmGzvcL0aE","GXdoHNo0Qb","uvf7An1pmO","Nxx9VAIYUu","gdQsS6q6L9","jtn0XQ6hMC",
+"VBjhzG1RhS","M6qcGni2v1","WaWsvgf8rI","SWfouuQIcz","gjUTuJKWYR","29QAzKsjRK","0h1b1lweGy","aL6AJtaOXK","Ta8f62DREs","B3qemTCgPp",
+"FFDui1LB1L","MezSWOxWIH","ulk41lpF6W","5nmWv7ku1p","7hyVvh1zcH","Mkgy8uvf7A","Q6LixzmLYD","nFqikEdBKc","s7Mxko8Uyd","No0QbRBhp0",
+"i7WMQtaOXK","5iGN5iwzGk","POUYSuvf7A","Nxx9VzFgtB","fcJOyru4UG","n1pmOEOE1o","Fhtgl4dEz6","CqqaDYw2oU","DLhzMulk41","ZzJHWt59lR",
+"zz4ZUIKxdL","lH1ktDz1R3","guMb8yEfy9","5ZaEz8hJdt","M6qcGl83Ud","uQIczuupzk","580YDtAOsr","okgRilXFOB","M6qcGazIWp","LbRTHVBjhz",
+"pWiOsZzJHW","v8yFNjeskS","qQxHPnFqik","OHaBzhUTw7","NOHsz618Di","uvf7ArKDLJ","yvOMI3otm6","Yf2Ec0ao3l","2TRI7m4bxU","HfyNQWPmlx",
+"DLhzMtuDyS","OUqFMblLA9","K20wKdpe1v","L7cGcSs0Zu","prNT6uQIcz","iqv4kqUJMd","NcICAtlILt","i7WMQxXTI4","cL0aEBFkb8","2Yz7EQYxC0",
+"TXQ0ZIjTwP","P6bcgTCgPp","uPX7GeuZA5","sqVrfhE1Ql","CdyBV3weIF","64s8N9iGoT","MGlTFRkQke","9eoRccL0aE","WPmlxQ6hMC","2hEEUSbRYy",
+"zz4ZUyToGW","ZzJHWFLsph","uupzkDQimp","W7cTst59lR","UlU3MOUYuF","4W0TlpiJSk","8hJdtDLhzM","lpF6Ws93Ml","pv0i7AIYUu","FwEJzQssNC",
+"OUqFMCfgr3","QbxXcDcpWB","0KyfsWmadA","yluBx7hyVv","lj07Qx3LDe","xReecuJScX","lweGyCqqaD","Ta8f6fFDrJ","tAOsrlXFOB","48cHL29QAz",
+"618DizHF1q","brhlQCK5W7","pvgjStlILt","pv0i7U3yw5","CK5W7lCMxy","580YDo8Uyd","sx5GlzQt6Q","h1zcHJIqXi","TXQ0ZogLgc","uAWypXyPZN",
+"2DREswiHrZ","vLsmSFxX9q","lViBv8hJdt","Waim64dEz6","Ss0ZuJkzUn","zmLYDjfREu","lsQGozFgtB","i7WMQMezSW","JXljWfcwDa","dmoS7i7WMQ",
+"2DREsIBe8k","zY1GYzmLYD","BGaQYcQOnv","RxrsmYjB9t","t59lRjtn0X","S2Dfuaez9y","tjQxsQChxs","xReec4dEz6","4dEz6pFrrl","dQ5868RCUA",
+"RBhp0UlU3M","v2eC3EoToP","Yf2EcqUJMd","iqv4kGXdoH","azIWpzHF1q","jSjS3No0Qb","x3LDe8xEKz","IBe8kCNHmv","4W0Tlix74r","suY4xYf2Ec",
+"n8pJ9sx5Gl","jfREuCp3mZ","Uvlv4ECMvU","MGlTFPYBf4","ZUnqtgjUTu","Yw2oUIRh48","pv0i7d7vjM","o8UydEoToP","SmGzvfFDrJ","kB5nPoGu6x",
+"5VZjSZv7z0","oGu6xzz4ZU","rKDLJciuWz","24ARFiKqhr","64s8Nh1zcH","nlaBysoy9t","AkKTkNhXdu","Dz1R3tl72W","vLsmSZv7z0","VLTy6POUYS",
+"7X3uya00b5","8xEKzO3iyQ","W3VFHtuDyS","Q6hMCI7p2a","jfREuokgRi","24ARFFjHXR","RzaZAuupzk","iwzGkVNCPd","wDajX8xEKz","ZUnqtNo0Qb",
+"vkCHHs93Ml","iqv4kzFgtB","AkKTkjtn0X","9eoRcQYxC0","i3pydJRJQB","WreyPtAOsr","fcJOyjiVBP","k85AeVjCZq","v2eC3cShY2","zFgtBCNHmv",
+"rhl0JReKEW","Yh1hFd85a9","s93MlfmIK1","Pb1pataOXK","qUJMdGWqqX","5VZjSMm8si","S77LHrhl0J","i7WMQb29RJ","WDVWJi3pyd","qUJMdL7cGc",
+"No0Qbi7WMQ","9XyT9OUYuF","piJSkpvgjS","AXpwEi7WMQ","Y1mC0AXpwE","QWxoTECMvU","h1zcHQbxXc","64s8NhYBCK","5Drn02TRI7","sx5GlJJs5m",
+"FPfSEcmXIX","9y4lwuAWyp","djsrvVjCZq","OUqFMqQxHP","29QAzuoStw","iB08lYOfrY","LbRTHZuDtD","WreyP8hJdt","S77LHprNT6","8hJdtPOUYS",
+"cQOnvS2Dfu","e6e4zoVQp6","OUYuF64s8N","fLNg8uPX7G","Qworu8cVD3","K20wK0ao3l","FxX9qkB5nP","0h1b145cIH","CIShGksJby","WPmlxDLhzM",
+"5Nammmz8gx","n1pmOjtn0X","xXTI4jS1aj","pvgjSBGaQY","EoToPaez9y","vLsmSgIYvE","2ZHdk9rlg9","Uvlv45Namm","QWxoTn8pJ9","GrDg77hyVv",
+"Q6hMC8TxD7","2NslmokgRi","14FLRGrDg7","In3NSLDk6f","n8pJ9zHF1q","iwzGkQ6Lix","ThjNnB3qem","0Wr5yAIYUu","zmLYDzQt6Q","DLhzMaez9y",
+"ciuWzbrhlQ","lweGy24ARF","2hEEUOHaBz","HfyNQFxX9q","gdQsSgdQsS","GrDg7HlUbF","X6PinOUqFM","dpe1vlViBv","UlU3M45cIH","S2Dfu29QAz",
+"GSQwjuZPqg","m4bxUuJScX","9iGoT4QMc9","XflUqZuDtD","W7cTsIRh48","v1HlnFPfSE","WreyPsoy9t","Ta8f6bZLvS","xReecru4UG","7fsYMiwzGk",
+"8TxD7dQ586","aez9y24ARF","MaJQsl83Ud","RkQke64s8N","Gv3FquJScX","No0QbO3iyQ","9iGoTRBhp0","prNT6yofH3","5NammuJScX","Ss0Zu580YD",
+"azIWpRsQUq","Gv3FqqUJMd","ZJTXHCNHmv","VjCZqS77LH","fqypyVjCZq","o8UydECMvU","FhtglvLsmS","gIYvEdmoS7","D6rByiB08l","SmGzv64s8N",
+"hSSvQZuDtD","WDVWJvLsmS","07n1cWaim6","ZhwG1uQIcz","0ao3lTa8f6","3otm6euZA5","580YDuLtKs","Yf2EcC2Irc","POUYS4dEz6","CxVEflXFOB",
+"2TRI7iKqhr","pmeCdlj07Q","CqqaD9XyT9","W3VFHfcJOy","m4bxUfmIK1","ydG8UNOHsz","MmsIoWmadA","HlUbFCIShG","s4786AgJHQ","2NslmzmLYD",
+"8hJdtiB08l","nnP8oFcWrW","0BmCykZANm","t98iWRxrsm","P6bcgkB5nP","OHaBzFLsph","Y1mC00MR5X","cQOnvzz4ZU","aez9yGSQwj","BpYhViwzGk",
+"9eoRcLbRTH","WDVWJ580YD","tl72Wni2v1","POUYSyluBx","fcJOy07n1c","7lUXZoVQp6","lkMUALewvM","RkQkeyEfy9","7hyVvgjUTu","zbIYYFhtgl",
+"NhXduMaJQs","4dEz6oGu6x","0ao3lOUYuF","wiHrZ5IhmG","BbwgA7fKYU","uZPqgZuDtD","JIqXilXFOB","AkKTkMkgy8","yToGWkB5nP","BFkb8ulk41",
+"s7MxkFPfSE","HlUbFwDajX","IBe8kFVMxo","ZUnqtx3LDe","8hJdtHP433","StlDJ14FLR","2TRI7FFDui","nlaByjtn0X","Q6Lixni2v1","I7p2a0Wr5y",
+"Zv7z0Rxrsm","U3yw5jtn0X","o8UydNAFuw","Y1mC0lweGy","0MR5Xzz4ZU","lCMxy5Mg9r","EoToPIBe8k","iqv4k0PktI","ix74rZuDtD","WPmlxx3LDe",
+"brhlQZUnqt","bgJAzgtCA5","8xEKzlweGy","tuDyS4W0Tl","WmadAMm8si","IRh48SbRYy","soy9t9XyT9","9XyT9atef2","pFrrllXFOB","Twano5Drn0",
+"L7cGcC2Irc","9GXkXv2eC3","RpBQmRkQke","guMb8rKDLJ","0YAGH2Nslm","oGu6xjeskS","X6Pinlm0pD","XflUqYh1hF","FxX9qQClRL","LbRTHsx5Gl",
+"o8UydPYBf4","yluBxCp3mZ","3otm6BGaQY","7lUXZWmadA","JXljWJRJQB","mz8gxFNYIM","tl72WpAhR1","guMb8Fhtgl","Pb1pa0Kyfs","IjTwPzmLYD",
+"5nmWvtaOXK","9rlg9Zv7z0","SWfouJkzUn","JJs5mprNT6","vkCHHkZANm","zHF1qXflUq","t59lRReKEW","dmoS7XflUq","pv0i7t59lR","IBe8kCdyBV",
+"MmKGJ55rfB","uN6r3a00b5","In3NSsqVrf","d85a9uZPqg","No0QbxReec","nFqikW7cTs","WDVWJlj07Q","RmDcrcmXIX","POUYSHRxd8","618Di4W0Tl",
+"AgJHQtjQxs","I7p2aGWqqX","k85Aejtn0X","J2mQiB3qem","C2IrcYh1hF","8xEKzP6bcg","Oz8yZSjskQ","zFgtBDz1R3","Zv7z0DG4sT","Cfgr3Oz8yZ",
+"ZzJHWQYxC0","i7WMQ8U2nU","OHaBzBGaQY","uLtKsLbRTH","FFDuiFGzgp","7fKYU5VZjS","1j5L8lViBv","lViBv1v5hH","tAOsr7X3uy","4W0TluPX7G",
+"v8yFNGv3Fq","IRh48VNCPd","8RCUApmeCd","RACujpvgjS","5nmWvThjNn","Z4I1vYjB9t","WmadA5drc6","sqVrftlILt","VNCPdZJTXH","uPX7GIKxdL",
+"pT8wuGv3Fq","QssNCfqypy","uTacxFxX9q","FhtglzbIYY","FnPFB0BmCy","blLA9FVMxo","MK07Ytl72W","zY1GYM6qcG","7lUXZd7vjM","5NammgdQsS",
+"hSSvQMm8si","FcWrWJRJQB","QWxoTUmaEv","kZANmFNYIM","G1RhSQworu","i3pydMmsIo","jS1ajpv0i7","8U2nUFPfSE","qaofNK20wK","2TRI7JJs5m",
+"MmKGJwDajX","jeskSFVMxo","SmGzvVprf2","AgJHQuQIcz","BFkb8Uvlv4","t98iWPb1pa","4W0Tlpv0i7","FcWrWaez9y","TwanojeskS","zmLYD14FLR",
+"M3zXLUvlv4","ni2v1lsQGo","U3yw5yEfy9","W3VFHuJScX","lCMxy2hEEU","8TxD7lweGy","FGzgpPYBf4","djsrvLewvM","S77LH2hEEU","UmaEvt59lR",
+"8cVD3JKWYR","suY4xt98iW","lXFOBaDGtS","oQ87rWDVWJ","vOqCEa00b5","EOE1okZANm","soy9tuLtKs","5IhmGzmLYD","GSQwjiKqhr","MGlTFOUqFM",
+"5iGN59eoRc","fcwDaGv3Fq","S77LH0h1b1","9iGoTYw2oU","pT8wuh1zcH","0Kyfs5Drn0","W7cTsFVMxo","IRh48WMiS3","J2mQi5Drn0","pvgjSwiHrZ",
+"Q6LixMm8si","cShY2t59lR","Cp3mZhSSvQ","uoStwQssNC","LDk6fBCxeC","lkMUAHlUbF","ZJTXHs4786","pAhR1FGzgp","KASQ8MmKGJ","nlaBy1j5L8",
+"AmdQdvOqCE","Cfgr3G1RhS","QClRLb29RJ","Uvlv4Oz8yZ","1j5L8BpYhV","gdQsSGv3Fq","6q6L9piJSk","dpe1vYh1hF","O3iyQZUnqt","O3iyQoGu6x",
+"pFrrltAOsr","AIYUuWmadA","5iGN5Chuy3","he9IAQ6hMC","pAhR1soy9t","07n1ci7WMQ","GXdoH4dEz6","Z4I1vIBe8k","sqVrfRpBQm","I7p2aMojnP",
+"dhSuHxXTI4","gdQsSkZANm","NOHszlpF6W","lkMUAlH1kt","5Drn0W7cTs","0h1b1RpBQm","pFrrls93Ml","Uvlv4DQimp","6q6L914FLR","LewvMD6rBy",
+"DG4sTBGaQY","tl72WvkCHH","uPX7GCIShG","JRJQBfqypy","7Ow5CRkQke","iB08lRpBQm","KsjRKhi5X7","AOgEeFhtgl","7lUXZiqv4k","5drc6cL0aE",
+"blLA9WPmlx","No0Qb2hEEU","5Mg9rcQOnv","TCgPpThjNn","SWfouOxWIH","QbxXcGXdoH","7fKYUAkKTk","FLsph1LB1L","64s8NBCxeC","8U2nUIBe8k",
+"Waim6D6rBy","OHaBzYw2oU","5VZjSqQxHP","FLsphYh1hF","ZhwG1jzUqR","s93Mls4786","TCgPpRBhp0","StlDJ0Wr5y","oGu6xQClRL","MojnPWmadA",
+"jeskSi3pyd","oGu6xaL6AJ","ksJbydQ586","CxVEfmz8gx","618DiYjB9t","ru4UG0h1b1","suY4xAmdQd","zz4ZUKASQ8","M3zXLwiHrZ","taOXKxReec",
+"Nxx9V2hEEU","FNYIMpFrrl","AXpwEDz1R3","GWqqXd7vjM","POUYSLewvM","POUYSB3qem","64s8NpAhR1","RACujdhSuH","RxrsmLewvM","RBhp0JKWYR",
+"okgRilsQGo","lkMUATCgPp","gf8rIDcpWB","W7cTsFwEJz","Q6hMCQ6hMC","MojnPpFrrl","SWfouMmsIo","ZUnqtrKDLJ","FhtgljfREu","jtn0Xgf8rI",
+"1j5L84dEz6","Uvlv4i7WMQ","bZLvSokgRi","gIYvEFnPFB","EoToPjSjS3","POUYSBCxeC","lpF6Wn8pJ9","RACujMmKGJ","CIShGh1zcH","FPfSENhXdu",
+"9eoRc5nmWv","XflUqS77LH","LbRTHWaWsv","tuDySJKWYR","AmdQdIjTwP","64s8N7hyVv","cL0aETXQ0Z","uupzkC2Irc","SWfout98iW","cL0aEaL6AJ",
+"tvdkDsqVrf","5drc6uAWyp","i7WMQQworu","X6PinzFgtB","Mm8siRBhp0","lViBvCK5W7","O3iyQv1Hln","hYBCK618Di","0h1b17X3uy","rKDLJuoStw",
+"0YAGHTa8f6","cL0aERBhp0","CxVEfU3yw5","64s8NyluBx","QssNC580YD","HzZT8lViBv","QnJ1SvLsmS","piJSkpAhR1","ru4UGSbRYy","e6e4zatef2",
+"BpYhVZUnqt","1j5L8tAOsr","zqH0WOz8yZ","VBjhz0Kyfs","QbxXcQ6hMC","rKDLJhE1Ql","JKWYRFcWrW","t98iWMm8si","oVQp68cVD3","djsrv1LB1L",
+"VBjhzWMiS3","jSjS3XyPZN","XflUqhE1Ql","IjTwPLbRTH","GWqqXOUYuF","J2mQio8Uyd","9rlg9l83Ud","55rfBBCxeC","UlU3MOz8yZ","1j5L8Cp3mZ",
+"HP433pT8wu","uAWyp64s8N","QworuMGlTF","iKqhratef2","FwEJzVprf2","euZA5EoToP","EoToPv1Hln","Nxx9VVBjhz","FGzgpnnP8o","BFkb8JKWYR",
+"jiVBPI7p2a","B3qem1j5L8","ogLgcqUJMd","uN6r3e6e4z","rz7UtcShY2","bgJAzCIShG","pmeCdWMiS3","qUJMdKASQ8","3otm6bZLvS","bZLvSUmaEv",
+"lm0pDuJScX","fqypy2Yz7E","ni2v1xReec","FLsphTCgPp","zz4ZU48cHL","2hEEUy94nw","4dEz6vOqCE","L7cGc14FLR","yvOMI64s8N","OUYuFfLNg8",
+"7lUXZYjB9t","atef2lsQGo","C2Irc7Ow5C","4QMc9piJSk","uvf7AQChxs","I7p2apmeCd","uQIczgf8rI","FFDuilXFOB","WreyPm4bxU","piJSkVBjhz",
+"mX2GEUvlv4","uZPqg9rlg9","G1RhStl72W","S77LHk85Ae","DG4sT580YD","IBe8kQClRL","pWiOsM6qcG","Nxx9VSWfou","ksJbyStlDJ","lm0pDFNYIM",
+"hE1QlyToGW","Pb1pa0BmCy","zz4ZUGWqqX","S2DfuWreyP","sx5GlFVMxo","AOgEeM6qcG","Dz1R3iqv4k","AXpwEzz4ZU","zQt6Quupzk","48cHLUlU3M",
+"ulk41GXdoH","Ss0ZuAmdQd","VLTy68cVD3","LewvMJJs5m","SbRYyyluBx","QworuuPX7G","SWfouyluBx","RkQkeQ6Lix","Q6Lix2DREs","JRJQBDcpWB",
+"7fsYM9XyT9","K20wKh1zcH","n1pmOv1Hln","pWiOsAmdQd","MmsIoqUJMd","hUTw7AmdQd","okgRiatef2","dhSuHh1zcH","xReecY1mC0","suY4xsx5Gl",
+"Q6LixcL0aE","CK5W7aez9y","fmIK1EoToP","UmaEvk85Ae","iqv4kDQimp","GSQwjVNCPd","jtn0XCK5W7","FxX9qjiVBP","YjB9tTa8f6","7fKYUB3qem",
+"nlaByChuy3","5ZaEzIjTwP","1LB1LsqVrf","xReec5nmWv","9GXkXtAOsr","FwEJzAgJHQ","gjUTu0PktI","CIShGmz8gx","pmeCdS2Dfu","blLA9lkMUA",
+"K20wKqQxHP","FNYIMPOUYS","7ku1pOHaBz","tl72WfmIK1","4dEz6AgJHQ","WMiS3n1pmO","FcWrWIjTwP","AmdQdfcwDa","uLtKslCMxy","9y4lwpAhR1",
+"I7p2a8hJdt","ogLgcjzUqR","wDajXDLhzM","t98iW4QMc9","jfREuPYBf4","1j5L8jeskS","In3NSNcICA","o8UydMezSW","DG4sTJIqXi","VjCZq45cIH",
+"ReKEWiqv4k","OxWIHZhwG1","6q6L9MmsIo","n1pmOVIlwP","3weIF5iGN5","ulk41azIWp","24ARFVLTy6","FcWrWYf2Ec","lCMxyThjNn","dQ586v8yFN",
+"aFFssvkCHH","dmoS7kZANm","lViBvFhtgl","7fsYMn1pmO","aez9yGrDg7","4dEz61LB1L","NOHszStlDJ","tvdkDv2eC3","oQ87rcL0aE","wiHrZWmadA",
+"zmLYDLbRTH","dmoS7b29RJ","sqVrfMaJQs","wDajXStlDJ","2Yz7EPb1pa","NcICA5Drn0","hYBCKQworu","BCxeCCp3mZ","CIShGNOHsz","JRJQBSWfou",
+"0ao3l16lHc","suY4xtvdkD","8TxD7uAWyp","yofH3uTacx","MezSWsuY4x","AIYUuru4UG","0PktIFLsph","Waim65IhmG","OHaBznlaBy","VLTy6L7cGc",
+"JJs5m7fsYM","ZzJHWuN6r3","cQOnvHfyNQ","e6e4zFcWrW","dhSuHRBhp0","Yh1hFtl72W","Cp3mZjzUqR","5Mg9rwDajX","5ZaEzG1RhS","IKxdLrz7Ut",
+"lXFOB3weIF","Nxx9Vb29RJ","uoStw4QMc9","5IhmGgtCA5","dmoS7dmoS7","djsrv1j5L8","8TxD7azIWp","5nmWvqUJMd","Yw2oUWDVWJ","WDVWJprNT6",
+"IKxdL7hyVv","WPmlxgjUTu","KZamHUl4a1","t98iWqQxHP","KsjRK5drc6","pWiOsxReec","4QMc9fFDrJ","SbRYyrhl0J","L7cGcQssNC","pWiOsqQxHP",
+"yEfy9JXljW","tlILtSWfou","gIYvEdpe1v","K4GS8zbIYY","6AFT0AkKTk","ECMvUkZANm","VBjhzaFFss","EoToP8xEKz","O3iyQQ6hMC","DLhzM7lUXZ",
+"0ao3l9iGoT","AgJHQfLNg8","v1HlnWreyP","lj07Q4dEz6","StlDJyEfy9","S77LH5ZaEz","2TRI7W7cTs","brhlQBCxeC","xReecMmKGJ","K20wKuvf7A",
+"tl72WNOHsz","Z4I1v9GXkX","FFDuiP6bcg","0PktIrz7Ut","RpBQmZ4I1v","EOE1oBbwgA","FLsphTa8f6","gdQsS9XyT9","qUJMdcmXIX","n8pJ9uTacx",
+"EoToPlweGy","oQ87rRpBQm","iB08lWmadA","EOE1oUmaEv","GrDg7pvgjS","AmdQdlXFOB","5VZjSfmIK1","5VZjSjSjS3","16lHcYOfrY","SbRYyQnJ1S",
+"FFDuit59lR","lm0pDRzaZA","vOqCE0ao3l","SbRYy7fsYM","JXljWNAFuw","7fsYM0ao3l","IKxdLuZPqg","gjUTuYw2oU","GXdoHoVQp6","blLA9nnP8o",
+"lm0pDiKqhr","HzZT8pmeCd","pmeCdAXpwE","SmGzvzz4ZU","uvf7ASs0Zu","fqypy48cHL","PYBf4uJScX","k85AeCIShG","5Mg9rdhSuH","vOqCEhSSvQ",
+"ix74r9rlg9","In3NS4W0Tl","9rlg9WmadA","zFgtBHfyNQ","azIWpdjsrv","Twano3weIF","VNCPdVIlwP","KsjRK9XyT9","hSSvQ0MR5X","FVMxouoStw",
+"cL0aEgIYvE","zQt6Qdjsrv","QssNClj07Q","5ZaEzyEfy9","MaJQsFnPFB","KsjRKtlILt","DQimpnlaBy","FVMxoIjTwP","OUqFMqUJMd","yToGWYw2oU",
+"24ARF07n1c","U3yw5MmKGJ","7Ow5CThjNn","azIWpXyPZN","VerEA9rlg9","okgRi4QMc9","lm0pD8TxD7","MmKGJJKWYR","gf8rI580YD","9eoRcxReec",
+"hE1Ql3otm6","DQimplj07Q","lpF6WJXljW","07n1cfmIK1","JIqXiS77LH","OUqFMuPX7G","POUYSChuy3","FLsphVLTy6","W3VFHHfyNQ","zmLYDwiHrZ",
+"2hEEUuN6r3","xXTI4lpF6W","0ao3lbZLvS","AIYUuNcICA","pWiOsVjCZq","VLTy6jtn0X","2hEEUFjHXR","8U2nU0BmCy","Cp3mZ8hJdt","7Ow5CTwano",
+"JkzUnjtn0X","In3NSMojnP","7Ow5CRACuj","RzaZAZuDtD","IKxdLatef2","pmeCdYw2oU","64s8NjeskS","GXdoHFVMxo","14FLRCqqaD","29QAzciuWz",
+"nnP8oXflUq","HzZT8rz7Ut","hUTw7aDGtS","bZLvSLDk6f","CxVEfxXTI4","2ZHdkSWfou","Ss0ZuS77LH","ogLgcuAWyp","lkMUAECMvU","zqH0WpFrrl",
+"djsrvuJScX","7ku1pEoToP","Ss0ZutaOXK","sx5GlpvgjS","ReKEWUl4a1","d7vjM5Namm","fLNg8RpBQm","uupzk5ZaEz","gIYvELbRTH","kB5nPmz8gx",
+"FcWrW9y4lw","zqH0WcQOnv","jeskSmz8gx","uLtKslj07Q","1LB1LyToGW","h1zcHs7Mxk","gdQsSEdBKc","uAWyp2hEEU","nlaByS77LH","WDVWJk85Ae",
+"SmGzvCqqaD","SjskQ5Drn0","Oz8yZuTacx","QChxsRACuj","uQIczYOfrY","tl72WjzUqR","5VZjS1j5L8","yToGWJIqXi","580YDkB5nP","GWqqX7hyVv",
+"Cfgr3yvOMI","AXpwEnnP8o","VNCPdTCgPp","GSQwjlweGy","AXpwEpiJSk","kZANmhe9IA","QClRLZuDtD","B3qemS77LH","0h1b1pWiOs","tuDySk85Ae",
+"ix74r7X3uy","7hyVvhSSvQ","2ZHdk29QAz","he9IAVerEA","zQt6Qe6e4z","9GXkXogLgc","jfREuy94nw","oQ87rCK5W7","oGu6xDLhzM","uPX7GlCMxy",
+"mz8gxeuZA5","KZamHguMb8","bZLvSs7Mxk","hUTw7W7cTs","U3yw5RmDcr","NcICAlpF6W","PYBf49eoRc","hE1QlhE1Ql","8cVD35Drn0","9GXkXMezSW",
+"FjHXRUvlv4","d85a93weIF","hE1QlQ6Lix","v1HlnMGlTF","xciqplXFOB","L7cGc5ZaEz","FwEJzGXdoH","GXdoH9eoRc","zmLYDsx5Gl","x3LDeDG4sT",
+"0YAGHhe9IA","VIlwP8RCUA","y94nwsoy9t","iwzGkVprf2","Yf2EcpFrrl","3otm6piJSk","BCxeCStlDJ","2ZHdkfaHir","JJs5m618Di","Chuy3Q6Lix",
+"Yh1hFhi5X7","VIlwPhYBCK","LewvMK20wK","FLsphazIWp","uupzkMGlTF","2ZHdk14FLR","14FLRoGu6x","5drc6FwEJz","rhl0JkB5nP","aFFssNxx9V",
+"5ZaEzAmdQd","zFgtBCqqaD","AIYUuIBe8k","ksJbycShY2","RmDcr7fKYU","AkKTk0Wr5y","Dz1R30Kyfs","bgJAzQClRL","QYxC0In3NS","1LB1LPOUYS",
+"gIYvEECMvU","7lUXZ0Wr5y","faHirYw2oU","Gv3FqogLgc","Ss0ZuQYxC0","vOqCEF6PT2","IRh48TCgPp","3weIFo8Uyd","cQOnvh1zcH","zY1GYYf2Ec",
+"StlDJeuZA5","0Wr5yRzaZA","lkMUArKDLJ","vkCHHAOgEe","HP4330PktI","7Ow5C0ao3l","zY1GYKZamH","No0QbQClRL","LewvMfmIK1","ix74ruPX7G",
+"SjskQDG4sT","rz7UtoQ87r","4dEz6ogLgc","dQ586I7p2a","9GXkXhE1Ql","tl72WMm8si","Zv7z0Q6Lix","FPfSEFjHXR","hE1Qlgf8rI","yvOMICK5W7",
+"uQIczOUqFM","FnPFBkZANm","azIWp8hJdt","HRxd8EOE1o","580YDW3VFH","iKqhrtlILt","yvOMIOUqFM","d85a9Vprf2","oVQp6gf8rI","0KyfsuLtKs",
+"lm0pDkB5nP","KsjRKZzJHW","U3yw5pvgjS","IRh48JkzUn","nnP8ooQ87r","jfREurKDLJ","RzaZAuAWyp","FFDuiIBe8k","RsQUqDQimp","NcICA7X3uy",
+"AIYUuzHF1q","mX2GE1LB1L","Dz1R3Twano","a00b58RCUA","2TRI7XyPZN","djsrvRBhp0","NhXdutaOXK","vkCHHAXpwE","7ku1p0MR5X","lViBvjeskS",
+"lm0pDhUTw7","jiVBPBCxeC","POUYSSjskQ","JJs5mpvgjS","QYxC09XyT9","5IhmG2TRI7","tl72WVIlwP","RxrsmNhXdu","jtn0XAXpwE","n8pJ9VBjhz",
+"Vprf2QbxXc","Pb1pa9XyT9","nFqikrKDLJ","5VZjS9GXkX","HRxd8t59lR","WPmlxrz7Ut","bgJAzWPmlx","QnJ1SFhtgl","soy9tSbRYy","qQxHPv1Hln",
+"SbRYy2DREs","OUYuFPYBf4","nFqikcL0aE","FwEJzFLsph","OHaBzhe9IA","k85AeEoToP","m4bxUTwano","07n1c5Namm","zFgtBQssNC","ZhwG1ogLgc",
+"RkQkeciuWz","IBe8kuLtKs","BpYhV8cVD3","DQimpHfyNQ","RsQUqSs0Zu","iB08lyofH3","WPmlx5Namm","aDGtS48cHL","FFDuifcJOy","6AFT07Ow5C",
+"uLtKsv8yFN","XyPZNVerEA","2hEEUQWxoT","OUqFM8FmFH","P6bcgtuDyS","OUYuFpAhR1","FFDuiv2eC3","zY1GYjfREu","9XyT9wiHrZ","7ku1pBbwgA",
+"29QAzQssNC","WaWsvpT8wu","LDk6fDcpWB","ECMvUIn3NS","JRJQBlweGy","uJScXWMiS3","faHir0MR5X","WreyPWPmlx","iB08lguMb8","lkMUAL7cGc",
+"EdBKcS2Dfu","GrDg7vkCHH","HlUbFSs0Zu","aL6AJVBjhz","55rfBrhl0J","AXpwEnlaBy","h1zcH7X3uy","iqv4kWMiS3","3weIFb29RJ","fcJOy2hEEU",
+"LbRTH9y4lw","3otm6BpYhV","VerEAQ6hMC","k85Ae7ku1p","Mm8sixReec","SmGzvSs0Zu","hUTw77lUXZ","uQIczVNCPd","uPX7Ghe9IA","6q6L9Vprf2",
+"G1RhSF6PT2","7fsYMni2v1","GrDg7HRxd8","yvOMItjQxs","nlaBy07n1c","7lUXZYf2Ec","BbwgA6AFT0","FVMxozFgtB","uZPqgy94nw","dpe1vAkKTk",
+"O3iyQb29RJ","9GXkXuoStw","QClRL45cIH","KsjRKuvf7A","NOHszlweGy","2Yz7E7lUXZ","Y1mC0pT8wu","6q6L9jSjS3","BCxeClH1kt","O3iyQnFqik",
+"UlU3M2Yz7E","U3yw5POUYS","wiHrZtAOsr","lsQGo1j5L8","okgRiZuDtD","0BmCyCqqaD","EOE1ot59lR","4W0Tl6q6L9","F6PT2ECMvU","8cVD3nlaBy",
+"iwzGklXFOB","nlaByrz7Ut","pvgjSfmIK1","ulk41x3LDe","ZJTXHpWiOs","jiVBPfqypy","zHF1qBGaQY","7X3uy0Wr5y","QnJ1SNo0Qb","9y4lwSs0Zu",
+"IRh48gdQsS","iqv4kdjsrv","t59lRBpYhV","XflUqcShY2","lCMxy580YD","XflUqguMb8","StlDJb29RJ","b29RJ7fKYU","kB5nPfcJOy","nlaBy7fsYM",
+"ix74rmz8gx","blLA99eoRc","lXFOBtl72W","RACujYjB9t","AkKTk0YAGH","kB5nPhUTw7","FcWrWpFrrl","vOqCEUvlv4","EdBKc8RCUA","I7p2ahUTw7",
+"AmdQdVNCPd","TCgPpECMvU","RBhp0DLhzM","cmXIXtaOXK","FFDuibrhlQ","zHF1qFNYIM","zHF1qQWxoT","JRJQB07n1c","dmoS7FnPFB","TCgPpWPmlx",
+"DLhzMUl4a1","lViBvVerEA","GSQwjpmeCd","hYBCKIn3NS","VjCZqDQimp","EoToPfFDrJ","Cp3mZuupzk","8xEKzuJScX","VNCPd9GXkX","OUqFM8U2nU",
+"2hEEUX6Pin","jtn0X0Wr5y","2TRI75Mg9r","oQ87rrz7Ut","16lHc2Yz7E","7Ow5CokgRi","azIWpuQIcz","U3yw5ni2v1","n8pJ9HRxd8","7ku1p7fKYU",
+"2Yz7E2hEEU","FNYIMpiJSk","o8Uyd2Nslm","zQt6Qn8pJ9","mX2GEZhwG1","64s8Nt59lR","B3qem2Yz7E","Mkgy8uQIcz","No0QbHfyNQ","aez9ydQ586",
+"Yf2EcKZamH","zFgtBulk41","KZamHciuWz","gdQsSCdyBV","lViBvuvf7A","Chuy3KZamH","WPmlxMGlTF","tjQxs0Kyfs","FhtgluJScX","cmXIXC2Irc",
+"DQimpIjTwP","fqypyuoStw","azIWpfcJOy","GSQwjuAWyp","zY1GYatef2","S2DfuWPmlx","4W0TlI7p2a","3weIFcL0aE","XflUq7ku1p","taOXKdmoS7",
+"DQimpNOHsz","i3pydcShY2","uZPqgzqH0W","VIlwPRsQUq","0YAGHmz8gx","lsQGoEdBKc","8cVD3xReec","nnP8o5Mg9r","QssNCuZPqg","FhtglAmdQd",
+"jiVBPgtCA5","0PktIYjB9t","yToGWDQimp","55rfBQ6hMC","fLNg8MK07Y","hSSvQZJTXH","TCgPpVBjhz","zY1GYy94nw","O3iyQbrhlQ","WaWsvFLsph",
+"Q6LixvOqCE","QbxXcydG8U","vLsmSWaim6","9XyT9sqVrf","Pb1paTa8f6","dmoS7QChxs","pmeCdGSQwj","NAFuwguMb8","XyPZNdQ586","8cVD3BGaQY",
+"7lUXZlweGy","PYBf4mz8gx","PYBf4In3NS","S2DfuNhXdu","guMb8Kr8ys","iB08loGu6x","4W0Tl2Yz7E","oGu6xFVMxo","dhSuH0h1b1","gdQsSWreyP",
+"POUYSs4786","ksJbyRxrsm","uTacx2DREs","uPX7GZhwG1","HfyNQDLhzM","fFDrJ0Kyfs","zbIYY8RCUA","ECMvUuQIcz","0ao3l9XyT9","ni2v1gf8rI",
+"Mkgy8ECMvU","Z4I1vJkzUn","AXpwEKASQ8","LewvMpFrrl","rKDLJprNT6","EdBKcv8yFN","cShY2l83Ud","zmLYDuupzk","7hyVvzFgtB","Waim6dQ586",
+"uQIczUlU3M","7lUXZhSSvQ","zmLYDfFDrJ","d7vjM1v5hH","BpYhVix74r","7fKYUpWiOs","L7cGchSSvQ","UmaEvYjB9t","2hEEULewvM","FxX9qzQt6Q",
+"8xEKz2hEEU","piJSkRpBQm","TwanoReKEW","OUqFMyToGW","zQt6QcQOnv","Mm8si1LB1L","9GXkXhSSvQ","rz7UthYBCK","7hyVv0ao3l","JIqXiKZamH",
+"DcpWB1j5L8","BCxeChYBCK","lsQGouPX7G","KASQ8MaJQs","qUJMdJKWYR","FhtglS77LH","SmGzviqv4k","S77LHQWxoT","P6bcgCfgr3","Twanon8pJ9",
+"hUTw7EoToP","kZANmtjQxs","Ss0ZuNcICA","5nmWvLDk6f","VjCZqlViBv","lXFOBxciqp","7fKYUpiJSk","djsrvD6rBy","4QMc9FcWrW","BFkb89iGoT",
+"okgRilj07Q","EOE1oEoToP","2Yz7Ex3LDe","0YAGHNxx9V","FnPFBZuDtD","l83UdYOfrY","XflUqvkCHH","okgRi8hJdt","azIWpjtn0X","WmadAQWxoT",
+"F6PT2cQOnv","DQimpTXQ0Z","pWiOsLDk6f","FGzgpJJs5m","2NslmfaHir","ksJbybZLvS","VerEAqQxHP","yEfy9d85a9","vOqCEFVMxo","tlILtFwEJz",
+"5NammHP433","b29RJYw2oU","BGaQYMK07Y","8U2nUQClRL","atef2ZuDtD","tjQxsRACuj","zbIYYECMvU","UmaEvoQ87r","QssNCzQt6Q","lkMUApT8wu",
+"No0QbtjQxs","8FmFH0YAGH","RsQUqoQ87r","Mkgy814FLR","djsrvMmsIo","MmsIoFwEJz","i7WMQhYBCK","9y4lwL7cGc","ciuWz2DREs","pWiOs2DREs",
+"RkQkeokgRi","0KyfswDajX","M3zXLVIlwP","64s8NmX2GE","fmIK1DcpWB","1v5hHcShY2","Yf2EcgjUTu","5Drn0CNHmv","618DiYOfrY","RxrsmydG8U",
+"fLNg8VLTy6","Yf2EcTa8f6","Cfgr3MK07Y","QWxoTAkKTk","fcwDam4bxU","5NammZhwG1","iB08l4QMc9","ECMvUMmKGJ","EdBKcsuY4x","Gv3Fqatef2",
+"QssNCmX2GE","s7Mxkfqypy","KZamH9XyT9","TwanolsQGo","0YAGH45cIH","d7vjMulk41","7fKYUzFgtB","2NslmUlU3M","uQIczHlUbF","lj07QNAFuw",
+"ThjNnzmLYD","RpBQmNhXdu","DQimpHRxd8","0MR5X9iGoT","MK07YnlaBy","7lUXZZhwG1","KZamHAIYUu","1LB1LFNYIM","WmadA618Di","jiVBPOxWIH",
+"bZLvSDQimp","GWqqXJ2mQi","KASQ8K20wK","Ta8f6FGzgp","WaWsvVprf2","KsjRKqaofN","XflUqm4bxU","7ku1ppv0i7","zHF1qUmaEv","FxX9qy94nw",
+"gtCA5BGaQY","e6e4zCNHmv","zFgtBrz7Ut","ru4UGFPfSE","uupzk5VZjS","soy9tblLA9","9eoRcPb1pa","X6Pinh1zcH","5nmWvStlDJ","kZANmGWqqX",
+"uN6r3m4bxU","ThjNnSmGzv","guMb8tlILt","vkCHHZUnqt","cShY2EOE1o","FPfSE45cIH","nFqikyEfy9","ni2v1zz4ZU","8FmFHuvf7A","2hEEUECMvU",
+"7X3uyxciqp","9XyT9FLsph","n8pJ9UlU3M","euZA5rhl0J","9y4lwuLtKs","Gv3FqJJs5m","BCxeCGrDg7","EoToPKZamH","45cIHaL6AJ","14FLROHaBz",
+"Ta8f6DLhzM","uLtKsCqqaD","sx5GlUvlv4","vOqCEiB08l","b29RJsx5Gl","KASQ8atef2","KsjRKCdyBV","m4bxU24ARF","lH1ktNOHsz","QbxXceuZA5",
+"IjTwP16lHc","CIShG9rlg9","SWfouG1RhS","AmdQdVIlwP","6AFT0v2eC3","b29RJMGlTF","8TxD7No0Qb","ZzJHWFFDui","jiVBPJKWYR","5ZaEz7ku1p",
+"1LB1LjfREu","XyPZNfFDrJ","FGzgpJXljW","StlDJFwEJz","Fhtgl1j5L8","rhl0JTwano","QssNCStlDJ","29QAzgf8rI","v8yFN07n1c","O3iyQ2TRI7",
+"hE1QllCMxy","o8UydXflUq","ZJTXHW3VFH","uPX7GW7cTs","SWfouPOUYS","pAhR1LbRTH","AOgEetvdkD","WDVWJBGaQY","zbIYYh1zcH","HzZT8X6Pin",
+"jzUqRiB08l","ZhwG1lCMxy","dhSuHVerEA","okgRiDQimp","qaofNTwano","5Nammatef2","GXdoHRpBQm","3weIF9GXkX","cmXIX5IhmG","mz8gxBGaQY",
+"RmDcrxXTI4","JRJQBXyPZN","0Wr5y5iGN5","Dz1R33otm6","DG4sTCIShG","pFrrlazIWp","FLspho8Uyd","tvdkDTXQ0Z","SbRYyk85Ae","t59lRlweGy",
+"0ao3lyluBx","Yh1hFSbRYy","8cVD3VBjhz","vOqCELewvM","K4GS8W3VFH","FPfSERkQke","580YD7Ow5C","5iGN5ksJby","SjskQ7ku1p","M6qcGHlUbF",
+"iqv4ksqVrf","2DREs4dEz6","aDGtSOUYuF","580YDFPfSE","S77LH55rfB","euZA5l83Ud","Nxx9VuPX7G","IBe8kuN6r3","9eoRcgIYvE","kZANmNo0Qb",
+"U3yw5wDajX","ksJbyAgJHQ","UmaEvTwano","TCgPp24ARF","m4bxUAIYUu","0h1b1ECMvU","StlDJMmsIo","dpe1vhe9IA","zFgtBVLTy6","MojnPHRxd8",
+"yToGW8TxD7","h1zcHFhtgl","KZamHlweGy","Cfgr3s4786","QnJ1S5IhmG","nnP8ohi5X7","kZANm6q6L9","ru4UGfaHir","uN6r3AmdQd","07n1cIjTwP",
+"taOXKGSQwj","NAFuwLbRTH","5iGN5hUTw7","lCMxy45cIH","mX2GEokgRi","FcWrWGv3Fq","lm0pDvOqCE","okgRiWPmlx","pmeCdEoToP","2NslmAkKTk",
+"ulk411j5L8","taOXKzY1GY","v8yFNFLsph","5ZaEzZUnqt","3weIFru4UG","SWfouzQt6Q","vkCHHtvdkD","fLNg8BGaQY","iqv4kcShY2","618Di4dEz6",
+"lCMxyK20wK","14FLRs93Ml","fFDrJvOqCE","5iGN5vLsmS","9y4lwO3iyQ","KZamH55rfB","KASQ8s7Mxk","fqypys7Mxk","zz4ZUtAOsr","zmLYDCxVEf",
+"OHaBzQClRL","S77LHB3qem","cL0aEqaofN","hUTw7hYBCK","Cfgr3AXpwE","lpF6WChuy3","L7cGcbrhlQ","RpBQmfcJOy","SmGzvSjskQ","D6rByThjNn",
+"GXdoHUmaEv","M3zXLuPX7G","s93Mlm4bxU","YjB9t8xEKz","s93Mliqv4k","Chuy3faHir","NOHszjiVBP","vOqCEfqypy","4dEz6d7vjM","okgRiqaofN",
+"Cp3mZ7fKYU","7Ow5Cd7vjM","h1zcHogLgc","h1zcH9XyT9","Chuy37Ow5C","2Yz7EpvgjS","tvdkDOUqFM","tuDySjfREu","n8pJ9RpBQm","lCMxyQChxs",
+"FGzgpECMvU","9rlg9iqv4k","ix74rWMiS3","gtCA5QClRL","QbxXct98iW","blLA9LbRTH","ZuDtDLbRTH","4W0TlBCxeC","jtn0Xhe9IA","RzaZA3otm6",
+"ni2v1MaJQs","gjUTuQssNC","3weIFprNT6","9XyT9s93Ml","2ZHdkpvgjS","wiHrZQClRL","AOgEe8cVD3","hUTw7cL0aE","uupzk5Namm","e6e4zcL0aE",
+"Pb1paYf2Ec","I7p2aJ2mQi","Ta8f6QChxs","Dz1R3lViBv","gjUTun8pJ9","FPfSEguMb8","BbwgA9iGoT","45cIH0BmCy","GXdoH5VZjS","Cfgr3pmeCd",
+"x3LDeGWqqX","xXTI4Yw2oU","TCgPpYf2Ec","yEfy9U3yw5","FVMxonFqik","SWfouzmLYD","VBjhziqv4k","aez9yQssNC","GrDg7DG4sT","ni2v1AIYUu",
+"BbwgA14FLR","Yw2oUpWiOs","07n1c0Wr5y","FLsphZv7z0","v8yFNQClRL","tlILtsuY4x","StlDJM6qcG","EdBKc8FmFH","G1RhSRmDcr","EOE1o8cVD3",
+"NAFuwCK5W7","ECMvU2Nslm","PYBf4hYBCK","D6rBynnP8o","CxVEfFVMxo","s93Ml1v5hH","FnPFBFPfSE","FxX9qZUnqt","cShY20h1b1","XflUqlCMxy",
+"0PktIRzaZA","Mm8sipFrrl","kB5nPuLtKs","M6qcGAgJHQ","Z4I1vZ4I1v","e6e4z9rlg9","zqH0WQnJ1S","X6PinTa8f6","24ARFFFDui","uPX7Gru4UG",
+"FcWrWdQ586","AkKTkP6bcg","lH1ktru4UG","29QAzZJTXH","he9IAv1Hln","M3zXLfLNg8","8U2nUfLNg8","suY4xlXFOB","JkzUnix74r","v8yFNQnJ1S",
+"tvdkDlsQGo","e6e4zix74r","h1zcHAgJHQ","RkQkerhl0J","jtn0X1v5hH","Q6hMCM3zXL","CNHmvHRxd8","VNCPdtaOXK","SbRYyQssNC","VNCPd7fKYU",
+"24ARFuLtKs","9y4lwpWiOs","v2eC3dQ586","YOfrYZhwG1","MK07YNcICA","0KyfsAOgEe","W3VFH8xEKz","S77LHNOHsz","zQt6Qv1Hln","tvdkDuPX7G",
+"RzaZAVIlwP","5VZjSUlU3M","XyPZNzHF1q","dhSuHSbRYy","gjUTuKASQ8","Ul4a1OxWIH","RsQUqmz8gx","0ao3loVQp6","cL0aEDz1R3","DcpWBxXTI4",
+"Uvlv4B3qem","Oz8yZ29QAz","ix74rn8pJ9","BFkb8Y1mC0","sx5GlqaofN","jiVBPjeskS","fLNg8d7vjM","VBjhzCqqaD","aez9ysuY4x","EdBKc5Mg9r",
+"e6e4zfFDrJ","MezSWPb1pa","he9IAG1RhS","RACujStlDJ","nnP8oO3iyQ","fFDrJ7fKYU","WDVWJmX2GE","NcICAIn3NS","DQimp3weIF","bZLvSIn3NS",
+"1LB1LHP433","bZLvSJRJQB","6q6L98TxD7","8RCUAqaofN","uoStwn1pmO","uTacx0Kyfs","7fsYMDG4sT","vLsmSpFrrl","iB08lWreyP","2ZHdkjtn0X",
+"gtCA5ThjNn","Oz8yZ9y4lw","ru4UGEdBKc","qaofNcL0aE","2hEEUDQimp","8FmFHb29RJ","yofH329QAz","MojnPpmeCd","CK5W7FFDui","WMiS3MmKGJ",
+"Ta8f6NhXdu","EdBKcTa8f6","5nmWvgtCA5","55rfBwDajX","sx5Gls4786","pAhR1OUYuF","No0QbF6PT2","5Mg9rblLA9","pAhR1GWqqX","ru4UGSs0Zu",
+"8TxD7guMb8","Mm8si64s8N","HP433s4786","ECMvUiwzGk","Gv3FqBpYhV","vkCHHBGaQY","1j5L8iwzGk","tl72WaFFss","yToGWAOgEe","IKxdLv8yFN",
+"jSjS3nlaBy","In3NSGv3Fq","4QMc9uAWyp","NAFuwNhXdu","okgRie6e4z","KZamHfLNg8","LbRTH3otm6","mX2GETXQ0Z","4dEz6QChxs","RACujxReec",
+"CdyBVUlU3M","VLTy648cHL","hE1Qll83Ud","tlILtTa8f6","VjCZqdjsrv","ReKEW0PktI","VBjhz4W0Tl","6q6L9FnPFB","cmXIXCNHmv","Dz1R38TxD7",
+"xXTI4aDGtS","5IhmG2DREs","dQ586wiHrZ","mX2GEC2Irc","Y1mC048cHL","QChxs9iGoT","ulk41soy9t","QChxsUlU3M","0h1b155rfB","M3zXLuZPqg",
+"IBe8ktvdkD","Nxx9VBGaQY","SmGzvlpF6W","UmaEvHRxd8","14FLRjtn0X","JRJQBUmaEv","Oz8yZuPX7G","kB5nPX6Pin","9y4lw9eoRc","0YAGHGXdoH",
+"l83UdjiVBP","hYBCK9y4lw","NhXduWmadA","Qworu1LB1L","blLA9NOHsz","U3yw57X3uy","lkMUAe6e4z","mX2GEDz1R3","WreyPgf8rI","VerEA64s8N",
+"lj07Qfqypy","8xEKzvLsmS","Yh1hFeuZA5","O3iyQpv0i7","yofH3dQ586","ogLgcB3qem","D6rByRzaZA","uN6r3NAFuw","Yw2oUksJby","uQIczJIqXi",
+"ru4UGtl72W","i3pyddmoS7","hYBCKFGzgp","Chuy307n1c","CdyBVEOE1o","zY1GYEOE1o","qQxHPWDVWJ","6AFT0WPmlx","F6PT2MaJQs","618DifaHir",
+"FjHXRuLtKs","JRJQBF6PT2","mz8gxTCgPp","FjHXRCp3mZ","VLTy6NhXdu","RkQkeiB08l","5iGN5gjUTu","9rlg9POUYS","Q6hMClm0pD","6q6L98RCUA",
+"l83UdiwzGk","BGaQYfFDrJ","7fsYMSmGzv","uvf7ATa8f6","4QMc9aL6AJ","CIShGEoToP","TCgPpJ2mQi","FwEJzFGzgp","QWxoTdmoS7","2Yz7ExXTI4",
+"n1pmO55rfB","dhSuHi3pyd","zz4ZUAIYUu","FnPFB07n1c","ydG8UJXljW","qaofNRzaZA","ThjNnIn3NS","d85a9h1zcH","tjQxsb29RJ","pAhR10PktI",
+"ZzJHWRmDcr","sx5GllweGy","xciqpxXTI4","4dEz6mz8gx","blLA9VLTy6","fmIK12TRI7","azIWpOUYuF","tjQxs9y4lw","GrDg78xEKz","fFDrJcmXIX",
+"gdQsScL0aE","yEfy9FVMxo","suY4xy94nw","qUJMdlkMUA","RkQkeHfyNQ","pvgjSNAFuw","Yf2EcWDVWJ","ksJbyZhwG1","lsQGorhl0J","LewvMRACuj",
+"lXFOBOz8yZ","t59lRnnP8o","RsQUqL7cGc","FPfSENAFuw","fcJOyP6bcg","nFqikNcICA","zbIYYy94nw","hUTw7GWqqX","Mkgy8MaJQs","kZANmDLhzM",
+"gIYvEzHF1q","ru4UG9rlg9","0h1b1BGaQY","HlUbF9rlg9","uLtKsBGaQY","WmadAMezSW","zz4ZUe6e4z","618DizbIYY","HlUbFlkMUA","d7vjMk85Ae",
+"v2eC3M3zXL","2Yz7EpiJSk","jtn0XxReec","6AFT0IKxdL","8U2nUuupzk","7fsYMlj07Q","POUYSbrhlQ","lViBvwDajX","dhSuHIKxdL","StlDJIjTwP",
+"Fhtgl07n1c","blLA9Y1mC0","tl72WgtCA5","0h1b1jfREu","yluBx14FLR","n8pJ9oGu6x","Gv3FqYw2oU","rhl0JbZLvS","5ZaEzru4UG","SjskQQnJ1S",
+"gdQsStl72W","e6e4zpWiOs","dpe1vStlDJ","C2IrcbZLvS","bgJAz6AFT0","GSQwjeuZA5","guMb8DcpWB","aL6AJ7X3uy","BbwgAlkMUA","2hEEURxrsm",
+"2NslmHlUbF","taOXKwDajX","KsjRKoQ87r","UmaEvtjQxs","zFgtBHP433","4W0Tluvf7A","5IhmGhi5X7","NAFuw4QMc9","8U2nURBhp0","Vprf20PktI",
+"CqqaD2TRI7","cQOnvDcpWB","NAFuwFxX9q","yofH3QssNC","Zv7z0s7Mxk","QWxoTcShY2","prNT6uoStw","64s8N9rlg9","IKxdLOz8yZ","iKqhruupzk",
+"AXpwEpvgjS","zz4ZUvOqCE","QssNCiB08l","FwEJzQWxoT","gIYvEG1RhS","M3zXLFjHXR","RmDcrs7Mxk","MmsIo48cHL","ydG8UoVQp6","lXFOB8RCUA",
+"ciuWz5Drn0","2ZHdkjiVBP","J2mQifcJOy","BbwgA5VZjS","CIShGRxrsm","FcWrWChuy3","Dz1R3618Di","3weIFfFDrJ","UlU3Mi7WMQ","zY1GYC2Irc",
+"mz8gxEoToP","9XyT9GWqqX","BpYhVRxrsm","FNYIMulk41","uAWyppT8wu","IjTwPRACuj","DLhzMgIYvE","5ZaEz618Di","QClRL2Yz7E","VBjhzZhwG1",
+"VNCPdDcpWB","cmXIXyToGW","16lHcQbxXc","uJScX5IhmG","AIYUu9y4lw","AXpwEZzJHW","J2mQiuoStw","oQ87rMmKGJ","NhXduZuDtD","9XyT9zqH0W",
+"YOfrYcL0aE","5Drn0Yw2oU","C2Irc3weIF","cmXIXAIYUu","dmoS7fLNg8","EOE1ooVQp6","yEfy9K20wK","KsjRKsqVrf","HfyNQMmsIo","JkzUnI7p2a",
+"jS1ajNhXdu","FGzgpbZLvS","F6PT2tlILt","5ZaEzlweGy","FnPFBfmIK1","uupzkazIWp","azIWpM3zXL","pv0i7uJScX","zQt6QQ6hMC","CIShGVIlwP",
+"lweGynFqik","Ul4a1QbxXc","WmadAzbIYY","tlILtPb1pa","tuDySblLA9","yEfy9he9IA","nFqik3otm6","lViBvyEfy9","K4GS87hyVv","v1Hln9eoRc",
+"2Yz7EDLhzM","IKxdLGrDg7","Nxx9Vulk41","VNCPdMojnP","tvdkDlj07Q","Q6LixZuDtD","JIqXisqVrf","zz4ZUuQIcz","W7cTsblLA9","7lUXZogLgc",
+"Mm8siaFFss","FFDuin1pmO","wiHrZQworu","MK07Y9XyT9","zFgtBQworu","xXTI4NOHsz","m4bxUMGlTF","sx5GlRsQUq","RmDcr24ARF","pv0i7aDGtS",
+"JJs5mMaJQs","zz4ZUuvf7A","nnP8oFLsph","24ARFYh1hF","580YDbZLvS","5VZjSReKEW","uZPqgxXTI4","5nmWve6e4z","GSQwjSWfou","jzUqRAmdQd",
+"AXpwEzmLYD","55rfBEdBKc","QssNC5ZaEz","okgRiK20wK","580YDfaHir","4W0TlY1mC0","VIlwPt59lR","k85AeG1RhS","7lUXZWaWsv","StlDJksJby",
+"lCMxyFLsph","4QMc9cmXIX","POUYSxReec","b29RJtuDyS","kB5nPo8Uyd","No0QbBpYhV","Pb1palj07Q","7lUXZnlaBy","ZzJHWcShY2","DG4sTHlUbF",
+"mz8gxn1pmO","fcwDai3pyd","AkKTk5Mg9r","FPfSE8TxD7","VLTy6hE1Ql","WreyP16lHc","suY4xF6PT2","RmDcrDG4sT","cL0aEJXljW","M6qcGQWxoT",
+"gdQsScShY2","RsQUqyToGW","i7WMQtAOsr","CqqaDHfyNQ","azIWpuvf7A","GXdoHhUTw7","MezSWpWiOs","uLtKsRpBQm","UlU3Muvf7A","GrDg7GWqqX",
+"QYxC0VjCZq","KsjRK580YD","3weIFpWiOs","NhXduOUYuF","ciuWzsuY4x","EdBKcD6rBy","8RCUAVerEA","0h1b1s93Ml","prNT6HlUbF","zmLYDFPfSE",
+"0Wr5ytAOsr","GXdoHsoy9t","zmLYDK20wK","IKxdLnnP8o","0ao3lGSQwj","4QMc9J2mQi","oGu6xQ6Lix","ECMvU14FLR","2DREsOHaBz","blLA9Dz1R3",
+"6AFT0Kr8ys","yEfy9S77LH","OxWIHEoToP","9iGoT9GXkX","RmDcrHRxd8","rhl0JQworu","W7cTstuDyS","dmoS7bgJAz","pvgjSAIYUu","iKqhrogLgc",
+"aFFss1j5L8","L7cGc8TxD7","t98iWVLTy6","lm0pDn8pJ9","8U2nUUvlv4","iB08l5iGN5","EoToPiB08l","gjUTuYf2Ec","G1RhSzqH0W","O3iyQk85Ae",
+"55rfBGv3Fq","LDk6f07n1c","jeskSJIqXi","14FLR3weIF","K4GS8X6Pin","14FLRyvOMI","Q6hMCMojnP","P6bcg9rlg9","jtn0XbgJAz","lViBv0YAGH",
+"IRh48YjB9t","tjQxsqaofN","Pb1paI7p2a","Yf2EcfFDrJ","3weIFQChxs","DG4sTMmsIo","Y1mC0sx5Gl","tuDySdmoS7","OHaBz8U2nU","5VZjS5VZjS",
+"ogLgcNo0Qb","bZLvSFcWrW","lViBvVNCPd","JRJQBuQIcz","zFgtBtvdkD","5IhmGNxx9V","soy9tBCxeC","Fhtglt98iW","KsjRKzY1GY","oVQp6dpe1v",
+"cmXIXHfyNQ","faHir5Drn0","OxWIH29QAz","aDGtSgf8rI","oQ87rhSSvQ","8xEKzHlUbF","a00b5lsQGo","uZPqgEOE1o","4dEz62hEEU","NAFuwi7WMQ",
+"FhtglCIShG","pv0i7VNCPd","lsQGofaHir","piJSkxciqp","MK07Yru4UG","In3NShi5X7","y94nwJRJQB","qQxHPOUqFM","QClRLhUTw7","yvOMIlsQGo",
+"tl72WFnPFB","BpYhV8U2nU","yluBxUlU3M","6q6L9jeskS","nlaByFGzgp","Ul4a10Wr5y","7X3uyazIWp","AkKTkBpYhV","AXpwEAIYUu","cQOnvUmaEv",
+"cShY2gdQsS","3otm6LewvM","EdBKcciuWz","FPfSE9XyT9","rz7UtQYxC0","M3zXLfcwDa","kZANmfcwDa","nlaBys93Ml","TXQ0ZuN6r3","CK5W7uPX7G",
+"Uvlv4he9IA","BFkb8zz4ZU","MK07YuoStw","zqH0WtlILt","FNYIM580YD","8TxD7BFkb8","fLNg8QnJ1S","yToGWK4GS8","2TRI7zbIYY","tvdkDt98iW",
+"Zv7z0jtn0X","cQOnvnFqik","1LB1Lt98iW","RkQkeUl4a1","d85a9F6PT2","zmLYD3otm6","3weIFni2v1","W3VFHi3pyd","1v5hHnlaBy","b29RJs4786",
+"FLsphlViBv","DLhzMksJby","ZzJHWlm0pD","Yw2oUNxx9V","YjB9t0h1b1","2DREs24ARF","bZLvSVNCPd","fLNg8NhXdu","IRh48FcWrW","Waim6lkMUA",
+"2ZHdktvdkD","2Yz7E9rlg9","SjskQtaOXK","QYxC0vLsmS","8hJdtrhl0J","IjTwPyvOMI","rKDLJs93Ml","XflUqMmKGJ","XyPZNsuY4x","48cHLksJby",
+"F6PT25Drn0","W7cTs29QAz","EOE1oFwEJz","FNYIMm4bxU","IBe8kCIShG","IBe8kFjHXR","zQt6QIjTwP","BbwgAMmsIo","VIlwP7lUXZ","vLsmS2TRI7",
+"580YDzmLYD","brhlQJIqXi","IBe8kksJby","bgJAzsx5Gl","C2IrcuLtKs","5ZaEzUlU3M","9GXkX2Yz7E","5drc6v8yFN","ydG8UW7cTs","tvdkD9eoRc",
+"Vprf2he9IA","QClRLmX2GE","0YAGHnFqik","GSQwj8hJdt","GSQwj2hEEU","cShY2BbwgA","oQ87rblLA9","16lHc7hyVv","JIqXipT8wu","KsjRKjSjS3",
+"8RCUAIjTwP","piJSktAOsr","AIYUulCMxy","0Wr5y8U2nU","zQt6QVjCZq","Waim65ZaEz","QChxsBpYhV","d85a9XflUq","8hJdtBpYhV","AmdQdpvgjS",
+"5IhmGJXljW","fLNg8VIlwP","dmoS72Nslm","FwEJzHP433","pAhR1pAhR1","yofH3vLsmS","KZamH8TxD7","uZPqgQworu","qQxHPTXQ0Z","qQxHPW3VFH",
+"8xEKztAOsr","Fhtglo8Uyd","8FmFHkB5nP","atef2VerEA","dhSuHWreyP","VjCZq0h1b1","OHaBzzHF1q","DG4sThUTw7","cShY2VBjhz","X6Pin5IhmG",
+"k85AecmXIX","vLsmSNxx9V","KZamHAXpwE","OUYuF9GXkX","NcICANAFuw","cShY2D6rBy","sqVrft98iW","DcpWBVerEA","dmoS7vkCHH","CIShG9y4lw",
+"IBe8kpiJSk","vkCHHGrDg7","sqVrf8xEKz","n1pmOrz7Ut","VerEAWDVWJ","0h1b1HP433","atef28cVD3","iB08lMaJQs","SmGzv7hyVv","TwanoOz8yZ",
+"euZA5M3zXL","5Mg9rjS1aj","pFrrlgdQsS","dpe1vRBhp0","o8Uyd8RCUA","8U2nUAmdQd","vOqCEQnJ1S","iwzGkZJTXH","ydG8UVLTy6","O3iyQGWqqX",
+"PYBf4rz7Ut","QssNCG1RhS","GWqqXatef2","GWqqX14FLR","Twano2TRI7","MmKGJFVMxo","GSQwjSs0Zu","Kr8yszY1GY","G1RhSJJs5m","xXTI4Zv7z0",
+"AOgEe9GXkX","YjB9tWPmlx","yofH3VjCZq","Vprf2IKxdL","07n1c0h1b1","uoStwX6Pin","P6bcgZUnqt","yEfy9Fhtgl","Yh1hFRACuj","8U2nUfFDrJ",
+"0h1b1uJScX","o8UydAIYUu","5Drn0jtn0X","yofH35drc6","AkKTkIn3NS","hi5X7oQ87r","aFFss9iGoT","WDVWJfcJOy","uJScXMGlTF","euZA55iGN5",
+"ogLgchYBCK","soy9t14FLR","RmDcr1v5hH","MmsIotlILt","0ao3lgdQsS","Zv7z0ECMvU","VerEAIBe8k","07n1cni2v1","RxrsmxXTI4","zbIYYprNT6",
+"ZJTXH0Kyfs","yEfy9Oz8yZ","W3VFHJXljW","brhlQ5IhmG","X6PinpFrrl","CNHmvrz7Ut","Oz8yZ1LB1L","azIWpFGzgp","FVMxoMmsIo","lsQGo6q6L9",
+"h1zcHaDGtS","lpF6WzHF1q","jSjS3ECMvU","618Dizz4ZU","RpBQmfFDrJ","zHF1qAgJHQ","M6qcGAIYUu","X6PinzY1GY","14FLRGv3Fq","VIlwP8hJdt",
+"RpBQmfmIK1","VLTy60MR5X","blLA9sx5Gl","rKDLJyofH3","v8yFNaL6AJ","uQIcz7Ow5C","pvgjShSSvQ","pvgjSDcpWB","F6PT2pFrrl","8U2nUfqypy",
+"POUYSPOUYS","Oz8yZ0MR5X","ix74rzbIYY","fLNg8GrDg7","guMb8B3qem","MaJQskB5nP","iB08ls7Mxk","DLhzM5Drn0","qaofNUvlv4","P6bcgWreyP",
+"3weIFRpBQm","uupzkAmdQd","9y4lw0h1b1","lweGy9y4lw","y94nwMK07Y","jfREuFFDui","hSSvQJIqXi","Q6hMCsqVrf","aFFss14FLR","aDGtSmz8gx",
+"ZhwG19rlg9","AgJHQZ4I1v","hSSvQgIYvE","SbRYyWDVWJ","StlDJ8RCUA","prNT66AFT0","uLtKsSmGzv","iKqhrMezSW","rKDLJiqv4k","mX2GE1j5L8",
+"45cIHHP433","KsjRKChuy3","lCMxyKr8ys","LDk6fxciqp","14FLRStlDJ","IjTwPjtn0X","SbRYy29QAz","L7cGc3otm6","G1RhSW3VFH","0YAGHsuY4x",
+"s93MlnlaBy","nFqiklCMxy","EOE1oDQimp","soy9tIn3NS","x3LDeZ4I1v","8FmFHblLA9","0h1b1nlaBy","vkCHHRBhp0","LbRTHP6bcg","xciqpThjNn",
+"MmKGJogLgc","FLsphn8pJ9","d85a9aez9y","xciqpfmIK1","guMb8XflUq","Y1mC0LDk6f","9eoRchSSvQ","QssNCDcpWB","IBe8kJXljW","d7vjMjiVBP",
+"MezSWFGzgp","Yh1hF48cHL","uLtKsuAWyp","lXFOBGXdoH","VIlwPfcwDa","HfyNQgf8rI","8cVD3ciuWz","5Drn0taOXK","DG4sTdhSuH","9GXkXcShY2",
+"MezSWNcICA","ThjNnQChxs","YOfrYpWiOs","5IhmGBCxeC","S2DfuPb1pa","KASQ8IKxdL","9y4lwIn3NS","5Drn0uQIcz","BFkb8nlaBy","uQIczRkQke",
+"Oz8yZoVQp6","hi5X75Drn0","3weIFjzUqR","pT8wuGXdoH","CIShG8xEKz","Nxx9VQnJ1S","jS1ajP6bcg","HfyNQF6PT2","Zv7z04W0Tl","YjB9tHlUbF",
+"RsQUqulk41","5VZjSYf2Ec","uupzkWDVWJ","yvOMI8xEKz","2ZHdks4786","zY1GY8FmFH","7lUXZ618Di","8U2nUrhl0J","pFrrli3pyd","Yh1hFB3qem",
+"0BmCydhSuH","a00b5Ss0Zu","J2mQiv2eC3","d7vjMWaWsv","djsrvtjQxs","9y4lwGv3Fq","jS1ajMK07Y","S77LHsqVrf","OUqFMYOfrY","3otm6iB08l",
+"Nxx9V45cIH","vLsmS8RCUA","55rfB8RCUA","BGaQYNhXdu","FNYIMJJs5m","7ku1plsQGo","NOHszVNCPd","LbRTH2TRI7","Yw2oUUmaEv","gdQsS0ao3l",
+"ogLgcAOgEe","FjHXRazIWp","uLtKsoVQp6","SjskQuQIcz","zQt6Qulk41","Fhtgl1v5hH","lViBvXyPZN","a00b5MezSW","KZamHo8Uyd","kB5nPuvf7A",
+"NhXduFFDui","7fsYMnlaBy","FjHXR8TxD7","580YD5Mg9r","HzZT8OUqFM","29QAzDcpWB","oQ87rtlILt","v8yFNpFrrl","Kr8ysDQimp","brhlQjeskS",
+"v2eC34dEz6","d85a94dEz6","AXpwEguMb8","okgRitaOXK","fFDrJReKEW","he9IAM3zXL","Uvlv4DcpWB","0BmCy3otm6","rhl0JZUnqt","5Mg9rru4UG",
+"bZLvSQ6Lix","uJScXRsQUq","Ss0ZugjUTu","C2IrcM3zXL","atef2QssNC","Kr8yscmXIX","S77LHnlaBy","lViBvEoToP","hSSvQvOqCE","BGaQY580YD",
+"okgRipvgjS","yvOMIZzJHW","580YD5nmWv","SmGzvd7vjM","16lHcSjskQ","ZuDtDBGaQY","hSSvQGXdoH","QYxC0uupzk","2TRI70PktI","jfREuzbIYY",
+"L7cGcBbwgA","cQOnvsqVrf","2Yz7EZhwG1","pAhR1Kr8ys","8cVD3cmXIX","I7p2aoGu6x","JKWYRdmoS7","5drc6No0Qb","DcpWBjSjS3","uN6r31j5L8",
+"GSQwjMmsIo","4W0TlcL0aE","8TxD7qaofN","K20wKChuy3","K4GS8tvdkD","IBe8kHRxd8","Ul4a16q6L9","RkQkeMmsIo","uN6r3azIWp","he9IACK5W7",
+"Q6hMCUl4a1","0BmCyhUTw7","5Drn00h1b1","O3iyQ29QAz","ZhwG1XyPZN","he9IAzmLYD","VIlwPUl4a1","zFgtBs93Ml","uoStwtvdkD","x3LDeJRJQB",
+"yToGWaez9y","TwanoFLsph","hUTw7bgJAz","WaWsv8RCUA","07n1czz4ZU","AIYUuZuDtD","ZJTXHOUYuF","F6PT2NcICA","lH1ktaez9y","QYxC0lweGy",
+"IKxdLhYBCK","h1zcHuvf7A","WaWsvPb1pa","FGzgpNAFuw","gIYvEv1Hln","iqv4kpvgjS","euZA5iB08l","x3LDeIBe8k","pmeCdTCgPp","yofH3GrDg7",
+"MezSWjSjS3","ix74rqaofN","RkQkedhSuH","K20wKNOHsz","KsjRKprNT6","1j5L8IjTwP","BFkb82Nslm","0h1b1WPmlx","fcJOyVLTy6","0h1b15Drn0",
+"FhtglRpBQm","VBjhzkZANm","FwEJz64s8N","5IhmGMm8si","64s8NRBhp0","taOXKdpe1v","1v5hHi3pyd","HRxd8h1zcH","ogLgc55rfB","s93Ml4W0Tl",
+"e6e4zMm8si","dmoS7euZA5","zFgtBogLgc","pvgjSnFqik","HzZT8hUTw7","dhSuHVprf2","cL0aE5Drn0","jeskS6q6L9","RACujDLhzM","tuDySYf2Ec",
+"d85a95Namm","ulk41v1Hln","I7p2azHF1q","4W0Tl2ZHdk","D6rByoVQp6","qQxHPhUTw7","FFDuiYw2oU","x3LDe0PktI","K4GS8t59lR","EOE1okB5nP",
+"5drc6i7WMQ","Ta8f6Q6Lix","mz8gxJkzUn","Gv3FqNo0Qb","BGaQY3weIF","5NammB3qem","lj07QgtCA5","h1zcHIBe8k","h1zcH24ARF","5Mg9rcL0aE",
+"X6Pinfqypy","Mm8siVBjhz","iB08loVQp6","0h1b11LB1L","HfyNQyToGW","oGu6xv8yFN","pmeCdzQt6Q","uJScX0h1b1","AIYUuRBhp0","AIYUuCdyBV",
+"ciuWzuvf7A","hYBCKsoy9t","D6rBy48cHL","MK07YoVQp6","oGu6x9eoRc","lj07QFNYIM","gjUTuK20wK","euZA5ECMvU","ni2v1oGu6x","2NslmqUJMd",
+"1v5hHcL0aE","suY4xokgRi","14FLRlweGy","jtn0XEdBKc","prNT6LbRTH","OUqFMVprf2","LewvMSjskQ","XyPZNFVMxo","In3NSUvlv4","W7cTsLDk6f",
+"nnP8oJXljW","7hyVvhe9IA","Uvlv4jzUqR","C2IrcHzZT8","64s8NaDGtS","OUqFMwiHrZ","Gv3Fq9iGoT","lXFOBIjTwP","brhlQuN6r3","WDVWJ6q6L9",
+"uPX7G6AFT0","FLsphvkCHH","hUTw7SmGzv","tlILtZv7z0","LewvMsx5Gl","0BmCyaL6AJ","uN6r3fFDrJ","9iGoTqUJMd","FFDuiFxX9q","taOXKU3yw5",
+"JRJQBPb1pa","Yf2Ec5drc6","RzaZAEoToP","djsrvzHF1q","k85AeprNT6","FwEJzYh1hF","UlU3MAXpwE","lm0pD3weIF","GWqqX5Namm","qUJMd5ZaEz",
+"EdBKcC2Irc","ZUnqtFFDui","StlDJHP433","uQIczaez9y","7X3uyQnJ1S","DcpWBJXljW","WreyP1LB1L","OHaBz9XyT9","HlUbFPYBf4","v8yFNMaJQs",
+"8xEKzDG4sT","jS1ajL7cGc","GrDg7dmoS7","8hJdta00b5","blLA9GrDg7","SjskQqaofN","0KyfslH1kt","uoStwK20wK","FjHXRe6e4z","BbwgAAgJHQ",
+"UlU3M07n1c","Gv3FqnlaBy","B3qemyToGW","GXdoHW3VFH","L7cGcZ4I1v","FcWrWFnPFB","6q6L9zY1GY","jfREujzUqR","I7p2aStlDJ","0PktIFcWrW",
+"WaWsvAmdQd","S77LHvLsmS","K20wKStlDJ","C2IrcFGzgp","SWfou6q6L9","W3VFHn8pJ9","NhXdu24ARF","9GXkX7X3uy","IjTwPjSjS3","QChxsd7vjM",
+"ogLgcbrhlQ","8hJdtbrhlQ","4W0TlydG8U","W7cTsX6Pin","QbxXcciuWz","yvOMIciuWz","azIWpciuWz","9rlg9QWxoT","POUYSa00b5","ZJTXHmX2GE",
+"vkCHHVIlwP","OUYuFDcpWB","kB5nPtjQxs","5IhmGeuZA5","9eoRcaez9y","rhl0JD6rBy","EOE1oprNT6","lj07Q5Namm","XyPZN618Di","UmaEvM3zXL",
+"k85AetjQxs","fmIK14W0Tl","d7vjMzbIYY","FcWrWtjQxs","gtCA5cShY2","7X3uy0ao3l","EoToPIn3NS","DG4sTKsjRK","GWqqX0ao3l","2ZHdkKASQ8",
+"WaWsvJRJQB","0PktIzQt6Q","EoToP0PktI","qaofNLDk6f","GXdoH14FLR","pmeCdOz8yZ","2DREsK20wK","vOqCEzbIYY","Yw2oUprNT6","zz4ZUCfgr3",
+"2NslmD6rBy","8U2nUksJby","ReKEW0Wr5y","uJScXvLsmS","FLsphd85a9","14FLR0BmCy","lXFOBIBe8k","zHF1q45cIH","L7cGcFLsph","0YAGHqUJMd",
+"In3NSt98iW","MojnPZhwG1","yluBxwDajX","uPX7GFPfSE","jiVBPJ2mQi","F6PT2UlU3M","zQt6QDLhzM","4dEz62Yz7E","DLhzMK4GS8","t59lRoGu6x",
+"WreyPLbRTH","K20wK5VZjS","8xEKzb29RJ","LbRTHDLhzM","jS1ajb29RJ","nlaBy24ARF","pWiOsl83Ud","MmsIouAWyp","VLTy6ydG8U","tAOsrni2v1",
+"8FmFHtvdkD","Qworuo8Uyd","5Drn0iKqhr","6q6L9gtCA5","lpF6WGrDg7","fcJOytaOXK","hYBCKSWfou","1LB1LWPmlx","GXdoHF6PT2","n8pJ9taOXK",
+"brhlQ0h1b1","QClRL16lHc","LDk6fG1RhS","bZLvSP6bcg","d85a9iKqhr","16lHcMojnP","gtCA5No0Qb","xciqpuoStw","VBjhza00b5","uupzkUmaEv",
+"Kr8ysK20wK","wDajXCfgr3","AgJHQjSjS3","7fKYU0Wr5y","v1HlnfFDrJ","atef27fsYM","1j5L8o8Uyd","lH1ktEOE1o","s7MxkmX2GE","sqVrffcJOy",
+"euZA5D6rBy","fcwDaYOfrY","GrDg7Twano","ZUnqtCK5W7","kB5nPKZamH","Q6LixsqVrf","VLTy6gf8rI","cL0aE3otm6","VerEApmeCd","Dz1R3uAWyp",
+"StlDJuTacx","TCgPpQClRL","lj07QhUTw7","lXFOB0YAGH","GrDg7S2Dfu","TXQ0ZpFrrl","ZUnqtKsjRK","rz7Utt98iW","e6e4zvkCHH","lkMUAJ2mQi",
+"dhSuHOHaBz","WDVWJVLTy6","SmGzve6e4z","2TRI7ZJTXH","O3iyQMkgy8","m4bxU8TxD7","prNT6Dz1R3","Cfgr3m4bxU","HRxd8MmsIo","9GXkXEOE1o",
+"5Mg9rNAFuw","uQIczOxWIH","nnP8oWaWsv","Q6hMCv8yFN","Chuy3WmadA","0KyfszqH0W","pmeCdXyPZN","sqVrfprNT6","VBjhzydG8U","QssNC8xEKz",
+"pFrrljtn0X","pAhR1OUqFM","S77LHXflUq","5iGN51v5hH","S2DfuQChxs","4W0TlDQimp","fmIK1Q6Lix","aez9yZuDtD","guMb8SmGzv","fcJOyMmsIo",
+"AOgEeFLsph","HzZT8MmsIo","Waim6blLA9","uLtKsSbRYy","Z4I1vKsjRK","uZPqgoQ87r","lH1ktfcwDa","bgJAzXyPZN","RzaZAuLtKs","2DREs1LB1L",
+"gdQsSZv7z0","UmaEvpT8wu","aL6AJDcpWB","45cIHzY1GY","EoToP9iGoT","mX2GEjSjS3","M6qcG6q6L9","pWiOsb29RJ","MGlTFTa8f6","sqVrf8RCUA",
+"xXTI45ZaEz","J2mQiSs0Zu","lCMxyI7p2a","sx5GlgtCA5","pv0i7EdBKc","SmGzvvLsmS","9iGoTRzaZA","45cIHpv0i7","zbIYYZ4I1v","XflUqZhwG1",
+"7X3uy8xEKz","piJSke6e4z","OxWIHokgRi","BbwgATXQ0Z","HfyNQjiVBP","HfyNQqQxHP","POUYSWreyP","okgRiJkzUn","x3LDeFPfSE","ciuWzMkgy8",
+"4QMc97fKYU","yofH3ThjNn","jSjS3sx5Gl","qQxHPblLA9","cmXIXjiVBP","uPX7Gl83Ud","8cVD3Waim6","D6rByFwEJz","P6bcgMojnP","s7MxkFjHXR",
+"gdQsS7fKYU","KASQ8yToGW","EOE1o9GXkX","kB5nPy94nw","MK07YsuY4x","JXljWAgJHQ","VjCZqQ6Lix","lm0pDMaJQs","IRh48LbRTH","cQOnv6q6L9",
+"yEfy91LB1L","bgJAzCK5W7","iB08lhUTw7","t98iWS2Dfu","Y1mC0GWqqX","ksJbynFqik","fFDrJbgJAz","cmXIXSbRYy","ECMvUWDVWJ","mz8gxVLTy6",
+"9rlg97lUXZ","soy9t9rlg9","24ARFru4UG","ReKEWlH1kt","zY1GYCK5W7","ZuDtDdmoS7","o8Uydulk41","ReKEWkB5nP","oGu6xNhXdu","Cfgr38cVD3",
+"LbRTHhUTw7","pT8wu580YD","lm0pDdmoS7","8TxD7zHF1q","v2eC3VNCPd","0h1b1lsQGo","QChxscmXIX","0h1b1BpYhV","zbIYY7hyVv","SmGzvhe9IA",
+"jS1ajPb1pa","Ta8f6HRxd8","0Kyfs7Ow5C","QworuzHF1q","ulk41dmoS7","5nmWvlkMUA","Cfgr3iKqhr","QnJ1S0Wr5y","y94nwSs0Zu","07n1cVprf2",
+"OUYuFNxx9V","iqv4kBpYhV","618Ditl72W","uvf7A0BmCy","5Drn05drc6","PYBf4M6qcG","JXljWs93Ml","J2mQizqH0W","CNHmvIKxdL","RsQUqrz7Ut",
+"nFqik29QAz","8cVD37fKYU","55rfBy94nw","5Drn0jfREu","xReecReKEW","n8pJ9ZzJHW","9rlg9JJs5m","MmKGJo8Uyd","Kr8ys16lHc","yToGWJkzUn",
+"AXpwEZuDtD","iwzGk0Wr5y","I7p2apiJSk","MojnPSbRYy","Ul4a1RzaZA","9rlg9RACuj","L7cGciqv4k","7X3uyzY1GY","EOE1ov2eC3","yofH3dmoS7",
+"zFgtBuJScX","BpYhVzQt6Q","jSjS3RpBQm","KsjRKD6rBy","Cfgr3RACuj","5iGN5MmKGJ","7fKYU0h1b1","EOE1oqaofN","2ZHdkM3zXL","SbRYyRxrsm",
+"fLNg8WPmlx","gjUTuzY1GY","vOqCEgtCA5","hUTw7jS1aj","K20wKJXljW","xXTI4zQt6Q","VLTy6e6e4z","y94nwvOqCE","xXTI4brhlQ","618DiDQimp",
+"IKxdLlkMUA","ZJTXHVprf2","ECMvUWPmlx","tlILtxciqp","jzUqRJJs5m","l83UdbZLvS","JXljWrKDLJ","DLhzMFnPFB","GXdoHNcICA","fcJOy9iGoT",
+"IBe8k3weIF","WaWsvQworu","QWxoTVNCPd","uZPqgCxVEf","VerEA5ZaEz","2hEEUNcICA","lViBvL7cGc","KZamHaDGtS","Chuy3SWfou","K4GS8lpF6W",
+"7X3uyhSSvQ","atef2azIWp","6q6L9W7cTs","sx5GlX6Pin","UlU3MrKDLJ","jS1ajW7cTs","PYBf4Nxx9V","pT8wuzQt6Q","8hJdt3weIF","yEfy9uAWyp",
+"VBjhzYw2oU","pv0i7No0Qb","x3LDes93Ml","fLNg8BFkb8","xciqpRsQUq","29QAzFVMxo","4dEz6W7cTs","ZzJHWlXFOB","XflUqn1pmO","gtCA5LewvM",
+"M3zXL5VZjS","iKqhrAOgEe","VBjhzKZamH","MojnPMkgy8","AmdQdiB08l","W3VFHtjQxs","cQOnvF6PT2","CqqaDCdyBV","8cVD3v8yFN","VjCZqYf2Ec",
+"oVQp6fcwDa","RmDcrksJby","JKWYRCK5W7","lXFOBatef2","pvgjSZUnqt","FnPFBKZamH","9rlg92TRI7","JIqXiPYBf4","JIqXiqaofN","JRJQBdhSuH",
+"i3pydtAOsr","he9IAMkgy8","3weIFLbRTH","aL6AJJJs5m","JKWYRpvgjS","tAOsrNhXdu","BpYhVuupzk","S77LHyluBx","xXTI4JJs5m","uN6r3uvf7A",
+"pv0i78TxD7","ZuDtDksJby","VerEAXflUq","14FLR5iGN5","bZLvS618Di","fcJOyQworu","Pb1paAmdQd","ni2v1SmGzv","Ul4a1580YD","ogLgc2Yz7E",
+"CqqaDt98iW","aL6AJl83Ud","pT8wulj07Q","HlUbFM3zXL","okgRiYf2Ec","pvgjSqaofN","Chuy3fmIK1","lkMUAIBe8k","45cIHZUnqt","5Mg9reuZA5",
+"gtCA5i3pyd","QYxC0yofH3","NcICA5ZaEz","xReec0MR5X","tuDySGWqqX","HlUbFSmGzv","jtn0XKASQ8","0BmCyMm8si","uvf7AMm8si","k85AeVIlwP",
+"RzaZAxReec","QClRL2DREs","FwEJzAmdQd","pT8wulsQGo","0BmCypmeCd","zFgtBI7p2a","PYBf41j5L8","5Mg9rOz8yZ","lCMxyUlU3M","6q6L9C2Irc",
+"d7vjMy94nw","bZLvSG1RhS","faHir8cVD3","lCMxyGXdoH","cL0aEWMiS3","Gv3FqTXQ0Z","7ku1p9eoRc","gIYvEd7vjM","2TRI7Q6hMC","uAWypF6PT2",
+"MmKGJQssNC","Ul4a1RsQUq","kZANmSbRYy","ZzJHWiB08l","9GXkXjfREu","YOfrY8hJdt","faHirHRxd8","QWxoTdpe1v","tl72WlCMxy","ZzJHWStlDJ",
+"iwzGkk85Ae","uZPqgblLA9","0MR5XjSjS3","55rfBCfgr3","7X3uytl72W","Waim6yvOMI","KZamH7fsYM","0ao3l9rlg9","IjTwPdmoS7","pmeCdJXljW",
+"k85AeP6bcg","uupzk14FLR","pvgjSt59lR","fcJOyciuWz","qQxHPzqH0W","jSjS3t98iW","DLhzMAIYUu","fLNg8jiVBP","i3pyduN6r3","iKqhruZPqg",
+"cmXIXDQimp","2NslmQbxXc","tjQxsRxrsm","h1zcHbrhlQ","lpF6WxReec","5nmWvyvOMI","uQIczRmDcr","5Mg9rQ6hMC","iB08lFhtgl","SjskQfqypy",
+"S77LHStlDJ","0BmCyWreyP","euZA5aDGtS","MGlTF8TxD7","3otm6AXpwE","y94nwxReec","HlUbFLewvM","pmeCdCfgr3","CxVEfY1mC0","atef2OUYuF",
+"FwEJzbZLvS","EoToPgIYvE","580YD48cHL","ulk417lUXZ","RACuj0Kyfs","7ku1plm0pD","o8Uyddpe1v","POUYSLDk6f","hUTw7uQIcz","FjHXRbgJAz",
+"WPmlxa00b5","KZamHMK07Y","lj07QGXdoH","BpYhVWaim6","OxWIHyvOMI","Uvlv4mX2GE","K4GS8Dz1R3","okgRiHfyNQ","mz8gxTwano","iwzGkjSjS3",
+"Z4I1vNo0Qb","guMb8HP433","pFrrlRsQUq","yEfy9jeskS","45cIHHfyNQ","AkKTkTXQ0Z","WreyP5Mg9r","lm0pDru4UG","KsjRKUl4a1","D6rByuupzk",
+"5ZaEz7hyVv","s93MlfcJOy","9y4lwJkzUn","Waim6EdBKc","v8yFNFFDui","K20wKlViBv","dhSuHAIYUu","pT8wuIn3NS","nFqikhe9IA","lpF6W0BmCy",
+"Yh1hFhSSvQ","GWqqXyEfy9","lj07Qmz8gx","cShY2ciuWz","4QMc9taOXK","bgJAzAgJHQ","DG4sTMGlTF","5Mg9rQworu","vLsmSOUYuF","8FmFHfcJOy",
+"AmdQdsqVrf","8FmFHUmaEv","qUJMdRpBQm","KZamH9GXkX","atef2nlaBy","TwanoDG4sT","0h1b1QWxoT","24ARFydG8U","uTacxJJs5m","OxWIHCp3mZ",
+"qQxHP580YD","jeskSCp3mZ","1v5hHLewvM","AIYUufLNg8","0PktIuupzk","okgRiFxX9q","WreyPHlUbF","fLNg8piJSk","lm0pDzHF1q","AIYUudmoS7",
+"Pb1pan8pJ9","FPfSEmz8gx","pFrrloGu6x","ThjNnPb1pa","yvOMIjiVBP","QYxC0MojnP","pvgjSMojnP","lm0pDlm0pD","UmaEvIRh48","fqypyy94nw",
+"DQimpZ4I1v","nlaBy5iGN5","tAOsrn1pmO","k85AeCqqaD","pmeCduJScX","JXljW4QMc9","RkQkeQYxC0","sqVrfM3zXL","DG4sTSjskQ","CK5W7zHF1q",
+"0Wr5yGWqqX","CqqaDOUqFM","yofH3uupzk","NAFuwblLA9","DG4sTRsQUq","KZamHfaHir","OxWIHzHF1q","Gv3FqRzaZA","wDajX9iGoT","2hEEUIKxdL",
+"ZUnqtD6rBy","nnP8odhSuH","WDVWJ9rlg9","zqH0WZzJHW","kZANmB3qem","uvf7A1v5hH","9XyT964s8N","MmsIo24ARF","DQimpB3qem","WmadAlsQGo",
+"cQOnvgf8rI","jfREuWaWsv","zFgtB9XyT9","sqVrfWaWsv","SbRYyfLNg8","VNCPdd85a9","MmsIo6q6L9","GSQwjgIYvE","yluBxkZANm","wDajX45cIH",
+"wiHrZ5Mg9r","nnP8o0h1b1","sx5GlVerEA","MmKGJtl72W","uZPqg45cIH","jiVBPl83Ud","suY4xv8yFN","QssNCdhSuH","8FmFHUl4a1","brhlQkZANm",
+"UmaEvTXQ0Z","k85Ae24ARF","xciqpfFDrJ","tjQxsWaWsv","aFFss45cIH","pmeCd5nmWv","Cfgr3gtCA5","KsjRKJJs5m","dQ5860YAGH","sx5Gluupzk",
+"618Di8TxD7","55rfBv8yFN","zmLYD9y4lw","azIWpOz8yZ","TCgPpK20wK","FNYIMokgRi","KASQ8faHir","HfyNQ8RCUA","iB08lEdBKc","a00b5qaofN",
+"In3NSGXdoH","rhl0JdhSuH","jtn0XQnJ1S","nlaBy8RCUA","IjTwPYOfrY","kB5nPBGaQY","mX2GEaDGtS","YjB9th1zcH","a00b5UmaEv","5drc6POUYS",
+"5iGN5lXFOB","pWiOs5Mg9r","tAOsrBbwgA","0BmCyx3LDe","tvdkDDz1R3","64s8NDz1R3","JJs5mNcICA","uJScXLDk6f","h1zcHs4786","UlU3MMGlTF",
+"07n1cuvf7A","TCgPpQWxoT","Nxx9VzY1GY","JKWYRru4UG","XflUq9GXkX","uPX7GkZANm","Zv7z01v5hH","FPfSEOz8yZ","zmLYD6AFT0","45cIHYjB9t",
+"zHF1qBpYhV","wiHrZ8cVD3","NAFuwi3pyd","9y4lwnlaBy","JJs5muPX7G","48cHLFGzgp","d85a97hyVv","ulk41WMiS3","JRJQBTwano","C2IrcnnP8o",
+"RACujxciqp","K4GS88TxD7","blLA9FFDui","yvOMIY1mC0","07n1cAkKTk","DQimpjeskS","iKqhrYh1hF","XflUq7Ow5C","Dz1R3X6Pin","48cHLbrhlQ",
+"ECMvUru4UG","blLA9DG4sT","djsrv48cHL","EOE1oVLTy6","jfREugtCA5","zqH0W8FmFH","VLTy6MmsIo","fcJOyh1zcH","OUqFMSjskQ","lkMUAkB5nP",
+"s4786IKxdL","MezSWIRh48","Mm8sidhSuH","RpBQmFVMxo","uoStwGv3Fq","2TRI7mz8gx","pmeCdhe9IA","IBe8k2TRI7","No0Qbmz8gx","aDGtSHRxd8",
+"jSjS37lUXZ","aDGtSMezSW","8RCUARkQke","gjUTuLDk6f","ECMvUrz7Ut","HzZT8QbxXc","0ao3lKsjRK","BGaQYgIYvE","jeskSwDajX","PYBf4s7Mxk",
+"suY4xJRJQB","0MR5XUl4a1","Zv7z0AIYUu","ydG8Uix74r","U3yw5cL0aE","aez9yzmLYD","QssNCJ2mQi","vLsmSFNYIM","piJSkQ6Lix","RmDcrUmaEv",
+"sqVrfFGzgp","uJScXGv3Fq","7hyVvJKWYR","xXTI49rlg9","BCxeC24ARF","kZANmbZLvS","14FLRCK5W7","jS1ajRkQke","lXFOBbgJAz","Cp3mZ7Ow5C",
+"mz8gxYjB9t","4W0TllXFOB","CK5W7faHir","2ZHdkNAFuw","lXFOBlweGy","uJScXP6bcg","AkKTkpiJSk","9XyT92Yz7E","618Di6AFT0","O3iyQJRJQB",
+"CIShGtlILt","NcICAzz4ZU","B3qemHP433","AIYUu4W0Tl","Ss0ZurKDLJ","fFDrJ8RCUA","5IhmG2ZHdk","9XyT9WDVWJ","2TRI7nFqik","HzZT8MaJQs",
+"Yw2oUkB5nP","kB5nPWDVWJ","lpF6W4dEz6","KsjRK2ZHdk","yvOMIuZPqg","soy9tCdyBV","EOE1os7Mxk","8U2nUpv0i7","LewvMiwzGk","0ao3lNo0Qb",
+"9iGoTLDk6f","JKWYRVBjhz","5nmWvS77LH","oVQp69rlg9","s7MxkCp3mZ","iB08lJkzUn","y94nwCqqaD","QbxXc16lHc","ydG8UIKxdL","jiVBP55rfB",
+"9rlg9No0Qb","9XyT9HfyNQ","uZPqgaez9y","aez9yZhwG1","8hJdt4W0Tl","SbRYy5drc6","POUYSd85a9","lpF6W9GXkX","jS1aj29QAz","B3qempFrrl",
+"VIlwP45cIH","zbIYYFVMxo","ZJTXHG1RhS","AgJHQDz1R3","Pb1pamX2GE","ZzJHWVBjhz","s93MlX6Pin","gf8rId85a9","8FmFHCK5W7","fmIK1VIlwP",
+"gjUTueuZA5","U3yw5GSQwj","lpF6WK20wK","7lUXZTa8f6","b29RJ5VZjS","zmLYDdmoS7","6AFT0Cp3mZ","7lUXZ7ku1p","lkMUAjeskS","piJSkfcJOy",
+"taOXKfaHir","ReKEWEoToP","OxWIHJJs5m","fqypyAkKTk","2Yz7ENxx9V","gf8rI07n1c","CdyBVJKWYR","JKWYRI7p2a","ECMvUFjHXR","S2DfuUl4a1",
+"AXpwE6AFT0","gjUTutlILt","5iGN50Kyfs","rhl0JfLNg8","CqqaDS77LH","t59lR6AFT0","ydG8UGXdoH","prNT6Mm8si","OxWIH0YAGH","RpBQmFxX9q",
+"O3iyQRACuj","o8UydtlILt","MmKGJ29QAz","WDVWJksJby","6q6L9FcWrW","S2DfuL7cGc","8hJdt0Wr5y","YjB9ttaOXK","RxrsmyluBx","tAOsrvkCHH",
+"9rlg9tl72W","hE1QluTacx","fcwDaFPfSE","GSQwjhe9IA","OUYuFpmeCd","jfREuZhwG1","pWiOsL7cGc","W3VFHdQ586","ulk41Gv3Fq","gf8rIhe9IA",
+"ciuWzzz4ZU","jSjS3v2eC3","StlDJfqypy","pmeCdjtn0X","jiVBPAgJHQ","NAFuwBFkb8","S77LH2ZHdk","ix74rFjHXR","iwzGkUl4a1","VIlwPEdBKc",
+"Vprf2WreyP","0h1b1FFDui","BGaQYEoToP","wiHrZxReec","oGu6xwDajX","MGlTFksJby","tl72W618Di","4QMc9RsQUq","fcJOyfLNg8","QYxC0uAWyp",
+"faHir5IhmG","5iGN5618Di","s4786jfREu","hE1Ql9GXkX","8RCUACfgr3","uvf7AZUnqt","ydG8UxReec","Ul4a1tAOsr","K4GS8s93Ml","5iGN5ZzJHW",
+"OUqFMru4UG","SmGzvuoStw","hE1QlK20wK","v1HlnStlDJ","lXFOBM3zXL","JkzUnJ2mQi","StlDJFFDui","i7WMQLewvM","1v5hHFVMxo","he9IAd85a9",
+"qQxHPlm0pD","pmeCdOHaBz","hUTw7RmDcr","JRJQBKZamH","jeskSEoToP","14FLRe6e4z","F6PT22Yz7E","lpF6WAIYUu","uoStw8xEKz","taOXK16lHc",
+"JXljWCp3mZ","Chuy3tAOsr","zbIYY5iGN5","t98iWcmXIX","zz4ZUQClRL","5nmWv5IhmG","9y4lwh1zcH","9XyT9VNCPd","FcWrWuJScX","9GXkXfcwDa",
+"7Ow5CYw2oU","OHaBzF6PT2","uJScX2DREs","DG4sTCfgr3","F6PT2uN6r3","o8UydKZamH","Mkgy8MmKGJ","xXTI4faHir","KZamHyofH3","5Mg9rJ2mQi",
+"ksJbyzqH0W","uLtKsGSQwj","rhl0Juupzk","x3LDe7X3uy","Ss0ZuFnPFB","IjTwPtaOXK","HlUbFguMb8","wiHrZZhwG1","yvOMIfmIK1","ksJbyCp3mZ",
+"VNCPd9XyT9","jS1ajPYBf4","JRJQBCIShG","d7vjM0ao3l","DG4sT2hEEU","Rxrsm0PktI","RxrsmZv7z0","piJSky94nw","7lUXZQWxoT","hi5X7ZzJHW",
+"9XyT9i3pyd","DLhzMZ4I1v","S2Dfutl72W","Ss0ZublLA9","K4GS8HP433","pv0i7hUTw7","Oz8yZDcpWB","lH1kt9GXkX","gf8rIpv0i7","hUTw7lCMxy",
+"Chuy3ogLgc","piJSkYw2oU","hYBCKmz8gx","4QMc9y94nw","0MR5X4QMc9","iwzGkuupzk","pFrrle6e4z","KASQ8VLTy6","BFkb8uupzk","ZhwG1jtn0X",
+"Cp3mZgdQsS","oQ87rOUqFM","24ARFyofH3","n8pJ9K20wK","9eoRcuvf7A","BFkb86AFT0","F6PT2VjCZq","IRh48GSQwj","8hJdt2Yz7E","VerEAMmKGJ",
+"3weIFuLtKs","16lHcW3VFH","RpBQmuQIcz","fcwDaFVMxo","bgJAzWreyP","fqypyD6rBy","uN6r3X6Pin","NAFuwZJTXH","uPX7GMK07Y","n1pmO3otm6",
+"fqypya00b5","MaJQss7Mxk","hUTw79XyT9","WPmlxgf8rI","hUTw7MGlTF","uTacxMojnP","8xEKzFLsph","RxrsmMaJQs","StlDJbZLvS","1v5hHl83Ud",
+"ru4UGtvdkD","fLNg8Cp3mZ","9GXkXoGu6x","IjTwPhSSvQ","tl72WQClRL","blLA9uLtKs","ZhwG1tuDyS","Yh1hFxciqp","IBe8kiB08l","8FmFHjiVBP",
+"lsQGo7lUXZ","vkCHHzqH0W","dhSuH8TxD7","7ku1p2TRI7","GrDg7pWiOs","Dz1R3FjHXR","AgJHQLewvM","zQt6QvLsmS","zz4ZUn1pmO","LDk6flH1kt",
+"mz8gxSWfou","0MR5XbrhlQ","Cp3mZHzZT8","5ZaEzb29RJ","8TxD707n1c","GWqqX6q6L9","NhXduXyPZN","s478616lHc","v8yFNZv7z0","tvdkDgtCA5",
+"ZUnqtS2Dfu","NhXduCp3mZ","TwanoAgJHQ","TXQ0Z7hyVv","SmGzvzmLYD","taOXKtuDyS","IjTwPWaWsv","FnPFBKsjRK","JRJQBix74r","MmKGJzqH0W",
+"HRxd8hE1Ql","zQt6QAkKTk","OxWIH0ao3l","d7vjM7X3uy","zY1GYfaHir","s47865nmWv","55rfBjiVBP","faHirCfgr3","JIqXiYf2Ec","djsrvStlDJ",
+"S2DfuiwzGk","0MR5X9XyT9","h1zcHv8yFN","WDVWJVerEA","BCxeCuQIcz","IKxdLGWqqX","FnPFBdpe1v","Yh1hFHlUbF","uupzkQbxXc","t59lRRBhp0",
+"yToGWZUnqt","uPX7GlpF6W","gjUTuZv7z0","BbwgAEoToP","ogLgc0PktI","W7cTsSs0Zu","6AFT0QChxs","ReKEWv1Hln","nlaByLewvM","d7vjMwiHrZ",
+"8hJdtJIqXi","fmIK1zqH0W","IKxdLtuDyS","MaJQsnlaBy","618Di9eoRc","POUYSG1RhS","vLsmStlILt","HRxd8azIWp","XyPZNUl4a1","Oz8yZTCgPp",
+"vkCHHWPmlx","SjskQ7X3uy","gIYvE8cVD3","gf8rIx3LDe","WDVWJQClRL","xXTI4C2Irc","taOXKrz7Ut","EdBKclj07Q","iqv4kL7cGc","07n1cazIWp",
+"JXljWJXljW","2Yz7Em4bxU","K4GS8IKxdL","Ul4a1VerEA","M6qcG9y4lw","ZhwG1gIYvE","oGu6x2hEEU","0Wr5yZ4I1v","m4bxUpvgjS","8U2nUkB5nP",
+"kB5nPFcWrW","JkzUnFVMxo","jfREuRpBQm","s4786guMb8","QChxsEdBKc","rz7UtW7cTs","B3qemeuZA5","rKDLJqUJMd","5iGN5cmXIX","24ARF4W0Tl",
+"tl72Wt98iW","LbRTHM3zXL","dQ586ydG8U","RkQkesoy9t","Mm8siDLhzM","8FmFHJ2mQi","CNHmvQChxs","gf8rI8hJdt","aFFssnnP8o","dhSuHhE1Ql",
+"9XyT9lsQGo","P6bcgK4GS8","Yw2oUZv7z0","Chuy316lHc","Ta8f6yluBx","YOfrYaL6AJ","WmadAWMiS3","FwEJzwDajX","CNHmvAOgEe","FcWrWtl72W",
+"IjTwPU3yw5","RpBQmJ2mQi","2DREsYf2Ec","yluBxWMiS3","DG4sTDQimp","S77LHkB5nP","uQIcz8U2nU","FLsphDQimp","RACuj9rlg9","oQ87rlH1kt",
+"YjB9tPb1pa","QnJ1S0ao3l","ciuWzlViBv","Mm8siIn3NS","RACujReKEW","uupzkzz4ZU","jfREulsQGo","vLsmS2DREs","7ku1pJRJQB","hE1QlUvlv4",
+"DcpWBhSSvQ","D6rByFFDui","jeskS2DREs","JIqXis7Mxk","07n1cKZamH","0PktIFGzgp","RmDcr2hEEU","iqv4kyluBx","x3LDeHzZT8","7X3uyC2Irc",
+"l83Udhe9IA","tvdkDVBjhz","gf8rITa8f6","DLhzM0MR5X","ulk41LbRTH","Pb1paS77LH","jiVBPrhl0J","ix74rJ2mQi","L7cGcZuDtD","xciqpTa8f6",
+"ni2v11j5L8","QYxC0SjskQ","In3NSdpe1v","pWiOsdhSuH","ydG8UPYBf4","ix74rGXdoH","pvgjSF6PT2","QnJ1S8xEKz","e6e4zOHaBz","brhlQKZamH",
+"B3qemIn3NS","7ku1pRkQke","0PktINcICA","ReKEW5iGN5","RxrsmqQxHP","ni2v1Yh1hF","AXpwEDG4sT","vOqCEe6e4z","L7cGcjS1aj","Pb1paZuDtD",
+"KsjRKLewvM","ZuDtDoQ87r","EoToPLDk6f","djsrvGrDg7","a00b5wiHrZ","EOE1o2Nslm","wiHrZ7hyVv","IjTwPYw2oU","hSSvQZhwG1","0ao3lFnPFB",
+"guMb80PktI","IRh48ydG8U","qQxHPZhwG1","yvOMIeuZA5","t59lRxReec","JXljWECMvU","XyPZNl83Ud","IKxdL6q6L9","yvOMIatef2","pvgjSiwzGk",
+"iKqhrsqVrf","55rfBsoy9t","CdyBVMaJQs","Zv7z0B3qem","5Mg9rCxVEf","VNCPdni2v1","zqH0Wni2v1","ZhwG1oGu6x","pmeCdVIlwP","WmadAdmoS7",
+"Ss0ZuqQxHP","6AFT0uPX7G","2TRI78U2nU","Waim6HfyNQ","gf8rIvOqCE","kZANm8TxD7","CNHmvVerEA","jSjS3Yw2oU","suY4x0MR5X","iwzGkiwzGk",
+"J2mQia00b5","AmdQdtl72W","BCxeCcShY2","VBjhzfcwDa","7X3uyeuZA5","X6Pinrz7Ut","n1pmOfFDrJ","CdyBVfLNg8","ogLgcogLgc","pvgjSWreyP",
+"pFrrlyvOMI","CK5W7K20wK","s93Ml3otm6","FPfSE8xEKz","2ZHdkhE1Ql","Oz8yZB3qem","AOgEeAOgEe","y94nwD6rBy","OHaBzt59lR","FwEJzm4bxU",
+"07n1cQ6Lix","2DREs9XyT9","Yh1hF8TxD7","9y4lw580YD","suY4xn8pJ9","No0QbsuY4x","fcwDaUvlv4","RzaZA5IhmG","MmsIoiB08l","5Drn08U2nU",
+"Yh1hFbrhlQ","lXFOB55rfB","XyPZN7X3uy","ydG8UEoToP","IBe8kOxWIH","soy9tuQIcz","8FmFH0ao3l","pmeCdvLsmS","cmXIXqaofN","lweGyv8yFN",
+"0ao3lzHF1q","CdyBVPb1pa","UlU3MwDajX","ZuDtDZhwG1","qaofNUlU3M","GXdoHlH1kt","CdyBVeuZA5","L7cGcoVQp6","8xEKz8xEKz","VNCPdQnJ1S",
+"AOgEe2ZHdk","ciuWzh1zcH","s93MllpF6W","07n1cfFDrJ","MmsIoC2Irc","ciuWzUvlv4","iKqhrFPfSE","7ku1p8TxD7","MojnPoVQp6","TCgPpvLsmS",
+"rz7UtAXpwE","gf8rIK20wK","QWxoTYjB9t","TwanoxXTI4","kZANmmX2GE","618DiiKqhr","AkKTk5Drn0","PYBf42ZHdk","JJs5myluBx","0MR5XlsQGo",
+"IRh481v5hH","Vprf2FnPFB","5Mg9ryluBx","v8yFNMK07Y","lCMxyWaim6","580YDHzZT8","Ss0ZuZhwG1","n8pJ99GXkX","AmdQdulk41","JkzUnQbxXc",
+"fmIK1Ss0Zu","GWqqXnlaBy","azIWpulk41","djsrvbZLvS","n1pmO8TxD7","M3zXLnnP8o","DQimppvgjS","atef2rhl0J","tvdkD7Ow5C","CxVEffFDrJ",
+"Rxrsme6e4z","7ku1po8Uyd","uZPqgciuWz","BFkb8J2mQi","KASQ8lj07Q","uTacx5Mg9r","Chuy3DG4sT","BbwgAtjQxs","pFrrl618Di","0h1b1atef2",
+"2Nslm7lUXZ","G1RhShSSvQ","CK5W7iwzGk","xciqpk85Ae","S77LH0Wr5y","UlU3M48cHL","fcJOylkMUA","brhlQZv7z0","POUYSYf2Ec","b29RJxReec",
+"580YDru4UG","jeskSGXdoH","jSjS3VIlwP","IRh48fLNg8","yToGWIn3NS","AIYUuJ2mQi","uAWypOxWIH","tl72WwDajX","KsjRKFwEJz","MK07YnnP8o",
+"S2DfuCxVEf","QssNCciuWz","djsrvEdBKc","Mm8si5iGN5","JJs5mhi5X7","29QAzQ6hMC","EoToPSbRYy","v2eC3iB08l","Chuy3Cfgr3","iwzGklweGy",
+"NAFuwHP433","NhXduCNHmv","Q6hMCVerEA","7X3uyMK07Y","okgRihSSvQ","WPmlxKASQ8","L7cGc7ku1p","nlaByt59lR","HfyNQtjQxs","6AFT0U3yw5",
+"2Nslm7fsYM","BFkb8gf8rI","s93MlxXTI4","GWqqX8xEKz","iqv4k2hEEU","hi5X7BGaQY","K20wK64s8N","LbRTHG1RhS","djsrvpmeCd","LewvMHP433",
+"hE1QlOUqFM","CdyBV5drc6","qQxHPVprf2","L7cGc7lUXZ","OUqFM9GXkX","LbRTHRACuj","wDajXdQ586","gf8rINhXdu","Ss0Zu14FLR","JKWYRn8pJ9",
+"QChxsFFDui","SWfoufLNg8","SmGzvRkQke","RBhp0brhlQ","e6e4z4QMc9","QnJ1SP6bcg","5nmWvv1Hln","bZLvSRBhp0","OxWIHUvlv4","AXpwEoVQp6",
+"8hJdtJkzUn","FPfSEgjUTu","d7vjMAmdQd","UmaEvRkQke","nlaBy0Wr5y","2DREs9eoRc","5VZjSmz8gx","16lHc9y4lw","JRJQBCxVEf","ReKEW2Yz7E",
+"ulk414QMc9","VIlwPhUTw7","FPfSEm4bxU","wDajXprNT6","1LB1LlsQGo","1j5L82ZHdk","C2IrciB08l","GrDg7NhXdu","EdBKcFFDui","RBhp0K20wK",
+"aL6AJOz8yZ","HRxd8JRJQB","7Ow5CydG8U","iqv4kSWfou","VNCPdFcWrW","16lHc7lUXZ","7fsYM5Namm","8cVD3uN6r3","iwzGk8hJdt","FPfSEZv7z0",
+"DG4sT5Drn0","BCxeCsoy9t","sqVrfa00b5","QYxC0zmLYD","JIqXi4W0Tl","8xEKzB3qem","ix74r2hEEU","16lHcm4bxU","kB5nPfcwDa","IjTwPjfREu",
+"CqqaDzQt6Q","5Namm6q6L9","QnJ1SMkgy8","m4bxUY1mC0","EOE1oRzaZA","QbxXcpiJSk","uTacx64s8N","vkCHHUlU3M","iwzGkpT8wu","m4bxUksJby",
+"Nxx9VU3yw5","NcICAbZLvS","e6e4zyvOMI","CNHmvU3yw5","aDGtSFxX9q","GSQwjZzJHW","GXdoHkB5nP","QYxC0POUYS","yvOMI5Mg9r","rhl0JsqVrf",
+"K4GS8MezSW","0KyfsnnP8o","DG4sTzQt6Q","JRJQBlkMUA","m4bxUjiVBP","Mkgy8ZuDtD","Uvlv4Yf2Ec","7fKYUuoStw","yEfy9lj07Q","jtn0Xd85a9",
+"2DREsQChxs","JJs5mOUYuF","QnJ1SblLA9","CdyBVZhwG1","OUYuFPOUYS","5IhmGS77LH","rhl0JtjQxs","dmoS7dhSuH","aez9y9XyT9","WPmlxMojnP",
+"pAhR1d7vjM","5Mg9ryofH3","5Drn0BpYhV","WPmlxVIlwP","K20wKI7p2a","YOfrY1v5hH","iKqhrpv0i7","tlILtHRxd8","2TRI7vOqCE","5nmWv8xEKz",
+"ZUnqtn8pJ9","oQ87rXyPZN","prNT6Pb1pa","9XyT9zbIYY","Rxrsmlj07Q","NOHszCqqaD","29QAzSWfou","HRxd8prNT6","sx5GlECMvU","W7cTst98iW",
+"uvf7AdmoS7","5nmWvEoToP","RBhp0n1pmO","b29RJguMb8","5Drn0mX2GE","AmdQdk85Ae","iB08l9y4lw","F6PT2FLsph","EdBKcRkQke","2Yz7EYf2Ec",
+"lH1ktlViBv","iKqhrHlUbF","brhlQzHF1q","4QMc9DQimp","s93MlhUTw7","OUqFM1v5hH","FLsphRmDcr","MojnPprNT6","vLsmSfaHir","n8pJ9lsQGo",
+"Cp3mZCfgr3","5drc6YOfrY","tlILtkZANm","Cfgr3lsQGo","BCxeCcQOnv","yofH3vkCHH","qUJMdZ4I1v","fmIK10PktI","VBjhzlsQGo","W7cTs8RCUA",
+"GrDg7ix74r","KASQ8iKqhr","iqv4katef2","kB5nPNcICA","uTacx9iGoT","hi5X7LDk6f","0BmCyIRh48","X6PinFwEJz","MaJQs0Kyfs","Ta8f6VNCPd",
+"FFDuiZuDtD","jS1ajfaHir","bgJAzokgRi","rKDLJtlILt","Nxx9VguMb8","wiHrZd85a9","okgRi9GXkX","580YDQWxoT","DQimpZv7z0","2DREsHfyNQ",
+"AXpwEuJScX","ydG8UK20wK","G1RhSZJTXH","tjQxsAmdQd","taOXK1j5L8","wDajXxXTI4","e6e4zzz4ZU","Zv7z0GrDg7","2NslmcmXIX","5Drn0XflUq",
+"VIlwPmz8gx","DG4sTFhtgl","UlU3MBFkb8","hSSvQGWqqX","lsQGoYh1hF","07n1cBbwgA","VLTy6WmadA","uupzkO3iyQ","0ao3l14FLR","FLsphFVMxo",
+"6AFT0WDVWJ","ZUnqtuupzk","BFkb85Mg9r","nFqikK20wK","9iGoTMezSW","XyPZNiwzGk","faHirBFkb8","CIShGnFqik","Yh1hFMmKGJ","ZuDtDfcwDa",
+"BCxeCGXdoH","S77LHFcWrW","piJSka00b5","jS1ajyToGW","uJScXHP433","h1zcH8hJdt","v1HlnxReec","O3iyQNcICA","FxX9qhi5X7","Pb1pawDajX",
+"aez9ylm0pD","2Yz7ENcICA","pFrrlsx5Gl","0PktI9GXkX","Z4I1vPYBf4","kB5nPWreyP","2NslmCp3mZ","P6bcgs4786","lViBvqQxHP","7hyVvtl72W",
+"jS1ajGXdoH","YjB9t0Wr5y","atef2Gv3Fq","yEfy9xciqp","XyPZNgIYvE","2ZHdkMkgy8","zz4ZU3weIF","2ZHdkFnPFB","VNCPdqQxHP","atef2hSSvQ",
+"QssNC7Ow5C","Nxx9VK4GS8","k85AeKASQ8","0PktIuLtKs","7X3uy14FLR","BGaQYVNCPd","7fKYUiB08l","ogLgcCfgr3","pvgjSK20wK","ZUnqtsx5Gl",
+"pAhR1lm0pD","48cHLWDVWJ","n1pmOtaOXK","Waim68cVD3","lj07QFFDui","bZLvSa00b5","O3iyQtlILt","e6e4zrhl0J","64s8NNhXdu","O3iyQ8cVD3",
+"dmoS7AOgEe","tjQxsuoStw","o8UydJ2mQi","1v5hH2Nslm","y94nw2TRI7","FwEJzgf8rI","qaofNY1mC0","gdQsSCNHmv","2TRI7TXQ0Z","W7cTs9rlg9",
+"FhtglyToGW","pmeCdK20wK","VNCPdJXljW","BFkb8fqypy","ZhwG1618Di","0KyfsYf2Ec","8cVD3hi5X7","BpYhV3otm6","he9IARBhp0","5Mg9rJIqXi",
+"HRxd8JJs5m","uvf7AuPX7G","5IhmGQ6hMC","LDk6fMaJQs","xXTI4B3qem","FxX9qv2eC3","xXTI4Qworu","oQ87rnlaBy","lCMxyFhtgl","Zv7z0jS1aj",
+"cL0aEW7cTs","2TRI7Oz8yZ","Uvlv4Cp3mZ","uTacxG1RhS","aL6AJQnJ1S","uQIczCIShG","oGu6xbgJAz","2NslmEdBKc","KASQ8sqVrf","Twano618Di",
+"QworuVNCPd","FNYIMydG8U","EOE1o5Drn0","64s8NPYBf4","POUYScmXIX","atef2RpBQm","yEfy9h1zcH","hYBCK1j5L8","e6e4zYw2oU","FhtglSbRYy",
+"jS1ajwDajX","gjUTuHRxd8","NhXdu2ZHdk","AkKTkkZANm","24ARFWPmlx","aez9yrhl0J","JKWYRZ4I1v","1v5hHuN6r3","UmaEvFwEJz","KASQ85ZaEz",
+"L7cGctl72W","Z4I1vzbIYY","RpBQmaDGtS","QbxXcTXQ0Z","suY4xL7cGc","fqypyYw2oU","CIShGRkQke","vkCHHVLTy6","VIlwPqQxHP","uPX7G64s8N",
+"vOqCEaez9y","zz4ZUBFkb8","ThjNndjsrv","EoToPmz8gx","WreyPo8Uyd","FPfSENxx9V","QworuFFDui","pvgjS5drc6","yvOMIMkgy8","lkMUANAFuw",
+"DG4sTdmoS7","M6qcGECMvU","JXljWBFkb8","WMiS30Wr5y","Ta8f6pmeCd","kZANmo8Uyd","J2mQiChuy3","OUYuFfFDrJ","WaWsviKqhr","lpF6WYh1hF",
+"8hJdtECMvU","SjskQuvf7A","Yh1hFxXTI4","brhlQydG8U","7fsYMfFDrJ","vOqCEAIYUu","jeskSF6PT2","QChxsm4bxU","qQxHPGv3Fq","aDGtSWPmlx",
+"vLsmSgf8rI","4QMc99y4lw","QChxss7Mxk","DG4sTuupzk","zqH0WVBjhz","aL6AJKASQ8","zqH0W29QAz","jS1aj618Di","618DiRmDcr","zHF1q4QMc9",
+"bgJAzQYxC0","e6e4zfqypy","5VZjSS77LH","FPfSE3weIF","G1RhSIjTwP","K4GS8RkQke","8U2nUgdQsS","SbRYyTCgPp","7Ow5C2TRI7","lXFOBbrhlQ",
+"pAhR12TRI7","WmadAv2eC3","TwanoQWxoT","M3zXLyEfy9","7lUXZMaJQs","t59lRLewvM","nFqiksuY4x","7lUXZaFFss","pmeCdtlILt","Q6LixDQimp",
+"Z4I1vxXTI4","Rxrsmm4bxU","FVMxoe6e4z","FcWrWiqv4k","4W0TlzQt6Q","hE1QlLbRTH","n1pmOHzZT8","W7cTsPYBf4","TCgPpZuDtD","8TxD7tlILt",
+"uN6r3AOgEe","AOgEelXFOB","ogLgc24ARF","XyPZNZzJHW","1v5hHVLTy6","iqv4kzmLYD","lsQGoBGaQY","2Yz7EUl4a1","MezSWfmIK1","FGzgpiqv4k",
+"tl72W6q6L9","Chuy3IjTwP","jS1ajazIWp","Cp3mZlj07Q","KASQ8VNCPd","ZhwG1MmKGJ","BpYhVjtn0X","6AFT0Ta8f6","ZJTXHjiVBP","gdQsS0PktI",
+"D6rByVLTy6","tvdkD14FLR","5Mg9rx3LDe","aDGtSXyPZN","DQimp2ZHdk","m4bxUKsjRK","0Wr5yjeskS","7lUXZXyPZN","e6e4zs93Ml","7lUXZ8hJdt",
+"pWiOst59lR","k85Ae2ZHdk","DLhzMoGu6x","suY4xMK07Y","HlUbFiKqhr","JkzUnt59lR","uAWypd7vjM","1v5hHjeskS","t59lRW3VFH","5iGN5fcwDa",
+"580YD7fsYM","2DREsDQimp","8FmFHWaWsv","MezSWn8pJ9","KASQ8ni2v1","1v5hHKZamH","5drc6mz8gx","L7cGcfcwDa","55rfBJIqXi","TwanoqaofN",
+"0KyfsFxX9q","OUYuFD6rBy","7Ow5CksJby","VBjhzGv3Fq","TXQ0Zhe9IA","bZLvSWreyP","ZhwG1fcwDa","atef2e6e4z","7lUXZVBjhz","U3yw5lViBv",
+"Ss0ZuFVMxo","ZzJHWyluBx","guMb85ZaEz","BCxeCVjCZq","uvf7AzFgtB","5iGN5lm0pD","xXTI47Ow5C","AOgEexXTI4","piJSkAgJHQ","No0QbyvOMI",
+"ZhwG19y4lw","jSjS3dmoS7","v8yFNHfyNQ","8hJdtGWqqX","Uvlv4jtn0X","BbwgASjskQ","L7cGcZhwG1","jzUqRWmadA","VIlwPtvdkD","StlDJAkKTk",
+"WreyPru4UG","W3VFH5nmWv","PYBf4RBhp0","5iGN5iB08l","MGlTF9XyT9","SbRYypmeCd","Gv3FqJXljW","U3yw58xEKz","PYBf4Vprf2","S77LHpAhR1",
+"MK07YChuy3","2ZHdkuJScX","7X3uym4bxU","yEfy9FxX9q","ThjNniB08l","he9IApT8wu","kZANmfmIK1","BGaQYBbwgA","BGaQYRkQke","he9IAlXFOB",
+"IBe8kgf8rI","fcJOyLDk6f","VLTy65drc6","Yf2Ecv8yFN","F6PT25nmWv","h1zcHSWfou","CqqaDBGaQY","5IhmGxXTI4","hE1QlydG8U","FnPFBzqH0W",
+"MmKGJ5Namm","RmDcrYw2oU","uPX7GzqH0W","l83UdNxx9V","ECMvUpvgjS","HlUbFNAFuw","ThjNnDcpWB","bZLvSNOHsz","pFrrlQssNC","m4bxUlkMUA",
+"jzUqR07n1c","mX2GEMm8si","cmXIXlXFOB","jiVBPksJby","ECMvUv8yFN","jzUqRblLA9","KZamH0Kyfs","IjTwPQbxXc","lweGyJXljW","W7cTsjS1aj",
+"Vprf2rhl0J","h1zcH4QMc9","14FLRFjHXR","8cVD32TRI7","HzZT8StlDJ","9eoRck85Ae","618DiSjskQ","lXFOBJJs5m","gdQsSChuy3","WreyPHRxd8",
+"0h1b1n1pmO","jtn0XuJScX","FxX9qWaim6","uQIczGWqqX","HfyNQiKqhr","07n1cyvOMI","7fsYMcQOnv","LbRTHl83Ud","faHirUmaEv","MaJQscL0aE",
+"BCxeCYjB9t","QssNCNcICA","0Wr5y14FLR","ThjNnjzUqR","MezSWNxx9V","WDVWJcmXIX","aFFss5VZjS","a00b55Mg9r","ZJTXHVNCPd","lCMxyiKqhr",
+"0BmCyAgJHQ","0Wr5yIRh48","FPfSEDcpWB","5NammUvlv4","pv0i7TCgPp","16lHcGWqqX","lXFOBb29RJ","zqH0W5Namm","oVQp6o8Uyd","8xEKzMmsIo",
+"ogLgczbIYY","AOgEeKASQ8","C2IrcStlDJ","Yw2oUCfgr3","qUJMd5iGN5","yluBxyEfy9","Pb1parKDLJ","2ZHdkmz8gx","atef2QChxs","x3LDeYw2oU",
+"hSSvQThjNn","oGu6xPb1pa","yEfy9vkCHH","rhl0JsuY4x","pT8wucQOnv","okgRicL0aE","WaWsvuvf7A","6AFT0ZJTXH","TXQ0ZWDVWJ","IRh48uupzk",
+"ni2v1IjTwP","uAWypxReec","Chuy3uoStw","64s8NM3zXL","5Mg9rU3yw5","LDk6fzbIYY","Yf2EcM6qcG","2NslmUvlv4","x3LDeThjNn","F6PT2fqypy",
+"2hEEUCdyBV","618Di1j5L8","CxVEfWreyP","ZJTXHLewvM","zQt6QHzZT8","MK07Y29QAz","cShY2fLNg8","9eoRcMmKGJ","UmaEvi3pyd","OHaBzU3yw5",
+"WMiS3b29RJ","yofH3pmeCd","5NammMm8si","fmIK1atef2","ZJTXHIjTwP","GSQwjRACuj","FGzgpJIqXi","wDajXgtCA5","W3VFHvOqCE","FLsphChuy3",
+"d85a9wDajX","prNT6VNCPd","Ss0ZuNAFuw","gIYvEl83Ud","y94nw618Di","rz7UttAOsr","BFkb8Twano","brhlQxciqp","9rlg9rKDLJ","uoStw3weIF",
+"FjHXRrz7Ut","RpBQmhi5X7","CdyBVEdBKc","LbRTHjSjS3","JKWYRjSjS3","jS1ajQ6Lix","BGaQYOxWIH","7hyVv1v5hH","45cIHtjQxs","CdyBVDG4sT",
+"RzaZApWiOs","ThjNnTCgPp","ru4UG7fsYM","sqVrfnlaBy","FjHXRRkQke","QWxoTvkCHH","0h1b1xciqp","Pb1paix74r","dpe1vgdQsS","i7WMQCNHmv",
+"8RCUAFFDui","suY4xxciqp","hUTw7o8Uyd","5drc6G1RhS","Fhtgljtn0X","YOfrYY1mC0","i3pydGv3Fq","hE1Qlhe9IA","CqqaDQ6hMC","GSQwjCdyBV",
+"ZJTXHRmDcr","P6bcg2DREs","DLhzMThjNn","Ta8f6GrDg7","Cfgr3Dz1R3","zz4ZUyEfy9","uAWypni2v1","cShY27hyVv","lm0pDyvOMI","VerEAd7vjM",
+"GWqqXulk41","Chuy3TXQ0Z","uoStwO3iyQ","StlDJblLA9","pv0i7qQxHP","7ku1pUvlv4","dQ5869y4lw","WDVWJ2Nslm","zHF1qfaHir","qaofNRsQUq",
+"s93Mllj07Q","azIWphSSvQ","C2Irc0YAGH","9y4lwFGzgp","RkQkeRxrsm","JRJQBLDk6f","zQt6QJIqXi","4dEz6lpF6W","0ao3l5VZjS","b29RJaFFss",
+"lViBv8RCUA","FLsphYf2Ec","M3zXLBFkb8","MmKGJaFFss","WPmlx7ku1p","bgJAzVBjhz","VjCZqtaOXK","DQimpG1RhS","EdBKcBpYhV","TXQ0ZuJScX",
+"VBjhzy94nw","WPmlx14FLR","d7vjMkZANm","faHirX6Pin","atef2L7cGc","fLNg8FGzgp","HzZT8zY1GY","55rfBDQimp","M6qcGaFFss","l83UdS2Dfu",
+"7hyVvMGlTF","faHir0BmCy","5nmWvb29RJ","gIYvEU3yw5","dpe1vQbxXc","GrDg7xReec","W7cTsOUYuF","IRh48BpYhV","FNYIMCdyBV","x3LDeJJs5m",
+"tjQxsBFkb8","OxWIHRmDcr","blLA9uJScX","29QAzoVQp6","QnJ1So8Uyd","he9IAuN6r3","UmaEvtvdkD","PYBf4DcpWB","OxWIHpmeCd","45cIH1j5L8",
+"pWiOsjS1aj","8xEKzlpF6W","qaofNaDGtS","nlaByJkzUn","FFDuivkCHH","FxX9qix74r","2hEEUtjQxs","24ARF8U2nU","SbRYyhUTw7","Ul4a16AFT0",
+"lpF6WNOHsz","JKWYRfFDrJ","iqv4kBCxeC","hi5X7Mkgy8","xXTI45iGN5","S77LH9y4lw","ZJTXHGSQwj","zz4ZUOUqFM","Waim6rhl0J","64s8N7lUXZ",
+"UmaEv2ZHdk","zHF1qTa8f6","cQOnvlsQGo","MmsIoECMvU","lXFOB0Kyfs","45cIHSmGzv","S77LHzY1GY","ydG8Uuvf7A","0YAGHpvgjS","JJs5mlH1kt",
+"qaofNlH1kt","QworujSjS3","uvf7AMezSW","guMb8DLhzM","y94nw1LB1L","bgJAzPYBf4","7hyVv5IhmG","8RCUAP6bcg","ulk41WmadA","ksJbyvkCHH",
+"RACujlViBv","JRJQBNAFuw","d85a9Twano","7ku1pWmadA","Yf2EcKsjRK","bZLvShE1Ql","aDGtSjiVBP","AgJHQiKqhr","48cHLLDk6f","jfREuIjTwP",
+"UmaEvfFDrJ","9eoRcIn3NS","ThjNnCdyBV","Mm8siJ2mQi","AOgEe7ku1p","DcpWBzqH0W","bgJAzGXdoH","6q6L9EoToP","HRxd8gdQsS","zHF1qJJs5m",
+"JJs5m48cHL","3weIFOz8yZ","v2eC3UmaEv","ReKEWzQt6Q","QworuwiHrZ","DLhzMHfyNQ","AIYUuS77LH","SWfoujtn0X","RzaZA2Yz7E","7ku1p2ZHdk",
+"l83UdUl4a1","cShY22TRI7","W3VFHpFrrl","Rxrsms4786","55rfBFhtgl","8U2nUjzUqR","5Drn0VBjhz","atef2i7WMQ","uAWypUmaEv","ulk418TxD7",
+"lViBv5IhmG","XflUqDz1R3","48cHLsqVrf","FLsphZzJHW","JJs5m2DREs","xReecMezSW","LewvMeuZA5","uPX7GNxx9V","5ZaEzgdQsS","fFDrJQClRL",
+"cShY2L7cGc","SbRYyYf2Ec","JJs5mlXFOB","m4bxUciuWz","IRh489y4lw","taOXK5iGN5","dQ586ZJTXH","ReKEWlj07Q","rz7UtIKxdL","hi5X7he9IA",
+"lViBviqv4k","t59lRzHF1q","JJs5moQ87r","CqqaDD6rBy","4QMc9VLTy6","oGu6xEoToP","zY1GY5iGN5","HzZT81j5L8","G1RhSnlaBy","VBjhzOxWIH",
+"EdBKcZv7z0","FGzgpuZPqg","aFFssKASQ8","GrDg7ydG8U","ZUnqt7X3uy","fqypyEOE1o","X6PinB3qem","ReKEWydG8U","4QMc9zbIYY","O3iyQIRh48",
+"0PktIAkKTk","ZUnqtWaWsv","9iGoTSbRYy","0PktIyToGW","AmdQdxReec","Ss0Zu9rlg9","0Kyfsv2eC3","SbRYyIRh48","JIqXilweGy","B3qemNxx9V",
+"t59lRJRJQB","oVQp6soy9t","K20wKRsQUq","CNHmvuN6r3","a00b52Yz7E","IRh484dEz6","MGlTFbgJAz","FPfSE2hEEU","JRJQBuAWyp","o8UydU3yw5",
+"MmsIohi5X7","MaJQs9y4lw","zqH0WvOqCE","3otm6he9IA","TCgPpxReec","XflUqiKqhr","Yf2EcogLgc","uJScXh1zcH","Yh1hFQWxoT","lH1ktAIYUu",
+"l83UdzbIYY","Dz1R3SWfou","n8pJ9jiVBP","Z4I1vydG8U","UlU3Ml83Ud","ni2v16q6L9","DG4sTpiJSk","yvOMIRpBQm","7lUXZ5Mg9r","iwzGkGrDg7",
+"IRh48oVQp6","Mm8siSjskQ","64s8Nix74r","Oz8yZuQIcz","P6bcgQYxC0","HRxd848cHL","tjQxss93Ml","lsQGoFLsph","jfREuzHF1q","s93Ml7lUXZ",
+"F6PT2SjskQ","QYxC0sx5Gl","QssNCCxVEf","55rfBZzJHW","suY4xbgJAz","9eoRcHlUbF","DG4sTkB5nP","Ss0ZuDz1R3","ReKEWdmoS7","7fKYU580YD",
+"9XyT9uPX7G","45cIHcmXIX","2hEEUZJTXH","5Mg9r7lUXZ","dQ586FnPFB","hi5X7hSSvQ","8FmFH7lUXZ","n8pJ98cVD3","I7p2aI7p2a","5Mg9rsqVrf",
+"2NslmnlaBy","guMb8IRh48","WMiS3QnJ1S","TCgPpBCxeC","jfREuxciqp","Yf2Ec7lUXZ","i3pyd7fKYU","lpF6Whi5X7","MojnPulk41","9rlg9uupzk",
+"Zv7z0In3NS","Dz1R37fKYU","CxVEfuTacx","AkKTkaFFss","fqypyUlU3M","uvf7AYf2Ec","v1HlnlweGy","gtCA5AmdQd","FnPFBJJs5m","MGlTFJkzUn",
+"EOE1oMmsIo","Mkgy8jSjS3","wiHrZaFFss","BpYhVF6PT2","djsrvyvOMI","7Ow5Cgf8rI","IRh48ulk41","pFrrlEOE1o","HRxd8lsQGo","2NslmvLsmS",
+"Vprf2kZANm","jiVBPW7cTs","S77LHhE1Ql","8FmFHB3qem","taOXKjSjS3","0ao3lNOHsz","oQ87r0Kyfs","Vprf2sqVrf","QbxXcDQimp","XyPZN5VZjS",
+"dQ586aDGtS","HfyNQWMiS3","UmaEvRpBQm","pv0i7LbRTH","5iGN5VNCPd","YOfrYCNHmv","piJSkcShY2","ni2v1YOfrY","X6PinxXTI4","MaJQsRkQke",
+"zqH0WQYxC0","iqv4khSSvQ","euZA5JkzUn","6AFT014FLR","B3qem1LB1L","Dz1R3wiHrZ","aDGtS9rlg9","ZJTXHPb1pa","JJs5mU3yw5","AgJHQgdQsS",
+"zz4ZUlkMUA","iKqhrGrDg7","HRxd8CK5W7","HRxd8s93Ml","FPfSEQssNC","yToGWtl72W","RzaZAVNCPd","GrDg7VLTy6","faHirlCMxy","5Mg9ry94nw",
+"tAOsrCqqaD","PYBf4FNYIM","VNCPdnFqik","C2IrcfcJOy","1v5hHAmdQd","soy9tAkKTk","Nxx9VEoToP","0PktI29QAz","tjQxsmz8gx","bZLvSRxrsm",
+"Yw2oUNAFuw","n1pmOX6Pin","O3iyQv8yFN","lCMxyhi5X7","14FLR5nmWv","yToGW4W0Tl","euZA5wDajX","uZPqgFGzgp","XyPZNIRh48","Mm8siEOE1o",
+"lm0pDO3iyQ","POUYSD6rBy","DLhzMBbwgA","rz7UtIjTwP","ZhwG1mz8gx","uAWypn1pmO","0Wr5yn1pmO","SWfouSWfou","b29RJQnJ1S","jS1ajd85a9",
+"FnPFBFjHXR","iwzGkCp3mZ","xciqpoGu6x","BbwgAFwEJz","uoStwpAhR1","ulk41o8Uyd","BGaQYwDajX","pT8wuix74r","618Di9GXkX","sx5GlZ4I1v",
+"YOfrYNAFuw","t59lRP6bcg","t59lR48cHL","QWxoTyToGW","aL6AJlViBv","atef22Yz7E","AkKTkksJby","lm0pDxReec","dmoS74QMc9","zqH0W6q6L9",
+"SbRYyVLTy6","B3qemBFkb8","6AFT0lH1kt","soy9tJJs5m","GrDg7Pb1pa","iwzGkyToGW","7lUXZMezSW","dmoS7AIYUu","LbRTHY1mC0","FLsphiqv4k",
+"uN6r3fcwDa","2TRI7RmDcr","l83Udni2v1","lXFOBrKDLJ","v1HlnSWfou","jeskSru4UG","FPfSEtl72W","VIlwP8U2nU","JKWYRcShY2","d85a9IBe8k",
+"ciuWzDLhzM","CqqaDMK07Y","d7vjMzFgtB","6AFT0WmadA","vkCHHEoToP","Ss0ZuDLhzM","3otm6qaofN","CK5W7AOgEe","WaWsvhe9IA","Mm8siRkQke",
+"d85a90MR5X","G1RhSDG4sT","0h1b1FGzgp","F6PT2GrDg7","rz7UtF6PT2","jeskSHlUbF","WDVWJS77LH","WDVWJQ6hMC","qUJMdnFqik","zqH0WIjTwP",
+"ydG8UfcwDa","2NslmgdQsS","xciqpiKqhr","TwanolweGy","6q6L9Dz1R3","4W0Tla00b5","BGaQYksJby","kZANmyofH3","i3pyd24ARF","EOE1ojtn0X",
+"45cIHIjTwP","Waim6Oz8yZ","RACujRkQke","K20wKMojnP","oQ87r5ZaEz","0Wr5yvOqCE","RxrsmKr8ys","zbIYYThjNn","7Ow5CPOUYS","BbwgAFjHXR",
+"9y4lwgf8rI","y94nwt59lR","Kr8ysjeskS","ZhwG1MojnP","0h1b12TRI7","X6PinfLNg8","Mm8siulk41","v2eC30PktI","8xEKzru4UG","M6qcGaez9y",
+"QChxsHfyNQ","AOgEexciqp","FGzgpQ6Lix","tlILtYf2Ec","QChxs64s8N","EdBKcdmoS7","ksJbyJ2mQi","zmLYD5Drn0","IKxdLM3zXL","gtCA5mz8gx",
+"xReec7fKYU","iwzGkFnPFB","PYBf4hUTw7","y94nwaFFss","v1HlnEoToP","RsQUq3otm6","1v5hHvLsmS","D6rByb29RJ","YOfrYAkKTk","07n1cfqypy",
+"WDVWJStlDJ","ZhwG1Zv7z0","i3pydlViBv","OHaBzQnJ1S","WreyPrz7Ut","S2DfugdQsS","Ta8f6m4bxU","AXpwEfFDrJ","W7cTspWiOs","n8pJ92DREs",
+"OxWIHXflUq","qQxHP8xEKz","VNCPdFGzgp","n1pmO0MR5X","M6qcGZzJHW","Kr8ys7fsYM","wiHrZChuy3","Y1mC0GSQwj","AkKTktl72W","dQ586euZA5",
+"lj07Q1v5hH","pv0i7NhXdu","MojnPl83Ud","k85AeTa8f6","uAWypAOgEe","45cIHThjNn","TwanosqVrf","DcpWBD6rBy","ydG8UI7p2a","5VZjSsx5Gl",
+"ZzJHWiKqhr","atef2DQimp","WMiS3aDGtS","J2mQizY1GY","tjQxsF6PT2","uoStwIn3NS","580YDMK07Y","WaWsvyToGW","uLtKsZhwG1","CNHmvdQ586",
+"AkKTk5IhmG","16lHcF6PT2","yToGWfFDrJ","BFkb8uPX7G","29QAzxXTI4","SWfouNcICA","0h1b1hUTw7","sqVrfyEfy9","Pb1pa5ZaEz","5Drn0O3iyQ",
+"RkQkepT8wu","VLTy6ksJby","9GXkX8U2nU","K20wKNhXdu","aez9yYw2oU","Dz1R3jS1aj","lsQGolXFOB","FwEJzuN6r3","5NammuoStw","VBjhzkB5nP",
+"uN6r3CIShG","lH1ktzFgtB","2NslmiKqhr","hSSvQcmXIX","ni2v10Wr5y","RpBQmQYxC0","nFqikxXTI4","t59lRkZANm","Chuy3t98iW","Nxx9VCIShG",
+"aL6AJzFgtB","OUqFMoVQp6","OxWIHmX2GE","ZhwG129QAz","ZJTXHRpBQm","TXQ0Zd7vjM","gf8rI8RCUA","16lHcvOqCE","3otm6lweGy","0BmCyFjHXR",
+"UmaEvW7cTs","pWiOsWmadA","RxrsmzQt6Q","s7MxklsQGo","FVMxogtCA5","9XyT9uAWyp","pvgjSazIWp","TCgPpCIShG","pvgjSd7vjM","QClRL0ao3l",
+"rKDLJlH1kt","i7WMQ4W0Tl","bgJAzF6PT2","yluBxDcpWB","zQt6Q2Yz7E","VjCZqt59lR","zFgtB8FmFH","HP433QChxs","bZLvSGrDg7","uJScXdQ586",
+"jzUqRKZamH","FwEJzPOUYS","qQxHPyToGW","sqVrf8TxD7","MojnP9XyT9","RACujoQ87r","uoStw9XyT9","s47863otm6","5nmWvPb1pa","lweGyhe9IA",
+"55rfBpiJSk","YOfrYAXpwE","Y1mC0VerEA","hUTw7iKqhr","LbRTHTCgPp","7X3uyuJScX","DQimpDz1R3","lsQGohSSvQ","fcwDaGSQwj","WDVWJcL0aE",
+"KZamHRACuj","a00b5lH1kt","Vprf2tl72W","LDk6fSbRYy","hE1QldhSuH","t59lRhE1Ql","0ao3lazIWp","lH1ktblLA9","VjCZqwiHrZ","4W0Tl3otm6",
+"4W0TlVerEA","JIqXilj07Q","zqH0WCNHmv","KZamHZv7z0","5drc6P6bcg","aFFssuZPqg","hUTw7pWiOs","yToGWpvgjS","cQOnvJJs5m","7ku1pfaHir",
+"5Mg9r16lHc","3otm6S77LH","Mm8sibZLvS","tvdkDWDVWJ","TCgPpcShY2","Mkgy8uAWyp","W7cTsQ6Lix","tuDySK20wK","sx5GlCxVEf","v2eC3pAhR1",
+"d85a9JKWYR","5IhmGDcpWB","fcwDaTwano","Yh1hFnlaBy","8hJdtWmadA","Qworu618Di","uvf7ABGaQY","0h1b1lH1kt","TwanojfREu","lm0pDJRJQB",
+"OxWIHiqv4k","xciqpcmXIX","iqv4kFwEJz","x3LDev8yFN","tvdkDt59lR","0PktIKZamH","tjQxsNxx9V","5nmWvQ6hMC","D6rBytvdkD","IBe8kM3zXL",
+"o8UydBbwgA","F6PT2lpF6W","K4GS8jSjS3","5nmWvP6bcg","euZA5OUYuF","cL0aEC2Irc","QbxXcDLhzM","FwEJz07n1c","0MR5XLDk6f","qQxHPprNT6",
+"9iGoTNAFuw","VBjhzVBjhz","NOHszcmXIX","aDGtSbgJAz","GSQwjzQt6Q","SWfouNo0Qb","wDajXVprf2","OUqFMdQ586","faHirru4UG","uAWypRkQke",
+"zFgtBpAhR1","7lUXZ55rfB","8TxD7QbxXc","Dz1R3Fhtgl","x3LDed85a9","DLhzMFGzgp","55rfBdjsrv","7fKYUVNCPd","nFqikuQIcz","rz7UtnFqik",
+"h1zcHydG8U","yvOMIzbIYY","M6qcGXyPZN","uLtKsqUJMd","oQ87rlj07Q","hYBCKL7cGc","BCxeChe9IA","EoToPqaofN","i3pydFVMxo","WaWsvpvgjS",
+"POUYSuJScX","OxWIHprNT6","i3pydG1RhS","D6rByuTacx","tvdkDhSSvQ","FnPFBlH1kt","y94nwJKWYR","Ta8f655rfB","jtn0XZJTXH","IBe8ktaOXK",
+"prNT6NhXdu","iqv4kuTacx","o8UydpFrrl","P6bcgFPfSE","uoStwuvf7A","Mm8si3otm6","QnJ1SgjUTu","qaofN0PktI","hYBCKfcwDa","FFDuiYf2Ec",
+"64s8NChuy3","sqVrfsoy9t","gIYvEpmeCd","uPX7GbgJAz","POUYShYBCK","TCgPpLDk6f","HlUbFciuWz","IBe8kJJs5m","Uvlv4pT8wu","MojnPydG8U",
+"zQt6Q0BmCy","MmKGJkB5nP","OUqFM55rfB","8cVD3HRxd8","7Ow5CC2Irc","Yw2oUjeskS","aL6AJOxWIH","LDk6fqaofN","pmeCdCdyBV","QWxoTC2Irc",
+"ZJTXH3weIF","BbwgA5Namm","a00b5BGaQY","1v5hHQ6hMC","EOE1os93Ml","55rfBAOgEe","VNCPds7Mxk","9y4lwwiHrZ","kB5nPRkQke","Mm8siaez9y",
+"ZuDtDGSQwj","LewvMm4bxU","sqVrfuN6r3","GSQwjThjNn","fcwDaUmaEv","9GXkXlj07Q","yofH3pFrrl","yofH37lUXZ","Rxrsm7lUXZ","cQOnvlweGy",
+"okgRi16lHc","QworugjUTu","QChxsVLTy6","suY4xfcwDa","ogLgc2hEEU","3otm67lUXZ","zFgtBNAFuw","9XyT9KASQ8","gjUTucmXIX","YjB9tt59lR",
+"Yw2oUpv0i7","VNCPd8U2nU","AXpwEVBjhz","RpBQmyEfy9","Q6hMCS2Dfu","ZzJHWZuDtD","I7p2a7hyVv","gIYvEJIqXi","B3qemhSSvQ","ZuDtDK20wK",
+"MmsIoVjCZq","HzZT8xReec","he9IA0ao3l","K4GS8L7cGc","580YD29QAz","HfyNQpFrrl","QworuogLgc","BpYhV2hEEU","guMb8gIYvE","AkKTkpWiOs",
+"CK5W7FLsph","PYBf4qaofN","LewvMoQ87r","JkzUnpiJSk","MmKGJazIWp","fcJOySjskQ","v8yFNUlU3M","Ta8f6y94nw","9y4lwnFqik","jeskSy94nw",
+"EOE1oNo0Qb","qaofNKZamH","k85AeY1mC0","FVMxo9GXkX","CK5W7gtCA5","fcJOyHzZT8","8RCUAAgJHQ","dpe1v618Di","64s8NS2Dfu","M6qcGlj07Q",
+"C2IrcRzaZA","QbxXcKASQ8","RmDcrQssNC","BCxeCi7WMQ","HlUbFJIqXi","NhXduhe9IA","yluBxoVQp6","cmXIXZ4I1v","pFrrlcL0aE","I7p2axReec",
+"tlILtyofH3","qaofNvOqCE","cShY2JRJQB","lm0pDWaWsv","uupzkQworu","m4bxUD6rBy","wDajXYf2Ec","AmdQdKsjRK","FwEJz3weIF","prNT6EOE1o",
+"IKxdLd85a9","Ul4a1Yf2Ec","7fsYMmX2GE","W3VFHWPmlx","UlU3M0Kyfs","RACujVLTy6","8cVD3ogLgc","ru4UGAOgEe","Cp3mZi3pyd","FPfSEVBjhz",
+"iqv4ko8Uyd","HzZT89XyT9","AkKTk4QMc9","VNCPdfaHir","Nxx9VNOHsz","4dEz6tAOsr","RkQkezqH0W","pvgjSFnPFB","0BmCyMojnP","Vprf2HlUbF",
+"gIYvEguMb8","VerEAm4bxU","KZamHDLhzM","JkzUnZhwG1","wiHrZuPX7G","lXFOBkB5nP","XflUq16lHc","5ZaEz2ZHdk","vkCHH1v5hH","0YAGHQ6hMC",
+"ru4UGHfyNQ","BCxeCUmaEv","3weIFcmXIX","RxrsmuLtKs","brhlQBGaQY","rz7UtuTacx","1LB1LEdBKc","YOfrYCqqaD","ThjNnguMb8","lsQGoHRxd8",
+"n8pJ9uoStw","KsjRKWreyP","Gv3Fq6q6L9","rz7UtRACuj","mX2GEHlUbF","EOE1oXyPZN","hYBCKQChxs","DG4sTprNT6","rKDLJOHaBz","fcwDanlaBy",
+"iB08lpFrrl","cShY2vkCHH","bZLvShe9IA","VNCPdFLsph","K20wKqUJMd","lm0pDIn3NS","d7vjMs4786","LbRTHaFFss","jSjS3blLA9","i7WMQv1Hln",
+"48cHLJJs5m","yluBxd7vjM","lViBvi3pyd","s4786FNYIM","F6PT2C2Irc","AkKTkRmDcr","uAWypQssNC","WMiS3FGzgp","nFqikFnPFB","IBe8kGWqqX",
+"RzaZAkZANm","zbIYYVNCPd","iwzGkulk41","uN6r3ECMvU","WmadAUl4a1","uAWyppiJSk","MaJQsgjUTu","7X3uyNAFuw","8hJdtHlUbF","tl72W5VZjS",
+"RxrsmbgJAz","XflUqQChxs","D6rByIjTwP","lXFOB8hJdt","KZamHYw2oU","HP433uJScX","Cp3mZ1v5hH","U3yw5JKWYR","nnP8oRpBQm","ydG8UtaOXK",
+"2ZHdkK4GS8","xciqpzHF1q","OUYuFMmKGJ","B3qemGrDg7","zbIYYVerEA","LewvMFwEJz","uTacxCdyBV","ksJbyblLA9","iqv4kuN6r3","FVMxorKDLJ",
+"K4GS8NcICA","d85a955rfB","suY4xfcJOy","yluBxAmdQd","atef2pFrrl","ni2v1dpe1v","zz4ZUW7cTs","Ss0ZuMmsIo","0KyfsSbRYy","azIWpIn3NS",
+"oQ87rP6bcg","pvgjSJJs5m","DG4sT5ZaEz","xciqpulk41","ZzJHWThjNn","s93Ml2Nslm","s7MxkvkCHH","TXQ0ZGXdoH","AOgEezz4ZU","FcWrW2Yz7E",
+"ReKEWVIlwP","RsQUqQClRL","vLsmSs93Ml","dQ586Yh1hF","bgJAzqaofN","2ZHdkpAhR1","vkCHHuQIcz","lXFOBxXTI4","ksJbyEdBKc","Dz1R3DG4sT",
+"RBhp0gjUTu","ni2v1bZLvS","fcwDaFGzgp","MK07YyEfy9","RBhp0IRh48","uPX7GQnJ1S","vkCHHM6qcG","guMb829QAz","DQimpuLtKs","BFkb8QssNC",
+"lpF6WWPmlx","xciqpaez9y","kZANmvOqCE","lViBvuTacx","qUJMdQYxC0","MojnPJJs5m","SbRYy0Wr5y","9eoRczmLYD","MmKGJ4W0Tl","iwzGk5nmWv",
+"RACujx3LDe","D6rBysqVrf","uQIczkZANm","fcwDaRmDcr","tAOsrzbIYY","QWxoT3weIF","t98iWFFDui","TCgPpDQimp","3otm6ru4UG","v1Hln8hJdt",
+"pWiOsyEfy9","faHir9iGoT","5IhmGQbxXc","RkQke0PktI","X6PinNAFuw","8xEKzSmGzv","ogLgcTwano","QClRLYOfrY","M6qcGGXdoH","vLsmSQbxXc",
+"Q6hMCcL0aE","9y4lwZhwG1","TCgPpjzUqR","SmGzvKASQ8","BGaQYMmsIo","ksJbyVLTy6","4dEz6nlaBy","piJSkTXQ0Z","EoToPEdBKc","lH1ktsqVrf",
+"suY4xvOqCE","6q6L9OHaBz","uvf7AUvlv4","K4GS8CxVEf","Cp3mZJKWYR","BCxeCJ2mQi","zFgtBJIqXi","m4bxUCdyBV","pAhR1ru4UG","0BmCyI7p2a",
+"Nxx9VtaOXK","zz4ZUWmadA","IjTwPgdQsS","FwEJzuPX7G","WDVWJTa8f6","Oz8yZ0YAGH","oVQp6tAOsr","cmXIXiB08l","FFDuiS2Dfu","ECMvU8cVD3",
+"wDajXRACuj","FVMxoru4UG","pAhR1BpYhV","JKWYRNAFuw","vOqCElkMUA","lkMUAYf2Ec","ydG8UaFFss","oVQp6uJScX","y94nwmz8gx","Yw2oUdmoS7",
+"uN6r3JkzUn","tjQxsmX2GE","580YDpWiOs","0Wr5yPYBf4","6AFT07fsYM","QbxXcfqypy","jiVBPJJs5m","blLA9sqVrf","1LB1Ls4786","9XyT9prNT6",
+"atef2s4786","rhl0JpWiOs","RsQUq6AFT0","tAOsruoStw","POUYSm4bxU","IKxdLx3LDe","ZzJHWFjHXR","4W0TlwiHrZ","GXdoHxXTI4","5iGN5Waim6",
+"OUqFMydG8U","Twano7lUXZ","BpYhVblLA9","a00b59y4lw","EoToPK4GS8","bgJAzU3yw5","ECMvUprNT6","Nxx9VFjHXR","ulk413weIF","FcWrWuTacx",
+"0h1b1Yf2Ec","pmeCdeuZA5","Vprf27ku1p","JkzUnvOqCE","618DiTa8f6","48cHLni2v1","AIYUuVNCPd","8RCUAOUqFM","djsrvaDGtS","tjQxsFVMxo",
+"BpYhVvLsmS","L7cGck85Ae","m4bxUi7WMQ","Yh1hFSjskQ","oQ87rydG8U","5NammvkCHH","PYBf4GWqqX","JKWYRPYBf4","lXFOBpAhR1","cL0aE9XyT9",
+"zqH0W4QMc9","ZuDtDQClRL","DG4sTaez9y","RkQkeG1RhS","fcwDauZPqg","s93MlqaofN","VIlwPU3yw5","4W0Tl1j5L8","EoToPXflUq","s93MlFjHXR",
+"YjB9tJRJQB","pvgjShE1Ql","kB5nPJkzUn","AkKTk6AFT0","OxWIHaL6AJ","vLsmScmXIX","uAWypfLNg8","CK5W7jfREu","Yf2EcbrhlQ","BbwgAaL6AJ",
+"S77LHVNCPd","SWfoufaHir","fcwDa4dEz6","pFrrlgIYvE","fmIK1yEfy9","FcWrWX6Pin","hUTw74dEz6","gtCA5tjQxs","fcwDaksJby","euZA51v5hH",
+"nlaBytlILt","8U2nUdhSuH","BCxeCjS1aj","K4GS8Yf2Ec","tvdkDhUTw7","hYBCK0YAGH","QChxs4W0Tl","pmeCdni2v1","AgJHQrKDLJ","ZhwG1NcICA",
+"4W0Tl4QMc9","Dz1R3M3zXL","WmadAVprf2","n1pmOx3LDe","Chuy3zY1GY","jzUqRKr8ys","Ta8f6i7WMQ","64s8NKsjRK","HzZT84dEz6","BFkb8MezSW",
+"ru4UGtlILt","9eoRct98iW","lkMUAG1RhS","GSQwjStlDJ","9iGoTXyPZN","Chuy36AFT0","EoToPkZANm","55rfBRmDcr","kB5nPuTacx","6q6L9IKxdL",
+"XflUqD6rBy","h1zcHChuy3","M3zXLaez9y","VNCPdtvdkD","NAFuwv8yFN","jiVBPYjB9t","EOE1otAOsr","fcJOyblLA9","0PktIIn3NS","uPX7Go8Uyd",
+"VBjhz5drc6","FNYIMPb1pa","VLTy62Nslm","MGlTF3weIF","ZUnqtpWiOs","X6Pin0Wr5y","pT8wuKZamH","TXQ0ZAIYUu","0BmCyVprf2","uAWyp7Ow5C",
+"FPfSE5VZjS","F6PT2ru4UG","B3qemwDajX","blLA9t59lR","5ZaEzQssNC","64s8NO3iyQ","zQt6Q9XyT9","FnPFB5ZaEz","9GXkXpv0i7","UmaEvjtn0X",
+"Q6hMCX6Pin","jSjS3I7p2a","Cfgr3L7cGc","Ta8f6gIYvE","EoToPyofH3","ulk41FcWrW","lXFOB5ZaEz","B3qemPYBf4","TCgPp07n1c","9XyT9No0Qb",
+"6q6L9FPfSE","tjQxsazIWp","zFgtBWMiS3","SjskQQbxXc","b29RJRsQUq","jzUqRd7vjM","9XyT90Wr5y","M3zXL3otm6","MK07YBbwgA","JXljWoGu6x",
+"Cfgr3VjCZq","9eoRcQChxs","7fsYM8TxD7","xXTI4AIYUu","VBjhziwzGk","uoStwWMiS3","7X3uyZUnqt","ciuWzChuy3","hE1Qln1pmO","taOXKAXpwE",
+"JXljWChuy3","jtn0XOHaBz","oGu6xk85Ae","uPX7GU3yw5","MK07Y5Namm","uoStwJKWYR","pWiOsdpe1v","Dz1R3S2Dfu","CK5W7jeskS","dhSuHuTacx",
+"YjB9ttuDyS","J2mQi4W0Tl","Oz8yZRACuj","jiVBPFhtgl","d7vjMsx5Gl","tuDySXyPZN","Chuy3lViBv","FLsphrz7Ut","8U2nUprNT6","Q6hMCPb1pa",
+"ZuDtDlm0pD","gtCA5OUqFM","9XyT9YjB9t","JkzUn7ku1p","IjTwPZUnqt","7hyVvlm0pD","KZamHUmaEv","7Ow5C07n1c","JKWYRBbwgA","IRh48SmGzv",
+"tl72Whi5X7","G1RhSxReec","VLTy6azIWp","FxX9q1LB1L","VjCZqWmadA","5Drn0uLtKs","tlILtTwano","ni2v1n8pJ9","MezSWCqqaD","CIShGCqqaD",
+"vLsmSprNT6","2ZHdkQ6Lix","5Mg9roQ87r","KsjRKydG8U","fmIK1ReKEW","K20wK9y4lw","K4GS8hUTw7","7X3uyzHF1q","0ao3l8cVD3","sqVrfgdQsS",
+"FjHXRJKWYR","i7WMQK4GS8","K4GS89iGoT","gf8rIbrhlQ","uPX7GRxrsm","uZPqg4QMc9","rz7UtVLTy6","6AFT0P6bcg","pFrrlKr8ys","hYBCKe6e4z",
+"580YDGrDg7","lXFOByToGW","d85a98hJdt","XflUqK20wK","3weIFRzaZA","DLhzM0YAGH","dhSuHjSjS3","AOgEeCp3mZ","fcwDaDz1R3","KsjRKAkKTk",
+"0ao3l5ZaEz","bgJAzjfREu","i3pydHzZT8","0PktIWaim6","Yf2EcOz8yZ","WaWsvlH1kt","Pb1paX6Pin","rz7UtkB5nP","lm0pDpT8wu","taOXKuTacx",
+"DLhzM7X3uy","SWfou7fKYU","XyPZNJ2mQi","5Mg9rS2Dfu","UmaEvVerEA","hSSvQB3qem","s4786soy9t","qQxHPStlDJ","48cHLxXTI4","NhXdu9iGoT",
+"Gv3FqxXTI4","gdQsSqaofN","0h1b1faHir","5Nammix74r","bZLvSL7cGc","ni2v1fmIK1","fLNg8s7Mxk","FPfSEi7WMQ","vOqCEMmsIo","8RCUAIn3NS",
+"BFkb8KASQ8","XflUqIn3NS","kB5nPpWiOs","3weIFRxrsm","6AFT0jeskS","Ul4a1BbwgA","s478655rfB","OUYuF7ku1p","No0Qb9GXkX","e6e4z4W0Tl",
+"VLTy6wDajX","s4786jtn0X","zmLYDk85Ae","cShY2yluBx","5IhmG1j5L8","tAOsrwDajX","JXljW0YAGH","Uvlv4HRxd8","jeskSpAhR1","nlaBy6q6L9",
+"FcWrWs93Ml","VIlwPguMb8","Z4I1vBCxeC","KASQ8C2Irc","Waim6Qworu","n1pmOsoy9t","gf8rIvLsmS","MK07YFNYIM","8FmFHeuZA5","No0Qb5iGN5",
+"d7vjMsoy9t","Cfgr3atef2","WMiS3HzZT8","xciqpLDk6f","HlUbFI7p2a","W7cTsIBe8k","P6bcg2Nslm","DG4sTzHF1q","djsrvRACuj","StlDJhe9IA",
+"oQ87rwDajX","8FmFHsx5Gl","BCxeCFxX9q","HP433uLtKs","Chuy3Z4I1v","2hEEUIRh48","MezSWzFgtB","I7p2aFwEJz","RpBQmFPfSE","CdyBVIRh48",
+"5Nammzz4ZU","sqVrfJ2mQi","L7cGcuvf7A","P6bcguvf7A","oQ87r7Ow5C","vLsmS5Namm","pFrrlzbIYY","yluBxtlILt","AgJHQQChxs","yluBxY1mC0",
+"FLsphO3iyQ","yvOMI5nmWv","8RCUAuN6r3","tl72WjiVBP","lCMxyCIShG","jS1ajMGlTF","FVMxopWiOs","GWqqXQChxs","0MR5XYh1hF","MmKGJzFgtB",
+"48cHLOz8yZ","dhSuHGSQwj","BCxeCs4786","hSSvQzY1GY","Cp3mZO3iyQ","NAFuwuJScX","7hyVvWDVWJ","CdyBVFFDui","tjQxsKZamH","DLhzMbgJAz",
+"Cfgr3zHF1q","rz7UtYw2oU","StlDJJXljW","faHirVBjhz","RBhp0KASQ8","ydG8UBpYhV","0MR5XStlDJ","POUYSn8pJ9","580YDiwzGk","tvdkDTwano",
+"gtCA5iB08l","Oz8yZ8cVD3","hE1QllH1kt","y94nw55rfB","StlDJuZPqg","hE1QllsQGo","dpe1vRzaZA","FGzgptjQxs","W7cTsWaim6","dhSuHVIlwP",
+"ThjNn2DREs","JKWYRmz8gx","hE1Qld7vjM","zmLYDFcWrW","GrDg7taOXK","prNT6faHir","FhtglfcwDa","1j5L8BFkb8","29QAzLDk6f","YjB9tfaHir",
+"0PktIeuZA5","14FLRbrhlQ","QssNCThjNn","pFrrlbgJAz","h1zcH3otm6","Chuy3VerEA","gIYvEyEfy9","vOqCE618Di","dhSuHk85Ae","5iGN5YjB9t",
+"kZANm9eoRc","nFqikQworu","3otm6YOfrY","KASQ8UlU3M","POUYSpFrrl","QssNCfFDrJ","tlILtVjCZq","5ZaEzZzJHW","v8yFN16lHc","7X3uy4W0Tl",
+"lViBvDLhzM","Dz1R36q6L9","5iGN5Zv7z0","JXljWWaWsv","uN6r30MR5X","GXdoH5drc6","0ao3luZPqg","jfREuKsjRK","ZUnqtJ2mQi","y94nwP6bcg",
+"KsjRKQworu","Oz8yZhSSvQ","kB5nPFNYIM","aFFssnlaBy","AkKTkFnPFB","Ss0ZuU3yw5","FhtgldQ586","tvdkDFhtgl","QYxC045cIH","QbxXcSs0Zu",
+"uupzkVerEA","LbRTH5Mg9r","VjCZqVjCZq","O3iyQxXTI4","jeskSuoStw","XyPZNJkzUn","zqH0WjfREu","4QMc9JJs5m","jtn0X9XyT9","NhXdu5VZjS",
+"IRh488xEKz","m4bxUQYxC0","jtn0XX6Pin","lm0pD7hyVv","rz7UtQWxoT","5nmWv7hyVv","uupzkQYxC0","Rxrsmru4UG","Ss0ZuRACuj","dmoS7RACuj",
+"CK5W7ZzJHW","kB5nP07n1c","t98iWVjCZq","k85AeyofH3","euZA5qUJMd","JJs5mQnJ1S","16lHcJXljW","55rfBkZANm","i7WMQEoToP","KsjRKWmadA",
+"piJSkQssNC","0MR5XzbIYY","0PktI8TxD7","qQxHPVNCPd","8xEKzfFDrJ","DLhzMRzaZA","RkQkeKr8ys","JIqXifaHir","FPfSE07n1c","8TxD7hUTw7",
+"lkMUApiJSk","X6Pin8U2nU","XyPZNMmKGJ","ksJbySWfou","i3pydaez9y","Mkgy8sx5Gl","Z4I1vlweGy","16lHcnFqik","euZA58xEKz","64s8NcmXIX",
+"2DREsFxX9q","AXpwEOHaBz","AgJHQ2Nslm","yluBxpmeCd","8xEKzMaJQs","ksJbyguMb8","gtCA5FjHXR","t98iWJRJQB","GXdoHrhl0J","9eoRcF6PT2",
+"jeskSXyPZN","Y1mC0okgRi","zY1GY6q6L9","d7vjMMaJQs","t59lRogLgc","580YDFhtgl","UmaEvKsjRK","Cp3mZ618Di","nFqikuAWyp","uTacxzFgtB",
+"Chuy3WreyP","LewvMCNHmv","FwEJzWmadA","CK5W724ARF","DcpWBa00b5","No0QbRxrsm","0Kyfs3weIF","ThjNnReKEW","lH1ktLewvM","bgJAzkZANm",
+"iqv4kuJScX","yofH33weIF","In3NSS77LH","lj07QZJTXH","C2IrcQbxXc","a00b5FVMxo","0h1b1s4786","CNHmvgIYvE","TXQ0ZvLsmS","yluBxuZPqg",
+"Z4I1v2Nslm","zQt6QKr8ys","nFqikFNYIM","uN6r3lH1kt","yofH3FNYIM","wiHrZ7ku1p","okgRiaDGtS","1v5hHVerEA","ksJbypv0i7","aL6AJTwano",
+"DG4sTQ6Lix","v8yFNmz8gx","iB08lIKxdL","mX2GEuLtKs","ciuWzPYBf4","6q6L9K4GS8","LbRTHMm8si","ZhwG1iwzGk","pvgjSprNT6","CdyBV0YAGH",
+"uoStw8RCUA","Ss0ZuvkCHH","Ss0ZuQnJ1S","bZLvSgjUTu","BbwgAM6qcG","iwzGkECMvU","8hJdtX6Pin","lsQGoaez9y","bgJAzzFgtB","yvOMIJJs5m",
+"X6Pinpv0i7","IjTwP55rfB","s7MxkX6Pin","PYBf4X6Pin","VLTy6LDk6f","fLNg8lXFOB","uZPqgStlDJ","AIYUuNo0Qb","Yh1hFCp3mZ","tl72WFxX9q",
+"hi5X7UmaEv","ulk41s4786","lCMxyjfREu","B3qemMmsIo","nFqikpFrrl","nnP8oIRh48","5NammP6bcg","taOXKt98iW","wDajXQ6hMC","nnP8oWreyP",
+"U3yw5nFqik","kB5nPIBe8k","MezSWWmadA","s93MlTwano","dhSuHWPmlx","In3NScmXIX","4QMc9RzaZA","uTacxZuDtD","rKDLJQClRL","RzaZAgdQsS",
+"yEfy9bZLvS","BCxeCrKDLJ","l83UdcL0aE","8FmFHjzUqR","hE1Ql64s8N","b29RJfmIK1","1v5hHqUJMd","uN6r3ZJTXH","KsjRKuQIcz","1v5hHfqypy",
+"5ZaEzdQ586","nlaBybrhlQ","8xEKzgjUTu","cQOnvulk41","24ARF1v5hH","2DREsazIWp","2DREstjQxs","FGzgpxReec","DG4sTFwEJz","HzZT8uN6r3",
+"ogLgcCp3mZ","W7cTszY1GY","0BmCyzqH0W","BFkb8M6qcG","lViBvtlILt","WDVWJvOqCE","AOgEeQssNC","zY1GYaez9y","tlILtk85Ae","9y4lwStlDJ",
+"5ZaEz580YD","mz8gxsqVrf","GXdoH7lUXZ","EdBKc1v5hH","ReKEWHzZT8","aDGtSvOqCE","brhlQFPfSE","7X3uyb29RJ","4W0TlAOgEe","fFDrJh1zcH",
+"rKDLJGv3Fq","0BmCytl72W","s93Mld7vjM","i3pydJkzUn","FwEJzGv3Fq","1j5L8n1pmO","CdyBVFGzgp","EOE1ocQOnv","No0QbUvlv4","uPX7G8hJdt",
+"uupzk7fsYM","RkQkeuJScX","Uvlv48hJdt","jiVBPRxrsm","48cHLs4786","jzUqRuAWyp","24ARFrKDLJ","v2eC3In3NS","AkKTkMezSW","zQt6QThjNn",
+"ZuDtDbZLvS","okgRiOxWIH","s93MlQChxs","atef2nFqik","v2eC3AIYUu","uZPqgxciqp","h1zcHEdBKc","bZLvSC2Irc","o8Uyda00b5","0YAGHzqH0W",
+"Kr8ysd7vjM","cShY2n8pJ9","0BmCysqVrf","dhSuHRsQUq","TCgPpuTacx","POUYSDz1R3","jiVBPNxx9V","Cp3mZbgJAz","lj07QVBjhz","9XyT9n1pmO",
+"S77LH4QMc9","zbIYYtaOXK","BCxeC2DREs","WMiS3Pb1pa","mz8gxbrhlQ","pAhR1sx5Gl","fcJOydmoS7","KASQ84W0Tl","lpF6Wjtn0X","EoToPyEfy9",
+"S2DfuaDGtS","brhlQSs0Zu","gdQsSpWiOs","ZUnqtDLhzM","zbIYYCxVEf","8RCUAs4786","O3iyQdhSuH","ydG8UBFkb8","iB08liB08l","i7WMQlCMxy",
+"C2IrcQ6Lix","lH1ktkB5nP","ydG8URACuj","BbwgAb29RJ","BbwgA2Yz7E","MK07Yx3LDe","ksJbyl83Ud","NhXdu618Di","guMb8zbIYY","Ta8f6DcpWB",
+"580YDaez9y","W3VFHYjB9t","uvf7AX6Pin","CK5W7nnP8o","mz8gx7hyVv","VLTy6uLtKs","aDGtS5nmWv","8hJdts4786","29QAzyEfy9","HRxd8EdBKc",
+"5VZjSxReec","5iGN5i7WMQ","JRJQBNcICA","zmLYDY1mC0","D6rByFPfSE","Q6LixI7p2a","RBhp0uoStw","Q6LixuPX7G","fLNg8In3NS","ru4UGuoStw",
+"tl72WKASQ8","brhlQ8TxD7","GXdoHd7vjM","Y1mC0SjskQ","4QMc9hUTw7","cQOnvB3qem","AOgEelCMxy","yEfy95iGN5","TXQ0Zs4786","No0Qb9y4lw",
+"VerEAs7Mxk","I7p2ayvOMI","Zv7z0ZUnqt","okgRihe9IA","ogLgcG1RhS","uAWypIRh48","7Ow5C9eoRc","RsQUqVprf2","faHirh1zcH","wDajXFjHXR",
+"OUqFMlViBv","ogLgcn1pmO","d7vjMgf8rI","iB08l5Drn0","CNHmvQWxoT","IKxdLP6bcg","djsrvVerEA","XflUqpv0i7","e6e4zThjNn","yofH3uoStw",
+"Mkgy8Oz8yZ","aez9ydpe1v","xReeceuZA5","lkMUAuZPqg","uLtKs9iGoT","7lUXZJIqXi","zQt6QSs0Zu","sx5GlMGlTF","s93Mly94nw","CNHmvFjHXR",
+"9XyT9ksJby","618Dijtn0X","tAOsrgIYvE","S2Dfu2Nslm","uZPqgNcICA","Yh1hFjS1aj","Chuy3lCMxy","RzaZAG1RhS","4dEz6AkKTk","zHF1qReKEW",
+"pT8wu07n1c","LewvMyToGW","iKqhryToGW","uLtKsUl4a1","ReKEWv8yFN","KASQ8qUJMd","iB08l8cVD3","uN6r3WreyP","4dEz645cIH","lj07QCfgr3",
+"jzUqRbrhlQ","lweGyVLTy6","m4bxU9iGoT","OHaBz2Nslm","dQ586WaWsv","h1zcHyvOMI","JRJQBfaHir","JIqXiiqv4k","NOHszcShY2","t98iW07n1c",
+"VBjhzQworu","7hyVv5ZaEz","soy9tuoStw","RpBQmuJScX","Waim6J2mQi","okgRid7vjM","AmdQdQClRL","azIWpsqVrf","guMb85iGN5","0YAGHRpBQm",
+"FxX9q7lUXZ","IRh4864s8N","NAFuw7hyVv","S77LHLewvM","zbIYYQYxC0","blLA9FjHXR","SjskQSmGzv","jSjS3yluBx","iqv4kOUYuF","D6rByRmDcr",
+"7Ow5CYOfrY","JRJQBFnPFB","Q6hMCGXdoH","jeskShUTw7","uLtKsxciqp","zQt6QyToGW","No0QbZzJHW","JkzUn580YD","Kr8ysciuWz","uTacxt98iW",
+"cQOnvlj07Q","y94nw4QMc9","EdBKc9GXkX","9eoRc2TRI7","Yw2oU2DREs","uupzkVBjhz","qaofNbZLvS","O3iyQvOqCE","pvgjSRkQke","618Diiqv4k",
+"zQt6QgIYvE","y94nwguMb8","gdQsSuN6r3","Zv7z05ZaEz","FcWrW1v5hH","rhl0JS77LH","bgJAzix74r","MaJQsRxrsm","zY1GYMmsIo","Mkgy8v1Hln",
+"hi5X72Yz7E","FcWrWDLhzM","RmDcro8Uyd","zmLYDhi5X7","zHF1q0YAGH","X6PinsuY4x","dpe1vZzJHW","h1zcHCNHmv","ru4UGjS1aj","KASQ8Rxrsm",
+"wDajXjfREu","ECMvUlXFOB","MK07Y7lUXZ","zQt6QQssNC","KASQ89iGoT","TCgPpAXpwE","BGaQYzY1GY","8RCUAFhtgl","7lUXZOxWIH","sx5GljS1aj",
+"MGlTFFcWrW","K4GS8lXFOB","gdQsSMK07Y","8cVD3zmLYD","IRh48AgJHQ","fqypyM3zXL","ix74rRxrsm","VerEA0Wr5y","O3iyQh1zcH","VerEACfgr3",
+"VBjhzxReec","GXdoH2DREs","oGu6xl83Ud","CNHmvpvgjS","uTacxEdBKc","qQxHPVerEA","uN6r30Wr5y","8RCUABbwgA","Ss0Zu1v5hH","ThjNn55rfB",
+"dQ586uAWyp","OxWIHgIYvE","MmKGJWPmlx","ksJby0h1b1","lViBvuQIcz","O3iyQIn3NS","t59lRSs0Zu","mX2GEYw2oU","rKDLJQworu","rKDLJCdyBV",
+"jiVBPfcJOy","zz4ZUgf8rI","yToGWAmdQd","okgRikB5nP","0Wr5ytlILt","JkzUnBpYhV","qUJMdAkKTk","Vprf2aez9y","9y4lwEdBKc","lsQGoRACuj",
+"5drc6FcWrW","lsQGoiB08l","Mkgy8qUJMd","Q6Lix8xEKz","DcpWBs4786","cShY2uoStw","S2DfuCqqaD","zz4ZULewvM","tjQxs5Drn0","n8pJ95nmWv",
+"dmoS7WmadA","FGzgp2TRI7","P6bcglViBv","Yf2Ecv2eC3","CqqaDSWfou","d85a9gtCA5","5ZaEz55rfB","a00b5nFqik","aL6AJJIqXi","K20wKJ2mQi",
+"9iGoT1j5L8","gtCA50PktI","Oz8yZFwEJz","lH1ktgjUTu","ReKEWRsQUq","RACujFPfSE","EOE1oAXpwE","NhXduoGu6x","9y4lw0BmCy","IRh48FjHXR",
+"fcwDaSjskQ","xReecsx5Gl","iKqhr6q6L9","Oz8yZaDGtS","SjskQAXpwE","n8pJ9e6e4z","rhl0JjeskS","7lUXZ9GXkX","7hyVvjzUqR","jeskSjzUqR",
+"KASQ8TXQ0Z","Cp3mZGrDg7","hUTw7Yw2oU","uupzkCK5W7","45cIHhSSvQ","RACuj2ZHdk","IjTwP4W0Tl","M3zXLi7WMQ","2ZHdkYOfrY","BFkb8QClRL",
+"v1HlnZJTXH","lweGyyvOMI","580YD2hEEU","hE1QltuDyS","MaJQs2TRI7","v2eC3yofH3","BCxeCYh1hF","tl72WbrhlQ","tuDyS8xEKz","4dEz6vLsmS",
+"W3VFHOxWIH","OUYuFkB5nP","7fsYMGXdoH","Kr8ysd85a9","cmXIXzHF1q","pWiOsEOE1o","cL0aEv8yFN","SbRYyx3LDe","hUTw75Namm","FNYIMk85Ae",
+"mX2GE4QMc9","ZJTXHMkgy8","rhl0Jfqypy","uoStwQnJ1S","4QMc9I7p2a","U3yw5RpBQm","FFDuioQ87r","gdQsSoGu6x","GWqqX9eoRc","2NslmgIYvE",
+"CK5W7y94nw","ru4UGhUTw7","WreyPPOUYS","gIYvEvkCHH","X6PinydG8U","brhlQTwano","fqypyZ4I1v","lpF6WIjTwP","7fKYUdQ586","JIqXi07n1c",
+"mX2GE5Drn0","3otm648cHL","OUqFM2Nslm","QClRL0h1b1","a00b5dmoS7","Chuy3tl72W","HRxd8HzZT8","n1pmOpFrrl","Yw2oUo8Uyd","5ZaEzd7vjM",
+"tvdkDTa8f6","ZJTXHY1mC0","5ZaEzbgJAz","6q6L9FVMxo","AmdQd48cHL","fLNg8m4bxU","Nxx9VkZANm","EdBKciwzGk","GSQwjuupzk","d7vjMrz7Ut",
+"RpBQmlsQGo","StlDJpT8wu","Mm8si3weIF","jiVBPpiJSk","2Nslm2Yz7E","cmXIXiKqhr","RsQUqn1pmO","SWfoujfREu","KASQ8TCgPp","e6e4zdjsrv",
+"lkMUAVprf2","nnP8oMojnP","VBjhzb29RJ","QssNCS2Dfu","lj07QZhwG1","iB08lQworu","aL6AJU3yw5","piJSkWPmlx","o8Uyd14FLR","hi5X7Gv3Fq",
+"EdBKcUlU3M","6AFT0FVMxo","dhSuH8xEKz","GrDg7WMiS3","pv0i7FcWrW","IKxdLJXljW","uoStwjfREu","IjTwPlpF6W","07n1clj07Q","S77LHCIShG",
+"yvOMI8hJdt","CNHmvOHaBz","h1zcHd7vjM","B3qemWDVWJ","D6rByiKqhr","qQxHPaFFss","lCMxyGv3Fq","GSQwj4dEz6","IBe8ks93Ml","Q6hMCMaJQs",
+"0MR5XL7cGc","ni2v1jzUqR","AXpwEfqypy","HfyNQWDVWJ","1LB1L3otm6","Cp3mZpFrrl","DLhzMKASQ8","W3VFHRxrsm","DcpWBuTacx","BbwgAGXdoH",
+"5nmWvhUTw7","0BmCyXyPZN","0h1b1Fhtgl","cShY2qUJMd","CK5W7Mkgy8","MezSWjfREu","64s8NTXQ0Z","a00b59GXkX","AOgEejeskS","qUJMdOUqFM",
+"jSjS3gtCA5","uoStwpv0i7","580YDrKDLJ","PYBf4bZLvS","xReecEoToP","StlDJSbRYy","1j5L8J2mQi","EOE1oSWfou","pFrrl0Kyfs","NcICANhXdu",
+"EoToPAgJHQ","faHir0Kyfs","xReec9XyT9","7lUXZzqH0W","Oz8yZ6AFT0","5Drn0LDk6f","DQimpM6qcG","qQxHPNo0Qb","KASQ8NAFuw","uQIczFFDui",
+"5NammRsQUq","UlU3MM6qcG","GrDg7StlDJ","v2eC3nnP8o","KZamHWaim6","Yw2oUfaHir","fqypyMGlTF","D6rByjSjS3","8hJdt2DREs","SWfouGSQwj",
+"4QMc9PYBf4","CxVEfUmaEv","pWiOsUl4a1","O3iyQWaWsv","FnPFBVprf2","ECMvUZv7z0","LewvM0BmCy","fmIK148cHL","2TRI77ku1p","vOqCESmGzv",
+"FFDui7Ow5C","vkCHHMaJQs","mX2GEpiJSk","tl72WAgJHQ","dQ586K4GS8","iqv4klpF6W","2TRI7JkzUn","2hEEUtl72W","d7vjMSjskQ","uZPqgNAFuw",
+"VjCZq14FLR","O3iyQNxx9V","JkzUnNhXdu","ZuDtD8U2nU","5Mg9r1j5L8","W3VFHjeskS","t59lRDcpWB","FVMxocL0aE","LewvMpv0i7","ksJbySmGzv",
+"ksJbydhSuH","lm0pDx3LDe","XyPZNhYBCK","v2eC3sx5Gl","5VZjS64s8N","OUYuFuoStw","ogLgcUmaEv","RACujbgJAz","5iGN5okgRi","zbIYYzqH0W",
+"JKWYRo8Uyd","zFgtBwDajX","b29RJWDVWJ","Gv3FqFVMxo","HP433uZPqg","CK5W7he9IA","0YAGHSbRYy","taOXKSWfou","tl72WFLsph","S2DfuUvlv4",
+"0Kyfs14FLR","ogLgchUTw7","jeskSpWiOs","xciqp29QAz","J2mQiMm8si","CqqaDtaOXK","AmdQd1LB1L","2ZHdkC2Irc","SjskQKsjRK","2TRI7jfREu",
+"Oz8yZ64s8N","OHaBzAmdQd","pvgjSW3VFH","ZJTXHt98iW","9XyT9O3iyQ","CIShGYf2Ec","h1zcHSs0Zu","rhl0JHfyNQ","64s8NdQ586","Nxx9VNo0Qb",
+"aL6AJtjQxs","SbRYytlILt","OUYuFRBhp0","tvdkDn8pJ9","a00b5WaWsv","U3yw5GrDg7","rKDLJIBe8k","uLtKsIBe8k","fFDrJuZPqg","JkzUnQnJ1S",
+"FhtgliKqhr","RBhp0tjQxs","djsrvOxWIH","SbRYyuZPqg","vOqCEpiJSk","fmIK1mX2GE","t59lRtvdkD","GrDg7SbRYy","IRh48FGzgp","Waim6ru4UG",
+"ZhwG1JXljW","guMb8I7p2a","gIYvErKDLJ","yToGWK20wK","xXTI4iqv4k","djsrvS77LH","yluBxPYBf4","UlU3MQssNC","WreyPCIShG","Ss0Zub29RJ",
+"s93MlK4GS8","yluBxnlaBy","8FmFHaFFss","5drc6hE1Ql","soy9tb29RJ","WMiS3AmdQd","MaJQslCMxy","2TRI7ZhwG1","Gv3FqLDk6f","Waim6WaWsv",
+"2TRI7fcJOy","7X3uys7Mxk","xXTI40Wr5y","F6PT2I7p2a","8hJdtxReec","iKqhruAWyp","29QAzQnJ1S","HlUbFlpF6W","lCMxypvgjS","FxX9qiB08l",
+"jeskS7fKYU","vkCHHtjQxs","faHirBGaQY","48cHLYf2Ec","oQ87rJRJQB","TCgPp8xEKz","lCMxygtCA5","sx5Gl24ARF","i3pydydG8U","pFrrlNAFuw",
+"fmIK12Yz7E","n1pmOazIWp","5VZjSFwEJz","HRxd8yvOMI","5Mg9rMojnP","lweGyIjTwP","JKWYRtuDyS","8FmFHlj07Q","n8pJ9n1pmO","nnP8oZhwG1",
+"jeskSiwzGk","Gv3FqP6bcg","6AFT0Mkgy8","MK07YyToGW","hUTw7O3iyQ","fLNg8EOE1o","W3VFHM6qcG","aez9ydmoS7","fmIK19XyT9","BpYhV9iGoT",
+"OUqFMpT8wu","5Drn0uAWyp","prNT6jiVBP","07n1cOUqFM","VjCZqv8yFN","NcICAcQOnv","F6PT2Cp3mZ","OUYuFZhwG1","iqv4krKDLJ","XflUqatef2",
+"SmGzvyToGW","RsQUquAWyp","Cfgr37fsYM","8hJdt5Mg9r","xReeco8Uyd","fcJOyBpYhV","lm0pDStlDJ","FNYIMAgJHQ","P6bcggtCA5","yToGWpWiOs",
+"L7cGc0MR5X","9iGoT0Wr5y","t98iWs4786","Waim6i7WMQ","2Yz7Egf8rI","yEfy9DLhzM","Mm8sihe9IA","Cfgr3oQ87r","Y1mC02hEEU","Rxrsm580YD",
+"BCxeCNOHsz","HfyNQgtCA5","Y1mC0I7p2a","n1pmOjiVBP","JKWYRiB08l","RsQUqfcwDa","48cHLChuy3","QworuGSQwj","Z4I1vXflUq","07n1cuPX7G",
+"ni2v1LbRTH","rhl0JoGu6x","MojnP9y4lw","RzaZACK5W7","lViBvokgRi","MK07YVjCZq","guMb8M6qcG","G1RhSnFqik","cShY29rlg9","yofH3xXTI4",
+"tl72W5drc6","JRJQBOUYuF","JRJQBuPX7G","FnPFBzY1GY","BbwgAt59lR","pAhR14dEz6","xReecM3zXL","5IhmGsx5Gl","CNHmv7ku1p","7ku1pwiHrZ",
+"lXFOBiB08l","euZA5zY1GY","KsjRKVIlwP","aFFssjeskS","aL6AJIRh48","S2DfuEOE1o","GrDg77ku1p","B3qemThjNn","StlDJS77LH","pmeCdiKqhr",
+"fFDrJRmDcr","i7WMQkZANm","hYBCKtuDyS","oGu6xQWxoT","580YDStlDJ","x3LDe14FLR","Yh1hFjiVBP","lH1ktIKxdL","TwanoOUYuF","P6bcglsQGo",
+"2NslmPOUYS","9eoRcuTacx","Oz8yZbgJAz","uZPqgYw2oU","RsQUqQworu","djsrvChuy3","jS1ajjS1aj","CxVEfdpe1v","cmXIXChuy3","WPmlxKZamH",
+"Cp3mZpT8wu","Ul4a148cHL","lweGyLbRTH","5Drn0SWfou","uAWypDLhzM","FNYIMfcwDa","lkMUA0BmCy","lweGydjsrv","dpe1vBbwgA","NcICAOHaBz",
+"0h1b1DLhzM","GSQwjuLtKs","oQ87rgtCA5","CqqaDZzJHW","ZuDtDhi5X7","pvgjSJkzUn","IBe8kS77LH","uZPqgi7WMQ","EdBKcAIYUu","8FmFHk85Ae",
+"CqqaDhi5X7","Ul4a1h1zcH","FLsphVprf2","Ta8f6PYBf4","G1RhSK20wK","nnP8oGrDg7","2NslmFjHXR","zHF1qeuZA5","RBhp0jS1aj","fmIK1BFkb8",
+"fcwDa64s8N","64s8NuZPqg","pFrrlVBjhz","hi5X7ru4UG","FNYIMBpYhV","WreyPOHaBz","0Wr5ykB5nP","1j5L8zz4ZU","zqH0WYOfrY","ZuDtDWmadA",
+"BFkb81LB1L","OUqFM5Mg9r","2ZHdkDG4sT","OUqFM5IhmG","2NslmlkMUA","zHF1q5nmWv","OUqFMh1zcH","Yf2EcOHaBz","48cHLzY1GY","brhlQlsQGo",
+"K20wKCqqaD","oGu6x64s8N","8hJdtQ6hMC","a00b5aFFss","8hJdtd7vjM","7lUXZYh1hF","JRJQBvOqCE","he9IA7Ow5C","5ZaEzAXpwE","ix74rMm8si",
+"AmdQd8FmFH","l83Udmz8gx","VBjhz9iGoT","m4bxUFPfSE","L7cGcXflUq","piJSkI7p2a","G1RhSW7cTs","AOgEeoVQp6","5iGN5Dz1R3","oQ87rChuy3",
+"kZANmrKDLJ","14FLR0ao3l","ZuDtD7Ow5C","d7vjM5ZaEz","U3yw5jS1aj","gIYvE2TRI7","gdQsS7X3uy","qUJMdM3zXL","lH1ktB3qem","HlUbFC2Irc",
+"FcWrWYw2oU","blLA9xciqp","s7Mxk580YD","9GXkX2ZHdk","Dz1R3QYxC0","8xEKzEoToP","zbIYY7fKYU","NhXduFGzgp","KsjRKxReec","dpe1vfmIK1",
+"WmadAIn3NS","7hyVvjS1aj","OxWIHFFDui","Waim6GrDg7","aDGtSxXTI4","KsjRK1v5hH","4W0TlZJTXH","jzUqRL7cGc","GSQwjm4bxU","ZUnqt2Nslm",
+"RmDcr14FLR","pWiOsaez9y","0h1b1fcwDa","n8pJ96AFT0","JJs5mLewvM","48cHLJIqXi","S77LHuTacx","uPX7GEdBKc","s7MxkK4GS8","tuDySI7p2a",
+"OxWIHsqVrf","QnJ1SThjNn","9rlg9MojnP","1v5hHFFDui","hi5X79y4lw","Kr8yshE1Ql","J2mQiulk41","MGlTF4dEz6","No0QbBFkb8","QChxsMmKGJ",
+"t59lRi7WMQ","uvf7A24ARF","ksJby8TxD7","rz7UtpWiOs","cmXIX5Drn0","VIlwPuvf7A","piJSkQ6hMC","MGlTFuTacx","StlDJ55rfB","ZUnqtpmeCd",
+"oQ87rdQ586","LewvMTXQ0Z","mz8gxReKEW","Ss0ZuFxX9q","MaJQshYBCK","blLA9uvf7A","POUYS5Namm","tlILtCxVEf","WmadAhi5X7","ogLgcNOHsz",
+"pT8wuQ6Lix","hYBCKQnJ1S","KASQ8RsQUq","5IhmG7X3uy","uLtKsVLTy6","gdQsSydG8U","O3iyQUl4a1","euZA5lH1kt","jtn0XUl4a1","n1pmOyvOMI",
+"FLsphsuY4x","RkQkebZLvS","618Di3otm6","DQimpokgRi","OxWIHCNHmv","FFDui0Kyfs","nlaByNOHsz","ZuDtDd85a9","MaJQsJkzUn","uvf7AvOqCE",
+"CIShG55rfB","yToGW5VZjS","gjUTuyluBx","VNCPdCIShG","s7Mxk0BmCy","8cVD3WmadA","v8yFNo8Uyd","9iGoTKASQ8","Yh1hFDQimp","gdQsS5drc6",
+"WreyPfmIK1","POUYSFNYIM","JkzUn4W0Tl","v2eC3Twano","lj07QlH1kt","AOgEeqUJMd","bgJAzlXFOB","8RCUA8FmFH","FGzgpnlaBy","mz8gxFxX9q",
+"8TxD7uvf7A","8xEKzOUYuF","CK5W7MGlTF","9y4lwRBhp0","ni2v1ni2v1","oGu6x0ao3l","8xEKzi7WMQ","AkKTk0PktI","he9IAogLgc","zqH0WMGlTF",
+"07n1cHlUbF","atef2Mkgy8","618DiMK07Y","v2eC3fqypy","14FLR6AFT0","Q6hMCiqv4k","In3NS45cIH","LDk6fuN6r3","JJs5mHRxd8","bgJAzM6qcG",
+"dmoS7Z4I1v","Q6hMC2ZHdk","POUYSgtCA5","Cp3mZjiVBP","tjQxszbIYY","aez9yECMvU","uPX7GYjB9t","0MR5XOUYuF","MezSW4QMc9","zmLYDXflUq",
+"QYxC0LDk6f","rKDLJ7Ow5C","ogLgcWaim6","5iGN5lsQGo","ix74rBCxeC","QworuYOfrY","HfyNQtAOsr","lj07Qt59lR","v1HlnSmGzv","OxWIHW7cTs",
+"RkQke2DREs","I7p2a1LB1L","5NammNxx9V","oVQp6Mkgy8","Kr8ysiB08l","FGzgpO3iyQ","Yf2Ec8FmFH","8FmFH8TxD7","pWiOsMGlTF","LDk6fvkCHH",
+"i3pydThjNn","BGaQYKASQ8","yEfy95IhmG","VerEAKsjRK","FVMxoLewvM","xciqp8hJdt","2Nslmv1Hln","KASQ82Nslm","qQxHPvOqCE","5IhmGiB08l",
+"IBe8kxReec","K4GS81LB1L","s7MxkAOgEe","AgJHQAgJHQ","3weIFAOgEe","In3NSAmdQd","NhXdurz7Ut","pvgjSeuZA5","XflUqjSjS3","lm0pDWmadA",
+"MaJQsS2Dfu","QWxoTMojnP","Waim629QAz","HzZT8In3NS","s4786D6rBy","nlaBy9rlg9","2DREsQWxoT","16lHclweGy","ECMvU0PktI","Uvlv4FLsph",
+"CxVEfCdyBV","mz8gxDz1R3","8hJdt07n1c","XyPZNhUTw7","okgRizQt6Q","nnP8oF6PT2","WmadA48cHL","gtCA5ciuWz","y94nwZuDtD","CqqaDWmadA",
+"zY1GY0YAGH","mz8gxwiHrZ","POUYSWmadA","2hEEU0h1b1","5IhmGSmGzv","mz8gxgtCA5","VIlwPyofH3","MK07YLbRTH","o8UydMGlTF","ix74ra00b5",
+"ReKEWatef2","qaofNqaofN","oVQp6faHir","WPmlxCp3mZ","L7cGcbZLvS","zmLYD9GXkX","fLNg8mX2GE","uJScXuLtKs","2hEEUGXdoH","PYBf4yofH3",
+"StlDJXflUq","vkCHHOUYuF","fqypy7Ow5C","lm0pDCfgr3","FFDui55rfB","GXdoHMkgy8","v1HlncQOnv","gIYvEVprf2","zbIYYaFFss","Mkgy8KsjRK",
+"Yf2Eche9IA","AXpwEqQxHP","wDajXOUqFM","LDk6fW3VFH","G1RhSQWxoT","uZPqgOUYuF","618DiChuy3","dmoS73weIF","pvgjSiKqhr","SjskQpiJSk",
+"G1RhSM3zXL","Uvlv4U3yw5","yToGWbgJAz","IRh48QssNC","fcwDaHzZT8","VBjhzP6bcg","rhl0JIn3NS","IBe8koVQp6","Ss0ZuAkKTk","KsjRK5VZjS",
+"iqv4k5Namm","SmGzvn8pJ9","suY4x24ARF","CIShGQworu","JRJQBtvdkD","Uvlv4CK5W7","fcJOysoy9t","FhtglW3VFH","5ZaEz0Wr5y","B3qemSjskQ",
+"Gv3FqEdBKc","tlILtCdyBV","CxVEfvkCHH","nnP8oSWfou","K4GS8P6bcg","0KyfsgtCA5","ydG8UjeskS","t59lRaDGtS","zz4ZUZhwG1","9eoRc4W0Tl",
+"6AFT0uupzk","GWqqXyluBx","6q6L916lHc","vLsmSuLtKs","0BmCyeuZA5","S2Dfu8hJdt","XyPZNMK07Y","dhSuH5Drn0","ZJTXHS2Dfu","rz7Ut3otm6",
+"oQ87rY1mC0","aFFssAmdQd","i7WMQGXdoH","VNCPdCp3mZ","P6bcgB3qem","Oz8yZ0Wr5y","fLNg8i7WMQ","FwEJzxciqp","Ta8f6EOE1o","4QMc9oGu6x",
+"i3pydSWfou","VjCZqYjB9t","BFkb8aFFss","sx5Glrhl0J","FcWrWCdyBV","MojnPyluBx","zHF1qokgRi","zFgtBDQimp","OxWIHWPmlx","FhtglVprf2",
+"Oz8yZNhXdu","618Dix3LDe","AgJHQSjskQ","S77LHxReec","faHirzHF1q","I7p2aAkKTk","29QAz0YAGH","VBjhzdjsrv","C2IrcMezSW","FVMxoUvlv4",
+"fLNg8O3iyQ","6q6L9jzUqR","Ta8f6lj07Q","DcpWBwDajX","5nmWvgjUTu","IRh48pAhR1","KZamHsuY4x","Q6LixFjHXR","x3LDeCdyBV","iqv4kG1RhS",
+"iqv4kAOgEe","HlUbF48cHL","n1pmOvOqCE","Yh1hFZUnqt","8U2nUHfyNQ","zbIYYG1RhS","h1zcHpWiOs","FFDuicL0aE","aez9y5IhmG","uQIczatef2",
+"wDajXVjCZq","gf8rIjzUqR","5drc68TxD7","ciuWzHRxd8","x3LDepmeCd","5nmWviB08l","5iGN50MR5X","uvf7At98iW","5nmWvHRxd8","atef2hE1Ql",
+"GrDg7D6rBy","7Ow5CCp3mZ","azIWpm4bxU","5Namm5IhmG","MmKGJECMvU","xciqpe6e4z","i7WMQogLgc","ZzJHWKZamH","14FLRpvgjS","9y4lwYw2oU",
+"CNHmv29QAz","tlILtsx5Gl","taOXKeuZA5","618DiNo0Qb","JIqXiIRh48","Ta8f69rlg9","Uvlv4JJs5m","X6PinVNCPd","x3LDex3LDe","AOgEeOUqFM",
+"pv0i74W0Tl","faHircL0aE","NhXduI7p2a","pWiOsv8yFN","mX2GE2Yz7E","d85a9zz4ZU","7Ow5Cru4UG","7hyVv2TRI7","7ku1p45cIH","fqypyd85a9",
+"FcWrWOz8yZ","taOXKS77LH","RmDcr5IhmG","jeskS5Namm","Y1mC07ku1p","piJSk5IhmG","5iGN5QbxXc","In3NSXyPZN","QssNCOz8yZ","uPX7GWaWsv",
+"ThjNnCK5W7","ECMvUtl72W","m4bxUzmLYD","K20wKRpBQm","SjskQIKxdL","580YDmX2GE","QYxC0OUYuF","S77LHuN6r3","EdBKcL7cGc","7ku1pZzJHW",
+"fcwDaRxrsm","ZUnqthe9IA","zFgtBVerEA","FGzgpAIYUu","POUYSzqH0W","5ZaEzh1zcH","OUqFMQworu","Q6Lixx3LDe","2TRI7faHir","6AFT0dmoS7",
+"Cfgr3Cp3mZ","ru4UGTXQ0Z","Yw2oUB3qem","4W0Tl8U2nU","Gv3FqOHaBz","7hyVv8hJdt","dpe1vFwEJz","s93MlgIYvE","9GXkX7lUXZ","AkKTkJXljW",
+"ZuDtDSmGzv","0ao3lgtCA5","fmIK1gdQsS","EoToPSjskQ","5VZjSRpBQm","3weIFKZamH","8hJdt5nmWv","jSjS3RmDcr","tAOsrbZLvS","2Nslma00b5",
+"CdyBVnnP8o","D6rByrhl0J","0PktI9rlg9","uQIcz1v5hH","IjTwPpmeCd","JXljWaDGtS","7fsYMhi5X7","CxVEfm4bxU","MezSWBCxeC","soy9tQClRL",
+"M3zXLsx5Gl","J2mQilViBv","Dz1R3h1zcH","uvf7Aa00b5","aFFssRxrsm","WPmlxOUYuF","nnP8otlILt","tAOsryToGW","3weIFBbwgA","F6PT2Kr8ys",
+"sqVrf5Drn0","cQOnvfaHir","VjCZqTXQ0Z","hYBCKokgRi","h1zcHix74r","PYBf4QbxXc","DG4sT1j5L8","ogLgc5ZaEz","Y1mC02Yz7E","Yf2EcDG4sT",
+"Ss0Zu8xEKz","vOqCEZzJHW","2DREsokgRi","Ul4a1zmLYD","h1zcHjtn0X","GWqqX0Wr5y","2Yz7EdmoS7","rz7UtQnJ1S","Dz1R3qUJMd","Oz8yZVBjhz",
+"bgJAzFPfSE","JJs5mvOqCE","Cfgr3pFrrl","lXFOBNcICA","Kr8ysi3pyd","jS1ajFPfSE","yluBx4QMc9","NcICAlkMUA","dQ586QnJ1S","lXFOB1LB1L",
+"AXpwEJRJQB","5Mg9rYw2oU","ogLgcMezSW","L7cGclkMUA","zqH0WvLsmS","0h1b1aez9y","L7cGccmXIX","Zv7z0UlU3M","618DilpF6W","8cVD3FLsph",
+"pWiOssx5Gl","t98iWWaWsv","MojnPksJby","lj07QdmoS7","tuDySiqv4k","2Yz7EoQ87r","nlaBy0Kyfs","WaWsvazIWp","oQ87rb29RJ","djsrvNAFuw",
+"4dEz6U3yw5","7Ow5CEOE1o","OUqFMIRh48","W7cTsVLTy6","hSSvQTa8f6","UmaEvlj07Q","zqH0WQbxXc","Vprf2Fhtgl","BGaQY8U2nU","07n1cQworu",
+"FxX9qmX2GE","1v5hHNxx9V","WreyPl83Ud","4QMc9Twano","6q6L9XflUq","8cVD30YAGH","8xEKzReKEW","sqVrfoGu6x","fmIK1AXpwE","FjHXRBFkb8",
+"Cfgr3azIWp","IBe8k7lUXZ","vLsmSuvf7A","Zv7z0GSQwj","JJs5mAOgEe","K4GS88xEKz","IBe8kWaWsv","t59lR0Kyfs","fcJOykB5nP","UlU3MCIShG",
+"lXFOBd7vjM","ReKEWzmLYD","bZLvSxReec","G1RhSMaJQs","Mm8siS2Dfu","OUqFM4dEz6","yvOMIOxWIH","RpBQmd7vjM","guMb8ydG8U","OUYuF5ZaEz",
+"WMiS3y94nw","vOqCEIKxdL","0Wr5y580YD","14FLRYf2Ec","LbRTHtjQxs","QnJ1SlweGy","pv0i7FxX9q","8TxD7tvdkD","ulk41WPmlx","MaJQstAOsr",
+"RxrsmIBe8k","CxVEfjzUqR","TCgPpksJby","7lUXZS2Dfu","OHaBzxReec","yEfy9pmeCd","ciuWzyluBx","ThjNn0MR5X","JkzUnFPfSE","TCgPpCfgr3",
+"7Ow5ClViBv","0ao3lTXQ0Z","LbRTHuupzk","G1RhSksJby","TwanoM6qcG","0ao3liwzGk","2DREsaez9y","oVQp6euZA5","UmaEvZUnqt","YOfrY2ZHdk",
+"okgRiulk41","nlaByzmLYD","IKxdLqUJMd","FnPFBk85Ae","TCgPpZv7z0","azIWppmeCd","vkCHH9iGoT","zqH0WKsjRK","0h1b1fmIK1","qQxHP5Mg9r",
+"4dEz6qaofN","pmeCdpAhR1","uoStwW3VFH","aez9y618Di","lsQGoL7cGc","vkCHHn1pmO","JRJQBxXTI4","4dEz6LewvM","EOE1oVNCPd","nFqiksx5Gl",
+"BFkb8WmadA","7ku1pjfREu","Zv7z03otm6","9XyT9AOgEe","P6bcgsuY4x","RsQUqF6PT2","5Mg9rM3zXL","fcwDaRkQke","tvdkDFcWrW","5iGN5ulk41",
+"9iGoT55rfB","uQIczCdyBV","x3LDeZhwG1","oQ87ruAWyp","ReKEWS77LH","lH1ktgf8rI","Dz1R3FVMxo","gjUTunlaBy","EdBKc9eoRc","pvgjSEdBKc",
+"Pb1pacShY2","Q6hMCY1mC0","fcwDa7Ow5C","v2eC3fcJOy","wiHrZ2Nslm","2ZHdkbgJAz","n8pJ9ix74r","EdBKcUmaEv","fqypyzQt6Q","jS1ajBGaQY",
+"2ZHdkFFDui","uAWypQChxs","HRxd8Twano","yvOMIyofH3","v8yFNBpYhV","kZANmt59lR","VjCZqW7cTs","JIqXiEOE1o","MezSWU3yw5","lsQGoRxrsm",
+"FwEJzKZamH","RkQkeQWxoT","RsQUqsoy9t","zHF1qqaofN","29QAzfLNg8","KsjRKEdBKc","7X3uyO3iyQ","SmGzv9eoRc","580YDzHF1q","OxWIHTCgPp",
+"jS1ajhSSvQ","8U2nU5ZaEz","Q6hMCt98iW","ZuDtDEdBKc","prNT6SmGzv","SWfouLbRTH","7lUXZ0YAGH","U3yw5zHF1q","4QMc9OUYuF","FPfSEuJScX",
+"AkKTkUmaEv","WaWsv5VZjS","0PktIoVQp6","blLA9RzaZA","s93MlVIlwP","ZuDtDuTacx","n1pmODG4sT","gtCA5C2Irc","ZhwG1XflUq","wiHrZNhXdu",
+"5iGN5AIYUu","0KyfsCqqaD","ThjNnk85Ae","gdQsSQClRL","AgJHQ0Wr5y","5ZaEz64s8N","FxX9qs93Ml","lH1ktYOfrY","zqH0WjiVBP","cShY2y94nw",
+"ZJTXHCIShG","kB5nPzQt6Q","NAFuwRkQke","aL6AJCNHmv","rKDLJNo0Qb","n8pJ9jfREu","uTacxfmIK1","HfyNQcL0aE","VIlwP2DREs","4W0TlrKDLJ",
+"sqVrfHP433","azIWpRmDcr","7fKYUxciqp","lH1ktAmdQd","Oz8yZciuWz","JJs5mWMiS3","NhXdutl72W","RxrsmZuDtD","bgJAzuAWyp","pAhR1POUYS",
+"SmGzvFFDui","BbwgAoVQp6","RzaZAd85a9","JkzUn4dEz6","5VZjSGv3Fq","qaofN55rfB","IjTwPb29RJ","5nmWvjfREu","mX2GEmX2GE","JIqXiZuDtD",
+"VerEAjtn0X","vLsmSHRxd8","iB08lS2Dfu","pvgjSogLgc","4W0Tl9y4lw","Oz8yZTXQ0Z","AkKTkFcWrW","s4786HfyNQ","pvgjSHlUbF","FwEJzFPfSE",
+"v8yFN6AFT0","zbIYYP6bcg","7lUXZuPX7G","MK07YdQ586","gIYvEF6PT2","3weIFpiJSk","O3iyQcmXIX","aFFssaDGtS","580YDl83Ud","9GXkXyEfy9",
+"uN6r3iqv4k","RmDcrS77LH","s93MlfFDrJ","QClRLGWqqX","J2mQini2v1","GWqqXWMiS3","NAFuwsoy9t","0MR5XWPmlx","o8UydrKDLJ","xXTI4POUYS",
+"fcJOyyToGW","qQxHPCdyBV","FFDui64s8N","yofH31LB1L","SmGzvVjCZq","NAFuw07n1c","v1Hlnxciqp","JIqXiFFDui","AmdQdCp3mZ","CIShGdQ586",
+"RkQkeYOfrY","UmaEv8TxD7","Z4I1vGSQwj","ECMvUGSQwj","IRh489iGoT","uTacxZhwG1","7hyVv7hyVv","16lHcd85a9","uN6r3RACuj","AOgEelkMUA",
+"2ZHdk9y4lw","I7p2aazIWp","t59lR5Drn0","FVMxoBbwgA","MK07YciuWz","Oz8yZ8FmFH","kB5nPZUnqt","9iGoTZUnqt","pWiOsuvf7A","pv0i7MojnP",
+"BCxeCtuDyS","DcpWB5Drn0","TCgPpMezSW","dQ586sx5Gl","QClRLHRxd8","HzZT88TxD7","a00b52DREs","9y4lwru4UG","580YDhe9IA","0h1b1Oz8yZ",
+"Dz1R3hSSvQ","MaJQscQOnv","FnPFB0ao3l","s4786fcJOy","48cHLokgRi","1j5L8ksJby","ZUnqtZzJHW","cmXIXWaim6","Waim6fLNg8","UmaEvatef2",
+"MGlTFI7p2a","v2eC3aL6AJ","J2mQitAOsr","lCMxy618Di","uupzkFFDui","zY1GYS77LH","P6bcgZhwG1","bZLvSUl4a1","d7vjM0Wr5y","lweGyvkCHH",
+"FNYIMJIqXi","5VZjSokgRi","gf8rILDk6f","sqVrfrz7Ut","aDGtSuLtKs","MezSWJ2mQi","rKDLJVerEA","he9IA24ARF","blLA9d85a9","ZzJHW7fsYM",
+"Nxx9VMkgy8","ydG8UzQt6Q","M3zXLe6e4z","uJScXTXQ0Z","WreyPReKEW","9rlg9RmDcr","s4786AkKTk","4QMc9d7vjM","MGlTFJXljW","sx5GlDz1R3",
+"tjQxs5Mg9r","guMb8tl72W","PYBf4aL6AJ","3weIFGXdoH","s93MlC2Irc","hi5X7MK07Y","Ta8f6AIYUu","XyPZNM6qcG","6AFT0zY1GY","EOE1ov8yFN",
+"pFrrlx3LDe","In3NSCK5W7","2Yz7EThjNn","7Ow5CRzaZA","OxWIHcmXIX","580YDcShY2","AOgEev2eC3","m4bxU0ao3l","HfyNQ29QAz","JkzUnDcpWB",
+"gtCA5CqqaD","6AFT0yToGW","ix74rCdyBV","yToGWx3LDe","2NslmaFFss","O3iyQt98iW","64s8NfmIK1","9y4lwyToGW","64s8NK20wK","oQ87rfLNg8",
+"FcWrW0PktI","n8pJ9lpF6W","UlU3M8TxD7","5Drn0tlILt","kZANmgtCA5","FwEJzoGu6x","JkzUnRpBQm","24ARFtl72W","cShY28cVD3","SWfouzqH0W",
+"wDajX3weIF","RkQke8hJdt","DcpWBWaim6","X6PinbZLvS","jeskSaFFss","6AFT0bZLvS","yluBxDG4sT","2hEEUuTacx","RpBQmguMb8","Yw2oUaez9y",
+"RmDcrhYBCK","4QMc9NAFuw","cQOnvW3VFH","ni2v1v1Hln","OUYuFhe9IA","AIYUuLewvM","t98iWEdBKc","rz7UtlweGy","hE1QlAkKTk","7fKYUO3iyQ",
+"AXpwE07n1c","FLsphhe9IA","NOHszsuY4x","Waim6XflUq","JRJQBuTacx","he9IAnnP8o","zmLYDvLsmS","F6PT2CqqaD","U3yw55Drn0","CqqaDTXQ0Z",
+"ydG8UhSSvQ","Yf2Ecjtn0X","ThjNn5Mg9r","xReecrz7Ut","prNT6OHaBz","h1zcHi3pyd","2Yz7EIKxdL","yluBx5VZjS","K20wKix74r","nFqikksJby",
+"0BmCyCNHmv","XflUqSjskQ","cmXIXhUTw7","jtn0XWaWsv","YjB9tFLsph","HfyNQIKxdL","AIYUue6e4z","24ARF0ao3l","W7cTsjiVBP","4dEz6ciuWz",
+"KASQ8618Di","CK5W7cShY2","RsQUqyluBx","Vprf2Cfgr3","FPfSEpFrrl","P6bcgnlaBy","VIlwPy94nw","uJScXcShY2","hSSvQfaHir","d7vjMa00b5",
+"Ul4a1s7Mxk","JXljWtAOsr","ix74rXyPZN","MmsIohSSvQ","5iGN5JkzUn","Ta8f6rKDLJ","AXpwEMm8si","XyPZNfqypy","uZPqg5Namm","vLsmS5IhmG",
+"mX2GEVerEA","AgJHQ1LB1L","5Namm29QAz","CxVEfWMiS3","azIWpLbRTH","ZuDtDFjHXR","Z4I1vZuDtD","pv0i7n1pmO","14FLRGSQwj","Cfgr38xEKz",
+"n1pmOzHF1q","wDajX9y4lw","s7MxkNOHsz","W7cTstjQxs","MezSWUl4a1","yvOMI7hyVv","MojnPW7cTs","Rxrsmaez9y","cQOnvpWiOs","TwanoStlDJ",
+"WmadAqQxHP","Cp3mZdmoS7","VjCZqgtCA5","ZuDtDZ4I1v","lweGy5Namm","zqH0WIRh48","fqypyWMiS3","AmdQd5VZjS","4dEz6VjCZq","dpe1vh1zcH",
+"Mm8sisuY4x","oVQp68TxD7","LbRTHWreyP","Ss0ZutjQxs","uoStwzz4ZU","WreyPFGzgp","8TxD7Ss0Zu","ZuDtD07n1c","s7MxkUlU3M","NAFuw8cVD3",
+"Ss0Zu3weIF","Mkgy80ao3l","ZzJHWF6PT2","FPfSExReec","JIqXitAOsr","In3NSwDajX","Mm8sicL0aE","ni2v1JRJQB","bZLvSyEfy9","hE1Ql2Nslm",
+"RkQke55rfB","FjHXRwDajX","X6Pinn8pJ9","lm0pD6AFT0","ZUnqtIRh48","DG4sTqUJMd","pv0i7DLhzM","HzZT85nmWv","5NammQ6Lix","v1HlnRkQke",
+"cQOnvuTacx","zz4ZUW3VFH","MezSWv8yFN","8cVD32ZHdk","ZuDtDHlUbF","8xEKzdmoS7","i3pydCxVEf","s4786h1zcH","dQ586CK5W7","uvf7AWaim6",
+"zY1GYWDVWJ","ECMvU4dEz6","tjQxsZ4I1v","VBjhznFqik","cShY2tAOsr","8RCUAGSQwj","h1zcHsqVrf","v1HlnUmaEv","IBe8kMezSW","rz7UtZuDtD",
+"BFkb8SjskQ","e6e4zKsjRK","9eoRcTa8f6","7ku1pix74r","Mkgy8IjTwP","qUJMd8FmFH","VNCPdrKDLJ","TCgPp5IhmG","Cp3mZ5VZjS","yToGW8FmFH",
+"e6e4zSs0Zu","Fhtgl2TRI7","XflUq0MR5X","pvgjS6AFT0","LewvML7cGc","MojnPChuy3","07n1cGrDg7","oQ87rFwEJz","rz7UtbrhlQ","nlaByfFDrJ",
+"9GXkXHRxd8","AkKTko8Uyd","WPmlxulk41","m4bxUfcJOy","xciqp7lUXZ","5Drn03otm6","0Wr5yLewvM","0Wr5yuQIcz","dQ586pv0i7","M6qcGbrhlQ",
+"QbxXcgjUTu","OUqFMNxx9V","zHF1qjiVBP","7X3uyiB08l","aFFss9rlg9","kZANmDz1R3","9y4lwtAOsr","MGlTFDLhzM","uvf7Agf8rI","MaJQsM3zXL",
+"K20wKBGaQY","SWfoui7WMQ","x3LDe2TRI7","d85a9B3qem","FcWrW9iGoT","D6rByOHaBz","YOfrYpvgjS","3otm6sx5Gl","OUYuFv2eC3","y94nwL7cGc",
+"QssNCMGlTF","2Yz7E5nmWv","Q6hMChYBCK","OUqFMB3qem","uLtKsReKEW","jfREu5Mg9r","NcICA0Kyfs","J2mQiQbxXc","uLtKspFrrl","pvgjSYOfrY",
+"RBhp07fKYU","dmoS75drc6","HzZT84QMc9","pAhR1U3yw5","4dEz68FmFH","qUJMdGv3Fq","vkCHHyvOMI","d7vjM7Ow5C","S77LHatef2","OxWIHFxX9q",
+"IKxdLWmadA","taOXKyluBx","mX2GEsx5Gl","JKWYRuupzk","ix74rhE1Ql","suY4xK4GS8","sx5GlcL0aE","mz8gx48cHL","CxVEfW7cTs","RkQkes4786",
+"Ul4a1WreyP","S77LHGSQwj","ni2v1s7Mxk","K4GS8NAFuw","0h1b1OUYuF","Ss0ZuFjHXR","ECMvU5Namm","ReKEWFxX9q","LDk6fDG4sT","FnPFByToGW",
+"soy9tUvlv4","VLTy6Cfgr3","EOE1oyluBx","LewvM9eoRc","brhlQDz1R3","Ta8f6HfyNQ","cmXIXY1mC0","5Drn0AkKTk","JIqXiMGlTF","9GXkXi3pyd",
+"HlUbFFxX9q","9GXkXVBjhz","oGu6xY1mC0","G1RhSpFrrl","FPfSEECMvU","EdBKcfLNg8","tAOsrYjB9t","mz8gx0PktI","HlUbFUlU3M","PYBf4iB08l",
+"rKDLJGrDg7","GXdoHDz1R3","uPX7GM3zXL","5ZaEzUmaEv","Kr8ysAOgEe","tuDySGSQwj","KZamH5ZaEz","TXQ0Za00b5","QWxoTyEfy9","jS1aj45cIH",
+"uTacxblLA9","oVQp60PktI","7fKYUfaHir","Yf2Ec14FLR","tl72WqQxHP","WmadAtlILt","GXdoHa00b5","guMb8JJs5m","3weIF580YD","hE1QlhYBCK",
+"pv0i7FFDui","6q6L9NAFuw","7X3uyOz8yZ","GrDg7s93Ml","CqqaDfcJOy","n8pJ9x3LDe","WMiS32Yz7E","rKDLJUl4a1","brhlQJXljW","hi5X7sx5Gl",
+"JRJQBQnJ1S","8cVD3jeskS","F6PT2zFgtB","07n1cNhXdu","0MR5XTwano","1LB1L5VZjS","IBe8klsQGo","BFkb8jfREu","RACujCNHmv","sx5GloGu6x",
+"m4bxUqUJMd","DcpWBRmDcr","TCgPpFPfSE","YOfrYfcJOy","UmaEvVjCZq","M6qcGpT8wu","pAhR1v8yFN","BbwgAAkKTk","OxWIHd85a9","b29RJmX2GE",
+"yofH3taOXK","AmdQdNo0Qb","oVQp6i7WMQ","dQ586ix74r","rz7UtVerEA","i3pyd9y4lw","lpF6WSWfou","ix74rRzaZA","8hJdttlILt","07n1cDz1R3",
+"JJs5msoy9t","FwEJzVLTy6","uAWypCNHmv","s93MlpT8wu","blLA9Ss0Zu","vLsmSd7vjM","M6qcGciuWz","NAFuwpFrrl","dpe1vF6PT2","s93MlvkCHH",
+"v1HlnKZamH","7fsYMOxWIH","0Wr5ySbRYy","h1zcH2Yz7E","pWiOsnFqik","aez9y5nmWv","d7vjM2DREs","Pb1pazbIYY","64s8N5Mg9r","5NammZ4I1v",
+"Vprf2k85Ae","MmsIo8FmFH","bgJAzNo0Qb","FGzgpcmXIX","e6e4zzY1GY","618DiXflUq","Fhtgl580YD","pmeCdfaHir","yvOMIG1RhS","QYxC0pAhR1",
+"48cHLtuDyS","lXFOBuvf7A","EOE1oL7cGc","2ZHdkKZamH","n1pmO6q6L9","uAWypAkKTk","BGaQYwiHrZ","uTacxNOHsz","RpBQmsx5Gl","VBjhzhE1Ql",
+"atef2iB08l","FVMxotl72W","ydG8U7lUXZ","5nmWvWaWsv","he9IABpYhV","h1zcHIKxdL","jzUqRazIWp","cQOnvKASQ8","lH1ktUl4a1","d85a9SWfou",
+"AOgEeGSQwj","POUYSTa8f6","TXQ0ZCqqaD","QChxs3otm6","azIWp8cVD3","3otm6aL6AJ","TXQ0ZPb1pa","rz7UtKASQ8","QssNCgtCA5","he9IALDk6f",
+"pFrrllCMxy","m4bxU8cVD3","2hEEUB3qem","U3yw5WreyP","iqv4ksuY4x","FxX9qlsQGo","oGu6x5Mg9r","ReKEWStlDJ","lm0pDJKWYR","GXdoHFjHXR",
+"SWfou0Kyfs","wDajXP6bcg","OUqFMFPfSE","wDajX6AFT0","24ARFd7vjM","WDVWJCxVEf","Y1mC0e6e4z","B3qem9XyT9","nFqikVjCZq","2NslmDQimp",
+"bZLvSQ6hMC","ZuDtDNAFuw","JJs5mqQxHP","gf8rIQWxoT","5IhmG07n1c","Fhtgl55rfB","e6e4zX6Pin","IRh48wDajX","oQ87rK4GS8","7ku1ps7Mxk",
+"uJScXcmXIX","HzZT8dQ586","SjskQydG8U","5iGN5guMb8","9iGoTyofH3","4W0TlMGlTF","WaWsvS77LH","DcpWBuPX7G","UmaEvuLtKs","NOHszlCMxy",
+"uupzk9eoRc","AmdQdNhXdu","aez9ytuDyS","ThjNnt59lR","zHF1qblLA9","ZzJHWBFkb8","Ul4a1RmDcr","a00b5In3NS","QworuDQimp","HRxd8tvdkD",
+"7hyVvNOHsz","EdBKctaOXK","rz7UtECMvU","y94nwhe9IA","HlUbFFPfSE","MK07YuTacx","guMb8tvdkD","AOgEei7WMQ","9y4lwZ4I1v","WreyPGSQwj",
+"9rlg9HRxd8","AmdQdWPmlx","lweGyYjB9t","QClRLDz1R3","uTacxRACuj","FGzgpLbRTH","4dEz616lHc","DLhzMFhtgl","pFrrlVprf2","tuDySqQxHP",
+"OxWIH7hyVv","aDGtSIBe8k","Mm8siFVMxo","QnJ1Sfqypy","GWqqXFcWrW","7lUXZ1v5hH","I7p2asx5Gl","lkMUAuupzk","ZuDtDNxx9V","JJs5mMm8si",
+"pvgjSFwEJz","zHF1qUl4a1","m4bxUJRJQB","MaJQsoQ87r","5Namm8TxD7","CqqaDIRh48","zFgtBtaOXK","6q6L9Nxx9V","lj07QsuY4x","rKDLJFGzgp",
+"okgRiru4UG","5nmWveuZA5","MmsIorKDLJ","suY4x8xEKz","RsQUqjSjS3","K4GS86AFT0","Waim6BbwgA","QnJ1ShYBCK","RpBQm2Yz7E","6q6L9s7Mxk",
+"XyPZNeuZA5","i3pyd1LB1L","YOfrYSs0Zu","1j5L8kB5nP","JXljW2ZHdk","0Wr5yfLNg8","QChxsbZLvS","8FmFHVprf2","BGaQYDLhzM","ThjNntjQxs",
+"618DihE1Ql","yToGWNOHsz","9GXkXS2Dfu","2Yz7ECqqaD","gIYvEK20wK","d7vjMhYBCK","jfREuDcpWB","VLTy6CqqaD","k85Ae8RCUA","vLsmS5Drn0",
+"BbwgAcmXIX","9rlg9hi5X7","WPmlxWDVWJ","HP433yluBx","y94nwDG4sT","3otm6GSQwj","OUqFM7Ow5C","ix74rDQimp","FNYIMEoToP","MmsIoK20wK",
+"8TxD7djsrv","FhtgllsQGo","pv0i7Rxrsm","ECMvUPb1pa","jS1ajiqv4k","Y1mC03otm6","xReec2DREs","RxrsmuJScX","DQimpzHF1q","X6PinAOgEe",
+"3weIFtvdkD","vLsmSazIWp","RkQkeEoToP","9eoRc8TxD7","5IhmGUmaEv","OxWIHguMb8","SWfouQbxXc","v2eC3cL0aE","VerEA2Yz7E","8U2nUtuDyS",
+"VjCZqMmKGJ","Q6hMCIRh48","fFDrJCfgr3","7fKYUJRJQB","JkzUnZv7z0","hi5X7RmDcr","RACujtuDyS","No0QbCIShG","Ul4a1gIYvE","Z4I1vgf8rI",
+"CqqaDXyPZN","QssNCjS1aj","fLNg8okgRi","JRJQBQworu","iwzGkd85a9","580YD8cVD3","In3NSyofH3","Cfgr3GXdoH","XflUquQIcz","7Ow5CpFrrl",
+"v2eC38RCUA","dhSuH2hEEU","rz7UtIn3NS","VerEAv2eC3","0YAGH4W0Tl","tl72WyToGW","pAhR1Ul4a1","xciqpi7WMQ","Y1mC0QWxoT","IKxdLjSjS3",
+"Ss0ZuuLtKs","Uvlv4XyPZN","gjUTuhe9IA","Q6hMCtaOXK","sx5GlpiJSk","okgRiNcICA","WMiS3Yw2oU","zFgtB1j5L8","lpF6WmX2GE","fLNg8P6bcg",
+"fcwDa9y4lw","618Dihi5X7","e6e4zTa8f6","uPX7GlXFOB","vkCHHoVQp6","DLhzMXflUq","F6PT2M6qcG","brhlQmz8gx","dQ586JkzUn","suY4xzqH0W",
+"hYBCK4W0Tl","JkzUnOz8yZ","QnJ1Satef2","QnJ1SksJby","uTacxJXljW","FwEJzlXFOB","3weIFYf2Ec","bgJAz2hEEU","QnJ1SDLhzM","jS1ajjSjS3",
+"fFDrJtvdkD","W7cTsDLhzM","6AFT0J2mQi","6q6L9cQOnv","KASQ8D6rBy","uAWyplCMxy","VIlwPfFDrJ","64s8NFhtgl","WPmlxnFqik","RBhp0zY1GY",
+"WreyP0PktI","kZANmECMvU","vLsmSzQt6Q","Mm8sirhl0J","HRxd8yofH3","l83UdKr8ys","ksJby0BmCy","yluBxix74r","vOqCEBbwgA","gtCA5YjB9t",
+"WaWsvJ2mQi","Zv7z0n1pmO","l83Udv8yFN","Ta8f60ao3l","ZzJHW1j5L8","yofH3jSjS3","k85AegIYvE","BbwgAtlILt","fcJOyMm8si","Yw2oUGv3Fq",
+"9eoRcvOqCE","BFkb80YAGH","FNYIMAkKTk","lkMUADLhzM","sqVrfSjskQ","Yw2oUDG4sT","azIWprhl0J","VLTy6nFqik","jSjS3CIShG","DLhzMAkKTk",
+"k85AejfREu","uZPqgjSjS3","zmLYDgjUTu","Pb1paUmaEv","i7WMQiB08l","YOfrYJKWYR","8RCUAdpe1v","CIShGCxVEf","CK5W7mz8gx","BCxeC48cHL",
+"7fKYURBhp0","e6e4zUmaEv","7fsYM1LB1L","e6e4zG1RhS","cmXIXzY1GY","kZANmMm8si","AXpwEVIlwP","nnP8o2ZHdk","ZhwG1580YD","Mm8siBFkb8",
+"tuDySMkgy8","sqVrfYw2oU","cmXIXNOHsz","tl72WK4GS8","0BmCyWDVWJ","lH1ktlweGy","0YAGHRxrsm","X6Pinmz8gx","MojnPs93Ml","zmLYDUlU3M",
+"ru4UGuJScX","KZamHwDajX","EOE1ofFDrJ","JRJQBBCxeC","kZANm48cHL","WaWsvBpYhV","yEfy98hJdt","jtn0XzbIYY","8U2nUNxx9V","uoStw45cIH",
+"Mkgy8JJs5m","580YDUl4a1","4dEz6Yf2Ec","zQt6QLbRTH","5IhmG0Wr5y","45cIHtuDyS","UmaEv3weIF","RBhp024ARF","sx5Gl1LB1L","xReec07n1c",
+"e6e4zHlUbF","S77LHmz8gx","tuDySRsQUq","iwzGkpAhR1","5IhmG8TxD7","sqVrfOxWIH","5drc6Kr8ys","7lUXZIjTwP","FwEJznnP8o","EOE1ouQIcz",
+"Ss0Zu1j5L8","FLsphqaofN","UmaEvuTacx","he9IAVBjhz","8cVD3oGu6x","euZA5ulk41","I7p2aulk41","AmdQd618Di","rz7UtCqqaD","AgJHQIjTwP",
+"JIqXilH1kt","he9IAydG8U","o8UydWaim6","JXljWGSQwj","fFDrJzQt6Q","pvgjSpAhR1","hi5X7FxX9q","O3iyQyluBx","MezSWKASQ8","I7p2arhl0J",
+"mz8gx8RCUA","2Yz7EGXdoH","OHaBzsuY4x","i3pyddjsrv","XyPZNix74r","djsrv9rlg9","brhlQG1RhS","prNT6pAhR1","guMb8WDVWJ","HP433hE1Ql",
+"2ZHdk8cVD3","HRxd8uoStw","D6rBy1LB1L","nFqikVBjhz","In3NSuN6r3","QssNCs7Mxk","uvf7Auupzk","WaWsvLewvM","Ta8f6ZUnqt","kZANmazIWp",
+"xXTI4yluBx","AXpwEReKEW","G1RhSaez9y","VIlwPm4bxU","5drc6OxWIH","KZamHKr8ys","t98iWSs0Zu","DLhzMBCxeC","rz7UtrKDLJ","ReKEWrhl0J",
+"zQt6QiKqhr","FxX9qW7cTs","DG4sT45cIH","uTacxwiHrZ","EoToP07n1c","MmKGJDcpWB","ZuDtDt59lR","VBjhztl72W","2DREsVLTy6","FxX9q7X3uy",
+"o8UydblLA9","uTacxCp3mZ","QworuMK07Y","uZPqgGv3Fq","4W0Tls7Mxk","hYBCKAkKTk","gtCA5Q6hMC","nlaByrKDLJ","lkMUArz7Ut","9XyT9RBhp0",
+"ZJTXHnFqik","OUqFMpAhR1","tlILtK20wK","Yf2EcjSjS3","FPfSEiwzGk","5Drn00PktI","J2mQiqaofN","JJs5m5drc6","0MR5XJKWYR","jeskSQssNC",
+"CxVEfVjCZq","CNHmvxXTI4","hi5X7GWqqX","blLA9rKDLJ","rKDLJtjQxs","lsQGoyvOMI","RACujUlU3M","7hyVv8TxD7","djsrvWmadA","x3LDeGrDg7",
+"IRh48yToGW","VLTy6XflUq","Dz1R35drc6","EdBKcqQxHP","jeskS9eoRc","soy9t0MR5X","zY1GYLbRTH","QworuIjTwP","Y1mC0lCMxy","1v5hHRzaZA",
+"gdQsSFhtgl","DLhzM9rlg9","Gv3Fqv1Hln","FnPFBJ2mQi","7lUXZt98iW","Ul4a1YjB9t","lXFOBt98iW","gf8rIFhtgl","fcJOy7fKYU","618Dipv0i7",
+"2hEEUJ2mQi","iqv4kMezSW","K20wKEdBKc","OUqFMI7p2a","MezSWciuWz","RpBQmlweGy","fqypygdQsS","HRxd8SjskQ","MaJQsKsjRK","FGzgpMkgy8",
+"5Namms7Mxk","lH1ktNhXdu","K4GS8ReKEW","yEfy9yToGW","ReKEWMK07Y","JKWYRJRJQB","lpF6WAmdQd","hSSvQTXQ0Z","uZPqgVjCZq","yToGWDG4sT",
+"xciqphi5X7","iqv4k7hyVv","ogLgcRsQUq","W3VFH9eoRc","29QAz5nmWv","s7MxkZuDtD","uZPqg16lHc","d85a9Fhtgl","WPmlxQClRL","oVQp6RBhp0",
+"Y1mC0brhlQ","ni2v1WaWsv","qQxHPNcICA","ix74r4W0Tl","fcwDaYw2oU","WDVWJ618Di","0Wr5yHRxd8","2ZHdkuLtKs","zY1GYQ6hMC","ECMvUTwano",
+"zQt6QwDajX","QClRLpFrrl","cShY2JkzUn","aL6AJ16lHc","faHirOxWIH","LewvMrKDLJ","nlaByYh1hF","QssNC9y4lw","XyPZND6rBy","zHF1qY1mC0",
+"uN6r3QWxoT","Rxrsm24ARF","hi5X7Zv7z0","lj07QSWfou","FjHXROxWIH","pFrrlK4GS8","D6rBys93Ml","atef25nmWv","8TxD7SbRYy","VBjhzx3LDe",
+"OxWIHGSQwj","cL0aEsx5Gl","QChxsrz7Ut","xReecGrDg7","h1zcHtuDyS","64s8NlCMxy","5ZaEzIKxdL","ni2v1taOXK","iKqhrlkMUA","RxrsmuN6r3",
+"Q6LixThjNn","LDk6fjS1aj","uPX7GQChxs","cQOnvBFkb8","ReKEWYh1hF","l83UdjS1aj","n8pJ9o8Uyd","ZzJHWYjB9t","uvf7AXflUq","blLA9DQimp",
+"tAOsrKsjRK","9eoRcAmdQd","uAWypNAFuw","StlDJy94nw","KsjRKI7p2a","yluBxCK5W7","FNYIMQworu","cShY2RmDcr","POUYStAOsr","0Kyfs2hEEU",
+"pvgjSpmeCd","Q6hMC7hyVv","yofH3FFDui","07n1cjfREu","cmXIX14FLR","ZJTXHe6e4z","lCMxy8TxD7","NcICAFGzgp","618DiW7cTs","1v5hHvOqCE",
+"WmadAZuDtD","lkMUAs7Mxk","fmIK15iGN5","VLTy68FmFH","8TxD7pAhR1","2TRI7ksJby","euZA5v2eC3","KASQ8hUTw7","7fsYMlweGy","iqv4kgjUTu",
+"yluBxhE1Ql","Chuy39y4lw","WMiS3ReKEW","yluBxRkQke","55rfBKZamH","suY4xIBe8k","oGu6xt98iW","0Wr5yAkKTk","djsrvFGzgp","KsjRKEOE1o",
+"48cHLK20wK","16lHcI7p2a","xReec9eoRc","zmLYDF6PT2","0Wr5ypiJSk","euZA5pvgjS","0MR5Xy94nw","Zv7z0JXljW","8cVD3M3zXL","IRh48sqVrf",
+"uQIczM6qcG","5drc6ZzJHW","dhSuHDG4sT","29QAzazIWp","CxVEfuvf7A","hi5X7In3NS","Yf2EcAOgEe","HP433NAFuw","VLTy6l83Ud","nnP8oni2v1",
+"suY4xiqv4k","dQ586QssNC","iKqhrJIqXi","tvdkD7lUXZ","VNCPd7lUXZ","TCgPpRsQUq","Oz8yZuupzk","blLA9dhSuH","0MR5Xaez9y","VIlwPX6Pin",
+"Yh1hFX6Pin","ogLgcoQ87r","Ta8f68FmFH","Q6hMCJKWYR","3weIFlweGy","TXQ0ZeuZA5","cL0aEjiVBP","M6qcGguMb8","taOXKYf2Ec","W7cTscQOnv",
+"ogLgc618Di","Y1mC0Q6Lix","U3yw5YjB9t","RBhp0oGu6x","v1HlnTa8f6","5IhmGMkgy8","yEfy9fcwDa","azIWpL7cGc","fFDrJogLgc","StlDJvOqCE",
+"lXFOBs4786","FLsph9eoRc","JkzUnlXFOB","7fsYMaL6AJ","4QMc9pT8wu","jtn0X8RCUA","JkzUn0Kyfs","s93MlRBhp0","EOE1oRsQUq","t98iWJkzUn",
+"lweGyqUJMd","CIShGiwzGk","hYBCKG1RhS","VIlwP5drc6","FhtglnFqik","hYBCK8FmFH","gIYvEtl72W","cQOnvzY1GY","vOqCEDQimp","X6PinlXFOB",
+"ZUnqtdQ586","cL0aEd85a9","ReKEWVprf2","7Ow5CQworu","7Ow5CBCxeC","lCMxyJkzUn","ogLgck85Ae","uTacxzmLYD","G1RhSNhXdu","i3pydGrDg7",
+"WreyP0MR5X","Chuy3Uvlv4","6AFT0tjQxs","lj07QFwEJz","VLTy6bZLvS","dQ586RBhp0","FnPFBdmoS7","9iGoT1LB1L","fcJOyAkKTk","64s8NIn3NS",
+"RzaZAS77LH","xciqppAhR1","Gv3Fq1v5hH","In3NSuoStw","piJSkzqH0W","pmeCdiqv4k","48cHLVNCPd","zqH0Wfqypy","yluBxtaOXK","FxX9qfcJOy",
+"tvdkDs93Ml","gtCA5WaWsv","pFrrlNOHsz","MGlTF7hyVv","zHF1qFFDui","2hEEUStlDJ","OUYuF2hEEU","FPfSEMmsIo","zY1GYuupzk","atef2vLsmS",
+"v8yFNaFFss","jzUqRMojnP","FLsphfcJOy","OxWIHazIWp","7Ow5C7lUXZ","FjHXRfcwDa","6q6L9WDVWJ","WMiS3taOXK","v2eC3BbwgA","8TxD7a00b5",
+"xciqpDQimp","Ss0Zu1LB1L","WPmlxMezSW","d7vjMuN6r3","7hyVvfFDrJ","soy9tWaWsv","IjTwPqaofN","i3pydnFqik","iwzGkokgRi","4dEz6aFFss",
+"Mm8si5Drn0","4QMc9QChxs","Uvlv4ZhwG1","RACujdpe1v","0MR5XIn3NS","7lUXZHP433","he9IAQYxC0","dQ586uQIcz","dQ586o8Uyd","WmadAlm0pD",
+"iKqhrBGaQY","SbRYyrKDLJ","DQimpAIYUu","y94nwFhtgl","JIqXiiB08l","LDk6fIBe8k","l83UdGrDg7","uPX7G5IhmG","dmoS71v5hH","Kr8ys8FmFH",
+"t98iWsoy9t","0BmCyZzJHW","m4bxUO3iyQ","nlaBypT8wu","55rfByluBx","WaWsvLDk6f","Mm8siM3zXL","hUTw7IBe8k","DLhzMx3LDe","EdBKcjSjS3",
+"m4bxUUlU3M","AXpwEtjQxs","GWqqX48cHL","9rlg9kB5nP","55rfBPb1pa","oGu6xa00b5","jiVBP9rlg9","uN6r3suY4x","0MR5XRmDcr","618DiVNCPd",
+"uvf7AaDGtS","6q6L9B3qem","W7cTsC2Irc","lpF6WFjHXR","dhSuHlkMUA","IKxdLYf2Ec","tjQxs8TxD7","kB5nPVprf2","JIqXi4dEz6","StlDJTXQ0Z",
+"oVQp6dmoS7","FNYIMRkQke","9iGoTChuy3","lj07Qk85Ae","MezSWGv3Fq","Pb1paNAFuw","BbwgAprNT6","4QMc98FmFH","uAWypIn3NS","D6rByiwzGk",
+"d85a98U2nU","RkQkepv0i7","0Wr5yM6qcG","PYBf4cmXIX","0PktI5drc6","D6rByEoToP","kB5nPMkgy8","2TRI7U3yw5","Dz1R3FnPFB","CdyBVGrDg7",
+"i3pydCfgr3","1LB1L9y4lw","8RCUAZ4I1v","MmKGJcShY2","KASQ8vLsmS","iKqhrciuWz","RpBQmU3yw5","lsQGoSmGzv","9iGoTIBe8k","ru4UGKr8ys",
+"s4786bgJAz","5VZjS2DREs","AkKTkQYxC0","5IhmGjeskS","qQxHPChuy3","MK07YOz8yZ","I7p2aG1RhS","kZANmru4UG","SbRYyRBhp0","uQIczcShY2",
+"7Ow5CIBe8k","Waim6ZUnqt","jS1ajDG4sT","yvOMI9rlg9","SmGzvh1zcH","yEfy9CIShG","DLhzM7hyVv","LbRTHRkQke","LewvM7lUXZ","he9IAAgJHQ",
+"nFqikFxX9q","JXljWFcWrW","Y1mC0XflUq","EdBKcpAhR1","VNCPdYw2oU","jSjS37fsYM","DG4sTeuZA5","Ta8f6VBjhz","SmGzvLbRTH","4W0Tl5Mg9r",
+"VerEAHzZT8","DLhzMd7vjM","jSjS3YOfrY","WmadAqUJMd","YjB9tKASQ8","Qworusoy9t","No0QbChuy3","VBjhzLewvM","J2mQipWiOs","fmIK1YOfrY",
+"In3NSZv7z0","UmaEvYOfrY","gIYvEuQIcz","RzaZAPOUYS","618DiHzZT8","gdQsSI7p2a","Ul4a1AkKTk","5Mg9rAkKTk","CqqaDSbRYy","TXQ0Zsx5Gl",
+"2ZHdkRsQUq","8TxD7WMiS3","7ku1pWDVWJ","I7p2aMK07Y","W7cTsK20wK","ydG8UgjUTu","ksJbyYw2oU","GSQwjGWqqX","WPmlx8TxD7","48cHLDG4sT",
+"vkCHHRzaZA","hE1QlcShY2","oGu6xGv3Fq","t98iWAOgEe","uTacxQnJ1S","d85a9uQIcz","hSSvQv2eC3","P6bcgBbwgA","CIShGTwano","AXpwEsx5Gl",
+"gtCA5tlILt","iwzGk8U2nU","rhl0JYf2Ec","RzaZA4dEz6","ZzJHWC2Irc","CxVEfk85Ae","iB08lzz4ZU","DcpWBLbRTH","U3yw5FVMxo","Mm8siJkzUn",
+"FnPFB5drc6","LewvMPOUYS","9XyT9XflUq","4QMc9guMb8","he9IADG4sT","vLsmSQ6hMC","pAhR1KZamH","m4bxU0PktI","d7vjM9XyT9","NOHszuN6r3",
+"5iGN5ECMvU","PYBf4MezSW","sx5Gl29QAz","DG4sTbgJAz","fcwDa0YAGH","In3NSHP433","gdQsSGSQwj","MK07Ye6e4z","yluBxI7p2a","AXpwEFwEJz",
+"zHF1qVerEA","1v5hHoGu6x","dhSuHPOUYS","s7MxkqQxHP","fqypy7X3uy","soy9tGSQwj","QChxs2Nslm","AgJHQWPmlx","2TRI7SjskQ","SjskQdmoS7",
+"Yf2EcMaJQs","SjskQRsQUq","dhSuHFjHXR","Q6LixpvgjS","W7cTs0Wr5y","HP4334dEz6","zFgtBMkgy8","TXQ0Zmz8gx","9iGoTsoy9t","qQxHPuJScX",
+"AkKTkKsjRK","kZANmn1pmO","6q6L9qQxHP","ydG8UjiVBP","fmIK1RkQke","aL6AJs93Ml","0MR5Xo8Uyd","hSSvQQChxs","CK5W7MmKGJ","pv0i78xEKz",
+"FjHXR0Kyfs","fLNg8Y1mC0","29QAzkZANm","ZuDtDi3pyd","ogLgcUlU3M","hSSvQs93Ml","pv0i7nlaBy","X6PinReKEW","wDajXGrDg7","CxVEf24ARF",
+"cmXIXbgJAz","HfyNQgdQsS","QssNCQbxXc","HlUbFTCgPp","yEfy95Mg9r","Ta8f6djsrv","zz4ZU8TxD7","0KyfsCdyBV","1j5L8tuDyS","RsQUqtvdkD",
+"prNT6lweGy","okgRiFjHXR","lViBvcL0aE","zmLYDZv7z0","wDajXi3pyd","fmIK1n1pmO","QYxC0gtCA5","FxX9qBpYhV","zbIYYrz7Ut","AmdQd4W0Tl",
+"tl72Wl83Ud","lj07Q8hJdt","SjskQKASQ8","ReKEWMojnP","pvgjSo8Uyd","AIYUuCxVEf","WreyPWaWsv","brhlQoGu6x","7fKYUjzUqR","vkCHHThjNn",
+"zmLYDgtCA5","Q6hMC7fsYM","o8UydUlU3M","cL0aElm0pD","fmIK1AmdQd","gIYvExciqp","UmaEvFFDui","Mkgy8D6rBy","lXFOB5iGN5","2Yz7EaDGtS",
+"7ku1pv1Hln","v1HlnUlU3M","OUYuFt59lR","8cVD38FmFH","YOfrYguMb8","K20wKHzZT8","yofH3tAOsr","gtCA5NhXdu","kB5nP3weIF","Ul4a1MezSW",
+"1LB1LFLsph","U3yw5hUTw7","s93Mluupzk","POUYSVIlwP","FcWrWWPmlx","WDVWJh1zcH","Nxx9VcL0aE","cmXIXQworu","JkzUnGWqqX","oQ87r16lHc",
+"lweGyOUqFM","RBhp0VerEA","iKqhrP6bcg","tAOsri7WMQ","lweGyvLsmS","jS1aj7lUXZ","5Mg9rdmoS7","Yf2Ec45cIH","uZPqg0h1b1","WMiS3WPmlx",
+"soy9twiHrZ","BGaQYydG8U","zmLYDydG8U","hE1QlQbxXc","uJScX5ZaEz","lkMUAW3VFH","OUqFMpmeCd","oVQp6FcWrW","xciqpogLgc","suY4x5Mg9r",
+"0MR5X9rlg9","QYxC0MGlTF","lweGygdQsS","QworuGrDg7","mz8gxzmLYD","jfREu8xEKz","bZLvSaez9y","OUqFM48cHL","i3pydgf8rI","CqqaDMkgy8",
+"5Drn0sqVrf","QWxoTHzZT8","55rfB55rfB","he9IABbwgA","Ta8f6fcwDa","FhtgleuZA5","oQ87rjSjS3","SWfouciuWz","v8yFNlXFOB","5VZjS9rlg9",
+"VIlwPpiJSk","MojnP0ao3l","16lHcNOHsz","Yw2oUqaofN","OHaBzVNCPd","In3NSD6rBy","M3zXLzz4ZU","wDajXFwEJz","OUqFMhUTw7","Mm8siWaWsv",
+"3otm6B3qem","gtCA5xciqp","QWxoTlm0pD","JKWYRTwano","fmIK1fLNg8","bgJAzRkQke","Zv7z0HfyNQ","zz4ZU4W0Tl","D6rByJkzUn","ru4UGMezSW",
+"yluBxDLhzM","5Nammni2v1","Uvlv4OUqFM","jSjS3lm0pD","Cfgr3RmDcr","i3pydFNYIM","5nmWvK4GS8","aFFss29QAz","RzaZAFPfSE","CxVEfHzZT8",
+"7fsYM0Wr5y","dQ586Ul4a1","Cfgr32hEEU","2Nslmhi5X7","StlDJ48cHL","uvf7ApAhR1","DQimpydG8U","uupzkCp3mZ","Zv7z07fsYM","07n1cNxx9V",
+"MmsIo0MR5X","S2DfucShY2","AIYUuM6qcG","RBhp0gf8rI","3weIFzz4ZU","Q6Lixi7WMQ","zFgtB8TxD7","RpBQm7ku1p","fmIK1L7cGc","gtCA5Z4I1v",
+"GXdoHPYBf4","ru4UGvOqCE","hYBCKVBjhz","prNT6I7p2a","FcWrW8U2nU","1v5hHCp3mZ","8xEKzhUTw7","aFFss5ZaEz","Waim68FmFH","Mkgy8S2Dfu",
+"JIqXi0ao3l","v1Hln1j5L8","gdQsSThjNn","MmsIogIYvE","he9IAWaim6","qaofN8cVD3","s7MxkW3VFH","fLNg8pT8wu","ni2v14QMc9","pmeCdHzZT8",
+"8FmFHRsQUq","HzZT8taOXK","Pb1pa3weIF","Fhtgl14FLR","gjUTul83Ud","zFgtBTCgPp","ru4UGS2Dfu","Zv7z08TxD7","BCxeCm4bxU","6AFT0suY4x",
+"tuDySKZamH","14FLRyEfy9","CIShGBFkb8","AOgEe4dEz6","ECMvU0ao3l","X6Pinhe9IA","16lHcxReec","uoStwtjQxs","aFFsslm0pD","k85AeB3qem",
+"07n1cFhtgl","zFgtBRsQUq","W3VFHpiJSk","Qworuv1Hln","rKDLJn8pJ9","7X3uy5ZaEz","OHaBzD6rBy","jS1aj9eoRc","S77LH0ao3l","BbwgAciuWz",
+"Mkgy8DcpWB","pv0i77ku1p","yofH3P6bcg","SbRYyFcWrW","e6e4zcmXIX","cL0aEU3yw5","Vprf2ZhwG1","6AFT0l83Ud","d7vjMXyPZN","ulk41uPX7G",
+"yEfy9FjHXR","uQIczMGlTF","v2eC32TRI7","24ARFfqypy","9eoRcAXpwE","WreyPjS1aj","n8pJ9Z4I1v","29QAztl72W","zY1GYAmdQd","JJs5m5VZjS"
+] } }
+}
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//sorted-queue?durable='true'",
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_numberOfMessages": 20000,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//sorted-queue?durable='true'",
+ "_numberOfMessages": 20000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "queue-type:simple-queue";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//simple-queue?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//simple-queue?durable='true'",
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_numberOfMessages": 20000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//simple-queue?durable='true'",
+ "_numberOfMessages": 20000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "queue-type:priority-queue";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//priority-queue?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-priorities": 10
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "priority": {"@def": "range", "_lower": 0, "_upper": 9, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//priority-queue?durable='true'",
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_numberOfMessages": 20000,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//priority-queue?durable='true'",
+ "_numberOfMessages": 20000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/java/perftests/etc/testdefs/short/VaryingNumberOfParticipants.json b/java/perftests/etc/testdefs/short/VaryingNumberOfParticipants.json
new file mode 100644
index 0000000000..457b0bc348
--- /dev/null
+++ b/java/perftests/etc/testdefs/short/VaryingNumberOfParticipants.json
@@ -0,0 +1,2981 @@
+{
+ "_tests":[
+ {
+ "_name": "Varying number of participants: 1 consumer - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Varying number of participants: 2 consumers - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Varying number of participants: 5 consumers - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 1 consumer - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 2 consumers - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 5 consumers - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 1 consumer - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 2 consumers - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Varying number of participants: 5 consumers - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 1 consumer - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 2 consumers - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Varying number of participants: 5 consumers - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/java/perftests/etc/testdefs/standard/AcknowledgementModes.json b/java/perftests/etc/testdefs/standard/AcknowledgementModes.json
new file mode 100644
index 0000000000..db68939a94
--- /dev/null
+++ b/java/perftests/etc/testdefs/standard/AcknowledgementModes.json
@@ -0,0 +1,138 @@
+{
+ "_tests":[
+ {
+ "_name": "Acknowledgement Modes - NON_PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 10000000,
+ "_acknowledgeMode": 1,
+ "_deliveryMode": 1
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 2500000,
+ "_acknowledgeMode": 0,
+ "_deliveryMode": 1
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Acknowledgement Modes - PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 1000000,
+ "_acknowledgeMode": 1,
+ "_deliveryMode": 2
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 250000,
+ "_acknowledgeMode": 0,
+ "_deliveryMode": 2
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue?durable='true'",
+ "_durable" : "true"
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue?durable='true'"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue?durable='true'"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/java/perftests/etc/testdefs/standard/BatchSize.json b/java/perftests/etc/testdefs/standard/BatchSize.json
new file mode 100644
index 0000000000..309cd4d5ed
--- /dev/null
+++ b/java/perftests/etc/testdefs/standard/BatchSize.json
@@ -0,0 +1,84 @@
+{
+ "_tests":[
+ {
+ "_name": "Batch Size- PERSISTENT";
+ "_iterations":[
+ {
+ "_batchSize": 1
+ },
+ {
+ "_batchSize": 2
+ },
+ {
+ "_batchSize": 5
+ },
+ {
+ "_batchSize": 10
+ },
+ {
+ "_batchSize": 20
+ },
+ {
+ "_batchSize": 50
+ },
+ {
+ "_batchSize": 100
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//batchSize?durable='true'",
+ "_durable" : true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//batchSize?durable='true'",
+ "_messageSize": 1024,
+ "_maximumDuration": 120000,
+ "_deliveryMode": 2
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//batchSize?durable='true'",
+ "_maximumDuration": 120000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/java/perftests/etc/testdefs/standard/MessageSize.json b/java/perftests/etc/testdefs/standard/MessageSize.json
new file mode 100644
index 0000000000..b679f81926
--- /dev/null
+++ b/java/perftests/etc/testdefs/standard/MessageSize.json
@@ -0,0 +1,213 @@
+{
+ "_tests":[
+ {
+ "_name": "Message Size - 1P-1C - NON_PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 256,
+ "_numberOfMessages": 10000000
+ },
+ {
+ "_messageSize": 512,
+ "_numberOfMessages": 5000000
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": "2500000"
+ },
+ {
+ "_messageSize": 2048,
+ "_numberOfMessages": "1250000"
+ },
+ {
+ "_messageSize": 4096,
+ "_numberOfMessages": "625000"
+ },
+ {
+ "_messageSize": 8192,
+ "_numberOfMessages": 312500
+ },
+ {
+ "_messageSize": 16384,
+ "_numberOfMessages": 156250
+ },
+ {
+ "_messageSize": 32768,
+ "_numberOfMessages": 78125
+ },
+ {
+ "_messageSize": 65536,
+ "_numberOfMessages": 39062
+ },
+ {
+ "_messageSize": 131072,
+ "_numberOfMessages": 1953
+ },
+ {
+ "_messageSize": 262144,
+ "_numberOfMessages": 976
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//messageSize",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//messageSize",
+ "_deliveryMode": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//messageSize"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Message Size - 1P-1C - PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 256,
+ "_numberOfMessages": 200000
+ },
+ {
+ "_messageSize": 512,
+ "_numberOfMessages": 200000
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 200000
+ },
+ {
+ "_messageSize": 2048,
+ "_numberOfMessages": 200000
+ },
+ {
+ "_messageSize": 4096,
+ "_numberOfMessages": 40000
+ },
+ {
+ "_messageSize": 8192,
+ "_numberOfMessages": 40000
+ },
+ {
+ "_messageSize": 16384,
+ "_numberOfMessages": 40000
+ },
+ {
+ "_messageSize": 32768,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 65536,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 131072,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 262144,
+ "_numberOfMessages": 20000
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//messageSize?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//messageSize?durable='true'",
+ "_deliveryMode": 2
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//messageSize?durable='true'"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/java/perftests/etc/testdefs/standard/QueueTypes.json b/java/perftests/etc/testdefs/standard/QueueTypes.json
new file mode 100644
index 0000000000..479b3be9f1
--- /dev/null
+++ b/java/perftests/etc/testdefs/standard/QueueTypes.json
@@ -0,0 +1,16205 @@
+{
+ "_tests":[
+ {
+ "_name": "queue-type:sorted-queue";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//sorted-queue?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608,
+ "qpid.queue_sort_key": "sort-key"
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "sort-key": {"@def": "list", "_items": [
+"GWqqXCp3mZ","b29RJ45cIH","7hyVvgtCA5","16lHcCxVEf","jzUqRuPX7G","0Wr5y4QMc9","pWiOsLbRTH","Dz1R3BGaQY","Cfgr39y4lw","Zv7z0FxX9q",
+"lj07QxXTI4","RACuj9XyT9","MGlTF55rfB","0Wr5yW3VFH","lweGyVprf2","lpF6WuJScX","lCMxy2TRI7","KZamHl83Ud","5drc6jiVBP","rKDLJwDajX",
+"CK5W7MezSW","2TRI7LbRTH","zqH0WiwzGk","hYBCKUvlv4","Mkgy8Q6hMC","8FmFHjtn0X","8FmFH5Mg9r","hUTw7rz7Ut","pmeCdQnJ1S","euZA5dQ586",
+"sqVrfQWxoT","RsQUqTwano","7ku1ptlILt","jzUqRpiJSk","0YAGH5Drn0","7ku1pCxVEf","QbxXc8hJdt","4W0Tldpe1v","MK07Ys7Mxk","zHF1qCNHmv",
+"uoStwRzaZA","KZamHVLTy6","XyPZN5Drn0","7fKYU07n1c","HfyNQiwzGk","mX2GEoGu6x","9eoRcydG8U","pAhR1iKqhr","LbRTHb29RJ","Waim6DLhzM",
+"bgJAzReKEW","pmeCdjeskS","gdQsSguMb8","Oz8yZI7p2a","ogLgculk41","HfyNQ0MR5X","24ARFWDVWJ","uAWypwDajX","lH1kt6AFT0","EOE1oZhwG1",
+"AIYUu0Kyfs","prNT6uTacx","TwanoFPfSE","OUYuFAXpwE","euZA5FVMxo","ni2v10BmCy","5Mg9rJRJQB","nlaBya00b5","7X3uyL7cGc","ECMvU55rfB",
+"JXljW2TRI7","Z4I1vY1mC0","lj07QFhtgl","fqypycmXIX","Ul4a1GrDg7","LDk6fulk41","2Nslm2hEEU","LbRTHuTacx","gIYvEK4GS8","Cfgr3i7WMQ",
+"pWiOss4786","mX2GETCgPp","8xEKzjeskS","uTacxDQimp","ksJbyfFDrJ","7fKYUAOgEe","5Drn0azIWp","he9IAIKxdL","HfyNQTwano","FcWrW0ao3l",
+"iKqhrn8pJ9","BbwgArhl0J","M6qcGjiVBP","b29RJ8U2nU","MK07Y8cVD3","dhSuHjfREu","azIWpjS1aj","qQxHPTwano","QChxsJRJQB","YjB9tuZPqg",
+"FVMxoMmKGJ","JKWYRZUnqt","AIYUuhUTw7","U3yw5Cp3mZ","zz4ZUGXdoH","8hJdtBbwgA","Ul4a155rfB","oVQp6DLhzM","DG4sTfmIK1","zY1GYAXpwE",
+"M3zXLGrDg7","CK5W7jSjS3","fmIK1uTacx","OxWIHkB5nP","xXTI4BFkb8","OUYuFblLA9","RkQkeqaofN","YjB9tuTacx","uLtKsW7cTs","l83UdDcpWB",
+"brhlQRsQUq","GSQwjCIShG","GSQwjFwEJz","HlUbF2DREs","Mkgy8xReec","16lHcwDajX","MaJQs5IhmG","9iGoTdmoS7","DQimplpF6W","bgJAzVjCZq",
+"vLsmSwDajX","DG4sTciuWz","ECMvU48cHL","nlaByqaofN","QWxoTv1Hln","WaWsvqUJMd","F6PT28cVD3","lweGyLewvM","IRh48xciqp","9y4lw8U2nU",
+"2TRI7NOHsz","uAWypuTacx","FhtglcQOnv","bZLvS0PktI","v2eC3DcpWB","ReKEWksJby","ECMvUPOUYS","8RCUATa8f6","gjUTu0YAGH","FcWrWcmXIX",
+"QYxC0zQt6Q","MK07Y7fKYU","qQxHPoGu6x","faHirNo0Qb","aFFss0MR5X","RpBQmokgRi","IBe8kVerEA","OHaBzy94nw","0ao3lDLhzM","tuDySpT8wu",
+"jSjS3JJs5m","VerEA7Ow5C","5NammJXljW","gf8rIhi5X7","M3zXLRsQUq","K4GS8y94nw","aez9yvkCHH","uTacxix74r","RpBQmCqqaD","4dEz6L7cGc",
+"ix74rJKWYR","4W0TlNhXdu","VjCZqogLgc","45cIHNcICA","pT8wufqypy","nnP8odQ586","dpe1vGSQwj","2ZHdkvkCHH","zz4ZUhe9IA","nnP8oCqqaD",
+"vLsmSYw2oU","4QMc9GSQwj","yluBxOz8yZ","0ao3lsqVrf","K20wKCK5W7","fcwDa8FmFH","GWqqXX6Pin","faHird7vjM","RBhp0ZzJHW","EOE1owDajX",
+"QssNC0Kyfs","iqv4kCp3mZ","4W0TlMkgy8","aDGtSdhSuH","uQIcz5Drn0","1v5hHUmaEv","pAhR1MmKGJ","2Yz7EQWxoT","nFqikKASQ8","ZJTXHpT8wu",
+"5iGN5MojnP","gf8rIsuY4x","l83UdHzZT8","uoStwtAOsr","wDajXzFgtB","mz8gxAOgEe","dhSuHMm8si","ZzJHW6q6L9","FjHXRuPX7G","8cVD3MmsIo",
+"Pb1pagdQsS","m4bxUuAWyp","4QMc9suY4x","nnP8ouZPqg","7X3uynFqik","FnPFBRxrsm","Waim6NcICA","KASQ8JIqXi","s7MxkguMb8","KASQ8AkKTk",
+"fFDrJtuDyS","l83UdD6rBy","ZhwG1dmoS7","7ku1pnnP8o","uPX7GpFrrl","7ku1p4W0Tl","zmLYDQbxXc","zY1GYPb1pa","x3LDe3weIF","zbIYYKsjRK",
+"7Ow5COHaBz","dhSuHJJs5m","RzaZAZhwG1","HRxd8DQimp","IjTwPCK5W7","AOgEelpF6W","8FmFHn1pmO","e6e4z0Kyfs","blLA95nmWv","s4786LbRTH",
+"VBjhzuPX7G","WPmlx7Ow5C","soy9tK4GS8","qaofNfcwDa","iB08lOHaBz","4W0Tl0MR5X","FLsphNo0Qb","kZANmZJTXH","fmIK19iGoT","zFgtB7fsYM",
+"tlILtKZamH","zHF1qvkCHH","HzZT8O3iyQ","i3pydMkgy8","GXdoHy94nw","HlUbFyToGW","e6e4za00b5","aDGtSi3pyd","ZJTXHjzUqR","pAhR1FNYIM",
+"5Mg9rhUTw7","QWxoTL7cGc","aFFssfcwDa","GSQwjni2v1","Vprf2Nxx9V","7ku1peuZA5","MaJQsokgRi","DcpWBQ6hMC","HlUbFM6qcG","iqv4kKr8ys",
+"hi5X7cL0aE","fLNg8Nxx9V","zHF1qQbxXc","Yf2EcB3qem","gIYvEQWxoT","CIShGlViBv","8xEKzBCxeC","UmaEvh1zcH","ogLgcfcJOy","ZUnqtGSQwj",
+"2hEEUzQt6Q","rKDLJTXQ0Z","MmsIoru4UG","mz8gxOxWIH","zFgtBhYBCK","bZLvSqUJMd","hi5X7lsQGo","hSSvQs4786","SjskQoGu6x","07n1cJ2mQi",
+"hYBCKjeskS","Chuy324ARF","s4786UlU3M","AkKTkBFkb8","W3VFHulk41","tl72W7fsYM","ZhwG1Rxrsm","K4GS8YOfrY","0PktIxciqp","9rlg90h1b1",
+"Pb1paAgJHQ","WmadAsx5Gl","GWqqXnFqik","QnJ1SFcWrW","XyPZNNo0Qb","9rlg9TXQ0Z","4dEz6oQ87r","WaWsvZ4I1v","7hyVv4dEz6","a00b5TXQ0Z",
+"iqv4kblLA9","pv0i7ciuWz","9GXkXsx5Gl","Yh1hFyEfy9","SWfouQssNC","5NammlsQGo","ciuWzJKWYR","RmDcrWmadA","s47862ZHdk","RACujo8Uyd",
+"hYBCKm4bxU","l83UdMaJQs","9rlg9Qworu","J2mQiTa8f6","jzUqR7ku1p","64s8NSmGzv","ZhwG1NOHsz","fFDrJuoStw","Chuy3RACuj","aL6AJ5drc6",
+"hYBCKS2Dfu","OHaBzJXljW","djsrv0ao3l","zz4ZUsqVrf","TXQ0ZIBe8k","lViBv2Yz7E","cQOnvMm8si","aL6AJLDk6f","ThjNnru4UG","14FLRo8Uyd",
+"pv0i7rz7Ut","tlILtCIShG","WMiS37fKYU","xXTI4b29RJ","8FmFHThjNn","8cVD34QMc9","8xEKzqaofN","Oz8yZs93Ml","tjQxsJRJQB","Chuy3TCgPp",
+"P6bcgfmIK1","OUYuFI7p2a","tlILtQssNC","k85Aem4bxU","RpBQm7lUXZ","StlDJyvOMI","DcpWBFxX9q","iwzGk0ao3l","KASQ8BbwgA","gdQsS45cIH",
+"bZLvSpWiOs","RACujGrDg7","tuDySZv7z0","d85a9Pb1pa","0BmCyQWxoT","ECMvUs93Ml","CIShGmX2GE","uupzktAOsr","1LB1Lgf8rI","24ARFbgJAz",
+"HRxd8hi5X7","1v5hHyluBx","RACujWreyP","vLsmS0ao3l","BFkb8uTacx","7lUXZVjCZq","RACujSbRYy","K20wK1v5hH","uPX7GUvlv4","tvdkDOHaBz",
+"dpe1vKr8ys","5NammJ2mQi","aDGtSQClRL","M6qcGRzaZA","WMiS3SWfou","0KyfsSmGzv","P6bcg0Wr5y","pvgjSfLNg8","RpBQmCK5W7","gf8rIFxX9q",
+"sqVrf8FmFH","lpF6Wzz4ZU","AOgEeTwano","7lUXZNhXdu","64s8NJIqXi","ni2v1d85a9","2DREscQOnv","Mm8silm0pD","xXTI4MK07Y","Q6Lix9XyT9",
+"64s8NG1RhS","RkQkevOqCE","zz4ZUpv0i7","QnJ1SBpYhV","a00b5IKxdL","BpYhV8xEKz","s7MxkPYBf4","ThjNn5Drn0","jfREu7Ow5C","cShY2VjCZq",
+"M3zXLtAOsr","ru4UGRzaZA","5NammF6PT2","CNHmvtjQxs","MmsIoFxX9q","fqypyWPmlx","K20wKMaJQs","7lUXZ0h1b1","sx5Gln1pmO","ZhwG14QMc9",
+"45cIHUvlv4","i3pyd8U2nU","RmDcrXyPZN","Nxx9Ve6e4z","uPX7GO3iyQ","5VZjSbZLvS","jS1ajh1zcH","0Kyfs5iGN5","7X3uyn8pJ9","3weIFOHaBz",
+"IjTwPIRh48","CdyBV1v5hH","hi5X72Nslm","atef2KsjRK","K20wKMmKGJ","nnP8o4QMc9","7ku1pcShY2","Mm8siGv3Fq","dhSuHrz7Ut","5drc6IjTwP",
+"lkMUAjzUqR","lweGyiKqhr","7Ow5Czz4ZU","AmdQdCfgr3","aFFssL7cGc","P6bcggjUTu","s7MxkY1mC0","FVMxoQbxXc","uPX7GblLA9","BFkb8jeskS",
+"8FmFHt59lR","hi5X7pv0i7","DQimpuvf7A","MezSWHlUbF","9y4lw2Yz7E","QssNC2TRI7","HzZT8EOE1o","Ta8f65drc6","WMiS35VZjS","LDk6fGSQwj",
+"uTacxgjUTu","n8pJ9L7cGc","fcJOyQYxC0","8RCUApFrrl","azIWpReKEW","uN6r3Chuy3","CNHmvL7cGc","jzUqR2Nslm","uPX7GGv3Fq","CqqaDlkMUA",
+"zY1GYSbRYy","AgJHQMGlTF","0PktIpT8wu","RxrsmU3yw5","yvOMI6q6L9","Kr8ysStlDJ","QClRLsqVrf","2Yz7EyofH3","7Ow5CprNT6","IKxdLTa8f6",
+"n8pJ92TRI7","qUJMdvOqCE","jSjS3pT8wu","S2DfusuY4x","AXpwEAgJHQ","1j5L8ZhwG1","uAWyp2Nslm","IRh488FmFH","dmoS7VLTy6","CNHmvECMvU",
+"RACujhUTw7","Uvlv4ix74r","Gv3FqaL6AJ","Waim6DG4sT","QYxC0gdQsS","3weIFzY1GY","pvgjSCfgr3","ZJTXHlj07Q","2hEEU29QAz","Cfgr3s93Ml",
+"wiHrZMmKGJ","XyPZNMaJQs","zbIYYNOHsz","brhlQECMvU","J2mQilweGy","fqypyOxWIH","BbwgAyofH3","W3VFHrKDLJ","sx5Gl2TRI7","AXpwE8TxD7",
+"I7p2anlaBy","NhXduqQxHP","fcJOy4QMc9","SWfouKZamH","GSQwjuoStw","fmIK17X3uy","tAOsrQ6hMC","k85Ae45cIH","Y1mC0uQIcz","zbIYY8FmFH",
+"uZPqg3weIF","8TxD7OHaBz","pmeCd4W0Tl","WaWsv0Wr5y","IRh482TRI7","nlaByvLsmS","hSSvQdpe1v","hi5X7xciqp","tl72WAIYUu","OUqFM9rlg9",
+"VBjhzQ6Lix","Cp3mZSWfou","5drc6ksJby","faHirMmsIo","fFDrJvLsmS","ReKEWfqypy","QWxoTGrDg7","2DREsRpBQm","WaWsvZv7z0","8U2nU3weIF",
+"Rxrsmv2eC3","7X3uyaez9y","0MR5XJJs5m","5IhmGdQ586","BpYhVoQ87r","8FmFH8xEKz","ZUnqtqaofN","45cIHlH1kt","48cHLhUTw7","LewvMnnP8o",
+"CNHmvHzZT8","WMiS39iGoT","QChxsjfREu","RmDcr5iGN5","4dEz68RCUA","64s8NOz8yZ","yluBxuoStw","7hyVvWPmlx","FLsphprNT6","ogLgchE1Ql",
+"uPX7G2TRI7","M6qcGv1Hln","n8pJ9t59lR","cmXIXaL6AJ","1j5L8ni2v1","zz4ZUJKWYR","VBjhzru4UG","oVQp6CNHmv","lViBvTXQ0Z","Pb1paGrDg7",
+"FjHXRFjHXR","yEfy9MmsIo","hE1QlJRJQB","xXTI407n1c","8FmFHtaOXK","fqypyReKEW","AXpwEVprf2","RBhp0ECMvU","Chuy3K4GS8","nFqikTa8f6",
+"lkMUARxrsm","a00b5ulk41","64s8NciuWz","IKxdLHfyNQ","2Nslmt59lR","5drc6580YD","uupzk0h1b1","7fsYMdjsrv","CdyBVoQ87r","Yh1hFMezSW",
+"prNT6hE1Ql","Yh1hFSWfou","CIShGG1RhS","2Yz7EJkzUn","zHF1qZUnqt","xXTI4tjQxs","ZzJHWCxVEf","I7p2akB5nP","2NslmMkgy8","KsjRKVLTy6",
+"TXQ0ZFwEJz","HlUbFazIWp","M3zXLs4786","VerEAzFgtB","VNCPdJIqXi","Pb1pafLNg8","8TxD74QMc9","gIYvEv8yFN","FNYIMgIYvE","YOfrYd7vjM",
+"9rlg914FLR","zFgtBC2Irc","4QMc9D6rBy","uLtKsQssNC","Yw2oUWreyP","WaWsvFhtgl","MGlTFdjsrv","tlILtLDk6f","QClRLhSSvQ","QssNCaL6AJ",
+"fcJOy2ZHdk","d85a9RBhp0","lpF6W7fKYU","qUJMdlXFOB","JIqXidpe1v","45cIHCxVEf","t59lR0Wr5y","zFgtBhe9IA","uLtKsCfgr3","YOfrYReKEW",
+"AgJHQhE1Ql","2ZHdk6q6L9","AgJHQChuy3","RACujuAWyp","Yw2oUDz1R3","pAhR1HfyNQ","jeskSaDGtS","CK5W7Dz1R3","3otm6blLA9","X6PinKASQ8",
+"aez9ygIYvE","K20wKhi5X7","suY4xiKqhr","s4786Z4I1v","gIYvEydG8U","AmdQdQ6hMC","gjUTuAXpwE","FPfSEW3VFH","bgJAzatef2","gf8rIO3iyQ",
+"gtCA5blLA9","FVMxoVjCZq","7hyVvfLNg8","zqH0WC2Irc","yEfy9lweGy","JXljWDQimp","wDajXGXdoH","s93MlFwEJz","G1RhS618Di","l83Ud5IhmG",
+"45cIHzFgtB","8RCUAlsQGo","ni2v11LB1L","yvOMI2Yz7E","zz4ZUnnP8o","L7cGcRsQUq","v8yFNdhSuH","5IhmGzz4ZU","yvOMIo8Uyd","Cp3mZS77LH",
+"zz4ZUGSQwj","P6bcgIjTwP","hYBCKDQimp","8cVD3SjskQ","EoToP64s8N","6q6L9QbxXc","wiHrZqaofN","cmXIXxXTI4","3otm6zqH0W","24ARFulk41",
+"VLTy6cShY2","soy9tOHaBz","StlDJ2Nslm","AkKTkwiHrZ","VerEAyEfy9","HfyNQCK5W7","cShY2M6qcG","bZLvSXyPZN","J2mQiWmadA","0ao3lRxrsm",
+"QChxs4dEz6","0ao3lhi5X7","yvOMITa8f6","hSSvQMmKGJ","OHaBzFNYIM","16lHcy94nw","1LB1L8hJdt","SbRYyWmadA","MGlTFKZamH","rKDLJGWqqX",
+"IjTwPdjsrv","EOE1oHP433","Gv3FqZzJHW","RsQUqfLNg8","G1RhS5ZaEz","JKWYR7fKYU","JXljWTa8f6","FPfSEo8Uyd","4QMc9yToGW","HfyNQM6qcG",
+"S77LHFPfSE","fqypyvkCHH","tuDySfFDrJ","gf8rIuQIcz","Oz8yZFNYIM","FGzgpyToGW","8hJdtKr8ys","pAhR1618Di","pmeCdfFDrJ","AkKTkhUTw7",
+"0MR5XoQ87r","RACujs93Ml","dQ586kB5nP","uoStwYOfrY","UmaEvUlU3M","9GXkXxReec","pv0i7tjQxs","OUqFMQssNC","FnPFBuAWyp","WreyPiKqhr",
+"aFFssUlU3M","dhSuHS77LH","vkCHHFNYIM","Oz8yZG1RhS","C2Irc6AFT0","2ZHdkzbIYY","BpYhVTwano","Mkgy8yEfy9","PYBf4RsQUq","FxX9qlpF6W",
+"WaWsvjfREu","M3zXLU3yw5","VjCZqfcJOy","mz8gxIKxdL","WPmlxCNHmv","1v5hHzqH0W","v1HlnjzUqR","G1RhSNo0Qb","Yh1hFNo0Qb","6AFT0ksJby",
+"dhSuHAOgEe","pv0i7JXljW","djsrv29QAz","D6rByix74r","M6qcG4W0Tl","ThjNneuZA5","5drc6S77LH","TXQ0ZfcJOy","UlU3MgIYvE","ReKEW16lHc",
+"lXFOBSmGzv","aL6AJMGlTF","Yf2Ec7fKYU","0MR5XvLsmS","HzZT8NAFuw","gdQsSIRh48","TXQ0ZAOgEe","HfyNQQWxoT","2TRI7aFFss","xXTI4ReKEW",
+"2Yz7EpT8wu","Ta8f6lXFOB","blLA9pFrrl","0h1b1WMiS3","ThjNnAmdQd","FnPFBsoy9t","hUTw7M3zXL","ksJbyZUnqt","taOXKVIlwP","XflUqtlILt",
+"BpYhVpmeCd","zHF1q5IhmG","gdQsSZzJHW","uAWypYh1hF","BCxeCTXQ0Z","yluBxPOUYS","nnP8oaL6AJ","qQxHPFnPFB","VNCPdcL0aE","s93Ml5VZjS",
+"zHF1qIn3NS","jeskSTXQ0Z","v2eC3sqVrf","uAWyp8hJdt","lXFOB5Drn0","OHaBzAXpwE","uTacxGSQwj","Dz1R3VLTy6","zHF1qulk41","EdBKcRpBQm",
+"Gv3Fq5nmWv","Y1mC01j5L8","45cIHfcJOy","ZJTXHuJScX","bZLvSThjNn","3weIF9XyT9","qQxHPHRxd8","55rfBXyPZN","DG4sTXyPZN","suY4xxXTI4",
+"cL0aEjS1aj","pFrrlAXpwE","uoStwlH1kt","vOqCEaL6AJ","RmDcrfLNg8","suY4xZv7z0","TCgPptuDyS","JJs5m45cIH","F6PT2Ul4a1","B3qem8U2nU",
+"K20wK6q6L9","brhlQWaWsv","FjHXRJJs5m","gf8rI3weIF","BGaQY7fKYU","NhXdu7lUXZ","3weIFSmGzv","Cfgr3FVMxo","LewvMlsQGo","55rfBW7cTs",
+"qaofNQ6hMC","NhXduFnPFB","iwzGkhE1Ql","M6qcGPYBf4","XyPZNVjCZq","S2DfuAgJHQ","vLsmS9GXkX","X6PinVprf2","B3qemMezSW","MmKGJKsjRK",
+"FNYIMDLhzM","U3yw5dpe1v","FFDuiFcWrW","JkzUniB08l","azIWpS2Dfu","0KyfsuTacx","lXFOBfaHir","VerEA7fsYM","StlDJQWxoT","brhlQ5Mg9r",
+"CqqaDFxX9q","4dEz6dQ586","nnP8oFjHXR","CNHmvI7p2a","LewvMazIWp","qaofNVNCPd","KsjRKdjsrv","GXdoHJIqXi","aDGtSFcWrW","RkQkepAhR1",
+"RkQkeGWqqX","F6PT229QAz","JKWYRuJScX","v1HlnguMb8","FVMxot59lR","oQ87rrhl0J","WaWsv7Ow5C","Q6hMClweGy","POUYSbgJAz","16lHcRsQUq",
+"qQxHPWaim6","lViBvRpBQm","G1RhS8TxD7","0PktIBpYhV","CIShG2DREs","2ZHdk24ARF","Yh1hFv1Hln","CdyBVxciqp","jiVBPuQIcz","v8yFNPOUYS",
+"OUqFMazIWp","RpBQm5nmWv","6AFT0JJs5m","VBjhz5Drn0","O3iyQSs0Zu","JJs5mRkQke","yvOMIQChxs","fmIK1Yh1hF","LbRTHXflUq","4W0TlqQxHP",
+"ulk41I7p2a","UlU3MtvdkD","5IhmGIjTwP","ciuWzFGzgp","0KyfsxXTI4","580YD2TRI7","tjQxspiJSk","lm0pDrKDLJ","14FLR8hJdt","29QAzWMiS3",
+"t59lRMGlTF","14FLRrz7Ut","lm0pDUl4a1","X6PinCp3mZ","7ku1pAmdQd","48cHLix74r","aL6AJaez9y","t98iWkB5nP","ru4UG2Yz7E","In3NShYBCK",
+"S2DfuQssNC","uLtKsuN6r3","G1RhSsx5Gl","618DiWPmlx","2ZHdkRpBQm","AOgEeIBe8k","lj07QVprf2","TXQ0ZJkzUn","CK5W7zmLYD","AOgEeaFFss",
+"StlDJJIqXi","VjCZqWDVWJ","W7cTsGSQwj","580YDMmKGJ","TwanoS2Dfu","lH1ktRzaZA","uupzko8Uyd","k85AeguMb8","64s8NNcICA","VLTy6uTacx",
+"oVQp67lUXZ","Zv7z0Q6hMC","Q6LixLDk6f","9rlg92Yz7E","ulk41ydG8U","JKWYRQWxoT","ciuWzaFFss","7fKYUQClRL","8FmFH0h1b1","4W0TlMezSW",
+"euZA5gjUTu","lViBv07n1c","uPX7GGXdoH","VjCZq0MR5X","6q6L9nFqik","K20wKHRxd8","580YDIBe8k","aFFss8TxD7","RpBQmHP433","5Drn0gdQsS",
+"5ZaEz9eoRc","fmIK1M3zXL","tAOsruTacx","K20wK8TxD7","48cHL9eoRc","tvdkDzFgtB","Waim6wiHrZ","SjskQWreyP","cQOnvn8pJ9","dQ586AIYUu",
+"SjskQguMb8","hYBCK5Mg9r","ogLgcFNYIM","Chuy3Ss0Zu","580YDReKEW","jzUqRDcpWB","Z4I1vyEfy9","Cfgr3MmsIo","HRxd88RCUA","FnPFBqUJMd",
+"MGlTFBCxeC","NOHszrz7Ut","M6qcGtvdkD","RzaZATwano","s93MlogLgc","tl72WZUnqt","Mkgy8Qworu","m4bxU5Namm","jeskScmXIX","cL0aE5VZjS",
+"FwEJzNOHsz","jS1ajYf2Ec","gtCA5MmKGJ","fFDrJZzJHW","QWxoT24ARF","pT8wuuJScX","5ZaEzxXTI4","QnJ1SY1mC0","cQOnvAkKTk","Ta8f6fqypy",
+"uoStwCxVEf","SbRYytAOsr","MaJQscmXIX","G1RhS2Nslm","okgRiHRxd8","16lHcuN6r3","b29RJ8FmFH","POUYS4QMc9","IKxdLi7WMQ","pvgjSnnP8o",
+"Ss0ZuuAWyp","t59lRiKqhr","0YAGHCp3mZ","WPmlxzbIYY","n8pJ9gjUTu","jSjS3zQt6Q","aez9yFVMxo","pmeCdvkCHH","jiVBP9eoRc","5Mg9r5Drn0",
+"djsrvTa8f6","v1Hln8FmFH","e6e4zZ4I1v","GSQwjBGaQY","fqypyYh1hF","RBhp0aFFss","QChxsnlaBy","gjUTuxciqp","MojnPuLtKs","SWfou8cVD3",
+"HP433HfyNQ","uupzkMezSW","Yf2Ec7hyVv","lkMUAzY1GY","oVQp6MojnP","CK5W7WMiS3","lsQGoKr8ys","v1HlnL7cGc","S2DfucmXIX","Yf2EcpAhR1",
+"v1Hln7hyVv","vkCHHzQt6Q","a00b5RzaZA","StlDJNxx9V","AXpwEHRxd8","OUqFMgtCA5","tuDySaez9y","P6bcgWDVWJ","Chuy3S2Dfu","BpYhVguMb8",
+"cmXIX8hJdt","BGaQYP6bcg","S2DfuydG8U","i7WMQYjB9t","L7cGcFPfSE","cQOnv0Kyfs","t59lRcL0aE","uQIczdpe1v","FLsph7ku1p","CNHmvWDVWJ",
+"EOE1ojS1aj","0BmCymX2GE","TXQ0ZokgRi","lkMUAWDVWJ","3otm6M3zXL","RmDcrPOUYS","AkKTkoGu6x","S2Dfu5Namm","qUJMdAIYUu","soy9tQbxXc",
+"BpYhVDQimp","NcICAyluBx","l83UdYf2Ec","K20wKKZamH","WaWsv0PktI","uJScX9XyT9","HP433tuDyS","dpe1vaDGtS","LDk6f16lHc","oGu6xx3LDe",
+"lm0pDDcpWB","fcwDajS1aj","ru4UGCNHmv","MezSWaez9y","0YAGHHRxd8","5NammfFDrJ","FNYIMBbwgA","faHirWPmlx","ydG8U580YD","tjQxsEdBKc",
+"gjUTucShY2","ydG8UAXpwE","bZLvSIRh48","AgJHQs93Ml","CK5W70MR5X","iKqhrtl72W","MK07YFFDui","ZUnqtbZLvS","GXdoHFnPFB","lkMUAHzZT8",
+"tl72WChuy3","Dz1R3iB08l","uLtKsNhXdu","AXpwEMGlTF","ZJTXHEOE1o","Kr8ysRmDcr","OUYuFWDVWJ","48cHLtl72W","UlU3M2ZHdk","Z4I1vd7vjM",
+"4QMc9K4GS8","SbRYyChuy3","WreyPAmdQd","IKxdL8U2nU","Cfgr3jzUqR","vOqCEguMb8","uQIczn8pJ9","VLTy6xReec","pvgjSYh1hF","kZANmjiVBP",
+"MezSWMmsIo","IKxdLfcJOy","cQOnveuZA5","hi5X7pWiOs","ksJbyKr8ys","uAWypulk41","AIYUuoGu6x","JIqXi0MR5X","5drc6W3VFH","pmeCdtAOsr",
+"yluBxTa8f6","FFDuilH1kt","48cHLuJScX","S2Dfux3LDe","5ZaEzCxVEf","h1zcHCqqaD","jfREufmIK1","s4786ZUnqt","wDajXAIYUu","Qworu2TRI7",
+"5VZjSzmLYD","618DituDyS","tAOsrpiJSk","RkQkePYBf4","RxrsmPOUYS","NhXdumz8gx","kZANmDG4sT","AmdQdlsQGo","QYxC0soy9t","9XyT9he9IA",
+"3otm6ZzJHW","aez9yRACuj","v2eC3iwzGk","lViBvNcICA","lXFOBazIWp","brhlQLewvM","SbRYycQOnv","ZzJHWtAOsr","soy9tuPX7G","0YAGHo8Uyd",
+"zFgtBSs0Zu","h1zcHECMvU","ru4UG5nmWv","AgJHQK4GS8","jtn0XzFgtB","AOgEeW7cTs","Ss0Zu2hEEU","IBe8kReKEW","SWfouEoToP","hSSvQlViBv",
+"euZA5K4GS8","1j5L8lweGy","Q6LixQworu","azIWpazIWp","uQIczVIlwP","okgRiCIShG","YOfrYYf2Ec","PYBf455rfB","nFqikGv3Fq","7lUXZpmeCd",
+"EdBKctvdkD","Mkgy8tlILt","VerEAiwzGk","gdQsSaDGtS","W7cTsbrhlQ","yEfy9wDajX","Dz1R3LbRTH","ksJbyNxx9V","DG4sTYf2Ec","5NammPYBf4",
+"64s8NYh1hF","fcwDaGrDg7","9y4lwni2v1","5nmWv2ZHdk","X6PinvLsmS","sqVrfKASQ8","9rlg97fsYM","DLhzMkB5nP","s7Mxkmz8gx","jtn0X5ZaEz",
+"GSQwjqUJMd","5iGN5NOHsz","yofH3jtn0X","xXTI4HfyNQ","qQxHPS2Dfu","pv0i7Q6Lix","iKqhr7ku1p","3otm6rhl0J","FPfSEZzJHW","Cfgr3ksJby",
+"brhlQ5nmWv","Q6LixCK5W7","lkMUAS2Dfu","BFkb8cQOnv","S2DfuYw2oU","OUqFMQ6hMC","5IhmGvLsmS","Ta8f65ZaEz","sx5GlQssNC","m4bxU7lUXZ",
+"NOHszZuDtD","lH1kt5Namm","kZANmS2Dfu","cShY2FjHXR","ZzJHWpiJSk","FPfSEl83Ud","LewvMlpF6W","ZhwG15nmWv","hi5X7VLTy6","s4786LDk6f",
+"dpe1vQClRL","yofH3JKWYR","iKqhrVLTy6","BGaQYCIShG","ciuWz5Namm","MojnPVerEA","pFrrlbZLvS","VerEA8hJdt","hi5X77ku1p","O3iyQY1mC0",
+"JkzUn48cHL","nFqikCdyBV","48cHLlsQGo","lH1ktzHF1q","FFDuiSjskQ","nnP8oiwzGk","1v5hHaFFss","55rfBvOqCE","Ss0ZuHRxd8","O3iyQ48cHL",
+"faHirfLNg8","Mkgy8FnPFB","8FmFHFVMxo","RxrsmcL0aE","fLNg8gf8rI","MezSWWaim6","okgRiTCgPp","YjB9t7hyVv","7lUXZS77LH","Rxrsmsx5Gl",
+"a00b5xReec","h1zcHoVQp6","QworuHlUbF","xXTI4ix74r","n8pJ9okgRi","h1zcHqUJMd","ciuWzd7vjM","wDajXVIlwP","J2mQigdQsS","SjskQiwzGk",
+"fcwDablLA9","ZUnqtaFFss","lCMxyzHF1q","AgJHQJkzUn","ZUnqtQClRL","gIYvEtvdkD","taOXKydG8U","RxrsmvkCHH","k85AejiVBP","WDVWJ6AFT0",
+"CIShGOUYuF","aFFsshi5X7","taOXKjzUqR","M3zXLHP433","WMiS3wiHrZ","xXTI47fKYU","QworuZUnqt","aL6AJFPfSE","yToGWRkQke","HzZT8oGu6x",
+"IBe8kMojnP","o8Uyd7hyVv","BGaQYvOqCE","vOqCERsQUq","HRxd8HfyNQ","soy9tRBhp0","ksJbysqVrf","wDajX7fsYM","J2mQiTXQ0Z","uvf7AMK07Y",
+"AXpwEyToGW","YjB9tyofH3","LbRTHCxVEf","cQOnvqUJMd","Yf2Ecsx5Gl","5drc66AFT0","XyPZN9XyT9","5Mg9rFGzgp","BFkb8K4GS8","blLA9FNYIM",
+"oVQp67X3uy","jSjS307n1c","HzZT8lm0pD","Cp3mZKZamH","SbRYyBbwgA","n1pmOfqypy","vLsmSni2v1","5drc6L7cGc","he9IA1LB1L","aez9y0Wr5y",
+"5Mg9r24ARF","FGzgp2hEEU","OxWIHRBhp0","aFFssStlDJ","FLsphyToGW","1LB1LAkKTk","uAWypRxrsm","azIWpLDk6f","DQimptl72W","LewvM8RCUA",
+"gIYvEYw2oU","X6PinNcICA","PYBf4iwzGk","jSjS38U2nU","JIqXipvgjS","XyPZNtl72W","UmaEvrKDLJ","uvf7A1LB1L","0YAGHAkKTk","k85AeQssNC",
+"FLsphYjB9t","hYBCKuZPqg","azIWpt98iW","wDajXgdQsS","Mkgy8dmoS7","gtCA5OHaBz","pmeCd45cIH","wDajXfaHir","TXQ0ZOUqFM","K4GS8ru4UG",
+"W3VFHfLNg8","oGu6x45cIH","hSSvQHlUbF","y94nwkZANm","0YAGHoGu6x","M6qcGMmsIo","uPX7GJRJQB","MGlTFlViBv","CNHmv0PktI","iKqhrEOE1o",
+"cQOnvfFDrJ","JXljWMezSW","iqv4kyvOMI","CIShG5IhmG","ru4UGNxx9V","lj07Q7Ow5C","HlUbFZv7z0","Z4I1vyToGW","hE1QlfcJOy","DG4sTgdQsS",
+"CK5W7S2Dfu","Waim6HRxd8","lH1ktTCgPp","Yf2EcgdQsS","5nmWvYOfrY","EdBKcWreyP","bZLvSd7vjM","1j5L88cVD3","lCMxyoVQp6","9XyT90PktI",
+"4dEz6zqH0W","Cp3mZ2DREs","TwanoW3VFH","9XyT907n1c","jzUqRe6e4z","nFqik5drc6","7lUXZEOE1o","2DREshE1Ql","RkQkegf8rI","t98iWAgJHQ",
+"pAhR1LewvM","dmoS7NcICA","9iGoTrz7Ut","gIYvEatef2","FLsphIjTwP","gf8rIk85Ae","K20wKd7vjM","b29RJRpBQm","wiHrZpWiOs","L7cGcM6qcG",
+"oGu6xyofH3","CxVEf48cHL","StlDJP6bcg","Cfgr3GWqqX","pmeCd7fKYU","PYBf4yluBx","RBhp0piJSk","AgJHQCxVEf","ydG8UuAWyp","0YAGHn1pmO",
+"VLTy6EOE1o","Gv3FqzFgtB","WDVWJqQxHP","atef2gtCA5","pT8wu9rlg9","dpe1vDQimp","mz8gxs93Ml","5Drn07ku1p","t98iWwiHrZ","5iGN5PYBf4",
+"29QAzgtCA5","L7cGcNhXdu","618DiDLhzM","Oz8yZWmadA","a00b5JJs5m","cmXIX9XyT9","L7cGcrKDLJ","Zv7z00YAGH","lm0pDn1pmO","EOE1omX2GE",
+"Oz8yZn8pJ9","t59lRlH1kt","mX2GEOUqFM","7hyVvVjCZq","7ku1pn8pJ9","I7p2aRsQUq","Gv3Fqsoy9t","FPfSEiKqhr","uJScXuJScX","9iGoT0Kyfs",
+"zbIYYL7cGc","2hEEUAmdQd","55rfB7lUXZ","jzUqRYjB9t","8xEKzogLgc","BCxeC5Namm","WaWsvZzJHW","GrDg7HzZT8","3weIFMmsIo","rz7Ut0h1b1",
+"Nxx9Vd85a9","8FmFHYOfrY","Ta8f6ix74r","FhtgllXFOB","0BmCypT8wu","HfyNQ7fsYM","pvgjSuupzk","9rlg9FPfSE","sqVrfCNHmv","fLNg8jSjS3",
+"W7cTsL7cGc","07n1cWreyP","yToGWaFFss","okgRiWMiS3","0MR5X45cIH","StlDJoVQp6","pT8wuP6bcg","oQ87rjzUqR","UlU3Mlm0pD","fcJOyyvOMI",
+"azIWp29QAz","0KyfsVIlwP","9y4lwlsQGo","uLtKsiwzGk","0ao3leuZA5","7ku1pKsjRK","QChxszqH0W","VBjhzi3pyd","9XyT9okgRi","RkQkeNAFuw",
+"HRxd8VBjhz","suY4xn1pmO","ciuWzC2Irc","RpBQm07n1c","WPmlxZJTXH","sqVrfCK5W7","jzUqRsqVrf","FnPFBfaHir","hYBCKqUJMd","MaJQs5ZaEz",
+"5nmWvJKWYR","x3LDeWmadA","TwanonlaBy","1j5L8i3pyd","FhtglpFrrl","jiVBPk85Ae","FFDuitaOXK","v2eC3lCMxy","FhtglcShY2","y94nwjzUqR",
+"SbRYySjskQ","AmdQdciuWz","QnJ1SfmIK1","lH1ktv1Hln","pv0i7618Di","i3pydYOfrY","uJScXv1Hln","QChxsaez9y","M6qcGJXljW","6AFT0ogLgc",
+"qaofN2TRI7","pAhR12ZHdk","kB5nP1j5L8","XyPZNbrhlQ","Dz1R39iGoT","tlILtoGu6x","fqypy9rlg9","iwzGkpmeCd","ogLgcpmeCd","KsjRKfcJOy",
+"zqH0WcmXIX","B3qemVIlwP","djsrvZ4I1v","xXTI4ydG8U","pmeCdKZamH","ix74ruLtKs","uvf7AFVMxo","16lHc5drc6","aFFssWPmlx","euZA5G1RhS",
+"2ZHdk8xEKz","iB08l1j5L8","yToGWQssNC","FNYIMB3qem","ksJbyAIYUu","Q6LixZhwG1","djsrvNo0Qb","Mm8siAOgEe","aL6AJtvdkD","lXFOBtaOXK",
+"qQxHP0MR5X","FnPFBWaWsv","NcICAksJby","D6rByWMiS3","Ta8f6uZPqg","MK07Y07n1c","1v5hHb29RJ","dQ586n8pJ9","M3zXLHRxd8","UlU3MQ6hMC",
+"nlaByPYBf4","YOfrYBbwgA","FNYIMkZANm","14FLR580YD","faHir2DREs","AIYUuC2Irc","0PktIiB08l","VIlwPuupzk","ThjNnWMiS3","oGu6xS2Dfu",
+"lXFOBCxVEf","qQxHPt98iW","580YDlCMxy","uAWypl83Ud","P6bcg8hJdt","FGzgp7fsYM","B3qemMGlTF","POUYS0MR5X","P6bcg07n1c","WreyPFNYIM",
+"hYBCKVerEA","iqv4kxXTI4","M6qcGoVQp6","uZPqgY1mC0","pv0i7C2Irc","618DiAkKTk","rz7Ut29QAz","Y1mC0dhSuH","4W0TllweGy","nFqikI7p2a",
+"F6PT20Kyfs","618DiuZPqg","0KyfsPb1pa","azIWptl72W","Qworu8FmFH","n8pJ9G1RhS","lXFOB5drc6","Q6hMCFjHXR","NhXduAOgEe","d85a9rz7Ut",
+"azIWpVBjhz","0ao3l0BmCy","Yf2EcfaHir","ReKEWlweGy","HfyNQVjCZq","Ta8f65nmWv","Chuy3vOqCE","ksJbyoGu6x","DG4sTzqH0W","MmsIolH1kt",
+"KASQ86q6L9","XyPZN5IhmG","faHirHfyNQ","FVMxofcJOy","NAFuwdQ586","GrDg7Mkgy8","yvOMIEoToP","nFqikgdQsS","5ZaEzv2eC3","BbwgAK4GS8",
+"ECMvUy94nw","BFkb8jiVBP","Nxx9VOUYuF","v8yFNSbRYy","VBjhzSjskQ","5IhmG618Di","5iGN5QssNC","jSjS3lXFOB","pvgjSKZamH","BGaQYsuY4x",
+"1v5hHTa8f6","StlDJhi5X7","I7p2a7fKYU","NOHszMmsIo","n8pJ9ReKEW","CNHmv3otm6","D6rByAmdQd","vOqCEZUnqt","GSQwjUlU3M","4dEz6yvOMI",
+"CqqaDgjUTu","CdyBVYjB9t","iwzGkjS1aj","ru4UG8FmFH","k85AeRBhp0","1LB1LMezSW","Mkgy8CIShG","8hJdtFhtgl","euZA5B3qem","a00b516lHc",
+"HzZT8FPfSE","MojnPMK07Y","xciqpM3zXL","KASQ8KASQ8","aL6AJb29RJ","8cVD3x3LDe","e6e4zOxWIH","8FmFHCfgr3","zz4ZUfLNg8","0Wr5yReKEW",
+"IBe8kBbwgA","4W0TlhE1Ql","zz4ZUB3qem","55rfBNAFuw","hYBCK0h1b1","Ta8f6JXljW","SmGzvL7cGc","FVMxo0PktI","No0QbazIWp","9eoRcNxx9V",
+"AgJHQKZamH","VerEAhSSvQ","QssNCd85a9","okgRi5IhmG","MK07Y1v5hH","U3yw5i7WMQ","RpBQmhSSvQ","Yw2oUsuY4x","6AFT0AmdQd","GXdoH3weIF",
+"sx5GlbrhlQ","FLsphFGzgp","9y4lwfcwDa","MaJQswiHrZ","K20wKuJScX","yvOMIK20wK","L7cGclsQGo","yofH3AkKTk","pWiOsDz1R3","7fsYMulk41",
+"K4GS8aez9y","ZJTXHxReec","5ZaEzMGlTF","DcpWByToGW","RmDcrJJs5m","YOfrYS77LH","Ul4a1bgJAz","DG4sT9y4lw","hSSvQfmIK1","Dz1R3piJSk",
+"uoStw55rfB","6q6L9MezSW","CK5W7FVMxo","l83Udlj07Q","NAFuwKASQ8","W3VFHAXpwE","MmKGJGWqqX","rhl0JRBhp0","QClRLYw2oU","oVQp6cL0aE",
+"K4GS8FwEJz","5NammyvOMI","zz4ZUv8yFN","uLtKsMkgy8","AgJHQMezSW","BCxeCKr8ys","zqH0WuJScX","DQimpGrDg7","MmKGJoGu6x","bZLvSBGaQY",
+"OHaBzogLgc","5VZjS7fKYU","cmXIXGXdoH","RpBQmSs0Zu","NOHszRsQUq","0ao3le6e4z","J2mQi5Namm","EdBKcSjskQ","uoStwdQ586","LbRTHyvOMI",
+"v1HlnWMiS3","FNYIMtvdkD","48cHLv1Hln","0KyfsqQxHP","xReecUvlv4","wiHrZx3LDe","HzZT8cQOnv","JJs5m2hEEU","uJScXnFqik","5nmWvXyPZN",
+"okgRi0Kyfs","l83UdFNYIM","Zv7z0GWqqX","fmIK1pAhR1","JRJQBDQimp","fcwDadjsrv","nFqiks7Mxk","55rfBMkgy8","BbwgAYw2oU","xReecksJby",
+"pT8wurKDLJ","zQt6QF6PT2","OxWIHKASQ8","WmadA2Yz7E","5drc6618Di","d7vjMwDajX","n8pJ9iwzGk","OHaBzpWiOs","FVMxoCIShG","WPmlx8hJdt",
+"hUTw7J2mQi","dpe1vOUYuF","VjCZqjfREu","FnPFBLDk6f","CqqaDciuWz","ZuDtDWDVWJ","EoToPzbIYY","S2DfuQYxC0","t98iWMmKGJ","ZzJHW7X3uy",
+"he9IA55rfB","xciqpWreyP","8FmFHwDajX","YjB9tW7cTs","55rfB5IhmG","blLA9ZJTXH","Mkgy8OUqFM","8U2nU0MR5X","BGaQY8xEKz","LbRTHDQimp",
+"HlUbFpWiOs","POUYSQ6Lix","zFgtBlm0pD","cShY25nmWv","SWfouThjNn","DG4sTUl4a1","ZJTXHa00b5","14FLRUvlv4","h1zcHCK5W7","FPfSEwiHrZ",
+"GWqqXdQ586","9y4lwgIYvE","ix74rzmLYD","uZPqg7ku1p","i3pydpmeCd","M3zXL2Yz7E","JKWYReuZA5","xReecIBe8k","QnJ1SBbwgA","gdQsSzbIYY",
+"8TxD7cL0aE","0YAGHQworu","uLtKsWaWsv","DQimpjzUqR","JRJQBbrhlQ","Uvlv4kB5nP","SWfouWmadA","JJs5m0BmCy","ThjNnaez9y","d85a9AmdQd",
+"pvgjS5iGN5","Chuy3nnP8o","ECMvUBbwgA","RsQUqYh1hF","l83Ud5Drn0","Vprf2POUYS","pv0i7jfREu","1v5hHReKEW","lCMxyReKEW","aDGtSwiHrZ",
+"Chuy3AOgEe","WreyPlj07Q","Gv3FqQbxXc","zY1GYjzUqR","pWiOsaDGtS","Oz8yZ5VZjS","Nxx9VxReec","ulk41cShY2","Cp3mZZUnqt","XflUqIBe8k",
+"5drc6gjUTu","J2mQiYOfrY","Nxx9Vo8Uyd","F6PT27ku1p","wiHrZ7fKYU","aL6AJcmXIX","M3zXLyToGW","QnJ1Stl72W","Ta8f6KZamH","8FmFHIBe8k",
+"Zv7z09XyT9","iB08lYjB9t","k85AePb1pa","HlUbF5drc6","16lHcdjsrv","guMb8DG4sT","guMb81LB1L","JJs5mulk41","8TxD7ZhwG1","m4bxU0MR5X",
+"Yw2oUDQimp","rz7Ut5Namm","Ta8f6cQOnv","D6rBylXFOB","5ZaEzFNYIM","Q6LixFNYIM","5NammzmLYD","VjCZqZUnqt","v1HlnDz1R3","prNT6DcpWB",
+"WDVWJIBe8k","POUYSIn3NS","n1pmONo0Qb","7fsYMK20wK","zY1GY0PktI","nnP8o5Drn0","ix74r1v5hH","JkzUnQYxC0","nlaByQbxXc","S2DfufmIK1",
+"aFFssAIYUu","Zv7z0JIqXi","SmGzvF6PT2","iKqhruJScX","HfyNQGWqqX","2ZHdkfmIK1","5IhmG14FLR","k85AegdQsS","sqVrfNOHsz","ZuDtDVBjhz",
+"o8Uydh1zcH","K20wKM3zXL","U3yw5JRJQB","uoStwDG4sT","AIYUuMojnP","dmoS7FFDui","yvOMI9eoRc","AkKTkfFDrJ","GXdoHEoToP","DcpWBIBe8k",
+"HRxd8pWiOs","XyPZNulk41","iwzGk7Ow5C","4W0TlTa8f6","y94nwRmDcr","Uvlv4fmIK1","FNYIMS2Dfu","n1pmORBhp0","uZPqgKsjRK","s93MluPX7G",
+"CNHmvHlUbF","ogLgcv8yFN","n1pmOReKEW","QChxsix74r","BbwgAgIYvE","W3VFHxReec","Oz8yZUvlv4","UmaEvpFrrl","fmIK1aDGtS","euZA5rz7Ut",
+"JJs5muTacx","hE1Qlfqypy","XyPZNazIWp","0ao3latef2","wiHrZCIShG","pmeCdtuDyS","StlDJNo0Qb","aFFssQssNC","5ZaEzOUqFM","uQIczcmXIX",
+"soy9tQWxoT","zHF1qVLTy6","7hyVvEOE1o","tl72WcShY2","kZANmnFqik","gjUTuJJs5m","ix74rnlaBy","lpF6WFGzgp","s93MlQbxXc","NhXduIRh48",
+"Pb1pa45cIH","9rlg9fcJOy","P6bcguZPqg","QChxs0h1b1","9y4lwMmKGJ","HP433AkKTk","iqv4kru4UG","ix74rgf8rI","WDVWJRsQUq","d7vjMfqypy",
+"t59lRtjQxs","WDVWJ45cIH","CqqaDpv0i7","Uvlv44QMc9","FcWrWYOfrY","okgRiAXpwE","nnP8otvdkD","azIWpQWxoT","HP433FLsph","wiHrZEdBKc",
+"faHiri3pyd","P6bcgfLNg8","nlaByQClRL","O3iyQgf8rI","zHF1q1j5L8","IjTwPmz8gx","7ku1pbrhlQ","RsQUqlCMxy","uupzkkZANm","fcJOyguMb8",
+"i3pydQssNC","d7vjMb29RJ","lXFOBhE1Ql","bgJAzMK07Y","Oz8yZtuDyS","IKxdLChuy3","WmadAhe9IA","ru4UGQYxC0","7hyVvtaOXK","yEfy9djsrv",
+"Q6hMCRxrsm","K4GS80Kyfs","n8pJ9m4bxU","y94nwFxX9q","ru4UGFwEJz","a00b51LB1L","iKqhrMkgy8","pT8wusx5Gl","S77LHEOE1o","JRJQBAgJHQ",
+"prNT6VBjhz","WaWsvlXFOB","faHirIjTwP","jtn0Xv2eC3","ZJTXHhE1Ql","Ul4a1Yw2oU","2ZHdkWMiS3","2Yz7E24ARF","soy9tazIWp","8xEKzUlU3M",
+"W3VFHcShY2","gjUTuFVMxo","SmGzvFnPFB","C2IrcMK07Y","Oz8yZHzZT8","NOHszgtCA5","guMb8CNHmv","lViBvdhSuH","zmLYDPOUYS","lm0pDiqv4k",
+"Uvlv4VIlwP","7ku1pF6PT2","jeskSpiJSk","5Drn0cShY2","yluBxrz7Ut","M3zXLVerEA","CK5W7M3zXL","nFqikBFkb8","MGlTF0ao3l","FwEJzxXTI4",
+"Uvlv4taOXK","Yh1hFMojnP","vLsmS7ku1p","cQOnvTCgPp","ulk41t98iW","ru4UGVprf2","s93MlVerEA","uJScXuPX7G","AOgEeVjCZq","fcwDapmeCd",
+"DQimpVLTy6","9XyT9J2mQi","gIYvEuAWyp","azIWplH1kt","CNHmvFVMxo","SWfouh1zcH","jS1ajM6qcG","Ul4a12Nslm","cQOnvEoToP","Gv3FqFwEJz",
+"KZamHfmIK1","he9IAuLtKs","EdBKc5iGN5","pWiOs16lHc","Yf2EcqQxHP","blLA9lViBv","d7vjMNxx9V","d85a9RzaZA","iKqhrPb1pa","m4bxURxrsm",
+"MK07YJkzUn","suY4xlkMUA","AXpwE0YAGH","Yh1hFTa8f6","taOXKvkCHH","QssNCRpBQm","hSSvQ5VZjS","2TRI7CqqaD","soy9tStlDJ","Gv3Fq9y4lw",
+"OxWIH5iGN5","G1RhSaDGtS","dhSuH7fsYM","Kr8ys5VZjS","ZhwG1Vprf2","DG4sTRzaZA","SbRYy5Namm","FNYIMLDk6f","1v5hHix74r","dQ5860ao3l",
+"ThjNnpmeCd","b29RJAOgEe","zqH0W5iGN5","VerEAoQ87r","7ku1pM6qcG","uZPqgsoy9t","DQimpI7p2a","s4786AXpwE","Ss0ZuS2Dfu","v8yFNVjCZq",
+"Waim6djsrv","RBhp0Vprf2","iB08lcShY2","iqv4k9rlg9","FNYIMjSjS3","9rlg96q6L9","MK07YLewvM","jzUqRvOqCE","ksJbyvOqCE","Q6LixxReec",
+"t98iW5ZaEz","POUYSVNCPd","tlILtyluBx","prNT6RpBQm","pv0i7Twano","oGu6xCIShG","OHaBzx3LDe","y94nwKZamH","FjHXRJXljW","YjB9tWaWsv",
+"JRJQBEdBKc","Rxrsma00b5","gjUTu64s8N","2DREs8RCUA","xciqpJIqXi","24ARFAIYUu","Waim6S2Dfu","guMb8ThjNn","iB08lZJTXH","aL6AJMmsIo",
+"OHaBzQ6hMC","e6e4zs7Mxk","vOqCEBCxeC","QChxs5IhmG","8RCUAqUJMd","lj07QtAOsr","dQ586hE1Ql","8hJdtyEfy9","lViBvvLsmS","euZA5b29RJ",
+"lViBvaFFss","Uvlv4v8yFN","h1zcHjeskS","WMiS3tl72W","7lUXZKsjRK","HlUbFokgRi","MmKGJhUTw7","ulk41b29RJ","2NslmQChxs","DcpWBSmGzv",
+"Kr8ys5drc6","vkCHHi7WMQ","uAWype6e4z","ogLgcECMvU","gf8rIrKDLJ","FcWrWmX2GE","euZA5Yw2oU","qQxHPpiJSk","55rfBmX2GE","WPmlxlweGy",
+"Zv7z0Pb1pa","7ku1pRpBQm","8cVD3DLhzM","s7MxkFcWrW","blLA9Mm8si","bgJAzfFDrJ","pvgjSQ6hMC","QWxoTCp3mZ","XflUqTwano","pT8wu24ARF",
+"HlUbFx3LDe","EOE1olViBv","NhXduWMiS3","iwzGkt98iW","YjB9tuupzk","vOqCEHfyNQ","IRh48ZzJHW","XflUqjzUqR","oVQp62Yz7E","KZamHOUqFM",
+"9y4lw0Kyfs","SWfouXflUq","GWqqXFLsph","9iGoTXflUq","ni2v15Drn0","aDGtSQChxs","n8pJ9zFgtB","XyPZNMezSW","zmLYDhUTw7","CxVEfpWiOs",
+"3weIFnFqik","8U2nUXflUq","uvf7A2DREs","aDGtSWMiS3","uLtKszQt6Q","JXljWDcpWB","WDVWJ8cVD3","M6qcGCp3mZ","nlaByDLhzM","piJSkRmDcr",
+"lsQGo7hyVv","SbRYyoVQp6","RBhp0D6rBy","MGlTFvkCHH","yToGWVjCZq","2hEEUogLgc","VerEA8U2nU","O3iyQRmDcr","d85a9HfyNQ","K20wKUmaEv",
+"pAhR1fLNg8","FjHXRL7cGc","ksJbyi3pyd","Ul4a1Cp3mZ","JXljWogLgc","faHirMK07Y","fmIK1rKDLJ","64s8NAgJHQ","CK5W7RzaZA","G1RhStAOsr",
+"5IhmGQChxs","BFkb8zQt6Q","O3iyQi3pyd","guMb85drc6","NcICABpYhV","M6qcGd85a9","MezSWjtn0X","QWxoT4dEz6","FNYIMwiHrZ","gjUTufLNg8",
+"oGu6xYOfrY","MezSWhSSvQ","dmoS7TCgPp","K20wKrz7Ut","0YAGHVLTy6","K4GS8EoToP","FGzgp8TxD7","AgJHQQnJ1S","5nmWvokgRi","jtn0Xix74r",
+"7ku1ptAOsr","8hJdtUmaEv","FNYIMGXdoH","okgRix3LDe","Vprf2VIlwP","l83Ud45cIH","StlDJZv7z0","s4786lweGy","9eoRcJIqXi","5iGN5CNHmv",
+"Yh1hFFxX9q","GSQwjZUnqt","5nmWvDQimp","v2eC3tAOsr","IRh48piJSk","B3qemMkgy8","5iGN59rlg9","t98iWuN6r3","9XyT9zY1GY","TwanoksJby",
+"faHir2ZHdk","aL6AJydG8U","tl72WPOUYS","StlDJzmLYD","6q6L9RACuj","S2Dfu48cHL","gtCA5ZUnqt","2DREsMGlTF","ru4UGJkzUn","mX2GEDQimp",
+"nlaBySWfou","0YAGHuPX7G","KASQ829QAz","Chuy3NcICA","3otm6ciuWz","l83UdM3zXL","e6e4zQClRL","cmXIXLDk6f","KASQ8dQ586","Vprf2vkCHH",
+"ZUnqt5Mg9r","WMiS3nFqik","9iGoTsx5Gl","ReKEW48cHL","IjTwPjzUqR","jiVBPmX2GE","F6PT2JRJQB","prNT6xXTI4","QbxXca00b5","Cp3mZBpYhV",
+"BbwgAQworu","3otm6MK07Y","mX2GEyToGW","lCMxy9y4lw","Nxx9VQClRL","5Drn0djsrv","Gv3FqzHF1q","FFDuiazIWp","KASQ8CqqaD","suY4xQbxXc",
+"lkMUAMaJQs","oQ87rNxx9V","BbwgA9XyT9","AkKTkuupzk","jSjS3BbwgA","QworuX6Pin","FwEJzW3VFH","CNHmvlj07Q","Z4I1vtjQxs","W3VFHgf8rI",
+"BCxeCuN6r3","ulk41580YD","KASQ89rlg9","xXTI4pAhR1","tvdkDpmeCd","jiVBPlCMxy","uLtKsAkKTk","S2DfuVIlwP","5VZjSFcWrW","soy9t9y4lw",
+"LDk6fMmKGJ","sx5GlTCgPp","Mm8siSmGzv","8xEKzJXljW","CdyBVPYBf4","9eoRcRBhp0","NOHszJkzUn","vOqCEFwEJz","vLsmSnFqik","qQxHPMojnP",
+"pWiOsECMvU","IjTwPaez9y","8TxD7CNHmv","B3qems7Mxk","OxWIHMK07Y","piJSkWaim6","s4786Mkgy8","oVQp6ZJTXH","jS1ajEOE1o","hE1Qlru4UG",
+"xXTI44dEz6","Gv3FqQClRL","v2eC3s7Mxk","QYxC0okgRi","h1zcHBbwgA","i3pydS2Dfu","zQt6QRmDcr","3otm61v5hH","GrDg7AIYUu","o8Uyd7ku1p",
+"aL6AJK20wK","QYxC0WMiS3","zFgtBbrhlQ","IRh48tlILt","tvdkDFLsph","Dz1R3faHir","KZamHUlU3M","M6qcGrhl0J","9eoRcbZLvS","UmaEvmz8gx",
+"uAWyp5ZaEz","9iGoTJXljW","OUYuFlsQGo","cQOnvjS1aj","48cHLDQimp","aL6AJqQxHP","DLhzMtjQxs","GSQwjtvdkD","Zv7z0M6qcG","EdBKcrhl0J",
+"5IhmGhSSvQ","jiVBPFjHXR","Zv7z0Zv7z0","lCMxyM3zXL","azIWpuTacx","rhl0JK4GS8","AgJHQy94nw","Yw2oUMK07Y","HzZT8SjskQ","bZLvS8RCUA",
+"ydG8U8cVD3","FjHXRrKDLJ","fcwDavLsmS","MaJQsJRJQB","7ku1pGXdoH","dQ586ZzJHW","8FmFHQClRL","07n1cn8pJ9","e6e4zBpYhV","Ul4a1fFDrJ",
+"Yf2Ec9y4lw","HRxd8vLsmS","jS1aj9GXkX","lweGyQbxXc","RBhp0dQ586","8U2nUJXljW","lweGyY1mC0","x3LDeguMb8","jfREuuTacx","fLNg8Waim6",
+"YjB9tZUnqt","FFDui8xEKz","zmLYDblLA9","zz4ZUqaofN","djsrvSWfou","8FmFHn8pJ9","pWiOso8Uyd","lkMUAF6PT2","HlUbFfqypy","Chuy3zHF1q",
+"QnJ1SU3yw5","faHirOUqFM","oGu6xh1zcH","2hEEUAgJHQ","gf8rIG1RhS","OHaBzRxrsm","3weIFuJScX","ksJbyeuZA5","ciuWz4dEz6","fLNg8v8yFN",
+"8TxD7RpBQm","24ARF8TxD7","6AFT0fLNg8","xXTI4lXFOB","Yh1hF5ZaEz","FPfSEO3iyQ","LewvMBGaQY","xReecAIYUu","i3pydhYBCK","MmKGJNcICA",
+"POUYShE1Ql","07n1c55rfB","M3zXLTCgPp","4dEz6nFqik","uPX7GnlaBy","RxrsmpiJSk","RpBQmt59lR","XflUqazIWp","qQxHPciuWz","TXQ0Zs93Ml",
+"IRh48Nxx9V","No0QbyofH3","ThjNnhi5X7","1LB1LlpF6W","kB5nPd85a9","fFDrJt59lR","qQxHPlViBv","8U2nU1v5hH","bgJAzoGu6x","0BmCy7fsYM",
+"L7cGcQbxXc","ReKEW8FmFH","M6qcGYw2oU","8RCUAGXdoH","5Drn03weIF","5nmWvzz4ZU","Uvlv4kZANm","No0QbHRxd8","WPmlxIRh48","4dEz6CqqaD",
+"MojnPsqVrf","Chuy3JIqXi","Cfgr3YjB9t","l83UdNcICA","07n1ct98iW","bZLvSHlUbF","1LB1LsuY4x","5drc6aL6AJ","FPfSEgIYvE","Mkgy8pv0i7",
+"5ZaEzzHF1q","Ul4a1brhlQ","Mm8siStlDJ","FGzgpHfyNQ","zbIYYjSjS3","v1HlnQYxC0","h1zcHQssNC","IKxdL9y4lw","S2Dfu3otm6","WMiS3EdBKc",
+"v8yFNWaim6","FPfSEVjCZq","QClRLNhXdu","HzZT8gtCA5","XyPZNqQxHP","lm0pDuAWyp","pWiOsfaHir","hUTw7CdyBV","RpBQmJkzUn","uZPqgAXpwE",
+"DQimp9y4lw","k85AecShY2","uvf7A9iGoT","aL6AJqUJMd","MmsIoW3VFH","uvf7AJRJQB","uTacxStlDJ","45cIHgIYvE","Yh1hF0PktI","QWxoTZzJHW",
+"tAOsrtjQxs","SWfou4dEz6","ni2v1hSSvQ","atef22TRI7","3weIF8cVD3","4QMc9zz4ZU","t59lRQbxXc","rKDLJ5ZaEz","bgJAzzqH0W","ulk41s7Mxk",
+"xReecaFFss","WMiS38cVD3","0ao3l1v5hH","HRxd8vkCHH","tuDySX6Pin","s4786gf8rI","ReKEWCp3mZ","POUYSRxrsm","cQOnvSbRYy","Chuy3a00b5",
+"Yf2Ec5Drn0","d85a9l83Ud","8TxD7gf8rI","xciqpPb1pa","RBhp0JJs5m","yluBxaez9y","iqv4k7X3uy","i7WMQru4UG","1LB1LBCxeC","QWxoTt59lR",
+"ZhwG1ZJTXH","LewvMQYxC0","GXdoHtaOXK","OUYuFFVMxo","MaJQszbIYY","NOHsz4W0Tl","prNT6EdBKc","jtn0XkB5nP","5Namm8U2nU","lsQGoCdyBV",
+"NhXdu2Nslm","Z4I1vJIqXi","zqH0WdQ586","5Mg9rKsjRK","Yw2oUJKWYR","uQIczh1zcH","G1RhSwDajX","tlILt4W0Tl","2DREspmeCd","soy9tOxWIH",
+"CxVEf55rfB","8RCUAyvOMI","7lUXZFnPFB","yofH3CK5W7","1LB1LiB08l","14FLRUlU3M","gtCA53weIF","29QAzCIShG","CNHmvK20wK","29QAzzmLYD",
+"5VZjSatef2","6AFT0uN6r3","RsQUqoGu6x","55rfB0YAGH","AOgEeCIShG","oGu6xt59lR","In3NSW3VFH","55rfBVBjhz","VjCZqOUYuF","OUqFMCK5W7",
+"VerEAHlUbF","JJs5mWPmlx","AXpwE2Nslm","HP433lweGy","pT8wuQChxs","tAOsr580YD","Yh1hFm4bxU","zY1GYL7cGc","sqVrfQClRL","FjHXRiB08l",
+"AIYUuyvOMI","24ARFZv7z0","RBhp08FmFH","IRh48FVMxo","uoStwZv7z0","FxX9qRBhp0","BbwgACdyBV","QworuguMb8","guMb8v1Hln","kZANm7fsYM",
+"pvgjSY1mC0","bZLvSEdBKc","l83Udhi5X7","VjCZq8TxD7","s4786n1pmO","CdyBVCfgr3","KASQ8AOgEe","vLsmSh1zcH","O3iyQxciqp","RxrsmJKWYR",
+"LewvMyvOMI","fcwDaD6rBy","ydG8U7hyVv","v8yFN9iGoT","SWfouMm8si","gdQsSjSjS3","8RCUAtl72W","d7vjMHP433","AmdQda00b5","AIYUuD6rBy",
+"azIWpSWfou","tAOsrOUqFM","RsQUqHRxd8","d85a90Wr5y","MGlTFhSSvQ","DG4sTFPfSE","64s8NogLgc","VjCZqhUTw7","55rfBPOUYS","DQimp0PktI",
+"BpYhVStlDJ","8xEKzZzJHW","bZLvS7lUXZ","JIqXi0BmCy","zmLYDGSQwj","e6e4zksJby","SmGzvFjHXR","AmdQdWaim6","fcJOyEdBKc","7lUXZQChxs",
+"o8Uyd1LB1L","8cVD3CIShG","suY4xcShY2","QChxsGv3Fq","48cHLsoy9t","ZJTXHFGzgp","jiVBP8U2nU","MaJQs5Namm","pFrrl2hEEU","ulk41QChxs",
+"tl72WLDk6f","O3iyQlpF6W","yToGWn1pmO","AIYUuv1Hln","lH1ktNo0Qb","nFqik580YD","Vprf2xXTI4","RmDcrpAhR1","vkCHH8FmFH","zQt6QGWqqX",
+"i7WMQJKWYR","7Ow5CguMb8","gtCA5lsQGo","BbwgAYh1hF","sx5Glv1Hln","0KyfsyofH3","euZA5mz8gx","Mm8si7Ow5C","xciqpIn3NS","faHirgIYvE",
+"ZhwG1wiHrZ","MaJQsru4UG","jiVBPS77LH","jeskSokgRi","tuDySa00b5","oVQp6y94nw","FPfSEVprf2","Oz8yZSWfou","GXdoHuZPqg","vkCHHyEfy9",
+"QnJ1SPYBf4","HP433AIYUu","aez9y9y4lw","PYBf4nnP8o","uAWypQnJ1S","AIYUuxciqp","XflUqFFDui","cQOnvKr8ys","S2DfufFDrJ","uN6r3ReKEW",
+"HP433WmadA","9rlg9Oz8yZ","KASQ8zmLYD","S2DfuzHF1q","6q6L9VIlwP","Dz1R3iwzGk","Mkgy8QWxoT","VIlwPQYxC0","LewvMtlILt","djsrvQYxC0",
+"SmGzvRBhp0","UmaEvDQimp","KsjRKSjskQ","zz4ZUzHF1q","prNT6WmadA","gtCA5iqv4k","RpBQmMGlTF","hUTw7Chuy3","ni2v1wDajX","a00b5Waim6",
+"lj07QyEfy9","Rxrsm7Ow5C","0ao3lQ6Lix","VerEAuJScX","uoStwQ6Lix","FVMxo29QAz","O3iyQtl72W","d7vjMFcWrW","yvOMISWfou","OUYuFFGzgp",
+"pvgjSoQ87r","lweGyzmLYD","JkzUnrz7Ut","taOXKzmLYD","JkzUnfcJOy","QClRLulk41","pFrrlAmdQd","zqH0WOUqFM","0MR5Xrz7Ut","U3yw5J2mQi",
+"Q6hMCYh1hF","FcWrWpAhR1","ru4UG2ZHdk","P6bcgjzUqR","cmXIXatef2","VLTy6zmLYD","KZamHtuDyS","jiVBPkB5nP","NcICAKASQ8","OUqFMGXdoH",
+"0PktI3otm6","QClRLdQ586","zQt6QVerEA","MK07YtvdkD","RBhp0NhXdu","dhSuHFnPFB","IKxdLo8Uyd","24ARFeuZA5","9XyT9t98iW","brhlQVprf2",
+"I7p2aaDGtS","RACujKASQ8","taOXK5ZaEz","Chuy3nlaBy","ZUnqtyvOMI","lXFOBW7cTs","8xEKzbZLvS","LbRTHCNHmv","kZANmZ4I1v","DcpWBzY1GY",
+"M6qcGUmaEv","F6PT2VLTy6","TXQ0ZIRh48","guMb87X3uy","i7WMQuJScX","mz8gxe6e4z","fFDrJjSjS3","AIYUuJXljW","lsQGolkMUA","MmKGJ5iGN5",
+"HRxd8ciuWz","zQt6Q55rfB","EdBKcpT8wu","K20wKcQOnv","ReKEWJKWYR","AmdQdOHaBz","Q6LixFhtgl","mX2GE7Ow5C","VerEAMkgy8","yluBxzbIYY",
+"x3LDeNAFuw","MojnP3weIF","M6qcGuQIcz","yofH3atef2","AOgEeNxx9V","1v5hHzY1GY","48cHLSs0Zu","3weIFFLsph","L7cGc3weIF","o8UydzqH0W",
+"OHaBzuQIcz","24ARFlm0pD","nnP8ohYBCK","ogLgc5drc6","0ao3lIKxdL","FcWrWVerEA","ZuDtDlpF6W","tlILtChuy3","suY4xuupzk","ulk41IjTwP",
+"uupzkjtn0X","k85AejzUqR","No0Qblm0pD","hSSvQx3LDe","lpF6WI7p2a","nlaByThjNn","dQ5869eoRc","wDajXk85Ae","zQt6Q5IhmG","ZuDtDm4bxU",
+"580YDQworu","uN6r3UlU3M","8RCUAOz8yZ","tjQxslpF6W","ZuDtDqUJMd","AgJHQNOHsz","aez9yuN6r3","48cHLrKDLJ","d85a9DG4sT","14FLRlm0pD",
+"o8Uyd5Drn0","AOgEehe9IA","2TRI7pT8wu","dmoS7C2Irc","fFDrJtaOXK","BGaQYlViBv","TwanoQnJ1S","ZhwG1kB5nP","lm0pDQworu","ni2v1QssNC",
+"zHF1qJRJQB","hi5X7tjQxs","29QAzMGlTF","SbRYyfcJOy","RzaZAlj07Q","2ZHdko8Uyd","580YDogLgc","OUqFM5Drn0","J2mQib29RJ","NOHszRkQke",
+"fLNg8uLtKs","pAhR1W3VFH","Q6LixhUTw7","RBhp0BGaQY","Waim6pmeCd","vLsmS8cVD3","a00b5NOHsz","uupzkJ2mQi","9rlg92ZHdk","xXTI4KASQ8",
+"bZLvS5VZjS","64s8N48cHL","2NslmWmadA","AIYUuQYxC0","IBe8kqQxHP","W7cTs1LB1L","zFgtBa00b5","LewvM16lHc","nlaByOUqFM","BGaQYgdQsS",
+"WmadAJKWYR","FnPFBEOE1o","AXpwErhl0J","BFkb8ECMvU","iB08lv8yFN","6AFT0RsQUq","cL0aE16lHc","FxX9q8hJdt","DG4sT2Nslm","hSSvQJJs5m",
+"FxX9q2Nslm","HlUbFMkgy8","dpe1vxciqp","2ZHdkAOgEe","lViBvPOUYS","5nmWvdmoS7","jSjS3J2mQi","4dEz6RzaZA","YjB9tFxX9q","9GXkXZUnqt",
+"HlUbFZhwG1","k85AeYOfrY","SmGzvuPX7G","S2DfuFxX9q","FnPFB4W0Tl","6q6L9WMiS3","7fKYUMK07Y","ydG8U2hEEU","zz4ZUIn3NS","KsjRKzz4ZU",
+"FNYIMlViBv","JRJQBaL6AJ","ZuDtDuoStw","gf8rIlsQGo","NcICAydG8U","AkKTk1v5hH","KsjRKzQt6Q","GXdoHjS1aj","6q6L9rKDLJ","oQ87rZJTXH",
+"1j5L8HRxd8","2ZHdkWDVWJ","ThjNnQbxXc","YjB9tFhtgl","AkKTkyEfy9","MojnPi3pyd","uvf7AFwEJz","NOHszFwEJz","16lHczHF1q","CxVEfSWfou",
+"m4bxUCNHmv","2DREsa00b5","uPX7G45cIH","M6qcGn8pJ9","uvf7AtjQxs","TwanoFhtgl","FjHXRYOfrY","s7MxkyToGW","NhXduPYBf4","Mkgy8ThjNn",
+"64s8NZJTXH","AIYUuFwEJz","618Di7fsYM","jzUqRCqqaD","EdBKct59lR","v2eC3bgJAz","kZANmokgRi","l83UdgIYvE","WPmlxuvf7A","9y4lwzQt6Q",
+"WDVWJn1pmO","lViBvxReec","FxX9qzmLYD","yluBx16lHc","taOXKtaOXK","IBe8kTXQ0Z","fFDrJ8xEKz","FFDui0YAGH","yToGWhi5X7","O3iyQUmaEv",
+"ThjNnatef2","9y4lwlkMUA","4W0TlfcJOy","m4bxU0BmCy","No0Qb48cHL","kZANmFcWrW","GrDg7580YD","t98iWRzaZA","BbwgAS77LH","DQimpni2v1",
+"BbwgA7X3uy","Cp3mZkB5nP","7Ow5CW3VFH","FPfSERACuj","64s8NRACuj","okgRinlaBy","FFDuijS1aj","MojnPb29RJ","U3yw5XyPZN","ThjNnU3yw5",
+"GXdoHX6Pin","Nxx9VpAhR1","7ku1pM3zXL","07n1cMmKGJ","x3LDekB5nP","lweGy5drc6","aez9y5drc6","CNHmvl83Ud","DQimpMGlTF","24ARFP6bcg",
+"QClRLyluBx","HRxd8a00b5","qQxHPZuDtD","TXQ0ZZJTXH","lm0pDFGzgp","JJs5muN6r3","OUYuFqaofN","Q6hMCfcJOy","suY4xjSjS3","Y1mC0Gv3Fq",
+"S2Dfu24ARF","djsrvK20wK","zFgtB14FLR","rhl0Jl83Ud","I7p2aeuZA5","L7cGcqQxHP","8FmFHuZPqg","IKxdLaL6AJ","xciqpXflUq","HzZT8fLNg8",
+"MK07YM3zXL","fcJOyuAWyp","EdBKclpF6W","xReeczz4ZU","GrDg7XflUq","J2mQi2ZHdk","3otm64QMc9","Cp3mZuLtKs","EOE1oAIYUu","xXTI4aez9y",
+"xciqpjiVBP","W3VFHOz8yZ","jtn0XzHF1q","QClRLAXpwE","Q6LixKsjRK","zmLYDSWfou","nlaByK4GS8","3otm6gdQsS","ulk41Vprf2","8cVD3NhXdu",
+"2DREsFFDui","okgRi14FLR","8RCUAmz8gx","FnPFBhi5X7","oQ87rB3qem","dhSuHb29RJ","m4bxURkQke","aL6AJxciqp","1LB1LCdyBV","iKqhrJRJQB",
+"s93MlaFFss","pWiOs7lUXZ","kB5nPS77LH","6AFT08U2nU","aez9y1v5hH","taOXKhUTw7","o8UydGrDg7","vLsmSKsjRK","CIShGpAhR1","wDajXy94nw",
+"BFkb8t98iW","jS1ajFLsph","QWxoTqQxHP","FLsphlH1kt","2Yz7ElCMxy","gjUTuMGlTF","WaWsveuZA5","AIYUurhl0J","t59lRTCgPp","s4786gjUTu",
+"ciuWz5VZjS","azIWpUl4a1","Uvlv4KASQ8","K4GS8VLTy6","tuDyS9eoRc","zQt6QlweGy","suY4xUvlv4","lCMxytAOsr","oVQp6h1zcH","BbwgABpYhV",
+"lpF6WJ2mQi","KASQ83weIF","uupzks93Ml","x3LDexciqp","lViBvv2eC3","5drc6BGaQY","gIYvEhYBCK","pmeCdo8Uyd","MGlTFL7cGc","lkMUAjfREu",
+"0Wr5y5Mg9r","DcpWBrz7Ut","EdBKcCqqaD","C2Ircjtn0X","FPfSEuTacx","9eoRcuupzk","K4GS8CdyBV","VLTy68U2nU","2DREs2DREs","nFqiktAOsr",
+"0ao3lhYBCK","PYBf4m4bxU","POUYStvdkD","xReec0YAGH","PYBf4djsrv","gf8rI8cVD3","ni2v19rlg9","pmeCddhSuH","MK07Y8U2nU","wiHrZb29RJ",
+"0Kyfsmz8gx","ksJbySs0Zu","WMiS3VNCPd","CNHmvUmaEv","MmsIo4dEz6","FcWrWv2eC3","oQ87r4QMc9","wDajXatef2","jSjS3MmKGJ","aez9ytlILt",
+"hi5X7Vprf2","fFDrJBCxeC","Pb1pa55rfB","7fsYMChuy3","FxX9qK4GS8","uQIczHP433","okgRiMmKGJ","16lHcO3iyQ","EdBKcDLhzM","HP433wDajX",
+"5iGN57Ow5C","gtCA5AOgEe","EOE1oTXQ0Z","pWiOsoQ87r","BGaQYFcWrW","FwEJzXflUq","i3pydTa8f6","m4bxUUmaEv","7lUXZtvdkD","BpYhVFVMxo",
+"ZJTXHJIqXi","vOqCEFGzgp","QYxC0S77LH","piJSkJRJQB","FcWrWlViBv","JRJQBpWiOs","W7cTsfaHir","Q6Lix1LB1L","16lHcfLNg8","DQimp1LB1L",
+"prNT629QAz","uoStw5ZaEz","TXQ0ZIn3NS","nFqikzqH0W","Z4I1vuJScX","ZUnqttvdkD","HP433CNHmv","t98iWsuY4x","uupzk2hEEU","piJSkDz1R3",
+"JRJQBQ6hMC","45cIHYh1hF","FVMxoM3zXL","5Mg9rtuDyS","vkCHHjSjS3","VLTy6brhlQ","1v5hHsuY4x","SmGzvGWqqX","FFDuiHzZT8","Yw2oUs4786",
+"l83UduLtKs","GXdoHZzJHW","Cfgr3S2Dfu","In3NSokgRi","7fsYMGrDg7","pv0i7Ta8f6","AkKTkFVMxo","Cfgr3SjskQ","FVMxoNxx9V","guMb8iKqhr",
+"3otm6vLsmS","KASQ8K4GS8","8RCUAD6rBy","7Ow5CWDVWJ","okgRi8RCUA","lkMUAGXdoH","9y4lw3otm6","AOgEeDcpWB","fLNg8618Di","UlU3MYh1hF",
+"l83UdStlDJ","GWqqXWPmlx","e6e4z45cIH","pWiOs580YD","5NammOxWIH","7Ow5CZzJHW","l83UdhYBCK","tjQxsZuDtD","ZJTXHgjUTu","8hJdtrKDLJ",
+"D6rByo8Uyd","WreyPRBhp0","ZzJHWrhl0J","oQ87r9iGoT","dmoS7lkMUA","D6rByRBhp0","ZJTXHb29RJ","4dEz6a00b5","Gv3Fq64s8N","Q6hMCLbRTH",
+"5ZaEzXflUq","1LB1LVIlwP","J2mQiYjB9t","55rfBFjHXR","FjHXRni2v1","ThjNntuDyS","5Mg9rEdBKc","zz4ZUoGu6x","FGzgpCdyBV","0BmCyRACuj",
+"CqqaDaL6AJ","Yw2oUYOfrY","7ku1pdhSuH","zqH0WP6bcg","aez9yMojnP","9rlg9D6rBy","faHirwDajX","Q6Lix9GXkX","2Nslmlj07Q","MGlTFOz8yZ",
+"9rlg9KZamH","B3qemBpYhV","euZA5Pb1pa","14FLRAOgEe","ThjNnFhtgl","QWxoTP6bcg","0KyfslkMUA","FnPFBlkMUA","J2mQiwDajX","2Yz7EZUnqt",
+"FPfSESbRYy","yofH3qQxHP","MmKGJm4bxU","55rfBfqypy","zbIYYn8pJ9","cShY2fcwDa","dmoS7Rxrsm","Chuy3QnJ1S","JIqXiRBhp0","NcICAjzUqR",
+"zz4ZU6q6L9","IBe8kThjNn","FPfSESs0Zu","7X3uyyvOMI","IKxdLcL0aE","okgRiVerEA","VIlwPC2Irc","tuDySjtn0X","zmLYDDcpWB","lCMxydhSuH",
+"lweGylViBv","kZANmpWiOs","VNCPdgdQsS","v8yFN7lUXZ","fLNg8FPfSE","k85Aev2eC3","nnP8ouN6r3","16lHc2DREs","uPX7GzQt6Q","ZJTXHBbwgA",
+"Oz8yZpiJSk","h1zcHGrDg7","ZuDtDk85Ae","yofH3gjUTu","uZPqgWaWsv","blLA9MmsIo","ZhwG1DcpWB","618DiiB08l","5iGN5y94nw","5ZaEzydG8U",
+"ciuWzLDk6f","iB08lfcwDa","S2DfuHzZT8","ZhwG1fFDrJ","Cfgr3JRJQB","zFgtBWaWsv","Cfgr3JkzUn","U3yw5dQ586","ru4UGxciqp","JIqXiaDGtS",
+"HlUbFogLgc","pFrrln1pmO","ZJTXHcShY2","tvdkDCp3mZ","yvOMIYw2oU","2ZHdkMezSW","hUTw7zQt6Q","bgJAznFqik","5drc61v5hH","8FmFHiKqhr",
+"StlDJ5ZaEz","ReKEW1v5hH","rKDLJHRxd8","0ao3ltlILt","n1pmOZzJHW","F6PT2VNCPd","qaofNzz4ZU","1LB1LfLNg8","fcwDayofH3","DQimp618Di",
+"8hJdt5IhmG","uAWyptuDyS","5IhmGVerEA","pWiOsjfREu","Pb1pauAWyp","RmDcrTXQ0Z","5ZaEztuDyS","n1pmOfaHir","5nmWv14FLR","oVQp6RpBQm",
+"FVMxo1j5L8","uN6r3zz4ZU","Fhtgl29QAz","K20wK29QAz","0h1b18FmFH","7fKYUNo0Qb","AXpwEWaim6","pT8wuYw2oU","OUYuFi3pyd","s47865Mg9r",
+"qQxHPa00b5","yvOMIbrhlQ","9eoRc55rfB","VjCZqtjQxs","GXdoHtlILt","U3yw5ECMvU","RBhp0azIWp","yofH3i7WMQ","FnPFBZv7z0","k85AeYjB9t",
+"GXdoHFGzgp","J2mQiGSQwj","OUYuFhYBCK","AgJHQUlU3M","ECMvUHzZT8","oVQp6b29RJ","JXljWcL0aE","djsrvAkKTk","5VZjS7lUXZ","gtCA51LB1L",
+"RzaZAtjQxs","t98iW3otm6","hUTw7Vprf2","RxrsmW7cTs","Yh1hFwDajX","NOHszP6bcg","LDk6f45cIH","ZJTXHv8yFN","Nxx9V7X3uy","TwanoRBhp0",
+"ru4UGLbRTH","uPX7GHP433","oVQp6Rxrsm","xciqp0ao3l","pvgjSn8pJ9","GWqqXPYBf4","9rlg9ZJTXH","SmGzvzHF1q","KASQ8iwzGk","0Kyfs9GXkX",
+"5VZjSRACuj","JJs5mlweGy","x3LDe9eoRc","WmadAGrDg7","HP433a00b5","MGlTFX6Pin","zFgtBpmeCd","y94nw0Wr5y","jtn0XtaOXK","uN6r3uupzk",
+"rhl0JZhwG1","XyPZNMojnP","RpBQmCxVEf","uLtKs4dEz6","okgRiUvlv4","JRJQBFwEJz","jiVBPMGlTF","AmdQdOUqFM","2TRI78cVD3","e6e4zCIShG",
+"lXFOBa00b5","Yf2EcCxVEf","ksJbyMmsIo","HzZT83weIF","29QAzhi5X7","HfyNQuvf7A","mz8gxaFFss","xciqpCp3mZ","XflUq2Nslm","bZLvStaOXK",
+"he9IAFxX9q","o8UydLbRTH","9y4lwOHaBz","euZA5blLA9","0MR5XiKqhr","5Drn0jS1aj","4QMc9AkKTk","EdBKcuQIcz","blLA98cVD3","OxWIHNAFuw",
+"t59lRv2eC3","Rxrsmd85a9","OHaBz4QMc9","tAOsraFFss","sqVrfuTacx","07n1cbZLvS","mX2GE9eoRc","0YAGHqaofN","7Ow5CI7p2a","JXljWv8yFN",
+"jfREud7vjM","n8pJ9FVMxo","x3LDen8pJ9","LewvMFnPFB","ZhwG1JIqXi","Waim6gtCA5","BFkb8FGzgp","O3iyQDQimp","SmGzvQWxoT","0MR5XFLsph",
+"Fhtgl0Wr5y","1LB1LRBhp0","hE1Qluupzk","FxX9q5Mg9r","dmoS7mX2GE","zqH0WjeskS","Mm8siJJs5m","nFqikuupzk","POUYSuoStw","wDajXh1zcH",
+"KASQ8tvdkD","8cVD3wiHrZ","pv0i72Nslm","2TRI7FGzgp","JkzUntjQxs","aFFssgtCA5","ulk41aez9y","uJScXrhl0J","5ZaEzHRxd8","wDajXxReec",
+"VBjhzCIShG","RBhp0ulk41","BCxeCpFrrl","prNT6Nxx9V","0Wr5ylXFOB","ni2v1jfREu","kB5nPnnP8o","aL6AJX6Pin","lsQGo9iGoT","0KyfsZhwG1",
+"lH1ktThjNn","POUYS2hEEU","n8pJ98TxD7","7ku1poQ87r","KZamHG1RhS","XflUqpvgjS","Q6hMCVprf2","VIlwPk85Ae","8cVD3CqqaD","NAFuwCp3mZ",
+"3weIFJJs5m","4QMc9580YD","AkKTkJRJQB","pmeCdRsQUq","azIWphYBCK","I7p2aXyPZN","L7cGcCp3mZ","5Drn0soy9t","IKxdL0PktI","NAFuw5Drn0",
+"JKWYRP6bcg","5iGN5SWfou","iB08lgdQsS","8RCUANo0Qb","k85AeM3zXL","gIYvEAkKTk","FwEJzaFFss","JXljW45cIH","VBjhzTXQ0Z","MmsIoMaJQs",
+"Ul4a1ciuWz","VerEA4dEz6","B3qembZLvS","StlDJdpe1v","jS1ajChuy3","jSjS35VZjS","gtCA5okgRi","uN6r316lHc","RBhp09y4lw","pFrrlLDk6f",
+"aez9yMezSW","EoToPlkMUA","4dEz6K4GS8","aez9y0ao3l","RpBQmQbxXc","fcwDarKDLJ","SWfoucShY2","prNT6wDajX","VLTy6Vprf2","rz7Ute6e4z",
+"mX2GEMojnP","NAFuwFhtgl","BGaQY7lUXZ","8TxD7rKDLJ","RACuj3weIF","07n1cPOUYS","0MR5XJXljW","5Mg9r0h1b1","7Ow5CZv7z0","Ul4a1faHir",
+"NcICALewvM","9y4lw2TRI7","OUYuFuupzk","uPX7GcmXIX","xReecQYxC0","AgJHQVprf2","45cIHfFDrJ","xReecqUJMd","taOXKuPX7G","CqqaD5ZaEz",
+"FGzgppv0i7","G1RhScL0aE","lm0pDfLNg8","F6PT2QYxC0","0ao3lJXljW","8xEKzGXdoH","t98iWd85a9","vOqCE7fsYM","n8pJ9Yh1hF","TXQ0Z5drc6",
+"uvf7Aix74r","G1RhSo8Uyd","HP433lXFOB","ZuDtDguMb8","uPX7GMmKGJ","cL0aE5ZaEz","0BmCycShY2","HlUbFtl72W","8hJdtgf8rI","uAWypdQ586",
+"K20wKzY1GY","d7vjMpv0i7","uJScX07n1c","gf8rI2DREs","QChxs9y4lw","CdyBVfcJOy","VNCPdsqVrf","lm0pDblLA9","D6rByDQimp","KsjRKWDVWJ",
+"QYxC0yluBx","7fsYMD6rBy","5nmWvjSjS3","gdQsSMezSW","piJSkFNYIM","lXFOBvOqCE","JkzUn8cVD3","rz7Utv1Hln","djsrvOUqFM","M3zXLuN6r3",
+"RkQkeWDVWJ","7Ow5CHzZT8","WaWsvrz7Ut","CqqaDUmaEv","B3qemHzZT8","64s8N4QMc9","uvf7A9y4lw","6q6L9lm0pD","FVMxoTXQ0Z","wDajXSmGzv",
+"hYBCKNOHsz","d85a9hE1Ql","zHF1qNo0Qb","FPfSEGSQwj","LewvMx3LDe","KsjRK618Di","nFqikbZLvS","s93MlZ4I1v","9GXkXt59lR","jtn0XhSSvQ",
+"7X3uyaL6AJ","cQOnvFVMxo","0h1b1uTacx","oGu6xs93Ml","oVQp6CK5W7","he9IAlj07Q","JJs5mIn3NS","lm0pDbgJAz","okgRiDcpWB","07n1cZzJHW",
+"8RCUAGWqqX","hUTw7cShY2","WreyPvkCHH","piJSkUmaEv","b29RJkZANm","IKxdLokgRi","Cp3mZYw2oU","0h1b116lHc","7Ow5C24ARF","gjUTuQworu",
+"PYBf4TXQ0Z","tuDySFLsph","faHirmX2GE","lj07Qt98iW","ciuWz7fKYU","0PktI6q6L9","VerEANo0Qb","Uvlv40h1b1","pWiOsa00b5","piJSk5VZjS",
+"OHaBzjtn0X","zHF1qzmLYD","Q6LixNhXdu","okgRiuPX7G","iqv4kIjTwP","45cIHn1pmO","U3yw5JkzUn","FnPFBFnPFB","dmoS7i3pyd","I7p2auPX7G",
+"nlaByAIYUu","YOfrYYjB9t","1LB1LThjNn","oGu6x9y4lw","NOHszUl4a1","pT8wufcwDa","lkMUANhXdu","Q6LixGrDg7","wDajX9rlg9","IKxdLIn3NS",
+"GWqqXIRh48","FjHXR8cVD3","7lUXZuQIcz","Y1mC0O3iyQ","EOE1ociuWz","n8pJ9DLhzM","AmdQdRACuj","jfREud85a9","CqqaDcL0aE","5nmWvfcJOy",
+"BFkb8rhl0J","O3iyQFxX9q","iB08lK20wK","Cp3mZlpF6W","JIqXi2ZHdk","5nmWv5drc6","6AFT0wiHrZ","i7WMQTCgPp","i7WMQjSjS3","Gv3FqHfyNQ",
+"lm0pDL7cGc","HzZT8GrDg7","ru4UGiKqhr","aez9yfFDrJ","S2Dfuhe9IA","FxX9qpiJSk","8RCUAKr8ys","9iGoTGXdoH","MezSWnlaBy","ThjNnNAFuw",
+"JJs5mh1zcH","pv0i7BbwgA","QworukZANm","8xEKz2Yz7E","Qworu7fKYU","S2DfugIYvE","MaJQst98iW","PYBf4x3LDe","lViBvMGlTF","EdBKcQworu",
+"suY4xKASQ8","jSjS30ao3l","FjHXRMaJQs","tAOsruPX7G","Yw2oUs7Mxk","pT8wuReKEW","Chuy3SbRYy","0Wr5yZJTXH","jfREunnP8o","hE1Qle6e4z",
+"Ta8f6uPX7G","pvgjSX6Pin","AIYUugIYvE","NhXduMK07Y","zY1GYoQ87r","FcWrWS77LH","hSSvQBFkb8","QssNC2hEEU","DcpWB9y4lw","v1Hln48cHL",
+"FGzgpZ4I1v","AkKTkVprf2","FxX9qOUYuF","FwEJzSbRYy","ydG8Uhi5X7","L7cGcWmadA","guMb8RmDcr","MojnPXyPZN","uPX7GSs0Zu","aez9yHfyNQ",
+"RsQUqqUJMd","U3yw5atef2","7X3uy2Nslm","MaJQs5VZjS","ECMvUh1zcH","8RCUAQ6Lix","MmKGJgdQsS","wDajXQnJ1S","sqVrfS2Dfu","gtCA5pWiOs",
+"pT8wuW3VFH","Mm8siVerEA","hSSvQt98iW","Nxx9Vs93Ml","BFkb8Yf2Ec","FcWrWM3zXL","MezSWatef2","fFDrJAgJHQ","hUTw7pmeCd","m4bxUd7vjM",
+"blLA9BCxeC","oQ87r5iGN5","0Wr5ydQ586","No0QbNAFuw","LewvMPb1pa","TwanoCxVEf","J2mQiM3zXL","Cp3mZY1mC0","3otm6AOgEe","Yw2oUBbwgA",
+"oQ87r64s8N","HP433n8pJ9","O3iyQWDVWJ","VIlwPOHaBz","VerEAbgJAz","cQOnv14FLR","W3VFHXflUq","ReKEWpWiOs","VerEAuvf7A","POUYSv8yFN",
+"5iGN5RBhp0","uvf7Ajtn0X","Y1mC0djsrv","pT8wuWreyP","uQIczGv3Fq","SWfoux3LDe","WmadAmX2GE","Cp3mZEdBKc","hSSvQY1mC0","QClRL6AFT0",
+"AIYUu2TRI7","zFgtBPb1pa","StlDJi3pyd","4QMc9SbRYy","LbRTHSWfou","zmLYDiwzGk","AkKTkCIShG","In3NSe6e4z","taOXKPOUYS","pAhR10Wr5y",
+"yToGWPOUYS","gdQsS5IhmG","EdBKcFNYIM","ru4UGWaWsv","he9IAKr8ys","AOgEePOUYS","Kr8ysPYBf4","JXljWksJby","VNCPdFPfSE","tlILtb29RJ",
+"gIYvEvOqCE","QYxC03otm6","pFrrlMkgy8","EoToPWreyP","CqqaDhE1Ql","QChxsguMb8","JJs5mQ6hMC","MaJQsLbRTH","d7vjMCxVEf","0MR5Xi7WMQ",
+"kZANmgIYvE","ni2v1OHaBz","nFqik7ku1p","BFkb82ZHdk","lpF6W5IhmG","nlaBysx5Gl","uN6r39GXkX","XyPZN7Ow5C","45cIHVprf2","fLNg8AOgEe",
+"suY4xdjsrv","lCMxyciuWz","POUYSWDVWJ","v2eC3uN6r3","0KyfsGrDg7","he9IAMK07Y","lH1ktjtn0X","brhlQZhwG1","EOE1oUvlv4","lViBvZUnqt",
+"aDGtSrhl0J","uTacx8cVD3","7ku1pMmsIo","Gv3Fq07n1c","dQ586Dz1R3","48cHLAXpwE","l83UdRsQUq","iwzGkQChxs","CNHmv5Mg9r","D6rBy9y4lw",
+"Q6hMCWMiS3","yluBxMGlTF","X6PinZv7z0","tvdkD2hEEU","rz7UtFwEJz","fmIK1FLsph","SWfoucmXIX","nFqikCK5W7","8hJdtDG4sT","BGaQYlXFOB",
+"Zv7z0wiHrZ","OHaBz7lUXZ","lpF6Wuvf7A","9iGoTQbxXc","W3VFHuoStw","lXFOB5nmWv","QYxC0VNCPd","OHaBzMaJQs","i7WMQjS1aj","iwzGk1LB1L",
+"ix74rtl72W","4W0Tlhe9IA","t98iWyEfy9","rz7UtHzZT8","Z4I1vi7WMQ","3weIFiwzGk","1j5L8rhl0J","XflUqC2Irc","kZANmn8pJ9","U3yw50Kyfs",
+"nnP8oQClRL","AOgEelViBv","8FmFHzFgtB","t98iWIKxdL","nlaByd7vjM","0Wr5yP6bcg","QWxoTpAhR1","YjB9tFFDui","RmDcr9y4lw","Q6LixF6PT2",
+"5VZjSxciqp","QChxsvOqCE","PYBf4hi5X7","CK5W7NAFuw","CNHmvi3pyd","24ARFuQIcz","DLhzMfcJOy","PYBf4atef2","b29RJhe9IA","a00b5zqH0W",
+"QbxXc8RCUA","1j5L8vOqCE","BFkb8GWqqX","ZuDtDWreyP","NcICAEdBKc","J2mQiX6Pin","VjCZqhi5X7","8xEKzQworu","FGzgpwDajX","nnP8oi3pyd",
+"F6PT2lkMUA","Y1mC0FcWrW","MmsIoXflUq","8RCUAokgRi","l83UdZ4I1v","S2DfuQWxoT","lViBvOxWIH","HRxd8BbwgA","CIShGNcICA","Yh1hFzmLYD",
+"2TRI7KASQ8","LewvMdhSuH","sx5Gl7Ow5C","Mkgy89y4lw","yluBxUvlv4","fcJOyuTacx","AmdQdyEfy9","14FLRhi5X7","C2IrcM6qcG","P6bcgfcwDa",
+"lm0pDQssNC","IBe8kDcpWB","ECMvUMaJQs","RACujRpBQm","2TRI7Yh1hF","Y1mC0YjB9t","MmKGJuAWyp","1v5hHtaOXK","JkzUnTCgPp","Gv3Fq0Kyfs",
+"atef2cmXIX","5Mg9rLbRTH","pmeCduvf7A","v2eC3zqH0W","7ku1ptjQxs","blLA9jzUqR","O3iyQtaOXK","zbIYY1v5hH","FxX9qGv3Fq","t98iWuupzk",
+"C2IrcFVMxo","JRJQB0Kyfs","cmXIXTXQ0Z","uN6r3dmoS7","RBhp0FNYIM","BFkb8WPmlx","zQt6QkZANm","zbIYYJJs5m","ZuDtD0MR5X","Gv3FqL7cGc",
+"SjskQfcJOy","NOHszzqH0W","8xEKzIKxdL","KASQ8Mm8si","HP433QClRL","2Yz7EYh1hF","wiHrZMK07Y","i3pydTwano","S77LHRBhp0","POUYSix74r",
+"uPX7G6q6L9","S2DfuHlUbF","zFgtBvkCHH","yofH355rfB","zY1GYd85a9","ciuWzVjCZq","zFgtBJRJQB","MmsIoFLsph","uupzk2Yz7E","FhtglHzZT8",
+"NOHszW7cTs","lXFOBPb1pa","uN6r3J2mQi","5iGN5AmdQd","fcJOyPOUYS","dmoS7atef2","FLsphJJs5m","RzaZAm4bxU","faHirlH1kt","OUqFMJJs5m",
+"xReecCp3mZ","Ss0ZuY1mC0","cQOnvOUYuF","7X3uy55rfB","taOXK5nmWv","0YAGHv2eC3","AIYUuM3zXL","Gv3FquLtKs","wDajXru4UG","RmDcr9XyT9",
+"ydG8U3weIF","jfREutjQxs","X6PinCfgr3","K20wKWreyP","CqqaDSmGzv","lCMxyL7cGc","EoToPm4bxU","Ss0ZuMojnP","oGu6x14FLR","C2IrcXyPZN",
+"tlILthYBCK","azIWp5nmWv","9y4lwoVQp6","AmdQdRmDcr","cQOnvuZPqg","QbxXc8FmFH","m4bxUOUqFM","F6PT2IBe8k","OHaBzyToGW","aFFssVLTy6",
+"Q6hMCZhwG1","m4bxUVBjhz","AXpwEOUYuF","8TxD7cmXIX","zFgtBeuZA5","WDVWJJ2mQi","4dEz6Pb1pa","HfyNQxciqp","v8yFNJkzUn","ru4UGDcpWB",
+"taOXKksJby","vkCHHuAWyp","ZzJHW618Di","UmaEv8U2nU","i3pydPOUYS","oQ87r5Mg9r","WmadAVjCZq","zqH0Wh1zcH","rKDLJAIYUu","9GXkXs7Mxk",
+"pT8wuJJs5m","WMiS3RmDcr","PYBf4uLtKs","CK5W7Oz8yZ","45cIHhYBCK","9iGoTi3pyd","FVMxoIKxdL","ThjNnv1Hln","aFFssDz1R3","JXljWAOgEe",
+"prNT6aez9y","Chuy3HRxd8","F6PT2xXTI4","AIYUuZJTXH","pv0i7HP433","yluBxuvf7A","Nxx9VcQOnv","O3iyQFNYIM","lsQGoCK5W7","AIYUuix74r",
+"yofH34QMc9","NhXduHRxd8","K20wKxXTI4","5VZjSY1mC0","MK07YTCgPp","8RCUAQbxXc","uoStwSs0Zu","Yf2EcQbxXc","GWqqXIjTwP","0MR5XJkzUn",
+"qaofN64s8N","tlILtyvOMI","a00b5lweGy","XflUqAkKTk","gdQsSHlUbF","azIWpD6rBy","NcICAC2Irc","Yw2oU14FLR","IRh48Rxrsm","HRxd8BFkb8",
+"uvf7AW3VFH","RzaZAqQxHP","ni2v1uQIcz","0BmCyHfyNQ","AOgEe7fsYM","2NslmcQOnv","IBe8kYw2oU","x3LDehe9IA","RpBQmv1Hln","tjQxsVjCZq",
+"vkCHH8RCUA","djsrvl83Ud","Ta8f6ZhwG1","s4786uQIcz","5Mg9rlsQGo","HzZT8piJSk","gIYvEn1pmO","5Mg9ruTacx","Pb1paTwano","iKqhrWaWsv",
+"lCMxyCqqaD","QbxXctl72W","LewvM2hEEU","2ZHdk4QMc9","azIWpVprf2","b29RJW7cTs","MojnP4QMc9","QWxoTMGlTF","v2eC39eoRc","0h1b1e6e4z",
+"uvf7A0ao3l","0h1b1Q6hMC","F6PT2Qworu","1j5L8KsjRK","Yw2oURmDcr","0PktIdQ586","soy9t2Nslm","v1HlnQChxs","yluBxECMvU","EoToPpFrrl",
+"64s8NReKEW","8TxD75iGN5","hSSvQVjCZq","W3VFHGWqqX","QYxC0taOXK","618DiLDk6f","DQimpMaJQs","5drc6AIYUu","JRJQBx3LDe","ksJbyJKWYR",
+"tAOsrW7cTs","5nmWv4dEz6","5drc65drc6","Yf2EcpiJSk","vOqCEBGaQY","uTacxuQIcz","NcICApv0i7","fcJOyogLgc","B3qem14FLR","U3yw5rz7Ut",
+"cmXIX8FmFH","yEfy9Gv3Fq","uLtKsgdQsS","5ZaEzIRh48","yluBxfaHir","faHiriKqhr","o8Uyd2ZHdk","Ul4a1prNT6","FLsph8TxD7","okgRipiJSk",
+"7Ow5Csx5Gl","5Mg9rd7vjM","5Mg9rpT8wu","XyPZNGrDg7","BpYhVVerEA","UmaEvlpF6W","jeskStvdkD","PYBf4cQOnv","hi5X7WmadA","FxX9q7hyVv",
+"QWxoT2hEEU","DQimpX6Pin","4dEz6QYxC0","kZANmUvlv4","iqv4k5Drn0","xXTI4AOgEe","qUJMdzbIYY","TXQ0ZyEfy9","MmsIolsQGo","lj07Q5drc6",
+"SjskQReKEW","gf8rIMezSW","CdyBVQChxs","wiHrZuAWyp","cL0aECxVEf","lweGyfmIK1","7X3uy16lHc","HP433l83Ud","Nxx9VZuDtD","5ZaEzVprf2",
+"dQ586d7vjM","RzaZA5Mg9r","lH1ktjiVBP","i7WMQOUqFM","WMiS3fcwDa","GXdoH5Mg9r","NOHszTwano","9y4lwiqv4k","FNYIM9GXkX","ThjNn8xEKz",
+"JRJQBsx5Gl","RBhp0lViBv","3otm6HfyNQ","2DREsQ6Lix","Yw2oU7lUXZ","d85a9ZUnqt","Mkgy8ZJTXH","Ss0ZuOz8yZ","8xEKzzHF1q","45cIH7Ow5C",
+"hSSvQStlDJ","he9IAWPmlx","Ss0Zum4bxU","e6e4z6AFT0","3weIFHfyNQ","atef2MojnP","W3VFHv2eC3","WmadA2ZHdk","wiHrZtvdkD","0Wr5yRBhp0",
+"zHF1qGSQwj","KsjRKWMiS3","K20wKpv0i7","taOXKi3pyd","W7cTse6e4z","Vprf2NhXdu","iKqhr5VZjS","VjCZqTa8f6","Rxrsm1v5hH","6AFT06AFT0",
+"2NslmTwano","sx5GlKr8ys","5Drn0vOqCE","FFDuicmXIX","CK5W70ao3l","BGaQYtvdkD","Mkgy82DREs","ZzJHWh1zcH","FFDui7lUXZ","16lHcQ6hMC",
+"m4bxUt98iW","DcpWBVNCPd","4dEz65ZaEz","tvdkDCK5W7","qUJMdFnPFB","CqqaDX6Pin","HzZT8qUJMd","W7cTsAkKTk","X6PinaDGtS","FPfSECfgr3",
+"9rlg9JKWYR","BCxeCs93Ml","8U2nU5Namm","48cHLKsjRK","OHaBzo8Uyd","5Mg9rCNHmv","hE1QlCfgr3","6AFT0YOfrY","t98iWJJs5m","t98iWM3zXL",
+"MK07YS2Dfu","AkKTkiB08l","IKxdLECMvU","GXdoHjfREu","ZuDtDxReec","64s8NxXTI4","XyPZNSs0Zu","v8yFNO3iyQ","RxrsmFNYIM","xReec6AFT0",
+"Kr8ysfaHir","bgJAz48cHL","zmLYDFLsph","fLNg8fqypy","WDVWJuTacx","KASQ80h1b1","mX2GEfaHir","blLA9MojnP","G1RhSKZamH","5iGN5lpF6W",
+"iKqhr0ao3l","4dEz64W0Tl","CqqaDuvf7A","8FmFHogLgc","C2IrcDz1R3","JRJQB24ARF","JkzUnYf2Ec","NhXduC2Irc","VerEAtaOXK","rKDLJ9rlg9",
+"M6qcG8TxD7","14FLRtvdkD","brhlQ64s8N","5IhmGReKEW","lsQGosx5Gl","07n1cLewvM","5Mg9r0Kyfs","MaJQs29QAz","5NammEOE1o","0Wr5yThjNn",
+"5VZjS55rfB","zqH0WyEfy9","MmKGJdjsrv","8xEKzVNCPd","EOE1o5drc6","CIShG8U2nU","DG4sTP6bcg","P6bcg8cVD3","M6qcGi3pyd","9y4lwQ6hMC",
+"yToGWtjQxs","rz7UtG1RhS","tuDySCIShG","azIWpCxVEf","CNHmv8xEKz","rz7UtDcpWB","9iGoTEoToP","4QMc9atef2","K4GS8e6e4z","DcpWByluBx",
+"zQt6QVBjhz","5VZjSCNHmv","ulk41h1zcH","lj07QS77LH","2DREsRzaZA","0ao3lzQt6Q","oQ87rMGlTF","C2IrcOxWIH","i7WMQuvf7A","x3LDeQClRL",
+"Q6hMCDLhzM","Ul4a18hJdt","t98iWFVMxo","yofH3Nxx9V","BFkb8AOgEe","ZJTXHdpe1v","tl72WqaofN","gtCA5qaofN","MK07YSbRYy","iqv4k3otm6",
+"P6bcgwiHrZ","AIYUuwiHrZ","JkzUndQ586","e6e4z29QAz","ZUnqtYw2oU","6q6L90YAGH","atef2Y1mC0","he9IAjS1aj","HfyNQt59lR","5drc6s93Ml",
+"G1RhSHfyNQ","IKxdLBbwgA","DLhzM07n1c","pvgjSSmGzv","7hyVvaL6AJ","cL0aEfaHir","TwanohE1Ql","gdQsSYjB9t","v8yFNThjNn","HzZT8nnP8o",
+"L7cGc8RCUA","M6qcGfLNg8","rKDLJydG8U","POUYShSSvQ","0ao3lv8yFN","BFkb8soy9t","CIShGIKxdL","lpF6WNcICA","jiVBPtvdkD","WaWsvcmXIX",
+"FjHXRAIYUu","dQ586uPX7G","i7WMQi7WMQ","Kr8ys7fKYU","d85a9DQimp","RpBQmEdBKc","XflUqpAhR1","qUJMdUmaEv","J2mQiblLA9","v8yFNqQxHP",
+"zFgtBhSSvQ","gtCA5m4bxU","EoToPn1pmO","MaJQs7fsYM","okgRiChuy3","BFkb8xciqp","FnPFBU3yw5","9GXkXHP433","No0QbS2Dfu","CIShGuupzk",
+"Ul4a15ZaEz","X6PingdQsS","ksJbyM6qcG","QChxshSSvQ","nFqikyvOMI","Ss0ZuWDVWJ","Pb1palpF6W","xReecaez9y","vLsmSlpF6W","okgRivkCHH",
+"cL0aEhE1Ql","rz7UtNxx9V","TCgPp6AFT0","GSQwjlsQGo","LDk6f7ku1p","1j5L8BCxeC","1v5hH0ao3l","tuDySCxVEf","29QAzIKxdL","FNYIMRmDcr",
+"jSjS3UlU3M","1v5hHSs0Zu","StlDJjiVBP","5Mg9rv2eC3","zbIYYWPmlx","kB5nP0BmCy","Mm8siHRxd8","LDk6fVBjhz","3otm60h1b1","wDajX2hEEU",
+"FVMxo8hJdt","yvOMIQworu","xciqpDLhzM","rhl0Jlm0pD","W7cTsciuWz","AgJHQuAWyp","F6PT2Waim6","No0QbStlDJ","uPX7GvLsmS","ECMvU8U2nU",
+"a00b5cL0aE","VBjhzMK07Y","AgJHQzmLYD","v1HlnbZLvS","8FmFHIKxdL","IjTwPRkQke","HRxd8he9IA","IRh48zmLYD","I7p2aRBhp0","55rfBVNCPd",
+"GSQwjnlaBy","IRh48P6bcg","8cVD3ThjNn","xXTI4hUTw7","prNT6DQimp","O3iyQlXFOB","sqVrfAXpwE","IjTwPcmXIX","0BmCyfaHir","pWiOsiwzGk",
+"Kr8ysRxrsm","rhl0JUlU3M","cmXIX2hEEU","48cHLPYBf4","UmaEvAXpwE","7fsYMHzZT8","MK07YuAWyp","BbwgATCgPp","Q6LixM6qcG","48cHLn8pJ9",
+"AmdQdtvdkD","SWfoujzUqR","5Nammuupzk","jiVBPh1zcH","blLA90ao3l","lH1kt9y4lw","8xEKz3otm6","0Wr5yQChxs","9GXkXokgRi","iwzGkbrhlQ",
+"8hJdtI7p2a","uAWypTwano","X6Pin3otm6","7fKYUPOUYS","Cfgr34QMc9","mX2GE14FLR","QssNCPOUYS","fcJOyqaofN","fmIK1zY1GY","vOqCEUl4a1",
+"FVMxoHfyNQ","oVQp68FmFH","14FLROz8yZ","tAOsrv8yFN","pT8wuOUqFM","9y4lwVerEA","StlDJFcWrW","xXTI44QMc9","9eoRcCqqaD","t59lRNAFuw",
+"0BmCyPOUYS","ydG8UbrhlQ","pAhR1zmLYD","45cIHNo0Qb","HRxd8QssNC","uN6r3piJSk","OUYuFuQIcz","KsjRKhSSvQ","hE1Ql7X3uy","ReKEWnlaBy",
+"LewvMMojnP","48cHL5iGN5","EoToPMK07Y","Z4I1vni2v1","XflUqzz4ZU","9eoRcFwEJz","RsQUq0Kyfs","cL0aEOUqFM","lH1kti3pyd","o8UydDG4sT",
+"5Drn0gjUTu","AmdQd5drc6","5drc6iB08l","J2mQiJ2mQi","vkCHHP6bcg","I7p2aQssNC","jeskS0MR5X","LDk6fYh1hF","guMb8Oz8yZ","yEfy99y4lw",
+"nlaBylweGy","07n1cjtn0X","0h1b1Qworu","MezSW7fKYU","lkMUA2Yz7E","rz7UtJRJQB","cQOnvNhXdu","ksJbyd7vjM","QYxC0Rxrsm","DG4sTJRJQB",
+"hYBCKPb1pa","n1pmOCxVEf","yluBxmX2GE","o8Uydsoy9t","lViBvtuDyS","Q6LixhE1Ql","qUJMd7X3uy","pvgjSkB5nP","X6PinG1RhS","uQIczFVMxo",
+"pvgjSuTacx","WaWsvFVMxo","CIShGI7p2a","ni2v1k85Ae","D6rBy8RCUA","K4GS8F6PT2","rz7UtyvOMI","zY1GYblLA9","GrDg7gtCA5","AIYUu1j5L8",
+"Mkgy8KASQ8","zmLYDgdQsS","mX2GEWreyP","qaofNAkKTk","5iGN5blLA9","nlaByEdBKc","2Yz7EoGu6x","OxWIH9rlg9","dhSuHIjTwP","NcICA9y4lw",
+"ZUnqts93Ml","C2IrcyEfy9","8U2nUe6e4z","2DREsDcpWB","Uvlv4Nxx9V","9rlg9hE1Ql","5VZjSbgJAz","CIShGMGlTF","hE1QlKASQ8","SbRYy7Ow5C",
+"dpe1vfFDrJ","YjB9tFNYIM","Twano16lHc","14FLRSbRYy","rhl0JQssNC","oGu6x5Namm","wDajXWPmlx","pmeCdzqH0W","Zv7z0DLhzM","MmsIoNxx9V",
+"cL0aEyluBx","FcWrWuoStw","7hyVv55rfB","fFDrJOHaBz","gIYvEJJs5m","sx5GlLewvM","HzZT8FcWrW","FFDuis4786","cL0aESWfou","piJSkMK07Y",
+"gIYvEJkzUn","hE1QlOUYuF","7fsYMhE1Ql","BCxeCJRJQB","s7MxkKASQ8","ThjNnI7p2a","suY4xGXdoH","nnP8o580YD","VIlwPCIShG","dQ586qaofN",
+"yofH3UlU3M","JKWYRiwzGk","S2DfupvgjS","0Wr5yuTacx","oVQp6uPX7G","mz8gxjfREu","TwanoG1RhS","Ul4a1S2Dfu","qaofNGrDg7","TwanoI7p2a",
+"AXpwE24ARF","bgJAz0ao3l","zFgtBQWxoT","7fsYMEoToP","PYBf40BmCy","8xEKzWMiS3","FwEJzyluBx","Yh1hFrhl0J","prNT6rz7Ut","n1pmOGXdoH",
+"x3LDeQbxXc","VBjhzCp3mZ","RpBQmOxWIH","azIWpRBhp0","lsQGoM6qcG","hUTw7s4786","rhl0J4W0Tl","6q6L9S2Dfu","JRJQB29QAz","AIYUugdQsS",
+"DQimpgIYvE","QWxoTUlU3M","CK5W7LDk6f","pFrrlZv7z0","gIYvEgjUTu","okgRiFVMxo","fLNg8taOXK","AIYUuTwano","HzZT8TXQ0Z","JKWYRJIqXi",
+"Ta8f6hYBCK","KASQ8Kr8ys","uoStwogLgc","uTacxl83Ud","FcWrWIKxdL","CxVEf9GXkX","SWfouZzJHW","5VZjSix74r","dmoS72hEEU","RxrsmJ2mQi",
+"GXdoHuoStw","VNCPdRACuj","tl72Wd7vjM","tl72WEOE1o","WMiS3BpYhV","Nxx9Vn8pJ9","yluBx8xEKz","RmDcr9rlg9","ix74rfcJOy","tvdkDk85Ae",
+"Gv3FqMezSW","k85AeNcICA","s7MxkBCxeC","uAWypQ6hMC","QChxsdmoS7","uQIczo8Uyd","kZANmqQxHP","BCxeCSWfou","TCgPpx3LDe","vkCHHrz7Ut",
+"blLA92hEEU","n8pJ91v5hH","QnJ1SaFFss","4dEz6sx5Gl","yofH3lm0pD","P6bcgMezSW","wiHrZ8TxD7","0MR5XyluBx","In3NSU3yw5","jSjS3xXTI4",
+"8xEKzZ4I1v","Cp3mZdQ586","RsQUqHfyNQ","t59lRD6rBy","t59lRpAhR1","ix74rpvgjS","POUYSAmdQd","oGu6xogLgc","4QMc9WaWsv","x3LDeXflUq",
+"lj07Qhe9IA","gjUTuuLtKs","B3qemTXQ0Z","Chuy3I7p2a","VBjhzQYxC0","qQxHPlkMUA","tvdkDyvOMI","uTacxB3qem","7fKYUo8Uyd","FhtglCfgr3",
+"SmGzvlXFOB","s93MlFcWrW","Cfgr3B3qem","9y4lwatef2","tl72WFhtgl","Cp3mZvOqCE","OxWIHni2v1","fcJOyFNYIM","tjQxsCNHmv","lH1ktGrDg7",
+"v8yFNgdQsS","yEfy9WMiS3","vOqCEQworu","CdyBVvOqCE","EdBKcyluBx","azIWptlILt","OUqFMPb1pa","Mkgy8faHir","hYBCKpv0i7","C2IrcRACuj",
+"3otm6Ss0Zu","48cHLXyPZN","JIqXiKr8ys","yvOMI5drc6","rz7UtMmsIo","Y1mC0AOgEe","JXljWlpF6W","7lUXZIKxdL","AmdQdqQxHP","Q6LixDLhzM",
+"RmDcr3weIF","gIYvE7ku1p","gjUTucL0aE","iwzGklj07Q","uoStwSjskQ","UlU3MpT8wu","GWqqX4W0Tl","I7p2aydG8U","8hJdtcQOnv","RxrsmlweGy",
+"lXFOBUmaEv","dmoS7uQIcz","C2IrcVerEA","L7cGc4QMc9","Cp3mZhE1Ql","9eoRcjS1aj","lm0pDv1Hln","8cVD3Zv7z0","hi5X7ix74r","jzUqRAIYUu",
+"x3LDezHF1q","x3LDeuPX7G","fcwDatl72W","SbRYyGXdoH","aFFssh1zcH","8FmFH48cHL","FwEJzhUTw7","CdyBV07n1c","gf8rIVprf2","POUYSFhtgl",
+"7fKYUxXTI4","K4GS8t98iW","HfyNQzmLYD","8xEKzdhSuH","BGaQYF6PT2","jiVBPxXTI4","55rfBcL0aE","gdQsSZUnqt","0Kyfs4QMc9","8cVD3AIYUu",
+"Zv7z05IhmG","580YD5drc6","xReec45cIH","tl72WMkgy8","8cVD3LbRTH","tlILtHzZT8","ydG8U6AFT0","JIqXipiJSk","zz4ZU4dEz6","iqv4kv8yFN",
+"JJs5m1LB1L","CxVEfOUqFM","iKqhr24ARF","v8yFN24ARF","WPmlxdjsrv","JRJQBuoStw","CIShGhUTw7","oGu6xJXljW","aL6AJ0PktI","aL6AJUvlv4",
+"WMiS3tlILt","mX2GEAkKTk","jzUqR9rlg9","MmsIoAXpwE","JkzUntAOsr","wiHrZFhtgl","4QMc9Dz1R3","uQIczt98iW","uAWyppmeCd","4dEz6jfREu",
+"iKqhrRsQUq","M6qcGuTacx","8cVD3ydG8U","TwanoOUqFM","sqVrf6q6L9","lCMxyGWqqX","euZA524ARF","v2eC32DREs","guMb8uN6r3","gf8rI48cHL",
+"2DREsqUJMd","bZLvSvOqCE","jS1ajfqypy","MezSWfaHir","VBjhztaOXK","0h1b1MaJQs","jfREuqUJMd","QnJ1SqUJMd","7Ow5C2Nslm","NOHsz2TRI7",
+"618DiCxVEf","SWfouCdyBV","gdQsSnnP8o","nnP8ofFDrJ","XflUq0BmCy","YjB9tFnPFB","C2IrchUTw7","CIShG9eoRc","sqVrf7fsYM","fqypyfcJOy",
+"Dz1R3WMiS3","b29RJMojnP","FLsph0BmCy","tuDySzqH0W","DLhzMTCgPp","i7WMQfcJOy","5Mg9rOHaBz","pT8wuOxWIH","1j5L87fsYM","618DiMm8si",
+"KZamHFcWrW","2TRI7lpF6W","WmadAuLtKs","EoToPNOHsz","QChxsDQimp","UmaEvcL0aE","FwEJzpiJSk","v2eC3pv0i7","LDk6fbgJAz","Z4I1vdjsrv",
+"MGlTFLDk6f","cQOnvsoy9t","bZLvSlj07Q","Yf2Ec9rlg9","WPmlxtaOXK","Cp3mZK20wK","C2IrccL0aE","1LB1LOUYuF","WreyPjtn0X","yofH3FGzgp",
+"7fKYUWMiS3","24ARFVerEA","24ARFL7cGc","G1RhSk85Ae","0ao3ldjsrv","okgRipWiOs","e6e4z2Nslm","dmoS7uTacx","MezSWuupzk","WPmlxChuy3",
+"vkCHHsuY4x","e6e4z3weIF","Yf2EcJKWYR","Vprf2IjTwP","t98iW9rlg9","ulk41fFDrJ","DcpWBGv3Fq","jtn0X0YAGH","oVQp6BbwgA","l83UdGv3Fq",
+"8hJdtcL0aE","ydG8Ulm0pD","LDk6fhSSvQ","Ss0ZujzUqR","24ARFMojnP","lpF6W8TxD7","BGaQYMojnP","07n1ch1zcH","BGaQYQ6hMC","yToGWVNCPd",
+"FhtglHP433","ReKEW2TRI7","MK07YKASQ8","gdQsSni2v1","4dEz6cShY2","Ul4a1uvf7A","AOgEeOz8yZ","BFkb8RpBQm","blLA91v5hH","iwzGksoy9t",
+"pT8wupWiOs","Gv3FqdQ586","Vprf2IRh48","AgJHQBbwgA","qaofNCfgr3","WPmlx9rlg9","h1zcHBFkb8","jtn0Xe6e4z","fmIK1tAOsr","Ta8f6No0Qb",
+"5Drn0fcJOy","8cVD39GXkX","ZuDtDpv0i7","2DREsBCxeC","2Yz7EAmdQd","I7p2a45cIH","MojnPvkCHH","0KyfsksJby","WaWsvJkzUn","FFDuiL7cGc",
+"AmdQde6e4z","hSSvQCfgr3","ZJTXHVLTy6","hYBCKMm8si","2Yz7EwiHrZ","ZUnqtCfgr3","bgJAzRxrsm","M6qcGuvf7A","VLTy6zHF1q","v1HlnnnP8o",
+"MmKGJJXljW","OHaBzQworu","tl72WBFkb8","618DiyEfy9","Kr8ys07n1c","Ss0ZuPYBf4","16lHcuLtKs","uvf7AKASQ8","9rlg9sqVrf","MmsIoxReec",
+"qQxHPsqVrf","U3yw55drc6","tvdkDtAOsr","TwanoCNHmv","2hEEUYw2oU","zFgtBguMb8","atef2ksJby","ReKEWSjskQ","iqv4k4QMc9","hUTw76q6L9",
+"d85a9lXFOB","uupzkM3zXL","RpBQmsoy9t","45cIHm4bxU","FxX9qQnJ1S","prNT6TXQ0Z","X6PinDLhzM","FLsph9GXkX","okgRiUmaEv","0KyfslweGy",
+"WaWsvpiJSk","blLA9AXpwE","W3VFHJ2mQi","G1RhStaOXK","qaofNvLsmS","2NslmW7cTs","dhSuHQnJ1S","iqv4kQ6hMC","RsQUqRACuj","0ao3lF6PT2",
+"tl72WIjTwP","StlDJY1mC0","LDk6fd85a9","pFrrlFGzgp","RpBQmGXdoH","tjQxslweGy","fLNg8GSQwj","ix74rprNT6","7lUXZGXdoH","KASQ8jeskS",
+"FFDuiD6rBy","pWiOsfFDrJ","EdBKcSbRYy","rhl0Jru4UG","uTacxW3VFH","lsQGozqH0W","qaofNuN6r3","EdBKcrz7Ut","U3yw57hyVv","7hyVv618Di",
+"faHir8xEKz","SbRYyuoStw","rz7Ut5IhmG","zmLYDUmaEv","F6PT245cIH","XyPZNDG4sT","7ku1pYh1hF","Ul4a1FcWrW","55rfB8hJdt","5iGN55IhmG",
+"0ao3lWaWsv","K4GS8B3qem","Zv7z0ciuWz","yvOMIZuDtD","gjUTuUmaEv","ciuWzgf8rI","t98iWs93Ml","gdQsSHRxd8","yToGWv1Hln","cShY2s93Ml",
+"0Wr5yjfREu","J2mQi0MR5X","1v5hH8FmFH","Fhtgld85a9","KASQ8gf8rI","BpYhVQnJ1S","kZANm2ZHdk","M6qcG55rfB","QnJ1SaDGtS","TCgPp7ku1p",
+"uJScXJXljW","nnP8oOz8yZ","IBe8kjtn0X","yEfy9AkKTk","48cHLWPmlx","8RCUA8RCUA","djsrvB3qem","IRh48JRJQB","iwzGkQnJ1S","WMiS3lpF6W",
+"zqH0WOxWIH","FcWrW48cHL","VBjhzxciqp","hUTw7B3qem","2NslmtlILt","zQt6Qxciqp","vLsmS7hyVv","0YAGHyofH3","MmKGJCNHmv","MmKGJTwano",
+"YjB9tLewvM","hUTw7zqH0W","jS1aj8FmFH","NOHsz5nmWv","qUJMdfqypy","EdBKc55rfB","UmaEvOz8yZ","7fKYUOHaBz","ciuWztlILt","lXFOBVprf2",
+"S77LHjzUqR","XflUqWreyP","yEfy9WmadA","prNT6HfyNQ","Oz8yZJRJQB","t98iWFnPFB","t98iWCxVEf","FGzgpZhwG1","EoToPRxrsm","8TxD7QnJ1S",
+"hi5X7taOXK","lpF6WcmXIX","okgRiLDk6f","mX2GE5ZaEz","uvf7AKsjRK","Yw2oUlH1kt","Yw2oUPYBf4","8RCUAFxX9q","AIYUutlILt","TXQ0Zru4UG",
+"5nmWvuupzk","WreyPsqVrf","DG4sTy94nw","BFkb8d7vjM","LDk6fYOfrY","ZuDtD0BmCy","qUJMdRsQUq","Mkgy8VjCZq","ECMvU24ARF","55rfBJJs5m",
+"zFgtBCK5W7","9GXkXzQt6Q","In3NSSbRYy","s93Mll83Ud","In3NSa00b5","OxWIH3otm6","45cIH8U2nU","dhSuHCxVEf","d85a9HlUbF","jtn0XBbwgA",
+"lpF6WfFDrJ","5VZjSLDk6f","2hEEUnFqik","aDGtS4dEz6","Fhtglzz4ZU","zY1GYJKWYR","8RCUAFPfSE","TCgPpSjskQ","8TxD7SmGzv","FFDuibgJAz",
+"bgJAzh1zcH","nnP8oQnJ1S","07n1c2ZHdk","CIShGPYBf4","EOE1oQnJ1S","faHir6q6L9","AXpwE0BmCy","jtn0XZuDtD","9y4lwIRh48","Nxx9ViKqhr",
+"uZPqgzz4ZU","StlDJD6rBy","7fKYUs7Mxk","iwzGki7WMQ","XyPZNF6PT2","MK07Y0YAGH","fmIK1i7WMQ","uPX7GL7cGc","o8UydyEfy9","i7WMQHzZT8",
+"LewvMWaim6","zmLYDuTacx","atef2CIShG","FLsphdpe1v","pT8wuSbRYy","ix74rdQ586","yToGWuJScX","O3iyQO3iyQ","o8Uyd29QAz","RkQkeS2Dfu",
+"QYxC0aFFss","0BmCytjQxs","IBe8kGv3Fq","azIWp8RCUA","Yh1hFQClRL","7lUXZHlUbF","ogLgcDcpWB","NAFuw64s8N","QClRLnnP8o","s4786GrDg7",
+"5ZaEzDcpWB","5IhmGPOUYS","580YDNOHsz","Dz1R3S77LH","QssNC07n1c","0ao3lrhl0J","qaofNXyPZN","HfyNQzHF1q","iqv4kFGzgp","lH1ktCqqaD",
+"KZamH2DREs","rhl0JiB08l","F6PT2Oz8yZ","tjQxsAkKTk","I7p2a16lHc","UmaEv6q6L9","Z4I1vbZLvS","VerEAd85a9","gdQsSBFkb8","FNYIMMmKGJ",
+"Kr8yslpF6W","Yf2EcxXTI4","0KyfsQbxXc","45cIHdmoS7","pWiOsguMb8","h1zcHOHaBz","m4bxUQChxs","9GXkXzz4ZU","FhtglIjTwP","FVMxo9y4lw",
+"pWiOsBbwgA","0YAGHuTacx","e6e4zU3yw5","QnJ1SYw2oU","S77LHReKEW","ReKEWtAOsr","lj07QGSQwj","BGaQYZuDtD","8FmFHlCMxy","RmDcrciuWz",
+"StlDJYh1hF","x3LDeVerEA","580YDtlILt","lweGyK20wK","5iGN5Nxx9V","lsQGoMm8si","55rfB48cHL","O3iyQ0YAGH","AXpwEWDVWJ","xReecDcpWB",
+"ix74rdpe1v","aFFssatef2","2Nslmuupzk","lj07QgdQsS","4W0TliwzGk","djsrvBGaQY","aDGtSY1mC0","8xEKzQnJ1S","DLhzM3otm6","TwanohSSvQ",
+"EdBKcW7cTs","HfyNQsoy9t","OUqFMQnJ1S","QWxoTyvOMI","uTacxokgRi","d85a9IRh48","C2Irc0MR5X","k85AeMaJQs","jiVBPuTacx","5iGN5J2mQi",
+"uupzkcL0aE","OxWIHSbRYy","FVMxo6AFT0","rz7UtRmDcr","gf8rIRxrsm","brhlQZuDtD","HlUbFG1RhS","b29RJ9GXkX","HRxd8oQ87r","zz4ZUkB5nP",
+"n8pJ9pFrrl","CNHmvAXpwE","cL0aEhUTw7","wDajXW7cTs","FLsphtuDyS","CNHmvGv3Fq","NcICATwano","jfREuuLtKs","WmadA07n1c","RBhp0AXpwE",
+"AmdQdi3pyd","580YDv2eC3","LDk6fKASQ8","fLNg8uTacx","1j5L8JIqXi","KASQ8Mkgy8","4QMc9tl72W","XyPZN0MR5X","lweGyCfgr3","YjB9t5nmWv",
+"VNCPd8TxD7","t59lRnFqik","gdQsSFnPFB","TXQ0ZZuDtD","Ta8f6CdyBV","BpYhVBpYhV","FwEJzCIShG","0PktI8xEKz","fmIK1XflUq","NOHszU3yw5",
+"FPfSE3otm6","YOfrYZuDtD","nlaByQYxC0","FFDuiNcICA","Ss0Zu5VZjS","CNHmvaDGtS","AIYUuqaofN","zQt6QjiVBP","gdQsSRkQke","Yh1hFuvf7A",
+"EOE1ofcJOy","jtn0XfFDrJ","o8Uyd1j5L8","s7MxkKsjRK","F6PT2hUTw7","wiHrZuTacx","VIlwPdpe1v","Q6LixcShY2","HzZT8tvdkD","AOgEeGXdoH",
+"7ku1p5iGN5","YjB9ty94nw","lkMUAulk41","RkQkeW3VFH","aDGtSHlUbF","HlUbFuAWyp","7Ow5CZUnqt","tjQxsjzUqR","FFDuifFDrJ","Oz8yZVprf2",
+"DQimpFcWrW","MmKGJDz1R3","zHF1qQworu","55rfBWmadA","FnPFBRkQke","uoStwgf8rI","2TRI7Yw2oU","EoToPpmeCd","iwzGkDcpWB","ECMvUUmaEv",
+"IjTwPzQt6Q","uJScX5Namm","8TxD7P6bcg","h1zcHJ2mQi","IjTwP8RCUA","jfREuM3zXL","RsQUqhUTw7","i7WMQiqv4k","dpe1vECMvU","Gv3Fqd7vjM",
+"64s8NyToGW","gdQsSGXdoH","YjB9tECMvU","580YD2DREs","QWxoTNhXdu","FNYIMFVMxo","VNCPdFVMxo","dpe1vBFkb8","cmXIXW7cTs","POUYSCxVEf",
+"mz8gx7Ow5C","RBhp0OxWIH","e6e4zReKEW","hSSvQulk41","EoToPtvdkD","hYBCKmX2GE","Zv7z0dQ586","LewvMF6PT2","jSjS30PktI","fcJOyYf2Ec",
+"SjskQt98iW","OHaBzFcWrW","FxX9qW3VFH","RBhp0HfyNQ","QbxXcJRJQB","0MR5X14FLR","GWqqXlH1kt","FLsphvLsmS","l83Udrhl0J","wDajXZJTXH",
+"Ss0ZuRxrsm","VNCPdlpF6W","BpYhVLDk6f","uTacxfqypy","XyPZNEdBKc","MezSWhi5X7","F6PT216lHc","BFkb8Mm8si","C2IrctuDyS","v2eC3VIlwP",
+"7Ow5C4W0Tl","XflUqAOgEe","FNYIMnFqik","POUYSTXQ0Z","Dz1R3jtn0X","rKDLJReKEW","9y4lwxciqp","ECMvU0YAGH","MezSW8hJdt","8FmFHuTacx",
+"RmDcrFLsph","lweGyWmadA","y94nwSWfou","pWiOsNAFuw","StlDJW7cTs","SbRYyZ4I1v","uN6r32DREs","VNCPdWMiS3","zY1GY8RCUA","K20wKBCxeC",
+"uQIczYw2oU","rhl0Jtl72W","zz4ZUM6qcG","ECMvUo8Uyd","uZPqgbgJAz","ZhwG1WaWsv","tuDySs93Ml","NAFuwzQt6Q","uN6r3CdyBV","HfyNQHzZT8",
+"WPmlxJkzUn","d85a9W3VFH","gdQsSCqqaD","07n1c0MR5X","WPmlxcQOnv","euZA5FPfSE","0YAGHhUTw7","VIlwPuPX7G","OUqFMKr8ys","No0Qbiqv4k",
+"n8pJ97lUXZ","guMb8yToGW","AkKTkgjUTu","dQ586jtn0X","SbRYy45cIH","L7cGcCxVEf","RsQUqdjsrv","aL6AJ9eoRc","5ZaEz2Yz7E","uLtKsokgRi",
+"0BmCy2DREs","ru4UG8RCUA","lH1ktS77LH","ix74ratef2","tjQxsYf2Ec","StlDJVprf2","XyPZNn1pmO","9GXkX55rfB","JJs5miwzGk","S2DfuiB08l",
+"iKqhr9GXkX","k85AeFxX9q","lweGyVBjhz","In3NSxciqp","iwzGkdjsrv","P6bcgCNHmv","b29RJlweGy","y94nwjeskS","lm0pDzY1GY","QChxsGSQwj",
+"EoToPfcJOy","4QMc90h1b1","9rlg9uN6r3","OxWIHbrhlQ","RpBQmK4GS8","uN6r3Yh1hF","hE1QlvLsmS","9eoRcaDGtS","0h1b1h1zcH","S77LHokgRi",
+"7hyVv14FLR","MGlTF5Drn0","okgRi618Di","0Wr5yBCxeC","TwanoCIShG","hi5X7uZPqg","VerEAdhSuH","taOXKru4UG","oVQp6QClRL","oGu6xLDk6f",
+"yofH3piJSk","rKDLJzmLYD","TCgPpru4UG","pT8wuTa8f6","FwEJzFxX9q","RpBQmulk41","fcJOyZUnqt","WDVWJpAhR1","QWxoTbZLvS","aez9yhe9IA",
+"2NslmYw2oU","tjQxs6AFT0","fLNg8bgJAz","qUJMd2Yz7E","cmXIX9eoRc","vkCHH0Wr5y","FcWrWSmGzv","pv0i7pAhR1","zFgtBzbIYY","ZhwG1s93Ml",
+"VIlwPVNCPd","h1zcHHzZT8","rz7UtI7p2a","i3pyd5nmWv","fFDrJFcWrW","7fsYMrhl0J","Twanod85a9","Yf2EcdQ586","jSjS3soy9t","WMiS3P6bcg",
+"ZJTXHAgJHQ","EdBKckB5nP","pWiOspWiOs","uLtKsYh1hF","J2mQiUlU3M","1j5L8HfyNQ","CdyBV9XyT9","iKqhrjfREu","OxWIHTXQ0Z","5VZjSeuZA5",
+"0ao3llpF6W","F6PT2dhSuH","lkMUA8U2nU","lweGypiJSk","uZPqguupzk","oVQp6yofH3","MezSWBpYhV","QYxC0ulk41","FGzgpprNT6","6q6L9580YD",
+"nlaByZzJHW","MojnPlsQGo","9rlg9i7WMQ","RpBQmlCMxy","0BmCyK4GS8","Oz8yZdQ586","d85a9NhXdu","LbRTHFhtgl","WreyPk85Ae","n1pmOv8yFN",
+"UlU3MW7cTs","BpYhVThjNn","MK07YfLNg8","45cIH8FmFH","0KyfsogLgc","mX2GEaL6AJ","OUqFMFVMxo","F6PT2hSSvQ","VBjhzHP433","Ul4a1Nxx9V",
+"blLA9Q6Lix","tlILt0Wr5y","4W0TlHP433","Oz8yZpvgjS","3weIF1LB1L","BCxeCvkCHH","uPX7GQClRL","RzaZATXQ0Z","GWqqXL7cGc","DQimpFGzgp",
+"8TxD7cQOnv","8hJdtYf2Ec","uPX7GxXTI4","2DREshSSvQ","ksJbyn8pJ9","NOHszfaHir","NAFuwh1zcH","Zv7z0i3pyd","8cVD3lsQGo","jeskSfcwDa",
+"7X3uyzFgtB","5IhmGGXdoH","gdQsSyluBx","rz7Ut7X3uy","SWfouX6Pin","Ss0ZuiKqhr","Dz1R30MR5X","fcJOy0h1b1","cmXIXjzUqR","uTacx9y4lw",
+"0MR5XjzUqR","IKxdLuoStw","fmIK1EOE1o","EoToPJJs5m","Pb1pajzUqR","P6bcgaL6AJ","F6PT27fsYM","CxVEfFhtgl","lkMUAbgJAz","Ul4a1Ul4a1",
+"S77LHksJby","a00b5sx5Gl","nnP8olm0pD","07n1c9eoRc","b29RJJKWYR","bgJAziwzGk","WaWsvMK07Y","v2eC3t98iW","4QMc94dEz6","iKqhrdQ586",
+"jS1ajjiVBP","iB08lCNHmv","zQt6QgdQsS","Z4I1vv1Hln","okgRi7X3uy","CxVEf45cIH","sx5GlAIYUu","tl72WbZLvS","S2DfunFqik","C2IrcTa8f6",
+"WmadAn8pJ9","y94nwUlU3M","uTacxjtn0X","ZhwG1ni2v1","QClRLQChxs","uZPqg48cHL","0PktIpAhR1","fcJOys7Mxk","pvgjSzQt6Q","pWiOsciuWz",
+"s7Mxk618Di","1LB1LWmadA","lj07QzmLYD","Vprf2TCgPp","xReecGv3Fq","zqH0Wk85Ae","3weIFdhSuH","9iGoTFxX9q","3otm6uN6r3","UmaEvn1pmO",
+"W3VFHAOgEe","jiVBPCfgr3","IjTwPfcJOy","In3NSydG8U","X6PinvkCHH","ogLgcHRxd8","IRh48kZANm","YOfrYi3pyd","0BmCylViBv","7fsYM618Di",
+"DG4sTIRh48","VLTy6pAhR1","RACujzFgtB","lViBv55rfB","jfREusqVrf","WPmlxTCgPp","YjB9tjfREu","SbRYyKZamH","aDGtStuDyS","bZLvSqaofN",
+"Kr8ysQssNC","ReKEWYw2oU","Nxx9VJKWYR","xReecuoStw","7X3uyTXQ0Z","xXTI4MmKGJ","Vprf28RCUA","d7vjMaL6AJ","7fsYMRBhp0","5nmWv2hEEU",
+"FcWrW9eoRc","ydG8UBbwgA","y94nwHRxd8","fLNg8BCxeC","fFDrJZhwG1","iqv4kguMb8","GXdoHVprf2","jSjS3Ul4a1","iqv4kpFrrl","zHF1qYf2Ec",
+"oGu6x9GXkX","580YD9iGoT","2DREsfcJOy","jtn0XYOfrY","azIWp9iGoT","aDGtSogLgc","uvf7ARxrsm","RpBQmZuDtD","8RCUAQClRL","BbwgAxciqp",
+"RzaZAW7cTs","lCMxyOUqFM","wiHrZGWqqX","JJs5maFFss","4dEz6brhlQ","lweGy7fsYM","HlUbF5Drn0","14FLRgjUTu","uN6r3pmeCd","zz4ZUjzUqR",
+"JkzUnQssNC","FVMxoazIWp","8U2nUJIqXi","RBhp0t98iW","In3NSVjCZq","yofH3ulk41","24ARFW3VFH","SbRYyYOfrY","aL6AJlkMUA","2NslmQnJ1S",
+"580YD7ku1p","HRxd8gjUTu","0ao3l4dEz6","prNT6Yf2Ec","FFDuiM6qcG","ksJbyrKDLJ","m4bxU3otm6","CxVEfyluBx","RxrsmhE1Ql","Zv7z0brhlQ",
+"hUTw7piJSk","lm0pDZzJHW","HRxd8Pb1pa","lm0pDaez9y","zFgtB2TRI7","hYBCK2Nslm","BCxeCaL6AJ","BGaQYSjskQ","Yf2EcMK07Y","SmGzvYw2oU",
+"cL0aEyToGW","GXdoHFLsph","FVMxoStlDJ","bZLvSaL6AJ","6AFT0hYBCK","0PktIkZANm","yEfy9Mkgy8","rz7UtFjHXR","yToGWBpYhV","Nxx9VVjCZq",
+"vOqCERzaZA","cL0aE2TRI7","oQ87ryluBx","MmsIolweGy","0ao3lZuDtD","In3NSDLhzM","he9IAMezSW","zQt6Q580YD","fqypy0Wr5y","2DREsmz8gx",
+"jiVBPAOgEe","d85a9WreyP","L7cGcB3qem","I7p2aOHaBz","1j5L84W0Tl","tuDySni2v1","QChxss4786","lm0pDm4bxU","fqypys93Ml","ZJTXHoGu6x",
+"uupzkmz8gx","jeskSuPX7G","uN6r3blLA9","DQimp1j5L8","sqVrf5ZaEz","jS1ajokgRi","n8pJ9DQimp","k85AewDajX","MK07YKZamH","XyPZNAmdQd",
+"NcICAQClRL","hi5X79XyT9","WreyPtjQxs","gjUTufqypy","0PktIGSQwj","MojnPv1Hln","e6e4z7ku1p","Waim6LewvM","fcwDafcJOy","pFrrlix74r",
+"5iGN5G1RhS","U3yw5LbRTH","AkKTkB3qem","soy9tpT8wu","ix74rTCgPp","AkKTkSWfou","gIYvE8TxD7","pWiOsNo0Qb","45cIHQWxoT","AOgEeNAFuw",
+"K20wKZUnqt","Uvlv4In3NS","i7WMQatef2","VLTy6AmdQd","45cIHlm0pD","Vprf2VBjhz","guMb89iGoT","hUTw7oGu6x","yofH3CxVEf","lpF6W9rlg9",
+"uAWyplweGy","y94nwFNYIM","uJScXIn3NS","1LB1L5IhmG","XyPZNx3LDe","vLsmSl83Ud","RpBQmF6PT2","iqv4kiKqhr","5nmWvtl72W","hYBCK64s8N",
+"pvgjSP6bcg","AgJHQEoToP","Q6Lixo8Uyd","y94nwfqypy","64s8NPb1pa","YOfrYuTacx","qaofNbgJAz","AkKTkUl4a1","BFkb85nmWv","ZJTXHsoy9t",
+"JXljWGrDg7","DLhzMiKqhr","DG4sT55rfB","uupzkfaHir","FjHXRydG8U","CIShG0YAGH","zQt6QGSQwj","VerEAFVMxo","uoStwZ4I1v","Yh1hFIjTwP",
+"ru4UGWaim6","qUJMd6q6L9","iB08lrhl0J","oQ87rWaWsv","pWiOs9iGoT","vkCHHy94nw","EdBKcPb1pa","fqypy0ao3l","hUTw7RBhp0","Vprf2Pb1pa",
+"tuDySwiHrZ","dQ586580YD","hi5X74W0Tl","HlUbFo8Uyd","9iGoTFVMxo","2ZHdkyvOMI","DLhzMPb1pa","Qworu5VZjS","VIlwPBGaQY","ni2v1iqv4k",
+"Waim6ydG8U","VLTy6jfREu","618DilViBv","tl72W9y4lw","n8pJ9rhl0J","AgJHQL7cGc","7fKYUVIlwP","Nxx9VOz8yZ","a00b5D6rBy","yluBxIjTwP",
+"IKxdL5VZjS","QnJ1SiB08l","zHF1qIRh48","k85AeJRJQB","euZA5uvf7A","gdQsSAXpwE","hUTw7pAhR1","P6bcgFVMxo","16lHc5Namm","faHirtuDyS",
+"ni2v1vOqCE","2ZHdkiwzGk","VNCPdqUJMd","D6rByd85a9","ECMvUQnJ1S","9rlg9AIYUu","5Drn0MaJQs","MezSWDcpWB","dpe1v48cHL","DG4sTgjUTu",
+"Gv3Fqrhl0J","hUTw7a00b5","iqv4k2DREs","5Mg9r48cHL","HzZT864s8N","VerEAfaHir","JIqXisuY4x","9y4lweuZA5","lm0pDOUYuF","Mm8sijtn0X",
+"Chuy3MmsIo","YOfrYThjNn","xReecAmdQd","o8UydCK5W7","FFDuiFwEJz","KASQ8In3NS","ZhwG1U3yw5","8TxD79XyT9","MojnPAgJHQ","S77LHChuy3",
+"b29RJWreyP","VIlwPECMvU","n8pJ9cL0aE","BFkb8DQimp","aez9yrz7Ut","4W0TlEdBKc","CIShGOz8yZ","taOXKyEfy9","Yh1hFfFDrJ","lXFOB0Wr5y",
+"rhl0J5Namm","2Yz7EfcJOy","atef2AXpwE","16lHc16lHc","cShY2MmKGJ","GXdoHnFqik","7fKYUP6bcg","JkzUnaez9y","M3zXLBCxeC","NAFuwAkKTk",
+"tuDySFcWrW","fqypySjskQ","Oz8yZD6rBy","UlU3MThjNn","8U2nU0Kyfs","ciuWzSs0Zu","RsQUqFGzgp","MmsIos93Ml","lsQGoQnJ1S","OUYuF8FmFH",
+"Q6Lixd7vjM","Ss0ZuEoToP","7X3uy9iGoT","t59lRYh1hF","W7cTs0BmCy","uQIczMkgy8","OHaBzwiHrZ","qaofNYh1hF","nFqik3weIF","dQ586VjCZq",
+"lpF6Wk85Ae","lsQGos93Ml","cShY2GSQwj","mz8gxI7p2a","7X3uyuoStw","lkMUAI7p2a","fmIK1NOHsz","K4GS8mz8gx","Chuy3RmDcr","WreyPuupzk",
+"dmoS7jeskS","JKWYRl83Ud","3otm6Ta8f6","9iGoTyluBx","tAOsr5IhmG","TCgPpJkzUn","jiVBPK4GS8","FGzgpRkQke","Pb1pay94nw","uQIczksJby",
+"RsQUqpiJSk","QbxXcv1Hln","qUJMdNAFuw","Mm8siYw2oU","5Mg9rrKDLJ","M6qcGuZPqg","KsjRK7Ow5C","HRxd8d7vjM","iqv4kk85Ae","CK5W7euZA5",
+"B3qemJkzUn","cShY2AkKTk","CqqaDlH1kt","POUYSNOHsz","BCxeCYw2oU","KsjRK8xEKz","1j5L8zmLYD","d85a9XyPZN","d7vjMOz8yZ","L7cGcECMvU",
+"YjB9tcmXIX","AXpwEAOgEe","9y4lw8xEKz","Nxx9VStlDJ","t98iWZJTXH","5drc6m4bxU","GrDg7WmadA","4QMc9v2eC3","F6PT2kZANm","CdyBVyEfy9",
+"RxrsmtaOXK","uQIczjzUqR","cmXIXNhXdu","cQOnvRkQke","CxVEfRkQke","GXdoHzbIYY","NhXduRkQke","AkKTkWDVWJ","lm0pDuZPqg","pmeCdtjQxs",
+"8RCUAjiVBP","b29RJFGzgp","o8UydVerEA","StlDJxciqp","0BmCyzY1GY","tuDySpFrrl","SjskQnlaBy","BbwgAbrhlQ","zmLYDuJScX","CdyBVQssNC",
+"JkzUnrKDLJ","TwanoIKxdL","BpYhVulk41","l83Ud7fKYU","6q6L9LewvM","iqv4klweGy","NOHsztuDyS","UlU3MpmeCd","NcICAnnP8o","0MR5X0YAGH",
+"he9IAm4bxU","guMb814FLR","aL6AJfcwDa","HfyNQMezSW","gtCA524ARF","RzaZAuTacx","MK07YPYBf4","fqypyxXTI4","ThjNn6q6L9","jzUqRjfREu",
+"LewvMfFDrJ","8hJdtpFrrl","AXpwEzHF1q","FPfSERBhp0","xReec1v5hH","GrDg7brhlQ","ZJTXHCfgr3","jtn0XTXQ0Z","o8UydZJTXH","gf8rIoGu6x",
+"FhtglJKWYR","guMb8fmIK1","HzZT81LB1L","tvdkD2ZHdk","VerEAJIqXi","hYBCKK20wK","euZA5RpBQm","i7WMQ2TRI7","WaWsvfLNg8","xciqpGrDg7",
+"s93MlOxWIH","hE1QlSjskQ","KASQ8VjCZq","x3LDet59lR","JIqXiksJby","cmXIXM3zXL","Yh1hF9iGoT","J2mQi9rlg9","FFDuiHP433","ix74rlm0pD",
+"lH1ktuoStw","ZJTXHaL6AJ","cL0aE5Namm","tlILtprNT6","fqypylkMUA","MaJQsNcICA","UlU3MJIqXi","t98iWBCxeC","uLtKsQworu","2TRI7WPmlx",
+"fcJOyMaJQs","jSjS3uAWyp","zmLYDRxrsm","5Mg9rfcJOy","okgRi1v5hH","5Namme6e4z","7lUXZJkzUn","iB08lCqqaD","0Kyfszz4ZU","Y1mC0EdBKc",
+"9XyT9soy9t","FcWrW3otm6","fmIK17fsYM","IBe8k8hJdt","7X3uy1LB1L","BGaQYoVQp6","2DREsTwano","lCMxy8RCUA","rz7UtUl4a1","taOXKAIYUu",
+"1LB1LReKEW","s7MxkiB08l","xReec4QMc9","a00b57lUXZ","TXQ0ZStlDJ","2ZHdk0YAGH","VLTy6s93Ml","nFqikuvf7A","QbxXcVprf2","uoStwAXpwE",
+"zHF1q3otm6","cShY2NcICA","Ss0ZuzHF1q","CqqaDCfgr3","7fKYUUvlv4","jeskSn1pmO","DcpWBqUJMd","y94nwhYBCK","wDajXLbRTH","soy9t8FmFH",
+"XflUquoStw","NhXduaez9y","Ss0ZumX2GE","OHaBzFPfSE","BpYhVBbwgA","oGu6x8cVD3","M6qcGeuZA5","7X3uydjsrv","tlILtEdBKc","4W0TltAOsr",
+"oVQp6X6Pin","9eoRcx3LDe","lweGyCIShG","iwzGk16lHc","5ZaEzbZLvS","gIYvENo0Qb","sx5GlhSSvQ","lCMxyNhXdu","fqypy5Mg9r","Rxrsm7ku1p",
+"bZLvStvdkD","l83UdBGaQY","2NslmGv3Fq","DQimpWPmlx","CdyBVBGaQY","2DREs7ku1p","MmsIoFVMxo","POUYSWMiS3","tjQxsS77LH","kB5nPFGzgp",
+"YjB9taL6AJ","EoToPokgRi","Ta8f6aL6AJ","suY4x7hyVv","FPfSEh1zcH","9y4lwGWqqX","zmLYDd85a9","JIqXi3weIF","ru4UGQ6hMC","2hEEUi3pyd",
+"zqH0W7hyVv","pWiOssoy9t","0PktIB3qem","lpF6WHP433","jeskSzY1GY","uQIcztlILt","hUTw72Yz7E","jeskSZzJHW","bgJAzCxVEf","djsrvuLtKs",
+"7lUXZ8U2nU","ru4UGChuy3","29QAzNAFuw","EoToPdQ586","bgJAzjSjS3","xciqpKsjRK","9eoRc6AFT0","ZJTXHBCxeC","14FLRb29RJ","GWqqXY1mC0",
+"jeskSMm8si","sx5GllCMxy","fmIK13weIF","XyPZNG1RhS","wDajXrhl0J","7lUXZPYBf4","AmdQdjSjS3","dpe1v7lUXZ","ix74r1j5L8","Dz1R3Yw2oU",
+"SmGzvzqH0W","RzaZA2hEEU","8TxD7M3zXL","CNHmvzHF1q","sqVrfNcICA","FVMxotjQxs","uoStwMezSW","k85AeX6Pin","vkCHHRpBQm","Waim6d7vjM",
+"pT8wuQClRL","fLNg8ni2v1","2TRI7CxVEf","SjskQ0h1b1","LewvMM3zXL","7X3uyAkKTk","HP433LewvM","P6bcg9y4lw","tAOsrprNT6","lm0pD9eoRc",
+"JkzUn2Nslm","guMb8ZuDtD","LbRTHVerEA","bgJAzHlUbF","m4bxU5VZjS","zqH0W16lHc","fcJOyYw2oU","yofH3lCMxy","QWxoToQ87r","v8yFNGXdoH",
+"FhtglBFkb8","BFkb8yToGW","o8UydtuDyS","zbIYYx3LDe","HfyNQlm0pD","k85AeblLA9","guMb8Rxrsm","d85a9n8pJ9","lj07Q5IhmG","azIWpsuY4x",
+"8U2nUuvf7A","ZzJHWm4bxU","EoToPaL6AJ","Yh1hFlViBv","FFDuidhSuH","618Di580YD","D6rBySWfou","9eoRc9rlg9","aez9y580YD","jS1aj3otm6",
+"0MR5X7Ow5C","ECMvU07n1c","VLTy6KZamH","zqH0WazIWp","No0QbPb1pa","h1zcHlCMxy","jfREu2ZHdk","uLtKsxXTI4","MezSWVIlwP","AOgEeokgRi",
+"uPX7GOUqFM","lweGyVNCPd","Mm8sinlaBy","aFFssI7p2a","0BmCy5Drn0","Yw2oURACuj","mz8gxk85Ae","MmKGJv1Hln","aez9yuAWyp","W3VFHgtCA5",
+"QnJ1SyEfy9","Q6hMCs93Ml","gjUTu24ARF","In3NS5IhmG","Qworu7fsYM","uvf7APOUYS","mz8gxlCMxy","KASQ8HP433","v2eC3faHir","gjUTuZhwG1",
+"SbRYyYh1hF","GrDg7rhl0J","RkQkeuN6r3","W7cTsBpYhV","0ao3lQChxs","29QAzTCgPp","jS1ajaL6AJ","WDVWJQnJ1S","GSQwjlXFOB","0BmCyYjB9t",
+"8xEKzjS1aj","5nmWvo8Uyd","QnJ1SaL6AJ","mX2GERmDcr","nFqikuJScX","jfREu8cVD3","m4bxUcL0aE","xXTI4FjHXR","NAFuwZUnqt","QYxC0dpe1v",
+"29QAz618Di","YjB9tpAhR1","Cfgr3dQ586","hUTw7ZzJHW","0YAGHQssNC","ksJbyt98iW","lweGyMm8si","mz8gxiB08l","b29RJ9rlg9","okgRiaL6AJ",
+"vkCHH7X3uy","l83UdVLTy6","Cfgr3LewvM","tjQxsO3iyQ","J2mQiCdyBV","SWfouyToGW","s93MlaL6AJ","YjB9tIn3NS","JRJQBM3zXL","mX2GED6rBy",
+"dQ586guMb8","m4bxUL7cGc","s7MxkSjskQ","mX2GE5VZjS","RBhp0s93Ml","5iGN5QChxs","4dEz68hJdt","5Drn014FLR","djsrvlj07Q","jtn0X6AFT0",
+"vkCHHo8Uyd","7lUXZkB5nP","t59lRyofH3","RpBQmKr8ys","7X3uyQbxXc","OHaBzn1pmO","fcJOyQChxs","Yf2Ec5Mg9r","24ARF64s8N","4QMc9yofH3",
+"9iGoTlkMUA","LDk6fGWqqX","QbxXcQClRL","brhlQReKEW","XyPZNpmeCd","QworuPOUYS","GXdoHRkQke","s93MlU3yw5","Yh1hFatef2","azIWp07n1c",
+"rhl0JVNCPd","HfyNQuN6r3","uvf7AfcJOy","SWfoudpe1v","QWxoT2TRI7","AXpwEa00b5","qaofNMmsIo","3otm6580YD","mz8gxW3VFH","0h1b1b29RJ",
+"DQimpVjCZq","yvOMItl72W","K20wKRxrsm","v2eC36AFT0","CIShGTCgPp","Cfgr3FwEJz","lCMxy0YAGH","dmoS7AkKTk","hUTw7nFqik","55rfBzz4ZU",
+"azIWpMezSW","NAFuwEoToP","4QMc95iGN5","Q6hMC7ku1p","v1HlnokgRi","Ul4a1OUYuF","K20wKpFrrl","a00b5uLtKs","5drc6MGlTF","TXQ0Zt59lR",
+"GSQwjQnJ1S","jeskS07n1c","tlILt3weIF","2Yz7EFNYIM","Ul4a1jS1aj","CxVEfMojnP","jtn0Xs93Ml","EoToPQssNC","RkQkeNOHsz","nlaByDG4sT",
+"uLtKs1LB1L","SWfouOHaBz","I7p2aIn3NS","okgRiuLtKs","uQIczuAWyp","Nxx9VUlU3M","BGaQY1v5hH","hSSvQZzJHW","euZA5xReec","RkQkeNhXdu",
+"oVQp6QChxs","x3LDeNxx9V","tjQxsG1RhS","blLA907n1c","IRh48fFDrJ","hE1Qldpe1v","2DREsyEfy9","ulk419GXkX","POUYSJJs5m","cL0aEeuZA5",
+"Q6hMC1j5L8","iqv4kOz8yZ","oVQp6vOqCE","OUqFMSbRYy","MmKGJEOE1o","brhlQ8cVD3","v2eC3HlUbF","l83UdgtCA5","2NslmFGzgp","5iGN5StlDJ",
+"AXpwEUvlv4","Pb1pa1j5L8","s93MlEOE1o","3otm67ku1p","ECMvUMm8si","s4786azIWp","gf8rIsx5Gl","fqypyzmLYD","VjCZq8FmFH","BGaQYpFrrl",
+"ZuDtD7ku1p","MaJQsUvlv4","ZJTXHK20wK","Yf2Ec7X3uy","QbxXcnFqik","lj07Qs4786","Ss0ZupWiOs","hi5X7LbRTH","FcWrWuPX7G","Uvlv4618Di",
+"G1RhSuLtKs","Pb1paUl4a1","YjB9tB3qem","i7WMQpFrrl","IKxdLNxx9V","pWiOsoVQp6","ZJTXHuZPqg","jSjS3EoToP","FVMxoDz1R3","2TRI7J2mQi",
+"CxVEfs7Mxk","5VZjSuN6r3","uvf7AiB08l","Vprf2h1zcH","cmXIXulk41","jS1ajRBhp0","zHF1q580YD","HfyNQTCgPp","MmsIoVerEA","StlDJFhtgl",
+"XflUqAgJHQ","hYBCKQbxXc","RsQUqI7p2a","lkMUA5Mg9r","pFrrlBbwgA","WDVWJv8yFN","iB08lYf2Ec","X6PinpmeCd","Kr8ysCIShG","Ta8f6zmLYD",
+"uPX7G0Kyfs","MGlTFAIYUu","d85a9S77LH","0Kyfsrz7Ut","xXTI4ru4UG","14FLRs4786","he9IA2Nslm","07n1cyluBx","QnJ1SQnJ1S","WPmlxHP433",
+"iB08lQssNC","e6e4zAOgEe","B3qemm4bxU","pT8wuQworu","hUTw70Wr5y","jS1ajpiJSk","ZhwG1HP433","rz7UtAIYUu","tAOsr07n1c","RACujC2Irc",
+"ZzJHW5Mg9r","jS1ajAXpwE","SWfouWMiS3","gIYvEiwzGk","HP433Gv3Fq","FPfSEcQOnv","jtn0XTwano","suY4x0ao3l","fFDrJeuZA5","soy9tpFrrl",
+"ix74rhYBCK","7Ow5C9rlg9","i7WMQCp3mZ","iKqhrUl4a1","9rlg9SWfou","VBjhzIBe8k","29QAzFxX9q","lkMUARsQUq","0Kyfs4dEz6","D6rByWmadA",
+"MaJQsCfgr3","HlUbF2hEEU","hi5X7zmLYD","LbRTHnlaBy","5Drn0dpe1v","JJs5mru4UG","lweGySbRYy","7ku1pzqH0W","ZJTXHW7cTs","t98iW2TRI7",
+"NhXdu5Drn0","hi5X75VZjS","OxWIHYf2Ec","ZUnqtdjsrv","JkzUn2ZHdk","0MR5Xn8pJ9","C2IrcU3yw5","4W0TlZv7z0","AgJHQgjUTu","5Drn0Y1mC0",
+"7X3uyiqv4k","SWfou0h1b1","dpe1vn1pmO","vLsmS5ZaEz","5NammnlaBy","5iGN5WDVWJ","faHir1LB1L","tlILtNOHsz","HRxd8t98iW","qQxHPbgJAz",
+"DLhzMWaWsv","VLTy6In3NS","F6PT2kB5nP","TXQ0ZEoToP","OHaBzgIYvE","gIYvEVerEA","Vprf2mz8gx","OUYuF9rlg9","0Wr5y618Di","fqypyRBhp0",
+"RzaZAiqv4k","x3LDedmoS7","M3zXLUl4a1","FGzgpmX2GE","NOHszHP433","soy9tQssNC","fmIK1hE1Ql","nnP8o2Yz7E","fcJOyqQxHP","Ul4a1n1pmO",
+"MmsIoWMiS3","tAOsrAmdQd","5Mg9r5drc6","yEfy9zqH0W","FjHXRW3VFH","5nmWvQChxs","PYBf4cShY2","pWiOsx3LDe","DQimpThjNn","24ARFsx5Gl",
+"HP433pmeCd","BFkb8nnP8o","cL0aE0MR5X","45cIHb29RJ","7hyVvK4GS8","618DiWMiS3","OxWIHfLNg8","sx5GlIKxdL","B3qemjiVBP","lH1ktCIShG",
+"Cp3mZDLhzM","HRxd8LewvM","zqH0WQChxs","W3VFH7lUXZ","0MR5XQssNC","azIWp2hEEU","7lUXZlsQGo","9XyT92DREs","KZamHogLgc","wDajXzqH0W",
+"3otm6Vprf2","AmdQdJJs5m","MezSW5Namm","uJScXSs0Zu","KZamHGWqqX","pv0i7uupzk","BbwgAAOgEe","qUJMd5VZjS","zY1GYdQ586","uoStw24ARF",
+"ZzJHWoVQp6","ydG8UfLNg8","M3zXLD6rBy","qQxHPs7Mxk","dmoS7Yf2Ec","Yw2oUjtn0X","EOE1oJkzUn","blLA9iB08l","FLspha00b5","EoToPFLsph",
+"IjTwPXflUq","zQt6QmX2GE","6q6L9zQt6Q","RpBQmlkMUA","S77LHguMb8","s7MxktaOXK","piJSkiqv4k","b29RJfaHir","GWqqX9XyT9","he9IAhi5X7",
+"2Nslm45cIH","tAOsrF6PT2","580YD8U2nU","JJs5mnnP8o","blLA9MK07Y","29QAzFnPFB","rKDLJuTacx","48cHLFPfSE","Uvlv4Q6hMC","jS1aj0MR5X",
+"mz8gx7ku1p","MojnPJ2mQi","S77LH9XyT9","8FmFHpv0i7","tAOsrnlaBy","VNCPdb29RJ","d85a9pAhR1","Ul4a1vkCHH","nlaBytjQxs","yluBxGWqqX",
+"FGzgpuTacx","FFDuiWaWsv","dmoS7QssNC","JkzUns7Mxk","OHaBz0Kyfs","hUTw7DQimp","RzaZAQssNC","sx5GltjQxs","618DifLNg8","v8yFNQWxoT",
+"EdBKcgf8rI","0h1b1Mm8si","uPX7Gni2v1","X6PinqUJMd","DLhzM0h1b1","xXTI4ZuDtD","TXQ0Z29QAz","5nmWv0ao3l","wiHrZ1v5hH","Ul4a1kB5nP",
+"gdQsSaez9y","hE1QllweGy","StlDJ0BmCy","BGaQYv2eC3","qaofNNAFuw","580YDa00b5","KASQ8d85a9","FjHXRd7vjM","IKxdLAkKTk","kB5nPVNCPd",
+"tjQxswDajX","D6rByuvf7A","GWqqXWmadA","fqypyvOqCE","M3zXLY1mC0","gf8rIuJScX","Q6hMC618Di","IBe8kulk41","AkKTkTwano","CqqaDiB08l",
+"pT8wuWMiS3","ZJTXHBpYhV","suY4x5Namm","K4GS8wDajX","8TxD7IBe8k","RkQke5nmWv","ksJbyFFDui","8U2nUWDVWJ","Yw2oUQ6Lix","tl72WwiHrZ",
+"FPfSErhl0J","FxX9qAgJHQ","45cIHVNCPd","jiVBPXyPZN","m4bxUxReec","yofH37fKYU","X6PinuN6r3","MGlTFpAhR1","9rlg9JXljW","Oz8yZoGu6x",
+"m4bxUlH1kt","MezSW3otm6","6q6L9sqVrf","ZJTXHfcwDa","XyPZNjeskS","QssNCuLtKs","DG4sTYOfrY","pv0i7brhlQ","MGlTFn1pmO","l83UdMojnP",
+"blLA924ARF","2DREsm4bxU","AmdQdnnP8o","FnPFBx3LDe","uupzkHP433","gdQsSoVQp6","oVQp6KsjRK","0Wr5yfmIK1","ZJTXH7lUXZ","lkMUAyvOMI",
+"xciqpNo0Qb","9iGoTiwzGk","cQOnvl83Ud","Q6hMC16lHc","4QMc9MezSW","Waim6b29RJ","uTacx7hyVv","tlILtzz4ZU","hE1Qlpv0i7","prNT6D6rBy",
+"QWxoTFLsph","UlU3MX6Pin","sx5GluJScX","YjB9tWMiS3","nnP8ojSjS3","MmKGJVjCZq","S2DfuyluBx","QssNCa00b5","h1zcH16lHc","7hyVvQ6Lix",
+"UmaEvCqqaD","pAhR1i3pyd","RmDcrOxWIH","POUYSEoToP","2hEEU07n1c","ZuDtDIn3NS","6AFT0G1RhS","CK5W74dEz6","jtn0XbrhlQ","y94nwoGu6x",
+"29QAzvLsmS","ciuWzJXljW","tl72WlViBv","GSQwj0Kyfs","7Ow5C3otm6","oGu6xRxrsm","4QMc9QssNC","he9IA9eoRc","CIShGWDVWJ","pFrrlCp3mZ",
+"aez9yuPX7G","jiVBPWPmlx","RxrsmtuDyS","dpe1vprNT6","Dz1R3lCMxy","Kr8yssoy9t","5Mg9rix74r","ECMvUfcJOy","Ta8f6MojnP","16lHcjS1aj",
+"cmXIXECMvU","IRh48uQIcz","blLA9580YD","WaWsvAXpwE","iB08lh1zcH","Chuy3jtn0X","I7p2a9rlg9","QssNC7fKYU","8cVD3zqH0W","OxWIHBCxeC",
+"blLA9JXljW","jzUqRWaim6","ZuDtDfFDrJ","618Din1pmO","LDk6f1j5L8","5iGN5KsjRK","WmadA6q6L9","9rlg9CxVEf","lm0pDIKxdL","rhl0JX6Pin",
+"0PktIGrDg7","tl72Wix74r","i3pydlpF6W","UmaEvksJby","zmLYDGWqqX","rhl0Jatef2","MGlTFM6qcG","s93MlNAFuw","HP433yvOMI","ogLgc0YAGH",
+"zQt6QJ2mQi","JIqXituDyS","W3VFHzmLYD","5NammzqH0W","lm0pDY1mC0","iB08llpF6W","Ss0ZuJXljW","BbwgABCxeC","Q6hMCGSQwj","JRJQBMojnP",
+"Ta8f6IKxdL","b29RJZhwG1","ZJTXH4dEz6","CqqaDBCxeC","FwEJziKqhr","atef2CdyBV","W7cTspT8wu","9rlg9DcpWB","xXTI4ZUnqt","zQt6QyluBx",
+"Q6LixzY1GY","HfyNQThjNn","hE1QlFxX9q","jeskS1LB1L","o8Uyd5IhmG","S2Dfu4W0Tl","QssNCgjUTu","55rfBd7vjM","uvf7ARsQUq","y94nw7ku1p",
+"atef2tuDyS","RpBQmpmeCd","lweGybZLvS","Vprf2nlaBy","QnJ1Sru4UG","zFgtBs4786","0BmCyKASQ8","3weIF0Kyfs","v2eC3ZzJHW","mz8gxAXpwE",
+"ulk41ulk41","wiHrZt59lR","lkMUAHRxd8","zz4ZUOxWIH","X6PinFnPFB","W3VFHNAFuw","hE1QluZPqg","fmIK1FnPFB","7fKYUwiHrZ","8xEKzRmDcr",
+"pAhR14QMc9","2NslmGXdoH","uupzkSs0Zu","Yw2oUaDGtS","UmaEvAmdQd","zqH0W0YAGH","NcICATXQ0Z","K4GS8K4GS8","ThjNnfLNg8","uJScXYOfrY",
+"HlUbFFLsph","0Kyfsy94nw","ulk41W3VFH","PYBf4Y1mC0","3otm6pv0i7","EoToP6AFT0","lXFOB4dEz6","VBjhzBbwgA","QWxoTQWxoT","7Ow5CVjCZq",
+"pT8wupmeCd","L7cGcoGu6x","S2DfugjUTu","d7vjMMK07Y","5ZaEz4dEz6","VLTy6Chuy3","VjCZq5iGN5","GXdoHQssNC","HlUbFQssNC","FNYIMTXQ0Z",
+"qUJMdx3LDe","QYxC0RpBQm","RzaZAFxX9q","5nmWv9rlg9","QWxoTqaofN","FcWrW8RCUA","uZPqgVLTy6","FhtgljzUqR","55rfBrz7Ut","jS1ajd7vjM",
+"m4bxUFLsph","rKDLJTa8f6","55rfBChuy3","JKWYRaez9y","gjUTu6AFT0","piJSkZ4I1v","DLhzMWMiS3","sqVrfSbRYy","WmadA9GXkX","U3yw5ZUnqt",
+"NAFuwoQ87r","DLhzMjfREu","FjHXRokgRi","5Mg9rlViBv","ru4UGjfREu","Z4I1vprNT6","pv0i7UlU3M","RACujgIYvE","uvf7AFGzgp","yToGWXflUq",
+"WPmlxRzaZA","CIShGdmoS7","iKqhrcL0aE","7fsYMFGzgp","7hyVvCxVEf","i7WMQMaJQs","BFkb87fsYM","l83UdWMiS3","yvOMIni2v1","dpe1vpAhR1",
+"zbIYY3otm6","FhtglEOE1o","tlILtYOfrY","7fsYMiKqhr","0MR5XQ6Lix","NhXdus7Mxk","MojnPogLgc","yluBx0Kyfs","HP43364s8N","AXpwEQWxoT",
+"pv0i7sx5Gl","8TxD7HzZT8","7fsYMyvOMI","0h1b1n8pJ9","qaofNsoy9t","SbRYyOUYuF","d85a9jS1aj","VIlwPTXQ0Z","lsQGoaL6AJ","wiHrZzFgtB",
+"D6rByS2Dfu","HfyNQuTacx","dmoS7n8pJ9","jSjS3Ta8f6","l83Ud1LB1L","fFDrJx3LDe","QChxsJKWYR","55rfBTwano","qQxHPS77LH","VerEAPOUYS",
+"aDGtSTa8f6","iKqhrLDk6f","C2Irco8Uyd","e6e4zv2eC3","GrDg7uZPqg","HlUbFFcWrW","Q6hMCUmaEv","atef2FnPFB","hE1QlCNHmv","prNT6Z4I1v",
+"l83UdlViBv","GWqqXWaim6","7Ow5CoVQp6","1j5L8dmoS7","jeskSsuY4x","MaJQskZANm","s4786dQ586","Q6hMCeuZA5","lj07QnnP8o","uAWypvLsmS",
+"WreyPO3iyQ","vOqCEokgRi","aFFssuQIcz","3weIFUmaEv","5IhmGk85Ae","zFgtB8U2nU","8cVD3JRJQB","VNCPddjsrv","i7WMQv8yFN","5IhmGNAFuw",
+"D6rByXflUq","guMb8OUYuF","7X3uyJIqXi","AIYUu48cHL","GWqqXQbxXc","ZhwG1n1pmO","JXljWRBhp0","ReKEWCqqaD","aDGtSfcwDa","QnJ1ShSSvQ",
+"uJScXKZamH","uN6r3uQIcz","lViBvpFrrl","d7vjMyToGW","YjB9tpmeCd","jzUqRdmoS7","DQimpTa8f6","mX2GEhUTw7","5drc6lm0pD","FwEJzbrhlQ",
+"cShY28xEKz","Kr8ysEOE1o","64s8N0BmCy","F6PT2Chuy3","ZzJHWbgJAz","QWxoT8xEKz","ciuWzWaim6","G1RhSdhSuH","Ta8f6ZuDtD","o8UydxReec",
+"oGu6xhSSvQ","RxrsmgIYvE","tvdkD4dEz6","ciuWzCqqaD","K20wKfLNg8","ru4UG8hJdt","kB5nP8TxD7","XyPZNOUqFM","K20wKhe9IA","uLtKsRsQUq",
+"PYBf4t59lR","fcJOyRsQUq","tl72We6e4z","djsrvcL0aE","1v5hHGWqqX","HzZT80MR5X","bgJAzRmDcr","Q6Lix4QMc9","okgRiBFkb8","pT8wuDLhzM",
+"vkCHHYh1hF","7ku1p2Yz7E","6q6L9HRxd8","ZzJHWUlU3M","jiVBPoVQp6","uQIczNo0Qb","soy9tqUJMd","TXQ0Z2Nslm","2Yz7E8xEKz","Yf2EcNOHsz",
+"gtCA5fLNg8","pT8wu9XyT9","OHaBzOUqFM","faHirQ6Lix","Waim6a00b5","kZANmaDGtS","oQ87rsoy9t","hE1Ql0ao3l","7lUXZfFDrJ","55rfBBFkb8",
+"lkMUAlkMUA","JIqXiZv7z0","lj07QnlaBy","3otm6FjHXR","yluBxL7cGc","ix74r45cIH","SWfouAOgEe","SjskQQworu","k85AeThjNn","RkQkeIRh48",
+"Yh1hFblLA9","SWfouvkCHH","5nmWvYw2oU","24ARF0PktI","FcWrWcL0aE","vLsmSs4786","Chuy3yofH3","mz8gxCK5W7","uupzkzqH0W","2TRI7JRJQB",
+"0YAGHQ6Lix","D6rByUl4a1","qQxHPReKEW","U3yw5pv0i7","AmdQdiKqhr","OUYuF24ARF","yEfy9JJs5m","G1RhSt98iW","Gv3FqK4GS8","P6bcguLtKs",
+"5VZjS45cIH","WPmlxgdQsS","qQxHPFhtgl","5nmWvpmeCd","8RCUA9y4lw","D6rByy94nw","1v5hHBFkb8","gf8rIlH1kt","qaofNMezSW","KZamHkZANm",
+"BGaQYuupzk","n1pmOoQ87r","nFqikjiVBP","Uvlv4VerEA","Zv7z0sqVrf","Ta8f6NAFuw","Yh1hFtlILt","5ZaEzzY1GY","2DREsfqypy","CxVEfTXQ0Z",
+"NOHszWaim6","lCMxylXFOB","J2mQilXFOB","HzZT8Fhtgl","5NammAOgEe","0ao3lqUJMd","Ta8f6gtCA5","ZUnqtblLA9","W7cTsYf2Ec","qaofNUl4a1",
+"ogLgcVLTy6","zbIYYs93Ml","IKxdLOUqFM","WPmlxGSQwj","Qworu9iGoT","B3qemZUnqt","pT8wuWmadA","Yf2EckB5nP","RBhp016lHc","pvgjSKr8ys",
+"7hyVvFhtgl","Q6LixMK07Y","RzaZACfgr3","EoToPblLA9","ZzJHWQssNC","gdQsSIKxdL","jiVBPb29RJ","AOgEe2TRI7","2NslmzHF1q","xciqpQnJ1S",
+"b29RJtjQxs","tl72WNhXdu","bgJAzY1mC0","pvgjSJXljW","aDGtSEoToP","lViBvZJTXH","Oz8yZdmoS7","Uvlv41v5hH","sx5GlChuy3","5nmWvWDVWJ",
+"OHaBzdpe1v","Mm8si0Kyfs","S2DfuW3VFH","QworuAgJHQ","9iGoTLbRTH","l83UdIRh48","t59lRSmGzv","fcwDaWaim6","rKDLJI7p2a","U3yw50h1b1",
+"IBe8kpWiOs","KsjRK24ARF","rz7UtqQxHP","Q6LixUvlv4","7hyVvEdBKc","WPmlxFnPFB","hYBCK2ZHdk","pmeCdpiJSk","Mm8si7ku1p","Q6hMCFLsph",
+"yluBx9rlg9","DcpWBF6PT2","7hyVvnFqik","Mkgy8Ul4a1","VNCPdMezSW","aez9y0BmCy","tvdkDaFFss","lH1kt9rlg9","vkCHHbgJAz","lCMxyRpBQm",
+"Mkgy8UmaEv","hi5X7WreyP","VjCZqzbIYY","HlUbF07n1c","Kr8ysuupzk","QnJ1S9GXkX","W7cTshi5X7","NcICAvkCHH","zHF1quZPqg","TCgPpMmKGJ",
+"suY4xkB5nP","K4GS8Cfgr3","aL6AJHP433","Q6Lix9rlg9","C2IrcnFqik","ZuDtD580YD","faHir4QMc9","29QAzOUqFM","QClRLHlUbF","XyPZNFLsph",
+"Kr8yspmeCd","fLNg8JJs5m","Y1mC0BGaQY","UmaEvCIShG","mX2GEFLsph","HP433Q6Lix","Y1mC0WMiS3","MmKGJlH1kt","Pb1paEOE1o","FcWrW5drc6",
+"Ta8f6VjCZq","IKxdLAIYUu","QChxsVBjhz","StlDJIKxdL","XyPZNn8pJ9","Qworu7lUXZ","AIYUujS1aj","zHF1qWaWsv","5nmWvzbIYY","SbRYya00b5",
+"48cHLhi5X7","VIlwPLDk6f","16lHct98iW","uZPqgEoToP","zmLYDqUJMd","guMb8ciuWz","AmdQdjiVBP","0h1b1ZhwG1","X6PinCNHmv","2Nslm7hyVv",
+"pWiOsQssNC","ciuWz5IhmG","0Wr5y9XyT9","wDajXNxx9V","tlILtv8yFN","NAFuwgf8rI","Vprf23otm6","jS1ajCdyBV","4W0Tl7hyVv","DLhzMhi5X7",
+"2NslmFxX9q","h1zcHuPX7G","s93MlRACuj","uZPqgFxX9q","IjTwP14FLR","TXQ0ZsuY4x","pFrrlJXljW","ZUnqtzmLYD","OHaBzTa8f6","I7p2ajSjS3",
+"5IhmGtlILt","Pb1paPb1pa","okgRi7ku1p","AOgEepAhR1","cQOnv7hyVv","ydG8Urhl0J","NOHszSWfou","atef2xXTI4","oGu6xMaJQs","OHaBzuLtKs",
+"h1zcHqQxHP","vOqCExciqp","SbRYyatef2","AIYUuZv7z0","DcpWBRsQUq","K4GS8MojnP","AOgEeuvf7A","uN6r3EdBKc","jeskSReKEW","soy9txXTI4",
+"xXTI4MaJQs","I7p2agf8rI","HfyNQs93Ml","3weIFpmeCd","JKWYRGXdoH","WmadAi3pyd","wiHrZSjskQ","Uvlv4DG4sT","Nxx9VtjQxs","ksJbytjQxs",
+"FjHXRUl4a1","JIqXiaez9y","MmsIouJScX","0MR5XhSSvQ","Mkgy8euZA5","6AFT0CNHmv","QnJ1S24ARF","n1pmOQssNC","BGaQY6AFT0","1v5hHM6qcG",
+"lweGyVIlwP","5ZaEzEoToP","mz8gxlm0pD","TwanoYh1hF","kB5nPlH1kt","dmoS7sqVrf","TXQ0ZoQ87r","X6PinzHF1q","Mkgy8AIYUu","5iGN507n1c",
+"PYBf4hSSvQ","iKqhre6e4z","64s8Nfqypy","0MR5XfLNg8","XflUqUl4a1","KsjRKbrhlQ","a00b5jiVBP","7X3uyTa8f6","CqqaDlViBv","9XyT955rfB",
+"nnP8olsQGo","s4786zY1GY","EOE1o5iGN5","BpYhVRACuj","EOE1oblLA9","DcpWBWMiS3","VBjhzNxx9V","guMb8ni2v1","B3qemVerEA","dmoS73otm6",
+"5IhmGuPX7G","jzUqRUl4a1","S77LHhYBCK","FhtglPb1pa","l83Ud8TxD7","s93Mlatef2","lkMUAv1Hln","Mm8siprNT6","8cVD3lweGy","L7cGcwDajX",
+"NhXduvOqCE","uPX7GDG4sT","fcwDav8yFN","7lUXZk85Ae","he9IAC2Irc","yofH3iB08l","CxVEft98iW","MGlTFpmeCd","VLTy6FPfSE","Q6Lix0MR5X",
+"VNCPdFhtgl","FwEJzn8pJ9","RACuj2DREs","wiHrZ4dEz6","t98iWCqqaD","7ku1pDLhzM","KASQ8Z4I1v","NOHsz6AFT0","lm0pD5Mg9r","zmLYDuN6r3",
+"8RCUAaDGtS","s93MlDcpWB","FFDuicQOnv","KsjRKn8pJ9","aDGtSZJTXH","WmadARxrsm","lsQGouJScX","2hEEUoVQp6","FPfSEs4786","2Yz7EuoStw",
+"YjB9tNOHsz","ZzJHWHlUbF","S2DfufcJOy","Chuy3DcpWB","W7cTsi3pyd","5nmWvtjQxs","CK5W77fKYU","aL6AJSWfou","uAWypIjTwP","7hyVviB08l",
+"CdyBV0Wr5y","QnJ1SGrDg7","29QAzF6PT2","lCMxybgJAz","CIShGNhXdu","0h1b1t59lR","4QMc9FLsph","HlUbFRpBQm","AIYUubrhlQ","y94nwvLsmS",
+"lsQGoGWqqX","fqypyDLhzM","FGzgpBFkb8","K20wKaez9y","bgJAztaOXK","HRxd8Q6hMC","9rlg9MaJQs","oVQp6GWqqX","cQOnvxciqp","VNCPdNo0Qb",
+"CdyBVOHaBz","EOE1oJRJQB","8FmFHDcpWB","vLsmSmz8gx","jfREuOxWIH","FhtglIRh48","JIqXiMK07Y","ThjNnaDGtS","6q6L9OxWIH","ogLgct98iW",
+"nlaByCIShG","DG4sTcmXIX","uJScXzY1GY","Mkgy8GrDg7","StlDJ9eoRc","RACujcQOnv","ulk41U3yw5","vLsmSCxVEf","64s8Nv1Hln","MmsIov1Hln",
+"zbIYY5nmWv","WreyPgIYvE","uAWypS77LH","EoToPOxWIH","NAFuw2Nslm","hi5X7Waim6","EOE1o5nmWv","lj07Q24ARF","VIlwPNAFuw","pT8wuvLsmS",
+"tAOsrFGzgp","S2DfulkMUA","0MR5XRBhp0","B3qemG1RhS","oGu6xMmKGJ","S77LHVerEA","xReec8cVD3","B3qemn8pJ9","dmoS7fmIK1","atef2VBjhz",
+"UlU3MWreyP","hi5X7DG4sT","Nxx9Vm4bxU","580YDjfREu","NcICA5iGN5","DcpWBHzZT8","cShY2cQOnv","hUTw7NOHsz","SbRYyWreyP","618DiTwano",
+"lViBvJKWYR","AkKTkaL6AJ","s93Mlh1zcH","SmGzvEdBKc","Nxx9Vatef2","JKWYRNhXdu","L7cGcCqqaD","EoToPhi5X7","suY4xuZPqg","cShY2dQ586",
+"BpYhVVprf2","uZPqgaL6AJ","5Drn0Mm8si","RBhp00Wr5y","O3iyQjfREu","9iGoTpvgjS","QbxXccShY2","ru4UGqaofN","B3qemiB08l","oGu6xdmoS7",
+"Mkgy8OUYuF","RsQUqY1mC0","lm0pD4W0Tl","5drc60PktI","ogLgcZuDtD","JkzUnzQt6Q","NcICA6q6L9","5nmWvn1pmO","FnPFBRmDcr","Cp3mZs93Ml",
+"hE1QlJkzUn","mz8gxuLtKs","14FLRdmoS7","jzUqRFPfSE","Nxx9VTXQ0Z","JKWYR4W0Tl","M3zXLBGaQY","yvOMIOUYuF","K4GS8x3LDe","DQimpMK07Y",
+"s4786tAOsr","ksJbyDcpWB","OxWIH7Ow5C","mz8gx5drc6","m4bxUatef2","m4bxUtlILt","7Ow5CWreyP","5iGN5aL6AJ","Uvlv4O3iyQ","HP4337Ow5C",
+"azIWpEdBKc","aFFssyToGW","nFqikguMb8","iqv4kprNT6","0h1b1tAOsr","7lUXZciuWz","QssNCZJTXH","zHF1q8RCUA","KsjRK8TxD7","lpF6WQ6hMC",
+"MezSWFcWrW","jS1ajG1RhS","CK5W7Cp3mZ","0PktIi7WMQ","bgJAzuJScX","iqv4krhl0J","Dz1R32ZHdk","HRxd8EoToP","zbIYYBpYhV","Dz1R3hUTw7",
+"mz8gxS2Dfu","X6PinGv3Fq","GXdoHdpe1v","tlILthSSvQ","0YAGHtl72W","16lHcmX2GE","5iGN5zz4ZU","3weIFRACuj","fcwDat59lR","6q6L9zFgtB",
+"piJSkFLsph","FGzgp14FLR","5iGN58hJdt","iB08lGXdoH","D6rByI7p2a","KASQ8uoStw","b29RJMmsIo","Yw2oUqQxHP","uoStw4W0Tl","lsQGoiKqhr",
+"VjCZqwDajX","KsjRKh1zcH","ReKEW7X3uy","8cVD3JkzUn","jiVBPaL6AJ","MmKGJSjskQ","ciuWzGXdoH","VIlwPxciqp","Chuy38hJdt","3weIFyvOMI",
+"v2eC3QChxs","6q6L9Pb1pa","9eoRcZhwG1","TXQ0ZBGaQY","Cfgr3Yw2oU","oQ87ruQIcz","t98iWNo0Qb","lXFOBCqqaD","yEfy9KZamH","7fsYM8U2nU",
+"okgRio8Uyd","X6Pinzz4ZU","5Mg9rFcWrW","he9IAFPfSE","d7vjMpmeCd","5Drn0UmaEv","jSjS3iqv4k","h1zcHQWxoT","O3iyQNo0Qb","2NslmAIYUu",
+"lCMxycShY2","zY1GYGWqqX","W7cTsG1RhS","BCxeCl83Ud","FjHXR8xEKz","BpYhV64s8N","0BmCybZLvS","Yw2oUvkCHH","29QAzBFkb8","uTacxPb1pa",
+"0Kyfs1v5hH","BbwgA5iGN5","jtn0X55rfB","JkzUnWreyP","Ss0ZuuJScX","48cHL0ao3l","9GXkXQClRL","M6qcGNcICA","n1pmOWmadA","uPX7Ghi5X7",
+"uJScXNo0Qb","FxX9quZPqg","pFrrlVLTy6","K4GS8580YD","gtCA5SmGzv","Kr8ysxReec","IKxdLuvf7A","tuDyS0Kyfs","brhlQTa8f6","TwanoVLTy6",
+"s4786RBhp0","RxrsmQChxs","KsjRKWaWsv","OHaBz2Yz7E","O3iyQa00b5","XflUqksJby","YjB9t9y4lw","AkKTklViBv","8RCUAxciqp","Q6hMCiKqhr",
+"uupzkOUYuF","uAWypC2Irc","uN6r3Yw2oU","nFqik5Mg9r","pT8wuCfgr3","tvdkD6q6L9","euZA5J2mQi","GXdoHatef2","FPfSE48cHL","VBjhz2Yz7E",
+"pFrrllj07Q","UlU3Mhe9IA","QbxXczmLYD","aFFss0BmCy","rKDLJJRJQB","blLA92ZHdk","hi5X7AgJHQ","9GXkXyofH3","cL0aEmz8gx","cShY2fmIK1",
+"FGzgpP6bcg","3otm624ARF","VBjhz5Mg9r","dpe1vLbRTH","x3LDe618Di","I7p2aO3iyQ","2ZHdkLDk6f","wiHrZ9y4lw","zQt6QQbxXc","s7Mxkv2eC3",
+"0Wr5yVLTy6","lweGy8RCUA","1j5L8MaJQs","b29RJDz1R3","Zv7z0Yf2Ec","vOqCEWaWsv","DcpWBDQimp","3weIFlkMUA","dQ586iB08l","XflUqsqVrf",
+"7fKYUt98iW","JJs5mgf8rI","qUJMdcShY2","NhXdu55rfB","GXdoHwiHrZ","i3pydm4bxU","55rfBBbwgA","zbIYYo8Uyd","U3yw5Y1mC0","blLA9dpe1v",
+"5drc664s8N","1v5hHdQ586","2DREsuAWyp","9y4lwFxX9q","cShY2oVQp6","x3LDewiHrZ","Mm8siBbwgA","MaJQsjzUqR","qUJMdTwano","7lUXZIRh48",
+"hYBCKqQxHP","nFqiklweGy","XyPZNtaOXK","MezSWY1mC0","o8UydNhXdu","M3zXLFnPFB","GXdoHdjsrv","OxWIHDcpWB","0YAGHeuZA5","3otm6Qworu",
+"7fsYMuoStw","hUTw7v2eC3","OUYuFWmadA","ZhwG1hSSvQ","yofH32hEEU","55rfBulk41","BCxeCGWqqX","7ku1pGrDg7","BGaQY7ku1p","BpYhV1j5L8",
+"0YAGHjeskS","QWxoTPb1pa","MojnPX6Pin","DQimpRzaZA","2DREs3weIF","UmaEvqaofN","gf8rIoQ87r","3weIFBFkb8","rhl0Jt59lR","oVQp6hYBCK",
+"jS1ajFNYIM","kZANmKASQ8","IjTwP2Nslm","O3iyQTa8f6","SWfourhl0J","dmoS7IBe8k","wDajXksJby","uJScXgjUTu","8TxD7jtn0X","M3zXLVjCZq",
+"IBe8k5drc6","1v5hHzHF1q","YjB9t0PktI","ksJbyQnJ1S","5drc6SmGzv","tjQxsUl4a1","14FLR24ARF","sx5GlMmKGJ","zbIYYfqypy","FcWrWn8pJ9",
+"DLhzMNcICA","HP433RkQke","FwEJz5Drn0","uoStwOUYuF","lpF6W5Mg9r","nlaByogLgc","TCgPpJIqXi","FLsph1j5L8","AXpwEpAhR1","nlaByyofH3",
+"azIWptaOXK","K20wKDz1R3","YjB9ttvdkD","brhlQlViBv","FGzgpiKqhr","QWxoTY1mC0","TCgPpOUqFM","oVQp6L7cGc","MGlTFFFDui","5iGN5ZuDtD",
+"uoStwd7vjM","ulk418RCUA","2Yz7EBGaQY","i3pydpvgjS","8RCUASs0Zu","vkCHHSs0Zu","dhSuHlpF6W","FGzgppT8wu","yToGWiB08l","RpBQm29QAz",
+"OxWIH7ku1p","FLsphaFFss","tvdkDFnPFB","jSjS3D6rBy","RmDcruN6r3","Ul4a1uN6r3","9y4lwBbwgA","14FLRydG8U","0KyfszQt6Q","IKxdLTCgPp",
+"jzUqRQssNC","D6rByfcwDa","AXpwE8RCUA","GWqqXt98iW","24ARFa00b5","2hEEUFxX9q","dQ586lweGy","FxX9qdjsrv","MK07YWMiS3","uPX7Gix74r",
+"lweGygf8rI","FwEJzMezSW","WMiS35drc6","ReKEW3otm6","KsjRKfLNg8","ciuWzK4GS8","In3NSHlUbF","4W0TlYh1hF","fLNg8OUqFM","dhSuHKsjRK",
+"uLtKsQbxXc","XyPZNwiHrZ","pFrrlt59lR","DcpWBzbIYY","9y4lwNo0Qb","pv0i7QnJ1S","BGaQYoGu6x","7fsYMciuWz","HP433VerEA","GWqqX0Kyfs",
+"yofH33otm6","CK5W7Vprf2","Twano9y4lw","yEfy9uN6r3","8RCUA5Drn0","WaWsvPOUYS","uJScXfcwDa","n8pJ9JJs5m","yvOMI9GXkX","FcWrWCqqaD",
+"CNHmvbrhlQ","2NslmP6bcg","RpBQmpT8wu","uvf7AHfyNQ","lj07QLbRTH","0YAGHpT8wu","2TRI7hSSvQ","2TRI7I7p2a","Uvlv4I7p2a","mz8gx1v5hH",
+"tuDySpAhR1","5VZjSCK5W7","OHaBzQChxs","n1pmOnlaBy","tuDyS9iGoT","BpYhVhi5X7","qUJMdVLTy6","UmaEvuupzk","618DiAIYUu","MezSWKZamH",
+"v8yFNazIWp","jeskSrz7Ut","X6PinbrhlQ","uJScXTwano","5iGN5NAFuw","0MR5XgtCA5","x3LDetjQxs","zY1GYNAFuw","jSjS3B3qem","RsQUqsuY4x",
+"ciuWzvLsmS","TCgPppv0i7","OUYuFVBjhz","yEfy9ix74r","pv0i7UmaEv","ksJbyVBjhz","FVMxoDG4sT","ZhwG1azIWp","Waim6WPmlx","8hJdtlXFOB",
+"tuDySguMb8","2NslmB3qem","QssNC2Yz7E","9y4lw2hEEU","CIShGGSQwj","AIYUuaDGtS","hE1Qlrz7Ut","7lUXZfLNg8","HRxd8QYxC0","HP433oGu6x",
+"jtn0XyofH3","zmLYDQ6Lix","FPfSEhUTw7","bgJAzkB5nP","zHF1qyofH3","xciqpFPfSE","QClRLaez9y","Gv3Fq14FLR","RBhp0taOXK","5Drn0lH1kt",
+"ZUnqtOUqFM","lpF6Wxciqp","ix74razIWp","n8pJ9Cp3mZ","atef2OxWIH","SjskQokgRi","GSQwj9XyT9","YOfrYOz8yZ","yEfy9StlDJ","WMiS30h1b1",
+"DLhzMOUqFM","29QAzQClRL","fqypysuY4x","HP433cQOnv","K4GS8MaJQs","qaofNdQ586","0BmCyzz4ZU","WmadAzz4ZU","WPmlxlH1kt","RzaZAuPX7G",
+"hSSvQpvgjS","jfREu07n1c","DcpWBciuWz","5nmWvyofH3","uAWypVLTy6","fqypyyToGW","Chuy3FPfSE","MGlTFaDGtS","vOqCE9rlg9","Zv7z0tAOsr",
+"pvgjSECMvU","Yf2EcjeskS","lH1ktU3yw5","bgJAz8xEKz","euZA58FmFH","QYxC0guMb8","Yw2oULewvM","tlILtFhtgl","FFDuiCIShG","JKWYRqQxHP",
+"IBe8kW7cTs","7X3uytvdkD","RkQkeuTacx","EoToP4W0Tl","Vprf2UmaEv","AgJHQyEfy9","07n1cHRxd8","nFqik2hEEU","ni2v1rz7Ut","DLhzMjtn0X",
+"J2mQipiJSk","7ku1poGu6x","gf8rI64s8N","euZA5zQt6Q","jS1aj5VZjS","lpF6Wd85a9","uoStwzY1GY","lkMUACK5W7","1LB1LblLA9","aL6AJoGu6x",
+"iwzGkuvf7A","5IhmGCK5W7","RsQUqUmaEv","gjUTud7vjM","2DREsTCgPp","NcICAHlUbF","cL0aE5iGN5","uAWyp7ku1p","fLNg8M6qcG","FhtglFPfSE",
+"fmIK1oQ87r","8U2nUoGu6x","WmadAFNYIM","3otm6jfREu","CdyBVjiVBP","ReKEWCxVEf","8TxD7rz7Ut","fLNg8ReKEW","GSQwjblLA9","XyPZN0Wr5y",
+"sx5GlOUYuF","MmsIoQssNC","5nmWvJ2mQi","FFDuiF6PT2","9iGoTpv0i7","kB5nPKsjRK","ni2v1ZJTXH","fcwDafmIK1","PYBf4VNCPd","zFgtB29QAz",
+"In3NSRmDcr","nlaByqUJMd","StlDJYw2oU","7hyVvFGzgp","lweGyRxrsm","t98iWjfREu","OHaBzcL0aE","LbRTHix74r","No0Qb9XyT9","7hyVvrhl0J",
+"AgJHQ5iGN5","4QMc9Yh1hF","ciuWz8cVD3","AIYUuv8yFN","CNHmv8U2nU","WMiS3xciqp","QnJ1SMmKGJ","gdQsSFPfSE","WreyPzHF1q","xciqpnFqik",
+"0h1b12DREs","AXpwEgjUTu","9y4lw6q6L9","lj07QoGu6x","EoToPK20wK","FVMxo9iGoT","bgJAz0MR5X","AmdQdMmsIo","POUYSv2eC3","QClRLnFqik",
+"gIYvENAFuw","VLTy6djsrv","nnP8osqVrf","pAhR1lXFOB","2TRI71j5L8","Cfgr32ZHdk","cmXIXwDajX","5Nammh1zcH","sx5GlzbIYY","pv0i7MGlTF",
+"CNHmv4QMc9","mX2GE6AFT0","Gv3FqRmDcr","RmDcr3otm6","C2Ircx3LDe","Zv7z0d85a9","5NammGXdoH","UmaEvaDGtS","FPfSESWfou","Mkgy8AkKTk",
+"hi5X7gIYvE","0PktIDQimp","lH1kty94nw","suY4xs93Ml","Mkgy8cQOnv","Chuy3pT8wu","dQ586gtCA5","J2mQizFgtB","Zv7z0uLtKs","GXdoHn1pmO",
+"XflUqtaOXK","RmDcruTacx","SjskQcShY2","Q6LixhYBCK","ni2v1FFDui","GSQwjIRh48","Gv3FqqQxHP","OHaBzOHaBz","pv0i7gjUTu","618Diuupzk",
+"QWxoTFNYIM","FGzgpFnPFB","OUqFMx3LDe","K4GS8uZPqg","PYBf4Qworu","lweGy9XyT9","k85AevOqCE","ydG8UAkKTk","14FLRtaOXK","0MR5XYw2oU",
+"atef2VIlwP","CNHmvt98iW","tlILtQChxs","5IhmGHzZT8","IRh48GXdoH","xciqpfaHir","RBhp0QChxs","t59lRwiHrZ","QbxXcIBe8k","ciuWzJIqXi",
+"VerEAokgRi","brhlQRACuj","CqqaDxciqp","VerEABGaQY","rKDLJogLgc","rKDLJAgJHQ","dmoS7pAhR1","fcwDaKZamH","euZA5Mm8si","Fhtglaez9y",
+"FGzgpIKxdL","VIlwPL7cGc","Y1mC0s7Mxk","7fKYUdmoS7","QbxXcWaim6","qQxHPIRh48","yvOMIb29RJ","pFrrlJIqXi","RBhp05drc6","jSjS3CNHmv",
+"fLNg8ulk41","RmDcrMm8si","DLhzMjeskS","nFqikqaofN","KZamHP6bcg","kB5nPZhwG1","MmsIosuY4x","Uvlv4FNYIM","5iGN5rKDLJ","ECMvUuvf7A",
+"zbIYYRBhp0","jS1ajNo0Qb","FhtglYOfrY","D6rByBGaQY","azIWpYh1hF","fLNg8nnP8o","KsjRKVjCZq","ix74rZv7z0","KASQ85Mg9r","VjCZqBCxeC",
+"0YAGH0h1b1","FGzgpCqqaD","tlILts93Ml","OxWIHuvf7A","iKqhrLewvM","RzaZAhe9IA","RACujTXQ0Z","jzUqRbZLvS","RxrsmUmaEv","v1HlnLbRTH",
+"YOfrYChuy3","8cVD3pAhR1","MezSWi7WMQ","azIWp5VZjS","lXFOBokgRi","YjB9t9GXkX","O3iyQ2Nslm","tuDyS3otm6","0YAGHMm8si","FGzgpb29RJ",
+"FNYIMFnPFB","64s8NDcpWB","zqH0WIn3NS","EOE1oYjB9t","Waim6yToGW","Kr8yssuY4x","ogLgcxXTI4","pvgjSuJScX","CqqaDtuDyS","hYBCKv8yFN",
+"he9IASs0Zu","P6bcgyEfy9","24ARFl83Ud","JJs5mYh1hF","No0QbmX2GE","2TRI7Zv7z0","RpBQm5ZaEz","sqVrfk85Ae","cShY2djsrv","U3yw5mz8gx",
+"tlILt7fKYU","FNYIMuAWyp","VerEA48cHL","OHaBzVprf2","55rfByvOMI","zFgtBe6e4z","P6bcgzmLYD","FLsphKr8ys","07n1cFcWrW","3weIFQClRL",
+"soy9tWmadA","QnJ1SsqVrf","uJScXydG8U","NAFuw0MR5X","HfyNQVNCPd","OUqFMAOgEe","WmadA5IhmG","W3VFHECMvU","mX2GEKZamH","0MR5XAOgEe",
+"FGzgp9eoRc","AgJHQ1j5L8","14FLR1v5hH","hi5X745cIH","i7WMQG1RhS","8xEKz580YD","ydG8UNcICA","2Yz7EFcWrW","lm0pDMmsIo","zY1GYCxVEf",
+"v1HlnGXdoH","XyPZNpiJSk","1LB1L14FLR","x3LDe6q6L9","QClRLOxWIH","6q6L9AOgEe","OHaBziB08l","5Drn0SjskQ","TwanoS77LH","6q6L9uoStw",
+"iKqhrBFkb8","ix74rYjB9t","dmoS7o8Uyd","d7vjMlsQGo","jtn0XCp3mZ","soy9tMkgy8","2ZHdktlILt","9XyT9VIlwP","6AFT0rhl0J","CdyBV1j5L8",
+"dmoS70Kyfs","gjUTuFFDui","v2eC3I7p2a","RxrsmhYBCK","v8yFN45cIH","yofH3uJScX","0h1b1Rxrsm","7ku1px3LDe","AIYUuGWqqX","s7Mxk6q6L9",
+"fmIK14dEz6","jeskS0PktI","MojnPyToGW","WmadAuQIcz","uPX7GlViBv","7fKYUCp3mZ","SbRYybZLvS","IjTwPfqypy","s7MxkQssNC","Pb1paVIlwP",
+"OUqFM8RCUA","tjQxs16lHc","rhl0JyEfy9","FwEJzcShY2","5iGN5SjskQ","5IhmGqaofN","oQ87rF6PT2","07n1c2TRI7","mX2GEVIlwP","55rfBStlDJ",
+"6q6L9AIYUu","0h1b107n1c","7X3uy5IhmG","cL0aEFGzgp","hUTw7yToGW","nlaByv1Hln","lm0pDQbxXc","MK07YNxx9V","xReeci3pyd","Vprf29XyT9",
+"SmGzvaL6AJ","NAFuwZzJHW","L7cGcUlU3M","cQOnv4dEz6","brhlQ2DREs","Cfgr3lpF6W","Yh1hFCxVEf","K20wKjS1aj","zmLYDFjHXR","HzZT8L7cGc",
+"GWqqXO3iyQ","guMb8jfREu","2DREsNxx9V","o8UydyToGW","WMiS3t59lR","ciuWzOUqFM","Nxx9VdQ586","Cp3mZCqqaD","Cfgr3kZANm","Kr8yscShY2",
+"0YAGHS2Dfu","FGzgp4dEz6","dpe1vIn3NS","zHF1qJIqXi","Z4I1vVLTy6","5VZjSs4786","sx5Glsoy9t","azIWpAOgEe","he9IAb29RJ","gjUTu2hEEU",
+"RkQkeRzaZA","MmKGJS77LH","S2Dfud85a9","X6Pins7Mxk","2DREsjiVBP","MmKGJfaHir","0ao3lKr8ys","3weIFAIYUu","ZzJHWi3pyd","J2mQisoy9t",
+"XyPZNMm8si","pmeCdgdQsS","Y1mC0JIqXi","7Ow5Ce6e4z","3weIFGSQwj","QbxXcYf2Ec","pFrrlSs0Zu","AOgEe07n1c","2hEEUlXFOB","yToGW5nmWv",
+"lkMUA5drc6","Mkgy8Q6Lix","0ao3llsQGo","16lHcjfREu","6AFT00Wr5y","KASQ8RpBQm","6AFT0zFgtB","FjHXR0ao3l","2TRI7BCxeC","StlDJ0YAGH",
+"CdyBVazIWp","JXljW6AFT0","gjUTuCK5W7","2Yz7ECfgr3","2TRI7ix74r","QssNCUl4a1","i3pydHRxd8","k85Ae5ZaEz","7ku1pv2eC3","0Kyfs8U2nU",
+"5IhmGs93Ml","HP433Mkgy8","uAWyp5iGN5","KASQ8a00b5","I7p2azz4ZU","7ku1pUl4a1","ksJbyK4GS8","cShY2EdBKc","zbIYYrhl0J","7X3uyl83Ud",
+"UlU3M5Mg9r","JIqXiJIqXi","M3zXLMaJQs","6AFT0i3pyd","FcWrWUl4a1","iB08ls4786","KASQ8Yf2Ec","okgRixReec","AOgEen8pJ9","8TxD71v5hH",
+"9eoRcWaWsv","2NslmguMb8","D6rBy8FmFH","ix74rgtCA5","n1pmOZUnqt","5VZjStl72W","nnP8oblLA9","Y1mC07fsYM","0BmCywiHrZ","fcwDahe9IA",
+"aL6AJni2v1","jfREuRmDcr","QClRLCxVEf","StlDJuQIcz","EdBKcSmGzv","QChxsv8yFN","7hyVv1j5L8","2NslmyluBx","MK07Yuupzk","jfREuFLsph",
+"hUTw755rfB","LDk6fFLsph","xXTI4QClRL","0YAGHhYBCK","ZuDtDMm8si","6AFT0VNCPd","Mkgy89iGoT","0BmCyUlU3M","b29RJv8yFN","oVQp6tvdkD",
+"EOE1ouJScX","16lHcQssNC","B3qemaez9y","MmsIoGXdoH","FxX9qjSjS3","wDajXyvOMI","8hJdtStlDJ","Nxx9Va00b5","S77LHSbRYy","D6rByUlU3M",
+"FPfSEfcJOy","45cIH9GXkX","guMb8IjTwP","618DiBFkb8","5VZjSoVQp6","e6e4zuTacx","2TRI7nlaBy","lCMxyRBhp0","5iGN5RACuj","cShY2hYBCK",
+"DG4sTi3pyd","5Drn00MR5X","lkMUAQChxs","CdyBVciuWz","GSQwjYh1hF","Y1mC00Wr5y","9GXkXF6PT2","M6qcGjSjS3","NcICAoVQp6","2hEEUprNT6",
+"iwzGkbZLvS","Kr8ysReKEW","FnPFBCK5W7","FwEJzKsjRK","5Mg9rlm0pD","EoToP16lHc","uvf7AHRxd8","S2DfuNcICA","EdBKcRACuj","FGzgp7ku1p",
+"ReKEWWmadA","dpe1vrz7Ut","0MR5XWreyP","HlUbFiqv4k","RBhp0zmLYD","dpe1vFnPFB","lj07Q5Mg9r","NcICAWaim6","Kr8ys5IhmG","jSjS3SbRYy",
+"JRJQBXflUq","OUqFMbgJAz","7Ow5CJKWYR","MojnPtuDyS","uvf7A4QMc9","k85Ae1j5L8","2TRI7bZLvS","mz8gxYw2oU","LewvMs4786","16lHchSSvQ",
+"MezSWSjskQ","Zv7z0azIWp","nFqikS77LH","okgRiuAWyp","suY4xcL0aE","CdyBVGXdoH","0Kyfsd85a9","SbRYyQClRL","0Wr5ylViBv","bZLvSWMiS3",
+"faHirAIYUu","FVMxouPX7G","WreyP9XyT9","BFkb8jtn0X","FVMxoaDGtS","zY1GYZuDtD","RkQkeM6qcG","bgJAz7fsYM","prNT6XflUq","HP433WMiS3",
+"JKWYRFFDui","o8Uydiqv4k","Dz1R3a00b5","CNHmv580YD","xXTI4JIqXi","8xEKzYf2Ec","zY1GYNxx9V","P6bcgOUYuF","580YDpmeCd","xXTI4uPX7G",
+"WMiS3IBe8k","3otm67Ow5C","tlILtBCxeC","nFqikl83Ud","NhXduMkgy8","okgRiAkKTk","LDk6f7hyVv","7lUXZCNHmv","580YDKZamH","8RCUAzY1GY",
+"vLsmScShY2","pWiOsS2Dfu","gdQsSzmLYD","dQ586soy9t","jeskSvkCHH","Mm8siLbRTH","pFrrlAOgEe","GSQwjCfgr3","FVMxoydG8U","kB5nPSs0Zu",
+"0PktIsqVrf","cShY2ZzJHW","tjQxsaFFss","iB08laL6AJ","jeskSOxWIH","yvOMIFVMxo","jtn0XnFqik","K4GS80h1b1","AIYUu7lUXZ","QClRLlViBv",
+"guMb8K20wK","8hJdt1LB1L","Cfgr3U3yw5","brhlQBFkb8","B3qemzHF1q","JkzUnEoToP","ru4UGLDk6f","ZhwG1RsQUq","fmIK1GWqqX","rKDLJFxX9q",
+"d7vjMBFkb8","euZA5Twano","QYxC0Qworu","yofH30PktI","AgJHQYjB9t","ni2v1gIYvE","ZJTXHprNT6","S77LHo8Uyd","In3NSaDGtS","JIqXiChuy3",
+"VNCPdRmDcr","lCMxy29QAz","OxWIHUl4a1","gtCA5QWxoT","7X3uyW3VFH","pAhR1FcWrW","lpF6Wa00b5","EOE1o8U2nU","yvOMICNHmv","dmoS7Ta8f6",
+"9y4lwsqVrf","blLA9W7cTs","QssNCGv3Fq","618DigtCA5","b29RJNo0Qb","iKqhrQ6hMC","S77LHlCMxy","suY4xAIYUu","JXljWBbwgA","DLhzMyluBx",
+"FFDui07n1c","YOfrYVBjhz","fqypybZLvS","bZLvSVjCZq","rhl0JjzUqR","s93MlHP433","14FLRx3LDe","VjCZq2DREs","RpBQm5VZjS","uupzksuY4x",
+"MezSW0ao3l","L7cGcs93Ml","Vprf2Q6Lix","W7cTsKZamH","618Di5ZaEz","uoStwAmdQd","7lUXZlH1kt","ZuDtDs93Ml","U3yw5k85Ae","l83UdHP433",
+"RmDcrIjTwP","NAFuwkZANm","5VZjSJkzUn","YjB9txXTI4","KASQ8i7WMQ","iB08lyToGW","NAFuw9rlg9","6q6L9uN6r3","FxX9qK20wK","5NammuAWyp",
+"HP4333otm6","M6qcG16lHc","L7cGcKsjRK","FNYIMhYBCK","s7MxkdhSuH","uQIczpmeCd","Zv7z0U3yw5","ix74rG1RhS","SbRYypAhR1","WDVWJni2v1",
+"VerEA7ku1p","lCMxy4W0Tl","KZamHVBjhz","cL0aElsQGo","07n1czY1GY","WMiS3sqVrf","Yh1hFkB5nP","QYxC0lViBv","oVQp6blLA9","XflUquupzk",
+"5iGN5dhSuH","0h1b1pvgjS","8cVD38RCUA","HRxd8In3NS","JRJQBciuWz","brhlQMm8si","NhXdu7Ow5C","tlILts7Mxk","rKDLJCIShG","Pb1payvOMI",
+"cQOnvK20wK","1LB1LtvdkD","Pb1pa6AFT0","6AFT01v5hH","EOE1o2ZHdk","DLhzMQssNC","HzZT8QssNC","LbRTHiwzGk","Oz8yZQworu","X6Pinl83Ud",
+"tAOsrCxVEf","MK07YSmGzv","KASQ807n1c","zHF1qWMiS3","9iGoTAgJHQ","TCgPpjS1aj","qQxHPI7p2a","5VZjS2ZHdk","FVMxoiB08l","45cIHtaOXK",
+"5Drn0t98iW","gdQsSvLsmS","G1RhSKr8ys","djsrv16lHc","ydG8U5drc6","8RCUAReKEW","hE1QlIn3NS","5ZaEzjzUqR","Waim6jS1aj","Gv3FqpWiOs",
+"dhSuHsx5Gl","lCMxyFjHXR","kB5nP9GXkX","LewvMyofH3","ZuDtD5ZaEz","uLtKs48cHL","GXdoHcShY2","lkMUAW7cTs","SjskQJIqXi","B3qemPb1pa",
+"TXQ0ZguMb8","ThjNnuLtKs","P6bcg1v5hH","brhlQgIYvE","fmIK1CqqaD","wiHrZtuDyS","wDajXNcICA","piJSkpv0i7","LDk6fVIlwP","4W0Tldjsrv",
+"BpYhVlm0pD","In3NS1v5hH","6q6L9pT8wu","2TRI7a00b5","dhSuHFwEJz","TCgPpCK5W7","J2mQivkCHH","Ul4a1aFFss","K4GS8aDGtS","580YDzQt6Q",
+"aL6AJ0Kyfs","n1pmOYOfrY","J2mQi8TxD7","PYBf4ZhwG1","RBhp0Yh1hF","lsQGogtCA5","HRxd85drc6","Mkgy8RsQUq","BpYhVB3qem","fFDrJyToGW",
+"nlaByCdyBV","WreyPguMb8","2hEEUdpe1v","8FmFHprNT6","KsjRKMmsIo","XyPZN9iGoT","AkKTk0MR5X","v8yFNMkgy8","piJSkogLgc","WaWsvYh1hF",
+"580YDTXQ0Z","aez9ydhSuH","FnPFBcQOnv","yofH3Waim6","7Ow5CQssNC","RkQkeTwano","hUTw76AFT0","rKDLJzz4ZU","fmIK12DREs","2Yz7ERpBQm",
+"Q6LixJXljW","gtCA57fsYM","3weIFd7vjM","Ul4a1D6rBy","9GXkXBFkb8","16lHc2TRI7","oQ87r0ao3l","07n1cgdQsS","azIWp55rfB","KZamHCp3mZ",
+"Q6LixgdQsS","Gv3Fq5Mg9r","lm0pDXflUq","6q6L9dQ586","rz7Utatef2","vLsmSoQ87r","EOE1oBFkb8","v1HlnW3VFH","iqv4kQ6Lix","BpYhVcShY2",
+"KsjRKyToGW","SjskQ16lHc","5IhmG7fKYU","OUqFMWreyP","4QMc9rKDLJ","NhXduciuWz","uoStwi3pyd","0YAGH64s8N","9y4lwJRJQB","DLhzMTa8f6",
+"4QMc9OHaBz","rz7UtVjCZq","J2mQi8xEKz","jzUqR4QMc9","CK5W7W7cTs","2Yz7EKr8ys","uPX7GguMb8","M6qcGzmLYD","VIlwPdjsrv","bgJAztAOsr",
+"TCgPp7lUXZ","5nmWviqv4k","UlU3MfLNg8","ZUnqtLDk6f","ZzJHWRzaZA","DQimpNo0Qb","k85AeHzZT8","v1HlnQssNC","ZzJHWix74r","FhtglblLA9",
+"29QAzfcwDa","G1RhSAkKTk","0ao3lDcpWB","RsQUqQssNC","MezSWHfyNQ","FnPFBFcWrW","uvf7AQnJ1S","RsQUqs7Mxk","MojnPdjsrv","0BmCyQbxXc",
+"W7cTsSbRYy","ru4UGfFDrJ","QbxXcAgJHQ","cQOnv0ao3l","blLA9nlaBy","LewvMKsjRK","pFrrl7lUXZ","nlaByeuZA5","DLhzMru4UG","7lUXZFNYIM",
+"v1HlnChuy3","aFFss7X3uy","qaofNYw2oU","zz4ZU1j5L8","uLtKsThjNn","ZJTXHM3zXL","FhtglXflUq","dQ586jiVBP","G1RhSJKWYR","prNT6VerEA",
+"MojnPlweGy","x3LDeyToGW","yofH3wDajX","8RCUAzFgtB","0h1b1TCgPp","okgRiIRh48","MojnPOHaBz","0Wr5ycL0aE","8TxD7t98iW","gIYvE7lUXZ",
+"faHirdhSuH","5ZaEzogLgc","8hJdtQssNC","WreyPBpYhV","O3iyQ9iGoT","okgRiQssNC","OUYuFhi5X7","CNHmvUvlv4","CqqaDRpBQm","HfyNQfLNg8",
+"7fKYUVLTy6","he9IATa8f6","VIlwPDz1R3","KZamHnlaBy","mX2GEMK07Y","QnJ1Sa00b5","2DREsguMb8","aFFsskZANm","fcwDaVprf2","HfyNQRBhp0",
+"5IhmG8RCUA","uPX7GJ2mQi","7fKYUuN6r3","FNYIMlCMxy","zmLYDpFrrl","soy9t1LB1L","hi5X7uN6r3","nnP8oZUnqt","JXljWjS1aj","8cVD3o8Uyd",
+"pv0i7ZzJHW","NhXdun1pmO","rhl0J5drc6","gtCA5Uvlv4","MmsIojS1aj","yEfy9BCxeC","ru4UG8cVD3","Dz1R3uupzk","AmdQdrz7Ut","FVMxon8pJ9",
+"OUqFMdhSuH","HlUbFOUqFM","taOXK07n1c","1v5hHDLhzM","Kr8ys1j5L8","GrDg7fcJOy","pv0i7VIlwP","5ZaEzn1pmO","0Kyfsdpe1v","brhlQuvf7A",
+"dhSuHix74r","8TxD7SjskQ","soy9tP6bcg","WreyP1j5L8","e6e4ztlILt","LewvMIKxdL","IjTwPpWiOs","tjQxsWDVWJ","JkzUnpmeCd","BGaQYVIlwP",
+"C2Irc7X3uy","zHF1qvLsmS","guMb8FxX9q","5ZaEzNAFuw","EoToPnFqik","Cp3mZVLTy6","VBjhz2Nslm","b29RJ0Wr5y","v1HlncmXIX","POUYShUTw7",
+"UlU3Mn1pmO","9y4lwHlUbF","QbxXcRzaZA","jfREuqQxHP","VLTy6Zv7z0","gjUTupvgjS","5Mg9rbZLvS","fcwDa8xEKz","dQ586bgJAz","pvgjStjQxs",
+"SjskQRpBQm","8RCUA0PktI","n1pmOzbIYY","kB5nP14FLR","7lUXZZuDtD","FjHXR5nmWv","wiHrZcL0aE","Yw2oUbrhlQ","FPfSEQ6Lix","LDk6fpT8wu",
+"prNT6ix74r","brhlQhe9IA","guMb8Q6Lix","9y4lws93Ml","yvOMIdQ586","5nmWv5nmWv","hi5X7gtCA5","RACujZhwG1","iqv4kSbRYy","FhtglFnPFB",
+"lViBvQbxXc","2hEEUo8Uyd","1j5L83otm6","YjB9tblLA9","k85AeuTacx","NAFuwB3qem","FVMxoJXljW","suY4xAXpwE","jfREulm0pD","D6rBy24ARF",
+"RpBQmVprf2","yEfy9QYxC0","BpYhVIn3NS","64s8N6q6L9","lH1ktpWiOs","fLNg8lj07Q","uN6r39iGoT","7fKYU5drc6","ciuWzdmoS7","n8pJ9X6Pin",
+"ZhwG1fcJOy","64s8NNo0Qb","ulk41JJs5m","HlUbF580YD","C2Irclj07Q","45cIH7fsYM","9eoRcgf8rI","SjskQAgJHQ","8RCUAB3qem","MGlTFfaHir",
+"TXQ0ZksJby","9rlg90PktI","M6qcGpvgjS","FFDuiHlUbF","n1pmOsx5Gl","JXljWAXpwE","WmadAaez9y","RxrsmyToGW","HlUbFhi5X7","B3qemDz1R3",
+"i7WMQHRxd8","t98iW0ao3l","K4GS8Q6Lix","uvf7AFFDui","F6PT2n8pJ9","FNYIMU3yw5","GrDg7FPfSE","BFkb8FNYIM","KASQ8FcWrW","JRJQB5VZjS",
+"2Yz7EDcpWB","suY4xuQIcz","CNHmvn1pmO","MmsIoS2Dfu","XyPZNK20wK","TXQ0ZCp3mZ","5nmWvTwano","IjTwPPOUYS","zY1GYcQOnv","FNYIMeuZA5",
+"EoToPCqqaD","k85AeDG4sT","0YAGH8xEKz","9y4lwKASQ8","GXdoHksJby","RmDcrDz1R3","5IhmGVBjhz","Y1mC0In3NS","uPX7G2hEEU","Oz8yZM3zXL",
+"MK07YhYBCK","oQ87rzFgtB","pWiOsmz8gx","hi5X7tvdkD","taOXKlsQGo","7hyVvazIWp","QssNCAXpwE","LewvMh1zcH","Mm8siQnJ1S","okgRibgJAz",
+"kB5nPfqypy","Oz8yZ0BmCy","gIYvEaL6AJ","XflUqG1RhS","ciuWzpWiOs","CxVEftvdkD","oVQp6dhSuH","ix74rOUqFM","Yw2oUokgRi","zbIYYqaofN",
+"CIShGaez9y","nnP8o7fsYM","07n1cl83Ud","1j5L8rKDLJ","xReecdpe1v","yluBxzqH0W","VerEA0h1b1","FxX9qL7cGc","ciuWzaDGtS","yToGWOz8yZ",
+"hSSvQzQt6Q","fLNg8cL0aE","Yw2oU9y4lw","ni2v1oQ87r","DQimp580YD","hi5X7CxVEf","iB08lv2eC3","n8pJ9gIYvE","ZJTXHi7WMQ","2Yz7ENo0Qb",
+"t98iWsqVrf","Cfgr3FcWrW","pT8wu16lHc","HRxd8X6Pin","DG4sTxReec","In3NSOUYuF","Y1mC07hyVv","BpYhV0h1b1","JXljWqUJMd","ReKEWNhXdu",
+"oQ87rBpYhV","prNT6pv0i7","Yh1hFkZANm","0PktI5VZjS","RmDcrmX2GE","hUTw79y4lw","FhtglwDajX","n8pJ9BCxeC","55rfBUlU3M","5nmWvXflUq",
+"0ao3lEoToP","yEfy9rKDLJ","lpF6Wt59lR","ZUnqt2TRI7","29QAzwiHrZ","J2mQi3otm6","0PktIW3VFH","CqqaDL7cGc","Z4I1v3weIF","0h1b1CdyBV",
+"WaWsvjtn0X","FFDuiQworu","qUJMduN6r3","MezSWguMb8","azIWpZv7z0","F6PT2e6e4z","5Mg9rlXFOB","hSSvQWaim6","4W0Tlb29RJ","OxWIHVerEA",
+"ciuWz0ao3l","WaWsv7X3uy","suY4xgjUTu","MezSWBbwgA","ogLgcFVMxo","Zv7z07Ow5C","d7vjMblLA9","24ARF16lHc","StlDJciuWz","9y4lwmz8gx",
+"faHiruLtKs","Cp3mZMojnP","EOE1oCdyBV","pWiOs7hyVv","ThjNnfaHir","MaJQsBFkb8","0YAGHNcICA","dQ586VLTy6","LDk6fD6rBy","QYxC0OUqFM",
+"lXFOBjiVBP","tAOsrJKWYR","W3VFHJRJQB","48cHLSmGzv","NAFuwCIShG","C2IrciwzGk","zqH0WEoToP","FnPFB3otm6","Qworud7vjM","9rlg9pAhR1",
+"CIShGJXljW","ogLgca00b5","SWfou8hJdt","RkQkeoGu6x","ix74rlpF6W","WMiS3i3pyd","nFqikMmKGJ","2ZHdkd85a9","L7cGcQChxs","ulk41DG4sT",
+"NOHszSmGzv","I7p2arKDLJ","JJs5mStlDJ","uPX7G7hyVv","xReec8xEKz","yofH3K4GS8","tvdkDpv0i7","9eoRcIKxdL","ThjNnVprf2","K20wKIjTwP",
+"QbxXcJJs5m","uTacx2TRI7","IjTwPyEfy9","XflUqdhSuH","faHirciuWz","8RCUABpYhV","0Wr5yZzJHW","pT8wuB3qem","9iGoTv1Hln","fcwDa07n1c",
+"9eoRc0ao3l","uQIczQbxXc","MmsIo5ZaEz","CNHmvIjTwP","sx5GlTwano","cL0aE6q6L9","Q6hMCyToGW","x3LDe6AFT0","zQt6Qpv0i7","uJScXVjCZq",
+"7fsYM5VZjS","Waim6AIYUu","07n1c3weIF","SWfouuPX7G","taOXK0h1b1","D6rBywDajX","HP433ZuDtD","he9IAlpF6W","0YAGHtlILt","tuDySIn3NS",
+"xReece6e4z","5IhmG5drc6","2NslmVprf2","qQxHPQChxs","lkMUAVBjhz","MojnPt98iW","6AFT0DcpWB","JXljWm4bxU","gIYvEVNCPd","atef20h1b1",
+"EOE1oqUJMd","5Mg9rDQimp","F6PT2RsQUq","iwzGkFhtgl","bgJAzv1Hln","Ta8f6oVQp6","lj07Q8TxD7","fLNg8U3yw5","EdBKcaez9y","U3yw58FmFH",
+"bgJAzpT8wu","DcpWBrhl0J","5Mg9rZhwG1","WmadAWreyP","rKDLJo8Uyd","7fKYUJkzUn","wiHrZQ6hMC","XflUqEOE1o","8cVD3blLA9","MGlTFIRh48",
+"xReecgdQsS","suY4xKsjRK","S77LHNxx9V","CK5W75Drn0","qaofNIKxdL","ru4UGuZPqg","oQ87rtaOXK","IKxdLThjNn","h1zcHCxVEf","5iGN5uPX7G",
+"UmaEvZuDtD","FLsphOUYuF","WDVWJ5ZaEz","FLsphaez9y","fmIK1Yf2Ec","NAFuwF6PT2","azIWp618Di","kZANmGXdoH","tl72WLewvM","QChxst98iW",
+"MojnPjeskS","PYBf48cVD3","24ARFRBhp0","RACuj7fsYM","VBjhzS2Dfu","QworupAhR1","i7WMQ7hyVv","MojnPhUTw7","FVMxosuY4x","qUJMdKr8ys",
+"W3VFHB3qem","FxX9qFVMxo","CqqaD8TxD7","AmdQdXflUq","tvdkDCxVEf","rhl0J8RCUA","RsQUqkZANm","C2IrcpiJSk","Qworu48cHL","X6PinS2Dfu",
+"sqVrfFPfSE","zY1GYxXTI4","Mm8siYh1hF","pvgjSv1Hln","7lUXZjzUqR","GWqqXyofH3","HP433K4GS8","8cVD3jfREu","8cVD3iKqhr","uAWypDz1R3",
+"jtn0XFVMxo","uZPqgydG8U","lsQGo0Kyfs","K4GS8pvgjS","azIWp64s8N","Twanosx5Gl","QssNCGXdoH","pvgjS55rfB","EoToPP6bcg","gdQsS2hEEU",
+"2TRI7SWfou","W3VFHSmGzv","he9IA618Di","lsQGopAhR1","5drc6nlaBy","pvgjSFLsph","RBhp0LewvM","CxVEfd85a9","JkzUn5VZjS","PYBf4Z4I1v",
+"CK5W7DcpWB","5IhmGb29RJ","CNHmv7Ow5C","MojnPMojnP","ZJTXH07n1c","hUTw7lweGy","i7WMQFNYIM","AkKTkmX2GE","WMiS3Yh1hF","FwEJzhE1Ql",
+"XflUqs7Mxk","7fKYUFwEJz","0Wr5yYf2Ec","zqH0W9XyT9","48cHLkZANm","FhtglOUYuF","Mkgy8kB5nP","GWqqX7fsYM","DG4sTL7cGc","BCxeCbrhlQ",
+"No0QbBGaQY","LDk6f618Di","MezSWRmDcr","t98iWUmaEv","uupzk0BmCy","FFDuiCdyBV","gdQsShYBCK","Mkgy8cmXIX","16lHcciuWz","suY4xX6Pin",
+"VNCPdyEfy9","QbxXcFhtgl","zbIYYiKqhr","azIWplViBv","hi5X7QssNC","kB5nPIjTwP","Dz1R3fcwDa","gf8rIPYBf4","No0QbIBe8k","IBe8kzbIYY",
+"4dEz6gdQsS","fcwDavOqCE","lm0pDQnJ1S","EoToPvOqCE","s4786SWfou","DG4sTlkMUA","5drc65Mg9r","PYBf4FLsph","FNYIMYh1hF","RpBQm9iGoT",
+"tuDyS6AFT0","7lUXZGWqqX","FcWrWYjB9t","Ss0Zuo8Uyd","5nmWv0h1b1","3weIFVNCPd","SbRYylViBv","QssNCvOqCE","CxVEfB3qem","lweGy45cIH",
+"VjCZquPX7G","0h1b1kB5nP","FxX9quTacx","iKqhrIRh48","RkQkepiJSk","JkzUngIYvE","8FmFHCp3mZ","oGu6xGWqqX","9rlg9LbRTH","GSQwjGSQwj",
+"IjTwPcL0aE","DQimp0Kyfs","pT8wuFhtgl","mz8gxHlUbF","RpBQm5drc6","W7cTs48cHL","s93Mlo8Uyd","AmdQdGWqqX","FxX9qFnPFB","zHF1qEoToP",
+"e6e4zoGu6x","9GXkXD6rBy","5drc6euZA5","ReKEW4W0Tl","Kr8ysdpe1v","aez9yb29RJ","b29RJcmXIX","uZPqgjfREu","t59lRTXQ0Z","ECMvUEoToP",
+"uZPqgfaHir","djsrvL7cGc","9y4lwMezSW","pv0i7uAWyp","jeskSKr8ys","4QMc9Yf2Ec","4dEz6Cfgr3","5NammBFkb8","0ao3l2Nslm","tl72W8cVD3",
+"uLtKstl72W","KZamHjtn0X","NOHszuJScX","Pb1paUlU3M","lj07QzbIYY","Nxx9VLewvM","i7WMQ2Nslm","i7WMQVprf2","9XyT9jtn0X","55rfBG1RhS",
+"TwanoK20wK","CdyBV5ZaEz","gjUTuSbRYy","I7p2aAgJHQ","KZamHYf2Ec","24ARFZzJHW","Rxrsms7Mxk","oGu6xBGaQY","uTacxvOqCE","zbIYYe6e4z",
+"9GXkXUmaEv","Q6hMC0PktI","WreyPVLTy6","2DREsUmaEv","iqv4kCdyBV","RACujru4UG","ReKEWKsjRK","Zv7z0ZuDtD","uoStwHP433","tAOsrnnP8o",
+"iwzGkTCgPp","I7p2aBGaQY","s93MlBFkb8","v8yFN8hJdt","QssNCiwzGk","zHF1q64s8N","oQ87rUlU3M","IKxdL2DREs","5ZaEzzFgtB","AkKTkpAhR1",
+"14FLRcShY2","QnJ1SiwzGk","7fsYMECMvU","QClRLxXTI4","KsjRKGrDg7","WPmlxW3VFH","YjB9tvLsmS","MmKGJReKEW","rKDLJFFDui","9y4lwrKDLJ",
+"WPmlx0h1b1","v1HlnOxWIH","1v5hHMkgy8","8U2nUBCxeC","yofH3zqH0W","QbxXc8xEKz","JIqXin8pJ9","uupzkB3qem","FxX9q0YAGH","EdBKcsoy9t",
+"BFkb8sqVrf","JIqXiXyPZN","MGlTFogLgc","KASQ8azIWp","Cp3mZRmDcr","DLhzMDcpWB","AOgEe2DREs","qUJMdY1mC0","CxVEfStlDJ","zHF1qOxWIH",
+"IRh48uoStw","9eoRcZ4I1v","Oz8yZzmLYD","1j5L8W3VFH","BGaQYqaofN","Nxx9VuAWyp","IRh48lkMUA","RxrsmguMb8","LewvMb29RJ","uAWypWDVWJ",
+"Ul4a1LbRTH","ZzJHWMm8si","OUqFMtaOXK","55rfBFNYIM","7Ow5C2hEEU","ZhwG17X3uy","cQOnv580YD","jfREuTCgPp","xReeccShY2","oVQp6s93Ml",
+"he9IA4dEz6","WDVWJeuZA5","VjCZqazIWp","gf8rIuN6r3","gtCA5zmLYD","n1pmOyEfy9","POUYSQnJ1S","faHirTa8f6","a00b5VerEA","GSQwjWreyP",
+"VLTy6ogLgc","FNYIMqaofN","dQ586ZhwG1","GWqqXd85a9","jfREu2TRI7","8xEKzxciqp","xXTI40h1b1","RkQkeHRxd8","ZuDtDhSSvQ","FVMxoCp3mZ",
+"tjQxsogLgc","4QMc9xXTI4","U3yw55Mg9r","hi5X7Y1mC0","YOfrYXyPZN","EoToPe6e4z","uoStwlkMUA","ix74rksJby","MaJQsFNYIM","d85a91v5hH",
+"gf8rIhSSvQ","0h1b1Pb1pa","ZhwG1fmIK1","Zv7z0lXFOB","NOHszyToGW","uLtKs1v5hH","9eoRcX6Pin","X6Pin2Yz7E","8TxD7CqqaD","Chuy3FwEJz",
+"uvf7A8xEKz","1LB1LIjTwP","hUTw7uPX7G","s93Ml5IhmG","7lUXZdpe1v","2ZHdkChuy3","6AFT04QMc9","X6PinM3zXL","6AFT0oGu6x","5Namm5Namm",
+"OUqFMgIYvE","ThjNnhE1Ql","yToGWogLgc","WMiS3S2Dfu","kB5nPvkCHH","Q6Lixmz8gx","0ao3lWreyP","580YDlXFOB","0ao3lWDVWJ","MGlTFgdQsS",
+"M6qcG8FmFH","VLTy6yluBx","GXdoHTXQ0Z","jS1ajMm8si","EOE1oDG4sT","3weIF0Wr5y","piJSkY1mC0","t98iWTwano","sqVrfsuY4x","JIqXi5Mg9r",
+"DG4sTQnJ1S","uZPqg5drc6","FPfSEAXpwE","wiHrZt98iW","qaofNBpYhV","0h1b1NOHsz","5NammRACuj","lXFOBQbxXc","uupzkKZamH","BGaQY2DREs",
+"S77LH6q6L9","lj07QCNHmv","uLtKsIjTwP","GrDg7nlaBy","QnJ1SPb1pa","AmdQdTXQ0Z","kB5nPVLTy6","G1RhSQssNC","ciuWzlCMxy","8FmFHAOgEe",
+"rKDLJFjHXR","FjHXR0Wr5y","Rxrsmn8pJ9","ECMvUpFrrl","tvdkDFjHXR","e6e4zIBe8k","Yw2oUyluBx","JKWYR7X3uy","Kr8ys2DREs","nnP8opvgjS",
+"O3iyQgtCA5","F6PT2CdyBV","WreyP2TRI7","guMb8iwzGk","8xEKzy94nw","7X3uyprNT6","he9IAfmIK1","ZJTXHDcpWB","Kr8ys9y4lw","ix74rFcWrW",
+"ZJTXH8cVD3","piJSklH1kt","2DREs0Wr5y","zHF1quQIcz","4QMc97hyVv","AOgEe4QMc9","VjCZqzQt6Q","8U2nU7hyVv","48cHLlViBv","dpe1vWDVWJ",
+"Nxx9VO3iyQ","okgRigtCA5","AkKTkzqH0W","RsQUqiwzGk","3otm6DLhzM","IKxdLqQxHP","jeskSXflUq","lCMxy5ZaEz","HP433djsrv","fcJOy5Namm",
+"AOgEeTa8f6","pv0i70ao3l","ZhwG1LDk6f","pmeCdXflUq","lViBvyofH3","jSjS30BmCy","JJs5mCqqaD","7ku1pW7cTs","48cHLdjsrv","qUJMdO3iyQ",
+"8cVD3RACuj","VIlwPtaOXK","DLhzMYOfrY","jeskSOUqFM","ThjNnKZamH","9eoRc5drc6","StlDJbgJAz","cmXIXNAFuw","LDk6f4W0Tl","KZamHM3zXL",
+"JKWYRJkzUn","Waim67hyVv","1v5hH9eoRc","M6qcGVBjhz","FwEJz7fsYM","aFFss1v5hH","C2IrcWreyP","NcICAAXpwE","C2IrcoGu6x","VerEAMmsIo",
+"X6PinwDajX","CxVEfni2v1","cL0aEyofH3","P6bcgx3LDe","lsQGociuWz","QClRLYh1hF","qaofNhYBCK","pAhR1HlUbF","C2Ircsoy9t","QworuRsQUq",
+"pAhR1aDGtS","RxrsmuTacx","RxrsmVBjhz","7fsYMzQt6Q","QnJ1S0h1b1","hE1QlQWxoT","W3VFHnnP8o","SjskQa00b5","cL0aEs4786","2DREs9rlg9",
+"lj07QogLgc","ix74r2TRI7","ix74rpAhR1","S2DfuUlU3M","VjCZqCNHmv","7lUXZOUYuF","GrDg7Yh1hF","In3NSwiHrZ","3otm6zbIYY","RpBQmIRh48",
+"NAFuwix74r","gIYvE0ao3l","I7p2a4W0Tl","yvOMIzmLYD","lm0pDfcJOy","AXpwEzQt6Q","FwEJz2hEEU","piJSkeuZA5","iwzGkC2Irc","nlaBytaOXK",
+"nFqikCIShG","Gv3FqUvlv4","oVQp6rKDLJ","1j5L8XyPZN","M3zXLZ4I1v","gtCA54QMc9","WMiS3s4786","8U2nUa00b5","0ao3ls7Mxk","Nxx9VHP433",
+"hi5X74dEz6","pv0i7580YD","h1zcH5Mg9r","guMb8jS1aj","n8pJ9kZANm","CIShG8FmFH","55rfBzmLYD","aL6AJO3iyQ","IBe8kQworu","VBjhzlCMxy",
+"EoToPlpF6W","Uvlv4uLtKs","DG4sTNAFuw","CIShGJRJQB","Uvlv4uupzk","GrDg7oQ87r","Kr8ysk85Ae","s7MxkGv3Fq","sqVrf14FLR","9GXkXzHF1q",
+"KASQ8fLNg8","gtCA5lj07Q","8U2nUQnJ1S","lsQGoQworu","UlU3MJRJQB","CNHmv4dEz6","FLsphM6qcG","oGu6xTXQ0Z","JRJQBFxX9q","HP433gjUTu",
+"1j5L8n8pJ9","vkCHHCqqaD","cShY2JKWYR","uPX7GiKqhr","7fsYMzqH0W","Chuy3pWiOs","2NslmuoStw","POUYSciuWz","F6PT2ZuDtD","fcJOyF6PT2",
+"oQ87raDGtS","s47866AFT0","O3iyQBCxeC","0YAGHQnJ1S","HzZT8KZamH","GSQwjAIYUu","blLA9EdBKc","mX2GE7hyVv","1LB1Ldjsrv","yvOMIlpF6W",
+"fcJOycQOnv","oGu6xJkzUn","CqqaDlCMxy","ydG8UVerEA","BGaQY1LB1L","dpe1v14FLR","iqv4kjSjS3","lCMxyRmDcr","I7p2aMkgy8","SbRYyazIWp",
+"tuDySjS1aj","HzZT8jtn0X","VerEAGSQwj","AgJHQaFFss","4dEz6ZuDtD","FNYIMjiVBP","FVMxoQssNC","zQt6Qru4UG","rhl0JuJScX","iqv4kCxVEf",
+"JRJQBhYBCK","6q6L9RpBQm","yluBxgtCA5","Mm8siksJby","uLtKsVIlwP","a00b5VjCZq","StlDJCK5W7","mz8gxvkCHH","VBjhzK20wK","IjTwPJIqXi",
+"ciuWzn1pmO","UlU3MfcwDa","CIShGl83Ud","m4bxUvLsmS","zqH0WdhSuH","WreyPMm8si","64s8NhSSvQ","FjHXRWMiS3","48cHLQChxs","KZamHjfREu",
+"0PktIZ4I1v","djsrvI7p2a","h1zcHYf2Ec","jtn0XtlILt","wDajXMmsIo","WPmlx0MR5X","zmLYDpmeCd","5drc6gIYvE","zqH0WlkMUA","MojnPTa8f6",
+"AIYUu64s8N","IRh48uN6r3","FNYIMiB08l","FwEJzFcWrW","gIYvEyluBx","dQ586MezSW","RBhp08xEKz","FxX9qRzaZA","VNCPdK4GS8","aez9yQClRL",
+"W3VFHlkMUA","rKDLJs4786","Q6hMCdmoS7","BFkb8suY4x","s7Mxk8TxD7","POUYSMK07Y","yEfy9X6Pin","64s8NQ6Lix","euZA5ZzJHW","xXTI4MojnP",
+"Chuy3WMiS3","Yw2oUpAhR1","VNCPd5Mg9r","GrDg7aDGtS","ECMvUQYxC0","Qworu0Kyfs","d85a9VBjhz","JKWYREdBKc","WPmlxPYBf4","kB5nP9eoRc",
+"Uvlv4v1Hln","sx5GlFFDui","n1pmOVLTy6","S2DfuBGaQY","CxVEfQClRL","Yh1hFDcpWB","LbRTHqaofN","hYBCKM3zXL","ZJTXHo8Uyd","gIYvEVjCZq",
+"tAOsrtvdkD","gdQsSuAWyp","TXQ0ZBpYhV","W7cTsLbRTH","1LB1LzQt6Q","RzaZA7fKYU","HP433ni2v1","29QAzMkgy8","24ARFuN6r3","lsQGovLsmS",
+"prNT6W3VFH","1j5L89rlg9","brhlQX6Pin","SmGzvuZPqg","Fhtgly94nw","XflUq55rfB","2NslmDLhzM","WPmlxNAFuw","Ss0ZuzQt6Q","lkMUAYh1hF",
+"Cfgr3AmdQd","RmDcrjeskS","mz8gxVprf2","M3zXLDG4sT","zY1GYCNHmv","Uvlv4lm0pD","5Drn0FjHXR","MaJQspvgjS","uPX7GThjNn","RmDcrUvlv4",
+"LDk6f7lUXZ","qUJMd9eoRc","8xEKz9iGoT","KZamHlj07Q","IjTwPciuWz","dmoS7kB5nP","gdQsSnFqik","rhl0Jdjsrv","DLhzM9y4lw","07n1cHfyNQ",
+"yluBxZhwG1","t98iWIBe8k","RzaZA7ku1p","ECMvUk85Ae","RzaZAQChxs","7Ow5CXyPZN","tl72WlweGy","ThjNnCxVEf","0MR5XJIqXi","AXpwEQChxs",
+"8xEKz8U2nU","9rlg9zbIYY","WMiS3RkQke","FhtglUmaEv","AIYUutaOXK","HP433WDVWJ","jS1ajzHF1q","9rlg9LDk6f","Cfgr3MojnP","B3qemWmadA",
+"J2mQiogLgc","QnJ1Szz4ZU","1v5hH618Di","14FLROxWIH","GXdoHgf8rI","EoToPYf2Ec","a00b5K20wK","B3qemFNYIM","pFrrl9rlg9","Yw2oUyvOMI",
+"ru4UG2Nslm","OUqFMni2v1","qUJMdMK07Y","SmGzvJXljW","TXQ0ZYOfrY","QssNC5IhmG","LbRTHS77LH","TXQ0ZMm8si","FVMxoKASQ8","iqv4kAIYUu",
+"s4786RkQke","i7WMQJRJQB","GXdoHDLhzM","jS1aj7fKYU","Waim68RCUA","NhXduHzZT8","BCxeCW7cTs","mX2GEydG8U","LDk6fyEfy9","CK5W7SWfou",
+"QWxoTK20wK","k85AeDz1R3","I7p2atl72W","jeskSuN6r3","QbxXc45cIH","AIYUus93Ml","5nmWvatef2","BpYhVbrhlQ","DcpWBAgJHQ","Oz8yZx3LDe",
+"aL6AJ48cHL","5nmWvL7cGc","9XyT9P6bcg","prNT6FjHXR","uLtKsMojnP","lj07QEdBKc","uN6r3oGu6x","8xEKzgIYvE","CxVEfJRJQB","XyPZNguMb8",
+"xciqpGv3Fq","Nxx9Vpv0i7","CqqaDrhl0J","Y1mC0M6qcG","wDajX9GXkX","GrDg7x3LDe","b29RJCqqaD","tAOsrlj07Q","djsrvMojnP","VIlwPo8Uyd",
+"Y1mC0GrDg7","Uvlv4aFFss","euZA55ZaEz","lXFOBru4UG","FPfSEUlU3M","ZUnqtQworu","ZUnqtRBhp0","uPX7GTCgPp","Yh1hF55rfB","yvOMI8FmFH",
+"5nmWvsqVrf","lXFOBJIqXi","7fKYUKr8ys","MGlTFHP433","jtn0XtvdkD","VjCZqatef2","uLtKsgtCA5","sqVrfQYxC0","DG4sTSs0Zu","qUJMdoGu6x",
+"F6PT2LewvM","Dz1R3Oz8yZ","jiVBPK20wK","FwEJzx3LDe","a00b52ZHdk","1j5L8lkMUA","Z4I1vEdBKc","o8UydKsjRK","55rfBhE1Ql","x3LDeBCxeC",
+"WPmlxsqVrf","m4bxUhUTw7","yofH314FLR","uZPqg64s8N","BFkb8Yh1hF","uAWypFxX9q","RkQkeWaim6","qUJMd7ku1p","5Drn0CK5W7","RmDcr2Yz7E",
+"C2IrcxReec","qaofNokgRi","QWxoTsx5Gl","MmsIoJJs5m","yluBxlH1kt","45cIHnnP8o","RBhp0qQxHP","faHirprNT6","lkMUAiKqhr","M6qcGgtCA5",
+"iqv4kix74r","jSjS3uQIcz","tuDySNAFuw","fmIK1B3qem","n8pJ907n1c","HP433fmIK1","In3NSnFqik","lkMUA5iGN5","xReec3otm6","HlUbFzqH0W",
+"ix74ruN6r3","G1RhS0YAGH","5IhmGsqVrf","M3zXL618Di","Ta8f6JIqXi","ZhwG1CxVEf","guMb8hE1Ql","uPX7GdmoS7","0h1b1ogLgc","fqypyNAFuw",
+"o8UydDLhzM","VLTy6uZPqg","soy9tMezSW","Mm8siQClRL","1v5hHW7cTs","GSQwjKASQ8","uTacx9XyT9","VBjhzZv7z0","EdBKc0BmCy","hSSvQgf8rI",
+"Yw2oUzY1GY","FhtglXyPZN","rhl0JW3VFH","yEfy9dmoS7","CNHmvs7Mxk","ydG8UFLsph","jiVBPt59lR","a00b5Mkgy8","tvdkDjfREu","ZuDtDFGzgp",
+"QbxXcpWiOs","0PktId85a9","piJSklm0pD","9eoRcfcwDa","Gv3Fq8xEKz","fcJOyJkzUn","aL6AJZzJHW","YOfrYmz8gx","ZuDtDNhXdu","GWqqXwiHrZ",
+"9rlg9tuDyS","Gv3FqQnJ1S","tvdkDO3iyQ","aL6AJWDVWJ","t59lRCxVEf","lweGyOxWIH","QClRL8TxD7","hi5X7Kr8ys","D6rByzY1GY","0PktIbrhlQ",
+"MGlTFMK07Y","ThjNnuoStw","LewvMdpe1v","ZJTXH16lHc","uTacxSmGzv","s4786uoStw","ciuWzTwano","GrDg7Chuy3","64s8NOUqFM","iB08lMmKGJ",
+"fmIK1OUqFM","lm0pDRmDcr","azIWpVerEA","lweGyGXdoH","t59lRNOHsz","Mm8siru4UG","S2DfujSjS3","AXpwECqqaD","Chuy3CxVEf","7fKYUbrhlQ",
+"lweGyD6rBy","7X3uy8cVD3","lViBvprNT6","2TRI7L7cGc","AOgEe0h1b1","pmeCdRzaZA","Ta8f6POUYS","TwanoLDk6f","S2DfugtCA5","pT8wuJXljW",
+"QworuhE1Ql","Yf2EcxReec","FPfSEFLsph","jeskSyvOMI","RBhp0pFrrl","xciqpoVQp6","okgRis4786","MezSWs93Ml","uAWypoGu6x","dpe1vFhtgl",
+"HP4332TRI7","AIYUuIjTwP","ulk419y4lw","GSQwjpT8wu","48cHLK4GS8","IRh48EOE1o","FcWrWnlaBy","HRxd80ao3l","0BmCyxciqp","faHiryvOMI",
+"JXljW0MR5X","M3zXLSbRYy","pFrrlIjTwP","xReec2ZHdk","yofH3POUYS","Dz1R3s93Ml","soy9tWreyP","tvdkDAmdQd","4QMc9Mm8si","vOqCEvLsmS",
+"8hJdttvdkD","mX2GElsQGo","AkKTkjiVBP","POUYSaFFss","oGu6xuvf7A","GWqqXWreyP","faHirzY1GY","okgRiciuWz","IBe8kQ6hMC","pvgjSlkMUA",
+"gjUTu5Mg9r","EOE1oMmKGJ","v1Hlne6e4z","Cp3mZQ6Lix","FNYIMTCgPp","cQOnvjzUqR","i3pydjtn0X","x3LDed7vjM","0Wr5yyEfy9","CK5W7hi5X7",
+"WmadAni2v1","pT8wuatef2","7fsYMaFFss","pmeCduZPqg","JXljW0PktI","Ta8f607n1c","BCxeClViBv","i3pydCIShG","ZUnqtHfyNQ","gjUTuQ6Lix",
+"QYxC0ogLgc","zFgtBThjNn","cmXIXRsQUq","hSSvQW3VFH","M3zXLVBjhz","1v5hHOUqFM","b29RJfcwDa","KsjRK0h1b1","1j5L8e6e4z","WaWsvzFgtB",
+"JkzUnMmsIo","MaJQsmX2GE","FwEJzlkMUA","FLsphzHF1q","HzZT8aL6AJ","nFqik55rfB","Yf2EcuTacx","ogLgcMmsIo","DQimpbrhlQ","6AFT0qUJMd",
+"tlILtyEfy9","jzUqRYf2Ec","cQOnvt98iW","i3pyd5ZaEz","7fsYMdhSuH","JkzUnIKxdL","MmsIoQ6hMC","JKWYRs4786","ulk41FwEJz","hE1QlB3qem",
+"ZhwG1yEfy9","5VZjSpv0i7","In3NSgjUTu","W7cTsHzZT8","CqqaDVLTy6","Q6hMCsuY4x","ZUnqtnFqik","nnP8oDG4sT","In3NSBFkb8","brhlQbrhlQ",
+"lm0pDt59lR","uTacxRxrsm","v8yFNyofH3","WreyPBGaQY","WDVWJ0YAGH","ECMvUqaofN","FhtglJIqXi","AIYUuYjB9t","jSjS3F6PT2","gdQsSMmsIo",
+"NAFuwFNYIM","dmoS7Dz1R3","EdBKc9XyT9","AOgEecShY2","jzUqRx3LDe","Kr8yspv0i7","nFqikVprf2","Cfgr3Rxrsm","I7p2aM6qcG","VerEA9iGoT",
+"Ss0Zu45cIH","qQxHPjSjS3","Gv3FqDcpWB","NAFuwIBe8k","a00b5RmDcr","StlDJpWiOs","NAFuwOHaBz","XflUqfFDrJ","5VZjS5Mg9r","tlILth1zcH",
+"2hEEUZv7z0","5ZaEz2Nslm","uAWyp8RCUA","WmadA8cVD3","Zv7z0QClRL","faHirvOqCE","UmaEv55rfB","v8yFNZhwG1","tAOsrbgJAz","lpF6WStlDJ",
+"iKqhrTwano","VLTy6ZJTXH","P6bcgn8pJ9","5IhmGX6Pin","jfREupFrrl","2NslmlsQGo","fFDrJStlDJ","Y1mC0DG4sT","uupzkzHF1q","ZUnqtC2Irc",
+"9XyT98FmFH","B3qemlCMxy","QworuRxrsm","uN6r3ix74r","G1RhSIBe8k","FGzgp9y4lw","VjCZqWaWsv","TXQ0ZiKqhr","4QMc92hEEU","Q6hMCCxVEf",
+"RmDcrB3qem","brhlQHfyNQ","M3zXLThjNn","0h1b1gdQsS","lpF6WoGu6x","FxX9quN6r3","cL0aERmDcr","faHirStlDJ","s4786JIqXi","qaofN5Mg9r",
+"QYxC09rlg9","FxX9qEoToP","tl72WlkMUA","ReKEWgtCA5","KASQ8kZANm","Q6hMCxReec","EdBKcMGlTF","s93MlfcwDa","M6qcG5nmWv","lCMxyDcpWB",
+"WmadATXQ0Z","AOgEehYBCK","S2Dfu7Ow5C","pWiOsqaofN","EOE1ouPX7G","yofH3yofH3","uPX7GjeskS","lkMUAfaHir","0KyfsbgJAz","uAWypGSQwj",
+"n8pJ9ZhwG1","fmIK1Chuy3","HfyNQWreyP","tvdkD8cVD3","WMiS3lViBv","Vprf2W7cTs","uLtKsgf8rI","v2eC3StlDJ","i7WMQSmGzv","GXdoHNxx9V",
+"G1RhSLDk6f","GXdoHCxVEf","CdyBVv2eC3","t98iWfqypy","FnPFBEoToP","jfREu6AFT0","s4786ix74r","8hJdtFcWrW","tAOsrrz7Ut","fqypypWiOs",
+"uAWypvkCHH","pmeCd8xEKz","45cIHNAFuw","YOfrYGrDg7","CNHmvlweGy","tuDySOxWIH","Cfgr3gf8rI","lsQGov1Hln","UlU3MHzZT8","W7cTs8hJdt",
+"RACuj1j5L8","9GXkXjzUqR","lm0pDBpYhV","BCxeCCfgr3","FhtglqaofN","16lHc0MR5X","FFDuiVNCPd","FVMxom4bxU","zQt6Qrhl0J","aDGtSqUJMd",
+"8hJdtyvOMI","fLNg8W7cTs","HfyNQYh1hF","Waim6dpe1v","s7MxkHfyNQ","GSQwjG1RhS","Q6hMCAOgEe","2Yz7E8hJdt","MojnP4W0Tl","AXpwEoQ87r",
+"tlILthe9IA","1j5L8yluBx","kB5nP7X3uy","5ZaEz7fsYM","OUqFMyEfy9","45cIH618Di","azIWpStlDJ","TCgPpzqH0W","nnP8oXyPZN","atef2fqypy",
+"GXdoH45cIH","K4GS8blLA9","pv0i7Q6hMC","uupzkHlUbF","lH1ktVNCPd","piJSkBGaQY","XyPZNWreyP","IKxdLVLTy6","gjUTua00b5","zQt6Q5Drn0",
+"dpe1vsqVrf","2DREsoGu6x","lXFOBYf2Ec","tvdkDuQIcz","dpe1vpiJSk","EoToPQnJ1S","VLTy6lpF6W","rz7Ut4W0Tl","n8pJ9Yf2Ec","5Nammx3LDe",
+"9eoRcS2Dfu","8FmFHSjskQ","cL0aEVIlwP","YOfrYG1RhS","tuDyShYBCK","FjHXR8RCUA","BpYhV7hyVv","GWqqXFhtgl","M6qcGFcWrW","Q6LixdhSuH",
+"O3iyQC2Irc","LDk6fChuy3","JkzUns93Ml","G1RhSQChxs","AXpwEIBe8k","jeskSChuy3","rhl0JBGaQY","VjCZqZuDtD","2DREs4W0Tl","5drc6QWxoT",
+"zz4ZUprNT6","1LB1Le6e4z","o8Uydv8yFN","GrDg7O3iyQ","FPfSEQYxC0","RxrsmI7p2a","8TxD7S77LH","WDVWJjS1aj","ni2v1Zv7z0","uPX7GQssNC",
+"vOqCEWPmlx","HP433uTacx","dhSuHjeskS","IBe8kzQt6Q","uAWypnnP8o","zqH0WkB5nP","9XyT9dhSuH","l83UdOHaBz","sqVrfciuWz","8RCUAxXTI4",
+"FcWrWhE1Ql","rhl0JLDk6f","CdyBVqaofN","Q6hMCAIYUu","K20wKK4GS8","y94nwdpe1v","Kr8ys0Kyfs","v2eC3OUYuF","i7WMQ0MR5X","7fKYUCxVEf",
+"FjHXRMK07Y","gIYvEVLTy6","FnPFB7ku1p","2Nslm0BmCy","LDk6fksJby","h1zcHjzUqR","JRJQBxciqp","fqypyIRh48","2Yz7Ev8yFN","8FmFHMGlTF",
+"5iGN5FxX9q","1v5hHOHaBz","2TRI7Nxx9V","8U2nUblLA9","uZPqgKZamH","FFDuiPOUYS","1LB1LGWqqX","29QAzFNYIM","kZANmGrDg7","zqH0WJkzUn",
+"lsQGo0YAGH","0MR5XpmeCd","Mkgy8gjUTu","D6rByFjHXR","FjHXR5iGN5","gf8rI45cIH","d85a9jeskS","X6PinZhwG1","LewvMWDVWJ","ThjNnYOfrY",
+"I7p2aYw2oU","07n1cYOfrY","Yf2Eclj07Q","0h1b18xEKz","AOgEelweGy","5Drn0hE1Ql","fFDrJJRJQB","X6PinHfyNQ","FGzgpjiVBP","MojnPI7p2a",
+"djsrvFnPFB","brhlQGSQwj","BCxeCG1RhS","0KyfsReKEW","Kr8yszqH0W","sx5GlzY1GY","hYBCKVLTy6","uPX7GxReec","0PktIuJScX","a00b5RACuj",
+"5IhmGW3VFH","2ZHdkpFrrl","ix74rjtn0X","0PktI7fKYU","gtCA5IRh48","HP4332hEEU","ru4UGzmLYD","OUYuF2TRI7","0KyfsMmsIo","he9IAX6Pin",
+"a00b5ciuWz","QworuUvlv4","9GXkXMK07Y","YjB9tKZamH","cQOnv2Nslm","uvf7AQYxC0","BGaQYS2Dfu","ZJTXHDz1R3","JJs5mMezSW","fFDrJoVQp6",
+"lpF6WXflUq","45cIHQworu","NhXduOUqFM","uLtKsZv7z0","C2IrcGv3Fq","jtn0Xfqypy","Yh1hFsx5Gl","DLhzMCfgr3","LbRTHPYBf4","uvf7A2TRI7",
+"8FmFHKASQ8","POUYS0Kyfs","Fhtgle6e4z","IjTwPQChxs","xReecNxx9V","No0Qbaez9y","FFDuiWaim6","24ARFvLsmS","F6PT26AFT0","tl72WoVQp6",
+"prNT6vkCHH","Yh1hFKASQ8","FxX9qQworu","i7WMQDcpWB","BpYhV5nmWv","UmaEvoVQp6","HRxd84dEz6","4QMc9s4786","aFFssAXpwE","pT8wud85a9",
+"8hJdtIn3NS","gdQsSgtCA5","8TxD7YOfrY","1v5hHPb1pa","FjHXRHfyNQ","AkKTktvdkD","oQ87rRACuj","Kr8yszFgtB","uLtKsNo0Qb","ZzJHWd85a9",
+"jtn0XogLgc","M3zXL9XyT9","7fKYUjfREu","pv0i7uZPqg","48cHL5Namm","uJScXpv0i7","RzaZAzQt6Q","MmsIoksJby","7lUXZM6qcG","KsjRKQ6hMC",
+"suY4xRzaZA","0MR5XfcJOy","JIqXiBGaQY","WMiS36AFT0","jSjS3FxX9q","NOHszQChxs","Cp3mZatef2","x3LDe2DREs","X6PinK4GS8","SjskQK20wK",
+"618DiogLgc","64s8NECMvU","bZLvSfcJOy","lj07Q7lUXZ","ydG8UFPfSE","5iGN5gdQsS","Pb1pauLtKs","hYBCKHzZT8","4W0TlzFgtB","pAhR1TCgPp",
+"cmXIX4QMc9","blLA9i3pyd","14FLRLDk6f","9XyT9vLsmS","7fKYUSbRYy","7fsYMoVQp6","Yw2oUgjUTu","14FLRzz4ZU","wDajXZzJHW","WaWsvcShY2",
+"HP433Zv7z0","BFkb864s8N","fLNg80YAGH","W7cTs0YAGH","3weIFI7p2a","Cp3mZRsQUq","cL0aE9eoRc","FNYIM7hyVv","QYxC0WDVWJ","zHF1qBFkb8",
+"KsjRKrhl0J","1LB1LoGu6x","taOXKM3zXL","FcWrWhUTw7","NAFuwdmoS7","RmDcrpT8wu","lCMxyNxx9V","TXQ0ZL7cGc","9rlg9cmXIX","yluBxaL6AJ",
+"LDk6fnnP8o","AgJHQZhwG1","pv0i7vLsmS","lj07QtlILt","lpF6W8hJdt","VNCPduN6r3","FPfSEYjB9t","GWqqXBpYhV","MGlTFtlILt","n8pJ9BGaQY",
+"yvOMIHfyNQ","lkMUAS77LH","qaofNQnJ1S","RmDcrpv0i7","7lUXZL7cGc","AmdQdNcICA","jzUqRTCgPp","BGaQYeuZA5","mX2GEyluBx","AgJHQCIShG",
+"HRxd8P6bcg","qaofNl83Ud","IBe8kTwano","1LB1Li7WMQ","4W0Tlv2eC3","618Di0YAGH","ReKEWtaOXK","faHirnlaBy","tlILtpFrrl","Mkgy8wiHrZ",
+"i7WMQzz4ZU","ix74rKr8ys","tuDySs7Mxk","fmIK1he9IA","tuDySAgJHQ","ogLgcaez9y","hi5X755rfB","Z4I1vv2eC3","zHF1qMojnP","Oz8yZ5IhmG",
+"fcwDalH1kt","OUYuFHzZT8","1v5hHyEfy9","oGu6xvkCHH","zmLYDo8Uyd","QYxC0wiHrZ","oQ87ryToGW","lj07Q0MR5X","x3LDeK4GS8","JJs5mQWxoT",
+"RkQkeazIWp","FwEJzvLsmS","CIShGwiHrZ","W7cTsQworu","2Nslmtl72W","i7WMQSs0Zu","aDGtSyluBx","CqqaDtlILt","ZuDtDI7p2a","fqypy6q6L9",
+"FPfSE2TRI7","U3yw5okgRi","DQimpJkzUn","FNYIMCIShG","MezSWuQIcz","8U2nUNOHsz","RBhp0soy9t","0h1b1piJSk","rKDLJaFFss","nnP8oCK5W7",
+"wDajX8RCUA","618DiOxWIH","WreyPi7WMQ","45cIHFxX9q","RpBQmMaJQs","pvgjSDG4sT","lpF6WQWxoT","In3NSAOgEe","uLtKstjQxs","MaJQs2hEEU",
+"WDVWJuN6r3","QnJ1Sb29RJ","Q6hMCzmLYD","zqH0Wv2eC3","aez9y7ku1p","FGzgpqUJMd","I7p2arz7Ut","ru4UGzY1GY","4W0TlBFkb8","2Yz7ERzaZA",
+"F6PT2vOqCE","o8UydLewvM","lH1kt1v5hH","X6PinuJScX","tuDySCK5W7","tjQxsBbwgA","CqqaDlsQGo","Vprf2AIYUu","uoStwyToGW","gtCA5CNHmv",
+"OUqFMtlILt","aDGtSX6Pin","taOXKRsQUq","Cp3mZXyPZN","he9IAQworu","aL6AJpT8wu","MmsIovkCHH","BGaQYyvOMI","FFDuiCxVEf","BpYhVYw2oU",
+"zQt6QXyPZN","U3yw5Zv7z0","BbwgArKDLJ","jiVBPBbwgA","ydG8URmDcr","AOgEeMaJQs","fmIK15Drn0","KZamH0MR5X","hSSvQjSjS3","lViBvtaOXK",
+"jiVBPeuZA5","xciqpVjCZq","7X3uyWaim6","TwanoUlU3M","0Wr5yECMvU","S2DfulXFOB","4W0TlFcWrW","uPX7GFnPFB","6AFT0fcJOy","ZJTXHDG4sT",
+"WMiS3HRxd8","vOqCE2hEEU","v1Hln2hEEU","aL6AJuZPqg","Chuy31v5hH","t59lRru4UG","CxVEfBFkb8","W7cTsx3LDe","Mkgy87lUXZ","gdQsS7hyVv",
+"XyPZNJJs5m","FGzgpcQOnv","oGu6xyToGW","WmadAbZLvS","8cVD3OHaBz","No0Qbd85a9","JIqXis93Ml","8xEKzMGlTF","JXljW9GXkX","tvdkDhi5X7",
+"9iGoTpmeCd","K4GS8jiVBP","Y1mC0Z4I1v","uQIczblLA9","RkQkeLDk6f","cmXIXK4GS8","gtCA52Nslm","IKxdLPYBf4","zFgtBWaim6","XyPZNCdyBV",
+"suY4xnlaBy","he9IAlweGy","uAWypxciqp","ni2v1fFDrJ","mX2GEe6e4z","tjQxsZJTXH","pWiOsru4UG","K20wKJJs5m","X6Pin14FLR","oQ87rtvdkD",
+"Ss0ZuCK5W7","lj07QK4GS8","VLTy6fqypy","ogLgc48cHL","VLTy61j5L8","pT8wuC2Irc","pmeCdYOfrY","3weIF5drc6","kZANmChuy3","ulk41G1RhS",
+"5nmWv0BmCy","55rfBi7WMQ","8cVD3VerEA","RkQkeLewvM","Kr8ysFPfSE","YjB9tcL0aE","0h1b1POUYS","uPX7GjiVBP","RmDcr0h1b1","BGaQYpvgjS",
+"kZANmwiHrZ","16lHcfqypy","oGu6xYf2Ec","hE1QlO3iyQ","HfyNQOxWIH","taOXKzbIYY","kZANmOHaBz","qQxHPVjCZq","xReec5IhmG","oGu6xfLNg8",
+"kB5nP7ku1p","CqqaDjSjS3","gtCA5n1pmO","uvf7AW7cTs","o8UydMmsIo","dQ586lj07Q","07n1cvOqCE","7X3uy29QAz","EoToP8TxD7","YjB9tMojnP",
+"3otm6bgJAz","VerEARkQke","lsQGojfREu","UmaEvRACuj","64s8NCp3mZ","qQxHPQYxC0","o8UyduAWyp","jiVBPQChxs","pWiOsQClRL","sqVrf2Yz7E",
+"rz7UtMaJQs","4QMc95Drn0","s7MxkVBjhz","0ao3lAOgEe","7ku1pydG8U","gdQsSlm0pD","n1pmOpvgjS","OxWIH580YD","cQOnvpv0i7","uoStwHlUbF",
+"rKDLJdmoS7","VBjhzrz7Ut","jSjS3ix74r","pAhR1QbxXc","blLA9iqv4k","FPfSEbrhlQ","MGlTFQClRL","M6qcGqaofN","MGlTF0YAGH","hUTw7EdBKc",
+"ix74ryToGW","oVQp6J2mQi","P6bcg7lUXZ","7fKYUqUJMd","fqypyiB08l","EOE1otaOXK","BGaQYy94nw","29QAzK20wK","Mkgy8FNYIM","cL0aEi3pyd",
+"EdBKcU3yw5","4QMc9AmdQd","1v5hHgjUTu","JJs5md7vjM","No0QbLbRTH","BFkb8CxVEf","5IhmGAkKTk","zbIYYpiJSk","ru4UG0YAGH","fqypy9GXkX",
+"16lHc6AFT0","lH1ktM6qcG","KsjRKMm8si","zz4ZURmDcr","a00b5tlILt","ZzJHW3weIF","CNHmvHP433","8cVD3BFkb8","RmDcrrhl0J","FPfSEsx5Gl",
+"d85a9CqqaD","P6bcgd85a9","HRxd8AkKTk","Zv7z0Yh1hF","VLTy6fLNg8","dpe1vGWqqX","o8UydFjHXR","ReKEWW7cTs","hYBCKECMvU","YOfrYXflUq",
+"oQ87rsqVrf","RmDcrzY1GY","M3zXL7Ow5C","FVMxolsQGo","1LB1L0h1b1","Mkgy85nmWv","aez9yguMb8","xReecblLA9","uTacxh1zcH","4dEz6M6qcG",
+"iwzGkHlUbF","zz4ZUCK5W7","GXdoHjzUqR","MmsIoOHaBz","tjQxsAOgEe","JRJQBMK07Y","ydG8USWfou","zQt6QJXljW","uLtKsIKxdL","VIlwP5VZjS",
+"jtn0XuPX7G","W7cTsBbwgA","pAhR1IjTwP","NcICAaDGtS","VBjhzHlUbF","h1zcHNAFuw","0Wr5yhUTw7","GSQwjokgRi","EOE1o2DREs","7fKYUIKxdL",
+"v8yFNtvdkD","l83UdBbwgA","0PktIChuy3","qaofNzQt6Q","MezSW2hEEU","aDGtSyEfy9","vkCHHOHaBz","YjB9t7ku1p","zQt6QhYBCK","W3VFHAkKTk",
+"e6e4zsoy9t","guMb8Z4I1v","Cfgr38RCUA","2hEEUW7cTs","t98iWUlU3M","RBhp0i7WMQ","WmadAtaOXK","KZamHRpBQm","UmaEv7hyVv","CdyBVSWfou",
+"1LB1Ll83Ud","In3NSlViBv","nlaBy8TxD7","kB5nPzY1GY","uQIczyEfy9","1v5hHo8Uyd","ReKEW0YAGH","s93MlYh1hF","9GXkXgf8rI","piJSkuJScX",
+"vLsmSpvgjS","dQ586SmGzv","zz4ZUuPX7G","lViBvIjTwP","2Nslm9XyT9","7lUXZ2ZHdk","MojnPAXpwE","t59lRlkMUA","14FLRHRxd8","jSjS3atef2",
+"d85a9kB5nP","RzaZAU3yw5","zFgtBX6Pin","8cVD3b29RJ","b29RJIn3NS","bZLvS0YAGH","6q6L9ydG8U","dhSuH4W0Tl","bgJAzQChxs","VerEAAmdQd",
+"yvOMIsqVrf","Uvlv4JXljW","2NslmiB08l","aez9yksJby","zFgtBEdBKc","9XyT95Drn0","JRJQBFhtgl","7hyVvVIlwP","AmdQdThjNn","MmsIodjsrv",
+"QClRLpvgjS","hUTw7vkCHH","In3NSgdQsS","X6PiniwzGk","XyPZNWaim6","5VZjSZUnqt","X6PinYOfrY","JKWYRJKWYR","AIYUuOUYuF","5Drn0ciuWz",
+"1LB1LDG4sT","9XyT9gIYvE","ReKEWFPfSE","7fsYMTCgPp","v8yFNECMvU","Q6Lix29QAz","iKqhrpFrrl","mX2GEOz8yZ","M3zXLlj07Q","WaWsvYOfrY",
+"qQxHPMm8si","tl72WiwzGk","K20wKAXpwE","55rfBSbRYy","KZamHgjUTu","JIqXiSjskQ","4W0TlRACuj","8xEKzyluBx","cShY2yofH3","FxX9qlXFOB",
+"VerEAzHF1q","8U2nUMmKGJ","faHirFjHXR","29QAzKr8ys","RzaZA4QMc9","0Kyfs9XyT9","BbwgACIShG","2ZHdkJJs5m","pWiOsMojnP","jzUqRHzZT8",
+"AXpwEUmaEv","BGaQYWPmlx","sx5GlUlU3M","y94nwaL6AJ","iB08lzQt6Q","ni2v1GWqqX","ciuWzeuZA5","LewvMYOfrY","s93MlqQxHP","RACuj3otm6",
+"W3VFHCp3mZ","rhl0Jm4bxU","fmIK1F6PT2","ix74rWaim6","MojnPLewvM","LbRTHFxX9q","Waim6nnP8o","gjUTuokgRi","lkMUA0PktI","0Wr5ygIYvE",
+"FwEJzB3qem","7Ow5CUvlv4","MmKGJlViBv","Rxrsm64s8N","FjHXR7X3uy","WDVWJsx5Gl","pWiOsn1pmO","i3pydtaOXK","Ss0ZuGXdoH","S77LHL7cGc",
+"JRJQB14FLR","brhlQ24ARF","OUqFMRsQUq","oQ87rcmXIX","OHaBz55rfB","NAFuwxXTI4","UmaEvsoy9t","ZuDtDBCxeC","v8yFN55rfB","OxWIHCdyBV",
+"yEfy9zFgtB","hYBCKpmeCd","cShY26AFT0","uN6r3lsQGo","FcWrWQChxs","LewvM5Mg9r","VjCZqVerEA","LDk6fbZLvS","qUJMd9y4lw","C2IrcYOfrY",
+"K4GS8FVMxo","aFFss5Drn0","oQ87rciuWz","8xEKzlViBv","JJs5mDz1R3","SWfouFjHXR","rKDLJQssNC","b29RJ1j5L8","RxrsmmX2GE","9rlg9taOXK",
+"1v5hHSmGzv","x3LDeTa8f6","KsjRKIBe8k","v1HlnwDajX","fFDrJuAWyp","ZuDtD24ARF","cShY2lViBv","Zv7z00h1b1","hYBCKDcpWB","yofH3W3VFH",
+"CIShG5Namm","a00b5FjHXR","rhl0JBbwgA","RkQkeJ2mQi","YjB9tIBe8k","KZamHh1zcH","uvf7ACxVEf","0PktIYOfrY","FFDui2Nslm","gtCA5DcpWB",
+"GSQwjfFDrJ","i3pydQ6hMC","JKWYRAIYUu","5VZjSMkgy8","VLTy6uoStw","lH1ktuvf7A","pv0i7CqqaD","tvdkDOz8yZ","rhl0JlsQGo","djsrvJJs5m",
+"4QMc98U2nU","PYBf4ZuDtD","uupzk07n1c","gjUTuzHF1q","yToGWzqH0W","tAOsrt98iW","07n1c9GXkX","QworujS1aj","0YAGH2Yz7E","8FmFHJKWYR",
+"8RCUAksJby","soy9t1j5L8","qUJMdFjHXR","Mkgy84W0Tl","HP433OUYuF","2TRI7yEfy9","rKDLJUvlv4","lj07QLewvM","B3qemBCxeC","5Nammiqv4k",
+"qaofNXflUq","JKWYR0ao3l","v2eC3FLsph","IRh48FFDui","fqypyeuZA5","GrDg72Nslm","P6bcgl83Ud","n1pmOIBe8k","oQ87rUvlv4","sx5GlGXdoH",
+"okgRim4bxU","k85Ae9XyT9","aez9yThjNn","nlaByCfgr3","yluBxn1pmO","2TRI7AXpwE","VNCPdNOHsz","2DREs580YD","Fhtgl9y4lw","XyPZNWMiS3",
+"XflUq1LB1L","mz8gxNxx9V","jtn0XRmDcr","No0Qbuupzk","zmLYDFwEJz","ZzJHW45cIH","KZamH1v5hH","jSjS3uZPqg","Kr8ysdQ586","hE1QlZv7z0",
+"0PktI4dEz6","djsrvWreyP","0BmCyFwEJz","BCxeCNhXdu","ThjNn8cVD3","IKxdLSjskQ","VIlwPpmeCd","AgJHQjtn0X","OxWIHIRh48","Waim6lweGy",
+"uoStwCqqaD","CNHmvtl72W","NAFuwfaHir","pAhR1S77LH","iqv4k7lUXZ","jtn0Xm4bxU","55rfB618Di","RkQkejzUqR","VjCZqOxWIH","gIYvEUvlv4",
+"QssNCzmLYD","8FmFHnnP8o","2Yz7E0PktI","CdyBVvLsmS","WDVWJnlaBy","FnPFBl83Ud","ogLgczqH0W","9rlg9580YD","CqqaDfqypy","cShY2AmdQd",
+"WPmlxIjTwP","580YDCqqaD","s4786YOfrY","zbIYYDG4sT","n8pJ93otm6","zHF1qatef2","J2mQihE1Ql","JkzUn8TxD7","t59lRcmXIX","uupzk8U2nU",
+"sqVrfgtCA5","fFDrJlCMxy","JJs5mBpYhV","FnPFBAOgEe","0h1b1s7Mxk","tvdkDQnJ1S","Yf2EcNAFuw","BpYhVjfREu","ZzJHWpv0i7","IRh48QWxoT",
+"618DiZv7z0","jS1ajMmKGJ","8U2nURACuj","tl72WCqqaD","zbIYYaDGtS","CK5W7WaWsv","gdQsSpT8wu","Yf2EcLewvM","QChxsJIqXi","HzZT8C2Irc",
+"lsQGoAkKTk","x3LDe5ZaEz","vOqCEAkKTk","i3pydIjTwP","pFrrl1LB1L","VBjhzjzUqR","WmadAKASQ8","24ARFCxVEf","bgJAzZuDtD","aez9yulk41",
+"580YDuoStw","LewvMgf8rI","QWxoTuN6r3","dQ586618Di","DG4sTDz1R3","FGzgpSmGzv","X6Pin9rlg9","K20wKZzJHW","SbRYySmGzv","wiHrZECMvU",
+"suY4xxReec","JIqXi0YAGH","7fKYUFLsph","lweGyvOqCE","OHaBzSmGzv","9GXkXhi5X7","QChxsQWxoT","Pb1pah1zcH","fqypyydG8U","KZamHm4bxU",
+"pFrrlzmLYD","DcpWBJKWYR","B3qem07n1c","ix74rNo0Qb","pAhR1m4bxU","Y1mC0M3zXL","Mm8sijfREu","sx5Glt59lR","fcwDah1zcH","Qworulm0pD",
+"lXFOBpiJSk","LDk6fPOUYS","Q6Lix0PktI","MK07YuJScX","FcWrWiwzGk","pFrrlRzaZA","M3zXLQssNC","0Wr5y2DREs","uPX7Gpv0i7","vkCHHsx5Gl",
+"MGlTFqQxHP","bZLvSBCxeC","ni2v1MmKGJ","QnJ1S5nmWv","ZUnqtuoStw","uJScX2Yz7E","AIYUuGrDg7","GXdoHlweGy","7hyVv3otm6","dmoS7fFDrJ",
+"GSQwjMojnP","cShY2o8Uyd","WmadAguMb8","4W0Tl8hJdt","n1pmO8U2nU","C2IrclCMxy","QWxoTCdyBV","ciuWzMGlTF","Mkgy8TCgPp","vLsmSsoy9t",
+"6q6L9aez9y","QbxXcFFDui","BFkb8vkCHH","uoStwfmIK1","uLtKs8cVD3","POUYSdmoS7","lsQGoSbRYy","jSjS329QAz","gtCA5kZANm","SjskQyluBx",
+"uZPqgSWfou","HRxd8VIlwP","sqVrflCMxy","Mkgy88FmFH","WmadAnnP8o","iKqhrRBhp0","8xEKzgtCA5","RpBQmdmoS7","aL6AJ6AFT0","uupzkgdQsS",
+"lj07QaL6AJ","VjCZqNhXdu","GrDg7dpe1v","RACujBCxeC","rz7UtOxWIH","2Yz7E0BmCy","dpe1vB3qem","gjUTu6q6L9","WDVWJWMiS3","DQimpm4bxU",
+"45cIH5iGN5","Chuy3aez9y","4W0Tl55rfB","55rfB45cIH","U3yw5jSjS3","BFkb85IhmG","yToGWPb1pa","zFgtBSWfou","YjB9thSSvQ","fFDrJnFqik",
+"1j5L8FnPFB","atef2fLNg8","v2eC34QMc9","xReeclkMUA","soy9tLbRTH","ZJTXHvLsmS","OUYuFCxVEf","XyPZNTXQ0Z","CdyBVMkgy8","JJs5mTXQ0Z",
+"lj07QfcJOy","fcJOycmXIX","QssNCgIYvE","a00b5CNHmv","VIlwPNOHsz","cL0aEChuy3","uAWyptjQxs","RBhp0nlaBy","M6qcGWreyP","7fsYMzmLYD",
+"WMiS3Zv7z0","d85a9tl72W","5Namm9GXkX","EdBKcfmIK1","EoToPuTacx","AXpwE8hJdt","UmaEviB08l","P6bcgD6rBy","9rlg9AXpwE","djsrvZJTXH",
+"AmdQdm4bxU","RsQUqk85Ae","lj07Q5VZjS","zHF1qHfyNQ","cL0aE5nmWv","FnPFBUvlv4","PYBf4lViBv","9GXkXulk41","nFqikGXdoH","lm0pDjiVBP",
+"IRh48yEfy9","MGlTFulk41","hE1QlnFqik","B3qemKr8ys","jfREuydG8U","9rlg9uLtKs","3otm65ZaEz","fcJOy5ZaEz","uPX7GHfyNQ","y94nw5Namm",
+"14FLRhE1Ql","ni2v1CxVEf","n8pJ9DcpWB","ZUnqtlm0pD","dmoS77Ow5C","qaofNzqH0W","D6rBycShY2","POUYSYh1hF","jiVBPydG8U","4dEz6JkzUn",
+"uoStwCfgr3","16lHcNxx9V","5iGN5ru4UG","QssNCTXQ0Z","KZamHS77LH","GXdoHaez9y","NOHszZ4I1v","JXljWMK07Y","JJs5mZzJHW","XyPZNSmGzv",
+"azIWpFNYIM","AgJHQcShY2","azIWprz7Ut","KASQ8Oz8yZ","FFDuinFqik","WMiS3Uvlv4","lkMUAAgJHQ","bgJAzRzaZA","hE1QlNcICA","Yw2oUuLtKs",
+"sx5Gl0Wr5y","uZPqg2Nslm","HlUbFFGzgp","POUYSYjB9t","zY1GYZJTXH","M3zXLDcpWB","VerEA9XyT9","0Wr5ylH1kt","jtn0XRxrsm","hSSvQ7fKYU",
+"8xEKzRkQke","CdyBVEoToP","gf8rIt59lR","9XyT9ru4UG","G1RhSqaofN","PYBf4VBjhz","zmLYDJJs5m","lweGye6e4z","qUJMdQ6Lix","qaofNJ2mQi",
+"L7cGcxXTI4","Mkgy8CdyBV","aFFsscQOnv","v2eC3ulk41","x3LDeFLsph","t98iW6AFT0","TXQ0Z55rfB","MojnP8hJdt","RBhp0No0Qb","WaWsvprNT6",
+"1v5hHWMiS3","OxWIHlsQGo","jeskSfFDrJ","QworuFLsph","24ARFQssNC","TCgPpPYBf4","tAOsr8U2nU","Gv3FqcShY2","HP433v1Hln","uPX7GvOqCE",
+"brhlQx3LDe","5ZaEzqUJMd","l83UdoVQp6","CqqaDk85Ae","9rlg9GXdoH","07n1cAmdQd","NOHsz55rfB","8U2nUDz1R3","7Ow5CNOHsz","BGaQYLbRTH",
+"S2DfuEdBKc","618DiksJby","v8yFNpAhR1","S2DfuAkKTk","Chuy3BFkb8","7fKYU8FmFH","xReecTwano","NcICAqUJMd","dhSuHReKEW","LDk6fqUJMd",
+"L7cGcJRJQB","MmsIo2ZHdk","lH1ktKsjRK","StlDJCqqaD","uN6r3yofH3","9rlg9s7Mxk","KZamHix74r","azIWpsoy9t","OUYuFazIWp","fFDrJi3pyd",
+"Uvlv40Wr5y","BFkb81v5hH","xReecyToGW","9iGoT0BmCy","DQimptAOsr","mX2GEtaOXK","zHF1qPb1pa","Ta8f6MezSW","ZzJHWRACuj","e6e4zbZLvS",
+"iwzGksx5Gl","5Mg9rgf8rI","qUJMdYh1hF","bgJAzrKDLJ","zY1GY5ZaEz","uPX7GrKDLJ","6q6L9SWfou","9eoRcJKWYR","2hEEUjfREu","Oz8yZhYBCK",
+"JRJQBSbRYy","n8pJ9cmXIX","yofH3618Di","uoStw6AFT0","RxrsmJIqXi","POUYS6AFT0","blLA9AIYUu","iqv4kokgRi","bgJAzM3zXL","Dz1R3SjskQ",
+"fqypyCK5W7","i7WMQ64s8N","580YDDG4sT","SWfousx5Gl","piJSkHfyNQ","VBjhzsqVrf","HlUbFIn3NS","LbRTHn8pJ9","t59lRBbwgA","Chuy3AmdQd",
+"soy9tlViBv","AOgEeQ6Lix","LbRTHX6Pin","uvf7AlCMxy","Vprf2dhSuH","RACujVprf2","NhXduhSSvQ","QbxXcogLgc","dQ5868FmFH","soy9tpvgjS",
+"8cVD3kZANm","5ZaEz5VZjS","SmGzvJIqXi","CNHmvX6Pin","0Kyfs580YD","zFgtBx3LDe","n1pmOblLA9","azIWp2Yz7E","sx5GliKqhr","X6PinaL6AJ",
+"AmdQd2hEEU","JKWYRogLgc","uvf7Atl72W","QssNCQssNC","StlDJx3LDe","ydG8UlsQGo","F6PT2rKDLJ","aDGtSDcpWB","14FLRSs0Zu","K20wKC2Irc",
+"CNHmvlCMxy","qUJMdtjQxs","cmXIXJIqXi","8RCUAs93Ml","Yf2EcsqVrf","TCgPpyEfy9","xciqp580YD","DG4sTv8yFN","WDVWJhi5X7","s93MlFPfSE",
+"jiVBPyluBx","UmaEv0Wr5y","gjUTuOHaBz","wDajXUl4a1","FFDuiZhwG1","LbRTHJ2mQi","8RCUAhSSvQ","VjCZqRxrsm","VerEA0YAGH","zbIYYAkKTk",
+"rhl0JCIShG","ksJbyEoToP","WPmlxcShY2","BpYhVReKEW","uZPqgogLgc","aDGtSfLNg8","Yh1hFFnPFB","gf8rIuvf7A","pmeCdMezSW","DLhzMzbIYY",
+"taOXKiB08l","DQimpt59lR","L7cGcnlaBy","dQ586pWiOs","7lUXZ14FLR","guMb8U3yw5","GWqqXUl4a1","uPX7GECMvU","MmKGJ4dEz6","RBhp0ciuWz",
+"nlaByblLA9","tl72Wn1pmO","RkQkeC2Irc","14FLRv2eC3","fcwDa6AFT0","pvgjS7lUXZ","zQt6QQClRL","gIYvE5Mg9r","580YDWaim6","Dz1R3m4bxU",
+"JXljWjSjS3","s7Mxktl72W","t59lRZUnqt","2Nslmuvf7A","CNHmv9y4lw","EdBKc7ku1p","QWxoTZUnqt","SmGzvVIlwP","IjTwPsx5Gl","ulk41RmDcr",
+"vOqCEix74r","UlU3MRACuj","OUYuF4W0Tl","RBhp0QssNC","iB08lFLsph","Kr8ysBFkb8","NOHszxXTI4","lXFOBbZLvS","v8yFNfLNg8","JRJQBdQ586",
+"xciqpJJs5m","QChxs2DREs","ReKEWPb1pa","Q6LixiwzGk","5IhmGCp3mZ","DLhzMvkCHH","uPX7Gzz4ZU","24ARF9GXkX","AIYUuAkKTk","prNT6fqypy",
+"Yh1hFVIlwP","580YDS2Dfu","B3qemtjQxs","jzUqR5iGN5","sx5GlzHF1q","WmadA7ku1p","FNYIMdjsrv","v8yFNBbwgA","580YDnnP8o","64s8NuPX7G",
+"UmaEvv1Hln","taOXKECMvU","QYxC0NAFuw","QbxXclsQGo","v2eC3rKDLJ","2NslmPb1pa","J2mQis93Ml","ReKEWSbRYy","1LB1L9iGoT","4dEz6580YD",
+"fmIK1uLtKs","ni2v1OUqFM","t59lR8xEKz","Mm8siJRJQB","nnP8oBFkb8","jiVBPO3iyQ","JXljW16lHc","jfREuKASQ8","jzUqRoQ87r","8cVD3QnJ1S",
+"s7Mxk0YAGH","blLA9VjCZq","pv0i7D6rBy","MaJQsUlU3M","QYxC0aez9y","yluBxgf8rI","VBjhz3weIF","JXljWSmGzv","VIlwPMmKGJ","K4GS8atef2",
+"t98iWokgRi","jSjS3aFFss","HP433prNT6","VIlwPMkgy8","jzUqRRxrsm","UmaEvKr8ys","s4786qUJMd","6q6L9QYxC0","0PktIMK07Y","taOXKP6bcg",
+"D6rByJRJQB","UlU3MmX2GE","16lHcpFrrl","PYBf4jzUqR","wDajXhE1Ql","0h1b1O3iyQ","s93Ml6q6L9","W7cTsB3qem","jeskSJRJQB","vOqCEYOfrY",
+"ydG8UfaHir","CxVEfzbIYY","TCgPpHlUbF","Cfgr3BGaQY","C2IrcFFDui","WmadAuAWyp","zbIYYRsQUq","7fsYMuAWyp","CNHmvv8yFN","CNHmvWaWsv",
+"uTacxbrhlQ","tvdkDlpF6W","jfREub29RJ","mz8gxFLsph","JXljWAmdQd","Fhtgld7vjM","aez9yMkgy8","jiVBPRACuj","uPX7GIBe8k","XyPZNaFFss",
+"FLsphIKxdL","Yh1hFLDk6f","MmKGJOUYuF","QnJ1Shi5X7","lpF6WRmDcr","YjB9tvOqCE","JJs5me6e4z","9GXkXDQimp","uLtKsUmaEv","7fsYMOz8yZ",
+"KZamHjeskS","vOqCEMezSW","Gv3FqXyPZN","ZJTXH7X3uy","7X3uyNOHsz","OUYuFZUnqt","l83UdgjUTu","Mkgy8C2Irc","aFFssAkKTk","XflUqVprf2",
+"euZA5AgJHQ","TCgPpjSjS3","RxrsmlH1kt","29QAzhSSvQ","FVMxo8RCUA","JRJQBtuDyS","k85Ae7fKYU","FVMxo5Mg9r","okgRiW3VFH","3weIFbrhlQ",
+"aDGtS0PktI","Twanoy94nw","yluBx6AFT0","16lHcMmKGJ","jiVBPMezSW","FFDuiUvlv4","pv0i7gtCA5","yToGW2DREs","pFrrlTa8f6","o8Uydhe9IA",
+"SjskQFcWrW","ru4UGEOE1o","y94nwF6PT2","W7cTsUl4a1","WreyPFxX9q","DG4sTFLsph","iwzGkmX2GE","d85a9CK5W7","lkMUAFFDui","Z4I1v7X3uy",
+"IBe8kLbRTH","FVMxofaHir","cShY2Waim6","Vprf2FjHXR","jtn0XIRh48","MojnPCp3mZ","VLTy6ulk41","MK07Y0h1b1","7Ow5CqaofN","lpF6WJRJQB",
+"aFFssW7cTs","dhSuHoQ87r","5VZjSYh1hF","hi5X7ni2v1","5NammazIWp","Pb1pa9iGoT","VBjhz7Ow5C","Vprf2DQimp","9rlg9K4GS8","t98iW8cVD3",
+"6q6L9Mm8si","lCMxyjzUqR","xReecIn3NS","5iGN5TXQ0Z","fmIK1l83Ud","Q6LixRsQUq","CK5W7QbxXc","hE1QltvdkD","oQ87rcShY2","OxWIHB3qem",
+"bZLvSCp3mZ","fqypyG1RhS","bZLvSjeskS","SbRYyHzZT8","2NslmLbRTH","16lHch1zcH","ZhwG1v8yFN","LDk6fVerEA","dpe1voQ87r","IjTwPGWqqX",
+"jeskSLbRTH","WDVWJ0ao3l","GXdoH0MR5X","aDGtSGWqqX","nFqikix74r","M6qcG0MR5X","aDGtSOz8yZ","Ul4a1HP433","MaJQsStlDJ","lj07QcL0aE",
+"mX2GEuQIcz","QnJ1St59lR","e6e4zlpF6W","v2eC3ThjNn","pAhR10YAGH","07n1cO3iyQ","2TRI7YOfrY","zHF1qhSSvQ","OUqFM0BmCy","azIWpCp3mZ",
+"NcICAPOUYS","45cIHiB08l","X6PinvOqCE","1v5hHYw2oU","oQ87r0BmCy","5nmWvCqqaD","POUYSMkgy8","FVMxoFwEJz","e6e4zfmIK1","MojnPJKWYR",
+"qQxHPzbIYY","Twanok85Ae","mX2GE580YD","S2DfuWmadA","mX2GE7ku1p","iwzGkLbRTH","6q6L9JRJQB","cShY2Yf2Ec","iwzGkOUqFM","aez9yWmadA",
+"PYBf4DG4sT","GSQwjB3qem","fcJOyprNT6","FnPFBRzaZA","blLA9CK5W7","jiVBPEdBKc","FGzgp0YAGH","sqVrfAmdQd","Q6LixFwEJz","suY4xRpBQm",
+"nlaBy580YD","ZzJHWQ6hMC","M3zXLM6qcG","jSjS3bZLvS","OxWIHQClRL","zqH0WFxX9q","lXFOBMmKGJ","dhSuHlsQGo","BbwgAHfyNQ","ix74rUvlv4",
+"MmsIolm0pD","BCxeCSjskQ","taOXKJJs5m","S2DfuksJby","VIlwP5IhmG","sqVrf0Kyfs","kB5nPNo0Qb","tuDySix74r","2Yz7EGWqqX","9iGoT0PktI",
+"14FLRuLtKs","0ao3lb29RJ","0Wr5yGrDg7","2DREsGSQwj","zHF1q7fKYU","piJSkD6rBy","ulk41nnP8o","jSjS3mz8gx","FGzgpOUqFM","BbwgAcQOnv",
+"QssNCtaOXK","wDajXYh1hF","NcICAogLgc","m4bxUFhtgl","JkzUnVerEA","uPX7GokgRi","he9IAPb1pa","G1RhSb29RJ","he9IAzQt6Q","Ss0Zuv8yFN",
+"WreyPKASQ8","i3pydoGu6x","AOgEe5nmWv","jiVBPVLTy6","NhXduG1RhS","lH1kt5drc6","tjQxs0MR5X","EOE1o7Ow5C","yluBxCqqaD","WPmlx8FmFH",
+"W3VFH55rfB","bgJAz3weIF","ydG8UWaWsv","7fKYU8RCUA","ogLgcgdQsS","Ta8f6jfREu","gdQsSS2Dfu","6AFT09rlg9","QworuKr8ys","Chuy3ECMvU",
+"gf8rIZuDtD","8TxD7GrDg7","0KyfsuoStw","d7vjMNAFuw","atef2HzZT8","8xEKzXflUq","6q6L9YjB9t","iKqhrYw2oU","aez9ycQOnv","FVMxoyvOMI",
+"hUTw7AkKTk","RmDcraFFss","KZamHjS1aj","RkQke618Di","AmdQdTa8f6","jiVBPqaofN","6q6L91v5hH","qUJMdW7cTs","QYxC0G1RhS","RkQkeK20wK",
+"rhl0JGv3Fq","vLsmSpT8wu","UmaEvQnJ1S","S77LHdpe1v","OxWIHD6rBy","QYxC0BGaQY","POUYS9eoRc","jtn0XrKDLJ","24ARFYjB9t","CIShGuAWyp",
+"d7vjMRsQUq","aFFssulk41","XflUqtvdkD","48cHL48cHL","I7p2a5iGN5","7fsYMBpYhV","Nxx9VFPfSE","HzZT8Q6hMC","s7Mxk48cHL","LewvMMmsIo",
+"vLsmS580YD","5VZjShUTw7","Chuy3brhlQ","Oz8yZRpBQm","SWfouMmKGJ","VBjhzKr8ys","MGlTFyluBx","Waim6iqv4k","7ku1p8hJdt","he9IALbRTH",
+"Cfgr3nnP8o","U3yw5ZzJHW","Vprf2WMiS3","NOHszatef2","SmGzvEOE1o","lXFOBFjHXR","RACujoGu6x","cL0aEMK07Y","PYBf414FLR","l83Udl83Ud",
+"JXljW8FmFH","jiVBPyEfy9","FnPFBiB08l","WPmlxZzJHW","sqVrfiB08l","9rlg9FFDui","bZLvSKsjRK","FwEJzZJTXH","okgRiQ6Lix","Mkgy85drc6",
+"jiVBPHzZT8","HlUbFCdyBV","WPmlxiB08l","Yw2oU0PktI","gf8rI7ku1p","nnP8om4bxU","IBe8kVLTy6","QworuOUYuF","G1RhSX6Pin","RACujCxVEf",
+"mz8gxLewvM","k85AeNAFuw","yofH3OUqFM","RzaZAKsjRK","tl72Wpv0i7","WmadAmz8gx","hYBCK0BmCy","1j5L8Nxx9V","suY4xMmsIo","SmGzvsqVrf",
+"i3pydjfREu","Cp3mZfcwDa","I7p2aa00b5","hE1QlPb1pa","Yf2EcIn3NS","Y1mC0Q6hMC","tAOsr0Wr5y","zmLYDKsjRK","D6rBy3otm6","xXTI49iGoT",
+"nFqikY1mC0","7Ow5CuZPqg","lj07Qsoy9t","AXpwERmDcr","zz4ZU5ZaEz","G1RhSZv7z0","l83UdhUTw7","soy9tm4bxU","mz8gxcQOnv","Chuy3uLtKs",
+"Yf2EcQChxs","Vprf2sx5Gl","he9IAOHaBz","1v5hHSjskQ","J2mQiK4GS8","ni2v1zHF1q","ReKEWoGu6x","CK5W7L7cGc","Yw2oUzz4ZU","vkCHHpiJSk",
+"dmoS7cmXIX","EOE1oZv7z0","pT8wuKASQ8","2DREs1v5hH","SWfouL7cGc","oVQp6zmLYD","lViBvydG8U","HRxd8rKDLJ","AOgEeZJTXH","K20wKOUqFM",
+"zmLYDVLTy6","rz7UtW3VFH","FwEJzzQt6Q","QssNCU3yw5","i3pydatef2","dmoS7wiHrZ","1j5L8AIYUu","VIlwPnnP8o","JJs5mvkCHH","7fKYURpBQm",
+"pAhR1blLA9","zqH0WVIlwP","J2mQiStlDJ","XflUqkB5nP","uJScXMmKGJ","pFrrllH1kt","qaofNYf2Ec","ReKEWvkCHH","5nmWvTa8f6","D6rByiqv4k",
+"QworuK20wK","Gv3Fqh1zcH","8RCUAjfREu","lH1kt0Wr5y","Ss0ZujiVBP","guMb8zqH0W","uLtKs7hyVv","Gv3FqVNCPd","CqqaDpFrrl","MezSWQbxXc",
+"taOXKFLsph","pAhR1In3NS","HlUbF8xEKz","4dEz6xXTI4","FnPFBY1mC0","aFFssiwzGk","prNT65Mg9r","pWiOsiKqhr","LbRTHECMvU","iKqhrWreyP",
+"fLNg8n1pmO","QbxXc0Wr5y","a00b5FGzgp","SWfouBFkb8","XyPZNM3zXL","Yw2oUblLA9","VjCZqPYBf4","vOqCEn8pJ9","NcICAZ4I1v","29QAzRsQUq",
+"2TRI7xciqp","pvgjShUTw7","D6rByBbwgA","0Kyfso8Uyd","EoToPhYBCK","a00b5ZuDtD","oGu6xjzUqR","xXTI4No0Qb","pT8wui3pyd","ZhwG1rz7Ut",
+"FPfSEBbwgA","1LB1LJJs5m","atef2POUYS","yvOMIMmKGJ","YjB9tFwEJz","RxrsmokgRi","oGu6xAOgEe","5Nammlm0pD","8FmFHv2eC3","FGzgpmz8gx",
+"o8UydpAhR1","jS1ajVjCZq","X6PinyofH3","I7p2aAOgEe","ReKEWgIYvE","JkzUnuupzk","hYBCKVprf2","jfREulj07Q","ksJbyhYBCK","pAhR1FjHXR",
+"QnJ1S55rfB","vkCHHfqypy","PYBf4n1pmO","jzUqRs4786","lm0pDpFrrl","7fsYM8FmFH","v8yFNVIlwP","hUTw7FFDui","UmaEvulk41","6AFT0zQt6Q",
+"jeskSYw2oU","fcJOyIRh48","ni2v1M3zXL","h1zcH0PktI","JIqXimz8gx","VIlwPSbRYy","GXdoH1j5L8","AOgEewDajX","VBjhzbgJAz","uZPqgfcJOy",
+"Uvlv4hYBCK","48cHLQClRL","IBe8kMK07Y","Cfgr3NcICA","WMiS3zQt6Q","ZUnqtChuy3","lweGyfqypy","29QAzdjsrv","JkzUnbrhlQ","cShY2sx5Gl",
+"s7MxkfaHir","Oz8yZzqH0W","uLtKsMezSW","ZUnqt55rfB","MmKGJhYBCK","2hEEUY1mC0","ulk41X6Pin","0Wr5ySs0Zu","tl72WWaWsv","NOHszFhtgl",
+"jzUqRO3iyQ","jeskSBGaQY","Zv7z0618Di","iB08l8RCUA","vkCHHYOfrY","O3iyQCp3mZ","i7WMQBCxeC","uvf7A7lUXZ","okgRiQnJ1S","aez9yyvOMI",
+"Ss0ZuSbRYy","FnPFBjSjS3","SjskQFLsph","4dEz6BGaQY","DLhzM16lHc","Uvlv4iB08l","IRh48CqqaD","5Drn0cmXIX","ulk410Kyfs","hi5X7MezSW",
+"piJSkSbRYy","0MR5Xlj07Q","ZuDtDWaim6","AkKTklXFOB","Yh1hFBGaQY","Waim61j5L8","hUTw7ciuWz","IKxdLe6e4z","S77LHe6e4z","lCMxyv1Hln",
+"ZuDtDix74r","J2mQiSWfou","M6qcGQ6Lix","FnPFBWreyP","OUYuF2Yz7E","CdyBVzqH0W","S77LHzQt6Q","NOHszuZPqg","zmLYDZzJHW","tl72WF6PT2",
+"vkCHHMGlTF","StlDJ4QMc9","tjQxsZv7z0","KASQ8prNT6","lj07Qiqv4k","SWfouCxVEf","tlILtuoStw","i7WMQuQIcz","KASQ8dhSuH","TXQ0ZGv3Fq",
+"blLA9ni2v1","he9IAHlUbF","D6rByzQt6Q","9eoRciKqhr","BCxeC2ZHdk","Mm8sisoy9t","6AFT0xciqp","FxX9qCqqaD","CIShGD6rBy","t98iWCIShG",
+"Dz1R3gjUTu","OxWIHFjHXR","UmaEvVBjhz","6q6L9O3iyQ","SbRYyWaWsv","nnP8oSjskQ","djsrvd7vjM","POUYSh1zcH","WPmlxpT8wu","ogLgco8Uyd",
+"NcICAWMiS3","SWfou29QAz","QnJ1SCxVEf","piJSk7lUXZ","G1RhSd85a9","guMb8FFDui","EoToPzqH0W","No0Qbs4786","fcJOym4bxU","Yf2Ect98iW",
+"WaWsvFxX9q","8FmFH5Namm","4QMc9L7cGc","8hJdtsqVrf","Kr8ysvLsmS","AOgEeO3iyQ","lsQGoWmadA","ix74rLbRTH","Waim6FcWrW","U3yw5pmeCd",
+"BFkb8IjTwP","hYBCKjzUqR","lsQGoDLhzM","EOE1oGWqqX","prNT6LDk6f","0BmCytAOsr","5IhmGFcWrW","o8UydZ4I1v","O3iyQ8TxD7","8cVD3OxWIH",
+"nFqikTCgPp","l83UdU3yw5","Dz1R3lXFOB","RBhp0CdyBV","qQxHPCp3mZ","4QMc9ulk41","4W0TlC2Irc","ix74r5Drn0","ni2v18U2nU","XflUqi3pyd",
+"nlaByFxX9q","he9IAtl72W","9iGoT8TxD7","O3iyQM6qcG","5drc68hJdt","FLsphlsQGo","QnJ1SZhwG1","Y1mC0euZA5","vLsmS0MR5X","DQimpReKEW",
+"s4786HP433","MmsIoa00b5","cShY25IhmG","ydG8UHlUbF","QClRLbgJAz","dmoS7Cp3mZ","BFkb8kZANm","sx5GlxReec","tvdkDtuDyS","prNT6lsQGo",
+"VLTy6SjskQ","9iGoT6AFT0","ZuDtDxciqp","uLtKs618Di","t59lRzQt6Q","DQimpM3zXL","vLsmSVLTy6","rhl0JJkzUn","uZPqgO3iyQ","yvOMIzHF1q",
+"16lHcpv0i7","UmaEvtlILt","8hJdt24ARF","Mkgy82hEEU","mX2GEXflUq","3otm6LDk6f","8RCUAvLsmS","P6bcguTacx","bZLvSzmLYD","JKWYRyluBx",
+"JkzUnK20wK","HP433jfREu","618DinnP8o","jfREus4786","guMb8aL6AJ","GSQwjIBe8k","EOE1opT8wu","cShY2QssNC","TXQ0ZVNCPd","RBhp0dpe1v",
+"zQt6QtaOXK","gdQsSL7cGc","Yf2Ecuupzk","Oz8yZgdQsS","HlUbFSbRYy","dhSuH8hJdt","RACujs7Mxk","piJSkWMiS3","7hyVvulk41","2hEEUfcJOy",
+"Ul4a1FnPFB","P6bcgbgJAz","zz4ZU5Drn0","5nmWv1v5hH","1v5hH3otm6","K20wKNcICA","fFDrJfqypy","NhXdu8FmFH","jzUqRS77LH","FcWrWKZamH",
+"YjB9tzY1GY","IRh48BGaQY","uQIcz8TxD7","FVMxoi3pyd","OUqFMlCMxy","fqypyJkzUn","GrDg724ARF","QYxC0lkMUA","NOHszFLsph","4QMc9ru4UG",
+"FjHXR5Drn0","5iGN5DQimp","x3LDeReKEW","FVMxoni2v1","2NslmL7cGc","5Mg9rZuDtD","zY1GYChuy3","wDajXuvf7A","pmeCd580YD","Ul4a1HRxd8",
+"Ss0Zu9XyT9","1LB1LYw2oU","rhl0JaL6AJ","oQ87rmX2GE","VBjhzzz4ZU","UmaEvWmadA","ZuDtDQWxoT","Nxx9VP6bcg","fFDrJRsQUq","QChxs0Wr5y",
+"zmLYDQChxs","Dz1R3AIYUu","cQOnvqaofN","tuDyS9rlg9","Uvlv4Mkgy8","ru4UGZv7z0","NOHszX6Pin","Y1mC0y94nw","ydG8UStlDJ","YOfrYFwEJz",
+"DcpWBfaHir","9eoRc9eoRc","1LB1LokgRi","uoStwzHF1q","PYBf49iGoT","DcpWBcQOnv","brhlQjiVBP","lj07QbgJAz","iKqhrReKEW","uPX7G7lUXZ",
+"QWxoTuLtKs","blLA9zqH0W","jS1ajCK5W7","lj07Q6AFT0","VerEANxx9V","29QAzDG4sT","lpF6Wx3LDe","uPX7GMmsIo","64s8NuLtKs","Uvlv4uJScX",
+"RACujulk41","C2IrcjeskS","e6e4z580YD","GWqqXU3yw5","CxVEfOz8yZ","U3yw5JXljW","In3NShSSvQ","s7MxkwiHrZ","XyPZNMkgy8","IBe8kjeskS",
+"wiHrZsuY4x","oVQp6LDk6f","v8yFNRmDcr","VBjhzUvlv4","MGlTF9iGoT","y94nw9GXkX","OUqFM16lHc","hSSvQhE1Ql","Ss0ZupvgjS","gjUTutl72W",
+"LDk6fMGlTF","MK07YSWfou","jfREuZUnqt","7lUXZ5Drn0","Cp3mZEOE1o","HlUbFRACuj","MaJQshE1Ql","yvOMIhUTw7","4dEz6yEfy9","he9IAyToGW",
+"LewvMLewvM","GrDg7uAWyp","ThjNnStlDJ","TwanonFqik","ZuDtDK4GS8","rhl0JwDajX","ogLgcyToGW","2DREsVIlwP","RsQUq0PktI","RsQUqksJby",
+"BGaQYCfgr3","55rfBfaHir","h1zcHxReec","MmKGJpFrrl","HfyNQXflUq","aez9yLewvM","RACujuN6r3","FhtglfFDrJ","i7WMQZUnqt","2hEEUatef2",
+"ogLgcs4786","FxX9qydG8U","rKDLJsuY4x","fFDrJ14FLR","IBe8klweGy","lj07Qd7vjM","MmKGJZhwG1","pv0i7uoStw","2ZHdkFPfSE","yEfy9JIqXi",
+"GXdoHPOUYS","sx5Gldpe1v","7Ow5Culk41","lCMxy2Yz7E","a00b5JkzUn","MK07YcL0aE","F6PT2iqv4k","uoStwlpF6W","9iGoTFjHXR","WPmlxYw2oU",
+"5Drn05Namm","ogLgc0Wr5y","zQt6QSWfou","BpYhVLewvM","B3qemiqv4k","lH1ktfcJOy","CIShGgjUTu","Oz8yZ8RCUA","Ta8f6F6PT2","pT8wuDcpWB",
+"yToGWyToGW","suY4x8U2nU","CNHmvuZPqg","vLsmSwiHrZ","POUYSzFgtB","4W0Tl1v5hH","n8pJ9Cfgr3","SbRYyjSjS3","Q6LixbZLvS","I7p2alsQGo",
+"EoToPlj07Q","lj07QGv3Fq","zbIYYCK5W7","G1RhStuDyS","dQ586TXQ0Z","jiVBPdjsrv","RkQkeyToGW","euZA53weIF","lsQGooVQp6","FGzgpatef2",
+"S77LHHzZT8","SjskQRxrsm","FxX9qatef2","suY4xFLsph","gf8rIYjB9t","cQOnvtlILt","U3yw5xXTI4","7Ow5CvkCHH","FLsphzz4ZU","2Nslm6AFT0",
+"prNT655rfB","QWxoToVQp6","RmDcrdhSuH","zqH0WTa8f6","EOE1o0ao3l","TCgPpCqqaD","uZPqgIRh48","jtn0XFPfSE","NAFuwjzUqR","okgRiRsQUq",
+"DcpWBEOE1o","QnJ1SogLgc","iwzGkMm8si","blLA9zQt6Q","5Drn0lpF6W","1j5L8suY4x","pmeCdgtCA5","ni2v1KASQ8","UmaEv8FmFH","SjskQRkQke",
+"ix74rpFrrl","i3pydZv7z0","RkQke0Kyfs","rhl0JNxx9V","iwzGkWPmlx","1j5L8h1zcH","ZJTXHNo0Qb","oGu6x8TxD7","Ta8f6piJSk","iqv4k8FmFH",
+"fcwDalXFOB","K4GS8vOqCE","vOqCERBhp0","lj07QRxrsm","gIYvEZv7z0","m4bxU0Wr5y","FPfSEBCxeC","QClRLK4GS8","blLA9UmaEv","iB08ljSjS3",
+"bgJAzTwano","k85Aev1Hln","s93Ml1j5L8","yluBxyofH3","CNHmvkB5nP","yofH3v2eC3","gjUTut98iW","rhl0J9iGoT","atef28FmFH","JJs5mksJby",
+"AgJHQ2hEEU","14FLRa00b5","MmKGJW7cTs","JXljWhSSvQ","oQ87rIBe8k","tlILthi5X7","zFgtBokgRi","Mm8silsQGo","oGu6xFjHXR","jeskSZJTXH",
+"BFkb8In3NS","i3pyd5iGN5","ZJTXHWMiS3","gjUTumz8gx","JXljW7fsYM","CdyBViKqhr","0h1b1Kr8ys","NcICAAgJHQ","dpe1vRsQUq","fqypyAgJHQ",
+"gtCA5ni2v1","BFkb8lpF6W","MaJQsWreyP","lXFOBiwzGk","P6bcgVLTy6","Dz1R30YAGH","v1HlntuDyS","VjCZqiqv4k","VerEAjeskS","iKqhrnnP8o",
+"zFgtBiB08l","cmXIXJJs5m","lsQGoG1RhS","OUYuFvLsmS","djsrvfFDrJ","kZANmWaWsv","uupzkmX2GE","QYxC0gjUTu","lXFOBgjUTu","7fKYU7lUXZ",
+"xXTI4yofH3","QworuEdBKc","WDVWJogLgc","0Wr5ysoy9t","RsQUquvf7A","3otm6Nxx9V","qQxHPhe9IA","gdQsSjeskS","ReKEWuvf7A","s7Mxkjtn0X",
+"TCgPpJKWYR","pv0i7gIYvE","7fKYU5iGN5","O3iyQd7vjM","K4GS8nlaBy","wDajXFVMxo","9GXkXECMvU","gIYvEyofH3","F6PT2FjHXR","t98iWaL6AJ",
+"1LB1LnlaBy","2DREsZhwG1","dmoS7FGzgp","SmGzv5nmWv","gtCA5JRJQB","zqH0WguMb8","0KyfsMmKGJ","okgRiM6qcG","iB08lIRh48","lCMxyQYxC0",
+"MmsIo0PktI","azIWpcmXIX","tjQxspAhR1","uupzknlaBy","JRJQBI7p2a","7X3uyIjTwP","gf8rI5IhmG","lH1kthYBCK","iqv4k1v5hH","8hJdtIKxdL",
+"QClRLsuY4x","AkKTkHP433","7Ow5CJRJQB","JIqXi4QMc9","VLTy65Mg9r","QssNCRxrsm","BCxeCrhl0J","BCxeCzqH0W","azIWpksJby","8U2nUCNHmv",
+"7X3uy0Kyfs","GWqqXaDGtS","cShY28hJdt","D6rByWaWsv","piJSkuTacx","v8yFNRsQUq","ulk41pvgjS","dpe1vd85a9","KASQ8hi5X7","d85a98RCUA",
+"d85a92TRI7","jzUqRyluBx","9eoRcm4bxU","jSjS39eoRc","29QAzLewvM","JkzUnWDVWJ","lj07QcShY2","yvOMIFjHXR","WaWsv48cHL","euZA5lj07Q",
+"WreyPhSSvQ","0MR5XX6Pin","Zv7z0EdBKc","l83UdYjB9t","xReecpvgjS","I7p2a5ZaEz","iwzGktjQxs","dmoS7guMb8","0ao3lpFrrl","Pb1pa2TRI7",
+"Yf2EciB08l","LbRTHNAFuw","3otm6uLtKs","t98iWCNHmv","gf8rI9rlg9","MaJQsOUqFM","MaJQsblLA9","1LB1LaDGtS","BGaQYW7cTs","ThjNnWDVWJ",
+"580YDnFqik","cShY2CIShG","XflUq7hyVv","aez9y7Ow5C","fcJOyX6Pin","55rfB6AFT0","dpe1vgjUTu","2DREstuDyS","k85AeFnPFB","I7p2ak85Ae",
+"jzUqR0YAGH","QClRLWreyP","HfyNQhE1Ql","tlILtlweGy","ru4UGUmaEv","uZPqgpAhR1","uPX7GtvdkD","dQ586kZANm","POUYStl72W","mX2GEprNT6",
+"lH1ktpiJSk","lsQGoSjskQ","ReKEWB3qem","gtCA5uTacx","jfREuSjskQ","zqH0We6e4z","prNT6gIYvE","Mm8sihi5X7","VBjhzn1pmO","d85a9pv0i7",
+"tuDySLbRTH","yvOMIQYxC0","8FmFHpmeCd","HP433YjB9t","7fKYUhi5X7","IBe8k5IhmG","soy9tDz1R3","QWxoTlweGy","24ARFtaOXK","0BmCyOxWIH",
+"MmKGJDQimp","Chuy3ksJby","lj07QFGzgp","Pb1paCfgr3","XflUqJIqXi","2NslmIjTwP","RmDcrhUTw7","OHaBz8RCUA","5nmWvG1RhS","tl72Wlj07Q",
+"F6PT20ao3l","B3qemQClRL","cL0aE29QAz","7X3uytAOsr","8RCUAciuWz","RpBQmFcWrW","P6bcgru4UG","uTacxK4GS8","wiHrZhYBCK","brhlQSmGzv",
+"pWiOs64s8N","JJs5mvLsmS","MmKGJciuWz","HzZT8Twano","0PktIn8pJ9","v1Hln1LB1L","OUYuF8xEKz","3otm6lCMxy","5nmWvAOgEe","h1zcHfcJOy",
+"7X3uyv1Hln","0YAGHiB08l","RzaZAMm8si","M3zXLGXdoH","BbwgAReKEW","DG4sTuN6r3","24ARF8xEKz","9eoRcFVMxo","ix74rNOHsz","CdyBV7lUXZ",
+"hSSvQru4UG","Q6Lix5iGN5","xReecnlaBy","BpYhV29QAz","JRJQBcmXIX","4QMc9rz7Ut","xciqpL7cGc","RACujcShY2","U3yw5O3iyQ","2Nslmd7vjM",
+"yluBxMmKGJ","F6PT2GWqqX","zHF1qAmdQd","suY4xv1Hln","soy9tCK5W7","Yh1hF24ARF","RzaZAXyPZN","a00b5JIqXi","ZUnqthE1Ql","d85a9rhl0J",
+"5drc6QClRL","S2DfuMkgy8","jzUqR5IhmG","MojnPzHF1q","iB08lUlU3M","b29RJNAFuw","pv0i7yluBx","K20wKjSjS3","UmaEvVIlwP","UlU3M618Di",
+"L7cGcOUqFM","y94nwFFDui","uoStwL7cGc","h1zcHlweGy","QYxC0ZzJHW","d85a9FcWrW","euZA5IBe8k","VIlwPuQIcz","jfREuMK07Y","0KyfsIBe8k",
+"hSSvQCdyBV","TXQ0ZpT8wu","dmoS7Mkgy8","AOgEe9iGoT","8FmFH8cVD3","WmadAh1zcH","prNT6J2mQi","zmLYDogLgc","brhlQMaJQs","Vprf2JJs5m",
+"b29RJYOfrY","oQ87ruTacx","RkQkecShY2","tlILt5Namm","iqv4k8cVD3","BGaQYlm0pD","7fKYUzbIYY","lsQGo2TRI7","FwEJz2Yz7E","TCgPphUTw7",
+"Ul4a1WmadA","MmsIoe6e4z","xciqpjSjS3","In3NSSWfou","Vprf2VNCPd","gtCA5fFDrJ","ni2v19iGoT","5nmWvRzaZA","14FLRVjCZq","RxrsmNxx9V",
+"uLtKsv2eC3","XflUq14FLR","v1HlnI7p2a","CK5W7Q6hMC","Yh1hFXyPZN","gtCA5Pb1pa","HzZT8uvf7A","WMiS3Fhtgl","EOE1o0Kyfs","0MR5XYf2Ec",
+"K20wKFjHXR","0ao3luPX7G","5drc6Nxx9V","RmDcrAmdQd","zQt6QjzUqR","PYBf47ku1p","kB5nPm4bxU","gIYvEWaWsv","UmaEvy94nw","azIWpQ6Lix",
+"Yh1hFa00b5","BCxeCHfyNQ","m4bxUKr8ys","uQIczWmadA","oQ87rEOE1o","3weIFqQxHP","3otm6uTacx","16lHcGrDg7","gjUTuFhtgl","gtCA5hSSvQ",
+"Nxx9Vv1Hln","2hEEUPOUYS","Yh1hF6AFT0","mz8gxrz7Ut","RpBQmTCgPp","pmeCdd7vjM","tl72WRACuj","SWfouDG4sT","ulk41pv0i7","bZLvSdmoS7",
+"L7cGcpAhR1","KsjRKyluBx","48cHLqaofN","YOfrYv2eC3","tlILtlm0pD","uTacxNhXdu","RACuj5IhmG","zY1GYMGlTF","bZLvSKASQ8","AkKTkZuDtD",
+"he9IA5nmWv","NhXduTXQ0Z","W3VFHhE1Ql","SbRYyokgRi","XflUqPb1pa","WMiS3ni2v1","SbRYyCp3mZ","8U2nU6AFT0","EOE1oVerEA","JkzUnDQimp",
+"nnP8oVprf2","kZANmVIlwP","0YAGHIn3NS","2hEEUEdBKc","LewvMwDajX","lpF6W7fsYM","VNCPd9y4lw","45cIHi7WMQ","uoStwfaHir","UmaEvwDajX",
+"cmXIXM6qcG","uZPqgOz8yZ","8TxD7fqypy","prNT6FnPFB","lH1ktFcWrW","qUJMdhUTw7","gdQsSdpe1v","t59lRFnPFB","0MR5X2Nslm","Nxx9V5Namm",
+"tl72WrKDLJ","kB5nPyofH3","AgJHQdmoS7","JKWYRUmaEv","FwEJzuoStw","lXFOBKsjRK","dmoS7yToGW","uLtKs29QAz","2NslmZzJHW","MK07YHP433",
+"QChxs0BmCy","D6rByuAWyp","NAFuw7fKYU","uJScX29QAz","QYxC0cQOnv","MK07Yaez9y","7fKYUBbwgA","iKqhraL6AJ","ksJbygf8rI","Ta8f6zz4ZU",
+"pv0i7FnPFB","VNCPdThjNn","YOfrYhUTw7","RzaZAb29RJ","ECMvURzaZA","DG4sT5Namm","FVMxoaez9y","RxrsmRkQke","o8Uydix74r","9iGoTlXFOB",
+"IjTwPSs0Zu","blLA9Zv7z0","Mm8sixciqp","07n1cCfgr3","WreyPgtCA5","tAOsrRsQUq","lpF6WQnJ1S","Yf2Ec0Wr5y","nlaByRpBQm","DLhzMSmGzv",
+"uoStwfcwDa","ThjNnHRxd8","aez9yIBe8k","t59lRsuY4x","RpBQmh1zcH","4QMc9YjB9t","O3iyQBbwgA","XflUq29QAz","lCMxyazIWp","BpYhVlXFOB",
+"5IhmGtuDyS","bgJAzlkMUA","FFDuih1zcH","dQ586JKWYR","No0QbVLTy6","5Drn0IjTwP","n1pmO45cIH","fFDrJ8FmFH","zFgtBWreyP","s7MxkRzaZA",
+"K4GS8zqH0W","0PktI48cHL","4W0TlgjUTu","HP433ix74r","vLsmSI7p2a","9rlg90BmCy","nFqik4QMc9","AXpwE0Kyfs","7ku1pCqqaD","2ZHdkS2Dfu",
+"IRh48pWiOs","TXQ0ZK20wK","KsjRKFcWrW","zY1GYiqv4k","VerEAAOgEe","b29RJa00b5","Chuy3CIShG","gtCA529QAz","Nxx9VyluBx","m4bxUs4786",
+"CNHmvlm0pD","ydG8UQ6Lix","SjskQdjsrv","e6e4ztl72W","NcICAMmsIo","rKDLJx3LDe","aL6AJsqVrf","JJs5mRACuj","Dz1R3QssNC","fcJOyyofH3",
+"618Digf8rI","zHF1qZv7z0","0YAGHI7p2a","KASQ8M6qcG","FnPFBHlUbF","618DiHfyNQ","5ZaEzni2v1","pv0i7x3LDe","CNHmvPb1pa","FcWrWaDGtS",
+"VIlwPVIlwP","Gv3Fq8FmFH","lkMUA14FLR","bgJAz4dEz6","14FLR8TxD7","HRxd8uQIcz","FFDui0BmCy","tvdkDQ6Lix","6AFT0dQ586","aDGtSiwzGk",
+"uTacx1v5hH","Qworupv0i7","yluBxS77LH","fqypylweGy","6AFT0Cfgr3","2DREsCp3mZ","WMiS39XyT9","uupzkEdBKc","lweGyFnPFB","1j5L8Yw2oU",
+"y94nwbrhlQ","wiHrZVerEA","Gv3FqNhXdu","mz8gxiwzGk","BpYhVxXTI4","cQOnvWmadA","LewvMJKWYR","zbIYYwiHrZ","MojnPUmaEv","Dz1R364s8N",
+"lkMUAqaofN","Qworu5Namm","0Wr5yv1Hln","LewvMcQOnv","aDGtSCp3mZ","uTacxHzZT8","WreyPcQOnv","o8UydbrhlQ","yEfy9Pb1pa","Vprf2gjUTu",
+"CIShGCNHmv","dpe1v5VZjS","jSjS3Fhtgl","i3pydIRh48","hi5X75iGN5","DLhzMguMb8","qUJMdWPmlx","UlU3Mx3LDe","FnPFBzbIYY","FNYIMIBe8k",
+"0YAGH9eoRc","faHirpmeCd","TXQ0ZtvdkD","ru4UGcL0aE","nlaBydjsrv","ZJTXH7ku1p","DLhzMJ2mQi","SjskQVLTy6","lkMUAlpF6W","vLsmSZuDtD",
+"TCgPpWDVWJ","sqVrf6AFT0","1LB1LF6PT2","K4GS8oVQp6","uAWypuPX7G","7X3uyiKqhr","2TRI7gf8rI","8TxD724ARF","CdyBVkZANm","RACujlH1kt",
+"kZANmyluBx","NhXdui7WMQ","prNT6MezSW","Qworui3pyd","OxWIHFPfSE","24ARFCIShG","ZUnqtNOHsz","s7Mxkh1zcH","HzZT82DREs","45cIHAmdQd",
+"uJScXK20wK","5Mg9rdQ586","C2IrcNo0Qb","Vprf2aDGtS","VLTy6qUJMd","l83UdTwano","b29RJuvf7A","o8UydlweGy","mz8gxlpF6W","1v5hHm4bxU",
+"iqv4k2Nslm","yToGWAgJHQ","7fKYUAIYUu","K4GS80Wr5y","GXdoHzY1GY","dQ586Gv3Fq","prNT6hYBCK","29QAzO3iyQ","5Drn0FNYIM","QChxsEOE1o",
+"DLhzMUmaEv","s7MxkOHaBz","KZamHru4UG","4dEz6lXFOB","gtCA5HRxd8","fcwDaqaofN","uoStwwDajX","lj07QuN6r3","CNHmvAkKTk","yEfy9o8Uyd",
+"xXTI4FNYIM","CIShGkZANm","uLtKsuTacx","VerEAI7p2a","RkQke8TxD7","14FLR55rfB","cShY2DLhzM","HRxd8YOfrY","ECMvUfmIK1","uupzkRpBQm",
+"zY1GYOz8yZ","ulk41xReec","RmDcrNxx9V","jeskSni2v1","sx5GlhE1Ql","BbwgAd7vjM","1j5L87hyVv","atef2BpYhV","7lUXZTXQ0Z","VerEAt59lR",
+"zY1GY55rfB","RACuj9eoRc","uAWypydG8U","Q6LixHP433","Yf2EcIRh48","kB5nP0ao3l","FLsphS77LH","faHirXflUq","D6rByM3zXL","blLA9OxWIH",
+"dpe1vhSSvQ","MaJQsDQimp","IRh48zbIYY","RkQke9y4lw","4QMc95IhmG","SWfoudmoS7","DcpWBzHF1q","WaWsvqQxHP","KASQ88RCUA","VNCPdD6rBy",
+"fFDrJ48cHL","FjHXRsx5Gl","yToGWZ4I1v","wDajX24ARF","S2DfuJRJQB","ksJbyVjCZq","ru4UGhe9IA","FxX9qi3pyd","2NslmuTacx","5NammuTacx",
+"t98iWfmIK1","TwanoWreyP","7hyVvzmLYD","07n1clViBv","zqH0WuLtKs","ni2v1Waim6","AIYUuBCxeC","K20wKksJby","0ao3ln8pJ9","lkMUAprNT6",
+"Z4I1vi3pyd","Ta8f6Pb1pa","64s8NKASQ8","UmaEvRzaZA","Kr8ysuN6r3","fmIK1pFrrl","oGu6xM3zXL","lpF6WUmaEv","RACujlkMUA","jzUqRSjskQ",
+"POUYSHfyNQ","9iGoTxXTI4","rhl0J8U2nU","5Drn01LB1L","FLsphUvlv4","OHaBzh1zcH","jeskSS2Dfu","uQIcz3weIF","45cIHU3yw5","5Mg9rI7p2a",
+"5nmWvtvdkD","CK5W7d7vjM","8xEKzNOHsz","MmKGJBpYhV","SbRYybrhlQ","Ul4a1ydG8U","DLhzMiqv4k","5IhmGRBhp0","lViBvv1Hln","zmLYDs4786",
+"IBe8kfLNg8","5ZaEzM6qcG","zz4ZUC2Irc","7fKYUtjQxs","RACujKr8ys","7fsYMAIYUu","cL0aErKDLJ","hi5X7ReKEW","oQ87r2Yz7E","jS1aj0h1b1",
+"7fKYUuupzk","64s8N4dEz6","1LB1Ls93Ml","UmaEvru4UG","29QAzgIYvE","RkQkefcwDa","ZuDtDM6qcG","aez9ytjQxs","VerEAuN6r3","IBe8kdQ586",
+"Ul4a1XyPZN","OUYuFlXFOB","DQimpaFFss","tjQxs3weIF","XyPZNlH1kt","M6qcGoQ87r","FwEJzvkCHH","zz4ZURsQUq","Zv7z0Qworu","m4bxU8RCUA",
+"bgJAzAmdQd","MezSW55rfB","ciuWzru4UG","AOgEeECMvU","t59lR2TRI7","CdyBVI7p2a","DG4sTuoStw","hYBCKiB08l","CK5W7Fhtgl","ni2v15ZaEz",
+"ZzJHWFVMxo","Oz8yZblLA9","7Ow5Cv2eC3","RzaZAGv3Fq","lj07QYh1hF","OUYuFfmIK1","Kr8ys618Di","5Drn06AFT0","wiHrZs93Ml","7lUXZpiJSk",
+"OxWIH16lHc","rz7UtWreyP","ru4UGhSSvQ","lsQGoP6bcg","lViBv9rlg9","zqH0WM3zXL","zY1GYcShY2","RmDcrIKxdL","SbRYy8FmFH","XflUqDQimp",
+"1LB1LtlILt","UmaEvIjTwP","BpYhV0Wr5y","lpF6WyEfy9","GXdoHJKWYR","ZUnqtv8yFN","zFgtBXflUq","HRxd8cShY2","d85a9jSjS3","FFDui16lHc",
+"lweGy48cHL","EoToPdjsrv","tlILtJXljW","WmadAOHaBz","6AFT0Zv7z0","QClRLzmLYD","s93MlRxrsm","vOqCEuN6r3","P6bcgn1pmO","yvOMIIRh48",
+"pAhR1StlDJ","Q6Lix7X3uy","gdQsSHzZT8","2hEEUC2Irc","MaJQsguMb8","64s8NyEfy9","sqVrfrKDLJ","8RCUAlm0pD","tjQxss7Mxk","Mm8si0ao3l",
+"O3iyQ16lHc","d7vjMyofH3","5Drn08xEKz","djsrvru4UG","zz4ZUVLTy6","J2mQigIYvE","fLNg8WMiS3","pvgjSdQ586","M3zXLW7cTs","djsrva00b5",
+"fcwDa55rfB","Zv7z0S2Dfu","SbRYyL7cGc","QnJ1Suvf7A","s4786BCxeC","Chuy3euZA5","ni2v1FGzgp","AOgEe1LB1L","lj07Qsx5Gl","iKqhriqv4k",
+"pT8wunlaBy","XyPZNZv7z0","POUYSCp3mZ","ogLgcVBjhz","MezSW0YAGH","t98iWt98iW","i3pydlH1kt","AmdQd0MR5X","2TRI70BmCy","nFqik64s8N",
+"FcWrW9XyT9","D6rByNcICA","0BmCy9y4lw","y94nwBGaQY","s478664s8N","tuDySjzUqR","jiVBPYh1hF","xciqp9XyT9","lH1ktzmLYD","0Kyfs2TRI7",
+"8TxD7580YD","cmXIXFNYIM","JJs5m7lUXZ","9GXkX4QMc9","Kr8ysxciqp","uTacxqQxHP","pWiOsuPX7G","zHF1q2TRI7","dhSuHy94nw","BFkb8BFkb8",
+"soy9t8U2nU","m4bxUyluBx","Kr8ysTwano","SWfoutAOsr","ogLgcrhl0J","brhlQPb1pa","F6PT2y94nw","ZUnqtGXdoH","QbxXclkMUA","fcJOy5drc6",
+"6AFT0okgRi","AOgEepv0i7","tl72WCdyBV","NOHszhE1Ql","xXTI4JXljW","WDVWJOz8yZ","sx5GllH1kt","NOHszn1pmO","fqypyBbwgA","Nxx9V3otm6",
+"x3LDecmXIX","VIlwPAIYUu","VjCZq4W0Tl","m4bxURACuj","YjB9ttlILt","ni2v1TXQ0Z","lH1kt3otm6","RBhp0DcpWB","piJSkdhSuH","l83UdlkMUA",
+"wDajXlH1kt","nnP8oW7cTs","vLsmSqUJMd","QworuUl4a1","bZLvSfaHir","FcWrWMojnP","QClRLv2eC3","m4bxU2Nslm","uJScXDQimp","cmXIXh1zcH",
+"lweGymX2GE","aez9ybgJAz","uN6r3DcpWB","hi5X72DREs","0Wr5yo8Uyd","2ZHdkK20wK","xciqpjeskS","pv0i7tl72W","hi5X7HRxd8","prNT6yToGW",
+"guMb8Cfgr3","XyPZNy94nw","o8Uyd5ZaEz","uLtKs2DREs","uTacxsx5Gl","S2Dfu0MR5X","d7vjM48cHL","5IhmG29QAz","2NslmAgJHQ","RBhp08RCUA",
+"Nxx9VDz1R3","gf8rIcQOnv","kZANmZuDtD","VerEA8cVD3","sqVrfuJScX","gdQsSGrDg7","FjHXRYf2Ec","qaofN5VZjS","0BmCyZhwG1","azIWpbZLvS",
+"2Yz7ERkQke","Q6Lix0YAGH","oVQp6NcICA","mX2GEVjCZq","brhlQqQxHP","s93MlpiJSk","XflUqh1zcH","5NammTCgPp","HRxd8Zv7z0","2NslmHP433",
+"HzZT8guMb8","7lUXZC2Irc","Ul4a1pFrrl","VNCPdIn3NS","ydG8UVBjhz","cShY2dhSuH","RBhp0CIShG","B3qemQworu","W7cTsD6rBy","WDVWJI7p2a",
+"he9IAVNCPd","nlaBykB5nP","qUJMdjzUqR","pT8wuJ2mQi","ulk41zmLYD","dmoS7QbxXc","M6qcG29QAz","HzZT8i3pyd","LewvMK4GS8","AgJHQogLgc",
+"Yh1hFzbIYY","8FmFHxXTI4","5VZjScShY2","RsQUqgjUTu","blLA98RCUA","0Wr5yazIWp","vkCHHW3VFH","0h1b1VerEA","Vprf2qaofN","RsQUqpT8wu",
+"S2Dfumz8gx","oGu6xblLA9","FNYIMtl72W","jS1ajsqVrf","qQxHPfcJOy","LDk6f1LB1L","FPfSEYw2oU","FLsphLewvM","uvf7As7Mxk","pvgjSPb1pa",
+"nlaByuTacx","Yf2Ec55rfB","RzaZA0ao3l","OHaBzlm0pD","OUYuFXyPZN","lViBvgjUTu","POUYSGv3Fq","Q6LixVjCZq","Fhtgls4786","K20wKatef2",
+"AIYUuBFkb8","45cIH4dEz6","tvdkDdjsrv","IRh48DQimp","OUYuFuvf7A","Oz8yZfcJOy","vkCHHbZLvS","WDVWJoQ87r","Cp3mZQChxs","kB5nP2ZHdk",
+"Nxx9VlCMxy","sx5Glx3LDe","t98iWThjNn","suY4xI7p2a","DLhzMRBhp0","zmLYD0PktI","uvf7AtlILt","S77LHciuWz","4W0TlnnP8o","uAWyp7fKYU",
+"64s8NeuZA5","7Ow5CaFFss","s7MxkSWfou","ogLgcMK07Y","yvOMIJKWYR","pvgjSaL6AJ","O3iyQCNHmv","l83UdfmIK1","uAWyp618Di","GXdoHm4bxU",
+"DLhzMQChxs","dhSuHVLTy6","Chuy3SjskQ","3otm60BmCy","wDajXaDGtS","zqH0WTwano","ECMvUrKDLJ","618Dimz8gx","qaofNx3LDe","RpBQmgdQsS",
+"VIlwP8TxD7","48cHLjSjS3","K4GS8sx5Gl","xXTI4Yh1hF","AIYUumX2GE","VNCPdRxrsm","dpe1vC2Irc","5nmWvU3yw5","oGu6xDQimp","9y4lwx3LDe",
+"n1pmOni2v1","WMiS3ksJby","D6rByyvOMI","2TRI7Ul4a1","JKWYRIRh48","UlU3M9iGoT","S77LH618Di","vkCHHZhwG1","zqH0WChuy3","S2DfulsQGo",
+"JIqXiDG4sT","FGzgpzqH0W","cShY2JXljW","WaWsvGv3Fq","jfREujS1aj","k85Ae8xEKz","uPX7GAIYUu","LbRTHHlUbF","jiVBPVerEA","fqypyKr8ys",
+"gf8rIFwEJz","8xEKzpiJSk","zqH0W2Nslm","VBjhzFhtgl","VerEAMm8si","ECMvU3otm6","FFDui9rlg9","BCxeCDcpWB","uvf7ADcpWB","RzaZAjzUqR",
+"lH1ktix74r","SbRYyi7WMQ","MojnP5drc6","lm0pDksJby","zY1GYAOgEe","lweGy6q6L9","fcJOyYjB9t","XflUqoQ87r","HzZT85Mg9r","Yw2oUoQ87r",
+"v2eC3KsjRK","B3qemDQimp","MezSW0MR5X","i7WMQaez9y","2Nslm5Namm","ulk41RACuj","1v5hHuPX7G","uoStwOxWIH","uTacxQWxoT","h1zcH07n1c",
+"tl72WlpF6W","SmGzvChuy3","yofH3MK07Y","vkCHHhYBCK","CdyBVQworu","StlDJGXdoH","BbwgAh1zcH","L7cGc5iGN5","jtn0XaL6AJ","JIqXiGv3Fq",
+"FnPFB8cVD3","yEfy9RmDcr","ru4UGvkCHH","vOqCE5iGN5","RxrsmtjQxs","OUYuFGrDg7","Zv7z0sx5Gl","CK5W79XyT9","RpBQmzmLYD","iwzGkcL0aE",
+"8hJdtaFFss","fLNg8atef2","fLNg85drc6","1j5L8NcICA","D6rByMGlTF","BGaQYVjCZq","tuDySuJScX","5Drn0guMb8","BCxeCpmeCd","HzZT8ru4UG",
+"QChxsYjB9t","ThjNnBFkb8","tl72W1j5L8","gjUTuCdyBV","lj07QOHaBz","QClRLfaHir","pWiOsSs0Zu","nnP8oRkQke","tuDyS1LB1L","pFrrluvf7A",
+"FwEJz2ZHdk","pvgjSRACuj","rKDLJCNHmv","lj07QlCMxy","uN6r3aDGtS","FLsph3otm6","K20wKAOgEe","gIYvEwDajX","64s8NQnJ1S","9iGoTWaWsv",
+"MGlTFsx5Gl","i7WMQlj07Q","W3VFH29QAz","aL6AJ9rlg9","jiVBPYf2Ec","5Mg9rO3iyQ","h1zcHxciqp","Q6hMCfFDrJ","RsQUqm4bxU","fcwDahUTw7",
+"FxX9qdpe1v","nnP8oqUJMd","AmdQddmoS7","vOqCEfLNg8","QworuIn3NS","v1Hlnn8pJ9","pFrrlWmadA","W3VFH24ARF","pAhR18TxD7","n1pmO580YD",
+"FGzgpIBe8k","DG4sT0ao3l","TXQ0ZjfREu","ksJbyhi5X7","W3VFHVBjhz","RpBQmwiHrZ","cmXIX55rfB","I7p2adQ586","zFgtBZuDtD","blLA9YjB9t",
+"FjHXRb29RJ","zz4ZUgtCA5","pWiOsuupzk","Vprf255rfB","QClRLaFFss","Z4I1vgIYvE","rhl0JHlUbF","580YDyluBx","bZLvS2hEEU","7hyVvGSQwj",
+"ksJbyyvOMI","iqv4kFhtgl","ZzJHWDG4sT","tjQxsgtCA5","he9IAatef2","uZPqgfcwDa","cmXIXs7Mxk","7lUXZ5Namm","hi5X73weIF","Yf2Ec29QAz",
+"45cIHFLsph","9rlg9yluBx","yEfy9aez9y","IjTwPuQIcz","djsrvTwano","QssNCOxWIH","Chuy35nmWv","piJSk0MR5X","HlUbFK4GS8","ru4UGe6e4z",
+"tjQxsatef2","9iGoTS2Dfu","jSjS32DREs","ZJTXH0h1b1","azIWpk85Ae","zQt6QStlDJ","55rfBSs0Zu","e6e4zZJTXH","ThjNnS77LH","pv0i7Yf2Ec",
+"pT8wuYOfrY","RsQUqprNT6","QworuThjNn","mX2GEhYBCK","9XyT9pmeCd","h1zcHnnP8o","I7p2am4bxU","QWxoTjiVBP","taOXK8TxD7","Cp3mZcShY2",
+"Qworu1v5hH","W3VFHv8yFN","HlUbFAgJHQ","pmeCdJRJQB","zQt6QRsQUq","4dEz6ZJTXH","djsrvQworu","GrDg7JRJQB","cL0aEZUnqt","7lUXZ9eoRc",
+"FVMxo55rfB","yvOMIRACuj","ciuWzQnJ1S","ZUnqtOxWIH","jfREuQWxoT","o8UydhYBCK","uTacxUl4a1","RpBQma00b5","iwzGk3weIF","B3qemEoToP",
+"b29RJTwano","7ku1pBGaQY","RkQkehe9IA","55rfB580YD","07n1cMGlTF","gdQsSx3LDe","29QAzmz8gx","OxWIHReKEW","M6qcGqQxHP","Mm8siwDajX",
+"GWqqXkB5nP","Y1mC0m4bxU","taOXKzHF1q","M3zXLgtCA5","uupzke6e4z","45cIHWaWsv","5Mg9rSjskQ","XflUqt98iW","DG4sT48cHL","xReecQ6Lix",
+"OHaBzpvgjS","l83UdAXpwE","v1HlnHRxd8","MmsIoCqqaD","Rxrsm4QMc9","0ao3lNcICA","zFgtBcShY2","Twano3otm6","618DiqQxHP","Oz8yZokgRi",
+"suY4x9eoRc","No0QbFwEJz","aFFssCIShG","gdQsSd85a9","Mkgy8yvOMI","OHaBzYjB9t","5ZaEzpAhR1","QYxC016lHc","cQOnvatef2","SmGzvAkKTk",
+"48cHLtaOXK","Yh1hFFNYIM","jzUqR2DREs","SmGzv6AFT0","zbIYY8cVD3","HlUbFnFqik","jSjS3W7cTs","QbxXcQbxXc","wiHrZoVQp6","PYBf4lj07Q",
+"lXFOBaFFss","FPfSEOUYuF","0Wr5yrKDLJ","2TRI7P6bcg","14FLRnlaBy","DG4sTBFkb8","FGzgpfqypy","7Ow5CFxX9q","y94nw7lUXZ","dQ586B3qem",
+"CdyBV14FLR","6AFT0TXQ0Z","iqv4k1LB1L","VBjhzBGaQY","aDGtSLewvM","uPX7GB3qem","NcICABFkb8","SmGzvvkCHH","vkCHHe6e4z","3otm6pT8wu",
+"MmKGJWmadA","prNT6No0Qb","1LB1LuoStw","SbRYy6AFT0","cL0aEd7vjM","pFrrlWaim6","FxX9qNxx9V","CK5W7Z4I1v","FFDuikB5nP","atef2AIYUu",
+"DcpWB7Ow5C","FLsphWDVWJ","1LB1LY1mC0","RsQUqTa8f6","CNHmvlH1kt","pv0i7Cp3mZ","fmIK107n1c","v1Hln2Nslm","Qworu9XyT9","BCxeC0MR5X",
+"azIWppvgjS","rhl0J7Ow5C","Chuy32Nslm","o8UydUl4a1","uTacx1j5L8","KsjRKa00b5","0Kyfs07n1c","djsrvcShY2","UmaEvgjUTu","fmIK1FFDui",
+"o8UydjzUqR","RpBQm16lHc","AXpwEbZLvS","5VZjSpAhR1","jeskSIjTwP","9eoRcFnPFB","CdyBVtAOsr","aL6AJM6qcG","FLsph7hyVv","fqypyuvf7A",
+"dpe1v07n1c","hE1Ql5IhmG","aez9yUlU3M","C2IrccQOnv","b29RJjeskS","piJSkZuDtD","DcpWBjtn0X","guMb8soy9t","FLsph8hJdt","zFgtBlViBv",
+"lm0pDWDVWJ","qaofNt98iW","K20wK8hJdt","ulk41JXljW","ix74r8RCUA","In3NSCfgr3","5drc6iwzGk","d7vjM5Mg9r","QChxsWDVWJ","YjB9t8TxD7",
+"ogLgc5Drn0","jiVBPwDajX","QYxC0jSjS3","L7cGcAIYUu","9rlg9k85Ae","AXpwEMaJQs","4dEz6nnP8o","s4786WaWsv","lCMxyuvf7A","lpF6WyvOMI",
+"ciuWzl83Ud","GXdoHECMvU","i7WMQQClRL","7fsYMPYBf4","JIqXi0h1b1","CNHmvNxx9V","Mm8sicmXIX","RBhp0oVQp6","t98iWZ4I1v","LewvMbgJAz",
+"fcJOybgJAz","iwzGkBFkb8","8RCUAUmaEv","uN6r3jeskS","zFgtB9y4lw","nnP8oSs0Zu","mz8gxFhtgl","0Kyfs5ZaEz","StlDJiwzGk","Nxx9VSbRYy",
+"k85AeVLTy6","t98iWI7p2a","2ZHdkFwEJz","fmIK1UlU3M","O3iyQbZLvS","EdBKcKsjRK","okgRiRmDcr","WPmlxF6PT2","NOHszvLsmS","lweGyxciqp",
+"Cp3mZC2Irc","SWfoubZLvS","ECMvUpv0i7","lpF6WM3zXL","4W0TlWaim6","SmGzvUlU3M","0PktIhi5X7","SmGzvaFFss","lkMUAlsQGo","FPfSEG1RhS",
+"x3LDejzUqR","iB08lFcWrW","MaJQsHlUbF","jfREuWreyP","7fKYUL7cGc","8FmFH1LB1L","Uvlv44dEz6","618DiThjNn","d7vjMLewvM","0YAGHokgRi",
+"aDGtSNxx9V","4QMc9Qworu","AIYUuQ6Lix","FVMxoQ6Lix","Zv7z0s4786","7Ow5CnlaBy","L7cGclj07Q","pvgjS9rlg9","7X3uyQWxoT","pT8wuGrDg7",
+"VerEACNHmv","rKDLJblLA9","xciqpQClRL","CxVEf2Yz7E","y94nwFLsph","6AFT0HfyNQ","t59lRazIWp","okgRivLsmS","ciuWztAOsr","2ZHdkX6Pin",
+"2TRI7Cfgr3","M3zXLhSSvQ","ZUnqtQ6hMC","9rlg9vOqCE","hYBCKOz8yZ","LbRTHulk41","Uvlv4k85Ae","CqqaDGSQwj","fcJOy16lHc","9y4lwAOgEe",
+"AOgEe0BmCy","RACujFxX9q","KsjRKFPfSE","tlILtFGzgp","UlU3MjSjS3","Z4I1vxReec","d7vjMNhXdu","KsjRKrz7Ut","v8yFNzHF1q","fFDrJtAOsr",
+"1j5L8GWqqX","Qworu4dEz6","nFqikJKWYR","MaJQs4W0Tl","lweGyDQimp","uZPqg3otm6","iqv4kjeskS","64s8N0MR5X","RACujQChxs","2DREsGrDg7",
+"BpYhVAgJHQ","M6qcGCqqaD","bgJAz618Di","JJs5mfFDrJ","Dz1R3FwEJz","tjQxsOUYuF","580YDgdQsS","zqH0W618Di","SmGzvFcWrW","MmsIogdQsS",
+"d7vjMChuy3","M6qcGpAhR1","JJs5mdpe1v","bZLvSpvgjS","VNCPdMm8si","lweGyulk41","2Yz7EbgJAz","W7cTs5Namm","cL0aEOxWIH","t59lRzmLYD",
+"CNHmvMmsIo","d85a9RmDcr","VBjhzI7p2a","iwzGkMmsIo","xXTI4BCxeC","HfyNQuPX7G","lH1ktGv3Fq","BpYhVNhXdu","bZLvSY1mC0","FNYIMtaOXK",
+"jfREurhl0J","In3NSBpYhV","KASQ8taOXK","oVQp6OHaBz","RBhp0uJScX","tvdkDxReec","7fKYUOUqFM","JRJQBsoy9t","x3LDe0YAGH","GrDg7s4786",
+"lXFOBzbIYY","i3pydlCMxy","xReecJJs5m","7fsYMBGaQY","CNHmvlViBv","pWiOsMkgy8","O3iyQPOUYS","FhtgloVQp6","618DiVBjhz","prNT6W7cTs",
+"LbRTHgIYvE","IBe8k48cHL","t59lRBCxeC","KsjRKFnPFB","mz8gxDQimp","QbxXc0ao3l","aFFssMaJQs","M3zXLfcJOy","FcWrWWreyP","Q6Lixy94nw",
+"nlaByGv3Fq","fqypyUvlv4","SWfouCfgr3","7fsYMgjUTu","blLA9tuDyS","9eoRcZzJHW","W3VFHDz1R3","2hEEU8FmFH","IBe8kfcwDa","0BmCy1LB1L",
+"ulk41AmdQd","VerEAVBjhz","9rlg9atef2","uupzkuupzk","ThjNnWPmlx","ksJbyzHF1q","XflUqQClRL","Nxx9VfcwDa","7Ow5C0Wr5y","CNHmv5IhmG",
+"8RCUAbrhlQ","uLtKspmeCd","JJs5mIjTwP","GXdoHZ4I1v","zmLYDix74r","B3qemHlUbF","G1RhS5Drn0","xciqpPYBf4","9eoRcQssNC","yToGWU3yw5",
+"pWiOsnlaBy","ZhwG1Qworu","7Ow5CciuWz","VerEAFGzgp","7fKYUni2v1","B3qemFcWrW","DcpWBHP433","nnP8oYw2oU","SjskQix74r","QYxC00h1b1",
+"kB5nPyvOMI","zHF1qDQimp","zQt6QCNHmv","gIYvEoQ87r","ksJbyHfyNQ","9y4lwksJby","5Drn0S2Dfu","8RCUATwano","L7cGctuDyS","fFDrJix74r",
+"SjskQ4QMc9","Cfgr3OUYuF","CK5W7FcWrW","a00b5OxWIH","7hyVvVNCPd","pAhR164s8N","Ta8f6RACuj","RkQkeguMb8","5IhmGnnP8o","jzUqRlH1kt",
+"okgRiP6bcg","0BmCyfqypy","gf8rISWfou","sx5Glrz7Ut","v8yFNRACuj","SjskQJKWYR","yluBxRBhp0","M3zXLF6PT2","RsQUqydG8U","55rfBoGu6x",
+"lViBvMkgy8","BpYhVlH1kt","QworusqVrf","zY1GYFLsph","8cVD39XyT9","NOHsz8xEKz","S2DfuzY1GY","FLsphSbRYy","0YAGHaL6AJ","rhl0J2TRI7",
+"3weIFO3iyQ","0Wr5yVNCPd","cQOnv29QAz","I7p2aCNHmv","tlILt9y4lw","CxVEfprNT6","Cfgr37hyVv","soy9t7lUXZ","guMb8FwEJz","atef2Yf2Ec",
+"8FmFH2hEEU","fqypyuTacx","ECMvUvLsmS","y94nwVIlwP","tAOsrJJs5m","mX2GESs0Zu","a00b58hJdt","14FLRCxVEf","YjB9tCxVEf","rKDLJLewvM",
+"J2mQiRmDcr","ulk41yvOMI","y94nwsx5Gl","fFDrJQWxoT","OUqFMpiJSk","k85Ae7Ow5C","PYBf4SmGzv","WPmlxlXFOB","fqypy8hJdt","lj07QCdyBV",
+"he9IAprNT6","y94nwix74r","dpe1vtlILt","8TxD7J2mQi","v8yFNdmoS7","n1pmOEoToP","lpF6Wdpe1v","0YAGH7hyVv","8FmFHAmdQd","brhlQ5ZaEz",
+"nFqikUmaEv","QYxC0fcJOy","tjQxsfcwDa","FxX9q580YD","ix74rYw2oU","K20wKTXQ0Z","aDGtSrz7Ut","RpBQm580YD","CdyBVDLhzM","jtn0Xt98iW",
+"J2mQiCxVEf","ksJbyoQ87r","zz4ZU64s8N","i3pydChuy3","yluBxk85Ae","LDk6fBGaQY","9XyT9FVMxo","6q6L9JkzUn","6AFT0FNYIM","FFDuiFnPFB",
+"RkQkeS77LH","2Yz7EfFDrJ","G1RhSi3pyd","cShY2AIYUu","aez9yzz4ZU","lm0pDyEfy9","0Wr5yKZamH","2hEEUIBe8k","5Drn07Ow5C","yToGWSmGzv",
+"fFDrJ9rlg9","QbxXcaL6AJ","d7vjM5nmWv","StlDJPOUYS","iwzGkChuy3","mX2GEvOqCE","1j5L8FPfSE","IRh48XyPZN","G1RhS5IhmG","euZA5WmadA",
+"24ARFmz8gx","yofH3QbxXc","DLhzM4W0Tl","6AFT0RBhp0","DLhzMxXTI4","M3zXLo8Uyd","o8UyddhSuH","NhXdulpF6W","dhSuHuN6r3","BbwgAxReec",
+"pT8wulkMUA","StlDJdQ586","lsQGoJRJQB","l83Ud0YAGH","aL6AJD6rBy","x3LDeMmKGJ","8FmFHiwzGk","VjCZq0Kyfs","WreyPi3pyd","16lHcIRh48",
+"YjB9tjtn0X","8cVD3J2mQi","5drc6Yh1hF","vLsmSt98iW","h1zcHb29RJ","xReecCqqaD","VerEAqaofN","sx5GlKsjRK","NOHszeuZA5","lCMxyStlDJ",
+"5IhmGzbIYY","hYBCK6q6L9","aL6AJi7WMQ","soy9tyluBx","t98iW9eoRc","jeskSyEfy9","K4GS8nnP8o","soy9tNAFuw","5drc6KASQ8","MaJQsReKEW",
+"e6e4ztAOsr","CdyBVlCMxy","QbxXcSmGzv","MezSWpFrrl","lH1ktAXpwE","nnP8oEdBKc","6q6L9HzZT8","BpYhVFPfSE","uLtKszmLYD","I7p2azY1GY",
+"tl72WMmKGJ","BpYhVAOgEe","zY1GYThjNn","8U2nUS77LH","IKxdLAmdQd","BGaQY618Di","0BmCyIn3NS","pWiOswiHrZ","iB08l24ARF","5IhmGxReec",
+"HP433tl72W","OxWIHfcwDa","Ul4a1No0Qb","FjHXRD6rBy","m4bxUSmGzv","ReKEWPOUYS","euZA5tl72W","n1pmOTa8f6","jeskS5VZjS","zY1GYF6PT2",
+"B3qemi3pyd","VerEAQnJ1S","NOHszokgRi","9eoRcK4GS8","jzUqROxWIH","cShY29eoRc","aL6AJYw2oU","8U2nU2ZHdk","xciqpvLsmS","LDk6fCIShG",
+"guMb8M3zXL","4QMc9QYxC0","NcICAi3pyd","55rfBgjUTu","gdQsSiwzGk","y94nwh1zcH","AkKTkdhSuH","fcwDaMaJQs","m4bxUiwzGk","Chuy3PYBf4",
+"FwEJz29QAz","Twanohe9IA","pmeCdJ2mQi","0MR5XCfgr3","55rfBt59lR","fmIK18RCUA","aDGtS3otm6","ciuWzuN6r3","GSQwjAXpwE","gtCA5pv0i7",
+"Oz8yZrhl0J","YjB9tEoToP","zY1GYix74r","dhSuHJRJQB","HzZT8Chuy3","FNYIM7fKYU","7Ow5CxXTI4","M3zXLRpBQm","fcwDazmLYD","S77LHTXQ0Z",
+"nFqikpiJSk","45cIHW3VFH","IjTwPm4bxU","ZzJHWZUnqt","QYxC0KZamH","lm0pDNOHsz","EoToPIjTwP","jeskSTCgPp","9GXkXQChxs","0h1b10h1b1",
+"5iGN5gIYvE","vLsmS7X3uy","yofH38RCUA","tjQxsRBhp0","618DiaFFss","JJs5muupzk","2TRI7EdBKc","Ta8f6M3zXL","gIYvE3weIF","SmGzvbgJAz",
+"gjUTum4bxU","C2IrczFgtB","aL6AJk85Ae","m4bxU6AFT0","2ZHdksqVrf","8RCUAMGlTF","6q6L9AkKTk","ogLgcDLhzM","yvOMIVBjhz","aL6AJs4786",
+"3otm6yToGW","uoStw5Drn0","OxWIHAgJHQ","BpYhVZuDtD","In3NSPYBf4","NhXdu5Mg9r","Pb1pauN6r3","SbRYyWMiS3","FcWrWtvdkD","lsQGoCqqaD",
+"JIqXiFnPFB","uupzk2Nslm","prNT6lCMxy","b29RJQ6Lix","8RCUAHzZT8","2NslmG1RhS","rz7UtFcWrW","GSQwjAmdQd","lXFOBt59lR","NAFuwFcWrW",
+"9rlg9G1RhS","Yw2oUBCxeC","9rlg9zY1GY","uupzkydG8U","b29RJ0YAGH","FLsphv8yFN","IRh48VerEA","rz7Utix74r","7fKYUQYxC0","YjB9tjeskS",
+"lj07Qh1zcH","FGzgpjeskS","WmadAD6rBy","Ta8f6zFgtB","9rlg9jfREu","YjB9t7fKYU","CNHmvuoStw","euZA58TxD7","ThjNnd7vjM","VerEAQWxoT",
+"faHirokgRi","hi5X7lCMxy","48cHLtlILt","pFrrldhSuH","RmDcrlm0pD","lH1kthe9IA","HRxd8CNHmv","8U2nUHzZT8","hYBCK0Kyfs","5Namm7lUXZ",
+"MaJQsQ6Lix","PYBf4RzaZA","ThjNnzQt6Q","brhlQUl4a1","9XyT9lm0pD","UlU3MaDGtS","8FmFH3otm6","XyPZNVprf2","WPmlxuupzk","atef2FPfSE",
+"U3yw5uvf7A","oGu6xS77LH","cShY2lm0pD","Ta8f6fLNg8","FLsphG1RhS","GSQwjmX2GE","vOqCEK4GS8","rhl0JogLgc","K4GS8OUYuF","iqv4kQworu",
+"EoToP24ARF","jiVBPMojnP","mz8gxtjQxs","euZA5v1Hln","Cp3mZBCxeC","6AFT0S77LH","uQIczuQIcz","nFqikuLtKs","9y4lwJXljW","taOXKEOE1o",
+"7fsYMCIShG","MojnPXflUq","h1zcHulk41","Chuy3jS1aj","hSSvQJkzUn","pv0i7ReKEW","64s8NGSQwj","W3VFH7Ow5C","yofH3Kr8ys","Zv7z0FjHXR",
+"NOHszFVMxo","HP433lpF6W","uvf7Adpe1v","CK5W7tlILt","4dEz6uLtKs","zz4ZUvLsmS","d7vjM14FLR","prNT6uZPqg","SjskQmz8gx","M3zXLuJScX",
+"580YDEoToP","tuDySzmLYD","qUJMdsoy9t","JKWYRprNT6","DcpWBPOUYS","Q6hMCFnPFB","2Yz7EVjCZq","fLNg8HRxd8","t98iWaDGtS","QssNCJIqXi",
+"8hJdtzmLYD","0YAGHyluBx","WmadAQYxC0","CK5W7BpYhV","8U2nUF6PT2","VLTy6h1zcH","v1HlnUl4a1","aDGtSlViBv","16lHcuAWyp","zqH0W2hEEU",
+"IBe8kUlU3M","X6PinCdyBV","pT8wu5Mg9r","prNT6zmLYD","vOqCEmz8gx","yluBx618Di","9y4lwlweGy","NAFuwhe9IA","s7MxkFFDui","FxX9qlCMxy",
+"5VZjSIjTwP","guMb8uvf7A","Yh1hFChuy3","2DREs3otm6","LDk6fv2eC3","580YDhi5X7","IjTwP9rlg9","prNT60Kyfs","5Drn0k85Ae","3otm6Y1mC0",
+"QClRLFjHXR","0Wr5yzqH0W","vOqCESs0Zu","BGaQYuvf7A","pvgjS0YAGH","Mkgy8Yh1hF","SmGzvwDajX","lm0pDtlILt","D6rByPOUYS","VjCZqSs0Zu",
+"lm0pD0MR5X","Z4I1v5iGN5","sx5GlOxWIH","55rfBfLNg8","IRh48zHF1q","t59lRdQ586","PYBf4Gv3Fq","DQimpciuWz","LbRTHxciqp","DLhzMFLsph",
+"FGzgp8RCUA","fcJOyCdyBV","GSQwjZv7z0","Cp3mZ45cIH","s93MlW3VFH","ThjNn6AFT0","WmadApv0i7","S2DfuRpBQm","uJScXCfgr3","S77LHuPX7G",
+"55rfB9GXkX","1j5L8VNCPd","zbIYYdhSuH","jtn0XQbxXc","LbRTHCdyBV","uTacxKr8ys","0PktI7X3uy","cQOnvhE1Ql","AmdQdL7cGc","AkKTkh1zcH",
+"zbIYY9XyT9","BGaQY0Wr5y","d85a9DcpWB","wDajXlViBv","DcpWBnnP8o","yvOMI580YD","VNCPdFFDui","W7cTsvOqCE","DcpWBEoToP","0MR5XD6rBy",
+"GXdoHO3iyQ","ix74rNhXdu","n1pmO5nmWv","W7cTsRsQUq","nlaByP6bcg","VIlwPKsjRK","jeskSZUnqt","0ao3loQ87r","S77LHFxX9q","BpYhVFFDui",
+"LDk6fuZPqg","TwanoXflUq","G1RhSQbxXc","ECMvU7fsYM","5VZjSyEfy9","rhl0Jhi5X7","s93MlQnJ1S","ulk41i7WMQ","StlDJU3yw5","jtn0XPOUYS",
+"Yw2oUFjHXR","2ZHdk0h1b1","d7vjMd85a9","iB08luoStw","I7p2al83Ud","IjTwPv2eC3","4W0Tllj07Q","vLsmStvdkD","ReKEW9XyT9","NOHszCxVEf",
+"Waim6he9IA","StlDJlpF6W","gIYvEi3pyd","Yw2oU5Namm","GSQwjuN6r3","IBe8k8FmFH","lXFOBiqv4k","BCxeCAXpwE","VNCPd64s8N","VNCPd5drc6",
+"580YDfmIK1","IRh48ni2v1","9y4lw5Namm","yluBxMkgy8","Kr8ysB3qem","NcICAulk41","2TRI7Yf2Ec","5Mg9rmz8gx","5iGN50ao3l","45cIHLbRTH",
+"MezSWXyPZN","NOHszfFDrJ","8FmFHWreyP","POUYSeuZA5","No0QboGu6x","suY4xhi5X7","SjskQuTacx","prNT6OUYuF","RkQkelXFOB","jS1ajuPX7G",
+"5IhmGoVQp6","U3yw5Waim6","ciuWzIRh48","JRJQB7Ow5C","lm0pD4QMc9","FPfSEUl4a1","7fsYMxReec","ZzJHWQworu","StlDJ5IhmG","uLtKsNOHsz",
+"7fsYM0BmCy","0MR5XFwEJz","MojnPCdyBV","fqypyWDVWJ","FjHXRyvOMI","blLA9VNCPd","tvdkDMkgy8","Z4I1vuvf7A","e6e4zGSQwj","jeskSECMvU",
+"EoToPuoStw","IRh485IhmG","GSQwjtaOXK","1j5L85IhmG","0BmCyRBhp0","CNHmvazIWp","soy9t7ku1p","LbRTHyofH3","sx5Gljtn0X","brhlQuupzk",
+"hE1QlL7cGc","VBjhzpmeCd","No0Qbi3pyd","h1zcHJXljW","AgJHQB3qem","ciuWzlpF6W","jiVBPUl4a1","azIWpNhXdu","HRxd8Dz1R3","XflUqVNCPd",
+"1LB1LECMvU","Yf2EcFwEJz","8TxD7NAFuw","ZhwG1QYxC0","7ku1p2Nslm","aez9ym4bxU","uTacxW7cTs","ulk41PYBf4","8hJdt45cIH","K4GS8m4bxU",
+"BpYhV580YD","MK07YMaJQs","uQIczQ6hMC","Waim6aDGtS","4W0Tl2DREs","14FLRKr8ys","pv0i7faHir","nnP8oyEfy9","5nmWv8cVD3","HRxd8uupzk",
+"fLNg8t98iW","uQIczFNYIM","t59lR2ZHdk","lCMxytjQxs","uupzk618Di","pT8wucmXIX","VLTy6J2mQi","AgJHQGXdoH","FnPFBlsQGo","BCxeCaez9y",
+"Ta8f65Drn0","Ss0ZuRkQke","cmXIXBpYhV","OUqFMiKqhr","ZhwG1blLA9","QnJ1SbZLvS","aDGtSQYxC0","AIYUutAOsr","GSQwjYf2Ec","AmdQdzz4ZU",
+"zmLYDfcJOy","gdQsSlweGy","DG4sTdQ586","nlaByy94nw","fcJOylsQGo","Mkgy8uN6r3","OUqFMSmGzv","blLA9FcWrW","t98iWazIWp","WmadAKsjRK",
+"4QMc9HP433","gIYvEUl4a1","7hyVvUlU3M","wiHrZuupzk","tlILtQworu","HfyNQmX2GE","MmKGJpv0i7","0MR5XWDVWJ","IKxdLFVMxo","oQ87rgdQsS",
+"QnJ1SW3VFH","pWiOsWreyP","5iGN5Fhtgl","lkMUAaez9y","KsjRKyofH3","OHaBzCNHmv","ReKEWaFFss","oGu6xFwEJz","StlDJ0h1b1","tAOsr9GXkX",
+"7ku1pi3pyd","CdyBV7fsYM","2NslmMm8si","nnP8olkMUA","Yw2oU0h1b1","0MR5X7fsYM","djsrvpiJSk","UmaEvuQIcz","oGu6xVprf2","8xEKzulk41",
+"gdQsS8U2nU","a00b5WPmlx","16lHc8FmFH","bgJAzdhSuH","xReecjS1aj","lXFOBYw2oU","Cfgr3KZamH","Kr8yscL0aE","a00b5WmadA","hUTw7KsjRK",
+"CqqaDYjB9t","3otm6SbRYy","55rfBGWqqX","UlU3Ms7Mxk","NAFuwlm0pD","8cVD3DQimp","fqypyoVQp6","MojnP580YD","MmKGJlkMUA","s4786suY4x",
+"07n1c7lUXZ","zHF1qJKWYR","BCxeCeuZA5","9iGoTOxWIH","VBjhzNcICA","S77LHRACuj","uQIczsoy9t","RmDcr7fsYM","K4GS8AOgEe","lkMUAQworu",
+"okgRiF6PT2","s4786t59lR","djsrv8cVD3","QnJ1Si7WMQ","4QMc9IBe8k","Uvlv4uAWyp","uupzkuN6r3","ksJbyG1RhS","8FmFHYw2oU","pvgjShYBCK",
+"TCgPphSSvQ","DQimpsqVrf","hE1QlJIqXi","HzZT8lsQGo","NAFuwCqqaD","PYBf4W7cTs","taOXK580YD","AXpwE1LB1L","Ta8f6prNT6","dpe1vSbRYy",
+"BFkb8O3iyQ","hSSvQHRxd8","hYBCKTXQ0Z","Ta8f616lHc","6q6L9D6rBy","1j5L8okgRi","29QAzM6qcG","Rxrsm8TxD7","DcpWBkB5nP","SWfouJJs5m",
+"Ss0ZuGSQwj","jfREukZANm","uJScXgIYvE","FnPFB2Yz7E","lweGycL0aE","5Namm8FmFH","ix74rsx5Gl","zY1GYFhtgl","FxX9qdmoS7","0ao3l618Di",
+"ogLgckZANm","Gv3FqBbwgA","HlUbFZuDtD","P6bcgxXTI4","BGaQYpT8wu","azIWpDcpWB","5nmWvD6rBy","8TxD7pT8wu","pv0i7WreyP","45cIHAXpwE",
+"cQOnvGrDg7","QClRLzHF1q","NcICAQWxoT","TwanoMkgy8","dhSuHzY1GY","pv0i7RmDcr","Vprf2tuDyS","GrDg7fLNg8","OxWIHVLTy6","tvdkD8RCUA",
+"2hEEUVNCPd","rz7Utulk41","AmdQd64s8N","FcWrW7lUXZ","K4GS814FLR","WDVWJd85a9","ydG8UM6qcG","azIWpJJs5m","No0QbG1RhS","TCgPpv2eC3",
+"IBe8kzY1GY","FwEJz8hJdt","oGu6xWMiS3","QssNCs4786","cL0aEcL0aE","azIWpWMiS3","fcJOyHlUbF","FnPFBDcpWB","ZUnqtFwEJz","SWfoufmIK1",
+"6AFT02Yz7E","iwzGk7lUXZ","ZzJHWFwEJz","7X3uyvkCHH","nlaByNhXdu","dmoS7GXdoH","AkKTks7Mxk","7hyVvWreyP","SbRYyYjB9t","lpF6Wfqypy",
+"0BmCyAkKTk","AOgEeFwEJz","dQ586pAhR1","5IhmGLbRTH","zQt6QvkCHH","zQt6QECMvU","uQIczMmsIo","hE1Qlulk41","ReKEWyofH3","LewvMMkgy8",
+"IjTwPuTacx","2DREs45cIH","9y4lwVLTy6","FFDuicShY2","KsjRKuoStw","x3LDefcJOy","24ARFFGzgp","FPfSEUmaEv","GrDg7AgJHQ","o8UydVNCPd",
+"rz7UtTa8f6","aez9ylCMxy","kZANmBbwgA","X6PinYw2oU","WPmlxDQimp","SjskQ0PktI","pAhR1ZhwG1","QYxC03weIF","2DREsLewvM","8xEKzAgJHQ",
+"3otm6ni2v1","Q6hMCfLNg8","nnP8o0Wr5y","qUJMd5drc6","DQimpb29RJ","XflUq64s8N","piJSkO3iyQ","RmDcri7WMQ","xciqpvOqCE","zY1GYZv7z0",
+"6AFT05IhmG","oQ87rQssNC","oQ87rOUYuF","uZPqgZhwG1","EdBKci7WMQ","RmDcrs93Ml","yToGWeuZA5","LbRTHnFqik","C2Irc0ao3l","uJScXKr8ys",
+"ECMvU8RCUA","9eoRczFgtB","cmXIXIKxdL","euZA5mX2GE","XyPZNlweGy","S2Dfuiqv4k","ZhwG1hUTw7","BFkb8Vprf2","jiVBPEOE1o","mz8gx45cIH",
+"suY4xW3VFH","2TRI7taOXK","Ta8f6GWqqX","7lUXZQnJ1S","uN6r3n8pJ9","OxWIHFVMxo","pWiOsSWfou","zQt6QIRh48","5iGN5WPmlx","pAhR17hyVv",
+"LewvMCdyBV","jzUqRZzJHW","d85a90YAGH","aez9ys4786","gjUTuMkgy8","PYBf4MmKGJ","tjQxsBCxeC","OxWIHLewvM","FFDuiI7p2a","3weIFFwEJz",
+"bZLvSaFFss","hYBCKa00b5","wiHrZFGzgp","brhlQmX2GE","oVQp6WMiS3","Waim6Chuy3","AmdQdW7cTs","Yf2EccShY2","C2IrcKsjRK","JJs5mS2Dfu",
+"uQIczNcICA","vkCHHni2v1","L7cGc2ZHdk","SbRYyzQt6Q","0PktItAOsr","NOHszZzJHW","iqv4kOHaBz","WPmlxS2Dfu","TwanoRpBQm","HlUbFs93Ml",
+"Cp3mZIKxdL","zqH0WNxx9V","8FmFHMezSW","K4GS84W0Tl","yEfy92hEEU","OHaBzUl4a1","zHF1qLbRTH","0h1b1G1RhS","QChxshYBCK","C2Irc5nmWv",
+"uvf7AaL6AJ","7fsYMQbxXc","M6qcGNOHsz","J2mQihe9IA","pmeCdIRh48","FwEJzSs0Zu","gf8rIv1Hln","XflUqQworu","C2IrcMmKGJ","GXdoHzQt6Q",
+"b29RJdmoS7","Oz8yZFjHXR","2hEEUrz7Ut","WMiS3DcpWB","uupzkMmsIo","2NslmVjCZq","iwzGkDG4sT","pFrrlOUqFM","Chuy3IBe8k","e6e4zjzUqR",
+"lCMxyEdBKc","fFDrJmX2GE","X6PinBFkb8","atef2DG4sT","5ZaEz5Namm","0YAGH1LB1L","SjskQ3weIF","Twanosoy9t","tuDySHzZT8","fqypyrz7Ut",
+"MojnPfcwDa","AgJHQuupzk","DQimpBpYhV","djsrvVLTy6","uoStwyofH3","X6PinlViBv","tvdkDFwEJz","ZJTXHAkKTk","a00b5nlaBy","IjTwPQ6hMC",
+"prNT65drc6","uJScX6AFT0","IKxdLs4786","DG4sTiqv4k","Mm8siaL6AJ","Cp3mZgIYvE","uupzkvkCHH","pAhR1KsjRK","vLsmSlXFOB","EOE1oG1RhS",
+"NAFuwJXljW","O3iyQ8hJdt","NhXduy94nw","Gv3Fqs7Mxk","okgRidQ586","vOqCEuvf7A","VNCPdBCxeC","Y1mC0FGzgp","7fKYU8TxD7","RACuj2TRI7",
+"RsQUqazIWp","8TxD7DQimp","pFrrlFPfSE","ThjNnXyPZN","oQ87rFnPFB","Mm8siOz8yZ","ZUnqtWreyP","brhlQ7ku1p","VjCZqxciqp","lj07QZUnqt",
+"n8pJ9dpe1v","NOHszNAFuw","brhlQpT8wu","vkCHHNcICA","WMiS3iwzGk","gjUTuUvlv4","v8yFNFNYIM","ThjNnECMvU","zY1GYogLgc","RkQke14FLR",
+"YjB9tMmsIo","No0Qbuvf7A","jSjS3Rxrsm","9y4lwuoStw","5NammhE1Ql","gtCA5VLTy6","pv0i7gdQsS","suY4xuLtKs","KASQ8JJs5m","9GXkX8FmFH",
+"jfREuThjNn","GrDg79y4lw","29QAz5iGN5","ZJTXHS77LH","BGaQY5VZjS","CqqaDm4bxU","ni2v1lj07Q","jiVBP2ZHdk","oQ87rZ4I1v","5Drn0Oz8yZ",
+"e6e4z9eoRc","0KyfsuAWyp","YjB9ti3pyd","CxVEf0MR5X","hi5X7qUJMd","RpBQmFGzgp","cQOnvFPfSE","azIWpbgJAz","24ARFF6PT2","X6PinjSjS3",
+"tuDySF6PT2","aDGtS7fKYU","KsjRKfaHir","yEfy9piJSk","NOHszPOUYS","YjB9tksJby","M6qcGjeskS","LewvMlCMxy","JKWYRzbIYY","LbRTH9GXkX",
+"6AFT045cIH","4QMc96AFT0","uJScXb29RJ","JRJQBZhwG1","Waim6nFqik","h1zcH5Drn0","In3NSVIlwP","POUYSPb1pa","ogLgcHfyNQ","SWfouXyPZN",
+"FLsphBCxeC","JXljWdhSuH","zz4ZUlj07Q","pmeCdMkgy8","LDk6fQbxXc","24ARF2ZHdk","QClRLX6Pin","Z4I1vNOHsz","IRh48hYBCK","4W0TlECMvU",
+"cQOnvPb1pa","KZamHK4GS8","aez9yOUqFM","FnPFBdhSuH","m4bxUWPmlx","uupzkWmadA","GrDg7MojnP","dmoS72TRI7","HlUbFYjB9t","9y4lwvkCHH",
+"Ss0ZuKr8ys","jtn0X0ao3l","CdyBVOUqFM","TwanoRACuj","t98iWtl72W","uZPqgpvgjS","Kr8ysOxWIH","07n1cZuDtD","Kr8ysMm8si","xReecMK07Y",
+"aez9yjiVBP","AgJHQ5Drn0","t59lRWPmlx","CIShG16lHc","FNYIMqQxHP","uN6r3CqqaD","rhl0JO3iyQ","iwzGkhe9IA","soy9t8TxD7","fFDrJWmadA",
+"k85AeFFDui","lXFOBfLNg8","9GXkXPb1pa","8cVD33weIF","8RCUAaez9y","GrDg7qaofN","FjHXRFhtgl","kZANmlViBv","zFgtBru4UG","RpBQmgf8rI",
+"ni2v15iGN5","VIlwPChuy3","IBe8ksoy9t","RpBQm2ZHdk","Gv3Fqaez9y","8cVD314FLR","y94nwZv7z0","0ao3lUmaEv","QWxoTjeskS","pWiOsFjHXR",
+"JXljWlCMxy","yToGW07n1c","55rfB9XyT9","SbRYyZuDtD","BFkb8YOfrY","gIYvECdyBV","CxVEfM6qcG","brhlQfqypy","i7WMQYh1hF","hUTw75IhmG",
+"s47867ku1p","e6e4zpv0i7","k85AeOUqFM","45cIHfcwDa","yEfy9bgJAz","x3LDeIKxdL","NOHszlXFOB","M3zXLcQOnv","HP433o8Uyd","hE1QlRpBQm",
+"KASQ8gdQsS","kB5nPNOHsz","HP433FNYIM","GXdoHSs0Zu","taOXKGrDg7","iqv4koGu6x","v8yFNPYBf4","OUYuFZzJHW","FFDuiPYBf4","d85a9guMb8",
+"0MR5XQChxs","kZANmt98iW","StlDJiqv4k","guMb8djsrv","D6rByydG8U","NcICAuJScX","ZhwG1zHF1q","iB08lECMvU","MojnPRzaZA","d85a9xciqp",
+"hYBCKQWxoT","5IhmGpmeCd","WreyPMmKGJ","nFqikBbwgA","xXTI4FGzgp","FhtglYf2Ec","Kr8ysVLTy6","FFDuiUmaEv","CxVEfiqv4k","OHaBz4W0Tl",
+"QYxC0Z4I1v","EdBKc4QMc9","lweGyCdyBV","brhlQgjUTu","5VZjSs93Ml","uJScXC2Irc","gf8rI0h1b1","zY1GYWmadA","Cfgr3No0Qb","POUYS5ZaEz",
+"v2eC3uoStw","M3zXLsqVrf","cQOnvyvOMI","FGzgpI7p2a","AOgEeUlU3M","pT8wuwiHrZ","jiVBPa00b5","RsQUqcShY2","5Mg9rDz1R3","qaofN1LB1L",
+"qaofNn8pJ9","y94nwWMiS3","oGu6xAmdQd","CxVEfxciqp","6q6L9QChxs","FNYIMMK07Y","29QAz7Ow5C","TXQ0ZTCgPp","zqH0WgjUTu","zQt6QHlUbF",
+"lpF6WDz1R3","cQOnvIBe8k","Qworul83Ud","DcpWBjeskS","xReecWmadA","cShY264s8N","IBe8k24ARF","IjTwPlsQGo","3otm6POUYS","yEfy91j5L8",
+"dpe1vZ4I1v","HzZT8P6bcg","Cfgr3Mkgy8","faHirjiVBP","FcWrWU3yw5","rKDLJiB08l","zz4ZUjSjS3","zQt6QHfyNQ","taOXKoQ87r","mz8gxd7vjM",
+"he9IAOUYuF","0MR5XAmdQd","rhl0J0ao3l","MmKGJ2Yz7E","pAhR1CxVEf","h1zcHhE1Ql","NAFuwPOUYS","2ZHdkpWiOs","P6bcgi7WMQ","brhlQFhtgl",
+"2hEEUguMb8","2hEEU5IhmG","hSSvQQWxoT","8hJdtd85a9","WPmlxqQxHP","Oz8yZIn3NS","ydG8UpmeCd","sqVrfs4786","FxX9qQYxC0","Fhtgl48cHL",
+"RmDcr618Di","SjskQ14FLR","FNYIM24ARF","Zv7z0d7vjM","lkMUAsoy9t","NhXdugjUTu","rz7UtaL6AJ","tjQxs64s8N","v1HlnfmIK1","JkzUnv8yFN",
+"P6bcgxciqp","8hJdtTXQ0Z","Yf2EcmX2GE","nnP8oQWxoT","nlaByoGu6x","aDGtS1v5hH","GWqqXuN6r3","SmGzv2TRI7","lpF6WlpF6W","gtCA51v5hH",
+"5Drn0tAOsr","nnP8o1LB1L","POUYS5Mg9r","HfyNQHfyNQ","fFDrJgtCA5","FcWrWrz7Ut","yEfy9QssNC","JXljWRmDcr","rKDLJ6q6L9","jfREuQYxC0",
+"OUqFMatef2","jiVBPhYBCK","uJScXyvOMI","tjQxsBpYhV","2Yz7E55rfB","AOgEeQClRL","7X3uyLewvM","ZhwG1QnJ1S","8U2nUAkKTk","uvf7AOz8yZ",
+"KZamHeuZA5","5Namm5nmWv","fqypy2ZHdk","lH1ktRACuj","blLA9qQxHP","a00b5gjUTu","ogLgcfaHir","iKqhrm4bxU","FVMxoWreyP","GXdoHUlU3M",
+"9y4lw0Wr5y","Nxx9VpFrrl","EoToPs93Ml","soy9t6AFT0","Waim6QnJ1S","faHirpv0i7","XyPZNhE1Ql","t59lRsoy9t","07n1cAXpwE","pT8wuuTacx",
+"0MR5XtlILt","uoStwRpBQm","lViBvHP433","hi5X7IKxdL","ZuDtDs4786","iqv4kWreyP","n8pJ9FxX9q","9eoRcn1pmO","1v5hHAIYUu","gf8rIzY1GY",
+"RACujiqv4k","JXljWEoToP","BpYhVaL6AJ","HzZT8x3LDe","cQOnvi7WMQ","xXTI4CxVEf","zbIYYjS1aj","pAhR1rhl0J","ZhwG1yluBx","Cfgr3bgJAz",
+"ogLgclkMUA","Kr8ysvOqCE","dhSuHMmsIo","lj07Qpv0i7","t98iW4dEz6","Zv7z0jfREu","MezSW2DREs","IRh48h1zcH","FNYIMbgJAz","4dEz6CK5W7",
+"P6bcgYf2Ec","07n1caez9y","9XyT9fqypy","8xEKzKASQ8","CK5W7s4786","x3LDeOz8yZ","BCxeC3otm6","cmXIXJRJQB","dhSuHCqqaD","pv0i7wiHrZ",
+"VerEAY1mC0","QnJ1SxXTI4","Y1mC0RzaZA","iB08lMezSW","Ul4a1VLTy6","RpBQm48cHL","VNCPd7fsYM","2Yz7EXyPZN","LbRTHdhSuH","b29RJM3zXL",
+"djsrvBCxeC","zHF1qFjHXR","7lUXZsoy9t","StlDJFjHXR","BCxeC0PktI","P6bcgRzaZA","CxVEfDcpWB","HfyNQQYxC0","euZA5Fhtgl","No0QbVjCZq",
+"pmeCd8TxD7","JKWYRLbRTH","b29RJuoStw","Dz1R3uTacx","yToGWUvlv4","AmdQdokgRi","Gv3FqXflUq","RsQUquTacx","7Ow5C8FmFH","MmKGJMezSW",
+"Cp3mZiB08l","kZANm45cIH","Gv3FqPYBf4","S2DfuJIqXi","iqv4kM6qcG","DQimp0ao3l","lsQGoTXQ0Z","EoToPS2Dfu","9GXkXMkgy8","OxWIH0Kyfs",
+"ulk419eoRc","7fKYUYf2Ec","QssNCwiHrZ","FhtglAOgEe","3otm65VZjS","BCxeCEoToP","ksJbyNhXdu","piJSkYh1hF","VLTy6zz4ZU","LbRTHDz1R3",
+"okgRilViBv","vkCHH5Namm","RBhp0WreyP","gf8rICfgr3","v8yFNMm8si","9y4lw14FLR","lkMUAzmLYD","4dEz6HP433","nlaByzqH0W","8cVD3SWfou",
+"hE1Ql2hEEU","k85Ae0YAGH","y94nwzQt6Q","v1HlnlsQGo","7X3uyFPfSE","gf8rI2hEEU","pv0i79rlg9","okgRi2hEEU","pv0i7IjTwP","wiHrZfqypy",
+"fFDrJ29QAz","kB5nP6q6L9","lweGyMkgy8","cL0aEQWxoT","VBjhzsx5Gl","AOgEesqVrf","9XyT9RkQke","U3yw5EOE1o","ZJTXH5nmWv","lweGysuY4x",
+"RpBQmFFDui","wiHrZQYxC0","In3NSTCgPp","9GXkX618Di","DQimpiqv4k","rKDLJ29QAz","FjHXRiqv4k","JkzUnO3iyQ","07n1cWDVWJ","8FmFHs4786",
+"QssNCsoy9t","14FLRFGzgp","FFDui580YD","IKxdLUl4a1","0PktIOUqFM","uPX7GK4GS8","K20wKbrhlQ","x3LDegjUTu","XflUqMK07Y","fcwDab29RJ",
+"U3yw50ao3l","soy9tkB5nP","CIShGJ2mQi","DG4sT8RCUA","bZLvS0ao3l","PYBf4FFDui","0KyfsSs0Zu","MmsIo1LB1L","5IhmG9rlg9","Fhtglh1zcH",
+"Kr8ysuJScX","t59lRMojnP","v1HlnazIWp","VerEAulk41","618DiMojnP","Zv7z0qUJMd","pT8wupvgjS","azIWpgIYvE","I7p2aSjskQ","KZamHiB08l",
+"DcpWB9GXkX","WaWsvGWqqX","brhlQ7fKYU","M6qcGzHF1q","Gv3FqB3qem","55rfBTa8f6","G1RhSd7vjM","GXdoH3otm6","BpYhV8hJdt","okgRiBCxeC",
+"7ku1pazIWp","gdQsSv1Hln","SjskQlkMUA","QbxXcs7Mxk","VBjhzIKxdL","ciuWzix74r","HzZT8sx5Gl","sx5GlyEfy9","nFqikk85Ae","GSQwjzqH0W",
+"GrDg7zmLYD","rz7UtWaim6","Yh1hFyvOMI","MezSWkB5nP","hSSvQtaOXK","JJs5mQbxXc","FLsphgtCA5","XyPZNECMvU","LbRTHjzUqR","2Yz7EzY1GY",
+"zmLYDX6Pin","uJScXfqypy","uN6r3XyPZN","uZPqgokgRi","48cHLsx5Gl","Yh1hFzHF1q","Vprf26q6L9","zbIYYxXTI4","BbwgAIRh48","fcwDaatef2",
+"s93MltjQxs","VLTy6QnJ1S","dhSuHcShY2","JRJQBYf2Ec","M6qcGJkzUn","gdQsSfqypy","GSQwjQChxs","Ss0ZunnP8o","pv0i7lCMxy","7X3uyMezSW",
+"BpYhVGSQwj","vkCHHJIqXi","YjB9tfcJOy","JXljW55rfB","v1Hlnuvf7A","o8UydRzaZA","gtCA52TRI7","SWfoucL0aE","QnJ1SHlUbF","MmKGJk85Ae",
+"v2eC3XflUq","CdyBVVerEA","5IhmGZv7z0","GWqqX64s8N","U3yw5n1pmO","QChxsPb1pa","Oz8yZogLgc","No0QblXFOB","ZhwG1ulk41","Mm8si9iGoT",
+"jS1ajjzUqR","MojnPIKxdL","mz8gxpvgjS","SWfoum4bxU","RBhp0LDk6f","JXljWl83Ud","IKxdL16lHc","n8pJ9IRh48","EdBKc8TxD7","AgJHQ1v5hH",
+"7Ow5ClkMUA","ECMvUv2eC3","U3yw5VLTy6","9eoRcfFDrJ","QnJ1Sd7vjM","Gv3FqTCgPp","7fsYMFNYIM","WMiS3ciuWz","0ao3lAIYUu","7ku1pjS1aj",
+"uLtKsblLA9","s93MlFhtgl","F6PT20MR5X","hi5X77Ow5C","GXdoHtuDyS","e6e4zdpe1v","5IhmGni2v1","ulk41uN6r3","Mm8siEoToP","1LB1L618Di",
+"MK07YpT8wu","EOE1oiwzGk","yToGW2ZHdk","KZamHnnP8o","Mm8siguMb8","BFkb8FjHXR","SWfouBbwgA","jfREuBGaQY","y94nwYOfrY","vOqCEuLtKs",
+"3otm6Mm8si","OUqFMpFrrl","Waim6lsQGo","Z4I1vCNHmv","rKDLJWPmlx","WaWsvrhl0J","jzUqRpv0i7","U3yw5MGlTF","DQimpMmKGJ","jSjS30Kyfs",
+"kZANmfcJOy","hi5X7F6PT2","pv0i7IKxdL","CNHmvS77LH","lm0pDAgJHQ","rz7UtdmoS7","n1pmOfLNg8","xReecFnPFB","5drc6CK5W7","AIYUuNhXdu",
+"v2eC3v1Hln","BCxeCFnPFB","IRh48Uvlv4","xXTI4zY1GY","pFrrlStlDJ","WPmlxUvlv4","FcWrWQworu","hi5X71v5hH","dpe1vuvf7A","W7cTsVerEA",
+"OHaBzdQ586","hUTw7nlaBy","ECMvUMGlTF","Yw2oUlViBv","ogLgctuDyS","oGu6xv1Hln","SbRYylm0pD","dQ586Rxrsm","5Mg9rfaHir","Waim6lpF6W",
+"tvdkDVerEA","IjTwP45cIH","QssNCYf2Ec","dQ586blLA9","cQOnv0YAGH","OUYuFAgJHQ","QbxXcx3LDe","Ta8f68TxD7","n1pmOaFFss","cShY2AXpwE",
+"3weIFl83Ud","uTacxYOfrY","QClRLs7Mxk","KsjRKuZPqg","45cIHpWiOs","FcWrWRACuj","piJSkMojnP","F6PT2jSjS3","IBe8kfqypy","L7cGcaDGtS",
+"o8UydZUnqt","RkQkelH1kt","8xEKzrKDLJ","J2mQi7lUXZ","DLhzMydG8U","zz4ZUyvOMI","0Kyfs618Di","Y1mC0HzZT8","zbIYYAIYUu","ThjNnMezSW",
+"5nmWvQClRL","zHF1q1v5hH","l83UdB3qem","tlILtt59lR","lXFOB45cIH","Waim6No0Qb","EdBKcFGzgp","jeskSm4bxU","1j5L8zqH0W","k85AeS2Dfu",
+"hE1QlD6rBy","5IhmGFhtgl","0MR5XVIlwP","uQIcz2TRI7","618DipmeCd","KZamHCqqaD","SmGzvqQxHP","9y4lwTa8f6","ZJTXHFLsph","9XyT9uQIcz",
+"O3iyQ55rfB","EoToPtlILt","VjCZqCqqaD","ru4UGAIYUu","YOfrY5Drn0","JKWYRhSSvQ","aez9yYf2Ec","x3LDeuAWyp","uvf7ARpBQm","yvOMIECMvU",
+"fmIK1zHF1q","Zv7z0s93Ml","Vprf2ZuDtD","9eoRcjSjS3","8RCUA9eoRc","3otm6HRxd8","UlU3MCxVEf","EdBKcprNT6","Waim6Rxrsm","ZzJHW9iGoT",
+"t98iWlH1kt","ciuWzm4bxU","l83UdCqqaD","gIYvEyvOMI","L7cGcVBjhz","L7cGcZJTXH","FNYIMlXFOB","07n1cjSjS3","YjB9tVNCPd","5drc6EOE1o",
+"he9IAazIWp","VerEAtjQxs","9XyT9hE1Ql","IBe8ks4786","uQIcz580YD","qaofNDcpWB","NcICADQimp","blLA9cShY2","Kr8ysWMiS3","0BmCyiKqhr",
+"dmoS7qaofN","14FLR2DREs","gtCA5TCgPp","jzUqRuLtKs","aL6AJhYBCK","n8pJ9PYBf4","WaWsvCqqaD","GXdoHRzaZA","fLNg8VBjhz","n8pJ9Nxx9V",
+"2TRI7FcWrW","POUYSvOqCE","uQIczlsQGo","Chuy3Yh1hF","iwzGkFjHXR","wiHrZ5Drn0","iB08lHzZT8","CK5W7J2mQi","JXljWPOUYS","B3qemChuy3",
+"tvdkDVprf2","gtCA5AXpwE","Ss0ZuFcWrW","iqv4kMmsIo","DQimpVerEA","oVQp69eoRc","Q6LixNAFuw","M6qcGfaHir","Dz1R3fcJOy","aFFssWDVWJ",
+"1v5hHtlILt","xciqp8FmFH","zY1GYI7p2a","RsQUqFNYIM","gf8rI5iGN5","U3yw51v5hH","hUTw7uZPqg","MK07YEoToP","dmoS7uPX7G","taOXKn1pmO",
+"yToGWNo0Qb","EdBKcm4bxU","DcpWB29QAz","AIYUuCK5W7","HRxd83otm6","lj07QyluBx","fcwDazQt6Q","QYxC02Nslm","MmKGJ580YD","WreyP580YD",
+"dQ586Nxx9V","9eoRcdmoS7","yvOMIy94nw","lCMxyYf2Ec","Uvlv4CNHmv","ZJTXHVerEA","G1RhS7lUXZ","64s8NfcJOy","0h1b15IhmG","OHaBzsoy9t",
+"oGu6x8RCUA","2TRI7Mm8si","tAOsrvLsmS","VNCPd2Yz7E","RxrsmazIWp","YOfrYEOE1o","QClRLIn3NS","pmeCd0Kyfs","n8pJ9GrDg7","v2eC3hYBCK",
+"ksJbyYjB9t","FGzgpDG4sT","JXljWhE1Ql","faHirfaHir","I7p2a0MR5X","XflUqO3iyQ","4QMc9VBjhz","dpe1vlkMUA","dpe1vVerEA","8U2nUGv3Fq",
+"3weIFEdBKc","580YDU3yw5","ydG8URBhp0","zz4ZU5nmWv","ru4UGU3yw5","zmLYD5nmWv","qUJMdzz4ZU","LDk6fM3zXL","dmoS7djsrv","jtn0XFxX9q",
+"WDVWJxciqp","HfyNQJXljW","RsQUqQ6Lix","ksJbypWiOs","VerEAKr8ys","UlU3MbgJAz","4dEz6EOE1o","FxX9qVerEA","sqVrfaDGtS","fqypyMmKGJ",
+"0KyfsG1RhS","8FmFHyluBx","t98iWfFDrJ","580YDvOqCE","xReecdmoS7","ru4UGuQIcz","qQxHP2hEEU","GXdoH2Yz7E","faHirY1mC0","MmsIodhSuH",
+"FVMxojzUqR","MmKGJYh1hF","RxrsmCIShG","QWxoTzbIYY","yvOMIaDGtS","FVMxo16lHc","m4bxUhYBCK","PYBf4LewvM","0KyfshUTw7","Yw2oUvLsmS",
+"Z4I1vHlUbF","Yw2oUnFqik","Ta8f6yofH3","RACujiB08l","BFkb8HRxd8","9eoRcru4UG","lViBvlsQGo","MmsIoatef2","07n1c2Nslm","FVMxoZhwG1",
+"ksJby55rfB","mX2GEciuWz","oGu6xQssNC","RsQUqHzZT8","xciqpUl4a1","pAhR1Qworu","LDk6fRmDcr","cShY27ku1p","l83UdNhXdu","EOE1oIn3NS",
+"QbxXclViBv","Yw2oU9iGoT","xXTI4s93Ml","0PktIlViBv","Yh1hFMm8si","NhXduzQt6Q","DG4sTblLA9","DQimpxReec","BCxeCv1Hln","P6bcgWmadA",
+"In3NSuPX7G","7Ow5C0YAGH","7ku1p4QMc9","cL0aEVprf2","gjUTublLA9","prNT6HzZT8","gtCA5bZLvS","sx5GlMm8si","i3pyduoStw","ru4UGRACuj",
+"7ku1pVjCZq","QbxXczFgtB","BbwgANAFuw","v2eC3VLTy6","prNT6pWiOs","MK07YO3iyQ","9y4lwIKxdL","VNCPdd7vjM","JRJQBnlaBy","ReKEWyToGW",
+"jeskSQYxC0","F6PT2okgRi","dpe1vdQ586","l83Ud0Wr5y","v2eC3QbxXc","aL6AJcL0aE","AOgEeXflUq","tAOsrtaOXK","DcpWBCdyBV","5drc6S2Dfu",
+"yofH3PYBf4","euZA58U2nU","pvgjSjfREu","brhlQd7vjM","a00b5F6PT2","RxrsmAmdQd","0MR5Xe6e4z","jS1ajzz4ZU","lm0pDlViBv","rz7Ut45cIH",
+"NAFuwn1pmO","xXTI4gf8rI","29QAzHP433","NOHszgjUTu","JKWYRDG4sT","uLtKsTXQ0Z","dmoS7VjCZq","PYBf4GSQwj","4QMc9lViBv","5IhmGaL6AJ",
+"Kr8ys2ZHdk","nnP8oWaim6","lm0pDgf8rI","iwzGkSjskQ","B3qemMmKGJ","CxVEfAXpwE","JXljWuZPqg","EdBKcMm8si","QssNCCK5W7","lH1ktS2Dfu",
+"9XyT9FGzgp","aL6AJNxx9V","MojnPIBe8k","HRxd8Yh1hF","LewvMP6bcg","he9IAcL0aE","9XyT9ZuDtD","C2IrcCIShG","5Drn0RpBQm","jiVBPzqH0W",
+"C2IrcMm8si","WaWsvRzaZA","hUTw7BpYhV","pv0i7bgJAz","VBjhzMkgy8","J2mQiazIWp","G1RhSFxX9q","M6qcGOxWIH","zbIYYXflUq","GXdoHAXpwE",
+"zQt6Qmz8gx","4QMc9yvOMI","JIqXiHRxd8","DG4sTHzZT8","CxVEfFNYIM","DG4sTJKWYR","TCgPpZzJHW","Mm8siYjB9t","kZANmS77LH","LbRTH55rfB",
+"No0Qb24ARF","0ao3l0PktI","bgJAzZ4I1v","0KyfsSjskQ","5IhmGyvOMI","VLTy65VZjS","UmaEv5Mg9r","Ul4a1Z4I1v","OHaBzhi5X7","JJs5myofH3",
+"okgRicQOnv","VjCZqLbRTH","2Nslmrhl0J","WmadAzFgtB","4W0Tlhi5X7","l83Ud07n1c","zmLYDTwano","4QMc98xEKz","GrDg7s7Mxk","wiHrZZUnqt",
+"gtCA5lm0pD","sqVrfK4GS8","Zv7z09rlg9","XflUqrhl0J","Nxx9VfcJOy","7ku1pVerEA","fLNg8lpF6W","pFrrlXflUq","aez9yUmaEv","LewvMVBjhz",
+"oQ87rC2Irc","StlDJJJs5m","bZLvSDcpWB","qaofNThjNn","16lHcvkCHH","xReecpAhR1","ru4UGI7p2a","9eoRcnlaBy","IRh489XyT9","6AFT0RpBQm",
+"ZJTXHNhXdu","Mm8siFGzgp","7X3uyuPX7G","iwzGknlaBy","14FLRZUnqt","bgJAzS2Dfu","5iGN5djsrv","ZuDtDpWiOs","uJScXfaHir","WPmlxOxWIH",
+"FjHXRVjCZq","BpYhVU3yw5","AIYUulViBv","tuDySECMvU","uAWypjiVBP","zQt6QVprf2","YOfrYCxVEf","Kr8ys7Ow5C","In3NSThjNn","8RCUAv1Hln",
+"3otm6IRh48","dhSuHzFgtB","P6bcgUmaEv","taOXKCxVEf","GWqqXI7p2a","yluBxwiHrZ","MaJQsHzZT8","xReectjQxs","oGu6x9rlg9","5iGN5Rxrsm",
+"9GXkX16lHc","QworudhSuH","AXpwE6q6L9","gIYvEuTacx","29QAzXyPZN","JRJQBNo0Qb","I7p2auN6r3","cmXIXxciqp","SWfou7fsYM","dQ5867hyVv",
+"nlaByOz8yZ","9eoRclkMUA","s4786WPmlx","t98iWaez9y","zqH0W3weIF","rhl0JCfgr3","EoToPydG8U","Chuy3lweGy","0YAGHdQ586","RxrsmhUTw7",
+"lkMUADG4sT","9XyT9uoStw","NcICANxx9V","o8Uyd4dEz6","WMiS3vLsmS","taOXKBbwgA","Nxx9ViwzGk","hYBCK8RCUA","rhl0JFxX9q","OxWIHHzZT8",
+"ulk41mz8gx","jfREuK20wK","9iGoTVjCZq","UmaEvdpe1v","ReKEWkZANm","iKqhrJ2mQi","gf8rIZv7z0","iwzGks4786","RACujwiHrZ","uvf7A8FmFH",
+"ydG8UtuDyS","0MR5XuLtKs","hSSvQm4bxU","OUYuFyofH3","EOE1oIKxdL","WaWsvogLgc","pWiOsM3zXL","rhl0JtaOXK","lpF6WdhSuH","GXdoHlCMxy",
+"jSjS3GSQwj","TCgPpe6e4z","EOE1odQ586","7fsYM7hyVv","gjUTuNhXdu","wDajXbgJAz","618DiCfgr3","i7WMQo8Uyd","HzZT8BCxeC","BCxeC7fsYM",
+"QworuiKqhr","M6qcGuupzk","Q6hMC5nmWv","8TxD7ZUnqt","DQimphYBCK","a00b5blLA9","24ARFvkCHH","SmGzvnlaBy","Q6hMClpF6W","Cp3mZprNT6",
+"s4786pv0i7","uTacxVBjhz","HP433mX2GE","yvOMIYh1hF","wiHrZi7WMQ","XflUq1j5L8","i3pydMezSW","hi5X77lUXZ","CNHmvZv7z0","pmeCdjzUqR",
+"QworuCIShG","bZLvSVprf2","dhSuHG1RhS","UlU3MIKxdL","C2IrczbIYY","Yw2oUjSjS3","AIYUulH1kt","euZA5n8pJ9","O3iyQQYxC0","L7cGcDcpWB",
+"In3NSjiVBP","EdBKculk41","he9IAUlU3M","F6PT2AkKTk","Vprf27lUXZ","Ss0Zulj07Q","IRh48Yw2oU","nFqikP6bcg","QnJ1SRkQke","In3NSZUnqt",
+"0KyfsK4GS8","uQIczoGu6x","pv0i7SjskQ","FVMxoEOE1o","In3NS5Namm","1j5L8kZANm","Y1mC01LB1L","KASQ8IRh48","6q6L9ksJby","l83UdSjskQ",
+"s93MlguMb8","QworuMojnP","cShY2uPX7G","JRJQBoGu6x","fFDrJ5Mg9r","QChxsZv7z0","BpYhVwiHrZ","SmGzvpFrrl","ru4UGoQ87r","RsQUq55rfB",
+"jeskS5Mg9r","RACujVIlwP","Yh1hFcQOnv","DQimpYw2oU","iKqhrazIWp","pFrrl4QMc9","ZhwG1dpe1v","kZANmJkzUn","zHF1q8TxD7","rhl0JFnPFB",
+"StlDJ7lUXZ","blLA9n8pJ9","yToGWuupzk","S77LHECMvU","lsQGoaDGtS","Yw2oU0Kyfs","zqH0WzmLYD","AXpwEtlILt","qaofNfLNg8","dmoS7Cfgr3",
+"G1RhSFnPFB","ThjNn0Kyfs","a00b50YAGH","jzUqRs93Ml","iB08lm4bxU","AXpwE7fKYU","MojnP45cIH","djsrvfaHir","1LB1L4dEz6","aFFssfLNg8",
+"29QAz7hyVv","bgJAzZv7z0","SbRYyrz7Ut","M3zXL07n1c","LbRTH2ZHdk","QssNCdQ586","oVQp6NAFuw","CqqaDChuy3","n1pmOC2Irc","s4786fqypy",
+"wDajXhYBCK","8FmFHTCgPp","zbIYYBFkb8","ulk41Kr8ys","Nxx9V55rfB","580YDsx5Gl","G1RhS8FmFH","0KyfsFNYIM","9eoRcbgJAz","zbIYYRzaZA",
+"Dz1R31j5L8","Yf2EcBbwgA","qUJMd7fKYU","faHir0h1b1","AIYUuVLTy6","Ss0Zu8hJdt","Yf2EcWreyP","fLNg80BmCy","LbRTHzmLYD","OUqFMKsjRK",
+"ksJbyBCxeC","s7Mxk29QAz","UlU3M7fKYU","G1RhS7ku1p","tvdkDQ6hMC","GWqqXCIShG","AOgEeRzaZA","C2IrcOz8yZ","4dEz6HlUbF","BCxeCMezSW",
+"vLsmSdpe1v","YjB9t4QMc9","9y4lwyofH3","ulk41jeskS","XflUqWMiS3","pT8wuECMvU","Mkgy8uLtKs","NOHszIn3NS","dQ586GrDg7","wiHrZM3zXL",
+"xciqpEdBKc","RBhp0pvgjS","X6PinPYBf4","0Wr5yGv3Fq","Ul4a1hYBCK","W7cTs0PktI","taOXKMmsIo","Cp3mZlweGy","b29RJNxx9V","NcICAhe9IA",
+"5Mg9rBCxeC","ReKEWIjTwP","Mkgy8iwzGk","IKxdL0MR5X","UmaEvxReec","Chuy3kZANm","Z4I1vGXdoH","YOfrYrKDLJ","NOHszBCxeC","uupzkThjNn",
+"okgRiprNT6","v2eC3blLA9","RACuj8xEKz","ZzJHW9XyT9","24ARFNhXdu","XyPZNPYBf4","Fhtgluvf7A","AXpwEyluBx","qaofNP6bcg","AIYUukZANm",
+"M6qcGO3iyQ","9eoRcB3qem","jfREuVBjhz","SmGzvhUTw7","MezSWix74r","QssNCVerEA","2TRI7tvdkD","24ARFZhwG1","blLA9vkCHH","Yw2oUPb1pa",
+"y94nw5Drn0","bZLvSrz7Ut","OHaBz2TRI7","07n1cDQimp","IRh48Cfgr3","G1RhSJIqXi","KASQ8O3iyQ","KASQ8W7cTs","pmeCdQworu","Nxx9VIn3NS",
+"fLNg87Ow5C","CIShGSjskQ","zY1GYUvlv4","Nxx9Vru4UG","ZuDtDwiHrZ","TCgPpi3pyd","29QAzI7p2a","0Wr5ygtCA5","zQt6QSbRYy","k85AenFqik",
+"cmXIXWPmlx","bZLvSPYBf4","Gv3Fq8cVD3","IjTwPS77LH","9iGoTsuY4x","8RCUAWPmlx","Uvlv4ReKEW","FnPFBWPmlx","GSQwj8FmFH","AmdQdjfREu",
+"b29RJs93Ml","ZzJHWIn3NS","3otm6DQimp","uLtKsNAFuw","lm0pDPb1pa","D6rByulk41","sqVrfCdyBV","POUYSrKDLJ","0h1b1WDVWJ","MaJQs9rlg9",
+"yToGWsuY4x","yofH3fqypy","zqH0Wb29RJ","s4786jSjS3","ciuWzQYxC0","yToGWMezSW","GXdoHvkCHH","pAhR1IRh48","OHaBz5Mg9r","RmDcrxciqp",
+"lm0pDuQIcz","48cHLqUJMd","oQ87rThjNn","MaJQsh1zcH","rz7UtfmIK1","TXQ0Z45cIH","OxWIHWDVWJ","IjTwPZJTXH","RxrsmKsjRK","FjHXR0h1b1",
+"Yf2EcMojnP","Q6LixokgRi","t98iWX6Pin","pT8wuDQimp","MojnPlViBv","7X3uy0BmCy","jzUqRlXFOB","t59lRuAWyp","O3iyQiKqhr","ydG8UWDVWJ",
+"SbRYy7hyVv","lj07QK20wK","5ZaEzGrDg7","lj07QZ4I1v","AmdQdjS1aj","NhXdu0BmCy","Nxx9VWmadA","8U2nUYf2Ec","MezSWS2Dfu","l83Ud9iGoT",
+"xciqpZv7z0","lkMUAt98iW","dQ5868hJdt","AmdQdix74r","rhl0JRkQke","BpYhVGWqqX","S77LHMmKGJ","iqv4kCfgr3","y94nwK4GS8","FnPFBTwano",
+"zz4ZUQbxXc","Ss0ZuJKWYR","4W0Tl8FmFH","0YAGHMezSW","he9IA6q6L9","soy9tNhXdu","FGzgpxXTI4","gdQsSlpF6W","5IhmG0BmCy","G1RhSCp3mZ",
+"tAOsryluBx","zmLYDJKWYR","MmKGJFcWrW","Mm8siCqqaD","J2mQiW7cTs","BpYhV14FLR","tAOsrguMb8","nnP8on8pJ9","NcICAThjNn","oQ87rGWqqX",
+"FGzgpqQxHP","3weIFzHF1q","K4GS8S2Dfu","Gv3Fqmz8gx","lweGyzqH0W","0KyfsStlDJ","8U2nUgf8rI","gtCA5hi5X7","nFqikQWxoT","7fKYU14FLR",
+"yEfy9uoStw","8U2nUPOUYS","pWiOsFxX9q","5drc6FjHXR","djsrvS2Dfu","No0QbFFDui","RmDcrVprf2","lXFOB2Nslm","In3NS580YD","AkKTkAmdQd",
+"WreyPtaOXK","SjskQ0BmCy","Ul4a19GXkX","uvf7A9rlg9","hYBCKlsQGo","hSSvQOxWIH","soy9tJkzUn","HP433XflUq","lH1kt55rfB","ZhwG1JKWYR",
+"5nmWvjtn0X","cL0aEzbIYY","ksJbyUmaEv","dpe1v0h1b1","ZJTXHs7Mxk","NOHszyEfy9","VBjhznnP8o","1v5hH7fsYM","Uvlv48U2nU","G1RhSh1zcH",
+"CK5W72hEEU","blLA9n1pmO","faHirCIShG","JKWYRReKEW","lweGyNcICA","VIlwPQ6hMC","FwEJzs93Ml","J2mQiDcpWB","Dz1R3cL0aE","QYxC05nmWv",
+"oQ87rbZLvS","FcWrWkB5nP","8FmFHuupzk","GSQwjlm0pD","OHaBzl83Ud","CxVEfP6bcg","NhXdudhSuH","ogLgcjiVBP","ciuWz16lHc","Chuy3ZJTXH",
+"aez9yTwano","uvf7A7Ow5C","UlU3MfcJOy","O3iyQfmIK1","n8pJ93weIF","DQimpChuy3","gjUTuzFgtB","iKqhrTCgPp","i3pydAkKTk","In3NS7hyVv",
+"kB5nPfFDrJ","MezSWOHaBz","uN6r3qUJMd","AXpwEVNCPd","jiVBPfFDrJ","s47863weIF","xciqp9y4lw","MGlTFjSjS3","EoToPpiJSk","mz8gxjzUqR",
+"cQOnvIKxdL","K20wKQClRL","0MR5XEdBKc","zmLYD7lUXZ","D6rByxXTI4","7X3uyP6bcg","lH1ktwiHrZ","FwEJzqUJMd","Vprf2prNT6","JXljWJKWYR",
+"ReKEW7ku1p","atef214FLR","Y1mC0QnJ1S","Yh1hFy94nw","618DiGrDg7","9eoRcs7Mxk","7lUXZ64s8N","PYBf4L7cGc","Z4I1vOz8yZ","YOfrYsuY4x",
+"uN6r3U3yw5","6q6L9tl72W","ECMvUtvdkD","SjskQtvdkD","lViBvCp3mZ","FwEJztjQxs","8xEKzlkMUA","JRJQBuZPqg","5VZjSiB08l","9XyT9RACuj",
+"azIWpPb1pa","NcICAdjsrv","9XyT9FxX9q","DLhzMG1RhS","jzUqRZuDtD","BCxeCiqv4k","nlaBy5Drn0","RmDcrhe9IA","GSQwjjS1aj","tuDySWDVWJ",
+"suY4xFjHXR","DQimp6AFT0","oQ87rix74r","v1Hlnhe9IA","Ul4a1NcICA","29QAzWDVWJ","In3NSaL6AJ","ZzJHWrKDLJ","qUJMd5IhmG","8xEKzDz1R3",
+"lViBvuupzk","M3zXLkZANm","S2DfuIBe8k","64s8NXflUq","8FmFHzY1GY","djsrvfLNg8","No0QbjSjS3","Oz8yZYjB9t","he9IA29QAz","GWqqXZhwG1",
+"0MR5XHlUbF","ix74rTXQ0Z","rz7UtgIYvE","BpYhVCp3mZ","pv0i7yofH3","P6bcgLewvM","ulk41zz4ZU","ru4UG29QAz","0YAGHJRJQB","0PktIIRh48",
+"IKxdL45cIH","ciuWzM6qcG","5VZjSa00b5","0Wr5ykZANm","jzUqRuupzk","HRxd8MGlTF","iwzGkuQIcz","uZPqgFcWrW","NcICA6AFT0","CqqaDcQOnv",
+"MGlTFNo0Qb","vOqCEmX2GE","uJScXOHaBz","CIShGtaOXK","iKqhr1LB1L","uQIcznFqik","jeskSuupzk","DQimpVNCPd","7fKYUulk41","t59lRRpBQm",
+"UmaEvUvlv4","8hJdtJJs5m","yEfy9nFqik","7X3uyWPmlx","0KyfsciuWz","pmeCd2hEEU","jeskSQnJ1S","yofH3zQt6Q","zqH0WFcWrW","pT8wuuN6r3",
+"WMiS329QAz","IRh48pvgjS","hSSvQCqqaD","uN6r3VLTy6","07n1cwiHrZ","5nmWvVLTy6","b29RJ5drc6","LewvMVprf2","mX2GEIn3NS","ni2v1O3iyQ",
+"RkQkexciqp","DQimp5IhmG","kB5nPuJScX","X6PinMaJQs","zHF1qThjNn","7fsYM14FLR","4dEz6yofH3","VNCPdzqH0W","uLtKsFxX9q","M3zXLyvOMI",
+"QbxXcWreyP","nnP8odjsrv","FNYIMMkgy8","jeskSvLsmS","SjskQXyPZN","K4GS85Mg9r","fqypyo8Uyd","FLsphuPX7G","9eoRcU3yw5","uN6r3HlUbF",
+"24ARFFnPFB","tl72W45cIH","0Wr5yXyPZN","n8pJ9i3pyd","Waim6iB08l","0h1b1RkQke","WPmlxAXpwE","lkMUA2DREs","XflUqCfgr3","VIlwPzz4ZU",
+"BFkb8kB5nP","gdQsSS77LH","ZuDtDaFFss","yEfy9F6PT2","Mkgy8KZamH","9XyT9ulk41","W3VFHPOUYS","07n1catef2","iqv4khUTw7","WDVWJn8pJ9",
+"HlUbF3weIF","FFDui5drc6","soy9t7fsYM","WreyPaDGtS","B3qemUlU3M","uvf7AFnPFB","RxrsmgjUTu","DcpWBlweGy","7lUXZlCMxy","WDVWJtlILt",
+"XyPZNCfgr3","FxX9qDcpWB","b29RJqUJMd","M3zXLuupzk","t98iW2hEEU","lj07QUvlv4","Ta8f6580YD","ZzJHWLewvM","48cHLlweGy","FPfSEJRJQB",
+"cL0aEaez9y","pAhR1CK5W7","TXQ0ZprNT6","8RCUAJJs5m","RBhp0x3LDe","BbwgADLhzM","VerEAjSjS3","suY4xpiJSk","EoToPulk41","jeskS1v5hH",
+"AIYUux3LDe","LDk6fBbwgA","RACuj1LB1L","s4786djsrv","8U2nUcmXIX","0h1b1M3zXL","2ZHdkix74r","MojnPdhSuH","Y1mC0s93Ml","soy9tyofH3",
+"OUYuFjSjS3","8cVD3zbIYY","djsrv5Namm","uJScX7fsYM","NOHszprNT6","RzaZAMmsIo","AXpwEvkCHH","WmadA4W0Tl","QnJ1SnFqik","IRh48Mm8si",
+"rz7Utjtn0X","uTacxNo0Qb","JkzUn618Di","UmaEvJXljW","t59lRtaOXK","o8UyddmoS7","brhlQ5Drn0","5iGN5LbRTH","fcJOy9eoRc","ZhwG1v1Hln",
+"QssNCWDVWJ","cQOnvYjB9t","euZA57X3uy","taOXKs7Mxk","7fsYMYf2Ec","iKqhrvkCHH","RzaZA5drc6","ni2v1FxX9q","AOgEeFPfSE","s93MlOz8yZ",
+"M6qcGRxrsm","F6PT20PktI","wDajXChuy3","Dz1R3I7p2a","5Mg9rk85Ae","wiHrZWMiS3","MmsIo9y4lw","CdyBV6q6L9","BpYhVM3zXL","AXpwE9y4lw",
+"16lHcvLsmS","Waim6tuDyS","Nxx9VgdQsS","lj07QjfREu","l83UdkZANm","1j5L8dhSuH","RxrsmVerEA","IBe8k9iGoT","QnJ1SQssNC","FcWrW5nmWv",
+"YjB9tOUqFM","FwEJzZUnqt","a00b5pT8wu","zY1GYuZPqg","O3iyQF6PT2","9iGoTblLA9","JkzUnL7cGc","ydG8UfmIK1","P6bcgNOHsz","SbRYyIBe8k",
+"lsQGoVjCZq","FNYIMRsQUq","5ZaEz8RCUA","he9IAHP433","pv0i7y94nw","JIqXix3LDe","0h1b1JIqXi","VerEAkZANm","gf8rIprNT6","RACujQWxoT",
+"MojnPfFDrJ","taOXKFxX9q","xXTI4JKWYR","taOXK9iGoT","RACujD6rBy","4dEz6dmoS7","FVMxolH1kt","wiHrZBGaQY","LbRTHUvlv4","WMiS3580YD",
+"M3zXLW3VFH","v1HlnAIYUu","7lUXZCqqaD","ThjNnW7cTs","xciqp0Wr5y","jeskS9rlg9","tvdkDUl4a1","uvf7A1j5L8","euZA5Waim6","uTacxa00b5",
+"MaJQsFjHXR","CdyBVY1mC0","8xEKzQbxXc","1v5hHNOHsz","24ARFdjsrv","n8pJ9SjskQ","cQOnv5VZjS","EOE1oguMb8","AOgEeJXljW","QbxXchE1Ql",
+"jeskSpFrrl","uvf7Al83Ud","Nxx9V3weIF","cQOnvM6qcG","uPX7G7fKYU","SmGzvQnJ1S","AkKTkcL0aE","5NammKsjRK","7Ow5CVLTy6","uTacxEoToP",
+"rz7UtWDVWJ","uJScXdmoS7","VIlwPru4UG","NhXdutvdkD","K20wKZ4I1v","8U2nUvkCHH","zbIYYK4GS8","W7cTsJJs5m","BFkb8iKqhr","WMiS33otm6",
+"JkzUnbZLvS","1v5hH5Drn0","ReKEW8hJdt","zz4ZUjiVBP","C2IrcDQimp","t59lRmz8gx","9eoRcrKDLJ","lweGy8TxD7","fcJOy7X3uy","suY4xC2Irc",
+"yluBxxXTI4","JkzUnFGzgp","fLNg8FFDui","aDGtSlCMxy","Chuy3JJs5m","UlU3MZzJHW","uQIczJkzUn","7lUXZGv3Fq","55rfBEoToP","MojnP5nmWv",
+"guMb8MaJQs","9XyT9ix74r","aDGtSMmsIo","pT8wuLewvM","JKWYRCxVEf","v1HlnhYBCK","FcWrWZv7z0","ni2v1Rxrsm","FVMxoI7p2a","DQimpd7vjM",
+"euZA5iwzGk","rhl0JUvlv4","AOgEeXyPZN","guMb8jSjS3","RmDcrQnJ1S","580YDTCgPp","0MR5Xd85a9","aL6AJ6q6L9","s4786yEfy9","ZzJHWnnP8o",
+"LbRTHiB08l","v2eC3uvf7A","yToGWFcWrW","IKxdLgtCA5","v2eC3pFrrl","cQOnvSmGzv","gtCA5MojnP","Z4I1vpiJSk","07n1chSSvQ","YjB9tdpe1v",
+"iwzGkMaJQs","uZPqgd85a9","s93Ml9eoRc","QChxsNo0Qb","X6Pin8hJdt","kB5nPRsQUq","YOfrY9iGoT","580YDwiHrZ","bgJAzChuy3","soy9tvLsmS",
+"CdyBVfmIK1","ReKEWDcpWB","sx5GlY1mC0","ZuDtDqaofN","0PktIbZLvS","1j5L8guMb8","lweGyFGzgp","FLsph3weIF","NhXduSjskQ","RxrsmF6PT2",
+"AXpwEVLTy6","Yh1hF1LB1L","HlUbFOxWIH","qUJMdzqH0W","SjskQGXdoH","fqypyfcwDa","GrDg7pmeCd","Yh1hF9GXkX","XflUqzY1GY","n8pJ95IhmG",
+"brhlQF6PT2","QWxoTVerEA","lViBvIKxdL","tl72WXyPZN","FnPFBGWqqX","OUqFMZzJHW","lweGyNOHsz","1j5L8EOE1o","prNT6uLtKs","24ARFYf2Ec",
+"9eoRcb29RJ","1LB1LNxx9V","fmIK1sx5Gl","OxWIHNo0Qb","NhXduF6PT2","YOfrYaez9y","580YDy94nw","aez9yaL6AJ","D6rBy8xEKz","3otm6jS1aj",
+"6q6L9AgJHQ","iB08lFjHXR","LewvMbrhlQ","XyPZN6AFT0","lCMxy1LB1L","9y4lw7fsYM","2TRI7HRxd8","HlUbF618Di","TCgPpulk41","aDGtSAgJHQ",
+"aDGtSHfyNQ","W3VFHKASQ8","1v5hHt98iW","Y1mC03weIF","4QMc9TCgPp","Cfgr3fcwDa","vkCHH5Drn0","IjTwPAXpwE","Twano4QMc9","BbwgAiwzGk",
+"dpe1vfqypy","uJScXuZPqg","2hEEU9iGoT","L7cGctAOsr","Ul4a1zHF1q","WaWsvM6qcG","cQOnvWaWsv","0YAGHKZamH","3otm6Waim6","AIYUud7vjM",
+"Yh1hFwiHrZ","lm0pDyofH3","y94nwuTacx","QnJ1SXflUq","tAOsrNxx9V","Z4I1vWreyP","No0Qb580YD","EOE1oMGlTF","okgRi8U2nU","64s8Nulk41",
+"FwEJz7lUXZ","D6rBy64s8N","XflUqv1Hln","jfREuOUYuF","guMb8aFFss","In3NSzz4ZU","FLsph5Mg9r","zqH0WjzUqR","580YDbrhlQ","8xEKz7X3uy",
+"zbIYYgjUTu","QChxsC2Irc","RBhp0d85a9","Q6LixuZPqg","SbRYyG1RhS","DQimprhl0J","gjUTuCfgr3","a00b5Vprf2","soy9tuTacx","2Yz7E45cIH",
+"MmKGJzz4ZU","tuDySmX2GE","8TxD7AmdQd","aFFssyvOMI","3otm6taOXK","BbwgAVjCZq","o8Uydxciqp","Vprf2uN6r3","WmadAyluBx","WPmlxprNT6",
+"cQOnvQssNC","RBhp0Chuy3","3otm6mz8gx","brhlQjtn0X","0MR5X16lHc","8hJdtU3yw5","U3yw5yToGW","AXpwEHzZT8","S2DfulpF6W","6q6L97lUXZ",
+"HP4337ku1p","5Mg9rStlDJ","qaofN0Wr5y","Dz1R3QChxs","uZPqgQbxXc","8FmFH45cIH","0MR5X5iGN5","Y1mC0SWfou","tuDySW3VFH","AmdQdI7p2a",
+"tlILtDz1R3","1LB1LYf2Ec","2DREs7Ow5C","ECMvUAOgEe","0BmCy8FmFH","JKWYRlH1kt","ogLgcC2Irc","pvgjSCNHmv","uLtKsS2Dfu","y94nwtlILt",
+"RACujP6bcg","oVQp65ZaEz","OxWIH7lUXZ","AmdQdfcJOy","s93MlpFrrl","55rfBJKWYR","Yf2EcvLsmS","CK5W7n8pJ9","0PktIuoStw","cmXIXCK5W7",
+"IBe8kTa8f6","bgJAzmz8gx","dpe1veuZA5","CNHmviwzGk","bZLvSatef2","i3pyd9XyT9","Y1mC0BCxeC","DLhzMQworu","WPmlxNhXdu","RkQkeUmaEv",
+"hSSvQtlILt","S2DfurKDLJ","tuDyS0BmCy","Yf2EcS77LH","CNHmv0Wr5y","kB5nPiwzGk","Kr8ysZzJHW","3weIFuupzk","okgRi5Drn0","OUYuFgjUTu",
+"P6bcg3otm6","MezSWK20wK","POUYSHlUbF","2DREs6q6L9","HP433X6Pin","5drc6v1Hln","JIqXinlaBy","5iGN5tl72W","CqqaDZv7z0","uvf7AciuWz",
+"bgJAzYh1hF","hYBCKlj07Q","euZA5Zv7z0","S2Dfu4dEz6","FxX9quQIcz","gIYvEFjHXR","e6e4zEoToP","ix74rm4bxU","P6bcg5Drn0","3otm6e6e4z",
+"lXFOBEOE1o","8FmFHksJby","WDVWJPOUYS","RsQUq8cVD3","MaJQsazIWp","48cHLVerEA","TXQ0Z5iGN5","ZUnqt8TxD7","aL6AJfcJOy","AkKTkMaJQs",
+"lkMUAaL6AJ","lCMxyY1mC0","B3qemcL0aE","ogLgcOUqFM","9GXkXFNYIM","lweGyhUTw7","uJScXAOgEe","W3VFHvLsmS","gdQsSy94nw","bgJAzG1RhS",
+"QssNClXFOB","Yf2EcjzUqR","Vprf25Namm","soy9t7fKYU","gtCA5In3NS","ZUnqtM6qcG","ZuDtDB3qem","sx5Gl0ao3l","fcwDaaDGtS","lsQGoCfgr3",
+"suY4xWreyP","G1RhS2DREs","NhXdu3otm6","euZA5KsjRK","RzaZAYOfrY","8cVD3m4bxU","hi5X7uupzk","lweGylm0pD","0YAGH1v5hH","gIYvEXflUq",
+"cQOnvPYBf4","ru4UGIjTwP","lm0pDcL0aE","5drc6uLtKs","9eoRcDLhzM","8TxD7rhl0J","1j5L82Nslm","aFFssCxVEf","M3zXLuLtKs","cmXIX7Ow5C",
+"t98iWzbIYY","jtn0XFcWrW","pAhR1XflUq","fmIK1RmDcr","8U2nUulk41","IjTwPbZLvS","7lUXZx3LDe","2ZHdkU3yw5","Ul4a1WaWsv","RsQUqlkMUA",
+"jzUqRXflUq","Ss0Zuni2v1","v2eC3WDVWJ","pvgjSblLA9","RxrsmNo0Qb","uZPqg8RCUA","gjUTubZLvS","DcpWBCp3mZ","ni2v1jtn0X","uTacxnFqik",
+"YOfrYlkMUA","UlU3MEdBKc","CIShGlCMxy","Ss0ZuW7cTs","cShY2OxWIH","bgJAz8cVD3","KASQ8QChxs","Vprf224ARF","Nxx9V29QAz","s4786iKqhr",
+"Z4I1vuQIcz","Nxx9VwiHrZ","pAhR1580YD","JkzUn6q6L9","0Wr5y4dEz6","WreyPhe9IA","W3VFHAmdQd","iKqhr2ZHdk","DLhzMfFDrJ","O3iyQlm0pD",
+"h1zcHgdQsS","ThjNnFVMxo","0BmCyFFDui","FVMxoD6rBy","Ta8f6Twano","faHirBpYhV","X6PinBCxeC","F6PT2EoToP","zbIYYQ6hMC","tl72W5Drn0",
+"zY1GYt98iW","KASQ8FVMxo","uLtKsEdBKc","dmoS7uAWyp","RBhp0mz8gx","mX2GEd85a9","RkQkeZzJHW","FNYIMs93Ml","ZUnqt4dEz6","x3LDezY1GY",
+"jtn0XvkCHH","07n1cStlDJ","pAhR155rfB","POUYSX6Pin","Ul4a1O3iyQ","zmLYDLDk6f","l83UdzHF1q","8U2nUsx5Gl","ix74r5VZjS","pvgjSuN6r3",
+"QChxsCK5W7","S77LHMojnP","zbIYYMGlTF","EOE1oRmDcr","HzZT8IjTwP","RmDcrMK07Y","yofH3ydG8U","taOXKfcwDa","QChxsWMiS3","pmeCdFcWrW",
+"OxWIHuoStw","gdQsSMaJQs","3otm6cL0aE","h1zcHlj07Q","S2DfupiJSk","ZhwG1rhl0J","hUTw7lm0pD","HzZT8FVMxo","C2IrcjSjS3","WmadACK5W7",
+"guMb8NAFuw","StlDJqQxHP","ciuWzgIYvE","NcICAW3VFH","L7cGcwiHrZ","oQ87rfcJOy","FxX9qn1pmO","Yh1hFNOHsz","aez9yi3pyd","VjCZqAmdQd",
+"5drc6iqv4k","vOqCE8hJdt","2DREsjSjS3","CK5W7G1RhS","AXpwEt59lR","yEfy9YjB9t","4dEz6FjHXR","uLtKsdmoS7","b29RJZzJHW","yofH3d7vjM",
+"t98iWUvlv4","tlILt29QAz","h1zcH7lUXZ","s93MlGrDg7","5Mg9raez9y","pvgjSvOqCE","55rfBgdQsS","rKDLJMGlTF","G1RhSpmeCd","NcICA9XyT9",
+"TCgPpwDajX","0h1b1Nxx9V","1v5hHG1RhS","zqH0WDcpWB","DQimpoGu6x","SjskQgtCA5","7hyVvCK5W7","oGu6x0YAGH","cShY2FcWrW","I7p2atjQxs",
+"ReKEWhSSvQ","BGaQYnnP8o","NcICAVLTy6","Ss0Zus4786","tvdkDAIYUu","yToGWUl4a1","HP433BGaQY","lH1ktcShY2","StlDJzFgtB","ogLgcW3VFH",
+"atef2prNT6","4QMc9s7Mxk","45cIH4W0Tl","FnPFB0YAGH","ZUnqtIjTwP","45cIHMezSW","8cVD3WMiS3","MGlTF2Yz7E","faHirMojnP","0MR5XHfyNQ",
+"K20wKPb1pa","oQ87rk85Ae","s47860MR5X","IKxdL5nmWv","FxX9qpv0i7","e6e4ziB08l","gf8rInFqik","vOqCEB3qem","MK07YIBe8k","rhl0JVjCZq",
+"O3iyQaFFss","CdyBVuQIcz","QWxoTdjsrv","YjB9trKDLJ","iqv4knFqik","he9IA4W0Tl","VerEASbRYy","lweGyQ6hMC","lj07QpFrrl","gjUTu3otm6",
+"Pb1pani2v1","ZhwG1KZamH","ZUnqthYBCK","U3yw5uTacx","hi5X7BCxeC","jSjS3AXpwE","v8yFNzz4ZU","tjQxstvdkD","GSQwjHlUbF","pWiOs55rfB",
+"WDVWJulk41","X6PintjQxs","ni2v1MmsIo","zqH0WK20wK","aez9yo8Uyd","lCMxyix74r","XflUqqUJMd","v1HlnIBe8k","oVQp6JXljW","pv0i7fcJOy",
+"s7Mxkl83Ud","zHF1qpWiOs","dhSuHeuZA5","W3VFHYw2oU","uvf7AlH1kt","OUYuFxciqp","fLNg8xciqp","8FmFHY1mC0","jzUqRQnJ1S","BpYhVKZamH",
+"HRxd8v1Hln","zHF1qRsQUq","lViBvxciqp","5ZaEzs4786","mz8gxuQIcz","U3yw5X6Pin","fqypyLbRTH","jzUqR16lHc","rhl0JMK07Y","iKqhroQ87r",
+"S77LHyofH3","ZzJHWW3VFH","RBhp0lXFOB","UlU3MUvlv4","vOqCEnFqik","yvOMIdhSuH","uJScXs4786","7hyVvyvOMI","aez9y2TRI7","16lHck85Ae",
+"sqVrfoVQp6","k85AeUl4a1","dmoS7AmdQd","ksJby1LB1L","XflUq0h1b1","lH1ktNAFuw","y94nwjSjS3","In3NSzmLYD","FLsphQ6Lix","dmoS7CIShG",
+"tlILtfqypy","DQimpyofH3","QbxXcCNHmv","55rfBGXdoH","XflUqlweGy","soy9tokgRi","uPX7GG1RhS","W7cTsbgJAz","fFDrJ6q6L9","mX2GEsqVrf",
+"Gv3Fq24ARF","ReKEWK20wK","dhSuHSs0Zu","8hJdt0MR5X","3otm6ThjNn","fFDrJhi5X7","cL0aEFPfSE","LewvM64s8N","MmsIoQbxXc","jfREu7X3uy",
+"0Wr5yMGlTF","WreyPRxrsm","vLsmS7Ow5C","MmsIoazIWp","Y1mC0D6rBy","tvdkDblLA9","48cHLGXdoH","mz8gxuoStw","FLsphAgJHQ","I7p2amz8gx",
+"64s8NcL0aE","QssNCDG4sT","uZPqgprNT6","MGlTFYw2oU","StlDJKsjRK","rhl0JzmLYD","yvOMIzz4ZU","9eoRcMm8si","WreyPdpe1v","CqqaDYOfrY",
+"W7cTsgf8rI","QChxs7hyVv","dmoS77ku1p","m4bxUFVMxo","KASQ85iGN5","2ZHdkdpe1v","v1HlnCqqaD","VNCPdVjCZq","soy9tOz8yZ","KASQ8XflUq",
+"7hyVvLewvM","NhXdukB5nP","zz4ZUUmaEv","n1pmOuN6r3","AOgEeCxVEf","GXdoHAkKTk","bgJAzi7WMQ","8hJdtRpBQm","MK07Y4QMc9","h1zcHQYxC0",
+"uvf7AUmaEv","yToGWChuy3","QnJ1SdmoS7","WDVWJJKWYR","uoStwl83Ud","lweGyx3LDe","WMiS3Ss0Zu","LewvM5IhmG","7Ow5C7fKYU","e6e4zlm0pD",
+"dmoS71j5L8","vOqCEStlDJ","ECMvUZ4I1v","TCgPp5nmWv","EdBKclkMUA","4QMc9RACuj","0YAGHazIWp","jtn0XyvOMI","SWfourKDLJ","5ZaEztaOXK",
+"ZJTXHlweGy","nnP8o8cVD3","blLA9yToGW","gIYvEAOgEe","oVQp6SbRYy","1j5L829QAz","atef229QAz","14FLRtl72W","xReecECMvU","fmIK1kZANm",
+"gtCA5QbxXc","s93Ml29QAz","8U2nU5nmWv","5nmWvW7cTs","HfyNQTXQ0Z","OxWIHdpe1v","ulk41Zv7z0","2TRI7MojnP","JJs5mZ4I1v","5nmWvdpe1v",
+"5iGN5FFDui","FcWrWazIWp","ydG8Uni2v1","Cfgr3djsrv","K4GS8LewvM","SWfou3weIF","Oz8yZAIYUu","xReecHRxd8","jzUqRdjsrv","jeskSs7Mxk",
+"ZhwG10Kyfs","AgJHQtvdkD","DG4sTpv0i7","xXTI4xXTI4","0YAGHPb1pa","gf8rIECMvU","DG4sTs93Ml","t98iW1j5L8","i3pydMGlTF","taOXKbgJAz",
+"C2Irc5drc6","aL6AJFGzgp","45cIHcL0aE","8xEKzW3VFH","Vprf2d85a9","iwzGkIRh48","bZLvSMK07Y","tjQxsy94nw","RxrsmnFqik","0PktIatef2",
+"S77LHSWfou","Yf2EcVerEA","pmeCdx3LDe","lkMUAjSjS3","JRJQBM6qcG","9XyT9TCgPp","jfREu8FmFH","5Mg9r9XyT9","Oz8yZulk41","hSSvQyEfy9",
+"VerEAnnP8o","AOgEeI7p2a","K4GS8FNYIM","YOfrYKASQ8","AmdQdRzaZA","TXQ0ZLDk6f","Ta8f6uLtKs","Z4I1vQssNC","F6PT2Dz1R3","OxWIHa00b5",
+"yofH3VIlwP","wDajXwiHrZ","ulk41Chuy3","S2DfuRkQke","atef2faHir","Gv3FqMmKGJ","MezSWQChxs","uoStwSmGzv","2DREskZANm","t98iWRBhp0",
+"JJs5meuZA5","K20wKTCgPp","uvf7AF6PT2","pAhR1FwEJz","6AFT07fKYU","9rlg9ECMvU","brhlQuQIcz","CxVEftl72W","Mm8sivLsmS","QWxoTjtn0X",
+"FFDui3otm6","WmadAOUqFM","prNT6S77LH","Cp3mZrhl0J","SbRYyVprf2","NAFuwzbIYY","gtCA5d85a9","pWiOs8RCUA","guMb8zY1GY","5iGN5WMiS3",
+"IKxdLfmIK1","WMiS3BbwgA","lm0pD0ao3l","SbRYyIn3NS","okgRizHF1q","0MR5X5Mg9r","yluBxAOgEe","uQIczIRh48","55rfB7ku1p","lpF6WfcJOy",
+"VerEAprNT6","e6e4zPOUYS","G1RhSvOqCE","FFDuiUlU3M","8FmFHa00b5","k85AeReKEW","RBhp0MmKGJ","9rlg9pWiOs","HfyNQsuY4x","gdQsSD6rBy",
+"W3VFH0h1b1","8RCUABGaQY","lsQGoCp3mZ","aL6AJlweGy","zHF1qxReec","HfyNQP6bcg","azIWpC2Irc","MmsIolCMxy","vLsmSsqVrf","lkMUAVLTy6",
+"tjQxsyToGW","JXljWJ2mQi","O3iyQl83Ud","C2Ircs7Mxk","IBe8kX6Pin","fFDrJJXljW","QbxXcZ4I1v","Q6hMCOz8yZ","RACuj0YAGH","StlDJJRJQB",
+"ydG8US77LH","JRJQBlXFOB","29QAziKqhr","lweGyuQIcz","Cp3mZAkKTk","faHirQWxoT","ZJTXHD6rBy","0Wr5yCdyBV","ZuDtDM3zXL","5IhmGpWiOs",
+"PYBf4ksJby","BCxeCdpe1v","AOgEeZuDtD","24ARFrhl0J","9XyT9l83Ud","yEfy9DcpWB","zFgtBcL0aE","uAWyp1v5hH","5nmWvt98iW","mX2GEpvgjS",
+"HzZT8pFrrl","L7cGcaFFss","ix74rni2v1","aDGtSk85Ae","blLA9NAFuw","LDk6f5IhmG","Yh1hFRxrsm","Q6hMCatef2","5VZjS3otm6","wiHrZjzUqR",
+"ZJTXHulk41","Chuy3jeskS","JJs5mGSQwj","cL0aEZzJHW","iB08l1v5hH","55rfBCp3mZ","XyPZNlm0pD","wiHrZUl4a1","CdyBVpiJSk","ZuDtDEOE1o",
+"8FmFHgdQsS","JKWYRQ6Lix","uvf7AyluBx","07n1cIRh48","BbwgAGSQwj","FhtglWDVWJ","n8pJ9JXljW","5Mg9rgdQsS","IKxdLEoToP","Uvlv4pvgjS",
+"zbIYYAmdQd","29QAzpWiOs","x3LDeSjskQ","DG4sT7ku1p","nnP8obZLvS","2hEEU9y4lw","GSQwj6q6L9","WMiS3nnP8o","yluBxVerEA","JXljWVerEA",
+"lpF6WpT8wu","ZzJHWVNCPd","NhXduaDGtS","Yh1hF8RCUA","I7p2a0BmCy","I7p2aDz1R3","JXljWuLtKs","Pb1pa3otm6","lViBvjS1aj","BGaQYHRxd8",
+"JJs5m55rfB","VerEAZuDtD","580YDBCxeC","No0QbW3VFH","Zv7z0lkMUA","FhtglQworu","tvdkDQClRL","Yh1hFlCMxy","0MR5XtuDyS","5ZaEzBpYhV",
+"4QMc9CK5W7","580YDDLhzM","sqVrf1v5hH","BFkb8dmoS7","RpBQmaL6AJ","CqqaDs93Ml","wDajXs4786","QssNCNxx9V","FGzgpFwEJz","M6qcGCK5W7",
+"1v5hHpAhR1","ulk41HRxd8","tAOsrAXpwE","AXpwEv1Hln","xReec55rfB","hi5X7zQt6Q","e6e4zh1zcH","DcpWBK20wK","Pb1paQ6hMC","soy9tAmdQd",
+"xXTI4azIWp","VIlwPaL6AJ","soy9tKr8ys","brhlQlCMxy","0PktIMezSW","J2mQix3LDe","9iGoTDz1R3","zz4ZUFcWrW","5VZjSzQt6Q","Q6hMCazIWp",
+"v1HlnhSSvQ","BbwgALewvM","0PktItlILt","P6bcg5IhmG","kB5nPjSjS3","KsjRKoVQp6","OHaBz16lHc","lsQGoVIlwP","Cfgr3Z4I1v","YjB9t7lUXZ",
+"hSSvQydG8U","aFFssRACuj","hUTw764s8N","JkzUn0Wr5y","XflUq3weIF","i3pydhUTw7","d85a9k85Ae","gIYvEuLtKs","64s8N7fsYM","dhSuHtl72W",
+"7X3uyDQimp","8U2nUpiJSk","yvOMI5iGN5","IBe8k5VZjS","7ku1p6q6L9","prNT6QClRL","uvf7A14FLR","JRJQB5Drn0","RkQkeW7cTs","580YDLewvM",
+"Gv3Fqdjsrv","W7cTsk85Ae","2TRI7zQt6Q","U3yw5B3qem","7Ow5CHlUbF","lm0pDd85a9","1v5hH0Kyfs","cShY27Ow5C","SWfou5drc6","Kr8ys7hyVv",
+"bgJAzVprf2","ksJbyJIqXi","RsQUqaFFss","RzaZAoGu6x","ydG8UD6rBy","qaofNM6qcG","jzUqRW7cTs","XyPZN55rfB","JIqXikZANm","ZUnqt1v5hH",
+"aFFssb29RJ","iwzGkPb1pa","8cVD3zQt6Q","m4bxU2Yz7E","zY1GYFnPFB","lXFOBlj07Q","kB5nPuN6r3","Q6LixoGu6x","dpe1vFNYIM","VLTy6dhSuH",
+"LbRTH5VZjS","29QAzaFFss","cShY2ECMvU","O3iyQprNT6","lViBvAmdQd","guMb8JXljW","S77LH0MR5X","OUYuFRkQke","KASQ8fqypy","pv0i78cVD3",
+"aFFsseuZA5","0BmCygjUTu","JKWYRQnJ1S","QbxXcuQIcz","uPX7GVNCPd","xXTI4Gv3Fq","cShY2RsQUq","vkCHHcQOnv","ECMvUVIlwP","FxX9q14FLR",
+"jiVBPv1Hln","sx5GlAmdQd","ogLgct59lR","4QMc9618Di","vkCHHBCxeC","o8UydgIYvE","XyPZNxciqp","m4bxUOUYuF","uJScXfmIK1","zqH0Wd85a9",
+"X6PinpvgjS","xXTI4lCMxy","l83UdVNCPd","HRxd8Mkgy8","YOfrY5VZjS","jfREujtn0X","y94nwVerEA","ZhwG1Oz8yZ","zY1GYHzZT8","Waim60Wr5y",
+"uN6r3JJs5m","ogLgcRpBQm","5nmWvfcwDa","OUYuF07n1c","lViBvDcpWB","FhtglyluBx","OHaBzydG8U","YOfrY8cVD3","Y1mC0HfyNQ","FVMxod85a9",
+"iKqhrzFgtB","8xEKz0h1b1","jeskSRxrsm","rhl0J64s8N","Cp3mZJXljW","EdBKcNhXdu","blLA99XyT9","IjTwPwDajX","7ku1pdQ586","vOqCEFNYIM",
+"NAFuwUl4a1","AIYUuGSQwj","MmKGJHzZT8","uQIczeuZA5","Kr8ysfFDrJ","s7MxkMmsIo","TwanoCdyBV","uAWypK20wK","AIYUuyofH3","jiVBPuAWyp",
+"CIShGiB08l","zHF1qMezSW","K4GS864s8N","IjTwPQworu","1v5hHFxX9q","FcWrWVprf2","GWqqXtjQxs","zbIYYDLhzM","wiHrZHfyNQ","4QMc9In3NS",
+"ogLgcfmIK1","U3yw5Mm8si","0MR5X5IhmG","JXljW9XyT9","CK5W77fsYM","qUJMdPYBf4","NcICAZv7z0","9iGoT8xEKz","BCxeCe6e4z","JJs5mciuWz",
+"FnPFB8xEKz","jtn0X4dEz6","sqVrfnFqik","n1pmOZJTXH","zz4ZUJJs5m","2NslmcL0aE","fLNg8WDVWJ","pmeCdZhwG1","PYBf4lXFOB","CK5W7FwEJz",
+"No0QbgdQsS","8cVD3In3NS","TwanoTwano","JkzUnQClRL","4QMc9Nxx9V","lXFOBnlaBy","ZJTXHRxrsm","s4786uTacx","QbxXcYw2oU","Q6hMCuQIcz",
+"Zv7z0cShY2","kB5nPFxX9q","ZUnqtM3zXL","FNYIMJXljW","ksJbyLbRTH","MmKGJI7p2a","RmDcrjS1aj","uoStwjiVBP","6AFT007n1c","BFkb8n8pJ9",
+"J2mQiSmGzv","I7p2av8yFN","nlaByhSSvQ","GWqqXKsjRK","tvdkDJJs5m","BpYhVdmoS7","5iGN5n1pmO","uvf7Ae6e4z","StlDJ5drc6","xXTI4wiHrZ",
+"TwanoFxX9q","ix74rLDk6f","rhl0JCK5W7","9GXkXOUYuF","hE1QlI7p2a","NAFuwyofH3","i3pydGXdoH","7hyVvgIYvE","pv0i7MmsIo","9rlg9TCgPp",
+"BGaQYMGlTF","Dz1R3fLNg8","ulk41HfyNQ","5NammYh1hF","gIYvEDcpWB","wiHrZOUqFM","KASQ8ulk41","2ZHdksx5Gl","rz7UtLewvM","Z4I1vgjUTu",
+"5Mg9rzY1GY","uPX7GpmeCd","fcJOyB3qem","MojnPuAWyp","W7cTstaOXK","sqVrfTXQ0Z","7Ow5CMaJQs","guMb8EoToP","5NammbrhlQ","uvf7Aulk41",
+"PYBf4v1Hln","uAWypM3zXL","brhlQCIShG","hUTw7DcpWB","9rlg99y4lw","TXQ0ZFxX9q","Cfgr3K4GS8","HP433OxWIH","0YAGHQChxs","AXpwEWmadA",
+"lViBvEdBKc","yofH3S2Dfu","iKqhrFGzgp","pmeCdFFDui","MojnPQ6Lix","5NammpmeCd","2TRI7IjTwP","fqypyzFgtB","QbxXcWPmlx","64s8NvOqCE",
+"NOHszo8Uyd","vOqCEPOUYS","pFrrlYf2Ec","5Drn0Vprf2","FVMxoYw2oU","2Nslmdpe1v","FVMxok85Ae","5IhmGpT8wu","cmXIX45cIH","Oz8yZLDk6f",
+"L7cGcpT8wu","Chuy3zbIYY","a00b50ao3l","7hyVv8FmFH","a00b5zFgtB","7fKYUQWxoT","MmKGJydG8U","tl72Wdjsrv","618Di6q6L9","JKWYR8U2nU",
+"qUJMdMojnP","yluBx5Mg9r","UmaEvQssNC","pT8wuBGaQY","IKxdLd7vjM","fcJOy0BmCy","Nxx9VMojnP","aFFss64s8N","8TxD7UmaEv","ZJTXHh1zcH",
+"C2Irclm0pD","fLNg8o8Uyd","oGu6xKsjRK","qaofNo8Uyd","6q6L9fLNg8","UmaEvS77LH","SmGzvo8Uyd","zqH0WQWxoT","7lUXZ5VZjS","Q6hMC5Drn0",
+"5iGN5AXpwE","RmDcrkZANm","618DioGu6x","W3VFH0BmCy","JIqXiAgJHQ","Ul4a1ThjNn","vLsmSCNHmv","5nmWv55rfB","lkMUAgdQsS","CqqaD0Wr5y",
+"tjQxs9GXkX","9XyT9pAhR1","PYBf4l83Ud","JJs5mZJTXH","FhtglfmIK1","Gv3FqgjUTu","ix74r6q6L9","3otm67X3uy","5NammUmaEv","lweGy618Di",
+"VBjhz7ku1p","618DiHlUbF","d85a9uTacx","7fKYUUlU3M","0PktITa8f6","AgJHQjiVBP","UlU3MJXljW","euZA5VjCZq","wiHrZguMb8","Twano9iGoT",
+"HzZT8pAhR1","7hyVvjfREu","QWxoTdQ586","tAOsrpvgjS","VjCZqZzJHW","K4GS8SjskQ","pT8wuWPmlx","UlU3MQWxoT","XflUqXflUq","AmdQdogLgc",
+"VjCZqFcWrW","KASQ8AmdQd","8U2nUyvOMI","Q6hMCjeskS","9rlg9CK5W7","aFFsshUTw7","l83UdTCgPp","2NslmZ4I1v","FhtgllweGy","uN6r3BCxeC",
+"Oz8yZ8xEKz","k85AeaL6AJ","MGlTFBGaQY","uPX7GCfgr3","tlILtqQxHP","Yh1hF6q6L9","lj07QhE1Ql","AmdQdReKEW","2DREsAkKTk","DcpWBVLTy6",
+"soy9tJ2mQi","Ss0ZucQOnv","64s8Ntl72W","fcwDatvdkD","dpe1v1LB1L","jtn0XDz1R3","brhlQHlUbF","7fKYU6q6L9","RkQkelweGy","AgJHQxXTI4",
+"5iGN5EoToP","VIlwPwiHrZ","D6rBya00b5","S2DfuDcpWB","8hJdtVLTy6","8cVD3rKDLJ","CK5W7yofH3","oVQp6jzUqR","n8pJ9k85Ae","VjCZqe6e4z",
+"o8UydlCMxy","MGlTF2ZHdk","qaofNZhwG1","uLtKsHfyNQ","i3pydgdQsS","mz8gxMojnP","atef2DcpWB","1LB1Lulk41","FjHXRCfgr3","VNCPdlViBv",
+"zHF1qEdBKc","k85AeiB08l","s93MlJKWYR","cQOnvVIlwP","vLsmSD6rBy","prNT6FNYIM","8hJdt7lUXZ","QClRL8FmFH","HRxd8gIYvE","MaJQsQClRL",
+"1j5L8Q6Lix","9iGoTuvf7A","wDajX5Drn0","jS1ajuvf7A","HzZT8uTacx","pvgjSfcJOy","hSSvQuoStw","9y4lwv2eC3","y94nwBpYhV","guMb80Kyfs",
+"zz4ZUCNHmv","64s8NIKxdL","WPmlxRxrsm","7X3uyjiVBP","KASQ8FwEJz","jSjS3HzZT8","24ARFzbIYY","x3LDe0MR5X","HfyNQ7X3uy","v2eC3uAWyp",
+"h1zcHBpYhV","3weIFtAOsr","WPmlxG1RhS","lViBvRmDcr","bgJAz1LB1L","3otm6MGlTF","FVMxoVerEA","soy9tEOE1o","No0QbuJScX","RxrsmAkKTk",
+"SjskQuoStw","hE1Qliqv4k","lXFOBaL6AJ","Waim6bZLvS","OHaBzhYBCK","piJSk0ao3l","aL6AJQ6hMC","djsrv580YD","QnJ1SFPfSE","1j5L8jSjS3",
+"AOgEeuAWyp","Q6LixzbIYY","5drc6yEfy9","VLTy60BmCy","nFqik8cVD3","29QAzD6rBy","MmsIob29RJ","AXpwEfcJOy","dpe1vMmKGJ","dmoS7t98iW",
+"14FLRVerEA","5nmWvIKxdL","nFqik16lHc","ksJbyyToGW","5drc6TXQ0Z","soy9tuvf7A","FGzgplm0pD","Vprf2faHir","NhXduzFgtB","GrDg7FFDui",
+"AIYUuFVMxo","KsjRKZUnqt","Q6LixcmXIX","7fKYUtaOXK","I7p2a29QAz","lCMxyt59lR","aDGtSaFFss","aFFssgIYvE","WDVWJe6e4z","8U2nUuoStw",
+"AOgEe9eoRc","StlDJWDVWJ","o8UydcQOnv","ix74r8U2nU","MezSWLbRTH","1LB1LAIYUu","rhl0JmX2GE","ECMvUFVMxo","0PktIVprf2","7fKYUDQimp",
+"hYBCKNxx9V","euZA5tvdkD","WaWsvHzZT8","Nxx9V0Wr5y","5nmWvDz1R3","6AFT0jSjS3","LewvMNxx9V","QChxs6q6L9","SmGzvOUYuF","QbxXc2hEEU",
+"VIlwPJkzUn","uoStwpiJSk","RmDcr1j5L8","fLNg8CK5W7","qUJMdhSSvQ","jtn0XuAWyp","rKDLJix74r","TXQ0ZuLtKs","9rlg9HP433","Cfgr3M6qcG",
+"QssNCTCgPp","uupzky94nw","iqv4k8TxD7","suY4xVNCPd","aez9y0YAGH","ulk41aFFss","jiVBP1v5hH","dmoS7tl72W","RBhp0fLNg8","QWxoTnlaBy",
+"I7p2aqaofN","rz7UtxReec","d7vjMzmLYD","jS1ajprNT6","WreyPvOqCE","0YAGH5nmWv","29QAzL7cGc","5NammRmDcr","1j5L8DLhzM","vOqCEtuDyS",
+"MmKGJQ6hMC","qQxHP0YAGH","oVQp6IKxdL","fFDrJblLA9","fcwDa16lHc","TXQ0ZqaofN","fmIK1VjCZq","BbwgA55rfB","EOE1ovkCHH","K20wKzz4ZU",
+"VjCZqM3zXL","qQxHPDLhzM","iwzGkKASQ8","s93MljS1aj","Yf2EcoGu6x","oQ87rv2eC3","yvOMIKsjRK","FnPFBciuWz","ciuWzlkMUA","uLtKsCdyBV",
+"1v5hHxReec","MmKGJX6Pin","soy9tJRJQB","29QAzTXQ0Z","BbwgAsuY4x","ZhwG1iB08l","WmadAECMvU","cmXIX1LB1L","P6bcgwDajX","8U2nUkZANm",
+"oQ87rulk41","X6PinuZPqg","a00b5TCgPp","atef2aDGtS","zmLYDaFFss","Uvlv4i3pyd","KZamHbrhlQ","SWfouChuy3","CIShGFhtgl","ksJbyTwano",
+"fLNg824ARF","iqv4kTXQ0Z","FFDuiMkgy8","rz7UtK4GS8","PYBf4o8Uyd","lViBvl83Ud","aL6AJTCgPp","b29RJ2Yz7E","24ARFTXQ0Z","RzaZAVLTy6",
+"k85AeJKWYR","brhlQksJby","RBhp0pWiOs","lkMUAl83Ud","ZzJHWyvOMI","qaofN2Yz7E","GSQwjyluBx","fqypyZUnqt","2DREstl72W","cQOnvlm0pD",
+"lCMxywDajX","JkzUnazIWp","pvgjS9iGoT","ZJTXHQYxC0","NAFuwdpe1v","TCgPp1v5hH","Yf2EcAmdQd","n1pmOJXljW","dpe1vm4bxU","okgRijSjS3",
+"DQimp3otm6","kZANmEdBKc","he9IA5iGN5","HzZT8Z4I1v","2DREs7fKYU","blLA9Vprf2","G1RhSWaim6","hSSvQKZamH","tvdkDYh1hF","nFqik2Nslm",
+"D6rByfFDrJ","K4GS8LbRTH","GSQwjRBhp0","Ss0Zuiqv4k","HRxd8pT8wu","tl72WazIWp","IKxdLUvlv4","QworuOUqFM","HfyNQAgJHQ","RzaZAt59lR",
+"fLNg8zbIYY","8hJdtO3iyQ","WmadAVBjhz","2Nslm3otm6","LbRTHKZamH","yEfy95VZjS","CqqaDOz8yZ","9iGoTRsQUq","jeskStlILt","HfyNQzqH0W",
+"FxX9qIn3NS","Z4I1vuoStw","IjTwPrz7Ut","JJs5mJJs5m","RpBQm1v5hH","suY4xNhXdu","blLA9RkQke","Kr8ysjzUqR","pAhR1ZuDtD","DcpWBpAhR1",
+"2DREsMojnP","Nxx9VECMvU","Kr8yss7Mxk","FwEJzHRxd8","B3qem7Ow5C","HfyNQRpBQm","zz4ZUt98iW","L7cGcxReec","5iGN5i3pyd","2DREsKASQ8",
+"0MR5Xl83Ud","blLA9v2eC3","oGu6xD6rBy","fcwDai7WMQ","TXQ0ZQ6hMC","uLtKsnFqik","QWxoTzHF1q","0PktIiKqhr","OUYuF55rfB","K4GS8PYBf4",
+"AXpwEQnJ1S","fcJOy2TRI7","suY4xgtCA5","U3yw5C2Irc","0BmCyuZPqg","hSSvQYf2Ec","Ss0ZuhUTw7","FjHXRAkKTk","Q6hMCQYxC0","Vprf2v1Hln",
+"m4bxUn1pmO","7hyVvzz4ZU","gIYvESbRYy","brhlQpv0i7","CK5W7AIYUu","RBhp0W7cTs","9y4lwCxVEf","4dEz6uQIcz","7lUXZFhtgl","WmadAJXljW",
+"uupzkprNT6","55rfB2hEEU","ogLgciB08l","djsrvuoStw","D6rByqQxHP","EdBKctjQxs","sqVrfPYBf4","JJs5miB08l","QYxC0JKWYR","NAFuwhUTw7",
+"tvdkDFNYIM","rKDLJ0BmCy","5Namm5Mg9r","gjUTuksJby","6AFT0taOXK","SWfou9y4lw","xciqpvkCHH","EoToP0MR5X","9GXkXVerEA","5nmWvVjCZq",
+"uPX7G5VZjS","45cIHGv3Fq","jiVBPpmeCd","F6PT2Cfgr3","oQ87r8cVD3","QYxC0UlU3M","7Ow5Cn1pmO","m4bxUbZLvS","OHaBzY1mC0","sx5GlWMiS3",
+"9XyT9aL6AJ","Oz8yZqQxHP","jS1aj8xEKz","rhl0Jaez9y","Kr8ysIjTwP","jiVBP7fKYU","lweGylXFOB","jiVBPuPX7G","yEfy9MezSW","7fsYM07n1c",
+"hUTw7uupzk","jeskShE1Ql","NhXdufcwDa","FxX9qcL0aE","Dz1R3dmoS7","WreyPzqH0W","suY4x2Nslm","48cHLStlDJ","n1pmOl83Ud","WaWsvnlaBy",
+"Ta8f6aez9y","uZPqgIBe8k","rz7UtTwano","x3LDeRsQUq","Gv3FqMGlTF","djsrvbgJAz","brhlQi7WMQ","B3qemlweGy","Rxrsm7fsYM","KASQ8lpF6W",
+"0h1b1AmdQd","4W0TlfLNg8","OUqFMSWfou","yEfy97X3uy","QYxC00Kyfs","RsQUqlViBv","0ao3laL6AJ","LDk6fJKWYR","2NslmCK5W7","suY4xix74r",
+"lpF6WpiJSk","e6e4zNo0Qb","oQ87rW3VFH","D6rByWPmlx","piJSkQClRL","sqVrfF6PT2","dQ586iKqhr","NOHsz7lUXZ","ThjNnlsQGo","TwanoQssNC",
+"0Kyfs1LB1L","pWiOs1v5hH","8hJdtGv3Fq","lweGyoQ87r","Gv3FqQChxs","6q6L95drc6","0BmCyuTacx","In3NS5iGN5","MezSW9XyT9","fcJOyCK5W7",
+"x3LDelViBv","8U2nUM3zXL","9GXkXtl72W","zbIYYBbwgA","W3VFHS77LH","MmsIoWaWsv","Ta8f6JkzUn","8U2nUNhXdu","kB5nPs4786","NhXdupiJSk",
+"WMiS3RpBQm","t59lRMmsIo","y94nwe6e4z","cmXIXcL0aE","8xEKzTa8f6","tl72Ws4786","FNYIMpmeCd","MmKGJlsQGo","No0Qbv2eC3","S2Dfu5Mg9r",
+"EOE1oM3zXL","7hyVvNxx9V","yofH3StlDJ","oVQp6WreyP","8U2nUhYBCK","hE1QlWDVWJ","S2Dfuru4UG","vLsmSUl4a1","MGlTFoVQp6","QnJ1SIRh48",
+"uupzkogLgc","blLA9rhl0J","2ZHdk5nmWv","v2eC3uLtKs","ulk41Uvlv4","EdBKcQ6Lix","3otm62DREs","pWiOsHzZT8","IjTwPnlaBy","2Yz7E16lHc",
+"euZA5Yh1hF","oVQp6fqypy","a00b5POUYS","ReKEWO3iyQ","pmeCddQ586","iKqhrnFqik","0BmCyfcJOy","FNYIMgf8rI","0ao3lOxWIH","blLA9Chuy3",
+"v8yFN618Di","Yw2oUt59lR","PYBf4ZJTXH","FFDuiJkzUn","ZuDtDtuDyS","yluBxtl72W","9y4lwS2Dfu","TCgPp0Wr5y","nFqikIRh48","pWiOs8TxD7",
+"L7cGcAOgEe","lm0pD2TRI7","jfREuRzaZA","BFkb8Fhtgl","DLhzMuAWyp","LbRTHS2Dfu","YjB9tbZLvS","rhl0JCxVEf","vLsmSMezSW","l83UdmX2GE",
+"euZA54dEz6","8RCUAK20wK","Yw2oUHlUbF","Waim6FwEJz","G1RhSlj07Q","CqqaDVNCPd","aL6AJCqqaD","dpe1vMmsIo","ni2v1nFqik","UlU3MCK5W7",
+"8RCUA29QAz","OxWIHBbwgA","3otm6KZamH","3otm645cIH","WmadAYw2oU","aFFsspT8wu","l83Ud64s8N","Kr8ysUvlv4","tvdkDBbwgA","Kr8ysmX2GE",
+"FFDuiXyPZN","X6PinwiHrZ","vkCHHfmIK1","I7p2an1pmO","djsrv5iGN5","mX2GEIKxdL","K4GS84dEz6","0h1b1X6Pin","yofH35nmWv","5nmWv0Kyfs",
+"h1zcHpAhR1","gjUTuiwzGk","Mkgy87X3uy","AOgEehSSvQ","b29RJZUnqt","MmsIo8RCUA","FVMxooQ87r","8U2nUECMvU","uvf7AKZamH","aL6AJv1Hln",
+"BbwgAmz8gx","h1zcHjiVBP","nnP8ot98iW","48cHLJXljW","VBjhzQssNC","v8yFNsqVrf","tjQxsgdQsS","ix74r1LB1L","CqqaDMmsIo","8U2nU7lUXZ",
+"oVQp6pvgjS","YOfrY580YD","P6bcgaez9y","1j5L8CIShG","WMiS3lj07Q","SmGzva00b5","OUYuFnFqik","YOfrYSWfou","4QMc9aez9y","lH1ktECMvU",
+"fLNg8RzaZA","WaWsvwiHrZ","5Drn0mz8gx","Y1mC0pAhR1","5IhmGXflUq","iqv4kUlU3M","uLtKsk85Ae","iB08ly94nw","taOXKAkKTk","Chuy35drc6",
+"faHirWmadA","OxWIH0h1b1","cmXIX7ku1p","VLTy61v5hH","BFkb85VZjS","fLNg8uN6r3","JXljW8xEKz","8xEKzTwano","EoToPMaJQs","GWqqXsoy9t",
+"MmKGJZzJHW","2hEEUaDGtS","DG4sT0Wr5y","pAhR1Nxx9V","5iGN5jfREu","2TRI7Ss0Zu","suY4xtaOXK","lweGyqQxHP","7hyVv0Wr5y","pvgjS0Kyfs",
+"a00b5LDk6f","faHirjSjS3","Yh1hFqUJMd","wiHrZYOfrY","rhl0JgIYvE","QssNCokgRi","8U2nUh1zcH","pmeCdi7WMQ","XflUqVerEA","xciqpl83Ud",
+"JIqXii7WMQ","tvdkDzY1GY","I7p2aWDVWJ","gf8rIVBjhz","tAOsrFjHXR","G1RhSv8yFN","0BmCyMmsIo","7fsYMQ6Lix","okgRiW7cTs","EOE1oy94nw",
+"brhlQyofH3","lsQGoQ6Lix","CqqaDAOgEe","9rlg9kZANm","uTacxlViBv","SjskQiqv4k","ix74rhUTw7","JXljWbgJAz","FLsphatef2","8xEKz7ku1p",
+"Mm8sitvdkD","ThjNnWmadA","16lHctuDyS","jzUqRuZPqg","v8yFNG1RhS","MaJQsVIlwP","WDVWJdjsrv","piJSkgf8rI","2TRI7Vprf2","MojnPThjNn",
+"uAWypt59lR","uN6r3CNHmv","jiVBPoGu6x","Mkgy8BbwgA","No0Qb5Namm","zQt6Qv2eC3","hUTw7StlDJ","zmLYDAgJHQ","3otm6WreyP","azIWphE1Ql",
+"s93MldQ586","euZA5618Di","W3VFHzqH0W","F6PT2a00b5","QbxXcfaHir","jSjS3In3NS","Gv3FqW3VFH","MojnP7fKYU","xciqpFLsph","prNT6gjUTu",
+"RxrsmprNT6","IBe8kjzUqR","ciuWzi7WMQ","y94nwKsjRK","vOqCElViBv","aL6AJt98iW","nlaByksJby","Vprf2wiHrZ","RmDcrHfyNQ","OUYuFlkMUA",
+"Oz8yZECMvU","iqv4ks93Ml","ZuDtDdpe1v","RACujWPmlx","jSjS32Nslm","t98iW7fsYM","FLsphKASQ8","he9IAWreyP","jSjS3TCgPp","ogLgcPYBf4",
+"GSQwj580YD","iqv4keuZA5","aL6AJlm0pD","FxX9qKZamH","DLhzMUvlv4","L7cGcs4786","WreyP8TxD7","nlaByVBjhz","uN6r38cVD3","1v5hH0BmCy",
+"JJs5mMmKGJ","azIWp3otm6","Ul4a1tuDyS","ReKEWqQxHP","Waim6fFDrJ","CIShGFcWrW","iwzGkaFFss","HRxd82Nslm","K4GS8cL0aE","K4GS8MmsIo",
+"IRh48BCxeC","QWxoTbrhlQ","FcWrWRkQke","nlaByLDk6f","IRh48StlDJ","b29RJVjCZq","1LB1L8U2nU","RBhp0618Di","RzaZApFrrl","oGu6xmX2GE",
+"DLhzMeuZA5","AkKTkpT8wu","KASQ8tjQxs","W3VFHbgJAz","ZhwG1IRh48","lm0pDF6PT2","d85a9618Di","tuDySTwano","ix74roGu6x","iKqhr9XyT9",
+"l83UdpFrrl","CdyBVblLA9","CdyBVRsQUq","iKqhrM3zXL","TCgPpdQ586","aFFsss7Mxk","d7vjMNcICA","dpe1vDG4sT","CIShGeuZA5","aDGtSQworu",
+"ulk41Y1mC0","8RCUARpBQm","KsjRKB3qem","HlUbFDG4sT","s47865iGN5","7X3uyi3pyd","7hyVvlCMxy","aL6AJ0ao3l","FhtglOz8yZ","4dEz6tlILt",
+"lweGys4786","9XyT9cQOnv","lCMxycQOnv","ECMvUMK07Y","v2eC3fFDrJ","W3VFHCK5W7","v1Hln0PktI","bZLvShYBCK","lkMUA29QAz","yofH35VZjS",
+"W3VFHWaim6","618DiIRh48","HRxd8faHir","uQIczcQOnv","EdBKcgdQsS","W7cTs7lUXZ","h1zcHVNCPd","lXFOBy94nw","BGaQY2TRI7","k85Aeaez9y",
+"GrDg7NAFuw","StlDJQChxs","mz8gxpiJSk","ZUnqtK20wK","2ZHdkgtCA5","aFFssLbRTH","Waim6nlaBy","azIWpAkKTk","WMiS3a00b5","uLtKshYBCK",
+"JIqXiuN6r3","aez9y0PktI","MmsIo0Kyfs","1j5L8Yh1hF","RsQUqWreyP","iKqhrlm0pD","7Ow5CxReec","QWxoTVIlwP","zY1GYOUYuF","ZhwG1MK07Y",
+"ulk41Yf2Ec","bZLvSpT8wu","fmIK1gIYvE","UmaEv0ao3l","B3qemJXljW","QbxXchYBCK","ZuDtDvLsmS","MK07Y2hEEU","nlaBymX2GE","Q6hMCfaHir",
+"DG4sT9rlg9","MmsIoMkgy8","3weIF8TxD7","GXdoHtAOsr","ZhwG1Ta8f6","fmIK1taOXK","QClRLqUJMd","U3yw5CIShG","qQxHPlsQGo","BCxeCReKEW",
+"Cp3mZIjTwP","bgJAzW7cTs","jtn0XMGlTF","a00b5pAhR1","L7cGcQ6hMC","lViBvMm8si","RzaZA3weIF","AOgEev8yFN","pWiOsFLsph","zHF1qFnPFB",
+"1v5hHStlDJ","QnJ1SL7cGc","guMb8VjCZq","a00b5HP433","GXdoHaDGtS","LewvMdQ586","IRh488cVD3","v2eC3GXdoH","QnJ1SqaofN","Vprf2HzZT8",
+"hUTw7dpe1v","I7p2a2TRI7","nFqiky94nw","MmKGJAIYUu","ru4UGcmXIX","IRh48QClRL","dpe1vbrhlQ","9XyT9zmLYD","s7Mxk24ARF","2NslmOz8yZ",
+"BpYhVQChxs","wDajXS2Dfu","HzZT88hJdt","QnJ1SVNCPd","v1Hln0ao3l","Gv3Fqs4786","Cfgr355rfB","45cIHrKDLJ","EOE1o64s8N","Dz1R31LB1L",
+"HlUbFBGaQY","EdBKchE1Ql","2DREsfaHir","0YAGHBbwgA","7fsYMVIlwP","s4786i7WMQ","nFqikPYBf4","CxVEfMaJQs","d7vjMtuDyS","DG4sTRxrsm",
+"aFFsszY1GY","MmsIoNOHsz","ksJbypAhR1","5VZjSgIYvE","BGaQYQClRL","JKWYRuTacx","lXFOBKZamH","xciqp5iGN5","LewvMv8yFN","tvdkDGXdoH",
+"yToGW0ao3l","0YAGHwDajX","No0Qb6q6L9","i7WMQUmaEv","IRh480Wr5y","sx5GlOz8yZ","rz7Ut7lUXZ","fcwDaJIqXi","l83UdFGzgp","8hJdtQChxs",
+"iB08lCxVEf","8FmFHazIWp","uJScXhUTw7","jtn0X3weIF","SjskQuupzk","ni2v1UmaEv","cmXIX1j5L8","fcJOyCqqaD","ZzJHWhSSvQ","jeskSpv0i7",
+"iwzGkM6qcG","dpe1vtvdkD","zQt6QAmdQd","t98iWUl4a1","Rxrsm8FmFH","FNYIMn1pmO","tAOsr5drc6","guMb8bZLvS","8cVD3FGzgp","uvf7AlXFOB",
+"WMiS3EoToP","VBjhzMmKGJ","IRh48WmadA","faHirQworu","pmeCdtaOXK","8U2nU9GXkX","xciqpFjHXR","v1HlnfcwDa","suY4xPYBf4","ix74rfLNg8",
+"wiHrZuvf7A","8TxD7uPX7G","sqVrfpAhR1","tlILtMK07Y","0h1b1iKqhr","S77LHjiVBP","5nmWvsuY4x","nnP8o1j5L8","hSSvQ7X3uy","TXQ0ZdhSuH",
+"Mkgy8lsQGo","5drc62DREs","i7WMQFGzgp","WPmlxIBe8k","Yh1hFQ6Lix","EdBKcWmadA","FVMxoDQimp","ZUnqtFVMxo","HP433oQ87r","MK07Ypv0i7",
+"Waim6WmadA","kZANmdhSuH","lkMUAy94nw","i3pyduLtKs","fqypylCMxy","ksJbyHlUbF","uLtKs3weIF","Yw2oUIBe8k","nnP8oZv7z0","SbRYyAgJHQ",
+"ru4UG1j5L8","Zv7z00Wr5y","l83UdNAFuw","IjTwPs93Ml","v1Hlnru4UG","GXdoH9GXkX","CdyBV1LB1L","Uvlv4zQt6Q","kZANmBGaQY","jeskSFnPFB",
+"NOHszAgJHQ","nnP8o8U2nU","9y4lwrhl0J","cL0aEogLgc","ix74rvkCHH","zQt6QguMb8","HP4335iGN5","AXpwEFVMxo","0MR5XuZPqg","uQIcz7hyVv",
+"qQxHPazIWp","VNCPdNxx9V","fqypyFFDui","DLhzMEOE1o","I7p2azmLYD","VerEAlm0pD","gdQsSCxVEf","7hyVvK20wK","sx5GliB08l","uoStw6q6L9",
+"CdyBVvkCHH","RBhp09GXkX","VLTy6b29RJ","AgJHQI7p2a","2hEEUFVMxo","gf8rIVjCZq","pmeCdn1pmO","VjCZqpFrrl","gtCA55VZjS","C2Irc0PktI",
+"Uvlv40MR5X","AmdQdGSQwj","F6PT2GXdoH","JJs5mChuy3","Yf2EcSs0Zu","Ul4a1t98iW","FNYIMZuDtD","3weIFD6rBy","JIqXijiVBP","lkMUAOxWIH",
+"gtCA5fqypy","pWiOs8hJdt","qUJMdjiVBP","OUqFMJ2mQi","In3NSFPfSE","MezSWs7Mxk","fLNg8fcwDa","BpYhVgIYvE","dhSuHdhSuH","yvOMIMm8si",
+"blLA9iwzGk","a00b5bgJAz","oGu6xWaim6","oVQp648cHL","55rfBlj07Q","MmsIogjUTu","aL6AJpAhR1","16lHcHlUbF","EOE1oMK07Y","Fhtgln1pmO",
+"JXljWJJs5m","AkKTk7fKYU","M6qcGJRJQB","FcWrWIBe8k","CqqaDhSSvQ","jS1ajsoy9t","64s8NP6bcg","WaWsvWDVWJ","9rlg9pvgjS","HfyNQYw2oU",
+"okgRifqypy","W7cTsPb1pa","qaofNy94nw","Nxx9V580YD","pmeCd1LB1L","atef2IBe8k","FwEJzzHF1q","Ta8f6Yh1hF","zqH0WgtCA5","DcpWB618Di",
+"KASQ8S2Dfu","xciqpECMvU","SbRYyaL6AJ","QClRLWPmlx","dQ586cQOnv","lweGyRBhp0","UmaEvMojnP","BpYhVazIWp","euZA5FLsph","WreyPFPfSE",
+"WmadAsqVrf","Gv3FqhSSvQ","In3NSB3qem","55rfBzqH0W","prNT6MmKGJ","2Nslm2Nslm","pvgjSuQIcz","lweGyHP433","45cIH7fKYU","TCgPpSWfou",
+"7lUXZFPfSE","iKqhr2DREs","vkCHH5drc6","zmLYDTa8f6","brhlQwiHrZ","oQ87r7ku1p","5ZaEz0MR5X","W3VFHJkzUn","5VZjSD6rBy","8RCUAogLgc",
+"M3zXLI7p2a","16lHcpAhR1","lViBvlm0pD","pFrrlM6qcG","zz4ZUx3LDe","LDk6fW7cTs","7fsYMGv3Fq","RBhp0rKDLJ","blLA9Fhtgl","AXpwEFNYIM",
+"2Nslm24ARF","O3iyQ5Mg9r","5IhmGydG8U","d7vjMuupzk","Cfgr3QYxC0","580YDoGu6x","RACujFVMxo","zbIYYzz4ZU","Nxx9VX6Pin","zQt6QnnP8o",
+"zqH0WPb1pa","nFqikx3LDe","580YD6q6L9","jSjS3580YD","AkKTkTa8f6","FGzgpCxVEf","v8yFNh1zcH","aez9y45cIH","kZANm2Nslm","MmsIod85a9",
+"FGzgppiJSk","taOXK5Mg9r","Ss0ZulweGy","BCxeCazIWp","RzaZAnnP8o","Waim6oVQp6","FwEJzi3pyd","cShY29XyT9","dQ586rKDLJ","iqv4kU3yw5",
+"dhSuHUl4a1","fqypyVprf2","m4bxU5nmWv","dpe1v5Namm","MezSWGWqqX","5VZjSXflUq","vkCHHCfgr3","2DREsAmdQd","KsjRKL7cGc","iqv4kdpe1v",
+"jiVBPSjskQ","e6e4zsuY4x","tuDySzz4ZU","n1pmOPOUYS","qUJMdsx5Gl","bZLvSZ4I1v","i3pydt59lR","LewvMi3pyd","OUqFMyvOMI","jS1ajeuZA5",
+"Ta8f6sx5Gl","FVMxoPb1pa","2hEEUFPfSE","kB5nPaL6AJ","rz7UtSWfou","pAhR1ni2v1","pT8wudjsrv","UmaEvWaWsv","AIYUuIKxdL","taOXKpv0i7",
+"U3yw5t98iW","Yw2oUHzZT8","4QMc9jzUqR","bgJAzTa8f6","nFqikOUYuF","tl72WzHF1q","Uvlv4NAFuw","vOqCE16lHc","J2mQiF6PT2","GrDg7nFqik",
+"WDVWJ14FLR","aL6AJazIWp","IBe8kzmLYD","IBe8kpFrrl","07n1cDG4sT","CdyBVm4bxU","KsjRK6q6L9","L7cGc0Kyfs","WMiS3fmIK1","14FLRi3pyd",
+"8xEKzGrDg7","atef2Rxrsm","oVQp6kZANm","WDVWJMojnP","vLsmSIKxdL","v1HlnRBhp0","d85a90h1b1","OUqFMS77LH","s7MxkG1RhS","lH1ktSbRYy",
+"5ZaEzcL0aE","2ZHdkydG8U","Zv7z07lUXZ","0KyfsQssNC","djsrv24ARF","lsQGofcwDa","djsrvNhXdu","2TRI7brhlQ","6q6L94QMc9","RsQUq9y4lw",
+"jzUqRM6qcG","F6PT2BpYhV","Chuy34dEz6","JXljWokgRi","Z4I1v4W0Tl","jzUqR1LB1L","SWfoubgJAz","tl72WJkzUn","aDGtS6AFT0","SWfouQChxs",
+"v8yFNCp3mZ","CNHmvm4bxU","F6PT2l83Ud","ciuWztuDyS","Vprf2ydG8U","0h1b1DcpWB","Waim6tlILt","07n1cP6bcg","cQOnvoQ87r","L7cGcjiVBP",
+"ru4UGzz4ZU","zQt6QX6Pin","dQ586zQt6Q","ksJbyZ4I1v","hi5X7AIYUu","he9IAgIYvE","IRh48BbwgA","t98iWsx5Gl","gjUTurhl0J","lweGyatef2",
+"FxX9qeuZA5","XyPZNNxx9V","WaWsvRpBQm","MojnPaDGtS","TCgPpD6rBy","NhXduJKWYR","580YDAgJHQ","IKxdLI7p2a","h1zcHS77LH","No0QbOUYuF",
+"i7WMQl83Ud","rz7Uts7Mxk","D6rByFcWrW","64s8NMGlTF","fLNg8wiHrZ","EOE1oQClRL","ulk41dhSuH","24ARF6AFT0","9eoRcAgJHQ","blLA9oVQp6",
+"GWqqXaez9y","PYBf4Fhtgl","5VZjSlm0pD","FjHXRW7cTs","uvf7A0MR5X","zqH0Ws93Ml","WPmlxtl72W","IjTwPVLTy6","k85AeDLhzM","7lUXZP6bcg",
+"VLTy6AXpwE","580YDMkgy8","KASQ8lCMxy","W3VFHFnPFB","45cIHFjHXR","7fsYMzHF1q","iqv4kFPfSE","mX2GEPYBf4","MezSWDz1R3","AmdQdfaHir",
+"SmGzvTXQ0Z","v2eC3zz4ZU","zz4ZUh1zcH","ZhwG1uTacx","zY1GYLewvM","0ao3l7hyVv","14FLRHzZT8","Cp3mZFPfSE","sx5GlKASQ8","euZA55nmWv",
+"Yh1hFpv0i7","C2IrcMaJQs","ECMvUzQt6Q","16lHcAmdQd","NAFuwl83Ud","FcWrWjS1aj","zz4ZUtaOXK","UmaEvkZANm","FxX9qBFkb8","45cIHkB5nP",
+"MaJQsfcJOy","ydG8Ud7vjM","GXdoH8cVD3","CIShGjeskS","hSSvQpiJSk","lViBvZv7z0","JXljWQ6hMC","2Yz7EjzUqR","BbwgAUmaEv","HlUbFnnP8o",
+"2TRI7Dz1R3","VBjhzUmaEv","8FmFHK4GS8","GWqqXiKqhr","uQIczCxVEf","0ao3luoStw","MezSWtjQxs","cmXIXQChxs","iKqhrZuDtD","i3pyd5IhmG",
+"dpe1vuPX7G","zmLYDvkCHH","t98iW7hyVv","lH1ktlXFOB","Zv7z09GXkX","qaofNCp3mZ","iKqhrbZLvS","Dz1R3y94nw","DG4sTD6rBy","64s8Ngf8rI",
+"uAWyp0ao3l","YOfrYPb1pa","tvdkD0YAGH","7lUXZgjUTu","ydG8U2Yz7E","AmdQdhUTw7","vkCHHa00b5","AOgEeo8Uyd","rz7UtQClRL","uJScXVBjhz",
+"1v5hH5Mg9r","Gv3Fqv2eC3","lViBvuLtKs","D6rByhSSvQ","RsQUqpFrrl","dmoS7gjUTu","WreyPfcJOy","VjCZqGv3Fq","ru4UGXyPZN","jfREu4W0Tl",
+"jeskSVLTy6","Cp3mZyofH3","lCMxylViBv","pvgjSrhl0J","MojnPm4bxU","WDVWJyToGW","euZA57hyVv","GWqqXsqVrf","hYBCKQ6Lix","RpBQmjtn0X",
+"s4786CxVEf","AIYUuMkgy8","NcICAni2v1","tAOsrU3yw5","gdQsSX6Pin","hE1Ql0YAGH","xciqpMK07Y","nFqikjzUqR","BpYhVFcWrW","Dz1R3M6qcG",
+"7lUXZ0BmCy","Z4I1v1LB1L","KsjRKogLgc","2Yz7ES2Dfu","fcwDa5iGN5","xReecRsQUq","8RCUA0YAGH","JkzUnfqypy","IBe8kK4GS8","k85AeChuy3",
+"zbIYY618Di","BCxeCcL0aE","IRh48D6rBy","Cfgr3HRxd8","FcWrW2Nslm","FwEJzjtn0X","OUYuFprNT6","AkKTkjfREu","vkCHHgf8rI","zQt6QqQxHP",
+"oGu6xO3iyQ","wDajXgjUTu","fFDrJ7Ow5C","FjHXRC2Irc","1j5L8s4786","uLtKszFgtB","guMb84QMc9","EdBKcpmeCd","IKxdLWMiS3","kB5nPQClRL",
+"mX2GElweGy","s93MlTCgPp","hYBCKXflUq","2NslmuAWyp","6AFT0OxWIH","ciuWzRACuj","xciqpMaJQs","bZLvSlXFOB","aFFssgdQsS","In3NSIRh48",
+"No0QbVNCPd","ydG8UKsjRK","GWqqXYjB9t","QClRLjeskS","piJSkazIWp","Gv3FqcmXIX","BGaQYUvlv4","FNYIM0BmCy","FGzgpv1Hln","HfyNQIn3NS",
+"Yh1hFRmDcr","0YAGHs7Mxk","I7p2ajS1aj","qaofNJJs5m","MK07Yi7WMQ","2DREs1j5L8","i3pydZzJHW","0KyfsFnPFB","lsQGoLbRTH","JJs5mVNCPd",
+"RmDcrECMvU","yEfy9kB5nP","3otm6Uvlv4","29QAznFqik","M3zXLDz1R3","VjCZqydG8U","OxWIHogLgc","mX2GEAOgEe","QYxC0xciqp","soy9tzbIYY",
+"VjCZqNxx9V","v2eC3S2Dfu","WMiS3qaofN","24ARFAXpwE","2Nslmdjsrv","4dEz6OHaBz","okgRiaFFss","M3zXLaFFss","BFkb8ReKEW","rKDLJMkgy8",
+"pvgjS5VZjS","Oz8yZtjQxs","FFDuiOz8yZ","SWfoupmeCd","KsjRKZJTXH","jtn0XWaim6","9eoRcmz8gx","uN6r3tuDyS","blLA9xReec","gjUTuCNHmv",
+"PYBf4pAhR1","lkMUAk85Ae","uPX7GpWiOs","lsQGoIn3NS","Y1mC0TCgPp","uPX7Gt59lR","oQ87rUl4a1","RxrsmoGu6x","Kr8ys0PktI","v1Hln4QMc9",
+"oGu6xtl72W","Vprf2i7WMQ","iKqhr8FmFH","7fsYMYOfrY","GSQwj1j5L8","lCMxyHlUbF","4QMc9AXpwE","45cIHyofH3","qaofNix74r","euZA5BbwgA",
+"ThjNne6e4z","MK07Yv2eC3","Cfgr3Chuy3","PYBf4Yw2oU","RBhp0gtCA5","TwanoMmsIo","618DiVprf2","CNHmvRmDcr","blLA9RmDcr","Y1mC0cL0aE",
+"580YDvkCHH","5VZjS4dEz6","e6e4zNcICA","OUqFMfFDrJ","zz4ZUnFqik","qaofNiqv4k","4W0Tlm4bxU","M6qcGWaim6","JXljWi7WMQ","RmDcroVQp6",
+"RACujWDVWJ","9GXkXLewvM","EdBKcCp3mZ","sqVrfU3yw5","pT8wuVBjhz","G1RhSRxrsm","X6Pin1LB1L","VNCPdzHF1q","Mkgy8RmDcr","1j5L8TXQ0Z",
+"jS1ajpFrrl","ThjNn16lHc","cQOnvGWqqX","dhSuHJkzUn","StlDJ6AFT0","Pb1palViBv","AgJHQzFgtB","s7MxkQnJ1S","9iGoTJkzUn","BFkb8No0Qb",
+"AXpwEkB5nP","ogLgcfqypy","0YAGHe6e4z","pvgjS580YD","dmoS7vOqCE","BFkb8MmsIo","2hEEUni2v1","MaJQsgdQsS","v8yFNyToGW","WaWsvMezSW",
+"5IhmGogLgc","yToGWtaOXK","Yw2oUXflUq","cL0aEMmKGJ","zmLYDHP433","POUYS1LB1L","yvOMICfgr3","Chuy3DLhzM","Ss0Zu9eoRc","BFkb8NcICA",
+"BbwgAo8Uyd","aL6AJGXdoH","OUqFMiB08l","6AFT09XyT9","FnPFBSbRYy","ZhwG12TRI7","IjTwP8cVD3","45cIHzmLYD","rKDLJ8TxD7","QssNCHlUbF",
+"ulk41Q6hMC","8TxD7gjUTu","Dz1R3RpBQm","fcwDaIRh48","9iGoT8FmFH","48cHLe6e4z","JJs5m8FmFH","fcwDaVerEA","brhlQzz4ZU","pvgjScQOnv",
+"uoStwm4bxU","bgJAzVIlwP","AgJHQHP433","AIYUuDcpWB","cmXIXLbRTH","jzUqRlm0pD","aFFssNcICA","9XyT9Mm8si","4QMc9XyPZN","AmdQdX6Pin",
+"pvgjSFNYIM","FcWrW7Ow5C","pWiOs45cIH","RzaZAHRxd8","lXFOBVLTy6","jtn0X0h1b1","lj07QWaim6","0BmCyyToGW","aez9yC2Irc","ciuWzLewvM",
+"xciqpY1mC0","nlaByuoStw","wDajX5nmWv","kZANmQworu","FxX9q8FmFH","VBjhzCNHmv","yEfy9tvdkD","5NammmX2GE","QnJ1SRmDcr","tjQxsRpBQm",
+"Cp3mZ0ao3l","uvf7AhUTw7","DQimpCp3mZ","5drc67fKYU","Uvlv4UmaEv","b29RJix74r","MaJQsuQIcz","ciuWzSbRYy","StlDJRACuj","CIShGAmdQd",
+"yvOMIh1zcH","m4bxUEoToP","gIYvEFwEJz","t59lR5IhmG","zQt6QUl4a1","Ul4a1dQ586","5drc69XyT9","FhtglWmadA","WMiS3o8Uyd","KZamHPOUYS",
+"vLsmSb29RJ","9XyT9kZANm","gtCA5uoStw","rz7Ut8U2nU","uTacxCxVEf","8xEKzDcpWB","uLtKsFhtgl","nFqik7hyVv","prNT6azIWp","wiHrZv8yFN",
+"xXTI4RmDcr","xReecIjTwP","RACujWaWsv","ZuDtDe6e4z","K20wK2ZHdk","b29RJVBjhz","4W0TlVNCPd","cQOnvKZamH","14FLRQssNC","4W0Tld7vjM",
+"DQimph1zcH","sx5Gl1j5L8","jzUqRNxx9V","AkKTkCxVEf","zz4ZUlsQGo","v1Hlni3pyd","aL6AJxXTI4","lCMxy24ARF","Ss0Zuk85Ae","SmGzv4dEz6",
+"CxVEfD6rBy","Cfgr3aDGtS","n1pmO8FmFH","1LB1L16lHc","FLsphtAOsr","ix74rPb1pa","dhSuHOxWIH","5Namm3otm6","2ZHdk2hEEU","piJSkMm8si",
+"OHaBzL7cGc","qaofN0MR5X","BGaQYfqypy","YOfrYlH1kt","fFDrJpT8wu","HP433FxX9q","QssNCZv7z0","Chuy31j5L8","9GXkXTa8f6","bgJAzO3iyQ",
+"HfyNQogLgc","CK5W7vLsmS","FhtglpT8wu","GWqqXzmLYD","5iGN5v1Hln","RACujfqypy","IjTwP7lUXZ","U3yw5uLtKs","7lUXZuoStw","fLNg84QMc9",
+"LDk6f5Drn0","U3yw5qQxHP","sx5GlciuWz","i3pydIKxdL","pvgjSZ4I1v","2TRI7ZuDtD","s7MxkzFgtB","VjCZq7Ow5C","Gv3FqECMvU","nFqikRzaZA",
+"YOfrYcShY2","2Nslmix74r","5IhmGgIYvE","FNYIM4W0Tl","mz8gxjiVBP","RxrsmQClRL","AmdQdUl4a1","Uvlv4TXQ0Z","MGlTFEOE1o","StlDJiKqhr",
+"0PktIAIYUu","nFqikCqqaD","8U2nUChuy3","YjB9tRxrsm","StlDJnlaBy","FNYIMG1RhS","07n1ciKqhr","0h1b1k85Ae","Mkgy8RpBQm","JRJQBAOgEe",
+"MK07YzbIYY","Yw2oUReKEW","I7p2at59lR","n8pJ9AOgEe","FVMxouLtKs","UmaEv5IhmG","8RCUASWfou","dpe1vxXTI4","hE1QlVprf2","8cVD3guMb8",
+"Qworumz8gx","dQ586VerEA","D6rByGSQwj","hUTw7AIYUu","wiHrZxciqp","qUJMd5Drn0","FnPFBVLTy6","9y4lw29QAz","tuDySJ2mQi","X6PinY1mC0",
+"rz7Utfqypy","7ku1pZhwG1","VLTy6XyPZN","uZPqgeuZA5","9GXkXC2Irc","tlILtMezSW","bgJAzyofH3","0KyfsguMb8","fcJOyCIShG","Ss0ZuvOqCE",
+"xReecwDajX","d7vjMuoStw","W3VFHCdyBV","DG4sTY1mC0","lsQGoa00b5","J2mQimz8gx","KsjRKJXljW","yluBx6q6L9","NhXduIKxdL","bZLvSReKEW",
+"DcpWBiqv4k","kB5nPSjskQ","1v5hHlm0pD","FjHXRLDk6f","HlUbFJJs5m","hE1QluN6r3","Q6hMCZuDtD","Ul4a1F6PT2","VIlwPzqH0W","Dz1R3guMb8",
+"C2IrcSWfou","AOgEeatef2","ni2v15nmWv","MaJQssuY4x","Ta8f6CxVEf","OUYuFbZLvS","YjB9tVBjhz","KZamHJXljW","tuDySt98iW","W7cTsjeskS",
+"VBjhzDG4sT","djsrvzz4ZU","Vprf25ZaEz","i3pydSs0Zu","LDk6fuQIcz","ThjNnFFDui","v8yFNOxWIH","0MR5XlH1kt","he9IAmz8gx","SbRYyFxX9q",
+"yofH3jzUqR","sqVrfOHaBz","QnJ1S3otm6","IBe8k5ZaEz","qQxHPuAWyp","iwzGkWMiS3","6AFT0Ss0Zu","uoStwxciqp","2DREsVBjhz","0KyfssuY4x",
+"cQOnvZUnqt","7lUXZqaofN","5VZjSk85Ae","Mm8si4W0Tl","BbwgAeuZA5","oGu6xeuZA5","KZamH2Nslm","hSSvQSs0Zu","aez9yFGzgp","e6e4zL7cGc",
+"48cHLTwano","No0QbQworu","xciqpWDVWJ","uJScXTa8f6","BpYhVhSSvQ","zHF1qKZamH","HlUbFGSQwj","FwEJz6q6L9","SWfou24ARF","ThjNnblLA9",
+"TXQ0ZFGzgp","lm0pD7ku1p","Q6Lix5Mg9r","vkCHHWmadA","Mkgy8prNT6","9XyT9S77LH","5NammVjCZq","jSjS3RzaZA","vOqCE2ZHdk","v8yFNK20wK",
+"07n1cjeskS","ulk41bZLvS","hUTw7dmoS7","Zv7z0aez9y","ZuDtDdQ586","JIqXikB5nP","RkQkeuZPqg","WPmlxtjQxs","JXljWmz8gx","pWiOsn8pJ9",
+"xciqpNxx9V","48cHLRsQUq","ru4UGZJTXH","aez9yzbIYY","hE1Ql7ku1p","8cVD3s93Ml","pFrrlMezSW","ReKEWEdBKc","FVMxoBFkb8","QnJ1SCK5W7",
+"W7cTsBFkb8","e6e4zni2v1","QbxXcpmeCd","Gv3FqcL0aE","EdBKcokgRi","MojnP2hEEU","guMb8blLA9","8cVD3tl72W","BFkb8BGaQY","UlU3MFjHXR",
+"BGaQYLDk6f","FLsphjtn0X","G1RhS5nmWv","8cVD3CK5W7","NhXduLewvM","aDGtSuTacx","FhtglRBhp0","iB08luLtKs","lViBv8TxD7","VjCZqPOUYS",
+"lm0pD0Wr5y","FPfSE8cVD3","Waim6Uvlv4","In3NScShY2","YjB9tOxWIH","iwzGkCfgr3","ydG8UpiJSk","prNT6IBe8k","x3LDe5drc6","wDajXv1Hln",
+"xciqpqaofN","LbRTHNcICA","NcICAyofH3","MojnPpvgjS","kB5nPlViBv","ksJbyUl4a1","SWfouuvf7A","ZJTXHlsQGo","ogLgcSjskQ","jiVBPCdyBV",
+"v1HlnpiJSk","gdQsSbgJAz","tuDySy94nw","yToGWBbwgA","ECMvUguMb8","HfyNQokgRi","lweGyFFDui","dhSuHtAOsr","ThjNnFPfSE","FGzgpRpBQm",
+"FPfSEWreyP","nlaByiB08l","NhXduhUTw7","piJSkS2Dfu","M3zXLiqv4k","OUYuFM6qcG","vLsmS2Nslm","nnP8ovkCHH","LbRTH9XyT9","FcWrWnFqik",
+"sqVrfe6e4z","0BmCykB5nP","Gv3FqjfREu","BGaQY2Nslm","0YAGHB3qem","KZamHZhwG1","euZA5tAOsr","d85a9YOfrY","IRh48yvOMI","Z4I1vwiHrZ",
+"dQ586zFgtB","uN6r3VerEA","Zv7z0KZamH","9y4lw4W0Tl","Yw2oU0BmCy","U3yw5OUqFM","RmDcr5Drn0","CNHmvSjskQ","HlUbFmz8gx","ogLgcJRJQB",
+"5drc6djsrv","FnPFBMmsIo","vkCHHjzUqR","RzaZAZ4I1v","DQimpl83Ud","D6rBy5ZaEz","KsjRKxXTI4","OUqFM1j5L8","e6e4zRBhp0","zQt6Q5drc6",
+"zqH0Wiqv4k","FFDuiJIqXi","7lUXZAgJHQ","Dz1R3aDGtS","GWqqXwDajX","CNHmvjzUqR","o8Uyd7X3uy","dpe1vY1mC0","5Drn0uZPqg","QworumX2GE",
+"sx5GlfcwDa","0YAGHG1RhS","euZA5Ul4a1","zmLYDQ6hMC","xReecuvf7A","uN6r3Uvlv4","dmoS7hYBCK","tvdkDuLtKs","mz8gxL7cGc","vkCHHt98iW",
+"QnJ1SAkKTk","2hEEUChuy3","RkQkeQChxs","GSQwjAgJHQ","iwzGkh1zcH","Dz1R3CqqaD","29QAzqUJMd","lm0pD4dEz6","UlU3MMezSW","JIqXi7lUXZ",
+"SjskQS2Dfu","aez9y8hJdt","JKWYR2Yz7E","5IhmGpvgjS","hE1QlNxx9V","v1HlnuJScX","Yf2EcKr8ys","Cfgr3EoToP","pWiOsxciqp","O3iyQrKDLJ",
+"zbIYYZUnqt","gtCA5cQOnv","7ku1pKr8ys","dpe1vQChxs","MmsIoWPmlx","GrDg7RsQUq","J2mQiQ6Lix","4dEz6fmIK1","fcJOyPYBf4","HP433piJSk",
+"i3pyd7Ow5C","QYxC0aL6AJ","AmdQdEoToP","EdBKcwiHrZ","IjTwPSjskQ","dpe1vSmGzv","QChxstAOsr","ZUnqtMmKGJ","48cHLhYBCK","Pb1paFxX9q",
+"9rlg9s4786","Qworuv2eC3","Ul4a1lj07Q","W3VFHBFkb8","l83UdG1RhS","nFqikrz7Ut","JXljWMGlTF","TCgPpHP433","FFDuiYjB9t","oVQp6ulk41",
+"QworuuZPqg","e6e4z5iGN5","QClRL8U2nU","8cVD3FFDui","IRh48EoToP","QnJ1S8U2nU","QnJ1SOUqFM","AIYUuXflUq","3otm6SWfou","7hyVvuPX7G",
+"zFgtBwiHrZ","prNT69rlg9","QYxC0ciuWz","2NslmbgJAz","8FmFHVNCPd","0PktIVBjhz","Cfgr3uQIcz","uupzkn8pJ9","rKDLJKr8ys","fFDrJzz4ZU",
+"Yw2oUaFFss","Qworuru4UG","Cp3mZVIlwP","MaJQs5drc6","5ZaEzZhwG1","MojnPQnJ1S","9eoRcpAhR1","TCgPp5iGN5","QWxoTLewvM","5IhmGsoy9t",
+"ogLgc1j5L8","FjHXRGXdoH","5nmWvRsQUq","U3yw50BmCy","h1zcHMmKGJ","lkMUAfcwDa","5drc6oVQp6","pvgjSNcICA","BCxeCQClRL","jfREu24ARF",
+"ZJTXH5ZaEz","IRh48oGu6x","Kr8ysO3iyQ","s7MxkhUTw7","G1RhSFjHXR","HP433OHaBz","5nmWvZJTXH","Q6LixBpYhV","hi5X7Ul4a1","TXQ0ZVLTy6",
+"JKWYRtvdkD","NOHszQ6hMC","qUJMdRBhp0","bZLvSs93Ml","yvOMIQbxXc","aez9yDQimp","LbRTHprNT6","K4GS8MmKGJ","ZJTXHCK5W7","NhXduGXdoH",
+"Oz8yZlCMxy","CdyBVRkQke","hE1QlW7cTs","d85a9Waim6","Nxx9VYOfrY","X6PinSWfou","jSjS3ZJTXH","YjB9tYf2Ec","MaJQsKASQ8","zQt6QKASQ8",
+"cShY2FGzgp","oGu6xbrhlQ","GXdoHKsjRK","GXdoHtl72W","D6rByVNCPd","POUYSDG4sT","kB5nPdhSuH","lpF6WK4GS8","soy9tdhSuH","9iGoTuN6r3",
+"qUJMdhe9IA","HRxd87lUXZ","5NammD6rBy","uPX7GcQOnv","wDajXhi5X7","BbwgAd85a9","uN6r3HfyNQ","atef28U2nU","PYBf4FGzgp","EdBKcFjHXR",
+"yvOMIpAhR1","5nmWvYjB9t","RmDcrDLhzM","RsQUqRxrsm","n8pJ9lH1kt","uLtKsGv3Fq","xXTI4ZzJHW","1LB1LwiHrZ","29QAzpv0i7","Mm8silViBv",
+"QChxsBbwgA","Yf2EcRACuj","Nxx9VbZLvS","cQOnvL7cGc","uPX7GSWfou","LbRTHbgJAz","zHF1qpAhR1","5iGN5MK07Y","euZA5CIShG","2hEEUzqH0W",
+"cL0aEYOfrY","2TRI7pAhR1","Pb1pajS1aj","W3VFHSjskQ","uupzkTCgPp","lpF6WP6bcg","5nmWvhYBCK","kZANmgjUTu","sqVrfs93Ml","oGu6xo8Uyd",
+"i3pydX6Pin","OHaBzlj07Q","hUTw7MojnP","soy9t9iGoT","O3iyQW7cTs","QYxC0Fhtgl","tl72WzY1GY","07n1c7Ow5C","VLTy6jSjS3","48cHLfFDrJ",
+"wDajXI7p2a","Kr8ysIKxdL","WreyPQChxs","W3VFH48cHL","rhl0JFLsph","okgRi580YD","tuDySnlaBy","hE1QlpT8wu","TwanoDcpWB","AkKTklweGy",
+"jzUqRVBjhz","n1pmOyofH3","d85a9mX2GE","bgJAzFFDui","F6PT2ZUnqt","DQimpJ2mQi","45cIHO3iyQ","NhXdugdQsS","cmXIXFLsph","HfyNQVIlwP",
+"AgJHQUl4a1","dQ586Ta8f6","ReKEWZv7z0","aez9ysx5Gl","Zv7z0nnP8o","Y1mC0atef2","iqv4kAkKTk","K20wKCIShG","KASQ80BmCy","2DREswDajX",
+"LbRTHZzJHW","HzZT8lweGy","cL0aEFwEJz","nFqik45cIH","StlDJHzZT8","VLTy6VBjhz","v2eC38cVD3","0ao3lt98iW","uN6r3Q6Lix","atef2zmLYD",
+"guMb88TxD7","580YDaDGtS","2ZHdkvOqCE","14FLRlpF6W","5VZjSQworu","UlU3MCp3mZ","jzUqR14FLR","MmsIo3otm6","NcICAd7vjM","Oz8yZMK07Y",
+"14FLRlkMUA","45cIHix74r","SmGzvQssNC","tlILtRACuj","LbRTHjeskS","0Wr5y29QAz","FjHXR7Ow5C","atef2M6qcG","HRxd814FLR","v2eC3ciuWz",
+"1j5L8D6rBy","ThjNnL7cGc","5Drn09rlg9","8cVD3K4GS8","vOqCE9GXkX","prNT6lViBv","U3yw5vLsmS","JRJQBReKEW","oVQp6jS1aj","ulk41lsQGo",
+"FVMxoCdyBV","8FmFHpiJSk","SbRYyaez9y","ZUnqt7fKYU","WreyP5iGN5","pT8wuFVMxo","FxX9qS2Dfu","ydG8UnFqik","Mm8siDz1R3","zY1GYBFkb8",
+"HzZT8MojnP","ZhwG1atef2","7fsYMdpe1v","StlDJECMvU","QWxoT9iGoT","tuDyS9y4lw","qaofNgIYvE","djsrvn1pmO","P6bcgTXQ0Z","B3qemJ2mQi",
+"xciqpW3VFH","DLhzMjiVBP","K20wK16lHc","Pb1paChuy3","O3iyQeuZA5","FcWrW5ZaEz","JKWYRRBhp0","gjUTujfREu","soy9tlCMxy","gtCA5wiHrZ",
+"yofH3No0Qb","14FLR9XyT9","zY1GYprNT6","VNCPdWaim6","TXQ0ZXyPZN","LewvMksJby","8TxD7lViBv","MojnPqQxHP","HP4334W0Tl","aDGtSCNHmv",
+"Cfgr3QssNC","hYBCKn1pmO","L7cGccShY2","dpe1vBGaQY","tl72WuPX7G","0PktI1v5hH","Dz1R3In3NS","Vprf2azIWp","AOgEeuPX7G","zz4ZU8cVD3",
+"580YDcL0aE","lkMUAQssNC","NhXduW7cTs","xciqpMmsIo","VjCZq9XyT9","7lUXZ0Kyfs","zY1GY7fKYU","O3iyQqQxHP","v1Hlnmz8gx","yluBxCNHmv",
+"tjQxslH1kt","Oz8yZHlUbF","bZLvS5Drn0","K20wKK20wK","I7p2a4dEz6","5iGN5brhlQ","IBe8khYBCK","MGlTF7fsYM","uJScXuTacx","gdQsS2DREs",
+"Y1mC0JJs5m","8cVD3O3iyQ","5drc6jS1aj","bgJAzWDVWJ","DG4sTi7WMQ","8FmFHVLTy6","2ZHdklm0pD","fFDrJksJby","RzaZAOHaBz","4W0TlW3VFH",
+"Mm8siW7cTs","KASQ8OxWIH","lXFOBix74r","ciuWzVprf2","J2mQiNo0Qb","0BmCyxReec","MaJQsZhwG1","dpe1vEdBKc","6q6L9lweGy","QbxXcDG4sT",
+"EOE1oQYxC0","JJs5mqUJMd","QWxoTfaHir","0MR5X7X3uy","Pb1pafmIK1","OUYuFqQxHP","aL6AJWmadA","MmKGJnlaBy","Kr8ysprNT6","zbIYY0Kyfs",
+"TXQ0ZVjCZq","HRxd8iKqhr","DQimpix74r","EOE1oI7p2a","16lHcoQ87r","oVQp6tuDyS","vLsmSHzZT8","Nxx9VpmeCd","lpF6W8U2nU","AkKTk5ZaEz",
+"zbIYY6AFT0","RACujChuy3","dQ586XflUq","lXFOBUlU3M","atef2jtn0X","n8pJ9Ss0Zu","UmaEvJKWYR","lViBvM6qcG","uupzks7Mxk","Yw2oUVLTy6",
+"e6e4zDQimp","lViBv7lUXZ","taOXKb29RJ","tjQxs0h1b1","Ss0ZukZANm","lm0pDi7WMQ","pT8wuTXQ0Z","lkMUAWMiS3","fqypynlaBy","In3NShe9IA",
+"kZANmdjsrv","45cIHS2Dfu","UlU3MSs0Zu","AkKTkwDajX","4QMc9Cfgr3","t98iWQnJ1S","Mm8siQYxC0","9iGoTK20wK","wiHrZsx5Gl","0PktIpiJSk",
+"o8Uyds93Ml","gdQsSuPX7G","LbRTHnnP8o","0PktIZv7z0","XyPZN4QMc9","2Nslmn1pmO","9eoRc16lHc","7fsYMqaofN","UmaEvoGu6x","iB08lydG8U",
+"MK07YguMb8","guMb8BFkb8","oVQp6jSjS3","AmdQdbZLvS","hE1QlQClRL","tl72W7hyVv","h1zcHYOfrY","kB5nPSWfou","Cfgr3pvgjS","XflUqRxrsm",
+"soy9tnFqik","iKqhriB08l","G1RhSMkgy8","Ss0Zudpe1v","ni2v1he9IA","B3qem9iGoT","uZPqgtaOXK","NOHszVBjhz","dQ586Yw2oU","16lHcW7cTs",
+"k85Ae7fsYM","0ao3l0Wr5y","ulk41lm0pD","UlU3MzHF1q","FNYIM8TxD7","MK07YpiJSk","uQIczXyPZN","9rlg924ARF","uvf7AM6qcG","GXdoHFwEJz",
+"m4bxUuupzk","VLTy6Q6hMC","lweGydpe1v","h1zcHhUTw7","MmsIoJ2mQi","dQ586nFqik","jSjS3FGzgp","m4bxUM3zXL","jtn0X0MR5X","Dz1R3tAOsr",
+"No0Qbsoy9t","J2mQin1pmO","uTacx07n1c","BGaQYxciqp","8hJdtb29RJ","FLsphfmIK1","a00b5IBe8k","uPX7GuJScX","zz4ZUt59lR","fqypyAmdQd",
+"X6Pin16lHc","U3yw5d85a9","fFDrJzY1GY","tuDySRBhp0","ZuDtDZUnqt","StlDJ1j5L8","DQimp2Nslm","AkKTk07n1c","jtn0X7fKYU","nFqikgtCA5",
+"o8UydPOUYS","azIWpfLNg8","uQIczsqVrf","lpF6WXyPZN","kZANmpiJSk","rKDLJe6e4z","wiHrZJIqXi","HfyNQ8hJdt","FFDuiuN6r3","Kr8ysm4bxU",
+"4W0TlFLsph","2Yz7E7ku1p","07n1c8cVD3","W7cTscmXIX","wDajXrz7Ut","5ZaEzCIShG","JJs5mM3zXL","FjHXRh1zcH","YOfrYzz4ZU","2ZHdk580YD",
+"aez9yY1mC0","FVMxo0h1b1","29QAzn8pJ9","48cHLQssNC","Ss0ZuazIWp","gdQsSDz1R3","16lHcEdBKc","RmDcr580YD","xciqpuvf7A","ni2v1EdBKc",
+"piJSkNOHsz","ZJTXH618Di","xciqpHRxd8","i7WMQn1pmO","ECMvUmX2GE","s4786uN6r3","JIqXiLDk6f","X6PinIBe8k","JJs5mQClRL","K20wKnFqik",
+"O3iyQjzUqR","taOXKhYBCK","FnPFBy94nw","U3yw5W7cTs","QWxoTcL0aE","uAWypUlU3M","WPmlx0Wr5y","WMiS3tAOsr","RkQkeFGzgp","O3iyQNAFuw",
+"W3VFHsoy9t","9eoRcqaofN","uoStwvkCHH","Y1mC08cVD3","lweGyAgJHQ","ZUnqtQ6Lix","ydG8UYjB9t","2ZHdkv8yFN","TXQ0Z4QMc9","uAWypRmDcr",
+"AmdQd7fsYM","s93Mlgf8rI","3weIF24ARF","XflUqJXljW","ZhwG17fKYU","5drc65IhmG","gf8rIlXFOB","QworuJkzUn","Cfgr3DQimp","uvf7AIjTwP",
+"AmdQdKASQ8","9iGoTuupzk","nlaByvOqCE","Yh1hFokgRi","RpBQmt98iW","hYBCK5nmWv","m4bxUlCMxy","lCMxyS77LH","XyPZNzqH0W","uTacxlCMxy",
+"zmLYDWDVWJ","SmGzvJKWYR","3weIFv2eC3","v8yFNVprf2","IKxdLdQ586","yToGWQ6hMC","AkKTk1LB1L","SWfouMK07Y","L7cGcDG4sT","l83UdlH1kt",
+"NhXdu45cIH","rz7Ut1LB1L","In3NS14FLR","Oz8yZPb1pa","uAWyplH1kt","dmoS7IKxdL","guMb8OHaBz","aez9yoVQp6","zHF1qKASQ8","24ARFm4bxU",
+"HRxd8UlU3M","14FLRUl4a1","HRxd8GXdoH","lXFOBQworu","5drc6okgRi","AgJHQ0ao3l","mX2GEU3yw5","jSjS3Yh1hF","tjQxsVIlwP","suY4x6AFT0",
+"HzZT8tl72W","jtn0XWMiS3","6q6L9OUYuF","x3LDelCMxy","8cVD3D6rBy","Oz8yZl83Ud","QWxoTSjskQ","JXljW4W0Tl","7ku1pxReec","VjCZqFjHXR",
+"m4bxUv1Hln","qQxHPb29RJ","y94nwCK5W7","5iGN55nmWv","3weIFW3VFH","Cfgr3Q6hMC","Rxrsm45cIH","6q6L9QssNC","2TRI7nnP8o","OHaBzMmKGJ",
+"FxX9q5iGN5","v2eC3rz7Ut","Yw2oU55rfB","BCxeCPYBf4","5iGN5GXdoH","SmGzvdhSuH","d85a9EdBKc","MaJQsMmsIo","Ul4a1gtCA5","yToGW3otm6",
+"uPX7Glj07Q","L7cGc5drc6","IBe8kYjB9t","lweGyAXpwE","uAWypYw2oU","VIlwPiqv4k","Dz1R3ru4UG","faHirDz1R3","CNHmv1LB1L","zz4ZUyluBx",
+"CK5W7Y1mC0","v2eC3yluBx","29QAzDz1R3","zqH0WCqqaD","FFDuiNOHsz","Z4I1vtaOXK","RzaZAIjTwP","9eoRcsqVrf","nFqikzY1GY","iqv4kvOqCE",
+"Ss0ZuJ2mQi","tjQxsOz8yZ","RmDcrgdQsS","0Wr5yFLsph","AXpwEt98iW","x3LDefcwDa","Q6Lix07n1c","jtn0XGrDg7","0Kyfs9iGoT","C2IrcG1RhS",
+"kB5nPtvdkD","zY1GYS2Dfu","n1pmOtl72W","KZamHlCMxy","pvgjSgdQsS","POUYShi5X7","5nmWvSWfou","Q6Lix9eoRc","ni2v1Ss0Zu","O3iyQWmadA",
+"cL0aE9rlg9","2DREsjfREu","n1pmO9y4lw","1j5L8uoStw","ZuDtDnFqik","jfREuzmLYD","gIYvEOHaBz","s93MlXflUq","D6rByYOfrY","9eoRcpT8wu",
+"5Drn0Nxx9V","5drc6IKxdL","D6rByDG4sT","2hEEUQssNC","Ul4a1JXljW","iB08lBGaQY","Oz8yZEoToP","Nxx9VK20wK","ulk41RpBQm","1v5hHIRh48",
+"FVMxoatef2","VerEAU3yw5","VerEAC2Irc","F6PT2t98iW","JIqXiSbRYy","brhlQfcJOy","0MR5XsuY4x","BFkb8qaofN","TwanouN6r3","FnPFBfFDrJ",
+"xciqpRzaZA","VerEAjfREu","6AFT0MK07Y","0Wr5y0YAGH","zHF1qIBe8k","1LB1LvkCHH","KASQ84QMc9","tuDySfcwDa","t98iWeuZA5","OxWIHpiJSk",
+"WmadAEdBKc","0Wr5yDG4sT","ydG8U0YAGH","pT8wuCdyBV","Uvlv4fcJOy","RACujsqVrf","ReKEWuLtKs","ZuDtDcmXIX","QnJ1SOxWIH","y94nwHzZT8",
+"b29RJn1pmO","fqypyW3VFH","pvgjSUvlv4","fcwDaNcICA","MmKGJdmoS7","iB08lfLNg8","QChxsCdyBV","aL6AJW7cTs","Pb1padpe1v","h1zcHdmoS7",
+"gjUTuCxVEf","pv0i7iwzGk","lkMUAyofH3","8FmFHlViBv","BGaQYciuWz","vOqCE1j5L8","Waim6sx5Gl","jtn0XksJby","7hyVvfaHir","kB5nP9iGoT",
+"RACujDG4sT","4W0Tl9GXkX","qaofNFcWrW","GWqqXfmIK1","mz8gxBbwgA","M6qcGMkgy8","zHF1qtlILt","Kr8ysOz8yZ","TwanoOxWIH","BFkb8ZUnqt",
+"VIlwPWreyP","uLtKsZzJHW","VjCZquoStw","uTacxsoy9t","5Mg9r4W0Tl","7X3uymX2GE","dhSuHhYBCK","Q6hMCpiJSk","FwEJzdhSuH","lkMUACIShG",
+"ni2v1AOgEe","rKDLJNhXdu","0YAGHUvlv4","7fKYUaez9y","Cp3mZn8pJ9","LewvMDQimp","G1RhSAIYUu","WMiS3ix74r","KsjRK0BmCy","29QAzVerEA",
+"LbRTHatef2","wDajXZhwG1","QClRLt59lR","2NslmQWxoT","RzaZACxVEf","uLtKsBbwgA","GXdoHlj07Q","Y1mC0IKxdL","hYBCK9iGoT","1LB1LuAWyp",
+"1LB1LRxrsm","GrDg7piJSk","lViBvlpF6W","zHF1qiqv4k","YjB9td7vjM","CdyBV9GXkX","pFrrl0MR5X","qUJMdtl72W","tuDyStAOsr","U3yw507n1c",
+"Q6hMCvOqCE","7fKYUgdQsS","XflUqRsQUq","9XyT9Y1mC0","iwzGk2hEEU","pmeCdsuY4x","jtn0XtuDyS","Nxx9VFhtgl","uZPqg0BmCy","JKWYRAOgEe",
+"6q6L91j5L8","lm0pDFcWrW","i3pydjiVBP","yofH3ZzJHW","S2Dfu9iGoT","i3pydZUnqt","Yf2EcUl4a1","uJScXsuY4x","qaofN0YAGH","QnJ1SQ6Lix",
+"YjB9tJJs5m","Mm8sipAhR1","OUqFM29QAz","t59lR1LB1L","LewvMfcwDa","29QAzs7Mxk","W3VFHgjUTu","jzUqRQClRL","pT8wuqaofN","CxVEfNcICA",
+"hE1QlWaWsv","Cfgr3OUqFM","ZhwG1gjUTu","9GXkX5ZaEz","oVQp65nmWv","lCMxy5VZjS","gjUTuZJTXH","618DiOz8yZ","QWxoTSWfou","Z4I1vs93Ml",
+"RACujmz8gx","fLNg8PYBf4","gdQsSfmIK1","LewvMJRJQB","jSjS3Z4I1v","YjB9tW3VFH","pAhR1e6e4z","DLhzM2hEEU","W7cTslm0pD","JRJQB5Mg9r",
+"WreyPK4GS8","QnJ1S5VZjS","KASQ8xciqp","9iGoTVBjhz","Yf2Ecs93Ml","Yw2oUx3LDe","580YDuJScX","I7p2ayluBx","BFkb8FPfSE","lm0pDa00b5",
+"jtn0XmX2GE","BCxeCsqVrf","AXpwEfLNg8","FhtglQYxC0","LewvMOxWIH","cL0aEIjTwP","s7MxkoGu6x","hYBCKogLgc","blLA9In3NS","POUYSHzZT8",
+"pv0i7ZhwG1","J2mQiFxX9q","0ao3lt59lR","lj07QQYxC0","O3iyQX6Pin","5drc6gdQsS","s7MxkcQOnv","guMb855rfB","tAOsrChuy3","8cVD3DcpWB",
+"rhl0JJIqXi","X6PinpWiOs","G1RhSMK07Y","tjQxsFGzgp","VNCPdGSQwj","lCMxyFGzgp","Mkgy8MK07Y","vkCHH8hJdt","Uvlv4hSSvQ","azIWp5Mg9r",
+"HfyNQYjB9t","6q6L9v1Hln","OUYuFciuWz","pv0i77Ow5C","oVQp6IRh48","QWxoTgdQsS","UlU3M9y4lw","FxX9qFxX9q","Yf2EcyToGW","OHaBz8cVD3",
+"hi5X7Q6hMC","zFgtBk85Ae","iKqhrcShY2","In3NSWDVWJ","cmXIXS77LH","In3NSAXpwE","3otm6zmLYD","AkKTk9GXkX","F6PT2blLA9","zHF1qlj07Q",
+"StlDJfcwDa","lsQGot98iW","gdQsSJXljW","G1RhSlweGy","bgJAzGv3Fq","k85Aeiqv4k","5Drn0ogLgc","VIlwPzQt6Q","IBe8kv2eC3","AgJHQnFqik",
+"L7cGcFcWrW","AkKTktjQxs","OUYuFGWqqX","qQxHPfaHir","DQimpBbwgA","tjQxsuJScX","WaWsvsqVrf","zmLYDpAhR1","GWqqXWDVWJ","MmKGJbrhlQ",
+"AXpwEtvdkD","7hyVv1LB1L","VIlwPciuWz","oVQp6yEfy9","O3iyQMaJQs","TwanoNhXdu","RpBQmHRxd8","8U2nUCdyBV","brhlQiB08l","Cfgr3CdyBV",
+"lViBvNhXdu","JJs5m6q6L9","2ZHdkiqv4k","NhXdupFrrl","GrDg7oGu6x","FwEJzyToGW","WmadA580YD","Dz1R3ksJby","d7vjMoGu6x","ogLgcNcICA",
+"he9IAFwEJz","EdBKcvLsmS","FVMxouTacx","FcWrW0Wr5y","zqH0Wa00b5","YOfrYRxrsm","lsQGoPb1pa","D6rByMojnP","FNYIMWDVWJ","uLtKs2ZHdk",
+"0h1b1Uvlv4","EOE1oGv3Fq","cmXIXDLhzM","In3NS3weIF","3weIF4QMc9","JJs5mOxWIH","lViBvdmoS7","DcpWB8RCUA","VBjhzksJby","Oz8yZJKWYR",
+"BpYhVOxWIH","l83UdzmLYD","O3iyQFVMxo","dhSuH7hyVv","8RCUAl83Ud","fqypyP6bcg","3otm60ao3l","GrDg77lUXZ","7fKYUZJTXH","ciuWzG1RhS",
+"FnPFB9iGoT","tuDySlkMUA","suY4xPb1pa","bZLvSQYxC0","XflUqFjHXR","C2IrcGXdoH","taOXKzQt6Q","MezSWcL0aE","rKDLJ0YAGH","MojnP7X3uy",
+"CqqaD8RCUA","dhSuHDQimp","lsQGo5drc6","gf8rIkB5nP","5Drn0yluBx","sqVrfSWfou","G1RhSKsjRK","SmGzvCK5W7","4dEz6FNYIM","jfREui7WMQ",
+"GSQwjQbxXc","cQOnvuQIcz","WPmlxkB5nP","gdQsSOHaBz","AXpwEpFrrl","QbxXc24ARF","POUYSVerEA","jfREuRkQke","l83Udt98iW","fLNg8I7p2a",
+"RsQUq2ZHdk","LDk6flXFOB","pFrrlnlaBy","580YD9XyT9","Zv7z0tvdkD","AOgEeRmDcr","0Wr5yFwEJz","QWxoTaFFss","l83Ud8U2nU","8TxD7Nxx9V",
+"2NslmMmsIo","3weIF48cHL","o8UydHfyNQ","1j5L80ao3l","xReecOz8yZ","F6PT2wiHrZ","No0QbcShY2","uAWypeuZA5","FLsphGv3Fq","oQ87rjeskS",
+"9rlg9iKqhr","KsjRKi7WMQ","sx5GlrKDLJ","faHiraez9y","guMb8JRJQB","l83UdIn3NS","lm0pDMGlTF","qaofN8hJdt","5VZjSGXdoH","14FLRWMiS3",
+"7ku1p0PktI","Vprf2LbRTH","he9IA5IhmG","fqypyjzUqR","iKqhrMK07Y","POUYS2ZHdk","HP433ru4UG","ZhwG1W3VFH","zQt6QcL0aE","lsQGofcJOy",
+"l83UdAIYUu","Z4I1vsoy9t","fFDrJCIShG","5Mg9rlj07Q","CIShGuZPqg","VBjhzMmsIo","ZuDtDChuy3","blLA9AOgEe","fcwDaoQ87r","jiVBP5Namm",
+"wDajXtuDyS","O3iyQ2ZHdk","NcICAGv3Fq","KZamHSbRYy","F6PT2JkzUn","rKDLJh1zcH","VLTy6EdBKc","Chuy3h1zcH","suY4xLDk6f","nlaBy8FmFH",
+"UlU3MlpF6W","fcwDaAOgEe","HP433ogLgc","xXTI4guMb8","dhSuHOz8yZ","aL6AJ2DREs","gf8rIt98iW","2DREsJkzUn","d85a97ku1p","FLsph55rfB",
+"cL0aEM3zXL","Mkgy89GXkX","zbIYYChuy3","FVMxo0Kyfs","v2eC3U3yw5","tjQxsCfgr3","pvgjS14FLR","dpe1vjfREu","aL6AJlH1kt","aL6AJlCMxy",
+"y94nw0PktI","48cHLOHaBz","i7WMQ29QAz","NAFuwvOqCE","tl72WIKxdL","aDGtSNo0Qb","48cHLMezSW","48cHL6q6L9","HRxd8JIqXi","B3qemyluBx",
+"14FLRNOHsz","oVQp6a00b5","FFDuipAhR1","8cVD3ni2v1","Cfgr3oVQp6","aez9yuZPqg","IjTwPYf2Ec","kZANmNhXdu","AOgEeLDk6f","POUYScShY2",
+"In3NSUlU3M","7lUXZtAOsr","dmoS7lpF6W","29QAzQworu","CqqaDgf8rI","9XyT9pFrrl","QYxC0jS1aj","5Drn0fmIK1","kZANmaez9y","cQOnv9eoRc",
+"hSSvQjzUqR","RpBQmZUnqt","kB5nPwiHrZ","Q6hMCUlU3M","pmeCdjS1aj","MK07YSjskQ","0YAGHuQIcz","s93MlRpBQm","ogLgcTa8f6","K20wKD6rBy",
+"uupzkuQIcz","cShY2Ta8f6","fLNg8a00b5","ZuDtDfmIK1","uoStw9iGoT","pv0i7aFFss","KASQ8ReKEW","ciuWzfaHir","ZzJHWS2Dfu","mX2GEyEfy9",
+"m4bxUNxx9V","WDVWJWmadA","TwanoWDVWJ","cmXIXd85a9","FjHXRuvf7A","CNHmvrKDLJ","uupzkSjskQ","XflUqUvlv4","8cVD3XyPZN","5ZaEz9GXkX",
+"M3zXLpmeCd","tjQxsgf8rI","2DREslweGy","QWxoTYf2Ec","uvf7Apv0i7","TXQ0ZTa8f6","P6bcgyToGW","XyPZNBGaQY","EoToPzQt6Q","SjskQ7Ow5C",
+"5iGN5DG4sT","POUYSSmGzv","GrDg7jS1aj","tjQxsgjUTu","t59lRuLtKs","JKWYRyEfy9","9XyT9L7cGc","prNT6l83Ud","24ARFWreyP","HlUbFn8pJ9",
+"EoToPNhXdu","AkKTkQbxXc","ix74rcmXIX","Oz8yZX6Pin","SjskQ0MR5X","uN6r37fsYM","FGzgpOUYuF","M6qcGF6PT2","rhl0JGXdoH","HP433jiVBP",
+"HlUbFzbIYY","FLsphpFrrl","yluBxzmLYD","yvOMIi7WMQ","BGaQYQworu","D6rByRACuj","Vprf2FcWrW","Oz8yZGXdoH","zbIYYHlUbF","FhtglpWiOs",
+"AOgEeaL6AJ","vkCHHfFDrJ","Kr8ysi7WMQ","RBhp0QWxoT","VerEARmDcr","fLNg8MmKGJ","48cHLIn3NS","55rfBHRxd8","NOHszIjTwP","S77LHO3iyQ",
+"nnP8oGWqqX","jeskSogLgc","VNCPd0Wr5y","29QAzbgJAz","7ku1p7Ow5C","rhl0J8hJdt","W7cTs8xEKz","ZhwG1Ss0Zu","GWqqXLbRTH","uoStwo8Uyd",
+"rhl0JU3yw5","s7MxkJKWYR","0Wr5ygf8rI","DcpWBru4UG","uvf7ApmeCd","tjQxsU3yw5","Q6hMCXflUq","NAFuwUvlv4","ix74rJIqXi","lpF6Wi3pyd",
+"lsQGoJkzUn","n8pJ9Ul4a1","ZuDtDulk41","Kr8ysiKqhr","U3yw5StlDJ","HfyNQtvdkD","kZANmzqH0W","v8yFNhSSvQ","s93MlKsjRK","qUJMdJJs5m",
+"HzZT8lpF6W","6q6L9zHF1q","FLsphJXljW","CqqaD2DREs","vkCHHStlDJ","l83UdQ6Lix","bZLvSbgJAz","AXpwEOxWIH","zmLYDRpBQm","qQxHPaez9y",
+"y94nwAIYUu","PYBf4Cfgr3","ECMvUWreyP","FGzgp0ao3l","i3pydtuDyS","gf8rI0PktI","Chuy3dQ586","WreyP14FLR","FwEJzRkQke","DQimpFFDui",
+"1j5L8dpe1v","FcWrWxXTI4","RsQUqcL0aE","HP433D6rBy","djsrvO3iyQ","CNHmv9XyT9","tjQxsaez9y","8TxD7XflUq","iqv4kJ2mQi","HfyNQFNYIM",
+"zQt6QpvgjS","FGzgpjzUqR","uJScXuupzk","KZamHprNT6","QChxsiB08l","4W0TlSjskQ","7Ow5CzbIYY","8hJdtFxX9q","aL6AJtuDyS","fmIK1o8Uyd",
+"F6PT2uQIcz","hi5X7yEfy9","ZhwG1SjskQ","LDk6fRACuj","jS1ajbrhlQ","jtn0X5nmWv","SmGzvrKDLJ","5VZjSMmKGJ","uN6r37X3uy","Cfgr3RzaZA",
+"Waim69eoRc","QworuB3qem","8U2nUJKWYR","S77LHW7cTs","YjB9t7Ow5C","3otm6JKWYR","lweGyM3zXL","2Yz7EAIYUu","Cfgr3LDk6f","BCxeCL7cGc",
+"pv0i7L7cGc","BFkb8HlUbF","L7cGcrz7Ut","dpe1vMkgy8","qaofNMGlTF","Vprf2n8pJ9","WDVWJWaim6","QYxC08cVD3","ogLgcnFqik","4W0TlAIYUu",
+"8TxD7ZuDtD","24ARFzFgtB","1j5L8wiHrZ","GrDg70MR5X","vkCHHRmDcr","aez9yjeskS","bZLvSOUqFM","VNCPdhe9IA","RxrsmRpBQm","tjQxsECMvU",
+"mz8gxS77LH","Ul4a1POUYS","euZA5VerEA","s7Mxkix74r","s7MxkChuy3","Ul4a17ku1p","Chuy3kB5nP","S77LHVjCZq","Z4I1vfLNg8","hYBCKvLsmS",
+"7lUXZfaHir","YjB9t0MR5X","pAhR1Y1mC0","uPX7G0ao3l","gIYvEX6Pin","lpF6Wy94nw","RzaZAtAOsr","B3qemprNT6","No0QbKsjRK","n1pmOFGzgp",
+"JJs5mO3iyQ","b29RJb29RJ","WPmlxtAOsr","RsQUqs93Ml","fcwDani2v1","UlU3MQChxs","WaWsvTXQ0Z","pv0i7oGu6x","bgJAzNcICA","M6qcGMmKGJ",
+"Yh1hFb29RJ","S77LHCp3mZ","IRh48bgJAz","M3zXLguMb8","a00b5Ul4a1","55rfBF6PT2","0BmCyqQxHP","NcICAFcWrW","5nmWv580YD","rKDLJUmaEv",
+"kB5nPIRh48","Nxx9VuTacx","UmaEvRBhp0","KASQ8bZLvS","64s8NuQIcz","pFrrlZzJHW","RzaZAo8Uyd","CdyBVk85Ae","AOgEezY1GY","jSjS3yofH3",
+"JKWYREOE1o","TXQ0Z8hJdt","8RCUAuAWyp","tAOsrQnJ1S","618DiU3yw5","h1zcHP6bcg","lm0pDtjQxs","MezSWRsQUq","6AFT03weIF","hUTw7iwzGk",
+"RmDcrgIYvE","oGu6xvOqCE","2Yz7Ehe9IA","AOgEeZUnqt","8U2nU8RCUA","k85AeO3iyQ","x3LDee6e4z","Uvlv4C2Irc","I7p2acL0aE","UmaEvFLsph",
+"Pb1panlaBy","1v5hHi7WMQ","QClRLrKDLJ","nlaByaL6AJ","rz7UtAOgEe","pT8wu8TxD7","7X3uyzQt6Q","pvgjS2ZHdk","jeskSdpe1v","ix74rCfgr3",
+"FLsphFjHXR","lXFOBoGu6x","K20wKiB08l","jiVBPLbRTH","pmeCdIBe8k","QClRL0PktI","lweGyRACuj","M6qcGyofH3","ix74rX6Pin","zQt6QZzJHW",
+"JRJQBzQt6Q","4dEz6pWiOs","55rfBv1Hln","xciqpYh1hF","AkKTkJ2mQi","DQimpi7WMQ","h1zcHzz4ZU","gdQsSsx5Gl","CdyBVdhSuH","jtn0Xmz8gx",
+"4dEz62ZHdk","Mkgy8Gv3Fq","HfyNQsqVrf","fcwDaGWqqX","Kr8ysNcICA","HRxd8DG4sT","0BmCy5nmWv","zQt6QlH1kt","aDGtSaez9y","mz8gxCxVEf",
+"lweGySjskQ","7fsYMAXpwE","IBe8kvOqCE","ksJbyAkKTk","Q6LixFVMxo","lm0pDSs0Zu","rz7UtpvgjS","7lUXZ7fKYU","dpe1vru4UG","a00b5W3VFH",
+"fmIK1aL6AJ","CqqaDwDajX","2ZHdkksJby","2hEEUyluBx","JJs5muvf7A","zz4ZUwiHrZ","HP433MojnP","Q6LixZJTXH","9y4lwW3VFH","pFrrlfcJOy",
+"FnPFBFLsph","BCxeCdmoS7","2Yz7EuAWyp","dmoS7G1RhS","RmDcrQ6hMC","6AFT0pmeCd","Oz8yZ580YD","fFDrJaFFss","AgJHQkZANm","zbIYYRpBQm",
+"jzUqRThjNn","RzaZA8U2nU","FLsphHRxd8","QssNCJRJQB","55rfBFwEJz","taOXKTa8f6","1v5hHGSQwj","QChxsfqypy","aFFssWMiS3","4W0TljfREu",
+"0KyfsrKDLJ","zY1GYaL6AJ","Zv7z0AXpwE","KZamHHRxd8","U3yw5fLNg8","vLsmSFVMxo","euZA5y94nw","zY1GYLDk6f","Ul4a1ZhwG1","HRxd8ReKEW",
+"BbwgAnnP8o","mz8gxyofH3","QbxXcksJby","uTacxtAOsr","5Namm1LB1L","lm0pDMezSW","ix74r5drc6","CIShGzY1GY","fcJOyK20wK","BpYhVTXQ0Z",
+"IKxdLfFDrJ","KZamHWDVWJ","8U2nUEdBKc","brhlQpvgjS","SjskQgdQsS","POUYSuN6r3","EoToPsoy9t","8U2nUs7Mxk","d85a9TXQ0Z","JJs5mVjCZq",
+"MaJQsIjTwP","9eoRcgtCA5","8U2nUtAOsr","jSjS3BpYhV","oQ87r2TRI7","RBhp0k85Ae","7hyVvogLgc","guMb8MezSW","uoStwVprf2","iB08lGWqqX",
+"sqVrfbZLvS","kZANmpv0i7","WmadAjzUqR","VjCZq2Nslm","tvdkD5Drn0","mX2GEo8Uyd","fcwDaHRxd8","gIYvEHlUbF","i3pydBFkb8","d85a9aL6AJ",
+"fcJOy5Drn0","4W0TluJScX","Dz1R3NhXdu","OxWIH2hEEU","MmKGJ0YAGH","kB5nP29QAz","DLhzMqaofN","fcJOy8cVD3","he9IA5Drn0","0Wr5yx3LDe",
+"rKDLJ2TRI7","0h1b17lUXZ","vOqCEbZLvS","tl72WpmeCd","RmDcr5drc6","guMb8NhXdu","5iGN51j5L8","P6bcgoQ87r","WreyP0h1b1","VLTy6Yf2Ec",
+"0MR5XBbwgA","MGlTFoGu6x","aez9yuQIcz","a00b5uupzk","MGlTFyofH3","5nmWvkZANm","v8yFNuJScX","Twanos7Mxk","MmsIo0BmCy","WPmlxRsQUq",
+"K4GS88U2nU","SmGzv3otm6","Z4I1vLbRTH","s4786Vprf2","VLTy6tAOsr","FGzgptl72W","AXpwEn8pJ9","Gv3FquN6r3","7fsYMuQIcz","2Nslm16lHc",
+"Kr8ysjS1aj","07n1cm4bxU","uvf7AzbIYY","Waim6QYxC0","QWxoT4QMc9","JkzUnGv3Fq","G1RhSG1RhS","uAWyp8cVD3","lH1ktRxrsm","3weIFC2Irc",
+"6AFT0uZPqg","bZLvSzqH0W","pmeCdHP433","rz7Utni2v1","d7vjMydG8U","0KyfsazIWp","n8pJ9CNHmv","sx5GleuZA5","cQOnvmX2GE","atef2MGlTF",
+"tAOsr6AFT0","I7p2at98iW","gtCA58hJdt","euZA5VNCPd","pv0i7Qworu","t98iWru4UG","zFgtB24ARF","jS1aj7fsYM","kZANmrhl0J","h1zcHv2eC3",
+"0KyfsRACuj","FcWrWFPfSE","RsQUq7X3uy","VLTy6kB5nP","hYBCKCK5W7","uZPqgi3pyd","azIWpDQimp","mz8gxjeskS","Kr8ys8RCUA","0Kyfshe9IA",
+"vLsmSF6PT2","SmGzvB3qem","Twano4W0Tl","ThjNn0ao3l","ydG8Urz7Ut","faHiro8Uyd","ZzJHWlweGy","PYBf4gdQsS","QbxXcPOUYS","B3qemfFDrJ",
+"0ao3lVprf2","gjUTuQnJ1S","fFDrJaDGtS","l83UdEoToP","24ARFOUqFM","580YDRsQUq","t59lRFPfSE","yEfy9Nxx9V","VerEAhe9IA","FcWrWkZANm",
+"aL6AJvkCHH","yvOMIDcpWB","Zv7z0Mm8si","fFDrJkZANm","7ku1pyluBx","iB08lJKWYR","6AFT0gf8rI","GWqqXFjHXR","rz7UtlXFOB","GXdoHUvlv4",
+"oQ87rvLsmS","dmoS7DG4sT","VIlwP9rlg9","guMb80ao3l","0YAGHjzUqR","7fKYUoQ87r","HP433ZzJHW","ECMvUnnP8o","WDVWJ7Ow5C","Oz8yZCfgr3",
+"6q6L99XyT9","9y4lwguMb8","tuDySJIqXi","6AFT00BmCy","ni2v1zY1GY","In3NSzqH0W","WmadA1LB1L","iwzGkpvgjS","y94nw0YAGH","3weIFP6bcg",
+"WMiS3piJSk","Uvlv4h1zcH","No0QbciuWz","oVQp62Nslm","ksJbyqUJMd","t98iWECMvU","lweGyFhtgl","Mkgy82Nslm","uAWypMm8si","he9IAQnJ1S",
+"jzUqRWMiS3","Zv7z0O3iyQ","zHF1qVjCZq","VerEADQimp","iqv4kW3VFH","Ul4a1lsQGo","Mkgy8P6bcg","RzaZAiB08l","SjskQbgJAz","cL0aEiwzGk",
+"aL6AJOUqFM","NAFuwm4bxU","uZPqguAWyp","rhl0JTCgPp","5drc6LewvM","aFFssuupzk","6AFT0azIWp","Kr8ysLDk6f","NOHszCdyBV","EOE1ofqypy",
+"cmXIXYw2oU","fcwDaFjHXR","0h1b1HRxd8","NcICAprNT6","hi5X7dmoS7","s4786QnJ1S","0h1b1qUJMd","55rfBcmXIX","IKxdLJkzUn","VNCPdGXdoH",
+"kZANm7ku1p","K20wKSbRYy","3weIFlj07Q","YOfrYK4GS8","soy9t8hJdt","uupzkpWiOs","0h1b1Ul4a1","FPfSEkB5nP","Nxx9V9iGoT","FjHXR5Namm",
+"pAhR148cHL","qUJMdIjTwP","9GXkX5iGN5","jiVBPsx5Gl","VNCPdpAhR1","4QMc9BCxeC","Uvlv4zY1GY","TXQ0ZQChxs","2hEEUbZLvS","tjQxsTa8f6",
+"Oz8yZgjUTu","h1zcHRxrsm","he9IANhXdu","BbwgAhi5X7","24ARFC2Irc","oQ87rpFrrl","wDajXtvdkD","FhtglVBjhz","AXpwEZJTXH","8U2nUXyPZN",
+"QworuJRJQB","JkzUnW3VFH","5nmWvMmKGJ","jzUqRzz4ZU","SbRYyJIqXi","0MR5X2hEEU","uPX7Grz7Ut","d7vjMOUYuF","8cVD3P6bcg","sqVrf9GXkX",
+"mX2GEQClRL","uJScXMm8si","BFkb8I7p2a","No0QbYf2Ec","Yw2oU0ao3l","he9IAUl4a1","G1RhSTCgPp","WaWsvZuDtD","i3pydtlILt","8U2nUpFrrl",
+"GrDg7atef2","v1HlnCdyBV","55rfBpAhR1","In3NSRpBQm","iB08liwzGk","AXpwEL7cGc","8TxD7oVQp6","3weIFuAWyp","GrDg7lCMxy","cQOnvciuWz",
+"lH1ktNcICA","VIlwP7hyVv","oVQp6KASQ8","hE1Qlatef2","l83UdZuDtD","2Yz7EnFqik","aFFss7Ow5C","aDGtS1LB1L","xReecHzZT8","fcJOy8hJdt",
+"okgRi48cHL","Gv3FqBFkb8","CdyBVQWxoT","VNCPd6AFT0","QClRLi3pyd","NhXduVNCPd","7hyVvjeskS","cL0aE7X3uy","QWxoT2DREs","zmLYD8xEKz",
+"VerEAlCMxy","SWfousqVrf","gIYvEKr8ys","lj07QGrDg7","h1zcHReKEW","uQIcz48cHL","rz7UtfLNg8","pWiOsOHaBz","CIShGNxx9V","fcwDaMK07Y",
+"soy9tThjNn","VLTy6tuDyS","D6rBydpe1v","CIShGEOE1o","bgJAzThjNn","prNT6MaJQs","ZUnqtciuWz","fFDrJzbIYY","W7cTsPOUYS","1j5L8MezSW",
+"zFgtBm4bxU","cL0aEuLtKs","S77LHfcJOy","lH1ktx3LDe","9iGoTtuDyS","jSjS3NcICA","3otm6FNYIM","nlaByk85Ae","S77LHix74r","EOE1oJJs5m",
+"M6qcGxReec","jeskSZuDtD","zFgtBMmKGJ","6AFT00h1b1","zY1GYksJby","QWxoTuoStw","BCxeCdhSuH","uTacxKASQ8","CdyBVuupzk","LDk6fQ6Lix",
+"aez9ySmGzv","9y4lwtuDyS","2ZHdkd7vjM","MojnPEOE1o","TXQ0Z2hEEU","VerEA5nmWv","kZANm9rlg9","5nmWvVBjhz","dQ586FPfSE","0h1b1VNCPd",
+"I7p2a2DREs","ZzJHWo8Uyd","48cHLuLtKs","JRJQB2Nslm","hUTw7gdQsS","a00b5VBjhz","sx5GlMaJQs","b29RJ2DREs","EOE1oWMiS3","Chuy39rlg9",
+"IRh48In3NS","aDGtSl83Ud","KsjRKjS1aj","OHaBzuPX7G","SbRYyVerEA","IKxdLAXpwE","ulk41WaWsv","lkMUAh1zcH","ReKEWMezSW","6q6L9xXTI4",
+"B3qemlsQGo","CqqaD8cVD3","5IhmGW7cTs","3otm6EOE1o","KASQ8tlILt","07n1c2hEEU","yEfy9MGlTF","S2Dfuo8Uyd","VerEAUl4a1","Mm8sihE1Ql",
+"AXpwECfgr3","SWfouQ6hMC","bgJAz5Namm","Pb1paJkzUn","GrDg7dhSuH","AOgEelm0pD","uJScXStlDJ","HP433jSjS3","Zv7z0m4bxU","NhXdu5iGN5",
+"NOHszpWiOs","8TxD7Cp3mZ","bgJAzOUqFM","aL6AJ29QAz","Kr8ysZv7z0","Nxx9VLbRTH","VjCZq4QMc9","YOfrYuN6r3","AgJHQpFrrl","TCgPp2ZHdk",
+"jtn0Xo8Uyd","vLsmSjeskS","9rlg9uZPqg","7fKYU0Kyfs","16lHcGSQwj","ZUnqtMkgy8","QnJ1SKZamH","WmadAVerEA","sqVrf5Namm","uLtKsFwEJz",
+"GrDg7F6PT2","ThjNnkB5nP","FxX9qSWfou","Y1mC0VLTy6","WreyPHP433","SmGzvOxWIH","s93MluAWyp","ReKEW29QAz","lpF6WaDGtS","uN6r3OUYuF",
+"GXdoHb29RJ","UlU3MeuZA5","LewvMtaOXK","8U2nU64s8N","zY1GYhE1Ql","piJSklkMUA","bgJAzRBhp0","guMb8GXdoH","1LB1LFnPFB","StlDJjSjS3",
+"WmadAL7cGc","suY4xhE1Ql","8cVD3Ul4a1","ZuDtDW7cTs","tAOsrqUJMd","iKqhrzmLYD","v8yFNlm0pD","Mkgy8e6e4z","xReecGSQwj","iwzGk7X3uy",
+"0YAGHYw2oU","lm0pDcmXIX","uJScXuAWyp","SjskQmX2GE","8RCUAcL0aE","GrDg7n1pmO","Q6LixazIWp","m4bxUFwEJz","a00b507n1c","QbxXcd7vjM",
+"FPfSE5IhmG","8cVD3fcwDa","Zv7z0e6e4z","uAWypdhSuH","t98iW7Ow5C","e6e4zJ2mQi","tAOsrYf2Ec","AOgEepmeCd","1v5hHiKqhr","IKxdLRBhp0",
+"QChxsKr8ys","VIlwPThjNn","AkKTkQ6Lix","Kr8ys1v5hH","M3zXLJIqXi","uN6r3pT8wu","8hJdtaDGtS","RmDcrFNYIM","5Nammsoy9t","Y1mC04W0Tl",
+"zz4ZUNcICA","Mkgy8lCMxy","TCgPpfaHir","9eoRcO3iyQ","K20wKDcpWB","2ZHdkl83Ud","QbxXc4W0Tl","7Ow5CVNCPd","qUJMdv2eC3","16lHcB3qem",
+"RkQkekB5nP","VNCPdy94nw","i3pydIn3NS","ZUnqtEdBKc","oQ87rdpe1v","Uvlv4aDGtS","8xEKzTCgPp","gIYvEfLNg8","7lUXZoQ87r","iKqhreuZA5",
+"d85a9ulk41","8FmFHhe9IA","MmsIoIn3NS","8cVD3hSSvQ","EoToP5Namm","POUYSaDGtS","8TxD7Waim6","uZPqgMkgy8","lViBvFjHXR","mz8gxyEfy9",
+"t59lRbZLvS","5ZaEzmz8gx","Rxrsm5Namm","ZhwG1rKDLJ","xReecjeskS","gtCA55nmWv","YOfrYBCxeC","FcWrWxciqp","lpF6WFLsph","AOgEeMkgy8",
+"KsjRK5IhmG","55rfBLDk6f","gjUTuFxX9q","piJSk9eoRc","taOXKd7vjM","Mm8siF6PT2","7Ow5CkZANm","jfREujeskS","7ku1ptvdkD","uupzkni2v1",
+"faHir24ARF","fmIK1soy9t","uupzkQChxs","YjB9tDG4sT","FwEJz7Ow5C","zmLYD48cHL","9eoRcVprf2","5Mg9rtl72W","vLsmSBbwgA","zY1GYUlU3M",
+"nnP8o8TxD7","FNYIMt59lR","JIqXiYw2oU","uTacxRzaZA","IjTwPsoy9t","prNT6fFDrJ","5VZjS16lHc","h1zcHMkgy8","WMiS30YAGH","FLsphyEfy9",
+"Yw2oUGrDg7","cQOnv5Mg9r","Gv3Fqm4bxU","s93MlCIShG","RBhp0s4786","pFrrlYOfrY","aez9yWMiS3","GWqqXVIlwP","9GXkXwDajX","dhSuHn1pmO",
+"Chuy3ReKEW","55rfBhSSvQ","ECMvU8xEKz","yToGWAIYUu","pFrrlqaofN","vLsmSyToGW","WDVWJ9iGoT","he9IAW7cTs","Yf2Ec4W0Tl","BbwgAWMiS3",
+"6q6L9y94nw","KZamHb29RJ","NOHszMkgy8","ulk41EdBKc","Uvlv4LewvM","VLTy62DREs","ZuDtDlViBv","DQimppmeCd","1j5L8HzZT8","Q6LixJ2mQi",
+"ydG8UogLgc","IRh485Mg9r","v8yFNtaOXK","BGaQYazIWp","cQOnvrz7Ut","UlU3MlCMxy","v2eC3hSSvQ","ZUnqtsuY4x","xXTI49y4lw","azIWpuZPqg",
+"tAOsrxXTI4","v1HlnuLtKs","hUTw7CNHmv","IRh485VZjS","55rfBsqVrf","uN6r3xciqp","UmaEvtaOXK","45cIHuQIcz","5Drn0X6Pin","ZJTXHbrhlQ",
+"aFFssMGlTF","RsQUqblLA9","pWiOsdjsrv","CNHmvYw2oU","FxX9qWDVWJ","8hJdthi5X7","2Yz7E0ao3l","yluBxRpBQm","QChxs7ku1p","oGu6xuQIcz",
+"xciqpMm8si","euZA52TRI7","QnJ1S0MR5X","7ku1puAWyp","7X3uyhUTw7","NOHszi3pyd","uTacxHRxd8","he9IAx3LDe","mX2GEtuDyS","gjUTu2Nslm",
+"OHaBzi3pyd","AkKTkt59lR","NhXdutuDyS","2TRI7MmKGJ","07n1cAOgEe","QClRL2hEEU","zHF1qBCxeC","lH1ktydG8U","fLNg8s4786","MK07YuZPqg",
+"7ku1ppFrrl","45cIHrhl0J","uQIczFxX9q","nlaByBpYhV","14FLRmX2GE","pvgjS0h1b1","MojnPd85a9","lXFOBAmdQd","ni2v1Yw2oU","m4bxUaFFss",
+"azIWpSbRYy","zmLYDAOgEe","8TxD7AkKTk","1LB1LoVQp6","jzUqRUlU3M","HlUbF9XyT9","BbwgAtaOXK","jSjS37ku1p","Zv7z07fKYU","hYBCKfaHir",
+"d85a9GSQwj","FcWrWeuZA5","jfREuVNCPd","jtn0XAmdQd","MK07YzY1GY","DcpWBuAWyp","FnPFBpWiOs","t98iWZv7z0","d7vjMix74r","euZA59y4lw",
+"Zv7z0P6bcg","XflUqaL6AJ","cShY27fKYU","kZANmKr8ys","GXdoHEdBKc","CxVEfv8yFN","s93Ml4QMc9","5drc6MaJQs","DQimpEdBKc","lj07QNcICA",
+"YOfrY24ARF","jfREuh1zcH","uTacx7lUXZ","cQOnvWaim6","618Di1LB1L","RpBQmjzUqR","aDGtSYOfrY","Yh1hFjzUqR","ydG8UF6PT2","kZANmL7cGc",
+"VLTy6FcWrW","J2mQi9GXkX","tAOsrAkKTk","MezSWxXTI4","qaofNtAOsr","EdBKcJRJQB","ThjNnCNHmv","ZzJHWrz7Ut","No0QbCdyBV","uvf7ADG4sT",
+"Cp3mZfmIK1","8hJdt7fsYM","TCgPpAkKTk","RzaZAiwzGk","TXQ0ZqUJMd","tlILtDcpWB","qaofNcQOnv","VNCPd29QAz","v2eC3IBe8k","0KyfsaDGtS",
+"AXpwEGXdoH","CK5W7ni2v1","0KyfsMK07Y","ni2v107n1c","pAhR10h1b1","taOXKVjCZq","FxX9qZJTXH","Qworujtn0X","AgJHQM6qcG","wiHrZDLhzM",
+"brhlQzQt6Q","ogLgcMmKGJ","FcWrWblLA9","FhtglzY1GY","StlDJGSQwj","Yf2EcFNYIM","jSjS3G1RhS","lweGyNxx9V","WmadAVLTy6","DcpWB5iGN5",
+"XflUqGSQwj","mX2GEYjB9t","ReKEWGv3Fq","dpe1vCIShG","JKWYRIBe8k","m4bxUStlDJ","suY4xJ2mQi","yToGWHlUbF","4dEz64QMc9","hYBCKydG8U",
+"CIShGAkKTk","lXFOBFNYIM","taOXK64s8N","8U2nUI7p2a","Y1mC064s8N","16lHclViBv","9GXkXAXpwE","TCgPpix74r","P6bcgOHaBz","1j5L84QMc9",
+"SWfouFnPFB","s93MlEoToP","RpBQmprNT6","Yf2Ec5iGN5","fcJOygjUTu","5VZjSWDVWJ","cQOnviKqhr","dQ586JXljW","9iGoTd85a9","qQxHPulk41",
+"uZPqggtCA5","FLsphtaOXK","pAhR1Mm8si","uupzkbgJAz","64s8NlpF6W","Yh1hFIRh48","piJSkdpe1v","jiVBPfcwDa","0YAGH5drc6","RsQUqPb1pa",
+"xReecGXdoH","7lUXZe6e4z","07n1cZJTXH","t59lRaFFss","EOE1oJIqXi","zbIYYgdQsS","NAFuwChuy3","vkCHHCNHmv","dhSuH48cHL","Waim6rKDLJ",
+"5ZaEzQworu","5Mg9rIRh48","IBe8kFNYIM","Q6Lixzz4ZU","5Nammtl72W","ZUnqtDG4sT","Mm8siPYBf4","I7p2afcwDa","K4GS8n8pJ9","h1zcHkB5nP",
+"DLhzMS77LH","QChxssqVrf","QssNC64s8N","7lUXZgIYvE","9y4lw9rlg9","fLNg80Wr5y","RsQUqFPfSE","1v5hHGXdoH","TXQ0ZWaWsv","cQOnvTa8f6",
+"7fsYMVjCZq","vOqCELDk6f","SWfouVjCZq","Yf2Eco8Uyd","hi5X75drc6","FPfSEVerEA","taOXKm4bxU","Pb1paeuZA5","RBhp0uPX7G","WaWsv14FLR",
+"lkMUAVerEA","ZUnqt7Ow5C","2DREsS77LH","LbRTHKsjRK","uvf7A8TxD7","1j5L8gdQsS","o8UydjS1aj","7fKYUYh1hF","tlILtoQ87r","zQt6QfFDrJ",
+"ogLgcYh1hF","9GXkXRpBQm","fcJOyYOfrY","pAhR1uQIcz","9XyT9MezSW","fqypyQChxs","LbRTHzQt6Q","he9IAyofH3","GrDg7DQimp","xReecYw2oU",
+"d7vjMAOgEe","NAFuwaFFss","a00b5v8yFN","B3qemjfREu","8hJdt8hJdt","aez9yiB08l","WPmlxMK07Y","Z4I1vK4GS8","Cp3mZjtn0X","uQIczdmoS7",
+"qQxHP2ZHdk","QClRLfFDrJ","GWqqXqaofN","dmoS7gtCA5","MGlTFkB5nP","TXQ0ZQ6Lix","zHF1qHlUbF","faHirv1Hln","L7cGcZUnqt","J2mQibgJAz",
+"NcICAyEfy9","wDajXv8yFN","VerEAS77LH","VBjhziB08l","Gv3Fqulk41","Y1mC0Pb1pa","G1RhSrKDLJ","F6PT2ZhwG1","9rlg9zmLYD","uTacxMaJQs",
+"lCMxyVjCZq","AkKTkDcpWB","QYxC0t59lR","AgJHQgIYvE","IjTwPqQxHP","Kr8ysGXdoH","zmLYDW3VFH","CxVEfazIWp","F6PT29rlg9","W7cTsni2v1",
+"RkQkeBbwgA","2TRI7GrDg7","4dEz6WmadA","9XyT9vkCHH","14FLRIn3NS","FGzgpy94nw","mX2GENAFuw","yvOMIix74r","n8pJ95Drn0","Cp3mZEoToP",
+"uTacxVprf2","jS1ajgdQsS","0PktIs93Ml","EOE1ohE1Ql","Gv3FqFcWrW","jeskSUmaEv","4dEz6gf8rI","nFqikM3zXL","OUYuFhUTw7","XflUq0Kyfs",
+"ix74ri7WMQ","DcpWBzmLYD","JRJQBNOHsz","mz8gxzFgtB","ECMvUSs0Zu","suY4xYjB9t","HfyNQCIShG","b29RJ48cHL","WreyPFwEJz","lCMxyVNCPd",
+"uLtKsuvf7A","2Yz7EuLtKs","RkQkerKDLJ","7fKYUsx5Gl","zz4ZUDQimp","YjB9tBGaQY","Mkgy8d7vjM","gjUTuyofH3","Oz8yZReKEW","5IhmGpAhR1",
+"29QAzRxrsm","X6PinlsQGo","ydG8UHP433","iB08lC2Irc","Rxrsm9rlg9","qQxHP2Nslm","i3pydVNCPd","FxX9qulk41","RpBQmC2Irc","ZJTXHjfREu",
+"Zv7z0DcpWB","bZLvSfmIK1","VLTy6M6qcG","cShY2jSjS3","Uvlv4gIYvE","TwanoZv7z0","Ss0Zui7WMQ","CNHmvxciqp","In3NSNhXdu","No0QbWDVWJ",
+"FPfSEAmdQd","vOqCEx3LDe","ReKEWVBjhz","hSSvQAIYUu","x3LDeBFkb8","hE1QlUl4a1","MaJQs3weIF","v1HlnZv7z0","G1RhSyofH3","No0Qb3weIF",
+"Pb1paCK5W7","Twano55rfB","QClRL6q6L9","7fsYMJXljW","StlDJyofH3","D6rByQssNC","CIShGK4GS8","2hEEUm4bxU","VIlwPe6e4z","C2Ircl83Ud",
+"Cp3mZ5Drn0","dQ586FwEJz","OUYuFlm0pD","5VZjSnlaBy","guMb8lH1kt","StlDJ3otm6","gtCA58RCUA","vkCHHI7p2a","YjB9te6e4z","1v5hHd85a9",
+"OxWIHrz7Ut","WaWsvblLA9","cShY2t98iW","Uvlv4IRh48","1v5hHX6Pin","2hEEUs7Mxk","lCMxyDQimp","Ss0ZuoQ87r","rKDLJt98iW","AOgEeWMiS3",
+"ZUnqtlViBv","nlaByNxx9V","WPmlxFGzgp","EoToPUlU3M","RsQUq7fsYM","vkCHHPOUYS","d7vjM9GXkX","Nxx9VtlILt","v1Hlndpe1v","lj07Qtl72W",
+"hE1Qldjsrv","X6PinRACuj","blLA90MR5X","9y4lwVjCZq","0MR5XSs0Zu","JKWYR9XyT9","qaofNjSjS3","oQ87rSs0Zu","8TxD7JJs5m","L7cGc48cHL",
+"5Nammxciqp","uJScXl83Ud","0YAGHulk41","MmsIo45cIH","7lUXZuvf7A","tjQxstl72W","Dz1R3WPmlx","MaJQs8cVD3","Pb1pacQOnv","OUYuFBpYhV",
+"n1pmO2ZHdk","2ZHdkaDGtS","HlUbFuZPqg","AIYUuB3qem","5drc6rKDLJ","8RCUAulk41","XyPZNuLtKs","8xEKzzmLYD","xReecChuy3","AXpwEb29RJ",
+"QYxC0tjQxs","X6PinRsQUq","In3NSlCMxy","pmeCduPX7G","MmsIoKr8ys","Ta8f6I7p2a","580YDMmsIo","EoToPuLtKs","VNCPdyluBx","sx5GlB3qem",
+"qQxHPQbxXc","ECMvUSbRYy","FxX9qyEfy9","yofH3AXpwE","GWqqXmX2GE","d85a9dhSuH","J2mQiuQIcz","he9IAgtCA5","zmLYDyToGW","9y4lw8TxD7",
+"GXdoH0YAGH","QWxoTWMiS3","MmsIosx5Gl","9iGoTzqH0W","55rfBDLhzM","HzZT82Yz7E","SjskQU3yw5","dmoS7m4bxU","RACujBpYhV","uTacx14FLR",
+"SjskQAmdQd","AkKTkWreyP","QClRLIKxdL","Q6LixmX2GE","ulk415Namm","LDk6fFVMxo","hE1QluQIcz","vLsmSv8yFN","JRJQBZzJHW","GWqqX8RCUA",
+"Zv7z0G1RhS","s4786qaofN","uoStwQYxC0","uPX7G9XyT9","Oz8yZhi5X7","v2eC3d85a9","JJs5mQworu","rhl0JqaofN","ZhwG1AIYUu","VerEAuZPqg",
+"0MR5XvkCHH","Gv3FqGSQwj","cQOnvQ6hMC","ydG8UkZANm","FNYIM0ao3l","xciqpGXdoH","zqH0W1j5L8","WmadAzqH0W","16lHcyluBx","jS1ajOUYuF",
+"zFgtB9iGoT","Yh1hFRzaZA","lH1ktM3zXL","Mm8siECMvU","VerEAaL6AJ","TCgPpPb1pa","QworuAOgEe","t98iWciuWz","n1pmOm4bxU","pAhR1I7p2a",
+"7ku1pzY1GY","tuDySSWfou","JJs5mBFkb8","ydG8UFcWrW","5Mg9rQWxoT","fqypyZuDtD","gf8rItlILt","FGzgppAhR1","hYBCKcmXIX","FLsph16lHc",
+"M3zXL9iGoT","EoToPHzZT8","ZzJHWuoStw","FnPFBIRh48","Pb1paStlDJ","jtn0XbZLvS","he9IAZUnqt","tlILtM3zXL","QssNChi5X7","8RCUAFNYIM",
+"AOgEeuoStw","2ZHdkqaofN","zFgtBMmsIo","ksJbypvgjS","x3LDeMojnP","l83Ud1v5hH","ydG8USs0Zu","S2DfuRxrsm","5IhmGLDk6f","gdQsSWDVWJ",
+"tl72WRBhp0","VLTy6CNHmv","KASQ845cIH","7hyVv9rlg9","fcJOyXyPZN","Cp3mZd7vjM","NcICAh1zcH","HRxd80BmCy","nFqikOHaBz","o8UydAgJHQ",
+"In3NS2hEEU","dpe1vtjQxs","oVQp6s7Mxk","rKDLJzY1GY","RACujrKDLJ","qaofNh1zcH","ZzJHWdpe1v","5Drn0wDajX","IBe8kIn3NS","P6bcg618Di",
+"ogLgcYf2Ec","d7vjMI7p2a","fFDrJn1pmO","MK07YQworu","3otm6DcpWB","Waim6Ss0Zu","BbwgAiqv4k","uLtKsSjskQ","cQOnvBCxeC","BpYhVSs0Zu",
+"TCgPpUmaEv","IKxdLXflUq","lViBvJIqXi","2ZHdk07n1c","fcJOyrz7Ut","blLA9azIWp","Dz1R3IRh48","uJScXUvlv4","BCxeC5IhmG","8FmFHFGzgp",
+"Pb1paWPmlx","KZamHlkMUA","07n1cpT8wu","Zv7z0lpF6W","yluBxuQIcz","3weIFaDGtS","faHirOHaBz","iwzGkCK5W7","2DREs64s8N","l83UdaL6AJ",
+"SbRYylsQGo","RBhp0iKqhr","aez9yfcwDa","FjHXRFnPFB","v2eC3LbRTH","JKWYRxciqp","lsQGoAXpwE","mX2GEhSSvQ","pAhR15iGN5","tl72Wuupzk",
+"FFDui9y4lw","0KyfsQYxC0","CK5W7ulk41","ydG8UJ2mQi","fcJOyi3pyd","pT8wuIKxdL","s7MxkcmXIX","djsrv0Wr5y","SmGzvs4786","l83Ud3otm6",
+"djsrv45cIH","5iGN5OUqFM","SjskQMkgy8","ni2v13otm6","JkzUnAgJHQ","BFkb8OUqFM","NOHszM6qcG","lpF6W5ZaEz","VLTy6cQOnv","JRJQBDLhzM",
+"oGu6xFFDui","i3pyd9rlg9","XyPZNkB5nP","0YAGHpmeCd","MmKGJ0BmCy","zqH0WLbRTH","5VZjS29QAz","LbRTH16lHc","7fsYMLbRTH","X6PinBbwgA",
+"iKqhrWDVWJ","RBhp0zbIYY","FjHXRogLgc","EoToP7X3uy","WreyPJXljW","DLhzMh1zcH","jSjS3dQ586","7lUXZ45cIH","5VZjSUmaEv","rKDLJ7hyVv",
+"SbRYyzqH0W","5ZaEzzz4ZU","VerEAJJs5m","16lHc0Wr5y","ZuDtDjtn0X","brhlQZzJHW","BFkb8lViBv","tl72WQChxs","vkCHHwiHrZ","RzaZAUmaEv",
+"HzZT8QYxC0","8RCUAYf2Ec","WMiS3Dz1R3","Ta8f6FFDui","Y1mC0v8yFN","aFFsswDajX","sqVrflViBv","6q6L9Ss0Zu","0h1b1djsrv","64s8N8TxD7",
+"fqypyWmadA","MaJQs0PktI","jfREu3weIF","azIWp3weIF","JRJQBJ2mQi","pFrrlLbRTH","lkMUAhSSvQ","9eoRctAOsr","cShY2Qworu","LDk6flweGy",
+"RkQkeqQxHP","rz7UtBCxeC","K20wK9iGoT","14FLRcmXIX","Yh1hFXflUq","QssNCZhwG1","zmLYDhYBCK","Mkgy8VIlwP","Ul4a1JKWYR","zmLYDtvdkD",
+"5Mg9rsoy9t","8cVD3ksJby","d85a9fLNg8","ECMvUX6Pin","yEfy9No0Qb","WMiS38FmFH","8U2nUvOqCE","RkQkeZUnqt","NhXduMm8si","5Drn0h1zcH",
+"fFDrJFPfSE","Yh1hFEOE1o","vOqCEjfREu","dmoS7aFFss","vOqCEsx5Gl","ru4UGlCMxy","pT8wuHP433","9rlg9h1zcH","ZJTXHMezSW","xXTI4qQxHP",
+"gtCA5Cfgr3","JXljWFGzgp","ECMvUfLNg8","yvOMIzQt6Q","VIlwPPYBf4","pmeCd5VZjS","lCMxysoy9t","U3yw5U3yw5","tuDySpiJSk","VLTy6JJs5m",
+"DcpWBlCMxy","45cIHbgJAz","NOHszQYxC0","HRxd8dmoS7","lpF6WCK5W7","s4786prNT6","pAhR1Gv3Fq","rhl0JRpBQm","UmaEvciuWz","gtCA5fcwDa",
+"Z4I1vNcICA","9GXkX7ku1p","5Drn0RsQUq","zbIYYyluBx","W7cTs9XyT9","GrDg7prNT6","FPfSEtuDyS","wiHrZgdQsS","cShY2sqVrf","B3qemmz8gx",
+"ydG8UM3zXL","PYBf4tvdkD","jeskSK20wK","5Drn0x3LDe","TCgPp7X3uy","K20wK24ARF","SbRYyGv3Fq","I7p2aPYBf4","VerEAuoStw","gIYvE0MR5X",
+"lkMUAsuY4x","okgRilCMxy","WDVWJi7WMQ","ix74rfaHir","hUTw7fcJOy","Y1mC0hi5X7","aez9yJKWYR","OHaBzuN6r3","WPmlxzFgtB","lCMxypT8wu",
+"kZANmksJby","soy9tXflUq","WPmlxblLA9","pAhR1zHF1q","Q6hMCyluBx","euZA5JIqXi","NhXdubZLvS","Zv7z0WaWsv","n1pmOy94nw","WPmlxv2eC3",
+"WPmlxfaHir","5Drn0atef2","ZzJHWaez9y","lpF6WFhtgl","6q6L9NcICA","45cIHtvdkD","tjQxsAIYUu","yToGWwiHrZ","fFDrJFwEJz","Uvlv4nFqik",
+"yEfy9ZzJHW","WMiS3ydG8U","lm0pD8hJdt","lCMxyaDGtS","In3NSv1Hln","nlaBy2TRI7","vLsmSXflUq","M6qcG2ZHdk","vOqCEZhwG1","mz8gxJRJQB",
+"RxrsmlpF6W","8TxD7uLtKs","uJScXzbIYY","EOE1orz7Ut","Dz1R37hyVv","2Yz7EuPX7G","No0QbuQIcz","gtCA5aFFss","8cVD3vOqCE","lsQGoMGlTF",
+"O3iyQxReec","iqv4kpmeCd","tAOsrksJby","EoToPCK5W7","VNCPdWreyP","sqVrfgf8rI","Vprf2G1RhS","n1pmORzaZA","VLTy6aL6AJ","lsQGoZ4I1v",
+"Q6hMCFGzgp","WMiS3xXTI4","Oz8yZVLTy6","VIlwPb29RJ","i7WMQWPmlx","TCgPp0YAGH","lm0pD2ZHdk","lpF6WuAWyp","L7cGcFjHXR","zmLYDL7cGc",
+"0MR5Xjtn0X","s7MxkrKDLJ","hi5X7lpF6W","LbRTHfaHir","No0Qb0Kyfs","618DiFPfSE","Ta8f6qaofN","KZamHtl72W","2Yz7E0h1b1","07n1ctvdkD",
+"FLsphWaim6","NcICAfFDrJ","2NslmWDVWJ","AgJHQ9eoRc","Yf2EcK20wK","K20wKFhtgl","JRJQBAkKTk","yEfy9IjTwP","U3yw5SbRYy","QnJ1Sk85Ae",
+"D6rByvkCHH","UlU3MZJTXH","vLsmSZJTXH","BCxeCQ6hMC","tuDySStlDJ","4dEz6b29RJ","CK5W7ReKEW","CqqaDCK5W7","KsjRK4QMc9","8hJdtZ4I1v",
+"gtCA5Twano","PYBf4uN6r3","oGu6xgtCA5","MmsIoZuDtD","MaJQsgf8rI","DQimplm0pD","QnJ1Sdjsrv","euZA5Cfgr3","Oz8yZydG8U","Chuy3UlU3M",
+"2TRI748cHL","oGu6xlweGy","Waim6Cfgr3","HlUbFdQ586","n8pJ9SbRYy","hSSvQZv7z0","QChxsvkCHH","tl72WWDVWJ","azIWpRpBQm","RpBQmcL0aE",
+"nFqikVLTy6","h1zcH8cVD3","OHaBzblLA9","euZA5JKWYR","UmaEvnlaBy","o8UydpmeCd","5nmWv2DREs","pAhR1wiHrZ","v2eC3NOHsz","3otm6iwzGk",
+"RkQkeyofH3","48cHLHlUbF","7hyVvaFFss","t59lRfaHir","BbwgAguMb8","X6PinK20wK","FVMxoQChxs","nFqikjfREu","4QMc9CNHmv","rz7UtVprf2",
+"Ss0Zuv1Hln","1LB1Lk85Ae","Yf2Ecgf8rI","zY1GYhSSvQ","Uvlv4POUYS","YOfrY7Ow5C","fLNg8UmaEv","iKqhrjzUqR","5Mg9rGSQwj","lViBv0MR5X",
+"Dz1R37fsYM","2TRI7k85Ae","VIlwPSmGzv","LewvMTCgPp","VLTy6FwEJz","Z4I1vHP433","hUTw7Kr8ys","yluBxuJScX","pmeCdBGaQY","d7vjMyluBx",
+"suY4xyToGW","pT8wuMmKGJ","IRh48aFFss","JJs5mn1pmO","BpYhV4W0Tl","ECMvUMojnP","s93MlAkKTk","yofH3kZANm","cL0aE8cVD3","5ZaEz0PktI",
+"RBhp0qUJMd","xXTI44W0Tl","S77LHJJs5m","sx5GlJXljW","6q6L95Drn0","BpYhVgf8rI","2Yz7Et98iW","wiHrZNOHsz","FjHXR3otm6","J2mQifcwDa",
+"lH1ktBpYhV","XflUqBCxeC","NAFuw0PktI","Ss0ZuuTacx","VLTy6CK5W7","qUJMdMmsIo","s4786Ta8f6","0h1b1soy9t","SbRYyBpYhV","0Wr5yM3zXL",
+"U3yw555rfB","5Drn0DcpWB","9rlg9gIYvE","Waim67ku1p","FxX9qd7vjM","5Mg9rFFDui","NcICAFwEJz","jiVBPNo0Qb","7X3uylCMxy","MmsIo9GXkX",
+"5NammXyPZN","TCgPppmeCd","nnP8oRsQUq","uupzkChuy3","ZJTXHVBjhz","2DREslm0pD","ZJTXHsuY4x","1j5L82Yz7E","nFqik48cHL","HRxd8QbxXc",
+"ksJbyyofH3","yEfy9J2mQi","tuDySAXpwE","Q6LixQbxXc","580YDK20wK","uN6r3jSjS3","MmsIozqH0W","DcpWB9eoRc","zz4ZUcShY2","n1pmOpAhR1",
+"DLhzMqQxHP","CIShGMm8si","580YDJKWYR","dpe1v3weIF","bgJAzcL0aE","piJSkrz7Ut","OxWIHrhl0J","pT8wubrhlQ","blLA9fcwDa","taOXKSs0Zu",
+"In3NSChuy3","8xEKzlCMxy","iB08lzY1GY","TCgPpNhXdu","v2eC3Ss0Zu","Cfgr39XyT9","yofH3IjTwP","2DREsDz1R3","S77LHXyPZN","v2eC3FFDui",
+"Ta8f64W0Tl","0ao3lFLsph","9eoRcZUnqt","lH1ktk85Ae","14FLRk85Ae","9XyT9mX2GE","Yh1hFuAWyp","fmIK1RACuj","8TxD7kZANm","gf8rIrz7Ut",
+"vkCHHzmLYD","QWxoT29QAz","JRJQBWreyP","14FLRkZANm","AgJHQ3otm6","CIShGUvlv4","zQt6QJkzUn","ZuDtDfaHir","YOfrYC2Irc","WmadAi7WMQ",
+"CNHmvjeskS","9XyT9SjskQ","2Yz7EQChxs","QYxC0pvgjS","Uvlv42DREs","UmaEvfaHir","lj07QNhXdu","xciqpatef2","QnJ1SoGu6x","euZA5lXFOB",
+"Oz8yZcQOnv","uN6r3S77LH","RBhp0EoToP","Gv3Fqx3LDe","HRxd8iB08l","VBjhzQChxs","qQxHP4dEz6","LbRTHpiJSk","RsQUqNo0Qb","9rlg9Vprf2",
+"v1HlnWmadA","EdBKcogLgc","EOE1on8pJ9","Gv3FqyofH3","fLNg8WreyP","gf8rICdyBV","taOXKSbRYy","qUJMdHlUbF","fqypyqaofN","1j5L8lH1kt",
+"NOHszkB5nP","atef2ru4UG","0MR5XtvdkD","hE1QlXyPZN","uN6r3FNYIM","cL0aE4dEz6","MGlTFyToGW","SWfouiB08l","FjHXRMezSW","mz8gxFPfSE",
+"s4786K4GS8","cShY2s4786","ciuWzt59lR","y94nw8RCUA","uupzk4W0Tl","QChxsRpBQm","cmXIXPYBf4","3otm6x3LDe","4W0Tl618Di","24ARFcShY2",
+"B3qemuJScX","n1pmOd85a9","WPmlxRmDcr","i3pydFnPFB","FLsphTwano","0PktI0YAGH","8FmFHKZamH","24ARFn1pmO","uAWyptAOsr","l83Ud580YD",
+"fqypy1j5L8","24ARFwiHrZ","WDVWJXyPZN","blLA9okgRi","7ku1pKASQ8","G1RhS0Wr5y","s7MxkVerEA","uvf7ABbwgA","W7cTssqVrf","SbRYyhSSvQ",
+"AOgEeiKqhr","JKWYRQworu","XflUqZzJHW","uAWypG1RhS","tjQxsjiVBP","JkzUnvkCHH","B3qemRxrsm","mX2GEUlU3M","FLsphStlDJ","pAhR15Namm",
+"euZA5qQxHP","9eoRccShY2","s4786KZamH","kZANmRsQUq","AXpwE2ZHdk","G1RhSYh1hF","rKDLJAOgEe","QbxXczY1GY","1LB1LAXpwE","M3zXLB3qem",
+"v1HlnOUqFM","WMiS3x3LDe","lm0pDkZANm","OUqFMzY1GY","SWfouyEfy9","tAOsrWaWsv","J2mQisqVrf","VjCZq1j5L8","CdyBVuLtKs","uoStwYjB9t",
+"ogLgch1zcH","hYBCKRsQUq","OxWIHzmLYD","4dEz6Z4I1v","Gv3Fq0MR5X","pFrrlQ6hMC","lViBvzQt6Q","uoStwpT8wu","oGu6xPYBf4","HP433nnP8o",
+"taOXKEoToP","7X3uy618Di","FhtglWPmlx","iwzGkFVMxo","JXljW9rlg9","OxWIHsuY4x","2TRI7gtCA5","iB08lVBjhz","Ta8f6lViBv","lViBvW7cTs",
+"piJSkaFFss","5NammMaJQs","vkCHHix74r","s7MxkQbxXc","l83UdMezSW","AkKTkXyPZN","SmGzvtl72W","blLA93weIF","Mkgy8zQt6Q","KZamHuoStw",
+"2hEEUvOqCE","dhSuHYh1hF","U3yw5DQimp","WreyPyvOMI","pT8wu5VZjS","JkzUndpe1v","QssNCK20wK","soy9tKZamH","oQ87r6AFT0","Ss0Zusoy9t",
+"FhtglCp3mZ","i7WMQ8TxD7","ix74rcShY2","8RCUARBhp0","SjskQwDajX","azIWpNcICA","o8Uyd8FmFH","dpe1vWreyP","wiHrZQWxoT","2NslmoGu6x",
+"BCxeCHlUbF","SbRYyAmdQd","3weIFMaJQs","guMb8FcWrW","FhtglZv7z0","8RCUAgdQsS","MojnPmz8gx","cShY2FVMxo","FLsphPb1pa","VNCPdbZLvS",
+"QbxXcOUqFM","Ul4a1ru4UG","0ao3lyofH3","yluBxKsjRK","ECMvU3weIF","QnJ1SlpF6W","GrDg7jeskS","RzaZAAOgEe","uvf7AP6bcg","suY4xfmIK1",
+"0h1b1aFFss","5iGN5ThjNn","Q6LixeuZA5","P6bcgVprf2","7Ow5CD6rBy","o8UydCp3mZ","AmdQd8U2nU","o8UydWPmlx","prNT6nnP8o","zY1GYuLtKs",
+"OHaBzI7p2a","CdyBVlH1kt","I7p2aEoToP","s7Mxk5drc6","Kr8ys29QAz","QClRLVLTy6","v2eC37fKYU","NhXduZv7z0","CdyBVVjCZq","uJScXuvf7A",
+"QChxsgf8rI","Yw2oUTwano","zHF1qMaJQs","Yw2oURBhp0","1LB1LUlU3M","DG4sTn8pJ9","BFkb8v8yFN","yEfy9EdBKc","okgRiYOfrY","suY4xQ6hMC",
+"8U2nUFjHXR","ciuWzlm0pD","5ZaEziwzGk","iqv4kHzZT8","yluBx1v5hH","uAWyplkMUA","rhl0JIjTwP","0ao3lulk41","XyPZNBpYhV","NhXduBpYhV",
+"7X3uyqQxHP","Mkgy8S77LH","qUJMdxciqp","8hJdtoGu6x","2TRI7RACuj","ydG8UO3iyQ","atef2JKWYR","1v5hHnFqik","0PktI9XyT9","taOXKVerEA",
+"suY4xOUqFM","l83UdzY1GY","FNYIMl83Ud","5ZaEzMkgy8","QssNCXflUq","tl72W8TxD7","uQIczhUTw7","0MR5XwDajX","ThjNnnFqik","WreyPciuWz",
+"BbwgA8cVD3","n8pJ9WMiS3","MK07YOUYuF","CIShGSbRYy","Rxrsmo8Uyd","RzaZANAFuw","2TRI7lH1kt","5nmWvSmGzv","PYBf4kZANm","Q6Lix0h1b1",
+"tjQxsZhwG1","jfREuWaim6","s7Mxkrz7Ut","PYBf4suY4x","cQOnvkZANm","okgRi0PktI","9rlg9rz7Ut","lpF6WYf2Ec","lViBv8xEKz","1j5L8uJScX",
+"9y4lwYh1hF","tjQxsFFDui","cmXIXe6e4z","2NslmeuZA5","jSjS3aL6AJ","OUqFMjfREu","cQOnvLbRTH","AmdQd5Namm","5nmWvNhXdu","lj07Qv8yFN",
+"RsQUqzmLYD","2Nslmb29RJ","hi5X7suY4x","Mkgy8vkCHH","DQimpXyPZN","HP433uPX7G","faHirM6qcG","kZANm5drc6","gf8rIpWiOs","QworuK4GS8",
+"xReecYh1hF","FxX9qpvgjS","5drc62TRI7","0YAGHStlDJ","D6rBy4W0Tl","blLA9HfyNQ","v2eC3qaofN","d7vjM1LB1L","UmaEvtl72W","yvOMI0MR5X",
+"G1RhSOUqFM","Nxx9VgjUTu","MGlTFYOfrY","UmaEvzmLYD","pFrrlcmXIX","e6e4zMojnP","FnPFB9XyT9","GSQwjM3zXL","7lUXZmz8gx","ZzJHW7hyVv",
+"OHaBz0ao3l","sqVrfiKqhr","FhtglJ2mQi","G1RhSCIShG","x3LDeEOE1o","FxX9qlm0pD","aL6AJpmeCd","Dz1R3yToGW","qaofNMkgy8","TXQ0ZLewvM",
+"WaWsvYf2Ec","CIShG7X3uy","mz8gxoGu6x","J2mQiaL6AJ","lm0pDU3yw5","VLTy6tvdkD","WPmlxUl4a1","FVMxoOUqFM","k85AeazIWp","6q6L9M6qcG",
+"FcWrWAgJHQ","bZLvSJkzUn","e6e4zZhwG1","QbxXcBGaQY","EoToPvLsmS","v2eC3taOXK","he9IA5drc6","zY1GYtaOXK","TwanolpF6W","XyPZNksJby",
+"zFgtBqaofN","UlU3MtAOsr","QworuGXdoH","tjQxsSs0Zu","i3pydzz4ZU","oVQp6P6bcg","a00b5JXljW","S2DfuWMiS3","DcpWBY1mC0","jS1ajru4UG",
+"bZLvSkZANm","5IhmGUlU3M","dQ586yEfy9","y94nwyToGW","7hyVvpT8wu","FNYIM1LB1L","BbwgAyToGW","DLhzMK20wK","CdyBV8RCUA","Q6hMCzqH0W",
+"zbIYY0MR5X","S77LHQnJ1S","faHir5nmWv","VIlwPJRJQB","IRh48NhXdu","DcpWB55rfB","BbwgAokgRi","blLA9uupzk","kB5nPx3LDe","QYxC05ZaEz",
+"i3pydhe9IA","mX2GEWaWsv","HzZT8Rxrsm","ulk41ThjNn","oQ87rdjsrv","uZPqgcShY2","y94nwMojnP","SjskQsx5Gl","RzaZAtvdkD","xXTI4hE1Ql",
+"8TxD729QAz","RxrsmIn3NS","gf8rIlCMxy","OUYuFMmsIo","5nmWv5ZaEz","0Wr5yoVQp6","pWiOs2Yz7E","9eoRcKr8ys","EoToPd7vjM","2hEEUGSQwj",
+"QssNCyvOMI","9iGoTpiJSk","5nmWvVerEA","jfREu8hJdt","0MR5Xxciqp","8U2nUpvgjS","5nmWv7fKYU","QWxoThe9IA","Ta8f68U2nU","Mkgy80MR5X",
+"7fsYMMm8si","i7WMQSWfou","HzZT85IhmG","7fKYUtAOsr","L7cGc9rlg9","blLA9LDk6f","wDajX7lUXZ","LbRTHzbIYY","mX2GEyvOMI","MGlTFIn3NS",
+"4W0TlZ4I1v","NcICADG4sT","yvOMIiwzGk","t98iWbZLvS","brhlQ0BmCy","qUJMdJ2mQi","FnPFBW3VFH","VIlwPDcpWB","MmsIoDG4sT","VBjhzAIYUu",
+"C2IrcWmadA","Vprf2NOHsz","gjUTu7lUXZ","GXdoHDG4sT","Cp3mZ580YD","In3NSAkKTk","Ta8f6Gv3Fq","i7WMQM6qcG","IRh487fsYM","tjQxsP6bcg",
+"BbwgAHP433","JkzUnl83Ud","UlU3MYjB9t","uPX7GJKWYR","yofH3cShY2","pFrrlWDVWJ","FFDuiksJby","0PktIU3yw5","cmXIXd7vjM","S77LHazIWp",
+"EoToPzHF1q","x3LDeY1mC0","RBhp0I7p2a","5IhmG1v5hH","bZLvS5drc6","aez9yRkQke","iKqhruvf7A","qQxHP2DREs","GrDg76AFT0","45cIH2hEEU",
+"Kr8ysMGlTF","DG4sTWPmlx","7fsYMOHaBz","Vprf2FPfSE","v2eC34W0Tl","zz4ZUDcpWB","dpe1vTCgPp","QYxC0Twano","he9IAStlDJ","PYBf4IKxdL",
+"PYBf4JXljW","tvdkD48cHL","zFgtBciuWz","GSQwjTXQ0Z","fcwDaTXQ0Z","2ZHdkQworu","6q6L9iKqhr","tuDySQssNC","MmKGJXflUq","MmKGJuLtKs",
+"X6Pinb29RJ","v2eC3yvOMI","euZA5zHF1q","GWqqXaL6AJ","uvf7A45cIH","B3qemVLTy6","IBe8k9eoRc","VerEA0MR5X","FxX9qMGlTF","zHF1qpiJSk",
+"hE1QlGSQwj","ni2v18xEKz","8FmFHgIYvE","POUYSkB5nP","iB08lrz7Ut","okgRiNAFuw","OHaBzrKDLJ","P6bcgjeskS","uTacxFhtgl","gf8rIK4GS8",
+"7fKYUK4GS8","VerEAdmoS7","uJScXBCxeC","2DREsXyPZN","EOE1oHlUbF","B3qemWreyP","FjHXRaFFss","RACujJ2mQi","ogLgcCNHmv","3otm6RACuj",
+"uQIczoVQp6","FhtglokgRi","7lUXZ1j5L8","7fKYUF6PT2","euZA5Oz8yZ","zqH0WGSQwj","Cp3mZ8TxD7","yToGWcL0aE","h1zcHIjTwP","B3qemIBe8k",
+"vLsmSi7WMQ","Q6LixgjUTu","ru4UGgf8rI","C2Ircm4bxU","pv0i7Yw2oU","7fKYUhe9IA","9y4lwhE1Ql","D6rBydjsrv","StlDJQ6hMC","9eoRcCIShG",
+"YjB9tQbxXc","1j5L8Fhtgl","jSjS39y4lw","qaofNQWxoT","zQt6QGv3Fq","euZA5t98iW","soy9tOUYuF","6AFT01j5L8","iB08ljS1aj","qaofNSbRYy",
+"VLTy6AIYUu","J2mQiQnJ1S","hSSvQiwzGk","5iGN56q6L9","gf8rIGv3Fq","MmKGJ7fsYM","i3pydru4UG","iKqhrNo0Qb","5Drn0vkCHH","FhtglFGzgp",
+"faHirs4786","jeskSvOqCE","EdBKcB3qem","fFDrJlkMUA","Ul4a1MmKGJ","AOgEeWaWsv","IjTwPsuY4x","2hEEUydG8U","JJs5mpiJSk","GXdoHQworu",
+"DG4sTzz4ZU","GWqqXlXFOB","Yh1hFS2Dfu","bgJAzxciqp","Vprf2CxVEf","Ul4a1JJs5m","aDGtSsoy9t","lH1ktJKWYR","tAOsrulk41","DcpWBNxx9V",
+"KsjRKhE1Ql","VNCPdcmXIX","jfREuYf2Ec","9XyT9d85a9","iB08lHP433","RmDcrTCgPp","uN6r3pv0i7","QworuRkQke","8TxD72Yz7E","FcWrWHfyNQ",
+"soy9tVjCZq","zY1GYiB08l","JXljW5VZjS","M3zXL9y4lw","v1HlnTXQ0Z","8FmFHHfyNQ","okgRi9rlg9","hE1QlzFgtB","atef2RACuj","e6e4zJKWYR",
+"RBhp02Nslm","1LB1Lv2eC3","Y1mC0Fhtgl","FjHXRzqH0W","JIqXigdQsS","v8yFNF6PT2","JRJQBO3iyQ","7X3uypv0i7","pAhR19rlg9","XyPZNk85Ae",
+"ECMvUmz8gx","uZPqg9XyT9","IRh480ao3l","K20wKogLgc","VIlwPFGzgp","hYBCKfLNg8","Yh1hFAOgEe","2ZHdkb29RJ","0MR5XMojnP","6AFT0DG4sT",
+"pvgjSTXQ0Z","FhtglDz1R3","JXljWsoy9t","iB08lsx5Gl","jzUqRuvf7A","HlUbFAkKTk","uJScXzmLYD","y94nw8U2nU","lXFOBB3qem","J2mQiKsjRK",
+"0KyfscL0aE","rhl0JEOE1o","Ss0ZuPb1pa","jiVBP1j5L8","zz4ZUEoToP","jS1aj48cHL","uoStw9GXkX","QnJ1STa8f6","BbwgAdhSuH","hE1QlUmaEv",
+"lpF6WcL0aE","QClRLv1Hln","Uvlv4x3LDe","DG4sTgtCA5","MmsIooQ87r","QClRLBCxeC","a00b50h1b1","IjTwPJJs5m","atef2VjCZq","s7MxkOxWIH",
+"oVQp6RmDcr","brhlQ5drc6","okgRicShY2","zmLYDlpF6W","CNHmvFLsph","zbIYYblLA9","14FLRzmLYD","Nxx9V8TxD7","WaWsvt59lR","dQ586QWxoT",
+"bgJAzIjTwP","0MR5XOUqFM","QbxXcMaJQs","cmXIXhSSvQ","Vprf2ru4UG","Oz8yZqUJMd","tvdkDi3pyd","aFFssZ4I1v","BpYhV0BmCy","QnJ1SD6rBy",
+"zQt6QfLNg8","tAOsrCp3mZ","iqv4kaFFss","yEfy9Qworu","yluBx0BmCy","SmGzv580YD","zqH0WfmIK1","Q6hMCGWqqX","Q6Lix7hyVv","AOgEeNhXdu",
+"qUJMdi3pyd","Pb1pa5VZjS","Qworuh1zcH","pT8wuK20wK","ReKEWs93Ml","VIlwP48cHL","MojnPGv3Fq","i3pydQYxC0","2TRI71LB1L","FVMxodhSuH",
+"jiVBPtlILt","FNYIMi3pyd","NAFuwbZLvS","bgJAz2ZHdk","48cHLzFgtB","9GXkXLDk6f","wiHrZ2ZHdk","5VZjSC2Irc","bgJAzxXTI4","iwzGk24ARF",
+"1v5hHfaHir","TCgPpHRxd8","X6PinHlUbF","5Namm7Ow5C","BbwgARpBQm","taOXKuvf7A","J2mQiM6qcG","mz8gxVjCZq","WPmlxSjskQ","Chuy3Y1mC0",
+"3otm6vkCHH","v8yFNTCgPp","h1zcHzQt6Q","jeskSzQt6Q","tAOsrBCxeC","M6qcGIKxdL","No0QbHP433","VjCZqKASQ8","RzaZAogLgc","iB08lTwano",
+"4dEz6fcwDa","yofH3Yw2oU","cL0aE618Di","n8pJ9rz7Ut","IBe8kprNT6","QWxoTl83Ud","8RCUAhi5X7","wDajXNhXdu","WMiS3dpe1v","48cHLdpe1v",
+"NOHszxciqp","lm0pDhSSvQ","soy9toQ87r","AIYUucmXIX","hi5X7zbIYY","ReKEWAmdQd","FwEJzdjsrv","K20wKY1mC0","0MR5XECMvU","JJs5mtl72W",
+"bgJAzwDajX","48cHLI7p2a","2ZHdkuPX7G","wiHrZ0YAGH","i7WMQzmLYD","O3iyQI7p2a","OxWIHd7vjM","o8UydMaJQs","CdyBVgdQsS","tlILtWmadA",
+"d7vjMQnJ1S","ulk41K20wK","hi5X7wiHrZ","sqVrf2TRI7","Vprf2pFrrl","dQ5868TxD7","AOgEeYjB9t","MezSWCfgr3","AgJHQv1Hln","1LB1LrKDLJ",
+"Chuy3LDk6f","F6PT2EdBKc","QnJ1S9eoRc","lweGyECMvU","14FLR9iGoT","gIYvEe6e4z","Rxrsmpv0i7","29QAzKASQ8","HfyNQAXpwE","StlDJs4786",
+"StlDJ8FmFH","580YDazIWp","jeskSjtn0X","euZA5k85Ae","rKDLJlweGy","t98iWzFgtB","9GXkXm4bxU","I7p2aZUnqt","ru4UGfLNg8","7ku1pKZamH",
+"07n1c24ARF","tuDySReKEW","RkQkeOz8yZ","aez9yuJScX","RmDcrRpBQm","uoStwfFDrJ","UlU3MIn3NS","YjB9tsoy9t","YjB9tQworu","CxVEfWaWsv",
+"MezSWlweGy","pWiOsprNT6","GSQwjQ6hMC","QssNC2Nslm","NcICACfgr3","uoStwqQxHP","ZzJHWv8yFN","y94nwlpF6W","aez9yB3qem","Cfgr3uN6r3",
+"Waim6jzUqR","uLtKs8TxD7","k85AeZ4I1v","azIWp0Wr5y","SWfouru4UG","pmeCd7hyVv","nFqiki7WMQ","CdyBVUvlv4","FPfSEuAWyp","ogLgcZJTXH",
+"FGzgpzmLYD","a00b58U2nU","QChxsDcpWB","pmeCd9XyT9","HlUbFDQimp","fcJOyThjNn","0YAGHMkgy8","QnJ1SCNHmv","FjHXRlsQGo","piJSkyvOMI",
+"WPmlxs4786","AIYUu5IhmG","M3zXL0MR5X","FxX9quAWyp","CNHmvvOqCE","v1HlnRzaZA","WDVWJZ4I1v","lsQGon8pJ9","U3yw50MR5X","rz7UtLDk6f",
+"VIlwP0Wr5y","d85a9M3zXL","EOE1o29QAz","1LB1Laez9y","ulk41zFgtB","Oz8yZ5Namm","rz7Utk85Ae","uvf7AO3iyQ","lpF6Wtl72W","uupzkaFFss",
+"Vprf2soy9t","okgRiFGzgp","WDVWJPYBf4","MojnPqUJMd","qUJMdC2Irc","AkKTki3pyd","a00b5QnJ1S","CxVEfAmdQd","RBhp0uTacx","dpe1vAOgEe",
+"cShY24QMc9","bZLvSRACuj","BCxeClweGy","5IhmG6AFT0","ydG8UJkzUn","14FLRWaWsv","RsQUqDz1R3","WaWsvTa8f6","I7p2aVjCZq","QChxs580YD",
+"1v5hHuQIcz","yofH3RzaZA","FnPFBaDGtS","2Yz7Ehi5X7","x3LDeh1zcH","fcJOyfFDrJ","iwzGk8TxD7","tl72WQ6hMC","2NslmazIWp","qaofN8FmFH",
+"mz8gx2DREs","ni2v1ECMvU","lH1ktyofH3","LbRTHQbxXc","OUqFMOz8yZ","FLsphhUTw7","QbxXc4QMc9","y94nwC2Irc","RBhp0Waim6","RzaZAfcwDa",
+"dhSuHa00b5","ECMvU1v5hH","zQt6Q8RCUA","k85AeYf2Ec","ZhwG1oQ87r","W7cTs0MR5X","FwEJzIBe8k","lViBvAkKTk","hYBCKD6rBy","QssNClweGy",
+"jS1ajgf8rI","0YAGHLbRTH","gjUTu16lHc","lsQGoOHaBz","rhl0JTa8f6","TXQ0Zn8pJ9","zQt6QzQt6Q","XflUqRBhp0","AmdQdoGu6x","nFqik6AFT0",
+"Ss0Zu8FmFH","hSSvQHfyNQ","t59lRGrDg7","ogLgc2TRI7","3weIFM6qcG","XyPZNbgJAz","OHaBzQ6Lix","lViBvAXpwE","hi5X7DLhzM","S77LHRxrsm",
+"zmLYDqQxHP","ZhwG1Cp3mZ","fLNg8jzUqR","hYBCKWaim6","0PktIcL0aE","prNT64W0Tl","BCxeClkMUA","MezSW5iGN5","gIYvEMm8si","7hyVvDQimp",
+"RsQUqB3qem","zQt6QuAWyp","pAhR145cIH","cQOnvZhwG1","8FmFH2DREs","Q6Lixiqv4k","KASQ8Vprf2","XflUquZPqg","DcpWBX6Pin","CxVEfaL6AJ",
+"pFrrlqUJMd","29QAzlm0pD","yvOMIVprf2","jeskSSjskQ","ZuDtDCfgr3","zQt6QlCMxy","AOgEeGv3Fq","iqv4ktlILt","wDajXVerEA","In3NS55rfB",
+"uAWyp6q6L9","OUYuFQ6Lix","ksJbyJXljW","gIYvE5nmWv","bgJAzQbxXc","G1RhSAOgEe","Waim6VjCZq","GrDg7IjTwP","FxX9q24ARF","he9IATXQ0Z",
+"ydG8U7fsYM","Mm8sid7vjM","JkzUnLbRTH","WDVWJWDVWJ","xciqps4786","QClRLcmXIX","14FLRuPX7G","fcwDaFNYIM","iqv4kX6Pin","euZA55Namm",
+"VLTy6MojnP","wiHrZgf8rI","aez9yhUTw7","U3yw5NcICA","GrDg7o8Uyd","YOfrY8xEKz","FVMxopvgjS","pT8wu2DREs","hE1QlOHaBz","9XyT90h1b1",
+"Cp3mZjfREu","v1HlnpAhR1","0KyfsiB08l","jiVBPMaJQs","lweGy9eoRc","WmadA2Nslm","QssNCtlILt","dpe1vK4GS8","jiVBPd7vjM","YjB9tzz4ZU",
+"jzUqRjtn0X","Fhtgliqv4k","2ZHdkLbRTH","AmdQdyluBx","5Nammo8Uyd","QworukB5nP","2NslmRsQUq","KZamHFjHXR","X6Piniqv4k","GXdoHM3zXL",
+"Oz8yZP6bcg","UlU3Maez9y","iwzGkPYBf4","soy9thi5X7","EdBKcjiVBP","d7vjMWPmlx","CxVEf8xEKz","qaofN29QAz","DG4sTogLgc","lj07QiB08l",
+"OUqFMEoToP","55rfBU3yw5","2hEEUgf8rI","OxWIHlkMUA","lXFOBFPfSE","FwEJzFjHXR","lViBvbrhlQ","TXQ0Zx3LDe","JKWYRMGlTF","RsQUqyofH3",
+"gjUTuW3VFH","8RCUACqqaD","LDk6foGu6x","FjHXRd85a9","29QAzAOgEe","yvOMILDk6f","Ta8f6ThjNn","LewvMjfREu","5ZaEzDLhzM","yluBx0PktI",
+"uZPqgwDajX","AXpwERzaZA","ZhwG1KsjRK","d7vjMFwEJz","9XyT9MK07Y","dpe1vciuWz","9eoRcOUYuF","NAFuwiwzGk","yofH3nlaBy","jiVBPix74r",
+"F6PT2aDGtS","suY4xuoStw","YOfrYMK07Y","v8yFNoGu6x","Ss0Zu16lHc","prNT6iwzGk","QbxXcD6rBy","FVMxox3LDe","Mkgy8LewvM","7fsYMyToGW",
+"RACujguMb8","4dEz6Rxrsm","n8pJ9POUYS","pmeCdS77LH","dQ586gf8rI","JRJQB8RCUA","FFDuiGSQwj","Ul4a1s93Ml","Kr8ysv2eC3","JIqXi9XyT9",
+"9eoRcfqypy","MK07YReKEW","CdyBV8TxD7","BCxeC7lUXZ","kZANmRxrsm","JJs5mRpBQm","oGu6xC2Irc","s93MlJ2mQi","ZJTXHnnP8o","Q6LixWmadA",
+"JJs5moGu6x","StlDJzz4ZU","zbIYYpAhR1","2Yz7ED6rBy","4QMc9nFqik","uAWypjfREu","hE1Ql48cHL","4QMc90Kyfs","cShY22DREs","3otm6L7cGc",
+"16lHctjQxs","0Wr5yzmLYD","dpe1viwzGk","VjCZqmX2GE","OHaBzHfyNQ","euZA5prNT6","JIqXi5iGN5","ogLgcM3zXL","0BmCy4dEz6","euZA5BFkb8",
+"Nxx9VlweGy","fcwDaguMb8","n8pJ9nnP8o","OxWIHKr8ys","SbRYyaFFss","dhSuHlViBv","dQ5861LB1L","zY1GYStlDJ","6AFT0NAFuw","pv0i7xReec",
+"n1pmOhe9IA","ni2v148cHL","bZLvSuupzk","RzaZAOUYuF","pvgjSQ6Lix","29QAzxReec","t59lR9y4lw","pvgjSjiVBP","xReecdhSuH","ZhwG1xciqp",
+"guMb8s7Mxk","HzZT814FLR","xReecs93Ml","lj07Q16lHc","jS1ajGv3Fq","pFrrlHlUbF","Rxrsmlm0pD","bZLvS4W0Tl","VLTy6guMb8","uJScXRmDcr",
+"oQ87rMm8si","QClRLZzJHW","EOE1oS2Dfu","TCgPppT8wu","Gv3FqOz8yZ","fFDrJs4786","prNT65ZaEz","WPmlxtlILt","uLtKsZ4I1v","QClRLCK5W7",
+"bZLvS16lHc","vkCHHuJScX","fLNg8DLhzM","G1RhSlXFOB","0Kyfs0ao3l","8FmFHF6PT2","lXFOBD6rBy","zQt6QsuY4x","zHF1q9eoRc","WreyPd85a9",
+"cmXIXWDVWJ","iwzGkBCxeC","0KyfsX6Pin","618DiYw2oU","U3yw5IBe8k","LDk6fpvgjS","Kr8ysrz7Ut","7hyVviKqhr","WreyPZhwG1","9GXkXWPmlx",
+"5Drn0PYBf4","dQ586HP433","KZamH4dEz6","WmadAQ6Lix","ThjNnYf2Ec","tAOsrvOqCE","CK5W78RCUA","ulk41ogLgc","F6PT2gf8rI","zqH0WHzZT8",
+"ulk41brhlQ","WmadAsuY4x","55rfBRkQke","Waim6zY1GY","uJScXguMb8","dpe1vwiHrZ","0Kyfs0Wr5y","Z4I1vdpe1v","dpe1vCK5W7","jtn0Xd7vjM",
+"qaofNQworu","Uvlv445cIH","BGaQYaDGtS","Zv7z0xXTI4","Mm8sihUTw7","W7cTsaez9y","5iGN5nnP8o","RkQkeL7cGc","WPmlxpv0i7","h1zcHFNYIM",
+"SWfouRzaZA","AmdQdM6qcG","VjCZqXflUq","zQt6QYjB9t","0PktIi3pyd","qUJMd0Kyfs","k85AeKZamH","oQ87rSmGzv","5nmWvoQ87r","ThjNnYh1hF",
+"K20wKpT8wu","tl72WZzJHW","he9IARmDcr","9rlg9e6e4z","7Ow5C16lHc","0MR5XlCMxy","FxX9qyluBx","rz7Ut618Di","XyPZNcQOnv","O3iyQm4bxU",
+"P6bcgokgRi","vkCHHSWfou","XflUqHP433","5NammTXQ0Z","dpe1vcShY2","nnP8opT8wu","2ZHdkDLhzM","0ao3lvLsmS","J2mQitlILt","Q6hMCNo0Qb",
+"gIYvE64s8N","hUTw7AXpwE","5VZjSGrDg7","Z4I1vSjskQ","BpYhVnnP8o","TwanoZzJHW","5IhmGECMvU","fqypyRACuj","d7vjMVjCZq","y94nwXflUq",
+"4QMc9Vprf2","W7cTsThjNn","0Wr5yjS1aj","I7p2aiqv4k","vLsmSfLNg8","XflUqzbIYY","Z4I1vS2Dfu","8U2nUEOE1o","VIlwPatef2","0BmCyFnPFB",
+"kB5nPh1zcH","ZhwG1okgRi","BFkb8Ss0Zu","ydG8UzY1GY","0YAGHcShY2","lViBv1j5L8","pvgjS9eoRc","qQxHPMGlTF","SmGzvblLA9","WaWsvyofH3",
+"FxX9qFPfSE","pAhR17lUXZ","LbRTH24ARF","29QAzeuZA5","48cHLdQ586","FnPFB48cHL","29QAzY1mC0","PYBf4iKqhr","tuDySpv0i7","FhtglFNYIM",
+"cmXIXD6rBy","yofH3HP433","FnPFBMK07Y","W3VFHCxVEf","Mm8siFnPFB","JIqXijtn0X","QssNCaDGtS","5Mg9r0Wr5y","X6PinOUYuF","jfREuqaofN",
+"soy9tpWiOs","AmdQdiqv4k","KASQ8lm0pD","6AFT0oQ87r","lCMxyBpYhV","0YAGHCqqaD","CK5W7kZANm","kB5nPZJTXH","S77LHFhtgl","qUJMdBbwgA",
+"7Ow5C2Yz7E","pAhR16q6L9","No0Qb5IhmG","azIWpyToGW","DQimpFjHXR","Kr8ysW7cTs","MojnPbrhlQ","k85AepmeCd","fcJOyGWqqX","BbwgAi7WMQ",
+"zHF1qG1RhS","RBhp0GXdoH","Mm8siUl4a1","o8UydM6qcG","brhlQa00b5","pWiOszQt6Q","5NammrKDLJ","uJScXHfyNQ","ReKEW618Di","OxWIHzQt6Q",
+"kB5nP7hyVv","QClRLXyPZN","B3qemOz8yZ","rz7UtPb1pa","8hJdtSWfou","DQimpnnP8o","bgJAzFwEJz","he9IAK20wK","rhl0JMaJQs","45cIHYOfrY",
+"AXpwEuvf7A","0h1b15ZaEz","xReeczY1GY","KZamHxXTI4","piJSkKsjRK","HzZT8dpe1v","Yh1hFfqypy","nnP8oiKqhr","oGu6xK20wK","K4GS8BpYhV",
+"QssNChE1Ql","vkCHHwDajX","k85AeFGzgp","1LB1La00b5","faHirhSSvQ","FcWrWFLsph","W7cTsh1zcH","v2eC3lkMUA","l83UdlweGy","JkzUnt98iW",
+"pmeCdFwEJz","RkQkenlaBy","hYBCKChuy3","ZhwG15Namm","zHF1qgf8rI","Ss0ZujfREu","ZzJHWMezSW","n8pJ9ECMvU","F6PT2i3pyd","EoToPWPmlx",
+"gjUTu0ao3l","WmadAGv3Fq","rhl0Js93Ml","s4786uZPqg","48cHLGWqqX","VjCZq29QAz","2Yz7Efqypy","yvOMIt59lR","Q6hMCJXljW","7lUXZfcwDa",
+"VLTy60h1b1","XflUqCxVEf","No0Qb8FmFH","jiVBPogLgc","FVMxoIRh48","HRxd8Yw2oU","kB5nPbrhlQ","HRxd88cVD3","FPfSE7lUXZ","WreyPqUJMd",
+"vLsmSqQxHP","gIYvEdhSuH","S2DfuAXpwE","LbRTHCfgr3","JIqXiCqqaD","45cIHLewvM","iqv4kOUqFM","Ss0ZuM3zXL","0KyfsYOfrY","jiVBPUmaEv",
+"piJSkprNT6","blLA9M3zXL","cL0aEa00b5","BpYhVt98iW","2Yz7EVprf2","W7cTsW7cTs","2DREs9iGoT","IBe8kpv0i7","v2eC3n1pmO","W3VFHpAhR1",
+"piJSkuupzk","aFFssjzUqR","9y4lwReKEW","bZLvS3weIF","HlUbFBFkb8","No0Qb9iGoT","bgJAzCdyBV","zqH0W1v5hH","jiVBPSbRYy","1LB1LPb1pa",
+"AOgEe48cHL","aDGtS2TRI7","yEfy9Rxrsm","fmIK1FcWrW","HlUbFl83Ud","Kr8ys5ZaEz","pT8wuyToGW","uvf7AqQxHP","tuDySfmIK1","5nmWvMm8si",
+"jfREusoy9t","atef2lCMxy","AIYUuRsQUq","pvgjSMmsIo","rKDLJxXTI4","ZUnqt5iGN5","2DREsOUqFM","VjCZqFhtgl","kZANmJRJQB","mX2GElViBv",
+"lm0pDRACuj","okgRi64s8N","FnPFBtjQxs","O3iyQ7lUXZ","7fKYUgjUTu","v2eC3HP433","Cfgr3FPfSE","Fhtgl45cIH","Fhtglv2eC3","NOHszogLgc",
+"b29RJgtCA5","HzZT8jiVBP","tlILtKASQ8","zFgtBt59lR","HP433azIWp","yluBxgIYvE","1j5L8ydG8U","yToGWIjTwP","mz8gxQbxXc","RACujS2Dfu",
+"RzaZAGXdoH","5iGN5h1zcH","dmoS7WaWsv","9y4lwC2Irc","FcWrWVLTy6","FxX9quvf7A","yvOMIjtn0X","8xEKzazIWp","JRJQB0ao3l","cShY2RzaZA",
+"pT8wu1v5hH","8xEKz5iGN5","IKxdLrhl0J","LDk6fVprf2","VLTy6RkQke","0BmCy8hJdt","x3LDeKsjRK","MaJQs0MR5X","wDajXlm0pD","JKWYR0h1b1",
+"5Drn0a00b5","Mm8si8cVD3","BGaQYuN6r3","fFDrJ8U2nU","ZJTXHhYBCK","AXpwEazIWp","ydG8UuPX7G","guMb8iqv4k","dhSuHEoToP","tAOsrUlU3M",
+"KASQ8WmadA","pv0i7zqH0W","J2mQiEOE1o","ZzJHW5VZjS","jtn0XAIYUu","EoToPQ6Lix","cShY2U3yw5","CdyBVTCgPp","IKxdLk85Ae","Chuy3HfyNQ",
+"uZPqgJ2mQi","Zv7z00BmCy","XyPZNYh1hF","5ZaEzt98iW","LDk6fd7vjM","P6bcg5nmWv","9iGoTMm8si","16lHcCK5W7","TXQ0Zix74r","hSSvQQworu",
+"Oz8yZrz7Ut","ulk410h1b1","uAWypBCxeC","MGlTF45cIH","IKxdL9XyT9","FwEJzK20wK","dhSuHRkQke","zmLYDJRJQB","J2mQiHRxd8","IjTwP48cHL",
+"y94nwJJs5m","K4GS8Z4I1v","lpF6WU3yw5","G1RhSQ6Lix","tl72WEdBKc","lpF6WTa8f6","kB5nPFPfSE","UmaEvHzZT8","VerEA2DREs","7lUXZfqypy",
+"SbRYyuQIcz","S77LHlXFOB","v2eC3PYBf4","AkKTk8hJdt","t59lRQworu","0Wr5yXflUq","GSQwjdmoS7","TXQ0ZSmGzv","WPmlxWaim6","In3NS6q6L9",
+"MaJQsZzJHW","vLsmS07n1c","prNT6PYBf4","iKqhrDG4sT","Gv3Fq5Namm","7fKYUiKqhr","QbxXcX6Pin","FLsphMojnP","P6bcgKASQ8","9GXkX0MR5X",
+"Waim6azIWp","hi5X7s7Mxk","cShY2e6e4z","Vprf2EoToP","v8yFN0MR5X","EoToPMkgy8","7fKYUMm8si","oGu6xuPX7G","rKDLJnnP8o","ulk41GWqqX",
+"fcwDa2DREs","aL6AJzmLYD","SWfou64s8N","WaWsvdmoS7","QbxXcLbRTH","SWfouZuDtD","oQ87rEdBKc","2TRI7cShY2","k85Aerhl0J","4dEz6CdyBV",
+"IRh48v1Hln","VBjhzm4bxU","Yw2oUi7WMQ","cQOnv2hEEU","5drc6fcwDa","3weIF0BmCy","s7MxkYw2oU","CxVEfOxWIH","vkCHHFnPFB","euZA564s8N",
+"QssNCTwano","uPX7GD6rBy","QYxC014FLR","07n1cRkQke","zz4ZUnlaBy","Gv3Fq5drc6","wDajXOz8yZ","J2mQiGWqqX","tuDySWreyP","QChxsuoStw",
+"l83Ud5ZaEz","BCxeCLDk6f","zz4ZUblLA9","S77LHYw2oU","7hyVvPYBf4","l83Ud14FLR","No0QbhSSvQ","jzUqRQ6Lix","9iGoTSmGzv","pWiOshUTw7",
+"WaWsvyvOMI","L7cGcLewvM","ZzJHWTa8f6","GWqqXAOgEe","yEfy9hE1Ql","pmeCdcShY2","14FLRhe9IA","YOfrYMaJQs","iKqhrs93Ml","hYBCKWDVWJ",
+"Nxx9VdhSuH","sqVrfs7Mxk","HfyNQ4dEz6","24ARFksJby","Uvlv4FcWrW","FNYIM0YAGH","bZLvSciuWz","zqH0W4W0Tl","n8pJ9ZUnqt","I7p2ay94nw",
+"AmdQd0Wr5y","RACujzz4ZU","d7vjMe6e4z","7Ow5C1LB1L","hi5X7pFrrl","LDk6fF6PT2","bgJAztvdkD","zQt6QChuy3","yEfy9yEfy9","hSSvQ8U2nU",
+"vLsmSru4UG","nnP8ogjUTu","NcICAVerEA","G1RhSP6bcg","uLtKsnlaBy","NOHszvkCHH","64s8NgjUTu","RpBQmAgJHQ","3weIFxXTI4","8U2nUFFDui",
+"7fKYURxrsm","aL6AJ55rfB","7Ow5CQbxXc","ru4UGOUqFM","2Yz7EuTacx","3weIFQYxC0","KsjRK2Nslm","K4GS8tl72W","5VZjSyToGW","Mkgy8HfyNQ",
+"RBhp0ni2v1","YOfrY7hyVv","YOfrYVIlwP","5VZjSQWxoT","FGzgpyluBx","9iGoTJKWYR","piJSk0Wr5y","zz4ZUdQ586","7fsYMru4UG","7fsYM4QMc9",
+"5IhmGlH1kt","ydG8Udpe1v","iqv4ksx5Gl","Cp3mZzY1GY","NOHszECMvU","oGu6xxReec","cShY2lpF6W","0KyfsoGu6x","55rfBAIYUu","lweGyZ4I1v",
+"StlDJ0PktI","cL0aEGWqqX","sqVrfydG8U","jeskSiqv4k","tjQxsMm8si","lH1kti7WMQ","hUTw7XyPZN","AXpwERpBQm","VNCPduTacx","n1pmOyToGW",
+"1LB1LMGlTF","fmIK1suY4x","VerEAJRJQB","taOXKCK5W7","ZuDtDni2v1","16lHcQWxoT","dmoS79eoRc","FcWrWNAFuw","5iGN5tlILt","FcWrWix74r",
+"FNYIMcShY2","QbxXcEOE1o","zHF1qQClRL","lCMxy5Namm","SbRYy7X3uy","vkCHHFhtgl","Cfgr3F6PT2","ni2v13weIF","t59lR618Di","48cHLlXFOB",
+"14FLRFLsph","VerEAThjNn","aDGtSQnJ1S","blLA9xXTI4","uQIcztl72W","t59lR0MR5X","o8UydgjUTu","jzUqRBpYhV","mz8gxtl72W","JKWYRt59lR",
+"a00b5cShY2","MmKGJfcwDa","B3qemJKWYR","P6bcgDLhzM","MK07YtAOsr","I7p2alweGy","Yh1hFG1RhS","XflUqY1mC0","24ARFS2Dfu","kB5nPgIYvE",
+"s7MxkD6rBy","QssNCRACuj","AgJHQTCgPp","MaJQsZv7z0","LDk6f8TxD7","tuDySQ6Lix","D6rByJKWYR","jSjS3FLsph","Vprf2v8yFN","iwzGkGv3Fq",
+"K4GS8guMb8","ZJTXHMojnP","JJs5mhE1Ql","VjCZqbrhlQ","MmsIon8pJ9","5nmWvvOqCE","JKWYR5Drn0","F6PT2MmsIo","uupzk7hyVv","RxrsmCdyBV",
+"B3qemx3LDe","OUqFMtl72W","NAFuwMezSW","v2eC3Waim6","tl72WlXFOB","RkQkeksJby","pv0i7aL6AJ","hSSvQzqH0W","zHF1q48cHL","MezSWFVMxo",
+"lpF6WSbRYy","MGlTFHfyNQ","FwEJztvdkD","bZLvSWaWsv","9XyT9QssNC","guMb8i7WMQ","VBjhz2TRI7","lkMUAmz8gx","3otm66AFT0","Vprf2aL6AJ",
+"K20wKyluBx","9XyT9CK5W7","GWqqXQYxC0","7fsYMzFgtB","tjQxsQworu","ksJbyL7cGc","pWiOsReKEW","U3yw5lsQGo","IKxdLzHF1q","QworuhYBCK",
+"wDajXCxVEf","RpBQmJJs5m","BCxeCulk41","hSSvQNcICA","7hyVvSbRYy","zz4ZUFNYIM","0PktIMkgy8","dhSuHL7cGc","No0QbcL0aE","M3zXLfaHir",
+"K4GS8KASQ8","xciqpYf2Ec","yluBxlm0pD","0PktIzbIYY","iB08ldQ586","v1HlnCNHmv","5iGN57fKYU","zFgtBazIWp","HzZT8DcpWB","s7MxkkZANm",
+"45cIHECMvU","bZLvSl83Ud","blLA9G1RhS","n1pmOlpF6W","JIqXiYjB9t","9eoRc48cHL","tjQxshSSvQ","bgJAzSjskQ","prNT6gf8rI","aez9yMGlTF",
+"2TRI7Mkgy8","IRh48VIlwP","QbxXco8Uyd","WreyPFLsph","mz8gx9iGoT","0ao3lGXdoH","m4bxUAkKTk","FFDuivOqCE","M3zXLM3zXL","pmeCdL7cGc",
+"0YAGHlCMxy","cmXIX5Namm","W7cTsOHaBz","XflUqWmadA","ThjNn4dEz6","BCxeCCxVEf","Yh1hF0h1b1","TwanowDajX","U3yw5Q6hMC","SmGzv8RCUA",
+"HzZT8prNT6","Nxx9V2ZHdk","EoToPazIWp","CqqaDDz1R3","VNCPdpWiOs","JJs5mReKEW","lH1ktCdyBV","P6bcgS2Dfu","Yf2EcbgJAz","FFDuiVjCZq",
+"sqVrftl72W","euZA5K20wK","O3iyQLDk6f","FFDuizFgtB","pFrrljSjS3","FxX9qFjHXR","DQimpWaim6","zQt6Qtl72W","L7cGcy94nw","v2eC3x3LDe",
+"jzUqR8TxD7","MaJQsMm8si","lsQGoqaofN","Z4I1vHRxd8","RxrsmEoToP","FcWrWFjHXR","aDGtSAmdQd","FLsphuJScX","JIqXiVNCPd","QClRLZJTXH",
+"J2mQiIn3NS","AOgEebZLvS","Yw2oUFwEJz","Kr8ysjiVBP","U3yw5HlUbF","GXdoHMK07Y","jtn0XVIlwP","FxX9qJKWYR","W3VFHatef2","hYBCKUmaEv",
+"o8UydqUJMd","euZA5OHaBz","prNT6X6Pin","hSSvQ7fsYM","uN6r38RCUA","Q6LixYf2Ec","M6qcGYh1hF","HRxd8qUJMd","55rfBYOfrY","MezSWCxVEf",
+"29QAzt59lR","qUJMd4QMc9","OHaBzVerEA","cL0aEDQimp","jSjS39XyT9","QClRLvLsmS","0MR5X55rfB","3weIF618Di","YOfrYbZLvS","m4bxUVIlwP",
+"VjCZqnnP8o","1LB1LWMiS3","iwzGknnP8o","uTacxChuy3","zz4ZURzaZA","MGlTFIKxdL","taOXKpT8wu","Cfgr3guMb8","EdBKcRxrsm","5drc6yToGW",
+"0ao3lzbIYY","BpYhVEOE1o","uAWypSWfou","gjUTu580YD","hE1QlOxWIH","0ao3l3weIF","XflUq7fKYU","v1HlnIRh48","ogLgcY1mC0","Pb1pae6e4z",
+"QClRLOUqFM","MojnPyofH3","pv0i7mX2GE","uQIczaDGtS","o8UydYw2oU","ReKEWuPX7G","8TxD7HP433","NhXduuQIcz","24ARFkB5nP","Oz8yZjfREu",
+"WmadA7hyVv","Yh1hF7Ow5C","64s8NHfyNQ","B3qem48cHL","AXpwEgIYvE","JkzUnblLA9","hE1Qllj07Q","pFrrloVQp6","hSSvQzbIYY","SmGzvjeskS",
+"lpF6WWaWsv","gIYvEo8Uyd","pv0i7uLtKs","4QMc9DcpWB","v2eC38TxD7","0KyfsXflUq","lm0pDlH1kt","v8yFNdQ586","9GXkXKASQ8","pAhR1UlU3M",
+"0KyfsdhSuH","2DREsiwzGk","UmaEvGv3Fq","DLhzMlkMUA","xReecjiVBP","JXljWWDVWJ","HP433h1zcH","kB5nPpiJSk","MmKGJ9y4lw","CNHmvM3zXL",
+"xciqp9eoRc","FFDui3weIF","5Mg9rM6qcG","Pb1paS2Dfu","W7cTsUvlv4","yofH3FPfSE","GXdoH8RCUA","5iGN5jtn0X","uQIczhi5X7","580YDm4bxU",
+"VIlwPix74r","rKDLJqaofN","9GXkXydG8U","xciqpbZLvS","BGaQYRmDcr","Ss0ZujSjS3","zHF1q07n1c","MezSWa00b5","jeskSv2eC3","RsQUqbrhlQ",
+"QYxC0QYxC0","JXljWUmaEv","Mm8siMojnP","fLNg8Chuy3","M6qcG6AFT0","FhtglDcpWB","kZANmZzJHW","hUTw7oQ87r","AIYUuni2v1","RBhp0lkMUA",
+"HP4338TxD7","zQt6QzHF1q","DG4sTThjNn","NAFuwQworu","OHaBzAkKTk","WreyPxReec","s93MlgdQsS","ix74r16lHc","faHir3weIF","d7vjMUmaEv",
+"v2eC3CK5W7","IRh481j5L8","d7vjMuZPqg","FjHXRZJTXH","8hJdtv2eC3","ciuWzTXQ0Z","hSSvQoVQp6","ni2v1rKDLJ","Mm8siWPmlx","SbRYyjtn0X",
+"DG4sTDG4sT","DcpWBqaofN","ZUnqtyToGW","cmXIXnFqik","MK07YYw2oU","jzUqRvLsmS","vOqCEhUTw7","Kr8ysKASQ8","ydG8Ufqypy","Uvlv4X6Pin",
+"yEfy9gf8rI","6AFT0brhlQ","MaJQsTXQ0Z","5ZaEzs93Ml","YOfrYs4786","ksJbyPOUYS","uQIczSWfou","RsQUq5Mg9r","VLTy6AgJHQ","7fKYU5ZaEz",
+"kB5nPJJs5m","fLNg8POUYS","5nmWvuPX7G","0h1b1FLsph","Yf2Ec7Ow5C","xciqp24ARF","RBhp0RkQke","HP433wiHrZ","0Wr5yokgRi","RsQUqCIShG",
+"C2IrcVBjhz","8cVD3i7WMQ","WMiS3v2eC3","GXdoHGv3Fq","48cHLm4bxU","n1pmO0Kyfs","qUJMdYjB9t","fcwDaXyPZN","y94nwS77LH","4QMc9iB08l",
+"S2Dfut59lR","l83UdJIqXi","ciuWzn8pJ9","nFqikzHF1q","ZJTXHkB5nP","aez9yWPmlx","Nxx9VKASQ8","HfyNQLewvM","sx5GlAkKTk","nlaByI7p2a",
+"k85AexReec","AkKTk8xEKz","0Wr5yQ6Lix","b29RJ3otm6","WaWsvcQOnv","MaJQsqQxHP","0MR5XQbxXc","2ZHdki3pyd","ogLgcEdBKc","580YDOxWIH",
+"ECMvUSjskQ","WmadAcQOnv","ZuDtDUvlv4","MmKGJWaim6","Cp3mZ5nmWv","vLsmSfmIK1","Uvlv414FLR","VerEABpYhV","pWiOsRsQUq","t98iWIRh48",
+"S77LHRzaZA","QYxC0DQimp","Kr8ys7lUXZ","7fsYM0PktI","Oz8yZZv7z0","16lHcDz1R3","HzZT8NOHsz","07n1che9IA","2DREspWiOs","Z4I1v2DREs",
+"uAWyp9eoRc","Chuy3taOXK","4W0TlKsjRK","LewvM4dEz6","lm0pDlCMxy","Chuy3MK07Y","soy9tDG4sT","b29RJI7p2a","QClRLSs0Zu","JXljWYh1hF",
+"FPfSEyluBx","RzaZAtuDyS","v1Hln9XyT9","07n1c5iGN5","Cp3mZBbwgA","he9IAFhtgl","UlU3Mdpe1v","HP433FnPFB","64s8NDQimp","qQxHPF6PT2",
+"RxrsmGXdoH","M3zXL5IhmG","45cIHCNHmv","NOHszZhwG1","K20wKru4UG","azIWpy94nw","zbIYYM6qcG","2NslmO3iyQ","aez9yx3LDe","SmGzvK4GS8",
+"AIYUuOUqFM","IKxdLK4GS8","bZLvSxciqp","uLtKsfcwDa","W7cTsiKqhr","14FLRZhwG1","mX2GEs4786","pFrrldjsrv","MmsIojtn0X","VLTy6pFrrl",
+"QssNCAIYUu","uvf7AVIlwP","QYxC0m4bxU","UlU3Mru4UG","NOHszix74r","jS1ajZuDtD","pT8wuTwano","lpF6WnFqik","iKqhrfqypy","ZUnqtBCxeC",
+"nnP8oa00b5","HlUbFoQ87r","BpYhVsuY4x","P6bcgMGlTF","aDGtStaOXK","Zv7z08cVD3","ogLgc3otm6","9eoRcvkCHH","2DREsZv7z0","zY1GYHP433",
+"gdQsSuLtKs","QbxXcJXljW","uupzkFnPFB","2ZHdk5Drn0","SmGzvx3LDe","vLsmSeuZA5","Yf2Ec6AFT0","Uvlv4OHaBz","HfyNQRkQke","Ta8f6tuDyS",
+"X6PinECMvU","Cfgr3vLsmS","9eoRcOxWIH","oVQp6VIlwP","VjCZqEOE1o","IjTwP618Di","iwzGkyEfy9","vkCHH580YD","KASQ8ZJTXH","ulk41ru4UG",
+"SbRYy9XyT9","d7vjMYOfrY","RmDcrBCxeC","HP433dQ586","EOE1oQ6hMC","fqypyqUJMd","n8pJ9QYxC0","guMb8pvgjS","mX2GEa00b5","jzUqRTwano",
+"FhtgliB08l","Z4I1vCp3mZ","aL6AJaDGtS","W3VFH9iGoT","oGu6xni2v1","NcICADz1R3","8xEKzuPX7G","FjHXRYjB9t","I7p2aFNYIM","FxX9qqQxHP",
+"Cp3mZGXdoH","gf8rIzQt6Q","Pb1paCIShG","jS1ajpT8wu","aL6AJ5VZjS","Ul4a1tvdkD","mX2GEcShY2","t98iWdjsrv","OHaBzuupzk","yvOMIru4UG",
+"M6qcG0BmCy","zHF1qRkQke","dhSuH5drc6","i7WMQRzaZA","taOXK1LB1L","K20wKYOfrY","S2DfuSmGzv","Uvlv4zbIYY","iB08lCp3mZ","GrDg7pAhR1",
+"Ul4a1oVQp6","taOXKZv7z0","XflUqWaim6","FnPFBgf8rI","GSQwj1v5hH","FGzgpdhSuH","QClRLFGzgp","QYxC0n8pJ9","suY4xRBhp0","16lHcStlDJ",
+"RsQUqC2Irc","he9IAy94nw","zHF1q8xEKz","4W0TlUmaEv","EoToPTCgPp","Kr8ys0ao3l","2ZHdkYw2oU","FnPFBtaOXK","fFDrJguMb8","45cIHBGaQY",
+"iB08l0Wr5y","vLsmSBpYhV","EdBKcgIYvE","RxrsmC2Irc","Chuy355rfB","nnP8opWiOs","pWiOsW3VFH","CIShGRmDcr","S77LHzFgtB","v2eC355rfB",
+"Kr8ysYjB9t","FjHXR9iGoT","v2eC3EdBKc","gtCA57ku1p","uAWypn8pJ9","P6bcgMm8si","wiHrZM6qcG","AXpwEiKqhr","jfREuGrDg7","gf8rINOHsz",
+"M3zXLQChxs","7fsYMpFrrl","qQxHPKASQ8","RzaZA0Kyfs","Nxx9VHzZT8","9iGoTZ4I1v","1v5hHZhwG1","VjCZqjSjS3","8cVD3gjUTu","EdBKcM6qcG",
+"Nxx9VfmIK1","4dEz6JXljW","7X3uyatef2","uTacxJ2mQi","uPX7GS2Dfu","QWxoTazIWp","Kr8ysCp3mZ","ZzJHW1LB1L","Cfgr3NAFuw","LewvM24ARF",
+"MmKGJVIlwP","0Wr5yzbIYY","lweGy8cVD3","euZA5Uvlv4","8hJdtRmDcr","KZamHs4786","IKxdLjeskS","sx5Gl2Yz7E","k85Aet59lR","Cfgr3HfyNQ",
+"FFDuifaHir","mX2GEVLTy6","CK5W7POUYS","2hEEUcQOnv","QnJ1Sm4bxU","BGaQYWDVWJ","5IhmGAOgEe","5nmWvoVQp6","xReectuDyS","5VZjSuQIcz",
+"JKWYR8hJdt","5Drn0HRxd8","yofH3Ss0Zu","I7p2aHzZT8","9iGoTMmsIo","lweGyjeskS","hE1QlECMvU","3weIFdmoS7","lj07QgIYvE","48cHLlpF6W",
+"x3LDeCK5W7","W7cTso8Uyd","MmsIoQworu","K4GS82TRI7","RzaZAix74r","zHF1qpmeCd","VLTy6WPmlx","VerEAfcJOy","ReKEWNcICA","8FmFH8FmFH",
+"LbRTHQChxs","gIYvEPb1pa","8xEKzFxX9q","Yw2oUn1pmO","IRh48nFqik","CK5W7C2Irc","FFDuiIn3NS","5ZaEzL7cGc","HlUbFTwano","WmadAkB5nP",
+"POUYStlILt","W3VFHdmoS7","bZLvSNhXdu","5Drn0ni2v1","uQIczWDVWJ","Zv7z0CdyBV","Mm8siv8yFN","CxVEfCNHmv","hi5X70h1b1","MaJQsK4GS8",
+"t98iWtjQxs","cShY2Rxrsm","ciuWzNAFuw","WDVWJWaWsv","pWiOsQWxoT","taOXKSjskQ","tuDySEdBKc","SjskQMm8si","Zv7z024ARF","yEfy9rhl0J",
+"FVMxoFGzgp","GrDg7fFDrJ","gIYvEy94nw","RACuj29QAz","hUTw70ao3l","Uvlv4jiVBP","t98iW9XyT9","JKWYRlweGy","uoStwrhl0J","jzUqRxReec",
+"QYxC024ARF","HP433n1pmO","BFkb8LewvM","d85a9pvgjS","9iGoTkB5nP","618DiSbRYy","zbIYYdQ586","i3pydk85Ae","S77LHWaWsv","h1zcHwiHrZ",
+"8hJdtGSQwj","brhlQJ2mQi","gjUTu5IhmG","6AFT0EdBKc","0ao3l7fKYU","OUYuFfcJOy","LewvMaL6AJ","iwzGkuPX7G","lkMUAiqv4k","MGlTFzY1GY",
+"8RCUA5iGN5","AIYUuHP433","0Wr5yuZPqg","piJSkCdyBV","FhtglxXTI4","JXljWyluBx","AgJHQNcICA","ogLgc29QAz","y94nwfLNg8","DG4sTuTacx",
+"Pb1pauvf7A","MmsIopAhR1","ru4UGulk41","Ul4a1zbIYY","1v5hHa00b5","RsQUqhYBCK","dQ586GSQwj","WPmlxVprf2","JkzUnDLhzM","IBe8ktjQxs",
+"zbIYYhe9IA","LbRTHv1Hln","tvdkDtl72W","yToGWHzZT8","5nmWvQworu","ulk41uQIcz","gtCA58FmFH","kZANmNcICA","v1Hlnulk41","4W0TlWDVWJ",
+"2Yz7EMkgy8","SjskQBGaQY","9y4lwVBjhz","tAOsrOz8yZ","jSjS35IhmG","tl72WRmDcr","AXpwEAmdQd","FjHXRmX2GE","KZamHtAOsr","xXTI4i3pyd",
+"lViBvt59lR","GXdoHuLtKs","HlUbF0MR5X","lweGyuoStw","P6bcgZv7z0","7Ow5CTCgPp","IKxdLnlaBy","QssNCaFFss","64s8N9eoRc","fcwDak85Ae",
+"Ta8f6D6rBy","5IhmGhUTw7","EdBKcaL6AJ","HfyNQGXdoH","KASQ824ARF","azIWp16lHc","8U2nUaFFss","Ul4a1KZamH","JJs5miqv4k","FFDuiK4GS8",
+"CNHmvjfREu","RxrsmQ6hMC","VIlwPsqVrf","CNHmvfFDrJ","WDVWJlm0pD","M6qcG64s8N","W3VFHWaWsv","qUJMde6e4z","EdBKc0Kyfs","Ss0Zul83Ud",
+"yToGWNcICA","jSjS348cHL","QnJ1SyofH3","UlU3M580YD","fFDrJ2TRI7","M3zXLqQxHP","0Wr5yHP433","uJScXyEfy9","djsrvyofH3","ciuWzuoStw",
+"kZANm0Kyfs","FVMxoqaofN","64s8Nsoy9t","n1pmOuvf7A","hUTw7K4GS8","dpe1v9rlg9","LewvM7ku1p","16lHcTXQ0Z","nnP8onnP8o","14FLRaFFss",
+"JKWYRNxx9V","FPfSEK4GS8","5IhmGKASQ8","Vprf2n1pmO","sqVrftAOsr","Yf2EcLbRTH","zbIYYNxx9V","5IhmGuvf7A","FNYIMJRJQB","WmadAJJs5m",
+"dhSuHQ6hMC","0ao3lqaofN","6q6L9tuDyS","RpBQmtjQxs","pWiOs7X3uy","FGzgp5nmWv","5Drn0GXdoH","wDajXJkzUn","2Yz7E14FLR","piJSkM3zXL",
+"lweGyTa8f6","pT8wuPYBf4","lj07Q7fKYU","TXQ0ZWaim6","EdBKcRsQUq","y94nwksJby","Cp3mZDQimp","Mkgy8hUTw7","S2DfuFNYIM","cShY2ReKEW",
+"jzUqRSmGzv","QClRLiKqhr","MmKGJCp3mZ","MmKGJ0MR5X","M3zXLXyPZN","UmaEvB3qem","Y1mC0o8Uyd","Gv3FqF6PT2","BpYhVMaJQs","9iGoTtvdkD",
+"jiVBPzY1GY","FwEJzFNYIM","ulk418xEKz","M3zXLPYBf4","QbxXc5iGN5","pvgjS0MR5X","AIYUuYw2oU","6q6L9uQIcz","guMb8IBe8k","HRxd8zQt6Q",
+"4W0TlOHaBz","fcwDa7lUXZ","UlU3M29QAz","pvgjSyEfy9","HzZT8s4786","Dz1R35iGN5","14FLRZuDtD","UmaEvReKEW","SWfouVprf2","djsrvCdyBV",
+"OUqFMFFDui","SbRYySbRYy","SmGzvC2Irc","oVQp6AgJHQ","uoStwDLhzM","CqqaDv1Hln","AOgEeru4UG","lXFOBtAOsr","QYxC0Zv7z0","W3VFHvkCHH",
+"9eoRcBpYhV","i7WMQuN6r3","WmadAs93Ml","iKqhrt98iW","pT8wuSs0Zu","2NslmtvdkD","fmIK1xXTI4","hUTw70MR5X","NOHszuoStw","W3VFHPYBf4",
+"azIWpjfREu","nlaByVIlwP","MezSWFjHXR","QbxXc0YAGH","5ZaEzYjB9t","618Di55rfB","W7cTsjSjS3","7lUXZ7Ow5C","Waim6iwzGk","SjskQ64s8N",
+"ECMvUksJby","tjQxsxReec","Q6hMCbgJAz","OxWIH2ZHdk","G1RhSnnP8o","oQ87rzHF1q","TCgPpkB5nP","Q6hMC5Mg9r","jtn0X5Mg9r","uoStw5drc6",
+"NAFuwfFDrJ","e6e4z9GXkX","aL6AJNAFuw","8hJdtMmsIo","nlaByMezSW","v8yFNcL0aE","8xEKzcShY2","Y1mC0HRxd8","KsjRK0Kyfs","0MR5X2TRI7",
+"3otm62ZHdk","v2eC3L7cGc","jSjS3v8yFN","d7vjMBbwgA","BpYhVCfgr3","zmLYDRsQUq","jS1ajYOfrY","i7WMQvkCHH","VjCZquLtKs","RxrsmOUqFM",
+"uZPqguJScX","2DREsMm8si","0Kyfsjtn0X","NhXdupvgjS","UmaEvX6Pin","OUYuFIRh48","DLhzMSbRYy","7ku1pvOqCE","55rfBThjNn","ru4UGcQOnv",
+"CqqaDZhwG1","M6qcGgjUTu","faHirqaofN","pFrrlG1RhS","jiVBP4QMc9","tAOsrnFqik","uLtKs0h1b1","G1RhSdmoS7","M3zXLMezSW","ciuWz0h1b1",
+"7hyVvdjsrv","2Yz7EBFkb8","lH1ktyEfy9","fLNg8No0Qb","pWiOs7Ow5C","tAOsrDcpWB","hSSvQVerEA","AIYUuCp3mZ","W7cTsyluBx","dQ58629QAz",
+"FnPFBECMvU","K4GS8kZANm","b29RJnlaBy","kB5nPP6bcg","faHir7hyVv","m4bxUyEfy9","MmKGJK4GS8","tlILthUTw7","LewvMtuDyS","nFqikhYBCK",
+"LDk6fMm8si","qQxHPEOE1o","45cIHFFDui","In3NSfcJOy","fFDrJs93Ml","Q6Lix3weIF","y94nwzFgtB","POUYSVjCZq","8cVD34W0Tl","14FLRDLhzM",
+"zY1GYOUqFM","Z4I1vsx5Gl","iwzGk4dEz6","OUqFMHlUbF","d85a9BCxeC","JJs5mKr8ys","mX2GEfmIK1","uTacxGWqqX","pFrrl9XyT9","Ss0ZuAXpwE",
+"RBhp0gIYvE","n1pmOpWiOs","BGaQYSbRYy","JXljWnnP8o","uZPqgMm8si","uvf7AWDVWJ","lpF6WuLtKs","lweGyChuy3","lpF6W9iGoT","uupzkJIqXi",
+"ECMvUd7vjM","s93MlyofH3","WMiS3ThjNn","SmGzvdQ586","dQ586FjHXR","Cp3mZSmGzv","qQxHP9iGoT","sx5GlBpYhV","fcwDaprNT6","F6PT2AmdQd",
+"StlDJatef2","AmdQdJKWYR","FxX9qB3qem","0Wr5yuJScX","5Drn0Cfgr3","WmadAF6PT2","TXQ0Z9XyT9","GWqqXhE1Ql","QChxsAIYUu","2Yz7E9y4lw",
+"No0QbbrhlQ","EdBKc7lUXZ","AOgEekB5nP","BpYhV7lUXZ","8FmFHtjQxs","QClRLtaOXK","M6qcGSmGzv","m4bxUpT8wu","5Mg9riwzGk","MGlTF0MR5X",
+"1j5L8Yf2Ec","blLA9MezSW","ReKEWNOHsz","uLtKsuZPqg","FhtglJJs5m","MK07YUlU3M","t98iWFhtgl","a00b50BmCy","hYBCKReKEW","PYBf46AFT0",
+"jzUqRnlaBy","O3iyQpWiOs","s7MxklpF6W","brhlQlpF6W","mz8gx2hEEU","Pb1paDQimp","CNHmvMkgy8","Waim68xEKz","MK07YMkgy8","faHirsoy9t",
+"7X3uyB3qem","Z4I1vfqypy","7Ow5CtlILt","VerEAgf8rI","P6bcgStlDJ","Vprf2gf8rI","AmdQdyvOMI","B3qemSbRYy","suY4xWaWsv","JJs5mtaOXK",
+"soy9tFFDui","aL6AJKr8ys","0ao3lsx5Gl","CNHmvgtCA5","7fsYM8RCUA","Mm8siv2eC3","dQ586lm0pD","zFgtBjeskS","IKxdLulk41","4W0TlTXQ0Z",
+"sx5GlgjUTu","soy9t0ao3l","1LB1LM3zXL","QbxXcgIYvE","xciqp5nmWv","a00b5OUqFM","KASQ8zbIYY","uJScXNcICA","FGzgprz7Ut","bgJAzfcJOy",
+"24ARFCp3mZ","VLTy6Mm8si","hYBCKBCxeC","aez9yJJs5m","GrDg7LbRTH","9XyT9bgJAz","Waim6uvf7A","8hJdtQWxoT","dmoS7aez9y","5IhmG64s8N",
+"uvf7AhYBCK","fcwDaAmdQd","OHaBzhE1Ql","zqH0WHlUbF","soy9taez9y","8TxD7sqVrf","Y1mC02ZHdk","5IhmGPYBf4","sqVrfQssNC","jtn0XKr8ys",
+"guMb8QClRL","2hEEU45cIH","CxVEfh1zcH","n8pJ9EoToP","FcWrWBbwgA","Rxrsm4W0Tl","ni2v1FPfSE","QYxC0oGu6x","Y1mC0iB08l","G1RhSFPfSE",
+"gf8rIni2v1","NOHszDLhzM","uJScXaDGtS","YOfrY07n1c","mX2GEh1zcH","8FmFH5VZjS","b29RJFnPFB","G1RhS7X3uy","dQ586zHF1q","hi5X7l83Ud",
+"MK07YPOUYS","CdyBVIjTwP","Gv3FqyToGW","M3zXLblLA9","nnP8olXFOB","CqqaDNOHsz","5VZjSzbIYY","lweGyGv3Fq","yvOMI4dEz6","m4bxU1j5L8",
+"t98iWbgJAz","EoToPdmoS7","MaJQsdpe1v","cmXIXo8Uyd","azIWpBbwgA","RmDcrxReec","gdQsSi7WMQ","6AFT0s4786","YjB9twDajX","3otm6n1pmO",
+"Mkgy8jiVBP","fFDrJQbxXc","ThjNnHfyNQ","zFgtBJXljW","s93Ml45cIH","DG4sTguMb8","WPmlxiKqhr","Vprf216lHc","7lUXZfcJOy","2DREsQssNC",
+"cmXIX29QAz","Q6hMChUTw7","IBe8kXyPZN","QworulCMxy","HfyNQpWiOs","VIlwPIn3NS","Yf2EcVjCZq","nlaByW3VFH","0Wr5yAmdQd","WDVWJ0Kyfs",
+"lm0pDPYBf4","IBe8ksx5Gl","tuDySsuY4x","pAhR1Z4I1v","QbxXcBpYhV","zbIYYX6Pin","0YAGHMojnP","taOXKgtCA5","lsQGoQWxoT","UlU3MGWqqX",
+"HfyNQ1LB1L","XyPZNv1Hln","vOqCE07n1c","BpYhV9y4lw","7Ow5CgdQsS","QnJ1SzQt6Q","JXljWP6bcg","QChxsatef2","WDVWJG1RhS","y94nw7fsYM",
+"GrDg7e6e4z","Mm8siciuWz","bgJAzgjUTu","JIqXiQ6Lix","s4786ru4UG","yluBxvkCHH","FGzgpaez9y","s93MlZuDtD","29QAzaez9y","GrDg7uN6r3",
+"jiVBPQssNC","lj07QbrhlQ","yEfy9M6qcG","pAhR1CqqaD","QssNCM6qcG","Vprf22hEEU","ZhwG1qUJMd","FhtglO3iyQ","e6e4zuupzk","JkzUnVprf2",
+"rz7UthSSvQ","VLTy6KASQ8","UmaEv16lHc","9XyT9SmGzv","nnP8oFVMxo","Cp3mZVBjhz","FjHXR8hJdt","SmGzv7Ow5C","prNT6B3qem","VerEAVjCZq",
+"618Di7lUXZ","lpF6WWmadA","2NslmprNT6","OUqFMyluBx","bgJAzulk41","jfREuFwEJz","QssNCuTacx","HfyNQxReec","64s8NfcwDa","YOfrYQClRL",
+"OUqFMW7cTs","DQimpjS1aj","Mm8siNOHsz","gdQsSM3zXL","atef2FGzgp","yluBxD6rBy","VIlwP29QAz","d7vjM2Yz7E","NOHszm4bxU","9y4lw5drc6",
+"NOHsz580YD","ZuDtDAkKTk","fmIK1Q6hMC","ogLgcd85a9","IBe8k580YD","jfREuUvlv4","1j5L8ZJTXH","AmdQdpv0i7","0KyfsuQIcz","wiHrZyluBx",
+"5nmWvtuDyS","KsjRKxciqp","9iGoTydG8U","yvOMIWreyP","HlUbF29QAz","EoToPGWqqX","KASQ80ao3l","FVMxoRsQUq","zmLYD7Ow5C","RACujsuY4x",
+"s4786MaJQs","ECMvUuTacx","tl72WaDGtS","Q6hMCjzUqR","fcwDaTa8f6","t59lROUqFM","CK5W7CNHmv","AmdQdzQt6Q","CNHmvLDk6f","3weIFAXpwE",
+"FjHXRO3iyQ","he9IAGv3Fq","9XyT9EOE1o","t98iWNhXdu","kB5nPv2eC3","Yw2oUbZLvS","Yf2Ec3weIF","azIWpogLgc","Yf2EcZzJHW","ogLgcNxx9V",
+"b29RJnFqik","FjHXRyluBx","iKqhrMaJQs","ZzJHWuvf7A","djsrvtlILt","Twanov8yFN","QnJ1SZJTXH","ru4UGdmoS7","pvgjSuLtKs","jSjS3lViBv",
+"jSjS3v1Hln","Mm8si5Mg9r","MGlTFuQIcz","pT8wuGSQwj","k85AeFLsph","dmoS7ZhwG1","uLtKsPb1pa","W3VFHuN6r3","t98iWmz8gx","Waim6lCMxy",
+"v2eC35nmWv","jS1ajdjsrv","tlILtJRJQB","5IhmGhe9IA","qQxHPJXljW","lj07QrKDLJ","NAFuwGXdoH","8TxD7ZzJHW","vOqCElXFOB","gjUTuvLsmS",
+"SWfou5Namm","OUYuFG1RhS","ReKEWxciqp","Cp3mZWPmlx","GXdoHOz8yZ","LewvMUlU3M","dmoS7yofH3","s93Mlzz4ZU","MK07YVBjhz","BbwgA8TxD7",
+"48cHLJkzUn","Cp3mZ4W0Tl","oVQp6MaJQs","FNYIMWaWsv","brhlQ3otm6","pmeCd5iGN5","jSjS3b29RJ","zHF1q8cVD3","jiVBPtl72W","LbRTHMGlTF",
+"BpYhVxReec","8xEKzPb1pa","U3yw56q6L9","rKDLJjeskS","n1pmOWMiS3","n1pmOprNT6","OUYuFK4GS8","Oz8yZNxx9V","M3zXLhUTw7","WmadAFwEJz",
+"7hyVvksJby","Gv3Fq48cHL","Vprf2lH1kt","lpF6Wsx5Gl","BFkb8OUYuF","qUJMdfaHir","qaofNrhl0J","FFDuiRxrsm","9iGoTgdQsS","TCgPpsqVrf",
+"U3yw5IjTwP","uoStwFPfSE","HRxd8QnJ1S","oQ87rPOUYS","StlDJJ2mQi","DLhzMOUYuF","TXQ0ZChuy3","6q6L9DLhzM","s93Ml8TxD7","GSQwjzY1GY",
+"tuDySlj07Q","MaJQsG1RhS","Mkgy8HzZT8","v2eC3OxWIH","guMb8lpF6W","IjTwPM3zXL","2ZHdki7WMQ","0h1b1uPX7G","hUTw7SWfou","L7cGcvLsmS",
+"tvdkDguMb8","MezSWRBhp0","fLNg8uQIcz","4QMc9MmKGJ","gdQsS9eoRc","dQ586gjUTu","QWxoT2Yz7E","C2Irct59lR","fqypyhYBCK","uZPqgECMvU",
+"2hEEU5Mg9r","ZJTXHciuWz","SjskQY1mC0","O3iyQ9XyT9","zHF1qo8Uyd","QWxoTo8Uyd","faHirMmKGJ","jiVBPmz8gx","iKqhrzQt6Q","djsrvThjNn",
+"bgJAzD6rBy","48cHL5drc6","gjUTu7ku1p","YOfrYn8pJ9","S2Dfu9XyT9","iB08lnlaBy","FPfSERmDcr","euZA53otm6","W7cTsFLsph","ECMvUYf2Ec",
+"ksJbyEOE1o","jfREuVprf2","iwzGktvdkD","Ul4a1m4bxU","zHF1qI7p2a","uTacxhYBCK","0KyfsIRh48","JkzUnFcWrW","wDajXWDVWJ","LewvMI7p2a",
+"8U2nU9y4lw","Ul4a1lkMUA","FjHXRGSQwj","prNT6zHF1q","yEfy9iwzGk","8hJdtSmGzv","t59lRWmadA","n8pJ9Fhtgl","618DiRsQUq","zqH0WkZANm",
+"HlUbFKsjRK","cShY2S77LH","dQ586fFDrJ","7ku1p3weIF","e6e4zrz7Ut","yToGWJXljW","L7cGclH1kt","AgJHQ5ZaEz","W3VFH2Yz7E","FFDuiDLhzM",
+"5VZjSCp3mZ","ni2v1Mkgy8","fqypyECMvU","IKxdLlweGy","dhSuHMojnP","NAFuw7X3uy","Yh1hFW7cTs","d85a9lCMxy","Chuy3e6e4z","MmsIo0Wr5y",
+"IKxdLX6Pin","hE1QlZuDtD","M6qcGyvOMI","55rfB4dEz6","uQIczqUJMd","UmaEvxciqp","uQIczBpYhV","C2IrcJXljW","3otm6QYxC0","i7WMQprNT6",
+"4QMc9MK07Y","LDk6fpiJSk","aL6AJlXFOB","JIqXiqUJMd","s4786TCgPp","Mm8silpF6W","FFDuiLbRTH","QWxoTb29RJ","QChxsQClRL","RACujn1pmO",
+"IBe8k5Drn0","ZuDtD8TxD7","CdyBVQ6Lix","8xEKzW7cTs","t98iWzqH0W","Z4I1v5Drn0","FnPFB9eoRc","guMb8qaofN","Dz1R3Rxrsm","nnP8ox3LDe",
+"3otm6nlaBy","x3LDefqypy","U3yw5cShY2","brhlQOUqFM","zz4ZUmX2GE","OUYuFSs0Zu","LbRTHHfyNQ","BpYhVciuWz","JKWYRpmeCd","FwEJzTa8f6",
+"h1zcHvOqCE","Z4I1vAkKTk","qUJMdcQOnv","sx5GlfFDrJ","TwanoQ6Lix","5NammIBe8k","pv0i7aez9y","BbwgAWreyP","gf8rIBbwgA","IjTwPAkKTk",
+"fcJOyfaHir","5IhmG5IhmG","uLtKs45cIH","d85a9BFkb8","s93MlZUnqt","U3yw5ciuWz","G1RhSQ6hMC","a00b5lm0pD","MK07Yh1zcH","dpe1vVIlwP",
+"suY4xWmadA","VNCPdaFFss","0YAGH5Namm","e6e4zNOHsz","NAFuw5drc6","Y1mC0tuDyS","gf8rIWPmlx","14FLRrhl0J","0PktIMGlTF","NOHsz8RCUA",
+"FwEJz0MR5X","aL6AJzY1GY","uupzkwiHrZ","gjUTuKZamH","X6Pin9y4lw","xXTI4OUqFM","vOqCEbrhlQ","lm0pDqUJMd","9iGoTnnP8o","v1HlnDG4sT",
+"WreyPFnPFB","yToGWThjNn","FLsphCxVEf","FjHXRIBe8k","4dEz6DcpWB","d85a95IhmG","OHaBzMmsIo","0h1b1KASQ8","k85Ae7hyVv","B3qemW3VFH",
+"wiHrZKASQ8","dmoS79y4lw","s7MxkJRJQB","2Yz7EHfyNQ","ThjNnNcICA","2Yz7EFnPFB","vkCHHW7cTs","AgJHQFGzgp","NhXdupv0i7","d7vjMv1Hln",
+"jtn0XgjUTu","XflUquJScX","OUqFMmX2GE","YOfrYKsjRK","0Wr5ywDajX","CNHmvMGlTF","okgRi8xEKz","t59lRHzZT8","EOE1oh1zcH","pmeCdiB08l",
+"x3LDecQOnv","k85AeUvlv4","uN6r3nnP8o","gIYvEGSQwj","4QMc94W0Tl","ZzJHW9rlg9","ZhwG1ZuDtD","yToGW7Ow5C","Kr8yssx5Gl","Q6LixguMb8",
+"ulk41okgRi","cL0aEbgJAz","blLA98hJdt","RzaZAlXFOB","QbxXcChuy3","uPX7GNAFuw","NOHszIKxdL","DLhzMoQ87r","iqv4ki7WMQ","qaofNSmGzv",
+"Dz1R3nlaBy","QbxXc0BmCy","xReecKASQ8","aL6AJXflUq","bgJAzBGaQY","ru4UG9iGoT","VNCPd2Nslm","iqv4kThjNn","G1RhSCdyBV","xXTI4ZJTXH",
+"xReecStlDJ","1v5hHFhtgl","8TxD7AgJHQ","dpe1vx3LDe","POUYSSbRYy","KASQ8FNYIM","TwanoWaim6","DQimpQnJ1S","m4bxUlj07Q","5nmWvFhtgl",
+"FFDuiZUnqt","vkCHH16lHc","rhl0JFVMxo","lj07QiwzGk","BCxeC9iGoT","EdBKct98iW","CK5W7cmXIX","aDGtSgIYvE","FGzgpsoy9t","7fsYMAkKTk",
+"yEfy9BpYhV","MGlTF8U2nU","FPfSEuLtKs","OxWIHW3VFH","64s8NY1mC0","0ao3ln1pmO","UlU3MWPmlx","rKDLJuQIcz","uQIczS2Dfu","S2DfuM6qcG",
+"hE1QleuZA5","pFrrl8RCUA","SmGzvnFqik","7X3uyi7WMQ","Y1mC0CxVEf","5NammQWxoT","X6PinfcJOy","VLTy64QMc9","qUJMdAOgEe","JXljWB3qem",
+"14FLRPb1pa","1j5L89eoRc","QWxoTMaJQs","SWfouY1mC0","MezSWsx5Gl","iwzGkxciqp","xReec9rlg9","k85AevLsmS","i3pydyluBx","sqVrfHlUbF",
+"QYxC0azIWp","5NammuLtKs","0h1b1vOqCE","rz7UtyluBx","s7MxkxXTI4","0h1b1StlDJ","PYBf4mX2GE","FGzgphi5X7","5Drn0rhl0J","ni2v17X3uy",
+"xXTI4kZANm","d7vjMKsjRK","NAFuwHfyNQ","FjHXRCxVEf","pmeCd4QMc9","JkzUnKr8ys","lkMUASjskQ","FwEJz5Namm","Y1mC0dpe1v","Uvlv4FxX9q",
+"7Ow5CgIYvE","d85a9Q6hMC","IKxdL580YD","dhSuHZv7z0","6AFT0XyPZN","9iGoT580YD","AXpwEZ4I1v","QYxC0W7cTs","X6PinUmaEv","EoToP9eoRc",
+"wiHrZLewvM","Ul4a1QWxoT","AgJHQFwEJz","b29RJCfgr3","ZuDtDWaWsv","7X3uyLbRTH","0YAGHJJs5m","CdyBVjtn0X","lweGy7lUXZ","EoToPiKqhr",
+"580YDZUnqt","WreyPECMvU","QssNCfcwDa","s93Mluvf7A","FNYIMlsQGo","YjB9tQ6hMC","Yh1hF0Wr5y","Waim6RBhp0","tvdkDS77LH","8hJdtCdyBV",
+"e6e4zsqVrf","ogLgcsuY4x","ix74rS77LH","JKWYRSWfou","1LB1LWaim6","fFDrJlweGy","Rxrsm618Di","FFDuioGu6x","Cfgr3S77LH","s93MlFLsph",
+"aL6AJjSjS3","TCgPpoQ87r","EOE1ofaHir","zY1GY0ao3l","zHF1q5Mg9r","7Ow5CtjQxs","FLsphlCMxy","CIShGvkCHH","qUJMd9GXkX","KsjRKVprf2",
+"azIWpM6qcG","F6PT2YjB9t","taOXKgIYvE","lXFOBmz8gx","I7p2aDLhzM","M6qcGjS1aj","5VZjS0PktI","v8yFNFwEJz","O3iyQDLhzM","lpF6WHfyNQ",
+"VerEAK4GS8","9eoRclXFOB","Yw2oUsoy9t","0Wr5ydhSuH","BpYhVuPX7G","Chuy3Waim6","d85a9prNT6","wiHrZSbRYy","Pb1pajeskS","FGzgpF6PT2",
+"PYBf4FwEJz","t59lREdBKc","rKDLJ8U2nU","StlDJOUYuF","UlU3Mrhl0J","pAhR1t59lR","zqH0WsuY4x","Cfgr3zY1GY","5Drn0oGu6x","4dEz6zQt6Q",
+"LewvM8U2nU","CK5W70Kyfs","RmDcriB08l","2ZHdk1LB1L","U3yw5Ss0Zu","iqv4kv2eC3","kB5nPCIShG","dhSuHuvf7A","ulk41CK5W7","KsjRKThjNn",
+"RmDcrOHaBz","FPfSEKr8ys","MGlTFRzaZA","lCMxyW7cTs","AXpwEmX2GE","lpF6Wru4UG","U3yw5S2Dfu","fqypySWfou","BpYhVRBhp0","RmDcraDGtS",
+"RBhp0Mkgy8","VNCPdix74r","FhtglCqqaD","sqVrfKZamH","yvOMIv2eC3","2ZHdkEoToP","0BmCyL7cGc","lH1ktpv0i7","0h1b10Kyfs","L7cGcsuY4x",
+"oQ87rQnJ1S","faHirVprf2","yluBx7fsYM","JKWYR0BmCy","v1HlnfcJOy","sx5GlzqH0W","yToGWguMb8","gjUTuBbwgA","cQOnvG1RhS","oVQp6RACuj",
+"7ku1pMK07Y","64s8NFFDui","QClRLbZLvS","OUYuF580YD","ulk41MK07Y","MK07YFjHXR","2DREsnlaBy","jzUqRzY1GY","UmaEvRmDcr","azIWpfaHir",
+"wDajXhSSvQ","S77LHxciqp","gf8rIBpYhV","NAFuwrKDLJ","BGaQYM6qcG","l83UduTacx","zQt6Q2ZHdk","k85Aeh1zcH","v8yFNyEfy9","BGaQY7fsYM",
+"zY1GYUmaEv","blLA9ZUnqt","LDk6f0h1b1","MaJQsuN6r3","pvgjSYf2Ec","KZamHjSjS3","SbRYyyvOMI","jzUqRK20wK","5drc6jfREu","5Namm2Nslm",
+"atef2ulk41","bgJAz8TxD7","2hEEUlweGy","lm0pDuLtKs","7hyVvix74r","CIShGoVQp6","jzUqRRmDcr","Mkgy80YAGH","oVQp614FLR","PYBf4JIqXi",
+"CIShGTa8f6","yofH3yluBx","MmKGJtuDyS","2DREs618Di","5iGN5Yf2Ec","uQIczJKWYR","CNHmvMezSW","gdQsSh1zcH","2TRI76q6L9","OxWIHciuWz",
+"d7vjMCfgr3","RACuj5Namm","Kr8ysWreyP","VBjhzhe9IA","tlILtfFDrJ","FwEJz2DREs","EdBKcaFFss","WPmlx6AFT0","bZLvSYw2oU","FVMxo2Yz7E",
+"RpBQmzFgtB","fqypypvgjS","HfyNQguMb8","FPfSEgtCA5","jtn0XAkKTk","jeskSUl4a1","07n1clweGy","okgRi55rfB","RzaZAmz8gx","FLsphnFqik",
+"HlUbFgjUTu","tAOsr8cVD3","uoStwRACuj","ThjNnoQ87r","64s8NjfREu","fLNg82Yz7E","ksJbyBFkb8","LDk6f2hEEU","XyPZNiKqhr","aez9y2Yz7E",
+"WaWsvjzUqR","SmGzvfmIK1","Gv3FqiwzGk","ulk41JIqXi","hi5X7fcJOy","aez9yCfgr3","GSQwj9eoRc","07n1cAgJHQ","MojnPo8Uyd","iqv4kOxWIH",
+"PYBf4qUJMd","618DipAhR1","uZPqgMezSW","ni2v1RsQUq","Waim6hYBCK","CxVEfhi5X7","zQt6QPYBf4","hSSvQDLhzM","sqVrfcmXIX","Uvlv47fsYM",
+"dQ586hYBCK","fcJOypFrrl","Y1mC0XyPZN","ZzJHWCdyBV","0h1b1QChxs","ogLgcni2v1","CIShGfmIK1","QworuxReec","TCgPpiB08l","In3NSNOHsz",
+"StlDJcmXIX","dmoS7pv0i7","WaWsvcL0aE","8TxD7EoToP","b29RJBCxeC","Cp3mZTa8f6","Chuy3rz7Ut","ksJbyoVQp6","OUqFMxXTI4","bgJAzPb1pa",
+"yvOMIiB08l","5VZjSiKqhr","VBjhzWmadA","VjCZqgf8rI","DQimpQChxs","wDajXJIqXi","HzZT8ThjNn","QnJ1Ss7Mxk","oGu6xzY1GY","xXTI4M3zXL",
+"he9IAHzZT8","pFrrlv8yFN","I7p2a7X3uy","lweGynnP8o","GXdoHpiJSk","Gv3Fqv8yFN","WMiS3jS1aj","qQxHPvkCHH","v8yFNdjsrv","RmDcr9eoRc",
+"7Ow5Cn8pJ9","29QAzSmGzv","zz4ZUb29RJ","jfREuRsQUq","QssNCFGzgp","qQxHPfFDrJ","45cIHG1RhS","xciqpAmdQd","5Drn0VIlwP","uTacx0YAGH",
+"0h1b1zHF1q","Oz8yZ14FLR","7fsYM2Nslm","KZamH6q6L9","gtCA5fcJOy","MmKGJL7cGc","zFgtBOz8yZ","1v5hHblLA9","sx5Gl7lUXZ","9XyT9LDk6f",
+"POUYSuPX7G","RACuj8hJdt","ZzJHWhe9IA","Yw2oUeuZA5","9rlg9XflUq","piJSk29QAz","xReecVNCPd","iKqhrRkQke","DcpWB7fKYU","24ARFK4GS8",
+"cShY2pv0i7","qaofNG1RhS","2hEEU7ku1p","e6e4zSmGzv","yToGWRzaZA","jSjS3JIqXi","VjCZqaDGtS","UlU3MCNHmv","d85a9SjskQ","TXQ0Z3weIF",
+"48cHLpT8wu","F6PT2dQ586","POUYSksJby","Ta8f6FwEJz","iB08lLDk6f","uQIczfqypy","sx5Gl2ZHdk","8cVD3taOXK","b29RJy94nw","In3NSrKDLJ",
+"qUJMds4786","rhl0Jo8Uyd","cL0aEi7WMQ","Dz1R3lH1kt","JJs5mIRh48","RsQUqPYBf4","JkzUnPb1pa","piJSk6q6L9","bgJAzyluBx","SWfou0ao3l",
+"Kr8ysbgJAz","EdBKc07n1c","5VZjSAmdQd","JJs5mOHaBz","rz7UtBpYhV","ThjNn9iGoT","ThjNnAkKTk","uN6r37Ow5C","jfREuCxVEf","FGzgpRzaZA",
+"BbwgAsqVrf","nFqikLewvM","48cHLW7cTs","oGu6xuN6r3","lH1ktTXQ0Z","jfREuFxX9q","dhSuHUvlv4","MezSWFnPFB","QChxst59lR","0PktIcShY2",
+"i7WMQVBjhz","hUTw7ksJby","b29RJaDGtS","SWfouBCxeC","VNCPdiB08l","iqv4k16lHc","W3VFHW3VFH","WaWsvDcpWB","cmXIXmX2GE","fcwDabZLvS",
+"uPX7GtlILt","ECMvU5drc6","JJs5m8xEKz","zHF1qcShY2","pvgjS7hyVv","x3LDeW3VFH","5iGN5lkMUA","t59lRdpe1v","ix74rs4786","azIWpfFDrJ",
+"Gv3FqvOqCE","n8pJ9618Di","e6e4zFjHXR","e6e4zBCxeC","Zv7z0gdQsS","55rfBiKqhr","zFgtB7fKYU","WaWsvVIlwP","7Ow5Cix74r","iB08lZuDtD",
+"yEfy9FwEJz","taOXK8hJdt","Q6hMCVBjhz","v2eC3ydG8U","ydG8UKr8ys","taOXK7ku1p","Gv3Fqt59lR","gdQsSYf2Ec","ydG8UNhXdu","9rlg9GrDg7",
+"JJs5mThjNn","2Nslm48cHL","4W0Tly94nw","jSjS3GrDg7","K4GS8YjB9t","GWqqX7lUXZ","piJSkuPX7G","618DiKr8ys","ZzJHWRBhp0","QChxs07n1c",
+"brhlQ2Yz7E","AmdQdFjHXR","NOHszI7p2a","brhlQcShY2","Ss0ZuiwzGk","FGzgpdQ586","Cfgr3HP433","RpBQmuoStw","ZzJHWmX2GE","55rfBhYBCK",
+"tAOsroVQp6","pv0i7VBjhz","GXdoHAgJHQ","gf8rIB3qem","pWiOslpF6W","WaWsvgIYvE","lViBvzY1GY","ZUnqtY1mC0","k85AeFNYIM","Ss0ZufFDrJ",
+"DLhzMDz1R3","OxWIHyEfy9","ciuWzSmGzv","hi5X7MGlTF","NcICA48cHL","qUJMd580YD","0BmCyvOqCE","azIWp1j5L8","dmoS7JkzUn","hYBCKxciqp",
+"Ta8f6uN6r3","zHF1qD6rBy","guMb8tuDyS","XflUqlpF6W","uoStw7fsYM","Mkgy8pvgjS","J2mQiAOgEe","LewvMFcWrW","CK5W7uJScX","W7cTsuoStw",
+"CqqaDyofH3","64s8N8hJdt","DLhzMlViBv","jfREuTa8f6","lViBvBpYhV","W7cTs4QMc9","16lHcs7Mxk","5iGN5IjTwP","kZANmFVMxo","W7cTsFnPFB",
+"580YDfcwDa","LDk6ftjQxs","xciqpNOHsz","8RCUA2TRI7","VerEAzz4ZU","FnPFBK4GS8","dQ5865IhmG","MojnPUvlv4","XyPZNpWiOs","9y4lwDQimp",
+"4W0TlDLhzM","Ss0ZuAIYUu","guMb8aez9y","fLNg8hE1Ql","29QAzVNCPd","8cVD3VIlwP","Cfgr3D6rBy","oVQp60MR5X","mz8gx0BmCy","8U2nU7ku1p",
+"Fhtgl7Ow5C","tlILtv2eC3","qaofNTa8f6","gf8rIFnPFB","UmaEviwzGk","QYxC0K4GS8","D6rByhe9IA","kB5nPHzZT8","BbwgADcpWB","yToGWWPmlx",
+"FxX9qkZANm","lweGyKr8ys","lpF6Wv1Hln","zFgtBv1Hln","fmIK18U2nU","5VZjSHP433","v1HlnPYBf4","tuDySQYxC0","B3qemvOqCE","soy9t0Wr5y",
+"lViBvDQimp","hE1QlfFDrJ","S2DfuuLtKs","48cHL9iGoT","OUqFMd7vjM","uTacxcL0aE","P6bcg24ARF","7ku1pNOHsz","D6rByFhtgl","soy9tYh1hF",
+"Oz8yZjeskS","OUYuFLewvM","suY4x2ZHdk","Waim6oQ87r","pmeCddmoS7","DG4sTKASQ8","Q6Lixh1zcH","BFkb8gdQsS","taOXKHlUbF","WPmlxt98iW",
+"brhlQYf2Ec","FNYIMru4UG","XflUqECMvU","55rfBazIWp","KsjRKiKqhr","B3qemQnJ1S","pFrrlZhwG1","JJs5m7ku1p","qQxHPsuY4x","48cHLo8Uyd",
+"VLTy67fKYU","xReecCxVEf","MK07Y24ARF","zbIYYVBjhz","CdyBV8U2nU","ulk41In3NS","zbIYYuQIcz","0BmCyn1pmO","tuDyS580YD","Yw2oUsx5Gl",
+"s7MxkEOE1o","oGu6x6q6L9","kB5nPbZLvS","GXdoHhYBCK","J2mQi2TRI7","dQ586DLhzM","QssNCJXljW","VIlwPO3iyQ","7X3uysuY4x","D6rBylViBv",
+"KZamHtvdkD","Oz8yZMaJQs","16lHcVLTy6","JKWYRMezSW","aL6AJYOfrY","K4GS8gjUTu","tl72W2Yz7E","m4bxUFGzgp","ZJTXH8TxD7","5Nammlj07Q",
+"he9IAaez9y","BCxeCRsQUq","MK07Y5VZjS","jSjS364s8N","Kr8ysqQxHP","s7MxkCNHmv","kZANmCp3mZ","X6PinOxWIH","M6qcG4QMc9","fmIK1ZzJHW",
+"5drc6Pb1pa","JXljWZuDtD","WreyPrhl0J","Vprf2S77LH","ZuDtDCIShG","In3NS8U2nU","POUYSprNT6","JRJQBOxWIH","iKqhrMmKGJ","D6rByBFkb8",
+"ulk41zHF1q","NcICAe6e4z","n8pJ9vLsmS","Ss0ZuxReec","hYBCKiKqhr","RkQke5IhmG","QbxXcLewvM","fLNg8pWiOs","WPmlxuZPqg","RpBQm5Mg9r",
+"lCMxybrhlQ","a00b5KASQ8","RsQUq8xEKz","lj07Q6q6L9","8cVD3MmKGJ","RzaZAJ2mQi","MojnPStlDJ","6AFT0kB5nP","Gv3Fq0PktI","ydG8UwDajX",
+"djsrvJkzUn","euZA5O3iyQ","nlaBydhSuH","atef2618Di","oGu6xguMb8","kB5nPMmsIo","jfREutAOsr","lsQGo9GXkX","ReKEWeuZA5","HP433GrDg7",
+"2Yz7E2DREs","5nmWvBbwgA","24ARF55rfB","blLA9JJs5m","GrDg7k85Ae","FhtglDG4sT","7X3uyQssNC","uJScXBGaQY","RsQUqLbRTH","dhSuHAkKTk",
+"lXFOBBpYhV","7Ow5C4dEz6","DG4sT16lHc","UmaEv14FLR","azIWpDz1R3","xciqpMkgy8","uQIczgtCA5","fmIK1MezSW","P6bcgM3zXL","8RCUAM3zXL",
+"07n1cRsQUq","Nxx9Vn1pmO","i3pydMaJQs","t98iWQssNC","ix74raDGtS","fLNg8aFFss","RzaZAd7vjM","jeskSMezSW","8RCUAmX2GE","1j5L8AmdQd",
+"16lHc45cIH","lCMxyUl4a1","MK07YQ6Lix","brhlQHP433","MaJQsZuDtD","EoToPuvf7A","BpYhVkZANm","OUYuFcShY2","ydG8UuQIcz","ciuWzDcpWB",
+"uN6r3Gv3Fq","dhSuHGv3Fq","4QMc9JRJQB","0MR5X8FmFH","ECMvUqQxHP","3weIFbZLvS","FGzgpCp3mZ","6q6L9GrDg7","vLsmSSbRYy","X6Pin7ku1p",
+"brhlQaFFss","oQ87ri7WMQ","aez9y0MR5X","MojnPMm8si","CNHmvjtn0X","8TxD74W0Tl","l83Udgf8rI","Y1mC0xXTI4","Pb1paiKqhr","KZamHNxx9V",
+"45cIH16lHc","Yw2oUZuDtD","GWqqXOHaBz","KASQ8ru4UG","FnPFBeuZA5","EOE1oxciqp","jiVBPIn3NS","AIYUu24ARF","RkQkeJXljW","yofH3DLhzM",
+"TXQ0ZKZamH","2NslmCfgr3","uPX7GydG8U","taOXKuAWyp","2DREsgtCA5","G1RhSQnJ1S","a00b5v1Hln","9y4lwUlU3M","ReKEWMGlTF","aDGtSv8yFN",
+"J2mQiQssNC","DG4sTBpYhV","s7MxkO3iyQ","WPmlx9XyT9","StlDJni2v1","piJSk5Namm","S77LHEdBKc","WPmlxHRxd8","AkKTkFLsph","8xEKzaez9y",
+"2DREsYw2oU","lm0pDsx5Gl","ulk41VIlwP","AgJHQ24ARF","JKWYRe6e4z","ZzJHWQbxXc","hE1QlFFDui","4dEz6WaWsv","zHF1qoQ87r","GXdoHTCgPp",
+"lm0pDoQ87r","ogLgcMojnP","yToGWRpBQm","0YAGHksJby","7hyVvLDk6f","CxVEflCMxy","oGu6xgIYvE","qaofNJRJQB","JRJQBFPfSE","t98iW5iGN5",
+"uN6r3yluBx","POUYSy94nw","3otm69eoRc","5nmWv07n1c","FxX9qDLhzM","yToGWP6bcg","rz7UtFPfSE","ogLgcl83Ud","nnP8oVBjhz","ZJTXHnlaBy",
+"EdBKcWMiS3","WDVWJM3zXL","RpBQmciuWz","fFDrJdQ586","x3LDeL7cGc","zHF1qX6Pin","X6PintlILt","zHF1qWPmlx","ni2v1jSjS3","HzZT8ogLgc",
+"HfyNQpv0i7","QWxoT5VZjS","n8pJ9azIWp","Ss0ZusuY4x","PYBf4NOHsz","pT8wutlILt","0BmCy6AFT0","9iGoTRkQke","L7cGcFwEJz","dhSuHmX2GE",
+"WaWsv8xEKz","5Drn0In3NS","8FmFHAgJHQ","BpYhVDG4sT","zFgtBAkKTk","29QAz9XyT9","zFgtBs7Mxk","CIShGNAFuw","8xEKz1j5L8","AIYUuuTacx",
+"Oz8yZzbIYY","CK5W7soy9t","mX2GECdyBV","X6Pin4W0Tl","BpYhVKASQ8","prNT6fLNg8","nlaByUl4a1","DQimptjQxs","BpYhVi7WMQ","i7WMQYOfrY",
+"X6Pin2Nslm","MezSWLDk6f","blLA98U2nU","WPmlxjfREu","n1pmO7X3uy","pmeCdoQ87r","Mm8siChuy3","LewvM0h1b1","IRh48n1pmO","RBhp02DREs",
+"IRh484W0Tl","lpF6WFNYIM","AkKTkCp3mZ","VerEAmX2GE","F6PT2jS1aj","XyPZNfLNg8","cL0aE7fsYM","xXTI4RzaZA","HzZT80PktI","zqH0WhYBCK",
+"9rlg9O3iyQ","hSSvQhe9IA","9y4lwlXFOB","ZuDtDRBhp0","Y1mC0KsjRK","2ZHdkdhSuH","TCgPpBGaQY","AkKTk5nmWv","IRh48Y1mC0","zY1GYmX2GE",
+"In3NSlH1kt","SmGzvzY1GY","AmdQdJXljW","gdQsStjQxs","Ss0Zun8pJ9","580YDdpe1v","QworuNOHsz","ZhwG1yToGW","jtn0XtAOsr","oVQp6lpF6W",
+"8hJdt8U2nU","dQ586RzaZA","9XyT9pv0i7","JXljWFwEJz","AXpwEzY1GY","jS1ajSbRYy","2DREsgIYvE","0YAGHWDVWJ","WreyP8U2nU","5Mg9rjzUqR",
+"StlDJk85Ae","7lUXZSs0Zu","FVMxotvdkD","BCxeCS77LH","WaWsv9rlg9","a00b5ksJby","L7cGc580YD","nFqikKsjRK","VBjhzpFrrl","TwanoGWqqX",
+"lCMxyuupzk","guMb8Gv3Fq","1v5hHdjsrv","yEfy9JKWYR","CIShGRsQUq","S2DfuSbRYy","gIYvEZzJHW","W7cTsGrDg7","Yw2oUXyPZN","KZamH8RCUA",
+"v1HlnNhXdu","Q6hMCuLtKs","x3LDeHRxd8","0Kyfss7Mxk","I7p2a7lUXZ","CIShGbgJAz","s7MxkuJScX","Uvlv45IhmG","FxX9qtl72W","ru4UGVNCPd",
+"pT8wuNcICA","uPX7GZJTXH","prNT6FLsph","n8pJ924ARF","VjCZqGXdoH","48cHLzmLYD","AgJHQEdBKc","Cp3mZUmaEv","2TRI7LDk6f","iB08lQnJ1S",
+"LbRTHUmaEv","I7p2aSbRYy","WPmlxM3zXL","tvdkD0Kyfs","jiVBP8hJdt","4W0Tl48cHL","d7vjMpiJSk","xReecQ6hMC","cShY2jiVBP","55rfB0ao3l",
+"W3VFHiqv4k","Ta8f61j5L8","EoToP14FLR","RBhp0IKxdL","FnPFBQChxs","guMb8iB08l","WreyPyToGW","jzUqRuoStw","n1pmOuTacx","VLTy6W3VFH",
+"Oz8yZtlILt","8U2nUb29RJ","jiVBPyvOMI","hSSvQl83Ud","cL0aECK5W7","hE1QlF6PT2","In3NSOUqFM","lpF6Wh1zcH","POUYSWaWsv","StlDJ24ARF",
+"aDGtSnnP8o","xXTI4dpe1v","tjQxsXyPZN","IRh48lweGy","FGzgplXFOB","I7p2annP8o","7fKYUaDGtS","fqypyTXQ0Z","AXpwEv2eC3","iB08lMkgy8",
+"WPmlxWaWsv","t98iWWMiS3","zmLYDPYBf4","rhl0J0PktI","FjHXRaDGtS","5Mg9ruupzk","Ta8f6Cfgr3","sqVrfv1Hln","FjHXRlm0pD","djsrvfcwDa",
+"zY1GYMm8si","cmXIXTwano","dhSuHbrhlQ","mX2GECNHmv","tl72WbgJAz","Chuy30ao3l","fcwDasoy9t","zbIYYI7p2a","okgRiVLTy6","ulk41JkzUn",
+"rhl0JksJby","FxX9q3weIF","cShY27lUXZ","lj07QWPmlx","6AFT0POUYS","sqVrfZuDtD","CqqaDWDVWJ","0ao3lSs0Zu","4dEz6i3pyd","RsQUqYOfrY",
+"RxrsmblLA9","he9IAxXTI4","pvgjSK4GS8","3weIFpvgjS","m4bxUiB08l","dhSuH0YAGH","JXljWciuWz","9GXkXUvlv4","JkzUnhE1Ql","O3iyQKsjRK",
+"uJScXYf2Ec","dpe1vs7Mxk","CxVEfzHF1q","SbRYy5VZjS","0YAGHNhXdu","NcICAqQxHP","tl72WcL0aE","W7cTsAOgEe","vkCHHCK5W7","O3iyQdmoS7",
+"k85AeFcWrW","PYBf4WDVWJ","2ZHdksoy9t","y94nw1j5L8","yEfy9fFDrJ","2DREszFgtB","zmLYDAIYUu","zbIYYHRxd8","SmGzv7ku1p","AkKTkAIYUu",
+"FnPFBHfyNQ","CNHmvFnPFB","djsrvuPX7G","0BmCy5iGN5","Chuy3jzUqR","FGzgpn1pmO","fLNg8hi5X7","7fsYMKZamH","TXQ0ZEdBKc","aFFss0ao3l",
+"0KyfsVBjhz","t98iWZuDtD","taOXKDLhzM","7hyVvcQOnv","cL0aEwiHrZ","fFDrJRkQke","HlUbFm4bxU","Yh1hFVLTy6","pvgjSzY1GY","jfREulCMxy",
+"cShY2K4GS8","C2IrckZANm","45cIHxciqp","oGu6xulk41","9iGoTFcWrW","JkzUnAOgEe","AXpwEni2v1","hUTw7gtCA5","2hEEU8TxD7","PYBf49GXkX",
+"5nmWvlj07Q","yToGWuvf7A","yvOMIVNCPd","CxVEfQssNC","dmoS7hSSvQ","s7MxkJIqXi","ogLgcAgJHQ","EoToPVLTy6","24ARFiB08l","wiHrZKsjRK",
+"sx5Glulk41","cL0aEStlDJ","suY4xmz8gx","GXdoHWmadA","QClRLD6rBy","5VZjS07n1c","WPmlxzHF1q","nFqiklXFOB","gf8rIJJs5m","mz8gxQ6Lix",
+"580YDThjNn","Z4I1vGWqqX","QYxC0CxVEf","uZPqg8xEKz","RkQke4dEz6","n8pJ9WaWsv","jfREuI7p2a","jtn0XQssNC","Nxx9VGSQwj","cShY2FnPFB",
+"Oz8yZIKxdL","jeskSsx5Gl","zz4ZU5Namm","WreyPMkgy8","uvf7Asoy9t","VBjhzQbxXc","9XyT9vOqCE","tlILt9GXkX","0MR5Xt59lR","hSSvQDz1R3",
+"wiHrZnlaBy","5Drn08TxD7","WreyPv2eC3","VNCPdjfREu","fmIK1OUYuF","AmdQd55rfB","7X3uydmoS7","ni2v1SjskQ","14FLRfqypy","7X3uyGWqqX",
+"SmGzvZzJHW","RACujuJScX","Ul4a1s4786","UmaEvQWxoT","RmDcrUlU3M","b29RJhYBCK","NOHszGSQwj","Cp3mZFLsph","PYBf4uupzk","FNYIMEOE1o",
+"mX2GEMezSW","1j5L8LDk6f","k85Ae580YD","vOqCED6rBy","F6PT2jtn0X","EdBKcMmsIo","JRJQBvkCHH","5nmWvWmadA","lsQGoulk41","8TxD7RBhp0",
+"v1Hlnix74r","uLtKslm0pD","zFgtBTwano","CdyBVuTacx","JkzUn7lUXZ","7hyVv07n1c","OUqFMKASQ8","he9IAWaWsv","9eoRcQworu","Oz8yZK20wK",
+"EOE1ozmLYD","9XyT9zz4ZU","8cVD3Q6hMC","hi5X7cQOnv","K20wKS77LH","pWiOsNOHsz","pv0i7WPmlx","07n1cTwano","qaofNtlILt","FFDuiiqv4k",
+"lViBvsoy9t","tjQxsoVQp6","aDGtSVerEA","RBhp0CNHmv","lXFOBvLsmS","RmDcrFwEJz","jtn0X29QAz","7lUXZdjsrv","Rxrsmn1pmO","yluBxs7Mxk",
+"QClRLt98iW","zY1GYmz8gx","aL6AJWaWsv","xReecF6PT2","FjHXRXflUq","nFqikOxWIH","t98iWS77LH","6q6L9VerEA","5iGN5GSQwj","HfyNQ5Drn0",
+"RzaZAMaJQs","HlUbF8FmFH","xXTI4qUJMd","QClRLQssNC","nlaByF6PT2","ru4UGNcICA","F6PT27hyVv","nnP8oIKxdL","BbwgAuupzk","XyPZNHfyNQ",
+"pFrrl580YD","CK5W7wDajX","0PktICxVEf","8TxD7DLhzM","FnPFBb29RJ","mz8gxa00b5","e6e4zRACuj","tjQxsDG4sT","sqVrfZ4I1v","8RCUAFcWrW",
+"0YAGHQbxXc","NcICAJkzUn","P6bcg7hyVv","QssNC3otm6","0PktI8FmFH","VLTy6aDGtS","4QMc91j5L8","JJs5mFwEJz","pAhR1P6bcg","VBjhzjfREu",
+"FnPFBYOfrY","uAWypIKxdL","ReKEWpv0i7","LbRTHReKEW","IBe8kU3yw5","uN6r3lCMxy","ix74rNcICA","QYxC0BpYhV","tlILtDLhzM","9eoRcMezSW",
+"618Dil83Ud","9XyT90MR5X","a00b5o8Uyd","D6rByQ6hMC","07n1cv2eC3","cShY255rfB","t98iWhSSvQ","fmIK1LewvM","QssNCzbIYY","lsQGo5iGN5",
+"BpYhVwDajX","KZamHM6qcG","3otm6WDVWJ","ulk419rlg9","4W0TlpmeCd","LDk6fn1pmO","d85a9O3iyQ","tlILtoVQp6","EoToPgtCA5","Kr8ysVprf2",
+"G1RhSjS1aj","ni2v1JJs5m","rKDLJQbxXc","zqH0WW3VFH","sx5GlGrDg7","wDajXbZLvS","07n1cYf2Ec","RmDcrv1Hln","xciqphE1Ql","16lHcCNHmv",
+"HfyNQn8pJ9","DG4sTyluBx","h1zcH2DREs","GrDg7pFrrl","FjHXRDG4sT","KZamHFxX9q","F6PT2ThjNn","Z4I1vBpYhV","VIlwPlViBv","uPX7GazIWp",
+"hYBCKfFDrJ","a00b5brhlQ","tAOsr0Kyfs","wDajXyluBx","tuDySmz8gx","KsjRKAOgEe","AgJHQ5Mg9r","dpe1vlCMxy","gdQsSBbwgA","oVQp6W7cTs",
+"F6PT25iGN5","uN6r39y4lw","NhXduuPX7G","WMiS3MaJQs","euZA5M6qcG","gIYvEjzUqR","SWfou1v5hH","guMb8o8Uyd","yvOMI9XyT9","tlILtNo0Qb",
+"0h1b10ao3l","No0QbwiHrZ","CNHmvpT8wu","n8pJ9tvdkD","uvf7AFjHXR","Kr8ysfcwDa","2TRI7580YD","TwanoJKWYR","IKxdLksJby","n1pmOciuWz",
+"9XyT9qQxHP","B3qemi7WMQ","pvgjSDLhzM","FjHXRzmLYD","2ZHdkwiHrZ","QChxsuZPqg","iKqhrtjQxs","b29RJpFrrl","azIWpMGlTF","uvf7AJXljW",
+"h1zcHKsjRK","8RCUAAXpwE","8TxD7G1RhS","fqypy7hyVv","580YD9rlg9","9y4lwAXpwE","QworucmXIX","JKWYRS77LH","OUYuFTXQ0Z","8cVD307n1c",
+"tAOsrxciqp","s7MxkWreyP","gtCA5dmoS7","9y4lwsoy9t","Ul4a1yofH3","e6e4zGXdoH","JRJQBBFkb8","aFFssYf2Ec","jeskSM6qcG","1j5L8NhXdu",
+"2TRI7WMiS3","AXpwEUlU3M","ZUnqtThjNn","RACujl83Ud","GWqqXRmDcr","RpBQmUlU3M","i3pydnnP8o","qQxHPe6e4z","FVMxoyToGW","tjQxsYjB9t",
+"JkzUnPYBf4","azIWpdpe1v","Q6hMC5IhmG","GXdoHQYxC0","9GXkX9y4lw","suY4xUlU3M","WMiS3uJScX","7fKYUJKWYR","BGaQYfLNg8","HlUbF7ku1p",
+"d85a924ARF","okgRirKDLJ","zHF1qUvlv4","MGlTFd85a9","jS1aj2ZHdk","Z4I1vh1zcH","StlDJkZANm","lViBvKr8ys","n8pJ9VIlwP","5nmWv9GXkX",
+"8hJdtJ2mQi","k85Aeuvf7A","9rlg9Rxrsm","Z4I1vRBhp0","S2Dfu8xEKz","GrDg7mz8gx","dmoS7tAOsr","MezSWMm8si","CqqaD4QMc9","G1RhSzY1GY",
+"TwanoRzaZA","M3zXL1j5L8","uTacxCNHmv","yluBxZJTXH","Vprf23weIF","7hyVvyToGW","Yw2oUAgJHQ","djsrvgtCA5","EdBKcZhwG1","9iGoTgf8rI",
+"Pb1pajSjS3","C2IrcHP433","yvOMId85a9","OxWIHv2eC3","FcWrWQYxC0","rhl0J4QMc9","yvOMIFxX9q","Q6hMC7Ow5C","0MR5X0PktI","0ao3l5IhmG",
+"8FmFHaez9y","yvOMIUlU3M","lViBvgIYvE","oVQp6suY4x","GWqqXPb1pa","P6bcgBCxeC","8RCUAlH1kt","pFrrlFhtgl","0ao3lC2Irc","he9IAQ6Lix",
+"AkKTkzbIYY","taOXKBCxeC","jiVBP2DREs","PYBf4xciqp","4dEz6k85Ae","suY4xwiHrZ","QYxC0VerEA","5VZjSwDajX","BFkb82TRI7","ZuDtDS77LH",
+"rKDLJFNYIM","BCxeC8RCUA","oQ87rFhtgl","IBe8keuZA5","aL6AJYh1hF","v1Hln0h1b1","Kr8ysfmIK1","2hEEU0PktI","Cp3mZS2Dfu","Cfgr3h1zcH",
+"ydG8UpAhR1","Cp3mZAgJHQ","EoToP7ku1p","F6PT2k85Ae","DcpWBDcpWB","P6bcgPOUYS","5drc6DLhzM","dmoS7iwzGk","ksJbyWmadA","No0QbDG4sT",
+"MezSWhe9IA","8cVD3tAOsr","J2mQiCqqaD","9eoRc2DREs","JKWYRTa8f6","7fsYMP6bcg","QssNC9XyT9","ZUnqtPOUYS","2NslmyEfy9","0BmCyZJTXH",
+"Gv3FqHRxd8","atef2JkzUn","RsQUqiKqhr","soy9tG1RhS","MezSWdjsrv","ix74r7hyVv","2TRI7xXTI4","s7MxkZUnqt","8TxD7xciqp","G1RhS4dEz6",
+"yToGWCdyBV","StlDJFnPFB","iqv4kHfyNQ","EdBKcVprf2","DG4sTUvlv4","dhSuHCIShG","9eoRcVerEA","AXpwEe6e4z","ogLgcdjsrv","Chuy3618Di",
+"S2Dfu4QMc9","HzZT8aez9y","DQimpW7cTs","FnPFBFGzgp","QWxoTYh1hF","taOXK0ao3l","CxVEftjQxs","kZANmjSjS3","WMiS3aL6AJ","RzaZAzY1GY",
+"6q6L9lCMxy","cQOnvo8Uyd","EdBKcuPX7G","JkzUnCfgr3","YOfrY9y4lw","GXdoHbgJAz","YOfrY618Di","9rlg9jtn0X","GWqqXtAOsr","YOfrYAmdQd",
+"HfyNQa00b5","pAhR1gf8rI","EdBKcK4GS8","1v5hHt59lR","uTacxMGlTF","XyPZNSbRYy","Chuy3NAFuw","tlILt2DREs","07n1c0PktI","Chuy3he9IA",
+"GSQwjPb1pa","MezSWAmdQd","Gv3Fqb29RJ","6q6L9iB08l","b29RJVLTy6","14FLRpv0i7","Cp3mZFhtgl","y94nwtjQxs","618DiUvlv4","24ARFDLhzM",
+"2TRI70MR5X","cmXIXJ2mQi","JIqXi8hJdt","4dEz6FLsph","VNCPdUvlv4","2TRI7SmGzv","PYBf4QWxoT","lCMxyVprf2","s93Ml5nmWv","aFFssOHaBz",
+"ni2v1MezSW","QWxoTVLTy6","ZuDtDOHaBz","vOqCEjtn0X","0Wr5yuPX7G","4W0TlHlUbF","pvgjSx3LDe","SmGzvZUnqt","FwEJzhYBCK","h1zcH2TRI7",
+"LDk6fIRh48","45cIHBpYhV","GrDg7faHir","EdBKc6q6L9","xXTI4bgJAz","2TRI7lXFOB","LbRTHogLgc","Nxx9VFcWrW","Mkgy8VBjhz","0PktIL7cGc",
+"Zv7z0x3LDe","0ao3l2hEEU","soy9t4W0Tl","4dEz6lm0pD","6q6L9Yf2Ec","B3qemNAFuw","lj07Q9XyT9","WMiS3pvgjS","h1zcHHfyNQ","29QAzS77LH",
+"kZANmK4GS8","2ZHdkMmsIo","48cHLFxX9q","pv0i7M3zXL","K4GS8QssNC","JKWYRqaofN","hE1Ql55rfB","piJSkMezSW","cQOnvUlU3M","gf8rIBGaQY",
+"2Yz7EXflUq","hYBCKGXdoH","v8yFNMezSW","G1RhSPOUYS","jSjS3euZA5","5ZaEzprNT6","Uvlv4zHF1q","BFkb8yofH3","fFDrJru4UG","he9IASjskQ",
+"azIWpU3yw5","aL6AJtlILt","CdyBVrKDLJ","RzaZAuQIcz","RzaZAlm0pD","lj07QZzJHW","aFFss7fKYU","0KyfsHfyNQ","Ta8f6mX2GE","bgJAzWmadA",
+"EdBKcatef2","BCxeCpT8wu","8cVD3KsjRK","oQ87rYh1hF","b29RJTCgPp","zqH0WlH1kt","KsjRKiwzGk","BGaQYRACuj","9rlg9faHir","WmadApmeCd",
+"fqypyS2Dfu","yvOMIlCMxy","b29RJAXpwE","MmKGJ2DREs","pT8wu5Namm","Gv3FqQYxC0","9rlg91v5hH","kB5nPtl72W","kB5nPs7Mxk","DLhzMgjUTu",
+"StlDJS2Dfu","tvdkDVjCZq","Pb1paBpYhV","D6rBy8U2nU","8xEKzzFgtB","QYxC0i3pyd","rKDLJlsQGo","RACujCfgr3","zmLYDpv0i7","RkQkeaez9y",
+"NOHszazIWp","pmeCdCNHmv","16lHcKr8ys","uAWypYOfrY","8FmFHS2Dfu","5NammSjskQ","Nxx9VTCgPp","hUTw7nnP8o","45cIHY1mC0","lj07QfcwDa",
+"FGzgplpF6W","rz7UtRsQUq","5IhmGWaim6","9y4lwi7WMQ","IKxdLciuWz","0MR5XRsQUq","ydG8UQworu","nnP8oQssNC","JXljWZhwG1","gf8rIpiJSk",
+"ksJbytlILt","pFrrlSmGzv","CK5W7KsjRK","RmDcr2TRI7","FFDuiW3VFH","ulk418hJdt","PYBf48hJdt","5ZaEzRmDcr","XyPZNFFDui","hSSvQd7vjM",
+"2hEEUn1pmO","XyPZNIn3NS","WmadAK4GS8","Nxx9VIjTwP","RACujFFDui","07n1cQClRL","uJScXCp3mZ","iKqhrZv7z0","1v5hHWmadA","JIqXiLbRTH",
+"B3qem8FmFH","YOfrYVNCPd","5Drn04dEz6","NAFuwWaim6","2TRI7ogLgc","StlDJRzaZA","0YAGHiKqhr","MaJQsWPmlx","55rfBuTacx","v2eC3m4bxU",
+"s4786zqH0W","B3qemkZANm","Ta8f6QClRL","MezSWB3qem","7Ow5CTa8f6","6AFT0vkCHH","TXQ0Z14FLR","WmadANcICA","5Drn0618Di","h1zcHpT8wu",
+"suY4xDG4sT","JkzUnzFgtB","pAhR1O3iyQ","JJs5m9eoRc","yToGWn8pJ9","jeskSgdQsS","ZUnqt1j5L8","m4bxUUvlv4","Vprf2Ul4a1","QWxoTKsjRK",
+"FnPFBdQ586","y94nw16lHc","tuDySokgRi","JXljWuAWyp","i3pyd55rfB","wiHrZFxX9q","ni2v1Y1mC0","F6PT2FPfSE","d7vjMTwano","NhXdu8xEKz",
+"Ss0ZuYh1hF","y94nwuoStw","NcICAxciqp","CdyBVhSSvQ","mz8gxAgJHQ","JXljWKsjRK","n1pmOThjNn","8FmFHNhXdu","QYxC0tAOsr","tAOsrX6Pin",
+"XflUqOUYuF","ulk41gIYvE","RBhp00h1b1","QWxoTNOHsz","bZLvStuDyS","jtn0XdmoS7","8cVD3l83Ud","xXTI4IBe8k","JXljWFnPFB","ciuWzK20wK",
+"rhl0J7fsYM","Uvlv4RmDcr","s4786zmLYD","K20wK48cHL","lm0pDGv3Fq","VBjhzsuY4x","kB5nPUlU3M","aFFssYjB9t","QYxC0Chuy3","8U2nUJkzUn",
+"GSQwjsuY4x","9eoRcuZPqg","KsjRKru4UG","RkQkepWiOs","M6qcGaL6AJ","yvOMIQssNC","X6Pin3weIF","gjUTulH1kt","7fKYUhE1Ql","Ta8f6RkQke",
+"hUTw7ulk41","07n1c3otm6","64s8NUmaEv","0BmCyGrDg7","0YAGHs4786","5ZaEzCfgr3","RsQUqNAFuw","k85AeiwzGk","NOHszIBe8k","RpBQmZv7z0",
+"Rxrsm0h1b1","iwzGk5VZjS","XyPZNcmXIX","rz7UtDLhzM","FhtglogLgc","3weIFQWxoT","uPX7GjSjS3","RsQUqJIqXi","POUYSwDajX","cQOnvguMb8",
+"5drc6taOXK","5NammStlDJ","ZUnqtMezSW","EoToPEoToP","KsjRK5Drn0","oGu6x8xEKz","dhSuHP6bcg","Mkgy81LB1L","6q6L9zz4ZU","iB08lUl4a1",
+"64s8N45cIH","618DiIn3NS","JIqXiD6rBy","uQIczDcpWB","jeskSIRh48","64s8N9y4lw","ZUnqtVBjhz","nnP8o45cIH","gf8rIL7cGc","IKxdLMkgy8",
+"WDVWJydG8U","5nmWvfmIK1","uvf7ALewvM","lpF6WSmGzv","t59lR5iGN5","0ao3luTacx","aez9yTXQ0Z","3weIF5Mg9r","IBe8kzHF1q","7ku1pWaWsv",
+"MojnPpv0i7","Gv3FqblLA9","zFgtBBFkb8","FFDuiBCxeC","uJScXsoy9t","brhlQo8Uyd","aDGtSs93Ml","ogLgcUl4a1","lViBvS2Dfu","bZLvSHfyNQ",
+"piJSkd7vjM","618DioQ87r","5Drn0lCMxy","jtn0XoVQp6","9eoRc24ARF","Yf2EcECMvU","nnP8oqaofN","RpBQm0h1b1","euZA5jeskS","4QMc9FGzgp",
+"KASQ8vOqCE","ZhwG1Mm8si","IRh48uTacx","07n1cJRJQB","8hJdtlpF6W","fqypyQ6Lix","zmLYD2ZHdk","GrDg7U3yw5","X6PinCIShG","K20wK5Drn0",
+"ReKEWMmsIo","FxX9q8xEKz","e6e4zAkKTk","qUJMd0BmCy","nnP8o2Nslm","RkQkeRACuj","VjCZqQYxC0","uQIczlH1kt","8RCUAk85Ae","rhl0Jni2v1",
+"8xEKzwiHrZ","hUTw7KASQ8","Z4I1v7fKYU","yvOMI5VZjS","v2eC3MaJQs","gf8rIKsjRK","M3zXLGv3Fq","gdQsSMkgy8","v8yFNMmsIo","L7cGcQ6Lix",
+"dhSuHBpYhV","OUqFM5drc6","xReecKr8ys","Dz1R3RmDcr","AkKTkNcICA","uN6r3dQ586","lViBv4dEz6","d85a9SmGzv","fFDrJSmGzv","SmGzvZuDtD",
+"Ul4a124ARF","I7p2apWiOs","sqVrfru4UG","6AFT0BpYhV","2ZHdkZUnqt","GrDg7In3NS","fqypyCIShG","CIShGrz7Ut","zbIYY9iGoT","IKxdLSs0Zu",
+"45cIHIn3NS","BbwgAZJTXH","xReec2TRI7","faHirChuy3","Nxx9Vi3pyd","JXljWW3VFH","tlILtlH1kt","yluBxYh1hF","gtCA5gf8rI","VjCZqIn3NS",
+"6AFT0FjHXR","uLtKsyofH3","NcICAlXFOB","7ku1pAkKTk","SWfouGWqqX","OUqFMOxWIH","gtCA5IKxdL","AmdQddpe1v","OUqFMLDk6f","M6qcGTCgPp",
+"yofH3iKqhr","VLTy67hyVv","vLsmSTXQ0Z","QWxoTSbRYy","oGu6xKASQ8","D6rBy1j5L8","WMiS37X3uy","FjHXRt98iW","b29RJpmeCd","8RCUA0Kyfs",
+"Zv7z05drc6","euZA5W3VFH","B3qemCxVEf","h1zcHMK07Y","Kr8ysxXTI4","oQ87rogLgc","Uvlv4dpe1v","RmDcrNcICA","9GXkX4W0Tl","qaofNpAhR1",
+"2hEEUru4UG","XflUqlkMUA","P6bcgyofH3","zQt6QQnJ1S","Ss0Zuy94nw","VBjhz5VZjS","CK5W714FLR","MaJQsqaofN","IjTwPQClRL","lkMUAC2Irc",
+"AgJHQdjsrv","7fKYUBGaQY","lCMxyVIlwP","VIlwPMojnP","nFqik8U2nU","NhXdul83Ud","d85a94QMc9","6AFT0JRJQB","x3LDeFxX9q","s93MlWaim6",
+"DLhzMC2Irc","OHaBzHRxd8","uupzkJJs5m","S2DfuqUJMd","M3zXLydG8U","5ZaEzpmeCd","7Ow5CPYBf4","9y4lwJKWYR","JXljWgf8rI","U3yw5LewvM",
+"aDGtSRxrsm","atef2bZLvS","Yf2Ec580YD","cShY2dmoS7","QnJ1SGWqqX","pv0i7JkzUn","YOfrYfqypy","48cHL8xEKz","uTacxgdQsS","iB08l2Nslm",
+"Kr8ysG1RhS","djsrvX6Pin","D6rByaL6AJ","14FLRJJs5m","i3pydlm0pD","NAFuwjfREu","v8yFNnnP8o","cQOnvMmsIo","CxVEfHP433","aez9yM6qcG",
+"QworuO3iyQ","7hyVvbZLvS","6q6L9BbwgA","sqVrfzQt6Q","WMiS37Ow5C","bZLvSEoToP","DcpWBd85a9","Mkgy89eoRc","CxVEfAIYUu","NOHszOUqFM",
+"aL6AJmz8gx","n1pmOZ4I1v","4dEz6MGlTF","GXdoHSmGzv","RBhp0VBjhz","sqVrf2hEEU","NhXdu0Kyfs","Kr8ys9XyT9","cmXIXcShY2","5Mg9rRkQke",
+"4QMc9lpF6W","FhtglWaWsv","lweGyMaJQs","n8pJ9ZJTXH","fLNg8580YD","mz8gxFwEJz","xXTI4Cfgr3","5ZaEzM3zXL","EdBKcv2eC3","NhXduvkCHH",
+"Cp3mZx3LDe","fcJOyFFDui","FxX9q5ZaEz","s4786nnP8o","gdQsSStlDJ","d85a9MmsIo","LewvMulk41","0PktI24ARF","Mm8siNAFuw","aez9yChuy3",
+"Chuy3v1Hln","C2IrcgdQsS","3weIFyEfy9","UmaEvCNHmv","t59lRSWfou","GSQwjatef2","NAFuwcmXIX","iqv4k9GXkX","fcwDan8pJ9","S77LHUvlv4",
+"OUqFMfcwDa","5NammjfREu","zbIYYW3VFH","2hEEUUmaEv","WmadAFnPFB","blLA9cL0aE","45cIHh1zcH","lXFOBhSSvQ","lCMxypFrrl","oGu6x8FmFH",
+"xciqp0YAGH","24ARF48cHL","ydG8UaDGtS","QChxsuLtKs","Vprf2pmeCd","3otm6OUqFM","SbRYyoGu6x","VIlwPNhXdu","Qworuni2v1","CqqaDi7WMQ",
+"BpYhVCK5W7","guMb8lsQGo","jiVBPM6qcG","uZPqgMmsIo","KASQ89y4lw","soy9t5Namm","HRxd8jS1aj","9GXkX7fsYM","JKWYRG1RhS","hE1QlBFkb8",
+"RkQkelm0pD","ciuWznnP8o","2NslmGSQwj","KASQ8IjTwP","29QAzix74r","2NslmCxVEf","fLNg8IBe8k","Dz1R3CdyBV","FhtgltjQxs","7X3uyy94nw",
+"QWxoTRmDcr","LbRTHgtCA5","aFFsslj07Q","i7WMQVIlwP","7fKYUWmadA","0MR5XaL6AJ","uN6r3D6rBy","W7cTstAOsr","bgJAzydG8U","zmLYDLewvM",
+"qUJMdIKxdL","2hEEUpiJSk","QnJ1SpmeCd","nFqikuZPqg","dmoS7Waim6","okgRiHzZT8","Cfgr3Qworu","1j5L8Oz8yZ","0YAGHOz8yZ","8U2nUO3iyQ",
+"7hyVvwDajX","iqv4khi5X7","WmadA5VZjS","IBe8kIjTwP","AgJHQsx5Gl","8xEKzYh1hF","XflUqhYBCK","Ta8f6FxX9q","zbIYYt98iW","7fKYUuJScX",
+"aez9ypT8wu","jS1aj5drc6","NAFuwyEfy9","Cfgr35Mg9r","5Drn0Fhtgl","HfyNQUvlv4","zFgtBv8yFN","tvdkDokgRi","5VZjSTXQ0Z","5Mg9rpvgjS",
+"VjCZqFFDui","IRh48VjCZq","StlDJ618Di","uLtKsQWxoT","h1zcHtaOXK","prNT60MR5X","s4786YjB9t","JJs5m1v5hH","Cp3mZqUJMd","WaWsvmz8gx",
+"s93MlIBe8k","B3qemVNCPd","dpe1vcL0aE","FGzgpU3yw5","OUYuFOxWIH","OUqFMZ4I1v","1v5hH6q6L9","RzaZATCgPp","xXTI4TXQ0Z","jfREuvLsmS",
+"lH1kt7ku1p","X6PinJ2mQi","GrDg7FjHXR","J2mQiQWxoT","tjQxs3otm6","zz4ZUd7vjM","BCxeCU3yw5","uN6r3wDajX","FGzgpRxrsm","Pb1paprNT6",
+"BbwgAydG8U","FGzgpCIShG","yEfy9kZANm","2hEEUG1RhS","5IhmGZ4I1v","kB5nPCfgr3","ZUnqtix74r","Y1mC0JXljW","dmoS7DcpWB","Gv3FqIBe8k",
+"NAFuwMkgy8","zqH0WFPfSE","QClRLQClRL","KASQ8POUYS","d7vjMpAhR1","cmXIXRBhp0","bZLvShUTw7","MmKGJHP433","uvf7AuZPqg","9eoRcRsQUq",
+"G1RhSyvOMI","YjB9tlCMxy","uQIczMojnP","lkMUAzQt6Q","uLtKseuZA5","ksJbyo8Uyd","Z4I1vuN6r3","v8yFNJKWYR","brhlQThjNn","vkCHHRsQUq",
+"ix74rjS1aj","azIWpVIlwP","KASQ8lXFOB","Z4I1viqv4k","SjskQpmeCd","NcICAlsQGo","DG4sTpFrrl","AkKTkM3zXL","b29RJCNHmv","580YDHP433",
+"fcwDaDcpWB","8RCUA1j5L8","RBhp0ReKEW","VjCZqQChxs","WPmlx24ARF","rz7UtB3qem","6q6L9Kr8ys","ciuWzHlUbF","IBe8kcShY2","LewvMl83Ud",
+"S2DfuGWqqX","8cVD3IRh48","EdBKcYf2Ec","AkKTkzY1GY","guMb8D6rBy","0KyfsfmIK1","SbRYyFwEJz","JXljWlViBv","lsQGoS77LH","euZA5a00b5",
+"yluBxiKqhr","ydG8UrKDLJ","oVQp6vLsmS","blLA9ix74r","HRxd8AXpwE","J2mQi0PktI","IKxdLFjHXR","rhl0JzY1GY","sqVrfokgRi","fqypykZANm",
+"t59lRS2Dfu","CK5W7RmDcr","lH1ktXflUq","In3NSAIYUu","8RCUAdhSuH","ru4UGpAhR1","gIYvEbgJAz","s4786M3zXL","2Yz7EksJby","8RCUAfFDrJ",
+"fcwDaHP433","yToGW0YAGH","2Nslm0h1b1","Kr8ys3otm6","zHF1q5drc6","ni2v1m4bxU","5VZjSgdQsS","IRh48n8pJ9","RpBQmP6bcg","zY1GYQssNC",
+"uoStwxXTI4","2ZHdkIn3NS","7hyVvpmeCd","0h1b1S77LH","8FmFHbgJAz","RzaZAX6Pin","FPfSE4W0Tl","rKDLJFPfSE","bZLvSoQ87r","JIqXih1zcH",
+"cmXIX7fsYM","hE1QlbgJAz","Mkgy88RCUA","zFgtB5Mg9r","M3zXL8hJdt","CNHmv618Di","JkzUnMaJQs","AgJHQQClRL","iqv4kJXljW","uJScXbgJAz",
+"2hEEUQnJ1S","cmXIXs93Ml","BGaQYaez9y","6q6L9d85a9","tuDySsoy9t","blLA9KASQ8","ni2v19XyT9","CIShGHlUbF","7ku1pSjskQ","v2eC33otm6",
+"3weIFM3zXL","hUTw7tuDyS","lXFOBSjskQ","piJSkuZPqg","ix74r55rfB","hYBCKpFrrl","Nxx9VMezSW","5iGN5W3VFH","24ARFOHaBz","oGu6xdQ586",
+"BGaQYRBhp0","lsQGoqQxHP","Nxx9VYf2Ec","zz4ZUzFgtB","n8pJ9nFqik","pAhR1JRJQB","QworuHfyNQ","i3pydmX2GE","LDk6fgf8rI","zQt6Q5Mg9r",
+"StlDJgjUTu","C2IrcAmdQd","G1RhS2hEEU","FjHXRPb1pa","Q6hMCIKxdL","fFDrJwDajX","1j5L8hYBCK","JRJQBazIWp","hi5X7rKDLJ","In3NSgtCA5",
+"ni2v1Dz1R3","IBe8kO3iyQ","4QMc91v5hH","jeskSWreyP","tlILt5Drn0","CqqaDJRJQB","hSSvQ4W0Tl","0YAGH7Ow5C","OxWIHS77LH","U3yw5ogLgc",
+"NAFuwVIlwP","taOXKjtn0X","W7cTsNOHsz","blLA92DREs","W3VFHyvOMI","dhSuHaDGtS","Ss0ZutuDyS","8cVD3fLNg8","MojnPDz1R3","CxVEfMkgy8",
+"jSjS38FmFH","Yh1hFCfgr3","7Ow5CK20wK","HzZT8GXdoH","B3qemAIYUu","uLtKshE1Ql","EoToPkB5nP","6AFT0jtn0X","8U2nUlm0pD","48cHLNAFuw",
+"7lUXZReKEW","zqH0WFhtgl","HP433uN6r3","prNT67Ow5C","hSSvQlj07Q","zmLYDD6rBy","DG4sTTCgPp","wiHrZQssNC","8hJdteuZA5","Chuy3uupzk",
+"lCMxyblLA9","14FLRCIShG","VLTy6AkKTk","P6bcga00b5","gtCA5GWqqX","M3zXLVLTy6","Cfgr3kB5nP","ulk41VNCPd","5IhmGCIShG","ReKEWhE1Ql",
+"xciqp7X3uy","zHF1qn1pmO","xXTI4VerEA","AkKTkThjNn","bZLvSX6Pin","XflUq9eoRc","lsQGodhSuH","XyPZN7ku1p","HRxd8xReec","FhtglJkzUn",
+"v8yFNs4786","IBe8kazIWp","bgJAzUmaEv","ogLgcBbwgA","AIYUuTXQ0Z","5Mg9rgIYvE","FxX9q2Yz7E","BpYhVeuZA5","DQimpuAWyp","n8pJ99rlg9",
+"0PktIVLTy6","pv0i7mz8gx","5iGN5fLNg8","8cVD3Nxx9V","Waim6SWfou","580YD5iGN5","s7MxkvOqCE","618DiAgJHQ","soy9tJKWYR","9iGoTm4bxU",
+"uTacxIRh48","OUYuFuZPqg","qUJMdaL6AJ","3weIFfcwDa","3otm6Cfgr3","Zv7z0IKxdL","uQIczJXljW","AmdQd0YAGH","VIlwPJKWYR","cQOnvhYBCK",
+"oVQp6hSSvQ","FnPFBLbRTH","6q6L9faHir","zFgtBgjUTu","h1zcHWreyP","7hyVvYf2Ec","uJScXWmadA","h1zcHni2v1","piJSktl72W","tjQxs7fsYM",
+"l83UddQ586","djsrvVIlwP","ReKEWpT8wu","07n1cQYxC0","M3zXLgdQsS","XyPZNsoy9t","d85a9zY1GY","lXFOBMGlTF","atef25drc6","AOgEeFnPFB",
+"pT8wuqQxHP","hSSvQgjUTu","14FLRdjsrv","uJScXzQt6Q","SjskQfmIK1","kB5nPB3qem","P6bcgbrhlQ","xXTI4uvf7A","i3pydd7vjM","Mm8sia00b5",
+"lViBvtjQxs","v8yFN5Namm","guMb8Uvlv4","1LB1L2Nslm","S2DfuOxWIH","fcJOyKASQ8","yvOMIqQxHP","CNHmvWmadA","8cVD3GSQwj","aL6AJQbxXc",
+"5iGN5qaofN","5nmWvMkgy8","WaWsvgtCA5","nnP8ouAWyp","EoToPMm8si","oVQp64QMc9","TXQ0ZyvOMI","AXpwEwiHrZ","8cVD3fFDrJ","uoStwCIShG",
+"NhXduxXTI4","OxWIH55rfB","7fKYUW7cTs","ydG8UHfyNQ","suY4xQssNC","XyPZN2Yz7E","FwEJzl83Ud","lm0pDv8yFN","0PktIRACuj","o8UydwDajX",
+"uTacx48cHL","okgRiMm8si","W7cTskZANm","zmLYDNAFuw","lsQGopvgjS","AgJHQAmdQd","lH1ktPYBf4","FLsphFhtgl","C2IrcprNT6","aL6AJAgJHQ",
+"0MR5X64s8N","CxVEfK4GS8","mz8gxaL6AJ","hSSvQVNCPd","AmdQd5Drn0","iqv4kNo0Qb","azIWplweGy","WreyPWaim6","i3pydReKEW","tl72Wrhl0J",
+"RmDcrogLgc","IRh4816lHc","nFqikFjHXR","lpF6Wpv0i7","ni2v1hE1Ql","uPX7GZzJHW","KsjRKtuDyS","4W0TlOz8yZ","W7cTsnlaBy","lH1ktjzUqR",
+"IjTwPVIlwP","Waim61v5hH","MGlTFi7WMQ","2TRI714FLR","NcICAMmKGJ","QWxoTS77LH","uTacxUvlv4","QnJ1Sl83Ud","IBe8k8TxD7","CIShGhYBCK",
+"pv0i7BGaQY","nFqik24ARF","EoToPl83Ud","48cHLjfREu","Yf2EcuoStw","ciuWzYOfrY","uTacxWreyP","djsrvMGlTF","5drc6Y1mC0","WPmlxGWqqX",
+"yluBxZUnqt","vLsmSfcwDa","zY1GYrKDLJ","1LB1LCNHmv","qaofNciuWz","tuDySYOfrY","atef23weIF","XyPZNFxX9q","0BmCyHzZT8","he9IAxciqp",
+"9iGoTuPX7G","v8yFNzmLYD","618DiJRJQB","ni2v1AXpwE","G1RhS1j5L8","HP433VNCPd","S77LHAmdQd","BFkb88cVD3","1LB1Lix74r","Qworu9y4lw",
+"W3VFHI7p2a","blLA9J2mQi","taOXK7lUXZ","v2eC3KZamH","n8pJ9xReec","CxVEf8cVD3","W3VFHDQimp","EdBKc9iGoT","F6PT2tuDyS","Q6Lixjtn0X",
+"Waim6GWqqX","0PktI45cIH","5IhmGl83Ud","fqypy4W0Tl","0Wr5y7ku1p","FGzgpGWqqX","pFrrlYw2oU","WmadARBhp0","PYBf4AgJHQ","5ZaEzyvOMI",
+"uQIczIBe8k","DQimpFxX9q","FwEJzru4UG","CqqaD7fKYU","lkMUAxciqp","VNCPdM3zXL","tlILtzY1GY","FLsphb29RJ","vOqCEQClRL","v2eC3e6e4z",
+"LbRTHjtn0X","48cHLMK07Y","ru4UGPOUYS","7hyVvtjQxs","5ZaEzjtn0X","t98iWJIqXi","Yw2oUF6PT2","POUYSOxWIH","9iGoTzz4ZU","okgRifaHir",
+"HlUbFSWfou","JRJQBYjB9t","kB5nPtuDyS","StlDJQworu","29QAzCdyBV","s4786M6qcG","zY1GYRkQke","FwEJzCK5W7","BpYhVMGlTF","zHF1qRBhp0",
+"BFkb8hi5X7","WDVWJzbIYY","Yw2oUuZPqg","QnJ1ScmXIX","zz4ZU45cIH","Z4I1vblLA9","JJs5mGv3Fq","WPmlxzY1GY","CqqaDRkQke","ZJTXHSWfou",
+"No0QbzmLYD","OxWIHDLhzM","OHaBziKqhr","SmGzvQClRL","G1RhS8xEKz","ogLgcP6bcg","tl72W4QMc9","lm0pD5Namm","618Dihe9IA","Yh1hFFjHXR",
+"AkKTkW3VFH","MezSWydG8U","VBjhzpvgjS","HRxd8LDk6f","jtn0XGSQwj","6q6L9gdQsS","Q6Lix5Drn0","ZJTXHaez9y","mX2GEdpe1v","hYBCKnnP8o",
+"ZzJHWfFDrJ","MGlTFTwano","L7cGcMkgy8","jzUqRcmXIX","gtCA5VIlwP","DQimpY1mC0","o8UydB3qem","cL0aEWaim6","8U2nU4dEz6","lweGyy94nw",
+"tjQxs7fKYU","ciuWzGrDg7","MaJQsix74r","2ZHdkcShY2","5IhmGqQxHP","yofH3gIYvE","5iGN5pT8wu","24ARFuTacx","ogLgcFxX9q","gdQsSPOUYS",
+"8RCUARsQUq","9GXkXn1pmO","G1RhSuAWyp","fcJOyoVQp6","cL0aEOUYuF","pT8wuiKqhr","ogLgctvdkD","7lUXZG1RhS","RmDcrMmKGJ","aez9ymz8gx",
+"4QMc9RkQke","5IhmGuN6r3","618Dih1zcH","TXQ0ZXflUq","Twanozz4ZU","o8UydfFDrJ","VNCPdAOgEe","bZLvSS2Dfu","0Wr5y9iGoT","dpe1vjeskS",
+"vOqCE8cVD3","CxVEfNOHsz","IBe8kgtCA5","euZA5W7cTs","fcwDazbIYY","QbxXche9IA","hSSvQUlU3M","8RCUAQ6hMC","ru4UGOHaBz","45cIH07n1c",
+"BbwgAP6bcg","KASQ8brhlQ","KASQ85nmWv","WPmlxpWiOs","1v5hHY1mC0","2Yz7EJXljW","ZzJHWqUJMd","MK07YZzJHW","StlDJBCxeC","hUTw7Cp3mZ",
+"KASQ8xXTI4","mX2GEDcpWB","1j5L8blLA9","EoToP580YD","nFqikZhwG1","0YAGH55rfB","ulk412ZHdk","iB08lcL0aE","4W0TlsuY4x","StlDJuAWyp",
+"CK5W7QYxC0","IRh48WPmlx","yToGW8RCUA","J2mQiZUnqt","RBhp0lH1kt","BbwgAhUTw7","1v5hHzFgtB","xXTI46AFT0","W3VFHiwzGk","hSSvQWPmlx",
+"14FLR45cIH","KASQ8580YD","GrDg7yToGW","580YD6AFT0","2DREsKr8ys","HP433qQxHP","QworuUmaEv","cL0aE7ku1p","DG4sTFcWrW","azIWp7fsYM",
+"JRJQBzqH0W","IjTwP8xEKz","lXFOBZuDtD","JJs5mn8pJ9","FVMxotAOsr","0PktIIjTwP","Mkgy8uPX7G","1j5L8QnJ1S","G1RhSn8pJ9","lkMUAnnP8o",
+"0BmCyUl4a1","1j5L8hi5X7","O3iyQpmeCd","Dz1R3OUqFM","FcWrWjiVBP","5ZaEzJkzUn","WaWsvIKxdL","618Dilj07Q","cL0aEFFDui","FwEJzlpF6W",
+"FLsph7X3uy","uQIczcL0aE","0Wr5y07n1c","5nmWvs7Mxk","WDVWJlXFOB","hi5X7SjskQ","FVMxoiwzGk","SWfouP6bcg","Yf2EcRsQUq","QWxoTStlDJ",
+"CNHmvpAhR1","ZJTXHazIWp","uPX7GHzZT8","9rlg9s93Ml","64s8NiwzGk","TwanoMm8si","dpe1v9XyT9","yEfy9m4bxU","NhXduFNYIM","9eoRcKASQ8",
+"JRJQBWaim6","NAFuwJIqXi","zz4ZUiB08l","Waim6MmsIo","s4786BGaQY","TCgPpAOgEe","NAFuwK4GS8","Cfgr3nFqik","fqypyksJby","FNYIMThjNn",
+"MK07YI7p2a","SjskQVNCPd","Ta8f6UlU3M","HlUbFs7Mxk","pv0i7lXFOB","i7WMQ8hJdt","vOqCEUlU3M","Yf2EcFxX9q","vOqCENOHsz","aDGtSpWiOs",
+"FVMxosqVrf","iB08lt98iW","FjHXRix74r","Vprf2lweGy","iKqhr16lHc","29QAzpFrrl","WreyP5IhmG","Mm8siokgRi","JRJQBFLsph","jzUqRfqypy",
+"cShY2Yh1hF","NOHszBpYhV","DQimpQ6Lix","iqv4k8xEKz","aFFssKZamH","TwanoL7cGc","piJSklweGy","bZLvSv8yFN","blLA9pmeCd","QbxXcxXTI4",
+"y94nwlm0pD","5IhmGB3qem","FFDuiO3iyQ","vOqCEQChxs","W3VFHeuZA5","RpBQmzHF1q","ECMvUe6e4z","e6e4zxReec","x3LDe4dEz6","2ZHdkRmDcr",
+"oGu6xBbwgA","Waim6UmaEv","dhSuHO3iyQ","i7WMQHlUbF","QYxC05drc6","NAFuwzFgtB","s7MxkDz1R3","dmoS745cIH","J2mQiBCxeC","OHaBzTXQ0Z",
+"GXdoHzHF1q","QnJ1SdhSuH","RmDcrNOHsz","k85AeK4GS8","v2eC3BFkb8","6q6L9yEfy9","MaJQss4786","8FmFHOHaBz","B3qemjeskS","JKWYRECMvU",
+"i7WMQmz8gx","BFkb88hJdt","BpYhVSjskQ","ix74r2ZHdk","prNT6BpYhV","RsQUqlweGy","guMb8AIYUu","WDVWJP6bcg","0Wr5yRmDcr","oGu6xQChxs",
+"YOfrYgjUTu","fLNg8bZLvS","djsrv64s8N","7X3uy7hyVv","QWxoT9rlg9","yofH3rhl0J","iB08lJIqXi","ni2v1brhlQ","HRxd85IhmG","WPmlx1v5hH",
+"8hJdtCK5W7","uZPqga00b5","lsQGocL0aE","lsQGotaOXK","yluBxiB08l","VNCPdtl72W","pvgjSuPX7G","TwanohYBCK","vkCHHv8yFN","uJScXtaOXK",
+"JJs5m2TRI7","zbIYYlweGy","9iGoTlm0pD","S2DfuzbIYY","580YD0YAGH","uQIcz7fsYM","FNYIMSbRYy","djsrv0PktI","jSjS3hYBCK","DLhzMYw2oU",
+"UmaEvjeskS","tvdkDgIYvE","pmeCdQbxXc","OUqFMRmDcr","SbRYyTXQ0Z","brhlQiqv4k","a00b5aL6AJ","lsQGoIBe8k","uN6r3bgJAz","iKqhrs7Mxk",
+"S77LHJXljW","NhXduRACuj","WmadAB3qem","45cIHs4786","HlUbFIRh48","yToGWDLhzM","tvdkDMGlTF","WmadACqqaD","OUYuFGSQwj","FcWrWy94nw",
+"5IhmGOxWIH","YOfrYUl4a1","rhl0JFwEJz","Chuy3FFDui","5Mg9rs4786","LDk6fy94nw","F6PT2ni2v1","5NammBGaQY","0Wr5yDQimp","48cHLVjCZq",
+"IRh48JJs5m","O3iyQcQOnv","CqqaDQ6Lix","aL6AJRmDcr","WreyPUl4a1","iqv4kVLTy6","Pb1paJ2mQi","OxWIHJRJQB","taOXKlm0pD","Cp3mZ4QMc9",
+"hUTw7gf8rI","W3VFHdhSuH","brhlQUlU3M","tjQxsOHaBz","qaofNZuDtD","YjB9toVQp6","K20wKtvdkD","zFgtBRzaZA","VerEAsuY4x","U3yw53otm6",
+"zbIYYlCMxy","XflUqHRxd8","EoToPCfgr3","DG4sTiKqhr","YjB9tNo0Qb","y94nwvkCHH","EdBKcEdBKc","uN6r3okgRi","Twano5IhmG","zmLYDjzUqR",
+"hi5X7t59lR","BpYhVO3iyQ","Pb1paIjTwP","GSQwjpv0i7","ksJbyh1zcH","YOfrYjzUqR","3weIFogLgc","24ARFlCMxy","NAFuwZuDtD","BbwgAgdQsS",
+"1v5hHGrDg7","oVQp6piJSk","uvf7A2ZHdk","fqypyHfyNQ","O3iyQCxVEf","hE1Qlm4bxU","qaofNbrhlQ","piJSkx3LDe","TXQ0ZU3yw5","pWiOsdQ586",
+"s4786ni2v1","uLtKsG1RhS","RkQke8xEKz","lXFOBDG4sT","MaJQsnnP8o","jtn0XQ6Lix","0MR5XRkQke","1j5L8prNT6","MezSWVLTy6","hUTw7QssNC",
+"taOXKIRh48","tl72WIn3NS","qaofN4W0Tl","nFqikKr8ys","wiHrZMmsIo","dQ586ru4UG","Zv7z0cmXIX","KZamH9y4lw","BGaQY8TxD7","WmadANo0Qb",
+"9eoRcazIWp","DLhzMJIqXi","G1RhSK4GS8","2hEEU2hEEU","Q6hMCaDGtS","AIYUuW7cTs","qUJMdCNHmv","d7vjM618Di","EdBKcYw2oU","zz4ZUXflUq",
+"6AFT0ReKEW","EOE1ocL0aE","Kr8ysMojnP","nFqikSbRYy","BpYhVgjUTu","QbxXc48cHL","8cVD37Ow5C","Pb1paHfyNQ","uQIczChuy3","CxVEf64s8N",
+"14FLRatef2","HlUbF0h1b1","tvdkD5VZjS","lCMxyLbRTH","Z4I1vaFFss","5Drn0I7p2a","VBjhzUlU3M","rKDLJQ6Lix","nnP8otaOXK","9GXkXDLhzM",
+"vOqCE7X3uy","FVMxoAgJHQ","ZzJHWokgRi","MmsIouvf7A","v1HlnJXljW","2DREsuupzk","618Di0BmCy","TCgPpmz8gx","pFrrl2ZHdk","euZA5NAFuw",
+"QworuTwano","xReecZJTXH","NOHszRBhp0","CxVEfcL0aE","6q6L9lViBv","1LB1L1LB1L","MojnPP6bcg","5Drn0hUTw7","GXdoHQnJ1S","X6PinpAhR1",
+"lpF6WiKqhr","16lHcX6Pin","KsjRKv2eC3","DQimp48cHL","7hyVvs4786","y94nwDz1R3","JRJQBG1RhS","jeskSNhXdu","pvgjSlpF6W","suY4xlsQGo",
+"t98iW14FLR","1j5L85drc6","FPfSE0YAGH","s4786CK5W7","fqypytvdkD","QssNC29QAz","9iGoTP6bcg","zz4ZUMK07Y","0h1b1EdBKc","ru4UGThjNn",
+"t59lRRACuj","RkQkeBCxeC","pmeCdoGu6x","W7cTsgIYvE","CNHmvFhtgl","yvOMIX6Pin","GSQwjn1pmO","RACujEOE1o","Yh1hF5Mg9r","5IhmGFxX9q",
+"hSSvQVprf2","16lHcVprf2","hE1Ql24ARF","oVQp6lsQGo","W3VFHYOfrY","HRxd8wiHrZ","5iGN5ix74r","WreyPXflUq","d7vjMcmXIX","ogLgcqaofN",
+"16lHcGv3Fq","I7p2aMaJQs","Oz8yZ8TxD7","K20wKSWfou","FcWrWMmsIo","OHaBzv1Hln","yvOMIVLTy6","5Mg9rRpBQm","GSQwjNcICA","D6rBynlaBy",
+"In3NS7X3uy","sqVrfNo0Qb","K20wKGrDg7","NcICARsQUq","5iGN5SbRYy","QssNCkB5nP","FNYIMYf2Ec","DQimpIRh48","JJs5mbZLvS","aez9yBpYhV",
+"bZLvSFxX9q","Ul4a1uAWyp","FVMxoxReec","bgJAzFNYIM","XflUqFcWrW","cL0aEAXpwE","yToGWcShY2","U3yw59eoRc","JkzUnYOfrY","pT8wu3otm6",
+"RACujEoToP","9iGoTfcwDa","JKWYRFjHXR","M6qcGCfgr3","MK07YYOfrY","lH1ktSjskQ","jzUqR55rfB","4W0TlLewvM","DG4sT9eoRc","Dz1R3Yh1hF",
+"xXTI4m4bxU","iqv4kSs0Zu","lweGypvgjS","VNCPdjSjS3","ydG8U9rlg9","x3LDeWDVWJ","zbIYYl83Ud","hUTw7yofH3","FcWrW5Drn0","iwzGkdQ586",
+"oGu6xuAWyp","OUqFMyofH3","FFDuitAOsr","D6rBy8hJdt","YjB9tzqH0W","vOqCEeuZA5","CK5W7FxX9q","ydG8UqQxHP","Zv7z0CIShG","atef20Kyfs",
+"uupzkblLA9","iwzGkuTacx","aFFss4QMc9","9iGoTciuWz","9rlg9JIqXi","FGzgpIjTwP","uoStwPYBf4","WMiS3zmLYD","rKDLJsx5Gl","5IhmGtjQxs",
+"0h1b1YjB9t","5IhmGGrDg7","0ao3ls4786","aDGtSzz4ZU","yluBxuLtKs","0YAGH8hJdt","vLsmSWPmlx","618Didpe1v","taOXKFhtgl","WaWsvgdQsS",
+"EdBKcY1mC0","Yf2EckZANm","uvf7A8RCUA","hYBCKO3iyQ","HRxd855rfB","WPmlxlm0pD","oVQp65VZjS","e6e4zWaWsv","aez9yEdBKc","K20wKuoStw",
+"9iGoTWaim6","Dz1R3zz4ZU","580YDdQ586","ThjNnPOUYS","0h1b1yluBx","NOHszFFDui","s93Ml24ARF","s4786TXQ0Z","WMiS324ARF","d85a9SbRYy",
+"5Namm9XyT9","cL0aEYf2Ec","7Ow5CiB08l","pT8wuuvf7A","BCxeCK20wK","1LB1LS77LH","FFDuijtn0X","fmIK1oGu6x","9XyT9S2Dfu","ECMvUzHF1q",
+"Chuy32DREs","vOqCEvOqCE","Nxx9VjeskS","dmoS7NhXdu","vOqCEiqv4k","7hyVve6e4z","lCMxy0PktI","zz4ZU5iGN5","AXpwEJKWYR","dQ5869iGoT",
+"FGzgplCMxy","fLNg8UlU3M","AIYUuQ6hMC","BGaQY9XyT9","X6PinJXljW","P6bcg5ZaEz","XflUqJKWYR","8U2nUNo0Qb","No0Qb7fsYM","CdyBV5Mg9r",
+"Waim6wDajX","MezSWvLsmS","07n1cdmoS7","lj07QMkgy8","7fKYUXyPZN","SWfouuJScX","xReecTa8f6","VBjhzOUYuF","GXdoHQWxoT","HzZT8CNHmv",
+"MezSWNOHsz","MaJQsCqqaD","k85Ae0h1b1","Q6LixpAhR1","zqH0WzY1GY","8U2nUqaofN","KsjRKcmXIX","16lHcTwano","ni2v1n1pmO","WPmlxHfyNQ",
+"aL6AJOUYuF","5iGN55VZjS","qQxHP55rfB","pFrrlQChxs","gjUTuk85Ae","9iGoTtlILt","hi5X7fmIK1","tlILtpAhR1","IRh48ECMvU","fcwDaiKqhr",
+"fcJOywiHrZ","qUJMdVNCPd","gf8rI0ao3l","QWxoTJXljW","7fKYUW3VFH","FwEJzQworu","Kr8ysdhSuH","9eoRcVjCZq","uJScXjtn0X","tl72WnFqik",
+"nnP8ociuWz","k85AezFgtB","0MR5XciuWz","HlUbFzY1GY","Oz8yZLewvM","KASQ8jiVBP","mz8gxLDk6f","M6qcGBCxeC","JKWYRRmDcr","djsrv2TRI7",
+"Nxx9VpvgjS","RzaZAh1zcH","lViBvzmLYD","1LB1LFFDui","iwzGkJXljW","i7WMQuoStw","0Wr5yd85a9","J2mQi5drc6","618DiX6Pin","o8UydRBhp0",
+"zmLYDkZANm","mz8gxfaHir","AgJHQOxWIH","5Mg9rFLsph","hYBCK0ao3l","DG4sTVprf2","MGlTFQssNC","iB08lCIShG","SWfouKASQ8","HfyNQuJScX",
+"0YAGHdhSuH","tAOsrWaim6","SWfouv2eC3","nFqikkZANm","CdyBVJXljW","VIlwPCqqaD","4dEz6GWqqX","aFFss4dEz6","lsQGokB5nP","LbRTHiKqhr",
+"yofH3VerEA","JkzUn45cIH","pv0i7rhl0J","7X3uyVNCPd","D6rByNxx9V","FNYIMMmsIo","jiVBPW3VFH","soy9tjSjS3","pmeCdxReec","jfREuiKqhr",
+"POUYSM6qcG","oQ87rYjB9t","cmXIXlsQGo","o8Uyd24ARF","8RCUA7fsYM","CNHmvgjUTu","vkCHHZJTXH","RsQUqwDajX","7Ow5CHP433","ydG8U5nmWv",
+"580YDfcJOy","FnPFBGXdoH","aez9y5iGN5","uN6r35Namm","VBjhzTwano","U3yw5UmaEv","SmGzvIKxdL","VjCZqSWfou","FFDuiEdBKc","brhlQRxrsm",
+"BCxeCMGlTF","BFkb8QWxoT","CxVEfi7WMQ","pWiOsokgRi","VLTy6dpe1v","IRh48lViBv","3otm60PktI","cmXIXv8yFN","Uvlv4ZUnqt","FxX9q48cHL",
+"cQOnv2DREs","RpBQmmz8gx","hYBCKsuY4x","VBjhzl83Ud","JJs5mSmGzv","4W0Tl0YAGH","qQxHP0PktI","nFqikzz4ZU","hi5X7Pb1pa","Kr8ysDcpWB",
+"BFkb84dEz6","lCMxyhYBCK","3weIFCIShG","Yh1hFhYBCK","x3LDeRACuj","yluBx5IhmG","b29RJzqH0W","bgJAzpFrrl","2hEEU6q6L9","StlDJVLTy6",
+"Cp3mZix74r","2TRI73otm6","ZJTXHtaOXK","Y1mC08hJdt","Pb1pajtn0X","JJs5m9rlg9","nlaByReKEW","4W0TlX6Pin","5Mg9ratef2","FGzgpgtCA5",
+"zY1GYDLhzM","e6e4ztaOXK","9y4lw7hyVv","jeskSJJs5m","n1pmOix74r","pT8wuMmsIo","0MR5XuTacx","WMiS3MmsIo","tlILt7hyVv","24ARFvOqCE",
+"7ku1pFhtgl","Chuy3nFqik","RsQUqWaim6","he9IAhUTw7","2TRI7uoStw","JRJQBjzUqR","7hyVvFLsph","NOHsztl72W","piJSk0h1b1","tl72W2DREs",
+"K20wKyEfy9","fqypyBCxeC","TCgPp5Namm","euZA5GWqqX","LbRTHtAOsr","G1RhSzHF1q","tAOsrlm0pD","Dz1R3W3VFH","VBjhzhSSvQ","Mm8si580YD",
+"VIlwPGrDg7","guMb8v8yFN","RpBQmWmadA","29QAz0BmCy","FjHXRlj07Q","2DREs14FLR","DQimp8hJdt","Dz1R3U3yw5","Pb1paRzaZA","VNCPdazIWp",
+"Q6LixAXpwE","ReKEWuZPqg","s93Ml8cVD3","y94nwReKEW","Yw2oUFxX9q","QYxC0i7WMQ","S77LHhSSvQ","Qworu2Nslm","QYxC0FxX9q","QChxsrKDLJ",
+"i7WMQPOUYS","TwanoFwEJz","OUYuFHfyNQ","0h1b1VjCZq","rz7Utgf8rI","OHaBznFqik","Ul4a1qaofN","k85AelXFOB","suY4x0h1b1","Waim6cmXIX",
+"Kr8yspFrrl","d7vjMciuWz","7fsYMRACuj","yluBxFcWrW","Yw2oUFcWrW","hSSvQG1RhS","CNHmvGrDg7","i7WMQksJby","16lHcfaHir","J2mQiHP433",
+"NcICA29QAz","v8yFNcQOnv","t59lRO3iyQ","i3pydAmdQd","oQ87ruvf7A","QClRLsx5Gl","LewvMOHaBz","gtCA5he9IA","2DREshYBCK","7X3uycQOnv",
+"jeskShSSvQ","OHaBzhSSvQ","Kr8yslsQGo","EOE1ogtCA5","tvdkDkB5nP","aFFssCK5W7","tjQxsQ6Lix","GWqqXpvgjS","lViBvOUqFM","4W0TlO3iyQ",
+"zmLYD0h1b1","zmLYDuAWyp","rKDLJLbRTH","8cVD37X3uy","7hyVvL7cGc","I7p2aiKqhr","QbxXc8U2nU","zHF1q0MR5X","bgJAzNxx9V","RpBQmCfgr3",
+"RACujM3zXL","NcICAIKxdL","pFrrldpe1v","hSSvQk85Ae","LbRTHrz7Ut","s93Ml9rlg9","24ARF6q6L9","d85a9QssNC","o8UydF6PT2","In3NSaez9y",
+"HRxd807n1c","n1pmOCp3mZ","0ao3lQworu","gdQsSiKqhr","Fhtgl7fKYU","ksJbyfLNg8","CNHmv7hyVv","0YAGHJKWYR","ydG8UUlU3M","rKDLJZhwG1",
+"NOHszCIShG","tl72WiB08l","piJSkciuWz","RACujksJby","NhXduWaWsv","y94nwVBjhz","tjQxsiqv4k","kZANmnnP8o","jS1ajWPmlx","lCMxyECMvU",
+"uPX7GpvgjS","lm0pDnFqik","xXTI4qaofN","faHirwiHrZ","Qworudjsrv","29QAzOxWIH","i7WMQyEfy9","soy9t580YD","NOHszWreyP","JJs5mtvdkD",
+"d85a9aDGtS","iwzGk1v5hH","AkKTkvkCHH","M6qcG8cVD3","ECMvUfcwDa","RkQkecL0aE","JKWYRS2Dfu","lpF6WGv3Fq","uTacxuJScX","sqVrfmz8gx",
+"7fsYMSjskQ","WMiS3BFkb8","pT8wuuQIcz","hSSvQoGu6x","JIqXibgJAz","0MR5XMaJQs","WreyPMezSW","zqH0W8xEKz","i7WMQ7Ow5C","hE1Ql7fsYM",
+"yofH3cL0aE","yEfy9lH1kt","9XyT99rlg9","ulk41iqv4k","GWqqX24ARF","uJScXfLNg8","FhtglqUJMd","iqv4ktAOsr","l83UdnnP8o","S77LHU3yw5",
+"uN6r3vLsmS","K20wKFxX9q","6q6L92hEEU","e6e4zLbRTH","QWxoTpv0i7","FLsphgdQsS","Nxx9V6q6L9","brhlQ8hJdt","kB5nPb29RJ","zY1GYsx5Gl",
+"vkCHHuLtKs","VLTy624ARF","D6rByxReec","fqypyYjB9t","3otm6fFDrJ","Yh1hFgtCA5","a00b5ThjNn","lm0pDuupzk","IRh482ZHdk","AmdQdVerEA",
+"JkzUnAkKTk","Mm8siAIYUu","8FmFHmz8gx","Cp3mZTXQ0Z","iwzGkYh1hF","yofH34dEz6","YOfrYJRJQB","s7MxkGWqqX","D6rByvOqCE","dQ586ulk41",
+"lH1kt64s8N","YOfrY48cHL","OUYuFdpe1v","ECMvUlCMxy","jiVBPY1mC0","FPfSES77LH","tl72WJRJQB","LewvMzY1GY","QWxoTuPX7G","AgJHQzbIYY",
+"yluBxqUJMd","a00b57ku1p","Z4I1v29QAz","XyPZNiB08l","lkMUA9rlg9","sx5GljfREu","lH1ktCp3mZ","AkKTkZJTXH","FjHXRjfREu","Chuy3wDajX",
+"FVMxo3weIF","G1RhSMmsIo","hSSvQSbRYy","9eoRcTXQ0Z","DcpWBCxVEf","hUTw7Gv3Fq","uoStwzbIYY","lViBvNxx9V","HlUbFVjCZq","K4GS8Mkgy8",
+"yvOMIsx5Gl","GSQwjQworu","fcJOyzmLYD","45cIHni2v1","24ARFdmoS7","Nxx9VciuWz","yvOMILewvM","gf8rINo0Qb","KASQ8JKWYR","CdyBVuoStw",
+"Y1mC0nFqik","zbIYYtjQxs","dQ586OxWIH","XflUqQ6Lix","6q6L9CIShG","sx5GltlILt","Yh1hFlpF6W","pWiOshYBCK","k85Ae7lUXZ","DcpWBM6qcG",
+"BpYhVUmaEv","zHF1qF6PT2","FjHXRciuWz","YOfrYFcWrW","8cVD324ARF","NOHszqaofN","v1HlnSs0Zu","zmLYDlH1kt","IjTwP24ARF","s7Mxkhi5X7",
+"JKWYR9GXkX","ReKEWjzUqR","guMb8uZPqg","Z4I1vCqqaD","Kr8ysXyPZN","Cfgr3FnPFB","lm0pDhi5X7","ni2v1hi5X7","jiVBPJXljW","h1zcHDz1R3",
+"Y1mC0G1RhS","NcICAJ2mQi","sqVrf0YAGH","iqv4kYw2oU","prNT6VjCZq","RmDcrcQOnv","qaofNjS1aj","Gv3FqfLNg8","VNCPdRpBQm","5NammjS1aj",
+"cL0aEFnPFB","HlUbFi3pyd","29QAzcmXIX","5ZaEzxciqp","hYBCK9rlg9","LDk6fI7p2a","No0QbuTacx","FcWrWlXFOB","Y1mC0h1zcH","kZANmAXpwE",
+"POUYSdpe1v","ZUnqtStlDJ","L7cGc7hyVv","kZANmblLA9","ZzJHWjfREu","Chuy3uAWyp","F6PT2DcpWB","64s8NZuDtD","zqH0WFwEJz","cQOnvDz1R3",
+"2ZHdkhYBCK","VIlwPZUnqt","7Ow5CRmDcr","8cVD3FPfSE","uZPqgWreyP","AgJHQ8hJdt","VjCZqXyPZN","FhtglkB5nP","TXQ0Z0ao3l","l83Ud8xEKz",
+"BbwgAlCMxy","lm0pDNo0Qb","AmdQdazIWp","fFDrJJIqXi","GSQwj0MR5X","zz4ZUOz8yZ","VLTy6Kr8ys","2TRI7uN6r3","X6Pin0PktI","zqH0WRBhp0",
+"7lUXZulk41","WaWsv64s8N","QYxC0mX2GE","OUYuFQssNC","8RCUAMezSW","CqqaDiwzGk","v1HlnVLTy6","wDajXJRJQB","aFFssru4UG","dhSuHbgJAz",
+"Nxx9VL7cGc","SbRYy2Nslm","BpYhVqaofN","rhl0J7hyVv","FNYIMpWiOs","cL0aERsQUq","J2mQiyEfy9","jzUqRcL0aE","i7WMQzbIYY","OUYuFzz4ZU",
+"JRJQBlViBv","dQ586fqypy","IKxdL0h1b1","ThjNnxReec","8U2nUt98iW","mz8gxKZamH","M3zXLrhl0J","qaofNwiHrZ","TCgPp9eoRc","HzZT8gf8rI",
+"Q6hMCgdQsS","5nmWvzFgtB","45cIHguMb8","9eoRclj07Q","CdyBVYh1hF","StlDJcQOnv","CK5W7LewvM","5Drn0pvgjS","hUTw7ECMvU","tvdkDCfgr3",
+"QYxC0PYBf4","lCMxySmGzv","hE1QlCqqaD","JJs5mVerEA","XyPZNQChxs","yluBxTwano","jfREuxReec","hSSvQWmadA","Twano0BmCy","Mkgy8Ss0Zu",
+"EOE1oFPfSE","aDGtSSs0Zu","FnPFBoVQp6","okgRiuvf7A","BpYhVhE1Ql","7X3uypiJSk","AmdQd7Ow5C","QWxoT0BmCy","RzaZAfaHir","l83UdGWqqX",
+"1j5L8OUYuF","CK5W7QssNC","5VZjS5Drn0","M3zXLL7cGc","WreyPpT8wu","NhXdulkMUA","FVMxobrhlQ","S2DfuhYBCK","OUqFM1LB1L","VBjhz0ao3l",
+"FhtglsqVrf","7fsYMpv0i7","pAhR1AIYUu","45cIHSjskQ","0PktISs0Zu","I7p2acmXIX","JRJQBdpe1v","DcpWBSs0Zu","VerEAydG8U","hYBCKgIYvE",
+"MezSW8FmFH","lCMxyHRxd8","PYBf4U3yw5","48cHLGrDg7","kB5nP8hJdt","bZLvSn1pmO","IBe8kChuy3","pAhR1jeskS","7ku1pCNHmv","J2mQiguMb8",
+"vLsmS3otm6","64s8NnnP8o","Mm8siDG4sT","m4bxUfLNg8","ThjNnVerEA","wiHrZjeskS","JIqXi0Kyfs","v1Hlnrz7Ut","1LB1LM6qcG","2TRI7v1Hln",
+"0h1b1gjUTu","iKqhrjSjS3","7ku1p7ku1p","uPX7GFVMxo","Kr8ysFcWrW","5VZjSRkQke","Q6hMCJJs5m","h1zcHjSjS3","Rxrsm5drc6","fmIK1ciuWz",
+"P6bcgtvdkD","kZANmnlaBy","ZJTXH64s8N","4QMc9No0Qb","Yf2EcJJs5m","POUYSi7WMQ","QClRLokgRi","oQ87rIn3NS","ksJbykB5nP","pmeCdyluBx",
+"NhXduQbxXc","HfyNQaL6AJ","tAOsrix74r","Yf2EctAOsr","o8UydiB08l","TXQ0Z8RCUA","iwzGkzFgtB","WmadAlkMUA","8RCUAhE1Ql","iqv4kogLgc",
+"EOE1otuDyS","XyPZNuPX7G","oQ87rCp3mZ","lH1ktQssNC","tuDySMaJQs","7X3uyjfREu","NOHsz7ku1p","FnPFBpvgjS","7lUXZv2eC3","1LB1LhYBCK",
+"vOqCEVIlwP","P6bcgzFgtB","0Wr5ynFqik","Zv7z0ru4UG","zY1GYVLTy6","ydG8UIn3NS","bgJAzhE1Ql","atef2tjQxs","cmXIXaez9y","Y1mC0QssNC",
+"brhlQs93Ml","GSQwjfcwDa","FhtgljiVBP","7X3uyCfgr3","DcpWBgtCA5","tAOsrZUnqt","Cp3mZOxWIH","Uvlv4KZamH","M3zXLWreyP","Y1mC0MojnP",
+"YOfrY0PktI","IRh488TxD7","4W0Tlfqypy","pAhR1o8Uyd","F6PT2vkCHH","WMiS3StlDJ","cL0aEMojnP","gtCA5FFDui","DG4sTIjTwP","G1RhShUTw7",
+"NAFuwaL6AJ","jtn0XwiHrZ","lViBv8U2nU","sx5Gl3otm6","QnJ1S7lUXZ","2Yz7Es4786","KsjRKuJScX","AgJHQVBjhz","JKWYRguMb8","ogLgci3pyd",
+"yofH3IKxdL","iB08l5Mg9r","BCxeC7Ow5C","aez9y0Kyfs","In3NSgf8rI","ZUnqt9eoRc","ReKEWyEfy9","ThjNnYw2oU","JXljWuTacx","dQ586tuDyS",
+"FGzgpogLgc","5nmWvLewvM","faHirpAhR1","nFqikulk41","FGzgpSjskQ","HlUbF9GXkX","Ss0ZuZJTXH","AmdQdlViBv","8RCUArhl0J","aL6AJhUTw7",
+"KASQ8B3qem","618DiJXljW","MK07Yuvf7A","MGlTFjS1aj","BbwgA07n1c","ZUnqt14FLR","yEfy90Wr5y","QnJ1SuZPqg","tvdkDMmsIo","NOHszaez9y",
+"M3zXLTa8f6","xciqpyEfy9","s93MltaOXK","MGlTFFjHXR","CIShGHP433","suY4xLewvM","iqv4kWDVWJ","m4bxU0YAGH","hYBCKyofH3","BpYhVuJScX",
+"OUqFMWDVWJ","GrDg7pv0i7","0Wr5yBbwgA","RpBQmOUYuF","I7p2aReKEW","he9IAEOE1o","XflUqrz7Ut","3otm6a00b5","8hJdtOHaBz","NcICAF6PT2",
+"Ss0ZuF6PT2","RpBQmThjNn","Ta8f60YAGH","0YAGHtAOsr","oVQp6VNCPd","FnPFBJXljW","WDVWJrKDLJ","BGaQYe6e4z","uPX7GUlU3M","taOXKWaWsv",
+"EOE1oAgJHQ","lj07QJkzUn","RACujhi5X7","aFFsshE1Ql","Dz1R3FNYIM","mz8gxQ6hMC","fFDrJlsQGo","o8UydCIShG","Vprf2iqv4k","QWxoTrz7Ut",
+"FwEJzWaim6","uN6r3IBe8k","fqypySbRYy","5iGN52DREs","ZuDtDX6Pin","Q6hMC0Kyfs","blLA9o8Uyd","t98iWfaHir","MmsIouZPqg","nlaBygIYvE",
+"uTacxMmKGJ","5IhmGTXQ0Z","iqv4kVBjhz","8RCUAKsjRK","IRh48SWfou","uTacxpT8wu","aez9ye6e4z","ulk41d85a9","uLtKs5Namm","64s8NpmeCd",
+"TwanoAXpwE","YOfrYuQIcz","pAhR1jS1aj","Waim6ThjNn","kB5nPGWqqX","gf8rI5Namm","ogLgcThjNn","ReKEW2DREs","GrDg73otm6","FjHXR7ku1p",
+"faHirNAFuw","I7p2alCMxy","9eoRcZJTXH","i3pydxXTI4","jtn0XhUTw7","1v5hHxciqp","BFkb8yEfy9","MmsIopvgjS","9XyT9jzUqR","I7p2aEOE1o",
+"1v5hH5VZjS","4dEz6BbwgA","lCMxyxXTI4","Gv3FqaDGtS","qaofNqUJMd","v1HlnTwano","BbwgAfLNg8","kB5nP9y4lw","yToGWt98iW","yToGWOHaBz",
+"dhSuHRxrsm","MK07Ysx5Gl","CIShGStlDJ","55rfBm4bxU","ksJbyCIShG","CqqaD3otm6","oQ87rQbxXc","v2eC3RkQke","PYBf4CNHmv","QbxXcprNT6",
+"uPX7GNOHsz","ZzJHW7ku1p","yToGWTCgPp","BGaQYOHaBz","QnJ1SHRxd8","VBjhz8FmFH","LewvMNAFuw","ZUnqt9y4lw","ulk41MojnP","HlUbFEoToP",
+"djsrvaFFss","SjskQFnPFB","mz8gxOz8yZ","2TRI7aL6AJ","KZamHQbxXc","7hyVvtvdkD","a00b5B3qem","MGlTFiKqhr","I7p2a580YD","YjB9t2hEEU",
+"yvOMIO3iyQ","yToGW618Di","5VZjSnFqik","hSSvQe6e4z","dhSuHv8yFN","HzZT8CK5W7","s7MxkcL0aE","DLhzMCdyBV","HlUbFzmLYD","TCgPpIjTwP",
+"7Ow5CVprf2","K20wKJKWYR","VIlwPDLhzM","aez9y64s8N","vLsmSGWqqX","QYxC0Cp3mZ","8hJdtgtCA5","h1zcHAmdQd","uoStwlweGy","8cVD3IBe8k",
+"48cHLWaim6","2Yz7EtlILt","CdyBVNAFuw","EoToPgjUTu","jtn0XlkMUA","nnP8oPYBf4","uLtKsbrhlQ","fFDrJfcwDa","YOfrYbgJAz","NhXduECMvU",
+"ZzJHWMmKGJ","55rfBIBe8k","yEfy9FcWrW","okgRidpe1v","okgRiQbxXc","nFqikCxVEf","LDk6f9eoRc","h1zcHPb1pa","fcwDajeskS","2ZHdk5Mg9r",
+"GSQwjciuWz","LDk6ft98iW","d85a9tlILt","0BmCyBFkb8","DG4sTMK07Y","dQ5865Drn0","WPmlxni2v1","uTacxLbRTH","e6e4zgf8rI","oQ87rVBjhz",
+"J2mQiAXpwE","fFDrJMK07Y","aFFssbrhlQ","8cVD3yToGW","k85AeTCgPp","uLtKsYjB9t","SjskQIBe8k","RsQUqTXQ0Z","xXTI4lViBv","GSQwj2Nslm",
+"MaJQsAkKTk","StlDJ9XyT9","Yw2oUQChxs","ReKEWReKEW","v2eC35IhmG","2Nslmi3pyd","nnP8oguMb8","oQ87rlCMxy","G1RhSJ2mQi","pv0i78RCUA",
+"zz4ZUqUJMd","i3pydpiJSk","cShY2YOfrY","ZJTXHWDVWJ","rKDLJJIqXi","DcpWBtlILt","aL6AJOHaBz","uAWypiKqhr","0ao3ly94nw","FVMxoJIqXi",
+"2hEEUMojnP","vLsmSbrhlQ","1v5hHFcWrW","guMb8pAhR1","oGu6xIKxdL","618Din8pJ9","lCMxya00b5","Waim6s7Mxk","QbxXcO3iyQ","RACujqaofN",
+"fqypyFnPFB","yluBxEOE1o","FFDuiVBjhz","i7WMQJkzUn","0YAGH16lHc","RmDcr8FmFH","bZLvSuLtKs","gIYvEaDGtS","K20wKLbRTH","1j5L80YAGH",
+"kZANmhYBCK","CK5W7guMb8","DG4sTMaJQs","Ul4a1MK07Y","2Yz7ElweGy","iqv4kIRh48","JkzUnpFrrl","0Wr5yQbxXc","cQOnvIjTwP","2hEEUKASQ8",
+"ni2v1zbIYY","4W0TlM3zXL","GrDg7QssNC","FVMxolpF6W","O3iyQzqH0W","fcwDaLewvM","8RCUAMmsIo","No0QbnFqik","RBhp0G1RhS","NAFuwSs0Zu",
+"ydG8UqaofN","14FLR0PktI","n1pmO7fsYM","JkzUnJXljW","5nmWvGWqqX","uJScX9GXkX","cL0aEsuY4x","v2eC3FGzgp","iqv4kK4GS8","lm0pDwiHrZ",
+"ydG8U0Kyfs","7hyVvC2Irc","X6PinFFDui","B3qemOUYuF","FjHXRZhwG1","uTacxLewvM","X6PinYjB9t","8RCUAWaim6","TXQ0ZRxrsm","n1pmO1j5L8",
+"7ku1pQ6hMC","7hyVvo8Uyd","qUJMdFLsph","xReecxciqp","MaJQsrz7Ut","HP433lm0pD","C2Ircmz8gx","yofH39rlg9","X6Pin8cVD3","KZamHLDk6f",
+"5VZjS8RCUA","n8pJ9aFFss","jS1ajW3VFH","FxX9qfLNg8","FVMxoqQxHP","UmaEvgtCA5","dhSuH9iGoT","FcWrWGSQwj","RACujfcJOy","nnP8oCIShG",
+"Nxx9VCfgr3","8RCUApWiOs","t98iW24ARF","2hEEUaL6AJ","F6PT2SWfou","pT8wuHRxd8","OUqFMdmoS7","Pb1paWDVWJ","POUYSBbwgA","gIYvE4dEz6",
+"nnP8oazIWp","QWxoTix74r","d7vjMkB5nP","ReKEW0MR5X","FGzgpguMb8","8xEKzIjTwP","bZLvSJKWYR","sx5GlWreyP","tvdkDHRxd8","RBhp0tAOsr",
+"fcwDaSWfou","4dEz6BpYhV","FNYIMHP433","FnPFBSWfou","fcwDaoGu6x","FnPFBYh1hF","M6qcGjfREu","0MR5X5drc6","s7MxkTwano","GXdoHeuZA5",
+"0PktIhe9IA","WreyPpWiOs","IKxdLO3iyQ","yvOMIWDVWJ","lpF6WUlU3M","5ZaEzzqH0W","i3pydLewvM","4QMc9vkCHH","x3LDeVjCZq","lkMUAWaWsv",
+"ZzJHWUvlv4","wiHrZEOE1o","VerEAyToGW","zbIYYJRJQB","LDk6fZzJHW","piJSkVprf2","mz8gxfcwDa","i7WMQvLsmS","9GXkXP6bcg","VLTy6Twano",
+"DLhzMZJTXH","xciqpy94nw","lViBvrKDLJ","tjQxsdjsrv","oGu6xQbxXc","n1pmOi7WMQ","atef22DREs","55rfBzHF1q","JJs5mK20wK","2ZHdkHfyNQ",
+"RBhp0DQimp","d85a9StlDJ","qaofNNxx9V","dpe1vnnP8o","QssNCzY1GY","TwanobgJAz","HP433SmGzv","G1RhSgdQsS","tjQxsPb1pa","pT8wue6e4z",
+"5Mg9r7Ow5C","IjTwPMm8si","NOHsz8hJdt","d85a9zmLYD","m4bxUX6Pin","2Yz7EtuDyS","24ARFogLgc","zbIYYhi5X7","0MR5X9eoRc","QssNCiKqhr",
+"atef2rKDLJ","RACujix74r","azIWpuAWyp","UmaEvLDk6f","lH1kteuZA5","hSSvQLDk6f","Cfgr38FmFH","lweGyBpYhV","zz4ZUGv3Fq","X6PinnlaBy",
+"lCMxyWaWsv","POUYSStlDJ","No0Qb55rfB","pv0i79eoRc","9eoRcVBjhz","VerEArhl0J","rhl0J2ZHdk","nFqikIjTwP","07n1clpF6W","YjB9tDcpWB",
+"a00b5W7cTs","CxVEfOHaBz","NOHszNxx9V","9rlg95VZjS","faHirblLA9","ReKEW0BmCy","DG4sTW3VFH","FVMxo0Wr5y","WPmlxix74r","lpF6WVjCZq",
+"zqH0WvkCHH","JXljWTCgPp","nlaBy8xEKz","x3LDeJKWYR","29QAzCNHmv","5drc6FNYIM","aez9yuoStw","S2DfuSWfou","29QAzjtn0X","fqypypiJSk",
+"0Wr5yzz4ZU","yofH3KASQ8","MmsIoYh1hF","Ss0ZuzqH0W","t59lROxWIH","Mm8si8U2nU","JXljWKZamH","ulk416AFT0","a00b5YOfrY","IKxdLv1Hln",
+"2hEEUjtn0X","MaJQsy94nw","uZPqgfLNg8","0KyfsvOqCE","LewvMFVMxo","G1RhSQClRL","8hJdtVNCPd","m4bxUDLhzM","fmIK155rfB","YjB9t1j5L8",
+"v8yFNDcpWB","Yw2oURsQUq","AkKTkMK07Y","Vprf2atef2","zFgtB55rfB","7fKYU8xEKz","jzUqRl83Ud","jzUqROHaBz","ReKEWvLsmS","oQ87r5nmWv",
+"ZUnqt580YD","SjskQQ6Lix","J2mQiU3yw5","YjB9tgtCA5","tvdkDtjQxs","NAFuwpmeCd","djsrvcmXIX","ZuDtD7lUXZ","ThjNn0h1b1","ZUnqtuZPqg",
+"lweGyFPfSE","FjHXRdjsrv","VLTy65Drn0","fqypyRmDcr","he9IAAmdQd","ru4UGd85a9","G1RhSGv3Fq","uupzktaOXK","ciuWzv1Hln","yEfy95Namm",
+"ogLgcVprf2","XflUqVLTy6","fLNg80Kyfs","OUYuF5iGN5","tAOsrtlILt","8U2nUFwEJz","fFDrJPb1pa","P6bcgjS1aj","m4bxUni2v1","a00b5HfyNQ",
+"UlU3Mv8yFN","pWiOsvOqCE","yvOMIQ6Lix","fmIK1a00b5","EdBKcfaHir","bZLvStlILt","sqVrfAgJHQ","F6PT2nFqik","Oz8yZ3otm6","pAhR1i7WMQ",
+"ix74rdhSuH","mz8gxqUJMd","cL0aEix74r","MaJQsciuWz","Pb1pazqH0W","lH1kt8cVD3","RpBQmYjB9t","DQimpQYxC0","dpe1vzFgtB","nlaByQnJ1S",
+"7X3uy64s8N","zbIYYxciqp","ReKEWKr8ys","uPX7GtjQxs","Nxx9VsqVrf","gdQsSLDk6f","48cHLFjHXR","0PktIQClRL","DcpWB7hyVv","lXFOBCIShG",
+"dpe1vJJs5m","fcJOycL0aE","VLTy6QssNC","djsrv7hyVv","1v5hHpv0i7","Nxx9V7hyVv","d85a9lj07Q","IRh48580YD","BCxeCRmDcr","FLsph2DREs",
+"W3VFHwiHrZ","LewvMsuY4x","jfREuyToGW","NhXdu5IhmG","W7cTsRzaZA","xXTI47lUXZ","ZhwG1Q6Lix","Yw2oUfLNg8","ThjNn2ZHdk","QworufFDrJ",
+"xciqpsuY4x","fcwDadmoS7","ZhwG1VjCZq","1LB1Lmz8gx","hYBCK7ku1p","AkKTk0BmCy","1v5hHRxrsm","suY4xuAWyp","5IhmGRsQUq","EoToPZhwG1",
+"ZJTXHaFFss","16lHchUTw7","7fKYUGrDg7","JXljWlsQGo","WreyPtl72W","Q6LixsuY4x","5VZjScL0aE","MGlTFSmGzv","BbwgAQYxC0","CNHmvulk41",
+"dpe1vThjNn","W3VFHfmIK1","55rfBqUJMd","8hJdttuDyS","MGlTFiB08l","7lUXZEdBKc","RpBQmZJTXH","W3VFHfFDrJ","jiVBPfLNg8","8TxD7n1pmO",
+"7fKYUb29RJ","7fsYMZhwG1","W7cTsgdQsS","16lHcn1pmO","o8UydJRJQB","ReKEWRBhp0","C2IrckB5nP","i3pyda00b5","CIShGqQxHP","Fhtgln8pJ9",
+"vkCHHdjsrv","tlILtzHF1q","lH1ktKZamH","JRJQBb29RJ","FLsph7fsYM","VjCZqU3yw5","lpF6W8cVD3","RzaZAQworu","QYxC08U2nU","7fsYMO3iyQ",
+"vOqCENAFuw","SjskQgf8rI","IKxdLSmGzv","FFDuifqypy","qaofNjiVBP","9XyT95nmWv","RACujXyPZN","5iGN5NhXdu","HP433hSSvQ","lH1ktrKDLJ",
+"iKqhrB3qem","blLA9zz4ZU","blLA9oGu6x","ksJbyuLtKs","7ku1pjSjS3","jfREuHP433","VjCZqS2Dfu","7fKYU3weIF","WDVWJjzUqR","fqypy7fKYU",
+"2NslmSs0Zu","ni2v1lViBv","WDVWJX6Pin","aL6AJDQimp","nlaBy0MR5X","StlDJ7Ow5C","iwzGkFxX9q","RkQkelkMUA","FwEJzUlU3M","OUYuFFFDui",
+"s4786O3iyQ","FxX9qLDk6f","gf8rIi7WMQ","uAWypcShY2","oQ87rQ6hMC","JKWYRHRxd8","pFrrlHzZT8","pvgjSqUJMd","ksJby8RCUA","zHF1qQssNC",
+"J2mQiRzaZA","zY1GY14FLR","QssNCru4UG","S2Dfu2TRI7","C2Irc8TxD7","VerEAtuDyS","5Namma00b5","ksJbyjtn0X","vLsmSnlaBy","t59lR7fsYM",
+"bZLvS0Kyfs","Cfgr32DREs","UlU3MWaWsv","9GXkXuN6r3","Ss0Zuuupzk","UlU3MB3qem","tjQxshUTw7","VIlwP9iGoT","tuDyScQOnv","aDGtSpvgjS",
+"lkMUA7lUXZ","pvgjSFFDui","SjskQIjTwP","AXpwE45cIH","PYBf4Chuy3","QnJ1SI7p2a","55rfBnFqik","Mm8sibrhlQ","uAWypJJs5m","he9IArz7Ut",
+"YjB9tWDVWJ","djsrvn8pJ9","SjskQzbIYY","AIYUutjQxs","S2Dfuh1zcH","5Drn0brhlQ","e6e4zStlDJ","HRxd8F6PT2","HfyNQ6AFT0","U3yw5brhlQ",
+"uTacxJRJQB","EOE1oW3VFH","yToGWMkgy8","FNYIMsx5Gl","Pb1paJJs5m","BbwgAzY1GY","o8UydJIqXi","faHirCxVEf","cmXIXThjNn","WDVWJQChxs",
+"gtCA5uvf7A","0MR5XDQimp","lH1ktlCMxy","k85AekZANm","7hyVv5Drn0","XyPZNSjskQ","SjskQQClRL","QworunFqik","oQ87rXflUq","NOHszRpBQm",
+"okgRiBGaQY","uLtKszz4ZU","jiVBPKr8ys","tjQxszqH0W","P6bcg0ao3l","CqqaD0MR5X","dhSuHokgRi","prNT6uupzk","VerEAlXFOB","fFDrJEdBKc",
+"2DREsW7cTs","WPmlxo8Uyd","VerEAGXdoH","vOqCE9iGoT","uZPqgWPmlx","cShY2atef2","suY4xNOHsz","iB08lRBhp0","JJs5mKZamH","F6PT2VIlwP",
+"pmeCdnlaBy","GrDg7BpYhV","tjQxs8xEKz","WDVWJKr8ys","AkKTkK4GS8","BCxeCWaim6","brhlQrz7Ut","8U2nUTXQ0Z","G1RhSeuZA5","jSjS3FcWrW",
+"zqH0W2Yz7E","hYBCK45cIH","Gv3FqFnPFB","KZamHOHaBz","HRxd8pFrrl","fmIK1Kr8ys","FjHXR9eoRc","0BmCydjsrv","DG4sThi5X7","JKWYRJJs5m",
+"55rfBfcwDa","Gv3FqGWqqX","tlILtnFqik","ZhwG1CK5W7","iwzGkni2v1","AIYUuIRh48","v1Hlnjtn0X","lm0pDB3qem","oGu6x24ARF","8hJdts93Ml",
+"yToGWuTacx","JJs5mWmadA","uAWypMaJQs","7ku1pBpYhV","Q6hMCNcICA","Z4I1vCK5W7","atef25VZjS","JXljW5drc6","SWfouDz1R3","lH1ktyluBx",
+"YOfrY0YAGH","fcwDaFwEJz","MaJQs7ku1p","24ARFb29RJ","VerEARsQUq","lpF6WLewvM","580YDWreyP","uLtKsjiVBP","gtCA507n1c","nnP8ovLsmS",
+"U3yw57ku1p","Gv3FqNxx9V","0Wr5yCIShG","aFFssJIqXi","U3yw5VBjhz","ciuWzy94nw","ulk41rz7Ut","YjB9togLgc","OUYuFXflUq","QChxsWaim6",
+"No0Qbe6e4z","EoToPFPfSE","djsrvRsQUq","mz8gxWDVWJ","tvdkDCNHmv","VNCPdGv3Fq","J2mQi5VZjS","tlILtHP433","2ZHdk0MR5X","atef2No0Qb",
+"ThjNnFjHXR","F6PT2iwzGk","29QAzW7cTs","Yw2oU5ZaEz","uupzk7Ow5C","QWxoTYw2oU","NcICAt98iW","cQOnvyluBx","Q6LixMGlTF","TXQ0ZfcwDa",
+"IBe8kWDVWJ","NOHszJ2mQi","SbRYyru4UG","14FLRO3iyQ","1LB1Lxciqp","1j5L8wDajX","lpF6WWreyP","qQxHPMK07Y","jS1ajqQxHP","zz4ZUfFDrJ",
+"gdQsS618Di","uLtKsU3yw5","s93MlpmeCd","JXljWazIWp","W7cTszqH0W","NhXduNxx9V","JXljW5iGN5","AkKTkUvlv4","CK5W7gjUTu","L7cGct59lR",
+"KsjRKlH1kt","zqH0WNo0Qb","XyPZNxXTI4","FVMxo8FmFH","MGlTFcL0aE","hi5X77fKYU","lm0pDzbIYY","8TxD73weIF","RzaZAFcWrW","1LB1LD6rBy",
+"Yf2Ecdjsrv","CIShGlpF6W","iB08lVprf2","POUYSAIYUu","EdBKcEOE1o","pAhR1FPfSE","cL0aEdjsrv","IBe8kFnPFB","L7cGc16lHc","Uvlv4Cfgr3",
+"ZUnqtPYBf4","faHirWDVWJ","5drc6LbRTH","AkKTkRxrsm","dQ586HzZT8","D6rBytAOsr","uTacxi7WMQ","faHirMm8si","JRJQBKsjRK","9y4lwv8yFN",
+"7fsYMZuDtD","faHirGXdoH","k85AeNxx9V","uAWypRpBQm","5Drn0o8Uyd","Yw2oUIn3NS","CdyBVcL0aE","kZANmlCMxy","9rlg9vLsmS","rhl0JBpYhV",
+"J2mQizQt6Q","TCgPp3weIF","nlaByPb1pa","MmKGJ2hEEU","YOfrYTXQ0Z","okgRitAOsr","YOfrYEoToP","5ZaEzD6rBy","AOgEe0MR5X","CxVEfNxx9V",
+"0KyfsJRJQB","lj07QJKWYR","DQimp7ku1p","U3yw5BFkb8","uAWyp24ARF","GXdoHCK5W7","QworulXFOB","uTacxgIYvE","2TRI7iqv4k","JJs5mWaWsv",
+"Yf2EcuLtKs","dmoS7JJs5m","0MR5XChuy3","XyPZNRzaZA","uZPqgcQOnv","ZUnqtQYxC0","Q6hMCWDVWJ","L7cGczFgtB","faHircQOnv","SjskQfaHir",
+"WreyPuoStw","W7cTsfFDrJ","0BmCy64s8N","PYBf4uTacx","0MR5XAXpwE","fcwDaKASQ8","suY4x5nmWv","JkzUn5ZaEz","JkzUnKsjRK","ni2v1580YD",
+"tlILtuLtKs","gf8rIuAWyp","uN6r33otm6","tlILt1j5L8","LbRTHeuZA5","nFqikjtn0X","EOE1ozY1GY","WreyPYf2Ec","kB5nPGrDg7","tl72WOxWIH",
+"0KyfsGv3Fq","5Drn0IKxdL","tAOsrjiVBP","FPfSECIShG","uTacxhi5X7","faHirYOfrY","LbRTHdpe1v","OHaBzrz7Ut","No0QbyEfy9","DG4sThe9IA",
+"W3VFHtaOXK","9iGoThE1Ql","gdQsSHP433","J2mQifFDrJ","FGzgpe6e4z","NAFuwe6e4z","QYxC0djsrv","9iGoTC2Irc","Y1mC0b29RJ","CK5W7WDVWJ",
+"h1zcHbZLvS","hSSvQMK07Y","hE1QlKZamH","tAOsrQWxoT","AgJHQCK5W7","uPX7GF6PT2","QbxXcS77LH","LewvMmX2GE","Z4I1vhSSvQ","aL6AJgdQsS",
+"oQ87ra00b5","7lUXZni2v1","YOfrYNOHsz","qUJMdJXljW","brhlQOz8yZ","pv0i7dQ586","0h1b1tl72W","0Wr5yFcWrW","lm0pDEoToP","AkKTkv8yFN",
+"RkQkeOHaBz","5ZaEzRBhp0","m4bxUNAFuw","VNCPdMmsIo","JRJQBzFgtB","WreyP4dEz6","VIlwPFhtgl","CIShGfFDrJ","FPfSEqUJMd","48cHLPb1pa",
+"suY4x9GXkX","ECMvUWaim6","VBjhzmz8gx","jtn0XChuy3","0Wr5yQClRL","FVMxotaOXK","6q6L9VLTy6","uvf7Ahe9IA","zmLYDNxx9V","hSSvQHzZT8",
+"HfyNQMm8si","2ZHdkDz1R3","7fsYMWDVWJ","tAOsrpT8wu","o8UydJKWYR","FcWrWJ2mQi","tl72WRsQUq","lViBvMmKGJ","8hJdt0BmCy","8U2nUX6Pin",
+"zbIYYTCgPp","B3qemY1mC0","HzZT8G1RhS","VIlwP8cVD3","5NammpFrrl","QChxsWaWsv","ZzJHWWmadA","5Mg9rciuWz","ZJTXHd7vjM","aFFssjfREu",
+"LDk6f8xEKz","5Drn0pWiOs","7lUXZMmsIo","v1HlnSjskQ","RkQkeprNT6","Cp3mZwiHrZ","hUTw7RzaZA","Ul4a10MR5X","O3iyQOz8yZ","gjUTuLewvM",
+"s93MlOUYuF","lsQGoWaim6","tl72WguMb8","QssNCnFqik","WreyPsx5Gl","ECMvU4W0Tl","DQimpIKxdL","B3qembgJAz","zHF1qydG8U","WMiS3gtCA5",
+"QnJ1SjeskS","cL0aEVLTy6","lCMxyG1RhS","GrDg7NcICA","NcICAEoToP","zz4ZUuAWyp","rKDLJO3iyQ","7Ow5Cpv0i7","xReeccmXIX","gtCA5L7cGc",
+"Oz8yZ0ao3l","vkCHHtlILt","9eoRciB08l","lH1kt45cIH","a00b57X3uy","qaofNUmaEv","0ao3luAWyp","LbRTHzFgtB","Gv3FqydG8U","ZJTXHpv0i7",
+"OUqFM8TxD7","TwanoBCxeC","uAWypzFgtB","QClRLyofH3","7hyVvn1pmO","kB5nPyToGW","24ARFzmLYD","y94nwoVQp6","QssNCtuDyS","aez9yRBhp0",
+"uAWyp0h1b1","jSjS3ZuDtD","QWxoT8U2nU","hE1Ql2DREs","WMiS3zqH0W","hi5X7jiVBP","AIYUuChuy3","zY1GYOHaBz","aDGtSVjCZq","gdQsSVerEA",
+"Yh1hFhE1Ql","XyPZNWPmlx","W7cTsprNT6","RxrsmX6Pin","pFrrlUmaEv","HfyNQ9XyT9","X6PinGrDg7","v2eC3oQ87r","DLhzMogLgc","uoStwWaim6",
+"uAWypi3pyd","9rlg9DLhzM","29QAz5VZjS","AkKTkrhl0J","okgRiVBjhz","16lHcDcpWB","S2Dfum4bxU","jzUqRGv3Fq","i7WMQ9XyT9","WDVWJLewvM",
+"5drc6k85Ae","Uvlv4vkCHH","B3qemUmaEv","FwEJz7ku1p","RmDcrhE1Ql","kZANmv2eC3","MojnP0PktI","2hEEUuPX7G","aFFssoQ87r","StlDJMaJQs",
+"9rlg9zqH0W","iB08lru4UG","9iGoTI7p2a","n8pJ9cQOnv","JIqXiIjTwP","6q6L9VBjhz","0h1b1m4bxU","HlUbFaL6AJ","0YAGHCNHmv","nFqikMkgy8",
+"Y1mC0zY1GY","QnJ1S7Ow5C","yvOMI29QAz","bgJAzRACuj","pvgjSy94nw","rKDLJQ6hMC","0h1b1MojnP","5ZaEzHfyNQ","4dEz6Y1mC0","v8yFN9GXkX",
+"DcpWBbrhlQ","HfyNQazIWp","LewvMtvdkD","he9IAS2Dfu","suY4xFwEJz","ThjNnpv0i7","sqVrfVNCPd","StlDJEoToP","lViBvfFDrJ","6AFT0RkQke",
+"0MR5X1LB1L","pvgjSMK07Y","O3iyQAkKTk","aDGtSgjUTu","WPmlxguMb8","yToGWiwzGk","D6rByCp3mZ","v8yFNkB5nP","Rxrsm2DREs","uvf7ATCgPp",
+"b29RJFLsph","HlUbFuTacx","s7MxknlaBy","i7WMQZv7z0","S2Dfu7ku1p","2hEEUbgJAz","0PktIFPfSE","WmadAQClRL","y94nwCdyBV","n8pJ94W0Tl",
+"GXdoH8FmFH","Q6hMCe6e4z","lXFOBd85a9","TCgPpGXdoH","RzaZA8hJdt","OUYuFs93Ml","O3iyQnlaBy","nFqik5iGN5","uAWypkZANm","FLsphS2Dfu",
+"h1zcHwDajX","BbwgA4dEz6","hE1QlIBe8k","uupzk8RCUA","BbwgAJkzUn","Z4I1v8U2nU","bgJAzrz7Ut","fcJOyhYBCK","atef2vOqCE","hSSvQnnP8o",
+"POUYSl83Ud","OxWIHFcWrW","RkQkeP6bcg","8cVD3FnPFB","xciqpUvlv4","iB08lv1Hln","16lHc7fKYU","y94nw07n1c","pv0i716lHc","LDk6fKZamH",
+"mX2GEbrhlQ","29QAzG1RhS","8hJdt0YAGH","SjskQ2Nslm","JJs5muAWyp","NhXduHfyNQ","7ku1p9y4lw","LDk6fZhwG1","Ta8f66AFT0","Mm8siogLgc",
+"7Ow5CFcWrW","MezSWRACuj","K20wK5ZaEz","yluBxHzZT8","GSQwjyToGW","RpBQm2Nslm","Ta8f6WPmlx","QChxsfaHir","QnJ1ShUTw7","55rfB14FLR",
+"RACujydG8U","QworuRACuj","hi5X7MmsIo","lj07QcQOnv","UlU3MWmadA","HP433Rxrsm","G1RhSzz4ZU","7Ow5CLbRTH","NOHsz5Mg9r","kB5nPsx5Gl",
+"LewvMqUJMd","ru4UGs4786","1j5L8zHF1q","o8Uyd3otm6","ZzJHWJRJQB","XflUqStlDJ","dmoS77hyVv","ix74rlViBv","xciqpJRJQB","NOHszYf2Ec",
+"pT8wu7fKYU","iqv4ka00b5","8U2nUG1RhS","8hJdtYOfrY","pmeCdQYxC0","LbRTHWmadA","jzUqRrKDLJ","SbRYyFFDui","BpYhVECMvU","Yf2EcDLhzM",
+"5ZaEz6q6L9","K4GS8FGzgp","M6qcGru4UG","uoStwUvlv4","oGu6xMojnP","BCxeCXyPZN","uJScXlweGy","OUqFMQWxoT","VjCZqfaHir","9eoRcpv0i7",
+"QbxXcdhSuH","RACujThjNn","qaofNCdyBV","CK5W7MaJQs","gf8rIlkMUA","7lUXZECMvU","soy9tAgJHQ","Vprf2SbRYy","atef2FFDui","AIYUurKDLJ",
+"EOE1onFqik","IjTwP5iGN5","hUTw7NAFuw","d7vjMMmsIo","yvOMIkB5nP","bgJAzEdBKc","ogLgc2DREs","pmeCdK4GS8","YOfrY5Namm","lH1ktdpe1v",
+"zbIYYU3yw5","euZA5aez9y","dmoS7HfyNQ","MaJQsM6qcG","KZamHd7vjM","djsrvsoy9t","MK07YAXpwE","OxWIHRACuj","xciqpZ4I1v","SWfou5ZaEz",
+"GWqqXpAhR1","Ul4a1GXdoH","gf8rIuupzk","8cVD3LewvM","GrDg7EoToP","8xEKzfmIK1","07n1csx5Gl","8hJdt3otm6","8U2nUJ2mQi","GrDg7K20wK",
+"SjskQv1Hln","lCMxymX2GE","BCxeCtaOXK","Rxrsm0Wr5y","ZzJHWtuDyS","Dz1R3Y1mC0","ulk41Nxx9V","dmoS7JRJQB","pWiOsy94nw","lweGyUvlv4",
+"QnJ1SIn3NS","ReKEWXyPZN","ReKEWd7vjM","6AFT0DQimp","lj07QlXFOB","prNT6F6PT2","9eoRcYw2oU","618DiS77LH","AmdQdjeskS","jfREut98iW",
+"OUYuFYf2Ec","MezSWKr8ys","oQ87r45cIH","K4GS8ksJby","SbRYylCMxy","GXdoHIRh48","oQ87rBGaQY","0MR5XNOHsz","F6PT24W0Tl","ru4UGZUnqt",
+"Nxx9VuLtKs","OHaBzvkCHH","U3yw5HzZT8","UlU3MciuWz","gIYvEFxX9q","DQimpyluBx","ZhwG1G1RhS","0KyfsQworu","DcpWBKZamH","zQt6QBCxeC",
+"FnPFBC2Irc","YOfrYGSQwj","xciqphUTw7","gdQsSP6bcg","YOfrYydG8U","sqVrfn1pmO","gtCA5rhl0J","S2DfuuZPqg","6q6L9ru4UG","UmaEv0MR5X",
+"BpYhVG1RhS","dpe1vgIYvE","tAOsrMmsIo","7ku1pYf2Ec","s93MliwzGk","5Drn0AgJHQ","FnPFB8U2nU","0h1b1oGu6x","lH1ktksJby","n1pmOQYxC0",
+"HlUbFQbxXc","9rlg9HzZT8","8TxD7iKqhr","ciuWz1LB1L","ZuDtDZJTXH","In3NSLbRTH","SmGzvAXpwE","6q6L9pFrrl","4dEz6uZPqg","FGzgp3weIF",
+"Waim6HlUbF","dpe1vCNHmv","Z4I1vdhSuH","ciuWzHzZT8","XyPZNjzUqR","n8pJ9ciuWz","RxrsmuPX7G","JXljWsuY4x","1LB1LKsjRK","9rlg9QChxs",
+"mX2GEOHaBz","JkzUnMGlTF","bZLvSbZLvS","e6e4zfcwDa","QbxXcW3VFH","jS1ajZJTXH","o8UydHlUbF","KZamHpFrrl","7lUXZRmDcr","s4786atef2",
+"xReecqQxHP","fmIK12Nslm","i3pydjzUqR","gdQsS0Kyfs","No0Qbb29RJ","oGu6xSWfou","TwanoprNT6","okgRiPYBf4","uZPqggf8rI","guMb8d85a9",
+"2hEEUOxWIH","bZLvSlpF6W","aez9yFhtgl","uTacx5IhmG","dpe1v8FmFH","v8yFNUmaEv","fmIK1JJs5m","Zv7z0jzUqR","vOqCEy94nw","gdQsSvkCHH",
+"a00b52TRI7","lj07QuQIcz","QbxXc580YD","faHirRkQke","EOE1o5VZjS","Pb1pahSSvQ","9y4lw64s8N","Q6hMCcQOnv","618DihUTw7","9y4lw2ZHdk",
+"FjHXRRzaZA","ZuDtDQworu","KZamH7ku1p","i3pydhE1Ql","SjskQEOE1o","BbwgAMm8si","gjUTuhSSvQ","ZJTXHFxX9q","Q6LixPb1pa","WaWsvW7cTs",
+"FcWrWAIYUu","blLA9MmKGJ","POUYSRkQke","07n1cSmGzv","9XyT97fKYU","POUYStaOXK","1j5L8QClRL","v1Hlns4786","aFFssYOfrY","WreyPsuY4x",
+"RsQUq0MR5X","GrDg7okgRi","tjQxsLbRTH","soy9tSjskQ","FNYIMOUqFM","7Ow5CO3iyQ","h1zcHlsQGo","W7cTszFgtB","Gv3FqwiHrZ","VNCPds93Ml",
+"s7Mxk7ku1p","GXdoHC2Irc","2DREsfmIK1","JIqXiFwEJz","jzUqR5Mg9r","fcwDaWreyP","L7cGc0h1b1","iwzGkzz4ZU","16lHcKsjRK","qUJMdqUJMd",
+"CK5W7yvOMI","2NslmsuY4x","TXQ0ZpiJSk","BpYhVuTacx","bZLvSZJTXH","lpF6WVIlwP","lweGyuTacx","ZuDtD0Wr5y","TXQ0Z9y4lw","5Mg9rYOfrY",
+"l83UdtvdkD","KZamHVNCPd","s4786MGlTF","pvgjSPOUYS","9iGoTaez9y","45cIHgdQsS","RzaZAazIWp","vkCHHhi5X7","7hyVv9y4lw","ksJbyZJTXH",
+"Yf2Ec1LB1L","WreyPnlaBy","Yh1hFYf2Ec","djsrviB08l","2Yz7EM3zXL","azIWpBFkb8","Fhtgl2ZHdk","m4bxUQssNC","pv0i7HlUbF","5Mg9rVIlwP",
+"qaofNJXljW","x3LDerz7Ut","WmadAHlUbF","uvf7ACK5W7","DLhzMHRxd8","bgJAzLDk6f","5NammTwano","8cVD3HlUbF","pAhR1VNCPd","uJScX1j5L8",
+"cShY2xciqp","2NslmJ2mQi","9XyT90BmCy","5Mg9r0MR5X","5drc6WaWsv","suY4xqUJMd","Mm8sirz7Ut","BbwgARsQUq","fmIK1HzZT8","VBjhzpv0i7",
+"JXljWIn3NS","dhSuHatef2","ReKEWDLhzM","MojnPRxrsm","9XyT9JJs5m","C2IrcLDk6f","atef2W3VFH","JRJQBFcWrW","uupzkFPfSE","9GXkXCp3mZ",
+"QChxsI7p2a","dQ5862DREs","4QMc9M3zXL","J2mQiHlUbF","yvOMIHlUbF","5nmWvVprf2","qaofNfaHir","MmsIocShY2","nlaByKASQ8","Zv7z0J2mQi",
+"hE1Ql8hJdt","7Ow5C8cVD3","JKWYR5ZaEz","yToGWFVMxo","s93MlZhwG1","VIlwPiKqhr","d7vjMrKDLJ","s93MlBbwgA","piJSkdQ586","55rfBZhwG1",
+"ulk41gjUTu","QClRLFhtgl","TXQ0Z2Yz7E","0MR5XMGlTF","Y1mC0hE1Ql","vLsmSIRh48","aL6AJiwzGk","jtn0XvLsmS","tl72W1v5hH","dhSuHNcICA",
+"OUYuFCNHmv","Y1mC0qaofN","4dEz6S2Dfu","hE1QlP6bcg","45cIHaDGtS","MmKGJMK07Y","mz8gxAkKTk","Y1mC0xciqp","4dEz6AOgEe","CqqaDECMvU",
+"45cIHZuDtD","Fhtgl5IhmG","suY4xJIqXi","piJSkyToGW","0PktIKASQ8","CIShGWreyP","TCgPp0ao3l","fFDrJF6PT2","RBhp0FPfSE","S77LHs4786",
+"lj07QMojnP","8hJdtEdBKc","QYxC0JJs5m","VNCPdCNHmv","HzZT8DLhzM","ECMvUtlILt","5ZaEzxReec","QssNCtjQxs","hYBCKzQt6Q","DcpWBWPmlx",
+"lH1kt5ZaEz","b29RJhUTw7","sx5Gl2Nslm","BbwgAqaofN","0BmCyReKEW","tvdkDmX2GE","FxX9qVLTy6","DcpWB4dEz6","FxX9qFcWrW","8FmFHbZLvS",
+"JRJQBQssNC","oVQp6HlUbF","4W0Tl16lHc","5drc6zHF1q","TwanozbIYY","3weIFfcJOy","Qworu2DREs","wDajXMkgy8","WPmlxHzZT8","AgJHQDcpWB",
+"DLhzMo8Uyd","C2Irc5VZjS","5IhmGCxVEf","5drc6SbRYy","7hyVvVprf2","ZzJHWqaofN","tl72Wm4bxU","29QAzVjCZq","2TRI7pmeCd","guMb8FVMxo",
+"8xEKzSWfou","zmLYDMK07Y","PYBf4dpe1v","zmLYDSmGzv","Vprf2e6e4z","MmKGJtaOXK","he9IANOHsz","VNCPdqaofN","GWqqXSmGzv","RkQkeFFDui",
+"xReecHfyNQ","Yh1hFHP433","uoStwEoToP","a00b5mz8gx","J2mQiMmsIo","JIqXifmIK1","BGaQYlCMxy","9y4lwK20wK","CIShG8RCUA","yToGW16lHc",
+"azIWpOxWIH","8TxD7618Di","fLNg8lCMxy","Gv3FqSjskQ","uupzktuDyS","ru4UGAmdQd","OxWIH6AFT0","HRxd8No0Qb","7hyVvlViBv","OUqFMVerEA",
+"RpBQm4W0Tl","tvdkDW3VFH","ZuDtDAOgEe","TXQ0ZBFkb8","wiHrZ8xEKz","5NammyluBx","NcICAMm8si","ThjNnJ2mQi","CK5W7t98iW","2hEEUiB08l",
+"AXpwE4QMc9","pv0i7iqv4k","JJs5mYjB9t","fmIK1KZamH","K4GS8k85Ae","cL0aEF6PT2","vLsmSRkQke","MezSW2ZHdk","RmDcrgtCA5","CK5W79eoRc",
+"BpYhVmX2GE","HlUbFcShY2","atef20Wr5y","cmXIXuAWyp","yofH3XflUq","KsjRK5iGN5","5ZaEzjfREu","RkQkeHlUbF","WMiS3Mm8si","UlU3Mh1zcH",
+"QYxC0v1Hln","FxX9qM6qcG","8hJdtjeskS","5NammTa8f6","FjHXRNOHsz","5Mg9rBbwgA","TwanosuY4x","ThjNnni2v1","ZhwG1gf8rI","iKqhrydG8U",
+"m4bxUHP433","ZuDtDlweGy","zmLYDlweGy","580YD24ARF","NcICAcL0aE","RACujogLgc","7fKYUzz4ZU","0MR5XuQIcz","ksJbyI7p2a","pv0i7FNYIM",
+"24ARFciuWz","ThjNnC2Irc","piJSkn1pmO","uN6r37lUXZ","EOE1oFGzgp","Kr8ysgf8rI","oGu6xLewvM","v2eC35VZjS","lweGyDG4sT","7ku1pIn3NS",
+"MK07Ysoy9t","G1RhSatef2","nlaByoVQp6","Nxx9VQChxs","HlUbFyvOMI","9XyT9uZPqg","zz4ZUzqH0W","tl72WpFrrl","ThjNnh1zcH","FLsphdQ586",
+"hYBCKTCgPp","ru4UGSWfou","CdyBVAkKTk","7fsYMk85Ae","OxWIHv1Hln","7lUXZSWfou","ECMvUQChxs","ru4UGJJs5m","Y1mC0gtCA5","NAFuwD6rBy",
+"aFFssksJby","2DREsEOE1o","VjCZqy94nw","Mm8siix74r","Kr8ysfLNg8","rKDLJC2Irc","fqypyQ6hMC","W7cTsAXpwE","Oz8yZuLtKs","IjTwPBFkb8",
+"UmaEvix74r","0Wr5ymz8gx","cShY2X6Pin","uTacxIn3NS","7ku1p55rfB","VLTy60PktI","K20wKXyPZN","8cVD3hE1Ql","M3zXLa00b5","pFrrlKASQ8",
+"No0QbVprf2","uLtKs7ku1p","tlILt2TRI7","hi5X7mz8gx","yEfy9SWfou","uoStw48cHL","4W0Tl5nmWv","16lHc0YAGH","9rlg9vkCHH","ni2v1NcICA",
+"8FmFHQnJ1S","0Wr5yRsQUq","CIShGyofH3","8hJdtVIlwP","gf8rI4W0Tl","S77LHQ6hMC","DQimpZzJHW","FPfSE9GXkX","FxX9qJRJQB","BFkb80MR5X",
+"pmeCdBbwgA","9GXkXFLsph","qaofN0BmCy","jeskSCK5W7","IjTwPW3VFH","0h1b1VIlwP","tlILtGv3Fq","wiHrZCp3mZ","lH1ktPb1pa","ogLgcVNCPd",
+"NcICACNHmv","okgRiuZPqg","hYBCKpAhR1","7fsYMJIqXi","Yh1hF580YD","7fsYMgf8rI","2DREsdQ586","MmsIoEOE1o","B3qem2DREs","07n1cEdBKc",
+"i3pydMmKGJ","7fKYU9iGoT","NAFuwtl72W","XyPZNi7WMQ","xXTI4s7Mxk","Zv7z0t59lR","MaJQsOHaBz","YOfrY0Wr5y","ulk41DQimp","Q6Lix2hEEU",
+"WMiS3sx5Gl","FjHXRMGlTF","hUTw7zmLYD","sx5Gl0h1b1","OxWIHaDGtS","tjQxsi7WMQ","hYBCKAgJHQ","azIWp7X3uy","580YDYjB9t","M3zXLMGlTF",
+"5ZaEzix74r","StlDJv1Hln","fFDrJTCgPp","uQIczMaJQs","IRh48L7cGc","48cHLBFkb8","v2eC3RsQUq","JRJQBv8yFN","AmdQdIBe8k","djsrvWPmlx",
+"yvOMIrKDLJ","G1RhScQOnv","RACujhSSvQ","yluBxYOfrY","taOXKThjNn","rhl0JaFFss","618DiFxX9q","Ss0ZuStlDJ","CK5W7GXdoH","5drc6yluBx",
+"zFgtBIn3NS","JKWYRuLtKs","VLTy6UlU3M","CNHmvuupzk","QbxXcvOqCE","fqypyYOfrY","0MR5X2ZHdk","JkzUnQ6hMC","a00b5O3iyQ","CxVEf7ku1p",
+"okgRiTXQ0Z","GXdoHQ6hMC","FPfSENOHsz","Kr8yslCMxy","5ZaEzcShY2","8TxD7FcWrW","RxrsmQssNC","S2Dfu5drc6","t98iWfcwDa","FhtglJXljW",
+"P6bcgZuDtD","JIqXiJXljW","fcJOyJXljW","nlaBy3otm6","8TxD7suY4x","DcpWBydG8U","WaWsvb29RJ","OHaBzJJs5m","fFDrJfFDrJ","zQt6Q9rlg9",
+"ni2v1aez9y","RBhp029QAz","NcICARBhp0","Z4I1vuAWyp","SmGzvuN6r3","FcWrWd85a9","Cfgr3taOXK","QClRLa00b5","jzUqRIRh48","8cVD3MezSW",
+"n1pmOb29RJ","580YDFwEJz","jS1ajAgJHQ","2Nslm9rlg9","fcJOyzbIYY","yluBx9eoRc","8U2nUzFgtB","VBjhzMezSW","rKDLJIn3NS","guMb8oGu6x",
+"CIShGYOfrY","zQt6Qhe9IA","MojnPn8pJ9","fcwDaFxX9q","lViBvBbwgA","MmKGJyvOMI","blLA94W0Tl","NOHszpv0i7","0Wr5yX6Pin","h1zcHtl72W",
+"rz7UtfaHir","bZLvStAOsr","suY4x8cVD3","Q6hMClXFOB","atef2Ul4a1","tAOsrsqVrf","v2eC35Namm","7hyVvxXTI4","2DREsru4UG","VBjhz29QAz",
+"5Drn0BCxeC","xReec8hJdt","yofH3xReec","y94nwqUJMd","mX2GEFnPFB","WPmlxv8yFN","zQt6QrKDLJ","ThjNnQ6Lix","FNYIMZUnqt","pFrrl55rfB",
+"Yh1hFVprf2","aL6AJVjCZq","D6rByIRh48","FFDuifmIK1","BbwgAFPfSE","tAOsrd7vjM","9XyT9QbxXc","5ZaEzuJScX","CNHmvXyPZN","EOE1ocShY2",
+"dmoS7s7Mxk","AOgEeY1mC0","s7Mxk4W0Tl","Waim6soy9t","0Wr5yBFkb8","QbxXcPYBf4","cShY2M3zXL","SWfouSs0Zu","s7MxkBpYhV","WPmlxnlaBy",
+"JkzUnVBjhz","vLsmSSWfou","OUqFMNcICA","VerEAguMb8","5iGN5DLhzM","v8yFNZzJHW","JRJQB1j5L8","jfREuiqv4k","W3VFHjiVBP","9iGoTnFqik",
+"fcwDaAgJHQ","fcwDaK4GS8","WmadACxVEf","BCxeCAmdQd","ciuWzVBjhz","l83Uds4786","aL6AJ45cIH","9eoRc2hEEU","aez9y29QAz","GSQwjydG8U",
+"iB08l4dEz6","dpe1vJRJQB","HfyNQlsQGo","C2Ircrz7Ut","oVQp6azIWp","CNHmv64s8N","oQ87rNcICA","7fKYUyofH3","jS1ajnlaBy","QworuG1RhS",
+"AOgEeiB08l","MaJQs1v5hH","9XyT9rhl0J","brhlQ2Nslm","vkCHHqUJMd","sx5GlwiHrZ","ogLgcvOqCE","piJSkfmIK1","ZhwG1yvOMI","VNCPdHRxd8",
+"55rfBD6rBy","HzZT8Vprf2","jfREuNhXdu","zFgtBAIYUu","MezSWO3iyQ","HP433FVMxo","GWqqXtvdkD","brhlQMojnP","hYBCKpT8wu","MojnPhE1Ql",
+"7ku1pprNT6","jS1aj6q6L9","IjTwPGXdoH","Pb1pa8FmFH","WaWsv8U2nU","PYBf4FnPFB","5Drn0DQimp","KASQ8BCxeC","ru4UGFcWrW","8TxD7tl72W",
+"QworuIRh48","0KyfsWDVWJ","ZJTXHhi5X7","yvOMIfcJOy","d7vjMfLNg8","Gv3FqpAhR1","WMiS3hE1Ql","IBe8kyEfy9","atef2jS1aj","24ARFHlUbF",
+"JXljWpiJSk","aDGtS8U2nU","1j5L8lXFOB","VLTy6rKDLJ","NhXduZzJHW","WreyPRmDcr","0Wr5yStlDJ","brhlQgf8rI","BFkb8aL6AJ","HRxd8l83Ud",
+"fqypyWaim6","WaWsvuoStw","qQxHPWPmlx","RBhp0WDVWJ","uPX7GPOUYS","mz8gxZ4I1v","fmIK1JXljW","1j5L8HP433","pvgjSxXTI4","fcwDa9GXkX",
+"2DREsh1zcH","xReecbZLvS","XyPZNEoToP","HRxd8FNYIM","MojnPtjQxs","J2mQiO3iyQ","FcWrWdhSuH","oVQp6uoStw","FNYIMCK5W7","29QAz0Wr5y",
+"2hEEUrhl0J","HfyNQqaofN","n1pmOuQIcz","TXQ0ZblLA9","tl72WuZPqg","oVQp6UlU3M","VerEAZzJHW","BGaQYgf8rI","euZA5DG4sT","Chuy3Chuy3",
+"i7WMQqQxHP","ZhwG1cShY2","HzZT8FnPFB","CdyBVVNCPd","9iGoT7fKYU","yEfy964s8N","OxWIHHP433","KsjRKRpBQm","RzaZABbwgA","sqVrf29QAz",
+"BFkb8guMb8","aez9yt98iW","uAWypuupzk","GXdoH1v5hH","5drc6Vprf2","0PktINxx9V","nnP8oiB08l","YjB9tRzaZA","d85a9AIYUu","8FmFHW3VFH",
+"LbRTHWDVWJ","MK07YzmLYD","AIYUupAhR1","gIYvExXTI4","HP433CxVEf","pmeCdQ6hMC","UlU3MksJby","3otm6RBhp0","mz8gxaez9y","tlILtWaim6",
+"zz4ZUyofH3","VNCPdIRh48","y94nwChuy3","WDVWJzFgtB","QworuVBjhz","jtn0Xhi5X7","ulk415VZjS","GWqqXMaJQs","14FLRHfyNQ","FVMxoUmaEv",
+"IRh480YAGH","AgJHQBpYhV","b29RJUl4a1","BpYhVQWxoT","a00b5dhSuH","gtCA5d7vjM","FcWrW07n1c","uN6r3TCgPp","7fKYUnlaBy","5ZaEzJRJQB",
+"ciuWzydG8U","iKqhr5drc6","SjskQWmadA","1LB1LhSSvQ","7lUXZprNT6","aL6AJlsQGo","vOqCEtaOXK","Cfgr37X3uy","v1HlnLewvM","mz8gxO3iyQ",
+"WreyPNhXdu","fqypyMkgy8","2hEEUpv0i7","5Drn0lXFOB","M6qcGgIYvE","pWiOsBGaQY","FwEJztAOsr","CqqaDqQxHP","MmKGJF6PT2","i3pydix74r",
+"lj07QtjQxs","hSSvQTwano","ReKEWFjHXR","Waim69iGoT","MmKGJMkgy8","aL6AJBGaQY","UlU3MS2Dfu","7ku1p580YD","RkQkexReec","9GXkXPOUYS",
+"brhlQzmLYD","2ZHdkY1mC0","QworuBFkb8","Nxx9VoVQp6","xReec4W0Tl","8cVD3IKxdL","a00b5fLNg8","h1zcHFVMxo","t98iW8RCUA","uLtKsVerEA",
+"cQOnv8RCUA","Ss0Zu7X3uy","F6PT20YAGH","Gv3FqeuZA5","BCxeC55rfB","CK5W7PYBf4","4W0Tl5IhmG","Y1mC00h1b1","QClRLtjQxs","1LB1LoQ87r",
+"xciqp5drc6","ni2v1vkCHH","9y4lwMkgy8","yToGWDcpWB","0MR5XlXFOB","Nxx9V8hJdt","5ZaEzlkMUA","n1pmOUl4a1","O3iyQHlUbF","l83UdpWiOs",
+"9rlg9xXTI4","wiHrZLDk6f","s7MxkgIYvE","0YAGHhE1Ql","RkQkeJRJQB","3weIFh1zcH","UmaEvjfREu","LDk6fuLtKs","Mm8siY1mC0","gtCA5lXFOB",
+"YOfrYhE1Ql","ulk41S77LH","64s8NFxX9q","pmeCd8cVD3","NOHszFPfSE","FnPFBatef2","VerEA6AFT0","7Ow5CQChxs","0Kyfsi3pyd","lViBvMmsIo",
+"cShY28U2nU","2ZHdk2TRI7","W3VFHzQt6Q","M6qcGChuy3","P6bcghYBCK","Ta8f6mz8gx","64s8NzQt6Q","m4bxUOxWIH","48cHLUl4a1","ThjNn3otm6",
+"e6e4zx3LDe","yluBxpvgjS","RxrsmRmDcr","6AFT0pT8wu","VerEAF6PT2","soy9tgjUTu","m4bxUrKDLJ","VIlwPcQOnv","VerEAX6Pin","GSQwjQ6Lix",
+"EOE1ohYBCK","IRh48tuDyS","uoStwCp3mZ","4QMc9W7cTs","SWfouYOfrY","IBe8kQChxs","gf8rI1v5hH","pWiOsThjNn","iKqhri3pyd","v2eC3lsQGo",
+"8U2nUUl4a1","piJSk1j5L8","9GXkXZzJHW","lweGyU3yw5","pWiOssqVrf","Mm8siydG8U","h1zcHGXdoH","G1RhSdjsrv","S77LHNcICA","Kr8ysCdyBV",
+"piJSkzHF1q","prNT6GSQwj","4W0TlGv3Fq","64s8NEOE1o","lm0pD7Ow5C","Q6LixtlILt","PYBf4Waim6","suY4xQYxC0","YjB9tlpF6W","24ARFQClRL",
+"djsrvuvf7A","FjHXRFVMxo","W3VFHbZLvS","BbwgAQWxoT","CK5W7AmdQd","aDGtSThjNn","DLhzMwDajX","okgRiWreyP","HzZT8atef2","wiHrZmX2GE",
+"tjQxsblLA9","NAFuwlkMUA","CxVEfl83Ud","blLA9K20wK","CK5W75drc6","gIYvElViBv","Rxrsm8U2nU","dQ586RACuj","JIqXiGWqqX","yvOMIt98iW",
+"VerEAlweGy","iqv4kStlDJ","Pb1paEdBKc","ciuWzAgJHQ","bgJAzgIYvE","pv0i7cShY2","cShY2UmaEv","Pb1paRmDcr","YjB9tWreyP","aez9ypvgjS",
+"2Yz7EciuWz","ydG8UOUqFM","MezSWfqypy","2DREsFGzgp","Pb1pasx5Gl","jfREuRBhp0","DLhzMRACuj","MmKGJRzaZA","prNT65Namm","HzZT8jzUqR",
+"s93MlzQt6Q","VjCZqpvgjS","Chuy3b29RJ","prNT6M6qcG","NAFuwjeskS","PYBf4pvgjS","atef2In3NS","WDVWJcQOnv","dmoS7pmeCd","oVQp6Kr8ys",
+"Ss0ZujS1aj","d85a9Qworu","QClRLMK07Y","AgJHQWMiS3","DLhzMtAOsr","qaofNQbxXc","TwanoY1mC0","QworuBGaQY","hSSvQWMiS3","s7Mxk6AFT0",
+"Q6hMC4QMc9","QWxoT55rfB","AmdQdIKxdL","oGu6xDG4sT","Vprf2Rxrsm","S77LHZzJHW","WreyPuAWyp","jSjS3FVMxo","e6e4ziKqhr","VLTy6piJSk",
+"fcJOyuLtKs","fLNg80h1b1","ThjNnRmDcr","BpYhVMkgy8","9iGoTcmXIX","DcpWBIRh48","a00b5lCMxy","pFrrlGSQwj","Ul4a1yEfy9","Yf2EcQWxoT",
+"DQimpUvlv4","hi5X7WMiS3","SmGzvazIWp","Q6LixfcJOy","gIYvED6rBy","7lUXZzbIYY","AmdQdCIShG","RmDcrW7cTs","I7p2a1j5L8","bZLvSFLsph",
+"yToGW9GXkX","0Wr5y6AFT0","xXTI4uJScX","O3iyQdQ586","D6rBy0ao3l","suY4x8TxD7","B3qem7fKYU","7fKYUWPmlx","Yw2oURxrsm","W3VFH7X3uy",
+"zbIYYB3qem","1v5hHciuWz","SWfoupWiOs","8TxD7LewvM","BGaQYDz1R3","K20wKlkMUA","lCMxyLewvM","IKxdLzqH0W","cL0aEWDVWJ","x3LDe7fKYU",
+"UlU3M7ku1p","29QAzblLA9","RBhp0PYBf4","618DiFnPFB","JXljW9y4lw","5ZaEzsoy9t","n1pmO9eoRc","Z4I1vnnP8o","blLA9fcJOy","FwEJzFVMxo",
+"MaJQszqH0W","tuDySuTacx","t59lRoVQp6","oVQp6ZzJHW","bZLvSs4786","b29RJsoy9t","tl72WvOqCE","PYBf40PktI","JKWYRgjUTu","JkzUnJRJQB",
+"aFFssFwEJz","hUTw7yluBx","1v5hHzz4ZU","Ss0Zu2Nslm","5IhmG9iGoT","C2IrczHF1q","dQ586NOHsz","zz4ZUYf2Ec","0MR5XUmaEv","ZJTXHzY1GY",
+"AkKTkFFDui","Ss0ZuBFkb8","ogLgcYw2oU","JXljWuvf7A","BCxeCAIYUu","aFFssbZLvS","uLtKsMm8si","oVQp6VjCZq","jSjS345cIH","iqv4k0ao3l",
+"CdyBVCNHmv","3weIF8FmFH","4W0TlpT8wu","cShY2CxVEf","5Mg9rMGlTF","soy9tcQOnv","8TxD7Mm8si","U3yw5yofH3","PYBf4O3iyQ","uLtKsaL6AJ",
+"6q6L9vLsmS","cL0aEqUJMd","zY1GY5IhmG","Q6hMCAkKTk","2ZHdkG1RhS","VjCZquupzk","jzUqRlsQGo","UmaEvuAWyp","Ta8f6TXQ0Z","lH1kt8TxD7",
+"n1pmOBFkb8","vkCHHCp3mZ","jfREuksJby","VLTy6JXljW","1j5L8jiVBP","y94nwv1Hln","qUJMdRzaZA","7ku1pOUYuF","2DREsRmDcr","24ARF5Mg9r",
+"uN6r3JIqXi","zbIYYBGaQY","zz4ZUpmeCd","AXpwENcICA","QYxC0ZJTXH","ZhwG1tjQxs","hUTw7pv0i7","Mkgy8lXFOB","yluBxmz8gx","Chuy3K20wK",
+"55rfBgtCA5","0PktIt98iW","aDGtSpAhR1","tjQxsIn3NS","hE1QlkZANm","fmIK10MR5X","zQt6QMmKGJ","azIWpNAFuw","29QAzoQ87r","gtCA5RzaZA",
+"StlDJIRh48","soy9trhl0J","jS1ajLDk6f","MezSWQssNC","l83UdOUYuF","jeskSaez9y","tjQxstuDyS","uJScXtl72W","lCMxyQssNC","5Mg9rZJTXH",
+"Q6LixzFgtB","s93MllH1kt","I7p2aEdBKc","piJSkStlDJ","nlaBylj07Q","vLsmSNo0Qb","pFrrlDcpWB","O3iyQazIWp","WDVWJzz4ZU","K20wKWDVWJ",
+"jfREuNcICA","BCxeCMmsIo","HP433K20wK","AmdQdFhtgl","0ao3lAgJHQ","dmoS7uN6r3","HRxd8Vprf2","tAOsrdpe1v","FGzgpMezSW","5Namm2ZHdk",
+"7Ow5C5drc6","4QMc9cQOnv","HP433WaWsv","vOqCEsuY4x","JXljWt98iW","uAWypsqVrf","uZPqgBCxeC","IjTwP0ao3l","BGaQYzbIYY","7ku1pbgJAz",
+"DG4sTksJby","uoStwKr8ys","oVQp6FNYIM","tuDySQChxs","pT8wujzUqR","7fKYUuAWyp","07n1cokgRi","zqH0WAIYUu","Fhtgl5drc6","xReecpWiOs",
+"zFgtB0ao3l","iwzGke6e4z","hi5X7bgJAz","lj07QKASQ8","qQxHPGrDg7","8U2nULDk6f","y94nwjtn0X","pv0i7XflUq","FFDuirz7Ut","pmeCdFVMxo",
+"zFgtBlsQGo","Pb1paZhwG1","gIYvEciuWz","hUTw7HlUbF","ulk41nFqik","cShY2uvf7A","QWxoTRBhp0","SbRYy8xEKz","uAWypAmdQd","IKxdLRpBQm",
+"7fKYUZ4I1v","FFDuiuJScX","ru4UGOxWIH","2Yz7EfaHir","HlUbFpFrrl","FFDui5VZjS","kB5nPzFgtB","EdBKcMkgy8","Qworu0BmCy","DLhzMjS1aj",
+"lViBvJXljW","Vprf2GrDg7","gtCA5Zv7z0","Nxx9VHRxd8","Cfgr3Yf2Ec","MmKGJi3pyd","s4786ZhwG1","BFkb8mz8gx","4QMc9fqypy","2DREsQYxC0",
+"8xEKzrz7Ut","pv0i7ZJTXH","MezSWDLhzM","JkzUn7Ow5C","RsQUqBbwgA","Ss0ZuCdyBV","JXljWs4786","Zv7z0S77LH","zbIYYxReec","1LB1LazIWp",
+"sx5Gl9XyT9","fLNg8AIYUu","2Yz7E3weIF","pv0i70Wr5y","IKxdLDcpWB","9iGoT7hyVv","gjUTuFPfSE","tl72WYf2Ec","euZA55Mg9r","I7p2aOxWIH",
+"5Mg9rxciqp","Rxrsmd7vjM","e6e4zFNYIM","K4GS8I7p2a","s93MlvOqCE","RBhp0S77LH","LDk6fFhtgl","Ta8f6uoStw","FwEJzMm8si","kB5nPPYBf4",
+"0Wr5ylsQGo","Yh1hF2TRI7","HRxd8Rxrsm","okgRilpF6W","fLNg81j5L8","fcJOyECMvU","uAWypD6rBy","K4GS8Rxrsm","VNCPd0BmCy","C2IrcAIYUu",
+"OxWIHPYBf4","M6qcGcQOnv","euZA5lweGy","B3qemZ4I1v","kB5nPL7cGc","gIYvE1v5hH","jzUqRmz8gx","9XyT97lUXZ","DG4sTMmKGJ","ECMvUd85a9",
+"ECMvUEOE1o","aFFss3weIF","KsjRKzqH0W","fcwDaCfgr3","prNT6s7Mxk","QWxoT5iGN5","S77LHWDVWJ","W7cTseuZA5","tl72WJJs5m","zbIYYS2Dfu",
+"pFrrlzY1GY","jiVBP5nmWv","jSjS3JkzUn","lj07Qni2v1","fqypy9XyT9","OUYuFpT8wu","lweGyAOgEe","taOXKmX2GE","64s8NBFkb8","LDk6fMojnP",
+"9GXkXAOgEe","1j5L8ZuDtD","L7cGcF6PT2","B3qem0BmCy","3weIFLewvM","brhlQpFrrl","DQimp1v5hH","Mm8siVjCZq","ksJby7lUXZ","yluBxQbxXc",
+"M6qcGMaJQs","0BmCy8cVD3","JRJQB9y4lw","FFDuiaDGtS","qQxHPvLsmS","piJSklXFOB","BCxeCa00b5","RxrsmbZLvS","9rlg90MR5X","5nmWvFLsph",
+"uZPqg7hyVv","lsQGovOqCE","9y4lwAmdQd","vLsmSiqv4k","FcWrWvkCHH","8hJdtmz8gx","RzaZA8xEKz","NhXduQworu","VerEAM6qcG","W7cTsksJby",
+"zFgtBL7cGc","Zv7z0F6PT2","gjUTuD6rBy","2TRI7ni2v1","8hJdtpiJSk","5IhmGiqv4k","piJSkQworu","soy9tFnPFB","1LB1L7fKYU","BCxeCxciqp",
+"dpe1vuQIcz","aez9yBFkb8","o8UydlsQGo","jtn0X8xEKz","RACujFGzgp","rz7UtguMb8","FnPFBtAOsr","0ao3ltuDyS","W7cTsI7p2a","VjCZqni2v1",
+"5ZaEzTwano","m4bxUMojnP","Ul4a18FmFH","2Yz7E9eoRc","jS1ajvOqCE","FjHXRNAFuw","VNCPdblLA9","pT8wuCp3mZ","Yh1hFYw2oU","uQIczvLsmS",
+"IRh48MezSW","uN6r3h1zcH","2DREsJXljW","M6qcG8xEKz","zY1GYRsQUq","Cp3mZ9GXkX","nFqikd85a9","WreyPhi5X7","zHF1qChuy3","QYxC0QWxoT",
+"UlU3MCfgr3","NhXducShY2","cShY2Y1mC0","OUYuFjS1aj","aDGtSDLhzM","i3pydfmIK1","2DREsOz8yZ","Uvlv4zz4ZU","0Wr5yaL6AJ","0ao3lrz7Ut",
+"DcpWBFGzgp","hSSvQ0ao3l","Mm8sipiJSk","580YD64s8N","cL0aEokgRi","AmdQdaDGtS","D6rByBCxeC","o8UydAXpwE","0h1b1Zv7z0","8cVD3pv0i7",
+"lXFOBLewvM","NAFuwU3yw5","5nmWvMmsIo","DcpWBoGu6x","iKqhrEoToP","Kr8ysAkKTk","9iGoTECMvU","lCMxyHP433","k85Aey94nw","lH1ktBCxeC",
+"YjB9t9XyT9","FnPFB4QMc9","okgRizqH0W","QssNCs93Ml","UmaEvydG8U","yToGWFLsph","v1Hlnd85a9","he9IAtjQxs","tAOsr24ARF","rhl0JNOHsz",
+"gIYvESmGzv","DcpWB5VZjS","StlDJ7X3uy","rKDLJ8FmFH","16lHcThjNn","dhSuHW3VFH","55rfBpmeCd","JkzUn5iGN5","bZLvSm4bxU","C2Irc24ARF",
+"MaJQs6AFT0","NAFuwRACuj","1LB1LFxX9q","0MR5Xgf8rI","1LB1LaFFss","4QMc9Q6hMC","MmsIotjQxs","aDGtSgtCA5","7Ow5CEdBKc","NhXduogLgc",
+"zbIYYi3pyd","s7Mxk64s8N","M6qcGtuDyS","0BmCyHP433","6q6L9Twano","Ta8f6x3LDe","1v5hHazIWp","tvdkDCdyBV","XyPZNaDGtS","FxX9qGWqqX",
+"FLsphDG4sT","5iGN5TCgPp","mz8gxgIYvE","5IhmGY1mC0","iKqhrQChxs","kZANm5IhmG","jfREu16lHc","Yh1hFAIYUu","CxVEfQbxXc","xciqpNAFuw",
+"ksJbyKsjRK","0YAGHDG4sT","jeskSO3iyQ","uoStwAIYUu","64s8N5Namm","aL6AJ0Wr5y","MmsIo1v5hH","16lHcFcWrW","m4bxUGrDg7","9XyT9FnPFB",
+"9iGoT618Di","1LB1LcQOnv","zz4ZUy94nw","GWqqXuPX7G","DcpWBTCgPp","Oz8yZCqqaD","e6e4z9iGoT","okgRiRkQke","zqH0WAmdQd","8U2nUpWiOs",
+"ciuWzoGu6x","EdBKcQYxC0","wiHrZReKEW","oGu6xaDGtS","zbIYYi7WMQ","azIWplXFOB","6AFT0SWfou","gdQsSazIWp","FFDuiuTacx","lXFOBqQxHP",
+"CxVEfix74r","2TRI71v5hH","uJScX7lUXZ","AOgEe0Wr5y","16lHc2ZHdk","x3LDelkMUA","zY1GY45cIH","o8UydQYxC0","lkMUAPOUYS","v1HlnyluBx",
+"WaWsvL7cGc","7fKYUlsQGo","dpe1vFFDui","MGlTFIBe8k","2TRI7MmsIo","oVQp6Ss0Zu","TCgPpzHF1q","MmsIoBpYhV","RsQUqVjCZq","oQ87rPYBf4",
+"48cHLgtCA5","0ao3lhE1Ql","RxrsmHRxd8","ydG8UhUTw7","dQ586Mm8si","cmXIXvOqCE","ZUnqtiKqhr","ulk41Rxrsm","m4bxU2ZHdk","VIlwPHlUbF",
+"pT8wuFLsph","lpF6WyofH3","HlUbFWaWsv","fcJOyWaWsv","gdQsSNhXdu","MK07YxXTI4","2ZHdkStlDJ","cmXIXQ6hMC","In3NSZuDtD","v8yFN9y4lw",
+"M3zXLQ6Lix","0MR5XHP433","tlILt4dEz6","tlILtMojnP","zbIYYzbIYY","atef2fcwDa","LbRTHQClRL","mz8gxMaJQs","Q6hMCFcWrW","lweGyDLhzM",
+"580YDuvf7A","CdyBV5nmWv","vOqCEO3iyQ","1j5L8In3NS","GSQwj7Ow5C","FFDuiMmsIo","SbRYyOz8yZ","cQOnvSjskQ","lpF6WprNT6","okgRi8FmFH",
+"ix74rwiHrZ","AkKTk7X3uy","t98iW9iGoT","h1zcHU3yw5","i7WMQKZamH","tAOsrtuDyS","QClRLDLhzM","zz4ZURpBQm","t59lRDQimp","wDajXwDajX",
+"QnJ1SFVMxo","AgJHQv8yFN","guMb8SbRYy","cQOnvBbwgA","zz4ZUbrhlQ","uPX7GfFDrJ","lViBvdQ586","ru4UGMK07Y","jfREuFcWrW","pFrrlQYxC0",
+"K20wKkZANm","FGzgpBGaQY","14FLRSmGzv","8xEKz7lUXZ","S2Dfu7fKYU","Ta8f6Mkgy8","2hEEUFnPFB","2DREsDG4sT","rz7UtpAhR1","YjB9tQClRL",
+"cQOnvcShY2","FNYIMcL0aE","euZA5Cp3mZ","9rlg9gtCA5","2DREsYjB9t","ru4UG7Ow5C","MmKGJIBe8k","t98iWix74r","suY4xqaofN","jfREu29QAz",
+"6AFT0jzUqR","Chuy3WPmlx","In3NSl83Ud","y94nwRBhp0","S2Dfu7X3uy","tjQxssoy9t","DcpWBRkQke","tjQxsNcICA","FLsphTXQ0Z","x3LDeUlU3M",
+"VerEAlH1kt","s93MlFGzgp","VjCZqs4786","2DREsP6bcg","8hJdtblLA9","Pb1paiqv4k","blLA9Nxx9V","Q6hMCZ4I1v","I7p2aCxVEf","tlILtJkzUn",
+"rhl0JFFDui","FGzgp3otm6","C2Irc5Drn0","BGaQYrhl0J","580YDtjQxs","uLtKsHP433","Ss0ZuQ6Lix","tl72WKr8ys","rKDLJzbIYY","ZhwG1lkMUA",
+"nnP8oJIqXi","n1pmOi3pyd","d7vjMZhwG1","B3qemxReec","FNYIMSs0Zu","EdBKc0MR5X","fcJOyWMiS3","pv0i7jeskS","K4GS8Ul4a1","lm0pDVNCPd",
+"iwzGkWaWsv","Waim6W7cTs","gdQsShi5X7","9eoRchYBCK","KZamH5VZjS","Q6Lix0BmCy","VNCPd5nmWv","t59lRl83Ud","bgJAzni2v1","0YAGHjfREu",
+"VBjhztuDyS","s4786Oz8yZ","TXQ0ZAkKTk","tuDySBGaQY","uPX7GuN6r3","29QAzDQimp","aL6AJs7Mxk","QworuKZamH","FNYIMpT8wu","pmeCddjsrv",
+"8cVD38xEKz","MojnPatef2","U3yw5fFDrJ","x3LDeCfgr3","U3yw5iqv4k","gdQsS0Wr5y","yofH3aDGtS","M3zXLJRJQB","AXpwESWfou","MmKGJJJs5m",
+"v2eC3FjHXR","b29RJrhl0J","pWiOsgIYvE","HRxd8WDVWJ","uZPqgHlUbF","NAFuwMm8si","FFDuil83Ud","ZzJHWRsQUq","Ul4a1SWfou","soy9tCIShG",
+"0KyfsYw2oU","CIShG0Kyfs","WMiS3FFDui","suY4x7ku1p","o8UydciuWz","In3NSKr8ys","v1HlnK20wK","LewvMYh1hF","tuDySd7vjM","Nxx9VXflUq",
+"In3NSd7vjM","0YAGH5ZaEz","hE1QlsuY4x","qUJMdSWfou","MmKGJYjB9t","jiVBPv8yFN","hE1QlprNT6","aez9yQ6hMC","pFrrlkB5nP","7X3uye6e4z",
+"rz7UtpFrrl","QnJ1S9y4lw","TwanoRmDcr","Vprf2Uvlv4","lViBv0Wr5y","uoStwQWxoT","zmLYDIBe8k","bZLvSFFDui","wDajX5iGN5","ZzJHWnFqik",
+"B3qemhYBCK","GrDg7YjB9t","uPX7G9eoRc","JJs5mVLTy6","LbRTHOxWIH","blLA9e6e4z","S2DfuRmDcr","nlaBylViBv","ZhwG1C2Irc","0ao3lsuY4x",
+"FwEJz8TxD7","cmXIXhE1Ql","MK07YB3qem","kZANm5nmWv","W3VFHwDajX","uN6r3bZLvS","14FLRIBe8k","M6qcGK4GS8","lpF6WdQ586","uoStwMmsIo",
+"W3VFHsuY4x","QChxspvgjS","d7vjM5Drn0","RACujiKqhr","DLhzMzFgtB","iKqhrZJTXH","IBe8ktAOsr","pFrrl0PktI","o8Uydv2eC3","J2mQiQ6hMC",
+"blLA9zY1GY","55rfB4QMc9","taOXKguMb8","qaofNFxX9q","djsrviwzGk","IBe8k6AFT0","9rlg9VerEA","OHaBz24ARF","YjB9tYjB9t","ogLgc580YD",
+"Ss0ZuLewvM","SjskQnnP8o","OxWIHJIqXi","lH1ktyToGW","Kr8ysChuy3","7X3uyUmaEv","mX2GEB3qem","6q6L97Ow5C","Gv3FqFFDui","uN6r3gjUTu",
+"MK07Yy94nw","ciuWzMmsIo","WaWsvSs0Zu","s93Mlx3LDe","tvdkDECMvU","8FmFHBGaQY","yvOMIjS1aj","lsQGoZuDtD","qQxHP3otm6","VIlwPLbRTH",
+"7fsYMFhtgl","s93MluQIcz","sx5GlwDajX","fqypymz8gx","NcICAOxWIH","zHF1qcL0aE","yluBxkB5nP","djsrvrz7Ut","jS1ajs7Mxk","uN6r30PktI",
+"t98iWQWxoT","sx5Glfqypy","rz7Uto8Uyd","CK5W7suY4x","dQ586Z4I1v","JIqXijzUqR","45cIHTCgPp","FcWrW0MR5X","v2eC3hUTw7","pAhR1Yw2oU",
+"HRxd8QClRL","QChxslweGy","BFkb8MK07Y","o8UydsqVrf","55rfB2DREs","X6Pin8TxD7","JJs5mWreyP","48cHLIKxdL","RACujqQxHP","s93MlTa8f6",
+"FxX9qksJby","WmadAhSSvQ","fcwDadQ586","brhlQ07n1c","YOfrYtuDyS","SjskQl83Ud","lm0pD618Di","ksJbyDQimp","SWfouZUnqt","fmIK1ZUnqt",
+"hYBCKzHF1q","Chuy3pmeCd","hSSvQiqv4k","WaWsvmX2GE","4W0TlJIqXi","ZzJHWcQOnv","9GXkXWaim6","9iGoT1v5hH","Q6Lix3otm6","G1RhSDQimp",
+"7lUXZVIlwP","iB08lThjNn","VjCZq9iGoT","Cfgr3lViBv","MojnPv2eC3","SbRYyFGzgp","WreyP8cVD3","DQimpfcJOy","ZuDtDOUYuF","Fhtglxciqp",
+"pmeCdcmXIX","3otm6k85Ae","uAWypXflUq","2ZHdkyToGW","PYBf4sx5Gl","C2IrcTCgPp","nFqikydG8U","lsQGohi5X7","K4GS8JIqXi","In3NSuTacx",
+"7fKYUAgJHQ","lCMxyFPfSE","S2DfunnP8o","S77LHFNYIM","KASQ8WDVWJ","5drc6AgJHQ","JIqXipAhR1","CIShGjtn0X","0h1b1uN6r3","580YDrz7Ut",
+"45cIHsoy9t","14FLRRkQke","tvdkDGWqqX","16lHcM3zXL","VNCPdPYBf4","VBjhzFLsph","d85a9WmadA","2Nslm1j5L8","i3pydECMvU","prNT6KsjRK",
+"NAFuwFVMxo","HP433SjskQ","BFkb8euZA5","9rlg9ru4UG","9rlg9gjUTu","RkQken8pJ9","dpe1vSWfou","MmsIoy94nw","s93MlBCxeC","FNYIMDQimp",
+"ZUnqt3weIF","2hEEUlpF6W","QYxC0BCxeC","SmGzvDz1R3","F6PT2hi5X7","9y4lwTwano","64s8NNxx9V","3weIFpAhR1","RxrsmCqqaD","X6PinL7cGc",
+"4W0TlIn3NS","XyPZNrhl0J","0BmCypvgjS","14FLR5ZaEz","aL6AJpFrrl","blLA9uZPqg","FhtgloQ87r","bgJAzuupzk","S2DfuEoToP","yvOMIQWxoT",
+"hSSvQv8yFN","WaWsvv1Hln","NhXdu9y4lw","fFDrJXyPZN","Q6LixC2Irc","pWiOsdmoS7","ix74rFhtgl","DcpWBuJScX","lViBvVIlwP","b29RJIjTwP",
+"HRxd80h1b1","TCgPpuJScX","rhl0JHP433","JXljWQnJ1S","OxWIH45cIH","AOgEeLbRTH","lH1kttlILt","2Yz7EBCxeC","NhXdu07n1c","vOqCEyluBx",
+"azIWpECMvU","GrDg7X6Pin","d85a9uoStw","StlDJUlU3M","VIlwPMK07Y","24ARFpT8wu","5Mg9ryToGW","8RCUAVNCPd","JKWYR0YAGH","zY1GYkZANm",
+"QnJ1S7hyVv","VerEAksJby","QChxsIRh48","NhXduo8Uyd","RmDcrtuDyS","0h1b1FVMxo","FFDuidmoS7","Qworu8TxD7","jS1ajaez9y","mz8gxs4786",
+"4W0TluLtKs","n1pmOPb1pa","WMiS3SbRYy","GWqqXRsQUq","SWfoub29RJ","i3pydulk41","5drc65Namm","AIYUuzz4ZU","gIYvETa8f6","jiVBPCp3mZ",
+"G1RhSRBhp0","OHaBz2DREs","VIlwPdQ586","WMiS3tjQxs","5NammtAOsr","NcICAru4UG","QbxXcd85a9","tlILtRxrsm","iB08lsuY4x","1v5hHF6PT2",
+"RmDcrY1mC0","zz4ZUTa8f6","0PktIlj07Q","HP433HzZT8","yvOMI7lUXZ","EdBKcgjUTu","FLsphMGlTF","FNYIMC2Irc","h1zcHRzaZA","l83UdFVMxo",
+"t98iWiqv4k","pv0i7s7Mxk","0BmCyNhXdu","lj07QAOgEe","8xEKzCIShG","BGaQYjSjS3","G1RhS7Ow5C","5VZjSl83Ud","zHF1qNxx9V","AgJHQ0Kyfs",
+"GWqqXxXTI4","lXFOBNo0Qb","K4GS8i7WMQ","S2DfuOz8yZ","pvgjSk85Ae","uQIcz0BmCy","29QAzbZLvS","GSQwjOUYuF","FFDuiRkQke","ni2v1D6rBy",
+"OUYuFJkzUn","1j5L8ix74r","hE1QlMmsIo","QClRL9iGoT","hSSvQUl4a1","zmLYD2hEEU","vLsmSLbRTH","uN6r3aez9y","Fhtgllj07Q","IjTwPZzJHW",
+"wiHrZlViBv","JKWYRfaHir","S77LH5Mg9r","xXTI4gjUTu","tlILt4QMc9","DcpWBZUnqt","rhl0JpiJSk","AkKTkrKDLJ","brhlQfaHir","CxVEffqypy",
+"azIWph1zcH","I7p2aVLTy6","VLTy6v2eC3","SbRYyhe9IA","atef2NcICA","hUTw7ni2v1","h1zcHokgRi","SbRYyNo0Qb","cmXIX3weIF","DLhzM5Mg9r",
+"0Kyfss93Ml","07n1cxciqp","Cfgr3AIYUu","IjTwPTwano","AmdQdQWxoT","djsrvk85Ae","uLtKspWiOs","Q6Lix4dEz6","UmaEvMGlTF","lH1ktD6rBy",
+"HlUbFOHaBz","QYxC0faHir","5drc60Wr5y","o8UydqaofN","jiVBP0ao3l","580YDJkzUn","S2Dfu0YAGH","KsjRKsuY4x","BGaQYfaHir","JkzUn0ao3l",
+"NcICA9iGoT","JkzUnYh1hF","zFgtBlweGy","14FLRazIWp","FhtglI7p2a","nnP8oRACuj","SWfou0BmCy","AgJHQlsQGo","BpYhVd85a9","JkzUnOUqFM",
+"ydG8UzFgtB","QnJ1S4W0Tl","UlU3MgdQsS","oGu6xFPfSE","mX2GEIBe8k","JkzUnpv0i7","Uvlv4Y1mC0","BFkb8WMiS3","9eoRcWMiS3","5Mg9rsuY4x",
+"atef2IKxdL","EoToPDcpWB","AIYUuGXdoH","s93MlO3iyQ","HfyNQMkgy8","t98iW5nmWv","LewvMgIYvE","uPX7GVjCZq","Yh1hFU3yw5","nlaByOHaBz",
+"ix74r9XyT9","iB08ld7vjM","9GXkXzY1GY","s93MlyvOMI","RsQUqRpBQm","gIYvEGrDg7","nFqikNo0Qb","LbRTHYf2Ec","0ao3lUl4a1","CxVEfs4786",
+"8U2nUix74r","29QAzgdQsS","AmdQdkB5nP","5VZjSjtn0X","AOgEesoy9t","5nmWvlCMxy","fFDrJhSSvQ","Z4I1vmX2GE","TwanojS1aj","cShY2TCgPp",
+"ni2v1FnPFB","In3NSpmeCd","prNT6Q6Lix","16lHc48cHL","suY4xs4786","kZANmuN6r3","v8yFNksJby","TCgPp618Di","In3NSi3pyd","StlDJ2DREs",
+"2NslmBGaQY","ulk41vOqCE","jzUqRgdQsS","RBhp0XyPZN","OHaBz45cIH","jiVBP8RCUA","aDGtSx3LDe","07n1c5drc6","tl72Wzz4ZU","rz7UtsqVrf",
+"iB08lOz8yZ","7hyVv0BmCy","SWfou48cHL","vkCHHNo0Qb","FVMxoVBjhz","cmXIX16lHc","JXljWFPfSE","C2Ircy94nw","UmaEv8hJdt","pmeCdCqqaD",
+"2TRI78FmFH","Mm8siCfgr3","0ao3llm0pD","5VZjSzz4ZU","ix74rQ6hMC","l83UdqaofN","FFDuihSSvQ","9GXkXciuWz","tvdkDzbIYY","lsQGoFNYIM",
+"DLhzM5IhmG","dmoS7uLtKs","k85AeBbwgA","n8pJ9WDVWJ","lCMxyuPX7G","7X3uySjskQ","s7Mxk8U2nU","sx5Glgf8rI","fcwDaazIWp","1LB1LG1RhS",
+"lm0pDFnPFB","5Nammm4bxU","VIlwPbZLvS","2TRI7CIShG","5Namm16lHc","zz4ZU7Ow5C","fFDrJFxX9q","FFDuiECMvU","aDGtSI7p2a","3otm6VLTy6",
+"ThjNnChuy3","aL6AJ14FLR","lkMUApmeCd","uTacxvLsmS","Ul4a1DLhzM","0ao3lP6bcg","Ss0Zu55rfB","Q6hMC7fKYU","pT8wucShY2","n8pJ9StlDJ",
+"GXdoHyEfy9","0KyfsjSjS3","oVQp6YjB9t","xXTI4EOE1o","vkCHHuN6r3","uTacxkB5nP","s7MxkzmLYD","GWqqXS77LH","VNCPdECMvU","QnJ1SBCxeC",
+"9iGoTW7cTs","GSQwjs93Ml","iwzGkQ6hMC","RzaZAyvOMI","0Kyfse6e4z","DG4sTWmadA","uPX7GRkQke","FFDuiHRxd8","vLsmSiwzGk","vOqCEv8yFN",
+"nlaByQChxs","gtCA5Gv3Fq","vLsmSdQ586","VIlwPRxrsm","2NslmM6qcG","QssNCd7vjM","ZJTXHcQOnv","7ku1pQssNC","45cIHRBhp0","bZLvSJXljW",
+"JKWYRXyPZN","oVQp6FVMxo","FVMxoYh1hF","NAFuwECMvU","VerEAgdQsS","v1HlniB08l","BCxeCoVQp6","vkCHHv2eC3","cShY2VIlwP","RACuj8TxD7",
+"xXTI4XflUq","lCMxyvkCHH","EOE1oru4UG","tAOsr9y4lw","XyPZNru4UG","yToGWX6Pin","WMiS3yluBx","Uvlv4vOqCE","vLsmSix74r","AXpwEhe9IA",
+"7hyVv0Kyfs","IjTwPK4GS8","JIqXit59lR","In3NS4dEz6","WDVWJ5nmWv","lm0pDNxx9V","ix74rFFDui","iwzGktAOsr","0h1b1nFqik","LDk6fgdQsS",
+"Cfgr3prNT6","QWxoT0PktI","dQ5868xEKz","FnPFBWDVWJ","07n1cuoStw","JkzUnkZANm","2Yz7EvkCHH","WPmlxFhtgl","yofH3aez9y","iqv4kksJby",
+"AgJHQCNHmv","bZLvS9iGoT","gIYvEru4UG","IjTwPRzaZA","AIYUucL0aE","KsjRKCxVEf","JXljWY1mC0","BGaQYECMvU","0YAGH48cHL","nnP8ov8yFN",
+"WmadAlCMxy","D6rByUmaEv","OUqFMO3iyQ","MK07YDLhzM","WDVWJ8U2nU","WreyPUvlv4","Vprf2lpF6W","UmaEvBbwgA","gdQsSIjTwP","CNHmvyToGW",
+"s4786uvf7A","fmIK1d85a9","ydG8U0h1b1","F6PT2CxVEf","RkQkeCNHmv","ECMvUFnPFB","Nxx9Vxciqp","618DitaOXK","RkQkeaDGtS","4dEz6uN6r3",
+"0BmCyRpBQm","gjUTuuN6r3","i7WMQcShY2","J2mQiSjskQ","hYBCKJkzUn","lpF6WlXFOB","6AFT064s8N","Vprf2qQxHP","5Drn0VjCZq","16lHcCfgr3",
+"fmIK1iB08l","0PktIfcJOy","lXFOBuTacx","Pb1paOxWIH","d85a9cShY2","16lHcSs0Zu","DcpWBBFkb8","7X3uy3weIF","e6e4zM6qcG","jfREuaez9y",
+"DG4sTjSjS3","5Drn0EdBKc","9eoRcQ6Lix","ksJbyGSQwj","s93Ml07n1c","45cIH6AFT0","lXFOBMm8si","dhSuHRpBQm","rhl0JGrDg7","MGlTFn8pJ9",
+"8RCUA0ao3l","cShY23weIF","CdyBVFNYIM","FhtglYh1hF","lweGyydG8U","s93MlHzZT8","lkMUAs4786","M3zXLcmXIX","1j5L8U3yw5","piJSkWDVWJ",
+"K4GS8d7vjM","HzZT8mX2GE","G1RhSrz7Ut","zY1GYIRh48","FPfSERxrsm","S77LHK4GS8","AgJHQbrhlQ","7ku1pmX2GE","5ZaEzpT8wu","LbRTHhYBCK",
+"fLNg8ECMvU","FwEJzokgRi","MGlTFblLA9","Q6hMCnlaBy","ydG8UnnP8o","GXdoHn8pJ9","OHaBzMm8si","FPfSE7fsYM","pAhR1B3qem","d7vjMhSSvQ",
+"oVQp60YAGH","cL0aEgf8rI","VjCZqRpBQm","48cHLyToGW","Vprf2FGzgp","ni2v1WDVWJ","5Nammaez9y","AXpwECp3mZ","rKDLJdQ586","9rlg98xEKz",
+"FwEJzTwano","POUYS3weIF","MmKGJFPfSE","zbIYYFjHXR","MK07YtaOXK","suY4xS77LH","WPmlxkZANm","Ss0ZuRpBQm","JXljWX6Pin","ECMvU2DREs",
+"9XyT9s4786","gtCA5FNYIM","dmoS755rfB","yToGWCfgr3","QClRLThjNn","OHaBzlpF6W","NAFuwgtCA5","CK5W7iqv4k","QChxszmLYD","zFgtBtjQxs",
+"FVMxoAkKTk","M3zXLx3LDe","DLhzMyvOMI","uvf7AD6rBy","Uvlv4nlaBy","L7cGcuLtKs","rz7Uttl72W","ogLgcaFFss","WPmlxaez9y","cQOnv0MR5X",
+"NOHszoQ87r","ReKEWX6Pin","XyPZN1j5L8","n1pmOqQxHP","v2eC3gjUTu","7Ow5CBpYhV","24ARFQ6Lix","Gv3Fq8RCUA","zQt6QRBhp0","s7MxkgjUTu",
+"i3pyd7X3uy","16lHcsx5Gl","oGu6xbZLvS","uoStwMkgy8","BFkb8BpYhV","DG4sTBCxeC","8FmFHv8yFN","0Kyfsk85Ae","euZA5zFgtB","fLNg8uvf7A",
+"Q6LixlkMUA","RmDcrzHF1q","NAFuwqQxHP","n1pmOiqv4k","FjHXRReKEW","W7cTsyEfy9","NhXduXflUq","qUJMdcL0aE","nlaByGXdoH","rz7UtgtCA5",
+"d7vjMYw2oU","lpF6WhSSvQ","sx5GlRkQke","a00b5zbIYY","y94nwMm8si","v1HlnfLNg8","0YAGHW7cTs","ni2v1S77LH","taOXKuLtKs","I7p2aTXQ0Z",
+"UmaEvuZPqg","WDVWJlH1kt","aez9yNcICA","pAhR1HP433","fmIK1yluBx","Cp3mZvkCHH","S2DfuSjskQ","uLtKsNxx9V","lViBvCNHmv","hYBCK5Namm",
+"iwzGkSs0Zu","VBjhzyvOMI","X6PinSbRYy","v8yFNYh1hF","fcJOy5nmWv","BCxeCD6rBy","lCMxyrz7Ut","rhl0JdmoS7","b29RJlpF6W","29QAzXflUq",
+"TXQ0Z6AFT0","55rfBfmIK1","8cVD316lHc","In3NStl72W","s93Mls93Ml","MojnPcShY2","sx5Gl4QMc9","5IhmGWDVWJ","K20wKvLsmS","K4GS8n1pmO",
+"FGzgpVNCPd","oGu6xWmadA","lH1ktuLtKs","Y1mC05ZaEz","v8yFNCNHmv","YjB9tQnJ1S","2Nslm0Kyfs","uPX7GJJs5m","uTacxNAFuw","7Ow5CX6Pin",
+"xciqpnlaBy","AXpwEW3VFH","0Wr5yGSQwj","618Di5IhmG","gjUTue6e4z","29QAzQ6Lix","v2eC3RACuj","Dz1R3SbRYy","WmadAiB08l","45cIHt59lR",
+"2NslmBbwgA","dQ586zbIYY","e6e4zFPfSE","Mm8sidmoS7","FcWrWBpYhV","lweGys7Mxk","s4786hYBCK","45cIH9iGoT","a00b5VLTy6","YOfrYzFgtB",
+"5drc6sx5Gl","aez9y2hEEU","8U2nUOxWIH","KsjRKQChxs","580YDgtCA5","lXFOBCNHmv","Ul4a1zQt6Q","QChxsIKxdL","7lUXZi3pyd","oQ87rtAOsr",
+"v2eC36q6L9","yofH3Mkgy8","suY4x07n1c","OUqFMt59lR","3weIFSs0Zu","cQOnvQYxC0","0BmCytuDyS","D6rBytuDyS","uLtKsKsjRK","aDGtSYjB9t",
+"RkQkegdQsS","he9IA5ZaEz","RBhp0cQOnv","Pb1paNcICA","HfyNQHlUbF","v8yFNFGzgp","GWqqXgtCA5","8TxD7FPfSE","faHirzbIYY","0Wr5yiwzGk",
+"0h1b1PYBf4","07n1csqVrf","5iGN5t98iW","hE1Ql2ZHdk","2Yz7EZJTXH","FNYIMhi5X7","zFgtBksJby","QYxC0QssNC","2DREs7lUXZ","pT8wuYh1hF",
+"7ku1pd85a9","0MR5XyvOMI","IBe8k07n1c","580YDGXdoH","qQxHPY1mC0","FVMxoQ6hMC","blLA9Yw2oU","QChxsGWqqX","BGaQYnFqik","euZA5NcICA",
+"VerEAtAOsr","fqypyPYBf4","uupzkWMiS3","s93Ml9iGoT","brhlQhE1Ql","6AFT0LbRTH","pT8wu8xEKz","aez9ycL0aE","GrDg7iB08l","cQOnvRsQUq",
+"s4786NAFuw","fFDrJfaHir","8xEKzQssNC","GWqqXHzZT8","Pb1parz7Ut","WreyPRpBQm","MojnPi7WMQ","NcICAW7cTs","ksJbyOUqFM","h1zcHVLTy6",
+"StlDJ45cIH","cQOnvi3pyd","MezSWjzUqR","2DREsRsQUq","atef2G1RhS","DQimpLewvM","lweGyFjHXR","Cfgr3dmoS7","8RCUAQYxC0","gjUTuFnPFB",
+"WreyP9iGoT","lj07QTa8f6","VNCPdVprf2","DG4sTtvdkD","iqv4kni2v1","v2eC30h1b1","UlU3MuN6r3","BGaQY14FLR","tvdkD1v5hH","Qworu6q6L9",
+"BFkb8pWiOs","K4GS8gIYvE","KZamHiwzGk","tjQxsFLsph","wDajX7fKYU","euZA5QChxs","gIYvEAIYUu","y94nwjS1aj","JJs5mlm0pD","5IhmGFjHXR",
+"HRxd89XyT9","FLsphHzZT8","WaWsv9eoRc","ZJTXHFhtgl","GrDg7Ul4a1","S2DfuBpYhV","tjQxs618Di","prNT6fmIK1","euZA5zmLYD","MojnPdQ586",
+"MK07YKr8ys","MmsIopmeCd","OxWIHpvgjS","i3pydFFDui","I7p2aLDk6f","s93MlUl4a1","2hEEUkB5nP","DLhzM8cVD3","CNHmvuLtKs","EOE1oaDGtS",
+"faHirSs0Zu","jSjS3Q6Lix","OxWIHpT8wu","lkMUAUmaEv","UlU3MxReec","prNT6s4786","fLNg87fsYM","LDk6fdQ586","FVMxoXyPZN","i7WMQgjUTu",
+"FnPFBZ4I1v","0h1b1bgJAz","djsrvGWqqX","9eoRcoQ87r","Zv7z0X6Pin","RACujIRh48","Kr8ysAIYUu","uvf7A4dEz6","CxVEfsx5Gl","cShY2zHF1q",
+"BCxeCfcJOy","FjHXRFFDui","AXpwEPb1pa","Y1mC0ECMvU","W7cTshUTw7","StlDJ5Drn0","tvdkD5iGN5","kZANmuZPqg","TCgPpUvlv4","9GXkX48cHL",
+"0Kyfsulk41","NOHsz2Nslm","QworuMmKGJ","BbwgAAIYUu","ZzJHWMmsIo","7X3uylViBv","cQOnv64s8N","DG4sTd7vjM","b29RJOz8yZ","OUqFMIBe8k",
+"F6PT2WPmlx","s4786UmaEv","QClRLSmGzv","t59lRAkKTk","QssNCWaWsv","tlILtuTacx","LewvM3otm6","O3iyQx3LDe","dQ586O3iyQ","i7WMQsx5Gl",
+"0KyfsS77LH","FNYIMFNYIM","ZzJHWVprf2","pFrrlTwano","d7vjMpT8wu","uAWyps93Ml","uQIczlpF6W","ru4UGogLgc","Ta8f6xXTI4","i3pydtl72W",
+"lkMUABbwgA","MmKGJ8RCUA","rKDLJrz7Ut","NAFuwKZamH","No0QbblLA9","WDVWJru4UG","2hEEUIn3NS","fmIK1Zv7z0","StlDJBbwgA","pv0i7DQimp",
+"ZuDtDGWqqX","VerEAZUnqt","zmLYDNcICA","uupzkiKqhr","pAhR1UmaEv","RBhp0dmoS7","gf8rIVerEA","7Ow5CVBjhz","8RCUAoGu6x","Ss0Zuaez9y",
+"X6PinThjNn","WMiS31v5hH","7Ow5CFjHXR","M6qcG3otm6","NhXduGWqqX","FFDui2DREs","SWfouVLTy6","AOgEe14FLR","RzaZAMkgy8","No0QblkMUA",
+"atef2rz7Ut","W7cTs1j5L8","gf8rI2Yz7E","8TxD7VerEA","Dz1R3Ta8f6","3weIFzqH0W","DLhzMuupzk","dhSuHKZamH","AXpwEWaWsv","618DiSWfou",
+"0Wr5yMK07Y","29QAzrhl0J","Zv7z0uoStw","7Ow5CsqVrf","uAWyplsQGo","soy9tFVMxo","AgJHQtaOXK","okgRipv0i7","WMiS3X6Pin","IjTwPgf8rI",
+"oVQp6uAWyp","rhl0JpmeCd","9GXkXgjUTu","FLsphxReec","jeskSgtCA5","UlU3MFwEJz","ReKEWNxx9V","CIShG2TRI7","ulk41l83Ud","RACujlsQGo",
+"gf8rIS2Dfu","LDk6f9XyT9","i7WMQv2eC3","i3pydy94nw","M6qcGHfyNQ","Rxrsmgf8rI","TXQ0Zatef2","9y4lwiwzGk","48cHLuoStw","55rfBt98iW",
+"hi5X7YOfrY","9iGoTYjB9t","t98iWzz4ZU","nlaBye6e4z","xciqpHP433","EdBKcsx5Gl","9eoRc1LB1L","Q6hMCF6PT2","CxVEfZhwG1","QChxsChuy3",
+"iwzGkOz8yZ","OHaBzUvlv4","GWqqX5nmWv","JkzUnXyPZN","9XyT9FFDui","hUTw7Twano","wiHrZEoToP","618DiECMvU","0ao3lD6rBy","jtn0XGv3Fq",
+"t98iW9GXkX","HzZT8uAWyp","580YDZJTXH","fqypyiqv4k","Oz8yZsoy9t","yofH3t98iW","MGlTFpFrrl","5Namms4786","ksJbyuJScX","v2eC3lj07Q",
+"BCxeCUlU3M","KZamHfcJOy","SmGzvnnP8o","t98iW2Yz7E","uN6r3ni2v1","WMiS3W7cTs","7ku1p9iGoT","pmeCdECMvU","OHaBzMGlTF","29QAzcQOnv",
+"v2eC3jtn0X","ydG8U45cIH","d7vjMSmGzv","M6qcGydG8U","Kr8ys6q6L9","WMiS3lCMxy","ru4UG4dEz6","8FmFHQWxoT","POUYSlm0pD","Yh1hFQ6hMC",
+"x3LDeyofH3","P6bcgQssNC","3otm68cVD3","JRJQBdmoS7","45cIHZ4I1v","KZamH07n1c","5iGN59XyT9","ni2v1CqqaD","HlUbFTa8f6","n1pmOFnPFB",
+"Yh1hF0YAGH","AgJHQvkCHH","5iGN5gtCA5","B3qempvgjS","Zv7z0CK5W7","0MR5X4dEz6","fqypyFhtgl","xciqp8TxD7","WDVWJJXljW","v8yFNuN6r3",
+"AOgEeAmdQd","AkKTkiKqhr","s7MxkRBhp0","WmadABGaQY","TCgPpZJTXH","m4bxU8FmFH","azIWppAhR1","yluBxa00b5","lpF6WuZPqg","OUYuFHlUbF",
+"ECMvUFwEJz","uZPqggIYvE","Gv3FqK20wK","FjHXRZv7z0","6AFT0lkMUA","07n1c8hJdt","lXFOB4QMc9","djsrvHlUbF","atef2y94nw","FNYIM1v5hH",
+"O3iyQni2v1","9y4lwuPX7G","jtn0XRACuj","uTacxsqVrf","W3VFHcL0aE","l83UdVIlwP","y94nwBFkb8","lkMUAn1pmO","FLsphNAFuw","x3LDe0Wr5y",
+"hi5X7uTacx","y94nwt98iW","kB5nPt59lR","9eoRcdpe1v","jSjS3JRJQB","8U2nURzaZA","JJs5mRzaZA","lsQGoMmKGJ","2TRI7gIYvE","ZuDtDCNHmv",
+"0BmCyWaWsv","RBhp09rlg9","2DREs5nmWv","nFqikrhl0J","S2DfuciuWz","fqypyVNCPd","Ul4a1fcwDa","zHF1qzY1GY","ReKEWgdQsS","hUTw7S2Dfu",
+"G1RhSXflUq","14FLRlsQGo","atef2wiHrZ","MezSWjiVBP","euZA5o8Uyd","8RCUAAIYUu","7ku1pRACuj","VBjhz2DREs","lj07QX6Pin","dhSuH5Mg9r",
+"gf8rITXQ0Z","NcICAt59lR","dQ58616lHc","Gv3FqUmaEv","HzZT8pT8wu","Y1mC0sqVrf","hSSvQNhXdu","Mkgy8t59lR","sqVrfzz4ZU","1v5hH580YD",
+"gdQsS1j5L8","iKqhrhSSvQ","AXpwEP6bcg","2NslmWPmlx","piJSk0PktI","WaWsvAgJHQ","iKqhrO3iyQ","QYxC0ix74r","WDVWJ9y4lw","Zv7z0bgJAz",
+"Yw2oUlCMxy","9XyT9jSjS3","No0QbXyPZN","lCMxyhSSvQ","zY1GYIjTwP","prNT6he9IA","48cHLv2eC3","aez9yAXpwE","P6bcgDz1R3","FFDuimz8gx",
+"8cVD3F6PT2","AmdQdatef2","ZJTXHPYBf4","aL6AJpWiOs","QbxXcUvlv4","NOHszs4786","KsjRK8hJdt","0h1b18U2nU","HlUbFAOgEe","okgRiFhtgl",
+"t98iWHlUbF","SjskQaez9y","zbIYYpmeCd","JKWYR5Namm","faHirW3VFH","tlILtTCgPp","0YAGHhSSvQ","azIWpQ6hMC","o8UydaL6AJ","iB08ljfREu",
+"s93MlWmadA","FFDuiTXQ0Z","uupzkIRh48","2ZHdkYjB9t","64s8NQ6hMC","zHF1qSbRYy","14FLRKsjRK","B3qemF6PT2","NAFuw29QAz","POUYSPYBf4",
+"lXFOBlkMUA","Dz1R34W0Tl","RzaZAvkCHH","fFDrJyluBx","bZLvSIBe8k","HRxd85Mg9r","8U2nUlpF6W","suY4xl83Ud","CxVEfHlUbF","0KyfsAIYUu",
+"0PktIjeskS","0MR5XVerEA","o8UydfaHir","ulk41ni2v1","2NslmlViBv","Nxx9VpWiOs","16lHcGXdoH","Dz1R3e6e4z","lViBvaez9y","lkMUAuAWyp",
+"sqVrfMGlTF","k85Ae1v5hH","U3yw5Ta8f6","DG4sTJJs5m","In3NSzbIYY","pv0i7iB08l","LDk6fokgRi","IRh48RACuj","LbRTHlViBv","CIShGbrhlQ",
+"48cHL8hJdt","BbwgAQnJ1S","ix74rJJs5m","07n1ctAOsr","S77LHvkCHH","OHaBzBCxeC","M3zXLKZamH","ix74ruQIcz","ZhwG1BCxeC","QbxXcWDVWJ",
+"FxX9qAIYUu","Q6LixDG4sT","UlU3MNhXdu","nlaBy3weIF","LbRTH8cVD3","S77LHWPmlx","JXljWZzJHW","fcJOyuQIcz","uN6r3oQ87r","ZhwG1In3NS",
+"iqv4kS77LH","hYBCKtl72W","S77LHpWiOs","o8Uyd8hJdt","8xEKzblLA9","sqVrfhe9IA","uLtKss4786","yToGWdjsrv","rz7UtCp3mZ","zY1GY9y4lw",
+"MojnPpT8wu","I7p2agdQsS","IKxdLprNT6","7fKYU64s8N","zz4ZUtl72W","zbIYYnFqik","8FmFHChuy3","7fsYMv8yFN","gdQsSAOgEe","Mm8siIRh48",
+"5Mg9rCqqaD","MK07Y1LB1L","5iGN5BbwgA","IKxdLC2Irc","lH1ktNxx9V","JIqXiy94nw","B3qems93Ml","RACujQClRL","gIYvEQworu","o8Uyd0Wr5y",
+"Chuy32Yz7E","v8yFNBFkb8","uAWypFhtgl","JJs5mwiHrZ","8RCUAtuDyS","M6qcGBpYhV","k85Ae4W0Tl","8hJdtD6rBy","v2eC3Chuy3","ru4UGUlU3M",
+"HlUbFhUTw7","9GXkXRxrsm","fLNg8Yh1hF","VerEAlj07Q","GWqqXIKxdL","v1HlnFcWrW","Ta8f6Kr8ys","y94nw7fKYU","HP433lsQGo","Chuy39GXkX",
+"hUTw7TXQ0Z","euZA5cQOnv","soy9tZJTXH","lXFOBzqH0W","7hyVvpiJSk","D6rBy2ZHdk","oQ87rJIqXi","QClRLn8pJ9","aDGtSLDk6f","nnP8oDQimp",
+"HlUbFxciqp","VNCPdFwEJz","8hJdtFGzgp","zqH0Wzz4ZU","hi5X7EOE1o","he9IAgdQsS","qaofNPb1pa","Yw2oUfFDrJ","pv0i7uPX7G","Ss0ZuKASQ8",
+"Cp3mZb29RJ","VBjhzMojnP","MmsIoWaim6","0BmCyG1RhS","soy9tW7cTs","8FmFHNcICA","JXljWQClRL","FhtglaL6AJ","POUYS6q6L9","ZJTXHrKDLJ",
+"POUYSnFqik","IBe8kAgJHQ","W3VFHlm0pD","RkQkeWmadA","WPmlxCdyBV","KASQ8n1pmO","CdyBVXflUq","lj07QCK5W7","Cp3mZaez9y","7fsYMjiVBP",
+"ZuDtDRpBQm","14FLR3otm6","KZamH6AFT0","Mkgy8Mm8si","MmsIoGSQwj","Q6hMCv2eC3","LewvMQ6hMC","uQIcz2Nslm","fcJOyJJs5m","blLA9kB5nP",
+"piJSkv8yFN","tl72WQssNC","fqypyzY1GY","uvf7AAmdQd","NAFuwKr8ys","tvdkDrKDLJ","vkCHH14FLR","QworuFjHXR","lweGy29QAz","JJs5mCxVEf",
+"zFgtBb29RJ","TCgPppFrrl","uQIczX6Pin","QChxsAgJHQ","faHiruPX7G","WPmlxGrDg7","mX2GEcmXIX","2TRI7lweGy","FPfSEtvdkD","9XyT9VerEA",
+"jS1ajTXQ0Z","0ao3lVjCZq","faHira00b5","ZJTXHSjskQ","lH1ktnlaBy","MaJQs2DREs","OHaBzW7cTs","5drc6n8pJ9","JJs5mFVMxo","wiHrZRkQke",
+"XflUqJkzUn","9GXkXQbxXc","7fKYUcShY2","In3NShUTw7","Q6LixyvOMI","MezSWfLNg8","pT8wufmIK1","uJScXiqv4k","lH1ktQnJ1S","d85a9zqH0W",
+"aDGtSNcICA","fLNg8FwEJz","MojnPFLsph","5Drn0EoToP","FnPFB0MR5X","FNYIMK20wK","NhXduzY1GY","9rlg95nmWv","5IhmGvkCHH","uZPqgTCgPp",
+"618DiY1mC0","y94nwIn3NS","L7cGclpF6W","aL6AJ2hEEU","In3NSCp3mZ","2TRI7euZA5","M6qcGGSQwj","qQxHPP6bcg","OHaBzFjHXR","o8Uydtl72W",
+"BFkb8tuDyS","a00b5FNYIM","K20wKTwano","QbxXclH1kt","QChxsW7cTs","RmDcrFPfSE","MaJQspv0i7","jtn0Xlj07Q","MmsIoAkKTk","4W0TlCK5W7",
+"AIYUuRmDcr","RsQUqBGaQY","K4GS8uAWyp","Dz1R3pv0i7","QClRLLewvM","0Wr5yEdBKc","KZamH7X3uy","S2Dfu2DREs","xXTI4fLNg8","DLhzMNhXdu",
+"WreyPxXTI4","TCgPpv1Hln","Uvlv42ZHdk","yvOMIWmadA","ciuWzRmDcr","IKxdLU3yw5","FhtglNcICA","No0QbOHaBz","2TRI7uQIcz","djsrvJKWYR",
+"QssNCBCxeC","faHir7fKYU","d7vjMn1pmO","Oz8yZ2Nslm","7fKYUStlDJ","7ku1ppWiOs","i3pydvkCHH","ZJTXHCqqaD","2hEEU0BmCy","MezSWiwzGk",
+"AIYUu5iGN5","rhl0Jx3LDe","a00b5StlDJ","W7cTsnFqik","uupzk55rfB","t59lRuupzk","kB5nP48cHL","s93MlWDVWJ","0BmCy48cHL","djsrvhYBCK",
+"uZPqgdpe1v","NcICA5IhmG","gf8rIQssNC","QworuVjCZq","vOqCEZv7z0","iqv4kjiVBP","4dEz6Q6hMC","8hJdt1j5L8","rhl0JDG4sT","jzUqRdpe1v",
+"uoStw5VZjS","2hEEULDk6f","Z4I1v0h1b1","aL6AJReKEW","EOE1oeuZA5","BGaQYpWiOs","fcJOylCMxy","5NammgtCA5","AOgEeQChxs","o8UydlXFOB",
+"WreyPiwzGk","hYBCKS77LH","KASQ8rhl0J","aFFss9y4lw","14FLRjfREu","7hyVvVLTy6","gjUTulViBv","uTacxyEfy9","JJs5m64s8N","HfyNQEdBKc",
+"FxX9qx3LDe","Twano9rlg9","h1zcHaez9y","nFqikqQxHP","SWfouPb1pa","l83UdIjTwP","zqH0Wuvf7A","MaJQs45cIH","5Mg9rqUJMd","CIShGaL6AJ",
+"29QAzJRJQB","QYxC00MR5X","rKDLJ4dEz6","ni2v1Gv3Fq","SmGzvwiHrZ","Yh1hFM3zXL","2ZHdkuoStw","TCgPphE1Ql","lViBv9XyT9","ogLgcmX2GE",
+"QworuF6PT2","0PktIfLNg8","XflUqW3VFH","CIShG618Di","HP433EoToP","CK5W7d85a9","zmLYDQWxoT","tuDySEOE1o","QnJ1SlsQGo","zY1GY7ku1p",
+"lkMUAReKEW","FLsphfaHir","hi5X7fFDrJ","piJSkM6qcG","yEfy9NOHsz","n1pmOhUTw7","suY4xuJScX","Pb1paMK07Y","gdQsSzQt6Q","YjB9tdQ586",
+"7X3uygIYvE","5iGN5LDk6f","MezSW1j5L8","n8pJ9FnPFB","uvf7Azz4ZU","vOqCESbRYy","G1RhSSs0Zu","Z4I1vW7cTs","WDVWJqUJMd","XyPZNtlILt",
+"DQimpBCxeC","WPmlxfLNg8","qaofNJkzUn","t59lRjeskS","oQ87r8RCUA","IjTwP1v5hH","YjB9tTCgPp","Dz1R3prNT6","2TRI7azIWp","gdQsScQOnv",
+"0MR5XW7cTs","0Wr5yfaHir","OHaBzJ2mQi","Z4I1vEoToP","FxX9qFGzgp","hUTw7pT8wu","aFFssQ6Lix","wDajXKr8ys","brhlQJKWYR","JRJQBPYBf4",
+"gjUTuLbRTH","taOXKRmDcr","NOHszNcICA","9rlg9Ul4a1","FwEJzY1mC0","zFgtBi3pyd","l83Udtl72W","FhtglBCxeC","k85AeiKqhr","ydG8UVprf2",
+"5NammaDGtS","atef2SjskQ","2ZHdkQChxs","RkQkeReKEW","ZUnqtd85a9","xXTI4F6PT2","lCMxyaez9y","k85Ae5iGN5","QbxXczQt6Q","y94nwiB08l",
+"uupzkyEfy9","fcJOydhSuH","VBjhzWreyP","Ul4a1Pb1pa","BbwgAVerEA","FFDuihe9IA","0Wr5yQssNC","IKxdLQ6hMC","lViBvyToGW","y94nwKr8ys",
+"4QMc964s8N","Gv3Fq4dEz6","pAhR12Yz7E","BGaQYa00b5","55rfBIRh48","7X3uyAmdQd","lViBv5Drn0","tvdkD5ZaEz","fcwDaRsQUq","qaofNCNHmv",
+"uZPqglpF6W","X6PinSs0Zu","VLTy6KsjRK","LDk6fe6e4z","rz7Utl83Ud","9XyT90Kyfs","djsrvgIYvE","cShY2QbxXc","AIYUu16lHc","gIYvEFLsph",
+"jtn0XvOqCE","6AFT0iqv4k","fcJOygdQsS","aDGtSzY1GY","O3iyQBGaQY","uPX7GMkgy8","d85a9d85a9","x3LDeZv7z0","nlaByhUTw7","FhtgliwzGk",
+"1j5L8EoToP","2Yz7E2TRI7","UlU3MbZLvS","faHirG1RhS","vLsmSv1Hln","MK07Yhe9IA","gjUTupmeCd","ThjNnpvgjS","ThjNnMmKGJ","uTacx9eoRc",
+"QYxC0MaJQs","pvgjSpT8wu","ogLgcpWiOs","VLTy6VerEA","faHirI7p2a","prNT63weIF","wDajXCp3mZ","OUqFMGSQwj","YOfrYzHF1q","AXpwEyofH3",
+"fcJOyjfREu","5drc6hUTw7","IRh488hJdt","0KyfspvgjS","dmoS7RmDcr","ZhwG18RCUA","suY4xIn3NS","29QAzlj07Q","d85a96q6L9","h1zcHs93Ml",
+"BGaQYogLgc","xXTI4Y1mC0","LDk6fNAFuw","AgJHQGv3Fq","7fKYUtl72W","AIYUujiVBP","B3qemt98iW","gjUTuEoToP","pFrrlmz8gx","iKqhrBbwgA",
+"OHaBzkZANm","Ta8f6s4786","oQ87rjS1aj","aFFssLDk6f","OUqFMDcpWB","55rfBlweGy","AkKTkiqv4k","FcWrWciuWz","4W0TlNxx9V","tvdkDAkKTk",
+"hi5X7QClRL","W3VFHlpF6W","BCxeCuJScX","nFqikv8yFN","EOE1ozFgtB","Zv7z0IBe8k","zFgtBAmdQd","QYxC0ReKEW","o8UydWDVWJ","HzZT8ZzJHW",
+"0h1b1xXTI4","aFFssOxWIH","UlU3MyofH3","ZzJHWWPmlx","hSSvQ0PktI","jSjS3djsrv","G1RhS55rfB","4QMc9mX2GE","KZamHzz4ZU","tl72WaL6AJ",
+"x3LDe7Ow5C","29QAzYw2oU","s93Ml9y4lw","mz8gxyluBx","fLNg8MGlTF","EoToPvkCHH","MezSWUlU3M","6q6L95Mg9r","taOXKM6qcG","i7WMQ1v5hH",
+"Nxx9VtuDyS","AOgEeBpYhV","atef255rfB","2Nslmni2v1","xciqp1LB1L","9GXkXX6Pin","kZANmyToGW","lj07Qlj07Q","FxX9qMm8si","lj07QKr8ys",
+"d85a9FLsph","RsQUqChuy3","faHir45cIH","Yw2oULDk6f","MaJQsqUJMd","ix74rNxx9V","IjTwPFVMxo","jtn0XU3yw5","piJSkfLNg8","bgJAzAOgEe",
+"yvOMIzqH0W","MK07Ys4786","MmKGJ6q6L9","okgRigjUTu","lH1kt6q6L9","Cfgr3qQxHP","WaWsviwzGk","MGlTF8cVD3","xciqpcL0aE","blLA9tlILt",
+"MGlTFdpe1v","5ZaEzzbIYY","NOHsztjQxs","pT8wuiB08l","Dz1R3JkzUn","RmDcrYh1hF","dhSuH618Di","cmXIXzmLYD","hi5X7aFFss","BCxeCjtn0X",
+"0MR5XrKDLJ","hUTw7XflUq","CqqaDatef2","LbRTHQYxC0","K4GS8FjHXR","pvgjSQbxXc","jSjS3EOE1o","jSjS3ZzJHW","qUJMd1v5hH","zz4ZU1v5hH",
+"iwzGkU3yw5","pmeCd1j5L8","RpBQmFhtgl","lkMUAjiVBP","W3VFHVerEA","FNYIMsoy9t","SmGzvKr8ys","rz7Utm4bxU","CNHmvblLA9","JKWYROHaBz",
+"2Nslmlm0pD","l83Ud29QAz","AkKTkvOqCE","gf8rIyToGW","CdyBVNhXdu","ksJbyTXQ0Z","cShY2FwEJz","ydG8Uv8yFN","7hyVvt59lR","uoStwJkzUn",
+"s93MlsuY4x","gjUTuRACuj","K20wKaL6AJ","aez9yfcJOy","HlUbF7Ow5C","fmIK1v2eC3","QnJ1SFFDui","9iGoTGv3Fq","CdyBVNcICA","uupzktlILt",
+"Gv3FqPOUYS","tl72W9GXkX","0ao3lJkzUn","OUqFMs4786","i3pydqUJMd","KASQ855rfB","sqVrfRkQke","XflUqWaWsv","RACujMojnP","Q6hMCzY1GY",
+"uQIczzbIYY","djsrvWMiS3","P6bcghUTw7","pv0i7VLTy6","NOHszAIYUu","VNCPd0h1b1","Vprf2fcwDa","VBjhzzFgtB","W7cTsulk41","fcwDaaFFss",
+"AXpwEydG8U","XflUq6AFT0","oQ87rn1pmO","JKWYRXflUq","ydG8UoQ87r","1v5hHmX2GE","hYBCKfcJOy","QssNC9GXkX","L7cGcIKxdL","8hJdtZUnqt",
+"NOHszyofH3","Mm8sifcJOy","WreyPCxVEf","ciuWzoVQp6","YjB9tciuWz","No0QbL7cGc","faHir9GXkX","POUYSBpYhV","POUYSIjTwP","45cIHDcpWB",
+"aFFssciuWz","Kr8ys8TxD7","1v5hH2hEEU","zQt6QqaofN","rhl0JtuDyS","JKWYRGv3Fq","WMiS3I7p2a","4QMc9t59lR","UlU3MQClRL","SmGzvQ6Lix",
+"0h1b129QAz","faHirjfREu","aL6AJ7Ow5C","TXQ0ZCxVEf","xXTI4618Di","P6bcg2Yz7E","pFrrlb29RJ","Dz1R3Ul4a1","BCxeC8TxD7","NhXduK20wK",
+"uQIczGXdoH","ZhwG1OUqFM","PYBf4BFkb8","9GXkXt98iW","IjTwPprNT6","a00b57fKYU","qUJMdguMb8","RxrsmyvOMI","yofH3n8pJ9","Pb1paQ6Lix",
+"Yf2EcQ6hMC","14FLRQ6hMC","lkMUAEOE1o","KsjRKiqv4k","CxVEfThjNn","9XyT9M6qcG","suY4xRkQke","lViBvKZamH","RsQUqsx5Gl","fmIK1X6Pin",
+"a00b5djsrv","KsjRKOUYuF","uoStwlj07Q","a00b57fsYM","0PktI7ku1p","djsrv8FmFH","b29RJTa8f6","0ao3lwiHrZ","MGlTFYh1hF","d85a9o8Uyd",
+"nFqikt59lR","prNT6Cp3mZ","DLhzMMmsIo","FVMxoU3yw5","uN6r3oVQp6","RmDcrBbwgA","EoToP5Mg9r","piJSklj07Q","XyPZNdhSuH","zbIYY5VZjS",
+"NAFuw1LB1L","taOXK0YAGH","Ul4a1uQIcz","SjskQLDk6f","0ao3lkB5nP","NhXduPOUYS","HP4335IhmG","2TRI7uLtKs","Y1mC0580YD","WaWsvy94nw",
+"hSSvQ3weIF","zbIYYEoToP","ThjNnlm0pD","soy9tdQ586","Dz1R3RBhp0","brhlQyluBx","LDk6f2Nslm","YOfrYoVQp6","wDajXuPX7G","CdyBV29QAz",
+"5iGN5lweGy","gtCA5RpBQm","iwzGkX6Pin","PYBf4ThjNn","taOXKdjsrv","nnP8oru4UG","S2DfuCIShG","Ta8f6iqv4k","hi5X70PktI","7fsYMFjHXR",
+"14FLR1j5L8","VBjhz1j5L8","FwEJzDQimp","okgRiThjNn","AkKTk9rlg9","RmDcrBGaQY","i3pyd5Drn0","atef2Q6hMC","J2mQiRkQke","jSjS3CdyBV",
+"tjQxsprNT6","tjQxsJKWYR","8TxD7RACuj","B3qem45cIH","0h1b17hyVv","QssNCYw2oU","faHirqUJMd","l83UdbrhlQ","BFkb8zFgtB","DG4sTUmaEv",
+"hUTw7QChxs","ZuDtDhYBCK","pAhR1ReKEW","DcpWBt59lR","JIqXiL7cGc","9eoRc7fKYU","NOHszpmeCd","BGaQYGrDg7","RkQke1LB1L","jzUqRgf8rI",
+"24ARFFLsph","lj07Qe6e4z","RmDcrMmsIo","1v5hHWaWsv","aDGtSyofH3","HP433ydG8U","Yf2Ecrz7Ut","X6PinMkgy8","Chuy3iqv4k","gIYvEqUJMd",
+"WaWsvuPX7G","uJScXOz8yZ","y94nwQbxXc","5drc6K4GS8","7fsYMRzaZA","bZLvS4QMc9","Rxrsmix74r","X6PinU3yw5","NcICA5drc6","RsQUq5VZjS",
+"lH1kt29QAz","07n1cMmsIo","QWxoTXyPZN","FjHXRlkMUA","ZuDtDHzZT8","sx5GlThjNn","LDk6fazIWp","m4bxUx3LDe","QWxoTQworu","YjB9tGrDg7",
+"iwzGkOHaBz","HlUbFvkCHH","I7p2azFgtB","bZLvSgIYvE","Twanojtn0X","Gv3FqzbIYY","MmKGJuvf7A","5Mg9rWMiS3","aL6AJdQ586","VLTy6fcJOy",
+"7hyVv8RCUA","KsjRKJkzUn","BpYhV7fsYM","LbRTHXyPZN","8cVD3NcICA","gjUTupWiOs","qQxHPFcWrW","hE1QlBpYhV","LewvM0Wr5y","G1RhSFhtgl",
+"IBe8k9rlg9","zmLYDfqypy","IBe8kMm8si","45cIHWPmlx","HP433NcICA","xReecP6bcg","580YDZ4I1v","lweGyQssNC","i3pydtjQxs","J2mQiQYxC0",
+"MojnPwiHrZ","CxVEfuPX7G","UlU3MoVQp6","zmLYDYf2Ec","dpe1vlj07Q","HfyNQBCxeC","uLtKsfLNg8","LDk6foVQp6","NcICA580YD","aL6AJZUnqt",
+"l83Ud4W0Tl","jzUqRm4bxU","uTacxe6e4z","VIlwP7Ow5C","uPX7G14FLR","xReeczmLYD","8cVD3tvdkD","WaWsvni2v1","Q6Lixgf8rI","DcpWBlm0pD",
+"n1pmOpiJSk","pT8wuzqH0W","nlaByTwano","AOgEeyEfy9","zQt6Q29QAz","wDajX0ao3l","guMb8hSSvQ","pT8wu0Wr5y","yEfy9v1Hln","t98iWGWqqX",
+"zHF1quupzk","VerEAGWqqX","JRJQBKASQ8","GXdoHzmLYD","v1HlnuoStw","DG4sTuJScX","GWqqXydG8U","07n1ccmXIX","VerEAQworu","AgJHQuvf7A",
+"WDVWJK20wK","1LB1LHzZT8","IBe8kuoStw","Cp3mZDG4sT","FcWrWGXdoH","zFgtBl83Ud","5ZaEz16lHc","7fsYMJJs5m","5iGN5aez9y","ogLgcAmdQd",
+"7ku1plj07Q","9XyT9DQimp","JIqXi9eoRc","XyPZNyvOMI","RkQke7fKYU","hE1QlMkgy8","DcpWBIjTwP","m4bxUCfgr3","9XyT9m4bxU","HzZT8ulk41",
+"5ZaEzQ6Lix","uAWypjS1aj","jtn0XQClRL","pvgjSHP433","5nmWvAkKTk","MK07YFnPFB","YjB9tpvgjS","fcwDaiqv4k","Kr8ysUl4a1","aDGtSFnPFB",
+"VBjhzMm8si","blLA9uTacx","0BmCyW7cTs","ksJbyS2Dfu","0MR5XB3qem","I7p2amX2GE","9iGoT8cVD3","pAhR18hJdt","Vprf2J2mQi","djsrvQbxXc",
+"fmIK1s7Mxk","Zv7z02Yz7E","BbwgAVNCPd","W3VFHSWfou","2ZHdkOUYuF","m4bxULDk6f","d7vjMlweGy","Cfgr3YOfrY","9y4lwKr8ys","tjQxsuvf7A",
+"StlDJs93Ml","Cfgr307n1c","y94nwRzaZA","AXpwE2hEEU","LewvMRkQke","s4786pWiOs","Ul4a1FjHXR","M3zXLtaOXK","2ZHdkZ4I1v","1LB1LpWiOs",
+"9iGoTWPmlx","ReKEWi3pyd","Fhtgl2DREs","piJSkxReec","PYBf4NhXdu","i3pyd6q6L9","uTacxC2Irc","618Dii7WMQ","qQxHPZ4I1v","fmIK1ZJTXH",
+"0MR5XNxx9V","gIYvECqqaD","v8yFN4QMc9","soy9t8cVD3","JXljWxXTI4","QssNCuN6r3","2DREsIn3NS","lm0pDFwEJz","tAOsrMm8si","W7cTs5drc6",
+"X6PinlpF6W","yluBx48cHL","FcWrW6AFT0","suY4xqQxHP","gIYvEgf8rI","CxVEfSjskQ","MojnPvOqCE","Yf2EcZ4I1v","L7cGcX6Pin","k85Aetl72W",
+"SWfouaFFss","qQxHPeuZA5","uTacxVjCZq","7ku1pC2Irc","9GXkXx3LDe","fFDrJv1Hln","xReecWaWsv","5nmWvzHF1q","qaofNv2eC3","uJScXJkzUn",
+"mX2GERzaZA","0Wr5yDz1R3","hYBCK3otm6","5NammS77LH","S77LH7lUXZ","euZA5RACuj","Chuy3AkKTk","t59lRHlUbF","vkCHHhUTw7","l83UdMkgy8",
+"d7vjMuJScX","8FmFH2TRI7","FNYIMIjTwP","4dEz6EoToP","Oz8yZIRh48","xReecUl4a1","DLhzMCNHmv","lj07Q14FLR","yluBxuTacx","FVMxoogLgc",
+"uQIcz5Namm","a00b5faHir","48cHLWmadA","QnJ1SwiHrZ","8xEKzLewvM","pv0i7zbIYY","VIlwPn8pJ9","5drc65ZaEz","b29RJGv3Fq","0Wr5yG1RhS",
+"7X3uyrhl0J","5Mg9r7ku1p","VerEAVNCPd","KASQ80PktI","1j5L81j5L8","iB08lP6bcg","ECMvUlpF6W","NhXduBCxeC","CqqaDx3LDe","JJs5md85a9",
+"dQ586AgJHQ","StlDJKr8ys","yofH32Yz7E","5IhmGIn3NS","FNYIMLewvM","iKqhrOz8yZ","07n1cWaWsv","BbwgAn1pmO","F6PT20h1b1","soy9tcShY2",
+"SbRYyZv7z0","I7p2ae6e4z","d7vjM9iGoT","FcWrWHP433","618DieuZA5","uN6r3zQt6Q","M6qcGv2eC3","CNHmvMmKGJ","JXljWL7cGc","VLTy6Ul4a1",
+"VIlwP9y4lw","Mkgy8X6Pin","WmadAhUTw7","cShY2lCMxy","aez9yuvf7A","JIqXi1j5L8","a00b5ZJTXH","atef2NhXdu","yofH3X6Pin","gjUTu5nmWv",
+"W3VFHtl72W","jzUqRKASQ8","cmXIXciuWz","7X3uyBCxeC","d85a9NcICA","euZA5lkMUA","uJScXxXTI4","lkMUAxXTI4","EdBKccL0aE","JIqXiFGzgp",
+"pAhR1MezSW","QChxsfLNg8","tl72WuJScX","HP433Cp3mZ","uLtKsFLsph","guMb8m4bxU","AXpwEIRh48","taOXKCp3mZ","ZzJHWzY1GY","lXFOBzmLYD",
+"Nxx9VJIqXi","OUqFMCdyBV","wDajX5Namm","gdQsS7Ow5C","9rlg9qQxHP","WreyP8FmFH","D6rBypv0i7","JkzUnFxX9q","gIYvEsoy9t","s7MxkBbwgA",
+"n8pJ9JkzUn","Uvlv4Fhtgl","D6rByt59lR","2Yz7EZv7z0","5Mg9r5ZaEz","fqypypT8wu","5iGN5atef2","MK07Y0Kyfs","dmoS7nlaBy","Ss0ZuWaWsv",
+"Chuy3HzZT8","PYBf4Yh1hF","JIqXiIn3NS","U3yw5I7p2a","hi5X7djsrv","CK5W7lm0pD","k85AeIn3NS","iKqhrDQimp","DLhzMRmDcr","CIShGuvf7A",
+"lkMUAOHaBz","b29RJHP433","yvOMIQ6hMC","Pb1pa9eoRc","d85a9Z4I1v","zqH0WbZLvS","O3iyQhYBCK","ksJbyv1Hln","yEfy9i7WMQ","BpYhVQworu",
+"Yh1hFAmdQd","L7cGc5IhmG","d85a9tAOsr","oVQp6FwEJz","JIqXiWaim6","iwzGkix74r","pAhR1VjCZq","ksJbyM3zXL","45cIHydG8U","PYBf4FPfSE",
+"AmdQdGrDg7","55rfBAXpwE","b29RJRmDcr","OUYuFlpF6W","vkCHHgdQsS","AIYUuK20wK","fLNg88FmFH","tAOsrkB5nP","EdBKcK20wK","S77LHtl72W",
+"pmeCdCK5W7","jfREuAmdQd","5ZaEzlj07Q","pAhR1uPX7G","uvf7ApWiOs","S77LHuAWyp","xXTI4HRxd8","hSSvQFFDui","nlaByOxWIH","mX2GEF6PT2",
+"lViBvuJScX","CdyBVv1Hln","taOXKNxx9V","MojnPpAhR1","pvgjSMmKGJ","uupzkgf8rI","Mm8siO3iyQ","6AFT0O3iyQ","gf8rIjfREu","AOgEeMmKGJ",
+"1j5L8Mkgy8","UlU3MjzUqR","Twano8RCUA","yofH3l83Ud","WMiS35Namm","5iGN52Nslm","WreyPJKWYR","8U2nU0ao3l","3weIF0YAGH","UlU3MIjTwP",
+"UmaEvqQxHP","ydG8Ui3pyd","xXTI4kB5nP","HP433PYBf4","Dz1R3HlUbF","jtn0XcL0aE","NhXdu6AFT0","L7cGcogLgc","WmadA24ARF","fLNg8k85Ae",
+"WaWsvs7Mxk","Ul4a1lweGy","FPfSEFVMxo","1v5hHni2v1","7X3uybgJAz","yofH39y4lw","zY1GYgjUTu","iqv4kpiJSk","tAOsrSbRYy","IKxdLqaofN",
+"dpe1vpmeCd","zmLYDIjTwP","MaJQs9GXkX","3weIFQ6Lix","okgRioVQp6","Cfgr3uupzk","AkKTk9y4lw","pWiOsrz7Ut","lm0pDW7cTs","dhSuH7lUXZ",
+"ulk41piJSk","ZUnqtzz4ZU","blLA9L7cGc","7fKYUcQOnv","WDVWJ0h1b1","uPX7G55rfB","FLsph07n1c","FLsphqUJMd","AOgEeVNCPd","gf8rIpmeCd",
+"Cfgr3jiVBP","n8pJ9i7WMQ","ZJTXHI7p2a","5IhmGhE1Ql","6AFT0AgJHQ","oQ87rOz8yZ","pWiOsRpBQm","yluBxazIWp","YOfrYxXTI4","HzZT8BGaQY",
+"fqypy4dEz6","1LB1LSs0Zu","PYBf4W3VFH","n8pJ9uQIcz","OHaBzTCgPp","y94nwd7vjM","sx5GlFjHXR","CK5W77Ow5C","OUYuFAOgEe","KZamHThjNn",
+"JIqXihe9IA","qUJMdQWxoT","JIqXiAOgEe","ix74rguMb8","ni2v1GXdoH","GXdoHJRJQB","aez9ySbRYy","AXpwEcShY2","yToGWs93Ml","fLNg86q6L9",
+"GXdoHoQ87r","OxWIHix74r","he9IAlsQGo","QssNCguMb8","HfyNQS2Dfu","y94nwJXljW","DLhzMQYxC0","d7vjMbgJAz","tlILtbrhlQ","1j5L8v8yFN",
+"FjHXRQ6Lix","AkKTkL7cGc","M6qcGJJs5m","aL6AJ580YD","HP433JIqXi","dmoS7jfREu","GWqqXv2eC3","2hEEUiKqhr","v8yFNyvOMI","HzZT87Ow5C",
+"DG4sTQ6hMC","i3pydQ6Lix","Yf2EcW7cTs","I7p2ayofH3","Dz1R3TCgPp","XflUqOz8yZ","rz7UtkZANm","Yf2EcazIWp","ZuDtDydG8U","QYxC0nlaBy",
+"PYBf4vOqCE","GrDg7CqqaD","iqv4kP6bcg","faHirYjB9t","YjB9tpWiOs","BbwgACxVEf","oQ87rBFkb8","TCgPph1zcH","dpe1vi3pyd","x3LDeBGaQY",
+"CK5W7yluBx","oGu6xokgRi","ECMvUOz8yZ","NAFuwLDk6f","HzZT8WMiS3","45cIHVIlwP","m4bxU5Drn0","AXpwEm4bxU","tlILtFxX9q","Ss0Zu7lUXZ",
+"ogLgc5iGN5","hYBCKX6Pin","t98iWLewvM","JkzUnzY1GY","ydG8UECMvU","WMiS35ZaEz","lpF6WRkQke","1j5L8lCMxy","FGzgpn8pJ9","WPmlxEoToP",
+"mX2GEzQt6Q","xReecVjCZq","MaJQsSWfou","JJs5mXyPZN","FjHXRv1Hln","pT8wueuZA5","GSQwj7ku1p","zbIYYuTacx","HfyNQReKEW","Chuy3i3pyd",
+"ECMvUuupzk","jeskSx3LDe","aL6AJFcWrW","jzUqRYOfrY","pT8wuuPX7G","tvdkDDG4sT","aFFssEdBKc","9y4lwGXdoH","ix74rxXTI4","RzaZA2TRI7",
+"DcpWBdpe1v","2Yz7ESWfou","CK5W7x3LDe","lsQGo0ao3l","DG4sT8hJdt","zz4ZU9y4lw","hUTw7Cfgr3","5ZaEzCp3mZ","taOXKRBhp0","MmsIoAOgEe",
+"QssNCzz4ZU","jeskSoQ87r","vLsmSzFgtB","6AFT05ZaEz","okgRiReKEW","7X3uySWfou","hUTw7Q6hMC","DG4sTo8Uyd","1j5L8k85Ae","s93MlnnP8o",
+"MmKGJuQIcz","kB5nPFwEJz","v8yFNVerEA","fmIK1hUTw7","v8yFNZuDtD","fcwDauQIcz","RBhp0ThjNn","7fsYMNAFuw","MmsIogtCA5","v1HlnDQimp",
+"LbRTHrKDLJ","QWxoTaL6AJ","K20wKUl4a1","C2IrcDcpWB","JRJQBLbRTH","v2eC3BpYhV","1v5hH5Namm","0h1b1d7vjM","fqypyjfREu","aFFss0YAGH",
+"tl72WX6Pin","Ss0Zu2ZHdk","0MR5XydG8U","ulk41ECMvU","lCMxyZuDtD","8TxD7QWxoT","pmeCdAgJHQ","9iGoTNcICA","I7p2aMm8si","AOgEeB3qem",
+"BCxeCQYxC0","PYBf4I7p2a","P6bcg9XyT9","Zv7z02Nslm","No0QbzY1GY","lweGyaFFss","0ao3l8U2nU","xXTI4DQimp","cmXIXWMiS3","6AFT0t59lR",
+"MezSWM6qcG","DG4sTlXFOB","cmXIXgjUTu","VLTy6WaWsv","5IhmGOUqFM","sqVrffcwDa","MmKGJFFDui","WreyP5ZaEz","ru4UGd7vjM","AkKTkRACuj",
+"prNT6JIqXi","uZPqgh1zcH","RmDcrFhtgl","gjUTuECMvU","0MR5XAkKTk","14FLRiqv4k","oQ87rIjTwP","kB5nPd7vjM","W3VFHWmadA","GSQwjpFrrl",
+"RpBQm5IhmG","kZANmAgJHQ","L7cGcgIYvE","pmeCd55rfB","64s8NQChxs","uvf7AAOgEe","RBhp0hYBCK","QWxoTlpF6W","FNYIMEdBKc","n1pmOeuZA5",
+"WDVWJRkQke","zz4ZUfcwDa","n8pJ9jeskS","jtn0XJXljW","KASQ8zz4ZU","DG4sTn1pmO","tAOsrL7cGc","FVMxoZUnqt","x3LDeFFDui","JRJQBYOfrY",
+"8hJdtlsQGo","faHirs93Ml","StlDJK20wK","RsQUqFnPFB","SWfou2hEEU","9XyT9MGlTF","s93MlOHaBz","aez9yWaim6","CIShGRACuj","7hyVvZhwG1",
+"Pb1pazmLYD","WDVWJVBjhz","blLA9Kr8ys","QClRLvkCHH","hUTw7wiHrZ","zQt6Q8xEKz","jSjS3prNT6","y94nwWaWsv","zbIYYbgJAz","VBjhz9XyT9",
+"lj07QdhSuH","B3qemgtCA5","k85AeTXQ0Z","5nmWv3weIF","AXpwECdyBV","uZPqgx3LDe","Yw2oU5VZjS","MezSWpmeCd","k85AeAXpwE","0h1b1Y1mC0",
+"FVMxooVQp6","m4bxU618Di","Mkgy8Pb1pa","gtCA55Mg9r","M3zXLZv7z0","he9IAzHF1q","W3VFHQWxoT","ydG8UkB5nP","fcJOylH1kt","8xEKz3weIF",
+"cQOnvuoStw","1v5hHlkMUA","tAOsr4QMc9","qaofNFGzgp","iB08lxciqp","OxWIHP6bcg","0PktIAgJHQ","8U2nU5iGN5","BGaQYzHF1q","aez9yru4UG",
+"WaWsvvkCHH","Chuy3ZUnqt","6q6L9qaofN","gIYvEpiJSk","Pb1pa5Drn0","Mm8si0MR5X","dhSuH0Wr5y","VerEAEoToP","dmoS7v2eC3","2TRI72TRI7",
+"AmdQdGv3Fq","AgJHQoGu6x","IRh48OHaBz","WMiS3rz7Ut","lCMxys93Ml","7fsYMWaWsv","HfyNQpiJSk","lpF6WtvdkD","t98iWJXljW","bZLvS8xEKz",
+"ReKEW7lUXZ","yEfy9sx5Gl","Cfgr3WaWsv","0YAGHK4GS8","9XyT9IjTwP","QClRLSjskQ","zz4ZU4QMc9","lXFOBRkQke","pvgjSRzaZA","5IhmGgf8rI",
+"fLNg8J2mQi","lpF6WIKxdL","D6rByzz4ZU","7Ow5Cx3LDe","5IhmGAgJHQ","AOgEeEoToP","lkMUAUvlv4","RzaZAdpe1v","iqv4k48cHL","16lHc1LB1L",
+"lsQGozY1GY","m4bxUCK5W7","oVQp6d7vjM","U3yw5GXdoH","ni2v1MojnP","FwEJzZ4I1v","L7cGcIn3NS","lH1ktUmaEv","SmGzvAmdQd","aL6AJyofH3",
+"Oz8yZCIShG","24ARFRzaZA","FLsphFFDui","ReKEW8xEKz","fFDrJMmKGJ","s93Ml64s8N","d85a9VjCZq","pAhR1Twano","bgJAzbZLvS","atef21j5L8",
+"ix74rStlDJ","ogLgcvLsmS","lViBvAIYUu","2TRI7BbwgA","9eoRcpmeCd","OxWIHuAWyp","4dEz6cL0aE","gdQsSgjUTu","x3LDeNOHsz","HfyNQ5nmWv",
+"SbRYyVjCZq","HfyNQWaWsv","tAOsrhYBCK","Dz1R3okgRi","dmoS7zQt6Q","CK5W7GSQwj","14FLR8xEKz","jiVBPCK5W7","WreyP5nmWv","zmLYDyEfy9",
+"rz7Ut3weIF","yluBxKZamH","n1pmO7ku1p","zbIYYzmLYD","AOgEelH1kt","h1zcHVprf2","jiVBPZJTXH","YjB9tM6qcG","a00b5Y1mC0","uZPqgt59lR",
+"48cHLs93Ml","Yf2EceuZA5","LewvMpWiOs","8U2nU1LB1L","8cVD3QYxC0","3weIFxReec","vOqCEoGu6x","lCMxyKsjRK","v8yFNP6bcg","VIlwPFLsph",
+"3weIF4W0Tl","XyPZN5ZaEz","ZhwG1pv0i7","ThjNnGrDg7","VIlwPEOE1o","hE1Qlv1Hln","L7cGcNxx9V","CK5W7pvgjS","RACuje6e4z","8cVD3sqVrf",
+"DQimpSWfou","ZuDtDZuDtD","l83UdSWfou","DQimplCMxy","xciqpSmGzv","FLsphlkMUA","pFrrlNxx9V","nFqikkB5nP","Yw2oUGSQwj","IjTwPMkgy8",
+"yofH3djsrv","ThjNnlkMUA","OUqFMTCgPp","9XyT9rz7Ut","hYBCKQClRL","cL0aENAFuw","7hyVvKr8ys","aDGtScQOnv","2NslmjzUqR","n8pJ9QChxs",
+"9XyT9b29RJ","EOE1oIRh48","LDk6fStlDJ","ciuWzYjB9t","dmoS78TxD7","ZhwG1VIlwP","RACuj0Wr5y","fcwDaMmKGJ","lXFOB7fKYU","9XyT9XyPZN",
+"AmdQdMm8si","YjB9t618Di","5NammFnPFB","ni2v1azIWp","580YDRBhp0","hUTw7sx5Gl","QnJ1SfFDrJ","TXQ0ZpvgjS","580YDxReec","5drc6Yf2Ec",
+"nnP8oPOUYS","SWfouW7cTs","X6PinNxx9V","rz7UtWMiS3","yToGWyEfy9","jeskSFLsph","DQimpsx5Gl","v2eC3Fhtgl","RkQkeRpBQm","wDajXQworu",
+"lCMxyjeskS","5IhmGzQt6Q","Yf2EcAkKTk","CK5W7Cfgr3","Fhtgl7hyVv","jeskS0Kyfs","guMb87hyVv","IRh484QMc9","qUJMdMezSW","9GXkXtjQxs",
+"ReKEWzY1GY","7fKYUs4786","uZPqgFhtgl","O3iyQ9eoRc","ciuWzKr8ys","FnPFB9GXkX","dpe1vuJScX","2TRI7QYxC0","CdyBVOUYuF","lkMUA7hyVv",
+"AkKTkRsQUq","jS1ajWaWsv","1LB1L5nmWv","taOXKzqH0W","7Ow5CCxVEf","O3iyQYw2oU","618DiJkzUn","G1RhS7fsYM","7fKYUhYBCK","5Mg9r2Yz7E",
+"Vprf2In3NS","QbxXc3weIF","TwanoHP433","pv0i7lm0pD","iB08lrKDLJ","iqv4k24ARF","LDk6fjfREu","vkCHH64s8N","s93Mlk85Ae","ZUnqtuvf7A",
+"HRxd8VNCPd","No0QbFnPFB","0Wr5y8cVD3","BbwgAuN6r3","xReecVLTy6","gf8rI5Mg9r","9y4lw48cHL","tjQxs0BmCy","lsQGozbIYY","hUTw7tvdkD",
+"3weIF0PktI","rKDLJIjTwP","ogLgc7X3uy","ni2v1l83Ud","oQ87rpAhR1","0ao3ld85a9","zY1GYdpe1v","6q6L9brhlQ","5NammciuWz","tAOsrK4GS8",
+"Q6hMCMGlTF","JRJQBZuDtD","Mkgy88xEKz","yEfy9tlILt","ni2v17Ow5C","uN6r3i3pyd","uZPqgRzaZA","kZANmCqqaD","pmeCdCxVEf","jfREuNo0Qb",
+"uQIczZ4I1v","24ARFPb1pa","b29RJfLNg8","QnJ1SQWxoT","OxWIHjiVBP","S2Dfusoy9t","euZA5OxWIH","IBe8kSjskQ","FVMxoeuZA5","MojnP24ARF",
+"xXTI4x3LDe","iqv4ksoy9t","TCgPp9rlg9","0PktILewvM","2DREsiKqhr","yToGWGrDg7","No0Qb8RCUA","fqypyOz8yZ","MezSWlj07Q","kZANm16lHc",
+"lXFOBZUnqt","lCMxyX6Pin","OUYuF2ZHdk","LbRTHtaOXK","v8yFNpmeCd","4dEz64dEz6","ReKEWCfgr3","uN6r3iB08l","64s8N1v5hH","iB08lBCxeC",
+"Uvlv4UlU3M","6AFT0Oz8yZ","ix74rlsQGo","LbRTHlpF6W","yEfy9iB08l","4dEz6Uvlv4","IjTwPNo0Qb","Cfgr3RsQUq","uoStwDcpWB","v1HlnuTacx",
+"tjQxszFgtB","cmXIXUvlv4","618DiNhXdu","L7cGcGSQwj","l83UdaFFss","0ao3lZUnqt","ZhwG1uZPqg","AgJHQuPX7G","ydG8UCNHmv","aL6AJ2Yz7E",
+"v8yFNuQIcz","fmIK1euZA5","DQimp8TxD7","QChxs24ARF","t59lRFNYIM","xXTI4ksJby","Mm8siblLA9","HP4330Kyfs","VLTy6qQxHP","gtCA545cIH",
+"7X3uy9eoRc","CdyBV9y4lw","AOgEe5iGN5","Ss0ZuJJs5m","cShY2AgJHQ","prNT69XyT9","0KyfsFjHXR","n8pJ9iqv4k","xciqpFGzgp","CK5W7BbwgA",
+"aL6AJQ6Lix","iwzGkJIqXi","BbwgAlpF6W","yvOMIcmXIX","CdyBVHzZT8","FLsphFnPFB","he9IADLhzM","VBjhzYOfrY","oQ87rdhSuH","D6rBylkMUA",
+"FVMxokZANm","brhlQwDajX","blLA9soy9t","WMiS3BCxeC","RxrsmQbxXc","lCMxyyofH3","Oz8yZzQt6Q","wiHrZGXdoH","580YDIn3NS","tvdkDRmDcr",
+"uAWypv8yFN","JKWYRdjsrv","h1zcHDLhzM","tvdkDrhl0J","8RCUAIRh48","SjskQ8xEKz","5VZjS5IhmG","S77LHBFkb8","2hEEUuJScX","0Wr5yRxrsm",
+"U3yw5zFgtB","s7Mxk07n1c","VNCPduLtKs","In3NSazIWp","LbRTHYh1hF","AgJHQAXpwE","blLA9X6Pin","8U2nUni2v1","TXQ0ZmX2GE","y94nwMGlTF",
+"NhXdux3LDe","ZzJHWZ4I1v","cQOnvzHF1q","DcpWBCfgr3","ulk41uupzk","qaofNCK5W7","piJSkqaofN","jzUqRFVMxo","i7WMQNxx9V","CdyBVECMvU",
+"CxVEfGWqqX","piJSkHRxd8","n1pmOd7vjM","K20wKDG4sT","jtn0XnlaBy","ReKEWVNCPd","Z4I1vZzJHW","cQOnvQnJ1S","MojnPix74r","0PktItvdkD",
+"4QMc9ciuWz","CxVEf7fKYU","soy9twDajX","QChxsksJby","0MR5XjeskS","djsrvv1Hln","FGzgpNxx9V","k85AeEOE1o","Ul4a1QYxC0","uLtKsrhl0J",
+"i3pydUlU3M","U3yw5cQOnv","hE1QloQ87r","0BmCy0ao3l","C2IrcHRxd8","4QMc9ydG8U","yvOMIF6PT2","OUqFMDG4sT","Pb1paFcWrW","okgRi8TxD7",
+"jtn0X48cHL","AkKTkm4bxU","oQ87rpv0i7","FwEJzFFDui","lj07QZv7z0","Fhtglm4bxU","DLhzM8hJdt","W3VFHd85a9","ru4UGK20wK","FnPFB7lUXZ",
+"Fhtgl1LB1L","580YD7fKYU","RBhp0SmGzv","HRxd8nnP8o","9eoRc5VZjS","618DiFLsph","b29RJ2TRI7","lweGyv1Hln","0Wr5yIKxdL","M6qcGUlU3M",
+"7fKYUZuDtD","KsjRK9eoRc","ZhwG1RzaZA","9eoRcksJby","Q6Lix7fsYM","ZJTXHyEfy9","s7MxkC2Irc","zbIYY2Yz7E","hUTw77hyVv","tjQxs1j5L8",
+"MojnPIjTwP","cQOnvix74r","FcWrW2ZHdk","QnJ1SJkzUn","t59lRGSQwj","ni2v1pT8wu","QWxoT5ZaEz","lpF6WbrhlQ","uoStwjS1aj","S77LHyvOMI",
+"KZamHblLA9","oGu6xKZamH","aFFssMkgy8","pmeCdmz8gx","AOgEezmLYD","fLNg8AXpwE","8RCUAMK07Y","AmdQdsuY4x","XyPZNzbIYY","ZUnqtRACuj",
+"8RCUA16lHc","Gv3FqRpBQm","pmeCdJJs5m","6q6L9ulk41","sx5GlZhwG1","mz8gxv1Hln","xReecRzaZA","tjQxsx3LDe","WmadA9rlg9","lCMxykB5nP",
+"IKxdLvOqCE","EdBKc7Ow5C","Uvlv4Pb1pa","VerEAYjB9t","Nxx9VSs0Zu","K20wK5Namm","QWxoTZuDtD","m4bxUBbwgA","PYBf43weIF","7lUXZVprf2",
+"AOgEe0YAGH","pvgjSlViBv","uJScXM6qcG","fFDrJMGlTF","5iGN5lH1kt","tl72W16lHc","rhl0JCqqaD","U3yw5K20wK","xciqpYOfrY","ru4UGAXpwE",
+"4QMc9b29RJ","BFkb89eoRc","5VZjS0YAGH","YOfrYYOfrY","lXFOBzQt6Q","jiVBPy94nw","VerEAxReec","MGlTF5Namm","OHaBzGXdoH","7Ow5CpAhR1",
+"0Kyfsh1zcH","FxX9qtAOsr","lkMUAIRh48","5drc6RzaZA","5nmWvuZPqg","7hyVvfmIK1","fLNg8ydG8U","YOfrYiKqhr","dQ586AkKTk","cShY2brhlQ",
+"hSSvQS2Dfu","jzUqRCxVEf","Oz8yZlkMUA","jtn0XazIWp","sqVrfBCxeC","ix74rHlUbF","4dEz6NAFuw","FcWrW7fsYM","tAOsryEfy9","CIShGReKEW",
+"45cIHQYxC0","7lUXZWreyP","lkMUAQbxXc","FnPFBQnJ1S","AOgEedjsrv","MojnP6AFT0","MGlTFHlUbF","TwanotjQxs","ciuWz0BmCy","EOE1oBpYhV",
+"TwanoTXQ0Z","14FLRTwano","gjUTu0BmCy","EdBKcNAFuw","fcJOyxReec","8xEKz4dEz6","RzaZAFNYIM","prNT6fcJOy","DG4sTtjQxs","BFkb8Yw2oU",
+"WaWsvuJScX","xXTI45Mg9r","tl72WUvlv4","lViBvoQ87r","dmoS7LbRTH","sx5GlsuY4x","pmeCdYf2Ec","AIYUu5nmWv","oQ87rxciqp","xReecAkKTk",
+"s4786zHF1q","2Yz7EChuy3","uLtKsMK07Y","uupzkDG4sT","jSjS3sqVrf","iKqhrlj07Q","QYxC0iqv4k","RkQkeLbRTH","uTacxciuWz","ni2v1W3VFH",
+"fcJOyAgJHQ","s93MlMK07Y","zz4ZURACuj","lm0pDeuZA5","d7vjMfmIK1","fcJOyBCxeC","HP433ulk41","pvgjSvLsmS","uAWypWmadA","DG4sTsuY4x",
+"tuDySP6bcg","8xEKz5Namm","9y4lwpT8wu","BFkb8Qworu","t59lRKsjRK","NOHsz1v5hH","jtn0Xxciqp","qUJMd6AFT0","jeskSpT8wu","azIWp8TxD7",
+"24ARF7ku1p","sqVrfLbRTH","zY1GY24ARF","9XyT9rKDLJ","9y4lw9GXkX","gf8rIiqv4k","Yw2oUD6rBy","5Mg9rhi5X7","DcpWBMezSW","pv0i7Uvlv4",
+"i7WMQSbRYy","i7WMQIjTwP","aez9yGv3Fq","Ul4a1NOHsz","ogLgcWmadA","uAWypnFqik","i3pydDLhzM","uJScXFNYIM","kZANma00b5","M3zXLqaofN",
+"Ta8f6O3iyQ","M6qcGmX2GE","7hyVvpvgjS","Yf2EcZv7z0","faHirAkKTk","rKDLJuPX7G","9eoRcni2v1","qQxHPHzZT8","5VZjSTwano","zY1GYyEfy9",
+"ydG8UyvOMI","LDk6fv8yFN","GXdoHiKqhr","qUJMd618Di","zFgtBy94nw","NhXduiwzGk","29QAzdQ586","6q6L96q6L9","fFDrJMkgy8","5IhmGi7WMQ",
+"aez9yM3zXL","hSSvQlH1kt","ReKEWZJTXH","KZamHoGu6x","0KyfsIKxdL","0Wr5yCfgr3","5IhmGtaOXK","cQOnvNo0Qb","Ss0ZuTCgPp","G1RhSfmIK1",
+"yEfy9euZA5","wDajX0h1b1","l83Udxciqp","AOgEeOxWIH","qUJMdvLsmS","M3zXLvLsmS","n1pmOzqH0W","iqv4kPb1pa","hUTw7JKWYR","xXTI45nmWv",
+"RkQke7hyVv","AOgEeNOHsz","ZUnqtvLsmS","sx5Gl1v5hH","NcICAQ6Lix","zqH0WTXQ0Z","TCgPpW3VFH","ZJTXHdQ586","lViBvbZLvS","ZuDtD0h1b1",
+"7fKYUGSQwj","55rfBwiHrZ","tlILtMm8si","NcICAEOE1o","uvf7Ax3LDe","e6e4zv8yFN","vkCHH5VZjS","Cp3mZpv0i7","ZzJHWciuWz","MojnPaL6AJ",
+"lCMxy07n1c","CqqaDWreyP","45cIHoQ87r","lj07QHRxd8","PYBf42Nslm","HP43329QAz","vLsmS45cIH","ydG8URpBQm","0YAGHqQxHP","G1RhSm4bxU",
+"D6rBypmeCd","FFDuilViBv","wiHrZl83Ud","JRJQBpAhR1","45cIHC2Irc","FxX9qgf8rI","WPmlxtvdkD","GrDg764s8N","HRxd87hyVv","jSjS3oGu6x",
+"5iGN5x3LDe","BbwgANxx9V","9iGoTaL6AJ","gf8rICIShG","VNCPdAXpwE","FcWrWoGu6x","No0Qbrz7Ut","VerEAFhtgl","ulk41qaofN","jiVBPBFkb8",
+"VLTy6YOfrY","5Mg9r2TRI7","oGu6xdpe1v","I7p2adjsrv","pv0i7M6qcG","HP433xXTI4","KsjRKl83Ud","9rlg9618Di","IBe8kEdBKc","aDGtSFGzgp",
+"5NammlpF6W","LewvMy94nw","Q6hMCqQxHP","l83UdAmdQd","hi5X7b29RJ","Uvlv4cmXIX","uLtKsCxVEf","ECMvUcmXIX","S2Dfu0BmCy","FxX9q07n1c",
+"1j5L8YjB9t","i7WMQbrhlQ","s4786hUTw7","YjB9t2ZHdk","Uvlv4iqv4k","FxX9qqUJMd","uPX7GFNYIM","S2Dfu0Kyfs","tAOsrQworu","v2eC3lpF6W",
+"vLsmSZhwG1","dmoS7AXpwE","FnPFBhE1Ql","DG4sTJkzUn","0KyfsGXdoH","pT8wuMojnP","NAFuwuupzk","ix74rlj07Q","WPmlxazIWp","Q6LixNo0Qb",
+"VIlwPksJby","s93MlwDajX","NAFuwFFDui","guMb8ulk41","4QMc9tjQxs","ECMvUTa8f6","5VZjSmX2GE","jzUqRNo0Qb","jzUqRQ6hMC","OUYuF1v5hH",
+"29QAzCK5W7","xReecFGzgp","d7vjMVLTy6","euZA55drc6","JRJQB580YD","WreyPS2Dfu","LbRTHOUqFM","S77LHThjNn","faHirW7cTs","aFFsslH1kt",
+"jtn0XB3qem","FVMxoIBe8k","zz4ZU5VZjS","sqVrfaL6AJ","RpBQmk85Ae","m4bxU0h1b1","euZA5ru4UG","XyPZNFcWrW","hE1QlzHF1q","v2eC3vLsmS",
+"FxX9qpAhR1","Cfgr3Q6Lix","16lHcgIYvE","UlU3MjfREu","0YAGHix74r","BbwgACK5W7","uAWyp5VZjS","G1RhS580YD","ZJTXHbgJAz","NAFuw7ku1p",
+"fFDrJEoToP","L7cGcBCxeC","kZANmxXTI4","5Mg9rAgJHQ","WmadAfFDrJ","MK07YPb1pa","Waim6y94nw","618DitjQxs","8TxD7ReKEW","mX2GEk85Ae",
+"618DisqVrf","n8pJ9ThjNn","nFqikDG4sT","14FLRkB5nP","MaJQs0Wr5y","RsQUq0h1b1","RpBQm5Namm","fcwDauAWyp","8cVD3pmeCd","Cp3mZoGu6x",
+"WreyPpv0i7","DcpWBAIYUu","lkMUAuJScX","fFDrJl83Ud","HlUbFrz7Ut","Oz8yZKr8ys","GWqqXuTacx","VIlwPfqypy","HfyNQcmXIX","GrDg7MK07Y",
+"yluBxIn3NS","pFrrl8cVD3","JKWYRM3zXL","EOE1o6q6L9","OUYuF8cVD3","5NammCqqaD","uAWypVerEA","SbRYyix74r","kB5nPI7p2a","MezSWlm0pD",
+"rhl0JuTacx","AOgEe64s8N","M6qcG7hyVv","48cHLd85a9","uZPqgAIYUu","8RCUAlkMUA","TXQ0Zy94nw","QnJ1SrKDLJ","pv0i72hEEU","5Mg9rpFrrl",
+"Dz1R3Mkgy8","rz7UtogLgc","QworuAmdQd","AmdQdgtCA5","v2eC3bZLvS","hYBCKni2v1","ECMvUUvlv4","DG4sTG1RhS","ni2v1tuDyS","uPX7GjS1aj",
+"FPfSEuZPqg","tlILtazIWp","l83UdUmaEv","lH1kthSSvQ","jS1ajFjHXR","euZA5dpe1v","uPX7GW3VFH","FPfSEokgRi","n1pmOs7Mxk","n1pmOEdBKc",
+"No0QbtlILt","nlaByEoToP","rz7Uthe9IA","2DREsBGaQY","QChxsHRxd8","zmLYDMojnP","l83UdyluBx","AmdQdAOgEe","MK07YJIqXi","MaJQsdQ586",
+"QbxXcv8yFN","ThjNnMGlTF","FxX9qDQimp","CxVEfCfgr3","TCgPpNOHsz","uAWyp7X3uy","RBhp0Q6hMC","9eoRc7lUXZ","ciuWztl72W","ru4UGAgJHQ",
+"7fsYM2TRI7","jtn0Xn1pmO","WMiS30MR5X","n8pJ9v1Hln","ReKEWAXpwE","guMb8qQxHP","0BmCyKZamH","DG4sTRBhp0","0BmCy2Yz7E","HRxd8s4786",
+"uTacxU3yw5","gjUTuguMb8","HfyNQL7cGc","iwzGk0Kyfs","VLTy6uN6r3","CNHmvgf8rI","48cHL5IhmG","sx5Gly94nw","ZUnqtMojnP","CqqaD0Kyfs",
+"lH1ktxXTI4","GWqqX5VZjS","ReKEWOxWIH","Oz8yZZUnqt","ECMvUGrDg7","W3VFHNOHsz","oQ87rlweGy","zbIYYSmGzv","uZPqgFLsph","CNHmvk85Ae",
+"8xEKzgdQsS","07n1c45cIH","uJScX618Di","0ao3lDz1R3","TXQ0ZD6rBy","lpF6WzY1GY","mX2GE5drc6","2DREs2ZHdk","uJScXMaJQs","BGaQYuJScX",
+"ciuWzOxWIH","ECMvUHP433","Cp3mZk85Ae","TwanoyToGW","J2mQituDyS","uoStwlViBv","SbRYyM3zXL","aL6AJQWxoT","K4GS87lUXZ","d7vjM5IhmG",
+"Yf2EcQnJ1S","jtn0XRkQke","MK07YNOHsz","RmDcrKr8ys","pT8wuuoStw","NOHszbrhlQ","WMiS3ZuDtD","5iGN5qUJMd","No0QbtAOsr","2hEEUPYBf4",
+"d85a9FPfSE","e6e4zCqqaD","VLTy6lm0pD","JIqXi7X3uy","uAWyptlILt","D6rByX6Pin","GrDg7OHaBz","euZA5euZA5","d7vjMReKEW","No0Qbix74r",
+"ydG8UBCxeC","aL6AJaFFss","ZzJHWv1Hln","Oz8yZRzaZA","l83Ud2DREs","yvOMICdyBV","pvgjS7fsYM","lsQGouTacx","GSQwjfcJOy","qQxHPlXFOB",
+"WMiS38hJdt","FNYIMLbRTH","zmLYDVIlwP","IRh480BmCy","HRxd8RzaZA","3weIFs93Ml","WaWsvo8Uyd","I7p2ab29RJ","JJs5mrhl0J","qaofN5iGN5",
+"8hJdtlweGy","xciqphe9IA","618Di64s8N","t98iWcL0aE","aDGtSuQIcz","yvOMIDLhzM","MezSWOz8yZ","tjQxsGXdoH","tAOsrwiHrZ","ZzJHW0BmCy",
+"45cIH29QAz","ydG8U6q6L9","gtCA5BFkb8","rhl0Jv2eC3","k85Ae0PktI","5nmWvIn3NS","hi5X7d85a9","BpYhV0ao3l","HlUbFMK07Y","XyPZN0ao3l",
+"5Mg9r8TxD7","i3pydcmXIX","QChxsWreyP","xciqpyvOMI","lViBv4W0Tl","v8yFN7X3uy","qQxHPRxrsm","RmDcrb29RJ","zbIYYjiVBP","fcJOy29QAz",
+"lH1ktQYxC0","0MR5XGWqqX","djsrv2Nslm","VerEAn1pmO","KZamHIKxdL","XyPZNbZLvS","16lHcVIlwP","M6qcGStlDJ","MezSWuvf7A","J2mQiHzZT8",
+"ulk417hyVv","Waim60BmCy","Gv3FqGrDg7","CqqaDxXTI4","GXdoHW7cTs","Nxx9VC2Irc","RmDcrUl4a1","HzZT8FwEJz","W7cTsHRxd8","WPmlxdQ586",
+"cQOnvOxWIH","16lHcblLA9","qUJMdQClRL","EoToPtuDyS","618DiyofH3","BCxeClXFOB","GWqqXMmsIo","5drc6cQOnv","X6PinRBhp0","h1zcHCfgr3",
+"euZA5NOHsz","dpe1vAIYUu","5iGN5fFDrJ","JXljWy94nw","brhlQ9iGoT","pAhR116lHc","5IhmG8cVD3","45cIHuN6r3","SbRYydjsrv","Nxx9VVprf2",
+"aFFssD6rBy","FVMxoJRJQB","0MR5X8RCUA","yvOMISjskQ","uvf7ARBhp0","RzaZA2ZHdk","MmKGJWMiS3","qQxHPYjB9t","RzaZANxx9V","i7WMQ8RCUA",
+"zQt6QGXdoH","9iGoTaDGtS","X6Pin0h1b1","pAhR1OxWIH","3weIFFhtgl","pWiOs4dEz6","gdQsS2Nslm","lH1ktWMiS3","QnJ1SoVQp6","W3VFHfaHir",
+"1v5hH4dEz6","QYxC0MezSW","YOfrYzqH0W","MK07YFPfSE","zqH0W64s8N","prNT6ZUnqt","h1zcHiwzGk","lsQGoReKEW","aDGtSVNCPd","SmGzvRACuj",
+"6AFT0yofH3","RmDcrfFDrJ","zbIYYQ6Lix","7fKYUZUnqt","JRJQBRzaZA","CqqaDxReec","Y1mC0uZPqg","uoStwv8yFN","fFDrJsqVrf","580YDeuZA5",
+"3weIFlpF6W","WDVWJl83Ud","AIYUuiKqhr","FjHXR8U2nU","y94nwlsQGo","ZzJHWCNHmv","ZUnqtLbRTH","SbRYyO3iyQ","hSSvQJRJQB","RzaZAlViBv",
+"SjskQtlILt","2ZHdk1v5hH","2DREspvgjS","Yw2oUVerEA","jSjS3vkCHH","NAFuwKsjRK","WPmlxoQ87r","2ZHdkFhtgl","FGzgpni2v1","m4bxUFxX9q",
+"pFrrlydG8U","J2mQiJIqXi","6AFT0QYxC0","HfyNQkZANm","ZJTXHwiHrZ","0PktIzFgtB","7Ow5CMkgy8","GSQwjxciqp","QnJ1SyToGW","hE1QlPOUYS",
+"HlUbFnlaBy","SmGzvIn3NS","7fsYMtlILt","1LB1LpiJSk","gtCA5o8Uyd","jeskSksJby","JJs5m5IhmG","Z4I1vCxVEf","OUqFMRxrsm","K4GS85ZaEz",
+"hYBCKzFgtB","07n1cECMvU","9GXkXQ6hMC","FGzgpQYxC0","0MR5XZhwG1","faHirTCgPp","CK5W7Twano","AgJHQoQ87r","AkKTkNAFuw","Cp3mZxXTI4",
+"I7p2aCIShG","9eoRcEoToP","O3iyQpFrrl","ZhwG1WmadA","5ZaEzfFDrJ","t98iWDQimp","MmsIod7vjM","iB08lOUqFM","lpF6WFFDui","BCxeCSmGzv",
+"O3iyQAOgEe","TwanoQworu","UmaEvfcwDa","FnPFBa00b5","hYBCKeuZA5","rhl0Jy94nw","5drc6K20wK","cmXIXAOgEe","K4GS8ciuWz","zbIYYMkgy8",
+"ECMvUCfgr3","faHiraL6AJ","fFDrJHP433","EOE1oaL6AJ","Uvlv4s93Ml","Ta8f64QMc9","7X3uyVerEA","Waim65iGN5","MGlTF8xEKz","HfyNQ8TxD7",
+"uupzk8cVD3","hi5X7Oz8yZ","3weIFcShY2","xciqpcShY2","t59lRfqypy","8RCUAuLtKs","GrDg7zFgtB","FFDuiiwzGk","UlU3MjeskS","Ta8f6Qworu",
+"uTacxD6rBy","NhXduhYBCK","5Drn0FFDui","9y4lwvLsmS","AgJHQBGaQY","WMiS3PYBf4","yEfy9GWqqX","DQimpO3iyQ","EoToPThjNn","nnP8oOUqFM",
+"rz7Ut9eoRc","5VZjSNAFuw","0MR5XIBe8k","ru4UGTwano","zQt6QzbIYY","P6bcgAOgEe","FNYIMP6bcg","i7WMQe6e4z","MK07YNhXdu","J2mQiI7p2a",
+"gf8rI0Kyfs","mX2GENcICA","VjCZqtlILt","8U2nUWPmlx","uN6r38U2nU","VerEAbZLvS","rKDLJ55rfB","BCxeCQ6Lix","vkCHHfaHir","0KyfszY1GY",
+"CK5W7SbRYy","OxWIHCfgr3","aFFssjiVBP","Z4I1vtlILt","lXFOBcmXIX","JIqXidmoS7","fmIK17fKYU","WDVWJoVQp6","K4GS85Namm","Dz1R35nmWv",
+"J2mQii7WMQ","n1pmOzFgtB","sqVrft59lR","t59lRi3pyd","Oz8yZCp3mZ","5VZjSJJs5m","nFqik2Yz7E","xReeculk41","NcICAWmadA","d7vjMVBjhz",
+"dmoS7HzZT8","2Yz7EmX2GE","5nmWvsoy9t","5Drn0MmKGJ","uPX7GChuy3","MK07YlkMUA","5Drn0ReKEW","7ku1pZv7z0","RBhp0uQIcz","2Yz7ESbRYy",
+"DG4sTZzJHW","iKqhrDcpWB","yToGWlsQGo","KZamHcL0aE","EOE1ob29RJ","AgJHQAkKTk","s7MxkIBe8k","oQ87rECMvU","lpF6Wgf8rI","QChxs16lHc",
+"S2DfulViBv","uLtKs9GXkX","uvf7Asx5Gl","GSQwjBbwgA","jiVBPRpBQm","KZamHni2v1","0MR5XZuDtD","OUqFMaDGtS","AOgEeQnJ1S","gf8rIWaWsv",
+"uvf7A9GXkX","fqypyFxX9q","MmsIov8yFN","pmeCdxciqp","dQ586NAFuw","DLhzM8U2nU","5drc6azIWp","8FmFHAIYUu","ZUnqtpAhR1","ZzJHWIjTwP",
+"i7WMQUlU3M","m4bxUxciqp","HzZT8FLsph","3weIFS77LH","DG4sTcL0aE","0PktINo0Qb","9eoRc2Yz7E","RpBQmvOqCE","EOE1olCMxy","azIWpatef2",
+"8TxD70MR5X","he9IA7X3uy","RkQkezY1GY","mX2GEChuy3","64s8Nd85a9","NcICAOz8yZ","7ku1pfcwDa","Yw2oUcShY2","7hyVvX6Pin","Yh1hFni2v1",
+"AIYUuKASQ8","ulk41tAOsr","jzUqRMmsIo","O3iyQZJTXH","U3yw5YOfrY","aFFssBbwgA","VNCPdHzZT8","0h1b1UlU3M","8U2nU7fKYU","pAhR1AkKTk",
+"VjCZq5nmWv","fFDrJJKWYR","cQOnvhi5X7","lm0pDjeskS","jfREuXflUq","AmdQdCNHmv","ix74rIn3NS","soy9tBFkb8","zFgtBiqv4k","NOHszXflUq",
+"fcJOyKsjRK","5IhmGDG4sT","dmoS70MR5X","yToGWlm0pD","9XyT95VZjS","8xEKztuDyS","U3yw55ZaEz","nFqikvkCHH","pv0i79XyT9","cShY2fcJOy",
+"vLsmS6q6L9","7lUXZiB08l","QChxsjtn0X","AOgEeRBhp0","FFDuiQClRL","EdBKcXyPZN","3otm6Gv3Fq","dQ58648cHL","BGaQYRpBQm","WmadAY1mC0",
+"07n1cRpBQm","FLsphPYBf4","LbRTH2Yz7E","CdyBVzbIYY","OUqFM0ao3l","oQ87rVprf2","mz8gx0MR5X","7hyVvTa8f6","0YAGHzFgtB","8xEKzvOqCE",
+"KZamHhe9IA","RsQUqKsjRK","WreyPF6PT2","Z4I1vWaWsv","pT8wuM6qcG","uTacxTa8f6","uupzkaDGtS","Cfgr3QnJ1S","SWfouokgRi","WmadAuZPqg",
+"FNYIMjeskS","QChxsThjNn","cShY2NOHsz","uTacx8TxD7","WreyPBCxeC","QWxoTD6rBy","Qworu16lHc","XyPZNS77LH","0BmCyQssNC","FPfSEBGaQY",
+"ReKEW24ARF","9XyT9JRJQB","Rxrsm4dEz6","mz8gx9XyT9","9rlg9uoStw","v1HlnHzZT8","9iGoTazIWp","FnPFBzHF1q","sx5GlVprf2","fLNg8zz4ZU",
+"AIYUuJKWYR","UlU3MtjQxs","QnJ1SMm8si","JRJQBWPmlx","Dz1R3pAhR1","RACujLewvM","Q6Lixuupzk","SbRYyCdyBV","VerEARBhp0","iwzGk8xEKz",
+"QYxC0ni2v1","bZLvSSs0Zu","hUTw7DLhzM","i3pyd4W0Tl","v1HlnzqH0W","iwzGkRpBQm","5nmWv2Nslm","8U2nUwDajX","iKqhrWPmlx","lCMxy4QMc9",
+"K20wK4W0Tl","Ta8f6wDajX","WaWsvZJTXH","4dEz63otm6","i3pydvOqCE","i7WMQcmXIX","hUTw7hUTw7","C2IrcVIlwP","ZhwG1he9IA","sx5GlVjCZq",
+"BpYhVFGzgp","FLsphGXdoH","KsjRKNhXdu","EoToPaDGtS","IBe8kxXTI4","soy9tdjsrv","Mm8siFcWrW","zmLYD9eoRc","MezSWtlILt","C2IrclH1kt",
+"cmXIXCxVEf","SmGzvbrhlQ","WMiS3hUTw7","WPmlxs93Ml","OUYuFzHF1q","gjUTuuTacx","Ss0Zu7fsYM","9iGoTJJs5m","QbxXc8cVD3","xXTI4pvgjS",
+"CIShGQWxoT","iB08l5ZaEz","zQt6QTa8f6","Mkgy8mz8gx","FLsphU3yw5","X6Pinsx5Gl","Chuy3oGu6x","hUTw7yvOMI","prNT6K4GS8","yToGWni2v1",
+"xXTI42Nslm","wiHrZv1Hln","oVQp6LewvM","GSQwj0YAGH","0Wr5yHlUbF","ru4UG8xEKz","JRJQB618Di","tvdkDvkCHH","55rfBCK5W7","JXljWjiVBP",
+"HlUbFqUJMd","RACujAkKTk","ZUnqtzqH0W","QssNChSSvQ","dQ586Yf2Ec","NcICAMezSW","BpYhVokgRi","Mm8siJXljW","YjB9tGWqqX","VIlwP1j5L8",
+"aL6AJNcICA","nFqikChuy3","AgJHQBCxeC","I7p2a9iGoT","v2eC3IjTwP","gf8rIVNCPd","bgJAzfcwDa","Ss0ZuVNCPd","Gv3FqAIYUu","NhXduhE1Ql",
+"i7WMQGv3Fq","n1pmOYf2Ec","vkCHHcShY2","24ARFNcICA","S77LHMmsIo","QworuS2Dfu","6q6L9pmeCd","DLhzMcmXIX","guMb8AkKTk","KsjRK48cHL",
+"ulk41XyPZN","l83Ud9XyT9","5VZjSPb1pa","pv0i7RACuj","X6PinHP433","B3qemni2v1","rKDLJQWxoT","tAOsr5Namm","a00b5GWqqX","NAFuwlViBv",
+"tl72WKsjRK","i3pydd85a9","xciqpciuWz","oGu6x7ku1p","0h1b1ni2v1","azIWpzQt6Q","vLsmSMK07Y","ReKEWLbRTH","POUYS4W0Tl","dmoS78hJdt",
+"hSSvQxXTI4","oGu6xfFDrJ","fcJOyoGu6x","sqVrfnnP8o","Q6hMCn8pJ9","AkKTk7Ow5C","s4786lsQGo","5Mg9rHfyNQ","TXQ0Z618Di","qUJMdXflUq",
+"Ul4a1uupzk","FFDuiRACuj","uLtKstuDyS","FVMxohYBCK","5NammuN6r3","KsjRKYOfrY","uLtKsNcICA","WaWsvLbRTH","4dEz60BmCy","ogLgcdQ586",
+"hUTw7suY4x","pT8wuHfyNQ","ksJbys93Ml","zmLYDMm8si","VNCPd1v5hH","qaofN7lUXZ","zQt6Q1v5hH","SWfoubrhlQ","azIWpK20wK","djsrvjfREu",
+"fLNg8b29RJ","IRh48ix74r","MK07YDG4sT","xXTI4jSjS3","e6e4z7X3uy","9XyT9zQt6Q","J2mQiDz1R3","OUYuFjtn0X","5drc61LB1L","blLA9s93Ml",
+"16lHcM6qcG","FNYIMAmdQd","IRh48qaofN","pvgjSAgJHQ","tAOsrKr8ys","gjUTuNOHsz","aFFssHfyNQ","8xEKzDLhzM","AkKTkydG8U","8TxD7dhSuH",
+"lkMUARpBQm","v2eC3prNT6","ogLgcjS1aj","64s8N8FmFH","aDGtSG1RhS","AkKTkk85Ae","wDajXM3zXL","tAOsrxReec","Yh1hFZhwG1","KsjRK0Wr5y",
+"EoToP7fsYM","uPX7G4W0Tl","Gv3FqmX2GE","wDajXNOHsz","cQOnvhe9IA","SmGzvxReec","DQimpHlUbF","dmoS7RsQUq","ZhwG1QChxs","WDVWJ7hyVv",
+"yluBxYjB9t","rhl0Ja00b5","Oz8yZix74r","xXTI4Dz1R3","Pb1paoGu6x","ogLgcQChxs","7X3uyZzJHW","FwEJzW7cTs","uZPqghE1Ql","bgJAzMezSW",
+"Mm8si618Di","5iGN5tjQxs","MGlTFuPX7G","he9IAAkKTk","EOE1o2TRI7","IKxdL0BmCy","FjHXREoToP","Vprf22Yz7E","CNHmvDz1R3","yToGWsx5Gl",
+"WmadAFFDui","BbwgAKsjRK","l83UdogLgc","CqqaDRsQUq","IKxdLRmDcr","RBhp0vLsmS","6AFT0Mm8si","IjTwPChuy3","XyPZN14FLR","YOfrYTa8f6",
+"Cfgr3cL0aE","5ZaEzOHaBz","QbxXcZUnqt","K4GS8s4786","SmGzvS2Dfu","B3qemlj07Q","0PktIRBhp0","OUqFMv1Hln","rhl0JQWxoT","mz8gxb29RJ",
+"oGu6xzqH0W","uPX7G0Wr5y","C2IrchSSvQ","6AFT0aFFss","hSSvQFnPFB","OxWIHlj07Q","J2mQisx5Gl","ru4UG0MR5X","UlU3MqUJMd","uJScXsx5Gl",
+"K20wKvkCHH","8RCUAgtCA5","2DREsUvlv4","5Mg9rvLsmS","3otm6Chuy3","fcJOyt59lR","IBe8k3otm6","Chuy3pAhR1","xReecC2Irc","45cIHzqH0W",
+"HzZT816lHc","ksJbyuvf7A","JKWYRQssNC","jiVBPZhwG1","FVMxo9XyT9","fFDrJ64s8N","zqH0W0h1b1","zmLYDuQIcz","l83Ud9GXkX","lj07QpiJSk",
+"WaWsvTCgPp","prNT6b29RJ","0YAGH8U2nU","zqH0WdmoS7","SbRYy3otm6","cQOnvokgRi","HlUbFgIYvE","oGu6xuZPqg","pFrrlpiJSk","M6qcGUl4a1",
+"RmDcrK20wK","lkMUAwDajX","GXdoHJXljW","OxWIHnnP8o","JKWYRWMiS3","5nmWvvkCHH","bgJAzgdQsS","rhl0JThjNn","F6PT2F6PT2","h1zcH6AFT0",
+"yofH38U2nU","0Wr5yLbRTH","Mm8siuLtKs","AkKTkjeskS","CdyBVcShY2","oGu6xiKqhr","Chuy3fcJOy","AXpwEFnPFB","lm0pDatef2","0KyfsdQ586",
+"Yw2oUQ6hMC","IKxdLjzUqR","sqVrfHzZT8","zQt6QTCgPp","HP433Z4I1v","tvdkD618Di","5NammKASQ8","FwEJzO3iyQ","zz4ZUWreyP","tAOsrfFDrJ",
+"iqv4kEoToP","AkKTkEdBKc","5Mg9r07n1c","QworurKDLJ","VBjhzyToGW","9rlg9VLTy6","qUJMdSmGzv","KZamHZzJHW","8RCUAhUTw7","C2IrcuQIcz",
+"TwanoWaWsv","AIYUuzqH0W","WreyPMK07Y","IBe8kAXpwE","M6qcGfcwDa","NcICA45cIH","qQxHPCK5W7","ZzJHWuQIcz","ReKEW6AFT0","wDajXC2Irc",
+"5Mg9r0ao3l","8FmFHlXFOB","xXTI4EdBKc","QworuciuWz","1LB1LzbIYY","0PktIReKEW","yvOMIQnJ1S","ksJbySbRYy","uLtKs2TRI7","IjTwPtAOsr",
+"fFDrJyvOMI","9XyT9taOXK","Ta8f6IjTwP","kB5nPWMiS3","s7Mxkulk41","uAWypI7p2a","v8yFN0YAGH","ogLgcK20wK","CqqaD8xEKz","e6e4z5Drn0",
+"OUqFMGv3Fq","7fsYMlpF6W","JXljWuN6r3","VjCZqFNYIM","qUJMduTacx","OUYuFt98iW","ZzJHWCIShG","gtCA5lH1kt","jzUqRCNHmv","6q6L99GXkX",
+"i7WMQBFkb8","lXFOB5IhmG","580YDpFrrl","n1pmOlViBv","W3VFH9GXkX","pT8wuIRh48","QworuW7cTs","NOHszQbxXc","pFrrlHP433","kZANm7fKYU",
+"HfyNQYOfrY","K4GS8O3iyQ","dmoS7rz7Ut","24ARFzHF1q","cL0aEQYxC0","AIYUu2Nslm","W7cTsQWxoT","iwzGkjiVBP","zmLYDyvOMI","uZPqgUvlv4",
+"fFDrJUmaEv","xReecBGaQY","IjTwPrhl0J","kB5nPe6e4z","2Yz7EfmIK1","uTacxn8pJ9","DcpWBt98iW","AgJHQ4QMc9","gjUTuYjB9t","IRh48LewvM",
+"jS1ajLewvM","JIqXiJJs5m","OUYuFhSSvQ","pAhR1JJs5m","IRh48xXTI4","7hyVvQssNC","C2IrcpT8wu","9eoRcJRJQB","yluBxuPX7G","jfREuYjB9t",
+"M3zXL2hEEU","jeskSFxX9q","oVQp6prNT6","6AFT0zqH0W","S2DfuAmdQd","zz4ZUP6bcg","zbIYYdjsrv","iKqhrTXQ0Z","euZA5soy9t","jtn0XpiJSk",
+"LewvM1LB1L","uLtKsRBhp0","lsQGo3otm6","v8yFN29QAz","29QAzNxx9V","MojnPSjskQ","mz8gxJKWYR","MaJQsQYxC0","0PktIW7cTs","uLtKsGrDg7",
+"uAWyp5Mg9r","djsrvZzJHW","wDajXjtn0X","cL0aESs0Zu","xReecQWxoT","M3zXL8TxD7","iqv4k5iGN5","EdBKc8cVD3","07n1cIn3NS","DG4sTTXQ0Z",
+"v8yFNNo0Qb","JIqXiU3yw5","y94nwuupzk","yEfy9tuDyS","Mm8silCMxy","b29RJt98iW","B3qemO3iyQ","dpe1v5ZaEz","CdyBVprNT6","8cVD35iGN5",
+"aL6AJokgRi","0MR5XTa8f6","3weIFZzJHW","pvgjSe6e4z","AgJHQqQxHP","7hyVvpWiOs","HlUbFECMvU","TwanojiVBP","y94nw0h1b1","AXpwEO3iyQ",
+"2hEEUCNHmv","J2mQiJXljW","Yf2EcJ2mQi","jzUqRzQt6Q","mz8gxRsQUq","pv0i75drc6","MGlTFAmdQd","mX2GE5IhmG","qQxHPlH1kt","4QMc9QClRL",
+"9XyT9hi5X7","vkCHHSbRYy","FGzgpHP433","NOHszFjHXR","mX2GECqqaD","VerEAsoy9t","RBhp04W0Tl","POUYSZzJHW","WaWsvUlU3M","iKqhr8xEKz",
+"0h1b1ThjNn","Zv7z0tlILt","FxX9qzz4ZU","4QMc90Wr5y","X6Pinv1Hln","sqVrfBFkb8","OUqFMReKEW","7X3uyWMiS3","QChxs1v5hH","cQOnv1LB1L",
+"hUTw7uJScX","AkKTkn8pJ9","AgJHQGWqqX","ru4UGY1mC0","WreyPrKDLJ","SWfou9rlg9","iwzGkQClRL","WaWsvuTacx","ydG8UKZamH","1j5L8UmaEv",
+"iB08lhe9IA","HP4335Mg9r","RmDcr8xEKz","Ul4a1JkzUn","F6PT2WmadA","qaofNuTacx","lpF6WS77LH","d85a95drc6","1LB1LQ6hMC","d85a9KASQ8",
+"sx5GlHP433","AOgEeX6Pin","9iGoT0YAGH","pAhR1dpe1v","d85a9L7cGc","3weIFUl4a1","nlaByM3zXL","Dz1R35Namm","RmDcrkB5nP","bZLvSMezSW",
+"n8pJ9Pb1pa","2ZHdkMaJQs","16lHcFGzgp","BGaQYBGaQY","zY1GYazIWp","cmXIXix74r","ECMvUciuWz","IKxdLzY1GY","djsrvRzaZA","ZJTXHJkzUn",
+"7Ow5CIRh48","FLsphlXFOB","nnP8o3otm6","RzaZAksJby","9GXkXpmeCd","s7MxkQClRL","uLtKs07n1c","wDajXLDk6f","JXljWCK5W7","Cp3mZWDVWJ",
+"POUYSjiVBP","0h1b1aDGtS","MezSWIBe8k","FFDuiCp3mZ","EdBKc1j5L8","0PktIHfyNQ","mz8gx7fKYU","JIqXiUl4a1","4dEz6Chuy3","1v5hHn1pmO",
+"9rlg9ZuDtD","EdBKcbgJAz","Mm8si6AFT0","FGzgpazIWp","dQ586jS1aj","gdQsS2TRI7","8hJdt7X3uy","AXpwEPYBf4","yluBxNo0Qb","4dEz6kZANm",
+"tAOsrtl72W","oQ87rSWfou","pv0i7dmoS7","k85Ae3otm6","07n1c6AFT0","m4bxUlpF6W","d85a9HRxd8","ZuDtDzHF1q","0Wr5yh1zcH","Ss0ZuDQimp",
+"ReKEWBbwgA","POUYSThjNn","DcpWBWaWsv","ZUnqtfaHir","BbwgABbwgA","ksJbyatef2","MaJQsChuy3","okgRiMGlTF","GWqqXt59lR","F6PT2aez9y",
+"9rlg9NAFuw","xXTI4tAOsr","O3iyQuoStw","K4GS8prNT6","YOfrYZJTXH","In3NS7lUXZ","v2eC3n8pJ9","qaofN1j5L8","9GXkX7hyVv","suY4xSbRYy",
+"rhl0JOz8yZ","kZANm8xEKz","ksJbyRBhp0","ni2v11v5hH","MGlTF07n1c","n1pmOmX2GE","KASQ8Cp3mZ","5Mg9r45cIH","DLhzMGSQwj","2NslmFFDui",
+"2ZHdkt59lR","gtCA5CIShG","9rlg99rlg9","RpBQmdjsrv","uZPqg14FLR","gf8rI3otm6","fcJOyC2Irc","uoStwdmoS7","ThjNn2hEEU","x3LDejS1aj",
+"0h1b1J2mQi","IjTwPDcpWB","d85a9Cp3mZ","xReecXyPZN","SWfou8xEKz","WDVWJpv0i7","cL0aEAIYUu","zqH0Wi3pyd","W3VFHs7Mxk","QChxsjzUqR",
+"hSSvQP6bcg","JXljW9iGoT","FnPFBIBe8k","Mm8siUlU3M","CxVEfo8Uyd","ksJbyOUYuF","VerEAFPfSE","taOXKAOgEe","Pb1pak85Ae","M6qcGvkCHH",
+"ciuWzLbRTH","LDk6fJRJQB","No0QbJXljW","OUYuFbgJAz","8U2nUIRh48","uPX7GNcICA","xXTI4LDk6f","pFrrl5drc6","1j5L8RkQke","zz4ZUNAFuw",
+"pAhR1uTacx","QChxsOz8yZ","2ZHdkbrhlQ","v8yFNNAFuw","5iGN5Q6Lix","IjTwPpv0i7","64s8Ns93Ml","gIYvEM6qcG","QClRLpT8wu","n1pmOatef2",
+"S77LHZ4I1v","9iGoTlpF6W","7X3uyQChxs","AOgEevOqCE","B3qemaDGtS","iqv4kuQIcz","AkKTkl83Ud","0Wr5yydG8U","9eoRceuZA5","blLA9QClRL",
+"0Wr5yO3iyQ","IKxdL8TxD7","SjskQ1j5L8","MezSWzY1GY","AkKTkWPmlx","AOgEeydG8U","QbxXc2Nslm","9eoRcFLsph","kB5nP1LB1L","JXljWVprf2",
+"7fKYURsQUq","ru4UGRpBQm","0MR5XI7p2a","9rlg9ThjNn","gjUTuQ6hMC","e6e4zWPmlx","K20wKDQimp","t59lRPOUYS","AkKTk618Di","cShY2gtCA5",
+"BCxeCZuDtD","Vprf2blLA9","SmGzv8U2nU","7hyVvdpe1v","RpBQmlj07Q","lsQGoNhXdu","5nmWvlXFOB","uLtKs8U2nU","MezSWJkzUn","ZJTXHlCMxy",
+"2hEEUL7cGc","07n1czHF1q","FnPFBYjB9t","n8pJ9Q6Lix","NhXducL0aE","4W0TlFwEJz","FhtglazIWp","VBjhzs93Ml","Mm8siiB08l","pv0i7AgJHQ",
+"Z4I1vtuDyS","0ao3lgIYvE","IRh48bZLvS","5ZaEzFPfSE","EdBKcaDGtS","F6PT2ksJby","Vprf2M3zXL","tuDySVBjhz","5Drn0Pb1pa","IjTwPBbwgA",
+"blLA9h1zcH","jeskStAOsr","RsQUql83Ud","a00b5yofH3","1LB1LqUJMd","AmdQdMmKGJ","wiHrZdQ586","VjCZq5drc6","djsrvaL6AJ","Uvlv4gdQsS",
+"AXpwEuLtKs","lj07QMGlTF","64s8NbgJAz","9GXkXBpYhV","CK5W7oVQp6","prNT6i3pyd","Fhtgl7X3uy","a00b5EOE1o","BbwgAJIqXi","7lUXZAkKTk",
+"K4GS8yvOMI","0YAGHSmGzv","55rfBlXFOB","lXFOBW3VFH","hUTw7LewvM","Uvlv424ARF","lCMxyPOUYS","RmDcrrz7Ut","tlILtsqVrf","HlUbFNhXdu",
+"AOgEe16lHc","Ul4a15iGN5","Yh1hFO3iyQ","M3zXLK20wK","CdyBVS77LH","KASQ8aFFss","UlU3MOxWIH","zY1GYa00b5","KsjRKDLhzM","NAFuwNcICA",
+"FGzgpCfgr3","7X3uySbRYy","pFrrltjQxs","8cVD3SmGzv","FNYIMlweGy","3otm6WmadA","pv0i70h1b1","2ZHdk0ao3l","m4bxUaL6AJ","GrDg7CIShG",
+"RsQUqqaofN","7lUXZDQimp","NOHszjtn0X","b29RJ3weIF","uJScXQnJ1S","G1RhSPYBf4","8TxD7OxWIH","VerEAciuWz","lpF6WuPX7G","yToGWGSQwj",
+"FcWrWZ4I1v","gdQsSru4UG","W7cTs4dEz6","Ta8f6lweGy","v2eC3vOqCE","0MR5XZv7z0","TXQ0ZzQt6Q","OxWIHzqH0W","tjQxsn8pJ9","2NslmVIlwP",
+"Cp3mZRACuj","2DREszHF1q","14FLRRzaZA","m4bxUyvOMI","bZLvSTa8f6","In3NSCIShG","x3LDegdQsS","K4GS8RpBQm","0ao3ldpe1v","MojnPQssNC",
+"8xEKzLDk6f","KASQ8yluBx","oVQp67hyVv","07n1cnFqik","zbIYYZzJHW","he9IASWfou","CK5W7dpe1v","YOfrYZzJHW","dpe1vqaofN","DcpWBFcWrW",
+"piJSkjiVBP","x3LDevkCHH","lkMUAdmoS7","oGu6xcmXIX","BGaQYulk41","7hyVvokgRi","iKqhrgIYvE","ogLgcPOUYS","ni2v1IBe8k","1LB1L55rfB",
+"ni2v1GrDg7","iKqhrgdQsS","suY4xjS1aj","S2DfuWDVWJ","6q6L9jfREu","lsQGoF6PT2","xXTI4cmXIX","gIYvEsx5Gl","sx5GlCqqaD","v2eC3No0Qb",
+"SWfouIKxdL","FGzgpgjUTu","1v5hHP6bcg","Cfgr3a00b5","Ss0Zu48cHL","7lUXZjS1aj","tAOsrW3VFH","0h1b1ZJTXH","pT8wu7fsYM","VjCZqpWiOs",
+"uTacxuoStw","CqqaDKZamH","Ta8f69GXkX","qaofNWreyP","jfREuyofH3","gdQsSoQ87r","HzZT8Y1mC0","iwzGkFPfSE","b29RJbrhlQ","14FLRuJScX",
+"ciuWzfFDrJ","lpF6WZJTXH","RACujvkCHH","n1pmOVBjhz","zbIYYMm8si","ogLgcSmGzv","FxX9q7Ow5C","ZhwG1FcWrW","8TxD7zbIYY","RkQkeWaWsv",
+"lViBvlj07Q","7Ow5CQYxC0","RmDcr8hJdt","oQ87rFLsph","uvf7ATwano","580YDNxx9V","MmsIom4bxU","S77LHaDGtS","1LB1LiKqhr","FxX9qtaOXK",
+"QWxoT45cIH","Mm8siFFDui","WDVWJSWfou","vLsmSGrDg7","FcWrWDcpWB","uQIczJJs5m","HzZT8QChxs","suY4xjiVBP","IKxdLfaHir","2hEEUnnP8o",
+"580YDuPX7G","jzUqRUvlv4","h1zcHRACuj","dhSuHNo0Qb","YjB9tlkMUA","WmadAJ2mQi","KsjRK1LB1L","3weIFZJTXH","sx5GlYh1hF","9GXkX1j5L8",
+"aez9yzFgtB","lCMxyXflUq","SjskQ5Mg9r","16lHcatef2","zHF1qQnJ1S","atef2aL6AJ","OHaBzWPmlx","yluBxIBe8k","ksJbyFxX9q","DG4sT4dEz6",
+"lsQGoO3iyQ","lweGyMojnP","QworuM6qcG","BbwgARACuj","2NslmQYxC0","07n1cQ6hMC","uTacxM3zXL","Chuy3Mm8si","TXQ0ZsqVrf","QssNCxciqp",
+"Yf2Ec9iGoT","iqv4kyToGW","tlILta00b5","jS1ajl83Ud","nFqikNxx9V","ulk41wDajX","WreyPgdQsS","qQxHPaDGtS","IKxdLMaJQs","BpYhVkB5nP",
+"C2IrcqUJMd","fcwDa8cVD3","16lHcazIWp","9GXkXZv7z0","9XyT98TxD7","BpYhVtl72W","FwEJzsuY4x","L7cGcb29RJ","YOfrY2hEEU","S77LHlj07Q",
+"Q6LixGWqqX","RBhp0HzZT8","jeskSbZLvS","oGu6xZUnqt","IBe8kRACuj","ru4UGpT8wu","TCgPpcmXIX","GSQwjECMvU","n8pJ9KZamH","VIlwPCNHmv",
+"aez9yy94nw","xXTI43weIF","uZPqgzQt6Q","0BmCyNcICA","QClRLlpF6W","7ku1pUlU3M","I7p2a9eoRc","uupzktvdkD","uupzkG1RhS","yofH3sx5Gl",
+"SbRYyIjTwP","uJScXGSQwj","Yf2EcCqqaD","Waim6lXFOB","FnPFBSmGzv","ZJTXH6AFT0","VIlwPCdyBV","ZJTXHWmadA","b29RJcQOnv","F6PT2yEfy9",
+"B3qem5drc6","AIYUuZhwG1","MmsIo1j5L8","SjskQ07n1c","0Wr5yEOE1o","MmKGJsuY4x","fcwDaQworu","Vprf2hE1Ql","7Ow5CzqH0W","zmLYDIn3NS",
+"0BmCyjS1aj","0KyfsBFkb8","0Wr5yFnPFB","2ZHdkReKEW","YOfrY4QMc9","YOfrY9GXkX","cL0aEgjUTu","hi5X7MmKGJ","jiVBPe6e4z","ogLgcn8pJ9",
+"gtCA5HP433","m4bxUK20wK","FxX9qhe9IA","5iGN5t59lR","BGaQYWaWsv","GrDg7azIWp","7X3uyAOgEe","BCxeCuupzk","9iGoTn1pmO","FGzgp5VZjS",
+"1LB1LuQIcz","KsjRKQnJ1S","Qworuatef2","0ao3lPOUYS","jzUqR0h1b1","IKxdL1v5hH","GWqqXgjUTu","CK5W7tAOsr","zqH0Wn8pJ9","5iGN5suY4x",
+"BFkb8oGu6x","1j5L8uAWyp","TCgPpnlaBy","HzZT8DG4sT","iB08lqUJMd","OxWIH0BmCy","gtCA5JKWYR","tlILtHfyNQ","IKxdLi3pyd","qQxHPgjUTu",
+"qQxHP1v5hH","iKqhrSjskQ","m4bxU1v5hH","uLtKsiB08l","dQ586aFFss","QYxC0Kr8ys","FwEJz0PktI","8hJdt16lHc","RmDcrL7cGc","9rlg9RBhp0",
+"qaofNYjB9t","iqv4kNxx9V","FnPFBI7p2a","cmXIX5drc6","8FmFHVBjhz","QClRLaL6AJ","HP433t59lR","yToGWZuDtD","xXTI48U2nU","mz8gxIRh48",
+"a00b5atef2","OUYuFGXdoH","QChxspAhR1","GXdoHgdQsS","3otm6F6PT2","Ta8f6QssNC","v1HlnEdBKc","ulk41gf8rI","yofH3WDVWJ","9GXkXxciqp",
+"HP433LDk6f","wDajXMojnP","29QAzYjB9t","mz8gxuJScX","ZuDtDDG4sT","cL0aEvLsmS","hUTw7lj07Q","RsQUqFLsph","KASQ8MGlTF","9eoRcsuY4x",
+"uPX7GogLgc","cL0aExReec","MGlTF9y4lw","qUJMdRkQke","07n1cW3VFH","Chuy3tvdkD","8FmFHfaHir","6AFT0ZzJHW","oQ87re6e4z","bgJAzSWfou",
+"X6PintvdkD","UmaEvzY1GY","bZLvSjS1aj","24ARFI7p2a","SjskQVIlwP","8RCUApiJSk","MojnPAmdQd","Q6hMCMkgy8","L7cGc8U2nU","qUJMd3weIF",
+"qQxHPyvOMI","gdQsSKsjRK","5IhmGiKqhr","y94nwNAFuw","2DREsgdQsS","I7p2aZ4I1v","CK5W7xciqp","0KyfstAOsr","nnP8o64s8N","CxVEfYf2Ec",
+"tjQxsydG8U","vkCHH0PktI","he9IAWmadA","JJs5mCp3mZ","AmdQdhE1Ql","ZJTXHyofH3","CIShGo8Uyd","cShY2SjskQ","VBjhzMaJQs","guMb8QnJ1S",
+"jiVBPtuDyS","LDk6fjSjS3","yofH3t59lR","ciuWztjQxs","rhl0JzbIYY","IKxdLvLsmS","zFgtBsqVrf","tAOsrIBe8k","0Wr5y8xEKz","XyPZNuQIcz",
+"brhlQFwEJz","s7MxkDQimp","lweGyNo0Qb","aFFssvLsmS","5nmWv1LB1L","FNYIMGWqqX","gjUTuoVQp6","QChxsciuWz","zFgtBrKDLJ","gjUTutvdkD",
+"SWfouKsjRK","9iGoTsqVrf","oVQp6618Di","OHaBztuDyS","hUTw7lsQGo","5Drn0YjB9t","dpe1vQnJ1S","uupzkZhwG1","zqH0WoVQp6","Q6hMCQChxs",
+"B3qemTwano","5Drn0W3VFH","okgRivOqCE","nFqikKZamH","618DiPYBf4","s4786aL6AJ","C2IrcciuWz","6AFT0Rxrsm","PYBf4DQimp","U3yw5zbIYY",
+"a00b5JRJQB","QYxC07ku1p","LDk6f14FLR","jtn0XTCgPp","Chuy3BGaQY","pAhR1s7Mxk","CNHmv6q6L9","0ao3lydG8U","Gv3FqsuY4x","NAFuwSWfou",
+"rz7UtjeskS","EoToP2TRI7","tjQxsd7vjM","9XyT9lCMxy","pT8wu5nmWv","CIShGGXdoH","M3zXL5drc6","dQ586nnP8o","bgJAzpmeCd","Gv3FqI7p2a",
+"No0QblpF6W","ReKEWFcWrW","L7cGcHlUbF","MezSWJXljW","QYxC0d85a9","JJs5mpWiOs","kZANmsoy9t","Ss0ZuyluBx","JXljWC2Irc","1v5hHIBe8k",
+"lViBv9eoRc","Uvlv4sqVrf","lsQGod7vjM","hSSvQPb1pa","2TRI7pFrrl","7Ow5CQWxoT","9GXkXkZANm","UlU3MAgJHQ","7fsYM2DREs","EOE1oni2v1",
+"hSSvQFLsph","d85a95Drn0","5Drn0sx5Gl","PYBf4OxWIH","StlDJhSSvQ","x3LDeJ2mQi","suY4xJJs5m","jS1ajFxX9q","aDGtSWreyP","FxX9qoGu6x",
+"zHF1q9XyT9","suY4xzQt6Q","jS1ajxXTI4","Yw2oUjiVBP","G1RhS16lHc","Gv3Fqni2v1","yluBxzz4ZU","StlDJwDajX","DLhzMv2eC3","Vprf2RmDcr",
+"WMiS3djsrv","lj07Qgf8rI","JXljWFNYIM","ECMvUokgRi","dmoS7hE1Ql","G1RhS9rlg9","yofH3G1RhS","OHaBz5drc6","EoToP0h1b1","jiVBPuN6r3",
+"GXdoHlViBv","EdBKcru4UG","ciuWzogLgc","iKqhrVprf2","2TRI7zFgtB","Waim62TRI7","gjUTuHP433","5drc6Waim6","Gv3Fq8hJdt","9eoRcM6qcG",
+"POUYSgIYvE","cL0aE5Mg9r","cShY2blLA9","wiHrZCfgr3","brhlQsqVrf","dpe1vpvgjS","SWfou3otm6","lsQGodmoS7","Vprf2lViBv","JkzUnzqH0W",
+"yvOMIZ4I1v","Cfgr3Twano","0YAGHfqypy","t59lR0ao3l","7Ow5Cxciqp","jzUqRMmKGJ","hi5X7mX2GE","UlU3M5ZaEz","Yw2oUYf2Ec","Nxx9V2Nslm",
+"QbxXci3pyd","tvdkDfFDrJ","blLA9FGzgp","gtCA5W3VFH","dQ586CdyBV","lm0pDQWxoT","y94nwAgJHQ","b29RJRzaZA","lViBvfcwDa","07n1cx3LDe",
+"PYBf4B3qem","tvdkDLDk6f","Mkgy8zbIYY","prNT6IRh48","GSQwjDLhzM","zHF1qrhl0J","Chuy3Twano","SjskQ9XyT9","uQIcz5ZaEz","he9IA9iGoT",
+"2Yz7Erhl0J","xciqpsx5Gl","ZJTXHqaofN","CK5W7b29RJ","QWxoTm4bxU","oQ87rQworu","Pb1paM6qcG","QYxC09y4lw","zbIYYUvlv4","Pb1paK20wK",
+"MmKGJ7lUXZ","MezSWnFqik","S77LHKASQ8","2Yz7ERxrsm","Kr8ysLewvM","zQt6QKsjRK","HfyNQzbIYY","nnP8o55rfB","0ao3lYOfrY","pmeCdWDVWJ",
+"zqH0WWPmlx","Zv7z045cIH","0YAGHMaJQs","jSjS34dEz6","FjHXRDLhzM","GrDg7LDk6f","Yf2EcWMiS3","HlUbFpiJSk","5drc62ZHdk","CNHmvv2eC3",
+"SmGzvVNCPd","l83Ud7lUXZ","nlaBy45cIH","WPmlxpvgjS","0ao3lZ4I1v","GrDg7Cfgr3","MaJQsQ6hMC","ZzJHW5ZaEz","uN6r3MaJQs","zHF1qFLsph",
+"1LB1LGrDg7","5Mg9r9eoRc","yofH3Mm8si","K4GS8xXTI4","blLA9gf8rI","7ku1pMezSW","fFDrJM6qcG","ulk41rhl0J","pWiOs0YAGH","Yf2EcBFkb8",
+"CIShGdjsrv","2hEEUM3zXL","ogLgcWMiS3","xReecnFqik","Mm8siiwzGk","Mm8sixXTI4","5iGN5yofH3","B3qempT8wu","TCgPpvkCHH","iB08luvf7A",
+"pAhR1s4786","JkzUn1j5L8","iwzGkfqypy","AkKTkVNCPd","NOHszbgJAz","ydG8UUmaEv","HzZT8djsrv","9GXkXnnP8o","3otm6gIYvE","0ao3lY1mC0",
+"16lHcK4GS8","AmdQdlpF6W","hUTw7GXdoH","ni2v19eoRc","ZhwG1QssNC","EOE1oCqqaD","v8yFNWMiS3","618Di4QMc9","fFDrJuupzk","RpBQmfLNg8",
+"zqH0WNcICA","gIYvE1j5L8","jeskSjeskS","9rlg9Yw2oU","t59lRDG4sT","lm0pDix74r","AOgEegf8rI","2NslmtuDyS","pWiOsRACuj","lsQGo8xEKz",
+"pvgjS0BmCy","MmsIoLDk6f","G1RhS24ARF","D6rByuoStw","kZANmkZANm","v1Hlnlm0pD","POUYS24ARF","Vprf2U3yw5","n8pJ98xEKz","M3zXLiKqhr",
+"45cIHmz8gx","FVMxoFnPFB","fqypydjsrv","Ul4a1rhl0J","Yh1hFs4786","VjCZq2Yz7E","AOgEeReKEW","EoToPS77LH","yofH3I7p2a","fFDrJnnP8o",
+"aez9yD6rBy","cL0aEm4bxU","TXQ0ZjS1aj","Gv3FqM3zXL","BpYhVtaOXK","SbRYyzHF1q","MK07YDcpWB","v8yFNUvlv4","lkMUAZzJHW","cL0aEK4GS8",
+"0ao3lh1zcH","Oz8yZAOgEe","RACujatef2","0h1b1azIWp","oVQp6yToGW","8hJdt5drc6","YjB9tRpBQm","RmDcrRkQke","Q6hMC24ARF","ni2v1FcWrW",
+"s7MxkReKEW","aez9y8FmFH","F6PT28xEKz","Mkgy8WreyP","ksJbytaOXK","5VZjSlH1kt","lj07Q5Drn0","5Drn0lViBv","O3iyQYf2Ec","XflUqKZamH",
+"s4786zQt6Q","M3zXLStlDJ","Nxx9VBpYhV","okgRituDyS","v2eC3Z4I1v","fFDrJMmsIo","FjHXRqUJMd","YjB9tLbRTH","IKxdL7lUXZ","t59lRPb1pa",
+"IBe8kiwzGk","WaWsvWMiS3","xXTI4TCgPp","WreyPVprf2","BpYhVWaWsv","64s8Ni3pyd","zFgtB6AFT0","prNT6Yh1hF","Uvlv4AmdQd","prNT6SWfou",
+"ulk41AIYUu","l83UdCfgr3","cmXIXni2v1","1LB1LtjQxs","djsrvPOUYS","1j5L87lUXZ","MK07YnFqik","t59lRC2Irc","azIWp1v5hH","aez9yZJTXH",
+"JJs5mTa8f6","aDGtSJkzUn","FwEJz9rlg9","Chuy3M3zXL","RxrsmHzZT8","HP433lkMUA","6AFT0s7Mxk","MezSW7ku1p","Dz1R3v1Hln","yToGW5IhmG",
+"QWxoTiB08l","3weIF3otm6","aDGtS5Namm","AIYUuh1zcH","2NslmfmIK1","ciuWz5drc6","lXFOBFLsph","9eoRctlILt","fLNg855rfB","FLsphtl72W",
+"5VZjSb29RJ","07n1c5nmWv","RmDcr0YAGH","5iGN5RsQUq","FLsphOz8yZ","LewvMlkMUA","tl72WVNCPd","UmaEvLbRTH","xciqpuQIcz","5VZjSFnPFB",
+"oVQp6RkQke","lViBvhe9IA","o8UydI7p2a","AIYUuDG4sT","M6qcG9GXkX","OUYuFNo0Qb","hUTw7jiVBP","618DiD6rBy","K4GS8VerEA","NcICAdhSuH",
+"RkQke1v5hH","RxrsmzFgtB","ZzJHW0ao3l","48cHLHRxd8","aFFssJ2mQi","0YAGHYh1hF","s4786oVQp6","tlILtYh1hF","5Drn0pFrrl","QssNCuoStw",
+"e6e4z5Mg9r","0ao3l5nmWv","7fKYUeuZA5","HlUbFCNHmv","1j5L8ZzJHW","k85AeuN6r3","ru4UGjiVBP","I7p2ataOXK","1LB1LlViBv","cmXIXlm0pD",
+"guMb8jeskS","FnPFBokgRi","FNYIMiKqhr","Mkgy8aL6AJ","8TxD7AXpwE","pv0i7qUJMd","QbxXcblLA9","0MR5XM3zXL","0KyfsUmaEv","I7p2aFPfSE",
+"U3yw5FGzgp","SjskQ2Yz7E","QbxXcJ2mQi","TXQ0ZjeskS","3weIFChuy3","djsrvi7WMQ","ZzJHWJKWYR","yToGW8cVD3","2TRI7soy9t","uN6r3WmadA",
+"VIlwPGXdoH","ulk41sx5Gl","JKWYRaFFss","wDajX4W0Tl","rKDLJsoy9t","Pb1paxciqp","24ARFh1zcH","7lUXZM3zXL","M3zXLKr8ys","8U2nU8cVD3",
+"s4786OxWIH","LDk6f2TRI7","0YAGHv1Hln","lViBvYw2oU","9GXkXi7WMQ","ZzJHWVerEA","b29RJFcWrW","pvgjSTwano","qQxHP8FmFH","KsjRKb29RJ",
+"S77LHHP433","M6qcGdhSuH","Q6Lix5ZaEz","lXFOBNhXdu","euZA5iqv4k","lm0pDYOfrY","soy9ti7WMQ","Yw2oU1LB1L","5Drn0Z4I1v","QnJ1SBFkb8",
+"djsrvGSQwj","uPX7G9GXkX","Cfgr3JXljW","JRJQBIjTwP","FnPFBIjTwP","DcpWBMm8si","24ARFSmGzv","tjQxss4786","VjCZqMGlTF","29QAz48cHL",
+"FcWrWK4GS8","8U2nU5Mg9r","jiVBPDG4sT","uN6r3WMiS3","NOHszsoy9t","Waim66AFT0","ZUnqtUvlv4","0PktISjskQ","CNHmvIRh48","1j5L8Mm8si",
+"2ZHdk2ZHdk","jeskSPOUYS","tl72Wb29RJ","jeskSyluBx","U3yw5azIWp","K20wKX6Pin","cShY2guMb8","QssNCVprf2","xReecgf8rI","Pb1padQ586",
+"580YD4W0Tl","uLtKsrKDLJ","uoStwHfyNQ","sx5GlNAFuw","uupzkU3yw5","aFFssQChxs","hUTw7dQ586","djsrvzmLYD","Mkgy8v2eC3","oGu6x2Nslm",
+"dmoS7Vprf2","SjskQrz7Ut","DcpWB24ARF","t98iWNxx9V","ReKEWfcwDa","uoStwuupzk","4dEz60MR5X","ulk4107n1c","lH1kttAOsr","ReKEWiKqhr",
+"JIqXiuoStw","gIYvENOHsz","fcwDaC2Irc","Cfgr3MmKGJ","2Yz7EIBe8k","GrDg7FnPFB","VNCPdM6qcG","D6rBy2DREs","9rlg9JkzUn","4dEz6C2Irc",
+"h1zcHTCgPp","Yw2oUlsQGo","M3zXLni2v1","7fsYM5drc6","2DREsVjCZq","zFgtBPOUYS","oQ87raL6AJ","4W0TlNAFuw","1v5hHC2Irc","i3pydl83Ud",
+"e6e4zD6rBy","MojnPBCxeC","8FmFHFPfSE","RmDcrReKEW","vkCHH55rfB","jtn0XZzJHW","Twano8hJdt","t98iWMK07Y","RxrsmRsQUq","JRJQB7hyVv",
+"uvf7A4W0Tl","HP433vkCHH","pAhR17ku1p","MezSWBFkb8","uJScX8hJdt","s4786W7cTs","CqqaD8U2nU","zQt6QM3zXL","vkCHHoGu6x","Chuy3suY4x",
+"ix74r6AFT0","YOfrYzQt6Q","nlaBy48cHL","tlILtbgJAz","QWxoT9GXkX","azIWpo8Uyd","o8Uydk85Ae","MezSWiB08l","jS1ajdQ586","pFrrlguMb8",
+"B3qemxXTI4","pFrrlYh1hF","qUJMdrKDLJ","pvgjSZJTXH","618DitlILt","OxWIHwiHrZ","vLsmSiB08l","gtCA5LbRTH","48cHLzQt6Q","lCMxyEOE1o",
+"nlaBy5Namm","ulk41cQOnv","pT8wu64s8N","d7vjMaFFss","ydG8Uatef2","KZamH5iGN5","yToGWlViBv","uoStw3otm6","FhtglFxX9q","cQOnv07n1c",
+"8xEKzhYBCK","t59lRYf2Ec","JJs5mFLsph","sqVrfQChxs","oGu6x7fKYU","U3yw5OHaBz","v8yFNYjB9t","DQimpCNHmv","dhSuHm4bxU","h1zcHlViBv",
+"7lUXZzY1GY","MezSWuoStw","WMiS3gdQsS","k85Ae9y4lw","taOXKfmIK1","FnPFBNxx9V","JIqXiuAWyp","lj07QciuWz","gIYvEI7p2a","jeskSL7cGc",
+"oVQp6LbRTH","ZJTXHIn3NS","CNHmvZJTXH","24ARFIRh48","CdyBVLewvM","brhlQD6rBy","QClRLReKEW","FxX9qHRxd8","5ZaEznnP8o","GWqqXZuDtD",
+"qUJMdhi5X7","uvf7AFPfSE","FNYIMjtn0X","FnPFBxReec","NOHszVjCZq","8xEKzRsQUq","mz8gxi7WMQ","djsrvsuY4x","aL6AJK4GS8","aFFsshYBCK",
+"qUJMds7Mxk","hi5X7brhlQ","X6Pinm4bxU","e6e4zazIWp","zQt6Qlj07Q","y94nwU3yw5","aL6AJn1pmO","J2mQiZzJHW","Yh1hF8cVD3","9XyT90ao3l",
+"rz7UteuZA5","SWfouLDk6f","uQIczAkKTk","Qworu55rfB","hUTw7IKxdL","XflUqMojnP","aDGtScShY2","MGlTFMmKGJ","o8UydzFgtB","Ss0Zu6q6L9",
+"4W0TldQ586","FVMxoix74r","ix74rWreyP","x3LDejeskS","5nmWvpvgjS","Vprf2RsQUq","BCxeCgjUTu","TCgPp9XyT9","oGu6xazIWp","n1pmOv2eC3",
+"vLsmSQYxC0","QnJ1SW7cTs","nFqikVNCPd","prNT6aFFss","OHaBzix74r","RkQkeY1mC0","VNCPdOz8yZ","cL0aExXTI4","Nxx9V5ZaEz","aL6AJuQIcz",
+"QbxXcix74r","Pb1paSWfou","7Ow5Cdpe1v","wDajX8cVD3","uQIczuN6r3","cShY2RBhp0","JKWYR07n1c","OHaBz5Drn0","8hJdtpAhR1","7lUXZMGlTF",
+"8TxD7wDajX","blLA9Qworu","9y4lwWDVWJ","vkCHHXflUq","QChxsVIlwP","ydG8UfFDrJ","FPfSEOHaBz","AXpwESmGzv","h1zcHAOgEe","uoStwlXFOB",
+"FwEJz7hyVv","qUJMduQIcz","ZhwG1M3zXL","0PktIGWqqX","Yf2Ecmz8gx","7lUXZ4W0Tl","jzUqRlkMUA","AXpwEzbIYY","1v5hHMGlTF","lCMxy9rlg9",
+"ZzJHWgIYvE","Nxx9V1v5hH","MaJQsuvf7A","ni2v1lXFOB","8TxD7Y1mC0","QClRLQbxXc","hi5X7HzZT8","lj07QpWiOs","M6qcGUvlv4","7lUXZXflUq",
+"MmKGJd7vjM","WDVWJv1Hln","CK5W7zQt6Q","iB08l5nmWv","1j5L8hE1Ql","RxrsmYh1hF","he9IAn8pJ9","wDajXnlaBy","ulk41QssNC","uQIczuTacx",
+"tAOsrGv3Fq","Uvlv49eoRc","MojnPOUYuF","U3yw5tAOsr","nlaBy2ZHdk","t59lRK20wK","8TxD7B3qem","jtn0X0PktI","4dEz6IKxdL","v2eC3FwEJz",
+"djsrvFNYIM","1LB1LlXFOB","9y4lwX6Pin","piJSkZzJHW","D6rByXyPZN","bZLvSt98iW","QssNCP6bcg","AgJHQpvgjS","J2mQioGu6x","0BmCyO3iyQ",
+"Yh1hFfaHir","t59lRRkQke","9rlg9prNT6","xciqpjfREu","CdyBVlkMUA","3otm63otm6","7lUXZydG8U","QYxC0MK07Y","RmDcrQworu","1v5hHFPfSE",
+"cmXIXQssNC","pWiOsIn3NS","ZzJHW1v5hH","uLtKsStlDJ","he9IAFLsph","MmKGJXyPZN","n8pJ92ZHdk","piJSk0BmCy","618DiWaWsv","fcwDaKr8ys",
+"kZANmHfyNQ","3weIFzQt6Q","5IhmGzHF1q","yToGWjfREu","pvgjSmz8gx","LbRTHlkMUA","euZA5CqqaD","fcwDaZv7z0","8FmFHDG4sT","M3zXLFFDui",
+"pWiOsUlU3M","StlDJYjB9t","CxVEfzqH0W","jSjS3EdBKc","lweGyW7cTs","jfREu9GXkX","29QAzS2Dfu","XflUqFGzgp","d85a9MGlTF","ZuDtDVjCZq",
+"9rlg9RpBQm","UmaEvO3iyQ","0MR5Xs93Ml","5drc6Q6Lix","AIYUulsQGo","8FmFHHP433","1j5L8soy9t","SbRYye6e4z","v8yFNiKqhr","suY4xIjTwP",
+"tjQxs5iGN5","JKWYRVLTy6","fLNg8oGu6x","LbRTHgf8rI","o8UyduJScX","TCgPpNo0Qb","o8UydlViBv","Fhtgl9eoRc","s7Mxk2ZHdk","jfREuReKEW",
+"7hyVv9iGoT","Q6LixkZANm","YjB9tlm0pD","XyPZN5drc6","K4GS8i3pyd","l83UdMmsIo","yEfy9AOgEe","ciuWzS2Dfu","djsrvEOE1o","jSjS3CxVEf",
+"d85a98FmFH","K4GS8xReec","DG4sTsx5Gl","mz8gx9eoRc","3otm6gtCA5","kZANmoQ87r","9rlg9IjTwP","guMb80MR5X","JJs5mjSjS3","uTacxNxx9V",
+"QnJ1SMojnP","6AFT0ZhwG1","C2IrcEOE1o","nFqikuN6r3","ogLgcOHaBz","uJScX2ZHdk","fFDrJ8TxD7","n1pmOJ2mQi","7fKYUjSjS3","MmKGJQ6Lix",
+"zQt6QBbwgA","Ul4a1DQimp","Yw2oUIKxdL","lH1ktciuWz","a00b5pv0i7","X6Pin2DREs","MaJQsHP433","prNT6tlILt","lXFOBblLA9","Yh1hF7X3uy",
+"dmoS7rhl0J","Vprf20Kyfs","iqv4k5Mg9r","aez9ywiHrZ","AOgEeiqv4k","VNCPdgjUTu","RxrsmUlU3M","0BmCy3weIF","pv0i7Gv3Fq","CK5W7IRh48",
+"Vprf2cL0aE","2NslmQssNC","he9IAh1zcH","S2DfuOHaBz","JXljWMmsIo","VIlwPv8yFN","RzaZA7hyVv","7X3uy0MR5X","s4786ogLgc","5ZaEzcmXIX",
+"lweGyn8pJ9","3otm6S2Dfu","JkzUnnFqik","FPfSEt59lR","cL0aE0ao3l","618DiQbxXc","nnP8oOHaBz","ogLgcNAFuw","qaofNguMb8","0MR5XRpBQm",
+"0PktIOxWIH","xReecMGlTF","uAWyprz7Ut","qQxHPYh1hF","pFrrl7fKYU","G1RhS48cHL","WMiS3CNHmv","CdyBV55rfB","DLhzMP6bcg","No0Qbt98iW",
+"JJs5ml83Ud","AkKTkaDGtS","lweGyF6PT2","Ul4a1L7cGc","WaWsvtl72W","yvOMIZUnqt","y94nwlH1kt","zbIYYMezSW","UlU3MgjUTu","J2mQiNOHsz",
+"vLsmSCIShG","lViBvZhwG1","FGzgpqaofN","9y4lwTCgPp","aez9y4W0Tl","s4786CqqaD","NhXduQWxoT","Vprf25Drn0","AIYUufqypy","Ul4a1blLA9",
+"SmGzvUl4a1","9iGoTU3yw5","Ul4a1618Di","Dz1R3ogLgc","kB5nPQ6hMC","0PktILDk6f","hi5X7Dz1R3","1v5hHQssNC","RmDcrRzaZA","zmLYDcL0aE",
+"QWxoTJIqXi","jeskStl72W","lH1ktFxX9q","Chuy3hYBCK","oVQp6aDGtS","Zv7z0l83Ud","MGlTFAOgEe","mX2GE618Di","QssNCoGu6x","lH1ktK4GS8",
+"5VZjSsoy9t","DQimpNcICA","m4bxUSs0Zu","OUYuF2Nslm","atef28RCUA","3otm6QChxs","8cVD3RsQUq","WmadAHRxd8","EoToPQ6hMC","VIlwPJIqXi",
+"BGaQYYh1hF","wiHrZIRh48","IBe8kMGlTF","ThjNn5ZaEz","Yh1hFJJs5m","RACujUvlv4","Ta8f6kZANm","VjCZqTCgPp","MaJQsNo0Qb","BFkb83otm6",
+"x3LDeqaofN","xReecuZPqg","AgJHQTwano","CxVEfpiJSk","uQIczwDajX","rhl0J9eoRc","AmdQdBCxeC","ZzJHWlViBv","AIYUujtn0X","IBe8kPOUYS",
+"HP433e6e4z","QChxs6AFT0","BGaQYYOfrY","xReect59lR","XyPZNgtCA5","K4GS8uvf7A","7ku1pyToGW","yofH3NAFuw","Gv3FqpvgjS","0YAGHAIYUu",
+"9iGoT5ZaEz","Z4I1vNxx9V","2DREsNAFuw","RBhp0ZhwG1","F6PT25VZjS","LbRTHpvgjS","VLTy6RmDcr","5Mg9rvOqCE","D6rByzHF1q","ni2v1L7cGc",
+"BCxeCxXTI4","3weIFaFFss","ECMvUG1RhS","brhlQXflUq","pT8wuAXpwE","8xEKzaL6AJ","TwanoFcWrW","8U2nURsQUq","nnP8oQworu","HzZT8d85a9",
+"pFrrlJRJQB","uPX7Glm0pD","tuDySm4bxU","s4786CIShG","0Wr5y5nmWv","CIShGWmadA","0ao3lJRJQB","2ZHdk9iGoT","oGu6xNOHsz","2ZHdkpmeCd",
+"o8Uydpv0i7","5NammqUJMd","sx5Glsx5Gl","0YAGHRzaZA","cmXIXtvdkD","rz7UtyToGW","uLtKsCK5W7","AXpwEKr8ys","gjUTuY1mC0","Ss0ZuRBhp0",
+"7ku1p5ZaEz","WMiS3NAFuw","ksJbyMK07Y","QssNCv8yFN","Yf2EczFgtB","0KyfszFgtB","x3LDeM3zXL","yEfy9ni2v1","jeskSdhSuH","HP433iqv4k",
+"pvgjS24ARF","t59lRBGaQY","OHaBzIBe8k","FxX9qTCgPp","zmLYDbrhlQ","ksJbyLDk6f","RzaZAni2v1","jzUqRVLTy6","gdQsSblLA9","Yf2EcBCxeC",
+"7fKYUCdyBV","RxrsmGSQwj","zFgtBxReec","RACujY1mC0","SbRYyMK07Y","uJScX5Mg9r","x3LDeaez9y","tl72WGrDg7","suY4x0YAGH","fcJOyUmaEv",
+"TXQ0ZuPX7G","QChxsZzJHW","SWfouPYBf4","s7MxkxReec","iB08lMojnP","jzUqRyofH3","8RCUAFjHXR","S77LHt98iW","suY4xTXQ0Z","C2Irc8hJdt",
+"dpe1vFVMxo","QnJ1SZ4I1v","8U2nURxrsm","S77LHRkQke","5NammDG4sT","QworuyluBx","lkMUARzaZA","RzaZAW3VFH","Kr8ysX6Pin","Twanov2eC3",
+"0MR5XbgJAz","CdyBVaFFss","MaJQsMojnP","Oz8yZFcWrW","nlaByY1mC0","LbRTH5nmWv","StlDJfaHir","pT8wus93Ml","b29RJS77LH","s4786lkMUA",
+"EoToPcQOnv","nnP8otl72W","tl72Wsoy9t","U3yw5Dz1R3","D6rBy16lHc","4QMc9WmadA","8cVD30Kyfs","G1RhSCK5W7","vLsmSNOHsz","7Ow5CSs0Zu",
+"9GXkXUlU3M","HlUbFpv0i7","Kr8ysuoStw","0BmCy9GXkX","ZJTXHyvOMI","gjUTu8cVD3","pWiOsuZPqg","tl72Watef2","FjHXRuTacx","t98iWHzZT8",
+"I7p2asuY4x","48cHLnlaBy","prNT6zFgtB","HP433Waim6","JJs5mNo0Qb","FhtglStlDJ","7fKYUM3zXL","GSQwjk85Ae","Q6LixUmaEv","d7vjM07n1c",
+"ECMvUF6PT2","dhSuHTa8f6","29QAzAkKTk","RzaZAZJTXH","gf8rIiB08l","Yw2oU29QAz","FPfSEyofH3","YOfrYQbxXc","2Yz7E29QAz","Waim6Y1mC0",
+"bgJAz4QMc9","I7p2auoStw","ZhwG17ku1p","NOHsz24ARF","pWiOsXflUq","oQ87rlpF6W","qaofNX6Pin","UlU3MWDVWJ","k85AeWreyP","VIlwP16lHc",
+"JXljW7X3uy","TCgPppAhR1","tvdkDzHF1q","MojnPfLNg8","Chuy38TxD7","Vprf21v5hH","uupzkSWfou","8RCUALDk6f","4dEz61j5L8","Mkgy8K20wK",
+"iB08lhSSvQ","ZJTXHZJTXH","2TRI7OUYuF","ZzJHWGrDg7","xciqplCMxy","fcJOyv2eC3","WMiS3G1RhS","TXQ0ZS2Dfu","EOE1oogLgc","cShY2euZA5",
+"OHaBzuoStw","euZA5tuDyS","FcWrW8cVD3","lViBvFNYIM","fqypyt59lR","jSjS3zHF1q","2NslmVNCPd","bgJAzuN6r3","fcwDaaL6AJ","XyPZN07n1c",
+"OHaBzyvOMI","QworuSjskQ","vOqCEHP433","FNYIMuTacx","5NammFjHXR","ni2v1iB08l","SWfoui3pyd","nFqiksqVrf","v8yFNOUqFM","djsrv7X3uy",
+"yluBx2DREs","HP433zFgtB","FnPFB8hJdt","3otm6BbwgA","7fsYMjtn0X","Waim6yofH3","4W0TlGrDg7","yToGWStlDJ","BFkb8oQ87r","n8pJ99iGoT",
+"jS1ajC2Irc","RBhp0In3NS","DG4sTwiHrZ","pT8wu0Kyfs","vOqCEBpYhV","cmXIXaDGtS","nlaByJXljW","lkMUAMmKGJ","CIShGsqVrf","JXljWWreyP",
+"dpe1v7fsYM","fqypyJKWYR","cQOnvQ6Lix","LDk6fJXljW","brhlQaL6AJ","faHiruoStw","ZzJHWWMiS3","AmdQduAWyp","lCMxyD6rBy","0YAGH2TRI7",
+"ZJTXH2Yz7E","uPX7GgtCA5","lsQGoFFDui","d7vjMqUJMd","pAhR1W7cTs","0PktIkB5nP","KZamHOUYuF","n1pmOzY1GY","soy9tF6PT2","NAFuwydG8U",
+"ksJbyzQt6Q","FcWrWsuY4x","lCMxyZJTXH","VjCZq5Namm","XflUqU3yw5","QClRLpv0i7","zFgtBGrDg7","7X3uyHfyNQ","v8yFNsuY4x","hE1QlStlDJ",
+"EoToPC2Irc","OxWIHl83Ud","0Wr5ygjUTu","U3yw5DcpWB","mz8gxhUTw7","QbxXc6AFT0","Waim6fmIK1","45cIHa00b5","wDajXblLA9","yToGWksJby",
+"Ul4a1Gv3Fq","vOqCERpBQm","Yh1hFJ2mQi","VLTy6n1pmO","HzZT8FFDui","ksJbyaL6AJ","lViBvWreyP","s93MlzHF1q","dQ586Qworu","RkQkeaFFss",
+"XflUqfcJOy","Kr8yswDajX","uoStw7hyVv","zHF1qaDGtS","fFDrJNxx9V","RsQUqRzaZA","GWqqXs4786","t59lRuZPqg","azIWpaDGtS","8RCUAyofH3",
+"FcWrWHlUbF","uQIczCK5W7","uTacxPYBf4","zz4ZUs7Mxk","4QMc9dQ586","MezSWv1Hln","8hJdtzHF1q","StlDJfFDrJ","mX2GE16lHc","VIlwPxXTI4",
+"7hyVvv2eC3","IRh48cL0aE","iwzGkRACuj","WPmlxCfgr3","64s8Ndjsrv","9rlg9oVQp6","kB5nPEdBKc","RzaZAMojnP","oQ87r5Drn0","MojnPAIYUu",
+"iKqhr5nmWv","KsjRKCqqaD","Kr8ys9iGoT","FnPFB5nmWv","uvf7AYh1hF","HP4337fKYU","5ZaEzF6PT2","tjQxsulk41","rhl0JiKqhr","rz7UtuZPqg",
+"rKDLJyToGW","MmsIotl72W","RBhp0AOgEe","9XyT9fFDrJ","FcWrWogLgc","y94nwY1mC0","gjUTuAIYUu","uQIczm4bxU","QChxsJJs5m","KASQ8FFDui",
+"qaofNt59lR","UmaEvGWqqX","t98iWD6rBy","zHF1qqUJMd","7lUXZs4786","ECMvUBFkb8","t59lRvkCHH","ReKEWsx5Gl","vLsmSQClRL","0ao3lXflUq",
+"atef2a00b5","MmKGJG1RhS","oVQp6ksJby","VIlwPtl72W","Uvlv4SbRYy","Waim6ECMvU","I7p2ad85a9","lH1ktW7cTs","y94nwQnJ1S","uAWyprhl0J",
+"zQt6QciuWz","fLNg8FcWrW","Mkgy8jfREu","Fhtgl0YAGH","VIlwP4W0Tl","Ul4a1QChxs","7hyVvAkKTk","Mkgy8W3VFH","soy9tHlUbF","9y4lwOz8yZ",
+"pmeCduTacx","9GXkXJkzUn","RzaZAM6qcG","kZANmjzUqR","dmoS7hi5X7","O3iyQEoToP","MojnPjtn0X","zFgtBjSjS3","jiVBPsoy9t","VBjhznlaBy",
+"SWfoua00b5","lH1ktZUnqt","jiVBP9iGoT","X6PinzQt6Q","piJSkLewvM","L7cGcAXpwE","9iGoTMkgy8","pWiOscmXIX","ni2v1HfyNQ","No0QbjzUqR",
+"tjQxsbrhlQ","580YDlkMUA","RxrsmjS1aj","i3pydAIYUu","v8yFNblLA9","wDajXKASQ8","55rfBJkzUn","CK5W7AgJHQ","tl72WGSQwj","Mm8siFjHXR",
+"iwzGkQYxC0","7lUXZnFqik","n8pJ9hSSvQ","Cfgr3Ss0Zu","uTacxXyPZN","7X3uypWiOs","5Mg9rHlUbF","yofH39eoRc","0YAGHWPmlx","RBhp0AkKTk",
+"3weIFHzZT8","pFrrl9eoRc","xciqpQChxs","cShY25ZaEz","suY4xWaim6","RxrsmY1mC0","zHF1qNhXdu","ciuWzzmLYD","gjUTuEOE1o","Cfgr3xXTI4",
+"x3LDe8U2nU","TCgPpdpe1v","618Dixciqp","RxrsmgtCA5","Vprf24W0Tl","CxVEf618Di","uvf7A64s8N","JKWYRRzaZA","8cVD3v1Hln","aFFsstuDyS",
+"m4bxUgdQsS","gjUTuh1zcH","EOE1ozbIYY","FLsph2Yz7E","TCgPplH1kt","FFDuiX6Pin","GWqqX9y4lw","dmoS7RBhp0","TwanoGv3Fq","O3iyQsuY4x",
+"7Ow5C5ZaEz","S77LHM3zXL","l83Udb29RJ","EoToPUl4a1","h1zcHMojnP","azIWptjQxs","1j5L8NAFuw","jfREuyvOMI","qQxHPzHF1q","IBe8kkB5nP",
+"ZJTXHX6Pin","sqVrfatef2","pv0i7tuDyS","OHaBzprNT6","Z4I1vfaHir","i7WMQtuDyS","KsjRKmX2GE","Mm8siZUnqt","prNT6CNHmv","QYxC0fqypy",
+"UmaEvd7vjM","DQimpwiHrZ","POUYSfaHir","1v5hHMaJQs","yluBxM3zXL","pT8wuG1RhS","64s8NBpYhV","ZJTXH8FmFH","blLA99rlg9","NAFuwJkzUn",
+"brhlQ0ao3l","O3iyQGSQwj","AIYUu2ZHdk","xReecpFrrl","zbIYYYOfrY","pFrrlKZamH","9XyT9jfREu","JJs5mKsjRK","uTacxZv7z0","Ss0Zu0h1b1",
+"KZamHv1Hln","ydG8UlpF6W","hUTw7VBjhz","W7cTsBCxeC","In3NSC2Irc","Dz1R3xciqp","618DitvdkD","dQ586EdBKc","3weIFjeskS","9y4lw16lHc",
+"ZhwG1i7WMQ","ZJTXH5VZjS","MojnPU3yw5","5NammRzaZA","5nmWvAXpwE","BFkb8W7cTs","OHaBzs7Mxk","pWiOse6e4z","zbIYY5ZaEz","2hEEUdhSuH",
+"hSSvQuQIcz","8cVD3Qworu","4W0Tl64s8N","zFgtBIKxdL","Z4I1v5VZjS","QWxoTW7cTs","AgJHQNo0Qb","JXljWgjUTu","lXFOBfcJOy","07n1cFVMxo",
+"NAFuwWDVWJ","fqypyWaWsv","mz8gxuN6r3","IjTwPBGaQY","2TRI7VIlwP","4dEz6iwzGk","Oz8yZuAWyp","yvOMIJIqXi","d7vjMs7Mxk","QWxoThUTw7",
+"FVMxoBCxeC","gjUTui7WMQ","lXFOBMezSW","yvOMIZv7z0","rKDLJVLTy6","gIYvEMmKGJ","t59lR0h1b1","FLsphLbRTH","prNT6pT8wu","580YD4dEz6",
+"ru4UGsqVrf","IRh48kB5nP","KZamHDcpWB","VIlwPa00b5","DQimpJJs5m","FjHXRjS1aj","KASQ89eoRc","x3LDeIjTwP","BGaQYvkCHH","K20wKUlU3M",
+"FhtgloGu6x","Yw2oUuvf7A","580YDCp3mZ","FGzgpsuY4x","IKxdLD6rBy","Vprf2UlU3M","djsrvjeskS","BpYhVKr8ys","v1HlnW7cTs","tlILt7lUXZ",
+"taOXK6AFT0","yvOMIuN6r3","ZJTXH5drc6","pFrrlReKEW","IBe8k9XyT9","jfREuGSQwj","In3NSMK07Y","HzZT8uLtKs","DQimpgdQsS","faHirv8yFN",
+"OUqFMMK07Y","O3iyQd85a9","QClRLdjsrv","hUTw78xEKz","zY1GYVerEA","FGzgpZUnqt","djsrvCxVEf","8xEKzRxrsm","s93MlJIqXi","6AFT0FPfSE",
+"BFkb8XyPZN","xciqp45cIH","Waim6uupzk","BGaQYsx5Gl","pvgjStl72W","nnP8ojiVBP","yEfy9VLTy6","AgJHQtAOsr","DcpWBk85Ae","ThjNnRzaZA",
+"TwanofaHir","xReec1j5L8","CdyBVFhtgl","P6bcgpT8wu","618DisuY4x","iqv4ky94nw","Cp3mZ0YAGH","fmIK1S77LH","zbIYYsx5Gl","CqqaDAgJHQ",
+"RACujgf8rI","Pb1pagIYvE","OHaBzLbRTH","fFDrJ9XyT9","jSjS3M3zXL","QssNCK4GS8","fcwDaQbxXc","BpYhV0PktI","0ao3lhe9IA","KsjRKoGu6x",
+"QWxoTlj07Q","MojnP5ZaEz","0YAGHDQimp","16lHc07n1c","Nxx9VmX2GE","kB5nPHRxd8","LDk6f5Mg9r","WDVWJtjQxs","5IhmGGWqqX","JkzUnYjB9t",
+"n1pmOKr8ys","qUJMdYOfrY","RACuj4dEz6","POUYSKsjRK","Yw2oUjS1aj","euZA5NhXdu","Cfgr345cIH","aDGtSQ6Lix","4QMc9pWiOs","J2mQih1zcH",
+"9iGoTprNT6","yEfy9Ss0Zu","G1RhSI7p2a","8FmFH5IhmG","rhl0JfmIK1","uQIczF6PT2","faHirSmGzv","0BmCytlILt","MmKGJe6e4z","PYBf4No0Qb",
+"2Yz7EUvlv4","hSSvQs7Mxk","S77LHQClRL","HzZT8wDajX","48cHLrhl0J","fFDrJGv3Fq","dmoS72Yz7E","ciuWzZuDtD","piJSktjQxs","VjCZqdpe1v",
+"fcJOyFcWrW","ciuWzD6rBy","uAWypblLA9","cShY2i3pyd","Uvlv40BmCy","9iGoThe9IA","ZzJHWCfgr3","Oz8yZJkzUn","5iGN5CK5W7","VLTy6QbxXc",
+"XflUqI7p2a","QYxC0OHaBz","8U2nUfcwDa","taOXK24ARF","Dz1R3kZANm","yEfy9AgJHQ","aez9yWDVWJ","QbxXcFjHXR","iqv4kGv3Fq","fqypyxciqp",
+"dmoS7pWiOs","rz7UtPOUYS","CxVEfVerEA","XyPZNv8yFN","l83UdQworu","2Yz7EzFgtB","MGlTFO3iyQ","tjQxs0PktI","Dz1R3o8Uyd","2DREsQClRL",
+"9eoRcVNCPd","o8UydsuY4x","WDVWJuAWyp","tlILtwiHrZ","xXTI4vkCHH","VIlwPJ2mQi","RpBQmStlDJ","zHF1qs93Ml","zqH0WVerEA","1v5hHy94nw",
+"3weIFtlILt","Z4I1vcmXIX","S77LH8cVD3","TwanoKZamH","rhl0JKZamH","HfyNQwiHrZ","okgRiv2eC3","sqVrf3weIF","uoStwZuDtD","K4GS8C2Irc",
+"IBe8kZzJHW","AOgEezHF1q","2ZHdkcQOnv","AIYUuSs0Zu","uPX7G7X3uy","Yf2Ect59lR","zFgtBiKqhr","gf8rIJkzUn","FxX9qzHF1q","prNT60h1b1",
+"gjUTuaL6AJ","rz7UtTXQ0Z","uQIcziwzGk","QChxse6e4z","SjskQZv7z0","JIqXiEoToP","oVQp664s8N","S77LHx3LDe","C2Irc8FmFH","suY4xpv0i7",
+"vkCHHgIYvE","lViBvdjsrv","4dEz6FFDui","yofH3Cfgr3","fLNg8ru4UG","oQ87ruoStw","QbxXcSbRYy","yvOMIVIlwP","UmaEv1v5hH","OHaBzZ4I1v",
+"Oz8yZ8U2nU","LbRTHWPmlx","RmDcrfqypy","5nmWvGv3Fq","ThjNnOxWIH","SjskQZzJHW","yluBxQChxs","uJScXVprf2","IKxdLQssNC","8U2nUxciqp",
+"Oz8yZtAOsr","Oz8yZFxX9q","SbRYyB3qem","FxX9qcmXIX","MGlTFLewvM","SWfouUl4a1","tjQxs8cVD3","9y4lwe6e4z","AgJHQlpF6W","tl72W8FmFH",
+"FNYIM16lHc","jiVBPjSjS3","dQ586m4bxU","VNCPdW7cTs","OHaBzdmoS7","oQ87ryvOMI","TXQ0ZnnP8o","tAOsrAIYUu","fqypyguMb8","5IhmGThjNn",
+"lViBvatef2","faHirv2eC3","hUTw7OxWIH","gdQsS9iGoT","tlILto8Uyd","C2Irc7hyVv","4W0TlyToGW","pFrrlzz4ZU","G1RhSRsQUq","Z4I1vUlU3M",
+"suY4xtl72W","WmadAlXFOB","Kr8ysblLA9","GXdoHmX2GE","n1pmOMezSW","jtn0XBGaQY","Y1mC0nnP8o","POUYSqaofN","2hEEUKr8ys","Ss0ZuVIlwP",
+"t59lRpv0i7","CIShG8cVD3","No0Qbv8yFN","TCgPpYh1hF","aDGtS0Wr5y","Mm8siMmKGJ","WreyPLDk6f","x3LDeYjB9t","1LB1LJXljW","LDk6ffLNg8",
+"ReKEWIn3NS","Q6Lix2ZHdk","VIlwPqUJMd","StlDJWaim6","0MR5XWaim6","VerEAv8yFN","JJs5mMGlTF","WPmlx0PktI","VerEAG1RhS","FNYIMCNHmv",
+"CxVEf29QAz","4QMc9VNCPd","CNHmvatef2","5NammtuDyS","BpYhVv1Hln","JkzUn2Yz7E","RACujF6PT2","VIlwPGv3Fq","dQ586uvf7A","ECMvUxciqp",
+"QYxC04dEz6","J2mQi45cIH","TXQ0Zfqypy","OxWIHmz8gx","AOgEeVBjhz","CdyBVzz4ZU","uPX7Gaez9y","AXpwETCgPp","G1RhSzmLYD","2Yz7ESmGzv",
+"uQIczni2v1","iqv4kpv0i7","lm0pDRkQke","MK07YZJTXH","MezSWgf8rI","SmGzvkB5nP","kZANmpmeCd","yluBxFjHXR","kB5nPlm0pD","iqv4k5drc6",
+"8cVD3RpBQm","WaWsvjS1aj","fqypySmGzv","ZzJHWiqv4k","gtCA5n8pJ9","ReKEWJ2mQi","16lHciKqhr","GXdoH9y4lw","dhSuHBCxeC","Ss0Zu29QAz",
+"VLTy68xEKz","POUYSs7Mxk","lkMUA0ao3l","QnJ1SZuDtD","SmGzvFLsph","ix74rFGzgp","45cIHRxrsm","VerEAOHaBz","dhSuHFxX9q","ydG8UblLA9",
+"uAWypWPmlx","EdBKcfcwDa","ulk41lXFOB","fLNg8QYxC0","MGlTFM3zXL","ulk41HP433","lkMUAZ4I1v","HP433pvgjS","4dEz6QssNC","wiHrZ9iGoT",
+"ZUnqt0Wr5y","CqqaDZUnqt","7fKYUuTacx","ZzJHWW7cTs","lpF6W0Wr5y","0ao3lZhwG1","he9IAfcwDa","lpF6Wix74r","BGaQYuZPqg","mz8gxtvdkD",
+"Yf2EcjiVBP","3weIF55rfB","zbIYYQChxs","6AFT0StlDJ","QnJ1SIKxdL","Yw2oUFnPFB","cQOnvdjsrv","iqv4knnP8o","ogLgcsqVrf","0PktIuZPqg",
+"Cfgr3iqv4k","h1zcHWPmlx","48cHL580YD","Yh1hFDG4sT","uTacxWmadA","aDGtS9XyT9","NAFuwAIYUu","AIYUufmIK1","5nmWvCp3mZ","XyPZN7fsYM",
+"gtCA5zbIYY","RxrsmB3qem","ZzJHWmz8gx","NhXdufmIK1","x3LDeLewvM","NhXduuTacx","lViBvrhl0J","W7cTsFjHXR","tuDySl83Ud","2TRI7zz4ZU",
+"SjskQXflUq","cL0aEkZANm","zbIYYFcWrW","MojnPuTacx","YjB9tCdyBV","FGzgp7X3uy","zQt6Q0YAGH","SmGzvBbwgA","hYBCK16lHc","CK5W7yToGW",
+"Q6LixpiJSk","iKqhryluBx","JKWYRtAOsr","jfREuCqqaD","oVQp6XyPZN","BbwgA9rlg9","uupzkatef2","MezSWuJScX","4QMc9hE1Ql","jSjS3WaWsv",
+"MGlTF8RCUA","XflUqtAOsr","6AFT0HzZT8","8RCUAlViBv","Oz8yZKASQ8","24ARFFPfSE","xReectl72W","7lUXZWaim6","b29RJxXTI4","Y1mC0BpYhV",
+"8TxD75Mg9r","qQxHPSjskQ","lCMxyMmKGJ","QworuYh1hF","UlU3M7hyVv","JXljWWPmlx","S2Dfu55rfB","zFgtBFhtgl","OUqFMsoy9t","L7cGcP6bcg",
+"Yw2oUNhXdu","RkQkehi5X7","LbRTHI7p2a","M6qcG5VZjS","xReecHlUbF","M6qcGWaWsv","SWfou2Yz7E","LewvMwiHrZ","BFkb8Ta8f6","gf8rIMGlTF",
+"AgJHQMaJQs","guMb8aDGtS","gdQsSUl4a1","DLhzMGv3Fq","CdyBVM3zXL","EOE1oDz1R3","uN6r30BmCy","QClRLUvlv4","iwzGkTwano","dmoS7zmLYD",
+"uupzk2ZHdk","9rlg9FjHXR","v2eC3Vprf2","lj07Q7ku1p","s93MlIn3NS","QbxXcfmIK1","45cIHdQ586","pv0i7NAFuw","n1pmOMojnP","FFDuiLewvM",
+"y94nwCxVEf","gIYvEB3qem","MGlTFs93Ml","hE1Qlt59lR","VerEAhUTw7","fcJOyQ6hMC","OUYuFni2v1","BFkb8JRJQB","gjUTuGXdoH","8cVD3hUTw7",
+"0MR5XsqVrf","TwanociuWz","uJScXZJTXH","Vprf2guMb8","64s8Nxciqp","ydG8URzaZA","djsrvWDVWJ","BFkb8Dz1R3","lsQGoMK07Y","7Ow5CQ6Lix",
+"JIqXiRxrsm","8U2nUfaHir","tjQxsix74r","CxVEfuN6r3","UlU3MuoStw","P6bcg4QMc9","MK07YECMvU","SWfouzz4ZU","dhSuH9eoRc","guMb8zQt6Q",
+"s4786tl72W","ZuDtDLDk6f","RkQkePOUYS","euZA5aFFss","TCgPpMGlTF","vOqCEAXpwE","Yh1hFxReec","uQIczStlDJ","Nxx9VF6PT2","GSQwjNhXdu",
+"qUJMdI7p2a","ogLgcFcWrW","hSSvQQssNC","14FLR8RCUA","Nxx9VcmXIX","EdBKcOUYuF","NAFuwL7cGc","azIWp4QMc9","uQIczK20wK","ru4UGv8yFN",
+"ni2v129QAz","ksJbyuPX7G","9y4lwJJs5m","9iGoTdhSuH","GrDg7tuDyS","jS1ajZUnqt","EOE1oOUYuF","5nmWvgIYvE","9GXkXFwEJz","oVQp67fsYM",
+"oVQp6gtCA5","Oz8yZMmsIo","55rfBmz8gx","tlILtNAFuw","aDGtS14FLR","CIShGBCxeC","Zv7z0VIlwP","sx5GlqQxHP","Y1mC0t98iW","G1RhSru4UG",
+"FwEJzNAFuw","AgJHQ3weIF","gdQsS5VZjS","SWfouLewvM","ogLgc9GXkX","W3VFHaDGtS","1j5L80Wr5y","uTacxlweGy","2TRI7Fhtgl","0h1b1uAWyp",
+"fcwDaHfyNQ","7X3uyHRxd8","07n1ciqv4k","WreyPjeskS","8xEKzFhtgl","Z4I1vVprf2","9eoRcDz1R3","ZJTXH9eoRc","5NammVLTy6","VIlwPWaWsv",
+"ogLgcv1Hln","7fKYUQworu","ni2v12ZHdk","Pb1pafcJOy","9y4lw0YAGH","uN6r32ZHdk","I7p2aRpBQm","KASQ8Twano","LDk6fHRxd8","HP433lViBv",
+"zFgtBTa8f6","OUqFMy94nw","FFDuiMm8si","ZzJHWNhXdu","ZJTXHK4GS8","FGzgpMGlTF","b29RJuupzk","WDVWJd7vjM","zHF1qfcwDa","gjUTuuJScX",
+"C2IrcfLNg8","ZzJHWXflUq","Mkgy8m4bxU","yvOMIVerEA","xXTI40ao3l","jfREuIBe8k","3weIFnlaBy","cmXIXjS1aj","7ku1p8U2nU","ksJbyWreyP",
+"b29RJZuDtD","uPX7GBpYhV","ZUnqtSjskQ","MezSWlpF6W","QssNC1LB1L","Y1mC0B3qem","HfyNQiB08l","JXljWpWiOs","Cp3mZeuZA5","dhSuHzbIYY",
+"IBe8kAOgEe","qaofNBGaQY","prNT6vLsmS","DG4sT3otm6","DG4sTPOUYS","xReecKZamH","gf8rInlaBy","Waim6EoToP","iKqhr5Namm","GXdoHdhSuH",
+"F6PT2NhXdu","AIYUu5ZaEz","7lUXZMmKGJ","okgRimX2GE","XyPZNWmadA","jSjS3QChxs","iB08lUvlv4","Ta8f6fmIK1","P6bcg7fsYM","aFFssGXdoH",
+"L7cGcD6rBy","BpYhVjS1aj","t98iW0PktI","ReKEWprNT6","jfREu5Namm","FnPFBVNCPd","d85a9ix74r","9rlg9lkMUA","YjB9tyToGW","9y4lwNAFuw",
+"AkKTkvLsmS","nnP8oChuy3","qaofN6AFT0","0MR5XazIWp","RsQUqCNHmv","jtn0X5VZjS","sx5GlL7cGc","2NslmBFkb8","QssNCrz7Ut","FjHXRfaHir",
+"2ZHdks93Ml","4QMc9iqv4k","WPmlxEOE1o","ZzJHWM3zXL","SmGzvWaim6","SWfou7ku1p","O3iyQZv7z0","qQxHP0Wr5y","jzUqRBGaQY","DG4sTQYxC0",
+"BFkb8StlDJ","djsrvKZamH","lsQGopFrrl","i3pydzbIYY","euZA5Gv3Fq","gtCA5Yw2oU","aez9ysoy9t","5Mg9rpWiOs","zmLYDs93Ml","lj07QqUJMd",
+"uZPqgmz8gx","iB08l9iGoT","lH1ktJ2mQi","5IhmGBpYhV","AXpwEDcpWB","m4bxU8hJdt","4dEz6yluBx","IjTwPW7cTs","C2IrcjfREu","wDajX8TxD7",
+"64s8NNOHsz","0PktIjSjS3","zqH0WeuZA5","uPX7Gxciqp","uJScXi3pyd","bgJAzuQIcz","8FmFHZUnqt","fcJOynnP8o","S77LHZv7z0","ru4UGciuWz",
+"ZuDtD64s8N","Nxx9Vsoy9t","FPfSEjfREu","NcICAAmdQd","fcwDa7fKYU","L7cGcjtn0X","lweGyRmDcr","o8UydRmDcr","LewvM5ZaEz","fLNg8W3VFH",
+"NcICAuTacx","KZamHKZamH","TwanoEdBKc","VBjhzzQt6Q","M3zXLatef2","fqypylViBv","U3yw5b29RJ","euZA5Yf2Ec","jS1ajVNCPd","WMiS3atef2",
+"xciqpOUYuF","WreyPJRJQB","bZLvScmXIX","e6e4zprNT6","6AFT0Gv3Fq","TXQ0ZTXQ0Z","mz8gxFcWrW","ru4UGyofH3","uoStwt98iW","jS1aj55rfB",
+"jeskSWaWsv","jS1aj4W0Tl","POUYS1v5hH","ulk41Oz8yZ","sqVrfCxVEf","45cIHv8yFN","lm0pDwDajX","BCxeCGv3Fq","xXTI4RBhp0","Uvlv4jfREu",
+"8cVD3lH1kt","P6bcg1LB1L","pv0i7CNHmv","Ta8f6K4GS8","64s8NaFFss","tl72WMK07Y","JkzUn1LB1L","gIYvEGXdoH","AgJHQ618Di","AkKTk8FmFH",
+"OxWIHuJScX","07n1cs7Mxk","RACuj9y4lw","Yh1hFpvgjS","HP4339GXkX","FjHXRAgJHQ","cShY2Vprf2","Waim67Ow5C","MezSWX6Pin","uJScXJ2mQi",
+"aFFss55rfB","WreyPksJby","G1RhSzQt6Q","NhXduS77LH","n8pJ9s93Ml","8RCUApAhR1","5ZaEzVBjhz","KsjRKt98iW","Q6hMCy94nw","CNHmvVBjhz",
+"7ku1ps4786","bZLvSsqVrf","G1RhSNcICA","2ZHdkFGzgp","2NslmnnP8o","5iGN5JIqXi","dhSuHuAWyp","1j5L8Zv7z0","2DREslH1kt","nFqik2DREs",
+"pAhR1djsrv","TCgPp4W0Tl","soy9thUTw7","n8pJ90MR5X","mX2GElkMUA","CxVEfulk41","TCgPpZUnqt","VNCPdrhl0J","dmoS7oVQp6","QClRLqaofN",
+"K4GS8s7Mxk","VBjhzv1Hln","y94nwLbRTH","Cp3mZP6bcg","FcWrWC2Irc","h1zcHB3qem","RsQUqSmGzv","JIqXilCMxy","Nxx9VNhXdu","HP433POUYS",
+"qaofNLbRTH","J2mQiPOUYS","Kr8ysZhwG1","WaWsv2hEEU","taOXKJkzUn","1v5hHuZPqg","uvf7ANAFuw","SjskQ5drc6","FGzgps7Mxk","yluBxcmXIX",
+"X6PinAmdQd","K20wKMm8si","gf8rIzFgtB","bZLvSfLNg8","5drc6AkKTk","Kr8ys8xEKz","StlDJtjQxs","uJScX9rlg9","iB08leuZA5","uZPqg55rfB",
+"d7vjMeuZA5","hi5X7blLA9","nFqikzmLYD","KZamHlsQGo","7fsYMVprf2","ciuWzUmaEv","07n1ca00b5","QssNClkMUA","aL6AJuN6r3","hUTw7ix74r",
+"8U2nUx3LDe","rhl0JgdQsS","RmDcrzqH0W","M6qcG9XyT9","FjHXRCqqaD","MojnPgjUTu","Q6hMC9eoRc","qQxHPuZPqg","iKqhrFNYIM","1v5hHn8pJ9",
+"k85AeWaim6","GrDg7Yw2oU","uvf7AFLsph","k85Aesoy9t","VjCZqhe9IA","8hJdt8cVD3","FPfSEfLNg8","Zv7z0Ul4a1","uZPqgtvdkD","blLA90h1b1",
+"VerEAvLsmS","ru4UG8TxD7","FPfSEuPX7G","7fKYUzmLYD","In3NS2TRI7","ECMvUWmadA","FGzgplViBv","lH1ktUvlv4","vOqCEuJScX","Mm8simz8gx",
+"okgRiazIWp","Yh1hFNhXdu","zQt6QYOfrY","No0QbNo0Qb","WDVWJS2Dfu","i3pyd29QAz","MezSWgdQsS","2NslmpmeCd","vkCHHn8pJ9","faHirZJTXH",
+"M3zXLpFrrl","uLtKsWDVWJ","faHirxReec","Yh1hFv2eC3","2Yz7EQClRL","5IhmGkZANm","fcJOyfcJOy","SmGzvX6Pin","9rlg9QbxXc","RBhp0zQt6Q",
+"gjUTu9iGoT","cShY2G1RhS","vLsmSe6e4z","AgJHQlj07Q","wDajXAXpwE","dhSuHAmdQd","0ao3llH1kt","TCgPpSs0Zu","Dz1R3MojnP","o8UydokgRi",
+"DLhzMgtCA5","zz4ZUn8pJ9","QnJ1SoQ87r","vOqCEd7vjM","gjUTuVNCPd","Gv3FqSbRYy","uLtKscL0aE","5VZjScQOnv","lViBvxXTI4","0ao3l580YD",
+"Nxx9Vk85Ae","8U2nUMojnP","14FLRru4UG","iqv4koQ87r","Nxx9V1LB1L","s4786vOqCE","a00b50Kyfs","OUYuFRxrsm","07n1cuZPqg","0PktIrhl0J",
+"prNT6okgRi","gIYvEuupzk","CNHmvFcWrW","HlUbFUl4a1","hUTw7fcwDa","580YDcmXIX","YjB9tkZANm","prNT60ao3l","fLNg8CqqaD","Kr8ysUmaEv",
+"rz7Ut9GXkX","RpBQmzqH0W","lkMUAMojnP","xReecCK5W7","Dz1R3CIShG","xReecuN6r3","gdQsSHfyNQ","zbIYYO3iyQ","QClRLMaJQs","atef2oQ87r",
+"Yw2oUd85a9","8cVD3OUYuF","xReechi5X7","zmLYDBbwgA","OHaBzRBhp0","5Mg9rRBhp0","9iGoTzmLYD","7hyVvlpF6W","48cHLCIShG","VNCPdfLNg8",
+"5iGN5lViBv","ix74rkB5nP","o8UydoVQp6","DG4sTv2eC3","kZANmlkMUA","5Mg9rKZamH","y94nwbgJAz","zHF1qPOUYS","2DREse6e4z","7fKYUlViBv",
+"gjUTuyEfy9","IRh487Ow5C","uN6r3brhlQ","K20wKKsjRK","xciqpjzUqR","uupzkMojnP","2Yz7EblLA9","pT8wuRACuj","POUYSt98iW","29QAz45cIH",
+"ix74rVNCPd","v8yFNXyPZN","vkCHHQ6Lix","UmaEvogLgc","ZJTXHChuy3","pAhR1QnJ1S","DcpWBNOHsz","MojnP8xEKz","pT8wuFFDui","Rxrsmhe9IA",
+"1LB1LWDVWJ","azIWpni2v1","X6PinAkKTk","2DREsGWqqX","fFDrJ9y4lw","aez9ypv0i7","WDVWJdmoS7","OHaBz8FmFH","nlaBy29QAz","WreyPcL0aE",
+"QnJ1SFxX9q","9eoRc5iGN5","zbIYYVjCZq","64s8No8Uyd","uoStwyEfy9","CxVEfy94nw","KASQ8gtCA5","tl72WDz1R3","dQ586ni2v1","rhl0JKr8ys",
+"2hEEUJRJQB","e6e4zyEfy9","lXFOBUvlv4","K20wKVNCPd","9XyT9nnP8o","NhXduksJby","0MR5Xlm0pD","O3iyQ45cIH","lkMUA9iGoT","KZamHlXFOB",
+"jfREu1v5hH","Uvlv4StlDJ","soy9tgtCA5","GrDg78cVD3","WMiS3OxWIH","aFFssUl4a1","yEfy9DQimp","HP433zqH0W","lsQGolsQGo","RzaZAEOE1o",
+"VNCPdGrDg7","hi5X7Chuy3","fcwDaM3zXL","VNCPdbrhlQ","MGlTFe6e4z","VerEAIjTwP","cmXIXksJby","W3VFH2Nslm","7fKYUlweGy","jS1ajFnPFB",
+"HP433RBhp0","CqqaDNAFuw","8TxD7FFDui","7Ow5CyEfy9","WreyPhE1Ql","yEfy9VBjhz","GrDg7rz7Ut","zz4ZUbZLvS","GrDg7JKWYR","FNYIM5Drn0",
+"s4786WreyP","WaWsv29QAz","GSQwjMK07Y","Nxx9V2DREs","580YD580YD","ZhwG1xReec","jtn0XCdyBV","LewvMNcICA","2hEEURzaZA","2hEEUzFgtB",
+"FjHXReuZA5","3otm6uupzk","BFkb816lHc","x3LDeEoToP","Chuy3gdQsS","dQ586YjB9t","mz8gxCfgr3","mz8gxciuWz","i7WMQsoy9t","Yh1hFFcWrW",
+"xReecPb1pa","48cHLLewvM","atef2Ss0Zu","KZamHs93Ml","IRh4845cIH","rhl0JTXQ0Z","6AFT0WMiS3","pFrrlEdBKc","vkCHHWaim6","ksJbycmXIX",
+"tuDySY1mC0","TCgPpM6qcG","ECMvUyofH3","P6bcgulk41","CNHmvJKWYR","VjCZq5VZjS","OxWIH14FLR","7Ow5CqUJMd","LDk6fqQxHP","pAhR1VIlwP",
+"dpe1vAXpwE","0ao3lRmDcr","0h1b1IRh48","HfyNQGrDg7","fqypyKZamH","fcJOyI7p2a","KsjRKsx5Gl","OUYuFSbRYy","dpe1vHP433","AmdQdnlaBy",
+"JKWYRyvOMI","vOqCES2Dfu","QbxXclXFOB","bZLvSU3yw5","FFDuioVQp6","ZhwG124ARF","RxrsmFPfSE","IKxdL07n1c","hUTw7lH1kt","e6e4zW7cTs",
+"zbIYYlm0pD","ix74rnFqik","yluBxbgJAz","5iGN5IBe8k","suY4xo8Uyd","uupzkyofH3","POUYSECMvU","MaJQsuPX7G","aDGtShE1Ql","dhSuHOUYuF",
+"tl72WxXTI4","IjTwP0PktI","1v5hHksJby","tl72WiKqhr","9XyT9B3qem","MK07YydG8U","U3yw5gf8rI","bZLvSuvf7A","14FLRRxrsm","TXQ0ZFhtgl",
+"Yh1hFZzJHW","VNCPd7ku1p","1LB1LZv7z0","POUYSo8Uyd","0h1b1tvdkD","VNCPdfmIK1","K4GS8cQOnv","xciqptjQxs","RzaZAWMiS3","QWxoTtl72W",
+"JkzUnZ4I1v","VNCPdAmdQd","K4GS8a00b5","faHiruN6r3","lpF6WBpYhV","ZuDtD16lHc","FjHXRFGzgp","5Drn0KASQ8","EoToPgdQsS","zFgtBmz8gx",
+"5ZaEzDz1R3","ZUnqtRzaZA","PYBf4uZPqg","FwEJz9y4lw","pvgjS8xEKz","m4bxUFnPFB","xXTI48hJdt","In3NSzFgtB","VjCZqd85a9","8hJdtyofH3",
+"24ARFSs0Zu","ZzJHWKASQ8","6AFT0tuDyS","W3VFHNcICA","MGlTFMGlTF","580YDqQxHP","2Yz7EIRh48","AkKTkuN6r3","brhlQtaOXK","WaWsvCIShG",
+"n1pmOjS1aj","0Wr5yyluBx","1j5L8O3iyQ","HfyNQ7lUXZ","SWfougjUTu","JRJQBZJTXH","okgRiYjB9t","S77LHogLgc","9iGoTVerEA","t59lRQnJ1S",
+"6AFT05nmWv","ni2v1J2mQi","AgJHQcmXIX","cShY2tvdkD","TXQ0Zt98iW","7fKYUpvgjS","BFkb8mX2GE","Yf2Ec24ARF","EoToPbZLvS","yEfy945cIH",
+"UlU3MMkgy8","5iGN55drc6","M3zXL5Drn0","5VZjSru4UG","14FLRjS1aj","K4GS8WreyP","brhlQeuZA5","ni2v1M6qcG","soy9tk85Ae","gtCA5jSjS3",
+"s7MxkJ2mQi","ThjNntAOsr","cL0aEpAhR1","tl72WRkQke","v2eC3QClRL","P6bcglCMxy","QYxC0Q6Lix","djsrvIBe8k","TCgPp4QMc9","5Mg9riKqhr",
+"lH1ktgdQsS","FxX9q4QMc9","2Yz7E1v5hH","okgRis93Ml","lpF6W45cIH","5nmWvoGu6x","6q6L9Q6hMC","fLNg8nFqik","ZuDtD45cIH","k85AelH1kt",
+"P6bcgjtn0X","8U2nU7fsYM","tvdkD9GXkX","blLA9ksJby","vOqCE7hyVv","iwzGkogLgc","CqqaDd85a9","aDGtSblLA9","nFqikPOUYS","ThjNnBCxeC",
+"RACujvLsmS","9GXkXJRJQB","oVQp6iB08l","xReecI7p2a","qaofNs7Mxk","SbRYyGWqqX","Chuy3Vprf2","FwEJzdpe1v","soy9tpv0i7","BGaQY9GXkX",
+"ciuWzgtCA5","580YDdjsrv","dhSuHHRxd8","bgJAzzY1GY","FjHXR4dEz6","HRxd8AgJHQ","iwzGkhi5X7","VBjhzjeskS","OxWIHbgJAz","uZPqgzY1GY",
+"8cVD3YjB9t","pAhR15VZjS","gjUTuni2v1","zFgtBGWqqX","pAhR1s93Ml","BFkb8wDajX","kB5nP9XyT9","zFgtBFNYIM","NcICA1v5hH","LewvMUvlv4",
+"AOgEeNo0Qb","0PktINOHsz","prNT6taOXK","zbIYYlViBv","guMb8RzaZA","kZANm14FLR","9GXkX5VZjS","OHaBzGrDg7","EoToP0Wr5y","aL6AJdjsrv",
+"MojnPfaHir","Ss0Zux3LDe","cQOnvjSjS3","0ao3lCxVEf","fqypyfFDrJ","IRh48dQ586","8xEKzS77LH","dQ5862hEEU","dQ586lsQGo","4QMc9sx5Gl",
+"DcpWBzz4ZU","gjUTuIBe8k","SbRYypvgjS","uTacxgf8rI","lm0pDWPmlx","Oz8yZgf8rI","0ao3l9y4lw","XyPZNcL0aE","kZANmYOfrY","Yf2EcF6PT2",
+"No0QbokgRi","B3qems4786","blLA97lUXZ","MK07YOxWIH","0Wr5yd7vjM","5IhmGJRJQB","MmKGJ9XyT9","JkzUnW7cTs","pmeCdUlU3M","lCMxyulk41",
+"0KyfsXyPZN","VjCZqWaim6","Ta8f6tAOsr","64s8NSWfou","7Ow5Ctl72W","Cp3mZK4GS8","PYBf4WMiS3","VjCZqd7vjM","EOE1o0YAGH","rKDLJru4UG",
+"JXljWNcICA","aL6AJyvOMI","jfREue6e4z","TCgPpdjsrv","GrDg7aL6AJ","KZamHWMiS3","tjQxs8RCUA","5drc6oGu6x","64s8Njtn0X","D6rByLbRTH",
+"CdyBVJkzUn","lXFOB5Mg9r","LewvMoGu6x","zQt6QpmeCd","2NslmMmKGJ","JJs5mpFrrl","qaofN9GXkX","MaJQs1j5L8","CxVEf6q6L9","Kr8ysaDGtS",
+"Ul4a1t59lR","MaJQsksJby","VLTy6OUqFM","mX2GElpF6W","VjCZqBGaQY","Cp3mZ5IhmG","DLhzMVprf2","0MR5XpFrrl","JXljWVLTy6","uJScXThjNn",
+"BGaQYStlDJ","FnPFBRpBQm","fcwDaOUYuF","C2IrcQWxoT","iqv4kMojnP","uupzklXFOB","azIWpdQ586","MezSWF6PT2","MmKGJwiHrZ","GWqqXfqypy",
+"sx5GlJRJQB","0YAGHUmaEv","ru4UGX6Pin","ZUnqtXflUq","Chuy3FnPFB","dQ586jeskS","BFkb8JJs5m","cL0aEzz4ZU","7Ow5CMmsIo","QssNCkZANm",
+"618Div8yFN","pT8wuCqqaD","WmadAuoStw","O3iyQ5drc6","tl72W14FLR","45cIHNhXdu","wiHrZxXTI4","xciqptuDyS","45cIH8hJdt","FPfSElpF6W",
+"8xEKzmz8gx","FVMxoFVMxo","RkQkeCdyBV","8xEKzuTacx","tl72W3weIF","LbRTHDcpWB","qUJMdD6rBy","HP433IRh48","fcJOyFxX9q","KASQ8pAhR1",
+"oGu6xxciqp","U3yw5WDVWJ","SWfouHP433","YjB9ttl72W","y94nw2ZHdk","FjHXR4QMc9","Ul4a1qUJMd","ni2v1lpF6W","gdQsSYw2oU","piJSkatef2",
+"qUJMdydG8U","U3yw57lUXZ","I7p2aTCgPp","MojnPYjB9t","jfREutl72W","9eoRcCfgr3","vkCHHZ4I1v","M3zXLzmLYD","euZA5FxX9q","4W0Tlh1zcH",
+"55rfBZv7z0","QClRLlj07Q","hSSvQnlaBy","xReecmz8gx","euZA5BGaQY","7hyVvMojnP","he9IA7ku1p","14FLRU3yw5","v1Hln2Yz7E","QYxC0VLTy6",
+"ZzJHWGWqqX","5drc6pAhR1","yToGWd7vjM","zmLYD9rlg9","Yf2EcRkQke","KsjRKJKWYR","MGlTF1LB1L","GXdoHiwzGk","SjskQ8cVD3","OUYuF8U2nU",
+"uZPqg0ao3l","ydG8UuJScX","HRxd8RACuj","In3NSeuZA5","gjUTuoQ87r","ru4UGfcJOy","5nmWvMK07Y","2DREscShY2","he9IAaDGtS","t98iWlpF6W",
+"NOHsz2Yz7E","pT8wu9iGoT","Waim614FLR","v2eC3MmsIo","0Wr5yPb1pa","1v5hH5iGN5","DcpWBi7WMQ","sqVrfdjsrv","ECMvU29QAz","d7vjM7ku1p",
+"GrDg7d7vjM","SmGzvtaOXK","tl72WeuZA5","M6qcGokgRi","K4GS8v2eC3","jeskSUlU3M","hi5X7GXdoH","7ku1plkMUA","Uvlv4ThjNn","i3pyd0Kyfs",
+"16lHcY1mC0","pT8wuNOHsz","7fKYUXflUq","JKWYRRpBQm","JkzUncQOnv","618DiQssNC","KZamH0h1b1","QClRLzFgtB","tvdkDfaHir","cmXIXyofH3",
+"DG4sTfLNg8","hE1Qld85a9","FVMxoaFFss","mX2GE5Mg9r","tvdkDi7WMQ","uPX7GBFkb8","lXFOBuPX7G","4W0Tl9XyT9","Yf2EcfcJOy","dmoS7zFgtB",
+"WreyPoVQp6","G1RhSHlUbF","tvdkDEdBKc","rhl0JAgJHQ","MmsIoYOfrY","GrDg7yEfy9","nnP8oDLhzM","v1Hln7lUXZ","dmoS7Pb1pa","8hJdtKZamH",
+"ulk4164s8N","CK5W7tuDyS","he9IAI7p2a","1LB1LBGaQY","QworuVLTy6","XyPZN48cHL","GrDg7v1Hln","tAOsrsx5Gl","7Ow5C0MR5X","MGlTFlm0pD",
+"J2mQibrhlQ","FwEJzDz1R3","5iGN5faHir","ZuDtDuN6r3","0MR5Xru4UG","XyPZNe6e4z","cShY224ARF","4QMc9zmLYD","TCgPpNxx9V","tvdkDuoStw",
+"RzaZABGaQY","AkKTkOUqFM","fqypyVerEA","vLsmSCqqaD","VIlwPJXljW","FjHXRHRxd8","iKqhr2Yz7E","djsrvqaofN","8RCUA0Wr5y","jeskSs4786",
+"ECMvUFcWrW","uN6r3cL0aE","gtCA5X6Pin","NAFuwRpBQm","W7cTshSSvQ","0Wr5y7Ow5C","Kr8ysIn3NS","M3zXLogLgc","Yf2Ecd85a9","zY1GYHlUbF",
+"0YAGHyvOMI","WPmlxzqH0W","IKxdLpmeCd","hSSvQRBhp0","6q6L9Yh1hF","n8pJ9BFkb8","prNT62ZHdk","0BmCyOUYuF","48cHL618Di","d85a9rKDLJ",
+"l83UdY1mC0","uupzkbrhlQ","piJSkSs0Zu","djsrv5Drn0","KZamHF6PT2","iwzGkCIShG","WmadAaL6AJ","faHirEOE1o","5NammM3zXL","FVMxoP6bcg",
+"7fKYUS2Dfu","OUYuFUmaEv","5NammLDk6f","uLtKsOUYuF","2Yz7EQssNC","2Yz7EjfREu","4dEz6FwEJz","ReKEWZhwG1","5ZaEzeuZA5","euZA5vkCHH",
+"OxWIHksJby","9y4lwuvf7A","pv0i7okgRi","tAOsrfcwDa","taOXKWPmlx","5Drn0nnP8o","oGu6x8hJdt","uTacxiwzGk","v1Hlnzz4ZU","6q6L9yToGW",
+"hi5X7VIlwP","dQ586BCxeC","QChxsbgJAz","FLsphuQIcz","HzZT83otm6","29QAzWaim6","jiVBPGv3Fq","yToGW5Namm","Nxx9VIRh48","wDajX0Wr5y",
+"tvdkDgdQsS","tlILtJJs5m","n1pmOtvdkD","gf8rIDLhzM","KASQ8QbxXc","0h1b1MGlTF","BCxeC7hyVv","CIShGni2v1","2NslmZv7z0","bZLvSUlU3M",
+"ZUnqtgf8rI","WMiS3suY4x","LDk6fZv7z0","ThjNnzFgtB","LDk6fQClRL","bZLvS0h1b1","pT8wuMezSW","aez9yOHaBz","VIlwPuoStw","QbxXcZJTXH",
+"jfREuhE1Ql","yofH30Wr5y","gdQsSWaim6","BFkb8DG4sT","s7MxkpvgjS","Yw2oUOUqFM","SmGzvRxrsm","sqVrfhUTw7","WreyP07n1c","xXTI49eoRc",
+"FLsphzQt6Q","FhtglFhtgl","6AFT0QssNC","IjTwPFnPFB","iKqhruoStw","2hEEUNhXdu","55rfBUvlv4","RkQkeiwzGk","fFDrJIjTwP","pvgjSpvgjS",
+"8RCUAa00b5","LDk6fWmadA","MmsIoi3pyd","zY1GYKASQ8","F6PT2v2eC3","zY1GYb29RJ","vOqCECdyBV","d85a9HzZT8","cShY2FFDui","RkQkeb29RJ",
+"JXljW5Namm","piJSkFhtgl","s47869GXkX","CNHmv8cVD3","gIYvEDQimp","0PktIStlDJ","n8pJ9lXFOB","O3iyQYjB9t","SjskQjtn0X","tlILt8TxD7",
+"VerEAvOqCE","ru4UGWreyP","uAWypB3qem","618DiOUqFM","QssNCIKxdL","qQxHPi7WMQ","iqv4kuZPqg","oGu6x4W0Tl","JIqXiuZPqg","QssNCpAhR1",
+"rz7UtiKqhr","Q6LixWaWsv","oQ87rs4786","In3NSQ6hMC","RACujyToGW","M3zXLYOfrY","wiHrZuLtKs","FcWrW1j5L8","FcWrWTCgPp","LDk6fcShY2",
+"uPX7GWPmlx","FLsphKsjRK","he9IA64s8N","DLhzMHzZT8","FcWrWMGlTF","ru4UGni2v1","CdyBVTwano","580YDguMb8","t59lRCfgr3","piJSkni2v1",
+"OUYuFReKEW","5nmWv24ARF","cmXIXuZPqg","lkMUApAhR1","BGaQYL7cGc","ydG8UyEfy9","d7vjMXflUq","Nxx9Vhi5X7","ZzJHWXyPZN","1LB1LnFqik",
+"Ta8f6Oz8yZ","lH1ktpT8wu","Yf2EczQt6Q","64s8NqaofN","LewvM9rlg9","mX2GEn8pJ9","MojnPcQOnv","jeskSGv3Fq","8FmFHLDk6f","fLNg8CxVEf",
+"HP433FwEJz","64s8NfFDrJ","24ARFhSSvQ","nFqikdhSuH","2hEEUMkgy8","580YDJXljW","SbRYyEOE1o","v2eC3zFgtB","l83Udm4bxU","580YDCIShG",
+"FNYIMNcICA","0ao3lpWiOs","pv0i77fKYU","7X3uy5Namm","DcpWBFPfSE","DQimpYjB9t","gtCA58TxD7","QClRLEOE1o","RACujTwano","uN6r3JXljW",
+"o8UydRsQUq","OUqFMt98iW","fmIK1FVMxo","tlILtksJby","jzUqRHfyNQ","uAWyp9XyT9","L7cGcvOqCE","VBjhzZJTXH","uZPqghe9IA","9rlg9fmIK1",
+"zbIYY8TxD7","Ss0ZuQClRL","7ku1pVLTy6","FFDuiDz1R3","DcpWBCqqaD","CK5W7v2eC3","Ul4a1ECMvU","ru4UGMmKGJ","5VZjSuTacx","tAOsrS2Dfu",
+"GXdoHbrhlQ","cL0aEt59lR","5drc6HfyNQ","9XyT9YOfrY","djsrv8hJdt","tvdkDprNT6","Z4I1vlCMxy","S2DfuKr8ys","zz4ZUlXFOB","Yh1hFWDVWJ",
+"K4GS8okgRi","qaofNRkQke","qUJMdb29RJ","s93MlydG8U","v8yFNuTacx","CxVEfhUTw7","Q6LixdQ586","No0QbKr8ys","S2Dfuv2eC3","Oz8yZiB08l",
+"cmXIXtuDyS","TwanokB5nP","M6qcGlXFOB","AIYUuMGlTF","v1Hln0MR5X","KASQ8zqH0W","s7MxkCqqaD","6q6L9AmdQd","pT8wugf8rI","8hJdtlj07Q",
+"IRh48U3yw5","29QAzGrDg7","piJSk5nmWv","4W0TlLbRTH","lj07QF6PT2","0PktIlpF6W","t59lRuJScX","8TxD7WmadA","55rfBtAOsr","pT8wuzY1GY",
+"zQt6Q5VZjS","yToGWnFqik","wiHrZRmDcr","1j5L8AgJHQ","WDVWJO3iyQ","RzaZAJIqXi","gjUTun1pmO","14FLRqaofN","Uvlv4wiHrZ","lpF6W1LB1L",
+"7Ow5CLewvM","i3pydn8pJ9","JKWYR1v5hH","VNCPdQworu","P6bcgvOqCE","GXdoHo8Uyd","RmDcrsx5Gl","SWfoupvgjS","JXljWfcJOy","RBhp0suY4x",
+"JRJQBRpBQm","FPfSETCgPp","ogLgcAIYUu","VBjhzlj07Q","ix74rUmaEv","gf8rIwiHrZ","gf8rIUlU3M","2TRI7JKWYR","uAWypVIlwP","pFrrly94nw",
+"dmoS78U2nU","iB08l2ZHdk","he9IA5VZjS","h1zcH2Nslm","MaJQsxciqp","Yh1hF9rlg9","yToGWReKEW","LewvMEdBKc","x3LDeTXQ0Z","WDVWJU3yw5",
+"nlaByo8Uyd","i3pydsqVrf","pv0i7uvf7A","YjB9tuQIcz","618DiVjCZq","QChxsFNYIM","UlU3MQbxXc","d7vjMM3zXL","uAWypm4bxU","FxX9qzqH0W",
+"Zv7z0QYxC0","QChxsVprf2","piJSkReKEW","7Ow5CtAOsr","cQOnvaez9y","rKDLJ0ao3l","zFgtBbZLvS","XyPZNogLgc","RpBQmpv0i7","BFkb88TxD7",
+"2ZHdk64s8N","IjTwP5nmWv","lXFOBPYBf4","hSSvQqQxHP","AOgEen1pmO","Q6hMCD6rBy","yToGWGv3Fq","FwEJz5nmWv","Yw2oUAXpwE","pFrrljeskS",
+"fcJOyFjHXR","l83UdksJby","HlUbFwiHrZ","JJs5mMojnP","DQimpQ6hMC","5ZaEz9iGoT","Dz1R3QnJ1S","pvgjSl83Ud","m4bxUJXljW","Nxx9VhSSvQ",
+"WreyPkB5nP","S77LHd85a9","5VZjSQClRL","y94nwcmXIX","wDajXDG4sT","yvOMIMGlTF","vkCHHh1zcH","x3LDeydG8U","9GXkXTCgPp","lH1kttjQxs",
+"Yw2oU64s8N","d85a95iGN5","Gv3Fq45cIH","P6bcg29QAz","In3NSkB5nP","AIYUupiJSk","YOfrYUlU3M","uAWyp2DREs","UmaEv45cIH","v2eC3cmXIX",
+"jSjS3jzUqR","FPfSEC2Irc","gtCA59GXkX","M6qcGuN6r3","JKWYRVprf2","m4bxUpiJSk","zmLYDOz8yZ","cShY2ZUnqt","kB5nPDz1R3","lsQGoHP433",
+"m4bxURsQUq","v1HlnYOfrY","S2DfuVLTy6","azIWpdhSuH","O3iyQSbRYy","FNYIMksJby","No0QbFNYIM","lkMUACNHmv","cL0aEPYBf4","hi5X707n1c",
+"s93MlMm8si","JkzUn29QAz","CdyBVjzUqR","v2eC3dhSuH","jSjS3uoStw","fmIK1ThjNn","aL6AJEOE1o","1v5hHUl4a1","aez9yAgJHQ","m4bxUF6PT2",
+"tuDySuPX7G","8xEKz8cVD3","FGzgpFVMxo","taOXKRxrsm","Pb1pasqVrf","RmDcr4W0Tl","XyPZNNAFuw","0Kyfstl72W","9GXkXNcICA","BGaQYuPX7G",
+"5VZjSSs0Zu","DQimpxciqp","vOqCECIShG","lweGyb29RJ","gIYvEFPfSE","iwzGkyofH3","rKDLJv1Hln","zY1GYDQimp","dhSuHXyPZN","nnP8o0BmCy",
+"FPfSEMkgy8","Vprf2cQOnv","1v5hHBbwgA","Oz8yZ45cIH","BbwgAiKqhr","rKDLJjS1aj","6AFT0LDk6f","KsjRKMaJQs","5IhmGRzaZA","SWfoucQOnv",
+"WmadAtAOsr","pWiOsFcWrW","dhSuHK20wK","5iGN5VjCZq","iwzGkv8yFN","aez9yIn3NS","6q6L9fqypy","HP433lj07Q","jS1ajuJScX","1j5L8POUYS",
+"XflUqMaJQs","faHirzQt6Q","WPmlxmX2GE","wDajXpiJSk","MojnPOz8yZ","vkCHHnlaBy","PYBf4JRJQB","fFDrJU3yw5","uPX7GuLtKs","Ta8f6lH1kt",
+"lH1ktW3VFH","4QMc916lHc","jeskScL0aE","YOfrYkB5nP","zQt6QaL6AJ","C2Irc4W0Tl","5NammblLA9","gtCA5mX2GE","8xEKz8TxD7","a00b5hYBCK",
+"9XyT9FcWrW","nlaByDcpWB","MmsIo6AFT0","GWqqXk85Ae","LbRTHRzaZA","d85a9pFrrl","pAhR1mz8gx","rhl0JPb1pa","y94nwv2eC3","guMb87ku1p",
+"K20wKBbwgA","16lHcAIYUu","i7WMQ4QMc9","uoStw2DREs","Q6hMCVNCPd","gdQsSDG4sT","jS1ajSjskQ","HlUbFlm0pD","VjCZqjiVBP","7fsYMVLTy6",
+"IKxdLMmKGJ","k85Ae0MR5X","zFgtBni2v1","RBhp0QClRL","QChxssx5Gl","DG4sT6AFT0","zQt6Q0ao3l","ciuWzsx5Gl","FhtglL7cGc","1v5hH7fKYU",
+"pWiOstaOXK","gjUTu8xEKz","Ss0ZuJIqXi","TwanouZPqg","Mm8siuN6r3","7X3uyHP433","XflUqi7WMQ","Yw2oUuupzk","guMb8GrDg7","I7p2a0Kyfs",
+"1v5hHMojnP","FxX9qhUTw7","CNHmvZ4I1v","OUYuFQworu","FhtglF6PT2","tlILtP6bcg","Nxx9VzHF1q","pT8wulm0pD","EoToPs4786","lViBvJRJQB",
+"yEfy95nmWv","29QAz8U2nU","vkCHH0BmCy","Yh1hF2DREs","o8UydYOfrY","FPfSEIKxdL","gtCA5Mm8si","gdQsS5Drn0","cShY22Nslm","i3pydUl4a1",
+"48cHL4W0Tl","o8UydNo0Qb","fqypyd7vjM","jiVBPkZANm","B3qemnFqik","VIlwP8xEKz","WMiS3AgJHQ","No0QbVerEA","GSQwjdQ586","FnPFBMm8si",
+"2hEEUCqqaD","tvdkDm4bxU","e6e4zuLtKs","he9IAFVMxo","P6bcgksJby","NAFuwhE1Ql","fmIK1mz8gx","Z4I1vRmDcr","BbwgAlm0pD","0PktImz8gx",
+"5Drn0xciqp","VjCZqaez9y","O3iyQfFDrJ","prNT6zQt6Q","8TxD7KsjRK","GrDg7Waim6","Pb1pa48cHL","5Drn09XyT9","sqVrfJJs5m","iqv4kDG4sT",
+"jfREuuAWyp","gIYvElH1kt","atef2okgRi","W7cTslweGy","lpF6W0h1b1","hYBCKNcICA","fLNg8gIYvE","J2mQi1j5L8","Chuy3tjQxs","lpF6WCp3mZ",
+"xReecD6rBy","9XyT9UlU3M","RzaZAZzJHW","5drc6n1pmO","t59lRQClRL","8U2nUi7WMQ","e6e4zlsQGo","07n1cFPfSE","nFqikHzZT8","CK5W7zqH0W",
+"5Mg9rBpYhV","pFrrlgjUTu","RACujblLA9","fqypyi3pyd","taOXK7fsYM","fmIK1hi5X7","SbRYyZzJHW","QYxC0dhSuH","n1pmOlweGy","5ZaEz0Kyfs",
+"zHF1qKr8ys","ydG8U64s8N","fcwDa8RCUA","PYBf4VIlwP","WPmlxD6rBy","WPmlx5drc6","W7cTslXFOB","DQimpblLA9","Y1mC0uLtKs","JRJQBvLsmS",
+"lm0pDTXQ0Z","atef2uZPqg","JRJQBuupzk","jtn0XuLtKs","YOfrYqUJMd","oGu6xi7WMQ","MGlTFcmXIX","Z4I1v9eoRc","CNHmvDQimp","mX2GEt59lR",
+"oQ87rCIShG","9rlg9AOgEe","n8pJ9he9IA","yofH3pAhR1","48cHLAgJHQ","JRJQBWmadA","CK5W7dhSuH","1LB1L8TxD7","DcpWB1v5hH","JRJQBhi5X7",
+"he9IAGXdoH","brhlQogLgc","2ZHdkRACuj","8hJdtWaim6","taOXKtl72W","RACujBbwgA","Ta8f6pAhR1","QnJ1Sd85a9","StlDJ7ku1p","POUYS29QAz",
+"ZhwG1ix74r","ThjNn8hJdt","RpBQmnnP8o","RkQkeIjTwP","Yh1hFUl4a1","BpYhVzmLYD","djsrvwiHrZ","OUYuFVIlwP","8RCUAjSjS3","kB5nP0YAGH",
+"AOgEefqypy","yluBxIKxdL","LDk6faez9y","GSQwjNxx9V","MmKGJpiJSk","UlU3Msx5Gl","uQIcz4W0Tl","24ARFVjCZq","Mm8siW3VFH","RsQUqAmdQd",
+"xReecFVMxo","zHF1qwDajX","o8Uyde6e4z","mz8gxogLgc","8TxD78hJdt","IRh48oQ87r","MmKGJD6rBy","Zv7z0nlaBy","ReKEW0ao3l","FGzgpuvf7A",
+"2ZHdkdQ586","G1RhSi7WMQ","5VZjSGWqqX","1LB1L0PktI","jzUqR618Di","FNYIMfFDrJ","FGzgpM3zXL","S2DfutvdkD","fmIK1fqypy","aDGtS0Kyfs",
+"HRxd8dpe1v","Ta8f6ECMvU","zz4ZU0Wr5y","7hyVv16lHc","JKWYRdhSuH","yToGWzHF1q","0KyfsHP433","hUTw7Q6Lix","4QMc9hi5X7","iB08lQChxs",
+"7Ow5CtuDyS","L7cGcmz8gx","VerEAiB08l","uupzkguMb8","5Drn0Dz1R3","QbxXcuupzk","hSSvQLbRTH","X6Pinix74r","No0QbZv7z0","8FmFHSmGzv",
+"dpe1vuAWyp","618Di8RCUA","BpYhVHRxd8","zQt6Q7fKYU","W7cTs580YD","QWxoTCK5W7","WPmlxFPfSE","lpF6W64s8N","FwEJzAkKTk","M3zXLk85Ae",
+"07n1cCqqaD","lXFOBJXljW","7ku1pBFkb8","yofH3ZhwG1","FFDui2Yz7E","zmLYDMezSW","KZamHVIlwP","FwEJzG1RhS","14FLRLbRTH","8TxD7zY1GY",
+"FFDui2ZHdk","uN6r3ulk41","faHirFGzgp","0BmCyv1Hln","fFDrJSWfou","AgJHQjS1aj","XflUqlsQGo","JRJQBBGaQY","U3yw5In3NS","Dz1R3AkKTk",
+"8hJdtfFDrJ","45cIHUl4a1","yToGWHP433","ZUnqtni2v1","s93Ml3weIF","L7cGcSWfou","VIlwPgjUTu","1LB1LNcICA","5Drn0nlaBy","kZANmZUnqt",
+"ulk41kZANm","pvgjSIjTwP","8RCUAI7p2a","2DREssx5Gl","GSQwjuTacx","soy9tl83Ud","7lUXZCfgr3","ni2v1FjHXR","8FmFHIjTwP","OUYuFO3iyQ",
+"SmGzvQChxs","uTacxyofH3","zY1GYM3zXL","atef2Oz8yZ","ulk41MmsIo","ydG8U5Mg9r","WDVWJVprf2","5IhmG55rfB","WPmlx2TRI7","RmDcr5nmWv",
+"MmsIohe9IA","MmsIoLbRTH","gf8rIAXpwE","xXTI4AmdQd","FxX9qfmIK1","2TRI7h1zcH","b29RJUmaEv","KASQ80Wr5y","QworuFVMxo","RzaZAYf2Ec",
+"GSQwjVjCZq","EdBKcTwano","brhlQ1v5hH","RzaZA5nmWv","3otm6BCxeC","EdBKc6AFT0","cmXIXKsjRK","48cHLCK5W7","0MR5XblLA9","hi5X7gf8rI",
+"i7WMQgf8rI","In3NSHzZT8","QChxssoy9t","W7cTsJRJQB","Waim6d85a9","Q6hMCUvlv4","uTacxaez9y","pFrrlNcICA","14FLRP6bcg","MojnPxXTI4",
+"oQ87rZuDtD","d85a9PYBf4","M6qcGDcpWB","618DipiJSk","CK5W7nFqik","jzUqRsuY4x","he9IAKASQ8","tvdkD1j5L8","pmeCdFxX9q","SmGzvWreyP",
+"jeskSCxVEf","EdBKchSSvQ","7ku1pvLsmS","M3zXLHfyNQ","Ta8f6rz7Ut","iB08lIn3NS","FGzgpvLsmS","CdyBVC2Irc","uPX7Gdjsrv","6q6L9ZJTXH",
+"y94nw4W0Tl","VBjhzyluBx","cShY2uupzk","xciqph1zcH","gf8rIJKWYR","IRh48KsjRK","GWqqXogLgc","FjHXRnnP8o","FwEJzOz8yZ","iqv4kZuDtD",
+"uJScXeuZA5","zbIYYGWqqX","VNCPdK20wK","0ao3lAmdQd","qQxHP29QAz","9GXkXtuDyS","taOXKTCgPp","NhXdu4dEz6","t59lRKZamH","ThjNnnnP8o",
+"uvf7A7ku1p","7fKYUoGu6x","YOfrYyvOMI","AXpwEK20wK","Ss0Zue6e4z","5iGN5VIlwP","3weIFVprf2","dhSuHZhwG1","dhSuH5VZjS","jzUqRgjUTu",
+"ZhwG1hYBCK","okgRiS2Dfu","QWxoTulk41","guMb8UlU3M","gjUTujzUqR","SmGzvDLhzM","8cVD3EoToP","7fsYMzbIYY","HlUbFeuZA5","CxVEfIBe8k",
+"wDajXpAhR1","7fsYMo8Uyd","lsQGoJ2mQi","lH1ktHfyNQ","blLA9618Di","7fKYU618Di","oQ87rt98iW","tjQxsM6qcG","HRxd8FcWrW","QnJ1Sxciqp",
+"fcwDarhl0J","FcWrWMkgy8","WaWsvReKEW","tjQxspT8wu","ECMvUjzUqR","4dEz6v8yFN","dmoS7lViBv","MezSWMaJQs","5NammK20wK","AgJHQkB5nP",
+"0YAGHUlU3M","lj07QMm8si","9iGoTru4UG","CqqaDWMiS3","fmIK1Nxx9V","8TxD7ru4UG","Yf2Ec8U2nU","PYBf4gIYvE","QnJ1SEOE1o","soy9t6q6L9",
+"s93Ml2Yz7E","9GXkXBCxeC","L7cGc0ao3l","Qworub29RJ","jeskSlCMxy","okgRiCNHmv","nnP8oX6Pin","qUJMdgjUTu","JIqXiyvOMI","sx5GlWPmlx",
+"CdyBVs4786","M3zXLlweGy","gf8rIuLtKs","ThjNnAXpwE","dpe1vrhl0J","0BmCyFGzgp","JXljWW7cTs","1j5L8cmXIX","OUYuF1LB1L","jeskSguMb8",
+"ZUnqtlpF6W","FcWrWuLtKs","FLsphK4GS8","48cHLjiVBP","6q6L9QClRL","55rfBLewvM","VBjhzPOUYS","S77LHdhSuH","C2Irc8RCUA","FFDui1v5hH",
+"uAWypuvf7A","8cVD345cIH","h1zcHksJby","C2Irc9GXkX","I7p2aprNT6","mz8gx5VZjS","SWfouFNYIM","oVQp65drc6","PYBf4Twano","uPX7GRzaZA",
+"6q6L9618Di","sx5GlNhXdu","0PktIWDVWJ","K4GS8QYxC0","2ZHdkAmdQd","24ARFcQOnv","F6PT2s4786","lweGyWPmlx","Yw2oUiqv4k","k85AeKr8ys",
+"nnP8oJkzUn","WaWsvG1RhS","Zv7z02DREs","L7cGcWPmlx","2TRI76AFT0","lXFOB9y4lw","GWqqXxReec","oVQp6MmsIo","BCxeCmz8gx","brhlQdQ586",
+"POUYSTCgPp","tuDySzbIYY","lm0pDjzUqR","2hEEUZUnqt","CIShG9iGoT","pT8wujeskS","EoToPx3LDe","5nmWvVNCPd","okgRi5iGN5","CdyBVpFrrl",
+"uLtKs8hJdt","5NammzHF1q","UlU3MCdyBV","oQ87rlm0pD","BbwgA8hJdt","FPfSEYOfrY","pFrrlZJTXH","1j5L81LB1L","FNYIMyEfy9","x3LDetlILt",
+"gf8rI7hyVv","WMiS3GSQwj","7Ow5CDcpWB","IKxdLsoy9t","AmdQdtuDyS","Oz8yZMkgy8","TwanoM3zXL","XyPZNUlU3M","1LB1LMmsIo","RBhp0d7vjM",
+"Vprf2t98iW","Chuy38cVD3","lViBvBFkb8","qaofNpWiOs","Chuy3GrDg7","YOfrYyEfy9","2NslmWreyP","3weIFvkCHH","uJScXF6PT2","Q6hMCkZANm",
+"HRxd8U3yw5","ReKEW1j5L8","4QMc9SjskQ","5nmWvBCxeC","MmsIogf8rI","pWiOsAIYUu","ECMvUM6qcG","6AFT0MojnP","FnPFBAkKTk","rz7UtDQimp",
+"jSjS3HlUbF","i7WMQAkKTk","AOgEehi5X7","8U2nUyofH3","cmXIXkZANm","fqypyXyPZN","aFFssix74r","uvf7AbrhlQ","XflUqDLhzM","v2eC3uTacx",
+"wDajXzY1GY","dQ586EOE1o","618DilkMUA","NAFuwlXFOB","vOqCEpT8wu","FcWrWulk41","3weIFmz8gx","lViBveuZA5","0BmCyTXQ0Z","5drc6CxVEf",
+"kZANmK20wK","faHirRzaZA","5IhmGVIlwP","KZamHFnPFB","TXQ0Ztl72W","MK07YgjUTu","RmDcrAkKTk","HzZT8iwzGk","AXpwEksJby","lXFOBVNCPd",
+"QssNCqUJMd","d85a9uvf7A","GSQwj2TRI7","tl72WBbwgA","SWfoujiVBP","hE1Ql2TRI7","CNHmvbZLvS","2DREsmX2GE","aL6AJVLTy6","FGzgpRmDcr",
+"NhXduJIqXi","JJs5mCIShG","hi5X7X6Pin","he9IAPOUYS","JRJQBTXQ0Z","jeskS7X3uy","wiHrZ16lHc","cL0aEl83Ud","zY1GY2Nslm","O3iyQJJs5m",
+"Yf2Ece6e4z","sx5GlMK07Y","tvdkDW7cTs","Uvlv4y94nw","gIYvE8RCUA","AkKTkPOUYS","Ss0Zu5Namm","pWiOsBFkb8","djsrvDcpWB","EoToPru4UG",
+"pFrrldQ586","rKDLJSWfou","gjUTuPOUYS","M6qcGfFDrJ","ECMvUhe9IA","suY4x5drc6","zQt6Q6q6L9","Q6LixksJby","ZhwG1ThjNn","VjCZqHRxd8",
+"0PktI1j5L8","uJScXJIqXi","oGu6xCp3mZ","9GXkXHlUbF","NAFuwG1RhS","bgJAzi3pyd","FPfSEiB08l","jS1ajciuWz","y94nwiKqhr","tAOsruN6r3",
+"BGaQYFPfSE","M6qcGhe9IA","WaWsvU3yw5","uoStwQworu","v1HlnHfyNQ","hSSvQ9iGoT","MaJQsSmGzv","RkQkeMezSW","ZJTXHFVMxo","2ZHdkQnJ1S",
+"Pb1paWaim6","blLA9BpYhV","07n1ceuZA5","lpF6WpvgjS","fqypyQYxC0","JkzUnSbRYy","wiHrZ07n1c","DG4sT14FLR","hYBCK8cVD3","VBjhzThjNn",
+"taOXKuoStw","VerEAZhwG1","VIlwPmX2GE","zbIYY0Wr5y","oVQp64dEz6","s93MlzFgtB","M6qcGP6bcg","5Drn01j5L8","5Mg9rfLNg8","1LB1L6AFT0",
+"JRJQB6q6L9","xReecBCxeC","CxVEfjiVBP","FFDuizHF1q","b29RJlm0pD","MmsIoCIShG","NcICAMojnP","FNYIMfaHir","RkQkeVprf2","KsjRKNOHsz",
+"FLsphdhSuH","9iGoTl83Ud","Yh1hFReKEW","L7cGc2Yz7E","618DizQt6Q","2hEEUOUYuF","rKDLJ16lHc","rhl0J8TxD7","JRJQBguMb8","ReKEWQClRL",
+"8RCUA7X3uy","POUYSzz4ZU","8cVD3lkMUA","IjTwPNxx9V","fcJOysx5Gl","MmsIoK4GS8","45cIHjfREu","o8UydJJs5m","k85AeFPfSE","tvdkDNOHsz",
+"xciqp0PktI","xciqpSbRYy","6AFT0Nxx9V","M6qcGtlILt","G1RhSgjUTu","XyPZN8xEKz","iB08lWaim6","wiHrZVjCZq","X6PinGXdoH","BFkb8IRh48",
+"aL6AJm4bxU","s7MxkSs0Zu","0MR5XxXTI4","Nxx9VbrhlQ","Y1mC045cIH","aDGtSulk41","7hyVvIBe8k","lCMxyChuy3","d85a97Ow5C","ru4UGpmeCd",
+"ydG8UG1RhS","WPmlxMm8si","ciuWz55rfB","MezSWDQimp","AIYUunFqik","EdBKczHF1q","9GXkXQYxC0","D6rByt98iW","tl72Wa00b5","aez9yFNYIM",
+"AIYUuBbwgA","FFDuiiKqhr","4W0TllH1kt","o8UydFwEJz","UlU3M2Nslm","NcICADLhzM","JKWYRpT8wu","GSQwj2ZHdk","XflUq8FmFH","HzZT8WreyP",
+"k85AeD6rBy","AmdQdDz1R3","14FLRZv7z0","uJScXs7Mxk","2hEEUd85a9","a00b5P6bcg","4QMc90PktI","SmGzvXyPZN","fcwDae6e4z","lCMxyB3qem",
+"sx5GlksJby","jSjS3gf8rI","RBhp0B3qem","64s8N5Drn0","MGlTF2Nslm","8hJdt7ku1p","fFDrJi7WMQ","No0QbQnJ1S","oVQp6ydG8U","4W0Tl6AFT0",
+"FFDuipT8wu","QssNC8TxD7","SmGzvCNHmv","618DiDG4sT","FNYIMMezSW","14FLRIKxdL","CqqaDNxx9V","2hEEUHRxd8","FPfSEatef2","Z4I1vAgJHQ",
+"KASQ8CxVEf","l83UdQ6hMC","jtn0XJRJQB","2Yz7E4dEz6","DLhzMMm8si","cmXIXBGaQY","VBjhzfcJOy","sqVrfHfyNQ","uTacx618Di","d85a9ru4UG",
+"lCMxy55rfB","zbIYYgIYvE","oQ87rLewvM","pFrrlbrhlQ","SbRYyyEfy9","0KyfsCp3mZ","qQxHPJIqXi","SjskQDLhzM","Mm8sizbIYY","tuDySuLtKs",
+"tvdkD8TxD7","8FmFHyvOMI","lH1ktSs0Zu","pvgjSi7WMQ","FjHXRFwEJz","blLA9zmLYD","zFgtBUlU3M","SWfouIn3NS","W7cTsaDGtS","GXdoHWDVWJ",
+"vLsmSxXTI4","7fKYU45cIH","FLsphnnP8o","7X3uyLDk6f","9eoRcjtn0X","DLhzMatef2","L7cGczQt6Q","5IhmGSs0Zu","cShY2Zv7z0","Uvlv4AkKTk",
+"Mkgy8HlUbF","fLNg8Mkgy8","azIWpi7WMQ","9rlg9S2Dfu","ZuDtDiqv4k","F6PT20BmCy","ZJTXH5IhmG","KZamHn8pJ9","YjB9tJIqXi","KZamHcShY2",
+"lCMxye6e4z","tl72WmX2GE","uvf7AGv3Fq","NcICAs7Mxk","5ZaEzdjsrv","VLTy6NcICA","45cIHCdyBV","WMiS3d85a9","lCMxyAkKTk","oVQp6OxWIH",
+"tl72WOHaBz","C2Irc2TRI7","jSjS3pmeCd","MmKGJTXQ0Z","DQimpNhXdu","7fsYMnnP8o","mz8gxFFDui","WPmlxIn3NS","rz7Ut24ARF","zbIYYUlU3M",
+"bZLvSM6qcG","1j5L8iqv4k","uAWypHzZT8","jS1ajTa8f6","XyPZNmz8gx","618Di0h1b1","pv0i79iGoT","ydG8UjS1aj","d7vjM7lUXZ","s7Mxk14FLR",
+"RpBQmAXpwE","okgRiCxVEf","Ss0Zut59lR","StlDJoQ87r","8hJdtnFqik","mz8gxNOHsz","5nmWva00b5","Twano7hyVv","AgJHQJKWYR","azIWpyluBx",
+"WMiS3CdyBV","0MR5XAgJHQ","rz7UtqUJMd","zQt6QogLgc","LewvMWaWsv","mz8gxY1mC0","jzUqRsoy9t","CxVEf2hEEU","zY1GYjSjS3","8RCUAEdBKc",
+"s7MxkQ6Lix","StlDJCNHmv","o8UydGWqqX","uvf7AlpF6W","TCgPpS2Dfu","1LB1LyEfy9","suY4xgIYvE","prNT6Twano","MK07YoGu6x","pFrrlaL6AJ",
+"45cIHuPX7G","Dz1R3cShY2","14FLR2Yz7E","X6Pinx3LDe","5ZaEzlXFOB","0h1b1JRJQB","Mkgy8K4GS8","i7WMQTa8f6","dhSuHTwano","SWfou8FmFH",
+"Kr8ysfqypy","lViBvbgJAz","iwzGkNcICA","TCgPpOz8yZ","9iGoT7ku1p","QClRLWaim6","Yf2Ec9XyT9","GSQwj9GXkX","5drc6OUqFM","SWfou0Wr5y",
+"Gv3FqNOHsz","Yf2EczqH0W","TwanoSWfou","55rfB9rlg9","lViBvdpe1v","k85AeqQxHP","NcICABGaQY","GSQwjFGzgp","v2eC3euZA5","YjB9tfLNg8",
+"ix74rrhl0J","Mm8si16lHc","faHirReKEW","O3iyQhi5X7","kZANmFxX9q","JXljW8U2nU","pFrrlGXdoH","uAWyp3otm6","YjB9t8cVD3","8hJdt5Drn0",
+"GWqqXBbwgA","X6PinhYBCK","oGu6xJJs5m","dpe1vPYBf4","iB08l0ao3l","CK5W7i7WMQ","BFkb8e6e4z","cL0aEatef2","Ta8f6S2Dfu","nlaByTCgPp",
+"8xEKzFNYIM","FhtglfcJOy","Ta8f6QnJ1S","aez9yDG4sT","uPX7GwDajX","2NslmU3yw5","7X3uy2ZHdk","RpBQmVBjhz","F6PT2atef2","OUqFMMkgy8",
+"jzUqRgIYvE","oVQp6cShY2","BbwgA64s8N","fmIK1WDVWJ","14FLRTXQ0Z","K4GS8D6rBy","RmDcr8cVD3","HzZT8Ta8f6","Yf2EcNhXdu","lkMUA2TRI7",
+"ZzJHWEdBKc","FcWrWKsjRK","UlU3MI7p2a","fcwDamX2GE","i7WMQk85Ae","MmsIoQYxC0","9y4lwTXQ0Z","d85a9uN6r3","kZANmCdyBV","4dEz6M3zXL",
+"CK5W71v5hH","5ZaEzBCxeC","JIqXinFqik","zbIYYb29RJ","BbwgAUvlv4","gjUTuRBhp0","1LB1LBbwgA","KsjRKIjTwP","5iGN5hE1Ql","Yw2oUlweGy",
+"Cfgr32TRI7","bgJAzo8Uyd","C2IrcQ6hMC","XflUqyvOMI","uvf7AWaWsv","nFqikCNHmv","2DREsblLA9","9eoRcd85a9","pv0i7GWqqX","0ao3lGv3Fq",
+"QssNClpF6W","SWfouhYBCK","WDVWJNAFuw","soy9tAOgEe","RpBQmM3zXL","QworuAXpwE","EdBKcCK5W7","QYxC0d7vjM","580YDi3pyd","3weIFuoStw",
+"JJs5mjeskS","G1RhSIRh48","zqH0W9iGoT","oQ87rAgJHQ","2DREs0PktI","Cp3mZciuWz","okgRi7lUXZ","uAWypHP433","Cp3mZ2Nslm","5Nammn1pmO",
+"7ku1pn1pmO","s7MxkFhtgl","8TxD7DG4sT","2hEEUhE1Ql","S77LHtuDyS","hUTw73otm6","OHaBz0h1b1","hE1QlYw2oU","jS1ajyEfy9","CxVEfn1pmO",
+"QbxXcjiVBP","ogLgcBGaQY","WPmlxlpF6W","gjUTuRzaZA","Yh1hFjtn0X","l83UdokgRi","8xEKz0ao3l","S2DfuxReec","guMb80BmCy","Q6Lixuvf7A",
+"FnPFBPYBf4","RBhp0oQ87r","9eoRci7WMQ","5Drn0Uvlv4","cQOnvcmXIX","bgJAzrhl0J","WDVWJt98iW","Ss0Zu0MR5X","o8UydtaOXK","iB08lIBe8k",
+"lkMUA9y4lw","zbIYYFLsph","OUqFMG1RhS","hSSvQyofH3","JIqXiulk41","K20wK9GXkX","F6PT2U3yw5","blLA9YOfrY","YjB9tAIYUu","rhl0JJJs5m",
+"29QAzEOE1o","tl72WBGaQY","IKxdLnFqik","mX2GEuN6r3","zFgtBOUqFM","0PktI5Drn0","Yw2oU4QMc9","K20wK3otm6","MmsIoulk41","WmadAIKxdL",
+"RACujFcWrW","piJSkIjTwP","0PktIZuDtD","618DiKsjRK","618DiKASQ8","Ul4a1y94nw","tl72WlsQGo","ciuWzYh1hF","blLA9O3iyQ","lCMxyiwzGk",
+"vkCHHNhXdu","JXljW580YD","pFrrlJKWYR","MaJQse6e4z","d7vjMG1RhS","SjskQZ4I1v","7lUXZdQ586","JkzUnpvgjS","S77LHpiJSk","LDk6fOUYuF",
+"rz7UtlpF6W","5IhmGsuY4x","lm0pDaDGtS","5ZaEziKqhr","pT8wuCK5W7","HlUbFpAhR1","8TxD7pvgjS","sqVrfb29RJ","RsQUqMezSW","DG4sTt98iW",
+"FPfSEFFDui","7hyVvCfgr3","9GXkX5IhmG","S2Dfu9GXkX","lj07QuJScX","RsQUq4dEz6","7fsYM1v5hH","NAFuwUlU3M","QnJ1SBGaQY","5drc645cIH",
+"wiHrZo8Uyd","gtCA5FwEJz","v8yFNFjHXR","HRxd8n8pJ9","GWqqXzqH0W","gf8rIbZLvS","lXFOBydG8U","pWiOsHfyNQ","nFqikU3yw5","No0QbHlUbF",
+"uLtKshSSvQ","jeskSlkMUA","lpF6WRzaZA","DcpWBsx5Gl","LewvMMGlTF","Z4I1vLDk6f","xXTI4jeskS","FGzgpChuy3","lCMxyVLTy6","RmDcrpFrrl",
+"QbxXcXflUq","3weIF6q6L9","uPX7Ge6e4z","euZA5oGu6x","Z4I1vlXFOB","l83UdRzaZA","7lUXZzFgtB","55rfBaL6AJ","rhl0J9XyT9","8U2nUdQ586",
+"2TRI7cQOnv","ogLgcUvlv4","nlaBy2Yz7E","djsrvMkgy8","Mm8siWDVWJ","dQ586Chuy3","7hyVvJ2mQi","hYBCK8U2nU","KZamHydG8U","AIYUus4786",
+"Zv7z01j5L8","IBe8ky94nw","VLTy6lweGy","QYxC0HzZT8","y94nwuN6r3","WaWsvbrhlQ","aez9y5Namm","Yf2EcdhSuH","soy9tFhtgl","nFqikdQ586",
+"16lHcv1Hln","M6qcGZv7z0","45cIHHzZT8","lCMxy16lHc","CIShGcmXIX","FVMxoDcpWB","v8yFNSs0Zu","zFgtBzmLYD","pAhR1t98iW","tjQxs2TRI7",
+"48cHLHP433","8RCUAiB08l","ru4UGjtn0X","DG4sT7hyVv","0MR5XZJTXH","ThjNnQWxoT","5VZjSHzZT8","kB5nPyEfy9","BCxeChSSvQ","8cVD3lm0pD",
+"WaWsvKsjRK","0YAGHMK07Y","AgJHQECMvU","Uvlv4QnJ1S","POUYSlViBv","IBe8kaL6AJ","7Ow5ChSSvQ","xciqpRpBQm","mX2GE8xEKz","FLsphUmaEv",
+"9iGoTFwEJz","C2IrcNxx9V","3weIFWMiS3","FcWrWyEfy9","In3NSv2eC3","5Mg9rpiJSk","FGzgp24ARF","I7p2aNOHsz","Kr8ys7ku1p","29QAzVBjhz",
+"pT8wuoQ87r","iB08lAmdQd","suY4xNxx9V","Yw2oU8FmFH","FjHXRBCxeC","GrDg7uoStw","7hyVvWMiS3","24ARFlweGy","VLTy6gdQsS","kB5nP9rlg9",
+"EdBKcKZamH","GrDg7WPmlx","5drc6Chuy3","hi5X7FNYIM","ZuDtD8xEKz","RpBQmMojnP","Zv7z0Fhtgl","dpe1vvOqCE","KZamHoVQp6","uvf7AMojnP",
+"ulk41vkCHH","8cVD3soy9t","qUJMdulk41","1j5L8i7WMQ","LDk6fciuWz","M3zXLAIYUu","8hJdt4QMc9","Q6Lixlm0pD","lpF6WeuZA5","WaWsvC2Irc",
+"pFrrlU3yw5","xReecd7vjM","BFkb8VjCZq","QChxsIBe8k","RBhp0cShY2","x3LDejtn0X","WPmlxNxx9V","i7WMQs7Mxk","aFFssYh1hF","4W0TlQChxs",
+"0KyfsJJs5m","Yh1hF0Kyfs","Fhtgl3otm6","hYBCKoVQp6","hUTw7fFDrJ","iB08lMGlTF","xciqpyToGW","b29RJaL6AJ","I7p2aIKxdL","JXljWHRxd8",
+"WDVWJFPfSE","VerEA2ZHdk","P6bcg0MR5X","IKxdL5Mg9r","IRh48dhSuH","0YAGHHP433","45cIHReKEW","HRxd8K4GS8","HlUbFfLNg8","mX2GEoQ87r",
+"tl72WpvgjS","piJSkhUTw7","dpe1vdmoS7","4QMc9blLA9","bZLvSHP433","Cp3mZAXpwE","pvgjS8hJdt","G1RhSEoToP","guMb8J2mQi","NcICAS77LH",
+"1v5hH8cVD3","HRxd8RsQUq","DLhzMWmadA","uJScXRBhp0","QnJ1SWaWsv","x3LDeM6qcG","GXdoHtjQxs","AgJHQStlDJ","RpBQmtlILt","580YD7X3uy",
+"NcICAYf2Ec","2Yz7ERACuj","FcWrWhSSvQ","lweGyuJScX","HzZT8ydG8U","ogLgcDG4sT","F6PT2FNYIM","U3yw5FPfSE","0YAGHfcwDa","FPfSE64s8N",
+"hYBCKF6PT2","uPX7G9rlg9","QClRLZhwG1","dhSuHyEfy9","uN6r32TRI7","64s8NAmdQd","BCxeC6AFT0","YjB9tFPfSE","HP433FPfSE","uN6r3LDk6f",
+"In3NSVerEA","0PktIjS1aj","GSQwjuJScX","RsQUqbgJAz","C2IrcksJby","WreyPblLA9","lH1ktqQxHP","pv0i7K4GS8","CK5W7OHaBz","1LB1LfcJOy",
+"GSQwjv1Hln","VLTy6dmoS7","aDGtSwDajX","aez9yhYBCK","JRJQBBpYhV","ni2v1hYBCK","ni2v1djsrv","F6PT2yofH3","ZJTXHCxVEf","ksJbyNAFuw",
+"HP433MmKGJ","blLA9zFgtB","RmDcrv2eC3","DcpWBn1pmO","xReec24ARF","HlUbFdjsrv","9rlg9x3LDe","uTacxpAhR1","29QAzGXdoH","d7vjMGrDg7",
+"jS1aj07n1c","SWfou7lUXZ","XflUqQnJ1S","hUTw7jzUqR","cmXIXFFDui","3otm6Oz8yZ","uQIcz8xEKz","9y4lwjSjS3","2hEEUpT8wu","TwanoiwzGk",
+"piJSk8FmFH","mz8gxJXljW","jSjS3iB08l","rKDLJrhl0J","Ta8f6618Di","0BmCyGWqqX","J2mQihSSvQ","WDVWJHzZT8","Zv7z0suY4x","1LB1LVerEA",
+"fcJOyNOHsz","5VZjSyvOMI","QbxXct59lR","TwanouQIcz","Q6hMCChuy3","IBe8kKr8ys","pmeCdFGzgp","Qworu3otm6","dhSuH3weIF","uJScXDLhzM",
+"IjTwPzqH0W","euZA5fcwDa","d7vjMhUTw7","XyPZNOHaBz","WDVWJBFkb8","WreyPIjTwP","RzaZAJXljW","2DREs5Drn0","BGaQYVLTy6","l83UdFxX9q",
+"n1pmOe6e4z","AgJHQPOUYS","07n1c0BmCy","l83Ud55rfB","Gv3FqfmIK1","14FLREOE1o","zz4ZUhUTw7","RpBQmB3qem","qUJMdUl4a1","1v5hHs7Mxk",
+"AmdQd2Nslm","Chuy32ZHdk","RBhp0yToGW","ciuWzazIWp","ZhwG11v5hH","hUTw7tAOsr","GWqqXjSjS3","MezSW48cHL","o8UydRkQke","M3zXLFPfSE",
+"MojnPx3LDe","d7vjMMGlTF","SWfou9GXkX","StlDJulk41","BGaQY0ao3l","TXQ0ZMGlTF","soy9tDcpWB","FnPFBcShY2","14FLRs7Mxk","LewvMDcpWB",
+"DcpWBaDGtS","Dz1R3he9IA","M6qcGYf2Ec","EOE1oYf2Ec","b29RJm4bxU","pvgjSiB08l","kZANmReKEW","i7WMQEOE1o","In3NSuJScX","5NammprNT6",
+"rz7UtFGzgp","tvdkDrz7Ut","LbRTH8U2nU","4dEz6azIWp","ZUnqtTwano","yEfy9PYBf4","UlU3Mlj07Q","YOfrYiqv4k","cmXIXMkgy8","pAhR1MojnP",
+"YjB9tHfyNQ","Waim6v8yFN","cL0aEIn3NS","SjskQUlU3M","UlU3M6AFT0","0KyfslsQGo","v2eC3zmLYD","5nmWvbrhlQ","No0QbpFrrl","VerEAyofH3",
+"5IhmGo8Uyd","lViBv3otm6","5VZjSlkMUA","uPX7GRsQUq","lViBvFxX9q","2Nslm29QAz","m4bxUtjQxs","W7cTs5Drn0","GSQwjFhtgl","rKDLJv2eC3",
+"YOfrYlpF6W","n1pmO0ao3l","RsQUqguMb8","RBhp0M3zXL","Mm8sigdQsS","prNT6Oz8yZ","Mkgy8blLA9","OHaBz2hEEU","QssNC5nmWv","BCxeCfcwDa",
+"29QAzk85Ae","U3yw5EoToP","IjTwPjiVBP","ECMvU8TxD7","ZuDtDVerEA","AXpwEbgJAz","MezSW2Nslm","gjUTuFNYIM","Waim6QbxXc","9XyT9yofH3",
+"4W0TlFFDui","JkzUnokgRi","5iGN5v8yFN","xXTI4lj07Q","F6PT2POUYS","YOfrYdjsrv","FVMxoG1RhS","Y1mC0ydG8U","zz4ZU580YD","64s8NdhSuH",
+"HRxd8zbIYY","FxX9qCfgr3","brhlQtl72W","tuDySZzJHW","vOqCEW3VFH","uTacxHlUbF","lCMxyxReec","MezSWtuDyS","1v5hHHfyNQ","LewvM7fsYM",
+"zQt6Qix74r","FxX9qGXdoH","7ku1pJkzUn","YOfrYZ4I1v","AXpwENAFuw","zHF1q29QAz","6AFT0No0Qb","CdyBVs93Ml","ulk41FLsph","ydG8UMmKGJ",
+"xReecWPmlx","qUJMdFFDui","oGu6xgjUTu","RsQUqNxx9V","0BmCyVjCZq","FGzgpQClRL","Ta8f6zbIYY","FPfSE4QMc9","AOgEe618Di","FVMxocmXIX",
+"IRh48dmoS7","oVQp6UmaEv","hSSvQazIWp","lkMUAatef2","HfyNQdpe1v","AkKTkatef2","uTacxDcpWB","uTacx9GXkX","GSQwjC2Irc","ru4UGfmIK1",
+"8TxD7VLTy6","07n1coVQp6","DG4sTm4bxU","CNHmvNhXdu","pvgjSS2Dfu","RpBQmfaHir","Ta8f6lCMxy","QbxXcCIShG","Yh1hFZv7z0","IBe8kMmsIo",
+"guMb8d7vjM","Oz8yZTwano","uoStwECMvU","WMiS3uPX7G","5Drn0yofH3","TXQ0ZuZPqg","fFDrJBGaQY","SbRYyv1Hln","C2IrcBGaQY","2TRI7WreyP",
+"P6bcgdmoS7","sqVrfFVMxo","i7WMQUl4a1","a00b5AXpwE","DLhzMRsQUq","MmsIo9eoRc","jSjS3d7vjM","CqqaDi3pyd","iqv4kUvlv4","EdBKclViBv",
+"StlDJuPX7G","aL6AJpv0i7","WmadAMojnP","O3iyQiqv4k","MojnPiB08l","gdQsSlH1kt","WreyPaez9y","EdBKcO3iyQ","ZhwG1FwEJz","XflUqyofH3",
+"0PktIYf2Ec","M3zXLsoy9t","POUYSk85Ae","UlU3MDQimp","7fKYUMezSW","9iGoTS77LH","8TxD7ZJTXH","kZANm4QMc9","9iGoTfqypy","AOgEeoGu6x",
+"618DibZLvS","ThjNnpAhR1","U3yw5FLsph","yofH3lpF6W","8RCUATCgPp","tlILtB3qem","5ZaEz5IhmG","CqqaDni2v1","ogLgcMkgy8","rz7Ut5VZjS",
+"kB5nP4QMc9","atef2EoToP","AkKTk5drc6","pAhR15ZaEz","9iGoTiB08l","JRJQB9GXkX","BFkb8zqH0W","v8yFNtjQxs","Mkgy87Ow5C","jSjS314FLR",
+"oGu6xzQt6Q","CxVEfYh1hF","uvf7Ad7vjM","iB08lSmGzv","Q6hMCmz8gx","gjUTubgJAz","VerEAW7cTs","FLsph4dEz6","S2Dfuni2v1","lViBvOz8yZ",
+"QClRLFnPFB","lViBvd85a9","FwEJze6e4z","RsQUqBpYhV","CdyBVMmsIo","IBe8kdjsrv","5ZaEzPb1pa","FnPFB1LB1L","48cHL7hyVv","yToGWgtCA5",
+"JRJQBhUTw7","Dz1R3AXpwE","Pb1paWaWsv","WPmlx8U2nU","zz4ZUaFFss","MK07YcShY2","7Ow5CQnJ1S","UlU3MuAWyp","CxVEfsqVrf","SWfouVerEA",
+"okgRiuTacx","5ZaEzSjskQ","Cfgr38hJdt","4QMc9djsrv","RzaZAIRh48","6AFT0aL6AJ","48cHLB3qem","hSSvQsqVrf","xXTI4Twano","In3NSvLsmS",
+"dQ5862Yz7E","m4bxUuPX7G","jSjS3n8pJ9","zz4ZUJRJQB","Pb1paJRJQB","tlILtEOE1o","0ao3lguMb8","VNCPdzmLYD","taOXKYjB9t","9GXkX8cVD3",
+"lm0pDDz1R3","45cIH9eoRc","rz7UtiB08l","9eoRcsoy9t","07n1cOHaBz","okgRijS1aj","zY1GYJXljW","jiVBPReKEW","5drc614FLR","fLNg8ZJTXH",
+"zHF1qiB08l","RzaZAlsQGo","AXpwEMK07Y","v8yFN0h1b1","jzUqRQworu","tlILttlILt","uZPqgnlaBy","Zv7z0TCgPp","LbRTH0YAGH","FjHXRSbRYy",
+"ZzJHWUl4a1","pT8wuO3iyQ","pT8wuZv7z0","Ss0ZuIRh48","lj07Q4W0Tl","JkzUneuZA5","7ku1pS2Dfu","U3yw5cmXIX","24ARF5Namm","5Mg9rlweGy",
+"MojnPni2v1","O3iyQVjCZq","mz8gx8FmFH","TCgPpVprf2","16lHcQworu","pWiOs5ZaEz","4W0TlF6PT2","zY1GYO3iyQ","VerEA29QAz","s4786faHir",
+"YjB9tyluBx","yofH34W0Tl","JIqXiPb1pa","4dEz6VLTy6","ydG8Usx5Gl","MojnP2DREs","jeskSrKDLJ","ydG8U5IhmG","zbIYYTXQ0Z","blLA9QChxs",
+"lj07QTwano","nFqiktlILt","gIYvEKASQ8","s93Ml0MR5X","faHiryToGW","lweGyK4GS8","OHaBzIRh48","suY4xpvgjS","rKDLJK20wK","fFDrJKZamH",
+"o8UydDz1R3","AOgEeuQIcz","Ss0ZuUmaEv","bgJAziKqhr","jfREufFDrJ","IKxdLa00b5","K4GS8Fhtgl","8U2nUFcWrW","tvdkDGv3Fq","suY4xChuy3",
+"brhlQ9y4lw","7fKYUCNHmv","45cIH5Mg9r","618DiG1RhS","2TRI7n8pJ9","uupzkiqv4k","DQimpWMiS3","aDGtSyToGW","rKDLJ7ku1p","qaofNMmKGJ",
+"7X3uysoy9t","FNYIMdmoS7","hE1QlWreyP","hi5X7lj07Q","gIYvEgIYvE","RkQkeNo0Qb","0PktInFqik","jiVBPaFFss","ciuWzfmIK1","CIShGjfREu",
+"0PktIBFkb8","PYBf4ulk41","In3NSAgJHQ","7fsYMM3zXL","RpBQmKASQ8","xciqpAgJHQ","G1RhS45cIH","ReKEW9iGoT","fLNg85iGN5","lkMUAgjUTu",
+"zmLYDI7p2a","TwanoyluBx","azIWp0BmCy","t59lRyEfy9","nnP8oThjNn","In3NSFGzgp","nnP8o5VZjS","yEfy9Cp3mZ","x3LDePOUYS","RxrsmJJs5m",
+"HP433uQIcz","n1pmObZLvS","gIYvEOxWIH","jzUqRydG8U","brhlQEoToP","9iGoTAIYUu","7Ow5CbZLvS","JkzUndmoS7","ZuDtDP6bcg","ECMvUOUYuF",
+"0Wr5y45cIH","kZANmGSQwj","Ul4a12hEEU","djsrv07n1c","1v5hHDG4sT","jSjS3Yf2Ec","pmeCd64s8N","SWfouGv3Fq","ulk41IBe8k","OxWIHI7p2a",
+"fFDrJVLTy6","ydG8ULbRTH","AIYUudhSuH","NOHszhi5X7","MojnPDLhzM","d7vjMFxX9q","gIYvEmX2GE","ix74rFVMxo","b29RJQ6hMC","SbRYyK20wK",
+"S77LHs93Ml","VLTy6uJScX","yofH38cVD3","BGaQYChuy3","5IhmG8xEKz","7Ow5CGSQwj","0PktI55rfB","29QAzPYBf4","Kr8ys24ARF","aDGtSS77LH",
+"pv0i7BFkb8","Rxrsm2hEEU","Qworu4W0Tl","hi5X7gdQsS","uupzksoy9t","16lHcs4786","1j5L8FwEJz","lkMUALDk6f","he9IAZv7z0","Mm8si2TRI7",
+"U3yw5AXpwE","aL6AJKZamH","0ao3laDGtS","QnJ1SYf2Ec","SmGzvSmGzv","bgJAzFxX9q","PYBf4POUYS","uJScXG1RhS","Cfgr3FFDui","vLsmSQWxoT",
+"SjskQEoToP","Chuy3dhSuH","IKxdLQnJ1S","5IhmGmz8gx","i7WMQTwano","W7cTsYOfrY","VNCPduoStw","5iGN5X6Pin","uvf7A55rfB","azIWplj07Q",
+"MmsIopFrrl","Cp3mZReKEW","UmaEvbgJAz","7hyVvatef2","Gv3FqThjNn","UlU3MGSQwj","rz7UtCK5W7","RsQUq2hEEU","2ZHdkFVMxo","zY1GYZhwG1",
+"lpF6WY1mC0","vkCHHv1Hln","Gv3FqhE1Ql","5iGN5AkKTk","uvf7A6AFT0","HfyNQtl72W","uvf7AgjUTu","uAWypbZLvS","lH1ktsuY4x","v2eC3qUJMd",
+"gf8rIblLA9","Ss0Zud7vjM","piJSkfaHir","I7p2aMGlTF","djsrvuAWyp","ZuDtD2TRI7","NhXduChuy3","zQt6QI7p2a","gdQsSciuWz","Ss0ZuFGzgp",
+"X6PinJJs5m","ni2v19GXkX","WMiS3LewvM","nnP8oIn3NS","SWfouAXpwE","FcWrWcQOnv","bZLvScShY2","0YAGHzY1GY","24ARFx3LDe","iwzGkaL6AJ",
+"jtn0X07n1c","ZUnqtMm8si","9iGoT24ARF","618DiZJTXH","mX2GEuupzk","8cVD3Chuy3","Yw2oUe6e4z","ECMvUzqH0W","1LB1LiwzGk","0KyfsWaWsv",
+"piJSkjeskS","tuDySyofH3","8hJdtciuWz","ulk41S2Dfu","zY1GYtAOsr","C2IrcvLsmS","a00b5nnP8o","2hEEU24ARF","YjB9t45cIH","ZzJHWSmGzv",
+"WDVWJaDGtS","5VZjSdmoS7","t59lRcShY2","vLsmSSmGzv","lweGy4W0Tl","CIShGogLgc","yluBxS2Dfu","YjB9toGu6x","fcJOyGrDg7","4QMc9JXljW",
+"ru4UGix74r","YjB9tjS1aj","NcICAGrDg7","s93MlfLNg8","2Yz7EWMiS3","suY4xOHaBz","SWfouO3iyQ","yToGWCIShG","QChxskB5nP","U3yw5v2eC3",
+"J2mQiMojnP","9y4lwAkKTk","yofH3W7cTs","CxVEfEoToP","S2Dfu2hEEU","pmeCdF6PT2","gf8rIFcWrW","7fsYMNxx9V","W3VFHrhl0J","Chuy3o8Uyd",
+"FLsphydG8U","WaWsvuN6r3","v8yFNlpF6W","d7vjMuLtKs","9iGoTMmKGJ","azIWpnlaBy","X6Pinlj07Q","FnPFBfqypy","jeskS4dEz6","AgJHQSbRYy",
+"FnPFBlweGy","uAWyppFrrl","hUTw7BbwgA","Kr8ysbZLvS","cShY2zY1GY","LewvMZUnqt","POUYSatef2","48cHLzbIYY","prNT69GXkX","SWfouxXTI4",
+"0ao3lyvOMI","S2Dfurhl0J","4W0TlgtCA5","xXTI4Nxx9V","FwEJzQ6Lix","9rlg9NhXdu","TwanotaOXK","tlILtQWxoT","m4bxUjzUqR","HRxd86q6L9",
+"B3qem8TxD7","mz8gxJIqXi","BGaQYhe9IA","djsrv5nmWv","SjskQO3iyQ","uAWyppv0i7","Y1mC0No0Qb","TCgPp0PktI","S2DfuhUTw7","MGlTFSs0Zu",
+"FwEJz5VZjS","Uvlv45Drn0","5Mg9roVQp6","prNT6YOfrY","JJs5my94nw","AmdQdRkQke","o8UydWaWsv","JIqXidhSuH","8RCUAn8pJ9","ZJTXHqUJMd",
+"ZJTXHtjQxs","ReKEWfFDrJ","k85Ae16lHc","IBe8km4bxU","7ku1p4dEz6","L7cGclViBv","2TRI7fmIK1","hYBCKaDGtS","Mkgy8n1pmO","RBhp0Cfgr3",
+"o8Uydlm0pD","aFFssy94nw","7lUXZaDGtS","kZANmOUqFM","d7vjMxciqp","zFgtBFVMxo","Mkgy8ydG8U","n8pJ9GWqqX","BCxeCOUqFM","UmaEvIn3NS",
+"8cVD36AFT0","ZuDtDv2eC3","v8yFNIKxdL","Pb1paVNCPd","dmoS7lH1kt","lsQGoKZamH","Yf2EcD6rBy","QYxC0prNT6","i7WMQEdBKc","Ta8f65Mg9r",
+"piJSkzmLYD","aL6AJS77LH","pWiOsYf2Ec","6q6L9dpe1v","7fsYMbZLvS","lViBvYf2Ec","9XyT9G1RhS","zz4ZU7fKYU","FGzgpDLhzM","MmKGJRxrsm",
+"v1Hln24ARF","7hyVv48cHL","Chuy38FmFH","FPfSEAOgEe","HRxd8pAhR1","Dz1R32TRI7","hUTw7rKDLJ","pT8wuCxVEf","HfyNQwDajX","AmdQdQYxC0",
+"M3zXLy94nw","CK5W7FPfSE","JKWYRt98iW","QssNCVIlwP","dmoS7FxX9q","ZUnqtQChxs","uoStwNxx9V","bgJAzvkCHH","pmeCdD6rBy","CNHmv24ARF",
+"MaJQsyvOMI","VjCZqOHaBz","M6qcGkB5nP","P6bcgKsjRK","FFDuiQssNC","55rfBuN6r3","CqqaDC2Irc","I7p2ax3LDe","gIYvEMaJQs","vOqCEcShY2",
+"aFFssQYxC0","lj07Q4QMc9","ru4UGuN6r3","WmadAZhwG1","Zv7z0tjQxs","QssNCPYBf4","he9IAi7WMQ","Ul4a1wiHrZ","0PktIM3zXL","lH1ktuJScX",
+"FjHXRJkzUn","IKxdLt59lR","jeskSLDk6f","QnJ1SQYxC0","WDVWJ9XyT9","nlaBy0PktI","RxrsmtAOsr","pvgjSpWiOs","14FLRVNCPd","YjB9tS2Dfu",
+"FwEJzQClRL","48cHLuupzk","J2mQiBpYhV","5VZjSrz7Ut","Y1mC0iwzGk","WaWsvoQ87r","bZLvSFhtgl","n8pJ9M3zXL","x3LDe1LB1L","FjHXR5drc6",
+"bgJAzpAhR1","4dEz6VNCPd","4dEz6Cp3mZ","9iGoTfmIK1","yToGWo8Uyd","aL6AJAXpwE","O3iyQogLgc","EOE1oTwano","VBjhzuN6r3","ZzJHWHP433",
+"l83Ud5drc6","hi5X76AFT0","y94nwGXdoH","WreyPThjNn","pmeCd5ZaEz","B3qemPOUYS","tjQxsxciqp","ZUnqtAOgEe","ulk41yofH3","2ZHdkHRxd8",
+"s4786AmdQd","jiVBPJkzUn","JXljWReKEW","Ss0Zu7ku1p","2Yz7EL7cGc","ThjNnhe9IA","RmDcrQbxXc","D6rBySmGzv","AgJHQEOE1o","sx5GlhUTw7",
+"MmsIoZzJHW","SjskQ8RCUA","8hJdtLbRTH","Y1mC0lViBv","ZuDtDiB08l","MmKGJKASQ8","0MR5Xhi5X7","d7vjMRACuj","nlaByHP433","0MR5XMmsIo",
+"Y1mC0mz8gx","RkQkeI7p2a","0h1b1mX2GE","9y4lw7Ow5C","9rlg9M6qcG","uoStwjzUqR","JIqXiCIShG","OxWIHoVQp6","BbwgAgtCA5","cL0aE1v5hH",
+"Ta8f67fsYM","x3LDeciuWz","yEfy9Yf2Ec","7fsYMd7vjM","FjHXRHlUbF","aez9y14FLR","prNT6Q6hMC","jfREuYOfrY","tvdkDdmoS7","4QMc9EdBKc",
+"1LB1LtAOsr","YOfrYB3qem","nlaBy0YAGH","7ku1p8xEKz","9iGoTuLtKs","v1Hln64s8N","uoStwt59lR","UlU3MTwano","lViBv580YD","qQxHPatef2",
+"HfyNQKZamH","xciqpwiHrZ","0KyfsbZLvS","MmKGJiB08l","ix74ry94nw","4dEz6uTacx","tl72WRzaZA","618DiJIqXi","GXdoH9XyT9","1v5hHyofH3",
+"atef2soy9t","1v5hHpvgjS","XyPZNtuDyS","0h1b1WaWsv","JXljWaez9y","FNYIMBGaQY","FnPFBvLsmS","8U2nUt59lR","MaJQsThjNn","5Drn0iqv4k",
+"faHirM3zXL","FwEJz0BmCy","xXTI4YjB9t","MaJQslj07Q","uPX7G8TxD7","AmdQdZhwG1","48cHLvOqCE","zz4ZUYjB9t","DQimp5ZaEz","I7p2aSs0Zu",
+"aez9y1j5L8","BCxeCprNT6","9rlg98hJdt","iB08lzqH0W","Dz1R3ZhwG1","k85AeMkgy8","hE1QlqQxHP","2Yz7Eulk41","0MR5XoVQp6","uZPqg6q6L9",
+"PYBf45nmWv","IKxdLhe9IA","a00b59eoRc","0MR5X8xEKz","b29RJwDajX","t59lRChuy3","gjUTuIn3NS","cQOnvBGaQY","CqqaDl83Ud","RmDcrblLA9",
+"RsQUqECMvU","ZUnqtlj07Q","EoToPfLNg8","yluBxThjNn","hE1Qlh1zcH","Cp3mZNcICA","uTacxKsjRK","HzZT8DQimp","RBhp0YOfrY","aL6AJv8yFN",
+"Gv3Fq3weIF","cL0aEk85Ae","Y1mC0QClRL","zY1GYEdBKc","blLA9RsQUq","MmKGJ5Drn0","JKWYRdQ586","xciqp4dEz6","BFkb8Z4I1v","G1RhSVBjhz",
+"AkKTkRkQke","ix74ruoStw","9y4lwWmadA","gf8rILbRTH","ciuWzZ4I1v","0Wr5yyToGW","FxX9qXflUq","uZPqg5Mg9r","tlILtXflUq","piJSkFVMxo",
+"qUJMd1LB1L","CIShG9XyT9","VLTy6v1Hln","ulk41QbxXc","NcICAyToGW","LbRTH7Ow5C","uAWypX6Pin","NAFuwGSQwj","iB08lGrDg7","5Drn0K4GS8",
+"AOgEeBGaQY","Y1mC0iqv4k","n1pmOzz4ZU","h1zcHC2Irc","7lUXZuLtKs","fcwDa5IhmG","uLtKs580YD","0ao3l3otm6","FNYIMpv0i7","rz7UtMezSW",
+"jS1ajuQIcz","0YAGHxXTI4","lj07QJRJQB","FFDuiuZPqg","WmadA5Drn0","MK07YvOqCE","pvgjS2hEEU","cShY27X3uy","Y1mC0jzUqR","RsQUqpmeCd",
+"wDajXgf8rI","oGu6xReKEW","tAOsrgf8rI","FFDui5nmWv","lCMxydpe1v","QWxoT0YAGH","faHirP6bcg","8RCUACxVEf","NOHszpAhR1","x3LDeWaim6",
+"7fsYMK4GS8","8FmFHBCxeC","FNYIMlH1kt","0MR5X0BmCy","OxWIHbZLvS","NAFuwVNCPd","DG4sT8cVD3","Y1mC0CK5W7","1j5L8CxVEf","WDVWJBbwgA",
+"fFDrJBFkb8","CK5W7RkQke","HP433JKWYR","jtn0X0Kyfs","MezSWAIYUu","mX2GE0PktI","ECMvUzmLYD","SbRYylkMUA","PYBf4cL0aE","EoToP618Di",
+"55rfBlViBv","NAFuwVerEA","jiVBPQClRL","uJScXVerEA","GrDg70Kyfs","hi5X78TxD7","sqVrfuZPqg","fqypy5ZaEz","dhSuHuPX7G","rhl0J4dEz6",
+"Ul4a1CIShG","wiHrZni2v1","64s8N0PktI","7ku1pQChxs","tAOsr5VZjS","YOfrY1j5L8","aDGtSU3yw5","8RCUAzmLYD","bZLvSuAWyp","yluBxlViBv",
+"tvdkD9iGoT","M6qcGEdBKc","lkMUAUlU3M","Uvlv4yToGW","NcICAFjHXR","16lHcpmeCd","CdyBVAmdQd","jeskSMkgy8","cmXIX0Kyfs","fmIK1lm0pD",
+"ZuDtDGv3Fq","EoToPNcICA","euZA5aL6AJ","NcICA7fsYM","pv0i7GXdoH","2TRI7yluBx","euZA5pWiOs","Pb1pablLA9","MojnPK20wK","0ao3lfqypy",
+"a00b5zmLYD","Q6hMC0h1b1","K4GS8RzaZA","7hyVvOUYuF","FcWrWrKDLJ","Vprf2580YD","vLsmSlH1kt","CIShGC2Irc","prNT6pFrrl","tlILt9iGoT",
+"FnPFBZJTXH","HfyNQdmoS7","WmadAvkCHH","t59lRNcICA","Q6hMCRmDcr","NOHszL7cGc","dhSuH16lHc","Yf2EcydG8U","Pb1pajiVBP","zqH0WOHaBz",
+"CIShGv1Hln","MK07YWPmlx","6AFT0FGzgp","EoToPX6Pin","piJSkvkCHH","8TxD7DcpWB","jzUqR8hJdt","t98iWcQOnv","16lHcoVQp6","hi5X75nmWv",
+"pWiOsMezSW","2Yz7EaL6AJ","VLTy6G1RhS","GXdoHk85Ae","v1Hlnsx5Gl","ZJTXHsx5Gl","m4bxU64s8N","QnJ1SDQimp","OxWIHuTacx","QworuazIWp",
+"7Ow5CdhSuH","azIWpgdQsS","s93MltuDyS","pT8wuSmGzv","v2eC3Yh1hF","zmLYDThjNn","HlUbFtvdkD","v2eC3y94nw","iwzGka00b5","QClRLtl72W",
+"rz7UtZUnqt","zFgtBqQxHP","CIShG1j5L8","2ZHdkTXQ0Z","gIYvETwano","uPX7GyEfy9","SWfouv1Hln","atef2uLtKs","gdQsSlkMUA","l83UdFcWrW",
+"KZamH9eoRc","VNCPde6e4z","hYBCK1LB1L","QClRLe6e4z","7hyVv64s8N","ciuWz580YD","OUqFMUvlv4","yluBxKASQ8","tuDySLDk6f","VjCZq9GXkX",
+"VNCPdFnPFB","cmXIXSjskQ","9eoRcVIlwP","fcJOy8TxD7","BCxeCkZANm","y94nwlViBv","POUYSdjsrv","QWxoTFPfSE","lpF6WYOfrY","pmeCdZUnqt",
+"AkKTkHRxd8","TCgPpl83Ud","ix74rOxWIH","FhtglMkgy8","a00b5ix74r","L7cGc5VZjS","AmdQdPb1pa","jtn0XFnPFB","SWfou9eoRc","29QAz5IhmG",
+"v2eC3RmDcr","MaJQsbrhlQ","gf8rI0MR5X","uAWypECMvU","oVQp6d85a9","yvOMIBCxeC","9XyT9U3yw5","EdBKcX6Pin","No0QbSjskQ","U3yw5uJScX",
+"n8pJ9n8pJ9","9XyT98hJdt","ZhwG1lViBv","uZPqg1j5L8","BbwgA6q6L9","9y4lwsx5Gl","4W0TlaDGtS","2Nslm8xEKz","7Ow5CjSjS3","azIWpcL0aE",
+"AmdQdECMvU","0PktIyvOMI","MGlTFjeskS","ydG8UAgJHQ","FnPFBbgJAz","nFqikNOHsz","qUJMd8RCUA","xciqpksJby","FVMxoQYxC0","i7WMQ55rfB",
+"ksJbyuQIcz","uZPqgAgJHQ","8RCUANcICA","B3qemM6qcG","B3qemfcJOy","taOXKcShY2","FFDuiQ6hMC","2Yz7ElkMUA","lsQGoFwEJz","AmdQd7X3uy",
+"t59lRpT8wu","5iGN5MaJQs","ciuWzi3pyd","WaWsvt98iW","CIShGtAOsr","AmdQd8cVD3","nFqikHfyNQ","4dEz68xEKz","RmDcrOUYuF","KZamHtlILt",
+"O3iyQJXljW","djsrvt98iW","nnP8o5iGN5","NAFuwVLTy6","0MR5XRzaZA","oVQp6ogLgc","v8yFNpT8wu","3otm6Z4I1v","JRJQBVBjhz","UlU3MqQxHP",
+"QssNCuupzk","oVQp6XflUq","QClRL29QAz","jfREu7lUXZ","0PktIguMb8","LbRTHTa8f6","QClRLqQxHP","uN6r3pAhR1","sx5GlFNYIM","QClRL9y4lw",
+"jS1ajRzaZA","hYBCKTa8f6","vLsmS9eoRc","VIlwPHRxd8","jiVBPQworu","kB5nPHP433","QssNCReKEW","Pb1paXflUq","Mm8sifcwDa","FcWrWhe9IA",
+"soy9tChuy3","uAWypy94nw","8cVD3B3qem","o8UydMm8si","VLTy6QChxs","RsQUqHlUbF","fmIK15nmWv","OUqFMJIqXi","24ARFrz7Ut","Oz8yZpT8wu",
+"tvdkD0Wr5y","IKxdLFPfSE","2DREsjS1aj","pvgjS4QMc9","OUYuFwiHrZ","oQ87rLDk6f","GXdoHqQxHP","Ss0Zu8U2nU","TwanoFFDui","rhl0J5VZjS",
+"bgJAz9rlg9","okgRiVjCZq","2DREsuvf7A","QChxsjeskS","TwanovOqCE","14FLRblLA9","OHaBzmz8gx","6AFT0lj07Q","GrDg75IhmG","fmIK1dhSuH",
+"MK07YgtCA5","QbxXcJKWYR","5drc6lkMUA","FjHXRRBhp0","gjUTuJkzUn","AIYUu4dEz6","wDajXCK5W7","QbxXcLDk6f","s93MlUmaEv","uPX7GQworu",
+"pv0i75VZjS","JRJQB4W0Tl","lpF6W48cHL","NcICAFLsph","VerEAdjsrv","tvdkDiqv4k","Fhtgl8TxD7","FjHXRjtn0X","yvOMIPYBf4","WPmlxaFFss",
+"i3pydaL6AJ","BGaQYru4UG","aFFssIKxdL","vLsmS7fsYM","gIYvEFFDui","NcICAvLsmS","NOHszpiJSk","8hJdtydG8U","2Yz7Elm0pD","2DREsTa8f6",
+"cShY2MmsIo","3otm6Pb1pa","IjTwPWMiS3","tAOsrlpF6W","brhlQjSjS3","pmeCd9iGoT","oVQp6JKWYR","lXFOBS2Dfu","SWfoulCMxy","Waim6BCxeC",
+"Uvlv4YOfrY","Q6hMCThjNn","FcWrWyluBx","Ul4a1dhSuH","SmGzvRzaZA","O3iyQAIYUu","Zv7z0BpYhV","gf8rIW3VFH","uN6r3pFrrl","Y1mC0FNYIM",
+"uPX7GZUnqt","GXdoH6q6L9","uQIczKASQ8","DcpWBGXdoH","uN6r3Zv7z0","y94nwiqv4k","Chuy3OHaBz","hUTw7jeskS","CqqaDG1RhS","AgJHQlweGy",
+"RBhp0WaWsv","fqypyW7cTs","16lHcjiVBP","HRxd8ZuDtD","07n1cK4GS8","zz4ZUStlDJ","9rlg9AgJHQ","qQxHPEdBKc","5nmWv9eoRc","bgJAzLbRTH",
+"RmDcrYf2Ec","YjB9tJXljW","W3VFHhe9IA","tvdkD4W0Tl","HzZT8Ul4a1","9rlg9AmdQd","pAhR17fKYU","7ku1paFFss","gdQsS8RCUA","64s8NbrhlQ",
+"y94nwnnP8o","0Wr5ytjQxs","BCxeCzmLYD","JXljWo8Uyd","3otm65Drn0","soy9tRACuj","UmaEvP6bcg","D6rByL7cGc","s4786QWxoT","SmGzvi3pyd",
+"i3pydhi5X7","brhlQZJTXH","BbwgAbgJAz","mX2GE64s8N","yEfy9nlaBy","OUqFMWmadA","SjskQCqqaD","AIYUuUlU3M","29QAzBCxeC","BbwgAZUnqt",
+"EoToPKASQ8","Pb1paYw2oU","iKqhrcQOnv","64s8NzbIYY","tuDySgIYvE","y94nwHlUbF","W3VFH64s8N","zHF1qogLgc","WreyPGXdoH","5Drn0RBhp0",
+"JKWYRlsQGo","WreyPW3VFH","AgJHQ2TRI7","45cIHqUJMd","G1RhSXyPZN","ZhwG1W7cTs","WDVWJ1v5hH","bZLvSFGzgp","lkMUA07n1c","i3pydNo0Qb",
+"dhSuHrhl0J","gIYvEazIWp","FcWrWWDVWJ","S77LHIKxdL","o8UydRACuj","FNYIMGSQwj","rhl0JGSQwj","ReKEWnFqik","hE1Qlsx5Gl","KZamHHfyNQ",
+"1LB1LNAFuw","ThjNnPYBf4","AIYUuHlUbF","cL0aExciqp","HzZT89eoRc","QbxXcMmKGJ","iB08llkMUA","ix74rqQxHP","jeskS2Nslm","5IhmGyofH3",
+"S77LHNAFuw","MmKGJ5ZaEz","h1zcHx3LDe","4W0TlSbRYy","bgJAzMmsIo","taOXKk85Ae","QChxsJXljW","QChxs5iGN5","C2IrcMmsIo","lkMUAazIWp",
+"FNYIMwDajX","6AFT0yluBx","Kr8ysW3VFH","DG4sT29QAz","pT8wuhUTw7","GXdoHfqypy","GrDg7zY1GY","m4bxUW3VFH","suY4xiwzGk","dQ586tjQxs",
+"O3iyQDcpWB","QWxoTBbwgA","0YAGHpv0i7","EoToPlCMxy","AXpwE4dEz6","uLtKsgjUTu","y94nwEdBKc","lCMxy5Drn0","FNYIMVerEA","oVQp6FFDui",
+"SbRYyQ6hMC","Yw2oU7ku1p","nnP8oL7cGc","YOfrYuJScX","9iGoTUvlv4","ciuWzFnPFB","618DiuTacx","2Nslmpv0i7","nFqikQbxXc","QYxC08TxD7",
+"RpBQmru4UG","7hyVvMm8si","QChxszY1GY","zmLYDHzZT8","t59lRVprf2","lsQGo7Ow5C","8U2nUQWxoT","9rlg9IKxdL","Q6Lixpv0i7","ZJTXHy94nw",
+"pmeCdChuy3","atef2oVQp6","M3zXLn8pJ9","QChxsPOUYS","d85a9Chuy3","GSQwjsoy9t","FhtglgIYvE","uQIczfFDrJ","Chuy3LbRTH","s7MxkFVMxo",
+"BFkb8B3qem","7ku1pTwano","WPmlxbZLvS","WDVWJ2ZHdk","AkKTkdQ586","tl72W0BmCy","s93MlM3zXL","1v5hH9GXkX","qUJMdZhwG1","QworuxXTI4",
+"pvgjSSbRYy","fmIK10Kyfs","XflUqCp3mZ","WDVWJWPmlx","vOqCE5Mg9r","gIYvEaez9y","8cVD30BmCy","ZhwG12hEEU","QWxoTsoy9t","GrDg7ECMvU",
+"m4bxUjS1aj","4dEz6LDk6f","guMb8Mm8si","ZUnqtFGzgp","jeskSFNYIM","ni2v124ARF","mz8gxuZPqg","rKDLJWaWsv","hYBCKAmdQd","Waim6faHir",
+"a00b54dEz6","1j5L8VerEA","0ao3ljzUqR","y94nwOUqFM","kB5nP2Nslm","Nxx9VS2Dfu","ZuDtDBFkb8","nlaByZJTXH","guMb80Wr5y","SWfouWDVWJ",
+"CxVEfpvgjS","pAhR1M6qcG","fFDrJn8pJ9","lCMxyJRJQB","uupzk48cHL","zY1GYBbwgA","bgJAzJkzUn","8xEKzMK07Y","ZzJHWVLTy6","D6rBy6AFT0",
+"9rlg9zHF1q","lpF6WjzUqR","zQt6QK4GS8","Gv3FqZJTXH","gf8rINAFuw","v2eC3G1RhS","uvf7AlViBv","m4bxU9y4lw","2Nslmzz4ZU","HRxd8mX2GE",
+"W7cTsCK5W7","uLtKsulk41","OxWIHCqqaD","tvdkDRsQUq","djsrvyToGW","ciuWzEOE1o","sqVrfmX2GE","qUJMdm4bxU","tjQxsAgJHQ","nlaBydpe1v",
+"NhXduuLtKs","8cVD3uvf7A","hYBCK8TxD7","5IhmGlXFOB","9GXkX29QAz","Cfgr3JJs5m","oVQp6lkMUA","NcICAs4786","azIWpIKxdL","zqH0WxXTI4",
+"uZPqgDQimp","QnJ1SAIYUu","0Wr5yK20wK","45cIHJXljW","kZANmQChxs","suY4xtlILt","14FLR07n1c","5Drn0tl72W","AOgEeFFDui","jS1ajX6Pin",
+"KsjRKTXQ0Z","ZzJHWO3iyQ","gdQsSOz8yZ","tvdkD5IhmG","Mm8sizmLYD","TCgPpuPX7G","2Nslm7Ow5C","euZA5AOgEe","HzZT8FxX9q","6q6L9FjHXR",
+"StlDJNOHsz","Ul4a17fsYM","8cVD3n1pmO","GrDg7bZLvS","5Mg9rWaWsv","8TxD7CxVEf","VerEAk85Ae","oVQp6FGzgp","t98iWatef2","LewvMJ2mQi",
+"No0QbUl4a1","W3VFHEOE1o","wiHrZFLsph","6q6L9CqqaD","FFDuiHfyNQ","iwzGkAmdQd","29QAzguMb8","ZuDtDl83Ud","M6qcGNhXdu","cL0aERpBQm",
+"vkCHHS77LH","WmadA55rfB","MGlTFokgRi","XyPZNpAhR1","No0Qb6AFT0","suY4xXyPZN","Ul4a1uZPqg","2hEEUqQxHP","FjHXRCK5W7","9GXkXjiVBP",
+"ydG8UXflUq","Nxx9VFFDui","fLNg8ThjNn","pmeCdUvlv4","618DiEdBKc","xXTI4Mm8si","HRxd8lXFOB","9eoRcguMb8","29QAzIn3NS","48cHLW3VFH",
+"4dEz6SmGzv","FxX9q2ZHdk","Uvlv4tAOsr","POUYSpWiOs","1v5hHUlU3M","e6e4zfLNg8","a00b548cHL","14FLRxXTI4","0MR5Xi3pyd","piJSkbZLvS",
+"7lUXZ9iGoT","Y1mC05IhmG","lXFOB2TRI7","dmoS707n1c","StlDJAXpwE","tvdkDAXpwE","e6e4zK20wK","OUqFMUl4a1","9y4lwD6rBy","Y1mC0ZUnqt",
+"64s8N5VZjS","FwEJzVIlwP","Y1mC0KASQ8","Yf2EcokgRi","8cVD3BpYhV","x3LDepiJSk","8RCUA1v5hH","LDk6fUl4a1","oVQp6t59lR","4QMc9Z4I1v",
+"nnP8ouQIcz","rhl0JGWqqX","0BmCyhe9IA","oGu6xqQxHP","0ao3lB3qem","AXpwE55rfB","07n1c0YAGH","uZPqg5IhmG","618DiWDVWJ","2TRI7fqypy",
+"Yf2Ecaez9y","BCxeCuvf7A","M6qcGzQt6Q","yvOMICxVEf","4W0TlPOUYS","YjB9t2Nslm","Uvlv4v2eC3","SWfoun8pJ9","WreyPD6rBy","iKqhrjiVBP",
+"RBhp09eoRc","0YAGHTwano","nnP8oHfyNQ","5Drn0s7Mxk","hSSvQdjsrv","iB08ljiVBP","zbIYYulk41","P6bcgFnPFB","FnPFBYw2oU","BCxeC0h1b1",
+"NcICAuvf7A","ZUnqtFNYIM","zbIYYhE1Ql","8RCUAFLsph","xReecfaHir","MGlTFK20wK","29QAz1LB1L","MezSWh1zcH","gdQsSZJTXH","FjHXROUYuF",
+"618Di5Drn0","uZPqglm0pD","jSjS3HfyNQ","hUTw7bZLvS","lm0pDWaim6","AkKTkGXdoH","16lHcLbRTH","1j5L8lm0pD","l83UdSmGzv","n1pmOQClRL",
+"580YDt59lR","qUJMdmX2GE","HzZT8VerEA","y94nw9XyT9","dmoS7Mm8si","mX2GEcQOnv","fqypyZzJHW","ni2v1WPmlx","CIShG3weIF","hYBCKdjsrv",
+"D6rByEdBKc","HRxd8zHF1q","RsQUqS77LH","1j5L864s8N","blLA9pT8wu","8hJdtfLNg8","MmsIouN6r3","lH1ktAkKTk","lXFOBsqVrf","Vprf2yofH3",
+"9eoRcMGlTF","Nxx9VtvdkD","8TxD79rlg9","CqqaDRBhp0","tuDySlpF6W","YjB9tIRh48","uN6r3BFkb8","zFgtBKr8ys","hi5X7IRh48","zz4ZUzmLYD",
+"nFqikMaJQs","CxVEfDQimp","S77LHgjUTu","L7cGc0Wr5y","OHaBz5ZaEz","7hyVv4QMc9","Yh1hFGWqqX","nnP8o14FLR","Uvlv4W3VFH","n8pJ97X3uy",
+"FnPFBJKWYR","3weIFGrDg7","FFDuiFPfSE","yofH3F6PT2","SWfou0YAGH","BFkb8aDGtS","QChxsqUJMd","ZuDtDcL0aE","taOXKatef2","hi5X7CqqaD",
+"9y4lwCIShG","FjHXRPYBf4","Cp3mZNo0Qb","d7vjM24ARF","D6rByMm8si","X6Pinatef2","y94nws93Ml","qaofNuoStw","lViBv7hyVv","0h1b1RsQUq",
+"NOHszD6rBy","O3iyQChuy3","8RCUA6q6L9","X6PinMezSW","zHF1qRzaZA","FVMxoyofH3","FNYIMlj07Q","JRJQBt98iW","580YDjSjS3","618Di5VZjS",
+"6q6L99iGoT","suY4x9rlg9","3weIFAkKTk","JXljWQworu","jSjS3Dz1R3","i3pydWaWsv","DLhzMs4786","Dz1R3ZuDtD","FxX9q6AFT0","uoStwjtn0X",
+"k85Ae0BmCy","JXljWPb1pa","aFFss2TRI7","AkKTkYjB9t","pWiOsCK5W7","9XyT9oQ87r","O3iyQgdQsS","KsjRKC2Irc","m4bxUEOE1o","HfyNQAIYUu",
+"OUqFMEdBKc","0ao3lpiJSk","2hEEUWreyP","FwEJz3otm6","9XyT96q6L9","QYxC0KASQ8","Kr8yswiHrZ","8RCUAsoy9t","euZA57lUXZ","LDk6fQ6hMC",
+"XyPZNYw2oU","QChxsX6Pin","DG4sTKZamH","fqypy8cVD3","uQIczMm8si","29QAz5ZaEz","lsQGolH1kt","8cVD3Ss0Zu","M3zXLRzaZA","U3yw58cVD3",
+"gf8rIThjNn","aFFss5Mg9r","mX2GEaez9y","hE1QlM6qcG","jzUqRyEfy9","RxrsmMkgy8","Gv3FqGv3Fq","8RCUA6AFT0","wDajXsqVrf","Ul4a17hyVv",
+"zz4ZUcL0aE","DcpWBnlaBy","lweGyXflUq","O3iyQuN6r3","AmdQdgIYvE","Mkgy8tvdkD","lj07QuPX7G","BGaQYUl4a1","VNCPdguMb8","s4786xciqp",
+"2hEEUHP433","RzaZAAmdQd","WPmlxFwEJz","HP433pv0i7","BFkb8lsQGo","NOHszIRh48","C2IrcpmeCd","VNCPd4dEz6","DcpWBRzaZA","Kr8yspiJSk",
+"2ZHdkCNHmv","t98iWZhwG1","IjTwP7fKYU","JJs5mhUTw7","tl72WWPmlx","ThjNni3pyd","Y1mC0IBe8k","5iGN5uQIcz","KASQ87lUXZ","QChxsJkzUn",
+"i7WMQDG4sT","1v5hHRmDcr","wDajXJJs5m","TXQ0ZMaJQs","RkQkefcJOy","In3NSbrhlQ","8TxD72DREs","JXljWtl72W","07n1cFxX9q","b29RJpAhR1",
+"zHF1qIKxdL","W3VFHazIWp","faHirmz8gx","xciqpfcwDa","55rfB16lHc","JRJQBWDVWJ","MezSWlH1kt","gIYvE0Wr5y","LDk6fKr8ys","FLsphBGaQY",
+"7fsYMbrhlQ","ix74rokgRi","I7p2aWMiS3","hE1QlZUnqt","16lHczz4ZU","zqH0WBCxeC","4dEz6fcJOy","G1RhSuPX7G","x3LDetAOsr","L7cGcVprf2",
+"KASQ8sx5Gl","MmKGJ3weIF","In3NSYjB9t","M3zXLFNYIM","LbRTHFNYIM","vOqCE0YAGH","EdBKcdhSuH","Q6hMCAXpwE","FVMxo1LB1L","yEfy9WPmlx",
+"QworunnP8o","DQimptvdkD","FhtglEoToP","tl72W5Namm","Q6hMCFhtgl","BbwgA5IhmG","ulk414dEz6","8hJdtzqH0W","Gv3FqiKqhr","0Wr5ypT8wu",
+"VjCZqSmGzv","a00b5kZANm","24ARFtAOsr","2Yz7EVBjhz","JRJQBxReec","hYBCKy94nw","FcWrWAOgEe","UmaEvFVMxo","jfREuCNHmv","VerEAJXljW",
+"VNCPdPb1pa","FwEJzaez9y","o8UydS77LH","tl72WpiJSk","fqypyuQIcz","3weIFZUnqt","tl72WJXljW","KZamHCK5W7","JKWYR1LB1L","Ss0ZupAhR1",
+"lXFOBDQimp","i3pydEoToP","DLhzMJXljW","KZamHJKWYR","sqVrfVerEA","45cIH8TxD7","Zv7z0guMb8","ZzJHWoGu6x","Pb1paG1RhS","Kr8ys2Yz7E",
+"StlDJlH1kt","yEfy9uTacx","hYBCKUlU3M","ydG8Us7Mxk","AmdQdWmadA","CNHmvhe9IA","FVMxoGWqqX","Ul4a1VIlwP","RzaZAjtn0X","djsrvZhwG1",
+"5Drn0b29RJ","euZA5uQIcz","8U2nUtvdkD","x3LDe55rfB","Dz1R3gIYvE","64s8Nd7vjM","QssNCFxX9q","4QMc9t98iW","7hyVv6AFT0","tvdkDjiVBP",
+"n1pmOhSSvQ","64s8NStlDJ","tvdkD5drc6","K4GS8yluBx","LDk6fVNCPd","POUYSMm8si","9XyT92TRI7","n1pmOxReec","0YAGHMGlTF","BFkb8zmLYD",
+"k85AeksJby","lViBvZ4I1v","iB08lzHF1q","k85Aeix74r","KZamHzqH0W","1v5hH1v5hH","fcJOyFhtgl","O3iyQuJScX","6AFT0FwEJz","7ku1pDG4sT",
+"8FmFHVerEA","gtCA5gtCA5","lm0pDS2Dfu","aez9yVBjhz","AmdQd5nmWv","rKDLJazIWp","oQ87rLbRTH","iKqhrokgRi","zbIYYWMiS3","ECMvUiKqhr",
+"8xEKzs4786","ZJTXHyluBx","QChxsDz1R3","TXQ0ZFLsph","K20wK618Di","HlUbFhSSvQ","soy9ttvdkD","bZLvSVIlwP","MmsIooGu6x","LbRTHSmGzv",
+"lViBvB3qem","RzaZAx3LDe","Zv7z0i7WMQ","lpF6WHlUbF","d85a9brhlQ","Q6LixuQIcz","KASQ8lweGy","RsQUqZuDtD","lweGyfcwDa","D6rBy4dEz6",
+"HzZT85Namm","m4bxUBpYhV","2Nslm64s8N","NcICAguMb8","aez9ypFrrl","WmadAUlU3M","xReecQChxs","fFDrJThjNn","Oz8yZTa8f6","okgRigf8rI",
+"2NslmyofH3","Ss0ZuO3iyQ","s4786WDVWJ","FLsph0Wr5y","faHirVNCPd","uupzkZ4I1v","QssNCMezSW","jfREumz8gx","MmKGJiwzGk","yluBxXflUq",
+"s4786zbIYY","Cp3mZv1Hln","JKWYRlkMUA","rKDLJ7fsYM","NAFuwQYxC0","OUqFMiqv4k","6q6L9taOXK","D6rBy5nmWv","WmadAFGzgp","NhXduY1mC0",
+"IBe8k0Kyfs","0h1b1QbxXc","vLsmSWreyP","6q6L9nnP8o","6AFT0faHir","AmdQdiwzGk","v1Hln580YD","RmDcryluBx","uupzkaez9y","J2mQiZv7z0",
+"XyPZNHRxd8","qUJMdVBjhz","FhtglLDk6f","oQ87rpWiOs","SjskQAkKTk","bZLvSdhSuH","KsjRKGWqqX","okgRiStlDJ","ZUnqt4W0Tl","X6PinZzJHW",
+"StlDJaL6AJ","AOgEeJIqXi","45cIH2Yz7E","FhtgluoStw","LbRTH5Namm","FPfSEvkCHH","uAWypqaofN","MK07YjiVBP","cShY2RpBQm","BbwgAKr8ys",
+"BpYhVL7cGc","OUYuFQnJ1S","WMiS3uvf7A","blLA9HRxd8","YjB9tqUJMd","lpF6WazIWp","FGzgp07n1c","WPmlxSs0Zu","Ss0ZulXFOB","JKWYRzFgtB",
+"piJSk7Ow5C","ciuWzNxx9V","blLA9B3qem","3weIFi3pyd","Yh1hFF6PT2","Ss0ZuQWxoT","ReKEWcQOnv","JIqXiOz8yZ","lj07QyvOMI","n1pmOlXFOB",
+"lCMxyzqH0W","D6rByQbxXc","Cp3mZuAWyp","h1zcHJRJQB","suY4x2Yz7E","tlILtPOUYS","tlILtBFkb8","xXTI40BmCy","fFDrJ5VZjS","aL6AJhSSvQ",
+"i7WMQMmKGJ","OUqFMOUqFM","wDajX2DREs","F6PT2hE1Ql","cShY2BFkb8","TXQ0ZdQ586","Pb1pa16lHc","uvf7AprNT6","atef2MK07Y","2Nslm2ZHdk",
+"dmoS7BFkb8","aFFssBGaQY","rz7UtSbRYy","OxWIHNxx9V","uLtKsydG8U","2TRI7BpYhV","J2mQitjQxs","lm0pDCK5W7","8hJdtiwzGk","ksJbybgJAz",
+"yvOMIgIYvE","JkzUnTwano","zqH0W8RCUA","VjCZq7hyVv","v8yFNpvgjS","AIYUu07n1c","45cIHNOHsz","jeskSfcJOy","suY4xTa8f6","HP433bZLvS",
+"64s8NvLsmS","5NammSWfou","gtCA5OUYuF","RBhp0kZANm","ciuWzokgRi","RkQke9rlg9","lkMUAni2v1","RBhp0xXTI4","s93MlSjskQ","fcwDasx5Gl",
+"2TRI7atef2","ogLgc8xEKz","tAOsrzqH0W","yEfy9I7p2a","2Nslmd85a9","WDVWJYf2Ec","1v5hHWreyP","5iGN5F6PT2","o8Uyd2DREs","FFDui29QAz",
+"CIShGm4bxU","0YAGHgtCA5","8hJdt0h1b1","dhSuHxReec","C2IrclkMUA","okgRiNxx9V","yEfy9JRJQB","h1zcHQ6hMC","8U2nUbZLvS","2hEEUAkKTk",
+"Uvlv4GrDg7","lViBvGrDg7","he9IAvOqCE","brhlQFjHXR","faHirix74r","uN6r3S2Dfu","FVMxozY1GY","uAWypyToGW","5ZaEzAOgEe","gIYvEIjTwP",
+"Y1mC0suY4x","ulk41HlUbF","gIYvEJRJQB","F6PT29GXkX","yvOMIqaofN","DLhzMni2v1","QbxXc1LB1L","0MR5XPOUYS","suY4x1j5L8","tvdkDcL0aE",
+"Kr8ysQClRL","y94nwMmsIo","HRxd8UmaEv","FPfSEEOE1o","WDVWJqaofN","Oz8yZQnJ1S","P6bcglkMUA","pmeCd618Di","5Drn09iGoT","OUqFMUmaEv",
+"MK07Ydjsrv","s93Ml48cHL","U3yw5CxVEf","TwanopAhR1","GWqqXLDk6f","FFDui7fKYU","Ss0Zu9iGoT","mX2GEzqH0W","pWiOszHF1q","9GXkXQ6Lix",
+"SmGzvjfREu","qUJMdBFkb8","tvdkD6AFT0","X6PincmXIX","zqH0WIKxdL","pAhR1iB08l","9eoRcuN6r3","AgJHQ6AFT0","IRh48jzUqR","HfyNQSjskQ",
+"a00b5ydG8U","Kr8yspAhR1","guMb8yluBx","JXljWxciqp","pFrrlnFqik","lCMxyFnPFB","L7cGcFFDui","v8yFN2hEEU","QssNC2DREs","7lUXZhe9IA",
+"2TRI7jS1aj","0ao3lvOqCE","48cHLiB08l","VIlwPydG8U","GrDg7JIqXi","uAWyp5nmWv","Waim6FxX9q","TXQ0Zlj07Q","JkzUn2hEEU","euZA54W0Tl",
+"8cVD3d7vjM","8cVD37hyVv","djsrvlsQGo","vLsmSNcICA","uPX7GFGzgp","UlU3M2hEEU","nlaByIBe8k","piJSkpFrrl","SmGzvjzUqR","uJScXWaWsv",
+"lXFOBdQ586","xReecJIqXi","nnP8opAhR1","yluBx1LB1L","Yh1hFKZamH","nnP8oMmKGJ","618Dis93Ml","YOfrYuLtKs","n8pJ9jS1aj","uvf7AOxWIH",
+"dQ586ZUnqt","e6e4z9XyT9","pv0i7yEfy9","AOgEe29QAz","fLNg8G1RhS","AXpwEF6PT2","jeskSS77LH","0ao3lS77LH","blLA9lsQGo","h1zcHsx5Gl",
+"BCxeCfmIK1","aL6AJQYxC0","jzUqR9y4lw","iwzGkXflUq","8xEKz0MR5X","VjCZqLDk6f","rKDLJQYxC0","YOfrYmX2GE","iwzGklkMUA","FPfSE5iGN5",
+"Nxx9VfFDrJ","NAFuwfqypy","2NslmiwzGk","qQxHPQWxoT","a00b5IjTwP","azIWpKASQ8","kZANmVLTy6","DG4sT0PktI","x3LDeWaWsv","euZA5d7vjM",
+"W7cTsuLtKs","n8pJ91LB1L","uPX7GAXpwE","n8pJ9IKxdL","qQxHP5drc6","jSjS37hyVv","0KyfsF6PT2","uoStwVNCPd","5iGN5qQxHP","U3yw5hE1Ql",
+"Ss0ZueuZA5","iwzGk7fKYU","yEfy9KASQ8","RkQkeRsQUq","zbIYYru4UG","SmGzvZv7z0","K20wK7Ow5C","ogLgcNhXdu","No0QbSmGzv","nlaByDz1R3",
+"yvOMIOHaBz","gjUTuSs0Zu","14FLRuZPqg","soy9togLgc","gdQsSGWqqX","EoToPDQimp","0Kyfs4W0Tl","pAhR1l83Ud","EoToPbrhlQ","l83UdGXdoH",
+"0YAGHFLsph","lXFOBStlDJ","Vprf2MK07Y","hSSvQMaJQs","JKWYRzQt6Q","580YDjiVBP","lpF6WAXpwE","07n1cQnJ1S","s7Mxk8cVD3","xReecMmsIo",
+"QWxoTfcJOy","ksJby45cIH","EOE1omz8gx","4dEz6e6e4z","cQOnvC2Irc","Vprf2bZLvS","No0Qbsx5Gl","ZUnqtdhSuH","0ao3lRACuj","KsjRKtvdkD",
+"5VZjSEoToP","O3iyQzmLYD","kB5nPZuDtD","l83UdZhwG1","Dz1R3lm0pD","fqypy0BmCy","Gv3Fq5IhmG","jiVBPAmdQd","Mm8sipv0i7","VjCZqCfgr3",
+"29QAz7lUXZ","y94nwzbIYY","VNCPdoGu6x","pmeCdrKDLJ","MezSW9y4lw","yluBxMK07Y","G1RhSqQxHP","m4bxUPYBf4","b29RJKASQ8","azIWpkB5nP",
+"yEfy9aL6AJ","Gv3FqC2Irc","1v5hHO3iyQ","blLA90Wr5y","kB5nP0Kyfs","XyPZNJKWYR","AOgEeFxX9q","DQimp0Wr5y","QChxsCNHmv","MojnPCxVEf",
+"2NslmGrDg7","EOE1oCIShG","ZhwG1RBhp0","0Wr5y3weIF","tAOsrGSQwj","Ul4a14W0Tl","gdQsSlViBv","Oz8yZyofH3","gjUTuJXljW","YOfrYGv3Fq",
+"JIqXiQ6hMC","5nmWvY1mC0","tuDySfaHir","VBjhzgdQsS","jzUqRcQOnv","dpe1vNhXdu","zbIYY55rfB","QnJ1SuoStw","Nxx9VJkzUn","NcICAzQt6Q",
+"TCgPpM3zXL","5iGN5IRh48","iqv4kYf2Ec","FhtgldhSuH","0KyfsjS1aj","Waim6Vprf2","5VZjSPYBf4","8FmFHFnPFB","tAOsr5Drn0","atef25Mg9r",
+"xReecSjskQ","t98iW5IhmG","oQ87r1j5L8","Nxx9VqUJMd","QWxoT8cVD3","uvf7ACp3mZ","ix74rVLTy6","FjHXR9XyT9","d85a95Mg9r","8U2nUuLtKs",
+"i7WMQKsjRK","FVMxoHzZT8","CIShGguMb8","QworuzFgtB","xXTI4Oz8yZ","7fKYUyluBx","GSQwjQssNC","Yw2oUqUJMd","JIqXiBFkb8","rz7UtReKEW",
+"jeskSVBjhz","Ul4a12Yz7E","soy9tnlaBy","S2DfuAOgEe","XyPZNAIYUu","Ta8f6ydG8U","gjUTu5VZjS","d7vjMfcwDa","lpF6WVerEA","KZamHYh1hF",
+"2TRI707n1c","cQOnvPOUYS","cmXIXGWqqX","M6qcGrz7Ut","HRxd8o8Uyd","7lUXZCp3mZ","oGu6xFGzgp","SbRYyuPX7G","iKqhr6AFT0","2TRI7l83Ud",
+"FLsphiKqhr","DG4sTru4UG","9iGoTFPfSE","i3pydJXljW","zqH0WJXljW","pFrrlrz7Ut","aDGtSPOUYS","NOHszdpe1v","4dEz60Kyfs","I7p2aBbwgA",
+"8TxD7jeskS","lCMxyW3VFH","GrDg7djsrv","CqqaDKsjRK","Ul4a1vOqCE","FLsphQClRL","vkCHHZzJHW","o8UydnlaBy","WreyP1v5hH","JXljWuJScX",
+"5Mg9r2ZHdk","L7cGcCIShG","VBjhzd7vjM","GSQwjEdBKc","zY1GYtlILt","Ta8f6dQ586","SmGzvpiJSk","7lUXZWMiS3","RmDcrEoToP","s4786FcWrW",
+"oGu6xWPmlx","ydG8UFwEJz","gdQsSrKDLJ","9XyT99XyT9","RpBQmGSQwj","zFgtB5IhmG","X6PinWmadA","FLsphPOUYS","tuDySoQ87r","bZLvSIKxdL",
+"BbwgARxrsm","fFDrJhe9IA","uTacxdhSuH","fFDrJrhl0J","i3pydNxx9V","9y4lw5IhmG","BCxeCXflUq","lXFOBv2eC3","5Drn0Waim6","Ta8f6Rxrsm",
+"rz7UtblLA9","uvf7AhSSvQ","ix74ri3pyd","MmsIoKASQ8","lweGy2DREs","G1RhSReKEW","HP433oVQp6","uoStwF6PT2","dhSuHuQIcz","qUJMdtaOXK",
+"tlILtIn3NS","5VZjS580YD","AkKTkSjskQ","MK07YHRxd8","TXQ0Z07n1c","Mm8six3LDe","oVQp68U2nU","0Wr5yVBjhz","CdyBVdmoS7","618DiK4GS8",
+"M3zXLZUnqt","NhXdurhl0J","4dEz68TxD7","XflUq9XyT9","580YDYh1hF","FwEJzblLA9","AkKTk3weIF","tvdkDK4GS8","FNYIMaDGtS","d7vjM0h1b1",
+"fcJOy9XyT9","VBjhz2hEEU","7fsYMv2eC3","07n1cCIShG","RpBQmFjHXR","Vprf2GSQwj","tAOsrjS1aj","Cp3mZ55rfB","QChxsHzZT8","tjQxsFxX9q",
+"WMiS3VLTy6","MmsIoRBhp0","Nxx9VnnP8o","MK07YcQOnv","QnJ1SKr8ys","AIYUuMK07Y","uJScXFFDui","FwEJzQ6hMC","cL0aEJKWYR","14FLRNAFuw",
+"yvOMIlXFOB","LewvMJIqXi","MezSWJKWYR","JRJQBGv3Fq","RkQkeDcpWB","D6rByGrDg7","FwEJzhe9IA","lkMUAoVQp6","QworuDLhzM","vkCHHHP433",
+"ZUnqtWPmlx","YOfrY8FmFH","G1RhSGSQwj","8xEKzMm8si","FVMxojfREu","In3NSjfREu","7lUXZUmaEv","wiHrZFnPFB","L7cGcO3iyQ","2Yz7ECxVEf",
+"djsrv0BmCy","jzUqRFLsph","2NslmIn3NS","lm0pDdjsrv","XyPZNAgJHQ","tl72WVjCZq","FwEJz4dEz6","FcWrWyvOMI","IjTwP7hyVv","Chuy3580YD",
+"m4bxU5Mg9r","Pb1paLbRTH","ydG8UBGaQY","vkCHHs7Mxk","HzZT845cIH","fmIK1Dz1R3","NOHszgdQsS","VLTy6Dz1R3","GWqqXhSSvQ","VIlwPHzZT8",
+"7lUXZlXFOB","VjCZqNAFuw","uLtKsWPmlx","nnP8orhl0J","uLtKsWmadA","AgJHQlCMxy","AmdQduTacx","XflUqOUqFM","Q6LixoQ87r","JIqXivLsmS",
+"48cHLOUqFM","8cVD3suY4x","7fKYUnnP8o","ydG8UCfgr3","NOHsz5drc6","gIYvE48cHL","9y4lw3weIF","gtCA5faHir","cQOnvIRh48","VerEApFrrl",
+"8U2nU5Drn0","OUqFMo8Uyd","xReectvdkD","In3NSHRxd8","nFqiklsQGo","zmLYDYOfrY","ni2v1UlU3M","iwzGk0MR5X","5VZjSVprf2","hE1QlSs0Zu",
+"tvdkDIKxdL","QClRLJkzUn","QClRLrz7Ut","ZJTXHksJby","k85AekB5nP","v2eC3CxVEf","0PktIiwzGk","SbRYyulk41","n8pJ9CxVEf","6q6L9okgRi",
+"DG4sTix74r","aez9ylsQGo","L7cGc6q6L9","vOqCEk85Ae","580YDblLA9","i7WMQy94nw","zY1GYaDGtS","5VZjSaFFss","FnPFBsuY4x","tl72WcmXIX",
+"P6bcgcQOnv","iKqhr45cIH","5NammUl4a1","AIYUuMaJQs","QbxXcNOHsz","AkKTkpv0i7","FLsphQbxXc","zY1GYQClRL","FFDuiC2Irc","QnJ1SSbRYy",
+"uAWypiqv4k","fLNg8uJScX","UlU3MoGu6x","nnP8oQbxXc","Zv7z0xReec","0ao3lMGlTF","TXQ0Z8xEKz","8U2nUs4786","iB08lVIlwP","5IhmGO3iyQ",
+"HfyNQqUJMd","VBjhzFcWrW","jS1ajQClRL","tuDySVerEA","CIShGru4UG","t59lRs7Mxk","M3zXLTXQ0Z","JXljWzqH0W","lsQGo9rlg9","pT8wuv1Hln",
+"WMiS3IjTwP","Mm8siNhXdu","8FmFHWDVWJ","580YDnlaBy","Q6hMCuJScX","xciqpHzZT8","faHir55rfB","MGlTFNcICA","yvOMIFFDui","618DiI7p2a",
+"NAFuwQ6Lix","MojnP0BmCy","RpBQm8hJdt","dmoS7e6e4z","I7p2a3weIF","UmaEvCK5W7","taOXK1v5hH","t59lRRmDcr","FVMxowiHrZ","IRh48nlaBy",
+"s47868TxD7","nnP8ouvf7A","lm0pD7fKYU","t59lRguMb8","v8yFNe6e4z","5Drn0AOgEe","Ta8f6xReec","RACujt59lR","Dz1R3L7cGc","SjskQBFkb8",
+"VLTy6d7vjM","7fsYMAOgEe","jeskSSs0Zu","MezSWK4GS8","uvf7Av1Hln","cShY2lkMUA","FxX9qCdyBV","pFrrlSjskQ","SjskQzz4ZU","4QMc9C2Irc",
+"xReec16lHc","PYBf4Ta8f6","Q6hMCGv3Fq","pT8wuFwEJz","jSjS39GXkX","dmoS7n1pmO","5IhmGAIYUu","FVMxoThjNn","EdBKcksJby","6q6L9oQ87r",
+"NcICANcICA","7ku1pVIlwP","HP4339iGoT","o8UydVBjhz","LewvMQssNC","aDGtSBbwgA","ksJby0Wr5y","VBjhzprNT6","POUYSHP433","RBhp0yvOMI",
+"RxrsmNAFuw","mz8gxB3qem","djsrvvLsmS","GXdoH7ku1p","X6PinMm8si","JXljW0ao3l","7X3uy9y4lw","fcwDaUl4a1","9XyT9hSSvQ","Qworuxciqp",
+"vLsmSrhl0J","Ss0ZuqUJMd","lXFOB48cHL","uoStweuZA5","C2IrcFhtgl","zQt6Q9GXkX","4QMc9LbRTH","yEfy9QbxXc","rKDLJRpBQm","XflUqzHF1q",
+"5Mg9r9rlg9","jfREuFNYIM","5iGN5uJScX","Chuy3J2mQi","SmGzvJRJQB","OUYuFdjsrv","y94nwpT8wu","5NammFwEJz","5drc6piJSk","jtn0XuQIcz",
+"ThjNnLewvM","euZA51LB1L","RpBQmRpBQm","JXljWOHaBz","OUYuFlj07Q","BCxeCCNHmv","jzUqRLbRTH","RzaZA7Ow5C","F6PT2LDk6f","brhlQMmsIo",
+"Ul4a1Zv7z0","5iGN5ydG8U","HRxd8FwEJz","VNCPd2ZHdk","VIlwPB3qem","ZzJHWG1RhS","aFFssrz7Ut","uvf7AwiHrZ","mz8gxJJs5m","jeskSydG8U",
+"m4bxUSbRYy","Chuy3bgJAz","tuDyS5VZjS","Q6LixjfREu","CK5W7MmsIo","hi5X7AXpwE","5Drn0JkzUn","NcICAhSSvQ","55rfByToGW","jeskS8FmFH",
+"UmaEvzQt6Q","pvgjS1LB1L","7hyVvGWqqX","CNHmv0MR5X","0BmCyMK07Y","DQimpAgJHQ","MmsIoNhXdu","i7WMQoQ87r","2NslmwiHrZ","IjTwP580YD",
+"FjHXRZ4I1v","2ZHdk48cHL","iKqhrjeskS","hYBCKOHaBz","SWfouReKEW","m4bxUWreyP","07n1cY1mC0","zQt6QydG8U","Uvlv429QAz","aez9yCp3mZ",
+"WmadAv1Hln","DG4sTQworu","GSQwjgjUTu","fcwDa14FLR","Ul4a1Kr8ys","NhXduRxrsm","FcWrW0h1b1","C2Irc8cVD3","VjCZq8U2nU","VBjhzhYBCK",
+"ZhwG1h1zcH","tl72WThjNn","guMb85Namm","bgJAz29QAz","FnPFBi3pyd","oGu6xW3VFH","yEfy9RBhp0","07n1c9y4lw","NOHsz9iGoT","o8UydSWfou",
+"8FmFHhYBCK","SmGzvydG8U","rhl0JQClRL","o8UydChuy3","uupzkv2eC3","cShY2DG4sT","5drc6nnP8o","FNYIMFhtgl","5drc6WPmlx","KsjRK8RCUA",
+"iwzGkSbRYy","XflUqIKxdL","4dEz6gtCA5","l83UdlpF6W","fcwDaZ4I1v","zqH0WzqH0W","5Mg9rMK07Y","1j5L82TRI7","4W0TlMK07Y","7fsYMzz4ZU",
+"pvgjSHRxd8","5drc6lj07Q","lXFOBBGaQY","s7MxkwDajX","v1HlnyvOMI","NOHszydG8U","soy9tFGzgp","pAhR1S2Dfu","azIWpmz8gx","DLhzM618Di",
+"okgRiTa8f6","iKqhrAkKTk","oQ87rsuY4x","8xEKzQYxC0","D6rByAIYUu","cmXIX0BmCy","Gv3Fq55rfB","W7cTsuTacx","uN6r3tlILt","B3qemK4GS8",
+"mX2GEQssNC","uvf7AEoToP","AgJHQ2Yz7E","pT8wujtn0X","Waim6zbIYY","cL0aElCMxy","l83Uddjsrv","Gv3FqtlILt","K4GS8euZA5","s47869XyT9",
+"ulk41fLNg8","Cp3mZ8cVD3","8FmFHBFkb8","okgRiokgRi","2TRI7hE1Ql","n8pJ9lViBv","Ta8f62TRI7","5IhmGtl72W","djsrvKr8ys","RkQke07n1c",
+"uPX7GTXQ0Z","580YDRmDcr","ulk41Yh1hF","2DREsQworu","Nxx9VMmsIo","5Drn0oVQp6","FFDuiCK5W7","14FLRlH1kt","OUqFMjS1aj","cmXIXStlDJ",
+"lCMxycL0aE","wDajXulk41","NcICACxVEf","iB08lciuWz","v1HlnQClRL","9iGoTWMiS3","djsrvJRJQB","jtn0Xzz4ZU","uLtKsK20wK","fqypyCp3mZ",
+"ksJby48cHL","5NammVBjhz","QYxC0C2Irc","suY4xKr8ys","blLA9jtn0X","K20wKWPmlx","BFkb8IKxdL","6q6L9Oz8yZ","fmIK1ydG8U","EoToPPb1pa",
+"s7MxkWMiS3","m4bxUSjskQ","WaWsvWreyP","suY4xkZANm","d85a92Nslm","D6rBy9GXkX","5Nammulk41","P6bcgcL0aE","fqypy7fsYM","FcWrWwiHrZ",
+"7fsYMHfyNQ","zFgtBuAWyp","MezSWlXFOB","NcICA8hJdt","ix74rMmKGJ","JJs5m8cVD3","uZPqguN6r3","t59lRZ4I1v","FVMxoS77LH","tl72W9eoRc",
+"zHF1qn8pJ9","CK5W78TxD7","ZuDtD2Nslm","FFDuis7Mxk","pAhR1piJSk","yluBx0YAGH","x3LDelweGy","suY4xGSQwj","ThjNnZUnqt","Yw2oUCK5W7",
+"fcJOy5IhmG","ni2v1y94nw","W3VFHlsQGo","7Ow5CEoToP","MGlTF9GXkX","EoToPhUTw7","NhXdujzUqR","aDGtStl72W","fmIK1WMiS3","mX2GElm0pD",
+"zY1GYzbIYY","ru4UGZzJHW","48cHL7Ow5C","jfREuni2v1","ksJbyAmdQd","ni2v17lUXZ","WaWsvGXdoH","JRJQBlpF6W","SjskQNxx9V","BGaQYfcJOy",
+"64s8N8cVD3","VBjhzIRh48","lH1ktzbIYY","VLTy6gtCA5","GXdoHv2eC3","iqv4kQssNC","64s8NzFgtB","hSSvQ29QAz","9GXkXlweGy","kB5nPZv7z0",
+"ECMvU618Di","45cIHAIYUu","MmKGJeuZA5","MmKGJRACuj","WaWsvVerEA","zqH0W7fsYM","pAhR1xXTI4","iwzGkMojnP","FwEJzkZANm","fmIK1prNT6",
+"tvdkDIjTwP","GrDg7VerEA","JJs5mRxrsm","h1zcHbgJAz","KsjRKRACuj","jfREuCIShG","zFgtB45cIH","uAWypfmIK1","0Wr5yWDVWJ","QbxXcuJScX",
+"uoStwYh1hF","HRxd8RmDcr","0Kyfs0MR5X","TCgPpciuWz","UmaEvFNYIM","QbxXczz4ZU","WPmlxGXdoH","5iGN5Cfgr3","9XyT9RmDcr","0Wr5yGXdoH",
+"OUqFMZv7z0","uLtKsIn3NS","VNCPdt98iW","FcWrWt59lR","AIYUuVjCZq","KASQ86AFT0","14FLRMmsIo","C2IrcTXQ0Z","hUTw724ARF","vkCHHCdyBV",
+"zHF1qRmDcr","oQ87rCdyBV","5VZjSv2eC3","rKDLJD6rBy","aez9yZzJHW","IKxdLpFrrl","zz4ZU0BmCy","RzaZA0YAGH","2ZHdkHzZT8","t59lRk85Ae",
+"tjQxsVNCPd","HRxd8IBe8k","M3zXLTwano","ZUnqtRxrsm","DG4sT9GXkX","FNYIMQssNC","i3pyd3otm6","tjQxsEOE1o","pWiOsGWqqX","aDGtSlm0pD",
+"CxVEfCp3mZ","MojnPF6PT2","FFDuigjUTu","xciqpcQOnv","Qworu0PktI","iB08l6AFT0","uJScXAXpwE","RpBQm2TRI7","RpBQmhE1Ql","cmXIXcQOnv",
+"jiVBPStlDJ","NhXdu9rlg9","fqypyJIqXi","nnP8o6AFT0","qUJMdG1RhS","Zv7z0vkCHH","zbIYYsuY4x","GSQwjYjB9t","lj07Qulk41","QChxs8cVD3",
+"FFDuigIYvE","fFDrJ5iGN5","CqqaDlpF6W","ZzJHWDz1R3","gjUTuxReec","8hJdtsoy9t","pvgjSTCgPp","pFrrlSWfou","aDGtSJJs5m","xXTI42ZHdk",
+"l83Uds7Mxk","OUqFMn1pmO","TXQ0Z4W0Tl","zQt6QWmadA","0YAGHuAWyp","QClRLFxX9q","OUYuFo8Uyd","ZzJHWQChxs","07n1cuupzk","2TRI7gjUTu",
+"2TRI7djsrv","OxWIHtl72W","EdBKc9rlg9","VBjhzKASQ8","CqqaDYh1hF","MezSWFPfSE","C2Irc5iGN5","i7WMQU3yw5","bZLvSVerEA","I7p2aJIqXi",
+"0h1b14QMc9","5drc6AOgEe","ZJTXHuoStw","1j5L8fLNg8","yToGWWreyP","MojnP29QAz","ix74r4QMc9","RsQUqCfgr3","BbwgAIjTwP","ydG8Ul83Ud",
+"ECMvUx3LDe","7fKYU1v5hH","In3NSk85Ae","xciqpv2eC3","yvOMIkZANm","NhXdujS1aj","4W0TlKZamH","WaWsvh1zcH","dmoS7uZPqg","Q6LixWaim6",
+"fcwDajSjS3","No0QbxXTI4","jS1ajoVQp6","pvgjSyofH3","9rlg9OUYuF","KZamHBFkb8","piJSktvdkD","lweGyUmaEv","ZzJHWHfyNQ","RzaZAWaWsv",
+"pvgjSFGzgp","RpBQmqaofN","HzZT8S77LH","MezSW0Kyfs","3otm6HP433","IKxdLQChxs","yluBxjSjS3","uoStwzQt6Q","WPmlx2DREs","FjHXRpvgjS",
+"JJs5mUl4a1","Twanoa00b5","dhSuHJ2mQi","FjHXRzbIYY","HzZT8soy9t","SbRYytl72W","FxX9qXyPZN","FGzgpix74r","gf8rIksJby","QChxszz4ZU",
+"h1zcHUl4a1","gf8rIOz8yZ","b29RJzmLYD","d85a9QClRL","EoToPZv7z0","NcICAgjUTu","4QMc9dmoS7","ZhwG1iqv4k","Yh1hF9XyT9","zFgtBuZPqg",
+"UmaEvIKxdL","8cVD3Rxrsm","MojnPrz7Ut","1j5L88U2nU","piJSkydG8U","3weIFyluBx","xciqpfLNg8","EOE1oQChxs","9GXkXh1zcH","5NammiwzGk",
+"5IhmGJ2mQi","o8UydW7cTs","lH1kt3weIF","pv0i7BpYhV","HfyNQ2hEEU","Yf2EcPb1pa","WPmlxWmadA","AgJHQlH1kt","No0Qbhi5X7","J2mQidpe1v",
+"nFqikAmdQd","NAFuwhi5X7","MK07YEdBKc","VNCPdhYBCK","Nxx9VMm8si","WMiS3gIYvE","NcICAXflUq","FGzgpZzJHW","618DiciuWz","pFrrlpAhR1",
+"rz7UthE1Ql","DcpWBJ2mQi","2hEEUfLNg8","tAOsr8RCUA","W3VFHaFFss","ciuWzxXTI4","Y1mC02Nslm","zbIYYQClRL","euZA5ydG8U","Yh1hFs93Ml",
+"Yw2oUuN6r3","ZUnqt9XyT9","JXljWyToGW","fFDrJcL0aE","yluBx8U2nU","tvdkDb29RJ","D6rByl83Ud","QbxXcMezSW","0BmCySWfou","Mm8sihYBCK",
+"U3yw5x3LDe","ThjNnlweGy","5drc6FLsph","iKqhrBpYhV","QssNC5Namm","P6bcgCxVEf","5NammiKqhr","Z4I1vP6bcg","wDajXvkCHH","S2DfutaOXK",
+"UmaEv0YAGH","hYBCKprNT6","1v5hHZzJHW","ZUnqtI7p2a","uJScXDz1R3","DQimp5Mg9r","rKDLJW3VFH","5Mg9rgtCA5","mX2GEs7Mxk","CNHmvBpYhV",
+"RkQkeuPX7G","yluBx2TRI7","SjskQCIShG","zY1GYMaJQs","FNYIMoQ87r","AIYUunlaBy","9XyT9lweGy","qaofNWDVWJ","ru4UGKsjRK","EOE1oMkgy8",
+"FPfSECdyBV","e6e4zZUnqt","pFrrlnnP8o","ThjNnuTacx","45cIHxXTI4","dhSuHMaJQs","ydG8UVIlwP","vOqCEEoToP","2TRI7K20wK","dmoS75nmWv",
+"qaofNVprf2","5Drn0zY1GY","CxVEflj07Q","D6rBypWiOs","jS1aji7WMQ","WPmlxQworu","piJSkLbRTH","jtn0XIBe8k","dmoS7pFrrl","tuDySYh1hF",
+"guMb8MGlTF","jtn0XKsjRK","7X3uyfcwDa","uLtKszHF1q","WPmlx580YD","5drc6MezSW","hUTw7ZhwG1","oVQp6JRJQB","tlILttuDyS","JIqXiNhXdu",
+"TXQ0Zn1pmO","o8UydMK07Y","VBjhz8cVD3","iqv4kfLNg8","8RCUAOUYuF","WMiS3MK07Y","n8pJ90Wr5y","No0QbRsQUq","QnJ1SNhXdu","StlDJTa8f6",
+"LewvMuAWyp","QChxsZJTXH","RzaZAcmXIX","cShY2zFgtB","brhlQsoy9t","jS1ajfcJOy","5Mg9rfmIK1","bZLvSM3zXL","4W0TlTwano","1v5hHKr8ys",
+"CIShGpFrrl","dQ586FcWrW","WDVWJlpF6W","t59lR4W0Tl","FwEJzdmoS7","i3pydWMiS3","ogLgcHP433","zbIYYBCxeC","HzZT8QClRL","k85AeZJTXH",
+"RACuj16lHc","gjUTu9rlg9","uJScXulk41","qQxHPBCxeC","OxWIHs4786","fmIK18FmFH","QYxC0QnJ1S","uupzkt59lR","ciuWzMezSW","Waim6ni2v1",
+"aFFss48cHL","i3pydC2Irc","zFgtB7hyVv","yEfy9lsQGo","lH1ktguMb8","ciuWzsoy9t","fLNg8x3LDe","tlILtX6Pin","iB08luZPqg","CdyBVpT8wu",
+"BGaQY0Kyfs","DLhzMrhl0J","TXQ0Z7Ow5C","2Yz7EFGzgp","QssNCatef2","wiHrZciuWz","iKqhrzHF1q","h1zcH3weIF","jS1ajB3qem","k85Ae4dEz6",
+"U3yw5ZhwG1","45cIH45cIH","jS1ajCp3mZ","ZuDtDZzJHW","2NslmW3VFH","RzaZAru4UG","6q6L9hUTw7","JkzUn0YAGH","3weIFfmIK1","2DREsnnP8o",
+"uupzkdhSuH","atef2zz4ZU","7Ow5CGWqqX","JKWYRdpe1v","tvdkDYw2oU","Uvlv4CqqaD","qUJMdZv7z0","Oz8yZU3yw5","0Wr5y7X3uy","HfyNQfqypy",
+"SmGzvFVMxo","9eoRcAOgEe","BbwgAVLTy6","0Wr5ylj07Q","i3pydDz1R3","VNCPduvf7A","OHaBze6e4z","Ta8f6U3yw5","8TxD72TRI7","yofH37ku1p",
+"s93Mlfqypy","5IhmGKsjRK","No0Qbk85Ae","HP43324ARF","5nmWv6AFT0","cmXIXpvgjS","DLhzMvOqCE","prNT6tuDyS","ni2v1pWiOs","zz4ZUZv7z0",
+"Dz1R3ydG8U","HlUbFIjTwP","AmdQdHlUbF","xReecRmDcr","Q6hMCCp3mZ","9y4lw5Mg9r","AkKTkRpBQm","dQ586CNHmv","Waim6n1pmO","HRxd8tAOsr",
+"VBjhz0YAGH","NOHszgIYvE","7fsYMfmIK1","Yh1hFiB08l","iB08llweGy","16lHcJRJQB","TCgPp16lHc","0KyfsQ6Lix","zFgtBCp3mZ","FjHXRUmaEv",
+"sqVrfI7p2a","tlILtlkMUA","OHaBzMkgy8","2NslmZuDtD","uN6r3ru4UG","iwzGklpF6W","DLhzM9iGoT","zbIYY9y4lw","lH1ktuupzk","ZzJHW2ZHdk",
+"EdBKcGSQwj","2DREsWaim6","7fKYUydG8U","C2IrcJkzUn","jS1aj16lHc","9GXkXZ4I1v","0MR5X29QAz","8TxD7O3iyQ","Q6LixEoToP","Mm8siMmsIo",
+"faHirvkCHH","i7WMQdhSuH","Yf2EcvOqCE","JIqXiDz1R3","zY1GYHRxd8","pFrrl2DREs","LewvM8hJdt","Oz8yZHP433","o8UydM3zXL","RzaZABFkb8",
+"OUYuFNAFuw","o8UydgtCA5","8FmFHrhl0J","8RCUAatef2","C2IrcuAWyp","fcwDal83Ud","tjQxsMmsIo","lm0pDKZamH","VNCPdHlUbF","In3NSbgJAz",
+"kZANmlH1kt","2ZHdkn1pmO","Ta8f624ARF","uZPqgU3yw5","MGlTFjzUqR","BGaQYyofH3","8FmFH7X3uy","1j5L8MmKGJ","wiHrZC2Irc","GXdoHVerEA",
+"ogLgcStlDJ","W3VFHuTacx","MaJQszFgtB","MmKGJt98iW","ru4UGjeskS","ZUnqtHP433","VerEAv1Hln","HlUbFZ4I1v","NAFuwqUJMd","s7MxkNo0Qb",
+"ru4UGlViBv","taOXKulk41","EdBKcZzJHW","Ss0Zuhi5X7","FPfSE24ARF","UlU3M4QMc9","AOgEeS77LH","Mm8si45cIH","yluBxjeskS","v8yFNru4UG",
+"nnP8owiHrZ","Kr8ysix74r","WDVWJlCMxy","WDVWJfqypy","aDGtS3weIF","O3iyQLbRTH","l83Ud1j5L8","HfyNQhSSvQ","7fKYUm4bxU","uAWypFwEJz",
+"4W0TlcmXIX","uQIcznnP8o","v2eC3Oz8yZ","dQ5869XyT9","VerEAJkzUn","Ul4a11v5hH","MK07YU3yw5","xReecpT8wu","a00b5s93Ml","pFrrlFNYIM",
+"yToGWIRh48","I7p2aNxx9V","rz7UtCIShG","QworulH1kt","lH1ktFGzgp","FLsphY1mC0","ReKEWtlILt","Chuy33otm6","5Mg9rn8pJ9","Yh1hFyToGW",
+"8FmFH7fsYM","0h1b1FjHXR","XflUqZJTXH","AkKTk8TxD7","Mkgy8gIYvE","8RCUAIKxdL","0BmCylXFOB","KsjRKCp3mZ","Ss0ZulsQGo","7hyVvNhXdu",
+"uQIcz7X3uy","WMiS3Cp3mZ","OHaBzRzaZA","dhSuH7fKYU","jS1ajQYxC0","cQOnvzmLYD","LewvMCp3mZ","55rfBI7p2a","FhtglgtCA5","SbRYyQ6Lix",
+"QnJ1Slj07Q","GWqqXGWqqX","L7cGctvdkD","DQimpdhSuH","yofH3yvOMI","CK5W7v1Hln","0YAGHEdBKc","CdyBV5VZjS","cmXIXn8pJ9","iB08lfqypy",
+"CNHmv9eoRc","ni2v1cQOnv","vLsmSdmoS7","NhXduSs0Zu","LDk6fVjCZq","AkKTkxReec","JKWYRCIShG","J2mQiK20wK","YjB9tiKqhr","3otm66q6L9",
+"cShY2uTacx","618DivOqCE","Z4I1v2ZHdk","SjskQ0Wr5y","zQt6QsqVrf","FjHXRI7p2a","OUYuF16lHc","m4bxUThjNn","G1RhS8RCUA","K4GS8he9IA",
+"XflUq7X3uy","S2DfuoVQp6","CxVEfVBjhz","BbwgAi3pyd","0Wr5ySWfou","aFFssrhl0J","sqVrfEdBKc","WreyPSjskQ","F6PT2KASQ8","VjCZq8RCUA",
+"ciuWzuTacx","7lUXZcShY2","ThjNn5VZjS","Yw2oUmX2GE","FcWrW5Namm","n1pmOgIYvE","uQIcztvdkD","O3iyQS2Dfu","FPfSESjskQ","lkMUAQYxC0",
+"TXQ0ZcShY2","14FLRXflUq","HP433No0Qb","d85a9Gv3Fq","DLhzMsoy9t","ThjNnGSQwj","tl72Ws93Ml","QnJ1SgtCA5","AOgEeVerEA","HP433IjTwP",
+"XflUqkZANm","RpBQm7Ow5C","qUJMdhE1Ql","MmKGJZv7z0","dhSuHK4GS8","5drc6hSSvQ","mz8gxsx5Gl","uupzknFqik","G1RhSdpe1v","QssNCdjsrv",
+"2hEEUEoToP","Kr8ysIBe8k","jfREu5ZaEz","0h1b14dEz6","CIShGUl4a1","No0QbZUnqt","WMiS3oVQp6","QYxC0fcwDa","mz8gxuvf7A","hi5X7jtn0X",
+"s93MlblLA9","AOgEe8TxD7","Yf2EcgtCA5","45cIHtlILt","JIqXigIYvE","7fKYUpv0i7","XyPZNNcICA","yvOMIIBe8k","LDk6fHfyNQ","5Mg9riB08l",
+"Y1mC0Kr8ys","Qworus4786","Dz1R3bgJAz","pv0i7VerEA","ZUnqtJkzUn","Mm8silkMUA","atef2M3zXL","FGzgpi7WMQ","MojnPLDk6f","lm0pDnnP8o",
+"he9IAnFqik","oGu6xQworu","dQ586cL0aE","SmGzvP6bcg","lj07QUmaEv","suY4x3otm6","Q6hMCsoy9t","lXFOBhYBCK","nFqikaDGtS","CNHmvG1RhS",
+"CxVEfIn3NS","zmLYDZ4I1v","JRJQBcShY2","uPX7GVprf2","fLNg8RsQUq","guMb8zHF1q","Q6LixFcWrW","VLTy6oGu6x","No0QbsqVrf","ulk41Cp3mZ",
+"cQOnvEdBKc","ReKEWIRh48","BCxeCDz1R3","Nxx9VhYBCK","iwzGkBpYhV","GWqqXHfyNQ","WmadA0ao3l","yluBxChuy3","7lUXZl83Ud","Rxrsmfqypy",
+"gf8rIdjsrv","vOqCEs7Mxk","MezSW8U2nU","MaJQsni2v1","lm0pDtvdkD","qUJMdlpF6W","StlDJB3qem","9y4lwCqqaD","pWiOslCMxy","h1zcHAIYUu",
+"pAhR1TXQ0Z","djsrvCfgr3","uupzkJkzUn","K4GS8Gv3Fq","soy9tjtn0X","KsjRKe6e4z","WDVWJdhSuH","W3VFHGXdoH","qUJMd0Wr5y","e6e4zYjB9t",
+"1j5L8ogLgc","HzZT8tAOsr","55rfBZ4I1v","hi5X70Wr5y","cmXIXguMb8","ZuDtDBbwgA","JRJQB16lHc","YjB9t3weIF","5Drn0pT8wu","2hEEUxciqp",
+"FcWrWe6e4z","QssNCpmeCd","Waim6s93Ml","vLsmS5nmWv","lH1kt9eoRc","iqv4kK20wK","G1RhS9y4lw","GSQwjxXTI4","OHaBzFxX9q","fcJOy55rfB",
+"NhXduDLhzM","TwanoRkQke","hE1QlSbRYy","WreyP0Kyfs","29QAznnP8o","S77LHDQimp","Ta8f6kB5nP","Qworu580YD","O3iyQ4dEz6","BbwgAJJs5m",
+"FFDui2hEEU","t59lR1v5hH","MGlTFWDVWJ","0MR5Xv8yFN","G1RhSSjskQ","gjUTuS2Dfu","KASQ8jfREu","gjUTuRkQke","NAFuw7Ow5C","HlUbF5ZaEz",
+"dhSuHd85a9","7fKYUyToGW","MaJQslH1kt","K4GS8oGu6x","prNT6qaofN","zqH0Ws7Mxk","0Wr5yMkgy8","x3LDeAkKTk","ulk41GrDg7","lCMxyo8Uyd",
+"b29RJJXljW","FPfSE0BmCy","mX2GEnlaBy","0BmCyYw2oU","WDVWJBCxeC","d7vjMMmKGJ","LDk6fRpBQm","uQIcz0Kyfs","kZANmiwzGk","S77LHFwEJz",
+"jzUqRv2eC3","lH1ktyvOMI","XyPZNHP433","ZhwG1zQt6Q","uAWypDQimp","blLA9zbIYY","OUYuFKZamH","SmGzvtuDyS","m4bxUJkzUn","atef2vkCHH",
+"tlILtfLNg8","t98iWwDajX","VIlwPVprf2","he9IAjtn0X","CqqaDcShY2","ulk41zbIYY","YjB9tjiVBP","zHF1q8FmFH","4dEz6MK07Y","n8pJ9qUJMd",
+"GWqqXYh1hF","7fsYMSs0Zu","uoStwoGu6x","n8pJ9rKDLJ","Mm8siOHaBz","GWqqXfLNg8","D6rByFLsph","bgJAzhSSvQ","FnPFB8FmFH","DLhzMciuWz",
+"8TxD7zqH0W","rhl0JL7cGc","uAWyps7Mxk","EoToPRsQUq","y94nw5VZjS","m4bxUMkgy8","Yh1hFzqH0W","tuDySqaofN","ZUnqtZ4I1v","48cHLKZamH",
+"d7vjMStlDJ","VerEACK5W7","lj07QdQ586","KsjRKsoy9t","fcJOyTCgPp","RzaZAMGlTF","uupzkPYBf4","DLhzMazIWp","VNCPdMmKGJ","ReKEWfmIK1",
+"AOgEelsQGo","prNT6blLA9","jS1ajStlDJ","TCgPp1LB1L","tuDySHP433","HlUbFaFFss","bgJAzYOfrY","i3pydguMb8","hYBCKZv7z0","sqVrfFFDui",
+"lj07Qn8pJ9","mX2GEtlILt","oQ87rbgJAz","3weIFjiVBP","kZANmkB5nP","RxrsmvLsmS","k85AetvdkD","d7vjMQbxXc","azIWpOUqFM","WmadAgIYvE",
+"5ZaEzWaim6","Rxrsmi7WMQ","NhXdufFDrJ","prNT6Qworu","Vprf2QClRL","pT8wunFqik","ru4UGYjB9t","24ARF24ARF","Q6hMC2TRI7","jSjS3cL0aE",
+"Cfgr3s7Mxk","uN6r3uPX7G","TCgPpBpYhV","Waim6uZPqg","tuDySb29RJ","QClRLfcwDa","zQt6QM6qcG","zz4ZUGrDg7","zmLYDVNCPd","1LB1LGXdoH",
+"7fsYMtjQxs","zqH0WU3yw5","gjUTurKDLJ","pvgjSVLTy6","pFrrlL7cGc","0KyfsiKqhr","MezSWksJby","ZzJHWIBe8k","wiHrZfLNg8","QWxoTMK07Y",
+"pWiOsUvlv4","zbIYYVprf2","pFrrlRpBQm","JJs5m2ZHdk","8cVD3CdyBV","RpBQms7Mxk","UlU3M3otm6","0h1b1mz8gx","ogLgccL0aE","TXQ0ZuTacx",
+"ni2v1zqH0W","s4786e6e4z","45cIHOxWIH","5iGN58TxD7","OUqFMZuDtD","5NammlCMxy","ZJTXH5Namm","aez9yFcWrW","RBhp0uZPqg","ciuWzWreyP",
+"yToGWTa8f6","zQt6QSjskQ","pWiOstjQxs","QnJ1SVLTy6","Yh1hFCIShG","lXFOB29QAz","Y1mC0uoStw","8hJdtWDVWJ","FnPFBPb1pa","JIqXigf8rI",
+"4QMc9ZUnqt","OUqFMThjNn","QbxXcQnJ1S","G1RhSUl4a1","xReecOUYuF","W3VFHRACuj","Nxx9VPYBf4","In3NSnnP8o","AgJHQfcwDa","TXQ0ZkB5nP",
+"jeskSn8pJ9","FNYIMzqH0W","K4GS8In3NS","JkzUnY1mC0","yluBxprNT6","W7cTsm4bxU","LewvM0PktI","lj07QQWxoT","KZamHuLtKs","s4786XflUq",
+"MGlTFguMb8","Uvlv4BGaQY","8cVD3piJSk","zmLYDOHaBz","9GXkXFnPFB","prNT6S2Dfu","zY1GYQYxC0","FPfSE2DREs","7lUXZW3VFH","1j5L8lpF6W",
+"d85a9lH1kt","RzaZAhE1Ql","Q6Lix64s8N","Rxrsmdjsrv","tAOsrpFrrl","jzUqR0BmCy","guMb8NcICA","BGaQYHlUbF","uQIczOz8yZ","uJScXtjQxs",
+"FGzgpfaHir","vkCHHX6Pin","piJSk4dEz6","ZUnqt8cVD3","55rfBK4GS8","dhSuHiB08l","NcICAciuWz","YjB9tStlDJ","tAOsr3weIF","SbRYylXFOB",
+"ydG8UMGlTF","mz8gxlkMUA","SjskQjS1aj","gf8rImz8gx","s93MlFVMxo","No0QbCNHmv","QChxs5Drn0","2NslmWaim6","qQxHPM6qcG","8xEKzG1RhS",
+"K4GS8iKqhr","he9IA8U2nU","he9IA3weIF","2TRI7In3NS","cL0aE7lUXZ","0h1b1iqv4k","IBe8kQ6Lix","i3pydcQOnv","FPfSEcShY2","8U2nUMK07Y",
+"K4GS8fFDrJ","faHirVIlwP","he9IAtaOXK","3otm6HlUbF","lsQGoprNT6","cL0aEmX2GE","piJSks4786","QbxXcNhXdu","VjCZqaFFss","i3pydi7WMQ",
+"OxWIH9XyT9","bZLvScQOnv","FnPFBIKxdL","uPX7GzbIYY","m4bxUZhwG1","qQxHPMmKGJ","hSSvQ5IhmG","gtCA5uN6r3","Chuy3Gv3Fq","yToGWjS1aj",
+"OUqFMtuDyS","LbRTHBCxeC","gf8rIs93Ml","taOXKRACuj","DLhzMIn3NS","FxX9qQbxXc","BbwgAFGzgp","vkCHHQ6hMC","NOHszQWxoT","vOqCEzz4ZU",
+"Dz1R3LewvM","aDGtSd7vjM","QworuAkKTk","zY1GYv1Hln","iwzGkXyPZN","NOHsz0Kyfs","7hyVvS77LH","Gv3FquoStw","zY1GYVBjhz","zFgtBD6rBy",
+"pT8wuKr8ys","lweGyiqv4k","ZhwG1pmeCd","n8pJ9lkMUA","OxWIHJXljW","fcwDa9iGoT","ZhwG1P6bcg","s7MxkMkgy8","9y4lwMaJQs","rhl0JtvdkD",
+"Cfgr364s8N","2ZHdkzFgtB","8xEKzZJTXH","lXFOBGWqqX","7fsYMuJScX","WreyPgjUTu","Q6hMCCdyBV","s4786d7vjM","YOfrYrhl0J","G1RhSxXTI4",
+"vOqCEnnP8o","suY4x3weIF","Yw2oUS2Dfu","uPX7GReKEW","FnPFBPOUYS","a00b5OUYuF","0PktIRkQke","S77LHTa8f6","jiVBP48cHL","nnP8oPb1pa",
+"GXdoHBCxeC","AXpwEGv3Fq","7fsYMGWqqX","9GXkXOHaBz","suY4xoGu6x","uoStwaDGtS","RmDcrFGzgp","RkQkeFVMxo","aL6AJThjNn","suY4xD6rBy",
+"gdQsSix74r","xciqp9GXkX","xciqp0BmCy","FGzgpFPfSE","pv0i7suY4x","9iGoTCfgr3","YOfrYhSSvQ","oQ87rm4bxU","KASQ8x3LDe","lweGyyToGW",
+"HfyNQVBjhz","RxrsmlkMUA","7ku1pksJby","RACujaFFss","VBjhzhi5X7","618DiuQIcz","lm0pDgjUTu","Ta8f6iwzGk","4dEz6HfyNQ","yluBxm4bxU",
+"Kr8yshYBCK","SjskQChuy3","Gv3Fql83Ud","8TxD7k85Ae","QWxoTMezSW","JIqXiMojnP","qQxHPMaJQs","AgJHQRmDcr","Cp3mZUlU3M","Oz8yZwDajX",
+"OxWIHiB08l","FxX9qSmGzv","brhlQFFDui","GWqqXHRxd8","pWiOsJJs5m","zQt6QMaJQs","CxVEfiB08l","wiHrZ8RCUA","QnJ1ScL0aE","S2DfuCNHmv",
+"vLsmSxReec","VLTy6mX2GE","Qworu7X3uy","LbRTH6q6L9","QssNCfmIK1","UlU3MwiHrZ","RkQkeSjskQ","7X3uy8FmFH","FLsphoQ87r","W7cTsGv3Fq",
+"Mkgy88cVD3","jfREupT8wu","KZamHVjCZq","jeskSStlDJ","BFkb82DREs","Oz8yZtl72W","JJs5ms7Mxk","pmeCdkZANm","oQ87rgjUTu","jeskSOz8yZ",
+"8hJdtRkQke","aFFsshSSvQ","AgJHQulk41","P6bcgXflUq","QworuDG4sT","5ZaEzEOE1o","JKWYRmX2GE","azIWpPOUYS","pFrrlGWqqX","zmLYDoQ87r",
+"k85AeOxWIH","GrDg7ZzJHW","h1zcHEoToP","iB08lKASQ8","HRxd8v2eC3","JXljWvLsmS","WPmlx45cIH","uAWypMGlTF","uN6r3DLhzM","s93MlAXpwE",
+"n1pmOFjHXR","uN6r3FGzgp","QWxoTQChxs","fFDrJo8Uyd","yToGWCp3mZ","PYBf4QChxs","cShY2v8yFN","nFqik1LB1L","ZuDtDUmaEv","pvgjSVNCPd",
+"GSQwjKr8ys","zY1GYVjCZq","lViBvFGzgp","DG4sTS77LH","I7p2aNhXdu","0ao3ltAOsr","1j5L8Rxrsm","ru4UGs93Ml","B3qemfLNg8","sqVrf7X3uy",
+"i3pydRsQUq","wiHrZzQt6Q","2Yz7Ed85a9","J2mQibZLvS","dQ586CIShG","uJScXv8yFN","Chuy3Yf2Ec","5Drn0Ul4a1","iKqhrv1Hln","QworuHP433",
+"GrDg7iKqhr","cQOnvkB5nP","ulk41Mm8si","XflUqjS1aj","FhtglmX2GE","5ZaEzciuWz","5drc6vOqCE","he9IAuAWyp","ix74rjzUqR","KsjRKZhwG1",
+"KASQ8s93Ml","cmXIXdhSuH","dpe1v3otm6","7lUXZ29QAz","qaofNe6e4z","9rlg9BpYhV","pWiOshSSvQ","24ARFyToGW","Mm8sihSSvQ","jS1ajuAWyp",
+"5ZaEzfcJOy","cShY29GXkX","No0QbOxWIH","qQxHPDcpWB","hE1Ql9eoRc","5drc6Cp3mZ","uupzkuPX7G","8cVD3YOfrY","MaJQsx3LDe","OUqFMY1mC0",
+"rz7UtgdQsS","fcwDaDG4sT","tjQxsSmGzv","KZamHZ4I1v","VerEALbRTH","xReecVerEA","Y1mC0a00b5","e6e4zru4UG","14FLR8FmFH","5drc6HzZT8",
+"lXFOBuQIcz","zFgtBoQ87r","G1RhSAXpwE","v8yFNzQt6Q","9iGoT8hJdt","NcICACdyBV","Ss0Zuh1zcH","ix74rBGaQY","pWiOsJKWYR","FcWrW55rfB",
+"s4786CdyBV","C2IrcaL6AJ","jzUqRpAhR1","Yf2EcDz1R3","KsjRKk85Ae","tlILtOz8yZ","uJScX8U2nU","2TRI7FVMxo","G1RhSbrhlQ","ZUnqtMaJQs",
+"5NammVNCPd","5Drn0jiVBP","AOgEe6q6L9","9rlg97X3uy","fcJOyU3yw5","lkMUAix74r","QClRLTwano","uPX7GyluBx","2hEEUFcWrW","0MR5XjfREu",
+"pT8wuaL6AJ","FLsph7lUXZ","m4bxU7fsYM","ZuDtDSjskQ","RpBQmuAWyp","o8UydEdBKc","CIShGQssNC","In3NSCqqaD","BbwgAI7p2a","55rfBNcICA",
+"FnPFBFFDui","lViBvWDVWJ","AIYUuECMvU","J2mQizmLYD","7hyVvBpYhV","cQOnvtaOXK","iB08lM3zXL","NhXdupmeCd","FLsphm4bxU","W7cTsCNHmv",
+"DQimptaOXK","hi5X7fcwDa","ru4UGBGaQY","fmIK1NAFuw","lViBvQChxs","wiHrZRxrsm","l83Ud9eoRc","k85AeVBjhz","lH1ktTa8f6","VNCPdlCMxy",
+"uTacxReKEW","taOXKkB5nP","AkKTkguMb8","07n1cM6qcG","No0QbLDk6f","16lHcv2eC3","LbRTHs4786","nlaByNo0Qb","AIYUu9eoRc","8U2nUW3VFH",
+"LbRTHuLtKs","AgJHQ7lUXZ","n1pmOoGu6x","zbIYY5Namm","1LB1LDQimp","pFrrlhUTw7","14FLRhSSvQ","IBe8k1j5L8","6q6L9gjUTu","uPX7GjzUqR",
+"55rfBydG8U","soy9t2ZHdk","xciqpzQt6Q","0KyfsRpBQm","hSSvQUmaEv","5Namm0PktI","xXTI4UlU3M","GXdoHvLsmS","6AFT0VLTy6","IRh482DREs",
+"jtn0XjzUqR","7fKYU7fKYU","fcJOylViBv","gIYvEfqypy","TCgPpDLhzM","dQ586POUYS","ciuWzpiJSk","FGzgpYjB9t","FnPFBhYBCK","IRh48Dz1R3",
+"SjskQBCxeC","MmKGJ2ZHdk","iKqhrfLNg8","e6e4z618Di","OHaBzaez9y","kZANmAmdQd","soy9tksJby","jS1ajgIYvE","sqVrfAkKTk","aFFssVNCPd",
+"Gv3FqprNT6","yvOMI1LB1L","5IhmGZhwG1","8U2nUhe9IA","DcpWBJkzUn","Ss0ZuRmDcr","Dz1R3MK07Y","IKxdLjiVBP","brhlQ4W0Tl","J2mQiVjCZq",
+"lH1kt2DREs","aFFssazIWp","In3NSP6bcg","Q6hMCAgJHQ","QYxC0Cfgr3","0PktITCgPp","RkQke2ZHdk","pvgjSuoStw","5ZaEzguMb8","rz7UtVIlwP",
+"QClRL2TRI7","qQxHPL7cGc","lsQGo24ARF","fmIK1QClRL","Yw2oU5Mg9r","iwzGk9y4lw","3otm6brhlQ","0MR5XiB08l","piJSkMkgy8","aez9ylViBv",
+"HzZT8SmGzv","G1RhSWPmlx","Ss0ZuBCxeC","lXFOBmX2GE","14FLRVprf2","v8yFNmX2GE","Ul4a1pvgjS","taOXKpWiOs","5iGN5FVMxo","jiVBPVjCZq",
+"4dEz6ECMvU","VBjhzTCgPp","uJScXRpBQm","nlaByIKxdL","580YDuN6r3","7ku1pgIYvE","RxrsmQnJ1S","cL0aEIBe8k","GrDg72ZHdk","0MR5XP6bcg",
+"POUYSXflUq","XyPZNuJScX","t59lRZzJHW","uAWypM6qcG","FcWrWO3iyQ","aFFssni2v1","n1pmO8hJdt","D6rByNhXdu","nlaByWmadA","fqypyru4UG",
+"1LB1L580YD","AOgEe45cIH","MmKGJ1j5L8","Y1mC0BFkb8","OUqFM618Di","Z4I1v0PktI","kB5nPXyPZN","yofH3aL6AJ","sqVrfyToGW","7fKYUyEfy9",
+"MojnP5Namm","DQimp9XyT9","b29RJ5Namm","qaofNtuDyS","b29RJKr8ys","jeskScQOnv","rhl0JSs0Zu","Oz8yZPOUYS","8hJdtGrDg7","Zv7z0Gv3Fq",
+"EOE1ogdQsS","s4786mz8gx","CdyBVydG8U","7fsYMEOE1o","K20wKlCMxy","0PktIzY1GY","KASQ8fcJOy","FPfSEPb1pa","Cfgr3OxWIH","Mm8si4dEz6",
+"8FmFHru4UG","lViBvSbRYy","P6bcgfqypy","hE1Ql0PktI","0ao3lblLA9","TCgPpUl4a1","k85Aezz4ZU","a00b5tl72W","o8UydS2Dfu","7X3uyHlUbF",
+"CIShGgf8rI","HRxd8ECMvU","s7Mxkdjsrv","M3zXLs93Ml","dhSuHNxx9V","4QMc92TRI7","hYBCKulk41","5Namml83Ud","suY4x45cIH","jfREuY1mC0",
+"yEfy97fsYM","9eoRcFGzgp","zz4ZUMojnP","Nxx9VbgJAz","d7vjMJKWYR","1LB1LgdQsS","U3yw5AgJHQ","mX2GEK20wK","OUqFMlsQGo","DLhzMS2Dfu",
+"yluBxWDVWJ","QChxsMaJQs","dQ586D6rBy","faHirbZLvS","oGu6xtvdkD","wDajX5Mg9r","a00b5Chuy3","BFkb824ARF","jeskSHfyNQ","U3yw5Z4I1v",
+"JJs5mPb1pa","5iGN5Kr8ys","BFkb8s7Mxk","QYxC0YjB9t","0PktIciuWz","MmsIoRxrsm","Yh1hFlH1kt","OHaBzFVMxo","16lHc0h1b1","tAOsrjSjS3",
+"HfyNQzz4ZU","WaWsvxXTI4","wDajXThjNn","Fhtgl0ao3l","AkKTkFxX9q","AOgEeIjTwP","lViBvazIWp","RACujjeskS","GSQwjCNHmv","rhl0JS2Dfu",
+"FGzgpOxWIH","s4786S77LH","xReecQworu","hSSvQix74r","SWfoupAhR1","jeskS9iGoT","Ul4a1CqqaD","YjB9tt98iW","cQOnvSWfou","55rfBNOHsz",
+"cQOnvJRJQB","uAWypW7cTs","Oz8yZNcICA","jzUqRksJby","pAhR1zFgtB","9eoRcUlU3M","No0QbK4GS8","bZLvSix74r","dmoS7Twano","uvf7AGSQwj",
+"KsjRKRmDcr","kB5nP24ARF","x3LDe5iGN5","7Ow5CnFqik","JJs5mNOHsz","IKxdLZJTXH","K4GS8fcJOy","QbxXcfLNg8","he9IAGrDg7","prNT67ku1p",
+"4W0TlzmLYD","IKxdL2hEEU","F6PT2gtCA5","ZzJHWd7vjM","ReKEWsuY4x","2hEEUt59lR","uQIczi3pyd","qaofNtvdkD","zY1GYlsQGo","pvgjSuvf7A",
+"0h1b18cVD3","O3iyQuZPqg","LbRTHdjsrv","0Kyfsix74r","y94nwUvlv4","xReecguMb8","SbRYyjiVBP","zHF1q2DREs","cmXIXOz8yZ","jS1ajAOgEe",
+"M3zXLazIWp","P6bcgJJs5m","WDVWJpT8wu","PYBf4HzZT8","Q6LixDcpWB","Pb1paNxx9V","zz4ZUm4bxU","GrDg7MGlTF","tlILtuvf7A","RkQkeFjHXR",
+"vkCHHEOE1o","Zv7z0jiVBP","ReKEW5nmWv","QWxoTpFrrl","x3LDepv0i7","ru4UGJKWYR","fcJOyDcpWB","FPfSEGXdoH","UlU3Mt59lR","cmXIXZzJHW",
+"uQIczgIYvE","MmKGJjiVBP","GrDg7yvOMI","KASQ8aez9y","WaWsvzQt6Q","Dz1R3GWqqX","wiHrZFVMxo","MK07YWaWsv","JJs5mAXpwE","Cfgr35iGN5",
+"uupzkCfgr3","BGaQYb29RJ","ZUnqtMmsIo","W3VFHaL6AJ","fmIK18cVD3","VBjhzQnJ1S","C2IrcHfyNQ","M3zXLd7vjM","tAOsrQbxXc","JKWYRNOHsz",
+"fqypy0Kyfs","nlaBy2DREs","5ZaEzv8yFN","cmXIXokgRi","VLTy62hEEU","HfyNQJIqXi","n1pmOdmoS7","QnJ1SNcICA","K20wKy94nw","MojnPjS1aj",
+"7X3uyjzUqR","S2Dfupv0i7","0PktIUlU3M","7X3uyh1zcH","IKxdL2Yz7E","n1pmOtjQxs","NhXduprNT6","RkQke7X3uy","d85a9In3NS","M6qcGFxX9q",
+"LbRTHMojnP","BbwgAzFgtB","8U2nUatef2","ciuWz8xEKz","7fsYMjS1aj","TXQ0ZOz8yZ","Pb1pa8RCUA","9rlg97ku1p","rhl0JblLA9","l83UdAOgEe",
+"K4GS8dpe1v","CK5W7qaofN","07n1cJIqXi","5drc6ix74r","ix74rF6PT2","HfyNQpvgjS","t98iWWmadA","MK07YqQxHP","RzaZARkQke","Zv7z0uJScX",
+"pAhR1v2eC3","8hJdtl83Ud","YjB9tMkgy8","sx5GlJKWYR","HRxd8pv0i7","fmIK1U3yw5","jfREuFPfSE","QYxC01LB1L","4QMc9iKqhr","hE1QltaOXK",
+"vLsmSHlUbF","mX2GEbZLvS","yToGWuZPqg","55rfB64s8N","6q6L98hJdt","Fhtglhi5X7","lH1kttuDyS","VBjhzDz1R3","VLTy6SWfou","gjUTuWmadA",
+"9eoRcOHaBz","yvOMIRmDcr","D6rByHfyNQ","ksJbyFcWrW","0ao3l8TxD7","8U2nUsoy9t","5drc6ni2v1","zFgtBo8Uyd","tAOsr8TxD7","d85a9i7WMQ",
+"GXdoHMmsIo","8TxD78RCUA","BFkb8dhSuH","W7cTsGXdoH","brhlQCp3mZ","FxX9qk85Ae","TwanoZhwG1","ix74rNAFuw","U3yw5kZANm","okgRi1LB1L",
+"dQ586JIqXi","jeskSIKxdL","lpF6WW7cTs","gjUTuGWqqX","Oz8yZHfyNQ","lsQGoBbwgA","zQt6QIn3NS","ZuDtDtl72W","IjTwPwiHrZ","EOE1ovLsmS",
+"K20wKLDk6f","07n1cy94nw","jfREuFnPFB","gtCA5VBjhz","HRxd8SWfou","hYBCKv2eC3","cL0aEOHaBz","IjTwPRsQUq","lH1ktSWfou","n1pmOMkgy8",
+"QYxC0sqVrf","ECMvUQ6Lix","azIWpQworu","nFqikTwano","h1zcHcL0aE","Q6hMCWaim6","ix74rZ4I1v","kZANmIBe8k","BFkb83weIF","pmeCdYjB9t",
+"FcWrWQWxoT","pv0i7pmeCd","5nmWvQYxC0","O3iyQ1v5hH","7hyVva00b5","Yh1hFdpe1v","2Yz7EW3VFH","9GXkXCdyBV","C2IrcQnJ1S","uPX7GZ4I1v",
+"HRxd8XyPZN","yofH32Nslm","NhXduJRJQB","RpBQmxReec","5Mg9rzFgtB","9iGoTJRJQB","07n1cfcwDa","QworuFxX9q","B3qemk85Ae","5iGN5HRxd8",
+"m4bxUFjHXR","DG4sT5nmWv","t98iWFxX9q","wiHrZatef2","ZJTXHJRJQB","G1RhSl83Ud","8hJdtAOgEe","Cfgr329QAz","07n1cCp3mZ","hUTw7n8pJ9",
+"oGu6xfmIK1","pmeCdIKxdL","qQxHPsoy9t","SbRYy5nmWv","OUqFM3weIF","SjskQoQ87r","4dEz6XyPZN","VIlwPQChxs","8U2nUW7cTs","J2mQijzUqR",
+"rKDLJRACuj","VNCPdCK5W7","uPX7GBCxeC","5NammFLsph","QYxC0n1pmO","HRxd8AIYUu","QYxC029QAz","aDGtSiKqhr","lj07Qi7WMQ","C2IrcCfgr3",
+"jzUqRC2Irc","s93MlbZLvS","fFDrJAIYUu","7X3uyFFDui","d85a9FNYIM","oQ87rDG4sT","7hyVvyEfy9","FxX9qnnP8o","vkCHH8U2nU","FNYIMECMvU",
+"ZUnqtZuDtD","QnJ1S2DREs","m4bxUuvf7A","8hJdtSs0Zu","VLTy6PYBf4","t59lREoToP","atef2cL0aE","Dz1R3dQ586","lViBvjzUqR","Mm8siGXdoH",
+"ksJbyQ6hMC","sx5GlcShY2","ni2v18TxD7","s93Mlv2eC3","ReKEWlm0pD","NhXduBbwgA","lj07QwiHrZ","cL0aEZv7z0","MmsIo2DREs","rKDLJlj07Q",
+"rhl0JAIYUu","FhtglFLsph","guMb8RsQUq","Ss0ZuaFFss","NOHszCK5W7","NcICAGSQwj","b29RJCxVEf","ZJTXHGWqqX","FPfSEaez9y","v8yFNWreyP",
+"Pb1paKZamH","FLsphhYBCK","rKDLJuAWyp","BpYhViKqhr","5VZjSsuY4x","VLTy6F6PT2","KZamHuvf7A","prNT6CIShG","v2eC3dmoS7","9y4lwNhXdu",
+"5Mg9rjtn0X","AXpwEprNT6","uupzkQClRL","cmXIXk85Ae","zFgtBUl4a1","ru4UGwiHrZ","S77LHWmadA","OxWIHWaWsv","yToGWpT8wu","OUqFMVLTy6",
+"jfREuyluBx","taOXKfqypy","tjQxsFcWrW","FGzgpWmadA","qUJMd64s8N","NOHszThjNn","rz7UtZzJHW","2hEEUuvf7A","7lUXZ7hyVv","v2eC3GrDg7",
+"FGzgpksJby","hE1Ql5Mg9r","mX2GEP6bcg","BCxeCydG8U","ix74rGrDg7","9eoRc9GXkX","Z4I1vIKxdL","UlU3MSjskQ","k85Aeuupzk","0PktIgdQsS",
+"FPfSEhSSvQ","gjUTulpF6W","GXdoHuupzk","WreyPazIWp","y94nw48cHL","D6rByAgJHQ","bZLvSHRxd8","hSSvQni2v1","NOHszHzZT8","AkKTkBCxeC",
+"2DREsPb1pa","6q6L964s8N","IKxdL7X3uy","lH1ktn8pJ9","lXFOBTa8f6","ciuWzyEfy9","5IhmGMezSW","FPfSEJkzUn","CIShGjSjS3","BbwgAyvOMI",
+"zY1GYh1zcH","qaofNFPfSE","iKqhrgf8rI","lH1kt7Ow5C","taOXKSmGzv","O3iyQCfgr3","Y1mC09iGoT","MmsIopv0i7","gf8rIRACuj","aez9y2DREs",
+"jeskSGSQwj","F6PT2RkQke","azIWpW3VFH","nFqikYf2Ec","FFDui8hJdt","ReKEWQnJ1S","YjB9t9eoRc","5ZaEzVLTy6","AkKTkHlUbF","oQ87rzmLYD",
+"FVMxoReKEW","BFkb8dpe1v","8FmFH14FLR","WPmlxpiJSk","618DiJJs5m","WPmlxZ4I1v","v8yFNZJTXH","dhSuHMkgy8","Cp3mZa00b5","BbwgApvgjS",
+"8cVD3MaJQs","mX2GEW3VFH","DLhzMuQIcz","s93MlTXQ0Z","o8UydcShY2","W3VFHD6rBy","RzaZAlkMUA","pT8wuMkgy8","AIYUuF6PT2","IjTwPd7vjM",
+"4W0TlFPfSE","JJs5mDQimp","Zv7z0wDajX","UlU3MJ2mQi","taOXKChuy3","tvdkDd7vjM","RkQkeB3qem","ix74rl83Ud","RkQkeJIqXi","ZJTXHUvlv4",
+"JRJQBCp3mZ","CxVEf1j5L8","jSjS3jS1aj","GWqqX1j5L8","Q6LixWMiS3","d7vjMIKxdL","mz8gxDLhzM","i7WMQS2Dfu","FhtgllpF6W","7hyVvfcwDa",
+"VIlwPAgJHQ","BbwgAazIWp","s7MxkCIShG","jzUqRF6PT2","64s8NMm8si","uvf7AcQOnv","IRh48AkKTk","LewvM5nmWv","tuDySyToGW","HfyNQuAWyp",
+"Cp3mZtAOsr","jSjS3hE1Ql","RkQke0YAGH","dpe1vuN6r3","lsQGohUTw7","Q6LixuN6r3","v1HlnFnPFB","UmaEvlsQGo","8xEKzpFrrl","PYBf47fKYU",
+"64s8NlViBv","K20wKAmdQd","BpYhVI7p2a","dmoS77fsYM","SbRYy0Kyfs","JIqXiru4UG","MaJQsGXdoH","dhSuHqQxHP","I7p2aQ6hMC","uAWypCfgr3",
+"IBe8krz7Ut","5nmWvGSQwj","x3LDeYh1hF","ksJbyQWxoT","FGzgpYw2oU","Uvlv49rlg9","cShY2CqqaD","5iGN5Mkgy8","CNHmvMm8si","jzUqR3weIF",
+"JKWYRvkCHH","dhSuHuLtKs","RmDcrCNHmv","oVQp6AmdQd","FFDuiTCgPp","Chuy3U3yw5","AkKTkWaim6","gIYvEzY1GY","BGaQYv8yFN","1LB1Lsoy9t",
+"uvf7AAkKTk","K20wKlXFOB","fqypyn8pJ9","JRJQBMmsIo","ulk41hUTw7","jS1ajuTacx","5Drn0Mkgy8","1v5hHIjTwP","6q6L9X6Pin","iqv4kQWxoT",
+"prNT68U2nU","faHirfFDrJ","dhSuHHfyNQ","5IhmGLewvM","GSQwjNo0Qb","X6PinfaHir","XyPZNs4786","iwzGkJJs5m","CqqaDEdBKc","NAFuwdhSuH",
+"W3VFHVjCZq","D6rByCNHmv","cL0aEkB5nP","IBe8ktlILt","2Yz7EF6PT2","euZA5FFDui","MaJQstaOXK","MGlTFVprf2","zY1GY2Yz7E","IRh48d7vjM",
+"iKqhrdjsrv","FwEJzv8yFN","b29RJrKDLJ","uTacxAmdQd","XyPZNOUYuF","DLhzML7cGc","uupzkqUJMd","FwEJzS2Dfu","mX2GEqUJMd","FLsphxXTI4",
+"jzUqRfmIK1","Z4I1vaL6AJ","WMiS3WaWsv","DcpWBuupzk","uTacxFVMxo","POUYS8xEKz","AmdQd07n1c","HzZT8K4GS8","Q6hMCrKDLJ","5iGN5a00b5",
+"MaJQswDajX","W7cTstvdkD","5Mg9rIBe8k","uoStwlm0pD","fLNg8lm0pD","ydG8UaL6AJ","sx5GlvOqCE","zmLYD8TxD7","lH1ktatef2","oQ87razIWp",
+"b29RJFFDui","QssNCQYxC0","xXTI4OHaBz","16lHchE1Ql","TXQ0ZGWqqX","jeskSYh1hF","ksJbyhe9IA","64s8NhE1Ql","Kr8ysb29RJ","uupzkECMvU",
+"Q6hMCZv7z0","gjUTupT8wu","d7vjMFnPFB","Oz8yZCK5W7","2DREs4QMc9","Yh1hFAXpwE","RkQkeyluBx","gf8rIm4bxU","LDk6f7fsYM","QYxC08xEKz",
+"Y1mC0aDGtS","IjTwPdQ586","jzUqRDLhzM","VBjhz45cIH","AXpwECNHmv","Twano4dEz6","SWfoul83Ud","QbxXcECMvU","9XyT9gjUTu","5VZjSzY1GY",
+"QClRLhi5X7","AgJHQa00b5","BpYhVtAOsr","prNT6n1pmO","x3LDeulk41","VNCPdXyPZN","VBjhzReKEW","StlDJStlDJ","MezSWZJTXH","5NammOUYuF",
+"Ul4a10Kyfs","Nxx9VwDajX","uvf7Arz7Ut","JRJQBgf8rI","bgJAzCfgr3","618DiBGaQY","zHF1qXyPZN","lsQGorz7Ut","FVMxolCMxy","0PktIb29RJ",
+"jfREubgJAz","1j5L8GXdoH","zmLYDBFkb8","d7vjM16lHc","C2IrcmX2GE","sqVrfTa8f6","16lHc5ZaEz","Y1mC0vLsmS","zqH0WY1mC0","B3qemGSQwj",
+"TwanolXFOB","uAWypvOqCE","ydG8UuZPqg","WmadA8FmFH","7Ow5Clm0pD","5IhmGaez9y","CNHmv9iGoT","yluBxeuZA5","euZA5sx5Gl","C2IrcZJTXH",
+"blLA9TCgPp","ciuWzPOUYS","qQxHPRACuj","No0QbWreyP","0PktIKsjRK","QWxoTFhtgl","NAFuwW7cTs","iKqhrpiJSk","AgJHQzHF1q","taOXKMmKGJ",
+"pAhR1QYxC0","POUYS9GXkX","C2IrcRmDcr","MezSWuLtKs","MojnPJIqXi","e6e4zVerEA","n1pmOh1zcH","Waim6hUTw7","ThjNnFwEJz","X6PinhSSvQ",
+"yEfy9CK5W7","IjTwPIKxdL","Zv7z0OUYuF","FjHXRkB5nP","KASQ8lH1kt","fmIK1RzaZA","StlDJBpYhV","lweGyyofH3","5drc6uQIcz","RxrsmsuY4x",
+"xXTI45Namm","nlaBy7Ow5C","FnPFBUl4a1","BFkb8zY1GY","2TRI7MezSW","RACuji3pyd","n1pmOYw2oU","KASQ8tl72W","qaofN7fKYU","uQIczt59lR",
+"9rlg95drc6","GrDg7vLsmS","mX2GE3otm6","BFkb8ix74r","oVQp6VBjhz","P6bcgP6bcg","Yf2Ec4QMc9","OUYuFzbIYY","S2DfuC2Irc","pAhR1GXdoH",
+"rhl0JyluBx","Mkgy82TRI7","s93Mls7Mxk","MK07Y9eoRc","ni2v1AmdQd","iB08lgjUTu","RzaZAoQ87r","D6rByB3qem","ydG8U0MR5X","jfREuhSSvQ",
+"RBhp0v1Hln","BbwgAjS1aj","h1zcHOxWIH","uAWypWaWsv","FNYIMn8pJ9","GWqqXs93Ml","1LB1LzHF1q","9XyT94W0Tl","fmIK1vkCHH","SjskQVerEA",
+"fcwDaQClRL","DLhzMnnP8o","lCMxyPb1pa","6q6L9L7cGc","aez9yjS1aj","16lHcjtn0X","8hJdte6e4z","SmGzvuLtKs","m4bxUZJTXH","s7MxkYOfrY",
+"uTacxXflUq","K20wKSmGzv","O3iyQMmKGJ","0Wr5yMmsIo","VIlwPYjB9t","suY4xulk41","FjHXRAmdQd","yluBxFVMxo","HlUbFDcpWB","GSQwj4W0Tl",
+"uZPqgyEfy9","uvf7AfFDrJ","14FLRM6qcG","FcWrWx3LDe","CK5W729QAz","Mm8siQ6hMC","Oz8yZ4dEz6","lkMUAAXpwE","9XyT9Cp3mZ","5VZjSNOHsz",
+"gdQsSbZLvS","No0Qb7lUXZ","brhlQciuWz","Yf2EcdmoS7","taOXK48cHL","M6qcGtAOsr","ydG8UdQ586","F6PT2Twano","gdQsSzFgtB","bZLvSCIShG",
+"FxX9qS77LH","okgRitl72W","EdBKcMmKGJ","Q6hMCi7WMQ","XyPZNAkKTk","POUYSQbxXc","5nmWvi7WMQ","4W0TlqaofN","IKxdLRACuj","LDk6fLewvM",
+"S2Dfudpe1v","iqv4kVNCPd","6AFT0HRxd8","fLNg8ciuWz","gdQsShE1Ql","KZamHGv3Fq","7Ow5CG1RhS","618DiokgRi","YjB9tHP433","FjHXRoQ87r",
+"0BmCy07n1c","ThjNnfcJOy","KASQ8hYBCK","Ss0ZuJRJQB","oGu6x7lUXZ","QworuChuy3","X6PinTwano","BFkb8MojnP","pT8wudmoS7","O3iyQIjTwP",
+"qQxHPPb1pa","CqqaDWPmlx","AgJHQ7Ow5C","h1zcH7ku1p","618DicmXIX","lweGy8FmFH","ZzJHWzqH0W","lj07QDcpWB","guMb8Vprf2","BCxeC1v5hH",
+"v8yFNtlILt","jfREuru4UG","Mkgy8ZzJHW","lViBvblLA9","F6PT2dmoS7","No0QbAkKTk","5VZjSuoStw","Chuy3EdBKc","hSSvQlkMUA","i3pydCqqaD",
+"zz4ZUlCMxy","lViBvGSQwj","uLtKs2Nslm","6AFT0BGaQY","gjUTuRpBQm","fcwDaDQimp","lsQGoAmdQd","iKqhrx3LDe","hE1Ql0h1b1","qaofNulk41",
+"MezSWG1RhS","s7MxkQworu","vkCHHi3pyd","wiHrZQChxs","jeskS0BmCy","aDGtS9iGoT","P6bcgcShY2","qQxHPy94nw","pmeCdyToGW","SWfoueuZA5",
+"BCxeCOHaBz","qQxHPcmXIX","CK5W7GrDg7","7lUXZAOgEe","WaWsvaFFss","ix74rZJTXH","TCgPpy94nw","fFDrJK4GS8","4W0TlDG4sT","hE1QlfLNg8",
+"RkQkewDajX","okgRiyvOMI","CK5W72Yz7E","2NslmjiVBP","uAWyptvdkD","PYBf4S2Dfu","Ta8f6pWiOs","Twano0YAGH","Yh1hFFFDui","29QAzStlDJ",
+"8RCUAFwEJz","gjUTuHzZT8","RzaZAsoy9t","5VZjSCxVEf","cQOnv7fKYU","DcpWB8cVD3","blLA916lHc","C2IrcNcICA","YjB9tBFkb8","lpF6WfmIK1",
+"x3LDezqH0W","F6PT2zmLYD","hSSvQfqypy","14FLRWPmlx","tuDySWMiS3","9XyT96AFT0","AOgEeOUYuF","4W0TlSmGzv","MezSWhYBCK","o8UydKr8ys",
+"QClRL7fKYU","MojnPOxWIH","vkCHHZuDtD","s7Mxki7WMQ","AXpwETXQ0Z","fmIK1xciqp","5IhmGs4786","45cIHqaofN","5ZaEzBGaQY","45cIH5ZaEz",
+"l83UdyToGW","Ul4a1W7cTs","580YDJ2mQi","Yf2Ecix74r","0KyfsUl4a1","OHaBzDz1R3","ogLgclCMxy","VNCPd0Kyfs","JKWYRMK07Y","IBe8kIRh48",
+"Yh1hFY1mC0","2TRI7dQ586","KsjRKZv7z0","oQ87rQClRL","8cVD3uQIcz","jtn0X45cIH","5nmWvlweGy","S2DfuYh1hF","EOE1oZ4I1v","zQt6QBFkb8",
+"WmadAFcWrW","m4bxU0Kyfs","zqH0W9GXkX","zFgtB0h1b1","iqv4kIn3NS","1LB1L9rlg9","jSjS3MojnP","QWxoTBCxeC","14FLR0Kyfs","wDajX5drc6",
+"HfyNQru4UG","cShY20MR5X","IRh48pT8wu","atef2Q6Lix","n1pmOO3iyQ","gtCA5FLsph","x3LDelpF6W","jS1ajKZamH","hSSvQFPfSE","P6bcgHP433",
+"k85Ae5Drn0","pAhR1brhlQ","pWiOslweGy","14FLRfaHir","EoToPaFFss","IRh48dpe1v","GXdoH0Wr5y","G1RhSy94nw","NOHszDcpWB","7fKYU8hJdt",
+"8FmFHfmIK1","0ao3llj07Q","07n1cfaHir","qaofNsuY4x","FLsph0MR5X","prNT6djsrv","WreyP2ZHdk","FPfSERsQUq","cL0aE45cIH","kB5nPF6PT2",
+"HP433WreyP","SbRYyZhwG1","fFDrJa00b5","GXdoHd85a9","ECMvUpWiOs","9iGoTCqqaD","RBhp0C2Irc","aFFssK4GS8","tlILtRzaZA","3otm6FLsph",
+"ZUnqtpiJSk","NOHszCNHmv","VjCZqbZLvS","zqH0WMmsIo","SbRYy0YAGH","AXpwEW7cTs","29QAzsqVrf","9GXkXuupzk","n1pmOSmGzv","ciuWzdhSuH",
+"yEfy9W3VFH","tAOsrVjCZq","S2DfuogLgc","uoStwcL0aE","3otm6WMiS3","2Nslm0MR5X","7Ow5CfmIK1","t98iWHP433","UmaEvOHaBz","16lHcWMiS3",
+"jS1aj5nmWv","xciqpdQ586","NOHszcL0aE","8cVD3I7p2a","uPX7GgjUTu","9eoRcG1RhS","7X3uyfcJOy","n8pJ9v8yFN","taOXKxciqp","rKDLJZUnqt",
+"0YAGHpiJSk","VLTy6FnPFB","1LB1Ls7Mxk","e6e4zjSjS3","VjCZqBbwgA","SWfouuupzk","GSQwjZJTXH","1j5L8DcpWB","guMb8gtCA5","SmGzvG1RhS",
+"VIlwPyvOMI","prNT6RkQke","PYBf47lUXZ","SjskQprNT6","cmXIXJkzUn","yToGW4dEz6","uZPqgZzJHW","FLsphkZANm","s4786oGu6x","580YDxciqp",
+"ni2v1JIqXi","580YDzFgtB","CK5W7ZhwG1","ix74rAXpwE","suY4xzz4ZU","lj07QJ2mQi","x3LDeyluBx","Zv7z0djsrv","2Yz7E7fsYM","gf8rIUl4a1",
+"Twano2hEEU","StlDJtl72W","9y4lwFcWrW","TwanooQ87r","FGzgpJRJQB","HzZT8hE1Ql","OxWIHRsQUq","uJScX6q6L9","QbxXc5Mg9r","brhlQ2ZHdk",
+"8U2nUnlaBy","Yf2EcUmaEv","kZANmW7cTs","OUYuFQWxoT","QssNCFcWrW","b29RJmz8gx","JkzUnlj07Q","0PktIJIqXi","F6PT2piJSk","5drc616lHc",
+"oQ87rsx5Gl","IBe8kLDk6f","taOXKjeskS","StlDJMezSW","Cp3mZWaim6","5iGN5cQOnv","IKxdLblLA9","aFFssyluBx","RACujyofH3","SbRYyAIYUu",
+"7ku1pcQOnv","RkQke4QMc9","8TxD7uupzk","7fsYM4W0Tl","lkMUAGrDg7","QClRLDcpWB","FGzgpTCgPp","yEfy9EOE1o","Uvlv4Waim6","CdyBVNOHsz",
+"45cIH8xEKz","uQIczfmIK1","JIqXiFNYIM","KsjRKNxx9V","DLhzMDLhzM","1v5hHKASQ8","0PktIlsQGo","LDk6fiwzGk","D6rByhE1Ql","MK07YjSjS3",
+"OUqFMuZPqg","K4GS8AkKTk","s7MxkpFrrl","RpBQmdpe1v","lweGyYOfrY","VLTy6euZA5","JXljWhe9IA","0PktIprNT6","uJScXUl4a1","blLA9mX2GE",
+"RBhp0IBe8k","aL6AJyluBx","FxX9qRACuj","wiHrZzqH0W","NhXduGSQwj","FnPFBoGu6x","pFrrlW7cTs","NAFuwfcJOy","zbIYYGv3Fq","Cp3mZzmLYD",
+"qUJMdpT8wu","tuDySyvOMI","pT8wuhSSvQ","aDGtSrKDLJ","B3qem2Nslm","UmaEvZzJHW","I7p2aGv3Fq","jeskSnlaBy","2TRI7DLhzM","atef2jSjS3",
+"t59lRVIlwP","7lUXZpT8wu","okgRi5drc6","VNCPddQ586","F6PT2lj07Q","G1RhSs93Ml","jfREupv0i7","y94nwPOUYS","AOgEenlaBy","2hEEUMK07Y",
+"UlU3M1LB1L","dQ586vkCHH","Cfgr39rlg9","BFkb8t59lR","zY1GYn1pmO","v1HlnVBjhz","TXQ0ZlCMxy","0YAGHFxX9q","QnJ1SJRJQB","7lUXZHfyNQ",
+"Yh1hFvkCHH","bgJAzWaim6","i3pyddpe1v","uupzkJKWYR","hE1QlzbIYY","piJSkNhXdu","0ao3lkZANm","Yw2oUFGzgp","JKWYR29QAz","bZLvSBpYhV",
+"5IhmGjiVBP","5ZaEzuQIcz","5Mg9rFwEJz","dmoS7KASQ8","Cp3mZ0Wr5y","W3VFH45cIH","AIYUuzFgtB","2TRI7CK5W7","prNT6JkzUn","5ZaEzpvgjS",
+"uLtKshUTw7","Zv7z05Namm","Pb1paTCgPp","FPfSES2Dfu","zmLYDOxWIH","atef2mz8gx","BbwgAVIlwP","guMb8CIShG","FcWrWfFDrJ","tAOsrgdQsS",
+"aez9yTCgPp","azIWps7Mxk","PYBf4lm0pD","gjUTuiKqhr","9eoRcDG4sT","QClRLEdBKc","5Namm3weIF","blLA9ReKEW","ogLgcaL6AJ","gIYvEPOUYS",
+"0BmCy4QMc9","oVQp6VLTy6","uoStwNcICA","gf8rIzHF1q","Q6LixQClRL","S77LH5Namm","cShY2VerEA","lCMxyIKxdL","G1RhSSmGzv","1v5hHFwEJz",
+"b29RJECMvU","UlU3MlXFOB","v2eC3h1zcH","mz8gxpmeCd","QssNCeuZA5","uZPqgYh1hF","ni2v1kB5nP","a00b5pvgjS","Pb1paF6PT2","HlUbFxXTI4",
+"Ss0ZulViBv","ECMvUGv3Fq","HlUbF5Mg9r","fqypyoQ87r","a00b5h1zcH","5ZaEz1v5hH","MaJQsb29RJ","jS1ajlweGy","QYxC0oQ87r","fLNg8Q6hMC",
+"S2DfuvkCHH","jeskSe6e4z","24ARFPYBf4","i7WMQZuDtD","6AFT0VBjhz","Gv3FqokgRi","GrDg7uTacx","FLsphmz8gx","Waim6m4bxU","GXdoHyluBx",
+"OHaBzqaofN","h1zcHYh1hF","jS1ajKsjRK","Oz8yZkZANm","PYBf4NcICA","5IhmGF6PT2","ogLgcjSjS3","9rlg9GWqqX","ix74rMmsIo","RsQUqDcpWB",
+"Mm8siQbxXc","VerEAMK07Y","8hJdti7WMQ","b29RJsuY4x","TXQ0Zdpe1v","QYxC0UmaEv","uZPqgvOqCE","No0QbwDajX","AIYUueuZA5","Y1mC00PktI",
+"7Ow5Ch1zcH","uAWypGrDg7","7X3uyoQ87r","CqqaD5Drn0","XflUqTCgPp","lViBv9iGoT","7ku1p5VZjS","hE1QliwzGk","ECMvUiB08l","Cfgr3zqH0W",
+"RzaZAECMvU","MGlTFmX2GE","VerEAy94nw","Cfgr3IKxdL","2Yz7EJRJQB","gf8rIguMb8","X6PinQ6hMC","KsjRKDG4sT","24ARFfLNg8","FcWrWCNHmv",
+"WDVWJciuWz","bZLvSF6PT2","0KyfsLbRTH","FGzgpLDk6f","pT8wuWaWsv","lweGyWaWsv","3weIFuZPqg","ZhwG1k85Ae","uTacxY1mC0","GrDg7cmXIX",
+"1v5hHrhl0J","3otm6nFqik","okgRiQworu","oVQp6WaWsv","Dz1R3n8pJ9","WmadAd85a9","JIqXiAkKTk","GWqqXMK07Y","7fKYUEdBKc","24ARFMkgy8",
+"aez9yn8pJ9","ru4UGStlDJ","BCxeCy94nw","FxX9qjfREu","dhSuH29QAz","t98iWm4bxU","7lUXZuZPqg","Uvlv4o8Uyd","v1Hln2ZHdk","NAFuwfmIK1",
+"VerEAMezSW","6q6L9NOHsz","d85a9i3pyd","pv0i7AkKTk","wiHrZ6AFT0","48cHLG1RhS","LbRTHKASQ8","07n1cfLNg8","fLNg82hEEU","ru4UGQClRL",
+"CNHmvBbwgA","brhlQ1LB1L","fcJOyDG4sT","7X3uylpF6W","hYBCKW7cTs","tuDySBCxeC","9GXkXgIYvE","zFgtB48cHL","zFgtBprNT6","RACujVerEA",
+"aDGtSzQt6Q","FhtglbgJAz","EdBKclsQGo","n1pmOU3yw5","45cIHTXQ0Z","wDajXdmoS7","n8pJ9uLtKs","l83Udsx5Gl","M6qcGK20wK","zFgtBM6qcG",
+"WmadAJRJQB","yvOMIfqypy","mz8gxhYBCK","mX2GEzHF1q","VNCPdSWfou","9rlg9MezSW","RxrsmpT8wu","tuDyShi5X7","ksJbyPb1pa","5nmWvh1zcH",
+"Mm8siIBe8k","SWfounnP8o","DcpWBOz8yZ","ksJbyFLsph","2DREsydG8U","kB5nPFVMxo","soy9tSs0Zu","i3pyde6e4z","16lHcdpe1v","J2mQiiB08l",
+"LbRTHAmdQd","k85AeAIYUu","VerEAOz8yZ","okgRiJRJQB","lXFOB7ku1p","ECMvUm4bxU","l83UdciuWz","2DREsF6PT2","1v5hH07n1c","xciqpQssNC",
+"oVQp6K4GS8","QClRLiqv4k","Yf2Ec2ZHdk","o8UydGv3Fq","YjB9tIKxdL","cL0aEtvdkD","iqv4kUl4a1","h1zcHNcICA","atef2AgJHQ","lViBvguMb8",
+"S2DfubgJAz","cL0aEI7p2a","aDGtSsqVrf","Gv3Fq7fsYM","he9IAU3yw5","Yw2oUEdBKc","NOHsz0YAGH","ydG8Uzz4ZU","8RCUA48cHL","t98iWTCgPp",
+"Ul4a1M3zXL","RmDcrMojnP","tlILtJ2mQi","tuDySIjTwP","cQOnvlH1kt","uN6r37ku1p","ZzJHWl83Ud","lViBv7ku1p","Q6LixHRxd8","Mkgy8ni2v1",
+"Vprf2t59lR","l83UdWreyP","RxrsmBGaQY","48cHLHfyNQ","iwzGk5Mg9r","rKDLJVjCZq","l83Udv1Hln","mX2GEhE1Ql","faHirUvlv4","EoToPlViBv",
+"GXdoHni2v1","I7p2a5VZjS","v8yFNCdyBV","sx5GlMmsIo","ix74rO3iyQ","sqVrfuupzk","hi5X7OUYuF","s7MxkdmoS7","RsQUqkB5nP","ThjNntlILt",
+"qUJMd4dEz6","lViBvs7Mxk","EoToPn8pJ9","29QAztAOsr","9GXkXBGaQY","zqH0WStlDJ","lCMxyCdyBV","zY1GYQbxXc","tuDySgtCA5","7hyVvciuWz",
+"1j5L8Z4I1v","FGzgpzbIYY","8hJdtNcICA","gtCA5QnJ1S","NcICAAOgEe","dpe1vUmaEv","oQ87rv1Hln","3weIFjfREu","4QMc9jSjS3","StlDJru4UG",
+"LbRTHt59lR","ZuDtDx3LDe","FcWrWzFgtB","QbxXcnnP8o","dhSuHGWqqX","zHF1qi3pyd","lXFOBYOfrY","7hyVvCqqaD","ECMvUni2v1","yToGW8hJdt",
+"CNHmvvLsmS","4W0TlCp3mZ","yToGWKr8ys","azIWpcShY2","QnJ1SydG8U","RkQkeuoStw","uLtKsFPfSE","wDajXEdBKc","64s8NuN6r3","ulk41TCgPp",
+"t98iWFPfSE","CNHmvaL6AJ","v8yFNdpe1v","cShY2m4bxU","Y1mC0bZLvS","jtn0XhYBCK","7hyVvoVQp6","Uvlv4uPX7G","VNCPdFNYIM","Z4I1v9rlg9",
+"UmaEvv2eC3","atef2zQt6Q","RzaZApmeCd","rz7UtGWqqX","K4GS8ECMvU","aFFssPOUYS","zY1GYWaWsv","yluBxpWiOs","9GXkXAkKTk","5VZjSvOqCE",
+"X6PinQChxs","X6PinF6PT2","FLsphM3zXL","s7Mxk9y4lw","ksJby8xEKz","tvdkD7hyVv","prNT6WMiS3","qUJMdAmdQd","uPX7Gi7WMQ","uTacxfcJOy",
+"x3LDefmIK1","fmIK12ZHdk","IjTwPPYBf4","ogLgcQ6hMC","Waim6K4GS8","TwanotuDyS","tuDySgdQsS","7hyVvdQ586","In3NSRACuj","MezSWI7p2a",
+"gtCA514FLR","580YDP6bcg","gdQsSmX2GE","8RCUA618Di","In3NSvOqCE","0KyfspmeCd","KASQ8wiHrZ","7lUXZqUJMd","580YDVprf2","tlILtAgJHQ",
+"oQ87rprNT6","14FLRMkgy8","POUYSI7p2a","HfyNQh1zcH","JXljWVNCPd","CqqaD2Nslm","ZzJHWuupzk","iB08lB3qem","ru4UGVLTy6","K4GS8OHaBz",
+"9XyT9HRxd8","dpe1vfcJOy","yEfy9s93Ml","CxVEfQWxoT","MmsIoHlUbF","M3zXLCp3mZ","gf8rIRBhp0","iKqhro8Uyd","n8pJ9v2eC3","ZJTXHni2v1",
+"pvgjSaez9y","Q6hMCBpYhV","XflUqLDk6f","aez9yVjCZq","3weIFydG8U","QssNCW3VFH","0PktIHzZT8","AmdQd0BmCy","nFqik9eoRc","2Yz7EHzZT8",
+"RmDcrlweGy","0MR5XprNT6","Twano6q6L9","FLsph5Drn0","FxX9qaL6AJ","7Ow5CXflUq","fcwDaOxWIH","qaofNZv7z0","aez9yhSSvQ","WreyP9rlg9",
+"FnPFBNhXdu","iB08l2DREs","AOgEeC2Irc","ThjNnJRJQB","FLsphzFgtB","fqypym4bxU","v8yFNbrhlQ","DG4sTulk41","8U2nUpAhR1","wDajXY1mC0",
+"tAOsrMmKGJ","oGu6xGXdoH","a00b5LbRTH","lCMxyNAFuw","GXdoH580YD","NhXduJ2mQi","ZzJHWkZANm","gf8rIjSjS3","C2IrcDLhzM","WmadAulk41",
+"mz8gxOUYuF","CNHmv16lHc","Yw2oUbgJAz","guMb8hUTw7","16lHcgtCA5","b29RJjfREu","mz8gxUmaEv","lweGyStlDJ","cL0aEiB08l","KZamH0BmCy",
+"07n1cL7cGc","QssNCHRxd8","9eoRcNOHsz","xXTI4AXpwE","xXTI4IjTwP","rKDLJ1j5L8","2hEEU8U2nU","hSSvQrhl0J","xXTI4IKxdL","SbRYyFPfSE",
+"UlU3MJJs5m","iKqhr7fsYM","RsQUqRmDcr","FcWrWpiJSk","48cHLfcJOy","16lHcpWiOs","Z4I1vpWiOs","QWxoTFcWrW","9y4lws4786","v1HlnnlaBy",
+"hYBCKi7WMQ","ksJbyCxVEf","ydG8UFnPFB","rKDLJv8yFN","GXdoHXyPZN","lkMUA0h1b1","FNYIMX6Pin","FwEJzWreyP","o8Uyd7Ow5C","atef2gf8rI",
+"x3LDeG1RhS","iKqhrNcICA","Kr8ys55rfB","CxVEf5IhmG","2Yz7ERsQUq","QChxslXFOB","cShY2Kr8ys","Z4I1v5ZaEz","S77LHzmLYD","zqH0Wt98iW",
+"uZPqgiKqhr","guMb8MK07Y","9y4lw1v5hH","aez9yEOE1o","O3iyQYOfrY","zz4ZUaL6AJ","RACujPb1pa","iKqhrCdyBV","iB08ltlILt","QworuqQxHP",
+"M6qcG5iGN5","Pb1paDz1R3","W7cTsRBhp0","yToGWSjskQ","QssNCogLgc","aL6AJyToGW","HzZT8fcwDa","atef2qaofN","oQ87rWMiS3","POUYS7fKYU",
+"uN6r3GXdoH","FGzgphSSvQ","2hEEUI7p2a","JKWYRCqqaD","zz4ZUeuZA5","yvOMIFPfSE","K4GS8SbRYy","FcWrWh1zcH","pWiOsAkKTk","uTacxOz8yZ",
+"hi5X7WDVWJ","FwEJz8RCUA","cShY2PYBf4","9XyT9i7WMQ","5nmWvRxrsm","XflUqvLsmS","580YDRACuj","Gv3FqlXFOB","pT8wuVIlwP","CIShG5drc6",
+"LDk6fru4UG","cmXIX0ao3l","7fKYU7Ow5C","n8pJ9FFDui","uQIczru4UG","FGzgpC2Irc","Y1mC0WDVWJ","JIqXi1v5hH","29QAz7fsYM","I7p2as4786",
+"G1RhStjQxs","KsjRKguMb8","D6rByWreyP","vOqCEVerEA","1v5hHjS1aj","d7vjMCqqaD","2ZHdkoQ87r","VNCPdjzUqR","NOHszuLtKs","GrDg7Oz8yZ",
+"9GXkX9eoRc","t59lR55rfB","2Yz7ElH1kt","O3iyQVprf2","uZPqgHRxd8","W3VFHo8Uyd","blLA9lCMxy","tjQxsSbRYy","MmsIomX2GE","o8UydQ6hMC",
+"BbwgATwano","brhlQQYxC0","5IhmG0PktI","pv0i7OxWIH","ni2v1uupzk","gf8rIzmLYD","8TxD70Wr5y","dmoS7B3qem","aez9yAOgEe","M3zXLcL0aE",
+"9GXkXd7vjM","8xEKz9y4lw","I7p2aIBe8k","WaWsvi7WMQ","HP433AXpwE","he9IAhE1Ql","o8UydSs0Zu","O3iyQRzaZA","hi5X7zz4ZU","nnP8oo8Uyd",
+"ZJTXHlXFOB","RACujjiVBP","AmdQdwiHrZ","guMb8Ul4a1","o8Uyd8cVD3","euZA514FLR","Ss0Zu5ZaEz","s47869iGoT","4dEz6rhl0J","8cVD3Yf2Ec",
+"dmoS7X6Pin","IjTwPSWfou","JJs5mpv0i7","zqH0WPYBf4","Fhtglrhl0J","QChxsnFqik","Z4I1vMojnP","vOqCE0h1b1","Q6hMCfqypy","i3pydprNT6",
+"uupzkW3VFH","0ao3llViBv","xciqpfqypy","hYBCK5Drn0","IjTwPlXFOB","0PktIHlUbF","3otm6guMb8","euZA5ix74r","rKDLJpWiOs","s93Mlhe9IA",
+"ru4UGRxrsm","nnP8ouoStw","0MR5XZzJHW","zqH0WDQimp","bgJAzl83Ud","SWfouECMvU","P6bcgnFqik","7X3uyogLgc","0ao3lTwano","No0QbPYBf4",
+"2TRI7RBhp0","8xEKz9eoRc","oGu6x55rfB","M6qcGlH1kt","Cp3mZPYBf4","tuDyStjQxs","k85AeYw2oU","hSSvQaez9y","7fsYMWPmlx","yluBxy94nw",
+"Mm8si0h1b1","0ao3ltl72W","Oz8yZ2Yz7E","pFrrlru4UG","GWqqXuLtKs","Uvlv44W0Tl","IKxdLzbIYY","Nxx9VRpBQm","yvOMI4QMc9","azIWp0PktI",
+"Cp3mZHfyNQ","KZamHHP433","ciuWzcmXIX","MGlTF14FLR","aL6AJd85a9","d85a916lHc","lpF6WPYBf4","zQt6QxXTI4","DG4sTStlDJ","L7cGcRxrsm",
+"K4GS8VjCZq","he9IANAFuw","fmIK1FjHXR","6q6L90ao3l","vkCHHzHF1q","CNHmvBFkb8","7hyVvnlaBy","Gv3Fq5iGN5","618DiCp3mZ","F6PT2QChxs",
+"yToGW9rlg9","tlILtv1Hln","uLtKsMGlTF","nlaByKr8ys","kB5nPkZANm","SWfoulweGy","8FmFHzQt6Q","jiVBPCIShG","prNT6oQ87r","FPfSE9y4lw",
+"GSQwjvOqCE","d85a9POUYS","ciuWzSjskQ","NAFuwQssNC","Yf2EcYh1hF","8xEKzWaWsv","ReKEWjSjS3","BbwgA618Di","ogLgctaOXK","7ku1p0ao3l",
+"EoToPpAhR1","cShY2uAWyp","OHaBzVLTy6","tlILtUvlv4","n1pmO7hyVv","SmGzvfLNg8","NcICAhE1Ql","jeskSkB5nP","7lUXZfmIK1","JKWYRStlDJ",
+"bgJAzuLtKs","KsjRKXflUq","rhl0JFcWrW","pmeCdt98iW","tjQxssx5Gl","piJSkZJTXH","dhSuHTCgPp","4W0TlUvlv4","pmeCdgIYvE","SbRYyt98iW",
+"QChxs45cIH","RsQUqru4UG","tjQxs580YD","d7vjMpWiOs","gf8rIWMiS3","CqqaDPYBf4","sx5GlpT8wu","gjUTuatef2","cmXIX5ZaEz","WDVWJblLA9",
+"ciuWz8U2nU","O3iyQMK07Y","n8pJ9MojnP","D6rByZuDtD","FhtglciuWz","7X3uyv8yFN","t98iWfcJOy","OUqFMNOHsz","2DREsatef2","2DREstvdkD",
+"L7cGcHP433","jSjS3tjQxs","iKqhrFxX9q","9GXkXY1mC0","2TRI7i7WMQ","uvf7AEdBKc","5nmWvGrDg7","HlUbFFnPFB","45cIHzz4ZU","okgRiMmsIo",
+"zY1GY7lUXZ","0PktIuvf7A","ulk41Cfgr3","uQIczQnJ1S","WPmlxn1pmO","DG4sTlweGy","sx5GlzFgtB","dhSuHsqVrf","CK5W7uZPqg","k85AeFwEJz",
+"n1pmOWreyP","yluBxatef2","Z4I1vDcpWB","8TxD73otm6","pT8wuAkKTk","FhtglK4GS8","vLsmSWDVWJ","tvdkDFPfSE","kZANmCIShG","hi5X7ogLgc",
+"IKxdLRkQke","hE1QlGWqqX","mX2GERACuj","K4GS8HfyNQ","zz4ZUS2Dfu","5NammHfyNQ","Ul4a1v2eC3","Y1mC07fKYU","ZUnqtGv3Fq","16lHcFNYIM",
+"v8yFN0PktI","Oz8yZNo0Qb","qaofN5ZaEz","BFkb8W3VFH","MaJQsfLNg8","Cfgr3ZhwG1","aDGtSlweGy","HRxd8jtn0X","45cIHOz8yZ","zbIYYY1mC0",
+"4dEz6wiHrZ","AmdQddQ586","tAOsrWPmlx","i3pydiKqhr","Ta8f6iB08l","WPmlxfcJOy","IKxdL9rlg9","jSjS3AgJHQ","M6qcGuLtKs","v8yFNJXljW",
+"aez9yCIShG","AkKTkCdyBV","M3zXLgf8rI","pmeCdFnPFB","rz7UtlViBv","7hyVvOUqFM","FPfSEK20wK","QworuiB08l","ru4UGMGlTF","DLhzM0BmCy",
+"LewvMs7Mxk","DG4sT8TxD7","Chuy3sx5Gl","8cVD3jzUqR","prNT664s8N","OUqFMjeskS","jSjS3U3yw5","F6PT2MmKGJ","s93Ml5drc6","24ARFfaHir",
+"TCgPpQ6hMC","24ARF9rlg9","s7MxkyvOMI","QnJ1SbgJAz","jtn0XNxx9V","yvOMIB3qem","AIYUuS2Dfu","gdQsSU3yw5","sqVrfazIWp","7ku1pTXQ0Z",
+"okgRiIjTwP","F6PT2zqH0W","jSjS3fqypy","yluBxJJs5m","d85a9K4GS8","v2eC3jfREu","8TxD7aez9y","jeskSFFDui","Gv3Fq8U2nU","C2IrczqH0W",
+"Yf2EcAXpwE","0KyfslViBv","BpYhVydG8U","8RCUAMkgy8","X6PinUvlv4","8U2nUKZamH","QssNCAOgEe","lH1ktd7vjM","s7MxkIRh48","ZuDtDFxX9q",
+"aFFssyEfy9","2DREsHzZT8","In3NSjzUqR","FPfSEAkKTk","aez9yCdyBV","aFFssEoToP","DLhzMB3qem","qQxHPQ6hMC","yofH3lH1kt","WmadAcmXIX",
+"JJs5mbrhlQ","EOE1olm0pD","RsQUqWPmlx","uZPqg2TRI7","7fsYMpvgjS","tuDySyluBx","F6PT2Ss0Zu","blLA9yEfy9","LDk6fKsjRK","5iGN5GrDg7",
+"gjUTu07n1c","Yw2oUy94nw","ZuDtDWPmlx","ciuWzvkCHH","24ARFHP433","Nxx9VRmDcr","gIYvEhSSvQ","QssNCFPfSE","dhSuHNOHsz","lj07QsqVrf",
+"uJScXBFkb8","xReec5Mg9r","QClRLDQimp","nnP8oBbwgA","ru4UGlkMUA","0YAGHwiHrZ","m4bxUb29RJ","gtCA57X3uy","KASQ8Ul4a1","MmKGJ14FLR",
+"blLA9Rxrsm","uPX7G5nmWv","vOqCEIBe8k","dmoS7Y1mC0","MmKGJfFDrJ","uupzkZv7z0","RkQkeMaJQs","uZPqgaDGtS","0ao3lnnP8o","5Mg9rkZANm",
+"TCgPpRkQke","3weIFJXljW","CqqaDfcwDa","vLsmSRzaZA","aL6AJlj07Q","EoToP9GXkX","Cfgr37lUXZ","KASQ848cHL","lpF6W2ZHdk","SWfouVBjhz",
+"CK5W7h1zcH","zz4ZU9XyT9","nlaBy8U2nU","aFFsslpF6W","rKDLJFcWrW","b29RJzQt6Q","oVQp6G1RhS","VerEA2TRI7","IRh48MmsIo","Fhtglatef2",
+"VjCZqiB08l","uZPqgRpBQm","ReKEWmX2GE","euZA5CdyBV","t59lROHaBz","BFkb8ydG8U","ulk417fKYU","MK07YQClRL","XyPZNW7cTs","Y1mC0MmsIo",
+"I7p2a8cVD3","7hyVvRpBQm","taOXKlH1kt","kB5nPJRJQB","GWqqXeuZA5","AmdQdd7vjM","S77LHuoStw","NOHszCp3mZ","TXQ0ZaDGtS","5drc69iGoT",
+"7Ow5CuQIcz","AgJHQCdyBV","o8Uydb29RJ","FwEJzHlUbF","7Ow5Cuvf7A","Fhtglgf8rI","uPX7Gatef2","GWqqX4QMc9","RsQUqAIYUu","I7p2ani2v1",
+"zmLYDRkQke","ZzJHWhE1Ql","hE1QlM3zXL","lsQGol83Ud","6AFT055rfB","nFqiklj07Q","pFrrl24ARF","Vprf2AkKTk","FjHXRUlU3M","P6bcgNhXdu",
+"QssNCcQOnv","8TxD7oQ87r","Fhtglmz8gx","ciuWzWDVWJ","DQimp5Namm","Z4I1v9XyT9","U3yw5MaJQs","ECMvUJkzUn","hSSvQFwEJz","sqVrfGv3Fq",
+"5ZaEzv1Hln","y94nwydG8U","RkQkeix74r","5Mg9r5nmWv","HfyNQFwEJz","Cp3mZpAhR1","ru4UGl83Ud","7Ow5CzHF1q","Pb1pafaHir","vLsmSVBjhz",
+"aFFssQworu","lweGyJ2mQi","euZA5AkKTk","wDajX9XyT9","qQxHP6q6L9","piJSkTa8f6","aL6AJaL6AJ","9rlg9hSSvQ","piJSk5Mg9r","P6bcgTwano",
+"9y4lwMGlTF","ECMvUUl4a1","oVQp6he9IA","G1RhSO3iyQ","cL0aEBpYhV","x3LDePb1pa","djsrvVBjhz","ZuDtD9y4lw","ZuDtDAgJHQ","soy9tlm0pD",
+"KZamHTa8f6","jfREuOUqFM","ksJby1v5hH","8cVD3xciqp","CK5W7pv0i7","lkMUAuLtKs","okgRi5Namm","QnJ1SlViBv","5VZjSOUYuF","CqqaDVprf2",
+"lViBvtvdkD","DLhzMiB08l","uTacxxXTI4","HzZT8cmXIX","lsQGoCNHmv","cQOnvYw2oU","y94nwzz4ZU","fqypyCqqaD","RsQUqMK07Y","EoToP7hyVv",
+"OHaBzyofH3","pvgjSGWqqX","DcpWBNhXdu","L7cGcjSjS3","07n1cydG8U","U3yw5i3pyd","VBjhzsoy9t","SmGzvS77LH","gdQsSMojnP","DLhzMmX2GE",
+"nFqik8RCUA","IKxdLFhtgl","07n1cGWqqX","OUYuFL7cGc","TCgPpn8pJ9","5IhmGe6e4z","iqv4kt59lR","ReKEWJIqXi","uupzkt98iW","3otm60MR5X",
+"64s8Nmz8gx","RmDcroQ87r","fmIK1v1Hln","yToGWi3pyd","iKqhrpWiOs","JIqXi6q6L9","he9IAMGlTF","v8yFNtAOsr","QbxXcwiHrZ","uoStwVIlwP",
+"lj07QqQxHP","aL6AJtl72W","nnP8oMkgy8","o8Uyd1v5hH","t98iWpmeCd","tjQxsfaHir","suY4xdmoS7","iwzGkCNHmv","QYxC0IKxdL","uZPqgOxWIH",
+"jiVBPUvlv4","9rlg9oQ87r","Dz1R3gf8rI","lj07QEoToP","TwanoVprf2","ZzJHW2hEEU","M3zXLb29RJ","NOHszciuWz","iKqhr5IhmG","In3NSni2v1",
+"dpe1vBCxeC","v2eC3oGu6x","uPX7Gv8yFN","GSQwjGv3Fq","WPmlxYjB9t","P6bcgOUqFM","ZhwG1Kr8ys","pv0i724ARF","VLTy6nlaBy","lpF6Wt98iW",
+"euZA5FGzgp","7fKYUsoy9t","aDGtSsuY4x","580YDlweGy","GXdoHfcJOy","blLA9Cp3mZ","RsQUqcQOnv","lj07QYw2oU","BpYhVx3LDe","9y4lwcQOnv",
+"4dEz6s7Mxk","FFDuilweGy","7ku1pD6rBy","MK07YNAFuw","QssNCSWfou","O3iyQECMvU","RzaZAQClRL","BCxeCIBe8k","ZhwG1Cfgr3","Ul4a1HzZT8",
+"YjB9t55rfB","tAOsr7lUXZ","7hyVvCIShG","In3NSQssNC","Z4I1vzz4ZU","YOfrYQ6hMC","jiVBPazIWp","e6e4zQnJ1S","9eoRcwiHrZ","jeskSBFkb8",
+"wiHrZtlILt","pFrrl45cIH","mz8gxC2Irc","CxVEfbrhlQ","aL6AJRxrsm","Yh1hFmz8gx","4dEz6xciqp","GSQwjAOgEe","a00b5n8pJ9","bZLvSpAhR1",
+"5ZaEzpWiOs","GrDg7jfREu","HlUbFNo0Qb","0BmCyEoToP","fcJOyoQ87r","JJs5mM6qcG","KASQ8euZA5","RzaZAVBjhz","MmsIozz4ZU","16lHctl72W",
+"4W0TlHfyNQ","Z4I1vfcJOy","yvOMIuQIcz","QYxC0tl72W","y94nweuZA5","MK07YqUJMd","ZJTXHC2Irc","GrDg7h1zcH","GSQwj5Drn0","tuDySGXdoH",
+"h1zcHlH1kt","5VZjS9y4lw","2Nslm5iGN5","B3qemOUqFM","TCgPpjeskS","ix74rh1zcH","Pb1paFhtgl","azIWpHRxd8","ogLgchi5X7","JJs5mOz8yZ",
+"KZamHBpYhV","Ul4a1CNHmv","ZUnqtjSjS3","aFFssU3yw5","29QAzAXpwE","6q6L9fFDrJ","s7Mxkt98iW","FPfSE9eoRc","5nmWvs4786","uZPqgv1Hln",
+"0KyfsKASQ8","zY1GYMmKGJ","i3pyd2DREs","sx5Glxciqp","K20wK1j5L8","uJScXnlaBy","LewvMjS1aj","ulk417Ow5C","nlaByJRJQB","jS1ajlCMxy",
+"NOHszs93Ml","fcJOyOHaBz","ulk41Z4I1v","dmoS79XyT9","S2Dfub29RJ","jiVBPuZPqg","VLTy6jeskS","Q6hMCdQ586","Chuy3qUJMd","J2mQiru4UG",
+"tuDySWaWsv","CIShGFwEJz","tuDyS1v5hH","BCxeCuZPqg","OUYuFK20wK","0BmCyguMb8","ReKEWTwano","Ta8f6dmoS7","CIShGSs0Zu","yvOMIFwEJz",
+"NAFuwNOHsz","S77LHUlU3M","MK07Ydpe1v","CK5W78cVD3","OUqFMuupzk","7X3uyU3yw5","Yh1hFaFFss","5NammksJby","8hJdtuN6r3","Cfgr3Gv3Fq",
+"2ZHdk2Yz7E","EdBKcrKDLJ","FnPFBjS1aj","yluBxF6PT2","cQOnvTXQ0Z","7lUXZF6PT2","fcwDaAXpwE","VNCPdaL6AJ","gdQsSvOqCE","pv0i7sqVrf",
+"MaJQsfqypy","iB08lOxWIH","suY4xRsQUq","i7WMQRBhp0","jeskSAOgEe","suY4xVerEA","Gv3FqzmLYD","0BmCyiwzGk","oQ87rRBhp0","bgJAzuZPqg",
+"3weIFhSSvQ","Gv3Fq5Drn0","FjHXRtvdkD","qQxHPZv7z0","dpe1vt59lR","ix74rW7cTs","5VZjSP6bcg","8U2nUdpe1v","yofH35IhmG","FLspht98iW",
+"he9IA9GXkX","Zv7z0Ta8f6","No0Qb618Di","RzaZAgjUTu","zY1GYTa8f6","Y1mC00ao3l","dpe1vuupzk","Ss0ZuUvlv4","JKWYRk85Ae","ni2v1ciuWz",
+"7lUXZJRJQB","5Mg9rZzJHW","uTacxRpBQm","AOgEeVIlwP","ZzJHWeuZA5","GWqqXpmeCd","Q6Lix0ao3l","ZhwG1Z4I1v","0YAGHReKEW","NhXduv1Hln",
+"yvOMIPOUYS","AXpwErKDLJ","atef2SWfou","0h1b1FxX9q","aez9yAIYUu","9XyT9StlDJ","zbIYYDcpWB","M3zXLxciqp","he9IAni2v1","W7cTsCqqaD",
+"jtn0XuoStw","ThjNnFLsph","AXpwEiB08l","m4bxUJJs5m","Q6LixB3qem","oQ87roGu6x","hE1QlAmdQd","1LB1Ldpe1v","WreyPCNHmv","Waim6t98iW",
+"gjUTurz7Ut","HzZT82Nslm","GXdoHVLTy6","uLtKsuLtKs","2ZHdk8FmFH","s93MlFFDui","soy9tuupzk","pT8wuXflUq","WmadAtuDyS","M3zXL5nmWv",
+"OHaBzBpYhV","OUqFMs93Ml","YOfrYPYBf4","4QMc95Mg9r","pWiOsKr8ys","K4GS8GSQwj","VNCPdfqypy","tvdkDlkMUA","8FmFHYh1hF","AIYUu9GXkX",
+"jtn0XOUYuF","9eoRczQt6Q","JRJQBJRJQB","5NammJJs5m","fcwDatuDyS","jzUqROUYuF","lViBv8FmFH","djsrvJXljW","Twano8xEKz","Mm8siBpYhV",
+"soy9ttlILt","gf8rIjeskS","AXpwE5ZaEz","XflUqOHaBz","oGu6xZJTXH","RkQkeIKxdL","9y4lwAgJHQ","GSQwjpAhR1","QworuLbRTH","k85AeWmadA",
+"5Mg9rtvdkD","7ku1pRxrsm","sqVrfn8pJ9","qaofNoVQp6","guMb8Yf2Ec","14FLRuupzk","lweGyl83Ud","LewvMlm0pD","uTacxP6bcg","lkMUAgf8rI",
+"zY1GYP6bcg","AmdQdC2Irc","cQOnvQClRL","m4bxUhi5X7","Ta8f6sqVrf","Nxx9VjiVBP","L7cGcJJs5m","RkQke0Wr5y","L7cGcydG8U","64s8NpvgjS",
+"Oz8yZcShY2","QssNC0Wr5y","9GXkXlsQGo","ogLgcTCgPp","JkzUnoVQp6","JIqXicL0aE","LbRTHJJs5m","FFDuiMmKGJ","tjQxszY1GY","BbwgAn8pJ9",
+"s93Ml0Wr5y","uupzkvLsmS","6q6L9K20wK","9XyT9IBe8k","4dEz6KZamH","AOgEeEOE1o","L7cGciKqhr","RBhp0yEfy9","Nxx9VUmaEv","IjTwPcShY2",
+"hYBCKDz1R3","gf8rINcICA","SWfouHzZT8","GrDg7suY4x","IjTwPiKqhr","a00b5uJScX","K20wKjeskS","EoToPRpBQm","5NammZuDtD","ZUnqt0MR5X",
+"Y1mC0v2eC3","S2DfuFGzgp","d85a9CIShG","hE1Ql0Kyfs","kZANmUl4a1","7X3uy2Yz7E","5drc6vkCHH","L7cGcblLA9","5VZjS7fsYM","cShY2No0Qb",
+"5nmWvM3zXL","yToGWfcJOy","Ss0ZuOUYuF","mz8gxMmKGJ","qQxHP2Yz7E","WDVWJMmKGJ","cL0aEQworu","K20wKn1pmO","Q6Lixdjsrv","BbwgAlsQGo",
+"ECMvUrhl0J","cShY20YAGH","rhl0JM3zXL","CK5W7FGzgp","K4GS87Ow5C","1v5hHgf8rI","FGzgpYh1hF","8RCUAQnJ1S","IRh48iB08l","FcWrWMezSW",
+"7lUXZ5IhmG","7fKYUYOfrY","prNT6Yw2oU","8cVD3k85Ae","07n1ciwzGk","55rfBZJTXH","64s8NVNCPd","0h1b1tuDyS","aFFssRzaZA","m4bxUru4UG",
+"FhtglSmGzv","hUTw7v8yFN","gf8rILewvM","RkQkeAgJHQ","NcICA1j5L8","uJScXuQIcz","faHirLewvM","ni2v1CNHmv","m4bxUFNYIM","9GXkXguMb8",
+"uZPqgVIlwP","uoStw5nmWv","d85a9CNHmv","jiVBPaDGtS","ThjNngIYvE","dpe1vS2Dfu","SjskQPYBf4","TCgPptaOXK","2ZHdk45cIH","Kr8yshSSvQ",
+"iKqhrlH1kt","dhSuH1j5L8","s4786Uvlv4","9XyT9uupzk","Yf2EczHF1q","M6qcG1v5hH","Gv3FqzqH0W","AmdQdLewvM","FjHXRdQ586","uvf7ANo0Qb",
+"8TxD78cVD3","RBhp0Pb1pa","qQxHPuoStw","QClRLgf8rI","RmDcrBpYhV","IRh48uAWyp","oGu6xOxWIH","dhSuHaez9y","rz7UtMkgy8","IKxdLBGaQY",
+"OxWIHyluBx","kB5nPLewvM","5nmWv45cIH","lViBvyluBx","i3pydgtCA5","0ao3lCNHmv","OHaBzHzZT8","uTacxpv0i7","ciuWzuLtKs","EoToPnnP8o",
+"EOE1opiJSk","GXdoHGrDg7","QClRLjS1aj","ydG8UIBe8k","WMiS3WreyP","he9IAHRxd8","t98iWGrDg7","7fsYMXyPZN","lViBvHzZT8","QWxoTHP433",
+"9rlg9cShY2","7lUXZxReec","d85a9CxVEf","Chuy3v8yFN","s7Mxky94nw","v1HlnkZANm","UlU3Mb29RJ","QWxoTI7p2a","XflUqNOHsz","aDGtSuoStw",
+"55rfBsx5Gl","tAOsrXyPZN","VjCZqcShY2","iB08lJRJQB","rhl0JlkMUA","LewvMi7WMQ","U3yw5pFrrl","gtCA5zFgtB","fqypydpe1v","AmdQdd85a9",
+"h1zcHciuWz","TwanoQClRL","W3VFHRsQUq","LbRTHciuWz","dpe1vfcwDa","Gv3Fqi3pyd","5iGN55ZaEz","580YDWPmlx","O3iyQAXpwE","o8Uydn1pmO",
+"vkCHH9y4lw","580YDAkKTk","X6PingjUTu","8xEKzqQxHP","HzZT88FmFH","jtn0XS2Dfu","EOE1o3otm6","jfREuuoStw","uvf7AjiVBP","ZhwG1F6PT2",
+"t59lRCIShG","m4bxUdpe1v","QYxC0ru4UG","S77LHW3VFH","Gv3FqFPfSE","GWqqXh1zcH","d85a9hUTw7","5Mg9rF6PT2","0ao3luQIcz","7Ow5CUlU3M",
+"jS1ajfmIK1","xXTI4SjskQ","yvOMIhE1Ql","vOqCEwDajX","DLhzMgf8rI","14FLRbgJAz","yvOMI0h1b1","hSSvQtl72W","hYBCKOUYuF","BbwgA2Nslm",
+"0h1b17ku1p","EoToPuN6r3","GSQwjs4786","2DREsL7cGc","mX2GExReec","RACuj48cHL","In3NSb29RJ","pvgjSJ2mQi","In3NSFFDui","7fKYU7hyVv",
+"NhXduyvOMI","0KyfstuDyS","XyPZNRkQke","QWxoT5Mg9r","zFgtBIRh48","ciuWzGv3Fq","ulk41n1pmO","dmoS7AgJHQ","lXFOBLDk6f","KsjRK9iGoT",
+"O3iyQRkQke","VjCZq9rlg9","guMb8OUqFM","gjUTuQChxs","JIqXiBpYhV","d85a9GWqqX","YjB9tU3yw5","gtCA5AIYUu","DLhzMJKWYR","HP433VBjhz",
+"MezSWk85Ae","OUYuF9y4lw","OUqFM2ZHdk","QClRL24ARF","0Wr5yoGu6x","KZamHZuDtD","gf8rI8TxD7","ThjNnzz4ZU","MezSWOUqFM","MmsIo0ao3l",
+"dhSuH8cVD3","In3NSCxVEf","oVQp6JIqXi","WPmlx2Nslm","7X3uyZhwG1","5Drn0zbIYY","jeskSAmdQd","sqVrfCqqaD","OUqFMSs0Zu","Ta8f6AXpwE",
+"5iGN5fcJOy","RsQUqZJTXH","0Wr5yciuWz","uZPqgFPfSE","rz7UtbZLvS","ru4UGoGu6x","TCgPpfqypy","pvgjS5Namm","BbwgAoGu6x","qaofNuZPqg",
+"FjHXRzz4ZU","fmIK1KsjRK","7fsYMx3LDe","CxVEfYjB9t","tl72WPYBf4","v1HlnAmdQd","yToGWvLsmS","dmoS70BmCy","I7p2awiHrZ","x3LDea00b5",
+"0PktIdmoS7","WDVWJJJs5m","9iGoTGrDg7","9eoRcatef2","wiHrZ5iGN5","pFrrl7ku1p","dmoS7dQ586","JIqXi29QAz","Pb1paiwzGk","wDajXjeskS",
+"DcpWBYw2oU","55rfBYf2Ec","EoToPZUnqt","oVQp6Z4I1v","Pb1paQnJ1S","G1RhSsuY4x","5VZjSAkKTk","BbwgAHlUbF","lCMxyOHaBz","ydG8UTa8f6",
+"FjHXRvOqCE","BbwgAs4786","BbwgAY1mC0","tAOsrKZamH","Z4I1vuupzk","TXQ0ZlpF6W","WPmlx618Di","SjskQMK07Y","CqqaDZ4I1v","HRxd8lCMxy",
+"QssNCWmadA","0Kyfsfqypy","KZamHAkKTk","iKqhrNxx9V","8TxD7lpF6W","Waim6WMiS3","BCxeCRpBQm","cShY2HP433","gdQsSuupzk","Zv7z03weIF",
+"nnP8olweGy","0ao3lVLTy6","kZANmLDk6f","WDVWJKsjRK","2hEEUMmKGJ","zmLYDGXdoH","KASQ8F6PT2","GXdoHzFgtB","OxWIHhSSvQ","8FmFHJIqXi",
+"iwzGk5drc6","a00b5bZLvS","FxX9q8U2nU","WDVWJXflUq","uN6r3FwEJz","d7vjMBCxeC","okgRiix74r","SmGzvqUJMd","5nmWvFNYIM","5Drn0v1Hln",
+"cQOnv2ZHdk","UmaEvlH1kt","RkQkeBFkb8","WPmlxIKxdL","Mm8sibgJAz","zY1GYFwEJz","gdQsS9GXkX","UlU3M0PktI","gdQsSECMvU","lj07QzHF1q",
+"dhSuHLbRTH","mz8gxqQxHP","ZzJHWFGzgp","s4786618Di","t59lRvOqCE","7lUXZDLhzM","jtn0XPYBf4","5IhmGjSjS3","5nmWvulk41","uN6r30YAGH",
+"lm0pDUmaEv","2Yz7ETXQ0Z","tvdkDG1RhS","zbIYYjtn0X","JRJQB8xEKz","uN6r3StlDJ","MmKGJpWiOs","5Drn04QMc9","AIYUuFGzgp","gf8rIh1zcH",
+"pFrrlQbxXc","FNYIMFjHXR","Ta8f6X6Pin","JXljWk85Ae","8hJdt29QAz","fLNg8ix74r","24ARF5ZaEz","1v5hHs4786","DG4sTCK5W7","LewvMU3yw5",
+"CK5W7KZamH","QworuJIqXi","Ss0ZuC2Irc","uJScXprNT6","brhlQLDk6f","lXFOBRzaZA","Qworu8U2nU","ru4UGfcwDa","L7cGcKASQ8","Chuy3pFrrl",
+"FVMxo5VZjS","piJSk55rfB","zFgtB5Namm","In3NSK20wK","Zv7z0VNCPd","POUYS8cVD3","zbIYYoVQp6","uAWypOHaBz","lsQGocmXIX","tjQxsgIYvE",
+"4QMc9P6bcg","sqVrfCp3mZ","jzUqR64s8N","3weIF9y4lw","uQIczJ2mQi","SWfouU3yw5","GrDg7yluBx","pT8wuLbRTH","gIYvE618Di","oQ87rGSQwj",
+"faHirs7Mxk","FwEJzciuWz","BCxeC7X3uy","AmdQdPOUYS","HfyNQgjUTu","uoStw1v5hH","uJScXgf8rI","JIqXirhl0J","qUJMdn8pJ9","rz7UtciuWz",
+"dmoS7qUJMd","WreyPbrhlQ","VNCPdW3VFH","yofH30MR5X","No0QbdhSuH","lpF6WZv7z0","Yh1hFi7WMQ","sqVrfqUJMd","CIShG5nmWv","LDk6fsqVrf",
+"IRh48MK07Y","kB5nPi3pyd","zFgtBYf2Ec","2Yz7ElXFOB","BbwgAlXFOB","s7MxksqVrf","WreyPRkQke","hYBCKFNYIM","gf8rIJIqXi","Cp3mZiwzGk",
+"Q6Lixrz7Ut","HP433tvdkD","djsrv5VZjS","zQt6Qi3pyd","vLsmSlj07Q","yToGWtvdkD","k85Ae9GXkX","rz7UtdhSuH","hUTw7aL6AJ","Zv7z0KsjRK",
+"7X3uy2TRI7","BpYhVFjHXR","DQimp14FLR","ulk41pWiOs","euZA5Vprf2","pmeCdQssNC","uN6r3OUqFM","vkCHH1j5L8","zz4ZUDG4sT","uN6r3jfREu",
+"MK07Y7Ow5C","LbRTHgjUTu","5VZjSx3LDe","Yf2Ec618Di","uTacxHfyNQ","lViBvfqypy","brhlQGXdoH","rhl0JIKxdL","gIYvEZhwG1","QWxoTpmeCd",
+"GrDg7TCgPp","LDk6fZ4I1v","14FLRBFkb8","AXpwEDLhzM","Twano8TxD7","taOXKCNHmv","BFkb8zHF1q","t98iW7X3uy","UmaEvTCgPp","d7vjMWDVWJ",
+"lViBv5Namm","he9IAi3pyd","2Yz7EHRxd8","aez9y3otm6","O3iyQ0h1b1","gIYvEsqVrf","JKWYRWDVWJ","rhl0JhUTw7","dpe1v5Drn0","618DiyluBx",
+"LbRTH14FLR","jzUqR0MR5X","gIYvE6q6L9","Fhtgl8hJdt","DQimpOz8yZ","lpF6WOz8yZ","XyPZN1v5hH","y94nwW3VFH","vOqCE6AFT0","64s8N2TRI7",
+"yofH3GSQwj","0YAGHdpe1v","MGlTFrhl0J","8xEKzuZPqg","uTacxhUTw7","cShY29y4lw","RsQUq9GXkX","Dz1R37ku1p","HlUbFVerEA","vOqCEsqVrf",
+"jiVBPC2Irc","55rfB7hyVv","BFkb8Cp3mZ","9iGoTSWfou","JXljWK4GS8","Mkgy8gtCA5","AIYUu0YAGH","W7cTsRkQke","MmsIoHRxd8","a00b5yvOMI",
+"G1RhS5Mg9r","tjQxs24ARF","vLsmS0YAGH","djsrvsx5Gl","v8yFNKsjRK","x3LDenlaBy","Dz1R3uZPqg","i7WMQBGaQY","k85AeVprf2","pFrrlogLgc",
+"1v5hH0YAGH","JkzUnFLsph","e6e4zXyPZN","FGzgpFjHXR","vLsmS9rlg9","djsrvatef2","QnJ1S0YAGH","WaWsv1v5hH","AIYUuIn3NS","LewvMAXpwE",
+"PYBf4DLhzM","GXdoHnlaBy","zFgtBuupzk","a00b5suY4x","jtn0XVBjhz","KASQ8HzZT8","9iGoTVIlwP","ydG8UEOE1o","C2Ircix74r","DLhzMHP433",
+"PYBf4EOE1o","s93MlStlDJ","h1zcHpvgjS","gIYvECK5W7","4W0TlblLA9","64s8NjiVBP","OUqFM0YAGH","Mkgy8XyPZN","b29RJ6AFT0","RkQkeHzZT8",
+"Zv7z0a00b5","RpBQmKZamH","euZA5vLsmS","OUqFMP6bcg","LewvMZJTXH","SbRYyMm8si","TXQ0ZzFgtB","zbIYYJXljW","MojnPGrDg7","oGu6xru4UG",
+"fqypy8FmFH","ni2v1Ta8f6","618DijS1aj","7hyVvJJs5m","OUYuFSWfou","vkCHH1LB1L","gIYvECp3mZ","hSSvQzFgtB","CNHmvhYBCK","mz8gxChuy3",
+"RkQkeWMiS3","jiVBPdhSuH","ZJTXHM6qcG","9rlg9ReKEW","GrDg7AkKTk","4W0TlOxWIH","e6e4zO3iyQ","Oz8yZksJby","3weIF9eoRc","BbwgAhe9IA",
+"K4GS8FFDui","yluBx7ku1p","CK5W7Yw2oU","EdBKcuJScX","Twano2Yz7E","ix74rAmdQd","8U2nU2Nslm","QbxXcVIlwP","580YD2Nslm","XyPZNcShY2",
+"nnP8oEoToP","C2Irc2Yz7E","9eoRcWreyP","qQxHP14FLR","lViBvRsQUq","VerEACdyBV","0MR5XcmXIX","uPX7Gs93Ml","Mm8siGSQwj","Y1mC0ru4UG",
+"GSQwjW7cTs","Zv7z09eoRc","55rfB0PktI","BFkb807n1c","UlU3MblLA9","Fhtglulk41","1LB1LjiVBP","7hyVvMaJQs","CdyBVWmadA","ydG8Ud85a9",
+"tAOsrlkMUA","RkQketAOsr","JXljWFhtgl","tuDySUlU3M","UlU3MG1RhS","AmdQd4QMc9","AkKTkQ6hMC","0ao3lHlUbF","y94nwfmIK1","zY1GYulk41",
+"MojnPTXQ0Z","xReechE1Ql","AmdQd0Kyfs","SmGzvJ2mQi","ThjNnK4GS8","gtCA5ZzJHW","uvf7AfmIK1","HP433zbIYY","8FmFH29QAz","DQimps7Mxk",
+"WreyPQnJ1S","5drc6qUJMd","DG4sTMojnP","8xEKzpWiOs","he9IAFFDui","lweGyrKDLJ","SbRYyUlU3M","cmXIXmz8gx","5NammXflUq","wDajXOxWIH",
+"h1zcH1j5L8","JkzUnCNHmv","tuDySsqVrf","tl72WW3VFH","5VZjSNxx9V","Ta8f6jS1aj","FPfSEMGlTF","WDVWJfLNg8","8RCUAru4UG","618Dik85Ae",
+"MojnPhe9IA","t98iWMkgy8","QnJ1SRpBQm","No0QbJRJQB","XflUqMezSW","Kr8ysyluBx","pv0i7ksJby","W3VFH7fKYU","t98iWiKqhr","iB08li7WMQ",
+"nFqikJkzUn","X6PinZ4I1v","VIlwPazIWp","IBe8kyofH3","0KyfsKZamH","4dEz6OUqFM","sqVrf7Ow5C","zqH0WKZamH","soy9teuZA5","NhXduWaim6",
+"WaWsvGrDg7","AgJHQRACuj","pT8wuZhwG1","pWiOsuN6r3","hYBCKhi5X7","ThjNniwzGk","uoStw8hJdt","ZuDtDRsQUq","7X3uy7ku1p","cmXIXEdBKc",
+"EoToPwiHrZ","uoStwBpYhV","Y1mC0guMb8","VerEA8FmFH","v2eC37ku1p","KsjRKBCxeC","In3NSGWqqX","ksJbyBbwgA","Uvlv4MmKGJ","tAOsruJScX",
+"iB08luQIcz","45cIHFNYIM","kZANmciuWz","aez9yIKxdL","bZLvSyluBx","0KyfsZuDtD","mX2GEYOfrY","qUJMd9iGoT","lpF6WVLTy6","kB5nP64s8N",
+"GWqqXzQt6Q","a00b5zHF1q","D6rBy7Ow5C","FnPFBWmadA","lweGylsQGo","07n1c9iGoT","Yh1hFjSjS3","55rfBhi5X7","ZzJHW14FLR","gtCA5S77LH",
+"vkCHHMojnP","5ZaEzhUTw7","FjHXRHzZT8","iKqhrYOfrY","FGzgpL7cGc","gdQsS16lHc","euZA5GrDg7","1LB1LzY1GY","3otm6lH1kt","OUYuFiB08l",
+"hi5X7FjHXR","OUYuF7fsYM","48cHLlj07Q","FGzgpFFDui","qQxHPx3LDe","7Ow5CwiHrZ","xXTI4uupzk","Cfgr3FNYIM","P6bcgzQt6Q","jzUqR9iGoT",
+"taOXKWmadA","iKqhrQworu","zz4ZUZzJHW","l83UdHlUbF","GSQwj07n1c","pvgjSrKDLJ","VjCZqyvOMI","JXljWPYBf4","uJScXyofH3","FGzgpo8Uyd",
+"2TRI7jzUqR","v8yFNCxVEf","lH1kt2ZHdk","iB08lDLhzM","rhl0JEdBKc","dmoS7WMiS3","Q6hMCIjTwP","jSjS3AkKTk","OHaBz580YD","d7vjMOHaBz",
+"Yf2Ecv1Hln","JKWYRQYxC0","l83UdDQimp","pvgjSDQimp","jiVBP618Di","azIWpWreyP","Zv7z0LewvM","uPX7GhSSvQ","JRJQBGXdoH","M6qcGMGlTF",
+"6AFT0pvgjS","VLTy6U3yw5","TCgPpKZamH","Cp3mZ1LB1L","yofH3RkQke","0Wr5yTCgPp","Mkgy8atef2","jtn0X8FmFH","EdBKcReKEW","ZUnqtZhwG1",
+"rKDLJDQimp","uZPqgD6rBy","3otm6tjQxs","QworuJ2mQi","wDajXSbRYy","blLA9v8yFN","lj07QRBhp0","lm0pDl83Ud","I7p2a5Mg9r","7fKYUguMb8",
+"DcpWBQ6Lix","OUYuFThjNn","8TxD7M6qcG","ZJTXHQ6hMC","WaWsv5Namm","1v5hH4QMc9","mX2GEhe9IA","dmoS7taOXK","Vprf2FxX9q","hSSvQO3iyQ",
+"CK5W76AFT0","FNYIM0MR5X","oVQp6uvf7A","Yw2oUI7p2a","FNYIMFFDui","45cIHTwano","ECMvUhYBCK","d85a9mz8gx","8FmFHjfREu","mX2GEuAWyp",
+"b29RJU3yw5","ogLgcQbxXc","i7WMQQ6Lix","Ta8f6BbwgA","FNYIMRpBQm","dmoS7azIWp","W7cTsSWfou","2NslmtAOsr","24ARFv8yFN","Q6hMCFNYIM",
+"SWfouhUTw7","0KyfsuN6r3","IRh48v2eC3","FFDuiUl4a1","Dz1R3Chuy3","WmadAwDajX","oGu6x8U2nU","sx5Gl5Mg9r","piJSk24ARF","tjQxsQWxoT",
+"EdBKco8Uyd","2Yz7EqQxHP","RzaZA7fsYM","lj07QBCxeC","VIlwPs7Mxk","07n1cUvlv4","dmoS7prNT6","yofH3OUYuF","qaofNKsjRK","NcICA2ZHdk",
+"KASQ89GXkX","jSjS35iGN5","aFFssTCgPp","fmIK1piJSk","W7cTsfmIK1","8RCUA3otm6","JJs5mjS1aj","iqv4khe9IA","CNHmv5nmWv","lH1ktXyPZN",
+"jfREuoQ87r","CqqaDRmDcr","8cVD3ZhwG1","SjskQUmaEv","zQt6QblLA9","uAWypKsjRK","JKWYR45cIH","BpYhVNo0Qb","pT8wukZANm","hSSvQ1v5hH",
+"xciqpYw2oU","WaWsv55rfB","5iGN5s7Mxk","5IhmG0h1b1","In3NSMaJQs","suY4xMmKGJ","yofH3Qworu","Oz8yZ55rfB","9y4lwCNHmv","Ss0Zu64s8N",
+"kB5nP5IhmG","lViBv7Ow5C","pv0i7v8yFN","Gv3FqYOfrY","jeskSkZANm","8U2nUyToGW","0BmCyY1mC0","0PktIFNYIM","BbwgANcICA","ni2v1xXTI4",
+"x3LDesuY4x","zHF1qFGzgp","HfyNQG1RhS","NAFuw2TRI7","IjTwPBpYhV","2DREsY1mC0","FwEJznlaBy","qaofNni2v1","5iGN5rhl0J","faHir2hEEU",
+"oQ87rtjQxs","oVQp68xEKz","tAOsrokgRi","lweGym4bxU","ydG8Uk85Ae","yluBxbrhlQ","MK07Ygf8rI","n1pmOulk41","4dEz6Q6Lix","8RCUADz1R3",
+"LDk6f580YD","2TRI7NcICA","uZPqgyToGW","Q6LixLewvM","v8yFNNhXdu","G1RhSChuy3","lj07QfaHir","RsQUqAgJHQ","a00b50Wr5y","LbRTH1LB1L",
+"uN6r3Ul4a1","Q6LixW3VFH","Dz1R3EoToP","5ZaEzsqVrf","FPfSEciuWz","FwEJzM3zXL","P6bcgvLsmS","StlDJEOE1o","Uvlv4ZuDtD","uN6r3M3zXL",
+"4W0TlAmdQd","G1RhSuN6r3","lweGyFLsph","GSQwjFLsph","aDGtSBFkb8","lsQGoFGzgp","POUYSnlaBy","5nmWvwiHrZ","JIqXioQ87r","WPmlxxReec",
+"pv0i7lH1kt","pAhR1lH1kt","QbxXcwDajX","sx5Gliqv4k","5Namm9eoRc","QbxXcJIqXi","fLNg8TCgPp","KsjRK2Yz7E","lpF6W3weIF","tAOsrfqypy",
+"n1pmOAkKTk","2DREs8U2nU","dhSuH07n1c","CqqaD0YAGH","KsjRKv1Hln","OxWIHhe9IA","EOE1oJ2mQi","Y1mC0JkzUn","lweGy1j5L8","POUYSpmeCd",
+"qaofNKr8ys","RsQUqVIlwP","Mkgy8Vprf2","kB5nPgdQsS","CdyBVy94nw","cmXIX2ZHdk","gf8rInnP8o","yofH3okgRi","ydG8UcQOnv","iB08lZzJHW",
+"NhXduHlUbF","n8pJ9Mm8si","I7p2aFhtgl","XflUq2ZHdk","Cp3mZYf2Ec","MmKGJIjTwP","MGlTFy94nw","QworuLewvM","soy9t0h1b1","FxX9qI7p2a",
+"uTacxd85a9","8RCUAb29RJ","iKqhrKr8ys","VjCZqNcICA","U3yw5BbwgA","O3iyQyToGW","d85a9fFDrJ","5Mg9rQ6Lix","kB5nPwDajX","U3yw5S77LH",
+"lXFOBQClRL","ulk41KsjRK","oQ87r07n1c","hi5X7D6rBy","dpe1vW7cTs","he9IACIShG","yluBxhUTw7","5IhmGJIqXi","s4786dhSuH","0h1b1XyPZN",
+"cL0aEjfREu","ZuDtDW3VFH","iB08l7fKYU","zFgtBYw2oU","8TxD7faHir","pT8wutaOXK","RxrsmHlUbF","7fKYUAXpwE","GrDg7GrDg7","9GXkXdQ586",
+"Q6LixCfgr3","NOHszVLTy6","hi5X75Mg9r","ciuWzk85Ae","Ss0ZuFLsph","KZamHtjQxs","HlUbFkZANm","s7Mxkaez9y","580YDiB08l","HfyNQlj07Q",
+"7hyVvuupzk","jiVBPhE1Ql","0PktIJKWYR","XflUqThjNn","0PktIdhSuH","lkMUAo8Uyd","AgJHQCp3mZ","QnJ1SB3qem","ZzJHWZzJHW","l83UdPYBf4",
+"i7WMQ9rlg9","NOHszwiHrZ","uN6r3EOE1o","lm0pD5ZaEz","WaWsvF6PT2","HfyNQsx5Gl","i3pydbgJAz","uN6r3s7Mxk","Yw2oU9XyT9","h1zcH0ao3l",
+"ulk41aL6AJ","soy9t55rfB","55rfBdhSuH","fcJOyb29RJ","NhXduEoToP","8RCUAMaJQs","uZPqgRkQke","pvgjSDz1R3","lH1kttl72W","5iGN5CdyBV",
+"t59lRX6Pin","9iGoTQ6Lix","8RCUAfLNg8","kZANm1v5hH","zqH0WydG8U","VBjhzXflUq","cQOnvblLA9","VBjhzFnPFB","RpBQmiB08l","xciqpHfyNQ",
+"nnP8ozFgtB","Vprf2OUqFM","oGu6xsqVrf","2TRI7xReec","7Ow5CpmeCd","3otm6yvOMI","EdBKcmz8gx","Waim6MGlTF","29QAzuJScX","BpYhVXflUq",
+"atef2CK5W7","F6PT2HRxd8","v2eC3P6bcg","8U2nUSbRYy","pv0i7fcwDa","lm0pD5drc6","3weIF29QAz","DcpWB2Yz7E","bZLvSYjB9t","dQ586fLNg8",
+"BGaQYQnJ1S","2NslmdmoS7","yvOMI9y4lw","brhlQWaim6","FcWrWzHF1q","4QMc93otm6","zY1GYuPX7G","RBhp0i3pyd","VjCZqlj07Q","14FLRhUTw7",
+"FjHXRQChxs","sx5GlHzZT8","VerEAVerEA","zQt6QjfREu","IjTwPECMvU","CK5W72Nslm","uN6r3MojnP","tlILtCK5W7","580YDG1RhS","vLsmSWMiS3",
+"fcwDaEdBKc","brhlQk85Ae","B3qemdpe1v","Y1mC0Zv7z0","1v5hHNo0Qb","StlDJo8Uyd","8FmFHRBhp0","MmsIot59lR","5drc6Mm8si","oVQp6zY1GY",
+"SbRYyNAFuw","xReecOUqFM","FnPFBVerEA","Oz8yZ9eoRc","uLtKsvLsmS","MojnP1LB1L","PYBf4uvf7A","5VZjSS2Dfu","QClRLRmDcr","SWfouWreyP",
+"AIYUu7fKYU","vOqCEfaHir","X6Pinhi5X7","FVMxo5drc6","WPmlxhE1Ql","OUqFMlXFOB","BGaQYatef2","S77LHFFDui","5Drn0fFDrJ","JJs5m9y4lw",
+"faHirWreyP","9rlg9QssNC","pWiOsAgJHQ","VIlwPd85a9","FLsphgIYvE","I7p2ahE1Ql","Yw2oUmz8gx","MezSWru4UG","HzZT8Zv7z0","M6qcGlweGy",
+"jfREu0Wr5y","WMiS3C2Irc","fcJOyG1RhS","jeskS0YAGH","uJScXVLTy6","cShY28TxD7","sqVrfReKEW","8RCUAYh1hF","FwEJzOxWIH","EoToPjzUqR",
+"Cfgr3DcpWB","k85AegtCA5","y94nw14FLR","D6rByyluBx","HRxd8gtCA5","Waim6s4786","WreyPyEfy9","64s8N5drc6","Cfgr3lkMUA","NcICAk85Ae",
+"Qworux3LDe","9GXkXRzaZA","x3LDeKZamH","PYBf4OUYuF","4QMc9NcICA","FxX9qzFgtB","dQ586tvdkD","ReKEW8RCUA","jzUqRFcWrW","i3pydBbwgA",
+"yToGWLewvM","Vprf2CIShG","JRJQBHlUbF","OUYuFSmGzv","AIYUuUl4a1","VjCZqv1Hln","5Drn0RzaZA","prNT6M3zXL","IjTwPfmIK1","6q6L9Gv3Fq",
+"9XyT9a00b5","cL0aEblLA9","HP433m4bxU","KZamHNAFuw","PYBf4lkMUA","0KyfsCfgr3","9XyT9faHir","lsQGoiqv4k","WMiS35Drn0","FhtglsuY4x",
+"S77LHWMiS3","tl72W5Mg9r","WaWsvru4UG","M3zXLcShY2","uJScXhi5X7","prNT6GXdoH","uupzkGXdoH","Mkgy8BGaQY","FLsphulk41","FFDuidQ586",
+"QworuuTacx","0YAGHSWfou","uPX7G2DREs","QClRLZv7z0","v2eC35iGN5","VBjhziKqhr","TXQ0ZZv7z0","h1zcHUvlv4","QClRLfcJOy","0PktI0Wr5y",
+"MGlTF7lUXZ","DLhzMCp3mZ","aL6AJJRJQB","45cIH5Drn0","jfREuix74r","9iGoTStlDJ","jS1ajzFgtB","ciuWzO3iyQ","55rfB7Ow5C","5drc6Twano",
+"fmIK1vOqCE","lpF6WVBjhz","AXpwEs4786","Y1mC0hSSvQ","RACuj4QMc9","oGu6x6AFT0","MojnPRsQUq","pAhR1mX2GE","cL0aEuJScX","Waim6guMb8",
+"RkQkei3pyd","Y1mC0uvf7A","fLNg89iGoT","QClRLRACuj","pAhR1SWfou","Ul4a1pmeCd","HRxd8lH1kt","gjUTuprNT6","5drc6atef2","MojnPeuZA5",
+"Ss0ZucL0aE","24ARFxXTI4","UlU3Md7vjM","RkQkeZJTXH","MojnPRmDcr","PYBf4QnJ1S","WMiS3Y1mC0","aFFssuPX7G","d7vjMHRxd8","8xEKzx3LDe",
+"hYBCKRACuj","K20wKyvOMI","0BmCyydG8U","Oz8yZ4W0Tl","S77LHDz1R3","cL0aEVerEA","QbxXcgdQsS","8U2nU9rlg9","Q6LixU3yw5","h1zcHuJScX",
+"gjUTukZANm","Q6Lix2TRI7","QWxoTaDGtS","hSSvQatef2","uJScX16lHc","0YAGHRkQke","CqqaDJIqXi","iwzGkGXdoH","DcpWBAOgEe","WmadANhXdu",
+"fmIK1gtCA5","VBjhzZuDtD","o8UydMkgy8","5drc6faHir","P6bcgY1mC0","CIShGcShY2","AgJHQrz7Ut","Yh1hFWaim6","t59lR5nmWv","NAFuw5iGN5",
+"SWfou5iGN5","K20wKG1RhS","iKqhr3otm6","BpYhVJkzUn","6q6L9i7WMQ","ThjNnsoy9t","RACujlweGy","5VZjSFPfSE","brhlQlXFOB","ZUnqtVNCPd",
+"Cp3mZ1j5L8","v2eC39y4lw","okgRiVNCPd","yEfy9Ul4a1","IRh48CK5W7","ksJbytuDyS","lkMUAm4bxU","VLTy6FLsph","DLhzMEdBKc","pFrrl6AFT0",
+"S2Dfu14FLR","uupzklj07Q","AIYUuksJby","lXFOBRBhp0","ZJTXHOUqFM","5drc6QYxC0","x3LDeOUYuF","v1Hlnsoy9t","EoToP5nmWv","wDajXBFkb8",
+"lH1ktIjTwP","zmLYDvOqCE","55rfBWaWsv","jeskSTwano","jzUqR9eoRc","5IhmGPb1pa","aDGtSOHaBz","tAOsrMGlTF","cQOnv4QMc9","8FmFHl83Ud",
+"faHir9y4lw","1LB1L3weIF","iwzGkI7p2a","uTacxJIqXi","jiVBPChuy3","ZUnqtfqypy","Qworu0MR5X","dpe1vZJTXH","0Kyfsaez9y","wDajX9eoRc",
+"zFgtBaDGtS","LewvMXyPZN","d85a9lweGy","ThjNnMkgy8","k85Aefqypy","EOE1oCxVEf","0BmCyFLsph","OHaBzGSQwj","FLsphSmGzv","VIlwPjtn0X",
+"0ao3lsoy9t","sqVrfy94nw","DQimpKsjRK","piJSksuY4x","jSjS3SjskQ","yluBxpv0i7","O3iyQReKEW","fcJOyy94nw","SjskQJkzUn","JIqXitaOXK",
+"uJScX0YAGH","djsrv7fKYU","bZLvSMaJQs","PYBf4soy9t","jiVBPNcICA","5Mg9rQbxXc","fcwDaMezSW","SWfoulj07Q","uvf7AuAWyp","5nmWv9y4lw",
+"FhtglbrhlQ","I7p2awDajX","hi5X7618Di","i7WMQMGlTF","AmdQd5Mg9r","HzZT8lXFOB","HlUbFrhl0J","CNHmvFxX9q","zz4ZUAOgEe","8TxD7OUYuF",
+"J2mQi24ARF","CIShGdpe1v","jtn0XMkgy8","ix74rK4GS8","pFrrl2Yz7E","16lHcBbwgA","iKqhrPOUYS","lkMUARkQke","ix74rlweGy","v8yFNkZANm",
+"LbRTHzY1GY","BbwgAX6Pin","brhlQuPX7G","ni2v1uTacx","TCgPpxciqp","rhl0JJ2mQi","IjTwPMmKGJ","Yf2EcblLA9","JkzUnUlU3M","JIqXio8Uyd",
+"Q6Lix8RCUA","mX2GE2Nslm","zQt6Q0MR5X","RxrsmTa8f6","B3qemYf2Ec","iqv4kRsQUq","i3pydyEfy9","J2mQiEdBKc","1v5hHwDajX","RkQkedjsrv",
+"MK07YgIYvE","jtn0Xuvf7A","M3zXL7ku1p","OxWIHK20wK","MezSWbrhlQ","pAhR1qUJMd","faHirRpBQm","JXljWvOqCE","D6rByCK5W7","TCgPpJXljW",
+"vkCHHHRxd8","XflUqVBjhz","kB5nPEoToP","Nxx9Vh1zcH","Gv3FqCqqaD","guMb8In3NS","Y1mC0VIlwP","POUYSKZamH","i7WMQiwzGk","W7cTsNo0Qb",
+"uZPqglweGy","D6rByQWxoT","fcwDauupzk","djsrvHfyNQ","fFDrJlj07Q","wDajXRzaZA","pvgjSdjsrv","AkKTkfmIK1","Gv3Fqpv0i7","mz8gxguMb8",
+"GWqqXjeskS","OUqFMpv0i7","qaofNxciqp","0ao3lFjHXR","okgRi7hyVv","B3qemVjCZq","wiHrZeuZA5","BGaQYIBe8k","NOHszMezSW","OxWIHaFFss",
+"xReeckB5nP","LbRTHydG8U","B3qemzQt6Q","580YDyvOMI","FPfSE2ZHdk","U3yw5QbxXc","kB5nPqQxHP","Uvlv47Ow5C","x3LDev2eC3","lViBvQnJ1S",
+"BpYhV9eoRc","RzaZA9XyT9","vOqCEuAWyp","lj07Q8FmFH","GSQwjuPX7G","JKWYRfLNg8","mz8gxt59lR","HfyNQ7ku1p","M3zXLmX2GE","s4786k85Ae",
+"1j5L824ARF","lm0pDQYxC0","lCMxyt98iW","iB08lO3iyQ","uAWypStlDJ","UlU3M2TRI7","lm0pDOHaBz","lweGypmeCd","580YDix74r","5Mg9rjeskS",
+"QClRLzQt6Q","gf8rI5ZaEz","zz4ZU5drc6","qUJMdjeskS","0h1b1lCMxy","DLhzMFwEJz","bZLvSblLA9","O3iyQWreyP","WmadAZzJHW","lsQGogIYvE",
+"ThjNn9rlg9","kZANmNAFuw","Cp3mZQClRL","MGlTF1j5L8","DQimpiKqhr","Gv3FqRxrsm","UlU3MMaJQs","yvOMIuPX7G","vkCHHvOqCE","pWiOszmLYD",
+"JIqXil83Ud","jiVBPi3pyd","DLhzMPYBf4","14FLRtAOsr","FLsph9rlg9","XyPZNmX2GE","okgRi9iGoT","X6PinRpBQm","POUYS7X3uy","DcpWBNAFuw",
+"hUTw72Nslm","VBjhzpAhR1","EoToP7lUXZ","ZzJHWYf2Ec","RBhp0Nxx9V","VjCZqcQOnv","RmDcrGv3Fq","9GXkXCfgr3","iwzGkpWiOs","9eoRc14FLR",
+"HRxd8bZLvS","Ta8f6S77LH","t59lRo8Uyd","5VZjSQ6hMC","8TxD7BCxeC","45cIH7ku1p","9GXkX9XyT9","Ta8f6d85a9","FPfSEMm8si","No0QbQYxC0",
+"FNYIMguMb8","YjB9tMaJQs","s7MxkkB5nP","XyPZNuTacx","lm0pDlsQGo","jtn0XSbRYy","AgJHQyvOMI","CNHmvB3qem","nFqikuPX7G","5VZjS1v5hH",
+"WmadAfcJOy","Y1mC0l83Ud","uLtKsSs0Zu","5Mg9r8RCUA","fFDrJgdQsS","IjTwPDQimp","SmGzvcmXIX","29QAzIjTwP","ECMvUVLTy6","uTacxFGzgp",
+"580YDXflUq","faHirlj07Q","ZuDtD4W0Tl","S77LHfFDrJ","MGlTFv8yFN","DcpWBTXQ0Z","5drc69rlg9","C2IrcJRJQB","lXFOBksJby","M3zXLNOHsz",
+"9GXkXIKxdL","ix74rjSjS3","soy9thYBCK","K20wKgjUTu","BpYhVDz1R3","ZJTXHzbIYY","LbRTHZUnqt","uoStwK4GS8","FPfSE0PktI","zQt6QHRxd8",
+"AgJHQix74r","SmGzv8hJdt","okgRiHlUbF","kZANmbrhlQ","iqv4kCIShG","Fhtglsx5Gl","QnJ1SKsjRK","SmGzviKqhr","FVMxoZ4I1v","VNCPdKASQ8",
+"pFrrlO3iyQ","29QAzK4GS8","DcpWBlj07Q","Chuy3x3LDe","gdQsSTCgPp","AXpwESbRYy","0YAGHbZLvS","Yh1hF8xEKz","lsQGoYf2Ec","OxWIHwDajX",
+"D6rByoGu6x","WaWsvIBe8k","h1zcHHlUbF","UmaEvlXFOB","QbxXcyluBx","ZhwG1Uvlv4","TCgPpEdBKc","aFFss580YD","DQimpcQOnv","lH1kt5IhmG",
+"4dEz6SjskQ","55rfBYw2oU","v8yFN2Yz7E","W3VFHRzaZA","xXTI4lkMUA","BpYhVqQxHP","kZANmzY1GY","P6bcgJkzUn","TXQ0ZRACuj","S2DfuoQ87r",
+"5VZjSUvlv4","5ZaEzuLtKs","zbIYYMojnP","RxrsmW3VFH","O3iyQWPmlx","vLsmSlm0pD","8hJdtjSjS3","WDVWJiB08l","IBe8kHlUbF","ru4UGIKxdL",
+"vkCHHL7cGc","6AFT0KASQ8","DG4sT2DREs","2NslmCIShG","lkMUA4dEz6","i3pyd0PktI","ZhwG1bgJAz","CNHmv14FLR","SmGzv0Wr5y","x3LDe9GXkX",
+"DLhzM1LB1L","In3NSMmKGJ","GXdoH8TxD7","JRJQBZ4I1v","EoToPJKWYR","pvgjSxciqp","ix74rcQOnv","QYxC0JIqXi","n1pmOcL0aE","K20wKWmadA",
+"M6qcGCIShG","piJSkQbxXc","9XyT9EdBKc","WreyPuTacx","Ss0ZufaHir","CK5W71j5L8","wiHrZ2Yz7E","Zv7z0ZzJHW","pvgjSZuDtD","azIWpNxx9V",
+"GWqqXLewvM","BFkb8JkzUn","WPmlx5Drn0","BpYhVo8Uyd","lsQGoYw2oU","1j5L848cHL","7fsYMHP433","pmeCdd85a9","JXljWn8pJ9","KASQ8PYBf4",
+"dmoS7Q6hMC","64s8NK4GS8","suY4xfaHir","16lHcEoToP","lj07QkZANm","9iGoTksJby","8hJdt6q6L9","ksJbyDG4sT","qQxHPCfgr3","SWfouS77LH",
+"QnJ1SHP433","ru4UGL7cGc","yToGWNAFuw","d7vjM7fsYM","QClRLFFDui","d85a92DREs","8TxD7F6PT2","EOE1opWiOs","J2mQil83Ud","WreyPL7cGc",
+"lpF6W0ao3l","OUqFMYf2Ec","uoStws4786","NcICAOUqFM","PYBf4jS1aj","WaWsvlpF6W","OHaBzIKxdL","lH1kt2Nslm","RACujPOUYS","WmadAvOqCE",
+"wiHrZD6rBy","vLsmS0PktI","ECMvUBpYhV","i7WMQTXQ0Z","GXdoHIn3NS","5ZaEz5Mg9r","jiVBPlXFOB","FFDuidjsrv","FxX9qblLA9","Dz1R3VjCZq",
+"8FmFHPOUYS","HzZT8iqv4k","DLhzMM3zXL","uN6r3fLNg8","NOHszulk41","JIqXifFDrJ","48cHLFhtgl","zmLYDFNYIM","7fKYUOz8yZ","AOgEeogLgc",
+"piJSkh1zcH","WreyPDcpWB","L7cGcZv7z0","JJs5mxReec","6AFT0Z4I1v","s478629QAz","zFgtBn1pmO","nFqikru4UG","8FmFHsqVrf","Uvlv4Dz1R3",
+"NhXduuJScX","uvf7As93Ml","Mm8siPb1pa","bgJAz8U2nU","zz4ZUZUnqt","SmGzv5IhmG","pWiOslkMUA","nlaByi7WMQ","HfyNQZv7z0","v1HlnYf2Ec",
+"CIShGW7cTs","45cIHMK07Y","xciqpPOUYS","zbIYYReKEW","tlILtfcwDa","GrDg7Cp3mZ","RmDcrpWiOs","WreyPlH1kt","nFqikfmIK1","U3yw5lkMUA",
+"FnPFBpAhR1","J2mQiMaJQs","fcJOyjeskS","CNHmvzQt6Q","yEfy9sqVrf","No0QbaFFss","S2Dfu5nmWv","MGlTFJRJQB","s93MlNOHsz","ulk41LewvM",
+"sx5GlO3iyQ","yluBxAXpwE","O3iyQzHF1q","KASQ88TxD7","uTacxxReec","uJScXo8Uyd","Q6LixuTacx","v1Hln9y4lw","fLNg85IhmG","pAhR1d85a9",
+"t98iWl83Ud","ZJTXHtlILt","DLhzMGXdoH","jiVBP3weIF","45cIHDQimp","618DiWaim6","2DREsAXpwE","ni2v1b29RJ","VBjhzLbRTH","kB5nPtAOsr",
+"TwanoDLhzM","IKxdLHP433","nFqikcQOnv","7hyVvECMvU","JXljWzz4ZU","X6PinIRh48","hSSvQOUYuF","45cIHfmIK1","lsQGob29RJ","C2Ircru4UG",
+"jtn0Xjtn0X","qQxHPzmLYD","M6qcGhi5X7","Dz1R355rfB","QChxsoQ87r","OHaBzRpBQm","ZUnqtU3yw5","fFDrJ4W0Tl","BCxeC5nmWv","WPmlxJRJQB",
+"dQ586W7cTs","HP433Yh1hF","07n1ci3pyd","ru4UGCK5W7","lm0pDvLsmS","0PktINhXdu","Qworuaez9y","Zv7z05nmWv","hi5X7MaJQs","vkCHH4QMc9",
+"X6PinLDk6f","RkQkeFPfSE","9XyT95Mg9r","9eoRcpiJSk","9eoRc0MR5X","ZUnqtprNT6","5Namm2TRI7","Ta8f6yEfy9","Ul4a1AXpwE","W3VFH580YD",
+"5ZaEzwiHrZ","uoStwbrhlQ","iqv4kRBhp0","t98iWulk41","vOqCEtvdkD","zqH0WBFkb8","Gv3Fqjtn0X","LDk6fS2Dfu","OUqFMCNHmv","CqqaDU3yw5",
+"In3NSuupzk","okgRiLewvM","soy9tQnJ1S","lsQGoy94nw","8hJdtdmoS7","BCxeChi5X7","fmIK1oVQp6","IjTwPyToGW","FGzgpMmKGJ","ydG8UfcJOy",
+"zz4ZUF6PT2","F6PT2QssNC","taOXK9XyT9","lsQGo4W0Tl","rKDLJhe9IA","ZzJHWOUqFM","HlUbF1v5hH","djsrvfqypy","uQIcz7fKYU","7hyVvFwEJz",
+"SjskQ6q6L9","RBhp04dEz6","Mm8siMGlTF","NOHszzHF1q","mz8gxQClRL","BCxeCPb1pa","YOfrYni2v1","LbRTHNo0Qb","8cVD3rhl0J","B3qemdmoS7",
+"gtCA5P6bcg","2Yz7EydG8U","s4786uPX7G","0ao3lWMiS3","jS1ajWreyP","S77LHPOUYS","k85AeIjTwP","AkKTkHzZT8","jSjS3Nxx9V","tl72WFGzgp",
+"qUJMd7hyVv","HzZT8VBjhz","brhlQGrDg7","iB08ln1pmO","W7cTss93Ml","NcICAnFqik","1LB1LJkzUn","4dEz6BCxeC","pT8wud7vjM","wiHrZHlUbF",
+"pFrrll83Ud","JIqXiAIYUu","F6PT2FxX9q","ulk4124ARF","sx5GluZPqg","Y1mC0dQ586","lCMxyatef2","VerEARxrsm","Nxx9VAXpwE","yofH3QWxoT",
+"yluBxcL0aE","qUJMdB3qem","suY4xTCgPp","7ku1ppAhR1","No0QbKASQ8","Ta8f6lpF6W","7hyVvmX2GE","Mkgy8ksJby","yofH3zmLYD","55rfBMmKGJ",
+"pFrrlJJs5m","CqqaD14FLR","UmaEvRsQUq","07n1cjzUqR","K4GS8OxWIH","0Wr5yTXQ0Z","5Mg9rydG8U","IjTwPuPX7G","zz4ZUFVMxo","SWfouhSSvQ",
+"VLTy6uQIcz","U3yw54W0Tl","8FmFHvOqCE","AIYUu5Drn0","gjUTuMmsIo","Dz1R3dpe1v","lCMxyFFDui","mz8gxn8pJ9","QChxstlILt","8U2nUTa8f6",
+"zHF1qjSjS3","ThjNngjUTu","jiVBPDLhzM","QYxC064s8N","9GXkXeuZA5","RxrsmMmsIo","iB08l7X3uy","Kr8ysDz1R3","SWfouKr8ys","1LB1LIRh48",
+"pv0i7WDVWJ","OUYuFRmDcr","pT8wusoy9t","uZPqgiB08l","AXpwEFxX9q","AOgEe9y4lw","dpe1vUvlv4","WPmlxLewvM","48cHLX6Pin","2Yz7EdQ586",
+"gf8rIReKEW","0MR5XThjNn","zHF1qru4UG","rKDLJBGaQY","Mkgy816lHc","0Kyfs6AFT0","3otm6mX2GE","64s8NuoStw","gIYvEkB5nP","xciqpFxX9q",
+"EoToPW3VFH","suY4xpmeCd","ZuDtDaez9y","FjHXRFcWrW","9y4lwo8Uyd","n1pmOwDajX","n8pJ9AmdQd","qQxHP5nmWv","KZamHk85Ae","EdBKci3pyd",
+"yToGWRBhp0","YOfrYt98iW","jS1ajuN6r3","vOqCEzY1GY","lViBvHlUbF","aDGtSBpYhV","CqqaDfFDrJ","UmaEviqv4k","CqqaDJKWYR","pFrrluupzk",
+"GSQwjv2eC3","RzaZAL7cGc","O3iyQmz8gx","JJs5mgtCA5","MmsIoblLA9","VerEA8TxD7","FVMxoJJs5m","CIShGHzZT8","5Drn0FnPFB","MK07YJJs5m",
+"atef2sqVrf","ECMvUcShY2","sqVrfG1RhS","7X3uyWaWsv","VNCPd7Ow5C","Nxx9V4dEz6","Y1mC0FFDui","TwanobZLvS","LbRTHgdQsS","guMb8GSQwj",
+"WMiS3K20wK","mz8gxRACuj","J2mQiQClRL","sx5GlLbRTH","8cVD3VNCPd","zz4ZUpvgjS","h1zcHZUnqt","2hEEUDLhzM","uN6r3lj07Q","Q6Lixv1Hln",
+"i7WMQfaHir","BFkb8F6PT2","Zv7z0EoToP","cL0aEpFrrl","8TxD70YAGH","BCxeC5drc6","uJScXJRJQB","MGlTFYjB9t","uvf7AQssNC","IBe8kciuWz",
+"ksJbyAXpwE","s4786ZuDtD","y94nwzmLYD","8hJdtuAWyp","SjskQ55rfB","yEfy9gjUTu","y94nwGWqqX","CdyBVFLsph","xXTI4HzZT8","0ao3lRkQke",
+"AgJHQ0PktI","VNCPdGWqqX","pv0i75Drn0","0ao3l29QAz","JIqXigjUTu","iKqhrOUYuF","YjB9t5Mg9r","7ku1pChuy3","5drc6jeskS","jtn0XXyPZN",
+"ogLgcBFkb8","xReecX6Pin","guMb88U2nU","zQt6QCp3mZ","yofH3DcpWB","bZLvSydG8U","8xEKzlm0pD","Oz8yZeuZA5","ThjNnpFrrl","MaJQsvLsmS",
+"b29RJLDk6f","oGu6xJIqXi","ksJbytvdkD","No0Qbni2v1","hSSvQPOUYS","Waim6AmdQd","JXljWlXFOB","ydG8UCdyBV","RBhp0J2mQi","zY1GY5drc6",
+"YOfrYjfREu","zHF1qdhSuH","Waim6SbRYy","1j5L80Kyfs","0Wr5yn8pJ9","FVMxonlaBy","lkMUAuQIcz","HP433LbRTH","VLTy67fsYM","VIlwPvOqCE",
+"618DiAOgEe","fcJOy45cIH","Y1mC0Cfgr3","C2IrcAXpwE","2TRI7JXljW","0KyfsNhXdu","ydG8UzbIYY","JRJQBU3yw5","BCxeCNxx9V","StlDJUmaEv",
+"QClRLlm0pD","lsQGo0MR5X","s93MlpAhR1","LewvMBbwgA","t98iWi3pyd","5Drn0QnJ1S","Chuy314FLR","ZhwG1WDVWJ","uvf7AVprf2","cShY20Kyfs",
+"pmeCdUmaEv","AkKTk0Kyfs","oGu6xZzJHW","xXTI40PktI","F6PT2Z4I1v","zFgtBBCxeC","uAWypzY1GY","RpBQm1LB1L","jS1ajFVMxo","tjQxsSWfou",
+"B3qemt59lR","Oz8yZUmaEv","8U2nUlXFOB","CIShGqaofN","hYBCKxReec","9iGoTxciqp","IBe8kVIlwP","Ul4a17Ow5C","5IhmG2Yz7E","F6PT2OHaBz",
+"ReKEWe6e4z","fcwDad7vjM","M3zXLOHaBz","1v5hHatef2","VerEAru4UG","uLtKsdQ586","iqv4km4bxU","dhSuHbZLvS","ciuWzXflUq","FGzgp8U2nU",
+"YjB9tCIShG","Dz1R39XyT9","zmLYDv1Hln","Yw2oUgIYvE","uAWypiB08l","blLA99GXkX","7fsYMmz8gx","5NammNhXdu","KASQ8cShY2","AkKTkNxx9V",
+"BpYhV5ZaEz","s4786iqv4k","Mkgy8PYBf4","B3qemfqypy","Q6hMCFwEJz","zz4ZUHP433","NhXduFxX9q","rz7Ut7hyVv","WmadAQbxXc","uAWypatef2",
+"55rfBpWiOs","ZUnqtCxVEf","fcJOyZJTXH","jfREu2DREs","JIqXibrhlQ","o8Uyd5VZjS","pT8wuhYBCK","618DiGWqqX","8xEKz9GXkX","L7cGcChuy3",
+"zz4ZUlViBv","Chuy3P6bcg","FPfSEZUnqt","k85Ae55rfB","HlUbFlsQGo","MGlTFPb1pa","FjHXRsuY4x","TCgPpFNYIM","OHaBzOUYuF","lH1kts7Mxk",
+"EoToP2Nslm","45cIHgtCA5","cShY245cIH","6q6L9WreyP","EOE1oo8Uyd","cmXIXn1pmO","ECMvUjfREu","d85a9qQxHP","S2DfupT8wu","WmadALewvM",
+"9eoRc0YAGH","29QAz5drc6","kB5nPpmeCd","dmoS7F6PT2","Mkgy8FGzgp","Q6LixyToGW","7fKYUv1Hln","6q6L9SbRYy","fmIK1ksJby","rz7UtNOHsz",
+"9y4lwHzZT8","HlUbFdhSuH","wiHrZblLA9","5NammEdBKc","mX2GENhXdu","n8pJ9uAWyp","LDk6f5Namm","ni2v1prNT6","M3zXLtl72W","ni2v1QWxoT",
+"5IhmGXyPZN","dmoS7VerEA","hi5X7HP433","0BmCyThjNn","QYxC0QbxXc","AOgEe5IhmG","MK07YCdyBV","FcWrWtuDyS","s7MxkHzZT8","O3iyQ4QMc9",
+"55rfBe6e4z","X6Pin6q6L9","DG4sTkZANm","bgJAztlILt","i3pydBpYhV","G1RhSrhl0J","a00b5AkKTk","MezSWHP433","RACuj45cIH","i7WMQWmadA",
+"BGaQYiKqhr","soy9tMGlTF","FwEJzOUYuF","FwEJzuQIcz","MGlTFReKEW","5Drn0ZzJHW","tl72WZ4I1v","gIYvE0h1b1","Y1mC09rlg9","ZuDtDIKxdL",
+"618Diix74r","RmDcrtlILt","9rlg9LewvM","JIqXi7hyVv","JIqXifcwDa","Z4I1va00b5","AXpwE7fsYM","jS1ajmz8gx","6AFT03otm6","e6e4zRxrsm",
+"soy9tt98iW","RsQUqNOHsz","t59lRiB08l","0h1b19XyT9","iwzGkHRxd8","s4786G1RhS","IKxdLIjTwP","t59lRjfREu","iKqhr1v5hH","qQxHPAgJHQ",
+"POUYSwiHrZ","7fsYMJRJQB","SmGzvQbxXc","4dEz6MmKGJ","fmIK11j5L8","MaJQspmeCd","k85AeuQIcz","kZANmNOHsz","J2mQim4bxU","48cHLiKqhr",
+"WmadARkQke","k85Aen8pJ9","i3pydQbxXc","0MR5XIKxdL","zY1GYVprf2","faHirHzZT8","JXljWlweGy","KASQ8SmGzv","1j5L8AkKTk","G1RhSDcpWB",
+"0Wr5yiKqhr","Gv3Fq0YAGH","ZhwG13weIF","8xEKza00b5","48cHLZUnqt","0KyfsZJTXH","zFgtBZhwG1","5nmWvrhl0J","16lHcXflUq","iKqhrFLsph",
+"zz4ZUTCgPp","8TxD7iwzGk","DQimpRACuj","Nxx9Vjtn0X","Y1mC0Ta8f6","YOfrYUmaEv","0BmCyulk41","yvOMIS2Dfu","tAOsrVIlwP","gIYvEHP433",
+"VerEAnFqik","gf8rIKZamH","brhlQQClRL","s4786tuDyS","2Nslm2DREs","8U2nUhE1Ql","8xEKzsx5Gl","AXpwEUl4a1","5ZaEzYw2oU","dhSuH2Nslm",
+"QWxoTAXpwE","0MR5XMezSW","pT8wuJKWYR","2hEEU55rfB","MK07YVprf2","NcICAjS1aj","ReKEWDz1R3","RzaZAyluBx","FNYIMfLNg8","v1Hln9rlg9",
+"HfyNQbrhlQ","uPX7Gd7vjM","7fsYMgdQsS","n1pmOdjsrv","29QAzi3pyd","JkzUnCp3mZ","suY4xQChxs","lH1ktLbRTH","faHirJkzUn","lViBvTCgPp",
+"pvgjStuDyS","4QMc9iwzGk","J2mQikZANm","2TRI7FPfSE","4W0TllsQGo","dmoS7fcJOy","tAOsrGXdoH","lCMxyd7vjM","AXpwESs0Zu","J2mQilCMxy",
+"Yh1hFtvdkD","dpe1vQ6Lix","GXdoHjSjS3","okgRiqUJMd","wDajX5VZjS","yToGWqUJMd","HzZT8WmadA","GXdoHh1zcH","UmaEvAkKTk","RzaZANo0Qb",
+"x3LDepWiOs","5IhmGQworu","fFDrJpFrrl","d7vjM29QAz","8TxD7L7cGc","blLA97X3uy","QssNCl83Ud","AIYUuStlDJ","zQt6QdhSuH","NhXduCK5W7",
+"NOHszb29RJ","4dEz6Oz8yZ","oGu6xVLTy6","okgRiAmdQd","FjHXRWreyP","uupzk8hJdt","Q6LixFPfSE","pWiOsksJby","CdyBV2Nslm","HRxd8hSSvQ",
+"yluBxru4UG","fFDrJjtn0X","Ta8f6BCxeC","Dz1R3YjB9t","J2mQiVNCPd","lweGyJKWYR","gf8rIZhwG1","LDk6fuJScX","b29RJvLsmS","wiHrZPYBf4",
+"8U2nU2hEEU","b29RJVIlwP","K4GS8Vprf2","QYxC0uJScX","VNCPdhi5X7","aL6AJAmdQd","2Yz7Ea00b5","618Dis4786","07n1cMaJQs","ZUnqt7lUXZ",
+"FFDuiVerEA","nnP8oCdyBV","Nxx9VZ4I1v","0Wr5yi3pyd","29QAzHRxd8","1LB1LjSjS3","5VZjSZuDtD","jS1ajxReec","5VZjSm4bxU","FnPFBFwEJz",
+"v1HlnvLsmS","IKxdLcShY2","GWqqXdmoS7","y94nwfaHir","cQOnvfcwDa","Cfgr3ni2v1","O3iyQfLNg8","pmeCdSjskQ","RsQUquPX7G","Cp3mZFNYIM",
+"Q6hMCYjB9t","Mm8siQssNC","M6qcGVIlwP","v1HlnciuWz","Nxx9Vix74r","lCMxyzz4ZU","5nmWvfFDrJ","0ao3lS2Dfu","pWiOsOUYuF","QworuaDGtS",
+"0PktIh1zcH","wiHrZDQimp","JRJQB0YAGH","GrDg7gdQsS","BCxeCX6Pin","BbwgAxXTI4","Mm8siuZPqg","FcWrWWmadA","0h1b1hE1Ql","IKxdLCdyBV",
+"Yf2EcReKEW","0BmCygIYvE","RkQkeDLhzM","55rfBprNT6","lweGypWiOs","Twano5nmWv","1LB1L9eoRc","7fsYMIKxdL","RpBQmxXTI4","HfyNQIjTwP",
+"618Di3weIF","jfREuFhtgl","F6PT2zz4ZU","xciqpSjskQ","fcwDaCqqaD","fLNg8F6PT2","Zv7z0QbxXc","Kr8ysBGaQY","8cVD3vLsmS","YOfrYnFqik",
+"8hJdtjfREu","ECMvUVNCPd","FPfSE14FLR","0BmCyuLtKs","GSQwj0ao3l","cQOnvs7Mxk","uN6r3MmsIo","Pb1paFNYIM","b29RJKZamH","n1pmOk85Ae",
+"Pb1paM3zXL","CqqaDzY1GY","lXFOBTCgPp","9y4lwazIWp","LewvMjiVBP","s7Mxk55rfB","8TxD7FVMxo","brhlQAkKTk","S2Dfurz7Ut","o8UydWmadA",
+"8RCUAy94nw","Mm8siWMiS3","hi5X7I7p2a","n8pJ9mz8gx","mX2GEn1pmO","wiHrZprNT6","B3qemReKEW","s4786Fhtgl","pWiOs07n1c","JXljW9eoRc",
+"In3NSFjHXR","jzUqRhSSvQ","2Yz7ENAFuw","iKqhrYjB9t","FVMxoMK07Y","AXpwE5iGN5","NcICACp3mZ","n1pmO4dEz6","Fhtglni2v1","OHaBzqQxHP",
+"pmeCdprNT6","NhXdu4QMc9","iB08lt59lR","nlaByBFkb8","kZANmOxWIH","9XyT9QWxoT","MmKGJJIqXi","sx5Gli7WMQ","NcICA7lUXZ","YOfrYcQOnv",
+"tlILtdpe1v","Mm8silj07Q","UmaEvEoToP","DcpWB0ao3l","16lHc9GXkX","fFDrJAOgEe","azIWpTa8f6","atef2MezSW","Waim6FLsph","FGzgptAOsr",
+"64s8NtlILt","Oz8yZIjTwP","iB08luupzk","YjB9tzHF1q","wDajX7ku1p","B3qem2ZHdk","rhl0J29QAz","55rfBtlILt","guMb8O3iyQ","tjQxsRsQUq",
+"9y4lwQbxXc","S77LHQ6Lix","FnPFBTa8f6","L7cGc0YAGH","WmadAd7vjM","RBhp0iqv4k","MK07YCp3mZ","sqVrfJIqXi","oQ87rjfREu","2TRI7piJSk",
+"0Wr5yyvOMI","pWiOsFNYIM","FPfSEv2eC3","jtn0XNAFuw","MojnPkB5nP","Q6LixTCgPp","bgJAzRpBQm","SWfouwiHrZ","CNHmv7X3uy","LDk6fReKEW",
+"dmoS75ZaEz","prNT6JJs5m","fLNg8Fhtgl","bZLvSo8Uyd","OUqFMfmIK1","s93MlQWxoT","5ZaEztvdkD","DQimpfFDrJ","QWxoTJRJQB","XflUqgf8rI",
+"8FmFHguMb8","lH1kt48cHL","5Mg9rhSSvQ","5Mg9rd85a9","VNCPdFjHXR","8xEKzhSSvQ","ZJTXHpiJSk","WDVWJgIYvE","uQIczuvf7A","Q6hMCDz1R3",
+"No0Qb9eoRc","ru4UGECMvU","uvf7AAXpwE","SWfouvLsmS","BbwgAGWqqX","uTacxCfgr3","AXpwEjS1aj","atef25IhmG","lkMUAnFqik","x3LDeiwzGk",
+"cQOnvMkgy8","s93Mlt98iW","29QAzGv3Fq","ThjNnMK07Y","JkzUnOxWIH","fLNg8Kr8ys","guMb8zFgtB","5iGN57fsYM","s4786JJs5m","OHaBzn8pJ9",
+"9iGoThYBCK","ZhwG1d7vjM","uN6r35ZaEz","Ss0ZuZ4I1v","v1HlnThjNn","tjQxspmeCd","l83Ud0PktI","AgJHQOHaBz","MaJQsZJTXH","iwzGkRmDcr",
+"pAhR11LB1L","HP433Mm8si","tlILt1v5hH","QssNCBGaQY","e6e4z7Ow5C","DG4sT4QMc9","29QAzCxVEf","BFkb8SmGzv","TCgPpyofH3","IBe8kRsQUq",
+"ru4UGjzUqR","s4786JkzUn","MezSWHRxd8","OxWIHWreyP","e6e4zLDk6f","tuDySIBe8k","JIqXiJRJQB","euZA5FnPFB","Ss0Zut98iW","FLsphYw2oU",
+"yvOMIl83Ud","ru4UGm4bxU","HlUbFru4UG","ydG8UtvdkD","0BmCyFhtgl","2TRI75VZjS","uAWypPb1pa","tjQxsguMb8","uQIczAXpwE","TCgPp0BmCy",
+"i3pyd07n1c","F6PT25Namm","5drc6XflUq","xXTI4s4786","o8UydCfgr3","2Nslmx3LDe","MmsIoGrDg7","soy9tRxrsm","tvdkDNhXdu","d85a90BmCy",
+"zz4ZUdhSuH","QChxsSbRYy","bgJAzt98iW","hUTw70Kyfs","TCgPpvOqCE","ThjNn2Yz7E","uZPqgpv0i7","AmdQd0h1b1","YjB9tCK5W7","SjskQhi5X7",
+"AgJHQxciqp","S2DfublLA9","fqypy29QAz","zz4ZU9eoRc","x3LDeOHaBz","Vprf2QnJ1S","JkzUn5Drn0","JRJQBhSSvQ","pFrrluoStw","StlDJpAhR1",
+"oQ87r0MR5X","BGaQY45cIH","WreyPuZPqg","uN6r3FVMxo","NcICA5Namm","9XyT9x3LDe","aL6AJh1zcH","5VZjS2hEEU","soy9tVBjhz","0BmCyStlDJ",
+"y94nw64s8N","Dz1R3taOXK","IBe8k8cVD3","aez9yfLNg8","tlILt5Mg9r","oGu6xMkgy8","6AFT0B3qem","64s8NJJs5m","kZANm0h1b1","GXdoHaFFss",
+"s7MxkHlUbF","BGaQYFwEJz","tvdkDy94nw","JJs5mlCMxy","he9IAZ4I1v","hYBCKLbRTH","1v5hHgdQsS","fqypyFjHXR","2TRI7Z4I1v","NcICAl83Ud",
+"cmXIXydG8U","v8yFNMGlTF","FxX9qv8yFN","RzaZAzqH0W","hUTw7GrDg7","M3zXLiB08l","SbRYyzFgtB","uAWyp8U2nU","3otm616lHc","FFDuiOxWIH",
+"soy9tSWfou","5NammtjQxs","RzaZA9eoRc","FPfSEStlDJ","YjB9tfqypy","ReKEWOHaBz","64s8NGXdoH","atef2zbIYY","DcpWBRxrsm","vOqCEv2eC3",
+"DcpWBd7vjM","618DilCMxy","QworuQChxs","9GXkXIn3NS","FVMxoCfgr3","HP4331LB1L","v1HlnM3zXL","UmaEvpAhR1","VNCPd55rfB","No0Qbd7vjM",
+"6q6L9Q6Lix","tvdkDaez9y","sqVrf4dEz6","t98iWQChxs","zY1GYOxWIH","euZA5atef2","P6bcg5drc6","0KyfsDcpWB","tjQxsuQIcz","tjQxsrz7Ut",
+"dmoS7YjB9t","Q6Lixfqypy","b29RJMaJQs","MK07YbrhlQ","QChxs5Namm","5iGN5No0Qb","7lUXZ07n1c","FFDuiAkKTk","VLTy6VNCPd","RBhp07hyVv",
+"4W0TlW7cTs","pvgjS1v5hH","ZJTXHKr8ys","IKxdL5Namm","AOgEes4786","WaWsvCdyBV","Q6Lix8U2nU","fFDrJ9GXkX","prNT6Gv3Fq","5nmWvdjsrv",
+"IRh48Gv3Fq","SbRYyLDk6f","5drc6CdyBV","WMiS3IKxdL","uTacxO3iyQ","QnJ1SJXljW","brhlQUvlv4","4dEz6X6Pin","WreyPuN6r3","uJScXNAFuw",
+"6AFT0SjskQ","lH1ktfLNg8","BFkb8S2Dfu","0PktI7fsYM","9y4lwRkQke","9y4lwFPfSE","JIqXi8U2nU","FNYIMQYxC0","VjCZqjtn0X","2DREs8xEKz",
+"HlUbF0PktI","gjUTu5Drn0","GWqqXv1Hln","vOqCEjS1aj","pv0i7djsrv","h1zcHZv7z0","24ARFoGu6x","ZJTXHMmsIo","5Drn0No0Qb","0YAGHRmDcr",
+"wDajXZuDtD","7lUXZ5drc6","RzaZAuZPqg","SWfouSjskQ","RBhp0aez9y","0KyfsCNHmv","CK5W7DQimp","zbIYY0YAGH","gjUTuBFkb8","dQ586taOXK",
+"StlDJ9iGoT","Yf2EcFFDui","guMb8guMb8","rz7UtfcJOy","EoToPFnPFB","Vprf2ReKEW","K20wKDLhzM","gf8rIDG4sT","9eoRcmX2GE","8xEKzkZANm",
+"qQxHPVIlwP","d85a9YjB9t","aez9y5VZjS","wiHrZLbRTH","fLNg8kB5nP","Zv7z0uQIcz","FNYIM64s8N","AOgEebrhlQ","l83UdO3iyQ","qUJMdMmKGJ",
+"MGlTFCfgr3","Dz1R3gdQsS","GXdoHCp3mZ","0Wr5yFFDui","4W0Tl8RCUA","y94nw8TxD7","EOE1ox3LDe","lj07QbZLvS","G1RhSzbIYY","rz7UtYf2Ec",
+"yluBxQssNC","AOgEexReec","FcWrWtaOXK","WmadAZv7z0","Mm8siNxx9V","zmLYDy94nw","JkzUnCxVEf","gIYvE8hJdt","CqqaDZJTXH","FjHXRgtCA5",
+"Cfgr35nmWv","n1pmOn1pmO","RkQkeJkzUn","GSQwji3pyd","MmKGJn1pmO","he9IAulk41","Y1mC0ThjNn","nnP8ojS1aj","8hJdtM3zXL","FxX9qvOqCE",
+"cShY2azIWp","ru4UGJXljW","2NslmzbIYY","8xEKznFqik","v2eC3FVMxo","pv0i7HRxd8","uTacxfLNg8","L7cGc5Drn0","JJs5mt98iW","AmdQdOz8yZ",
+"OxWIHydG8U","4QMc9euZA5","uvf7AnlaBy","VIlwPblLA9","tAOsrfmIK1","gtCA5djsrv","MGlTFKsjRK","wiHrZUlU3M","yvOMIKASQ8","ru4UG618Di",
+"cShY2zmLYD","SjskQi3pyd","BCxeC6q6L9","gdQsSC2Irc","FnPFBjtn0X","O3iyQVNCPd","OxWIHeuZA5","Mkgy85Drn0","1j5L8KASQ8","RBhp0cmXIX",
+"4dEz6jzUqR","5IhmGNo0Qb","0ao3ldhSuH","M6qcG2Yz7E","rKDLJIKxdL","FPfSE5Drn0","M3zXLzqH0W","jzUqRjS1aj","Zv7z0zqH0W","Rxrsm6q6L9",
+"F6PT2hYBCK","EOE1oWDVWJ","fcJOyJIqXi","2DREsy94nw","BFkb8hUTw7","Cfgr3AkKTk","hE1QllpF6W","iKqhrQbxXc","8xEKzJIqXi","TCgPp1j5L8",
+"RpBQmrKDLJ","brhlQIKxdL","LewvMFPfSE","0KyfsqUJMd","wiHrZDz1R3","CxVEfRACuj","KZamHt98iW","AgJHQeuZA5","CdyBVAXpwE","X6PinFjHXR",
+"VLTy67ku1p","v2eC3DLhzM","QbxXcVjCZq","pvgjSydG8U","FPfSEpv0i7","HfyNQfaHir","HRxd8blLA9","hSSvQJ2mQi","RkQkeOUqFM","JRJQBhe9IA",
+"UmaEv9rlg9","2DREsl83Ud","qQxHPD6rBy","MaJQsOz8yZ","QYxC0h1zcH","ZJTXHThjNn","ZUnqtPb1pa","ix74rKZamH","suY4x2TRI7","jtn0XWmadA",
+"SWfouyvOMI","Uvlv43weIF","FcWrW8FmFH","bgJAzStlDJ","HP433dmoS7","5ZaEzqaofN","2TRI7cmXIX","DG4sTh1zcH","Cfgr3iwzGk","iKqhrIKxdL",
+"lsQGofqypy","7fsYMn8pJ9","d85a9jfREu","n1pmOPYBf4","KZamH7lUXZ","7fKYUe6e4z","QYxC05Mg9r","7Ow5CYjB9t","uZPqgL7cGc","nnP8oLDk6f",
+"0MR5XDz1R3","DG4sTlH1kt","0ao3l8xEKz","wiHrZRsQUq","QYxC0wDajX","ThjNn2TRI7","64s8NVIlwP","fLNg8jfREu","HfyNQ6q6L9","9GXkXjeskS",
+"zFgtBZJTXH","hUTw7ogLgc","lViBvGv3Fq","a00b5y94nw","X6PinqQxHP","b29RJi3pyd","zFgtBzz4ZU","lsQGoRkQke","5IhmGQWxoT","MaJQsFLsph",
+"o8Uyd6AFT0","jtn0XBCxeC","ZhwG1B3qem","BFkb8CdyBV","FFDuiRpBQm","VBjhzaL6AJ","SmGzvWmadA","uvf7AWMiS3","Cfgr3ReKEW","0PktI0ao3l",
+"8hJdtatef2","d7vjMHlUbF","FwEJzCp3mZ","nlaByL7cGc","AOgEeBCxeC","QClRLG1RhS","s47862Yz7E","d85a9Dz1R3","B3qemyEfy9","64s8Nzz4ZU",
+"M6qcGMojnP","a00b5CIShG","24ARFUvlv4","Nxx9VRsQUq","qaofNiwzGk","gIYvEQssNC","5drc6aez9y","Dz1R3GXdoH","jS1ajFwEJz","BCxeCFPfSE",
+"okgRiCK5W7","In3NSQClRL","2NslmDz1R3","e6e4z24ARF","nnP8opv0i7","dhSuHD6rBy","Z4I1v5drc6","fcJOyuJScX","1j5L8qQxHP","aez9yS77LH",
+"wiHrZuZPqg","OUqFM4QMc9","ZJTXHFNYIM","cL0aEYh1hF","lkMUA8RCUA","VerEAb29RJ","2NslmmX2GE","HP433Yw2oU","14FLRulk41","IKxdLpiJSk",
+"14FLRC2Irc","fFDrJxciqp","DG4sTvLsmS","b29RJDcpWB","ZuDtDprNT6","SbRYyQworu","pv0i7NcICA","lH1ktxReec","VLTy6yofH3","AgJHQRBhp0",
+"s4786C2Irc","0YAGHuoStw","07n1czmLYD","aL6AJ5Drn0","lCMxyYjB9t","UmaEvpmeCd","QChxsWmadA","0Wr5yFNYIM","LDk6fQworu","CIShGQnJ1S",
+"jS1ajJKWYR","7fsYMRkQke","MmKGJVNCPd","VerEA9eoRc","8xEKzBGaQY","Uvlv4yEfy9","EdBKcpFrrl","K4GS8AgJHQ","d7vjMHzZT8","TCgPpiwzGk",
+"Pb1paQWxoT","U3yw5vOqCE","mX2GEKsjRK","8FmFHcQOnv","aFFssK20wK","6q6L9i3pyd","uLtKsLewvM","07n1cOz8yZ","tAOsrjzUqR","QChxspFrrl",
+"aez9ya00b5","xReecRxrsm","Yw2oUpiJSk","StlDJpv0i7","TwanoBpYhV","KsjRKs7Mxk","pWiOsNhXdu","24ARFMmsIo","s7MxkPOUYS","atef2GXdoH",
+"cQOnvVprf2","tl72WDQimp","lpF6WBGaQY","9XyT9KZamH","ZhwG1MmsIo","LbRTHJKWYR","Cp3mZl83Ud","45cIHCfgr3","t98iWYh1hF","Cp3mZX6Pin",
+"WaWsvk85Ae","xReecqaofN","MK07YHlUbF","KsjRKQYxC0","HRxd8nFqik","ZuDtDnnP8o","uAWypDG4sT","dhSuHpiJSk","K20wKCxVEf","v8yFNqUJMd",
+"wiHrZe6e4z","cQOnvVNCPd","FxX9qpmeCd","FNYIMY1mC0","J2mQiGXdoH","MaJQsUmaEv","QWxoTNAFuw","QYxC0hYBCK","SjskQHRxd8","7fKYUM6qcG",
+"2hEEUoGu6x","QssNCOHaBz","bZLvSFjHXR","1v5hHtjQxs","aDGtSb29RJ","D6rByk85Ae","gIYvEMezSW","X6PinAXpwE","24ARFRkQke","SbRYyNOHsz",
+"CIShGzHF1q","VBjhzWDVWJ","xReec14FLR","CIShGJIqXi","JIqXiTa8f6","ZuDtDjzUqR","cShY2DQimp","l83UdQYxC0","HP433KASQ8","Mm8siB3qem",
+"5Mg9razIWp","ZuDtDJXljW","7Ow5CjfREu","TXQ0ZZhwG1","QssNCW7cTs","TwanooGu6x","djsrvTCgPp","DcpWB7fsYM","Gv3FqSmGzv","0h1b1okgRi",
+"cL0aEX6Pin","gdQsSFLsph","RACujyluBx","4QMc9ZzJHW","VNCPdyvOMI","0BmCyECMvU","Gv3FqO3iyQ","nlaByNcICA","QChxsn8pJ9","Yh1hFzz4ZU",
+"P6bcgC2Irc","x3LDe29QAz","Cfgr35drc6","Q6LixblLA9","xXTI47ku1p","d85a9P6bcg","CqqaDdmoS7","Chuy30PktI","t98iWVerEA","8cVD364s8N",
+"pFrrlRACuj","1LB1LAOgEe","hi5X7S77LH","uoStwFVMxo","fLNg81v5hH","JRJQBX6Pin","RACujB3qem","MaJQsYOfrY","RmDcrKsjRK","JXljWwDajX",
+"hYBCK580YD","gjUTulXFOB","MK07Y45cIH","7fKYUn8pJ9","zqH0Wjtn0X","pv0i7Zv7z0","cShY20PktI","Yf2EcP6bcg","HlUbF1LB1L","b29RJ9y4lw",
+"pAhR1Yf2Ec","gjUTujeskS","EoToPk85Ae","qaofNTCgPp","Ta8f6Dz1R3","6q6L95VZjS","oVQp6yluBx","GXdoHhSSvQ","2hEEUCp3mZ","YjB9tBbwgA",
+"0KyfsAkKTk","7lUXZdhSuH","7hyVvJRJQB","zQt6Qt59lR","8cVD3aez9y","bgJAzCNHmv","v2eC38hJdt","CIShGAXpwE","IBe8kokgRi","h1zcHeuZA5",
+"tvdkDEoToP","GrDg7Z4I1v","7hyVvm4bxU","zQt6Qs7Mxk","yvOMIdmoS7","AXpwEoGu6x","OxWIHStlDJ","BpYhVhUTw7","blLA9mz8gx","8U2nUbgJAz",
+"9y4lwFVMxo","hE1QlKr8ys","L7cGcAgJHQ","MmKGJs7Mxk","nlaByatef2","6AFT0cL0aE","cQOnvuAWyp","FwEJzrKDLJ","RmDcrazIWp","D6rBy45cIH",
+"jS1ajHzZT8","4dEz6IjTwP","24ARFYw2oU","VLTy6hYBCK","OUYuF9eoRc","uJScXqQxHP","hYBCKRpBQm","WaWsvWaWsv","ix74rSjskQ","MGlTFatef2",
+"yToGWZhwG1","CNHmvCIShG","l83UdCK5W7","0KyfsWaim6","oQ87rlsQGo","FwEJzzz4ZU","FnPFBS2Dfu","gdQsSjiVBP","IjTwPdpe1v","d7vjMh1zcH",
+"2DREspAhR1","uN6r3GrDg7","dQ586a00b5","VBjhz3otm6","CIShGOxWIH","euZA5WaWsv","1j5L814FLR","7X3uyJKWYR","LbRTHuoStw","0MR5Xmz8gx",
+"QnJ1SCfgr3","qQxHPguMb8","OxWIHlpF6W","gIYvEWPmlx","nnP8o7X3uy","RACujIBe8k","4QMc9POUYS","v1HlnpvgjS","Mm8siXyPZN","okgRiv8yFN",
+"LewvMKr8ys","POUYSmz8gx","lXFOBQWxoT","DLhzM7ku1p","ReKEW55rfB","5ZaEzgtCA5","XflUq24ARF","aFFsss93Ml","FVMxoIn3NS","qaofNfmIK1",
+"NhXduAmdQd","sx5Gllm0pD","VjCZqKZamH","dhSuHFcWrW","ZUnqtb29RJ","14FLRBbwgA","07n1cfcJOy","pv0i7h1zcH","piJSkOUYuF","BpYhVVjCZq",
+"tvdkDlViBv","Pb1pacL0aE","s7MxkZ4I1v","7hyVvzY1GY","RsQUqStlDJ","jiVBPokgRi","AIYUuhe9IA","ZUnqtpvgjS","BFkb8ZJTXH","LewvMzHF1q",
+"QssNCLewvM","QChxs55rfB","bZLvSfqypy","i3pydsoy9t","pWiOsSbRYy","48cHL07n1c","dQ586oVQp6","VBjhzF6PT2","GSQwjguMb8","lpF6WPb1pa",
+"dmoS7k85Ae","h1zcHd85a9","FnPFBKr8ys","Yw2oUKZamH","n8pJ9soy9t","Q6hMCv1Hln","zbIYYgtCA5","d7vjMGXdoH","ECMvUO3iyQ","zbIYYKASQ8",
+"9iGoTy94nw","48cHLMojnP","fLNg8zqH0W","zHF1qMGlTF","d85a9nnP8o","M6qcGQnJ1S","xciqpNcICA","Kr8ysKr8ys","8hJdtMojnP","OUYuF7hyVv",
+"sqVrfjfREu","cQOnvcQOnv","rKDLJEoToP","14FLRvLsmS","uZPqgxReec","ogLgcrz7Ut","16lHclpF6W","2TRI7wiHrZ","uQIczb29RJ","8TxD7FNYIM",
+"Ss0ZulpF6W","tuDySfqypy","nlaByh1zcH","1LB1L8cVD3","QChxsMK07Y","tAOsrYh1hF","VNCPdMGlTF","In3NSIBe8k","D6rByNOHsz","DLhzMdQ586",
+"55rfBZUnqt","8hJdtAkKTk","yvOMIAmdQd","azIWpIBe8k","Yf2EcJXljW","dhSuHCNHmv","lweGylH1kt","azIWp2ZHdk","wDajXokgRi","POUYSulk41",
+"UlU3MBCxeC","ulk41JKWYR","tAOsro8Uyd","CIShGUlU3M","aFFss24ARF","24ARFguMb8","MezSWTXQ0Z","xReech1zcH","1LB1LFwEJz","b29RJWPmlx",
+"7X3uyPYBf4","GWqqXkZANm","NAFuw8RCUA","GWqqXAgJHQ","iB08lK4GS8","UmaEvTa8f6","GWqqXAXpwE","ulk418FmFH","7ku1prz7Ut","jfREuazIWp",
+"S77LHCdyBV","gjUTuwiHrZ","O3iyQVIlwP","tjQxsvOqCE","lCMxyAgJHQ","3otm69XyT9","ZhwG1t59lR","lsQGoVerEA","fcwDaGXdoH","NOHsz29QAz",
+"taOXKJ2mQi","lm0pDdpe1v","djsrv9eoRc","t59lRQYxC0","gtCA5Oz8yZ","jzUqRtaOXK","zQt6QlViBv","S77LH64s8N","MaJQsLDk6f","ECMvUMmsIo",
+"BCxeC9XyT9","64s8NKr8ys","S2DfuazIWp","NhXduDcpWB","t98iW6q6L9","lkMUASbRYy","QChxsVerEA","UlU3M9XyT9","8TxD7i3pyd","L7cGcHRxd8",
+"prNT6uvf7A","d85a9nlaBy","FhtglGv3Fq","D6rByFxX9q","vLsmSFwEJz","uTacxBGaQY","K20wKt59lR","24ARFWMiS3","gIYvE5IhmG","CIShGFNYIM",
+"lsQGoChuy3","e6e4zAIYUu","2Nslms93Ml","azIWpIRh48","2TRI7dmoS7","F6PT2FwEJz","djsrvUmaEv","3weIFIRh48","FxX9qqaofN","EOE1oFNYIM",
+"6q6L9AXpwE","HzZT8JKWYR","0ao3lokgRi","QYxC0nnP8o","rhl0JYh1hF","zmLYDC2Irc","piJSk14FLR","DcpWBW7cTs","ZuDtDIBe8k","VNCPduAWyp",
+"gtCA50BmCy","y94nw3weIF","CxVEfZ4I1v","EdBKc4W0Tl","xciqpXyPZN","dpe1vKASQ8","DQimpGWqqX","WreyP64s8N","RkQkezz4ZU","uvf7AQWxoT",
+"qUJMd0MR5X","CqqaDRxrsm","zHF1qPYBf4","0PktIhE1Ql","XflUqiqv4k","lpF6WReKEW","pmeCd0BmCy","b29RJDQimp","2DREsv1Hln","OUqFMJkzUn",
+"POUYS8TxD7","QYxC0FLsph","fqypy3otm6","faHirpWiOs","StlDJBGaQY","XyPZNfcwDa","nnP8ob29RJ","gdQsS5Namm","vOqCEvkCHH","t98iWnlaBy",
+"uLtKsEoToP","ThjNnZ4I1v","JRJQBFGzgp","7X3uyOHaBz","AkKTkYw2oU","RkQke9eoRc","pFrrlBCxeC","BpYhVni2v1","55rfBRACuj","blLA9brhlQ",
+"WmadA5Namm","d85a9BpYhV","GXdoHhE1Ql","VLTy6Waim6","C2IrcuN6r3","uupzkksJby","UmaEvx3LDe","QbxXcGv3Fq","HRxd8yToGW","M3zXL2TRI7",
+"IBe8k0BmCy","euZA5YOfrY","0h1b1l83Ud","Dz1R3jiVBP","IjTwPlj07Q","v1Hlnv2eC3","zqH0WqaofN","Mm8si8TxD7","tvdkDqUJMd","1LB1Lpv0i7",
+"lXFOBs7Mxk","s4786FwEJz","4W0TlkZANm","7Ow5CFPfSE","wiHrZlm0pD","IjTwPHlUbF","qQxHPjtn0X","hi5X7ThjNn","RpBQmjfREu","hUTw7Z4I1v",
+"hi5X7uQIcz","s47860h1b1","8FmFHWmadA","uQIczCp3mZ","ru4UG5ZaEz","RmDcrix74r","uTacxGv3Fq","lXFOBWaim6","45cIHHRxd8","gtCA5ydG8U",
+"VIlwPoQ87r","TCgPpguMb8","mX2GEDLhzM","B3qemCK5W7","Oz8yZChuy3","a00b5SmGzv","ZuDtD1LB1L","Ul4a1MmsIo","Ta8f6Ss0Zu","Mkgy8JRJQB",
+"ReKEWChuy3","fmIK1C2Irc","uZPqgUmaEv","QChxsAOgEe","D6rByIn3NS","Rxrsm2Yz7E","B3qemblLA9","K20wKGXdoH","7fsYM9iGoT","djsrvyEfy9",
+"9eoRc0h1b1","EdBKcd85a9","SWfouBGaQY","ReKEWzqH0W","mX2GEzz4ZU","h1zcH9GXkX","uPX7GQ6Lix","uQIczs93Ml","WDVWJTXQ0Z","48cHLjS1aj",
+"ulk41uZPqg","HRxd816lHc","i3pydrz7Ut","7lUXZcQOnv","uoStwMK07Y","CK5W76q6L9","t59lRksJby","VBjhzcL0aE","pmeCdOxWIH","zFgtBiwzGk",
+"FnPFBd7vjM","tAOsr6q6L9","2ZHdkOUqFM","8xEKzQWxoT","MGlTF6AFT0","8hJdtMm8si","YOfrYOxWIH","9iGoT0MR5X","dpe1vzQt6Q","tvdkD7fKYU",
+"MaJQsfaHir","tvdkDfqypy","uJScXxciqp","a00b5x3LDe","t98iWuvf7A","k85Aes4786","RmDcrjSjS3","7fsYMUlU3M","0BmCyaez9y","Yh1hFdmoS7",
+"Mkgy8iqv4k","JJs5mEoToP","zQt6QW7cTs","taOXKFNYIM","vLsmSQ6Lix","8RCUAv2eC3","WmadApFrrl","YjB9tFVMxo","azIWpGv3Fq","m4bxUm4bxU",
+"EoToP8RCUA","ReKEW45cIH","OUqFMWMiS3","WreyPTCgPp","8cVD35Namm","ulk41J2mQi","JkzUnhYBCK","uLtKsHzZT8","t98iWVIlwP","gjUTuaFFss",
+"e6e4zoQ87r","7fsYMAmdQd","AIYUupmeCd","nnP8oNAFuw","5NammhUTw7","7fKYU2Yz7E","taOXK2Nslm","14FLRWDVWJ","aDGtSJXljW","9rlg99GXkX",
+"GXdoHMojnP","oGu6xzFgtB","lkMUA3otm6","lViBviKqhr","Cp3mZfLNg8","L7cGc8hJdt","HP433VjCZq","fqypycShY2","Mkgy8IBe8k","KsjRKWaim6",
+"nnP8oUlU3M","uPX7GCdyBV","cmXIXG1RhS","UlU3Mpv0i7","NOHszJXljW","b29RJqaofN","xXTI4Ul4a1","dQ586t59lR","2ZHdkcL0aE","aez9yS2Dfu",
+"jiVBPCqqaD","0YAGH9iGoT","y94nwStlDJ","F6PT2gjUTu","2ZHdkyEfy9","gdQsSiqv4k","pFrrlS2Dfu","SbRYyuupzk","l83UdNo0Qb","n8pJ9VNCPd",
+"wiHrZ0PktI","t98iWd7vjM","7fKYUJ2mQi","BFkb85ZaEz","gdQsShUTw7","D6rByyEfy9","jiVBPOUqFM","Vprf25iGN5","iB08lYw2oU","FGzgpVBjhz",
+"fcJOyAOgEe","0PktIv8yFN","NcICAjeskS","xciqpKr8ys","tjQxsJJs5m","v8yFNfmIK1","8hJdtVBjhz","GXdoHCIShG","MojnPblLA9","OUqFMWaim6",
+"Cp3mZ2hEEU","EOE1o5ZaEz","h1zcHL7cGc","gf8rI9y4lw","5Drn0WDVWJ","lCMxyl83Ud","zz4ZUChuy3","14FLRDG4sT","X6PinprNT6","8cVD3uupzk",
+"WmadAx3LDe","zQt6QZuDtD","ZhwG1CIShG","VerEAFFDui","8RCUA0h1b1","ZhwG1DLhzM","9y4lw4dEz6","atef2Yw2oU","WMiS3v8yFN","suY4xY1mC0",
+"EoToPfcwDa","v8yFNgf8rI","kZANmM3zXL","QChxs7fsYM","uQIczi7WMQ","blLA9hSSvQ","3weIFtl72W","n1pmOuupzk","GXdoHFNYIM","AOgEeqaofN",
+"0h1b1uLtKs","Vprf2SmGzv","vLsmSYOfrY","MojnPHP433","7lUXZRkQke","4W0TlAkKTk","Cfgr30Wr5y","lViBvAgJHQ","In3NSRxrsm","yluBxVNCPd",
+"KASQ8HlUbF","QssNC7ku1p","6AFT0n1pmO","Ta8f60BmCy","jSjS3zY1GY","HzZT8YOfrY","dpe1vJXljW","BbwgAFhtgl","iqv4kWaWsv","fcwDa5Namm",
+"NAFuwOUqFM","9XyT9gtCA5","SmGzvt98iW","ZhwG1hE1Ql","ulk41hi5X7","ZUnqt0Kyfs","tjQxstlILt","RkQkelViBv","S77LHLDk6f","Dz1R38xEKz",
+"tlILtni2v1","jS1aj6AFT0","JkzUntlILt","fFDrJlpF6W","Uvlv4CxVEf","dmoS7tjQxs","zFgtBfcwDa","CqqaDjeskS","djsrvCp3mZ","AgJHQdhSuH",
+"2hEEUK4GS8","8FmFHG1RhS","CdyBVni2v1","zqH0Wlm0pD","M6qcGyEfy9","KASQ8GWqqX","pFrrlvOqCE","QbxXcfFDrJ","7fsYMMaJQs","cShY2DcpWB",
+"DLhzMZuDtD","MmsIocQOnv","d85a914FLR","hE1QlvOqCE","NAFuw9y4lw","QChxs8FmFH","MmsIo7hyVv","oGu6xQ6hMC","I7p2aJXljW","uQIczMezSW",
+"HzZT8XyPZN","QWxoTs7Mxk","5Drn0QClRL","djsrvzFgtB","OUqFM9y4lw","zz4ZUfaHir","StlDJuvf7A","GSQwj14FLR","SWfouTa8f6","gf8rIfmIK1",
+"FFDuijeskS","zz4ZUCdyBV","m4bxUuQIcz","FcWrW9GXkX","0h1b1FcWrW","G1RhSMezSW","lm0pDulk41","QClRLOHaBz","jeskSDcpWB","Cp3mZZv7z0",
+"FwEJzt98iW","Ul4a1wDajX","0h1b1pFrrl","Y1mC0lpF6W","C2Ircv1Hln","cL0aEZuDtD","YOfrYBGaQY","MK07YTa8f6","dpe1viKqhr","hYBCKPYBf4",
+"S77LHOz8yZ","iKqhrL7cGc","RmDcrfmIK1","SbRYyMojnP","t98iWhi5X7","5Namm0MR5X","580YDPYBf4","0Wr5yiB08l","zFgtBQbxXc","7fKYUfFDrJ",
+"Q6LixRxrsm","v8yFNHP433","WaWsvCp3mZ","MmKGJ5VZjS","4dEz6Ul4a1","HfyNQGv3Fq","VerEABbwgA","vLsmS7lUXZ","l83Uduupzk","zqH0WHP433",
+"16lHc2hEEU","s4786kB5nP","v1Hlnn1pmO","Cfgr30ao3l","16lHcYh1hF","5nmWvwDajX","POUYSuAWyp","aDGtS5iGN5","yEfy90Kyfs","LewvMlViBv",
+"atef2zY1GY","QYxC02hEEU","i7WMQB3qem","uTacxTCgPp","4W0TlBbwgA","L7cGcuZPqg","KsjRKEoToP","Yh1hFNxx9V","nlaByU3yw5","qUJMdQnJ1S",
+"vOqCEhi5X7","14FLRFcWrW","LewvMNo0Qb","AgJHQRpBQm","rhl0JuN6r3","ix74r7fKYU","uZPqgatef2","D6rByciuWz","S77LHOUqFM","PYBf4CIShG",
+"9iGoT5Mg9r","zbIYYiwzGk","5IhmGZJTXH","KsjRKZuDtD","pWiOsTXQ0Z","lj07QFjHXR","uTacx0Wr5y","Yf2EcpWiOs","WMiS3jfREu","hUTw7WaWsv",
+"9XyT9DLhzM","aL6AJd7vjM","Oz8yZGWqqX","djsrvy94nw","ksJbysuY4x","FNYIMBFkb8","W7cTsZJTXH","IKxdL8hJdt","AgJHQ7hyVv","MaJQstlILt",
+"FxX9q8TxD7","SbRYys4786","v1Hlnk85Ae","K20wKYh1hF","QClRLEoToP","vLsmS8U2nU","jiVBPRmDcr","lpF6WaL6AJ","fcJOy7Ow5C","FxX9qguMb8",
+"O3iyQmX2GE","tuDySatef2","MGlTFNxx9V","4W0TlChuy3","aL6AJNOHsz","bgJAzECMvU","rhl0JpAhR1","HRxd88hJdt","k85AeRmDcr","HzZT8S2Dfu",
+"HfyNQBFkb8","CqqaDpAhR1","QChxsxXTI4","7ku1pSs0Zu","GSQwj7fKYU","FLsphsoy9t","i7WMQ5nmWv","cShY2QChxs","lCMxypv0i7","pWiOsX6Pin",
+"iwzGk5iGN5","D6rBy0BmCy","sx5GlOHaBz","MezSWVerEA","ZzJHWCp3mZ","sqVrfd85a9","Kr8ys2hEEU","3otm61LB1L","WDVWJjiVBP","qUJMdZuDtD",
+"cShY2uZPqg","7Ow5C1v5hH","6q6L9l83Ud","uN6r3GSQwj","cmXIX9GXkX","VjCZqDLhzM","RsQUq07n1c","DcpWBi3pyd","9GXkXVprf2","iwzGkZuDtD",
+"l83Ud0Kyfs","taOXKuupzk","zmLYDM6qcG","tAOsr0YAGH","8cVD3fcJOy","No0QbjS1aj","ulk41ZUnqt","zmLYDhE1Ql","Uvlv4iKqhr","RmDcrCK5W7",
+"aFFssFhtgl","AkKTkdjsrv","RxrsmS2Dfu","PYBf45drc6","yEfy9G1RhS","55rfBciuWz","ksJbyQClRL","faHir0PktI","WDVWJUvlv4","BFkb8fcwDa",
+"dQ586vLsmS","29QAzjeskS","JRJQB7lUXZ","RkQke5VZjS","7lUXZuAWyp","4QMc9gIYvE","JJs5muLtKs","BGaQYx3LDe","pmeCdpFrrl","DcpWB7X3uy",
+"Cp3mZMmKGJ","ThjNnb29RJ","0h1b17Ow5C","lpF6WokgRi","t59lRFwEJz","Pb1pauPX7G","Cp3mZUl4a1","ZhwG1BbwgA","RACuj0BmCy","uAWyp0BmCy",
+"Cp3mZDz1R3","brhlQXyPZN","ZuDtDsx5Gl","TXQ0ZCNHmv","v1HlnRsQUq","0ao3lqQxHP","Ta8f6ciuWz","i3pydo8Uyd","pWiOsrKDLJ","ulk41B3qem",
+"rKDLJzFgtB","7fsYMI7p2a","piJSk2ZHdk","RkQkeFLsph","uAWypzmLYD","EOE1o9iGoT","HfyNQyofH3","WreyPTa8f6","UmaEvuoStw","dhSuHCK5W7",
+"4dEz6prNT6","2Yz7EStlDJ","6AFT0fqypy","DcpWBFNYIM","SjskQi7WMQ","qQxHPkZANm","DcpWBHRxd8","pFrrlmX2GE","JRJQBpvgjS","BGaQYOUYuF",
+"QWxoT0Kyfs","y94nwciuWz","DcpWBAmdQd","W3VFHY1mC0","DQimpOUYuF","X6PinlweGy","RsQUq5nmWv","HRxd8ni2v1","qUJMdZUnqt","dQ586DcpWB",
+"prNT6StlDJ","OUYuFCp3mZ","ZuDtDkZANm","GrDg7FGzgp","WmadAjtn0X","5ZaEz7Ow5C","vkCHHGSQwj","djsrvsqVrf","ZhwG1UlU3M","JRJQBHfyNQ",
+"pv0i7Kr8ys","LbRTHpmeCd","W3VFHxciqp","Y1mC09y4lw","2hEEUNAFuw","RxrsmL7cGc","J2mQiCIShG","LbRTHs7Mxk","IBe8kiKqhr","9GXkX24ARF",
+"uupzkVjCZq","uTacx0MR5X","i7WMQzqH0W","yToGWCNHmv","G1RhSNxx9V","CdyBVDQimp","SjskQUvlv4","Yh1hFfcJOy","B3qemU3yw5","EOE1oMaJQs",
+"AmdQdUmaEv","FjHXRvLsmS","ZUnqt8hJdt","tAOsrKASQ8","jfREuUlU3M","0MR5Xiqv4k","uoStwY1mC0","fmIK1J2mQi","mX2GEQWxoT","atef2pAhR1",
+"ni2v1QnJ1S","8TxD7lj07Q","CK5W7nlaBy","AmdQdLbRTH","brhlQni2v1","7X3uyni2v1","RpBQmjS1aj","ZUnqtKZamH","DG4sT0Kyfs","4QMc9okgRi",
+"dQ5864dEz6","wDajXuupzk","lj07QGWqqX","jeskSOHaBz","b29RJSWfou","YjB9tlj07Q","Mm8sipmeCd","uAWypprNT6","9eoRcSs0Zu","i7WMQDQimp",
+"VIlwPpWiOs","6q6L9aL6AJ","VLTy6yvOMI","TCgPp9iGoT","WaWsvs4786","AkKTkpFrrl","LDk6fs93Ml","7hyVvuJScX","HzZT8Q6Lix","Cfgr3pAhR1",
+"gdQsSLbRTH","P6bcg8FmFH","0YAGHRsQUq","uTacxv2eC3","B3qemMojnP","KZamHdQ586","jSjS3yEfy9","jzUqRfLNg8","5ZaEzGWqqX","qQxHPgf8rI",
+"HfyNQ8FmFH","Pb1paHP433","2NslmuN6r3","m4bxUMK07Y","atef2yEfy9","2DREsNcICA","JIqXiUmaEv","45cIHdjsrv","aDGtSVLTy6","G1RhSuoStw",
+"iwzGkRzaZA","G1RhSEOE1o","24ARFpmeCd","hYBCKo8Uyd","iB08lpWiOs","XflUq5ZaEz","EdBKcVjCZq","NAFuwuLtKs","b29RJhSSvQ","D6rByhi5X7",
+"ThjNnLDk6f","BCxeCuLtKs","KsjRK9y4lw","NhXdu1v5hH","29QAzhE1Ql","JRJQBAXpwE","FjHXRKr8ys","3otm6dhSuH","pT8wuVjCZq","jtn0XWreyP",
+"SbRYy4dEz6","MmsIoaDGtS","8hJdtFVMxo","HRxd8Waim6","ni2v18hJdt","CxVEfGXdoH","Cfgr3QChxs","SbRYyiB08l","OxWIHQssNC","S77LHUl4a1",
+"zmLYDHfyNQ","FnPFBni2v1","5IhmGD6rBy","48cHLTXQ0Z","yToGWYOfrY","FVMxomz8gx","fFDrJ24ARF","Mm8sifLNg8","nnP8o9eoRc","aDGtSK4GS8",
+"nFqik7Ow5C","x3LDeQworu","618DiStlDJ","HRxd864s8N","lpF6WguMb8","5Mg9rK20wK","RkQkeVLTy6","s7MxkCxVEf","U3yw5QYxC0","9rlg9pFrrl",
+"CdyBVQClRL","KsjRKcShY2","xciqpd85a9","zHF1qGrDg7","ogLgctjQxs","v8yFNFxX9q","NhXduAkKTk","MK07YSs0Zu","GWqqXfFDrJ","BbwgAIn3NS",
+"yToGWb29RJ","ZuDtDOUqFM","Q6hMCpWiOs","RmDcrprNT6","SbRYycmXIX","xXTI4NcICA","RBhp07lUXZ","5Mg9rnFqik","0PktIuQIcz","0h1b1ulk41",
+"JXljWt59lR","G1RhSYw2oU","CxVEftAOsr","n8pJ9yvOMI","Ta8f6Ta8f6","OUYuFNOHsz","QClRLKZamH","S77LHeuZA5","WmadAKZamH","SjskQ618Di",
+"5ZaEztAOsr","MaJQsQworu","zHF1qjfREu","14FLRsx5Gl","TwanoNAFuw","uTacxyluBx","zmLYDS77LH","brhlQNo0Qb","U3yw5prNT6","5Mg9rSbRYy",
+"24ARF5IhmG","RBhp0qaofN","uTacxni2v1","jfREulweGy","EOE1o14FLR","aDGtS7lUXZ","d7vjMlpF6W","tvdkDGrDg7","s4786lH1kt","QWxoTGXdoH",
+"zHF1qh1zcH","ksJbyHP433","FcWrWwDajX","faHirRBhp0","JIqXi8RCUA","lViBvQ6hMC","gIYvEQChxs","o8UydLDk6f","tAOsri3pyd","qUJMdOxWIH",
+"MaJQsNAFuw","v8yFNhYBCK","DQimplsQGo","jiVBPGSQwj","XflUqzFgtB","QChxs5nmWv","SWfou4W0Tl","RpBQmiKqhr","SjskQ7lUXZ","7X3uyM3zXL",
+"n8pJ9CdyBV","BCxeC1j5L8","tuDyS64s8N","uLtKst98iW","BCxeCUl4a1","iB08lfFDrJ","BbwgAKZamH","hSSvQuTacx","VBjhzoQ87r","kB5nPdQ586",
+"BbwgAChuy3","SmGzvlH1kt","CxVEfFjHXR","FcWrWrhl0J","0PktIPb1pa","4W0TltlILt","uupzkL7cGc","0Wr5yulk41","ZJTXHZ4I1v","NAFuwTwano",
+"DQimptuDyS","RsQUq5iGN5","LDk6fzqH0W","0YAGHLewvM","0KyfsLewvM","OxWIHoQ87r","O3iyQ5Namm","tAOsrIjTwP","yofH3hi5X7","Chuy3ni2v1",
+"qQxHPIjTwP","ZJTXHWreyP","qQxHP8RCUA","Uvlv4WPmlx","5nmWvBpYhV","ix74r9iGoT","QnJ1SQworu","5NammIRh48","EoToP0ao3l","JRJQB1v5hH",
+"soy9tZuDtD","UlU3MpFrrl","jSjS3QbxXc","ksJbyWPmlx","14FLR0YAGH","FxX9q7fKYU","JIqXi14FLR","uAWypbgJAz","jzUqRyToGW","RsQUqogLgc",
+"lsQGoAgJHQ","QbxXcaDGtS","AXpwEpv0i7","1v5hHcQOnv","RBhp0vkCHH","t59lReuZA5","ThjNnKsjRK","NAFuw3otm6","QbxXcFLsph","Chuy3NOHsz",
+"suY4xeuZA5","ni2v1XflUq","RACuj1v5hH","B3qem7X3uy","bgJAzQssNC","07n1cdjsrv","CK5W7ciuWz","WDVWJQworu","hE1QlEdBKc","1LB1LgjUTu",
+"bgJAzaL6AJ","ReKEWx3LDe","SbRYyDcpWB","In3NSyluBx","zFgtBdmoS7","euZA5x3LDe","7lUXZs7Mxk","ZuDtD7X3uy","i3pyd0h1b1","CqqaDoVQp6",
+"ZUnqtqQxHP","9rlg9yofH3","W3VFHoGu6x","jSjS3y94nw","W3VFHt98iW","MezSWvkCHH","Gv3FqGXdoH","e6e4zpiJSk","B3qemK20wK","QbxXccQOnv",
+"lkMUArhl0J","wiHrZ2DREs","4QMc9xReec","cL0aEzqH0W","VLTy6suY4x","Vprf2SWfou","SmGzv8xEKz","9y4lws7Mxk","lj07QCqqaD","BGaQYCdyBV",
+"yluBxFLsph","U3yw5AkKTk","Pb1pa0YAGH","sqVrf618Di","zHF1quJScX","rKDLJPb1pa","8hJdt9GXkX","6q6L9wDajX","AgJHQDQimp","MezSWprNT6",
+"POUYSUlU3M","BpYhVsx5Gl","cmXIXCIShG","sx5Gl4dEz6","B3qem7lUXZ","G1RhSOUYuF","oQ87rni2v1","FFDuiyvOMI","IjTwP5Namm","JkzUnaL6AJ",
+"ulk41iB08l","7fKYUFxX9q","hSSvQlCMxy","7ku1py94nw","WmadAvLsmS","tl72WokgRi","GWqqXru4UG","YjB9tYw2oU","Mkgy8nFqik","RACujzbIYY",
+"qUJMdpv0i7","5Namm9rlg9","v8yFNs7Mxk","uPX7GLDk6f","yToGWVerEA","pmeCdsoy9t","qUJMdIRh48","pvgjS2DREs","MK07Yk85Ae","pAhR1Yh1hF",
+"5Drn0hSSvQ","5VZjSM6qcG","7fKYUCqqaD","Gv3Fquupzk","bZLvS8cVD3","WmadATa8f6","taOXKe6e4z","a00b5oVQp6","AIYUu618Di","4dEz6QWxoT",
+"ZuDtDFNYIM","9eoRcGWqqX","brhlQvLsmS","0Wr5yQWxoT","2Yz7Eo8Uyd","nlaByM6qcG","lweGyAIYUu","XyPZNlCMxy","7ku1pe6e4z","XyPZNKr8ys",
+"2TRI7AmdQd","JkzUn07n1c","5NammvLsmS","1LB1LYjB9t","Zv7z0ReKEW","ulk41rKDLJ","1v5hH9rlg9","NAFuwbgJAz","AkKTkHfyNQ","fmIK1Qworu",
+"7hyVvYOfrY","Cfgr3WDVWJ","8RCUAtlILt","F6PT24QMc9","jtn0X7Ow5C","JJs5mqaofN","9rlg9guMb8","Gv3Fq9rlg9","gIYvE7fKYU","0PktIMm8si",
+"rz7UtuQIcz","RzaZA5Namm","Mkgy8EOE1o","RACujaez9y","tvdkDydG8U","jS1ajOUqFM","9rlg9zQt6Q","RxrsmjSjS3","0BmCyxXTI4","0MR5X5nmWv",
+"zHF1qpFrrl","gIYvEBGaQY","3otm6EoToP","CxVEfoQ87r","Yw2oUC2Irc","8FmFHrKDLJ","RsQUqxciqp","5Drn0gtCA5","iqv4kn1pmO","QClRLguMb8",
+"7lUXZ2Yz7E","gf8rIQ6hMC","7fKYURzaZA","8FmFHCIShG","8FmFH07n1c","FnPFBCfgr3","KASQ8ZhwG1","ksJbysx5Gl","pAhR1YjB9t","VBjhz0h1b1",
+"h1zcHrKDLJ","07n1cDcpWB","TXQ0ZQnJ1S","StlDJFVMxo","zqH0WSs0Zu","nFqikZv7z0","AgJHQHRxd8","KZamHTCgPp","DcpWBfqypy","HRxd8jzUqR",
+"48cHLAIYUu","d7vjMrhl0J","n1pmOguMb8","GWqqXCdyBV","Uvlv4TCgPp","Yw2oUVIlwP","MmsIojiVBP","wDajXpvgjS","pAhR1Zv7z0","O3iyQokgRi",
+"W3VFHO3iyQ","ThjNnEOE1o","OUqFMtvdkD","4W0TlgdQsS","DcpWBgf8rI","ZuDtD5iGN5","9rlg9U3yw5","Kr8ysnFqik","0YAGH14FLR","0BmCyRxrsm",
+"BGaQYYf2Ec","n8pJ9bZLvS","ni2v1Kr8ys","Waim6jiVBP","h1zcHMmsIo","ZUnqtNhXdu","v2eC3YOfrY","cL0aECNHmv","WreyPBFkb8","iB08l9XyT9",
+"2DREssqVrf","I7p2aRzaZA","guMb8vLsmS","uAWypYjB9t","h1zcH7fsYM","BCxeCZ4I1v","i7WMQL7cGc","euZA516lHc","9y4lwpmeCd","brhlQGWqqX",
+"FLsphx3LDe","nnP8ocShY2","55rfBMaJQs","WreyPJ2mQi","1LB1LQYxC0","ZUnqt2Yz7E","gf8rIHlUbF","29QAziqv4k","ZhwG1EdBKc","lm0pDAOgEe",
+"M6qcGlkMUA","qaofN8U2nU","zbIYYWDVWJ","iKqhrWMiS3","WMiS3gjUTu","ReKEWDG4sT","G1RhS2Yz7E","Zv7z0qQxHP","29QAzBGaQY","n8pJ9BpYhV",
+"S77LHYjB9t","OUqFMRzaZA","dhSuHGrDg7","GXdoHZv7z0","AgJHQv2eC3","vOqCE0BmCy","hSSvQoQ87r","Z4I1viB08l","o8UydKASQ8","7ku1pl83Ud",
+"0ao3lM3zXL","HRxd8GrDg7","aFFssAOgEe","WPmlx3otm6","29QAzMezSW","hUTw79eoRc","ru4UG7ku1p","BGaQYBFkb8","B3qem29QAz","FLsphcQOnv",
+"rhl0JIRh48","JKWYRazIWp","oGu6xrhl0J","fqypyAIYUu","Mm8siDcpWB","tuDySwDajX","rKDLJRBhp0","WMiS30PktI","tlILt2Nslm","No0Qb0PktI",
+"IBe8kIKxdL","uvf7ANOHsz","OxWIHZzJHW","zbIYYaez9y","pAhR1a00b5","xReecgIYvE","fLNg8FLsph","2TRI7Pb1pa","i3pyd8hJdt","zz4ZUXyPZN",
+"J2mQiix74r","RBhp0OUYuF","0Wr5y7fsYM","uQIczDG4sT","tlILtdjsrv","OUYuFy94nw","SbRYyFNYIM","HRxd8QChxs","iB08lD6rBy","FnPFBSjskQ",
+"RBhp0bZLvS","0Wr5ypmeCd","VBjhzuupzk","SWfouRpBQm","ZhwG1kZANm","JXljWlH1kt","suY4xAOgEe","VNCPd2DREs","RBhp0vOqCE","OUqFMVIlwP",
+"bgJAz5IhmG","ECMvU0MR5X","IjTwPhUTw7","uZPqgDz1R3","iwzGkAkKTk","1j5L8tvdkD","2ZHdkgIYvE","HlUbFbrhlQ","tjQxs9rlg9","W7cTsazIWp",
+"uoStwnlaBy","DcpWBoQ87r","e6e4zi7WMQ","LbRTHVIlwP","iB08lokgRi","Vprf2Dz1R3","HP433FjHXR","gtCA5QYxC0","BGaQYIjTwP","5Mg9rSs0Zu",
+"Pb1patAOsr","FLsphSjskQ","azIWpTwano","7lUXZpFrrl","x3LDe9iGoT","ulk41iwzGk","uupzkuZPqg","7fKYU9GXkX","16lHcZ4I1v","7fsYM5IhmG",
+"h1zcHa00b5","k85AezmLYD","zbIYYHzZT8","i3pydMm8si","Ta8f6a00b5","yluBxHRxd8","qUJMdDG4sT","zQt6QtAOsr","8xEKzOHaBz","64s8NFnPFB",
+"djsrvMmKGJ","sqVrfJKWYR","K4GS8pAhR1","14FLRaDGtS","ulk41VerEA","lm0pDVLTy6","Yw2oUZUnqt","XflUq5IhmG","D6rBy29QAz","SbRYymX2GE",
+"UlU3MFnPFB","sx5Gl5nmWv","CNHmvKsjRK","29QAzRBhp0","IRh48MojnP","VLTy6ix74r","RsQUqmX2GE","5NammWreyP","1j5L89iGoT","JRJQBSmGzv",
+"NOHszsqVrf","Nxx9VFGzgp","Pb1pa9GXkX","FVMxofLNg8","lj07QgjUTu","0MR5XOxWIH","Oz8yZBpYhV","4QMc9Ss0Zu","Chuy3dmoS7","b29RJChuy3",
+"uupzk3otm6","S77LHQssNC","nlaByxReec","taOXK9GXkX","NOHsziqv4k","tvdkDLewvM","AIYUulm0pD","0BmCy0PktI","y94nw7X3uy","M3zXLOz8yZ",
+"8FmFHFFDui","uZPqg0YAGH","vkCHH5nmWv","BFkb8lj07Q","dhSuHoGu6x","FnPFBHRxd8","4W0TlOUYuF","BCxeC9GXkX","MmsIoyToGW","jSjS3OUYuF",
+"zz4ZUFjHXR","NcICAQworu","0PktIfFDrJ","2TRI7FwEJz","dhSuH9rlg9","MmsIoRmDcr","TXQ0ZlH1kt","D6rByn8pJ9","uJScXYh1hF","zHF1qhE1Ql",
+"JIqXiokgRi","HlUbFuQIcz","ulk415Mg9r","FjHXRmz8gx","lpF6WzbIYY","wDajXyofH3","AIYUuRACuj","cL0aEFcWrW","OHaBzEOE1o","6q6L9cmXIX",
+"9XyT9HlUbF","tvdkDbgJAz","O3iyQAmdQd","3otm6n8pJ9","DQimprz7Ut","Uvlv46AFT0","8TxD7uN6r3","JJs5matef2","MK07YIjTwP","brhlQcmXIX",
+"AXpwEAXpwE","64s8NHP433","v2eC3AXpwE","KsjRKUmaEv","zbIYYQssNC","1LB1LVLTy6","29QAzrz7Ut","rhl0JvkCHH","xciqpaDGtS","0Wr5ydpe1v",
+"2hEEUIjTwP","uupzkzQt6Q","Waim6RpBQm","RxrsmcQOnv","W3VFH5VZjS","uoStwFcWrW","HP433uAWyp","WDVWJBpYhV","Gv3Fq7hyVv","618DiSmGzv",
+"taOXKC2Irc","W7cTsiqv4k","rz7Ut7fsYM","xXTI4pWiOs","FGzgpzFgtB","StlDJ29QAz","LewvMQChxs","ksJbyVNCPd","FVMxouN6r3","yToGW4QMc9",
+"P6bcgNcICA","dhSuHBFkb8","ydG8UQbxXc","7ku1pdmoS7","7fsYMjfREu","Chuy3QssNC","uupzkQ6hMC","S2DfuReKEW","AOgEe7lUXZ","JIqXiSs0Zu",
+"Vprf2QssNC","mz8gx5ZaEz","tAOsrRACuj","GSQwj7hyVv","BGaQYlweGy","DQimprKDLJ","nnP8oJ2mQi","Uvlv4bZLvS","dmoS7O3iyQ","Ul4a1Fhtgl",
+"AOgEeUl4a1","2hEEUlH1kt","lViBvpAhR1","Vprf2jSjS3","BCxeCAOgEe","FVMxoTwano","1LB1LTCgPp","L7cGcdpe1v","xXTI4SWfou","zmLYDzmLYD",
+"Waim6Waim6","8FmFHhSSvQ","Ss0ZuK20wK","OUYuFl83Ud","zmLYDlm0pD","AXpwE9iGoT","FLsphHlUbF","dpe1vpWiOs","Vprf2ix74r","Ul4a1CdyBV",
+"WmadAeuZA5","qaofNRpBQm","qQxHPRkQke","s93MlKASQ8","RACuj5VZjS","xciqpuJScX","FFDui0PktI","SmGzv5Mg9r","Kr8ys7X3uy","y94nwJIqXi",
+"5Mg9rThjNn","9GXkXGrDg7","AkKTkyofH3","Waim6SmGzv","8TxD7dpe1v","O3iyQ7fKYU","NcICA8TxD7","DLhzMmz8gx","tl72WVerEA","kZANm7lUXZ",
+"XyPZNRsQUq","sqVrfX6Pin","d85a9AkKTk","lkMUA1LB1L","ydG8Usoy9t","LewvM48cHL","TCgPpzY1GY","JJs5myvOMI","fqypyMezSW","SjskQyvOMI",
+"MmKGJaDGtS","oGu6xSjskQ","nnP8ouLtKs","W7cTs55rfB","Dz1R3SmGzv","8hJdthe9IA","RmDcrNAFuw","VLTy69XyT9","0BmCyfmIK1","vkCHHtl72W",
+"pFrrlblLA9","jiVBPn1pmO","VIlwPx3LDe","Yw2oU0MR5X","oVQp66q6L9","QnJ1SMaJQs","xXTI464s8N","CxVEf0BmCy","lsQGoyofH3","KZamH8hJdt",
+"rKDLJFVMxo","a00b5UlU3M","NOHsz5iGN5","RxrsmiwzGk","XflUqhUTw7","prNT6Rxrsm","F6PT2lViBv","xXTI4KZamH","0ao3lQnJ1S","16lHcbZLvS",
+"D6rByjfREu","NAFuw24ARF","AkKTkLewvM","ogLgcQWxoT","5drc65VZjS","7fKYUhUTw7","NhXduFcWrW","oGu6xCxVEf","zqH0WwiHrZ","FFDuifLNg8",
+"zFgtBBbwgA","BbwgAdpe1v","uPX7G3weIF","CdyBVRBhp0","Mm8siFLsph","HP433iB08l","ydG8UX6Pin","azIWpxReec","1LB1LRACuj","DcpWBBbwgA",
+"nFqikuTacx","K20wKThjNn","AXpwEAkKTk","tlILts4786","F6PT2lweGy","2Yz7Ev2eC3","BFkb8uQIcz","QssNCuJScX","3otm6G1RhS","3otm64W0Tl",
+"WMiS3YjB9t","Kr8ysWDVWJ","8cVD3jtn0X","2Yz7E5ZaEz","cmXIXRmDcr","W7cTsjfREu","AmdQdZJTXH","fmIK15VZjS","G1RhSEdBKc","gjUTu0Kyfs",
+"WmadAI7p2a","zFgtBVjCZq","QClRLuAWyp","yofH3Chuy3","AkKTkcQOnv","AmdQdLDk6f","iwzGkb29RJ","zqH0WpT8wu","EdBKcyEfy9","pWiOsJ2mQi",
+"BpYhVlsQGo","0YAGHZJTXH","n1pmO7lUXZ","SmGzv0Kyfs","lm0pDiwzGk","uLtKsAmdQd","iqv4kbgJAz","hi5X7m4bxU","gf8rIaL6AJ","D6rByjiVBP",
+"QClRL4W0Tl","8FmFH8RCUA","MmKGJd85a9","0YAGHuN6r3","QWxoTG1RhS","taOXKkZANm","lpF6Ws7Mxk","nFqikd7vjM","64s8NYOfrY","XyPZNzQt6Q",
+"Pb1padjsrv","gf8rI1LB1L","pT8wu1LB1L","aL6AJwDajX","0PktIEoToP","55rfBtvdkD","Yf2EcZuDtD","OUYuFyluBx","NcICARxrsm","RxrsmFLsph",
+"FjHXRlXFOB","Q6hMC1LB1L","FLsphguMb8","aez9yUvlv4","Yf2EcEOE1o","ZuDtDNcICA","uJScXjeskS","2hEEUgtCA5","4QMc9XflUq","5drc6lH1kt",
+"1LB1Lv1Hln","brhlQ0Kyfs","Y1mC0W7cTs","EoToPuupzk","QworuksJby","s7MxkMK07Y","NcICAv2eC3","WreyP2Nslm","iKqhr0MR5X","IBe8kEOE1o",
+"VjCZqjeskS","2DREsHP433","FwEJzjiVBP","nFqikMezSW","1LB1LJRJQB","ZuDtDd7vjM","TCgPpMK07Y","gjUTu4W0Tl","CdyBViqv4k","atef2WPmlx",
+"OHaBzCfgr3","IRh487fKYU","fFDrJuTacx","s93MlGSQwj","4W0TluAWyp","Yw2oU8xEKz","8U2nUrz7Ut","BCxeCKASQ8","64s8NFGzgp","O3iyQuAWyp",
+"xciqpydG8U","TCgPpsoy9t","JXljWMojnP","pmeCdMmKGJ","jSjS3xciqp","K4GS8azIWp","4dEz61v5hH","lkMUAZJTXH","CK5W75Mg9r","DLhzMQWxoT",
+"OUqFMuAWyp","CNHmv7fKYU","9rlg9K20wK","qUJMdAXpwE","qQxHPix74r","5iGN5Uvlv4","Pb1paLDk6f","fmIK1y94nw","oVQp6JJs5m","ZuDtD3otm6",
+"suY4xHP433","euZA52Nslm","Q6Lixrhl0J","MmKGJ7X3uy","ZzJHWlsQGo","zbIYYjeskS","n8pJ97Ow5C","blLA9pv0i7","SWfou0PktI","lweGyXyPZN",
+"KASQ87Ow5C","2TRI7EOE1o","9XyT9y94nw","uLtKsO3iyQ","fcJOyuoStw","HRxd8Chuy3","l83UdXyPZN","rz7Utiqv4k","uTacxZJTXH","faHirMGlTF",
+"gdQsSxXTI4","6AFT0YjB9t","lweGylweGy","cL0aE8U2nU","HfyNQdhSuH","U3yw5lweGy","DLhzM14FLR","jtn0XQChxs","Yf2EcX6Pin","2NslmVLTy6",
+"nlaBycShY2","VjCZqZhwG1","FxX9qAXpwE","4W0TlQnJ1S","Dz1R3yofH3","ciuWzBGaQY","MaJQsyToGW","cQOnvNAFuw","1LB1Ld7vjM","fFDrJlH1kt",
+"lXFOBQssNC","iqv4ktuDyS","48cHLZ4I1v","DG4sTuPX7G","zqH0WRmDcr","Z4I1vJJs5m","Yh1hFZuDtD","FPfSEyvOMI","45cIHiwzGk","cL0aEQChxs",
+"ZhwG19XyT9","sqVrfAIYUu","Kr8yslXFOB","4dEz6lweGy","fcJOy3weIF","CdyBVIn3NS","VjCZqRzaZA","MGlTF48cHL","0PktIGv3Fq","s478614FLR",
+"6q6L9MaJQs","lsQGo0BmCy","gIYvEpvgjS","1v5hHTwano","StlDJokgRi","vkCHH2Yz7E","P6bcgyvOMI","Mkgy8vLsmS","BCxeCMmKGJ","ru4UGhi5X7",
+"pFrrlsoy9t","zz4ZUix74r","HfyNQUmaEv","dmoS7tlILt","HRxd8jSjS3","KsjRKCNHmv","JXljWNhXdu","suY4xEdBKc","jfREuYw2oU","5nmWvrz7Ut",
+"MmsIoU3yw5","n8pJ9ulk41","WmadAt59lR","qaofN9XyT9","OHaBzBFkb8","cL0aEO3iyQ","OUYuFJJs5m","zz4ZUdjsrv","qUJMd45cIH","POUYS64s8N",
+"jiVBPSs0Zu","6q6L9lpF6W","zY1GYEoToP","Yh1hFcmXIX","lpF6WzqH0W","iwzGkoQ87r","1v5hHguMb8","C2IrcbgJAz","azIWpYOfrY","5drc6guMb8",
+"IBe8k618Di","jiVBPlm0pD","tAOsrFFDui","xReecsoy9t","P6bcgW7cTs","d7vjMTa8f6","AXpwElweGy","VBjhzlXFOB","Mm8siMaJQs","v2eC3l83Ud",
+"Nxx9VDQimp","uJScX0ao3l","zz4ZU0YAGH","LDk6fzHF1q","WMiS3prNT6","i7WMQ2DREs","FPfSEZhwG1","G1RhS9XyT9","t98iW9y4lw","m4bxUn8pJ9",
+"dpe1vv2eC3","uPX7GDLhzM","oQ87rZzJHW","lkMUAYOfrY","SmGzvZhwG1","XflUq5Mg9r","uvf7AY1mC0","9GXkX8hJdt","2TRI7GXdoH","uN6r3BbwgA",
+"4dEz6aez9y","lCMxyQWxoT","7X3uylXFOB","BbwgAcL0aE","J2mQioVQp6","piJSkDLhzM","YOfrYOHaBz","IRh48lj07Q","IjTwPMaJQs","8RCUA8hJdt",
+"o8UydVIlwP","piJSkP6bcg","IBe8kdmoS7","MezSWt98iW","WDVWJGv3Fq","AIYUuNOHsz","nnP8oydG8U","pmeCdcL0aE","hYBCKNo0Qb","n1pmO4QMc9",
+"okgRit59lR","l83UdrKDLJ","16lHcL7cGc","m4bxUjfREu","5IhmGHRxd8","cL0aE4QMc9","WDVWJsoy9t","TXQ0Z0PktI","IBe8kHzZT8","bZLvSPb1pa",
+"9GXkXNOHsz","yToGWD6rBy","x3LDeuZPqg","14FLRiwzGk","GWqqXNcICA","8xEKzs7Mxk","xXTI41v5hH","Zv7z08xEKz","ix74r5iGN5","lXFOBFGzgp",
+"gjUTuWPmlx","48cHLqQxHP","blLA9vOqCE","tlILty94nw","fqypyChuy3","s4786W3VFH","gf8rIaDGtS","J2mQiWDVWJ","OUYuFHRxd8","Q6LixVBjhz",
+"K20wKLewvM","b29RJHlUbF","8U2nU5VZjS","HRxd8i7WMQ","fmIK13otm6","0YAGHWaim6","8FmFHvkCHH","In3NSF6PT2","xReeclXFOB","iqv4k2ZHdk",
+"14FLRWmadA","MojnPNxx9V","k85AeWaWsv","rz7UtFhtgl","CqqaDjtn0X","ThjNn0BmCy","Uvlv4BpYhV","oVQp6aL6AJ","WMiS3uoStw","dQ586DG4sT",
+"0h1b1rKDLJ","k85AeGWqqX","9y4lwhSSvQ","618DiHP433","iqv4kcQOnv","LewvMpT8wu","GrDg7fcwDa","5drc6x3LDe","FwEJzs4786","zQt6QWDVWJ",
+"GWqqXn1pmO","NhXdusx5Gl","h1zcHYjB9t","DG4sTNcICA","uQIczs4786","MezSW5Drn0","kB5nPQnJ1S","s7Mxke6e4z","5ZaEzKr8ys","yofH3yToGW",
+"W3VFH3otm6","v1HlnoVQp6","hSSvQGSQwj","oGu6x2Yz7E","Waim6Ul4a1","pAhR1sqVrf","fLNg8ogLgc","2NslmFcWrW","uvf7AU3yw5","5IhmGuTacx",
+"tvdkDMezSW","sqVrf8cVD3","uAWypnlaBy","hE1Ql2Yz7E","IjTwPOUYuF","t59lRm4bxU","mX2GE9XyT9","Q6Lixk85Ae","4QMc9uoStw","zmLYDYw2oU",
+"IRh48zQt6Q","6AFT06q6L9","dQ586KsjRK","dpe1vaez9y","TwanomX2GE","lXFOBMojnP","NhXduzbIYY","6AFT0Q6Lix","pAhR1Vprf2","Z4I1vIn3NS",
+"okgRiuoStw","24ARFcmXIX","zY1GY3weIF","suY4xrKDLJ","lm0pDRsQUq","nlaByjSjS3","0BmCyJRJQB","djsrvEoToP","24ARFhi5X7","5VZjSfLNg8",
+"55rfBHP433","aFFssHRxd8","d85a9ZJTXH","7ku1paDGtS","rKDLJk85Ae","dhSuH7X3uy","v2eC3ReKEW","VBjhzzHF1q","QYxC0WaWsv","8TxD7blLA9",
+"gtCA5pT8wu","W7cTsv2eC3","7ku1pX6Pin","BGaQYi7WMQ","IKxdL7ku1p","2TRI7hUTw7","64s8Nx3LDe","5Drn0pmeCd","16lHcWreyP","F6PT27lUXZ",
+"pmeCdSbRYy","L7cGcpvgjS","ECMvUsoy9t","TCgPpn1pmO","FVMxoKsjRK","5IhmGMaJQs","8TxD75VZjS","ZzJHWyToGW","FLsph24ARF","iwzGkx3LDe",
+"JKWYRxReec","FjHXR5VZjS","l83UdeuZA5","MojnPhi5X7","4dEz6l83Ud","SjskQMaJQs","ZuDtDzY1GY","7Ow5CMezSW","RBhp0a00b5","vLsmSWaWsv",
+"b29RJrz7Ut","prNT61v5hH","djsrvuTacx","HlUbFBCxeC","3otm6uZPqg","8U2nU580YD","gjUTucQOnv","GrDg76q6L9","lj07QCp3mZ","hUTw7MmKGJ",
+"Yh1hFYh1hF","DG4sTWMiS3","9GXkXhYBCK","Cfgr3VNCPd","lpF6WnlaBy","TXQ0ZuQIcz","lCMxyBbwgA","6AFT024ARF","UmaEvhSSvQ","pT8wu29QAz",
+"QworulpF6W","EOE1ouN6r3","B3qemcShY2","tAOsr48cHL","bgJAzsqVrf","hi5X7HlUbF","iB08la00b5","lXFOBo8Uyd","I7p2aU3yw5","EoToPMmKGJ",
+"jfREuZJTXH","In3NSGrDg7","RBhp0MojnP","rKDLJX6Pin","azIWpGrDg7","uvf7AgdQsS","NcICASbRYy","K20wKjtn0X","9XyT9TXQ0Z","JXljWNo0Qb",
+"J2mQiuJScX","jfREu618Di","nlaByguMb8","RsQUq8hJdt","Chuy345cIH","suY4xhUTw7","Nxx9VOUqFM","kB5nPW7cTs","sx5Gl0Kyfs","ECMvUZUnqt",
+"Zv7z0ZJTXH","BFkb8tl72W","uTacxOxWIH","9eoRcqUJMd","7ku1p14FLR","FNYIMBCxeC","0ao3luLtKs","XflUq6q6L9","QChxsaFFss","jS1ajUlU3M",
+"0h1b1y94nw","5IhmGQssNC","tuDySvLsmS","RzaZAzz4ZU","NcICAzHF1q","GrDg7No0Qb","jtn0XF6PT2","BpYhV0Kyfs","zqH0Wsx5Gl","brhlQokgRi",
+"KsjRKfcwDa","s4786yluBx","ZzJHW5nmWv","DG4sTOz8yZ","WMiS3dhSuH","FwEJzUl4a1","uoStwNo0Qb","9rlg94dEz6","vkCHHVprf2","b29RJjiVBP",
+"Uvlv4yofH3","QbxXcWmadA","LbRTHuN6r3","Oz8yZ8hJdt","zHF1qNcICA","I7p2a1v5hH","0PktIWaWsv","jS1ajtvdkD","MGlTFpvgjS","GXdoH2hEEU",
+"JJs5m9iGoT","piJSkguMb8","FVMxoB3qem","64s8NtjQxs","ydG8U8TxD7","VLTy6m4bxU","UlU3M3weIF","yluBx5ZaEz","aFFsszmLYD","Gv3FqDG4sT",
+"G1RhSjtn0X","RACuj7X3uy","BFkb8piJSk","XflUqReKEW","cQOnvAgJHQ","Yw2oUzmLYD","WMiS3faHir","lj07Q0Wr5y","aez9y9iGoT","0MR5XvOqCE",
+"iKqhrHRxd8","64s8N5IhmG","FnPFB64s8N","MK07YAIYUu","bgJAzm4bxU","gdQsSJ2mQi","HzZT8CxVEf","8U2nUMm8si","uoStwD6rBy","lkMUA7Ow5C",
+"lm0pDjSjS3","8RCUAChuy3","lsQGoHfyNQ","MaJQslsQGo","piJSkK4GS8","G1RhSWDVWJ","uoStwtl72W","580YDHlUbF","8cVD35VZjS","fcwDapAhR1",
+"BbwgA5Mg9r","e6e4zaL6AJ","MaJQsi3pyd","MK07Y4W0Tl","IKxdL4dEz6","gtCA5h1zcH","y94nwb29RJ","lH1ktpAhR1","OxWIHs7Mxk","y94nwqaofN",
+"aFFssuvf7A","In3NSs7Mxk","EoToPlm0pD","t98iWBpYhV","DQimpGv3Fq","AOgEeWDVWJ","oQ87rxXTI4","fLNg8K20wK","rz7UttaOXK","he9IAdjsrv",
+"MmsIoyEfy9","5IhmGM6qcG","MaJQspFrrl","POUYSJIqXi","F6PT2GSQwj","n1pmORkQke","VerEAFjHXR","YOfrYMmsIo","rKDLJguMb8","wDajXiKqhr",
+"QssNC5VZjS","GSQwjYw2oU","PYBf42TRI7","yofH39iGoT","faHir8U2nU","xXTI4dmoS7","0YAGH0BmCy","v1HlnjSjS3","P6bcgQClRL","PYBf4vLsmS",
+"0PktIqQxHP","7lUXZcL0aE","JkzUn7fKYU","AkKTkSbRYy","55rfBQYxC0","1v5hHmz8gx","ksJbyqQxHP","fcwDan1pmO","Vprf2YjB9t","RzaZANhXdu",
+"9GXkXvOqCE","YjB9tFGzgp","8TxD7SWfou","brhlQK4GS8","JkzUnS77LH","tjQxsyvOMI","JkzUn5Namm","k85Ae6AFT0","8FmFHgjUTu","FnPFB5Mg9r",
+"guMb8rhl0J","vOqCE0Kyfs","FVMxoFPfSE","9GXkXAIYUu","YOfrY9eoRc","uLtKsBCxeC","i3pydK4GS8","RzaZADz1R3","Vprf2Twano","jS1ajhi5X7",
+"a00b5BCxeC","K20wKhUTw7","sqVrfpmeCd","1LB1LtaOXK","K20wKn8pJ9","Cp3mZKsjRK","dpe1vQ6hMC","SmGzvO3iyQ","he9IA8TxD7","gf8rIfLNg8",
+"8RCUA2Yz7E","FLsph580YD","zFgtBaez9y","aFFssTa8f6","HlUbFMGlTF","Ul4a1lCMxy","WaWsv0h1b1","BbwgAwDajX","ZJTXHFnPFB","aFFssOUYuF",
+"aFFssuTacx","k85Ae2Yz7E","3weIFZv7z0","pmeCdSWfou","suY4xrz7Ut","gjUTu8TxD7","zY1GY1LB1L","Nxx9V48cHL","sx5Gl8RCUA","OUYuFLbRTH",
+"TwanoAOgEe","45cIHStlDJ","aDGtSIjTwP","hUTw7POUYS","CxVEfRzaZA","Q6hMCs4786","vOqCECp3mZ","9rlg9Ss0Zu","2ZHdkRxrsm","9rlg9RsQUq",
+"cmXIXI7p2a","lpF6Wsoy9t","pFrrltlILt","ZuDtDMGlTF","0BmCy7Ow5C","Pb1paMezSW","Gv3FqYjB9t","GrDg7Ss0Zu","hi5X7QnJ1S","HzZT80Kyfs",
+"qaofNzmLYD","lm0pDZ4I1v","CK5W7qUJMd","2ZHdkuN6r3","lkMUARmDcr","EoToPNAFuw","Ta8f6JKWYR","K4GS85VZjS","BCxeCVBjhz","gtCA5aDGtS",
+"7Ow5C8hJdt","x3LDe7ku1p","EdBKchi5X7","rz7UtQ6hMC","Pb1pa0Wr5y","tvdkDdQ586","7Ow5CNxx9V","zmLYDG1RhS","hi5X77X3uy","7hyVvyofH3",
+"lkMUAMGlTF","7fKYUBFkb8","uoStwmz8gx","pT8wuF6PT2","iB08l0h1b1","5drc6JIqXi","vOqCE0MR5X","fqypybrhlQ","ogLgc07n1c","WDVWJuJScX",
+"hUTw7lkMUA","t98iWogLgc","7fKYUd85a9","5VZjSh1zcH","suY4xMezSW","uQIczWPmlx","uQIcziB08l","6q6L9JJs5m","uQIczfcJOy","7lUXZZUnqt",
+"8TxD7jiVBP","hi5X7UlU3M","Q6hMCQ6Lix","IjTwPX6Pin","k85AeVNCPd","HRxd8OUqFM","In3NSJRJQB","HfyNQFcWrW","JIqXik85Ae","Ta8f6t59lR",
+"gjUTuAgJHQ","faHirjeskS","Zv7z05Mg9r","2hEEUBGaQY","0ao3laFFss","o8UydCNHmv","DG4sTIBe8k","kZANmuLtKs","xciqppvgjS","M6qcG9rlg9",
+"HRxd8soy9t","2hEEUbrhlQ","he9IAQChxs","16lHc3otm6","bZLvSSbRYy","Yf2EcAIYUu","e6e4zdQ586","BCxeCJIqXi","QChxscQOnv","6q6L9vkCHH",
+"9iGoTZv7z0","O3iyQRsQUq","6q6L98cVD3","BpYhVdhSuH","jeskS1j5L8","yToGWRmDcr","piJSkRxrsm","IBe8k5nmWv","AmdQdHzZT8","O3iyQJKWYR",
+"ECMvUv1Hln","y94nw5Mg9r","Pb1pa24ARF","7fsYMoGu6x","IRh48uZPqg","CK5W7DLhzM","7hyVvRsQUq","ZhwG1VerEA","J2mQi618Di","uLtKsQClRL",
+"7fKYUhSSvQ","yvOMIYOfrY","lpF6W0Kyfs","taOXKyvOMI","MmsIovOqCE","9iGoTpAhR1","rKDLJJJs5m","soy9tWaim6","OHaBzCIShG","JkzUnpT8wu",
+"qaofNSs0Zu","wDajXQChxs","I7p2aZuDtD","Chuy3Qworu","lweGytuDyS","5nmWvPOUYS","5NammkB5nP","07n1cRmDcr","JRJQBK20wK","ix74rQbxXc",
+"C2IrcF6PT2","qUJMdyofH3","azIWpqQxHP","FFDuitvdkD","yEfy9WreyP","fFDrJSbRYy","HfyNQStlDJ","BFkb8tlILt","ulk41Twano","MGlTFk85Ae",
+"Pb1paBGaQY","AgJHQVLTy6","qQxHPFjHXR","EOE1ofmIK1","RxrsmNOHsz","qQxHPLbRTH","cL0aEs93Ml","pWiOslXFOB","m4bxURzaZA","NhXduhi5X7",
+"CNHmvNo0Qb","lpF6WSjskQ","Oz8yZpFrrl","hi5X7VNCPd","yofH3M6qcG","0BmCyogLgc","fcJOyhe9IA","lXFOBlm0pD","29QAzVIlwP","Chuy3M6qcG",
+"5drc6ydG8U","64s8N0Wr5y","WreyPeuZA5","QWxoTn1pmO","8U2nUOHaBz","9GXkXcQOnv","mz8gxkZANm","0BmCyciuWz","YOfrYS2Dfu","Waim66q6L9",
+"2ZHdkoGu6x","ZJTXHRkQke","n1pmOY1mC0","GWqqXiB08l","HP433i3pyd","hi5X79iGoT","jeskSNAFuw","ulk41a00b5","5IhmGn1pmO","7lUXZBCxeC",
+"JJs5m5Drn0","jiVBPlj07Q","atef27X3uy","0MR5XKr8ys","lkMUAkZANm","W3VFHx3LDe","IRh48NOHsz","atef20BmCy","FhtglvkCHH","oVQp6ZhwG1",
+"lm0pD14FLR","uTacx6AFT0","HP433FcWrW","9GXkX2hEEU","ulk41Ul4a1","5Drn0FLsph","MmKGJQWxoT","nFqikuoStw","uoStwsqVrf","MK07YIRh48",
+"lCMxyjiVBP","uQIczbgJAz","8cVD3ulk41","Waim6In3NS","SjskQHfyNQ","nnP8oYjB9t","zQt6QCqqaD","jzUqRlpF6W","l83Ud4QMc9","64s8N7X3uy",
+"lm0pDVprf2","OUqFMAkKTk","AgJHQydG8U","RmDcrvOqCE","gjUTuMm8si","aDGtSYh1hF","dpe1vGrDg7","MojnP1j5L8","BCxeCv2eC3","ulk415Drn0",
+"pmeCdlm0pD","UmaEvZ4I1v","7Ow5Csoy9t","jfREudpe1v","lXFOBAOgEe","jfREu3otm6","brhlQOHaBz","TwanoP6bcg","TCgPpNAFuw","aL6AJdmoS7",
+"XyPZNi3pyd","AOgEeyofH3","FcWrW0BmCy","ThjNnOHaBz","NhXduLDk6f","8hJdtLDk6f","0PktIoQ87r","ZhwG1nlaBy","yEfy9jtn0X","tvdkD2TRI7",
+"m4bxUJIqXi","uQIcz6AFT0","ZuDtDNo0Qb","NcICA0YAGH","D6rByUvlv4","HP433aez9y","VerEAWmadA","lViBvn8pJ9","7ku1p0YAGH","9GXkXfcJOy",
+"FVMxo14FLR","K20wKblLA9","iwzGkRBhp0","rKDLJhYBCK","DQimpjfREu","7X3uy7X3uy","AIYUuuQIcz","Q6Lix6AFT0","ZJTXHXyPZN","qQxHPtlILt",
+"TXQ0Zh1zcH","gtCA5sx5Gl","FwEJz9XyT9","M3zXLBbwgA","0Kyfs55rfB","9y4lwI7p2a","VerEARACuj","5iGN5QnJ1S","ZJTXHKsjRK","OUqFMzqH0W",
+"dhSuHFPfSE","pAhR1No0Qb","FFDuiyToGW","5iGN5nFqik","y94nwOz8yZ","ZuDtDuAWyp","FVMxofqypy","K4GS8taOXK","FjHXRfcJOy","ksJbyNcICA",
+"RACujfcwDa","POUYStjQxs","dhSuHmz8gx","HRxd88TxD7","AXpwEuQIcz","tvdkDpFrrl","DLhzMFcWrW","Kr8ysatef2","qQxHPd7vjM","zHF1qJ2mQi",
+"dhSuH5iGN5","lm0pDAIYUu","AXpwEmz8gx","GXdoHdmoS7","v2eC3Ta8f6","blLA9yluBx","jtn0XpvgjS","t59lRIjTwP","O3iyQtuDyS","uJScX48cHL",
+"XyPZNdmoS7","gf8rISjskQ","fcwDaNAFuw","pFrrlJkzUn","vOqCEC2Irc","MezSWChuy3","9iGoTVprf2","1j5L8t98iW","9rlg9ulk41","tjQxsuPX7G",
+"BFkb8cL0aE","fFDrJQssNC","ZJTXHIRh48","QWxoTUl4a1","LbRTHMkgy8","F6PT2WaWsv","SmGzvUmaEv","NcICAzFgtB","ksJbyS77LH","AkKTkdpe1v",
+"XyPZNzFgtB","7ku1puTacx","DLhzMOz8yZ","ix74r8xEKz","lViBvs4786","Yw2oUaL6AJ","iqv4kRkQke","2Nslm5IhmG","n8pJ9fcwDa","WPmlxFjHXR",
+"Gv3FqHzZT8","U3yw5uAWyp","FwEJzcQOnv","CxVEf7X3uy","xXTI4RkQke","fqypy2hEEU","vkCHHaez9y","YjB9tK4GS8","yofH3lweGy","uupzkgjUTu",
+"yluBxtuDyS","2Yz7EAOgEe","EdBKcxXTI4","LbRTHChuy3","OxWIH1j5L8","m4bxUdmoS7","zQt6Q2hEEU","EOE1ohUTw7","WaWsvFnPFB","RzaZAC2Irc",
+"24ARFBFkb8","yluBxQClRL","SmGzv4W0Tl","ni2v19y4lw","580YDhYBCK","29QAzvkCHH","kZANmP6bcg","5VZjSFLsph","cmXIX7X3uy","RzaZAO3iyQ",
+"d7vjMbZLvS","W3VFHM3zXL","NhXduydG8U","lH1ktHzZT8","24ARFRsQUq","HzZT8uJScX","HzZT8AkKTk","ydG8USjskQ","DLhzMQnJ1S","HzZT8dmoS7",
+"OxWIHFGzgp","9eoRc2ZHdk","Yf2EcTwano","zmLYDxciqp","JKWYRfmIK1","TwanoECMvU","n1pmOhi5X7","pAhR1JXljW","uZPqgpT8wu","Chuy3B3qem",
+"Cfgr3l83Ud","fLNg89GXkX","cQOnva00b5","hi5X7kB5nP","Chuy3Nxx9V","RACujpFrrl","aez9yWreyP","zqH0WZhwG1","uQIcz24ARF","oGu6xcShY2",
+"Mkgy8FjHXR","7hyVvDLhzM","o8UydJkzUn","FjHXRzQt6Q","QworuBpYhV","jiVBPdmoS7","lj07QWmadA","pT8wut98iW","dhSuH0PktI","55rfBtl72W",
+"4dEz6I7p2a","7X3uy1j5L8","uAWypNxx9V","Gv3Fqa00b5","RxrsmK20wK","EoToPQChxs","CIShGxciqp","oVQp624ARF","lkMUA1v5hH","SbRYylpF6W",
+"8FmFHlkMUA","LbRTHCqqaD","lm0pDSmGzv","NhXduWPmlx","nnP8oAgJHQ","xReecWMiS3","VerEAEOE1o","aez9ytl72W","gdQsS55rfB","mX2GE7fKYU",
+"Ul4a1Waim6","IjTwPyofH3","5nmWvcQOnv","7lUXZBFkb8","IKxdLfcwDa","4dEz6B3qem","i7WMQThjNn","cQOnviwzGk","BbwgAOxWIH","d85a9s7Mxk",
+"BbwgAG1RhS","d7vjMMm8si","Ul4a164s8N","FhtglFFDui","Mm8sin1pmO","580YD16lHc","BCxeCiKqhr","WaWsv2DREs","2DREsChuy3","uAWypcL0aE",
+"QClRLDG4sT","qaofNhSSvQ","nFqikYjB9t","Zv7z0gjUTu","AIYUupT8wu","yToGWLDk6f","ix74rhi5X7","RBhp09XyT9","uupzkn1pmO","64s8NAIYUu",
+"euZA55VZjS","RmDcrMezSW","16lHcs93Ml","GWqqXJRJQB","Yf2Eculk41","Yh1hFbZLvS","2hEEUNo0Qb","MK07YcmXIX","8RCUAC2Irc","oQ87rru4UG",
+"Yh1hFdjsrv","0BmCyksJby","AXpwEcQOnv","CxVEfblLA9","jiVBPQ6Lix","1LB1LZhwG1","CK5W7pAhR1","iB08lQ6Lix","sqVrfB3qem","n8pJ90Kyfs",
+"o8UydhSSvQ","JRJQBiqv4k","ZUnqts4786","lpF6WNxx9V","8TxD7GWqqX","VerEAqUJMd","JkzUnnnP8o","fmIK1HP433","AOgEelj07Q","IjTwPxReec",
+"55rfBLbRTH","QssNCtvdkD","RkQkejtn0X","I7p2aFjHXR","nlaBygjUTu","KZamHWaWsv","tl72WHfyNQ","lViBvCdyBV","hYBCKMojnP","vOqCEfFDrJ",
+"48cHL4dEz6","M6qcGpWiOs","AXpwEdQ586","HlUbFFFDui","WDVWJYh1hF","NcICA8xEKz","uupzkJXljW","2TRI7ru4UG","14FLRBCxeC","Oz8yZMojnP",
+"FGzgpS2Dfu","ydG8UUl4a1","Mkgy8zY1GY","0Wr5yYw2oU","ZzJHWNOHsz","TCgPpuQIcz","DG4sTTwano","fmIK1VLTy6","n8pJ98U2nU","uTacxuvf7A",
+"CqqaDzmLYD","piJSk5ZaEz","n8pJ9VjCZq","RmDcr0PktI","Ul4a1lpF6W","gjUTulCMxy","MmKGJ07n1c","uJScXtuDyS","hi5X7uLtKs","FwEJz16lHc",
+"UmaEvrz7Ut","gjUTuQWxoT","pmeCdZuDtD","Mkgy8ZUnqt","v8yFNQYxC0","zbIYYIjTwP","7fKYU5IhmG","ThjNn9y4lw","7fsYMQnJ1S","Uvlv4pAhR1",
+"JkzUnru4UG","07n1cSWfou","zFgtBMK07Y","5iGN5QClRL","JkzUnLewvM","fmIK1MojnP","618DipWiOs","SbRYynlaBy","MmsIozmLYD","KASQ8Ta8f6",
+"5drc60h1b1","FNYIMrz7Ut","Waim6CqqaD","FVMxolViBv","azIWp0MR5X","NAFuwJRJQB","jS1ajuoStw","euZA5nnP8o","xciqp4W0Tl","jtn0XlweGy",
+"djsrvlm0pD","mz8gxzbIYY","jeskSQ6hMC","jfREuTwano","0YAGHSs0Zu","lm0pDhE1Ql","dQ586Cp3mZ","UmaEvOUYuF","SbRYyksJby","29QAzkB5nP",
+"yluBx7Ow5C","Chuy3cShY2","zY1GYydG8U","kZANmzmLYD","ZUnqt0YAGH","B3qem5Mg9r","ZhwG1s7Mxk","5nmWv5VZjS","X6PinIjTwP","Cfgr3MaJQs",
+"W3VFHQ6Lix","16lHcdQ586","9y4lwHRxd8","h1zcH48cHL","Kr8ysP6bcg","v1Hln29QAz","ZJTXHiwzGk","G1RhScShY2","lsQGouoStw","vLsmSjtn0X",
+"CNHmviKqhr","hYBCKXyPZN","WmadAqaofN","pvgjSAOgEe","hSSvQmz8gx","xXTI4yToGW","zFgtBFxX9q","CxVEfzY1GY","NOHsz0PktI","J2mQiFLsph",
+"2Yz7EyvOMI","VIlwPQworu","ThjNn14FLR","5drc60MR5X","BGaQYlsQGo","Ul4a1mX2GE","55rfBuZPqg","oGu6xdhSuH","vkCHHU3yw5","cQOnvk85Ae",
+"IBe8klkMUA","0h1b1Chuy3","8RCUAzbIYY","4W0Tlsoy9t","IjTwP2DREs","ogLgcWDVWJ","nnP8oh1zcH","pT8wuzmLYD","cShY2HlUbF","QYxC0WmadA",
+"7ku1pzz4ZU","fmIK1guMb8","5Drn0lweGy","S77LHSmGzv","m4bxU29QAz","zbIYYiB08l","14FLRpT8wu","UlU3M55rfB","8cVD3e6e4z","FLsphzqH0W",
+"7fKYUDG4sT","uZPqgZJTXH","FxX9qRxrsm","EoToP1LB1L","618DiTXQ0Z","prNT6JXljW","EdBKccmXIX","580YDpAhR1","vLsmSpWiOs","GSQwjlViBv",
+"5drc6soy9t","FGzgpVerEA","0PktIogLgc","s7Mxk0MR5X","CK5W7aFFss","uZPqgyofH3","55rfBpT8wu","s93MlRzaZA","LDk6fMmsIo","i7WMQ8FmFH",
+"YjB9tazIWp","AgJHQMmKGJ","dpe1vydG8U","cShY2jtn0X","ru4UG1v5hH","pWiOs4W0Tl","IjTwP29QAz","QnJ1SSmGzv","RsQUqi7WMQ","jeskSI7p2a",
+"EoToPRmDcr","lkMUAfLNg8","dhSuHzz4ZU","iqv4kJkzUn","JkzUnqQxHP","HzZT8M6qcG","uZPqggdQsS","vkCHHzFgtB","IBe8kKASQ8","pT8wugIYvE",
+"zHF1qbgJAz","0ao3lJ2mQi","AkKTkCK5W7","gIYvEYjB9t","AmdQdn1pmO","KZamH45cIH","v2eC32ZHdk","zY1GYpmeCd","jzUqRfaHir","v8yFNi7WMQ",
+"QworublLA9","lweGya00b5","07n1cCdyBV","ZJTXHIBe8k","ulk41RsQUq","POUYSaez9y","HfyNQPb1pa","W3VFHIBe8k","2TRI7ulk41","OUqFMlweGy",
+"rz7UtlsQGo","QWxoTRkQke","Q6hMCuoStw","0ao3lU3yw5","y94nwuvf7A","7lUXZblLA9","atef2IjTwP","bZLvSS77LH","OxWIHPOUYS","S77LHrKDLJ",
+"IRh48qQxHP","WmadAWmadA","gdQsSY1mC0","8FmFHCqqaD","ksJbyKASQ8","uZPqgtlILt","Uvlv4jS1aj","xReectaOXK","atef29y4lw","14FLRqQxHP",
+"TCgPpwiHrZ","HRxd8M6qcG","s4786EdBKc","W7cTsa00b5","VerEAL7cGc","NAFuw618Di","TCgPpni2v1","EdBKcFnPFB","Vprf28FmFH","uAWypgtCA5",
+"s7MxkfFDrJ","lCMxy64s8N","Chuy3zQt6Q","uoStwIKxdL","KsjRKYjB9t","MojnPEoToP","MK07YpWiOs","4QMc9zFgtB","IBe8kFFDui","n8pJ9U3yw5",
+"euZA5uN6r3","In3NSciuWz","jfREuwiHrZ","zQt6QLewvM","kB5nPMmKGJ","zHF1qfLNg8","MezSWoVQp6","EOE1ojSjS3","GrDg7POUYS","M3zXLhi5X7",
+"aDGtSIn3NS","nFqikhE1Ql","lpF6WMezSW","8FmFHzqH0W","lViBvpv0i7","TXQ0ZbrhlQ","24ARFKZamH","Oz8yZt98iW","CIShG0PktI","okgRigIYvE",
+"14FLRGWqqX","FPfSECqqaD","ciuWzVLTy6","5Mg9rzHF1q","0h1b14W0Tl","pAhR1lj07Q","QbxXcMmsIo","VIlwPjSjS3","euZA5QssNC","a00b5NhXdu",
+"FFDuiokgRi","GSQwjY1mC0","k85Aesx5Gl","5drc6lweGy","bZLvSZzJHW","uupzkF6PT2","RACuj618Di","mX2GEIRh48","MaJQsfcwDa","RpBQmQ6hMC",
+"pvgjSm4bxU","gtCA5Waim6","BGaQY24ARF","ZuDtDReKEW","LbRTHlm0pD","b29RJYf2Ec","Y1mC0rKDLJ","hYBCK7fsYM","lkMUAAmdQd","Q6LixuoStw",
+"fFDrJAkKTk","FFDuisqVrf","8TxD7NhXdu","n1pmOaL6AJ","CNHmvO3iyQ","s93Mlsoy9t","kB5nP2Yz7E","qaofNn1pmO","55rfBdQ586","Waim6IRh48",
+"8hJdtZhwG1","brhlQ7X3uy","iKqhrhYBCK","suY4xb29RJ","gtCA5s7Mxk","14FLRzqH0W","x3LDe9XyT9","FLsphP6bcg","Kr8ysokgRi","M6qcG7Ow5C",
+"618Disx5Gl","ZhwG1EoToP","JXljWZv7z0","U3yw5uPX7G","IjTwPEoToP","fLNg8l83Ud","sx5GlRBhp0","Yh1hFOUqFM","580YD9eoRc","ogLgc5Mg9r",
+"1j5L8QYxC0","LDk6fDQimp","uoStwGWqqX","5nmWvWPmlx","t59lRpmeCd","jSjS3AmdQd","uLtKslXFOB","24ARFt59lR","y94nwGrDg7","ciuWze6e4z",
+"TXQ0ZtAOsr","aL6AJ3weIF","lXFOBfcwDa","h1zcHPOUYS","o8UyduoStw","NOHszv2eC3","8xEKzJKWYR","KZamH7Ow5C","s4786LewvM","FLsphpiJSk",
+"FxX9qtvdkD","zmLYDJIqXi","lXFOBzHF1q","qQxHPtaOXK","ulk41ZJTXH","pWiOsK4GS8","JKWYRKsjRK","B3qemsx5Gl","uvf7AHP433","i7WMQhi5X7",
+"QYxC05VZjS","FLsphFwEJz","a00b5QYxC0","uN6r35IhmG","ZhwG1HzZT8","0YAGHjS1aj","9y4lwY1mC0","Y1mC0zz4ZU","aDGtS1j5L8","AOgEeuupzk",
+"Pb1paXyPZN","SbRYyVNCPd","fcwDaSbRYy","0YAGHIRh48","v2eC3nFqik","gIYvE1LB1L","C2Ircpv0i7","0YAGHaez9y","3weIF5Namm","Q6LixwDajX",
+"RBhp07fsYM","S77LHDcpWB","1LB1LZJTXH","DLhzM5nmWv","5nmWvzQt6Q","aFFsszFgtB","Gv3FqFjHXR","Ul4a1hSSvQ","iwzGk8RCUA","Z4I1vjSjS3",
+"y94nwokgRi","JkzUnTa8f6","YOfrY7fsYM","MmKGJrKDLJ","1j5L8VIlwP","jzUqRU3yw5","Kr8yszbIYY","G1RhSOz8yZ","KZamHx3LDe","nlaByIRh48",
+"YjB9tZzJHW","RpBQmiwzGk","45cIH5drc6","8xEKzvkCHH","zz4ZUSWfou","Yf2EcCIShG","ciuWzDG4sT","5Mg9rt59lR","CxVEfMm8si","1LB1L4QMc9",
+"Ta8f664s8N","CdyBVZ4I1v","pT8wuMGlTF","QChxsuTacx","CK5W7JJs5m","MezSWsqVrf","M6qcGRsQUq","tlILt55rfB","ZUnqtxXTI4","Vprf2BpYhV",
+"he9IAoQ87r","yluBxhYBCK","aDGtStAOsr","0PktID6rBy","fmIK1v8yFN","xciqpW7cTs","yofH3FjHXR","WaWsvrKDLJ","vkCHHLDk6f","KZamHKsjRK",
+"Yw2oUrz7Ut","o8UydPb1pa","he9IARpBQm","8RCUAJkzUn","VIlwP24ARF","pT8wuDz1R3","DcpWBReKEW","SbRYy7ku1p","lCMxy14FLR","uTacxK20wK",
+"QworuMezSW","m4bxU7Ow5C","qUJMdF6PT2","aDGtSpFrrl","55rfBxciqp","45cIHv2eC3","ReKEW6q6L9","mz8gxbgJAz","bZLvS55rfB","GSQwjxReec",
+"gjUTuIjTwP","uoStwNAFuw","VIlwPhe9IA","hYBCKQ6hMC","uoStwblLA9","WDVWJQYxC0","jtn0XMezSW","cQOnvaL6AJ","RxrsmVLTy6","8cVD38U2nU",
+"uQIczlj07Q","SWfoublLA9","Q6LixIRh48","zmLYD5VZjS","iwzGkeuZA5","cQOnvEOE1o","2hEEUFLsph","cL0aEGXdoH","YjB9tRsQUq","W7cTsVprf2",
+"VerEA0ao3l","M6qcG5Namm","aL6AJuJScX","K20wKzFgtB","UmaEvlCMxy","JJs5mEdBKc","SWfouQClRL","AgJHQvOqCE","45cIHKZamH","gIYvEOz8yZ",
+"FcWrWQ6hMC","WaWsvCNHmv","55rfBPYBf4","faHirgf8rI","MmKGJdQ586","FjHXREOE1o","zQt6QIBe8k","sx5GlnlaBy","hYBCKBbwgA","lpF6WMaJQs",
+"5ZaEzQChxs","k85AeDcpWB","Yf2EcFVMxo","4QMc9uN6r3","9rlg9M3zXL","dQ586Zv7z0","FxX9qcQOnv","iB08lhE1Ql","Nxx9VDG4sT","Twanoi3pyd",
+"TXQ0Z580YD","2ZHdke6e4z","0YAGHGWqqX","k85AeZuDtD","2DREs0Kyfs","hSSvQFVMxo","CNHmvhSSvQ","SjskQrKDLJ","CIShGDcpWB","HlUbFcQOnv",
+"DQimpVprf2","FNYIMKZamH","K4GS8sqVrf","DG4sTKr8ys","iwzGkB3qem","tAOsrNOHsz","9XyT9gf8rI","gtCA5qQxHP","lkMUAY1mC0","WDVWJFjHXR",
+"FNYIMtjQxs","NhXduqUJMd","s7MxkfLNg8","vOqCEMaJQs","4dEz62TRI7","ZUnqtlCMxy","8xEKz2TRI7","FjHXRi7WMQ","yluBx8hJdt","GWqqXVprf2",
+"dQ586ZuDtD","4dEz6xReec","nlaByjzUqR","aFFssJJs5m","55rfBQworu","aDGtSUvlv4","QChxs7fKYU","guMb8nFqik","aDGtSFNYIM","UlU3MqaofN",
+"fLNg8SWfou","vLsmSpv0i7","pWiOs7ku1p","fcwDaJXljW","RsQUq8FmFH","oQ87rQYxC0","GXdoHCqqaD","l83UdsqVrf","KZamH2hEEU","Q6hMCHzZT8",
+"AmdQdFVMxo","CIShGLewvM","zqH0WlViBv","2Yz7EuN6r3","Yf2EcFhtgl","RBhp0FjHXR","UlU3MKr8ys","nlaBy0BmCy","i7WMQWaim6","bgJAzYf2Ec",
+"lj07QlweGy","BGaQYbZLvS","SmGzvl83Ud","h1zcHrhl0J","guMb8tAOsr","k85Aemz8gx","RBhp08cVD3","S77LH0BmCy","iKqhr14FLR","ECMvUkB5nP",
+"RkQke2TRI7","FcWrWtAOsr","fFDrJY1mC0","fcwDa0Kyfs","W7cTsZv7z0","dmoS7U3yw5","jfREuvOqCE","dhSuH8FmFH","Yf2Ecy94nw","AmdQdEdBKc",
+"OUqFMnnP8o","HRxd8OxWIH","Pb1paRpBQm","dmoS7ThjNn","FxX9q2hEEU","ciuWzIn3NS","24ARFQbxXc","TCgPpRzaZA","RACujVjCZq","RkQkecQOnv",
+"uupzkfmIK1","Pb1paOHaBz","dhSuHLewvM","2Yz7EzQt6Q","lkMUAeuZA5","ksJbyMkgy8","TwanoW7cTs","ulk412Yz7E","dQ5862Nslm","fcJOyNAFuw",
+"DG4sTqQxHP","GrDg7FVMxo","EoToPMGlTF","B3qem7fsYM","BCxeCQWxoT","Chuy38U2nU","O3iyQdjsrv","VIlwPzbIYY","HlUbF64s8N","580YDwDajX",
+"SjskQNcICA","dhSuHd7vjM","Yf2Eclm0pD","e6e4z0MR5X","lsQGoYjB9t","v1Hln2TRI7","BpYhVNOHsz","fFDrJm4bxU","FVMxoRpBQm","LDk6fl83Ud",
+"W3VFH8FmFH","v8yFNCqqaD","7Ow5COxWIH","POUYSlkMUA","5VZjSFVMxo","yToGWv2eC3","oVQp62DREs","FjHXRGWqqX","Yw2oUEoToP","7hyVv5VZjS",
+"xReechSSvQ","RzaZAs7Mxk","DG4sTk85Ae","euZA5jfREu","VLTy6soy9t","brhlQVjCZq","a00b5AIYUu","5Drn0Twano","FjHXRv2eC3","hSSvQQClRL",
+"xciqp7fsYM","suY4xru4UG","9y4lwokgRi","rKDLJMmsIo","DQimpmX2GE","KZamHTXQ0Z","yEfy9QChxs","lkMUAbrhlQ","DQimphE1Ql","TCgPpo8Uyd",
+"EOE1oIjTwP","VNCPd2hEEU","v1Hlnl83Ud","UlU3MyluBx","0KyfsFwEJz","CIShG2ZHdk","SWfoulsQGo","QnJ1SFwEJz","YjB9tgjUTu","9GXkXqaofN",
+"9y4lwlj07Q","ciuWzcL0aE","FnPFBzz4ZU","nnP8oAkKTk","ZJTXHFwEJz","BpYhVQssNC","Mm8sicQOnv","rKDLJ7lUXZ","JJs5mblLA9","lXFOBHzZT8",
+"Kr8ysSbRYy","soy9t4dEz6","nnP8ok85Ae","JkzUnS2Dfu","guMb8jiVBP","FwEJzfqypy","BpYhVMezSW","KsjRKx3LDe","tl72WSbRYy","jfREublLA9",
+"1LB1L5ZaEz","GWqqXy94nw","L7cGcdmoS7","gjUTuhYBCK","VjCZq1v5hH","24ARF2DREs","5VZjS1LB1L","EoToPuAWyp","M3zXLjtn0X","hi5X7tl72W",
+"W7cTssx5Gl","nnP8oxciqp","2Yz7EazIWp","G1RhS7hyVv","atef29iGoT","PYBf4azIWp","JkzUnogLgc","WMiS3KsjRK","5iGN5VBjhz","nnP8ohUTw7",
+"guMb8uoStw","pvgjSReKEW","uoStwuJScX","Mkgy8Rxrsm","jtn0Xiqv4k","m4bxUTa8f6","RpBQmAmdQd","Mm8si9y4lw","bZLvS8FmFH","RBhp02Yz7E",
+"jzUqR0Kyfs","8cVD31j5L8","CK5W7o8Uyd","MmsIoguMb8","zbIYY8U2nU","SjskQStlDJ","6AFT09iGoT","VerEAQ6Lix","24ARFNxx9V","RBhp0XflUq",
+"K4GS83weIF","0MR5XQYxC0","1v5hHAOgEe","dQ586QbxXc","BFkb8NOHsz","MezSWJIqXi","hE1QlPYBf4","VNCPds4786","suY4xtjQxs","MezSWTwano",
+"24ARFsuY4x","ZJTXHwDajX","GrDg79rlg9","BbwgAJ2mQi","s47869eoRc","FjHXRG1RhS","Mkgy8ulk41","yofH3GWqqX","ru4UGK4GS8","JKWYRRsQUq",
+"EoToP0Kyfs","gtCA59eoRc","fcJOyvkCHH","SjskQ4dEz6","n1pmOjzUqR","F6PT2zHF1q","gtCA5SjskQ","gtCA59rlg9","fqypywDajX","MaJQsDLhzM",
+"1LB1LJKWYR","lweGy5VZjS","tl72W4dEz6","d85a90ao3l","No0QbMezSW","oQ87rReKEW","Y1mC0DQimp","9GXkXGXdoH","5VZjSjiVBP","O3iyQ7hyVv",
+"FwEJzgIYvE","ix74rogLgc","RkQket59lR","TCgPpQbxXc","MGlTFOUYuF","lpF6WcShY2","e6e4zaez9y","Yw2oUxReec","qaofNEoToP","OUqFMlpF6W",
+"KZamH5IhmG","In3NS0YAGH","QYxC0CNHmv","GXdoHokgRi","tlILtG1RhS","xXTI4dQ586","fLNg8oVQp6","SmGzvlj07Q","d7vjMgtCA5","ThjNnRBhp0",
+"aez9yJ2mQi","VBjhzHRxd8","qQxHP0h1b1","Mm8si1j5L8","lH1ktIBe8k","0h1b1pv0i7","dQ586KZamH","IKxdLLewvM","29QAzpAhR1","VLTy6RzaZA",
+"zQt6QfmIK1","AkKTkAXpwE","MGlTFMm8si","h1zcHPYBf4","Yh1hFEoToP","5VZjSK4GS8","ru4UG0BmCy","4QMc9JkzUn","FLsphaDGtS","NOHszSjskQ",
+"i7WMQW7cTs","VNCPd0YAGH","MaJQsoGu6x","GSQwjSmGzv","brhlQe6e4z","9rlg9lXFOB","xXTI4OUYuF","pvgjSBCxeC","ni2v17fKYU","guMb8brhlQ",
+"EoToP6q6L9","NOHszpvgjS","SbRYyqUJMd","FwEJzfaHir","v1Hln9iGoT","CNHmvnnP8o","Ul4a1LDk6f","ReKEWUmaEv","MK07Ys93Ml","QworuM3zXL",
+"RsQUqdmoS7","Pb1paRsQUq","sx5GluLtKs","zFgtBGXdoH","uLtKslH1kt","ZuDtDKr8ys","nFqikbgJAz","vkCHHJJs5m","yvOMIRkQke","MezSWxciqp",
+"7ku1p0BmCy","xXTI4WaWsv","zmLYDDLhzM","sqVrfbrhlQ","rz7Utru4UG","i7WMQ48cHL","wDajXzQt6Q","5iGN5EdBKc","8TxD7d7vjM","EOE1obZLvS",
+"UmaEvECMvU","Waim6JKWYR","uPX7G2Yz7E","uoStw1j5L8","AmdQdt98iW","VBjhzO3iyQ","lm0pD9rlg9","618Di9XyT9","LbRTHzHF1q","d85a9FGzgp",
+"jeskSDG4sT","IjTwPa00b5","RBhp0WmadA","GWqqXNOHsz","pT8wuZzJHW","Cp3mZlkMUA","qQxHP8U2nU","pWiOsNxx9V","zmLYDFFDui","8TxD7xReec",
+"dQ586FNYIM","fLNg8NcICA","Zv7z0D6rBy","ZJTXHiB08l","HP433nFqik","618Di8cVD3","QYxC0atef2","pmeCdThjNn","POUYSni2v1","4dEz6ksJby",
+"uupzkBFkb8","o8UydAmdQd","DQimpzbIYY","rKDLJThjNn","5VZjShe9IA","lsQGo8FmFH","wDajXvOqCE","F6PT2Yf2Ec","s7MxknnP8o","lm0pDYh1hF",
+"EoToPix74r","CdyBVtl72W","8RCUAdmoS7","5ZaEzNOHsz","FnPFBs93Ml","FcWrWhi5X7","lkMUA24ARF","CqqaDuoStw","lweGycQOnv","1v5hHlViBv",
+"FhtglS2Dfu","JkzUnlCMxy","xXTI4aL6AJ","JXljW1j5L8","hSSvQIBe8k","4W0TlJJs5m","45cIHksJby","7fsYMtAOsr","iqv4kd85a9","dQ5869GXkX",
+"t59lRuoStw","Yf2EczY1GY","P6bcgsx5Gl","ZuDtDfcJOy","ZhwG1ciuWz","ciuWzoQ87r","d85a99rlg9","zmLYDrz7Ut","IjTwPMGlTF","1j5L86q6L9",
+"l83UdMm8si","9iGoT2ZHdk","8cVD329QAz","zQt6Q2TRI7","v2eC3GWqqX","Kr8ysQYxC0","yofH3OHaBz","4W0TlP6bcg","Ul4a1suY4x","DcpWBn8pJ9",
+"fLNg8BbwgA","xciqpRmDcr","SbRYyRzaZA","hUTw7vOqCE","WmadAChuy3","K20wKsqVrf","M6qcGSWfou","DLhzMBpYhV","B3qem5VZjS","EoToP4dEz6",
+"IRh48Zv7z0","6AFT0MGlTF","AgJHQQbxXc","HzZT8OHaBz","AmdQdCK5W7","JXljWiKqhr","Pb1paCNHmv","mX2GEFVMxo","Mkgy8QYxC0","i3pyd8cVD3",
+"580YDTwano","WmadAn1pmO","uPX7GuQIcz","RzaZAD6rBy","cShY2oGu6x","DQimp7fKYU","jzUqRTXQ0Z","gdQsS8hJdt","Nxx9V64s8N","lH1ktEoToP",
+"RsQUqAkKTk","sqVrfCfgr3","RmDcrvkCHH","pmeCdguMb8","K20wKQbxXc","2Yz7EdhSuH","QworuydG8U","ix74rQssNC","7X3uylm0pD","zmLYD1LB1L",
+"AIYUu5Mg9r","o8Uyd7fKYU","0PktI5nmWv","RsQUqe6e4z","5nmWvvLsmS","DQimphUTw7","StlDJPYBf4","xXTI4MGlTF","fcJOyHRxd8","yEfy9YOfrY",
+"64s8NaL6AJ","tl72Wo8Uyd","Vprf2Mm8si","fLNg8he9IA","2hEEU9eoRc","C2IrcSbRYy","brhlQulk41","blLA9OUqFM","ix74rW3VFH","IjTwPI7p2a",
+"fFDrJO3iyQ","ydG8Uy94nw","2hEEUeuZA5","pAhR1tAOsr","iKqhryEfy9","7fsYMZJTXH","5Mg9rhe9IA","t59lRaez9y","v2eC3v2eC3","Vprf2djsrv",
+"pmeCduoStw","SWfouHfyNQ","0YAGHFPfSE","jiVBPgdQsS","HzZT8lj07Q","tAOsrJkzUn","s93MluN6r3","atef2v8yFN","5Drn0prNT6","ZJTXHmz8gx",
+"8cVD3KASQ8","5iGN59GXkX","WaWsvkZANm","yToGWQnJ1S","JJs5mNxx9V","FFDuiQWxoT","5VZjSqaofN","5Mg9rDG4sT","ECMvU0Wr5y","YjB9t7X3uy",
+"TXQ0ZSbRYy","xciqplweGy","Waim6dhSuH","fLNg8GXdoH","In3NS2Nslm","IRh48xReec","JRJQBVLTy6","lXFOBVjCZq","MmKGJdpe1v","JRJQBFVMxo",
+"JRJQBmz8gx","K20wKFnPFB","v8yFNOHaBz","K4GS8WPmlx","3weIFoGu6x","YOfrYfFDrJ","Uvlv4sx5Gl","SjskQMmsIo","TXQ0ZNOHsz","AOgEerz7Ut",
+"hYBCKbgJAz","zHF1qyToGW","uupzkpT8wu","gtCA5hUTw7","8hJdtnlaBy","hUTw7pvgjS","XyPZNCIShG","QChxssuY4x","Pb1pavkCHH","FPfSEQworu",
+"rz7UtVBjhz","djsrvFxX9q","cQOnvP6bcg","FPfSE0ao3l","0PktIe6e4z","NhXdu9GXkX","lkMUAqUJMd","ZUnqtyluBx","tlILtciuWz","BFkb8faHir",
+"RxrsmiB08l","pv0i70BmCy","Q6LixVLTy6","7hyVvBGaQY","5nmWv618Di","29QAzb29RJ","dhSuHvOqCE","J2mQiGv3Fq","VjCZqlCMxy","Oz8yZSs0Zu",
+"rKDLJgdQsS","J2mQifmIK1","h1zcHMaJQs","he9IANcICA","tlILtcQOnv","5IhmGRmDcr","zbIYYWmadA","S77LHZuDtD","OHaBzIjTwP","s7MxkKr8ys",
+"fLNg8qaofN","tl72WfLNg8","RsQUqokgRi","CK5W7HfyNQ","GSQwjOz8yZ","QYxC02TRI7","2TRI7IKxdL","Mkgy8rKDLJ","BpYhVQClRL","jtn0XHzZT8",
+"HfyNQuZPqg","hUTw7kZANm","ZhwG1n8pJ9","zmLYDFVMxo","zQt6QyvOMI","UlU3MvkCHH","QnJ1StAOsr","16lHcQ6Lix","uZPqgTa8f6","fmIK1Cp3mZ",
+"tl72W07n1c","WaWsvDLhzM","16lHce6e4z","VLTy6hSSvQ","RkQkeFcWrW","Mkgy8JKWYR","ix74r0PktI","b29RJlViBv","8RCUAZzJHW","JKWYRsx5Gl",
+"t98iWQworu","YjB9ts4786","2Yz7E7hyVv","W7cTsvkCHH","3weIFStlDJ","uoStwReKEW","HzZT8cL0aE","l83UdprNT6","pT8wutuDyS","fFDrJAmdQd",
+"ni2v1s4786","jfREuv2eC3","8U2nUYjB9t","i7WMQJIqXi","ZuDtDh1zcH","taOXKh1zcH","MGlTFDcpWB","t98iWgtCA5","5IhmGcL0aE","FnPFB16lHc",
+"JJs5mNhXdu","YjB9t7fsYM","okgRisoy9t","AmdQduZPqg","5ZaEzgjUTu","yluBxIRh48","vkCHHjS1aj","Q6LixBFkb8","FwEJzThjNn","VBjhzFGzgp",
+"vLsmSKr8ys","KASQ8RzaZA","VLTy69iGoT","I7p2aiB08l","oQ87r9eoRc","JRJQBtl72W","s93Mli7WMQ","QClRLpmeCd","24ARFv1Hln","ksJbytAOsr",
+"gtCA5S2Dfu","Ul4a1cL0aE","FVMxoVprf2","45cIHGXdoH","zY1GYSWfou","WMiS316lHc","tuDySeuZA5","Vprf2YOfrY","MaJQs14FLR","x3LDeRpBQm",
+"RACujNhXdu","lkMUAB3qem","EoToPOUYuF","2DREsrKDLJ","OUYuF2DREs","l83UduJScX","dpe1vDz1R3","S2DfuTwano","pv0i7iKqhr","AkKTkYOfrY",
+"pmeCdzmLYD","1LB1LQWxoT","DG4sTFnPFB","QYxC09GXkX","Ss0ZuMaJQs","5IhmGTa8f6","5nmWvAIYUu","MGlTFQChxs","hYBCKyvOMI","n1pmOWaim6",
+"3otm6aDGtS","DLhzMfqypy","WreyPvLsmS","MezSWYh1hF","MK07YtjQxs","BpYhVGXdoH","Waim6k85Ae","RsQUqyvOMI","JIqXijS1aj","cL0aEprNT6",
+"MGlTFazIWp","K20wKRBhp0","gdQsSBCxeC","lsQGoxciqp","xXTI4BbwgA","BbwgApiJSk","5nmWvVIlwP","wiHrZS77LH","RpBQmcQOnv","580YDciuWz",
+"kB5nPTa8f6","S77LHG1RhS","gtCA56AFT0","WaWsvKZamH","uTacxDz1R3","Yf2Ectl72W","24ARFJXljW","MezSW14FLR","FLsphWmadA","pT8wuFGzgp",
+"pT8wuJkzUn","BpYhVyEfy9","Mkgy8fcwDa","prNT6UmaEv","GSQwj45cIH","zQt6Q8TxD7","d7vjM2hEEU","VNCPd5Drn0","LDk6fNxx9V","cmXIXOUqFM",
+"lj07QThjNn","yluBxlweGy","MGlTFNOHsz","45cIHQbxXc","hE1Ql1j5L8","0h1b1hYBCK","S77LHYf2Ec","gdQsSO3iyQ","Q6hMC14FLR","FLsphWaWsv",
+"tuDySEoToP","ECMvUKASQ8","5IhmGSjskQ","DG4sT24ARF","y94nwCp3mZ","Ss0ZuHlUbF","5Mg9rhE1Ql","5Drn0D6rBy","QYxC05Namm","CqqaDdpe1v",
+"uAWypcmXIX","0PktIS2Dfu","aez9yHRxd8","HzZT8ksJby","Q6LixfFDrJ","faHirFhtgl","FjHXRWaWsv","No0QbprNT6","IjTwPru4UG","k85AeQbxXc",
+"RzaZA5ZaEz","KsjRKJRJQB","rz7UtThjNn","2hEEUuQIcz","5NammFxX9q","bZLvSRpBQm","ogLgcQworu","FLsphMmKGJ","tlILtn8pJ9","ThjNnfFDrJ",
+"7ku1plpF6W","Rxrsmrz7Ut","HRxd8HRxd8","M3zXLVNCPd","lViBvjfREu","DcpWBStlDJ","D6rByK4GS8","jfREu14FLR","yluBx0Wr5y","FwEJza00b5",
+"jSjS3a00b5","C2IrcrKDLJ","jiVBPjS1aj","Ta8f62hEEU","QWxoTaez9y","WPmlx5ZaEz","jzUqRYw2oU","qaofNblLA9","ZzJHW8FmFH","7fKYUWaWsv",
+"KZamHFPfSE","uJScXL7cGc","vkCHHNOHsz","9eoRcJ2mQi","StlDJ1v5hH","ThjNnlpF6W","guMb8L7cGc","jzUqRzbIYY","tjQxsh1zcH","ZJTXHn8pJ9",
+"OxWIHcShY2","MmKGJU3yw5","CIShG29QAz","gf8rIogLgc","8TxD7zmLYD","ix74raez9y","taOXKs93Ml","QChxsS2Dfu","oGu6xnlaBy","WDVWJjeskS",
+"ciuWz2Nslm","d7vjMHfyNQ","0h1b1vkCHH","cShY2HRxd8","Vprf2lCMxy","FGzgpKASQ8","Z4I1vn8pJ9","sqVrfoQ87r","NAFuwRBhp0","xciqpVerEA",
+"fqypy5drc6","IBe8kjSjS3","Cfgr3gIYvE","tjQxsHRxd8","suY4x4QMc9","4QMc9KASQ8","Yf2EcoVQp6","CK5W7ZuDtD","1v5hH8TxD7","0h1b1IKxdL",
+"BGaQYdjsrv","lj07QAXpwE","s4786OHaBz","hi5X7iwzGk","euZA5fcJOy","Z4I1vk85Ae","7hyVvrz7Ut","45cIHBCxeC","FxX9q9XyT9","7fKYUThjNn",
+"X6Pingf8rI","45cIHZJTXH","5VZjSogLgc","Ss0ZufmIK1","6AFT0QnJ1S","1j5L8DQimp","S77LHaFFss","s93Ml7ku1p","HlUbFFjHXR","HfyNQQClRL",
+"cShY2WaWsv","aFFsscShY2","5NammQClRL","MK07Y14FLR","CNHmvhi5X7","55rfBru4UG","K20wKMK07Y","FwEJzb29RJ","LbRTHdmoS7","HP433fqypy",
+"oVQp6iKqhr","VIlwPuTacx","S2DfufaHir","0Wr5yZuDtD","5ZaEzaez9y","WPmlxzmLYD","VNCPdC2Irc","tlILtaez9y","zbIYYzFgtB","55rfBCqqaD",
+"s4786uupzk","1LB1LuTacx","9XyT95ZaEz","zqH0W580YD","NcICAHzZT8","ZJTXHQnJ1S","Cfgr3FxX9q","K4GS8SmGzv","lCMxyPYBf4","580YDWDVWJ",
+"8xEKz8RCUA","RsQUqAXpwE","ZUnqtS77LH","zz4ZU0MR5X","vLsmSM6qcG","WPmlxnnP8o","Ss0Zujtn0X","fcJOyS77LH","2TRI7RpBQm","SjskQiKqhr",
+"0YAGHMmsIo","okgRiVIlwP","3otm6d7vjM","tjQxsPOUYS","ix74riKqhr","ZUnqtECMvU","5ZaEzHzZT8","45cIHZhwG1","FLsphcL0aE","tuDySDQimp",
+"BCxeCguMb8","fqypyaez9y","iKqhrsuY4x","VerEAZJTXH","IjTwP1j5L8","uLtKsy94nw","JJs5mi3pyd","X6PinmX2GE","HlUbFe6e4z","lkMUA7fsYM",
+"yToGWxReec","IKxdLxReec","ru4UG7X3uy","MezSWfcJOy","Q6hMClH1kt","iqv4kKASQ8","yEfy90BmCy","fcJOyokgRi","XyPZNI7p2a","Kr8ysuZPqg",
+"8xEKzjzUqR","uvf7ARkQke","wiHrZAOgEe","cL0aEWaWsv","M6qcGprNT6","rKDLJksJby","WPmlxXflUq","k85AefcwDa","bgJAzzz4ZU","Q6hMCRACuj",
+"aDGtSBCxeC","s7MxkjSjS3","cmXIXMm8si","BbwgAnlaBy","8hJdtUl4a1","4QMc9WPmlx","jiVBPm4bxU","SWfouoGu6x","AXpwE5VZjS","L7cGcCK5W7",
+"55rfBSmGzv","atef2kZANm","vOqCEGrDg7","4W0TlQbxXc","ogLgcgtCA5","1v5hHhSSvQ","24ARFaFFss","ThjNnjiVBP","hYBCKlweGy","Waim6ulk41",
+"jfREu2Nslm","BGaQYhUTw7","lkMUAOUqFM","FxX9qsqVrf","sqVrfDLhzM","GWqqXlpF6W","5ZaEz5drc6","W3VFHGrDg7","7ku1pvkCHH","ru4UGyluBx",
+"mX2GEBpYhV","tl72WsqVrf","h1zcHfcwDa","0YAGHk85Ae","v2eC3uQIcz","Vprf2HRxd8","lViBvvkCHH","AIYUuFPfSE","taOXKQWxoT","v8yFNCK5W7",
+"Cp3mZ64s8N","nnP8o5nmWv","HP433fcwDa","fcJOyBGaQY","JIqXiFhtgl","gtCA52DREs","fLNg8jeskS","hi5X7RpBQm","64s8NZhwG1","FFDuilsQGo",
+"ksJbya00b5","MaJQs2Nslm","ydG8UQClRL","lm0pDMK07Y","iKqhrhe9IA","5VZjS0MR5X","fFDrJ3otm6","FFDuiMGlTF","CdyBVUmaEv","iKqhrQYxC0",
+"uLtKssuY4x","v1Hln3otm6","fmIK1Rxrsm","UmaEvni2v1","FjHXRIjTwP","48cHL0Wr5y","O3iyQK20wK","RzaZA8FmFH","DLhzMlj07Q","Z4I1vTa8f6",
+"ksJbyulk41","2Yz7EfLNg8","i3pydJ2mQi","L7cGcTwano","0MR5XtjQxs","CxVEf9XyT9","7Ow5C0PktI","FLsphIRh48","nnP8oZuDtD","1j5L8t59lR",
+"7ku1pgtCA5","Nxx9Vl83Ud","KZamHQ6hMC","8U2nULewvM","h1zcHuTacx","EdBKc7fKYU","FVMxoJKWYR","pT8wu14FLR","B3qemRzaZA","J2mQiv8yFN",
+"Zv7z0W3VFH","07n1cs4786","YjB9tdjsrv","KsjRKJIqXi","pAhR1yToGW","k85AepAhR1","Nxx9V7fsYM","jzUqRWPmlx","azIWpb29RJ","uZPqgt98iW",
+"0MR5XZ4I1v","RxrsmRBhp0","618DicL0aE","dmoS7cShY2","dmoS7zz4ZU","Q6hMC9XyT9","lsQGoC2Irc","vkCHHJKWYR","QbxXczbIYY","yofH3lkMUA",
+"uupzkD6rBy","pFrrlAkKTk","xciqpQWxoT","0PktIWreyP","2hEEUSWfou","2hEEUSjskQ","MojnP0YAGH","wiHrZ3weIF","MojnPFxX9q","djsrv7ku1p",
+"uLtKspAhR1","nFqikAIYUu","ZuDtDtjQxs","guMb8tjQxs","t59lRbrhlQ","ulk41O3iyQ","v1HlnuZPqg","ZzJHWB3qem","UmaEvZJTXH","zz4ZUUl4a1",
+"taOXKW7cTs","nFqikL7cGc","ZuDtDzqH0W","aez9yoGu6x","nFqikhUTw7","Vprf2zHF1q","CIShGsx5Gl","mX2GEQ6hMC","WPmlxYf2Ec","AOgEesuY4x",
+"S2Dfu6AFT0","Q6hMC8cVD3","l83UdOxWIH","fqypyGWqqX","GWqqXZzJHW","UlU3MDLhzM","55rfBAkKTk","5drc67X3uy","Yh1hFzFgtB","0PktIdpe1v",
+"cQOnv1v5hH","AIYUu3weIF","GWqqXW7cTs","Ul4a1uTacx","dpe1vYOfrY","VLTy6ZUnqt","Waim6x3LDe","0PktIVjCZq","DQimpYh1hF","29QAza00b5",
+"IBe8k2Yz7E","618DiuoStw","uupzkNo0Qb","8TxD7JXljW","5iGN5hi5X7","EdBKc16lHc","W3VFHMaJQs","2Yz7Eb29RJ","S2DfuzQt6Q","DLhzMwiHrZ",
+"Ss0ZuQChxs","EOE1ooQ87r","zFgtBhUTw7","55rfBUl4a1","WMiS36q6L9","UlU3MnnP8o","07n1cguMb8","jiVBPuJScX","OUYuFYw2oU","lsQGo8hJdt",
+"a00b5uN6r3","NhXdu8TxD7","azIWpRzaZA","fLNg80MR5X","Mkgy8Ta8f6","lpF6WaFFss","QWxoTlViBv","oVQp6WmadA","5iGN5prNT6","fcJOySbRYy",
+"8FmFHHzZT8","Pb1paFFDui","Waim6QChxs","Q6hMCwDajX","iKqhrCNHmv","LewvMTa8f6","WaWsv0ao3l","OUqFMAmdQd","pT8wuVerEA","tjQxse6e4z",
+"5Mg9rZv7z0","cmXIXs4786","ECMvU9rlg9","Yw2oUMaJQs","x3LDeiB08l","Mkgy8dhSuH","ix74rM3zXL","1j5L8WPmlx","sx5GlcQOnv","8U2nUCp3mZ",
+"WDVWJOHaBz","nnP8oVLTy6","jtn0XW7cTs","rhl0JlXFOB","TCgPpTa8f6","fFDrJtl72W","soy9t9GXkX","ECMvUS2Dfu","NAFuwd7vjM","BGaQYCNHmv",
+"n8pJ9Yw2oU","WaWsvzz4ZU","iKqhrjS1aj","lCMxyVBjhz","qaofNyluBx","hSSvQzz4ZU","3weIFguMb8","zqH0W7Ow5C","9eoRcix74r","pAhR1AmdQd",
+"DcpWBni2v1","6q6L9ZUnqt","cShY2CK5W7","AIYUuiqv4k","uoStwuPX7G","m4bxUpmeCd","PYBf4nlaBy","bgJAzEoToP","RmDcrtAOsr","pv0i75iGN5",
+"ni2v1tl72W","okgRiFNYIM","BFkb8CIShG","580YDaL6AJ","yToGW1LB1L","gjUTuVIlwP","fLNg8pAhR1","zFgtBfmIK1","FxX9qlH1kt","Ta8f6zHF1q",
+"wDajXcShY2","x3LDetl72W","MaJQsRACuj","ydG8UZzJHW","F6PT2JKWYR","WDVWJAOgEe","LewvMpvgjS","oQ87rv8yFN","OUqFMgjUTu","lj07Qdjsrv",
+"jS1ajy94nw","AgJHQOz8yZ","piJSk9GXkX","8xEKzfqypy","Qworulj07Q","4W0TldhSuH","VNCPd1LB1L","IRh48O3iyQ","JKWYRIjTwP","B3qemgf8rI",
+"7ku1phSSvQ","zHF1qlCMxy","FcWrWWaWsv","FnPFBv8yFN","Qworuiqv4k","VjCZqHlUbF","Oz8yZuoStw","yluBx1j5L8","lm0pDjfREu","In3NSWPmlx",
+"YjB9t6q6L9","DLhzMYjB9t","zY1GYPYBf4","0YAGHHlUbF","TXQ0ZgdQsS","C2Irc5ZaEz","m4bxUaez9y","FhtglAIYUu","5iGN5hYBCK","X6PinfFDrJ",
+"pv0i71v5hH","0YAGHFNYIM","Q6Lixsx5Gl","GWqqX2hEEU","dmoS7VBjhz","YOfrY2DREs","m4bxUReKEW","S77LHAgJHQ","RACuj2hEEU","WmadAWaim6",
+"dhSuHMGlTF","fmIK11v5hH","s4786Dz1R3","MmsIoRpBQm","618DiMkgy8","5iGN5n8pJ9","euZA5MaJQs","VIlwPUlU3M","2DREsFPfSE","BGaQYKr8ys",
+"O3iyQRBhp0","ksJbylj07Q","07n1cI7p2a","AkKTkGrDg7","pmeCdjfREu","0PktII7p2a","IjTwPFjHXR","aL6AJJXljW","HfyNQZuDtD","kB5nPVIlwP",
+"qaofNQ6Lix","0MR5XNo0Qb","45cIH0h1b1","IKxdLpT8wu","0YAGHAOgEe","vOqCE0PktI","RmDcryToGW","prNT6Chuy3","n1pmO5Drn0","gtCA5G1RhS",
+"yToGWYjB9t","5IhmGazIWp","pT8wubgJAz","EoToPIKxdL","Cp3mZRzaZA","jSjS3HRxd8","n8pJ9M6qcG","OHaBzP6bcg","kZANmEOE1o","2Yz7EMmsIo",
+"fmIK1t59lR","t98iW8TxD7","lj07QDG4sT","piJSkvLsmS","n8pJ9jzUqR","5IhmGYjB9t","7hyVv5Mg9r","9eoRc3weIF","M6qcGQClRL","ix74rUl4a1",
+"uTacxjSjS3","CxVEf14FLR","8xEKzuoStw","v8yFNuAWyp","fmIK114FLR","ZhwG1euZA5","AOgEeaDGtS","atef20PktI","K20wKhE1Ql","C2IrcBbwgA",
+"AIYUuuZPqg","Nxx9VZJTXH","JKWYRni2v1","P6bcgZJTXH","rKDLJB3qem","In3NSxXTI4","L7cGcMGlTF","K4GS8dhSuH","Mm8si7lUXZ","Yw2oUOHaBz",
+"atef2lkMUA","618Di1v5hH","lpF6WrKDLJ","yEfy9zQt6Q","xReecFcWrW","s93MlECMvU","oGu6xpvgjS","618DidhSuH","Y1mC0pFrrl","5iGN5POUYS",
+"VjCZqP6bcg","OxWIHMGlTF","b29RJfcJOy","MezSW8xEKz","jfREuhi5X7","s93MlK20wK","Nxx9VFVMxo","jtn0X7X3uy","prNT6mX2GE","BCxeC8xEKz",
+"Zv7z016lHc","suY4xv2eC3","FNYIM7X3uy","FnPFBiKqhr","brhlQSWfou","kZANmYf2Ec","5drc6aFFss","0PktIgjUTu","9GXkXtvdkD","gtCA5gdQsS",
+"nlaByOUYuF","gtCA5M6qcG","FPfSEWaim6","e6e4zn8pJ9","7fsYMIRh48","jzUqRiqv4k","pWiOsZhwG1","IRh48AmdQd","2ZHdkBFkb8","48cHLsuY4x",
+"2hEEUfcwDa","1LB1LCfgr3","TwanonnP8o","Gv3FqlsQGo","BpYhVHP433","VLTy6iqv4k","a00b555rfB","580YDAOgEe","0YAGHYf2Ec","RpBQmIjTwP",
+"fqypylXFOB","piJSkCIShG","WaWsvAIYUu","9XyT9fLNg8","5NammWaWsv","8xEKzv8yFN","SWfoudjsrv","Yw2oUDcpWB","ix74rHRxd8","8TxD7In3NS",
+"Vprf2l83Ud","S77LHgIYvE","4dEz6Qworu","xXTI4X6Pin","zHF1qAkKTk","IBe8kWreyP","9eoRcDQimp","P6bcglXFOB","Pb1paYOfrY","t59lRSjskQ",
+"ZhwG1VNCPd","S2DfuJkzUn","KASQ8oQ87r","AkKTkS77LH","JRJQBzbIYY","y94nwi7WMQ","FhtglVerEA","07n1cYjB9t","KZamHnFqik","7lUXZBGaQY",
+"piJSkkB5nP","KsjRKlViBv","8xEKzAkKTk","2DREsdmoS7","VBjhz0PktI","8xEKzEOE1o","MezSWJJs5m","FxX9q0ao3l","xXTI4jiVBP","iqv4klm0pD",
+"AXpwENxx9V","StlDJKASQ8","lXFOBlpF6W","B3qem55rfB","9XyT97Ow5C","5NammyToGW","cL0aElpF6W","Pb1pa64s8N","aDGtSeuZA5","D6rBydmoS7",
+"FVMxodQ586","uQIcz618Di","okgRiJXljW","ZuDtDeuZA5","EoToPAIYUu","euZA5jSjS3","D6rBys7Mxk","HlUbFNOHsz","pmeCdTa8f6","uQIczRsQUq",
+"RpBQmzz4ZU","16lHcMaJQs","55rfBiwzGk","D6rByECMvU","uTacxeuZA5","OUYuFJRJQB","hYBCKK4GS8","NcICA2hEEU","YOfrYjeskS","qUJMduZPqg",
+"aez9yuTacx","Ul4a1ZJTXH","aFFsstvdkD","2ZHdk8hJdt","XyPZNm4bxU","guMb8SWfou","brhlQCdyBV","kZANmmz8gx","hUTw7I7p2a","gdQsSfaHir",
+"uZPqgK20wK","VIlwPIjTwP","tvdkD5Namm","pmeCd07n1c","uJScXRxrsm","t98iWXyPZN","uTacxv1Hln","blLA9ydG8U","4dEz6soy9t","7fKYUk85Ae",
+"XflUqk85Ae","a00b5vLsmS","MojnPVNCPd","Yw2oUzHF1q","9eoRc7X3uy","h1zcH5iGN5","YOfrYuZPqg","xReecNcICA","zmLYD4dEz6","azIWpBpYhV",
+"Gv3FqCxVEf","d7vjM4W0Tl","VerEAOUqFM","faHirQYxC0","t59lRRzaZA","mz8gxNAFuw","jSjS3Oz8yZ","KZamHKASQ8","atef2DLhzM","BCxeCdjsrv",
+"64s8NHlUbF","9XyT9bZLvS","HlUbF4dEz6","nnP8o9y4lw","jSjS3azIWp","AOgEeIn3NS","ni2v1Cfgr3","kB5nPRxrsm","k85AeOz8yZ","ksJbyhE1Ql",
+"iqv4k4dEz6","y94nwhSSvQ","EOE1oSjskQ","RpBQmL7cGc","M3zXLaDGtS","W3VFHrz7Ut","MojnPFVMxo","Q6LixIBe8k","suY4xBFkb8","TCgPpRxrsm",
+"gf8rICp3mZ","AOgEe0ao3l","brhlQJJs5m","Zv7z08U2nU","a00b55ZaEz","dQ586TCgPp","2Yz7ElpF6W","SmGzvmz8gx","tl72WkB5nP","8TxD7AIYUu",
+"jfREuF6PT2","6AFT0he9IA","7X3uyUlU3M","nlaByn1pmO","MGlTFOxWIH","uLtKsjeskS","iB08loQ87r","iqv4kFxX9q","uQIczRxrsm","mz8gxzqH0W",
+"JIqXiiwzGk","1LB1LIn3NS","64s8NhUTw7","XyPZNpvgjS","KZamHyluBx","v8yFNCIShG","lweGyNAFuw","MmKGJAkKTk","euZA50MR5X","580YDQYxC0",
+"8FmFHnlaBy","lCMxy8hJdt","StlDJUl4a1","OUqFMBCxeC","SbRYyhE1Ql","uN6r3lkMUA","aL6AJBCxeC","JRJQBRmDcr","6AFT0ECMvU","SbRYyt59lR",
+"AIYUusoy9t","RzaZAaez9y","ksJby618Di","8TxD7K20wK","uQIczFnPFB","LewvMECMvU","uLtKsi3pyd","cShY2tl72W","FNYIM5IhmG","VLTy6rz7Ut",
+"SjskQWaim6","FnPFBpiJSk","FhtglGrDg7","zz4ZU8U2nU","HP433faHir","zqH0WRpBQm","oQ87rFxX9q","HRxd8brhlQ","wiHrZnnP8o","d7vjMMojnP",
+"CdyBV4QMc9","No0Qb1LB1L","okgRiFwEJz","0Wr5yKASQ8","NcICAJJs5m","jzUqRSWfou","uAWypzz4ZU","FnPFBfcJOy","yToGWhSSvQ","WreyPt98iW",
+"HfyNQOz8yZ","zY1GYDcpWB","jzUqREoToP","h1zcHrz7Ut","yToGWxciqp","yToGW2hEEU","WmadAW3VFH","i3pydzHF1q","SjskQDz1R3","No0Qb0Wr5y",
+"QnJ1SDcpWB","jS1ajhE1Ql","2Nslmh1zcH","tl72W9rlg9","8U2nUlsQGo","1v5hHQnJ1S","4W0TlDcpWB","vOqCEIRh48","Mm8siZv7z0","zY1GYtjQxs",
+"lm0pDCqqaD","yEfy9QWxoT","bZLvSx3LDe","iqv4krz7Ut","QChxsdhSuH","FPfSEs7Mxk","lXFOBjS1aj","hi5X7kZANm","ZUnqtZv7z0","tAOsr5Mg9r",
+"LewvMGSQwj","v8yFNM6qcG","s93Mlv1Hln","Ta8f6zQt6Q","SjskQzqH0W","9eoRcStlDJ","Uvlv47hyVv","OxWIH8xEKz","CqqaDVerEA","Waim69GXkX",
+"fqypyni2v1","DG4sTlsQGo","7X3uyYf2Ec","8U2nUCIShG","pT8wuAIYUu","Nxx9VuQIcz","EOE1oaFFss","qQxHPDQimp","M3zXL5iGN5","MojnPRACuj",
+"tjQxshi5X7","BFkb8iB08l","Pb1pa5drc6","EOE1oyofH3","NhXdusoy9t","G1RhS0MR5X","aL6AJECMvU","GSQwj8xEKz","t98iW1v5hH","d7vjMtvdkD",
+"8RCUAZhwG1","qQxHPJ2mQi","580YDGv3Fq","CdyBVLbRTH","RsQUq8RCUA","gIYvEQbxXc","Chuy3vkCHH","NhXduPb1pa","16lHcuTacx","yEfy9Vprf2",
+"vLsmSjfREu","VLTy6tlILt","YjB9tMmKGJ","RpBQmjeskS","gtCA5ZuDtD","lm0pDk85Ae","SjskQFNYIM","IKxdLn8pJ9","0YAGHZhwG1","FxX9q7ku1p",
+"pmeCdoVQp6","14FLRxciqp","Y1mC0OUYuF","5nmWvzY1GY","0h1b1v1Hln","Rxrsmulk41","nnP8oNhXdu","yofH3jS1aj","FjHXRx3LDe","rz7UtU3yw5",
+"3weIFgdQsS","zY1GYcL0aE","mX2GEtvdkD","jeskSP6bcg","YOfrYLbRTH","uupzkzFgtB","7Ow5CHRxd8","XflUqpWiOs","jfREuS2Dfu","OHaBzs4786",
+"aDGtSfcJOy","rKDLJ5nmWv","yvOMIfaHir","tAOsrDQimp","brhlQKr8ys","D6rByRxrsm","uvf7AbgJAz","s7Mxklm0pD","AOgEeTXQ0Z","aL6AJuPX7G",
+"hYBCKHRxd8","tlILtzqH0W","uJScXzFgtB","ydG8U7ku1p","lH1ktJkzUn","WMiS3M3zXL","v1HlnzHF1q","ThjNnrhl0J","AOgEeL7cGc","8RCUAdjsrv",
+"FNYIMGv3Fq","zHF1qlweGy","FnPFBAgJHQ","2hEEUsoy9t","JRJQBa00b5","d7vjMRmDcr","pT8wuxReec","uvf7ARzaZA","Yf2Ecxciqp","48cHL9y4lw",
+"uQIczVprf2","HP433BCxeC","64s8NBbwgA","CdyBVK20wK","JkzUnF6PT2","cmXIXb29RJ","ZJTXHlkMUA","5nmWvtAOsr","0BmCyM6qcG","K20wKgf8rI",
+"9GXkX0Wr5y","Kr8ysFNYIM","qUJMdP6bcg","MGlTFIjTwP","xReec5drc6","JkzUnm4bxU","BpYhVK20wK","t59lRCNHmv","fcwDazY1GY","ciuWzEdBKc",
+"55rfBY1mC0","LbRTHx3LDe","HP4338hJdt","yofH3BpYhV","7lUXZ3weIF","gf8rIoVQp6","s93MlS77LH","PYBf4dQ586","VIlwPgdQsS","14FLRMaJQs",
+"MmKGJpAhR1","s4786OUYuF","rz7UtRkQke","iwzGkv2eC3","v1HlnpFrrl","7Ow5C48cHL","JXljWQYxC0","W3VFHciuWz","hSSvQfFDrJ","Twano24ARF",
+"fFDrJQYxC0","uPX7GfLNg8","ru4UGtAOsr","FLsphDcpWB","HRxd8e6e4z","Cp3mZrz7Ut","580YDEOE1o","pmeCdStlDJ","rhl0Jt98iW","hUTw7d7vjM",
+"h1zcH0MR5X","1j5L8VjCZq","7ku1pJ2mQi","v8yFN5nmWv","AmdQdMkgy8","oQ87rHP433","tuDyStvdkD","FPfSEEdBKc","aDGtSjeskS","lCMxyQnJ1S",
+"oGu6xyEfy9","euZA5TXQ0Z","8TxD7POUYS","jtn0XuN6r3","24ARFWaWsv","Dz1R3tvdkD","uZPqgKr8ys","WmadAHzZT8","yEfy9RACuj","WPmlxQWxoT",
+"pAhR1fFDrJ","MmsIoReKEW","8RCUAo8Uyd","pmeCdQ6Lix","KZamH0Wr5y","ZzJHWX6Pin","zFgtB5drc6","uupzk7ku1p","qQxHP7ku1p","hUTw748cHL",
+"Pb1paSs0Zu","lsQGouZPqg","D6rByFnPFB","55rfBaez9y","x3LDeKASQ8","QnJ1SjzUqR","Q6LixfLNg8","SWfoun1pmO","mz8gxwDajX","RpBQmbrhlQ",
+"5drc6fcJOy","QChxsVjCZq","hSSvQ45cIH","OUqFMxReec","jS1ajUl4a1","uAWyp9rlg9","K4GS81v5hH","DLhzMuTacx","0KyfscQOnv","i3pydKr8ys",
+"2hEEUHlUbF","d85a9oGu6x","BCxeCVprf2","vLsmSAOgEe","In3NS7ku1p","24ARFRmDcr","soy9txReec","qQxHPFFDui","qaofNoGu6x","SWfou580YD",
+"pv0i7DG4sT","nlaByix74r","Yw2oUgdQsS","U3yw5AOgEe","sx5GlZzJHW","WMiS3In3NS","Dz1R3G1RhS","d7vjMEOE1o","WPmlxAkKTk","kB5nPYOfrY",
+"2Nslmi7WMQ","ThjNnuupzk","07n1c5IhmG","9y4lwy94nw","RsQUq45cIH","55rfB07n1c","BpYhV4QMc9","IRh48HzZT8","a00b5SbRYy","JKWYRKr8ys",
+"Mm8si0YAGH","RpBQmQssNC","dpe1vGXdoH","v1HlnYh1hF","JRJQBAmdQd","i7WMQY1mC0","qQxHP4W0Tl","pv0i7gf8rI","s93MljSjS3","UmaEvs93Ml",
+"uupzkpFrrl","uLtKsDcpWB","aFFssv2eC3","P6bcgLbRTH","aL6AJiqv4k","WMiS3Q6hMC","n8pJ9QbxXc","BbwgAlj07Q","jS1ajNxx9V","mz8gxG1RhS",
+"jzUqRAkKTk","5VZjSSWfou","b29RJ6q6L9","uAWypHfyNQ","DcpWB16lHc","Pb1paQworu","RpBQm64s8N","FPfSEksJby","VerEAJKWYR","9rlg9n1pmO",
+"BFkb8ZhwG1","LbRTH5drc6","CK5W7pWiOs","v1HlnMaJQs","Gv3FqVLTy6","Q6hMCkB5nP","fLNg8NAFuw","CxVEfGrDg7","d85a9RACuj","DG4sTNhXdu",
+"K4GS8pWiOs","sx5GluoStw","In3NSi7WMQ","aFFssfcJOy","KASQ8suY4x","y94nwFnPFB","AIYUuciuWz","qQxHPPYBf4","8TxD7l83Ud","jS1aj9iGoT",
+"QChxsFxX9q","ZJTXHuLtKs","uvf7A48cHL","5ZaEzZuDtD","580YDs4786","dpe1vEOE1o","tl72WkZANm","oGu6xUl4a1","64s8Nn8pJ9","jiVBPRzaZA",
+"o8Uyd8TxD7","HfyNQv1Hln","8xEKzuLtKs","4W0Tl4W0Tl","cmXIXnnP8o","ksJbyNo0Qb","uoStwBFkb8","Yf2EcOxWIH","MezSWjeskS","bZLvS8hJdt",
+"9GXkXk85Ae","5Drn048cHL","TXQ0ZgtCA5","fcJOy9y4lw","7lUXZD6rBy","yEfy9KsjRK","5nmWvFVMxo","FwEJzK4GS8","DLhzMVNCPd","zmLYDXyPZN",
+"FnPFBkB5nP","pvgjSs7Mxk","Mkgy85ZaEz","dhSuHYOfrY","bZLvStl72W","zQt6Qb29RJ","he9IACfgr3","aDGtSRzaZA","lweGyTwano","aL6AJprNT6",
+"MaJQsFwEJz","W7cTstlILt","mz8gxqaofN","a00b5KZamH","2Yz7EQbxXc","MaJQs6q6L9","CIShGoGu6x","9eoRcQnJ1S","RkQkem4bxU","Uvlv4ni2v1",
+"Gv3FqbgJAz","lH1ktBbwgA","RsQUq7Ow5C","LbRTHwiHrZ","sqVrfJXljW","Ss0ZulkMUA","y94nw2Yz7E","uupzkyToGW","MGlTFUlU3M","Cp3mZkZANm",
+"fLNg8rKDLJ","No0QbM3zXL","kB5nPSbRYy","uJScXFxX9q","L7cGcqaofN","s7MxkprNT6","BpYhV1LB1L","tjQxsRmDcr","9GXkXWMiS3","AXpwE1v5hH",
+"2TRI7uJScX","oQ87rAkKTk","uPX7GDcpWB","CdyBVlpF6W","xciqpP6bcg","8hJdtPYBf4","EoToPHRxd8","1j5L8OxWIH","580YDHfyNQ","K20wKv1Hln",
+"pvgjSRmDcr","0ao3lzz4ZU","DQimpfLNg8","RxrsmpmeCd","yluBxBbwgA","MaJQsW7cTs","uTacxtuDyS","hE1QlDcpWB","iqv4k07n1c","O3iyQydG8U",
+"Cfgr3rz7Ut","HlUbF8cVD3","IKxdLWreyP","618Diulk41","lViBvKsjRK","B3qemRACuj","P6bcgRmDcr","tl72W64s8N","cL0aEBCxeC","zmLYDZhwG1",
+"CqqaDFVMxo","JKWYR7hyVv","0ao3luupzk","xciqpuZPqg","jfREuxXTI4","ksJbysoy9t","Waim6gdQsS","07n1cksJby","9XyT9Pb1pa","VerEA2hEEU",
+"rKDLJIRh48","0Wr5ys7Mxk","9iGoTbrhlQ","0KyfsIn3NS","FnPFBBGaQY","HP433iwzGk","CqqaDBFkb8","IBe8k0MR5X","Nxx9VJJs5m","FFDui9iGoT",
+"7Ow5CdmoS7","BbwgAfcJOy","FGzgpbrhlQ","Y1mC0NhXdu","PYBf4yvOMI","CdyBVlj07Q","xciqp6AFT0","prNT6VLTy6","wDajXtjQxs","GSQwjOxWIH",
+"lpF6WRACuj","3otm6RmDcr","Ta8f6fcJOy","soy9tRmDcr","QssNCY1mC0","FLsphjfREu","0ao3ltaOXK","mz8gxIjTwP","WreyPzY1GY","okgRiC2Irc",
+"aFFss8FmFH","CxVEfWmadA","gjUTu8RCUA","Z4I1vOHaBz","aFFssQnJ1S","NcICARmDcr","K20wKcShY2","uJScXciuWz","s4786lpF6W","BbwgAOz8yZ",
+"azIWpzbIYY","Zv7z0QnJ1S","ulk41pAhR1","uPX7GbrhlQ","ZUnqttuDyS","rKDLJpT8wu","48cHLVprf2","Chuy3mX2GE","6AFT0uLtKs","LewvMIBe8k",
+"9iGoTZuDtD","14FLR16lHc","pT8wut59lR","uJScXgtCA5","RmDcrTwano","gIYvEgtCA5","atef2LDk6f","VBjhzWaWsv","0Wr5yhe9IA","YjB9tgf8rI",
+"aL6AJQClRL","FxX9quoStw","uAWyphE1Ql","ZuDtDgjUTu","ECMvUNAFuw","2NslmUmaEv","0MR5XnFqik","zQt6QlXFOB","ni2v12TRI7","Cfgr3NOHsz",
+"8RCUAh1zcH","07n1c2DREs","gf8rIiwzGk","pFrrlokgRi","Fhtgl9GXkX","AXpwETa8f6","d85a9v1Hln","8cVD35nmWv","SjskQs4786","AmdQdrKDLJ",
+"sx5GlAOgEe","iKqhrdpe1v","uLtKsfcJOy","zz4ZU0PktI","M6qcGnFqik","4dEz6YjB9t","JKWYR580YD","Z4I1vqQxHP","7fKYUPYBf4","NcICAuN6r3",
+"AOgEetjQxs","ksJbyW3VFH","5iGN5BpYhV","l83UdJ2mQi","cmXIXzFgtB","rKDLJSmGzv","JIqXioVQp6","dpe1v8U2nU","Waim6xciqp","Gv3Fqiqv4k",
+"580YDhUTw7","F6PT28hJdt","brhlQDLhzM","5iGN52Yz7E","xReecIKxdL","gIYvEbrhlQ","rKDLJ2hEEU","ksJby5VZjS","WaWsv7fKYU","VBjhzZ4I1v",
+"uupzkv8yFN","Ta8f6suY4x","e6e4ziqv4k","uAWypBbwgA","D6rByM6qcG","WreyPh1zcH","k85Ae5drc6","0MR5X7lUXZ","uPX7GpT8wu","D6rByuQIcz",
+"QChxsMGlTF","lweGyZhwG1","5VZjSpFrrl","LbRTHmz8gx","OUqFMZJTXH","uoStwDQimp","5NammjeskS","tuDySM3zXL","WaWsvatef2","s7Mxkrhl0J",
+"aFFss0PktI","07n1ce6e4z","RpBQmDcpWB","DcpWBlViBv","U3yw59XyT9","oGu6xhE1Ql","aL6AJCIShG","hYBCKKZamH","MaJQstl72W","VNCPduJScX",
+"RBhp08hJdt","MGlTFi3pyd","0MR5XCqqaD","FFDui0MR5X","SmGzvvOqCE","Ul4a1qQxHP","2DREsBbwgA","guMb8WPmlx","FFDuiY1mC0","ix74rGv3Fq",
+"5IhmGCfgr3","atef2brhlQ","8FmFHNxx9V","CdyBVfFDrJ","StlDJOz8yZ","L7cGc2hEEU","prNT6QWxoT","KsjRK5Namm","BGaQY3otm6","taOXK4dEz6",
+"iB08l618Di","QnJ1SlkMUA","RACujfLNg8","QnJ1SnnP8o","2NslmjeskS","G1RhSgIYvE","Oz8yZOUqFM","lkMUAJKWYR","0MR5XHzZT8","tvdkDZ4I1v",
+"4dEz6Nxx9V","VLTy6y94nw","JJs5mpmeCd","55rfB5Mg9r","lH1kthUTw7","29QAzqaofN","bgJAz2TRI7","tuDySPYBf4","Mkgy855rfB","gtCA52ZHdk",
+"0BmCyQworu","he9IAkB5nP","suY4xZzJHW","SbRYy7lUXZ","m4bxUMmsIo","i7WMQtl72W","xciqpTwano","ZUnqt7ku1p","he9IA2ZHdk","xReeclj07Q",
+"fcJOy0YAGH","lj07QtuDyS","M6qcGcL0aE","ECMvU2TRI7","24ARFi7WMQ","wDajXuZPqg","AXpwEQ6Lix","jzUqRWaWsv","ni2v1CK5W7","WPmlx8xEKz",
+"CNHmvM6qcG","lH1ktMaJQs","24ARFjtn0X","ZUnqtCp3mZ","9y4lwIBe8k","wiHrZYf2Ec","vLsmS0Wr5y","3otm6K4GS8","7fsYM8hJdt","bgJAz64s8N",
+"24ARFpvgjS","NOHszAkKTk","1v5hH0MR5X","5VZjSSmGzv","OxWIHqQxHP","7hyVvI7p2a","euZA58cVD3","v1HlnCIShG","MmKGJpvgjS","s4786dpe1v",
+"SmGzv5iGN5","JXljWdQ586","WDVWJs93Ml","jSjS3NhXdu","fcJOy0PktI","yvOMIrz7Ut","K20wK2TRI7","jSjS3618Di","FLsphpAhR1","hi5X7a00b5",
+"U3yw5uupzk","iqv4kgtCA5","DcpWBhYBCK","uvf7AeuZA5","Y1mC0lkMUA","BGaQY8FmFH","0BmCyDG4sT","QWxoTMmKGJ","2NslmJXljW","yToGWsoy9t",
+"FPfSEVIlwP","8U2nUCK5W7","fLNg848cHL","Q6hMChi5X7","9eoRcRmDcr","NAFuwzY1GY","pvgjSUmaEv","gdQsSOUYuF","tjQxsuTacx","3otm6VIlwP",
+"Cp3mZtl72W","ZhwG1RpBQm","0BmCyHlUbF","BpYhVJRJQB","m4bxU16lHc","fLNg82TRI7","JJs5mJIqXi","Y1mC0Qworu","gdQsSo8Uyd","Kr8ysVjCZq",
+"lViBvpvgjS","Zv7z05VZjS","nlaByECMvU","ZuDtD7fKYU","FPfSE5nmWv","1LB1LpFrrl","aDGtSe6e4z","d7vjM8xEKz","JRJQBokgRi","MmKGJBFkb8",
+"yvOMI0PktI","ksJby5Drn0","wiHrZcShY2","LewvMChuy3","wDajXuAWyp","Cp3mZOUYuF","6AFT0k85Ae","mX2GEECMvU","zHF1qOUYuF","EdBKcHzZT8",
+"fmIK1azIWp","dmoS7fqypy","gdQsSt98iW","dQ586AmdQd","0PktIfaHir","gtCA5OxWIH","7hyVvuvf7A","VBjhzlweGy","HP433uvf7A","29QAzMojnP",
+"Yw2oUCqqaD","rKDLJXyPZN","FGzgp9XyT9","WreyPYjB9t","5iGN5mz8gx","In3NSsuY4x","rhl0JF6PT2","n1pmO5IhmG","zz4ZUSs0Zu","tjQxs5nmWv",
+"taOXK9rlg9","IKxdL1j5L8","MojnPECMvU","PYBf4K4GS8","K20wK0BmCy","jSjS3Y1mC0","580YDlm0pD","cmXIX8cVD3","CNHmvaez9y","29QAzyToGW",
+"zHF1qvOqCE","OHaBzyEfy9","Yf2EcFLsph","oQ87r9y4lw","1LB1LqQxHP","wiHrZm4bxU","OxWIHOxWIH","LbRTHVLTy6","hSSvQI7p2a","618DiSs0Zu",
+"oGu6xdjsrv","0BmCyKsjRK","wDajXl83Ud","3weIFfqypy","SbRYy1v5hH","S2Dfud7vjM","gdQsSprNT6","MGlTFB3qem","CIShGkB5nP","lXFOBqaofN",
+"d7vjMYjB9t","2NslmJIqXi","48cHLgf8rI","fcwDaxXTI4","EOE1oQworu","3otm6IKxdL","IKxdLAgJHQ","FxX9qbZLvS","2ZHdk3weIF","fqypyjiVBP",
+"zY1GY5VZjS","ThjNnHP433","uZPqg1LB1L","jtn0XGXdoH","7Ow5CfaHir","BpYhVVLTy6","YjB9tgdQsS","64s8NLDk6f","YjB9tP6bcg","ThjNnRkQke",
+"2Yz7EReKEW","gtCA5fmIK1","UmaEvIBe8k","lj07QBFkb8","MmKGJMojnP","fLNg8LewvM","ix74r3otm6","YOfrYNxx9V","pAhR1vOqCE","RxrsmNcICA",
+"jzUqRVIlwP","0h1b1Z4I1v","gf8rIyvOMI","xciqphYBCK","CdyBVgf8rI","iB08lRxrsm","BbwgAJRJQB","7hyVvIRh48","8U2nUDLhzM","pAhR1AXpwE",
+"29QAzIRh48","2hEEUMmsIo","jSjS3zbIYY","QworuuN6r3","RkQkeCp3mZ","oVQp6HP433","QbxXcuvf7A","B3qem2hEEU","fqypyqQxHP","HRxd80Wr5y",
+"0ao3lcL0aE","atef2C2Irc","fqypyHRxd8","FVMxoQnJ1S","DcpWBnFqik","SbRYyLewvM","ni2v1QYxC0","hUTw7uAWyp","14FLRX6Pin","bZLvSDLhzM",
+"NAFuwTXQ0Z","U3yw5KZamH","FNYIMtlILt","SjskQKZamH","rKDLJt59lR","uTacxtl72W","ni2v1uoStw","ciuWzv2eC3","Q6hMChe9IA","Uvlv4QYxC0",
+"U3yw5uZPqg","QYxC0OxWIH","VIlwPOUqFM","Mm8sinnP8o","DcpWBVIlwP","ni2v1BpYhV","YjB9tNAFuw","rKDLJPOUYS","k85AeW7cTs","Ta8f6JRJQB",
+"vOqCEFcWrW","XyPZNQnJ1S","0Wr5yRACuj","cmXIXFGzgp","lCMxyWmadA","SmGzvksJby","ZUnqtbgJAz","ZuDtD1j5L8","8hJdtFFDui","tl72Wtl72W",
+"rKDLJxReec","9iGoTKsjRK","Gv3FqMm8si","WreyPM3zXL","Zv7z0pT8wu","lXFOByEfy9","BFkb8gjUTu","uJScX0Kyfs","KsjRKtl72W","nFqikEOE1o",
+"8U2nUK4GS8","gIYvEt98iW","hE1QlRxrsm","Uvlv4NcICA","Oz8yZo8Uyd","rz7UtiwzGk","mz8gx5IhmG","s7MxkZJTXH","UmaEvPOUYS","CK5W70Wr5y",
+"FcWrWs4786","7Ow5CAkKTk","cL0aEdQ586","wiHrZ3otm6","J2mQin8pJ9","lm0pDNAFuw","U3yw5WPmlx","4W0TliKqhr","Cp3mZ0Kyfs","ZzJHWulk41",
+"GrDg72hEEU","SbRYyPOUYS","GSQwjlCMxy","FPfSEt98iW","F6PT2No0Qb","G1RhSFVMxo","brhlQtjQxs","wiHrZbgJAz","JKWYRtaOXK","QssNCCIShG",
+"5Drn0aFFss","FxX9qIjTwP","zQt6QK20wK","W3VFHqUJMd","d7vjMTXQ0Z","lsQGoYOfrY","brhlQ5iGN5","aFFsspAhR1","rKDLJl83Ud","5NammCIShG",
+"Vprf2RpBQm","TCgPpZhwG1","TXQ0ZwiHrZ","RpBQm9XyT9","yofH3BFkb8","m4bxUXflUq","WDVWJKASQ8","M6qcGk85Ae","AgJHQ14FLR","5NammNcICA",
+"lm0pDWMiS3","GrDg7Kr8ys","5iGN57X3uy","ZUnqtWDVWJ","RACujeuZA5","CK5W7CdyBV","pvgjS64s8N","IBe8kJRJQB","7fKYUHzZT8","gtCA5iwzGk",
+"GSQwjVerEA","fLNg8dmoS7","0MR5XUlU3M","L7cGcQWxoT","WreyPulk41","gjUTuhE1Ql","jSjS3fcJOy","0ao3l0h1b1","ZuDtDYf2Ec","8TxD7uJScX",
+"Ul4a1Chuy3","WreyPNcICA","BFkb8OHaBz","No0QbNhXdu","P6bcgydG8U","5drc6dhSuH","CK5W7OUqFM","DQimpnFqik","5ZaEzHP433","ZzJHWP6bcg",
+"FhtglZhwG1","FjHXRJRJQB","J2mQihYBCK","ZhwG1NhXdu","4dEz6s93Ml","POUYS5nmWv","b29RJlj07Q","GXdoHCfgr3","pWiOscL0aE","ru4UGrz7Ut",
+"CK5W7RpBQm","24ARFmX2GE","oQ87rAmdQd","fLNg8lsQGo","L7cGcyofH3","azIWpWPmlx","xReecFNYIM","LDk6fWDVWJ","pvgjSCxVEf","tAOsrs4786",
+"gtCA5oGu6x","t98iWJ2mQi","NOHszHRxd8","55rfBuvf7A","MezSWb29RJ","lsQGojeskS","NhXduFwEJz","SmGzvTa8f6","lkMUAqQxHP","ogLgcAXpwE",
+"rKDLJgf8rI","gf8rIdpe1v","cQOnvM3zXL","0MR5XNhXdu","hSSvQ8RCUA","cL0aEqQxHP","Y1mC05Namm","x3LDeru4UG","Z4I1vlj07Q","14FLRQWxoT",
+"FxX9q5drc6","x3LDeuN6r3","Z4I1vKZamH","dhSuHsoy9t","uJScX2TRI7","DLhzMkZANm","IjTwP3weIF","a00b55Drn0","Waim6KASQ8","uN6r3fcJOy",
+"HfyNQlkMUA","VIlwPokgRi","he9IAfcJOy","LDk6f8cVD3","yEfy9aDGtS","jtn0X1j5L8","MK07YIn3NS","lH1ktgtCA5","Ul4a1XflUq","ni2v1WreyP",
+"jiVBP2TRI7","Y1mC0tl72W","GXdoHFFDui","iB08lKr8ys","W3VFH0MR5X","F6PT2zbIYY","zQt6Q7fsYM","fqypyFLsph","XyPZNvkCHH","euZA5QClRL",
+"QWxoTTwano","e6e4zDcpWB","HP433Ss0Zu","CIShGs7Mxk","GWqqXSbRYy","55rfB5VZjS","uAWypFVMxo","vLsmShE1Ql","CK5W75nmWv","jfREuAOgEe",
+"tlILtZJTXH","pAhR1dhSuH","4dEz6DLhzM","L7cGcRACuj","zQt6QG1RhS","i3pydPYBf4","FLsphbZLvS","zFgtBxciqp","jtn0XQWxoT","jzUqRdQ586",
+"7ku1p5Drn0","gf8rIatef2","XyPZN29QAz","FhtglG1RhS","IRh48ZuDtD","FjHXRXyPZN","bZLvSe6e4z","QWxoTFnPFB","kB5nPuQIcz","zY1GYo8Uyd",
+"lkMUAcQOnv","m4bxU4QMc9","uZPqgcmXIX","9iGoT2Yz7E","ZzJHWRkQke","fLNg8EdBKc","ni2v1In3NS","Waim6uPX7G","lweGyjS1aj","7lUXZjtn0X",
+"7X3uyru4UG","djsrvRmDcr","k85AeBpYhV","x3LDeCxVEf","gjUTuJIqXi","JIqXi16lHc","oVQp6StlDJ","pWiOsF6PT2","HRxd8Nxx9V","uTacxSbRYy",
+"prNT6lpF6W","uoStw580YD","LewvMxXTI4","5IhmGfaHir","prNT6RACuj","JRJQBC2Irc","uTacxUmaEv","RBhp0K4GS8","DcpWB2TRI7","nFqikxReec",
+"nnP8oDz1R3","Ss0Zun1pmO","jfREuDz1R3","5IhmGvOqCE","zmLYDRACuj","mX2GE5nmWv","t59lR14FLR","GXdoHNAFuw","tuDyShSSvQ","uQIczFGzgp",
+"9y4lwlpF6W","BCxeCuAWyp","7hyVv2Yz7E","dhSuHuZPqg","RsQUqatef2","RsQUqjtn0X","AOgEehE1Ql","zbIYYfFDrJ","FFDuiXflUq","t59lRYjB9t",
+"RsQUq2Nslm","HfyNQW7cTs","POUYSSs0Zu","uJScXksJby","Gv3FqKr8ys","0BmCyzHF1q","NOHszRxrsm","v8yFNwDajX","Mm8siSs0Zu","AmdQdsoy9t",
+"IjTwPIBe8k","uZPqglXFOB","pT8wukB5nP","cmXIXZuDtD","brhlQNxx9V","vOqCE8FmFH","6AFT0XflUq","5VZjSulk41","lXFOBtjQxs","jiVBPhi5X7",
+"AIYUuUvlv4","BFkb8POUYS","CK5W7oQ87r","MmKGJzHF1q","zbIYYNAFuw","uTacx7X3uy","n1pmOKsjRK","24ARFaDGtS","SjskQhE1Ql","Cp3mZd85a9",
+"K4GS8lm0pD","P6bcgUvlv4","h1zcHiB08l","SmGzv9rlg9","b29RJ7ku1p","b29RJzHF1q","HlUbFF6PT2","t59lRd7vjM","cL0aEjzUqR","k85Ae3weIF",
+"UlU3MAOgEe","F6PT2yluBx","FnPFBprNT6","PYBf4618Di","YjB9taDGtS","TXQ0Z5Namm","dmoS7TXQ0Z","BpYhVBCxeC","5ZaEzdhSuH","fcJOyQssNC",
+"0Wr5yOz8yZ","v2eC3lViBv","e6e4zTXQ0Z","D6rByQChxs","vLsmS8FmFH","Waim6ZzJHW","FxX9qZhwG1","uPX7GWreyP","nlaByyToGW","16lHczqH0W",
+"t59lRjSjS3","In3NStvdkD","MezSWTCgPp","RmDcrLbRTH","4W0TlQ6Lix","Waim6FjHXR","k85AewiHrZ","lweGyJIqXi","tuDySWmadA","hSSvQ0BmCy",
+"bgJAzRsQUq","0ao3lReKEW","7Ow5CReKEW","Zv7z064s8N","Mm8siAmdQd","G1RhSoQ87r","fFDrJdjsrv","S77LHVLTy6","TwanoIn3NS","55rfBXflUq",
+"0KyfsNxx9V","cQOnvAXpwE","zqH0W0BmCy","I7p2aB3qem","uAWypv1Hln","48cHLrz7Ut","ZuDtDuJScX","taOXKVNCPd","3otm6VNCPd","14FLRaez9y",
+"tjQxsGv3Fq","NAFuwgdQsS","kZANmVNCPd","8U2nUIjTwP","7lUXZU3yw5","hYBCK8hJdt","RACujJXljW","FNYIMJKWYR","BCxeCGSQwj","HP433MezSW",
+"14FLRogLgc","YOfrYwDajX","nlaBysqVrf","0BmCyrz7Ut","tuDySWaim6","POUYSiKqhr","14FLRIjTwP","pFrrlY1mC0","Ss0ZuTwano","QChxsdQ586",
+"P6bcgPb1pa","FGzgpuQIcz","CxVEfFcWrW","55rfB5nmWv","Waim63otm6","AgJHQM3zXL","CqqaDHP433","48cHL9rlg9","AgJHQIn3NS","v8yFN1j5L8",
+"QClRLBpYhV","2Yz7EzbIYY","dmoS7zqH0W","fFDrJpWiOs","VBjhzgtCA5","e6e4zv1Hln","hE1QlAOgEe","FcWrWFGzgp","lpF6W9y4lw","uvf7A9XyT9",
+"s7MxkNcICA","Uvlv4Ta8f6","5ZaEzrz7Ut","gf8rImX2GE","yluBx7lUXZ","SWfoujeskS","IjTwP4dEz6","4QMc9pv0i7","kZANmm4bxU","fcJOyZv7z0",
+"pvgjSksJby","s93Ml1LB1L","zY1GYlweGy","G1RhSdQ586","2ZHdklXFOB","29QAzOz8yZ","Ss0ZucmXIX","qUJMdjtn0X","gtCA5StlDJ","yvOMIokgRi",
+"yvOMIa00b5","hE1Ql0Wr5y","prNT6Ss0Zu","C2IrcyluBx","2TRI72hEEU","LDk6ftlILt","RsQUqSWfou","zz4ZU3otm6","FLsphRACuj","CIShG2hEEU",
+"PYBf47hyVv","aFFssOz8yZ","LewvMfqypy","AmdQdSjskQ","6AFT0lViBv","s93MlLbRTH","0BmCyZUnqt","ydG8UQWxoT","uLtKsL7cGc","ReKEWI7p2a",
+"JIqXiRsQUq","suY4xFVMxo","07n1cuAWyp","RzaZAbrhlQ","e6e4zMmKGJ","ru4UGdhSuH","VjCZqi7WMQ","SmGzvokgRi","MK07YuQIcz","AkKTkGv3Fq",
+"pWiOspv0i7","Kr8ysJRJQB","d85a9zQt6Q","i3pyd1v5hH","dmoS7CdyBV","EoToPGrDg7","FNYIMyToGW","MmKGJ9iGoT","FjHXRRpBQm","JRJQBi7WMQ",
+"DLhzM5drc6","QChxsFhtgl","uoStwNOHsz","TXQ0ZiB08l","pvgjSQYxC0","oQ87ratef2","RACujKZamH","2ZHdkVIlwP","blLA9jeskS","7lUXZjfREu",
+"zbIYYcQOnv","qUJMd16lHc","RBhp0SjskQ","0h1b1Yh1hF","Z4I1v1v5hH","1LB1LChuy3","CxVEfG1RhS","rz7Utmz8gx","K20wKxciqp","y94nwyEfy9",
+"tvdkDWMiS3","gdQsSSbRYy","FLsph7Ow5C","ogLgcazIWp","ciuWzKASQ8","7ku1pGSQwj","Oz8yZQWxoT","suY4xZ4I1v","4W0TlxReec","RxrsmBCxeC",
+"9XyT95Namm","I7p2avLsmS","jiVBPDQimp","jfREuIn3NS","2ZHdkIjTwP","aDGtSL7cGc","dmoS72DREs","DG4sT0MR5X","uLtKs9y4lw","jeskSThjNn",
+"6AFT0OUYuF","cQOnvStlDJ","bZLvSChuy3","3otm60Kyfs","8RCUAiKqhr","dmoS7jS1aj","s4786jeskS","MojnPPOUYS","nnP8o29QAz","5iGN5ZUnqt",
+"guMb82ZHdk","suY4xHfyNQ","uQIczTCgPp","MaJQsWDVWJ","64s8NFwEJz","RkQkeWPmlx","h1zcHMm8si","BbwgA1LB1L","AkKTkRBhp0","pAhR1uZPqg",
+"uJScXFPfSE","8TxD7aFFss","Vprf2oQ87r","wDajXFFDui","ThjNnNOHsz","Q6hMCO3iyQ","tuDyS5ZaEz","iKqhrWaim6","XyPZNWDVWJ","mX2GEuoStw",
+"ThjNnyEfy9","Oz8yZJJs5m","euZA5hE1Ql","ogLgcDQimp","taOXKaDGtS","QworuLDk6f","X6Pin0ao3l","Mm8si0PktI","v1HlnS2Dfu","0h1b1RzaZA",
+"uQIczRpBQm","VIlwPzFgtB","uupzkoVQp6","iwzGkP6bcg","W7cTshYBCK","Cfgr3dhSuH","vOqCEfcJOy","yvOMIblLA9","L7cGcix74r","Q6LixHzZT8",
+"tlILtt98iW","Ul4a1StlDJ","taOXKIKxdL","5NammZJTXH","8xEKzZv7z0","Cp3mZPOUYS","IBe8kiqv4k","2ZHdkzz4ZU","AgJHQLDk6f","BFkb8VNCPd",
+"BGaQYNOHsz","RBhp0iB08l","In3NSKASQ8","zmLYDoGu6x","LDk6fuvf7A","aL6AJFFDui","FjHXRhYBCK","9rlg916lHc","yvOMID6rBy","suY4xjzUqR",
+"dpe1vP6bcg","F6PT2HP433","cmXIXlCMxy","9iGoTlweGy","atef2S77LH","lViBvECMvU","PYBf45VZjS","CK5W7mX2GE","VLTy64dEz6","zHF1qguMb8",
+"FNYIMOxWIH","Q6hMChE1Ql","yluBx8cVD3","2NslmfFDrJ","LbRTHGXdoH","hYBCKfqypy","ZuDtDMojnP","qUJMd0PktI","MmKGJ3otm6","0ao3lX6Pin",
+"9y4lwzFgtB","sx5Gl45cIH","xReecW7cTs","d85a9C2Irc","Cfgr3lXFOB","Pb1pajfREu","QnJ1SYjB9t","QYxC0O3iyQ","uQIczuPX7G","hUTw7e6e4z",
+"FwEJzWPmlx","cL0aEHlUbF","4QMc9zY1GY","kZANm7hyVv","MmKGJv8yFN","cL0aEKsjRK","618Diatef2","lm0pDs93Ml","DLhzMBFkb8","mX2GEaFFss",
+"Yf2Ecatef2","1v5hHHlUbF","zFgtB8cVD3","CNHmvwDajX","pFrrltvdkD","LewvMydG8U","ZzJHWYOfrY","pAhR1cShY2","AXpwEl83Ud","0Kyfs64s8N",
+"lj07Q8RCUA","uJScXpT8wu","pWiOsbgJAz","uupzkOxWIH","fqypy0PktI","tvdkD4QMc9","pvgjStAOsr","9iGoTSjskQ","faHirksJby","zQt6QoQ87r",
+"fFDrJni2v1","G1RhSgf8rI","mz8gxnnP8o","Oz8yZCNHmv","zY1GYYw2oU","QChxsCp3mZ","AmdQd7ku1p","tuDySv2eC3","pWiOsDG4sT","zmLYDAmdQd",
+"iB08lUmaEv","HzZT89rlg9","TXQ0Zm4bxU","Q6Lixdpe1v","FNYIMpvgjS","MmKGJxXTI4","oVQp6jfREu","C2Irc0Wr5y","6q6L9Cfgr3","fqypyIn3NS",
+"UlU3MogLgc","MmKGJ64s8N","lkMUAK4GS8","0MR5XMkgy8","HP433Cfgr3","Q6hMCTCgPp","zFgtBW7cTs","kB5nPru4UG","lViBv9GXkX","BGaQYd85a9",
+"yluBxQnJ1S","NOHszPb1pa","d85a9OHaBz","zmLYD2TRI7","8RCUAXyPZN","QChxseuZA5","0PktICNHmv","FwEJzNcICA","l83Ud0BmCy","fcJOyUl4a1",
+"lCMxyprNT6","2ZHdkMGlTF","tAOsr7Ow5C","AOgEeoQ87r","RsQUqQWxoT","GSQwjChuy3","CNHmvVprf2","l83UdK20wK","RzaZAqaofN","QnJ1SS2Dfu",
+"9iGoTjiVBP","iqv4kVIlwP","zFgtBSbRYy","Pb1pahUTw7","G1RhSpAhR1","pT8wuFnPFB","6AFT00ao3l","dpe1v5nmWv","In3NSiKqhr","uPX7GOUYuF",
+"rKDLJwiHrZ","U3yw5K4GS8","8cVD3okgRi","kZANmMGlTF","NcICApvgjS","zQt6QgjUTu","Yw2oUpFrrl","Mkgy8Mkgy8","ni2v1Mm8si","s93MlvLsmS",
+"TwanoQYxC0","LewvMyluBx","64s8NMezSW","QbxXcfcJOy","qaofNdpe1v","Yw2oUuJScX","Uvlv4qaofN","fqypyb29RJ","Ul4a15Drn0","ciuWzx3LDe",
+"ZJTXHIKxdL","DcpWBMmsIo","M6qcGRBhp0","Mkgy8QssNC","RsQUqFhtgl","2Yz7E9XyT9","uLtKsDQimp","Uvlv4lkMUA","NhXduMGlTF","5NammG1RhS",
+"Nxx9VzbIYY","6AFT00YAGH","I7p2ah1zcH","64s8NOHaBz","6q6L99y4lw","a00b54QMc9","vkCHH9XyT9","0BmCyW3VFH","FxX9qrz7Ut","lsQGosuY4x",
+"PYBf4gtCA5","I7p2aLbRTH","7X3uyfmIK1","yEfy92TRI7","QssNCyToGW","v2eC3NAFuw","K20wK9rlg9","4QMc9RBhp0","0YAGHZzJHW","WMiS3ulk41",
+"mX2GEYh1hF","4dEz6POUYS","S2Dfu8cVD3","EOE1oThjNn","7Ow5Cv8yFN","EdBKcQnJ1S","QworuXyPZN","StlDJYf2Ec","ECMvUgtCA5","S2DfuuN6r3",
+"fmIK1FwEJz","vLsmSDQimp","cQOnvRzaZA","lXFOBnnP8o","OUqFMDLhzM","qQxHPv2eC3","jzUqRVjCZq","7fKYUHfyNQ","vLsmS48cHL","iqv4k0MR5X",
+"pvgjS9y4lw","JKWYRd85a9","aL6AJHRxd8","XflUq8TxD7","CNHmvs93Ml","RkQkeTCgPp","hYBCKsx5Gl","ix74rvOqCE","Vprf2DG4sT","P6bcgRkQke",
+"n1pmOCIShG","FnPFBuQIcz","D6rByfcJOy","ulk41QClRL","FVMxoFhtgl","pWiOstlILt","Cp3mZdjsrv","oVQp6v2eC3","zz4ZUo8Uyd","RpBQmYf2Ec",
+"BFkb8618Di","3weIF14FLR","C2Irciqv4k","uupzkjzUqR","y94nwrz7Ut","vOqCEZJTXH","29QAzUmaEv","AXpwECIShG","6AFT0M3zXL","RACujNAFuw",
+"vLsmS9iGoT","v8yFNNOHsz","dmoS7MaJQs","gf8rIFPfSE","MmKGJFxX9q","O3iyQSWfou","FGzgptvdkD","CdyBVpWiOs","EdBKcpiJSk","5VZjSW7cTs",
+"MaJQs7X3uy","fcJOy0ao3l","kB5nPsoy9t","CIShGv8yFN","WMiS3hYBCK","0BmCys4786","euZA5Q6hMC","AXpwEd85a9","IBe8ki3pyd","8xEKzJkzUn",
+"Zv7z0uZPqg","WPmlx9eoRc","hUTw7yEfy9","CqqaD9GXkX","7lUXZ9XyT9","y94nwlkMUA","8TxD7vOqCE","yofH3KsjRK","7Ow5Caez9y","cQOnv5Drn0",
+"taOXKLewvM","djsrvAIYUu","2ZHdkqQxHP","O3iyQGv3Fq","xXTI4K20wK","45cIH4QMc9","1v5hHlj07Q","BbwgAD6rBy","4QMc9oVQp6","QClRL5Mg9r",
+"blLA9m4bxU","QClRLydG8U","RBhp0L7cGc","jSjS33otm6","KASQ8rz7Ut","5drc6prNT6","EOE1ozHF1q","wDajXnFqik","lm0pDlXFOB","K4GS8iB08l",
+"TCgPpPOUYS","WaWsvXflUq","4QMc9pvgjS","QworuwDajX","gtCA5DG4sT","48cHLAOgEe","uN6r3hYBCK","4dEz6zFgtB","wDajXuTacx","Nxx9VCdyBV",
+"ix74r8TxD7","jSjS3lCMxy","uvf7AJ2mQi","n1pmOXyPZN","okgRidjsrv","24ARFpiJSk","FwEJzLewvM","Vprf2okgRi","qaofNNcICA","4QMc9ZuDtD",
+"0MR5X6AFT0","pAhR1GrDg7","dmoS7RkQke","FNYIM2TRI7","rz7UtCNHmv","MmsIofcJOy","M3zXLCqqaD","SbRYyXyPZN","jzUqRnnP8o","S77LHIRh48",
+"iqv4kEdBKc","iqv4kNAFuw","d7vjM8cVD3","SWfou16lHc","9eoRcBGaQY","WreyPFhtgl","W7cTsM6qcG","zHF1qGv3Fq","v8yFNCfgr3","8cVD3QClRL",
+"pFrrl7fsYM","9eoRc5Mg9r","CIShGBpYhV","0MR5XcQOnv","2TRI7VBjhz","MmsIok85Ae","ulk41tl72W","lweGykB5nP","rhl0JvLsmS","fLNg8wDajX",
+"9y4lw4QMc9","fLNg8lweGy","0Kyfsuupzk","aFFsssuY4x","EOE1o3weIF","FGzgpThjNn","8U2nUKASQ8","S2Dfuuvf7A","7fKYUZv7z0","IjTwPuupzk",
+"o8UydMojnP","KASQ8KsjRK","lsQGotvdkD","i7WMQXyPZN","TwanoPYBf4","G1RhSkZANm","0Kyfs24ARF","Q6hMC8RCUA","Rxrsmsoy9t","xReecv1Hln",
+"5ZaEz7lUXZ","UlU3MIRh48","uAWypwiHrZ","2DREslXFOB","FcWrW9rlg9","DcpWBMaJQs","Gv3FqJIqXi","MK07YfmIK1","brhlQoVQp6","ThjNnEoToP",
+"RkQkeMojnP","s7Mxk9GXkX","24ARF9XyT9","mz8gxyToGW","CdyBVuZPqg","5VZjSVerEA","7hyVvzqH0W","7fsYMb29RJ","6q6L90PktI","dmoS7h1zcH",
+"yofH3VBjhz","0YAGHIjTwP","uPX7GI7p2a","a00b529QAz","O3iyQM3zXL","LewvMFNYIM","blLA9jfREu","vLsmSPb1pa","CIShGjiVBP","a00b5MaJQs",
+"yofH3rKDLJ","zFgtBhi5X7","lViBvOUYuF","ReKEW5Mg9r","AgJHQ45cIH","nnP8o9iGoT","Oz8yZZuDtD","M3zXLciuWz","5iGN5d7vjM","IjTwPF6PT2",
+"fLNg8HfyNQ","2ZHdk2DREs","lm0pDyluBx","lXFOBZv7z0","taOXKnFqik","zFgtBWPmlx","jtn0XIKxdL","M6qcGzz4ZU","iB08l9rlg9","hUTw7RsQUq",
+"IKxdLlm0pD","GWqqX7X3uy","aez9yVNCPd","pFrrlQWxoT","7lUXZMK07Y","cShY2gf8rI","Y1mC04dEz6","RkQkeMK07Y","C2IrcuoStw","6q6L924ARF",
+"7lUXZZv7z0","taOXKlweGy","yToGWhe9IA","x3LDehUTw7","sqVrfP6bcg","C2Ircatef2","8TxD7s7Mxk","zbIYYGSQwj","J2mQihi5X7","VBjhz8hJdt",
+"Twanorz7Ut","2DREsRkQke","LewvMs93Ml","1LB1LB3qem","HlUbF8hJdt","FjHXR24ARF","8RCUA8U2nU","VNCPd14FLR","rz7Ut9iGoT","qQxHP7hyVv",
+"2ZHdkrKDLJ","gjUTujtn0X","FcWrW4W0Tl","IRh48RmDcr","yluBxGXdoH","m4bxUzqH0W","pFrrlOUYuF","AkKTkmz8gx","yvOMIjSjS3","s4786pmeCd",
+"JKWYRzY1GY","CxVEfIjTwP","ix74rEoToP","MmsIoNcICA","AXpwEdmoS7","AXpwEC2Irc","pT8wu7Ow5C","x3LDeI7p2a","NAFuwOxWIH","J2mQi0Kyfs",
+"fqypygjUTu","uJScX64s8N","gIYvE5ZaEz","NOHszGrDg7","uJScXAIYUu","jSjS3LbRTH","b29RJLbRTH","rz7Utdpe1v","DG4sTQssNC","WaWsv2Yz7E",
+"16lHciB08l","OUqFMzbIYY","45cIH14FLR","fLNg89y4lw","piJSkcmXIX","LDk6f1v5hH","7fKYUh1zcH","kB5nP45cIH","WMiS38xEKz","aFFssMmsIo",
+"uTacx9rlg9","guMb8mz8gx","pmeCdQWxoT","fmIK1uQIcz","3otm69y4lw","P6bcgtaOXK","HRxd8VjCZq","7ku1pReKEW","pmeCds7Mxk","CdyBVGv3Fq",
+"ZhwG1l83Ud","Yf2Ec8xEKz","AkKTkD6rBy","i7WMQmX2GE","4W0TlXflUq","QssNCfaHir","KASQ8RkQke","iB08ltjQxs","rKDLJNcICA","qUJMdEdBKc",
+"I7p2aNcICA","P6bcguN6r3","7hyVvKZamH","YjB9ti7WMQ","MojnPyvOMI","5Drn0FwEJz","ZhwG15VZjS","B3qem8RCUA","9GXkXlXFOB","3weIF0h1b1",
+"FnPFBblLA9","tuDySFnPFB","QChxsi3pyd","iqv4ke6e4z","sqVrfFxX9q","FcWrWjSjS3","iB08lsoy9t","iKqhry94nw","yluBxAkKTk","i7WMQ16lHc",
+"BFkb8OxWIH","hE1QluAWyp","v1HlnyofH3","DQimp8RCUA","okgRiBpYhV","SmGzvsx5Gl","BFkb8VerEA","MezSWazIWp","FnPFBVjCZq","ix74rydG8U",
+"BFkb8pv0i7","pAhR1vLsmS","BbwgAzz4ZU","pFrrlRBhp0","NAFuwCxVEf","lsQGot59lR","wDajXa00b5","lCMxyuJScX","CK5W7XflUq","t59lRxciqp",
+"wiHrZjSjS3","UmaEv4dEz6","fmIK1aez9y","yluBx8TxD7","cQOnvgjUTu","0ao3lW7cTs","lsQGo7fsYM","hUTw7Ss0Zu","t98iWuLtKs","tl72W9iGoT",
+"fcwDazqH0W","WPmlxJXljW","8TxD745cIH","xXTI4fFDrJ","hSSvQ5drc6","MK07YlweGy","Z4I1vpFrrl","h1zcHi7WMQ","7fKYUQssNC","aL6AJB3qem",
+"VjCZqt98iW","JKWYRHzZT8","nnP8oECMvU","zQt6QTXQ0Z","TXQ0ZcmXIX","pmeCds4786","KZamHyToGW","gdQsS6AFT0","piJSkiKqhr","KsjRKAmdQd",
+"BpYhVOHaBz","5iGN5RmDcr","WDVWJkZANm","aez9yRsQUq","FcWrWAmdQd","QYxC0piJSk","POUYSrhl0J","BGaQYCp3mZ","0KyfsHzZT8","JJs5mMK07Y",
+"9iGoT16lHc","7Ow5CzY1GY","9y4lwhUTw7","AOgEeGWqqX","NAFuwJKWYR","pv0i70MR5X","xXTI4Kr8ys","v8yFNlsQGo","uZPqgNxx9V","1j5L85Namm",
+"IKxdLUmaEv","d7vjMEdBKc","2Yz7ESs0Zu","Kr8ysjSjS3","MmsIo7lUXZ","7fsYM55rfB","4QMc9i7WMQ","KsjRKvkCHH","RmDcrWaim6","hSSvQNAFuw",
+"RACujs4786","FVMxob29RJ","PYBf47X3uy","F6PT2OUYuF","O3iyQy94nw","VjCZqVBjhz","CK5W7FjHXR","GSQwj9rlg9","wiHrZRpBQm","FPfSEuoStw",
+"OHaBzRsQUq","FLsphhi5X7","CqqaDyluBx","EdBKccQOnv","0MR5Xuvf7A","tAOsrZzJHW","Chuy3Ul4a1","0KyfspFrrl","gIYvEiB08l","soy9tfFDrJ",
+"MojnPjzUqR","MezSWNhXdu","nnP8oulk41","JkzUn9XyT9","VerEA24ARF","ZzJHWxXTI4","UmaEvdmoS7","8TxD7vLsmS","mz8gxAIYUu","fFDrJiwzGk",
+"Mkgy8lm0pD","S77LHAOgEe","BbwgASWfou","euZA5pT8wu","pT8wuS2Dfu","nlaByRkQke","EdBKcBbwgA","hSSvQXflUq","v2eC3a00b5","Zv7z0jeskS",
+"Yh1hFStlDJ","OHaBzv2eC3","aDGtSmX2GE","kB5nPMGlTF","RsQUqReKEW","XflUqwDajX","hYBCKjtn0X","JXljWcShY2","aDGtSuPX7G","Uvlv41LB1L",
+"MK07YlCMxy","i7WMQ0Kyfs","v8yFNKZamH","nFqik7X3uy","YjB9tSWfou","aDGtS7Ow5C","Pb1pa2DREs","b29RJo8Uyd","NOHszNhXdu","YOfrY5iGN5",
+"h1zcHVjCZq","nlaByBbwgA","yofH3guMb8","9rlg9Waim6","Uvlv4d7vjM","KZamHWreyP","5NammZzJHW","iqv4kaL6AJ","rhl0JpT8wu","nlaBy64s8N",
+"1LB1LDcpWB","WreyPWDVWJ","OUYuFjiVBP","IjTwPdhSuH","AmdQd2ZHdk","LDk6fn8pJ9","uQIczuoStw","yvOMIogLgc","lXFOBv8yFN","FPfSEHRxd8",
+"uJScXEoToP","CNHmv7fsYM","VBjhzh1zcH","QYxC0U3yw5","Uvlv4piJSk","wDajXSs0Zu","0BmCyQChxs","NcICApiJSk","kB5nPjtn0X","soy9tTXQ0Z",
+"qQxHPOz8yZ","QYxC0HP433","Z4I1vQ6Lix","5Namm45cIH","580YDMGlTF","FcWrW8hJdt","NAFuwEOE1o","IBe8kSWfou","5VZjSv8yFN","LewvMWmadA",
+"ZzJHWReKEW","Cfgr3Ta8f6","qaofNCqqaD","JRJQBzz4ZU","ciuWzCK5W7","0PktIZJTXH","tuDyS5IhmG","BFkb8FnPFB","8cVD3RzaZA","taOXKdhSuH",
+"S77LHjtn0X","sx5GlYjB9t","tvdkD16lHc","ix74rzFgtB","tAOsrs7Mxk","FFDuiBbwgA","I7p2aOUqFM","n1pmOlsQGo","Uvlv4580YD","5VZjS0h1b1",
+"9GXkXbrhlQ","ZzJHWy94nw","3otm6pWiOs","Cfgr3vOqCE","mX2GEFGzgp","NAFuwFGzgp","mz8gxblLA9","L7cGcsqVrf","GSQwjI7p2a","BGaQYFNYIM",
+"AmdQdrhl0J","8FmFHciuWz","DcpWBuZPqg","iKqhrfmIK1","WMiS3FNYIM","MmKGJMmsIo","JIqXizz4ZU","29QAzEoToP","kZANmqUJMd","Gv3FqtjQxs",
+"QbxXcVBjhz","qaofNMojnP","55rfBS77LH","2Yz7ECdyBV","MezSWogLgc","HfyNQzQt6Q","CdyBVtvdkD","CdyBVKASQ8","LewvMdjsrv","5ZaEz24ARF",
+"t98iWWPmlx","JKWYRWaim6","QClRL5nmWv","2TRI7gdQsS","7hyVvCdyBV","jSjS3KZamH","8hJdtCIShG","Z4I1vrz7Ut","JRJQB7fKYU","JRJQBqaofN",
+"sqVrfhYBCK","piJSk8cVD3","WPmlxJJs5m","cQOnvhSSvQ","Gv3Fq580YD","RsQUqzqH0W","QChxsjSjS3","RsQUqTCgPp","ZzJHWQ6Lix","KZamHChuy3",
+"lCMxyzbIYY","2DREsdhSuH","7fsYM2Yz7E","6AFT0JkzUn","7Ow5CTXQ0Z","yToGWWmadA","MmsIoNAFuw","n8pJ9HP433","I7p2aJJs5m","v2eC3s93Ml",
+"dQ586dpe1v","n8pJ9tlILt","F6PT29XyT9","EoToPyvOMI","CxVEfLbRTH","ZJTXH8hJdt","L7cGcSjskQ","AmdQdEOE1o","Z4I1vjtn0X","lCMxyuN6r3",
+"kB5nPUl4a1","ZUnqtlsQGo","RBhp0fFDrJ","FwEJzRzaZA","Zv7z0blLA9","WMiS3J2mQi","RsQUqjS1aj","lweGyZUnqt","9XyT9MaJQs","VNCPdiKqhr",
+"qQxHPU3yw5","iKqhr7X3uy","xReecS77LH","s93MlQ6hMC","ru4UGC2Irc","lkMUAv2eC3","VjCZqRACuj","VLTy6Yh1hF","BbwgAzHF1q","qQxHPokgRi",
+"2DREs7hyVv","CK5W7VLTy6","48cHL1v5hH","QssNCFwEJz","GrDg755rfB","tlILt2ZHdk","dhSuHzqH0W","taOXKVLTy6","ru4UGeuZA5","64s8NYf2Ec",
+"faHirMezSW","1j5L8fmIK1","QbxXck85Ae","SjskQFFDui","GWqqXRzaZA","s93MlrKDLJ","tjQxslViBv","pAhR1PYBf4","7X3uygtCA5","29QAzSjskQ",
+"prNT6JKWYR","TXQ0ZThjNn","atef2QYxC0","aFFsspmeCd","VerEAZ4I1v","rz7Ut9rlg9","M6qcG5Mg9r","7Ow5C29QAz","8RCUARxrsm","RkQkev2eC3",
+"FFDui0ao3l","No0Qbm4bxU","fFDrJVprf2","Ss0Zu2TRI7","aez9y4dEz6","9eoRcOUqFM","BpYhVogLgc","qUJMd24ARF","euZA5EOE1o","0BmCyaDGtS",
+"ru4UGxXTI4","RmDcroGu6x","gIYvEQnJ1S","gjUTujSjS3","qaofN9iGoT","l83UdJKWYR","HfyNQpAhR1","64s8Nhi5X7","pWiOsKsjRK","ix74rtAOsr",
+"lViBvWMiS3","VLTy6wiHrZ","lpF6WQClRL","hi5X7NAFuw","29QAzv1Hln","kZANmDQimp","6q6L9BCxeC","pWiOs6q6L9","Cp3mZtaOXK","s7MxkUl4a1",
+"FxX9qMK07Y","Waim6VLTy6","Q6LixX6Pin","JIqXiUvlv4","2hEEUMGlTF","bgJAzHRxd8","y94nwfFDrJ","3otm63weIF","PYBf4taOXK","gIYvEW7cTs",
+"t59lRWMiS3","lH1ktZ4I1v","pv0i7hSSvQ","NAFuw0Wr5y","fcJOyhSSvQ","Uvlv4fcwDa","aez9y9GXkX","GrDg7uvf7A","SmGzvhi5X7","WaWsvKr8ys",
+"taOXKRpBQm","zz4ZUrhl0J","K4GS8uN6r3","soy9tmX2GE","hSSvQzmLYD","Cfgr3POUYS","n8pJ9WPmlx","x3LDennP8o","yvOMIydG8U","fmIK1UmaEv",
+"FLsphWMiS3","s7Mxkd85a9","5VZjSlweGy","uN6r3rhl0J","CNHmvpmeCd","ZzJHWni2v1","yluBxhe9IA","QworuWreyP","RmDcrJXljW","M6qcGD6rBy",
+"QbxXcDz1R3","PYBf4wDajX","Dz1R3PYBf4","azIWphi5X7","prNT6Mkgy8","yofH35Mg9r","zqH0W55rfB","d7vjMLDk6f","1LB1LKASQ8","uZPqgTXQ0Z",
+"FPfSEbgJAz","aFFsszHF1q","JkzUns4786","nlaByzY1GY","5Mg9rReKEW","Kr8ysuAWyp","IRh48MGlTF","piJSkJ2mQi","vOqCEazIWp","lH1ktMojnP",
+"LDk6fdhSuH","ix74riqv4k","4QMc9mz8gx","uupzkKr8ys","lCMxyuZPqg","tlILtLewvM","gf8rIeuZA5","pWiOsFPfSE","d85a9e6e4z","tjQxsTwano",
+"7ku1pgjUTu","aL6AJsx5Gl","aez9yJXljW","8U2nU2TRI7","QworuP6bcg","MmsIoni2v1","oGu6xTa8f6","zY1GYi3pyd","s4786iwzGk","uPX7Gdpe1v",
+"cL0aEWmadA","GWqqXQ6Lix","J2mQiaez9y","S77LHIn3NS","QnJ1SuTacx","BCxeCM6qcG","2NslmYOfrY","8FmFH24ARF","3otm6aFFss","RmDcrSWfou",
+"24ARFlXFOB","zmLYD5IhmG","RpBQmlViBv","WMiS3RBhp0","RmDcrWDVWJ","zHF1qcmXIX","sx5GlfmIK1","KZamH8U2nU","9GXkXM3zXL","TwanopmeCd",
+"k85AeSbRYy","FVMxoHlUbF","CqqaD5drc6","8FmFHTa8f6","FNYIMQWxoT","CdyBVQ6hMC","7lUXZ5nmWv","Z4I1vHzZT8","CxVEfECMvU","dmoS7ru4UG",
+"5Drn0JIqXi","B3qemNo0Qb","OUYuFQYxC0","WPmlxUlU3M","AmdQdprNT6","suY4xwDajX","AOgEeFVMxo","FjHXRVNCPd","CxVEfpT8wu","XyPZNL7cGc",
+"MK07Y55rfB","ru4UGuPX7G","HP4330Wr5y","okgRiRBhp0","s7MxkXyPZN","8FmFHOUqFM","Z4I1vFwEJz","MmKGJCIShG","tvdkDNcICA","EdBKcIn3NS",
+"MK07YQWxoT","FcWrWFFDui","d7vjMVerEA","In3NShE1Ql","taOXKG1RhS","zFgtBMezSW","SbRYy8RCUA","uLtKslpF6W","9iGoTRmDcr","QYxC0vOqCE",
+"DG4sTjfREu","dhSuHdpe1v","uTacxFnPFB","5iGN5uAWyp","JXljWO3iyQ","WMiS3AOgEe","tvdkDyToGW","8cVD3pT8wu","2DREscL0aE","okgRiRxrsm",
+"Gv3FqVprf2","9GXkXlViBv","fcJOyiB08l","cmXIXMmKGJ","MGlTFJIqXi","No0QbK20wK","fFDrJuN6r3","WMiS38RCUA","16lHclkMUA","2ZHdkkZANm",
+"VBjhzIn3NS","o8UydksJby","2hEEUQ6Lix","8hJdt14FLR","4dEz6uAWyp","3weIFLDk6f","6q6L9GXdoH","rz7Ut4QMc9","S77LHbgJAz","7hyVvXflUq",
+"ECMvUAmdQd","lweGyi7WMQ","S2DfuRsQUq","VjCZq5ZaEz","rhl0Jsoy9t","S2DfujS1aj","IKxdLVprf2","L7cGckB5nP","2Yz7EjS1aj","Yw2oUVBjhz",
+"9rlg9S77LH","s47865IhmG","X6PindmoS7","BGaQYjeskS","Twanogf8rI","nFqikfFDrJ","sx5Gl2DREs","X6PinXflUq","uTacxGXdoH","ZJTXHzHF1q",
+"64s8NF6PT2","ix74ruZPqg","jS1ajpmeCd","ulk41m4bxU","fcJOyzQt6Q","Q6hMCi3pyd","ulk41bgJAz","ni2v14dEz6","LbRTHa00b5","5Drn029QAz",
+"8U2nUs93Ml","7fsYMsx5Gl","uQIczHfyNQ","CxVEfqUJMd","9rlg9J2mQi","uZPqgjS1aj","5IhmG5nmWv","M6qcGcShY2","LbRTHsqVrf","ix74r5Namm",
+"gIYvECNHmv","fFDrJQworu","taOXKI7p2a","W7cTsfcJOy","VIlwPuLtKs","F6PT264s8N","Yw2oUyofH3","uoStw2TRI7","0Kyfssoy9t","2NslmOHaBz",
+"gIYvEaFFss","ReKEWCK5W7","WMiS3lweGy","IRh48HfyNQ","sx5Gli3pyd","Rxrsmdpe1v","tvdkDRxrsm","2ZHdkTCgPp","tl72WQ6Lix","Cfgr3blLA9",
+"QnJ1She9IA","ni2v1yluBx","x3LDe2Nslm","OxWIHi7WMQ","XflUqtuDyS","FPfSEwDajX","blLA9WreyP","WaWsvI7p2a","3weIFB3qem","0PktIjfREu",
+"ZuDtDFcWrW","RkQke2Nslm","HP43307n1c","lj07Qv2eC3","7fsYMix74r","AXpwERsQUq","hUTw7HzZT8","yofH3L7cGc","ksJbyRpBQm","64s8NgIYvE",
+"L7cGcfmIK1","MaJQsWmadA","lpF6Wiqv4k","ZUnqtfmIK1","zY1GYCdyBV","8xEKzBpYhV","OxWIH6q6L9","ECMvUEdBKc","VjCZqgdQsS","45cIHPYBf4",
+"2TRI7KsjRK","FcWrWzqH0W","ydG8UUvlv4","fcJOyd85a9","ZUnqt2hEEU","VNCPdOUYuF","5Mg9rG1RhS","7X3uyMkgy8","zY1GYpAhR1","piJSkIBe8k",
+"QWxoTciuWz","5nmWv3otm6","Ss0ZuXflUq","RsQUq4QMc9","PYBf416lHc","uTacxnnP8o","d7vjMJ2mQi","5ZaEzzmLYD","SWfouprNT6","7Ow5C7hyVv",
+"i3pydbZLvS","U3yw5Ul4a1","YOfrYIn3NS","a00b5X6Pin","t59lRRsQUq","lXFOBJKWYR","QbxXcIKxdL","HlUbFs4786","LewvMatef2","pFrrlgtCA5",
+"n8pJ9MmsIo","0MR5XqUJMd","RpBQmNOHsz","GWqqXpFrrl","9iGoTjzUqR","brhlQhSSvQ","OHaBzZhwG1","zQt6Qo8Uyd","gIYvEprNT6","blLA9QssNC",
+"azIWpLewvM","FjHXRyToGW","Nxx9V7fKYU","7fsYM6q6L9","bZLvSFwEJz","JkzUnd7vjM","hi5X7W7cTs","euZA5fLNg8","lpF6WKsjRK","Pb1paIKxdL",
+"hi5X7NhXdu","aDGtSRmDcr","d85a9FFDui","uAWypEdBKc","jtn0XZ4I1v","Uvlv4hUTw7","YOfrYuvf7A","16lHc618Di","AOgEe3otm6","s4786lXFOB",
+"9y4lwRzaZA","29QAzZhwG1","RsQUqzHF1q","3otm6tAOsr","fLNg8QChxs","MojnPZUnqt","UlU3MLbRTH","m4bxUAOgEe","soy9t64s8N","blLA9FnPFB",
+"jzUqRoVQp6","DQimp45cIH","FVMxoRzaZA","0ao3ljfREu","v2eC3zQt6Q","gdQsSogLgc","zbIYYXyPZN","5VZjSUl4a1","P6bcgYjB9t","24ARFoQ87r",
+"HP433yToGW","XyPZNatef2","8hJdtgjUTu","JXljWtjQxs","zqH0WMezSW","oGu6xVBjhz","In3NS5ZaEz","gjUTu8hJdt","tjQxstAOsr","s7MxkokgRi",
+"lH1kts4786","mX2GEs93Ml","7Ow5Che9IA","5drc6gf8rI","0KyfsWPmlx","h1zcH9eoRc","8cVD3JJs5m","WmadAS77LH","d7vjMDcpWB","uoStwh1zcH",
+"prNT6RsQUq","AOgEeLewvM","2hEEU4QMc9","4W0TlQYxC0","WDVWJ2DREs","RBhp0MaJQs","Dz1R3zFgtB","x3LDelj07Q","9eoRcFcWrW","uoStw1LB1L",
+"K20wKECMvU","2TRI7Cp3mZ","jiVBPFnPFB","ZuDtDYjB9t","suY4xIKxdL","3weIFoVQp6","Waim6prNT6","hSSvQCNHmv","aez9ypWiOs","5IhmGUvlv4",
+"n1pmOCNHmv","14FLRFnPFB","tAOsrXflUq","hSSvQfcwDa","okgRifmIK1","qUJMdSjskQ","zmLYDaDGtS","SmGzvcQOnv","lj07Qru4UG","h1zcHmX2GE",
+"lXFOBm4bxU","5Mg9rRxrsm","VerEAzY1GY","IBe8kh1zcH","t98iWRACuj","G1RhS6q6L9","24ARF5nmWv","hE1QlFGzgp","Oz8yZlViBv","tAOsriKqhr",
+"iwzGkiKqhr","5drc6dmoS7","WPmlxLDk6f","jeskSRkQke","0YAGHCxVEf","pFrrlhi5X7","atef2yluBx","lm0pDSWfou","hE1Ql07n1c","s7MxkGrDg7",
+"kZANmx3LDe","lj07QBpYhV","VerEAOxWIH","kZANmJIqXi","0Wr5yFPfSE","QChxsdpe1v","pWiOsPOUYS","atef2jiVBP","S77LHuZPqg","Ss0ZuK4GS8",
+"d7vjM3otm6","DG4sTuQIcz","5nmWv5Namm","FNYIMKsjRK","MmKGJ9eoRc","ksJbygIYvE","m4bxULbRTH","TXQ0ZvkCHH","t59lRWDVWJ","Waim6xReec",
+"lXFOB0ao3l","9iGoTNo0Qb","l83UdWPmlx","BCxeC9eoRc","MK07YUmaEv","8RCUAgIYvE","M3zXLPb1pa","jS1ajx3LDe","FFDuiGrDg7","1j5L8ciuWz",
+"OUYuFFcWrW","TCgPptl72W","ksJbylH1kt","HfyNQBpYhV","VIlwPtuDyS","FnPFBOUqFM","ciuWzW3VFH","HRxd8ydG8U","9y4lwuJScX","Y1mC0W3VFH",
+"7X3uyDcpWB","qUJMdFVMxo","Gv3FqIRh48","POUYS0BmCy","qQxHP7fsYM","vOqCE5nmWv","fcwDaoVQp6","qQxHPgdQsS","Pb1paMkgy8","I7p2atuDyS",
+"Zv7z0lj07Q","5nmWvJXljW","FjHXRpiJSk","WreyP6q6L9","kB5nPStlDJ","RsQUq5ZaEz","9iGoTRxrsm","o8Uyd0YAGH","iKqhr0YAGH","Cp3mZQWxoT",
+"tjQxsIjTwP","vkCHHYw2oU","6q6L9t98iW","Nxx9V0Kyfs","rKDLJbrhlQ","2DREsVerEA","vLsmSulk41","5iGN5OUYuF","zHF1qjtn0X","CIShGAIYUu",
+"KASQ8zHF1q","7ku1puvf7A","zHF1qd85a9","14FLR5Namm","RsQUqaL6AJ","FFDuiru4UG","StlDJWreyP","NcICA3otm6","uZPqgWmadA","yEfy9n1pmO",
+"pmeCdksJby","2Yz7Ed7vjM","lCMxyfcwDa","l83UdpT8wu","sx5GltAOsr","LewvMEoToP","4W0TlbgJAz","BbwgA8U2nU","s4786zz4ZU","BpYhVBFkb8",
+"vOqCEHzZT8","7fsYMeuZA5","0BmCyazIWp","6AFT02ZHdk","OxWIH8cVD3","pAhR1kZANm","xciqppv0i7","RsQUqCp3mZ","CNHmvCdyBV","GWqqX5Mg9r",
+"Cp3mZJ2mQi","v1Hln14FLR","HP433xciqp","Y1mC0SbRYy","rz7UttvdkD","lj07Q7fsYM","k85AeMK07Y","sx5Glh1zcH","5NammX6Pin","CK5W7RsQUq",
+"0h1b1jzUqR","wiHrZDG4sT","FnPFB7Ow5C","HRxd8k85Ae","JkzUnP6bcg","pmeCdzY1GY","lkMUA48cHL","aL6AJLewvM","7X3uyYjB9t","uN6r36q6L9",
+"dpe1vni2v1","Uvlv4jSjS3","07n1cTXQ0Z","jS1aj5Drn0","KsjRKQssNC","ix74rK20wK","GXdoH5nmWv","tjQxs0Wr5y","iqv4klViBv","TXQ0ZPYBf4",
+"s4786aez9y","v8yFNDLhzM","SbRYyfaHir","i3pyd580YD","taOXKWaim6","Ul4a1yluBx","JIqXiaL6AJ","jtn0XCIShG","W7cTshE1Ql","xReeclsQGo",
+"XyPZNtjQxs","XflUqyluBx","YjB9t0ao3l","uvf7Alj07Q","07n1c7X3uy","XflUq5VZjS","WPmlxXyPZN","8U2nUQ6hMC","Mkgy8Yf2Ec","zbIYYuLtKs",
+"jSjS3K4GS8","lCMxyguMb8","JRJQBQbxXc","suY4xrhl0J","VLTy6hi5X7","qaofNaL6AJ","P6bcgEoToP","55rfBzbIYY","tlILtMaJQs","ogLgcx3LDe",
+"CxVEf9iGoT","7fsYM9eoRc","5ZaEzWMiS3","9XyT9618Di","WreyP24ARF","hi5X7fqypy","64s8NiB08l","BGaQYaFFss","Gv3FqIn3NS","9iGoTjtn0X",
+"iwzGkjfREu","hUTw7zY1GY","FhtglydG8U","ECMvUNcICA","KZamHlpF6W","vOqCEoQ87r","AkKTky94nw","MmsIoFGzgp","BCxeC16lHc","Cp3mZAIYUu",
+"G1RhShe9IA","SWfouRmDcr","QssNCEoToP","IBe8kI7p2a","iKqhrRmDcr","pWiOsWPmlx","suY4xogLgc","lpF6Wulk41","jS1ajrKDLJ","uoStwksJby",
+"okgRipFrrl","7ku1piKqhr","cmXIX48cHL","Cp3mZW3VFH","9XyT9Ta8f6","m4bxUrhl0J","Vprf2QWxoT","JRJQBCNHmv","uPX7GXflUq","2hEEUdmoS7",
+"he9IAnlaBy","BpYhVUvlv4","WMiS3fFDrJ","s4786POUYS","ru4UGpWiOs","S77LHnnP8o","XflUqhi5X7","QClRL5IhmG","DQimpulk41","29QAzFhtgl",
+"CNHmvzmLYD","ciuWzGSQwj","POUYSF6PT2","5iGN5QYxC0","djsrvZv7z0","cShY2s7Mxk","2Yz7Esx5Gl","8xEKzPOUYS","oQ87rWmadA","NAFuwQClRL",
+"lCMxytaOXK","5VZjSfqypy","FwEJzs7Mxk","JXljWoVQp6","y94nwsuY4x","yofH3MojnP","uAWypmX2GE","BbwgAuQIcz","9y4lwkZANm","prNT6GrDg7",
+"guMb8kB5nP","Z4I1vRxrsm","07n1csoy9t","1j5L8qUJMd","EdBKcJkzUn","tlILtAkKTk","JkzUnWaWsv","he9IAhYBCK","3otm6h1zcH","lCMxyWreyP",
+"0Wr5ywiHrZ","i3pydKZamH","SmGzvHzZT8","vLsmSkB5nP","Mkgy8uZPqg","GSQwjsx5Gl","8xEKz9XyT9","29QAzJIqXi","0ao3lfcJOy","TwanoblLA9",
+"BFkb8lm0pD","SmGzvrz7Ut","zmLYDWMiS3","vLsmSokgRi","07n1cNcICA","fcwDacQOnv","Mkgy8W7cTs","s4786FGzgp","KZamH2Yz7E","IjTwPOUqFM",
+"tvdkDzqH0W","WaWsvBbwgA","soy9tAIYUu","FVMxohUTw7","gjUTuSWfou","1j5L8TCgPp","rKDLJcmXIX","RxrsmMezSW","1v5hHoQ87r","okgRiiKqhr",
+"pmeCdfcJOy","0YAGHJ2mQi","NOHszqQxHP","7fKYUpFrrl","ulk41Ss0Zu","QChxs2Yz7E","14FLRF6PT2","Nxx9Vuvf7A","Pb1patvdkD","RpBQmlXFOB",
+"RBhp0GWqqX","Yh1hFguMb8","lXFOBMkgy8","guMb8lXFOB","tlILtRBhp0","zY1GY0Kyfs","4W0TllViBv","k85Ae7X3uy","soy9tgf8rI","Q6hMCqUJMd",
+"Kr8ysoGu6x","i3pyd5VZjS","b29RJFjHXR","iwzGkBbwgA","HlUbFMezSW","BGaQYn1pmO","n1pmOVprf2","uZPqgX6Pin","AmdQdgjUTu","QssNCfcJOy",
+"5nmWvpFrrl","uAWypsoy9t","ogLgcJXljW","dpe1vNxx9V","hUTw7ydG8U","9XyT98RCUA","4W0TlJ2mQi","pv0i70YAGH","cQOnvru4UG","vkCHHHzZT8",
+"9rlg9BGaQY","M6qcGfqypy","ZuDtD2ZHdk","2DREsAgJHQ","Mkgy8zFgtB","QnJ1Suupzk","cShY2tlILt","9GXkX0PktI","RBhp0b29RJ","jeskS24ARF",
+"3otm6Cp3mZ","rKDLJ8hJdt","GSQwjfmIK1","6AFT0pv0i7","JkzUnoQ87r","KsjRKgjUTu","MGlTFK4GS8","s93MlLewvM","5VZjS7ku1p","v1HlndQ586",
+"MezSWL7cGc","5NammOHaBz","s4786MezSW","StlDJRBhp0","LDk6f5nmWv","14FLRYjB9t","zHF1qyluBx","EoToPTwano","K4GS8lH1kt","i3pyd0BmCy",
+"jtn0X24ARF","4dEz6Ss0Zu","s4786VIlwP","YOfrYZUnqt","LbRTHRxrsm","FhtglrKDLJ","t59lRZJTXH","RACuj5Drn0","FnPFB9rlg9","vOqCErz7Ut",
+"qQxHPAmdQd","VIlwP3weIF","ix74rjfREu","zFgtBTXQ0Z","BCxeCzFgtB","Y1mC0MezSW","VBjhzciuWz","W3VFHCqqaD","cShY2NAFuw","ZhwG1Waim6",
+"lweGydmoS7","dQ586LewvM","YOfrYgdQsS","0KyfsCK5W7","Dz1R3HP433","SmGzvTCgPp","oQ87reuZA5","LewvMHRxd8","GXdoHMm8si","piJSkF6PT2",
+"kB5nPfmIK1","XflUqx3LDe","lCMxyzFgtB","Yw2oU618Di","EdBKc5ZaEz","Y1mC0piJSk","fmIK1tvdkD","QbxXc5VZjS","pT8wuHlUbF","LewvMFjHXR",
+"KsjRKY1mC0","FFDuipvgjS","uN6r3yToGW","nFqikjS1aj","FVMxojS1aj","RACuj4W0Tl","In3NSMm8si","Dz1R3uJScX","SmGzvzFgtB","b29RJ1v5hH",
+"aFFssIRh48","FxX9qPOUYS","8RCUAiwzGk","jzUqR5ZaEz","VjCZqFwEJz","HP4330MR5X","FPfSEsqVrf","4dEz6y94nw","HfyNQdjsrv","QssNCKr8ys",
+"SWfou7hyVv","uTacxnlaBy","BFkb8SbRYy","HzZT8HlUbF","rKDLJP6bcg","fFDrJW3VFH","LbRTH9iGoT","5iGN50PktI","yvOMI45cIH","SWfouxReec",
+"uN6r3n1pmO","M6qcGIjTwP","oVQp6t98iW","Mkgy8guMb8","X6PincQOnv","JKWYRrKDLJ","U3yw5zqH0W","uTacx580YD","uTacxpFrrl","LewvMYw2oU",
+"DG4sTVIlwP","fqypyJ2mQi","yEfy914FLR","0YAGHlsQGo","No0QbOUqFM","KZamHhSSvQ","WaWsvFNYIM","tAOsr16lHc","t98iW8hJdt","24ARFHzZT8",
+"cmXIXjeskS","PYBf42Yz7E","soy9tbrhlQ","Mm8sizHF1q","No0QbiwzGk","fLNg8Ss0Zu","0YAGHxciqp","Chuy3MaJQs","14FLRJXljW","2hEEUlkMUA",
+"zFgtBZv7z0","4dEz65IhmG","DG4sTjeskS","nnP8ofqypy","ThjNnD6rBy","SjskQWDVWJ","Twano5iGN5","4dEz69XyT9","7ku1p5Mg9r","5ZaEzY1mC0",
+"IjTwPUlU3M","2NslmSbRYy","9rlg9azIWp","lCMxyXyPZN","aez9yOxWIH","KsjRKYh1hF","DLhzMzqH0W","l83Ud5VZjS","ZJTXHfqypy","fmIK1AOgEe",
+"SjskQP6bcg","K20wK9XyT9","t98iWB3qem","4QMc9bZLvS","8xEKzjfREu","tl72WtaOXK","MmKGJjS1aj","PYBf4WPmlx","aDGtSWDVWJ","WPmlxcL0aE",
+"CK5W7No0Qb","d7vjMyEfy9","yluBxM6qcG","tjQxsThjNn","MGlTF1v5hH","0KyfsChuy3","VerEACqqaD","s4786VerEA","uAWypNcICA","FVMxoHRxd8",
+"JKWYRFxX9q","o8Uydlj07Q","JkzUnsoy9t","D6rBydhSuH","QWxoTgIYvE","faHirRxrsm","TCgPpJJs5m","lm0pDBCxeC","I7p2a14FLR","BpYhVDLhzM",
+"iB08ltvdkD","IKxdL24ARF","RACujlXFOB","NcICAL7cGc","WaWsvokgRi","5nmWvChuy3","W3VFHX6Pin","8U2nUv1Hln","ni2v1i7WMQ","VNCPdsx5Gl",
+"uupzkRBhp0","he9IAYh1hF","RBhp0OUqFM","ZuDtDSs0Zu","oGu6xQYxC0","1LB1Ltl72W","dmoS78FmFH","tl72WyluBx","8FmFH55rfB","JRJQBCqqaD",
+"Gv3FqQssNC","lH1kt2TRI7","TXQ0Zk85Ae","ZzJHW2DREs","blLA929QAz","sqVrfyvOMI","zFgtB3otm6","n8pJ9iKqhr","aFFssVjCZq","9eoRcVLTy6",
+"SbRYym4bxU","k85AelkMUA","5Drn024ARF","WPmlxEdBKc","HlUbFfcwDa","VjCZq48cHL","zFgtBIjTwP","0PktI14FLR","jSjS3YjB9t","RxrsmP6bcg",
+"JkzUnqUJMd","TCgPpokgRi","2hEEU8hJdt","yEfy9GSQwj","RpBQms93Ml","fFDrJ2DREs","AIYUutuDyS","Cfgr3HlUbF","ZJTXHQssNC","e6e4zRkQke",
+"MmKGJ6AFT0","o8UydgdQsS","guMb85Drn0","8hJdtOxWIH","G1RhSlkMUA","mX2GEoVQp6","7fKYUvkCHH","2TRI7aez9y","zHF1qK20wK","W3VFHCNHmv",
+"Q6hMCzz4ZU","0YAGHPYBf4","hi5X7JkzUn","kB5nPlpF6W","QYxC08RCUA","e6e4zUvlv4","Vprf2EOE1o","nnP8o8FmFH","vOqCEKZamH","SWfouYjB9t",
+"I7p2agjUTu","9XyT9wDajX","Twanoxciqp","gjUTuFwEJz","OUYuFpiJSk","RxrsmsqVrf","RpBQmLewvM","MK07YhSSvQ","0BmCy5Mg9r","Vprf245cIH",
+"5VZjSiqv4k","uPX7Gmz8gx","zFgtBqUJMd","d7vjMQWxoT","nnP8oD6rBy","LewvMxReec","XyPZNWaWsv","618Di2TRI7","hYBCKJIqXi","yEfy9Q6Lix",
+"zqH0WZv7z0","FhtglGWqqX","5IhmGQnJ1S","WPmlxzz4ZU","lCMxyxciqp","l83UdguMb8","GXdoHK4GS8","a00b5lXFOB","HzZT8jfREu","Cp3mZYh1hF",
+"LbRTHIn3NS","VBjhzOz8yZ","t98iWiB08l","No0QbCfgr3","x3LDe7hyVv","4dEz6DG4sT","VjCZqFxX9q","Gv3Fqo8Uyd","CK5W7e6e4z","CNHmvP6bcg",
+"55rfBjtn0X","aFFsslweGy","rz7UtYOfrY","nFqikAkKTk","TCgPpY1mC0","brhlQS2Dfu","DcpWBKASQ8","v8yFNTa8f6","uvf7Adjsrv","W7cTsOUqFM",
+"OUYuF0ao3l","LDk6flj07Q","YOfrYVerEA","7lUXZsuY4x","hSSvQuAWyp","lm0pDVerEA","In3NSyToGW","azIWpFPfSE","ogLgcGXdoH","Dz1R3Cp3mZ",
+"pWiOstAOsr","GXdoHrz7Ut","blLA9Gv3Fq","F6PT207n1c","jeskSd85a9","Cp3mZ7fsYM","VNCPdYOfrY","Zv7z0rKDLJ","55rfBb29RJ","M6qcG8RCUA",
+"5Drn0blLA9","CK5W7wiHrZ","Yw2oUSs0Zu","IRh48X6Pin","7ku1pQ6Lix","mz8gxHP433","zQt6QDG4sT","MGlTFd7vjM","ydG8UxXTI4","64s8NzHF1q",
+"jSjS39rlg9","lweGy2Yz7E","v1HlntvdkD","OUqFMdjsrv","zmLYD2DREs","CK5W7rhl0J","TCgPptlILt","VLTy6yEfy9","POUYSuQIcz","Yh1hF9y4lw",
+"WMiS34dEz6","9y4lwbrhlQ","Mkgy8VNCPd","GWqqX1LB1L","D6rByjS1aj","fcwDa2TRI7","8U2nUVBjhz","euZA5uTacx","azIWpSs0Zu","lXFOBBFkb8",
+"618Di2Nslm","v2eC3CIShG","guMb82Yz7E","7hyVv2DREs","azIWpJXljW","Ul4a10BmCy","Cp3mZe6e4z","HzZT8AmdQd","t59lR5Namm","y94nwcShY2",
+"XyPZNuAWyp","5drc6qaofN","tjQxsJ2mQi","KASQ816lHc","Q6hMCRkQke","GXdoHMGlTF","FwEJzRACuj","vLsmSBCxeC","suY4xlH1kt","ZJTXH9rlg9",
+"MaJQsn8pJ9","cL0aE8RCUA","55rfBbrhlQ","4QMc9NOHsz","lCMxyM6qcG","WDVWJMm8si","iB08lAIYUu","9iGoTCK5W7","djsrvVprf2","0ao3l0MR5X",
+"618DiPb1pa","piJSkzQt6Q","QChxsCfgr3","CK5W7sx5Gl","DQimpL7cGc","YjB9tF6PT2","uQIczM3zXL","n8pJ9oVQp6","9XyT9WmadA","OUYuFfqypy",
+"5ZaEzOUYuF","dhSuHNAFuw","djsrvHP433","AgJHQ9y4lw","9rlg9bgJAz","45cIHRACuj","EoToP8U2nU","OUqFMPOUYS","KASQ8LewvM","hE1Ql9XyT9",
+"gtCA5vOqCE","iwzGkoGu6x","RmDcrgf8rI","4W0TlFhtgl","7fKYUGv3Fq","OxWIHsx5Gl","AgJHQhUTw7","IRh48vOqCE","aez9yDz1R3","IBe8khUTw7",
+"BCxeCThjNn","NOHszVprf2","uJScXk85Ae","DLhzMReKEW","1LB1L2DREs","vOqCEQYxC0","EdBKcvOqCE","DcpWBPb1pa","sx5Gl4W0Tl","sx5GlNOHsz",
+"WMiS3zY1GY","yvOMI7fKYU","7X3uyNo0Qb","uN6r3BGaQY","aez9yBCxeC","uvf7AIKxdL","JKWYRrz7Ut","TwanoVBjhz","Gv3FqtAOsr","djsrvuupzk",
+"5drc6MmsIo","3weIFMm8si","5IhmGatef2","NAFuwBGaQY","HRxd8HP433","0KyfssqVrf","CNHmvKr8ys","9rlg9euZA5","o8UyduN6r3","OUqFMVBjhz",
+"8FmFHGv3Fq","29QAzzbIYY","WmadADQimp","rz7UtHfyNQ","Q6hMC29QAz","9GXkXK20wK","Waim6Yw2oU","FwEJzTXQ0Z","dQ58607n1c","FjHXRv8yFN",
+"ECMvUsuY4x","TwanotAOsr","guMb82TRI7","sx5Gl5iGN5","pAhR1cL0aE","CdyBVZUnqt","FhtgluTacx","d85a91LB1L","RkQke5Drn0","pAhR1tjQxs",
+"StlDJe6e4z","5ZaEzEdBKc","zY1GYs93Ml","64s8NoQ87r","G1RhSpT8wu","ksJby5Namm","FPfSElweGy","jiVBPFwEJz","FhtglTa8f6","uPX7GEOE1o",
+"580YDFLsph","5NammOUqFM","StlDJQClRL","IBe8kcQOnv","qUJMdCIShG","KASQ8Pb1pa","lH1ktRsQUq","W3VFHMGlTF","0KyfsRmDcr","iKqhrD6rBy",
+"vkCHHtaOXK","cmXIXzbIYY","L7cGcjzUqR","fcwDaStlDJ","2ZHdkHP433","Yh1hFh1zcH","SbRYyGSQwj","OxWIHuN6r3","prNT64QMc9","MGlTFiwzGk",
+"hE1QldmoS7","xciqp3weIF","ru4UGFVMxo","GSQwjHRxd8","2ZHdk8RCUA","ECMvUCNHmv","MK07YwiHrZ","CdyBVqUJMd","RsQUq29QAz","pmeCdBpYhV",
+"soy9tv2eC3","CNHmvRsQUq","pvgjS618Di","sx5Gll83Ud","GrDg7QbxXc","fLNg8rz7Ut","9iGoT5Namm","1v5hH2Yz7E","uJScXS77LH","NhXdu2hEEU",
+"LewvMix74r","s7MxkQ6hMC","L7cGcRkQke","Yf2Ec8cVD3","JIqXiNo0Qb","7hyVvlH1kt","4dEz6Mkgy8","EoToPHP433","7X3uyguMb8","IRh48S2Dfu",
+"Zv7z0JkzUn","pv0i7vkCHH","X6Pinru4UG","SbRYyReKEW","NcICAI7p2a","NhXdulXFOB","aDGtS55rfB","0YAGHRBhp0","Z4I1vFhtgl","guMb8QssNC",
+"jfREul83Ud","IRh48iqv4k","RzaZAv2eC3","hUTw79iGoT","kZANmRmDcr","QnJ1S2ZHdk","tuDySnnP8o","jSjS3kZANm","pvgjSG1RhS","fLNg88RCUA",
+"yluBxXyPZN","5iGN58RCUA","jzUqREOE1o","5NammYf2Ec","yToGWFnPFB","QWxoTa00b5","cL0aEh1zcH","pv0i7pFrrl","O3iyQn8pJ9","16lHcix74r",
+"zmLYDW7cTs","5VZjSOHaBz","dpe1v8TxD7","MmsIoJXljW","FVMxojeskS","tlILtZUnqt","fLNg85Mg9r","IBe8kWMiS3","WDVWJWreyP","RBhp0SbRYy",
+"qaofNOUYuF","KZamHyvOMI","uAWypGv3Fq","2ZHdkjS1aj","Yh1hFHRxd8","ix74rix74r","pWiOsiB08l","tlILtIRh48","prNT6gtCA5","In3NSbZLvS",
+"WreyPOz8yZ","VIlwPkB5nP","i7WMQlkMUA","LDk6fRkQke","CNHmvnlaBy","7ku1pwDajX","VjCZq3weIF","ZJTXHMK07Y","9rlg9ogLgc","gtCA5QChxs",
+"fmIK15IhmG","8RCUAjeskS","1LB1LcShY2","POUYSVLTy6","RzaZARpBQm","SmGzvReKEW","soy9ts4786","WreyPqaofN","WaWsvxReec","WMiS3WDVWJ",
+"s4786Yw2oU","i3pydF6PT2","YOfrYulk41","gtCA5jfREu","yToGWQClRL","dhSuH6q6L9","Q6hMCStlDJ","64s8NCdyBV","pFrrlCqqaD","lj07QC2Irc",
+"AOgEeDz1R3","uJScXAmdQd","b29RJyvOMI","cmXIXrKDLJ","Z4I1vCIShG","tl72WFcWrW","n8pJ9Qworu","QssNC0PktI","lViBv3weIF","YjB9tlsQGo",
+"RmDcrSjskQ","uvf7AThjNn","v2eC3ix74r","lH1kt4dEz6","CdyBVP6bcg","HlUbFfmIK1","GrDg75drc6","mX2GEbgJAz","oGu6xtAOsr","BpYhVn8pJ9",
+"HzZT8euZA5","Ss0ZupT8wu","lsQGo8TxD7","iB08lFVMxo","4W0TleuZA5","SjskQhSSvQ","0PktIDz1R3","lkMUAtAOsr","AkKTks93Ml","2TRI7W3VFH",
+"M6qcGiKqhr","G1RhSlsQGo","SbRYyNxx9V","uvf7AvLsmS","SWfouQnJ1S","xXTI4WMiS3","i7WMQGSQwj","hi5X7azIWp","8TxD7QssNC","aFFsslCMxy",
+"FnPFBrKDLJ","2hEEUJIqXi","P6bcgAkKTk","zz4ZUFPfSE","Zv7z0NcICA","fqypyiKqhr","I7p2adhSuH","lsQGoNcICA","o8Uydhi5X7","GrDg73weIF",
+"MezSWOUYuF","rz7Ut1v5hH","JXljWmX2GE","WaWsvW3VFH","fcwDad85a9","6AFT0BCxeC","zFgtBpiJSk","Gv3FqBGaQY","guMb8OxWIH","JIqXipv0i7",
+"BGaQYZ4I1v","FGzgpJKWYR","DLhzMzY1GY","QChxs3weIF","9iGoTvkCHH","8FmFHcShY2","DLhzM48cHL","6AFT0mz8gx","aez9yGWqqX","FVMxoOHaBz",
+"S77LHHRxd8","WPmlxbgJAz","9GXkXgdQsS","WmadACfgr3","AIYUuEdBKc","DLhzMY1mC0","EdBKcMezSW","suY4xzY1GY","gdQsS3weIF","EdBKcTCgPp",
+"U3yw5BCxeC","HfyNQAOgEe","GWqqX4dEz6","iwzGkYjB9t","6q6L9RBhp0","hUTw77ku1p","QworuRBhp0","zHF1q6q6L9","pv0i7Nxx9V","s4786IjTwP",
+"BbwgAulk41","Uvlv45drc6","DcpWBhE1Ql","pFrrl5ZaEz","POUYSbZLvS","DQimpOxWIH","No0QbZhwG1","AOgEeYw2oU","EoToPpWiOs","XyPZNlViBv",
+"OHaBzUmaEv","AIYUu0h1b1","RpBQmvLsmS","mX2GEVNCPd","HlUbFv8yFN","LDk6fWMiS3","AmdQdJkzUn","WDVWJVNCPd","OHaBzpiJSk","6AFT0VIlwP",
+"n1pmO5drc6","GSQwjvkCHH","WPmlxvLsmS","2DREsQ6hMC","FPfSEIjTwP","CNHmvpiJSk","ZUnqtjtn0X","2DREsk85Ae","TXQ0Z7fKYU","14FLRCdyBV",
+"IRh48VBjhz","Chuy3VjCZq","kZANmIn3NS","0ao3lG1RhS","45cIHMmsIo","WPmlxP6bcg","kZANmTXQ0Z","9y4lwWaWsv","FLsphDLhzM","PYBf4YjB9t",
+"yluBxP6bcg","JJs5mVprf2","ThjNnGXdoH","P6bcg8U2nU","X6PinIn3NS","fqypyt98iW","lpF6WlsQGo","TXQ0Z2DREs","BbwgAhSSvQ","ydG8U4dEz6",
+"QnJ1SQbxXc","o8Uydru4UG","P6bcgogLgc","ulk41SjskQ","7X3uyIRh48","suY4xMkgy8","a00b5uvf7A","0YAGHCK5W7","rKDLJpAhR1","fcwDaydG8U",
+"24ARFM3zXL","9iGoTatef2","P6bcgaFFss","lkMUA5Namm","ydG8Um4bxU","VNCPdHP433","lCMxySbRYy","e6e4zQssNC","n8pJ9tuDyS","FVMxov1Hln",
+"fcwDafLNg8","IRh48POUYS","DQimpfaHir","jeskSGWqqX","Uvlv4HP433","BpYhVEdBKc","AmdQdCdyBV","yofH3KZamH","8TxD7FnPFB","Dz1R3aL6AJ",
+"iB08lAOgEe","RpBQmWaWsv","yToGWfqypy","C2Irci3pyd","oGu6xMK07Y","M6qcGs7Mxk","uPX7Gv1Hln","pAhR1D6rBy","XyPZNjtn0X","IKxdLKZamH",
+"pFrrlThjNn","Gv3FqYf2Ec","JRJQBaez9y","wDajXSjskQ","KsjRKy94nw","2TRI79eoRc","7Ow5C55rfB","lkMUANo0Qb","UmaEvbZLvS","EOE1oS77LH",
+"cShY2In3NS","zbIYYogLgc","TCgPpDz1R3","ciuWzNo0Qb","ZhwG1e6e4z","F6PT2Pb1pa","HlUbF7fsYM","8RCUALbRTH","9iGoTQWxoT","y94nwHP433",
+"wDajX6q6L9","AkKTk7ku1p","t59lRG1RhS","7X3uyFnPFB","5Nammn8pJ9","2TRI7HlUbF","QworuY1mC0","FcWrWThjNn","BGaQYRxrsm","M3zXLFLsph",
+"POUYSe6e4z","TXQ0ZjiVBP","jS1ajNcICA","WmadABbwgA","Yh1hFrz7Ut","tAOsrMojnP","S77LHuJScX","pmeCdnnP8o","CdyBVVIlwP","8xEKzAIYUu",
+"Qworu0Wr5y","QssNCDQimp","PYBf4k85Ae","VNCPdwiHrZ","Q6LixBCxeC","d85a9n1pmO","MmsIofqypy","yToGWQbxXc","55rfBYh1hF","pv0i707n1c",
+"ni2v1MK07Y","suY4xuTacx","wiHrZlpF6W","VjCZqbgJAz","0BmCyMmKGJ","FVMxorhl0J","jS1ajtuDyS","JKWYRlj07Q","y94nwy94nw","BCxeCvLsmS",
+"Zv7z0nFqik","hE1QlFnPFB","UmaEvfcJOy","v8yFNyluBx","9XyT9lpF6W","HP433M3zXL","lweGyFVMxo","JIqXiMezSW","y94nwzqH0W","cShY2Twano",
+"v8yFNHlUbF","QWxoTWDVWJ","ydG8UP6bcg","NAFuwgjUTu","HP433CdyBV","FPfSE55rfB","TCgPpFhtgl","atef2UmaEv","o8UydD6rBy","jS1ajBFkb8",
+"MmKGJoQ87r","uZPqgm4bxU","FGzgpvOqCE","vOqCEEOE1o","iwzGk2ZHdk","Z4I1vSs0Zu","lH1ktWPmlx","suY4xi7WMQ","7X3uyHzZT8","G1RhSpvgjS",
+"yEfy9FLsph","RBhp0NOHsz","ThjNnprNT6","bgJAzWMiS3","euZA5WreyP","Gv3FqjeskS","7X3uydhSuH","Pb1papvgjS","uN6r39eoRc","Nxx9VQbxXc",
+"KZamHjzUqR","GWqqXYw2oU","qQxHPo8Uyd","9GXkXHfyNQ","cQOnvAIYUu","jtn0XiB08l","mX2GEx3LDe","ix74rMGlTF","Oz8yZzz4ZU","Yf2EcguMb8",
+"lpF6WG1RhS","1LB1Lm4bxU","AOgEeiwzGk","brhlQs4786","M6qcGDQimp","CdyBVAgJHQ","e6e4zVNCPd","hSSvQ2Yz7E","0MR5XCxVEf","suY4xCfgr3",
+"4QMc97fsYM","NhXduFVMxo","UmaEvWaim6","OHaBzSs0Zu","kZANm0ao3l","4W0TlThjNn","Vprf2m4bxU","d7vjMokgRi","dmoS75Drn0","aDGtSS2Dfu",
+"ru4UGmz8gx","jS1ajiKqhr","K4GS8bgJAz","Y1mC0SmGzv","i7WMQt59lR","OxWIHTa8f6","m4bxU3weIF","LbRTH7hyVv","0KyfsMojnP","qQxHP5iGN5",
+"5nmWvCdyBV","BbwgAni2v1","FnPFB1v5hH","HP433Dz1R3","oVQp6guMb8","FGzgp8FmFH","IjTwPKsjRK","lXFOBFwEJz","QbxXcTwano","oVQp61j5L8",
+"QClRLB3qem","yluBxfqypy","y94nwUl4a1","gdQsS1LB1L","0Kyfs8TxD7","5Mg9rXflUq","m4bxUtl72W","oGu6xBpYhV","7Ow5CfFDrJ","FhtglFVMxo",
+"BbwgA29QAz","ZhwG1FPfSE","Z4I1vAXpwE","Vprf22ZHdk","l83UdfaHir","qQxHPzY1GY","EdBKcQ6hMC","TwanoJRJQB","RsQUqy94nw","RzaZAMezSW",
+"lCMxyfLNg8","faHirFNYIM","C2IrcKZamH","soy9tcL0aE","wDajXaL6AJ","X6PinjeskS","a00b5yEfy9","X6Pindjsrv","brhlQQWxoT","pT8wuv2eC3",
+"s4786mX2GE","QworuSmGzv","OUYuFUlU3M","0MR5XIRh48","1j5L8lj07Q","hYBCKv1Hln","xReecbgJAz","zY1GYyluBx","IBe8kn1pmO","i3pydaFFss",
+"gf8rIjiVBP","hi5X7hYBCK","kZANmWaim6","U3yw5QnJ1S","yvOMINcICA","m4bxUNhXdu","lCMxyZ4I1v","24ARFDG4sT","NhXduK4GS8","cmXIXFhtgl",
+"lpF6Wo8Uyd","0PktIAmdQd","zqH0WZuDtD","StlDJfLNg8","l83Uds93Ml","5drc6Rxrsm","LewvMSbRYy","okgRi3otm6","UmaEvRxrsm","M3zXLXflUq",
+"2hEEU0ao3l","3weIFQworu","QnJ1SzFgtB","YOfrYMojnP","AgJHQiB08l","VBjhzY1mC0","y94nwlj07Q","uN6r39XyT9","7lUXZqQxHP","lkMUAQ6hMC",
+"ru4UGzFgtB","tl72WyEfy9","uAWypReKEW","5Drn055rfB","FFDuiix74r","Y1mC05Drn0","oGu6xHlUbF","uPX7Gn8pJ9","MezSW0Wr5y","nFqikyluBx",
+"MmKGJNAFuw","yEfy9soy9t","jtn0XVNCPd","7X3uyzz4ZU","Waim65Namm","kB5nPkB5nP","BGaQY5iGN5","GrDg7M6qcG","xciqpDcpWB","pAhR1Dz1R3",
+"uZPqgBpYhV","nnP8owDajX","s47860PktI","GrDg77fsYM","FcWrWB3qem","HP433Y1mC0","he9IA8FmFH","Vprf2zmLYD","pWiOszY1GY","FcWrWEoToP",
+"0KyfsCxVEf","TXQ0Zi3pyd","pFrrlMojnP","GrDg7ThjNn","Z4I1v7ku1p","SjskQZJTXH","EoToPSs0Zu","soy9tYOfrY","MGlTFSWfou","s93MljfREu",
+"FjHXRlViBv","aFFssi3pyd","jtn0XaDGtS","QChxstl72W","5ZaEzRACuj","XflUqAXpwE","9rlg9pT8wu","GSQwjqaofN","b29RJAgJHQ","bgJAzjS1aj",
+"0PktI0MR5X","MGlTFFwEJz","Chuy3VBjhz","xReecQClRL","zY1GYlViBv","Cfgr3okgRi","ru4UGIRh48","WPmlxNOHsz","WMiS3Gv3Fq","NOHszjeskS",
+"bgJAzfLNg8","s7MxkjiVBP","EdBKc48cHL","dhSuH2ZHdk","pAhR1uvf7A","blLA9hYBCK","oGu6x0Kyfs","okgRiZUnqt","RkQkelj07Q","RpBQmZzJHW",
+"W7cTsuvf7A","W3VFHt59lR","K20wKZuDtD","gf8rIFjHXR","D6rBylm0pD","8TxD7RzaZA","IRh48ReKEW","euZA5Ta8f6","Chuy34QMc9","KsjRKPb1pa",
+"pmeCd0YAGH","0Wr5yS77LH","2NslmuZPqg","TCgPpFVMxo","HfyNQIRh48","yluBxNAFuw","FnPFBs4786","Ss0ZuOUqFM","aFFssuLtKs","XyPZNlpF6W",
+"fFDrJCNHmv","fcwDa8U2nU","tvdkDZUnqt","aFFssd85a9","M3zXL7fsYM","cL0aEEoToP","7ku1pLewvM","DG4sTLbRTH","MmKGJWreyP","U3yw5o8Uyd",
+"Yw2oU7hyVv","AgJHQ580YD","AOgEe6AFT0","5Mg9rEoToP","t98iWjSjS3","48cHLs7Mxk","FxX9qh1zcH","EOE1ol83Ud","Uvlv4tjQxs","Ss0Zu0BmCy",
+"yvOMIuLtKs","K4GS8gf8rI","IRh48okgRi","0Kyfs2Yz7E","8xEKzprNT6","kZANmWmadA","okgRiSbRYy","lCMxy0BmCy","AOgEenFqik","2Yz7EYOfrY",
+"24ARFlH1kt","IjTwPHP433","pv0i7Mkgy8","VerEASjskQ","e6e4zVBjhz","Oz8yZRxrsm","Cfgr3WmadA","GSQwjJ2mQi","OHaBza00b5","M3zXLBpYhV",
+"QChxsLDk6f","pmeCdDLhzM","aDGtSv1Hln","FnPFBUlU3M","jS1ajtlILt","bgJAzpv0i7","ksJbylweGy","J2mQi8U2nU","kB5nPaDGtS","gtCA5U3yw5",
+"MojnP0Wr5y","d7vjM8TxD7","Yw2oUv8yFN","tAOsrPYBf4","iqv4kydG8U","Q6LixYOfrY","K20wKRkQke","azIWpe6e4z","l83UdFhtgl","BFkb8HzZT8",
+"WMiS3yofH3","Q6Lixxciqp","x3LDepvgjS","0BmCyAmdQd","Yh1hFFPfSE","9eoRcxXTI4","aDGtSRkQke","6AFT0oVQp6","iKqhrSs0Zu","Pb1paCqqaD",
+"pvgjSFxX9q","JXljWuQIcz","qaofNF6PT2","suY4xlweGy","OxWIHjfREu","pWiOsEdBKc","2NslmNo0Qb","xReechYBCK","ix74rUlU3M","zHF1qGWqqX",
+"G1RhSVprf2","55rfB9y4lw","LbRTHUl4a1","9iGoTix74r","XyPZNY1mC0","lViBvpmeCd","DcpWBwiHrZ","ReKEW5ZaEz","8cVD3AOgEe","No0QbiB08l",
+"FxX9q9iGoT","rKDLJ5IhmG","QYxC0xReec","xXTI4EoToP","NOHszUmaEv","t98iWfLNg8","U3yw5NOHsz","uvf7AydG8U","pAhR1Mkgy8","RzaZACIShG",
+"m4bxUpFrrl","RzaZAKZamH","Ul4a1mz8gx","Q6hMCWmadA","WMiS3ECMvU","rhl0Julk41","MmKGJYOfrY","HRxd8D6rBy","lViBvFPfSE","oQ87rQWxoT",
+"a00b5dpe1v","hSSvQAXpwE","KsjRKdmoS7","hUTw7HRxd8","zFgtBNOHsz","uZPqgBFkb8","FwEJzmX2GE","zqH0WRsQUq","9GXkXVjCZq","FGzgp64s8N",
+"Waim6G1RhS","zHF1qtaOXK","5iGN5zFgtB","yToGWh1zcH","8TxD7bgJAz","mz8gx8cVD3","AmdQd2TRI7","JJs5msx5Gl","kZANmbgJAz","9eoRcW7cTs",
+"F6PT2MK07Y","yofH3MezSW","aDGtSxReec","JJs5mnlaBy","vLsmShYBCK","0KyfsZUnqt","8FmFH16lHc","jtn0XVjCZq","FxX9q9GXkX","5iGN5dQ586",
+"s93MlqUJMd","EoToP55rfB","2DREsEoToP","4QMc9U3yw5","CqqaDHlUbF","lH1ktVBjhz","FPfSEChuy3","zFgtBQYxC0","Zv7z0MojnP","4dEz6hi5X7",
+"J2mQisuY4x","7fsYMFnPFB","3weIFWaWsv","JKWYRUlU3M","9iGoTZzJHW","9iGoTM6qcG","uvf7ALbRTH","Uvlv49iGoT","cL0aE7fKYU","QChxs1LB1L",
+"tuDySZuDtD","iwzGkuN6r3","5NammUlU3M","5Mg9r618Di","prNT624ARF","BFkb80PktI","s7MxkfmIK1","RBhp0KZamH","WDVWJlsQGo","m4bxUECMvU",
+"Ul4a1pv0i7","azIWp7Ow5C","0PktIOHaBz","TXQ0ZtjQxs","JRJQByluBx","wDajXs93Ml","JkzUnyvOMI","a00b5qQxHP","QClRLkZANm","LDk6fGv3Fq",
+"hUTw7TCgPp","FGzgpGv3Fq","HRxd87fKYU","djsrv4W0Tl","ydG8U7Ow5C","TXQ0ZtaOXK","ZUnqtVjCZq","MK07YuN6r3","s93Mlsx5Gl","ni2v1Pb1pa",
+"UmaEv8RCUA","Pb1paRkQke","TCgPpHfyNQ","NAFuwuAWyp","dQ5865ZaEz","RpBQmTa8f6","pAhR1EOE1o","EdBKcVIlwP","s93MlUvlv4","55rfBB3qem",
+"i3pyd5Mg9r","dpe1vzY1GY","QClRL5VZjS","G1RhSmX2GE","UmaEvvOqCE","s93MleuZA5","Dz1R3nnP8o","2DREsAIYUu","SWfouo8Uyd","iB08lbZLvS",
+"0ao3l0ao3l","ydG8UZv7z0","NOHsztAOsr","POUYSxciqp","RzaZA07n1c","7lUXZBbwgA","yvOMIv1Hln","ZuDtDyvOMI","LDk6fIjTwP","W3VFH5iGN5",
+"kZANmpAhR1","lpF6W7X3uy","RxrsmFVMxo","QnJ1SjiVBP","JkzUnU3yw5","7X3uyzqH0W","MGlTFDG4sT","IBe8kRmDcr","FwEJzVNCPd","IjTwPxciqp",
+"fcwDaNxx9V","CdyBVWMiS3","0h1b12hEEU","9iGoT7X3uy","G1RhSMGlTF","5Mg9r5iGN5","No0Qb5VZjS","618DipvgjS","EOE1o9XyT9","RzaZAJJs5m",
+"9y4lwyEfy9","i3pydpWiOs","B3qemiwzGk","qaofNVLTy6","AgJHQprNT6","580YDQbxXc","aez9yjzUqR","Ss0ZuVerEA","yofH3HlUbF","hUTw7xXTI4",
+"SWfouC2Irc","zFgtBBpYhV","Y1mC09GXkX","iqv4klsQGo","AmdQdbgJAz","tl72WWmadA","FjHXRa00b5","48cHLZzJHW","AgJHQHlUbF","F6PT2d7vjM",
+"4dEz6aDGtS","K4GS8jeskS","9eoRcHP433","45cIHYf2Ec","IBe8kUvlv4","lViBvgtCA5","8RCUARmDcr","jiVBPpAhR1","X6PinjzUqR","tjQxspv0i7",
+"IjTwPkB5nP","4QMc9pFrrl","dmoS7Yh1hF","rhl0Jd85a9","K20wKcL0aE","S2DfuM3zXL","lViBv618Di","WMiS37ku1p","RACujfaHir","JKWYRcmXIX",
+"HlUbF7hyVv","9y4lwulk41","0PktIECMvU","1j5L8W7cTs","ZuDtDECMvU","FLsphRzaZA","K4GS8AmdQd","BFkb8Ul4a1","S77LHb29RJ","Cp3mZs4786",
+"FjHXRxciqp","BbwgAWDVWJ","cShY21j5L8","RBhp0pT8wu","sqVrfRBhp0","Vprf2uQIcz","xReecQssNC","07n1cRACuj","7fKYU0ao3l","In3NSEOE1o",
+"pT8wuo8Uyd","hUTw7YjB9t","UlU3McShY2","CK5W7djsrv","Dz1R3BpYhV","n8pJ948cHL","QworuSbRYy","AOgEeQworu","suY4x5VZjS","GSQwjhUTw7",
+"guMb8VLTy6","BbwgA4W0Tl","OUqFMFxX9q","sx5GlbgJAz","4dEz6kB5nP","ix74rtuDyS","dQ5862ZHdk","tl72WgIYvE","IBe8kAIYUu","ni2v1YjB9t",
+"zz4ZUECMvU","OHaBzjfREu","blLA9SbRYy","Mkgy8GSQwj","oVQp6uLtKs","vLsmSaFFss","Z4I1v7Ow5C","uAWyp7hyVv","yofH3FnPFB","2NslmRkQke",
+"Ss0ZuChuy3","07n1cYw2oU","L7cGcFnPFB","Z4I1vWaim6","StlDJtAOsr","5iGN5WreyP","DQimp9GXkX","JKWYRMaJQs","t59lRkB5nP","aL6AJMezSW",
+"ru4UGNOHsz","hSSvQt59lR","WMiS3uZPqg","ogLgclpF6W","W3VFHyToGW","U3yw5gjUTu","DLhzMSWfou","aDGtS7ku1p","SjskQMGlTF","IBe8kzz4ZU",
+"jtn0Xsoy9t","2Nslm7ku1p","RxrsmVNCPd","29QAzMmKGJ","zHF1qwiHrZ","IRh48t59lR","OHaBzgjUTu","suY4xFFDui","NOHszv1Hln","djsrvqQxHP",
+"gf8rIMmsIo","v2eC37X3uy","v2eC3jS1aj","Rxrsm8RCUA","gIYvERBhp0","s7Mxk5Mg9r","pAhR1hSSvQ","HP4338xEKz","07n1c7fsYM","cQOnvbrhlQ",
+"piJSkBCxeC","uupzkFjHXR","oGu6xOz8yZ","lsQGohE1Ql","9XyT9jiVBP","5IhmGIRh48","FGzgpuN6r3","NAFuwQnJ1S","MojnP64s8N","oQ87rmz8gx",
+"OHaBzOxWIH","lsQGoFPfSE","DG4sTt59lR","JIqXihSSvQ","0YAGHZv7z0","lj07QQ6Lix","zHF1qhUTw7","9rlg92hEEU","ZhwG17fsYM","djsrvnnP8o",
+"uPX7GyToGW","OHaBzqUJMd","uQIczprNT6","pmeCdjSjS3","yluBx7X3uy","sx5GlMkgy8","LDk6fydG8U","YOfrYNo0Qb","FxX9qC2Irc","FcWrWFVMxo",
+"Nxx9VaL6AJ","k85AeSWfou","2ZHdkjfREu","AIYUupWiOs","pv0i77fsYM","C2Irc2Nslm","FcWrWMaJQs","K20wKtAOsr","In3NSn8pJ9","OUYuFyToGW",
+"5drc67lUXZ","Ss0Zu8RCUA","soy9tHRxd8","brhlQvkCHH","FFDuis93Ml","yEfy9iKqhr","atef2fcJOy","CxVEf5drc6","FcWrWRsQUq","5ZaEzfLNg8",
+"he9IAa00b5","m4bxUWMiS3","ECMvUAXpwE","azIWpJ2mQi","AXpwEjeskS","ThjNnmz8gx","5Mg9rC2Irc","5Mg9rgjUTu","5IhmGQ6Lix","hSSvQRACuj",
+"8U2nUvLsmS","azIWpCIShG","8RCUAyluBx","1j5L8Dz1R3","ksJbyKZamH","DQimpRpBQm","OxWIHVIlwP","fcwDaCdyBV","RsQUqx3LDe","uJScXfcJOy",
+"xReec9iGoT","AgJHQjzUqR","Yh1hF5Drn0","K4GS8uupzk","aL6AJlpF6W","fmIK17Ow5C","Gv3FqBCxeC","oGu6xMezSW","atef2I7p2a","yofH3brhlQ",
+"lH1ktLDk6f","EoToPM3zXL","rKDLJ0Wr5y","BpYhVS77LH","JKWYRNcICA","blLA9K4GS8","dQ586S77LH","5NammL7cGc","prNT6xciqp","CxVEf4dEz6",
+"DG4sT0h1b1","ZzJHWfaHir","nlaBylH1kt","yluBx9y4lw","v2eC3WmadA","tvdkDYf2Ec","B3qemrz7Ut","JkzUnFFDui","ix74r3weIF","RsQUqMm8si",
+"jtn0XMojnP","1v5hHeuZA5","fLNg8y94nw","jS1ajNOHsz","4dEz6K20wK","8U2nUY1mC0","TCgPpRACuj","yEfy9dhSuH","WreyPZzJHW","zHF1qM6qcG",
+"rKDLJ6AFT0","x3LDegf8rI","tuDyS618Di","S77LHMkgy8","kB5nPksJby","VjCZqhSSvQ","xciqpdjsrv","In3NSpWiOs","16lHcQYxC0","29QAzMm8si",
+"t98iWtAOsr","yluBxMaJQs","5drc6StlDJ","7Ow5CFVMxo","IBe8kpvgjS","GSQwjtl72W","cShY2IjTwP","FVMxoPYBf4","POUYSQworu","RpBQmuvf7A",
+"iB08lvkCHH","tl72WtuDyS","QssNCMkgy8","uJScXNxx9V","fmIK1m4bxU","cL0aENxx9V","IjTwPVjCZq","sqVrfRsQUq","hE1Qli7WMQ","FwEJz24ARF",
+"UlU3MUmaEv","8U2nUdjsrv","No0QbCqqaD","dpe1v0Wr5y","PYBf4Q6Lix","7fsYMguMb8","0BmCyZv7z0","s7MxkVLTy6","Ul4a1QClRL","7lUXZm4bxU",
+"ZhwG1b29RJ","8hJdtzbIYY","gtCA58cVD3","MmsIov2eC3","16lHca00b5","Q6LixCNHmv","WaWsvPYBf4","zFgtBtlILt","ogLgcCxVEf","K4GS83otm6",
+"uAWypCp3mZ","brhlQrKDLJ","jSjS3tlILt","FcWrWCK5W7","soy9tix74r","gf8rIzqH0W","qUJMdyluBx","JJs5mJKWYR","pAhR19y4lw","MezSWuAWyp",
+"5NammThjNn","FGzgpQnJ1S","9y4lwQssNC","AIYUuUmaEv","ix74rgdQsS","XflUqDG4sT","n1pmO2TRI7","s4786ThjNn","pAhR15drc6","gtCA50Wr5y",
+"FjHXRcL0aE","oQ87r4dEz6","hi5X7d7vjM","s93MlbrhlQ","rz7UtzQt6Q","BpYhVPYBf4","ni2v1DQimp","JXljWyofH3","uupzkfqypy","t59lRZuDtD",
+"VLTy6ZhwG1","wDajX618Di","pv0i7LewvM","aFFssJkzUn","WDVWJYw2oU","lweGy580YD","Chuy3WDVWJ","wDajXUmaEv","SmGzvGSQwj","Gv3FqkZANm",
+"Ta8f6Yw2oU","XflUqqQxHP","uPX7G0MR5X","29QAz9rlg9","U3yw5Yf2Ec","FGzgpt98iW","CqqaDuPX7G","6q6L9lkMUA","prNT68xEKz","7ku1pEOE1o",
+"fLNg8K4GS8","J2mQiCp3mZ","xciqpi3pyd","7fKYURACuj","DG4sTSbRYy","tuDySlH1kt","lsQGoWreyP","16lHcprNT6","618DiguMb8","lpF6We6e4z",
+"2TRI7suY4x","SmGzvaDGtS","piJSkJXljW","8TxD7QChxs","5iGN54W0Tl","zbIYYvOqCE","P6bcgoGu6x","pv0i7qaofN","RACujOUYuF","8FmFHlH1kt",
+"Yw2oUjfREu","zmLYDRBhp0","9GXkXtlILt","uQIczuJScX","HzZT8jeskS","J2mQiLDk6f","ciuWzOz8yZ","bZLvSTCgPp","QWxoTpvgjS","8cVD3nnP8o",
+"XflUqrKDLJ","B3qempmeCd","7lUXZjiVBP","blLA9lXFOB","3otm68xEKz","tAOsrciuWz","Mm8si8xEKz","JJs5m5iGN5","i7WMQJJs5m","PYBf4AkKTk",
+"Fhtgls93Ml","tAOsreuZA5","oGu6xqUJMd","5VZjSnnP8o","uupzkcQOnv","2hEEUl83Ud","euZA5WDVWJ","4W0TlL7cGc","HP433hi5X7","jeskSNcICA",
+"t98iWAmdQd","0ao3l7Ow5C","Cp3mZSbRYy","jfREui3pyd","MmsIoMmsIo","BCxeClpF6W","blLA98xEKz","JkzUn6AFT0","uPX7GCqqaD","RACujW7cTs",
+"vLsmSW3VFH","dQ586l83Ud","FVMxokB5nP","XyPZNZhwG1","brhlQcL0aE","RzaZAs93Ml","jeskS45cIH","Yf2EcaFFss","nnP8oe6e4z","F6PT2pAhR1",
+"Pb1pakZANm","WmadAuupzk","DLhzMv8yFN","aFFsssoy9t","s7Mxk2Nslm","AmdQdYh1hF","CdyBVd7vjM","i3pydGSQwj","aDGtSkZANm","6AFT0W3VFH",
+"9XyT98xEKz","XflUq4dEz6","BFkb8uvf7A","QWxoTIKxdL","EdBKcQbxXc","x3LDeAIYUu","hi5X7FVMxo","WMiS3he9IA","Mkgy8wDajX","lXFOBReKEW",
+"L7cGclweGy","C2IrcRxrsm","7X3uyThjNn","No0QbIn3NS","lpF6Waez9y","s4786v2eC3","MGlTFpv0i7","BGaQYTXQ0Z","tlILtS2Dfu","mX2GEQ6Lix",
+"hSSvQpmeCd","FLsphbgJAz","aL6AJfqypy","jtn0Xx3LDe","5Mg9r1LB1L","tlILt3otm6","t98iWn8pJ9","Oz8yZS2Dfu","hYBCK29QAz","YjB9tm4bxU",
+"lweGyuupzk","EoToPuPX7G","VIlwPTwano","6q6L9uZPqg","zFgtBRpBQm","5Mg9rW7cTs","RzaZAAgJHQ","AgJHQGSQwj","qUJMdoVQp6","lkMUAlViBv",
+"RBhp0HRxd8","FGzgpSs0Zu","djsrvix74r","wiHrZdjsrv","aez9y1LB1L","2NslmxXTI4","M6qcGvOqCE","Z4I1vNAFuw","lm0pDMojnP","xXTI41LB1L",
+"Oz8yZd85a9","5IhmGEdBKc","QbxXcFPfSE","5NammLbRTH","v1HlnGWqqX","2TRI7lj07Q","v1HlnVprf2","1LB1L9GXkX","8U2nU9eoRc","KZamHJIqXi",
+"iwzGk8cVD3","qUJMdIBe8k","dpe1vbZLvS","6q6L9Qworu","QWxoT7ku1p","pv0i7atef2","taOXK0BmCy","ZzJHW29QAz","taOXKaez9y","hYBCKJXljW",
+"xciqpWaWsv","JKWYR9iGoT","v2eC3AgJHQ","FVMxolm0pD","iwzGkVIlwP","AgJHQsoy9t","DQimpkZANm","YjB9tn1pmO","LewvMvOqCE","LbRTHk85Ae",
+"FxX9qG1RhS","KsjRKfmIK1","5VZjS7hyVv","ciuWzlsQGo","jfREum4bxU","KZamH14FLR","jzUqR2hEEU","RmDcrFFDui","zqH0WZUnqt","VNCPdJKWYR",
+"HfyNQ5drc6","DQimpAOgEe","v2eC3OUqFM","B3qemJIqXi","uLtKsiqv4k","NcICAi7WMQ","M3zXL7hyVv","m4bxUuZPqg","vOqCElsQGo","48cHLiqv4k",
+"fFDrJNcICA","vOqCEJ2mQi","s7MxkPb1pa","In3NSFLsph","fFDrJmz8gx","fmIK1jS1aj","lkMUAGSQwj","wDajXRkQke","zz4ZUazIWp","MGlTFQworu",
+"SjskQd7vjM","DcpWBBpYhV","azIWpmX2GE","MGlTFnnP8o","FGzgpK4GS8","uvf7ANcICA","O3iyQ9GXkX","7hyVvd85a9","J2mQi2hEEU","MojnPKASQ8",
+"4QMc90YAGH","Cfgr36AFT0","jS1ajQWxoT","O3iyQqUJMd","aez9yWaWsv","lsQGoRsQUq","ru4UGFnPFB","ThjNnMojnP","cmXIXAXpwE","lweGy2Nslm",
+"JKWYRjiVBP","jiVBPnlaBy","FFDuiwiHrZ","FVMxoFNYIM","PYBf4GXdoH","UmaEv48cHL","HzZT8Dz1R3","hYBCKWaWsv","h1zcHcQOnv","QnJ1SJKWYR",
+"aL6AJt59lR","DG4sTWDVWJ","soy9tHzZT8","IjTwP5Drn0","faHirIn3NS","QChxsd85a9","5Mg9rcShY2","LDk6fRBhp0","F6PT23otm6","m4bxUQworu",
+"WDVWJAXpwE","jeskSBCxeC","bZLvSRkQke","WDVWJmz8gx","QYxC07lUXZ","M3zXLG1RhS","IKxdLG1RhS","pWiOsW7cTs","bgJAzksJby","Yf2Ec6q6L9",
+"7Ow5CKsjRK","m4bxU9XyT9","hSSvQ6AFT0","4dEz6StlDJ","pT8wuRpBQm","Yf2EcPYBf4","ZzJHWqQxHP","RBhp0ZUnqt","2ZHdkCK5W7","qUJMdaez9y",
+"5NammcL0aE","No0QbfcJOy","618DitAOsr","4QMc98cVD3","s4786sx5Gl","Gv3FqReKEW","sx5GlaL6AJ","uLtKsTwano","zY1GYYh1hF","blLA9gdQsS",
+"Ta8f6MmKGJ","Z4I1v7hyVv","xReeckZANm","Q6LixZzJHW","pv0i7yvOMI","5nmWvhSSvQ","v1HlnkB5nP","QYxC0VBjhz","Dz1R3Yf2Ec","FxX9qUl4a1",
+"JIqXi55rfB","lweGy1LB1L","U3yw5lpF6W","XflUqZ4I1v","tl72WMaJQs","uPX7G5Drn0","24ARFs93Ml","ogLgc7fKYU","guMb8DQimp","EoToPogLgc",
+"C2IrcRBhp0","ogLgcFwEJz","G1RhSUlU3M","cmXIXEoToP","IKxdLv2eC3","MGlTFfmIK1","AgJHQhYBCK","uAWypZzJHW","aL6AJFjHXR","Kr8ysOUYuF",
+"MezSWokgRi","vkCHHbrhlQ","3otm6cQOnv","Yw2oUwiHrZ","RzaZAzmLYD","aFFssQbxXc","dmoS748cHL","fLNg8TXQ0Z","RpBQmoGu6x","QworugtCA5",
+"No0Qbhe9IA","yvOMI7Ow5C","Yw2oUydG8U","EOE1o7X3uy","l83UduQIcz","RzaZAl83Ud","zFgtB2ZHdk","FhtgllH1kt","zqH0WXflUq","In3NSjSjS3",
+"d85a9Y1mC0","5NammGv3Fq","cQOnvLDk6f","2NslmogLgc","tjQxsqUJMd","3otm68FmFH","vOqCEWaim6","4QMc92Yz7E","5Drn00BmCy","5iGN5EOE1o",
+"zbIYY4dEz6","bZLvSUvlv4","D6rByv8yFN","cL0aE0h1b1","G1RhStvdkD","NAFuwdjsrv","uTacxbgJAz","uZPqgdmoS7","d85a9WMiS3","5iGN5UlU3M",
+"iqv4kTa8f6","OUqFMulk41","5nmWvEdBKc","BGaQYs7Mxk","pv0i7m4bxU","gtCA5lkMUA","hSSvQ8TxD7","MmsIoZv7z0","TCgPpB3qem","aL6AJF6PT2",
+"jeskSuTacx","soy9tU3yw5","MK07YkB5nP","In3NS7fsYM","Ul4a1Ta8f6","taOXKZzJHW","BbwgAMK07Y","okgRizY1GY","FLsphZuDtD","0Kyfsa00b5",
+"1v5hHlCMxy","brhlQ0Wr5y","MmKGJ8cVD3","GWqqXdjsrv","fFDrJFjHXR","qUJMdReKEW","fqypy0YAGH","d85a9BGaQY","Pb1palkMUA","C2IrcQworu",
+"i7WMQW3VFH","tvdkDogLgc","8RCUAvkCHH","MK07YgdQsS","zY1GYQ6Lix","QssNCGSQwj","t98iWDG4sT","Cfgr3n8pJ9","1LB1LGv3Fq","i7WMQpvgjS",
+"hYBCK7fKYU","SmGzvd85a9","IjTwPBCxeC","wiHrZBpYhV","0Wr5ylm0pD","he9IAXyPZN","pAhR18U2nU","QnJ1S1j5L8","oVQp6YOfrY","FFDui4QMc9",
+"Mkgy87fKYU","iKqhr7hyVv","XyPZNpFrrl","EOE1o2hEEU","b29RJ8RCUA","QworuMm8si","No0QbXflUq","RmDcrYOfrY","CIShGRzaZA","gtCA5tvdkD",
+"n1pmOQ6Lix","uLtKs24ARF","nlaByzQt6Q","1v5hHaDGtS","FjHXR8FmFH","2hEEU8RCUA","ReKEWpFrrl","WDVWJ48cHL","5VZjSQbxXc","jS1ajCIShG",
+"guMb8GWqqX","rKDLJ2Yz7E","t59lRzqH0W","jfREucQOnv","FGzgps4786","WMiS3HfyNQ","yluBxguMb8","6AFT029QAz","CK5W7ru4UG","55rfBC2Irc",
+"k85Aegf8rI","VLTy6zQt6Q","LewvMaez9y","FPfSEzqH0W","GrDg7aez9y","t98iWh1zcH","VjCZqtuDyS","hi5X7LewvM","uQIczvkCHH","yluBxqaofN",
+"4dEz6RACuj","lViBvStlDJ","2Yz7ECIShG","5drc6jzUqR","M3zXLlViBv","m4bxUI7p2a","uZPqgQYxC0","BpYhVDcpWB","EoToP5VZjS","dhSuHAXpwE",
+"UmaEvguMb8","ogLgc8RCUA","FLsphpT8wu","5drc69eoRc","POUYS5drc6","uTacxt59lR","ZUnqtm4bxU","t98iWyofH3","zQt6Qm4bxU","guMb8CqqaD",
+"jfREu5iGN5","i3pydpT8wu","S77LH9iGoT","BbwgAJKWYR","C2IrctjQxs","nlaByQ6hMC","xciqpwDajX","uvf7A6q6L9","zbIYYv2eC3","VerEAFxX9q",
+"lpF6WBbwgA","M6qcGCxVEf","sx5GlCNHmv","lsQGoazIWp","5IhmGzFgtB","lsQGojtn0X","qQxHPZUnqt","pFrrlh1zcH","Y1mC0ZuDtD","tAOsrNcICA",
+"gdQsSXyPZN","O3iyQpAhR1","gf8rI618Di","RBhp0iwzGk","euZA50ao3l","MmsIo0YAGH","jzUqRtuDyS","SmGzvZJTXH","lXFOB9eoRc","yluBxjfREu",
+"Q6Lix5Namm","MmsIoxciqp","tvdkDuZPqg","RBhp0yluBx","l83Ud2ZHdk","8RCUAWMiS3","k85AeJkzUn","FxX9qCK5W7","MmKGJYw2oU","SbRYyM6qcG",
+"FxX9qOUqFM","DcpWB1LB1L","K20wKuZPqg","a00b5Ta8f6","guMb8uLtKs","fFDrJaL6AJ","VLTy6lXFOB","ReKEWb29RJ","Chuy3VNCPd","dhSuHyToGW",
+"U3yw5lXFOB","JkzUntaOXK","7fsYM0h1b1","taOXKpmeCd","uvf7A2hEEU","ZJTXHbZLvS","J2mQimX2GE","HP433Kr8ys","gIYvEMojnP","fmIK1wDajX",
+"MmKGJStlDJ","K4GS8LDk6f","zz4ZUMmsIo","45cIHJRJQB","pWiOs3weIF","TwanoJ2mQi","07n1cMezSW","CdyBVn8pJ9","8RCUA7ku1p","zY1GYlkMUA",
+"hE1QllkMUA","CdyBV580YD","zmLYDCNHmv","tlILt5nmWv","AkKTkFjHXR","hE1QlDG4sT","RxrsmWaWsv","2hEEUCfgr3","WPmlxyToGW","mz8gxIn3NS",
+"I7p2aWmadA","oVQp6uTacx","NOHsztlILt","tlILtRmDcr","BbwgAoQ87r","POUYScL0aE","ix74r9eoRc","U3yw5pAhR1","aDGtSix74r","suY4xDcpWB",
+"EoToPciuWz","yEfy9l83Ud","64s8NyvOMI","Nxx9VGXdoH","yToGWhYBCK","W7cTsoGu6x","fqypyQWxoT","U3yw5aDGtS","7ku1puLtKs","QChxss93Ml",
+"pmeCdfqypy","Yw2oUFVMxo","ydG8UuTacx","8xEKzm4bxU","DcpWBm4bxU","QssNCZzJHW","djsrvpv0i7","l83Ud4dEz6","he9IAiB08l","Zv7z0FwEJz",
+"1LB1L0MR5X","nlaBy7X3uy","SbRYyFjHXR","ix74rs93Ml","C2IrcEdBKc","VIlwPZv7z0","GrDg7tlILt","SWfouuN6r3","9iGoTpWiOs","LDk6feuZA5",
+"BbwgA24ARF","okgRiWaim6","2ZHdkBGaQY","VerEABFkb8","FLsphZhwG1","2Yz7EWPmlx","gdQsSJkzUn","ogLgcIn3NS","2hEEU6AFT0","uoStwpvgjS",
+"oGu6xsoy9t","lsQGoIjTwP","jS1ajaDGtS","vkCHHWaWsv","29QAzpiJSk","tAOsruAWyp","In3NSFxX9q","d85a9AOgEe","Q6LixwiHrZ","2hEEUD6rBy",
+"No0QbGWqqX","okgRiB3qem","Vprf2y94nw","fqypyCxVEf","JkzUnMezSW","NcICAiqv4k","lsQGolweGy","MojnP7ku1p","QYxC00PktI","7fsYMDLhzM",
+"JIqXi580YD","45cIHyEfy9","aL6AJBFkb8","U3yw5EdBKc","dpe1v9y4lw","fcwDay94nw","ZJTXHLbRTH","zQt6QAOgEe","ZhwG1ECMvU","D6rByMmKGJ",
+"NAFuwM3zXL","hE1Ql1v5hH","K4GS8tjQxs","tAOsrWDVWJ","Uvlv4Rxrsm","tvdkDOxWIH","OUqFMokgRi","guMb88xEKz","atef2EdBKc","aL6AJTa8f6",
+"t59lRJkzUn","pv0i76AFT0","2Yz7EpFrrl","MmKGJhi5X7","FcWrWaL6AJ","fFDrJ2hEEU","o8UydIjTwP","FNYIMjfREu","AgJHQS2Dfu","G1RhSYjB9t",
+"djsrvUlU3M","uN6r3AkKTk","oGu6x29QAz","zmLYDsoy9t","uAWyppvgjS","SbRYyh1zcH","uQIczhe9IA","In3NSuZPqg","29QAz7ku1p","guMb86q6L9",
+"iqv4kaDGtS","UmaEvGXdoH","0h1b1NhXdu","BpYhV7Ow5C","b29RJQworu","ZUnqtiwzGk","piJSkhe9IA","BCxeCRkQke","sx5GlRxrsm","Yf2EcVNCPd",
+"rKDLJfFDrJ","P6bcguJScX","lweGyjiVBP","IKxdLmX2GE","BCxeCh1zcH","5drc6pWiOs","t98iW2DREs","aL6AJ5Mg9r","xReecuQIcz","wiHrZlH1kt",
+"NOHszJJs5m","lH1ktOUYuF","5drc6tvdkD","b29RJG1RhS","SjskQOUYuF","JJs5mGWqqX","K4GS8RsQUq","5VZjSBGaQY","KsjRKm4bxU","ogLgcPb1pa",
+"G1RhSjiVBP","29QAzsoy9t","8xEKz6q6L9","KZamHGXdoH","l83UdFFDui","FFDuilj07Q","KsjRKaFFss","XflUqZUnqt","mX2GEb29RJ","ReKEWuoStw",
+"DcpWBAXpwE","WaWsvOUYuF","nlaByaFFss","lViBvsqVrf","Yw2oUgf8rI","lViBvjSjS3","KsjRKS2Dfu","QssNCFVMxo","mX2GEfFDrJ","MK07Y16lHc",
+"aFFssVIlwP","iB08lAkKTk","iKqhrGXdoH","jiVBP7Ow5C","pT8wuMaJQs","tvdkDx3LDe","m4bxUuTacx","NAFuwuZPqg","EOE1oF6PT2","prNT6dhSuH",
+"nFqikWMiS3","hSSvQAkKTk","Nxx9V7lUXZ","vLsmSM3zXL","HlUbFxReec","Yf2EcFnPFB","7hyVvvOqCE","l83UduoStw","C2IrciKqhr","l83Ud8FmFH",
+"9XyT9t59lR","F6PT2qUJMd","tjQxso8Uyd","C2IrcChuy3","OxWIHDz1R3","h1zcHpmeCd","8FmFH5Drn0","tAOsraDGtS","bZLvSMGlTF","VLTy6DQimp",
+"StlDJ8xEKz","C2Irculk41","0MR5X7hyVv","4dEz6ZUnqt","soy9t7X3uy","d7vjMlXFOB","1v5hH4W0Tl","zFgtBuLtKs","jzUqR5Drn0","fFDrJRBhp0",
+"yluBx29QAz","0YAGHXflUq","8FmFHlm0pD","Chuy3iKqhr","HRxd8BGaQY","uQIczlViBv","lm0pDmX2GE","SjskQGv3Fq","RzaZAP6bcg","M3zXL16lHc",
+"ulk417ku1p","TXQ0ZQWxoT","8RCUAS77LH","HzZT8azIWp","8TxD71j5L8","Vprf2x3LDe","7fsYMCqqaD","ogLgcRxrsm","AXpwEk85Ae","S77LHQYxC0",
+"cL0aEazIWp","QworuzbIYY","wiHrZaL6AJ","he9IAlCMxy","yToGW1v5hH","Yh1hFVNCPd","FhtgluZPqg","k85AeGSQwj","aFFssZUnqt","7fsYMuN6r3",
+"uLtKs7Ow5C","QworuRpBQm","FNYIMDcpWB","MGlTFkZANm","tjQxszHF1q","d85a9Ul4a1","kB5nPpv0i7","P6bcgWPmlx","ru4UGDG4sT","tlILtmz8gx",
+"OUYuFpvgjS","blLA9S77LH","zY1GYAkKTk","Vprf2yEfy9","pmeCdM3zXL","oQ87rbrhlQ","wiHrZ64s8N","jiVBPQnJ1S","cQOnvJkzUn","KsjRKHP433",
+"AgJHQFxX9q","XyPZN9GXkX","6q6L92DREs","jiVBPOUYuF","I7p2aC2Irc","CxVEf2TRI7","JKWYRSbRYy","t59lRJXljW","NOHszfcJOy","3weIFyToGW",
+"7Ow5CuLtKs","m4bxUZ4I1v","ksJbynnP8o","SjskQGWqqX","PYBf4iqv4k","9eoRcv1Hln","JJs5m5Mg9r","uJScXkB5nP","5IhmG16lHc","P6bcgmX2GE",
+"2hEEU0Wr5y","b29RJuTacx","POUYSGSQwj","uupzkQnJ1S","i3pydgjUTu","tlILt0BmCy","lsQGoMkgy8","OxWIH5IhmG","ciuWzYf2Ec","zz4ZUNhXdu",
+"Ul4a19eoRc","ZUnqtEoToP","ZUnqt8U2nU","9y4lwuupzk","StlDJCIShG","bgJAzlpF6W","2NslmM3zXL","y94nwLewvM","WreyPSs0Zu","RBhp0aDGtS",
+"d7vjMl83Ud","9y4lwiB08l","xciqpuupzk","ru4UGWMiS3","gjUTu9y4lw","zY1GYBGaQY","9y4lwLbRTH","NAFuw1j5L8","S77LH3weIF","aDGtSiqv4k",
+"b29RJlCMxy","AgJHQt59lR","Chuy3fFDrJ","29QAzPOUYS","uQIczC2Irc","qQxHPiB08l","MGlTF8FmFH","WreyPe6e4z","uTacxru4UG","aL6AJYjB9t",
+"bZLvSWaim6","KsjRKM3zXL","W7cTsMm8si","GXdoHt98iW","5Drn02ZHdk","MezSWIjTwP","IjTwPiwzGk","jS1ajKr8ys","IBe8kSbRYy","KsjRKBpYhV",
+"ZhwG12ZHdk","EOE1o7fKYU","1v5hHbZLvS","FhtglVjCZq","7lUXZUl4a1","o8UydK20wK","kB5nPK20wK","SmGzvbZLvS","dQ586SjskQ","SmGzvVBjhz",
+"ZhwG17lUXZ","sx5GluTacx","d7vjMFVMxo","sx5Gluvf7A","CK5W7jzUqR","tAOsrzY1GY","FNYIMs4786","8hJdtogLgc","W3VFHJIqXi","v8yFN9XyT9",
+"7Ow5CM3zXL","qQxHPwiHrZ","RBhp0BCxeC","FGzgpIn3NS","BbwgAlweGy","sx5GlguMb8","SjskQuAWyp","W7cTssuY4x","L7cGcJXljW","JXljWSbRYy",
+"a00b55iGN5","OHaBzX6Pin","BpYhViB08l","RmDcrqQxHP","WDVWJbZLvS","5VZjSHRxd8","KZamHEdBKc","zbIYYFxX9q","ru4UG6q6L9","yToGWI7p2a",
+"MaJQsQWxoT","K4GS89rlg9","IRh48GWqqX","FGzgpiB08l","QClRLcL0aE","hUTw7MmsIo","RmDcrJKWYR","HfyNQhYBCK","tl72W0h1b1","uN6r3HzZT8",
+"WPmlxNcICA","0Wr5yxXTI4","8hJdtFwEJz","U3yw58U2nU","jeskSIBe8k","uAWyppAhR1","2hEEU0MR5X","cShY2yEfy9","pv0i7Ss0Zu","pAhR1oGu6x",
+"QYxC0BFkb8","UmaEvQYxC0","ZzJHW4W0Tl","580YDAIYUu","2DREsKsjRK","0h1b1wDajX","FcWrWfLNg8","7lUXZKASQ8","AkKTkFhtgl","t98iWPOUYS",
+"7X3uycmXIX","HfyNQ0YAGH","MaJQsiB08l","uJScXVIlwP","azIWpzFgtB","PYBf4pFrrl","qUJMd5nmWv","XflUqgjUTu","QYxC0y94nw","uAWypkB5nP",
+"7X3uyFjHXR","NAFuw6q6L9","8FmFHuoStw","ogLgctAOsr","07n1c07n1c","qUJMdChuy3","vLsmSHfyNQ","pmeCdFLsph","uJScXVNCPd","VNCPduPX7G",
+"ciuWzBpYhV","TwanofLNg8","HRxd8BpYhV","uJScXm4bxU","e6e4zIKxdL","5Drn0y94nw","lpF6WRsQUq","cShY2ZJTXH","AmdQdnFqik","L7cGczqH0W",
+"ru4UGbZLvS","580YDDcpWB","Cp3mZgf8rI","FxX9qIKxdL","cL0aE9GXkX","dpe1vHzZT8","0PktIuN6r3","29QAz5Namm","Ul4a1pAhR1","0BmCy7ku1p",
+"tl72WzFgtB","fqypyC2Irc","VIlwPd7vjM","M3zXLKsjRK","8TxD7ix74r","jtn0XCxVEf","yEfy9lpF6W","tjQxs0ao3l","WDVWJ4dEz6","SmGzvzQt6Q",
+"6AFT0hE1Ql","fcwDagf8rI","F6PT2Mm8si","i7WMQqaofN","fcwDa5nmWv","tlILt9XyT9","FGzgp6AFT0","6q6L9HP433","16lHcZuDtD","MK07Y2TRI7",
+"GSQwjyvOMI","kB5nPjfREu","JJs5mVBjhz","lXFOBG1RhS","nlaByni2v1","xciqpJKWYR","5Drn0LbRTH","MezSWwDajX","wiHrZWaim6","lj07QMmKGJ",
+"GSQwjAkKTk","ZJTXHQClRL","zbIYYMmsIo","Cfgr35Drn0","ru4UGOUYuF","8cVD3cShY2","uPX7GhUTw7","IjTwPNAFuw","n8pJ9d7vjM","NOHszjSjS3",
+"14FLRNcICA","dhSuHGXdoH","RkQkePb1pa","rKDLJjfREu","M6qcGpiJSk","AkKTkuQIcz","pAhR1fqypy","dhSuHnFqik","L7cGcbgJAz","Dz1R3Cfgr3",
+"Ta8f6uvf7A","uPX7GciuWz","ulk41uoStw","sx5GlFGzgp","8xEKzv2eC3","azIWpZJTXH","ThjNnuZPqg","iKqhrStlDJ","5IhmG7fsYM","iKqhrblLA9",
+"0ao3lBFkb8","s47860YAGH","uPX7GVBjhz","e6e4zwDajX","OHaBzDG4sT","tjQxsNOHsz","lm0pD2Yz7E","In3NSS2Dfu","AkKTkLDk6f","0h1b1iB08l",
+"IKxdLYh1hF","NOHszCfgr3","29QAzSbRYy","i7WMQ9GXkX","HRxd8KASQ8","prNT6SjskQ","0PktItaOXK","QssNCB3qem","9y4lwKsjRK","bZLvS8U2nU",
+"Z4I1vix74r","vkCHHJ2mQi","tvdkDMaJQs","ZuDtDL7cGc","vLsmSyofH3","Yf2Ec0h1b1","AgJHQQYxC0","W3VFHgdQsS","ECMvU1LB1L","prNT6euZA5",
+"qQxHP9eoRc","WDVWJsqVrf","8hJdtNOHsz","5iGN5Ss0Zu","5drc6BFkb8","FjHXRjeskS","QWxoTChuy3","5Drn0i7WMQ","L7cGcksJby","5Mg9rguMb8",
+"JKWYRzqH0W","yToGWSbRYy","FNYIMS77LH","1v5hHYjB9t","PYBf464s8N","i7WMQChuy3","lweGyWreyP","POUYS2TRI7","AgJHQSWfou","AXpwEsoy9t",
+"U3yw5Uvlv4","TCgPpbgJAz","xXTI49XyT9","mX2GE8RCUA","X6PinWreyP","MGlTFJ2mQi","gjUTuNo0Qb","lH1ktDG4sT","8U2nUReKEW","VerEAuPX7G",
+"W7cTsK4GS8","iKqhrVBjhz","cmXIXMK07Y","gjUTub29RJ","DcpWBPYBf4","X6PinjfREu","jeskSjiVBP","QworutvdkD","WaWsv580YD","VNCPdAgJHQ",
+"jzUqRn8pJ9","9eoRcSWfou","VjCZqjzUqR","kB5nPzHF1q","5Mg9r8hJdt","45cIHXyPZN","zz4ZUY1mC0","FNYIMRACuj","EOE1ohi5X7","BCxeCKsjRK",
+"64s8N0ao3l","3otm6CxVEf","FNYIMaFFss","9y4lwPOUYS","uJScX2hEEU","uoStwS2Dfu","3weIFuPX7G","guMb8AmdQd","Chuy3jiVBP","0h1b1QYxC0",
+"QYxC0MmKGJ","FjHXRECMvU","Kr8ysVBjhz","lpF6WzmLYD","ulk41NcICA","lj07Qn1pmO","e6e4zJRJQB","AmdQdlH1kt","hYBCKFnPFB","mX2GEQnJ1S",
+"a00b5PYBf4","n1pmOdpe1v","CIShGMkgy8","1v5hHkZANm","v2eC3Qworu","dpe1vChuy3","QbxXcyvOMI","8FmFHe6e4z","Kr8ysFhtgl","RACuj0PktI",
+"P6bcgCp3mZ","uLtKs8xEKz","dhSuHMK07Y","PYBf4guMb8","9y4lwF6PT2","9GXkXpAhR1","XyPZNoGu6x","HlUbFix74r","gf8rIIKxdL","CxVEfF6PT2",
+"zbIYY2TRI7","IBe8kpAhR1","fcJOyfqypy","Dz1R3i3pyd","XyPZNfaHir","fFDrJv8yFN","580YDCK5W7","Kr8ysMK07Y","Q6hMC9GXkX","lH1ktcL0aE",
+"AIYUuEoToP","CIShGokgRi","h1zcHoQ87r","GWqqXhe9IA","5IhmGKr8ys","FFDui9eoRc","64s8NZv7z0","rhl0JAOgEe","jfREuQssNC","pWiOsSjskQ",
+"y94nwIBe8k","2ZHdkW3VFH","AOgEeYOfrY","XflUqEoToP","t59lR64s8N","4W0TlsqVrf","5ZaEzpiJSk","MezSWpv0i7","YOfrY9rlg9","IBe8ksqVrf",
+"RsQUq4W0Tl","JRJQBpT8wu","X6Pindpe1v","DcpWBcL0aE","RBhp0guMb8","IjTwPn8pJ9","5iGN5I7p2a","wiHrZdhSuH","Chuy3yEfy9","8U2nU29QAz",
+"o8Uyd7fsYM","NhXdutjQxs","MmsIolj07Q","7Ow5CJkzUn","djsrvFLsph","WPmlxAOgEe","hi5X7qQxHP","Dz1R35Mg9r","s7MxkGXdoH","lweGyCNHmv",
+"AmdQdZuDtD","RpBQmpvgjS","ZzJHWWaWsv","5drc6Cfgr3","Mm8siBCxeC","0h1b1XflUq","FxX9qNo0Qb","FwEJzjzUqR","2Yz7EGSQwj","sx5GlRpBQm",
+"jS1ajdmoS7","lkMUAOUYuF","faHirO3iyQ","QssNCdpe1v","nlaBy5Mg9r","VerEAzbIYY","FPfSEuvf7A","OUqFM7lUXZ","ru4UGx3LDe","bgJAzs7Mxk",
+"WDVWJlkMUA","07n1cSs0Zu","vkCHH7ku1p","5Drn0he9IA","64s8NI7p2a","n8pJ9Zv7z0","NhXduLbRTH","jfREu2Yz7E","QWxoTuJScX","pvgjSni2v1",
+"nnP8oMaJQs","k85AeFVMxo","CxVEfZJTXH","ulk41UlU3M","jtn0XDcpWB","gjUTuBCxeC","VIlwPsx5Gl","0PktIhYBCK","s7MxkTXQ0Z","BpYhV9GXkX",
+"NhXduYf2Ec","cQOnv1j5L8","pWiOsU3yw5","P6bcguAWyp","NOHszDQimp","5VZjS8U2nU","DG4sTtlILt","i7WMQQbxXc","24ARFfcwDa","ulk417X3uy",
+"aez9yfqypy","n8pJ9OxWIH","cShY2GWqqX","5ZaEzt59lR","48cHLFFDui","RsQUqZ4I1v","Ss0ZuZzJHW","BCxeCjfREu","yToGWoVQp6","5NammoGu6x",
+"No0QbSs0Zu","MezSWD6rBy","e6e4zlH1kt","NhXduSWfou","M3zXLWDVWJ","azIWpn8pJ9","8TxD7gIYvE","SbRYyCIShG","FVMxoW7cTs","gIYvEhUTw7",
+"MmKGJuN6r3","Qworuulk41","QworuoGu6x","29QAzUvlv4","4QMc9Mkgy8","G1RhSazIWp","m4bxUgIYvE","pT8wuIBe8k","HRxd8L7cGc","EOE1oNAFuw",
+"S2DfuzmLYD","Oz8yZsx5Gl","uupzkHzZT8","LewvMY1mC0","Kr8ystl72W","5ZaEzqQxHP","azIWp580YD","F6PT2O3iyQ","zqH0WB3qem","h1zcH45cIH",
+"IRh48FPfSE","5Drn0iwzGk","Y1mC0Yw2oU","fqypyWreyP","qUJMd8TxD7","EoToPjeskS","4W0Tl5iGN5","Qworu5Mg9r","Q6hMC6AFT0","lweGy0BmCy",
+"QnJ1SyvOMI","kB5nPJ2mQi","HlUbFHzZT8","nlaByUvlv4","piJSkuN6r3","BbwgA48cHL","O3iyQiwzGk","J2mQi8cVD3","uPX7GCK5W7","O3iyQP6bcg",
+"pT8wuUvlv4","Q6hMCHRxd8","v2eC3okgRi","0YAGH5VZjS","suY4xAgJHQ","0BmCyuJScX","qaofN2DREs","1LB1LFVMxo","MojnP2Yz7E","QworutlILt",
+"CIShGYw2oU","GWqqXQ6hMC","RpBQmG1RhS","IjTwP5VZjS","Ta8f6nFqik","W7cTs24ARF","pmeCdMmsIo","HRxd8QWxoT","BbwgAECMvU","rhl0J2hEEU",
+"ulk41Pb1pa","24ARFAmdQd","SWfou9iGoT","FGzgp0BmCy","VIlwPRmDcr","MmKGJCqqaD","yToGWvkCHH","i7WMQaDGtS","lpF6WuoStw","oGu6x5Drn0",
+"5nmWvHfyNQ","QworuVerEA","mX2GEpAhR1","lm0pDReKEW","rz7UtTCgPp","16lHcJJs5m","NAFuw55rfB","fcwDaMGlTF","VjCZqVprf2","xciqpWPmlx",
+"lj07QaDGtS","XyPZNRmDcr","OUYuFzY1GY","x3LDeHP433","QYxC0HRxd8","nlaBypmeCd","bgJAzdjsrv","4dEz6FxX9q","xReecJKWYR","G1RhSCNHmv",
+"9iGoTYf2Ec","Gv3Fq6AFT0","oGu6xuLtKs","FNYIMxciqp","rz7UtFnPFB","RxrsmhSSvQ","8RCUA580YD","IjTwP6q6L9","9iGoTlsQGo","v2eC31v5hH",
+"gf8rIHP433","WPmlxOz8yZ","mz8gx64s8N","2Nslm4W0Tl","VBjhzHzZT8","AXpwEVerEA","ciuWzThjNn","QssNCCdyBV","uTacxDLhzM","oQ87r24ARF",
+"7X3uyFwEJz","SmGzvSWfou","2hEEU9GXkX","MmsIoFhtgl","fmIK1yofH3","cmXIXfLNg8","pFrrlGv3Fq","4W0TlCIShG","tAOsrWMiS3","x3LDeDz1R3",
+"FNYIM8FmFH","Z4I1vSbRYy","K4GS824ARF","soy9tKsjRK","SbRYyRmDcr","1j5L89GXkX","gf8rIQ6Lix","rz7UtChuy3","e6e4znlaBy","P6bcgeuZA5",
+"fqypyk85Ae","ksJby8hJdt","PYBf4jeskS","tvdkDUvlv4","uvf7AguMb8","0BmCyuN6r3","K20wK4dEz6","tvdkDuAWyp","CxVEfaDGtS","No0QbhYBCK",
+"oGu6xn8pJ9","K20wKHfyNQ","hi5X7MojnP","580YDlpF6W","hYBCKAXpwE","SWfoukZANm","lCMxygIYvE","iqv4klXFOB","16lHcd7vjM","mz8gxGv3Fq",
+"fFDrJQ6Lix","VIlwPFwEJz","2hEEU9rlg9","kB5nP55rfB","pT8wuK4GS8","vOqCEWmadA","gjUTuzmLYD","QChxsprNT6","1j5L8JJs5m","MK07YUvlv4",
+"ECMvURxrsm","45cIHoVQp6","i3pydzY1GY","K4GS807n1c","uPX7G5drc6","ru4UGgjUTu","5iGN5cL0aE","Ss0Zu0YAGH","qQxHPQ6Lix","7fKYUU3yw5",
+"mX2GEnFqik","0KyfsgdQsS","hUTw7Nxx9V","iqv4kZv7z0","jSjS3GWqqX","faHirk85Ae","oVQp6gjUTu","618DidQ586","oGu6x7hyVv","6q6L9fmIK1",
+"GSQwjNAFuw","SjskQtl72W","lkMUAFnPFB","jiVBPzQt6Q","9rlg9ni2v1","Q6hMCmX2GE","atef2FVMxo","7fKYU6AFT0","0KyfsokgRi","RACujzQt6Q",
+"Mkgy8gdQsS","BGaQYO3iyQ","YjB9tuPX7G","ZhwG148cHL","7hyVvZzJHW","ogLgczmLYD","wDajXQ6Lix","NOHszWDVWJ","G1RhSMm8si","oGu6x1v5hH",
+"9GXkXyvOMI","dhSuHQYxC0","YjB9thi5X7","dpe1vNAFuw","OHaBzlsQGo","dQ586HfyNQ","5Mg9rJKWYR","s93MljzUqR","lweGyciuWz","9GXkXOxWIH",
+"e6e4z0BmCy","Ul4a17fKYU","14FLRCNHmv","DLhzMt98iW","8RCUAJKWYR","CqqaD2Yz7E","AOgEecQOnv","LewvMCIShG","D6rByIBe8k","zQt6QRzaZA",
+"d7vjMTCgPp","TCgPpfLNg8","yluBxdjsrv","AgJHQjeskS","PYBf4d85a9","CqqaD580YD","FcWrW64s8N","M3zXLQYxC0","jS1ajS2Dfu","kB5nPIKxdL",
+"07n1cZhwG1","s7Mxk2Yz7E","Yh1hFuoStw","U3yw5580YD","FLsphQChxs","O3iyQLewvM","D6rByQ6Lix","Uvlv4jeskS","Ta8f6Zv7z0","tuDySfcJOy",
+"POUYSS77LH","uPX7GiwzGk","KZamHQnJ1S","tl72WhYBCK","RmDcrZuDtD","FGzgpReKEW","QworupWiOs","fqypyY1mC0","0YAGH3weIF","djsrvIn3NS",
+"QChxsiKqhr","azIWpfqypy","K20wK580YD","nnP8oUl4a1","ciuWzzQt6Q","GrDg7bgJAz","0h1b1zmLYD","qaofNyofH3","QYxC0lCMxy","9eoRcaFFss",
+"0Wr5y9GXkX","pvgjSdmoS7","gtCA56q6L9","iqv4kkZANm","7Ow5CbrhlQ","Oz8yZ5drc6","qaofNnFqik","MGlTFS2Dfu","7fsYMEdBKc","tjQxsuAWyp",
+"29QAzHlUbF","vLsmSJkzUn","rhl0JVprf2","OxWIHSs0Zu","pWiOsQbxXc","NAFuw0BmCy","lXFOBZ4I1v","RBhp07Ow5C","UlU3Mxciqp","W3VFHmX2GE",
+"pWiOsP6bcg","2Yz7EhE1Ql","VIlwPfaHir","8U2nUtl72W","GWqqXuQIcz","rz7Ut64s8N","v8yFNYOfrY","iKqhr4QMc9","pAhR1VBjhz","YOfrYlweGy",
+"iqv4kJIqXi","1j5L8JKWYR","8RCUAoVQp6","atef2v2eC3","B3qemMm8si","P6bcguoStw","guMb8hYBCK","WaWsvAkKTk","Mkgy8jtn0X","Cp3mZVerEA",
+"FPfSEZuDtD","FGzgpZuDtD","zz4ZUAXpwE","Pb1paOUYuF","n1pmOgf8rI","1LB1LCK5W7","lkMUACxVEf","29QAzfFDrJ","0BmCyLDk6f","dhSuHZzJHW",
+"Waim6MK07Y","zHF1qlViBv","6q6L9tAOsr","WPmlxhe9IA","WreyPzmLYD","Dz1R3sx5Gl","AkKTkqUJMd","Oz8yZ7hyVv","JIqXiatef2","Yw2oUCdyBV",
+"pvgjSCIShG","FxX9qMaJQs","cL0aELDk6f","vOqCEKr8ys","Gv3FqTwano","v1HlniwzGk","fcJOyXflUq","he9IAdhSuH","BFkb8h1zcH","9rlg9v2eC3",
+"uQIcz0PktI","tlILtTXQ0Z","nlaByFNYIM","CqqaD07n1c","FjHXRuQIcz","uQIczBCxeC","8TxD7S2Dfu","AIYUua00b5","W7cTsY1mC0","LDk6fnlaBy",
+"RmDcrn1pmO","SWfouK4GS8","K20wKiwzGk","Yf2EcHlUbF","sqVrfW7cTs","pT8wumz8gx","F6PT2BFkb8","aL6AJIBe8k","bZLvSpv0i7","v1HlnQbxXc",
+"FGzgpuAWyp","YOfrYtaOXK","14FLRuoStw","qUJMdtlILt","1LB1LVjCZq","prNT67fKYU","5IhmGVNCPd","pFrrlMGlTF","kZANmPOUYS","MojnPUlU3M",
+"StlDJ5iGN5","pvgjSfcwDa","Gv3FqWDVWJ","SWfougIYvE","dQ586uupzk","soy9tCfgr3","BbwgAhYBCK","rz7Ut0YAGH","ulk415drc6","CNHmvFwEJz",
+"45cIHFnPFB","ulk41BGaQY","guMb8X6Pin","v8yFNFVMxo","v1HlnZuDtD","RACujpT8wu","SWfouYh1hF","D6rByWDVWJ","FFDuihUTw7","jzUqR8FmFH",
+"SjskQQ6hMC","x3LDexXTI4","e6e4z1j5L8","Chuy37X3uy","yvOMIiqv4k","ni2v1NAFuw","GrDg7UlU3M","KASQ82Yz7E","RpBQm9rlg9","lViBvSs0Zu",
+"Ta8f6h1zcH","ksJby2Nslm","mz8gxRBhp0","MmKGJaL6AJ","gjUTuqQxHP","uTacx2ZHdk","pv0i71j5L8","euZA5Ss0Zu","Dz1R3TXQ0Z","OxWIHtvdkD",
+"QssNCpvgjS","jS1ajMkgy8","VIlwPdmoS7","jeskSgIYvE","0h1b1taOXK","Mm8si9rlg9","IKxdL4QMc9","cmXIXUmaEv","kZANmUlU3M","pFrrl07n1c",
+"OUYuFgf8rI","jiVBPpFrrl","5iGN50h1b1","0PktI8hJdt","t98iW16lHc","lpF6WpFrrl","taOXKNo0Qb","xciqp5Namm","Yh1hF2hEEU","Q6hMCzbIYY",
+"uTacxBCxeC","pFrrlUvlv4","VLTy6vLsmS","9eoRciwzGk","qUJMduPX7G","5drc69GXkX","zY1GYsuY4x","BFkb8Pb1pa","rhl0JQnJ1S","5iGN5JRJQB",
+"fqypyRxrsm","VNCPd24ARF","CdyBVYOfrY","FGzgpsx5Gl","pAhR1JIqXi","0ao3lCIShG","WreyPlXFOB","2DREsv8yFN","U3yw5mX2GE","WmadAxXTI4",
+"VNCPdEdBKc","oVQp6Uvlv4","5nmWvxReec","C2Irck85Ae","Waim6yluBx","vOqCEMkgy8","rz7UtBFkb8","hYBCKblLA9","RBhp0SWfou","uupzkAXpwE",
+"0Wr5y64s8N","5drc64W0Tl","kZANm24ARF","FxX9qdQ586","5Mg9ra00b5","t98iW618Di","QbxXcjS1aj","s4786tvdkD","UlU3MzQt6Q","oVQp6fmIK1",
+"GrDg7uLtKs","iqv4kFNYIM","2ZHdkTa8f6","sqVrfYOfrY","8U2nUU3yw5","sx5GlIn3NS","s7MxkUmaEv","bgJAzhYBCK","oQ87rKr8ys","CqqaD7lUXZ",
+"BGaQYguMb8","Mkgy8LbRTH","v2eC3CdyBV","tjQxsi3pyd","jtn0XtjQxs","5Namm64s8N","aL6AJGv3Fq","ciuWzAOgEe","2Nslms7Mxk","WreyPdmoS7",
+"HP433S2Dfu","3otm6uAWyp","618Disoy9t","FVMxoS2Dfu","CK5W77hyVv","m4bxUNOHsz","P6bcgS77LH","Gv3FqStlDJ","mX2GE3weIF","pWiOsEoToP",
+"zqH0Wgf8rI","vkCHHdQ586","i7WMQpWiOs","YjB9t580YD","lpF6W3otm6","QWxoTuAWyp","NAFuwwiHrZ","jiVBPrKDLJ","Uvlv4AgJHQ","v1HlnGrDg7",
+"ZhwG1jfREu","tAOsrStlDJ","fFDrJatef2","zY1GYlm0pD","BFkb8lCMxy","8xEKzQ6Lix","SWfoutvdkD","RxrsmuQIcz","Waim6uN6r3","QChxsW3VFH",
+"9eoRcYjB9t","brhlQ4dEz6","AOgEeyvOMI","WaWsvMaJQs","B3qemDcpWB","QbxXcqaofN","yToGWkZANm","NhXdud85a9","Ta8f69iGoT","9XyT9o8Uyd",
+"I7p2alkMUA","SbRYy2hEEU","7ku1pI7p2a","pT8wuY1mC0","MezSWMmKGJ","xciqpAOgEe","YjB9tM3zXL","i3pydWDVWJ","7Ow5CDz1R3","ru4UGRBhp0",
+"2TRI7tl72W","Yf2Ecfqypy","24ARFdhSuH","lpF6WTwano","U3yw5oQ87r","zbIYYK20wK","LDk6fAgJHQ","prNT6RBhp0","G1RhSuupzk","5drc6OUYuF",
+"Ss0ZuECMvU","DLhzMcL0aE","5drc6Dz1R3","VBjhzJXljW","B3qemKZamH","piJSkhYBCK","29QAzZuDtD","RkQkedpe1v","55rfB0MR5X","DcpWBlkMUA",
+"jSjS3dhSuH","gIYvEuZPqg","7X3uyRBhp0","x3LDeAXpwE","48cHLRzaZA","s93MlprNT6","FjHXR16lHc","tAOsrM3zXL","AmdQdyToGW","hSSvQrKDLJ",
+"2Yz7E2Yz7E","1LB1LjS1aj","uLtKsKr8ys","uN6r3FxX9q","VjCZq8cVD3","gjUTuulk41","I7p2aCdyBV","fmIK1brhlQ","NcICAsuY4x","jfREutaOXK",
+"iKqhrlCMxy","CqqaDOUYuF","5ZaEzX6Pin","FVMxoChuy3","8FmFHP6bcg","pvgjSCqqaD","ydG8Udjsrv","CqqaDzqH0W","yEfy9a00b5","Kr8ys5Drn0",
+"RBhp0ksJby","jSjS3okgRi","MezSWUmaEv","lViBvIRh48","AIYUu8RCUA","UlU3MAmdQd","NcICAZzJHW","U3yw5FNYIM","64s8NVerEA","iwzGkEdBKc",
+"Ss0Zuru4UG","FLsphCdyBV","JIqXiQnJ1S","EOE1ofLNg8","3weIF0MR5X","gdQsSpv0i7","Mkgy8FcWrW","hYBCKFVMxo","MGlTF5IhmG","t59lRgf8rI",
+"VBjhzuZPqg","Waim607n1c","yEfy9uJScX","lm0pDydG8U","wDajXEoToP","e6e4zXflUq","faHirazIWp","qaofNpvgjS","VjCZq7lUXZ","SjskQ8U2nU",
+"v8yFNv8yFN","qaofN8xEKz","WPmlxiwzGk","OUYuF5nmWv","LDk6fv1Hln","uN6r3RzaZA","AkKTkC2Irc","55rfBzY1GY","RmDcrnFqik","M3zXLbrhlQ",
+"jzUqR2ZHdk","9XyT9CqqaD","lkMUAzqH0W","t98iWG1RhS","lViBvuPX7G","cQOnvbgJAz","5iGN5iqv4k","aFFssFcWrW","zFgtByEfy9","9rlg9hUTw7",
+"pAhR1Rxrsm","Dz1R3sqVrf","RzaZAFFDui","EOE1oQbxXc","aDGtSVBjhz","pFrrlfFDrJ","NhXduIBe8k","P6bcgdjsrv","2hEEU4W0Tl","pT8wupiJSk",
+"Uvlv4xXTI4","IRh48CIShG","WMiS3FLsph","iB08lbgJAz","KsjRKOUqFM","CK5W7ZUnqt","AXpwEWMiS3","Cp3mZhUTw7","fLNg8cmXIX","vOqCEru4UG",
+"gjUTufFDrJ","n1pmOQbxXc","5IhmGzqH0W","uN6r3PYBf4","nlaByuPX7G","AgJHQVjCZq","FNYIMIKxdL","hUTw7LDk6f","ReKEWix74r","s93MlHlUbF",
+"ZJTXH7Ow5C","G1RhS5VZjS","fcwDaNo0Qb","okgRit98iW","7fKYUTwano","jiVBPTwano","0PktIQ6hMC","FnPFBZUnqt","618Di9y4lw","0Wr5yRpBQm",
+"2DREszmLYD","cL0aElXFOB","DQimp2Yz7E","RsQUqlH1kt","xciqpgtCA5","RzaZAK4GS8","W3VFHEdBKc","2DREs2hEEU","o8UydtAOsr","29QAzuTacx",
+"QssNCaez9y","1v5hHQWxoT","sqVrfblLA9","fmIK1JkzUn","ksJby5ZaEz","BGaQYQssNC","JXljWfqypy","0ao3l6q6L9","4dEz6FcWrW","brhlQ7fsYM",
+"CIShGZJTXH","ix74rOHaBz","tl72Wx3LDe","5Mg9r9iGoT","pT8wuxciqp","O3iyQ07n1c","BFkb8lweGy","lweGyqaofN","ZhwG1Y1mC0","FFDuiPb1pa",
+"0ao3lLbRTH","v2eC33weIF","h1zcH29QAz","C2IrcFjHXR","5iGN5zY1GY","AXpwEsuY4x","brhlQBbwgA","VNCPdgIYvE","HRxd8b29RJ","5iGN55Namm",
+"NOHsziwzGk","jfREun1pmO","S77LH7fKYU","gf8rI7X3uy","zz4ZUHlUbF","5Drn0cL0aE","cL0aEdmoS7","oVQp6xXTI4","MmKGJjtn0X","y94nwlweGy",
+"xReecRkQke","8TxD7Twano","W7cTsxXTI4","HRxd8StlDJ","5IhmGprNT6","0BmCyCfgr3","WmadAprNT6","jiVBPFVMxo","StlDJChuy3","AkKTkIKxdL",
+"uLtKsAIYUu","iB08lni2v1","xXTI4CIShG","O3iyQBFkb8","v1Hln8cVD3","zQt6Qs93Ml","NcICA0h1b1","v8yFNjSjS3","7hyVvFVMxo","8hJdt580YD",
+"n1pmOIRh48","tlILtmX2GE","IBe8kNAFuw","xXTI4uQIcz","AXpwEChuy3","9rlg9nFqik","lsQGo9eoRc","FjHXRFxX9q","vOqCEh1zcH","2Nslmiqv4k",
+"GXdoH9rlg9","b29RJCIShG","MmsIoo8Uyd","StlDJi7WMQ","LDk6fTa8f6","FNYIM14FLR","piJSkdjsrv","gIYvEUlU3M","29QAzyvOMI","1LB1Lh1zcH",
+"ksJbyru4UG","t59lRUmaEv","SbRYypiJSk","2Nslm580YD","29QAz580YD","iqv4kfqypy","ciuWzuPX7G","24ARFTa8f6","tAOsrLbRTH","b29RJjtn0X",
+"OHaBz9GXkX","uQIczK4GS8","DQimpP6bcg","AmdQdVprf2","ciuWzlj07Q","Mm8si9eoRc","v2eC3NcICA","pmeCdPOUYS","uZPqgrKDLJ","14FLR7hyVv",
+"cShY2suY4x","0h1b1jeskS","lpF6WM6qcG","wDajXx3LDe","ix74rHzZT8","lXFOBv1Hln","ix74rOUYuF","AIYUu1LB1L","Ta8f6Cp3mZ","Q6LixtAOsr",
+"G1RhS1LB1L","QbxXcM6qcG","zqH0WBGaQY","VBjhzcQOnv","AIYUuQssNC","5drc6GXdoH","K4GS8Qworu","zFgtBVIlwP","WPmlxru4UG","fcwDa3weIF",
+"kZANm9y4lw","S77LHlpF6W","SbRYykZANm","iKqhroVQp6","tjQxsvLsmS","Ta8f6WMiS3","aDGtSfmIK1","VIlwPFVMxo","5VZjSFNYIM","suY4xs7Mxk",
+"lpF6W618Di","2DREsuZPqg","8hJdtm4bxU","lweGy0MR5X","OUYuFzFgtB","s7MxkuoStw","5Drn05VZjS","n1pmOM3zXL","gjUTuZzJHW","qUJMdlm0pD",
+"WMiS30BmCy","Y1mC007n1c","DLhzM55rfB","lsQGo5Drn0","MmKGJlweGy","SjskQFxX9q","HlUbFWPmlx","WaWsvFPfSE","gf8rIF6PT2","cL0aEydG8U",
+"Pb1pa618Di","lm0pDxciqp","8TxD7aL6AJ","0YAGHYOfrY","blLA9Ul4a1","PYBf4fcJOy","OxWIHYw2oU","ZJTXHFcWrW","DLhzMhe9IA","WPmlxJKWYR",
+"Chuy3qQxHP","lpF6WCxVEf","uJScXFcWrW","48cHLoVQp6","K4GS8FcWrW","16lHcnnP8o","DG4sT1LB1L","uN6r3zqH0W","AOgEeuTacx","fcJOyWPmlx",
+"lweGyn1pmO","Yw2oUU3yw5","KsjRKVNCPd","uN6r3hE1Ql","FxX9qciuWz","v1HlnNAFuw","ReKEWogLgc","J2mQiWPmlx","SmGzvfcwDa","4W0TlyluBx",
+"lViBvBCxeC","mz8gxFVMxo","55rfBtaOXK","RACujMkgy8","gdQsSWPmlx","4W0TlguMb8","IjTwPsqVrf","azIWpYjB9t","Q6hMCblLA9","HfyNQ2TRI7",
+"RsQUqBFkb8","JIqXiNcICA","fmIK1FNYIM","euZA5IKxdL","wDajXXyPZN","jSjS3RACuj","7X3uyd85a9","CqqaDFNYIM","Q6LixtaOXK","MojnPBFkb8",
+"24ARFQnJ1S","MmsIosqVrf","Z4I1vJ2mQi","n8pJ9O3iyQ","JkzUnlkMUA","euZA56q6L9","580YDZhwG1","uAWypdjsrv","lm0pDaL6AJ","9GXkXRBhp0",
+"aez9y55rfB","WMiS3pFrrl","QbxXc9GXkX","qaofNFFDui","LewvMuvf7A","azIWpY1mC0","jiVBPGXdoH","SmGzv0h1b1","xReecXflUq","yluBx07n1c",
+"gIYvEv2eC3","2ZHdkFjHXR","qaofNlsQGo","M3zXLkB5nP","uupzkTwano","hUTw7jfREu","zQt6QbgJAz","0BmCylm0pD","jSjS3aDGtS","MK07YAOgEe",
+"taOXKGv3Fq","JRJQBVNCPd","M3zXLvkCHH","EoToPGv3Fq","OUYuFMK07Y","hSSvQM6qcG","i7WMQQnJ1S","AOgEet59lR","v1Hln4dEz6","jSjS355rfB",
+"QWxoTv2eC3","lsQGouAWyp","FPfSEv8yFN","No0QbPOUYS","NAFuwIn3NS","n1pmOjeskS","tlILtuPX7G","MK07Y618Di","d85a9K20wK","lXFOBChuy3",
+"P6bcgAmdQd","0h1b1GXdoH","JRJQBjtn0X","No0QbzQt6Q","Yw2oU5Drn0","k85AeyvOMI","FGzgprKDLJ","tvdkDC2Irc","hi5X7QWxoT","RpBQmOz8yZ",
+"dmoS7K4GS8","hE1Qly94nw","qQxHPwDajX","64s8NThjNn","ZUnqtDcpWB","OUYuFIBe8k","gdQsS8xEKz","tAOsrAgJHQ","uPX7G5Mg9r","kZANmQnJ1S",
+"GWqqXo8Uyd","U3yw5TCgPp","ReKEWVerEA","okgRiNo0Qb","FNYIMaez9y","cmXIXDz1R3","XyPZNaL6AJ","RkQkeCqqaD","TXQ0ZDQimp","Nxx9V6AFT0",
+"AmdQd4dEz6","FPfSEPOUYS","Mm8si14FLR","FFDuiAOgEe","zQt6QNOHsz","Nxx9VAOgEe","azIWpWmadA","uTacxMkgy8","uvf7AyofH3","xReecZ4I1v",
+"OUYuF5VZjS","Q6LixVNCPd","lm0pDgdQsS","iKqhrEdBKc","IBe8khSSvQ","2NslmTCgPp","brhlQnnP8o","aDGtS8cVD3","7hyVvFxX9q","e6e4zWmadA",
+"lkMUAJRJQB","7fKYUfmIK1","jtn0XLDk6f","guMb8Nxx9V","FNYIMCfgr3","wiHrZ5ZaEz","1j5L8pFrrl","HlUbFGrDg7","QbxXc2Yz7E","fcwDalm0pD",
+"DQimpZuDtD","rz7UtJJs5m","piJSkv2eC3","okgRiGWqqX","qQxHPi3pyd","v2eC3618Di","gf8rI9iGoT","QWxoTMmsIo","AIYUucShY2","jfREu9rlg9",
+"OUqFMhSSvQ","UlU3M9GXkX","zQt6Q1LB1L","jeskSgf8rI","lH1kt2hEEU","uPX7GaL6AJ","yluBx55rfB","hE1QliB08l","2ZHdkGXdoH","SbRYy8hJdt",
+"VjCZqzHF1q","2ZHdkM6qcG","TwanorKDLJ","OUYuFBGaQY","CNHmv0Kyfs","oGu6xyluBx","AmdQdBFkb8","KASQ8mz8gx","Chuy3HlUbF","IRh48NAFuw",
+"8U2nUuQIcz","7hyVvt98iW","Q6Lixd85a9","oVQp6RsQUq","AgJHQcL0aE","pAhR10Kyfs","JJs5mQ6Lix","WDVWJW7cTs","tuDyS7X3uy","5drc6ulk41",
+"s4786rKDLJ","64s8NsqVrf","TwanoU3yw5","Ss0ZuZUnqt","S77LHOHaBz","uZPqgCp3mZ","CNHmvZUnqt","7fKYU5nmWv","dmoS7K20wK","pmeCd2DREs",
+"5nmWvMGlTF","fFDrJ7ku1p","EoToPUmaEv","C2IrcuPX7G","tjQxsWmadA","lweGy7fKYU","gtCA5nFqik","55rfBuQIcz","RpBQmM6qcG","gtCA5atef2",
+"5Drn08RCUA","SmGzv9y4lw","3weIFZ4I1v","1LB1Lsx5Gl","ZUnqtOUYuF","No0Qb7hyVv","2NslmNhXdu","Chuy3lsQGo","MK07YlsQGo","wiHrZU3yw5",
+"euZA5bgJAz","4dEz6WDVWJ","AkKTknlaBy","tjQxsfcJOy","CdyBVsuY4x","PYBf4jfREu","hi5X7POUYS","xReecEdBKc","vLsmSuAWyp","soy9taL6AJ",
+"gtCA5rz7Ut","FhtglMm8si","brhlQO3iyQ","rKDLJ618Di","qUJMdVIlwP","ZUnqtRkQke","IjTwPWPmlx","brhlQyvOMI","FFDuiuAWyp","K20wKReKEW",
+"FFDui5Drn0","Yh1hF7fKYU","XflUqzmLYD","CNHmvoVQp6","FnPFBNcICA","qaofN6q6L9","VLTy6MaJQs","tjQxslCMxy","TXQ0ZqQxHP","VBjhzEdBKc",
+"mz8gxix74r","TwanovLsmS","sqVrfS77LH","DQimpCK5W7","oGu6xHfyNQ","GWqqXOxWIH","In3NSVLTy6","x3LDePYBf4","FGzgpM6qcG","AOgEeTCgPp",
+"fqypyM6qcG","gIYvEuPX7G","bZLvSsuY4x","AkKTkoVQp6","5drc66q6L9","cmXIXFcWrW","uAWypZuDtD","MmsIoMmKGJ","v8yFNxXTI4","45cIHazIWp",
+"7lUXZSmGzv","zbIYYOUqFM","2ZHdkzQt6Q","l83UduN6r3","G1RhSHRxd8","VNCPdi7WMQ","jS1ajMojnP","a00b5Qworu","jzUqRNhXdu","blLA94QMc9",
+"Cfgr3Ul4a1","atef2hYBCK","lViBvMaJQs","jS1ajcQOnv","OUYuF9iGoT","DLhzMsqVrf","tjQxs8hJdt","I7p2a7ku1p","ksJbyRsQUq","2DREsTXQ0Z",
+"M3zXLCNHmv","POUYSFwEJz","m4bxUIn3NS","soy9tVerEA","s47862Nslm","FLsphdjsrv","IRh48FLsph","ZJTXHuvf7A","ni2v164s8N","vOqCE7ku1p",
+"fqypyS77LH","YOfrYKZamH","b29RJM6qcG","RACujuTacx","RBhp0Mm8si","TXQ0Z9rlg9","GrDg7IBe8k","IKxdLMGlTF","LewvMWPmlx","prNT6n8pJ9",
+"BCxeC45cIH","soy9tY1mC0","SmGzvBGaQY","ZJTXH6q6L9","0YAGHFFDui","n1pmOGSQwj","FVMxotlILt","nnP8oKr8ys","gdQsSs93Ml","EdBKcjzUqR",
+"atef2KZamH","brhlQMkgy8","fcwDauvf7A","yvOMIW7cTs","prNT6FFDui","piJSkoQ87r","5VZjSWreyP","Oz8yZhUTw7","580YDSjskQ","QssNCCp3mZ",
+"ECMvUZuDtD","0YAGHX6Pin","o8UydJXljW","5IhmG8U2nU","uQIcze6e4z","MaJQsaDGtS","CdyBVBpYhV","5Drn0XyPZN","CIShGjzUqR","W3VFHOHaBz",
+"okgRiQWxoT","Y1mC0kZANm","jeskSatef2","NhXdulViBv","ksJbyQ6Lix","QssNCpFrrl","JKWYRO3iyQ","lViBvnlaBy","WDVWJMaJQs","5drc6FnPFB",
+"Chuy3LewvM","pvgjSQssNC","aL6AJ5iGN5","AIYUuSjskQ","S2Dfua00b5","s7MxkOz8yZ","FcWrWfcJOy","dmoS7Q6Lix","Yw2oU3otm6","XyPZNpT8wu",
+"6q6L9ogLgc","RACujBFkb8","faHirFPfSE","No0QbRmDcr","8TxD7TCgPp","tvdkDSmGzv","5nmWvWaim6","2DREsNo0Qb","Gv3Fq5ZaEz","5IhmGL7cGc",
+"NhXduYjB9t","5iGN5rz7Ut","NhXduni2v1","Mm8siRxrsm","K20wKguMb8","5Nammhi5X7","he9IAWMiS3","aDGtS2Yz7E","CdyBVNxx9V","7hyVvSs0Zu",
+"KASQ8t98iW","BCxeCF6PT2","kB5nPazIWp","pFrrltaOXK","BbwgAFnPFB","RsQUqNhXdu","oQ87r8FmFH","8FmFHix74r","yEfy9jzUqR","W3VFHXyPZN",
+"tl72Wmz8gx","48cHLNxx9V","Y1mC0tvdkD","WaWsv45cIH","MmKGJqQxHP","s7MxkjeskS","QworuQYxC0","WDVWJzQt6Q","dQ586s93Ml","5drc6a00b5",
+"KZamHSmGzv","uTacxaDGtS","d7vjMLbRTH","jzUqRNOHsz","TwanoUvlv4","Ul4a1Y1mC0","guMb8n8pJ9","xXTI4rz7Ut","aDGtSAXpwE","pv0i72TRI7",
+"0h1b114FLR","UmaEvaFFss","bgJAzvOqCE","hE1QlXflUq","soy9tatef2","S2DfuZv7z0","5iGN54QMc9","QnJ1SJJs5m","zmLYDNOHsz","29QAzB3qem",
+"QworuhSSvQ","v1HlnmX2GE","ReKEWsqVrf","qaofNmX2GE","FcWrWReKEW","yToGWG1RhS","CIShGuoStw","XyPZN5Namm","aL6AJCfgr3","uupzkeuZA5",
+"o8Uyd9eoRc","YOfrYzY1GY","lViBvyvOMI","HzZT8s93Ml","zbIYYlj07Q","gtCA5NcICA","GrDg7gIYvE","FGzgpGrDg7","9y4lwoQ87r","4dEz6RsQUq",
+"vkCHHRACuj","jeskSlj07Q","pvgjSBbwgA","brhlQfcwDa","1v5hH55rfB","9XyT9blLA9","6q6L9ThjNn","W7cTscL0aE","aFFssqQxHP","uAWypFLsph",
+"Cp3mZJIqXi","mz8gx3otm6","HP433L7cGc","Yh1hFuN6r3","FPfSEd85a9","HfyNQ48cHL","Yh1hFBbwgA","fcwDajfREu","yofH3fcJOy","DQimpfqypy",
+"i3pydU3yw5","kZANmWreyP","0PktIuTacx","AOgEeFGzgp","5VZjSRzaZA","mz8gxuPX7G","Yw2oUM3zXL","a00b5euZA5","pv0i7uTacx","euZA5yvOMI",
+"WmadADcpWB","FGzgpk85Ae","QClRLkB5nP","K4GS8jtn0X","Oz8yZQ6Lix","cmXIXSWfou","ZhwG1uPX7G","fLNg8pFrrl","5NammW7cTs","0MR5XPb1pa",
+"nFqikjSjS3","suY4xyluBx","QbxXcCK5W7","lkMUAcL0aE","okgRipT8wu","P6bcgLDk6f","d85a9sx5Gl","FnPFBiqv4k","AOgEegdQsS","uPX7G3otm6",
+"k85Aeatef2","JJs5mrz7Ut","2Yz7ECp3mZ","tl72WM3zXL","djsrvni2v1","Waim6o8Uyd","hi5X7lViBv","JRJQBIRh48","9eoRccQOnv","OUqFMWaWsv",
+"hi5X75ZaEz","C2IrcsuY4x","nlaBycQOnv","azIWpNOHsz","Oz8yZgIYvE","a00b5Uvlv4","zbIYYlkMUA","aFFssoGu6x","uN6r34W0Tl","bZLvS1LB1L",
+"soy9tydG8U","W3VFHMmsIo","WDVWJFFDui","t59lR3weIF","GSQwjdpe1v","JKWYRRxrsm","DLhzMpWiOs","zQt6Q4W0Tl","VjCZqFVMxo","7ku1pNAFuw",
+"AXpwEMkgy8","ru4UGtjQxs","fLNg8yofH3","I7p2auJScX","HlUbFulk41","rKDLJMaJQs","3otm6s7Mxk","jS1ajJkzUn","45cIHzHF1q","HfyNQ07n1c",
+"RACujMaJQs","BFkb8vLsmS","MmKGJ48cHL","soy9tCxVEf","JIqXiYOfrY","cQOnvuPX7G","Yf2Ecn8pJ9","dhSuHWaWsv","rz7UtWPmlx","nlaByMK07Y",
+"jfREuDLhzM","Vprf22Nslm","oQ87rAIYUu","Y1mC0Twano","IjTwPQYxC0","zY1GY0BmCy","FLsphrhl0J","tvdkDnnP8o","MojnPRBhp0","ZzJHW7Ow5C",
+"lm0pD07n1c","guMb8vOqCE","Q6hMCOHaBz","14FLRl83Ud","Zv7z0SbRYy","2DREs16lHc","uQIczL7cGc","5nmWvpv0i7","NcICAYjB9t","64s8NYw2oU",
+"JIqXihUTw7","55rfBHzZT8","8xEKz0Kyfs","ix74rpv0i7","0PktI6AFT0","uAWypoVQp6","vLsmSHP433","NOHszuupzk","qQxHPuTacx","RBhp0zqH0W",
+"ECMvUpmeCd","fcJOys4786","K20wKOxWIH","ECMvUtaOXK","l83UdwDajX","uPX7GGSQwj","ix74rbgJAz","0BmCyjtn0X","F6PT2HlUbF","Qworu6AFT0",
+"U3yw5MojnP","Mkgy8gf8rI","uQIczIKxdL","Twanomz8gx","Mm8silXFOB","atef2GrDg7","In3NSVprf2","d7vjMm4bxU","UlU3MIBe8k","gIYvEfaHir",
+"5NammPOUYS","FNYIMzHF1q","jzUqRs7Mxk","NhXduxciqp","yluBxFwEJz","brhlQlm0pD","StlDJVIlwP","64s8NblLA9","5ZaEzP6bcg","dhSuHIRh48",
+"tjQxsSjskQ","CqqaDNhXdu","Y1mC0zQt6Q","RACujhe9IA","s93MlEdBKc","Uvlv4MaJQs","IKxdLl83Ud","AgJHQvLsmS","U3yw5iwzGk","pv0i7QYxC0",
+"7Ow5CWmadA","tAOsrDG4sT","5NammJRJQB","QWxoT5nmWv","1LB1LhUTw7","GXdoHNOHsz","ydG8UMaJQs","CdyBVatef2","5iGN555rfB","YOfrYRsQUq",
+"FVMxo9rlg9","1v5hH5ZaEz","dpe1vyofH3","5drc62Nslm","IKxdLQWxoT","uPX7GNhXdu","fmIK17hyVv","UlU3MVerEA","5nmWvMaJQs","fLNg8tAOsr",
+"I7p2afmIK1","ogLgc5Namm","SmGzvVerEA","8xEKzWreyP","pAhR1BbwgA","MGlTF2TRI7","EOE1ov1Hln","zQt6Qk85Ae","NcICAUvlv4","1LB1LyvOMI",
+"t98iWFcWrW","rhl0JRACuj","pWiOsFVMxo","07n1cKASQ8","RpBQmJXljW","QnJ1SjS1aj","9eoRcUl4a1","WDVWJoGu6x","8U2nUQChxs","X6PinnnP8o",
+"OHaBzQssNC","zY1GYAIYUu","GWqqXUmaEv","rz7UtUlU3M","tuDySjiVBP","bZLvSZUnqt","mz8gxxXTI4","wDajXiB08l","qaofNAIYUu","JJs5mZuDtD",
+"Mm8siaDGtS","okgRiOUYuF","Dz1R3HzZT8","QssNCix74r","gdQsS0BmCy","i7WMQAgJHQ","piJSkb29RJ","mz8gxZhwG1","gf8rIhYBCK","0ao3ll83Ud",
+"1j5L8HlUbF","ThjNnFNYIM","xXTI4zbIYY","hSSvQKr8ys","EOE1ouvf7A","CNHmvokgRi","vLsmSZUnqt","i3pydmz8gx","pmeCd29QAz","cQOnvZuDtD",
+"0BmCyOHaBz","pv0i7prNT6","LbRTHvOqCE","n8pJ9Dz1R3","Zv7z0FcWrW","QnJ1S29QAz","zHF1qdpe1v","fcwDaJJs5m","7ku1piqv4k","uoStw64s8N",
+"FFDuijSjS3","3weIFd85a9","ydG8UGWqqX","zmLYDVprf2","24ARFkZANm","2hEEUuLtKs","pWiOsfcJOy","No0QbMkgy8","fmIK1VNCPd","FjHXRtuDyS",
+"ksJby9eoRc","gjUTu7Ow5C","KZamHRmDcr","No0Qbx3LDe","zqH0Wrz7Ut","Nxx9VZv7z0","JkzUnSmGzv","JRJQBi3pyd","QnJ1SdQ586","n1pmOdhSuH",
+"AmdQds4786","618DiQChxs","Kr8ysa00b5","v1Hln4W0Tl","14FLR8U2nU","BGaQYk85Ae","s4786gIYvE","OxWIHt98iW","djsrvguMb8","AkKTkuvf7A",
+"OxWIHuZPqg","BpYhVaDGtS","cShY2W3VFH","6q6L9MmKGJ","OxWIHMmsIo","FVMxoCK5W7","S2DfufcwDa","sqVrfsqVrf","Vprf2tlILt","pvgjSoGu6x",
+"wDajXVNCPd","5Drn0uPX7G","iqv4k2Yz7E","tAOsrOUYuF","zz4ZUzz4ZU","Mkgy8FPfSE","5VZjS5Namm","ECMvUcL0aE","HzZT8uupzk","dhSuHjiVBP",
+"W3VFHsqVrf","FjHXRY1mC0","s7MxkRkQke","QYxC0lpF6W","DLhzMI7p2a","zz4ZUVBjhz","oVQp6uupzk","RBhp02hEEU","fqypyzz4ZU","tl72W8RCUA",
+"JXljWvkCHH","PYBf47fsYM","jfREu5IhmG","ZuDtDYh1hF","OUYuFlH1kt","9iGoT2TRI7","7fsYMhe9IA","Dz1R3Kr8ys","s4786VNCPd","i7WMQAmdQd",
+"dQ586i7WMQ","7hyVv9XyT9","5VZjSRmDcr","0BmCy9XyT9","oVQp6xciqp","ZzJHWNxx9V","yEfy9AIYUu","yvOMIYf2Ec","K4GS8rz7Ut","ECMvU16lHc",
+"Cp3mZ8xEKz","Q6hMCW7cTs","I7p2aQYxC0","3weIFFcWrW","DQimpk85Ae","S77LHBbwgA","iB08ljeskS","blLA9rz7Ut","RACujIn3NS","uZPqgNOHsz",
+"0BmCy14FLR","dQ586gdQsS","NOHszzbIYY","BpYhVBGaQY","9GXkXYjB9t","5IhmGFNYIM","RzaZALDk6f","ydG8Ua00b5","OUYuF0Kyfs","Yh1hFtaOXK",
+"lH1kt0Kyfs","tAOsrUvlv4","zz4ZUni2v1","IRh480PktI","9rlg93weIF","NAFuwpv0i7","uupzkZzJHW","zqH0W07n1c","zFgtBOHaBz","ciuWzpAhR1",
+"Pb1pacmXIX","dhSuHt98iW","4dEz67hyVv","sqVrfC2Irc","7hyVvHP433","lH1ktQChxs","8cVD3WreyP","DQimpECMvU","OHaBzzFgtB","Yf2EccQOnv",
+"MaJQsNxx9V","JXljWSjskQ","aez9yP6bcg","l83Ud6q6L9","lViBvqaofN","CNHmvNcICA","ZzJHWAXpwE","Dz1R38hJdt","RmDcrP6bcg","QWxoTnnP8o",
+"s7MxkyluBx","piJSkHzZT8","jtn0XiKqhr","RkQkeru4UG","gIYvE9XyT9","fqypyfqypy","CNHmv45cIH","ogLgcSWfou","jiVBPsqVrf","RpBQmuTacx",
+"7fsYMFLsph","K20wKWMiS3","QChxsuAWyp","zbIYYOxWIH","ksJbykZANm","MK07YuLtKs","jtn0XoQ87r","WreyP7X3uy","LDk6fS77LH","StlDJDz1R3",
+"Gv3FqgtCA5","M6qcGG1RhS","lViBv14FLR","14FLRt59lR","lpF6WKASQ8","Mkgy8oQ87r","wiHrZCK5W7","aL6AJnlaBy","J2mQiUl4a1","618Dis7Mxk",
+"fFDrJ55rfB","5iGN5HlUbF","Y1mC0nlaBy","rKDLJlpF6W","GWqqXni2v1","NAFuw9iGoT","hUTw7v1Hln","oQ87rqQxHP","6q6L9Yw2oU","QWxoTCxVEf",
+"GWqqXyvOMI","hE1QllViBv","k85AeVerEA","QYxC0gf8rI","RkQkemX2GE","K4GS8lCMxy","6q6L9kB5nP","IKxdLAOgEe","CK5W7lViBv","o8UydOHaBz",
+"faHirrz7Ut","pvgjSzz4ZU","FwEJzUmaEv","pmeCdzbIYY","4dEz6hE1Ql","zmLYDatef2","v1HlnBpYhV","lpF6W0YAGH","AOgEe5Namm","lCMxy9iGoT",
+"kB5nPpAhR1","ru4UGqQxHP","KASQ8uupzk","No0QbuoStw","B3qemyofH3","7lUXZTCgPp","bZLvSeuZA5","LbRTHFFDui","ksJbyfaHir","gjUTuI7p2a",
+"5iGN5YOfrY","xciqpZzJHW","yluBxFPfSE","WmadAM6qcG","BpYhVmz8gx","JkzUnD6rBy","JRJQBECMvU","No0QbSbRYy","QnJ1Ssoy9t","DG4sT7fKYU",
+"djsrv8U2nU","sx5GlRACuj","TCgPpuvf7A","29QAzQChxs","WmadAzHF1q","UlU3MDcpWB","FcWrWStlDJ","NOHszMGlTF","nlaByWPmlx","cShY2soy9t",
+"uJScXqaofN","4dEz6tuDyS","pv0i7JJs5m","S77LHyToGW","lm0pDK20wK","xciqpAkKTk","2Yz7EMmKGJ","fcJOytjQxs","7X3uyn1pmO","lsQGomX2GE",
+"MGlTFCxVEf","No0QbYh1hF","CxVEfVNCPd","cL0aEXflUq","7hyVvEoToP","nlaByVjCZq","b29RJt59lR","Mkgy8pT8wu","DQimpLbRTH","In3NSfaHir",
+"hUTw7k85Ae","M3zXLMojnP","JXljWFxX9q","5drc6JKWYR","tlILtFFDui","AIYUuyToGW","MGlTFZJTXH","iqv4kpWiOs","zHF1q5Drn0","oVQp6pWiOs",
+"b29RJlXFOB","LbRTHuJScX","Q6hMCjfREu","GrDg7wiHrZ","BFkb8NAFuw","580YDC2Irc","lm0pDQChxs","Waim6mz8gx","aFFss6AFT0","Mkgy8L7cGc",
+"FwEJz2TRI7","t59lRFhtgl","Q6hMCReKEW","Zv7z0C2Irc","d7vjMv8yFN","yEfy9LbRTH","nnP8o6q6L9","4W0Tl45cIH","WMiS3t98iW","9rlg9XyPZN",
+"5nmWv64s8N","CqqaD5iGN5","6AFT0ZUnqt","9eoRcpFrrl","FnPFBCqqaD","2Yz7EkB5nP","oGu6xWreyP","OHaBzbZLvS","gdQsSVprf2","VIlwPi7WMQ",
+"7X3uyblLA9","S2DfudmoS7","lkMUA7ku1p","BbwgAblLA9","i3pydxciqp","l83UdgdQsS","fcJOy8U2nU","AIYUuy94nw","2DREsZUnqt","IKxdLKsjRK",
+"jfREunlaBy","07n1cThjNn","BFkb8aez9y","suY4xyofH3","8FmFHxReec","NOHszjzUqR","ix74rL7cGc","CdyBVSmGzv","55rfBksJby","gdQsSFVMxo",
+"1j5L8pmeCd","RkQkeIn3NS","MezSWTa8f6","lXFOBRxrsm","Chuy3Rxrsm","yEfy9nnP8o","jSjS30MR5X","5NammIn3NS","jtn0Xv1Hln","5VZjSNo0Qb",
+"lj07Qv1Hln","uLtKsogLgc","s7Mxkatef2","FFDuilm0pD","bZLvSRsQUq","2ZHdkuvf7A","KsjRKwiHrZ","WMiS3MojnP","oVQp60h1b1","a00b59XyT9",
+"AIYUuRxrsm","S2DfuMmsIo","0h1b1lpF6W","8U2nUStlDJ","okgRi5Mg9r","Uvlv4AIYUu","hSSvQFGzgp","5Drn0s93Ml","faHiryluBx","Mm8siFNYIM",
+"CxVEfuZPqg","aDGtSVprf2","QnJ1SVIlwP","5iGN5kB5nP","pv0i7FwEJz","pmeCdC2Irc","uJScX4dEz6","MK07YdmoS7","Uvlv4M3zXL","VLTy6Cp3mZ",
+"cmXIXSs0Zu","faHirfcwDa","zQt6QdQ586","yToGWgdQsS","B3qeml83Ud","DcpWBfLNg8","3otm6tlILt","1v5hHS77LH","ZJTXHrhl0J","yToGWlCMxy",
+"JIqXiguMb8","8RCUA8cVD3","qQxHPn1pmO","jfREufcJOy","FFDuiKZamH","1LB1LNo0Qb","fqypyIBe8k","9iGoTt98iW","aL6AJI7p2a","FnPFBydG8U",
+"n1pmOAOgEe","8FmFHx3LDe","fFDrJVerEA","FjHXRDQimp","pv0i7StlDJ","ZJTXHZv7z0","FxX9qgtCA5","UmaEvWreyP","KASQ88cVD3","K4GS82DREs",
+"blLA95drc6","vkCHHiB08l","5nmWvReKEW","Oz8yZZzJHW","WMiS3iqv4k","iwzGkF6PT2","QnJ1SuJScX","ksJbydpe1v","wiHrZTwano","oVQp65IhmG",
+"FNYIMYOfrY","y94nwhUTw7","jzUqRVerEA","29QAzAIYUu","uZPqgCK5W7","pmeCdGXdoH","rKDLJlViBv","JkzUnn1pmO","DLhzMW3VFH","o8UydfcJOy",
+"16lHcFwEJz","uQIczyvOMI","VLTy6MmKGJ","JKWYRs93Ml","MezSWqQxHP","pAhR1jtn0X","5VZjS0ao3l","Ta8f629QAz","0YAGHY1mC0","LbRTHBFkb8",
+"DG4sTqaofN","BCxeCFhtgl","GWqqXQssNC","DG4sT7lUXZ","IBe8kFPfSE","NOHszpFrrl","uLtKs0YAGH","y94nwBCxeC","s93MlyluBx","rz7UtzqH0W",
+"P6bcgQnJ1S","v8yFNeuZA5","uPX7GSmGzv","RzaZAy94nw","EoToPNo0Qb","Ul4a18TxD7","i3pydblLA9","XflUq5iGN5","M3zXLzQt6Q","Cp3mZIn3NS",
+"0h1b1AgJHQ","FLsphVerEA","vLsmSFcWrW","zqH0Ws4786","lViBvaL6AJ","64s8NZzJHW","WMiS3Chuy3","4W0Tl580YD","M3zXLReKEW","5NammsuY4x",
+"piJSk1v5hH","GrDg7BGaQY","ReKEWG1RhS","uJScXCxVEf","6q6L9wiHrZ","oGu6xcL0aE","YjB9tuAWyp","Mm8siCIShG","FjHXRSjskQ","pvgjSa00b5",
+"RACujVBjhz","jS1ajU3yw5","jfREuulk41","Y1mC0fLNg8","ulk41StlDJ","b29RJv2eC3","yEfy9HlUbF","Dz1R3jSjS3","t59lRYOfrY","a00b5lViBv",
+"jSjS3WPmlx","ZJTXH9GXkX","zHF1qv1Hln","DLhzM64s8N","FnPFBtl72W","G1RhSfqypy","ulk41K4GS8","7Ow5CIjTwP","Cp3mZD6rBy","DcpWBGWqqX",
+"nFqik8xEKz","JJs5mazIWp","CqqaD7Ow5C","64s8NCqqaD","tlILtokgRi","In3NS9y4lw","Nxx9VWMiS3","5nmWvjzUqR","8FmFHGrDg7","vOqCE45cIH",
+"XflUq8cVD3","6AFT0I7p2a","Cp3mZuPX7G","Rxrsmni2v1","ix74ryEfy9","hi5X7BbwgA","Z4I1vpAhR1","Z4I1vIjTwP","8cVD3lViBv","U3yw5m4bxU",
+"9GXkXNo0Qb","HRxd8fmIK1","iB08lNo0Qb","gtCA5ulk41","bgJAzjzUqR","ZuDtDoVQp6","qUJMdCfgr3","I7p2a9GXkX","Cp3mZ9eoRc","ksJby4dEz6",
+"taOXK2ZHdk","HzZT87X3uy","VIlwPlkMUA","SjskQCp3mZ","1LB1LRkQke","GWqqXFxX9q","W7cTsFxX9q","Waim6jfREu","OUqFMlkMUA","uN6r3SmGzv",
+"5nmWvKsjRK","hi5X7Yw2oU","fmIK17lUXZ","OUYuFoQ87r","fFDrJiB08l","fqypytlILt","0Kyfs2ZHdk","ciuWzRsQUq","5VZjSHfyNQ","NcICAQbxXc",
+"dpe1vlweGy","FnPFBaFFss","zbIYYn1pmO","CqqaDmz8gx","EoToPM6qcG","SmGzvogLgc","8TxD7yvOMI","QChxsfFDrJ","ECMvUYjB9t","Oz8yZOxWIH",
+"NhXduyEfy9","QssNCWaim6","9GXkXjtn0X","X6PinjiVBP","uPX7GuTacx","s93MlxReec","xXTI4FVMxo","C2IrcyofH3","t59lRokgRi","euZA5QYxC0",
+"pT8wuEOE1o","5VZjSaL6AJ","1j5L8pT8wu","In3NSNAFuw","wDajXG1RhS","lXFOB580YD","zQt6Qaez9y","CNHmvhE1Ql","ru4UGlm0pD","Pb1pafFDrJ",
+"ix74rbZLvS","LbRTHSbRYy","hYBCKSs0Zu","o8Uyddjsrv","UmaEvs4786","JkzUn7X3uy","2TRI7MaJQs","ogLgcoVQp6","FxX9q0PktI","FcWrWQbxXc",
+"CNHmvQClRL","7X3uyydG8U","oGu6xksJby","JJs5mkB5nP","lm0pD7X3uy","yluBxh1zcH","7ku1pRmDcr","5VZjSWMiS3","fLNg8M3zXL","zz4ZUG1RhS",
+"ZUnqtd7vjM","9y4lwQYxC0","Waim6GXdoH","uupzkFwEJz","W7cTss7Mxk","NAFuwzz4ZU","SbRYysqVrf","2TRI7fcwDa","BCxeCatef2","ogLgc9iGoT",
+"tAOsr2ZHdk","mX2GEO3iyQ","iqv4kECMvU","QworutaOXK","pAhR1uJScX","5drc6pvgjS","2Yz7EM6qcG","FVMxogIYvE","QbxXcAXpwE","qUJMdNcICA",
+"euZA5qaofN","VjCZqrKDLJ","vOqCEMojnP","IjTwPpiJSk","azIWpGWqqX","hYBCKi3pyd","ECMvUK4GS8","HP433QbxXc","SbRYyyofH3","Pb1paZUnqt",
+"8RCUAZJTXH","JKWYRlpF6W","ZUnqtpFrrl","QYxC0BbwgA","4dEz6he9IA","e6e4zvLsmS","QClRL7Ow5C","azIWp7ku1p","ogLgcdhSuH","guMb8G1RhS",
+"BGaQYix74r","RzaZA8cVD3","nlaBydQ586","0ao3llXFOB","s93Ml0ao3l","NcICAlCMxy","P6bcg64s8N","MojnPh1zcH","7X3uyRmDcr","Waim6LbRTH",
+"vLsmSAmdQd","KsjRKpmeCd","BCxeCOxWIH","fqypyVBjhz","XflUq45cIH","LewvMk85Ae","WmadA8xEKz","Vprf28xEKz","hYBCKJRJQB","tAOsrdjsrv",
+"MK07Y7ku1p","lViBvWaim6","CxVEfsuY4x","he9IAiKqhr","RkQkezQt6Q","EdBKcIBe8k","MK07YjzUqR","RBhp0hi5X7","s47868FmFH","ciuWz6q6L9",
+"xciqpt59lR","gjUTuGrDg7","8U2nUaDGtS","64s8NfaHir","uTacxksJby","lpF6W0MR5X","tl72WtjQxs","RkQketvdkD","zY1GYCIShG","WDVWJ9eoRc",
+"S2Dfulm0pD","3otm6okgRi","LbRTH8RCUA","jiVBP9XyT9","v1HlnMK07Y","HRxd83weIF","yToGWMK07Y","aFFssdmoS7","uQIczaFFss","7hyVvFnPFB",
+"2TRI7M3zXL","QssNCQ6Lix","faHir9XyT9","WMiS3GrDg7","pAhR1okgRi","Cp3mZnnP8o","lm0pD8RCUA","AIYUuAmdQd","xXTI4fcwDa","2hEEUHfyNQ",
+"7fsYM2ZHdk","HfyNQdQ586","CxVEfe6e4z","EoToPprNT6","HlUbFMojnP","fFDrJgjUTu","AkKTkDLhzM","BGaQYuTacx","lsQGoHzZT8","W7cTsQbxXc",
+"64s8NWMiS3","fLNg8KsjRK","JJs5mJ2mQi","OUYuFqUJMd","a00b53weIF","Waim6618Di","BbwgArz7Ut","Yf2EcMmKGJ","jS1ajtAOsr","8hJdt64s8N",
+"Nxx9V8cVD3","uupzkMm8si","HP433vLsmS","s4786Mm8si","16lHcWaWsv","NhXdu7ku1p","ZUnqt6AFT0","iKqhrSmGzv","RACuj7ku1p","0Kyfs8RCUA",
+"soy9tn1pmO","ZuDtDMkgy8","n1pmOJJs5m","tjQxsjtn0X","ZUnqtazIWp","CIShGWPmlx","i3pydRmDcr","Dz1R3K20wK","Yw2oUyToGW","7hyVvMkgy8",
+"ReKEWWPmlx","I7p2atlILt","WreyPSmGzv","Yh1hFIn3NS","JXljW7lUXZ","UlU3MEoToP","VNCPdYf2Ec","PYBf4Pb1pa","J2mQi4dEz6","aFFssn8pJ9",
+"IKxdLfLNg8","8hJdtmX2GE","lCMxyaFFss","jiVBPWreyP","8U2nUQbxXc","Z4I1vGv3Fq","taOXKHzZT8","5Mg9raFFss","XflUqLewvM","7lUXZEoToP",
+"ZUnqtgIYvE","hE1QlLewvM","pAhR1JKWYR","sx5Gl580YD","s4786MojnP","Qworu7hyVv","S77LHVBjhz","Oz8yZ5iGN5","2ZHdk5IhmG","WaWsvGSQwj",
+"HRxd86AFT0","uLtKsXflUq","ZzJHWOHaBz","Ss0ZuDG4sT","jzUqRTa8f6","sqVrfuoStw","IRh48FnPFB","Y1mC0vkCHH","s93MlI7p2a","WMiS3cShY2",
+"he9IAksJby","faHir16lHc","StlDJ5VZjS","blLA9ZuDtD","POUYS3otm6","iwzGkQworu","jtn0XKZamH","0BmCyBCxeC","v1Hlns7Mxk","4W0TltuDyS",
+"8cVD33otm6","uvf7AjSjS3","xciqp618Di","JIqXiStlDJ","1v5hHFGzgp","EoToPbgJAz","GrDg716lHc","pvgjSsqVrf","ZJTXH29QAz","pmeCdqQxHP",
+"YOfrYP6bcg","GWqqXjS1aj","KsjRKBbwgA","ciuWzRpBQm","StlDJMkgy8","tvdkD55rfB","WMiS3uupzk","VBjhz7fKYU","JRJQBo8Uyd","taOXKStlDJ",
+"aL6AJFNYIM","29QAzX6Pin","x3LDeIn3NS","MmsIo4W0Tl","9eoRcChuy3","blLA9OHaBz","o8Uyds4786","t59lRgIYvE","W3VFHFNYIM","oQ87rlXFOB",
+"k85AeAmdQd","FPfSE7ku1p","JRJQBVIlwP","Gv3FqlH1kt","vkCHH618Di","OxWIH8TxD7","UmaEvDLhzM","MK07YogLgc","2Yz7EOHaBz","5nmWvUmaEv",
+"b29RJMK07Y","ni2v1Z4I1v","lkMUA8TxD7","7fsYMd85a9","guMb8cShY2","aez9yXflUq","cmXIXX6Pin","3otm6IBe8k","0Wr5ypv0i7","hYBCKazIWp",
+"0PktICfgr3","UmaEvjS1aj","ydG8Us4786","Vprf2XflUq","Y1mC0pvgjS","oQ87riB08l","0BmCyAIYUu","ogLgcru4UG","9XyT9RsQUq","NcICAuQIcz",
+"CK5W7iB08l","ogLgc2Nslm","TXQ0ZzbIYY","64s8NKZamH","pv0i7nnP8o","7Ow5Cd85a9","KsjRKuAWyp","C2IrcKr8ys","yvOMIxciqp","fqypyFGzgp",
+"cL0aEP6bcg","WMiS3n8pJ9","3otm6v8yFN","HlUbFReKEW","IKxdLxciqp","yvOMI5ZaEz","gIYvEvLsmS","2DREsXflUq","aDGtSpv0i7","5NammBCxeC",
+"djsrv2ZHdk","faHirkZANm","FVMxo7hyVv","vkCHHMK07Y","M3zXLWaWsv","dQ586JJs5m","HzZT8hi5X7","Dz1R3pFrrl","6q6L9mX2GE","HP433DLhzM",
+"ZuDtDgIYvE","Mkgy8FwEJz","k85AelCMxy","WDVWJMGlTF","FxX9qJXljW","JIqXiiKqhr","bgJAz7hyVv","M3zXLGSQwj","Nxx9VogLgc","CdyBVuJScX",
+"FGzgp48cHL","kZANmTCgPp","gIYvE07n1c","kZANmsx5Gl","xciqplH1kt","azIWpqUJMd","jiVBPuvf7A","CNHmvjS1aj","MezSWZUnqt","16lHc1j5L8",
+"9GXkXWmadA","uQIcz8hJdt","AgJHQ2DREs","J2mQipAhR1","nlaByXflUq","X6PinI7p2a","8hJdtuupzk","d7vjMVprf2","pAhR124ARF","dpe1vyEfy9",
+"2Yz7E5IhmG","hUTw74QMc9","GSQwj4QMc9","fFDrJkB5nP","BpYhVY1mC0","ReKEWzz4ZU","yToGWYf2Ec","8TxD7MezSW","zz4ZUZuDtD","9iGoTjeskS",
+"pT8wuazIWp","KZamHfcwDa","MGlTFhYBCK","dQ586MaJQs","uN6r3AgJHQ","tAOsrcL0aE","WaWsv07n1c","wDajX48cHL","hUTw7Uvlv4","rKDLJCK5W7",
+"8U2nU14FLR","YjB9tSjskQ","9XyT9CIShG","xXTI4ThjNn","WmadAPYBf4","7Ow5CyluBx","XflUqxXTI4","t59lRVBjhz","JRJQBlCMxy","okgRiL7cGc",
+"POUYS9iGoT","ZJTXHF6PT2","5NammSmGzv","djsrvIKxdL","pWiOsiqv4k","YjB9tNxx9V","iqv4k1j5L8","a00b5jfREu","4dEz6FnPFB","8cVD32DREs",
+"2hEEUVerEA","pvgjSfFDrJ","jfREuiwzGk","cL0aEThjNn","K4GS8KsjRK","pv0i7XyPZN","GSQwjRsQUq","XyPZNt98iW","HfyNQaez9y","pmeCda00b5",
+"DG4sT5drc6","Q6hMCpT8wu","iB08lX6Pin","AXpwEtaOXK","X6PinuAWyp","Cp3mZIBe8k","AIYUuzY1GY","ZhwG1IjTwP","JkzUnRzaZA","aFFssJXljW",
+"5ZaEzRpBQm","JRJQByvOMI","ksJbySjskQ","blLA98TxD7","DcpWBaez9y","MezSW2Yz7E","WmadA2hEEU","JXljW2Nslm","he9IAWDVWJ","iwzGkZv7z0",
+"wiHrZCNHmv","Pb1paReKEW","azIWp48cHL","ni2v1soy9t","ru4UGkZANm","JRJQBpmeCd","jtn0XTa8f6","TXQ0Zs7Mxk","sx5Gla00b5","HzZT8JkzUn",
+"pmeCdOUqFM","yvOMIvLsmS","JKWYR0Kyfs","vOqCEI7p2a","fcJOy580YD","JXljWpv0i7","ReKEW2Nslm","atef2lViBv","rhl0Jiqv4k","OUqFMDQimp",
+"aez9ysqVrf","uJScXxReec","14FLR0MR5X","VerEAB3qem","OxWIHm4bxU","07n1cRBhp0","S2Dfu5iGN5","UlU3MFLsph","Nxx9Vuupzk","dhSuHPYBf4",
+"NcICAsoy9t","KASQ8SjskQ","EoToPU3yw5","lXFOBAkKTk","DQimpuQIcz","8cVD3CxVEf","lweGylCMxy","FPfSEoGu6x","lCMxyIRh48","faHiratef2",
+"lXFOBfqypy","uLtKsS77LH","zHF1qQChxs","Ul4a1e6e4z","gIYvEs7Mxk","FLsphIn3NS","jfREuGWqqX","i7WMQxReec","h1zcH7fKYU","CdyBV7hyVv",
+"rKDLJ64s8N","F6PT2CIShG","0Wr5yhSSvQ","yToGWEdBKc","Mkgy8AOgEe","24ARFuupzk","wDajXTCgPp","1LB1LDz1R3","9eoRc5Namm","QnJ1Saez9y",
+"8xEKzL7cGc","XflUqcL0aE","Mkgy8rhl0J","5drc6hi5X7","29QAzru4UG","NAFuwWreyP","Yh1hFKr8ys","WMiS3QClRL","djsrvxReec","uZPqg8hJdt",
+"s7MxkhSSvQ","GSQwj48cHL","xciqpIRh48","HlUbFWMiS3","lkMUACqqaD","b29RJSmGzv","pAhR1K20wK","8xEKzI7p2a","kZANmfFDrJ","soy9tMaJQs",
+"tlILtlpF6W","tAOsrogLgc","zqH0Waez9y","sqVrflkMUA","Waim6W3VFH","yEfy93otm6","fmIK1uN6r3","5drc6CqqaD","O3iyQrz7Ut","45cIHCp3mZ",
+"ThjNnogLgc","5IhmGQYxC0","VerEALDk6f","NOHszzz4ZU","uZPqgpWiOs","IBe8k8U2nU","wDajXIn3NS","CqqaDTCgPp","hSSvQ0h1b1","EoToPmX2GE",
+"i3pyd64s8N","vOqCEgjUTu","5nmWvRpBQm","CqqaDyvOMI","hSSvQCK5W7","pWiOs14FLR","azIWpv2eC3","zmLYDZUnqt","QYxC0GWqqX","gf8rI55rfB",
+"ECMvU8FmFH","k85Ae14FLR","v1Hlny94nw","TXQ0ZGSQwj","faHirFxX9q","aDGtSt59lR","M6qcG45cIH","2hEEUvkCHH","0Wr5yFhtgl","zY1GYnFqik",
+"taOXKNAFuw","dmoS7ni2v1","7fKYUMGlTF","5Mg9rFVMxo","hi5X7e6e4z","Uvlv4VBjhz","TCgPpVNCPd","rhl0JVBjhz","2ZHdk7hyVv","SbRYyQbxXc",
+"Ul4a1uLtKs","LbRTHCK5W7","b29RJRxrsm","Dz1R3XflUq","yofH3580YD","lCMxyRsQUq","5VZjSoQ87r","6AFT09y4lw","yofH3jeskS","ogLgc14FLR",
+"lsQGoqUJMd","CIShG8TxD7","fcwDaTCgPp","ReKEWJRJQB","W7cTsix74r","0BmCysuY4x","zHF1qB3qem","dmoS7FLsph","Waim6Zv7z0","1v5hHx3LDe",
+"lkMUAMmsIo","fqypylj07Q","7hyVvxReec","jS1ajQssNC","Z4I1v9y4lw","BFkb88U2nU","LDk6fm4bxU","Zv7z0BCxeC","sqVrfDz1R3","nnP8oMGlTF",
+"ogLgc2ZHdk","45cIHPOUYS","StlDJFLsph","RACujPYBf4","lH1kt0MR5X","euZA5HP433","mX2GEPb1pa","pT8wulpF6W","uPX7GtAOsr","W7cTsO3iyQ",
+"CqqaDCNHmv","M3zXLFwEJz","L7cGcFVMxo","zY1GYlj07Q","Pb1padmoS7","DQimppiJSk","gtCA5pAhR1","5Namm7ku1p","AgJHQ0h1b1","D6rBy55rfB",
+"VLTy6ThjNn","Pb1paJXljW","uLtKs5iGN5","AkKTkEoToP","hSSvQkZANm","DQimpjtn0X","8RCUAW3VFH","hi5X72TRI7","VjCZqZv7z0","64s8NMaJQs",
+"Vprf25drc6","tuDySazIWp","JRJQBmX2GE","uZPqgJXljW","lj07QprNT6","I7p2aVNCPd","29QAzfqypy","MaJQspT8wu","ZuDtD5IhmG","CNHmvuAWyp",
+"wiHrZFNYIM","M6qcG5IhmG","W3VFHFFDui","FNYIMSjskQ","zz4ZUxciqp","0ao3lFPfSE","DG4sTZv7z0","QYxC0iB08l","iKqhr4dEz6","guMb8fqypy",
+"DQimp5nmWv","VLTy6BFkb8","Ta8f6SWfou","dmoS7pT8wu","0PktI2ZHdk","4QMc92ZHdk","QssNC24ARF","TCgPpMojnP","8RCUAKZamH","GrDg7d85a9",
+"2TRI79GXkX","2Yz7Eru4UG","suY4xblLA9","No0Qb2Nslm","C2Irc9iGoT","1LB1LLewvM","vOqCEDG4sT","0ao3l7fsYM","wiHrZjiVBP","CxVEfVLTy6",
+"VjCZqsuY4x","K20wKXflUq","7hyVvjiVBP","8U2nUM6qcG","Chuy3iB08l","OHaBztl72W","CxVEfuoStw","nlaByhe9IA","pvgjSThjNn","jS1ajQworu",
+"zY1GY8xEKz","SWfouuTacx","lm0pDChuy3","IjTwPydG8U","DQimp8cVD3","uN6r3NhXdu","uvf7AuLtKs","4dEz6aL6AJ","ix74rU3yw5","ZhwG1Nxx9V",
+"k85AeZhwG1","vLsmSuoStw","JXljWuPX7G","pAhR1FVMxo","qQxHPZJTXH","IjTwPDG4sT","xciqpWmadA","6q6L9Ta8f6","DG4sTGSQwj","IKxdLZzJHW",
+"NOHszFcWrW","fcJOyZzJHW","UlU3MO3iyQ","FwEJzCdyBV","JXljWWaim6","uTacxqaofN","GrDg77Ow5C","ogLgcix74r","Nxx9VnFqik","8cVD3Kr8ys",
+"CK5W7uoStw","zqH0WUl4a1","1j5L8xXTI4","ThjNnvkCHH","ThjNntl72W","9GXkXa00b5","Yf2EcGWqqX","FcWrWvLsmS","ReKEW64s8N","GXdoHI7p2a",
+"RBhp0bgJAz","o8Uydgf8rI","1LB1Lo8Uyd","3otm6HzZT8","48cHLjzUqR","Ul4a1gjUTu","OxWIHdhSuH","0ao3lIn3NS","6q6L9s4786","WmadA9iGoT",
+"CdyBVJIqXi","y94nwFGzgp","GXdoHL7cGc","QYxC07hyVv","KsjRKvLsmS","cShY2ksJby","Nxx9VdmoS7","1j5L8d85a9","1v5hH64s8N","L7cGcQnJ1S",
+"8U2nUjSjS3","VIlwPpT8wu","BpYhVNcICA","8xEKz5Drn0","gjUTu9XyT9","o8UydazIWp","vLsmSoGu6x","vLsmSY1mC0","ciuWzDz1R3","AkKTkAgJHQ",
+"RzaZASmGzv","yEfy9hUTw7","Ta8f67fKYU","uJScXBbwgA","l83UdLDk6f","BpYhVSbRYy","16lHcQnJ1S","GXdoHGSQwj","lkMUAlweGy","djsrvkB5nP",
+"hSSvQZ4I1v","RsQUqGSQwj","Q6Lix1j5L8","4dEz6JIqXi","uJScX5iGN5","mz8gxPOUYS","SWfouIjTwP","s93MlpWiOs","yluBxzQt6Q","HfyNQaFFss",
+"hSSvQi3pyd","pvgjSciuWz","0BmCyD6rBy","ciuWz07n1c","CIShG5Mg9r","zQt6QMmsIo","FVMxo5Namm","MmsIoF6PT2","LDk6fEoToP","brhlQsuY4x",
+"uN6r3zmLYD","cShY20Wr5y","K4GS8h1zcH","1v5hHPOUYS","8FmFHqaofN","0BmCySs0Zu","QClRL0Kyfs","t59lRzFgtB","yEfy9RkQke","HfyNQn1pmO",
+"IRh48vLsmS","x3LDeXyPZN","IRh48HlUbF","AIYUuL7cGc","WaWsv618Di","k85AelViBv","RzaZA0Wr5y","JKWYRoQ87r","7fsYM48cHL","Pb1pa5iGN5",
+"guMb8pv0i7","45cIHgjUTu","8RCUAt59lR","No0QbWaWsv","9iGoTzFgtB","Mkgy8YjB9t","ciuWzI7p2a","mz8gxdhSuH","5drc6uTacx","lj07QjzUqR",
+"QYxC0GXdoH","TCgPpjfREu","PYBf4Rxrsm","5NammguMb8","8hJdtNo0Qb","FnPFBgdQsS","lweGyFwEJz","580YDEdBKc","taOXKQClRL","gIYvEIBe8k",
+"HRxd8JXljW","FcWrWuN6r3","Yh1hF2ZHdk","uJScX8cVD3","3weIFy94nw","0YAGHcL0aE","FcWrW24ARF","Uvlv4MK07Y","fLNg8gtCA5","iB08lU3yw5",
+"fqypy16lHc","TwanoMmKGJ","bgJAz0PktI","IBe8koQ87r","MojnPfqypy","FjHXRJ2mQi","SbRYyOxWIH","QClRLjiVBP","NOHszmX2GE","xXTI4HlUbF",
+"ZuDtDTXQ0Z","G1RhS0h1b1","pT8wutAOsr","CNHmvdpe1v","U3yw57fKYU","taOXKciuWz","Z4I1vI7p2a","WPmlxfqypy","d85a9EoToP","5iGN55Mg9r",
+"ni2v1tlILt","M6qcGRkQke","qUJMdn1pmO","FwEJzTCgPp","0BmCyHRxd8","WmadAPOUYS","UmaEvZhwG1","CqqaDnnP8o","8cVD3UmaEv","pvgjSNOHsz",
+"gIYvEblLA9","fFDrJzFgtB","uTacxuZPqg","jeskSCIShG","uPX7GYf2Ec","618DiM6qcG","suY4xpWiOs","vOqCEJkzUn","zQt6QazIWp","RmDcrcShY2",
+"5IhmGuQIcz","QWxoTjSjS3","FcWrWIRh48","GrDg7Qworu","NcICAatef2","K20wKjiVBP","4dEz6dpe1v","1v5hHuTacx","ThjNndpe1v","G1RhSv2eC3",
+"d85a9dmoS7","nlaByGSQwj","SWfouoVQp6","7hyVvMK07Y","K20wKVBjhz","WaWsvQbxXc","FLsphW7cTs","lpF6WOUqFM","ogLgcuN6r3","5ZaEz14FLR",
+"WreyPpvgjS","WPmlxsuY4x","IRh48atef2","8xEKzIn3NS","uvf7AfcwDa","pmeCdaL6AJ","yluBxMojnP","euZA5hYBCK","iB08ld85a9","RmDcr0BmCy",
+"KZamHlViBv","In3NSmX2GE","QworujfREu","ix74rsuY4x","pWiOss7Mxk","Uvlv4GWqqX","0ao3lgf8rI","07n1cb29RJ","45cIHy94nw","FGzgpVprf2",
+"nFqikhSSvQ","F6PT214FLR","VIlwPQnJ1S","k85Ae8TxD7","gf8rIGSQwj","d7vjMJXljW","vLsmSuN6r3","MK07Ylm0pD","VjCZqfcwDa","MmsIo2TRI7",
+"tlILtYw2oU","faHirRmDcr","yvOMIoQ87r","Zv7z0EOE1o","ydG8UQssNC","guMb8W3VFH","0PktIWMiS3","LDk6fIKxdL","dmoS7nFqik","VjCZqNo0Qb",
+"C2IrcZv7z0","2TRI7sqVrf","16lHcVNCPd","rKDLJCfgr3","580YDoQ87r","iKqhrX6Pin","lm0pDlkMUA","J2mQilH1kt","fcJOyeuZA5","0PktIXflUq",
+"lweGyiwzGk","WPmlx9GXkX","580YDni2v1","CxVEffmIK1","atef2atef2","OUYuFsoy9t","VerEAfqypy","LbRTHxReec","Chuy3xXTI4","RzaZAjSjS3",
+"GrDg7lm0pD","IRh48Fhtgl","gIYvEYOfrY","EOE1oO3iyQ","48cHLEdBKc","yEfy9Z4I1v","MezSWWreyP","7fsYMuTacx","bgJAzPOUYS","rz7Ut2ZHdk",
+"kB5nPzqH0W","DcpWBM3zXL","ulk411v5hH","SbRYyvLsmS","QbxXcFwEJz","Vprf2WmadA","pmeCdzFgtB","CqqaDd7vjM","oGu6xZv7z0","zmLYDWaim6",
+"AgJHQsuY4x","NOHsziB08l","OUYuFTa8f6","xReeche9IA","WDVWJJRJQB","W3VFHiKqhr","zbIYY2hEEU","EoToPIRh48","lH1ktdjsrv","7fKYUmz8gx",
+"s93MlpvgjS","2Yz7EjiVBP","J2mQitl72W","ksJbyMGlTF","m4bxUIKxdL","Pb1paCxVEf","0Kyfs9rlg9","dmoS764s8N","k85AejS1aj","aL6AJnFqik",
+"MmsIo55rfB","SjskQYOfrY","JRJQBbgJAz","jzUqRvkCHH","55rfB2ZHdk","O3iyQwiHrZ","hYBCKI7p2a","QworuzQt6Q","AgJHQwDajX","C2IrcMojnP",
+"4QMc9fLNg8","i7WMQIn3NS","7Ow5CMm8si","fFDrJtjQxs","OxWIH9eoRc","NAFuwYjB9t","aFFsszQt6Q","lsQGo5IhmG","QssNCNhXdu","fcJOyS2Dfu",
+"FxX9q3otm6","soy9tX6Pin","14FLRHlUbF","MojnPlXFOB","s7MxkHP433","zQt6Q618Di","b29RJvOqCE","jeskSQChxs","FFDuitjQxs","xReec0PktI",
+"L7cGcJ2mQi","FxX9qlkMUA","cShY2ix74r","5NammlXFOB","vLsmSMm8si","iKqhrMmsIo","EOE1oNOHsz","45cIH55rfB","QnJ1Se6e4z","U3yw5fmIK1",
+"NOHszChuy3","pmeCddpe1v","WPmlxoGu6x","lpF6W9eoRc","Fhtgl2Yz7E","Yh1hF7ku1p","HlUbFYw2oU","oVQp6S2Dfu","bZLvS7fsYM","lm0pD5Drn0",
+"L7cGc7fsYM","dpe1vEoToP","hSSvQQYxC0","lj07QRACuj","IRh48AOgEe","ThjNnBbwgA","x3LDeVBjhz","FnPFBCxVEf","fmIK1IBe8k","fLNg814FLR",
+"HzZT8yluBx","AgJHQpAhR1","7Ow5CazIWp","yofH3m4bxU","tjQxs9eoRc","aDGtS618Di","KZamHO3iyQ","MojnPgtCA5","s93Mlt59lR","ReKEWoVQp6",
+"7X3uyFVMxo","GWqqXRpBQm","9y4lwblLA9","POUYSfcJOy","FGzgpuPX7G","VNCPdTXQ0Z","tl72W6AFT0","dhSuHlj07Q","uAWypv2eC3","6q6L90h1b1",
+"45cIHTa8f6","2hEEUS2Dfu","piJSkzbIYY","ciuWzhE1Ql","48cHLuZPqg","KsjRKzmLYD","AXpwEM3zXL","PYBf4KsjRK","WmadAAkKTk","KsjRKYf2Ec",
+"hSSvQtvdkD","HlUbFIBe8k","Vprf2BFkb8","M6qcGm4bxU","zY1GYNcICA","MojnPpiJSk","hE1QlWMiS3","i7WMQ5drc6","zmLYDdpe1v","e6e4zuJScX",
+"kZANmHP433","n8pJ9EdBKc","5Drn0jSjS3","faHirrhl0J","0PktI07n1c","8cVD3pWiOs","zHF1quvf7A","BbwgAbZLvS","OHaBz9eoRc","JXljWiB08l",
+"s47867hyVv","cL0aEdhSuH","M3zXLprNT6","Uvlv4prNT6","9iGoTuJScX","5VZjSzqH0W","ogLgcjtn0X","prNT62Nslm","DQimpdQ586","0ao3llkMUA",
+"0ao3l7lUXZ","yofH3LewvM","JkzUnpWiOs","uZPqgMmKGJ","cShY2FPfSE","KsjRKv8yFN","2Nslm0Wr5y","D6rBylj07Q","45cIHjzUqR","fcJOyn8pJ9",
+"zQt6Qv8yFN","Cp3mZ5drc6","fcwDaxReec","gIYvE0PktI","8FmFHqUJMd","ZJTXHiKqhr","zz4ZUNxx9V","ReKEWTCgPp","FnPFBxciqp","vLsmSB3qem",
+"OUqFMjSjS3","FGzgpsqVrf","3weIFSjskQ","gjUTulweGy","zz4ZUThjNn","jS1aj0Kyfs","uLtKsQnJ1S","VLTy63otm6","FFDuieuZA5","guMb8s4786",
+"gjUTu618Di","euZA5DLhzM","2Yz7EO3iyQ","fqypytl72W","vOqCE2TRI7","prNT6iKqhr","DcpWBrKDLJ","lH1ktfFDrJ","0PktIfqypy","F6PT2pT8wu",
+"tlILtvOqCE","QChxsjiVBP","VBjhzogLgc","prNT6CqqaD","lj07QG1RhS","dQ586GXdoH","gtCA5e6e4z","GXdoHoGu6x","uLtKse6e4z","mX2GEBFkb8",
+"4dEz6tvdkD","5ZaEzksJby","tAOsrzz4ZU","d85a9DLhzM","Mkgy8CxVEf","QYxC0fLNg8","SjskQLewvM","s7MxkCdyBV","gf8rIcL0aE","9iGoTkZANm",
+"FjHXRK4GS8","bZLvSQnJ1S","AmdQdFFDui","RzaZAGWqqX","CxVEfBpYhV","5NammAIYUu","7lUXZ0PktI","Zv7z0FNYIM","pmeCdOUYuF","8FmFHM3zXL",
+"mX2GEl83Ud","OHaBz0YAGH","tl72WDLhzM","uoStwHzZT8","RACujLDk6f","POUYSFFDui","blLA90BmCy","tlILtVprf2","P6bcgjSjS3","P6bcgsqVrf",
+"24ARFVIlwP","fFDrJFhtgl","IRh48aL6AJ","WreyPfLNg8","X6PinpT8wu","vOqCE3weIF","1j5L83weIF","MmKGJOz8yZ","jSjS3tAOsr","XyPZNydG8U",
+"oQ87rWPmlx","C2IrcKASQ8","mz8gxzY1GY","55rfBqaofN","tlILttaOXK","Vprf2hSSvQ","tjQxsru4UG","uQIcztuDyS","Mm8si48cHL","FcWrWBFkb8",
+"1j5L8K20wK","ogLgcuoStw","ZUnqtfLNg8","l83UdJXljW","bZLvSfFDrJ","cShY2ydG8U","QbxXc29QAz","zbIYYpFrrl","FNYIMVLTy6","QClRLuvf7A",
+"No0QbFxX9q","O3iyQo8Uyd","rhl0JuAWyp","tvdkDoGu6x","CNHmvru4UG","GWqqXlViBv","CxVEfyofH3","64s8NGrDg7","DQimpvLsmS","OxWIHOHaBz",
+"P6bcgzHF1q","fLNg8ZUnqt","Q6hMCG1RhS","U3yw5L7cGc","1LB1LKZamH","F6PT2o8Uyd","QbxXcG1RhS","uoStwyluBx","v8yFNiqv4k","1j5L855rfB",
+"YOfrYO3iyQ","WaWsvvLsmS","SmGzvPOUYS","BbwgAPb1pa","UlU3MXyPZN","Y1mC0LbRTH","DLhzMFxX9q","v8yFNIjTwP","16lHcFxX9q","Twano580YD",
+"oVQp6FjHXR","atef23otm6","d85a9t59lR","JKWYRi7WMQ","VerEApiJSk","kZANmix74r","ni2v1oVQp6","ciuWzulk41","CNHmvv1Hln","nFqiknnP8o",
+"jiVBPzz4ZU","uLtKstAOsr","2TRI7t59lR","fcwDa7fsYM","9eoRc45cIH","jSjS3RkQke","S2Dfu7hyVv","pmeCdGv3Fq","No0QbqUJMd","jfREuogLgc",
+"0Kyfs8xEKz","zz4ZUtvdkD","s4786F6PT2","AXpwEJkzUn","YOfrY14FLR","SmGzvIjTwP","iKqhrW7cTs","XflUqLbRTH","0PktIgIYvE","Nxx9Vlj07Q",
+"dpe1vZUnqt","m4bxUVerEA","v8yFNgIYvE","vkCHHulk41","tuDyS55rfB","pWiOsMaJQs","x3LDehYBCK","C2Irc48cHL","FNYIM0h1b1","2DREsrhl0J",
+"VjCZqFPfSE","Ss0ZuMmKGJ","ru4UGGXdoH","M3zXLCxVEf","2DREsYOfrY","CdyBVgIYvE","hE1QlRzaZA","ZUnqtLewvM","ydG8U9eoRc","LbRTHy94nw",
+"J2mQitvdkD","hE1QlGv3Fq","qaofNVjCZq","gtCA5SWfou","16lHcQClRL","euZA5bZLvS","J2mQiNxx9V","VjCZqMK07Y","WDVWJ8FmFH","Vprf2cmXIX",
+"Ss0Zu5Mg9r","B3qem9rlg9","d85a9NOHsz","StlDJm4bxU","WMiS32ZHdk","07n1cyofH3","2ZHdk9GXkX","8TxD7s93Ml","v8yFN9rlg9","ThjNnDQimp",
+"BpYhVX6Pin","2TRI7ZUnqt","LewvMSs0Zu","kZANmlsQGo","Cfgr3zz4ZU","0MR5XXflUq","AkKTkxciqp","Y1mC0fcJOy","GSQwjMm8si","Cp3mZ7hyVv",
+"uZPqgM6qcG","jiVBPVprf2","e6e4zQWxoT","QClRLuupzk","L7cGcYf2Ec","pWiOslH1kt","o8UydyvOMI","TXQ0ZFnPFB","W3VFHTa8f6","ulk41pFrrl",
+"gIYvEIRh48","BFkb8QYxC0","WreyPuQIcz","DLhzMb29RJ","580YDJJs5m","C2IrcQssNC","cmXIXCdyBV","S77LHs7Mxk","MojnPFNYIM","ZuDtDdjsrv",
+"a00b5ECMvU","CNHmvCp3mZ","24ARFGv3Fq","vLsmSjzUqR","lViBvkB5nP","fLNg816lHc","QssNC3weIF","TCgPpOHaBz","2Yz7EQ6Lix","8RCUAxReec",
+"zQt6QVLTy6","M3zXL9GXkX","tjQxsReKEW","0PktI7lUXZ","Mkgy8n8pJ9","2hEEU7fsYM","taOXKiKqhr","4dEz6KASQ8","lkMUAPb1pa","FGzgpIRh48",
+"euZA5JJs5m","uAWyp48cHL","SjskQWaWsv","a00b5Z4I1v","brhlQtvdkD","AOgEeuLtKs","rKDLJkB5nP","8RCUA2ZHdk","L7cGcHzZT8","580YD45cIH",
+"UlU3MzmLYD","cShY2XflUq","cShY2pmeCd","lH1kts93Ml","9XyT95drc6","4dEz6wDajX","cL0aESmGzv","QClRLRpBQm","POUYS0h1b1","fLNg8Rxrsm",
+"8xEKzHRxd8","tl72WWreyP","lj07QQnJ1S","P6bcgrhl0J","3weIFEoToP","hE1QljSjS3","xXTI4StlDJ","lXFOBI7p2a","Cp3mZiKqhr","aez9yhi5X7",
+"Yw2oUQnJ1S","AIYUulpF6W","cmXIXGSQwj","EdBKcpvgjS","jSjS3K20wK","QClRLIRh48","tvdkD2Nslm","9y4lwUvlv4","uJScX45cIH","4W0Tl3weIF",
+"VjCZquTacx","FGzgpX6Pin","WaWsvS2Dfu","FNYIMjzUqR","7Ow5CzFgtB","Kr8ysdmoS7","zz4ZU2Nslm","XflUqPOUYS","S77LH5iGN5","NOHsz9rlg9",
+"Fhtgl5Namm","QChxsru4UG","0MR5XCdyBV","1j5L8JkzUn","atef2wDajX","0KyfslpF6W","nFqikOz8yZ","0KyfsvkCHH","SjskQ9rlg9","VjCZqnlaBy",
+"lH1ktsoy9t","J2mQigf8rI","45cIHs7Mxk","lCMxy8xEKz","aDGtSjSjS3","uPX7GEoToP","iB08lW7cTs","GWqqXFFDui","RmDcrMkgy8","RzaZAsqVrf",
+"F6PT2VBjhz","SWfousuY4x","m4bxU8xEKz","uJScXW3VFH","0PktIYw2oU","GrDg77fKYU","24ARFuJScX","7X3uy5Drn0","3otm65Namm","gdQsSQ6Lix",
+"YOfrYIBe8k","DQimpZJTXH","2DREsZzJHW","RxrsmjfREu","uTacxjS1aj","CdyBVguMb8","3otm6uJScX","0PktISmGzv","Ta8f6M6qcG","tuDySx3LDe",
+"FxX9qMkgy8","MaJQsNhXdu","dhSuHciuWz","sqVrflpF6W","he9IAwiHrZ","AOgEeZzJHW","7ku1pTa8f6","RACujmX2GE","0MR5XxReec","5VZjSZzJHW",
+"C2Ircuvf7A","cL0aEUl4a1","tjQxs5ZaEz","VIlwPhi5X7","SWfouaez9y","zbIYYuvf7A","vOqCEK20wK","soy9ttuDyS","jzUqRWreyP","AkKTk3otm6",
+"EOE1oTa8f6","WmadAOz8yZ","PYBf4MmsIo","k85AesqVrf","guMb8wiHrZ","Yh1hFK4GS8","gdQsSgIYvE","pFrrlQnJ1S","jtn0XNhXdu","0ao3lQ6hMC",
+"d7vjMfcJOy","kB5nPQWxoT","W7cTspFrrl","d7vjMfaHir","WreyPdhSuH","ciuWz2Yz7E","Y1mC0faHir","BFkb8azIWp","Q6LixlpF6W","9XyT9s7Mxk",
+"LewvMMm8si","iB08luPX7G","ZhwG1o8Uyd","qQxHPCNHmv","oQ87r48cHL","he9IA45cIH","CNHmvVNCPd","tvdkDSWfou","l83Udzz4ZU","L7cGc5Namm",
+"m4bxUAXpwE","Q6hMCjSjS3","yToGWtAOsr","JKWYRvOqCE","aDGtSuJScX","OxWIHU3yw5","JXljWgtCA5","QworuCxVEf","CK5W7tjQxs","QChxsiqv4k",
+"n8pJ9C2Irc","8cVD3ReKEW","lweGyCp3mZ","0Wr5yblLA9","MK07YRACuj","29QAzU3yw5","6q6L9EOE1o","BbwgAMojnP","zmLYD6q6L9","lsQGoQssNC",
+"ZUnqtksJby","t98iWlCMxy","NOHsz2hEEU","No0Qb7fKYU","HP433sqVrf","1j5L8l83Ud","jeskSiB08l","QbxXc9eoRc","sqVrfFjHXR","6AFT0n8pJ9",
+"2Yz7EcQOnv","2hEEUciuWz","uvf7ANxx9V","VjCZqEdBKc","JIqXi3otm6","jiVBPZzJHW","jS1ajIBe8k","mz8gxCqqaD","CNHmv0YAGH","kB5nPi7WMQ",
+"48cHLNOHsz","i3pydpAhR1","POUYSjSjS3","9eoRcTCgPp","VjCZqFnPFB","cmXIXsuY4x","rKDLJni2v1","hE1QlbZLvS","taOXKvOqCE","pWiOsHlUbF",
+"Pb1paazIWp","Uvlv4n8pJ9","faHirPYBf4","dhSuHgjUTu","IRh48G1RhS","iKqhrrz7Ut","S77LHydG8U","K20wKgIYvE","nFqikzQt6Q","7X3uyyluBx",
+"2hEEUjzUqR","d85a9QWxoT","24ARFUl4a1","SWfou5nmWv","Q6LixlCMxy","s93MlAIYUu","2DREs7X3uy","ZzJHWIKxdL","dpe1vIRh48","ydG8U9XyT9",
+"QWxoTHRxd8","S77LHsx5Gl","ydG8ULewvM","FPfSELewvM","16lHcBpYhV","8cVD3580YD","uN6r329QAz","rhl0J48cHL","7X3uyjtn0X","Ta8f6ru4UG",
+"MezSWCK5W7","0PktIC2Irc","29QAzHfyNQ","WreyPjfREu","5NammHlUbF","IBe8kjS1aj","yofH3tlILt","JXljWVjCZq","QChxs14FLR","zqH0WFNYIM",
+"3weIFhe9IA","vOqCEbgJAz","WMiS3qQxHP","y94nwlXFOB","CIShGIjTwP","HlUbFOz8yZ","W7cTsBGaQY","GSQwj1LB1L","8FmFHtlILt","ni2v1OUYuF",
+"faHir5iGN5","jzUqRS2Dfu","HzZT8suY4x","TCgPpFxX9q","MGlTFs4786","PYBf4ZUnqt","QworuVIlwP","tlILtjS1aj","BFkb8QnJ1S","BbwgAjfREu",
+"0KyfsThjNn","6AFT0M6qcG","7hyVvwiHrZ","WmadA0Kyfs","0YAGHyToGW","n1pmOL7cGc","RpBQmIKxdL","okgRi5nmWv","h1zcHKr8ys","YOfrYiwzGk",
+"jfREuaDGtS","JIqXixciqp","9XyT9nlaBy","8xEKzjtn0X","iwzGkUvlv4","jSjS3P6bcg","wiHrZ1LB1L","tAOsr5ZaEz","BpYhVzFgtB","45cIHs93Ml",
+"guMb8okgRi","aDGtSTwano","lkMUAjtn0X","X6Pinsoy9t","ThjNnbZLvS","F6PT2S2Dfu","HfyNQblLA9","gdQsSEOE1o","NcICAbgJAz","tl72WuQIcz",
+"Vprf20Wr5y","nnP8oUmaEv","kZANmrz7Ut","KASQ8RmDcr","tjQxs8U2nU","3otm6oQ87r","X6Pind7vjM","OHaBzHlUbF","UlU3MfaHir","ZhwG1vLsmS",
+"lsQGoDcpWB","h1zcHWaWsv","Q6hMCogLgc","0MR5X8U2nU","lpF6WYjB9t","uvf7AtaOXK","yofH3RpBQm","d85a97fKYU","FcWrWFhtgl","IKxdLDLhzM",
+"ZhwG1QClRL","AkKTklH1kt","piJSkgtCA5","8xEKzKr8ys","In3NSUl4a1","8RCUAm4bxU","5drc67ku1p","POUYS2DREs","kZANmk85Ae","3weIFv1Hln",
+"fcwDaFLsph","ThjNnHlUbF","ogLgcd7vjM","WreyPSWfou","8cVD3W3VFH","FnPFBgjUTu","yluBxokgRi","MaJQsyofH3","5nmWvjS1aj","2DREs8FmFH",
+"iwzGkK20wK","DLhzMuZPqg","OUqFMJXljW","GSQwjRxrsm","kB5nPv1Hln","piJSk4W0Tl","xciqpFFDui","v8yFNqaofN","ydG8UpT8wu","B3qem580YD",
+"POUYSMmKGJ","SmGzvyvOMI","5drc6brhlQ","v8yFNm4bxU","tlILti3pyd","zY1GYlXFOB","jeskStaOXK","QssNC5Mg9r","t98iWQClRL","5Drn0HzZT8",
+"8RCUAQWxoT","v8yFNwiHrZ","618DiMaJQs","16lHcyofH3","CxVEf4W0Tl","hE1QlChuy3","VBjhzatef2","AkKTkd85a9","YjB9tSs0Zu","uoStwuoStw",
+"cL0aEXyPZN","s4786S2Dfu","WMiS3M6qcG","cL0aEsoy9t","iqv4kCqqaD","d7vjMPb1pa","6q6L9BFkb8","5iGN5FwEJz","tl72W5IhmG","v8yFNY1mC0",
+"07n1cdhSuH","ZhwG1aFFss","JXljWS2Dfu","ReKEWpiJSk","nFqikJ2mQi","atef21v5hH","2hEEUVIlwP","HlUbF5Namm","mX2GEZzJHW","7fsYMcmXIX",
+"8xEKz7fKYU","ni2v1HP433","LDk6fYf2Ec","Waim6aFFss","t59lRoQ87r","i3pyd7fsYM","16lHcogLgc","tjQxsd85a9","16lHc55rfB","dQ586WPmlx",
+"kZANm29QAz","Yh1hFfcwDa","7fsYMNhXdu","Zv7z0IRh48","LbRTHDG4sT","FjHXR3weIF","Zv7z0QssNC","pWiOsjSjS3","gjUTuydG8U","45cIHxReec",
+"BFkb8XflUq","k85AeBFkb8","lkMUAfFDrJ","hUTw7GSQwj","Zv7z06AFT0","QnJ1SFLsph","TCgPp7hyVv","7fKYUJXljW","SjskQksJby","VerEAvkCHH",
+"AIYUu9iGoT","SjskQpT8wu","VjCZqvkCHH","L7cGcCNHmv","b29RJNOHsz","blLA9nFqik","TXQ0ZO3iyQ","yToGWCK5W7","GWqqX5drc6","0h1b15Namm",
+"5IhmG7Ow5C","FNYIMzY1GY","xciqpHlUbF","blLA964s8N","SWfoud85a9","hE1QldQ586","fFDrJLewvM","atef2RmDcr","OHaBztjQxs","d7vjMi7WMQ",
+"IKxdLKr8ys","iKqhrv2eC3","0YAGH5iGN5","jtn0X580YD","9GXkXpWiOs","lj07Q55rfB","zFgtB5Drn0","HRxd8S2Dfu","IBe8kZ4I1v","wiHrZfmIK1",
+"gdQsStuDyS","ReKEW3weIF","2Nslm0ao3l","0ao3lv1Hln","wDajX0PktI","VBjhzRmDcr","fLNg8RACuj","s7MxkzHF1q","Chuy3CdyBV","Mm8sidpe1v",
+"OxWIHECMvU","5drc6uJScX","fFDrJ5ZaEz","J2mQinFqik","0BmCyZuDtD","lCMxyCp3mZ","brhlQWMiS3","BbwgAYf2Ec","v8yFNi3pyd","OxWIH9y4lw",
+"ThjNnfmIK1","48cHLhE1Ql","pv0i7RkQke","tl72WogLgc","8TxD7pWiOs","BbwgAYOfrY","tjQxsNAFuw","M6qcGMK07Y","HP433blLA9","XflUqIRh48",
+"ix74r618Di","QWxoTAgJHQ","JXljWSWfou","Nxx9VFLsph","lCMxy0ao3l","v1HlnNcICA","QbxXcUl4a1","JKWYR8FmFH","QClRLo8Uyd","ZuDtDAIYUu",
+"uupzkTa8f6","6q6L9IjTwP","b29RJVprf2","gf8rIZ4I1v","qQxHPKsjRK","hi5X7KZamH","64s8NpWiOs","jiVBP5Mg9r","0MR5XuoStw","tjQxsBGaQY",
+"LbRTHK20wK","8xEKzHzZT8","0ao3lCK5W7","WDVWJAmdQd","7hyVvFPfSE","FLsphzmLYD","ZJTXHv2eC3","O3iyQfaHir","YOfrYVprf2","yToGWbrhlQ",
+"CdyBVCp3mZ","pFrrllsQGo","wDajXfmIK1","aez9yFFDui","qUJMd8U2nU","a00b5tjQxs","M6qcGSbRYy","mz8gxuupzk","2ZHdkWreyP","ECMvU7ku1p",
+"K4GS8bZLvS","7hyVvuZPqg","0KyfsmX2GE","cL0aEtl72W","soy9tdpe1v","pWiOsDcpWB","k85AeCdyBV","8RCUA3weIF","BFkb8k85Ae","Gv3FqZ4I1v",
+"fFDrJ9iGoT","7fsYMbgJAz","gIYvEJ2mQi","faHir7fsYM","X6Pin1j5L8","MezSWQ6Lix","dmoS7HlUbF","VjCZqECMvU","jSjS3zqH0W","azIWpAmdQd",
+"FLsphRxrsm","uoStwCNHmv","faHirHP433","lm0pDTa8f6","ZUnqtUl4a1","4dEz6zz4ZU","SbRYyHlUbF","AOgEegjUTu","nlaBy4W0Tl","gtCA5tuDyS",
+"yEfy9FNYIM","POUYSyToGW","CNHmvcmXIX","jSjS3zz4ZU","s93MlksJby","F6PT2B3qem","29QAz8TxD7","QWxoTFjHXR","FhtglPYBf4","aFFssqaofN",
+"pFrrl5Drn0","fcwDaOHaBz","TCgPpydG8U","fcJOyVprf2","fmIK1vLsmS","CNHmvdmoS7","jS1ajYw2oU","AmdQdBGaQY","Dz1R39y4lw","djsrvydG8U",
+"16lHct59lR","8U2nUm4bxU","QWxoTuupzk","jSjS3t59lR","jeskSjS1aj","FGzgp9iGoT","FjHXRfFDrJ","Vprf207n1c","b29RJSs0Zu","SWfouRBhp0",
+"he9IAv8yFN","MK07YAgJHQ","ydG8UhE1Ql","2Yz7E7fKYU","s4786s4786","LDk6f2ZHdk","uAWyp4QMc9","8hJdt618Di","KsjRKFVMxo","Yw2oUBFkb8",
+"lXFOBY1mC0","CxVEfguMb8","5Drn0xXTI4","TXQ0ZfFDrJ","ZJTXHWaWsv","uoStwbgJAz","0KyfshE1Ql","tl72Wh1zcH","iwzGkMmKGJ","pFrrl5IhmG",
+"7X3uyNxx9V","zqH0WW7cTs","MK07YMmKGJ","VIlwPSjskQ","KZamHStlDJ","y94nwzY1GY","OxWIHpv0i7","VNCPdcShY2","0PktIQWxoT","ogLgccmXIX",
+"Vprf27Ow5C","Yf2EclCMxy","ydG8UY1mC0","45cIHlj07Q","DG4sTHRxd8","QnJ1Sdpe1v","LbRTHFPfSE","zz4ZUO3iyQ","fcwDauN6r3","2ZHdkPOUYS",
+"dQ586iwzGk","prNT67lUXZ","uupzk5iGN5","JKWYRxXTI4","hSSvQXyPZN","uQIczQClRL","S2DfukZANm","JRJQBwDajX","piJSknnP8o","cL0aE0Kyfs",
+"yToGWFjHXR","RzaZA1v5hH","s4786s7Mxk","t59lRlXFOB","5Drn0OxWIH","guMb8Cp3mZ","Yw2oUlpF6W","618DiIKxdL","Chuy3hE1Ql","Pb1papmeCd",
+"iwzGkwiHrZ","n1pmO7fKYU","6q6L9gIYvE","M6qcG8U2nU","QClRLChuy3","fLNg8fFDrJ","GWqqXFwEJz","zqH0W0Wr5y","ZJTXH0YAGH","FwEJzCNHmv",
+"7lUXZNAFuw","ix74roQ87r","EdBKcIKxdL","oQ87rAOgEe","4QMc955rfB","Yw2oUChuy3","7lUXZRxrsm","5Drn0ZhwG1","MGlTFRACuj","aDGtSNhXdu",
+"lpF6WQssNC","OUqFMFLsph","pv0i7n8pJ9","Dz1R3DLhzM","W7cTsoVQp6","Gv3Fqrz7Ut","lkMUAFGzgp","9rlg9Gv3Fq","n1pmOaDGtS","OxWIHMaJQs",
+"DLhzMcQOnv","MojnPiwzGk","kZANmJ2mQi","soy9te6e4z","vOqCEThjNn","MezSWVNCPd","618DiAmdQd","24ARFS77LH","G1RhSOHaBz","FFDui5Namm",
+"CIShG580YD","lkMUAEdBKc","GWqqXDQimp","blLA9NhXdu","S77LHJ2mQi","24ARFQChxs","7hyVvQYxC0","ksJby2TRI7","0Wr5yOxWIH","BGaQYblLA9",
+"guMb8VNCPd","FLsphdmoS7","2ZHdkn8pJ9","5NammMojnP","0Wr5ydjsrv","ZhwG1wDajX","Gv3FqjS1aj","soy9tFjHXR","0KyfszbIYY","Uvlv45ZaEz",
+"FwEJzzmLYD","fLNg8t59lR","qUJMdxXTI4","QYxC0rhl0J","gjUTuU3yw5","OHaBzoQ87r","2NslmpAhR1","9y4lwFjHXR","QChxsGXdoH","tjQxsStlDJ",
+"ulk41AkKTk","WDVWJSbRYy","In3NSjtn0X","5Drn0Q6Lix","fcJOy24ARF","dQ586tlILt","SbRYyuN6r3","7ku1p1LB1L","2ZHdkUvlv4","soy9tDLhzM",
+"Qworurz7Ut","XyPZNStlDJ","I7p2aVIlwP","FcWrWdjsrv","Q6LixjeskS","i7WMQlweGy","v8yFN2Nslm","qQxHPuQIcz","Y1mC0ZhwG1","QworufmIK1",
+"9XyT9K4GS8","5ZaEzThjNn","fFDrJcShY2","5nmWvnnP8o","blLA9RBhp0","DcpWBS2Dfu","wDajXuQIcz","cShY25drc6","lCMxy5iGN5","Pb1paZzJHW",
+"Pb1parhl0J","s4786ZJTXH","mX2GEM6qcG","uoStwatef2","7lUXZvOqCE","m4bxUdjsrv","GWqqXCxVEf","ZUnqtWmadA","faHirCp3mZ","yofH3xciqp",
+"pvgjS29QAz","iwzGk1j5L8","ogLgcfcwDa","QWxoTi7WMQ","7hyVvl83Ud","ksJby8U2nU","K4GS8BbwgA","IjTwPJKWYR","BpYhVhe9IA","7ku1pOUqFM",
+"WreyPzQt6Q","tvdkDd85a9","5nmWvM6qcG","gtCA5Chuy3","Yw2oUyEfy9","euZA5U3yw5","vOqCEtAOsr","IKxdL55rfB","ReKEWSmGzv","OUYuF0h1b1",
+"i3pydlweGy","8U2nUy94nw","6q6L9JXljW","uAWypJIqXi","LewvMNOHsz","2ZHdkfLNg8","gjUTupv0i7","cShY2IRh48","TCgPpuAWyp","atef2ciuWz",
+"hUTw7wDajX","8TxD79y4lw","cShY2b29RJ","nFqik0ao3l","xXTI4KsjRK","MK07YjS1aj","5NammY1mC0","IKxdLhSSvQ","FPfSEBFkb8","pvgjSS77LH",
+"lViBvSjskQ","VerEAmz8gx","JIqXiBCxeC","lViBvW3VFH","ZuDtDMmKGJ","cL0aEksJby","v1Hln5drc6","RzaZAB3qem","Z4I1vmz8gx","DLhzMMmKGJ",
+"L7cGciB08l","hSSvQ9XyT9","WreyPIRh48","ix74rCK5W7","gjUTugdQsS","azIWpWaWsv","i3pyd0YAGH","ydG8UChuy3","xXTI4M6qcG","nlaByAgJHQ",
+"ksJbyi7WMQ","Mm8sipvgjS","2ZHdkEdBKc","jtn0XL7cGc","n1pmOG1RhS","pv0i7he9IA","yvOMIulk41","NAFuwnlaBy","WPmlx7hyVv","S77LHzqH0W",
+"aDGtSzbIYY","jeskSRsQUq","AgJHQKsjRK","5drc62hEEU","QbxXcVerEA","7X3uyDLhzM","WreyPnnP8o","0BmCyk85Ae","8RCUAjzUqR","0Wr5yYh1hF",
+"2DREsNhXdu","HRxd8uTacx","M6qcGBbwgA","IjTwPYh1hF","L7cGc4dEz6","64s8NazIWp","MmKGJ8hJdt","AIYUunnP8o","v1Hln7fsYM","tjQxsuZPqg",
+"k85AehUTw7","WMiS3IRh48","tAOsrG1RhS","gdQsSCp3mZ","atef2WDVWJ","ECMvUWMiS3","8xEKzK4GS8","ZuDtDlj07Q","lkMUAFLsph","FnPFBpmeCd",
+"WreyPZ4I1v","2ZHdkOHaBz","2Yz7EDz1R3","QnJ1SpAhR1","hE1QlwiHrZ","P6bcgaDGtS","ksJbyUlU3M","7hyVvCNHmv","0Kyfs6q6L9","s4786xXTI4",
+"0KyfsM3zXL","uupzksqVrf","HlUbFAmdQd","FGzgpWMiS3","ReKEWlpF6W","d7vjMd7vjM","zz4ZUCp3mZ","4QMc9S2Dfu","fFDrJJkzUn","rhl0JWDVWJ",
+"oVQp6Fhtgl","fFDrJfcJOy","v8yFNW3VFH","5IhmGqUJMd","y94nw0MR5X","16lHcqaofN","iB08lxReec","cmXIX618Di","FjHXREdBKc","M3zXL2Nslm",
+"pmeCde6e4z","uJScX7hyVv","EdBKcZUnqt","pv0i7FjHXR","In3NSTXQ0Z","tAOsrhSSvQ","gdQsS580YD","M3zXL24ARF","9y4lwfmIK1","DcpWBDz1R3",
+"wDajXHzZT8","Ul4a1B3qem","Kr8ysx3LDe","3weIFYh1hF","7ku1pcmXIX","s93MlcmXIX","7hyVvqUJMd","Dz1R39eoRc","jiVBPThjNn","h1zcHFLsph",
+"gIYvEIKxdL","P6bcgWMiS3","vkCHHzz4ZU","RsQUqvkCHH","lsQGoi7WMQ","gIYvEnFqik","fmIK19rlg9","FFDui7hyVv","rhl0JOHaBz","I7p2alH1kt",
+"SbRYy9rlg9","UlU3MuLtKs","guMb8uAWyp","S2DfujfREu","mX2GEIjTwP","AXpwEatef2","JIqXitl72W","vOqCE2DREs","ThjNnGWqqX","vOqCEY1mC0",
+"guMb8bgJAz","e6e4z7hyVv","CIShG5ZaEz","JJs5mFjHXR","Cp3mZzFgtB","VerEANOHsz","fcJOy4W0Tl","EOE1oP6bcg","HP433U3yw5","Q6LixtjQxs",
+"XflUqiwzGk","pAhR1pv0i7","OxWIHn8pJ9","hYBCK24ARF","oGu6xIBe8k","JIqXilpF6W","hE1QlhUTw7","SjskQ0ao3l","pFrrlpv0i7","jS1ajEdBKc",
+"7fKYU2hEEU","HRxd8CqqaD","d7vjMJIqXi","9iGoTBCxeC","MK07Y8xEKz","bZLvS2DREs","lH1ktChuy3","WMiS3lkMUA","VIlwPMezSW","Kr8ysh1zcH",
+"CK5W70PktI","45cIH9y4lw","wDajXqQxHP","L7cGc8xEKz","VIlwPEoToP","JXljWThjNn","Vprf2iwzGk","8TxD78xEKz","HP433cL0aE","FnPFBzmLYD",
+"QnJ1Sv8yFN","zmLYDn1pmO","FPfSE8RCUA","yvOMIStlDJ","7fKYUazIWp","lm0pDZUnqt","WreyPbgJAz","Zv7z0k85Ae","RmDcr8U2nU","aFFssmz8gx",
+"tl72WtAOsr","RACuj7Ow5C","d7vjMdmoS7","W7cTssoy9t","jtn0XY1mC0","2ZHdk5Namm","iwzGksqVrf","X6Pin4dEz6","zqH0WtaOXK","iwzGkYOfrY",
+"dpe1v45cIH","gf8rIy94nw","2hEEUQ6hMC","Uvlv4BFkb8","lj07QBbwgA","atef2FcWrW","hSSvQ8cVD3","lViBvuZPqg","ciuWzOUYuF","bZLvSazIWp",
+"oVQp6dQ586","fFDrJ580YD","pWiOslm0pD","GWqqXKZamH","jSjS3ydG8U","zHF1qzqH0W","t59lRKr8ys","HfyNQQworu","8TxD7yToGW","QnJ1SuQIcz",
+"jSjS3OUqFM","5nmWvlm0pD","ni2v1x3LDe","s7Mxk8hJdt","CxVEflm0pD","CqqaD16lHc","9eoRclCMxy","pv0i7tAOsr","ECMvUsx5Gl","45cIHvOqCE",
+"NhXdu0PktI","nlaByWDVWJ","BGaQYGWqqX","brhlQ8xEKz","SbRYysuY4x","mX2GElXFOB","xXTI4GSQwj","8U2nUYOfrY","ZuDtDXyPZN","WreyP7ku1p",
+"QClRLSWfou","bgJAz5iGN5","QWxoTJkzUn","CxVEfQnJ1S","rKDLJBpYhV","cmXIXuJScX","IjTwPUvlv4","AgJHQyluBx","n8pJ9NhXdu","29QAzChuy3",
+"rz7Ut580YD","KZamHQYxC0","yEfy9tjQxs","Q6hMCulk41","580YDWMiS3","TXQ0ZbgJAz","vOqCE9eoRc","Mkgy8WPmlx","lm0pDzz4ZU","zqH0WWaWsv",
+"IKxdLzmLYD","G1RhSqUJMd","n8pJ9a00b5","IKxdLdpe1v","618DiNcICA","pWiOsix74r","hSSvQjS1aj","2Yz7Exciqp","I7p2akZANm","MezSW7lUXZ",
+"0MR5XJRJQB","zqH0WrKDLJ","K4GS8lsQGo","JRJQBaDGtS","FxX9qhE1Ql","Yw2oUtl72W","AmdQdNAFuw","FxX9qnFqik","1LB1LOz8yZ","SmGzvWDVWJ",
+"lXFOB2hEEU","SjskQeuZA5","SjskQlH1kt","VLTy629QAz","BpYhVAIYUu","M3zXL580YD","atef2jzUqR","J2mQiVerEA","Nxx9VazIWp","uJScXCK5W7",
+"FGzgpfLNg8","oVQp6tjQxs","lpF6Ws4786","AgJHQThjNn","7fKYUFnPFB","TCgPp8FmFH","8cVD35IhmG","ZUnqtG1RhS","sx5GlReKEW","nnP8ohSSvQ",
+"7Ow5CAXpwE","LewvMKASQ8","fLNg8e6e4z","FVMxopAhR1","1j5L8UlU3M","Y1mC0tjQxs","FnPFBQssNC","Q6hMC9rlg9","L7cGcfqypy","zFgtB1LB1L",
+"yEfy9SmGzv","gtCA5IjTwP","CxVEfuQIcz","0YAGHlm0pD","VBjhz4dEz6","J2mQiqUJMd","guMb8JkzUn","In3NSKZamH","fmIK1n8pJ9","lXFOBAIYUu",
+"W7cTs0Kyfs","Uvlv407n1c","2ZHdktaOXK","AgJHQciuWz","29QAzMmsIo","oQ87rzz4ZU","FGzgpuJScX","xciqp1v5hH","bgJAzCp3mZ","45cIHlXFOB",
+"gIYvE9rlg9","MK07YGWqqX","ECMvUSWfou","9iGoTHzZT8","QChxsCIShG","yvOMIAOgEe","C2IrcFwEJz","0Wr5yWmadA","GXdoHVNCPd","lweGytaOXK",
+"3otm6J2mQi","5drc6uZPqg","8U2nUuZPqg","LewvMKZamH","euZA50Wr5y","nFqikdmoS7","sqVrf55rfB","piJSk8hJdt","Uvlv49XyT9","LewvMuZPqg",
+"QssNC0BmCy","BpYhVAmdQd","djsrvNcICA","C2Irc8U2nU","Chuy3fLNg8","CqqaDpWiOs","QChxsTwano","TXQ0Zgf8rI","atef25iGN5","BpYhVRsQUq",
+"wDajXGv3Fq","5drc6mX2GE","2TRI79XyT9","1LB1LIBe8k","k85AeIKxdL","MmKGJpmeCd","POUYS618Di","FVMxojSjS3","Yh1hFuPX7G","2Yz7EMm8si",
+"Kr8ystvdkD","NcICAQChxs","0BmCyJIqXi","uZPqg9y4lw","pT8wux3LDe","zbIYYtAOsr","WaWsvUmaEv","gjUTuuupzk","MaJQs4QMc9","IKxdLyluBx",
+"BpYhVs93Ml","ciuWzcQOnv","14FLRguMb8","lCMxyTa8f6","hSSvQsx5Gl","7fKYUfcJOy","HzZT8h1zcH","Y1mC07X3uy","NhXduKZamH","MojnPDG4sT",
+"Z4I1vU3yw5","fFDrJKsjRK","ReKEWLewvM","QYxC0CK5W7","ciuWz9eoRc","e6e4z5IhmG","GrDg7J2mQi","DLhzMaDGtS","IBe8kRBhp0","LbRTHC2Irc",
+"7X3uy8U2nU","lweGy0h1b1","xReecGWqqX","NAFuwt59lR","BGaQYnlaBy","k85AeHlUbF","BFkb8L7cGc","Gv3Fq9eoRc","FnPFB5Namm","DcpWB4QMc9",
+"SbRYy9eoRc","tAOsre6e4z","lweGyZzJHW","VerEAAIYUu","jfREuOz8yZ","618DizmLYD","BFkb8WreyP","DG4sTECMvU","2TRI7Y1mC0","jtn0XECMvU",
+"Chuy35IhmG","FwEJzuvf7A","i3pydksJby","RzaZA580YD","prNT60YAGH","wiHrZ9GXkX","y94nwTXQ0Z","okgRi4W0Tl","i3pydMojnP","jtn0Xl83Ud",
+"BCxeCzz4ZU","FhtglBbwgA","QworubgJAz","xReecVIlwP","uPX7GfmIK1","Chuy3SmGzv","MojnPHlUbF","CNHmvPYBf4","CIShGU3yw5","RACujuLtKs",
+"Mkgy8Fhtgl","TwanoguMb8","VBjhzFwEJz","tvdkDB3qem","ZUnqtpT8wu","9y4lwSmGzv","o8UydDQimp","GrDg71j5L8","guMb8xReec","h1zcHFGzgp",
+"k85AeCK5W7","BGaQYzmLYD","zHF1qoGu6x","gjUTuSmGzv","ZuDtDHP433","lViBv24ARF","vkCHHlXFOB","QworuDz1R3","v2eC3Nxx9V","v8yFNpiJSk",
+"580YDB3qem","mX2GE0h1b1","tAOsraez9y","FFDuixciqp","CK5W7UlU3M","hSSvQ5Namm","5VZjSCqqaD","soy9tYjB9t","FVMxoRkQke","8U2nU0PktI",
+"HfyNQZJTXH","F6PT2lCMxy","x3LDe8FmFH","ZUnqtcmXIX","jSjS3x3LDe","5IhmGU3yw5","djsrvAgJHQ","1v5hHqaofN","kB5nP5Namm","KZamHksJby",
+"oGu6x2DREs","MmsIo5Namm","HRxd89iGoT","uoStwaez9y","LbRTHFnPFB","FcWrWJJs5m","5Mg9rGv3Fq","cQOnve6e4z","uN6r3aFFss","fqypyKASQ8",
+"CdyBVYw2oU","jtn0XqaofN","CIShGaDGtS","OUYuFCqqaD","SWfouix74r","uoStwe6e4z","lH1kta00b5","i7WMQReKEW","JRJQBTa8f6","ulk419iGoT",
+"fFDrJUvlv4","0MR5X3weIF","MojnP7Ow5C","yluBxjS1aj","SmGzv2DREs","1LB1LzFgtB","SjskQ8TxD7","0Kyfsx3LDe","GWqqX3otm6","YOfrYWreyP",
+"euZA5d85a9","aFFssWmadA","vOqCEGXdoH","Zv7z0yvOMI","C2IrcOUqFM","rhl0J5Mg9r","t98iW0Kyfs","aL6AJo8Uyd","BFkb8uAWyp","fFDrJ7lUXZ",
+"9y4lwM3zXL","soy9tYf2Ec","yofH3RmDcr","ThjNndmoS7","CK5W7sqVrf","0KyfsFGzgp","14FLRjSjS3","QYxC0bgJAz","y94nwFwEJz","uAWypdmoS7",
+"oQ87rHRxd8","v8yFNQChxs","7ku1p16lHc","ZzJHWx3LDe","ksJbyCNHmv","IRh48fcJOy","7fsYMC2Irc","gIYvE0Kyfs","guMb8ru4UG","VerEAgtCA5",
+"uoStw0MR5X","0Wr5yqaofN","PYBf4MaJQs","uN6r3nlaBy","7fsYML7cGc","k85Aeo8Uyd","gIYvEwiHrZ","fqypyRzaZA","ThjNnVLTy6","HP433FGzgp",
+"blLA9pAhR1","djsrvm4bxU","0KyfsJKWYR","AkKTkdmoS7","jS1ajOxWIH","vLsmSatef2","lm0pDzQt6Q","9iGoTBpYhV","5iGN5azIWp","FnPFBJRJQB",
+"DLhzMZhwG1","1v5hHtvdkD","uupzkKsjRK","0Wr5yxReec","S2DfuVjCZq","m4bxU4W0Tl","t98iWpAhR1","lXFOBTwano","OUqFMHRxd8","MmsIo5nmWv",
+"pT8wu5drc6","W7cTsRxrsm","7Ow5Cb29RJ","Mm8siXflUq","uPX7G2Nslm","Twano1LB1L","t98iWlweGy","uN6r3BpYhV","tjQxsYw2oU","WaWsvdpe1v",
+"1LB1L64s8N","GXdoHSbRYy","Ta8f6jSjS3","RkQkeuAWyp","m4bxUChuy3","In3NSFVMxo","soy9thE1Ql","tl72W8xEKz","I7p2auLtKs","suY4xpT8wu",
+"brhlQbgJAz","x3LDeAmdQd","bZLvSulk41","pFrrldmoS7","5ZaEzsx5Gl","gdQsSQssNC","sx5GlIBe8k","VBjhzVjCZq","xXTI4JkzUn","Kr8ysECMvU",
+"sx5GlpWiOs","7X3uyStlDJ","AXpwEK4GS8","FjHXRo8Uyd","QYxC07Ow5C","2ZHdkjeskS","7fKYUWDVWJ","MaJQslViBv","iqv4kWaim6","pv0i7kB5nP",
+"v1Hln5nmWv","8U2nUbrhlQ","jS1ajuupzk","x3LDek85Ae","9GXkXQssNC","tuDySRxrsm","FVMxouvf7A","ni2v1xciqp","FxX9qmz8gx","cL0aEs7Mxk",
+"0MR5XkB5nP","e6e4zUl4a1","Pb1pas7Mxk","4dEz6n8pJ9","CIShG0ao3l","3otm6lm0pD","GXdoHS77LH","VLTy6aFFss","0h1b1nnP8o","uZPqg8U2nU",
+"jfREuNxx9V","FnPFB2TRI7","hUTw7Yh1hF","7fsYMsuY4x","fcJOygtCA5","nlaByMm8si","MmsIoi7WMQ","n1pmO8xEKz","tvdkD3otm6","iwzGko8Uyd",
+"KASQ8uZPqg","pWiOsJXljW","B3qemXyPZN","RACujkB5nP","zbIYY5drc6","rz7UtzHF1q","WreyP8RCUA","fqypyEdBKc","WDVWJazIWp","NhXduAXpwE",
+"Nxx9VNAFuw","QWxoTRpBQm","VLTy6ru4UG","pmeCdReKEW","ZhwG1gtCA5","he9IAJkzUn","ksJbyRzaZA","yofH3NcICA","nlaByjS1aj","k85AeUmaEv",
+"No0Qb7ku1p","FFDuiK20wK","7lUXZ5ZaEz","NOHszaL6AJ","pv0i7KASQ8","YjB9tHzZT8","MojnPOUqFM","LDk6fuupzk","QWxoT8hJdt","EOE1o55rfB",
+"ulk41qQxHP","lkMUAuTacx","zbIYYRkQke","fFDrJqaofN","fFDrJ16lHc","cmXIXEOE1o","QssNCprNT6","faHir7ku1p","kZANmJJs5m","Chuy3CNHmv",
+"fcwDapiJSk","m4bxUKASQ8","uLtKstaOXK","24ARFCfgr3","BpYhVOUYuF","mX2GE7fsYM","AmdQdVjCZq","zY1GY07n1c","uAWypJRJQB","pvgjSkZANm",
+"suY4xtAOsr","gjUTu9GXkX","9rlg9bZLvS","OUYuFiqv4k","pvgjSW7cTs","SjskQfLNg8","dmoS7BbwgA","Mm8siK4GS8","2Nslm55rfB","RmDcrlj07Q",
+"7Ow5C7Ow5C","J2mQi9eoRc","DcpWB5IhmG","AgJHQi7WMQ","pAhR1n8pJ9","IjTwPKASQ8","e6e4zW3VFH","lm0pDDQimp","ECMvU0Kyfs","x3LDeSbRYy",
+"LDk6fcL0aE","pmeCdUl4a1","KASQ80Kyfs","FjHXRBbwgA","3weIFm4bxU","wiHrZMojnP","Zv7z0oVQp6","uoStwuN6r3","y94nwNOHsz","jS1ajCxVEf",
+"P6bcg7X3uy","FwEJz618Di","LDk6fQssNC","55rfBMezSW","5drc6QChxs","Yh1hFRBhp0","gIYvElsQGo","ZUnqtydG8U","uQIczulk41","Oz8yZW7cTs",
+"faHirCqqaD","K20wKFFDui","s4786t98iW","RzaZAzbIYY","7Ow5CFNYIM","NOHszFnPFB","9XyT9v1Hln","J2mQifLNg8","IjTwPJkzUn","IKxdLuN6r3",
+"lsQGoatef2","kZANmcL0aE","FcWrWuZPqg","7fsYMxXTI4","BFkb8FLsph","EdBKcGWqqX","580YD9GXkX","yofH3FLsph","Vprf2FVMxo","M6qcG7ku1p",
+"dQ586he9IA","2DREsIKxdL","zz4ZUQ6Lix","MojnPuupzk","IKxdLQClRL","LewvMuN6r3","0h1b1W3VFH","jeskSjSjS3","FFDuiNhXdu","prNT6lkMUA",
+"FhtglNAFuw","Q6Lixb29RJ","Yw2oU07n1c","G1RhSRzaZA","Q6LixzQt6Q","1v5hHaez9y","m4bxUHfyNQ","7hyVvQWxoT","aFFsslViBv","RzaZAKr8ys",
+"xReec0ao3l","FnPFBJkzUn","AkKTkqaofN","Waim6KZamH","IRh48QYxC0","X6Pin2TRI7","uTacxkZANm","HfyNQD6rBy","hE1QlcQOnv","ru4UGM6qcG",
+"1LB1LfaHir","45cIHpmeCd","F6PT2pmeCd","CqqaD4dEz6","RxrsmFhtgl","UlU3MOHaBz","RBhp00MR5X","Yw2oUQworu","lH1ktEdBKc","GXdoHPb1pa",
+"e6e4zmz8gx","FxX9q1v5hH","Mkgy8y94nw","fmIK17ku1p","LbRTHlCMxy","aez9yMm8si","GWqqXtlILt","jeskSuQIcz","suY4xbZLvS","2ZHdkgjUTu",
+"Oz8yZ1v5hH","Ul4a1KsjRK","Vprf2FwEJz","QworuiwzGk","nnP8onFqik","l83UdtuDyS","BbwgA9eoRc","m4bxUfcwDa","2TRI7WmadA","2NslmnFqik",
+"VLTy6B3qem","jeskSlsQGo","5ZaEzjSjS3","IKxdLguMb8","Cp3mZFGzgp","Cfgr3Fhtgl","gjUTuFLsph","618DimX2GE","prNT6Kr8ys","DQimp7X3uy",
+"v8yFN2TRI7","l83UdoQ87r","suY4xFGzgp","LewvMMezSW","7fKYUcL0aE","jfREux3LDe","M3zXLfFDrJ","4dEz6Mm8si","pv0i7RpBQm","YOfrYFLsph",
+"MojnPWreyP","VBjhz1v5hH","lj07QSmGzv","Y1mC0QbxXc","he9IAblLA9","hSSvQOz8yZ","CNHmvTwano","RBhp0Kr8ys","580YDDQimp","LDk6flkMUA",
+"kZANmW3VFH","Rxrsmx3LDe","xciqp2ZHdk","jSjS3lH1kt","s7MxkS2Dfu","CdyBVjSjS3","yluBxJ2mQi","uZPqgAOgEe","4dEz67fKYU","tl72WAkKTk",
+"I7p2aK20wK","VIlwPpvgjS","GWqqX7ku1p","kZANm4W0Tl","tl72WgdQsS","JJs5mBGaQY","iB08l0PktI","uLtKs5nmWv","rhl0JK20wK","ReKEWOUYuF",
+"5VZjSyofH3","qUJMd29QAz","cShY24dEz6","QWxoTtjQxs","0MR5Xn1pmO","W7cTsfLNg8","7lUXZiwzGk","3weIFDz1R3","BFkb8DLhzM","e6e4z14FLR",
+"D6rByuZPqg","SmGzvuupzk","uTacxQYxC0","qUJMdTXQ0Z","o8UydWMiS3","Y1mC0uTacx","ECMvURBhp0","Vprf2FNYIM","WPmlxQnJ1S","tuDySoVQp6",
+"5drc6xXTI4","Qworu9GXkX","suY4x8RCUA","lsQGo2hEEU","0MR5X0MR5X","ydG8Utl72W","M6qcGZJTXH","9GXkXaDGtS","TXQ0ZRpBQm","mz8gxBCxeC",
+"d85a9fcJOy","QnJ1SwDajX","bZLvSpmeCd","Ta8f6IRh48","2hEEUv2eC3","zqH0WAOgEe","EdBKcHRxd8","xReec5Drn0","9rlg9v1Hln","ReKEWLDk6f",
+"MGlTFrz7Ut","dhSuHYf2Ec","W3VFHQChxs","KASQ8EoToP","55rfBeuZA5","hSSvQ2ZHdk","3weIFBGaQY","MaJQssqVrf","ulk41DcpWB","1LB1L5Mg9r",
+"pFrrlpmeCd","JXljW5Drn0","BGaQYFGzgp","wDajXni2v1","RpBQmBFkb8","lCMxy7fsYM","FcWrWatef2","LbRTHv2eC3","d85a9AXpwE","Vprf2No0Qb",
+"CNHmv1v5hH","Ss0Zufqypy","M3zXL1v5hH","Chuy3k85Ae","TXQ0ZB3qem","M6qcGYjB9t","ciuWzuQIcz","14FLRI7p2a","kZANmvLsmS","uoStwv2eC3",
+"O3iyQ5IhmG","0h1b1qQxHP","zz4ZUKsjRK","ksJbylViBv","xReecZuDtD","GSQwj9iGoT","1j5L8FNYIM","JXljWni2v1","FGzgpJ2mQi","oGu6x5nmWv",
+"JIqXiEdBKc","pmeCdQClRL","F6PT2yToGW","No0QbEOE1o","0YAGHnlaBy","8FmFHlsQGo","ru4UG9GXkX","WPmlxNo0Qb","Y1mC0yToGW","MmKGJ9GXkX",
+"euZA5n1pmO","KASQ8X6Pin","tjQxsMojnP","SbRYy24ARF","cShY2QWxoT","djsrvDLhzM","4dEz6t98iW","9XyT93otm6","WreyPtuDyS","TXQ0ZZzJHW",
+"n8pJ9FPfSE","C2IrcRsQUq","qQxHPYf2Ec","2NslmpiJSk","v1HlnlkMUA","TwanoQChxs","7Ow5CFhtgl","Ul4a1AgJHQ","B3qem4W0Tl","blLA9WaWsv",
+"Pb1pa0MR5X","UmaEvAgJHQ","TXQ0ZzqH0W","AgJHQHfyNQ","ZhwG18FmFH","DLhzMMK07Y","WaWsvjeskS","wDajXqaofN","3weIFUlU3M","Zv7z0xciqp",
+"JkzUnfLNg8","580YD2ZHdk","nnP8oMmsIo","Cfgr30Kyfs","Q6LixyofH3","piJSkRzaZA","zQt6QVNCPd","Kr8ysJXljW","CxVEfQ6hMC","7X3uyv2eC3",
+"I7p2aOz8yZ","ru4UGgtCA5","2NslmQ6hMC","M3zXLMK07Y","l83Ud3weIF","1j5L8WreyP","Vprf2X6Pin","FhtglFwEJz","NOHszjfREu","hSSvQGrDg7",
+"WPmlxlCMxy","4W0TlRsQUq","UlU3MjS1aj","Q6Lixa00b5","48cHLVIlwP","B3qemVprf2","QClRL7X3uy","lm0pDh1zcH","7ku1pZUnqt","I7p2axXTI4",
+"ZhwG10MR5X","No0QbEdBKc","EOE1ocmXIX","JXljWDG4sT","lj07QAkKTk","yEfy9Chuy3","Waim6uJScX","CdyBVlweGy","0ao3l55rfB","faHirsqVrf",
+"JkzUnAmdQd","guMb8Yh1hF","JkzUnB3qem","uJScXI7p2a","nlaByzbIYY","yEfy9iqv4k","pAhR1RBhp0","Oz8yZh1zcH","2hEEUJkzUn","4dEz6WreyP",
+"29QAzM3zXL","VLTy6mz8gx","7hyVvhUTw7","5VZjSRBhp0","No0Qb5Mg9r","RsQUqMaJQs","h1zcHhSSvQ","jeskS3otm6","5IhmGKZamH","M6qcGsuY4x",
+"faHirSWfou","WmadApiJSk","e6e4zlXFOB","sx5Glt98iW","lweGyBbwgA","Oz8yZuvf7A","oVQp69y4lw","dpe1vdhSuH","uLtKs5IhmG","ZzJHWatef2",
+"nFqikZUnqt","aFFssJKWYR","hSSvQSWfou","POUYSS2Dfu","VerEANcICA","cmXIXBFkb8","7lUXZtjQxs","1j5L80PktI","t59lRv8yFN","8xEKzdjsrv",
+"7lUXZtlILt","guMb8lCMxy","MojnPFcWrW","JRJQBjiVBP","ZhwG1piJSk","qaofNK4GS8","v8yFNhi5X7","fmIK1nlaBy","faHirtAOsr","AgJHQTXQ0Z",
+"KZamHokgRi","fLNg8uAWyp","1v5hHnnP8o","5IhmGBbwgA","mX2GEjS1aj","S2Dfuuupzk","ni2v1JXljW","zFgtB5ZaEz","0Wr5yzY1GY","tvdkD0PktI",
+"RkQkeQnJ1S","e6e4zeuZA5","Yf2EclkMUA","9XyT98U2nU","lViBv0PktI","fLNg8vLsmS","24ARFatef2","lH1ktF6PT2","In3NSjeskS","CqqaD2ZHdk",
+"uTacxJkzUn","8hJdtAgJHQ","618Di7hyVv","WDVWJ1j5L8","dQ586t98iW","KsjRKIRh48","hSSvQpFrrl","FLsphVIlwP","I7p2aix74r","NhXdunnP8o",
+"2TRI7jSjS3","pWiOsQworu","RkQkennP8o","JKWYR8cVD3","CIShGFVMxo","7ku1pQWxoT","7hyVvoGu6x","ciuWzlweGy","fFDrJnlaBy","rhl0JAXpwE",
+"HfyNQRACuj","W3VFHLDk6f","VBjhzCK5W7","Q6hMCBCxeC","zqH0WfFDrJ","QChxs5Mg9r","rhl0Je6e4z","DLhzMfLNg8","Q6LixQnJ1S","BFkb8tjQxs",
+"BpYhVlViBv","oQ87r29QAz","7fKYUFNYIM","F6PT2QClRL","lXFOBX6Pin","d85a9a00b5","tlILtZhwG1","GSQwjjzUqR","ulk41nlaBy","8TxD7dmoS7",
+"lCMxydmoS7","AmdQd2Yz7E","RACujJkzUn","0Wr5y0PktI","FhtglcL0aE","M3zXL7X3uy","okgRiogLgc","zY1GY0Wr5y","hSSvQFhtgl","NhXdu0h1b1",
+"ru4UGMaJQs","fFDrJpv0i7","Rxrsmzz4ZU","dmoS7IjTwP","ZUnqt0PktI","VBjhz2ZHdk","L7cGcqUJMd","Yw2oUBpYhV","CdyBVaez9y","aDGtStvdkD",
+"1j5L8WDVWJ","DcpWBQChxs","pT8wun1pmO","No0QbAOgEe","hUTw7VNCPd","iB08ldpe1v","Mm8sifmIK1","gjUTugIYvE","P6bcgrKDLJ","yvOMInFqik",
+"2Yz7E3otm6","POUYSs93Ml","o8UydO3iyQ","QssNCjeskS","8FmFHCxVEf","5iGN5yToGW","JXljWtaOXK","AOgEeDG4sT","lm0pDFPfSE","mz8gxMGlTF",
+"zqH0WpAhR1","rKDLJtuDyS","suY4xPOUYS","BbwgAStlDJ","0ao3lGrDg7","QChxsKsjRK","hUTw7uN6r3","v2eC3QWxoT","5ZaEzsuY4x","DQimpbZLvS",
+"EOE1oReKEW","vkCHHLewvM","atef2h1zcH","y94nwMmKGJ","RmDcrd85a9","ix74rM6qcG","JIqXiblLA9","n8pJ9cShY2","VjCZqeuZA5","5drc6MojnP",
+"mX2GEJJs5m","MojnPdmoS7","h1zcHIRh48","uLtKsJIqXi","VerEAwiHrZ","v8yFNlj07Q","Mkgy8tl72W","FFDuiDcpWB","ix74rxReec","d85a97fsYM",
+"BbwgA2TRI7","2ZHdkpT8wu","8TxD7s4786","Pb1paFLsph","uLtKsuPX7G","RpBQmUmaEv","WmadAG1RhS","8RCUAyEfy9","3weIF5IhmG","GXdoHfaHir",
+"W3VFHlH1kt","StlDJL7cGc","zY1GYdhSuH","CqqaDy94nw","Vprf2JKWYR","hi5X7vOqCE","euZA5Nxx9V","Y1mC00YAGH","cmXIXaFFss","3weIFt59lR",
+"ZJTXHAOgEe","ru4UGBpYhV","6q6L9k85Ae","hYBCKhUTw7","8U2nUOz8yZ","gIYvEChuy3","2TRI7QWxoT","JKWYRfqypy","pWiOs0PktI","yEfy9IKxdL",
+"WDVWJyEfy9","rKDLJBFkb8","6AFT0EOE1o","AmdQd7fKYU","dhSuH5nmWv","48cHLyvOMI","0MR5XfFDrJ","3weIFRBhp0","okgRitvdkD","lj07QS2Dfu",
+"29QAzogLgc","0Wr5yoQ87r","GSQwjix74r","7Ow5CPb1pa","RpBQmQClRL","zHF1qx3LDe","tuDySDz1R3","G1RhSYf2Ec","hYBCKkB5nP","FNYIMiwzGk",
+"K4GS8brhlQ","3otm6ReKEW","ix74r8FmFH","O3iyQpvgjS","Qworuix74r","618Di5Namm","pvgjSyToGW","ni2v1EoToP","DcpWBs7Mxk","v2eC3ZUnqt",
+"uQIczXflUq","suY4xzbIYY","P6bcgjiVBP","uupzkjfREu","Gv3FqZuDtD","yluBxWmadA","Q6hMCvLsmS","dQ586PYBf4","MmsIojfREu","e6e4z5VZjS",
+"i3pydx3LDe","ThjNniKqhr","0Wr5yksJby","3otm6t98iW","bZLvSlm0pD","2TRI7oGu6x","sx5GlkZANm","ThjNnd85a9","9iGoTW3VFH","yofH3AmdQd",
+"No0QbgjUTu","0BmCy0MR5X","0YAGHlj07Q","lViBv0Kyfs","C2IrcVLTy6","D6rByn1pmO","FFDuiG1RhS","qaofNOz8yZ","iKqhr64s8N","Cfgr30h1b1",
+"qUJMdQssNC","dmoS7MmKGJ","WaWsvFGzgp","FPfSEhYBCK","ydG8UQnJ1S","zY1GY8cVD3","xReecHP433","rKDLJECMvU","o8UydFcWrW","vLsmSguMb8",
+"Vprf2aFFss","AXpwEjzUqR","SWfouni2v1","CK5W7CxVEf","RkQkehSSvQ","sx5GlRzaZA","ZUnqtEOE1o","9y4lwogLgc","mz8gxlj07Q","UmaEv4QMc9",
+"ZuDtDzFgtB","tl72WDG4sT","hYBCKhSSvQ","KASQ8ogLgc","7fsYMIBe8k","4QMc9jiVBP","FcWrWtlILt","0KyfsRBhp0","O3iyQJ2mQi","48cHLQWxoT",
+"POUYS2Yz7E","Mkgy829QAz","5ZaEzCdyBV","0MR5Xs7Mxk","NOHszYh1hF","8U2nUjeskS","Oz8yZlH1kt","a00b5uTacx","48cHLxciqp","Mm8siKZamH",
+"oVQp6zQt6Q","m4bxUzz4ZU","ogLgczQt6Q","gtCA5580YD","5ZaEzjS1aj","jtn0XyluBx","y94nwni2v1","5iGN5Q6hMC","Q6hMCZzJHW","iB08lStlDJ",
+"KASQ8No0Qb","yToGWRACuj","jtn0Xlm0pD","nFqikC2Irc","s93MlHRxd8","k85AefaHir","9eoRcv2eC3","QworuokgRi","Z4I1v580YD","In3NSfFDrJ",
+"FLsphWPmlx","he9IACdyBV","x3LDeogLgc","d85a9KZamH","QnJ1Sn1pmO","Cfgr3580YD","618Dii3pyd","h1zcH0YAGH","t59lRVjCZq","zFgtBd7vjM",
+"uZPqgb29RJ","t98iWNAFuw","5Mg9r4dEz6","U3yw5oGu6x","kZANmRACuj","Ul4a1nFqik","d85a9ydG8U","5nmWvKr8ys","iwzGk580YD","CdyBVNo0Qb",
+"0h1b12Yz7E","5IhmGMmsIo","9GXkXQWxoT","K20wKl83Ud","dhSuHY1mC0","yofH3M3zXL","xciqpK4GS8","pAhR1MmsIo","m4bxU9eoRc","EoToPlXFOB",
+"AIYUuuoStw","WmadASs0Zu","FFDuii3pyd","QssNCECMvU","Oz8yZs4786","lsQGopT8wu","RzaZA9iGoT","s7MxkRACuj","GSQwjd85a9","v1Hlnaez9y",
+"yvOMIU3yw5","pv0i7QChxs","suY4xFxX9q","RkQkeVIlwP","CdyBVxXTI4","ydG8U55rfB","v8yFNHRxd8","Cp3mZWmadA","hSSvQIjTwP","StlDJ4W0Tl",
+"iwzGk29QAz","e6e4zQbxXc","vkCHHQnJ1S","24ARF4QMc9","tjQxsMkgy8","s7MxkQChxs","8xEKz5Mg9r","8TxD7ulk41","FLsph5VZjS","zz4ZU9GXkX",
+"VIlwPWaim6","JKWYRsoy9t","BbwgAMkgy8","blLA9tl72W","Z4I1vazIWp","J2mQiuLtKs","JkzUnv1Hln","5Nammpv0i7","C2IrcbrhlQ","JJs5mcL0aE",
+"he9IAtvdkD","UmaEvhYBCK","5IhmGVprf2","taOXKPYBf4","MojnPYh1hF","xReecK4GS8","brhlQYh1hF","rz7UtuoStw","ru4UGFGzgp","HRxd8FxX9q",
+"7lUXZOUqFM","qUJMdCp3mZ","5nmWvjeskS","16lHcChuy3","uQIczix74r","ksJby7ku1p","RsQUqni2v1","JKWYRB3qem","qaofNhUTw7","QClRL14FLR",
+"IKxdLtaOXK","uoStw5IhmG","aL6AJCp3mZ","5Mg9rFPfSE","TwanoGXdoH","5drc65Drn0","wiHrZd7vjM","nFqikDz1R3","BpYhVJJs5m","BGaQYs93Ml",
+"CK5W7t59lR","xciqps7Mxk","CqqaDb29RJ","Chuy3Pb1pa","RsQUqBCxeC","WMiS3tuDyS","RsQUqlj07Q","9GXkXzbIYY","5iGN5Yh1hF","KZamHaL6AJ",
+"ECMvUaez9y","guMb8gjUTu","Cp3mZaL6AJ","7fsYMiqv4k","HP433CIShG","2Yz7EQworu","s93MlRsQUq","Pb1pa2hEEU","v2eC3C2Irc","BpYhVsoy9t",
+"a00b5pFrrl","ru4UGFxX9q","BpYhV9XyT9","gf8rIiKqhr","7lUXZGSQwj","fcwDaYh1hF","ni2v10MR5X","pmeCdfcwDa","ksJbyTa8f6","5VZjSgf8rI",
+"CNHmvksJby","BpYhVZv7z0","Cp3mZogLgc","Ul4a1MGlTF","O3iyQStlDJ","ix74rtjQxs","jSjS3Pb1pa","lViBva00b5","D6rBy2Nslm","ulk41ZuDtD",
+"vLsmSK20wK","uupzksx5Gl","zmLYDlj07Q","9eoRcNo0Qb","FnPFB7fKYU","Waim6Fhtgl","taOXKlViBv","qaofNEdBKc","SjskQIn3NS","iqv4kBFkb8",
+"s4786wDajX","pAhR1n1pmO","azIWpMmsIo","C2IrcS2Dfu","hUTw7Pb1pa","t98iWRpBQm","Yw2oUzQt6Q","uQIcz2Yz7E","0PktIF6PT2","dhSuH45cIH",
+"9eoRcrhl0J","h1zcHnlaBy","8U2nUWaim6","FLsphOHaBz","QssNCQnJ1S","n8pJ9D6rBy","faHirsx5Gl","5ZaEzMmKGJ","2TRI7HP433","Ul4a1vLsmS",
+"rz7UtzFgtB","prNT6o8Uyd","lweGybrhlQ","Waim6M6qcG","MmsIoM3zXL","AmdQdUlU3M","CK5W70BmCy","Gv3FqyvOMI","uQIczogLgc","RpBQmOHaBz",
+"taOXKn8pJ9","ThjNnCIShG","AOgEeWreyP","FcWrWZzJHW","8FmFHdhSuH","m4bxUmz8gx","S2DfuZuDtD","iKqhrCqqaD","UmaEvC2Irc","3weIFYOfrY",
+"DG4sTpWiOs","Cp3mZjSjS3","MGlTF0Kyfs","jiVBPd85a9","IBe8kRpBQm","dhSuHVjCZq","yvOMIC2Irc","SjskQ5iGN5","4dEz6ix74r","K4GS8qaofN",
+"fmIK1RpBQm","uJScXZv7z0","0BmCyAOgEe","JRJQBni2v1","CxVEfiKqhr","rKDLJMezSW","GWqqXRxrsm","JIqXiM6qcG","Yw2oUuPX7G","gtCA50h1b1",
+"qaofNM3zXL","t98iWSbRYy","LbRTHTwano","nFqikYOfrY","Ss0ZupmeCd","jtn0Xy94nw","NhXduZ4I1v","aDGtSOxWIH","DG4sTFxX9q","jeskSC2Irc",
+"ZUnqtdpe1v","8U2nUYw2oU","6q6L92Yz7E","oGu6xcQOnv","3weIFokgRi","XflUq2DREs","BGaQYrz7Ut","4QMc9gdQsS","9y4lwlm0pD","G1RhSTa8f6",
+"gtCA5EOE1o","HlUbFuPX7G","OUYuFxReec","14FLRQYxC0","oQ87r0PktI","x3LDeCqqaD","pvgjSjtn0X","JkzUn9iGoT","dpe1vlpF6W","X6PinChuy3",
+"Dz1R3Dz1R3","0Kyfst59lR","vkCHHiKqhr","I7p2aJkzUn","yEfy98TxD7","CqqaDyEfy9","Yf2Ec48cHL","mX2GEi3pyd","B3qemdQ586","bZLvS6AFT0",
+"a00b5yluBx","2hEEUWDVWJ","StlDJ6q6L9","VNCPdjtn0X","i7WMQFnPFB","SjskQOz8yZ","okgRiFcWrW","IRh48tvdkD","OUqFM0Wr5y","uAWyplViBv",
+"RACuj7lUXZ","Cfgr3uLtKs","XflUqNxx9V","brhlQAOgEe","NAFuwyToGW","ix74rpT8wu","7fKYUdhSuH","8cVD3uLtKs","faHirOUYuF","ni2v1o8Uyd",
+"Q6LixOUqFM","rKDLJatef2","MGlTFMaJQs","Chuy3oQ87r","ThjNnCqqaD","mX2GEpFrrl","JKWYRIKxdL","8TxD7Yh1hF","AXpwElCMxy","29QAzs4786",
+"xciqpI7p2a","fcwDaI7p2a","uupzkYjB9t","uPX7GGWqqX","8U2nUKsjRK","IRh48JKWYR","5IhmGStlDJ","fcJOy7fsYM","vLsmSyluBx","16lHcNo0Qb",
+"FVMxoECMvU","gf8rIDQimp","RACujb29RJ","lpF6WCqqaD","wDajXVBjhz","O3iyQgjUTu","SbRYyJ2mQi","NAFuwuPX7G","DG4sTpvgjS","uLtKsksJby",
+"9rlg9VjCZq","J2mQiNcICA","yluBxiqv4k","uZPqg2hEEU","9rlg9VBjhz","Pb1paEoToP","VNCPd8FmFH","UmaEvVNCPd","yEfy9hYBCK","4dEz6n1pmO",
+"8U2nU16lHc","IKxdLQbxXc","kB5nPOUqFM","fcJOyWmadA","kZANmb29RJ","Yh1hFPb1pa","hUTw7HfyNQ","StlDJ16lHc","lXFOBU3yw5","RACujnFqik",
+"XflUqWPmlx","FVMxojtn0X","0Wr5yuvf7A","JKWYR8xEKz","VNCPdo8Uyd","cL0aEoGu6x","pFrrlD6rBy","VIlwPG1RhS","dhSuHC2Irc","jeskSMK07Y",
+"AIYUu45cIH","3otm6X6Pin","BGaQY9iGoT","cQOnvvkCHH","4QMc9Chuy3","lCMxysx5Gl","Nxx9V2Yz7E","AIYUuqUJMd","fcwDaVIlwP","45cIHmX2GE",
+"ni2v1Oz8yZ","guMb8ksJby","iqv4kkB5nP","piJSkEoToP","CdyBVK4GS8","QChxsrhl0J","JRJQBS2Dfu","Uvlv47ku1p","Uvlv4WDVWJ","piJSkWaWsv",
+"bgJAzKr8ys","zbIYYuN6r3","POUYSuupzk","RsQUqMojnP","AXpwEMmsIo","SWfouGXdoH","FwEJzyEfy9","8hJdtqUJMd","ciuWzIBe8k","7fsYMBFkb8",
+"blLA9VerEA","nlaByQWxoT","yToGWWaim6","e6e4znnP8o","4dEz6MmsIo","5VZjSBCxeC","hYBCKMmKGJ","ciuWz0Wr5y","uvf7AkB5nP","xReec1LB1L",
+"IKxdLgjUTu","lm0pDI7p2a","WMiS314FLR","uoStwTXQ0Z","JkzUn3otm6","Ta8f6WreyP","EOE1olH1kt","tuDySxciqp","RACujGSQwj","48cHL9XyT9",
+"FhtglQnJ1S","qQxHPFPfSE","x3LDeMkgy8","pT8wu8RCUA","Yh1hFd7vjM","OUqFM0PktI","2hEEURkQke","OUqFM14FLR","AmdQdSWfou","yToGWrz7Ut",
+"RkQkeuvf7A","wDajXWreyP","bZLvSNo0Qb","x3LDelsQGo","Oz8yZY1mC0","WPmlxdmoS7","xciqpQbxXc","lweGyEdBKc","wDajXs7Mxk","s7Mxk2TRI7",
+"vLsmSDz1R3","zqH0WBpYhV","zQt6QJJs5m","pAhR1ulk41","gdQsSBpYhV","Y1mC0blLA9","hUTw7JIqXi","7Ow5CvLsmS","cShY22Yz7E","MmsIoVIlwP",
+"ni2v1a00b5","S77LHcShY2","rKDLJzHF1q","xXTI4WPmlx","brhlQ580YD","qaofNHzZT8","RBhp0RpBQm","5drc6lViBv","tlILtD6rBy","9eoRca00b5",
+"sqVrfECMvU","RzaZAuN6r3","JXljWzHF1q","BbwgA7ku1p","gjUTuCqqaD","hYBCK2hEEU","BbwgAhE1Ql","W3VFHTCgPp","hi5X7lweGy","8FmFHIRh48",
+"Dz1R3hi5X7","k85AejeskS","lkMUAKr8ys","0PktIjtn0X","7X3uyfLNg8","jS1ajv2eC3","i7WMQRxrsm","9iGoTTCgPp","qUJMdbgJAz","7ku1pFPfSE",
+"mz8gx4W0Tl","dhSuHni2v1","NhXdulH1kt","K4GS8tuDyS","FcWrWEOE1o","uAWypsx5Gl","kB5nPk85Ae","h1zcHQClRL","tjQxsMezSW","zqH0WnlaBy",
+"d7vjMdhSuH","45cIHCIShG","uQIcz14FLR","wDajXFLsph","AIYUuSmGzv","7lUXZyofH3","Ta8f6Mm8si","lViBvC2Irc","ydG8UTXQ0Z","mX2GE5Namm",
+"YjB9tEdBKc","Gv3FqyluBx","JJs5mtuDyS","O3iyQkZANm","64s8NQYxC0","BGaQYcShY2","uQIczWMiS3","Mkgy8LDk6f","pAhR1pmeCd","BpYhVlweGy",
+"5VZjSZJTXH","h1zcHLDk6f","FNYIMuLtKs","s7MxkSbRYy","uJScXuoStw","pmeCdRACuj","55rfBgIYvE","WPmlxVLTy6","brhlQQChxs","Mkgy8Yw2oU",
+"F6PT2L7cGc","tuDyS2DREs","Ta8f6nnP8o","JJs5mX6Pin","2NslmjS1aj","qaofN4dEz6","yofH3b29RJ","v2eC3Cp3mZ","m4bxUhE1Ql","atef2K20wK",
+"7hyVvQbxXc","uJScXFjHXR","OUqFMCqqaD","oGu6xnnP8o","8U2nUFhtgl","7ku1pzFgtB","QbxXcVLTy6","2Nslmm4bxU","iwzGkO3iyQ","Ss0Zu0Wr5y",
+"gIYvElpF6W","Cp3mZQssNC","QnJ1SVBjhz","wiHrZzz4ZU","Mkgy8cShY2","FFDuiQ6Lix","Waim6S77LH","5IhmGSbRYy","2Yz7Eix74r","Yw2oUfqypy",
+"qaofNhi5X7","RmDcrpmeCd","3otm6pFrrl","AOgEejtn0X","7hyVv0YAGH","lsQGoni2v1","24ARFLbRTH","8U2nU0Wr5y","nnP8ozHF1q","lj07Q5iGN5",
+"GWqqXGv3Fq","SWfouCNHmv","NhXduqaofN","jeskSzFgtB","Kr8ys8hJdt","0ao3lfcwDa","rKDLJokgRi","n8pJ9W7cTs","yofH3iqv4k","Q6LixRBhp0",
+"hi5X7ZhwG1","zz4ZUhSSvQ","lpF6WOHaBz","lj07Q29QAz","gjUTu0Wr5y","580YDChuy3","aL6AJv2eC3","iwzGkzHF1q","t98iW64s8N","iB08llViBv",
+"HzZT8HzZT8","0ao3l48cHL","Mm8si9GXkX","VLTy67X3uy","PYBf4EoToP","RBhp0WPmlx","XyPZN8U2nU","d7vjMZzJHW","5drc6jSjS3","Ta8f6rhl0J",
+"8xEKzd85a9","pv0i7F6PT2","uAWypJ2mQi","K4GS8uTacx","FjHXRZzJHW","kB5nPjzUqR","y94nwuQIcz","jtn0XlXFOB","rKDLJHfyNQ","VerEAyvOMI",
+"soy9tM3zXL","HfyNQQChxs","M3zXL4W0Tl","LDk6f2DREs","SjskQfFDrJ","0KyfsKsjRK","v1Hln8xEKz","45cIHWaim6","RzaZAfcJOy","ogLgceuZA5",
+"vkCHH07n1c","KASQ8uAWyp","S77LHgtCA5","zmLYDv8yFN","fcwDaeuZA5","VBjhzzbIYY","hUTw7WMiS3","FhtglCK5W7","Vprf29rlg9","tuDySvkCHH",
+"Yw2oUX6Pin","POUYSY1mC0","n1pmONcICA","Cp3mZ8U2nU","48cHLd7vjM","8TxD7Mkgy8","dQ586HRxd8","tvdkDX6Pin","x3LDegtCA5","Mm8siiKqhr",
+"WDVWJThjNn","ReKEWC2Irc","9y4lwv1Hln","ReKEWdpe1v","POUYSIRh48","DQimpUl4a1","guMb8piJSk","GXdoHqUJMd","cL0aEtuDyS","24ARFlsQGo",
+"prNT6QChxs","JIqXi7fKYU","Vprf2ksJby","v2eC3ogLgc","L7cGc24ARF","fmIK1BbwgA","8RCUA1LB1L","YOfrYfmIK1","uvf7A7fsYM","2hEEUe6e4z",
+"Kr8ysv1Hln","MmsIoSjskQ","t98iWVprf2","cL0aEMGlTF","AmdQdQbxXc","Q6LixGv3Fq","fcwDa7hyVv","fcwDahSSvQ","J2mQiCfgr3","0PktI4W0Tl",
+"NhXduTa8f6","MmKGJAOgEe","VLTy6M3zXL","lCMxym4bxU","VNCPdP6bcg","hSSvQgdQsS","0ao3lDQimp","wiHrZ8hJdt","JIqXiqQxHP","Cfgr3GrDg7",
+"580YDBFkb8","ksJbyReKEW","C2Irczz4ZU","9rlg9dpe1v","9iGoTPYBf4","s7Mxkv1Hln","jeskSEOE1o","14FLRpAhR1","hE1QlYjB9t","UmaEvMmKGJ",
+"8FmFH9eoRc","FVMxoguMb8","euZA5t59lR","tl72W24ARF","he9IAjfREu","8xEKzGWqqX","EdBKck85Ae","tAOsrQ6Lix","O3iyQnnP8o","SjskQBbwgA",
+"lViBvMojnP","uvf7AzQt6Q","IRh48hSSvQ","AmdQdBbwgA","Uvlv48FmFH","RBhp0zHF1q","jtn0XzY1GY","BFkb8IBe8k","gtCA5WMiS3","VLTy6he9IA",
+"SjskQxReec","5drc6uPX7G","HlUbFQClRL","NAFuwI7p2a","8xEKztaOXK","zqH0WzFgtB","0ao3l24ARF","BFkb8Q6Lix","BFkb8RBhp0","jtn0XCqqaD",
+"RBhp0RmDcr","uPX7GnnP8o","SmGzv7fsYM","i3pydI7p2a","yluBxhSSvQ","o8UydC2Irc","5ZaEzBFkb8","aFFssWreyP","lXFOBk85Ae","0PktISWfou",
+"NAFuwnFqik","zQt6Qni2v1","CK5W7xReec","GWqqX45cIH","JRJQBYw2oU","Chuy3MmKGJ","fFDrJhUTw7","9y4lwFwEJz","taOXKzz4ZU","DQimpNAFuw",
+"brhlQAXpwE","JIqXi48cHL","6q6L9Z4I1v","RzaZA16lHc","HP433QYxC0","uQIcz4QMc9","QbxXcU3yw5","lpF6W2DREs","OUYuFJXljW","Ss0ZusqVrf",
+"29QAzprNT6","s93MlcShY2","CIShGB3qem","d7vjMUlU3M","NAFuwx3LDe","16lHcfcJOy","CK5W7xXTI4","BpYhVatef2","MK07Y580YD","FNYIMVprf2",
+"QClRLYf2Ec","8TxD7o8Uyd","5Mg9r55rfB","yEfy9xReec","ogLgcQnJ1S","atef2xciqp","cmXIXsoy9t","n8pJ9AIYUu","FwEJztaOXK","64s8N55rfB",
+"VLTy6faHir","7Ow5CHfyNQ","xReecfcwDa","o8UydfmIK1","zbIYY7ku1p","yEfy9mz8gx","dmoS7GWqqX","RpBQm9GXkX","MmsIodpe1v","G1RhSuQIcz",
+"h1zcHKASQ8","IBe8kSmGzv","jtn0XLewvM","CqqaDQYxC0","FVMxoqUJMd","U3yw5HRxd8","W7cTsydG8U","YjB9tThjNn","n1pmOOUYuF","oQ87rNAFuw",
+"L7cGc1LB1L","FwEJz1j5L8","SbRYyzz4ZU","oQ87rGXdoH","d85a9v2eC3","7lUXZh1zcH","FwEJzlCMxy","Yw2oUguMb8","QssNCiqv4k","QssNCOUYuF",
+"2hEEUqUJMd","EoToPtAOsr","55rfB29QAz","uZPqgDG4sT","FFDuiv8yFN","cmXIXIn3NS","0KyfsI7p2a","D6rByStlDJ","ZhwG1RmDcr","7X3uy48cHL",
+"4W0TlRmDcr","uupzkvOqCE","gtCA5GrDg7","FxX9qFwEJz","K20wKoVQp6","7fKYUNxx9V","Cfgr3DG4sT","TwanogIYvE","vOqCEcL0aE","IjTwPgIYvE",
+"AmdQdOxWIH","l83Ud8cVD3","d85a9zFgtB","fmIK1dpe1v","BCxeCTCgPp","0KyfsJ2mQi","uPX7G4dEz6","ni2v1KsjRK","ZUnqtmz8gx","C2IrcBCxeC",
+"6AFT048cHL","tlILtjSjS3","qaofNLewvM","5IhmGokgRi","0BmCyQ6Lix","HRxd8Y1mC0","QWxoTM3zXL","tvdkDru4UG","Zv7z07hyVv","KZamHWPmlx",
+"jS1ajDz1R3","FxX9q8RCUA","4dEz6atef2","cQOnvD6rBy","CxVEfuAWyp","JKWYR5nmWv","tuDySMmsIo","No0Qb07n1c","yEfy9OUqFM","CdyBVtuDyS",
+"uupzkUvlv4","2Nslmru4UG","okgRiaez9y","Uvlv4e6e4z","HzZT8M3zXL","OHaBzaL6AJ","gtCA5uLtKs","DcpWB2Nslm","5ZaEzUl4a1","Y1mC05iGN5",
+"zQt6QS2Dfu","FnPFBSs0Zu","NOHszKASQ8","9eoRcsx5Gl","Ul4a1J2mQi","3otm6vOqCE","yToGWdhSuH","zmLYDlsQGo","dmoS7QWxoT","K4GS8zFgtB",
+"yEfy9taOXK","iKqhrM6qcG","5Mg9rPb1pa","qUJMd4W0Tl","POUYSqUJMd","lm0pD16lHc","jtn0XOxWIH","24ARFQworu","9GXkX5Drn0","s47868hJdt",
+"HRxd8tlILt","UmaEv0BmCy","2ZHdkNxx9V","DQimpjiVBP","2Nslm5nmWv","jfREu0h1b1","No0Qbl83Ud","lweGyokgRi","pv0i7FPfSE","QworuuJScX",
+"S77LH7ku1p","dmoS7ciuWz","ZuDtDQYxC0","vLsmSJIqXi","hE1Qlo8Uyd","BCxeCQbxXc","QChxs2ZHdk","fqypyXflUq","Yh1hFCqqaD","FcWrWJXljW",
+"vOqCEFPfSE","CNHmvW7cTs","FGzgp580YD","TXQ0ZzHF1q","Mm8sim4bxU","EOE1oSbRYy","azIWpK4GS8","VerEAlsQGo","DQimpazIWp","0Wr5yzQt6Q",
+"Waim6uoStw","oVQp6WDVWJ","MmKGJFwEJz","v1HlnHlUbF","QworuFcWrW","P6bcg55rfB","HRxd8O3iyQ","uoStw2Yz7E","X6PinGWqqX","zqH0WqUJMd",
+"0Kyfsb29RJ","OHaBzazIWp","8FmFHFwEJz","gdQsS7lUXZ","X6PinyvOMI","07n1cUl4a1","NAFuwX6Pin","MGlTFtl72W","HfyNQZzJHW","mz8gxyvOMI",
+"yofH36AFT0","taOXKY1mC0","faHirFFDui","ydG8UvOqCE","XflUquLtKs","QChxsAkKTk","suY4xguMb8","hUTw745cIH","0Wr5yMezSW","QYxC0NhXdu",
+"jSjS3d85a9","ZJTXH14FLR","OxWIHdmoS7","2NslmrKDLJ","K4GS8Pb1pa","UlU3Mzz4ZU","BpYhVjiVBP","wDajXF6PT2","tAOsrfLNg8","9y4lwpvgjS",
+"brhlQCNHmv","zY1GYi7WMQ","5ZaEzMezSW","0YAGH2ZHdk","yvOMIk85Ae","QssNCzFgtB","HRxd8JKWYR","IKxdLoGu6x","tvdkD580YD","FFDuiBGaQY",
+"wiHrZs4786","GrDg7WreyP","48cHLRxrsm","xXTI4taOXK","lweGynlaBy","gdQsS3otm6","F6PT2faHir","YjB9tUmaEv","fcJOyVIlwP","J2mQi0YAGH",
+"piJSkDQimp","xciqpgjUTu","YjB9tBpYhV","EoToPAOgEe","9rlg9cQOnv","VBjhz5IhmG","AkKTk2hEEU","SWfoufqypy","x3LDebrhlQ","J2mQi5iGN5",
+"AkKTk9eoRc","0YAGHvLsmS","lpF6WAkKTk","l83UdZJTXH","pFrrl16lHc","BFkb8LbRTH","8TxD7JIqXi","64s8NpT8wu","IRh48ZUnqt","pWiOsCIShG",
+"D6rByTwano","zHF1q7hyVv","SWfouStlDJ","P6bcgqQxHP","wDajXogLgc","VerEAcQOnv","HP433TCgPp","WPmlxOHaBz","7Ow5CStlDJ","No0QbbgJAz",
+"pAhR1Pb1pa","CqqaDjzUqR","rhl0Jpv0i7","cmXIXRxrsm","uvf7As4786","zQt6QzqH0W","WmadAZ4I1v","FLsphrKDLJ","AkKTkgtCA5","CK5W755rfB",
+"LDk6fNhXdu","n1pmOB3qem","IjTwPkZANm","ZzJHW8cVD3","zFgtBFjHXR","jeskSa00b5","L7cGcSbRYy","NcICA3weIF","pT8wuRBhp0","xciqpGWqqX",
+"oGu6xjS1aj","5iGN524ARF","TCgPpVIlwP","DLhzMk85Ae","uN6r3t98iW","XflUqYjB9t","piJSkWreyP","FNYIMNo0Qb","3otm6Zv7z0","W3VFHl83Ud",
+"4QMc9EoToP","qQxHPX6Pin","jiVBPBGaQY","zqH0WI7p2a","UmaEvm4bxU","9rlg9qUJMd","3weIFKr8ys","l83UdcmXIX","i7WMQcL0aE","9iGoTcQOnv",
+"CxVEfTCgPp","cShY2rKDLJ","JXljWBCxeC","VjCZq4dEz6","POUYSJRJQB","OxWIHQ6hMC","pvgjSEoToP","EdBKcZuDtD","LbRTHn1pmO","GSQwjaL6AJ",
+"djsrv8RCUA","ZzJHWZv7z0","k85Ae48cHL","07n1cFnPFB","v1HlnbgJAz","16lHcb29RJ","9y4lwoGu6x","yEfy9jfREu","4dEz6uoStw","7hyVvs93Ml",
+"FLsphbrhlQ","xReect98iW","6q6L9RsQUq","Twanos93Ml","8TxD7IjTwP","MmsIopT8wu","XflUqPYBf4","jeskSnnP8o","wiHrZMezSW","jS1ajfLNg8",
+"6AFT02Nslm","4QMc9l83Ud","kZANmiqv4k","HfyNQ7hyVv","C2IrcO3iyQ","3otm6i3pyd","FNYIMciuWz","mX2GECp3mZ","fLNg8prNT6","ni2v1Nxx9V",
+"TCgPpzmLYD","2TRI7Ta8f6","QClRLjfREu","aL6AJkZANm","zHF1qciuWz","5drc6nFqik","yEfy9HRxd8","s4786i3pyd","LewvMThjNn","ZuDtDv1Hln",
+"QYxC0pWiOs","zHF1qQ6Lix","lkMUAzHF1q","uupzk580YD","uoStwMGlTF","QYxC0JXljW","pWiOs3otm6","1LB1Lrz7Ut","5iGN5BCxeC","0KyfsyEfy9",
+"0KyfsBbwgA","AmdQduJScX","B3qemZhwG1","580YDOHaBz","yluBxDQimp","cQOnvOHaBz","IjTwPlCMxy","KASQ8SWfou","aez9yRmDcr","OUYuFOUYuF",
+"NcICADcpWB","tuDySv1Hln","zHF1qFcWrW","5nmWvQWxoT","atef2qUJMd","JJs5m9GXkX","CIShGWaWsv","C2Ircn1pmO","WreyP618Di","9eoRche9IA",
+"wiHrZvLsmS","2hEEU7lUXZ","suY4xDLhzM","vOqCE7fKYU","qaofNiB08l","jS1ajblLA9","ReKEWKZamH","SmGzvMmsIo","vkCHHRkQke","JIqXiIKxdL",
+"LewvMuJScX","n8pJ9RBhp0","9iGoTAXpwE","POUYSW3VFH","s7Mxksx5Gl","6q6L9bZLvS","64s8Nru4UG","uQIczfaHir","fcJOyZuDtD","atef2Dz1R3",
+"dhSuHwiHrZ","Oz8yZWDVWJ","0YAGHlweGy","Yf2EchYBCK","CxVEfFFDui","k85AeI7p2a","8hJdtHzZT8","Ul4a1NhXdu","atef2AkKTk","aez9yqQxHP",
+"Dz1R3ZUnqt","4dEz6G1RhS","SbRYyiwzGk","1j5L8tlILt","9eoRcFhtgl","2hEEUTa8f6","ulk41HzZT8","zz4ZUX6Pin","ZzJHWsuY4x","5nmWv0MR5X",
+"GXdoHs93Ml","JRJQBhE1Ql","FwEJzFwEJz","AgJHQ29QAz","Gv3FqWaWsv","aL6AJMojnP","fLNg8Cfgr3","JIqXiFPfSE","uoStwrKDLJ","0MR5XIjTwP",
+"0MR5XzHF1q","W3VFHFLsph","s7MxkaDGtS","pFrrlni2v1","o8UydZhwG1","GXdoHLbRTH","fLNg8JkzUn","i3pydCdyBV","5NammcmXIX","FGzgpDcpWB",
+"MaJQsJXljW","uvf7AK4GS8","8TxD7OUqFM","jSjS3ulk41","FnPFBpFrrl","7X3uyMmKGJ","C2IrclweGy","WMiS3kB5nP","soy9tS2Dfu","gf8rIVLTy6",
+"jSjS3i3pyd","blLA9SWfou","rz7UtMojnP","HlUbF45cIH","Dz1R3QWxoT","yvOMIzY1GY","lpF6WAOgEe","mX2GEsoy9t","JJs5mHfyNQ","uTacxlH1kt",
+"GSQwjlH1kt","QbxXcHRxd8","2DREs2Yz7E","uAWypNo0Qb","VerEA0PktI","No0Qb8hJdt","HRxd8Qworu","Y1mC0zmLYD","MmKGJvOqCE","AXpwEECMvU",
+"ni2v1BGaQY","7Ow5CY1mC0","MaJQsVNCPd","1j5L8iB08l","5VZjSRxrsm","RkQketaOXK","hYBCKP6bcg","NcICATa8f6","FxX9qt98iW","lsQGoUlU3M",
+"AOgEePYBf4","2Yz7Elj07Q","7Ow5CJJs5m","9rlg90Kyfs","l83UdhE1Ql","n1pmO8RCUA","0Wr5yIBe8k","Q6hMC0Wr5y","24ARFZJTXH","U3yw5XflUq",
+"QssNCOUqFM","S2DfucQOnv","1j5L807n1c","KsjRK0PktI","lweGy5IhmG","n1pmO9GXkX","M3zXLdhSuH","5ZaEzECMvU","0MR5XtAOsr","S2Dfu8FmFH",
+"K4GS8fqypy","lm0pDsqVrf","OxWIHKZamH","RzaZANcICA","BpYhVlCMxy","Uvlv4xReec","SWfouFhtgl","FcWrWBCxeC","zbIYYpWiOs","lsQGoOxWIH",
+"W3VFHqaofN","CxVEftaOXK","EOE1ooGu6x","BGaQY9y4lw","jfREuEdBKc","uLtKsuupzk","ECMvUTXQ0Z","tl72WYh1hF","OUYuF9XyT9","xReec9y4lw",
+"Yf2EcNcICA","48cHLJKWYR","SbRYys93Ml","iB08lS77LH","FVMxo64s8N","aez9yQworu","580YDOz8yZ","d85a9iqv4k","CIShGQ6Lix","RpBQm8cVD3",
+"hSSvQ5Mg9r","Fhtgllm0pD","fcJOy7hyVv","nFqik7fsYM","CqqaDjfREu","sx5GllXFOB","s7MxkFNYIM","4QMc9KZamH","M3zXLP6bcg","cQOnvfcJOy",
+"ksJbyGXdoH","Q6LixhSSvQ","M6qcGlCMxy","FjHXRAOgEe","7ku1pRzaZA","gtCA5prNT6","pT8wulViBv","nlaByb29RJ","uN6r3mz8gx","24ARF580YD",
+"WMiS33weIF","1LB1LQbxXc","ECMvULbRTH","SWfouVNCPd","DQimpOUqFM","JRJQBpFrrl","hSSvQfcJOy","t59lRwDajX","ECMvU5nmWv","dmoS7cQOnv",
+"3otm6cShY2","vkCHHjiVBP","WaWsvuZPqg","9iGoTguMb8","5Mg9ri7WMQ","BFkb80Kyfs","prNT6ZhwG1","n1pmOAXpwE","qQxHPDz1R3","ZUnqtGrDg7",
+"fLNg8yToGW","ydG8UGSQwj","XflUq7lUXZ","UlU3MdhSuH","MK07YBCxeC","pmeCd14FLR","ix74rAIYUu","RBhp06AFT0","0YAGHP6bcg","KASQ8cmXIX",
+"5VZjSuJScX","0Kyfsrhl0J","2TRI77lUXZ","BpYhVy94nw","RACujAIYUu","uN6r3xXTI4","9y4lw2DREs","iwzGks7Mxk","IBe8kt59lR","EOE1oK4GS8",
+"9eoRcy94nw","lCMxyeuZA5","tvdkDLbRTH","uZPqgJkzUn","MezSWUvlv4","WreyPTXQ0Z","KASQ8KZamH","7lUXZ8xEKz","5IhmGwiHrZ","uLtKs6AFT0",
+"a00b58TxD7","IRh48AIYUu","vLsmS24ARF","jfREudQ586","ThjNnv8yFN","ThjNnwDajX","uZPqg6AFT0","qUJMdzQt6Q","WaWsvlViBv","faHirNhXdu",
+"rhl0JciuWz","TCgPp3otm6","BCxeCC2Irc","hYBCK2DREs","hUTw7djsrv","aL6AJmX2GE","hE1QlzqH0W","tvdkDS2Dfu","0ao3lciuWz","mX2GEZv7z0",
+"m4bxUGv3Fq","EoToPCdyBV","euZA58hJdt","hSSvQX6Pin","uvf7A5nmWv","atef2he9IA","zbIYYqUJMd","TwanodQ586","Dz1R3Vprf2","pAhR19XyT9",
+"bZLvSt59lR","MmsIo8xEKz","qUJMdatef2","yofH3AOgEe","QssNC7X3uy","sqVrfSmGzv","KsjRKatef2","ReKEWW3VFH","IjTwPoVQp6","UmaEvNAFuw",
+"D6rBy0PktI","taOXK5drc6","9y4lwt59lR","hUTw7BGaQY","yEfy90PktI","UlU3MNcICA","7fKYUIjTwP","DG4sTjzUqR","lXFOBL7cGc","NAFuwC2Irc",
+"F6PT25drc6","aL6AJGrDg7","s7Mxksoy9t","Yh1hFuZPqg","0h1b1gIYvE","uJScXWaim6","AOgEeChuy3","soy9ty94nw","iKqhrzY1GY","cShY2UlU3M",
+"suY4xzHF1q","MojnPVjCZq","NcICAMGlTF","fmIK1blLA9","UlU3MEOE1o","bgJAzOUYuF","JIqXiRmDcr","0MR5XFjHXR","LewvMrz7Ut","JKWYRlViBv",
+"t98iW3weIF","tuDyS7fsYM","h1zcHo8Uyd","ni2v1aDGtS","Gv3FqoGu6x","aDGtSRpBQm","blLA9qaofN","9XyT9oGu6x","Pb1pa0PktI","k85AezY1GY",
+"blLA9taOXK","G1RhSsoy9t","yluBxs4786","LbRTHM6qcG","NcICAP6bcg","QssNCCqqaD","VBjhzuoStw","IjTwPWDVWJ","O3iyQXyPZN","tjQxsbgJAz",
+"FPfSEM6qcG","JJs5m2Nslm","Oz8yZv1Hln","580YDv1Hln","uJScX8FmFH","8hJdtyToGW","rz7UtVNCPd","S2Dfu3weIF","IKxdLdjsrv","EdBKc5IhmG",
+"hYBCK07n1c","NcICAx3LDe","IBe8k7hyVv","ydG8UTwano","zY1GYYjB9t","uvf7AnFqik","5Nammd85a9","5ZaEzTXQ0Z","RBhp0ZuDtD","0KyfsiwzGk",
+"DQimp8U2nU","SWfoujSjS3","vkCHH29QAz","QChxsfcwDa","JkzUnFjHXR","S2DfuY1mC0","YOfrYMezSW","ZhwG15IhmG","J2mQiOUYuF","P6bcgCIShG",
+"Q6hMCZJTXH","ix74rjeskS","2ZHdkAkKTk","AOgEed7vjM","TCgPpyluBx","KZamHfFDrJ","iKqhrv8yFN","UlU3MydG8U","Yh1hFhUTw7","VLTy6jzUqR",
+"W7cTsDz1R3","dpe1vjiVBP","Ta8f6RpBQm","Cp3mZ0MR5X","16lHcWmadA","Uvlv4Twano","tl72WCp3mZ","ogLgcbZLvS","suY4x29QAz","0h1b1GWqqX",
+"Mm8siRACuj","W3VFHFwEJz","QssNCni2v1","FPfSE618Di","7hyVvzbIYY","sqVrfdpe1v","tuDySzQt6Q","B3qem6AFT0","14FLRFPfSE","DLhzMJkzUn",
+"okgRiwiHrZ","pWiOsRmDcr","7lUXZzmLYD","IKxdLvkCHH","7hyVvx3LDe","wDajXpWiOs","GXdoH0ao3l","No0QbGXdoH","In3NSKsjRK","t59lRU3yw5",
+"FwEJzzFgtB","pT8wu4QMc9","euZA5jS1aj","cQOnvQbxXc","2NslmCqqaD","dQ586ksJby","8FmFH7ku1p","OUqFMsuY4x","mX2GEThjNn","BpYhVS2Dfu",
+"GXdoH16lHc","GSQwjfaHir","wDajXn1pmO","e6e4zaFFss","guMb8Mkgy8","2TRI7POUYS","yluBxnFqik","vLsmSpAhR1","TXQ0Z0MR5X","CNHmvFPfSE",
+"nnP8o7Ow5C","oVQp6aFFss","vLsmSBGaQY","taOXK2hEEU","CdyBVBbwgA","45cIH6q6L9","IRh48tAOsr","AIYUuSbRYy","nnP8ofcwDa","ni2v1Qworu",
+"DLhzMMaJQs","RsQUqK4GS8","TwanogdQsS","HP433Uvlv4","0BmCyB3qem","8TxD7fmIK1","s93MllXFOB","StlDJM3zXL","Ta8f6hUTw7","CIShGMezSW",
+"0Wr5yW7cTs","lCMxyWPmlx","8cVD3RkQke","0h1b19rlg9","IjTwPv8yFN","sx5GluQIcz","MmsIojzUqR","tAOsrrKDLJ","MK07YuPX7G","xciqpsqVrf",
+"NcICA24ARF","uTacxyToGW","v1HlnZhwG1","OUqFMuN6r3","618DiWreyP","Dz1R35IhmG","CdyBVU3yw5","07n1cs93Ml","a00b5NcICA","fcwDazFgtB",
+"ZzJHWWaim6","5Mg9rWreyP","8TxD7pFrrl","tuDySWPmlx","nnP8onlaBy","CNHmvtuDyS","uPX7GX6Pin","qUJMd8hJdt","Uvlv4tlILt","64s8Nuvf7A",
+"tlILtK4GS8","y94nwtuDyS","DLhzMWreyP","FLsphru4UG","FxX9qvLsmS","SbRYyJkzUn","FjHXRIn3NS","3weIFsuY4x","zbIYYWreyP","5ZaEzTa8f6",
+"bZLvS9eoRc","Q6hMCAmdQd","uvf7AHlUbF","AgJHQNhXdu","ZJTXHdmoS7","9eoRcgdQsS","HRxd8I7p2a","uN6r3CK5W7","rz7Ut8RCUA","1LB1LaL6AJ",
+"bZLvSxXTI4","JRJQBqQxHP","rz7Ut48cHL","CNHmvni2v1","9XyT9AkKTk","OUqFMPYBf4","cmXIXeuZA5","uN6r3Waim6","5Drn007n1c","lXFOBEoToP",
+"lCMxyzmLYD","FhtglP6bcg","qQxHPMkgy8","ZJTXHEoToP","TXQ0ZjzUqR","okgRinFqik","TXQ0ZxXTI4","RxrsmRzaZA","dhSuHIBe8k","rKDLJy94nw",
+"e6e4z8TxD7","fcwDauJScX","ZuDtDFnPFB","xXTI4uoStw","4W0Tlt98iW","MmsIosoy9t","AkKTkMGlTF","cmXIXDcpWB","lkMUAP6bcg","FcWrWni2v1",
+"07n1ciB08l","OUqFMjiVBP","hSSvQokgRi","cmXIXZhwG1","580YDdhSuH","5Drn02hEEU","yluBxydG8U","QWxoTfqypy","blLA9Oz8yZ","OHaBz5Namm",
+"BbwgAjiVBP","Zv7z0zQt6Q","QWxoTlXFOB","Cfgr3tlILt","RpBQmoQ87r","Twano5Namm","uupzkLDk6f","SbRYyJXljW","8cVD3aL6AJ","WMiS3DQimp",
+"mz8gxzz4ZU","lsQGoJJs5m","VNCPdJRJQB","dmoS7W3VFH","mX2GETa8f6","618DiqUJMd","Cp3mZStlDJ","7lUXZyToGW","uTacxcmXIX","s47862TRI7",
+"0BmCyFVMxo","FwEJzRmDcr","RsQUqIn3NS","uJScXZ4I1v","DcpWB0Wr5y","ZzJHWKsjRK","VIlwPKr8ys","WmadACNHmv","QworuAIYUu","i7WMQbgJAz",
+"7fsYMStlDJ","SmGzvWPmlx","W7cTs9iGoT","Y1mC0gjUTu","QnJ1STCgPp","he9IAjiVBP","Waim6lViBv","tAOsr2Yz7E","K20wKCdyBV","Yh1hFx3LDe",
+"0ao3lpT8wu","2hEEUNxx9V","8cVD3TCgPp","FPfSEmX2GE","hUTw70BmCy","O3iyQCqqaD","d85a9uAWyp","aFFssQClRL","v1HlnCK5W7","h1zcHS2Dfu",
+"jfREuChuy3","jiVBP24ARF","VNCPd0MR5X","Zv7z0WmadA","uPX7GZv7z0","QWxoT8RCUA","gIYvEpFrrl","uQIcz5IhmG","y94nwMaJQs","JIqXi2TRI7",
+"U3yw5VerEA","wiHrZZzJHW","FxX9qSs0Zu","K20wK0PktI","FxX9qAkKTk","nlaBybgJAz","qaofNvkCHH","aL6AJStlDJ","RzaZAQ6hMC","3weIFHlUbF",
+"hE1Ql8cVD3","o8Uydaez9y","55rfBl83Ud","cL0aEDG4sT","zmLYDUvlv4","0h1b1zFgtB","t59lR5VZjS","Kr8ysWmadA","48cHL1j5L8","Mm8sirKDLJ",
+"blLA97fKYU","rz7UtSmGzv","tl72WO3iyQ","Mm8si7fsYM","rz7Ut2TRI7","o8UydIn3NS","sx5GlpmeCd","fmIK19eoRc","WDVWJRACuj","ulk41Dz1R3",
+"lweGyaL6AJ","pT8wuksJby","uoStwgjUTu","DcpWBvLsmS","DQimpC2Irc","VLTy6D6rBy","uQIczPYBf4","CqqaDF6PT2","v2eC3lm0pD","t59lR2Nslm",
+"atef2dQ586","xReecYf2Ec","WPmlxZv7z0","hUTw7n1pmO","lH1ktZhwG1","U3yw55Namm","64s8NCxVEf","n1pmO0h1b1","Nxx9Vhe9IA","5Drn07hyVv",
+"9y4lwUmaEv","WMiS3Q6Lix","Q6hMCaez9y","2ZHdk0Wr5y","FcWrW2DREs","24ARFoVQp6","TXQ0ZbZLvS","5VZjSJ2mQi","FjHXRQWxoT","9XyT924ARF",
+"VjCZqFLsph","7Ow5CfLNg8","rz7UtMK07Y","lweGySWfou","zQt6QnFqik","k85Ae9iGoT","atef2zHF1q","9XyT91v5hH","RsQUqaez9y","x3LDejSjS3",
+"9iGoTHP433","FjHXRzY1GY","CxVEfRBhp0","1LB1LMojnP","fFDrJpiJSk","piJSkMaJQs","lpF6WC2Irc","Dz1R3bZLvS","uZPqg2DREs","IRh48cShY2",
+"2Yz7EBpYhV","16lHcNAFuw","ix74ro8Uyd","zFgtBfcJOy","LbRTHAkKTk","Y1mC0i7WMQ","VjCZqKr8ys","FFDui7X3uy","lsQGohYBCK","GrDg75nmWv",
+"Cp3mZLDk6f","kZANmPYBf4","AgJHQk85Ae","pv0i7fqypy","HfyNQ0PktI","8xEKz2DREs","UlU3MhUTw7","brhlQUmaEv","oVQp6QssNC","X6PinQnJ1S",
+"Dz1R3Nxx9V","qQxHP3weIF","s47860Kyfs","bZLvS5nmWv","y94nw6q6L9","FjHXRMojnP","Vprf2WPmlx","oGu6xn1pmO","6q6L95Namm","45cIHdpe1v",
+"a00b5AgJHQ","dmoS79rlg9","RzaZALbRTH","gdQsShSSvQ","Uvlv4MmsIo","HfyNQ2Yz7E","5Mg9rIKxdL","IjTwPJ2mQi","24ARFiqv4k","WaWsvStlDJ",
+"4QMc95drc6","lsQGopmeCd","AgJHQCfgr3","wiHrZ0h1b1","jS1ajIKxdL","tlILttvdkD","cL0aELewvM","gIYvEQYxC0","euZA5SWfou","pFrrlRmDcr",
+"mX2GERxrsm","rz7UtMm8si","uPX7GRpBQm","J2mQi2DREs","7ku1pAIYUu","WDVWJhSSvQ","HRxd8zFgtB","Cp3mZMmsIo","piJSktaOXK","JRJQBZv7z0",
+"16lHc8xEKz","OUqFMgdQsS","dmoS77X3uy","U3yw5zQt6Q","0Kyfs7hyVv","o8UydTwano","RkQke6q6L9","yEfy94QMc9","CxVEfru4UG","Cp3mZtuDyS",
+"sx5Glhe9IA","nlaByGWqqX","Cp3mZsx5Gl","lH1ktnFqik","7ku1pfFDrJ","ZuDtDsqVrf","No0Qblj07Q","8xEKz618Di","BCxeC5ZaEz","DcpWBFnPFB",
+"fcJOyvLsmS","HRxd845cIH","guMb8RACuj","GXdoHCNHmv","xciqpmz8gx","MK07YoQ87r","ZJTXHKASQ8","3otm6NAFuw","FwEJz1LB1L","fLNg8JXljW",
+"TwanoaL6AJ","4QMc9a00b5","bZLvSNxx9V","JRJQBru4UG","n8pJ9Waim6","uLtKsEOE1o","OxWIHlweGy","ciuWzF6PT2","jSjS3s4786","MojnP7fsYM",
+"jfREuuZPqg","hi5X73otm6","uPX7Gy94nw","5ZaEzl83Ud","WaWsvQssNC","FFDui7fsYM","RmDcr7hyVv","FwEJzWaWsv","7Ow5CAIYUu","Cp3mZ9rlg9",
+"No0Qb29QAz","dQ586hSSvQ","hUTw7No0Qb","yvOMI0ao3l","lj07QFPfSE","3otm6FxX9q","7fsYMQChxs","fmIK1pT8wu","5Drn0G1RhS","WDVWJ8RCUA",
+"bgJAzFGzgp","VBjhzjiVBP","pv0i7I7p2a","UlU3MJKWYR","gdQsSwDajX","7hyVvUl4a1","J2mQiqQxHP","fcJOyNcICA","QnJ1SWaim6","0Kyfs7fsYM",
+"lpF6WvOqCE","S77LHcL0aE","OxWIH2TRI7","dpe1vGv3Fq","PYBf4bgJAz","faHirzFgtB","RACujHP433","Ul4a1K20wK","0YAGHL7cGc","Q6hMCCNHmv",
+"Pb1paWreyP","jiVBPzmLYD","8hJdtvOqCE","yofH3zY1GY","a00b5M6qcG","x3LDet98iW","In3NSZ4I1v","sqVrfksJby","Y1mC05nmWv","GWqqXK20wK",
+"16lHctvdkD","7lUXZZzJHW","tAOsrhUTw7","5NammCfgr3","rKDLJ9iGoT","0Wr5yTwano","Dz1R3RsQUq","5iGN5BGaQY","uupzklCMxy","zbIYYZuDtD",
+"hSSvQTCgPp","HP433QssNC","vLsmSP6bcg","RxrsmtlILt","RpBQmhYBCK","xReeczbIYY","IBe8kfaHir","MaJQszY1GY","zbIYYSbRYy","TXQ0Zulk41",
+"WaWsvlCMxy","tl72Wn8pJ9","QYxC0SWfou","piJSk8RCUA","29QAzdpe1v","tuDyS07n1c","hUTw7lViBv","JKWYRjzUqR","prNT6OUqFM","Gv3FqZv7z0",
+"9rlg9Dz1R3","iqv4klCMxy","4dEz6rKDLJ","WDVWJHP433","9y4lw2Nslm","zQt6QzY1GY","DG4sTnnP8o","RsQUqD6rBy","RpBQmXyPZN","zY1GY3otm6",
+"tl72WyvOMI","IKxdLt98iW","2NslmLewvM","gdQsSK20wK","nFqikfqypy","yEfy955rfB","EoToPlH1kt","ulk41MGlTF","uJScX2Nslm","zQt6QdmoS7",
+"xciqpeuZA5","B3qemru4UG","oGu6xCqqaD","24ARFokgRi","5ZaEzO3iyQ","RmDcrlXFOB","pT8wuuZPqg","0BmCyEOE1o","ZuDtDrhl0J","TCgPp7fsYM",
+"rz7Ut07n1c","J2mQitaOXK","yofH3pWiOs","VLTy6RsQUq","qQxHPpFrrl","4dEz67lUXZ","W7cTsWDVWJ","VjCZqdmoS7","5IhmG3otm6","K20wKIKxdL",
+"0KyfsjiVBP","L7cGcUvlv4","7hyVvSmGzv","fcwDagjUTu","m4bxU5drc6","ZuDtDSWfou","No0QbyToGW","d85a9WaWsv","ECMvUgdQsS","b29RJdpe1v",
+"16lHcFhtgl","RACuj2Nslm","vkCHHvLsmS","pvgjSru4UG","2NslmRmDcr","AOgEetlILt","I7p2aRkQke","5VZjSAOgEe","MK07YpFrrl","VerEA2Nslm",
+"lpF6WhE1Ql","lj07QazIWp","5Namm1v5hH","wDajXrKDLJ","5ZaEzLbRTH","m4bxU7fKYU","2TRI7lCMxy","uQIczDQimp","48cHLpmeCd","55rfBhUTw7",
+"5nmWvZ4I1v","tl72WC2Irc","14FLR4W0Tl","OUqFMksJby","IRh48jiVBP","YjB9tru4UG","QbxXctvdkD","IBe8kWmadA","FjHXRVerEA","rhl0JrKDLJ",
+"yofH3tuDyS","DLhzM6AFT0","i3pydogLgc","yofH3zHF1q","5nmWvcShY2","9GXkXSmGzv","tAOsrThjNn","rz7UtFVMxo","HfyNQprNT6","ThjNniqv4k",
+"0KyfsRkQke","RsQUq1v5hH","YjB9thUTw7","GWqqXK4GS8","2hEEUFNYIM","BCxeCiwzGk","tAOsrqQxHP","BCxeCyvOMI","zY1GYnlaBy","MGlTFFnPFB",
+"b29RJ7lUXZ","7lUXZazIWp","UlU3M0BmCy","KsjRKvOqCE","UlU3MUlU3M","2hEEUlj07Q","F6PT2fFDrJ","Ta8f67X3uy","RxrsmFnPFB","POUYSfmIK1",
+"yluBxxReec","AgJHQBFkb8","JkzUnatef2","uN6r3ksJby","2ZHdkx3LDe","gIYvELewvM","i3pydjS1aj","gIYvEMmsIo","VBjhzFxX9q","lViBv29QAz",
+"Yh1hFiwzGk","ciuWzaL6AJ","M3zXLAkKTk","kB5nPRACuj","x3LDehE1Ql","s4786aFFss","0YAGHlViBv","AgJHQi3pyd","XyPZNQYxC0","9iGoTGWqqX",
+"y94nws7Mxk","5drc6WMiS3","QnJ1Sh1zcH","uPX7GFwEJz","5Mg9rxXTI4","GSQwjpWiOs","taOXK3weIF","FVMxoF6PT2","7Ow5CKASQ8","s4786Twano",
+"S2DfuBbwgA","CxVEfdQ586","ZJTXHGXdoH","XyPZN2DREs","EOE1o5Namm","xReechUTw7","s7MxkNAFuw","7X3uy45cIH","TXQ0ZFjHXR","gIYvEuvf7A",
+"S2Dfuulk41","djsrvbrhlQ","d7vjMn8pJ9","8U2nUn8pJ9","Zv7z0zY1GY","0PktIO3iyQ","hi5X7faHir","ni2v1ydG8U","UlU3Mix74r","Ss0ZubgJAz",
+"piJSksx5Gl","zqH0WPOUYS","qQxHP24ARF","uZPqgaFFss","Zv7z0fFDrJ","VjCZqgjUTu","EoToPAkKTk","AXpwEaez9y","WMiS3s7Mxk","BpYhV8TxD7",
+"2DREsoQ87r","7fsYM5Mg9r","lXFOB2ZHdk","BCxeCIjTwP","M3zXL5Mg9r","GXdoHWreyP","s93MlWMiS3","vkCHHyofH3","Yw2oUTa8f6","TXQ0Zuupzk",
+"jfREufqypy","CIShGwDajX","oVQp6i3pyd","Dz1R3mz8gx","L7cGckZANm","Oz8yZyluBx","t98iWDcpWB","azIWpGSQwj","ZzJHWpAhR1","mz8gx6AFT0",
+"QChxsZhwG1","tlILtU3yw5","In3NSmz8gx","wDajXWaim6","MmKGJfcJOy","faHirOz8yZ","Yw2oUVjCZq","JKWYRjfREu","hE1QlMGlTF","5Drn0uupzk",
+"FPfSEY1mC0","5nmWvZhwG1","pT8wuXyPZN","e6e4zPb1pa","zHF1q6AFT0","Vprf2zbIYY","L7cGc29QAz","S2DfupmeCd","IRh48sx5Gl","fcJOyatef2",
+"iqv4kjtn0X","jSjS316lHc","tvdkDRBhp0","Oz8yZlj07Q","0h1b1W7cTs","zY1GY7X3uy","tlILtru4UG","d85a9cL0aE","0PktIpvgjS","NcICA8U2nU",
+"s7MxkVNCPd","U3yw5oVQp6","uQIcz5drc6","M3zXLWPmlx","DLhzMECMvU","RmDcrzz4ZU","nnP8o9XyT9","dQ5863otm6","8FmFHMK07Y","VBjhzguMb8",
+"BGaQYCK5W7","NcICAokgRi","tvdkD5nmWv","ru4UGlH1kt","dmoS78RCUA","07n1cReKEW","qUJMd48cHL","gdQsSulk41","t98iW4W0Tl","he9IA0Wr5y",
+"x3LDejfREu","RmDcr2Nslm","tjQxspvgjS","n1pmOpT8wu","aDGtSjfREu","WMiS3L7cGc","1LB1LFjHXR","JXljWWMiS3","B3qemMK07Y","WmadAbgJAz",
+"cmXIXru4UG","jfREujSjS3","OxWIHv8yFN","TwanoEoToP","IKxdLuQIcz","JXljWS77LH","3otm6sqVrf","S2Dfu8TxD7","Cfgr3FjHXR","2ZHdkSs0Zu",
+"fqypy2TRI7","RsQUqd85a9","1v5hHtAOsr","nFqik5nmWv","mz8gx7fsYM","OHaBzuZPqg","Q6LixXflUq","AOgEeSbRYy","bgJAzFjHXR","J2mQiDG4sT",
+"pFrrl14FLR","taOXKjiVBP","xXTI4gIYvE","CNHmvwiHrZ","QworuWmadA","FjHXRNo0Qb","zqH0WVprf2","uLtKsCp3mZ","CIShGLbRTH","uoStwSWfou",
+"uJScXJJs5m","J2mQiBFkb8","xReec7Ow5C","RsQUqJkzUn","4W0TlWPmlx","uZPqgW3VFH","JkzUnNOHsz","Mkgy8J2mQi","48cHLvkCHH","NcICAhYBCK",
+"ni2v1DcpWB","hE1QlVBjhz","UmaEvbrhlQ","gIYvEx3LDe","3otm6M6qcG","4dEz624ARF","S2Dfun8pJ9","580YDdmoS7","y94nwZzJHW","2ZHdk618Di",
+"dhSuHnnP8o","ZzJHWfcJOy","nFqik0Wr5y","i7WMQMK07Y","7ku1p2hEEU","IjTwPMmsIo","gjUTuDG4sT","sx5GlUl4a1","0h1b1YOfrY","RzaZAulk41",
+"QbxXcv2eC3","v2eC3Cfgr3","sx5GlHRxd8","M6qcGRpBQm","cShY2W7cTs","8RCUAx3LDe","soy9tmz8gx","MGlTF64s8N","AIYUulweGy","FnPFBB3qem",
+"cmXIXuupzk","IjTwPIjTwP","dQ586fcJOy","L7cGcPb1pa","S2DfuaFFss","gIYvEWMiS3","he9IAFGzgp","ZJTXH2DREs","16lHcokgRi","zmLYDYh1hF",
+"Yw2oUnlaBy","gjUTuaez9y","uJScXaFFss","Q6LixYh1hF","YjB9tpiJSk","RsQUqnFqik","prNT6qQxHP","aez9ymX2GE","t59lRt59lR","AmdQdlCMxy",
+"ReKEWYf2Ec","aez9yNo0Qb","uLtKsh1zcH","StlDJaFFss","Kr8ys0h1b1","TwanohUTw7","v8yFNQworu","HRxd8RpBQm","v8yFNK4GS8","RACujZuDtD",
+"euZA5v8yFN","s4786rhl0J","7ku1pRBhp0","QClRLGSQwj","8RCUAuPX7G","8TxD7b29RJ","S77LHv8yFN","k85AetAOsr","RACujAgJHQ","kZANmQYxC0",
+"fcJOyL7cGc","aL6AJS2Dfu","ReKEW580YD","1LB1LeuZA5","ThjNn1j5L8","2hEEU8cVD3","MmsIoDcpWB","i3pydzFgtB","DQimptlILt","jzUqRDQimp",
+"5Mg9r8U2nU","zbIYYs4786","KASQ82DREs","zbIYYs7Mxk","VLTy6ciuWz","YjB9thE1Ql","7ku1pblLA9","QssNCPb1pa","POUYSFnPFB","fcJOyJRJQB",
+"ZJTXHCdyBV","RzaZArKDLJ","pAhR1guMb8","MGlTF580YD","2ZHdkAXpwE","DG4sTSmGzv","EdBKctuDyS","45cIHzQt6Q","1j5L86AFT0","dmoS70YAGH",
+"bgJAzZJTXH","U3yw514FLR","sx5GlVNCPd","BCxeCtlILt","ksJbyuN6r3","jtn0X5Namm","jSjS3Mm8si","x3LDeQ6Lix","VNCPdtuDyS","aez9yPYBf4",
+"P6bcg2TRI7","S77LH9rlg9","dQ586djsrv","rz7UtcQOnv","uPX7GuZPqg","9XyT9hYBCK","wDajXkB5nP","fFDrJyEfy9","8hJdtMezSW","Yw2oUlj07Q",
+"lViBvy94nw","HzZT8zFgtB","n8pJ95drc6","uLtKsfqypy","HzZT8RpBQm","uJScXQworu","gIYvEHRxd8","EdBKcYjB9t","DcpWBiwzGk","2ZHdkhe9IA",
+"HzZT89GXkX","cmXIXzqH0W","2ZHdkCqqaD","ZJTXHfaHir","ECMvUYh1hF","bZLvSprNT6","W3VFHRmDcr","Mkgy80PktI","2NslmQClRL","8cVD3pvgjS",
+"7hyVvuoStw","1v5hHFnPFB","x3LDeWMiS3","aDGtSQssNC","7lUXZFLsph","yofH3sqVrf","aFFssB3qem","UmaEv5ZaEz","v8yFNAkKTk","bgJAzQWxoT",
+"7fKYU0MR5X","tuDySo8Uyd","8hJdtFjHXR","RmDcrl83Ud","MK07YX6Pin","RkQkezbIYY","y94nw5drc6","x3LDe64s8N","QnJ1SMK07Y","zFgtBGSQwj",
+"7fKYU24ARF","iqv4k55rfB","NhXdubgJAz","zY1GYeuZA5","AgJHQiqv4k","B3qemHRxd8","RmDcrW3VFH","tAOsrlweGy","O3iyQoVQp6","Dz1R30BmCy",
+"tvdkDDLhzM","nFqikWaWsv","piJSknlaBy","Cp3mZjeskS","iB08lOUYuF","FPfSEQChxs","Nxx9Vt98iW","DcpWBKr8ys","o8UydFPfSE","pmeCdBFkb8",
+"mz8gxsuY4x","zqH0WVLTy6","KASQ8uLtKs","Ss0Zu4W0Tl","aL6AJxReec","aez9yni2v1","Vprf2gtCA5","0BmCy5IhmG","GrDg7cShY2","F6PT2dpe1v",
+"618DiVLTy6","5iGN5LewvM","UlU3MZuDtD","soy9tFxX9q","64s8NdmoS7","Pb1paIBe8k","tl72W3otm6","YOfrYSbRYy","24ARFaez9y","HzZT8OxWIH",
+"45cIHJJs5m","VLTy6lj07Q","lweGy9GXkX","2hEEUGrDg7","Ul4a15drc6","VBjhztlILt","FVMxoNcICA","azIWp5Drn0","8hJdtcShY2","48cHLfqypy",
+"8xEKz8FmFH","uupzk0Wr5y","o8UydZzJHW","2ZHdkW7cTs","9y4lwdjsrv","pWiOss93Ml","4W0Tll83Ud","cQOnvuvf7A","nFqikThjNn","zqH0WWDVWJ",
+"lweGyGSQwj","G1RhSYOfrY","Zv7z0yofH3","48cHLS2Dfu","GXdoHAmdQd","LDk6f0MR5X","iKqhr8U2nU","MezSWNo0Qb","MGlTFCqqaD","mX2GE0MR5X",
+"AkKTkCqqaD","JkzUnzHF1q","YOfrYru4UG","LbRTHRmDcr","U3yw5Kr8ys","GrDg7cQOnv","DcpWBh1zcH","7hyVvZUnqt","ydG8UNxx9V","v8yFNEdBKc",
+"gtCA5v8yFN","t59lRuN6r3","Yh1hFP6bcg","KsjRKFLsph","O3iyQ8xEKz","KZamH9rlg9","lCMxyHfyNQ","brhlQn8pJ9","SmGzv7lUXZ","OxWIHSjskQ",
+"iqv4kHlUbF","RkQkeMkgy8","8hJdtB3qem","jfREudjsrv","yEfy9M3zXL","ECMvU9y4lw","Cfgr34W0Tl","HfyNQuQIcz","aDGtSCxVEf","pvgjStaOXK",
+"uAWyplm0pD","jS1ajFhtgl","zqH0WUlU3M","kZANmWPmlx","WDVWJv2eC3","brhlQ8U2nU","cShY25iGN5","MmKGJNhXdu","MaJQsjSjS3","9eoRcIjTwP",
+"Nxx9VVNCPd","aFFssMm8si","yofH3VLTy6","iwzGkjeskS","7fKYUTa8f6","JIqXiNAFuw","IKxdLhi5X7","14FLRvOqCE","AOgEeqQxHP","MaJQsgIYvE",
+"yvOMIvkCHH","X6PinJRJQB","SbRYy6q6L9","AOgEeMGlTF","lkMUAD6rBy","HfyNQi3pyd","4QMc9MojnP","BbwgAFLsph","jS1aj0BmCy","aDGtSzqH0W",
+"blLA9gtCA5","LewvMDLhzM","jS1ajwiHrZ","TXQ0Ziqv4k","atef2NOHsz","brhlQVBjhz","XflUqFnPFB","lH1ktMmKGJ","KsjRKzFgtB","faHir5ZaEz",
+"ru4UG5Drn0","gtCA5JJs5m","JXljWprNT6","fcJOyM3zXL","azIWp8U2nU","xXTI4Q6Lix","7lUXZ0ao3l","zz4ZUOHaBz","aL6AJa00b5","Cfgr3uJScX",
+"dmoS7ZJTXH","ZuDtDThjNn","qUJMdv8yFN","ciuWz1v5hH","ulk410MR5X","TwanoVNCPd","In3NS5VZjS","cL0aEuTacx","6AFT0jS1aj","W3VFHFjHXR",
+"atef2dhSuH","yToGWBFkb8","7ku1pjiVBP","jSjS35Drn0","fFDrJciuWz","DLhzMFFDui","uAWyphUTw7","WPmlx55rfB","mz8gxxciqp","pvgjSOUYuF",
+"yvOMIwiHrZ","5Drn0jeskS","QWxoTe6e4z","jiVBPpWiOs","EOE1oGSQwj","pWiOsqUJMd","5NammReKEW","MGlTFVNCPd","VNCPdI7p2a","ECMvUgjUTu",
+"FjHXRWaim6","vLsmSaDGtS","Cp3mZGWqqX","Chuy38RCUA","sx5GlblLA9","jfREuHlUbF","rKDLJCxVEf","WMiS3lsQGo","XflUqGv3Fq","AIYUuKr8ys",
+"tAOsrJIqXi","l83Udsoy9t","D6rBy7fKYU","7fKYU9rlg9","2Yz7EVLTy6","FFDuinlaBy","In3NS3otm6","Ul4a15VZjS","8TxD7t59lR","RkQkelCMxy",
+"StlDJZuDtD","fLNg8lViBv","hE1QlhSSvQ","ECMvU2Yz7E","8xEKzuQIcz","brhlQMK07Y","Cfgr3k85Ae","Uvlv4d85a9","dQ58664s8N","n8pJ9mX2GE",
+"GrDg7gjUTu","G1RhSjeskS","QClRLix74r","ru4UGvLsmS","CIShGXflUq","IBe8kSs0Zu","oQ87r8hJdt","0h1b1hi5X7","s7MxkuAWyp","piJSkCK5W7",
+"xReecQbxXc","uZPqguTacx","Chuy3DQimp","OUYuFTwano","lm0pDmz8gx","NhXduJJs5m","3weIFiqv4k","16lHcMkgy8","GrDg729QAz","Vprf2MojnP",
+"aDGtSFhtgl","Uvlv4lj07Q","8RCUAYjB9t","0Wr5ycmXIX","2NslmRxrsm","dhSuHru4UG","Zv7z0mz8gx","x3LDe1j5L8","jfREuNOHsz","fcwDa4W0Tl",
+"uPX7GMezSW","IjTwPazIWp","LbRTHZ4I1v","fLNg8VNCPd","P6bcgGv3Fq","LDk6fjtn0X","W7cTs16lHc","nFqiksoy9t","lkMUAguMb8","ru4UGMmsIo",
+"v1HlnFFDui","8xEKzRBhp0","P6bcgVerEA","Oz8yZ5ZaEz","CNHmvyEfy9","lj07QjSjS3","QworuSWfou","WmadA9eoRc","pWiOsKASQ8","9rlg9P6bcg",
+"aDGtSbrhlQ","lsQGoCIShG","7fsYMIn3NS","No0Qb2TRI7","fqypyJRJQB","aL6AJNhXdu","HP433MaJQs","azIWpeuZA5","aL6AJEoToP","m4bxUguMb8",
+"cQOnvlCMxy","9rlg94W0Tl","O3iyQsqVrf","NAFuwYh1hF","DG4sT6q6L9","L7cGcBFkb8","VLTy6Mkgy8","X6Pin6AFT0","soy9tfcwDa","VjCZqIBe8k",
+"FcWrWKASQ8","uPX7GOxWIH","oQ87rkB5nP","Qworu8hJdt","VLTy6S2Dfu","QssNCk85Ae","8RCUAZv7z0","RBhp0Dz1R3","nFqikni2v1","WPmlxBFkb8",
+"OUqFM580YD","JXljWb29RJ","Ss0ZutAOsr","fcJOyVBjhz","FVMxov8yFN","lweGyFxX9q","FVMxoZJTXH","e6e4zt59lR","KsjRKix74r","BpYhVoGu6x",
+"yToGW7fKYU","b29RJ5nmWv","WDVWJzY1GY","vLsmSUlU3M","55rfBNo0Qb","sqVrfo8Uyd","i7WMQlH1kt","zHF1qjeskS","618DiFVMxo","QWxoTfmIK1",
+"Dz1R3Uvlv4","RkQkevkCHH","dhSuHVNCPd","h1zcHazIWp","TXQ0ZlsQGo","nlaByIjTwP","DcpWB8FmFH","RxrsmQWxoT","ZhwG1AkKTk","W3VFHS2Dfu",
+"zbIYYix74r","yofH35Drn0","a00b5K4GS8","EdBKcOUqFM","24ARF7fsYM","ZUnqt9rlg9","cmXIXJKWYR","rKDLJDcpWB","faHirFwEJz","QnJ1SRzaZA",
+"9y4lw0PktI","ZJTXHm4bxU","cShY2VLTy6","LDk6fX6Pin","gjUTujS1aj","aFFssNAFuw","nnP8oNOHsz","CIShGMojnP","Chuy3OUqFM","3otm62TRI7",
+"b29RJh1zcH","uAWypFjHXR","JkzUn64s8N","FGzgpkB5nP","v2eC3hi5X7","F6PT2cL0aE","VNCPdHfyNQ","4W0TlYOfrY","CIShGKr8ys","SbRYyguMb8",
+"brhlQDG4sT","yvOMIbgJAz","HzZT8CqqaD","KsjRKQWxoT","oQ87rYw2oU","S77LHm4bxU","lm0pDOUqFM","v2eC35drc6","W3VFHZuDtD","piJSktuDyS",
+"5ZaEzhE1Ql","ThjNn4QMc9","gIYvETXQ0Z","W7cTs5IhmG","CxVEfdmoS7","hSSvQaFFss","uPX7GIRh48","TCgPplweGy","DG4sTwDajX","lsQGoY1mC0",
+"pFrrlm4bxU","Uvlv42TRI7","4W0TlokgRi","Cp3mZMaJQs","zHF1qlkMUA","Chuy3ydG8U","FjHXR0BmCy","0BmCyhi5X7","zqH0WtAOsr","uupzkzbIYY",
+"QChxs9eoRc","zz4ZU8FmFH","rz7UtAgJHQ","hSSvQy94nw","iB08lwDajX","ix74rlkMUA","2Yz7EFhtgl","hE1QlMK07Y","KASQ8vkCHH","ECMvUC2Irc",
+"2DREsW3VFH","tlILtqUJMd","pmeCduLtKs","IjTwP9y4lw","qUJMdEOE1o","7fsYMCNHmv","ogLgcs93Ml","lH1kt7fKYU","FcWrWDz1R3","FNYIMv1Hln",
+"ReKEWuTacx","2TRI7YjB9t","VIlwPI7p2a","bgJAzyToGW","Nxx9VkB5nP","nFqikDQimp","dQ586xXTI4","AIYUu5Namm","brhlQC2Irc","XyPZNpv0i7",
+"fcwDaxciqp","JRJQBW7cTs","i3pydMK07Y","Waim6vkCHH","HRxd8J2mQi","a00b5VIlwP","7Ow5Chi5X7","lkMUA5ZaEz","dhSuHtlILt","0YAGHZuDtD",
+"BGaQYUlU3M","2Yz7E48cHL","7fsYM9GXkX","VjCZql83Ud","OHaBzJIqXi","QbxXcQ6Lix","8xEKzFFDui","5drc6wDajX","uPX7G5iGN5","2ZHdkThjNn",
+"lj07Q8xEKz","JJs5msqVrf","0PktIYh1hF","7fsYMiB08l","5NammQYxC0","JKWYRVNCPd","HzZT8gdQsS","faHir0YAGH","16lHccShY2","5nmWvJJs5m",
+"cQOnvtl72W","W3VFHNo0Qb","zFgtBZ4I1v","OUYuFlCMxy","BCxeCix74r","dhSuHnlaBy","Cfgr3hE1Ql","9eoRcnFqik","RkQkegjUTu","uJScXECMvU",
+"QChxshUTw7","7fsYMi3pyd","SjskQ2ZHdk","ru4UGt59lR","TXQ0ZMmsIo","64s8NIBe8k","mX2GE2hEEU","nlaBy9y4lw","Y1mC0hUTw7","FwEJzQYxC0",
+"LbRTH4QMc9","uQIczNxx9V","F6PT2Vprf2","dmoS7Chuy3","hUTw7i3pyd","HzZT8bgJAz","NhXduQChxs","I7p2ajtn0X","0h1b1iwzGk","ReKEWFhtgl",
+"h1zcH8U2nU","MmsIoThjNn","1j5L8nlaBy","HP433BbwgA","ReKEWWDVWJ","618DiBpYhV","zFgtBpFrrl","POUYSru4UG","NOHszHlUbF","Q6hMC3otm6",
+"Ta8f6Q6hMC","iwzGkYf2Ec","y94nwCNHmv","jzUqRCK5W7","W7cTsuupzk","OxWIH1LB1L","euZA5LewvM","U3yw5s93Ml","nlaByC2Irc","S77LHfmIK1",
+"CK5W7piJSk","2NslmcShY2","JKWYR14FLR","Uvlv4cL0aE","Mkgy8h1zcH","4W0TlaL6AJ","YjB9tfFDrJ","Chuy3QChxs","AmdQdzHF1q","GXdoHMezSW",
+"IjTwPeuZA5","Mm8sih1zcH","8hJdtix74r","lXFOBfmIK1","IBe8kwiHrZ","07n1cqaofN","LbRTHzqH0W","gdQsSuQIcz","Vprf29iGoT","bZLvSHzZT8",
+"GSQwjNOHsz","x3LDeFwEJz","v2eC3Dz1R3","JkzUnZJTXH","WPmlxRACuj","Twanoni2v1","K20wKlj07Q","lsQGoZhwG1","MaJQs0BmCy","KASQ8AXpwE",
+"cQOnvdhSuH","QChxsTCgPp","jS1ajGrDg7","B3qemuPX7G","nnP8obrhlQ","pWiOs2ZHdk","55rfByEfy9","tuDySZJTXH","M3zXLs7Mxk","S77LHCNHmv",
+"lViBvRzaZA","2hEEULbRTH","qQxHPKr8ys","zQt6QlpF6W","0YAGHjSjS3","FcWrWgf8rI","BpYhV5VZjS","EOE1odpe1v","kB5nPeuZA5","PYBf4HRxd8",
+"hi5X7Rxrsm","M3zXL0BmCy","hYBCKMGlTF","jeskSbgJAz","uoStwfLNg8","gtCA5HlUbF","OUqFML7cGc","s4786FjHXR","qQxHPThjNn","bgJAzoVQp6",
+"SbRYy2ZHdk","OUqFMBGaQY","24ARFs7Mxk","i7WMQOz8yZ","LbRTHhSSvQ","ciuWzAIYUu","CK5W716lHc","pmeCdYh1hF","24ARF5Drn0","dQ586S2Dfu",
+"ZzJHW55rfB","cQOnv4W0Tl","45cIHKASQ8","guMb87lUXZ","4QMc9DLhzM","cmXIXfaHir","Mkgy8fcJOy","vOqCECxVEf","gdQsSsuY4x","prNT61j5L8",
+"o8UydjeskS","DQimp0BmCy","LbRTHfcJOy","l83Ud16lHc","t98iWguMb8","n8pJ9suY4x","5NammWaim6","2TRI7C2Irc","tjQxstaOXK","W7cTs0h1b1",
+"FxX9qyofH3","yofH3tjQxs","ulk41FnPFB","ZhwG1FVMxo","dmoS7pvgjS","DQimpQssNC","2ZHdktAOsr","ciuWzMmKGJ","SbRYy7fKYU","WDVWJMezSW",
+"NAFuwAmdQd","hi5X7QbxXc","0YAGHuvf7A","2ZHdkIKxdL","uLtKsRmDcr","Mkgy8Cp3mZ","guMb8Dz1R3","MojnPBbwgA","RkQkeRmDcr","AXpwEYw2oU",
+"lpF6WEdBKc","guMb8QbxXc","zY1GY8TxD7","YOfrYSjskQ","QnJ1STwano","fmIK1lViBv","x3LDeuoStw","ThjNn0PktI","B3qemZzJHW","cShY2JJs5m",
+"JRJQBwiHrZ","Waim6YOfrY","JXljWd7vjM","8hJdt0Kyfs","MojnPNo0Qb","BCxeCogLgc","VBjhzAOgEe","fmIK1pWiOs","DLhzMbrhlQ","bZLvSiqv4k",
+"MGlTFFLsph","lj07QuZPqg","9iGoTIKxdL","ciuWzZUnqt","AgJHQP6bcg","5nmWvQbxXc","24ARFRpBQm","yEfy9Dz1R3","QssNCSbRYy","xciqpEOE1o",
+"uvf7AcL0aE","MGlTFeuZA5","5VZjSW3VFH","hi5X7M3zXL","IRh48tjQxs","lkMUAJkzUn","hSSvQ2DREs","dmoS7OUYuF","HzZT8RkQke","CqqaDblLA9",
+"lweGytjQxs","LDk6fZUnqt","580YDCdyBV","FjHXRbrhlQ","DLhzM2Yz7E","2hEEUgIYvE","RmDcrZzJHW","RkQkeNcICA","FLsphl83Ud","HlUbFjS1aj",
+"Cfgr3rhl0J","s4786580YD","FVMxoTa8f6","hi5X7o8Uyd","07n1c48cHL","mz8gxXyPZN","MmsIolkMUA","jS1aj2Yz7E","MGlTFZuDtD","soy9tpiJSk",
+"aez9yzY1GY","7X3uyKASQ8","QYxC0s93Ml","16lHcZv7z0","nnP8oYh1hF","WmadAru4UG","2DREsdpe1v","iB08lkB5nP","8cVD3t98iW","i3pydsx5Gl",
+"yToGWFPfSE","fcwDa9eoRc","cmXIXdmoS7","pAhR1yvOMI","yofH3FcWrW","kZANmatef2","LewvMv1Hln","5IhmG4W0Tl","vOqCEciuWz","VIlwP9XyT9",
+"SWfouydG8U","G1RhSBFkb8","RBhp0FnPFB","v8yFN3otm6","Fhtglfqypy","zz4ZUYh1hF","9iGoTTwano","mX2GEjiVBP","9XyT9oVQp6","D6rByMezSW",
+"pAhR1iqv4k","hYBCKru4UG","mz8gxlXFOB","9rlg9WMiS3","2DREspiJSk","RkQkefFDrJ","JRJQBe6e4z","0Wr5yWaim6","KsjRKQbxXc","VjCZqlXFOB",
+"6q6L9ECMvU","Ul4a10YAGH","64s8N7ku1p","Z4I1vO3iyQ","uTacxaFFss","piJSkGWqqX","ru4UGhYBCK","mz8gxvOqCE","7fKYUqQxHP","yToGW5Drn0",
+"cL0aEQ6Lix","yofH3ECMvU","DcpWB0BmCy","uupzkNOHsz","iKqhrS77LH","WaWsvRBhp0","SmGzvM6qcG","uLtKsYw2oU","5Drn0J2mQi","uupzkix74r",
+"KsjRK0ao3l","6q6L9n1pmO","v1HlnyToGW","bZLvSMkgy8","MK07YZ4I1v","lm0pD45cIH","FwEJz7X3uy","tuDyS0Wr5y","5NammFFDui","S2Dfu8U2nU",
+"lsQGo7X3uy","oGu6xe6e4z","JKWYRtlILt","4dEz6QbxXc","azIWp8xEKz","ZuDtDG1RhS","JJs5mD6rBy","GWqqXi3pyd","tuDySuoStw","s4786ulk41",
+"0BmCyOUqFM","ReKEWQssNC","v2eC3OHaBz","gjUTuJ2mQi","TCgPp55rfB","Vprf2VLTy6","e6e4zuZPqg","zqH0WuQIcz","zY1GYfcwDa","MGlTFxXTI4",
+"wiHrZn8pJ9","2NslmFLsph","djsrvlViBv","MojnPCqqaD","QYxC0qQxHP","M3zXLOUYuF","jSjS3tl72W","ZUnqtaez9y","Yw2oUogLgc","lm0pDCp3mZ",
+"uupzkLbRTH","W3VFHqQxHP","FwEJzMojnP","2ZHdkNOHsz","jeskSMGlTF","O3iyQ2DREs","TCgPpatef2","YOfrY4W0Tl","8hJdtAIYUu","MK07YW7cTs",
+"yToGWaL6AJ","Ta8f66q6L9","okgRiKsjRK","m4bxUP6bcg","7X3uyEoToP","MojnPjSjS3","jS1ajlm0pD","okgRijfREu","FFDui8U2nU","8xEKzaDGtS",
+"xReecuupzk","n8pJ95Namm","618Dirz7Ut","lH1ktReKEW","MmsIoI7p2a","UlU3Mv2eC3","oQ87rfqypy","tuDySUmaEv","hYBCKM6qcG","Chuy3d85a9",
+"FjHXRrhl0J","cQOnvfLNg8","lH1ktX6Pin","ciuWz4QMc9","CxVEfCxVEf","GSQwjVIlwP","xXTI40Kyfs","hUTw7AOgEe","EOE1oGrDg7","Yw2oUFNYIM",
+"lpF6WQworu","VNCPd5Namm","Zv7z0AgJHQ","hSSvQmX2GE","7fKYUSjskQ","M3zXL4QMc9","FxX9q618Di","FVMxozz4ZU","7fsYM8xEKz","fLNg8BpYhV",
+"RpBQmTXQ0Z","zFgtBKASQ8","48cHLYOfrY","2Yz7ERmDcr","IRh48SjskQ","TCgPpCNHmv","OxWIHWaim6","2hEEUt98iW","v1Hlntl72W","nFqikFLsph",
+"IRh48cQOnv","rKDLJ2ZHdk","QbxXc7ku1p","tlILt9eoRc","Qworu8RCUA","CK5W7ECMvU","uupzkDcpWB","KASQ8NhXdu","MaJQsuJScX","uQIczpvgjS",
+"9iGoTQnJ1S","FNYIMbrhlQ","faHirAXpwE","4QMc97Ow5C","Ss0Zu0ao3l","POUYSW7cTs","wDajX1v5hH","xciqpCNHmv","y94nwTCgPp","0h1b18RCUA",
+"ZhwG1JRJQB","AOgEeCfgr3","TwanoC2Irc","iB08l14FLR","3weIFrz7Ut","QnJ1S8FmFH","bZLvSW7cTs","FFDuiNxx9V","3otm6D6rBy","cQOnvJ2mQi",
+"o8Uydm4bxU","FhtgljeskS","XyPZNFhtgl","OHaBzzbIYY","yvOMIprNT6","55rfBECMvU","NcICAUlU3M","pT8wuUlU3M","pAhR1WPmlx","dpe1vMaJQs",
+"uLtKsFjHXR","QChxsStlDJ","FNYIMMaJQs","7hyVvAmdQd","GWqqXZUnqt","4QMc9MGlTF","NOHsz64s8N","BpYhVyofH3","RsQUqX6Pin","JkzUnkB5nP",
+"l83UdC2Irc","ECMvUFNYIM","faHir8hJdt","pAhR1Cfgr3","9iGoTrKDLJ","Vprf2zz4ZU","ni2v1okgRi","fcJOyIBe8k","NOHsz4dEz6","kB5nPoVQp6",
+"8cVD3Oz8yZ","jfREukB5nP","StlDJjfREu","atef2ZzJHW","v8yFNvLsmS","rKDLJDz1R3","s93MldhSuH","Cfgr34dEz6","5ZaEznFqik","CNHmvyvOMI",
+"8RCUA55rfB","EdBKcYOfrY","7fsYMYw2oU","n1pmORmDcr","hYBCK7lUXZ","yluBxe6e4z","ix74rtvdkD","GSQwjvLsmS","oVQp6DcpWB","ix74rhSSvQ",
+"C2IrcCqqaD","JkzUnPOUYS","ulk414W0Tl","L7cGcguMb8","JKWYR9eoRc","FFDuiJ2mQi","7X3uy5iGN5","VNCPdNhXdu","FhtglpvgjS","Uvlv4atef2",
+"FxX9qtlILt","8U2nUFxX9q","8FmFHXflUq","aL6AJFLsph","FFDuiW7cTs","lweGyMmsIo","b29RJv1Hln","7hyVv0h1b1","djsrv4QMc9","QChxsuvf7A",
+"v2eC32Nslm","9iGoT48cHL","2TRI74QMc9","ksJbyzmLYD","5IhmGWaWsv","L7cGcNcICA","M3zXLjeskS","8hJdtwiHrZ","gf8rIru4UG","OUqFMChuy3",
+"dQ586QChxs","GXdoHIKxdL","rKDLJNAFuw","J2mQiDQimp","hUTw7atef2","pAhR1gtCA5","brhlQxReec","FNYIMe6e4z","OHaBzaFFss","i7WMQbZLvS",
+"s7MxkXflUq","CxVEfAOgEe","soy9t5Drn0","zQt6QNo0Qb","K20wKFGzgp","CqqaD9eoRc","QssNCLbRTH","CNHmvzz4ZU","b29RJ8cVD3","zHF1qYOfrY",
+"e6e4zQChxs","JJs5mRsQUq","mz8gx5Namm","lkMUAwiHrZ","4QMc9WreyP","dhSuHQClRL","5Mg9rcmXIX","n8pJ95iGN5","s93MlMezSW","zFgtBXyPZN",
+"aL6AJjtn0X","64s8N7fKYU","uAWypCIShG","xXTI4Rxrsm","ix74rgIYvE","XyPZNblLA9","QnJ1SMezSW","d7vjMjS1aj","8TxD77lUXZ","zz4ZUDz1R3",
+"2DREszbIYY","K4GS8CK5W7","4dEz6CIShG","prNT65iGN5","tlILt5IhmG","ZUnqtiqv4k","ru4UGCp3mZ","lpF6W9XyT9","0YAGHblLA9","zY1GYHfyNQ",
+"F6PT23weIF","l83UdF6PT2","lkMUAuvf7A","G1RhSECMvU","yluBxSjskQ","Ul4a1cQOnv","v2eC3wDajX","s93MltAOsr","TwanoFnPFB","FFDuiZv7z0",
+"AgJHQhe9IA","9y4lwDcpWB","y94nw1v5hH","NOHsz8cVD3","JKWYRZhwG1","DLhzMVIlwP","RsQUq0ao3l","5IhmGGv3Fq","W3VFHQClRL","pAhR1Oz8yZ",
+"W7cTs618Di","tlILtBGaQY","HRxd89eoRc","oGu6xlCMxy","i3pydaDGtS","HRxd8LbRTH","azIWpW7cTs","C2IrcvOqCE","0ao3lpvgjS","0YAGHBpYhV",
+"O3iyQ618Di","OUqFMFjHXR","LewvMIjTwP","t98iWxciqp","fcwDa0BmCy","IKxdLYOfrY","guMb8NOHsz","RpBQmuPX7G","s7MxkWDVWJ","t59lR0YAGH",
+"FVMxoDLhzM","SWfouWPmlx","tjQxsKr8ys","a00b50MR5X","uAWypZv7z0","AkKTktuDyS","6q6L9CxVEf","n1pmOAIYUu","s4786BFkb8","VLTy64W0Tl",
+"aFFsslXFOB","No0Qbatef2","AOgEes93Ml","fcwDaJkzUn","W3VFHWreyP","POUYSLbRTH","dmoS7In3NS","6AFT0Dz1R3","WreyPs4786","EoToPY1mC0",
+"F6PT2WDVWJ","QWxoTcQOnv","RBhp0DG4sT","1LB1LTwano","n8pJ9qQxHP","0Wr5ynnP8o","PYBf4jiVBP","9rlg9W7cTs","StlDJUvlv4","PYBf4K20wK",
+"lsQGoZJTXH","7fKYUVBjhz","7fsYM0Kyfs","qUJMdJkzUn","In3NSX6Pin","tvdkDRpBQm","hi5X7x3LDe","guMb88cVD3","fFDrJb29RJ","B3qem2TRI7",
+"RmDcrqaofN","Ta8f6ZJTXH","euZA5KZamH","JKWYRFhtgl","gdQsSeuZA5","ulk41lH1kt","FjHXROHaBz","8U2nU8hJdt","Yf2Ec0BmCy","kZANmyvOMI",
+"bZLvSrhl0J","WreyPa00b5","fqypyuLtKs","n8pJ98hJdt","kB5nPhi5X7","gf8rIydG8U","atef2BFkb8","4QMc9m4bxU","gIYvElj07Q","F6PT2gdQsS",
+"jeskSRzaZA","RzaZAnFqik","pT8wuzFgtB","AOgEecmXIX","GrDg7iqv4k","lsQGofmIK1","d7vjMjzUqR","lpF6W6q6L9","GXdoHIjTwP","4W0TlPYBf4",
+"ciuWzzqH0W","IKxdLlj07Q","QWxoTIn3NS","D6rByIKxdL","qQxHPBGaQY","M6qcGs4786","uN6r3Rxrsm","tuDySgjUTu","fLNg8HzZT8","t59lRhi5X7",
+"aL6AJG1RhS","55rfBv2eC3","QssNCO3iyQ","KZamHFVMxo","Zv7z0HP433","6q6L9zqH0W","LbRTHjS1aj","MezSWIn3NS","4W0Tl7fsYM","zz4ZUmz8gx",
+"6q6L9EdBKc","EdBKcjS1aj","FLsphiB08l","JRJQBl83Ud","OHaBzWaWsv","TwanocmXIX","4QMc9lj07Q","L7cGcNAFuw","oGu6xJ2mQi","StlDJzQt6Q",
+"MmKGJHlUbF","WmadAokgRi","VBjhzYjB9t","DcpWBHfyNQ","TCgPplj07Q","618Dirhl0J","FjHXR9rlg9","iKqhrzz4ZU","uoStwBbwgA","XyPZN8FmFH",
+"gjUTux3LDe","dQ5867ku1p","ru4UGuAWyp","pvgjS7ku1p","zqH0WtvdkD","Pb1paHRxd8","x3LDebZLvS","5iGN5WmadA","SjskQW3VFH","jzUqR5nmWv",
+"pvgjSJRJQB","gIYvEhi5X7","ZJTXH48cHL","jeskSQ6Lix","kZANmTa8f6","M3zXL8U2nU","i7WMQqUJMd","hYBCKZhwG1","2Yz7Edjsrv","jeskSWDVWJ",
+"FVMxoRmDcr","14FLR618Di","7lUXZVerEA","7lUXZDz1R3","RsQUqEdBKc","lCMxyNcICA","zHF1qRxrsm","Vprf25IhmG","uPX7G1v5hH","FhtglWMiS3",
+"0YAGHuupzk","M6qcGW7cTs","DQimpYOfrY","rhl0JfcJOy","4QMc99XyT9","pFrrl29QAz","lXFOBqUJMd","cQOnvxXTI4","uN6r3F6PT2","Gv3FqlkMUA",
+"RACujYh1hF","GSQwjy94nw","yluBxStlDJ","MGlTFlH1kt","qaofN9rlg9","iwzGk618Di","Gv3Fqfqypy","ru4UGBCxeC","yToGWprNT6","LDk6flsQGo",
+"9eoRcS77LH","okgRiO3iyQ","CqqaD6AFT0","YjB9t14FLR","d7vjMCdyBV","brhlQprNT6","uAWypMmsIo","2Yz7EpmeCd","IKxdLmz8gx","ECMvUBGaQY",
+"3weIF9rlg9","d85a9jiVBP","7X3uyK20wK","HzZT8618Di","fcJOyOz8yZ","ix74r8cVD3","zbIYYrKDLJ","FjHXRkZANm","SWfouB3qem","KZamHpmeCd",
+"LbRTHNOHsz","uTacxCIShG","uZPqgWDVWJ","LDk6fhUTw7","WPmlxW7cTs","uAWypjeskS","yvOMIi3pyd","zmLYDQClRL","JXljWQWxoT","cQOnvjiVBP",
+"NOHsz6q6L9","FGzgptaOXK","0BmCydQ586","Yw2oUOz8yZ","t59lRBFkb8","RxrsmKASQ8","HP433MGlTF","IKxdLQworu","FNYIMx3LDe","pvgjSOHaBz",
+"NAFuwuTacx","I7p2aPb1pa","AmdQdGXdoH","0h1b15nmWv","TCgPpWMiS3","lj07Q9y4lw","5VZjSMezSW","h1zcH2hEEU","FnPFBwDajX","dpe1vzbIYY",
+"K20wKGWqqX","DLhzMJJs5m","lm0pDC2Irc","fFDrJOxWIH","cShY2CdyBV","atef2QbxXc","DQimpFVMxo","0BmCye6e4z","GSQwjFnPFB","uJScXyToGW",
+"FxX9qO3iyQ","9rlg9FVMxo","oVQp6jtn0X","mX2GEWmadA","gdQsSrhl0J","Q6hMCSs0Zu","oGu6xECMvU","he9IAcmXIX","1LB1Liqv4k","EoToPlsQGo",
+"4QMc9ZJTXH","QssNCqaofN","5IhmGBFkb8","gdQsSdjsrv","POUYSMGlTF","Rxrsmuvf7A","HlUbFd85a9","7fKYUTCgPp","dmoS7SmGzv","mX2GEAgJHQ",
+"okgRis7Mxk","y94nwTwano","OUqFMwDajX","16lHciwzGk","3otm68RCUA","s93MlWaWsv","k85Ae4QMc9","yToGWMojnP","6AFT05VZjS","dpe1vQWxoT",
+"lViBvM3zXL","W7cTsWreyP","taOXKFcWrW","CxVEfhE1Ql","ni2v1IRh48","M3zXLIn3NS","0YAGHmX2GE","5IhmGCNHmv","Q6Lixulk41","vkCHHQWxoT",
+"yvOMIJkzUn","5drc6JRJQB","a00b5tAOsr","FNYIMJkzUn","nnP8o16lHc","WDVWJIRh48","5VZjSni2v1","4dEz6lkMUA","3weIFksJby","vkCHHpvgjS",
+"guMb8taOXK","FcWrWOxWIH","cQOnv6AFT0","YOfrYyToGW","9XyT9Chuy3","LewvMo8Uyd","M3zXL8xEKz","CK5W7IjTwP","ni2v1QClRL","Cp3mZ2ZHdk",
+"Uvlv45nmWv","No0QbvkCHH","FFDuipWiOs","FxX9q29QAz","OxWIHcQOnv","m4bxUlweGy","aL6AJMkgy8","iwzGkGSQwj","W3VFHOUYuF","AmdQdMGlTF",
+"7X3uyDz1R3","5iGN5FPfSE","0BmCyFcWrW","dpe1voVQp6","SWfouHlUbF","QssNCEdBKc","7ku1prKDLJ","yToGWoGu6x","ZuDtDJJs5m","Z4I1vCfgr3",
+"n8pJ9aez9y","UmaEv07n1c","aDGtScL0aE","CIShGWMiS3","7ku1pd7vjM","FwEJzoVQp6","ZzJHWTXQ0Z","GrDg7sqVrf","9iGoTGSQwj","yvOMIpmeCd",
+"d7vjMNo0Qb","48cHL0Kyfs","HlUbFMaJQs","AkKTkVLTy6","tjQxszz4ZU","xciqptAOsr","CNHmvJ2mQi","FPfSEhe9IA","azIWpCqqaD","QnJ1SS77LH",
+"cQOnvRxrsm","Kr8ysTXQ0Z","5Mg9r8xEKz","45cIHru4UG","Vprf22TRI7","4QMc9cShY2","fcJOyfcwDa","EOE1olsQGo","8FmFHMkgy8","CK5W71LB1L",
+"mX2GE0BmCy","fcwDaiB08l","Yf2Ec0MR5X","Uvlv4hi5X7","FPfSEQbxXc","YOfrYFFDui","0Wr5yU3yw5","uN6r3YOfrY","fcwDa0Wr5y","FLsphuZPqg",
+"POUYSFVMxo","hi5X7J2mQi","S2DfuhSSvQ","GXdoHbZLvS","5IhmGOHaBz","yluBxRACuj","jS1aj0YAGH","aDGtSMkgy8","uZPqgK4GS8","SWfou5VZjS",
+"h1zcH7Ow5C","aez9ylpF6W","24ARFyvOMI","zY1GYhe9IA","FPfSEprNT6","FjHXRQworu","NOHszdQ586","Cfgr3JIqXi","s4786Yf2Ec","NOHszXyPZN",
+"zbIYYhUTw7","LbRTHU3yw5","iwzGkciuWz","hYBCK5ZaEz","07n1cFjHXR","4W0Tl0PktI","4W0TlRxrsm","StlDJrz7Ut","KASQ8k85Ae","0ao3lBpYhV",
+"vkCHHFVMxo","pWiOsRBhp0","d7vjMv2eC3","DLhzMyofH3","MojnPRpBQm","jiVBPTa8f6","5IhmGv2eC3","5Drn00Wr5y","StlDJxReec","iqv4kiB08l",
+"jeskSHzZT8","fLNg8VerEA","VBjhzvkCHH","zz4ZUpFrrl","suY4x48cHL","jfREus7Mxk","lkMUAJJs5m","07n1cMK07Y","cmXIX9iGoT","l83UdlXFOB",
+"dhSuHi7WMQ","7hyVv9GXkX","lkMUAOz8yZ","HRxd8jiVBP","Mm8siHzZT8","7X3uyEdBKc","hYBCKEoToP","Waim6pFrrl","No0QbThjNn","LDk6f24ARF",
+"9GXkXqUJMd","Waim6zQt6Q","QClRLVNCPd","1v5hHK4GS8","5VZjStvdkD","HRxd87X3uy","hi5X72hEEU","suY4xVprf2","AIYUuWMiS3","fmIK1QWxoT",
+"b29RJQWxoT","uPX7Gsoy9t","VerEAt98iW","WaWsvkB5nP","8TxD7aDGtS","CIShGOHaBz","YOfrYRmDcr","v2eC31j5L8","MmKGJnFqik","4dEz6IBe8k",
+"jeskSWPmlx","vLsmSOUqFM","Ta8f6K20wK","9eoRczY1GY","NcICAlViBv","lViBv16lHc","fcwDaulk41","Cfgr3BbwgA","5VZjSDQimp","K20wKdmoS7",
+"tlILtIKxdL","AmdQdS2Dfu","CIShGx3LDe","VerEAwDajX","No0Qbdjsrv","piJSk7fKYU","7X3uyyofH3","iB08ldhSuH","1LB1LO3iyQ","vkCHHG1RhS",
+"WPmlxoVQp6","5Mg9r0BmCy","IjTwPEOE1o","2TRI7b29RJ","yEfy9Uvlv4","y94nwmX2GE","fqypy55rfB","ciuWzAmdQd","HRxd8MK07Y","fmIK1FPfSE",
+"2NslmpWiOs","jiVBPRsQUq","aez9yVIlwP","uTacxFPfSE","IjTwPhi5X7","Waim6gf8rI","v2eC3tvdkD","CIShGVprf2","2Nslmv8yFN","vkCHHxciqp",
+"Uvlv4okgRi","aez9yX6Pin","JJs5m2Yz7E","uAWypYf2Ec","s7Mxk0ao3l","5Mg9rvkCHH","ZUnqtcQOnv","RsQUq9XyT9","zz4ZUEdBKc","580YDRkQke",
+"Yh1hFuupzk","gjUTuOxWIH","No0QbFcWrW","JKWYRZv7z0","POUYSYOfrY","TwanojzUqR","FLsphEOE1o","kZANmuQIcz","5drc60YAGH","AmdQdl83Ud",
+"TCgPp2Yz7E","hE1QlzQt6Q","lsQGoKsjRK","hi5X7OxWIH","MezSWpT8wu","aDGtSn1pmO","tlILtuAWyp","EOE1oQ6Lix","rz7UtYjB9t","8xEKztl72W",
+"s93MlkB5nP","zY1GYFPfSE","SWfougf8rI","LewvMLDk6f","Nxx9VTa8f6","W3VFHG1RhS","rhl0JHzZT8","lViBvGWqqX","IBe8kK20wK","8RCUAkZANm",
+"fcJOyZhwG1","s7Mxk9eoRc","hUTw7L7cGc","GSQwjPOUYS","O3iyQcL0aE","IjTwP5Mg9r","t59lR24ARF","uvf7AdQ586","zY1GYKsjRK","AIYUu7fsYM",
+"1j5L8jfREu","2Yz7EpWiOs","FPfSETwano","618DiCNHmv","DQimpSjskQ","TXQ0ZhSSvQ","OUYuF3otm6","AOgEeK20wK","LewvMbZLvS","lj07QjeskS",
+"ix74rYf2Ec","s4786FPfSE","I7p2apAhR1","Yf2EcLDk6f","6q6L9ciuWz","KZamHSWfou","Z4I1vQClRL","9rlg9Mkgy8","WaWsvVjCZq","RkQkeuQIcz",
+"lpF6W5Namm","RsQUqJRJQB","QClRLIBe8k","sx5GlWaWsv","iB08ldmoS7","9iGoTWmadA","ReKEWuJScX","i3pydUmaEv","5iGN5XflUq","1j5L8brhlQ",
+"LewvMX6Pin","uupzkjS1aj","2TRI72DREs","vkCHHiwzGk","tjQxsbZLvS","FGzgpRBhp0","tAOsrRzaZA","oVQp6okgRi","hSSvQ07n1c","cL0aEtaOXK",
+"5IhmGMK07Y","jfREudmoS7","In3NS8cVD3","ZuDtDcQOnv","lsQGodpe1v","6AFT0MaJQs","UlU3M0YAGH","Q6hMCl83Ud","lkMUAU3yw5","4W0TloGu6x",
+"Cfgr35VZjS","5Mg9rpmeCd","1LB1LguMb8","IBe8kDG4sT","pFrrlksJby","ZzJHW0h1b1","blLA9suY4x","CK5W7RACuj","gIYvEpv0i7","e6e4zLewvM",
+"suY4xAkKTk","FVMxowDajX","C2IrcJIqXi","TCgPpXyPZN","AXpwES2Dfu","i7WMQFPfSE","rz7Utb29RJ","HP433jzUqR","dpe1vulk41","0ao3lVNCPd",
+"QworuMmsIo","lXFOB7fsYM","fcJOyJ2mQi","gf8rIuoStw","vLsmSuTacx","Ta8f6OUYuF","TCgPp5ZaEz","jzUqRmX2GE","Q6hMCJRJQB","xciqpAXpwE",
+"ni2v1618Di","l83UdRACuj","gdQsSRsQUq","pFrrlLewvM","9eoRcThjNn","55rfBIKxdL","FPfSEyEfy9","aez9ys93Ml","DG4sTiwzGk","Qworudpe1v",
+"ru4UGIn3NS","yEfy97hyVv","M6qcGt59lR","MGlTFWMiS3","Yw2oUazIWp","K4GS8Q6hMC","IRh480h1b1","lm0pDWreyP","IjTwPZv7z0","07n1cxXTI4",
+"e6e4zdhSuH","2TRI78RCUA","guMb80YAGH","atef25Namm","uoStwni2v1","tuDySCNHmv","YjB9ta00b5","QChxsSmGzv","TCgPpblLA9","RpBQmNxx9V",
+"ix74rRsQUq","faHiruZPqg","euZA55Drn0","uQIczdhSuH","5Mg9rZUnqt","lH1ktTwano","ReKEWfcJOy","jeskSW7cTs","Mkgy8lkMUA","CxVEfJ2mQi",
+"GXdoH5Drn0","zmLYDzY1GY","W7cTsjzUqR","W7cTsrhl0J","bZLvS64s8N","hi5X7jeskS","B3qeme6e4z","UmaEvDG4sT","uQIczpT8wu","aFFssdhSuH",
+"FPfSEaFFss","5iGN5ReKEW","dmoS7Oz8yZ","yEfy90h1b1","DG4sT7Ow5C","JRJQBKr8ys","14FLRgdQsS","In3NSPOUYS","fcJOyni2v1","gf8rISbRYy",
+"fcJOyo8Uyd","CNHmvlsQGo","gIYvEjtn0X","hYBCKRmDcr","lkMUAIn3NS","wDajXjiVBP","tAOsruLtKs","POUYSrz7Ut","FNYIMVNCPd","U3yw5RBhp0",
+"uTacxpiJSk","jiVBPbrhlQ","GWqqXRACuj","fmIK1s93Ml","xReecFjHXR","yvOMISs0Zu","yEfy916lHc","lm0pD24ARF","gf8rItvdkD","ix74rQnJ1S",
+"zY1GYuAWyp","hi5X7Qworu","7fsYMt59lR","OUYuFcmXIX","SjskQNAFuw","e6e4zMK07Y","wDajXDcpWB","fqypyBGaQY","qUJMdEoToP","VerEA8RCUA",
+"S2DfuuAWyp","I7p2aF6PT2","CxVEf8TxD7","SmGzv45cIH","tAOsr0ao3l","Dz1R3RkQke","xReecZUnqt","Yw2oU0Wr5y","jeskS2ZHdk","29QAzGSQwj",
+"lm0pDSbRYy","29QAzyofH3","2NslmMaJQs","1LB1LUmaEv","Ul4a1soy9t","UmaEvpvgjS","cShY2uLtKs","C2Ircd7vjM","yvOMIgf8rI","0BmCyC2Irc",
+"uPX7GfcJOy","2Yz7ElsQGo","gdQsSyofH3","LewvMguMb8","EoToPVprf2","e6e4zlViBv","QssNCQChxs","I7p2aUmaEv","POUYSNo0Qb","FjHXRjzUqR",
+"HRxd8MezSW","mz8gxRzaZA","jS1ajs4786","Ul4a1AIYUu","vkCHHqaofN","1v5hHFjHXR","HRxd82Yz7E","LbRTH7fKYU","S2DfuYf2Ec","0YAGHFGzgp",
+"zFgtBFLsph","hE1QlY1mC0","zbIYYF6PT2","GrDg7SmGzv","tuDyShUTw7","jtn0XO3iyQ","uLtKsVBjhz","8FmFHFhtgl","QWxoTAOgEe","ni2v1ogLgc",
+"oQ87r5VZjS","suY4x7fsYM","i7WMQpAhR1","yToGWHfyNQ","CIShGKZamH","0h1b1jS1aj","7fsYMfqypy","Rxrsm0ao3l","uTacxjeskS","SmGzvpT8wu",
+"8RCUAtvdkD","a00b5okgRi","5nmWvECMvU","atef2ni2v1","euZA5pv0i7","M3zXLFVMxo","MmKGJB3qem","lm0pDoGu6x","atef2JRJQB","cShY2WDVWJ",
+"0KyfstjQxs","gf8rIWDVWJ","gIYvEzQt6Q","bgJAzsoy9t","Yw2oU8U2nU","55rfB0Wr5y","hE1QlksJby","5NammCK5W7","UlU3MkB5nP","OxWIHG1RhS",
+"RkQkejS1aj","WaWsvjiVBP","4W0TlNo0Qb","IBe8kNxx9V","JXljWCNHmv","ru4UGlweGy","ogLgcMm8si","DcpWBMojnP","nlaBy4QMc9","MaJQsFPfSE",
+"hE1Qltl72W","CxVEfAkKTk","o8Uyd2TRI7","prNT6P6bcg","RBhp0Ta8f6","7X3uyJRJQB","XflUqSbRYy","xXTI4LewvM","NhXduQ6hMC","lweGyOUYuF",
+"lm0pD0BmCy","0BmCyKr8ys","5Mg9rWmadA","mz8gx8hJdt","0BmCy0YAGH","9GXkX14FLR","VerEA7hyVv","v1HlnAXpwE","lm0pDTCgPp","9GXkXS77LH",
+"MK07Y5ZaEz","VerEAkB5nP","Ss0Zu5Drn0","lsQGofFDrJ","fcJOyuvf7A","6AFT0cShY2","QWxoTRsQUq","FjHXR9GXkX","prNT6AgJHQ","5Mg9rHP433",
+"tvdkDhe9IA","s4786MK07Y","dhSuHiKqhr","iqv4kMkgy8","RkQke0ao3l","55rfBWMiS3","lweGy16lHc","VBjhzfmIK1","Mkgy8bgJAz","bgJAze6e4z",
+"I7p2aKr8ys","n1pmORACuj","FhtglUlU3M","hi5X7euZA5","GrDg7UmaEv","gf8rI2Nslm","uupzks4786","7ku1p0Wr5y","FPfSEydG8U","aFFssCp3mZ",
+"jfREuQ6hMC","uQIcziKqhr","3weIFazIWp","aDGtSW7cTs","VBjhz9GXkX","FPfSEhi5X7","suY4xyvOMI","D6rByfqypy","VLTy6s4786","CK5W7cQOnv",
+"mX2GEi7WMQ","0Kyfs29QAz","618DinlaBy","ZJTXHSmGzv","CNHmvcShY2","RBhp0hUTw7","MK07Yt98iW","RBhp0MezSW","Mkgy8FxX9q","IRh48i7WMQ",
+"0BmCy5ZaEz","xXTI4fmIK1","P6bcghE1Ql","Mkgy8zmLYD","GXdoHQbxXc","7fsYMjzUqR","LewvM29QAz","Ss0Zugf8rI","s7Mxki3pyd","jS1ajEoToP",
+"s93MlgtCA5","i3pydSjskQ","Ul4a1ksJby","RzaZAwiHrZ","m4bxUtaOXK","t59lRb29RJ","x3LDeJkzUn","0PktI7hyVv","JkzUnJKWYR","gdQsSxciqp",
+"VNCPdfFDrJ","he9IAEdBKc","tl72W580YD","okgRikZANm","ECMvUTCgPp","brhlQ16lHc","2TRI7GSQwj","BGaQYJXljW","JJs5mBCxeC","vLsmSuZPqg",
+"uJScXYw2oU","5ZaEz8xEKz","fFDrJqUJMd","bZLvS4dEz6","h1zcHWDVWJ","OUYuFrz7Ut","0KyfsFLsph","XflUqQbxXc","5Mg9rJXljW","VNCPdDLhzM",
+"5VZjSKZamH","ru4UGHP433","gIYvEuN6r3","GWqqXpWiOs","CNHmvuQIcz","tlILttl72W","F6PT2RpBQm","yofH39XyT9","sqVrfVBjhz","Nxx9VvLsmS",
+"CK5W7In3NS","pFrrlYjB9t","dhSuH7Ow5C","QChxsUl4a1","azIWpGXdoH","uN6r3P6bcg","uPX7GWmadA","S2Dfuzz4ZU","rz7Ut2Nslm","4W0TlCfgr3",
+"n1pmO0PktI","YjB9tJKWYR","QYxC05iGN5","8cVD3AgJHQ","zY1GYs7Mxk","8RCUAi3pyd","hi5X7Ss0Zu","9GXkXWreyP","AmdQdD6rBy","oGu6x48cHL",
+"JKWYRgtCA5","7Ow5CNhXdu","CIShGQChxs","G1RhSjSjS3","JJs5m4QMc9","hSSvQjeskS","0ao3lRpBQm","CNHmvC2Irc","ZJTXHzFgtB","fmIK1StlDJ",
+"lweGymz8gx","FPfSEKsjRK","JRJQBQYxC0","Pb1paQClRL","wiHrZVprf2","CxVEfa00b5","iB08l8FmFH","HfyNQ5ZaEz","o8UydlkMUA","rz7UtyofH3",
+"5nmWvQssNC","VLTy6Ss0Zu","prNT6xReec","Yw2oUoVQp6","4QMc9uLtKs","v2eC345cIH","CNHmvzY1GY","VLTy6zqH0W","MojnPmX2GE","jSjS34W0Tl",
+"4W0Tl2Nslm","lweGy8xEKz","RmDcrdQ586","UlU3M5iGN5","Ss0Zu24ARF","7Ow5CZJTXH","Ss0ZuIn3NS","6q6L9cShY2","MezSWyluBx","v2eC3EOE1o",
+"0BmCyBbwgA","5iGN57ku1p","CdyBV9rlg9","3weIFtuDyS","hSSvQ2hEEU","CxVEfpv0i7","MGlTFm4bxU","8xEKzCxVEf","45cIHI7p2a","QClRLlH1kt",
+"MGlTFzz4ZU","MGlTFMojnP","8cVD3aFFss","NhXducQOnv","7ku1pxXTI4","hYBCKFwEJz","FNYIMaL6AJ","JKWYRgdQsS","BCxeCyluBx","NcICApT8wu",
+"CIShGuLtKs","yvOMIpiJSk","ThjNnuPX7G","0BmCy618Di","gjUTuK4GS8","fcJOyEOE1o","No0Qb7Ow5C","yofH3y94nw","nFqik9GXkX","v1HlnY1mC0",
+"8xEKzokgRi","0BmCysoy9t","s7MxkZv7z0","uAWypuAWyp","iKqhrlweGy","CNHmvSWfou","ReKEWMkgy8","Mm8si8RCUA","Mkgy864s8N","lsQGonnP8o",
+"euZA5jzUqR","LbRTHNhXdu","XflUqRpBQm","5Drn0cQOnv","M3zXLJXljW","MmKGJUvlv4","WreyP7fKYU","FnPFBRsQUq","Dz1R36AFT0","D6rBy7X3uy",
+"5Nammt98iW","HP433J2mQi","618DiiwzGk","wDajXguMb8","pT8wugtCA5","cL0aELbRTH","lsQGoDz1R3","O3iyQNhXdu","oQ87rokgRi","v2eC3lXFOB",
+"0Wr5yNhXdu","NAFuw5nmWv","pAhR1aFFss","XyPZNokgRi","UlU3MC2Irc","soy9t1v5hH","5drc6YjB9t","BpYhVfqypy","QbxXciB08l","VBjhzpT8wu",
+"580YDgjUTu","qUJMdWreyP","5Mg9rMezSW","Cfgr3he9IA","FGzgp0Wr5y","NOHszUvlv4","BGaQYoQ87r","Mkgy8HP433","gIYvE8xEKz","W7cTsuZPqg",
+"VLTy6RACuj","Zv7z0hE1Ql","KZamH9iGoT","RkQke48cHL","64s8NlweGy","LbRTH0MR5X","MaJQsZ4I1v","mX2GE2TRI7","cmXIXrz7Ut","16lHc8RCUA",
+"taOXKi7WMQ","pvgjSiqv4k","Cp3mZpWiOs","QbxXcS2Dfu","wDajXFGzgp","Fhtgl8RCUA","Nxx9V5IhmG","lH1ktYf2Ec","1v5hHLDk6f","VIlwPRpBQm",
+"GWqqXmz8gx","HlUbFyluBx","OUYuFYh1hF","5VZjSJKWYR","LewvMjzUqR","14FLR1LB1L","rhl0JAkKTk","0h1b1jtn0X","vOqCERxrsm","GSQwjYOfrY",
+"lkMUAWPmlx","ECMvUW3VFH","s4786HRxd8","WMiS3QWxoT","HfyNQOUYuF","QClRLNxx9V","wiHrZKZamH","QClRLHfyNQ","dQ586lH1kt","qaofNGv3Fq",
+"Yf2EctuDyS","64s8NgdQsS","0Wr5ylweGy","GrDg78TxD7","JIqXin1pmO","gIYvEpAhR1","aDGtSkB5nP","UmaEvlm0pD","fqypyThjNn","Yw2oU5drc6",
+"SjskQBpYhV","Mkgy8nnP8o","gjUTuXflUq","fmIK1RsQUq","Ta8f6hSSvQ","D6rBySs0Zu","WaWsv4W0Tl","jSjS3XflUq","Y1mC0AmdQd","7fKYUUmaEv",
+"ni2v1uvf7A","oVQp6JkzUn","lH1kt8RCUA","5iGN5oQ87r","QbxXcokgRi","Zv7z0MGlTF","BpYhVZ4I1v","ECMvUn8pJ9","3weIFFxX9q","NhXduCdyBV",
+"jSjS3Mkgy8","lpF6WFnPFB","nlaByQssNC","8hJdtBCxeC","7fsYM0YAGH","Nxx9VyEfy9","hi5X7C2Irc","W3VFHfcwDa","OUYuFOUqFM","5ZaEzdpe1v",
+"ZhwG18TxD7","7ku1puupzk","8RCUA9iGoT","UlU3MlkMUA","kB5nPix74r","AgJHQJIqXi","AkKTkFNYIM","MGlTFStlDJ","SWfouOUYuF","Yf2Ecdpe1v",
+"jeskSRpBQm","KsjRKzbIYY","gjUTuF6PT2","lsQGoFjHXR","Yw2oUxXTI4","0YAGHcmXIX","lH1ktQ6hMC","OxWIH0MR5X","dhSuHdQ586","e6e4z4dEz6",
+"6q6L9e6e4z","gf8rIzbIYY","hUTw7CK5W7","dmoS7xciqp","uLtKsbZLvS","Fhtgl16lHc","faHirqQxHP","5Mg9r5IhmG","7lUXZaez9y","iB08lEoToP",
+"DcpWBTwano","jzUqRVNCPd","9eoRc6q6L9","NhXduThjNn","uZPqgAmdQd","t98iW580YD","DQimpMmsIo","M6qcG7fsYM","J2mQiG1RhS","lsQGoD6rBy",
+"IRh48J2mQi","k85AedhSuH","IBe8kyToGW","5IhmGuZPqg","Vprf2cShY2","pAhR1yofH3","VerEApvgjS","NhXduUvlv4","ZzJHW5Drn0","XyPZNni2v1",
+"S2DfuQClRL","ZUnqtBFkb8","BpYhVYh1hF","Yf2EctaOXK","S77LHpmeCd","TCgPpuZPqg","StlDJjzUqR","piJSkwiHrZ","fcwDaa00b5","gIYvEZuDtD",
+"QssNC9eoRc","Nxx9VAgJHQ","HzZT8PYBf4","lj07QRmDcr","zqH0WAkKTk","zHF1q16lHc","xciqpazIWp","0Wr5ycQOnv","pFrrlprNT6","IBe8kjfREu",
+"64s8NS77LH","CNHmvPOUYS","BFkb8FxX9q","gf8rIs4786","rz7UtCfgr3","rKDLJcShY2","WPmlxStlDJ","9eoRcogLgc","Mm8sifqypy","zY1GYlpF6W",
+"RkQke0h1b1","8hJdtdjsrv","2hEEU1LB1L","QworuOHaBz","JIqXiMm8si","y94nwSjskQ","tuDySVIlwP","dQ586dQ586","Ta8f6KsjRK","JIqXisoy9t",
+"ZuDtD55rfB","4QMc9SmGzv","h1zcHcShY2","HP4335nmWv","EOE1oCNHmv","Ta8f6s93Ml","MGlTFzQt6Q","9y4lwiKqhr","7fsYMdmoS7","D6rBysuY4x",
+"KZamH2ZHdk","ThjNncL0aE","lj07QuTacx","oVQp6QbxXc","t59lRlsQGo","9eoRcHzZT8","blLA9uQIcz","5Mg9rMmsIo","AOgEeMojnP","tlILt5VZjS",
+"MmKGJni2v1","48cHL0BmCy","aDGtSVIlwP","hi5X7ECMvU","prNT62Yz7E","lm0pDHlUbF","vLsmS5VZjS","XyPZNKZamH","C2Ircs93Ml","Vprf2Y1mC0",
+"7fsYMm4bxU","QnJ1SK4GS8","FNYIMuQIcz","7ku1pDcpWB","xReeccL0aE","NcICA2Yz7E","EdBKc0YAGH","Ta8f6KASQ8","FPfSEsoy9t","v2eC30Wr5y",
+"Q6hMCpAhR1","VBjhz8xEKz","5Drn0faHir","xReecFhtgl","ogLgclj07Q","xReecVBjhz","Yf2Ec8hJdt","iwzGkpiJSk","lkMUAdjsrv","ZUnqttl72W",
+"Y1mC0xReec","8hJdtprNT6","faHirlViBv","lm0pDLDk6f","uQIczqQxHP","s93Ml8hJdt","oQ87rhYBCK","prNT6tvdkD","nnP8o24ARF","1v5hHgIYvE",
+"VNCPdciuWz","lViBvGXdoH","OUYuFFxX9q","FVMxo7fsYM","FwEJzX6Pin","aez9yfaHir","jtn0Xa00b5","ulk41Qworu","Uvlv41j5L8","FjHXRIKxdL",
+"BbwgAC2Irc","Gv3Fq618Di","2Yz7EMK07Y","tjQxsIKxdL","Waim6BGaQY","48cHLWaWsv","d7vjMPYBf4","Dz1R307n1c","8xEKzYjB9t","PYBf4KASQ8",
+"Kr8ysv8yFN","hi5X7BpYhV","s93Mln8pJ9","CK5W7DG4sT","oGu6xRzaZA","2DREsMezSW","d7vjMOxWIH","GrDg75iGN5","ZhwG1Yh1hF","QClRLY1mC0",
+"ulk41F6PT2","2TRI7BFkb8","AIYUu8TxD7","azIWpjeskS","xXTI4fcJOy","Rxrsm5Mg9r","iB08l580YD","tjQxs1v5hH","Z4I1vMGlTF","ciuWziKqhr",
+"StlDJuoStw","BGaQYGSQwj","KZamHmX2GE","euZA555rfB","0BmCyzQt6Q","SjskQHzZT8","HP433zmLYD","fqypytAOsr","yofH3ksJby","ECMvUKsjRK",
+"QChxsuJScX","d85a9UmaEv","t98iWAXpwE","prNT60PktI","L7cGc1v5hH","3weIFuvf7A","D6rByuLtKs","G1RhSVLTy6","bgJAzMojnP","HP4337X3uy",
+"jfREuSs0Zu","t59lRK4GS8","mX2GESmGzv","qUJMdyEfy9","Kr8yslH1kt","azIWpuoStw","zFgtBFPfSE","AkKTkbrhlQ","pWiOs5IhmG","Y1mC07lUXZ",
+"tvdkDKZamH","zQt6QTwano","hi5X7bZLvS","okgRiWmadA","gtCA5Y1mC0","8TxD7HfyNQ","WreyP0ao3l","Ss0Zu5nmWv","7X3uylweGy","POUYSlpF6W",
+"JKWYRaL6AJ","tvdkDM3zXL","W3VFHyEfy9","h1zcHY1mC0","nFqikTXQ0Z","2hEEUmz8gx","9iGoToGu6x","OUYuFs7Mxk","e6e4zjiVBP","B3qemFFDui",
+"SjskQzFgtB","RpBQmfcwDa","MezSWzQt6Q","IRh480Kyfs","pvgjS8TxD7","Z4I1vv8yFN","KsjRKlkMUA","uvf7AtvdkD","brhlQpiJSk","4W0TlVprf2",
+"lsQGo5ZaEz","MmKGJRpBQm","0YAGHAmdQd","gIYvERmDcr","uN6r3iKqhr","7ku1pP6bcg","zFgtB7ku1p","fqypy8xEKz","atef2FxX9q","0BmCy6q6L9",
+"yofH3MaJQs","J2mQiZJTXH","FxX9qAmdQd","y94nwprNT6","jtn0XFLsph","3weIFTa8f6","bgJAzGSQwj","8U2nUgIYvE","ZUnqt2ZHdk","2hEEU7X3uy",
+"RsQUqOxWIH","2ZHdk4dEz6","bgJAzK4GS8","Uvlv48RCUA","9GXkXdmoS7","0BmCymz8gx","AOgEepiJSk","dpe1vlXFOB","MGlTFuJScX","Oz8yZDz1R3",
+"P6bcgd7vjM","48cHLn1pmO","NAFuwP6bcg","AkKTkblLA9","64s8NCfgr3","lpF6WYw2oU","QworuEOE1o","S77LHtaOXK","FGzgp45cIH","7X3uyZJTXH",
+"wDajXPOUYS","m4bxUgjUTu","QnJ1SFjHXR","zFgtB2Yz7E","OUYuF0BmCy","VLTy6DLhzM","pv0i7ThjNn","UlU3Mrz7Ut","CNHmv48cHL","8U2nUVerEA",
+"8U2nUMaJQs","14FLRMojnP","Ul4a1Q6hMC","Kr8ysgtCA5","djsrvjS1aj","1j5L85VZjS","oGu6xQnJ1S","uAWyphi5X7","BCxeCZzJHW","xXTI4WDVWJ",
+"P6bcgFxX9q","hSSvQpAhR1","JXljWHlUbF","No0QbzFgtB","ix74rQChxs","0Wr5yv8yFN","KZamHFGzgp","pAhR1EdBKc","zz4ZU5Mg9r","zbIYY48cHL",
+"2Yz7EHlUbF","07n1c1v5hH","HlUbFuJScX","VIlwPnFqik","X6Pinn1pmO","d85a9ZhwG1","1v5hHJIqXi","2Yz7Eatef2","9rlg9dhSuH","i7WMQrhl0J",
+"l83UdUvlv4","QbxXcNxx9V","5drc6suY4x","fqypyDz1R3","v8yFNBGaQY","4W0TlnlaBy","QWxoTsqVrf","pT8wuUl4a1","RBhp0YjB9t","1j5L8RACuj",
+"CxVEfSmGzv","rKDLJyluBx","uAWyp4W0Tl","ni2v1ThjNn","ydG8UCxVEf","zY1GY9eoRc","PYBf4uQIcz","FVMxouJScX","kZANmzbIYY","RBhp0VNCPd",
+"B3qem5Drn0","AOgEedmoS7","2ZHdklViBv","lweGyTCgPp","UmaEvNo0Qb","vOqCEgIYvE","BCxeCM3zXL","s4786qQxHP","8FmFHMm8si","CNHmvnFqik",
+"x3LDeMGlTF","Dz1R3JXljW","dpe1vFPfSE","pv0i7zmLYD","FFDuixXTI4","Nxx9VcShY2","lXFOBtvdkD","fFDrJYw2oU","YOfrYoGu6x","SbRYyTwano",
+"hYBCKhe9IA","7ku1pVprf2","POUYSAkKTk","GXdoHwDajX","iwzGkVerEA","0ao3lAkKTk","djsrvFwEJz","pFrrl7hyVv","suY4x9XyT9","soy9t48cHL",
+"1LB1LYh1hF","0PktIRsQUq","QClRLazIWp","EoToPECMvU","0ao3lFwEJz","yluBxaFFss","M3zXLFGzgp","iwzGk8FmFH","Nxx9VlpF6W","4dEz6QClRL",
+"U3yw5M6qcG","ECMvURmDcr","0MR5X5Drn0","soy9tlsQGo","n1pmOQ6hMC","24ARFjS1aj","fqypydhSuH","hE1QlIRh48","FLsphCqqaD","9GXkXjS1aj",
+"yEfy9ciuWz","RmDcr48cHL","ciuWzyvOMI","0BmCyJXljW","n8pJ92Yz7E","PYBf42hEEU","sx5GljzUqR","Dz1R3qaofN","lsQGoRzaZA","DLhzMQ6hMC",
+"AXpwEhE1Ql","Yh1hFe6e4z","AkKTk14FLR","NhXdu2DREs","XyPZN8RCUA","uoStwVerEA","yvOMIZJTXH","CK5W78hJdt","dhSuHChuy3","v2eC3i3pyd",
+"tvdkDlH1kt","uAWypZhwG1","lweGyzz4ZU","DG4sTuvf7A","OUqFMzHF1q","UlU3M5nmWv","I7p2auAWyp","n1pmOYjB9t","lCMxylkMUA","pv0i7QClRL",
+"iwzGkjzUqR","s7MxktuDyS","yToGW9eoRc","0h1b1GSQwj","CNHmvLewvM","M6qcGb29RJ","dpe1vTwano","YOfrYsqVrf","MezSW8TxD7","ciuWzM3zXL",
+"uoStwJXljW","4W0TlpAhR1","n1pmO64s8N","EoToPpv0i7","5NammwDajX","gf8rIfaHir","blLA9zHF1q","7ku1piB08l","pWiOsMm8si","euZA5uZPqg",
+"45cIH2ZHdk","BFkb8EOE1o","xXTI4IRh48","sqVrfQ6Lix","M6qcGOUYuF","2Yz7EX6Pin","h1zcHpv0i7","vOqCENo0Qb","oQ87raez9y","kB5nP0h1b1",
+"ZzJHWTwano","DLhzMRpBQm","kB5nPnFqik","kZANmQssNC","9GXkXTwano","iwzGkcShY2","aL6AJP6bcg","GWqqXDLhzM","t98iWOUYuF","0KyfsL7cGc",
+"lsQGozQt6Q","DLhzMtlILt","t98iW8U2nU","Mkgy8YOfrY","B3qemYjB9t","9eoRccmXIX","vOqCEo8Uyd","kB5nP6AFT0","xReecs7Mxk","lm0pDzqH0W",
+"9GXkXQnJ1S","QWxoTBGaQY","ZzJHWzbIYY","oQ87rjiVBP","wiHrZqUJMd","NOHszFGzgp","MGlTFtvdkD","X6PinM6qcG","l83UdBFkb8","uZPqgZUnqt",
+"KASQ8v1Hln","b29RJ0h1b1","DQimpCdyBV","zqH0W5ZaEz","gtCA5gIYvE","lm0pDpiJSk","AkKTkAOgEe","GXdoH0h1b1","CqqaDAmdQd","ciuWzjSjS3",
+"J2mQiYh1hF","y94nwO3iyQ","5VZjSZ4I1v","zqH0WtuDyS","7Ow5CWaWsv","t98iWjtn0X","FhtglYw2oU","8FmFH0MR5X","hYBCKs7Mxk","KsjRKKr8ys",
+"hUTw70YAGH","8cVD3Mkgy8","aez9y4QMc9","pT8wuThjNn","d7vjMuvf7A","hi5X7aL6AJ","aDGtSSWfou","pT8wuNhXdu","Nxx9V16lHc","uvf7A5ZaEz",
+"45cIHkZANm","LewvMyEfy9","zbIYYSjskQ","ix74rFnPFB","e6e4z07n1c","jtn0XC2Irc","2DREsZJTXH","gdQsSWaWsv","UlU3My94nw","aez9yQnJ1S",
+"iKqhrxXTI4","M6qcGOz8yZ","n1pmOLDk6f","29QAz8hJdt","zmLYDFGzgp","i3pydnlaBy","JkzUnuvf7A","Q6LixVerEA","KASQ8BpYhV","FNYIMXyPZN",
+"ZJTXHZuDtD","BCxeCAkKTk","PYBf4rKDLJ","Uvlv4J2mQi","FnPFBmz8gx","dpe1vFxX9q","Vprf2jfREu","zHF1qNOHsz","gjUTuUlU3M","uN6r3Ta8f6",
+"rz7UtStlDJ","ulk41jS1aj","ix74rPYBf4","S77LHoVQp6","zbIYYEdBKc","uZPqgCIShG","y94nwn1pmO","lkMUAX6Pin","F6PT28RCUA","lweGyP6bcg",
+"DG4sTAIYUu","i3pydFPfSE","lpF6WMojnP","fqypyHlUbF","CdyBVDz1R3","NhXdus93Ml","zY1GY1j5L8","jiVBPLewvM","l83UddmoS7","Vprf2Vprf2",
+"8TxD7Gv3Fq","IRh48JXljW","yofH3mX2GE","FxX9qYf2Ec","0BmCyuAWyp","7fKYUY1mC0","45cIHoGu6x","t59lR07n1c","AgJHQFLsph","KASQ81v5hH",
+"JIqXi7fsYM","hE1QlMojnP","kB5nPRpBQm","xciqpfcJOy","2ZHdkiKqhr","Y1mC0lXFOB","ZhwG1suY4x","U3yw5tuDyS","qUJMddQ586","HP4332Yz7E",
+"gf8rIM6qcG","RmDcrCdyBV","b29RJtl72W","l83UdvLsmS","EdBKche9IA","FcWrWydG8U","C2IrcZhwG1","Cfgr3cShY2","K20wKEoToP","ZzJHWS77LH",
+"tuDySkB5nP","i3pydFhtgl","Q6hMCQnJ1S","BGaQYIKxdL","uAWypt98iW","t59lRx3LDe","HlUbF0ao3l","k85AeaDGtS","RpBQm14FLR","Qworus7Mxk",
+"he9IAsx5Gl","IKxdLWDVWJ","yToGWtuDyS","lm0pDCNHmv","AXpwE8U2nU","dmoS7QClRL","v2eC3O3iyQ","Ul4a1C2Irc","v8yFNjS1aj","x3LDe580YD",
+"uQIczAgJHQ","7ku1pYOfrY","tlILt7Ow5C","gjUTuo8Uyd","vLsmSuPX7G","uTacxv8yFN","WaWsvtjQxs","TCgPpsuY4x","VBjhzfqypy","29QAzUl4a1",
+"mz8gxuAWyp","yofH364s8N","2ZHdk0PktI","5NammQnJ1S","FwEJzuJScX","pvgjScL0aE","6q6L9IRh48","n1pmOkZANm","CdyBVuPX7G","MezSW3weIF",
+"pv0i7Yh1hF","zY1GYqUJMd","0h1b1oVQp6","pv0i7bZLvS","In3NSru4UG","Yh1hFMaJQs","5Drn0SbRYy","MaJQshe9IA","OUYuFtvdkD","QClRLKr8ys",
+"F6PT2NOHsz","O3iyQUvlv4","Cp3mZQ6hMC","CdyBV64s8N","cShY2zQt6Q","nnP8o7lUXZ","gf8rId7vjM","5VZjSjzUqR","M3zXLO3iyQ","yvOMIjfREu",
+"ZUnqtiB08l","Oz8yZsqVrf","KsjRKlsQGo","nlaByjeskS","jzUqR9GXkX","P6bcgVIlwP","2Nslmaez9y","Gv3FqWmadA","t59lR0BmCy","fqypyAXpwE",
+"n8pJ94QMc9","XyPZNAXpwE","Cp3mZ3weIF","ZzJHWAOgEe","GSQwjpvgjS","l83UdfFDrJ","ZhwG1FxX9q","taOXKO3iyQ","yEfy9azIWp","pv0i7lViBv",
+"24ARFsqVrf","FnPFB24ARF","zFgtByToGW","9eoRcAkKTk","v1Hlnrhl0J","OHaBzStlDJ","sx5Gl6AFT0","rhl0JZJTXH","AIYUugtCA5","GXdoHaL6AJ",
+"uvf7A07n1c","jeskS5drc6","LewvMuTacx","EOE1oWPmlx","sqVrfVjCZq","EdBKcDG4sT","Oz8yZAXpwE","VLTy6GrDg7","mX2GE4dEz6","LbRTHHzZT8",
+"8U2nUPYBf4","P6bcgjfREu","m4bxUzQt6Q","iwzGkVBjhz","StlDJRkQke","GXdoHpWiOs","brhlQtlILt","xciqpM6qcG","rKDLJMojnP","No0Qbn8pJ9",
+"mz8gxTXQ0Z","5nmWvEOE1o","hYBCKMaJQs","4dEz63weIF","J2mQiyluBx","sqVrfDQimp","t59lRni2v1","L7cGc7X3uy","9y4lwDG4sT","pFrrlCIShG",
+"0YAGHfcJOy","P6bcgQbxXc","S2DfukB5nP","brhlQuTacx","8xEKz4QMc9","lm0pDCIShG","vLsmSbgJAz","n8pJ9jtn0X","AkKTks4786","QnJ1Spv0i7",
+"hE1Qls7Mxk","gf8rI16lHc","zmLYD0Kyfs","JkzUn5nmWv","yToGWciuWz","bgJAzuvf7A","oGu6xrz7Ut","v1HlnuAWyp","ydG8U9y4lw","blLA91j5L8",
+"zQt6Q2Nslm","Dz1R3ThjNn","7fsYMpT8wu","IjTwPjS1aj","iwzGkhUTw7","uAWypVBjhz","FhtgllCMxy","8RCUA4W0Tl","ReKEWvOqCE","BCxeCVerEA",
+"Q6Lixn1pmO","8hJdt9y4lw","oVQp60Wr5y","sx5Gl7fKYU","soy9tBGaQY","gIYvE6AFT0","faHirhi5X7","EOE1obrhlQ","hE1Ql6AFT0","gf8rIuZPqg",
+"vOqCEQWxoT","Z4I1vvLsmS","nnP8oBGaQY","POUYS9y4lw","FNYIM6AFT0","ZzJHWWreyP","0BmCyIjTwP","PYBf4fFDrJ","hE1Ql4W0Tl","StlDJWaWsv",
+"K20wKPOUYS","oQ87rpiJSk","nlaByMkgy8","RzaZA0BmCy","gf8rIStlDJ","8U2nUpmeCd","uN6r3zFgtB","6q6L9dmoS7","WmadAy94nw","HRxd8ru4UG",
+"xXTI45VZjS","iKqhrKZamH","uPX7Gsx5Gl","uN6r3qQxHP","GWqqXciuWz","guMb8HfyNQ","2TRI7yofH3","nFqikMmsIo","VerEAaFFss","cQOnvlkMUA",
+"yluBxCdyBV","mX2GEqaofN","RACujGv3Fq","h1zcHvkCHH","zqH0WsqVrf","okgRiY1mC0","Cp3mZRxrsm","XflUqGWqqX","lH1ktn1pmO","kZANm07n1c",
+"8xEKziB08l","TCgPpFnPFB","RBhp0uN6r3","tAOsruvf7A","n8pJ9RkQke","QnJ1SpiJSk","AgJHQMm8si","guMb8cL0aE","TCgPp0Kyfs","Y1mC0qUJMd",
+"cQOnvFwEJz","s7Mxks7Mxk","s93MlPOUYS","618DiRxrsm","HfyNQSbRYy","k85AeoQ87r","RACujuoStw","v1HlnzFgtB","y94nwCfgr3","K4GS8JXljW",
+"DcpWBW3VFH","fqypyGrDg7","RxrsmjeskS","8xEKzk85Ae","pv0i72DREs","VjCZqEoToP","RzaZAWmadA","StlDJAmdQd","dmoS7v8yFN","iB08luTacx",
+"ReKEWhe9IA","Cfgr3Cfgr3","ReKEWM6qcG","5VZjSv1Hln","yEfy929QAz","qQxHPRsQUq","Oz8yZv8yFN","Nxx9VDcpWB","ZJTXHFjHXR","uTacxQChxs",
+"n8pJ9NOHsz","uvf7ADQimp","0ao3lWmadA","djsrvFhtgl","lCMxykZANm","XflUq5nmWv","W7cTs6AFT0","n8pJ9CqqaD","VLTy6o8Uyd","NhXduQnJ1S",
+"0h1b1IjTwP","FwEJzIRh48","zHF1qiKqhr","jeskSK4GS8","9eoRckB5nP","AXpwE1j5L8","dpe1vCdyBV","0h1b1JJs5m","jfREuIKxdL","48cHLVLTy6",
+"yofH3ciuWz","lH1ktBGaQY","Kr8ysJJs5m","W3VFHCfgr3","i3pydrhl0J","MmKGJlj07Q","Nxx9VWaWsv","hSSvQvLsmS","9eoRc9XyT9","VLTy6No0Qb",
+"Pb1pan1pmO","uQIczOUYuF","tlILtuZPqg","lpF6WMm8si","pv0i78U2nU","jfREuiB08l","soy9tguMb8","piJSkRsQUq","yofH3rz7Ut","FnPFB0h1b1",
+"pFrrlrhl0J","xReecKsjRK","WDVWJgjUTu","zQt6QOxWIH","5VZjSXyPZN","DG4sTlCMxy","VBjhzpiJSk","aez9yGXdoH","uZPqgni2v1","QssNClm0pD",
+"dmoS7WreyP","8FmFHqQxHP","FGzgpuoStw","2Yz7EMGlTF","jS1ajjeskS","CqqaDtvdkD","FnPFBF6PT2","MK07YFcWrW","8U2nU9XyT9","pFrrlIBe8k",
+"QYxC0HfyNQ","FxX9qoQ87r","HP433tAOsr","s7Mxk7Ow5C","Cp3mZt59lR","MK07Ylj07Q","x3LDedjsrv","pv0i7W7cTs","MK07YRBhp0","hSSvQKASQ8",
+"B3qemAXpwE","QssNCQ6hMC","9GXkXv8yFN","VjCZqStlDJ","9iGoTAkKTk","OxWIH7X3uy","wDajX0BmCy","2ZHdkNhXdu","6AFT08hJdt","aFFsscL0aE",
+"jtn0Xt59lR","s4786PYBf4","FxX9qECMvU","uQIcz8FmFH","fLNg8v2eC3","cShY25VZjS","ru4UGprNT6","8U2nUSmGzv","GWqqXsuY4x","7fsYMyEfy9",
+"cmXIXTCgPp","aDGtSjzUqR","NcICAReKEW","AXpwESjskQ","qQxHPkB5nP","ThjNnFGzgp","iB08lQbxXc","sqVrfZzJHW","KZamHMGlTF","K4GS8ydG8U",
+"bZLvSNAFuw","cmXIXpv0i7","zbIYYgf8rI","Yh1hFi3pyd","FNYIMnlaBy","yluBx8RCUA","8cVD3uoStw","ZhwG1Yw2oU","FFDuii7WMQ","faHirFLsph",
+"euZA5lsQGo","WaWsvzqH0W","Yw2oU1j5L8","fLNg8cQOnv","gIYvEix74r","U3yw5MmsIo","HRxd8WPmlx","J2mQiuAWyp","YjB9tulk41","RmDcrwiHrZ",
+"NAFuwQ6hMC","hUTw7M6qcG","FVMxot98iW","lXFOBJkzUn","5drc6fmIK1","tl72WWaim6","pmeCdlkMUA","9GXkXdjsrv","soy9ti3pyd","DcpWB48cHL",
+"ZUnqtRsQUq","gtCA5lweGy","8cVD3Uvlv4","GXdoHHfyNQ","GWqqXMm8si","VerEAUmaEv","CdyBVOz8yZ","Cp3mZAOgEe","fmIK1t98iW","Q6hMCFVMxo",
+"7hyVv7Ow5C","K4GS86q6L9","dhSuHDz1R3","QnJ1SzHF1q","aez9yVerEA","0ao3l6AFT0","WaWsvQWxoT","O3iyQt59lR","LbRTH2DREs","FnPFBjeskS",
+"uQIcza00b5","NAFuwCfgr3","UmaEvMezSW","W3VFHVIlwP","580YDBGaQY","tuDyS5iGN5","OxWIHX6Pin","aFFssS77LH","jzUqRMezSW","uJScXQYxC0",
+"QnJ1SO3iyQ","HRxd8fFDrJ","uAWypAXpwE","Waim6LDk6f","ydG8UvLsmS","PYBf4XyPZN","aFFss2Nslm","n8pJ9nlaBy","sqVrfjSjS3","5Mg9r14FLR",
+"ZUnqtk85Ae","Y1mC0VNCPd","ReKEWlsQGo","S77LHQChxs","RkQkeGrDg7","piJSkOUqFM","O3iyQQ6Lix","KZamHL7cGc","CdyBVh1zcH","zbIYY4QMc9",
+"D6rByogLgc","SmGzv9XyT9","IjTwPHzZT8","SWfouyofH3","5nmWvOz8yZ","fFDrJDG4sT","jeskSv1Hln","QbxXcMK07Y","jS1ajZv7z0","CqqaD3weIF",
+"sqVrf3otm6","4QMc9B3qem","9XyT9Nxx9V","FcWrWb29RJ","lXFOBSs0Zu","zmLYDWmadA","AIYUuuJScX","MGlTFF6PT2","iKqhrBCxeC","8TxD7nlaBy",
+"prNT6TCgPp","pAhR1hi5X7","XyPZNJXljW","DcpWBBGaQY","618DidmoS7","t98iWuTacx","VLTy6xciqp","xXTI4piJSk","nnP8os93Ml","qQxHPIKxdL",
+"Oz8yZfLNg8","i7WMQgdQsS","zQt6QpWiOs","ni2v1h1zcH","DcpWB45cIH","azIWpfcwDa","iKqhruQIcz","Cp3mZGSQwj","uTacxNcICA","vLsmSTwano",
+"v2eC3azIWp","OxWIHQbxXc","ZUnqtSbRYy","zFgtBjzUqR","BbwgA9GXkX","jzUqRZ4I1v","HzZT8AgJHQ","MmKGJK20wK","7fsYMQYxC0","cmXIXXyPZN",
+"yEfy9fcJOy","uTacxd7vjM","IRh487ku1p","8FmFHtl72W","AOgEe5VZjS","faHir0ao3l","Kr8ysuTacx","nFqiklViBv","vLsmSqaofN","SjskQ7fKYU",
+"9y4lwvOqCE","CdyBV0PktI","MmsIoogLgc","LewvMlXFOB","bgJAzSbRYy","ThjNn5iGN5","WDVWJtvdkD","No0Qbjtn0X","1v5hH3weIF","lweGyazIWp",
+"AgJHQbZLvS","zqH0WJRJQB","VNCPdS77LH","45cIHpvgjS","5iGN5uTacx","ni2v1X6Pin","Mkgy8FLsph","SjskQAIYUu","7X3uy6q6L9","kB5nPCxVEf",
+"BpYhVuvf7A","7ku1pQYxC0","iwzGkrKDLJ","v8yFNoQ87r","Cfgr3yofH3","NOHszSbRYy","wiHrZRBhp0","5nmWvZv7z0","xXTI4uLtKs","NcICAdpe1v",
+"uAWypRACuj","HlUbF0BmCy","k85AeQClRL","L7cGcdjsrv","Cp3mZxReec","AOgEejiVBP","xXTI4tl72W","bZLvSy94nw","QworutuDyS","fmIK1bgJAz",
+"IjTwPJRJQB","uPX7GIn3NS","Ss0Zu9GXkX","TCgPpkZANm","t59lRDz1R3","brhlQgdQsS","HzZT8ReKEW","xciqpbgJAz","faHirgdQsS","ECMvUblLA9",
+"MaJQsTwano","rz7Uth1zcH","Ta8f6HP433","55rfBKsjRK","Z4I1vfFDrJ","DG4sTvkCHH","e6e4zOz8yZ","vkCHH3weIF","FLsphyluBx","lCMxyCNHmv",
+"7X3uygjUTu","WmadAazIWp","uLtKsHRxd8","RBhp0JIqXi","mX2GEgtCA5","a00b5taOXK","K20wKKASQ8","AgJHQd85a9","gtCA5Vprf2","HP433JkzUn",
+"ciuWzS77LH","M6qcGVjCZq","2TRI7Q6Lix","FFDuiNAFuw","mz8gxpT8wu","48cHL14FLR","jeskS64s8N","sqVrfkB5nP","OUqFMMojnP","kB5nPO3iyQ",
+"OHaBzReKEW","BbwgAEOE1o","he9IAqUJMd","8U2nURpBQm","WMiS3HlUbF","i3pydQworu","9GXkXRACuj","BbwgASs0Zu","fcJOyl83Ud","VNCPdk85Ae",
+"C2IrcjzUqR","azIWpEOE1o","uupzkI7p2a","WmadAMmsIo","djsrvLbRTH","XflUqfqypy","prNT6tAOsr","iwzGkrz7Ut","KZamHQ6Lix","W7cTsP6bcg",
+"t59lRblLA9","dpe1vkZANm","QssNCvkCHH","POUYSiqv4k","euZA5MezSW","2hEEU1v5hH","ZzJHWMK07Y","azIWpuJScX","W7cTsHP433","uAWypGWqqX",
+"CIShGfLNg8","KZamHPb1pa","0Wr5ySmGzv","Kr8ysSs0Zu","JJs5m1j5L8","uZPqg8FmFH","ZzJHWpWiOs","VBjhzU3yw5","yEfy9D6rBy","CqqaDSs0Zu",
+"8FmFHs7Mxk","mz8gx8xEKz","kB5nPM6qcG","zFgtBdjsrv","9XyT9ECMvU","GrDg7QnJ1S","nnP8oK4GS8","FLsphpvgjS","brhlQdhSuH","rz7UtuJScX",
+"Mm8sis4786","PYBf49rlg9","MaJQsGv3Fq","lweGyDz1R3","Kr8ysRBhp0","OUqFMFhtgl","ReKEWHfyNQ","oGu6xTwano","xReecn8pJ9","uupzkP6bcg",
+"5ZaEz8FmFH","tl72WuAWyp","7X3uyuTacx","M3zXLRACuj","fmIK1uAWyp","QworuECMvU","rhl0JFPfSE","ix74ruTacx","v1HlnuPX7G","QYxC00YAGH",
+"fcwDauPX7G","IjTwPFwEJz","rz7UtgjUTu","lpF6WgjUTu","C2IrcqQxHP","MezSWWaWsv","U3yw59y4lw","zY1GYfLNg8","BbwgAaez9y","7ku1pguMb8",
+"lpF6WtaOXK","AgJHQbgJAz","Mm8sioGu6x","nlaByRBhp0","S77LHNhXdu","QnJ1SHzZT8","2ZHdkBbwgA","AgJHQ8FmFH","0PktIy94nw","lweGyOz8yZ",
+"e6e4zJkzUn","AXpwELewvM","gf8rIqQxHP","suY4xksJby","lm0pDpv0i7","zQt6QRpBQm","WmadANAFuw","BpYhVQ6hMC","Zv7z0QChxs","lweGyhE1Ql",
+"TXQ0ZnlaBy","JIqXid7vjM","VjCZqaL6AJ","FVMxodjsrv","Ss0ZutvdkD","TCgPp2DREs","Ul4a1kZANm","uQIczZzJHW","7X3uyM6qcG","t59lRjzUqR",
+"mX2GEfLNg8","Chuy3d7vjM","azIWpv1Hln","lj07QW3VFH","v1Hlnb29RJ","CxVEf5iGN5","IRh48XflUq","RpBQmtAOsr","1v5hHNcICA","7ku1pHP433",
+"FwEJzpvgjS","XyPZNIBe8k","O3iyQQssNC","jS1ajRsQUq","OHaBzd7vjM","VNCPd7X3uy","NcICApFrrl","qUJMdIn3NS","2Yz7EQnJ1S","TCgPpFGzgp",
+"rhl0J14FLR","0ao3lJIqXi","FNYIMlkMUA","M6qcGiB08l","RsQUqIRh48","QworuoQ87r","s93Ml0BmCy","CdyBVWreyP","wDajXFxX9q","HlUbFrKDLJ",
+"EOE1oHRxd8","gIYvEEOE1o","lj07QEOE1o","nlaByFhtgl","pv0i7jzUqR","prNT6Fhtgl","uupzkK20wK","VerEAtlILt","taOXK618Di","QWxoT0MR5X",
+"6AFT0AIYUu","0YAGHGrDg7","zQt6Q14FLR","KASQ8Q6Lix","wiHrZIBe8k","rhl0Jv8yFN","AkKTk7lUXZ","lH1ktIRh48","cShY2pWiOs","jzUqRulk41",
+"ZUnqt8FmFH","WmadA45cIH","48cHLZv7z0","faHirZuDtD","uAWypSjskQ","HRxd8NhXdu","oQ87r0Wr5y","kB5nPAkKTk","qaofNlViBv","pFrrlCNHmv",
+"RACujjS1aj","GrDg7QChxs","5nmWvlH1kt","nFqikeuZA5","Uvlv4ru4UG","uTacxDG4sT","jtn0X4W0Tl","RpBQmvkCHH","BFkb8GXdoH","7lUXZSjskQ",
+"d85a9JRJQB","JkzUnuN6r3","5VZjSTa8f6","RmDcr5ZaEz","wDajXBGaQY","9eoRcRzaZA","Cfgr3lj07Q","0Wr5yk85Ae","1LB1LZzJHW","rhl0JChuy3",
+"HP433O3iyQ","TCgPpW7cTs","HzZT8TCgPp","NhXdukZANm","DcpWBfcJOy","SbRYyC2Irc","taOXKKr8ys","cmXIXiqv4k","QChxsQworu","DG4sTOUqFM",
+"soy9tyToGW","8hJdtMK07Y","Kr8ysS2Dfu","lXFOBpWiOs","CqqaDUvlv4","y94nwo8Uyd","M6qcG1j5L8","RkQkei7WMQ","hSSvQCxVEf","Chuy3uZPqg",
+"1v5hH24ARF","lpF6WEoToP","gdQsSB3qem","lweGyDcpWB","xXTI429QAz","5IhmGG1RhS","M6qcGIRh48","WDVWJGWqqX","qQxHPGWqqX","JJs5mPOUYS",
+"k85Aeulk41","lH1ktP6bcg","cQOnvSs0Zu","U3yw5FnPFB","RzaZAhUTw7","uZPqgLDk6f","O3iyQe6e4z","JJs5m7X3uy","jeskS0Wr5y","gjUTu7fsYM",
+"nlaBy8hJdt","ydG8UGrDg7","Cfgr3v2eC3","wiHrZMm8si","07n1cBFkb8","he9IAIBe8k","Zv7z0I7p2a","kB5nPatef2","7ku1pzmLYD","2DREsFLsph",
+"AIYUum4bxU","yluBx7fKYU","e6e4zVLTy6","2TRI7s93Ml","8RCUApT8wu","NcICAsx5Gl","BpYhVd7vjM","wiHrZk85Ae","0h1b1euZA5","jiVBPIRh48",
+"VerEADLhzM","NcICAJRJQB","0h1b1WmadA","azIWppT8wu","ksJbypT8wu","pvgjS0PktI","TCgPp8cVD3","RpBQmJRJQB","ix74rFxX9q","bgJAzxReec",
+"yEfy92Yz7E","Q6Lix9y4lw","FNYIMd85a9","SbRYy580YD","QbxXcdQ586","48cHLVBjhz","0MR5XEOE1o","I7p2aBFkb8","uvf7ApiJSk","jtn0XFNYIM",
+"prNT6ru4UG","nFqikZJTXH","24ARFUmaEv","45cIHjSjS3","6q6L9s93Ml","WaWsvX6Pin","gjUTusuY4x","QssNCZuDtD","ogLgcrKDLJ","VLTy6Yw2oU",
+"G1RhSwiHrZ","ZJTXHxciqp","pv0i74QMc9","v8yFNjzUqR","uN6r314FLR","6AFT0ciuWz","ydG8UTCgPp","4W0TlcQOnv","pT8wui7WMQ","14FLR9y4lw",
+"2NslmJRJQB","lXFOBDcpWB","zFgtBRmDcr","sqVrflsQGo","cShY2Gv3Fq","AOgEeMm8si","MojnPuJScX","P6bcgprNT6","ThjNnX6Pin","5NammGSQwj",
+"DQimpBGaQY","a00b5J2mQi","ReKEWdjsrv","5ZaEz2TRI7","fcJOyW7cTs","KsjRK55rfB","d7vjMcL0aE","FPfSEAIYUu","VIlwPh1zcH","Cp3mZcQOnv",
+"qQxHPVBjhz","RzaZA5Drn0","ni2v1SbRYy","Y1mC08xEKz","U3yw5xReec","Pb1pa0ao3l","LDk6fxXTI4","Cp3mZFcWrW","pFrrlv1Hln","qQxHPIBe8k",
+"AXpwEMezSW","cL0aEuPX7G","FVMxoAOgEe","zqH0Whe9IA","24ARFMm8si","IKxdLIRh48","M3zXLYf2Ec","dpe1vpv0i7","d85a9bgJAz","In3NSBGaQY",
+"RmDcruAWyp","qQxHPFxX9q","tjQxsCIShG","4QMc914FLR","1v5hH5IhmG","zqH0WReKEW","ogLgcVjCZq","Mm8siOUYuF","s93MlCNHmv","v8yFNGWqqX",
+"L7cGc7Ow5C","AXpwEs93Ml","gtCA5FGzgp","uTacxRBhp0","gdQsSOxWIH","TCgPpC2Irc","brhlQQ6hMC","xXTI4FxX9q","lXFOBrz7Ut","nFqikHRxd8",
+"Pb1pavOqCE","cmXIXuN6r3","hUTw7BCxeC","BCxeC2Yz7E","cQOnvZJTXH","XflUqCqqaD","W7cTsEdBKc","KsjRKokgRi","faHirGWqqX","OUYuF29QAz",
+"HP4332ZHdk","Gv3Fq7fKYU","Ta8f6atef2","2Yz7EAkKTk","fLNg8aL6AJ","FcWrWMK07Y","4dEz6uupzk","i7WMQWaWsv","WPmlx9iGoT","14FLR2hEEU",
+"MezSWhE1Ql","ydG8UXyPZN","KASQ8CK5W7","45cIHlCMxy","taOXKaFFss","FjHXRBGaQY","o8UydQnJ1S","HfyNQuupzk","lj07QksJby","ReKEWGXdoH",
+"vOqCErhl0J","5VZjSBbwgA","t59lRuQIcz","oVQp6HfyNQ","xReecdjsrv","5IhmG48cHL","uTacxWDVWJ","jtn0XjiVBP","2hEEUaez9y","NOHszyluBx",
+"RxrsmCfgr3","aez9yoQ87r","lViBvsuY4x","Cp3mZ07n1c","aL6AJy94nw","UlU3MFcWrW","i7WMQRsQUq","UlU3Mni2v1","BFkb80Wr5y","XyPZNd85a9",
+"AkKTksuY4x","NOHszdhSuH","tjQxseuZA5","NOHszNOHsz","Z4I1vOxWIH","lH1kt9XyT9","Chuy35Mg9r","POUYSCIShG","uJScXM3zXL","CK5W7gIYvE",
+"BGaQYzQt6Q","jeskScShY2","BGaQYiB08l","uN6r3lweGy","SbRYyBCxeC","4dEz60ao3l","NOHszMK07Y","uTacxZUnqt","S77LHY1mC0","0Kyfs7fKYU",
+"QClRLNAFuw","1j5L8bgJAz","7lUXZpWiOs","RsQUqDLhzM","sx5Glm4bxU","RACujQ6Lix","cQOnvjeskS","B3qemogLgc","Vprf2zqH0W","o8UydoQ87r",
+"5drc6FGzgp","gf8rIP6bcg","iwzGkQbxXc","0ao3lVerEA","DQimpguMb8","piJSkOHaBz","iKqhrbrhlQ","NcICApAhR1","IBe8kFwEJz","MmsIohE1Ql",
+"X6PinuLtKs","tjQxsAXpwE","dhSuHJKWYR","s7MxkFwEJz","h1zcHMGlTF","FnPFBThjNn","MGlTFNAFuw","MezSWgjUTu","2DREsSWfou","dhSuHgIYvE",
+"5ZaEzuupzk","VjCZq6AFT0","HzZT8ZhwG1","EOE1o8xEKz","prNT6a00b5","ReKEWlkMUA","cQOnvy94nw","Yh1hFgf8rI","L7cGc5nmWv","7ku1pkB5nP",
+"FxX9q6q6L9","ZUnqtZJTXH","HzZT8lkMUA","Uvlv4lViBv","i7WMQJ2mQi","HzZT8yToGW","G1RhSvkCHH","Ul4a19rlg9","I7p2aQClRL","mX2GEMmKGJ",
+"LbRTHStlDJ","y94nwAOgEe","GrDg7Mm8si","xXTI4vOqCE","5Drn0Gv3Fq","lj07QuAWyp","8cVD3gIYvE","l83UdP6bcg","6AFT0gtCA5","Oz8yZjS1aj",
+"jSjS31LB1L","lkMUA9eoRc","n1pmOt98iW","LbRTHKr8ys","KASQ8nFqik","jSjS3VLTy6","OUYuFxXTI4","MmKGJtjQxs","OUYuFwDajX","NAFuwyvOMI",
+"s7Mxk1LB1L","ix74r5nmWv","3weIFgIYvE","6q6L9m4bxU","oQ87rVIlwP","tlILtNxx9V","OHaBziwzGk","a00b5ReKEW","HzZT8Cp3mZ","FxX9qazIWp",
+"Mm8siKASQ8","fFDrJS2Dfu","FnPFB2hEEU","YjB9t8FmFH","SmGzvHlUbF","d85a9QChxs","cL0aEIKxdL","5IhmGWmadA","kB5nPJXljW","aL6AJY1mC0",
+"HRxd8cQOnv","tl72WfFDrJ","Pb1paguMb8","tvdkDuN6r3","QClRLuLtKs","PYBf4StlDJ","lCMxyNOHsz","AmdQdoQ87r","16lHcn8pJ9","6AFT0ru4UG",
+"tvdkDyEfy9","zY1GY7hyVv","LbRTHd7vjM","gjUTuWreyP","AOgEeW3VFH","aez9yzqH0W","TwanobrhlQ","Mm8siNcICA","0BmCyTwano","ix74r0ao3l",
+"mz8gxM6qcG","t59lR5ZaEz","5nmWvogLgc","HP433CqqaD","qaofN2ZHdk","ThjNnMmsIo","VIlwP4QMc9","zHF1qLDk6f","QssNCIn3NS","vkCHH2DREs",
+"Fhtgl5Drn0","WaWsvhE1Ql","azIWpAgJHQ","Z4I1v6AFT0","ZUnqtAXpwE","v8yFNLewvM","zmLYDkB5nP","uPX7GPYBf4","EoToPHfyNQ","hYBCKMmsIo",
+"jS1ajReKEW","K20wKAkKTk","VBjhzNhXdu","tvdkDaDGtS","ZhwG1AOgEe","9eoRcbrhlQ","ZUnqt9iGoT","Uvlv4FjHXR","mX2GEazIWp","Z4I1vqaofN",
+"TCgPpoGu6x","zHF1q0PktI","a00b5rKDLJ","vkCHH0Kyfs","7ku1pulk41","NOHsz9GXkX","uJScXUmaEv","SbRYyAXpwE","1j5L8cShY2","lweGyru4UG",
+"PYBf4s93Ml","JRJQBgIYvE","F6PT2PYBf4","Mkgy8fFDrJ","guMb8JKWYR","hYBCKs93Ml","aez9yL7cGc","45cIHlViBv","ciuWzQworu","pvgjSOz8yZ",
+"HlUbFGv3Fq","VLTy6ZzJHW","qQxHPjfREu","7lUXZStlDJ","hE1Ql7lUXZ","AOgEeRACuj","B3qem0Wr5y","AOgEefcwDa","6AFT02DREs","o8UydoGu6x",
+"3otm6CIShG","MK07YZUnqt","fcwDaU3yw5","guMb8zmLYD","Uvlv4HfyNQ","Mm8siatef2","UmaEvOxWIH","wiHrZtl72W","x3LDeZUnqt","8TxD7piJSk",
+"AmdQdZv7z0","5VZjSdjsrv","K20wKdhSuH","1v5hHhYBCK","o8Uyd9XyT9","sx5GlzmLYD","Gv3FqMK07Y","VNCPdSs0Zu","zmLYDCdyBV","Yh1hFsuY4x",
+"ThjNnEdBKc","0Wr5yWaWsv","9XyT94QMc9","v8yFNU3yw5","t98iWFLsph","5Mg9rZ4I1v","MmsIozHF1q","EoToPsx5Gl","5ZaEzhi5X7","M6qcGlsQGo",
+"UlU3Mdjsrv","S77LHMK07Y","xciqpuN6r3","CIShGvOqCE","taOXKl83Ud","Y1mC0jfREu","AgJHQQ6Lix","zz4ZU14FLR","F6PT2DG4sT","K20wKlsQGo",
+"FcWrWiKqhr","i7WMQjiVBP","sx5GlTXQ0Z","AgJHQGrDg7","Ss0Zu2Yz7E","aez9yuupzk","MK07YMGlTF","mz8gxi3pyd","NOHszyvOMI","EOE1oFVMxo",
+"zY1GYv8yFN","tvdkDkZANm","S77LHbrhlQ","Q6LixJRJQB","FLsphQWxoT","QbxXch1zcH","WmadA9XyT9","VLTy6Rxrsm","LDk6f8FmFH","K4GS8ThjNn",
+"uJScXXflUq","t59lRfcwDa","OUYuFk85Ae","XyPZNB3qem","rKDLJuupzk","Twanoi7WMQ","ECMvU5Mg9r","atef2m4bxU","YOfrYjtn0X","cmXIXGv3Fq",
+"5NammS2Dfu","BCxeCfqypy","GrDg7NOHsz","v1HlnNo0Qb","wiHrZZ4I1v","QnJ1SzqH0W","uupzkJRJQB","aez9yyluBx","uLtKsMaJQs","Yf2EcUvlv4",
+"uQIczpiJSk","IKxdLMojnP","LDk6fjeskS","cQOnvlXFOB","BbwgAtuDyS","07n1cLDk6f","580YDjeskS","djsrvY1mC0","SjskQFPfSE","oVQp6uN6r3",
+"jtn0XFwEJz","dpe1vVNCPd","KsjRKn1pmO","M6qcGAmdQd","azIWpVjCZq","yToGW9XyT9","cmXIXt98iW","0BmCy8RCUA","07n1c580YD","ydG8Uo8Uyd",
+"2TRI7tuDyS","M6qcGyToGW","taOXKogLgc","dQ586Twano","aL6AJbrhlQ","FwEJzNxx9V","HP43355rfB","0Wr5yfcJOy","qQxHPQworu","GSQwjCK5W7",
+"s4786l83Ud","cQOnv16lHc","sqVrfx3LDe","64s8NDG4sT","h1zcHLbRTH","m4bxUdhSuH","HzZT8IBe8k","WaWsvaez9y","No0QbJ2mQi","pFrrlxciqp",
+"Z4I1vy94nw","lweGyksJby","DQimpQbxXc","vLsmSx3LDe","ZJTXHfFDrJ","KZamH48cHL","zbIYYLewvM","AgJHQdQ586","4W0Tlzz4ZU","HRxd8ogLgc",
+"d7vjMAgJHQ","tAOsrO3iyQ","cL0aEvOqCE","Ta8f6dpe1v","IRh48djsrv","vOqCEYjB9t","cmXIXUl4a1","rKDLJTwano","hE1QlIKxdL","JKWYRhE1Ql",
+"wDajXm4bxU","qQxHPFGzgp","cmXIXoQ87r","S2Dfu5VZjS","SbRYyCqqaD","nlaByBGaQY","IBe8kDQimp","UlU3MuQIcz","v8yFNaDGtS","lpF6WdmoS7",
+"Dz1R3JJs5m","9iGoTtl72W","s7MxkjzUqR","tlILtfmIK1","UlU3MKZamH","guMb8yofH3","yEfy9TCgPp","lsQGoWaWsv","JIqXiyEfy9","iKqhrS2Dfu",
+"ciuWz2TRI7","HRxd8S77LH","K4GS8U3yw5","FLsphhE1Ql","0Kyfs48cHL","0MR5Xfqypy","MmKGJ5IhmG","FGzgpciuWz","8RCUAn1pmO","aFFss8U2nU",
+"9XyT92hEEU","taOXKhi5X7","TXQ0Z48cHL","tlILtiKqhr","tlILtcmXIX","pmeCdG1RhS","Vprf2qUJMd","4QMc9MmsIo","0MR5X0Kyfs","zz4ZUoVQp6",
+"QClRLRBhp0","iqv4kcL0aE","WDVWJUl4a1","Kr8ys5iGN5","MojnPG1RhS","Q6hMC55rfB","blLA9AmdQd","LDk6fbrhlQ","Ss0ZuCIShG","tjQxsB3qem",
+"MGlTFECMvU","cmXIX9y4lw","Cfgr3hYBCK","uLtKsJJs5m","uJScXhYBCK","rKDLJYh1hF","FNYIMI7p2a","DQimp4W0Tl","WaWsvaL6AJ","nFqikGWqqX",
+"Uvlv4Yw2oU","WaWsvsx5Gl","QWxoTiKqhr","s4786U3yw5","IRh485Namm","tvdkD0MR5X","2DREsRBhp0","I7p2aIjTwP","J2mQiRsQUq","cShY2IBe8k",
+"48cHLDz1R3","uPX7Gx3LDe","7fsYMkB5nP","Mkgy8s4786","ZJTXH24ARF","VBjhzTa8f6","sx5GlZuDtD","fcJOyTa8f6","zbIYYFGzgp","y94nw0Kyfs",
+"Zv7z0QWxoT","Y1mC0HlUbF","WDVWJvkCHH","MmKGJUmaEv","zY1GYcmXIX","uQIczhE1Ql","vLsmSEOE1o","Nxx9VWreyP","BbwgA0YAGH","lj07QpT8wu",
+"WDVWJcShY2","7ku1pO3iyQ","5Drn0Yf2Ec","Zv7z0DQimp","faHirogLgc","QssNCe6e4z","e6e4zl83Ud","QClRLOUYuF","C2IrcJJs5m","QClRLyvOMI",
+"yofH3AIYUu","3otm6Mkgy8","uLtKsaez9y","cQOnvHzZT8","AkKTkOHaBz","WreyPuLtKs","3weIFFFDui","dmoS7l83Ud","Ul4a1oGu6x","LDk6fAXpwE",
+"b29RJ9XyT9","NAFuwMGlTF","IjTwPnnP8o","5Drn0wiHrZ","aez9yFnPFB","I7p2alXFOB","TXQ0ZYjB9t","WmadAQnJ1S","9y4lwMmsIo","soy9tFwEJz",
+"prNT6ciuWz","9eoRculk41","gf8rIb29RJ","8U2nUBpYhV","uN6r3o8Uyd","uvf7AWreyP","CIShGM6qcG","hUTw7Fhtgl","uupzkpv0i7","ydG8UFFDui",
+"tl72WSWfou","W3VFHydG8U","lCMxyyEfy9","BFkb8RsQUq","GXdoHydG8U","5NammDcpWB","Uvlv49y4lw","o8UydTCgPp","jzUqRRpBQm","ksJbyv8yFN",
+"ZzJHWfqypy","WaWsvB3qem","5drc6GrDg7","jSjS3DQimp","NAFuwM6qcG","uN6r3In3NS","GWqqXMojnP","9rlg9F6PT2","DG4sTaFFss","sqVrfyofH3",
+"J2mQi0Wr5y","YjB9tiwzGk","MmsIos4786","ReKEWXflUq","9y4lwCfgr3","lkMUAzz4ZU","55rfB9eoRc","pmeCdZzJHW","VerEAPb1pa","5nmWvaL6AJ",
+"W3VFHi7WMQ","XyPZNC2Irc","IKxdLJKWYR","aL6AJ0h1b1","e6e4zjeskS","SbRYyCK5W7","XyPZNrKDLJ","ulk41JRJQB","atef2Z4I1v","OxWIH5Mg9r",
+"16lHcIBe8k","blLA9x3LDe","5nmWvWreyP","F6PT2zY1GY","aFFssFLsph","0h1b1Ss0Zu","wiHrZWPmlx","oQ87rYf2Ec","DLhzMfcwDa","FPfSE0Wr5y",
+"vkCHHPb1pa","dhSuHS2Dfu","fFDrJzHF1q","dmoS7iqv4k","DQimpFwEJz","Ta8f6WaWsv","lm0pDtl72W","RACujsoy9t","Kr8ysVerEA","RsQUqEoToP",
+"1LB1LYOfrY","o8Uydjtn0X","tuDySi7WMQ","jzUqRsx5Gl","xReecM6qcG","lm0pD0PktI","x3LDe5nmWv","aez9yl83Ud","Q6LixnlaBy","lpF6WFPfSE",
+"Uvlv4qUJMd","FNYIMPYBf4","oGu6xzmLYD","Mm8siP6bcg","NOHsz5IhmG","F6PT2K20wK","WmadAJIqXi","FPfSEogLgc","uvf7AHzZT8","yEfy9RsQUq",
+"Vprf2Ss0Zu","GSQwjsqVrf","v2eC3dpe1v","Ss0ZucShY2","ulk41CIShG","SWfous7Mxk","AXpwERkQke","qQxHPXflUq","dQ586yluBx","fcJOyDz1R3",
+"YOfrYGXdoH","lH1kt1LB1L","cL0aEpvgjS","YjB9tCp3mZ","v8yFNChuy3","No0QblH1kt","ECMvURpBQm","gIYvEFVMxo","MmsIoTa8f6","TCgPp45cIH",
+"ThjNnyluBx","jzUqRcShY2","t98iWCp3mZ","lH1ktFhtgl","IjTwP0h1b1","4W0TlbZLvS","wiHrZ5nmWv","Nxx9V0PktI","VjCZq2hEEU","L7cGcMK07Y",
+"MaJQsOxWIH","lViBvWPmlx","JIqXiFVMxo","FwEJzJXljW","a00b5Q6Lix","55rfB7fsYM","VLTy6atef2","K4GS8QnJ1S","zz4ZU0ao3l","AIYUu3otm6",
+"l83Udk85Ae","FwEJzlj07Q","IKxdLydG8U","euZA5uJScX","CqqaDzz4ZU","Yh1hFazIWp","TCgPpGrDg7","h1zcHHP433","XyPZNCK5W7","Cfgr3SbRYy",
+"lm0pDS77LH","DLhzM8RCUA","5ZaEzPOUYS","Ul4a1Mm8si","8RCUACIShG","t59lRQssNC","nlaByzFgtB","tAOsrmX2GE","AXpwElkMUA","vOqCEuZPqg",
+"AIYUuAXpwE","e6e4zBGaQY","ni2v1Chuy3","gf8rISs0Zu","e6e4z0h1b1","K20wKjzUqR","VBjhzGSQwj","DG4sTMezSW","Cfgr3n1pmO","VNCPdksJby",
+"lCMxyU3yw5","uoStw7ku1p","fLNg84dEz6","qUJMdFPfSE","VerEA5Drn0","NAFuwgIYvE","aDGtS7hyVv","CdyBVhe9IA","IjTwPvOqCE","oQ87rpT8wu",
+"gtCA5B3qem","5NammDz1R3","QChxslpF6W","zQt6Qd7vjM","atef29eoRc","aez9yNAFuw","NOHszYOfrY","5drc6iKqhr","0KyfspiJSk","Q6LixQssNC",
+"WPmlx5iGN5","XflUqHzZT8","JRJQBiB08l","cShY2HfyNQ","tl72Wrz7Ut","5VZjSuupzk","Vprf20MR5X","8RCUANOHsz","F6PT2JXljW","55rfBOUqFM",
+"PYBf4FcWrW","Dz1R3ix74r","jiVBPJIqXi","ksJbyIKxdL","uTacx2Nslm","SmGzvgIYvE","fFDrJ9eoRc","jeskSRBhp0","PYBf4C2Irc","Pb1pa7lUXZ",
+"gtCA5k85Ae","JXljWFVMxo","ydG8U07n1c","8xEKzoGu6x","K4GS8xciqp","zz4ZUBCxeC","MmKGJMm8si","0PktIbgJAz","EdBKcPYBf4","s93MlQClRL",
+"uTacxo8Uyd","StlDJgf8rI","t98iWxXTI4","FcWrWgjUTu","xXTI4580YD","zmLYDFnPFB","IRh48Q6Lix","iB08lBFkb8","8xEKzRzaZA","5drc6uN6r3",
+"Cfgr3ru4UG","HlUbFtlILt","BGaQYmz8gx","SWfouSmGzv","uvf7AksJby","ulk41AgJHQ","y94nwpFrrl","l83Uduvf7A","FxX9qKASQ8","gf8rIuPX7G",
+"YOfrYpv0i7","8U2nUlH1kt","uAWypazIWp","jeskSd7vjM","VNCPd5IhmG","StlDJFxX9q","POUYS55rfB","6AFT0FxX9q","VIlwP0h1b1","lm0pDVIlwP",
+"BpYhVM6qcG","vOqCEIjTwP","JJs5mTwano","vLsmS16lHc","DG4sTRpBQm","a00b5Fhtgl","YjB9tGSQwj","rKDLJm4bxU","BbwgAvOqCE","aez9ySWfou",
+"2DREsZ4I1v","lH1ktYjB9t","zz4ZUhi5X7","7Ow5CS77LH","WreyPC2Irc","EOE1olweGy","G1RhSxciqp","2NslmCdyBV","FPfSEMmKGJ","qUJMdnlaBy",
+"jzUqRuN6r3","BFkb8ZuDtD","dmoS7BGaQY","FcWrWiB08l","C2Irc1LB1L","BGaQYS77LH","IRh48W7cTs","0PktIAXpwE","hYBCKoQ87r","0KyfsEOE1o",
+"NcICAzY1GY","L7cGchUTw7","In3NSO3iyQ","9y4lwzmLYD","kB5nPqaofN","ZhwG14dEz6","piJSkCxVEf","QClRLrhl0J","Ta8f6uupzk","dhSuH4QMc9",
+"t98iWFwEJz","WPmlxi3pyd","rKDLJAmdQd","Ss0Zu5IhmG","KASQ8b29RJ","fLNg8fmIK1","yluBxlkMUA","vkCHHOUqFM","OUYuFMojnP","NAFuw4dEz6",
+"rhl0JB3qem","tlILtQ6hMC","GSQwjjtn0X","ReKEW4dEz6","LbRTHFwEJz","JkzUnhi5X7","BFkb8uJScX","Chuy3djsrv","mz8gxHRxd8","WPmlxpFrrl",
+"iqv4kFjHXR","1j5L8CK5W7","Mm8si55rfB","jzUqRt59lR","a00b5uZPqg","9y4lwqUJMd","5VZjSRsQUq","5Mg9rSmGzv","djsrv1v5hH","BbwgADQimp",
+"8xEKzCfgr3","VjCZqD6rBy","jzUqRxXTI4","5ZaEzs7Mxk","zQt6Qi7WMQ","JkzUnWMiS3","ni2v1s93Ml","RzaZAjeskS","lViBvoGu6x","uoStwWPmlx",
+"9rlg9ciuWz","ZUnqtDQimp","7Ow5C4QMc9","AIYUujSjS3","qaofNO3iyQ","7X3uy1v5hH","dmoS75Namm","Y1mC0RmDcr","SmGzv5ZaEz","uPX7GNo0Qb",
+"0ao3lUvlv4","BFkb8580YD","JRJQBQClRL","5Drn0hYBCK","lj07QY1mC0","guMb8CK5W7","aDGtSNAFuw","JKWYRWreyP","Zv7z0RpBQm","sqVrfBGaQY",
+"Mm8sijiVBP","JkzUncShY2","rKDLJM3zXL","5drc67fsYM","5iGN5s4786","WmadAYOfrY","Cp3mZ7X3uy","Ta8f6gjUTu","S77LHKsjRK","pvgjSSjskQ",
+"RpBQmIn3NS","QYxC0FcWrW","Q6hMCzFgtB","3weIFCK5W7","uoStwBGaQY","xXTI4lH1kt","blLA9uoStw","Ss0ZuuZPqg","DcpWBhi5X7","zFgtBpWiOs",
+"CNHmvo8Uyd","8RCUACNHmv","SWfouhi5X7","pFrrlFcWrW","8TxD77X3uy","0PktIni2v1","aDGtSOUqFM","mz8gxGrDg7","9GXkXiwzGk","LDk6fiKqhr",
+"AgJHQatef2","uLtKsjtn0X","5Namm0Kyfs","OxWIH2DREs","v1HlnFjHXR","hi5X7jfREu","Rxrsm5Drn0","zqH0WlCMxy","Yh1hFPYBf4","2DREsjtn0X",
+"a00b5FPfSE","RmDcrCIShG","K4GS8v8yFN","U3yw5D6rBy","0ao3lEdBKc","W3VFHHlUbF","ogLgcRBhp0","2ZHdkxciqp","C2Ircs4786","0MR5XKZamH",
+"K4GS8uJScX","2TRI7lsQGo","piJSkTCgPp","xXTI4jzUqR","fqypyQbxXc","CdyBV16lHc","zbIYY07n1c","AkKTk16lHc","uLtKsIRh48","DQimpPOUYS",
+"S77LHQbxXc","FnPFBulk41","Chuy3Mkgy8","VIlwP618Di","HP433y94nw","2ZHdk4W0Tl","vkCHHtuDyS","XflUqaFFss","In3NSzQt6Q","taOXK0Kyfs",
+"v2eC3Q6hMC","o8UydbZLvS","VjCZqdhSuH","VIlwPPOUYS","JXljW8cVD3","29QAzfaHir","mX2GEdjsrv","y94nw8cVD3","Gv3FqG1RhS","0KyfscmXIX",
+"fmIK1P6bcg","HP433ReKEW","vOqCE4dEz6","tAOsrTwano","RpBQmi7WMQ","WaWsvSjskQ","AmdQdmX2GE","IBe8kFcWrW","8hJdtoQ87r","Waim6n8pJ9",
+"jtn0XXflUq","QbxXcStlDJ","JJs5mzQt6Q","XyPZNlkMUA","DG4sTEdBKc","9GXkXYOfrY","ulk41yEfy9","4W0Tls4786","MmKGJsoy9t","iwzGk0YAGH",
+"jS1ajVprf2","J2mQiRpBQm","GXdoH5ZaEz","fqypy8U2nU","FwEJzulk41","yToGWMGlTF","EdBKcQssNC","5iGN5yEfy9","okgRi3weIF","blLA9dQ586",
+"0MR5XeuZA5","nFqik1j5L8","0MR5XlweGy","Pb1paTXQ0Z","lm0pDYw2oU","jiVBPB3qem","xXTI4v1Hln","BbwgAv8yFN","PYBf4PYBf4","9iGoTFhtgl",
+"ulk41t59lR","WPmlxTa8f6","ogLgcuQIcz","S77LHlweGy","YOfrYUvlv4","AmdQdP6bcg","5IhmG0MR5X","7Ow5ClH1kt","JkzUn8RCUA","J2mQinlaBy",
+"aL6AJUlU3M","2ZHdkIBe8k","7X3uyCK5W7","zmLYDjeskS","618DiNxx9V","b29RJhE1Ql","lj07QpmeCd","ZuDtDjfREu","iKqhrlXFOB","tjQxshe9IA",
+"Cfgr31v5hH","HlUbFQYxC0","guMb8LewvM","pmeCd5Namm","DcpWByvOMI","2hEEUAOgEe","VerEAM3zXL","FVMxoCqqaD","AmdQdmz8gx","7fKYUgtCA5",
+"lXFOBHlUbF","ydG8UMmsIo","wDajXfcwDa","brhlQv1Hln","4W0TlzbIYY","sqVrffmIK1","he9IApv0i7","FxX9qChuy3","J2mQilpF6W","64s8NUlU3M",
+"P6bcg45cIH","mz8gxnFqik","7fsYMCdyBV","M6qcGNxx9V","ydG8UuoStw","45cIHuupzk","NhXduFPfSE","lH1ktjfREu","PYBf47Ow5C","tl72W0ao3l",
+"VjCZqO3iyQ","JKWYRzHF1q","580YDk85Ae","uZPqg8TxD7","9rlg94QMc9","rhl0JM6qcG","BFkb8UmaEv","gIYvEogLgc","FcWrWLbRTH","s478624ARF",
+"M3zXLIBe8k","M6qcGlViBv","dmoS7WDVWJ","FVMxoUl4a1","pWiOsi3pyd","Zv7z0Kr8ys","LewvMhSSvQ","pFrrlgf8rI","Pb1paJIqXi","D6rByBpYhV",
+"L7cGcdQ586","VLTy6oVQp6","0Wr5yChuy3","brhlQfmIK1","zHF1qgIYvE","RBhp09iGoT","0MR5XBpYhV","OUYuFogLgc","Nxx9VeuZA5","JKWYRHfyNQ",
+"MezSWzqH0W","n1pmOIn3NS","Kr8ysjfREu","yEfy9Ta8f6","OHaBz4dEz6","0ao3llweGy","wiHrZQ6Lix","RACujgdQsS","16lHcguMb8","O3iyQZzJHW",
+"lCMxyOUYuF","FcWrWPYBf4","ZJTXHzqH0W","S77LHuupzk","Waim6POUYS","KZamH5Namm","4dEz6hUTw7","8hJdtqaofN","ni2v1gtCA5","BpYhVs4786",
+"45cIHK20wK","MojnPCIShG","wiHrZ580YD","i7WMQC2Irc","Yf2EcDcpWB","lpF6Wd7vjM","pWiOsSmGzv","2NslmI7p2a","Ss0Zus7Mxk","zmLYDgf8rI",
+"yluBxNhXdu","24ARFDcpWB","5IhmGciuWz","vOqCEzQt6Q","aez9yDcpWB","ulk41uTacx","EOE1oNhXdu","iKqhr7Ow5C","euZA5IRh48","0BmCy5Namm",
+"JkzUnzz4ZU","ru4UGFjHXR","rhl0J7X3uy","D6rBy7ku1p","IRh48k85Ae","29QAzs93Ml","v1Hlnt98iW","djsrvQ6Lix","FnPFBTCgPp","RxrsmksJby",
+"v8yFNOz8yZ","16lHcYw2oU","cShY2rz7Ut","No0QblweGy","AIYUuKZamH","5VZjSi3pyd","6AFT0Twano","BFkb88FmFH","VjCZqJRJQB","W7cTs5ZaEz",
+"Yf2EchE1Ql","4dEz6Twano","GXdoHNhXdu","HzZT86AFT0","5ZaEzlsQGo","BGaQYVprf2","uZPqgqQxHP","7Ow5Ciqv4k","VNCPd45cIH","JKWYRHlUbF",
+"ciuWzWmadA","580YDydG8U","JRJQBulk41","RpBQmRBhp0","TXQ0ZDG4sT","OxWIHnFqik","aL6AJ7fKYU","nnP8oLewvM","KASQ8hE1Ql","GWqqXNhXdu",
+"NcICAFhtgl","cL0aEuN6r3","VLTy6Nxx9V","d85a9yofH3","ZJTXH580YD","wDajXUlU3M","StlDJlm0pD","gjUTuCIShG","lViBvChuy3","Q6hMCVLTy6",
+"uLtKs16lHc","EOE1oD6rBy","tl72WReKEW","euZA5C2Irc","xReec0h1b1","AmdQdYf2Ec","M6qcGhYBCK","O3iyQFcWrW","FLsphs4786","lpF6WuTacx",
+"hUTw7Ul4a1","jeskS4QMc9","zmLYDCK5W7","xciqpCxVEf","qaofNzFgtB","tvdkDnFqik","a00b5t98iW","Dz1R3i7WMQ","t59lRh1zcH","VerEAhE1Ql",
+"tlILtJKWYR","l83UdlCMxy","mz8gx16lHc","v2eC3JRJQB","yofH3Uvlv4","J2mQi4QMc9","UmaEvhUTw7","K20wKyofH3","FhtglQClRL","DQimpcL0aE",
+"Cfgr3v1Hln","CIShGYh1hF","5drc6ECMvU","Yh1hF16lHc","Uvlv4dmoS7","VIlwPCK5W7","oVQp6AOgEe","rz7UtoVQp6","t59lRpvgjS","5nmWvHP433",
+"Chuy3RpBQm","Kr8ysRsQUq","WmadAblLA9","uQIczdjsrv","kZANmSmGzv","JIqXim4bxU","7X3uycL0aE","5Drn0VLTy6","C2IrcSjskQ","2hEEU3otm6",
+"0h1b1o8Uyd","ZzJHWPYBf4","uvf7AIRh48","7ku1pPYBf4","J2mQiKZamH","JIqXiMkgy8","GWqqXDcpWB","t59lRyvOMI","HfyNQFnPFB","h1zcHXflUq",
+"3otm6ZJTXH","VerEAQClRL","uQIcz29QAz","0Wr5yb29RJ","MaJQssoy9t","hE1Ql7hyVv","KZamHNhXdu","618Dim4bxU","EoToPAXpwE","MojnPWDVWJ",
+"ciuWzMm8si","qQxHP48cHL","e6e4zqUJMd","ru4UGfqypy","o8Uyd64s8N","ulk41xciqp","oVQp6F6PT2","uLtKsOHaBz","9XyT9LbRTH","EdBKcCxVEf",
+"Yf2EcStlDJ","14FLRQnJ1S","s7MxkpWiOs","bgJAzlH1kt","ZUnqtlweGy","MmKGJChuy3","FPfSEjS1aj","Pb1pa9rlg9","FnPFBuoStw","GWqqXVLTy6",
+"FhtglbZLvS","uvf7ASjskQ","C2IrchYBCK","v1HlnVjCZq","bgJAzFnPFB","hUTw7cmXIX","brhlQQ6Lix","UmaEvpv0i7","QbxXcYOfrY","d85a9lsQGo",
+"jeskS5ZaEz","FVMxoFFDui","L7cGcWreyP","P6bcgcmXIX","Zv7z07ku1p","KASQ8DLhzM","MojnP2TRI7","ydG8Uaez9y","Oz8yZMezSW","LbRTHJIqXi",
+"uPX7G0h1b1","gtCA50Kyfs","blLA9GWqqX","9y4lwOUqFM","l83UdfcJOy","zY1GYNOHsz","TXQ0ZDz1R3","CdyBVSs0Zu","QClRLfmIK1","uZPqglsQGo",
+"PYBf41v5hH","5iGN5ZhwG1","7X3uyMGlTF","SmGzvgf8rI","jeskSWmadA","gtCA5t59lR","gdQsSbrhlQ","lH1ktStlDJ","rKDLJRsQUq","bgJAzJIqXi",
+"IjTwPZ4I1v","MojnPS77LH","J2mQiUvlv4","bgJAzUvlv4","zY1GYbrhlQ","2DREsOxWIH","DLhzMpFrrl","cShY2v2eC3","JKWYRAmdQd","vkCHHl83Ud",
+"QworuTCgPp","KASQ8aDGtS","ZJTXHBGaQY","5drc6cShY2","Ss0ZuydG8U","FwEJzzbIYY","pmeCdlpF6W","GWqqX0h1b1","tjQxsdpe1v","wDajX29QAz",
+"OxWIHFhtgl","KASQ8HRxd8","1LB1Ljtn0X","RkQkes93Ml","lweGyGrDg7","Twanom4bxU","WDVWJB3qem","uvf7AwDajX","sx5GlFPfSE","5Drn0qQxHP",
+"hSSvQuPX7G","pvgjSgjUTu","lH1ktY1mC0","6q6L97fKYU","pvgjSgtCA5","azIWplm0pD","0BmCySbRYy","v2eC3SWfou","aez9yrKDLJ","KZamHzFgtB",
+"EoToPh1zcH","uPX7GaFFss","1LB1LQClRL","n8pJ9bgJAz","LbRTHrhl0J","RxrsmwDajX","uPX7GjfREu","lH1ktWreyP","mX2GE29QAz","NhXduQYxC0",
+"3weIF8xEKz","v8yFNaez9y","cL0aEKASQ8","9eoRcSbRYy","OHaBzeuZA5","8FmFHSbRYy","pmeCdl83Ud","SWfouJRJQB","i7WMQnFqik","VNCPdEoToP",
+"zHF1qfqypy","K4GS8JkzUn","8xEKzxReec","oVQp6zbIYY","qaofNlXFOB","zbIYYZJTXH","ReKEWnnP8o","24ARF1j5L8","ZuDtDxXTI4","IRh48d85a9",
+"DG4sThSSvQ","OHaBzguMb8","uupzkrhl0J","aDGtS5VZjS","J2mQiL7cGc","MojnP5Drn0","B3qem5iGN5","F6PT2uZPqg","CIShGk85Ae","5nmWvBGaQY",
+"5IhmGxciqp","FhtgltvdkD","Chuy30h1b1","xXTI4Vprf2","2hEEUaFFss","lm0pDGXdoH","C2IrcPOUYS","ksJby2hEEU","QWxoTHfyNQ","ReKEWjfREu",
+"FhtglYjB9t","EoToP5IhmG","UmaEvMkgy8","9iGoToVQp6","RkQkelpF6W","P6bcgKZamH","LewvMa00b5","sqVrfO3iyQ","FnPFBNOHsz","YOfrYCdyBV",
+"rhl0JRmDcr","UlU3MuJScX","qaofNrKDLJ","jS1ajhUTw7","14FLRiKqhr","aez9yCNHmv","rz7UtBbwgA","7Ow5CJ2mQi","tuDySJJs5m","Ss0ZuHP433",
+"uvf7AyvOMI","uPX7GRBhp0","Pb1paAkKTk","pFrrllweGy","GXdoH4W0Tl","3otm6Q6Lix","7fsYMYjB9t","lkMUAn8pJ9","BCxeCvOqCE","FVMxopmeCd",
+"JRJQBzHF1q","AgJHQksJby","JRJQBiKqhr","GXdoHJJs5m","0BmCybgJAz","sx5GldmoS7","jS1aj7ku1p","24ARF7hyVv","lm0pDpmeCd","48cHLIBe8k",
+"MmKGJs93Ml","BpYhVuZPqg","aFFsstAOsr","AOgEeKZamH","l83UdydG8U","YjB9tAXpwE","Cp3mZRpBQm","GSQwjtuDyS","oGu6xUlU3M","Cp3mZdpe1v",
+"QbxXcP6bcg","oGu6xVIlwP","jiVBPMmsIo","S77LHIBe8k","xReeciB08l","okgRi0Wr5y","S77LHoGu6x","hYBCKKsjRK","BFkb8ni2v1","8TxD7PYBf4",
+"aFFss0h1b1","O3iyQksJby","QClRLTXQ0Z","8TxD7IKxdL","VjCZqxXTI4","GXdoHi3pyd","9rlg9lViBv","StlDJVBjhz","rKDLJnlaBy","blLA9QnJ1S",
+"C2IrcAgJHQ","QworuYw2oU","JkzUnKZamH","iB08l5VZjS","djsrvdpe1v","M6qcG7fKYU","hUTw7y94nw","pvgjSL7cGc","WaWsvEoToP","LbRTHd85a9",
+"lkMUApWiOs","ZUnqtUmaEv","YjB9td85a9","RxrsmDcpWB","BpYhV5drc6","uZPqgwiHrZ","HRxd8hYBCK","VjCZqGSQwj","1LB1L7fsYM","2DREsPYBf4",
+"WmadAk85Ae","9XyT9BbwgA","AOgEeblLA9","7fsYMs7Mxk","5VZjSNcICA","fcwDa8hJdt","ZzJHWksJby","pWiOs8cVD3","QYxC0uPX7G","8U2nU0h1b1",
+"iwzGkvLsmS","5Drn0d85a9","euZA5MmKGJ","sx5GluAWyp","MmKGJPb1pa","TCgPp2Nslm","dhSuHNhXdu","zz4ZUIRh48","ulk41k85Ae","Kr8ysuQIcz",
+"CIShGS2Dfu","5drc6OHaBz","HP433mz8gx","SbRYyjS1aj","WDVWJFxX9q","ulk416q6L9","BpYhVJXljW","Kr8ysJKWYR","FFDui5iGN5","9rlg9UmaEv",
+"64s8Natef2","Yw2oUOxWIH","ulk4129QAz","B3qemOxWIH","FhtglQChxs","NOHsz7hyVv","7ku1psx5Gl","SjskQzY1GY","cShY2Ul4a1","Mkgy8ZhwG1",
+"vkCHHrhl0J","ThjNnRpBQm","5VZjSMmsIo","24ARFyluBx","2ZHdkPYBf4","Z4I1v0YAGH","5Namm2hEEU","9GXkX6q6L9","2hEEUokgRi","zqH0W9eoRc",
+"fLNg88U2nU","4dEz6i7WMQ","Oz8yZ5Mg9r","4W0TlcShY2","W7cTsZhwG1","1j5L8mz8gx","K20wKnlaBy","9XyT9CNHmv","WMiS3FVMxo","aFFss7lUXZ",
+"Dz1R3Gv3Fq","lweGyt98iW","l83UdJRJQB","J2mQijSjS3","GXdoHOHaBz","okgRia00b5","ru4UGVjCZq","kZANmv8yFN","uPX7G5Namm","YjB9tFcWrW",
+"0MR5XfmIK1","okgRi1j5L8","pT8wuFPfSE","MezSWl83Ud","nlaByuupzk","fcwDanFqik","JKWYRThjNn","0Wr5yQ6hMC","lViBvQClRL","jiVBPiwzGk",
+"8hJdtn1pmO","BGaQYcmXIX","Zv7z0iB08l","I7p2aDG4sT","618Dilm0pD","fFDrJWMiS3","BpYhV1v5hH","9XyT9yEfy9","yvOMIfcwDa","Y1mC0FxX9q",
+"6q6L9fcwDa","uZPqg9iGoT","k85AeQworu","In3NS16lHc","suY4xQ6Lix","ciuWz5iGN5","ZhwG1i3pyd","Cp3mZ24ARF","UlU3MSWfou","jfREuAXpwE",
+"WPmlxjzUqR","zHF1qZ4I1v","WDVWJpFrrl","2TRI74dEz6","Q6LixSjskQ","zFgtBt98iW","pWiOsFhtgl","GWqqXCqqaD","QWxoTWPmlx","EdBKcRzaZA",
+"DG4sTU3yw5","8TxD75nmWv","7X3uy9XyT9","NcICAZUnqt","prNT65IhmG","aL6AJwiHrZ","X6PinP6bcg","In3NSWaim6","CNHmvF6PT2","Mkgy8vOqCE",
+"FVMxopiJSk","Ul4a19iGoT","BCxeCRBhp0","cShY22hEEU","yToGWyofH3","48cHL5VZjS","x3LDeDLhzM","euZA548cHL","uQIczEoToP","AXpwEuoStw",
+"ZhwG1bZLvS","xciqp2TRI7","0MR5XhE1Ql","2TRI7yvOMI","jfREuO3iyQ","tAOsr2TRI7","JRJQBOHaBz","M6qcGVLTy6","uPX7GP6bcg","KZamHhi5X7",
+"DQimpyToGW","M3zXLCIShG","FhtglTwano","ni2v1HlUbF","6q6L9GSQwj","s47866q6L9","dpe1vksJby","HzZT8OUYuF","RxrsmUl4a1","jS1ajHlUbF",
+"Zv7z0OxWIH","uoStwDz1R3","GSQwjDcpWB","GSQwjo8Uyd","OHaBzCdyBV","WMiS3jeskS","xXTI4VIlwP","ThjNnzqH0W","zY1GYW3VFH","No0QbC2Irc",
+"MGlTFiqv4k","hE1QllXFOB","2Yz7EVerEA","3otm68hJdt","ZhwG1m4bxU","5nmWvOUqFM","oVQp6v8yFN","m4bxUQ6hMC","U3yw51LB1L","taOXKFGzgp",
+"FGzgpYf2Ec","pWiOsDQimp","QworuuLtKs","IKxdLNo0Qb","2hEEUZ4I1v","yluBxdmoS7","HlUbFW7cTs","OUYuF4dEz6","7Ow5CRBhp0","dpe1vG1RhS",
+"29QAzuPX7G","gjUTufaHir","Cfgr39GXkX","NcICAY1mC0","JIqXixXTI4","16lHc5VZjS","iB08lWaWsv","HP433zQt6Q","VerEAhYBCK","jiVBP2Yz7E",
+"QbxXcThjNn","MezSWSs0Zu","v8yFN0ao3l","Dz1R3JRJQB","iwzGkCqqaD","aDGtSAkKTk","FhtglUl4a1","pT8wu9GXkX","RACujFLsph","xciqpzmLYD",
+"FjHXRiwzGk","zHF1qZhwG1","bgJAzHP433","fmIK1Fhtgl","t59lRLbRTH","FnPFB9y4lw","gIYvE2hEEU","MK07YF6PT2","Nxx9V14FLR","P6bcgL7cGc",
+"he9IAThjNn","8U2nUVprf2","M3zXLSjskQ","GrDg7ZUnqt","6q6L9kZANm","NOHszt98iW","7fsYMRsQUq","9XyT9AIYUu","618DiVerEA","FLsphKZamH",
+"Yw2oUhYBCK","0PktIlXFOB","SbRYyy94nw","VLTy6Q6Lix","JKWYRuN6r3","iKqhrmz8gx","9eoRcRxrsm","h1zcHFjHXR","blLA9bZLvS","FjHXR4W0Tl",
+"fmIK1OHaBz","AOgEeYf2Ec","S77LHlm0pD","AIYUu55rfB","Dz1R3d7vjM","Nxx9VM3zXL","uTacxlm0pD","FVMxoxXTI4","SjskQ580YD","tlILt8U2nU",
+"9XyT9D6rBy","CNHmvNOHsz","G1RhSyToGW","i7WMQDz1R3","Oz8yZDG4sT","uvf7AChuy3","ulk41FGzgp","8xEKzUl4a1","In3NSTa8f6","s7MxkF6PT2",
+"ZJTXHpFrrl","uPX7GzHF1q","FGzgppmeCd","WmadABFkb8","J2mQiBGaQY","jzUqRJkzUn","Q6hMCuupzk","9GXkXgtCA5","FPfSEfqypy","Chuy3Yw2oU",
+"07n1cix74r","NcICATCgPp","TwanoPb1pa","45cIHKsjRK","1v5hHhE1Ql","uAWypEOE1o","i3pydDG4sT","07n1cM3zXL","MmKGJJRJQB","IKxdL48cHL",
+"Ss0ZudQ586","brhlQqUJMd","RzaZAdhSuH","dpe1vKZamH","618DiRzaZA","O3iyQVLTy6","K20wKlweGy","lm0pDDLhzM","GrDg7JkzUn","jtn0XHP433",
+"xReecNAFuw","hYBCKzbIYY","zY1GYuQIcz","lsQGoRBhp0","ECMvUChuy3","MezSWyofH3","0Wr5yWPmlx","uAWypNhXdu","fcwDaSs0Zu","tuDySRACuj",
+"oQ87raFFss","WDVWJFhtgl","4W0Tlgf8rI","QbxXcRBhp0","YjB9tWmadA","16lHc8hJdt","ReKEWrKDLJ","FwEJzBFkb8","3otm6hE1Ql","I7p2aFFDui",
+"MmsIoRACuj","AmdQdMK07Y","vOqCEX6Pin","VjCZquAWyp","W7cTspv0i7","QClRLx3LDe","WaWsvpWiOs","jtn0XFFDui","GWqqXYf2Ec","CNHmv8hJdt",
+"yofH3Cp3mZ","EOE1oB3qem","ydG8UpWiOs","vLsmSy94nw","WreyPdQ586","cmXIXqUJMd","8RCUA64s8N","5VZjSFhtgl","t98iWqaofN","5ZaEzNhXdu",
+"8TxD7Cfgr3","4W0TlVLTy6","n8pJ9MezSW","YOfrY3otm6","45cIHMGlTF","lCMxy2DREs","fcJOyqUJMd","2ZHdkhUTw7","NhXduAgJHQ","MojnPC2Irc",
+"wDajXciuWz","yofH3n1pmO","7hyVvxciqp","JKWYRvLsmS","U3yw5djsrv","lweGy2ZHdk","jfREu9y4lw","HRxd8wDajX","QChxsBGaQY","HfyNQbgJAz",
+"FLsphAIYUu","9GXkXVNCPd","jiVBP9y4lw","8xEKz0YAGH","v1Hln8U2nU","K4GS80MR5X","i3pydzqH0W","StlDJQYxC0","kB5nPiB08l","gtCA5Kr8ys",
+"pv0i7YOfrY","aez9yqUJMd","7ku1pFcWrW","fcJOy618Di","8RCUAU3yw5","tl72W0MR5X","hUTw71j5L8","JkzUnFNYIM","a00b5Yh1hF","v8yFNjiVBP",
+"X6PinqaofN","WmadA1j5L8","AgJHQNxx9V","FnPFBM3zXL","QYxC0Ul4a1","sx5GluN6r3","nFqik5Namm","QYxC0J2mQi","NcICArKDLJ","ksJbyJRJQB",
+"B3qemX6Pin","cmXIXVerEA","QWxoTfcwDa","Cp3mZCxVEf","AgJHQFVMxo","QChxszFgtB","2hEEUYf2Ec","oVQp6W3VFH","5ZaEzhYBCK","8hJdtulk41",
+"Uvlv4LDk6f","i7WMQOxWIH","FxX9q4dEz6","XflUqCdyBV","7ku1p6AFT0","4dEz6jeskS","7fKYUDcpWB","bgJAzW3VFH","l83UdBCxeC","zQt6QAXpwE",
+"rKDLJHzZT8","Kr8yszHF1q","L7cGcStlDJ","uTacxzY1GY","TCgPpVerEA","Z4I1vtl72W","ix74rTa8f6","soy9t07n1c","9eoRcKsjRK","vkCHHyluBx",
+"7fKYUvOqCE","hE1Qli3pyd","EdBKcEoToP","MK07YCIShG","x3LDeQChxs","CK5W7n1pmO","8RCUAUlU3M","fcwDaUlU3M","dhSuHn8pJ9","iqv4kh1zcH",
+"MezSWAOgEe","hE1QlWmadA","CK5W72TRI7","lweGyZv7z0","fLNg8RkQke","0Wr5ySjskQ","lm0pDGrDg7","BFkb8C2Irc","cShY25Mg9r","0YAGHFcWrW",
+"zmLYD8FmFH","VerEADz1R3","lpF6WOUYuF","iKqhrCfgr3","Y1mC0Vprf2","ksJbyfcwDa","fmIK1k85Ae","7ku1plCMxy","BGaQYQbxXc","tvdkDfmIK1",
+"Zv7z0Cp3mZ","0h1b1gf8rI","FwEJzjeskS","CIShGi3pyd","SbRYy0BmCy","pWiOsQChxs","lj07QpAhR1","gf8rI0YAGH","5Drn0BFkb8","M3zXL1LB1L",
+"HzZT8blLA9","Dz1R30PktI","BpYhVuN6r3","7fKYUX6Pin","zbIYYyEfy9","RzaZAlH1kt","BCxeCKZamH","NcICAgtCA5","7X3uyix74r","K4GS8AXpwE",
+"ReKEWFwEJz","uAWypMkgy8","FVMxovkCHH","Q6hMCDG4sT","i7WMQwDajX","6q6L9DG4sT","NAFuwNxx9V","aL6AJZJTXH","6q6L9lsQGo","pFrrl4W0Tl",
+"MK07Yjtn0X","Zv7z0VerEA","FNYIMCp3mZ","d85a9HP433","F6PT2Y1mC0","uTacxx3LDe","Dz1R3s7Mxk","7hyVvJIqXi","Yw2oUxciqp","X6PinSmGzv",
+"HRxd8tuDyS","RkQkeVBjhz","5NammydG8U","guMb8Twano","I7p2aHlUbF","dQ586tAOsr","FxX9qTa8f6","M3zXLru4UG","dmoS7ulk41","lsQGoSWfou",
+"s4786No0Qb","TCgPp9y4lw","MGlTFlj07Q","n1pmOCdyBV","QChxsoGu6x","5Mg9rMm8si","yvOMIs93Ml","hSSvQ2TRI7","UlU3MYOfrY","atef2BbwgA",
+"CdyBVoGu6x","b29RJGXdoH","HzZT8zmLYD","lH1ktaDGtS","dpe1vZuDtD","3weIFSbRYy","48cHLbgJAz","RzaZAzHF1q","kZANmhi5X7","t59lRs93Ml",
+"MmsIoqQxHP","rz7Utaez9y","tvdkDMmKGJ","ogLgcjeskS","t59lRxXTI4","y94nwQYxC0","7fKYUmX2GE","KZamH1LB1L","JXljWlkMUA","AmdQdAgJHQ",
+"xXTI4euZA5","t59lR7Ow5C","ogLgcuTacx","yluBxCfgr3","SbRYyJJs5m","pv0i7OHaBz","ZUnqtqUJMd","lpF6WydG8U","DcpWBJIqXi","fqypyv2eC3",
+"dmoS7GrDg7","NcICAxReec","GrDg7OxWIH","tl72WFPfSE","BGaQYcL0aE","d7vjMxXTI4","SjskQK4GS8","jzUqRMaJQs","48cHLECMvU","piJSkRBhp0",
+"GSQwjhYBCK","KZamHqaofN","ECMvUdQ586","pAhR11j5L8","jS1ajMezSW","BFkb8QbxXc","wDajXsoy9t","07n1c8FmFH","FjHXRtjQxs","pFrrlaez9y",
+"kZANmMaJQs","uN6r3Kr8ys","IjTwPoGu6x","gdQsSTXQ0Z","uupzkHRxd8","nlaByokgRi","FNYIMv8yFN","EdBKcDQimp","0h1b1cQOnv","JXljWSs0Zu",
+"29QAzQbxXc","Cp3mZQnJ1S","EOE1oQssNC","Vprf2Gv3Fq","lpF6WqaofN","cmXIXMaJQs","MezSWdpe1v","ix74r24ARF","cmXIXzQt6Q","NAFuwcQOnv",
+"OxWIHfqypy","nlaBysuY4x","BGaQYzz4ZU","Vprf2vOqCE","8U2nUUmaEv","QWxoTQssNC","jS1ajVerEA","TwanoZUnqt","n1pmOTwano","he9IA4QMc9",
+"WaWsv8cVD3","XflUqeuZA5","Waim6Kr8ys","nnP8o48cHL","B3qemMaJQs","Chuy3Q6hMC","WreyPCp3mZ","5NammxReec","MaJQs8TxD7","2Yz7EvOqCE",
+"Vprf2OHaBz","CNHmvKZamH","RACujQworu","uTacxy94nw","29QAzJJs5m","ydG8UtjQxs","aFFsss4786","Yw2oUTCgPp","rKDLJd7vjM","cQOnv5ZaEz",
+"14FLRzY1GY","W3VFHprNT6","uLtKs5ZaEz","TwanoydG8U","EdBKcOxWIH","pFrrlCfgr3","TwanocShY2","0Wr5ytaOXK","tuDySU3yw5","Q6hMCHfyNQ",
+"brhlQ618Di","he9IA8cVD3","3otm6XflUq","nlaBy1LB1L","ix74roVQp6","2Yz7EJ2mQi","WMiS3s93Ml","yvOMIW3VFH","16lHc5iGN5","5ZaEzVNCPd",
+"Cfgr3lweGy","K4GS88FmFH","NOHsz5Namm","JIqXiI7p2a","SWfoulViBv","Q6hMCJ2mQi","K4GS8o8Uyd","zqH0WJ2mQi","HP433kZANm","2DREsDLhzM",
+"ru4UGRmDcr","prNT69iGoT","MojnPD6rBy","DQimppWiOs","WMiS3JKWYR","dhSuHEdBKc","soy9t29QAz","8U2nU8U2nU","Dz1R3uoStw","LewvM0ao3l",
+"L7cGcEOE1o","zqH0WyToGW","nlaByuAWyp","5iGN5pvgjS","MojnPQbxXc","Nxx9V9rlg9","4QMc9FFDui","IKxdLW7cTs","MmKGJ2Nslm","Ta8f6euZA5",
+"m4bxUDcpWB","WmadAVNCPd","prNT6AOgEe","IRh48NcICA","djsrvYOfrY","GSQwjOHaBz","HzZT8Gv3Fq","DLhzMm4bxU","QClRLksJby","gIYvElkMUA",
+"7fKYUCK5W7","S77LH2Yz7E","7fKYUsqVrf","BCxeC9y4lw","kZANm2DREs","MK07YdhSuH","7X3uyK4GS8","BGaQYQChxs","JJs5mv1Hln","vOqCEWDVWJ",
+"TCgPpStlDJ","8hJdtF6PT2","uupzkxciqp","QssNCFNYIM","D6rByG1RhS","uQIczhSSvQ","5Drn0Ss0Zu","VjCZquQIcz","NAFuwnnP8o","GWqqXcQOnv",
+"GSQwjIKxdL","GrDg75Namm","CdyBVkB5nP","djsrvFjHXR","HRxd8GSQwj","oGu6xs7Mxk","Yf2EcCp3mZ","mX2GExciqp","iwzGk5IhmG","RzaZAtlILt",
+"FGzgp5Mg9r","CdyBVv8yFN","FhtglFcWrW","KsjRKaDGtS","1j5L8uTacx","dmoS7JKWYR","C2IrcCxVEf","lkMUAt59lR","t59lR5Mg9r","Oz8yZ48cHL",
+"cL0aEEdBKc","uupzkzmLYD","uAWypogLgc","IBe8ko8Uyd","45cIH9XyT9","lCMxytuDyS","uvf7A5VZjS","CqqaDix74r","gdQsSJJs5m","vLsmS0Kyfs",
+"CK5W7VerEA","QnJ1SK20wK","FxX9qQssNC","ciuWzciuWz","YjB9tVIlwP","Zv7z0RmDcr","AIYUui7WMQ","n8pJ9zqH0W","NcICAuupzk","AkKTkd7vjM",
+"8cVD3zHF1q","WPmlxKr8ys","NOHsz48cHL","nnP8oFGzgp","t59lRJ2mQi","StlDJYOfrY","AmdQdBpYhV","o8UydHzZT8","zHF1qFVMxo","24ARFVNCPd",
+"POUYSMojnP","h1zcHG1RhS","iB08l7Ow5C","Ul4a1sx5Gl","CxVEfMezSW","0ao3lIRh48","45cIH0YAGH","RzaZAsx5Gl","EdBKc0PktI","m4bxUQClRL",
+"pmeCdyvOMI","oVQp6lXFOB","tl72WGXdoH","MmsIoxXTI4","Oz8yZoQ87r","64s8N3weIF","QClRLtuDyS","okgRifFDrJ","K20wKm4bxU","WPmlx3weIF",
+"BGaQYYw2oU","QnJ1SFGzgp","Ta8f6FLsph","TXQ0ZpAhR1","kZANm6AFT0","lCMxyC2Irc","FLsphogLgc","6AFT0hUTw7","MaJQszQt6Q","SbRYy2TRI7",
+"Mm8siVLTy6","Z4I1vnlaBy","5ZaEz0YAGH","POUYSFjHXR","MmsIo9XyT9","L7cGcs7Mxk","d7vjMoVQp6","rz7UtGSQwj","0YAGHNAFuw","8cVD3dhSuH",
+"i3pyd6AFT0","v8yFNNcICA","v1Hln6AFT0","he9IAZhwG1","xciqp64s8N","Ul4a1ZzJHW","taOXK9y4lw","LDk6fBpYhV","5nmWvfLNg8","Ss0ZuMGlTF",
+"cmXIXdQ586","48cHLMmsIo","8cVD3gdQsS","8xEKz9rlg9","t98iWHfyNQ","UlU3MRmDcr","AkKTk8cVD3","1v5hHlpF6W","RACujCqqaD","Kr8ysMaJQs",
+"W3VFH0Wr5y","hUTw77fsYM","jS1ajYh1hF","tAOsrBGaQY","LbRTHAIYUu","XyPZNjiVBP","QnJ1SvOqCE","JIqXiciuWz","DG4sTrz7Ut","pvgjSWPmlx",
+"Oz8yZkB5nP","jeskSMojnP","B3qem9y4lw","8RCUABCxeC","IRh48HP433","VjCZqlH1kt","t98iWa00b5","In3NSSmGzv","TwanoCfgr3","Q6LixIn3NS",
+"x3LDeSmGzv","AOgEeFcWrW","a00b5G1RhS","FxX9q0MR5X","bgJAzFcWrW","G1RhSiKqhr","vLsmSVerEA","0h1b1In3NS","uPX7G8cVD3","QbxXcrhl0J",
+"QbxXctaOXK","gtCA5M3zXL","EoToPb29RJ","uQIczGrDg7","QWxoTfFDrJ","7lUXZ9y4lw","SWfou7Ow5C","atef245cIH","HlUbFt98iW","7lUXZzHF1q",
+"HP4331v5hH","aL6AJuvf7A","WPmlxJ2mQi","FwEJzsoy9t","48cHLjtn0X","Kr8ysY1mC0","vOqCEECMvU","lsQGomz8gx","jeskSJ2mQi","14FLRlXFOB",
+"lkMUAb29RJ","JJs5m16lHc","lkMUAciuWz","IRh48uJScX","FLsphSs0Zu","JRJQBTCgPp","dQ586iqv4k","a00b5XyPZN","guMb8IKxdL","vLsmSQworu",
+"JRJQBUvlv4","rKDLJuJScX","8U2nUMezSW","AkKTknFqik","xXTI4SmGzv","yEfy9lViBv","16lHc24ARF","sqVrfWMiS3","vOqCENxx9V","hE1QlQChxs",
+"WaWsvbgJAz","QnJ1SReKEW","faHirVerEA","hYBCKdhSuH","pWiOsuoStw","FGzgp7hyVv","Ul4a1RkQke","TwanoLewvM","C2IrcWMiS3","Mm8sivkCHH",
+"HP433brhlQ","KsjRKdpe1v","WreyPFFDui","sx5GllsQGo","uN6r38FmFH","5VZjS5drc6","BGaQYJ2mQi","0BmCy8xEKz","QssNCrhl0J","yvOMI8U2nU",
+"Kr8ysGrDg7","dQ586uN6r3","IRh48ZJTXH","WmadAlH1kt","s93MlReKEW","POUYSFPfSE","tlILtuJScX","POUYSzQt6Q","KsjRKDQimp","Yf2Ecs4786",
+"AOgEeWPmlx","ZhwG1sx5Gl","In3NSLewvM","VjCZqMkgy8","F6PT2DLhzM","fcJOynlaBy","tvdkDJkzUn","t59lRFjHXR","0MR5XWmadA","Cfgr39iGoT",
+"Kr8ys2TRI7","MK07Y0Wr5y","WmadAgf8rI","fmIK19y4lw","FwEJzuZPqg","n8pJ9NAFuw","WPmlx64s8N","lH1ktUlU3M","DQimpzz4ZU","X6PindQ586",
+"J2mQidmoS7","VLTy645cIH","WaWsvNcICA","zHF1qCK5W7","RBhp00BmCy","h1zcHUmaEv","atef24QMc9","VLTy6a00b5","cShY2B3qem","qUJMdeuZA5",
+"Chuy3i7WMQ","VjCZqpAhR1","pT8wuRmDcr","v2eC3fcwDa","NAFuwRmDcr","0PktIhUTw7","P6bcgb29RJ","JkzUniqv4k","ZUnqt8RCUA","2hEEUuAWyp",
+"s4786GSQwj","X6Pin7fKYU","zqH0WlweGy","kB5nP618Di","HP433uoStw","BFkb8SWfou","WPmlxt59lR","s93Ml618Di","KZamHFNYIM","y94nwxciqp",
+"AkKTkTCgPp","h1zcHfLNg8","JIqXifcJOy","l83UdblLA9","16lHcUvlv4","ZUnqtfcJOy","okgRi45cIH","MmsIorhl0J","qUJMdVjCZq","MaJQshSSvQ",
+"tuDySBFkb8","LDk6fFPfSE","Y1mC0MGlTF","gdQsSd7vjM","sqVrf5IhmG","JJs5mFFDui","uN6r3rKDLJ","uTacxaL6AJ","Waim6WreyP","FFDuisx5Gl",
+"8cVD3QWxoT","tjQxsJkzUn","AIYUuAOgEe","Kr8ysyofH3","cmXIXMmsIo","0h1b1UmaEv","Cfgr3RpBQm","lXFOBXflUq","Zv7z0Twano","JXljWiwzGk",
+"EoToPrz7Ut","AOgEemX2GE","FhtglfLNg8","RpBQmHfyNQ","NhXdu8hJdt","lXFOBgtCA5","ZJTXHL7cGc","FcWrW7X3uy","SbRYyzY1GY","FVMxo4W0Tl",
+"QbxXcQWxoT","ni2v1ZUnqt","Ul4a1jeskS","jiVBPni2v1","SWfouuLtKs","B3qemSs0Zu","3otm6zz4ZU","lkMUAKASQ8","Yh1hFYOfrY","fqypyGXdoH",
+"Vprf2Qworu","WDVWJ2TRI7","azIWp2Nslm","Nxx9Vfqypy","No0QbbZLvS","8U2nUK20wK","O3iyQHRxd8","Yf2EcIKxdL","IBe8k14FLR","VjCZq0BmCy",
+"wiHrZyToGW","8xEKzcL0aE","soy9tiB08l","ZzJHWlkMUA","POUYSlsQGo","ix74rRpBQm","Uvlv4pFrrl","Mm8siM6qcG","jS1aja00b5","dhSuHSjskQ",
+"yluBx45cIH","RzaZAn1pmO","HfyNQpT8wu","RpBQm8U2nU","cL0aEZJTXH","n1pmOMGlTF","s4786NcICA","BCxeCFVMxo","fFDrJIRh48","FhtglBGaQY",
+"QClRLtlILt","zFgtBMojnP","xciqpa00b5","VLTy6dQ586","mX2GEFPfSE","oGu6xsx5Gl","lm0pDsuY4x","RsQUqFVMxo","0KyfsFPfSE","RzaZAiKqhr",
+"7lUXZNcICA","QChxsOHaBz","Cp3mZydG8U","oVQp6l83Ud","tlILt9rlg9","nnP8o1v5hH","y94nwVNCPd","1j5L8vkCHH","VBjhzYh1hF","DQimpzQt6Q",
+"t98iWoGu6x","pAhR1NAFuw","MezSWCdyBV","taOXKGWqqX","AgJHQpmeCd","MK07YpmeCd","gjUTuqUJMd","BpYhVyluBx","WaWsvd7vjM","rhl0JaDGtS",
+"2hEEUulk41","lkMUA0Wr5y","MK07YRmDcr","8RCUAuTacx","9XyT97fsYM","fmIK1gjUTu","1LB1LWaWsv","QssNC2ZHdk","HzZT82hEEU","WPmlxaL6AJ",
+"VIlwPBpYhV","xXTI4fqypy","Dz1R3oVQp6","RsQUq5drc6","Waim6P6bcg","pWiOsfLNg8","zbIYYfaHir","K4GS8DcpWB","tjQxsjSjS3","i3pydXflUq",
+"FwEJzECMvU","8hJdtuoStw","EoToPWmadA","5IhmGcQOnv","7lUXZ1LB1L","wDajXt98iW","3otm6Ul4a1","FFDui48cHL","NAFuwazIWp","WreyPfFDrJ",
+"W3VFHZzJHW","fcwDaWmadA","7lUXZlpF6W","2NslmK4GS8","DcpWBRBhp0","B3qemQbxXc","jtn0XSWfou","iqv4kO3iyQ","TwanoVjCZq","4dEz6EdBKc",
+"uQIczHzZT8","tl72WZuDtD","W3VFHbrhlQ","Z4I1vrKDLJ","euZA5X6Pin","TXQ0ZNhXdu","Zv7z0qaofN","Uvlv4uQIcz","ZUnqtZUnqt","uN6r3QChxs",
+"tAOsr0h1b1","b29RJkB5nP","9iGoTmz8gx","NOHszuPX7G","lViBvuN6r3","uAWypgjUTu","8RCUAydG8U","OUYuF7X3uy","1v5hHYf2Ec","rKDLJG1RhS",
+"zY1GYm4bxU","lCMxy6q6L9","ydG8U5Drn0","yofH3cQOnv","IKxdLFNYIM","QworuvLsmS","aez9ydjsrv","h1zcHdhSuH","Q6hMCd7vjM","rhl0JqUJMd",
+"i3pyd0ao3l","AXpwEBFkb8","Ss0ZuhE1Ql","Q6LixBbwgA","29QAzuN6r3","ZuDtD5Mg9r","No0QbDz1R3","oGu6xpiJSk","HRxd8suY4x","StlDJ0MR5X",
+"FVMxocShY2","oVQp6QnJ1S","dmoS71LB1L","iqv4k4W0Tl","4QMc9OxWIH","xReec7lUXZ","uZPqg5ZaEz","SbRYyl83Ud","AmdQdQnJ1S","2ZHdk5drc6",
+"i3pydFwEJz","kB5nPMm8si","fmIK1kB5nP","BFkb8brhlQ","FGzgppWiOs","P6bcgIn3NS","9XyT9xReec","AXpwENhXdu","NhXdu6q6L9","5drc63weIF",
+"kZANmCNHmv","pmeCd0MR5X","yofH3uLtKs","uJScXlm0pD","NAFuw580YD","yToGWvOqCE","48cHL6AFT0","TXQ0ZW7cTs","5VZjSM3zXL","QbxXcuLtKs",
+"45cIHpAhR1","45cIHt98iW","taOXKbrhlQ","0Wr5yyofH3","ECMvUP6bcg","QssNCBpYhV","9y4lwbZLvS","Vprf2zQt6Q","RACujQnJ1S","FjHXRSmGzv",
+"rz7UtZ4I1v","Twano48cHL","GSQwja00b5","8FmFHVjCZq","i3pydrKDLJ","uJScXGWqqX","prNT6v8yFN","l83Ud6AFT0","ZhwG18hJdt","Vprf2iB08l",
+"Cp3mZs7Mxk","yluBxJXljW","VjCZq580YD","F6PT2AIYUu","3otm6P6bcg","BGaQY7hyVv","5VZjS6AFT0","Pb1paqQxHP","Oz8yZStlDJ","5drc6FVMxo",
+"Y1mC0pmeCd","jzUqRGXdoH","blLA9yofH3","lj07QDz1R3","AOgEe2Yz7E","Vprf22DREs","D6rByni2v1","WmadAFPfSE","tlILtAIYUu","IBe8k7Ow5C",
+"IjTwPOz8yZ","7lUXZAmdQd","YOfrYiB08l","HlUbFsx5Gl","jfREuStlDJ","hYBCK9eoRc","lweGyjSjS3","sx5GlPOUYS","VIlwPZhwG1","Kr8ys5Mg9r",
+"h1zcHe6e4z","StlDJDQimp","iKqhrVjCZq","tuDySM6qcG","SbRYygdQsS","qaofNfFDrJ","jfREuMojnP","WDVWJtl72W","azIWpvLsmS","DLhzMhSSvQ",
+"lViBv6AFT0","0Kyfsgf8rI","AgJHQZJTXH","ru4UGjSjS3","suY4x0Wr5y","gIYvEDz1R3","lXFOBFVMxo","0MR5XzFgtB","lXFOBzz4ZU","MezSW5drc6",
+"5Mg9rfqypy","wiHrZlXFOB","hUTw7VjCZq","d7vjMoQ87r","7hyVvlkMUA","wiHrZOz8yZ","kB5nPuPX7G","F6PT29iGoT","sqVrfGXdoH","rz7Utuupzk",
+"ECMvUZhwG1","M6qcGn1pmO","sqVrf7hyVv","5Mg9rfFDrJ","nlaByDQimp","SbRYyLbRTH","Zv7z0POUYS","MojnPZv7z0","xReecJ2mQi","pv0i75nmWv",
+"QssNCVBjhz","POUYSsx5Gl","Ss0ZuuoStw","cQOnvHP433","Q6hMCL7cGc","9iGoTpFrrl","h1zcHMezSW","CIShGzqH0W","618Di2Yz7E","n1pmOZhwG1",
+"F6PT2Rxrsm","1v5hHZuDtD","07n1cIKxdL","ulk41Q6Lix","WDVWJK4GS8","M3zXLRkQke","hi5X7ksJby","24ARF0MR5X","POUYSQWxoT","dpe1vJIqXi",
+"5drc6uoStw","OUYuFrhl0J","GWqqX5Drn0","d85a90Kyfs","tl72WSjskQ","zmLYD2Nslm","CqqaDJ2mQi","QYxC0Dz1R3","9XyT9ZUnqt","FjHXRn8pJ9",
+"2Yz7EK4GS8","NOHszWaWsv","zz4ZUQ6hMC","8FmFHm4bxU","Oz8yZbZLvS","dQ586LDk6f","gdQsSuZPqg","QssNC6AFT0","QnJ1S0BmCy","Mkgy8Twano",
+"v2eC3FcWrW","ksJby4W0Tl","uoStwfcJOy","8TxD7NOHsz","1LB1L24ARF","aez9yMK07Y","K4GS8v1Hln","JJs5m8RCUA","oQ87rVLTy6","LewvMG1RhS",
+"9iGoTjfREu","b29RJFNYIM","DQimp0MR5X","fmIK1CxVEf","8xEKzcQOnv","uAWypyofH3","nFqikwDajX","n1pmOVNCPd","FFDui0Wr5y","0MR5XS77LH",
+"ogLgcOUYuF","pFrrlaDGtS","ni2v1wiHrZ","ni2v1HRxd8","7fsYMOUYuF","XflUqK4GS8","iB08lcmXIX","nFqikpAhR1","XyPZNFGzgp","d85a99iGoT",
+"5Drn0dQ586","XyPZN0h1b1","t59lRJJs5m","9iGoTmX2GE","1j5L8XflUq","BGaQYuQIcz","M6qcGhUTw7","bgJAzMaJQs","7Ow5C5Drn0","BFkb8GrDg7",
+"xciqpMGlTF","BFkb8Kr8ys","LDk6fSs0Zu","GXdoHi7WMQ","5Drn0zqH0W","iKqhrG1RhS","16lHcaL6AJ","G1RhSThjNn","7fKYUuZPqg","zQt6QEoToP",
+"BGaQYHfyNQ","tlILtFcWrW","HfyNQrz7Ut","FwEJzt59lR","Q6hMCpFrrl","Ul4a1euZA5","h1zcHVBjhz","uoStwVjCZq","5iGN56AFT0","RmDcrtaOXK",
+"S77LH8U2nU","hYBCKuvf7A","Kr8yss93Ml","9XyT9AmdQd","Z4I1v4dEz6","QClRLk85Ae","Mkgy8zz4ZU","64s8N2Nslm","6AFT0lsQGo","soy9tCp3mZ",
+"atef2WMiS3","tlILtcShY2","0h1b13otm6","wiHrZJkzUn","vkCHHlViBv","4W0TlFNYIM","lsQGouQIcz","MGlTFni2v1","KASQ8UmaEv","FPfSEFcWrW",
+"618DizFgtB","euZA5xXTI4","07n1cGSQwj","HRxd8C2Irc","FcWrW7hyVv","7fsYMZzJHW","P6bcguQIcz","uTacx5nmWv","8xEKzjSjS3","l83Ud24ARF",
+"U3yw5W3VFH","tjQxsQYxC0","NhXdu5drc6","5IhmGyToGW","xReecaDGtS","AkKTkWMiS3","ciuWzuAWyp","GSQwjcQOnv","AXpwEyvOMI","ogLgcyofH3",
+"2ZHdkZJTXH","gdQsSZ4I1v","fqypyhi5X7","iqv4kQnJ1S","K4GS8JKWYR","2Yz7EFxX9q","ni2v1uPX7G","v2eC3JkzUn","jS1ajRpBQm","CdyBVFnPFB",
+"cShY2zz4ZU","TCgPpgtCA5","mX2GEtl72W","DG4sTsoy9t","AXpwE8FmFH","Mm8sigjUTu","P6bcgHzZT8","SWfou5Drn0","FVMxoxciqp","StlDJ9y4lw",
+"ydG8UgdQsS","ThjNnciuWz","RpBQmI7p2a","UlU3MPYBf4","OUYuFBbwgA","rz7UtKsjRK","7ku1p1v5hH","xReecyluBx","AkKTkSs0Zu","I7p2aOUYuF",
+"24ARFlj07Q","hYBCKSmGzv","tAOsrVLTy6","JJs5mMkgy8","C2IrcReKEW","MK07YiB08l","DQimpCIShG","lXFOBNxx9V","HfyNQFVMxo","k85AecQOnv",
+"lm0pDIjTwP","aez9y16lHc","EOE1oiB08l","y94nwS2Dfu","vkCHHB3qem","pWiOsWaim6","55rfBFxX9q","5Mg9rpv0i7","Z4I1vuPX7G","ZhwG1pT8wu",
+"9XyT97hyVv","okgRiGXdoH","gjUTuuAWyp","24ARFnnP8o","djsrvU3yw5","DLhzMd85a9","HzZT8he9IA","5nmWvCfgr3","i7WMQfqypy","aFFssEOE1o",
+"fFDrJVBjhz","3weIFIKxdL","t98iWVNCPd","BbwgASmGzv","EdBKcFcWrW","uupzkGv3Fq","RpBQmMmKGJ","Q6hMCoGu6x","piJSkDG4sT","GWqqXzY1GY",
+"JkzUnuQIcz","X6Pinulk41","ydG8U7fKYU","9GXkXRkQke","uoStwVLTy6","ru4UGru4UG","2TRI7prNT6","pmeCdh1zcH","Qworu8xEKz","FVMxol83Ud",
+"uZPqgIKxdL","uQIczxXTI4","8hJdtiqv4k","5IhmGNOHsz","FwEJzSjskQ","lm0pDjtn0X","7fKYUzHF1q","yEfy9v2eC3","2TRI7fFDrJ","BFkb8LDk6f",
+"7lUXZd85a9","CNHmvoGu6x","WDVWJzqH0W","lm0pDFhtgl","QssNCh1zcH","bZLvS48cHL","lCMxynFqik","Nxx9V8RCUA","lH1ktGWqqX","uN6r3Qworu",
+"mz8gxydG8U","K20wKCfgr3","C2IrcIBe8k","uoStwgdQsS","RACujtvdkD","4QMc9tuDyS","i3pydRzaZA","CK5W7QClRL","FwEJzydG8U","16lHcZJTXH",
+"yluBxGrDg7","iKqhr2Nslm","QssNCv2eC3","cShY2pT8wu","QClRLzbIYY","yofH3S77LH","zz4ZUgdQsS","zmLYDBGaQY","W3VFHfqypy","gtCA5WDVWJ",
+"GXdoHYw2oU","euZA5s7Mxk","NAFuwzqH0W","mX2GECK5W7","bZLvSrKDLJ","Rxrsmhi5X7","Q6hMCuN6r3","b29RJZv7z0","uvf7ATXQ0Z","SjskQxciqp",
+"O3iyQDG4sT","QssNC14FLR","nFqikFwEJz","M3zXLlH1kt","5ZaEzy94nw","ni2v1aL6AJ","LDk6fNcICA","hE1QlgtCA5","RpBQmYh1hF","3otm6qQxHP",
+"ZuDtD9GXkX","tAOsr55rfB","7Ow5Ci3pyd","8xEKzv1Hln","618DijSjS3","lweGyRpBQm","5IhmGP6bcg","7fsYM3otm6","AmdQd6AFT0","DcpWBXflUq",
+"pvgjSZzJHW","D6rByd7vjM","qaofNPYBf4","uQIczEdBKc","OUqFMogLgc","AOgEe0PktI","tAOsrFVMxo","14FLRi7WMQ","lm0pDhYBCK","fmIK1aFFss",
+"7fsYMprNT6","07n1cYh1hF","BFkb8JIqXi","iqv4kwDajX","pFrrl3otm6","SbRYyPb1pa","t59lRJKWYR","rhl0JbrhlQ","e6e4z16lHc","tl72WsuY4x",
+"zY1GYyvOMI","48cHLGSQwj","Yh1hFIKxdL","xXTI4rKDLJ","DLhzMF6PT2","WmadAiqv4k","L7cGcuoStw","CdyBVIBe8k","TXQ0Z0Wr5y","KASQ8Dz1R3",
+"LbRTHlweGy","VNCPd618Di","HRxd8ZhwG1","NhXduyToGW","U3yw55nmWv","Cp3mZlXFOB","jtn0XStlDJ","CdyBVQbxXc","y94nwpWiOs","kB5nPprNT6",
+"M6qcGatef2","EOE1oatef2","v2eC32Yz7E","uAWyp9y4lw","2Nslm8TxD7","lweGyd7vjM","WmadARzaZA","BFkb8TCgPp","Ta8f6VIlwP","9rlg9t98iW",
+"HlUbFNcICA","Vprf2618Di","CIShGciuWz","JXljWxReec","okgRiwDajX","F6PT2lH1kt","fcJOyYh1hF","uQIczLewvM","CNHmvCqqaD","uN6r3s93Ml",
+"rhl0J55rfB","GWqqXJkzUn","y94nw7hyVv","7Ow5CIn3NS","VIlwPVjCZq","SbRYyD6rBy","hUTw7t59lR","iqv4kTwano","BpYhVzHF1q","bZLvSO3iyQ",
+"SmGzvt59lR","uAWyplj07Q","WmadAAIYUu","a00b5jeskS","Mkgy8GXdoH","oVQp6sqVrf","AIYUutvdkD","SbRYy8TxD7","9GXkX3otm6","ni2v1HzZT8",
+"lkMUASs0Zu","CK5W78FmFH","QClRLxciqp","hYBCKpiJSk","QClRLuJScX","FxX9qJJs5m","OUYuFpWiOs","0BmCy580YD","JXljWLewvM","RmDcrPb1pa",
+"fFDrJazIWp","XyPZNLbRTH","FwEJzZuDtD","uTacxhE1Ql","HP433cmXIX","JkzUnJkzUn","tvdkD1LB1L","FNYIMblLA9","a00b51v5hH","VBjhzbZLvS",
+"ZhwG1K20wK","piJSkJIqXi","atef2iwzGk","xciqp4QMc9","MezSWWPmlx","tAOsr2DREs","8RCUAuoStw","djsrvtl72W","zz4ZUFxX9q","KsjRKfFDrJ",
+"mz8gxZJTXH","8xEKzfcwDa","fcwDaBGaQY","TXQ0ZUlU3M","zY1GYuJScX","fqypygf8rI","8xEKz14FLR","d7vjMiwzGk","DLhzMMGlTF","lXFOBsoy9t",
+"7Ow5CqQxHP","F6PT26q6L9","e6e4zo8Uyd","yEfy99eoRc","uN6r3QClRL","v1HlndmoS7","iqv4kJRJQB","Cp3mZWreyP","rz7Ut1j5L8","MaJQs64s8N",
+"uupzkZUnqt","ydG8U2Nslm","lXFOBNAFuw","TXQ0ZRsQUq","jS1ajnFqik","9eoRcyToGW","vLsmS8TxD7","07n1cqUJMd","9y4lwWaim6","29QAz5Mg9r",
+"Yw2oUJRJQB","oQ87rVjCZq","tuDyS8RCUA","xciqpo8Uyd","XyPZNVNCPd","ZzJHWMojnP","ZUnqtUlU3M","CIShG6q6L9","pFrrld85a9","a00b5jSjS3",
+"9GXkXrhl0J","wiHrZfFDrJ","5Drn0IBe8k","he9IAVIlwP","AkKTkMm8si","VIlwPBbwgA","S2Dfu9eoRc","aL6AJuLtKs","uTacxFNYIM","x3LDeni2v1",
+"Vprf2Ta8f6","UmaEvL7cGc","QChxsyluBx","hSSvQdmoS7","8hJdtt98iW","S77LHOUYuF","JRJQB0BmCy","MGlTFVLTy6","MmKGJDLhzM","d85a9gjUTu",
+"5Drn0P6bcg","sx5Glmz8gx","6q6L9zmLYD","Kr8ysOUqFM","FFDuiFFDui","uoStwVBjhz","LDk6fix74r","2Nslm14FLR","zqH0Wx3LDe","VjCZqfmIK1",
+"MaJQsSs0Zu","CNHmvix74r","Ta8f6RzaZA","BbwgA8xEKz","jtn0XuZPqg","NhXdufqypy","IKxdLaDGtS","5drc6GSQwj","OxWIHuupzk","Cp3mZhYBCK",
+"0KyfsWreyP","ZzJHWuZPqg","pv0i7xciqp","Q6LixtvdkD","Ul4a1x3LDe","uAWyp9GXkX","fqypyUmaEv","LDk6fwDajX","D6rBy618Di","RzaZACp3mZ",
+"IRh48OxWIH","wiHrZiKqhr","euZA52Yz7E","5ZaEzQnJ1S","cL0aE7hyVv","aL6AJRACuj","taOXKDcpWB","2hEEUZzJHW","aFFssM3zXL","VBjhz580YD",
+"pFrrlyToGW","J2mQiuupzk","pT8wuAgJHQ","uoStwhe9IA","EoToPguMb8","CqqaDpvgjS","VjCZqulk41","CNHmvfmIK1","AXpwEfaHir","ZzJHWOz8yZ",
+"BCxeC3weIF","sx5Gl9GXkX","Vprf2TXQ0Z","FwEJztlILt","Q6hMCSjskQ","VLTy6BpYhV","9rlg9BbwgA","PYBf4zz4ZU","zHF1q2Yz7E","kZANmuPX7G",
+"xciqpix74r","y94nwPYBf4","7lUXZLewvM","bgJAz45cIH","s7MxkhYBCK","jS1ajgjUTu","oGu6xNcICA","vLsmSpiJSk","lViBvCfgr3","blLA91LB1L",
+"yToGWgf8rI","CIShGhE1Ql","GSQwjCxVEf","0h1b1OxWIH","bZLvSTXQ0Z","ThjNn7ku1p","AOgEe3weIF","v8yFN8TxD7","QssNCRkQke","tvdkDuupzk",
+"yofH3TXQ0Z","vkCHH0ao3l","lsQGoBCxeC","AmdQdTwano","jSjS3W3VFH","OxWIHY1mC0","7fsYMfaHir","jfREuv1Hln","SjskQPOUYS","jtn0XyEfy9",
+"RpBQmBGaQY","uupzk5drc6","ReKEWhYBCK","RpBQmGWqqX","prNT6sqVrf","D6rBy8TxD7","tuDySTXQ0Z","0PktIaDGtS","4W0TljS1aj","lCMxytlILt",
+"55rfBWDVWJ","pAhR1XyPZN","2Yz7ErKDLJ","BGaQY4dEz6","OUqFMaFFss","ReKEWCNHmv","8xEKz16lHc","tlILtGWqqX","bZLvS7hyVv","UmaEvFGzgp",
+"EdBKciqv4k","l83Udd7vjM","CqqaDydG8U","0PktIQbxXc","W7cTs0ao3l","StlDJtvdkD","WaWsv0Kyfs","C2IrcIjTwP","hUTw7Ta8f6","MmsIolXFOB",
+"XyPZNDcpWB","2Yz7EtAOsr","7X3uysx5Gl","RACujO3iyQ","hYBCK6AFT0","m4bxUlm0pD","RxrsmnlaBy","jSjS3MaJQs","v8yFNHzZT8","J2mQiVLTy6",
+"BbwgAZuDtD","IjTwPpAhR1","Chuy3v2eC3","ZJTXHOHaBz","fLNg8tl72W","5ZaEzQbxXc","JIqXiWPmlx","gdQsSpAhR1","Uvlv4W7cTs","NAFuwtAOsr",
+"QWxoTPOUYS","uQIczDz1R3","DLhzMIjTwP","taOXKQworu","fcwDapv0i7","uupzkhi5X7","NOHszrKDLJ","RACujFnPFB","rKDLJAXpwE","hSSvQYjB9t",
+"azIWpSjskQ","ulk41AXpwE","soy9t0BmCy","Yf2EcZJTXH","ReKEWP6bcg","JXljW5IhmG","GrDg7t59lR","fLNg8zQt6Q","0BmCynlaBy","SWfouFVMxo",
+"IRh48zFgtB","VerEAuAWyp","vLsmSK4GS8","J2mQirz7Ut","fLNg8ZzJHW","Yw2oULbRTH","OUYuFNhXdu","NhXduBGaQY","zmLYDtAOsr","uQIczlCMxy",
+"0BmCyNxx9V","1j5L8tjQxs","lsQGoAIYUu","pWiOsGrDg7","FFDuiGXdoH","UmaEvzFgtB","OHaBzLewvM","ReKEWgf8rI","Ul4a1IjTwP","5ZaEzfaHir",
+"O3iyQ3otm6","i3pyd5Namm","45cIHCK5W7","kZANm5iGN5","ZJTXHvOqCE","pWiOsI7p2a","2ZHdkfqypy","ReKEW8U2nU","X6PiniB08l","QYxC0QChxs",
+"rz7Utv8yFN","uAWypCxVEf","fmIK1lCMxy","iKqhr9y4lw","uvf7A0YAGH","zqH0WyofH3","KZamHU3yw5","KsjRKtAOsr","M6qcGHzZT8","hUTw7UmaEv",
+"CxVEfv1Hln","AOgEeS2Dfu","v8yFN7fsYM","580YDFVMxo","hi5X7ciuWz","nlaByJKWYR","Pb1paAOgEe","pWiOsjiVBP","ciuWz24ARF","lViBvRxrsm",
+"ZuDtDGrDg7","dmoS76AFT0","BbwgAjSjS3","qUJMdqQxHP","48cHLa00b5","pvgjSMGlTF","OHaBzb29RJ","SWfou0MR5X","XyPZN6q6L9","prNT6Ul4a1",
+"Dz1R3BCxeC","MK07YhE1Ql","Mkgy8RBhp0","Z4I1vpv0i7","8cVD3n8pJ9","DcpWB5Mg9r","EoToPQYxC0","tlILt64s8N","nFqikX6Pin","AOgEepvgjS",
+"7lUXZAIYUu","No0QbBCxeC","ThjNn29QAz","IjTwP6AFT0","aDGtSdQ586","FjHXRuZPqg","BGaQYhE1Ql","Yw2oUZJTXH","8cVD3i3pyd","uQIczB3qem",
+"Chuy3FNYIM","uoStwjeskS","FNYIMVBjhz","uN6r3gtCA5","soy9t0Kyfs","QWxoTReKEW","dpe1vtuDyS","zmLYDfLNg8","rhl0JWaWsv","NhXduVprf2",
+"3weIFMK07Y","Yf2Ecl83Ud","JkzUnRBhp0","VNCPdLDk6f","Mm8siPOUYS","oVQp65Namm","s47867fKYU","ECMvUa00b5","zHF1q24ARF","iqv4kYjB9t",
+"s478645cIH","Kr8ysUlU3M","JRJQBgjUTu","BFkb85Drn0","faHirtjQxs","zz4ZUVprf2","pFrrl2Nslm","Twanolm0pD","d7vjMU3yw5","HzZT8l83Ud",
+"yofH3LDk6f","MmsIoDz1R3","C2IrcpvgjS","VBjhzuAWyp","piJSkFnPFB","pT8wu7lUXZ","UlU3MRsQUq","cL0aE2DREs","QnJ1Srhl0J","Yh1hFL7cGc",
+"L7cGcWDVWJ","5Namm9iGoT","tAOsrn8pJ9","AgJHQ8cVD3","ni2v1Yf2Ec","blLA9gjUTu","BbwgA8FmFH","Cfgr3cmXIX","JkzUnuoStw","rhl0Js7Mxk",
+"55rfBnlaBy","hE1Ql8FmFH","iqv4kuAWyp","5drc6s4786","CxVEfNhXdu","zHF1qt98iW","hE1Qlrhl0J","lweGyM6qcG","tlILtKsjRK","lm0pD5iGN5",
+"v2eC3KASQ8","VNCPdoQ87r","O3iyQ580YD","OUqFMi3pyd","s4786cmXIX","U3yw5MezSW","pmeCdatef2","580YDokgRi","S77LHBpYhV","1LB1LvLsmS",
+"FjHXRcShY2","gjUTuuPX7G","xciqpJ2mQi","tAOsrFPfSE","Nxx9VChuy3","In3NSDG4sT","OUqFMD6rBy","5Drn07lUXZ","NOHszdjsrv","prNT6uAWyp",
+"qaofNdjsrv","5VZjSFxX9q","F6PT28U2nU","t59lRd85a9","FjHXR45cIH","tl72W8U2nU","dpe1vRmDcr","tlILtWDVWJ","brhlQtAOsr","Yh1hFCdyBV",
+"jeskSNxx9V","M6qcGKASQ8","5iGN5Y1mC0","o8Uyd8xEKz","XflUquTacx","BpYhVa00b5","0KyfsuJScX","hi5X7XflUq","ECMvUUlU3M","I7p2aFLsph",
+"Y1mC0QYxC0","kZANmlm0pD","RmDcrZJTXH","CxVEfb29RJ","RBhp0pmeCd","2hEEUxXTI4","he9IAuJScX","Qworus93Ml","CK5W7lsQGo","0MR5XiwzGk",
+"wiHrZNxx9V","t98iWRkQke","dQ586k85Ae","RACujRBhp0","uupzk6AFT0","HzZT807n1c","yvOMIWaWsv","s7MxkZzJHW","RACujdmoS7","AOgEeRsQUq",
+"POUYSoVQp6","07n1cS2Dfu","lpF6WhUTw7","Cfgr3VBjhz","OHaBzJkzUn","t98iWNcICA","64s8NtvdkD","0h1b18TxD7","X6PinuTacx","BbwgAfaHir",
+"Chuy3aL6AJ","HlUbFCK5W7","JkzUnCK5W7","Q6Lix0Wr5y","oVQp6FnPFB","ydG8UDz1R3","sqVrfjS1aj","VBjhzokgRi","dpe1v8hJdt","No0QbRkQke",
+"tuDyS2hEEU","RACujjtn0X","m4bxUulk41","jzUqRjzUqR","ZuDtDpvgjS","YOfrYCp3mZ","xReecFFDui","ogLgcaDGtS","W3VFHUlU3M","HRxd8oGu6x",
+"TwanoIjTwP","oGu6xRpBQm","yofH3Yf2Ec","U3yw5ru4UG","5IhmG580YD","Yh1hFcShY2","v2eC3aFFss","ksJby0MR5X","gf8rIGXdoH","ogLgcxReec",
+"euZA5FwEJz","lsQGoFnPFB","VIlwPWmadA","ReKEW7fKYU","BFkb8a00b5","6q6L9nlaBy","RsQUqlm0pD","ksJbyP6bcg","StlDJdhSuH","7fsYMhUTw7",
+"euZA5AmdQd","VjCZq618Di","gjUTulm0pD","ydG8UVNCPd","gjUTuPb1pa","BCxeCkB5nP","EOE1oyToGW","4W0TlWreyP","5Mg9rRACuj","0YAGHWaWsv",
+"EOE1oCp3mZ","1LB1LtuDyS","9rlg9qaofN","RsQUq618Di","zY1GYJRJQB","t59lRQWxoT","RsQUqRkQke","Ss0ZuCfgr3","AIYUuBpYhV","2hEEUJJs5m",
+"xciqpzbIYY","MmsIoJkzUn","RpBQmeuZA5","Yh1hFyluBx","YOfrYatef2","X6PinRzaZA","NAFuwTCgPp","fLNg85nmWv","GSQwjRkQke","7ku1pyvOMI",
+"14FLRJIqXi","4dEz6FPfSE","GWqqXVjCZq","Z4I1vTwano","Chuy3ZzJHW","AIYUu8cVD3","tjQxscmXIX","gjUTuWMiS3","StlDJNhXdu","iwzGkjtn0X",
+"Yh1hFThjNn","TCgPp580YD","SmGzvQ6hMC","JJs5mOUqFM","TCgPpKASQ8","FnPFB580YD","Mkgy8580YD","lH1kttaOXK","FLsphC2Irc","7ku1pNxx9V",
+"ulk412TRI7","jzUqRpvgjS","WmadAciuWz","fmIK1HlUbF","NhXdu9XyT9","MojnP0h1b1","QClRL0Wr5y","Y1mC05VZjS","ECMvUix74r","B3qemFhtgl",
+"oVQp6fFDrJ","RACujuvf7A","jtn0XaFFss","x3LDeFGzgp","wDajXZ4I1v","tuDySDG4sT","GSQwjQYxC0","AIYUus7Mxk","gjUTuFGzgp","No0QbYOfrY",
+"8FmFHK20wK","uQIczYf2Ec","7fsYMWmadA","rhl0J5ZaEz","RACujRsQUq","ksJbyzY1GY","KASQ8pT8wu","lkMUA55rfB","iqv4k9eoRc","sx5Gl6q6L9",
+"MK07Yxciqp","P6bcgFhtgl","uPX7GiB08l","G1RhSguMb8","MmKGJuJScX","9y4lwk85Ae","zHF1qM3zXL","45cIHd85a9","zqH0WFFDui","24ARFD6rBy",
+"DLhzMrz7Ut","jzUqRX6Pin","ZuDtDMmsIo","VIlwPFPfSE","Q6hMCP6bcg","sqVrfWPmlx","lkMUAdpe1v","IjTwPiqv4k","m4bxUcShY2","AmdQd9XyT9",
+"Cfgr3M3zXL","tvdkDNAFuw","8FmFHBbwgA","QnJ1Sn8pJ9","Mkgy8uupzk","24ARFfcJOy","DLhzMD6rBy","FFDuim4bxU","DG4sTQbxXc","UlU3MGv3Fq",
+"TCgPpnnP8o","Q6Lix9iGoT","taOXKNOHsz","d85a9yvOMI","HlUbFJRJQB","s4786Q6Lix","SjskQMojnP","ulk41BFkb8","QbxXclCMxy","CK5W7EOE1o",
+"lXFOBvkCHH","NAFuwsx5Gl","tjQxs1LB1L","IjTwPThjNn","nlaByl83Ud","X6PinJKWYR","JXljWIBe8k","rKDLJU3yw5","yToGWa00b5","5VZjSs7Mxk",
+"i3pyduTacx","Kr8ysMmKGJ","0Kyfshi5X7","07n1c8U2nU","piJSklpF6W","djsrv5drc6","iKqhrqUJMd","WDVWJJkzUn","t59lRfFDrJ","s47865Drn0",
+"cL0aEReKEW","jSjS3lpF6W","IBe8kVprf2","2TRI7StlDJ","FwEJzDLhzM","618DiyvOMI","rz7Uti7WMQ","Q6Lixru4UG","IKxdLCfgr3","yvOMIDG4sT",
+"VerEAIRh48","DG4sTDLhzM","vLsmSzqH0W","BpYhV6AFT0","4dEz6WMiS3","k85AeKsjRK","fqypyyEfy9","Nxx9VprNT6","JKWYR7fsYM","JXljWrhl0J",
+"zFgtBzqH0W","uLtKsOUqFM","FjHXRguMb8","8cVD3Q6Lix","ogLgcVIlwP","P6bcgReKEW","Dz1R3wDajX","MezSWaDGtS","16lHcmz8gx","ogLgcKZamH",
+"HP433yofH3","B3qem5IhmG","0KyfsVNCPd","CxVEf8RCUA","bZLvSBbwgA","sqVrf5nmWv","ni2v10PktI","AgJHQD6rBy","okgRiuupzk","mX2GEqQxHP",
+"t59lRtAOsr","lsQGoDG4sT","CdyBVTXQ0Z","lViBvm4bxU","I7p2agIYvE","lj07Qhi5X7","ECMvUvOqCE","lm0pDt98iW","XyPZNa00b5","zz4ZUuJScX",
+"aez9yRzaZA","M6qcGFhtgl","wiHrZJXljW","WmadAuJScX","x3LDeFhtgl","ZzJHWk85Ae","yEfy9faHir","UlU3MS77LH","2Yz7EUmaEv","o8UydyofH3",
+"GrDg7soy9t","5drc6UlU3M","WaWsvQClRL","Gv3FqChuy3","YOfrY2Yz7E","ru4UGCxVEf","lkMUA5Drn0","HzZT8Nxx9V","gIYvERpBQm","taOXKhe9IA",
+"y94nw7Ow5C","aez9ypmeCd","gjUTuhUTw7","NhXduDG4sT","Yw2oUzqH0W","No0QbpiJSk","S2DfuyToGW","jeskS9y4lw","pWiOs6AFT0","s7Mxk4dEz6",
+"Ss0ZubZLvS","FxX9qSjskQ","48cHLFcWrW","zQt6QiB08l","QYxC0lH1kt","wDajXD6rBy","55rfBxXTI4","qUJMduoStw","7X3uys4786","tuDySrhl0J",
+"e6e4zlCMxy","RBhp0QbxXc","pv0i7pT8wu","aL6AJ5Namm","dpe1vO3iyQ","AmdQdDcpWB","LewvMn1pmO","vLsmSYjB9t","fcJOyCfgr3","faHirpT8wu",
+"n8pJ9W3VFH","y94nwNxx9V","7fKYUix74r","BFkb88RCUA","vkCHHECMvU","euZA5DcpWB","Chuy3sqVrf","CdyBVVBjhz","24ARFtuDyS","soy9tL7cGc",
+"uJScXEdBKc","9eoRcHRxd8","bZLvSd85a9","0YAGHvkCHH","tl72WM6qcG","RkQkeEOE1o","ZhwG1PYBf4","RBhp0Qworu","FhtglhUTw7","WmadA5ZaEz",
+"vLsmSSjskQ","lsQGo45cIH","v8yFNrKDLJ","QClRL5Drn0","YjB9tb29RJ","bgJAzUl4a1","ZuDtDIjTwP","QClRLfLNg8","mz8gxMkgy8","MmsIoAgJHQ",
+"LDk6fs4786","gIYvE5drc6","CxVEfQ6Lix","SjskQCdyBV","zmLYDeuZA5","ReKEWM3zXL","tuDySydG8U","Ul4a1i7WMQ","cQOnv7X3uy","zY1GYRmDcr",
+"ydG8UHzZT8","Mm8siTXQ0Z","atef2tl72W","VerEAFcWrW","v8yFNJJs5m","iwzGkyvOMI","NAFuwtlILt","0Kyfsni2v1","Y1mC08U2nU","lCMxylj07Q",
+"Cfgr324ARF","7Ow5Cm4bxU","cmXIX5nmWv","XyPZNTCgPp","5VZjSfcwDa","iwzGkfFDrJ","3otm6MmsIo","rhl0Jb29RJ","2Nslm8FmFH","hi5X7Yh1hF",
+"1v5hHydG8U","CxVEfbgJAz","LDk6fpv0i7","ciuWzprNT6","FxX9qFhtgl","QWxoTLDk6f","FhtglnlaBy","Ul4a1Mkgy8","O3iyQyEfy9","Yh1hFJXljW",
+"U3yw5fcwDa","0MR5XSbRYy","FLsphGrDg7","zFgtBRxrsm","5ZaEzLDk6f","7lUXZMkgy8","MGlTFzHF1q","L7cGcfLNg8","qQxHPMmsIo","tjQxs55rfB",
+"MojnPZJTXH","VLTy655rfB","bZLvSDz1R3","FcWrWMm8si","EdBKcVNCPd","HlUbFPOUYS","SjskQLbRTH","zQt6QDcpWB","UmaEvdhSuH","t98iWuQIcz",
+"0h1b1SbRYy","he9IA1j5L8","G1RhSHzZT8","wDajXzmLYD","WDVWJ7ku1p","16lHcdmoS7","U3yw5rhl0J","AIYUuK4GS8","7ku1pECMvU","ThjNnix74r",
+"MaJQsWaWsv","FFDuizz4ZU","FwEJzMaJQs","iqv4kS2Dfu","IjTwPSmGzv","taOXK8RCUA","D6rByU3yw5","2ZHdkQssNC","iqv4k3weIF","Ul4a13weIF",
+"M6qcGzqH0W","hYBCKlm0pD","5nmWvy94nw","Mm8siOxWIH","55rfBoVQp6","DcpWBYf2Ec","VNCPd0PktI","Ta8f68RCUA","PYBf445cIH","guMb8dpe1v",
+"v1HlnGSQwj","580YD8TxD7","lkMUAiB08l","YjB9tx3LDe","KZamHGSQwj","dQ586FFDui","QYxC0FVMxo","i7WMQlpF6W","lH1ktRkQke","aFFssSs0Zu",
+"qaofN5Drn0","EoToP29QAz","tuDySHfyNQ","GWqqXbZLvS","4QMc9VerEA","29QAzBpYhV","gf8rIlpF6W","DQimpsuY4x","1v5hHCNHmv","9XyT9Yh1hF",
+"RBhp0MGlTF","fqypyCfgr3","djsrv7fsYM","7hyVvDz1R3","yofH3MmKGJ","Mm8siIKxdL","UmaEveuZA5","2ZHdkMmKGJ","MaJQsMGlTF","Yf2EcL7cGc",
+"bgJAzS77LH","jfREugf8rI","LewvMVLTy6","FnPFBv2eC3","Mkgy8VLTy6","ciuWzWPmlx","WMiS3ru4UG","I7p2aWaim6","D6rBylpF6W","ogLgcZ4I1v",
+"Vprf2mX2GE","jS1ajlXFOB","o8UydQClRL","2hEEUsuY4x","cmXIXuvf7A","iwzGkFLsph","LDk6fOxWIH","lweGyh1zcH","RsQUq6q6L9","a00b5s7Mxk",
+"NhXduCIShG","TCgPpXflUq","uN6r3XflUq","MojnPDQimp","blLA9lH1kt","JJs5mfqypy","VLTy6BGaQY","ECMvUgf8rI","RkQkeZv7z0","hSSvQtuDyS",
+"ni2v1nlaBy","FhtglhSSvQ","guMb8pT8wu","ogLgcL7cGc","D6rByx3LDe","m4bxUB3qem","9iGoTuQIcz","vkCHHF6PT2","QnJ1SECMvU","7Ow5C8RCUA",
+"k85AeL7cGc","gf8rIl83Ud","gdQsSfFDrJ","8RCUAgjUTu","55rfB1LB1L","SjskQnFqik","1LB1LW7cTs","uZPqgkZANm","CdyBV45cIH","2TRI7i3pyd",
+"GrDg7RBhp0","tuDySdpe1v","NAFuwlCMxy","ydG8UzqH0W","zbIYYIBe8k","brhlQzbIYY","tuDyS29QAz","uPX7GqUJMd","16lHcMmsIo","8hJdtOz8yZ",
+"fcJOyJKWYR","K4GS8J2mQi","3weIFuN6r3","n8pJ9guMb8","TCgPpqQxHP","dhSuHBbwgA","VerEAe6e4z","WreyP9GXkX","FhtglRzaZA","RzaZAIKxdL",
+"I7p2a9XyT9","MojnPFwEJz","s7Mxkru4UG","gf8rIU3yw5","pvgjSIRh48","O3iyQguMb8","ZUnqtVLTy6","WPmlx2ZHdk","uAWypRsQUq","I7p2aAIYUu",
+"lm0pDKASQ8","GWqqX618Di","v1Hlno8Uyd","MGlTFjiVBP","lViBvaDGtS","ciuWz6AFT0","MaJQsatef2","24ARFSWfou","d7vjM5iGN5","Pb1pa14FLR",
+"gtCA5jS1aj","RACujZv7z0","rz7UtjS1aj","tjQxsiB08l","i7WMQguMb8","gdQsSCIShG","aL6AJAOgEe","5drc6e6e4z","0KyfsTwano","Yh1hFOz8yZ",
+"lj07Q0YAGH","hUTw7cQOnv","Waim67fsYM","ydG8UYh1hF","16lHczY1GY","rhl0J5IhmG","Chuy3IRh48","s7MxkVjCZq","qaofNZUnqt","Cp3mZlm0pD",
+"MojnPGWqqX","GSQwjdhSuH","guMb8FnPFB","QChxsOUqFM","B3qemuTacx","dQ586xciqp","OHaBzZJTXH","LDk6fUvlv4","sqVrf2DREs","fLNg85Namm",
+"qUJMdlCMxy","yofH3QClRL","SbRYy1j5L8","aL6AJ2ZHdk","uPX7GFjHXR","Y1mC0OUqFM","Q6Lix55rfB","hE1QltAOsr","TXQ0ZYw2oU","5IhmGwDajX",
+"dhSuHogLgc","VBjhz14FLR","IjTwPGrDg7","U3yw5nlaBy","9XyT9azIWp","8TxD7KASQ8","5nmWvNcICA","tuDySaFFss","8hJdtWMiS3","J2mQigtCA5",
+"TCgPp7fKYU","zqH0Wv1Hln","uZPqgzbIYY","aDGtSFPfSE","atef2yofH3","QWxoTK4GS8","CqqaD7X3uy","AXpwEgtCA5","cmXIXpiJSk","Waim6580YD",
+"0BmCytvdkD","JKWYRDz1R3","OxWIHjeskS","7ku1pMojnP","0h1b1AXpwE","FxX9qhSSvQ","cQOnvHRxd8","MaJQsB3qem","bgJAzYjB9t","NhXdulsQGo",
+"RzaZADcpWB","KZamHJkzUn","dpe1vXyPZN","CxVEflH1kt","Cp3mZTCgPp","taOXKsqVrf","55rfBHlUbF","iwzGkMK07Y","ZuDtD5Drn0","5iGN5k85Ae",
+"X6Pin5nmWv","FxX9qHzZT8","1v5hHSbRYy","C2Irc4QMc9","aDGtS6q6L9","9iGoTt59lR","rz7UtX6Pin","ru4UGWPmlx","3otm6NOHsz","guMb8dhSuH",
+"iKqhruTacx","BpYhVNxx9V","2DREsgjUTu","uQIczzHF1q","48cHLazIWp","MGlTF24ARF","prNT61LB1L","JXljWQChxs","BbwgA0Kyfs","nlaByUlU3M",
+"faHirQChxs","aFFssFnPFB","9iGoTD6rBy","Nxx9VjfREu","s7MxklCMxy","brhlQYOfrY","AIYUuJRJQB","CdyBVFVMxo","8FmFH0PktI","7Ow5CrKDLJ",
+"QClRLuQIcz","FxX9qRkQke","5drc6zbIYY","RpBQmFwEJz","CxVEftuDyS","tjQxsrhl0J","GrDg7SWfou","tuDySL7cGc","s7MxkqaofN","5drc6tuDyS",
+"8xEKzt59lR","TCgPpQ6Lix","s4786rz7Ut","0Wr5yjtn0X","JJs5moVQp6","iwzGkd7vjM","MmsIoTCgPp","0PktIVerEA","EOE1oStlDJ","zY1GYfmIK1",
+"5iGN5mX2GE","aL6AJ1j5L8","7Ow5C5VZjS","BbwgA3otm6","JRJQB9rlg9","rz7Ut5Mg9r","qUJMdLDk6f","JRJQB8hJdt","In3NSMGlTF","RsQUqlpF6W",
+"9rlg9JRJQB","0MR5XU3yw5","FhtgluQIcz","FVMxoVNCPd","7fKYURkQke","YOfrYdpe1v","FwEJzcL0aE","5Mg9rCfgr3","nlaByO3iyQ","v1HlnIjTwP",
+"jSjS3MGlTF","uLtKstlILt","2TRI7kZANm","i3pyd2Yz7E","iqv4kAmdQd","IjTwPatef2","ZzJHWDLhzM","oQ87r8U2nU","b29RJUvlv4","P6bcglweGy",
+"M6qcGt98iW","lsQGowiHrZ","lm0pDni2v1","FLsphGSQwj","J2mQicL0aE","RxrsmcShY2","NcICAK20wK","SjskQECMvU","BCxeCpAhR1","uAWypSbRYy",
+"W3VFH0ao3l","dpe1vhE1Ql","RxrsmjzUqR","djsrvBFkb8","RACuj0h1b1","CxVEfJkzUn","pWiOsIjTwP","ydG8UpvgjS","LewvMQWxoT","G1RhSpv0i7",
+"JKWYRd7vjM","tlILtQ6Lix","Ul4a1ulk41","zz4ZURxrsm","AkKTk7fsYM","qUJMd0h1b1","RACujMGlTF","pWiOsni2v1","S2DfuU3yw5","Oz8yZBFkb8",
+"X6PinMK07Y","jzUqRFhtgl","lXFOB8FmFH","FhtglzFgtB","y94nwuLtKs","bgJAzoQ87r","v1Hln07n1c","0Wr5yfcwDa","soy9tFcWrW","FFDuiVLTy6",
+"uupzk9iGoT","zz4ZUtlILt","rz7UtQbxXc","J2mQicQOnv","EoToPWaim6","v2eC3QnJ1S","hYBCKAOgEe","QYxC0nFqik","qaofNS2Dfu","5NammjiVBP",
+"M3zXLLewvM","piJSkjzUqR","EoToPBpYhV","M6qcGgdQsS","cQOnvaFFss","FnPFBQClRL","NcICAvOqCE","Cfgr3uoStw","S2DfuGrDg7","5ZaEzOxWIH",
+"i3pydpFrrl","8FmFHEdBKc","cmXIXOUYuF","dpe1vVjCZq","EoToP0BmCy","b29RJuLtKs","M6qcGbgJAz","fcwDaJKWYR","tAOsrTCgPp","JXljWdjsrv",
+"piJSkWmadA","fcJOyiwzGk","BpYhVxciqp","P6bcgh1zcH","aDGtSqaofN","l83UdcQOnv","yEfy98cVD3","iwzGk5Drn0","piJSkGXdoH","Dz1R3t59lR",
+"iqv4kSmGzv","prNT6XyPZN","KASQ8YOfrY","nFqikt98iW","AIYUuguMb8","QClRLv8yFN","BFkb82hEEU","piJSkVNCPd","M6qcGxciqp","jeskStuDyS",
+"9y4lw5ZaEz","WMiS3B3qem","0KyfsYjB9t","yvOMIRzaZA","Rxrsm1LB1L","0PktIsx5Gl","Pb1pad85a9","uJScXRkQke","FhtglNhXdu","cL0aEG1RhS",
+"fcwDa1v5hH","UmaEvCp3mZ","jS1ajzQt6Q","t59lR7hyVv","s93Mlrhl0J","FFDuiaFFss","he9IAB3qem","aFFsspiJSk","i7WMQdQ586","16lHcBCxeC",
+"SbRYyvkCHH","AIYUun1pmO","yluBxFhtgl","uupzk9GXkX","VLTy6I7p2a","OUqFMMGlTF","BFkb8EoToP","YOfrYfLNg8","QWxoT14FLR","d7vjM45cIH",
+"Yf2EcuN6r3","D6rByMkgy8","AOgEeFNYIM","1LB1L8FmFH","16lHcSWfou","uPX7GnFqik","JkzUnAIYUu","Vprf2GXdoH","9y4lwMojnP","y94nwQworu",
+"ZhwG1K4GS8","ZUnqtaL6AJ","zFgtBQ6hMC","Pb1paK4GS8","rz7UtoGu6x","jiVBPoQ87r","EdBKcVLTy6","GrDg748cHL","UmaEvUl4a1","WPmlxQChxs",
+"7X3uyoVQp6","vkCHH7fKYU","jiVBPPb1pa","k85AeMGlTF","2TRI7tjQxs","M3zXLulk41","FnPFBi7WMQ","CxVEf16lHc","4QMc90MR5X","KZamHQChxs",
+"8RCUAe6e4z","WreyPAOgEe","In3NSzY1GY","NcICAy94nw","7X3uyXyPZN","jeskSHP433","BpYhVpT8wu","KASQ8i3pyd","pmeCdVNCPd","1j5L8GSQwj",
+"IBe8kguMb8","VIlwPzmLYD","9y4lwyluBx","YOfrYQWxoT","VIlwPAkKTk","QbxXcOxWIH","CqqaDzHF1q","qUJMdazIWp","XflUq1v5hH","U3yw5LDk6f",
+"YjB9tVerEA","bZLvSAIYUu","hYBCKlkMUA","h1zcHYw2oU","Q6hMCNOHsz","fcwDas4786","2Nslm5VZjS","7ku1pFxX9q","h1zcHWMiS3","jeskSsqVrf",
+"hi5X7WPmlx","ZhwG1NAFuw","8xEKzM3zXL","WMiS3ZUnqt","7ku1pYjB9t","B3qem3weIF","VerEArKDLJ","bgJAzlm0pD","euZA5dhSuH","xciqpv8yFN",
+"a00b5hUTw7","5drc6W7cTs","ThjNnOUqFM","gdQsSNOHsz","ciuWzFxX9q","2DREs29QAz","RmDcrqUJMd","RxrsmEdBKc","tAOsrpmeCd","29QAzYh1hF",
+"OUqFM8xEKz","8cVD3xXTI4","ZUnqtzbIYY","oGu6xhUTw7","M6qcGSs0Zu","uN6r3No0Qb","In3NSG1RhS","IBe8kvLsmS","RBhp0EdBKc","5VZjSAXpwE",
+"gdQsSsoy9t","ThjNnWaWsv","hi5X7IBe8k","djsrviKqhr","RmDcruoStw","24ARF5VZjS","suY4xNo0Qb","sx5GlCp3mZ","yEfy9BbwgA","RmDcraL6AJ",
+"JIqXiReKEW","uPX7GXyPZN","Ss0Zui3pyd","jSjS32TRI7","MmKGJzbIYY","aDGtSzFgtB","DQimp9rlg9","NOHsza00b5","Oz8yZ0Kyfs","0h1b1QClRL",
+"a00b5DQimp","rKDLJdjsrv","CxVEfrhl0J","cQOnvtjQxs","X6PinQClRL","FPfSEdpe1v","X6Pin7hyVv","D6rBy0Kyfs","MezSWoQ87r","YjB9tzbIYY",
+"CNHmvRxrsm","y94nwUmaEv","cmXIXy94nw","tl72W2TRI7","lj07QIKxdL","ReKEWUlU3M","SmGzvMGlTF","zFgtBStlDJ","Nxx9VBCxeC","v2eC39iGoT",
+"xciqp8U2nU","uJScX1LB1L","FxX9qWreyP","JKWYRGrDg7","pFrrl64s8N","Uvlv4MezSW","mX2GEKr8ys","K4GS88hJdt","uAWyp0MR5X","TCgPpuLtKs",
+"Waim6VNCPd","uoStwFLsph","rhl0JcmXIX","yluBx4dEz6","ECMvUBCxeC","4QMc9prNT6","lH1kthi5X7","WaWsvOxWIH","ru4UG2hEEU","tAOsr9iGoT",
+"Pb1paW7cTs","55rfBuLtKs","S77LH8TxD7","7Ow5C9y4lw","7lUXZhi5X7","vkCHHM3zXL","DG4sTPYBf4","uAWypfFDrJ","Cp3mZNOHsz","Dz1R3lpF6W",
+"Q6hMC2Yz7E","HRxd8FjHXR","9rlg9YjB9t","2Yz7EYjB9t","I7p2aYf2Ec","kZANmcQOnv","QnJ1SnlaBy","v8yFNAIYUu","mz8gxzQt6Q","RkQkeKASQ8",
+"KASQ8kB5nP","CqqaDlweGy","MK07YWmadA","1j5L8SjskQ","QYxC048cHL","cQOnvChuy3","yofH3HfyNQ","0BmCy0Kyfs","D6rBybZLvS","aL6AJ2Nslm",
+"VNCPdDG4sT","2DREsuQIcz","aez9yHzZT8","BFkb8WDVWJ","ydG8UgIYvE","TXQ0Z6q6L9","SbRYy0PktI","Ss0ZuFwEJz","kB5nPdjsrv","nlaBym4bxU",
+"CxVEfQChxs","45cIHuoStw","QYxC0jeskS","zz4ZUjS1aj","bgJAzlweGy","gdQsSMmKGJ","14FLRjzUqR","580YDzqH0W","2DREsaDGtS","tl72WB3qem",
+"HzZT8EdBKc","ulk41OUYuF","AXpwEuupzk","X6PinYh1hF","QbxXcIn3NS","pWiOsv1Hln","CxVEfyToGW","lj07QWMiS3","BpYhVJKWYR","ZUnqtNAFuw",
+"RzaZAGrDg7","8FmFHpvgjS","AkKTke6e4z","lsQGouupzk","s93Ml9GXkX","HzZT8F6PT2","Cfgr38TxD7","uLtKswiHrZ","FjHXRaez9y","NhXduHP433",
+"vOqCECqqaD","faHiruTacx","zbIYYQnJ1S","MezSWfcwDa","9eoRctjQxs","yvOMIK4GS8","MGlTFpT8wu","gIYvEzbIYY","I7p2aS77LH","5iGN5pFrrl",
+"TCgPpgf8rI","0ao3lPYBf4","Vprf21j5L8","BbwgAQssNC","OxWIHQWxoT","jtn0Xsx5Gl","StlDJhE1Ql","iB08lpvgjS","t59lRhYBCK","7fKYUSmGzv",
+"HRxd8dQ586","zQt6QbrhlQ","ZhwG1MGlTF","MmsIouPX7G","zY1GYVIlwP","AOgEeVLTy6","v1HlnprNT6","Vprf2AXpwE","iB08lAgJHQ","t98iWStlDJ",
+"QnJ1S8TxD7","GXdoHpFrrl","euZA5lCMxy","qaofNxReec","ydG8Ue6e4z","SjskQDQimp","6q6L9uPX7G","YOfrYWMiS3","IjTwPcQOnv","AmdQdaL6AJ",
+"CxVEf5nmWv","mX2GE0Wr5y","0Wr5ydmoS7","ThjNn7Ow5C","2hEEUGv3Fq","VerEA16lHc","kB5nPBCxeC","CxVEfVIlwP","8FmFHhi5X7","M6qcGpFrrl",
+"Cp3mZCK5W7","ogLgcFhtgl","Ta8f6gdQsS","uLtKsUvlv4","ydG8UIRh48","ulk41OHaBz","W7cTslsQGo","TXQ0ZpmeCd","MojnPNcICA","9eoRclViBv",
+"t98iW8xEKz","MojnPMezSW","QClRLMezSW","fcwDalweGy","48cHLCp3mZ","618Di07n1c","6q6L9hSSvQ","Oz8yZAmdQd","W3VFH4dEz6","YOfrYNcICA",
+"48cHLYw2oU","oVQp6Gv3Fq","Q6LixAmdQd","BFkb848cHL","NAFuwbrhlQ","l83UdzQt6Q","k85Aed85a9","jtn0XK4GS8","ulk41MmKGJ","J2mQiIKxdL",
+"v8yFNReKEW","MK07Y2DREs","5Nammhe9IA","GSQwjaDGtS","1v5hH16lHc","oGu6xMm8si","lCMxy0Wr5y","rz7UtS77LH","14FLRVIlwP","IKxdLTXQ0Z",
+"dpe1vWMiS3","lXFOBoVQp6","cL0aE0BmCy","VBjhzVerEA","nnP8ozQt6Q","CxVEfnFqik","Yw2oUcmXIX","zFgtBaL6AJ","WaWsvzmLYD","ogLgcBpYhV",
+"wDajXRBhp0","wiHrZ7fsYM","KsjRKqUJMd","WreyPUmaEv","brhlQOUYuF","EoToPF6PT2","6AFT0yEfy9","cL0aEuZPqg","TXQ0Z2ZHdk","55rfBjfREu",
+"IBe8k9GXkX","J2mQiUmaEv","HRxd8XflUq","IKxdLlsQGo","I7p2a48cHL","atef2lXFOB","uoStwgtCA5","a00b5uAWyp","0BmCys7Mxk","uTacxLDk6f",
+"UlU3MTa8f6","GXdoHRmDcr","2hEEU2DREs","ix74r2DREs","zz4ZU7hyVv","jtn0X618Di","dhSuHLDk6f","oQ87rFjHXR","lj07QkB5nP","S77LHyEfy9",
+"azIWp45cIH","iwzGkatef2","x3LDeqQxHP","VerEA3otm6","kZANm0MR5X","suY4xZUnqt","Q6LixfaHir","M6qcGyluBx","hUTw7pFrrl","v8yFNFnPFB",
+"ZUnqt5ZaEz","TXQ0ZC2Irc","BGaQYs4786","mX2GELDk6f","t98iW1LB1L","Qworuy94nw","ReKEWY1mC0","jSjS3NOHsz","aFFsstl72W","TwanoHlUbF",
+"Y1mC0S2Dfu","qUJMdl83Ud","X6PinksJby","uvf7AQbxXc","6AFT0JXljW","pAhR10BmCy","29QAzFGzgp","yvOMISbRYy","RACuj7fKYU","mz8gxrhl0J",
+"CIShGlkMUA","FhtglvOqCE","0h1b1C2Irc","618Dia00b5","CqqaD0h1b1","rz7UtyEfy9","nlaByNAFuw","PYBf4blLA9","xReecmX2GE","VLTy6i7WMQ",
+"nnP8ov1Hln","XflUqjeskS","ZuDtD2Yz7E","Q6LixJkzUn","MGlTF0Wr5y","45cIH24ARF","prNT6AXpwE","yluBxdhSuH","suY4xjeskS","ThjNngdQsS",
+"45cIHVBjhz","Ul4a1IBe8k","oQ87rM3zXL","Mm8sipWiOs","lH1ktjSjS3","FwEJzpAhR1","0ao3lCp3mZ","FnPFBQworu","uZPqgZ4I1v","2Yz7EFVMxo",
+"faHirhUTw7","Oz8yZQClRL","SjskQzmLYD","kB5nPSmGzv","uQIczxReec","U3yw5CdyBV","zmLYD24ARF","ix74rEdBKc","IjTwPC2Irc","i7WMQVerEA",
+"kZANmJXljW","azIWp1LB1L","FjHXRulk41","8hJdto8Uyd","QnJ1SMGlTF","ZhwG1pvgjS","Cfgr3d7vjM","fLNg8OxWIH","n8pJ9XflUq","EdBKcCIShG",
+"CNHmv5drc6","VBjhz8U2nU","2DREs8cVD3","VIlwPBCxeC","lm0pDvkCHH","jtn0Xaez9y","M3zXL0Wr5y","IRh48m4bxU","suY4xBGaQY","3otm6lpF6W",
+"LbRTHiqv4k","0KyfsfcwDa","n8pJ9OUqFM","CqqaDO3iyQ","jS1aj0Wr5y","Yw2oUYh1hF","gjUTulj07Q","580YDIKxdL","FPfSEQ6hMC","djsrv618Di",
+"iKqhraDGtS","lj07QO3iyQ","In3NSlkMUA","CdyBVx3LDe","lpF6WfLNg8","4QMc9kZANm","KZamHSs0Zu","MGlTFtjQxs","K20wKzHF1q","ZzJHW16lHc",
+"M3zXL0ao3l","G1RhSn1pmO","tl72WhSSvQ","lH1kt5iGN5","jtn0XUvlv4","K20wKOz8yZ","l83UdSbRYy","24ARFIn3NS","zz4ZUydG8U","jzUqRDz1R3",
+"hYBCK5VZjS","LbRTHqUJMd","6q6L9QnJ1S","dmoS7jzUqR","7Ow5C5Mg9r","Mm8siwiHrZ","pAhR1Waim6","M6qcGsoy9t","Yf2EcTCgPp","wiHrZlkMUA",
+"FhtgluN6r3","s7MxkTa8f6","8hJdtRzaZA","ZhwG1FjHXR","oGu6x0h1b1","piJSkVIlwP","RBhp0m4bxU","dpe1v0YAGH","07n1cUmaEv","pAhR1Q6Lix",
+"jtn0Xv8yFN","x3LDeVprf2","TCgPps4786","W3VFHtAOsr","S77LHF6PT2","0PktIJXljW","qUJMdRmDcr","uvf7AlsQGo","618DiKZamH","Y1mC0ogLgc",
+"fLNg8guMb8","48cHLbZLvS","azIWpVNCPd","aL6AJix74r","uTacxb29RJ","0PktIRpBQm","YOfrYdmoS7","rhl0JuLtKs","v2eC3gf8rI","e6e4zWMiS3",
+"WDVWJOUqFM","VNCPd48cHL","W7cTsdjsrv","iKqhrXyPZN","hE1Qlhi5X7","WmadAEoToP","Ss0ZuSjskQ","IRh48rKDLJ","d7vjMQssNC","B3qemWPmlx",
+"uZPqgrz7Ut","JJs5mGXdoH","piJSkuvf7A","zbIYYcL0aE","NOHszEoToP","7fsYMydG8U","DLhzMi7WMQ","BpYhVgtCA5","7X3uyulk41","OxWIHo8Uyd",
+"GSQwjGXdoH","QChxstvdkD","MmsIoChuy3","J2mQie6e4z","7ku1pUmaEv","BFkb8PYBf4","zmLYDd7vjM","XflUqDcpWB","yvOMIdjsrv","Q6LixZv7z0",
+"Nxx9VzQt6Q","OxWIH5ZaEz","nFqik5VZjS","Uvlv4FFDui","oQ87rkZANm","gdQsSuvf7A","d85a9kZANm","pFrrlC2Irc","5nmWv5Mg9r","RpBQmrhl0J",
+"t59lRAmdQd","D6rBySjskQ","AmdQdcShY2","CK5W7618Di","uQIczG1RhS","Z4I1vuZPqg","5iGN5FNYIM","JKWYRh1zcH","AOgEeSmGzv","fLNg8X6Pin",
+"I7p2auTacx","HfyNQCqqaD","WDVWJ8hJdt","lXFOBTXQ0Z","5drc6KZamH","29QAzv2eC3","BbwgAXflUq","Waim68TxD7","U3yw5piJSk","48cHLdhSuH",
+"pmeCdZ4I1v","uJScXSmGzv","2TRI7Gv3Fq","WaWsvaDGtS","o8UydNxx9V","lViBvpT8wu","ECMvUFhtgl","MmsIodQ586","ksJbyiKqhr","24ARFk85Ae",
+"zz4ZUU3yw5","b29RJHzZT8","G1RhSoVQp6","EoToPVBjhz","Gv3FqFGzgp","FjHXRQClRL","ydG8Uulk41","0KyfsU3yw5","nnP8oWDVWJ","OUqFMNo0Qb",
+"CK5W7580YD","pvgjS07n1c","piJSkoGu6x","fFDrJWaim6","aez9yxReec","XyPZN16lHc","0YAGHHzZT8","lCMxyk85Ae","JkzUnGSQwj","VerEALewvM",
+"lViBvTa8f6","lweGyAmdQd","t59lRuvf7A","UmaEvEdBKc","S77LH1LB1L","5ZaEzvLsmS","POUYS5Drn0","7Ow5Crhl0J","Oz8yZaez9y","0YAGHVIlwP",
+"ciuWzblLA9","gdQsS9y4lw","M6qcGhE1Ql","QYxC0JkzUn","EdBKcuLtKs","F6PT2s93Ml","d7vjMlCMxy","FxX9qAOgEe","xciqppT8wu","16lHcJ2mQi",
+"4W0TlPb1pa","16lHc6q6L9","Nxx9V8U2nU","Yf2Ec2Yz7E","aL6AJMm8si","QnJ1SlCMxy","GXdoHReKEW","pFrrl5nmWv","3otm6ix74r","9XyT9uLtKs",
+"jtn0XAgJHQ","Pb1pa7X3uy","prNT6jzUqR","GWqqXTCgPp","HlUbFWmadA","sx5GlgdQsS","48cHLKr8ys","soy9tZv7z0","IKxdLuLtKs","FGzgpAgJHQ",
+"JIqXiNxx9V","Ul4a1MaJQs","faHirbrhlQ","SjskQTCgPp","ZuDtD8FmFH","ulk41FjHXR","XyPZNFnPFB","ydG8Ux3LDe","OxWIHhYBCK","LbRTHi7WMQ",
+"ru4UGo8Uyd","vOqCEyofH3","uLtKsFcWrW","tlILtVLTy6","7lUXZy94nw","W7cTs2Yz7E","d7vjM6AFT0","IKxdLyToGW","5IhmGguMb8","5Drn0WaWsv",
+"JIqXiW3VFH","i7WMQS77LH","hi5X7JJs5m","VLTy6QWxoT","hYBCKvkCHH","uPX7GmX2GE","zqH0WFGzgp","1LB1LQssNC","QClRLFcWrW","aL6AJ8cVD3",
+"AOgEem4bxU","Oz8yZcmXIX","9GXkX9GXkX","Ul4a1FGzgp","7Ow5CFwEJz","Cfgr32Nslm","NcICA0Wr5y","vkCHHK20wK","dQ586OHaBz","9y4lwmX2GE",
+"gIYvEWaim6","vOqCEzqH0W","iB08lyluBx","2NslmRzaZA","xciqp6q6L9","ZzJHWIRh48","StlDJQbxXc","zFgtBFwEJz","tvdkDEOE1o","yofH3dpe1v",
+"7fsYMksJby","5Nammrhl0J","fqypyJXljW","kB5nPvOqCE","lViBvogLgc","hUTw707n1c","SbRYyKsjRK","VNCPdChuy3","k85Aehi5X7","jSjS3h1zcH",
+"zY1GYx3LDe","9iGoT2DREs","TwanoB3qem","SbRYyd7vjM","qQxHPCxVEf","5Namm2DREs","RACujzY1GY","x3LDe2ZHdk","o8Uydv1Hln","lpF6WPOUYS",
+"vOqCEqUJMd","Yh1hFQssNC","cL0aEQbxXc","BbwgAuAWyp","D6rBylH1kt","rKDLJlXFOB","S2DfulCMxy","CK5W7TCgPp","EoToPSmGzv","8xEKziwzGk",
+"9eoRcCNHmv","POUYSlXFOB","ru4UGuTacx","AOgEefLNg8","WPmlxyluBx","5ZaEzZ4I1v","ThjNn1LB1L","fFDrJRzaZA","h1zcHJKWYR","i3pydZ4I1v",
+"brhlQ6q6L9","taOXK7fKYU","tlILt2Yz7E","lsQGo3weIF","JXljW24ARF","zY1GYKr8ys","ksJbyvLsmS","FVMxo0BmCy","uoStw0h1b1","jiVBPt98iW",
+"J2mQiFwEJz","hi5X7K20wK","prNT68RCUA","l83UdyofH3","aL6AJM3zXL","FnPFBBbwgA","QnJ1SFnPFB","FLsphsqVrf","lkMUAtaOXK","S2DfucL0aE",
+"jS1ajn1pmO","ydG8UHRxd8","7hyVvpFrrl","DcpWB3weIF","ksJbyAOgEe","HP433580YD","ciuWzMaJQs","EOE1o9eoRc","0ao3lMmsIo","yofH3v1Hln",
+"64s8NiKqhr","iqv4kpAhR1","WmadA0MR5X","5ZaEzaL6AJ","TXQ0ZAmdQd","hE1QlFhtgl","zz4ZUHRxd8","cmXIXlkMUA","IBe8kJkzUn","BGaQYFnPFB",
+"QbxXc9rlg9","jeskSCdyBV","CxVEfhSSvQ","nnP8oaFFss","lpF6WjS1aj","5ZaEz8TxD7","mX2GEvkCHH","fLNg864s8N","uJScXd85a9","7fKYUNAFuw",
+"F6PT21v5hH","l83UdW7cTs","oVQp6CIShG","WMiS3qUJMd","RzaZAvOqCE","zz4ZUD6rBy","Yh1hFlkMUA","djsrvrhl0J","D6rBy5Namm","cShY2IKxdL",
+"cL0aE8xEKz","4W0TlnFqik","FPfSEI7p2a","d85a9UlU3M","EdBKcIjTwP","Oz8yZGSQwj","QChxsFPfSE","5Drn0QWxoT","QssNC16lHc","WmadAFLsph",
+"ThjNnW3VFH","EoToPoGu6x","OUqFMFwEJz","lj07QjS1aj","vLsmSJJs5m","lH1ktuZPqg","x3LDe1v5hH","1LB1LpAhR1","wDajX07n1c","1j5L80MR5X",
+"F6PT2D6rBy","0BmCyGXdoH","64s8NQClRL","1LB1LCxVEf","W3VFH2ZHdk","KZamHIRh48","K4GS8lViBv","2hEEUNOHsz","CIShGThjNn","Q6LixvLsmS",
+"1LB1LFPfSE","QYxC0AIYUu","5ZaEzWPmlx","prNT6Ta8f6","Yf2EcnlaBy","BFkb8Nxx9V","2NslmydG8U","IKxdLn1pmO","yToGWOxWIH","jfREuKr8ys",
+"0YAGHgIYvE","9GXkXmz8gx","ECMvUwDajX","pFrrlAIYUu","HP433d7vjM","W3VFHRBhp0","VNCPdvkCHH","xXTI45drc6","RpBQmFLsph","CNHmvK4GS8",
+"Y1mC0soy9t","tuDySNcICA","Yw2oUtjQxs","x3LDes7Mxk","zY1GYJIqXi","lweGy8U2nU","5nmWvqaofN","5drc6hYBCK","ulk41MaJQs","ksJby8FmFH",
+"HzZT8xXTI4","Waim60ao3l","8FmFH9XyT9","X6PinfcwDa","U3yw5pWiOs","0MR5Xpv0i7","kB5nPuAWyp","4W0TlRzaZA","UmaEvQChxs","ogLgcJ2mQi",
+"nFqik2TRI7","EdBKcl83Ud","iwzGkIBe8k","14FLRRBhp0","Vprf2tAOsr","jfREuGv3Fq","6AFT0rz7Ut","O3iyQCdyBV","d85a9d7vjM","dpe1vaL6AJ",
+"sx5GljeskS","2hEEUUl4a1","gtCA5azIWp","X6PinZUnqt","QClRLRsQUq","ReKEW5IhmG","IBe8kRkQke","sx5GlZv7z0","WPmlxwiHrZ","vLsmStuDyS",
+"aL6AJNo0Qb","hYBCKLDk6f","uJScXmz8gx","uvf7AoQ87r","K20wKS2Dfu","cShY2NhXdu","SmGzvW3VFH","07n1c4dEz6","8U2nUC2Irc","MmKGJWDVWJ",
+"Cp3mZuoStw","zqH0WRxrsm","ru4UG9eoRc","7fKYUatef2","fLNg8jtn0X","JRJQB5iGN5","dhSuHiqv4k","s47868xEKz","7hyVv7ku1p","O3iyQ5nmWv",
+"uLtKslweGy","hYBCKjSjS3","rz7UtK20wK","ECMvULDk6f","gtCA5brhlQ","a00b54W0Tl","0PktIVIlwP","HzZT82ZHdk","3otm6UlU3M","2Nslm7fKYU",
+"blLA9Pb1pa","ZhwG1tAOsr","pFrrlM3zXL","5Nammdjsrv","9GXkXSs0Zu","vkCHHGv3Fq","8RCUAVLTy6","lsQGoo8Uyd","NcICAtjQxs","IKxdLGSQwj",
+"O3iyQWaim6","jiVBPdpe1v","MaJQs07n1c","QWxoTni2v1","WmadApT8wu","he9IACqqaD","HRxd88U2nU","m4bxUs7Mxk","jeskSDLhzM","0YAGH0YAGH",
+"GXdoHTa8f6","FnPFB1j5L8","YjB9t64s8N","YjB9tLDk6f","h1zcHfqypy","JRJQBHzZT8","BFkb8gtCA5","KZamHBGaQY","vLsmSFGzgp","UmaEvPb1pa",
+"iKqhrF6PT2","0ao3lMezSW","s47865drc6","618DiHRxd8","X6PinMojnP","IKxdLQ6Lix","U3yw5yluBx","Mm8si29QAz","5VZjS618Di","Zv7z0K20wK",
+"Dz1R37X3uy","ZJTXHDQimp","JkzUnqaofN","jtn0X2hEEU","LDk6flm0pD","h1zcHuQIcz","RmDcrjfREu","iB08luN6r3","l83UdqUJMd","ReKEWguMb8",
+"Waim6hi5X7","3otm6tvdkD","wDajX4dEz6","JkzUnBGaQY","MaJQsUl4a1","pvgjSzmLYD","Dz1R3zqH0W","GXdoH64s8N","VNCPdBpYhV","MK07Ymz8gx",
+"55rfBJRJQB","ogLgc0MR5X","zQt6QvOqCE","t59lR8cVD3","gtCA5LDk6f","xciqpRACuj","zmLYD0Wr5y","yEfy9uvf7A","NAFuwprNT6","aFFssGv3Fq",
+"JKWYRnFqik","PYBf4HP433","ksJbygdQsS","P6bcgNxx9V","hSSvQzHF1q","gdQsSv2eC3","KASQ88U2nU","MK07YQChxs","4W0TlS2Dfu","ThjNnrKDLJ",
+"7Ow5CQClRL","okgRibrhlQ","MezSWzHF1q","5VZjS5iGN5","L7cGcuQIcz","24ARFM6qcG","okgRi2DREs","6AFT0MmKGJ","CxVEffcJOy","zY1GYzQt6Q",
+"Oz8yZO3iyQ","aL6AJMK07Y","yEfy9lCMxy","WaWsvZUnqt","MaJQs9eoRc","JJs5m7Ow5C","NhXduZhwG1","BpYhVFnPFB","RACujZJTXH","rz7Ut0Kyfs",
+"ZzJHWsqVrf","uZPqg0Wr5y","RpBQm0BmCy","KsjRKRxrsm","tjQxs4dEz6","FPfSERpBQm","QChxsy94nw","Qworu07n1c","Qworuuupzk","F6PT2wDajX",
+"LbRTHGWqqX","JXljWCIShG","uTacx5ZaEz","WPmlxECMvU","prNT6uJScX","RsQUqhSSvQ","2TRI7lkMUA","yvOMI618Di","pWiOsQYxC0","XyPZN64s8N",
+"M3zXLQnJ1S","jtn0XP6bcg","5IhmG2Nslm","vkCHH0YAGH","45cIHWmadA","cQOnvQWxoT","mX2GECIShG","iB08l7lUXZ","t59lRKASQ8","48cHLfmIK1",
+"m4bxUsuY4x","blLA9BFkb8","ZJTXHdjsrv","uQIczRACuj","5VZjSpiJSk","oVQp6oQ87r","RpBQmn1pmO","kB5nP8RCUA","kB5nPpFrrl","uupzkru4UG",
+"kZANmprNT6","NOHszEdBKc","tuDyS2ZHdk","vOqCEblLA9","h1zcHNo0Qb","7lUXZK20wK","ni2v1dhSuH","G1RhS5Namm","8hJdtuZPqg","qQxHPqaofN",
+"Mkgy8O3iyQ","i3pydStlDJ","RBhp0ogLgc","5nmWvS2Dfu","cQOnvFLsph","a00b5QWxoT","uTacxuAWyp","Dz1R3x3LDe","0BmCyjeskS","Oz8yZOHaBz",
+"cL0aEQssNC","sx5Glb29RJ","ru4UGuLtKs","5NammJKWYR","zQt6Qa00b5","yofH3uPX7G","uvf7AAgJHQ","U3yw5SWfou","Ss0ZuMezSW","gjUTuTa8f6",
+"Gv3FqjzUqR","M3zXLOUqFM","TXQ0ZYh1hF","IRh48Pb1pa","HzZT8MGlTF","4dEz648cHL","IBe8kBGaQY","AgJHQMkgy8","djsrvuZPqg","VNCPdStlDJ",
+"CdyBVS2Dfu","UlU3MOUqFM","s7MxkWmadA","ZzJHWgtCA5","jSjS3pFrrl","gf8rIhE1Ql","Ss0ZukB5nP","v2eC3qQxHP","jSjS3uN6r3","hUTw7h1zcH",
+"FNYIMW7cTs","0h1b19eoRc","pv0i78hJdt","uZPqgnFqik","OxWIHdQ586","hi5X7v1Hln","NhXduIn3NS","WmadAIRh48","hSSvQ7Ow5C","Ul4a1FVMxo",
+"J2mQis7Mxk","m4bxUQbxXc","JKWYRv8yFN","580YDK4GS8","OxWIHChuy3","Pb1pauZPqg","yvOMIBpYhV","RmDcr2ZHdk","HzZT8v8yFN","LbRTHkB5nP",
+"euZA5Z4I1v","Ss0ZuyToGW","FGzgpzQt6Q","WDVWJ24ARF","CqqaDbZLvS","aL6AJoVQp6","ciuWzHP433","kZANmVerEA","vLsmSzHF1q","v1HlnrKDLJ",
+"zHF1qrKDLJ","IjTwP5IhmG","ogLgcEoToP","Y1mC0F6PT2","0BmCyhE1Ql","SmGzvMmKGJ","5Drn0U3yw5","v2eC30ao3l","uTacxAIYUu","JkzUn0MR5X",
+"KZamHqQxHP","OUYuFdmoS7","6AFT0ni2v1","ciuWzuupzk","ni2v1lkMUA","jeskSqaofN","uupzkYh1hF","8xEKz29QAz","yEfy9uPX7G","yEfy9QClRL",
+"RsQUq14FLR","1j5L8s93Ml","ZzJHWJXljW","14FLRL7cGc","oGu6xGSQwj","AmdQdFwEJz","4QMc9vLsmS","XflUq2TRI7","RxrsmbrhlQ","D6rByMaJQs",
+"rz7Ut5iGN5","FPfSEkZANm","ru4UGpv0i7","Ss0ZuEOE1o","lweGyhi5X7","zbIYYNcICA","aDGtSo8Uyd","DG4sTCdyBV","0KyfsvLsmS","Yf2EcYOfrY",
+"PYBf4YOfrY","v8yFN14FLR","mX2GEatef2","oGu6xjfREu","s93Mlxciqp","MojnPVIlwP","blLA9CNHmv","FPfSEIn3NS","hYBCKlXFOB","tl72WOUqFM",
+"NcICAWaWsv","5drc6RACuj","5iGN5Gv3Fq","s7MxkzqH0W","BCxeCWPmlx","8cVD348cHL","8hJdtpvgjS","IRh48KASQ8","9rlg9FcWrW","prNT64dEz6",
+"QClRLWMiS3","7fKYUS77LH","l83UdMGlTF","0ao3ljtn0X","DLhzMfaHir","tvdkDJXljW","zmLYDuvf7A","W3VFHlXFOB","dhSuHRACuj","64s8NoGu6x",
+"Yf2EcUlU3M","RsQUqpWiOs","dhSuHuJScX","14FLRAgJHQ","bgJAzzbIYY","yToGWiKqhr","16lHcdhSuH","IBe8kdpe1v","mz8gxVerEA","d7vjMM6qcG",
+"xReec6q6L9","oGu6xCfgr3","CIShGs93Ml","AOgEeCNHmv","AOgEeSjskQ","jzUqR7Ow5C","6q6L9WaWsv","uupzk0ao3l","Waim67lUXZ","S2DfuDz1R3",
+"e6e4zQworu","JXljWMm8si","EdBKc24ARF","ix74rSmGzv","guMb8fcJOy","U3yw59iGoT","9rlg9Y1mC0","6AFT0h1zcH","jzUqRCIShG","FNYIM8cVD3",
+"8hJdttAOsr","jS1aj7X3uy","jiVBPWmadA","gjUTus4786","D6rByhYBCK","dpe1vs93Ml","Twano7fsYM","o8UydFFDui","EoToPzz4ZU","XflUqfaHir",
+"7fKYUD6rBy","ix74ruvf7A","n1pmONAFuw","t98iWP6bcg","K20wKHlUbF","D6rBysx5Gl","FPfSElCMxy","QssNC8FmFH","uJScX0Wr5y","uJScXNOHsz",
+"lpF6W14FLR","he9IAYOfrY","lViBvJ2mQi","jSjS3VerEA","n1pmO0BmCy","ogLgcReKEW","uQIczFhtgl","8hJdtZuDtD","C2IrcQClRL","6q6L9uJScX",
+"HP4332Nslm","pT8wuZJTXH","9XyT90YAGH","hSSvQwDajX","3weIFmX2GE","ulk41prNT6","uoStwI7p2a","Ul4a18U2nU","7ku1pzQt6Q","n1pmODQimp",
+"In3NSDQimp","CxVEfJKWYR","zqH0W7ku1p","0KyfsB3qem","pvgjSQnJ1S","MaJQsd85a9","5NammCxVEf","G1RhS3weIF","CxVEfKZamH","JJs5mJkzUn",
+"zHF1qazIWp","SmGzvRpBQm","xciqpn8pJ9","QbxXc0h1b1","lkMUA3weIF","EdBKcFwEJz","bgJAzuPX7G","m4bxUh1zcH","MezSWQnJ1S","Ss0Zu8cVD3",
+"6q6L9tvdkD","h1zcHmz8gx","x3LDecL0aE","hE1QlMaJQs","kZANmXflUq","cShY2ThjNn","C2IrctlILt","Cp3mZMGlTF","qaofNFjHXR","nnP8o3weIF",
+"y94nw24ARF","Waim6Ta8f6","CK5W7pmeCd","9iGoTiqv4k","yEfy9b29RJ","tjQxsNo0Qb","vOqCEjeskS","No0QbogLgc","D6rByzFgtB","FxX9qgIYvE",
+"24ARFfFDrJ","hYBCKYw2oU","ThjNn7lUXZ","DLhzMQbxXc","MmKGJIRh48","brhlQQbxXc","SWfouEOE1o","OHaBz5VZjS","nnP8oNxx9V","piJSkSjskQ",
+"Ul4a14dEz6","prNT6fcwDa","pAhR1suY4x","NcICAYw2oU","FGzgpQChxs","zmLYDzz4ZU","BCxeCWmadA","0MR5Xdpe1v","i7WMQI7p2a","OxWIHoGu6x",
+"Fhtgl9rlg9","2ZHdkFcWrW","CIShGlm0pD","ECMvUQ6hMC","NOHszblLA9","bgJAzIBe8k","GrDg7hUTw7","07n1c2Yz7E","qQxHPIn3NS","xXTI4PYBf4",
+"NAFuwjtn0X","dpe1vOHaBz","FnPFBOHaBz","wDajXpv0i7","gtCA5F6PT2","hE1Qljtn0X","x3LDeKr8ys","7Ow5CtvdkD","tjQxsWaim6","In3NSQbxXc",
+"yofH3tl72W","1v5hHyToGW","lXFOB64s8N","RACujIjTwP","ThjNnUmaEv","0BmCya00b5","5Mg9rtAOsr","Yh1hF2Nslm","uvf7An8pJ9","2TRI7WDVWJ",
+"RmDcriqv4k","QChxsRxrsm","IKxdLOxWIH","In3NS6AFT0","k85Ae9rlg9","LbRTHoGu6x","Nxx9VYh1hF","JXljWru4UG","BCxeCdQ586","Z4I1vPOUYS",
+"CqqaDuN6r3","Zv7z09y4lw","ksJbyuupzk","9y4lwnnP8o","d7vjMZuDtD","Dz1R3OHaBz","mz8gxSbRYy","2NslmECMvU","OHaBz64s8N","55rfB5Namm",
+"7Ow5CLDk6f","CdyBV618Di","Zv7z04dEz6","MGlTFuoStw","G1RhSprNT6","1j5L8IKxdL","16lHcAXpwE","NcICAO3iyQ","LDk6fi3pyd","fcwDaL7cGc",
+"qaofNW7cTs","lsQGobZLvS","SbRYyEoToP","0Wr5ys4786","tuDyS7fKYU","24ARFZuDtD","FNYIM618Di","AXpwEsqVrf","ReKEWciuWz","VIlwPs4786",
+"SmGzvjSjS3","a00b5BFkb8","CqqaDIKxdL","FnPFBDz1R3","hi5X729QAz","8cVD3cL0aE","RACujpWiOs","ciuWz0MR5X","vkCHHSjskQ","Kr8ysRACuj",
+"5nmWvk85Ae","16lHcZhwG1","7X3uyGXdoH","ogLgcLDk6f","nFqikiB08l","8RCUAsx5Gl","ZzJHWQnJ1S","Mkgy85Namm","QworutAOsr","I7p2aZzJHW",
+"s47868U2nU","iwzGkaDGtS","tjQxsdhSuH","blLA948cHL","QssNCHfyNQ","1v5hHogLgc","8RCUADG4sT","ThjNnK20wK","8RCUA4dEz6","VNCPdTwano",
+"VNCPd9iGoT","hE1Ql5ZaEz","IjTwPXyPZN","Cfgr3soy9t","RBhp0W3VFH","cL0aEMkgy8","9iGoTFGzgp","MmKGJNo0Qb","a00b5L7cGc","s4786Ul4a1",
+"jzUqRMK07Y","lCMxyMaJQs","oQ87ruZPqg","Waim6qaofN","IKxdL2TRI7","fqypyzHF1q","ksJbyy94nw","KZamHFwEJz","zHF1qMK07Y","AXpwEfcwDa",
+"lsQGos4786","ZUnqtbrhlQ","D6rByKZamH","QClRLStlDJ","taOXKQbxXc","9iGoTFnPFB","jiVBPpT8wu","NcICAyvOMI","cL0aEAgJHQ","DLhzMdmoS7",
+"uTacxAgJHQ","Kr8ys8U2nU","vOqCEPb1pa","soy9t7hyVv","cL0aEbrhlQ","t98iWk85Ae","blLA9KsjRK","7lUXZWDVWJ","QssNCtAOsr","RmDcrnnP8o",
+"s93MlOUqFM","9XyT9X6Pin","ZhwG1EOE1o","uN6r3v8yFN","prNT62hEEU","pvgjSSs0Zu","Y1mC0rhl0J","hYBCKlViBv","jtn0XZv7z0","LDk6fAkKTk",
+"Waim6v1Hln","h1zcHOUYuF","POUYSsqVrf","jiVBPQ6hMC","pmeCdFjHXR","soy9tvOqCE","FxX9q9rlg9","8hJdt9iGoT","rhl0JQChxs","EdBKc5Drn0",
+"Waim6zHF1q","cQOnvJXljW","FPfSEqaofN","OUqFMQClRL","RxrsmzY1GY","XyPZNS2Dfu","Yw2oUni2v1","Gv3FqLbRTH","SWfouDcpWB","jS1ajkZANm",
+"EOE1otlILt","Ul4a1i3pyd","pT8wu55rfB","DcpWB0YAGH","iKqhrfcwDa","fmIK1HRxd8","QnJ1SMmsIo","Nxx9VokgRi","zY1GYJkzUn","zz4ZUUvlv4",
+"XflUq2Yz7E","FjHXRM3zXL","FhtglzqH0W","t98iWjeskS","jfREuciuWz","ru4UGQnJ1S","F6PT2WMiS3","zHF1qkB5nP","HzZT8iKqhr","faHirm4bxU",
+"uoStwyvOMI","RxrsmfcJOy","lkMUAuoStw","No0QbjeskS","x3LDevLsmS","mz8gxhe9IA","VjCZquZPqg","AmdQdK20wK","pWiOscShY2","hSSvQIRh48",
+"29QAzIBe8k","LbRTHL7cGc","K4GS8AIYUu","ZhwG10ao3l","Pb1paFVMxo","Zv7z02hEEU","x3LDe4QMc9","In3NSo8Uyd","POUYSWPmlx","kZANmvkCHH",
+"rhl0J5iGN5","s4786v1Hln","KsjRKOz8yZ","Yf2Ec5nmWv","yvOMIfFDrJ","MGlTFwDajX","AOgEey94nw","0h1b12ZHdk","7lUXZbZLvS","TwanofcwDa",
+"Z4I1vECMvU","QbxXcNAFuw","Dz1R3ECMvU","48cHL2hEEU","GrDg7Yf2Ec","fcJOyrhl0J","8U2nUd7vjM","WmadAThjNn","Waim6CK5W7","xXTI4k85Ae",
+"o8Uyd0PktI","lkMUAuN6r3","5Drn08hJdt","K20wKU3yw5","taOXK0MR5X","RACujpmeCd","TwanopWiOs","aez9yHP433","OUYuFokgRi","Cp3mZU3yw5",
+"RsQUq9rlg9","2NslmuPX7G","qQxHPlj07Q","ogLgcKASQ8","yluBxtjQxs","wiHrZMGlTF","AOgEeM3zXL","cShY2C2Irc","Ul4a1Uvlv4","CdyBV3otm6",
+"CxVEfXflUq","9XyT945cIH","QnJ1SNOHsz","JRJQBt59lR","dpe1v2hEEU","a00b5DG4sT","1LB1LWreyP","OxWIHi3pyd","WreyPOxWIH","cQOnv55rfB",
+"jeskSlweGy","piJSkIn3NS","okgRiEOE1o","n8pJ9I7p2a","h1zcHuupzk","lj07QVLTy6","vOqCEjSjS3","s7MxkazIWp","vkCHHUmaEv","GXdoHHP433",
+"ZuDtDbrhlQ","tuDySPOUYS","Z4I1v07n1c","3otm6SjskQ","djsrvUl4a1","7Ow5CVIlwP","VNCPdokgRi","7ku1p8RCUA","2DREsQbxXc","BbwgAaFFss",
+"2Yz7EKZamH","QWxoTZhwG1","cShY2QYxC0","EOE1oWaWsv","IRh48PYBf4","hE1QlpAhR1","mz8gx0Wr5y","0BmCy16lHc","he9IAGWqqX","Y1mC0wiHrZ",
+"rhl0J8xEKz","he9IABFkb8","djsrvdmoS7","hi5X7580YD","4W0Tl0BmCy","9GXkXfFDrJ","SjskQgjUTu","v1HlnQ6hMC","EOE1oJKWYR","zz4ZUHzZT8",
+"PYBf4piJSk","QssNCTa8f6","K20wKtlILt","ECMvUazIWp","BFkb8ru4UG","GWqqXblLA9","h1zcH0h1b1","pT8wurhl0J","suY4xSWfou","G1RhSCxVEf",
+"MK07YMojnP","v8yFNxciqp","AgJHQn8pJ9","8hJdts7Mxk","nFqikgjUTu","uQIcz5nmWv","8xEKzVBjhz","In3NSm4bxU","gf8rIEdBKc","GWqqX16lHc",
+"C2IrcVprf2","tuDySVprf2","wiHrZQnJ1S","hE1QlYf2Ec","okgRiyToGW","64s8N2DREs","nlaBylpF6W","ogLgclViBv","k85Aed7vjM","yofH3jfREu",
+"PYBf4wiHrZ","brhlQ0PktI","jfREuzz4ZU","dpe1vatef2","ru4UGW7cTs","AXpwEXyPZN","n1pmOOHaBz","ZUnqtlXFOB","jzUqR29QAz","VLTy6Qworu",
+"VerEAjiVBP","MaJQsBCxeC","24ARF618Di","GrDg7ZJTXH","aez9yMaJQs","zqH0W5Drn0","9GXkXuQIcz","dpe1v7Ow5C","CNHmvCNHmv","iqv4kfcwDa",
+"n1pmOxciqp","vLsmSpmeCd","qQxHPrhl0J","I7p2alm0pD","3weIFdQ586","sqVrfWreyP","rhl0JQbxXc","5VZjSKASQ8","UmaEvChuy3","WMiS3CxVEf",
+"lCMxylsQGo","618Di0MR5X","aFFsst98iW","yToGWJ2mQi","5VZjSX6Pin","kB5nPlsQGo","xXTI414FLR","uAWypuN6r3","mX2GEzbIYY","8hJdtFnPFB",
+"M3zXL14FLR","JJs5mDcpWB","16lHcCp3mZ","2hEEURBhp0","zY1GYBCxeC","VBjhzuQIcz","48cHLIRh48","he9IApiJSk","kB5nPAIYUu","gtCA55ZaEz",
+"ix74r580YD","7lUXZPb1pa","nnP8o618Di","dmoS75iGN5","dmoS7Gv3Fq","StlDJpvgjS","BGaQYuoStw","uupzk29QAz","6q6L948cHL","5Drn0GSQwj",
+"ciuWziwzGk","7lUXZn8pJ9","vOqCEdjsrv","djsrvqUJMd","JkzUn0BmCy","e6e4zFGzgp","0YAGHDcpWB","L7cGc1j5L8","618DiwiHrZ","HRxd8uLtKs",
+"Yf2EcpT8wu","lkMUA8hJdt","BGaQYWaim6","EoToPSWfou","tvdkDgjUTu","gIYvE29QAz","HzZT8VjCZq","xReeczqH0W","piJSkBFkb8","QworuZuDtD",
+"faHirQnJ1S","IKxdLlpF6W","48cHLZuDtD","piJSk9XyT9","P6bcgQWxoT","EoToPcL0aE","tl72WNAFuw","pWiOs5Namm","t98iWzQt6Q","aez9ygtCA5",
+"jS1ajaFFss","XyPZNUvlv4","DG4sTcQOnv","yluBx5Drn0","Z4I1vFPfSE","No0Qb7X3uy","ReKEWbZLvS","ReKEWh1zcH","QClRLMGlTF","Ul4a1d7vjM",
+"6q6L95ZaEz","7X3uyGrDg7","7fKYUru4UG","jeskSYjB9t","ciuWzrhl0J","5iGN5zqH0W","tlILtguMb8","9XyT9Vprf2","IBe8kC2Irc","iB08ltl72W",
+"vLsmSPYBf4","4QMc9lm0pD","TXQ0ZY1mC0","y94nwRACuj","fcJOyUvlv4","zHF1qlpF6W","pWiOsO3iyQ","piJSkOxWIH","0h1b1dpe1v","zHF1qZJTXH",
+"UlU3MVNCPd","QClRLM3zXL","tvdkDjeskS","n1pmOFcWrW","24ARFCdyBV","MGlTFSjskQ","ECMvUdjsrv","pvgjSaFFss","ulk41he9IA","vkCHHjtn0X",
+"sx5Gl7hyVv","kZANmzQt6Q","uZPqgguMb8","k85AehYBCK","VBjhzVNCPd","L7cGcOHaBz","LbRTHQ6Lix","ydG8UU3yw5","L7cGch1zcH","7fsYMFxX9q",
+"jSjS3aez9y","VIlwPYf2Ec","wDajXFcWrW","Kr8ys580YD","uQIczUl4a1","RkQkeAOgEe","zQt6QuTacx","580YD2Yz7E","Yf2Ecn1pmO","AXpwELDk6f",
+"blLA9faHir","48cHLSbRYy","yToGWlkMUA","9eoRcCK5W7","Ul4a1G1RhS","aez9yeuZA5","KASQ8IBe8k","AOgEeKsjRK","lm0pDJIqXi","s93MlMGlTF",
+"cL0aE3weIF","RpBQmQnJ1S","lpF6WDG4sT","MK07Yv8yFN","fqypyiwzGk","xReecWreyP","Y1mC07Ow5C","CK5W7gdQsS","5IhmGulk41","JRJQBWaWsv",
+"4QMc9QbxXc","HfyNQ1j5L8","s4786cL0aE","0MR5XGXdoH","fqypyblLA9","he9IAZuDtD","pvgjSn1pmO","Mm8sigf8rI","Cp3mZvLsmS","Cfgr31j5L8",
+"taOXKMojnP","2DREsK4GS8","SWfoupv0i7","ix74rRBhp0","fFDrJgf8rI","tlILtuupzk","e6e4z0PktI","2Yz7EbZLvS","Cp3mZZJTXH","hSSvQprNT6",
+"JJs5mFGzgp","48cHL9GXkX","MK07YQssNC","8RCUAMm8si","tAOsr8hJdt","AkKTkjS1aj","OHaBz618Di","zY1GYFcWrW","bZLvSbrhlQ","lkMUAfqypy",
+"ThjNnFnPFB","SjskQB3qem","C2Ircaez9y","QnJ1SpT8wu","azIWpCdyBV","uTacxiB08l","CqqaDo8Uyd","MmKGJn8pJ9","QbxXcUmaEv","QssNC8U2nU",
+"tuDySVjCZq","QworuFhtgl","RsQUqpAhR1","AmdQd1j5L8","xciqpUmaEv","8RCUAbZLvS","8RCUADLhzM","fLNg81LB1L","SmGzvzbIYY","B3qemRmDcr",
+"CdyBV8hJdt","rhl0JUl4a1","lCMxyhUTw7","zHF1qb29RJ","S2Dfu2Yz7E","kZANmdmoS7","14FLRDz1R3","lH1ktazIWp","UmaEvQ6hMC","IKxdLCNHmv",
+"tuDySpvgjS","8RCUAhYBCK","UlU3MkZANm","0h1b1fqypy","RmDcrWaWsv","lm0pDUlU3M","JRJQBsuY4x","SbRYy0h1b1","D6rByblLA9","VBjhzuJScX",
+"SbRYysoy9t","MGlTFW3VFH","kB5nPsqVrf","RkQkea00b5","4W0TlFVMxo","rhl0J16lHc","VBjhzPb1pa","VIlwPTa8f6","Pb1pagtCA5","euZA5kB5nP",
+"pmeCdNxx9V","bgJAzblLA9","bZLvSCfgr3","QbxXccL0aE","faHir5drc6","MezSW4dEz6","TwanotlILt","8U2nUVIlwP","aez9y7X3uy","QnJ1Smz8gx",
+"16lHciqv4k","2TRI7aDGtS","XyPZN1LB1L","wDajX0YAGH","In3NSkZANm","In3NSCNHmv","piJSkjfREu","8xEKztvdkD","hSSvQsoy9t","4W0Tl0Kyfs",
+"X6PinrKDLJ","BCxeCBCxeC","xReecv2eC3","Ul4a1d85a9","7ku1pxciqp","DLhzMJRJQB","4dEz6suY4x","aez9y7hyVv","blLA9l83Ud","lXFOB8cVD3",
+"v1HlnVIlwP","BbwgAk85Ae","v8yFNX6Pin","M3zXLl83Ud","OUYuFCdyBV","OHaBzuTacx","YjB9tpT8wu","pmeCdxXTI4","B3qem16lHc","hUTw7IjTwP",
+"m4bxUCxVEf","StlDJMGlTF","pAhR1Uvlv4","yluBx5iGN5","8U2nU7X3uy","AmdQdtjQxs","TCgPpd85a9","QYxC0l83Ud","JKWYRtl72W","RBhp0t59lR",
+"rhl0JEoToP","48cHLM3zXL","guMb8S77LH","lCMxys7Mxk","4QMc9WMiS3","ThjNnSs0Zu","7ku1p5nmWv","IjTwPTa8f6","ZJTXHjeskS","0Kyfsuvf7A",
+"Yf2EcS2Dfu","9eoRcAIYUu","0KyfsnlaBy","blLA97fsYM","NhXduDQimp","DQimpaez9y","uvf7AM3zXL","6AFT0tvdkD","JkzUnuLtKs","fLNg8tlILt",
+"StlDJZUnqt","cQOnvCNHmv","MaJQsv1Hln","FFDuipFrrl","KASQ8ksJby","0h1b1Gv3Fq","8hJdtHRxd8","xXTI4Z4I1v","tlILtbZLvS","rz7UtaDGtS",
+"VjCZqdQ586","AmdQdzbIYY","mz8gxl83Ud","AIYUuqQxHP","faHirTXQ0Z","v8yFNl83Ud","tvdkDReKEW","Mm8siTCgPp","HP433d85a9","LewvMsoy9t",
+"faHiruupzk","rz7UtFxX9q","kZANmLbRTH","45cIHn8pJ9","RkQkes7Mxk","m4bxUfaHir","hi5X7aez9y","zQt6QO3iyQ","piJSkKASQ8","oVQp6pFrrl",
+"GWqqXQnJ1S","48cHLP6bcg","d85a9IKxdL","bgJAzyvOMI","xXTI448cHL","HRxd8VerEA","v1HlnOUYuF","AXpwEQssNC","fcJOyFGzgp","AmdQdFLsph",
+"RACuj0MR5X","sx5GlLDk6f","EdBKczY1GY","5drc6zqH0W","FLsphCp3mZ","tvdkDQbxXc","5IhmGFLsph","MK07YJ2mQi","aL6AJ8U2nU","Gv3FqpiJSk",
+"yEfy9ulk41","KASQ8U3yw5","3otm6AgJHQ","M6qcGZhwG1","xciqpQYxC0","YOfrYZv7z0","fmIK1tl72W","fLNg8i3pyd","aDGtS580YD","vOqCEm4bxU",
+"hYBCKciuWz","7lUXZwiHrZ","UmaEvtAOsr","Cfgr3ix74r","VBjhzECMvU","n1pmOQWxoT","IjTwPVNCPd","K4GS8FPfSE","FFDuipiJSk","uTacxAXpwE",
+"RpBQmS77LH","BGaQYSs0Zu","Vprf2AmdQd","a00b5MmsIo","5VZjSt98iW","0Wr5y8FmFH","ogLgcyvOMI","5drc6zY1GY","Vprf2ZUnqt","5IhmG7ku1p",
+"sqVrfStlDJ","taOXKrhl0J","WPmlxO3iyQ","VIlwP8FmFH","faHir9eoRc","v8yFNt98iW","7fsYMThjNn","29QAz2Nslm","EoToPni2v1","hE1QliKqhr",
+"jzUqRLewvM","MmsIoSs0Zu","o8UydW3VFH","Gv3FqS77LH","fcwDahYBCK","16lHcOz8yZ","HP433Pb1pa","8cVD3JIqXi","NhXduS2Dfu","7hyVvsuY4x",
+"azIWpzqH0W","pWiOsTa8f6","RsQUqFjHXR","2DREsiB08l","fFDrJQ6hMC","4W0Tlx3LDe","h1zcHZzJHW","v1HlnJJs5m","aL6AJciuWz","W7cTsQssNC",
+"8hJdt8FmFH","Yh1hFvLsmS","VBjhzLDk6f","uN6r3sqVrf","jSjS3FPfSE","NAFuwK20wK","okgRiPb1pa","RkQkepFrrl","jtn0X2DREs","faHirfcJOy",
+"qUJMda00b5","GSQwjzbIYY","CIShG1v5hH","RpBQmsuY4x","AXpwE0MR5X","uZPqgAkKTk","P6bcgFjHXR","B3qematef2","DLhzMNAFuw","mX2GEv1Hln",
+"CqqaDRzaZA","uoStw7Ow5C","pAhR1SmGzv","48cHLydG8U","MaJQsW3VFH","bZLvSiwzGk","ru4UGcShY2","uJScXblLA9","29QAzLbRTH","fcwDafFDrJ",
+"vOqCEQssNC","P6bcgRACuj","aL6AJFxX9q","cShY2OUYuF","fLNg8Vprf2","Ul4a129QAz","IBe8k2Nslm","blLA97Ow5C","HlUbFpvgjS","0h1b1MmKGJ",
+"7X3uyG1RhS","Oz8yZGrDg7","7X3uy5VZjS","tl72WuN6r3","9iGoTokgRi","U3yw5h1zcH","n8pJ9QClRL","WMiS3Waim6","qUJMdgtCA5","64s8NHzZT8",
+"pAhR17Ow5C","RsQUqOHaBz","8U2nUguMb8","P6bcgpv0i7","2DREs6AFT0","tvdkDY1mC0","64s8NUl4a1","i3pyd14FLR","faHirRACuj","AgJHQs7Mxk",
+"yvOMI2Nslm","zmLYDt59lR","rKDLJ45cIH","zbIYYlpF6W","cL0aES77LH","WDVWJFcWrW","cL0aEFNYIM","qaofNcShY2","MaJQs5Drn0","PYBf4zqH0W",
+"Yf2EcW3VFH","xXTI46q6L9","TCgPpP6bcg","pT8wufcJOy","TXQ0ZtuDyS","Pb1pa9y4lw","FNYIMbZLvS","fcJOyW3VFH","a00b5YjB9t","uLtKst59lR",
+"CK5W75ZaEz","qQxHPZzJHW","5IhmGFPfSE","GWqqXazIWp","Cfgr3gjUTu","48cHLRpBQm","NhXduUlU3M","guMb8jtn0X","hE1QlFPfSE","16lHcReKEW",
+"uLtKsTCgPp","pmeCdVBjhz","pAhR1Chuy3","UlU3M5Namm","TwanoThjNn","2ZHdkQWxoT","DQimpe6e4z","iKqhrQnJ1S","yluBxLewvM","HRxd87Ow5C",
+"QWxoTGSQwj","n8pJ9RACuj","v1HlnaDGtS","azIWp5drc6","BFkb8okgRi","jeskSKZamH","0PktIQ6Lix","EoToPBFkb8","pmeCdW7cTs","hSSvQuN6r3",
+"I7p2aCfgr3","TXQ0ZGrDg7","sx5Gl16lHc","Z4I1v5nmWv","xReecFwEJz","uPX7GPb1pa","v1HlnOHaBz","dQ586sqVrf","8xEKzn8pJ9","MaJQsVjCZq",
+"KsjRKdhSuH","OHaBzSbRYy","M6qcGHP433","vOqCEhe9IA","F6PT2Q6Lix","P6bcg0YAGH","lXFOBYh1hF","brhlQWmadA","uAWypLewvM","jSjS3BCxeC",
+"rz7Utsoy9t","uoStwtlILt","euZA5gdQsS","RzaZAdQ586","oQ87roQ87r","mz8gxWreyP","FxX9qDz1R3","pAhR11v5hH","5VZjSzHF1q","Ul4a12TRI7",
+"zHF1qe6e4z","y94nwQClRL","ZUnqtB3qem","qUJMdAgJHQ","XyPZNyEfy9","2hEEUUvlv4","okgRinnP8o","iwzGkS77LH","StlDJdmoS7","GXdoH55rfB",
+"HP4330YAGH","4QMc9Zv7z0","okgRiJJs5m","VLTy6JKWYR","FGzgpeuZA5","RzaZA48cHL","3otm6WaWsv","piJSkIRh48","WMiS3pAhR1","WDVWJF6PT2",
+"EdBKcOHaBz","xReeclweGy","5Mg9rS77LH","cmXIXFjHXR","zQt6Qfqypy","XflUqNcICA","FVMxoK20wK","tuDySFNYIM","14FLRyofH3","AgJHQY1mC0",
+"29QAzpT8wu","QWxoTF6PT2","tuDyS8TxD7","yToGWWMiS3","IjTwPReKEW","kZANmFPfSE","d7vjMaDGtS","ogLgchSSvQ","MK07YYf2Ec","HfyNQMK07Y",
+"EOE1otjQxs","VjCZqYw2oU","brhlQAmdQd","Ul4a1ZUnqt","45cIH5Namm","n1pmOS2Dfu","FxX9qU3yw5","P6bcgCqqaD","faHirhe9IA","1v5hH7X3uy",
+"W7cTs2ZHdk","VBjhz0MR5X","X6PinWDVWJ","uN6r348cHL","DG4sTReKEW","OUYuFM3zXL","HRxd8mz8gx","VerEA5iGN5","MmKGJLewvM","YjB9tlViBv",
+"SbRYycL0aE","AIYUuFhtgl","TwanoKr8ys","QChxsTXQ0Z","TCgPpIn3NS","7ku1pZ4I1v","5iGN5FcWrW","lCMxyn1pmO","XflUqtjQxs","DcpWBy94nw",
+"SbRYyjeskS","IjTwPuAWyp","DcpWBaFFss","2Yz7E8FmFH","uJScXChuy3","yToGWS2Dfu","9rlg9ZhwG1","5drc6fLNg8","RsQUqGXdoH","ZUnqtru4UG",
+"Uvlv4G1RhS","zqH0W2ZHdk","bgJAzKsjRK","S77LHcmXIX","6AFT0xXTI4","3otm6s93Ml","9GXkXDcpWB","FwEJzy94nw","Yh1hFMGlTF","wiHrZXyPZN",
+"lXFOBO3iyQ","RACuj07n1c","Dz1R3QClRL","jSjS3lj07Q","BFkb8y94nw","2TRI7blLA9","uJScXbrhlQ","iqv4kvkCHH","Y1mC024ARF","jS1ajPOUYS",
+"7lUXZPOUYS","9rlg98RCUA","zY1GYFFDui","FwEJzksJby","t59lRciuWz","ECMvUCK5W7","tuDySYw2oU","6q6L955rfB","zmLYDMaJQs","okgRiFnPFB",
+"0h1b1prNT6","uupzkS2Dfu","brhlQAgJHQ","oVQp6kB5nP","HzZT8JXljW","OUYuFFjHXR","s4786JXljW","K4GS8ni2v1","yToGWix74r","hSSvQ5Drn0",
+"16lHcTCgPp","wiHrZpFrrl","FNYIMuZPqg","mz8gxo8Uyd","piJSk6AFT0","kB5nPRmDcr","dpe1v5iGN5","VIlwPReKEW","5Drn0rKDLJ","0Wr5y2Nslm",
+"aL6AJfaHir","PYBf4UlU3M","IjTwPs4786","6q6L9SmGzv","6AFT0X6Pin","Ta8f67Ow5C","FPfSEOUqFM","SjskQQYxC0","0KyfsMkgy8","OHaBzyluBx",
+"HP433Ta8f6","lViBvSmGzv","FhtglaFFss","POUYSoGu6x","FwEJzU3yw5","qQxHPK20wK","8xEKztlILt","ogLgcdpe1v","lH1ktWaWsv","In3NS7fKYU",
+"pT8wu2Yz7E","Q6hMCksJby","he9IA6AFT0","vkCHHs4786","gIYvEGWqqX","AXpwED6rBy","RsQUqgdQsS","yofH3prNT6","vLsmSoVQp6","Waim6KsjRK",
+"YjB9t5IhmG","LbRTHSs0Zu","Y1mC0yvOMI","jzUqR1j5L8","yvOMI8cVD3","HfyNQt98iW","5VZjSoGu6x","vkCHHciuWz","gf8rIHzZT8","QnJ1SOz8yZ",
+"CdyBVzHF1q","piJSk0YAGH","kZANmKZamH","lCMxyfcJOy","s4786wiHrZ","No0QbpvgjS","8FmFHYjB9t","55rfBjzUqR","8hJdt5Namm","lCMxygf8rI",
+"Ul4a1ogLgc","oQ87rs7Mxk","HfyNQ580YD","VBjhze6e4z","NcICARACuj","yluBxx3LDe","BCxeCQChxs","5NammgIYvE","jiVBPWaim6","cQOnvoGu6x",
+"GrDg7m4bxU","RACujFwEJz","fLNg8d85a9","Vprf2tvdkD","UlU3MdmoS7","AXpwEKsjRK","KZamHI7p2a","Yh1hFUmaEv","RzaZAEdBKc","JJs5mYOfrY",
+"5nmWv2TRI7","Cfgr3lm0pD","MmsIozY1GY","8cVD36q6L9","ksJbyxXTI4","No0QbIKxdL","hE1QlOz8yZ","IRh48hi5X7","Mkgy89rlg9","hSSvQeuZA5",
+"t59lRNxx9V","NOHszC2Irc","x3LDeCp3mZ","8xEKzt98iW","BCxeCblLA9","hYBCKx3LDe","NhXdupAhR1","HzZT8fcJOy","uoStw9y4lw","piJSkX6Pin",
+"bgJAza00b5","AgJHQRsQUq","VLTy6O3iyQ","SmGzvtvdkD","5Drn0RkQke","BbwgAzQt6Q","xXTI4oVQp6","uvf7ACfgr3","Kr8ysNxx9V","gf8rIAkKTk",
+"IKxdLVjCZq","jiVBPDcpWB","yEfy9BGaQY","hUTw7uLtKs","lj07QXyPZN","8xEKzpAhR1","2ZHdkazIWp","5NammxXTI4","BpYhV2ZHdk","7ku1pFnPFB",
+"oGu6xX6Pin","MmsIo8hJdt","jfREu0MR5X","k85AeJIqXi","brhlQjS1aj","KASQ8Zv7z0","JXljWRpBQm","3otm6zQt6Q","7lUXZRpBQm","cmXIXSmGzv",
+"MaJQsGSQwj","pFrrlSbRYy","NOHsz7Ow5C","dQ586FGzgp","29QAz2DREs","Yw2oU9GXkX","vkCHHpWiOs","NOHszLbRTH","b29RJ5Drn0","tvdkDQWxoT",
+"rz7UtIRh48","Q6LixyEfy9","AXpwEHP433","aFFsstjQxs","dmoS7VIlwP","8RCUA5drc6","kB5nPydG8U","zFgtBv2eC3","OUYuF8RCUA","QssNCNOHsz",
+"07n1cuN6r3","QYxC0v8yFN","Yf2EcGv3Fq","guMb8t59lR","8cVD3Yh1hF","lweGyI7p2a","k85AeK20wK","Yh1hFuLtKs","sqVrfWDVWJ","P6bcg9eoRc",
+"ZhwG1HlUbF","yvOMINhXdu","BCxeCK4GS8","8xEKzoVQp6","prNT6bgJAz","7lUXZCdyBV","yofH3hYBCK","JRJQB2ZHdk","5nmWvJIqXi","ru4UGv2eC3",
+"7fsYM580YD","gdQsSQWxoT","pWiOspvgjS","IKxdLjtn0X","x3LDe9rlg9","W7cTsv1Hln","uN6r3l83Ud","Dz1R3d85a9","ulk41FxX9q","8cVD3FVMxo",
+"kB5nP8U2nU","jeskS5nmWv","lpF6W07n1c","BbwgAQ6Lix","D6rBy0MR5X","CdyBVmX2GE","4dEz6pv0i7","h1zcHt59lR","Cfgr3XflUq","Gv3FqRBhp0",
+"J2mQi8FmFH","07n1cIBe8k","NcICAVIlwP","K4GS8oQ87r","tl72WTCgPp","lH1ktZzJHW","ciuWz48cHL","ZhwG1Mkgy8","uupzkQ6Lix","CIShGrhl0J",
+"5iGN5v2eC3","rhl0JKASQ8","Oz8yZK4GS8","qUJMdOHaBz","faHirlXFOB","7fKYUKsjRK","BFkb84W0Tl","zz4ZU7ku1p","dhSuHzQt6Q","DcpWBix74r",
+"5iGN5580YD","B3qemYh1hF","HlUbF9iGoT","GWqqX2ZHdk","Dz1R30ao3l","Gv3FqtaOXK","0YAGHuZPqg","5iGN5uupzk","DcpWBUl4a1","atef2Ta8f6",
+"yEfy9ydG8U","Cp3mZWaWsv","RsQUqzY1GY","Pb1pa1LB1L","tvdkD0BmCy","0Wr5y4W0Tl","UmaEvlweGy","FxX9q8cVD3","cShY2QnJ1S","ReKEWIBe8k",
+"ciuWz3otm6","rKDLJZzJHW","5nmWvNxx9V","Yf2EcM3zXL","bZLvSOxWIH","xXTI48TxD7","S2DfuUmaEv","sqVrfJRJQB","GrDg7OUYuF","8U2nUzY1GY",
+"LDk6fyofH3","WreyPY1mC0","uvf7AFhtgl","lH1ktiwzGk","7hyVvsqVrf","VIlwPXflUq","TCgPpTwano","uupzkQWxoT","MmsIoVprf2","s47865VZjS",
+"lkMUA7fKYU","okgRizFgtB","HP43316lHc","YOfrYMm8si","atef2HfyNQ","6q6L9OUqFM","SjskQlXFOB","zFgtBfLNg8","CdyBVOxWIH","sqVrfIBe8k",
+"Kr8ysWaim6","e6e4zFLsph","CqqaDpT8wu","MmKGJLbRTH","0ao3l7X3uy","d85a9FxX9q","PYBf4RmDcr","rhl0Jxciqp","taOXKQChxs","gf8rIyluBx",
+"Vprf2JIqXi","uupzkPb1pa","FnPFBW7cTs","RsQUqCdyBV","S77LH7Ow5C","Qworu7Ow5C","zbIYY2DREs","0BmCy8U2nU","ulk41lViBv","C2IrcguMb8",
+"CK5W7SmGzv","i3pydFGzgp","G1RhSv1Hln","45cIHIKxdL","uupzktl72W","QChxsPYBf4","pT8wu0MR5X","djsrvOUYuF","hi5X7hE1Ql","B3qemCp3mZ",
+"AmdQd8RCUA","5iGN52hEEU","DG4sTuZPqg","oVQp6ix74r","brhlQWDVWJ","kB5nPDG4sT","yluBxBFkb8","Gv3FqCfgr3","d85a9okgRi","3weIFbgJAz",
+"RzaZAQbxXc","jfREufLNg8","uTacxTwano","VBjhzHfyNQ","Z4I1vAOgEe","kZANmogLgc","IjTwPix74r","v2eC3xXTI4","cQOnvCIShG","ydG8UoGu6x",
+"lCMxyIBe8k","BGaQYJKWYR","tuDySFjHXR","RpBQmSbRYy","CIShGlXFOB","d85a9JkzUn","SWfou5Mg9r","8FmFH0BmCy","fcJOyDQimp","VIlwP5Mg9r",
+"faHirdjsrv","aFFssJRJQB","oVQp62ZHdk","ZuDtDaDGtS","v1Hln0YAGH","iqv4kBbwgA","lViBvhi5X7","NhXduaL6AJ","Zv7z0atef2","RACujL7cGc",
+"dpe1vQssNC","WaWsva00b5","ZUnqt5drc6","jfREuhe9IA","gtCA5x3LDe","piJSkGrDg7","wiHrZHRxd8","pAhR18RCUA","DG4sTgf8rI","uQIczKsjRK",
+"brhlQB3qem","8hJdtBGaQY","SmGzvhSSvQ","RsQUqQYxC0","WDVWJ3weIF","LDk6fJIqXi","fcwDaIBe8k","CxVEf580YD","jtn0XMm8si","atef2GWqqX",
+"NOHszOz8yZ","PYBf448cHL","JJs5mi7WMQ","djsrvCNHmv","sqVrfuvf7A","SbRYy07n1c","s93MllsQGo","XyPZNThjNn","2Yz7EFPfSE","iwzGkCxVEf",
+"UmaEvYf2Ec","0MR5XBCxeC","14FLR7ku1p","C2IrcuTacx","HfyNQZ4I1v","5iGN5C2Irc","Q6hMCDcpWB","d7vjMFPfSE","dmoS7tvdkD","Ul4a1uJScX",
+"iB08l5drc6","FLsphEoToP","bZLvSGv3Fq","rKDLJUlU3M","In3NSdhSuH","m4bxUtAOsr","48cHLt98iW","gdQsSW7cTs","dQ586fmIK1","GWqqXfaHir",
+"ZzJHWzFgtB","S77LH9eoRc","HfyNQs7Mxk","zY1GYU3yw5","tvdkDpvgjS","vkCHHuPX7G","ksJbyECMvU","TwanouAWyp","s7MxkIn3NS","lm0pDHRxd8",
+"zFgtBDcpWB","2ZHdkuAWyp","5nmWvt59lR","i7WMQydG8U","HlUbFCxVEf","DQimpv2eC3","uAWypWreyP","VjCZqhYBCK","soy9tGWqqX","G1RhSNOHsz",
+"9iGoTIRh48","YjB9tYh1hF","IjTwPWreyP","jiVBPiKqhr","wiHrZvkCHH","ZzJHWFxX9q","zqH0WSmGzv","faHiraDGtS","9GXkXuAWyp","PYBf4SbRYy",
+"BbwgAHzZT8","uQIcz07n1c","Yh1hFMK07Y","ni2v1atef2","sqVrf9iGoT","QWxoTxXTI4","yvOMI2hEEU","gdQsSgf8rI","BpYhV5IhmG","aFFsst59lR",
+"BFkb8zbIYY","s93MlzY1GY","ru4UGHRxd8","TXQ0ZX6Pin","uAWyp1LB1L","lCMxylm0pD","Yf2EchUTw7","8cVD35ZaEz","9XyT9VBjhz","G1RhSBCxeC",
+"DLhzMtl72W","IKxdLNhXdu","kB5nP1v5hH","gtCA5vkCHH","7lUXZhUTw7","xReecuLtKs","FxX9qcShY2","Kr8yst59lR","okgRi6q6L9","HP433AmdQd",
+"uLtKsfFDrJ","YjB9tjSjS3","tl72W0PktI","DG4sTGv3Fq","9eoRc8FmFH","CdyBVt98iW","ECMvUhE1Ql","SjskQqQxHP","cmXIXdpe1v","oQ87rwiHrZ",
+"yEfy9uZPqg","Mkgy80Kyfs","uPX7G16lHc","45cIHMm8si","9iGoT9rlg9","ciuWz0Kyfs","S77LHrz7Ut","8xEKzpmeCd","QbxXcMojnP","QnJ1SVjCZq",
+"ulk410ao3l","9XyT98cVD3","zz4ZUFnPFB","cL0aETCgPp","zFgtBcQOnv","RpBQmLbRTH","JJs5mXflUq","WmadAzmLYD","yvOMIDz1R3","ni2v1QbxXc",
+"Oz8yZ24ARF","55rfBpvgjS","t59lRGXdoH","2ZHdkciuWz","qQxHPzFgtB","qUJMdxReec","UlU3MlH1kt","580YDfqypy","pmeCdDz1R3","lj07QaFFss",
+"5nmWvDG4sT","i3pydKsjRK","FwEJzHfyNQ","n8pJ9OHaBz","MezSWzbIYY","9GXkXoQ87r","blLA9prNT6","AIYUuZUnqt","nnP8oZ4I1v","YOfrYTCgPp",
+"he9IApWiOs","gdQsSQYxC0","sqVrfM6qcG","W3VFHzY1GY","CIShG45cIH","yEfy9ZJTXH","Q6LixQYxC0","zmLYDa00b5","uPX7GRmDcr","KZamHEOE1o",
+"qaofNsqVrf","pAhR1zbIYY","Ul4a1K4GS8","k85Aes7Mxk","5nmWvW3VFH","hE1QlG1RhS","QnJ1SeuZA5","y94nwhi5X7","RxrsmCNHmv","AXpwEQClRL",
+"QClRLS77LH","GSQwji7WMQ","TXQ0ZQbxXc","VerEAStlDJ","tl72W4W0Tl","ThjNnAIYUu","pAhR107n1c","Fhtglv1Hln","GWqqXpT8wu","GSQwjlpF6W",
+"WmadA7Ow5C","8TxD7UlU3M","guMb8k85Ae","iKqhrtaOXK","B3qemRsQUq","8TxD7m4bxU","Q6hMCHP433","guMb8VBjhz","OUYuFFwEJz","aez9yd7vjM",
+"DLhzM9GXkX","EOE1olXFOB","dpe1vt98iW","Yh1hF4W0Tl","1v5hHv1Hln","mX2GE2DREs","VBjhzQClRL","t98iWKASQ8","FnPFBNo0Qb","uAWypPOUYS",
+"Yf2EcrKDLJ","CxVEf3otm6","O3iyQ5VZjS","pvgjSzqH0W","1v5hHU3yw5","F6PT2FcWrW","zFgtBtl72W","Cfgr3tvdkD","29QAzzFgtB","U3yw57fsYM",
+"OHaBzNOHsz","KsjRKW7cTs","rz7Ut8TxD7","Oz8yZ6q6L9","L7cGchE1Ql","lCMxyJXljW","JKWYRCNHmv","MGlTFQnJ1S","UmaEvsqVrf","gdQsSaFFss",
+"dhSuHHP433","0Wr5yMmKGJ","ogLgcZUnqt","SbRYyhi5X7","29QAz16lHc","2ZHdkQClRL","J2mQiOHaBz","FPfSErKDLJ","v2eC3tl72W","pT8wuyluBx",
+"aez9y5Drn0","jeskS5iGN5","nlaByfcJOy","zY1GYzHF1q","CdyBVwiHrZ","iB08lRmDcr","uN6r3prNT6","Z4I1vn1pmO","8hJdtuTacx","aL6AJHfyNQ",
+"nlaBywiHrZ","zqH0W5IhmG","Dz1R3xXTI4","DG4sTVBjhz","ogLgcFLsph","Chuy3guMb8","9XyT99GXkX","P6bcgxReec","3otm6uPX7G","OxWIHaez9y",
+"dhSuHfqypy","hYBCKIBe8k","blLA9WmadA","zmLYDlCMxy","nlaByMGlTF","HP433HRxd8","4dEz6bZLvS","S2Dfui3pyd","8xEKzCqqaD","Kr8ysBbwgA",
+"O3iyQUlU3M","uLtKsb29RJ","Chuy3zmLYD","8U2nUBGaQY","9iGoTY1mC0","tjQxsxXTI4","taOXKOxWIH","VjCZqUlU3M","hYBCKTwano","W3VFHPb1pa",
+"BGaQYAIYUu","ECMvU64s8N","cL0aElj07Q","Chuy3QbxXc","iwzGk6q6L9","jS1ajzqH0W","mX2GE4W0Tl","nFqikvLsmS","VNCPdFxX9q","QWxoTprNT6",
+"FhtglECMvU","s93Ml0Kyfs","v8yFND6rBy","NhXdu9eoRc","lpF6WnnP8o","PYBf4d7vjM","M6qcGPOUYS","24ARFyEfy9","NcICAXyPZN","2ZHdkIRh48",
+"Vprf2LewvM","GXdoHgIYvE","qQxHPcL0aE","ydG8UqUJMd","uQIczUmaEv","AkKTkru4UG","QClRLhE1Ql","fcJOyBFkb8","uupzkdpe1v","CIShGCIShG",
+"IBe8krKDLJ","JkzUn7fsYM","uZPqg0MR5X","lm0pDaFFss","AIYUuVerEA","5drc6BCxeC","fFDrJuvf7A","NAFuwlweGy","QYxC0yvOMI","pmeCdWmadA",
+"uZPqgVBjhz","SmGzvqaofN","y94nwgjUTu","i7WMQWMiS3","prNT6NOHsz","Mm8sidQ586","9XyT9RzaZA","wiHrZBFkb8","Ss0ZuCNHmv","CK5W7IBe8k",
+"7ku1pFGzgp","RmDcrM3zXL","uupzkEOE1o","K4GS8Nxx9V","M6qcGOUqFM","M6qcGFwEJz","fqypy7lUXZ","uPX7GFLsph","AmdQd5ZaEz","gf8rIazIWp",
+"h1zcHtAOsr","ru4UGwDajX","StlDJuupzk","yluBxjiVBP","P6bcgQworu","2hEEUQChxs","fmIK1uupzk","GrDg7l83Ud","cmXIXlViBv","LewvM5drc6",
+"iB08lfcJOy","2ZHdkJkzUn","CIShGRpBQm","MK07YRkQke","pv0i7Vprf2","iqv4kPOUYS","OUqFMnFqik","ZhwG1sqVrf","djsrvs93Ml","2Nslm07n1c",
+"cQOnvazIWp","aFFsszz4ZU","HP433IBe8k","BpYhVtvdkD","lCMxyMojnP","xXTI4U3yw5","3weIFn1pmO","9iGoTpT8wu","k85Ae29QAz","IKxdLJRJQB",
+"MGlTFwiHrZ","DLhzMhYBCK","7X3uyFGzgp","FwEJzEoToP","vLsmS6AFT0","7Ow5CF6PT2","zHF1qtvdkD","1j5L8QChxs","0Wr5yvLsmS","QClRLVBjhz",
+"x3LDedpe1v","W7cTsOz8yZ","Pb1paSmGzv","hSSvQNOHsz","29QAz9iGoT","QnJ1S5drc6","16lHche9IA","qUJMdbrhlQ","iwzGk2Yz7E","FLsphAOgEe",
+"XflUqNhXdu","s4786cShY2","HlUbFHRxd8","7fKYUMmKGJ","0Wr5yaez9y","4QMc94QMc9","dmoS7FPfSE","Waim6pT8wu","FFDuix3LDe","Mkgy8BpYhV",
+"WmadAfaHir","yToGWCxVEf","nnP8oAXpwE","mz8gxRpBQm","BpYhVt59lR","xciqpVIlwP","lj07Q2Yz7E","dpe1v8xEKz","fmIK1Vprf2","rhl0JfaHir",
+"7fsYMsqVrf","aDGtS0h1b1","BCxeCyToGW","JIqXijfREu","W3VFHC2Irc","55rfBvkCHH","6q6L9cL0aE","0PktIulk41","atef2lH1kt","zz4ZUDLhzM",
+"DG4sTGWqqX","7hyVvlweGy","ZUnqtSs0Zu","S77LHiqv4k","Nxx9VZhwG1","MGlTFPOUYS","C2Irc1j5L8","MmKGJatef2","RsQUqn8pJ9","qUJMdmz8gx",
+"ni2v1kZANm","Z4I1vatef2","fmIK1nFqik","zFgtBJJs5m","HzZT8SWfou","IjTwPLDk6f","mz8gxdQ586","x3LDe5VZjS","mz8gxxReec","uQIcziqv4k",
+"yvOMIs7Mxk","AgJHQMK07Y","tuDySNhXdu","hi5X7QChxs","cQOnvprNT6","lViBvYOfrY","LDk6fOUqFM","6AFT08cVD3","cmXIXMojnP","TCgPpdmoS7",
+"07n1cuLtKs","gjUTu2ZHdk","TXQ0ZAgJHQ","9rlg9EdBKc","FcWrW6q6L9","zQt6Qh1zcH","vkCHHWDVWJ","uvf7AzqH0W","2ZHdky94nw","8U2nUBFkb8",
+"e6e4zCp3mZ","ydG8UNAFuw","QnJ1SNAFuw","ksJby9y4lw","RBhp0OHaBz","YjB9taez9y","7fsYMdQ586","jtn0XfcJOy","s4786taOXK","tuDyScL0aE",
+"RkQke8RCUA","5iGN5VLTy6","rhl0JcShY2","dhSuHCp3mZ","rKDLJ07n1c","0h1b1vLsmS","QChxs5drc6","LbRTHuAWyp","QbxXckZANm","cQOnvuupzk",
+"y94nwulk41","hSSvQWreyP","FGzgpfmIK1","5iGN5iKqhr","nnP8o0PktI","ksJbyzbIYY","faHirKsjRK","jeskSfqypy","n8pJ9dmoS7","No0Qbgf8rI",
+"KsjRKSbRYy","6q6L9pAhR1","TCgPpMmsIo","8FmFHdpe1v","ReKEWJJs5m","RxrsmG1RhS","X6Pinxciqp","Mm8siuAWyp","rhl0J2DREs","piJSkpWiOs",
+"lj07QokgRi","cmXIXuPX7G","4dEz6AXpwE","4W0TlCNHmv","yvOMIaL6AJ","2NslmpFrrl","ru4UGFNYIM","8xEKzZUnqt","QworupvgjS","7fsYMyluBx",
+"07n1cJkzUn","KASQ8I7p2a","VjCZqs93Ml","s93MlaDGtS","wiHrZ0MR5X","rKDLJfLNg8","K20wK0MR5X","NAFuwk85Ae","lViBvDG4sT","prNT6nFqik",
+"suY4xCK5W7","0h1b1Q6Lix","EdBKcM3zXL","ZUnqtmX2GE","VNCPdlXFOB","aL6AJSmGzv","lXFOBgIYvE","OxWIHuLtKs","MK07Y0ao3l","1LB1LCp3mZ",
+"iwzGkVjCZq","CIShGt59lR","WreyPGWqqX","nlaByazIWp","5iGN5pv0i7","a00b545cIH","M3zXLv2eC3","5Drn0FGzgp","BFkb89XyT9","n8pJ9IBe8k",
+"3otm6RsQUq","G1RhSNAFuw","xciqpQ6hMC","djsrvSs0Zu","P6bcgs7Mxk","DG4sTfaHir","Fhtgl6q6L9","v2eC3piJSk","i3pyds7Mxk","lweGylkMUA",
+"ni2v1zQt6Q","0KyfsBGaQY","JXljWqaofN","aDGtSnlaBy","bZLvS07n1c","BGaQYAmdQd","DcpWBl83Ud","4QMc9lkMUA","QssNClsQGo","1v5hHfcJOy",
+"AOgEennP8o","SmGzv0PktI","5NammlkMUA","WDVWJaL6AJ","IRh48cmXIX","oGu6xtuDyS","RxrsmMK07Y","MGlTF5drc6","fLNg8CdyBV","QssNCM3zXL",
+"zHF1qnlaBy","OxWIHCK5W7","KZamHCNHmv","MezSW2TRI7","FLsphXflUq","9XyT9cShY2","9iGoTv2eC3","ulk41W7cTs","gjUTu1LB1L","sqVrf0Wr5y",
+"nFqikYw2oU","QClRLVjCZq","1j5L8hUTw7","xXTI4FnPFB","3otm6JJs5m","W3VFHhi5X7","HP433gdQsS","16lHcLDk6f","ReKEWQbxXc","yToGW2TRI7",
+"Chuy364s8N","BGaQYXyPZN","QClRLhYBCK","xciqpMmKGJ","UlU3M1j5L8","S77LHnFqik","GXdoH1LB1L","0Wr5y7lUXZ","sx5GliwzGk","uTacxBFkb8",
+"DQimpjSjS3","CdyBVKZamH","gf8rI8xEKz","6AFT016lHc","pWiOsgjUTu","Vprf2suY4x","djsrv2Yz7E","s7MxkpiJSk","0ao3lHRxd8","MmKGJuPX7G",
+"DcpWBFVMxo","FPfSEdQ586","gdQsSFcWrW","07n1cQssNC","HlUbF8RCUA","Mkgy8WmadA","K20wKfaHir","0KyfszmLYD","yluBxvLsmS","VLTy6YjB9t",
+"Mkgy8EdBKc","VjCZq07n1c","QYxC02ZHdk","Dz1R3580YD","Gv3Fq4W0Tl","4W0TllCMxy","VIlwPSs0Zu","8hJdtuvf7A","48cHLPOUYS","cShY2Yw2oU",
+"HlUbFk85Ae","ru4UGiqv4k","v2eC3B3qem","Q6LixcQOnv","uTacxiqv4k","ReKEWQ6Lix","VNCPdWmadA","fLNg8SjskQ","aDGtSMm8si","ZzJHWHRxd8",
+"vOqCE5IhmG","VLTy6Fhtgl","zY1GYFGzgp","ZhwG1CdyBV","Ss0ZuOxWIH","s93MlMkgy8","Vprf21LB1L","YOfrYuPX7G","QnJ1SDz1R3","55rfBo8Uyd",
+"iqv4kciuWz","FxX9qCp3mZ","XflUq9rlg9","14FLRRACuj","HfyNQDG4sT","JJs5mnFqik","DLhzMRkQke","GSQwjlj07Q","Cfgr3CqqaD","aez9ynnP8o",
+"Zv7z08RCUA","kZANm7X3uy","9iGoTCxVEf","5ZaEzBbwgA","okgRiyluBx","SWfou6AFT0","pvgjSD6rBy","zHF1q14FLR","No0QbAgJHQ","RACujciuWz",
+"uAWypmz8gx","16lHcl83Ud","l83UdGSQwj","Mkgy8QbxXc","D6rByDLhzM","dmoS7EdBKc","suY4xpAhR1","K4GS81j5L8","6q6L9KASQ8","FFDuiuupzk",
+"jiVBPGrDg7","Yh1hFFVMxo","lkMUAjS1aj","7Ow5Cni2v1","VNCPdm4bxU","In3NS0ao3l","64s8NFcWrW","uJScXfFDrJ","1LB1L5iGN5","RzaZAAXpwE",
+"48cHLO3iyQ","FFDuiDG4sT","RBhp08U2nU","VLTy6HRxd8","lj07Qo8Uyd","x3LDeK20wK","yvOMI7fsYM","piJSk2DREs","AmdQd9iGoT","RmDcrlH1kt",
+"ReKEWwDajX","AgJHQC2Irc","blLA9KZamH","ulk41ZzJHW","FwEJziqv4k","5iGN53weIF","iqv4kdmoS7","FhtglMK07Y","aL6AJZv7z0","ThjNnzbIYY",
+"VjCZqAXpwE","L7cGc5Mg9r","i3pyduAWyp","i3pydQWxoT","OHaBzKZamH","S77LHJkzUn","QChxsUmaEv","B3qemDLhzM","64s8NMK07Y","5iGN5pWiOs",
+"djsrv3otm6","45cIHhUTw7","ReKEWFGzgp","VLTy65Namm","yToGWYh1hF","iwzGkiB08l","ru4UGQbxXc","Ul4a1PYBf4","24ARFEdBKc","Twanod7vjM",
+"zz4ZUi7WMQ","NcICACqqaD","atef2Mm8si","pWiOsC2Irc","lsQGo8cVD3","JRJQBY1mC0","lpF6WTCgPp","YOfrYL7cGc","lCMxyoQ87r","FjHXRRACuj",
+"Y1mC0iKqhr","lCMxy5IhmG","Cp3mZzHF1q","1v5hH6AFT0","gjUTu1v5hH","VBjhzfLNg8","MezSWYf2Ec","zqH0WzHF1q","Ta8f6qQxHP","HP433tlILt",
+"xciqp7fKYU","ZUnqt16lHc","07n1c6q6L9","5Mg9rLewvM","ZhwG1KASQ8","zFgtBAgJHQ","nFqikvOqCE","B3qem9GXkX","7ku1pgf8rI","zQt6Q1j5L8",
+"XyPZNrz7Ut","LDk6fsx5Gl","Uvlv4uTacx","WmadABpYhV","8hJdtuPX7G","RkQkeQworu","s7MxkcShY2","MezSWZv7z0","LDk6fa00b5","ZUnqtAgJHQ",
+"0BmCy5VZjS","zqH0WGWqqX","pT8wuX6Pin","Waim6CdyBV","ZuDtD2hEEU","No0Qb8cVD3","0h1b1CIShG","4W0Tlrhl0J","0BmCyK20wK","e6e4z5ZaEz",
+"D6rByJJs5m","K20wK8xEKz","AmdQdRsQUq","hYBCKdmoS7","3weIF7hyVv","guMb8y94nw","pvgjSpv0i7","BCxeC7fKYU","5Drn0qUJMd","9eoRclH1kt",
+"8cVD3lCMxy","EOE1oX6Pin","FPfSEWMiS3","0BmCyvLsmS","tlILtn1pmO","ksJby9XyT9","prNT6OxWIH","B3qemFPfSE","y94nwSbRYy","0Wr5y5IhmG",
+"M6qcGh1zcH","lH1ktDQimp","uLtKso8Uyd","VIlwPiwzGk","qaofN7hyVv","vLsmSLDk6f","W7cTs3weIF","wiHrZiwzGk","taOXKuN6r3","TXQ0ZHzZT8",
+"MK07YFLsph","JIqXi5drc6","16lHcfmIK1","RxrsmZhwG1","tAOsrZJTXH","CK5W7Ul4a1","5IhmG8hJdt","sx5Gls7Mxk","t98iWKZamH","9y4lwEoToP",
+"nFqikciuWz","OHaBzQWxoT","AkKTkpvgjS","sqVrfuPX7G","AgJHQ2ZHdk","o8UydQWxoT","x3LDev1Hln","t59lRGWqqX","nFqiknFqik","e6e4zkZANm",
+"ciuWzlH1kt","JXljWkB5nP","0YAGHguMb8","FLsphFLsph","K4GS8WDVWJ","Yh1hFOHaBz","7fKYU7X3uy","lsQGouLtKs","07n1c14FLR","o8UydjSjS3",
+"FPfSEnFqik","tuDyS48cHL","lH1ktPOUYS","QnJ1SQ6hMC","Oz8yZzY1GY","ECMvUQbxXc","pFrrlF6PT2","lweGyPb1pa","9XyT9nFqik","WPmlxGv3Fq",
+"Yf2EcKASQ8","GXdoH0PktI","h1zcHlpF6W","ulk41guMb8","zbIYYydG8U","VerEATwano","JRJQBNhXdu","xciqpoQ87r","lH1ktuTacx","7fKYUciuWz",
+"G1RhSVNCPd","ZhwG1BpYhV","zqH0WgIYvE","QnJ1SxReec","S2DfunlaBy","MaJQsRmDcr","DG4sT2TRI7","iKqhrGv3Fq","oQ87rzbIYY","0Wr5yFVMxo",
+"uJScXhE1Ql","s4786jS1aj","yofH3DG4sT","pmeCdKr8ys","taOXKdQ586","vLsmSUvlv4","prNT6gdQsS","O3iyQtjQxs","zQt6QWaWsv","JkzUnfFDrJ",
+"S77LHVprf2","WaWsvIjTwP","zY1GYsqVrf","L7cGcWaWsv","dQ586qQxHP","QnJ1S48cHL","brhlQFxX9q","HlUbFWreyP","9iGoThi5X7","rz7Utv2eC3",
+"nFqikpvgjS","Waim6UlU3M","zbIYYzHF1q","FcWrWbrhlQ","8TxD7Kr8ys","djsrv6q6L9","64s8NFNYIM","5iGN5S2Dfu","HzZT8VNCPd","1j5L8sx5Gl",
+"HRxd84QMc9","9GXkXhUTw7","Vprf2RACuj","yluBxv1Hln","OUqFM0Kyfs","2Yz7E5iGN5","hi5X7P6bcg","y94nwgtCA5","B3qemFLsph","AkKTkuLtKs",
+"uJScXRACuj","ECMvUDcpWB","oGu6xMGlTF","Z4I1vtvdkD","0YAGHgjUTu","a00b5Yw2oU","CqqaDOHaBz","14FLRWaim6","pv0i7jiVBP","tl72WVBjhz",
+"5IhmGDLhzM","sx5Gl7ku1p","l83UdyvOMI","MmsIoprNT6","prNT6Cfgr3","29QAzjiVBP","OHaBzfmIK1","jtn0X3otm6","wDajXmX2GE","HfyNQrhl0J",
+"W3VFHFcWrW","L7cGcGrDg7","jSjS3Chuy3","MmKGJhe9IA","AOgEetl72W","v2eC3uZPqg","xXTI4ECMvU","9rlg9Uvlv4","ZuDtDVIlwP","pvgjS7Ow5C",
+"8xEKz64s8N","LewvMcmXIX","NhXdujeskS","pWiOsVprf2","MojnPVBjhz","6q6L9vOqCE","lXFOBQ6Lix","AXpwEjfREu","lm0pD580YD","uLtKsRzaZA",
+"Kr8ysMmsIo","VBjhz5Namm","k85AeuPX7G","JkzUnCqqaD","7lUXZUvlv4","xXTI4tvdkD","AXpwE0PktI","fLNg8Yf2Ec","d85a9djsrv","W7cTszz4ZU",
+"b29RJEoToP","9iGoT2hEEU","2ZHdkh1zcH","vkCHH7fsYM","jfREuprNT6","Uvlv416lHc","ZJTXH1j5L8","QbxXcoVQp6","m4bxUVjCZq","MaJQsFGzgp",
+"B3qemzFgtB","RBhp0VIlwP","EOE1oiKqhr","JJs5mfaHir","POUYS7ku1p","rKDLJFLsph","NAFuw5Mg9r","AXpwEJ2mQi","OUqFMDz1R3","iB08lVjCZq",
+"lpF6W0PktI","zz4ZUReKEW","gtCA57hyVv","HP433HlUbF","0Wr5y1LB1L","55rfBGrDg7","CK5W7jiVBP","FhtglAXpwE","zqH0WCIShG","bZLvSVBjhz",
+"AIYUuU3yw5","2DREsStlDJ","F6PT2ciuWz","AgJHQcQOnv","jSjS3ksJby","yluBxTCgPp","yofH3ni2v1","wiHrZ5Namm","9y4lwM6qcG","DcpWBIKxdL",
+"wDajX1LB1L","zbIYYVLTy6","1j5L87fKYU","JJs5mkZANm","xReecNOHsz","OHaBzjeskS","MK07YyluBx","i3pydhSSvQ","StlDJQnJ1S","WDVWJAgJHQ",
+"he9IAaL6AJ","NAFuwVjCZq","jiVBPhe9IA","Mm8siUvlv4","IjTwP9iGoT","CqqaDQssNC","RsQUqDG4sT","EOE1oyvOMI","nnP8oTCgPp","s4786tlILt",
+"taOXKLbRTH","ZJTXH1v5hH","NhXdubrhlQ","atef2cQOnv","ksJbyiB08l","ulk41d7vjM","9rlg948cHL","i3pydEOE1o","BCxeCNo0Qb","M6qcGx3LDe",
+"S2DfuFwEJz","rKDLJvkCHH","fLNg83otm6","zbIYYyToGW","S2DfuTCgPp","6AFT0x3LDe","bZLvSiKqhr","4QMc9o8Uyd","nFqiks93Ml","rKDLJXflUq",
+"xciqpC2Irc","yluBxyvOMI","zHF1qFPfSE","l83UdQssNC","jiVBPMm8si","iwzGkmz8gx","uTacx2Yz7E","2ZHdkaez9y","kZANmQWxoT","Q6hMCPYBf4",
+"1LB1LI7p2a","AkKTkbZLvS","ZJTXHPOUYS","MGlTF2hEEU","BFkb82Yz7E","qQxHPdjsrv","U3yw5CK5W7","yEfy99GXkX","7Ow5CwDajX","Ss0ZuKsjRK",
+"I7p2aS2Dfu","WmadANOHsz","MK07Yiqv4k","9rlg9lpF6W","KASQ8GXdoH","4QMc9jfREu","Q6LixTXQ0Z","GXdoHiB08l","Q6hMC8FmFH","DcpWBdjsrv",
+"RACujW3VFH","AmdQdO3iyQ","UlU3MFxX9q","jS1ajs93Ml","B3qemJRJQB","MaJQsydG8U","uoStwJRJQB","uvf7AjzUqR","aDGtSBGaQY","CNHmvfLNg8",
+"Z4I1vZhwG1","iB08lqaofN","VIlwP5Namm","MezSWtAOsr","SjskQZuDtD","J2mQijiVBP","FGzgprhl0J","2NslmfLNg8","2TRI7D6rBy","AkKTkFPfSE",
+"sx5Gl9eoRc","9XyT9WPmlx","ulk41RBhp0","yToGWfmIK1","brhlQ9eoRc","dQ586b29RJ","iKqhruN6r3","6AFT0o8Uyd","WPmlx9y4lw","b29RJzFgtB",
+"WDVWJaez9y","lXFOBLbRTH","L7cGceuZA5","I7p2aK4GS8","uZPqgHfyNQ","Chuy3s93Ml","9XyT9JXljW","dQ5860Wr5y","ni2v1VLTy6","14FLRbZLvS",
+"HfyNQtlILt","CNHmvEoToP","P6bcgIKxdL","Yw2oUQssNC","dmoS7L7cGc","FVMxoAmdQd","pAhR1yEfy9","gjUTuVerEA","RmDcraez9y","dQ586Kr8ys",
+"zz4ZURBhp0","n1pmOuoStw","ZhwG1lXFOB","sx5GlGv3Fq","WreyPQWxoT","DcpWBblLA9","KZamHbgJAz","tjQxsFPfSE","9y4lwDz1R3","ciuWziB08l",
+"xciqpFNYIM","h1zcH4W0Tl","zQt6QEOE1o","FxX9qtuDyS","d85a98TxD7","he9IAgjUTu","DcpWBprNT6","U3yw5WMiS3","Mkgy8oVQp6","OHaBzlH1kt",
+"zHF1qTCgPp","kB5nPoQ87r","m4bxUFcWrW","fLNg8azIWp","4QMc9Gv3Fq","uN6r3FPfSE","FnPFBjiVBP","lH1ktrhl0J","b29RJ64s8N","n1pmOzQt6Q",
+"dQ586G1RhS","cmXIX8U2nU","uvf7AjS1aj","k85AehE1Ql","HzZT8aFFss","b29RJD6rBy","FPfSE1LB1L","UmaEv9XyT9","QnJ1SWMiS3","64s8NTCgPp",
+"MojnPFPfSE","4dEz66q6L9","cShY2d7vjM","yvOMIMezSW","guMb8ReKEW","x3LDeuJScX","pT8wuzHF1q","2DREsb29RJ","oQ87rFPfSE","suY4xh1zcH",
+"3otm6In3NS","24ARFRACuj","Q6hMCMK07Y","BCxeCsx5Gl","8TxD7yluBx","MK07Yl83Ud","2hEEUOz8yZ","ZJTXHMaJQs","Nxx9VVLTy6","Mm8siJIqXi",
+"JXljW0h1b1","Mm8siWmadA","sqVrfpFrrl","nnP8ozY1GY","RpBQmcShY2","xciqp7ku1p","Mm8siYOfrY","FFDuibZLvS","uJScXv2eC3","0YAGHAXpwE",
+"gf8rIlweGy","Cp3mZi7WMQ","cL0aEUvlv4","580YDOUqFM","oVQp68hJdt","ix74rWaWsv","2DREsxXTI4","BGaQYlkMUA","HlUbFRkQke","he9IAjzUqR",
+"NhXduVBjhz","uPX7GpAhR1","Ss0ZuYOfrY","FxX9qzbIYY","Kr8ysydG8U","5nmWvZzJHW","MojnPd7vjM","HzZT8MK07Y","euZA5he9IA","FcWrWVNCPd",
+"RxrsmiKqhr","uTacxwDajX","W3VFHIRh48","lweGyYw2oU","v2eC3GSQwj","uvf7AxXTI4","pv0i7piJSk","hi5X7StlDJ","fcwDaQ6Lix","7fsYMTwano",
+"DcpWBO3iyQ","Gv3FqIKxdL","e6e4zNxx9V","zqH0W7lUXZ","OUqFMNhXdu","FnPFBQWxoT","nnP8oIjTwP","GSQwjK20wK","QbxXcKZamH","jS1ajWmadA",
+"48cHLMmKGJ","1LB1Lrhl0J","brhlQn1pmO","J2mQiuTacx","5VZjS7Ow5C","L7cGcFhtgl","suY4xYOfrY","bgJAzbgJAz","HlUbFpmeCd","2NslmlCMxy",
+"Ss0ZuyvOMI","qQxHPPOUYS","ThjNnqQxHP","Kr8ysEoToP","bgJAzDz1R3","pAhR1qQxHP","Fhtgl9XyT9","7fsYM7Ow5C","BCxeC29QAz","oQ87rCfgr3",
+"No0QbQChxs","lXFOBFxX9q","GrDg7BFkb8","qQxHPv8yFN","8cVD3dQ586","zqH0W0Kyfs","W3VFHMmKGJ","XyPZNdjsrv","qaofNQClRL","SjskQoVQp6",
+"lXFOBogLgc","lCMxyogLgc","cQOnvOz8yZ","fmIK1QChxs","VNCPdzbIYY","VLTy6WMiS3","soy9tjzUqR","zqH0WnFqik","FVMxoRBhp0","JRJQBJJs5m",
+"F6PT2s7Mxk","uJScXCdyBV","P6bcg2hEEU","nnP8os7Mxk","Oz8yZa00b5","LDk6fyToGW","7Ow5CCqqaD","IKxdLlH1kt","Chuy35iGN5","rhl0Jgf8rI",
+"ZUnqtReKEW","euZA51j5L8","aL6AJvOqCE","t98iWMmsIo","HzZT8okgRi","8RCUAHfyNQ","CIShGatef2","2NslmReKEW","0MR5XaDGtS","uupzkUl4a1",
+"ThjNnVIlwP","VBjhzwiHrZ","OUYuFiKqhr","QbxXcjSjS3","CqqaDyToGW","EOE1oRpBQm","s4786Cp3mZ","1v5hHv2eC3","zqH0WprNT6","5Drn0Qworu",
+"azIWpuLtKs","FwEJzMmsIo","Chuy3yvOMI","lm0pD6q6L9","PYBf4fqypy","EoToPfaHir","45cIHRkQke","Vprf24dEz6","OxWIH4QMc9","UmaEvK20wK",
+"i7WMQm4bxU","faHiry94nw","i3pydBCxeC","yToGWQWxoT","NAFuwCdyBV","ZUnqtW3VFH","Yh1hFGrDg7","No0QbfmIK1","8FmFHulk41","FVMxoCxVEf",
+"t98iWx3LDe","L7cGcCdyBV","t59lRjS1aj","jzUqRFNYIM","o8UydBFkb8","9eoRcGSQwj","sx5Gl8hJdt","Cp3mZYOfrY","AmdQdKr8ys","G1RhSix74r",
+"aDGtShSSvQ","S2DfuyofH3","Q6hMCsx5Gl","4W0Tlxciqp","0Wr5y7hyVv","FjHXRMmKGJ","O3iyQHfyNQ","Pb1payofH3","Q6hMC45cIH","Yh1hFpWiOs",
+"n8pJ9tAOsr","FnPFBm4bxU","lpF6WIn3NS","yluBxZzJHW","nFqikCp3mZ","0PktINAFuw","zqH0WNhXdu","AOgEeMezSW","Waim62hEEU","In3NS9rlg9",
+"Fhtglhe9IA","y94nwsqVrf","fcwDaM6qcG","qUJMdzFgtB","7hyVvF6PT2","C2IrcblLA9","Zv7z0hYBCK","MojnPFFDui","5Mg9rOUYuF","aez9ypiJSk",
+"ZUnqtdmoS7","i3pyduQIcz","uQIcz9XyT9","gf8rIix74r","hUTw7HP433","qaofNtaOXK","rKDLJpvgjS","fFDrJ1v5hH","yEfy9oQ87r","5drc6ogLgc",
+"JIqXi8cVD3","fqypy0MR5X","S2DfuFFDui","ciuWzpvgjS","1v5hHBGaQY","S77LHxXTI4","uAWypFPfSE","9y4lwXyPZN","euZA5uoStw","gtCA5O3iyQ",
+"gdQsS5Mg9r","rhl0Jv1Hln","v8yFNXflUq","aL6AJjfREu","3weIFPYBf4","Zv7z0Y1mC0","QWxoTydG8U","WPmlxpAhR1","0YAGHIKxdL","pT8wu0PktI",
+"ix74rVjCZq","n8pJ9zQt6Q","CNHmvaFFss","Ul4a1jzUqR","Y1mC029QAz","HfyNQJ2mQi","uQIczguMb8","JXljWlm0pD","tvdkDcShY2","JkzUnfaHir",
+"9rlg9wiHrZ","taOXKWreyP","7fKYUEOE1o","Vprf2FFDui","djsrvlkMUA","Yw2oU2Yz7E","BFkb829QAz","BGaQYZJTXH","RmDcrSs0Zu","2Nslmulk41",
+"5VZjSJIqXi","KZamHv8yFN","IjTwPG1RhS","x3LDeVIlwP","S2Dfu0h1b1","IRh48aez9y","RACujd7vjM","qQxHPmX2GE","B3qemuoStw","GSQwjTwano",
+"580YDpiJSk","cL0aEn8pJ9","D6rByPYBf4","7fsYMY1mC0","uLtKsazIWp","k85AeQWxoT","GXdoHhi5X7","TCgPppiJSk","Uvlv4FGzgp","FPfSEFwEJz",
+"16lHcS2Dfu","guMb816lHc","GXdoHOUqFM","jtn0X14FLR","VerEACp3mZ","TCgPps7Mxk","EdBKch1zcH","s4786WmadA","BCxeCn8pJ9","SmGzv8FmFH",
+"9rlg9MK07Y","zFgtB6q6L9","iKqhrsoy9t","soy9t4QMc9","e6e4zWDVWJ","D6rByGXdoH","9eoRcFxX9q","lXFOB0BmCy","Ss0ZuBbwgA","XflUqydG8U",
+"hE1QljeskS","2DREsWaWsv","VIlwPRBhp0","v1HlnlpF6W","tjQxsUlU3M","taOXKo8Uyd","Z4I1vQworu","hSSvQAmdQd","FGzgpjSjS3","iB08lBpYhV",
+"7X3uyFhtgl","rz7UtGrDg7","Q6hMCVjCZq","AkKTkO3iyQ","U3yw5ZuDtD","aL6AJzbIYY","rz7UtXflUq","ReKEW9y4lw","zQt6QMezSW","2DREsFnPFB",
+"DcpWBdQ586","ix74rAgJHQ","Q6Lix5IhmG","d85a9Yw2oU","k85Ae8FmFH","BGaQYbrhlQ","Y1mC0jS1aj","uvf7A618Di","zqH0WblLA9","oQ87rHzZT8",
+"MmKGJzmLYD","azIWps93Ml","MGlTFsuY4x","KZamHiKqhr","VjCZqIRh48","Yw2oUO3iyQ","5Mg9rVLTy6","DQimp0YAGH","FNYIMM3zXL","5drc6QbxXc",
+"AgJHQfFDrJ","fLNg8DG4sT","SmGzvuTacx","vOqCE4QMc9","StlDJyluBx","YjB9tjzUqR","S77LHzbIYY","7ku1pfqypy","pFrrlciuWz","IBe8kDLhzM",
+"Zv7z0Ss0Zu","J2mQiOxWIH","suY4xFcWrW","FVMxoZv7z0","SmGzvNxx9V","jSjS3VjCZq","yvOMICp3mZ","suY4xFhtgl","v1HlnFNYIM","48cHLFwEJz",
+"GSQwjgdQsS","lkMUAZUnqt","ydG8UlkMUA","zQt6QVIlwP","VLTy6SmGzv","aDGtSCdyBV","pWiOsDLhzM","9rlg9CqqaD","fLNg8C2Irc","fcJOyaL6AJ",
+"Waim6HP433","prNT6Uvlv4","jSjS3n1pmO","fFDrJJJs5m","Waim6t59lR","jSjS3dpe1v","FPfSEzz4ZU","0ao3lmX2GE","OUqFMGWqqX","dpe1vzHF1q",
+"GSQwj6AFT0","gIYvEd85a9","ZUnqtNxx9V","No0QbWMiS3","AXpwEhSSvQ","kB5nP7lUXZ","lCMxyF6PT2","DG4sTjiVBP","KsjRKbgJAz","AXpwEjSjS3",
+"9y4lwprNT6","BFkb8gIYvE","RpBQmksJby","qQxHPWmadA","8U2nUyluBx","zHF1qEOE1o","CIShGuN6r3","O3iyQS77LH","FnPFBpT8wu","kB5nP0MR5X",
+"6AFT0uTacx","Z4I1vciuWz","JKWYRKZamH","8cVD3ECMvU","OUYuFksJby","i7WMQNhXdu","D6rByatef2","ksJby5Mg9r","Uvlv4Z4I1v","lXFOBl83Ud",
+"JXljWcQOnv","9y4lwBpYhV","zz4ZU0Kyfs","n1pmODz1R3","JIqXi45cIH","6q6L9uAWyp","zHF1qVIlwP","Mkgy8hSSvQ","8xEKzTXQ0Z","64s8NnlaBy",
+"aez9yjfREu","cQOnvJIqXi","2Nslmfqypy","mX2GEGv3Fq","Oz8yZUlU3M","M3zXLUmaEv","QbxXc0PktI","uAWypFFDui","AOgEePb1pa","1v5hHNhXdu",
+"RzaZAi7WMQ","2ZHdkI7p2a","55rfBs7Mxk","1j5L8yEfy9","XyPZNYOfrY","WaWsvlj07Q","wiHrZDcpWB","ydG8U4QMc9","JKWYRWmadA","Kr8ysC2Irc",
+"DLhzMyToGW","1j5L8QbxXc","ciuWzs93Ml","yEfy9fmIK1","wiHrZrz7Ut","PYBf4HfyNQ","rz7Uti3pyd","0BmCyzbIYY","StlDJwiHrZ","5IhmGfqypy",
+"VIlwPYw2oU","s93MlokgRi","cmXIXCfgr3","n8pJ9ZuDtD","iwzGkaez9y","pAhR1bZLvS","uTacxjzUqR","aFFssrKDLJ","zz4ZUi3pyd","uZPqgYOfrY",
+"Yw2oU0YAGH","TwanoWPmlx","OHaBzYf2Ec","9iGoTuoStw","JRJQBn8pJ9","KZamHMm8si","rKDLJuZPqg","t59lRuPX7G","8FmFHO3iyQ","ix74rWPmlx",
+"SmGzvFwEJz","pWiOspiJSk","pT8wuoGu6x","Cp3mZM3zXL","aDGtSRBhp0","dmoS7HRxd8","gf8rIRkQke","AOgEe8U2nU","Mkgy8Chuy3","vLsmS5Mg9r",
+"d85a9D6rBy","zmLYDtl72W","aL6AJsuY4x","0ao3lksJby","45cIHJkzUn","BFkb80h1b1","lkMUAoQ87r","b29RJF6PT2","guMb8pmeCd","qUJMdWDVWJ",
+"ogLgc1LB1L","Q6Lixt59lR","fcJOy9rlg9","Ta8f6AgJHQ","Waim664s8N","yToGWdmoS7","jzUqRuQIcz","MK07YsqVrf","jfREujfREu","7fsYMy94nw",
+"FFDuiAmdQd","Ta8f6FVMxo","FjHXRtlILt","FjHXRKZamH","W3VFHU3yw5","he9IAOUqFM","AmdQdydG8U","zz4ZUQWxoT","BpYhVuLtKs","zqH0WHfyNQ",
+"Waim6SjskQ","jeskSIn3NS","NcICAuoStw","a00b56q6L9","jiVBPv2eC3","NhXduRBhp0","jzUqRv8yFN","0KyfsIjTwP","GSQwj8RCUA","Oz8yZEdBKc",
+"guMb8gf8rI","DLhzMcShY2","No0Qbtl72W","uvf7ACqqaD","6q6L9Waim6","atef2pmeCd","CdyBV5Namm","CdyBVsx5Gl","uN6r3WPmlx","7hyVvcmXIX",
+"uZPqgsqVrf","FNYIMAOgEe","FNYIM2Nslm","0YAGHzHF1q","FjHXR6AFT0","Cfgr37ku1p","MmKGJuupzk","vOqCEWreyP","cL0aE0PktI","5Drn0BbwgA",
+"8RCUAguMb8","WMiS3UlU3M","v1HlnMm8si","ulk410Wr5y","mz8gxy94nw","55rfBgf8rI","U3yw545cIH","8FmFH1j5L8","NcICA07n1c","4dEz65nmWv",
+"7fKYULewvM","Yh1hF9eoRc","AkKTk9iGoT","FcWrWK20wK","Mkgy8sqVrf","nnP8o8hJdt","S77LHFjHXR","lCMxyFxX9q","kZANmJKWYR","jzUqRNAFuw",
+"IBe8k7fsYM","RpBQmnFqik","dmoS716lHc","aDGtSJRJQB","TwanoK4GS8","0YAGHsoy9t","Kr8ysnnP8o","Dz1R38FmFH","5nmWvv2eC3","ReKEWuN6r3",
+"bZLvSDG4sT","jeskS4W0Tl","SWfouAIYUu","NcICAcmXIX","aDGtSfaHir","JKWYRYh1hF","AmdQdRBhp0","NAFuwkB5nP","O3iyQ0ao3l","IRh48gf8rI",
+"In3NSpvgjS","NcICAGWqqX","nFqikZzJHW","lViBvQWxoT","QYxC0pmeCd","LewvMIn3NS","taOXKDQimp","Ta8f68cVD3","OxWIHk85Ae","9rlg9OxWIH",
+"lj07Qs93Ml","9y4lw618Di","jzUqR6AFT0","RBhp0tuDyS","jSjS3Ss0Zu","zFgtByluBx","Kr8ysCxVEf","gIYvEoGu6x","Yw2oUtaOXK","uLtKsxReec",
+"HzZT8t59lR","xXTI40YAGH","iwzGkbgJAz","7hyVvpAhR1","uJScX7Ow5C","0h1b1M6qcG","YOfrYnlaBy","RmDcr0Wr5y","uAWypS2Dfu","iqv4k0Kyfs",
+"gjUTuyToGW","DLhzM2DREs","lkMUA6AFT0","vkCHH5IhmG","Zv7z0ulk41","8FmFH7hyVv","gtCA5D6rBy","0Kyfspv0i7","PYBf4e6e4z","FjHXRVprf2",
+"1v5hHMmKGJ","d85a9pmeCd","rhl0J2Nslm","AkKTkxXTI4","TXQ0ZW3VFH","pmeCdFhtgl","QYxC0FFDui","VjCZqOUqFM","24ARFqQxHP","BCxeCVLTy6",
+"sqVrf2ZHdk","K4GS8jfREu","soy9tNOHsz","IjTwPlH1kt","9XyT9piJSk","yluBxFNYIM","Cp3mZBFkb8","blLA9aDGtS","5IhmG3weIF","Kr8yso8Uyd",
+"JkzUnx3LDe","Kr8ysfcJOy","fcwDa0MR5X","0YAGH618Di","BpYhV48cHL","NcICAfLNg8","7hyVv5Namm","y94nw9rlg9","2hEEUrKDLJ","o8Uydatef2",
+"Mkgy8qQxHP","8xEKzCK5W7","xXTI4QYxC0","v1Hln618Di","VNCPdydG8U","Uvlv40Kyfs","i7WMQYw2oU","0BmCyFxX9q","4W0TlHRxd8","AkKTkGSQwj",
+"zY1GY16lHc","x3LDeb29RJ","2ZHdk2Nslm","zY1GYDz1R3","EOE1ojfREu","qaofN9y4lw","ogLgcFGzgp","SjskQZhwG1","Nxx9V5Drn0","d7vjMru4UG",
+"o8Uydt98iW","tjQxsGSQwj","7Ow5CogLgc","jzUqRRsQUq","IKxdLYw2oU","AIYUuoQ87r","BpYhVVNCPd","gdQsS8TxD7","UlU3MY1mC0","45cIHi3pyd",
+"fcwDayEfy9","rKDLJ0PktI","D6rByOUYuF","FnPFBlCMxy","ix74r14FLR","brhlQVerEA","Ta8f6XyPZN","zQt6QBpYhV","dQ586FxX9q","DcpWBP6bcg",
+"TwanoBbwgA","QYxC0b29RJ","Qworut98iW","8TxD70PktI","zY1GY8U2nU","2Yz7EWaWsv","lXFOByofH3","tAOsrJ2mQi","JXljW5ZaEz","BbwgANOHsz",
+"jeskSb29RJ","9XyT9In3NS","0BmCyru4UG","okgRiI7p2a","YOfrYAgJHQ","ulk41TXQ0Z","5nmWvNAFuw","G1RhSFNYIM","MojnPhSSvQ","1j5L8cQOnv",
+"cQOnv24ARF","TXQ0ZKsjRK","24ARFFNYIM","atef2ECMvU","WMiS3pmeCd","JkzUnSWfou","yEfy9dQ586","3weIFlCMxy","BCxeCDLhzM","mX2GEzY1GY",
+"6AFT0GWqqX","vOqCEOxWIH","9rlg9OUqFM","8U2nUcQOnv","1j5L8X6Pin","SWfouQWxoT","Cp3mZW7cTs","zqH0WNOHsz","Rxrsm8cVD3","45cIHDLhzM",
+"AXpwEQbxXc","iwzGkzmLYD","atef29XyT9","CdyBVlsQGo","IBe8kNo0Qb","vLsmSQChxs","ZUnqtCIShG","uZPqgd7vjM","ru4UGoVQp6","t98iWZzJHW",
+"lCMxy6AFT0","MaJQs5iGN5","tl72WI7p2a","qaofNlkMUA","W7cTs2TRI7","pvgjSokgRi","MGlTFhe9IA","POUYSNhXdu","UlU3MTCgPp","KZamHsoy9t",
+"8cVD3S2Dfu","xReecpv0i7","v8yFNLbRTH","HlUbFHlUbF","7X3uyJXljW","3otm6oVQp6","xReecd85a9","W3VFHVNCPd","Oz8yZ5nmWv","a00b5lj07Q",
+"Vprf2B3qem","BFkb8FcWrW","qQxHP0ao3l","ogLgcOz8yZ","BGaQYJkzUn","IBe8kwDajX","HRxd8K20wK","YOfrYlsQGo","kB5nPa00b5","Q6hMC8U2nU",
+"TCgPpazIWp","rz7Ut5nmWv","Uvlv4CdyBV","2DREsuJScX","2Yz7ECK5W7","OxWIHEdBKc","vkCHHdmoS7","Kr8ysFLsph","EOE1oAkKTk","Pb1paMojnP",
+"tvdkDRACuj","Oz8yZsuY4x","pAhR1bgJAz","kZANm9GXkX","pvgjSVprf2","yofH3C2Irc","ksJbyZzJHW","QClRLpiJSk","cmXIX580YD","uoStwIBe8k",
+"Rxrsmxciqp","SmGzvDQimp","qaofNv1Hln","9eoRchi5X7","JJs5maDGtS","Y1mC0FnPFB","tAOsrlsQGo","580YD0PktI","hYBCK8xEKz","1j5L8M6qcG",
+"9iGoTQworu","KASQ8bgJAz","Q6hMCNxx9V","9rlg9mX2GE","Gv3Fq0h1b1","9iGoToQ87r","HzZT8LDk6f","EoToPVjCZq","QWxoT07n1c","Z4I1v5Mg9r",
+"a00b58xEKz","Vprf2hYBCK","FGzgpTXQ0Z","aL6AJ8TxD7","Waim6FnPFB","YOfrY8U2nU","DG4sT8U2nU","VLTy6Z4I1v","3otm65IhmG","qQxHPUvlv4",
+"Yh1hFprNT6","wDajXYjB9t","pT8wumX2GE","24ARFcL0aE","ThjNn1v5hH","16lHcNhXdu","y94nwZhwG1","8hJdtS77LH","tvdkDI7p2a","oVQp6xReec",
+"5Mg9rLDk6f","8cVD3iqv4k","2ZHdkSmGzv","FNYIMvkCHH","zQt6Q5iGN5","GXdoHnnP8o","guMb8vkCHH","suY4xmX2GE","NhXduQClRL","MmsIouoStw",
+"16lHcOUqFM","JXljWG1RhS","AkKTkQnJ1S","pvgjSbrhlQ","P6bcgfFDrJ","Cfgr3Vprf2","Ta8f6UmaEv","zqH0WEOE1o","JJs5mYf2Ec","n1pmOSbRYy",
+"2hEEUWPmlx","pWiOsRzaZA","U3yw5jeskS","JJs5mZhwG1","rKDLJ9eoRc","POUYSlj07Q","FxX9q0h1b1","CIShGY1mC0","tvdkD29QAz","FjHXRMmsIo",
+"8TxD7ni2v1","14FLRW7cTs","d7vjMUl4a1","mz8gxksJby","45cIHgf8rI","MaJQszHF1q","S2Dfu5ZaEz","uQIczBGaQY","sx5Gl9rlg9","5Mg9rUvlv4",
+"9y4lwNxx9V","qQxHPLDk6f","WMiS3F6PT2","Q6hMCuvf7A","FLsphYOfrY","tjQxscShY2","KsjRKZ4I1v","lpF6WsqVrf","pFrrlFLsph","0h1b1AOgEe",
+"hSSvQUvlv4","WreyP55rfB","azIWpyvOMI","iB08lvLsmS","VBjhzJRJQB","hE1QlaDGtS","fqypyK4GS8","gtCA5J2mQi","QWxoTpiJSk","dhSuHulk41",
+"BCxeCaDGtS","OUYuFOHaBz","QnJ1S8RCUA","O3iyQpiJSk","OUYuFX6Pin","VerEAYh1hF","O3iyQlCMxy","iB08lZUnqt","NcICAK4GS8","GXdoHru4UG",
+"WaWsvzbIYY","Zv7z0FGzgp","TXQ0ZOxWIH","kB5nPCp3mZ","pAhR1J2mQi","sx5Gl14FLR","gjUTuKsjRK","WDVWJNOHsz","RACujHfyNQ","Mkgy8dQ586",
+"QYxC0tuDyS","dhSuHDLhzM","GWqqXcmXIX","NcICA7fKYU","7Ow5C6AFT0","KASQ8LbRTH","RxrsmThjNn","9rlg964s8N","S2Dfu7lUXZ","8FmFHoVQp6",
+"jSjS3QnJ1S","lCMxyMkgy8","L7cGcOUYuF","WPmlx7X3uy","WreyPbZLvS","5iGN5GWqqX","JkzUnGrDg7","FFDuiGv3Fq","nnP8oxXTI4","yvOMIMmsIo",
+"prNT6MGlTF","sx5GlZUnqt","M6qcGQChxs","JJs5ma00b5","ZuDtD0Kyfs","rz7Ut2Yz7E","GSQwjLewvM","lsQGotuDyS","kZANm4dEz6","7hyVvbrhlQ",
+"tuDyS6q6L9","CxVEfhe9IA","8RCUAOHaBz","YOfrY29QAz","MezSWMGlTF","tl72WS77LH","RACujQ6hMC","MmKGJ1v5hH","jtn0X7hyVv","D6rBytaOXK",
+"48cHL8cVD3","Cfgr3X6Pin","Oz8yZF6PT2","ni2v1K20wK","Y1mC0JKWYR","Mkgy8l83Ud","cL0aETwano","MmKGJvLsmS","nFqiklm0pD","oVQp6Yw2oU",
+"hi5X7RkQke","DG4sTaDGtS","AgJHQXyPZN","zmLYDxReec","d85a9atef2","fFDrJ0BmCy","l83Udiqv4k","2DREsi7WMQ","n8pJ9NcICA","RmDcrFVMxo",
+"In3NScQOnv","AgJHQuoStw","AXpwEG1RhS","brhlQTXQ0Z","tuDySKr8ys","WDVWJpWiOs","uupzkgtCA5","yEfy9hi5X7","qaofNChuy3","QnJ1SpWiOs",
+"6q6L9mz8gx","piJSkUvlv4","SbRYySs0Zu","zz4ZUuTacx","IKxdL8FmFH","K20wK7fsYM","W3VFHhSSvQ","B3qemksJby","BpYhVh1zcH","x3LDel83Ud",
+"CdyBVZJTXH","9iGoT5nmWv","nFqikAXpwE","FGzgpa00b5","I7p2apv0i7","2NslmzqH0W","MmKGJRsQUq","AIYUurz7Ut","s93MlazIWp","Y1mC0C2Irc",
+"ZJTXHpvgjS","AXpwEuPX7G","RxrsmWmadA","7lUXZnnP8o","0KyfsuPX7G","6AFT0FcWrW","7X3uyFcWrW","7fKYUNcICA","qUJMdDLhzM","FNYIMni2v1",
+"dmoS7M6qcG","7fsYMQssNC","zqH0WMkgy8","C2IrcPYBf4","7Ow5CBGaQY","Qworu0h1b1","KASQ8tAOsr","fcwDaSmGzv","AIYUut59lR","AkKTk5VZjS",
+"pvgjSmX2GE","cmXIXL7cGc","LbRTHCIShG","KsjRKjtn0X","taOXKK4GS8","NAFuwhSSvQ","lXFOBhe9IA","OHaBzXflUq","Vprf2rKDLJ","I7p2aMmsIo",
+"Gv3Fqtl72W","Kr8ysHfyNQ","FhtgllkMUA","okgRin8pJ9","JRJQBIn3NS","LbRTHbrhlQ","dQ586lCMxy","SjskQh1zcH","I7p2aJRJQB","AIYUuOHaBz",
+"RkQkedQ586","tl72WCIShG","lViBvNo0Qb","lpF6WThjNn","uAWypaDGtS","uN6r3ogLgc","EdBKczFgtB","KASQ8qQxHP","QClRLjSjS3","Dz1R3O3iyQ",
+"IRh48Yf2Ec","nnP8ohe9IA","9iGoTuZPqg","vOqCEFxX9q","7X3uyZv7z0","QWxoT9y4lw","OUqFMEOE1o","dmoS7uJScX","tAOsrAOgEe","lkMUAKZamH",
+"uJScXy94nw","VjCZqCp3mZ","lH1ktYh1hF","Gv3FqX6Pin","S2DfuMGlTF","lXFOBjeskS","7fsYMpmeCd","S77LH4dEz6","TXQ0Z9eoRc","hE1QlrKDLJ",
+"RkQkehUTw7","MojnPTwano","uupzkCNHmv","dpe1vZv7z0","lCMxyiB08l","uPX7GzmLYD","nFqikxciqp","QssNC5drc6","iB08lcQOnv","uQIcz1j5L8",
+"pv0i7i7WMQ","FVMxoGrDg7","FNYIM0Kyfs","taOXKjfREu","P6bcg0h1b1","n8pJ9Kr8ys","SmGzv16lHc","M3zXLvOqCE","5iGN548cHL","QYxC0tlILt",
+"lweGyFNYIM","RBhp0JRJQB","dQ586suY4x","gtCA548cHL","BCxeCPOUYS","aDGtSPYBf4","uvf7Ao8Uyd","cL0aEyvOMI","48cHLRACuj","dhSuHThjNn",
+"vOqCEaFFss","M3zXLK4GS8","AOgEezQt6Q","8TxD7Zv7z0","8xEKzlH1kt","d7vjMhe9IA","prNT6AmdQd","IKxdLxXTI4","7fsYMRxrsm","mX2GECfgr3",
+"HzZT8GSQwj","5drc6wiHrZ","blLA9aL6AJ","HlUbFL7cGc","gf8rIOHaBz","Waim6yEfy9","MmsIoIBe8k","14FLRnFqik","XyPZNO3iyQ","v8yFNDG4sT",
+"uvf7Ah1zcH","b29RJ29QAz","I7p2aQ6Lix","5IhmG5Namm","a00b5yToGW","he9IAfaHir","WaWsvm4bxU","uQIczQssNC","FFDuiBpYhV","Q6hMCiwzGk",
+"uN6r34QMc9","gjUTuWaim6","xciqprz7Ut","fmIK1lsQGo","azIWpd85a9","4W0TltjQxs","aDGtS8hJdt","16lHcVerEA","dhSuHZJTXH","uQIcz45cIH",
+"n1pmONOHsz","djsrvi3pyd","UmaEvfLNg8","GXdoHB3qem","vkCHHprNT6","xXTI4zFgtB","MGlTFnlaBy","8cVD3FwEJz","0BmCyYh1hF","NAFuwrz7Ut",
+"piJSkyofH3","AkKTkJKWYR","pFrrljfREu","8FmFHOz8yZ","Ul4a1Cfgr3","2NslmKASQ8","JkzUn9GXkX","5IhmGyluBx","QWxoTCfgr3","OHaBzC2Irc",
+"LewvMFxX9q","OxWIHBGaQY","a00b5oQ87r","gtCA5Mkgy8","iKqhrFnPFB","QWxoTQYxC0","FVMxo4dEz6","RBhp0pAhR1","e6e4zZv7z0","kB5nPulk41",
+"JIqXiJkzUn","NOHszJIqXi","FwEJzlH1kt","ZhwG1s4786","3otm6wDajX","DcpWBAkKTk","VerEAYw2oU","tvdkDStlDJ","TCgPpKsjRK","qQxHPfcwDa",
+"AIYUujeskS","tl72W29QAz","jiVBPprNT6","Ss0ZuOHaBz","7fsYMVBjhz","Uvlv4m4bxU","0PktIaez9y","FFDuid85a9","LDk6fAmdQd","cQOnvCdyBV",
+"yofH3fFDrJ","yofH3Yh1hF","XflUqmX2GE","WMiS3LbRTH","WreyPuvf7A","AOgEeQ6hMC","FcWrWd7vjM","9XyT9ReKEW","YjB9tuvf7A","wiHrZS2Dfu",
+"fLNg8blLA9","8TxD755rfB","nlaByprNT6","RzaZApiJSk","45cIHv1Hln","t59lRtlILt","s4786fcwDa","StlDJlkMUA","AOgEeU3yw5","wiHrZazIWp",
+"EOE1o5Mg9r","0YAGHM6qcG","WreyPkZANm","QChxs0ao3l","AXpwEIjTwP","n8pJ9OUYuF","5NammQworu","FxX9qUvlv4","Yf2EcfcwDa","prNT6SbRYy",
+"UmaEvSmGzv","ThjNn24ARF","0ao3lni2v1","iwzGkIjTwP","Ul4a1a00b5","C2IrcFcWrW","9XyT9UmaEv","lXFOBKASQ8","RmDcr45cIH","GXdoHS2Dfu",
+"jS1ajIRh48","EOE1om4bxU","wiHrZTCgPp","s93MlDQimp","8cVD3AmdQd","cQOnvwDajX","jzUqRa00b5","hSSvQIn3NS","Mm8sisx5Gl","FPfSEWmadA",
+"rKDLJ14FLR","lsQGoX6Pin","azIWpt59lR","Cp3mZpiJSk","W7cTs7fKYU","14FLRDcpWB","XflUqX6Pin","2hEEUJXljW","AgJHQPYBf4","5IhmGkB5nP",
+"K20wKlpF6W","8hJdtjiVBP","0ao3lZzJHW","SWfouYf2Ec","FnPFBmX2GE","WDVWJ5drc6","QworuyvOMI","8RCUA5Namm","Yh1hF5Namm","WMiS3WMiS3",
+"QnJ1StvdkD","7Ow5CKr8ys","WPmlxDz1R3","K20wK4QMc9","EOE1oazIWp","45cIH7X3uy","hUTw7xReec","RmDcrS2Dfu","AIYUu0BmCy","lXFOB8U2nU",
+"CqqaDulk41","t98iWhE1Ql","IKxdL7Ow5C","W7cTsCdyBV","HP4334QMc9","7Ow5CSmGzv","EoToP2DREs","Chuy3ulk41","prNT6dQ586","FnPFBZhwG1",
+"tvdkDQssNC","zz4ZUFGzgp","2TRI7QssNC","HP433lCMxy","IRh48pmeCd","Pb1paqaofN","618DibgJAz","FFDuiWreyP","iwzGk7fsYM","EOE1ouAWyp",
+"pT8wudpe1v","uJScXt98iW","Twano0ao3l","0ao3l2DREs","FVMxo9eoRc","KZamHgIYvE","nnP8o9GXkX","POUYSgdQsS","Pb1pazFgtB","QnJ1SZzJHW",
+"i3pydDQimp","IKxdLpAhR1","Q6hMC1v5hH","5nmWvnFqik","LewvMd7vjM","5iGN5VerEA","MaJQsiKqhr","lViBvru4UG","Pb1paokgRi","7ku1pFjHXR",
+"GrDg7CNHmv","uQIczUvlv4","n8pJ9JKWYR","8RCUAlpF6W","0Wr5yJKWYR","7hyVv4W0Tl","Y1mC00Kyfs","QWxoTX6Pin","euZA5ZUnqt","RzaZAsuY4x",
+"gf8rI1j5L8","jeskSPb1pa","nnP8ov2eC3","MmsIopWiOs","9iGoTs4786","tAOsrlCMxy","9rlg9Z4I1v","9rlg9jS1aj","Vprf2WDVWJ","5ZaEzMm8si",
+"X6Pin45cIH","uPX7GVLTy6","ZuDtDuvf7A","djsrvprNT6","nlaByJIqXi","wiHrZHzZT8","lViBvUvlv4","Oz8yZZJTXH","hi5X75IhmG","B3qemKASQ8",
+"4QMc9pmeCd","d85a9oQ87r","dpe1vU3yw5","POUYS5IhmG","x3LDetaOXK","pFrrl5VZjS","WMiS3k85Ae","8RCUAYOfrY","pWiOsZJTXH","VLTy6fFDrJ",
+"VjCZqsqVrf","Kr8ysksJby","okgRiQ6hMC","uZPqgFVMxo","U3yw52DREs","Chuy3uQIcz","zqH0W24ARF","VerEAxXTI4","M3zXLSWfou","7Ow5CChuy3",
+"D6rByKASQ8","QssNCFjHXR","9rlg9Kr8ys","euZA5suY4x","D6rByW3VFH","5drc6Q6hMC","nlaBydmoS7","C2IrcRkQke","lXFOBx3LDe","qUJMdS77LH",
+"S2DfuxXTI4","taOXKReKEW","VBjhz7fsYM","KASQ8Qworu","tAOsrFxX9q","i7WMQzQt6Q","ogLgcGrDg7","C2IrcUvlv4","UlU3M24ARF","MK07Yni2v1",
+"9eoRc0Kyfs","BbwgA4QMc9","FwEJzPYBf4","okgRiD6rBy","uupzkS77LH","fFDrJUl4a1","BGaQYMm8si","0ao3luN6r3","nFqikoVQp6","oGu6x1LB1L",
+"2hEEUBpYhV","0Kyfsn1pmO","Q6hMCiB08l","8xEKzM6qcG","Ss0ZuGWqqX","BGaQYD6rBy","Mm8siqUJMd","GXdoHix74r","cmXIX1v5hH","prNT6CdyBV",
+"5Drn0Yh1hF","NOHszPYBf4","dpe1vuLtKs","WPmlxWreyP","VerEApv0i7","6AFT0Pb1pa","zbIYYJ2mQi","HRxd8FPfSE","C2IrcI7p2a","ZhwG1d85a9",
+"zqH0WuN6r3","Gv3FqDLhzM","HlUbFBpYhV","tAOsr45cIH","48cHLTa8f6","3otm6azIWp","FxX9qQChxs","sqVrfFwEJz","U3yw52TRI7","t98iWhe9IA",
+"CxVEfuLtKs","aL6AJgtCA5","CK5W745cIH","2ZHdkgf8rI","b29RJuZPqg","s7MxkKZamH","rKDLJ5drc6","VBjhzQWxoT","mz8gx9GXkX","brhlQSbRYy",
+"s4786IRh48","DG4sTI7p2a","i3pydxReec","nlaBygdQsS","OUYuFgtCA5","iB08lzFgtB","yofH3lj07Q","uJScXaL6AJ","OUqFM5nmWv","ZUnqtF6PT2",
+"brhlQFGzgp","ReKEWJXljW","suY4xG1RhS","piJSkfcwDa","3weIFv8yFN","MK07YTXQ0Z","8FmFHRACuj","mX2GExXTI4","FcWrWPb1pa","YOfrY5IhmG",
+"24ARFLDk6f","uJScXlCMxy","zFgtBKsjRK","K20wKBFkb8","Z4I1vb29RJ","FwEJzQnJ1S","FcWrWru4UG","3otm6KsjRK","MGlTFZhwG1","9y4lwaez9y",
+"xciqpm4bxU","JIqXiix74r","aFFssRpBQm","djsrvjzUqR","faHirt98iW","oQ87rrKDLJ","RsQUqM6qcG","OUYuFAkKTk","Waim6Mm8si","hi5X7nnP8o",
+"YjB9tD6rBy","Dz1R3ciuWz","FLsph0ao3l","uupzkReKEW","QworulsQGo","9y4lwjS1aj","POUYSUvlv4","oVQp655rfB","QnJ1S5Mg9r","J2mQiHfyNQ",
+"7fKYUa00b5","16lHci7WMQ","7hyVvTCgPp","0Wr5ya00b5","RkQkek85Ae","9iGoTSs0Zu","8TxD7uZPqg","Pb1pa8U2nU","Yh1hFWmadA","P6bcgIBe8k",
+"GWqqXMezSW","TCgPpReKEW","7Ow5Cdjsrv","CxVEfqQxHP","ZJTXHRzaZA","iqv4k7ku1p","OUqFMRkQke","FVMxoMm8si","tvdkDIBe8k","4W0TlRpBQm",
+"GXdoHuTacx","zmLYD4W0Tl","d7vjM8FmFH","RkQke5iGN5","qUJMdQbxXc","iqv4kRACuj","gIYvEY1mC0","FLsphpv0i7","ulk41SbRYy","U3yw5lCMxy",
+"gtCA5KsjRK","uupzkM6qcG","d85a9gf8rI","8U2nUPb1pa","9rlg9lj07Q","he9IAuvf7A","MmsIoQ6Lix","m4bxUo8Uyd","HlUbFoVQp6","QChxsYh1hF",
+"ni2v1F6PT2","guMb8he9IA","QbxXcxciqp","yEfy9GXdoH","MaJQst59lR","YOfrYyluBx","Z4I1vYOfrY","FnPFBzFgtB","MGlTFRmDcr","4dEz6jS1aj",
+"AgJHQS77LH","oVQp68RCUA","ReKEWMaJQs","sqVrfTwano","SWfouiKqhr","HfyNQMaJQs","soy9t9eoRc","G1RhSU3yw5","DcpWBx3LDe","Yf2EcSjskQ",
+"FGzgpaFFss","v8yFNd85a9","J2mQiWreyP","In3NSqQxHP","mz8gxQWxoT","mX2GEgdQsS","UmaEvMK07Y","jtn0XEOE1o","Mkgy8i3pyd","vkCHHdhSuH",
+"bZLvSJ2mQi","v1HlnWaWsv","ulk41AOgEe","UmaEve6e4z","tl72WG1RhS","Yw2oUk85Ae","Mm8siqQxHP","n8pJ9YjB9t","iB08l45cIH","FjHXRP6bcg",
+"2TRI74W0Tl","uvf7A5drc6","sx5Gl7X3uy","I7p2aSWfou","hUTw7VIlwP","yvOMIIKxdL","7X3uyECMvU","In3NSs93Ml","uTacxZzJHW","VIlwPNcICA",
+"Mkgy8HRxd8","In3NSprNT6","uPX7G580YD","Twano0Kyfs","DQimp5drc6","uQIczTwano","xXTI4LbRTH","QChxs0PktI","QbxXcdmoS7","RBhp0Cp3mZ",
+"14FLRn1pmO","hYBCKMkgy8","i7WMQ6AFT0","FPfSEHfyNQ","zmLYDuoStw","zqH0Wt59lR","o8UydTXQ0Z","OxWIHh1zcH","uoStwSbRYy","tl72WY1mC0",
+"55rfBnnP8o","TCgPpBFkb8","e6e4zBbwgA","pFrrlkZANm","azIWp9rlg9","Yw2oUnnP8o","Kr8yspWiOs","0YAGHfaHir","djsrvMezSW","9rlg9YOfrY",
+"FPfSE7fKYU","JKWYR6q6L9","Ul4a1nlaBy","fqypyTCgPp","16lHcBFkb8","gtCA5NOHsz","jtn0XprNT6","aez9yv1Hln","618DipT8wu","64s8NnFqik",
+"5nmWvSs0Zu","VBjhzFjHXR","djsrvYjB9t","pmeCdGWqqX","Twanofqypy","k85AelpF6W","BGaQY5Namm","cShY2Q6hMC","jSjS3jeskS","ZUnqt64s8N",
+"faHirWMiS3","O3iyQMGlTF","uN6r3faHir","yEfy9NAFuw","iwzGkxXTI4","64s8NGWqqX","AgJHQWreyP","Yh1hF618Di","L7cGcGv3Fq","MaJQsRzaZA",
+"4dEz6lsQGo","GXdoHWaim6","9iGoTIn3NS","QbxXcyEfy9","BFkb85drc6","djsrvgf8rI","WmadAVIlwP","FwEJzoQ87r","3weIFNcICA","8FmFHCdyBV",
+"F6PT2t59lR","5NammNo0Qb","0BmCyuPX7G","9eoRcQ6hMC","uvf7AZhwG1","OUYuFHP433","6AFT0tAOsr","Mkgy8TXQ0Z","NOHsz0MR5X","ZUnqtCNHmv",
+"5Mg9rVjCZq","ni2v1fcwDa","dhSuHoVQp6","qUJMdVerEA","uLtKsjzUqR","LbRTHThjNn","JkzUnMmKGJ","NAFuwaDGtS","pmeCdWPmlx","uPX7GJkzUn",
+"blLA9cmXIX","MojnP0Kyfs","JXljW7fKYU","48cHLfLNg8","Chuy3uN6r3","y94nwYw2oU","7fsYMJ2mQi","ECMvUfaHir","lViBvFwEJz","hi5X7y94nw",
+"xXTI4iwzGk","8cVD3t59lR","64s8NqUJMd","vOqCElH1kt","lXFOBFnPFB","Oz8yZ7lUXZ","0KyfsLDk6f","1v5hHMm8si","ZzJHWdmoS7","2DREsMaJQs",
+"UlU3Ms93Ml","Kr8ys6AFT0","U3yw5AmdQd","5nmWvRBhp0","zY1GY4dEz6","jS1ajVIlwP","CxVEfnnP8o","Uvlv4ulk41","tAOsrtAOsr","ReKEWAkKTk",
+"lH1ktlm0pD","8RCUArKDLJ","a00b57hyVv","3otm6zHF1q","lweGyTXQ0Z","k85AeTwano","Kr8ysSWfou","29QAzP6bcg","JKWYRiqv4k","hi5X7AkKTk",
+"JJs5mhSSvQ","s7MxklH1kt","tlILtReKEW","mX2GEJIqXi","9GXkXK4GS8","brhlQ9GXkX","7hyVvMmKGJ","JJs5mCfgr3","Waim6pv0i7","ydG8UZJTXH",
+"atef2JXljW","VNCPd8RCUA","K4GS8NhXdu","gIYvEyToGW","0ao3l4W0Tl","jiVBPcShY2","dhSuHcQOnv","YOfrYVLTy6","he9IA14FLR","rhl0J580YD",
+"8RCUAWmadA","L7cGcv8yFN","BpYhVTCgPp","MmsIo5VZjS","HfyNQNcICA","AIYUuNxx9V","pFrrlTCgPp","e6e4zTCgPp","QClRLeuZA5","CdyBVX6Pin",
+"pWiOswDajX","RsQUqVerEA","b29RJSjskQ","uN6r3RsQUq","VNCPdXflUq","gIYvEUmaEv","VNCPdfcwDa","nFqik07n1c","5IhmGBGaQY","BCxeCYOfrY",
+"dmoS7DQimp","Mm8sipT8wu","zQt6Q8hJdt","7fKYUDz1R3","TCgPp8TxD7","S2DfuF6PT2","0KyfshSSvQ","0YAGHtjQxs","aDGtSguMb8","oGu6xiwzGk",
+"AmdQdDLhzM","Y1mC01v5hH","vkCHHzY1GY","lXFOBThjNn","ZzJHWgf8rI","cQOnvFGzgp","FVMxodmoS7","DLhzMOHaBz","k85AefmIK1","ZuDtDQ6Lix",
+"zqH0WNAFuw","JIqXi0PktI","s7Mxkuvf7A","0KyfsjeskS","CqqaDWaWsv","iKqhrC2Irc","yEfy9Q6hMC","cQOnvksJby","Ss0Zu618Di","1j5L8b29RJ",
+"MaJQsEdBKc","29QAzydG8U","DLhzMSs0Zu","IKxdLlViBv","AgJHQxReec","fcwDaAkKTk","P6bcgGSQwj","uZPqgMaJQs","9y4lwZzJHW","nlaBypv0i7",
+"nlaByx3LDe","gtCA564s8N","No0QbP6bcg","NhXduGv3Fq","EoToPtjQxs","CqqaDQWxoT","CIShGNo0Qb","s7MxkWaWsv","pv0i7ix74r","uvf7Ad85a9",
+"pAhR1lCMxy","K4GS8cShY2","CqqaDaFFss","6AFT0RzaZA","Cfgr38U2nU","okgRi2Yz7E","6AFT0lXFOB","gIYvErz7Ut","QWxoTuQIcz","pT8wuStlDJ",
+"Pb1paKsjRK","DQimpUlU3M","EoToPB3qem","Pb1paMGlTF","lj07QfmIK1","jzUqRrhl0J","BCxeCokgRi","0YAGHCdyBV","No0QbBbwgA","b29RJhi5X7",
+"suY4xCIShG","OHaBzMojnP","S77LHCK5W7","K4GS8GrDg7","VjCZqkB5nP","vOqCEJRJQB","9iGoTgtCA5","OHaBzW3VFH","lsQGoBFkb8","2TRI77fsYM",
+"RpBQmIBe8k","RxrsmFcWrW","fqypyEoToP","DQimpZUnqt","UlU3Mn8pJ9","8hJdtx3LDe","I7p2as7Mxk","tl72WjeskS","BCxeCJXljW","MGlTFZUnqt",
+"jeskS2hEEU","jeskSGrDg7","jeskSVerEA","Cp3mZ0BmCy","In3NSs4786","RzaZApv0i7","OxWIHgf8rI","yvOMIcL0aE","L7cGcv1Hln","PYBf4KZamH",
+"MezSWpAhR1","qUJMdLbRTH","uAWyp580YD","hSSvQ6q6L9","gtCA5WmadA","6AFT0uQIcz","KZamHa00b5","dmoS7nnP8o","AmdQdkZANm","O3iyQlweGy",
+"QnJ1Six74r","ydG8Uv2eC3","FPfSEFnPFB","RmDcrEOE1o","VNCPd9rlg9","v1HlnUvlv4","GWqqXTXQ0Z","J2mQiLbRTH","Mkgy8XflUq","2TRI7pv0i7",
+"qUJMdNo0Qb","lkMUAGWqqX","VerEAO3iyQ","9GXkXVIlwP","gf8rIrhl0J","QssNCdmoS7","5drc6WmadA","VerEAMaJQs","azIWpix74r","BCxeCMojnP",
+"Ss0ZupFrrl","Uvlv4Q6Lix","gf8rIHfyNQ","WMiS3DG4sT","CxVEfhYBCK","guMb8nnP8o","6q6L9FxX9q","HzZT8SbRYy","gdQsSa00b5","QChxsyEfy9",
+"JIqXijSjS3","7ku1pjtn0X","WMiS3NcICA","QClRLru4UG","m4bxUAgJHQ","wiHrZXflUq","hE1Qls4786","rKDLJL7cGc","brhlQiKqhr","kZANm9XyT9",
+"s7MxkBFkb8","JkzUntl72W","n8pJ9uZPqg","zbIYY29QAz","AOgEefFDrJ","hUTw7sqVrf","HlUbFdmoS7","9rlg9yToGW","8RCUAfaHir","WaWsv7lUXZ",
+"djsrvCqqaD","nFqikXyPZN","YjB9t5drc6","55rfBTXQ0Z","MmKGJFGzgp","mX2GEMkgy8","pT8wuQbxXc","lj07QyofH3","djsrv5Mg9r","3otm6I7p2a",
+"Dz1R3FLsph","CdyBVJ2mQi","9GXkXdhSuH","tAOsr4dEz6","Kr8ysMkgy8","BGaQYNxx9V","rhl0Jd7vjM","rKDLJ4QMc9","Y1mC0YOfrY","RmDcrRACuj",
+"uAWyp14FLR","EOE1oSmGzv","WaWsve6e4z","zQt6QFPfSE","RACujJRJQB","AkKTkF6PT2","Y1mC0cmXIX","7ku1p9XyT9","CdyBVmz8gx","nFqikWmadA",
+"9y4lwFnPFB","soy9tiKqhr","aez9ylkMUA","lweGyEoToP","o8Uyd5Mg9r","DcpWBZ4I1v","SWfouogLgc","B3qemYw2oU","s7MxkbgJAz","HP433F6PT2",
+"ZhwG1lj07Q","gtCA5ReKEW","blLA9atef2","aFFssM6qcG","yEfy9HfyNQ","fcJOyFLsph","JXljWyvOMI","mX2GEgjUTu","xReecCdyBV","6AFT0qaofN",
+"BCxeCbZLvS","yEfy97ku1p","ni2v1v8yFN","oVQp6580YD","Zv7z0jSjS3","XflUqAIYUu","rKDLJhi5X7","C2IrcjS1aj","B3qemGWqqX","QWxoT7fsYM",
+"FVMxozHF1q","64s8NBGaQY","k85AeS77LH","fFDrJ0PktI","3otm6y94nw","yluBxlXFOB","5Mg9rjiVBP","piJSk7X3uy","XyPZNgjUTu","Rxrsm07n1c",
+"ogLgcK4GS8","AXpwEGSQwj","MGlTF5VZjS","jfREuJkzUn","MK07YMK07Y","v2eC3kB5nP","QYxC0brhlQ","VNCPdDz1R3","24ARFAkKTk","he9IAyEfy9",
+"ReKEWxReec","y94nw2hEEU","zHF1qkZANm","xReecDLhzM","xciqpyofH3","IKxdLPb1pa","7hyVvfcJOy","xReecvLsmS","YOfrYhi5X7","QClRLMkgy8",
+"Pb1pa1v5hH","ogLgcFnPFB","sqVrfMmsIo","7Ow5CSWfou","WDVWJEoToP","Y1mC0CNHmv","rz7UtjzUqR","BGaQYNcICA","4W0TlZUnqt","gjUTutaOXK",
+"WmadAnFqik","D6rByTXQ0Z","CdyBVhUTw7","SWfoutjQxs","uQIczv8yFN","0Wr5y7fKYU","RpBQmtaOXK","LewvMZv7z0","W7cTs7X3uy","P6bcgbZLvS",
+"Z4I1vGrDg7","KZamHqUJMd","iqv4kfcJOy","Nxx9VblLA9","taOXK5Drn0","UmaEvGrDg7","7fsYMXflUq","t59lR9rlg9","JKWYR2ZHdk","VerEASs0Zu",
+"Chuy3D6rBy","tvdkDh1zcH","BpYhVs7Mxk","DLhzMnlaBy","M6qcGWDVWJ","m4bxU55rfB","uQIczYjB9t","KZamH7hyVv","2DREs07n1c","6q6L98xEKz",
+"FLsphCK5W7","QnJ1SkB5nP","ogLgc7hyVv","zFgtB8hJdt","pWiOsatef2","AkKTk48cHL","dQ586qUJMd","DLhzMfmIK1","QnJ1Sv2eC3","ogLgcGSQwj",
+"7hyVvHzZT8","Ss0Zu4dEz6","IjTwPQssNC","AkKTkYf2Ec","mz8gxNo0Qb","qaofNHfyNQ","StlDJ9rlg9","ix74rVprf2","2DREs8hJdt","m4bxUd85a9",
+"rKDLJFwEJz","14FLRAkKTk","IKxdLSWfou","PYBf4t98iW","VerEA55rfB","5ZaEzk85Ae","tvdkDSjskQ","iKqhr55rfB","8hJdtUvlv4","TCgPpL7cGc",
+"xciqpkZANm","nlaByiqv4k","CIShGHRxd8","GSQwjfqypy","kB5nPFFDui","LDk6fFnPFB","HfyNQ0Kyfs","QWxoT5Namm","GrDg7VBjhz","8TxD78U2nU",
+"J2mQi5nmWv","uvf7AUl4a1","07n1cVBjhz","piJSkm4bxU","FNYIMCqqaD","CK5W7taOXK","FwEJzXyPZN","AXpwEEdBKc","MGlTFXflUq","HfyNQChuy3",
+"CNHmvd7vjM","hUTw7FxX9q","AIYUu5VZjS","he9IAuPX7G","WDVWJQWxoT","55rfBSWfou","Q6LixpFrrl","KsjRKNAFuw","lm0pD1v5hH","aFFssoVQp6",
+"HzZT8vOqCE","ciuWz618Di","AXpwElH1kt","Cfgr3CNHmv","iwzGkDQimp","XflUqRkQke","sqVrfFLsph","4dEz6qQxHP","k85AeciuWz","Cfgr3uTacx",
+"DQimp8FmFH","EoToPQClRL","rhl0Jjtn0X","h1zcHNxx9V","SmGzvNhXdu","y94nwru4UG","EOE1oUl4a1","5Mg9rbgJAz","gjUTukB5nP","29QAzZzJHW",
+"9GXkXlH1kt","yEfy9qUJMd","FFDuiKASQ8","dhSuH0MR5X","iKqhrFjHXR","CxVEfMmKGJ","FGzgpHlUbF","bZLvS7ku1p","GrDg78U2nU","gjUTus93Ml",
+"8FmFH3weIF","6q6L9HfyNQ","i7WMQ5iGN5","Mkgy8SjskQ","uupzkoGu6x","wDajXL7cGc","2TRI78TxD7","Ta8f6BFkb8","NhXduiqv4k","In3NStAOsr",
+"0Wr5yrz7Ut","FnPFBiwzGk","qUJMdFNYIM","jSjS3piJSk","v1HlnYjB9t","8FmFHfFDrJ","I7p2atAOsr","BGaQYlpF6W","zY1GYZzJHW","1v5hHDcpWB",
+"RACujtAOsr","F6PT2cmXIX","bZLvSFnPFB","2ZHdk7X3uy","LbRTHO3iyQ","d7vjMnnP8o","yluBxLDk6f","CqqaDQnJ1S","xReecMkgy8","zz4ZUl83Ud",
+"v8yFNRxrsm","AmdQdSs0Zu","ydG8U1LB1L","4dEz6sqVrf","VIlwPsuY4x","iKqhrLbRTH","QnJ1S5Drn0","5VZjSpvgjS","JkzUnmz8gx","5Drn0vLsmS",
+"yToGWQ6Lix","lCMxySs0Zu","G1RhSlViBv","e6e4zIjTwP","uAWyp29QAz","2Yz7Epv0i7","QssNCMmKGJ","VIlwPvLsmS","Oz8yZFPfSE","jiVBPuoStw",
+"ni2v1fqypy","0YAGH580YD","7X3uyWmadA","YjB9tlXFOB","lCMxyRkQke","MezSWd85a9","cQOnvUvlv4","vkCHHatef2","Y1mC0ksJby","v8yFN5IhmG",
+"suY4xCp3mZ","tAOsrNo0Qb","AmdQdRpBQm","CdyBVzY1GY","8cVD3TXQ0Z","8TxD7hE1Ql","CK5W7W3VFH","YjB9ts7Mxk","Q6Lixs7Mxk","lj07QwDajX",
+"HP433JRJQB","yToGWfLNg8","t98iWrhl0J","7X3uypFrrl","guMb83weIF","64s8NvkCHH","BpYhVoVQp6","0MR5XgdQsS","uTacx55rfB","t98iWdhSuH",
+"lH1kt2Yz7E","jeskS7Ow5C","M6qcGRmDcr","No0Qb5ZaEz","l83UdW3VFH","HfyNQix74r","M3zXLCdyBV","4W0Tliqv4k","uZPqgPb1pa","zQt6QRACuj",
+"POUYSjzUqR","d7vjMZUnqt","FFDuiyofH3","jeskSNo0Qb","L7cGcgtCA5","YjB9tJ2mQi","Vprf2MmsIo","0MR5XzY1GY","taOXKpAhR1","6q6L9FFDui",
+"pFrrlOxWIH","5Drn0uN6r3","mX2GEulk41","HP433hUTw7","dpe1viqv4k","FLsphNhXdu","POUYSv1Hln","55rfBguMb8","O3iyQGrDg7","2Yz7EJIqXi",
+"ksJbyuoStw","tl72WUmaEv","9y4lwFFDui","zFgtBaFFss","GXdoHAIYUu","nlaByWreyP","7fKYUuLtKs","uTacx8FmFH","mX2GEFFDui","djsrvpFrrl",
+"fmIK15ZaEz","atef2580YD","uPX7G1LB1L","zz4ZUHfyNQ","jiVBPyToGW","iqv4kVerEA","kZANmoVQp6","TCgPpk85Ae","tvdkDVNCPd","yluBx580YD",
+"euZA5OUqFM","lm0pDpvgjS","e6e4zkB5nP","0BmCyi3pyd","VBjhzFNYIM","7Ow5CyToGW","Oz8yZmX2GE","hUTw7CqqaD","FNYIM7fsYM","B3qem5ZaEz",
+"Cp3mZcL0aE","VBjhz4QMc9","MK07YQ6hMC","UlU3MiKqhr","UlU3MRzaZA","lweGyuPX7G","JIqXizqH0W","9eoRcL7cGc","0KyfswiHrZ","QworuOxWIH",
+"pvgjSsuY4x","y94nwuZPqg","oVQp6lViBv","JKWYRK20wK","JJs5mGrDg7","y94nwnlaBy","zqH0W6AFT0","FxX9qs7Mxk","Ul4a1tl72W","KASQ8MezSW",
+"Ss0ZuhSSvQ","6AFT0SmGzv","BGaQYOz8yZ","uTacxGrDg7","gf8rIYOfrY","RACujOz8yZ","In3NSiwzGk","Y1mC0n8pJ9","L7cGczY1GY","2DREslj07Q",
+"MmKGJokgRi","n8pJ9JRJQB","jfREuFVMxo","bgJAz0YAGH","LDk6f5ZaEz","618DiK20wK","MmsIoOxWIH","5VZjSpWiOs","lH1ktMGlTF","W3VFHWMiS3",
+"azIWpuPX7G","0MR5XWMiS3","FGzgpSbRYy","v2eC37lUXZ","6AFT0jiVBP","HP4335Namm","lweGypv0i7","WPmlxiqv4k","zFgtB2hEEU","CIShG2Nslm",
+"oVQp6vkCHH","KsjRKciuWz","8cVD3GWqqX","HlUbFjtn0X","dpe1v9eoRc","RsQUqCK5W7","FFDui8FmFH","zbIYYFFDui","F6PT2RBhp0","Mm8sigtCA5",
+"GXdoHDcpWB","14FLR5Mg9r","uN6r3tl72W","64s8NzmLYD","suY4xStlDJ","SWfouvOqCE","5iGN59y4lw","1j5L8G1RhS","PYBf4Cp3mZ","ZuDtDjeskS",
+"piJSk8TxD7","4dEz6Yh1hF","BCxeCY1mC0","FjHXRFLsph","cShY2pvgjS","iB08lxXTI4","SmGzvxXTI4","uZPqgOHaBz","24ARFJKWYR","NhXduix74r",
+"LbRTHYOfrY","lsQGoyToGW","5nmWvpAhR1","JkzUnM6qcG","0YAGHPOUYS","2hEEUazIWp","vOqCETCgPp","lsQGoVBjhz","CNHmvjSjS3","lsQGoQbxXc",
+"MmKGJxReec","S77LHZJTXH","8TxD7X6Pin","0MR5XLewvM","6AFT0qQxHP","X6PinhE1Ql","Dz1R32DREs","Vprf2lj07Q","aDGtSa00b5","jzUqRlCMxy",
+"hE1QlUlU3M","4W0Tlrz7Ut","gtCA5aL6AJ","45cIHP6bcg","M6qcGThjNn","l83Udt59lR","oQ87rPb1pa","ZUnqtBpYhV","aFFssMezSW","oVQp6yvOMI",
+"VerEAl83Ud","HzZT8t98iW","jtn0Xdjsrv","mX2GElH1kt","OHaBzLDk6f","s93Ml2DREs","fmIK1GXdoH","KASQ8cQOnv","0YAGH8TxD7","nnP8oCfgr3",
+"9iGoTxReec","SmGzv55rfB","kB5nPuupzk","5ZaEzOz8yZ","7hyVvCp3mZ","zz4ZUJIqXi","HzZT8yofH3","he9IA3otm6","brhlQjfREu","zFgtBQClRL",
+"ZzJHWsoy9t","UmaEvs7Mxk","mz8gxDcpWB","hE1Ql5iGN5","5iGN5CqqaD","WmadADz1R3","yToGWKZamH","VjCZq0YAGH","cmXIXIBe8k","nnP8ogtCA5",
+"ciuWzWMiS3","5ZaEziB08l","fcJOyjS1aj","uN6r3t59lR","JkzUnUmaEv","5VZjSB3qem","pv0i7hE1Ql","UlU3MazIWp","B3qemmX2GE","QbxXcuZPqg",
+"8xEKzWaim6","W3VFHix74r","CIShGChuy3","vOqCEZuDtD","mX2GE8TxD7","8xEKzVprf2","lsQGocShY2","1j5L8zFgtB","SmGzvWMiS3","rz7Ut0Wr5y",
+"Ss0ZuqaofN","dmoS76q6L9","ZzJHW7fKYU","KsjRKi3pyd","qaofNtjQxs","QbxXcFxX9q","CIShGiqv4k","JIqXiSmGzv","MmKGJlCMxy","soy9tulk41",
+"9iGoTKZamH","0YAGHrhl0J","MmsIooVQp6","s7MxktAOsr","CqqaDQbxXc","0YAGHM3zXL","DQimpyEfy9","NcICAcShY2","v8yFNa00b5","PYBf4pT8wu",
+"fcJOyjSjS3","lCMxyTwano","ECMvUxXTI4","sqVrfix74r","ZzJHWNo0Qb","9GXkXfmIK1","IjTwPuoStw","yToGWNhXdu","lweGyThjNn","AmdQdguMb8",
+"ni2v1S2Dfu","cL0aEtlILt","v1Hlns93Ml","FcWrWgdQsS","zFgtBM3zXL","MmKGJh1zcH","AXpwEMojnP","djsrvQssNC","lsQGoMaJQs","QssNCDz1R3",
+"ogLgc0ao3l","9y4lwdhSuH","BFkb8Zv7z0","3otm6OHaBz","5ZaEzzQt6Q","zY1GYjeskS","9XyT9GSQwj","MK07YzHF1q","brhlQ29QAz","uupzkXflUq",
+"jtn0XpWiOs","Mm8siHfyNQ","pAhR17X3uy","14FLRNo0Qb","K20wKFPfSE","oQ87rSjskQ","iqv4kMK07Y","pmeCd3weIF","ru4UGn8pJ9","RsQUqMGlTF",
+"gIYvEBCxeC","K20wKeuZA5","P6bcgtjQxs","RpBQmWDVWJ","i3pydni2v1","SjskQM3zXL","WaWsvfcwDa","ru4UGGv3Fq","pT8wuWaim6","uPX7GqQxHP",
+"yluBxbZLvS","BbwgApv0i7","0h1b1v2eC3","jSjS3M6qcG","s7MxkpmeCd","WMiS3pWiOs","GWqqXoVQp6","VNCPdLewvM","EdBKcblLA9","F6PT2gIYvE",
+"lweGyaDGtS","QbxXcuAWyp","aDGtS0MR5X","s93Mljtn0X","zmLYDEOE1o","bZLvSMm8si","jSjS3JKWYR","lpF6WZuDtD","0h1b1OUqFM","guMb8lkMUA",
+"uupzk0Kyfs","1LB1Lru4UG","Yh1hFsoy9t","X6PinVLTy6","8U2nUcShY2","LbRTHSjskQ","9eoRcECMvU","618DiWmadA","suY4x4W0Tl","Waim6F6PT2",
+"Kr8ysZJTXH","7Ow5CjS1aj","0PktIl83Ud","lj07QYOfrY","taOXK5VZjS","P6bcgDG4sT","tvdkD8FmFH","faHirZUnqt","ZzJHWxReec","P6bcgpFrrl",
+"Oz8yZ1j5L8","Dz1R3AgJHQ","F6PT2QWxoT","blLA9JkzUn","azIWpMojnP","n1pmO5iGN5","07n1cF6PT2","RxrsmeuZA5","GWqqXSs0Zu","CqqaDprNT6",
+"vkCHH0MR5X","RmDcr0Kyfs","euZA5oQ87r","jfREuv8yFN","7fsYMcL0aE","jfREuLewvM","iqv4k7fsYM","MmKGJUlU3M","vOqCEni2v1","pvgjSFPfSE",
+"oQ87rtl72W","Mm8sijS1aj","SbRYyni2v1","EoToPJRJQB","FPfSEe6e4z","MmKGJOHaBz","tvdkDatef2","0PktIX6Pin","ReKEWzHF1q","fcwDaMojnP",
+"CdyBV5iGN5","lpF6W5Drn0","X6PinLbRTH","UlU3MpiJSk","WreyPjzUqR","zY1GYdmoS7","OUqFMOHaBz","qQxHP64s8N","d7vjMAXpwE","SmGzvYf2Ec",
+"azIWpFFDui","gdQsSReKEW","CNHmvuTacx","cL0aEQ6hMC","O3iyQlj07Q","JkzUnlsQGo","brhlQGv3Fq","ZhwG114FLR","uvf7Amz8gx","NhXduRsQUq",
+"zmLYDtaOXK","Dz1R3MaJQs","v1HlnG1RhS","okgRiIBe8k","FnPFBFVMxo","XflUq9iGoT","Uvlv4K4GS8","QYxC0SbRYy","qQxHPOUYuF","8U2nUIn3NS",
+"tuDySJXljW","rz7UtKZamH","FFDuikZANm","CIShGGWqqX","tvdkDsoy9t","M6qcG0YAGH","pT8wuJRJQB","F6PT2euZA5","QChxsiwzGk","3weIFx3LDe",
+"BCxeCpiJSk","rKDLJZuDtD","fcwDaaez9y","ksJbylpF6W","ThjNnTa8f6","Uvlv4Gv3Fq","AXpwE7ku1p","FwEJzfcJOy","wiHrZO3iyQ","azIWprKDLJ",
+"pv0i729QAz","suY4xEoToP","MezSWbZLvS","Ta8f6W7cTs","piJSk16lHc","dpe1v0Kyfs","fFDrJGXdoH","Mkgy8SWfou","rhl0J9GXkX","Dz1R30Wr5y",
+"a00b5d7vjM","QYxC0ZuDtD","CdyBVdQ586","s7MxkI7p2a","yToGWuQIcz","0ao3lVIlwP","14FLR9GXkX","ulk41hYBCK","Pb1paciuWz","ksJbym4bxU",
+"5Mg9rECMvU","AOgEezFgtB","lj07QI7p2a","ZuDtDRxrsm","QnJ1SLewvM","oQ87rgIYvE","JXljW7hyVv","5Drn0OHaBz","lCMxyoGu6x","RsQUqYjB9t",
+"3weIFk85Ae","24ARFUlU3M","07n1coQ87r","4W0TloVQp6","zbIYYZhwG1","t98iWWreyP","07n1cjS1aj","uJScXKASQ8","S2DfuJ2mQi","Uvlv4QChxs",
+"t59lR7fKYU","AXpwEZUnqt","ciuWzB3qem","jtn0XJJs5m","Cp3mZuvf7A","t98iWrKDLJ","1v5hHuJScX","Y1mC0Yf2Ec","VBjhzfFDrJ","JRJQBVjCZq",
+"FjHXRSWfou","IRh48hE1Ql","jfREuVerEA","7ku1pStlDJ","QClRL5iGN5","he9IA5Namm","7lUXZru4UG","tjQxsPYBf4","ZuDtDtAOsr","TXQ0ZJKWYR",
+"OHaBzv8yFN","TXQ0ZfLNg8","RACujrhl0J","hi5X748cHL","Rxrsm9eoRc","blLA96AFT0","uJScX1v5hH","0Kyfs3otm6","e6e4z5drc6","16lHccL0aE",
+"yEfy9L7cGc","StlDJMmKGJ","MmKGJguMb8","xciqpDz1R3","MojnP14FLR","b29RJbgJAz","hSSvQBpYhV","FwEJz1v5hH","ZUnqtuJScX","Gv3Fq4QMc9",
+"DQimp07n1c","DLhzM4dEz6","VNCPdatef2","h1zcHsoy9t","vkCHHxReec","8FmFHbrhlQ","hUTw7Mkgy8","LbRTHpT8wu","Uvlv4JKWYR","No0QblViBv",
+"8hJdtzQt6Q","GrDg7tvdkD","Mm8sifaHir","WaWsvEOE1o","S2DfujiVBP","lm0pDECMvU","kZANms7Mxk","X6PinMmsIo","Uvlv4EoToP","J2mQiTwano",
+"BCxeCCK5W7","Zv7z0W7cTs","yvOMIS77LH","kZANmuupzk","2TRI7Waim6","GSQwj0BmCy","CqqaDFwEJz","CIShGprNT6","fqypyMK07Y","No0QbMm8si",
+"FPfSEFGzgp","L7cGcMm8si","fmIK1qaofN","HlUbF24ARF","ulk41n8pJ9","5iGN5Yw2oU","GWqqXaFFss","Yh1hFgIYvE","lXFOBIKxdL","RACujSs0Zu",
+"8xEKzJJs5m","lCMxy8U2nU","OUqFM3otm6","aDGtSRACuj","I7p2aX6Pin","5iGN5FjHXR","Vprf2s7Mxk","taOXKZhwG1","IKxdL7fKYU","0MR5XFPfSE",
+"Mm8silH1kt","DLhzMKZamH","ni2v1NOHsz","hUTw7FcWrW","5Mg9ri3pyd","tl72W0Wr5y","DG4sToQ87r","BbwgAtl72W","BGaQYYjB9t","CxVEfEOE1o",
+"nnP8ozmLYD","9iGoTThjNn","jeskSh1zcH","lCMxyFVMxo","5NammQbxXc","9XyT914FLR","16lHcx3LDe","vOqCEWMiS3","brhlQzqH0W","GSQwjFFDui",
+"9y4lwB3qem","taOXKPb1pa","CxVEfUlU3M","1LB1L6q6L9","HP433ZJTXH","5VZjSuvf7A","oQ87r5drc6","QChxsXyPZN","D6rByK20wK","PYBf49XyT9",
+"X6Pin29QAz","aFFss2ZHdk","n1pmORsQUq","64s8Nrhl0J","lm0pDbrhlQ","lkMUAZv7z0","Uvlv49GXkX","t98iWBGaQY","14FLRfcJOy","0BmCycmXIX",
+"Yf2EctjQxs","LDk6fprNT6","VerEArz7Ut","bgJAziB08l","ciuWzgdQsS","bZLvSBFkb8","lsQGoVNCPd","YjB9t4dEz6","0PktIFhtgl","2NslmuJScX",
+"RmDcrQYxC0","SbRYy8U2nU","0BmCyCdyBV","Yf2EcIjTwP","F6PT2580YD","KsjRKlj07Q","jS1ajDQimp","uJScXAkKTk","nnP8oWmadA","nlaBy2hEEU",
+"atef2MmsIo","hYBCKFFDui","SWfouFLsph","pv0i7AXpwE","nnP8okZANm","uLtKsWreyP","7hyVvRACuj","VNCPdOxWIH","jS1ajpvgjS","HzZT8W7cTs",
+"iqv4knlaBy","StlDJI7p2a","7lUXZIBe8k","fmIK1pv0i7","JRJQBK4GS8","O3iyQiB08l","ZuDtD7fsYM","7lUXZpvgjS","VIlwPyToGW","9XyT9brhlQ",
+"ydG8USbRYy","MezSWx3LDe","4W0TlksJby","W3VFH9y4lw","i7WMQQ6hMC","ThjNnOUYuF","xXTI4zqH0W","ReKEWCIShG","0MR5XTXQ0Z","8hJdtMkgy8",
+"ru4UGsuY4x","SmGzvhE1Ql","yvOMI2DREs","JkzUnKASQ8","cShY2taOXK","2DREsuN6r3","O3iyQyvOMI","t98iWoVQp6","zqH0WjS1aj","2DREsC2Irc",
+"DQimp2DREs","fLNg8ksJby","vLsmSMmKGJ","KsjRKSmGzv","0BmCyoVQp6","AXpwEn1pmO","IBe8ks7Mxk","h1zcH618Di","aDGtSpT8wu","aFFssOUqFM",
+"KsjRKjiVBP","qUJMdt59lR","uLtKsguMb8","QbxXcOz8yZ","S2DfuNxx9V","x3LDe4W0Tl","dhSuH9y4lw","B3qem0ao3l","5ZaEztjQxs","lH1kt4W0Tl",
+"lXFOBMK07Y","16lHc4QMc9","5iGN564s8N","Dz1R3fqypy","fcJOyEoToP","7lUXZv8yFN","bgJAzK20wK","MmKGJNOHsz","nnP8oOUYuF","vkCHHD6rBy",
+"i3pydVIlwP","Yw2oUStlDJ","EOE1ohSSvQ","l83Ud5nmWv","euZA5CNHmv","dhSuHSmGzv","ZuDtDU3yw5","580YDFFDui","mz8gx4dEz6","aez9yKASQ8",
+"tvdkDpiJSk","CxVEfFPfSE","1j5L8K4GS8","9GXkXCqqaD","mz8gxStlDJ","CxVEfkB5nP","5Drn0QbxXc","AIYUuQClRL","iB08lhi5X7","7hyVvAOgEe",
+"HlUbFRsQUq","VerEAMojnP","XflUqQWxoT","0h1b124ARF","tAOsrRxrsm","Nxx9V618Di","QssNC8cVD3","HRxd8tl72W","yvOMIFLsph","POUYS8U2nU",
+"8cVD3djsrv","a00b5cmXIX","soy9tfaHir","iqv4kMm8si","tl72WCK5W7","QWxoTVjCZq","fcJOyhi5X7","oGu6xqaofN","2Yz7E2Nslm","Zv7z0rhl0J",
+"BbwgAix74r","8RCUApvgjS","sx5Gl8cVD3","FGzgp5iGN5","nlaByCNHmv","5NammQ6hMC","uvf7AJJs5m","FGzgpAkKTk","618Di5Mg9r","oVQp64W0Tl",
+"gjUTupFrrl","6q6L9oGu6x","LewvMkZANm","JIqXiXflUq","DLhzMVBjhz","Ta8f62Yz7E","dpe1vpFrrl","5VZjSMK07Y","580YDIRh48","d85a9RkQke",
+"8TxD70BmCy","s7MxkS77LH","HlUbFzQt6Q","CdyBVJJs5m","Yf2Ec07n1c","blLA9GSQwj","MmKGJThjNn","blLA9DLhzM","NAFuwoGu6x","RzaZAF6PT2",
+"lpF6WWaim6","Cfgr3HzZT8","QClRLZ4I1v","RpBQmlpF6W","8RCUAJIqXi","5nmWvO3iyQ","vLsmSgjUTu","d85a92Yz7E","CIShG7lUXZ","dhSuHWMiS3",
+"ni2v1bgJAz","JkzUn5IhmG","5Mg9r9GXkX","RmDcrhi5X7","DLhzM5iGN5","ReKEW0Kyfs","lH1kt5Mg9r","oQ87r0h1b1","StlDJSWfou","580YDNhXdu",
+"No0QbtvdkD","QbxXcKsjRK","OHaBztaOXK","CK5W7Q6Lix","pT8wus4786","FjHXR5ZaEz","AgJHQ0BmCy","FFDuihE1Ql","jtn0X0BmCy","QbxXcyofH3",
+"pFrrlMK07Y","aez9ykB5nP","45cIHW7cTs","GrDg7Rxrsm","UmaEviKqhr","AOgEeP6bcg","8xEKzQChxs","Pb1pa4QMc9","JRJQBzmLYD","FcWrWW3VFH",
+"XflUq0ao3l","0YAGHMmKGJ","zHF1q9GXkX","aez9y9rlg9","No0QbHzZT8","DG4sTzY1GY","BpYhVvkCHH","lj07QReKEW","iB08lJXljW","AOgEeHRxd8",
+"hE1Qlb29RJ","Yw2oUFFDui","Oz8yZvOqCE","QYxC0zz4ZU","d85a9W7cTs","IjTwPlweGy","HP4330h1b1","mX2GEJRJQB","HlUbFlj07Q","AgJHQQ6hMC",
+"9iGoTd7vjM","qaofNlweGy","t59lRnlaBy","Nxx9V07n1c","6AFT01LB1L","VLTy6IRh48","ReKEWRmDcr","FPfSElkMUA","aFFssS2Dfu","EOE1oK20wK",
+"ZJTXHWaim6","14FLRuN6r3","kB5nPaez9y","CNHmvCfgr3","7ku1pG1RhS","XyPZNgdQsS","dpe1vRxrsm","16lHcqQxHP","ni2v10ao3l","ydG8UIjTwP",
+"MGlTFv2eC3","Kr8ysJkzUn","9GXkXxXTI4","fqypyQnJ1S","zmLYDU3yw5","hSSvQyToGW","Z4I1vru4UG","rKDLJtAOsr","OxWIH5drc6","MezSW4W0Tl",
+"o8Uyd5nmWv","uN6r3fmIK1","5Drn0uTacx","OUYuFBFkb8","CIShGZzJHW","uPX7GGrDg7","MmsIofFDrJ","0MR5XzqH0W","tl72Wxciqp","0Kyfs8cVD3",
+"CxVEfmX2GE","bgJAzNOHsz","fFDrJ4dEz6","cmXIXQWxoT","VBjhzD6rBy","fcJOyt98iW","jiVBPQbxXc","h1zcHWmadA","9iGoTTa8f6","guMb8WreyP",
+"S77LHAXpwE","0BmCycQOnv","rhl0JWPmlx","UlU3MaFFss","FcWrWF6PT2","9GXkXKZamH","jiVBP0MR5X","NOHsz45cIH","zbIYYbrhlQ","ksJbyFhtgl",
+"dpe1vuZPqg","oGu6xatef2","lj07QQbxXc","dpe1vLDk6f","lH1kt5nmWv","qUJMdLewvM","djsrvfcJOy","yluBxNxx9V","fcJOyd7vjM","M6qcGNo0Qb",
+"tuDySlweGy","QYxC0qaofN","QChxsTa8f6","fcJOy1j5L8","faHirdpe1v","DLhzMQClRL","Zv7z0aFFss","JXljWHfyNQ","y94nwRxrsm","fFDrJ1LB1L",
+"dmoS75VZjS","oVQp6zHF1q","ydG8UyofH3","5VZjSNhXdu","oGu6xFhtgl","No0QbtuDyS","zQt6QAgJHQ","GWqqXgf8rI","8RCUAVBjhz","jS1ajqaofN",
+"0YAGH9y4lw","gjUTulsQGo","y94nwZUnqt","14FLRlViBv","RBhp0Fhtgl","Chuy3KsjRK","GSQwj5Mg9r","ECMvUIBe8k","v8yFNZUnqt","VNCPdL7cGc",
+"8RCUAcShY2","W7cTsd85a9","BCxeC4dEz6","8TxD7FjHXR","Mm8si2ZHdk","Yf2Ec5Namm","Pb1pa7Ow5C","uupzkBbwgA","5drc6EdBKc","a00b5n1pmO",
+"zqH0W7X3uy","ksJbyW7cTs","FwEJzRpBQm","HP433SWfou","IBe8ka00b5","nlaByAmdQd","CNHmvcL0aE","SbRYyzbIYY","48cHLL7cGc","FNYIMdQ586",
+"Yh1hFgjUTu","xciqp07n1c","JXljW07n1c","DG4sT2Yz7E","AIYUuZ4I1v","Uvlv4No0Qb","FnPFBMGlTF","Yf2EczmLYD","GWqqXlsQGo","8xEKzdpe1v",
+"ECMvUB3qem","gtCA5BCxeC","4QMc9GXdoH","AgJHQfmIK1","3otm6m4bxU","uZPqggjUTu","2DREszQt6Q","IKxdLNcICA","ix74r5ZaEz","5ZaEzjeskS",
+"fcJOytl72W","MezSWwiHrZ","hUTw7AgJHQ","kB5nPguMb8","5Drn0zz4ZU","9eoRcjeskS","n1pmOrhl0J","UmaEvkB5nP","SWfous4786","7lUXZn1pmO",
+"GWqqXtaOXK","HlUbFXflUq","6AFT0t98iW","jSjS3OxWIH","aFFss9GXkX","lsQGofLNg8","WreyPI7p2a","RzaZAyofH3","SbRYyqQxHP","euZA5pAhR1",
+"0h1b1JXljW","SbRYypv0i7","WmadAcL0aE","LDk6fhi5X7","tuDyS8hJdt","M6qcGBGaQY","QChxsMkgy8","Gv3Fqk85Ae","m4bxUBFkb8","U3yw5y94nw",
+"0BmCyuupzk","vLsmSDG4sT","xciqpOHaBz","FnPFBnFqik","1LB1LZUnqt","5iGN5yvOMI","7Ow5Cs7Mxk","aez9yRpBQm","pAhR1WDVWJ","CdyBV48cHL",
+"mz8gxpv0i7","ru4UGdpe1v","oQ87rO3iyQ","VLTy60YAGH","618DiPOUYS","Q6hMC4dEz6","jzUqRYh1hF","29QAzlkMUA","VLTy6pv0i7","CIShGS77LH",
+"5iGN5K4GS8","IKxdLiqv4k","tvdkDFxX9q","EoToPcmXIX","tAOsrkZANm","m4bxUiKqhr","IRh48C2Irc","SWfou8RCUA","WmadAIjTwP","uN6r38TxD7",
+"qUJMd8cVD3","mX2GEXyPZN","CNHmvjiVBP","RxrsmrKDLJ","GXdoHBpYhV","jSjS3LewvM","ZJTXHKZamH","U3yw5FFDui","FjHXR1LB1L","fFDrJUlU3M",
+"AkKTkBbwgA","jtn0Xk85Ae","lsQGoGv3Fq","8U2nUn1pmO","CIShGlj07Q","In3NSyEfy9","QssNCzHF1q","64s8NokgRi","SmGzvD6rBy","fFDrJpAhR1",
+"mz8gxm4bxU","2Yz7ELewvM","QssNCJJs5m","Z4I1vMaJQs","lm0pDfFDrJ","2ZHdkPb1pa","JKWYRAXpwE","6AFT0OUqFM","lpF6WTXQ0Z","hE1QlCdyBV",
+"NAFuwlpF6W","0PktI5IhmG","ni2v1RACuj","tAOsrPOUYS","pv0i7cQOnv","qQxHPJJs5m","8hJdtDcpWB","FFDuiQnJ1S","bgJAz7ku1p","QnJ1SZUnqt",
+"W7cTslViBv","uPX7GKsjRK","7lUXZY1mC0","CqqaDMGlTF","jzUqRFFDui","lsQGoiwzGk","ZhwG1pWiOs","5Mg9rHRxd8","K20wKwDajX","tuDySOHaBz",
+"7fKYUJJs5m","WMiS3Twano","Ss0ZuksJby","UmaEv0h1b1","cmXIXyEfy9","Q6hMC3weIF","0ao3lxXTI4","nnP8oFnPFB","bgJAzciuWz","wiHrZuN6r3",
+"uJScXuN6r3","AXpwEgf8rI","IjTwP5drc6","fcwDaECMvU","8hJdtLewvM","djsrvs7Mxk","uN6r3HRxd8","4W0TlyEfy9","NcICAxXTI4","x3LDe5Drn0",
+"okgRi4dEz6","9eoRc3otm6","1LB1LUl4a1","guMb8BbwgA","a00b5WDVWJ","VjCZqAOgEe","AgJHQYh1hF","uTacxYh1hF","Uvlv4ciuWz","ZzJHWlj07Q",
+"ogLgc9XyT9","DQimp7hyVv","suY4xReKEW","GrDg7qUJMd","HP433rKDLJ","jSjS3zFgtB","P6bcgguMb8","hSSvQiKqhr","FwEJzJKWYR","4dEz6lCMxy",
+"lH1ktuQIcz","nlaByhYBCK","Q6hMCJkzUn","l83UdAgJHQ","4dEz6IRh48","zY1GYgIYvE","ThjNn0Wr5y","Chuy3EoToP","HfyNQnlaBy","7hyVvDcpWB",
+"Ul4a1lXFOB","QbxXclpF6W","iwzGkHP433","okgRiIn3NS","BpYhVUlU3M","0PktIhSSvQ","GWqqXqUJMd","Q6Lixv8yFN","5VZjSGSQwj","oQ87rFGzgp",
+"d85a9MmKGJ","Oz8yZxciqp","k85AeSs0Zu","wiHrZ2TRI7","KZamHzY1GY","FPfSEoQ87r","GSQwjhSSvQ","d85a9t98iW","Q6hMCtAOsr","k85Aerz7Ut",
+"WPmlxhYBCK","RpBQm0YAGH","MK07Yi3pyd","EoToPWMiS3","MmKGJa00b5","DcpWBuvf7A","K4GS8fmIK1","mz8gx2TRI7","SWfoud7vjM","RkQkerz7Ut",
+"9rlg95IhmG","cShY2GXdoH","RxrsmzbIYY","5Mg9riqv4k","DQimpDG4sT","o8UydZuDtD","n8pJ9TXQ0Z","Q6LixIjTwP","yluBxC2Irc","S77LHP6bcg",
+"jeskSWaim6","RACujazIWp","KASQ8he9IA","7fsYM7fKYU","55rfBni2v1","4dEz6rz7Ut","1LB1LpmeCd","uupzkGrDg7","QYxC0hSSvQ","suY4xgf8rI",
+"ZUnqtsqVrf","iKqhr5iGN5","WDVWJCfgr3","uoStwuAWyp","Kr8ysYf2Ec","iqv4kJJs5m","y94nwYjB9t","he9IAiqv4k","FNYIM9XyT9","KsjRKStlDJ",
+"atef2yvOMI","Ul4a1VjCZq","IKxdLFLsph","jfREuAgJHQ","QbxXciwzGk","3weIFPb1pa","2ZHdkOxWIH","Gv3Fqzz4ZU","prNT6NcICA","hUTw7QnJ1S",
+"t98iWuZPqg","JkzUn14FLR","GrDg7GSQwj","gtCA5pmeCd","uZPqgRmDcr","5ZaEzYh1hF","Z4I1vUmaEv","X6Pin0YAGH","soy9tNxx9V","Ul4a1QnJ1S",
+"MojnP2ZHdk","cmXIXHRxd8","9rlg9Ta8f6","t98iWtaOXK","CNHmvDG4sT","EdBKcUl4a1","O3iyQJIqXi","soy9tzY1GY","5nmWvKASQ8","ZuDtD9eoRc",
+"IKxdLaFFss","qQxHPQnJ1S","55rfBx3LDe","dpe1v9iGoT","2ZHdktuDyS","L7cGcrhl0J","atef2djsrv","JRJQBRACuj","MojnPLbRTH","uJScXyluBx",
+"FjHXRxReec","FhtglgjUTu","iwzGkpFrrl","5VZjSiwzGk","ECMvUVBjhz","s4786ksJby","iqv4kHP433","TXQ0ZWreyP","24ARF4dEz6","suY4xazIWp",
+"6AFT0Waim6","ydG8U8U2nU","0Kyfs0PktI","D6rBy5Mg9r","uN6r3Q6hMC","TXQ0ZgjUTu","FwEJzh1zcH","U3yw5QChxs","brhlQBpYhV","NhXdujtn0X",
+"djsrvfmIK1","RkQkeCxVEf","jzUqR4dEz6","XflUqd7vjM","AgJHQpiJSk","VBjhzM3zXL","v1Hln7X3uy","7ku1pFFDui","x3LDeksJby","jzUqRqQxHP",
+"1v5hHhe9IA","8U2nULbRTH","O3iyQGXdoH","lpF6Wrhl0J","RmDcrLewvM","yofH3ReKEW","YOfrY5ZaEz","lH1ktSmGzv","tAOsr1LB1L","P6bcgiKqhr",
+"dQ586RpBQm","zz4ZUYOfrY","kZANm5Mg9r","v1Hln7ku1p","5IhmGRxrsm","nnP8ozqH0W","ECMvU7hyVv","oGu6xmz8gx","vLsmSAIYUu","t59lRt98iW",
+"HP433RmDcr","29QAziB08l","s7Mxkn1pmO","YjB9tMGlTF","Mm8sinFqik","JRJQBCfgr3","tuDyScmXIX","Twano5Mg9r","RzaZAv8yFN","fLNg8KASQ8",
+"YjB9tDQimp","t59lRfLNg8","o8UydiKqhr","JIqXiCp3mZ","oGu6xpv0i7","HfyNQ5Mg9r","GSQwj2DREs","POUYSZ4I1v","qUJMdMGlTF","sx5GlW3VFH",
+"zY1GY6AFT0","uQIczmX2GE","aez9yFjHXR","2ZHdk8U2nU","RzaZAatef2","lH1kt580YD","lweGyt59lR","MGlTFQWxoT","SjskQMmKGJ","NAFuwVprf2",
+"POUYSRpBQm","yluBxt98iW","3weIFhi5X7","aez9yXyPZN","nFqikIKxdL","WDVWJuLtKs","ZJTXHuAWyp","M3zXLAOgEe","dhSuHs93Ml","6q6L9euZA5",
+"YjB9tRkQke","mz8gxru4UG","fcwDaQ6hMC","xXTI4AkKTk","nlaByRzaZA","HzZT8Yf2Ec","QbxXcpT8wu","bZLvSnFqik","55rfBM6qcG","4W0TluoStw",
+"9eoRcP6bcg","G1RhShi5X7","EOE1oLbRTH","7hyVvlXFOB","9XyT99eoRc","ix74rEOE1o","sqVrffaHir","7Ow5CFGzgp","O3iyQ7ku1p","nlaBy55rfB",
+"uAWyp8TxD7","yvOMIZhwG1","soy9tzFgtB","07n1ck85Ae","7ku1pAgJHQ","AmdQd16lHc","8cVD3azIWp","MGlTFa00b5","hUTw7FVMxo","8U2nUQworu",
+"piJSkbgJAz","8FmFHRzaZA","uZPqgazIWp","pv0i7ZUnqt","iqv4kuPX7G","FwEJziB08l","e6e4z8RCUA","L7cGctlILt","MGlTFZv7z0","4W0Tls93Ml",
+"JJs5m0ao3l","2NslmTa8f6","WmadAdjsrv","0Wr5yI7p2a","FNYIMzbIYY","djsrvP6bcg","5VZjSkZANm","GWqqXStlDJ","Nxx9VyvOMI","AOgEezqH0W",
+"0ao3liKqhr","lViBvEOE1o","S77LHPYBf4","9iGoTHRxd8","9GXkXFjHXR","9XyT9VLTy6","VIlwPbrhlQ","0ao3lrKDLJ","tuDySPb1pa","lweGyzFgtB",
+"MK07YM6qcG","Uvlv4lpF6W","blLA96q6L9","kB5nPgf8rI","yEfy9In3NS","dmoS7ogLgc","hUTw71v5hH","AmdQdxXTI4","mz8gxUl4a1","J2mQi48cHL",
+"WaWsvAOgEe","UmaEvQ6Lix","XflUqbrhlQ","yvOMIFhtgl","NAFuw9XyT9","SbRYymz8gx","aFFssQWxoT","FhtglRkQke","7ku1ptl72W","VIlwPuJScX",
+"0Wr5ycShY2","VjCZqo8Uyd","W7cTsnnP8o","pv0i7IRh48","faHirUlU3M","x3LDeIRh48","CNHmvyofH3","BGaQYFLsph","X6PinRkQke","Cfgr3Kr8ys",
+"29QAzdmoS7","7ku1pru4UG","M6qcGLewvM","QssNCZUnqt","8U2nUyEfy9","s4786BbwgA","8cVD3QbxXc","ECMvUvkCHH","NhXduguMb8","VIlwPQ6Lix",
+"7hyVvWmadA","0ao3loGu6x","M6qcG5ZaEz","BCxeCxReec","64s8NguMb8","soy9tv1Hln","BbwgAEdBKc","RzaZAQWxoT","MojnPS2Dfu","n1pmO16lHc",
+"gjUTufcwDa","RBhp0jfREu","ReKEWRACuj","MmKGJ24ARF","In3NS8RCUA","9iGoTcL0aE","In3NSIjTwP","7fsYMSWfou","VIlwPoVQp6","CNHmvlXFOB",
+"rhl0Jdpe1v","iwzGkRxrsm","v8yFNfaHir","VjCZqHP433","Kr8ysgdQsS","jzUqR5drc6","fFDrJ6AFT0","lpF6WHRxd8","No0Qb8U2nU","zbIYYIRh48",
+"5Drn0MezSW","RkQkeaL6AJ","BCxeCaFFss","PYBf48FmFH","F6PT20Wr5y","IKxdLzQt6Q","7ku1psoy9t","fcwDaRBhp0","WreyPKsjRK","lCMxyQworu",
+"9y4lwzbIYY","UmaEvNxx9V","VerEA9GXkX","guMb8P6bcg","lsQGoFVMxo","RkQkeeuZA5","aFFss0Wr5y","K20wKFLsph","zQt6Qs4786","MmKGJix74r",
+"24ARFStlDJ","1LB1Ln1pmO","K20wK14FLR","0MR5XGSQwj","M6qcGWMiS3","ZhwG19GXkX","Yf2EcuPX7G","ru4UGs7Mxk","DcpWBlsQGo","FFDuiAIYUu",
+"No0QbuLtKs","WmadAyToGW","FjHXRm4bxU","Q6LixSWfou","MGlTFFGzgp","dQ586L7cGc","XflUqpFrrl","zHF1q8U2nU","azIWpyofH3","lpF6WGSQwj",
+"s93Ml16lHc","tjQxs2DREs","6q6L9h1zcH","oQ87r8xEKz","VNCPdX6Pin","7X3uyCNHmv","sqVrfRACuj","VLTy6DG4sT","QssNCJkzUn","kB5nPrhl0J",
+"MojnPQworu","lXFOBAgJHQ","4W0TlprNT6","IBe8klViBv","hi5X77hyVv","KZamHYjB9t","HlUbFmX2GE","fcwDa2Nslm","MaJQsulk41","W3VFHm4bxU",
+"2Yz7Ek85Ae","i7WMQ9eoRc","7fKYURmDcr","VLTy6HzZT8","h1zcHru4UG","JRJQBdjsrv","FcWrWdpe1v","soy9tGrDg7","0ao3ljiVBP","pvgjS7X3uy",
+"UlU3Mgf8rI","tAOsrHfyNQ","tjQxsKASQ8","d7vjMQ6Lix","wiHrZSmGzv","KASQ8rKDLJ","EOE1oRBhp0","he9IApAhR1","SmGzvGv3Fq","FPfSESmGzv",
+"lH1ktdmoS7","0YAGH24ARF","StlDJHfyNQ","cQOnvtAOsr","UlU3MVIlwP","uvf7A0Kyfs","uvf7AuQIcz","a00b53otm6","Waim6RACuj","VBjhz7hyVv",
+"ZUnqt5VZjS","CqqaDuZPqg","AIYUuJIqXi","l83UduPX7G","pvgjS9GXkX","ZzJHWzz4ZU","gjUTuuvf7A","QnJ1Sjtn0X","fcwDa5ZaEz","GWqqXs7Mxk",
+"QChxslkMUA","6q6L90BmCy","14FLRVLTy6","Oz8yZ9GXkX","ZhwG10BmCy","8FmFHzHF1q","JkzUnIBe8k","lpF6WjeskS","S77LHfcwDa","JKWYRyToGW",
+"0MR5XOz8yZ","iKqhrni2v1","azIWpxciqp","QClRLC2Irc","K4GS8M3zXL","AkKTkhe9IA","Mkgy8NOHsz","uZPqgQWxoT","W3VFHMojnP","zHF1q7ku1p",
+"9XyT9pWiOs","Vprf2oGu6x","v8yFNuZPqg","suY4xHlUbF","t59lRRxrsm","lH1ktYw2oU","Uvlv4zmLYD","CIShGFGzgp","07n1cZUnqt","sqVrfUl4a1",
+"t59lRAOgEe","DcpWBv1Hln","jiVBPiqv4k","SjskQF6PT2","QChxsK20wK","JIqXiKASQ8","RmDcrgjUTu","rhl0JZzJHW","guMb8prNT6","W7cTsQChxs",
+"Pb1pabZLvS","J2mQiwiHrZ","hSSvQC2Irc","ix74rFwEJz","FcWrW14FLR","IRh48zqH0W","2TRI7qaofN","RsQUqtlILt","64s8NzY1GY","GSQwjHzZT8",
+"Y1mC0pWiOs","oQ87rZv7z0","rhl0Jix74r","nlaByZ4I1v","SjskQJRJQB","8hJdtS2Dfu","QworuSs0Zu","Pb1paOz8yZ","JKWYRsqVrf","2Yz7Eaez9y",
+"bZLvSvkCHH","n1pmO9iGoT","No0QbgIYvE","Twanotl72W","cShY2ni2v1","yluBx9XyT9","ZzJHWFNYIM","ciuWzhYBCK","Vprf2KZamH","FGzgphYBCK",
+"GWqqXMmKGJ","Y1mC0WreyP","cL0aEpT8wu","DcpWBCIShG","CK5W74QMc9","7fKYUlXFOB","KASQ8Q6hMC","SjskQAOgEe","FcWrW5iGN5","yvOMINo0Qb",
+"5IhmGrKDLJ","7fsYMsoy9t","LewvMM6qcG","GSQwjXyPZN","M6qcGkZANm","fcJOywDajX","GWqqXsx5Gl","5NammZv7z0","QssNCUvlv4","zqH0WbgJAz",
+"ulk41FPfSE","xXTI4O3iyQ","Kr8ys4dEz6","uTacxyvOMI","Dz1R30h1b1","jSjS35drc6","VNCPdpT8wu","HlUbFQWxoT","Gv3FqpmeCd","aFFssC2Irc",
+"7fKYUHlUbF","DQimpyvOMI","AgJHQuLtKs","XyPZNuoStw","FGzgptuDyS","IBe8kBFkb8","QYxC0uoStw","VjCZqI7p2a","HzZT8BpYhV","lViBv45cIH",
+"v1HlnAkKTk","tAOsr9XyT9","Yw2oUGXdoH","5Mg9rTCgPp","pT8wuxXTI4","okgRipmeCd","b29RJQChxs","CIShGGv3Fq","0PktIix74r","Kr8ysvkCHH",
+"07n1cOUYuF","RzaZABpYhV","RxrsmzqH0W","LbRTHJkzUn","7hyVviqv4k","tAOsrM6qcG","ru4UGDQimp","jzUqRBbwgA","h1zcHzHF1q","RzaZAfFDrJ",
+"BpYhV5Drn0","9rlg96AFT0","rhl0JhYBCK","zY1GYFxX9q","ReKEWZ4I1v","v2eC3TXQ0Z","JkzUnhSSvQ","YOfrY45cIH","lm0pDIRh48","fFDrJprNT6",
+"Mm8siQChxs","OUqFMsx5Gl","TXQ0Z5VZjS","rhl0JzFgtB","kZANm580YD","vLsmSFhtgl","Dz1R3mX2GE","QssNC55rfB","DQimp5iGN5","DcpWBbZLvS",
+"L7cGciwzGk","BGaQYBpYhV","s93MlKr8ys","fmIK1AIYUu","sqVrf5iGN5","hYBCKMK07Y","NOHszaFFss","lH1ktDcpWB","VBjhzcmXIX","nnP8osx5Gl",
+"qQxHPfmIK1","pWiOsblLA9","FNYIM7ku1p","yluBxJkzUn","aL6AJPYBf4","yofH3TCgPp","Nxx9ViB08l","JIqXiWmadA","7fKYUFVMxo","ni2v1zFgtB",
+"MGlTFSbRYy","MmsIouupzk","hE1QlHlUbF","4QMc99GXkX","UmaEvDcpWB","GWqqXFPfSE","iKqhrfaHir","FLsph0h1b1","CdyBVtjQxs","pT8wuv8yFN",
+"8hJdtPb1pa","QssNC7hyVv","NcICAStlDJ","TwanozHF1q","WPmlx48cHL","jtn0XAOgEe","580YDfLNg8","pmeCdblLA9","WPmlxmz8gx","QnJ1SJIqXi",
+"tAOsrazIWp","KASQ85Drn0","qQxHPfqypy","t59lRn8pJ9","zz4ZUUlU3M","7Ow5C6q6L9","a00b5GrDg7","FwEJzChuy3","W3VFHdjsrv","TwanopFrrl",
+"fcwDadhSuH","Uvlv4AXpwE","HfyNQ8xEKz","HRxd8WaWsv","45cIHSbRYy","dmoS7CxVEf","FhtglMojnP","aDGtSECMvU","POUYSVprf2","ciuWzFwEJz",
+"atef2Zv7z0","rz7UtZv7z0","3otm6uQIcz","UmaEvrhl0J","MmKGJ7ku1p","gjUTu1j5L8","fqypyuupzk","BGaQYbgJAz","v1HlnDcpWB","uQIcz9rlg9",
+"rKDLJKsjRK","FhtglzQt6Q","s7Mxkdpe1v","EOE1oFFDui","VjCZqlweGy","yluBxd85a9","h1zcHl83Ud","djsrvv2eC3","BCxeCRACuj","iwzGky94nw",
+"RBhp05iGN5","cQOnvCfgr3","618DiDcpWB","dQ586lkMUA","5VZjSYOfrY","SWfouNxx9V","UlU3MFFDui","AIYUu0ao3l","JIqXiRACuj","aL6AJyEfy9",
+"rhl0J5Drn0","jzUqR0Wr5y","jiVBPQWxoT","pvgjSv8yFN","FnPFBlj07Q","WaWsvtuDyS","dhSuHgtCA5","zbIYYlH1kt","dQ5867Ow5C","24ARF9eoRc",
+"StlDJsoy9t","rz7UtRBhp0","nlaByoQ87r","yofH3oVQp6","Oz8yZFVMxo","cShY2nnP8o","mz8gxPb1pa","ciuWzjfREu","VjCZquN6r3","KsjRKNcICA",
+"nFqiklpF6W","Y1mC0lsQGo","fcJOyCxVEf","5ZaEzhe9IA","F6PT25ZaEz","0h1b1618Di","zqH0W8U2nU","FnPFB14FLR","hi5X7FFDui","djsrvXyPZN",
+"MmKGJ16lHc","MmKGJtvdkD","oVQp6RzaZA","SbRYyF6PT2","taOXKsx5Gl","29QAzCp3mZ","2ZHdk5ZaEz","Chuy3yluBx","M6qcGhSSvQ","FLsphIBe8k",
+"FxX9qEdBKc","HlUbFsuY4x","QssNCHzZT8","lsQGov8yFN","pmeCdX6Pin","cQOnvMezSW","VerEAsqVrf","4dEz6NOHsz","FFDuifcwDa","Oz8yZNAFuw",
+"nnP8omX2GE","NcICAsqVrf","Oz8yZM6qcG","GrDg7WDVWJ","TCgPpiqv4k","TCgPpaL6AJ","lweGycShY2","Nxx9VaDGtS","0PktIpv0i7","vLsmSThjNn",
+"14FLRZzJHW","yluBxVLTy6","Zv7z0lm0pD","NcICARpBQm","fLNg8yvOMI","KsjRKSs0Zu","nFqik6q6L9","fFDrJ618Di","WPmlxRkQke","Mkgy8NhXdu",
+"WMiS3S77LH","WreyPS77LH","hSSvQ0Wr5y","EoToP48cHL","K20wKFNYIM","JRJQBOUqFM","ciuWz14FLR","NOHsz0h1b1","FVMxo5nmWv","s4786vkCHH",
+"0MR5XRACuj","y94nwFVMxo","x3LDeFnPFB","GSQwj5drc6","ReKEWs7Mxk","S77LH0YAGH","HRxd8TCgPp","jzUqRCp3mZ","Cp3mZfFDrJ","StlDJt98iW",
+"EdBKcKASQ8","8U2nUuPX7G","7fKYUv2eC3","rKDLJK4GS8","4dEz6Dz1R3","xReecl83Ud","F6PT28FmFH","J2mQilj07Q","kB5nPReKEW","yluBxMm8si",
+"VBjhzJIqXi","7Ow5CcQOnv","bgJAzgf8rI","Mm8siVIlwP","0Kyfsdjsrv","B3qemFxX9q","v8yFNlkMUA","fqypyx3LDe","FnPFBFxX9q","hi5X7NOHsz",
+"5drc6oQ87r","KZamH5nmWv","JRJQBoVQp6","0PktI7Ow5C","SbRYyJKWYR","KASQ80YAGH","6q6L9RmDcr","ni2v15IhmG","7X3uyF6PT2","8TxD7EdBKc",
+"RBhp0uupzk","gf8rIcmXIX","48cHLh1zcH","JKWYRBpYhV","fcJOy8RCUA","Dz1R3KsjRK","dpe1v0MR5X","Kr8ysaL6AJ","HlUbFB3qem","5Mg9r7X3uy",
+"2ZHdkVerEA","t98iWGv3Fq","gIYvEfFDrJ","Uvlv4EdBKc","QnJ1SfaHir","SWfouxciqp","tAOsrbrhlQ","45cIHvLsmS","1v5hHWDVWJ","TCgPpGv3Fq",
+"IRh485ZaEz","DLhzM2ZHdk","Ta8f64dEz6","aFFssgf8rI","uN6r3uLtKs","64s8Nrz7Ut","5iGN5AgJHQ","UlU3Mulk41","uQIczQWxoT","FFDuimX2GE",
+"45cIHo8Uyd","TwanolkMUA","AIYUuxXTI4","v2eC3ZhwG1","hi5X78cVD3","tuDySzHF1q","3otm6FnPFB","lweGyWaim6","D6rByYw2oU","fmIK1yToGW",
+"No0Qbv1Hln","vLsmSPOUYS","5nmWvFwEJz","RzaZA9rlg9","Cp3mZ5iGN5","dQ58624ARF","MezSWZzJHW","Chuy3mz8gx","1j5L8azIWp","8RCUAlXFOB",
+"8cVD3gtCA5","hi5X7Q6Lix","FwEJz8cVD3","F6PT2aFFss","Vprf2ZJTXH","LewvM0Kyfs","B3qemy94nw","Ss0ZuTa8f6","MmKGJ9rlg9","zHF1q5VZjS",
+"EOE1ouZPqg","IKxdLs7Mxk","jfREu0YAGH","atef2TCgPp","BbwgAAXpwE","pmeCdEdBKc","ydG8UWMiS3","7hyVvsoy9t","ogLgcyEfy9","M3zXLpv0i7",
+"uoStwkB5nP","Vprf2LDk6f","t59lR9eoRc","ZzJHWI7p2a","YOfrYFxX9q","FnPFBStlDJ","MGlTFJKWYR","aez9ys7Mxk","X6Pin2ZHdk","D6rBy3weIF",
+"Cfgr3BpYhV","suY4xatef2","D6rByS77LH","ZUnqtSmGzv","nFqiktjQxs","qQxHPHfyNQ","Nxx9VhUTw7","WreyPCqqaD","sx5Gl0BmCy","4dEz6PYBf4",
+"TCgPpK4GS8","48cHLUmaEv","K4GS8Mm8si","RkQkeStlDJ","CxVEfNo0Qb","JkzUnQworu","RmDcr7lUXZ","Dz1R3qQxHP","55rfBReKEW","zz4ZUMGlTF",
+"s93MlXyPZN","55rfBuupzk","bgJAz7lUXZ","Yh1hFVerEA","RsQUqpvgjS","wDajXoGu6x","I7p2aQChxs","gIYvEBFkb8","5IhmGYh1hF","JkzUn0PktI",
+"CNHmvDLhzM","POUYSFLsph","5ZaEzFFDui","7lUXZW7cTs","5drc6tlILt","rhl0JMmsIo","RmDcr6AFT0","AIYUusuY4x","CxVEfvOqCE","ciuWzhe9IA",
+"JKWYRwDajX","taOXKtAOsr","tAOsrPb1pa","dQ586prNT6","IRh48FwEJz","LDk6faDGtS","8FmFHRxrsm","5nmWvOHaBz","tuDySRzaZA","FPfSEGv3Fq",
+"jzUqRjiVBP","uPX7G07n1c","aez9yiKqhr","OUqFMUlU3M","zFgtBxXTI4","FVMxobZLvS","AmdQdjzUqR","gIYvEfmIK1","No0QbhUTw7","J2mQiyofH3",
+"7lUXZDG4sT","tuDySDLhzM","8cVD3gf8rI","s47865Namm","QClRLAmdQd","blLA9MaJQs","lsQGoECMvU","uPX7GhE1Ql","MojnPQYxC0","7X3uyGSQwj",
+"jiVBPciuWz","oQ87rn8pJ9","pmeCdDG4sT","XflUquAWyp","xXTI4Uvlv4","KsjRKpWiOs","zmLYDEdBKc","piJSkFwEJz","ZUnqtfFDrJ","YOfrY6AFT0",
+"WMiS307n1c","i3pydlsQGo","brhlQuJScX","64s8N5nmWv","iB08l1LB1L","jtn0Xn8pJ9","W3VFH1v5hH","WPmlxhUTw7","07n1cGXdoH","AkKTk7hyVv",
+"o8UydUmaEv","qQxHPAOgEe","tjQxsuN6r3","29QAzrKDLJ","9eoRcZv7z0","TwanoCK5W7","0KyfsQnJ1S","s47861j5L8","IBe8k55rfB","AmdQdNOHsz",
+"Chuy3BCxeC","U3yw5aL6AJ","lkMUA2ZHdk","0YAGHb29RJ","5VZjSzFgtB","iB08lb29RJ","MaJQsdjsrv","SjskQulk41","ZhwG16q6L9","lViBvtl72W",
+"WmadAAOgEe","hSSvQFxX9q","AXpwEh1zcH","brhlQuAWyp","8FmFHFNYIM","zY1GYgtCA5","nnP8opiJSk","0ao3lSWfou","HlUbFjzUqR","aFFssfaHir",
+"zz4ZUNo0Qb","CxVEfZzJHW","xciqpEoToP","K20wKi3pyd","YjB9tZJTXH","uTacxS2Dfu","i3pyd2TRI7","lXFOBcQOnv","VIlwP1LB1L","pvgjSWaWsv",
+"0h1b1yToGW","fLNg8Qworu","yofH3MmsIo","fcwDaNhXdu","IjTwPogLgc","3weIFxciqp","NOHszZUnqt","WreyP3otm6","l83Udaez9y","4QMc9QWxoT",
+"14FLRjeskS","SbRYyECMvU","i7WMQaFFss","Yf2EcWmadA","Q6hMCa00b5","i3pydZJTXH","OHaBz7ku1p","FPfSEzQt6Q","uLtKsAOgEe","IjTwPyluBx",
+"P6bcgRBhp0","yvOMIXyPZN","RzaZAs4786","nFqikLDk6f","QWxoT0Wr5y","pAhR1zz4ZU","ThjNnx3LDe","VLTy62Yz7E","yEfy9aFFss","Ta8f6he9IA",
+"CIShGnlaBy","0BmCyrhl0J","n1pmOK4GS8","fcwDaMmsIo","fqypyAOgEe","VjCZqWMiS3","suY4xVLTy6","LbRTHqQxHP","l83Uddpe1v","F6PT2aL6AJ",
+"OUqFMWPmlx","hYBCKBFkb8","gIYvEBpYhV","jSjS3Qworu","Ta8f6hE1Ql","ix74rY1mC0","FNYIMNOHsz","DcpWBNcICA","vOqCEatef2","ZuDtDIRh48",
+"QChxsKZamH","s7MxkW7cTs","cmXIXuTacx","HfyNQJKWYR","n8pJ9Oz8yZ","Ul4a1FNYIM","oQ87rSbRYy","OHaBzfLNg8","pv0i7RsQUq","faHirzz4ZU",
+"VNCPdQWxoT","5ZaEz3weIF","Ul4a1zqH0W","HP433DQimp","AOgEe9XyT9","hSSvQRxrsm","gIYvEFcWrW","FhtglIn3NS","CdyBVGSQwj","0PktI580YD",
+"ThjNnFcWrW","uAWyplpF6W","618DiGXdoH","HRxd8jfREu","yluBxni2v1","hUTw7azIWp","2ZHdkYf2Ec","zz4ZUKZamH","5NammM6qcG","Oz8yZYOfrY",
+"WMiS3ZhwG1","I7p2aFcWrW","Fhtglrz7Ut","iqv4k9iGoT","qaofNReKEW","7fKYUCfgr3","LDk6fEdBKc","MezSWhUTw7","P6bcgpmeCd","7fKYUUl4a1",
+"Yw2oUatef2","0KyfsGSQwj","FxX9qgdQsS","JIqXinnP8o","iqv4kvLsmS","Mm8sitl72W","5VZjSpmeCd","hYBCKdpe1v","prNT6prNT6","IBe8kQssNC",
+"RACujiwzGk","4QMc9uupzk","OxWIHe6e4z","KZamHpiJSk","FxX9qb29RJ","mX2GEEdBKc","RBhp02TRI7","CIShGzmLYD","fmIK1gf8rI","MaJQsDz1R3",
+"kZANmi3pyd","dhSuHlweGy","QnJ1SPOUYS","SmGzvFhtgl","5VZjS48cHL","rKDLJEOE1o","yvOMIHP433","IKxdLVIlwP","CK5W7uN6r3","FNYIMtuDyS",
+"zQt6QFcWrW","9rlg9Chuy3","0Wr5yK4GS8","VNCPd0ao3l","VjCZq7fKYU","tlILtuN6r3","1v5hH8RCUA","QClRLgdQsS","lweGyrhl0J","HlUbFStlDJ",
+"LewvMOz8yZ","UlU3MtaOXK","JIqXirKDLJ","ydG8UlCMxy","ydG8U2ZHdk","i7WMQyofH3","O3iyQ5Drn0","IRh485iGN5","sqVrfUlU3M","GXdoHVBjhz",
+"WreyPKr8ys","vOqCE9y4lw","AgJHQ7fKYU","8TxD7Oz8yZ","5drc6AXpwE","2NslmYjB9t","Uvlv4a00b5","hYBCKkZANm","5drc6uvf7A","lj07QNxx9V",
+"ogLgcIjTwP","In3NS5Mg9r","yofH3ru4UG","SmGzvgdQsS","VBjhzK4GS8","yEfy9zmLYD","F6PT21LB1L","BCxeCpWiOs","MK07YDQimp","rz7UtUmaEv",
+"QYxC0SmGzv","iKqhrguMb8","FnPFBAIYUu","8RCUAcQOnv","KsjRKlCMxy","NOHszKsjRK","5VZjSU3yw5","JKWYRlXFOB","cQOnvcL0aE","ReKEW5Namm",
+"FVMxovLsmS","FnPFB8RCUA","KsjRKLbRTH","AmdQd7hyVv","HRxd89rlg9","aL6AJcShY2","QssNCUlU3M","EoToPiwzGk","4dEz6ZhwG1","wDajXFhtgl",
+"gdQsSK4GS8","gdQsSVjCZq","fLNg8v1Hln","nlaByPOUYS","DQimpksJby","UmaEvzqH0W","MezSWdhSuH","Vprf27X3uy","D6rBy5iGN5","48cHLBbwgA",
+"lXFOBMaJQs","atef2hi5X7","YOfrY7X3uy","GrDg79eoRc","lXFOBIn3NS","s4786ReKEW","lCMxy9XyT9","0h1b1fLNg8","4dEz6ReKEW","29QAzlXFOB",
+"2Yz7EIn3NS","14FLRuvf7A","FnPFBO3iyQ","JIqXiPOUYS","MaJQsLewvM","lViBvgf8rI","NAFuwXyPZN","zmLYDCIShG","kZANmLewvM","In3NSblLA9",
+"jSjS3e6e4z","YjB9tReKEW","C2Irc0BmCy","0PktIQChxs","QssNCQClRL","yToGWWaWsv","dpe1v16lHc","VNCPdMaJQs","GWqqXGSQwj","KZamHXflUq",
+"n8pJ9DG4sT","GrDg70PktI","sqVrfKsjRK","FxX9qMmKGJ","RsQUqCxVEf","AOgEeAgJHQ","iqv4kuoStw","Pb1paBFkb8","cL0aEMaJQs","sx5Gl618Di",
+"0h1b10PktI","No0QbB3qem","S77LHgf8rI","m4bxU48cHL","jS1ajtl72W","MK07YVNCPd","hUTw7m4bxU","iKqhrdmoS7","4W0Tl5ZaEz","7Ow5CgjUTu",
+"JIqXifLNg8","RACujv1Hln","HfyNQCfgr3","uLtKscShY2","AgJHQIBe8k","48cHL2ZHdk","VBjhzqaofN","lpF6WCIShG","prNT6jSjS3","IRh48ogLgc",
+"AgJHQZzJHW","Q6hMCdjsrv","n1pmOlH1kt","DcpWBFhtgl","b29RJazIWp","Cp3mZSjskQ","7X3uyCp3mZ","8hJdtoVQp6","lweGyQ6Lix","1v5hHe6e4z",
+"hYBCKNhXdu","sx5GlYf2Ec","K4GS8ogLgc","oVQp6v1Hln","zY1GYFVMxo","t59lRqQxHP","0MR5XpT8wu","AkKTkU3yw5","wiHrZpv0i7","dpe1vHfyNQ",
+"aL6AJfmIK1","M6qcGMezSW","wDajXO3iyQ","fcJOyLbRTH","TwanoSs0Zu","zHF1qiwzGk","iwzGk9GXkX","9eoRcv8yFN","v8yFNzFgtB","hE1QlzY1GY",
+"Q6LixCxVEf","2NslmZhwG1","GSQwj3otm6","BCxeCgdQsS","StlDJ580YD","cQOnvDG4sT","4W0TlD6rBy","0BmCy0Wr5y","jSjS3rKDLJ","Uvlv4wDajX",
+"Pb1paQssNC","KsjRKRBhp0","FVMxoPOUYS","U3yw5Chuy3","dpe1vW3VFH","s7MxkRpBQm","WDVWJDQimp","i3pydLDk6f","GWqqXvOqCE","6AFT0blLA9",
+"ulk4155rfB","5drc6ReKEW","hSSvQQ6hMC","6AFT0d85a9","EdBKc45cIH","iKqhr0Kyfs","cL0aEK20wK","Ul4a1Dz1R3","rz7UtzbIYY","P6bcgSWfou",
+"iB08lFFDui","K20wKGv3Fq","pv0i7Chuy3","OHaBzVjCZq","M3zXLqUJMd","2ZHdkCIShG","tjQxs2hEEU","hSSvQn1pmO","uZPqgix74r","Kr8ysQWxoT",
+"ciuWzjeskS","Q6hMCzQt6Q","ix74rgjUTu","wDajX0Kyfs","lm0pDAXpwE","HzZT87fsYM","MmsIoMGlTF","vkCHHRxrsm","dQ5865drc6","sx5GljiVBP",
+"F6PT2CK5W7","IKxdL9eoRc","hUTw7WreyP","o8UydpiJSk","fLNg8GWqqX","OUqFMprNT6","h1zcHgjUTu","RpBQmDz1R3","RkQkefqypy","POUYS0PktI",
+"ZJTXHlm0pD","SmGzvEoToP","2TRI7FjHXR","TwanoWMiS3","sqVrfyluBx","yToGWQYxC0","lkMUAmX2GE","xXTI4RpBQm","faHirAOgEe","MmsIoB3qem",
+"GXdoHOxWIH","ulk413otm6","618Dit59lR","XyPZNDQimp","Q6hMCyofH3","gIYvECxVEf","Waim6pAhR1","a00b5uoStw","zFgtBWDVWJ","IKxdL9GXkX",
+"wDajXoVQp6","i7WMQ8xEKz","29QAzYf2Ec","EdBKcOz8yZ","16lHckB5nP","9y4lwThjNn","JIqXiK20wK","HfyNQlH1kt","hSSvQ0YAGH","Qworud85a9",
+"9eoRcWmadA","9XyT9sx5Gl","oVQp6n8pJ9","aFFssuAWyp","5NammMezSW","0YAGHuJScX","IjTwPh1zcH","9iGoTzQt6Q","K4GS8hYBCK","QChxslCMxy",
+"aFFss5nmWv","pAhR1RkQke","GrDg7JXljW","ciuWzSWfou","tjQxssqVrf","KASQ8t59lR","F6PT2618Di","SmGzvfaHir","uJScXFhtgl","lpF6WvkCHH",
+"WMiS3aFFss","8xEKzAmdQd","gtCA5hE1Ql","uN6r3Yf2Ec","FVMxoy94nw","vLsmS9XyT9","qUJMd1j5L8","tvdkD0ao3l","QbxXcQYxC0","oQ87rxReec",
+"zz4ZUFhtgl","FxX9qRpBQm","No0Qb4W0Tl","GSQwj16lHc","suY4xiB08l","lj07QM6qcG","hUTw7D6rBy","aez9ynFqik","qUJMdHfyNQ","lXFOBCfgr3",
+"LbRTHuQIcz","Uvlv4rKDLJ","4QMc9brhlQ","iKqhra00b5","iwzGknFqik","ZhwG1jeskS","1LB1Lx3LDe","nFqikQYxC0","HfyNQHP433","uAWypZUnqt",
+"uJScXlj07Q","RACujS77LH","2NslmlweGy","xciqplkMUA","oVQp61LB1L","0YAGHiqv4k","aL6AJ4W0Tl","2NslmlpF6W","8FmFHTXQ0Z","zY1GYzY1GY",
+"CIShGlH1kt","QChxszHF1q","aFFss0Kyfs","BpYhV4dEz6","uPX7Ggf8rI","pAhR1RsQUq","pT8wuy94nw","ThjNnyvOMI","tAOsr8xEKz","Y1mC0K20wK",
+"FnPFBCIShG","7X3uyPb1pa","8FmFHStlDJ","9iGoTRACuj","1v5hHiqv4k","JkzUnFwEJz","O3iyQKASQ8","piJSkBbwgA","uTacxOUYuF","SjskQuZPqg",
+"DLhzMPOUYS","uupzk64s8N","Ss0ZuWaim6","07n1cVLTy6","Q6hMCwiHrZ","uoStwaFFss","55rfBQChxs","zbIYYW7cTs","jeskS7lUXZ","RsQUqCqqaD",
+"48cHLYh1hF","gdQsSuoStw","No0QbpmeCd","Gv3FqW7cTs","0PktIFFDui","8hJdtfmIK1","2TRI7FxX9q","yluBxJIqXi","vLsmStAOsr","brhlQt98iW",
+"VIlwPzHF1q","rKDLJnFqik","yEfy9dpe1v","O3iyQ0MR5X","zbIYYS77LH","iwzGkY1mC0","Cfgr3VerEA","8RCUAWaWsv","CNHmvChuy3","QworuQbxXc",
+"OHaBz9iGoT","lm0pDAkKTk","yEfy97lUXZ","W3VFHRpBQm","8xEKzUvlv4","euZA5Rxrsm","MezSWM3zXL","1v5hHIn3NS","tjQxsnFqik","zY1GYNhXdu",
+"ZuDtDt98iW","pT8wuOUYuF","uTacxoVQp6","AIYUud85a9","RBhp0QYxC0","Chuy3FjHXR","GrDg7yofH3","aFFss5drc6","lH1ktfaHir","WPmlxYOfrY",
+"CqqaDZuDtD","fcJOyjzUqR","8TxD7nnP8o","S2DfuIn3NS","d7vjMX6Pin","prNT6piJSk","guMb8POUYS","mX2GEJ2mQi","wiHrZ14FLR","07n1ckB5nP",
+"JJs5mx3LDe","lweGyjtn0X","IBe8kGrDg7","0KyfsjfREu","ru4UGnlaBy","KASQ8StlDJ","uZPqglH1kt","WMiS348cHL","XflUqJJs5m","uAWypQbxXc",
+"29QAzFFDui","pmeCdCp3mZ","HlUbFY1mC0","9XyT9n8pJ9","he9IAd7vjM","0Wr5yJ2mQi","Mkgy8I7p2a","soy9tciuWz","MaJQsVprf2","Yw2oUd7vjM",
+"QnJ1SRxrsm","0KyfskB5nP","i3pydFxX9q","tvdkDSs0Zu","LewvM14FLR","RBhp0FFDui","WaWsv8TxD7","AXpwE7lUXZ","d7vjMFjHXR","8cVD3Vprf2",
+"CK5W7ogLgc","0BmCyiqv4k","uupzkVNCPd","Dz1R3GrDg7","1j5L8MmsIo","m4bxUHzZT8","CK5W7CIShG","hE1QlQworu","rz7UtbgJAz","nlaBy0h1b1",
+"WDVWJ5Drn0","ReKEWi7WMQ","BGaQYdQ586","pvgjSGXdoH","DcpWBuQIcz","G1RhSZ4I1v","FhtglKr8ys","OUYuFv1Hln","kB5nPChuy3","s7MxkTCgPp",
+"MojnPZzJHW","FLsphoVQp6","7lUXZokgRi","kZANmD6rBy","WreyPpiJSk","JIqXiWreyP","MezSWcShY2","xciqp2Nslm","JKWYRwiHrZ","xXTI455rfB",
+"TXQ0ZS77LH","b29RJciuWz","WMiS3euZA5","S2Dfu0ao3l","uQIczTa8f6","2TRI7S77LH","Y1mC0Nxx9V","7hyVvM6qcG","oGu6xZhwG1","MezSWSmGzv",
+"sqVrfEoToP","LbRTHbZLvS","NhXduCxVEf","L7cGcyEfy9","LewvM2Yz7E","8FmFHcL0aE","t59lRzz4ZU","BpYhV6q6L9","jeskS7ku1p","nlaBy9XyT9",
+"MGlTFQbxXc","blLA9EOE1o","JIqXitlILt","L7cGculk41","FVMxoWDVWJ","vOqCEM6qcG","NAFuwAOgEe","dmoS7SjskQ","HfyNQfcJOy","jfREu55rfB",
+"2DREs0YAGH","EdBKc64s8N","IRh48IKxdL","1LB1LOHaBz","fmIK1FxX9q","v2eC3zY1GY","qQxHP9GXkX","7lUXZlm0pD","pvgjSVjCZq","v1HlnTCgPp",
+"lweGyPOUYS","K20wKRmDcr","bgJAzpiJSk","Oz8yZMmKGJ","uQIczrKDLJ","aez9yW3VFH","CK5W7QChxs","6q6L9MojnP","F6PT2ydG8U","WPmlxlkMUA",
+"29QAzlsQGo","WaWsvDQimp","Cp3mZyEfy9","2DREs5VZjS","NAFuwFjHXR","D6rBy7lUXZ","16lHcjSjS3","7Ow5C64s8N","BbwgA5drc6","Kr8ysCK5W7",
+"fcwDadpe1v","nlaBykZANm","0h1b1L7cGc","iKqhrk85Ae","uAWyp0YAGH","NOHszRmDcr","kZANmuvf7A","yToGWuAWyp","64s8NYjB9t","F6PT2sqVrf",
+"xReec5iGN5","Yh1hFydG8U","tjQxsDLhzM","o8UydzbIYY","M6qcGWmadA","uZPqg8cVD3","7ku1pm4bxU","bgJAz9eoRc","uAWypL7cGc","KZamHAOgEe",
+"MojnPnnP8o","0BmCy55rfB","VerEAUlU3M","7fsYMLDk6f","a00b5MmKGJ","1LB1LSjskQ","IKxdLUlU3M","ydG8Uh1zcH","5Drn0uJScX","4dEz6uJScX",
+"v1HlnyEfy9","rz7Ut14FLR","AOgEe4W0Tl","2Nslmmz8gx","tlILtm4bxU","K4GS8G1RhS","jzUqRru4UG","gIYvE9eoRc","9XyT9uN6r3","zFgtBChuy3",
+"wiHrZ0Kyfs","2ZHdkaFFss","9iGoTjS1aj","CdyBVo8Uyd","NAFuw0ao3l","pv0i7S2Dfu","Waim6mX2GE","QbxXcCqqaD","OUqFMU3yw5","WPmlxWMiS3",
+"tlILtJIqXi","he9IA0h1b1","JRJQBQChxs","QClRLtvdkD","tvdkDQworu","atef2fmIK1","jiVBPHRxd8","rhl0JFjHXR","WMiS3dmoS7","Q6hMCLewvM",
+"VIlwP5Drn0","OxWIHqaofN","VerEAix74r","BCxeCuoStw","Fhtgla00b5","s7Mxks4786","55rfB2Yz7E","tl72WHP433","Ul4a1okgRi","sqVrfPb1pa",
+"FPfSEZJTXH","FLsphMaJQs","nFqikD6rBy","wDajXNAFuw","lpF6WfcwDa","pv0i77lUXZ","0ao3lK4GS8","faHirDLhzM","yluBxZv7z0","2Nslmn8pJ9",
+"WPmlxuLtKs","xciqpuAWyp","pAhR1WmadA","MojnPYf2Ec","piJSkThjNn","0PktIFwEJz","5VZjSuAWyp","J2mQi7ku1p","YOfrYCK5W7","pv0i7zY1GY",
+"In3NSM3zXL","GrDg7Vprf2","8TxD7Q6Lix","IKxdL14FLR","NcICA7hyVv","JRJQBlm0pD","vOqCERACuj","VLTy6VLTy6","NAFuwSbRYy","uoStwmX2GE",
+"5ZaEz2DREs","iKqhr07n1c","kZANmYh1hF","B3qemqQxHP","lCMxyDLhzM","d7vjMbrhlQ","gdQsSqUJMd","d7vjMqQxHP","OxWIHjtn0X","K20wKF6PT2",
+"EOE1ogf8rI","7ku1pCdyBV","yToGW7X3uy","zbIYYni2v1","FGzgp2ZHdk","MmKGJlpF6W","bgJAzB3qem","9y4lw9iGoT","LbRTHGv3Fq","brhlQMmKGJ",
+"5VZjStjQxs","lsQGoLDk6f","uQIczrhl0J","zQt6QoVQp6","lm0pDcShY2","0Kyfs0BmCy","AIYUuyluBx","FwEJzOUqFM","M6qcG7X3uy","xciqpVLTy6",
+"fcwDaDLhzM","dhSuHsuY4x","7X3uyyEfy9","DcpWBaL6AJ","oVQp6SWfou","uN6r3WaWsv","QYxC0FPfSE","48cHLpAhR1","lpF6WzFgtB","AmdQdpAhR1",
+"nnP8oC2Irc","7Ow5C7ku1p","D6rByTa8f6","pT8wu0ao3l","faHir1j5L8","0Wr5ygdQsS","RBhp0Z4I1v","Z4I1vVerEA","HzZT8580YD","n8pJ9GXdoH",
+"lH1ktuPX7G","ix74rzQt6Q","pmeCdNOHsz","GSQwjFxX9q","2ZHdk7fsYM","GSQwjEoToP","2hEEUYjB9t","HRxd8DcpWB","prNT6618Di","t98iWNOHsz",
+"ECMvUzY1GY","FFDuiReKEW","GXdoHThjNn","QbxXc7fsYM","MojnPhYBCK","cL0aEuvf7A","yToGWd85a9","ix74rJkzUn","VNCPdhSSvQ","AgJHQRxrsm",
+"RzaZAuoStw","JJs5mFPfSE","LewvMCK5W7","qUJMdwDajX","zHF1qYh1hF","s4786WMiS3","jtn0X2Nslm","WmadAX6Pin","ZzJHWru4UG","dmoS7tuDyS",
+"soy9tUmaEv","1v5hHfmIK1","kZANmv1Hln","suY4xsoy9t","lweGy7Ow5C","vkCHH2ZHdk","Vprf2BGaQY","pFrrluTacx","Zv7z0tuDyS","SjskQcQOnv",
+"kB5nPU3yw5","tlILtrKDLJ","tl72WqUJMd","mX2GEVBjhz","PYBf4Kr8ys","ru4UGW3VFH","BpYhVIjTwP","b29RJulk41","VerEAVIlwP","8TxD7jzUqR",
+"7X3uyQYxC0","14FLRYOfrY","gIYvETCgPp","RkQkegtCA5","5ZaEzlCMxy","PYBf4lCMxy","h1zcHTwano","FNYIMYw2oU","IRh4829QAz","G1RhSzFgtB",
+"RACujFNYIM","Ss0Zu2DREs","14FLR7fsYM","ZzJHWYw2oU","4QMc9hSSvQ","FxX9qYjB9t","O3iyQn1pmO","qQxHPuN6r3","D6rByv2eC3","8cVD3MGlTF",
+"G1RhScmXIX","jzUqR4W0Tl","W7cTs7hyVv","MmsIoiqv4k","pWiOsfmIK1","ydG8U29QAz","FPfSEJIqXi","RBhp0tl72W","DLhzMvLsmS","MaJQsX6Pin",
+"BbwgAVBjhz","guMb8mX2GE","7fKYUzQt6Q","ogLgc8FmFH","uAWyptaOXK","t59lRmX2GE","s4786vLsmS","CqqaDhUTw7","Uvlv4GSQwj","iqv4kyofH3",
+"GrDg7jzUqR","PYBf4AmdQd","zqH0W45cIH","14FLR2TRI7","DcpWBqQxHP","s47867lUXZ","pWiOsbZLvS","uQIczQChxs","QssNC45cIH","lH1kt0ao3l",
+"ru4UGMm8si","i7WMQPb1pa","lH1ktFLsph","AgJHQ5nmWv","ZzJHWaDGtS","2TRI7PYBf4","fcwDafaHir","pv0i745cIH","MezSW29QAz","HP433B3qem",
+"uTacxYf2Ec","BCxeCoGu6x","gf8rIIRh48","NhXduvLsmS","RBhp0RACuj","Yh1hFQnJ1S","pAhR1gjUTu","JXljWVBjhz","uoStwFGzgp","FNYIMIn3NS",
+"vOqCEiwzGk","AIYUuKsjRK","P6bcgRxrsm","yEfy9ReKEW","AIYUuYOfrY","gjUTutAOsr","s4786Zv7z0","MK07Y9y4lw","AmdQdNxx9V","X6PinoVQp6",
+"aFFss3otm6","uAWypRBhp0","IBe8k0h1b1","suY4xuPX7G","lj07QlsQGo","FGzgpMK07Y","5drc6Uvlv4","ulk41tuDyS","Mkgy8Waim6","CK5W7lweGy",
+"RsQUqhe9IA","jzUqRaL6AJ","lweGyCxVEf","8xEKzpvgjS","kZANml83Ud","VIlwPCp3mZ","0Wr5yJkzUn","LDk6fZuDtD","JKWYRaDGtS","SjskQFjHXR",
+"ZUnqtoQ87r","i3pydfqypy","AgJHQ55rfB","6q6L96AFT0","ogLgclm0pD","Yw2oUcL0aE","VerEAjS1aj","d7vjM0PktI","wiHrZ48cHL","okgRicmXIX",
+"JXljWVIlwP","FVMxoMezSW","No0QbKZamH","Ta8f6OHaBz","Vprf2fmIK1","2hEEUoQ87r","zbIYY3weIF","IjTwP7ku1p","yofH3s7Mxk","YOfrYRpBQm",
+"0YAGHvOqCE","uvf7AtAOsr","AIYUuaez9y","W7cTsXflUq","gf8rI29QAz","o8UydogLgc","lweGyd85a9","WDVWJOUYuF","GSQwj55rfB","aez9yFPfSE",
+"Yf2EcMmsIo","VIlwP14FLR","gf8rIa00b5","tvdkDksJby","Waim6qQxHP","JkzUnni2v1","vkCHH2TRI7","OUqFMBpYhV","prNT6dpe1v","MojnPiKqhr",
+"64s8Nl83Ud","RkQkeogLgc","fFDrJoGu6x","KASQ8ciuWz","DG4sTni2v1","gdQsS7ku1p","Q6LixKr8ys","yToGWzQt6Q","ulk41jfREu","i3pydv2eC3",
+"WaWsvDz1R3","yvOMIP6bcg","No0QbguMb8","fmIK1xReec","dhSuHMmKGJ","CdyBVSbRYy","sx5GlIRh48","tlILtOUYuF","atef2FLsph","CxVEfCIShG",
+"oQ87r7fsYM","VNCPdiwzGk","Oz8yZ7fsYM","9eoRcdjsrv","2DREsJIqXi","CNHmv5ZaEz","8hJdtgdQsS","Mkgy88TxD7","DQimplweGy","7Ow5C45cIH",
+"2NslmciuWz","yToGWPYBf4","aez9y8U2nU","TwanolViBv","KZamHsx5Gl","Q6hMCYf2Ec","0Kyfs45cIH","CxVEfn8pJ9","1LB1Luvf7A","45cIHuAWyp",
+"0KyfsOUYuF","TXQ0ZVBjhz","HzZT8RACuj","Gv3FqOUqFM","QnJ1SX6Pin","DcpWBUvlv4","Dz1R3v2eC3","CNHmveuZA5","ru4UGO3iyQ","Yw2oUa00b5",
+"Nxx9VyToGW","07n1cjiVBP","CIShGuTacx","jzUqRo8Uyd","MojnPRkQke","okgRiguMb8","JRJQBgtCA5","48cHL8TxD7","iwzGkhYBCK","RsQUqtaOXK",
+"gIYvEL7cGc","euZA52DREs","d7vjMmz8gx","vOqCEMK07Y","Oz8yZ9rlg9","vOqCEVBjhz","yvOMISmGzv","hYBCKW3VFH","AgJHQFjHXR","BFkb8AIYUu",
+"FGzgp0PktI","W3VFHhYBCK","0YAGHlpF6W","U3yw5SjskQ","v2eC3MK07Y","pFrrlo8Uyd","B3qem0MR5X","LDk6fFGzgp","U3yw5WmadA","5Mg9rlpF6W",
+"TCgPpeuZA5","BCxeCzHF1q","ZUnqt3otm6","64s8NLbRTH","3weIFYjB9t","0h1b1pmeCd","X6PindhSuH","zmLYD8hJdt","ni2v1sx5Gl","dpe1vdpe1v",
+"5drc6t98iW","ni2v1U3yw5","RsQUqfmIK1","C2IrctvdkD","Oz8yZm4bxU","uQIczJRJQB","DcpWB2hEEU","o8UydSjskQ","Zv7z0gIYvE","HRxd8euZA5",
+"HlUbFpT8wu","cShY2WreyP","7hyVvoQ87r","yEfy94dEz6","9XyT9kB5nP","uZPqgB3qem","BpYhVSWfou","qUJMdqaofN","CNHmvyluBx","yvOMIyEfy9",
+"QbxXc9XyT9","iB08lCK5W7","C2IrclXFOB","tl72WP6bcg","CIShGgtCA5","e6e4z55rfB","FGzgpMojnP","Yf2Ec64s8N","FnPFBTXQ0Z","CxVEfPYBf4",
+"blLA9bgJAz","580YD5IhmG","9GXkXIRh48","zbIYYKZamH","ThjNnaFFss","5NammGrDg7","uQIczKZamH","B3qem0YAGH","M6qcGFNYIM","BGaQYzFgtB",
+"WDVWJECMvU","07n1cJXljW","CqqaDRACuj","FFDuitl72W","cmXIX0YAGH","7X3uydpe1v","8cVD3lj07Q","ulk41UmaEv","MGlTFChuy3","rKDLJJkzUn",
+"0YAGHyEfy9","v1HlnKsjRK","gdQsSVLTy6","ciuWzzHF1q","azIWp2TRI7","24ARFVBjhz","7lUXZMm8si","FcWrWprNT6","zqH0WLDk6f","580YDX6Pin",
+"fFDrJjS1aj","29QAztjQxs","i3pyd45cIH","kZANmcShY2","9iGoTFFDui","x3LDeMezSW","hUTw70PktI","iwzGkkB5nP","hYBCKIjTwP","he9IAuupzk",
+"9y4lwJIqXi","5NammRBhp0","lkMUAQnJ1S","nnP8oHRxd8","sqVrfFcWrW","7fKYUbZLvS","0h1b1NAFuw","uQIcz7ku1p","fqypyjtn0X","RkQkeCIShG",
+"ZhwG1v2eC3","fLNg8brhlQ","y94nwdmoS7","guMb8Qworu","RBhp0AgJHQ","ZuDtD9rlg9","ZUnqtFhtgl","RmDcrpvgjS","0PktIUmaEv","DG4sTzbIYY",
+"FLsph4QMc9","ksJbyBGaQY","dmoS7Ss0Zu","ReKEWAIYUu","sqVrftjQxs","S2DfuyvOMI","NcICAb29RJ","WmadAC2Irc","h1zcHn8pJ9","QbxXcpvgjS",
+"gdQsS2ZHdk","2ZHdk3otm6","MK07Ym4bxU","Nxx9V5VZjS","FcWrWCfgr3","JRJQByofH3","6q6L92Nslm","dpe1vZhwG1","dmoS7Yw2oU","RmDcryEfy9",
+"JRJQBNxx9V","sx5GlazIWp","UmaEvfqypy","i3pydNOHsz","vOqCE55rfB","ksJbyOxWIH","8FmFH4W0Tl","M3zXLQWxoT","k85AeNOHsz","OUYuFv8yFN",
+"uQIczjS1aj","vkCHHd7vjM","Oz8yZjzUqR","iKqhrprNT6","iKqhrzbIYY","DcpWBFFDui","v1Hln7Ow5C","v2eC3Rxrsm","o8UydYf2Ec","RzaZAmX2GE",
+"fLNg8YOfrY","jtn0XciuWz","OHaBzQbxXc","7hyVvFcWrW","HzZT87lUXZ","B3qemLewvM","AgJHQ8RCUA","GXdoHazIWp","HlUbFksJby","8cVD3ZzJHW",
+"oGu6xM6qcG","QChxsIjTwP","gIYvEpWiOs","ydG8UyluBx","BpYhVsqVrf","uLtKsOxWIH","5Drn0ZuDtD","yvOMIx3LDe","M6qcGJ2mQi","7fKYUMojnP",
+"ZzJHWpvgjS","d85a9OUqFM","DQimpStlDJ","FnPFBogLgc","CxVEfReKEW","lm0pD0Kyfs","ECMvUJ2mQi","ydG8UsuY4x","yvOMIv8yFN","QClRLNo0Qb",
+"zmLYD5Namm","Q6hMCYOfrY","RzaZA8RCUA","uLtKsMmKGJ","BFkb8i7WMQ","JkzUnfmIK1","iwzGkkZANm","B3qem7ku1p","lweGyVjCZq","n1pmObrhlQ",
+"ogLgc7ku1p","45cIHpT8wu","n8pJ9kB5nP","RmDcrFnPFB","7X3uyMojnP","gf8rIxciqp","he9IA9rlg9","d7vjMJRJQB","zFgtB4dEz6","lweGyHlUbF",
+"JRJQByToGW","lweGyhSSvQ","djsrvTXQ0Z","hUTw78FmFH","SWfounFqik","sx5Gl8U2nU","FPfSENcICA","0ao3l5iGN5","618DiB3qem","ni2v1cmXIX",
+"cShY2SbRYy","GWqqXNAFuw","Kr8ysyEfy9","NhXdupWiOs","AkKTkuAWyp","blLA90Kyfs","CK5W7QWxoT","WreyPQbxXc","uZPqgMojnP","M3zXLhE1Ql",
+"CK5W7O3iyQ","k85AeIRh48","uTacxpmeCd","he9IAAOgEe","yToGWpAhR1","Yw2oUFPfSE","uZPqgThjNn","hE1QlKsjRK","ZJTXHvkCHH","tlILtdmoS7",
+"dQ586zmLYD","AmdQdMaJQs","xReecuTacx","EOE1o1v5hH","dQ586faHir","JJs5mPYBf4","ciuWzBCxeC","BGaQYMmKGJ","IjTwP1LB1L","P6bcgDQimp",
+"ZhwG15iGN5","NAFuw5VZjS","J2mQi2Nslm","s93MloQ87r","RsQUqS2Dfu","wDajX580YD","a00b5fFDrJ","uvf7AVBjhz","JkzUnuPX7G","BpYhVYOfrY",
+"PYBf407n1c","HlUbFGXdoH","lViBvBGaQY","FFDuiulk41","HzZT88RCUA","CK5W7vkCHH","uvf7AS77LH","zbIYYtuDyS","n1pmOoVQp6","aFFssGrDg7",
+"ulk410BmCy","JXljWa00b5","BbwgABFkb8","fqypymX2GE","24ARFFwEJz","t98iWzY1GY","55rfBGSQwj","x3LDewDajX","y94nwX6Pin","Yh1hFWPmlx",
+"8RCUAPOUYS","UmaEv7Ow5C","KsjRK2TRI7","2TRI7tAOsr","taOXKaL6AJ","ix74rzqH0W","tvdkDDQimp","ECMvUjSjS3","uoStwrz7Ut","2Yz7EzmLYD",
+"No0QbjiVBP","FhtglCNHmv","pAhR1cmXIX","pAhR1WMiS3","6AFT0Yw2oU","h1zcHjS1aj","uPX7GS77LH","EdBKcLbRTH","QnJ1SOUYuF","b29RJPb1pa",
+"rhl0Jn8pJ9","07n1c7fKYU","cQOnvuJScX","pT8wuokgRi","FFDuiQYxC0","suY4xi3pyd","NOHszMmKGJ","0YAGHDLhzM","gIYvEulk41","1v5hHB3qem",
+"pmeCdSmGzv","ZuDtDsuY4x","JKWYR6AFT0","tlILtGrDg7","7ku1p5drc6","lXFOBlsQGo","Ss0Zuulk41","AIYUuuLtKs","F6PT2Zv7z0","14FLRoVQp6",
+"MK07YvkCHH","he9IAY1mC0","Ul4a1WMiS3","2Yz7Es7Mxk","ZUnqtzFgtB","FNYIMKr8ys","FcWrWXflUq","Z4I1vJRJQB","Yf2EcQssNC","0BmCyd7vjM",
+"s93Ml6AFT0","yofH3K20wK","iwzGkIn3NS","RACujM6qcG","CIShGzz4ZU","brhlQ6AFT0","cL0aE8TxD7","XyPZNRpBQm","BCxeClj07Q","JkzUn16lHc",
+"W7cTsNcICA","pAhR1uAWyp","vkCHHQChxs","xReeccQOnv","kB5nPokgRi","5drc6QssNC","CqqaD618Di","oVQp6bZLvS","piJSkMmKGJ","XflUqe6e4z",
+"atef2s93Ml","sx5GlprNT6","7fsYMjeskS","8RCUApv0i7","S2Dfu9y4lw","wiHrZX6Pin","uN6r3kB5nP","okgRi8cVD3","Mkgy84dEz6","1LB1LHRxd8",
+"pv0i7pvgjS","OUYuFStlDJ","FxX9qPb1pa","nlaByulk41","EdBKc8hJdt","HP433v8yFN","zHF1qtl72W","RxrsmXyPZN","QWxoTd7vjM","tl72W0YAGH",
+"FFDuihi5X7","CK5W7bZLvS","jeskSt98iW","1v5hHh1zcH","euZA54QMc9","1v5hHHP433","LDk6fFxX9q","atef25Drn0","OUqFMLbRTH","FFDuiTa8f6",
+"zz4ZUulk41","GrDg7WaWsv","ciuWzDQimp","1j5L8pAhR1","iwzGkG1RhS","M6qcGgf8rI","WPmlxTXQ0Z","HP433pWiOs","5Drn0SmGzv","W7cTs1v5hH",
+"v8yFN0Wr5y","Chuy3atef2","HzZT8POUYS","POUYSZhwG1","guMb8PYBf4","y94nwxXTI4","zQt6QDQimp","gIYvEC2Irc","n1pmO24ARF","CK5W7JkzUn",
+"he9IADz1R3","xXTI4Q6hMC","fLNg8Z4I1v","rhl0JCp3mZ","e6e4zHzZT8","QClRLAIYUu","8RCUAHRxd8","kB5nPnlaBy","n8pJ9blLA9","Yf2EcXflUq",
+"24ARF29QAz","Q6Lixlj07Q","cShY2aFFss","SWfouBpYhV","JIqXifqypy","sx5GlXyPZN","aDGtSuupzk","dmoS7y94nw","fmIK1wiHrZ","7fKYU1j5L8",
+"WreyPNAFuw","lj07QDQimp","RpBQmni2v1","4dEz6zbIYY","uLtKsZuDtD","oVQp6ciuWz","v2eC3QssNC","F6PT2FFDui","RACujtlILt","pAhR1AOgEe",
+"yvOMIRBhp0","iqv4kzY1GY","nlaByyEfy9","jiVBPMkgy8","TwanoMGlTF","L7cGcL7cGc","d7vjMuAWyp","Mkgy8RACuj","P6bcgCdyBV","NOHszlViBv",
+"EOE1osqVrf","CqqaD55rfB","QssNCFFDui","cQOnvpAhR1","Dz1R3pvgjS","cmXIXHlUbF","lkMUACp3mZ","vkCHHpv0i7","9GXkXJKWYR","BFkb8EdBKc",
+"CK5W7KASQ8","t98iWL7cGc","16lHcOxWIH","0ao3lZv7z0","QbxXc4dEz6","suY4xhe9IA","Ta8f65IhmG","I7p2a3otm6","rz7UtlH1kt","faHircmXIX",
+"EoToP1j5L8","s93Mllm0pD","No0QbgtCA5","IRh48lpF6W","2Yz7EMezSW","JXljWQbxXc","FjHXRIRh48","lkMUAlj07Q","3otm6atef2","7lUXZFjHXR",
+"ru4UG7fKYU","x3LDesqVrf","s4786Y1mC0","FVMxozqH0W","Zv7z0okgRi","lweGyblLA9","3otm6jzUqR","e6e4zHP433","DG4sTK20wK","mX2GEYf2Ec",
+"k85AeoGu6x","iwzGk14FLR","pT8wuKsjRK","RsQUqv1Hln","dmoS7KsjRK","GSQwjaez9y","NcICAD6rBy","Ta8f6n1pmO","BFkb8Gv3Fq","ksJbyk85Ae",
+"bgJAz16lHc","Z4I1viKqhr","NAFuwXflUq","IjTwP8U2nU","WaWsvzHF1q","SWfoupFrrl","PYBf4brhlQ","AmdQdDQimp","IBe8k1LB1L","ciuWzNhXdu",
+"AkKTkyToGW","zFgtBtuDyS","S77LH14FLR","OHaBznnP8o","RzaZA5iGN5","EdBKcFLsph","Mm8siAgJHQ","sx5GlQClRL","mX2GEK4GS8","FcWrWNxx9V",
+"lH1ktOz8yZ","AgJHQpv0i7","prNT6RzaZA","b29RJblLA9","rKDLJQChxs","iqv4kd7vjM","Oz8yZZ4I1v","6q6L9bgJAz","WMiS3uAWyp","M6qcGjtn0X",
+"LewvMZ4I1v","taOXKIn3NS","9iGoT4W0Tl","uPX7Gulk41","MK07YZv7z0","piJSkU3yw5","LewvMuoStw","9rlg9FNYIM","580YDWaWsv","ydG8UDG4sT",
+"ZuDtDuQIcz","lkMUAFNYIM","kZANmSs0Zu","X6Pini3pyd","0BmCy45cIH","brhlQRmDcr","In3NS2Yz7E","s7MxkIjTwP","ECMvUlsQGo","48cHL7fsYM",
+"yluBxzHF1q","Waim6zFgtB","cShY2wiHrZ","mz8gxt98iW","K20wKO3iyQ","YOfrY1LB1L","RsQUq9eoRc","24ARF1LB1L","WaWsvtlILt","yluBxciuWz",
+"5ZaEzQYxC0","uQIczuLtKs","8cVD30PktI","M3zXLjzUqR","iqv4ktvdkD","8hJdtkZANm","2TRI7ThjNn","dhSuHfFDrJ","fLNg8LDk6f","5iGN5vOqCE",
+"k85AeOHaBz","6AFT0FnPFB","0YAGHtuDyS","VBjhzuTacx","LDk6fRzaZA","QChxsHP433","he9IA0MR5X","zQt6Q0PktI","hi5X7uPX7G","P6bcg4W0Tl",
+"Q6hMCK4GS8","Pb1paDG4sT","0MR5X2DREs","tvdkDL7cGc","M3zXLmz8gx","uLtKsrz7Ut","JKWYRRACuj","oGu6xzHF1q","Waim63weIF","HP433XyPZN",
+"HfyNQzY1GY","0BmCys93Ml","tjQxsIBe8k","LewvMlweGy","dpe1vJ2mQi","tl72WzmLYD","GrDg7y94nw","uTacx0ao3l","QbxXce6e4z","zY1GYCp3mZ",
+"atef2O3iyQ","CdyBVTa8f6","U3yw5sqVrf","GXdoHOUYuF","prNT6KASQ8","NOHszF6PT2","xXTI4VLTy6","s7MxknFqik","NhXduEOE1o","8cVD3rz7Ut",
+"In3NS0Wr5y","Ta8f6pT8wu","8xEKzKsjRK","uTacxRkQke","e6e4ze6e4z","m4bxUwiHrZ","Gv3Fq2DREs","EOE1oe6e4z","prNT6Vprf2","2Yz7E5Namm",
+"gjUTuJRJQB","8U2nUuN6r3","VLTy6UmaEv","yToGWzY1GY","euZA5ciuWz","AOgEee6e4z","zqH0W4dEz6","LbRTH7lUXZ","soy9tEoToP","BpYhVvOqCE",
+"S77LHMezSW","ZzJHWfLNg8","2NslmHzZT8","MojnPMaJQs","yofH3kB5nP","7Ow5CYh1hF","EoToPiqv4k","4dEz6zHF1q","HRxd8GWqqX","Q6LixnnP8o",
+"dmoS75Mg9r","PYBf4i3pyd","4W0Tl9eoRc","fcJOyuPX7G","FjHXR5IhmG","AIYUuQWxoT","9iGoTfFDrJ","lweGyAkKTk","9GXkXW7cTs","1j5L8Gv3Fq",
+"uvf7ADLhzM","AOgEe7hyVv","FjHXRyofH3","Q6hMCOUqFM","WmadAS2Dfu","HfyNQkB5nP","9eoRcUmaEv","t59lRUl4a1","Vprf2rz7Ut","ulk41mX2GE",
+"QClRLprNT6","0BmCyS2Dfu","lH1ktpvgjS","2Yz7EZ4I1v","ydG8UiB08l","iqv4kCK5W7","7X3uybrhlQ","K20wKfcJOy","aDGtSChuy3","ni2v1RzaZA",
+"MaJQs0ao3l","IBe8kJKWYR","QworuBCxeC","IKxdLy94nw","s93MlP6bcg","MK07YjeskS","S77LHgdQsS","EoToPQWxoT","ReKEWiwzGk","SjskQbZLvS",
+"jSjS324ARF","lpF6WoVQp6","8hJdtkB5nP","U3yw5JIqXi","i7WMQStlDJ","MaJQsDG4sT","O3iyQzz4ZU","1j5L8BGaQY","No0QbMmsIo","HfyNQHRxd8",
+"SmGzv7fKYU","Y1mC0IjTwP","WDVWJiKqhr","bgJAzvLsmS","HfyNQuLtKs","WDVWJzHF1q","guMb8ogLgc","ECMvUOxWIH","v2eC3VBjhz","WMiS3pT8wu",
+"07n1ccQOnv","pmeCdazIWp","yvOMIlkMUA","BbwgAGrDg7","uPX7GBGaQY","580YDuZPqg","yofH3YOfrY","GWqqXgdQsS","45cIHe6e4z","5drc6O3iyQ",
+"qQxHPW7cTs","OUqFMBbwgA","hYBCKrz7Ut","Q6hMCQworu","PYBf4WreyP","QClRLLbRTH","0MR5Xsoy9t","UmaEvBpYhV","zz4ZUiqv4k","VNCPdzQt6Q",
+"s93MliB08l","uN6r3he9IA","TwanoAmdQd","YOfrYCIShG","GXdoHZJTXH","DLhzMtvdkD","nFqiknlaBy","wiHrZwiHrZ","Kr8ysYOfrY","tlILtqaofN",
+"qQxHP618Di","wiHrZKr8ys","Mm8siFxX9q","29QAzHzZT8","guMb8cQOnv","s93MlY1mC0","M6qcGNAFuw","iB08lBbwgA","0PktIjiVBP","7hyVvdhSuH",
+"dQ586P6bcg","RsQUqlsQGo","5VZjSJRJQB","WPmlxciuWz","iB08lDz1R3","2ZHdkhi5X7","5IhmGYw2oU","t59lRW7cTs","d7vjMMezSW","0MR5XCNHmv",
+"fqypypFrrl","jzUqRbgJAz","x3LDepFrrl","x3LDeuTacx","SmGzvMaJQs","FFDuizbIYY","QssNCFLsph","azIWp8FmFH","Nxx9Vaez9y","ksJbymX2GE",
+"rz7UtFNYIM","EoToPcShY2","0BmCyChuy3","0KyfsOUqFM","Ta8f6CK5W7","t98iWW3VFH","RkQkeHP433","RpBQmW7cTs","iqv4kfmIK1","azIWpwiHrZ",
+"s93Ml8xEKz","0MR5XVprf2","2ZHdkBpYhV","b29RJ8xEKz","gdQsSrz7Ut","Yh1hFIBe8k","M3zXL8RCUA","tuDyStl72W","16lHcsoy9t","55rfBUmaEv",
+"IRh48Yh1hF","SjskQ6AFT0","qaofN45cIH","DG4sTX6Pin","TCgPppWiOs","uPX7Gjtn0X","NAFuwTa8f6","uJScXdjsrv","gIYvE4QMc9","aFFssBCxeC",
+"e6e4zpAhR1","BbwgAFFDui","FwEJzC2Irc","Q6hMCx3LDe","yvOMIpv0i7","iqv4kzz4ZU","0KyfsaFFss","suY4xWPmlx","8RCUA14FLR","GXdoHcQOnv",
+"o8UydxXTI4","tvdkDCIShG","wDajXtAOsr","h1zcHuZPqg","Z4I1vxciqp","NcICAtaOXK","jeskS16lHc","zqH0WJIqXi","cShY2bZLvS","8U2nUFNYIM",
+"gtCA57lUXZ","n1pmOECMvU","5drc6fqypy","UlU3MnFqik","IRh48aDGtS","ReKEWYjB9t","MmKGJ7Ow5C","KZamH0YAGH","9y4lwcShY2","mX2GERkQke",
+"Kr8ysHRxd8","CIShGy94nw","W3VFHUmaEv","DLhzMEoToP","Yh1hFSs0Zu","he9IAO3iyQ","CdyBVrz7Ut","TwanowiHrZ","29QAzoGu6x","FjHXRZuDtD",
+"MaJQsn1pmO","uLtKslkMUA","FGzgpd85a9","CK5W7NhXdu","0Kyfsiqv4k","0Wr5yl83Ud","S2Dfu6q6L9","jzUqRprNT6","5VZjSCdyBV","QClRLogLgc",
+"S77LH580YD","BbwgAjzUqR","yluBx8FmFH","0KyfsCIShG","MmKGJkZANm","JKWYRjeskS","8RCUA7lUXZ","ZhwG18cVD3","uTacxsuY4x","TCgPptjQxs",
+"Yf2EcHP433","QClRLAOgEe","bZLvSpiJSk","faHirL7cGc","FPfSE9iGoT","K4GS8UlU3M","tjQxsC2Irc","GXdoHU3yw5","NcICAqaofN","oGu6xiB08l",
+"BpYhVUl4a1","JkzUni3pyd","1LB1LIKxdL","2DREsfFDrJ","BCxeC8U2nU","OHaBzG1RhS","tjQxslkMUA","nnP8oFNYIM","jiVBP0Wr5y","FGzgpPb1pa",
+"jiVBPNhXdu","M6qcGWPmlx","nlaByZUnqt","HRxd8IKxdL","kZANmlpF6W","dpe1vM6qcG","CIShGKsjRK","Kr8yskB5nP","SmGzvPb1pa","ZUnqt07n1c",
+"4W0TlNcICA","SmGzvZ4I1v","OUqFMnlaBy","MGlTFtAOsr","pv0i7cL0aE","hYBCKStlDJ","uoStwcShY2","FPfSELbRTH","6q6L9DQimp","64s8N6AFT0",
+"ZhwG1FGzgp","3weIFIn3NS","Oz8yZazIWp","qQxHPUmaEv","5NammuZPqg","FcWrW29QAz","7fKYUuQIcz","s4786ciuWz","SjskQSjskQ","prNT68hJdt",
+"oVQp6bgJAz","8TxD7RsQUq","t59lRdmoS7","JJs5mDLhzM","Waim6FFDui","In3NSQ6Lix","FFDuiZJTXH","9eoRc0Wr5y","cmXIXuoStw","GXdoHlsQGo",
+"FwEJzM6qcG","jeskS5IhmG","0PktIcQOnv","1LB1LlweGy","Qworu1j5L8","pvgjSWaim6","cShY2hi5X7","ECMvU6AFT0","8FmFHmX2GE","BGaQYGv3Fq",
+"jzUqRJ2mQi","8TxD79iGoT","618Di48cHL","RzaZAgIYvE","rKDLJhUTw7","0h1b15VZjS","v2eC3iKqhr","Yf2Ecs7Mxk","6q6L9tjQxs","cmXIXPb1pa",
+"pvgjSQClRL","1LB1L1v5hH","zbIYYdmoS7","9eoRcjiVBP","6AFT0CxVEf","9XyT9MmKGJ","No0QbCxVEf","GrDg7uupzk","RpBQmix74r","Oz8yZ0PktI",
+"d7vjMvkCHH","YOfrYQnJ1S","rKDLJzqH0W","uZPqgQnJ1S","soy9tPb1pa","jS1aje6e4z","JIqXiHfyNQ","pvgjSyvOMI","CxVEfOUYuF","UmaEvBFkb8",
+"LbRTHMK07Y","t98iWxReec","nnP8ojfREu","8RCUAtaOXK","qUJMdlH1kt","RACujJIqXi","uvf7AJKWYR","gIYvEZ4I1v","s7Mxkb29RJ","K4GS8pT8wu",
+"t98iW29QAz","Yf2EclweGy","S77LHVIlwP","I7p2ai7WMQ","atef2J2mQi","1j5L88FmFH","BpYhVuQIcz","Vprf29y4lw","l83UdvkCHH","L7cGc9y4lw",
+"WaWsvBCxeC","BpYhVksJby","XyPZN9rlg9","ZUnqtnlaBy","8TxD7v8yFN","MmsIoZhwG1","CK5W7EdBKc","SbRYyBFkb8","AkKTkZUnqt","kZANmQbxXc",
+"uN6r3dpe1v","nlaByTXQ0Z","7ku1pVNCPd","Z4I1vMmKGJ","CqqaDJkzUn","gtCA5BpYhV","uupzkm4bxU","DQimppFrrl","RACujCK5W7","gjUTuB3qem",
+"IKxdLyofH3","suY4xHRxd8","LDk6fQWxoT","uN6r3Y1mC0","3otm6RpBQm","gtCA53otm6","jfREuP6bcg","Mm8siSWfou","45cIHQ6hMC","IBe8kM6qcG",
+"DG4sT2ZHdk","8U2nUv2eC3","AIYUuReKEW","pAhR1HzZT8","uZPqgsx5Gl","MaJQsEoToP","DG4sTAXpwE","h1zcH1v5hH","0h1b1ZuDtD","HP433KZamH",
+"ZJTXHEdBKc","nnP8oUvlv4","3weIFuQIcz","kB5nPQYxC0","bgJAzDLhzM","xReec5Namm","Gv3FqVerEA","uoStwU3yw5","Cfgr31LB1L","sqVrfYh1hF",
+"1LB1L8xEKz","Nxx9V9GXkX","vOqCEXflUq","EOE1oWreyP","TCgPpGWqqX","2Yz7Eh1zcH","VerEAh1zcH","ksJbyfcJOy","h1zcHgtCA5","CdyBVokgRi",
+"tjQxsRkQke","POUYS7Ow5C","a00b5Cfgr3","9eoRcOz8yZ","GSQwjMmKGJ","8cVD3qaofN","QworujzUqR","7ku1ppmeCd","Nxx9VWaim6","6q6L9ZzJHW",
+"aDGtS5Mg9r","I7p2aWreyP","bZLvSStlDJ","aL6AJ9XyT9","7lUXZuN6r3","2NslmPYBf4","PYBf4oVQp6","580YDMojnP","8FmFHzmLYD","a00b5DcpWB",
+"AkKTkuZPqg","t98iWhYBCK","pFrrl5Namm","GWqqXbrhlQ","7Ow5CVerEA","AXpwE2TRI7","FjHXR07n1c","StlDJ9GXkX","6AFT0tlILt","D6rByuJScX",
+"jS1ajMmsIo","YjB9taFFss","BGaQYvLsmS","Yw2oUZ4I1v","7fKYU48cHL","zmLYDi7WMQ","FnPFBOxWIH","lj07QJXljW","QbxXccmXIX","d7vjMAIYUu",
+"uQIczZUnqt","Z4I1voQ87r","v2eC3RzaZA","NcICAtuDyS","tuDySZUnqt","LewvMaDGtS","8TxD7Z4I1v","MK07YlpF6W","zqH0WhSSvQ","faHirPOUYS",
+"7lUXZMojnP","LbRTH0h1b1","pAhR1RmDcr","OxWIHGXdoH","DLhzMTwano","FcWrWOUYuF","okgRiS77LH","3weIFMkgy8","tjQxs45cIH","iB08lWPmlx",
+"Vprf2NAFuw","lCMxy5drc6","x3LDeLbRTH","MezSWKsjRK","HRxd8iqv4k","8xEKzLbRTH","suY4xoQ87r","Gv3FqS2Dfu","zQt6QWMiS3","he9IAdpe1v",
+"KsjRKuupzk","RxrsmdmoS7","BFkb8MaJQs","8hJdt2ZHdk","Oz8yZlm0pD","fcJOypT8wu","iqv4khYBCK","sqVrf2Nslm","9GXkXQworu","24ARF5iGN5",
+"Yh1hFcL0aE","CNHmvh1zcH","CIShG4W0Tl","AIYUuO3iyQ","fcJOybrhlQ","qaofNyToGW","RzaZA6q6L9","CqqaDpiJSk","CNHmvRpBQm","RsQUqOUqFM",
+"0PktIFnPFB","HlUbF2ZHdk","OUqFMpWiOs","NhXdu8RCUA","euZA5MojnP","Pb1pa5Namm","QYxC0S2Dfu","kB5nPyluBx","16lHczQt6Q","fFDrJzqH0W",
+"l83UdEOE1o","RsQUqHP433","DQimpJIqXi","RxrsmzmLYD","CqqaDIBe8k","TXQ0Z5nmWv","FLsphRpBQm","580YDjzUqR","0MR5XkZANm","MmKGJYf2Ec",
+"uoStwQChxs","9iGoTCp3mZ","cL0aEL7cGc","5Drn0bZLvS","LewvMCxVEf","Chuy3F6PT2","uN6r3tvdkD","F6PT27fKYU","2ZHdkNcICA","xciqpU3yw5",
+"gf8rIIn3NS","55rfB5iGN5","jiVBP16lHc","O3iyQKr8ys","3weIFfLNg8","9y4lwMm8si","s7Mxkhe9IA","gf8rIMojnP","WaWsv5Mg9r","qaofNDG4sT",
+"W3VFHIKxdL","D6rByv1Hln","FcWrWgtCA5","5ZaEzDQimp","hUTw7OHaBz","NOHszlH1kt","5VZjSIKxdL","n8pJ9FLsph","JIqXidjsrv","fcJOyD6rBy",
+"fmIK1Mm8si","8FmFHhUTw7","iKqhrJJs5m","Ta8f6cShY2","tjQxsW7cTs","8xEKzfcJOy","No0QbuN6r3","bZLvSI7p2a","GWqqXSWfou","taOXKZ4I1v",
+"5ZaEzuZPqg","CK5W7s93Ml","WMiS3No0Qb","tlILtCfgr3","MmKGJQChxs","lH1kt7X3uy","FnPFB2ZHdk","MojnPpWiOs","PYBf4zQt6Q","M3zXLWaim6",
+"WreyPQClRL","lkMUAfmIK1","64s8NWaWsv","Z4I1vvkCHH","5IhmGuupzk","LDk6fUlU3M","zbIYY9GXkX","ulk41KZamH","YjB9tZ4I1v","piJSkiwzGk",
+"0BmCyWMiS3","5nmWvcmXIX","7fKYUMaJQs","7ku1pThjNn","lpF6W1j5L8","yvOMIXflUq","Cp3mZFwEJz","s4786Ss0Zu","2hEEUTwano","24ARFJ2mQi",
+"HlUbFOUYuF","M6qcGsx5Gl","nFqiki3pyd","fqypy618Di","Chuy3lXFOB","cShY2580YD","yEfy9s4786","3otm6xciqp","AmdQdWreyP","ZJTXH1LB1L",
+"DG4sTaL6AJ","S2DfuQworu","7Ow5CUmaEv","t59lRydG8U","FGzgpB3qem","IKxdLCxVEf","fqypyh1zcH","BbwgAU3yw5","ZUnqtVIlwP","ulk41gtCA5",
+"uQIczNhXdu","XyPZNFjHXR","oQ87roVQp6","DQimpi3pyd","blLA98FmFH","3otm6AmdQd","JJs5mlj07Q","CdyBVCdyBV","9eoRcblLA9","FVMxoGXdoH",
+"ZuDtDiKqhr","Chuy3AIYUu","Oz8yZJIqXi","07n1cn1pmO","S2DfuuQIcz","QssNCv1Hln","pmeCdQChxs","fcJOyaFFss","Ta8f6Chuy3","4W0TlaFFss",
+"SbRYyv8yFN","zmLYDh1zcH","n8pJ9fFDrJ","rhl0JP6bcg","0Wr5yjzUqR","pAhR1euZA5","cShY2zbIYY","mz8gx0YAGH","o8Uyd0MR5X","Yf2Eck85Ae",
+"9XyT9xciqp","Cp3mZy94nw","K20wKM6qcG","pT8wutjQxs","m4bxU45cIH","v1HlnBbwgA","Mkgy80BmCy","v2eC3o8Uyd","RmDcrFxX9q","xciqp7hyVv",
+"i3pydW3VFH","WreyP29QAz","MmKGJPYBf4","zz4ZUCxVEf","StlDJRmDcr","zFgtBYh1hF","FFDuiCfgr3","FVMxoQworu","OUqFMiwzGk","3otm6JXljW",
+"suY4xZuDtD","y94nwgdQsS","IRh485drc6","dmoS7QYxC0","vkCHHuoStw","KZamHNOHsz","IKxdL8xEKz","I7p2aGXdoH","KZamHIn3NS","QChxslH1kt",
+"KZamHJJs5m","16lHcMK07Y","y94nwJkzUn","F6PT2W3VFH","he9IAfqypy","uN6r3cQOnv","FcWrWjzUqR","CdyBVi7WMQ","jiVBPvkCHH","5NammuPX7G",
+"6q6L9Fhtgl","JIqXiuLtKs","d85a9b29RJ","1j5L8S2Dfu","jtn0XM6qcG","QChxsMmsIo","uZPqgs4786","LbRTHm4bxU","BpYhVzY1GY","KASQ8wDajX",
+"5ZaEzazIWp","uupzkx3LDe","xciqpBpYhV","AkKTkPYBf4","uJScX3otm6","8xEKzFPfSE","pT8wu8cVD3","WmadASWfou","brhlQ5VZjS","4dEz6tl72W",
+"QClRLCNHmv","qQxHPjeskS","Cp3mZ48cHL","AXpwEiwzGk","LDk6fSjskQ","FGzgp5drc6","NAFuw2Yz7E","lm0pDZv7z0","pv0i7d85a9","Ta8f6lm0pD",
+"DG4sThYBCK","O3iyQ1j5L8","5Namm55rfB","TCgPp8RCUA","WreyPtlILt","xciqp5ZaEz","AgJHQh1zcH","UmaEv7X3uy","t98iW45cIH","4dEz6UlU3M",
+"zY1GYhi5X7","gtCA5UmaEv","nlaByZuDtD","lsQGok85Ae","kB5nP3otm6","GXdoHcL0aE","Vprf2WaWsv","AkKTkKr8ys","PYBf4kB5nP","ru4UGNAFuw",
+"AIYUuzmLYD","jSjS3DLhzM","xciqpReKEW","TXQ0ZFcWrW","ZuDtDOxWIH","lCMxy8FmFH","dmoS7No0Qb","J2mQi7Ow5C","iKqhrbgJAz","zqH0WTCgPp",
+"kB5nPhYBCK","Cfgr3Pb1pa","e6e4zC2Irc","Waim6BFkb8","n8pJ9faHir","he9IAHfyNQ","SWfouFxX9q","2Yz7EB3qem","tvdkDxciqp","WDVWJuZPqg",
+"Rxrsmt98iW","FxX9qiwzGk","8hJdthE1Ql","Twanouupzk","Cfgr3t98iW","8hJdtpWiOs","HfyNQIBe8k","FVMxo07n1c","suY4xlCMxy","W3VFHAgJHQ",
+"jeskSxXTI4","fcJOyiKqhr","SbRYyHRxd8","2hEEUQbxXc","ogLgcYOfrY","euZA5QnJ1S","xciqpblLA9","LbRTHYjB9t","dmoS7gdQsS","LbRTHcL0aE",
+"S2DfubrhlQ","Chuy36q6L9","pT8wuBbwgA","KZamH8xEKz","2DREsulk41","aFFss8xEKz","s4786CNHmv","vkCHHcL0aE","EoToPLbRTH","ix74rIRh48",
+"S2DfulweGy","guMb89rlg9","n1pmOHRxd8","2ZHdkQbxXc","WmadAOxWIH","64s8NlXFOB","S2DfuChuy3","2NslmtaOXK","aFFss5Namm","h1zcHy94nw",
+"FGzgpWDVWJ","dQ586jzUqR","tjQxsVerEA","FnPFBgIYvE","qaofN24ARF","lCMxyNo0Qb","MGlTFb29RJ","n8pJ99XyT9","FGzgpbgJAz","pWiOsnnP8o",
+"CdyBV0h1b1","pmeCdAmdQd","IBe8kZJTXH","5ZaEzRzaZA","0YAGHfFDrJ","RBhp0s7Mxk","qUJMdo8Uyd","5nmWvksJby","6q6L9x3LDe","fmIK1pvgjS",
+"hSSvQi7WMQ","fmIK1IKxdL","lXFOBkZANm","Z4I1v9iGoT","cL0aEaDGtS","HP433VLTy6","iKqhraFFss","Ss0ZupiJSk","tAOsrReKEW","sqVrfMK07Y",
+"KsjRK2hEEU","zz4ZUlH1kt","iB08liKqhr","No0QbhE1Ql","n8pJ9ru4UG","7Ow5CoQ87r","dpe1vPOUYS","k85AebrhlQ","fFDrJBpYhV","sqVrflH1kt",
+"lsQGoK4GS8","vLsmSECMvU","MezSWQworu","zmLYDKr8ys","LbRTHksJby","RmDcrWPmlx","0YAGHkB5nP","d7vjMGSQwj","FNYIMRBhp0","RxrsmQ6Lix",
+"MmsIoSbRYy","tl72WSmGzv","rz7UtD6rBy","MaJQs24ARF","0Wr5yogLgc","SjskQ0Kyfs","No0QbTwano","Mm8siCK5W7","0MR5XJ2mQi","4dEz65drc6",
+"iqv4kjS1aj","0h1b1ReKEW","X6PinnFqik","n1pmOZuDtD","l83UdFwEJz","RzaZA55rfB","OxWIHBFkb8","lweGyfLNg8","YOfrYlm0pD","J2mQihUTw7",
+"Oz8yZyToGW","uN6r3L7cGc","5VZjS0Kyfs","FxX9qNOHsz","FPfSE7hyVv","No0Qb3otm6","ksJbymz8gx","yToGWuLtKs","5Drn0F6PT2","2ZHdkFxX9q",
+"mX2GEAmdQd","2Yz7EFwEJz","Cfgr3UlU3M","k85AeZzJHW","HlUbFn1pmO","BpYhVn1pmO","0MR5XtaOXK","QWxoT6q6L9","faHiryEfy9","blLA9CdyBV",
+"8xEKzMezSW","0MR5XFGzgp","Q6hMClViBv","tl72WU3yw5","MGlTFVerEA","0PktIIBe8k","Cfgr3W7cTs","45cIHiKqhr","pvgjSatef2","16lHcDG4sT",
+"xciqpqQxHP","BFkb8blLA9","DcpWByEfy9","pFrrluPX7G","x3LDeU3yw5","29QAzjSjS3","lpF6WMmKGJ","VNCPdSmGzv","8RCUA2DREs","DcpWBRpBQm",
+"5ZaEzXyPZN","ksJbygtCA5","xXTI4prNT6","JKWYRZzJHW","6AFT0WaWsv","OUYuFe6e4z","QssNCIBe8k","Ta8f6n8pJ9","J2mQiJKWYR","GSQwjs7Mxk",
+"KASQ8MojnP","s7MxkeuZA5","RsQUqjfREu","4W0Tl1LB1L","Qworu5Drn0","L7cGcnnP8o","YOfrYx3LDe","BFkb8s93Ml","m4bxUnnP8o","cShY2kZANm",
+"lpF6WEOE1o","lj07QOz8yZ","ReKEWt59lR","JXljWgdQsS","zFgtByvOMI","9rlg9UlU3M","v2eC3Mkgy8","CdyBVMGlTF","Zv7z0AOgEe","iwzGkgIYvE",
+"RACujaL6AJ","OxWIHOz8yZ","NOHszWmadA","iB08lgf8rI","pmeCdlViBv","CNHmvlkMUA","s93MlWPmlx","yofH3NhXdu","vLsmSZzJHW","x3LDerKDLJ",
+"fLNg8mz8gx","i7WMQlXFOB","rKDLJSjskQ","Dz1R3jzUqR","AkKTkIBe8k","fcwDavkCHH","5NammbgJAz","euZA5i3pyd","s7MxkhE1Ql","MojnPZuDtD",
+"YjB9tpv0i7","fcwDafqypy","azIWp6q6L9","pAhR1tvdkD","WaWsvRxrsm","RxrsmMGlTF","gjUTupAhR1","prNT6ZzJHW","Mkgy8aez9y","NcICAKZamH",
+"YjB9tC2Irc","VBjhzRsQUq","uPX7GKASQ8","pT8wuYf2Ec","AkKTkJkzUn","fFDrJjiVBP","HRxd8cL0aE","a00b5FFDui","cShY2h1zcH","xXTI47hyVv",
+"VLTy6QClRL","brhlQblLA9","s4786KASQ8","PYBf4zmLYD","5Namm0ao3l","iKqhrcmXIX","m4bxUblLA9","y94nw8hJdt","guMb8oQ87r","3weIFqaofN",
+"kB5nPY1mC0","cL0aEn1pmO","9GXkXAmdQd","hE1Ql3weIF","hUTw75VZjS","o8UydTa8f6","hUTw7he9IA","Q6hMCguMb8","2TRI7QnJ1S","8TxD7ydG8U",
+"zqH0W9y4lw","Z4I1vRkQke","MaJQs9iGoT","S2DfuwDajX","Nxx9Vv2eC3","Cp3mZI7p2a","atef20YAGH","gIYvE5Namm","8FmFH580YD","tjQxsK4GS8",
+"dQ586v2eC3","cL0aEy94nw","wiHrZOxWIH","OUYuFfaHir","rhl0JuQIcz","IKxdLK20wK","1v5hH2ZHdk","i3pydY1mC0","HzZT8JJs5m","S2Dfuv8yFN",
+"48cHLQYxC0","xXTI4zz4ZU","5ZaEzi3pyd","Y1mC02TRI7","C2IrcJKWYR","bZLvSzQt6Q","Yh1hFWaWsv","WmadAAXpwE","v8yFNM3zXL","5iGN5oGu6x",
+"WreyPIKxdL","azIWpChuy3","WaWsv24ARF","t59lRatef2","FwEJzguMb8","NOHszBGaQY","8hJdtXflUq","FVMxoYOfrY","D6rByuN6r3","ksJbydjsrv",
+"mX2GEBCxeC","jS1ajsx5Gl","jeskSjfREu","DcpWB4W0Tl","zFgtB9eoRc","EdBKcnnP8o","tvdkDqaofN","Q6hMCBbwgA","hSSvQMGlTF","mX2GEGXdoH",
+"L7cGca00b5","VBjhzpWiOs","RACujYOfrY","nFqike6e4z","lViBv2ZHdk","ZuDtDFLsph","atef2MmKGJ","8U2nUAOgEe","IRh48fcwDa","s93MlHfyNQ",
+"lH1ktcmXIX","2Yz7E6q6L9","jzUqR48cHL","s7Mxk0PktI","RzaZAPYBf4","rhl0JjiVBP","U3yw5jzUqR","X6PinMmKGJ","1v5hHulk41","Mkgy88U2nU",
+"dpe1vD6rBy","ciuWzqUJMd","VerEAlkMUA","guMb8580YD","jtn0XqUJMd","Chuy35ZaEz","fcJOyazIWp","uJScXS2Dfu","L7cGc2Nslm","jSjS3uJScX",
+"TCgPpLbRTH","sqVrfZhwG1","zmLYDjSjS3","GrDg7v8yFN","Ul4a1o8Uyd","Nxx9VRACuj","gIYvE7X3uy","s93MlYw2oU","7fKYUx3LDe","qaofNnlaBy",
+"IjTwPk85Ae","FxX9qZ4I1v","0PktIaL6AJ","SbRYyKASQ8","JXljWguMb8","WPmlxMmKGJ","ZUnqtRmDcr","FNYIMyofH3","hE1QlnnP8o","ZJTXHxXTI4",
+"In3NS64s8N","ru4UGYh1hF","NOHszuAWyp","lkMUAXflUq","uoStwsx5Gl","45cIHl83Ud","uLtKss7Mxk","L7cGcfFDrJ","Kr8ysqUJMd","EoToPd85a9",
+"580YDVBjhz","EoToPMezSW","29QAz6q6L9","QWxoTeuZA5","v8yFNzY1GY","tlILtjzUqR","dpe1vfaHir","uN6r3QssNC","HlUbFvOqCE","QClRLFPfSE",
+"FFDuiVIlwP","HRxd8IRh48","lXFOBOxWIH","uupzkcmXIX","Uvlv4tl72W","guMb8C2Irc","4W0Tlk85Ae","e6e4zxciqp","Yw2oUKr8ys","gIYvE7Ow5C",
+"guMb8WMiS3","pAhR1pT8wu","3otm6fLNg8","TCgPpHzZT8","sqVrfPOUYS","lXFOBsx5Gl","FxX9q5Drn0","RpBQmgjUTu","EoToPTXQ0Z","aez9y48cHL",
+"RmDcrdpe1v","B3qemaL6AJ","pmeCdWaim6","nlaByuvf7A","7fsYMblLA9","XflUqYw2oU","lCMxyZv7z0","7fKYUgf8rI","lViBvkZANm","fqypy64s8N",
+"3otm6MezSW","ru4UGdjsrv","07n1cNo0Qb","Z4I1vM6qcG","OUYuFx3LDe","C2IrcX6Pin","P6bcgECMvU","ReKEWOUqFM","bgJAz580YD","7fKYUFFDui",
+"UmaEvY1mC0","Y1mC0he9IA","Qworurhl0J","IjTwPNcICA","azIWpMmKGJ","k85AeyluBx","KASQ85IhmG","U3yw5dmoS7","ix74rtlILt","4QMc9JKWYR",
+"RkQkedmoS7","MaJQsiwzGk","FnPFBhUTw7","MojnPwDajX","gdQsSBGaQY","Uvlv4JIqXi","Q6LixFnPFB","0h1b11v5hH","HP43345cIH","kZANm8RCUA",
+"fmIK1Waim6","PYBf4vkCHH","HRxd8sqVrf","he9IAguMb8","Gv3FquTacx","Waim6MezSW","EdBKciB08l","MmKGJCxVEf","ECMvUpAhR1","pFrrlIn3NS",
+"zHF1qMmsIo","zHF1qAIYUu","16lHcuJScX","L7cGcPYBf4","RmDcrwDajX","5ZaEznlaBy","NhXduYh1hF","CK5W7WPmlx","KASQ8Yh1hF","FnPFBReKEW",
+"WDVWJfmIK1","4dEz6ulk41","piJSktlILt","CIShGd85a9","No0Qb0YAGH","gdQsSM6qcG","taOXKGXdoH","FjHXRNhXdu","Ss0Zud85a9","jzUqRi3pyd",
+"8hJdtKsjRK","QYxC0GSQwj","aL6AJhe9IA","2hEEUCIShG","Q6hMCRpBQm","KsjRKnnP8o","YOfrYvLsmS","uLtKs0ao3l","LewvMVjCZq","5iGN5XyPZN",
+"soy9t7Ow5C","he9IAFNYIM","QssNCRmDcr","QssNCWreyP","v8yFNIBe8k","i7WMQuTacx","FhtglW7cTs","ydG8UAOgEe","S77LH2Nslm","7fKYUsuY4x",
+"D6rByAkKTk","jeskS8RCUA","v1Hln0BmCy","uJScXOxWIH","OxWIH5VZjS","MmKGJTa8f6","HlUbF9eoRc","KASQ8Ss0Zu","7Ow5Clj07Q","brhlQyEfy9",
+"qaofNuvf7A","HzZT8d7vjM","tlILtgdQsS","FGzgpVIlwP","MGlTFix74r","m4bxUjeskS","m4bxUWaim6","pv0i7zz4ZU","SjskQzHF1q","WreyPlsQGo",
+"MezSW0h1b1","14FLRQworu","C2IrcQChxs","nFqikm4bxU","IKxdLFFDui","HP4335VZjS","C2IrclViBv","Cp3mZ9XyT9","hE1QlCIShG","VNCPdlsQGo",
+"1LB1LxReec","8xEKzRpBQm","580YDJIqXi","Waim6EOE1o","qUJMdi7WMQ","RkQkeDQimp","Uvlv4EOE1o","GrDg7EOE1o","piJSkGv3Fq","Cp3mZKr8ys",
+"Cfgr3tjQxs","yToGWKASQ8","TXQ0ZCIShG","W3VFHBCxeC","BpYhV8FmFH","Cp3mZtlILt","Mkgy8G1RhS","NOHszMaJQs","2TRI7VerEA","6q6L97ku1p",
+"yofH3Vprf2","WMiS3SmGzv","2DREsVNCPd","zz4ZUWaWsv","VBjhzSbRYy","hSSvQksJby","uN6r3uTacx","1j5L8LewvM","Rxrsm9XyT9","QWxoTTa8f6",
+"BGaQYfcwDa","lm0pD55rfB","RxrsmCp3mZ","zmLYD580YD","Uvlv4BCxeC","LbRTHe6e4z","8U2nUzz4ZU","5ZaEz45cIH","9rlg92DREs","CdyBV0Kyfs",
+"Ul4a1oQ87r","RzaZAVjCZq","MojnPGXdoH","e6e4z8hJdt","No0QbJKWYR","2NslmNAFuw","rKDLJn1pmO","EoToPGXdoH","s7Mxk16lHc","a00b5lkMUA",
+"StlDJfcJOy","5ZaEzo8Uyd","zz4ZUSbRYy","IjTwPWmadA","o8UydOUYuF","ydG8U5VZjS","4QMc98TxD7","QClRL7lUXZ","RzaZAdjsrv","KsjRK0MR5X",
+"NAFuw8xEKz","QYxC0pv0i7","X6PinWaim6","kB5nPn8pJ9","POUYSOHaBz","zFgtBCxVEf","IjTwPaDGtS","IRh48Cp3mZ","jzUqRLDk6f","ogLgcFFDui",
+"2DREssuY4x","FPfSElj07Q","lCMxy7X3uy","Z4I1vnFqik","2DREsuPX7G","NhXdutlILt","suY4x7fKYU","MGlTF16lHc","1v5hHMezSW","iKqhrCK5W7",
+"0Wr5yJJs5m","LewvMYf2Ec","GWqqXEOE1o","Uvlv4lsQGo","VBjhzhUTw7","Kr8ysCNHmv","8cVD3mX2GE","YOfrYuoStw","sqVrfi7WMQ","lXFOBuJScX",
+"FPfSECp3mZ","QWxoTs4786","8hJdtgIYvE","7hyVvk85Ae","7hyVv3weIF","iB08lgIYvE","BbwgAt98iW","nlaByTa8f6","QbxXc2DREs","S2DfuXflUq",
+"9y4lwCdyBV","GXdoHM6qcG","Yf2EcG1RhS","m4bxU580YD","0ao3lHP433","v8yFNVBjhz","FxX9q7fsYM","pmeCdtvdkD","7fKYU2ZHdk","lj07QcmXIX",
+"2TRI75drc6","zqH0WMojnP","n8pJ9K4GS8","h1zcHAkKTk","HRxd88FmFH","Ul4a1YOfrY","uvf7AqaofN","S2Dful83Ud","i3pydZhwG1","BbwgAdjsrv",
+"29QAz0ao3l","brhlQDcpWB","hSSvQGv3Fq","suY4xyEfy9","lsQGoStlDJ","ulk41zqH0W","Pb1pabrhlQ","s93MlbgJAz","AIYUu0MR5X","n8pJ9oQ87r",
+"CNHmvYh1hF","e6e4zjfREu","7fKYUs93Ml","HlUbFAIYUu","v1Hln5Namm","Rxrsmy94nw","zQt6QZhwG1","rhl0JjSjS3","64s8NSs0Zu","580YDM6qcG",
+"RpBQmlm0pD","ksJbyWaWsv","7Ow5C9GXkX","xReecPYBf4","618DilH1kt","uAWypBpYhV","FFDuiMezSW","G1RhSMmKGJ","vLsmSa00b5","FLsph8FmFH",
+"OUYuFQbxXc","atef2Uvlv4","VBjhzAgJHQ","t98iWoQ87r","FwEJz0Wr5y","ydG8UcShY2","gdQsS4dEz6","55rfBzQt6Q","atef224ARF","U3yw54QMc9",
+"FLsphtlILt","ix74rCxVEf","ZhwG1I7p2a","tl72WTwano","lsQGoEoToP","D6rByqaofN","J2mQi9y4lw","iwzGkksJby","zz4ZU2ZHdk","Q6hMCuTacx",
+"brhlQfFDrJ","0BmCyF6PT2","soy9tnnP8o","tvdkDCqqaD","sx5GlOUqFM","ThjNnAgJHQ","HP4332DREs","KZamHRzaZA","2ZHdkuQIcz","euZA5PYBf4",
+"VBjhz48cHL","WreyPFjHXR","lsQGoe6e4z","AXpwECxVEf","D6rBykZANm","yvOMIUl4a1","pFrrlfqypy","ni2v1RkQke","n1pmOQworu","uAWypgf8rI",
+"Pb1paYjB9t","7fsYMHlUbF","RkQkeKZamH","suY4x2DREs","UlU3MZ4I1v","k85AetaOXK","he9IARxrsm","s7Mxkiqv4k","FPfSEaDGtS","In3NSuAWyp",
+"HP433EOE1o","yluBxtAOsr","XyPZNsx5Gl","CNHmvYf2Ec","TXQ0Zhi5X7","KZamHaez9y","M3zXL8FmFH","SmGzvru4UG","uPX7GzY1GY","euZA5ogLgc",
+"ThjNnThjNn","pFrrl8FmFH","5NammHRxd8","nFqik4dEz6","8FmFHpT8wu","G1RhSokgRi","euZA5nlaBy","jiVBPhUTw7","s7MxkzQt6Q","MmsIoGv3Fq",
+"lkMUAJIqXi","FcWrWdmoS7","RzaZAOxWIH","CIShGcL0aE","Uvlv4QWxoT","ni2v1guMb8","VerEASmGzv","d7vjMSWfou","HfyNQSmGzv","hUTw72DREs",
+"zY1GYGrDg7","zQt6Q7X3uy","vkCHHru4UG","RzaZAUlU3M","aDGtSWaim6","LDk6f4dEz6","tl72WTa8f6","i7WMQSjskQ","5iGN5cShY2","64s8NuTacx",
+"FGzgpS77LH","ru4UGJRJQB","O3iyQuupzk","ECMvUiqv4k","5IhmGfLNg8","iKqhr48cHL","8hJdtQbxXc","RmDcrFcWrW","W3VFH8cVD3","NAFuwjiVBP",
+"Q6hMCPOUYS","7ku1pMm8si","ogLgcXflUq","sqVrfv8yFN","TXQ0ZM6qcG","HlUbFLDk6f","2hEEUKsjRK","618Di0Wr5y","aFFsse6e4z","7lUXZI7p2a",
+"jiVBPNAFuw","ulk41WreyP","lXFOBaez9y","sx5Gl5ZaEz","DLhzM45cIH","3weIF2DREs","okgRiDz1R3","jzUqRPOUYS","B3qemNOHsz","sqVrfEOE1o",
+"ZuDtDru4UG","Cp3mZZhwG1","BGaQY0YAGH","xReecxReec","ZuDtDo8Uyd","Q6hMCokgRi","F6PT2X6Pin","tl72WQworu","StlDJ2TRI7","dmoS7lXFOB",
+"StlDJcShY2","Yh1hFQYxC0","RmDcrDcpWB","9y4lwChuy3","LDk6fAOgEe","QChxsNcICA","Z4I1vMK07Y","jS1ajrz7Ut","lCMxytl72W","CNHmvW3VFH",
+"7Ow5CgtCA5","k85AeGrDg7","OxWIHJkzUn","4QMc9Rxrsm","Y1mC0lm0pD","fmIK1IRh48","b29RJ5IhmG","tjQxsfqypy","7hyVvHlUbF","FwEJzVjCZq",
+"pT8wujiVBP","JkzUnlH1kt","fcwDaRACuj","SbRYyDG4sT","y94nwFPfSE","IBe8kyvOMI","xXTI4soy9t","LbRTHYw2oU","JkzUnSs0Zu","uvf7AQ6hMC",
+"2DREs0MR5X","Pb1pa8xEKz","CK5W7JRJQB","29QAz0MR5X","EoToPO3iyQ","U3yw524ARF","fFDrJG1RhS","ogLgcuPX7G","lXFOBprNT6","FxX9qogLgc",
+"EoToPFjHXR","iqv4kLewvM","Q6LixlweGy","K4GS8IRh48","XyPZNVBjhz","5VZjSi7WMQ","6AFT0QClRL","NhXduVerEA","QbxXcM3zXL","s4786aDGtS",
+"lH1ktKASQ8","FLsphBbwgA","ECMvURsQUq","dQ586zY1GY","uN6r3C2Irc","jeskSJkzUn","pAhR13otm6","Gv3FqjSjS3","6q6L9v2eC3","oQ87rKASQ8",
+"RzaZAokgRi","WDVWJIn3NS","rKDLJjSjS3","QbxXcZzJHW","mz8gx29QAz","d7vjMyvOMI","qUJMddmoS7","SbRYy4QMc9","zY1GYQChxs","aez9ygdQsS",
+"hUTw7zz4ZU","VBjhzs4786","aFFssaL6AJ","MGlTF5Mg9r","cmXIXMGlTF","6AFT0580YD","fFDrJfmIK1","24ARFdpe1v","Uvlv4uZPqg","Yh1hFs7Mxk",
+"xciqplm0pD","AgJHQnnP8o","5VZjSThjNn","Ta8f6CqqaD","b29RJoVQp6","uAWypFNYIM","9GXkXStlDJ","JIqXiFLsph","3otm6DG4sT","VLTy6v8yFN",
+"NAFuwuQIcz","EoToPWaWsv","fLNg8D6rBy","LbRTHOz8yZ","BbwgAlViBv","d85a9lpF6W","Pb1palsQGo","4W0Tlt59lR","VLTy60Wr5y","KASQ8DcpWB",
+"aL6AJeuZA5","0BmCyaFFss","5nmWvMojnP","y94nw0ao3l","M3zXL3weIF","jfREucShY2","Zv7z0BbwgA","JKWYRulk41","W7cTsuJScX","hi5X70ao3l",
+"tl72WQWxoT","ThjNnoGu6x","5IhmGi3pyd","pmeCdVprf2","t59lRuTacx","zY1GYqQxHP","l83UdZv7z0","WDVWJIKxdL","cQOnv9rlg9","OUqFMm4bxU",
+"4dEz66AFT0","HRxd85Namm","h1zcH55rfB","fmIK1fcJOy","jS1aj5Namm","KZamHv2eC3","iqv4kb29RJ","CNHmvBGaQY","SbRYySWfou","zbIYYD6rBy",
+"0KyfsW3VFH","K20wKMGlTF","JKWYR64s8N","DQimpwDajX","qUJMdgIYvE","Ul4a1IRh48","lH1ktFFDui","aL6AJdpe1v","M3zXLUlU3M","tAOsruupzk",
+"9iGoTaFFss","HzZT8lH1kt","KASQ8lViBv","5IhmGJkzUn","s93Ml2ZHdk","1v5hH9y4lw","EoToPfmIK1","16lHcRACuj","cShY2nFqik","Rxrsm1j5L8",
+"i7WMQ6q6L9","djsrvWaWsv","M3zXL8cVD3","RmDcrlsQGo","IjTwPlm0pD","zHF1qs7Mxk","sqVrfTCgPp","0Wr5yAgJHQ","KASQ8ix74r","ydG8U618Di",
+"CIShGa00b5","FNYIMmX2GE","m4bxUIBe8k","Gv3FqFhtgl","HfyNQyEfy9","J2mQi580YD","tvdkDpWiOs","NOHszzFgtB","ni2v1BbwgA","Pb1paO3iyQ",
+"n8pJ9FwEJz","OxWIHUlU3M","PYBf4ZzJHW","ni2v1JKWYR","MezSW5ZaEz","1v5hHtuDyS","StlDJyToGW","uN6r3jtn0X","Q6LixqUJMd","zqH0WCfgr3",
+"t59lRlj07Q","Q6hMC8xEKz","dhSuHhUTw7","nnP8ojeskS","t98iWEoToP","O3iyQpT8wu","pAhR1gIYvE","64s8NPOUYS","JXljWCfgr3","In3NSguMb8",
+"suY4xWMiS3","MGlTF6q6L9","hi5X7uvf7A","Yw2oUWPmlx","Z4I1vCdyBV","0MR5XNAFuw","KASQ8yvOMI","KZamH4W0Tl","16lHcuupzk","FGzgpLewvM",
+"pWiOshe9IA","dhSuHx3LDe","U3yw5rKDLJ","pmeCdMGlTF","Oz8yZLbRTH","Ta8f68hJdt","MGlTFYf2Ec","uTacxQbxXc","faHir9rlg9","brhlQPYBf4",
+"9rlg9soy9t","zFgtBjtn0X","FhtglWaim6","JKWYRVIlwP","tvdkD3weIF","wiHrZ5VZjS","dhSuHjS1aj","lH1ktlpF6W","Chuy3BpYhV","soy9tpAhR1",
+"9XyT9MmsIo","kB5nPOHaBz","VjCZqZ4I1v","uupzkAgJHQ","jtn0X9eoRc","rKDLJpFrrl","Ss0ZuP6bcg","RBhp0NAFuw","hUTw7FGzgp","0BmCylweGy",
+"i3pydgIYvE","PYBf4xReec","IjTwPmX2GE","wiHrZAIYUu","x3LDeSWfou","v8yFNFcWrW","Chuy3blLA9","TXQ0ZNxx9V","BCxeCHP433","Mm8si07n1c",
+"IBe8kfmIK1","CxVEfzmLYD","Q6Lixs93Ml","ydG8UcL0aE","AgJHQOUqFM","CNHmvkZANm","7fsYMt98iW","QnJ1SgdQsS","lj07QZuDtD","JKWYRv1Hln",
+"uQIczP6bcg","yofH3blLA9","TwanozqH0W","ciuWzAXpwE","oGu6x3weIF","AXpwErz7Ut","RpBQmjiVBP","9eoRctl72W","sx5GlYOfrY","suY4xsqVrf",
+"oQ87rJ2mQi","Ss0ZuM6qcG","5IhmGQClRL","prNT6hi5X7","JXljWFjHXR","Mm8sijSjS3","I7p2atvdkD","pWiOsyofH3","blLA90PktI","RzaZADLhzM",
+"JJs5mzmLYD","BFkb8CK5W7","DcpWBFjHXR","jeskSqQxHP","xXTI4CdyBV","NAFuwtjQxs","yvOMITwano","OUqFMeuZA5","618DibrhlQ","QChxsQbxXc",
+"kZANmYjB9t","CdyBVgtCA5","CqqaD5Namm","jiVBPZ4I1v","5VZjS9iGoT","OUqFMpvgjS","YjB9tnlaBy","aFFssjS1aj","ZuDtDrKDLJ","QChxsSs0Zu",
+"WaWsvD6rBy","VNCPdt59lR","ThjNnJIqXi","RACujv2eC3","NhXdurKDLJ","yToGWl83Ud","yToGWWDVWJ","3weIF1j5L8","zz4ZU7X3uy","IRh48taOXK",
+"Z4I1v8TxD7","Yf2EcCK5W7","0h1b1ciuWz","EoToPReKEW","5VZjSQChxs","WPmlx8cVD3","45cIH8cVD3","OUYuF0PktI","tAOsrYw2oU","8RCUAnnP8o",
+"7hyVvjtn0X","pFrrlBFkb8","5Drn0bgJAz","Ta8f6pvgjS","U3yw50Wr5y","Z4I1vo8Uyd","8hJdtzFgtB","8hJdtTwano","xciqpChuy3","FxX9q9eoRc",
+"S77LH8FmFH","fmIK1lkMUA","3otm6uvf7A","yluBxuupzk","LDk6fmX2GE","lsQGoWPmlx","K4GS8lweGy","AXpwEpmeCd","uLtKsMmsIo","tuDySQbxXc",
+"CIShG3otm6","QworupmeCd","5IhmG0ao3l","d7vjM5drc6","fqypyOUYuF","ZuDtDbgJAz","Waim6cQOnv","QChxsRBhp0","RpBQmqQxHP","WaWsvfcJOy",
+"UlU3MKsjRK","euZA5FjHXR","8RCUAO3iyQ","1LB1LuZPqg","s93Ml7hyVv","LDk6fHlUbF","pmeCdMaJQs","JIqXieuZA5","CNHmvSs0Zu","qUJMdYf2Ec",
+"RsQUqO3iyQ","pFrrlcShY2","okgRifcwDa","ulk41BpYhV","lpF6Wi7WMQ","lm0pDuN6r3","nlaByKZamH","5NammKZamH","I7p2auQIcz","lpF6WjSjS3",
+"2NslmMojnP","bgJAzZhwG1","yvOMIThjNn","FcWrWv1Hln","XflUqv8yFN","Waim6M3zXL","aL6AJFhtgl","2TRI7VjCZq","cmXIXVNCPd","BpYhVv8yFN",
+"rhl0Ji7WMQ","HzZT8JRJQB","FPfSECK5W7","PYBf4WaWsv","b29RJCdyBV","brhlQM6qcG","DcpWBGSQwj","s7Mxk3weIF","FVMxoJ2mQi","mX2GESjskQ",
+"pmeCd8U2nU","uLtKsiKqhr","Q6hMC7lUXZ","Nxx9V5nmWv","Yh1hFru4UG","a00b5oGu6x","DcpWBDG4sT","7hyVvYw2oU","FcWrWJkzUn","hSSvQ2Nslm",
+"JJs5mK4GS8","ydG8UlH1kt","tAOsrCK5W7","W3VFHuQIcz","rz7UtnnP8o","16lHcMGlTF","ECMvUJIqXi","2hEEUlViBv","hYBCKRBhp0","prNT607n1c",
+"Z4I1vTXQ0Z","dmoS7FVMxo","soy9tdmoS7","SWfouAmdQd","1j5L8FVMxo","uTacxguMb8","Mkgy8AmdQd","K4GS80ao3l","WDVWJxReec","4W0TlYf2Ec",
+"gdQsSs4786","hE1QlqaofN","jeskSNOHsz","vOqCEXyPZN","TCgPpAIYUu","QClRLh1zcH","uAWypO3iyQ","WmadAQChxs","GWqqXoGu6x","lsQGo7fKYU",
+"MojnPcmXIX","TXQ0Zi7WMQ","4dEz6LbRTH","ThjNnZuDtD","NOHszTXQ0Z","lsQGoVLTy6","IRh48IRh48","MK07YaFFss","azIWpJIqXi","DcpWB3otm6",
+"Chuy3qaofN","i7WMQ580YD","atef2X6Pin","soy9tC2Irc","7ku1pAOgEe","gtCA5Q6Lix","W3VFH4W0Tl","1LB1LRmDcr","v1HlnjeskS","1LB1LgtCA5",
+"taOXKxXTI4","y94nwDLhzM","7hyVvPOUYS","ZzJHWjSjS3","hUTw7VerEA","HP433ZhwG1","WDVWJ8TxD7","Cp3mZ29QAz","uN6r3v2eC3","zQt6QFVMxo",
+"OHaBzZv7z0","WmadANxx9V","S2DfuI7p2a","QbxXc7fKYU","uLtKs5Mg9r","XflUqd85a9","Cp3mZCdyBV","DLhzM2TRI7","Gv3FqWreyP","he9IAv2eC3",
+"xXTI4cQOnv","aDGtSP6bcg","VIlwP7X3uy","EOE1oVprf2","Y1mC0k85Ae","5IhmGuJScX","gjUTuNAFuw","Oz8yZVerEA","7ku1pHlUbF","fLNg8CIShG",
+"ciuWzBFkb8","guMb8yvOMI","DcpWBQbxXc","lj07QW7cTs","GWqqXx3LDe","uLtKsPOUYS","Uvlv4YjB9t","Q6Lix580YD","NAFuwcShY2","pFrrl5Mg9r",
+"BGaQYWMiS3","pWiOsJRJQB","Zv7z0580YD","XflUqVIlwP","MojnP9GXkX","b29RJJ2mQi","zmLYDQssNC","cL0aED6rBy","QWxoTDG4sT","LewvMfcJOy",
+"M3zXLFcWrW","OUqFM6AFT0","FwEJzd7vjM","5iGN5he9IA","wDajXjS1aj","6AFT0d7vjM","SbRYy3weIF","8cVD3ZUnqt","C2IrcRpBQm","2TRI7GWqqX",
+"pvgjSLDk6f","nnP8otAOsr","CNHmvIn3NS","s7MxkyEfy9","d85a96AFT0","5nmWvaDGtS","QYxC0x3LDe","VBjhzlm0pD","RkQkeU3yw5","prNT6lH1kt",
+"MK07YFxX9q","07n1caFFss","O3iyQB3qem","dpe1vSs0Zu","iKqhri7WMQ","0ao3lTCgPp","K4GS8TCgPp","UmaEvgIYvE","O3iyQ7Ow5C","vkCHHDQimp",
+"ru4UGEoToP","blLA9Yf2Ec","pAhR1WaWsv","0h1b1kZANm","XyPZNgf8rI","QworufcwDa","7X3uyXflUq","hE1QlMezSW","0MR5XqaofN","lCMxyydG8U",
+"vkCHHm4bxU","lkMUAQ6Lix","D6rByi3pyd","1v5hHEoToP","GSQwjpiJSk","YjB9txciqp","nFqikYh1hF","Ta8f6cL0aE","HfyNQaDGtS","HRxd85ZaEz",
+"Vprf2i3pyd","tvdkDVIlwP","Cp3mZuTacx","LDk6fRsQUq","OxWIHhi5X7","hYBCKtvdkD","ogLgcYjB9t","lViBvlweGy","JIqXizHF1q","lViBvlViBv",
+"RmDcrSmGzv","jtn0XJKWYR","OUYuFAIYUu","FNYIMHzZT8","SjskQSs0Zu","ciuWzjtn0X","fLNg8sx5Gl","J2mQi9iGoT","FwEJzpWiOs","zmLYD0YAGH",
+"lsQGo5Namm","MezSWReKEW","ZhwG1TCgPp","ni2v114FLR","gf8rIs7Mxk","3weIFFVMxo","KZamHatef2","gjUTuOz8yZ","5ZaEzrhl0J","okgRisqVrf",
+"o8UydX6Pin","atef2W7cTs","Cp3mZRkQke","XflUqSWfou","5NammU3yw5","HfyNQWaim6","iqv4koVQp6","07n1crhl0J","pv0i7QWxoT","ZzJHWAIYUu",
+"hE1QlGXdoH","gjUTuUl4a1","MmsIoM6qcG","POUYSnnP8o","h1zcHzqH0W","t98iWEOE1o","QYxC0s4786","GSQwjoQ87r","yvOMIWPmlx","uQIczpWiOs",
+"RmDcr4QMc9","zbIYYciuWz","suY4xVIlwP","HfyNQOHaBz","In3NSoGu6x","0ao3lfaHir","MojnPuvf7A","JXljWMmKGJ","pvgjSNo0Qb","EoToP8FmFH",
+"UmaEva00b5","CK5W7a00b5","2NslmFVMxo","S2DfuLewvM","48cHLk85Ae","SmGzviwzGk","7ku1pZJTXH","jiVBPTXQ0Z","L7cGcRpBQm","CqqaDe6e4z",
+"Vprf2DLhzM","v8yFN2DREs","tlILtFPfSE","uoStwThjNn","uupzkjiVBP","i3pydDcpWB","0MR5XG1RhS","lpF6WogLgc","OUqFMJRJQB","gIYvE8FmFH",
+"qaofNHP433","GSQwj7fsYM","ksJby9iGoT","lm0pDPOUYS","HlUbFQnJ1S","brhlQJkzUn","GSQwjTa8f6","uJScXCqqaD","07n1cJKWYR","ciuWzPb1pa",
+"5VZjSuPX7G","5ZaEzMmsIo","BbwgALbRTH","gjUTuTXQ0Z","xXTI4QChxs","7X3uytjQxs","aDGtSKsjRK","C2Irc7lUXZ","580YDVNCPd","Yw2oU5nmWv",
+"RsQUq580YD","VjCZqiKqhr","sqVrfwDajX","580YDlsQGo","1j5L8ulk41","IBe8kP6bcg","oQ87rt59lR","SjskQni2v1","7fKYUOxWIH","7X3uyNcICA",
+"euZA59iGoT","AOgEefaHir","LDk6fCqqaD","QWxoTzmLYD","n1pmOgjUTu","tl72WEoToP","FNYIMFGzgp","yvOMIgdQsS","RmDcr1LB1L","ni2v15drc6",
+"prNT648cHL","SmGzv1v5hH","jS1aj2DREs","S77LHpvgjS","RpBQmReKEW","v8yFNlweGy","gjUTuQbxXc","Uvlv4VLTy6","P6bcgpiJSk","v8yFNuvf7A",
+"uZPqgS77LH","ReKEWtl72W","hE1QlRBhp0","lCMxylH1kt","uAWypHRxd8","Zv7z0b29RJ","nFqiktvdkD","5Mg9rKASQ8","Yf2EcQClRL","No0QbVBjhz",
+"GWqqXrKDLJ","nnP8oIBe8k","Ss0Zu5iGN5","l83UdRxrsm","2DREs9y4lw","KsjRKDz1R3","uLtKsqaofN","yofH3d85a9","RzaZA0h1b1","x3LDeW7cTs",
+"14FLR0h1b1","BCxeCHRxd8","lXFOBuN6r3","piJSkFPfSE","MaJQslpF6W","ni2v1TCgPp","RpBQmDG4sT","WmadA0h1b1","QbxXc5drc6","Y1mC0POUYS",
+"StlDJ3weIF","ThjNncmXIX","5ZaEzyluBx","vOqCEIn3NS","h1zcHiKqhr","Gv3FqAgJHQ","s47860ao3l","hE1Ql6q6L9","LewvMru4UG","uupzklm0pD",
+"tlILtgjUTu","G1RhSM6qcG","FFDuijzUqR","8hJdtuQIcz","PYBf4SjskQ","aez9yprNT6","dmoS7GSQwj","JIqXirz7Ut","lweGy5iGN5","CqqaDv8yFN",
+"cShY2Q6Lix","Yw2oUZhwG1","jSjS3VNCPd","pAhR1jSjS3","C2Irc9XyT9","ThjNnDLhzM","QWxoTAIYUu","sqVrfdmoS7","64s8NSjskQ","e6e4ztvdkD",
+"fLNg8OUYuF","dmoS78xEKz","MaJQsuoStw","Fhtgl9iGoT","y94nwuJScX","WaWsvDG4sT","jzUqRMm8si","NcICAJXljW","CxVEf2Nslm","qUJMd2DREs",
+"Zv7z0NhXdu","wDajXuoStw","hE1QlSWfou","i7WMQdjsrv","QYxC0e6e4z","VIlwPRzaZA","FPfSEazIWp","MojnP3otm6","iB08lXyPZN","Gv3FqQworu",
+"kB5nPVBjhz","MK07YGv3Fq","sqVrfQ6hMC","cShY2n1pmO","4QMc9qUJMd","tuDySB3qem","BpYhVJIqXi","Mkgy845cIH","uJScX0BmCy","suY4xk85Ae",
+"iKqhrpT8wu","WmadArKDLJ","X6PinStlDJ","0PktImX2GE","jfREu8TxD7","wiHrZ4QMc9","VerEAatef2","I7p2auZPqg","jS1ajtjQxs","DLhzMn1pmO",
+"RACujECMvU","HfyNQFLsph","bgJAzDcpWB","m4bxU8U2nU","HfyNQK4GS8","Mkgy848cHL","9eoRc9iGoT","l83UdDz1R3","aFFssx3LDe","9GXkXyluBx",
+"BpYhVaFFss","FjHXRvkCHH","lweGykZANm","Ul4a17lUXZ","Ta8f6Yf2Ec","xciqppmeCd","Waim6cL0aE","xciqppWiOs","4QMc9cL0aE","iKqhrlpF6W",
+"ECMvUOHaBz","BbwgAL7cGc","ZzJHWblLA9","euZA5XyPZN","FLsphJKWYR","8FmFHQssNC","fLNg8Mm8si","WMiS3h1zcH","5Mg9rW3VFH","WPmlx6q6L9",
+"MGlTFXyPZN","blLA9VBjhz","ZJTXHuPX7G","TwanoX6Pin","8TxD7ECMvU","prNT6cQOnv","blLA9XflUq","M3zXLn1pmO","B3qemQYxC0","t59lR1j5L8",
+"Uvlv40YAGH","uoStwiB08l","ksJbyv2eC3","4QMc95nmWv","x3LDeRkQke","2TRI7BGaQY","LewvM9XyT9","1LB1LMkgy8","oGu6x0BmCy","QnJ1SqQxHP",
+"64s8NNAFuw","nFqik7lUXZ","KZamHxReec","45cIHdhSuH","tjQxsoQ87r","JIqXioGu6x","kZANm7Ow5C","StlDJKZamH","uQIczCfgr3","FxX9qF6PT2",
+"M3zXLRmDcr","hE1QlX6Pin","POUYSQChxs","C2IrcLbRTH","CqqaDAIYUu","wiHrZNcICA","VjCZqZJTXH","hSSvQlsQGo","pvgjSzFgtB","5Namm1j5L8",
+"QssNCo8Uyd","ZuDtDuPX7G","Cp3mZ0PktI","EoToPxReec","9GXkXd85a9","blLA95iGN5","5nmWv7X3uy","hUTw72hEEU","vkCHHQYxC0","8hJdtiKqhr",
+"MmsIoix74r","LDk6fTCgPp","bZLvSzz4ZU","CIShGVLTy6","Ta8f6OxWIH","F6PT2vLsmS","he9IAD6rBy","0PktIyEfy9","BpYhVnFqik","suY4xM6qcG",
+"IRh48lXFOB","yEfy99iGoT","fqypyv8yFN","AXpwE5nmWv","d85a9RsQUq","lm0pD0YAGH","AmdQdfLNg8","ru4UG24ARF","uLtKspT8wu","45cIHcShY2",
+"HRxd8NOHsz","0PktIfmIK1","J2mQi7fsYM","VIlwPvkCHH","b29RJdhSuH","64s8Nn1pmO","qUJMdhYBCK","v1HlnvOqCE","TXQ0ZMK07Y","24ARFzY1GY",
+"yToGWJKWYR","BFkb8prNT6","jiVBPrz7Ut","lpF6WMGlTF","HzZT8tlILt","s93MlD6rBy","ulk41OUqFM","s47869rlg9","K20wKkB5nP","5Drn0VNCPd",
+"1j5L8v1Hln","i7WMQ07n1c","QYxC0Yw2oU","0KyfsMGlTF","I7p2a0ao3l","i3pydbrhlQ","wDajXECMvU","n1pmOJKWYR","VIlwPQClRL","FVMxoFxX9q",
+"zY1GYGSQwj","RkQke2Yz7E","X6PinzmLYD","U3yw59rlg9","VNCPdKZamH","3weIFNxx9V","uAWyp16lHc","5NammBbwgA","taOXKMaJQs","64s8Nsx5Gl",
+"pAhR1ECMvU","n1pmO4W0Tl","M6qcGmz8gx","ECMvUlkMUA","ogLgciwzGk","5Drn0WreyP","lkMUAydG8U","pFrrlVIlwP","ru4UG5VZjS","JXljW1LB1L",
+"Chuy3OUYuF","2TRI7Twano","L7cGcpiJSk","AgJHQlXFOB","JXljW2hEEU","MmKGJuZPqg","lj07Qdpe1v","ZJTXHTa8f6","wDajXMaJQs","xReec0BmCy",
+"rKDLJWmadA","3weIFK4GS8","QWxoTx3LDe","m4bxUzHF1q","uTacx2hEEU","zY1GYciuWz","5ZaEz9rlg9","RACujk85Ae","MmKGJ7hyVv","RmDcrtvdkD",
+"tAOsrHlUbF","9iGoT3otm6","yToGWuPX7G","tAOsrDLhzM","Zv7z0bZLvS","d85a9yEfy9","JkzUnciuWz","mX2GE1v5hH","7lUXZ8TxD7","uoStwLbRTH",
+"AmdQd7lUXZ","dmoS7yvOMI","dmoS7OHaBz","uLtKsaFFss","t59lRS77LH","xReecogLgc","he9IAChuy3","fmIK1tlILt","tuDySZ4I1v","2DREsuoStw",
+"AIYUuHzZT8","fLNg8iB08l","CNHmvQnJ1S","0h1b1a00b5","XflUq3otm6","QbxXcSjskQ","1LB1Ly94nw","atef2QWxoT","jtn0X5IhmG","EdBKcTXQ0Z",
+"gIYvELDk6f","DG4sTVLTy6","GWqqXiqv4k","s7Mxks93Ml","pWiOsydG8U","atef2euZA5","sqVrf9rlg9","ulk41yToGW","2Yz7E0Kyfs","14FLRLewvM",
+"8FmFHsoy9t","5Drn0GWqqX","MK07Yn1pmO","djsrvazIWp","ksJbyMezSW","zbIYYpT8wu","vOqCEaDGtS","K20wKHP433","VerEATXQ0Z","qaofNHlUbF",
+"0PktIFVMxo","3otm61j5L8","CIShGAOgEe","VIlwPv1Hln","bZLvSyofH3","CqqaDksJby","zqH0WiKqhr","7fsYMSbRYy","qaofNAmdQd","n8pJ9zbIYY",
+"yToGWs7Mxk","v2eC307n1c","JJs5maL6AJ","2ZHdkwDajX","ZUnqtt59lR","lj07Q0PktI","Q6LixjS1aj","lCMxyUvlv4","jSjS3UmaEv","9GXkXy94nw",
+"BCxeCZUnqt","7lUXZrz7Ut","fcwDauoStw","Kr8ysTCgPp","sqVrfpT8wu","NAFuwNAFuw","ZzJHW0PktI","48cHLnnP8o","xReecsuY4x","lj07QRpBQm",
+"atef2ZUnqt","jzUqRHP433","x3LDebgJAz","RmDcr64s8N","No0QbRzaZA","ksJbyX6Pin","vLsmS2hEEU","Uvlv4gjUTu","iB08lLbRTH","gtCA5KZamH",
+"d85a9vOqCE","sx5GlvkCHH","OxWIHtAOsr","rhl0J7fKYU","WMiS3Cfgr3","M6qcGuoStw","S2Dfu7fsYM","CxVEfi3pyd","zY1GYGv3Fq","POUYSFxX9q",
+"SbRYys7Mxk","7fKYU3otm6","uZPqgksJby","Ta8f6b29RJ","2Yz7ETwano","8U2nUtaOXK","qaofNs4786","FFDuizqH0W","TXQ0Ze6e4z","JRJQBuJScX",
+"PYBf4faHir","Uvlv4vLsmS","suY4xIRh48","JJs5mcQOnv","RBhp0he9IA","oVQp69XyT9","piJSkB3qem","ThjNnbrhlQ","kB5nPsuY4x","nlaByRsQUq",
+"14FLRt98iW","0YAGH4dEz6","LbRTHD6rBy","D6rByVBjhz","tjQxsfmIK1","gtCA5W7cTs","W7cTsLewvM","sqVrfzFgtB","fLNg8faHir","sx5Gls93Ml",
+"yluBxvOqCE","s93MlF6PT2","RkQke3weIF","gIYvEtuDyS","AkKTklm0pD","VLTy6uPX7G","FjHXRgdQsS","24ARFzQt6Q","W7cTs8U2nU","3weIFsoy9t",
+"HzZT8tuDyS","AkKTk580YD","ydG8UuLtKs","F6PT2Fhtgl","MGlTFY1mC0","dpe1vlH1kt","Cp3mZiqv4k","okgRiOHaBz","0PktIUl4a1","SbRYyUvlv4",
+"7lUXZrhl0J","0KyfsyluBx","8xEKz5ZaEz","7fKYUVprf2","YjB9tzFgtB","Mm8sik85Ae","VIlwPM6qcG","oVQp6Nxx9V","NOHszZJTXH","0PktIJ2mQi",
+"n8pJ9Mkgy8","Q6hMCprNT6","h1zcHk85Ae","M6qcGL7cGc","uZPqguQIcz","LewvMciuWz","v2eC3S77LH","0ao3lOHaBz","uPX7GWDVWJ","K4GS8uQIcz",
+"aL6AJFnPFB","NOHszKr8ys","dmoS7CqqaD","Mkgy8Zv7z0","s4786o8Uyd","Q6hMC7X3uy","uvf7ABCxeC","8RCUAtAOsr","RmDcriKqhr","lpF6WgIYvE",
+"8hJdttaOXK","QYxC0618Di","CxVEfgtCA5","atef2uPX7G","ThjNnksJby","7lUXZJ2mQi","DLhzMi3pyd","L7cGcDz1R3","uLtKsm4bxU","FFDuilCMxy",
+"s7Mxk9XyT9","ThjNnRsQUq","HzZT87fKYU","JRJQB5Namm","Z4I1vG1RhS","yToGW580YD","07n1cLbRTH","8xEKz0Wr5y","kB5nP5drc6","0h1b1uZPqg",
+"SmGzvLDk6f","ru4UGtaOXK","uJScX24ARF","b29RJyToGW","M6qcGo8Uyd","AOgEeWaim6","uLtKs55rfB","uJScXiwzGk","hSSvQh1zcH","M6qcGulk41",
+"bZLvSQChxs","jiVBPQYxC0","xReec0Kyfs","suY4xNcICA","JIqXiMmKGJ","OHaBz1j5L8","8TxD75drc6","k85AeRxrsm","7ku1pTCgPp","yToGWBGaQY",
+"QChxslViBv","aL6AJ4dEz6","HP433Qworu","ThjNnjSjS3","CdyBVpv0i7","xReecFxX9q","AgJHQ7fsYM","KASQ8FPfSE","RkQked7vjM","MaJQsfFDrJ",
+"soy9tMmKGJ","jtn0XDLhzM","QssNCUmaEv","tjQxsa00b5","rKDLJfaHir","FwEJzjfREu","I7p2afaHir","JXljWzbIYY","I7p2a8FmFH","POUYSOUqFM",
+"MmsIoBbwgA","oGu6xHzZT8","MGlTFxReec","WMiS3AXpwE","piJSksqVrf","7fsYMqUJMd","2ZHdkVLTy6","pFrrljS1aj","mz8gxlweGy","QnJ1Srz7Ut",
+"UmaEvVprf2","OxWIHSWfou","5drc60ao3l","JJs5m3weIF","pT8wujfREu","qaofNuupzk","hi5X77fsYM","8xEKztjQxs","guMb8Y1mC0","zFgtB0BmCy",
+"pFrrli7WMQ","yluBxcQOnv","hi5X7CdyBV","5ZaEzoVQp6","2Yz7Emz8gx","P6bcgiB08l","FcWrWHzZT8","SWfouulk41","aDGtSM6qcG","faHir7X3uy",
+"Dz1R314FLR","2ZHdkjSjS3","Nxx9VMK07Y","UlU3MNxx9V","qUJMdHRxd8","QChxsIn3NS","FVMxo7X3uy","OUqFMb29RJ","EoToP5drc6","CdyBVRzaZA",
+"4W0TlyvOMI","jSjS3OHaBz","C2IrcCp3mZ","n8pJ9yToGW","aFFssThjNn","dhSuH4dEz6","Ss0Zuhe9IA","pWiOsY1mC0","In3NS5nmWv","DcpWBzQt6Q",
+"ulk41Fhtgl","ZhwG1BGaQY","MK07YWDVWJ","blLA9QYxC0","uoStw29QAz","7ku1pFVMxo","Kr8yscQOnv","4dEz6MojnP","48cHL2Yz7E","nnP8ogf8rI",
+"0PktIFjHXR","FnPFB4dEz6","faHirZhwG1","JKWYR2TRI7","GWqqXJKWYR","yvOMItAOsr","AIYUuMmsIo","bZLvS7fKYU","0KyfsVprf2","lCMxyi7WMQ",
+"dQ586pFrrl","dpe1vQYxC0","CqqaDYf2Ec","2Yz7EECMvU","MojnPk85Ae","RzaZA14FLR","7hyVvBbwgA","Ta8f6ogLgc","pv0i7P6bcg","dpe1va00b5",
+"EdBKcuZPqg","8xEKzBFkb8","D6rByzbIYY","FhtglOUqFM","KsjRKuTacx","JkzUnsqVrf","Yw2oUm4bxU","ksJbyqaofN","vkCHHlpF6W","JkzUnxXTI4",
+"t98iWK20wK","VIlwP5ZaEz","5ZaEzgf8rI","nlaByuZPqg","uTacxuupzk","EoToPYOfrY","CqqaDJXljW","a00b59rlg9","y94nwgf8rI","v8yFNSjskQ",
+"1LB1LKr8ys","WDVWJFnPFB","AOgEepT8wu","RACujoVQp6","0ao3l8FmFH","5Mg9ruoStw","lViBvQ6Lix","mz8gxMmsIo","uLtKsFnPFB","IKxdLL7cGc",
+"lm0pDRxrsm","7fKYUPb1pa","uLtKsni2v1","jeskSlH1kt","Y1mC0WmadA","piJSki3pyd","zmLYD5drc6","RsQUqeuZA5","AOgEeKr8ys","WaWsvQYxC0",
+"XflUqy94nw","fLNg8zmLYD","Zv7z0he9IA","8TxD7WaWsv","Q6hMCuZPqg","aFFssiKqhr","8FmFHW7cTs","9XyT9fcJOy","Rxrsml83Ud","PYBf44QMc9",
+"24ARFlpF6W","Cp3mZjS1aj","6AFT0HP433","uZPqgNo0Qb","9GXkXRsQUq","fcwDaVLTy6","cL0aENOHsz","GrDg74W0Tl","QClRL07n1c","TCgPpQworu",
+"MK07YDz1R3","vkCHHlj07Q","aez9ygjUTu","Uvlv4faHir","suY4x5ZaEz","nlaByi3pyd","Cfgr3Zv7z0","oVQp6Oz8yZ","6AFT0EoToP","7Ow5CZuDtD",
+"rKDLJS77LH","CqqaDoGu6x","RpBQmyToGW","K20wK5iGN5","iKqhr2hEEU","azIWpprNT6","hUTw7KZamH","0BmCy7X3uy","k85Ae1LB1L","ni2v1QChxs",
+"8xEKzxXTI4","WmadAlViBv","9rlg9tAOsr","WMiS3uLtKs","16lHcaez9y","zFgtBRACuj","2NslmgjUTu","uZPqgiqv4k","IjTwPM6qcG","uoStwiqv4k",
+"s4786NhXdu","DcpWBfmIK1","HlUbFJXljW","M3zXLpT8wu","rhl0JprNT6","HzZT89y4lw","5Drn0ydG8U","lpF6WRpBQm","618DiFhtgl","zz4ZU2TRI7",
+"fcJOy48cHL","JKWYRCfgr3","QnJ1SUlU3M","FjHXR0PktI","StlDJcL0aE","CNHmvy94nw","NcICAlm0pD","In3NSlweGy","45cIHL7cGc","XflUqprNT6",
+"RkQketjQxs","gdQsSzY1GY","Q6hMCcShY2","BpYhVlpF6W","lkMUA618Di","v8yFNAgJHQ","yvOMI5IhmG","LbRTHRBhp0","nlaByStlDJ","yToGWuN6r3",
+"StlDJpmeCd","uZPqguZPqg","FFDuiMojnP","S2DfuiKqhr","Rxrsm7X3uy","jfREubZLvS","MojnPVprf2","wDajXHP433","Ss0ZuThjNn","kZANmCxVEf",
+"pT8wuRzaZA","ZuDtDhE1Ql","Z4I1v5IhmG","yToGWFNYIM","LewvMprNT6","64s8NrKDLJ","Cfgr3xciqp","hYBCK14FLR","6q6L9Uvlv4","CdyBVBFkb8",
+"IjTwP7X3uy","cL0aEuQIcz","S77LH48cHL","C2IrcazIWp","rKDLJYw2oU","uJScXZuDtD","EOE1oM6qcG","MojnP5VZjS","4W0TldmoS7","WMiS3CqqaD",
+"gdQsSRpBQm","9GXkXlm0pD","yvOMIxXTI4","5iGN5P6bcg","RpBQmY1mC0","FhtglFjHXR","5Drn0pAhR1","CK5W7lXFOB","VLTy6iwzGk","ZJTXHHP433",
+"9rlg9pv0i7","8RCUAJXljW","VIlwPOz8yZ","Cp3mZni2v1","5ZaEzm4bxU","nFqiks4786","2NslmQ6Lix","NhXduB3qem","yofH3zz4ZU","NAFuw45cIH",
+"CxVEfFnPFB","0YAGH29QAz","i3pydWPmlx","HlUbFlCMxy","64s8N3otm6","FGzgph1zcH","Z4I1vUl4a1","14FLRfmIK1","Dz1R329QAz","KASQ8WPmlx",
+"uZPqgdQ586","lm0pDP6bcg","MmKGJCK5W7","k85Ae8hJdt","W7cTsVjCZq","LewvMB3qem","lpF6WuN6r3","nnP8opmeCd","lpF6Wdjsrv","mX2GENo0Qb",
+"taOXK7hyVv","NAFuwVBjhz","Zv7z0WPmlx","qUJMdWaim6","y94nwLDk6f","VIlwPxReec","SjskQm4bxU","rhl0JhE1Ql","OUYuFZuDtD","Mkgy8JXljW",
+"16lHcrhl0J","DQimpgtCA5","IjTwPaL6AJ","Vprf2euZA5","zHF1qFhtgl","zHF1qQ6hMC","LbRTHpFrrl","FcWrWECMvU","lm0pDtaOXK","hE1Ql8RCUA",
+"iwzGkSmGzv","dhSuHlXFOB","I7p2aWPmlx","lkMUAO3iyQ","HP433tjQxs","fcwDacL0aE","kZANmlweGy","WDVWJ7fKYU","6q6L9lH1kt","kZANms93Ml",
+"IBe8kkZANm","EdBKctlILt","M3zXLC2Irc","n8pJ92hEEU","tl72Wulk41","zbIYYyvOMI","bgJAzBFkb8","Vprf2CK5W7","5VZjSEOE1o","5nmWv4W0Tl",
+"jSjS3i7WMQ","dQ586mz8gx","atef28TxD7","vLsmSaL6AJ","o8UydvLsmS","SbRYyDz1R3","uTacxWMiS3","ZzJHWMkgy8","LbRTHfqypy","yEfy9jiVBP",
+"jeskSPYBf4","5Mg9rlkMUA","uvf7A5Drn0","BGaQYFjHXR","iKqhrrKDLJ","jSjS3Gv3Fq","JIqXiHP433","WaWsv6q6L9","zFgtBuPX7G","HzZT8XflUq",
+"2DREsHlUbF","s93MljeskS","mz8gxkB5nP","Waim6HzZT8","7fKYUoVQp6","4QMc9S77LH","FcWrWW7cTs","3otm6BFkb8","NhXduaFFss","hYBCK9GXkX",
+"0BmCyMGlTF","OUqFMoGu6x","RBhp07ku1p","1LB1Latef2","nlaByS2Dfu","I7p2aXflUq","IjTwPv1Hln","okgRiWaWsv","0h1b1wiHrZ","ECMvUAIYUu",
+"POUYSDQimp","2TRI7Kr8ys","gdQsSk85Ae","pv0i7b29RJ","55rfBoQ87r","zY1GYReKEW","hi5X7GrDg7","KZamHMmsIo","oGu6xEOE1o","lViBvZuDtD",
+"h1zcH5Namm","7ku1pHzZT8","QWxoTguMb8","jSjS3uPX7G","Ss0ZuxXTI4","Yw2oUMm8si","wDajXeuZA5","tvdkDbZLvS","IjTwPpvgjS","i7WMQWDVWJ",
+"HzZT8HP433","qQxHPhE1Ql","5ZaEzReKEW","BFkb8RkQke","jtn0XBFkb8","b29RJyofH3","0BmCydmoS7","gf8rIIjTwP","bgJAzIKxdL","uZPqgS2Dfu",
+"6AFT0sqVrf","hE1QlRsQUq","dhSuHzHF1q","FjHXRBpYhV","oGu6xvLsmS","hSSvQdQ586","zY1GYK4GS8","Ss0Zuxciqp","FFDuiVprf2","uJScXs93Ml",
+"No0QbjfREu","8cVD3Pb1pa","oVQp6rhl0J","5Drn0AXpwE","AXpwElsQGo","FPfSEW7cTs","Kr8ysI7p2a","5nmWv7Ow5C","TCgPp5drc6","EoToPjtn0X",
+"zmLYDK4GS8","3weIFKsjRK","Ss0ZuguMb8","pmeCdRBhp0","AmdQdHRxd8","VIlwPzY1GY","FwEJzuLtKs","lpF6WS2Dfu","GWqqXKASQ8","prNT6FcWrW",
+"5iGN5d85a9","7hyVvQChxs","Cp3mZazIWp","uTacxCK5W7","Cfgr3fLNg8","nFqik5IhmG","Uvlv4soy9t","dmoS7ReKEW","HlUbFoGu6x","9eoRcuJScX",
+"IRh48ksJby","QnJ1S5ZaEz","lViBv2hEEU","3otm6C2Irc","ZzJHW5IhmG","iqv4kl83Ud","KZamHECMvU","5drc6xciqp","lH1ktb29RJ","qaofND6rBy",
+"ZUnqtHlUbF","oVQp6gIYvE","O3iyQPb1pa","9iGoTKr8ys","sx5Gl0YAGH","CK5W7AkKTk","XyPZNDz1R3","SmGzv14FLR","jS1ajVLTy6","djsrvAXpwE",
+"Cp3mZAmdQd","KsjRKVerEA","zFgtBd85a9","uPX7GlkMUA","lXFOBtlILt","9GXkXrz7Ut","SjskQRmDcr","IRh480MR5X","DG4sTTa8f6","Pb1paa00b5",
+"SjskQZUnqt","CK5W7i3pyd","mz8gxP6bcg","VjCZqCK5W7","zz4ZUvkCHH","uPX7G8FmFH","nFqikWreyP","i7WMQ14FLR","7X3uygdQsS","lsQGo4dEz6",
+"vkCHHLbRTH","mX2GEdQ586","fcJOybZLvS","RpBQmuLtKs","OUqFMzQt6Q","GWqqX8TxD7","SbRYyxReec","x3LDeP6bcg","taOXKHfyNQ","SjskQFVMxo",
+"vkCHHgjUTu","LewvMOUqFM","MezSWStlDJ","BbwgAWmadA","iwzGk9rlg9","CNHmvpWiOs","nlaBy7ku1p","Cfgr3K20wK","Ul4a1ZuDtD","x3LDeuLtKs",
+"pWiOsjeskS","SWfouJIqXi","RsQUqiB08l","Gv3FqAXpwE","hYBCKQssNC","WMiS3wDajX","NhXdut98iW","0Wr5yzHF1q","YjB9to8Uyd","MaJQsIRh48",
+"W7cTsbZLvS","t98iWRsQUq","2DREsHRxd8","iKqhrulk41","okgRijeskS","OUqFMoQ87r","L7cGcYh1hF","9XyT9HP433","FPfSEGrDg7","YOfrYYw2oU",
+"POUYSZuDtD","o8UydtvdkD","FGzgpNhXdu","VjCZqksJby","s47868RCUA","ZhwG19eoRc","okgRiPOUYS","Q6hMCTXQ0Z","gtCA5tAOsr","1v5hHwiHrZ",
+"uoStwix74r","ksJbyjS1aj","gdQsSJRJQB","cShY207n1c","QChxsM3zXL","QnJ1S0Kyfs","e6e4zpvgjS","B3qemP6bcg","IKxdL5iGN5","K4GS8QWxoT",
+"jfREuFGzgp","B3qem1v5hH","kB5nPDcpWB","ydG8U0ao3l","AgJHQVerEA","o8Uyd7lUXZ","CK5W7ZJTXH","lkMUAMkgy8","FcWrWUvlv4","uvf7AGXdoH",
+"7ku1pXyPZN","SmGzvOz8yZ","3weIFiB08l","aDGtSMmKGJ","blLA9he9IA","lpF6W5drc6","QYxC0DLhzM","iwzGkyluBx","okgRihi5X7","NOHszDG4sT",
+"RxrsmWaim6","uN6r3NcICA","jeskSZ4I1v","JkzUnxReec","Vprf2SjskQ","suY4xCNHmv","EdBKcoGu6x","WDVWJyluBx","C2Irc1v5hH","4QMc9BFkb8",
+"RkQkeMGlTF","9XyT9ydG8U","v2eC3Ul4a1","AkKTk5Namm","AkKTkReKEW","t98iW7ku1p","ksJbylkMUA","JXljWiqv4k","uoStw7fKYU","AIYUuCfgr3",
+"45cIHJIqXi","cL0aEiqv4k","Z4I1vfmIK1","9GXkXFcWrW","TwanoHfyNQ","RACujG1RhS","RACujRxrsm","i7WMQjeskS","o8Uyd5Namm","Z4I1vMm8si",
+"atef2Cp3mZ","uJScXlXFOB","1j5L8IRh48","PYBf4Ul4a1","Waim6tvdkD","x3LDeRmDcr","djsrvAmdQd","yEfy96AFT0","KZamH3weIF","Uvlv4CIShG",
+"Yw2oUhUTw7","Z4I1vUvlv4","hYBCKRkQke","k85AezqH0W","M6qcGvLsmS","JRJQBJKWYR","xReecLDk6f","CdyBVZv7z0","hYBCK55rfB","8cVD3K20wK",
+"KsjRK3weIF","bZLvSoVQp6","HzZT8zz4ZU","OUqFMHfyNQ","8FmFHdjsrv","zQt6Q9y4lw","RBhp0EOE1o","0Wr5yy94nw","NcICA9GXkX","XyPZNReKEW",
+"rKDLJ5Namm","9y4lwFNYIM","Chuy3cL0aE","ZUnqtlkMUA","OUqFMxciqp","lH1ktAgJHQ","JJs5mFnPFB","lCMxynnP8o","0BmCyi7WMQ","iqv4khE1Ql",
+"OUqFM7fsYM","M3zXLS77LH","t59lRiqv4k","gtCA5cmXIX","Ta8f60MR5X","v1HlngjUTu","AgJHQKr8ys","7X3uy4dEz6","HlUbFCqqaD","MmsIoyofH3",
+"n8pJ98FmFH","PYBf4JKWYR","uvf7AQClRL","1v5hH0PktI","lj07QNo0Qb","HRxd8WmadA","MezSWpiJSk","RxrsmAXpwE","MaJQsoVQp6","oQ87ro8Uyd",
+"AmdQdFnPFB","fcwDapvgjS","DcpWBKsjRK","lweGyHzZT8","ZuDtDyofH3","ThjNnNhXdu","oQ87ryEfy9","ix74rciuWz","Waim64QMc9","StlDJuJScX",
+"Q6hMCoVQp6","8FmFHh1zcH","J2mQiaFFss","gf8rIMmKGJ","9eoRcQWxoT","5nmWv16lHc","LbRTHOHaBz","o8UydFLsph","d7vjMCK5W7","i7WMQix74r",
+"NhXduulk41","29QAzjfREu","pAhR1BCxeC","NAFuwfcwDa","rhl0J1LB1L","6AFT0zHF1q","kZANmXyPZN","580YDd7vjM","5ZaEzd85a9","Q6LixRmDcr",
+"v1Hln45cIH","cQOnvydG8U","TXQ0ZMojnP","guMb85IhmG","5drc6DcpWB","uN6r3LewvM","8U2nUokgRi","JJs5mgjUTu","HP433Nxx9V","lkMUAYjB9t",
+"ulk41uJScX","2DREsEdBKc","euZA5YjB9t","uZPqgkB5nP","HlUbFv1Hln","blLA9hi5X7","uoStwQbxXc","5nmWvRACuj","k85AeYh1hF","AOgEeHzZT8",
+"7lUXZa00b5","AgJHQOUYuF","yEfy90YAGH","kB5nPVjCZq","MmsIo8TxD7","Yh1hFVBjhz","Yw2oUQWxoT","lsQGo2DREs","TCgPpWreyP","i3pydJJs5m",
+"UmaEvGSQwj","Yf2Ec9eoRc","zQt6Qlm0pD","WreyPBbwgA","CqqaDY1mC0","ni2v12Yz7E","J2mQiDLhzM","fcwDa7ku1p","WmadAMmKGJ","QYxC07X3uy",
+"lsQGoZzJHW","uTacxtlILt","dhSuHZUnqt","9XyT97X3uy","zqH0WMm8si","pFrrlhe9IA","WmadApvgjS","ZzJHWaFFss","suY4xYh1hF","RsQUqi3pyd",
+"ECMvUdpe1v","cmXIX2TRI7","m4bxUsqVrf","5Nammv8yFN","Mm8sie6e4z","Yh1hFMkgy8","StlDJlXFOB","zqH0WSjskQ","JJs5mogLgc","MmsIoPb1pa",
+"zz4ZUrKDLJ","lj07QIn3NS","d7vjMiqv4k","fLNg86AFT0","Ul4a1cmXIX","2hEEUuupzk","FGzgpZJTXH","8cVD3dpe1v","4W0TluZPqg","atef27ku1p",
+"xciqpJkzUn","X6PinyToGW","Gv3FqazIWp","L7cGcLbRTH","IRh48iwzGk","JkzUnTXQ0Z","zqH0Wm4bxU","WPmlxCK5W7","HP433k85Ae","oQ87rpmeCd",
+"CK5W7lj07Q","0ao3lprNT6","iKqhrThjNn","0PktIK4GS8","IjTwPvkCHH","hYBCKtlILt","pvgjSGSQwj","AIYUuQworu","5ZaEztl72W","Ss0ZuUlU3M",
+"Pb1payToGW","pT8wutl72W","pFrrlpWiOs","3weIF7ku1p","No0QbkB5nP","Mm8sikB5nP","SbRYylweGy","vLsmSzz4ZU","QClRLWmadA","ni2v1P6bcg",
+"ECMvUhi5X7","dhSuHF6PT2","C2IrcW7cTs","k85Aelj07Q","RzaZA1LB1L","YjB9t16lHc","dpe1vtl72W","Yw2oURkQke","cQOnvwiHrZ","ZuDtDDLhzM",
+"ThjNn7fKYU","FjHXRRxrsm","0ao3lzY1GY","CK5W7VNCPd","CdyBVMK07Y","KZamH16lHc","zQt6Ql83Ud","DLhzMWDVWJ","zz4ZUS77LH","WreyPaL6AJ",
+"Q6hMCbrhlQ","jfREuQ6Lix","5nmWviKqhr","Ta8f6WmadA","D6rBy0YAGH","5Mg9rQYxC0","nlaByFjHXR","bZLvS5Mg9r","zY1GYpWiOs","s7MxkP6bcg",
+"StlDJ8U2nU","suY4xdhSuH","FcWrWzQt6Q","MmKGJ7fKYU","xReecuPX7G","guMb8uJScX","RzaZAt98iW","faHirVjCZq","BpYhVNAFuw","Yh1hFdhSuH",
+"HzZT8uPX7G","Q6LixXyPZN","h1zcH8TxD7","2TRI745cIH","ReKEWhi5X7","s47868cVD3","b29RJ5ZaEz","QYxC09eoRc","HlUbFZzJHW","ksJbylXFOB",
+"AXpwEfmIK1","hYBCKWreyP","atef27fKYU","hYBCKCfgr3","uoStw14FLR","qQxHPqUJMd","rhl0J0MR5X","7ku1pQworu","1j5L8dQ586","CIShGi7WMQ",
+"5IhmGd7vjM","lXFOBjtn0X","StlDJgIYvE","gIYvEzmLYD","HzZT8GWqqX","IKxdLF6PT2","jSjS30Wr5y","D6rByRpBQm","pAhR1aL6AJ","hYBCKb29RJ",
+"MmKGJJkzUn","WMiS3FjHXR","FVMxogdQsS","jSjS3IjTwP","HlUbF16lHc","AIYUuaL6AJ","taOXKHRxd8","580YDPOUYS","5Mg9rzz4ZU","D6rByW7cTs",
+"DLhzM24ARF","580YDtl72W","pv0i7EOE1o","0ao3lo8Uyd","ZUnqtogLgc","uZPqgJRJQB","bgJAzFVMxo","jS1ajAIYUu","fqypy3weIF","JJs5mY1mC0",
+"ix74rMezSW","JIqXie6e4z","WDVWJlViBv","fcwDaQssNC","GSQwjulk41","qaofNWMiS3","VBjhzZUnqt","Uvlv4Uvlv4","9XyT9Oz8yZ","24ARFIKxdL",
+"55rfBQnJ1S","zqH0WK4GS8","pT8wuprNT6","oQ87rl83Ud","tl72WSs0Zu","VerEAAgJHQ","zFgtBzY1GY","zmLYDyofH3","FcWrW0YAGH","3weIFK20wK",
+"HzZT8uZPqg","FxX9qVjCZq","0ao3lAXpwE","zQt6QFwEJz","kZANmUmaEv","FNYIMJ2mQi","sqVrfm4bxU","vkCHHTCgPp","s93MllViBv","vOqCEwiHrZ",
+"Waim6v2eC3","5Mg9rKr8ys","FcWrWksJby","jeskSzbIYY","uoStwJIqXi","7fsYM29QAz","euZA5RmDcr","LbRTH3weIF","nlaByhi5X7","TXQ0ZMkgy8",
+"Yh1hF8U2nU","JJs5mS77LH","U3yw5n8pJ9","HRxd8580YD","POUYSWaim6","FNYIMgjUTu","0PktIa00b5","TCgPp5VZjS","JRJQBeuZA5","v1HlnoQ87r",
+"EoToPoQ87r","aL6AJQChxs","0Kyfsv1Hln","RmDcrv8yFN","FcWrWqQxHP","aez9yIRh48","24ARFuZPqg","SbRYyVIlwP","QYxC0he9IA","W7cTsWmadA",
+"29QAzn1pmO","ksJbyFVMxo","JkzUnOUYuF","lH1ktjeskS","uQIcz1LB1L","fLNg8VjCZq","iKqhrOHaBz","zqH0W0PktI","3otm6U3yw5","7X3uylkMUA",
+"55rfBQClRL","7hyVvQ6hMC","dpe1vpT8wu","okgRiSWfou","vLsmSLewvM","tuDySFxX9q","prNT6ThjNn","VjCZqRmDcr","WDVWJuvf7A","LewvM1j5L8",
+"8cVD3Cp3mZ","5nmWv0YAGH","QClRLCp3mZ","WmadAUvlv4","aFFssjSjS3","IBe8kS2Dfu","x3LDeQ6hMC","FPfSE580YD","bZLvSAkKTk","kB5nPCdyBV",
+"lkMUAThjNn","5Namm7X3uy","14FLR5VZjS","hE1QlDQimp","FnPFBuTacx","Yh1hFWMiS3","vLsmSVprf2","5VZjSjeskS","AmdQdQChxs","CdyBVWPmlx",
+"qQxHPGSQwj","atef2bgJAz","5VZjSvkCHH","Vprf2dmoS7","Yh1hFOxWIH","IBe8k2DREs","s4786Qworu","CqqaDNo0Qb","Mkgy8zHF1q","yEfy9WDVWJ",
+"lpF6W29QAz","7Ow5CWMiS3","9iGoTtaOXK","48cHLMGlTF","wiHrZUmaEv","O3iyQuQIcz","Cp3mZaDGtS","tlILtQClRL","RxrsmWMiS3","S77LHRpBQm",
+"RkQkeTa8f6","lpF6WSs0Zu","StlDJCdyBV","EoToPFVMxo","1LB1L0ao3l","POUYSb29RJ","YOfrYDcpWB","k85Ae0Wr5y","AIYUuRkQke","euZA57fKYU",
+"0PktItjQxs","5nmWvIBe8k","Oz8yZSmGzv","8FmFHi7WMQ","QworuCK5W7","HlUbFyEfy9","9y4lwd7vjM","zQt6Q07n1c","s4786jzUqR","brhlQPOUYS",
+"CK5W7VBjhz","atef2xReec","ZzJHWKr8ys","zbIYYVIlwP","QWxoTZ4I1v","QChxsLbRTH","In3NSjS1aj","bgJAzv8yFN","QWxoTBFkb8","yToGWcQOnv",
+"VIlwPn1pmO","hSSvQBCxeC","iB08l0BmCy","Cp3mZMK07Y","RmDcrguMb8","jfREuLDk6f","tAOsrjeskS","Z4I1vWMiS3","M6qcG0Wr5y","9rlg9o8Uyd",
+"9XyT9AXpwE","soy9tRzaZA","FhtglD6rBy","CIShGFxX9q","SmGzvPYBf4","lkMUAcShY2","16lHcyEfy9","soy9tWDVWJ","Mkgy8a00b5","suY4x0PktI",
+"HfyNQm4bxU","DG4sToGu6x","cShY2tuDyS","XyPZNMmsIo","wiHrZ4W0Tl","bgJAzKASQ8","cQOnvNcICA","9iGoT9iGoT","2TRI78hJdt","618DiGSQwj",
+"RzaZAlweGy","qUJMdgdQsS","zY1GYgdQsS","AIYUuhE1Ql","kZANm5ZaEz","AIYUu8xEKz","uJScXx3LDe","ni2v1qUJMd","SmGzvjtn0X","ZJTXH5iGN5",
+"ix74rxciqp","55rfBFGzgp","9rlg9IBe8k","2NslmKZamH","KZamHVerEA","s7Mxk5Namm","BbwgAdQ586","IKxdLFcWrW","v1HlnMkgy8","K20wK2Yz7E",
+"gdQsSxReec","OUqFM7hyVv","wDajX55rfB","ulk418U2nU","ydG8UAIYUu","uPX7G29QAz","580YDjS1aj","7fKYUIRh48","Cp3mZgjUTu","AIYUuYf2Ec",
+"NAFuwMK07Y","gdQsSdhSuH","0PktIlkMUA","580YDh1zcH","Cfgr3EdBKc","7X3uyUvlv4","618DizqH0W","LDk6f5iGN5","C2Ircb29RJ","lkMUA2Nslm",
+"0ao3lQbxXc","EdBKcqaofN","d85a92ZHdk","prNT6dmoS7","FxX9qzY1GY","CqqaDa00b5","zbIYYCdyBV","ReKEWZuDtD","QChxs9rlg9","i7WMQnlaBy",
+"MmsIoZ4I1v","2NslmKr8ys","W7cTsru4UG","hYBCKCqqaD","pvgjS8FmFH","blLA9fFDrJ","JJs5m3otm6","VLTy60Kyfs","jS1ajcShY2","SbRYy16lHc",
+"jS1ajvkCHH","uAWypBGaQY","lpF6WJIqXi","Vprf2b29RJ","XyPZNBbwgA","2DREsFNYIM","1j5L8F6PT2","UmaEvCdyBV","C2IrcC2Irc","Y1mC0NOHsz",
+"uN6r3tjQxs","AgJHQYf2Ec","ZJTXHFPfSE","nlaByuN6r3","KsjRKgtCA5","Ss0ZuSmGzv","wiHrZB3qem","Yf2EcFjHXR","zz4ZU9iGoT","Y1mC0AkKTk",
+"bZLvSYOfrY","pFrrlqQxHP","NhXduzHF1q","dhSuH24ARF","Yf2EcI7p2a","Yw2oU6AFT0","RzaZARxrsm","ix74rQ6Lix","piJSks7Mxk","sx5Gle6e4z",
+"Nxx9VJ2mQi","MmsIohUTw7","VBjhzaez9y","QssNCxReec","l83UdWaWsv","k85AeZUnqt","i7WMQoGu6x","fmIK1jSjS3","Yf2EcCdyBV","hYBCKMezSW",
+"i7WMQdmoS7","5IhmGv8yFN","CNHmvStlDJ","580YDFNYIM","EdBKcMojnP","pvgjSaDGtS","SjskQdhSuH","HzZT87hyVv","prNT6lm0pD","U3yw5s7Mxk",
+"HlUbFcL0aE","faHir14FLR","uLtKsn1pmO","EdBKcs7Mxk","AOgEe7fKYU","CxVEfRmDcr","Z4I1viwzGk","zHF1qxXTI4","xReecL7cGc","lkMUABGaQY",
+"SWfouGrDg7","DQimpOHaBz","QssNCL7cGc","NcICAbrhlQ","uN6r3yvOMI","faHirJRJQB","hSSvQjiVBP","XflUqF6PT2","BpYhVGrDg7","7X3uyx3LDe",
+"i3pydlkMUA","EOE1oNxx9V","8U2nUaez9y","8xEKz2Nslm","Oz8yZni2v1","0BmCynnP8o","zHF1qksJby","dmoS724ARF","aez9yKsjRK","nFqikBGaQY",
+"9eoRcTwano","0MR5XyToGW","4W0TlzqH0W","tAOsrUmaEv","pWiOs0Wr5y","hYBCKnFqik","k85Ae5nmWv","ix74r48cHL","faHirlkMUA","a00b5SWfou",
+"64s8Ndpe1v","l83UdQClRL","v8yFNC2Irc","Y1mC055rfB","Pb1pas93Ml","O3iyQOUYuF","hYBCKB3qem","MaJQsa00b5","ksJbyXflUq","v1HlnblLA9",
+"i7WMQ5IhmG","Ul4a1I7p2a","ru4UGgdQsS","D6rBymX2GE","oGu6xlH1kt","FGzgpFGzgp","Kr8ysWaWsv","Cfgr3jfREu","mX2GEEoToP","JJs5m4W0Tl",
+"rhl0JC2Irc","WreyPRACuj","WaWsv5nmWv","hSSvQd85a9","16lHcDLhzM","SjskQ48cHL","Ss0ZuLDk6f","5drc6DQimp","hE1Qluvf7A","CK5W79GXkX",
+"07n1cpFrrl","3otm6hi5X7","8U2nUEoToP","Chuy3uJScX","XflUqjtn0X","zFgtB16lHc","1j5L85ZaEz","14FLRAmdQd","5NammYjB9t","MmsIoCK5W7",
+"TCgPpFFDui","lH1ktDLhzM","Waim6JkzUn","blLA9IRh48","ru4UG3otm6","Ta8f6uAWyp","RzaZA9y4lw","CxVEfvLsmS","QWxoTTCgPp","IKxdLStlDJ",
+"8FmFHaL6AJ","nFqikBCxeC","Dz1R32Nslm","MGlTFfLNg8","Uvlv4hE1Ql","StlDJWPmlx","zHF1qDcpWB","M3zXLv8yFN","5drc68RCUA","RsQUqXyPZN",
+"hSSvQMojnP","yEfy9oVQp6","iwzGktuDyS","uQIcztAOsr","s4786Q6hMC","No0Qb8xEKz","yEfy9wiHrZ","JkzUnRsQUq","uPX7Gk85Ae","8hJdt55rfB",
+"jiVBPUlU3M","ru4UGSjskQ","O3iyQWMiS3","Ta8f6WDVWJ","07n1cogLgc","uLtKswDajX","lCMxyP6bcg","0h1b1EOE1o","nnP8oKZamH","CNHmvWMiS3",
+"DG4sTdpe1v","580YDW7cTs","gdQsSSWfou","0ao3lgjUTu","cQOnvRBhp0","0BmCyqUJMd","W3VFHBGaQY","1v5hHlH1kt","qQxHPbZLvS","lpF6Wv2eC3",
+"8U2nUtjQxs","zY1GYvkCHH","07n1cSbRYy","cShY2CNHmv","5iGN5Oz8yZ","W7cTsM3zXL","ksJbyzFgtB","DQimpuJScX","lj07QPOUYS","5Mg9rb29RJ",
+"Ta8f6Nxx9V","h1zcH5ZaEz","uN6r3Vprf2","29QAz8cVD3","WaWsvjSjS3","0h1b1ydG8U","jzUqRZUnqt","Z4I1vQ6hMC","Oz8yZwiHrZ","e6e4zjS1aj",
+"0ao3ldQ586","ulk41euZA5","VjCZqQnJ1S","GWqqXpv0i7","VerEAdpe1v","jfREuWmadA","I7p2aRxrsm","RBhp0lj07Q","K4GS8fLNg8","CdyBVl83Ud",
+"gIYvE14FLR","v8yFNcmXIX","5Drn0v8yFN","8U2nU618Di","55rfBVerEA","xXTI4FcWrW","StlDJ1LB1L","07n1cgf8rI","guMb8rz7Ut","8RCUAThjNn",
+"jiVBP7X3uy","Gv3FqWMiS3","lkMUAlCMxy","7X3uyoGu6x","580YDKr8ys","O3iyQulk41","5NammEoToP","FxX9qX6Pin","KsjRK3otm6","1j5L8SWfou",
+"Mm8si2hEEU","5IhmGt98iW","cL0aElweGy","QworuFwEJz","gtCA52hEEU","In3NSJkzUn","yvOMIEdBKc","2ZHdkprNT6","5iGN5NcICA","5Drn0nFqik",
+"tjQxsm4bxU","MezSWyToGW","6AFT0zz4ZU","7lUXZHzZT8","v2eC3YjB9t","tl72WAXpwE","VLTy6IBe8k","v1Hlnd7vjM","YOfrYQ6Lix","CqqaDFjHXR",
+"ru4UGkB5nP","ix74rt59lR","djsrvhE1Ql","vOqCEReKEW","0PktInnP8o","M3zXLjfREu","a00b5BpYhV","8RCUANhXdu","tl72WdhSuH","9y4lwVIlwP",
+"4dEz6pmeCd","1v5hH7Ow5C","qUJMdOUYuF","6q6L9SjskQ","TwanozmLYD","ECMvU7fKYU","euZA50YAGH","Yw2oUOUYuF","FxX9qwiHrZ","k85AenlaBy",
+"FGzgpWaWsv","pv0i7Oz8yZ","CqqaDVIlwP","XyPZNhi5X7","7Ow5CuTacx","kB5nPLbRTH","2DREsciuWz","YOfrYlCMxy","MojnPM6qcG","4W0Tlni2v1",
+"B3qem5Namm","n8pJ9atef2","dpe1vsx5Gl","iB08lWMiS3","MGlTF3otm6","fcwDaYf2Ec","ZJTXHECMvU","ru4UGNhXdu","cQOnvjfREu","5drc6Ul4a1",
+"d7vjMdjsrv","D6rByfmIK1","Y1mC0yofH3","FjHXRCNHmv","MmsIoSWfou","ulk41Mkgy8","jzUqRWDVWJ","zY1GYiwzGk","soy9tprNT6","GXdoHxReec",
+"cmXIX07n1c","In3NSksJby","Nxx9VThjNn","cShY2cmXIX","ciuWzZhwG1","64s8NfLNg8","FxX9qsoy9t","ydG8UFVMxo","tl72WPb1pa","D6rBym4bxU",
+"QYxC007n1c","Q6Lix2Yz7E","LbRTHAgJHQ","TwanoGrDg7","Chuy33weIF","gf8rIJXljW","Zv7z0aDGtS","wiHrZUvlv4","8cVD3FjHXR","BFkb8K20wK",
+"Mm8siQWxoT","Mm8sijzUqR","WaWsvTwano","zFgtBYOfrY","45cIH5IhmG","RkQkejSjS3","iKqhrZhwG1","J2mQizz4ZU","J2mQixXTI4","Yf2Ec2Nslm",
+"qUJMd8xEKz","24ARFpv0i7","14FLR5drc6","hi5X7DQimp","fcwDaEOE1o","AgJHQaez9y","dpe1vokgRi","4W0TlfaHir","wiHrZK4GS8","mz8gxWaWsv",
+"QbxXcru4UG","lweGydhSuH","oVQp62TRI7","DLhzM7Ow5C","QnJ1S9iGoT","Nxx9V0h1b1","jSjS3RsQUq","SWfou55rfB","y94nwoQ87r","ZJTXHBFkb8",
+"hi5X7EdBKc","RsQUqK20wK","d7vjMtl72W","iB08liqv4k","xciqprKDLJ","GSQwjSjskQ","DG4sT4W0Tl","gIYvESs0Zu","O3iyQzY1GY","ZJTXHLDk6f",
+"Q6hMCn1pmO","Mm8siThjNn","iKqhrXflUq","lCMxyYh1hF","O3iyQ3weIF","Kr8ysdjsrv","PYBf4Q6hMC","ix74rJXljW","tvdkDYOfrY","nlaBynFqik",
+"FVMxoNOHsz","Yw2oUjzUqR","pAhR15Mg9r","iqv4kaez9y","Ss0ZuBpYhV","b29RJpiJSk","fcwDa48cHL","mX2GEni2v1","gtCA5yluBx","gf8rIIBe8k",
+"MaJQs8RCUA","ru4UGydG8U","Z4I1vFFDui","5Drn0UlU3M","NAFuwzmLYD","CxVEfgjUTu","FVMxoFLsph","45cIHX6Pin","JIqXi8FmFH","zQt6QpAhR1",
+"taOXK9eoRc","uupzki7WMQ","Mm8siYf2Ec","SmGzvm4bxU","WPmlxFVMxo","ZuDtDCqqaD","kZANmQ6hMC","l83Ud618Di","Ss0ZuNo0Qb","MmKGJs4786",
+"t98iWpFrrl","qUJMd2ZHdk","Waim6NOHsz","Mm8siG1RhS","uTacxAkKTk","tAOsr9eoRc","zmLYDTCgPp","0MR5X5VZjS","pmeCdVerEA","wDajXK20wK",
+"ogLgcWaWsv","he9IAlkMUA","vLsmSm4bxU","RxrsmKZamH","gIYvEWreyP","1j5L80h1b1","lj07QTXQ0Z","5Namm8RCUA","s93MlMaJQs","AIYUuvkCHH",
+"lm0pDGWqqX","IjTwPZuDtD","0Kyfs1j5L8","n8pJ914FLR","DG4sTokgRi","CqqaDFLsph","bgJAzBCxeC","HP433VIlwP","8U2nUnnP8o","fmIK1Ta8f6",
+"GXdoH7fKYU","In3NSlsQGo","fLNg829QAz","45cIHMkgy8","cL0aERzaZA","P6bcg0PktI","Oz8yZXyPZN","07n1ctuDyS","HfyNQGSQwj","JkzUn9eoRc",
+"qUJMdU3yw5","n1pmOs4786","h1zcH580YD","In3NSsx5Gl","K4GS8QClRL","RmDcrZv7z0","nnP8olViBv","ZUnqtoGu6x","uN6r39rlg9","M3zXLiwzGk",
+"0Wr5ym4bxU","JXljWI7p2a","RACujAmdQd","rKDLJVprf2","AmdQd29QAz","W3VFHLewvM","yluBxl83Ud","5Drn05Drn0","In3NSulk41","zz4ZUtuDyS",
+"Ta8f6k85Ae","SjskQ2TRI7","uQIczy94nw","uLtKstvdkD","JKWYRnlaBy","Kr8ys5nmWv","DcpWB8hJdt","lXFOBeuZA5","NAFuwW3VFH","9GXkXksJby",
+"x3LDeB3qem","9GXkXCNHmv","pT8wu5ZaEz","OUqFMECMvU","ksJbye6e4z","0ao3l45cIH","K20wKFwEJz","zFgtB0MR5X","1LB1L2Yz7E","sx5GlaDGtS",
+"v2eC3gdQsS","wDajXW3VFH","uN6r3uZPqg","Gv3Fq16lHc","JRJQBfcwDa","pv0i7a00b5","2TRI7VNCPd","VerEAi7WMQ","piJSk618Di","fFDrJNo0Qb",
+"14FLRzQt6Q","Z4I1vJKWYR","Ss0ZudmoS7","WreyPoQ87r","Ss0Zutl72W","NcICAG1RhS","uJScXMezSW","h1zcHyluBx","MojnPnlaBy","48cHLQbxXc",
+"lweGyCK5W7","WmadA0BmCy","NAFuwru4UG","lH1ktMK07Y","uAWyp5Namm","vkCHHqQxHP","FnPFBJIqXi","Oz8yZiwzGk","RsQUq9iGoT","RxrsmcmXIX",
+"Ss0ZuQbxXc","s4786NOHsz","7X3uyS77LH","lsQGoK20wK","VIlwPfLNg8","X6PinOHaBz","jiVBPuLtKs","HP433okgRi","KZamHhE1Ql","aez9yZUnqt",
+"FxX9quPX7G","pvgjSpFrrl","tAOsrt59lR","NhXdunlaBy","tlILt0Kyfs","24ARFDz1R3","GWqqXCNHmv","RxrsmRACuj","AOgEeAIYUu","MK07YazIWp",
+"9iGoTPOUYS","xXTI4P6bcg","5NammNOHsz","jeskS0h1b1","yvOMIlm0pD","hSSvQCIShG","IRh48DG4sT","BGaQY5nmWv","uAWypuZPqg","gdQsSNAFuw",
+"2hEEUReKEW","JJs5mRBhp0","tvdkD64s8N","MK07YRsQUq","azIWpUmaEv","jeskSVIlwP","F6PT25Mg9r","XflUqsx5Gl","NhXdud7vjM","Z4I1vgdQsS",
+"gdQsSIn3NS","3weIF8hJdt","Y1mC0CdyBV","zbIYYLbRTH","5Drn0piJSk","sqVrfjeskS","hUTw729QAz","1LB1Lv8yFN","cQOnviB08l","Mkgy8uoStw",
+"ZJTXH7hyVv","9XyT9pT8wu","hi5X7lH1kt","OxWIHS2Dfu","HlUbFhe9IA","QChxsn1pmO","aL6AJPb1pa","o8UydYh1hF","4W0Tlmz8gx","BCxeC5iGN5",
+"7fKYU4W0Tl","piJSkVjCZq","XyPZNb29RJ","FVMxo3otm6","RACujzHF1q","tl72WZv7z0","7hyVvhYBCK","GrDg7uQIcz","3otm6CdyBV","nFqikJRJQB",
+"UlU3MStlDJ","zFgtBUvlv4","5drc6JJs5m","K20wKJRJQB","U3yw5e6e4z","uLtKsCNHmv","fqypysx5Gl","TXQ0ZHP433","0Wr5yOUYuF","EoToPy94nw",
+"RpBQm9eoRc","Mkgy8EoToP","5IhmGaDGtS","n8pJ9zmLYD","gjUTuRxrsm","RsQUqzQt6Q","fqypyIKxdL","1v5hHQworu","5drc648cHL","ZuDtDRACuj",
+"9rlg9yEfy9","yluBxUmaEv","ni2v1i3pyd","Uvlv4ksJby","DQimpcmXIX","zqH0Whi5X7","ZJTXH55rfB","QbxXcqUJMd","Cp3mZlsQGo","Cp3mZsuY4x",
+"KZamHBCxeC","zQt6QHP433","Mm8siQworu","Ta8f6soy9t","faHirdmoS7","fcJOyVNCPd","ydG8UjSjS3","vLsmSAXpwE","Chuy32hEEU","B3qemRkQke",
+"BpYhVnlaBy","jiVBPNOHsz","blLA9Yh1hF","OHaBz3weIF","0Wr5y5VZjS","bgJAzsuY4x","7X3uyQ6Lix","cShY2WPmlx","In3NSzHF1q","tlILtdhSuH",
+"a00b5hi5X7","7fsYMlkMUA","iwzGkEoToP","rKDLJhSSvQ","dhSuHQssNC","sx5GlyToGW","MezSW9iGoT","s93MlW7cTs","fqypyzqH0W","RmDcrdmoS7",
+"U3yw5ydG8U","Yh1hF3otm6","FNYIMOz8yZ","uQIczzFgtB","rKDLJyvOMI","yEfy9lm0pD","lH1kttvdkD","B3qemlkMUA","StlDJfmIK1","bZLvSECMvU",
+"9XyT9ni2v1","KsjRKkB5nP","d7vjMksJby","KsjRKRkQke","FwEJzIjTwP","2DREsB3qem","MGlTFWaWsv","QWxoTQnJ1S","s7Mxk1j5L8","Pb1pa5Mg9r",
+"rhl0J0BmCy","KZamHMkgy8","rz7Ut4dEz6","7ku1pJIqXi","pT8wuguMb8","M3zXLlm0pD","qQxHP5IhmG","hi5X7gjUTu","v8yFNQ6Lix","Kr8ysHP433",
+"LbRTHHP433","bZLvSuN6r3","x3LDeoQ87r","jiVBP5VZjS","lXFOBECMvU","MezSWAXpwE","wDajXaez9y","5Drn08FmFH","QworuHRxd8","RACujZzJHW",
+"e6e4zSjskQ","Yf2EcTXQ0Z","dQ586IKxdL","FnPFBksJby","d7vjMQChxs","AXpwE14FLR","K20wKt98iW","OUqFM45cIH","Dz1R3MmsIo","zqH0WGXdoH",
+"vOqCEAmdQd","cShY2qQxHP","vkCHHOxWIH","ECMvUKZamH","wiHrZhi5X7","9rlg9lCMxy","k85Ae618Di","kB5nPuZPqg","uQIczpv0i7","lCMxyKASQ8",
+"lH1ktHRxd8","WMiS3AkKTk","vkCHHiqv4k","x3LDeBpYhV","WDVWJdQ586","IBe8kxciqp","ydG8UC2Irc","XyPZNzY1GY","QnJ1SZv7z0","MaJQsY1mC0",
+"iKqhrfcJOy","kZANmaL6AJ","CNHmvIBe8k","fqypyatef2","hUTw72ZHdk","M3zXLEoToP","FVMxoGSQwj","7ku1pbZLvS","hi5X7RsQUq","ECMvUQworu",
+"sqVrffFDrJ","pT8wu1j5L8","M3zXLfqypy","zQt6QyofH3","8FmFHUlU3M","9rlg9IRh48","iqv4k64s8N","uLtKs2Yz7E","zQt6QfcJOy","hUTw7EOE1o",
+"FPfSEIRh48","RACuj7hyVv","4QMc9Ta8f6","JKWYRatef2","hE1QlEoToP","xReecwiHrZ","HfyNQcQOnv","zqH0WFjHXR","fLNg8Ta8f6","GWqqX8U2nU",
+"7fsYMVerEA","v8yFN7hyVv","aL6AJ24ARF","xReecdQ586","55rfBTCgPp","kB5nPdpe1v","oGu6x9XyT9","5Mg9rzqH0W","v1HlnPb1pa","CIShGSWfou",
+"EoToPt98iW","EoToPsuY4x","Cp3mZqaofN","AkKTkoQ87r","TwanoRxrsm","ECMvU7lUXZ","azIWpDLhzM","Ss0ZubrhlQ","DLhzMtaOXK","fcwDaZuDtD",
+"Q6hMCOxWIH","dhSuHpAhR1","J2mQiWMiS3","0YAGH4QMc9","AkKTkVIlwP","wDajXRpBQm","lViBvNOHsz","t59lR6q6L9","FGzgpFNYIM","29QAz1j5L8",
+"qQxHP5ZaEz","G1RhSaL6AJ","AOgEev1Hln","W7cTsvLsmS","Oz8yZatef2","b29RJQssNC","0ao3l1LB1L","QChxsuPX7G","55rfBi3pyd","bZLvSiB08l",
+"tvdkDKASQ8","BFkb8b29RJ","azIWppWiOs","i7WMQKr8ys","IRh48EdBKc","FGzgpBpYhV","0MR5X618Di","brhlQEdBKc","U3yw5Gv3Fq","Oz8yZWMiS3",
+"ECMvUCp3mZ","blLA9Ta8f6","VIlwPyluBx","DQimplXFOB","ZhwG1nnP8o","7X3uy7fKYU","B3qem8cVD3","KASQ8P6bcg","atef2ZhwG1","JIqXiTwano",
+"h1zcHNOHsz","Zv7z0FLsph","brhlQCqqaD","yofH3FxX9q","jiVBPU3yw5","W7cTs5nmWv","FhtgljSjS3","XyPZNBCxeC","0MR5XY1mC0","QClRLyEfy9",
+"In3NSVNCPd","8cVD3RmDcr","G1RhSfFDrJ","I7p2aMmKGJ","WMiS3zz4ZU","5Drn0dmoS7","5Drn0StlDJ","W3VFHnlaBy","2ZHdkcmXIX","yvOMIRsQUq",
+"Yw2oU9rlg9","RsQUqJKWYR","yvOMI0YAGH","ZuDtDCK5W7","XyPZN7lUXZ","iwzGkMkgy8","iwzGkAgJHQ","9XyT9tuDyS","Pb1pas4786","Ta8f6RBhp0",
+"qQxHPAkKTk","9rlg9WaWsv","IjTwPd85a9","fcJOyGv3Fq","6AFT09eoRc","QssNCGrDg7","0PktIzHF1q","3otm65iGN5","hE1Qln8pJ9","48cHLpv0i7",
+"Y1mC0FjHXR","JJs5mlkMUA","0BmCyCxVEf","UlU3Matef2","EoToP1v5hH","OUqFMuoStw","QWxoTzqH0W","AXpwEuTacx","Ul4a1hi5X7","WPmlxX6Pin",
+"DQimpvOqCE","iqv4kazIWp","0ao3lChuy3","zHF1qVNCPd","fcwDaqUJMd","24ARFfmIK1","Mm8siuPX7G","W7cTsdmoS7","nFqikyToGW","soy9t5iGN5",
+"nnP8oEOE1o","m4bxUYw2oU","taOXKoVQp6","oVQp6oVQp6","IBe8kx3LDe","J2mQiMK07Y","0BmCy2Nslm","RzaZAuJScX","k85AepvgjS","dQ586RsQUq",
+"Y1mC0oQ87r","zFgtB2DREs","lH1ktHP433","RsQUqEOE1o","FwEJzDG4sT","iKqhrCIShG","16lHcSbRYy","wDajXsuY4x","fmIK1Mkgy8","DG4sToVQp6",
+"J2mQi7hyVv","CqqaDS2Dfu","ydG8U1v5hH","jfREu5nmWv","rz7UtDz1R3","JJs5m0h1b1","dpe1vIBe8k","QChxsWPmlx","4dEz6HzZT8","jzUqRni2v1",
+"lkMUA0MR5X","SWfou4QMc9","jiVBPMmKGJ","l83UdWDVWJ","DG4sT7fsYM","aez9yI7p2a","ni2v1v2eC3","Yh1hFiKqhr","WreyPMmsIo","OUYuFWPmlx",
+"i3pydAXpwE","BGaQY48cHL","GSQwjt98iW","NOHszO3iyQ","jiVBPlViBv","QssNC0YAGH","GrDg7aFFss","cL0aEcmXIX","uPX7GY1mC0","lsQGoB3qem",
+"8FmFHfLNg8","618DiJKWYR","cmXIXgtCA5","uJScXjfREu","GWqqXn8pJ9","ru4UG1LB1L","JKWYRCp3mZ","zHF1q2Nslm","9GXkXMojnP","WMiS39y4lw",
+"tuDySQworu","VIlwPiB08l","rKDLJHP433","tjQxsciuWz","uAWyptl72W","9XyT9WMiS3","ZuDtDcShY2","KsjRKW3VFH","Q6Lixix74r","Pb1pazz4ZU",
+"8U2nUMGlTF","euZA5piJSk","J2mQiksJby","2TRI7QClRL","DLhzMFPfSE","AXpwE9eoRc","UlU3MsqVrf","FxX9qMmsIo","faHirx3LDe","29QAzpmeCd",
+"6AFT0C2Irc","o8Uydrz7Ut","0h1b1ix74r","ZUnqtAIYUu","TCgPpcQOnv","9GXkXZJTXH","8cVD3WPmlx","dQ586hi5X7","he9IAciuWz","6q6L9rz7Ut",
+"mX2GE9iGoT","9eoRcWPmlx","blLA9wDajX","2hEEUGWqqX","ulk41atef2","ZJTXHs93Ml","aez9yZv7z0","uAWyp3weIF","7X3uytlILt","9XyT9lViBv",
+"FGzgplH1kt","O3iyQTwano","yToGWulk41","pT8wuRkQke","OxWIHiwzGk","XflUqaDGtS","HRxd8uZPqg","i3pydyToGW","9eoRcXflUq","VIlwPD6rBy",
+"v2eC3F6PT2","7Ow5C2DREs","7hyVv45cIH","SbRYyeuZA5","HlUbFa00b5","NAFuwrhl0J","Z4I1vbgJAz","5IhmGOUYuF","vkCHHIRh48","JRJQB2Yz7E",
+"9XyT9ogLgc","uupzk16lHc","lpF6Wmz8gx","pWiOsCxVEf","WmadApAhR1","fcJOyO3iyQ","CdyBVFcWrW","IRh48s93Ml","nnP8oRxrsm","pFrrlVerEA",
+"vOqCEOz8yZ","7Ow5Ct59lR","6q6L90Wr5y","QChxsD6rBy","DLhzMMkgy8","pv0i7YjB9t","MmKGJyluBx","4W0TlEOE1o","Dz1R3NcICA","uZPqgXyPZN",
+"W3VFHjSjS3","gjUTusx5Gl","WmadASjskQ","WmadAaDGtS","FNYIMQChxs","uPX7GtaOXK","HzZT8WDVWJ","OxWIHlCMxy","bgJAzdpe1v","5nmWvYf2Ec",
+"pT8wu2ZHdk","x3LDeeuZA5","7lUXZQssNC","AIYUuVprf2","QClRL4QMc9","GWqqXTa8f6","tl72WIBe8k","gjUTuhi5X7","piJSkCqqaD","KASQ82TRI7",
+"JXljWatef2","CdyBVlXFOB","oVQp6hE1Ql","v1HlnWPmlx","pT8wuiwzGk","suY4x9y4lw","LewvMZzJHW","taOXKWMiS3","Ta8f6aDGtS","RBhp0Yw2oU",
+"ulk41DLhzM","9XyT9lH1kt","dpe1vhi5X7","Q6LixaL6AJ","ZzJHWRxrsm","jtn0Xulk41","55rfBVprf2","5nmWvKZamH","CNHmvdjsrv","W7cTsEoToP",
+"hYBCKlCMxy","J2mQit59lR","GSQwjHfyNQ","uTacxEOE1o","HRxd8IjTwP","Zv7z0uPX7G","euZA5fmIK1","uZPqgtuDyS","fcwDa0h1b1","Ul4a1hUTw7",
+"B3qemlXFOB","CIShG7ku1p","BCxeCChuy3","rKDLJuvf7A","NhXdu5Namm","Uvlv4PYBf4","kB5nPWaWsv","CK5W7OUYuF","1j5L8zY1GY","7lUXZzQt6Q",
+"vkCHHVerEA","Oz8yZSbRYy","RxrsmYw2oU","tjQxs4W0Tl","taOXKcL0aE","WreyP7fsYM","guMb8x3LDe","brhlQkB5nP","8xEKz1v5hH","s7MxkyofH3",
+"0YAGHHfyNQ","Yh1hF64s8N","RsQUqdQ586","BpYhVW3VFH","oGu6xhi5X7","LbRTHBGaQY","WmadAZJTXH","BbwgAfFDrJ","JIqXid85a9","QClRLZUnqt",
+"8hJdtFLsph","9GXkX0ao3l","FNYIM3weIF","WmadAoGu6x","jtn0XRsQUq","mz8gxlViBv","oGu6xNo0Qb","LDk6fCK5W7","2hEEUBFkb8","hi5X7SbRYy",
+"fLNg82ZHdk","hUTw7hi5X7","CqqaDgtCA5","M3zXLFxX9q","zY1GYxReec","faHirK20wK","FjHXRdmoS7","n1pmOKASQ8","2ZHdkJRJQB","8U2nUfmIK1",
+"HP4339XyT9","DLhzM7fsYM","9GXkXNAFuw","MmKGJyEfy9","1v5hHpT8wu","D6rBySbRYy","X6PinTXQ0Z","KASQ8QssNC","uoStwsuY4x","zz4ZUFLsph",
+"fmIK1QbxXc","kB5nPjiVBP","VIlwPlpF6W","Chuy3JKWYR","qQxHP16lHc","0BmCyPb1pa","9rlg9tvdkD","2Yz7E07n1c","LDk6fECMvU","AmdQdpFrrl",
+"pFrrlTXQ0Z","lj07QYf2Ec","8cVD3VLTy6","Vprf2KASQ8","cShY2iqv4k","uvf7Aatef2","gjUTu4dEz6","vLsmSOz8yZ","5ZaEz5nmWv","FFDuiIRh48",
+"lkMUAhi5X7","vOqCEpWiOs","0KyfsoVQp6","i3pydOUqFM","d7vjMnlaBy","gtCA5pFrrl","Waim6AOgEe","guMb8JIqXi","cShY2nlaBy","MojnPv8yFN",
+"HRxd8zY1GY","k85AeHfyNQ","iqv4kxReec","YOfrYogLgc","gIYvEsuY4x","dhSuHFNYIM","W7cTscShY2","dQ586uoStw","bZLvSQClRL","M6qcGVerEA",
+"okgRiYh1hF","X6PinyluBx","LbRTHv8yFN","Q6Lix7fKYU","Y1mC0aFFss","Cp3mZdhSuH","lweGyHfyNQ","QChxsi7WMQ","uN6r3ZuDtD","XyPZNXyPZN",
+"bZLvSCdyBV","KZamHxciqp","2hEEU5ZaEz","xciqpLbRTH","Yh1hFuQIcz","iB08lFwEJz","0BmCyWmadA","2DREsLbRTH","0BmCyRkQke","ru4UG9y4lw",
+"8hJdtpmeCd","lCMxycmXIX","euZA5oVQp6","cL0aE1j5L8","VerEAni2v1","CNHmvQ6hMC","lkMUAQWxoT","gf8rITwano","WDVWJSjskQ","C2IrcFNYIM",
+"lweGy3weIF","m4bxUPOUYS","BbwgA45cIH","TCgPp8U2nU","zbIYYPYBf4","POUYSuTacx","Chuy3Kr8ys","Q6hMCh1zcH","0BmCyTa8f6","OUqFMuTacx",
+"aez9y5Mg9r","v1HlnfaHir","Vprf2nnP8o","Nxx9VRBhp0","KASQ8JXljW","qaofNDQimp","3otm6YjB9t","F6PT2tvdkD","sx5Glo8Uyd","FPfSEHzZT8",
+"nlaByYf2Ec","tl72WCfgr3","qQxHPRBhp0","Mkgy8NcICA","lm0pDiB08l","d7vjMlm0pD","blLA9AgJHQ","hUTw7FLsph","yToGWTwano","UmaEvFcWrW",
+"RpBQmMm8si","nlaBylkMUA","Nxx9VRxrsm","DG4sTCxVEf","AIYUudpe1v","5ZaEzS2Dfu","K20wKVjCZq","d85a9ciuWz","Q6LixUl4a1","2TRI7cL0aE",
+"FhtglRxrsm","gtCA5b29RJ","QClRLxReec","FPfSE4dEz6","CxVEf8hJdt","fFDrJS77LH","hSSvQhi5X7","QworutjQxs","8RCUA45cIH","0YAGHJIqXi",
+"IKxdLgIYvE","5ZaEzFcWrW","LbRTHyToGW","cL0aEVjCZq","qQxHPFVMxo","JJs5mbgJAz","okgRisx5Gl","Mm8sizQt6Q","CK5W7FnPFB","zbIYYOz8yZ",
+"YjB9tTwano","NhXduxReec","24ARFgdQsS","YOfrYSmGzv","CqqaDkB5nP","TXQ0Z2TRI7","QChxsuQIcz","zY1GYGXdoH","ix74ruJScX","lsQGo14FLR",
+"VBjhzW3VFH","oQ87rGv3Fq","s7Mxkuupzk","CxVEfW3VFH","7hyVvy94nw","ReKEWDQimp","AXpwENo0Qb","t59lRMmKGJ","QClRL5drc6","azIWpWaim6",
+"zFgtBi7WMQ","KsjRK7ku1p","Mm8si24ARF","BpYhVMmsIo","atef2XyPZN","Ta8f6NcICA","MojnPrhl0J","8TxD7VjCZq","CNHmvQssNC","NOHszlm0pD",
+"sqVrfFNYIM","5VZjSK20wK","uQIcz0ao3l","CK5W7QnJ1S","64s8N8RCUA","NOHszMojnP","e6e4zYh1hF","kZANmFLsph","tvdkDPb1pa","Zv7z0uupzk",
+"Mm8siLDk6f","qUJMduJScX","uN6r3zY1GY","ru4UGQChxs","BFkb8bZLvS","AgJHQUmaEv","taOXKgjUTu","NOHszLDk6f","uZPqg618Di","W3VFH0Kyfs",
+"JKWYRoVQp6","aFFssnFqik","SmGzvlsQGo","aez9yv2eC3","lj07QJJs5m","sx5GlHfyNQ","ZUnqt5IhmG","RzaZAtaOXK","AkKTkIjTwP","55rfBblLA9",
+"M3zXLlXFOB","OUYuFRpBQm","wiHrZjS1aj","WDVWJrz7Ut","zHF1qSWfou","okgRiMojnP","fLNg8WaWsv","55rfB8FmFH","FNYIMazIWp","he9IAVprf2",
+"JIqXicQOnv","b29RJnnP8o","3weIF2TRI7","ECMvUqUJMd","EoToPrhl0J","DLhzMhE1Ql","618DiMezSW","FGzgpwiHrZ","5Drn0KZamH","WMiS355rfB",
+"pFrrlhYBCK","prNT6qUJMd","2hEEUiwzGk","64s8NpFrrl","kZANmpvgjS","Waim6RsQUq","VIlwPnlaBy","vLsmSTCgPp","bgJAzJKWYR","IKxdLFxX9q",
+"Mm8siuoStw","KZamHpAhR1","X6PinKZamH","580YD0BmCy","nnP8okB5nP","y94nwaDGtS","ReKEWPYBf4","uQIcz8RCUA","cShY2RkQke","n1pmOQnJ1S",
+"Mm8sikZANm","i3pydqaofN","5NammWDVWJ","ni2v1G1RhS","FhtglMmsIo","AOgEeRxrsm","5nmWvm4bxU","Mm8siWreyP","zHF1qIjTwP","Q6hMCYw2oU",
+"he9IAAXpwE","yofH35ZaEz","6q6L9DcpWB","uN6r36AFT0","uN6r3uN6r3","FGzgpGXdoH","xciqpFhtgl","Z4I1v48cHL","zQt6Qjtn0X","Pb1paxReec",
+"5Mg9rnlaBy","ix74rsoy9t","d7vjM4dEz6","Cfgr3OHaBz","pFrrlzqH0W","DQimpd85a9","0Kyfs9eoRc","kB5nPLDk6f","MojnPM3zXL","suY4xB3qem",
+"M6qcGjzUqR","Cp3mZnlaBy","WDVWJjtn0X","jtn0XMmKGJ","14FLRxReec","VjCZqzmLYD","FLsphLDk6f","OUYuFrKDLJ","KZamHZUnqt","IBe8kTCgPp",
+"K20wKMezSW","0YAGHLDk6f","Chuy3POUYS","yvOMIuupzk","8FmFHNOHsz","ogLgcQssNC","CqqaDvOqCE","0ao3lnlaBy","GSQwjhi5X7","X6PinMGlTF",
+"K4GS8CIShG","mX2GEHzZT8","Q6Lix0Kyfs","0PktIDG4sT","580YDaFFss","zz4ZU24ARF","t98iWtlILt","yofH30BmCy","9eoRcW3VFH","hYBCKlpF6W",
+"kZANm2hEEU","brhlQxXTI4","5VZjSlj07Q","dmoS7ZzJHW","RACujEdBKc","29QAzsuY4x","MojnPxciqp","ru4UGi3pyd","2Yz7EZzJHW","Z4I1vbrhlQ",
+"jtn0Xi7WMQ","FcWrW8xEKz","pWiOsi7WMQ","gf8rItl72W","29QAz55rfB","GXdoHWMiS3","tvdkDfLNg8","MezSWQWxoT","LewvMQworu","guMb8gdQsS",
+"GXdoHStlDJ","ECMvUHlUbF","2DREsJ2mQi","VIlwPF6PT2","oVQp6TXQ0Z","LewvM618Di","Q6hMCNhXdu","vLsmSvOqCE","t59lRI7p2a","lsQGoTCgPp",
+"Dz1R3EOE1o","jiVBPhSSvQ","MGlTFFxX9q","wiHrZ7lUXZ","G1RhSGXdoH","RzaZAPb1pa","ZuDtDCp3mZ","d7vjMsqVrf","uvf7AoGu6x","uJScXoGu6x",
+"FnPFBHP433","VBjhzDQimp","hi5X7VjCZq","2TRI716lHc","tuDyS8U2nU","m4bxUa00b5","MGlTFP6bcg","JkzUniKqhr","0BmCyVerEA","wDajXtl72W",
+"Cp3mZlViBv","qUJMdogLgc","a00b52hEEU","tlILtS77LH","5ZaEzTCgPp","lViBvYjB9t","iqv4kWmadA","fmIK1GSQwj","LbRTH45cIH","a00b5jS1aj",
+"580YDGSQwj","x3LDedhSuH","MK07Y1j5L8","NhXduzqH0W","jzUqROz8yZ","S77LHcQOnv","lkMUAtjQxs","pT8wu2TRI7","v1HlnydG8U","7hyVvn8pJ9",
+"okgRiXyPZN","mz8gxLbRTH","8FmFHKsjRK","nlaByzHF1q","ciuWzCp3mZ","DQimpqQxHP","uJScXhSSvQ","taOXKUvlv4","9eoRciqv4k","M6qcGblLA9",
+"cmXIXhi5X7","RxrsmqaofN","FFDuid7vjM","DG4sTtuDyS","5VZjSrhl0J","XflUqiB08l","zFgtBnlaBy","uN6r3jiVBP","Cfgr35Namm","8TxD7sx5Gl",
+"lsQGogjUTu","GrDg7FLsph","kB5nP4W0Tl","CqqaDqUJMd","m4bxUpv0i7","29QAzuAWyp","ECMvUyluBx","IRh48WreyP","cShY2aDGtS","FwEJzQbxXc",
+"FhtglVNCPd","2Yz7ElViBv","StlDJzqH0W","pv0i7PYBf4","okgRisuY4x","UlU3MW3VFH","ZUnqtv1Hln","7ku1p2DREs","Y1mC0azIWp","cQOnvK4GS8",
+"jS1ajAmdQd","ulk41NhXdu","Ul4a1EdBKc","jSjS3iwzGk","Gv3FqQ6hMC","WDVWJwiHrZ","1j5L8uN6r3","8FmFHcmXIX","MmsIot98iW","Mkgy8B3qem",
+"Z4I1vpvgjS","tAOsrUl4a1","EOE1opv0i7","IKxdLLbRTH","9XyT9Waim6","zz4ZUIBe8k","DG4sT07n1c","jS1ajsuY4x","gtCA5zz4ZU","Gv3FqFLsph",
+"uLtKsjfREu","FVMxoiqv4k","ydG8Uuupzk","SmGzvW7cTs","HRxd8zqH0W","uupzk4QMc9","CIShGn8pJ9","zbIYYUmaEv","soy9tQworu","ECMvUoQ87r",
+"UmaEv9GXkX","jS1ajCNHmv","D6rByru4UG","ru4UGRsQUq","fLNg8hUTw7","prNT6t98iW","StlDJK4GS8","m4bxUyToGW","AkKTk2Yz7E","8RCUAwDajX",
+"ydG8UOz8yZ","48cHL4QMc9","MaJQsIKxdL","C2IrcdhSuH","jeskSTa8f6","VIlwPjzUqR","5drc6NcICA","hE1QlpvgjS","TXQ0Z7ku1p","Vprf2O3iyQ",
+"29QAz4dEz6","45cIH2Nslm","Q6hMCgjUTu","aFFss7ku1p","lsQGoeuZA5","atef2dmoS7","jSjS3S77LH","cL0aEnlaBy","fLNg8jS1aj","WmadAMaJQs",
+"oQ87rvOqCE","ZhwG1zbIYY","jeskSuLtKs","Yh1hFJkzUn","gIYvEm4bxU","Zv7z02ZHdk","oVQp6iwzGk","O3iyQ8RCUA","MojnPnFqik","vkCHH3otm6",
+"0MR5XdhSuH","FLsphfLNg8","IjTwPY1mC0","BpYhViqv4k","9GXkXiqv4k","xXTI4BpYhV","ECMvUogLgc","tl72WDcpWB","FGzgp4W0Tl","VBjhzJKWYR",
+"0h1b13weIF","FhtglZ4I1v","FLsphL7cGc","d85a9JIqXi","4QMc93weIF","XyPZNfmIK1","hi5X7W3VFH","piJSk64s8N","IjTwPD6rBy","fqypyGv3Fq",
+"tl72W2Nslm","WMiS3BGaQY","qaofNd7vjM","pAhR1Ss0Zu","euZA5RzaZA","Fhtgl8cVD3","pAhR1qaofN","ECMvUQClRL","aDGtSYw2oU","5ZaEzpFrrl",
+"uoStwMaJQs","9XyT9AgJHQ","7X3uyaFFss","soy9tD6rBy","lViBvcmXIX","CdyBVtlILt","2TRI7MGlTF","faHirLbRTH","RsQUq7fKYU","S77LHKZamH",
+"pv0i7tlILt","ulk41MezSW","zz4ZUTwano","6AFT0vLsmS","JkzUndhSuH","zmLYDnlaBy","MaJQs2ZHdk","o8UydUvlv4","l83Ud7Ow5C","EoToPxXTI4",
+"sx5GlIjTwP","lj07Qs7Mxk","9XyT9GrDg7","U3yw5JJs5m","VBjhzix74r","jtn0XcmXIX","tlILtNhXdu","VLTy6d85a9","hYBCKGSQwj","prNT6FxX9q",
+"CdyBVcQOnv","uPX7G0BmCy","9iGoTK4GS8","Cp3mZQYxC0","ThjNnJkzUn","yluBxTXQ0Z","sqVrfAOgEe","gtCA57Ow5C","2ZHdknnP8o","BFkb8jSjS3",
+"yluBx0ao3l","cQOnvdpe1v","MojnP618Di","64s8NOUYuF","ThjNnIKxdL","NhXduZJTXH","tlILtY1mC0","IBe8kUl4a1","jSjS3lweGy","IjTwPn1pmO",
+"MaJQsdmoS7","wDajXWmadA","vLsmS0BmCy","16lHcWPmlx","MaJQsjeskS","t98iW2ZHdk","uoStwUmaEv","TCgPpWaim6","JXljWOz8yZ","tl72WVprf2",
+"ThjNna00b5","sqVrfzqH0W","HRxd8aez9y","HP433SbRYy","rKDLJ5Drn0","No0QbD6rBy","4dEz614FLR","SjskQIRh48","fcwDapFrrl","suY4xt59lR",
+"B3qemuN6r3","mX2GEGWqqX","YOfrYoQ87r","oGu6xy94nw","ydG8UprNT6","Cp3mZ5ZaEz","jiVBP4W0Tl","uTacxmz8gx","aL6AJVprf2","2TRI7QbxXc",
+"0YAGH6q6L9","KsjRKhUTw7","Q6LixuJScX","b29RJni2v1","xciqpBGaQY","B3qemFGzgp","OUYuF5Drn0","MmKGJTCgPp","QworuWPmlx","3weIFXyPZN",
+"gf8rIRzaZA","sqVrfMm8si","B3qemo8Uyd","taOXKJRJQB","v1HlnogLgc","FwEJz8FmFH","t59lRSbRYy","hi5X7FGzgp","Yw2oUYjB9t","hE1QljzUqR",
+"cmXIXzz4ZU","jfREutlILt","GWqqX5IhmG","1v5hHiwzGk","BFkb8FVMxo","MojnPlkMUA","QClRLPb1pa","O3iyQrhl0J","aez9y07n1c","uupzkuAWyp",
+"Dz1R37Ow5C","uPX7GYw2oU","9XyT9cmXIX","o8UydCxVEf","BFkb8Cfgr3","Kr8ysaez9y","RsQUqQ6hMC","4W0Tl8TxD7","RsQUqgtCA5","aL6AJMmKGJ",
+"dQ586MGlTF","nnP8o07n1c","bgJAzqQxHP","0Wr5yqQxHP","a00b5aDGtS","jtn0XW3VFH","lkMUAMm8si","yEfy9WaWsv","P6bcgYh1hF","uvf7AnnP8o",
+"CIShG14FLR","FhtglzHF1q","NcICAzbIYY","lm0pDrz7Ut","MezSWBGaQY","K20wKpWiOs","5nmWvyToGW","fFDrJB3qem","4QMc9oQ87r","a00b5s4786",
+"MezSWni2v1","5nmWvuAWyp","t59lRtuDyS","5iGN5CxVEf","7Ow5CK4GS8","0h1b1sqVrf","FGzgp16lHc","GSQwjOUqFM","MmsIocL0aE","2TRI7n1pmO",
+"M3zXLRBhp0","0Kyfsd7vjM","s7Mxkm4bxU","cQOnviqv4k","0h1b1WreyP","4QMc9ogLgc","WaWsv5IhmG","OUYuFChuy3","fqypypAhR1","ksJby5iGN5",
+"djsrvHRxd8","FnPFBCNHmv","EdBKclweGy","4QMc9FPfSE","v8yFNiB08l","BFkb8uoStw","DcpWB5Namm","Yh1hFOUYuF","X6Pin5drc6","7fsYMaez9y",
+"48cHLIjTwP","dhSuHjzUqR","EoToPLewvM","fqypyfaHir","16lHc9rlg9","Gv3FqSs0Zu","HRxd8yEfy9","P6bcgiwzGk","nlaByUmaEv","pmeCdP6bcg",
+"JkzUnG1RhS","s7MxkOUqFM","cmXIX4W0Tl","YOfrYJXljW","8TxD7VBjhz","HzZT8ECMvU","MmsIo2Yz7E","VjCZqMm8si","jfREuIRh48","lViBvX6Pin",
+"lkMUA8xEKz","Mkgy82ZHdk","BbwgA5Drn0","9GXkXOUqFM","v1Hlnpv0i7","S2DfuS2Dfu","Q6LixMkgy8","faHiryofH3","TXQ0ZaL6AJ","9eoRcpvgjS",
+"tuDySs4786","7lUXZaL6AJ","oVQp67fKYU","fcwDa9XyT9","IKxdL0ao3l","oQ87rRxrsm","XflUqQYxC0","G1RhSDz1R3","bZLvSvLsmS","SjskQOxWIH",
+"CqqaDgIYvE","rKDLJRzaZA","tuDySMK07Y","zFgtBmX2GE","faHir8FmFH","5IhmGHfyNQ","jzUqREdBKc","YjB9tiB08l","07n1cXflUq","ix74rC2Irc",
+"OUqFMzmLYD","5ZaEzIn3NS","tuDySoGu6x","faHirDG4sT","CdyBVxReec","C2Irc14FLR","M6qcG2hEEU","AmdQdjtn0X","n8pJ9uvf7A","0YAGHn8pJ9",
+"v1Hlnlj07Q","5VZjS2TRI7","JRJQBSs0Zu","zFgtB7lUXZ","5Drn0VerEA","2ZHdkCfgr3","1LB1L7lUXZ","s47861v5hH","5VZjSrKDLJ","s93Ml7Ow5C",
+"DLhzMpAhR1","VIlwPlCMxy","FVMxoOz8yZ","0MR5XjS1aj","aFFssxXTI4","yluBxNcICA","iB08lk85Ae","3weIFAmdQd","IRh48AXpwE","o8UydRxrsm",
+"mz8gxmz8gx","4dEz6O3iyQ","kB5nPS2Dfu","ni2v1CIShG","2hEEUblLA9","5VZjSMGlTF","PYBf45ZaEz","pWiOsd85a9","M3zXLCK5W7","Pb1paC2Irc",
+"n8pJ95Mg9r","JXljW4dEz6","s7Mxkgf8rI","wiHrZYw2oU","YjB9t8RCUA","FGzgpNcICA","jzUqRStlDJ","7fsYMOUqFM","gdQsSIBe8k","FjHXRs7Mxk",
+"64s8NEoToP","a00b5zY1GY","HzZT8IKxdL","0YAGHpFrrl","0ao3lIjTwP","POUYSyofH3","3otm6lsQGo","iqv4kuvf7A","tAOsr618Di","e6e4zlkMUA",
+"vLsmSblLA9","b29RJBGaQY","aFFssFjHXR","9eoRc4dEz6","M3zXLuQIcz","64s8Niqv4k","24ARF5drc6","FxX9qWMiS3","piJSkhi5X7","VBjhzM6qcG",
+"lpF6WCfgr3","B3qemdhSuH","ulk41faHir","HzZT88U2nU","GSQwjiwzGk","AmdQdIn3NS","QbxXcyToGW","FLsphNcICA","C2Irchi5X7","MGlTFRBhp0",
+"uupzkulk41","MmsIoBFkb8","pWiOsrhl0J","pvgjSIKxdL","euZA5sqVrf","VBjhzSmGzv","ksJbyd85a9","uPX7Guvf7A","WmadAlj07Q","QClRLfqypy",
+"EoToPxciqp","K20wKs7Mxk","xciqpStlDJ","OUqFMCp3mZ","J2mQiAmdQd","lm0pDqQxHP","I7p2aCK5W7","Gv3FqfaHir","s93MlFxX9q","zY1GY5Namm",
+"2ZHdkAIYUu","kZANmydG8U","FcWrWSjskQ","GSQwjF6PT2","7lUXZsqVrf","OUYuFZv7z0","cQOnvpvgjS","vOqCElweGy","fFDrJNhXdu","Pb1paYh1hF",
+"oGu6x5IhmG","TwanoTa8f6","gtCA5Nxx9V","AgJHQhi5X7","Chuy3s7Mxk","zHF1q7lUXZ","L7cGc9iGoT","Cfgr37fKYU","9GXkX07n1c","5Drn0Zv7z0",
+"Mm8siiqv4k","gIYvEuoStw","rhl0JRzaZA","6AFT0zbIYY","l83Udulk41","RzaZAzFgtB","KZamHZJTXH","UlU3M0MR5X","uAWypVjCZq","0ao3lvkCHH",
+"rz7UtQworu","WDVWJZUnqt","9XyT9SbRYy","QYxC0FNYIM","gjUTus7Mxk","OxWIHsoy9t","5VZjS0Wr5y","ix74rMaJQs","gtCA5kB5nP","QssNClH1kt",
+"tAOsrLewvM","ZuDtDO3iyQ","TwanouTacx","VLTy69rlg9","IBe8k0PktI","DcpWBlXFOB","MaJQstuDyS","EoToPXyPZN","Twano5VZjS","Oz8yZRsQUq",
+"9rlg9nlaBy","HRxd8Uvlv4","2NslmqQxHP","zmLYDzFgtB","EoToPFwEJz","oQ87rIKxdL","Yh1hFzQt6Q","LDk6fEOE1o","MmsIoSmGzv","NcICAnlaBy",
+"he9IAPYBf4","AkKTk2Nslm","Q6hMCjiVBP","CdyBV8cVD3","gIYvEt59lR","dpe1vM3zXL","fmIK1CIShG","ru4UGCIShG","LDk6fpmeCd","8cVD3Twano",
+"ru4UGxReec","pWiOs9GXkX","lH1ktv2eC3","zqH0WaFFss","ulk41QWxoT","piJSk45cIH","prNT6JRJQB","zmLYD8U2nU","RsQUqd7vjM","QChxsRzaZA",
+"WaWsv9XyT9","6AFT0s93Ml","8RCUAX6Pin","WDVWJNcICA","uPX7GFhtgl","0PktIv1Hln","a00b5Pb1pa","uZPqgtjQxs","ZJTXHzz4ZU","hSSvQ4dEz6",
+"pv0i7oVQp6","QnJ1S4QMc9","3weIFFnPFB","P6bcghi5X7","QClRLzY1GY","GXdoHSjskQ","SjskQ9eoRc","uZPqgP6bcg","FjHXRAXpwE","LewvMhE1Ql",
+"45cIHcQOnv","v1HlnRACuj","k85AeBGaQY","rhl0JNhXdu","azIWp0h1b1","iKqhrZzJHW","RACujzqH0W","0PktI2Nslm","vkCHHk85Ae","gIYvEOUYuF",
+"i3pydn1pmO","hE1Qlmz8gx","W7cTszHF1q","KASQ8CNHmv","WDVWJgdQsS","24ARFjeskS","LewvMNhXdu","KsjRKFFDui","LewvMni2v1","9iGoTs93Ml",
+"iwzGkvkCHH","LbRTHni2v1","ru4UGzqH0W","Pb1paSjskQ","sqVrfMmKGJ","OHaBzECMvU","lj07QMmsIo","6AFT0gdQsS","rKDLJcL0aE","618DiNOHsz",
+"FcWrWTXQ0Z","AmdQdaez9y","B3qemZv7z0","wiHrZIjTwP","bZLvS14FLR","hYBCKzmLYD","CK5W7Ss0Zu","he9IAZzJHW","0KyfsM6qcG","Ta8f63otm6",
+"yluBxrKDLJ","Ul4a1dmoS7","M3zXLix74r","brhlQ45cIH","7lUXZOz8yZ","HRxd8zz4ZU","Vprf2o8Uyd","kZANm618Di","14FLROUqFM","jtn0XFGzgp",
+"yToGWAkKTk","5nmWvFPfSE","No0QbOz8yZ","uJScXOUqFM","zFgtBJKWYR","DLhzMVerEA","tuDySqUJMd","5NammuQIcz","1LB1L29QAz","jeskSLewvM",
+"1LB1LogLgc","xReectlILt","M3zXLdQ586","kZANmhSSvQ","mz8gxlH1kt","07n1cvLsmS","FVMxoQWxoT","WDVWJFVMxo","tAOsrSjskQ","pFrrlsuY4x",
+"d7vjMS77LH","P6bcgYw2oU","pT8wuWDVWJ","FPfSExciqp","U3yw5tjQxs","wiHrZCxVEf","Q6hMCtl72W","YjB9tlH1kt","fmIK1sqVrf","t59lRVLTy6",
+"2hEEUtuDyS","soy9tsuY4x","wDajXBpYhV","VIlwPVerEA","6q6L9o8Uyd","55rfB0Kyfs","Ta8f6XflUq","cQOnvW7cTs","ReKEWRzaZA","wDajXi7WMQ",
+"tjQxspFrrl","RACuj2Yz7E","prNT6v2eC3","K4GS8QbxXc","BGaQYgjUTu","I7p2a5nmWv","Q6LixDz1R3","TCgPpogLgc","FcWrWl83Ud","16lHcKASQ8",
+"JkzUnNAFuw","yluBxi3pyd","uN6r3lXFOB","bgJAzI7p2a","OUYuFpv0i7","Gv3FqhUTw7","xciqp16lHc","MezSWfFDrJ","IBe8khe9IA","OHaBzKASQ8",
+"5Drn0RACuj","JXljWFFDui","hi5X7RACuj","VIlwP9GXkX","1j5L8tl72W","4W0TlfcwDa","yToGWC2Irc","s93MlVBjhz","jS1ajcL0aE","iB08lJJs5m",
+"zFgtBKZamH","2Yz7Ei7WMQ","faHirMaJQs","cShY25Drn0","ydG8UcmXIX","zqH0WmX2GE","0MR5XMm8si","iKqhryvOMI","KZamHUvlv4","HRxd8lweGy",
+"5VZjSBpYhV","HRxd8Yf2Ec","ni2v1WMiS3","jiVBP5ZaEz","RACuj580YD","gf8rIBCxeC","16lHcuvf7A","TCgPplViBv","CqqaDStlDJ","NAFuwksJby",
+"FPfSED6rBy","5iGN58xEKz","4W0TlazIWp","MK07YqaofN","v2eC3AmdQd","vOqCEFLsph","CqqaDThjNn","MK07YL7cGc","sx5GlQ6hMC","NAFuwMojnP",
+"ZhwG12Yz7E","oGu6xd85a9","aFFssCdyBV","Ta8f6cmXIX","ix74rZUnqt","wDajXdjsrv","CxVEf9y4lw","prNT6RmDcr","5Drn0jzUqR","Q6hMCru4UG",
+"GWqqXjfREu","ydG8UvkCHH","lH1kt5Drn0","l83UdYh1hF","Chuy3KASQ8","5ZaEzlH1kt","G1RhSbZLvS","a00b5ru4UG","KsjRKTCgPp","D6rByY1mC0",
+"WmadA5nmWv","SjskQjSjS3","ZJTXHGrDg7","KZamHMmKGJ","9rlg9In3NS","ni2v1uZPqg","0Wr5yPOUYS","9XyT9RpBQm","RACuj8RCUA","LewvMaFFss",
+"yToGW2Nslm","IBe8kZUnqt","soy9tiwzGk","n8pJ9pv0i7","v2eC3WaWsv","xXTI49GXkX","ru4UGqUJMd","uupzk9rlg9","8cVD3qQxHP","e6e4zRmDcr",
+"x3LDe48cHL","iwzGk45cIH","QChxscL0aE","C2Irc8xEKz","48cHLwDajX","Yw2oUWaim6","oQ87r55rfB","jSjS3Uvlv4","No0QbqaofN","oGu6xpFrrl",
+"Cp3mZh1zcH","TXQ0ZFPfSE","5VZjSQ6Lix","v2eC3HfyNQ","h1zcHQ6Lix","tlILtSs0Zu","k85AedQ586","7ku1ptaOXK","X6Pin7lUXZ","VBjhzvLsmS",
+"fcwDaO3iyQ","gtCA5FnPFB","OUqFMK4GS8","0ao3lECMvU","QnJ1SDG4sT","VjCZqru4UG","SbRYyfmIK1","0Wr5ytuDyS","DcpWBfFDrJ","2TRI7OxWIH",
+"ZJTXH8U2nU","fFDrJCqqaD","hYBCKzY1GY","xReeclm0pD","VerEAiqv4k","ogLgcChuy3","nlaByYw2oU","vkCHHDLhzM","uZPqgfmIK1","aL6AJfFDrJ",
+"8FmFHAkKTk","Z4I1vuLtKs","NhXdujfREu","Pb1paY1mC0","Oz8yZIBe8k","aFFssGWqqX","WPmlxRpBQm","qQxHPJKWYR","KASQ8BGaQY","8cVD37fsYM",
+"Rxrsms93Ml","ZhwG1gdQsS","Cp3mZ5Namm","Kr8ysrhl0J","lm0pDG1RhS","SmGzvfcJOy","G1RhSlCMxy","1v5hHuvf7A","7X3uyWreyP","HzZT85VZjS",
+"VIlwP3otm6","8TxD7AOgEe","v8yFNzqH0W","FwEJzprNT6","CIShGt98iW","7Ow5C0h1b1","lpF6W16lHc","9y4lwQnJ1S","xReecTXQ0Z","djsrvKASQ8",
+"cL0aEtjQxs","GSQwjDG4sT","YOfrYIRh48","Oz8yZKsjRK","tlILtMmsIo","0YAGHOUYuF","8TxD7lXFOB","JRJQBRBhp0","SjskQlpF6W","ciuWzxciqp",
+"dQ586ReKEW","9XyT9FNYIM","BbwgAiB08l","DcpWB6q6L9","SbRYyMaJQs","DQimpzFgtB","HfyNQd85a9","TCgPpUlU3M","I7p2aP6bcg","sqVrftvdkD",
+"nFqikmX2GE","bgJAzuoStw","5NammoQ87r","n1pmOOUqFM","CqqaD0PktI","guMb8KASQ8","C2IrctaOXK","yEfy9CqqaD","8TxD7FLsph","YjB9tIjTwP",
+"MojnPzbIYY","wiHrZRACuj","9eoRci3pyd","FnPFBsqVrf","guMb8e6e4z","lCMxyJ2mQi","Gv3Fq3otm6","AIYUuFcWrW","24ARFW7cTs","MojnP4dEz6",
+"cQOnvGXdoH","7X3uyYw2oU","uTacxYjB9t","YOfrYnnP8o","lkMUAaDGtS","n8pJ9VerEA","0KyfsOz8yZ","iB08l8hJdt","NAFuwRzaZA","F6PT2ZJTXH",
+"8FmFH0Wr5y","KZamHulk41","7ku1p24ARF","ZuDtDYw2oU","gjUTuiqv4k","VerEAHP433","mX2GEkB5nP","LewvMFFDui","l83UdhSSvQ","jeskSfmIK1",
+"LewvMJXljW","l83UdMmKGJ","lweGyxXTI4","0KyfstlILt","VBjhzv8yFN","NcICAYOfrY","KASQ82hEEU","BpYhVRkQke","4dEz6cmXIX","WDVWJ16lHc",
+"J2mQiprNT6","NAFuwlH1kt","okgRizmLYD","TwanoyEfy9","wiHrZSWfou","euZA57ku1p","Pb1paL7cGc","6q6L9rhl0J","CK5W7vOqCE","lXFOBuoStw",
+"yvOMIyvOMI","zbIYYYw2oU","MK07Y3otm6","RACujbrhlQ","618DiuLtKs","8cVD38TxD7","6AFT0MmsIo","P6bcgRsQUq","Dz1R3WDVWJ","ciuWzsqVrf",
+"lm0pDVjCZq","55rfBtuDyS","7lUXZtuDyS","2hEEUfmIK1","a00b5soy9t","lkMUAiwzGk","hE1QlogLgc","CIShGQbxXc","KASQ8gjUTu","FcWrWa00b5",
+"VerEAWMiS3","Gv3FqRkQke","HRxd80MR5X","5ZaEzLewvM","uJScXrz7Ut","1v5hHsqVrf","v8yFN0Kyfs","AXpwEFGzgp","aL6AJRkQke","9rlg9KASQ8",
+"FhtglnnP8o","hSSvQNo0Qb","QYxC0LbRTH","hYBCKd7vjM","QChxsXflUq","WMiS3soy9t","X6PinfmIK1","qaofNOUqFM","uupzk9y4lw","ciuWzzbIYY",
+"4W0Tlv1Hln","kB5nPhSSvQ","pvgjSwDajX","RkQkeAXpwE","d7vjMtjQxs","O3iyQjS1aj","X6PinFLsph","GrDg7jtn0X","48cHLx3LDe","IBe8kStlDJ",
+"tl72WFVMxo","JXljWaFFss","OxWIHLDk6f","RsQUqlXFOB","XflUqsoy9t","gjUTuPYBf4","iwzGk7ku1p","jiVBP29QAz","0h1b1bZLvS","C2IrcK20wK",
+"WMiS3JRJQB","aL6AJbZLvS","jS1ajiB08l","Yw2oUCxVEf","tvdkDjtn0X","n1pmOK20wK","o8UydnFqik","aFFssMmKGJ","XyPZNLDk6f","dQ586In3NS",
+"SmGzvtAOsr","MGlTFqaofN","lH1kt8FmFH","ru4UGQssNC","S77LHhi5X7","fFDrJSs0Zu","7Ow5C2ZHdk","WaWsvOHaBz","7lUXZi7WMQ","S2DfuVBjhz",
+"a00b5iqv4k","dhSuHStlDJ","RsQUq64s8N","VIlwPi3pyd","zqH0WDz1R3","dQ586M6qcG","UlU3Msoy9t","cShY2xReec","pWiOsWaWsv","jtn0XGWqqX",
+"dpe1vv8yFN","Mkgy8hE1Ql","n1pmOLbRTH","VerEAgIYvE","rhl0JzQt6Q","ydG8UYOfrY","e6e4zFhtgl","MmKGJ2TRI7","Waim6ogLgc","WPmlx07n1c",
+"yEfy95ZaEz","piJSkRACuj","uTacxjfREu","uZPqglkMUA","cL0aEciuWz","blLA95ZaEz","s93Mlru4UG","Z4I1v16lHc","okgRiCfgr3","7lUXZRACuj",
+"zmLYDciuWz","ThjNnG1RhS","0ao3lIBe8k","LbRTHQnJ1S","OxWIHPb1pa","VerEAQbxXc","mz8gxMm8si","jS1ajM3zXL","sqVrfsx5Gl","OxWIHhUTw7",
+"5drc6l83Ud","SWfouguMb8","ZJTXHQbxXc","ZhwG1FLsph","dpe1v2TRI7","NAFuws93Ml","JKWYRbgJAz","uQIczdQ586","wDajXDQimp","fcwDa9rlg9",
+"zQt6QOHaBz","AOgEeAXpwE","sqVrfeuZA5","HfyNQOUqFM","EOE1oYOfrY","pvgjShi5X7","Waim655rfB","YOfrYa00b5","Zv7z0gf8rI","HRxd8vOqCE",
+"C2Irc9rlg9","K20wKoQ87r","RsQUqjeskS","7fsYMv1Hln","m4bxU4dEz6","tuDyS2Yz7E","uupzkWPmlx","ReKEWZUnqt","tlILt24ARF","7Ow5CNcICA",
+"Rxrsmrhl0J","DQimpK4GS8","K4GS8mX2GE","G1RhS5iGN5","iB08lfmIK1","K20wKs4786","h1zcHuN6r3","07n1cNOHsz","QssNCJKWYR","uN6r3i7WMQ",
+"oGu6xuoStw","RsQUqhi5X7","Ss0Zu0Kyfs","oVQp6ru4UG","W7cTsaL6AJ","iKqhr580YD","yvOMIuAWyp","BbwgA0PktI","O3iyQBpYhV","VNCPdh1zcH",
+"brhlQI7p2a","Gv3FqQ6Lix","RACuj8FmFH","7X3uyrKDLJ","3otm6nnP8o","5ZaEzUvlv4","yEfy9uupzk","pWiOsCdyBV","rKDLJbZLvS","VIlwPFNYIM",
+"NOHszhSSvQ","QClRL9rlg9","kZANmIKxdL","vLsmSlkMUA","cQOnvNOHsz","RsQUq24ARF","JRJQBjfREu","W7cTsb29RJ","8RCUA0BmCy","pvgjSEOE1o",
+"jeskS9XyT9","s93Ml55rfB","vLsmSVIlwP","t59lRpFrrl","pT8wuBFkb8","cmXIXWmadA","0h1b1RBhp0","fLNg8lkMUA","Kr8ysCqqaD","IBe8k4dEz6",
+"C2IrcWDVWJ","Q6hMCSbRYy","J2mQiRACuj","8RCUAs7Mxk","P6bcghe9IA","0PktIrKDLJ","9XyT92ZHdk","gf8rIDz1R3","Pb1pav1Hln","4W0TlZuDtD",
+"K4GS8IBe8k","5IhmGblLA9","JRJQBMm8si","pvgjSB3qem","7fKYUrz7Ut","pFrrlChuy3","qQxHPmz8gx","NcICAfqypy","5VZjS8cVD3","JkzUnbgJAz",
+"580YDMm8si","pT8wu7X3uy","ThjNnpiJSk","OUYuFm4bxU","29QAzSs0Zu","7Ow5CtaOXK","rKDLJEdBKc","WPmlxvOqCE","FhtglReKEW","SmGzvAOgEe",
+"B3qemtAOsr","zz4ZUcQOnv","t59lRUvlv4","FhtglGXdoH","Chuy3Ta8f6","O3iyQVerEA","jfREuD6rBy","XflUq8hJdt","euZA5FcWrW","zFgtBK20wK",
+"Waim69rlg9","AXpwERACuj","rKDLJuLtKs","pFrrluQIcz","K20wKuLtKs","0YAGH1j5L8","NhXduokgRi","MaJQs0YAGH","QbxXcaez9y","Gv3FqSWfou",
+"VBjhzyofH3","QnJ1S2hEEU","taOXKOUqFM","BGaQY8cVD3","5NammYw2oU","fLNg85ZaEz","yToGWDz1R3","m4bxUIjTwP","gIYvEni2v1","IKxdLlCMxy",
+"POUYSNcICA","zQt6Qhi5X7","SWfouaL6AJ","guMb8MmsIo","qUJMd55rfB","cShY2yvOMI","AOgEeSs0Zu","d85a9hSSvQ","aez9yfmIK1","DQimpa00b5",
+"Q6hMCqaofN","P6bcgNAFuw","WDVWJ7lUXZ","NhXduwDajX","JXljWU3yw5","ni2v15Mg9r","Mm8siuJScX","Ta8f6nlaBy","GSQwj0h1b1","gf8rIfcJOy",
+"FxX9qNAFuw","WDVWJ2hEEU","oVQp6m4bxU","618DiFwEJz","ReKEW1LB1L","2hEEUAXpwE","Chuy329QAz","yofH3QYxC0","n1pmOfcwDa","CqqaDhYBCK",
+"K4GS85iGN5","d85a9sqVrf","29QAzhe9IA","ogLgcoGu6x","HfyNQ1v5hH","yvOMIFGzgp","uJScXFwEJz","0YAGHWmadA","2TRI7HzZT8","aez9yUl4a1",
+"l83UdpAhR1","MmKGJQworu","wDajXHfyNQ","MK07YMmsIo","NAFuwiqv4k","uAWypx3LDe","lH1kt5VZjS","xReecThjNn","b29RJk85Ae","TCgPpF6PT2",
+"4dEz6m4bxU","yvOMIzFgtB","5Mg9r5Mg9r","MezSWuN6r3","dpe1vTXQ0Z","TwanoDQimp","F6PT2uJScX","zbIYYFnPFB","pvgjSQworu","16lHclm0pD",
+"SmGzvkZANm","3otm6qUJMd","b29RJpWiOs","Yf2EcRBhp0","DG4sTM3zXL","pvgjS9XyT9","7Ow5C7fsYM","aDGtSQ6hMC","2ZHdkD6rBy","lXFOBxReec",
+"K20wKsuY4x","IKxdLWaWsv","n1pmO1v5hH","x3LDeRxrsm","8hJdtIjTwP","OHaBzVBjhz","fcJOyFVMxo","OUqFMlH1kt","POUYSIBe8k","atef216lHc",
+"YjB9tbrhlQ","LDk6f9rlg9","uJScXpmeCd","FGzgpNOHsz","jfREucL0aE","9y4lw5nmWv","JkzUnzmLYD","xciqpTCgPp","Waim6qUJMd","24ARFO3iyQ",
+"580YDFjHXR","zmLYD4QMc9","lj07Q9iGoT","lweGyIKxdL","8hJdtG1RhS","lj07QQClRL","cmXIXIjTwP","FVMxod7vjM","oGu6xaez9y","2ZHdkCdyBV",
+"fcJOylj07Q","VLTy6618Di","v1HlnQ6Lix","RsQUqt59lR","iB08lSs0Zu","NAFuwaez9y","FhtglaDGtS","NhXduM3zXL","yEfy9OxWIH","pmeCdEOE1o",
+"EdBKcGv3Fq","XyPZN7fKYU","tjQxsOUqFM","IKxdLuupzk","QnJ1Sv1Hln","5nmWvblLA9","QnJ1SiKqhr","VIlwPZJTXH","aFFssCNHmv","16lHcIjTwP",
+"29QAzi7WMQ","i7WMQdpe1v","lj07QvLsmS","D6rBycmXIX","prNT6C2Irc","2ZHdkWaWsv","guMb8QWxoT","VIlwPlm0pD","k85AeMojnP","zbIYYuupzk",
+"RpBQmCdyBV","S77LHAkKTk","Y1mC0OHaBz","brhlQWreyP","bgJAztl72W","WDVWJtuDyS","l83UdK4GS8","jiVBPpvgjS","8TxD7BbwgA","FPfSEzY1GY",
+"2DREshe9IA","v1HlnJIqXi","Q6hMCtjQxs","ThjNnSbRYy","KsjRKgf8rI","m4bxUMezSW","QClRLMojnP","AOgEeQbxXc","HRxd8xXTI4","FwEJzDcpWB",
+"F6PT2YOfrY","dmoS7SWfou","FjHXRTa8f6","wDajXfcJOy","FVMxoBpYhV","Cp3mZCIShG","5VZjSHlUbF","Yw2oUrhl0J","i3pyd8RCUA","iKqhrDz1R3",
+"aDGtSoVQp6","vLsmSMkgy8","2NslmOxWIH","KASQ8FxX9q","k85Ae9eoRc","qQxHPpT8wu","8xEKzWDVWJ","fFDrJd85a9","hE1QlLDk6f","d7vjMYf2Ec",
+"tvdkDFGzgp","9rlg9ZzJHW","fmIK1SWfou","dpe1vguMb8","8cVD3uJScX","AkKTkMojnP","wiHrZBCxeC","HlUbFQ6hMC","uoStwx3LDe","uJScXlH1kt",
+"pFrrlJ2mQi","7Ow5Cl83Ud","OUYuF45cIH","YOfrYHRxd8","hSSvQRkQke","W7cTsn8pJ9","wDajXgIYvE","FVMxofmIK1","1j5L8PYBf4","pv0i7soy9t",
+"RsQUqU3yw5","45cIH0Kyfs","ogLgcjfREu","jzUqR5VZjS","ni2v1tAOsr","S2DfuZUnqt","RACujy94nw","jfREuUl4a1","cL0aEoVQp6","t59lRJIqXi",
+"8TxD7yEfy9","VLTy6HP433","5iGN5wDajX","zmLYDpiJSk","pmeCdMK07Y","ZzJHWtjQxs","ogLgcCK5W7","9XyT9tjQxs","DcpWBIn3NS","rhl0JSjskQ",
+"v2eC3oVQp6","9GXkXLbRTH","Cfgr316lHc","faHirnFqik","jfREuHzZT8","cmXIXXflUq","hSSvQuZPqg","5drc6CNHmv","LDk6ffaHir","gf8rI7Ow5C",
+"GXdoHXflUq","sqVrf5drc6","jSjS34QMc9","618DiIBe8k","s4786HlUbF","7fsYMlXFOB","s7MxkCfgr3","xciqpZUnqt","DLhzMe6e4z","pAhR19iGoT",
+"8FmFH9rlg9","Ta8f6guMb8","a00b5pWiOs","2DREsWPmlx","zQt6Q8FmFH","guMb87fKYU","9XyT9lj07Q","64s8NkB5nP","0h1b1yEfy9","jfREurz7Ut",
+"BpYhVtlILt","lViBvzFgtB","hYBCKtAOsr","IKxdLDG4sT","OUYuFlViBv","wDajX7hyVv","Ul4a1CxVEf","WDVWJOxWIH","ru4UGaFFss","QClRL2Nslm",
+"5drc6VLTy6","UlU3MRxrsm","VIlwPlsQGo","EOE1oDLhzM","hE1QlDz1R3","tl72Wiqv4k","Mkgy8rz7Ut","OxWIHgjUTu","KZamHlm0pD","oVQp6zz4ZU",
+"lweGyJRJQB","y94nwCIShG","9GXkX9iGoT","LDk6f3otm6","QnJ1SGSQwj","Ul4a1aDGtS","5Drn0RmDcr","jeskSdmoS7","QnJ1SEoToP","TCgPp0h1b1",
+"OUqFMcmXIX","pFrrlyluBx","gtCA5RACuj","X6Pintl72W","uoStwpFrrl","MGlTFl83Ud","kB5nPDLhzM","0YAGHRACuj","fmIK1hSSvQ","5Nammdpe1v",
+"VBjhzk85Ae","nlaBypAhR1","n1pmOuLtKs","YOfrYe6e4z","nlaByzz4ZU","jfREuuQIcz","29QAzzz4ZU","uQIczzY1GY","Zv7z0yluBx","2NslmbZLvS",
+"9y4lwS77LH","hi5X7iB08l","MezSWPYBf4","KZamHMojnP","FwEJzGWqqX","lkMUAVjCZq","7hyVvAgJHQ","jiVBPiB08l","dQ586FVMxo","KsjRK5Mg9r",
+"zmLYD7ku1p","HfyNQ4W0Tl","zqH0WcShY2","Q6hMC2Nslm","ciuWzjS1aj","4W0TlVBjhz","ogLgc64s8N","RzaZAWreyP","EOE1oiqv4k","uZPqgCNHmv",
+"WreyPKZamH","8hJdtQYxC0","SbRYyaDGtS","RkQke8FmFH","TCgPpYOfrY","fcwDacmXIX","fcJOyRpBQm","CdyBVW7cTs","nnP8oVerEA","fmIK1W3VFH",
+"I7p2aaez9y","jfREupmeCd","Qworui7WMQ","gIYvERsQUq","prNT6lXFOB","Kr8ys9rlg9","SbRYyblLA9","WmadAwiHrZ","No0QbvOqCE","3otm6GXdoH",
+"6q6L9qUJMd","W3VFHsx5Gl","qaofN5IhmG","YjB9tUl4a1","pT8wuLDk6f","lXFOBnFqik","fcwDa580YD","9eoRcaL6AJ","0h1b1zbIYY","FjHXR7fKYU",
+"G1RhSni2v1","QssNCpiJSk","7X3uymz8gx","brhlQdpe1v","2hEEUhUTw7","4dEz6KsjRK","7fKYU5Mg9r","8RCUA2Nslm","No0QbiKqhr","JIqXi5ZaEz",
+"9GXkXMmKGJ","64s8Nk85Ae","MmKGJzQt6Q","prNT6ReKEW","dpe1vBpYhV","jzUqRUmaEv","vkCHH6q6L9","K4GS8XflUq","7fKYU0YAGH","C2Ircv2eC3",
+"WmadAK20wK","45cIHuLtKs","MojnPuZPqg","zY1GYxciqp","wDajXsx5Gl","dpe1vv1Hln","G1RhSjzUqR","5Drn09eoRc","pWiOsjzUqR","KZamH618Di",
+"29QAzksJby","64s8NJRJQB","Ul4a1gdQsS","8cVD3qUJMd","v2eC3fLNg8","7fsYM64s8N","xReecW3VFH","ZuDtDnlaBy","W3VFHAIYUu","7lUXZjeskS",
+"MaJQsQssNC","lH1kt7fsYM","ciuWz7hyVv","pv0i7HzZT8","HfyNQVerEA","G1RhSUvlv4","9GXkXs93Ml","DQimpVBjhz","EOE1opFrrl","d85a9RpBQm",
+"taOXKpFrrl","7ku1pogLgc","l83Ud2TRI7","y94nwv8yFN","rhl0JStlDJ","hE1QlZ4I1v","WaWsvv2eC3","5IhmGhYBCK","0BmCy2TRI7","pT8wufaHir",
+"CIShGCK5W7","MK07YLDk6f","xciqp8RCUA","TCgPpdhSuH","FnPFBP6bcg","y94nwBbwgA","OUqFMrz7Ut","QChxsYw2oU","AmdQdo8Uyd","brhlQStlDJ",
+"EOE1o7fsYM","LbRTHcQOnv","TwanoGSQwj","BpYhVRmDcr","DcpWBcShY2","ZuDtDNOHsz","WMiS3cQOnv","ZzJHW8RCUA","RACujlpF6W","ZuDtD5Namm",
+"W7cTsNAFuw","BpYhVFwEJz","WDVWJCdyBV","ni2v1suY4x","jiVBPcL0aE","48cHLxReec","zqH0WDLhzM","ciuWz0PktI","tjQxsDQimp","QChxsAXpwE",
+"mX2GE8hJdt","EdBKcAgJHQ","FFDuiWPmlx","rhl0JguMb8","qQxHPQssNC","BbwgA0Wr5y","bZLvS9y4lw","uupzkOz8yZ","cShY2YjB9t","taOXKpiJSk",
+"pvgjSCdyBV","K20wKWaim6","uTacx4QMc9","4W0Tl29QAz","v1Hln8TxD7","hUTw7fqypy","lweGyix74r","KsjRKKsjRK","v2eC3BGaQY","xReecydG8U",
+"rz7UtmX2GE","FVMxosx5Gl","hUTw71LB1L","0Wr5y2TRI7","uQIczjtn0X","O3iyQ2Yz7E","pFrrloQ87r","l83UdiB08l","atef2Kr8ys","WMiS3oQ87r",
+"guMb8fcwDa","IBe8kVNCPd","cShY2kB5nP","b29RJdQ586","mz8gx3weIF","xReeczQt6Q","uJScXpvgjS","48cHLvLsmS","wDajX16lHc","NAFuwYOfrY",
+"HP4338RCUA","s93MlDLhzM","uupzkNcICA","RmDcrulk41","i7WMQQssNC","soy9ttaOXK","OxWIH618Di","MmKGJLDk6f","AkKTkDz1R3","bZLvSuJScX",
+"Z4I1v64s8N","EoToPpvgjS","WaWsvY1mC0","wiHrZ9eoRc","4W0TlSWfou","aDGtSMaJQs","d7vjM64s8N","RpBQmHzZT8","Chuy39XyT9","Pb1patl72W",
+"7ku1p5IhmG","JKWYRFPfSE","6AFT0iB08l","VNCPdVLTy6","2hEEU5nmWv","RmDcrokgRi","Z4I1vXyPZN","W7cTsUlU3M","cQOnvXyPZN","yofH3qUJMd",
+"uoStw8U2nU","zz4ZUtjQxs","gtCA5JkzUn","Oz8yZy94nw","RsQUqKASQ8","gf8rIcShY2","uupzkCIShG","JJs5mfLNg8","FwEJzI7p2a","rhl0JpvgjS",
+"NAFuwuoStw","s7Mxk2DREs","DcpWBZJTXH","hUTw7FnPFB","RpBQm8RCUA","CxVEfoGu6x","uLtKsK4GS8","JXljWnlaBy","7fsYMfcwDa","uoStw2Nslm",
+"8cVD3uZPqg","vLsmSRxrsm","8hJdt8RCUA","I7p2aAXpwE","k85AeECMvU","DQimpbgJAz","qUJMdru4UG","CNHmvReKEW","AgJHQuZPqg","HP4330ao3l",
+"iKqhrFVMxo","sx5GlvLsmS","faHirpvgjS","M6qcGEOE1o","dpe1vCxVEf","kB5nP5Drn0","NAFuwBpYhV","RsQUqVNCPd","2NslmFwEJz","zz4ZUksJby",
+"5NammMK07Y","WmadAjiVBP","lpF6W5VZjS","LDk6fDLhzM","FGzgpMaJQs","k85AeydG8U","W3VFHHzZT8","YjB9tuJScX","ciuWzjiVBP","MaJQsVerEA",
+"BbwgAKASQ8","G1RhSRpBQm","Mm8si5drc6","ni2v1RpBQm","P6bcgU3yw5","TwanokZANm","Chuy3G1RhS","Mkgy8fmIK1","4dEz6DQimp","gtCA5MmsIo",
+"4W0Tl7X3uy","suY4xCqqaD","RxrsmLbRTH","JRJQBn1pmO","hi5X7SWfou","v2eC3VjCZq","uvf7AVNCPd","qUJMdECMvU","i7WMQpT8wu","a00b5gdQsS",
+"zbIYYokgRi","BGaQYVerEA","RsQUq0Wr5y","3weIFRmDcr","7Ow5CAOgEe","Waim6NAFuw","7lUXZguMb8","SjskQYjB9t","wDajXbrhlQ","lpF6WFxX9q",
+"2NslmVerEA","tlILtQYxC0","2hEEUcL0aE","uQIczv1Hln","xXTI4K4GS8","Gv3Fq1LB1L","hi5X70BmCy","8FmFHrz7Ut","tjQxszmLYD","GSQwjcmXIX",
+"k85Aea00b5","ydG8UmX2GE","VerEAP6bcg","MmsIo64s8N","0Wr5yaFFss","zbIYYJkzUn","rKDLJZJTXH","GXdoHFPfSE","8U2nUuJScX","SbRYyHfyNQ",
+"fLNg8xReec","WMiS3FPfSE","0h1b1cL0aE","YjB9tiqv4k","VjCZqC2Irc","n8pJ9In3NS","pFrrlDQimp","SmGzvpAhR1","Cfgr32Yz7E","taOXK8cVD3",
+"EoToPnlaBy","WDVWJQbxXc","BFkb89rlg9","Dz1R3QbxXc","IBe8kGXdoH","QnJ1Sulk41","45cIHF6PT2","K20wKbZLvS","wDajXIRh48","IBe8kVjCZq",
+"jfREuuN6r3","BCxeCRxrsm","guMb8StlDJ","lViBvnnP8o","t98iWBFkb8","M6qcG2TRI7","0MR5XpvgjS","1LB1LzmLYD","gdQsSFwEJz","lm0pDM3zXL",
+"gtCA50MR5X","jS1ajyluBx","MK07YQnJ1S","FcWrWCp3mZ","hE1QlbrhlQ","lweGyJJs5m","FFDuiWDVWJ","CxVEfRxrsm","tvdkD7fsYM","tuDySVNCPd",
+"TXQ0ZpWiOs","Gv3FqMkgy8","VIlwPQssNC","EOE1oix74r","pFrrl48cHL","qaofNQYxC0","ReKEWBFkb8","ZUnqt5nmWv","UmaEvMmsIo","8RCUAIBe8k",
+"ix74rGSQwj","n1pmOgdQsS","DLhzMAOgEe","MmsIo9iGoT","he9IAoGu6x","uTacxfcwDa","X6PinJkzUn","8TxD7CK5W7","8FmFHlpF6W","ZJTXH9y4lw",
+"0Kyfslm0pD","pmeCdDQimp","m4bxUoVQp6","Kr8ys8cVD3","S2DfuJJs5m","o8UydIBe8k","cQOnvIn3NS","uZPqgdhSuH","Fhtglt59lR","sqVrfNAFuw",
+"sx5GlC2Irc","nFqikAOgEe","StlDJjtn0X","AmdQdSmGzv","nlaByWMiS3","5nmWvCIShG","oGu6xfqypy","AIYUuprNT6","7Ow5Cv1Hln","uvf7AsqVrf",
+"9rlg9Q6Lix","FnPFBtlILt","vOqCEQ6hMC","8xEKzEdBKc","oGu6xIRh48","24ARFtlILt","3otm6kB5nP","e6e4z2DREs","ECMvU45cIH","x3LDeHfyNQ",
+"hUTw75drc6","OxWIHM3zXL","JkzUnIn3NS","9XyT99iGoT","prNT6s93Ml","uQIczZv7z0","d85a9suY4x","uAWyppWiOs","GrDg745cIH","StlDJlsQGo",
+"QssNC4QMc9","3otm6jiVBP","s4786yofH3","QssNChe9IA","fcJOyFPfSE","lweGylpF6W","okgRiTwano","vkCHHVBjhz","dQ586uJScX","uLtKsQYxC0",
+"M6qcGJKWYR","C2Irch1zcH","i7WMQXflUq","2Yz7E5drc6","GXdoHLDk6f","PYBf4pv0i7","uvf7AyEfy9","ZUnqttAOsr","GSQwjWmadA","ZhwG1M6qcG",
+"yluBxYw2oU","2ZHdklCMxy","B3qemgIYvE","In3NSSjskQ","2Yz7Eni2v1","xXTI4rhl0J","W3VFH5Drn0","NhXduMmsIo","2hEEUdjsrv","9XyT9Rxrsm",
+"RBhp07X3uy","OUYuFaDGtS","OUYuFWMiS3","qUJMddpe1v","aL6AJqaofN","n8pJ964s8N","ix74rOz8yZ","xReecoGu6x","QnJ1SAgJHQ","dQ586BpYhV",
+"jeskSB3qem","AIYUuFFDui","2Yz7EgdQsS","s47867Ow5C","BCxeCfaHir","HfyNQSWfou","Q6hMCQClRL","9iGoTvOqCE","MmsIowiHrZ","2TRI7he9IA",
+"brhlQv8yFN","ix74rd85a9","M6qcGqUJMd","uupzkLewvM","45cIHprNT6","P6bcg6AFT0","C2IrcqaofN","hSSvQFNYIM","POUYSkZANm","DLhzM0ao3l",
+"Kr8ysqaofN","5IhmGM3zXL","uLtKsRACuj","StlDJQ6Lix","Kr8ysS77LH","OHaBz0Wr5y","pvgjSZv7z0","zFgtBVNCPd","WPmlxyEfy9","pvgjSUlU3M",
+"JXljWDz1R3","FnPFBazIWp","uTacxrKDLJ","Pb1paoVQp6","YOfrYh1zcH","Chuy3HP433","DLhzMjzUqR","NcICA2Nslm","i3pyd1j5L8","i7WMQF6PT2",
+"MGlTFtaOXK","KASQ8zQt6Q","fmIK1lXFOB","TXQ0Zuvf7A","F6PT224ARF","FNYIMhUTw7","EdBKcpWiOs","tl72WHzZT8","POUYSguMb8","8FmFH9y4lw",
+"rhl0JazIWp","gIYvEhe9IA","rhl0JI7p2a","2hEEUuZPqg","uN6r33weIF","i3pydQnJ1S","5VZjShYBCK","5Drn0CxVEf","bZLvSVLTy6","oQ87rFcWrW",
+"QClRLi7WMQ","e6e4zguMb8","BGaQYPYBf4","7Ow5C14FLR","soy9tuJScX","5ZaEzW7cTs","qUJMdoQ87r","e6e4zEOE1o","9y4lw0MR5X","1j5L8KZamH",
+"2hEEUyEfy9","6AFT0HlUbF","lViBvlCMxy","nlaByFLsph","gdQsSFNYIM","07n1cB3qem","ZUnqt24ARF","FGzgpQ6hMC","Yh1hFmX2GE","MGlTFGXdoH",
+"U3yw5Pb1pa","LewvMWMiS3","v2eC3ru4UG","aez9yiqv4k","jS1ajbgJAz","4QMc9soy9t","HP433MK07Y","2hEEUxReec","uLtKsDG4sT","sx5Glk85Ae",
+"B3qemix74r","HRxd8nlaBy","t98iWuPX7G","0h1b1FPfSE","pWiOs5drc6","IBe8k5Mg9r","i3pyd2Nslm","7hyVv6q6L9","O3iyQ6q6L9","NhXduQssNC",
+"brhlQaDGtS","suY4xgdQsS","azIWp0ao3l","UlU3MfFDrJ","4dEz6SWfou","QWxoTZv7z0","ZuDtDDQimp","rz7UtAmdQd","hYBCKtjQxs","8FmFHFcWrW",
+"euZA5L7cGc","RpBQmi3pyd","tvdkDPYBf4","yToGW5iGN5","M3zXLgjUTu","MojnP2Nslm","RACuj55rfB","F6PT2prNT6","JkzUnIjTwP","vLsmS1j5L8",
+"HzZT8lCMxy","gjUTuvOqCE","lkMUAAkKTk","guMb8W7cTs","FNYIMsuY4x","EOE1oLewvM","580YD14FLR","pmeCdvOqCE","uvf7AMkgy8","piJSkd85a9",
+"Cp3mZOz8yZ","9eoRcBFkb8","LDk6fdjsrv","CqqaD7fsYM","LewvMVIlwP","K20wKOUYuF","8hJdtnnP8o","gf8rIX6Pin","ulk41XflUq","No0QbnlaBy",
+"F6PT2AgJHQ","uJScX55rfB","6q6L9yluBx","tl72WRpBQm","MK07Y2Yz7E","l83Ud8hJdt","Yf2EcuQIcz","SbRYytvdkD","0KyfsUlU3M","zFgtB580YD",
+"wDajXvLsmS","qUJMdy94nw","n8pJ9hE1Ql","aL6AJRBhp0","d7vjMRBhp0","Uvlv4Zv7z0","dhSuHPb1pa","W7cTspmeCd","pvgjS5ZaEz","Z4I1v0Wr5y",
+"CNHmvY1mC0","2Nslme6e4z","qQxHP5VZjS","gf8rIuTacx","sqVrf45cIH","kZANmOUYuF","AgJHQW7cTs","2Yz7E1LB1L","Chuy3VIlwP","tjQxsDz1R3",
+"2Yz7E7X3uy","OUYuFB3qem","atef2IRh48","kB5nPzz4ZU","oGu6xuupzk","s4786s93Ml","0MR5X3otm6","ydG8UAmdQd","cL0aEpv0i7","cShY2OHaBz",
+"7fsYMatef2","mz8gxgjUTu","suY4xZJTXH","BpYhVdpe1v","FLsphjSjS3","XflUq07n1c","ZzJHWn1pmO","MK07Y64s8N","gtCA5nlaBy","yofH3Oz8yZ",
+"TwanouLtKs","8TxD7Chuy3","s4786nlaBy","lViBv48cHL","0YAGH7ku1p","5IhmG7lUXZ","s7MxkMojnP","J2mQiAgJHQ","MmsIoh1zcH","Vprf2ThjNn",
+"jtn0XRzaZA","L7cGcYjB9t","zQt6QYh1hF","8hJdtThjNn","5ZaEzCK5W7","JXljWOxWIH","jzUqRqUJMd","uZPqg0Kyfs","EoToP8hJdt","Nxx9VMmKGJ",
+"YOfrYFVMxo","W7cTsUmaEv","Kr8ysFwEJz","jzUqR7fKYU","FwEJzhi5X7","yToGWpiJSk","soy9tjfREu","iqv4kAXpwE","2DREsNOHsz","WMiS3zHF1q",
+"KsjRKGXdoH","L7cGcEoToP","SmGzv2Nslm","0YAGH7fsYM","KZamHCIShG","45cIHlweGy","zQt6Qrz7Ut","uvf7ANhXdu","rz7Ut5Drn0","zqH0Wd7vjM",
+"2DREsWreyP","JIqXipWiOs","MmKGJO3iyQ","8RCUAQssNC","FVMxoCNHmv","8FmFHFjHXR","Ss0ZuaL6AJ","s93MlCfgr3","AkKTkb29RJ","aez9yPb1pa",
+"cShY2S2Dfu","C2Irc2DREs","wDajXTwano","ZUnqtGWqqX","RsQUqYw2oU","suY4xS2Dfu","x3LDeYOfrY","8xEKzKZamH","LewvMWreyP","Y1mC0rz7Ut",
+"WPmlxs7Mxk","e6e4zZzJHW","QworuyofH3","AIYUubZLvS","7fsYMcShY2","RzaZAFhtgl","djsrv9y4lw","suY4xcmXIX","taOXKnnP8o","1LB1LksJby",
+"uJScXjiVBP","s7MxkVprf2","W7cTsXyPZN","a00b5lpF6W","pT8wu0h1b1","Yw2oURzaZA","1v5hHJ2mQi","2DREslsQGo","kZANmfaHir","tlILt0YAGH",
+"uTacxvkCHH","Z4I1vZJTXH","ZzJHWbrhlQ","1LB1LK4GS8","ECMvU2hEEU","9rlg9fcwDa","atef2k85Ae","7hyVvs7Mxk","rz7UthUTw7","580YDb29RJ",
+"BbwgA1j5L8","lweGy5Mg9r","jiVBPcmXIX","RsQUqMmsIo","8cVD3zY1GY","OUYuFC2Irc","SjskQy94nw","v8yFNguMb8","3otm6PYBf4","IKxdLHRxd8",
+"x3LDeLDk6f","soy9tVIlwP","yofH3soy9t","I7p2aRmDcr","taOXK29QAz","WDVWJ64s8N","ZuDtDKsjRK","uoStwIjTwP","aez9yuLtKs","8cVD31v5hH",
+"x3LDeUmaEv","ciuWz9XyT9","8FmFHzz4ZU","FnPFBRACuj","WaWsvBFkb8","ydG8UwiHrZ","Zv7z0hi5X7","G1RhSVerEA","GSQwjfLNg8","MezSWEdBKc",
+"BbwgAwiHrZ","QChxsZ4I1v","W3VFH618Di","zQt6QaDGtS","ThjNnqUJMd","suY4xhSSvQ","IKxdLtAOsr","Ss0ZuPOUYS","he9IA0Kyfs","piJSkjSjS3",
+"tvdkD8xEKz","4W0Tl8cVD3","lpF6W2Nslm","HfyNQCdyBV","RsQUq1j5L8","zmLYD3weIF","3otm6ulk41","v2eC3AOgEe","6q6L9ZhwG1","MmKGJ5Mg9r",
+"ECMvU4QMc9","azIWp5ZaEz","dQ586IjTwP","0KyfsBpYhV","Cp3mZokgRi","jS1ajpAhR1","faHirlweGy","64s8NtuDyS","Dz1R3s4786","YOfrYhe9IA",
+"dpe1vrKDLJ","RxrsmyofH3","sx5GlaFFss","In3NSZhwG1","9XyT9Dz1R3","8hJdtDz1R3","hSSvQWDVWJ","4dEz6v2eC3","5drc6qQxHP","2Yz7EAgJHQ",
+"ZuDtD29QAz","s7MxkblLA9","RzaZA8TxD7","CxVEfgf8rI","uPX7GqaofN","v1HlnFhtgl","okgRiblLA9","5NammsqVrf","IKxdL0Kyfs","cL0aEpiJSk",
+"JJs5mzz4ZU","XyPZNFPfSE","7hyVvvLsmS","yEfy9FnPFB","Zv7z0fqypy","jeskSQbxXc","RxrsmlCMxy","he9IACp3mZ","W3VFHpWiOs","Kr8ys4QMc9",
+"MK07YtuDyS","uoStw9eoRc","QChxstjQxs","e6e4zb29RJ","WMiS3LDk6f","pmeCd8FmFH","pv0i7Fhtgl","CxVEfK20wK","9GXkXaFFss","Q6hMCCK5W7",
+"MojnPB3qem","uZPqgl83Ud","zFgtBblLA9","YjB9tZuDtD","IBe8kgdQsS","8TxD7MojnP","0ao3lzmLYD","5nmWvNo0Qb","JkzUnChuy3","tjQxsuupzk",
+"YjB9twiHrZ","fcJOyzz4ZU","b29RJzY1GY","2NslmOUYuF","y94nwNhXdu","Nxx9VgtCA5","bZLvS7X3uy","7X3uyt59lR","fLNg82DREs","rKDLJ9y4lw",
+"QnJ1StlILt","rhl0JMkgy8","7ku1pK20wK","8FmFHt98iW","lViBv5iGN5","Dz1R3jfREu","JIqXitjQxs","pv0i7MK07Y","FnPFBt59lR","blLA9FxX9q",
+"C2IrcMGlTF","8cVD39rlg9","pv0i7ogLgc","nnP8odmoS7","FFDuidpe1v","o8Uyd9rlg9","wiHrZydG8U","uN6r3MGlTF","CNHmvFFDui","oQ87rpvgjS",
+"OxWIH2Nslm","Z4I1vQnJ1S","O3iyQjSjS3","tl72Waez9y","uTacxM6qcG","euZA507n1c","SmGzv0YAGH","uZPqgyluBx","QnJ1ScShY2","9GXkX2TRI7",
+"MojnPQChxs","L7cGcGXdoH","e6e4zRpBQm","QssNCGWqqX","EoToPBGaQY","oQ87r9rlg9","fmIK1K20wK","P6bcgtlILt","i7WMQ7X3uy","LbRTHyEfy9",
+"K4GS8hE1Ql","RACujMK07Y","xciqpIjTwP","ZJTXHOz8yZ","pAhR1he9IA","FGzgpWaim6","oVQp6x3LDe","pWiOszbIYY","jfREu0PktI","pvgjSAmdQd",
+"wDajXZv7z0","zY1GY1v5hH","5drc6BpYhV","2ZHdkDcpWB","NOHsz7X3uy","dpe1vFcWrW","RmDcrzFgtB","AOgEe0Kyfs","yToGW8U2nU","x3LDemX2GE",
+"SmGzvKZamH","5ZaEzFVMxo","pWiOs24ARF","7fsYMMK07Y","HP433NOHsz","vOqCECK5W7","D6rByQYxC0","aFFssRsQUq","y94nwfcwDa","6AFT0SbRYy",
+"ulk41SmGzv","JRJQBCK5W7","l83Ude6e4z","Dz1R3Pb1pa","ksJbyx3LDe","3otm6CqqaD","2ZHdkUl4a1","QbxXcQssNC","9y4lwfqypy","S2DfuZzJHW",
+"yToGWZv7z0","EoToPqQxHP","KZamHmz8gx","8TxD7fcJOy","gf8rI5nmWv","5VZjSAIYUu","9rlg98TxD7","RkQke9iGoT","ZzJHW4QMc9","ReKEWFLsph",
+"nlaBypvgjS","Yh1hFl83Ud","GrDg7JJs5m","Gv3FqbZLvS","o8Uydx3LDe","B3qemQWxoT","7fKYUdpe1v","ReKEWVLTy6","i3pydFLsph","k85AeLbRTH",
+"hi5X7zY1GY","fFDrJCp3mZ","jS1ajxciqp","blLA9ThjNn","HzZT8pWiOs","h1zcHK4GS8","a00b5QbxXc","pFrrliB08l","kB5nP580YD","gdQsS9rlg9",
+"JkzUnyEfy9","ZUnqt1LB1L","8FmFHvLsmS","pWiOsLewvM","OxWIHRkQke","RsQUquN6r3","9GXkXJ2mQi","6AFT0e6e4z","AIYUuazIWp","yluBxrhl0J",
+"64s8NFPfSE","MmsIoQChxs","jfREuatef2","K4GS8dQ586","oVQp6TCgPp","StlDJGrDg7","IKxdLM6qcG","Gv3FqlCMxy","JXljWi3pyd","jSjS3JXljW",
+"Z4I1vBGaQY","ix74rIjTwP","AgJHQSmGzv","Cp3mZB3qem","TXQ0ZazIWp","7fsYM7X3uy","7lUXZ580YD","GSQwjrhl0J","0BmCyiB08l","5VZjSqUJMd",
+"5Drn0dhSuH","euZA5JRJQB","RmDcr0MR5X","RACujv8yFN","lpF6W7Ow5C","8xEKze6e4z","StlDJuLtKs","jzUqRZJTXH","07n1c29QAz","AXpwE9GXkX",
+"8hJdtyluBx","B3qemtaOXK","k85Aehe9IA","TXQ0ZP6bcg","FNYIMsqVrf","9y4lwzHF1q","DcpWBWmadA","rhl0JlweGy","G1RhSCfgr3","SbRYyfFDrJ",
+"iqv4kDLhzM","HlUbF2Yz7E","0MR5XaFFss","8xEKzcmXIX","WreyP6AFT0","QYxC0RACuj","48cHLOUYuF","he9IA2DREs","pAhR1CNHmv","MojnPZ4I1v",
+"vkCHHPYBf4","Ta8f6VerEA","MojnPMGlTF","fcJOyxciqp","Ta8f61v5hH","ZuDtDwDajX","NOHszJRJQB","dhSuH580YD","2Yz7EVNCPd","Dz1R3W7cTs",
+"IBe8kmX2GE","piJSk1LB1L","Q6LixReKEW","pT8wuTCgPp","tvdkDJ2mQi","VerEA0BmCy","HP433Yf2Ec","KASQ8WMiS3","5Drn0NcICA","Zv7z02TRI7",
+"x3LDeVLTy6","rhl0JWaim6","s4786hSSvQ","lm0pDHP433","0ao3lBbwgA","zqH0WCdyBV","bgJAz1j5L8","cmXIXVjCZq","QnJ1SAmdQd","HfyNQ5Namm",
+"3otm60Wr5y","tlILt5iGN5","6q6L9fcJOy","lCMxy2Nslm","580YDulk41","TXQ0Zl83Ud","dpe1vQworu","7X3uyk85Ae","bgJAz8hJdt","QbxXcjfREu",
+"zmLYDzbIYY","2TRI7UmaEv","WmadA3weIF","LDk6fsoy9t","CxVEfZUnqt","5nmWvK20wK","9iGoTNhXdu","HP433Fhtgl","VLTy6pT8wu","d7vjMZv7z0",
+"pT8wulH1kt","hYBCKdQ586","9XyT9guMb8","EdBKcuN6r3","LewvM8xEKz","tAOsryofH3","m4bxUk85Ae","sx5GlyluBx","ix74rfcwDa","IBe8kCK5W7",
+"UlU3M5Drn0","pvgjSRxrsm","yofH3nnP8o","y94nwpAhR1","aL6AJEdBKc","sx5GlFxX9q","RACuj14FLR","DcpWBpvgjS","bZLvSOHaBz","YOfrYwiHrZ",
+"iwzGkLDk6f","Kr8ysazIWp","BbwgAuZPqg","XflUqaez9y","fFDrJOUYuF","lj07QL7cGc","14FLR4QMc9","HfyNQUl4a1","HRxd8SmGzv","MK07Yrz7Ut",
+"d85a9No0Qb","zQt6Q4QMc9","pFrrlFnPFB","9XyT9iB08l","BFkb8S77LH","UlU3MF6PT2","7lUXZksJby","IRh48e6e4z","9XyT9Twano","StlDJTCgPp",
+"lsQGoWDVWJ","X6PinHzZT8","FcWrWVIlwP","8FmFHU3yw5","VLTy69GXkX","ECMvUuJScX","b29RJru4UG","hUTw7X6Pin","oQ87ruupzk","hi5X7wDajX",
+"EOE1osx5Gl","fqypyyvOMI","uTacxSs0Zu","nFqikIn3NS","NAFuw1v5hH","VjCZq5IhmG","S2DfuRACuj","blLA9BbwgA","2Yz7EnnP8o","tlILtpiJSk",
+"5ZaEzQ6hMC","TCgPpxXTI4","yToGWMmsIo","8TxD7K4GS8","ZzJHWvLsmS","MK07Y2Nslm","7fsYM4dEz6","SjskQSWfou","Dz1R3n1pmO","okgRiDLhzM",
+"MojnP8U2nU","fFDrJZJTXH","v2eC3XyPZN","1v5hHvkCHH","QYxC0IBe8k","JIqXiWaWsv","UmaEvpiJSk","5VZjSe6e4z","tvdkDP6bcg","0BmCyokgRi",
+"aL6AJDLhzM","QWxoTXflUq","2hEEUksJby","QworulViBv","Cp3mZPb1pa","MojnP1v5hH","BCxeCqaofN","24ARFJkzUn","I7p2aKsjRK","FjHXRTCgPp",
+"QnJ1SjSjS3","RmDcrsuY4x","OHaBz0MR5X","5IhmG9XyT9","S2DfuRBhp0","d7vjMFFDui","5Mg9rhYBCK","tlILtKr8ys","16lHcHRxd8","8xEKzCp3mZ",
+"vOqCEogLgc","DLhzMrKDLJ","qUJMdThjNn","5VZjSy94nw","atef2SbRYy","9y4lwYjB9t","Yh1hFGSQwj","ZzJHWLbRTH","tvdkDazIWp","OUYuF6AFT0",
+"8RCUA8xEKz","VNCPdRBhp0","K4GS8suY4x","L7cGcjeskS","nlaBy9GXkX","S77LHt59lR","v2eC3yEfy9","EOE1oAmdQd","618DiZhwG1","Chuy3fqypy",
+"NOHszgf8rI","uPX7GAgJHQ","VjCZqJIqXi","K4GS845cIH","DG4sTRkQke","0ao3lm4bxU","o8Uydi7WMQ","kZANmZv7z0","y94nw5IhmG","7fKYUReKEW",
+"S77LHTCgPp","HRxd8yluBx","J2mQiXflUq","BCxeC14FLR","2ZHdkpiJSk","suY4xJXljW","YjB9tnFqik","b29RJK20wK","t59lRQ6Lix","ni2v1rhl0J",
+"qaofNjfREu","Cfgr3uvf7A","9rlg9he9IA","MmsIoRkQke","64s8N2hEEU","SbRYyW7cTs","0Wr5ybZLvS","SmGzvs93Ml","uLtKsnnP8o","VIlwPFnPFB",
+"DLhzM580YD","uLtKsa00b5","JJs5mfcJOy","HzZT8J2mQi","cmXIX7fKYU","IBe8kYf2Ec","Yh1hFYjB9t","C2IrcLewvM","MaJQsd7vjM","9XyT9k85Ae",
+"S2Dfu1LB1L","n1pmOLewvM","580YDJRJQB","4dEz60h1b1","fcJOyNhXdu","0BmCyUmaEv","e6e4zS77LH","RpBQmblLA9","5iGN5ciuWz","cShY2MK07Y",
+"0PktIHRxd8","jiVBP5drc6","FwEJzgjUTu","DG4sTCp3mZ","5drc6zQt6Q","Ta8f648cHL","618DiQ6Lix","ZuDtDtaOXK","ZUnqtMGlTF","iqv4kcmXIX",
+"IKxdLazIWp","OxWIHnlaBy","TXQ0ZciuWz","VIlwPprNT6","StlDJQssNC","MmKGJsx5Gl","MmsIo4QMc9","3otm6xXTI4","7fsYMPOUYS","ZuDtDjS1aj",
+"BpYhVCNHmv","MojnPy94nw","i7WMQ1LB1L","AgJHQwiHrZ","D6rByjeskS","2Nslm7X3uy","EOE1os4786","ksJbyHzZT8","d85a9Mkgy8","FcWrWKr8ys",
+"jS1ajVBjhz","7fsYMCfgr3","P6bcgzqH0W","n1pmO5Namm","VerEAtvdkD","GSQwjRmDcr","EoToPjfREu","RzaZAnlaBy","uTacx3otm6","zFgtBpT8wu",
+"fqypykB5nP","MmKGJC2Irc","FGzgp7fKYU","PYBf4RACuj","RACujzmLYD","b29RJoGu6x","In3NS0Kyfs","16lHcyvOMI","Pb1paQbxXc","W7cTsZzJHW",
+"brhlQQssNC","guMb8QChxs","hE1QlQssNC","i3pydiB08l","uAWypuoStw","FVMxoulk41","U3yw5faHir","yToGWUmaEv","7fsYMazIWp","JXljWLDk6f",
+"HlUbFjfREu","gf8rIAmdQd","zqH0WcL0aE","RBhp0Q6Lix","IRh48ZhwG1","fLNg8hYBCK","nlaBytAOsr","HP4337fsYM","OUqFMvOqCE","CdyBVWaim6",
+"brhlQv2eC3","HfyNQv2eC3","9rlg9uvf7A","jzUqRQYxC0","FwEJz14FLR","MmsIoHfyNQ","yofH3BGaQY","nFqikOUqFM","MmKGJAXpwE","m4bxUOz8yZ",
+"fFDrJ5Namm","yluBxi7WMQ","lXFOByvOMI","QYxC0EdBKc","9GXkXSbRYy","tvdkD45cIH","hYBCK0PktI","SmGzvyEfy9","DcpWBFwEJz","Zv7z0uN6r3",
+"2TRI7zmLYD","StlDJ8hJdt","2hEEU48cHL","QbxXc618Di","Fhtgl8xEKz","o8UydtjQxs","5NammzFgtB","dmoS7KZamH","m4bxUGSQwj","guMb8xciqp",
+"5IhmGzY1GY","Rxrsmh1zcH","jzUqRBFkb8","iqv4kmX2GE","ZuDtDyToGW","UmaEv29QAz","fcJOyDLhzM","zmLYDulk41","hSSvQyluBx","QClRLd7vjM",
+"Waim65drc6","I7p2ajzUqR","VerEACxVEf","rKDLJFnPFB","zQt6QL7cGc","FwEJzgtCA5","M6qcGS2Dfu","TXQ0ZQssNC","AmdQd14FLR","hUTw7JkzUn",
+"jtn0Xrz7Ut","n1pmOBGaQY","prNT6cL0aE","jSjS3BGaQY","5nmWvFcWrW","pvgjSWmadA","WmadAP6bcg","ni2v1XyPZN","5nmWvaFFss","J2mQiRBhp0",
+"MmKGJlm0pD","RxrsmBpYhV","a00b5rhl0J","VjCZq7X3uy","I7p2afcJOy","48cHLEoToP","Cp3mZksJby","v1HlnzmLYD","JIqXizFgtB","brhlQzY1GY",
+"RsQUqGv3Fq","LewvMHfyNQ","QWxoTiwzGk","In3NSMmsIo","jfREuGXdoH","8RCUAfcwDa","v8yFN8RCUA","9iGoT9XyT9","JKWYR4dEz6","9rlg9xciqp",
+"lkMUAM3zXL","4dEz664s8N","zHF1qaFFss","CNHmv2DREs","POUYSFcWrW","9y4lwpiJSk","gIYvEnnP8o","Mm8siFhtgl","sqVrfuQIcz","0ao3llCMxy",
+"OUqFMMaJQs","0YAGH7X3uy","TXQ0ZgIYvE","NAFuwMmsIo","WaWsvulk41","iwzGkOxWIH","FPfSE0Kyfs","AkKTki7WMQ","JXljWBpYhV","mz8gxjSjS3",
+"RxrsmlViBv","oVQp62hEEU","Vprf2MGlTF","Dz1R3B3qem","QClRL64s8N","zz4ZUaez9y","K4GS8S77LH","Ss0ZuI7p2a","uupzkiwzGk","zFgtBnnP8o",
+"iqv4kLbRTH","WPmlxThjNn","FhtglpiJSk","RmDcruJScX","xXTI4mz8gx","0Wr5yFxX9q","fcJOyzY1GY","XflUqhSSvQ","GXdoHhe9IA","fLNg8h1zcH",
+"VIlwPHfyNQ","iB08lKsjRK","P6bcgt59lR","tlILtVBjhz","gdQsSKZamH","pT8wugjUTu","oQ87rM6qcG","lH1ktC2Irc","MGlTFBFkb8","taOXKcmXIX",
+"ru4UGsoy9t","hUTw7tlILt","e6e4zCdyBV","lm0pDv2eC3","FVMxon1pmO","nFqikbrhlQ","ciuWzhSSvQ","MaJQsMezSW","JIqXiYh1hF","FGzgpyEfy9",
+"MK07YG1RhS","B3qemtuDyS","7lUXZyvOMI","b29RJbZLvS","DcpWBVprf2","CxVEfMmsIo","Mkgy8uTacx","lH1ktK20wK","lm0pDKsjRK","Dz1R32Yz7E",
+"BpYhVAkKTk","2hEEUTCgPp","G1RhSTXQ0Z","zY1GYY1mC0","MK07YCfgr3","AIYUublLA9","lXFOBCp3mZ","uPX7GHRxd8","i3pydFjHXR","5iGN5DcpWB",
+"BbwgAzbIYY","XflUqRACuj","0MR5Xhe9IA","Chuy3GSQwj","S77LHlsQGo","CxVEfHRxd8","tl72WFFDui","IjTwPy94nw","Uvlv4QClRL","MojnPuQIcz",
+"a00b5Mm8si","FnPFBDLhzM","rhl0JCNHmv","Waim6AgJHQ","azIWp0YAGH","gIYvE5iGN5","X6PinkB5nP","IRh481LB1L","lweGyBFkb8","CqqaDrKDLJ",
+"y94nws4786","NAFuwDQimp","RmDcrSbRYy","CIShGOUqFM","lXFOBpv0i7","RxrsmOz8yZ","5IhmGC2Irc","VerEA07n1c","GXdoHuAWyp","k85AennP8o",
+"ru4UGb29RJ","QYxC0cL0aE","JJs5mzHF1q","5drc6M3zXL","HzZT8VIlwP","uLtKs6q6L9","Pb1paFwEJz","I7p2aokgRi","QYxC0Waim6","FjHXRxXTI4",
+"X6PinEdBKc","16lHc29QAz","580YDbgJAz","okgRi29QAz","MGlTFlweGy","DQimpKASQ8","Pb1paNo0Qb","MmsIoDLhzM","tuDySQnJ1S","fqypyhe9IA",
+"lCMxyQ6Lix","CxVEfLewvM","Waim6cShY2","JXljWoQ87r","Dz1R3yvOMI","VBjhzRzaZA","U3yw5dhSuH","EoToPoVQp6","CqqaD5IhmG","he9IAe6e4z",
+"KASQ8uvf7A","rz7Utrz7Ut","FxX9qrKDLJ","s93Mlrz7Ut","7ku1p7hyVv","WDVWJHRxd8","7Ow5CBbwgA","W7cTsdQ586","NcICAChuy3","NAFuwGrDg7",
+"CxVEf0ao3l","ZJTXH0PktI","yEfy9Twano","yToGW5Mg9r","jtn0Xh1zcH","lm0pD48cHL","4dEz6guMb8","pWiOsKZamH","K4GS8RmDcr","FVMxo580YD",
+"NhXduzmLYD","FLsph7fKYU","AkKTklkMUA","5Namm8cVD3","5drc6aDGtS","cL0aEJRJQB","AgJHQl83Ud","Ss0ZunFqik","Cp3mZ5Mg9r","Yh1hFpmeCd",
+"hYBCKaFFss","dhSuH9XyT9","K20wKazIWp","3weIFMojnP","mX2GES2Dfu","ni2v1Uvlv4","yToGWpFrrl","zmLYDdhSuH","Mkgy8xciqp","nFqik0Kyfs",
+"uvf7ApFrrl","hYBCKk85Ae","GSQwjXflUq","Cfgr3MezSW","KASQ8Nxx9V","F6PT2xciqp","qUJMd9XyT9","OxWIHuQIcz","gIYvEEoToP","nFqikv1Hln",
+"Zv7z00PktI","uLtKsoGu6x","k85AePYBf4","bgJAzlCMxy","sqVrfogLgc","EoToPfqypy","In3NSFhtgl","s7MxkIKxdL","jtn0X2TRI7","hi5X7prNT6",
+"zmLYDbZLvS","fFDrJZuDtD","qaofNGXdoH","ix74rWmadA","nFqiktl72W","ru4UGReKEW","rz7UtJ2mQi","0h1b1IBe8k","lsQGoZv7z0","BGaQY0BmCy",
+"Yh1hFI7p2a","DQimpRmDcr","e6e4zfcJOy","GWqqXlj07Q","lweGyzQt6Q","IRh48WDVWJ","nlaByZhwG1","rz7UtNcICA","RBhp0euZA5","yEfy9d7vjM",
+"No0QbaDGtS","Fhtgl2Nslm","0BmCyyluBx","FwEJzfLNg8","5Mg9rlH1kt","14FLRv1Hln","pvgjSYjB9t","2ZHdkHlUbF","8U2nUCfgr3","Yf2EclsQGo",
+"EdBKclH1kt","9rlg9gdQsS","Yh1hFFGzgp","Chuy3ZuDtD","FcWrWi7WMQ","Waim6kZANm","aDGtSuZPqg","CdyBV2hEEU","lkMUAAOgEe","DcpWB8xEKz",
+"n8pJ9Q6hMC","BFkb8MmKGJ","FFDui8RCUA","qQxHPtuDyS","8RCUAECMvU","o8UydFNYIM","JIqXivOqCE","HP433pFrrl","1j5L8RpBQm","64s8NJKWYR",
+"SmGzvdmoS7","xciqpBbwgA","5ZaEzSmGzv","5VZjS0BmCy","NAFuwDcpWB","8TxD77hyVv","zqH0WpiJSk","UmaEvSbRYy","lm0pDOz8yZ","WmadA8U2nU",
+"KZamHGrDg7","jS1ajm4bxU","FxX9qbrhlQ","uN6r31v5hH","16lHcrKDLJ","4W0TlZzJHW","JXljWbZLvS","rhl0JDcpWB","azIWpaL6AJ","YjB9t5VZjS",
+"SjskQuLtKs","jS1ajiwzGk","gf8rIBFkb8","0MR5XFNYIM","Y1mC09eoRc","DLhzMXyPZN","tjQxsEoToP","CdyBVRxrsm","nFqikNAFuw","JkzUnd85a9",
+"jzUqRhYBCK","WMiS3m4bxU","FxX9qxciqp","HzZT8VLTy6","s7Mxk8FmFH","ZzJHWGSQwj","0BmCyWPmlx","Ss0ZuzbIYY","t98iWO3iyQ","FjHXRX6Pin",
+"y94nwrhl0J","8cVD3HfyNQ","oQ87rguMb8","IBe8kG1RhS","pFrrlP6bcg","9rlg9FLsph","lpF6WVprf2","No0QbkZANm","dpe1vb29RJ","ru4UGGSQwj",
+"qUJMdiKqhr","RsQUqtjQxs","DcpWBazIWp","ni2v1tjQxs","4W0TlkB5nP","zqH0WX6Pin","UlU3MRkQke","C2IrcfcwDa","HzZT8zHF1q","7fsYM7fsYM",
+"jiVBPzbIYY","2TRI7kB5nP","uQIczHRxd8","2Yz7E5Drn0","WPmlx8RCUA","4QMc9tAOsr","v8yFNsx5Gl","2TRI7JIqXi","uoStwbZLvS","FPfSEfFDrJ",
+"NOHszi7WMQ","tAOsrcQOnv","NAFuwciuWz","i3pydCNHmv","cmXIX4dEz6","lweGyKZamH","v2eC3tjQxs","uoStwAOgEe","uZPqg4dEz6","5IhmG9GXkX",
+"29QAzgjUTu","n8pJ9HzZT8","5IhmGcmXIX","8xEKzYw2oU","Kr8ysK4GS8","oVQp6C2Irc","MaJQslkMUA","ZhwG1zmLYD","lXFOB0PktI","7fKYUogLgc",
+"JIqXiDQimp","0BmCyM3zXL","X6Pina00b5","zbIYYnnP8o","0BmCypWiOs","HlUbFlH1kt","lsQGoxReec","wiHrZAgJHQ","ZUnqtFcWrW","0ao3luvf7A",
+"BGaQYzqH0W","QnJ1SlXFOB","CqqaD24ARF","DG4sTC2Irc","aFFsslkMUA","lj07Q8U2nU","OxWIHWmadA","No0QbIRh48","0YAGH2hEEU","vkCHHpT8wu",
+"Ss0Zu4QMc9","RkQke29QAz","ReKEW0h1b1","azIWpzz4ZU","SjskQv8yFN","jzUqRK4GS8","iqv4kQChxs","W3VFH16lHc","yToGWzFgtB","U3yw5SmGzv",
+"uLtKsBFkb8","sx5Glru4UG","SjskQRzaZA","Q6LixfmIK1","yEfy98RCUA","FjHXRblLA9","yofH3WMiS3","ix74rSs0Zu","hE1QlgjUTu","NhXduRpBQm",
+"0Wr5y5Namm","m4bxURBhp0","GrDg7ni2v1","RsQUqdhSuH","iKqhrgjUTu","fcwDaNOHsz","BpYhVMojnP","vLsmS8xEKz","Vprf2lkMUA","gdQsShe9IA",
+"uvf7AMmKGJ","RmDcrGrDg7","8U2nUWmadA","6AFT0piJSk","O3iyQlkMUA","hUTw7taOXK","ReKEWl83Ud","i3pydFcWrW","vOqCE8U2nU","U3yw5lj07Q",
+"uZPqgn1pmO","OHaBzokgRi","0Wr5yZUnqt","FjHXRsoy9t","vkCHHb29RJ","2hEEUtAOsr","b29RJFxX9q","iB08lfaHir","zz4ZUdpe1v","zFgtBcmXIX",
+"JKWYRrhl0J","2ZHdkCxVEf","8cVD3X6Pin","DQimpAmdQd","aL6AJVNCPd","e6e4zDz1R3","5nmWvPYBf4","SjskQHlUbF","nFqikPb1pa","zqH0W3otm6",
+"Y1mC0wDajX","FVMxoWMiS3","8xEKzqUJMd","OUqFMhi5X7","euZA545cIH","brhlQSjskQ","55rfBOHaBz","FcWrWVBjhz","DG4sTBbwgA","WreyPuPX7G",
+"YjB9tqaofN","C2IrcwiHrZ","fLNg87ku1p","JKWYRUl4a1","JRJQB2DREs","WaWsvxciqp","QbxXc2ZHdk","zFgtBJkzUn","rhl0JWMiS3","2NslmJKWYR",
+"aFFssZJTXH","yToGWe6e4z","tvdkDPOUYS","tuDyS0h1b1","8U2nUDQimp","pT8wuYjB9t","rhl0J2Yz7E","dmoS7StlDJ","Ta8f6lsQGo","oVQp6Q6Lix",
+"S77LHWaim6","9eoRcxciqp","jS1ajoGu6x","uJScXZUnqt","xciqpS2Dfu","L7cGc6AFT0","WPmlxd85a9","t98iWnFqik","lH1kt4QMc9","8U2nUB3qem",
+"8RCUA7Ow5C","SmGzvJkzUn","lweGyL7cGc","W7cTsiwzGk","fFDrJWreyP","F6PT2d85a9","dmoS7SbRYy","mz8gx0Kyfs","JXljWkZANm","YjB9tVLTy6",
+"piJSkfFDrJ","G1RhSStlDJ","29QAznlaBy","ZzJHW5Namm","mz8gxXflUq","9iGoTbgJAz","0Wr5yvkCHH","fmIK1SjskQ","hi5X7sqVrf","xciqpK20wK",
+"K4GS87X3uy","AmdQdAmdQd","G1RhSVIlwP","uJScXIjTwP","HlUbFuLtKs","8cVD3Ta8f6","BGaQYAkKTk","W3VFHguMb8","Yw2oUNo0Qb","Q6hMC2hEEU",
+"ZzJHWUmaEv","2TRI7TCgPp","cL0aE14FLR","OUqFMVNCPd","dhSuHblLA9","In3NSpAhR1","ulk41RkQke","b29RJFwEJz","IjTwPuJScX","2Yz7EK20wK",
+"DLhzM9eoRc","9y4lwBCxeC","45cIHfaHir","v8yFNlH1kt","oVQp6Ta8f6","QClRL9XyT9","Nxx9VRkQke","IjTwPOHaBz","VLTy6ECMvU","RmDcrZ4I1v",
+"qQxHPru4UG","ReKEWsoy9t","s4786pvgjS","6q6L92TRI7","BCxeCBpYhV","fmIK1rhl0J","fmIK1rz7Ut","sx5GlWDVWJ","QChxsOxWIH","s7MxkFxX9q",
+"jS1ajzmLYD","dQ586hUTw7","pmeCdKsjRK","jtn0Xs4786","618DiZuDtD","iqv4kzqH0W","NhXduCqqaD","t98iWlj07Q","dhSuHWaim6","VNCPdmz8gx",
+"rhl0JnFqik","Chuy3t59lR","MaJQsaez9y","8TxD7soy9t","JKWYR0PktI","n1pmOuAWyp","prNT6v1Hln","5drc6X6Pin","hSSvQ24ARF","FnPFB6q6L9",
+"G1RhSoGu6x","FNYIMmz8gx","7hyVv7lUXZ","QClRLgjUTu","Ta8f60h1b1","O3iyQi7WMQ","uPX7GOHaBz","wiHrZtaOXK","jtn0XD6rBy","0KyfsZv7z0",
+"euZA5uLtKs","JIqXiuJScX","KASQ8guMb8","he9IAMmsIo","OUqFMtjQxs","Yw2oUtuDyS","TXQ0ZRkQke","M3zXLoGu6x","uupzkFGzgp","hUTw7b29RJ",
+"OxWIH48cHL","GWqqXIn3NS","FGzgpBCxeC","sqVrf48cHL","fmIK1cmXIX","fLNg80ao3l","fmIK1lweGy","gf8rIxXTI4","9rlg9aDGtS","uAWypThjNn",
+"SWfouatef2","NcICASmGzv","QnJ1SRACuj","VerEAK20wK","vLsmSMojnP","HP4339rlg9","MaJQsS77LH","MGlTFuupzk","5drc6Zv7z0","0PktIY1mC0",
+"zHF1qsoy9t","EdBKcG1RhS","uN6r3JKWYR","lCMxyaL6AJ","WreyPCfgr3","vkCHHhSSvQ","jfREuEOE1o","v1HlnQworu","ZzJHWkB5nP","QYxC0FnPFB",
+"hi5X7VBjhz","CK5W77ku1p","h1zcHJkzUn","EoToP45cIH","soy9tLewvM","IKxdLtjQxs","ECMvUpT8wu","2ZHdkm4bxU","RBhp0v8yFN","k85Aek85Ae",
+"VBjhzSs0Zu","uTacxs7Mxk","ThjNnHzZT8","BGaQY2ZHdk","iKqhrvLsmS","FPfSEnnP8o","lj07QFLsph","HzZT8yEfy9","gjUTuoGu6x","euZA52hEEU",
+"9XyT9FPfSE","dpe1vOz8yZ","GSQwjDz1R3","uTacxulk41","zbIYYazIWp","Yf2Ec1v5hH","kB5nP7fKYU","NhXdu14FLR","CIShGgdQsS","uTacxJKWYR",
+"pAhR1gdQsS","2DREsOUYuF","FLsphWreyP","2Yz7EcmXIX","uPX7GcL0aE","n1pmO48cHL","uTacxMK07Y","xXTI4hYBCK","CIShGulk41","iB08ltAOsr",
+"JJs5mQssNC","Y1mC0U3yw5","2hEEU8xEKz","DQimpv1Hln","faHiriqv4k","JXljWe6e4z","a00b5DLhzM","No0QbFGzgp","pmeCdY1mC0","i3pydv1Hln",
+"prNT6cmXIX","v2eC3iqv4k","jtn0XZhwG1","Mkgy8djsrv","HlUbFy94nw","iwzGkKsjRK","JJs5mG1RhS","5VZjSdpe1v","fcwDajtn0X","8RCUAAmdQd",
+"ZuDtDPOUYS","FPfSEFhtgl","5Mg9rm4bxU","OUqFM24ARF","lj07QlViBv","5NammnFqik","zY1GYRACuj","0BmCyNAFuw","EOE1oMojnP","cmXIX0Wr5y",
+"S77LH1v5hH","OUYuFjeskS","JXljWD6rBy","lweGyIBe8k","RBhp0h1zcH","16lHcydG8U","sx5GlK20wK","RBhp0GrDg7","aDGtSJIqXi","CqqaDGrDg7",
+"VLTy6hUTw7","FnPFBuZPqg","O3iyQhUTw7","CxVEfx3LDe","s7MxkuPX7G","dhSuHpT8wu","ru4UGYw2oU","JJs5mW3VFH","s7MxkMmKGJ","lH1ktJIqXi",
+"Dz1R3J2mQi","9XyT9yvOMI","y94nwn8pJ9","i3pydEdBKc","tAOsr7hyVv","RmDcre6e4z","gf8rIfFDrJ","Y1mC0cShY2","FjHXRtaOXK","dmoS7WPmlx",
+"LDk6fZJTXH","VBjhz0Wr5y","ru4UGYOfrY","S77LHuLtKs","NOHszfmIK1","UmaEvCxVEf","EOE1oVIlwP","OxWIHEOE1o","xReecOHaBz","tuDySksJby",
+"XflUqjfREu","Y1mC08TxD7","GXdoHAOgEe","vLsmShe9IA","OUYuFVLTy6","nnP8oWMiS3","jS1ajGSQwj","ZhwG1IKxdL","WaWsvix74r","3otm6FcWrW",
+"o8UydFGzgp","taOXKXyPZN","Q6LixQWxoT","3weIFCp3mZ","ZuDtD5nmWv","FNYIMfcJOy","J2mQi1v5hH","Twano2DREs","64s8NVprf2","dmoS7lsQGo",
+"Dz1R3lweGy","JXljWRxrsm","jSjS3SmGzv","SmGzvlkMUA","0KyfsPOUYS","8TxD7NcICA","rKDLJYf2Ec","LewvMmz8gx","GrDg7G1RhS","WaWsvM3zXL",
+"hUTw7gjUTu","55rfBtjQxs","S77LHGWqqX","SbRYy1LB1L","hUTw7mz8gx","cQOnvLewvM","PYBf43otm6","yEfy9fqypy","JKWYRuQIcz","BCxeCS2Dfu",
+"wiHrZpiJSk","ZzJHW8hJdt","YOfrYn1pmO","7X3uySs0Zu","ogLgcZhwG1","0h1b1lXFOB","5VZjSciuWz","fcJOyKZamH","QChxsEoToP","I7p2aVprf2",
+"lsQGoW3VFH","pT8wucL0aE","gdQsSRxrsm","7ku1pQbxXc","BGaQY0MR5X","pFrrlwDajX","2hEEUWmadA","JkzUn2DREs","0PktI9y4lw","5IhmGiwzGk",
+"h1zcHBGaQY","8FmFH618Di","DG4sTZJTXH","HzZT8HRxd8","7ku1plH1kt","2DREszqH0W","k85Aeb29RJ","9rlg9zz4ZU","5iGN5JXljW","FVMxoEdBKc",
+"ZUnqtBGaQY","RBhp0MK07Y","OxWIHDQimp","HP433C2Irc","4W0TlFGzgp","RxrsmzHF1q","1v5hHEdBKc","jzUqRZv7z0","9iGoT5VZjS","l83UdHfyNQ",
+"KASQ8iB08l","55rfBQssNC","brhlQFNYIM","Ul4a15IhmG","cL0aEFxX9q","Fhtgli7WMQ","ECMvUNxx9V","QClRLbrhlQ","0Wr5ymX2GE","VIlwPOUYuF",
+"rKDLJW7cTs","euZA5JXljW","cShY2pFrrl","BCxeC5Drn0","8RCUACK5W7","5drc6rhl0J","piJSkblLA9","5nmWvZuDtD","4W0TloQ87r","jtn0X6q6L9",
+"pmeCdb29RJ","n1pmOMmsIo","pvgjS7fKYU","dmoS7lm0pD","BpYhVOz8yZ","ZJTXHYOfrY","x3LDeOxWIH","DcpWBMGlTF","W7cTsi7WMQ","zbIYY5IhmG",
+"kZANmuAWyp","7lUXZ2hEEU","lXFOBdpe1v","CIShGhe9IA","kZANmRBhp0","Ul4a1piJSk","0ao3lQssNC","y94nwlCMxy","X6PinDG4sT","RpBQmQworu",
+"iKqhrJkzUn","Yh1hFksJby","zQt6QhSSvQ","EoToPGSQwj","blLA9QbxXc","4QMc9dhSuH","FLsphlpF6W","AmdQdpT8wu","RxrsmoQ87r","azIWpKsjRK",
+"QYxC0HlUbF","5ZaEzHlUbF","kB5nPM3zXL","2DREsdjsrv","NhXduk85Ae","RkQkeChuy3","BFkb8HP433","fqypy5nmWv","soy9tDQimp","GrDg70YAGH",
+"okgRi0BmCy","RxrsmqUJMd","5NammzbIYY","580YDsoy9t","FVMxopv0i7","CxVEfX6Pin","o8UydGSQwj","hYBCKYjB9t","MK07YIKxdL","MmKGJBCxeC",
+"iwzGkCdyBV","yToGWzmLYD","JKWYRzz4ZU","jS1aj5iGN5","xReecYOfrY","Yf2EctlILt","lViBv1LB1L","faHirxXTI4","uAWyp2ZHdk","JRJQBlH1kt",
+"mX2GERpBQm","AmdQdQ6Lix","oGu6xXflUq","y94nwSmGzv","nnP8ouupzk","7fsYMlH1kt","TwanoQbxXc","16lHcaFFss","S2DfuMojnP","y94nwwDajX",
+"QWxoTFwEJz","pFrrlMmsIo","MezSWCIShG","ulk41iKqhr","suY4xlViBv","iwzGkl83Ud","fcJOy2Nslm","2ZHdkF6PT2","l83UdQbxXc","kZANm8hJdt",
+"L7cGcx3LDe","fcJOyTwano","tjQxsMK07Y","Ss0Zuix74r","v1Hln5Mg9r","7ku1pSbRYy","G1RhS0ao3l","KASQ8xReec","VNCPdpmeCd","B3qemzY1GY",
+"HRxd8RBhp0","AXpwE0Wr5y","uupzk8xEKz","hSSvQ7hyVv","MmsIoRsQUq","zqH0W5nmWv","Kr8ysyToGW","FnPFBGrDg7","ni2v1FwEJz","5ZaEzVIlwP",
+"he9IAdmoS7","d85a9Yf2Ec","hE1Ql1LB1L","brhlQvOqCE","GrDg7fmIK1","pmeCdNcICA","55rfBRBhp0","G1RhSlpF6W","HlUbFi7WMQ","Qworu24ARF",
+"UmaEvsuY4x","tjQxs9XyT9","qaofNSWfou","zmLYD1j5L8","RzaZAblLA9","yluBxKr8ys","EOE1oWmadA","blLA9s4786","JJs5mF6PT2","48cHLt59lR",
+"7lUXZix74r","i3pydHP433","2DREsi3pyd","qUJMdQworu","W3VFHNhXdu","WMiS3VerEA","ZUnqti7WMQ","0BmCyyvOMI","MaJQsfmIK1","yofH3CIShG",
+"i7WMQfLNg8","euZA5yluBx","7ku1p5Namm","Chuy3uTacx","7hyVv8U2nU","8U2nU48cHL","nlaBypWiOs","DLhzMs7Mxk","BGaQYxXTI4","KASQ8ZuDtD",
+"S2Dfusx5Gl","ReKEW5drc6","e6e4zDG4sT","55rfBaDGtS","8xEKzVIlwP","pFrrl7Ow5C","Dz1R3CNHmv","lkMUAdQ586","5drc6o8Uyd","yToGWFxX9q",
+"EdBKcHfyNQ","HlUbFU3yw5","QClRLW7cTs","uQIczECMvU","HRxd8M3zXL","jeskSprNT6","bgJAzQworu","vOqCE48cHL","tl72W5ZaEz","07n1cVerEA",
+"LDk6frKDLJ","DcpWBChuy3","VIlwPTCgPp","v1Hlnx3LDe","lm0pDMkgy8","i7WMQuAWyp","dhSuHxciqp","AOgEejfREu","qaofNpFrrl","WDVWJ7X3uy",
+"4W0TlKASQ8","Chuy3lj07Q","ZuDtDXflUq","n1pmOKZamH","5NammdQ586","WmadAQ6hMC","lm0pD8FmFH","VerEAKASQ8","guMb8AgJHQ","RzaZAcL0aE",
+"rz7UtDG4sT","W7cTsguMb8","HlUbFDLhzM","zHF1qtAOsr","oVQp6DG4sT","aFFss8cVD3","MojnPIn3NS","s7MxkJkzUn","Z4I1vhUTw7","Z4I1vDQimp",
+"ciuWz9y4lw","OUYuFS77LH","d85a907n1c","BbwgApFrrl","ZzJHWlH1kt","xXTI4ZhwG1","lCMxypWiOs","okgRiSjskQ","uLtKsqQxHP","lweGyX6Pin",
+"JXljW5Mg9r","gtCA5CxVEf","zz4ZUSjskQ","2hEEUF6PT2","iKqhrCxVEf","dpe1vOxWIH","fmIK1NhXdu","jiVBPFNYIM","dhSuHfcJOy","Nxx9Vni2v1",
+"VerEARpBQm","Chuy3FxX9q","qQxHPRmDcr","Chuy3No0Qb","uoStwFFDui","8RCUAlCMxy","JRJQB7X3uy","WMiS3DLhzM","DG4sTMm8si","RACujYw2oU",
+"vkCHHlweGy","2NslmFnPFB","Q6LixVIlwP","WmadAMGlTF","qaofNIjTwP","jzUqRtjQxs","qaofNcmXIX","VBjhzAkKTk","n1pmOJkzUn","K4GS80PktI",
+"7lUXZDcpWB","t59lRQChxs","8cVD3hYBCK","FcWrWpvgjS","Ss0ZuD6rBy","3otm6JRJQB","rhl0JeuZA5","n8pJ91j5L8","zbIYYtl72W","AgJHQZv7z0",
+"P6bcgGrDg7","TXQ0ZjSjS3","QYxC0L7cGc","MaJQs5Mg9r","pvgjSNhXdu","7fsYMCp3mZ","AXpwEtl72W","Dz1R3ni2v1","HP433i7WMQ","QnJ1SbrhlQ",
+"B3qemRBhp0","16lHcuQIcz","Z4I1vK20wK","iKqhrVerEA","nFqikcShY2","VerEAfcwDa","nlaByVprf2","sx5Gl48cHL","wiHrZQbxXc","tuDySbrhlQ",
+"lpF6WBFkb8","WPmlxHlUbF","No0QbZuDtD","5ZaEzNo0Qb","qaofNFVMxo","HfyNQSs0Zu","HfyNQyluBx","taOXKZUnqt","9GXkX2DREs","UmaEvjiVBP",
+"MezSWm4bxU","618DiMmKGJ","CqqaDWaim6","Nxx9VVIlwP","5ZaEzAkKTk","IKxdL8cVD3","hE1QljfREu","fcwDagtCA5","jfREuS77LH","8hJdtsx5Gl",
+"sqVrf0MR5X","he9IA16lHc","6q6L9suY4x","prNT6O3iyQ","0ao3lSmGzv","iwzGktaOXK","B3qemtl72W","No0QbcQOnv","16lHc9eoRc","QbxXcRkQke",
+"OHaBz8hJdt","FNYIMQ6hMC","uoStwhi5X7","ni2v1tvdkD","xReecjzUqR","W7cTsl83Ud","0PktIiqv4k","0PktIQssNC","guMb8fLNg8","1v5hH29QAz",
+"Dz1R3RzaZA","b29RJcL0aE","7Ow5CcL0aE","lXFOBSWfou","yToGWEOE1o","YOfrYzbIYY","W3VFHhUTw7","HP433DcpWB","taOXKLDk6f","cL0aERkQke",
+"zz4ZULDk6f","OHaBzM3zXL","GWqqXJIqXi","tAOsr5nmWv","taOXKhE1Ql","FNYIMd7vjM","AkKTkfqypy","CdyBVhYBCK","fcJOys93Ml","FGzgpoVQp6",
+"oQ87rzqH0W","7Ow5CfcwDa","uPX7G7Ow5C","cL0aEru4UG","FnPFBbZLvS","s4786b29RJ","Yw2oUWMiS3","ZhwG1ksJby","d7vjMogLgc","dQ586HlUbF",
+"8FmFH5drc6","NAFuwiKqhr","zqH0WQ6hMC","uupzklViBv","LDk6ftaOXK","CIShGMK07Y","MojnPsoy9t","StlDJqUJMd","Q6LixKZamH","QClRLuTacx",
+"s93MlQworu","xciqpCqqaD","bZLvSlweGy","W7cTsy94nw","vLsmSzmLYD","Mkgy8CNHmv","zqH0WwDajX","Oz8yZOz8yZ","i7WMQulk41","pWiOsAOgEe",
+"JJs5mHlUbF","DQimpIBe8k","MojnPn1pmO","uTacxtvdkD","0BmCyyEfy9","Yf2EcMGlTF","AmdQdFGzgp","oGu6xoVQp6","9y4lwK4GS8","rz7Utuvf7A",
+"Chuy3Oz8yZ","RkQke8cVD3","Waim6X6Pin","azIWpqaofN","mX2GEtAOsr","qaofNlCMxy","FNYIMvOqCE","Yf2Ec16lHc","MmKGJv2eC3","JKWYRJ2mQi",
+"NOHszzY1GY","IKxdLCK5W7","ix74ryluBx","GWqqX6AFT0","jfREuguMb8","FGzgpv2eC3","VLTy6JRJQB","zmLYDStlDJ","64s8ND6rBy","G1RhS9GXkX",
+"9XyT9mz8gx","wiHrZiB08l","LDk6fMezSW","L7cGcUl4a1","kB5nPFLsph","GXdoH7hyVv","0PktIvLsmS","pFrrltl72W","Pb1pal83Ud","Nxx9VI7p2a",
+"FVMxorz7Ut","LbRTHEOE1o","yEfy9pT8wu","tjQxsMGlTF","Cp3mZblLA9","Cfgr3DLhzM","jSjS30YAGH","TCgPpzQt6Q","AXpwEMmKGJ","wiHrZwDajX",
+"JkzUn3weIF","2ZHdk0Kyfs","EOE1oKASQ8","7fKYUFcWrW","8TxD76AFT0","Q6Lixs4786","iB08lWDVWJ","zmLYDjiVBP","BCxeCIn3NS","Twano29QAz",
+"No0Qbzz4ZU","tuDySQ6hMC","t98iWpT8wu","MGlTFjfREu","tlILtpWiOs","lpF6W4QMc9","AmdQd9GXkX","HP433GSQwj","No0Qb2DREs","6AFT04dEz6",
+"xReecCfgr3","y94nwgIYvE","GrDg7W3VFH","BpYhVe6e4z","8U2nU5drc6","M3zXLVprf2","RxrsmlXFOB","MmKGJMGlTF","G1RhS5drc6","VLTy6taOXK",
+"7fsYM16lHc","8hJdtfqypy","5IhmGd85a9","QbxXcni2v1","XyPZNvLsmS","HzZT80BmCy","JkzUnXflUq","4W0TlUlU3M","FhtglQWxoT","4QMc99iGoT",
+"rhl0JcL0aE","5Nammt59lR","oGu6xThjNn","Chuy3vLsmS","bgJAzt59lR","fmIK1MmKGJ","4W0TlQClRL","GWqqXzFgtB","QWxoTHlUbF","uPX7G2ZHdk",
+"GSQwjWPmlx","FPfSEReKEW","0MR5XuPX7G","8hJdtbgJAz","IjTwPFGzgp","uLtKsGWqqX","prNT6tl72W","Yh1hFoVQp6","aez9yFwEJz","rhl0JJRJQB",
+"Vprf2Q6hMC","I7p2a07n1c","jeskSoVQp6","fcwDaWaWsv","MojnPTCgPp","16lHcCqqaD","dmoS7RzaZA","JRJQBjeskS","h1zcHRpBQm","QYxC0CIShG",
+"wDajXU3yw5","hSSvQAOgEe","MmKGJVprf2","MGlTFbrhlQ","CxVEfd7vjM","ZzJHW0MR5X","L7cGcaez9y","bZLvSQssNC","F6PT2VerEA","MmsIo2hEEU",
+"2hEEU14FLR","Waim648cHL","aL6AJgIYvE","Yf2Ecsoy9t","RACujMezSW","MmKGJiKqhr","WaWsvJXljW","WDVWJsuY4x","JKWYRfcJOy","sqVrfhi5X7",
+"W7cTs14FLR","lweGyYf2Ec","BbwgA5nmWv","tlILtzmLYD","EoToPOHaBz","CIShGZv7z0","fcJOySmGzv","TCgPpgjUTu","nnP8oKsjRK","DLhzMuoStw",
+"StlDJrKDLJ","Mkgy8ogLgc","oGu6xFNYIM","1v5hHpiJSk","WaWsv5ZaEz","pmeCdLbRTH","4W0Tl0h1b1","5Drn0ZJTXH","zmLYDsuY4x","lpF6WciuWz",
+"45cIHuJScX","VNCPdjS1aj","jzUqRiKqhr","AgJHQmX2GE","wDajXuN6r3","Q6hMCgIYvE","WDVWJPb1pa","lj07Quvf7A","6AFT0y94nw","pmeCdfmIK1",
+"In3NS2DREs","s7MxkQYxC0","IjTwPKZamH","YOfrYyofH3","8cVD3QssNC","DG4sTjS1aj","gIYvEcShY2","UmaEvJIqXi","MK07Yulk41","jSjS38xEKz",
+"fmIK1618Di","azIWpFhtgl","uoStwkZANm","guMb8BpYhV","RzaZAUl4a1","EOE1ozqH0W","fcwDa2Yz7E","FnPFBMmKGJ","bgJAzLewvM","HzZT8ZJTXH",
+"aL6AJChuy3","FPfSEtjQxs","yToGWUlU3M","FGzgpQbxXc","ReKEWAgJHQ","6AFT0W7cTs","zHF1q0Wr5y","M3zXLuvf7A","qaofNKASQ8","S2DfuRzaZA",
+"lm0pDxXTI4","atef21LB1L","zHF1qKsjRK","S2DfuO3iyQ","W3VFHuAWyp","uZPqgjeskS","uupzkoQ87r","zY1GYfqypy","pv0i7Pb1pa","vkCHH2Nslm",
+"xReec3weIF","Ul4a107n1c","mX2GEuZPqg","uJScXQChxs","VLTy6pmeCd","FwEJzWDVWJ","4QMc9HfyNQ","s4786oQ87r","OxWIHQ6Lix","zFgtBUmaEv",
+"pmeCd8RCUA","5NammlViBv","ZzJHWyEfy9","Zv7z0hUTw7","qUJMdCxVEf","VIlwPW7cTs","CdyBVbZLvS","guMb89GXkX","AgJHQDG4sT","8hJdtcmXIX",
+"h1zcHCIShG","qaofNaFFss","ZUnqtpv0i7","pvgjSGv3Fq","580YDQ6Lix","s93MlkZANm","W3VFHDLhzM","KZamHgtCA5","Nxx9VFnPFB","SbRYy2Yz7E",
+"1v5hHd7vjM","pv0i7CK5W7","AIYUuWDVWJ","16lHczbIYY","ogLgcLbRTH","580YDZuDtD","FwEJzEOE1o","pFrrl6q6L9","WreyP9eoRc","fLNg8QbxXc",
+"SjskQFhtgl","AIYUuatef2","QYxC0F6PT2","aFFsswiHrZ","K4GS8piJSk","45cIHMojnP","AXpwEWPmlx","BpYhVfcwDa","LDk6fzQt6Q","ciuWzpFrrl",
+"5Mg9ruQIcz","ZhwG1taOXK","5NammdhSuH","2TRI7t98iW","EdBKclm0pD","F6PT2zQt6Q","jeskSOUYuF","Q6Lix8cVD3","8TxD7jfREu","K4GS88RCUA",
+"BCxeCni2v1","oQ87rOHaBz","2Yz7EWaim6","d85a9qaofN","qUJMdJIqXi","4dEz69GXkX","CIShGIBe8k","2TRI7e6e4z","m4bxUG1RhS","kB5nPMK07Y",
+"7Ow5COUYuF","OxWIHQYxC0","POUYSRsQUq","jiVBP14FLR","gtCA5QssNC","Q6LixOHaBz","uZPqguLtKs","M3zXLeuZA5","piJSkXyPZN","U3yw5tvdkD",
+"JIqXibZLvS","cmXIXRkQke","FLsphQssNC","ZhwG1BFkb8","d85a9m4bxU","rhl0J0Wr5y","i3pydazIWp","n8pJ9dhSuH","ECMvUVerEA","Ta8f62ZHdk",
+"azIWpJKWYR","ThjNnlXFOB","zqH0W5VZjS","uPX7GwiHrZ","9eoRcd7vjM","DG4sTl83Ud","5NammSbRYy","WPmlxReKEW","zY1GY9iGoT","kB5nPhe9IA",
+"ciuWz5Mg9r","o8Uyd9iGoT","hi5X76q6L9","2Yz7Eiqv4k","qQxHP45cIH","uAWypY1mC0","M3zXLYh1hF","RzaZADG4sT","6AFT0K20wK","fFDrJI7p2a",
+"ru4UGdQ586","FPfSEQnJ1S","kZANm5Namm","l83UdHRxd8","qUJMdt98iW","ru4UGlXFOB","DcpWBoVQp6","gIYvE580YD","FwEJzAIYUu","7ku1pIjTwP",
+"n1pmOt59lR","Waim6ReKEW","6AFT0NhXdu","M6qcGi7WMQ","1j5L8fFDrJ","CdyBVtaOXK","BGaQYVBjhz","jSjS3Kr8ys","LDk6fhE1Ql","G1RhSUmaEv",
+"CIShGBbwgA","cL0aElViBv","b29RJtlILt","7hyVvYjB9t","yluBxgjUTu","zbIYYStlDJ","580YDgIYvE","ix74rs7Mxk","MK07YCqqaD","O3iyQK4GS8",
+"14FLRReKEW","Ul4a1FLsph","7hyVvaez9y","uQIcz5VZjS","QWxoTblLA9","FnPFByofH3","FFDuiZ4I1v","IKxdLIBe8k","7lUXZ16lHc","AkKTkaez9y",
+"7ku1pqQxHP","uZPqgFwEJz","I7p2ajeskS","K20wK8RCUA","oGu6xRBhp0","pvgjSguMb8","1j5L8MojnP","bgJAzzHF1q","0KyfsC2Irc","gtCA5uPX7G",
+"oGu6xSmGzv","okgRiXflUq","b29RJGrDg7","POUYSjfREu","VBjhz6q6L9","9y4lwbgJAz","piJSkl83Ud","pT8wu4dEz6","3otm6gf8rI","W3VFHuLtKs",
+"DQimpWmadA","bZLvSGWqqX","Pb1pauQIcz","CNHmvWPmlx","SjskQG1RhS","CxVEf5VZjS","Chuy3StlDJ","hSSvQReKEW","EOE1oZzJHW","zHF1qi7WMQ",
+"I7p2aW3VFH","yofH3IRh48","zbIYY2Nslm","suY4xfqypy","y94nwFcWrW","VBjhzS77LH","dhSuHhSSvQ","8cVD39iGoT","W3VFH6q6L9","8cVD3uTacx",
+"Twano0PktI","taOXKJIqXi","Waim6dmoS7","618Di2DREs","uoStwFxX9q","2TRI7oVQp6","dQ5860PktI","ru4UGiB08l","8TxD7XyPZN","0KyfsTXQ0Z",
+"JKWYRSs0Zu","NAFuwokgRi","hUTw7RpBQm","xciqplsQGo","XflUqUmaEv","qaofNNOHsz","fFDrJdhSuH","uLtKsC2Irc","0ao3ldmoS7","Y1mC0uJScX",
+"euZA5VLTy6","aFFss7fsYM","OxWIHFNYIM","GrDg7C2Irc","No0Qb16lHc","uAWypqQxHP","suY4xTwano","ciuWznFqik","Zv7z0NAFuw","9XyT9dpe1v",
+"CIShGTXQ0Z","taOXKRkQke","lH1ktZuDtD","ZUnqtokgRi","CdyBVStlDJ","UmaEv0PktI","CxVEfWaim6","ix74rrz7Ut","9GXkXkB5nP","5VZjSn1pmO",
+"i7WMQlsQGo","GXdoHBGaQY","F6PT2x3LDe","L7cGc45cIH","7hyVvi3pyd","FPfSE7X3uy","8FmFH7Ow5C","euZA59rlg9","POUYSKASQ8","uTacxdjsrv",
+"lkMUAEoToP","FcWrWGrDg7","nlaByEOE1o","mX2GEvLsmS","8U2nUogLgc","64s8NM6qcG","9XyT9cL0aE","FnPFBMaJQs","7hyVvjSjS3","O3iyQaez9y",
+"Rxrsmiqv4k","Ul4a1EoToP","KsjRKwDajX","VerEAzmLYD","2DREsd85a9","14FLRy94nw","HP433sx5Gl","B3qempiJSk","l83Udn8pJ9","CNHmvAIYUu",
+"faHirWaWsv","WDVWJ1LB1L","dpe1vazIWp","fcJOyydG8U","xXTI4tuDyS","jiVBPIjTwP","7ku1pMmKGJ","UlU3MQworu","BbwgAkZANm","Chuy3cQOnv",
+"Q6LixzqH0W","lkMUAVNCPd","JIqXiUlU3M","POUYSblLA9","5IhmGjtn0X","AmdQduN6r3","rhl0JYOfrY","5Drn0ZUnqt","FFDuiWMiS3","rhl0J5nmWv",
+"MK07Y3weIF","uQIczDLhzM","ECMvUStlDJ","SjskQs93Ml","d85a9ThjNn","hYBCKKr8ys","CIShGCdyBV","QWxoTlkMUA","8TxD7Ta8f6","DLhzMGrDg7",
+"5iGN52ZHdk","vOqCE2Nslm","M6qcG9eoRc","ECMvUReKEW","UmaEvFnPFB","faHirb29RJ","CIShG4QMc9","RmDcr5Namm","qQxHPdQ586","L7cGce6e4z",
+"AXpwE0ao3l","2Yz7EGv3Fq","uZPqgvLsmS","DQimpCxVEf","DLhzMCK5W7","Y1mC0K4GS8","SmGzvMK07Y","FhtglEdBKc","5nmWvdQ586","suY4xOUYuF",
+"FxX9q2TRI7","ZzJHW2TRI7","Dz1R3oQ87r","1v5hHTCgPp","ix74rBbwgA","16lHcuZPqg","1j5L89XyT9","hYBCKBpYhV","QworuaL6AJ","1LB1LQworu",
+"WreyPCK5W7","rhl0JW7cTs","OxWIHSmGzv","5Namm0YAGH","580YD55rfB","pv0i78FmFH","euZA5DQimp","S77LH7hyVv","IRh48lCMxy","hi5X7Mm8si",
+"he9IAJKWYR","ru4UGHzZT8","zQt6Q2DREs","pWiOsaFFss","n8pJ9iB08l","Dz1R3nFqik","3weIFkZANm","FNYIMQbxXc","KASQ8S77LH","MmKGJSs0Zu",
+"9y4lwcL0aE","lH1ktVjCZq","pFrrliKqhr","fmIK1fcwDa","t59lRyluBx","gf8rIlj07Q","SmGzvIRh48","GXdoHyofH3","FcWrWaFFss","VIlwPPb1pa",
+"sqVrffqypy","Dz1R3IKxdL","BCxeCfFDrJ","rhl0JjfREu","K20wKgdQsS","qaofNdmoS7","UlU3Mfqypy","kZANmFhtgl","jeskShe9IA","oQ87rGrDg7",
+"WDVWJDcpWB","aez9ylH1kt","y94nw580YD","Waim64W0Tl","LewvMrhl0J","PYBf4QYxC0","Zv7z0v2eC3","JKWYRuoStw","aL6AJL7cGc","i7WMQ5Drn0",
+"fFDrJy94nw","fFDrJjeskS","suY4xRmDcr","XflUqAmdQd","RACujIKxdL","hUTw7C2Irc","SWfouS2Dfu","lm0pD9GXkX","cShY2prNT6","Cfgr3jtn0X",
+"8RCUAblLA9","Zv7z0CxVEf","OUYuFoGu6x","W7cTsyvOMI","6AFT0Qworu","zbIYYfLNg8","zY1GYlCMxy","lpF6WO3iyQ","zQt6QReKEW","Cfgr3ECMvU",
+"K20wKgtCA5","fcJOyuN6r3","VerEA1j5L8","1j5L8GrDg7","DLhzMWaim6","RmDcryvOMI","uQIczWaim6","EdBKcn1pmO","TwanoAkKTk","QYxC0blLA9",
+"NhXduOz8yZ","8U2nUNcICA","gIYvEcmXIX","JKWYRTCgPp","n8pJ9KsjRK","hSSvQEdBKc","nnP8o7ku1p","Mm8sit98iW","Gv3FqAkKTk","AmdQd0PktI",
+"W3VFHFhtgl","RmDcrbrhlQ","Ta8f6gf8rI","v2eC3M6qcG","pv0i7lpF6W","MaJQsm4bxU","vOqCEZ4I1v","ReKEWuAWyp","fmIK1jeskS","oGu6x5drc6",
+"3weIFPOUYS","s4786tjQxs","ECMvUJXljW","Mkgy8mX2GE","Y1mC0i3pyd","gjUTuiB08l","RACujTa8f6","aDGtSvkCHH","s7MxkDG4sT","qQxHPdhSuH",
+"WDVWJuoStw","oGu6xrKDLJ","SmGzvjS1aj","d85a9Rxrsm","QworuL7cGc","GXdoHzz4ZU","lViBvI7p2a","tjQxs07n1c","K4GS88cVD3","hYBCKCxVEf",
+"RpBQmFNYIM","F6PT2Nxx9V","Mkgy8DG4sT","JKWYRy94nw","h1zcHXyPZN","MezSW1LB1L","QssNCjzUqR","Mm8siyEfy9","x3LDeqUJMd","7ku1pHfyNQ",
+"WaWsvMojnP","iqv4kFFDui","t98iWOz8yZ","uAWypi7WMQ","lCMxyOz8yZ","guMb85nmWv","FPfSEDz1R3","48cHLv8yFN","FhtglBpYhV","JIqXiv8yFN",
+"IBe8kXflUq","8U2nUVNCPd","uvf7Aru4UG","Waim6FGzgp","07n1ctjQxs","RmDcrAgJHQ","jSjS3FwEJz","8U2nUSjskQ","lViBvhUTw7","EoToPD6rBy",
+"WPmlxv1Hln","Vprf2dQ586","sqVrf0BmCy","24ARFECMvU","9rlg9rhl0J","ulk419XyT9","ksJbyYh1hF","oQ87rD6rBy","QworupT8wu","ni2v1CdyBV",
+"fFDrJ5IhmG","NhXdu64s8N","HRxd8kB5nP","ZUnqt48cHL","JXljW2DREs","TwanoazIWp","hYBCKFxX9q","uJScXSjskQ","RmDcrLDk6f","5IhmGCqqaD",
+"9y4lwtlILt","jfREuoGu6x","POUYSmX2GE","djsrvuQIcz","bgJAzaFFss","ZUnqt618Di","zY1GYRxrsm","pAhR1ZJTXH","vLsmShUTw7","v8yFN3weIF",
+"16lHcPYBf4","gdQsSdQ586","xReecs4786","OHaBzSjskQ","uQIczydG8U","BGaQYn8pJ9","he9IAzz4ZU","Z4I1vkB5nP","nlaBySs0Zu","s93MllweGy",
+"WmadAs7Mxk","6q6L9JIqXi","07n1cPb1pa","oQ87r618Di","ZJTXHx3LDe","FFDuiuQIcz","yEfy9IBe8k","EOE1oMezSW","9y4lwVprf2","RBhp0lm0pD",
+"lViBvhSSvQ","pWiOsHP433","Waim6Gv3Fq","Ta8f6ReKEW","GXdoHCdyBV","ciuWz8RCUA","uQIczx3LDe","JXljWzQt6Q","4W0Tlulk41","AkKTkokgRi",
+"brhlQWPmlx","XflUqYf2Ec","GXdoHHlUbF","0Wr5yLDk6f","iB08lx3LDe","aL6AJIKxdL","MGlTFCK5W7","8xEKz5nmWv","GSQwj7lUXZ","RACujvOqCE",
+"gIYvE3otm6","1j5L8Ta8f6","Gv3FqRsQUq","ix74rAOgEe","P6bcgYOfrY","0MR5XbZLvS","W3VFHIn3NS","2hEEU5Drn0","RxrsmaDGtS","7fsYMMmsIo",
+"0YAGHEOE1o","d85a9FjHXR","Rxrsmv1Hln","CqqaDOxWIH","2DREsx3LDe","prNT63otm6","M3zXLoVQp6","0MR5XFxX9q","AXpwEU3yw5","brhlQaez9y",
+"iqv4k618Di","HlUbFQworu","JXljWZ4I1v","fLNg8NOHsz","zbIYYPb1pa","lpF6WCNHmv","5IhmGZuDtD","zFgtBydG8U","2Nslmsx5Gl","S2DfuGXdoH",
+"lm0pDnlaBy","CK5W7I7p2a","uQIczCNHmv","hi5X7RBhp0","vLsmSs7Mxk","CK5W7RBhp0","UlU3Ma00b5","DG4sTJXljW","n1pmOjSjS3","yvOMIlH1kt",
+"euZA5i7WMQ","2DREszY1GY","Oz8yZYh1hF","8cVD3HP433","QClRLgtCA5","n1pmO2hEEU","Ta8f6blLA9","QbxXclm0pD","SmGzv4QMc9","IBe8kQbxXc",
+"o8UydqQxHP","he9IA8hJdt","iKqhrIBe8k","0MR5XVBjhz","l83Udix74r","yofH3ogLgc","3weIFzbIYY","fmIK1G1RhS","zqH0WYjB9t","7ku1pyofH3",
+"C2Irci7WMQ","MezSWECMvU","DLhzMVjCZq","kZANmVprf2","gjUTuIKxdL","S2Dfugf8rI","HzZT8hYBCK","sqVrflj07Q","faHirlm0pD","8RCUAW7cTs",
+"07n1cW7cTs","pT8wuMm8si","euZA5ZuDtD","lsQGoM3zXL","RkQkeKsjRK","XyPZNZuDtD","ni2v1ReKEW","AmdQdY1mC0","yEfy9GrDg7","iwzGkpv0i7",
+"ogLgczFgtB","KASQ8cL0aE","9eoRc618Di","cL0aEVBjhz","soy9tzmLYD","8RCUAKASQ8","PYBf4rhl0J","qaofNAOgEe","WmadAyEfy9","MGlTF618Di",
+"cL0aECfgr3","dmoS7D6rBy","2ZHdkRBhp0","7fKYUkZANm","6AFT0wDajX","Zv7z0GXdoH","CIShGzQt6Q","9eoRczbIYY","BFkb87ku1p","2DREsRxrsm",
+"48cHL0YAGH","J2mQi0BmCy","Dz1R3yluBx","azIWp7lUXZ","cShY2LDk6f","3weIFwDajX","K20wKe6e4z","HfyNQM3zXL","pmeCduN6r3","8U2nUnFqik",
+"zmLYDwDajX","FnPFBXyPZN","WaWsvNxx9V","v1HlnhUTw7","7fsYM7ku1p","StlDJqaofN","y94nwatef2","d7vjMNOHsz","YOfrYMmKGJ","BFkb8iwzGk",
+"NOHszGWqqX","WmadAnlaBy","pv0i7WmadA","ogLgc8hJdt","9GXkXqQxHP","nFqikQClRL","d85a9ReKEW","8xEKzJ2mQi","tlILtfcJOy","FNYIM45cIH",
+"CdyBVBCxeC","Twanoo8Uyd","lH1ktbZLvS","FcWrWi3pyd","pFrrlaFFss","FnPFB6AFT0","RACujjzUqR","Mkgy8tjQxs","NAFuwv2eC3","L7cGc2DREs",
+"FwEJzfcwDa","ECMvUt59lR","WMiS3U3yw5","tlILtFLsph","Q6hMC5ZaEz","0ao3lO3iyQ","Q6Lixaez9y","iKqhrVNCPd","zHF1qbZLvS","FcWrWsx5Gl",
+"KsjRKFGzgp","guMb88hJdt","K20wKzbIYY","ZUnqtWaim6","nFqikwiHrZ","nnP8oGv3Fq","y94nwtAOsr","64s8NAXpwE","14FLRWreyP","tuDySQClRL",
+"0YAGHsqVrf","tlILtNcICA","gtCA5I7p2a","8xEKz4W0Tl","MmsIojeskS","jeskSDz1R3","AgJHQm4bxU","29QAzFjHXR","2Nslm2TRI7","LDk6fQYxC0",
+"tAOsrMaJQs","S77LHK20wK","Nxx9Vrz7Ut","RkQkeNxx9V","lweGyWDVWJ","TwanodhSuH","WDVWJfcwDa","blLA9IBe8k","xReecDQimp","Ta8f6Waim6",
+"7fKYUgIYvE","FPfSEsuY4x","16lHcCIShG","euZA5uupzk","K20wKQssNC","pmeCdHRxd8","5IhmGru4UG","ru4UGzQt6Q","uPX7GLewvM","5IhmGFnPFB",
+"zHF1qL7cGc","uvf7AblLA9","qQxHPEoToP","7X3uyIBe8k","UlU3MHfyNQ","Q6LixuAWyp","fcJOyvOqCE","16lHcuoStw","CK5W7pT8wu","QClRLlsQGo",
+"QYxC0mz8gx","Oz8yZlXFOB","djsrvgjUTu","HRxd8piJSk","45cIHlkMUA","Yh1hFRpBQm","jtn0XzmLYD","hUTw7DG4sT","uQIczI7p2a","dmoS7lweGy",
+"n8pJ9d85a9","Ss0Zuv2eC3","faHirni2v1","Nxx9VrKDLJ","QnJ1SzbIYY","qaofNS77LH","hYBCKZJTXH","hYBCK7X3uy","Uvlv4xciqp","3weIFNAFuw",
+"1v5hHJkzUn","JKWYR1j5L8","t59lRCqqaD","TwanooVQp6","fqypySs0Zu","lpF6WBCxeC","pAhR1MGlTF","6AFT0PYBf4","AOgEesx5Gl","ulk41ciuWz",
+"aDGtSC2Irc","Yf2EcHfyNQ","euZA59XyT9","dQ5862TRI7","M3zXLQClRL","7X3uyRkQke","aL6AJuAWyp","HP433GWqqX","cmXIXOHaBz","9eoRcJkzUn",
+"n1pmOn8pJ9","6AFT08RCUA","Yh1hFMmsIo","LDk6fFcWrW","ru4UGVBjhz","ulk41Yw2oU","tlILtAOgEe","brhlQhYBCK","zqH0WQssNC","jS1ajoQ87r",
+"uoStwHRxd8","tjQxs7ku1p","UlU3MHRxd8","JIqXi5nmWv","iwzGkWaim6","gf8rIJ2mQi","DLhzMpv0i7","ni2v1AgJHQ","48cHLMkgy8","iB08lpT8wu",
+"0YAGHuLtKs","oGu6xUmaEv","UmaEv2hEEU","ciuWzatef2","YjB9tMm8si","9GXkXFxX9q","HlUbFhYBCK","Y1mC0vOqCE","2TRI7pvgjS","5iGN5pmeCd",
+"rhl0JUmaEv","P6bcgdpe1v","fLNg8QssNC","5iGN5jeskS","45cIHnlaBy","VBjhz55rfB","Oz8yZFnPFB","faHiriB08l","0KyfsOHaBz","zqH0WlsQGo",
+"vLsmSd85a9","Nxx9VjS1aj","tlILtCNHmv","IRh48brhlQ","QClRLGrDg7","b29RJ8TxD7","djsrvmX2GE","tAOsr7fsYM","7X3uy3otm6","t98iWi7WMQ",
+"gIYvEDG4sT","bgJAz55rfB","Cfgr3QWxoT","16lHccmXIX","6q6L9hYBCK","Y1mC0FwEJz","dQ586C2Irc","9eoRce6e4z","gjUTuCp3mZ","AmdQdIRh48",
+"Ta8f6GXdoH","AXpwEuZPqg","tjQxszQt6Q","bZLvSdQ586","zQt6QlkMUA","djsrvnlaBy","fqypyi7WMQ","lViBvFLsph","lkMUA1j5L8","nnP8o8RCUA",
+"580YDI7p2a","WmadASbRYy","Ta8f6t98iW","X6PinKr8ys","HlUbFVLTy6","Q6LixkB5nP","rz7Ut9y4lw","iqv4kVprf2","tlILtulk41","SWfouUlU3M",
+"pFrrlFVMxo","uLtKsyvOMI","aL6AJVIlwP","VjCZqqaofN","aez9yKZamH","cL0aEfLNg8","0KyfsaL6AJ","7X3uyVLTy6","jSjS3WmadA","1LB1LHlUbF",
+"5Drn0t59lR","Ss0ZuHfyNQ","pv0i7Dz1R3","3otm6K20wK","5Drn0C2Irc","brhlQjzUqR","8cVD3AkKTk","ZUnqthi5X7","y94nwqQxHP","GSQwjHP433",
+"pv0i7ZuDtD","LDk6fYjB9t","djsrvZuDtD","IBe8k2ZHdk","oVQp67ku1p","SjskQ9GXkX","HzZT8UmaEv","0PktIHP433","sx5GlRmDcr","prNT6lj07Q",
+"tjQxsQnJ1S","FNYIMQ6Lix","zqH0Wru4UG","hSSvQ9eoRc","oQ87rNo0Qb","uoStwjSjS3","mz8gxIBe8k","5IhmG5Drn0","jS1aj14FLR","Cp3mZF6PT2",
+"24ARFGSQwj","0PktIMmKGJ","kZANmIRh48","VNCPdSbRYy","ni2v1ZuDtD","qaofNAXpwE","Oz8yZ9XyT9","v8yFNKASQ8","soy9tOUqFM","zY1GYfcJOy",
+"v1HlnWaim6","a00b5gf8rI","FhtglDLhzM","QClRLS2Dfu","iKqhr0h1b1","618Di2ZHdk","0KyfsD6rBy","uupzkjSjS3","aFFssPb1pa","vOqCEb29RJ",
+"FwEJzxReec","9GXkXpT8wu","6AFT0fmIK1","rz7UtcL0aE","HfyNQ9eoRc","v1Hln0Kyfs","dmoS7s4786","e6e4zM3zXL","vLsmShSSvQ","Yw2oUIjTwP",
+"uLtKsprNT6","8U2nUWaWsv","JXljWsqVrf","brhlQYw2oU","mX2GEHfyNQ","mz8gxWPmlx","b29RJfqypy","QbxXc7lUXZ","fcJOyiqv4k","0MR5Xv2eC3",
+"uN6r3POUYS","v8yFNMojnP","s47865ZaEz","lkMUA64s8N","hUTw78cVD3","X6Pin618Di","HfyNQs4786","prNT6t59lR","0YAGHU3yw5","4QMc9k85Ae",
+"v2eC3LDk6f","YOfrYeuZA5","2hEEUvLsmS","LewvMS2Dfu","J2mQi1LB1L","iqv4ks4786","BCxeC7ku1p","iKqhrpAhR1","NOHszd85a9","YOfrYQChxs",
+"NhXduRmDcr","kB5nPWmadA","K20wKcmXIX","FVMxoWPmlx","sx5GldhSuH","zHF1qMm8si","I7p2a55rfB","sqVrfpv0i7","Mkgy87hyVv","CxVEf0YAGH",
+"FnPFBh1zcH","8hJdtfaHir","ydG8UDcpWB","nlaBySmGzv","kZANmI7p2a","s4786lViBv","tAOsryvOMI","FNYIMCxVEf","gf8rIQChxs","IBe8klH1kt",
+"lsQGogdQsS","Dz1R3KZamH","29QAzTa8f6","BbwgAS2Dfu","Yf2Ec8RCUA","QbxXcsqVrf","HP433aFFss","FGzgpi3pyd","piJSkZUnqt","AIYUuHfyNQ",
+"TXQ0ZrKDLJ","jSjS3qQxHP","s93Ml580YD","OxWIH8hJdt","9y4lwwDajX","MojnPCNHmv","tjQxsjS1aj","OUYuFsqVrf","YjB9tMezSW","tuDySn8pJ9",
+"pv0i7HfyNQ","okgRijzUqR","BpYhVpFrrl","TXQ0Z1j5L8","Z4I1vChuy3","uoStwRsQUq","SmGzv3weIF","Kr8ysulk41","QYxC0QClRL","hSSvQVBjhz",
+"HfyNQtaOXK","fLNg8qUJMd","14FLRvkCHH","pWiOsK20wK","jfREudhSuH","14FLRJkzUn","fmIK1i3pyd","ru4UGgIYvE","2DREslpF6W","7hyVvrKDLJ",
+"TwanouJScX","zmLYDTXQ0Z","dpe1vyToGW","WmadA7X3uy","dmoS7jiVBP","Waim6h1zcH","fFDrJC2Irc","P6bcgtAOsr","XyPZNVIlwP","5VZjS3weIF",
+"tvdkDs4786","IBe8ksuY4x","hYBCK3weIF","pAhR12hEEU","pFrrliqv4k","FxX9q0Kyfs","W3VFHKsjRK","0KyfsqaofN","i7WMQM3zXL","4W0TlgIYvE",
+"dpe1vWaWsv","QClRLECMvU","yEfy9RzaZA","tlILtSmGzv","Yf2EcVprf2","lH1kt1j5L8","WPmlxKsjRK","L7cGcTCgPp","oGu6xVjCZq","ZUnqtFLsph",
+"ciuWzFNYIM","ZuDtDvkCHH","t98iWCK5W7","aDGtS7fsYM","BbwgAl83Ud","xXTI4W3VFH","Vprf2JXljW","VIlwPrKDLJ","OHaBzAIYUu","aFFssZv7z0",
+"rhl0Juvf7A","DQimpvkCHH","C2IrcoVQp6","iKqhriKqhr","VBjhzqQxHP","k85AeyToGW","0Wr5y3otm6","uupzklkMUA","zY1GY5Mg9r","sx5Glatef2",
+"cShY2qaofN","8FmFH2Nslm","xXTI4WreyP","OUYuFWaim6","Ul4a1uoStw","OHaBzFwEJz","S2Dfuxciqp","3otm6OUYuF","UlU3MyvOMI","VLTy65iGN5",
+"gdQsSmz8gx","14FLRZJTXH","zqH0Wn1pmO","QssNC9iGoT","AOgEejzUqR","bgJAzKZamH","Chuy3RzaZA","I7p2a7fsYM","QYxC0ECMvU","x3LDeuQIcz",
+"0Kyfsm4bxU","WMiS3ZzJHW","CqqaDs4786","LewvMHzZT8","n8pJ9MK07Y","5NammChuy3","n1pmOMmKGJ","C2IrcuZPqg","v2eC3MmKGJ","wDajXiwzGk",
+"AmdQdtaOXK","7X3uyKsjRK","GSQwjJRJQB","lXFOBlViBv","KZamH2TRI7","FGzgpNo0Qb","AkKTkbgJAz","aDGtSlH1kt","cShY2StlDJ","QYxC0yToGW",
+"RkQkeFhtgl","QssNCWPmlx","VNCPdkZANm","StlDJdjsrv","uZPqg5iGN5","zmLYDMkgy8","5IhmGNcICA","7ku1pNhXdu","MGlTFDQimp","cL0aEbZLvS",
+"AIYUuZzJHW","s93MlIKxdL","G1RhS9eoRc","pv0i7RzaZA","48cHLcQOnv","ThjNn8U2nU","7ku1pL7cGc","K4GS8tAOsr","GrDg7MmKGJ","4QMc9ksJby",
+"zqH0Wsoy9t","OUYuFECMvU","ydG8UMezSW","Ta8f6RmDcr","B3qemAkKTk","7Ow5CRpBQm","uoStw0YAGH","DLhzMDQimp","KsjRKMojnP","VNCPdru4UG",
+"0PktIThjNn","iKqhrPYBf4","jSjS39iGoT","6q6L9ix74r","FjHXRoGu6x","FGzgpCNHmv","atef2OUqFM","yToGWFwEJz","55rfBiB08l","Y1mC0JRJQB",
+"vLsmSZ4I1v","wDajXcL0aE","X6PinpiJSk","vOqCE14FLR","FjHXRhE1Ql","9eoRc8U2nU","ksJbyFwEJz","618DiyToGW","cL0aEzQt6Q","Vprf2xReec",
+"7hyVvZv7z0","EoToPEOE1o","FjHXR1v5hH","a00b5jzUqR","0YAGHNOHsz","FxX9qStlDJ","9rlg9FxX9q","AIYUuMezSW","TXQ0ZFFDui","G1RhSPb1pa",
+"pFrrl9iGoT","Mkgy8M3zXL","pvgjScmXIX","RpBQmXflUq","QworuQnJ1S","Waim6aL6AJ","FPfSElH1kt","SjskQC2Irc","uJScXNhXdu","2ZHdkyluBx",
+"i3pydKASQ8","zbIYYmX2GE","zY1GYyToGW","h1zcHFxX9q","AgJHQaL6AJ","k85AeRACuj","x3LDeX6Pin","WMiS3Kr8ys","Ss0ZuQssNC","AmdQdgdQsS",
+"45cIHsuY4x","X6Pinaez9y","soy9tUl4a1","IKxdLRxrsm","9rlg98FmFH","HRxd82ZHdk","NhXduVIlwP","pFrrlDG4sT","9GXkX580YD","zQt6QU3yw5",
+"Q6hMCxXTI4","Q6LixAgJHQ","MmsIoKZamH","7fKYUpT8wu","cQOnvZzJHW","64s8NRpBQm","0h1b1uupzk","djsrvHzZT8","1v5hHXyPZN","iqv4k5nmWv",
+"WPmlxFcWrW","AIYUuulk41","SjskQPb1pa","jeskS3weIF","pmeCdzHF1q","5IhmGn8pJ9","blLA9tjQxs","pT8wu5IhmG","ciuWzUl4a1","3otm69iGoT",
+"zz4ZUk85Ae","rKDLJbgJAz","KZamHRBhp0","hE1QlHRxd8","v8yFNJRJQB","zz4ZUQYxC0","i7WMQZ4I1v","7fKYUiqv4k","0YAGHy94nw","fcwDas7Mxk",
+"mX2GE8FmFH","yToGWuoStw","tAOsrlViBv","k85AecL0aE","xciqpOz8yZ","aez9yokgRi","yluBxfmIK1","HlUbFd7vjM","RBhp064s8N","HfyNQQ6hMC",
+"nFqik8TxD7","atef2CNHmv","lViBvS77LH","NAFuw4W0Tl","7X3uyhYBCK","t59lRv1Hln","KASQ8m4bxU","VIlwPDG4sT","he9IAUmaEv","gf8rIYf2Ec",
+"uAWypQYxC0","S77LHRmDcr","7ku1pYw2oU","RACujNo0Qb","IBe8klCMxy","UlU3MtlILt","qQxHPnlaBy","OUqFMQbxXc","AgJHQ48cHL","GWqqXfcwDa",
+"5nmWvFjHXR","ZhwG164s8N","wDajXSWfou","5nmWvd85a9","bZLvSSmGzv","suY4x2hEEU","CqqaDM3zXL","Nxx9Vsx5Gl","ni2v1LDk6f","I7p2aChuy3",
+"fcJOyRACuj","QssNCI7p2a","yofH30YAGH","v8yFNWDVWJ","fmIK1nnP8o","zY1GYzFgtB","zz4ZU2hEEU","prNT6QbxXc","Cfgr3nlaBy","0h1b1d85a9",
+"lViBvLbRTH","lXFOBZhwG1","lpF6WCdyBV","SmGzvXflUq","iqv4kReKEW","Chuy3aFFss","WaWsvuupzk","tjQxs2Nslm","o8UyduLtKs","IBe8kQWxoT",
+"B3qemciuWz","7fsYMuLtKs","dhSuHSWfou","7ku1pXflUq","AmdQdfmIK1","CxVEf0Wr5y","UlU3MJkzUn","uoStwwiHrZ","lViBvDz1R3","UlU3MD6rBy",
+"ksJbyIBe8k","2hEEUpWiOs","lj07QRzaZA","xReecgjUTu","ni2v1iwzGk","YjB9tkB5nP","RpBQm8FmFH","8cVD3Cfgr3","8cVD34dEz6","SmGzvRmDcr",
+"mX2GE6q6L9","Q6Lix45cIH","djsrvMaJQs","UmaEvOUqFM","0PktIcmXIX","fmIK1POUYS","yToGW0Kyfs","pmeCdTXQ0Z","Mkgy8IRh48","soy9tPOUYS",
+"Yh1hFBpYhV","xXTI424ARF","SjskQzQt6Q","POUYSMmsIo","ZuDtDCdyBV","xciqpRBhp0","6AFT05Drn0","3otm6yofH3","FPfSEfmIK1","D6rBymz8gx",
+"dmoS7cL0aE","QnJ1SJ2mQi","2Yz7EyEfy9","MmKGJuoStw","618DilXFOB","Gv3Fq1j5L8","FFDuini2v1","NOHszGXdoH","oVQp69iGoT","qQxHPtl72W",
+"Zv7z0HlUbF","DcpWBRACuj","qUJMd07n1c","MojnP07n1c","hi5X7JRJQB","uN6r3SbRYy","uAWypgIYvE","l83Ud2Nslm","uQIczAOgEe","yvOMIjzUqR",
+"lpF6W1v5hH","faHirpFrrl","CqqaD9y4lw","O3iyQHzZT8","zmLYD9iGoT","OHaBzWaim6","D6rByOz8yZ","v2eC3K20wK","jSjS37Ow5C","BbwgAZhwG1",
+"S77LHiB08l","ksJbyF6PT2","cL0aETa8f6","zmLYDguMb8","JJs5mjiVBP","LDk6f55rfB","BGaQYRsQUq","HP433In3NS","WDVWJRzaZA","0h1b1sx5Gl",
+"8xEKzU3yw5","y94nwAmdQd","0YAGHTCgPp","XyPZNP6bcg","XyPZNLewvM","piJSk7fsYM","AmdQdzqH0W","IKxdLQYxC0","ru4UGyvOMI","YOfrY64s8N",
+"7fKYUFGzgp","lsQGo9XyT9","cQOnvDLhzM","uZPqg7Ow5C","HP433I7p2a","Z4I1v0ao3l","Q6LixD6rBy","hSSvQxciqp","uPX7G7fsYM","tvdkDhE1Ql",
+"BFkb87X3uy","FLsphgjUTu","hi5X7Twano","uupzkIKxdL","jeskSmX2GE","n8pJ9CK5W7","4W0TlCxVEf","FFDuihYBCK","dpe1vYf2Ec","M3zXLIKxdL",
+"WMiS3hi5X7","iqv4kJKWYR","LDk6f3weIF","16lHcEOE1o","LDk6fzz4ZU","0BmCynFqik","64s8Nhe9IA","kZANmjtn0X","RACuj64s8N","Vprf2F6PT2",
+"jiVBP7lUXZ","pv0i7G1RhS","jS1ajlViBv","FnPFBaez9y","9eoRctvdkD","MGlTFlpF6W","dhSuHazIWp","NcICAOUYuF","JIqXipmeCd","9GXkXGWqqX",
+"jtn0X4QMc9","qUJMdksJby","s7MxkpT8wu","MmKGJ8xEKz","1v5hHrKDLJ","OUqFMv2eC3","uupzkyvOMI","s7Mxkk85Ae","FnPFBbrhlQ","Mkgy8M6qcG",
+"AXpwEjtn0X","MojnPNOHsz","fcJOyKr8ys","uPX7G24ARF","fFDrJdmoS7","POUYSKr8ys","5Drn0Kr8ys","Kr8ysRpBQm","FFDuiKr8ys","djsrvoQ87r",
+"CIShGZ4I1v","NAFuw0h1b1","QssNCS77LH","QWxoTkZANm","e6e4zbrhlQ","cmXIX8TxD7","uZPqg24ARF","Yf2EcQ6Lix","Vprf264s8N","RBhp0RBhp0",
+"vOqCEfmIK1","nnP8oWPmlx","RzaZAxciqp","29QAztuDyS","cQOnvv8yFN","F6PT2tAOsr","azIWplCMxy","8TxD7WreyP","n1pmOMaJQs","lH1kth1zcH",
+"Yw2oUZzJHW","d7vjM9y4lw","yofH3gdQsS","azIWpsx5Gl","yofH38FmFH","0YAGHDz1R3","iwzGkn1pmO","nFqikjeskS","HfyNQJJs5m","blLA9WMiS3",
+"OHaBzjSjS3","Oz8yZnlaBy","yvOMIwDajX","MmKGJrz7Ut","UlU3MZv7z0","F6PT2uoStw","OxWIHblLA9","cQOnvYf2Ec","fFDrJzmLYD","29QAz29QAz",
+"lj07QOUYuF","MmsIoBGaQY","b29RJqQxHP","48cHLAkKTk","ECMvUCIShG","tuDySMGlTF","6AFT0ydG8U","DQimpFnPFB","LDk6fcQOnv","YOfrYFPfSE",
+"KsjRKdQ586","5IhmG4dEz6","sqVrfcShY2","RsQUqyEfy9","pFrrlvLsmS","IKxdLBFkb8","h1zcHF6PT2","v1HlnJKWYR","RpBQmy94nw","hi5X7uAWyp",
+"AgJHQqaofN","s7Mxk1v5hH","ECMvURkQke","zz4ZUAkKTk","K20wKIRh48","2Yz7E1j5L8","lkMUADQimp","lViBv4QMc9","mz8gxd85a9","zHF1q7fsYM",
+"9rlg9tjQxs","azIWp2DREs","RkQkejeskS","B3qemqaofN","VLTy6Oz8yZ","EoToPa00b5","iB08lpmeCd","KsjRKlweGy","yEfy9Kr8ys","b29RJMm8si",
+"AgJHQpWiOs","5Mg9rPOUYS","LDk6fTwano","NhXdu0Wr5y","YOfrYb29RJ","RmDcreuZA5","qUJMdDcpWB","5nmWvQ6Lix","MmKGJNxx9V","aDGtSStlDJ",
+"C2IrcIn3NS","5Mg9rVNCPd","KASQ8LDk6f","zmLYDfmIK1","ciuWzFVMxo","uLtKsx3LDe","IjTwPWaim6","0ao3liqv4k","RBhp0CxVEf","lkMUAlm0pD",
+"6q6L9JKWYR","YOfrYcmXIX","QChxsM6qcG","cShY21LB1L","NcICA55rfB","SWfoue6e4z","L7cGcyToGW","piJSkZv7z0","t59lRzbIYY","JIqXiGrDg7",
+"FPfSETa8f6","l83UdEdBKc","QClRLhe9IA","yluBx64s8N","DG4sTOxWIH","he9IAyvOMI","Ss0ZutlILt","MezSWuPX7G","0Wr5yt59lR","tlILteuZA5",
+"5Drn0i3pyd","xReecFLsph","FxX9qPYBf4","DQimpWDVWJ","iB08lL7cGc","vLsmStjQxs","7ku1pOxWIH","Kr8ysLbRTH","VerEAcShY2","CIShGCfgr3",
+"AOgEeK4GS8","B3qemsoy9t","d85a9jtn0X","s93Mldjsrv","v2eC3SjskQ","9iGoTyToGW","NOHsz8U2nU","C2IrcZUnqt","jS1ajfcwDa","8hJdtKASQ8",
+"0h1b10YAGH","i3pydvLsmS","B3qemhe9IA","D6rByVerEA","JKWYREoToP","DLhzMy94nw","qaofNI7p2a","VjCZqHzZT8","RkQkeVjCZq","SmGzvStlDJ",
+"9XyT9OHaBz","guMb85VZjS","dmoS7DLhzM","UlU3MWMiS3","brhlQuLtKs","zQt6QpiJSk","uJScXwDajX","0ao3lCqqaD","zY1GYlH1kt","oVQp6qQxHP",
+"5Mg9rtlILt","ZUnqti3pyd","5iGN5dpe1v","0BmCyb29RJ","yofH3ZJTXH","fFDrJZUnqt","1v5hHEOE1o","xciqplpF6W","FxX9qFNYIM","atef20ao3l",
+"ECMvU9XyT9","FxX9q1j5L8","AmdQdFPfSE","Chuy3lm0pD","DQimpEOE1o","LbRTHhE1Ql","64s8NWreyP","uTacxrhl0J","hSSvQ5nmWv","ciuWz64s8N",
+"Z4I1vVIlwP","hYBCKU3yw5","Mm8sizqH0W","zmLYDiKqhr","yluBx4W0Tl","Waim6okgRi","oVQp6KZamH","qQxHPB3qem","zmLYDAkKTk","zmLYD2Yz7E",
+"gjUTudQ586","VIlwPAmdQd","pmeCd24ARF","uPX7GIjTwP","suY4xd85a9","TCgPp9GXkX","FGzgppFrrl","a00b5FnPFB","gjUTuuZPqg","NcICA8cVD3",
+"QbxXcGSQwj","2hEEUThjNn","Nxx9V5drc6","L7cGcfaHir","FGzgps93Ml","lpF6WkZANm","nFqikFcWrW","W3VFHaez9y","taOXKa00b5","lpF6WECMvU",
+"K20wKaDGtS","Z4I1v8cVD3","BpYhVZzJHW","IjTwPs7Mxk","29QAzRmDcr","S2Dfulj07Q","2Nslm4QMc9","8FmFHWaim6","9y4lwEOE1o","7lUXZxXTI4",
+"gf8rI0BmCy","HzZT8i7WMQ","suY4x64s8N","MGlTFnFqik","WMiS3tvdkD","1v5hHW3VFH","RxrsmZUnqt","9y4lw9y4lw","atef2uJScX","kB5nPOUYuF",
+"pAhR1lsQGo","fFDrJEOE1o","AIYUu7ku1p","D6rBycL0aE","faHirB3qem","nnP8oiqv4k","8hJdtaez9y","Twanoru4UG","blLA95Namm","8TxD7JRJQB",
+"lm0pDOxWIH","zmLYDm4bxU","YOfrY2Nslm","8hJdtjS1aj","D6rByqUJMd","QbxXctAOsr","7ku1pQnJ1S","qUJMdRACuj","8U2nUCxVEf","ni2v1pvgjS",
+"cmXIXcmXIX","NAFuwvkCHH","kB5nP8FmFH","gtCA5uZPqg","QbxXcJkzUn","iwzGk4W0Tl","3weIF5ZaEz","Mkgy84QMc9","TCgPpVLTy6","AXpwEX6Pin",
+"wDajX8hJdt","618DiW3VFH","Yf2Ecrhl0J","G1RhS2ZHdk","8FmFHydG8U","i3pydOxWIH","Yf2EcVLTy6","FhtglM3zXL","vLsmS5drc6","pT8wuk85Ae",
+"POUYSyEfy9","3otm6RzaZA","S77LHkZANm","RkQkeblLA9","JIqXiQYxC0","jzUqRKsjRK","2DREs5drc6","gjUTuYh1hF","LDk6fvOqCE","UlU3M64s8N",
+"MGlTFU3yw5","piJSkpmeCd","U3yw5iKqhr","fLNg8OHaBz","DG4sTydG8U","FGzgp1j5L8","FcWrWZJTXH","8RCUAK4GS8","SjskQuN6r3","S77LHdQ586",
+"ydG8UFjHXR","VjCZqzY1GY","QssNC618Di","J2mQieuZA5","NAFuwiB08l","In3NSDcpWB","zHF1q1LB1L","i3pydfcJOy","07n1clH1kt","pvgjSC2Irc",
+"aFFss16lHc","pmeCdyofH3","5drc6GWqqX","NcICAtvdkD","ydG8UnlaBy","jSjS3brhlQ","lsQGo5VZjS","lH1ktCK5W7","zbIYY4W0Tl","n8pJ9WmadA",
+"atef2Fhtgl","vkCHHJXljW","lViBvnFqik","iKqhrwDajX","580YDe6e4z","okgRiK4GS8","v1HlnFGzgp","hUTw7ZUnqt","CIShGxReec","SWfouoQ87r",
+"aFFssSjskQ","jiVBPWDVWJ","nFqik9y4lw","CK5W7X6Pin","Zv7z0oQ87r","LDk6fUmaEv","HRxd8lj07Q","IBe8kzFgtB","o8UydQbxXc","07n1ctlILt",
+"lweGyS77LH","RsQUqSbRYy","7lUXZ2DREs","lj07Qlm0pD","qQxHP4QMc9","b29RJgIYvE","guMb80h1b1","cShY216lHc","MK07YVerEA","O3iyQ7X3uy",
+"hYBCKs4786","3weIFS2Dfu","ZJTXHgtCA5","6q6L91LB1L","zHF1qLewvM","LewvM3weIF","qQxHPpWiOs","Vprf2Waim6","8cVD3atef2","WDVWJ0Wr5y",
+"jeskS2Yz7E","Ss0Zu3otm6","fcJOydQ586","BFkb8tvdkD","iKqhrHfyNQ","lsQGo0h1b1","SmGzvGrDg7","d85a9x3LDe","Nxx9V24ARF","14FLRRsQUq",
+"qUJMdciuWz","BFkb8VLTy6","F6PT2RzaZA","s93MlZv7z0","GXdoHJ2mQi","gdQsSFxX9q","lsQGoQClRL","QbxXchSSvQ","dpe1v5Mg9r","QbxXcgf8rI",
+"7fKYU7fsYM","lH1kto8Uyd","7hyVvLbRTH","In3NSpiJSk","MezSW5IhmG","Z4I1vcShY2","8xEKzhi5X7","Mm8sioQ87r","7fsYMs4786","JJs5mzY1GY",
+"gIYvEs93Ml","e6e4zQ6hMC","pAhR1k85Ae","MGlTF5nmWv","ZzJHWVjCZq","QYxC0uvf7A","G1RhSWreyP","h1zcHZhwG1","GWqqXNo0Qb","cmXIXYjB9t",
+"5ZaEzlpF6W","d85a9uJScX","i7WMQ0Wr5y","wiHrZrKDLJ","XflUqUlU3M","FwEJzVerEA","RzaZA0PktI","ZuDtDmX2GE","wDajXe6e4z","J2mQiv1Hln",
+"oQ87rCNHmv","MaJQsF6PT2","JKWYRFwEJz","kZANmFnPFB","xciqpQworu","GSQwj24ARF","8cVD3FNYIM","D6rByJXljW","jfREuhUTw7","n1pmOmz8gx",
+"G1RhSWmadA","RpBQmK20wK","0Wr5yVjCZq","IBe8kpT8wu","K20wKCNHmv","MmsIoyvOMI","iwzGkJ2mQi","pv0i75Mg9r","tjQxslm0pD","JXljWulk41",
+"dQ586h1zcH","pvgjS2TRI7","2NslmfcwDa","WPmlx0Kyfs","Uvlv4cQOnv","QClRLQnJ1S","I7p2av1Hln","jtn0XBpYhV","B3qemAOgEe","prNT67hyVv",
+"JIqXiVerEA","jtn0XVerEA","tvdkDiB08l","uQIczyofH3","7ku1pv8yFN","blLA9Q6hMC","tuDySBpYhV","xciqpxciqp","uoStwIRh48","OUqFM2hEEU",
+"Waim6WDVWJ","WDVWJs7Mxk","jfREu2hEEU","C2IrcZuDtD","U3yw5ThjNn","s93MloVQp6","AmdQdStlDJ","dmoS7M3zXL","uLtKs8FmFH","KsjRKGv3Fq",
+"aFFssdjsrv","ZuDtDlsQGo","nFqikhi5X7","gdQsSF6PT2","zqH0WCxVEf","Uvlv4suY4x","5IhmGnlaBy","ydG8UpFrrl","POUYSx3LDe","tuDySIKxdL",
+"BbwgAB3qem","ulk41YjB9t","Cp3mZECMvU","RsQUquQIcz","WMiS3CIShG","WPmlxTwano","jfREuNAFuw","8RCUAtjQxs","aL6AJ8hJdt","J2mQiZ4I1v",
+"FGzgpTa8f6","vLsmSKZamH","HlUbFWaim6","HRxd8bgJAz","fFDrJqQxHP","soy9tGXdoH","l83UdtAOsr","WPmlxb29RJ","JKWYR3weIF","rz7Utn1pmO",
+"In3NSIKxdL","lViBvReKEW","guMb8n1pmO","UlU3MuPX7G","jSjS3pvgjS","sx5Gldjsrv","GWqqXIBe8k","uoStwb29RJ","e6e4z7fKYU","M6qcGtaOXK",
+"9rlg9WreyP","lCMxygdQsS","taOXK3otm6","he9IAl83Ud","Pb1pam4bxU","Gv3FqcQOnv","ZJTXHYw2oU","Ul4a13otm6","GSQwjRpBQm","SmGzvMezSW",
+"FhtglQssNC","7fsYMNcICA","FcWrWuQIcz","0BmCyl83Ud","9iGoTCdyBV","fcwDaix74r","lH1kt07n1c","s7Mxk2hEEU","Ss0ZuX6Pin","FwEJzKr8ys",
+"tlILtSbRYy","fqypy5IhmG","i7WMQ7lUXZ","2Yz7EguMb8","1LB1Lhi5X7","KsjRK4W0Tl","16lHcJIqXi","zHF1qlH1kt","0Wr5yCqqaD","uupzkpAhR1",
+"W3VFHChuy3","fqypyLewvM","yofH3QChxs","7fKYUfLNg8","8cVD3DG4sT","JKWYR48cHL","WDVWJTwano","7fKYUpAhR1","MaJQs0h1b1","7lUXZKr8ys",
+"GWqqXlkMUA","5drc6F6PT2","prNT60Wr5y","hE1QlzmLYD","IRh48hUTw7","0h1b1Mkgy8","S2DfuThjNn","Ta8f6wiHrZ","lCMxyWMiS3","hSSvQFjHXR",
+"lXFOBi3pyd","dQ5865Namm","zbIYY45cIH","zHF1qyEfy9","Dz1R3CxVEf","piJSkTwano","LbRTHwDajX","9iGoTWDVWJ","QworuZJTXH","hYBCKtaOXK",
+"uPX7GdhSuH","yToGWGXdoH","BpYhVpv0i7","LewvMe6e4z","v2eC39GXkX","i7WMQx3LDe","NcICA14FLR","h1zcHI7p2a","s93MlIjTwP","uPX7Grhl0J",
+"zQt6QjeskS","0h1b1MK07Y","5IhmGIBe8k","QWxoTVBjhz","MmsIoFFDui","2Nslm8RCUA","4W0TlIKxdL","lXFOBhUTw7","VerEAVprf2","ksJbyjfREu",
+"J2mQiWaWsv","BCxeCJKWYR","tAOsrdhSuH","jfREuL7cGc","4QMc907n1c","WPmlxBCxeC","2DREsFVMxo","LDk6flCMxy","G1RhS8U2nU","gjUTuX6Pin",
+"Cfgr3SWfou","piJSkLDk6f","lkMUAWreyP","piJSk5iGN5","hUTw7zHF1q","zmLYDv2eC3","pvgjSM3zXL","uJScXDG4sT","P6bcg9iGoT","0BmCywDajX",
+"DG4sTYjB9t","a00b5pmeCd","5Drn0HfyNQ","Waim65VZjS","8TxD75Drn0","X6PinCK5W7","jfREuDQimp","IjTwP9GXkX","lm0pDW3VFH","9y4lwlH1kt",
+"DG4sTWreyP","L7cGcFNYIM","Oz8yZdhSuH","hYBCKpvgjS","Zv7z0YOfrY","CIShGsoy9t","NcICAa00b5","OUqFMMmsIo","JKWYRLewvM","Ul4a1hE1Ql",
+"EOE1onnP8o","Yw2oUlm0pD","S77LHSjskQ","M3zXLlpF6W","X6PinokgRi","618Di5nmWv","tlILtcL0aE","Cfgr3C2Irc","MGlTFuN6r3","CxVEfGSQwj",
+"5Mg9rJkzUn","MezSWVjCZq","jfREuJ2mQi","tvdkDyluBx","t59lRCp3mZ","zz4ZUjeskS","TwanoFjHXR","VIlwPBFkb8","hSSvQRpBQm","YjB9txReec",
+"0Wr5yEoToP","SWfouwDajX","uoStwMm8si","MezSWlCMxy","RzaZA2Nslm","CdyBVReKEW","2hEEUpmeCd","fcJOyhUTw7","sqVrfJkzUn","zqH0WhUTw7",
+"5VZjSIRh48","ECMvUI7p2a","S77LH9GXkX","3otm6l83Ud","dQ586oGu6x","oVQp6pT8wu","oGu6xb29RJ","KASQ8VerEA","dQ586Ss0Zu","QYxC0IjTwP",
+"Yw2oU4dEz6","Yw2oUv1Hln","5NammRxrsm","WaWsvwDajX","FFDuiS77LH","kZANmlXFOB","hi5X7yluBx","Pb1paogLgc","CK5W7aDGtS","LDk6fnFqik",
+"NAFuwYf2Ec","O3iyQ5iGN5","lpF6WZhwG1","cShY2hUTw7","zbIYYIKxdL","OxWIHn1pmO","Fhtglk85Ae","M6qcGuPX7G","0ao3l64s8N","lj07QMaJQs",
+"4W0TlwDajX","Cfgr3ZUnqt","JKWYRpv0i7","C2IrcwDajX","l83UdAkKTk","4W0TlbrhlQ","nFqikK4GS8","faHirZzJHW","AXpwEVjCZq","kB5nPEOE1o",
+"wDajXQWxoT","guMb8b29RJ","Q6LixS77LH","AOgEeaez9y","2Nslmgf8rI","14FLRdhSuH","1j5L8zQt6Q","lj07QHfyNQ","ulk41618Di","QworuuoStw",
+"lj07QzQt6Q","brhlQ2hEEU","YjB9tmz8gx","ECMvU7X3uy","kB5nPdmoS7","BFkb8BbwgA","sqVrfOz8yZ","1v5hHpFrrl","K4GS848cHL","LbRTH7ku1p",
+"LewvMlH1kt","FcWrW4dEz6","DQimpSbRYy","QClRL2ZHdk","16lHc5nmWv","MGlTFgf8rI","Mkgy8DQimp","WmadA8hJdt","BFkb8d85a9","LbRTHMezSW",
+"NhXdujiVBP","FnPFBru4UG","Q6Lix5drc6","v2eC3ECMvU","vOqCE5Namm","dmoS7iB08l","zHF1qlm0pD","cL0aEM6qcG","CIShGblLA9","xXTI4Waim6",
+"IjTwP9XyT9","7hyVvS2Dfu","cShY21v5hH","5Drn09GXkX","L7cGcHfyNQ","yluBxReKEW","5IhmGtvdkD","FPfSEa00b5","RkQkeX6Pin","TCgPpqUJMd",
+"BCxeCEOE1o","tlILtzbIYY","rKDLJ24ARF","QnJ1S4dEz6","MmsIofmIK1","07n1cPYBf4","tuDySuN6r3","x3LDeSs0Zu","a00b5guMb8","vLsmSgdQsS",
+"b29RJUlU3M","RpBQmyofH3","uLtKs0Kyfs","PYBf4AXpwE","SbRYyGrDg7","FLsph6q6L9","No0Qb8TxD7","aFFssXflUq","XyPZNQbxXc","ulk41GSQwj",
+"fqypy9y4lw","Mkgy8Nxx9V","dQ586U3yw5","tAOsrhe9IA","lViBvi7WMQ","he9IAfFDrJ","gf8rID6rBy","yToGWk85Ae","16lHc0Kyfs","SWfouZhwG1",
+"ZUnqtQbxXc","vkCHHguMb8","8xEKzYOfrY","jSjS37X3uy","RzaZA7X3uy","GrDg7TXQ0Z","HP433soy9t","yluBxcShY2","ZuDtDi7WMQ","Kr8ys64s8N",
+"uN6r3zHF1q","FwEJzJRJQB","d85a9M6qcG","wDajXfFDrJ","blLA9JIqXi","lH1kt8U2nU","Q6Lixsoy9t","k85AeuJScX","dhSuH6AFT0","NcICAM6qcG",
+"StlDJix74r","Fhtgldpe1v","n1pmOlCMxy","pFrrlS77LH","Yf2Ec9GXkX","t59lRFGzgp","WaWsv2Nslm","WreyPW7cTs","Mm8sib29RJ","qaofNsx5Gl",
+"h1zcHLewvM","ZzJHWwDajX","RpBQmQWxoT","7fKYUQChxs","7Ow5ClpF6W","hi5X7v2eC3","FjHXRfqypy","VLTy6X6Pin","MojnPlCMxy","I7p2ahi5X7",
+"QYxC0I7p2a","ydG8Ugf8rI","JKWYR3otm6","nlaByuQIcz","8xEKzsuY4x","i7WMQnnP8o","Rxrsm9iGoT","x3LDeazIWp","s7MxkRxrsm","uoStwuZPqg",
+"fcJOyQ6Lix","VerEAYOfrY","fFDrJ7fsYM","AOgEerhl0J","uQIczSbRYy","Yh1hFyofH3","W3VFHZUnqt","W7cTsuPX7G","UmaEvMm8si","zY1GYZUnqt",
+"gf8rIQworu","Yw2oUvOqCE","taOXKFPfSE","zY1GYXyPZN","xXTI4pFrrl","IRh48DcpWB","guMb8uPX7G","uvf7Alm0pD","tuDyS45cIH","EOE1o7lUXZ",
+"GrDg7OUqFM","16lHcFVMxo","LewvMokgRi","RpBQmlH1kt","TwanoJkzUn","uPX7GVIlwP","i7WMQ9y4lw","yvOMIgtCA5","uoStwi7WMQ","BGaQYdmoS7",
+"zHF1q4dEz6","dhSuHW7cTs","2TRI7F6PT2","n1pmOZv7z0","SmGzvaez9y","HlUbFHfyNQ","blLA9a00b5","gdQsSiB08l","BpYhVfmIK1","blLA99iGoT",
+"yEfy9IRh48","GXdoHHRxd8","xXTI4G1RhS","suY4x14FLR","9iGoTQChxs","Yf2Ec2TRI7","GWqqXuvf7A","CIShGdhSuH","HfyNQBbwgA","14FLRtlILt",
+"NAFuwv1Hln","P6bcgVNCPd","yluBx5nmWv","KZamHs7Mxk","WaWsv7ku1p","b29RJxciqp","lXFOB9iGoT","UlU3M0h1b1","QworuaFFss","1v5hHAkKTk",
+"8RCUA2hEEU","tjQxskZANm","LDk6fuPX7G","8xEKzFcWrW","ZhwG1Chuy3","FhtglhYBCK","gIYvEoVQp6","07n1cWmadA","0ao3lWaim6","bgJAz2DREs",
+"Pb1paVerEA","xXTI4sx5Gl","Yh1hFgdQsS","7fsYMogLgc","8RCUAGv3Fq","cmXIXQnJ1S","okgRiLbRTH","faHirzmLYD","S77LHX6Pin","piJSkqQxHP",
+"Z4I1vgtCA5","h1zcHThjNn","sqVrfdhSuH","EdBKcqUJMd","ReKEWs4786","ni2v1IKxdL","ciuWzmz8gx","Q6LixNcICA","M6qcGIBe8k","ix74raFFss",
+"s93Ml0h1b1","BbwgASbRYy","CK5W7VjCZq","4W0TlqUJMd","taOXKD6rBy","S2Dfu45cIH","ZuDtDuLtKs","tjQxsiKqhr","Waim6Twano","K4GS8hi5X7",
+"MGlTFEoToP","RACujCdyBV","1LB1LCqqaD","uJScXzz4ZU","In3NSoQ87r","MGlTFFVMxo","MojnPEdBKc","DQimpKZamH","zFgtBGv3Fq","I7p2aaFFss",
+"FxX9qn8pJ9","gjUTu5drc6","m4bxU9GXkX","WMiS30Kyfs","sx5GlSs0Zu","uLtKs5Drn0","dhSuHaFFss","nlaBymz8gx","WMiS3uTacx","MaJQslweGy",
+"jzUqRFnPFB","RmDcrD6rBy","wDajXlCMxy","S77LHiKqhr","AgJHQgtCA5","QClRLW3VFH","ksJbyChuy3","FnPFBG1RhS","2hEEUJKWYR","580YDGWqqX",
+"2ZHdkzqH0W","bgJAzBpYhV","AkKTk45cIH","brhlQatef2","MGlTFZ4I1v","iKqhr9rlg9","yToGWrhl0J","lCMxyUmaEv","rhl0JFGzgp","okgRirhl0J",
+"o8UydbgJAz","VjCZqTwano","rhl0J8FmFH","Rxrsmtl72W","fFDrJuLtKs","OUYuF7Ow5C","QworuFNYIM","JRJQBogLgc","1v5hHHRxd8","580YDzbIYY",
+"AXpwE5Drn0","Nxx9VlXFOB","8xEKzl83Ud","8TxD7HlUbF","MK07Yfqypy","C2IrcOUYuF","dpe1vAgJHQ","ZJTXHHlUbF","zFgtBFcWrW","RxrsmO3iyQ",
+"qQxHP7fKYU","DLhzM8xEKz","ECMvUNo0Qb","cQOnv0Wr5y","Dz1R39rlg9","5Drn0oQ87r","24ARFTwano","ZuDtDJIqXi","aL6AJCxVEf","2Yz7E6AFT0",
+"NOHszBbwgA","VIlwP1v5hH","jtn0XwDajX","W7cTsaFFss","NhXdum4bxU","0YAGHC2Irc","lsQGoUmaEv","2hEEUSs0Zu","aDGtSs7Mxk","J2mQiKr8ys",
+"M6qcGKZamH","3otm6djsrv","7fsYMMGlTF","WDVWJM6qcG","8FmFHJXljW","yToGWlpF6W","07n1cC2Irc","NcICASjskQ","2TRI7uAWyp","xciqpCIShG",
+"dpe1vX6Pin","faHirguMb8","QssNCKsjRK","tlILtUl4a1","zmLYDMmsIo","FjHXRFPfSE","J2mQi5IhmG","Ul4a1SmGzv","aez9yyofH3","W3VFH1j5L8",
+"GrDg7B3qem","Chuy32TRI7","Zv7z0pAhR1","EdBKcJ2mQi","FVMxoBGaQY","y94nw2Nslm","IKxdLm4bxU","2NslmHRxd8","ZzJHW7lUXZ","K20wKaFFss",
+"5drc68FmFH","NhXduW3VFH","CxVEflViBv","e6e4zqaofN","XflUqnnP8o","7lUXZt59lR","QnJ1SjfREu","C2Irc2ZHdk","rKDLJgjUTu","ru4UGatef2",
+"CIShGydG8U","BFkb8xXTI4","v2eC3SmGzv","tlILtfaHir","M3zXLzY1GY","iwzGkDLhzM","Y1mC02DREs","pAhR1ogLgc","AmdQddjsrv","OHaBzWDVWJ",
+"6q6L9U3yw5","piJSkcQOnv","i7WMQDLhzM","aDGtSdmoS7","0BmCyv8yFN","nlaBylm0pD","9XyT9IKxdL","P6bcgvkCHH","ksJby5nmWv","jS1ajfFDrJ",
+"lweGyv2eC3","tl72WUl4a1","pFrrlFxX9q","iqv4kzHF1q","xReecWDVWJ","In3NSy94nw","Mm8siGrDg7","pvgjSU3yw5","ksJbyHRxd8","xXTI4cShY2",
+"LbRTHguMb8","UlU3MgtCA5","FFDuiuvf7A","P6bcgpWiOs","KASQ8G1RhS","FnPFBn8pJ9","1j5L88RCUA","9GXkXO3iyQ","RsQUqzz4ZU","vkCHHdpe1v",
+"tl72WJKWYR","Cp3mZ3otm6","ZJTXHgf8rI","suY4xP6bcg","VjCZqrhl0J","BFkb8i3pyd","D6rByNo0Qb","BCxeCFFDui","AgJHQtlILt","ru4UGBbwgA",
+"4dEz6RBhp0","pWiOsoGu6x","5IhmGjS1aj","cQOnv8xEKz","7hyVv7fKYU","I7p2alj07Q","Pb1paUvlv4","hUTw75Drn0","9iGoTVLTy6","tAOsrru4UG",
+"lm0pDD6rBy","ZuDtDGXdoH","hSSvQYw2oU","hE1QlW3VFH","NcICAX6Pin","uQIcz3otm6","MojnP8RCUA","SmGzvHRxd8","5VZjSVNCPd","L7cGcY1mC0",
+"IKxdLs93Ml","mX2GEZJTXH","DQimpoQ87r","Yf2Ecm4bxU","BFkb8x3LDe","vLsmSbZLvS","JKWYRbrhlQ","uoStwd85a9","yToGWMm8si","K20wKQworu",
+"okgRiKZamH","gIYvEfcwDa","CK5W7WmadA","taOXKEdBKc","jzUqRReKEW","piJSkK20wK","VerEApT8wu","JXljWGv3Fq","Y1mC014FLR","Mkgy86AFT0",
+"CdyBVW3VFH","RACujRACuj","K4GS87fKYU","In3NSnlaBy","RpBQm45cIH","LbRTH5IhmG","jiVBPgjUTu","Zv7z0ThjNn","uoStwM6qcG","9GXkXsuY4x",
+"1j5L8gjUTu","TCgPpyvOMI","zHF1qsx5Gl","5Mg9rrhl0J","vLsmS0h1b1","7Ow5CRxrsm","dhSuHkZANm","RkQkeYf2Ec","ogLgcciuWz","BbwgAfcwDa",
+"djsrvW3VFH","7Ow5CFFDui","VerEA580YD","jzUqRW3VFH","QYxC0lXFOB","YOfrYqaofN","kZANmlj07Q","lm0pDIBe8k","jeskSxciqp","MGlTFrKDLJ",
+"pmeCdVjCZq","DLhzMO3iyQ","pmeCdJIqXi","y94nwB3qem","uLtKszbIYY","9XyT9dmoS7","RzaZAYh1hF","brhlQQnJ1S","SjskQt59lR","1LB1LfcwDa",
+"FcWrWk85Ae","NhXduMojnP","d85a9ZzJHW","uTacx8xEKz","dQ586AOgEe","pWiOstl72W","vkCHH9rlg9","2DREscmXIX","RmDcrNhXdu","EdBKc2Yz7E",
+"jiVBPlweGy","QClRLK20wK","9GXkXuJScX","s4786bZLvS","CdyBV6AFT0","TXQ0ZFVMxo","8FmFHkZANm","dmoS75IhmG","uoStwAkKTk","n8pJ9qaofN",
+"24ARFi3pyd","9GXkXv1Hln","iB08lKZamH","7hyVvXyPZN","y94nwjiVBP","zbIYYC2Irc","Z4I1vzFgtB","WreyPlpF6W","QnJ1SfcJOy","qaofNDz1R3",
+"0Kyfs9y4lw","i3pydO3iyQ","O3iyQtvdkD","2hEEUx3LDe","VerEA5IhmG","LbRTHpWiOs","QWxoTSs0Zu","9XyT9fmIK1","G1RhSt59lR","lm0pDTwano",
+"9y4lwNOHsz","4W0TlZhwG1","1j5L8Qworu","OUqFM8cVD3","cQOnvVjCZq","0h1b1cShY2","gtCA59iGoT","gjUTuZUnqt","bZLvSTwano","KASQ81LB1L",
+"JIqXiVBjhz","VLTy6tl72W","oGu6xhYBCK","580YDprNT6","5NammfaHir","fmIK1EdBKc","OxWIHt59lR","VIlwPjiVBP","55rfBM3zXL","yEfy9Mm8si",
+"DQimp7fsYM","5NammW3VFH","U3yw5ReKEW","0MR5X0ao3l","bgJAzMmKGJ","RsQUqo8Uyd","2ZHdkk85Ae","RsQUqrKDLJ","JkzUnuAWyp","h1zcHGSQwj",
+"hSSvQ5iGN5","dQ586VBjhz","K20wKFcWrW","Mm8siUmaEv","6q6L9MGlTF","QssNCi7WMQ","tvdkDs7Mxk","djsrv55rfB","vOqCEOHaBz","FNYIMRzaZA",
+"8cVD3uAWyp","o8Uyd9y4lw","rz7UtsuY4x","Dz1R3lj07Q","BbwgAW3VFH","CNHmvEdBKc","ix74rLewvM","d85a9zbIYY","EOE1oxXTI4","Vprf2BCxeC",
+"uJScXatef2","BCxeCpv0i7","vkCHHTXQ0Z","vLsmSEoToP","pv0i7v2eC3","uPX7GZuDtD","4QMc9SWfou","QnJ1SYh1hF","cShY2ZhwG1","d7vjMUvlv4",
+"BGaQYni2v1","iwzGkqQxHP","QYxC0tvdkD","pAhR1ydG8U","rhl0JyvOMI","xciqpOUqFM","uJScX7fKYU","dQ586No0Qb","hUTw7ru4UG","580YDVjCZq",
+"FnPFB5Drn0","zmLYDS2Dfu","NAFuwIjTwP","lweGylj07Q","mz8gxazIWp","618DiAXpwE","CxVEfuupzk","QWxoTdhSuH","FLsphJIqXi","uoStwM3zXL",
+"gjUTuAOgEe","8xEKzzQt6Q","yEfy9580YD","ni2v1jeskS","NOHszhYBCK","dpe1vWPmlx","In3NS48cHL","t59lRa00b5","soy9tKASQ8","8U2nU45cIH",
+"CxVEfcShY2","MGlTFzmLYD","TwanookgRi","yEfy9yofH3","MaJQsSbRYy","3otm6lXFOB","pv0i7IBe8k","Ul4a12ZHdk","dmoS77fKYU","C2IrcFnPFB",
+"lXFOBF6PT2","prNT69eoRc","W7cTsjtn0X","uAWypxXTI4","uvf7A7hyVv","StlDJs7Mxk","yToGWVIlwP","tlILtWreyP","FVMxo45cIH","WreyPn1pmO",
+"Yf2EcprNT6","LDk6f7Ow5C","pAhR1F6PT2","WMiS3OUqFM","6AFT0dpe1v","zqH0W0ao3l","OUYuFgIYvE","hi5X7aDGtS","WreyP4W0Tl","MezSW618Di",
+"fcwDa618Di","jfREuuJScX","JKWYROUYuF","NcICALDk6f","U3yw5Yh1hF","gIYvEkZANm","FPfSEJXljW","guMb8XyPZN","FFDui2TRI7","ZzJHW8xEKz",
+"zHF1q0h1b1","RxrsmAgJHQ","LbRTH9eoRc","ydG8Ujtn0X","L7cGcokgRi","x3LDetuDyS","xXTI4S2Dfu","bZLvSi7WMQ","KZamHrKDLJ","dhSuHX6Pin",
+"JIqXiCNHmv","3weIFVLTy6","ZUnqtFnPFB","dQ586zz4ZU","StlDJt59lR","prNT6brhlQ","O3iyQlsQGo","5Drn0tuDyS","Nxx9VFNYIM","Rxrsm2TRI7",
+"OUYuFTCgPp","zY1GY4QMc9","pAhR1WreyP","uupzk8FmFH","ThjNnyofH3","WaWsvRsQUq","G1RhSuTacx","IRh48IjTwP","Yw2oU2hEEU","djsrvReKEW",
+"7Ow5C5IhmG","X6Pinv2eC3","bgJAzQnJ1S","ksJbyIn3NS","HlUbFYf2Ec","pmeCdpmeCd","oVQp6zFgtB","sx5GlVBjhz","3weIFtaOXK","I7p2ahYBCK",
+"45cIHlpF6W","I7p2aoVQp6","azIWp0Kyfs","KASQ8yofH3","ciuWzCfgr3","wiHrZ6q6L9","64s8NxReec","tl72WjS1aj","FnPFBQYxC0","fLNg8MojnP",
+"ni2v1W7cTs","Zv7z05Drn0","uZPqg7lUXZ","nnP8oLbRTH","DQimpn8pJ9","14FLR7X3uy","16lHcLewvM","D6rByZzJHW","7fsYM7lUXZ","gIYvEZUnqt",
+"FGzgpv8yFN","fmIK1TXQ0Z","kB5nPHfyNQ","x3LDeiqv4k","y94nw5iGN5","XflUq8U2nU","7lUXZKZamH","s93MlGXdoH","F6PT2pv0i7","AOgEeWmadA",
+"AgJHQyofH3","NOHszTCgPp","YjB9tguMb8","LDk6fgjUTu","soy9tsx5Gl","HlUbFfaHir","Ul4a19y4lw","piJSkIKxdL","VLTy68RCUA","FFDuiGWqqX",
+"Ss0ZuWreyP","v1HlndhSuH","StlDJ7hyVv","ksJbytl72W","he9IAGSQwj","0Wr5y48cHL","XflUqBpYhV","EOE1oKZamH","vOqCEJKWYR","zbIYYOHaBz",
+"CqqaDMmKGJ","o8UydWreyP","GWqqXuJScX","pAhR1JkzUn","OHaBzS77LH","C2IrczY1GY","PYBf49y4lw","jSjS32ZHdk","fqypy7ku1p","7lUXZCK5W7",
+"djsrv0h1b1","5Mg9rX6Pin","RzaZABCxeC","wiHrZHP433","GSQwjCp3mZ","580YD7lUXZ","dhSuHksJby","AOgEeFjHXR","BGaQYPOUYS","v8yFNprNT6",
+"IRh48M3zXL","tAOsrVNCPd","S2Dfu16lHc","MaJQsgtCA5","HP433uupzk","7Ow5CGv3Fq","jiVBP2Nslm","FFDuiprNT6","7X3uyokgRi","6q6L9blLA9",
+"YjB9tL7cGc","pmeCdlCMxy","VerEAYf2Ec","D6rBy580YD","Y1mC0oGu6x","zQt6QZv7z0","0h1b1F6PT2","lCMxy9GXkX","IBe8kQnJ1S","VjCZqb29RJ",
+"0YAGHVprf2","ydG8UjfREu","BCxeCpvgjS","TXQ0Zaez9y","lm0pDThjNn","AOgEetaOXK","yEfy9ru4UG","NcICA7Ow5C","W7cTsRpBQm","FcWrWM6qcG",
+"YjB9tokgRi","9y4lwn8pJ9","vkCHHlsQGo","QClRLiB08l","yofH30Kyfs","vkCHHKr8ys","VBjhzdQ586","cmXIXFxX9q","kB5nPRBhp0","cmXIXAmdQd",
+"WDVWJuQIcz","pWiOsStlDJ","Ul4a1NAFuw","e6e4zmX2GE","t98iWbrhlQ","i7WMQCqqaD","uZPqgDLhzM","pvgjSnlaBy","piJSk8xEKz","BpYhVru4UG",
+"dhSuHUlU3M","OHaBztvdkD","YjB9tSmGzv","qQxHPrKDLJ","OHaBzfqypy","rz7UtNhXdu","JkzUn8FmFH","t98iWksJby","8TxD7D6rBy","i7WMQs4786",
+"2hEEUwiHrZ","RsQUqOz8yZ","X6Pins93Ml","1v5hH48cHL","Ta8f60Kyfs","QClRLwDajX","9y4lwAIYUu","lweGyKsjRK","bgJAzjiVBP","pWiOsuTacx",
+"gIYvEO3iyQ","QWxoTgtCA5","azIWpnFqik","M3zXLoQ87r","bZLvSwDajX","d7vjMIjTwP","iB08l5Namm","4W0TlG1RhS","HzZT824ARF","rhl0JydG8U",
+"cL0aEJJs5m","taOXK8U2nU","RzaZAKASQ8","5Mg9rEOE1o","8xEKzUmaEv","WreyPQworu","uupzkFxX9q","bgJAzeuZA5","FLsphyofH3","pT8wuogLgc",
+"BGaQYHP433","POUYS9XyT9","iqv4ktjQxs","0Wr5yYjB9t","45cIHOUqFM","uupzkBCxeC","ydG8UgtCA5","4dEz6CNHmv","a00b5I7p2a","d7vjMpFrrl",
+"yEfy948cHL","jtn0XEoToP","0YAGHBFkb8","0Wr5yNcICA","zmLYDcShY2","qaofNv8yFN","0YAGHF6PT2","pAhR1aez9y","W3VFHQYxC0","zbIYYGrDg7",
+"14FLRVBjhz","ulk41jiVBP","IjTwPMojnP","3otm6zFgtB","Gv3Fqxciqp","1v5hHCqqaD","nFqikRkQke","ydG8UKASQ8","vkCHHQbxXc","In3NSvkCHH",
+"QChxs48cHL","tl72WQYxC0","AXpwExReec","9GXkXnlaBy","0YAGHs93Ml","jzUqRgtCA5","IKxdLzz4ZU","t59lR2hEEU","D6rByQworu","yToGWlXFOB",
+"zbIYYCfgr3","ZzJHWAmdQd","FhtglIKxdL","aL6AJSs0Zu","2Nslm9iGoT","S2DfuFjHXR","BpYhVMmKGJ","HlUbFhE1Ql","AkKTk2TRI7","0YAGHt59lR",
+"lkMUAfcJOy","bgJAzpWiOs","JKWYR7lUXZ","tuDySThjNn","DLhzMl83Ud","FjHXRLbRTH","rKDLJ0Kyfs","RsQUqQnJ1S","3otm62hEEU","AkKTkv2eC3",
+"DcpWBs93Ml","2ZHdkZhwG1","Ss0ZuIKxdL","RBhp0AIYUu","QWxoTDz1R3","aez9yYjB9t","5ZaEz7fKYU","CqqaDlj07Q","FLsphjeskS","1LB1LFhtgl",
+"CxVEfAgJHQ","JKWYRiKqhr","i3pydciuWz","SbRYyFnPFB","taOXKBFkb8","Waim6IBe8k","ZuDtDa00b5","14FLRmz8gx","yofH3uQIcz","C2Irc7fsYM",
+"2hEEUlsQGo","O3iyQFPfSE","U3yw5soy9t","Qworu4QMc9","SjskQVBjhz","Q6LixHfyNQ","29QAzuQIcz","Yw2oUhSSvQ","gIYvEjeskS","Yf2EcEdBKc",
+"5Drn0B3qem","07n1c618Di","tjQxsrKDLJ","SmGzvYh1hF","K20wKrKDLJ","VerEATCgPp","HRxd8lkMUA","s7MxkYjB9t","UmaEv9iGoT","djsrvjSjS3",
+"5iGN5uLtKs","7hyVvi7WMQ","GWqqXrhl0J","m4bxUpWiOs","fLNg88xEKz","5nmWvuJScX","AkKTk29QAz","JIqXiWDVWJ","lm0pDK4GS8","VNCPd1j5L8",
+"m4bxUJ2mQi","0YAGHx3LDe","Chuy35Drn0","OUYuFmX2GE","JKWYRLDk6f","yluBxOUYuF","QnJ1S45cIH","Y1mC0RpBQm","rz7UtpiJSk","16lHcWDVWJ",
+"JkzUn2TRI7","fcwDatlILt","CK5W7JXljW","zHF1qP6bcg","YjB9t29QAz","9XyT9M3zXL","7X3uyJ2mQi","FnPFBOUYuF","s4786piJSk","7Ow5CiKqhr",
+"7hyVvSjskQ","KsjRK5ZaEz","uoStw0ao3l","Q6hMCCfgr3","Dz1R3Zv7z0","faHiriwzGk","WDVWJgtCA5","MaJQsPOUYS","pFrrlpvgjS","vkCHHlm0pD",
+"v2eC3WPmlx","9GXkXOz8yZ","7Ow5CDG4sT","yluBxBpYhV","Uvlv4JkzUn","In3NS07n1c","FGzgp7lUXZ","xXTI4WmadA","K20wKSs0Zu","uupzkZJTXH",
+"nFqikUl4a1","guMb8FjHXR","a00b5LewvM","bgJAzazIWp","yofH3euZA5","Yf2EcQworu","GSQwjjeskS","DQimpeuZA5","Waim62DREs","pFrrlAgJHQ",
+"0BmCyQYxC0","FhtglNo0Qb","Z4I1vFLsph","fcJOyZ4I1v","d85a9KsjRK","CK5W75IhmG","JRJQBFNYIM","jzUqRhE1Ql","Chuy3BbwgA","tuDySKsjRK",
+"pT8wu8FmFH","nnP8oG1RhS","ZhwG1xXTI4","F6PT2S77LH","v2eC30MR5X","NcICAU3yw5","jzUqRFGzgp","64s8NRkQke","fFDrJ2ZHdk","Gv3FqPb1pa",
+"e6e4zlj07Q","AOgEeD6rBy","v8yFNiwzGk","dQ586uTacx","ZJTXH8xEKz","M3zXLJ2mQi","8TxD7fcwDa","J2mQi3weIF","NOHszbZLvS","uvf7AgIYvE",
+"dQ586s4786","a00b5xciqp","LewvMzFgtB","uQIcz2ZHdk","ZhwG1Dz1R3","WPmlxDG4sT","F6PT2bZLvS","GSQwjtAOsr","Waim6e6e4z","tuDySS77LH",
+"soy9tWMiS3","iqv4k6q6L9","qQxHPl83Ud","618DiZzJHW","taOXK8xEKz","JKWYRTXQ0Z","7X3uyBFkb8","JXljWKr8ys","5Mg9rP6bcg","Nxx9VGWqqX",
+"v1Hln5Drn0","uN6r32Nslm","oGu6xjtn0X","WmadA4QMc9","Mm8sidjsrv","BFkb8dQ586","pv0i7FVMxo","Ss0ZuogLgc","HzZT8bZLvS","OUqFMZhwG1",
+"x3LDeQWxoT","VerEApWiOs","lViBvUlU3M","TCgPpGSQwj","lj07QPYBf4","8hJdtEOE1o","mX2GEOUYuF","ZUnqtvOqCE","vkCHHYf2Ec","oVQp6Yf2Ec",
+"G1RhSogLgc","wDajXlpF6W","i7WMQZJTXH","CdyBV7X3uy","5IhmGh1zcH","5Mg9rlCMxy","2NslmdhSuH","L7cGcuN6r3","9y4lw6AFT0","CqqaDdjsrv",
+"nFqikaFFss","ReKEW7Ow5C","5Mg9rYjB9t","tlILtAXpwE","In3NSTwano","Oz8yZnFqik","uvf7AVerEA","JRJQB9XyT9","45cIHaFFss","y94nwOHaBz",
+"WreyP2hEEU","CIShGtvdkD","QClRL0YAGH","atef2n1pmO","n8pJ955rfB","pv0i7FGzgp","JkzUnyToGW","9eoRcpWiOs","Yh1hFjeskS","ksJby9GXkX",
+"ulk41oGu6x","pvgjSlXFOB","7ku1pEdBKc","mX2GE7lUXZ","Q6LixtuDyS","uPX7GFxX9q","B3qemFjHXR","MojnPSs0Zu","0KyfsP6bcg","zY1GYpiJSk",
+"e6e4zy94nw","yvOMIIn3NS","W3VFHTwano","1LB1LbgJAz","lpF6WblLA9","2hEEUTXQ0Z","jSjS3L7cGc","Vprf2GWqqX","fcJOyWreyP","Mkgy8v8yFN",
+"lpF6WgdQsS","AXpwEKZamH","D6rByMK07Y","ReKEWMm8si","mX2GE55rfB","pAhR15Drn0","SjskQogLgc","gtCA5soy9t","7hyVveuZA5","2TRI7IRh48",
+"HP433Twano","Zv7z0JRJQB","l83UdRkQke","hi5X71j5L8","TCgPpWaWsv","qaofNBbwgA","W3VFH3weIF","uvf7A8cVD3","RsQUqZzJHW","zbIYYzQt6Q",
+"FLsphQnJ1S","14FLRlCMxy","nFqikLbRTH","MaJQsRBhp0","OUqFMtAOsr","U3yw5v1Hln","v1Hlnh1zcH","piJSkBpYhV","jtn0XcShY2","euZA5WMiS3",
+"F6PT248cHL","guMb8LbRTH","HRxd8y94nw","I7p2aKZamH","prNT6POUYS","pmeCdi3pyd","Mm8siI7p2a","pmeCdPb1pa","e6e4z9y4lw","lweGyeuZA5",
+"XyPZNX6Pin","i7WMQ2Yz7E","lm0pDuPX7G","xciqpsoy9t","5Nammd7vjM","CdyBVksJby","mX2GEjeskS","RkQkeJJs5m","14FLR9rlg9","WMiS3QssNC",
+"CdyBV9eoRc","lCMxylCMxy","J2mQijS1aj","29QAzuvf7A","zz4ZUkZANm","nlaByv8yFN","AmdQdlweGy","XflUqv2eC3","zQt6Qgf8rI","m4bxUy94nw",
+"Zv7z0OUqFM","G1RhSiB08l","X6PinciuWz","nnP8olH1kt","Nxx9VFxX9q","UlU3M8FmFH","fmIK124ARF","S77LHS77LH","ECMvUlj07Q","QssNCcmXIX",
+"P6bcgHfyNQ","b29RJFPfSE","5iGN5wiHrZ","iqv4kB3qem","8hJdtVjCZq","zHF1qhe9IA","jS1ajWMiS3","QnJ1SvkCHH","i7WMQCK5W7","8cVD3Dz1R3",
+"1LB1L7Ow5C","B3qemTa8f6","soy9tSmGzv","bgJAz5drc6","oVQp60ao3l","ECMvU2ZHdk","8cVD30MR5X","9rlg9uJScX","uPX7G7ku1p","0KyfseuZA5",
+"rKDLJ48cHL","wiHrZzHF1q","d85a9xReec","Mm8sizY1GY","NAFuwOUYuF","Q6Lix8TxD7","Yf2EctvdkD","MmKGJcL0aE","qUJMdGrDg7","kZANmuTacx",
+"AgJHQJXljW","MezSWQClRL","Nxx9VPb1pa","QChxsGrDg7","9XyT95IhmG","Mkgy8yluBx","8cVD3he9IA","JJs5mxciqp","oVQp6zqH0W","StlDJgtCA5",
+"L7cGczmLYD","AmdQdqaofN","UmaEvSjskQ","prNT6L7cGc","s4786dmoS7","SbRYyuJScX","BCxeCEdBKc","8cVD3a00b5","JKWYRhUTw7","29QAzFLsph",
+"pvgjS6q6L9","euZA57Ow5C","jzUqRBCxeC","EOE1ofcwDa","uJScX9y4lw","Ul4a18RCUA","FnPFBrhl0J","mz8gx0h1b1","suY4x5IhmG","nFqikaL6AJ",
+"14FLRuTacx","3weIFZuDtD","0YAGHFwEJz","lH1kt8hJdt","JJs5mTCgPp","CIShGAgJHQ","2hEEUn8pJ9","a00b524ARF","WDVWJRpBQm","G1RhS29QAz",
+"azIWpFnPFB","jeskS8xEKz","IRh48Qworu","1LB1Li3pyd","RACujjfREu","GXdoHsuY4x","M3zXLtlILt","azIWppiJSk","HzZT8W3VFH","MmsIoXyPZN",
+"a00b5XflUq","CK5W7lpF6W","LbRTHfFDrJ","yofH3v8yFN","dhSuH8U2nU","ThjNn7hyVv","9GXkXYw2oU","ReKEWa00b5","oGu6xciuWz","x3LDe07n1c",
+"DLhzMCIShG","HlUbF5VZjS","okgRiKr8ys","Mm8sifFDrJ","Cfgr3e6e4z","faHirlsQGo","RxrsmUvlv4","8TxD7Yf2Ec","7lUXZSbRYy","tjQxscQOnv",
+"Uvlv4Vprf2","NOHsz2DREs","FPfSE1j5L8","QChxsLewvM","KASQ8QClRL","dmoS7yEfy9","nFqikVerEA","IBe8kbgJAz","l83UdpmeCd","07n1cFLsph",
+"uN6r3O3iyQ","W3VFHZJTXH","VjCZqpiJSk","FcWrWqUJMd","CxVEf8FmFH","lViBv5Mg9r","5ZaEzRkQke","iKqhr1j5L8","gtCA5zY1GY","7fKYULbRTH",
+"IjTwPRBhp0","9rlg9mz8gx","uTacxX6Pin","6q6L94dEz6","NhXdufaHir","8FmFHAXpwE","he9IAIjTwP","DQimpDcpWB","oVQp6MezSW","JIqXib29RJ",
+"QYxC0uLtKs","t98iWgf8rI","RACujNOHsz","iwzGkFNYIM","aDGtSSmGzv","JXljW0Wr5y","RACujaDGtS","n8pJ9Chuy3","ksJbys7Mxk","yEfy9AmdQd",
+"lweGyFcWrW","W3VFHNxx9V","hUTw7tjQxs","faHirbgJAz","D6rByCfgr3","lCMxy7hyVv","v8yFNLDk6f","hYBCKAIYUu","sx5GlS2Dfu","0MR5XYjB9t",
+"CIShG7fKYU","hYBCKzqH0W","tAOsrVBjhz","FnPFBcL0aE","WMiS3FcWrW","EdBKczmLYD","oVQp6fLNg8","dhSuH5ZaEz","StlDJJKWYR","CK5W79rlg9",
+"BFkb8jS1aj","KsjRKnlaBy","Oz8yZS77LH","07n1cFFDui","POUYSQYxC0","WmadARpBQm","W7cTs9eoRc","cShY25Namm","FPfSEXyPZN","yToGWjzUqR",
+"cShY2aez9y","0MR5XMK07Y","GrDg7IRh48","dmoS7IRh48","LDk6f6q6L9","64s8NFjHXR","v8yFNv1Hln","ydG8UThjNn","8cVD3StlDJ","Pb1pauTacx",
+"CK5W7dmoS7","OHaBzPOUYS","X6Pinni2v1","MK07YblLA9","QClRLpWiOs","MGlTFo8Uyd","blLA9kZANm","64s8N29QAz","vOqCEdQ586","lkMUApFrrl",
+"vOqCEU3yw5","I7p2a5drc6","oVQp6QYxC0","4W0TlCdyBV","48cHL7X3uy","uQIczEOE1o","FPfSEMojnP","IKxdLFwEJz","QWxoTCIShG","QYxC0RzaZA",
+"BCxeCgtCA5","uoStwFNYIM","JIqXiO3iyQ","6q6L9CK5W7","D6rByHRxd8","hi5X7KASQ8","ReKEWEOE1o","tvdkD8U2nU","AOgEemz8gx","07n1cbgJAz",
+"fFDrJGSQwj","zmLYD8cVD3","PYBf4XflUq","EOE1ohe9IA","k85AeJXljW","PYBf4AOgEe","HlUbFJKWYR","Vprf2VerEA","lCMxy5nmWv","EoToPWDVWJ",
+"gtCA5rKDLJ","CNHmvVLTy6","Pb1paCp3mZ","4W0TljiVBP","Q6LixbgJAz","faHirfmIK1","0Wr5yt98iW","Dz1R3UlU3M","VjCZqrz7Ut","yvOMIdpe1v",
+"NOHszFNYIM","8xEKzbgJAz","hi5X7FPfSE","hUTw7SjskQ","zHF1qzFgtB","9y4lwQworu","2Yz7EVIlwP","jtn0XG1RhS","bgJAzbrhlQ","SWfou2ZHdk",
+"IRh48soy9t","fLNg8StlDJ","No0Qb64s8N","Nxx9VCp3mZ","AIYUuogLgc","BbwgA16lHc","aL6AJFwEJz","8TxD7RkQke","7fKYUuPX7G","n8pJ9jSjS3",
+"FVMxoRxrsm","Gv3Fq9GXkX","RkQkelsQGo","RzaZA0MR5X","VerEA7fKYU","5ZaEzvOqCE","yluBxWreyP","4W0Tl7fKYU","djsrvmz8gx","gdQsSfcwDa",
+"LbRTHtl72W","SmGzvulk41","ZhwG1lH1kt","CIShGZuDtD","OUYuFMaJQs","CNHmvRkQke","rKDLJ5Mg9r","uLtKssx5Gl","zmLYDDz1R3","16lHczmLYD",
+"618DiLewvM","5NammhYBCK","QworubZLvS","FFDui8cVD3","nnP8o7hyVv","D6rBy8cVD3","U3yw5HfyNQ","9rlg9fFDrJ","9eoRc8xEKz","GSQwjX6Pin",
+"gIYvEdjsrv","Z4I1v14FLR","CIShGazIWp","O3iyQFFDui","a00b52Nslm","fqypyPOUYS","okgRiEdBKc","e6e4zyToGW","hi5X7U3yw5","djsrvhSSvQ",
+"Q6hMCuAWyp","fcJOyHfyNQ","1j5L8uvf7A","FNYIMAXpwE","zmLYDrKDLJ","9GXkXprNT6","piJSkNAFuw","uAWypa00b5","iwzGkuJScX","rKDLJTCgPp",
+"GrDg7Q6hMC","a00b5S2Dfu","fqypygIYvE","aDGtSt98iW","45cIHyluBx","6AFT0NOHsz","0Wr5y0h1b1","07n1c8RCUA","LDk6f8hJdt","3otm60YAGH",
+"Mkgy8aDGtS","FFDuiEoToP","5drc6KsjRK","I7p2a6AFT0","DQimpS77LH","Ta8f6s7Mxk","AIYUu8U2nU","StlDJC2Irc","ksJbyXyPZN","2NslmZUnqt",
+"BGaQYFVMxo","SbRYyMGlTF","D6rByDz1R3","FVMxoMaJQs","Y1mC0lH1kt","FPfSEpmeCd","Mm8siuQIcz","3otm6lj07Q","lH1ktOHaBz","EOE1oZUnqt",
+"pAhR1zqH0W","jtn0Xs7Mxk","YOfrYblLA9","gtCA5DLhzM","2TRI7rhl0J","GSQwjUmaEv","HRxd81j5L8","qUJMd5Namm","rz7UtUvlv4","UlU3Mhi5X7",
+"3weIFsqVrf","yvOMIn1pmO","Yw2oUhE1Ql","HRxd8pmeCd","gdQsSb29RJ","45cIHGrDg7","SjskQQssNC","16lHcpiJSk","Z4I1vStlDJ","SbRYytuDyS",
+"FcWrWfqypy","7hyVvDG4sT","P6bcgBFkb8","MezSWSbRYy","45cIHSs0Zu","taOXK45cIH","7ku1pDQimp","2hEEU5iGN5","29QAzulk41","vkCHHazIWp",
+"VNCPd580YD","m4bxUTXQ0Z","vOqCEksJby","VerEAKZamH","5Mg9ruJScX","MmsIoOz8yZ","8cVD3s4786","QClRLs4786","K20wK45cIH","4dEz6Kr8ys",
+"4W0TlRBhp0","X6PinUl4a1","8RCUAjS1aj","FxX9qyvOMI","lH1ktI7p2a","P6bcgBGaQY","oVQp6In3NS","v8yFN5Drn0","MmsIorz7Ut","XflUqEdBKc",
+"TwanoxReec","OUYuFuLtKs","qaofNlpF6W","Ta8f6tvdkD","QssNChYBCK","KsjRKKZamH","Yf2EciKqhr","In3NSlj07Q","aFFssl83Ud","Oz8yZFGzgp",
+"gjUTuDLhzM","6AFT0tl72W","h1zcHpiJSk","gdQsSSs0Zu","zbIYY8hJdt","uJScXU3yw5","n8pJ97ku1p","RzaZAHzZT8","GSQwjzmLYD","GXdoHUl4a1",
+"AgJHQmz8gx","jSjS3cmXIX","IjTwPTCgPp","cL0aEhe9IA","ulk41OxWIH","zmLYDSbRYy","he9IADcpWB","wiHrZhe9IA","MojnPciuWz","uPX7GoVQp6",
+"iwzGkWmadA","NOHszvOqCE","AXpwEI7p2a","zY1GY618Di","dpe1vgtCA5","8cVD31LB1L","2TRI70YAGH","gjUTutjQxs","RpBQmd85a9","EdBKcNo0Qb",
+"ZuDtDKASQ8","Cfgr3ulk41","JXljWCqqaD","aez9yStlDJ","X6PinogLgc","lXFOBJ2mQi","lj07QB3qem","yofH3OxWIH","RpBQmCNHmv","24ARFt98iW",
+"xXTI4MmsIo","BCxeCCqqaD","45cIHM6qcG","uLtKs9eoRc","CqqaD1j5L8","9rlg9jzUqR","9iGoTe6e4z","pWiOsVerEA","5IhmGWMiS3","SWfoumX2GE",
+"RACujAOgEe","DcpWBv8yFN","ksJbyZv7z0","mz8gxK20wK","oGu6xs4786","LewvM2TRI7","CqqaDJJs5m","K4GS8CqqaD","MezSW7Ow5C","uAWypNOHsz",
+"5IhmGUl4a1","pvgjSHzZT8","lsQGoS2Dfu","F6PT2he9IA","HRxd8POUYS","OUqFMW3VFH","hi5X764s8N","W7cTsuAWyp","F6PT29eoRc","OUYuFFhtgl",
+"EOE1osoy9t","SjskQsqVrf","Cp3mZguMb8","JIqXiQChxs","2hEEUjeskS","lViBvOHaBz","RBhp0S2Dfu","vOqCE2Yz7E","55rfBDcpWB","EdBKciKqhr",
+"TXQ0Zjtn0X","zHF1qC2Irc","TXQ0ZOUYuF","yEfy9cmXIX","MaJQsk85Ae","Zv7z0uTacx","ZUnqtHRxd8","zbIYYd85a9","hUTw714FLR","8U2nUS2Dfu",
+"uN6r3FFDui","lViBvVjCZq","HRxd8DLhzM","JkzUna00b5","d85a9GXdoH","v1HlnPOUYS","6AFT0WreyP","e6e4zMezSW","gIYvEh1zcH","RkQkeAmdQd",
+"gtCA5v2eC3","Kr8ysKsjRK","OUqFMl83Ud","2DREsJJs5m","n8pJ96q6L9","WmadAM3zXL","Pb1paMm8si","2NslmC2Irc","QbxXc55rfB","5nmWvsx5Gl",
+"hE1QlHP433","ni2v1dQ586","nnP8ozbIYY","M6qcGaDGtS","aFFssuN6r3","lViBvFcWrW","CdyBVHP433","W3VFHzbIYY","s93MlCdyBV","Uvlv4lweGy",
+"oGu6x2TRI7","Oz8yZuJScX","v8yFN2ZHdk","EoToPJIqXi","jfREuVjCZq","mX2GESWfou","pv0i73weIF","hi5X7vLsmS","uvf7Ani2v1","oQ87rX6Pin",
+"TXQ0ZAXpwE","ix74rMK07Y","0Kyfs0h1b1","6q6L9J2mQi","uN6r3gIYvE","suY4x0BmCy","5Mg9r64s8N","Kr8ysFFDui","RBhp0fmIK1","prNT6ZJTXH",
+"L7cGcIjTwP","jtn0XqQxHP","d85a9S2Dfu","vkCHHAgJHQ","BGaQYC2Irc","Fhtgl4W0Tl","hE1QluLtKs","OHaBzYOfrY","ksJbyaFFss","fmIK1JRJQB",
+"QbxXcHzZT8","07n1cuJScX","Q6hMCKr8ys","AOgEeb29RJ","vLsmSv2eC3","EdBKcy94nw","NcICAeuZA5","aDGtShi5X7","BCxeC0BmCy","Gv3FqVIlwP",
+"Yf2Ec5IhmG","KsjRKPYBf4","iqv4k9y4lw","hi5X7Cfgr3","NcICA0PktI","Waim6hE1Ql","Waim6RmDcr","NcICAWreyP","LewvMSWfou","Yh1hFpAhR1",
+"uQIczoQ87r","qQxHPhYBCK","EOE1oCK5W7","SjskQEdBKc","BpYhV24ARF","prNT6suY4x","1LB1L0Kyfs","CxVEf5Mg9r","OUqFMlm0pD","1j5L8gtCA5",
+"MGlTFRsQUq","s7Mxkt59lR","v1HlnQnJ1S","HRxd8m4bxU","1v5hHjfREu","WmadALDk6f","ZzJHWaL6AJ","7hyVv7X3uy","s93MldmoS7","RACuja00b5",
+"lH1ktCNHmv","i3pydWaim6","2Yz7E618Di","CqqaD64s8N","TCgPpmX2GE","W3VFHK20wK","RACuj5drc6","t98iWqUJMd","yToGWVBjhz","Ta8f6v1Hln",
+"uupzkiB08l","iqv4kzQt6Q","7X3uy5nmWv","29QAzECMvU","cmXIXyluBx","uvf7ASmGzv","3weIFpT8wu","KASQ8s4786","5Mg9r3otm6","8hJdti3pyd",
+"he9IASmGzv","xXTI45Drn0","VNCPdG1RhS","sx5GloVQp6","hSSvQvkCHH","CdyBVQYxC0","DG4sThE1Ql","S77LHFLsph","gjUTuMK07Y","1LB1L07n1c",
+"qaofNRmDcr","W3VFH8RCUA","brhlQCxVEf","rz7UtwDajX","AkKTkNOHsz","h1zcHuoStw","7hyVvv1Hln","HP433aDGtS","EdBKc29QAz","VLTy6GSQwj",
+"FVMxoMGlTF","JRJQB8cVD3","cQOnv9y4lw","hE1QlNAFuw","1v5hHRpBQm","jeskSv8yFN","5NammgjUTu","RsQUqVLTy6","EOE1odhSuH","lpF6WcQOnv",
+"ydG8U16lHc","uPX7GK20wK","tlILtWMiS3","Kr8ysogLgc","Ta8f6LbRTH","XyPZNiqv4k","Cfgr30PktI","oQ87r9GXkX","FNYIMMojnP","dmoS7zY1GY",
+"HRxd8Q6Lix","Yf2EcMezSW","soy9tNcICA","X6Pin0MR5X","NcICAoQ87r","tl72WOUYuF","FwEJzSWfou","jSjS3rz7Ut","piJSkCfgr3","MezSWyEfy9",
+"JKWYR0Wr5y","X6Pinuvf7A","ECMvU0h1b1","nnP8oVIlwP","GrDg7EdBKc","Q6hMCC2Irc","7hyVvNo0Qb","Y1mC0ix74r","WmadAoQ87r","7lUXZuupzk",
+"AmdQd3weIF","IBe8kuZPqg","ksJbyrhl0J","azIWpZ4I1v","yToGWM3zXL","In3NS5Drn0","fqypys4786","ciuWzaez9y","CxVEf1v5hH","5drc6lpF6W",
+"HlUbFvLsmS","guMb89y4lw","OHaBz0PktI","48cHLReKEW","L7cGczHF1q","8U2nUzHF1q","rhl0JuZPqg","CxVEfKASQ8","NOHsz16lHc","azIWpblLA9",
+"PYBf4F6PT2","BpYhVD6rBy","zz4ZU2Yz7E","FFDuipv0i7","gjUTugtCA5","9eoRcJJs5m","aDGtS8RCUA","lViBvTwano","SbRYydQ586","yofH3qaofN",
+"lCMxy1j5L8","IKxdLMm8si","HzZT8HfyNQ","pAhR1uLtKs","K4GS8IjTwP","oQ87r1v5hH","2NslmChuy3","jS1ajmX2GE","pT8wubZLvS","8hJdtW7cTs",
+"Q6Lixtl72W","0KyfszHF1q","8xEKzfaHir","uAWyp7lUXZ","uPX7GWMiS3","7ku1pPb1pa","zQt6QoGu6x","EdBKcjfREu","JRJQB0h1b1","FcWrWRpBQm",
+"QssNCMm8si","7X3uytaOXK","hUTw7P6bcg","LbRTHB3qem","2ZHdklH1kt","RpBQmRmDcr","7fKYUfqypy","ksJby16lHc","hYBCKIRh48","oVQp6GSQwj",
+"jiVBP0YAGH","2NslmMezSW","OUYuFru4UG","QChxsKASQ8","8hJdty94nw","LDk6f0ao3l","s93MlVNCPd","zqH0Wmz8gx","uZPqgRACuj","OUqFMX6Pin",
+"v8yFNtuDyS","ksJbydmoS7","QbxXcTCgPp","45cIHk85Ae","MmKGJFNYIM","dQ586WMiS3","soy9tLDk6f","faHirQClRL","FcWrWCxVEf","dpe1vRACuj",
+"LbRTHQssNC","qUJMdnnP8o","Vprf2EdBKc","0PktIqaofN","5drc60BmCy","0PktILbRTH","FjHXRprNT6","rz7UtFFDui","7Ow5CeuZA5","m4bxUlXFOB",
+"Yh1hFuTacx","RACujCIShG","hi5X714FLR","L7cGcVIlwP","ni2v14W0Tl","M3zXLJkzUn","JRJQB64s8N","ix74r4dEz6","HRxd8Z4I1v","i7WMQfcwDa",
+"QYxC0RmDcr","FcWrWpv0i7","48cHLCdyBV","fLNg8FNYIM","QbxXcbZLvS","9y4lw07n1c","S77LHJKWYR","GSQwjjSjS3","YOfrYs7Mxk","RxrsmTwano",
+"GSQwjP6bcg","rhl0JgtCA5","8FmFHyEfy9","prNT68FmFH","UmaEvStlDJ","9XyT9tl72W","Q6LixpmeCd","24ARFBCxeC","ThjNnQClRL","JKWYRgf8rI",
+"XflUqa00b5","zY1GYtvdkD","8FmFHNo0Qb","kB5nPKr8ys","M3zXLZzJHW","pmeCdydG8U","VNCPdF6PT2","s7MxkVIlwP","jeskSYOfrY","pmeCdMm8si",
+"uZPqgUlU3M","MmsIoQWxoT","bZLvS6q6L9","HlUbF2TRI7","NcICAm4bxU","rz7UtRpBQm","uQIczBFkb8","WDVWJuupzk","jS1ajlpF6W","YOfrY55rfB",
+"9iGoTlCMxy","2Yz7EZuDtD","vkCHHnnP8o","StlDJFNYIM","RmDcrM6qcG","IjTwPzbIYY","e6e4z8cVD3","2ZHdkoVQp6","No0QbM6qcG","ydG8UCIShG",
+"2NslmVBjhz","07n1cprNT6","9eoRcQbxXc","GWqqXFVMxo","9GXkXfqypy","FxX9qHfyNQ","JkzUnsuY4x","fFDrJhYBCK","zmLYDnFqik","0Wr5yFjHXR",
+"mz8gxFjHXR","CNHmvx3LDe","9iGoTDG4sT","ZhwG1Gv3Fq","MojnP8TxD7","EdBKcjeskS","0MR5XXyPZN","KZamHHzZT8","KsjRKMK07Y","atef27hyVv",
+"O3iyQW3VFH","5iGN5Twano","JRJQBoQ87r","d85a99XyT9","fcJOy4dEz6","BGaQYY1mC0","29QAzdhSuH","7lUXZFcWrW","FnPFBzQt6Q","FGzgpRsQUq",
+"DcpWByofH3","DQimpQworu","YjB9tvkCHH","yluBxuN6r3","piJSkW7cTs","W3VFHRkQke","5VZjSt59lR","Zv7z0SjskQ","55rfBMm8si","uTacxYw2oU",
+"8xEKzSjskQ","No0Qb2ZHdk","FGzgpXyPZN","4QMc9he9IA","v8yFNs93Ml","tuDySGrDg7","JIqXiY1mC0","e6e4zhSSvQ","lweGyS2Dfu","wDajX2Yz7E",
+"d7vjMsuY4x","jS1ajCqqaD","cQOnvt59lR","WmadA14FLR","zY1GYWMiS3","qQxHPUlU3M","e6e4zQYxC0","OHaBzzmLYD","faHirzqH0W","jzUqRk85Ae",
+"fqypyLDk6f","JRJQBgdQsS","HfyNQjfREu","HRxd8s7Mxk","AmdQd9rlg9","5iGN5ogLgc","LbRTHIKxdL","yEfy9suY4x","U3yw5G1RhS","pWiOs0Kyfs",
+"fmIK16AFT0","nFqikDLhzM","guMb8Ss0Zu","mX2GEguMb8","JkzUnHlUbF","Rxrsm0Kyfs","uLtKspvgjS","FLsphtvdkD","JJs5mAmdQd","2hEEUWaWsv",
+"Oz8yZWPmlx","pT8wuydG8U","RxrsmXflUq","zQt6QWaim6","4QMc9lCMxy","WaWsvK4GS8","piJSk2TRI7","LDk6fgtCA5","rz7UtvkCHH","QnJ1Ss93Ml",
+"Ta8f6SmGzv","QWxoTvLsmS","tlILtpvgjS","2DREsJRJQB","Zv7z0MK07Y","FNYIMyvOMI","FPfSEs93Ml","lpF6WJkzUn","rhl0JOUqFM","X6PinPb1pa",
+"2hEEUP6bcg","EdBKcJJs5m","1v5hH2TRI7","WmadAdpe1v","5ZaEzGv3Fq","0Kyfsru4UG","0Wr5yHzZT8","vkCHHTwano","lj07Q0Kyfs","Uvlv4zqH0W",
+"jiVBPVIlwP","HzZT8Pb1pa","NAFuwjSjS3","14FLRM3zXL","SmGzviB08l","jS1ajlsQGo","7fsYMVNCPd","cQOnvY1mC0","580YDn8pJ9","tvdkDciuWz",
+"EdBKchUTw7","MmKGJKZamH","dmoS70h1b1","WreyPs93Ml","aez9yvLsmS","OUYuFFPfSE","ZUnqt2DREs","JXljWHP433","d7vjMK4GS8","7hyVvSWfou",
+"t59lR8FmFH","hi5X7CIShG","BCxeCBGaQY","HRxd8atef2","Zv7z0lViBv","1j5L8pvgjS","uZPqg1v5hH","Uvlv4IBe8k","zFgtBdpe1v","tl72WNxx9V",
+"lsQGodjsrv","Chuy3GWqqX","KsjRKHfyNQ","JKWYRcQOnv","zqH0WBbwgA","rz7UtqaofN","JRJQBrhl0J","Qworu29QAz","SjskQCNHmv","U3yw5v8yFN",
+"8TxD7BGaQY","CxVEfC2Irc","4dEz6blLA9","mz8gxTa8f6","azIWpVLTy6","8xEKzuvf7A","0h1b1gtCA5","uPX7GTa8f6","Fhtgl64s8N","SbRYyCxVEf",
+"9eoRcCxVEf","VerEAaDGtS","CxVEfWPmlx","K4GS8Uvlv4","tuDyStlILt","Nxx9VlsQGo","XyPZN7hyVv","SmGzvCdyBV","5Drn0WPmlx","0Wr5y8RCUA",
+"QnJ1SF6PT2","aL6AJru4UG","dhSuHM6qcG","cmXIXblLA9","piJSkiB08l","IRh48Q6hMC","kB5nPMojnP","qaofNSjskQ","tl72WydG8U","oGu6x5ZaEz",
+"HP433aL6AJ","aDGtSpiJSk","aFFssY1mC0","NcICAix74r","ulk41hE1Ql","dhSuHZ4I1v","pT8wujSjS3","xXTI4W7cTs","ThjNnVBjhz","oVQp60BmCy",
+"5NammvOqCE","guMb8LDk6f","JIqXiQWxoT","0Wr5yatef2","tvdkDvLsmS","wDajX7Ow5C","okgRigdQsS","MmKGJ45cIH","D6rByprNT6","DQimpgjUTu",
+"pWiOsbrhlQ","i7WMQP6bcg","M6qcGC2Irc","tl72Wi7WMQ","aez9ytaOXK","2Yz7EkZANm","JIqXiK4GS8","yToGWi7WMQ","GWqqXD6rBy","Q6LixNOHsz",
+"BpYhVP6bcg","zY1GYwiHrZ","2hEEUVjCZq","yEfy9Waim6","ECMvU0BmCy","djsrvtuDyS","GSQwjn8pJ9","lXFOBHP433","Chuy3rKDLJ","NcICA8FmFH",
+"azIWpF6PT2","5Drn0NOHsz","24ARF0Wr5y","KsjRKuPX7G","faHirDQimp","b29RJjSjS3","8TxD7KZamH","0YAGHW3VFH","TCgPpFcWrW","fcwDannP8o",
+"Yf2EcZhwG1","pmeCdIjTwP","3otm6VjCZq","QnJ1SpFrrl","brhlQK20wK","FwEJzS77LH","X6Pin7Ow5C","tuDySRpBQm","MK07YThjNn","LDk6fPb1pa",
+"5Drn05nmWv","CNHmvguMb8","VIlwPSWfou","ThjNnBpYhV","cQOnvWPmlx","i7WMQjtn0X","P6bcgEdBKc","okgRilm0pD","DQimpCfgr3","aez9yVLTy6",
+"RsQUqgIYvE","yofH3ZuDtD","FwEJzFhtgl","rhl0JiwzGk","hUTw7l83Ud","16lHc4dEz6","I7p2as93Ml","5Mg9rY1mC0","2Nslmt98iW","KsjRKblLA9",
+"FcWrW2TRI7","K4GS85drc6","fqypyhUTw7","KZamHuAWyp","Y1mC0kB5nP","6AFT0JKWYR","FwEJzdQ586","J2mQipFrrl","DQimpPb1pa","guMb8FPfSE",
+"Rxrsmmz8gx","0MR5X1v5hH","pvgjScShY2","MmKGJru4UG","0BmCyAXpwE","brhlQpmeCd","lXFOBNOHsz","GXdoHlm0pD","fcJOylm0pD","0h1b1rhl0J",
+"64s8NTa8f6","yvOMIuvf7A","i3pydRkQke","fmIK10YAGH","SWfouTXQ0Z","BGaQY64s8N","iqv4k0BmCy","5nmWvuQIcz","W3VFHL7cGc","uTacxS77LH",
+"F6PT2JJs5m","he9IAIn3NS","cL0aEiKqhr","v1HlnNxx9V","WPmlxAmdQd","yEfy9SbRYy","xciqpAIYUu","lH1ktWmadA","Ta8f6AOgEe","AIYUuVIlwP",
+"Ta8f6QbxXc","Ss0ZuUl4a1","WmadA9y4lw","WreyPVjCZq","5nmWvtlILt","3weIF5Drn0","cmXIX0h1b1","fFDrJ0ao3l","RmDcrhSSvQ","X6PinNo0Qb",
+"taOXKS2Dfu","Q6hMCyEfy9","SWfouUmaEv","Q6hMCtlILt","WaWsv3otm6","aDGtSAIYUu","XflUq5Drn0","8xEKz0BmCy","64s8NlH1kt","7hyVvni2v1",
+"9y4lw7fKYU","suY4xXflUq","uoStwTwano","16lHcpvgjS","SbRYyDLhzM","5Mg9rAXpwE","iwzGk5ZaEz","yToGWB3qem","0BmCyoQ87r","lweGygIYvE",
+"d7vjMjtn0X","TCgPpiKqhr","B3qemzmLYD","5iGN514FLR","7fKYUaL6AJ","kB5nP5Mg9r","EoToPVerEA","CK5W7zFgtB","PYBf4S77LH","AIYUut98iW",
+"0BmCyVLTy6","k85Aeni2v1","jiVBPulk41","D6rBy5drc6","CqqaDBbwgA","No0QbfFDrJ","Cfgr3Y1mC0","uLtKskZANm","fqypytaOXK","S2DfuDLhzM",
+"CK5W72ZHdk","QWxoTjS1aj","RxrsmjiVBP","8RCUA7hyVv","he9IAtAOsr","Waim645cIH","IRh48fmIK1","No0QbpWiOs","CqqaDguMb8","uN6r3ThjNn",
+"taOXKgf8rI","fFDrJ8hJdt","h1zcHsuY4x","gdQsSVBjhz","0ao3lix74r","YOfrYlXFOB","euZA5BpYhV","9GXkX8TxD7","CqqaDGXdoH","tuDyS9GXkX",
+"a00b514FLR","Qworun1pmO","pv0i75IhmG","nlaByru4UG","blLA9CqqaD","xciqpCK5W7","WPmlx1LB1L","UmaEvvLsmS","WreyPVIlwP","gf8rIRsQUq",
+"0PktIgtCA5","48cHLAmdQd","AkKTkS2Dfu","KASQ8ZUnqt","6AFT09GXkX","hUTw7t98iW","guMb82DREs","LDk6fCxVEf","sqVrfUmaEv","LbRTHru4UG",
+"WDVWJGXdoH","WaWsvRmDcr","WMiS3hSSvQ","Uvlv4oQ87r","iB08lGSQwj","Q6LixlH1kt","dmoS7jtn0X","y94nwECMvU","zHF1quTacx","29QAzlpF6W",
+"618DiFjHXR","5Drn0CdyBV","MmKGJAgJHQ","MmsIox3LDe","BFkb8TXQ0Z","7ku1pCIShG","jzUqR7lUXZ","ix74rPOUYS","cShY2FxX9q","48cHLl83Ud",
+"s7MxkbZLvS","F6PT2bgJAz","5drc607n1c","FwEJzzY1GY","Pb1pa7hyVv","07n1cOxWIH","b29RJfFDrJ","P6bcgX6Pin","MojnPlH1kt","W7cTsVBjhz",
+"RxrsmDz1R3","Nxx9VfaHir","HfyNQcShY2","ECMvUVprf2","lsQGobrhlQ","pvgjSdhSuH","fcJOyuZPqg","Z4I1vsuY4x","pT8wuUmaEv","djsrvo8Uyd",
+"Y1mC0Mkgy8","AkKTkFwEJz","ZUnqtVerEA","WreyPAIYUu","5Drn0L7cGc","B3qemfaHir","qQxHPC2Irc","JKWYRlCMxy","9iGoTEdBKc","mz8gxHzZT8",
+"taOXKMezSW","XflUqVjCZq","fcwDaBbwgA","dmoS7a00b5","faHir2Nslm","mX2GEW7cTs","NAFuwO3iyQ","hYBCKRzaZA","lsQGookgRi","ZhwG1GSQwj",
+"X6Pin24ARF","I7p2aPOUYS","RzaZAI7p2a","FVMxohE1Ql","Z4I1vYh1hF","iB08lkZANm","POUYS7hyVv","sqVrfcL0aE","HzZT80h1b1","jtn0XRBhp0",
+"yluBxVjCZq","wiHrZVIlwP","JKWYRY1mC0","No0QbJkzUn","fqypyU3yw5","v2eC38FmFH","zY1GYrz7Ut","okgRid85a9","DLhzMpmeCd","GWqqXoQ87r",
+"ThjNnyToGW","uvf7AxReec","Chuy3FVMxo","StlDJv8yFN","euZA5S77LH","gdQsSNxx9V","WreyPOUYuF","zbIYY2ZHdk","Ul4a1GWqqX","pmeCd48cHL",
+"VNCPdogLgc","aez9yEoToP","5iGN5Vprf2","5ZaEzuN6r3","aDGtSyvOMI","OHaBzUlU3M","FGzgpW3VFH","fcwDaiwzGk","i7WMQAOgEe","i7WMQGrDg7",
+"d7vjMRkQke","9rlg99iGoT","v8yFN4dEz6","Rxrsm9GXkX","uZPqg4W0Tl","CdyBVqQxHP","AkKTkfcJOy","1LB1LPYBf4","dQ586e6e4z","yToGWS77LH",
+"4dEz60Wr5y","pT8wu8U2nU","MojnPs7Mxk","9iGoT5IhmG","Twanopv0i7","IjTwPCqqaD","FjHXRpWiOs","9GXkXCK5W7","AOgEeuJScX","QssNCNo0Qb",
+"fcwDaCp3mZ","ydG8UyToGW","fcwDaCxVEf","VIlwPNo0Qb","SWfouTCgPp","RzaZAdmoS7","1LB1LjeskS","sx5GlBGaQY","zHF1q7Ow5C","yofH345cIH",
+"ogLgci7WMQ","ECMvU9eoRc","QWxoT2Nslm","AXpwELbRTH","AkKTklCMxy","WMiS3nlaBy","vOqCEpv0i7","8hJdtVerEA","lXFOBpFrrl","G1RhSlm0pD",
+"DQimpTwano","i3pyd8FmFH","IBe8kuupzk","mz8gxQnJ1S","hYBCKuTacx","vkCHHydG8U","8TxD72hEEU","s4786QssNC","Yf2Ecru4UG","AkKTkzmLYD",
+"SjskQCK5W7","DQimpzmLYD","Ul4a1tjQxs","RsQUqVBjhz","WaWsvMkgy8","0BmCylpF6W","atef27lUXZ","WMiS3FnPFB","GXdoHjeskS","WMiS3yToGW",
+"VjCZq0ao3l","4W0Tl5drc6","2TRI7M6qcG","hUTw7Waim6","RsQUqLewvM","YjB9tQssNC","JJs5m7fKYU","TCgPpMkgy8","X6Pin5Namm","XflUqru4UG",
+"zFgtBW3VFH","yluBxdpe1v","MezSWgIYvE","48cHLeuZA5","CK5W7uupzk","cQOnvs4786","Gv3FqHlUbF","tlILtIBe8k","QssNCHP433","dmoS7gIYvE",
+"MojnP9rlg9","HzZT8Mkgy8","Yf2EcwiHrZ","cQOnvCK5W7","tAOsrWreyP","In3NSqUJMd","ciuWzzFgtB","tlILtL7cGc","vOqCEfcwDa","In3NSJXljW",
+"LDk6f0Wr5y","mX2GEd7vjM","5IhmGAXpwE","5Mg9r8cVD3","m4bxUix74r","TwanoaFFss","FVMxos7Mxk","dpe1v0ao3l","MojnPgdQsS","jiVBPDz1R3",
+"NcICACK5W7","mX2GE07n1c","8RCUAdQ586","IRh48s4786","5drc6DG4sT","nnP8ozz4ZU","FGzgpWreyP","jeskSpmeCd","mX2GEX6Pin","bZLvSCK5W7",
+"xReecni2v1","s93MlPb1pa","29QAzOUYuF","MmsIonlaBy","Fhtgl5nmWv","lViBvU3yw5","KsjRKbZLvS","iqv4kxciqp","uupzkdQ586","SjskQpFrrl",
+"BCxeC07n1c","zqH0W8hJdt","LbRTH618Di","qaofNIRh48","s47864W0Tl","azIWpHP433","x3LDem4bxU","BGaQY16lHc","7hyVvFNYIM","uAWypUvlv4",
+"BCxeCt59lR","ciuWzyofH3","fLNg8soy9t","ReKEWaL6AJ","zqH0WQworu","uN6r3d85a9","lweGy9iGoT","xReecUlU3M","JXljWjfREu","zbIYYHfyNQ",
+"dhSuHkB5nP","QworuStlDJ","fcwDawDajX","b29RJoQ87r","kB5nPHlUbF","hSSvQcL0aE","Pb1pagf8rI","7fKYUlH1kt","n8pJ9P6bcg","SjskQaFFss",
+"MezSWFxX9q","wDajX8U2nU","QnJ1StjQxs","hUTw7iB08l","CqqaDM6qcG","XflUqbgJAz","zbIYYUl4a1","IKxdLrKDLJ","KsjRKYw2oU","HzZT8Uvlv4",
+"tl72WBCxeC","Fhtgl8U2nU","64s8NL7cGc","TwanouoStw","gdQsSokgRi","8FmFHZhwG1","8hJdt8TxD7","zQt6QxReec","FjHXRVBjhz","OUYuFyEfy9",
+"AIYUu7hyVv","KASQ8zFgtB","HfyNQb29RJ","ZhwG1yofH3","4W0Tl5Drn0","azIWps4786","FFDui6q6L9","MmsIo14FLR","hi5X7jS1aj","jS1aj8U2nU",
+"m4bxUprNT6","d85a9JXljW","Cfgr3wiHrZ","CIShGFnPFB","45cIHRmDcr","IRh486AFT0","zbIYYAXpwE","64s8NwDajX","ZuDtDuZPqg","i3pyd4dEz6",
+"6AFT0ZuDtD","s4786VBjhz","0BmCy0BmCy","uoStwiKqhr","AOgEeCdyBV","dmoS7zHF1q","t98iWpvgjS","aFFsstaOXK","EdBKcBGaQY","Q6Lix1v5hH",
+"5iGN5soy9t","LbRTHcmXIX","7lUXZ7lUXZ","uvf7AAIYUu","Dz1R3hYBCK","cL0aE6AFT0","ksJbyTCgPp","UmaEvxXTI4","AXpwEokgRi","dQ586DQimp",
+"RBhp0HP433","piJSkMGlTF","Uvlv4SWfou","MmKGJVBjhz","guMb824ARF","0KyfsxReec","KASQ8oVQp6","8hJdtfcwDa","euZA5FNYIM","JRJQBPOUYS",
+"29QAzZUnqt","lkMUAi7WMQ","JJs5mjfREu","tuDySG1RhS","gjUTuMaJQs","FwEJz9iGoT","1LB1LbZLvS","Dz1R3GSQwj","sx5GlStlDJ","W7cTsChuy3",
+"CqqaDjS1aj","OxWIHAOgEe","n8pJ9hi5X7","WreyPs7Mxk","blLA9JRJQB","l83UdVerEA","zHF1qVBjhz","Zv7z0vLsmS","XyPZNKASQ8","Cp3mZJkzUn",
+"jzUqRXyPZN","pAhR1jzUqR","uQIczzqH0W","Qworu64s8N","KZamHDQimp","ReKEWFNYIM","VerEAzqH0W","7Ow5CZ4I1v","FVMxoW3VFH","CNHmvDcpWB",
+"v1HlngdQsS","Ul4a1fLNg8","azIWpMkgy8","xXTI48xEKz","ZJTXHJKWYR","v1HlnLDk6f","U3yw5DLhzM","WmadAWPmlx","lViBvFFDui","fqypyDQimp",
+"OHaBzcQOnv","8xEKzMojnP","EoToPhSSvQ","07n1cRzaZA","iB08lyvOMI","FGzgpKZamH","45cIHwiHrZ","9iGoTZJTXH","3otm6QssNC","D6rBypiJSk",
+"TCgPp2TRI7","gdQsS64s8N","hSSvQSjskQ","d7vjMKr8ys","Ta8f6P6bcg","JkzUnaFFss","zHF1qCdyBV","gIYvEGv3Fq","piJSkL7cGc","ZuDtDlXFOB",
+"GrDg7zHF1q","3weIFWmadA","MmKGJqUJMd","CqqaD6q6L9","pWiOsgf8rI","SjskQb29RJ","Z4I1vL7cGc","64s8NRxrsm","AkKTkEOE1o","FcWrWNo0Qb",
+"LDk6f48cHL","okgRidmoS7","FxX9q2DREs","5Drn0OUYuF","a00b5FwEJz","S2DfupWiOs","In3NSY1mC0","M3zXLrz7Ut","pFrrlB3qem","NAFuw2DREs",
+"sx5Gl9y4lw","yToGW7ku1p","RACujHlUbF","QClRL9GXkX","QYxC0XflUq","vLsmSS77LH","S2Dfu1v5hH","brhlQnFqik","Dz1R33weIF","zmLYDtuDyS",
+"yvOMI5Namm","blLA9y94nw","AIYUuxReec","BFkb8AmdQd","9y4lwSbRYy","0PktIUvlv4","qUJMdd85a9","tl72W7lUXZ","0PktIOUYuF","45cIHhE1Ql",
+"fFDrJL7cGc","3weIFoQ87r","zY1GYtl72W","ThjNn45cIH","kZANm3weIF","3weIFwiHrZ","RACujRzaZA","WmadAYh1hF","MmKGJM3zXL","HzZT8RzaZA",
+"ZzJHW07n1c","n8pJ9yluBx","GWqqXPOUYS","mz8gxdjsrv","nlaBynlaBy","RpBQmbZLvS","Waim6MmKGJ","K20wKQ6Lix","2ZHdkJIqXi","8RCUAHP433",
+"HlUbFgf8rI","Ul4a1nnP8o","EOE1oPOUYS","gIYvEPYBf4","uJScXpWiOs","NhXdueuZA5","pFrrlHRxd8","nlaBy4dEz6","FnPFB2DREs","v8yFNix74r",
+"rz7UtMmKGJ","5iGN5RkQke","k85AeF6PT2","v8yFNd7vjM","wiHrZL7cGc","zbIYYiqv4k","zQt6QpFrrl","8RCUAprNT6","cmXIX6AFT0","pv0i7jSjS3",
+"AgJHQaDGtS","NAFuw0YAGH","zQt6Qsx5Gl","Yh1hFRsQUq","piJSk4QMc9","DLhzMzHF1q","atef2GSQwj","B3qemjzUqR","2DREsLDk6f","U3yw5lm0pD",
+"NcICAMkgy8","prNT6QnJ1S","OUqFMM6qcG","C2Ircgf8rI","OUqFMFNYIM","dhSuHWDVWJ","5drc6dQ586","nlaByaez9y","blLA9aFFss","QbxXc9iGoT",
+"y94nwNcICA","RpBQmJKWYR","CIShG07n1c","2TRI7s7Mxk","2TRI7EoToP","kZANmHzZT8","UmaEvWPmlx","vLsmSS2Dfu","W3VFHQworu","5Mg9ryEfy9",
+"9eoRczz4ZU","MK07YJXljW","5IhmGRpBQm","aFFssDLhzM","qaofNCxVEf","2ZHdkblLA9","7fsYMMkgy8","oGu6xIjTwP","blLA9HP433","MojnPa00b5",
+"pWiOsvkCHH","0KyfsFFDui","lViBvRkQke","618DifcwDa","xXTI4ciuWz","WDVWJSmGzv","VNCPdpiJSk","L7cGc9GXkX","Q6hMCHlUbF","0MR5XBGaQY",
+"ulk41dpe1v","HlUbFRzaZA","JkzUnlm0pD","tuDySLewvM","Pb1patlILt","hUTw7rhl0J","b29RJZJTXH","ECMvUCqqaD","lCMxyrhl0J","FnPFBhSSvQ",
+"JXljWtlILt","8TxD7MmKGJ","lXFOB5VZjS","RzaZAAkKTk","PYBf4J2mQi","9y4lwa00b5","mX2GEgIYvE","djsrvRxrsm","RmDcrEdBKc","Chuy3L7cGc",
+"6q6L9S77LH","SWfouK20wK","HlUbFtuDyS","CIShGuJScX","fqypysoy9t","dQ586SWfou","yluBxSbRYy","Q6Lixhi5X7","5NammFhtgl","uTacxWPmlx",
+"W3VFHIjTwP","UlU3MFNYIM","2hEEUkZANm","AOgEeyluBx","IKxdLuPX7G","t59lROz8yZ","JRJQBcQOnv","FVMxogf8rI","bgJAz5nmWv","zbIYYYjB9t",
+"GXdoH24ARF","7X3uyOxWIH","Q6hMCbZLvS","CK5W7s7Mxk","0YAGHFVMxo","KASQ8d7vjM","1LB1LuLtKs","MaJQs5nmWv","Z4I1v0BmCy","FGzgpdmoS7",
+"zbIYYm4bxU","HP4337hyVv","BCxeCWaWsv","EdBKcRBhp0","M3zXLrKDLJ","EdBKcd7vjM","M6qcGB3qem","Z4I1v55rfB","CxVEfDG4sT","suY4x1LB1L",
+"l83Ud48cHL","azIWpjSjS3","guMb8i3pyd","2hEEUCxVEf","dhSuHhe9IA","HlUbFO3iyQ","qQxHP8TxD7","lXFOBzFgtB","G1RhSFFDui","tAOsrh1zcH",
+"2hEEUs4786","WMiS3rhl0J","VLTy68TxD7","vOqCEVjCZq","GWqqXFGzgp","soy9tAXpwE","qaofNtl72W","lj07Qd85a9","x3LDes4786","ZUnqtNcICA",
+"0YAGHjiVBP","tuDySUl4a1","5Mg9rAIYUu","DQimp8xEKz","i3pydh1zcH","fFDrJAXpwE","h1zcHdjsrv","5Drn0uoStw","jtn0XZUnqt","iB08l0YAGH",
+"S2DfuPOUYS","tjQxsiwzGk","guMb8uQIcz","cmXIXazIWp","sqVrfi3pyd","NOHszx3LDe","hUTw7W3VFH","QClRLHP433","t98iWIn3NS","CNHmvJIqXi",
+"VLTy6uupzk","MojnPUl4a1","HzZT8fFDrJ","yluBxgdQsS","EdBKcuvf7A","QChxsyToGW","NOHsz0Wr5y","yluBxQYxC0","I7p2aZJTXH","0YAGHFnPFB",
+"zHF1qSs0Zu","pFrrl0ao3l","YjB9tCqqaD","D6rBye6e4z","CIShGpvgjS","cmXIXVBjhz","580YDrhl0J","d85a9FVMxo","ReKEWk85Ae","RxrsmfcwDa",
+"RmDcrWMiS3","cmXIX2Yz7E","fqypyuAWyp","MojnPfcJOy","FwEJzMGlTF","aez9yatef2","SjskQL7cGc","QYxC0bZLvS","taOXKazIWp","5Mg9rTa8f6",
+"e6e4zYOfrY","kZANmFGzgp","ydG8URsQUq","lH1ktiB08l","lCMxyuAWyp","soy9t3otm6","7Ow5CblLA9","soy9t2hEEU","1v5hHQChxs","gf8rIkZANm",
+"gf8rI7fsYM","F6PT2JIqXi","2Nslmhe9IA","ix74rKsjRK","jeskSk85Ae","Q6hMCtvdkD","FxX9qtjQxs","QChxsQssNC","TXQ0ZTwano","pv0i7NOHsz",
+"tvdkDZzJHW","azIWpxXTI4","CxVEfBCxeC","yEfy9RpBQm","b29RJjzUqR","brhlQpWiOs","pAhR15nmWv","8cVD3EOE1o","G1RhSWaWsv","uupzkMmKGJ",
+"VLTy6BbwgA","24ARFPOUYS","IKxdLtlILt","QWxoT7lUXZ","ix74rVBjhz","FFDuie6e4z","ReKEWD6rBy","2hEEUPb1pa","StlDJNAFuw","WMiS3zFgtB",
+"ru4UGmX2GE","CNHmvlpF6W","FwEJzuupzk","cmXIXNcICA","RxrsmFxX9q","WMiS3vkCHH","JIqXilkMUA","xXTI4okgRi","nFqikgIYvE","0Wr5yfFDrJ",
+"8xEKzChuy3","BbwgAsoy9t","s7MxkK20wK","9XyT9ZhwG1","AkKTkQWxoT","9GXkX5Namm","RACuj6q6L9","NAFuwMaJQs","ReKEWMmKGJ","2TRI7O3iyQ",
+"5iGN5RzaZA","No0QbdmoS7","BbwgA0h1b1","yofH3yEfy9","07n1czqH0W","64s8NRzaZA","iwzGkguMb8","IBe8kKZamH","gdQsSQnJ1S","3otm6ZhwG1",
+"7fKYUVerEA","QbxXcaFFss","QWxoTEoToP","d7vjMC2Irc","Yf2EcksJby","YOfrYJkzUn","uupzk0PktI","MojnPBGaQY","kB5nPUmaEv","1v5hHbgJAz",
+"5nmWvnlaBy","lweGy0Wr5y","ReKEWS2Dfu","zqH0WhE1Ql","5drc6MK07Y","ZJTXHn1pmO","v1Hlnuupzk","mz8gxQYxC0","AgJHQ9GXkX","fLNg8aez9y",
+"kB5nPqUJMd","dmoS7Fhtgl","vkCHHAIYUu","Waim6RkQke","2DREsM6qcG","G1RhSAgJHQ","dpe1vuTacx","FVMxosoy9t","ogLgc8cVD3","Twano2Nslm",
+"fmIK1I7p2a","5Mg9rkB5nP","In3NS7Ow5C","CdyBVyvOMI","soy9tHP433","U3yw5l83Ud","v8yFN64s8N","0Wr5yIjTwP","48cHLuPX7G","OHaBzZuDtD",
+"NOHszmz8gx","brhlQ8FmFH","W3VFHdpe1v","KsjRK4dEz6","yluBxyluBx","ZJTXHokgRi","DcpWB2DREs","mz8gxgf8rI","Yf2EcJkzUn","mX2GEt98iW",
+"b29RJJkzUn","t98iW0YAGH","2TRI7LewvM","8U2nUv8yFN","48cHLcShY2","JXljWLbRTH","d85a98cVD3","K4GS89GXkX","OxWIHgdQsS","dhSuHECMvU",
+"8U2nUMmsIo","cL0aEuupzk","Dz1R3vkCHH","7X3uyW7cTs","8FmFHXyPZN","jS1aji3pyd","64s8NCK5W7","9y4lwzqH0W","zmLYD7fsYM","AOgEeJkzUn",
+"iKqhrJKWYR","EoToPs7Mxk","QYxC0kZANm","JRJQBGSQwj","GSQwjkZANm","qUJMduvf7A","GrDg72Yz7E","yluBxblLA9","pFrrlUl4a1","FwEJzd85a9",
+"WMiS3kZANm","SbRYyJRJQB","taOXKqQxHP","7hyVv8cVD3","9iGoTwiHrZ","GXdoHlXFOB","jSjS3jfREu","piJSkyluBx","kZANmO3iyQ","GrDg7CK5W7",
+"cmXIXoGu6x","DLhzMHlUbF","CIShG48cHL","W3VFHy94nw","zmLYDaL6AJ","ZUnqtaDGtS","W3VFHQbxXc","YjB9tXyPZN","o8UydReKEW","gjUTuuoStw",
+"K20wK6AFT0","2ZHdkJKWYR","5nmWvfqypy","d7vjM5VZjS","Oz8yZpWiOs","fcJOymz8gx","aFFsspFrrl","MmKGJjfREu","lweGytvdkD","WaWsvdQ586",
+"AIYUu9XyT9","dQ586tl72W","qUJMdjSjS3","QYxC0fFDrJ","taOXKQssNC","dmoS7BpYhV","6AFT0v8yFN","oGu6xChuy3","YOfrYDQimp","ciuWzlXFOB",
+"BGaQYt98iW","uupzkStlDJ","IRh48y94nw","ulk41ksJby","B3qemSmGzv","07n1cru4UG","n8pJ9HfyNQ","J2mQi8RCUA","hYBCKWmadA","9rlg9dmoS7",
+"Yw2oUMmsIo","OUqFMzz4ZU","9GXkXbgJAz","atef2d7vjM","J2mQiD6rBy","uupzkBpYhV","suY4xlpF6W","ZuDtDUlU3M","uN6r3CxVEf","RBhp0kB5nP",
+"yEfy9HP433","rz7Utzz4ZU","VBjhzdmoS7","VNCPdCdyBV","aL6AJC2Irc","XyPZNs7Mxk","GSQwjFNYIM","VNCPdaDGtS","SjskQ7fsYM","MmsIomz8gx",
+"pvgjSv2eC3","2hEEUzbIYY","dpe1vbgJAz","uvf7Aaez9y","n1pmO9XyT9","AIYUu7Ow5C","t59lRFFDui","OHaBzgdQsS","fcwDapT8wu","FwEJztl72W",
+"s93MlAmdQd","a00b5VNCPd","7X3uyQworu","FjHXRlweGy","XyPZNOz8yZ","uJScXni2v1","4dEz6ThjNn","MmsIo0h1b1","t98iWnnP8o","d85a9Uvlv4",
+"Mm8siyluBx","6q6L9MK07Y","45cIH0PktI","ThjNn64s8N","v8yFN7ku1p","BpYhV9rlg9","qaofNm4bxU","ZzJHWGv3Fq","QYxC0B3qem","zqH0W7fKYU",
+"wiHrZzbIYY","ZUnqtK4GS8","Yh1hFt59lR","VNCPd16lHc","2TRI7jeskS","Nxx9V0YAGH","TwanoMojnP","ThjNnhUTw7","GWqqXC2Irc","uAWyp2Yz7E",
+"RzaZATa8f6","0PktIsoy9t","he9IAP6bcg","hUTw7JJs5m","AOgEeUvlv4","LDk6fiqv4k","zmLYDDQimp","fFDrJLbRTH","MGlTFThjNn","ZuDtDuupzk",
+"yofH36q6L9","jiVBPFcWrW","L7cGcuupzk","QWxoTs93Ml","pvgjSJKWYR","JRJQB8U2nU","hE1QlCxVEf","t98iWLDk6f","Dz1R35ZaEz","Cp3mZru4UG",
+"hUTw7lpF6W","uQIczPb1pa","pvgjSsx5Gl","e6e4zjtn0X","kB5nPYw2oU","X6Pin9XyT9","1j5L8Pb1pa","iwzGki3pyd","OUYuFjfREu","d85a9Yh1hF",
+"yEfy94W0Tl","faHirn8pJ9","9eoRcIBe8k","hYBCKFcWrW","ZUnqt9GXkX","tl72WoQ87r","8TxD7kB5nP","D6rByLDk6f","VjCZqMezSW","Uvlv4S77LH",
+"MaJQsQbxXc","MezSWlkMUA","JIqXiZ4I1v","lViBv0BmCy","8FmFH4QMc9","Ul4a1lViBv","KASQ88hJdt","X6Pin1v5hH","RzaZAQYxC0","qUJMdFGzgp",
+"2TRI7mX2GE","FNYIMzQt6Q","mX2GEG1RhS","wDajXCIShG","VIlwPogLgc","uTacx29QAz","0YAGHTXQ0Z","0KyfsHRxd8","VerEAEdBKc","ydG8UFGzgp",
+"BCxeCnlaBy","uN6r3hSSvQ","pvgjSdpe1v","TXQ0ZJXljW","L7cGcuJScX","pmeCd8hJdt","XyPZNqaofN","7Ow5Co8Uyd","1LB1LhE1Ql","cShY2ZuDtD",
+"fqypyUl4a1","aez9yPOUYS","prNT6zz4ZU","7hyVvPb1pa","X6PinkZANm","POUYSZv7z0","QssNCydG8U","ciuWzbgJAz","DLhzMpiJSk","gf8rIWaim6",
+"l83UdUlU3M","9GXkXYh1hF","LbRTHtlILt","QbxXcoQ87r","RkQke9GXkX","KsjRKMezSW","5IhmGTwano","zz4ZUqQxHP","blLA9vLsmS","0PktIWPmlx",
+"zmLYDnnP8o","RzaZAAIYUu","IKxdLdhSuH","QssNCAgJHQ","fqypyRsQUq","s7MxkAgJHQ","CK5W7yEfy9","MmKGJbgJAz","aFFssNo0Qb","zHF1qBbwgA",
+"aFFssYw2oU","Mm8si5IhmG","o8UydguMb8","hYBCKZ4I1v","zY1GY4W0Tl","dmoS7S2Dfu","PYBf42DREs","euZA5580YD","OxWIHGWqqX","ciuWzpmeCd",
+"aL6AJW3VFH","LbRTH6AFT0","8hJdth1zcH","dpe1vlm0pD","yofH3hSSvQ","xXTI4Cp3mZ","uLtKsPYBf4","zQt6QCIShG","tl72WuTacx","MaJQsprNT6",
+"5drc6In3NS","9y4lw5Drn0","3otm6MmKGJ","SjskQjeskS","oQ87rlkMUA","guMb8RBhp0","QClRLUmaEv","tl72WECMvU","hUTw7x3LDe","s4786iB08l",
+"SWfou9XyT9","wDajXKZamH","CqqaDUlU3M","pFrrl8xEKz","gtCA5Rxrsm","kZANmeuZA5","qUJMdBCxeC","ni2v1cShY2","prNT65nmWv","DQimp9iGoT",
+"UlU3MxXTI4","WaWsvNOHsz","UmaEv9y4lw","5nmWvbgJAz","QYxC07fKYU","5drc6ZhwG1","2Yz7EG1RhS","3otm6TXQ0Z","QChxscShY2","W7cTsd7vjM",
+"euZA5TCgPp","faHirNOHsz","SWfouqaofN","RzaZA6AFT0","lm0pD5VZjS","oGu6xHP433","cL0aEKr8ys","RACujni2v1","zQt6QP6bcg","ciuWzQbxXc",
+"CxVEfJJs5m","lViBvPb1pa","rhl0JWreyP","8FmFH6AFT0","QssNCi3pyd","RkQkebrhlQ","StlDJnnP8o","Oz8yZuN6r3","5nmWvYh1hF","s47864dEz6",
+"F6PT2Yw2oU","MGlTFfFDrJ","G1RhSkB5nP","AmdQduQIcz","dmoS7he9IA","uQIczbrhlQ","QClRLuPX7G","GXdoH6AFT0","VBjhzo8Uyd","JKWYRQClRL",
+"Mkgy8ciuWz","d7vjMazIWp","L7cGcQworu","ZhwG10YAGH","FcWrWJIqXi","TCgPpzz4ZU","9XyT9v2eC3","okgRi2Nslm","iqv4kSjskQ","Nxx9VHlUbF",
+"jfREuC2Irc","WmadAv8yFN","hi5X7FcWrW","aL6AJ5IhmG","fmIK1JKWYR","NOHszQworu","RACuj0ao3l","nlaByjiVBP","suY4xU3yw5","ksJbycQOnv",
+"cmXIXQYxC0","5iGN5OxWIH","WmadApWiOs","WaWsvThjNn","LbRTHaL6AJ","2hEEUhe9IA","3otm6yEfy9","5IhmGlsQGo","5NammOz8yZ","vkCHHaFFss",
+"ni2v1Q6hMC","CNHmvXflUq","Yh1hFfLNg8","Pb1paVjCZq","zHF1qTXQ0Z","X6PinQ6Lix","S2DfuaL6AJ","Kr8ysVIlwP","wDajX7X3uy","yvOMI9iGoT",
+"RkQkeJKWYR","xXTI4jtn0X","Yw2oUpT8wu","5nmWvl83Ud","HfyNQYf2Ec","FFDuijfREu","Y1mC0P6bcg","zqH0WQ6Lix","MmsIobZLvS","i3pyduvf7A",
+"zFgtBjS1aj","yvOMIvOqCE","0YAGHogLgc","OxWIH5Namm","t98iWo8Uyd","IBe8kCxVEf","ogLgcO3iyQ","ZhwG1jiVBP","ydG8Ub29RJ","b29RJzz4ZU",
+"MaJQsAOgEe","Rxrsmk85Ae","MmsIoYjB9t","9eoRcGv3Fq","RpBQmSjskQ","DG4sTb29RJ","BFkb8pFrrl","0MR5XDLhzM","O3iyQ0Kyfs","W3VFHReKEW",
+"gjUTuGv3Fq","BbwgAnFqik","Mm8siL7cGc","hSSvQMkgy8","7fKYUfcwDa","Q6LixMaJQs","ZzJHWcL0aE","SWfouuoStw","2hEEU2TRI7","9rlg9RzaZA",
+"dmoS7oGu6x","OxWIHgtCA5","lH1ktJRJQB","pAhR1ksJby","8U2nUMkgy8","ix74r07n1c","fqypyrhl0J","l83UdM6qcG","OUqFMXflUq","S2Dfu0PktI",
+"VjCZqJJs5m","Twano7ku1p","CIShGBGaQY","YjB9tSbRYy","VIlwPtAOsr","RsQUqtAOsr","FFDuiM3zXL","v8yFNSmGzv","3weIFVerEA","7fKYUBCxeC",
+"0MR5XO3iyQ","B3qemQChxs","Kr8ysYh1hF","dpe1vWaim6","sqVrfxciqp","ThjNnBGaQY","cShY2uQIcz","v2eC3uJScX","fcwDaFnPFB","AOgEex3LDe",
+"Waim61LB1L","y94nwRpBQm","y94nwAXpwE","WaWsvlsQGo","Gv3FqJkzUn","8U2nUlViBv","fFDrJWDVWJ","iKqhrRxrsm","hE1QlNhXdu","IKxdLiwzGk",
+"ZhwG1VLTy6","brhlQIBe8k","RzaZAThjNn","tjQxs5drc6","ni2v1ksJby","gtCA5MezSW","kB5nPBpYhV","yvOMIn8pJ9","8FmFHjeskS","7fKYUy94nw",
+"IBe8kuAWyp","yluBxiwzGk","taOXK14FLR","aFFssChuy3","5VZjSVjCZq","euZA5In3NS","QssNCKASQ8","6AFT0LewvM","jSjS3StlDJ","NhXduSbRYy",
+"lCMxy3otm6","cShY23otm6","ECMvUU3yw5","Ta8f6Z4I1v","9rlg9ksJby","16lHcru4UG","uoStwzmLYD","uTacx5drc6","nFqiko8Uyd","6AFT0nFqik",
+"LewvMTwano","guMb8oVQp6","CqqaD2hEEU","14FLRnnP8o","ZzJHWMGlTF","oQ87rMmsIo","gtCA5Yh1hF","FVMxoKr8ys","cQOnv5IhmG","xReecRpBQm",
+"jS1aj2hEEU","FwEJzogLgc","WaWsv5iGN5","FcWrW5VZjS","VBjhzt98iW","WreyPzz4ZU","S77LH7X3uy","mz8gxWaim6","Mkgy8yofH3","lH1ktzqH0W",
+"VNCPdaez9y","vLsmSMGlTF","14FLRzHF1q","SjskQ8hJdt","CdyBVfqypy","wiHrZgtCA5","xXTI4oGu6x","3weIFTCgPp","W7cTsoQ87r","jiVBPsuY4x",
+"AOgEeHlUbF","IBe8khi5X7","TXQ0ZzmLYD","7X3uyRpBQm","sqVrfiqv4k","zHF1qWreyP","kZANm0Wr5y","gf8rIwDajX","RmDcrK4GS8","gdQsSWmadA",
+"HzZT8zQt6Q","YjB9t8U2nU","OUqFMuJScX","X6Pin9GXkX","0Wr5yUlU3M","8hJdtSbRYy","QWxoTFVMxo","yluBx3otm6","tlILthE1Ql","RpBQm7fsYM",
+"VerEA0Kyfs","bgJAzAXpwE","jeskSVNCPd","wiHrZ7X3uy","In3NSQChxs","2DREsFcWrW","t59lRMezSW","VNCPdi3pyd","1v5hHQYxC0","yluBxRzaZA",
+"Yf2Ec0Kyfs","vkCHHNxx9V","yvOMI16lHc","Q6hMCFxX9q","bZLvSRmDcr","2DREs2TRI7","U3yw5he9IA","atef2lm0pD","MmKGJ0Wr5y","3weIFpv0i7",
+"CIShGQYxC0","s4786HzZT8","6AFT02TRI7","QnJ1SuPX7G","EdBKc5nmWv","pT8wublLA9","v2eC3BCxeC","OxWIHulk41","EdBKcAOgEe","gjUTulkMUA",
+"IRh48vkCHH","ZzJHWi7WMQ","B3qemRpBQm","7lUXZBpYhV","s7Mxk0h1b1","5VZjShi5X7","l83UdWaim6","v2eC3HRxd8","DcpWBgdQsS","Q6LixgIYvE",
+"7ku1psqVrf","6AFT0FFDui","jS1ajulk41","CdyBVpmeCd","uAWypo8Uyd","fLNg8zHF1q","4QMc9HRxd8","CK5W7VIlwP","7fsYMgIYvE","7hyVv0MR5X",
+"K20wKRACuj","fqypyNcICA","BCxeCFcWrW","KASQ8dpe1v","EdBKcx3LDe","618DicShY2","7lUXZQbxXc","yvOMIuoStw","2TRI7NhXdu","gIYvEQClRL",
+"618Di618Di","YOfrYDLhzM","5nmWvi3pyd","s93MlNhXdu","2DREsGXdoH","5VZjShSSvQ","5ZaEzkZANm","qQxHPogLgc","SWfouiqv4k","nFqik9iGoT",
+"QbxXcY1mC0","ni2v1Cp3mZ","BCxeC5Mg9r","MaJQsP6bcg","pT8wuL7cGc","4dEz6iqv4k","9eoRcuLtKs","RmDcrU3yw5","CqqaDiKqhr","aFFssFFDui",
+"pv0i7ECMvU","BCxeCRzaZA","DG4sTatef2","64s8N24ARF","FnPFBvkCHH","gdQsSlsQGo","DLhzMW7cTs","zFgtBnFqik","4W0TlFnPFB","OHaBz5IhmG",
+"tuDySh1zcH","VjCZq7fsYM","t98iWlsQGo","brhlQ14FLR","JJs5mFxX9q","FjHXRhSSvQ","pvgjSYw2oU","45cIH580YD","hi5X7dhSuH","1v5hHAgJHQ",
+"NcICAM3zXL","uPX7GQ6hMC","fcJOykZANm","6AFT0Fhtgl","ZJTXHDLhzM","8hJdtVprf2","W7cTsatef2","AOgEekZANm","jS1aj8TxD7","MezSWHzZT8",
+"G1RhS8cVD3","PYBf4tAOsr","suY4xUmaEv","kB5nPrKDLJ","CNHmvZzJHW","ru4UGaez9y","qQxHPsx5Gl","lXFOBGrDg7","soy9tzQt6Q","4W0Tltl72W",
+"FxX9qY1mC0","WaWsv3weIF","8RCUAzHF1q","BpYhVQbxXc","QWxoT7Ow5C","aFFssUvlv4","ciuWz8TxD7","CNHmvfqypy","pv0i75ZaEz","ECMvUlm0pD",
+"zHF1qCfgr3","64s8NOxWIH","Waim6C2Irc","piJSkdmoS7","AmdQdTCgPp","TwanoyvOMI","nlaByCqqaD","WDVWJC2Irc","2TRI7iB08l","FhtglpAhR1",
+"RBhp05Namm","ulk41IRh48","CdyBVDcpWB","uTacxoQ87r","Oz8yZrKDLJ","0MR5X8cVD3","0PktIM6qcG","l83UdQChxs","hE1Ql5VZjS","cmXIX6q6L9",
+"he9IAhSSvQ","ni2v1DG4sT","AgJHQQworu","1j5L8RBhp0","K4GS89y4lw","GWqqX2DREs","ni2v1SWfou","aDGtSZv7z0","3otm6oGu6x","uJScXSbRYy",
+"IjTwP0Wr5y","MmsIokZANm","Cfgr3aez9y","DcpWBtvdkD","bZLvSK20wK","brhlQFVMxo","HfyNQlCMxy","oVQp6jeskS","MaJQspiJSk","TCgPp0MR5X",
+"BbwgAVprf2","mX2GEWDVWJ","lXFOBWreyP","JXljWRsQUq","tvdkDwDajX","EdBKc9y4lw","i3pydYw2oU","v1Hln8RCUA","xReecjfREu","5ZaEzkB5nP",
+"Gv3FqlViBv","lsQGoQ6hMC","0PktIo8Uyd","XflUqJ2mQi","ulk41dQ586","XflUqgdQsS","o8UydaDGtS","L7cGcW7cTs","618DiF6PT2","faHir0Wr5y",
+"7fsYMrKDLJ","W3VFH5ZaEz","I7p2abgJAz","MojnPO3iyQ","3otm6ksJby","JIqXini2v1","45cIHAgJHQ","VNCPdn8pJ9","5drc6SjskQ","9eoRcqQxHP",
+"SjskQsoy9t","SmGzv9GXkX","pAhR1uupzk","TCgPpFwEJz","xXTI4ogLgc","soy9tlpF6W","HRxd8iwzGk","W3VFHjtn0X","Dz1R3FFDui","Ss0ZuVLTy6",
+"WPmlxvkCHH","okgRiZzJHW","BCxeCIRh48","jtn0XQYxC0","7lUXZlkMUA","580YDCfgr3","gjUTuzqH0W","JXljWx3LDe","8TxD7mz8gx","ZhwG10Wr5y",
+"fLNg8RmDcr","x3LDeYf2Ec","OxWIHRpBQm","ZzJHW9eoRc","ZJTXHYf2Ec","8U2nUjS1aj","FVMxoiKqhr","Z4I1vFNYIM","EOE1obgJAz","mz8gxVBjhz",
+"ZJTXHi3pyd","OUqFMi7WMQ","tAOsrIRh48","dpe1vFGzgp","64s8NQWxoT","VNCPd3weIF","zHF1qFwEJz","Dz1R3fFDrJ","euZA5MK07Y","rz7UtaFFss",
+"jtn0Xdpe1v","UlU3MMK07Y","3weIFTXQ0Z","JRJQB5ZaEz","OUqFMuLtKs","xXTI4FLsph","AmdQdOUYuF","bZLvSogLgc","yofH3JRJQB","ReKEWlXFOB",
+"AgJHQx3LDe","m4bxURpBQm","QWxoT618Di","QChxsyofH3","jeskSfaHir","uTacxRsQUq","n1pmOsuY4x","OHaBzuvf7A","SbRYyP6bcg","qaofNZJTXH",
+"Gv3FqJKWYR","7lUXZUlU3M","JkzUnWaim6","580YDOUYuF","ZUnqtDz1R3","v1HlnRpBQm","ReKEWIKxdL","S2DfuMezSW","UlU3MpvgjS","cQOnvdQ586",
+"14FLRNxx9V","SWfoufFDrJ","618Di0ao3l","RBhp0blLA9","oQ87rWaim6","wDajXBbwgA","uQIcztjQxs","OxWIHvkCHH","8RCUAuvf7A","FLsphXyPZN",
+"07n1cKr8ys","QWxoT64s8N","CxVEflweGy","djsrvlCMxy","0BmCy4W0Tl","7hyVvhE1Ql","yToGWru4UG","aL6AJ3otm6","NhXdu5nmWv","EdBKcmX2GE",
+"fcJOyuupzk","Q6hMCxciqp","oQ87rTwano","ThjNnv2eC3","UmaEvAIYUu","Pb1paIRh48","FFDuiTwano","W3VFH14FLR","JXljWn1pmO","xciqp2DREs",
+"fcwDa0PktI","v2eC3pvgjS","tuDySS2Dfu","LDk6f6AFT0","dQ586Fhtgl","sqVrfVprf2","aFFssP6bcg","JRJQB5drc6","DG4sTNo0Qb","rKDLJiKqhr",
+"Pb1paaFFss","Q6LixCqqaD","pvgjSVerEA","gIYvEWDVWJ","EOE1oCfgr3","WDVWJ8xEKz","Nxx9VMaJQs","Q6LixJKWYR","yofH3bgJAz","okgRiJ2mQi",
+"0MR5XcL0aE","y94nwcQOnv","uN6r3VjCZq","wDajXMK07Y","ReKEWo8Uyd","J2mQiiqv4k","sx5Gllj07Q","soy9tfmIK1","Oz8yZMGlTF","QWxoTKZamH",
+"QYxC0Ta8f6","sqVrfCIShG","POUYSt59lR","uQIczVBjhz","CqqaDNcICA","Waim6DQimp","ZhwG1soy9t","WDVWJt59lR","gIYvEdQ586","jzUqR9XyT9",
+"VLTy6blLA9","FVMxoyluBx","pv0i7Y1mC0","sx5GlCIShG","ru4UGk85Ae","BbwgAGv3Fq","aDGtSru4UG","wDajXNo0Qb","8cVD35Mg9r","24ARFnFqik",
+"he9IAs4786","lweGyWMiS3","wiHrZqQxHP","7ku1phe9IA","Z4I1vzmLYD","ThjNnlViBv","ix74rTwano","9GXkXIBe8k","OUYuF3weIF","KsjRKazIWp",
+"QYxC0uZPqg","EoToPDG4sT","GSQwjLbRTH","9y4lwOUYuF","5Mg9raDGtS","iKqhrTa8f6","guMb8S2Dfu","jzUqRI7p2a","Nxx9VY1mC0","KsjRKqQxHP",
+"9iGoTOUYuF","d85a9blLA9","mz8gxK4GS8","b29RJn8pJ9","FGzgpoGu6x","9iGoTuAWyp","uLtKsFFDui","iwzGk64s8N","UmaEvWMiS3","azIWpS77LH",
+"J2mQi5Mg9r","lm0pDYjB9t","TCgPp2hEEU","OHaBzkB5nP","lm0pDX6Pin","aL6AJguMb8","FPfSEJJs5m","2ZHdkpv0i7","EoToPFNYIM","uZPqgHP433",
+"FLsph8U2nU","mX2GEy94nw","piJSkcL0aE","C2IrcuJScX","1v5hHVprf2","J2mQit98iW","24ARFhE1Ql","WMiS3fLNg8","gf8rIpvgjS","tAOsr64s8N",
+"QChxswiHrZ","iB08lRzaZA","DcpWBpv0i7","W3VFHW7cTs","BGaQYNAFuw","9GXkXix74r","WDVWJhE1Ql","GXdoHHzZT8","64s8N1LB1L","i3pydQChxs",
+"ni2v1lm0pD","BFkb8AgJHQ","vOqCECNHmv","7Ow5CjiVBP","e6e4zMaJQs","7Ow5CFnPFB","gf8rIWreyP","uLtKsFNYIM","QbxXcCp3mZ","aFFssZuDtD",
+"lCMxyVerEA","7X3uyjeskS","0PktIksJby","euZA5pmeCd","VjCZqQssNC","tAOsrHzZT8","ZUnqtIKxdL","TXQ0Z64s8N","d85a9dQ586","DcpWBQssNC",
+"tlILt2hEEU","KsjRKjfREu","SbRYyStlDJ","zHF1qFxX9q","qUJMdXyPZN","pFrrliwzGk","o8Uyd55rfB","3weIF5VZjS","JXljW5nmWv","i7WMQQYxC0",
+"Waim6Z4I1v","RACujGXdoH","k85AezQt6Q","SjskQvOqCE","D6rByNAFuw","HlUbFt59lR","RACuj8cVD3","9iGoT0ao3l","x3LDepAhR1","pmeCd0Wr5y",
+"2hEEU7Ow5C","gtCA5MaJQs","5ZaEzgIYvE","AkKTknnP8o","CxVEfYOfrY","pvgjSqQxHP","v1HlnRxrsm","UlU3Miqv4k","5ZaEzuPX7G","iB08lFGzgp",
+"he9IAvkCHH","oQ87rs93Ml","lkMUAs93Ml","k85AeNo0Qb","Mkgy8he9IA","t98iWBbwgA","pmeCdAOgEe","ix74rI7p2a","Oz8yZpv0i7","iqv4kgdQsS",
+"0BmCy7fKYU","OUqFMTa8f6","RxrsmHfyNQ","LbRTH64s8N","JkzUnNxx9V","VBjhzfaHir","GrDg7KASQ8","pAhR1rKDLJ","QbxXcRsQUq","KsjRKO3iyQ",
+"HzZT8UlU3M","Y1mC0yluBx","Z4I1vDLhzM","JRJQB0MR5X","oGu6xRkQke","uLtKsl83Ud","fqypyPb1pa","WDVWJMK07Y","Ss0ZuRzaZA","5IhmGuoStw",
+"4W0TlpvgjS","lpF6WHzZT8","yofH3iwzGk","s7MxkSmGzv","zz4ZUVjCZq","EoToPwDajX","POUYStuDyS","5VZjSksJby","EoToP8cVD3","Gv3FqMaJQs",
+"RmDcrNo0Qb","aez9yh1zcH","azIWphe9IA","CqqaDFFDui","FNYIM9rlg9","yEfy9fLNg8","tjQxs7Ow5C","soy9tqQxHP","EdBKcbrhlQ","FNYIMOUYuF",
+"55rfBdpe1v","RpBQm0Wr5y","UlU3MFhtgl","FhtglDQimp","GrDg7RkQke","DQimp4QMc9","0MR5XmX2GE","C2Irc7ku1p","BFkb8ciuWz","D6rByi7WMQ",
+"UlU3MVLTy6","n1pmOgtCA5","atef2zFgtB","3weIFlsQGo","gdQsSpFrrl","WaWsvfqypy","MGlTFgIYvE","WPmlxwDajX","tvdkDcQOnv","8FmFHPYBf4",
+"HP433zHF1q","RmDcrQ6Lix","K4GS8EOE1o","QChxsb29RJ","TCgPpFjHXR","he9IABCxeC","zqH0Watef2","9y4lw0ao3l","S2DfuK20wK","MezSWAkKTk",
+"pv0i7AmdQd","UmaEvYh1hF","Y1mC0dmoS7","gdQsS1v5hH","qaofNpT8wu","CxVEfSs0Zu","EoToPJ2mQi","e6e4zIn3NS","uN6r3mX2GE","Nxx9Vgf8rI",
+"9iGoT5iGN5","4W0TlJKWYR","Ta8f6zqH0W","aDGtSXflUq","uQIczjiVBP","StlDJDcpWB","QChxsCqqaD","Cfgr37Ow5C","mz8gx8TxD7","5Mg9rNhXdu",
+"0PktI2Yz7E","euZA5cShY2","KASQ8oGu6x","AkKTkKASQ8","rz7UtvOqCE","QworuZv7z0","WaWsvQ6Lix","GWqqXCfgr3","07n1cFGzgp","n8pJ9fqypy",
+"tvdkDzz4ZU","e6e4zhe9IA","aDGtS07n1c","zFgtBh1zcH","yToGWW3VFH","C2Irca00b5","AOgEeJ2mQi","ZJTXHWPmlx","WMiS3fqypy","hSSvQwiHrZ",
+"AgJHQrhl0J","ECMvUW7cTs","l83UdtjQxs","D6rBygdQsS","cQOnvQworu","Zv7z0ni2v1","Gv3FqwDajX","ydG8U5ZaEz","618DiydG8U","MaJQszmLYD",
+"7X3uyAgJHQ","Z4I1vokgRi","KsjRKAIYUu","l83UdkB5nP","9eoRcReKEW","fcwDa7X3uy","EdBKcuAWyp","FwEJzCxVEf","dQ586n1pmO","GXdoHs7Mxk",
+"JKWYRZuDtD","aez9ybZLvS","BpYhVVIlwP","faHir1v5hH","rz7UtOUqFM","aez9yReKEW","0YAGHm4bxU","QWxoTrKDLJ","FGzgpVLTy6","MojnPfmIK1",
+"FGzgpAmdQd","lsQGoPOUYS","TCgPphYBCK","I7p2aRACuj","WreyPogLgc","s4786DG4sT","lj07QOxWIH","he9IATCgPp","lweGy8hJdt","Ul4a1zFgtB",
+"ZhwG1x3LDe","ni2v1yofH3","ZUnqtxReec","IRh48gjUTu","gtCA55drc6","aDGtSFwEJz","8U2nUFGzgp","fcJOyi7WMQ","LbRTHjfREu","W7cTsMmsIo",
+"ulk41P6bcg","QbxXc6q6L9","AmdQdSbRYy","uPX7Gt98iW","07n1cuTacx","TwanoJXljW","d7vjMWreyP","djsrvxciqp","M3zXLZhwG1","3weIFgjUTu",
+"8TxD7QClRL","WDVWJQssNC","CK5W79y4lw","2Yz7Ey94nw","Vprf2RBhp0","taOXKokgRi","mz8gxHfyNQ","IBe8koGu6x","14FLRv8yFN","7lUXZQYxC0",
+"zFgtBB3qem","QYxC01j5L8","5drc6PYBf4","JRJQB2TRI7","7fsYMWaim6","Mkgy8d85a9","618DiRACuj","8cVD3mz8gx","lCMxy48cHL","fcwDamz8gx",
+"VerEAcmXIX","d85a9zHF1q","rhl0JVIlwP","S77LH8xEKz","CNHmv5Drn0","9XyT9Zv7z0","JRJQBblLA9","Dz1R3JKWYR","9y4lwPYBf4","yvOMIAgJHQ",
+"5Mg9rogLgc","lCMxyWDVWJ","JIqXiECMvU","taOXKB3qem","xciqpzqH0W","FjHXRpv0i7","mX2GEY1mC0","9iGoTbZLvS","wDajXkZANm","RpBQm3weIF",
+"5ZaEzulk41","FcWrWfaHir","JRJQBQ6Lix","faHirtvdkD","M3zXLLDk6f","JkzUn24ARF","rz7Utrhl0J","ThjNncShY2","Ta8f6ulk41","cL0aEZhwG1",
+"X6Pin5Drn0","suY4xpFrrl","dhSuHl83Ud","yluBxt59lR","7lUXZCxVEf","RxrsmPb1pa","dQ5861v5hH","IBe8kVBjhz","16lHcRpBQm","l83UdJJs5m",
+"cQOnvZ4I1v","1j5L8yToGW","ZuDtDF6PT2","PYBf4RkQke","gjUTuZuDtD","P6bcgix74r","D6rBy5Drn0","ix74rYOfrY","NcICA8RCUA","atef2VLTy6",
+"BpYhVuoStw","dpe1vyvOMI","Waim6piJSk","FxX9qJkzUn","mz8gxZUnqt","LbRTHlsQGo","ZuDtDy94nw","xXTI47fsYM","5drc6Fhtgl","x3LDelXFOB",
+"cL0aEYjB9t","HzZT8AXpwE","MojnPqaofN","1j5L8yofH3","atef2pvgjS","OHaBzjS1aj","BpYhVcQOnv","ZuDtDrz7Ut","LewvMJkzUn","uN6r3iwzGk",
+"YjB9tY1mC0","IjTwP8TxD7","FPfSEM3zXL","L7cGcAmdQd","soy9t8xEKz","ZuDtDMK07Y","UlU3McmXIX","S77LHuvf7A","piJSkoVQp6","IjTwPfFDrJ",
+"lH1ktFVMxo","ZhwG1a00b5","WMiS3D6rBy","24ARF14FLR","uupzkv1Hln","iqv4kD6rBy","L7cGc8cVD3","dmoS7piJSk","i3pydYjB9t","AgJHQ9rlg9",
+"ZhwG1lpF6W","Nxx9VKZamH","prNT6oVQp6","HzZT8AOgEe","9y4lwRpBQm","atef22hEEU","580YDRzaZA","VLTy6lCMxy","Ta8f61LB1L","9XyT9aDGtS",
+"Mkgy8nlaBy","AXpwEtAOsr","pT8wuZuDtD","cL0aE0YAGH","zmLYDFxX9q","ReKEWtjQxs","aDGtSuAWyp","TXQ0Z7fsYM","CxVEfv2eC3","24ARFaL6AJ",
+"d7vjMY1mC0","uZPqgs7Mxk","5Drn045cIH","a00b5iKqhr","uvf7At59lR","FwEJzni2v1","0MR5X9y4lw","FPfSEpvgjS","WaWsvOz8yZ","uZPqgmX2GE",
+"zFgtBCfgr3","pmeCdsqVrf","aez9yQChxs","atef2dpe1v","aL6AJ7hyVv","aDGtSUmaEv","CdyBVuN6r3","WMiS3e6e4z","2ZHdkv2eC3","O3iyQfqypy",
+"aDGtSHzZT8","rKDLJdpe1v","qaofNkB5nP","NhXduJkzUn","uQIczRzaZA","HP433jtn0X","Yh1hFtAOsr","Zv7z0Nxx9V","JKWYR618Di","NhXduRzaZA",
+"NcICA64s8N","MojnPIRh48","CxVEfDz1R3","HP433StlDJ","WaWsvuAWyp","8FmFHMmKGJ","EOE1oU3yw5","NAFuwHzZT8","AmdQdChuy3","7lUXZO3iyQ",
+"2NslmDcpWB","y94nwVLTy6","cL0aECqqaD","fqypyZv7z0","fcJOyMojnP","nFqikqUJMd","tvdkDtaOXK","lj07Q618Di","X6Piny94nw","s4786JRJQB",
+"3otm6QnJ1S","fmIK1HfyNQ","hSSvQtAOsr","0h1b1FwEJz","v1HlnNOHsz","SjskQFGzgp","RkQke5Namm","F6PT2suY4x","gdQsSfLNg8","WMiS3bZLvS",
+"AXpwEEOE1o","5Drn0gf8rI","ZzJHWLDk6f","0MR5XCK5W7","WaWsvciuWz","faHirSjskQ","CIShG5VZjS","fqypy5Namm","yvOMIYjB9t","fqypytjQxs",
+"0YAGHJXljW","zbIYY9rlg9","pWiOsYh1hF","ydG8Us93Ml","2DREsnFqik","AgJHQjfREu","Oz8yZ0h1b1","64s8NIRh48","hE1QlBGaQY","Waim6FPfSE",
+"Mm8siU3yw5","gIYvEjfREu","nnP8ouTacx","FLsphQYxC0","hSSvQRzaZA","t59lRWaWsv","ciuWzFhtgl","Nxx9VoGu6x","fFDrJVjCZq","F6PT2v1Hln",
+"jfREutuDyS","5Drn0QYxC0","n1pmOFLsph","8U2nUi3pyd","0PktIP6bcg","CK5W75VZjS","i7WMQokgRi","tl72WjfREu","8U2nUZuDtD","uLtKsQChxs",
+"29QAzt98iW","mX2GE0Kyfs","nnP8olj07Q","zHF1qyvOMI","dhSuHyluBx","G1RhSLewvM","uPX7GksJby","QYxC0yEfy9","n8pJ9EOE1o","tl72WpWiOs",
+"In3NSyvOMI","No0QbrKDLJ","2Yz7EhYBCK","EdBKc618Di","MaJQsjiVBP","VLTy65IhmG","cmXIXYOfrY","0YAGHOUqFM","ix74rv8yFN","d7vjMAkKTk",
+"ZhwG116lHc","ru4UGa00b5","tjQxsaL6AJ","zmLYD7fKYU","lkMUA6q6L9","5VZjSazIWp","M3zXLCfgr3","pmeCdaDGtS","5iGN5MGlTF","Cp3mZaFFss",
+"HRxd85iGN5","M6qcGiwzGk","uN6r3euZA5","AgJHQDLhzM","Dz1R3Mm8si","h1zcHSbRYy","uTacxpvgjS","soy9tM6qcG","618Di7X3uy","WreyPEOE1o",
+"FLsph48cHL","uoStwB3qem","QworuCdyBV","ni2v1FVMxo","OUqFM7fKYU","GWqqXChuy3","tlILte6e4z","Ta8f6FPfSE","mz8gx5Mg9r","EOE1o0Wr5y",
+"Cp3mZ0h1b1","JKWYRKASQ8","7fsYMUl4a1","JIqXi5Namm","fcJOypiJSk","l83UdfLNg8","9GXkXWaWsv","7fKYUkB5nP","No0QbMK07Y","24ARFhe9IA",
+"y94nwpv0i7","EOE1o0PktI","hUTw78U2nU","EoToPRzaZA","KsjRKOxWIH","No0Qbt59lR","v8yFNS77LH","hE1QlguMb8","tuDySv8yFN","PYBf4QClRL",
+"RpBQmOUqFM","aL6AJIjTwP","hE1QltlILt","48cHLmz8gx","7hyVvTXQ0Z","zbIYYRxrsm","xciqpVNCPd","jtn0X64s8N","MaJQscShY2","FFDuilpF6W",
+"KsjRKUvlv4","48cHLaez9y","y94nwWreyP","4QMc9ReKEW","CIShGPOUYS","C2IrcJ2mQi","zHF1qtuDyS","Zv7z0vOqCE","s7MxkAIYUu","lXFOBDLhzM",
+"iKqhrFcWrW","Oz8yZL7cGc","RsQUqThjNn","Z4I1vPb1pa","RpBQmEOE1o","3weIF7fKYU","n8pJ9WreyP","BpYhV5Mg9r","rz7UtHRxd8","W3VFHZ4I1v",
+"tlILtxReec","2NslmNxx9V","zHF1qStlDJ","ZUnqtt98iW","lpF6WW3VFH","29QAzW3VFH","brhlQLbRTH","lweGyyluBx","5Drn02Nslm","pFrrlsqVrf",
+"yEfy9n8pJ9","jS1ajdhSuH","IRh48i3pyd","M3zXLuoStw","Cfgr3AgJHQ","29QAzMaJQs","DG4sTEOE1o","lweGy3otm6","8U2nUCqqaD","jSjS3ogLgc",
+"Dz1R3ulk41","pmeCdyEfy9","VjCZquvf7A","rhl0J3otm6","gtCA5jiVBP","MezSWYw2oU","W7cTsdpe1v","qUJMdfLNg8","9rlg9nnP8o","FxX9quJScX",
+"DG4sTFGzgp","zqH0Wulk41","K4GS8WMiS3","RkQkeydG8U","LewvMdmoS7","PYBf4tlILt","GrDg7VjCZq","WPmlxZhwG1","Vprf2uPX7G","ix74r9GXkX",
+"MaJQsKZamH","JkzUnuZPqg","W3VFHkB5nP","6AFT0RmDcr","Q6Lix5VZjS","Yh1hFWreyP","7ku1pQClRL","vOqCE6q6L9","8RCUA5IhmG","tAOsrD6rBy",
+"zz4ZU1LB1L","WDVWJ3otm6","ksJbyGrDg7","2ZHdkru4UG","WaWsvfmIK1","FxX9qQ6hMC","7X3uyDG4sT","ZJTXHtvdkD","gf8rIZzJHW","yluBxK4GS8",
+"ulk41tvdkD","QworuC2Irc","QWxoTyofH3","fqypyRpBQm","WPmlxBpYhV","zY1GYguMb8","7lUXZ9rlg9","euZA5pFrrl","gf8rIOUYuF","2Yz7EtvdkD",
+"45cIH0ao3l","EdBKcWDVWJ","0KyfsOxWIH","F6PT2iB08l","FGzgpY1mC0","2hEEUKZamH","FFDuin8pJ9","Rxrsm5ZaEz","soy9t8RCUA","gtCA58U2nU",
+"pWiOsZv7z0","YOfrYIjTwP","mz8gxdmoS7","BGaQYsoy9t","tAOsrEdBKc","gdQsSlXFOB","he9IAqaofN","3otm6kZANm","Oz8yZDLhzM","FcWrWoQ87r",
+"pmeCdM6qcG","J2mQiQworu","CqqaDn8pJ9","lpF6WKr8ys","EdBKcZ4I1v","ogLgcnnP8o","FjHXRpFrrl","0ao3lNAFuw","uQIczO3iyQ","0Wr5yC2Irc",
+"dmoS7bZLvS","W3VFHtlILt","e6e4zydG8U","QnJ1SEdBKc","wiHrZvOqCE","7hyVv5nmWv","okgRioQ87r","Nxx9VYw2oU","AIYUuPb1pa","QWxoT0ao3l",
+"pvgjSFcWrW","HlUbFGWqqX","hi5X7h1zcH","ZhwG1cmXIX","WDVWJ5Namm","MK07Yd7vjM","aDGtS8FmFH","9eoRc7ku1p","hi5X79GXkX","n8pJ9J2mQi",
+"ix74rkZANm","RzaZAMmKGJ","5iGN5FLsph","Z4I1vx3LDe","fLNg87fKYU","1j5L85nmWv","RBhp0djsrv","HlUbFQ6Lix","2NslmK20wK","FwEJzqaofN",
+"0h1b1zqH0W","DG4sTyEfy9","ZhwG1prNT6","FcWrWNhXdu","GXdoHfFDrJ","ksJbyQYxC0","zHF1qYw2oU","5iGN5e6e4z","brhlQRzaZA","FcWrWqaofN",
+"5Namm24ARF","oGu6xi3pyd","5Mg9rjfREu","djsrvVNCPd","fmIK1GrDg7","SjskQfcwDa","BGaQY55rfB","y94nwwiHrZ","0h1b1tlILt","tjQxsCxVEf",
+"RsQUqWaWsv","azIWptvdkD","h1zcHkZANm","4W0TlAXpwE","FcWrWyToGW","uPX7GKZamH","xXTI4l83Ud","JJs5mokgRi","BCxeCFjHXR","d85a9VerEA",
+"gtCA5Ss0Zu","LDk6fh1zcH","wiHrZFcWrW","QWxoTSmGzv","azIWpJkzUn","W3VFH7ku1p","FFDuigdQsS","lViBvjiVBP","NAFuwOz8yZ","lj07QDLhzM",
+"cL0aErhl0J","zqH0WfaHir","LbRTHLewvM","jzUqRn1pmO","KZamHyEfy9","hSSvQQ6Lix","CdyBVZuDtD","ZhwG1zz4ZU","lkMUA4W0Tl","SWfoutaOXK",
+"1v5hHaL6AJ","AgJHQYw2oU","okgRiOUqFM","SjskQWMiS3","Cp3mZQbxXc","9rlg9uAWyp","LbRTHFcWrW","hE1QlJ2mQi","5VZjSVBjhz","l83Udx3LDe",
+"AIYUuzQt6Q","Z4I1vVBjhz","POUYSzmLYD","JRJQBs93Ml","JRJQBEOE1o","W7cTsEOE1o","SmGzv5drc6","VNCPdU3yw5","hi5X7G1RhS","SWfouWaim6",
+"W7cTs5VZjS","MojnPJkzUn","gdQsSt59lR","gdQsSJIqXi","euZA5Q6Lix","xReecSWfou","m4bxURmDcr","MojnPazIWp","nnP8ouPX7G","HP433OUqFM",
+"Q6hMCciuWz","7fsYMl83Ud","FxX9qlj07Q","guMb8FGzgp","tlILt0MR5X","lj07QFVMxo","9eoRco8Uyd","qQxHP1j5L8","ZhwG1uoStw","tAOsrcmXIX",
+"VerEAChuy3","wiHrZoGu6x","2hEEUlCMxy","D6rByaDGtS","suY4xVjCZq","fLNg8uoStw","KZamHB3qem","4W0TlS77LH","M3zXLzFgtB","qUJMdrhl0J",
+"oGu6xgf8rI","1v5hHL7cGc","8FmFHEOE1o","GrDg7Q6Lix","mX2GEMmsIo","9iGoT3weIF","mz8gxnlaBy","ECMvUuAWyp","FNYIM8RCUA","rz7UtJIqXi",
+"2ZHdkEOE1o","FwEJz6AFT0","BGaQY9rlg9","uTacxjiVBP","Chuy3O3iyQ","LbRTHFGzgp","pAhR1FLsph","9y4lwhe9IA","5Drn0CIShG","ZzJHWoQ87r",
+"ZzJHWjtn0X","ni2v1vLsmS","0MR5X48cHL","4W0Tlatef2","lCMxyJJs5m","Yw2oUBGaQY","lj07QECMvU","zmLYDAXpwE","5Mg9r1v5hH","v8yFNjfREu",
+"bgJAzOz8yZ","5nmWvn8pJ9","5NammjSjS3","L7cGcnFqik","zHF1qaez9y","0h1b1JKWYR","1LB1LK20wK","wDajXHlUbF","CdyBVKr8ys","FxX9qMezSW",
+"nnP8oY1mC0","ZzJHWAgJHQ","ogLgcy94nw","TXQ0ZVprf2","jeskSzHF1q","5drc6IRh48","gdQsSpvgjS","uupzkaL6AJ","5IhmG9y4lw","0YAGH5Mg9r",
+"K20wKiqv4k","3weIFQnJ1S","WaWsviB08l","SjskQiB08l","0BmCyprNT6","1LB1LNhXdu","S2DfubZLvS","jSjS3pv0i7","hi5X7jzUqR","2Yz7Es93Ml",
+"SbRYyjzUqR","QChxsazIWp","MK07YOHaBz","RkQkev8yFN","7hyVvd7vjM","WaWsvVNCPd","6AFT0guMb8","y94nwnFqik","rKDLJY1mC0","M3zXLNxx9V",
+"OHaBz7hyVv","Uvlv455rfB","7fKYUKZamH","jS1ajJXljW","MezSW45cIH","3weIF3weIF","RzaZAfLNg8","tvdkDtlILt","618Di5iGN5","S77LHhe9IA",
+"S2DfuIKxdL","djsrvvkCHH","WmadAogLgc","zqH0Wpv0i7","B3qemW7cTs","Zv7z0Yw2oU","3otm6pAhR1","hE1QlMmKGJ","hYBCKksJby","5NammpAhR1",
+"QChxsaDGtS","4QMc9CqqaD","BCxeCZv7z0","LewvM2ZHdk","atef2pv0i7","zFgtBfFDrJ","l83UdDLhzM","FcWrWxReec","UlU3M2DREs","9y4lwRxrsm",
+"ni2v1B3qem","hUTw7euZA5","ix74rb29RJ","gIYvE24ARF","FwEJzjSjS3","gjUTui3pyd","2DREsbZLvS","3weIFCNHmv","QworuVprf2","CdyBVCqqaD",
+"t98iW5drc6","rz7UtC2Irc","Oz8yZlpF6W","Qworu2ZHdk","24ARFSbRYy","xciqp9rlg9","0BmCySjskQ","dpe1v5IhmG","v1HlnvkCHH","lm0pDe6e4z",
+"TXQ0ZcL0aE","UlU3MDG4sT","RBhp0l83Ud","m4bxUvkCHH","StlDJTwano","TCgPpaDGtS","pT8wuyofH3","JRJQBStlDJ","v2eC3IRh48","2Yz7Edpe1v",
+"In3NSoVQp6","UmaEv8cVD3","aDGtSLbRTH","DQimpHzZT8","MaJQsQnJ1S","QbxXcazIWp","FxX9qOxWIH","iqv4ktaOXK","LDk6fuAWyp","lCMxyx3LDe",
+"9GXkXEoToP","fcwDafcwDa","WDVWJa00b5","zz4ZU29QAz","bgJAz5Drn0","VBjhzBCxeC","5iGN5K20wK","lm0pDDG4sT","F6PT22hEEU","i3pydJIqXi",
+"GXdoHRsQUq","Fhtgl0h1b1","jSjS3yvOMI","hUTw7QClRL","gtCA5IBe8k","4W0TlXyPZN","tAOsrblLA9","3weIFXflUq","v8yFNRpBQm","zz4ZUWMiS3",
+"2hEEUVLTy6","azIWpMm8si","jSjS3cQOnv","ru4UGaDGtS","BFkb8YjB9t","FnPFB55rfB","O3iyQKZamH","8hJdtYw2oU","lj07QqaofN","Gv3FqCIShG",
+"n8pJ9MmKGJ","2DREslkMUA","lsQGoogLgc","8U2nU2DREs","zFgtB0Kyfs","iwzGkzbIYY","uN6r35drc6","ciuWz7Ow5C","pvgjS2Nslm","aez9yOUYuF",
+"Dz1R3vLsmS","FFDuiqQxHP","GWqqXGXdoH","qUJMdtAOsr","atef2uN6r3","t59lREOE1o","piJSkQWxoT","5NammQChxs","8xEKz1LB1L","QClRLM6qcG",
+"Q6LixJIqXi","ksJby2ZHdk","JRJQBqUJMd","UlU3MnlaBy","DLhzMGWqqX","qUJMd0YAGH","LbRTHMmsIo","5IhmG24ARF","zHF1qU3yw5","QbxXcMm8si",
+"m4bxU7hyVv","Q6Lix16lHc","7X3uy5Mg9r","CqqaDFPfSE","aFFssSmGzv","ru4UGJ2mQi","HfyNQhi5X7","JXljWRACuj","2DREsCxVEf","WDVWJatef2",
+"LewvMjSjS3","aL6AJXyPZN","9GXkX0Kyfs","M6qcG48cHL","qaofNyEfy9","DG4sTlj07Q","tlILtatef2","vLsmSlsQGo","SjskQSbRYy","PYBf4BpYhV",
+"FPfSEhE1Ql","9iGoTgjUTu","ogLgcD6rBy","1LB1LLDk6f","0h1b1Vprf2","jzUqRJIqXi","7X3uys93Ml","FLsphFNYIM","IjTwPDLhzM","U3yw5Nxx9V",
+"DcpWB580YD","PYBf4uPX7G","wiHrZ5drc6","lH1ktuAWyp","hE1Ql7fKYU","mX2GEzmLYD","StlDJ8TxD7","gjUTu29QAz","uoStwC2Irc","AIYUu6q6L9",
+"VerEAblLA9","dQ586i3pyd","xciqp14FLR","In3NSpv0i7","uZPqgqaofN","WPmlxZuDtD","QClRL48cHL","W7cTspiJSk","9XyT9QClRL","yToGWwDajX",
+"MmKGJgf8rI","pFrrlVjCZq","4QMc9gf8rI","lH1ktHlUbF","lweGyG1RhS","d7vjMBGaQY","nFqikaez9y","Cp3mZVjCZq","aDGtSDz1R3","YOfrYfaHir",
+"JJs5mdmoS7","v8yFNMmKGJ","DG4sT5VZjS","FVMxolXFOB","t59lRHfyNQ","DQimpRxrsm","GrDg7Gv3Fq","yvOMIs4786","v2eC3MGlTF","zmLYDaez9y",
+"ThjNn7X3uy","2hEEUd7vjM","VLTy616lHc","MojnPyEfy9","IjTwPo8Uyd","Qworugf8rI","GXdoHZuDtD","5VZjSd7vjM","rz7Utlm0pD","CqqaDFhtgl",
+"8hJdt7hyVv","VBjhz9eoRc","okgRimz8gx","Nxx9VM6qcG","QClRLd85a9","pmeCd5IhmG","lsQGo0Wr5y","YjB9t5ZaEz","FNYIMFcWrW","FjHXROz8yZ",
+"zQt6QLDk6f","o8UydHRxd8","TXQ0Z5Mg9r","GWqqXQClRL","ReKEW4QMc9","WreyPfcwDa","VerEAHRxd8","rz7Ut8cVD3","5drc6RsQUq","vOqCEMm8si",
+"5drc6h1zcH","VLTy6IKxdL","ReKEWGSQwj","cL0aESbRYy","dhSuHYjB9t","rz7UtcmXIX","I7p2aAmdQd","GWqqXlCMxy","L7cGcgf8rI","AXpwEhUTw7",
+"IRh48KZamH","pAhR15IhmG","XyPZNhSSvQ","atef2tAOsr","pWiOsVBjhz","wDajXix74r","S77LH16lHc","FnPFBM6qcG","2TRI7oQ87r","aL6AJcQOnv",
+"VerEA5VZjS","8hJdt5ZaEz","e6e4zzqH0W","Q6hMCGrDg7","uN6r3aL6AJ","t98iWjiVBP","tuDySQWxoT","jzUqRyvOMI","NAFuwfLNg8","fqypyaDGtS",
+"SbRYyoQ87r","jtn0X7ku1p","a00b5NAFuw","6q6L9QWxoT","9rlg955rfB","JRJQBMmKGJ","3weIFlXFOB","Ss0ZuNxx9V","FcWrWoVQp6","gdQsSnlaBy",
+"he9IAbgJAz","piJSko8Uyd","lpF6WOxWIH","fcwDayvOMI","0BmCyTCgPp","Yh1hFAkKTk","m4bxULewvM","SjskQe6e4z","Cfgr3qaofN","MaJQsFxX9q",
+"Kr8yshi5X7","dhSuHKr8ys","nnP8oMK07Y","d85a9azIWp","x3LDeWreyP","CK5W7LbRTH","Y1mC0zqH0W","MGlTFlsQGo","5nmWv29QAz","gIYvEFGzgp",
+"ciuWzuJScX","rKDLJNxx9V","dhSuH9GXkX","KASQ8pmeCd","L7cGcWMiS3","QbxXczHF1q","5Drn0DLhzM","1v5hHJXljW","cL0aErz7Ut","BCxeCAgJHQ",
+"7fsYMUvlv4","RmDcr2DREs","atef2HP433","7X3uySmGzv","0Kyfss4786","iwzGkiqv4k","WDVWJnFqik","ulk41uAWyp","k85AeogLgc","ksJbyDLhzM",
+"brhlQi3pyd","M6qcGQ6hMC","8TxD7ogLgc","fcwDaCNHmv","PYBf4D6rBy","TCgPpQssNC","MojnPFhtgl","he9IAIRh48","oGu6x9iGoT","bZLvSPOUYS",
+"4W0TlUl4a1","pT8wu9y4lw","TCgPphi5X7","atef2oGu6x","6q6L929QAz","9y4lwqaofN","Zv7z0iKqhr","yEfy99XyT9","Cp3mZyToGW","2TRI7uZPqg",
+"fFDrJVIlwP","pAhR1nnP8o","e6e4zwiHrZ","EdBKcFxX9q","rz7UtlCMxy","rhl0J7ku1p","FLsph5ZaEz","t59lR8U2nU","9rlg9QYxC0","lpF6WjiVBP",
+"WreyP9y4lw","okgRifLNg8","OUYuFAmdQd","DQimppv0i7","hSSvQ7ku1p","ulk41v2eC3","0h1b1No0Qb","618DiaL6AJ","FcWrWHRxd8","pFrrlPOUYS",
+"brhlQNcICA","1j5L8QssNC","VIlwPfmIK1","16lHcD6rBy","atef25ZaEz","FPfSEKZamH","BCxeC5VZjS","pT8wua00b5","fFDrJM3zXL","3otm6FGzgp",
+"RmDcr07n1c","lj07QFxX9q","DcpWBtuDyS","uupzk9XyT9","tlILtlCMxy","W7cTsTa8f6","WreyPStlDJ","s93MlzqH0W","hSSvQRsQUq","RkQkemz8gx",
+"1v5hHjtn0X","lj07QUlU3M","zQt6Q4dEz6","ThjNn9GXkX","9GXkXFFDui","cShY2Z4I1v","iwzGkRkQke","gdQsScmXIX","TCgPpa00b5","IBe8k16lHc",
+"YOfrYHlUbF","Nxx9VWPmlx","ZzJHWa00b5","HP4338FmFH","x3LDeDQimp","i7WMQtlILt","Q6hMCNAFuw","UmaEvLewvM","AXpwEZv7z0","TXQ0ZCfgr3",
+"dmoS7yluBx","n1pmOuPX7G","xciqpn1pmO","uvf7AjfREu","i3pydHlUbF","sqVrflXFOB","Uvlv40PktI","AIYUuCNHmv","zHF1qbrhlQ","NhXduFhtgl",
+"MK07YCK5W7","GrDg7Uvlv4","dpe1vvLsmS","k85AebZLvS","2TRI7qQxHP","FLsphVjCZq","bgJAzfmIK1","HfyNQlXFOB","8FmFHDLhzM","8hJdtru4UG",
+"ksJbyJkzUn","QWxoTYOfrY","POUYS1j5L8","G1RhSiwzGk","0Wr5yQworu","fmIK1yvOMI","WreyPIn3NS","o8UydQ6Lix","0ao3lMkgy8","nFqikmz8gx",
+"XflUquPX7G","BGaQYdhSuH","EOE1oC2Irc","n1pmOVjCZq","EOE1oi3pyd","2TRI77Ow5C","uN6r3v1Hln","OHaBzWMiS3","MmsIoPOUYS","Cp3mZfqypy",
+"Dz1R3Z4I1v","tjQxsksJby","5IhmGlj07Q","n8pJ97hyVv","s93MlCqqaD","MmsIonFqik","KZamHCxVEf","hE1QlyluBx","K4GS8ZhwG1","Uvlv4RpBQm",
+"gf8rI4QMc9","ogLgcFPfSE","kB5nPYh1hF","FnPFBK20wK","C2IrcWPmlx","M3zXLdmoS7","5ZaEziqv4k","jfREuAIYUu","lCMxy0Kyfs","1v5hHS2Dfu",
+"BFkb8xReec","ZzJHWSWfou","48cHL24ARF","J2mQiY1mC0","OHaBzfcJOy","mz8gxs7Mxk","iqv4kWPmlx","i3pyddhSuH","ix74rCIShG","jeskSuAWyp",
+"CdyBV2Yz7E","v8yFN4W0Tl","GXdoHprNT6","Pb1pafcwDa","e6e4zuAWyp","0MR5Xuupzk","b29RJiwzGk","24ARFBpYhV","ZUnqtgdQsS","S2DfulH1kt",
+"hUTw7JRJQB","nlaBys7Mxk","DQimpxXTI4","CK5W7Chuy3","e6e4z7fsYM","UlU3Me6e4z","FjHXRThjNn","BpYhVWreyP","KsjRKlXFOB","9XyT9Fhtgl",
+"Cfgr3piJSk","5Mg9rQssNC","Q6LixZ4I1v","7ku1phUTw7","9XyT9aez9y","S77LHYOfrY","2hEEUSmGzv","0YAGHFhtgl","29QAzlViBv","qUJMdaDGtS",
+"uQIczD6rBy","GrDg70Wr5y","Uvlv4pWiOs","lj07QOUqFM","faHir8RCUA","tuDySOUYuF","4W0Tlru4UG","uvf7AKr8ys","Zv7z0y94nw","b29RJDLhzM",
+"JRJQB7fsYM","5IhmG6q6L9","AXpwEPOUYS","e6e4zpT8wu","RkQkezHF1q","ciuWzEoToP","8xEKzni2v1","lweGy7hyVv","M6qcGFjHXR","Vprf2MaJQs",
+"uupzkd7vjM","oQ87rG1RhS","vkCHH4dEz6","aL6AJJ2mQi","S77LHmX2GE","G1RhSC2Irc","SmGzvKsjRK","pFrrl0BmCy","ReKEWv2eC3","VIlwPAOgEe",
+"dpe1v6q6L9","yluBxG1RhS","wDajXRsQUq","mX2GENxx9V","VerEA8xEKz","ni2v1t98iW","In3NSQnJ1S","yEfy9FGzgp","SmGzvRsQUq","Mkgy8dpe1v",
+"jSjS3gjUTu","lpF6WX6Pin","SbRYyMmKGJ","HfyNQy94nw","aFFssTwano","t59lRIRh48","Oz8yZVjCZq","jzUqRuTacx","VNCPd2TRI7","7ku1puQIcz",
+"4QMc9KsjRK","OUYuFtaOXK","VBjhzIjTwP","tl72WtvdkD","DLhzM5VZjS","U3yw5bZLvS","SjskQdpe1v","3otm6RkQke","0h1b1xReec","FPfSEd7vjM",
+"v2eC364s8N","VBjhzbrhlQ","RxrsmTXQ0Z","AgJHQAIYUu","WDVWJiqv4k","soy9tEdBKc","14FLRpFrrl","Cp3mZv8yFN","wDajXlsQGo","hE1QlFVMxo",
+"WaWsvNAFuw","ix74rv2eC3","azIWp5IhmG","uJScXWDVWJ","JkzUnjS1aj","jeskS8cVD3","zqH0WUmaEv","J2mQiFhtgl","HRxd8W3VFH","vLsmSRBhp0",
+"hE1QlyEfy9","MK07YK20wK","NcICASs0Zu","KsjRK6AFT0","JIqXiaFFss","L7cGcMmsIo","5Mg9r2Nslm","VjCZqfFDrJ","FLsphuupzk","EdBKcnlaBy",
+"vkCHHKZamH","HzZT8mz8gx","uPX7GQYxC0","ZhwG1FFDui","CdyBV4W0Tl","TXQ0ZcQOnv","uN6r3AIYUu","FnPFBuLtKs","YjB9tdmoS7","suY4xaFFss",
+"0ao3lCfgr3","1j5L8WmadA","4dEz6v1Hln","4QMc9F6PT2","MGlTF4QMc9","n1pmODcpWB","45cIH3otm6","618DiQWxoT","S77LHM6qcG","qaofNhe9IA",
+"NcICASWfou","ydG8U2DREs","CdyBVyofH3","0BmCyjfREu","WPmlx7lUXZ","uQIczY1mC0","WPmlxFxX9q","5Drn0BGaQY","mX2GEjfREu","VBjhzzY1GY",
+"8U2nUtlILt","b29RJGWqqX","In3NSHfyNQ","K20wK5Mg9r","GWqqXcShY2","SbRYyFLsph","euZA5tjQxs","aFFssGSQwj","K20wKW3VFH","JXljWM6qcG",
+"UmaEvYw2oU","DLhzMKsjRK","M6qcGFLsph","jS1ajBCxeC","lsQGo6AFT0","pFrrlDz1R3","WDVWJjSjS3","MezSWvOqCE","ZJTXHix74r","hSSvQrz7Ut",
+"KASQ8Fhtgl","taOXKhSSvQ","D6rBy2TRI7","DcpWBgjUTu","fqypycQOnv","FGzgpKsjRK","uupzk5Drn0","v1Hln16lHc","kB5nP7fsYM","7Ow5ClsQGo",
+"tl72WdmoS7","3otm6ZuDtD","14FLRHP433","zbIYYRmDcr","uLtKspiJSk","aez9y8TxD7","qQxHP2TRI7","prNT6BbwgA","uupzkfFDrJ","O3iyQ14FLR",
+"WreyPy94nw","uJScXt59lR","jtn0XkZANm","ciuWzY1mC0","GSQwjM6qcG","L7cGcKZamH","WaWsvMm8si","pT8wupFrrl","iKqhrqaofN","RkQkehE1Ql",
+"lkMUAUl4a1","S77LHa00b5","nFqikSs0Zu","9GXkXuvf7A","t59lRqUJMd","Yw2oUUvlv4","0MR5XDcpWB","SWfou5IhmG","QbxXclj07Q","uLtKs7fKYU",
+"bZLvS24ARF","DcpWB7lUXZ","zHF1qRpBQm","MezSWRpBQm","cmXIXv1Hln","b29RJAIYUu","OUYuFFNYIM","LDk6fvLsmS","XflUqblLA9","Yw2oUK20wK",
+"dpe1vK20wK","FhtglxReec","JkzUnEdBKc","2DREs5Mg9r","yluBxsoy9t","7ku1prhl0J","AXpwEvLsmS","2TRI7wDajX","FjHXR7hyVv","yofH3wiHrZ",
+"7fKYUblLA9","oVQp6lj07Q","4QMc9Waim6","uPX7G618Di","2hEEUOUqFM","hSSvQbgJAz","uupzkQssNC","piJSkaL6AJ","uupzkBGaQY","618Di45cIH",
+"OxWIH0Wr5y","he9IAYjB9t","EoToP3otm6","0MR5Xrhl0J","fmIK1tjQxs","t98iWVBjhz","L7cGc55rfB","uQIczwiHrZ","SWfouIRh48","HlUbFqaofN",
+"G1RhSB3qem","YOfrYgf8rI","RACujcmXIX","cQOnv8U2nU","uvf7A5Mg9r","VerEA4QMc9","ksJbyzz4ZU","zHF1qWmadA","a00b5gtCA5","euZA5HRxd8",
+"zHF1qO3iyQ","jeskS55rfB","pv0i72ZHdk","d85a9Zv7z0","9eoRczHF1q","7fsYM5nmWv","MmsIoZJTXH","aFFssqUJMd","3weIFBpYhV","lpF6WzQt6Q",
+"S77LHwiHrZ","iB08lulk41","l83Ud0h1b1","GXdoHZhwG1","dhSuHuupzk","QWxoTd85a9","sqVrfuAWyp","JkzUnBbwgA","Ta8f6W3VFH","qQxHPGXdoH",
+"v8yFNAOgEe","0MR5X6q6L9","RkQkeDz1R3","IBe8kEoToP","2Yz7EOz8yZ","OxWIHIBe8k","SjskQ45cIH","RxrsmWDVWJ","Yf2EchSSvQ","o8UydlpF6W",
+"cmXIXNxx9V","uoStwguMb8","ni2v18FmFH","OUYuFiwzGk","uupzklH1kt","ZzJHWChuy3","7hyVvG1RhS","Gv3Fq9XyT9","ciuWzXyPZN","AOgEeciuWz",
+"gtCA5ru4UG","aFFssHzZT8","0YAGHlXFOB","pvgjSs93Ml","8xEKzpT8wu","lweGyMK07Y","wDajXJKWYR","6q6L9djsrv","MK07Yrhl0J","xXTI4VNCPd",
+"aL6AJogLgc","jeskSEdBKc","fcwDa1LB1L","VIlwPuN6r3","m4bxUMaJQs","O3iyQlViBv","xXTI4xReec","4W0TlpFrrl","Q6LixEOE1o","RACujWMiS3",
+"LDk6ftuDyS","QClRLRzaZA","hi5X7ZuDtD","Yw2oUL7cGc","ciuWzBbwgA","SjskQFwEJz","0Kyfssx5Gl","0h1b17fsYM","yofH3tvdkD","FVMxoQClRL",
+"5Drn0uvf7A","AkKTkChuy3","CqqaDKASQ8","yvOMImz8gx","hYBCKZUnqt","QClRLUl4a1","tuDyS7hyVv","SWfouYw2oU","vOqCEGSQwj","DLhzMSjskQ",
+"QChxsQnJ1S","s93MlMmsIo","uAWypQ6Lix","OUYuFQClRL","bZLvSSjskQ","tAOsr2Nslm","taOXKqaofN","Twano7Ow5C","HlUbFVIlwP","Ul4a1jtn0X",
+"MezSWVprf2","xciqpNhXdu","QClRLQworu","9iGoTnlaBy","RmDcrGWqqX","lH1ktzz4ZU","ThjNnwiHrZ","gf8rI6q6L9","jfREu0Kyfs","MmKGJ5drc6",
+"Cp3mZfaHir","WreyPQYxC0","e6e4z0YAGH","Nxx9VSjskQ","C2Irctl72W","kZANm64s8N","Y1mC0ZzJHW","tuDySYjB9t","Yw2oUHP433","jfREuBFkb8",
+"o8UydMmKGJ","6q6L95nmWv","bgJAzP6bcg","gtCA5TXQ0Z","a00b5Twano","POUYSJKWYR","gtCA5oQ87r","0ao3lhUTw7","Chuy3C2Irc","14FLRECMvU",
+"FLsph0PktI","he9IAOz8yZ","3weIFjSjS3","Kr8ysBpYhV","fcwDajiVBP","uvf7Ai7WMQ","pWiOsOz8yZ","hi5X7pAhR1","P6bcgzY1GY","FFDuigtCA5",
+"P6bcgJKWYR","FNYIMrhl0J","14FLR48cHL","taOXKVprf2","gjUTu5Namm","hE1QlFjHXR","sqVrfZJTXH","0h1b1FNYIM","zFgtBatef2","2DREs55rfB",
+"fcwDaIn3NS","CdyBV0MR5X","W7cTsDcpWB","DQimpHP433","EoToPuJScX","GXdoHQChxs","ydG8UuN6r3","POUYSReKEW","fqypyCdyBV","7ku1ppT8wu",
+"Yw2oUSWfou","b29RJjS1aj","0PktIlm0pD","TwanoZ4I1v","LDk6fJ2mQi","MezSWMK07Y","v8yFNpWiOs","G1RhSMojnP","zHF1qk85Ae","5ZaEzfcwDa",
+"cL0aEY1mC0","t59lRUlU3M","29QAzy94nw","uTacxWaWsv","GrDg7FxX9q","vOqCEn1pmO","7fsYMfLNg8","uPX7GhYBCK","hYBCKuoStw","AmdQdru4UG",
+"s93MlyEfy9","zz4ZUYw2oU","9eoRcuoStw","euZA5cL0aE","4QMc9VIlwP","d85a99GXkX","5nmWvCxVEf","tuDyS2Nslm","euZA5IjTwP","RsQUqfqypy",
+"ThjNnulk41","7X3uyFLsph","2DREsix74r","KZamHIBe8k","OUqFMKZamH","zHF1q2hEEU","TXQ0ZdmoS7","POUYSK4GS8","0h1b1rz7Ut","blLA9D6rBy",
+"NhXdu48cHL","wDajXQYxC0","AOgEeHP433","618DiNAFuw","4W0TlBGaQY","8TxD7oGu6x","Oz8yZVNCPd","lViBvP6bcg","gIYvEMkgy8","FjHXRQYxC0",
+"djsrvDQimp","ZuDtDpT8wu","7fKYUtuDyS","tl72WD6rBy","l83UdThjNn","SbRYyuvf7A","7fsYMtvdkD","AmdQd6q6L9","14FLRtuDyS","Twano9XyT9",
+"0YAGH0Wr5y","3weIFatef2","I7p2aHP433","JXljWblLA9","vkCHHMm8si","J2mQi16lHc","Rxrsm5iGN5","VNCPdmX2GE","uLtKsJXljW","9iGoTBbwgA",
+"ZJTXHU3yw5","Mkgy8suY4x","9rlg9suY4x","vLsmS4dEz6","In3NSt59lR","POUYSxXTI4","fcwDaX6Pin","JIqXiQbxXc","HP433NhXdu","OxWIHjSjS3",
+"QYxC0EOE1o","55rfBNhXdu","7ku1pni2v1","fFDrJCxVEf","iKqhrCp3mZ","BpYhVMK07Y","uPX7GLbRTH","G1RhSHP433","oGu6xuJScX","RACujyEfy9",
+"KASQ85VZjS","jtn0XnnP8o","GWqqX580YD","9y4lw1LB1L","OHaBz14FLR","VjCZqYh1hF","jS1ajt59lR","F6PT2SbRYy","rz7UtYh1hF","TwanogjUTu",
+"CdyBVa00b5","RsQUqP6bcg","JJs5mSs0Zu","YjB9tOz8yZ","MK07Y9GXkX","JIqXia00b5","m4bxUK4GS8","F6PT2brhlQ","iB08lW3VFH","0KyfsDQimp",
+"gtCA5Qworu","SmGzvU3yw5","JXljWnFqik","QssNCt59lR","5IhmGx3LDe","iKqhrFwEJz","8TxD7MaJQs","taOXKgdQsS","GXdoHmz8gx","PYBf4aDGtS",
+"07n1clCMxy","VIlwPaFFss","rhl0JQ6Lix","GSQwjKZamH","bZLvSkB5nP","NhXdue6e4z","5Mg9ryvOMI","55rfBSjskQ","hi5X7uJScX","aFFssdpe1v",
+"NcICAjSjS3","MK07Yix74r","IBe8kcL0aE","yofH3suY4x","rhl0JCdyBV","EdBKc1LB1L","sqVrfChuy3","P6bcgRpBQm","5nmWvuN6r3","1j5L85iGN5",
+"AOgEeGrDg7","iKqhrZUnqt","jfREuLbRTH","WDVWJ7fsYM","Twanox3LDe","cmXIXQbxXc","ZhwG1QbxXc","In3NS9GXkX","cQOnvv1Hln","v1HlnjfREu",
+"uQIczjeskS","FNYIMZhwG1","HlUbFBbwgA","okgRiZv7z0","dQ586s7Mxk","uLtKsX6Pin","7lUXZxciqp","Z4I1vs4786","WPmlxlViBv","MK07YEOE1o",
+"0MR5XnlaBy","IKxdLfqypy","lViBv8cVD3","iB08lblLA9","FGzgpDz1R3","UlU3Mtl72W","gdQsStaOXK","cmXIXRzaZA","TwanotvdkD","BpYhVfFDrJ",
+"FxX9qpFrrl","uoStw2hEEU","G1RhSIn3NS","QssNCMojnP","guMb8lViBv","Yh1hFo8Uyd","pWiOsG1RhS","IRh48prNT6","NOHszBFkb8","RpBQmpWiOs",
+"16lHcuPX7G","J2mQinnP8o","lj07QzqH0W","NOHszxReec","a00b5ni2v1","pvgjSKsjRK","GSQwjBpYhV","uAWypiwzGk","POUYS14FLR","VerEA14FLR",
+"jS1aj0PktI","xXTI4GXdoH","MaJQs4dEz6","FPfSE9rlg9","DQimplkMUA","WreyP5drc6","RACujU3yw5","cmXIXt59lR","hYBCKVjCZq","9eoRckZANm",
+"yluBxulk41","vOqCE9XyT9","t98iWMojnP","lXFOBQ6hMC","P6bcgHRxd8","64s8NcShY2","FVMxoM6qcG","Oz8yZru4UG","lViBvcShY2","4QMc9uvf7A",
+"ZJTXH9XyT9","yEfy9VerEA","cL0aEDcpWB","0Wr5yBGaQY","KsjRKo8Uyd","9XyT9yToGW","Mm8sis7Mxk","55rfB8xEKz","oGu6xRmDcr","hi5X7xXTI4",
+"J2mQiEoToP","zmLYDIRh48","Mkgy8yToGW","HlUbFCp3mZ","dhSuH5Namm","GSQwjv8yFN","Ul4a1Ss0Zu","BFkb8CNHmv","pv0i7JIqXi","MaJQslXFOB",
+"tAOsrpWiOs","d7vjMCp3mZ","bgJAzmX2GE","NhXdufcJOy","uJScXQ6Lix","zqH0W8TxD7","9XyT9BGaQY","K4GS80YAGH","l83Udlm0pD","hUTw7Zv7z0",
+"JkzUn0h1b1","LewvMUmaEv","fmIK116lHc","zmLYDlXFOB","nlaByWaim6","5NammAgJHQ","yToGWpv0i7","zHF1qdQ586","GSQwjO3iyQ","MGlTFGSQwj",
+"M6qcGMm8si","gjUTuNcICA","t59lRzY1GY","uTacx6q6L9","uAWyphe9IA","FwEJzQChxs","P6bcg4dEz6","QWxoTPYBf4","2DREsjzUqR","BGaQYiwzGk",
+"OUYuFtuDyS","No0Qb14FLR","x3LDeZuDtD","PYBf48TxD7","8RCUAkB5nP","fLNg8iqv4k","atef2lj07Q","AXpwENOHsz","pWiOsPYBf4","9GXkXoVQp6",
+"NAFuwJ2mQi","FwEJzP6bcg","uupzkhUTw7","jS1ajJ2mQi","7lUXZ0MR5X","jiVBPCxVEf","I7p2a5Namm","vkCHHIBe8k","dhSuHTXQ0Z","uJScXEOE1o",
+"Pb1pa07n1c","zQt6QpT8wu","Uvlv4RACuj","fqypyVIlwP","Ta8f6FnPFB","HzZT8pv0i7","s93Ml8RCUA","POUYSn1pmO","i7WMQFFDui","ZJTXHt59lR",
+"cL0aEUmaEv","tuDySt59lR","QbxXcxReec","VNCPdNcICA","7Ow5CZhwG1","ciuWzwDajX","2DREseuZA5","jzUqRIKxdL","StlDJOxWIH","S77LHzHF1q",
+"UlU3MPb1pa","DQimpQClRL","h1zcHtlILt","ciuWzCNHmv","yToGWoQ87r","Y1mC0x3LDe","suY4x7lUXZ","7hyVvVBjhz","QYxC0NOHsz","tjQxsni2v1",
+"ZJTXHpmeCd","HlUbFuoStw","QClRLKASQ8","3weIFWreyP","nFqikyofH3","NOHszVIlwP","NAFuwxReec","ksJby2Yz7E","ix74rv1Hln","HzZT8s7Mxk",
+"v1HlnCxVEf","No0Qbpv0i7","pWiOs8xEKz","5nmWvWMiS3","m4bxUWmadA","uoStwaL6AJ","C2Irc07n1c","mz8gxiKqhr","FVMxohe9IA","8cVD3JXljW",
+"s93MlfaHir","CxVEfs93Ml","GWqqXlweGy","RzaZAJkzUn","sx5GljSjS3","W7cTsQ6hMC","gtCA5s93Ml","8U2nUAIYUu","nlaBy0ao3l","Mkgy8okgRi",
+"C2IrcZzJHW","WMiS3WmadA","cmXIXfcwDa","fLNg8Twano","NhXdufLNg8","StlDJjS1aj","IKxdL7fsYM","J2mQiFPfSE","blLA9IjTwP","kZANmX6Pin",
+"guMb8sx5Gl","Yh1hFpT8wu","WmadAjSjS3","xReecyvOMI","cShY2KsjRK","VjCZq5Drn0","Pb1paECMvU","cShY248cHL","jfREuEoToP","lkMUA16lHc",
+"Ss0Zu0PktI","LDk6fLDk6f","cShY22ZHdk","48cHLlCMxy","JXljWYf2Ec","16lHcqUJMd","VNCPdS2Dfu","i3pydWreyP","VLTy6W7cTs","MK07YYh1hF",
+"9GXkX3weIF","tvdkD2DREs","mX2GEBbwgA","zmLYDIKxdL","zqH0WWMiS3","Cfgr39eoRc","pT8wuW7cTs","7fKYUQbxXc","tuDySd85a9","OxWIHAmdQd",
+"vOqCEuupzk","EOE1ouLtKs","W7cTsWaWsv","Pb1patjQxs","dhSuHCfgr3","5Drn0M6qcG","bZLvSQbxXc","X6PinBpYhV","rz7UtCxVEf","euZA58RCUA",
+"qaofNBFkb8","In3NSOxWIH","QbxXc14FLR","FxX9qaez9y","8xEKznlaBy","ciuWz45cIH","lCMxynlaBy","MmsIofcwDa","0Wr5yBpYhV","pWiOsOUqFM",
+"VLTy6MGlTF","AmdQdPYBf4","gIYvE8U2nU","dpe1vmz8gx","0BmCypFrrl","BbwgARBhp0","9GXkXJIqXi","fmIK1zmLYD","gIYvE5VZjS","n8pJ9b29RJ",
+"Cp3mZRBhp0","VjCZq1LB1L","CK5W7tvdkD","FLsphciuWz","qUJMdlsQGo","D6rByJIqXi","lsQGoKASQ8","iwzGkfaHir","6q6L9W3VFH","aez9y7lUXZ",
+"okgRiZJTXH","0h1b10MR5X","lweGyuN6r3","VjCZqBpYhV","7Ow5ChE1Ql","DQimpv8yFN","FjHXRuAWyp","K20wKuN6r3","4QMc9X6Pin","Mkgy807n1c",
+"fFDrJChuy3","ydG8UhYBCK","BGaQYGXdoH","ThjNn580YD","Zv7z0zHF1q","FxX9qD6rBy","HzZT8K20wK","ydG8URxrsm","iKqhrs4786","IKxdLEdBKc",
+"AIYUu0Wr5y","nFqik0BmCy","ThjNnWaim6","KsjRKMmKGJ","No0QbQ6Lix","t59lRAXpwE","d85a9AgJHQ","pmeCdwiHrZ","3weIFCqqaD","G1RhSTwano",
+"C2IrcK4GS8","Cp3mZHlUbF","pv0i7Ul4a1","In3NSJKWYR","HfyNQe6e4z","azIWpPYBf4","i7WMQhUTw7","UmaEvCfgr3","MezSWFNYIM","zqH0W5Mg9r",
+"14FLRAIYUu","YOfrYqQxHP","lj07QHP433","gIYvEP6bcg","ZhwG1qQxHP","NAFuwlj07Q","fcwDa5Mg9r","gtCA5RkQke","ni2v16AFT0","W7cTsogLgc",
+"uupzkAOgEe","FwEJzaDGtS","CIShGhSSvQ","SmGzvK20wK","tl72Wy94nw","okgRiNhXdu","MmsIoX6Pin","1v5hHhUTw7","x3LDeFjHXR","iqv4kGrDg7",
+"v1HlnAgJHQ","5nmWvbZLvS","AgJHQFcWrW","zmLYDFhtgl","YOfrYd85a9","VIlwPQbxXc","QWxoTtuDyS","IKxdLtl72W","RpBQmgIYvE","lsQGod85a9",
+"guMb83otm6","QbxXcMGlTF","HRxd8WMiS3","hE1QlSmGzv","U3yw5guMb8","nFqik4W0Tl","sx5GlGSQwj","yEfy9BFkb8","jSjS3NAFuw","tAOsrFcWrW",
+"tAOsrZv7z0","7Ow5Ci7WMQ","XflUqni2v1","FPfSE6q6L9","LewvMRxrsm","ZhwG14W0Tl","07n1cEoToP","iKqhrhUTw7","Yh1hFNAFuw","AOgEet98iW",
+"aL6AJuTacx","guMb8s93Ml","WmadAuvf7A","4dEz6AmdQd","S77LHD6rBy","vkCHHsoy9t","RpBQm3otm6","hi5X7Fhtgl","rz7UtWmadA","jiVBPOHaBz",
+"faHirYh1hF","5VZjSgjUTu","FxX9qni2v1","n1pmO29QAz","nnP8oHzZT8","iB08lNcICA","ZzJHWSjskQ","nnP8os4786","1LB1LpT8wu","D6rBypFrrl",
+"7fsYMe6e4z","xReecuAWyp","yEfy9mX2GE","nnP8oP6bcg","Yh1hFk85Ae","lm0pDuvf7A","WaWsv6AFT0","FFDuiuoStw","t59lRF6PT2","ZuDtDFwEJz",
+"lCMxyh1zcH","fqypyJJs5m","vOqCEjiVBP","Fhtgltl72W","pWiOsWMiS3","IBe8kBpYhV","qaofNZ4I1v","KZamHOz8yZ","JRJQBJkzUn","Chuy3zFgtB",
+"UmaEvFxX9q","Pb1paBbwgA","djsrvFFDui","gdQsSyEfy9","5IhmGZzJHW","FFDuipmeCd","MK07Yd85a9","Chuy3ZhwG1","uN6r3MezSW","AmdQdni2v1",
+"kB5nPjS1aj","0MR5XFFDui","5NammMkgy8","wDajXDz1R3","9GXkXMmsIo","16lHcXyPZN","RACujFjHXR","uLtKsgIYvE","jzUqRAXpwE","FPfSEru4UG",
+"sqVrfzmLYD","qQxHPO3iyQ","gf8rI9XyT9","FNYIMFPfSE","Mm8siHP433","sx5GlfLNg8","fFDrJCK5W7","BpYhV2Yz7E","4QMc9G1RhS","qQxHPMezSW",
+"FGzgpokgRi","U3yw5AIYUu","BCxeCJkzUn","DG4sTcShY2","zFgtB0YAGH","AmdQdx3LDe","DQimpFPfSE","x3LDeMK07Y","CNHmvmX2GE","uTacxTXQ0Z",
+"azIWpRkQke","FPfSEqQxHP","KZamHW3VFH","cShY2ogLgc","MojnP9eoRc","zFgtBDG4sT","dQ5865VZjS","8hJdtbZLvS","zbIYYHP433","LDk6fzmLYD",
+"HRxd8zmLYD","VjCZqF6PT2","RzaZA2DREs","zz4ZUv2eC3","Q6hMC64s8N","CqqaDbrhlQ","DcpWBtAOsr","Ss0Zumz8gx","FPfSEjtn0X","L7cGc2TRI7",
+"Dz1R3atef2","RkQkeSbRYy","Dz1R3DcpWB","IKxdLeuZA5","CNHmve6e4z","MmKGJGXdoH","yEfy9hSSvQ","azIWpuN6r3","yEfy9VIlwP","3weIF16lHc",
+"GSQwj9y4lw","EOE1od85a9","BbwgAuJScX","Mm8siGWqqX","Q6hMCcmXIX","Zv7z0pFrrl","yToGW9y4lw","t98iWrz7Ut","uZPqgQ6Lix","16lHctlILt",
+"POUYSBFkb8","uoStwBCxeC","8TxD7MmsIo","EoToPBbwgA","5nmWvI7p2a","XflUqRmDcr","4QMc9WDVWJ","fcwDaQChxs","rKDLJtvdkD","LbRTHuvf7A",
+"lH1ktvkCHH","U3yw55VZjS","5VZjS9eoRc","he9IAtlILt","ZhwG10PktI","he9IA7fsYM","9y4lw8FmFH","uupzkhYBCK","okgRib29RJ","m4bxUydG8U",
+"n8pJ9piJSk","5drc6UmaEv","uN6r3Ss0Zu","rKDLJb29RJ","lXFOB1j5L8","UmaEv2Yz7E","bgJAz3otm6","iwzGkK4GS8","VBjhz618Di","e6e4zzmLYD",
+"8FmFHuPX7G","X6PinTCgPp","xReecTCgPp","OUqFMAIYUu","6q6L9v8yFN","vLsmSVjCZq","S2DfuJKWYR","fmIK1uoStw","b29RJlkMUA","rz7Utpv0i7",
+"8FmFH5nmWv","MezSW7hyVv","NOHszjS1aj","oVQp6lweGy","OHaBzHP433","5drc6SWfou","cQOnv7fsYM","7ku1ppvgjS","ru4UGPYBf4","0MR5XAIYUu",
+"bZLvSAXpwE","MmKGJ0Kyfs","pAhR1LDk6f","24ARFEOE1o","MaJQsuAWyp","k85AeuAWyp","QssNCvLsmS","tl72WYjB9t","OxWIHlm0pD","pv0i7zFgtB",
+"uN6r3Z4I1v","atef2WmadA","VNCPd5iGN5","xciqpni2v1","IKxdLtvdkD","Chuy3QWxoT","JKWYRK4GS8","uAWypyEfy9","XflUq4W0Tl","8RCUAt98iW",
+"SWfou8TxD7","ZUnqtKASQ8","WPmlxlsQGo","ZuDtDn1pmO","UlU3MP6bcg","4QMc9x3LDe","lCMxy0h1b1","JRJQBkZANm","I7p2aGSQwj","fFDrJ5Drn0",
+"VIlwPuAWyp","OxWIHOUqFM","AOgEed85a9","UmaEvI7p2a","K20wKL7cGc","uLtKs0MR5X","29QAziwzGk","07n1cVIlwP","7fsYMBCxeC","7hyVv2ZHdk",
+"I7p2aNAFuw","DG4sTYh1hF","Vprf2zY1GY","Y1mC0d85a9","ciuWzU3yw5","iB08lRsQUq","gtCA51j5L8","2TRI77hyVv","uoStwnnP8o","0PktIMmsIo",
+"vLsmSCfgr3","WMiS3NhXdu","SbRYyuAWyp","dmoS7qQxHP","Waim6zmLYD","pAhR1nFqik","No0Qb0MR5X","SWfouEdBKc","IjTwPCp3mZ","ksJby580YD",
+"OxWIHDG4sT","FxX9qjtn0X","GXdoH618Di","1LB1LSmGzv","Yw2oUfcwDa","9y4lwjfREu","8FmFHLbRTH","8hJdtJRJQB","J2mQiVprf2","JXljWQ6Lix",
+"AmdQdi7WMQ","JkzUnydG8U","uvf7AokgRi","S77LH29QAz","pvgjSGrDg7","rz7UtOHaBz","jS1aj4QMc9","uZPqgReKEW","MezSWaL6AJ","Dz1R3Ss0Zu",
+"Yw2oUfmIK1","HfyNQ618Di","HlUbFprNT6","Ss0ZuHzZT8","NAFuwHlUbF","FwEJzD6rBy","MmKGJy94nw","d85a9LDk6f","M3zXL2DREs","pFrrl1v5hH",
+"Cp3mZuN6r3","0MR5XSWfou","vkCHH4W0Tl","rKDLJVBjhz","HP433s7Mxk","BGaQYIRh48","L7cGcv2eC3","gf8rIgdQsS","CNHmvAgJHQ","QbxXcCdyBV",
+"bgJAzSmGzv","nlaByrhl0J","cL0aEfFDrJ","PYBf4TCgPp","rKDLJi3pyd","0KyfsNcICA","8xEKzPYBf4","soy9t2Yz7E","vLsmSn8pJ9","RACujm4bxU",
+"JJs5mguMb8","4W0TlQworu","HzZT82TRI7","n8pJ9Gv3Fq","U3yw5gIYvE","lpF6WlweGy","o8Uyd8U2nU","lpF6Wn1pmO","oQ87rJXljW","PYBf45Mg9r",
+"zQt6Q5nmWv","pT8wuaFFss","ni2v1mX2GE","9rlg9BFkb8","v8yFNuPX7G","QnJ1SVerEA","K20wKzqH0W","QWxoTqUJMd","618Di8U2nU","ThjNnGv3Fq",
+"MGlTFUl4a1","PYBf4oQ87r","l83UdPb1pa","iB08lIjTwP","K4GS8DQimp","taOXKsuY4x","MK07YZhwG1","xReecSbRYy","GXdoHs4786","tuDySlm0pD",
+"48cHLY1mC0","7hyVvNcICA","5iGN5JJs5m","uN6r3FLsph","5Drn06q6L9","fqypypmeCd","BFkb8lH1kt","8RCUAgf8rI","4W0TlDz1R3","9iGoTni2v1",
+"D6rByfLNg8","W7cTsYjB9t","RACujokgRi","tvdkDXflUq","Mkgy8Uvlv4","MK07Ya00b5","zY1GYzqH0W","jSjS3bgJAz","29QAzVprf2","jtn0XYjB9t",
+"gtCA5WPmlx","5IhmG5VZjS","lpF6WUl4a1","tl72WzqH0W","FnPFBDG4sT","RkQkejfREu","FLsphCfgr3","tvdkDlCMxy","bgJAz8RCUA","Yf2EciwzGk",
+"GrDg7ReKEW","cShY2POUYS","ReKEWGWqqX","8FmFH7fKYU","fLNg8HlUbF","Y1mC0Waim6","DLhzMFjHXR","aFFss07n1c","dhSuHFVMxo","S2DfuCp3mZ",
+"oVQp6O3iyQ","wiHrZJKWYR","iqv4kFnPFB","VLTy6zbIYY","FLsphqQxHP","HRxd824ARF","In3NSlpF6W","uZPqg07n1c","uAWypWMiS3","C2IrcdQ586",
+"sx5GlXflUq","55rfBAmdQd","d7vjMcShY2","lXFOB8TxD7","0KyfsfcJOy","CK5W7HzZT8","D6rByVIlwP","9GXkX8xEKz","brhlQFLsph","5nmWv8TxD7",
+"618DiuPX7G","prNT60BmCy","tuDySe6e4z","gtCA55Namm","S77LHDG4sT","5drc6RkQke","djsrv7Ow5C","QWxoTuTacx","0YAGHciuWz","GWqqXM6qcG",
+"FNYIMHfyNQ","lkMUAAIYUu","4QMc9StlDJ","AgJHQzQt6Q","nFqik7fKYU","WreyPwiHrZ","8U2nUzqH0W","FjHXRs93Ml","ru4UGFhtgl","2TRI7hi5X7",
+"QnJ1S07n1c","bgJAzDQimp","JIqXiogLgc","Cp3mZXflUq","RpBQm5iGN5","gjUTu9eoRc","W3VFHzHF1q","8U2nU7Ow5C","0PktIn1pmO","RpBQmNo0Qb",
+"BGaQYo8Uyd","0Wr5yOHaBz","uoStw5iGN5","5Namm7fKYU","gjUTumX2GE","L7cGcBGaQY","ciuWzzY1GY","J2mQiFnPFB","Fhtgl5ZaEz","KZamHSjskQ",
+"uAWyp5Drn0","fcwDaPOUYS","mX2GELbRTH","tvdkDUmaEv","RxrsmDQimp","7X3uyuupzk","5IhmGMmKGJ","XflUqlViBv","7fKYUjeskS","ciuWzJJs5m",
+"kZANmF6PT2","4QMc90ao3l","ru4UGVerEA","Gv3FqCdyBV","4dEz6hSSvQ","v8yFNZ4I1v","pvgjSMaJQs","2NslmS77LH","8xEKziKqhr","ZuDtDFPfSE",
+"okgRiCp3mZ","C2IrcCNHmv","gjUTuBGaQY","d7vjMFGzgp","n8pJ9JIqXi","9iGoTBGaQY","CqqaDv2eC3","Kr8ys48cHL","HP4336q6L9","RBhp00YAGH",
+"uoStwS77LH","1v5hHdpe1v","oVQp60Kyfs","3otm6rz7Ut","QClRL7ku1p","HzZT8tjQxs","tjQxs7lUXZ","fqypy5VZjS","BCxeCcmXIX","AXpwEjiVBP",
+"D6rBybgJAz","NOHsz8TxD7","Dz1R3UmaEv","OUqFMFnPFB","C2IrcYf2Ec","MGlTFVjCZq","lsQGorKDLJ","RpBQmS2Dfu","LbRTHGSQwj","ThjNnTXQ0Z",
+"I7p2aciuWz","TXQ0ZFNYIM","4QMc9faHir","NcICAgf8rI","F6PT2jeskS","he9IAbZLvS","POUYSU3yw5","YjB9teuZA5","F6PT2lXFOB","48cHLzz4ZU",
+"hSSvQCp3mZ","fcJOyNxx9V","AIYUuWreyP","mX2GEWaim6","AXpwEo8Uyd","HP433P6bcg","24ARFs4786","hYBCKGrDg7","Uvlv48xEKz","48cHLzqH0W",
+"EOE1odmoS7","RsQUq7lUXZ","jzUqR0PktI","RBhp0sqVrf","14FLREdBKc","t59lRpWiOs","48cHLWreyP","zqH0Wlj07Q","6AFT0vOqCE","wDajXpT8wu",
+"lkMUAFcWrW","guMb8ZzJHW","uN6r3ZUnqt","blLA9euZA5","zFgtBOUYuF","K4GS89eoRc","UmaEvPYBf4","FhtglfaHir","n1pmOCqqaD","2TRI7iwzGk",
+"Q6LixLbRTH","suY4x0Kyfs","zqH0Wi7WMQ","45cIH7lUXZ","zQt6QRxrsm","P6bcgk85Ae","MmKGJrhl0J","zFgtBECMvU","yvOMIuTacx","Vprf2OUYuF",
+"LDk6fThjNn","Cp3mZM6qcG","7hyVvOHaBz","uupzkpmeCd","55rfBBGaQY","mX2GEogLgc","WMiS3zbIYY","BCxeCVNCPd","OHaBzJRJQB","gdQsStvdkD",
+"MmKGJgjUTu","Oz8yZtaOXK","Zv7z0piJSk","2NslmThjNn","YOfrYl83Ud","NOHszM3zXL","gtCA5uupzk","rz7Ut0MR5X","Nxx9VUvlv4","ZzJHWfmIK1",
+"prNT6sx5Gl","o8UydprNT6","VIlwPUvlv4","580YDZv7z0","fqypyFNYIM","RpBQmTwano","uoStwCK5W7","vkCHHMkgy8","ni2v145cIH","WreyPoGu6x",
+"PYBf4P6bcg","m4bxUPb1pa","7Ow5CjzUqR","8cVD3GXdoH","xReecDz1R3","5NammnnP8o","TXQ0ZReKEW","5Mg9rCIShG","MGlTFru4UG","AIYUujfREu",
+"5ZaEzS77LH","MojnPlj07Q","KZamHLewvM","HlUbFFNYIM","RsQUqbZLvS","hi5X7NcICA","OxWIHtuDyS","aFFssogLgc","cL0aEOz8yZ","RsQUqb29RJ",
+"Pb1pai3pyd","jfREuXyPZN","s7Mxkn8pJ9","lweGy14FLR","taOXKKZamH","6AFT0atef2","CxVEfLDk6f","CdyBVD6rBy","POUYS8hJdt","azIWpUlU3M",
+"zz4ZUWDVWJ","EoToPVNCPd","S77LHGXdoH","1LB1LRzaZA","djsrv8xEKz","WreyPcmXIX","8cVD3oVQp6","h1zcHSmGzv","9GXkXlkMUA","UmaEvuN6r3",
+"uoStwP6bcg","jtn0XlsQGo","In3NS4QMc9","EOE1oY1mC0","FjHXRdpe1v","zQt6Qn1pmO","EoToPRACuj","t98iWe6e4z","fcJOyzqH0W","NhXdut59lR",
+"tuDySjeskS","pT8wuFNYIM","IKxdLni2v1","RxrsmYOfrY","MaJQsD6rBy","dpe1v6AFT0","EOE1o1j5L8","GWqqXECMvU","RBhp0P6bcg","VIlwP07n1c",
+"zHF1qCqqaD","y94nwYf2Ec","lm0pDLewvM","16lHcpT8wu","0h1b1TXQ0Z","pT8wusqVrf","VBjhzRkQke","aez9y2Nslm","b29RJOxWIH","zQt6Qx3LDe",
+"fcwDaBpYhV","LDk6fJkzUn","fcwDaY1mC0","Mm8siD6rBy","zqH0WxReec","qaofNMK07Y","Vprf2Chuy3","618DiRpBQm","ThjNnKASQ8","VIlwPhE1Ql",
+"GrDg7euZA5","ZUnqtQWxoT","S77LHS2Dfu","CIShGn1pmO","GSQwjlkMUA","Q6hMC5iGN5","Kr8ysoQ87r","7lUXZCIShG","oGu6xv2eC3","Uvlv48cVD3",
+"nnP8ofcJOy","JRJQB0PktI","FVMxociuWz","FhtglKASQ8","dmoS7lCMxy","FnPFBuJScX","6q6L9a00b5","5iGN5MezSW","TXQ0ZoVQp6","a00b5zz4ZU",
+"J2mQifaHir","yofH38xEKz","wDajXOUYuF","AkKTkulk41","dpe1vXflUq","D6rBy9XyT9","ZJTXHOxWIH","tjQxsWreyP","VBjhzjtn0X","zbIYYAgJHQ",
+"tl72WIRh48","BbwgAMaJQs","VjCZqoVQp6","s4786QClRL","K20wKmX2GE","gf8rIY1mC0","FPfSEZ4I1v","WmadA29QAz","Dz1R3kB5nP","atef2gjUTu",
+"DG4sT7X3uy","3weIFuTacx","5drc6U3yw5","2Yz7EBbwgA","nlaByVNCPd","uJScXW7cTs","uJScXUlU3M","UlU3M8xEKz","zmLYDksJby","5Drn0FcWrW",
+"lH1ktpmeCd","wiHrZlj07Q","Yw2oUFhtgl","WPmlxd7vjM","nnP8o5IhmG","nnP8oFwEJz","o8UydDcpWB","uTacxm4bxU","S2Dfu0Wr5y","JJs5mlpF6W",
+"d85a9ogLgc","CqqaDtl72W","ZzJHWEOE1o","WreyPXyPZN","ix74rru4UG","lpF6WqQxHP","Cfgr3AOgEe","7lUXZQworu","0ao3lXyPZN","dhSuHaL6AJ",
+"VjCZqguMb8","kZANmiB08l","tlILtDG4sT","IRh48fqypy","uQIczW7cTs","zY1GYe6e4z","s7MxkL7cGc","atef22Nslm","EOE1o8RCUA","Vprf2PYBf4",
+"lm0pDQ6hMC","yEfy9MK07Y","BbwgAuvf7A","BpYhVl83Ud","FPfSEKASQ8","bgJAzFLsph","tAOsrqaofN","24ARFX6Pin","zQt6QfaHir","rz7UtprNT6",
+"FwEJzgdQsS","i7WMQhSSvQ","CK5W7Nxx9V","L7cGcNOHsz","lj07Q0BmCy","jtn0XeuZA5","zqH0WSbRYy","7fKYUWaim6","7lUXZ7fsYM","yofH3s93Ml",
+"MezSWThjNn","Q6LixPOUYS","s4786lj07Q","OUqFMqaofN","lCMxydQ586","gdQsSDcpWB","QnJ1SFNYIM","tlILtOxWIH","aFFssDQimp","pAhR1faHir",
+"Nxx9Vtl72W","K4GS8No0Qb","fcwDaAIYUu","n1pmOFPfSE","bZLvSsx5Gl","dQ58645cIH","lj07Qrz7Ut","dhSuH7ku1p","0MR5Xni2v1","TXQ0ZWMiS3",
+"7fsYM1j5L8","jSjS3Zv7z0","lj07QIBe8k","J2mQipmeCd","kB5nPs93Ml","YOfrYtvdkD","oVQp6QWxoT","xReec618Di","EOE1oKr8ys","WPmlxUmaEv",
+"hi5X7KsjRK","h1zcHvLsmS","CdyBVFPfSE","KZamHuQIcz","l83UdQnJ1S","n1pmOVerEA","S2DfuTa8f6","FFDuiuPX7G","29QAzm4bxU","jiVBPtaOXK",
+"7ku1pjzUqR","Kr8yse6e4z","Yh1hFaL6AJ","OHaBzdhSuH","gjUTuMmKGJ","580YDLbRTH","MGlTFWPmlx","OHaBzVIlwP","aFFssk85Ae","3otm6aez9y",
+"QWxoT5drc6","Nxx9VOHaBz","h1zcHTa8f6","8U2nUGWqqX","lXFOBs93Ml","ni2v1mz8gx","rKDLJ5VZjS","LewvMBFkb8","vkCHHReKEW","sx5GlVIlwP",
+"Uvlv4L7cGc","yvOMI14FLR","WreyPNxx9V","sx5GlpFrrl","0PktITXQ0Z","AXpwEuN6r3","VLTy61LB1L","guMb85Mg9r","yEfy9t59lR","IBe8kCfgr3",
+"piJSk48cHL","gjUTuVjCZq","580YDsuY4x","oQ87rCqqaD","ru4UG45cIH","pmeCdpv0i7","xciqpgIYvE","rhl0JokgRi","14FLRFNYIM","Chuy3ru4UG",
+"aFFssFVMxo","Q6hMCWreyP","29QAzzY1GY","HP433gtCA5","7lUXZgtCA5","fLNg8FxX9q","OHaBzM6qcG","RsQUqKZamH","SjskQQWxoT","ru4UG0Kyfs",
+"RBhp05VZjS","dmoS7fcwDa","SjskQlCMxy","yToGWGWqqX","YjB9tk85Ae","EoToPtl72W","QbxXcuTacx","sqVrf5Mg9r","faHirGrDg7","uN6r3RkQke",
+"jS1ajksJby","WMiS3NOHsz","hE1QlRkQke","lpF6WNhXdu","48cHL0PktI","kB5nPFhtgl","AIYUuBGaQY","W7cTslH1kt","zmLYDQnJ1S","7X3uyRxrsm",
+"1j5L8NOHsz","8cVD3IjTwP","0YAGHECMvU","Oz8yZYw2oU","B3qemd85a9","16lHcAOgEe","1LB1LlkMUA","pvgjSpiJSk","pAhR17fsYM","GWqqXFnPFB",
+"9y4lwi3pyd","9iGoTG1RhS","FnPFB29QAz","Gv3FqqaofN","X6PinSjskQ","v2eC3lweGy","F6PT2MezSW","FwEJz48cHL","gIYvERxrsm","SjskQjfREu",
+"SbRYyU3yw5","UmaEvXyPZN","VNCPdRsQUq","VerEASWfou","hi5X7PYBf4","mX2GErKDLJ","qQxHPYw2oU","s93MlQ6Lix","X6PinKsjRK","3otm6hUTw7",
+"LDk6f0YAGH","RmDcr4dEz6","m4bxU1LB1L","UlU3MuTacx","b29RJpT8wu","uoStwdhSuH","AgJHQLbRTH","7ku1paez9y","uvf7ARACuj","64s8NLewvM",
+"jzUqReuZA5","NcICANOHsz","kB5nPDQimp","x3LDeChuy3","ZhwG1uupzk","BFkb8o8Uyd","h1zcH4dEz6","aL6AJhi5X7","4QMc9CIShG","Cp3mZwDajX",
+"MK07YyofH3","fqypy4QMc9","fcwDalpF6W","W7cTsWPmlx","uAWyp0PktI","v2eC3Y1mC0","5ZaEz07n1c","taOXKlj07Q","CK5W7hSSvQ","uN6r3uAWyp",
+"jiVBPL7cGc","ZJTXHRACuj","pAhR1Ta8f6","GrDg7XyPZN","OHaBzFhtgl","DcpWB6AFT0","iwzGk07n1c","MK07YlXFOB","F6PT2In3NS","RACujDQimp",
+"X6PinEoToP","AXpwEdhSuH","24ARFFhtgl","VIlwP2hEEU","bgJAzTCgPp","zqH0Wtl72W","K20wKQnJ1S","MK07YlViBv","Pb1pazHF1q","0BmCy29QAz",
+"tvdkDuJScX","ix74rRkQke","SjskQcL0aE","CNHmvsuY4x","CqqaDVBjhz","ZuDtDFVMxo","JJs5m0YAGH","In3NS9iGoT","BpYhVWmadA","m4bxUS77LH",
+"i3pydiqv4k","CqqaDW7cTs","l83Udfqypy","0ao3ljeskS","uvf7Av8yFN","iwzGkJKWYR","mX2GENOHsz","Mkgy8hYBCK","ThjNnsx5Gl","NhXdudmoS7",
+"uvf7Ak85Ae","KsjRK29QAz","5Namm7fsYM","SWfouhE1Ql","QYxC0hUTw7","GXdoHpAhR1","uJScXFnPFB","brhlQ55rfB","h1zcHm4bxU","dhSuHCdyBV",
+"FcWrW3weIF","QssNCyofH3","GSQwjVprf2","Y1mC05Mg9r","n1pmO618Di","v2eC3uPX7G","WaWsvSmGzv","4W0Tl24ARF","lH1ktbrhlQ","h1zcHOz8yZ",
+"NhXdui3pyd","SjskQ5VZjS","zmLYDdjsrv","soy9tyvOMI","rKDLJ7fKYU","Chuy3oVQp6","ni2v1aFFss","Pb1pa2Nslm","618DivLsmS","taOXK8FmFH",
+"brhlQhUTw7","8U2nUNAFuw","Ss0ZuDcpWB","QbxXcB3qem","QnJ1S3weIF","qaofNjzUqR","BbwgACqqaD","BbwgAfmIK1","BbwgAQClRL","W7cTsgtCA5",
+"iqv4kuupzk","uPX7G8U2nU","VerEAFwEJz","QClRLMm8si","v1HlnlCMxy","taOXKFnPFB","CNHmv0ao3l","VNCPdsoy9t","5Mg9ruvf7A","lkMUAokgRi",
+"S2DfuFnPFB","hSSvQAgJHQ","5drc6bgJAz","he9IA1v5hH","ydG8U24ARF","lH1ktgIYvE","QChxsgdQsS","Nxx9VD6rBy","F6PT2Yh1hF","W7cTsF6PT2",
+"64s8NQssNC","BGaQYtlILt","pv0i7BCxeC","QworuCqqaD","BpYhVzqH0W","5Mg9rVBjhz","zqH0WfLNg8","JJs5mzqH0W","wDajXX6Pin","FGzgpoQ87r",
+"CK5W7StlDJ","WDVWJD6rBy","CK5W7hUTw7","55rfB7X3uy","jiVBP8FmFH","7lUXZLbRTH","dpe1vkB5nP","EdBKcLewvM","lm0pDHzZT8","lH1ktm4bxU",
+"iwzGkHfyNQ","uQIczfLNg8","2DREsECMvU","uAWypaez9y","HP433W3VFH","O3iyQFhtgl","lCMxypiJSk","FVMxoFcWrW","hSSvQguMb8","2ZHdkUlU3M",
+"8TxD75ZaEz","zmLYDHlUbF","VjCZqhE1Ql","MmKGJmX2GE","i3pyd0Wr5y","NhXduDz1R3","uPX7GoGu6x","0Wr5y24ARF","W3VFHv1Hln","VLTy6qaofN",
+"U3yw5NAFuw","M6qcGX6Pin","JIqXiRzaZA","HfyNQatef2","zHF1q9rlg9","8U2nUIKxdL","qaofN7X3uy","5Mg9rRzaZA","9eoRc7Ow5C","Chuy3W7cTs",
+"b29RJlsQGo","uLtKsQ6hMC","48cHLD6rBy","Chuy3W3VFH","lm0pDgtCA5","ciuWzmX2GE","9rlg9EoToP","v2eC314FLR","jS1ajQnJ1S","JJs5mCNHmv",
+"2DREsCqqaD","uN6r3VNCPd","l83Udd85a9","zHF1qzz4ZU","FFDuiuLtKs","2DREs48cHL","5NammAkKTk","tl72WXflUq","RkQkeMm8si","IRh488RCUA",
+"WPmlxokgRi","L7cGc0BmCy","yluBx9iGoT","Twano07n1c","KASQ8RBhp0","SWfouQYxC0","6AFT0UmaEv","lj07Q64s8N","CqqaDjiVBP","Q6Lix4W0Tl",
+"JXljWdpe1v","h1zcHFPfSE","xXTI4ulk41","gtCA5cL0aE","P6bcgG1RhS","d85a9jzUqR","48cHLM6qcG","PYBf4v8yFN","55rfBaFFss","S77LH5Drn0",
+"gtCA5RsQUq","IKxdLyvOMI","KASQ81j5L8","HlUbFgdQsS","QClRLQWxoT","NcICAuAWyp","QbxXc0Kyfs","ECMvUDz1R3","1v5hHlXFOB","HfyNQ2Nslm",
+"vOqCEuQIcz","MK07YyvOMI","45cIHpFrrl","Qworu5IhmG","tl72WdQ586","BFkb8ZzJHW","zFgtB0PktI","RzaZAkB5nP","NOHszKZamH","v1HlnRmDcr",
+"mX2GE7X3uy","nlaByKsjRK","ksJbyhSSvQ","0MR5Xb29RJ","Q6LixPYBf4","tvdkDlm0pD","9iGoTFNYIM","EOE1oRxrsm","hi5X7nFqik","POUYS9rlg9",
+"Zv7z0euZA5","UmaEvAOgEe","lViBvoVQp6","jfREuaFFss","5iGN5zbIYY","kZANmNxx9V","Vprf27fKYU","fFDrJvkCHH","iqv4k8RCUA","JXljWEdBKc",
+"fcJOypAhR1","QWxoT4W0Tl","tuDySRkQke","k85AeRzaZA","fLNg8tjQxs","HRxd81LB1L","tl72WAmdQd","AgJHQ0YAGH","pvgjSIn3NS","zz4ZUPb1pa",
+"WreyPWreyP","wiHrZlCMxy","zbIYY7fsYM","tAOsry94nw","16lHcAkKTk","n1pmOCfgr3","0MR5X5ZaEz","pAhR1b29RJ","VBjhzjS1aj","U3yw5GWqqX",
+"14FLRFFDui","ni2v1NhXdu","IjTwP0MR5X","yEfy907n1c","bgJAzWaWsv","d85a92hEEU","0KyfsyToGW","8cVD30ao3l","9GXkX7fKYU","MGlTFsqVrf",
+"Kr8ys5Namm","k85Aee6e4z","rKDLJLDk6f","CIShGVerEA","F6PT2AOgEe","2DREsyToGW","dpe1ve6e4z","kZANmWMiS3","xXTI48cVD3","bgJAzFhtgl",
+"Yf2EclpF6W","C2Irc0h1b1","ReKEWFFDui","64s8NGv3Fq","bZLvS0BmCy","iB08lTXQ0Z","G1RhSFwEJz","Uvlv4FVMxo","WmadAe6e4z","Yh1hFTCgPp",
+"lH1ktokgRi","uJScXPYBf4","s93MlWreyP","RpBQmRzaZA","ydG8Un1pmO","55rfBWPmlx","ulk41L7cGc","uPX7G0YAGH","jtn0X7fsYM","EdBKcWPmlx",
+"GrDg7AOgEe","Ta8f6ZzJHW","piJSki7WMQ","rhl0JxReec","CqqaDPb1pa","S2DfuHfyNQ","s93MlJkzUn","pvgjS5IhmG","5VZjSuLtKs","ydG8Ut59lR",
+"xXTI4GrDg7","XyPZN9eoRc","24ARFy94nw","qUJMdprNT6","GXdoH8hJdt","GrDg75Drn0","IRh48UlU3M","0BmCyYf2Ec","0KyfsY1mC0","JKWYRs7Mxk",
+"RpBQmMK07Y","o8UydCqqaD","s7MxkfcJOy","ciuWzgjUTu","pT8wuvkCHH","07n1c5ZaEz","48cHL5Mg9r","lH1ktJJs5m","okgRiRpBQm","aFFssBpYhV",
+"jS1ajyofH3","uAWyp6AFT0","KsjRKmz8gx","qQxHPFwEJz","prNT6ZuDtD","iKqhrK4GS8","KsjRKECMvU","5Drn0rz7Ut","nnP8oK20wK","lViBv7fKYU",
+"pv0i7K20wK","0BmCyQ6hMC","SbRYyuTacx","Yf2EcHRxd8","t59lRs4786","AXpwES77LH","e6e4zRzaZA","8cVD3iB08l","U3yw516lHc","ru4UGCqqaD",
+"prNT6VIlwP","Mm8sid85a9","i7WMQxciqp","k85AeC2Irc","ReKEWzFgtB","dpe1vJkzUn","ulk41NOHsz","B3qemdjsrv","AOgEe5Mg9r","ZzJHWPOUYS",
+"FwEJziwzGk","RzaZAStlDJ","29QAzaDGtS","uZPqgzmLYD","5Drn0580YD","t59lRlViBv","yToGWLbRTH","5drc6HlUbF","QbxXcjtn0X","uPX7GHlUbF",
+"Mkgy80h1b1","FLsphzY1GY","8hJdtt59lR","lj07QvOqCE","cL0aEzHF1q","ulk41IKxdL","7ku1pWMiS3","CdyBVAIYUu","QChxsFwEJz","YjB9tydG8U",
+"tAOsrIn3NS","2Nslm3weIF","8FmFHzbIYY","t59lR8RCUA","RzaZAHP433","X6PinuPX7G","DG4sTPb1pa","uN6r37hyVv","s93Ml8FmFH","zmLYDMmKGJ",
+"djsrvOz8yZ","In3NSsoy9t","9iGoTB3qem","55rfBjSjS3","CNHmvmz8gx","NAFuwCNHmv","QssNCpT8wu","RBhp0O3iyQ","IRh489eoRc","gjUTufmIK1",
+"8U2nUTwano","5nmWv8hJdt","FnPFBfcwDa","lweGyOHaBz","s93MlcQOnv","i7WMQsuY4x","HzZT8e6e4z","m4bxUCqqaD","8RCUAzqH0W","RpBQm7X3uy",
+"MK07YpAhR1","uvf7AoVQp6","NAFuwWMiS3","oGu6x16lHc","oQ87r2ZHdk","lsQGonlaBy","cQOnvdmoS7","o8UydAkKTk","fmIK18hJdt","brhlQQworu",
+"WreyPt59lR","7hyVvHRxd8","P6bcgsoy9t","M6qcGPb1pa","3weIFQbxXc","8FmFHnFqik","aDGtSCqqaD","16lHc9iGoT","FnPFB7X3uy","CIShGRBhp0",
+"9GXkXo8Uyd","pmeCd9rlg9","RmDcrru4UG","RsQUq8U2nU","okgRiiqv4k","QnJ1SUvlv4","lViBvfmIK1","lpF6W55rfB","OHaBzsx5Gl","QWxoTS2Dfu",
+"qaofNs93Ml","mz8gx2Yz7E","IRh485nmWv","POUYSvLsmS","xXTI4HP433","OUqFMcL0aE","lXFOBfFDrJ","fqypyulk41","h1zcHyToGW","580YDtaOXK",
+"ZzJHWJIqXi","BpYhVK4GS8","ECMvUjeskS","pAhR1MaJQs","iwzGkLewvM","FxX9q16lHc","ZuDtDLewvM","5IhmGVLTy6","dhSuHFLsph","s7MxkuN6r3",
+"guMb8Q6hMC","7fKYU5Drn0","IjTwPtvdkD","4dEz6In3NS","i7WMQFhtgl","fcwDaogLgc","GrDg7tAOsr","BCxeCLbRTH","1LB1LkZANm","618DiRBhp0",
+"Cp3mZlCMxy","GWqqX3weIF","yvOMIHzZT8","FcWrWAkKTk","pWiOslViBv","8cVD3brhlQ","yluBxoGu6x","2ZHdkqUJMd","h1zcHZJTXH","5Mg9rdpe1v",
+"JJs5mLbRTH","9XyT9ciuWz","HzZT8MezSW","6AFT0RACuj","0MR5XCp3mZ","VLTy6FFDui","WPmlxDcpWB","soy9ttjQxs","jS1ajlkMUA","HRxd81v5hH",
+"K20wKMmsIo","9iGoTNxx9V","0MR5XFVMxo","HP433Q6hMC","atef2blLA9","DcpWBCNHmv","9rlg9DQimp","lpF6WhYBCK","Waim6B3qem","l83Ud7X3uy",
+"MmsIohYBCK","8FmFHL7cGc","MK07YGrDg7","kZANmVjCZq","0PktIZUnqt","6AFT0jfREu","FVMxookgRi","aL6AJWreyP","zz4ZUv1Hln","In3NSFnPFB",
+"MezSWRzaZA","pvgjSlj07Q","lXFOBiKqhr","0MR5XqQxHP","BFkb8M3zXL","he9IAn1pmO","v2eC3atef2","1LB1LXyPZN","Zv7z0rz7Ut","CqqaDBpYhV",
+"O3iyQDz1R3","nnP8oCp3mZ","ECMvUn1pmO","Yh1hFnnP8o","uvf7AlkMUA","Cfgr3ZzJHW","ksJbyYOfrY","YjB9tAkKTk","Q6hMCjS1aj","pv0i7JKWYR",
+"nlaByhE1Ql","FGzgpCK5W7","HfyNQFPfSE","QssNC0ao3l","fcJOygIYvE","tuDySsx5Gl","NcICAQssNC","mX2GE9GXkX","5drc6i3pyd","S2DfuFVMxo",
+"Ta8f6faHir","rz7Uthi5X7","ciuWzVerEA","6q6L9uupzk","uupzki3pyd","HzZT8sqVrf","55rfB8TxD7","o8UyduTacx","n1pmOa00b5","MojnPlm0pD",
+"QChxsFcWrW","I7p2a5IhmG","LDk6fIn3NS","lH1ktMm8si","Cfgr3aFFss","9XyT9NcICA","BFkb8WaWsv","CIShG0h1b1","wDajXnnP8o","0h1b1uoStw",
+"W7cTsU3yw5","gdQsS4QMc9","JIqXilsQGo","wiHrZyEfy9","HfyNQ2ZHdk","NcICAs93Ml","K20wKs93Ml","m4bxUuoStw","uQIcz6q6L9","HfyNQ3weIF",
+"gIYvEJKWYR","zbIYYuJScX","VerEAfFDrJ","azIWpYf2Ec","POUYSEdBKc","WmadA16lHc","rKDLJKASQ8","0ao3ltvdkD","MezSWSWfou","jiVBPqUJMd",
+"ksJbyiqv4k","AXpwEpWiOs","iB08ll83Ud","fmIK1dmoS7","BGaQYDQimp","Ss0ZuL7cGc","Ul4a1LewvM","Yw2oU7Ow5C","gdQsSQChxs","RkQkeQ6hMC",
+"SbRYyIKxdL","Nxx9V9y4lw","U3yw5P6bcg","tAOsrVprf2","WaWsvqaofN","6q6L9lj07Q","Uvlv4lXFOB","rhl0JdQ586","Oz8yZUl4a1","HlUbFFhtgl",
+"5Mg9rFjHXR","YjB9tZhwG1","4QMc9uJScX","jfREuvkCHH","RmDcrO3iyQ","In3NSrhl0J","cQOnvb29RJ","D6rBy14FLR","ogLgc6AFT0","MaJQsEOE1o",
+"OUYuFcL0aE","faHir7lUXZ","IRh48K20wK","7X3uyKZamH","0PktI2hEEU","GXdoHYf2Ec","lCMxysqVrf","jfREuSmGzv","uTacxCqqaD","NAFuwQChxs",
+"lkMUAMK07Y","O3iyQJkzUn","WreyPdjsrv","9XyT9VjCZq","0KyfsWMiS3","t59lRgtCA5","C2IrcpFrrl","FLsphpmeCd","IBe8kd7vjM","MaJQspAhR1",
+"zqH0WThjNn","HRxd8CxVEf","K20wK7fKYU","fqypyOUqFM","RBhp0FGzgp","guMb8azIWp","v8yFNn8pJ9","pvgjSKASQ8","Uvlv4JRJQB","QClRLCqqaD",
+"gf8rItaOXK","MezSW1v5hH","n8pJ98RCUA","8hJdtReKEW","Mkgy8618Di","d7vjMqaofN","rKDLJ1v5hH","7Ow5CoGu6x","9rlg9AkKTk","YjB9tuLtKs",
+"zY1GY29QAz","iwzGk5Namm","48cHLwiHrZ","VBjhzt59lR","XyPZNPOUYS","MmsIo29QAz","s4786yvOMI","F6PT2Q6hMC","2DREsxReec","m4bxUuLtKs",
+"bZLvSW3VFH","nnP8orz7Ut","QYxC0NcICA","ECMvUKr8ys","AkKTkuPX7G","LbRTHs93Ml","soy9tPYBf4","GWqqXzHF1q","3weIFjS1aj","t98iWvOqCE",
+"KASQ8uN6r3","KsjRKcL0aE","dpe1vI7p2a","i7WMQaL6AJ","X6Pin9iGoT","lkMUApvgjS","4W0Tln1pmO","HfyNQjSjS3","pAhR1C2Irc","8hJdtAXpwE",
+"AXpwEY1mC0","uPX7GlH1kt","WmadAdQ586","J2mQiIBe8k","KsjRKpvgjS","gtCA5yEfy9","jeskSxReec","7fKYUMkgy8","Pb1papAhR1","xciqpZuDtD",
+"yEfy9CdyBV","WMiS3uQIcz","ThjNnOz8yZ","MmsIoeuZA5","No0QbuZPqg","yvOMI8RCUA","O3iyQRxrsm","HP433rhl0J","sx5GlHlUbF","7X3uysqVrf",
+"iqv4k8hJdt","yEfy9EoToP","MojnPKr8ys","i7WMQ7fKYU","uZPqgzHF1q","UlU3MDz1R3","Yw2oUpvgjS","lXFOBwDajX","v1Hlnni2v1","2DREsWMiS3",
+"FwEJzRxrsm","Z4I1vThjNn","7X3uyksJby","fLNg8XyPZN","tvdkDJKWYR","he9IA48cHL","ksJbyOz8yZ","16lHc7X3uy","lweGy1v5hH","5VZjSblLA9",
+"ZhwG15Drn0","FxX9qEOE1o","0h1b1KZamH","48cHLpvgjS","CxVEf07n1c","bgJAzQ6hMC","vOqCEtlILt","FjHXRru4UG","ThjNnokgRi","2ZHdkS77LH",
+"SjskQhYBCK","DQimp5Drn0","No0QbdQ586","FjHXRfmIK1","C2IrcfFDrJ","WreyPlweGy","zY1GYiKqhr","FNYIMOHaBz","1j5L8uLtKs","uN6r31LB1L",
+"G1RhSQYxC0","pv0i7Z4I1v","1j5L8uZPqg","3otm6Q6hMC","t98iWWaim6","3otm6fmIK1","v8yFNk85Ae","uZPqgMK07Y","lkMUAyEfy9","2ZHdkgdQsS",
+"DcpWBmX2GE","mz8gxgdQsS","BbwgAe6e4z","lm0pDM6qcG","d85a9FwEJz","bZLvSZhwG1","pAhR14W0Tl","4dEz6uPX7G","dQ586IRh48","QClRLBFkb8",
+"lj07QhYBCK","zFgtB1v5hH","x3LDeStlDJ","tl72WAOgEe","ZuDtDciuWz","iKqhrjtn0X","XflUqqaofN","8cVD3UlU3M","SjskQRBhp0","VNCPduQIcz",
+"ydG8U7X3uy","Yw2oUHRxd8","MK07YzqH0W","kB5nP8xEKz","W3VFHYh1hF","CxVEfqaofN","xReeck85Ae","uJScXTCgPp","uAWypJkzUn","zqH0WXyPZN",
+"v2eC3pWiOs","D6rByuPX7G","n8pJ9TCgPp","uZPqgFFDui","dmoS7580YD","55rfBP6bcg","lpF6W2Yz7E","FhtglZJTXH","5VZjSBFkb8","Q6hMCpvgjS",
+"RBhp0TXQ0Z","suY4x6q6L9","yluBxv2eC3","euZA5BCxeC","mz8gxX6Pin","uoStwWaWsv","5drc6rz7Ut","9iGoT07n1c","NAFuwBCxeC","DcpWBHlUbF",
+"AkKTkx3LDe","SjskQYw2oU","uQIcz7lUXZ","i7WMQHP433","8RCUAGrDg7","dhSuHt59lR","HRxd85nmWv","cmXIX8xEKz","gIYvE9GXkX","HP4338cVD3",
+"pAhR1azIWp","EoToP3weIF","HlUbFh1zcH","lCMxy2ZHdk","7ku1pfcJOy","M6qcGuJScX","zY1GY2DREs","fFDrJDz1R3","prNT6oGu6x","hYBCKDLhzM",
+"l83UdZUnqt","No0QbFjHXR","s93MlM6qcG","rhl0JlViBv","W7cTs7ku1p","SmGzvv1Hln","Chuy3bZLvS","o8Uyd4QMc9","aFFssX6Pin","O3iyQs93Ml",
+"KASQ8piJSk","9GXkXzqH0W","JIqXi2DREs","BpYhV8RCUA","y94nwblLA9","JXljW7ku1p","7fsYM5iGN5","pFrrlfLNg8","AmdQdJRJQB","CIShGMmsIo",
+"e6e4zOUYuF","iKqhroGu6x","tlILtjiVBP","ksJby64s8N","1v5hHAXpwE","Uvlv4mz8gx","WreyP0Wr5y","RBhp0tvdkD","vOqCEM3zXL","KASQ87ku1p",
+"hE1Ql8TxD7","zY1GYSs0Zu","CxVEfGv3Fq","580YD07n1c","K20wK8U2nU","Cfgr3gdQsS","pWiOsYjB9t","EdBKcJXljW","CNHmv0h1b1","8FmFHjS1aj",
+"2Yz7ES77LH","mz8gxVNCPd","OUqFM9XyT9","RmDcrFjHXR","nFqikazIWp","pAhR1hE1Ql","t98iWuAWyp","pv0i7OUYuF","pWiOszqH0W","45cIHAkKTk",
+"Zv7z0MmKGJ","euZA5Dz1R3","EoToPeuZA5","YjB9t0YAGH","OxWIHXyPZN","Kr8ysF6PT2","hYBCKaez9y","9GXkXzFgtB","tjQxsjfREu","pmeCdNAFuw",
+"nnP8otuDyS","uTacx4dEz6","KASQ8dmoS7","7fsYMFVMxo","FwEJzsqVrf","aFFssiqv4k","MaJQso8Uyd","IBe8katef2","CxVEfciuWz","Yh1hF14FLR",
+"I7p2apvgjS","rKDLJvLsmS","FFDui6AFT0","sqVrfulk41","POUYSJ2mQi","No0QbNcICA","ThjNndQ586","d7vjMuQIcz","W3VFHKZamH","5Drn0LewvM",
+"IKxdLoVQp6","KsjRKAXpwE","9GXkXuLtKs","VjCZqfqypy","VjCZqK4GS8","B3qem3otm6","7fsYMpiJSk","zmLYDZuDtD","x3LDeCNHmv","CNHmv8TxD7",
+"YOfrYaDGtS","OHaBzNAFuw","fqypytuDyS","5IhmGpFrrl","gjUTu2Yz7E","gjUTu0h1b1","dpe1vFLsph","Ul4a1FPfSE","AXpwERBhp0","OUYuFuTacx",
+"v1HlnXyPZN","8hJdtzY1GY","VerEApAhR1","piJSk580YD","s4786B3qem","MojnPSmGzv","QWxoTy94nw","iB08logLgc","5ZaEzbrhlQ","brhlQHRxd8",
+"48cHLZhwG1","Mkgy8NAFuw","FFDuiJXljW","jiVBPjiVBP","Y1mC0fmIK1","piJSkQChxs","29QAz9y4lw","fcwDaqQxHP","h1zcHgf8rI","hE1Qlv8yFN",
+"Ul4a14QMc9","SmGzvy94nw","uN6r35nmWv","CIShGbZLvS","WreyPPYBf4","iB08lFnPFB","QYxC0cmXIX","x3LDeZJTXH","SWfouzHF1q","Gv3FqKASQ8",
+"StlDJZ4I1v","Waim6atef2","rz7Ut2hEEU","IBe8kJ2mQi","x3LDesx5Gl","qQxHPM3zXL","lH1ktO3iyQ","Zv7z0NOHsz","8FmFHiB08l","CxVEfpmeCd",
+"IjTwPPb1pa","ZhwG1No0Qb","KsjRK7lUXZ","AIYUumz8gx","lj07Q2DREs","RpBQmUvlv4","IKxdLkB5nP","AmdQdfFDrJ","VjCZqRkQke","QChxsYOfrY",
+"soy9tECMvU","4QMc9IRh48","fcJOyRmDcr","DLhzMiwzGk","s7MxkMaJQs","0YAGHBCxeC","gIYvEjiVBP","Q6hMCfmIK1","JXljWTXQ0Z","Q6LixOz8yZ",
+"5nmWv2Yz7E","e6e4zDLhzM","nlaByAkKTk","hSSvQuvf7A","hSSvQ8xEKz","Yh1hFiqv4k","VLTy6k85Ae","SmGzvv8yFN","8U2nUmX2GE","FFDuizQt6Q",
+"VNCPdZ4I1v","pT8wuulk41","FNYIM6q6L9","M3zXLNcICA","9eoRcRpBQm","UlU3Mk85Ae","VjCZqyofH3","jzUqR0ao3l","e6e4zGrDg7","KASQ8QnJ1S",
+"KASQ8VBjhz","rKDLJZv7z0","M3zXLMmsIo","VLTy6SbRYy","2Yz7E64s8N","pWiOsQ6hMC","oVQp6gdQsS","UlU3MHP433","bZLvSwiHrZ","JkzUnSjskQ",
+"Uvlv4fLNg8","oGu6xtlILt","uZPqgRxrsm","iKqhrvOqCE","wDajXzHF1q","oQ87r2Nslm","XyPZNXflUq","2DREspv0i7","oQ87r0YAGH","qaofNfcJOy",
+"AkKTksx5Gl","CxVEf3weIF","uoStwTCgPp","aL6AJzQt6Q","aDGtSlsQGo","OUYuFPb1pa","brhlQ4QMc9","lpF6Wb29RJ","DQimpRkQke","uN6r3EoToP",
+"wDajXCNHmv","qQxHPXyPZN","jzUqRzHF1q","zY1GYgf8rI","QChxstaOXK","Z4I1vSWfou","QbxXc1v5hH","YjB9tUvlv4","FLsphBFkb8","NhXduP6bcg",
+"TwanoRsQUq","9XyT9JIqXi","45cIHJKWYR","0Kyfs0YAGH","GXdoH07n1c","Cfgr3jeskS","8U2nUd85a9","8cVD3S77LH","In3NSJJs5m","K20wKJkzUn",
+"gtCA5NAFuw","Yw2oUMezSW","zmLYDuPX7G","0PktIZzJHW","7lUXZWPmlx","kB5nP0Wr5y","1LB1LAmdQd","5IhmGlViBv","uLtKsv1Hln","qUJMd2TRI7",
+"I7p2a6q6L9","QClRLjzUqR","AkKTkzHF1q","CxVEf6AFT0","CNHmvcQOnv","x3LDeJIqXi","yofH3MGlTF","Yw2oUQYxC0","S2DfuZ4I1v","cmXIXHzZT8",
+"zqH0WlpF6W","55rfB6q6L9","8RCUAAOgEe","AIYUuY1mC0","x3LDei3pyd","uJScXFLsph","NcICABCxeC","ZJTXHQworu","FwEJzaL6AJ","0BmCyS77LH",
+"Q6hMC580YD","1v5hHv8yFN","tlILtxXTI4","8FmFHEoToP","Ta8f62Nslm","vOqCEt98iW","prNT6BCxeC","0Kyfs5IhmG","0ao3lOUqFM","VNCPd5VZjS",
+"SWfouMojnP","ZzJHWjiVBP","gIYvEn8pJ9","gIYvEDLhzM","D6rByaFFss","HRxd8fcJOy","0MR5XzQt6Q","5ZaEzdmoS7","Oz8yZWreyP","FnPFBD6rBy",
+"qQxHPm4bxU","yEfy9FPfSE","nFqikprNT6","x3LDeUvlv4","MGlTFyvOMI","dhSuHe6e4z","W7cTsTCgPp","4dEz6t59lR","IjTwPblLA9","XflUqbZLvS",
+"uQIczKr8ys","a00b5ZhwG1","4W0Tle6e4z","JJs5mgIYvE","gIYvEiKqhr","8cVD3uPX7G","WaWsv1j5L8","GWqqXuupzk","MezSWv2eC3","JkzUne6e4z",
+"zHF1qMmKGJ","QbxXcmz8gx","zQt6QjS1aj","bZLvSGSQwj","BCxeCnnP8o","gtCA5HzZT8","fFDrJ07n1c","hSSvQ7lUXZ","29QAz3otm6","Y1mC0uupzk",
+"QChxshE1Ql","zQt6QNAFuw","B3qemCdyBV","24ARFB3qem","atef2iqv4k","v8yFNDz1R3","Cfgr3In3NS","Vprf2pT8wu","i3pydRACuj","fLNg8uZPqg",
+"Twano8FmFH","ru4UGuvf7A","gf8rIHRxd8","yToGWKsjRK","BFkb8uLtKs","Ta8f6LDk6f","No0QbksJby","k85Ae0ao3l","t59lRIKxdL","14FLRFhtgl",
+"FjHXRFNYIM","G1RhShE1Ql","WaWsvl83Ud","BCxeCk85Ae","M6qcGdjsrv","ogLgcCdyBV","oGu6x7X3uy","X6PinRxrsm","FVMxojiVBP","JKWYRFnPFB",
+"fmIK19GXkX","lm0pDhe9IA","uN6r3ydG8U","Cfgr3oGu6x","AXpwEWreyP","CIShGSmGzv","aL6AJuupzk","iB08lo8Uyd","9y4lw5VZjS","NcICARzaZA",
+"Vprf2M6qcG","MmsIoaez9y","GSQwjogLgc","uoStwulk41","kZANmAIYUu","0PktICdyBV","xReec8U2nU","IRh48lm0pD","VNCPdBFkb8","IjTwPlkMUA",
+"yToGW55rfB","i7WMQh1zcH","mX2GEjtn0X","OUYuF0Wr5y","fqypyTa8f6","WMiS3OHaBz","o8Uydl83Ud","prNT6hUTw7","FPfSE8FmFH","dmoS7FNYIM",
+"WDVWJhe9IA","Vprf2jS1aj","SWfouFGzgp","atef2ydG8U","GXdoHfmIK1","lweGypT8wu","guMb82Nslm","y94nw2DREs","4dEz67ku1p","FNYIMzmLYD",
+"s4786Cfgr3","uN6r3MK07Y","BCxeCO3iyQ","MK07Yv1Hln","9eoRcHfyNQ","m4bxUEdBKc","vOqCEzHF1q","jSjS33weIF","RkQkeUlU3M","GWqqXCK5W7",
+"Q6hMCrhl0J","faHirLDk6f","2DREsgf8rI","zmLYDpWiOs","NOHszGv3Fq","Q6hMCrz7Ut","FcWrWVjCZq","BGaQYSWfou","yofH3NOHsz","QnJ1SokgRi",
+"hi5X7pT8wu","QYxC07fsYM","mz8gxhi5X7","M3zXLMm8si","SmGzvfqypy","Q6LixbrhlQ","kB5nPciuWz","5drc6JkzUn","5IhmGHP433","RBhp03otm6",
+"cShY20ao3l","J2mQiReKEW","UlU3Mo8Uyd","ZhwG11LB1L","tvdkDFVMxo","i7WMQ0ao3l","Cp3mZoQ87r","soy9tlH1kt","e6e4zAmdQd","IRh4855rfB",
+"yofH39GXkX","Pb1paB3qem","1j5L8hSSvQ","7ku1pS77LH","FGzgpJkzUn","RzaZAYw2oU","K4GS8Ta8f6","ix74rQClRL","XflUqs4786","M3zXLfmIK1",
+"29QAz0Kyfs","XflUq0PktI","AgJHQRzaZA","ogLgczz4ZU","EdBKcPOUYS","StlDJlViBv","S2DfuOUYuF","Ul4a1JIqXi","VIlwPNxx9V","XflUqcmXIX",
+"45cIHChuy3","VNCPdyToGW","fmIK1OxWIH","KsjRKzHF1q","BpYhVpiJSk","qQxHPKZamH","No0QbQssNC","dQ586IBe8k","5nmWv9XyT9","CdyBVfcwDa",
+"XflUqb29RJ","yofH37Ow5C","8cVD3Yw2oU","GSQwjazIWp","jzUqRGrDg7","24ARFReKEW","uoStwStlDJ","OHaBzB3qem","lViBvMezSW","y94nwcL0aE",
+"zY1GYTwano","dQ586aL6AJ","m4bxU2TRI7","X6Pin5VZjS","5nmWvAgJHQ","L7cGcVjCZq","QbxXciKqhr","fcJOye6e4z","b29RJd85a9","IKxdLwiHrZ",
+"QbxXcYh1hF","RzaZAaFFss","ThjNn3weIF","jSjS3ni2v1","UmaEv2TRI7","faHirCK5W7","rz7Ut0PktI","Yf2EcVBjhz","soy9tTa8f6","tjQxssuY4x",
+"No0QbAmdQd","bZLvSni2v1","CK5W7dQ586","MaJQs16lHc","jfREuk85Ae","nFqikRmDcr","6q6L98U2nU","RACujyvOMI","4dEz6W3VFH","Gv3FqCK5W7",
+"LewvMv2eC3","TXQ0ZEOE1o","MojnPaFFss","55rfB8cVD3","VBjhztjQxs","W3VFHnFqik","YjB9t5iGN5","1j5L816lHc","OxWIHs93Ml","jS1ajSWfou",
+"rz7UtGv3Fq","VNCPdtAOsr","jS1ajRxrsm","Oz8yZW3VFH","v2eC3WreyP","FhtgluPX7G","n1pmOvLsmS","8xEKzyofH3","QClRLFNYIM","lkMUAvOqCE",
+"gf8rIn8pJ9","BpYhVWDVWJ","RACujhYBCK","IjTwPFPfSE","VIlwPIBe8k","jS1aj1v5hH","zHF1qsqVrf","AmdQd2DREs","ECMvUCxVEf","LewvMFGzgp",
+"AIYUuFLsph","CdyBVbgJAz","taOXKBpYhV","MaJQsCp3mZ","9y4lwG1RhS","ni2v1sqVrf","5iGN5jSjS3","X6Pinjtn0X","7fsYMX6Pin","hUTw7qQxHP",
+"VLTy6TXQ0Z","jeskSsoy9t","pWiOsCfgr3","9GXkX8RCUA","zbIYY5Mg9r","TCgPptvdkD","48cHLkB5nP","guMb8AOgEe","QWxoT1v5hH","nnP8osoy9t",
+"lm0pD8xEKz","MGlTF9rlg9","VNCPdyofH3","v2eC3wiHrZ","0BmCym4bxU","M3zXL4dEz6","7ku1pFwEJz","G1RhSS2Dfu","jfREuW3VFH","vOqCEYw2oU",
+"FcWrW5IhmG","IKxdLBpYhV","soy9t618Di","FGzgpru4UG","k85AeGXdoH","bZLvSzY1GY","cShY2xXTI4","AXpwEB3qem","BpYhVk85Ae","tAOsrEoToP",
+"t98iWkZANm","XflUqgtCA5","FjHXRnFqik","iKqhruLtKs","RzaZAhSSvQ","okgRii3pyd","wiHrZWDVWJ","RmDcrlCMxy","faHir8TxD7","Kr8ystuDyS",
+"CdyBVogLgc","MmsIoUvlv4","MK07Y8RCUA","ReKEWazIWp","5drc655rfB","J2mQirhl0J","1LB1LRpBQm","6AFT0ThjNn","POUYSzY1GY","atef2OHaBz",
+"cShY2P6bcg","zHF1q0Kyfs","Mkgy8lweGy","ZhwG17Ow5C","J2mQi7X3uy","FxX9qCxVEf","QWxoTDcpWB","hE1QlC2Irc","he9IAzqH0W","v8yFNlCMxy",
+"IRh48rz7Ut","iB08lwiHrZ","Z4I1vfcwDa","Q6hMCCqqaD","FxX9qhYBCK","WaWsvgjUTu","QssNCulk41","rhl0J6q6L9","FVMxouupzk","jeskSzmLYD",
+"FPfSEgdQsS","cShY2GrDg7","W7cTsVIlwP","JkzUndjsrv","DQimpaL6AJ","FwEJzYOfrY","iB08lQClRL","5Drn0v2eC3","HRxd8BCxeC","SbRYywDajX",
+"b29RJXyPZN","cmXIXrhl0J","nnP8oogLgc","580YDQnJ1S","FLsphlweGy","F6PT2b29RJ","nlaByFFDui","hE1Ql4QMc9","dmoS7J2mQi","Dz1R3uQIcz",
+"d85a9ksJby","0MR5X1j5L8","pvgjSWDVWJ","MK07YiKqhr","NcICAuLtKs","XflUqlj07Q","fcwDaQYxC0","FVMxocQOnv","FVMxoYjB9t","lCMxyyluBx",
+"ZJTXHMmKGJ","ksJbyCqqaD","5drc6D6rBy","ciuWzfcJOy","zFgtBvOqCE","fcJOylpF6W","fmIK1WaWsv","FxX9quLtKs","618DicQOnv","9y4lwRmDcr",
+"9y4lwgjUTu","LewvMzbIYY","Yf2Ec3otm6","MGlTFv1Hln","RpBQmWreyP","nlaBylCMxy","FNYIMUlU3M","nlaByiwzGk","dQ586fcwDa","s4786Yh1hF",
+"MezSWrz7Ut","TwanoWmadA","5Mg9rs7Mxk","zQt6Q9iGoT","QssNCsqVrf","nFqikfcJOy","PYBf4JkzUn","atef2FjHXR","LDk6fgIYvE","OUYuFKsjRK",
+"OUYuFEOE1o","d85a9s93Ml","QYxC0fmIK1","vLsmSOxWIH","7lUXZQ6Lix","jfREu0ao3l","RpBQmZhwG1","ThjNnazIWp","dQ586LbRTH","4QMc97lUXZ",
+"Dz1R3pmeCd","i3pydVprf2","2DREsrz7Ut","uoStws7Mxk","Twanot59lR","rKDLJRkQke","jS1ajFFDui","gf8rI7lUXZ","wDajX1j5L8","l83UdyEfy9",
+"2ZHdkrz7Ut","14FLRXyPZN","gjUTu0MR5X","55rfBDz1R3","FNYIMHlUbF","Kr8ysGWqqX","9XyT9PYBf4","zbIYYk85Ae","D6rByeuZA5","9iGoTWreyP",
+"0YAGHAgJHQ","s47867X3uy","7hyVvRxrsm","JkzUnX6Pin","ZuDtDVNCPd","WDVWJCK5W7","0YAGHBGaQY","TCgPpDG4sT","CIShGpv0i7","jzUqR8U2nU",
+"CNHmvNAFuw","Pb1pa7ku1p","zFgtBzQt6Q","faHirsuY4x","zQt6QUmaEv","nFqikMK07Y","zmLYDUl4a1","lViBvrz7Ut","5Mg9r5Namm","HRxd8G1RhS",
+"QYxC02DREs","pFrrl1j5L8","7fsYMuPX7G","uLtKsWaim6","Mkgy8RkQke","QssNCbZLvS","FNYIMRxrsm","FjHXRWmadA","hSSvQlXFOB","HlUbFlXFOB",
+"5VZjSStlDJ","uvf7AYOfrY","55rfBJ2mQi","jzUqRRACuj","S2DfuDG4sT","7Ow5CSbRYy","5ZaEzmX2GE","dmoS714FLR","7fsYMtl72W","aFFssReKEW",
+"uAWypyluBx","piJSklsQGo","zbIYY5Drn0","uPX7Gb29RJ","FNYIMWreyP","UlU3M9rlg9","jfREupWiOs","dmoS7FjHXR","fmIK10BmCy","CxVEf0Kyfs",
+"2DREsM3zXL","uvf7AiKqhr","uvf7A7fKYU","ZUnqtnnP8o","Cp3mZ7lUXZ","4dEz6RpBQm","nlaByXyPZN","O3iyQU3yw5","soy9tZzJHW","t98iW5Mg9r",
+"l83Ud5Namm","Cp3mZuJScX","tvdkDJRJQB","atef2hUTw7","FGzgp29QAz","iqv4kdhSuH","EOE1o0MR5X","SbRYyprNT6","5VZjSSbRYy","I7p2aiwzGk",
+"hUTw7aFFss","jzUqRIn3NS","1j5L8uupzk","vOqCEqQxHP","uLtKsd7vjM","zqH0WJKWYR","cQOnv0PktI","ZJTXHlpF6W","IjTwPO3iyQ","ECMvUjtn0X",
+"7lUXZK4GS8","Mm8si5VZjS","7fKYUzqH0W","SbRYyS77LH","QbxXcuN6r3","5IhmGtAOsr","14FLRix74r","yofH3AgJHQ","O3iyQMmsIo","tvdkDQChxs",
+"RmDcrCqqaD","FhtglZUnqt","HRxd8YjB9t","7X3uyciuWz","aez9yBGaQY","Ul4a1guMb8","fcwDaS77LH","2Yz7EvLsmS","azIWpzmLYD","dpe1v7ku1p",
+"jtn0XoGu6x","h1zcHhYBCK","uoStwqaofN","In3NS0BmCy","dmoS7JIqXi","TXQ0Zrz7Ut","hUTw7MaJQs","KsjRKHRxd8","8RCUAzz4ZU","tlILtsoy9t",
+"64s8NWPmlx","618DifcJOy","HfyNQCNHmv","XflUqGXdoH","iKqhrhE1Ql","Nxx9VBbwgA","HRxd8guMb8","Yw2oUt98iW","a00b5S77LH","yluBxHfyNQ",
+"C2IrcgtCA5","IBe8kLewvM","NOHszTa8f6","P6bcgHlUbF","JKWYRW3VFH","VNCPdvLsmS","QworuNxx9V","NhXduQ6Lix","dhSuHJXljW","SmGzv0MR5X",
+"7fsYMTa8f6","WDVWJNxx9V","HfyNQS77LH","gjUTuStlDJ","TCgPpTCgPp","580YDuTacx","8RCUA5Mg9r","7Ow5CBFkb8","Gv3FqzY1GY","P6bcgatef2",
+"fcJOyfmIK1","1LB1LOUqFM","DLhzMFVMxo","DG4sTAmdQd","e6e4zJJs5m","wiHrZJJs5m","d7vjMZ4I1v","NcICA7ku1p","Q6hMCoQ87r","Cp3mZzz4ZU",
+"0ao3ljS1aj","AgJHQlm0pD","iKqhrtuDyS","JkzUnReKEW","8FmFHS77LH","hE1QlVerEA","LewvMFLsph","NcICAQ6hMC","cL0aEnnP8o","8FmFHoQ87r",
+"zQt6QuPX7G","TwanodmoS7","Cfgr3I7p2a","FwEJzReKEW","HzZT8kB5nP","5iGN5JKWYR","qaofNpv0i7","OUqFMfLNg8","MezSWYOfrY","OxWIHQnJ1S",
+"9GXkXFPfSE","zqH0WZJTXH","Q6LixlsQGo","AIYUupvgjS","Zv7z0LbRTH","lH1kt0YAGH","a00b5i7WMQ","BFkb8ThjNn","Yh1hFqaofN","NcICARkQke",
+"45cIHeuZA5","VNCPdxReec","Cp3mZWMiS3","tvdkDqQxHP","gIYvEM3zXL","HfyNQCxVEf","QworuhUTw7","LDk6fkZANm","BbwgAZ4I1v","GSQwjnnP8o",
+"VNCPdVNCPd","oGu6xKr8ys","QClRLF6PT2","5ZaEzjiVBP","lm0pDy94nw","0h1b18hJdt","StlDJn8pJ9","JKWYR5iGN5","YOfrY16lHc","IjTwPfLNg8",
+"ni2v1Fhtgl","NOHszYw2oU","vOqCEt59lR","RACujI7p2a","ulk415nmWv","MmKGJhSSvQ","GWqqXRkQke","yofH3lsQGo","2Yz7E0MR5X","s7MxkAXpwE",
+"F6PT2WreyP","0MR5XQnJ1S","v8yFNn1pmO","IRh489GXkX","J2mQizHF1q","AXpwEGrDg7","G1RhSpWiOs","rKDLJDLhzM","v1HlnMojnP","0PktIpWiOs",
+"YjB9tX6Pin","djsrvYh1hF","RBhp0POUYS","JKWYRtjQxs","MojnPs4786","Cfgr3StlDJ","gIYvElCMxy","OxWIHWMiS3","FFDuiwDajX","WMiS3mz8gx",
+"Uvlv4Ss0Zu","xReec7hyVv","QnJ1Slm0pD","nnP8o2DREs","CxVEfPOUYS","n8pJ9UmaEv","oGu6xoGu6x","6q6L9IBe8k","FnPFBlViBv","ksJbylm0pD",
+"WMiS39GXkX","24ARFSjskQ","zmLYDQYxC0","5IhmGGSQwj","hUTw77fKYU","1LB1LW3VFH","CdyBVi3pyd","pmeCdSs0Zu","B3qempv0i7","vOqCEAgJHQ",
+"WaWsvRkQke","POUYSJkzUn","zz4ZUVNCPd","PYBf4CdyBV","9eoRcs93Ml","k85AefcJOy","M3zXL5Namm","QWxoTQ6Lix","hYBCKDG4sT","uQIczv2eC3",
+"s4786I7p2a","8hJdtUlU3M","7lUXZdmoS7","JJs5m7hyVv","ZzJHWZhwG1","UlU3MVBjhz","8FmFHv1Hln","i3pydK20wK","Ta8f6Uvlv4","xXTI4vLsmS",
+"WmadADG4sT","5nmWvTXQ0Z","FcWrW45cIH","aDGtSIKxdL","Twanon1pmO","0Wr5ynlaBy","aFFssyofH3","OxWIHatef2","azIWpbrhlQ","XyPZNCqqaD",
+"48cHLWMiS3","Waim6PYBf4","GrDg7GXdoH","pWiOsQ6Lix","RACujdQ586","xciqpb29RJ","Z4I1vyofH3","k85AeQChxs","VjCZqvOqCE","FVMxoY1mC0",
+"rhl0JPOUYS","BCxeCVIlwP","qUJMd7Ow5C","QClRL5ZaEz","6q6L9FwEJz","ciuWza00b5","Mm8siFwEJz","QssNCSs0Zu","NAFuwSjskQ","0MR5XSmGzv",
+"RzaZAciuWz","QnJ1S2Nslm","FnPFBOz8yZ","soy9t5nmWv","prNT6atef2","SmGzv5VZjS","7X3uycShY2","QworujeskS","B3qemlH1kt","tjQxslXFOB",
+"qaofNTXQ0Z","t98iWYw2oU","zz4ZUIjTwP","uJScXHzZT8","Fhtgl8FmFH","SjskQn8pJ9","0YAGHhi5X7","FjHXRfLNg8","WPmlxjiVBP","ZuDtD7hyVv",
+"uN6r3jS1aj","uvf7ACNHmv","DG4sTlpF6W","JXljW2Yz7E","RkQkebgJAz","pAhR1oQ87r","Ta8f6oGu6x","o8UydiwzGk","qQxHPtvdkD","a00b5CdyBV",
+"fcwDagIYvE","ix74r7fsYM","aFFss2Yz7E","zqH0WaL6AJ","Zv7z0FVMxo","QChxs0YAGH","hE1QlZhwG1","pFrrltuDyS","ciuWzFLsph","hSSvQK4GS8",
+"9XyT9MojnP","QbxXcmX2GE","d85a9he9IA","wDajXlXFOB","uAWypfcJOy","IBe8kMaJQs","LewvMW7cTs","RkQke580YD","iKqhrRACuj","Ul4a1OHaBz",
+"uTacx24ARF","5Nammi3pyd","GrDg7RmDcr","CxVEfSbRYy","IjTwPQ6Lix","5drc6d85a9","qaofNOxWIH","OxWIHJKWYR","7ku1p1j5L8","zHF1qoVQp6",
+"nnP8oB3qem","b29RJQbxXc","HP4338U2nU","pWiOsogLgc","uJScXcQOnv","Ul4a1S77LH","uvf7Am4bxU","QworuoVQp6","AXpwEHfyNQ","suY4xGWqqX",
+"8xEKzlj07Q","sx5GlpAhR1","hUTw7uTacx","n1pmOkB5nP","9rlg9ZUnqt","9iGoTdjsrv","AkKTktAOsr","ZUnqtzHF1q","Mkgy81j5L8","brhlQKsjRK",
+"FhtglMaJQs","FLsphi3pyd","QChxsni2v1","7hyVvIjTwP","RkQkeIBe8k","Ul4a1RBhp0","lweGygtCA5","SmGzvLewvM","LewvMAmdQd","9y4lwyvOMI",
+"okgRipAhR1","zQt6Q6AFT0","CNHmv8RCUA","tjQxsdQ586","l83UdTXQ0Z","W3VFHSs0Zu","64s8NFLsph","CNHmvJJs5m","QChxsCxVEf","pAhR1CIShG",
+"Pb1paQChxs","v2eC3Mm8si","HRxd8VLTy6","J2mQiGrDg7","O3iyQZuDtD","n1pmOokgRi","RmDcr7ku1p","yofH3aFFss","e6e4zHfyNQ","jSjS3fFDrJ",
+"KASQ8SbRYy","9GXkXWDVWJ","faHird85a9","RxrsmSWfou","djsrve6e4z","mz8gxFGzgp","OHaBzPYBf4","iKqhrKsjRK","YOfrYuAWyp","jzUqRCfgr3",
+"AmdQdv2eC3","24ARFBGaQY","uPX7GYOfrY","2DREslCMxy","C2IrcY1mC0","L7cGcS77LH","WreyPSbRYy","JRJQBs7Mxk","XflUqdmoS7","Ul4a1X6Pin",
+"HzZT8v1Hln","MmsIolViBv","guMb8pWiOs","AgJHQPb1pa","lm0pDlj07Q","9rlg9hYBCK","QWxoTGv3Fq","Yw2oUJkzUn","HRxd8kZANm","azIWpHlUbF",
+"64s8NzqH0W","RzaZAJKWYR","Ta8f6i3pyd","vkCHHOz8yZ","2NslmUl4a1","M6qcGDz1R3","soy9tTCgPp","fLNg8fLNg8","QClRLPYBf4","XflUqsuY4x",
+"QssNCsx5Gl","i7WMQd85a9","StlDJFGzgp","FVMxoSbRYy","9rlg9jSjS3","Mm8sii3pyd","7ku1p0Kyfs","ciuWzJkzUn","s93MlMmKGJ","atef2Vprf2",
+"uvf7AZJTXH","0Wr5y6q6L9","FNYIMIRh48","I7p2aaL6AJ","HRxd8taOXK","lViBvv8yFN","Cfgr35ZaEz","faHir5Mg9r","No0QbfcwDa","WDVWJ4W0Tl",
+"yToGW29QAz","RBhp00Kyfs","uoStws93Ml","mz8gxZzJHW","GXdoHulk41","QChxsuN6r3","jS1ajAkKTk","CdyBVThjNn","55rfBHfyNQ","9rlg9lweGy",
+"jeskSAgJHQ","1v5hHOz8yZ","0Wr5yJXljW","TwanoaDGtS","DcpWB7ku1p","pmeCdnFqik","580YD5ZaEz","3weIFFjHXR","M3zXLyofH3","2TRI7QChxs",
+"MojnPSWfou","48cHLEOE1o","cL0aERxrsm","nlaByFnPFB","dQ586UlU3M","ciuWz9rlg9","v8yFNv2eC3","d7vjMfFDrJ","NcICAVjCZq","aDGtSaDGtS",
+"K20wK5drc6","cL0aEHP433","HP433hYBCK","yEfy9K4GS8","29QAzni2v1","aez9yAmdQd","618Di0PktI","StlDJd7vjM","yEfy9guMb8","48cHLmX2GE",
+"8FmFH8U2nU","S2DfudhSuH","618DixReec","KZamHFFDui","W7cTsqaofN","vOqCETa8f6","2DREsWDVWJ","VIlwPCfgr3","RmDcrAXpwE","gf8rIAIYUu",
+"IBe8kjiVBP","ThjNnoVQp6","kZANmC2Irc","VjCZqGrDg7","djsrvCIShG","CdyBVdjsrv","GWqqXThjNn","JJs5m24ARF","5Mg9rbrhlQ","TwanopvgjS",
+"Mkgy8jeskS","xXTI4ni2v1","Vprf2Yf2Ec","BbwgAPOUYS","hSSvQhSSvQ","ZhwG1djsrv","UlU3Mt98iW","BpYhVyvOMI","dpe1vvkCHH","K20wKAgJHQ",
+"GrDg78FmFH","pAhR1VLTy6","lweGy0Kyfs","SWfouFwEJz","azIWpQbxXc","QWxoTxReec","jeskSY1mC0","fqypy1v5hH","cShY2d85a9","U3yw564s8N",
+"bZLvS7Ow5C","uQIczSjskQ","i7WMQRkQke","VLTy6K20wK","wiHrZG1RhS","h1zcH0Kyfs","AgJHQsqVrf","x3LDejiVBP","zFgtBMGlTF","Gv3Fqru4UG",
+"D6rByaez9y","zFgtBRBhp0","QClRLmz8gx","In3NSYf2Ec","lCMxyMGlTF","Pb1paGWqqX","hi5X7cmXIX","Zv7z0BGaQY","xciqpTXQ0Z","7ku1pZuDtD",
+"qaofNatef2","HRxd8Kr8ys","iB08lix74r","cQOnvRmDcr","tjQxsJXljW","tl72WCNHmv","IBe8kd85a9","taOXKsoy9t","pWiOsIRh48","4dEz6faHir",
+"kZANmSjskQ","cL0aEHfyNQ","uoStwYw2oU","AIYUulXFOB","W7cTsFhtgl","lViBvO3iyQ","ReKEW9eoRc","jfREuzqH0W","8hJdtJKWYR","5Drn0IRh48",
+"tlILtUmaEv","2ZHdkSjskQ","hUTw7OUqFM","Z4I1vhi5X7","9XyT9ZzJHW","5iGN51LB1L","Ul4a1lm0pD","nFqikMm8si","Mm8siZJTXH","pmeCdlweGy",
+"zmLYDOUqFM","7fsYMgtCA5","LDk6fx3LDe","LewvMhYBCK","ZUnqtwiHrZ","zz4ZUOUYuF","FhtglB3qem","oQ87r3weIF","ciuWzMojnP","3weIFs7Mxk",
+"RBhp0RzaZA","dQ586W3VFH","GrDg7KsjRK","5Mg9rn1pmO","uAWyp45cIH","IBe8kNOHsz","QworuTa8f6","hE1QlNo0Qb","7fKYU4dEz6","C2IrcHlUbF",
+"pT8wuVNCPd","vLsmStaOXK","0Wr5yNOHsz","pvgjStvdkD","qQxHPs93Ml","In3NSiB08l","Kr8ysAXpwE","v8yFNhe9IA","ECMvUS77LH","uZPqgGrDg7",
+"qQxHPNAFuw","14FLRaL6AJ","WDVWJHlUbF","ni2v1uN6r3","m4bxUAmdQd","zqH0WG1RhS","EdBKcn8pJ9","618Di14FLR","9y4lwydG8U","Cp3mZ7ku1p",
+"MmKGJP6bcg","W7cTs8cVD3","GXdoHdQ586","AkKTksoy9t","iqv4ki3pyd","P6bcgDcpWB","Yf2EcCfgr3","hE1QlFwEJz","Mm8siZ4I1v","AIYUuThjNn",
+"vOqCEW7cTs","zmLYDM3zXL","gdQsS4W0Tl","taOXKlpF6W","VBjhzOUqFM","b29RJZ4I1v","CqqaDI7p2a","1LB1Ld85a9","0KyfsoQ87r","9iGoTrhl0J",
+"WmadAzY1GY","s93MljiVBP","dQ586CxVEf","CxVEfcQOnv","9GXkXwiHrZ","1LB1L9XyT9","OHaBzRACuj","gdQsSJKWYR","RxrsmVprf2","7ku1pgdQsS",
+"ZuDtDHRxd8","aDGtSKr8ys","4W0TlK4GS8","4dEz6dhSuH","MGlTFGv3Fq","RsQUqtl72W","ru4UGy94nw","jS1aj64s8N","vLsmS618Di","W3VFHh1zcH",
+"NOHszl83Ud","cL0aES2Dfu","5nmWvyEfy9","RACujDz1R3","YjB9tnnP8o","5Mg9rokgRi","blLA9djsrv","tvdkDDcpWB","fqypyFVMxo","JKWYRMkgy8",
+"cL0aENo0Qb","uLtKsoQ87r","mX2GEZuDtD","fmIK1YjB9t","618DiDz1R3","t98iWjzUqR","sx5GlBbwgA","JkzUni7WMQ","RBhp0CK5W7","7hyVv8xEKz",
+"HRxd8B3qem","45cIHFcWrW","WmadARmDcr","rKDLJOUYuF","dpe1vKsjRK","YjB9tQ6Lix","ydG8UWPmlx","48cHLuQIcz","SbRYyOHaBz","vOqCEMGlTF",
+"9rlg95Namm","v8yFNQ6hMC","FjHXR7lUXZ","okgRihUTw7","ru4UGZuDtD","pFrrlQ6Lix","CNHmvSmGzv","UlU3MM3zXL","ni2v1gdQsS","Yw2oUfcJOy",
+"NOHszdmoS7","Ul4a1ReKEW","iwzGk9XyT9","gtCA5vLsmS","8hJdtrz7Ut","XflUqvOqCE","W3VFHZhwG1","hUTw7i7WMQ","Fhtgl7ku1p","qaofNOHaBz",
+"0PktI9iGoT","MezSWdQ586","0YAGHWMiS3","b29RJCK5W7","F6PT2ReKEW","fcJOyyluBx","aFFssFNYIM","ni2v1Vprf2","s4786RsQUq","o8UydP6bcg",
+"zQt6QuN6r3","580YD7hyVv","k85AeStlDJ","YOfrYMkgy8","P6bcgM6qcG","DG4sT5iGN5","QYxC0uTacx","zz4ZUQworu","uPX7Gd85a9","ReKEWhUTw7",
+"hSSvQ16lHc","soy9t2TRI7","9rlg9lm0pD","lH1ktsx5Gl","AkKTkcShY2","d85a9ECMvU","blLA9GXdoH","iB08lRACuj","qQxHPBpYhV","blLA97ku1p",
+"Mkgy8pFrrl","0Wr5y0ao3l","Zv7z0SWfou","EdBKcHP433","lkMUAStlDJ","9y4lwd85a9","sx5Gl5Namm","QChxswDajX","5VZjSZhwG1","vOqCEhE1Ql",
+"JKWYR4QMc9","s4786Waim6","n8pJ9aL6AJ","Y1mC0ReKEW","1LB1LgIYvE","BbwgA7Ow5C","iB08laDGtS","oGu6x4dEz6","uoStwuLtKs","jSjS3o8Uyd",
+"tjQxskB5nP","k85AeAkKTk","d7vjMECMvU","ZzJHWSbRYy","FcWrWQ6Lix","kB5nPtlILt","sx5GlAXpwE","HzZT8nlaBy","MK07YKsjRK","fmIK1lH1kt",
+"0ao3lJJs5m","jeskS7hyVv","lViBvFnPFB","t98iWdQ586","tvdkDZJTXH","HfyNQ8cVD3","yEfy9AXpwE","i7WMQQWxoT","kB5nPjeskS","tuDySciuWz",
+"fcwDaYjB9t","Vprf2KsjRK","FGzgpx3LDe","IBe8kNhXdu","WPmlxCxVEf","5Namm0BmCy","pv0i7CIShG","07n1cpiJSk","DLhzMlweGy","pFrrlX6Pin",
+"IBe8kOUYuF","Uvlv4fFDrJ","xXTI4S77LH","atef2jfREu","d85a9MezSW","VBjhzEOE1o","k85Ae64s8N","Chuy3tlILt","d85a95ZaEz","DG4sT8xEKz",
+"uAWypDcpWB","dpe1vMezSW","s93Mltl72W","2NslmStlDJ","JRJQB2hEEU","QworuzY1GY","FLsphK20wK","7fsYMHRxd8","AkKTksqVrf","OUYuFYjB9t",
+"7lUXZFwEJz","prNT6kB5nP","jfREu7hyVv","QChxsydG8U","Dz1R3JIqXi","F6PT2XflUq","4QMc9n1pmO","Vprf2QChxs","UmaEvi7WMQ","zHF1qGXdoH",
+"WaWsvK20wK","Nxx9VJXljW","x3LDeuupzk","ix74rmX2GE","lsQGo07n1c","3otm6WPmlx","jeskSAXpwE","FLsphEdBKc","9rlg9HfyNQ","MK07YK4GS8",
+"BGaQYTwano","ciuWzAkKTk","HRxd8lViBv","mz8gxRkQke","ix74rThjNn","HlUbFThjNn","vOqCE1v5hH","gjUTuazIWp","In3NSd85a9","fcwDaBCxeC",
+"QssNCCNHmv","Oz8yZGv3Fq","AIYUuuvf7A","FFDuiQChxs","QWxoTKASQ8","ThjNnuvf7A","QChxsaL6AJ","RACujHRxd8","l83UdQWxoT","9XyT9LewvM",
+"0ao3l5Mg9r","EOE1ojiVBP","8TxD7v2eC3","zQt6QjSjS3","S2Dfui7WMQ","iqv4kgf8rI","VBjhzgjUTu","3weIFJ2mQi","In3NStuDyS","KsjRK5nmWv",
+"8RCUAQworu","8cVD3jSjS3","vOqCEyEfy9","zbIYYbZLvS","2NslmJkzUn","vOqCEDcpWB","9eoRcyluBx","hUTw7VLTy6","0PktIKr8ys","zHF1q0ao3l",
+"GrDg7zbIYY","2NslmAXpwE","Dz1R3v8yFN","NOHszk85Ae","MmKGJFjHXR","WmadAPb1pa","cShY2iKqhr","HRxd829QAz","kZANmRkQke","8cVD3PYBf4",
+"Nxx9VlkMUA","yEfy92DREs","Mkgy85IhmG","O3iyQoQ87r","iB08l55rfB","P6bcg5VZjS","5Drn0FVMxo","i7WMQni2v1","t59lRcQOnv","h1zcHiqv4k",
+"DLhzM5ZaEz","QworuIBe8k","IRh48o8Uyd","Mm8si7fKYU","8U2nUjiVBP","uoStwoVQp6","d85a9BbwgA","SbRYyHP433","9iGoTfaHir","L7cGcpWiOs",
+"Mm8siCdyBV","Q6hMCQWxoT","No0QbS77LH","JkzUnK4GS8","BFkb8P6bcg","yluBx0MR5X","2ZHdkL7cGc","MmsIoFnPFB","uoStwhUTw7","AkKTkzFgtB",
+"yluBxlj07Q","55rfBVLTy6","14FLRzbIYY","9GXkXfLNg8","Yw2oUUl4a1","ZzJHWQClRL","tlILt14FLR","uupzknnP8o","VerEADG4sT","t98iW8FmFH",
+"AmdQdFxX9q","P6bcgfaHir","CNHmvfcJOy","Mkgy88hJdt","xciqp8cVD3","d7vjMiB08l","ksJby0Kyfs","qaofNWaim6","oGu6xLbRTH","PYBf4OHaBz",
+"cL0aEDLhzM","QssNCrKDLJ","lsQGoksJby","HfyNQDQimp","AOgEeEdBKc","6q6L9jS1aj","No0QbzqH0W","pmeCdAkKTk","hYBCKWPmlx","0PktIru4UG",
+"RzaZANOHsz","6AFT0BFkb8","euZA5xciqp","P6bcgfcJOy","9eoRcs4786","16lHccQOnv","zbIYYv1Hln","8hJdtCNHmv","sx5GlYw2oU","cQOnvxReec",
+"ECMvUtjQxs","cShY2Dz1R3","cShY2hE1Ql","O3iyQzFgtB","Yw2oUW7cTs","b29RJL7cGc","Waim6Q6Lix","9y4lwciuWz","mX2GE8cVD3","blLA9CxVEf",
+"VBjhzFVMxo","zqH0Wix74r","aDGtS9eoRc","IjTwPDz1R3","ogLgciKqhr","n8pJ92Nslm","29QAzuupzk","rKDLJmz8gx","uoStw5Namm","tl72WyofH3",
+"tl72WciuWz","lpF6WWDVWJ","v8yFNGSQwj","jtn0XfmIK1","0BmCyDLhzM","ix74rYh1hF","7hyVvbgJAz","RpBQmYw2oU","vOqCEjzUqR","OHaBzpFrrl",
+"v8yFN5VZjS","e6e4zhE1Ql","WreyPiB08l","OxWIH1v5hH","AXpwERxrsm","rKDLJfcwDa","b29RJWMiS3","Z4I1vVjCZq","s93MluJScX","IBe8kAkKTk",
+"4dEz6iKqhr","fFDrJKASQ8","uQIczfcwDa","i7WMQMkgy8","zQt6QzFgtB","2DREsCdyBV","GSQwjoVQp6","KASQ8JkzUn","n1pmOSjskQ","dpe1vo8Uyd",
+"SbRYyfqypy","NhXdu7X3uy","dQ586XyPZN","8hJdtzz4ZU","1LB1LJIqXi","FwEJzk85Ae","BCxeCiB08l","EOE1oPb1pa","8TxD7Uvlv4","WmadAXflUq",
+"pFrrllViBv","WMiS3l83Ud","QbxXc8TxD7","uPX7GUl4a1","CdyBVKsjRK","s4786J2mQi","pT8wupT8wu","5Mg9rAOgEe","Yw2oUCp3mZ","VjCZqVIlwP",
+"QssNCIRh48","lweGyHRxd8","kZANmuoStw","6q6L9GWqqX","ix74rD6rBy","SbRYytaOXK","zqH0W9rlg9","5Mg9rOUqFM","VNCPdjeskS","fcJOyaDGtS",
+"W3VFHokgRi","fqypyDcpWB","uJScX5Drn0","IBe8kb29RJ","pvgjS1j5L8","L7cGcuTacx","ZUnqtxciqp","U3yw55iGN5","0ao3lcmXIX","tuDyS1j5L8",
+"ix74rzHF1q","RBhp0y94nw","JKWYRRkQke","Ta8f6CIShG","CIShGd7vjM","P6bcgBpYhV","DcpWBjS1aj","AkKTkCNHmv","zY1GYyofH3","2Yz7ELbRTH",
+"UmaEv5nmWv","AkKTkQworu","pAhR1QChxs","EdBKcguMb8","3weIF2ZHdk","ksJbyMm8si","FjHXRQnJ1S","jeskSulk41","jiVBPfaHir","aFFssIBe8k",
+"CK5W7IKxdL","fcwDalkMUA","h1zcHyEfy9","uvf7Aiqv4k","7Ow5CGXdoH","JKWYRYOfrY","lpF6WKZamH","FPfSEiqv4k","GXdoH0Kyfs","s4786Nxx9V",
+"uPX7GfaHir","BpYhVdQ586","JIqXiv1Hln","WreyPLewvM","3otm6Rxrsm","7fsYMDz1R3","Gv3FqpT8wu","h1zcH1LB1L","IBe8kv8yFN","uZPqgQClRL",
+"9GXkXb29RJ","0MR5X8TxD7","vOqCE4W0Tl","faHir64s8N","AIYUudjsrv","FFDuiCNHmv","t98iWQYxC0","1j5L8580YD","AIYUuPOUYS","oGu6xnFqik",
+"euZA5P6bcg","SjskQ5nmWv","ZhwG1LbRTH","DG4sTNOHsz","Gv3Fqhi5X7","faHirF6PT2","djsrv2hEEU","FPfSE5ZaEz","zQt6QZ4I1v","zbIYYMmKGJ",
+"x3LDeMaJQs","RkQke8U2nU","Oz8yZRBhp0","EOE1oyEfy9","nFqikSmGzv","OUqFM0MR5X","i3pydAgJHQ","azIWpiwzGk","YOfrYFjHXR","Yf2EcfLNg8",
+"oVQp6Pb1pa","580YDmz8gx","HP433CK5W7","MmKGJgtCA5","X6PinS77LH","fmIK1AgJHQ","IjTwPqUJMd","i7WMQMmsIo","zQt6Q0Kyfs","zFgtBF6PT2",
+"VNCPdzFgtB","iKqhrNhXdu","Mm8simX2GE","yEfy9t98iW","RACujdjsrv","ru4UGOz8yZ","P6bcgSjskQ","HRxd8aL6AJ","vOqCEChuy3","VjCZqIKxdL",
+"NcICA5Mg9r","VjCZqprNT6","14FLRgtCA5","O3iyQCK5W7","yofH3JkzUn","uPX7GJXljW","B3qemIjTwP","0ao3lJKWYR","hi5X79eoRc","BGaQYG1RhS",
+"RzaZAUvlv4","9y4lwW7cTs","jtn0XHRxd8","JRJQBChuy3","2ZHdkfcwDa","hE1QlBbwgA","Ss0Zus93Ml","QYxC00ao3l","RxrsmwiHrZ","Q6hMCEoToP",
+"ru4UG0PktI","6q6L9prNT6","Q6Lix6q6L9","9GXkXUl4a1","Chuy3Cp3mZ","gtCA5nnP8o","AmdQdeuZA5","FGzgpblLA9","2hEEU5drc6","WreyPIBe8k",
+"SjskQxXTI4","4QMc9K20wK","prNT6vOqCE","brhlQ9rlg9","UmaEvd85a9","JkzUnVNCPd","4QMc9AOgEe","blLA9cQOnv","dhSuHydG8U","jiVBPYOfrY",
+"bgJAzhe9IA","e6e4zSbRYy","580YDzY1GY","gdQsSjfREu","zz4ZUuN6r3","Ss0ZuMkgy8","IBe8kuPX7G","U3yw5suY4x","8hJdtRACuj","FNYIM48cHL",
+"WreyPZuDtD","D6rByCxVEf","tvdkDSbRYy","n8pJ9s7Mxk","iwzGkSWfou","UmaEv580YD","NOHszNo0Qb","VBjhzWaim6","ix74rsqVrf","WDVWJx3LDe",
+"4dEz69y4lw","ZzJHWCK5W7","prNT6jeskS","Vprf2s4786","B3qemI7p2a","3otm6jeskS","ksJbylsQGo","AIYUuhSSvQ","No0QbMojnP","lXFOBHfyNQ",
+"QssNCVjCZq","BCxeCx3LDe","FjHXRGrDg7","EdBKc7hyVv","K4GS8ZUnqt","taOXKYOfrY","ZJTXH0Wr5y","FFDuik85Ae","3otm62Nslm","wDajXt59lR",
+"iqv4kjfREu","zHF1qmz8gx","7Ow5ClXFOB","PYBf4b29RJ","MK07Yhi5X7","jSjS35nmWv","JXljWpAhR1","OxWIHvOqCE","soy9trz7Ut","K4GS8XyPZN",
+"Cfgr3hSSvQ","5VZjSvLsmS","LbRTHF6PT2","4QMc9Q6Lix","GrDg7uJScX","NhXduKsjRK","FhtglCdyBV","GrDg7oVQp6","QnJ1Sx3LDe","hE1QljiVBP",
+"uQIczIjTwP","Dz1R3BFkb8","FxX9qMojnP","a00b5hE1Ql","RxrsmBbwgA","NAFuwGv3Fq","ciuWzStlDJ","5NammRpBQm","lsQGoru4UG","dpe1v0PktI",
+"0MR5XdmoS7","4W0Tlv8yFN","iwzGkdhSuH","5NammBpYhV","UlU3M7fsYM","uAWypKr8ys","WmadAGSQwj","fcJOyBbwgA","vOqCEVNCPd","JIqXii3pyd",
+"CIShGO3iyQ","Q6LixHlUbF","zQt6QbZLvS","JKWYR7Ow5C","fmIK1Ul4a1","QworuIKxdL","QYxC0dQ586","n1pmOWDVWJ","vOqCENhXdu","lweGyLDk6f",
+"o8UydfLNg8","zQt6QNcICA","bgJAz0h1b1","qQxHPcQOnv","KsjRKd85a9","vkCHHYjB9t","07n1cpv0i7","PYBf4gjUTu","FwEJznFqik","SbRYyRsQUq",
+"uJScXd7vjM","UmaEvFjHXR","0PktIBGaQY","Vprf2HfyNQ","lsQGoBpYhV","FPfSE5drc6","Cp3mZCNHmv","xciqplViBv","07n1cmX2GE","D6rByKsjRK",
+"ru4UGi7WMQ","CxVEfXyPZN","KASQ8GSQwj","Q6Lixi3pyd","5iGN5U3yw5","StlDJtuDyS","9GXkXpiJSk","QWxoT8FmFH","s4786EoToP","lViBvuoStw",
+"h1zcHhe9IA","OHaBzzY1GY","vkCHHSmGzv","mz8gxEdBKc","FNYIMxReec","n1pmOjfREu","Cfgr3fmIK1","RkQke7fsYM","Ss0ZuWmadA","AXpwEi3pyd",
+"2TRI7bgJAz","bgJAzDG4sT","JIqXi9GXkX","GrDg7kZANm","0YAGHv8yFN","ix74rReKEW","QClRLUlU3M","MaJQsMK07Y","VerEABCxeC","h1zcH8xEKz",
+"oGu6xIn3NS","YjB9tO3iyQ","9XyT9W7cTs","7Ow5CJXljW","6AFT0pWiOs","QssNCsuY4x","zQt6QYf2Ec","1LB1LStlDJ","pFrrlulk41","xXTI4Ta8f6",
+"hUTw7aez9y","2TRI78xEKz","L7cGcPOUYS","Dz1R3oGu6x","24ARFKsjRK","uTacxF6PT2","WmadAbrhlQ","x3LDeblLA9","FnPFBFNYIM","sx5GlJ2mQi",
+"CNHmvn8pJ9","MmKGJ1LB1L","ZJTXHNxx9V","Vprf2pWiOs","AOgEe5drc6","ZuDtDHfyNQ","K4GS8StlDJ","FxX9q0BmCy","In3NSReKEW","dQ586Cfgr3",
+"ksJbyb29RJ","YOfrYtAOsr","JJs5mfcwDa","i7WMQ9iGoT","lH1kt14FLR","ZzJHW0YAGH","rhl0JYjB9t","dhSuH2Yz7E","tvdkDzmLYD","1v5hHChuy3",
+"Chuy3RsQUq","9eoRcuPX7G","prNT614FLR","NAFuwpiJSk","dmoS7P6bcg","aDGtSydG8U","9XyT91j5L8","x3LDe0h1b1","55rfB7fKYU","FwEJz0YAGH",
+"VNCPdCfgr3","OHaBz7X3uy","KASQ8jSjS3","HRxd8uPX7G","HzZT88xEKz","S77LHYh1hF","zHF1qNAFuw","taOXKTwano","tvdkDwiHrZ","KASQ8WaWsv",
+"hE1QlwDajX","uJScXQ6hMC","S2DfuMm8si","GSQwjKsjRK","VNCPdl83Ud","lXFOBC2Irc","4QMc9QnJ1S","Ss0ZujeskS","dmoS7okgRi","hi5X71LB1L",
+"gIYvErhl0J","64s8NMmKGJ","RxrsmDLhzM","ZJTXHlViBv","8U2nU2Yz7E","Dz1R3FxX9q","Yf2EcfmIK1","BGaQYv1Hln","5VZjSFGzgp","x3LDen1pmO",
+"Z4I1vdQ586","CqqaDCqqaD","wiHrZlsQGo","l83Ud0ao3l","7ku1pmz8gx","AIYUu0PktI","jSjS3TXQ0Z","FGzgpGSQwj","iB08l2TRI7","gIYvERzaZA",
+"KZamHOxWIH","rz7Ut0ao3l","580YDUlU3M","lweGyk85Ae","0PktIBbwgA","kZANm55rfB","uN6r3djsrv","Zv7z0taOXK","oVQp6BGaQY","lH1ktFjHXR",
+"NOHszEOE1o","Uvlv4OUYuF","UmaEvgdQsS","hUTw7s7Mxk","soy9tlkMUA","lCMxyzQt6Q","qQxHPjiVBP","tjQxsWPmlx","fLNg8YjB9t","7Ow5CaL6AJ",
+"Ss0ZunlaBy","aFFssZzJHW","fmIK1WPmlx","uTacxlsQGo","FxX9qHlUbF","3otm6ogLgc","Ss0ZuFhtgl","BpYhVaez9y","IjTwPzFgtB","VjCZqPb1pa",
+"ReKEWulk41","uPX7GStlDJ","dmoS7Kr8ys","64s8Ni7WMQ","aez9yHlUbF","cmXIXoVQp6","uZPqgGXdoH","fcJOypv0i7","9y4lwlViBv","tAOsr14FLR",
+"AIYUu14FLR","aez9yIjTwP","OHaBzciuWz","x3LDezQt6Q","uvf7AfaHir","Uvlv4WmadA","BFkb8rz7Ut","SmGzvtjQxs","QworuUlU3M","PYBf40ao3l",
+"o8Uyd45cIH","fcwDaQWxoT","CIShGJJs5m","QnJ1SStlDJ","OHaBzulk41","BCxeClm0pD","NAFuwQWxoT","HRxd8ulk41","6q6L9t59lR","hSSvQqaofN",
+"lm0pDbZLvS","Waim62ZHdk","Oz8yZlsQGo","atef2b29RJ","5Mg9rYh1hF","QnJ1SzmLYD","BGaQYpAhR1","prNT6IKxdL","lkMUA0YAGH","JIqXiZUnqt",
+"AmdQdMojnP","aFFssKr8ys","uAWypjSjS3","RBhp0lpF6W","d85a9uupzk","RpBQmMezSW","lweGyjfREu","5VZjShE1Ql","uAWypMK07Y","IKxdLW3VFH",
+"n1pmOlm0pD","XflUqfcwDa","7lUXZLDk6f","rhl0Jk85Ae","fqypyMaJQs","QYxC0X6Pin","VLTy6kZANm","bgJAz7X3uy","0h1b1SjskQ","RzaZAoVQp6",
+"hYBCK48cHL","IjTwPYjB9t","FVMxoUlU3M","t98iWC2Irc","zFgtB8RCUA","HP433EdBKc","64s8NZUnqt","8TxD7tuDyS","MezSWYjB9t","VjCZqyToGW",
+"MojnP8FmFH","Ta8f6FjHXR","7lUXZeuZA5","F6PT2oVQp6","ksJbypmeCd","7fKYUlpF6W","8xEKzguMb8","0Wr5yhE1Ql","P6bcggIYvE","s93Mlulk41",
+"o8UydCdyBV","zFgtB5VZjS","7fKYUn1pmO","hUTw7iqv4k","16lHcgf8rI","Mkgy8MmsIo","uQIcz2DREs","OHaBzfFDrJ","Fhtgl5VZjS","i7WMQzFgtB",
+"k85AeM6qcG","AOgEetuDyS","AXpwEpT8wu","nnP8o7fKYU","he9IArKDLJ","WDVWJgf8rI","0h1b1x3LDe","Y1mC0jeskS","a00b5KsjRK","TwanoSjskQ",
+"WaWsvpFrrl","wDajXyToGW","ogLgcSs0Zu","8xEKzbrhlQ","qQxHPt59lR","5nmWvjiVBP","jtn0XLbRTH","55rfBVIlwP","BCxeCFNYIM","618DihSSvQ",
+"RzaZA45cIH","0KyfsdmoS7","jiVBPgIYvE","TwanoCqqaD","VBjhz8RCUA","MezSW9eoRc","xXTI4Yf2Ec","29QAz8FmFH","h1zcHt98iW","ru4UGpFrrl",
+"AgJHQfcJOy","pT8wutvdkD","ksJby29QAz","D6rByksJby","wDajXhUTw7","GrDg70BmCy","KASQ85Namm","taOXKK20wK","cShY2RACuj","vkCHHx3LDe",
+"D6rBysoy9t","zmLYDJkzUn","uQIczvOqCE","FFDuiQbxXc","GSQwjbgJAz","mz8gx24ARF","aFFssCfgr3","yToGWjtn0X","i7WMQNAFuw","wiHrZ45cIH",
+"0PktIEdBKc","3weIF7Ow5C","qaofNQssNC","ZJTXHTCgPp","iKqhr5Mg9r","O3iyQdpe1v","YjB9tGXdoH","9rlg9KsjRK","pAhR1lpF6W","ECMvUyToGW",
+"BbwgARkQke","NhXduX6Pin","FLsphfcwDa","CxVEfjfREu","UlU3Mmz8gx","yEfy9uQIcz","ZzJHWECMvU","VNCPdRkQke","Q6hMCaL6AJ","t98iWReKEW",
+"iwzGk7hyVv","XflUqL7cGc","WDVWJJIqXi","jiVBPIBe8k","y94nwOxWIH","m4bxUKZamH","fqypywiHrZ","prNT65Drn0","b29RJP6bcg","1j5L8Chuy3",
+"AXpwEFjHXR","Gv3FqQWxoT","S2DfuK4GS8","pmeCdB3qem","BFkb8pmeCd","ZzJHWL7cGc","0ao3lk85Ae","64s8NDLhzM","tl72WFwEJz","ksJbycL0aE",
+"16lHcQChxs","pmeCdbgJAz","uZPqgPYBf4","Mkgy8QnJ1S","29QAztlILt","JkzUnJIqXi","WaWsv8FmFH","VIlwPaDGtS","HlUbF4W0Tl","VjCZqoGu6x",
+"tl72Wd85a9","QChxsnnP8o","oVQp6Dz1R3","Nxx9VqQxHP","7hyVvmz8gx","16lHc8TxD7","AIYUuuPX7G","lkMUAWmadA","HRxd8KsjRK","8RCUAix74r",
+"nFqikv2eC3","yEfy9B3qem","yvOMIhi5X7","v1HlnsqVrf","0Wr5yix74r","MaJQsAIYUu","fmIK10ao3l","ZzJHWgdQsS","9rlg9QClRL","0PktI4QMc9",
+"HfyNQd7vjM","lXFOBh1zcH","djsrvdjsrv","29QAzEdBKc","lkMUARBhp0","VNCPdPOUYS","zQt6QCdyBV","7fsYMvLsmS","Cfgr3CIShG","Ta8f6GSQwj",
+"W7cTsdhSuH","uvf7A0PktI","JIqXiyToGW","gdQsStAOsr","ru4UG0Wr5y","KsjRKHlUbF","pv0i77hyVv","iqv4kiqv4k","OHaBzaDGtS","WMiS3mX2GE",
+"M6qcGfmIK1","nnP8oi7WMQ","8RCUArz7Ut","t98iWlkMUA","pFrrlyEfy9","i7WMQMm8si","hE1QlpFrrl","6AFT0aez9y","suY4x1v5hH","DG4sTAkKTk",
+"xciqp5Drn0","7lUXZ8FmFH","MojnPjfREu","BbwgApAhR1","FnPFBGSQwj","djsrv3weIF","zFgtBWmadA","bgJAz7fKYU","d7vjM0YAGH","MojnPKZamH",
+"BGaQY1j5L8","JJs5mcShY2","Z4I1vDG4sT","Vprf2CdyBV","0BmCyU3yw5","HlUbFFVMxo","IKxdLbgJAz","lXFOBrhl0J","i7WMQjzUqR","MK07YGSQwj",
+"5Nammsx5Gl","7lUXZThjNn","HfyNQFGzgp","mz8gxKr8ys","BpYhVjzUqR","tl72WMezSW","GWqqXzz4ZU","YjB9tpFrrl","dQ586MmsIo","aFFssfmIK1",
+"zmLYD7X3uy","D6rByD6rBy","6AFT0hi5X7","Q6hMCU3yw5","uZPqg5Drn0","cQOnvMaJQs","uN6r3IjTwP","POUYSAgJHQ","dhSuHpWiOs","MezSW24ARF",
+"PYBf4VjCZq","RxrsmPYBf4","8U2nUFnPFB","4dEz6OxWIH","uZPqgQChxs","0PktICqqaD","3otm614FLR","gjUTuvkCHH","uLtKs4QMc9","cL0aEjtn0X",
+"8FmFHs93Ml","S2DfuSs0Zu","bZLvS8TxD7","iB08l29QAz","jiVBPAXpwE","ydG8U9GXkX","e6e4zblLA9","NhXduh1zcH","G1RhS6AFT0","yvOMIpT8wu",
+"5nmWv1j5L8","Ta8f6lkMUA","taOXKKsjRK","atef2uQIcz","VBjhzd85a9","n8pJ9FNYIM","VBjhzNo0Qb","MojnPtlILt","RmDcrRBhp0","xXTI4e6e4z",
+"GSQwjVLTy6","ReKEWxXTI4","zbIYYSs0Zu","Gv3FqFNYIM","oGu6xK4GS8","cShY2JIqXi","mz8gxhE1Ql","aDGtSSjskQ","POUYS7fsYM","CK5W7S77LH",
+"dQ586NhXdu","oGu6xB3qem","D6rByVprf2","Vprf2nFqik","gf8rIdQ586","uvf7A580YD","taOXKOHaBz","bgJAzMm8si","CNHmvtlILt","8U2nU0YAGH",
+"djsrvOHaBz","Zv7z0Waim6","0PktItl72W","BFkb8bgJAz","OUYuFQ6hMC","gIYvEYh1hF","dQ586lViBv","7X3uy7Ow5C","t98iW5VZjS","azIWpgf8rI",
+"618DiBCxeC","iB08lY1mC0","QChxsMm8si","GWqqXnnP8o","uoStwOz8yZ","EdBKcVerEA","y94nwMezSW","mX2GEpWiOs","ReKEWRkQke","ix74rn1pmO",
+"MGlTFQ6hMC","CK5W7Yh1hF","euZA5s4786","K4GS8b29RJ","TCgPpYjB9t","bgJAzVLTy6","QClRL8cVD3","gdQsSsqVrf","dpe1vjSjS3","vOqCEL7cGc",
+"6AFT0i7WMQ","yluBxQ6hMC","StlDJuN6r3","6AFT08FmFH","24ARFuAWyp","HzZT8KASQ8","Ss0ZuFPfSE","9y4lw1j5L8","ksJbyYf2Ec","M6qcGTXQ0Z",
+"faHirKZamH","X6PinzqH0W","KsjRKQ6Lix","FGzgp7Ow5C","oGu6xkB5nP","0YAGHd85a9","VNCPdhE1Ql","b29RJOUqFM","okgRii7WMQ","ThjNnYjB9t",
+"lweGyBCxeC","o8Uyd07n1c","29QAzWreyP","Y1mC0VBjhz","RmDcrQWxoT","HfyNQksJby","QbxXcQworu","VNCPdO3iyQ","faHirJ2mQi","XyPZNuvf7A",
+"RpBQmFnPFB","Y1mC0v1Hln","AgJHQdpe1v","DcpWBQnJ1S","2NslmfcJOy","k85AehSSvQ","jiVBPFPfSE","yvOMIbZLvS","QYxC0Vprf2","d7vjM2Nslm",
+"14FLRh1zcH","No0QbzbIYY","SbRYyhYBCK","WMiS3RzaZA","PYBf40MR5X","BFkb8pT8wu","dhSuHyvOMI","jS1ajJRJQB","8hJdtOUqFM","MmsIoiKqhr",
+"jzUqRPYBf4","VerEAfLNg8","EoToPYjB9t","DcpWBEdBKc","zHF1qjzUqR","cQOnvFFDui","Y1mC0tlILt","LewvMzQt6Q","8TxD70h1b1","4W0TlzY1GY",
+"d85a9pT8wu","XyPZNHzZT8","ThjNnJXljW","FxX9qsx5Gl","guMb8KZamH","uupzkPOUYS","0KyfsZ4I1v","nFqiktuDyS","AOgEe1v5hH","ydG8U8FmFH",
+"ZuDtDJ2mQi","HzZT89iGoT","ZzJHWVIlwP","piJSkUl4a1","CqqaDGWqqX","ulk41qUJMd","tuDySAmdQd","AmdQdksJby","JkzUnWmadA","guMb8CdyBV",
+"e6e4z2TRI7","dmoS7Ul4a1","14FLRQClRL","RxrsmZ4I1v","CxVEfS77LH","VerEA7X3uy","mz8gxPYBf4","ulk41Ta8f6","8hJdtdQ586","KsjRKFjHXR",
+"lsQGoUl4a1","2Yz7EDQimp","DLhzMblLA9","NOHszOxWIH","h1zcHprNT6","fLNg8cShY2","hUTw75nmWv","VerEAuTacx","VLTy6IjTwP","pFrrluLtKs",
+"5nmWvUl4a1","MGlTFhE1Ql","Zv7z0pvgjS","xciqpzFgtB","he9IAQWxoT","W3VFHoVQp6","uJScXReKEW","Oz8yZ2DREs","Q6LixCdyBV","8hJdtZv7z0",
+"Zv7z0OHaBz","NAFuwMmKGJ","pvgjSAXpwE","faHirAgJHQ","Waim6iKqhr","jS1ajnnP8o","0MR5Xatef2","dpe1vnFqik","MmsIoFNYIM","NhXduNAFuw",
+"qUJMdRxrsm","v2eC32hEEU","taOXKbZLvS","vLsmSMaJQs","Uvlv4WreyP","XyPZNjSjS3","JRJQBW3VFH","x3LDeaL6AJ","yvOMIksJby","2DREsReKEW",
+"B3qemrhl0J","KZamH0ao3l","1v5hHYOfrY","piJSkzz4ZU","0h1b1P6bcg","Pb1paPOUYS","FjHXRNxx9V","oVQp6BFkb8","jfREu580YD","StlDJOHaBz",
+"3otm6FFDui","IjTwPi7WMQ","d85a9JJs5m","8RCUAlj07Q","VBjhzFFDui","0PktI8cVD3","o8UydnnP8o","SjskQtuDyS","zz4ZURkQke","K4GS8MK07Y",
+"G1RhSlH1kt","O3iyQtAOsr","16lHcS77LH","BFkb80BmCy","tvdkDhYBCK","CdyBVMmKGJ","ru4UG7lUXZ","wDajXCqqaD","tlILtiwzGk","lH1ktoQ87r",
+"IjTwPbgJAz","2TRI7XflUq","Waim6lH1kt","RACuj9GXkX","jiVBPHP433","suY4xm4bxU","24ARF0Kyfs","Pb1palXFOB","5nmWvJkzUn","rKDLJpv0i7",
+"2NslmSmGzv","B3qempAhR1","mX2GEsuY4x","Z4I1vwDajX","v1Hln1v5hH","mz8gxUlU3M","zqH0Wuupzk","RzaZARzaZA","Dz1R3rz7Ut","JXljWuoStw",
+"qUJMdDz1R3","HfyNQVLTy6","Zv7z0RBhp0","B3qem24ARF","DLhzM1j5L8","QClRLU3yw5","Ul4a1jiVBP","tjQxsHlUbF","FhtglOxWIH","Mm8si7X3uy",
+"IKxdLB3qem","StlDJpFrrl","jeskSWMiS3","JKWYRGSQwj","RpBQm5Drn0","gIYvE9iGoT","n1pmOGrDg7","P6bcg580YD","VjCZqVNCPd","IjTwPUl4a1",
+"jS1ajFGzgp","uN6r3KASQ8","CK5W7uvf7A","FjHXRMm8si","1j5L82DREs","cmXIXKASQ8","6AFT0xReec","NOHsziKqhr","bgJAzMkgy8","CdyBVRACuj",
+"Nxx9VlH1kt","qaofNJKWYR","CdyBV2ZHdk","NcICAKsjRK","QnJ1S7X3uy","Ss0ZuuQIcz","14FLRgIYvE","uQIczNOHsz","Ta8f6v2eC3","8hJdtlm0pD",
+"3otm6ydG8U","euZA5ZJTXH","24ARFuvf7A","oVQp6Y1mC0","Gv3FqRACuj","Yf2EcpmeCd","P6bcgiqv4k","M3zXLJKWYR","NcICAMK07Y","B3qemWaWsv",
+"Kr8ysOHaBz","24ARFNOHsz","GWqqXbgJAz","JIqXiGXdoH","e6e4zK4GS8","1j5L88hJdt","VjCZqn8pJ9","k85AeeuZA5","5nmWvcL0aE","JkzUnaDGtS",
+"JRJQBtjQxs","4dEz6OUYuF","yvOMIVjCZq","0PktIK20wK","kB5nPfLNg8","s93Ml4dEz6","J2mQiydG8U","fcJOynFqik","4dEz6RmDcr","e6e4zCxVEf",
+"EOE1oUlU3M","y94nwi3pyd","5IhmGEoToP","Dz1R37lUXZ","7X3uykB5nP","OxWIHIKxdL","suY4xDQimp","K4GS8hSSvQ","8cVD3lXFOB","zmLYDB3qem",
+"yluBxGSQwj","jtn0XI7p2a","yluBxsx5Gl","K20wKnnP8o","xXTI4oQ87r","RzaZAVprf2","QWxoTlCMxy","YOfrYBpYhV","5IhmGoQ87r","pmeCdO3iyQ",
+"VNCPdZzJHW","n1pmOtlILt","Qworu9eoRc","faHirIKxdL","FVMxoHP433","16lHcFLsph","d85a9cQOnv","zmLYDhSSvQ","jfREuK4GS8","gIYvE45cIH",
+"POUYShe9IA","s7MxklXFOB","Cfgr3zQt6Q","QbxXcrKDLJ","Waim6XyPZN","7fsYM2hEEU","Vprf29eoRc","7lUXZJJs5m","fqypylH1kt","QbxXcn8pJ9",
+"5Drn0K20wK","sqVrfv2eC3","atef2cShY2","AIYUuAgJHQ","48cHL2TRI7","jzUqRzmLYD","QssNCzqH0W","Cfgr3RkQke","MaJQsRsQUq","K4GS8vLsmS",
+"cShY2618Di","FhtglThjNn","I7p2ayToGW","RzaZASs0Zu","CxVEf0h1b1","HfyNQC2Irc","uLtKsyluBx","iwzGkNOHsz","rz7UtxXTI4","4dEz6Ta8f6",
+"NcICAUl4a1","lXFOB7Ow5C","euZA5jiVBP","kZANmwDajX","ZhwG1vkCHH","GrDg7DcpWB","45cIHHlUbF","NAFuw9eoRc","VjCZqx3LDe","dhSuHFGzgp",
+"1LB1LwDajX","PYBf4MK07Y","Yh1hFK20wK","ZzJHWs93Ml","KZamH3otm6","cmXIX0MR5X","S2DfuS77LH","jtn0XgdQsS","atef2K4GS8","HRxd8i3pyd",
+"4dEz6ZzJHW","RzaZApT8wu","9XyT95iGN5","8TxD7zQt6Q","2hEEUEOE1o","9XyT9jeskS","zFgtB618Di","GWqqX9rlg9","ZzJHWlpF6W","Zv7z0SmGzv",
+"MmKGJCfgr3","MmsIoStlDJ","QChxsuupzk","fcJOydpe1v","guMb8Zv7z0","hi5X7lkMUA","0h1b1dmoS7","dpe1vi7WMQ","oQ87rDz1R3","ogLgcFjHXR",
+"0BmCyNo0Qb","yluBxGv3Fq","cmXIXYh1hF","CdyBVWDVWJ","AIYUuk85Ae","VjCZqM6qcG","uAWyp07n1c","XyPZNyToGW","In3NSJIqXi","yvOMInnP8o",
+"ZuDtDlH1kt","OxWIHUmaEv","5IhmG2hEEU","WaWsv5drc6","uTacxIjTwP","YOfrYQworu","prNT66q6L9","FcWrWnnP8o","G1RhSZuDtD","t59lRn1pmO",
+"v8yFNDQimp","Fhtglsoy9t","DG4sTyvOMI","6AFT0UlU3M","48cHLThjNn","J2mQiOz8yZ","QClRL7hyVv","8TxD7ThjNn","VjCZq64s8N","vLsmS29QAz",
+"tlILtWaWsv","580YDAXpwE","hUTw7PYBf4","K4GS8VBjhz","jzUqRfFDrJ","mz8gxulk41","4dEz65Namm","lsQGon1pmO","yluBx2Yz7E","GXdoHv8yFN",
+"he9IA7lUXZ","lj07Q2TRI7","gIYvEcL0aE","Z4I1vKr8ys","fFDrJk85Ae","MGlTFGWqqX","LDk6fTXQ0Z","9rlg93otm6","qQxHPgtCA5","B3qemtlILt",
+"NcICAVprf2","vkCHHC2Irc","yofH3he9IA","FxX9qxXTI4","8U2nUhUTw7","9rlg9RkQke","soy9th1zcH","FxX9qYw2oU","FNYIM5iGN5","QbxXckB5nP",
+"CdyBVnlaBy","IBe8kAmdQd","brhlQ1j5L8","prNT6NAFuw","8RCUAwiHrZ","aez9yYh1hF","8TxD7xXTI4","X6PinFNYIM","iwzGkfcwDa","C2IrcXflUq",
+"uTacxzz4ZU","FjHXRCdyBV","BbwgAs93Ml","9y4lwuN6r3","9y4lwzz4ZU","CIShG1LB1L","AkKTkFGzgp","Yw2oU7fKYU","kZANmQ6Lix","v8yFN8FmFH",
+"MmsIoUl4a1","uQIczReKEW","4QMc9kB5nP","JIqXiX6Pin","ni2v1fcJOy","yvOMIGrDg7","EdBKcNxx9V","lj07QjiVBP","HzZT8qaofN","FcWrWI7p2a",
+"K20wKprNT6","lj07Q2hEEU","dpe1vYw2oU","ZzJHWSs0Zu","UlU3MLewvM","AOgEeprNT6","MmsIoTXQ0Z","v2eC3he9IA","s47862hEEU","fmIK1MmsIo",
+"JIqXiydG8U","e6e4zVprf2","5Mg9rzbIYY","618DiUmaEv","gdQsSzHF1q","9iGoTzbIYY","atef2yToGW","ydG8U8xEKz","KASQ8FnPFB","618DiYf2Ec",
+"djsrvDz1R3","yluBxpFrrl","mz8gx5iGN5","NhXdun8pJ9","uZPqg9GXkX","AOgEeIKxdL","Nxx9VhE1Ql","0BmCyrKDLJ","Waim6Nxx9V","VNCPdQbxXc",
+"tuDySTCgPp","5ZaEzKASQ8","n1pmOFVMxo","TCgPpNcICA","24ARFJJs5m","tAOsrFNYIM","uLtKsRkQke","Ss0ZufcJOy","QWxoThE1Ql","gf8rIKr8ys",
+"cShY2iB08l","Yh1hFt98iW","v2eC3W3VFH","Yf2EcBGaQY","MK07YHzZT8","Waim6fcJOy","uJScXWPmlx","iqv4kzbIYY","uPX7Gn1pmO","Chuy3Zv7z0",
+"jfREuKZamH","m4bxUTCgPp","lj07QQssNC","gdQsSQ6hMC","7Ow5CvOqCE","RxrsmFGzgp","SbRYyjfREu","vkCHHQworu","jSjS3IKxdL","FjHXR0MR5X",
+"AXpwEeuZA5","atef2zqH0W","RpBQm8TxD7","BCxeCnFqik","oVQp6cmXIX","KASQ8lkMUA","UlU3MlsQGo","2Yz7ExReec","jeskSiKqhr","FjHXRtl72W",
+"Vprf2vLsmS","vOqCExReec","UmaEvHlUbF","618DiMGlTF","v8yFNsoy9t","bZLvSgdQsS","Ss0ZuIjTwP","FjHXRqaofN","Mm8sini2v1","uLtKs7fsYM",
+"29QAzWmadA","RACujd85a9","WaWsv4dEz6","uPX7GUmaEv","OHaBztAOsr","FcWrWjeskS","lViBvRACuj","WreyPZUnqt","Twanoulk41","tuDyShe9IA",
+"5iGN5M6qcG","3weIFvOqCE","t59lRY1mC0","v1Hlnt59lR","618Did7vjM","lm0pDBFkb8","s47860Wr5y","s93MlMojnP","9iGoTDcpWB","zHF1qDLhzM",
+"No0Qbdpe1v","8FmFHOUYuF","J2mQidQ586","ix74r7Ow5C","prNT6rKDLJ","jSjS3uLtKs","s4786GWqqX","aFFsspWiOs","GWqqXNxx9V","D6rByFVMxo",
+"Ss0ZuoGu6x","uPX7Gtl72W","HlUbFyofH3","y94nwuPX7G","ksJby1j5L8","HP433UlU3M","t59lRrhl0J","580YDqaofN","ogLgcnlaBy","CdyBV2TRI7",
+"ydG8Ulj07Q","ZJTXHAIYUu","v1HlnKASQ8","SbRYypFrrl","OHaBzNo0Qb","djsrvlpF6W","lm0pDogLgc","lsQGoCxVEf","he9IAlH1kt","RxrsmMm8si",
+"TCgPpMm8si","AOgEedpe1v","i3pyd8xEKz","TXQ0Zv2eC3","MmsIodmoS7","wDajXuJScX","Zv7z0No0Qb","NOHsz9XyT9","AkKTklpF6W","iB08lhYBCK",
+"7hyVvlj07Q","gIYvEhE1Ql","K4GS8pFrrl","zQt6QQWxoT","soy9tgdQsS","CqqaDmX2GE","0Wr5ypFrrl","zmLYD07n1c","s4786ydG8U","jSjS3jSjS3",
+"Z4I1vLewvM","8TxD7TXQ0Z","0ao3lFGzgp","AXpwEdjsrv","WMiS3O3iyQ","B3qemh1zcH","tvdkDsuY4x","qUJMdTa8f6","1j5L8QWxoT","taOXKv1Hln",
+"uupzk6q6L9","0BmCyuQIcz","ksJby5IhmG","gtCA5GSQwj","8cVD3oQ87r","a00b5Oz8yZ","9XyT9FwEJz","DG4sT618Di","hE1Qlxciqp","m4bxUJKWYR",
+"LbRTHlXFOB","K4GS8HRxd8","azIWpJRJQB","fmIK1djsrv","brhlQgtCA5","Z4I1vDz1R3","OxWIHAkKTk","0h1b1B3qem","KZamHJRJQB","FcWrWjtn0X",
+"Ss0ZuzmLYD","jS1ajO3iyQ","jfREuaL6AJ","Zv7z0pv0i7","9XyT9K20wK","YOfrYksJby","zz4ZUuLtKs","M3zXL48cHL","k85AeLDk6f","C2IrcWaim6",
+"WDVWJHfyNQ","ECMvUuLtKs","x3LDeyEfy9","Q6hMCKsjRK","zFgtBK4GS8","Vprf2uJScX","2ZHdkGSQwj","OUqFMgf8rI","Oz8yZdpe1v","WmadA5Mg9r",
+"yEfy9oGu6x","FwEJzBbwgA","s4786pT8wu","e6e4zMkgy8","s7MxkJJs5m","OUYuF5IhmG","SjskQlj07Q","In3NSx3LDe","ciuWzWaWsv","tjQxsMaJQs",
+"XflUqxReec","ThjNn2Nslm","guMb845cIH","ZUnqtMK07Y","UmaEvnnP8o","hSSvQciuWz","LbRTHfcwDa","hUTw7hE1Ql","9eoRcQClRL","7lUXZ7X3uy",
+"t59lRGv3Fq","5NammjzUqR","qQxHP0BmCy","pAhR1oVQp6","JXljWh1zcH","DcpWBbgJAz","Q6hMCpmeCd","16lHc8U2nU","8FmFH5ZaEz","CK5W7aL6AJ",
+"0ao3lSjskQ","Cp3mZBGaQY","0MR5X4W0Tl","M3zXLQ6hMC","atef2gdQsS","fFDrJdpe1v","jfREugIYvE","n8pJ9pT8wu","4W0TlogLgc","0MR5XuAWyp",
+"fcJOypmeCd","ix74rzY1GY","tuDySJkzUn","Chuy3gf8rI","lm0pDJJs5m","pmeCdIn3NS","5iGN5kZANm","e6e4zgIYvE","VIlwP55rfB","EoToPatef2",
+"qUJMd3otm6","aez9yt59lR","9XyT9GXdoH","iwzGkNAFuw","d7vjMWaim6","e6e4z8FmFH","ru4UG48cHL","ReKEW5VZjS","I7p2auvf7A","FjHXRVLTy6",
+"uAWyp0Wr5y","mz8gxDG4sT","AOgEetAOsr","KsjRKgIYvE","PYBf4LDk6f","o8UydRpBQm","pmeCdDcpWB","2Yz7E7Ow5C","zY1GYTCgPp","RkQke7ku1p",
+"zY1GYkB5nP","iKqhrUvlv4","RmDcr29QAz","BGaQYRzaZA","64s8NlkMUA","QnJ1ScQOnv","zqH0W8cVD3","9y4lwm4bxU","pFrrlQClRL","xciqpdmoS7",
+"W7cTsSjskQ","5IhmG0YAGH","0h1b1jSjS3","JXljWHzZT8","nlaByn8pJ9","ru4UG4W0Tl","L7cGcpFrrl","K4GS80BmCy","jS1ajBbwgA","QssNC7lUXZ",
+"ksJbyjeskS","qaofNVBjhz","XflUqFLsph","Gv3FqoVQp6","NAFuwpWiOs","UmaEvQworu","lpF6WpmeCd","AIYUuDQimp","C2Ircni2v1","CIShGF6PT2",
+"RBhp0Gv3Fq","RBhp0QnJ1S","5ZaEz5iGN5","QChxsoVQp6","x3LDeNo0Qb","ru4UGblLA9","D6rByHP433","FPfSEk85Ae","dhSuHKASQ8","n1pmO2Nslm",
+"4QMc9Cp3mZ","kZANmi7WMQ","e6e4zKr8ys","i3pyduupzk","FLsphmX2GE","CK5W7WreyP","FLsphy94nw","5iGN5dmoS7","Yf2EcuJScX","IRh48gIYvE",
+"ZuDtD0ao3l","Oz8yZFhtgl","FGzgplkMUA","0Wr5yhi5X7","7ku1p618Di","rz7Utsx5Gl","lCMxy7lUXZ","MmKGJFLsph","UmaEvnFqik","RxrsmJkzUn",
+"rz7UtQChxs","ulk41M3zXL","tlILtpv0i7","tvdkDv1Hln","3weIFciuWz","ix74rlCMxy","uoStwhYBCK","RkQke7Ow5C","4QMc9GrDg7","WreyP5Drn0",
+"P6bcggdQsS","EdBKcUvlv4","Q6hMC5drc6","1j5L8WaWsv","iKqhruPX7G","Zv7z0lCMxy","rKDLJM6qcG","ZUnqtuQIcz","iB08llCMxy","U3yw58RCUA",
+"JJs5mlsQGo","iKqhrMm8si","jS1ajMaJQs","x3LDeyvOMI","5Namm618Di","5VZjS4QMc9","XyPZNU3yw5","uN6r3y94nw","ZhwG1MaJQs","NAFuwZv7z0",
+"BpYhVcmXIX","ogLgcOxWIH","RxrsmyEfy9","IjTwPFxX9q","qQxHPCqqaD","vLsmSFjHXR","CNHmvrhl0J","7fsYMS77LH","h1zcHv1Hln","iwzGkFFDui",
+"Nxx9V9eoRc","yEfy9jSjS3","dQ586Q6Lix","yEfy98xEKz","Waim6kB5nP","Kr8yszmLYD","hE1QlThjNn","9iGoTDQimp","5Drn0iB08l","Ul4a1yToGW",
+"UmaEvNOHsz","fmIK1cShY2","Cfgr3fFDrJ","cmXIXyvOMI","U3yw5lH1kt","Mm8siWaim6","48cHLcmXIX","QssNCCfgr3","jS1ajyvOMI","qQxHPDG4sT",
+"azIWp9eoRc","ni2v1lCMxy","CNHmv2TRI7","x3LDe7lUXZ","0h1b1KsjRK","4W0TlWaWsv","StlDJ2ZHdk","prNT6BGaQY","dpe1vzz4ZU","U3yw5ulk41",
+"ECMvU8hJdt","8hJdt0PktI","KsjRK2DREs","aDGtSzmLYD","SjskQ4W0Tl","VjCZqRsQUq","4dEz6lViBv","Qworu14FLR","618DigdQsS","RBhp0M6qcG",
+"cL0aECp3mZ","Yf2EcgIYvE","pT8wuPb1pa","Z4I1vC2Irc","U3yw5fcJOy","blLA9tvdkD","oVQp6MK07Y","dQ586d85a9","yEfy90MR5X","BGaQYpv0i7",
+"aFFssVerEA","YjB9ttjQxs","7lUXZgf8rI","fLNg8SbRYy","tlILtvkCHH","nFqikFFDui","JXljWTwano","9XyT9v8yFN","QClRLuN6r3","MK07YBGaQY",
+"RxrsmpAhR1","QWxoTzY1GY","pFrrlxReec","NhXdu1LB1L","9rlg9CIShG","2ZHdkVNCPd","Uvlv4IKxdL","v2eC3Gv3Fq","v8yFNfcwDa","jfREu48cHL",
+"pvgjSjSjS3","pWiOslsQGo","i7WMQkB5nP","uupzkYOfrY","fcJOydjsrv","Cp3mZ4dEz6","U3yw55IhmG","FnPFBLewvM","5nmWvhe9IA","yluBxlsQGo",
+"h1zcH8FmFH","RmDcrtl72W","kB5nPlkMUA","RkQked85a9","RkQkeZhwG1","MGlTF29QAz","uAWypTa8f6","XyPZN8cVD3","XyPZNRACuj","FFDuiDQimp",
+"DG4sTVerEA","QworuYf2Ec","HzZT8kZANm","9GXkXuTacx","xXTI4J2mQi","DG4sTtaOXK","gIYvES77LH","lH1ktKr8ys","SjskQ2hEEU","16lHc5IhmG",
+"Gv3FqEoToP","oVQp65Mg9r","5VZjSjfREu","9XyT9QChxs","XyPZNkZANm","aFFsssqVrf","618DirKDLJ","hUTw7WmadA","ThjNnO3iyQ","wDajX0MR5X",
+"MmsIoJKWYR","ECMvUaL6AJ","SjskQ9y4lw","3otm6t59lR","VNCPdUmaEv","SjskQM6qcG","DQimpD6rBy","vLsmSEdBKc","5VZjSd85a9","lkMUA9XyT9",
+"yEfy9LewvM","9rlg97fKYU","Vprf2brhlQ","n1pmOWPmlx","Yw2oUMmKGJ","2hEEURmDcr","AkKTkW7cTs","hE1QlNOHsz","0h1b1fcJOy","aL6AJDG4sT",
+"nFqiktaOXK","WDVWJlweGy","FFDuiRBhp0","iB08lQYxC0","v8yFN7fKYU","x3LDeOUqFM","l83UdDG4sT","DcpWBb29RJ","2Yz7EgtCA5","suY4xdQ586",
+"7hyVvFFDui","iKqhrksJby","Waim6ZJTXH","5ZaEz1LB1L","Zv7z0fLNg8","D6rByhUTw7","FLsph5drc6","GrDg7S77LH","8hJdtv8yFN","M3zXLNo0Qb",
+"dQ586StlDJ","pmeCdNo0Qb","0h1b1ru4UG","k85AelweGy","zqH0WQClRL","zqH0WRkQke","K20wKFVMxo","uvf7AlweGy","oGu6xUvlv4","6AFT0lpF6W",
+"aL6AJ0BmCy","uJScXlpF6W","0Wr5ylkMUA","uJScXtAOsr","WMiS3Rxrsm","Mm8siCxVEf","M6qcGzFgtB","s93MlFnPFB","nnP8oRBhp0","ZhwG1J2mQi",
+"fmIK1AkKTk","0h1b1VBjhz","fqypy2Nslm","24ARFdQ586","RpBQmMmsIo","lsQGovkCHH","OUYuFJKWYR","uAWypUl4a1","9XyT9I7p2a","xReec8RCUA",
+"1LB1LUvlv4","e6e4zMmsIo","kB5nP2hEEU","fcwDaVjCZq","VerEAHfyNQ","piJSkbrhlQ","VNCPdY1mC0","sqVrfKr8ys","cQOnv5Namm","CdyBVWaWsv",
+"W7cTsxciqp","2ZHdkGWqqX","VerEAGrDg7","oGu6xW7cTs","64s8NuJScX","iwzGkYw2oU","O3iyQaL6AJ","1LB1LBpYhV","4dEz6UmaEv","Q6LixO3iyQ",
+"SWfoumz8gx","piJSkru4UG","StlDJbrhlQ","pv0i7zQt6Q","GXdoHtvdkD","M3zXLbZLvS","djsrvQChxs","GWqqXpiJSk","RxrsmHP433","TXQ0ZJ2mQi",
+"Ss0ZuSWfou","9iGoT9eoRc","POUYSAXpwE","618DiZUnqt","xReec0Wr5y","yEfy92ZHdk","suY4xQnJ1S","xReecUmaEv","tl72Wdpe1v","LbRTH0ao3l",
+"SWfoufcJOy","Y1mC05drc6","ciuWzqQxHP","1j5L8gIYvE","IBe8kPYBf4","VjCZqQbxXc","FjHXR64s8N","IRh48mz8gx","vkCHHaDGtS","n1pmOFxX9q",
+"uN6r3hi5X7","jS1aj580YD","oGu6xm4bxU","jeskSX6Pin","kZANmhUTw7","gf8rIfqypy","mX2GEJXljW","29QAzTwano","djsrvLDk6f","jSjS3IBe8k",
+"uQIczSs0Zu","lCMxy9eoRc","8xEKzd7vjM","djsrvSbRYy","tjQxsI7p2a","gdQsS0YAGH","uoStwEdBKc","BGaQY0PktI","Z4I1vlkMUA","MojnPNAFuw",
+"5iGN59iGoT","fFDrJtlILt","0h1b1lViBv","IKxdLVBjhz","yofH3SbRYy","TXQ0ZECMvU","Ss0Zua00b5","lm0pDguMb8","Y1mC0lj07Q","Uvlv4azIWp",
+"NOHsz9eoRc","gdQsS2Yz7E","zY1GY64s8N","uvf7AyToGW","M3zXLuTacx","ni2v17ku1p","kB5nPcL0aE","Nxx9VuN6r3","zY1GYjtn0X","vkCHHsqVrf",
+"ulk41RzaZA","Ta8f65Namm","Yf2Ecni2v1","8TxD7iqv4k","0YAGH2DREs","n1pmOStlDJ","nnP8oprNT6","v2eC3Zv7z0","gf8rIokgRi","8U2nUOUqFM",
+"FVMxo8cVD3","ulk41tjQxs","lH1kt7lUXZ","D6rByC2Irc","CdyBVHlUbF","tuDySpmeCd","O3iyQcShY2","KASQ8Yw2oU","k85Ae5Namm","sqVrfGrDg7",
+"F6PT2jiVBP","wDajXo8Uyd","4QMc9ix74r","8hJdtSjskQ","OxWIHpWiOs","9eoRcCdyBV","v8yFNhUTw7","SWfouRACuj","tlILtFNYIM","OxWIH2Yz7E",
+"7ku1plweGy","0PktIoGu6x","LDk6fFFDui","xXTI4n1pmO","b29RJ4dEz6","d85a9QnJ1S","XflUqNo0Qb","0Wr5y5ZaEz","y94nwa00b5","9iGoT8U2nU",
+"16lHcHP433","5NammtaOXK","GSQwje6e4z","ZJTXHQ6Lix","t98iWprNT6","nFqikQssNC","7fKYUYw2oU","MezSWFFDui","KsjRKFNYIM","wiHrZoQ87r",
+"ogLgcLewvM","zHF1qni2v1","rz7Ut8FmFH","uPX7Gm4bxU","QWxoTQbxXc","BbwgApmeCd","QClRLVprf2","FwEJzMkgy8","Ss0ZugtCA5","LbRTH0Wr5y",
+"O3iyQEOE1o","Yf2EcSmGzv","4QMc9lH1kt","VjCZqk85Ae","1j5L8sqVrf","MK07YCNHmv","tuDySSs0Zu","iKqhrIjTwP","NcICAiwzGk","X6Pind85a9",
+"v8yFNpv0i7","QnJ1SSs0Zu","FjHXRuoStw","nlaByQ6Lix","uN6r3gdQsS","ksJbyyluBx","7ku1pFLsph","L7cGcoQ87r","fqypydQ586","Dz1R3EdBKc",
+"5ZaEz4W0Tl","lViBv0ao3l","ZhwG1ReKEW","lpF6WbgJAz","hi5X7dpe1v","lj07QnFqik","lj07Q9rlg9","uvf7AYw2oU","BCxeCv8yFN","xReecy94nw",
+"uLtKsdpe1v","WPmlxCqqaD","RzaZA4W0Tl","CxVEfdhSuH","48cHLKASQ8","KsjRK8FmFH","X6PinhUTw7","azIWpAIYUu","pFrrlXyPZN","e6e4z3otm6",
+"DG4sTa00b5","QssNCfLNg8","F6PT22TRI7","Oz8yZVIlwP","IBe8kHfyNQ","hE1QlFNYIM","MK07YMm8si","8TxD7Rxrsm","brhlQ7lUXZ","KsjRKQClRL",
+"tvdkDn1pmO","OUYuFuPX7G","9GXkXIjTwP","KsjRKiB08l","l83UdBpYhV","zHF1q0BmCy","FjHXRnlaBy","KZamHe6e4z","EdBKcMK07Y","MojnPFjHXR",
+"HP433RACuj","8FmFHgtCA5","lH1ktQ6Lix","DcpWBU3yw5","v1HlnzY1GY","M6qcGFVMxo","cmXIXprNT6","aez9yDLhzM","sqVrflweGy","29QAzJ2mQi",
+"nlaByAOgEe","taOXKWDVWJ","XflUqciuWz","TwanocQOnv","fcwDahi5X7","QClRLVerEA","CNHmv55rfB","XflUqogLgc","0Wr5y0Wr5y","uPX7GOz8yZ",
+"v2eC3RpBQm","CIShGb29RJ","jS1aj5Mg9r","hi5X70YAGH","tjQxsIRh48","uN6r3W3VFH","618DifmIK1","NcICAFFDui","4dEz6Yw2oU","FxX9q5VZjS",
+"fqypy8TxD7","48cHLCNHmv","POUYSogLgc","Yf2EczbIYY","hSSvQpv0i7","MojnPWMiS3","he9IARzaZA","LDk6fuoStw","uvf7AogLgc","qaofN580YD",
+"9GXkXnFqik","jtn0XfcwDa","m4bxUl83Ud","HfyNQW3VFH","okgRi0h1b1","AgJHQJ2mQi","jiVBPVNCPd","iwzGklH1kt","B3qemwiHrZ","QnJ1Sy94nw",
+"s4786Rxrsm","MojnPe6e4z","lsQGoDQimp","hi5X7Uvlv4","piJSkS77LH","8U2nUDG4sT","RACujSWfou","mz8gxYOfrY","wDajX2TRI7","5ZaEzatef2",
+"CxVEf8U2nU","pvgjSRsQUq","fcwDabgJAz","uPX7G8xEKz","DQimpRsQUq","JJs5mmz8gx","s93Mle6e4z","JJs5mo8Uyd","Oz8yZJXljW","M6qcGv8yFN",
+"RsQUquJScX","uTacxMm8si","SWfoulkMUA","FGzgp8xEKz","dpe1v24ARF","n1pmOW3VFH","dpe1vCfgr3","i3pyduPX7G","G1RhSDLhzM","DcpWBGrDg7",
+"oVQp616lHc","iKqhrd7vjM","SjskQWPmlx","7fsYMpAhR1","iKqhrtAOsr","uLtKsVprf2","h1zcHh1zcH","AkKTk8U2nU","lsQGoHlUbF","QbxXcuoStw",
+"AIYUu1v5hH","JRJQBGWqqX","CqqaDLbRTH","BCxeCd85a9","m4bxUrz7Ut","dQ586yToGW","3weIFhYBCK","xReeczHF1q","lXFOBWMiS3","zFgtBZzJHW",
+"dmoS7v1Hln","JkzUnguMb8","CdyBVZzJHW","FPfSEL7cGc","4QMc9ECMvU","Pb1pauJScX","L7cGclCMxy","okgRil83Ud","ksJbyC2Irc","a00b5rz7Ut",
+"kB5nPlCMxy","zQt6Q5Namm","SbRYyZUnqt","W3VFHK4GS8","AkKTkt98iW","iB08lmz8gx","ZuDtD8hJdt","9iGoTEOE1o","ogLgcRkQke","NhXduTCgPp",
+"vLsmSlViBv","VjCZqi3pyd","LDk6faFFss","ECMvUaFFss","580YDVIlwP","gjUTuDz1R3","OxWIHVprf2","cmXIXMezSW","5IhmGa00b5","0h1b1t98iW",
+"ECMvUoGu6x","QWxoTRACuj","FnPFBBpYhV","qUJMduLtKs","iwzGkprNT6","FPfSEThjNn","HRxd8pvgjS","lpF6W5iGN5","lm0pDHfyNQ","jzUqRSs0Zu",
+"qQxHPgIYvE","ZzJHWM6qcG","RzaZAYjB9t","I7p2aL7cGc","kZANmY1mC0","HfyNQMGlTF","LbRTHW3VFH","zbIYYQWxoT","Yw2oUb29RJ","CIShGLDk6f",
+"7Ow5CMK07Y","HzZT8rhl0J","OUqFM7ku1p","L7cGcfcJOy","jiVBP0Kyfs","7lUXZlj07Q","CqqaDsx5Gl","CK5W7Ta8f6","5Drn0AIYUu","618Di29QAz",
+"taOXKt59lR","AOgEe8xEKz","NhXduNhXdu","x3LDesoy9t","pv0i7jS1aj","XyPZNciuWz","blLA9SmGzv","W7cTsVNCPd","2TRI7hYBCK","5NammkZANm",
+"uvf7AB3qem","uN6r3K20wK","YOfrYU3yw5","faHirpiJSk","QnJ1SAXpwE","RxrsmQworu","Cfgr3IRh48","xXTI4NhXdu","0YAGHOHaBz","WMiS3brhlQ",
+"S2DfuP6bcg","8RCUAQChxs","gdQsSdmoS7","TwanoNcICA","FjHXRi3pyd","XyPZNGSQwj","8hJdtTCgPp","mX2GEUmaEv","Kr8yslweGy","I7p2alpF6W",
+"K20wKb29RJ","M6qcGiqv4k","14FLRBpYhV","yEfy9O3iyQ","IKxdLhE1Ql","Uvlv4FnPFB","fmIK1S2Dfu","16lHcHfyNQ","YOfrYWmadA","QWxoTuZPqg",
+"5Namm5ZaEz","CIShG7Ow5C","5Drn0zQt6Q","xXTI4aFFss","8xEKzn1pmO","hYBCKJKWYR","pT8wuni2v1","SbRYy5Mg9r","ogLgcZv7z0","jfREuVIlwP",
+"BGaQYd7vjM","S2DfuuTacx","iwzGkBGaQY","TXQ0ZhYBCK","7fsYMoQ87r","64s8Nv2eC3","Mkgy83weIF","rKDLJi7WMQ","dmoS7PYBf4","IBe8kOHaBz",
+"FPfSEMaJQs","qaofNkZANm","AgJHQzz4ZU","vOqCEd85a9","YOfrY8TxD7","WmadAksJby","8RCUAEOE1o","HP43314FLR","G1RhSblLA9","qaofN2hEEU",
+"5nmWvFGzgp","FNYIM8hJdt","9GXkXMm8si","s7MxkM6qcG","24ARFnlaBy","oVQp6taOXK","48cHL3weIF","W3VFHBpYhV","uupzkW7cTs","Pb1palH1kt",
+"okgRiQClRL","nFqikdpe1v","vOqCE8RCUA","0YAGHThjNn","fcwDa0ao3l","LbRTHi3pyd","jiVBPFFDui","lsQGoh1zcH","ThjNnQworu","QbxXcpAhR1",
+"zFgtBO3iyQ","BbwgAAmdQd","azIWpZUnqt","0h1b1dQ586","Chuy37hyVv","FwEJzix74r","P6bcg7ku1p","WMiS30ao3l","LDk6fMK07Y","CK5W7M6qcG",
+"Pb1pab29RJ","0PktI8U2nU","NOHszQssNC","nnP8oBCxeC","jzUqRIjTwP","POUYSDcpWB","J2mQiuN6r3","JJs5mtAOsr","BGaQY9eoRc","AOgEehUTw7",
+"tlILt6AFT0","Cfgr3Nxx9V","tvdkDU3yw5","EdBKcBFkb8","M6qcGLbRTH","l83UdVBjhz","v1HlnU3yw5","QChxszbIYY","S2DfufLNg8","8U2nUiKqhr",
+"F6PT2BCxeC","3weIFVBjhz","GSQwjksJby","6q6L9FGzgp","fcwDakZANm","GrDg7YOfrY","lsQGoguMb8","55rfBsuY4x","FcWrWLewvM","ulk41VLTy6",
+"VNCPdOHaBz","aDGtSatef2","5IhmGWPmlx","MGlTFAXpwE","S77LHCxVEf","pv0i7KZamH","o8Uyds7Mxk","aFFssNOHsz","7lUXZ24ARF","taOXK2DREs",
+"X6PinFxX9q","GrDg7tjQxs","NOHszpT8wu","v1HlnOz8yZ","ciuWzqaofN","UlU3M8U2nU","SjskQaL6AJ","KZamHdpe1v","HRxd8WreyP","4W0TlyofH3",
+"2Yz7EgIYvE","FjHXR14FLR","9iGoTCIShG","S77LH5nmWv","uTacxtjQxs","48cHL1LB1L","lViBvqUJMd","fqypylsQGo","tjQxsVBjhz","Waim6ciuWz",
+"xReecn1pmO","v8yFNYf2Ec","07n1ccShY2","dhSuHguMb8","AXpwEzFgtB","lj07Q1j5L8","Ta8f6aFFss","hYBCKl83Ud","6AFT0gIYvE","b29RJBpYhV",
+"VLTy6VIlwP","KsjRKd7vjM","dpe1vMm8si","h1zcHUlU3M","07n1cWPmlx","fqypyuN6r3","1LB1Lni2v1","xXTI4v2eC3","64s8N618Di","iqv4kgIYvE",
+"VNCPdwDajX","uZPqglViBv","NhXduZUnqt","No0Qb1j5L8","Z4I1vaDGtS","24ARFqaofN","7ku1pcL0aE","yvOMIAIYUu","7ku1pCK5W7","WaWsvQ6hMC",
+"RACujpv0i7","Yw2oUAIYUu","0Wr5yYOfrY","F6PT2HzZT8","G1RhS8hJdt","9GXkXCIShG","M3zXLpAhR1","XyPZNKsjRK","9eoRcFNYIM","o8Uydd85a9",
+"CK5W7K4GS8","yEfy95drc6","bgJAzOHaBz","4dEz6Fhtgl","CxVEfKr8ys","Fhtgl4QMc9","QWxoTIRh48","yToGW24ARF","uN6r3d7vjM","o8Uyd5iGN5",
+"lweGyIRh48","M6qcG14FLR","rhl0JlH1kt","oQ87rRsQUq","VLTy6jiVBP","JRJQBcL0aE","618DiO3iyQ","Pb1paIn3NS","55rfBVjCZq","blLA9guMb8",
+"1LB1LlH1kt","BpYhVQYxC0","U3yw5FxX9q","aFFssBFkb8","fmIK1IjTwP","2DREsCIShG","pAhR1Q6hMC","VNCPdIjTwP","nlaByW7cTs","1j5L85Mg9r",
+"0MR5Xtl72W","VNCPdZhwG1","KZamHazIWp","DcpWBZv7z0","pmeCduupzk","MezSWXflUq","brhlQNhXdu","h1zcH5nmWv","BFkb814FLR","b29RJXflUq",
+"8U2nUxReec","4W0Tl0Wr5y","5drc6t59lR","m4bxUv2eC3","CK5W7jtn0X","zqH0WFnPFB","Yw2oUDLhzM","fqypyHzZT8","qUJMdFhtgl","lpF6WF6PT2",
+"BFkb8D6rBy","QChxs8RCUA","FLsph5nmWv","RpBQmydG8U","JIqXiJKWYR","lsQGojiVBP","8cVD3WDVWJ","ZJTXH9iGoT","5iGN5HzZT8","Zv7z0dpe1v",
+"iB08l5IhmG","29QAzfmIK1","5Drn0MojnP","AkKTk55rfB","d85a9oVQp6","BpYhV7ku1p","AIYUufcwDa","qaofNW3VFH","pmeCdZv7z0","zbIYYhYBCK",
+"XflUqdjsrv","5VZjS8FmFH","Yh1hFFhtgl","EoToPDz1R3","vLsmSKASQ8","Cp3mZ8FmFH","NAFuwatef2","yvOMIm4bxU","lm0pDZuDtD","YjB9tVjCZq",
+"FcWrWRBhp0","lm0pDMmKGJ","mX2GEFwEJz","uLtKszqH0W","Vprf2CNHmv","wiHrZY1mC0","Yf2EcqaofN","hE1QlaFFss","zHF1qt59lR","zFgtBEoToP",
+"lm0pDd7vjM","K4GS8JJs5m","JJs5mNAFuw","EoToPChuy3","580YDatef2","o8UydQssNC","JKWYRsuY4x","zFgtBLDk6f","CNHmvQ6Lix","m4bxU2hEEU",
+"rKDLJgtCA5","he9IAFcWrW","2hEEU2Nslm","Zv7z0t98iW","ksJbyWaim6","t98iWMaJQs","jiVBPlH1kt","2TRI7lm0pD","mX2GEyofH3","OUqFMRpBQm",
+"5VZjSI7p2a","uJScXIRh48","vLsmSfqypy","O3iyQqaofN","7X3uyhe9IA","FLsphUl4a1","SmGzvNo0Qb","lViBvh1zcH","iwzGkfmIK1","piJSkXflUq",
+"GrDg7lpF6W","FVMxo1v5hH","55rfB5ZaEz","RBhp0xciqp","NOHszt59lR","QssNCNAFuw","JIqXiAmdQd","8TxD7zz4ZU","GWqqXJJs5m","XyPZNzz4ZU",
+"24ARF7lUXZ","8U2nU6q6L9","FcWrWfcwDa","16lHchYBCK","FNYIMF6PT2","GrDg7RpBQm","fcwDaciuWz","8FmFHZ4I1v","MK07Y6AFT0","2TRI7tlILt",
+"7ku1puoStw","RzaZAWaim6","d85a9euZA5","CNHmv2Yz7E","14FLROUYuF","LewvMiqv4k","WPmlxFFDui","hSSvQVLTy6","tvdkD9y4lw","Dz1R3FGzgp",
+"YOfrY5drc6","tvdkDmz8gx","tlILtM6qcG","ogLgcDz1R3","4QMc9Uvlv4","Cfgr3O3iyQ","BFkb8VIlwP","ZhwG1IBe8k","M6qcGe6e4z","5Drn0WmadA",
+"IBe8k4QMc9","cL0aEHzZT8","t59lRIn3NS","k85AemX2GE","5nmWvDcpWB","lm0pDs4786","ogLgcguMb8","he9IA9y4lw","uPX7GlsQGo","sx5GlW7cTs",
+"8cVD3s7Mxk","guMb8K4GS8","64s8Nuupzk","W7cTszQt6Q","Chuy3hi5X7","580YD5VZjS","WmadACIShG","5drc6lsQGo","ogLgcyluBx","d7vjMtAOsr",
+"vkCHHfLNg8","DLhzMdhSuH","tjQxst98iW","wDajXfLNg8","uJScXWreyP","EOE1opAhR1","5Mg9r8FmFH","BCxeC2TRI7","uoStwGXdoH","x3LDeVNCPd",
+"YOfrY6q6L9","1j5L87X3uy","Uvlv4AOgEe","hE1QlTXQ0Z","O3iyQPYBf4","Zv7z0Vprf2","jSjS3xReec","yEfy97Ow5C","ydG8Umz8gx","QWxoTtaOXK",
+"faHirWaim6","VNCPdZuDtD","Ta8f6bgJAz","yEfy9tAOsr","lweGySmGzv","gjUTuMojnP","OxWIHRxrsm","C2IrcWaWsv","kZANmStlDJ","FwEJzpFrrl",
+"OxWIHyofH3","VBjhzgf8rI","Chuy3iwzGk","64s8NksJby","2ZHdkkB5nP","SWfou14FLR","EdBKcAXpwE","pT8wuuLtKs","07n1cFNYIM","yToGWxXTI4",
+"n8pJ9uJScX","aFFsszqH0W","oGu6xAXpwE","5IhmGuAWyp","BbwgAv2eC3","PYBf4fcwDa","WPmlxl83Ud","RpBQmHlUbF","9y4lwjzUqR","Cfgr3t59lR",
+"djsrvtAOsr","e6e4zulk41","uN6r3B3qem","GrDg7b29RJ","580YDM3zXL","n8pJ9xciqp","8RCUAfqypy","OUYuFCK5W7","x3LDeMm8si","8xEKzzbIYY",
+"e6e4zcShY2","lXFOB9GXkX","L7cGchYBCK","hUTw7QWxoT","RxrsmfFDrJ","9eoRcSjskQ","9eoRc2Nslm","CqqaDtjQxs","24ARFDQimp","zqH0WDG4sT",
+"O3iyQsx5Gl","kB5nPbgJAz","jzUqRrz7Ut","s7MxksuY4x","gdQsS24ARF","XyPZN4W0Tl","oQ87r2DREs","cQOnvtuDyS","guMb8lweGy","n1pmOHlUbF",
+"WaWsvd85a9","RkQkexXTI4","QworucShY2","KZamHRkQke","tl72WnlaBy","MaJQstvdkD","EOE1oGXdoH","bZLvSzFgtB","ix74r8hJdt","No0QbQ6hMC",
+"CK5W7YjB9t","YjB9tv1Hln","S77LHI7p2a","bgJAzAkKTk","QChxsZUnqt","CdyBVL7cGc","lXFOBuZPqg","oQ87ruLtKs","JXljW48cHL","fcJOyx3LDe",
+"8U2nUgjUTu","lViBvix74r","atef2MaJQs","FjHXR9y4lw","uQIczU3yw5","M3zXLSmGzv","uupzkuoStw","AXpwE29QAz","tuDySn1pmO","hYBCKwiHrZ",
+"8hJdtWaWsv","brhlQ3weIF","RsQUqiqv4k","uTacxuPX7G","aDGtS5ZaEz","piJSkFjHXR","CxVEfpFrrl","B3qem4QMc9","8hJdtCqqaD","GSQwjiqv4k",
+"lViBvUl4a1","hSSvQgtCA5","WPmlx29QAz","M3zXLt59lR","9rlg9t59lR","lCMxylpF6W","nFqik8hJdt","yToGWJRJQB","ZUnqttaOXK","lCMxy0MR5X",
+"F6PT2Mkgy8","nnP8oReKEW","BbwgA0MR5X","Ss0ZuQworu","5ZaEza00b5","U3yw56AFT0","gjUTu5iGN5","X6PinsqVrf","64s8NtaOXK","2Yz7EJKWYR",
+"ciuWzwiHrZ","cL0aEUlU3M","9y4lw8cVD3","VNCPdgf8rI","SjskQblLA9","okgRiuJScX","zY1GYMezSW","pvgjSix74r","BbwgAPYBf4","GSQwjIn3NS",
+"2hEEUzY1GY","4QMc9lXFOB","aL6AJoQ87r","VjCZq2TRI7","ZhwG1X6Pin","b29RJ2Nslm","pT8wuyvOMI","VIlwPlXFOB","fFDrJWPmlx","RkQkeiqv4k",
+"pT8wuFcWrW","nnP8oRzaZA","blLA9oQ87r","KsjRKRzaZA","8U2nUAgJHQ","ZzJHW24ARF","9iGoTRpBQm","NOHsztaOXK","KASQ8yEfy9","Vprf2AgJHQ",
+"wiHrZCdyBV","W7cTsuQIcz","BCxeCZhwG1","9rlg945cIH","ru4UGQ6Lix","9XyT9Z4I1v","JkzUnMkgy8","euZA59GXkX","NhXdumX2GE","jzUqRciuWz",
+"RzaZAY1mC0","pmeCdLewvM","qUJMdW3VFH","tAOsraL6AJ","0KyfspWiOs","FnPFBRBhp0","piJSkzFgtB","JIqXiDcpWB","P6bcgCK5W7","uLtKslsQGo",
+"tlILtMmKGJ","iwzGk2Nslm","Fhtgl0PktI","VNCPdMK07Y","uAWypciuWz","hYBCKFPfSE","FwEJzVBjhz","s4786okgRi","xXTI4i7WMQ","Oz8yZ7Ow5C",
+"4QMc9nnP8o","fLNg8QClRL","CIShGX6Pin","tvdkDAOgEe","UlU3MFGzgp","MmsIoG1RhS","YjB9tix74r","QnJ1S1v5hH","HP433rz7Ut","Y1mC0RACuj",
+"2ZHdklkMUA","jS1aj5ZaEz","ulk41YOfrY","7X3uyTwano","BpYhVZhwG1","d7vjMEoToP","oVQp6NhXdu","zY1GYoVQp6","QnJ1ShE1Ql","jzUqRZhwG1",
+"7ku1pGWqqX","suY4xBbwgA","StlDJReKEW","QYxC0Pb1pa","zz4ZUMkgy8","QbxXcMkgy8","TwanozQt6Q","hi5X7B3qem","xciqpIBe8k","9rlg9FwEJz",
+"oVQp6No0Qb","tvdkDuvf7A","pmeCdKASQ8","0h1b1dhSuH","atef2FwEJz","ni2v1piJSk","prNT6ogLgc","lweGyuZPqg","No0QbVIlwP","h1zcHcmXIX",
+"JIqXis4786","euZA5gf8rI","zQt6QFxX9q","Mkgy8SbRYy","5ZaEztlILt","SWfouMezSW","Cp3mZL7cGc","y94nwtl72W","mz8gxx3LDe","OUqFM5Namm",
+"LewvMDG4sT","pFrrlPb1pa","S2Dfus4786","vLsmSCK5W7","uZPqgDcpWB","zY1GYzz4ZU","s4786AOgEe","zqH0WMK07Y","IKxdLRzaZA","ZhwG1guMb8",
+"MojnPgf8rI","blLA94dEz6","Mkgy8OHaBz","J2mQi29QAz","uTacxVNCPd","iB08l07n1c","n1pmOyluBx","LbRTH48cHL","X6PinaFFss","OxWIHFLsph",
+"aez9yxXTI4","3weIFdjsrv","7X3uyOUYuF","EOE1oDcpWB","BCxeCMm8si","suY4xSjskQ","RsQUqgf8rI","2DREsSjskQ","CK5W7XyPZN","Q6hMCm4bxU",
+"uTacxzQt6Q","9eoRcokgRi","ciuWzhi5X7","piJSkFGzgp","okgRijtn0X","mX2GEOxWIH","suY4xHzZT8","Mkgy8k85Ae","HP433G1RhS","JkzUnVLTy6",
+"3otm6ECMvU","55rfBIjTwP","jiVBPxReec","FGzgpt59lR","uJScXcL0aE","HlUbFjSjS3","LDk6fVLTy6","YjB9tbgJAz","S2DfuBFkb8","yluBxFxX9q",
+"Uvlv4s4786","FLsphAkKTk","24ARF8hJdt","FxX9qvkCHH","GWqqXG1RhS","lweGyuvf7A","XyPZNfcJOy","dmoS7Uvlv4","JkzUniwzGk","vLsmSt59lR",
+"wDajXGSQwj","hE1QlCp3mZ","suY4xJkzUn","bZLvSuTacx","L7cGci3pyd","tlILtgf8rI","CIShGP6bcg","RxrsmIKxdL","v8yFNfcJOy","hE1QlsqVrf",
+"ThjNnbgJAz","ksJbyY1mC0","zQt6Q64s8N","lH1ktulk41","soy9ts7Mxk","WaWsv5Drn0","7X3uyvOqCE","6AFT0GXdoH","yofH37fsYM","aL6AJJKWYR",
+"0Wr5yNxx9V","QYxC0v2eC3","sqVrfzY1GY","ix74rJRJQB","DLhzMuvf7A","pWiOsgtCA5","qaofNgf8rI","guMb8ZhwG1","8TxD7vkCHH","16lHcjzUqR",
+"uupzka00b5","WMiS3pv0i7","8RCUAfcJOy","RkQkeulk41","zQt6Q7ku1p","G1RhSyEfy9","BGaQY5IhmG","qaofN1v5hH","Waim6QClRL","pFrrlBGaQY",
+"MmsIoFjHXR","i3pydVBjhz","S77LHZhwG1","No0QbFVMxo","rKDLJ9GXkX","tvdkD7X3uy","F6PT2m4bxU","ZUnqtn1pmO","tAOsrQYxC0","vkCHHnFqik",
+"FNYIMnnP8o","8U2nUfcJOy","LewvM2Nslm","K20wKQChxs","0Wr5ylCMxy","0BmCyix74r","t59lRNhXdu","C2Ircfqypy","mX2GEMGlTF","d85a9wiHrZ",
+"pAhR19eoRc","uZPqgnnP8o","QnJ1SCdyBV","KZamH5drc6","9y4lwZuDtD","2TRI79rlg9","2DREsFwEJz","sx5GlbZLvS","bgJAz4W0Tl","JkzUnNcICA",
+"DG4sTrhl0J","QssNCX6Pin","2TRI77fKYU","JXljWpFrrl","XflUqYOfrY","aFFssXyPZN","atef28hJdt","In3NSh1zcH","k85AeAOgEe","zz4ZUiKqhr",
+"0ao3la00b5","8U2nUcL0aE","nFqikFhtgl","xXTI4FFDui","4W0TlQssNC","Mkgy83otm6","FGzgpStlDJ","TwanoIRh48","ix74ruAWyp","OUqFM9eoRc",
+"gtCA5AgJHQ","B3qemrKDLJ","45cIH1LB1L","ydG8UtAOsr","t98iWWDVWJ","0YAGHpAhR1","Yw2oUTXQ0Z","bgJAzHfyNQ","NcICAUmaEv","RxrsmSmGzv",
+"9iGoTQssNC","uvf7APb1pa","9eoRcYOfrY","LbRTHhi5X7","he9IAsoy9t","lViBvb29RJ","VNCPdx3LDe","d7vjMDQimp","Fhtglru4UG","bgJAzwiHrZ",
+"RsQUqxReec","POUYSC2Irc","nFqikRACuj","rKDLJS2Dfu","CNHmvzqH0W","L7cGcFGzgp","2NslmSjskQ","hYBCKgjUTu","qUJMdbZLvS","tl72WpT8wu",
+"8TxD7fFDrJ","pFrrlWreyP","brhlQVIlwP","WaWsvfaHir","aez9y6AFT0","5ZaEzFLsph","cL0aEgtCA5","D6rByZhwG1","GWqqXguMb8","lsQGoU3yw5",
+"Oz8yZ3weIF","In3NSBbwgA","7lUXZIn3NS","jtn0XIn3NS","MmsIookgRi","JJs5mCdyBV","dhSuHcL0aE","pmeCdcQOnv","WaWsvFFDui","bZLvSv1Hln",
+"45cIHx3LDe","UlU3MSmGzv","dQ586CqqaD","0Wr5yAXpwE","ThjNndhSuH","ix74rVIlwP","uvf7ARmDcr","pvgjSsoy9t","J2mQidhSuH","fLNg8vOqCE",
+"xReecAgJHQ","IKxdLDQimp","WDVWJbrhlQ","M6qcGSjskQ","yofH3o8Uyd","ZuDtDRkQke","ZhwG16AFT0","Nxx9VW7cTs","sx5GlQworu","NOHszAmdQd",
+"Oz8yZaFFss","FGzgpnFqik","AmdQdhSSvQ","suY4xBpYhV","SmGzv07n1c","TCgPpDcpWB","lViBvQYxC0","uJScXIKxdL","vLsmSvkCHH","djsrvC2Irc",
+"ZzJHWOxWIH","BFkb845cIH","9eoRcdhSuH","ZuDtDAXpwE","7ku1pa00b5","ECMvUbgJAz","lweGyQYxC0","RxrsmReKEW","HP433JXljW","Ss0ZuNhXdu",
+"vkCHHMmsIo","jS1ajQbxXc","h1zcHFcWrW","lpF6WwiHrZ","LewvMFhtgl","rKDLJfqypy","fLNg8oQ87r","ulk41yluBx","QbxXci7WMQ","48cHLQworu",
+"fcJOy3otm6","GWqqXprNT6","hi5X7zqH0W","AOgEel83Ud","BGaQYpmeCd","FGzgpcL0aE","Uvlv47X3uy","IRh48jS1aj","5drc6VjCZq","JKWYR5IhmG",
+"BGaQYtAOsr","IKxdLVerEA","tl72WksJby","Vprf2IBe8k","QssNCZ4I1v","gdQsSZhwG1","bgJAzuTacx","lsQGoThjNn","4QMc9tvdkD","S77LHPb1pa",
+"POUYSvkCHH","UlU3M4dEz6","djsrvBbwgA","Uvlv4GXdoH","Uvlv4uvf7A","pv0i764s8N","vkCHHlkMUA","rhl0JFhtgl","OHaBzzqH0W","vkCHHQssNC",
+"lj07QYjB9t","wiHrZZuDtD","FxX9qFFDui","y94nwYh1hF","qaofNeuZA5","tAOsrfaHir","ix74rChuy3","1LB1L7X3uy","CxVEft59lR","CNHmvEOE1o",
+"FcWrWMmKGJ","KsjRKtaOXK","ksJbyVerEA","I7p2ai3pyd","NcICA0MR5X","Oz8yZQbxXc","pv0i7MezSW","zbIYYzY1GY","zFgtBBGaQY","CxVEf1LB1L",
+"RkQkeOUYuF","5Mg9r0YAGH","QworufcJOy","Uvlv4pmeCd","ZJTXHP6bcg","h1zcHRkQke","9rlg9Mm8si","a00b5AOgEe","7hyVvsx5Gl","hi5X7vkCHH",
+"M3zXLYw2oU","29QAz8xEKz","FPfSEFNYIM","xReecx3LDe","uupzkfLNg8","blLA9pWiOs","brhlQfLNg8","vLsmSNAFuw","Oz8yZjiVBP","D6rBy7fsYM",
+"yvOMIe6e4z","dQ586zqH0W","Mkgy8fqypy","GrDg7cL0aE","7hyVvlsQGo","uN6r3GWqqX","aez9ypAhR1","WDVWJix74r","aez9yblLA9","tlILtZuDtD",
+"YjB9tPOUYS","KsjRKVBjhz","pT8wul83Ud","I7p2aThjNn","Kr8yslViBv","AmdQdcmXIX","sqVrfd7vjM","t59lR4dEz6","HfyNQBGaQY","SWfouIBe8k",
+"ciuWzjzUqR","5VZjSbrhlQ","RkQkesuY4x","Cp3mZFFDui","AmdQd9y4lw","Yh1hFJKWYR","TXQ0ZJRJQB","lCMxyJIqXi","ogLgccShY2","yofH3IBe8k",
+"8xEKzIRh48","1j5L8WMiS3","HRxd8Gv3Fq","RpBQmBCxeC","HP433AOgEe","tAOsrFLsph","nnP8osuY4x","ydG8U5iGN5","J2mQii3pyd","t98iWLbRTH",
+"LewvMpiJSk","fqypyCNHmv","AkKTkciuWz","v1HlnP6bcg","pmeCdbZLvS","0MR5XpWiOs","7fKYUrhl0J","29QAz9eoRc","NcICAzqH0W","AXpwEkZANm",
+"MK07YRzaZA","xReec5VZjS","lsQGoNo0Qb","FcWrWP6bcg","MmsIouTacx","d85a9y94nw","29QAzmX2GE","7X3uyAXpwE","yvOMItvdkD","fcwDas93Ml",
+"jiVBPbZLvS","7ku1pciuWz","7hyVvD6rBy","WaWsvJIqXi","OxWIHzbIYY","DcpWBYh1hF","pvgjSCp3mZ","JkzUnM3zXL","yofH32TRI7","M6qcGM3zXL",
+"nlaByGrDg7","Z4I1vFcWrW","HP433jeskS","7lUXZjSjS3","FGzgpUvlv4","n8pJ9wDajX","AIYUuQChxs","pT8wuSWfou","OHaBzni2v1","EOE1ozQt6Q",
+"kB5nPOxWIH","2Yz7Et59lR","tAOsrBpYhV","ru4UG14FLR","AkKTkQChxs","gjUTuzz4ZU","RpBQmpiJSk","lsQGo29QAz","oVQp6atef2","yofH3BbwgA",
+"5Mg9ro8Uyd","BCxeCQssNC","uQIczMmKGJ","gdQsSFjHXR","ciuWzRkQke","he9IAJJs5m","FVMxozbIYY","0YAGHCfgr3","LDk6f9y4lw","AOgEe2Nslm",
+"NhXdu0ao3l","wiHrZaez9y","QbxXcYjB9t","s7MxkWaim6","X6PinRmDcr","bgJAztuDyS","atef24W0Tl","LewvMGv3Fq","CxVEf7hyVv","yofH3fcwDa",
+"I7p2a5Drn0","LewvMcShY2","s93MlNxx9V","uN6r3IKxdL","LDk6fuTacx","pmeCd2TRI7","BpYhVMm8si","fcJOy5iGN5","zbIYYdpe1v","uLtKsBpYhV",
+"dhSuHWmadA","S2DfuD6rBy","VLTy6FVMxo","atef248cHL","EdBKctAOsr","l83Udatef2","ciuWzni2v1","0BmCyYOfrY","l83UdSs0Zu","7hyVvqQxHP",
+"8hJdtYjB9t","uupzk24ARF","oQ87r7hyVv","mz8gx14FLR","2NslmzFgtB","tjQxsQ6hMC","v8yFN5ZaEz","EOE1olj07Q","5ZaEzfmIK1","14FLR4dEz6",
+"K4GS8VNCPd","Kr8ysM6qcG","RBhp0HlUbF","hUTw716lHc","oGu6xOUqFM","aez9yvOqCE","C2IrcVNCPd","No0Qb0h1b1","uJScXJKWYR","MGlTFEdBKc",
+"64s8NFVMxo","uTacxxciqp","5IhmGFFDui","VNCPd4QMc9","lm0pDlweGy","wDajXQbxXc","v2eC3yToGW","W7cTsfqypy","Cfgr3xReec","QnJ1S2Yz7E",
+"zz4ZUogLgc","wiHrZiqv4k","fmIK1DQimp","CqqaDFnPFB","Yf2EcU3yw5","gtCA5VerEA","14FLRhYBCK","QYxC0lj07Q","tvdkDGSQwj","VerEAeuZA5",
+"XyPZN0Kyfs","5Drn0Ta8f6","OHaBzRmDcr","xciqpJXljW","nnP8od7vjM","pAhR1VerEA","AOgEe7X3uy","5NammfLNg8","BGaQYhi5X7","FwEJzYf2Ec",
+"J2mQiCNHmv","ReKEWjeskS","s7MxkksJby","VjCZqUvlv4","mX2GEJkzUn","bZLvS9rlg9","uAWypSmGzv","brhlQ5Namm","NOHsz3weIF","CqqaDDLhzM",
+"wDajXYOfrY","azIWpP6bcg","FcWrWt98iW","prNT69y4lw","azIWpRxrsm","zmLYDPb1pa","tAOsrTa8f6","9XyT9h1zcH","0ao3lFxX9q","55rfBh1zcH",
+"guMb88FmFH","XflUqCNHmv","hUTw7Mm8si","8RCUATXQ0Z","v8yFNy94nw","CqqaD1LB1L","xXTI4MezSW","SbRYypT8wu","QWxoTOHaBz","n8pJ95ZaEz",
+"faHirhE1Ql","B3qem0PktI","CdyBVCIShG","S77LHuQIcz","S77LH5drc6","n1pmOTCgPp","64s8NVBjhz","JJs5m4dEz6","dpe1v1j5L8","XflUqMm8si",
+"h1zcHSjskQ","gf8rItuDyS","9GXkXuZPqg","OUqFMdpe1v","7fKYUtvdkD","pAhR1lkMUA","i7WMQZzJHW","CqqaD0ao3l","lXFOBpmeCd","EoToPPYBf4",
+"ThjNnt98iW","VBjhzoVQp6","FLsphjS1aj","IKxdL2Nslm","d7vjMCNHmv","WmadACdyBV","yToGWY1mC0","5Drn09y4lw","gtCA5t98iW","ru4UGhE1Ql",
+"jzUqRY1mC0","64s8NC2Irc","C2IrcyToGW","cL0aEBGaQY","S77LHWreyP","8U2nUjtn0X","k85AeWPmlx","HRxd85VZjS","FLsphZUnqt","Zv7z0VjCZq",
+"9rlg9xReec","iKqhrqQxHP","o8UydYjB9t","okgRijiVBP","rz7UtNAFuw","1LB1LSWfou","XflUq9y4lw","pvgjSStlDJ","D6rBy0Wr5y","mX2GEtjQxs",
+"QChxsh1zcH","YjB9tFjHXR","7ku1pokgRi","wiHrZ0ao3l","NcICAS2Dfu","7Ow5CsuY4x","TXQ0Z4dEz6","L7cGcdhSuH","XflUqmz8gx","0Wr5yprNT6",
+"07n1cChuy3","WMiS38U2nU","JIqXiyluBx","RpBQmhUTw7","he9IAmX2GE","FPfSEvOqCE","DG4sTOHaBz","3weIFqUJMd","55rfBuPX7G","2Yz7EoVQp6",
+"aDGtScmXIX","bgJAzhi5X7","Ul4a1FxX9q","uQIczBbwgA","xReecDG4sT","dQ586pmeCd","zQt6QokgRi","HfyNQuoStw","rKDLJaez9y","YjB9tprNT6",
+"ciuWzxReec","0PktI2TRI7","zHF1qnnP8o","fqypyvLsmS","FFDui4W0Tl","UmaEv618Di","EdBKc5VZjS","qUJMdyToGW","IKxdLJJs5m","e6e4zTwano",
+"hUTw78TxD7","ix74rBFkb8","bZLvSk85Ae","dpe1vwDajX","2ZHdkO3iyQ","IKxdLXyPZN","618Difqypy","29QAz2Yz7E","55rfBlH1kt","48cHLru4UG",
+"FxX9qZuDtD","ZzJHWiwzGk","P6bcgI7p2a","pWiOs48cHL","n1pmO07n1c","VjCZqvLsmS","8U2nUeuZA5","JJs5ms93Ml","2Nslm5ZaEz","tlILtblLA9",
+"8U2nU07n1c","GWqqXyToGW","cmXIXwiHrZ","fLNg85VZjS","AkKTkPb1pa","ZhwG1ydG8U","Ss0ZuNOHsz","0ao3luJScX","dmoS7blLA9","Yh1hFTwano",
+"zQt6QFhtgl","atef2F6PT2","AIYUuvLsmS","sqVrf8U2nU","07n1clkMUA","jS1ajSs0Zu","3otm6s4786","lkMUA4QMc9","S77LHvOqCE","NhXdu8U2nU",
+"atef2NAFuw","jfREuZ4I1v","zqH0WtjQxs","TXQ0ZVIlwP","6AFT0Vprf2","XflUqChuy3","LewvMoVQp6","Ul4a1W3VFH","UlU3MQYxC0","9eoRcciuWz",
+"hSSvQU3yw5","uQIczOHaBz","fcwDa24ARF","WreyPtvdkD","6AFT0Chuy3","55rfBpFrrl","ZhwG1StlDJ","S77LHhUTw7","8U2nUdmoS7","d7vjMRpBQm",
+"hUTw7WDVWJ","9rlg9QnJ1S","zz4ZUxReec","RzaZAyEfy9","l83UdYw2oU","Rxrsm0YAGH","fcwDabrhlQ","K4GS82hEEU","0PktIDcpWB","2Nslm0YAGH",
+"vLsmSJRJQB","jtn0XgIYvE","nnP8o5Namm","0h1b15drc6","5nmWvFxX9q","CxVEfZv7z0","hSSvQYh1hF","okgRiZ4I1v","gjUTuVprf2","d85a9vkCHH",
+"lH1ktni2v1","7X3uyvLsmS","BCxeCqQxHP","aDGtSfFDrJ","cL0aEMmsIo","lweGyfaHir","xciqppiJSk","hYBCKatef2","pFrrlvkCHH","BFkb86q6L9",
+"xciqpUlU3M","45cIH5VZjS","MojnPoGu6x","ZUnqts7Mxk","JRJQBBbwgA","dhSuHlH1kt","nnP8o0MR5X","tl72WvLsmS","QChxsdjsrv","NAFuwAgJHQ",
+"9XyT9EoToP","WaWsvXyPZN","2DREstlILt","55rfBCNHmv","gdQsSSmGzv","QWxoTwiHrZ","WaWsvpmeCd","jzUqR2Yz7E","14FLRKZamH","v2eC39XyT9",
+"VjCZqlm0pD","fFDrJLDk6f","StlDJnFqik","wiHrZ9XyT9","0MR5XwiHrZ","TCgPpAmdQd","YjB9tTXQ0Z","In3NSJ2mQi","mz8gxQworu","Kr8ysbrhlQ",
+"GXdoHx3LDe","Pb1pad7vjM","prNT6CxVEf","FxX9qm4bxU","RxrsmOUYuF","VLTy60ao3l","bgJAz2Nslm","wiHrZ0BmCy","lm0pDFjHXR","W3VFH2TRI7",
+"d85a9U3yw5","a00b5aez9y","S77LHOxWIH","RxrsmaFFss","hSSvQFcWrW","i7WMQuupzk","uTacx7ku1p","BpYhVjSjS3","m4bxU6q6L9","lH1ktQbxXc",
+"3weIFMezSW","4QMc9Ul4a1","uPX7GsuY4x","lm0pD9iGoT","nlaBy5nmWv","CdyBVMm8si","lCMxyDG4sT","cL0aE48cHL","1j5L8Vprf2","2ZHdk16lHc",
+"5Drn0aL6AJ","qQxHPSs0Zu","tl72WfcJOy","C2IrcgIYvE","nnP8o4W0Tl","XyPZNQssNC","xReecU3yw5","Kr8ysn1pmO","lsQGoSs0Zu","Yf2EcyluBx",
+"PYBf4s4786","uvf7AJkzUn","atef2tlILt","MGlTFFPfSE","rz7Utx3LDe","IRh48l83Ud","WaWsvWPmlx","CxVEfrKDLJ","s7MxkFLsph","FhtglQ6Lix",
+"hSSvQQnJ1S","gtCA5bgJAz","AOgEeStlDJ","Waim6brhlQ","MK07YBFkb8","FPfSEtaOXK","cShY2ru4UG","wDajXhe9IA","Dz1R3LDk6f","Pb1paiB08l",
+"YOfrYRBhp0","EoToP7fKYU","cShY2bgJAz","ydG8UMm8si","OUYuFd7vjM","LbRTHZJTXH","5drc6pT8wu","POUYSMezSW","pFrrlHfyNQ","SbRYyEdBKc",
+"lViBvmX2GE","4QMc9tlILt","jtn0XjfREu","xciqpZhwG1","P6bcgv1Hln","7Ow5Ct98iW","OUqFMNAFuw","atef264s8N","qaofNuQIcz","hSSvQECMvU",
+"VjCZqCxVEf","hYBCKCdyBV","XyPZNIjTwP","vLsmSX6Pin","K4GS82ZHdk","0PktIWmadA","lm0pDazIWp","yToGWQworu","JXljWzmLYD","nFqikQ6Lix",
+"2ZHdkFNYIM","jfREuG1RhS","e6e4zd85a9","uoStwWreyP","ZuDtDlCMxy","iKqhrzqH0W","FGzgpd7vjM","Ta8f6azIWp","ni2v1BFkb8","ZhwG1jSjS3",
+"TwanoiB08l","DQimpru4UG","oGu6xNAFuw","DG4sTe6e4z","t59lRqaofN","SWfouFcWrW","nlaByIn3NS","aL6AJtAOsr","uN6r3zbIYY","nnP8olCMxy",
+"zY1GY2hEEU","QworuWaim6","AgJHQuN6r3","GSQwjrz7Ut","pT8wuiqv4k","t98iWCdyBV","EoToPJXljW","sx5Gl64s8N","45cIHhi5X7","zz4ZUuZPqg",
+"sqVrfQbxXc","jzUqRRBhp0","KASQ8gIYvE","v2eC3JIqXi","vLsmSiKqhr","Cp3mZThjNn","K4GS8BFkb8","5VZjSChuy3","OUqFMhe9IA","uoStwcmXIX",
+"WmadAuTacx","9rlg9ydG8U","HRxd8OUYuF","mX2GEfcwDa","O3iyQAgJHQ","64s8Nv8yFN","XflUqBFkb8","zqH0WMaJQs","F6PT2M3zXL","W7cTs8FmFH",
+"KZamHzmLYD","oGu6xlj07Q","MaJQsvOqCE","618Di7ku1p","GWqqX07n1c","DLhzMU3yw5","gtCA5euZA5","jiVBPZv7z0","07n1ckZANm","StlDJxXTI4",
+"2Yz7EW7cTs","jiVBPuupzk","7fsYMU3yw5","atef2ReKEW","SWfoutuDyS","WmadARACuj","Kr8ysYw2oU","DLhzMuPX7G","l83UdECMvU","zY1GYni2v1",
+"ogLgcwDajX","pT8wuyEfy9","F6PT2fLNg8","XflUqFVMxo","Waim6Cp3mZ","0MR5XReKEW","uJScXkZANm","Waim6pvgjS","guMb8ZUnqt","zmLYDGv3Fq",
+"Z4I1v8xEKz","IBe8k0Wr5y","brhlQy94nw","5NammwiHrZ","vOqCELbRTH","4dEz6mX2GE","tAOsrFnPFB","lm0pD1j5L8","QChxsJ2mQi","K4GS8zY1GY",
+"JIqXixReec","PYBf4okgRi","U3yw5zz4ZU","NcICAIBe8k","HP433TXQ0Z","gtCA555rfB","RkQkenFqik","In3NSFwEJz","lXFOB0MR5X","MK07Y0BmCy",
+"qUJMdiB08l","AOgEefcJOy","oVQp69GXkX","VNCPdrz7Ut","n1pmO6AFT0","jzUqR45cIH","HzZT86q6L9","MGlTFWreyP","qQxHPJkzUn","1v5hHCdyBV",
+"FGzgpYOfrY","QworuuAWyp","Chuy3wiHrZ","W3VFH0PktI","K20wKUvlv4","pv0i7OUqFM","NAFuwGWqqX","1j5L8M3zXL","K4GS8W7cTs","0YAGHQWxoT",
+"nlaByMojnP","h1zcHlXFOB","WmadA4dEz6","zqH0WYw2oU","618DiMmsIo","ThjNnVjCZq","7fsYMBbwgA","gIYvE4W0Tl","AIYUufcJOy","ciuWznlaBy",
+"GXdoH4QMc9","QssNCMK07Y","POUYS16lHc","ru4UG2TRI7","PYBf4zY1GY","WPmlxVerEA","iKqhrHP433","No0Qb9rlg9","kZANmThjNn","lXFOB24ARF",
+"uLtKsHlUbF","XyPZN2ZHdk","iwzGkfcJOy","RmDcrKZamH","fLNg8dQ586","MGlTFAgJHQ","RACujOUqFM","I7p2aZhwG1","StlDJAgJHQ","sx5GlS77LH",
+"k85Aen1pmO","O3iyQFwEJz","MGlTF7Ow5C","HlUbFaDGtS","7hyVvkZANm","okgRiiwzGk","Z4I1vkZANm","YjB9tn8pJ9","DcpWBDLhzM","nFqikfaHir",
+"Dz1R3hE1Ql","b29RJyEfy9","VjCZqWreyP","i7WMQuPX7G","2hEEUVBjhz","Ta8f6EdBKc","SjskQn1pmO","K4GS816lHc","djsrvZUnqt","5Mg9rD6rBy",
+"MmKGJt59lR","fFDrJMaJQs","DLhzMzQt6Q","MezSWnnP8o","sx5Glaez9y","UmaEvo8Uyd","YjB9tGv3Fq","HfyNQ24ARF","nnP8ojtn0X","yEfy9pAhR1",
+"zHF1qUlU3M","zHF1qs4786","K20wKfcwDa","07n1cgIYvE","S2Dfu618Di","RzaZAGSQwj","QbxXclweGy","580YDMezSW","P6bcg7fKYU","JXljWpT8wu",
+"6q6L9Chuy3","2ZHdkGv3Fq","RmDcrHzZT8","QssNCD6rBy","t59lR29QAz","M6qcGlm0pD","fFDrJhE1Ql","gtCA5DQimp","MojnPbgJAz","DQimpFNYIM",
+"L7cGcMezSW","gdQsSFFDui","9XyT9C2Irc","07n1cyToGW","SbRYyv2eC3","WaWsvCK5W7","48cHLJ2mQi","TCgPpSmGzv","l83UdfcwDa","oQ87r7fKYU",
+"CdyBVMezSW","jeskSU3yw5","s7MxkDcpWB","fcJOy0Wr5y","x3LDe8TxD7","O3iyQTXQ0Z","xReecJRJQB","pWiOs8FmFH","MezSWMkgy8","gtCA5RmDcr",
+"JkzUncmXIX","lCMxyqUJMd","IKxdL6AFT0","QClRLPOUYS","24ARFqUJMd","rKDLJfmIK1","v2eC3IKxdL","jfREu7fsYM","B3qemlViBv","prNT6G1RhS",
+"Gv3FqDQimp","uPX7GpiJSk","d7vjMFNYIM","VNCPd9eoRc","QnJ1Sgf8rI","zz4ZUs93Ml","Yh1hFbgJAz","uJScX0PktI","RBhp0sx5Gl","uN6r3TXQ0Z",
+"dQ586Q6hMC","Yf2Echi5X7","cQOnvoVQp6","POUYSFGzgp","kB5nPNAFuw","pv0i714FLR","RACujK4GS8","djsrvulk41","zmLYDCqqaD","IKxdLZv7z0",
+"RpBQmGv3Fq","LDk6fmz8gx","bZLvSqQxHP","xReecJkzUn","W7cTshe9IA","UmaEvFPfSE","WMiS3Mkgy8","SjskQCfgr3","AgJHQ5VZjS","0Wr5ybgJAz",
+"0Kyfsxciqp","RpBQmuZPqg","24ARFlViBv","5iGN5bgJAz","wDajXFnPFB","uZPqg5nmWv","iKqhrMojnP","FGzgpQworu","J2mQi5ZaEz","J2mQi6AFT0",
+"zQt6QwiHrZ","LewvMqaofN","AIYUuP6bcg","BpYhVVBjhz","d85a9EOE1o","8cVD3faHir","NAFuwFPfSE","vOqCEOUqFM","JXljWcmXIX","JXljWjeskS",
+"9XyT9W3VFH","hE1Qllm0pD","0MR5XuN6r3","TCgPpEOE1o","QssNCblLA9","zY1GYhYBCK","ZuDtDTwano","cmXIXB3qem","m4bxUt59lR","DLhzMIKxdL",
+"14FLR8cVD3","x3LDeQYxC0","WPmlxLbRTH","64s8Ny94nw","QYxC08hJdt","OUYuFS2Dfu","FcWrWS2Dfu","IBe8kix74r","soy9ttAOsr","IjTwPZhwG1",
+"djsrvzqH0W","jfREu5drc6","mz8gxThjNn","zmLYDVjCZq","TXQ0Z8TxD7","yEfy9pWiOs","IRh48MmKGJ","580YDYOfrY","QWxoTThjNn","S2Dfu5IhmG",
+"sqVrfdQ586","JRJQBDz1R3","8cVD3wDajX","5nmWvhi5X7","UmaEvazIWp","Yh1hFnFqik","ZJTXHHfyNQ","RBhp0prNT6","prNT6m4bxU","jS1ajvLsmS",
+"8hJdtHfyNQ","NhXduNcICA","yEfy98FmFH","v1Hln5VZjS","hUTw7tl72W","16lHcOHaBz","mX2GEEOE1o","tjQxsTCgPp","5VZjSdQ586","jiVBP8cVD3",
+"dpe1v2ZHdk","AXpwEqaofN","RsQUqUlU3M","uAWypix74r","zQt6QlsQGo","8TxD7WDVWJ","CxVEfYw2oU","QClRLzqH0W","07n1cBpYhV","VerEAVLTy6",
+"kZANm2TRI7","IjTwPFhtgl","WreyP7hyVv","VjCZqY1mC0","o8UydHP433","7X3uyReKEW","k85AeokgRi","QssNChUTw7","CqqaDCp3mZ","9rlg98cVD3",
+"vOqCEUmaEv","0Wr5yKr8ys","0PktI3weIF","bgJAzGWqqX","AmdQduoStw","lXFOBFFDui","Z4I1vlsQGo","zQt6Q3weIF","DcpWB0PktI","BGaQYyToGW",
+"pFrrlZuDtD","lm0pD3otm6","M6qcG8hJdt","MK07YmX2GE","dpe1vIjTwP","blLA9tAOsr","5Mg9rUl4a1","uZPqgC2Irc","VNCPdhUTw7","TCgPp5Drn0",
+"tAOsrMkgy8","iqv4kiwzGk","9GXkXdpe1v","HfyNQCp3mZ","3weIFpFrrl","OxWIHzz4ZU","G1RhSSWfou","zbIYYoQ87r","ZhwG1HRxd8","uupzkFhtgl",
+"DcpWBLDk6f","rz7UtwiHrZ","BFkb8yvOMI","Ul4a1U3yw5","U3yw5sx5Gl","GrDg74QMc9","jeskSJKWYR","KsjRK14FLR","AXpwEXflUq","580YDi7WMQ",
+"C2Ircsx5Gl","jiVBPG1RhS","LewvMIRh48","CdyBVFxX9q","OUYuFjzUqR","Ta8f6QYxC0","MezSWyvOMI","tuDySNxx9V","6AFT04W0Tl","45cIHJ2mQi",
+"2TRI7yToGW","tuDySprNT6","WPmlxVjCZq","1j5L8pWiOs","W7cTs2Nslm","5NammIjTwP","o8UydpWiOs","Z4I1v45cIH","StlDJhYBCK","9iGoTMK07Y",
+"djsrvzbIYY","5NammlH1kt","a00b59iGoT","cL0aEzFgtB","VjCZqmz8gx","ni2v17fsYM","HRxd85Drn0","FxX9qNhXdu","tl72WJIqXi","zFgtBQChxs",
+"Mkgy8pWiOs","dmoS7ksJby","7X3uyBbwgA","fcwDaWPmlx","M6qcGCdyBV","CdyBVAOgEe","oQ87rzQt6Q","Y1mC0Rxrsm","i3pydQClRL","OUYuFs4786",
+"I7p2adpe1v","5NammK4GS8","Z4I1vQWxoT","kB5nPWaim6","07n1cWMiS3","JIqXiZzJHW","DcpWBXyPZN","fcwDaFhtgl","nFqikn1pmO","29QAzcShY2",
+"Oz8yZb29RJ","bgJAz5VZjS","atef29GXkX","pmeCdRkQke","xXTI4nFqik","5IhmGI7p2a","oVQp6FxX9q","RxrsmuZPqg","YOfrYPOUYS","s93MlS2Dfu",
+"wiHrZuQIcz","0YAGHru4UG","55rfBqQxHP","djsrvh1zcH","1v5hHWPmlx","ix74r7lUXZ","7ku1pBCxeC","azIWpWDVWJ","HP433qaofN","l83Ud7fsYM",
+"hE1QlZzJHW","ThjNnZv7z0","nFqik0YAGH","fmIK1b29RJ","qaofNMaJQs","GXdoHyToGW","ZUnqtIBe8k","ReKEWjtn0X","VLTy6sqVrf","2Yz7EjSjS3",
+"9iGoTDLhzM","zHF1qK4GS8","soy9tv8yFN","uLtKs2hEEU","D6rBy2hEEU","LbRTHHRxd8","o8UydThjNn","cQOnvWDVWJ","xXTI4mX2GE","lCMxyFNYIM",
+"i3pydOz8yZ","W3VFH07n1c","rz7UtydG8U","8U2nUQssNC","DLhzM29QAz","Yf2EcsuY4x","EOE1o0h1b1","tvdkDNo0Qb","QnJ1SQChxs","yofH3hE1Ql",
+"Vprf28hJdt","BpYhV55rfB","ZuDtDfqypy","s93MlSWfou","IKxdLZ4I1v","RkQkeGSQwj","0ao3lfLNg8","cQOnvd85a9","soy9tyEfy9","tjQxsZUnqt",
+"WPmlx16lHc","gjUTuM3zXL","K4GS85Drn0","tlILtiqv4k","jS1ajOz8yZ","KsjRKCK5W7","M3zXLdjsrv","rKDLJWreyP","BGaQYmX2GE","CdyBVHRxd8",
+"9eoRcYf2Ec","s93MlSbRYy","W3VFHjzUqR","uTacxlj07Q","KASQ8ThjNn","yofH3pv0i7","45cIHIRh48","In3NSSs0Zu","RxrsmuoStw","gdQsSwiHrZ",
+"euZA5s93Ml","fcwDaZJTXH","fLNg8Yw2oU","IRh48uvf7A","d85a9LbRTH","Cfgr3Mm8si","d7vjMDG4sT","RmDcratef2","Vprf2NcICA","QbxXcsoy9t",
+"8TxD7Pb1pa","ECMvUIjTwP","lpF6WpWiOs","xciqpFVMxo","uvf7A16lHc","WreyPAkKTk","yToGWmX2GE","0Wr5yjiVBP","VjCZqkZANm","pFrrluAWyp",
+"uQIcz4dEz6","4W0Tl4dEz6","5nmWvIRh48","xciqp3otm6","3otm6XyPZN","BpYhVXyPZN","4W0TlYjB9t","bgJAz9y4lw","JRJQBThjNn","NhXduFLsph",
+"soy9tvkCHH","lj07QCIShG","F6PT2P6bcg","ZUnqt0BmCy","29QAz7X3uy","lH1ktQClRL","LbRTH29QAz","Q6LixYw2oU","pWiOs5Drn0","2DREsCfgr3",
+"07n1c9XyT9","QnJ1S8cVD3","3weIFECMvU","QssNCbgJAz","ZzJHWe6e4z","v2eC3brhlQ","KZamH580YD","SjskQ1v5hH","S77LHn1pmO","JJs5mix74r",
+"4QMc9n8pJ9","v8yFNhE1Ql","MaJQsU3yw5","CNHmvSbRYy","GXdoHuJScX","ru4UGiwzGk","k85AeaFFss","ydG8UciuWz","qQxHPxciqp","Chuy3dpe1v",
+"IBe8kn8pJ9","tvdkDdpe1v","gjUTudjsrv","0BmCyFNYIM","gIYvEStlDJ","BCxeCb29RJ","B3qemnnP8o","No0Qba00b5","vOqCEpAhR1","atef29rlg9",
+"oGu6xydG8U","OUYuFVNCPd","29QAzJXljW","TXQ0Z7X3uy","8FmFHECMvU","ZuDtDQssNC","RkQkeoVQp6","zFgtBHzZT8","MmsIoVNCPd","jiVBP6AFT0",
+"9rlg9MmsIo","wiHrZIn3NS","Yf2Ecuvf7A","a00b5tuDyS","zmLYD64s8N","Pb1papv0i7","2ZHdkMm8si","zQt6QNhXdu","9eoRcRkQke","taOXK7Ow5C",
+"SWfouOz8yZ","cL0aEPb1pa","t59lRpiJSk","C2IrcGWqqX","lweGyEOE1o","Cp3mZtjQxs","Twanodjsrv","8U2nUGrDg7","IBe8kL7cGc","6AFT0In3NS",
+"RBhp0dhSuH","hYBCKt59lR","QworuRmDcr","IjTwPuvf7A","VNCPdsuY4x","3otm6pmeCd","RzaZA5VZjS","lj07QSjskQ","W7cTsZUnqt","v8yFNS2Dfu",
+"Yw2oUCIShG","GXdoH8xEKz","QbxXcOUYuF","JRJQBuLtKs","0ao3lYjB9t","jSjS3s7Mxk","x3LDeRBhp0","Zv7z0LDk6f","W7cTsAgJHQ","iwzGkZhwG1",
+"Pb1panFqik","uvf7AVLTy6","pmeCdm4bxU","brhlQTCgPp","sx5GlJkzUn","SWfouqQxHP","WPmlxuN6r3","14FLRqUJMd","EdBKcnFqik","gf8rIFLsph",
+"LewvMhUTw7","YOfrYEdBKc","nFqikStlDJ","ThjNngtCA5","lCMxyvLsmS","U3yw5618Di","64s8N0Kyfs","cQOnvHlUbF","CK5W7zbIYY","In3NSRkQke",
+"blLA9LewvM","Mm8siuupzk","hSSvQpWiOs","MojnPJXljW","X6PinDz1R3","IRh48zz4ZU","CqqaDB3qem","tuDySNo0Qb","2hEEUZhwG1","7X3uyQClRL",
+"ciuWz7fsYM","s93MlChuy3","Cp3mZDcpWB","FLsphF6PT2","SjskQdQ586","yofH3dhSuH","AmdQdcQOnv","zbIYY0h1b1","BFkb8G1RhS","VLTy6OUYuF",
+"jeskSFGzgp","ksJbyMojnP","RmDcrBFkb8","taOXKMm8si","S2DfuKASQ8","Chuy3hSSvQ","soy9tCqqaD","2NslmIKxdL","7hyVvP6bcg","BCxeCSbRYy",
+"7X3uyfaHir","EoToP2ZHdk","lCMxyIn3NS","C2Ircn8pJ9","0ao3lRzaZA","rhl0JoQ87r","J2mQi14FLR","IRh48FNYIM","jSjS35Namm","YOfrYKr8ys",
+"pmeCdzz4ZU","D6rByZUnqt","Cp3mZ16lHc","e6e4zokgRi","JIqXi9y4lw","S77LHn8pJ9","uZPqge6e4z","D6rByCdyBV","SmGzvMkgy8","fLNg8S77LH",
+"8cVD3BbwgA","uAWypMezSW","cmXIXYf2Ec","cQOnvI7p2a","0PktI0PktI","AXpwE8xEKz","5drc6tAOsr","lweGy6AFT0","QbxXcTa8f6","AgJHQ8xEKz",
+"9XyT9Qworu","Dz1R3lsQGo","DQimpSmGzv","8xEKzi3pyd","HlUbFzz4ZU","h1zcHDG4sT","x3LDei7WMQ","MaJQsSjskQ","djsrvXflUq","soy9thSSvQ",
+"Q6LixjiVBP","VIlwPfcJOy","vkCHHWreyP","Twano0MR5X","ZJTXHhSSvQ","DG4sTmz8gx","2Yz7ENhXdu","QYxC0FjHXR","BFkb8pvgjS","6AFT0gjUTu",
+"0BmCyfFDrJ","atef20MR5X","VBjhzOHaBz","zHF1qcQOnv","M3zXLaL6AJ","vkCHHhe9IA","Y1mC0aL6AJ","0YAGHaDGtS","aFFss7hyVv","jfREuZv7z0",
+"0ao3lFcWrW","RxrsmtvdkD","nlaBy618Di","0Wr5yCxVEf","MmsIo7X3uy","uvf7ASWfou","Y1mC0L7cGc","ulk41taOXK","sqVrfXflUq","cQOnvqQxHP",
+"pT8wu48cHL","Kr8ysQ6Lix","ECMvUlweGy","VNCPdCqqaD","1LB1LCIShG","FVMxoNo0Qb","StlDJRpBQm","pAhR1QClRL","2NslmlXFOB","QworuQClRL",
+"jS1ajDcpWB","SbRYygtCA5","07n1ctaOXK","faHirulk41","W7cTsFGzgp","NAFuwuvf7A","mz8gxrKDLJ","16lHcYf2Ec","HfyNQydG8U","x3LDeCIShG",
+"14FLRUmaEv","zFgtBFnPFB","y94nw9y4lw","FLsphD6rBy","0BmCyGSQwj","KsjRKt59lR","OHaBzJKWYR","8xEKzmX2GE","IRh48M6qcG","Oz8yZprNT6",
+"580YDxXTI4","MK07YfcJOy","IKxdLNAFuw","uN6r345cIH","DLhzMWPmlx","FFDui5IhmG","ZUnqtOHaBz","3weIFlm0pD","Twano0h1b1","yToGWpmeCd",
+"OUqFMAXpwE","RACujhE1Ql","14FLRS2Dfu","LewvMVNCPd","BGaQYtuDyS","0YAGHdjsrv","d85a9gdQsS","ogLgcfLNg8","5Mg9r4QMc9","pWiOs2hEEU",
+"ZJTXHB3qem","WPmlxk85Ae","l83UdS77LH","5Mg9rv1Hln","F6PT2mX2GE","Pb1pa6q6L9","zbIYYAOgEe","G1RhSaFFss","F6PT2MGlTF","TXQ0ZSjskQ",
+"qUJMdjfREu","AgJHQnlaBy","brhlQM3zXL","F6PT2lm0pD","8U2nUL7cGc","EoToPyToGW","JIqXiZJTXH","EdBKcyvOMI","t59lRCK5W7","lXFOBBCxeC",
+"lViBvzHF1q","48cHLCqqaD","Cp3mZFVMxo","1j5L8ReKEW","VBjhzBpYhV","NOHszZv7z0","IRh487lUXZ","fcJOysqVrf","qQxHPRpBQm","ZzJHWpmeCd",
+"guMb8WmadA","OHaBzNcICA","I7p2azQt6Q","CdyBVVLTy6","Q6LixAOgEe","EOE1oTCgPp","Oz8yZxReec","mX2GEJKWYR","QbxXcZv7z0","XyPZNoQ87r",
+"zY1GYMkgy8","jzUqR8cVD3","suY4xni2v1","JIqXilViBv","yToGWiqv4k","zY1GYTXQ0Z","wiHrZP6bcg","t98iWvLsmS","oQ87rhi5X7","9rlg9iwzGk",
+"fmIK1ix74r","zQt6QhUTw7","gf8rIGrDg7","8TxD7ksJby","LDk6f8RCUA","VerEAs4786","MaJQsVLTy6","7X3uypmeCd","ReKEW8cVD3","jtn0XCfgr3",
+"FNYIM9iGoT","lXFOBlXFOB","5VZjSFjHXR","JKWYRyofH3","cmXIXHP433","SmGzvFxX9q","64s8N8U2nU","SWfouzbIYY","rKDLJOxWIH","4W0Tljtn0X",
+"FcWrWn1pmO","uTacxAOgEe","WaWsvlm0pD","5iGN5xciqp","KZamHS2Dfu","7fKYUuvf7A","07n1cAIYUu","v2eC316lHc","TCgPpVjCZq","Kr8ysl83Ud",
+"zqH0WoQ87r","okgRiAgJHQ","pmeCdkB5nP","d7vjMDLhzM","d7vjMPOUYS","XflUqW7cTs","nlaBylsQGo","a00b5k85Ae","WDVWJZzJHW","Y1mC0gdQsS",
+"XyPZN3weIF","uQIczFcWrW","wiHrZStlDJ","DG4sTjtn0X","4dEz6MaJQs","sx5GlGWqqX","VjCZqThjNn","vLsmS3weIF","bgJAzzQt6Q","S2DfuYOfrY",
+"M3zXLS2Dfu","Gv3FqzQt6Q","HRxd8AOgEe","NhXduUmaEv","h1zcH5IhmG","8U2nU4W0Tl","48cHL2DREs","lj07QfFDrJ","qQxHPdpe1v","RACuj24ARF",
+"RmDcrlpF6W","8cVD3yluBx","pFrrlMm8si","16lHcbrhlQ","FNYIMuupzk","sqVrfDcpWB","MaJQsjtn0X","zz4ZUru4UG","nnP8ocL0aE","5drc68xEKz",
+"EdBKcuupzk","CqqaDHzZT8","MojnPNhXdu","sqVrftuDyS","ECMvUFxX9q","JRJQB1LB1L","hi5X7jSjS3","14FLRMmKGJ","Kr8yssqVrf","ru4UGYf2Ec",
+"16lHclsQGo","QWxoT0h1b1","EdBKcvkCHH","mX2GE0ao3l","lViBvx3LDe","lj07QUl4a1","uLtKsW3VFH","GrDg71LB1L","dQ5867X3uy","CxVEfM3zXL",
+"fcwDaChuy3","IjTwPgtCA5","Kr8ysQbxXc","Cp3mZnFqik","dpe1v5drc6","DLhzM4QMc9","fcwDarz7Ut","pv0i7ru4UG","uvf7AmX2GE","8TxD75Namm",
+"W3VFHd7vjM","BpYhVQ6Lix","lsQGo580YD","Twanoatef2","Mkgy8s93Ml","KASQ8MK07Y","taOXKv8yFN","FcWrWG1RhS","K4GS87fsYM","7Ow5CB3qem",
+"FhtglcmXIX","CK5W79iGoT","AIYUuFxX9q","0KyfsUvlv4","s4786yToGW","d85a9IjTwP","iB08ln8pJ9","XflUqFxX9q","tl72WZJTXH","WDVWJo8Uyd",
+"FPfSEDLhzM","prNT6580YD","Z4I1vqUJMd","FFDuisoy9t","JKWYRQ6hMC","fcJOyksJby","hi5X78xEKz","P6bcgs93Ml","K20wKlm0pD","5nmWvNOHsz",
+"5VZjSDcpWB","dmoS7rKDLJ","GXdoH2Nslm","MaJQss93Ml","Mkgy8IKxdL","VBjhzX6Pin","45cIHvkCHH","0h1b15iGN5","ECMvUMkgy8","pAhR1FnPFB",
+"M3zXLnlaBy","ogLgcRzaZA","HlUbFRBhp0","9rlg9PYBf4","Q6hMC6q6L9","0h1b1hSSvQ","QnJ1Siqv4k","8TxD7VIlwP","rhl0J0YAGH","lpF6WFVMxo",
+"bgJAzSs0Zu","zz4ZUZJTXH","55rfB8U2nU","okgRiCdyBV","jSjS3qaofN","ThjNnzY1GY","tvdkD0h1b1","gdQsS0h1b1","uQIczpFrrl","zQt6QyEfy9",
+"qQxHPSmGzv","VIlwPP6bcg","WPmlxn8pJ9","7ku1pIRh48","FGzgpaDGtS","RmDcrlkMUA","IjTwP8hJdt","nFqikGrDg7","580YDYw2oU","MmsIobgJAz",
+"uZPqgcL0aE","Kr8ysFnPFB","FcWrWL7cGc","aL6AJnnP8o","sqVrfOUqFM","s4786FLsph","QWxoThi5X7","NAFuwogLgc","MojnPMmKGJ","cShY2cL0aE",
+"FcWrWbZLvS","aez9yi7WMQ","M6qcGAXpwE","n1pmOFFDui","3weIFNo0Qb","M3zXLYjB9t","QbxXcGWqqX","MojnPokgRi","dpe1v9GXkX","SWfoutlILt",
+"5Drn0YOfrY","CxVEf5Namm","9y4lwDLhzM","POUYS5iGN5","tlILtRpBQm","QbxXchUTw7","WmadAOUYuF","7hyVvtuDyS","MaJQsHRxd8","fFDrJNAFuw",
+"ZuDtDEoToP","gtCA5JIqXi","8hJdtL7cGc","ogLgcIRh48","gtCA5Ul4a1","t59lR7lUXZ","5IhmGjzUqR","MezSWi3pyd","e6e4zvOqCE","K4GS8l83Ud",
+"JkzUnuTacx","iqv4kRmDcr","0ao3lbrhlQ","J2mQiFGzgp","ZhwG1tl72W","ni2v1yToGW","b29RJ8hJdt","G1RhSGrDg7","yEfy9zbIYY","W7cTsMK07Y",
+"m4bxUZzJHW","9XyT94dEz6","6AFT0hSSvQ","DQimp55rfB","e6e4zPYBf4","pWiOsD6rBy","9GXkXsqVrf","GWqqX29QAz","rz7UtRzaZA","soy9tIRh48",
+"Dz1R3F6PT2","lsQGozz4ZU","FNYIMiqv4k","uQIczlm0pD","6AFT0AOgEe","618Dio8Uyd","zmLYD45cIH","CK5W7BCxeC","SmGzv8cVD3","5iGN5ni2v1",
+"0ao3l1j5L8","Q6hMCyvOMI","POUYSBGaQY","YOfrYCfgr3","LewvMvLsmS","CIShG5Drn0","S77LH2TRI7","JIqXi618Di","16lHcYjB9t","G1RhSuZPqg",
+"RsQUqfFDrJ","EOE1o24ARF","ECMvU1j5L8","vkCHHGWqqX","9eoRclweGy","fLNg8tvdkD","XflUqMmsIo","dQ586azIWp","JIqXiyofH3","oQ87rd7vjM",
+"OxWIHlXFOB","FjHXRRsQUq","UmaEvfmIK1","Zv7z0WMiS3","VBjhz07n1c","EOE1ot98iW","FwEJzJ2mQi","GSQwjl83Ud","CK5W70h1b1","e6e4zpmeCd",
+"LbRTH4W0Tl","vkCHHCxVEf","Oz8yZtvdkD","Uvlv4RBhp0","Mkgy8FFDui","uAWypfcwDa","Yf2EcGrDg7","uAWypqUJMd","WPmlx0YAGH","azIWplpF6W",
+"KsjRK1j5L8","FFDuiRsQUq","BbwgAUlU3M","gdQsSAkKTk","FjHXR48cHL","OUqFMcQOnv","OxWIHzY1GY","s4786RACuj","7lUXZ2Nslm","RzaZAhYBCK",
+"ZhwG1UmaEv","9XyT9NAFuw","FjHXRDcpWB","L7cGcru4UG","Dz1R3VBjhz","nlaByv2eC3","tl72Whe9IA","zHF1qfcJOy","s93MlnFqik","8FmFH4dEz6",
+"iqv4kbrhlQ","RzaZARsQUq","n8pJ9VLTy6","gIYvEa00b5","6q6L9iqv4k","OxWIH3weIF","hYBCKHlUbF","gIYvENhXdu","OxWIHvLsmS","pmeCdMojnP",
+"RmDcrAIYUu","qaofN4QMc9","s7MxkHRxd8","a00b5MK07Y","PYBf4ogLgc","rhl0JSbRYy","5IhmG5Mg9r","Waim6OxWIH","fcJOyv1Hln","QWxoTtAOsr",
+"SjskQvLsmS","rKDLJKZamH","AXpwEFPfSE","8cVD3618Di","5iGN5fmIK1","t59lRFLsph","m4bxUpAhR1","Vprf2I7p2a","BCxeC0Kyfs","AgJHQfqypy",
+"d85a9FnPFB","QYxC08FmFH","yofH3UmaEv","x3LDe16lHc","s93Ml7fsYM","0BmCy9iGoT","9iGoTMGlTF","Twano1v5hH","fcJOytuDyS","XyPZNxReec",
+"uQIczzQt6Q","1j5L8iKqhr","BpYhVrKDLJ","x3LDeoGu6x","Q6hMCnFqik","OxWIHfmIK1","qaofN7fsYM","wDajXPb1pa","CqqaD0BmCy","Kr8ysBCxeC",
+"Y1mC0Y1mC0","uupzkxReec","b29RJatef2","RkQkeiKqhr","hYBCKCp3mZ","brhlQdmoS7","48cHL16lHc","aFFsspvgjS","soy9t5drc6","6AFT00Kyfs",
+"Mkgy8ru4UG","618DiXyPZN","MGlTFzqH0W","TXQ0ZwDajX","5drc6XyPZN","cShY2hSSvQ","B3qemoQ87r","uoStwru4UG","xciqpMojnP","EOE1oHfyNQ",
+"cmXIXlj07Q","piJSkmz8gx","ciuWzNOHsz","HzZT8zbIYY","fqypyB3qem","24ARFuoStw","iKqhrU3yw5","uAWypCdyBV","SbRYykB5nP","FPfSEMezSW",
+"NcICAZJTXH","sqVrfiwzGk","blLA9S2Dfu","5drc6CIShG","jfREuOHaBz","yvOMIcQOnv","0ao3lxciqp","blLA9JKWYR","Dz1R348cHL","ZzJHWRpBQm",
+"WPmlxaDGtS","24ARFIBe8k","W7cTsFPfSE","OHaBzZUnqt","HfyNQKr8ys","Yw2oUuoStw","m4bxU2DREs","aDGtSCK5W7","8U2nUDcpWB","8FmFH1v5hH",
+"Ta8f6jtn0X","Chuy3ciuWz","fcwDaBFkb8","Uvlv4b29RJ","YOfrYDz1R3","ZhwG1CNHmv","FhtglOHaBz","1v5hHZUnqt","FLsphVNCPd","FGzgpkZANm",
+"WMiS3dQ586","Waim6jSjS3","Vprf2pAhR1","WDVWJSs0Zu","9GXkXGv3Fq","FxX9quupzk","ciuWzQ6hMC","UlU3Mm4bxU","W7cTsKASQ8","lXFOBAXpwE",
+"KZamHoQ87r","U3yw5RACuj","euZA55IhmG","JKWYRbZLvS","CNHmv2Nslm","xciqpzY1GY","6q6L9oVQp6","5VZjSlViBv","P6bcgVBjhz","jSjS3k85Ae",
+"WreyPzbIYY","4dEz65Mg9r","5ZaEz9y4lw","tlILtrz7Ut","jfREuMaJQs","qaofNmz8gx","Ss0ZuLbRTH","NAFuwzHF1q","0YAGHl83Ud","SjskQYh1hF",
+"MmKGJIKxdL","WMiS3OUYuF","Oz8yZCxVEf","S77LHi7WMQ","zQt6QCxVEf","jfREuJXljW","16lHcG1RhS","bZLvSJIqXi","M6qcG7lUXZ","l83UdzqH0W",
+"4dEz6S77LH","8RCUA5nmWv","hE1Qlsoy9t","RxrsmOHaBz","FPfSEn1pmO","0YAGHlkMUA","ogLgcIBe8k","XyPZNvOqCE","LbRTH8TxD7","mz8gx2Nslm",
+"TXQ0ZkZANm","yofH3BCxeC","BGaQYdpe1v","AkKTkeuZA5","EOE1o8TxD7","BbwgAMGlTF","guMb8AXpwE","UlU3MXflUq","2TRI7FnPFB","jtn0XVLTy6",
+"U3yw529QAz","e6e4ziwzGk","ZzJHWgjUTu","45cIHRpBQm","No0Qb5Drn0","JIqXiCdyBV","QChxs29QAz","mz8gxBFkb8","AkKTkAkKTk","fcJOyVjCZq",
+"K4GS8zHF1q","VerEAECMvU","HfyNQ5IhmG","1j5L82hEEU","AmdQdv8yFN","aez9yyEfy9","bgJAzYw2oU","GrDg75VZjS","azIWpQnJ1S","QChxslm0pD",
+"POUYSyvOMI","QnJ1SkZANm","WreyPQssNC","M3zXLokgRi","5IhmGfmIK1","rKDLJulk41","lXFOBuAWyp","0BmCy2ZHdk","tAOsrgtCA5","Cfgr3jS1aj",
+"lj07QSbRYy","FnPFB5IhmG","VNCPduupzk","8TxD7hi5X7","uAWypKASQ8","lkMUAd85a9","dQ5867fKYU","HzZT8FGzgp","RBhp01LB1L","S2DfuVprf2",
+"4dEz6SbRYy","LbRTH8hJdt","uoStwPb1pa","cmXIXvkCHH","HRxd8CIShG","EdBKcyofH3","J2mQiPb1pa","yluBxsuY4x","24ARFMGlTF","ThjNnpT8wu",
+"DcpWBVBjhz","580YDs7Mxk","29QAzRkQke","RpBQmdQ586","MmKGJi7WMQ","JXljWZJTXH","tvdkDxXTI4","uPX7GQWxoT","SmGzv1LB1L","lCMxyAIYUu",
+"ogLgcbgJAz","29QAzZ4I1v","0ao3lv2eC3","xXTI42hEEU","9rlg9dQ586","RkQkeFwEJz","14FLRsoy9t","1v5hHhi5X7","JJs5mECMvU","55rfBAgJHQ",
+"wiHrZOHaBz","WMiS3618Di","aL6AJAIYUu","s7Mxk7X3uy","m4bxUgf8rI","bZLvSFPfSE","8xEKzDQimp","U3yw5hSSvQ","sqVrfwiHrZ","mz8gxW7cTs",
+"i7WMQyToGW","S77LH5VZjS","rKDLJSbRYy","zqH0WOUYuF","TXQ0ZQYxC0","fcwDalCMxy","zbIYYnlaBy","RpBQmfqypy","M3zXL0YAGH","OUYuFDG4sT",
+"ZzJHWpT8wu","ThjNnF6PT2","XflUqyToGW","DcpWBdmoS7","FPfSEJ2mQi","5ZaEzDG4sT","5ZaEzSs0Zu","s7MxkFnPFB","WreyPVBjhz","S2Dfu9rlg9",
+"EoToPBCxeC","hUTw7RkQke","jiVBPs93Ml","JJs5mdjsrv","ZJTXHTXQ0Z","StlDJPb1pa","qUJMdUlU3M","mX2GE0YAGH","Yw2oUdhSuH","lm0pDKr8ys",
+"4W0TlHzZT8","0ao3lSbRYy","ru4UGrKDLJ","1LB1LU3yw5","EOE1oqQxHP","mX2GElj07Q","JXljWrz7Ut","zQt6QD6rBy","No0QbydG8U","s7MxkzbIYY",
+"QssNCDLhzM","gdQsSksJby","618DiCqqaD","5drc6I7p2a","2DREsMkgy8","JXljWZUnqt","NAFuwRxrsm","GSQwjiB08l","rz7UtZhwG1","d7vjMgdQsS",
+"Z4I1vzY1GY","GrDg7lj07Q","nnP8oNcICA","CNHmvS2Dfu","fmIK1WreyP","07n1cv8yFN","MmsIol83Ud","jSjS3QYxC0","qaofN0Kyfs","s7MxktjQxs",
+"4dEz6JKWYR","n1pmOAgJHQ","zY1GYjS1aj","s7Mxka00b5","Cp3mZG1RhS","7ku1pJJs5m","nnP8oZzJHW","DLhzMprNT6","oQ87rh1zcH","RACujFhtgl",
+"iqv4kv1Hln","Q6Lixt98iW","618DiCdyBV","CNHmvOUYuF","YjB9tMK07Y","yEfy9MmKGJ","1v5hHFNYIM","OUYuFZJTXH","uLtKs1j5L8","Q6LixZUnqt",
+"lpF6WMmsIo","fcJOy2DREs","nlaBySjskQ","0KyfspAhR1","dhSuHo8Uyd","zHF1qgdQsS","uAWypOUYuF","P6bcgmz8gx","jzUqRJRJQB","Yw2oUulk41",
+"sx5GltvdkD","5Drn0WMiS3","AXpwEblLA9","zFgtBZUnqt","ru4UGyToGW","pT8wuM3zXL","n1pmOAmdQd","MmsIos7Mxk","yofH3WmadA","Yh1hFzY1GY",
+"OxWIHBpYhV","OUYuFIjTwP","POUYSGWqqX","gtCA5HfyNQ","dmoS7uvf7A","h1zcHlm0pD","24ARFbZLvS","a00b5Kr8ys","BbwgAOHaBz","lj07QKZamH",
+"5IhmGDQimp","lViBv5ZaEz","Uvlv4yvOMI","HzZT85ZaEz","zbIYYqQxHP","7Ow5CM6qcG","lH1kt0h1b1","faHirU3yw5","QYxC04W0Tl","y94nw6AFT0",
+"IBe8kFLsph","zz4ZUsx5Gl","oGu6xgdQsS","zFgtBVBjhz","lkMUAFVMxo","ReKEWBGaQY","3weIFEOE1o","4dEz6jiVBP","ZzJHWEoToP","Twanob29RJ",
+"yluBxCIShG","IRh48b29RJ","GWqqXdpe1v","Z4I1vuTacx","Pb1paWMiS3","ZJTXH45cIH","1LB1LfFDrJ","piJSkYOfrY","jeskSwiHrZ","pFrrlCK5W7",
+"yluBxhi5X7","jfREuJJs5m","29QAzx3LDe","2hEEUcmXIX","brhlQ8RCUA","pAhR1h1zcH","RkQkeVerEA","aDGtSNOHsz","0YAGHFjHXR","wDajXyEfy9",
+"yEfy97fKYU","n8pJ9lm0pD","aFFss618Di","GSQwjQClRL","aDGtSjS1aj","5iGN5nlaBy","ECMvUeuZA5","oVQp6HzZT8","Pb1paKASQ8","NhXduv8yFN",
+"ZUnqta00b5","zY1GYBpYhV","uAWypZ4I1v","MezSWy94nw","wiHrZdpe1v","e6e4zNhXdu","VjCZqlkMUA","GrDg7RzaZA","F6PT2fmIK1","LDk6fk85Ae",
+"wiHrZFPfSE","kB5nP5ZaEz","faHirgjUTu","iB08lksJby","vkCHHd85a9","Kr8ysiqv4k","B3qemuAWyp","2Yz7EWmadA","W7cTsqUJMd","AIYUuG1RhS",
+"L7cGcTXQ0Z","RBhp0BbwgA","KsjRKgdQsS","8cVD3MojnP","HzZT80ao3l","MmKGJxciqp","ZzJHW2Yz7E","OUqFMQ6Lix","i7WMQQChxs","FjHXRCIShG",
+"BGaQYFFDui","zHF1qprNT6","uJScXGXdoH","VjCZqjS1aj","djsrvQClRL","aDGtSxciqp","Q6hMCuPX7G","KZamHTwano","VLTy6JkzUn","Waim6lj07Q",
+"hE1Qlix74r","ZJTXHrz7Ut","ZzJHWU3yw5","ulk41D6rBy","FxX9qJ2mQi","zmLYDSs0Zu","ZuDtDv8yFN","OxWIHLbRTH","OxWIHL7cGc","nFqik618Di",
+"DQimpKr8ys","jSjS3FjHXR","ZJTXHVjCZq","dQ5860MR5X","B3qemXflUq","guMb8EdBKc","GSQwjWaim6","RmDcrJIqXi","oGu6xCK5W7","uoStwpmeCd",
+"StlDJydG8U","dQ586OUYuF","QClRLHzZT8","2hEEUyToGW","8hJdt5VZjS","Yh1hFECMvU","ix74rWDVWJ","cL0aEnFqik","CxVEfuJScX","MojnPGSQwj",
+"RACujwDajX","9rlg9wDajX","h1zcH0BmCy","SjskQwiHrZ","vLsmSkZANm","O3iyQQnJ1S","fLNg8JIqXi","2Yz7EprNT6","yofH3EOE1o","pWiOsB3qem",
+"lCMxy7Ow5C","zY1GYIn3NS","pvgjSuAWyp","azIWpZuDtD","tjQxstjQxs","8FmFHOxWIH","0MR5X8hJdt","24ARFThjNn","tlILtOUqFM","taOXKZJTXH",
+"hi5X7HfyNQ","jiVBPjfREu","uoStwokgRi","QYxC0a00b5","ZzJHWguMb8","8U2nUjfREu","QnJ1S9rlg9","uupzkuTacx","UmaEvaez9y","ogLgcAkKTk",
+"BpYhVSmGzv","9eoRc7hyVv","Mkgy8AgJHQ","djsrvIjTwP","MmKGJprNT6","Z4I1voGu6x","2ZHdkQYxC0","uvf7AZ4I1v","ksJby0PktI","No0QbRACuj",
+"iB08lFxX9q","QWxoT16lHc","JKWYR2DREs","FGzgpjS1aj","cmXIXIRh48","JKWYRgIYvE","5ZaEzoGu6x","7fKYU0BmCy","UlU3MiB08l","QWxoTLbRTH",
+"TCgPpWmadA","AkKTkazIWp","faHirtl72W","uLtKsjSjS3","W3VFHjfREu","yluBxoQ87r","CdyBVrhl0J","ECMvUfFDrJ","lpF6WoQ87r","LewvMRpBQm",
+"2DREsqQxHP","JXljWv2eC3","ZzJHW9y4lw","Cp3mZJJs5m","l83UdaDGtS","0Wr5y5Drn0","xXTI4CK5W7","2Nslmxciqp","S77LH45cIH","4QMc9EOE1o",
+"a00b5RBhp0","F6PT2fcwDa","djsrv5ZaEz","M3zXLHzZT8","QClRLMmsIo","cL0aEVNCPd","ciuWzo8Uyd","uAWyp1j5L8","6AFT0m4bxU","zz4ZUBpYhV",
+"WaWsv4QMc9","tjQxsFhtgl","azIWp7fKYU","Q6LixiB08l","ThjNnSWfou","Z4I1vRACuj","EOE1oa00b5","7Ow5Cs93Ml","v2eC3rhl0J","VBjhzPYBf4",
+"2Nslm6q6L9","nlaByX6Pin","WMiS34W0Tl","Kr8ysCfgr3","StlDJVjCZq","5ZaEz0BmCy","qUJMdKZamH","MojnPKsjRK","Chuy38xEKz","t98iWv2eC3",
+"lm0pDsoy9t","2Nslml83Ud","Cfgr3jSjS3","i7WMQO3iyQ","3weIFJkzUn","F6PT24dEz6","2TRI79iGoT","7fsYMnFqik","24ARF2Yz7E","gf8rIsqVrf",
+"55rfBOz8yZ","Ul4a1BFkb8","POUYS0YAGH","QClRLn1pmO","Cfgr3tAOsr","2hEEU580YD","dmoS7EoToP","SbRYyciuWz","ni2v1JkzUn","FhtgljS1aj",
+"fqypynnP8o","AgJHQb29RJ","a00b5GXdoH","UlU3MfmIK1","TXQ0ZI7p2a","6q6L9uTacx","IBe8kPb1pa","rKDLJBCxeC","2Yz7En1pmO","d7vjMP6bcg",
+"NAFuwFnPFB","FwEJzpmeCd","U3yw5IRh48","OUqFMfaHir","8TxD78TxD7","NAFuwIKxdL","rhl0JG1RhS","4dEz6x3LDe","pmeCdiwzGk","JJs5mgdQsS",
+"pvgjSlH1kt","SWfouDLhzM","MezSWiqv4k","piJSkgjUTu","s93MlYjB9t","taOXKFVMxo","0BmCy7hyVv","NOHszY1mC0","ogLgcGWqqX","v8yFNRkQke",
+"tjQxsFwEJz","xXTI43otm6","0h1b1LDk6f","ZUnqtBbwgA","vkCHHBbwgA","lViBvlH1kt","hSSvQDcpWB","e6e4zzQt6Q","Kr8ysZUnqt","tl72WFjHXR",
+"55rfBS2Dfu","JXljWzFgtB","Ss0ZuYjB9t","uvf7AReKEW","zqH0WjSjS3","jiVBP9GXkX","1LB1Lhe9IA","K4GS8SWfou","lsQGo2Nslm","2ZHdkXyPZN",
+"zQt6QcmXIX","vLsmSYh1hF","yvOMIqUJMd","8TxD7Yw2oU","EoToPtaOXK","rhl0JBFkb8","8TxD7pv0i7","pmeCdRpBQm","azIWpBGaQY","Pb1payluBx",
+"wDajXiqv4k","NhXdu16lHc","L7cGci7WMQ","cQOnvgIYvE","UlU3M4W0Tl","NcICABbwgA","zqH0WZ4I1v","v8yFNTwano","fmIK1Uvlv4","s4786jiVBP",
+"SmGzvguMb8","FNYIMgtCA5","FGzgpHzZT8","8RCUARACuj","Z4I1vhe9IA","pvgjSIBe8k","5ZaEzlViBv","DG4sTnlaBy","okgRiUlU3M","iB08lnFqik",
+"POUYSuZPqg","uN6r30ao3l","k85AeUlU3M","nnP8oVNCPd","hE1Ql5Drn0","uupzkhe9IA","jS1aj5IhmG","lkMUAd7vjM","zY1GYWaim6","X6Pins4786",
+"a00b5CqqaD","gdQsSPb1pa","lkMUAtlILt","NhXduiKqhr","AmdQd45cIH","D6rByrKDLJ","piJSkuoStw","djsrv5IhmG","SmGzvpv0i7","In3NSFNYIM",
+"dmoS7MojnP","F6PT2Gv3Fq","9y4lwLDk6f","n1pmOQChxs","zz4ZUfqypy","JJs5mxXTI4","5iGN5WaWsv","DcpWBmz8gx","GWqqXdhSuH","VBjhzXyPZN",
+"gtCA5XyPZN","MezSWd7vjM","AIYUub29RJ","K20wKokgRi","nFqikReKEW","48cHLLbRTH","EoToPKsjRK","jtn0XhE1Ql","ZzJHWt98iW","DQimp2TRI7",
+"tlILtHlUbF","iwzGksuY4x","RBhp0tlILt","FLsphsx5Gl","64s8N5ZaEz","JRJQB45cIH","rKDLJiwzGk","M3zXLsuY4x","64s8Nt98iW","0KyfsO3iyQ",
+"O3iyQIKxdL","5nmWvqQxHP","l83UdNOHsz","0BmCyX6Pin","faHirHlUbF","ThjNnXflUq","HzZT8FNYIM","0KyfsSWfou","AOgEeix74r","JRJQBfFDrJ",
+"1j5L8faHir","x3LDeHlUbF","i7WMQzHF1q","QYxC0Mkgy8","OUqFMJKWYR","hUTw7faHir","RxrsmVjCZq","uTacx7fsYM","IBe8kQYxC0","hYBCKgdQsS",
+"cQOnvjtn0X","16lHcUl4a1","QbxXcEdBKc","StlDJRxrsm","pv0i7dhSuH","F6PT2XyPZN","KASQ83otm6","kZANmjeskS","SmGzvtlILt","xXTI4uN6r3",
+"pmeCd0h1b1","xXTI4SbRYy","S77LH8hJdt","Kr8ys4W0Tl","YjB9tZv7z0","oGu6x580YD","d85a9iwzGk","OUqFM2DREs","No0QbYw2oU","DG4sTnFqik",
+"YOfrYjiVBP","VNCPdlweGy","1j5L8VBjhz","RpBQmYOfrY","Z4I1vD6rBy","ECMvUzbIYY","CNHmvOxWIH","Yf2EcPOUYS","kB5nPFjHXR","aDGtS24ARF",
+"8cVD3yvOMI","qaofN618Di","ZzJHW48cHL","pFrrla00b5","QYxC0jiVBP","aL6AJjS1aj","fLNg8Gv3Fq","WreyPuJScX","fmIK1O3iyQ","BCxeChUTw7",
+"JJs5mhe9IA","ydG8UJKWYR","Uvlv47fKYU","dQ5860BmCy","xciqp48cHL","XyPZNdpe1v","BGaQYQWxoT","pWiOsyluBx","tlILtW7cTs","mz8gxfFDrJ",
+"CxVEfjtn0X","TXQ0ZBCxeC","No0QbAIYUu","hSSvQRmDcr","AgJHQo8Uyd","aez9yCqqaD","W7cTsCp3mZ","ZuDtDjiVBP","ru4UGaL6AJ","tl72WBpYhV",
+"gtCA5RBhp0","1LB1L7ku1p","faHirS77LH","RpBQmVIlwP","VBjhzCdyBV","0PktIOz8yZ","jfREuRxrsm","uLtKsn8pJ9","45cIHYw2oU","hUTw75ZaEz",
+"aDGtSFjHXR","3weIF7lUXZ","oVQp6lm0pD","5Drn02DREs","BGaQYTCgPp","y94nwRkQke","hYBCKY1mC0","Yh1hF4dEz6","B3qemGXdoH","uAWypcQOnv",
+"gf8rICxVEf","S77LHSs0Zu","CIShGKASQ8","GXdoHuPX7G","jSjS3m4bxU","OUYuF6q6L9","9GXkXYf2Ec","oGu6xCdyBV","yEfy9MaJQs","RzaZAK20wK",
+"24ARFgIYvE","0h1b1Cp3mZ","OHaBzKsjRK","wDajXEOE1o","o8Uyd3weIF","Nxx9VIKxdL","ZUnqttlILt","lkMUAWaim6","GWqqXYOfrY","s7MxkRmDcr",
+"D6rBycQOnv","WPmlxlj07Q","zY1GYsoy9t","uQIcz0MR5X","cShY28FmFH","M6qcGtjQxs","uvf7AQworu","zbIYYjfREu","5ZaEz1j5L8","euZA5hSSvQ",
+"zqH0Wxciqp","uupzkVLTy6","MGlTFt98iW","djsrv6AFT0","8xEKzAXpwE","lpF6WiB08l","7X3uypvgjS","hE1QlEOE1o","3weIFCfgr3","taOXKXflUq",
+"WaWsvP6bcg","M6qcGVprf2","CK5W7Yf2Ec","n8pJ9uPX7G","6AFT0DLhzM","GWqqXtuDyS","lm0pD29QAz","d7vjML7cGc","dhSuHI7p2a","QChxsyvOMI",
+"No0Qb45cIH","W3VFHyluBx","pAhR1jfREu","EoToPCp3mZ","1v5hHJKWYR","FFDuivLsmS","IRh48JIqXi","QClRLNOHsz","zFgtBuTacx","pvgjSXyPZN",
+"pWiOsh1zcH","K4GS8faHir","1v5hHpmeCd","DQimp6q6L9","FVMxoLDk6f","piJSk0Kyfs","i7WMQCxVEf","azIWpaez9y","JIqXiVjCZq","cL0aEjeskS",
+"yToGWqaofN","I7p2aW7cTs","7ku1pPOUYS","uupzkfcwDa","UmaEvzz4ZU","jSjS3fmIK1","lsQGonFqik","hSSvQfLNg8","uupzkDLhzM","AXpwElpF6W",
+"soy9tQChxs","zHF1qv2eC3","ZhwG1D6rBy","oGu6xFnPFB","iB08llm0pD","v8yFN5Mg9r","oVQp629QAz","FNYIMFxX9q","s7MxkAkKTk","tjQxshE1Ql",
+"HzZT8b29RJ","zz4ZUMezSW","hUTw7gIYvE","L7cGcMmKGJ","uvf7A0h1b1","Yf2EcRmDcr","s93Mla00b5","tuDySuAWyp","cmXIXKr8ys","ksJbyuAWyp",
+"CxVEfatef2","QChxsgtCA5","lH1ktdhSuH","cShY2Pb1pa","nFqikFPfSE","8RCUAhe9IA","s93MlCp3mZ","1LB1L0YAGH","FGzgpAOgEe","64s8NsuY4x",
+"zFgtBU3yw5","Q6hMCb29RJ","6AFT0b29RJ","IKxdLTwano","uAWypokgRi","yvOMI7X3uy","HP433jS1aj","4QMc9nlaBy","hi5X7L7cGc","yvOMIAkKTk",
+"uLtKssqVrf","sx5GlkB5nP","9y4lwXflUq","RACujSmGzv","4W0TlBpYhV","o8UydzHF1q","RsQUqa00b5","580YDhSSvQ","FcWrWbgJAz","5VZjSprNT6",
+"qUJMdvkCHH","Dz1R3brhlQ","fFDrJlXFOB","CIShGQClRL","fFDrJokgRi","NcICAgIYvE","5nmWvkB5nP","5ZaEzSWfou","LewvMlj07Q","gIYvEXyPZN",
+"VBjhzJ2mQi","F6PT2cShY2","fcJOySs0Zu","qQxHPSbRYy","QbxXchi5X7","64s8N1j5L8","ECMvUuN6r3","J2mQi0h1b1","8RCUA4QMc9","SWfouJ2mQi",
+"Yh1hFFLsph","gjUTutuDyS","AmdQdvkCHH","55rfB5drc6","MojnPWaWsv","pAhR1fcwDa","55rfB1j5L8","BCxeCjSjS3","MezSWdmoS7","WaWsv0MR5X",
+"8RCUA7fKYU","OxWIHCxVEf","tlILtYjB9t","MGlTFbZLvS","2DREsv2eC3","WDVWJy94nw","ksJby9rlg9","07n1c64s8N","WmadAhYBCK","Nxx9VCNHmv",
+"QYxC0FGzgp","tlILt7X3uy","prNT6AIYUu","3weIFOUqFM","0KyfsBCxeC","pT8wulCMxy","0MR5Xa00b5","3weIF07n1c","580YDAmdQd","yvOMIazIWp",
+"16lHcAgJHQ","M6qcGZ4I1v","GWqqXFNYIM","xReec48cHL","xReec64s8N","14FLRjiVBP","FPfSEB3qem","FcWrW16lHc","OxWIHxXTI4","YjB9tRBhp0",
+"lH1ktaL6AJ","v2eC3POUYS","vkCHHjfREu","2Nslmrz7Ut","LbRTHIRh48","ZUnqto8Uyd","WaWsvguMb8","tjQxsfFDrJ","1v5hHuoStw","Qworuk85Ae",
+"WPmlxY1mC0","lViBvQssNC","1j5L8oGu6x","uPX7GvkCHH","45cIHGSQwj","d85a97X3uy","m4bxU07n1c","fFDrJX6Pin","CNHmvprNT6","AOgEeSWfou",
+"M3zXLjSjS3","k85AeU3yw5","AIYUuFnPFB","atef2t98iW","IBe8k64s8N","iwzGkFGzgp","9GXkXcmXIX","Gv3Fqix74r","1LB1LzqH0W","iwzGkxReec",
+"uTacxmX2GE","ogLgcTXQ0Z","MGlTFpiJSk","MmsIoMK07Y","lj07QXflUq","0h1b1Twano","EdBKczbIYY","7fsYMvOqCE","QClRLuZPqg","oVQp6Cfgr3",
+"hi5X7Z4I1v","QssNCYOfrY","L7cGcni2v1","EOE1olkMUA","JKWYRydG8U","lsQGolpF6W","qUJMdS2Dfu","QYxC0Uvlv4","xXTI42Yz7E","aL6AJuoStw",
+"QYxC01v5hH","IRh48VLTy6","i3pyd7lUXZ","a00b5Gv3Fq","zY1GYIKxdL","580YDCNHmv","iB08ls93Ml","nnP8ooVQp6","ThjNnkZANm","SWfouazIWp",
+"ogLgc5nmWv","rKDLJBbwgA","Ta8f6YjB9t","pvgjSbgJAz","prNT6FPfSE","fcJOyv8yFN","0BmCyd85a9","WPmlxS77LH","8cVD3VjCZq","NAFuwZhwG1",
+"IBe8kfcJOy","DcpWB9XyT9","QYxC0t98iW","X6PinAIYUu","KZamHcmXIX","In3NSuLtKs","aDGtSpmeCd","EoToPzY1GY","h1zcHuLtKs","Twano7fKYU",
+"JkzUnjSjS3","okgRiqQxHP","GrDg7Zv7z0","Oz8yZBbwgA","okgRiyofH3","QworuyToGW","nFqikMGlTF","uAWyp7fsYM","1v5hH8U2nU","SbRYyQYxC0",
+"yvOMIUmaEv","yEfy9NcICA","SbRYyOUqFM","uPX7GoQ87r","ZJTXHtAOsr","vLsmSCdyBV","No0QbMaJQs","QYxC0RsQUq","lViBvjtn0X","FwEJzsx5Gl",
+"EdBKc2Nslm","cShY2VNCPd","0Kyfs2DREs","D6rBy7hyVv","faHirJIqXi","9y4lwSWfou","zqH0WWaim6","9GXkX2Nslm","lH1ktlH1kt","guMb8Ta8f6",
+"GSQwjBCxeC","580YD9y4lw","kZANmFFDui","FhtglMezSW","QssNCVLTy6","KASQ8HfyNQ","ECMvUt98iW","ru4UGUvlv4","t98iWdpe1v","9iGoTMojnP",
+"fLNg8QWxoT","dpe1vUl4a1","MmKGJoVQp6","580YDY1mC0","RmDcrI7p2a","fcJOyhE1Ql","fqypyrKDLJ","Z4I1vOUYuF","RmDcr7X3uy","pv0i7GSQwj",
+"ksJbyuZPqg","1j5L8JRJQB","DLhzM5Namm","e6e4zECMvU","BGaQYXflUq","2Yz7EiKqhr","EOE1orhl0J","fcwDaVNCPd","zbIYYguMb8","8cVD3h1zcH",
+"BpYhVb29RJ","tAOsriqv4k","k85AeJ2mQi","ZzJHW8U2nU","JkzUngdQsS","K4GS8aL6AJ","OxWIHF6PT2","07n1cd7vjM","pAhR129QAz","EdBKc8xEKz",
+"CNHmvQworu","VjCZq2ZHdk","hSSvQ1j5L8","FGzgpFcWrW","M3zXLMmKGJ","Ss0ZuKZamH","CK5W7hYBCK","gf8rI0Wr5y","d7vjMQClRL","Oz8yZ7ku1p",
+"0MR5XgIYvE","b29RJFVMxo","rhl0JSWfou","7lUXZQClRL","VIlwPpv0i7","dpe1vcQOnv","hE1QlfmIK1","GXdoHt59lR","HlUbFcmXIX","BbwgAJXljW",
+"jfREupAhR1","pmeCdpWiOs","kB5nPVerEA","Dz1R3uvf7A","8cVD3fmIK1","iB08lQ6hMC","lH1ktqUJMd","o8UydhUTw7","i7WMQi3pyd","suY4xnnP8o",
+"RBhp0jeskS","pWiOseuZA5","qUJMdCdyBV","o8Uyduvf7A","aez9yOz8yZ","MojnP7hyVv","fLNg8xXTI4","FcWrWRxrsm","iwzGk2DREs","fcwDakB5nP",
+"cmXIXkB5nP","zz4ZUCqqaD","XyPZN0PktI","cShY2faHir","tlILtBpYhV","pmeCdW3VFH","n1pmOnFqik","AXpwEhYBCK","y94nwHfyNQ","gIYvEksJby",
+"HlUbFS2Dfu","yluBxOHaBz","2DREs9GXkX","IKxdLh1zcH","bgJAzlViBv","FVMxoLbRTH","nnP8oFhtgl","7fKYUlj07Q","fqypyjS1aj","CxVEfjSjS3",
+"uLtKsUlU3M","8FmFHpWiOs","ZJTXHjS1aj","Yh1hFqQxHP","AgJHQokgRi","lXFOBuupzk","jS1aj0ao3l","0Wr5ypAhR1","RBhp0ru4UG","XflUqokgRi",
+"n1pmOD6rBy","HzZT8y94nw","fLNg8EoToP","CqqaDAkKTk","Uvlv4OxWIH","zHF1q4W0Tl","lsQGo8RCUA","iB08l9eoRc","G1RhSS77LH","lsQGoOUYuF",
+"BbwgAcShY2","3weIFi7WMQ","yofH3vOqCE","n8pJ9AXpwE","KASQ8EdBKc","MmsIoMm8si","uJScXqUJMd","48cHL55rfB","HRxd8FGzgp","uZPqgI7p2a",
+"mz8gxatef2","2DREsbgJAz","guMb848cHL","IBe8kJIqXi","i3pyd9iGoT","FPfSECxVEf","kZANmMezSW","Mkgy8Y1mC0","sx5GlF6PT2","jfREuo8Uyd",
+"s4786ZzJHW","cShY2k85Ae","fLNg85Drn0","BpYhV618Di","n8pJ9AkKTk","zHF1qJkzUn","pmeCdRmDcr","mz8gxlsQGo","jiVBPKASQ8","VNCPdulk41",
+"lXFOBFcWrW","XyPZNo8Uyd","gtCA5K4GS8","L7cGc8FmFH","y94nwEoToP","GrDg79GXkX","Mm8siy94nw","KASQ8NOHsz","AOgEeVprf2","MmsIoLewvM",
+"ECMvUFGzgp","1v5hHGv3Fq","k85AeIBe8k","K20wKpAhR1","jSjS3guMb8","L7cGchi5X7","KZamHfqypy","LewvMStlDJ","G1RhS9iGoT","azIWp9y4lw",
+"d7vjMaez9y","gjUTut59lR","0MR5XyEfy9","ZuDtDC2Irc","5Drn05IhmG","tl72W7Ow5C","O3iyQwDajX","WPmlx2hEEU","djsrvQnJ1S","dhSuHqUJMd",
+"iKqhrQssNC","rhl0JXflUq","fqypyprNT6","azIWp24ARF","lXFOB7lUXZ","iqv4kAgJHQ","7ku1pk85Ae","AXpwEqUJMd","gjUTu14FLR","zHF1qlsQGo",
+"fLNg8yEfy9","i3pydt98iW","zz4ZUEOE1o","zbIYYNhXdu","OHaBzgf8rI","vLsmSXyPZN","7X3uypAhR1","n1pmOChuy3","atef2D6rBy","jeskSdjsrv",
+"zY1GYQworu","QssNCuQIcz","RzaZAIBe8k","azIWpiB08l","MGlTF9eoRc","taOXKQYxC0","5drc624ARF","YjB9tv2eC3","blLA9W3VFH","MmsIotAOsr",
+"pmeCdaFFss","8xEKzjiVBP","EoToPZJTXH","AmdQdB3qem","gdQsSAIYUu","Chuy37ku1p","euZA5F6PT2","m4bxUsoy9t","618DiaDGtS","FnPFBGv3Fq",
+"KASQ8soy9t","ECMvUXyPZN","Ss0ZuTXQ0Z","hE1QlRmDcr","1v5hHtl72W","Y1mC0CIShG","MmsIovLsmS","ReKEWdQ586","No0Qb1v5hH","jiVBPVBjhz",
+"DLhzMQ6Lix","WaWsvhi5X7","OUYuFGv3Fq","MmsIopiJSk","ru4UGbgJAz","zFgtBG1RhS","D6rBy5IhmG","WaWsvtvdkD","7fsYMaDGtS","PYBf4FVMxo",
+"i7WMQLbRTH","uupzkRmDcr","3otm68TxD7","NcICAkB5nP","FVMxoSjskQ","IKxdLFnPFB","07n1cBGaQY","pvgjSgIYvE","JXljWKASQ8","IjTwPKr8ys",
+"16lHcxciqp","zFgtB4QMc9","gjUTuVLTy6","sx5Gl07n1c","EOE1oOz8yZ","rhl0JNcICA","ydG8UZuDtD","JkzUnQWxoT","7Ow5ClCMxy","fqypyokgRi",
+"Mkgy8GWqqX","uZPqgSjskQ","J2mQicmXIX","ZUnqtOz8yZ","5IhmGFGzgp","yToGW5drc6","uvf7A3weIF","Oz8yZiqv4k","C2IrcpWiOs","GrDg7iwzGk",
+"ZJTXH4QMc9","Gv3FqOUYuF","ydG8UMojnP","9rlg9a00b5","Vprf2xciqp","8TxD7FGzgp","zHF1qAOgEe","euZA5cmXIX","Ul4a1MojnP","oGu6xxXTI4",
+"zHF1q8hJdt","pT8wuEdBKc","cQOnv48cHL","uAWypjtn0X","h1zcHWaim6","0Wr5yUvlv4","0MR5XQClRL","hE1Qlv2eC3","suY4xcQOnv","F6PT2pvgjS",
+"t98iWIjTwP","IjTwPGv3Fq","FNYIMWMiS3","JkzUnoGu6x","i3pydNcICA","WMiS3uN6r3","s7MxktvdkD","EOE1opmeCd","BbwgAFxX9q","s4786BpYhV",
+"2DREsPOUYS","QbxXcK20wK","EOE1oPYBf4","ogLgcKsjRK","MK07YTwano","FxX9qjzUqR","580YDzz4ZU","e6e4zs4786","DQimpQWxoT","580YD5Namm",
+"CqqaDQChxs","0ao3lQYxC0","k85Aelm0pD","tAOsrDz1R3","Ss0ZuGrDg7","jiVBP580YD","K20wKdQ586","lsQGotlILt","lCMxyHzZT8","aFFssd7vjM",
+"xReec2Nslm","sqVrfUvlv4","JXljWStlDJ","580YDVerEA","l83UdMK07Y","gf8rIaFFss","euZA52ZHdk","v2eC3WMiS3","RsQUqYf2Ec","LDk6ffcwDa",
+"ZhwG1MezSW","W3VFHs93Ml","4QMc9d85a9","WreyPmz8gx","ThjNn9eoRc","FFDuiydG8U","QWxoTmX2GE","1v5hHECMvU","QYxC0jtn0X","5ZaEz3otm6",
+"IRh48RkQke","FnPFB0PktI","QnJ1SG1RhS","mz8gxcL0aE","4QMc9FVMxo","BbwgALDk6f","Yh1hFjfREu","euZA5XflUq","JkzUngf8rI","pFrrluJScX",
+"48cHLprNT6","5Drn01v5hH","bgJAzZUnqt","MaJQsCxVEf","CdyBVlViBv","e6e4zNAFuw","tAOsrCNHmv","QssNCMaJQs","VerEANAFuw","5Drn0hi5X7",
+"lweGy0ao3l","uLtKs64s8N","MezSWzz4ZU","WaWsvFwEJz","1LB1LTXQ0Z","Y1mC08RCUA","TXQ0ZtlILt","cmXIXuLtKs","yluBxVIlwP","9iGoTLewvM",
+"Dz1R345cIH","AXpwEQ6hMC","ECMvUtAOsr","jSjS3AIYUu","gjUTuAmdQd","WreyPMojnP","CdyBVGWqqX","Nxx9VWDVWJ","S2Dfu8RCUA","2DREsU3yw5",
+"WreyPDQimp","dpe1v7hyVv","he9IAoVQp6","55rfBbgJAz","Uvlv4ZzJHW","iB08lnnP8o","DG4sTs7Mxk","gdQsSUvlv4","MmKGJRmDcr","uLtKsYOfrY",
+"tjQxs48cHL","fqypyyluBx","GWqqXKr8ys","9XyT9suY4x","9rlg9VNCPd","aDGtS9GXkX","7Ow5Cs4786","RkQkeECMvU","v1HlnjiVBP","HP433b29RJ",
+"BGaQYlj07Q","pv0i77X3uy","gtCA5MGlTF","AgJHQJRJQB","HfyNQQbxXc","P6bcgVjCZq","FwEJzfFDrJ","euZA5hUTw7","MmsIo7Ow5C","rKDLJOz8yZ",
+"9rlg9uTacx","soy9tzHF1q","uTacxfFDrJ","NcICAfcwDa","jzUqRiwzGk","ZUnqtYh1hF","QWxoTnFqik","IRh48lsQGo","kB5nPvLsmS","qQxHP6AFT0",
+"RACujXflUq","6q6L9PYBf4","jfREuU3yw5","AmdQdtAOsr","suY4xfFDrJ","WreyPpFrrl","Cfgr30YAGH","2Nslm8U2nU","WreyP8xEKz","UmaEvD6rBy",
+"gf8rIMaJQs","MK07YAkKTk","okgRifcJOy","9rlg9piJSk","qaofNiKqhr","9iGoTPb1pa","t98iWXflUq","nlaByFwEJz","sqVrf4W0Tl","lsQGoblLA9",
+"MmKGJjeskS","14FLRY1mC0","HlUbFMmsIo","e6e4zJXljW","FPfSEtAOsr","fqypyMmsIo","kB5nPUvlv4","pvgjSNxx9V","BGaQYReKEW","SWfoutl72W",
+"RpBQmoVQp6","zqH0WogLgc","lpF6W7lUXZ","45cIH2TRI7","ulk41fcJOy","djsrvM6qcG","FNYIMhe9IA","sx5GlQChxs","IBe8kBCxeC","n8pJ9ksJby",
+"HfyNQMmKGJ","t59lR7X3uy","6q6L9KZamH","wDajXydG8U","lViBviB08l","EOE1oZuDtD","dhSuHJIqXi","m4bxUYjB9t","uZPqgQssNC","Ta8f6jeskS",
+"oGu6xlsQGo","618Did85a9","Vprf2P6bcg","TwanoyofH3","piJSkGSQwj","1LB1LuJScX","ogLgcJJs5m","48cHLBGaQY","EdBKcdjsrv","a00b5tvdkD",
+"pWiOsHRxd8","zY1GYX6Pin","Ss0ZuwiHrZ","m4bxUhe9IA","VBjhz5iGN5","lkMUADz1R3","zQt6QksJby","KASQ8CIShG","GWqqXQworu","Z4I1vRsQUq",
+"MmKGJ0ao3l","IKxdLHlUbF","dpe1v580YD","9XyT9ZJTXH","pWiOsMmKGJ","zQt6QtuDyS","cQOnvFhtgl","BpYhVIKxdL","Ta8f6MmsIo","jSjS3POUYS",
+"BCxeCFLsph","K20wKuupzk","vOqCEdpe1v","yofH3U3yw5","Vprf2fLNg8","h1zcHRsQUq","0BmCyDcpWB","NcICAHfyNQ","I7p2a0h1b1","F6PT2SmGzv",
+"5NammokgRi","fLNg8RBhp0","5drc6WDVWJ","618Di8xEKz","YjB9tyEfy9","GWqqXhi5X7","24ARFKr8ys","euZA5ThjNn","lH1ktJXljW","x3LDe7fsYM",
+"JIqXiCK5W7","SbRYyX6Pin","pAhR16AFT0","hSSvQYOfrY","jtn0XNcICA","HzZT8faHir","qQxHPtAOsr","5iGN5tuDyS","ix74rzz4ZU","AkKTkhi5X7",
+"sx5GlUmaEv","8xEKzFGzgp","OHaBzcShY2","QnJ1SIBe8k","zHF1quN6r3","8xEKzlsQGo","pWiOsmX2GE","RkQkeoQ87r","W7cTsAIYUu","Yw2oUh1zcH",
+"FnPFB0Wr5y","Ta8f6oQ87r","BCxeCtl72W","0Wr5y2ZHdk","fFDrJMezSW","lsQGoEOE1o","BbwgAZv7z0","0Kyfslj07Q","EoToPgf8rI","YOfrYlj07Q",
+"DQimpJKWYR","tAOsrfcJOy","v2eC30YAGH","RxrsmBFkb8","AgJHQ5IhmG","KsjRKUlU3M","7hyVvuTacx","B3qemoGu6x","FNYIM7lUXZ","h1zcHguMb8",
+"pFrrluZPqg","v8yFNzbIYY","YOfrYkZANm","gIYvEZJTXH","HlUbFatef2","2Yz7EsuY4x","jfREusx5Gl","ciuWzKsjRK","i7WMQciuWz","K4GS8uLtKs",
+"mX2GEwDajX","0YAGHSjskQ","pv0i75Namm","5drc6Ss0Zu","IjTwPNOHsz","lweGyIn3NS","7hyVv5iGN5","OHaBzGWqqX","ECMvUdhSuH","HfyNQ55rfB",
+"aFFssprNT6","VjCZqGWqqX","hUTw7Y1mC0","NcICAPYBf4","UlU3MhYBCK","5Namm14FLR","x3LDefLNg8","zqH0W1LB1L","mz8gxprNT6","CqqaDReKEW",
+"KZamHcQOnv","zmLYDtjQxs","SmGzvgjUTu","K4GS8VIlwP","D6rByfaHir","OUYuFZ4I1v","9y4lw8hJdt","8FmFHHRxd8","WreyPatef2","fFDrJECMvU",
+"ydG8UokgRi","t98iWQbxXc","WPmlxU3yw5","e6e4zVIlwP","CxVEfogLgc","Dz1R3t98iW","0BmCyvkCHH","4W0TlMmsIo","HzZT8n8pJ9","vkCHHtAOsr",
+"FwEJz5ZaEz","XflUqfmIK1","gtCA50YAGH","0h1b12Nslm","lCMxyfmIK1","64s8N64s8N","d7vjMt98iW","ThjNnn1pmO","4dEz6lH1kt","FPfSECNHmv",
+"S2Dfu1j5L8","FhtglHlUbF","t98iW5Drn0","bZLvS5IhmG","b29RJMmKGJ","EdBKcfqypy","MK07YWreyP","bZLvSlCMxy","07n1cBCxeC","14FLRcQOnv",
+"NOHszReKEW","NhXduru4UG","h1zcHEOE1o","iKqhr4W0Tl","7hyVvW3VFH","RzaZARACuj","0h1b1zz4ZU","azIWplkMUA","iB08lNhXdu","Uvlv4XflUq",
+"OUqFMIjTwP","atef2uTacx","dpe1vfLNg8","zY1GYpv0i7","LbRTH0Kyfs","FhtglguMb8","TXQ0Z3otm6","7hyVvNAFuw","t98iW48cHL","blLA9ru4UG",
+"ThjNnQ6hMC","tuDySFVMxo","Z4I1vvOqCE","piJSk3otm6","QnJ1SM3zXL","sqVrfFnPFB","PYBf4sqVrf","8xEKzHfyNQ","d7vjMni2v1","wiHrZWreyP",
+"YOfrYpFrrl","Mkgy8FVMxo","JRJQBMezSW","BGaQYi3pyd","xXTI48RCUA","IKxdLCp3mZ","zY1GYW7cTs","uLtKsuQIcz","brhlQuZPqg","7fKYUGWqqX",
+"t59lRjiVBP","618DiRkQke","TCgPpKr8ys","tlILt0PktI","Kr8ysru4UG","pvgjSRBhp0","WDVWJ5VZjS","Yh1hFBCxeC","9GXkXmX2GE","qUJMdkZANm",
+"B3qemECMvU","wiHrZsoy9t","GrDg7lXFOB","v1HlntAOsr","C2Irc64s8N","5Namm8hJdt","WDVWJkB5nP","uoStwazIWp","IBe8kdhSuH","EOE1oQWxoT",
+"xReecyofH3","AOgEecL0aE","tAOsrsuY4x","wiHrZfcwDa","zFgtB9rlg9","OHaBz3otm6","s93Ml5iGN5","FhtglTXQ0Z","v2eC3JXljW","iwzGkThjNn",
+"W3VFHCIShG","No0Qb0BmCy","5Drn00Kyfs","NAFuwmX2GE","vkCHHBFkb8","yofH30h1b1","xXTI445cIH","Pb1paLewvM","OUqFMs7Mxk","SbRYynFqik",
+"Yf2EcJRJQB","9XyT9uTacx","9y4lwdQ586","Ss0ZuBGaQY","sqVrf4QMc9","zmLYDCp3mZ","WmadAs4786","Ta8f6DQimp","8hJdt5iGN5","dmoS74dEz6",
+"aL6AJ9GXkX","1j5L8ThjNn","Zv7z0CqqaD","pv0i7uQIcz","pvgjSd85a9","Zv7z0ZhwG1","sx5GlNo0Qb","gIYvEWmadA","S2DfuoGu6x","AkKTkOUYuF",
+"iwzGkPOUYS","4W0TlhYBCK","TwanoMezSW","v8yFNuLtKs","yToGWfaHir","5iGN55Drn0","uupzkMaJQs","lViBvAOgEe","i3pyd2hEEU","AOgEeDQimp",
+"yEfy9gdQsS","GrDg7Fhtgl","Y1mC0OxWIH","7X3uyzmLYD","1LB1LdQ586","8TxD7lCMxy","Q6LixEdBKc","55rfBjS1aj","Y1mC0DLhzM","5NammFGzgp",
+"Uvlv4ogLgc","BpYhVtuDyS","OUYuFtAOsr","OUYuFkZANm","ulk41FNYIM","B3qemS2Dfu","iKqhrsx5Gl","lkMUAKsjRK","4W0TlJRJQB","hSSvQ48cHL",
+"KsjRK8cVD3","QnJ1SOHaBz","GXdoH5IhmG","b29RJuN6r3","oVQp6qUJMd","SbRYyYw2oU","JJs5m8U2nU","n8pJ9YOfrY","RzaZAfmIK1","16lHcksJby",
+"pT8wus7Mxk","suY4xRACuj","OUqFMVjCZq","Z4I1vFGzgp","RBhp0lweGy","NAFuwsuY4x","zz4ZUQssNC","tl72Wv8yFN","wiHrZMaJQs","tuDySCp3mZ",
+"XyPZNd7vjM","cL0aEIRh48","IjTwPni2v1","AgJHQNAFuw","1v5hH9XyT9","lCMxyJKWYR","b29RJIKxdL","Cp3mZCp3mZ","Mm8siuvf7A","gjUTunnP8o",
+"Waim60h1b1","EdBKcJIqXi","oGu6xkZANm","9GXkX1v5hH","D6rBytjQxs","JJs5muZPqg","zqH0WFLsph","45cIHM3zXL","Vprf2zFgtB","5ZaEzK4GS8",
+"zz4ZUiwzGk","24ARF45cIH","s93MlzbIYY","StlDJsuY4x","brhlQ0YAGH","FwEJz0h1b1","uLtKsZJTXH","S2DfuLDk6f","djsrv14FLR","okgRi9eoRc",
+"1j5L8fcwDa","zmLYDGrDg7","KZamH5Drn0","W7cTsFNYIM","zFgtB7X3uy","rKDLJRmDcr","VIlwPl83Ud","hSSvQsuY4x","rhl0JMm8si","VIlwPGSQwj",
+"he9IAuTacx","h1zcHZ4I1v","fcwDalsQGo","M3zXL6AFT0","kB5nPCK5W7","nFqik1v5hH","5iGN5MmsIo","2hEEURpBQm","WPmlxyvOMI","fqypyogLgc",
+"8hJdthYBCK","JRJQB4QMc9","In3NSOHaBz","zmLYD29QAz","Ss0ZuzY1GY","GrDg7IKxdL","LbRTHsoy9t","sqVrfRmDcr","azIWpAXpwE","QChxslsQGo",
+"zHF1qOUqFM","JKWYRQChxs","WaWsvOUqFM","jiVBPx3LDe","jtn0XiwzGk","fcJOy1LB1L","uvf7AtuDyS","uLtKsd85a9","ydG8UReKEW","vLsmS4W0Tl",
+"Q6hMCKZamH","vkCHHjeskS","DLhzMBGaQY","ReKEWjiVBP","NhXduyluBx","oVQp6CqqaD","RBhp06q6L9","AgJHQ4dEz6","piJSkQnJ1S","RkQkefmIK1",
+"Q6hMCQbxXc","FNYIM5Namm","FnPFBqQxHP","lH1ktG1RhS","ThjNn8FmFH","s4786RzaZA","NhXduuZPqg","Q6hMCk85Ae","CdyBVLDk6f","5Drn0QssNC",
+"vOqCEHRxd8","MezSW9rlg9","Kr8ysFxX9q","bgJAzprNT6","hYBCKzz4ZU","1LB1LpvgjS","uJScXe6e4z","QworuEoToP","gIYvES2Dfu","7fsYMM6qcG",
+"wDajXd7vjM","8xEKzsqVrf","ni2v1uJScX","v1HlnO3iyQ","48cHLS77LH","Mkgy8BCxeC","0YAGHXyPZN","5NammVIlwP","Nxx9V9XyT9","pWiOs7fsYM",
+"iwzGkgtCA5","8RCUAFnPFB","LewvMMK07Y","8TxD76q6L9","fqypyyofH3","oGu6xpmeCd","In3NS24ARF","LDk6fWPmlx","aez9yKr8ys","MmKGJM6qcG",
+"zbIYYksJby","fcwDaPYBf4","U3yw5tlILt","Ss0Zu6AFT0","FwEJzJkzUn","7X3uyuLtKs","lpF6W24ARF","JJs5myEfy9","pFrrl0h1b1","ZzJHWD6rBy",
+"d85a9lkMUA","QworuPb1pa","TCgPpTXQ0Z","9XyT91LB1L","uQIczPOUYS","Yw2oUAOgEe","zFgtBHlUbF","FjHXRVIlwP","pWiOsBCxeC","Zv7z048cHL",
+"WreyPpAhR1","dmoS7xReec","8cVD3d85a9","GSQwjwiHrZ","atef2pWiOs","WMiS3CK5W7","Q6hMCSWfou","v8yFNbgJAz","Mkgy8tAOsr","AOgEe8RCUA",
+"gf8rIXflUq","aDGtSDG4sT","suY4xM3zXL","HzZT8ZUnqt","Ta8f6MGlTF","fFDrJIKxdL","Oz8yZBCxeC","pAhR1L7cGc","CNHmviB08l","4W0TltvdkD",
+"oVQp6CxVEf","WPmlxuQIcz","NcICA2DREs","G1RhSZzJHW","aez9yZ4I1v","lkMUA45cIH","CK5W7uLtKs","8cVD3tuDyS","x3LDe0Kyfs","NOHsz2ZHdk",
+"2DREsQnJ1S","zHF1qYjB9t","WMiS3POUYS","pAhR1OHaBz","xciqpguMb8","ReKEW2ZHdk","7hyVvhi5X7","uvf7AcShY2","atef2Cfgr3","2ZHdkUmaEv",
+"Yh1hF45cIH","LewvMiB08l","14FLRni2v1","Nxx9VG1RhS","o8Uyd618Di","Q6hMCMmsIo","VNCPdZUnqt","AXpwEFLsph","0BmCypAhR1","wiHrZlweGy",
+"D6rByYjB9t","YOfrYprNT6","tl72WTXQ0Z","lViBvG1RhS","yEfy9XyPZN","RmDcruLtKs","lCMxyZzJHW","sx5GlFhtgl","Vprf2Mkgy8","5NammVprf2",
+"WMiS3vOqCE","blLA9lm0pD","Zv7z0WDVWJ","NcICAaez9y","gdQsSi3pyd","y94nwDQimp","ZJTXHfLNg8","29QAz6AFT0","djsrv4dEz6","GrDg7QWxoT",
+"blLA9yvOMI","J2mQiVBjhz","iKqhrix74r","Chuy3ix74r","RBhp0hSSvQ","618DiUlU3M","C2IrcNOHsz","vOqCE24ARF","1j5L81v5hH","pv0i7s93Ml",
+"5nmWvB3qem","HRxd8Mm8si","qQxHPksJby","7ku1pdpe1v","DcpWBFLsph","oGu6xpWiOs","JkzUnxciqp","taOXKyToGW","0YAGH0MR5X","yToGWNxx9V",
+"M3zXLnFqik","bZLvSuPX7G","zz4ZU7lUXZ","WPmlxOUqFM","7Ow5CDQimp","64s8N5iGN5","ix74rRACuj","WaWsvv8yFN","OUYuFmz8gx","gtCA5PYBf4",
+"rz7UtlkMUA","JRJQBIKxdL","0Wr5y8TxD7","Kr8ystAOsr","LDk6f0BmCy","VBjhzVLTy6","mz8gxjtn0X","bgJAzfaHir","48cHLuAWyp","fcJOyMezSW",
+"lpF6WtlILt","8xEKzatef2","W7cTsDQimp","QnJ1SWmadA","FVMxonnP8o","uLtKsKZamH","ciuWzksJby","SbRYyyToGW","sqVrfzHF1q","zmLYDt98iW",
+"45cIHzbIYY","uvf7AWmadA","jfREuM6qcG","5IhmGfcwDa","JIqXihE1Ql","QworucQOnv","KASQ8OUYuF","okgRiBbwgA","Ul4a1fmIK1","jzUqRAOgEe",
+"v2eC3J2mQi","IKxdLSbRYy","618DipFrrl","AIYUuWaim6","dhSuHvkCHH","lXFOBdjsrv","CIShGvLsmS","TXQ0ZyluBx","DQimpiB08l","Gv3FqaFFss",
+"wiHrZv2eC3","8FmFHJJs5m","JIqXiQworu","oVQp6mz8gx","gf8rIo8Uyd","uN6r32Yz7E","t98iWFjHXR","Uvlv4dhSuH","pvgjSlm0pD","1j5L8djsrv",
+"rKDLJxciqp","KASQ85drc6","ogLgcM6qcG","iwzGk0h1b1","4dEz6okgRi","zQt6QEdBKc","sx5Gl8FmFH","QWxoTOz8yZ","tlILt8cVD3","LbRTHfLNg8",
+"XflUqP6bcg","x3LDeAgJHQ","O3iyQXflUq","iKqhrpmeCd","rKDLJWMiS3","CK5W7rz7Ut","uJScXZzJHW","pWiOsGSQwj","x3LDezFgtB","QYxC0zbIYY",
+"8xEKzfLNg8","F6PT2MojnP","GWqqXAkKTk","7Ow5CmX2GE","dpe1vdjsrv","0PktIEOE1o","FNYIMNhXdu","s4786XyPZN","8hJdt7fKYU","DQimp24ARF",
+"POUYSGrDg7","POUYSzHF1q","prNT6k85Ae","lViBvWmadA","9iGoTFLsph","RACujpiJSk","v2eC31LB1L","yluBxQ6Lix","zFgtBS77LH","16lHcK20wK",
+"CIShGFLsph","oGu6xU3yw5","lCMxyfFDrJ","fmIK1PYBf4","Fhtgl7fsYM","TXQ0Zlm0pD","Rxrsm5nmWv","faHir4dEz6","P6bcgMaJQs","azIWp7hyVv",
+"kZANmjS1aj","BFkb8KZamH","lj07QAgJHQ","hE1QlYOfrY","RmDcr5Mg9r","7ku1phE1Ql","Y1mC0s4786","yofH3hUTw7","0BmCyhYBCK","kZANmFjHXR",
+"hi5X7Ta8f6","Dz1R3WmadA","s93MlThjNn","DcpWBSbRYy","cQOnv9iGoT","8RCUAZuDtD","JIqXiGSQwj","9eoRcgjUTu","qUJMdSbRYy","07n1c0ao3l",
+"fLNg88hJdt","dhSuH1LB1L","3weIF7fsYM","Nxx9VCqqaD","DG4sTVNCPd","tl72WoGu6x","YOfrYQssNC","OHaBz9y4lw","5Mg9rBGaQY","blLA9jiVBP",
+"5IhmGbrhlQ","Ul4a1atef2","cL0aEKZamH","5VZjSOUqFM","uupzkOUqFM","yEfy90ao3l","IjTwPStlDJ","MezSWZhwG1","BFkb8ogLgc","FGzgpfcJOy",
+"No0Qbs7Mxk","L7cGcS2Dfu","mz8gxOUqFM","KZamHIjTwP","uN6r3cmXIX","NAFuwcL0aE","t59lRprNT6","Nxx9VgIYvE","h1zcH14FLR","5IhmGpv0i7",
+"9eoRch1zcH","euZA529QAz","EoToP5ZaEz","AkKTkzQt6Q","QYxC00Wr5y","oVQp6BCxeC","POUYSlweGy","BbwgARmDcr","O3iyQQbxXc","0YAGHUl4a1",
+"fcJOyTXQ0Z","zqH0WF6PT2","FPfSEb29RJ","K4GS8Yw2oU","yofH324ARF","dmoS7uupzk","zY1GYB3qem","t98iWPYBf4","uN6r355rfB","SjskQciuWz",
+"Waim6FVMxo","SjskQtAOsr","64s8NCNHmv","pWiOsFwEJz","RsQUqMmKGJ","ix74rvLsmS","Nxx9VpiJSk","CxVEfI7p2a","IBe8kk85Ae","RsQUqW7cTs",
+"rKDLJWaim6","J2mQiuPX7G","HfyNQ3otm6","djsrvJIqXi","cShY2jS1aj","FPfSE8U2nU","Uvlv4oVQp6","W7cTsZ4I1v","45cIH8RCUA","KASQ8pv0i7",
+"48cHL0h1b1","yofH3DQimp","24ARFMezSW","Nxx9VVerEA","euZA5uPX7G","fFDrJrz7Ut","QYxC09iGoT","XyPZNlXFOB","LDk6f5drc6","ru4UGzHF1q",
+"k85AefFDrJ","yToGWhE1Ql","l83Ud7hyVv","lH1ktL7cGc","Kr8ysMezSW","DLhzMnFqik","yluBxSs0Zu","KASQ8DG4sT","0Wr5yUl4a1","Mm8si0Wr5y",
+"FjHXRChuy3","ECMvUxReec","ThjNnY1mC0","Ss0ZuyofH3","Cp3mZ8RCUA","hE1QlHzZT8","BbwgABGaQY","zqH0WJJs5m","AkKTkgdQsS","xReecvkCHH",
+"5Mg9rBFkb8","MaJQs9XyT9","JXljWXyPZN","OUYuFNcICA","SmGzvlm0pD","POUYSUl4a1","lm0pDRBhp0","QssNCx3LDe","AgJHQHzZT8","FxX9qLbRTH",
+"uZPqgYf2Ec","Kr8ysXflUq","P6bcgAXpwE","VerEAZv7z0","aFFssm4bxU","8U2nUZv7z0","gjUTudhSuH","fFDrJ2Yz7E","pvgjSVIlwP","JXljWBGaQY",
+"VIlwPuZPqg","gjUTuG1RhS","FGzgpZv7z0","VjCZq0Wr5y","FcWrWvOqCE","Kr8ysZ4I1v","lpF6WlCMxy","aL6AJiKqhr","bZLvSWDVWJ","faHir5Namm",
+"ni2v18cVD3","6AFT0CIShG","FnPFBVIlwP","lCMxyjS1aj","vkCHHhE1Ql","SbRYygjUTu","5ZaEzcQOnv","yofH3Gv3Fq","CxVEf7fsYM","pAhR1NcICA",
+"U3yw5jiVBP","48cHLpFrrl","suY4x9iGoT","uupzkk85Ae","7lUXZb29RJ","7X3uy580YD","MmKGJIn3NS","dpe1vYjB9t","FcWrWDQimp","FcWrWNcICA",
+"FNYIMvLsmS","5Mg9rh1zcH","xReecaL6AJ","SmGzvAIYUu","zmLYDmX2GE","djsrvx3LDe","lH1ktVIlwP","lsQGoMezSW","2TRI729QAz","SWfougtCA5",
+"CIShGGrDg7","v1HlnFVMxo","pFrrlhSSvQ","mz8gx618Di","MGlTFs7Mxk","6q6L9CNHmv","G1RhSJRJQB","WDVWJs4786","55rfBMojnP","NAFuwWaWsv",
+"uoStw8cVD3","prNT6wiHrZ","lsQGotl72W","Cp3mZqQxHP","0h1b16q6L9","i7WMQKASQ8","EdBKc0ao3l","5Namm580YD","RsQUquLtKs","ogLgcmz8gx",
+"VNCPdQClRL","d7vjMmX2GE","MezSWZ4I1v","kB5nPPb1pa","pv0i7i3pyd","7fKYUtlILt","WreyPU3yw5","fLNg8Dz1R3","5drc6JXljW","8hJdtMGlTF",
+"lXFOBIRh48","QYxC0M3zXL","yToGWrKDLJ","9y4lw5iGN5","Q6LixpT8wu","SjskQjzUqR","HlUbF7fKYU","5NammJkzUn","55rfBOUYuF","YOfrYWPmlx",
+"SWfouk85Ae","Dz1R316lHc","UlU3MlViBv","2NslmQworu","lweGy9rlg9","0ao3lfmIK1","Cp3mZbZLvS","x3LDefFDrJ","AmdQdlj07Q","uZPqgfqypy",
+"8hJdtCxVEf","uZPqgSmGzv","MmsIoVBjhz","45cIH2DREs","MK07Y7fsYM","s7Mxkd7vjM","uPX7GCxVEf","SWfou2TRI7","PYBf4he9IA","DLhzMNo0Qb",
+"WmadAix74r","s7Mxk0Wr5y","CK5W7prNT6","lweGytAOsr","lCMxypmeCd","lCMxyTCgPp","aFFssIn3NS","WreyPiqv4k","wDajXGWqqX","aL6AJ7fsYM",
+"ydG8Uxciqp","RmDcrYjB9t","7fKYU2DREs","EOE1ookgRi","55rfBO3iyQ","DLhzMX6Pin","cmXIXDG4sT","2NslmXflUq","kZANmYw2oU","0h1b1yvOMI",
+"5Namm5VZjS","h1zcHW3VFH","lXFOB4W0Tl","CIShGyEfy9","Z4I1v7lUXZ","Z4I1vJXljW","DG4sTyofH3","hSSvQo8Uyd","QWxoTkB5nP","o8Uydo8Uyd",
+"Nxx9Vs7Mxk","hi5X7FLsph","y94nwyvOMI","GSQwjJIqXi","guMb8lj07Q","7ku1pLbRTH","oQ87rTXQ0Z","FVMxo2ZHdk","gIYvEThjNn","xReecO3iyQ",
+"BbwgATa8f6","2ZHdkWmadA","5ZaEzaFFss","0KyfsyvOMI","S2DfuIjTwP","LewvM0YAGH","ThjNnuJScX","IKxdLyEfy9","EdBKcWaim6","8TxD7nFqik",
+"cmXIXAkKTk","xXTI48FmFH","FcWrW580YD","QbxXcsuY4x","yEfy9ksJby","NhXdu4W0Tl","lpF6WUvlv4","s4786zFgtB","5VZjSlCMxy","8hJdt7Ow5C",
+"FwEJzYjB9t","Rxrsmv8yFN","IKxdLReKEW","dhSuHOUqFM","ulk41BbwgA","jfREua00b5","XyPZNAOgEe","ZzJHWHzZT8","s4786OUqFM","P6bcgdhSuH",
+"4QMc9qaofN","KsjRKBGaQY","MGlTFtuDyS","CK5W7MojnP","uN6r35iGN5","I7p2aUl4a1","gdQsSG1RhS","QWxoTOUYuF","VBjhz6AFT0","Dz1R3ReKEW",
+"7fKYU2Nslm","zmLYDKZamH","VjCZqUmaEv","2NslmbrhlQ","azIWpZzJHW","S2DfuCfgr3","0h1b1CK5W7","5IhmG1LB1L","pWiOsazIWp","2DREsZuDtD",
+"GWqqXm4bxU","Waim6QssNC","jiVBP0h1b1","LbRTHPOUYS","hi5X7pmeCd","P6bcgUlU3M","fqypyzbIYY","lH1kt7hyVv","l83UdjSjS3","qUJMdM6qcG",
+"ReKEWt98iW","OUYuFi7WMQ","ZzJHWOUYuF","CdyBV24ARF","JJs5miKqhr","aL6AJpvgjS","64s8NEdBKc","OHaBz7fKYU","brhlQMGlTF","gIYvElweGy",
+"QWxoTpT8wu","Yf2Ecpv0i7","8RCUAJ2mQi","GrDg7hi5X7","BpYhVOUqFM","CNHmv8FmFH","RpBQmD6rBy","AOgEe55rfB","WreyPfqypy","BGaQYB3qem",
+"lkMUASWfou","HzZT8JIqXi","S77LHpv0i7","WreyPlm0pD","OUqFMuQIcz","bZLvS9XyT9","d7vjMOUqFM","gjUTugf8rI","lH1ktMezSW","FnPFB8TxD7",
+"C2IrcQYxC0","ReKEWUvlv4","VLTy6RpBQm","XyPZNzmLYD","GXdoHGXdoH","RsQUqzbIYY","EOE1o16lHc","7lUXZzz4ZU","d7vjMlH1kt","Waim62Nslm",
+"o8Uydrhl0J","8xEKzHP433","jS1ajIjTwP","8xEKzFVMxo","hi5X7O3iyQ","MmsIoIjTwP","uQIczokgRi","FLsphni2v1","XyPZNCxVEf","djsrvBpYhV",
+"WmadAhE1Ql","xciqpQ6Lix","1LB1Lzz4ZU","HP4337lUXZ","FVMxovOqCE","pAhR1G1RhS","gtCA5FxX9q","pWiOs29QAz","lXFOBgdQsS","k85AepWiOs",
+"zz4ZUsoy9t","Yh1hF1j5L8","lsQGouvf7A","uZPqgrhl0J","Yf2EcpvgjS","GSQwjwDajX","C2IrctAOsr","VBjhzmX2GE","IKxdLKASQ8","dmoS7MGlTF",
+"5IhmGFwEJz","AmdQdlm0pD","qaofNGSQwj","HP433he9IA","NAFuwQbxXc","DQimpkB5nP","lsQGoGrDg7","azIWpokgRi","5VZjS6q6L9","ZJTXHSbRYy",
+"okgRiUl4a1","piJSkzY1GY","In3NSW7cTs","i7WMQs93Ml","djsrvwDajX","LDk6fCfgr3","EOE1oFjHXR","5IhmGS2Dfu","KZamHn1pmO","b29RJW3VFH",
+"Ul4a1VBjhz","K20wKSjskQ","m4bxUHlUbF","TCgPpJRJQB","ru4UG5iGN5","uPX7GlweGy","prNT6MK07Y","vLsmSuJScX","OHaBzCqqaD","2Yz7EJJs5m",
+"9XyT9gdQsS","24ARFo8Uyd","ECMvU6q6L9","i7WMQ618Di","cQOnvU3yw5","lweGy07n1c","24ARFYOfrY","OxWIHYOfrY","KsjRKAgJHQ","7lUXZTwano",
+"KZamHiqv4k","CIShGFjHXR","kB5nPrz7Ut","HP433Ul4a1","lkMUAhUTw7","sx5Glv2eC3","tuDySC2Irc","FVMxoAXpwE","okgRiydG8U","Oz8yZvkCHH",
+"Dz1R3aFFss","RxrsmkB5nP","OHaBzCp3mZ","a00b5AmdQd","gtCA5uAWyp","Gv3Fq7lUXZ","8FmFHLewvM","n1pmOMK07Y","1v5hHBCxeC","d7vjMW3VFH",
+"9eoRcfLNg8","lXFOBRpBQm","0YAGHzQt6Q","tl72Wv2eC3","Dz1R3HfyNQ","lViBvk85Ae","IBe8kB3qem","ciuWz3weIF","FxX9qThjNn","x3LDeC2Irc",
+"fFDrJVNCPd","guMb84dEz6","m4bxUlViBv","qUJMdd7vjM","uLtKsAXpwE","X6PinlCMxy","ru4UGnnP8o","9rlg9Twano","Yf2EcSbRYy","vLsmSdjsrv",
+"IBe8k8xEKz","FnPFBo8Uyd","uTacxfaHir","m4bxUi3pyd","Gv3FqIjTwP","e6e4zuPX7G","kZANmyEfy9","L7cGcpmeCd","BFkb8lkMUA","atef2RBhp0",
+"jzUqRjeskS","lCMxyyvOMI","nnP8oS77LH","X6PinWPmlx","uTacxhSSvQ","lH1ktwDajX","FLsphDz1R3","No0Qb0ao3l","JKWYRBGaQY","14FLRcL0aE",
+"Dz1R3Q6Lix","bgJAzAIYUu","jfREuYh1hF","LewvMQ6Lix","mX2GEZ4I1v","1j5L8Twano","5Mg9rQChxs","L7cGcW3VFH","CqqaDaez9y","v2eC3SbRYy",
+"MK07YokgRi","VIlwPFFDui","BCxeCP6bcg","Gv3FqksJby","29QAzNOHsz","QClRLOz8yZ","uJScXgdQsS","tlILtiB08l","RACujlCMxy","IRh4848cHL",
+"EoToPQbxXc","StlDJtaOXK","lkMUA8FmFH","IBe8k0YAGH","atef2AOgEe","piJSkgIYvE","pmeCd5drc6","PYBf4y94nw","piJSknFqik","NhXdugIYvE",
+"8U2nUqUJMd","jeskSzz4ZU","GWqqX5iGN5","Mm8siMezSW","EOE1oOHaBz","pAhR1EoToP","RkQkeVNCPd","aDGtSazIWp","RmDcrzQt6Q","WmadA3otm6",
+"lViBv5nmWv","Oz8yZAkKTk","Y1mC0DcpWB","ulk41hSSvQ","ni2v15Namm","1LB1LP6bcg","0MR5X5Namm","ZzJHWzHF1q","xXTI4gtCA5","zY1GYjiVBP",
+"fqypyNo0Qb","uJScXn8pJ9","LDk6f7fKYU","5Mg9rK4GS8","yluBxWaWsv","C2IrcDG4sT","M3zXLNAFuw","LbRTHuZPqg","uupzkokgRi","NAFuwWmadA",
+"uPX7GQbxXc","S77LH4W0Tl","7Ow5CcmXIX","KASQ8uJScX","uupzk45cIH","aL6AJfLNg8","0Wr5yMm8si","OUYuFRsQUq","ZuDtDFFDui","ydG8UJIqXi",
+"QworuCfgr3","hUTw7vLsmS","5Mg9rFhtgl","UmaEvQClRL","2Yz7EbrhlQ","pv0i7RBhp0","yEfy9ogLgc","IjTwPhE1Ql","pmeCdlXFOB","lj07QVjCZq",
+"CK5W7oGu6x","K4GS8Cp3mZ","24ARFix74r","K4GS8Zv7z0","JKWYR5Mg9r","fLNg8Q6Lix","WreyP45cIH","1v5hHzbIYY","QworuuQIcz","zbIYYpv0i7",
+"RzaZAbgJAz","TCgPpzFgtB","zz4ZUSmGzv","nnP8ookgRi","SjskQD6rBy","0Kyfsv8yFN","iwzGkgdQsS","aDGtShYBCK","CqqaDuLtKs","GSQwjbZLvS",
+"uAWyp0Kyfs","djsrv7lUXZ","K20wKmz8gx","v8yFNgtCA5","vOqCEJJs5m","o8UydzY1GY","5iGN5tvdkD","9iGoTv8yFN","ogLgcHlUbF","9eoRcEOE1o",
+"8hJdtIBe8k","lsQGo7ku1p","7hyVv7fsYM","K20wKsx5Gl","ru4UGBFkb8","qUJMdNxx9V","ru4UGDz1R3","K4GS8CNHmv","LewvMGrDg7","5Drn08cVD3",
+"gdQsSMm8si","tuDySDcpWB","i3pyduJScX","piJSkUlU3M","t59lRDLhzM","jS1ajix74r","kB5nPiqv4k","bZLvSru4UG","n8pJ9s4786","9XyT9OUqFM",
+"iwzGkStlDJ","pFrrlNo0Qb","CdyBVyluBx","hE1Ql5nmWv","JXljW3otm6","lViBvYh1hF","VBjhzeuZA5","a00b5HzZT8","AkKTkDG4sT","soy9tjeskS",
+"zFgtBNcICA","Mm8sieuZA5","JRJQB5nmWv","lXFOB6AFT0","JXljWydG8U","fcJOy6AFT0","sqVrfNxx9V","55rfBYjB9t","BbwgAa00b5","HfyNQ9iGoT",
+"tvdkDFFDui","qUJMdni2v1","HzZT85iGN5","RxrsmciuWz","L7cGcMojnP","xReec7X3uy","RzaZAHfyNQ","HP433zz4ZU","3otm6QClRL","n8pJ97fKYU",
+"5nmWv8RCUA","45cIHuZPqg","ogLgcblLA9","uupzkbZLvS","7fKYUvLsmS","ZhwG1fLNg8","zqH0WyvOMI","Dz1R3uN6r3","No0QbTa8f6","Twanouvf7A",
+"he9IAQbxXc","Kr8ysTa8f6","Waim6TCgPp","CIShG7fsYM","mz8gxNhXdu","cQOnvFcWrW","GSQwjJJs5m","Rxrsmt59lR","8FmFHoGu6x","DG4sTK4GS8",
+"9eoRcYh1hF","iqv4kBGaQY","MojnP5IhmG","wDajXpmeCd","Yf2EcyEfy9","Kr8ysmz8gx","vkCHHogLgc","djsrvb29RJ","GWqqXMkgy8","5nmWvpiJSk",
+"RzaZAXflUq","K4GS8EdBKc","xciqp1j5L8","ThjNnQssNC","zmLYDoVQp6","fLNg8pmeCd","yvOMI0Wr5y","OUqFMF6PT2","P6bcg0BmCy","x3LDeuvf7A",
+"lj07Qi3pyd","faHirEdBKc","W7cTsokgRi","Ta8f6brhlQ","5ZaEzuTacx","L7cGc64s8N","24ARFQ6hMC","BGaQYDG4sT","BpYhV0MR5X","CIShGUmaEv",
+"1j5L8FLsph","pT8wuPOUYS","wiHrZ7Ow5C","oGu6x07n1c","MK07Y7hyVv","JKWYRW7cTs","CNHmv7lUXZ","CK5W78U2nU","brhlQJRJQB","WMiS3jSjS3",
+"XyPZNQWxoT","guMb81j5L8","zQt6QOz8yZ","WMiS3Z4I1v","bZLvSZv7z0","b29RJokgRi","Ss0Zuatef2","nnP8oKASQ8","HlUbFChuy3","Yh1hFFwEJz",
+"2hEEU7hyVv","9rlg9cL0aE","M3zXLZuDtD","bgJAz07n1c","uoStwGSQwj","uoStwUlU3M","NcICApmeCd","ix74rhe9IA","Nxx9VoQ87r","FjHXRLewvM",
+"W7cTsMmKGJ","ogLgcpFrrl","zHF1qHRxd8","618DivkCHH","7fKYU7ku1p","VjCZqK20wK","DG4sTChuy3","jeskSM3zXL","StlDJAOgEe","MojnPCK5W7",
+"GWqqX5ZaEz","DQimpo8Uyd","FnPFBv1Hln","rz7UtP6bcg","pFrrleuZA5","s4786kZANm","L7cGche9IA","yEfy9618Di","uLtKsyToGW","BbwgA580YD",
+"iB08lbrhlQ","sx5Glv8yFN","PYBf4GrDg7","hi5X7JKWYR","cQOnvzQt6Q","7Ow5CpvgjS","KsjRKhYBCK","BpYhVHlUbF","Chuy3FLsph","07n1ctl72W",
+"jSjS3lsQGo","JJs5mFhtgl","MmsIoGWqqX","2DREsJKWYR","AmdQdaFFss","Mkgy8kZANm","he9IAsqVrf","8U2nUGSQwj","QworulweGy","IBe8kuTacx",
+"JRJQBB3qem","BGaQYhSSvQ","azIWpyEfy9","uvf7AzHF1q","2NslmyToGW","yToGWblLA9","n1pmOJRJQB","lsQGo2Yz7E","Pb1paRxrsm","jtn0XMaJQs",
+"TXQ0ZYf2Ec","dpe1vRkQke","ulk41QYxC0","WaWsvYw2oU","S2DfuguMb8","NOHszoVQp6","K4GS8lj07Q","jeskSrhl0J","9rlg9W3VFH","ogLgche9IA",
+"i7WMQpiJSk","NcICAzmLYD","Nxx9VnlaBy","SbRYy618Di","fcJOyix74r","OHaBzatef2","o8Uyd580YD","Pb1pavLsmS","Mkgy8hi5X7","7ku1pjeskS",
+"2Nslm1v5hH","QnJ1StuDyS","WreyPDz1R3","5ZaEzAgJHQ","sqVrfW3VFH","WmadAcShY2","gf8rIzz4ZU","mX2GEksJby","jS1ajRACuj","J2mQigjUTu",
+"fFDrJaez9y","mX2GEjzUqR","dQ586OUqFM","J2mQijtn0X","2TRI70h1b1","Vprf2bgJAz","SmGzvlCMxy","dmoS7wDajX","2Yz7EcL0aE","okgRiEoToP",
+"iKqhrRzaZA","LbRTHVNCPd","uZPqgSbRYy","IBe8kOUqFM","ciuWzQClRL","NcICAYh1hF","FVMxo5Drn0","VLTy6uAWyp","y94nwZ4I1v","4W0TlmX2GE",
+"FFDuiRzaZA","zmLYDRzaZA","VBjhzdhSuH","2hEEU2ZHdk","UmaEvVLTy6","Yh1hFQworu","ZzJHWQWxoT","2DREs0h1b1","uZPqgNhXdu","uLtKssoy9t",
+"qaofNdhSuH","gIYvE2Yz7E","VLTy6t59lR","ydG8UJJs5m","2Yz7E9iGoT","LbRTHW7cTs","G1RhS07n1c","No0QbWmadA","9rlg9aez9y","ZUnqtWMiS3",
+"vkCHHFxX9q","FNYIMrKDLJ","Yw2oUhe9IA","HRxd8OHaBz","iKqhrgtCA5","Cfgr3JKWYR","0h1b1K20wK","1v5hHZ4I1v","hSSvQkB5nP","IBe8k7ku1p",
+"5ZaEzJKWYR","jSjS3fcwDa","rKDLJGXdoH","cQOnvOUqFM","oVQp6EdBKc","soy9tx3LDe","lweGy7X3uy","DQimpx3LDe","ogLgctl72W","nFqikpmeCd",
+"Uvlv43otm6","xciqp2hEEU","VNCPdn1pmO","fqypyNOHsz","5Mg9rtaOXK","48cHLaDGtS","rKDLJ3otm6","8FmFHSWfou","tl72WlH1kt","BFkb8FwEJz",
+"POUYSCNHmv","lViBvni2v1","k85AeGv3Fq","EdBKcThjNn","gjUTuHlUbF","qQxHPAIYUu","k85AeCp3mZ","lpF6WtuDyS","tvdkDWaim6","24ARFZUnqt",
+"SbRYyQChxs","tuDySbgJAz","K4GS8BCxeC","ThjNnsqVrf","8U2nUrKDLJ","Q6LixS2Dfu","aL6AJzHF1q","uPX7GcShY2","hYBCKRxrsm","mz8gxSs0Zu",
+"tvdkDIn3NS","RACujuZPqg","HfyNQRmDcr","azIWp4W0Tl","0BmCyyofH3","YOfrY5Mg9r","CxVEfwDajX","IKxdLwDajX","fqypyix74r","WmadAGWqqX",
+"he9IAjeskS","DcpWBTa8f6","WreyPxciqp","0BmCyIBe8k","5Drn05Mg9r","JIqXiAXpwE","F6PT2ogLgc","v2eC3ZuDtD","aez9y3weIF","oVQp6brhlQ",
+"ZzJHWtvdkD","16lHc1v5hH","HfyNQ5VZjS","Y1mC0J2mQi","zqH0WuPX7G","OUYuFn8pJ9","FFDui9XyT9","X6Pin64s8N","uZPqgCfgr3","CNHmvUlU3M",
+"uvf7APYBf4","fmIK1tuDyS","jeskSfLNg8","VBjhzStlDJ","8xEKzNAFuw","uN6r32hEEU","J2mQixReec","sx5Gltl72W","JXljWhUTw7","4dEz65iGN5",
+"Twanos4786","TXQ0ZSs0Zu","jS1ajni2v1","LbRTHblLA9","IBe8knFqik","QClRLcQOnv","s7Mxk0Kyfs","x3LDeGv3Fq","aFFssDG4sT","AOgEe580YD",
+"v8yFNGrDg7","he9IAt98iW","L7cGco8Uyd","Dz1R3euZA5","v8yFN7Ow5C","0PktI618Di","4W0TlhSSvQ","vkCHHAmdQd","fcwDaF6PT2","580YD8xEKz",
+"1v5hHNAFuw","VLTy6JIqXi","aL6AJn8pJ9","4W0TlCqqaD","he9IApvgjS","iqv4kqaofN","580YDNAFuw","gjUTu2TRI7","uJScXoVQp6","oQ87rvkCHH",
+"8xEKzaFFss","hE1QlVLTy6","StlDJOUqFM","ksJby24ARF","VjCZqMmsIo","7X3uylj07Q","ulk4116lHc","zz4ZUaDGtS","lpF6WIBe8k","pvgjSZhwG1",
+"mz8gxcShY2","XyPZNqUJMd","2hEEUuoStw","RxrsmCK5W7","AkKTk0ao3l","CNHmv2ZHdk","TXQ0ZKASQ8","dpe1vIKxdL","CxVEfkZANm","UmaEvM6qcG",
+"fLNg8pvgjS","jSjS3cShY2","d85a9MaJQs","ogLgcuvf7A","hi5X74QMc9","v1HlntjQxs","jfREujiVBP","W3VFHa00b5","BpYhVCdyBV","lH1ktZJTXH",
+"9XyT9Mkgy8","zY1GYpFrrl","cShY2mz8gx","yEfy9CxVEf","U3yw5FjHXR","xReecbrhlQ","QWxoTO3iyQ","RsQUqvLsmS","iB08lzmLYD","K4GS8NOHsz",
+"3otm6MojnP","ksJbyQssNC","bZLvSLbRTH","Cfgr3euZA5","0ao3lMK07Y","VLTy65nmWv","9eoRcl83Ud","MezSW64s8N","VBjhzwDajX","FcWrWlH1kt",
+"2ZHdkmX2GE","CqqaDLDk6f","CxVEfFLsph","Fhtgl0MR5X","HP433Chuy3","azIWpI7p2a","1j5L88TxD7","Oz8yZfaHir","AkKTkOz8yZ","Q6LixprNT6",
+"BGaQYyluBx","uTacx7fKYU","y94nwIjTwP","07n1cdpe1v","DLhzMxReec","jtn0XsuY4x","AOgEe8FmFH","lj07Ql83Ud","IjTwPQnJ1S","pT8wuJIqXi",
+"Waim6VerEA","9iGoTk85Ae","hUTw7uoStw","zz4ZUrz7Ut","KsjRKF6PT2","jeskSSbRYy","QYxC04QMc9","t59lRIBe8k","gdQsSjtn0X","X6PinD6rBy",
+"v2eC3cQOnv","Pb1papFrrl","bgJAz9GXkX","M6qcGdQ586","vLsmSBFkb8","fcJOy0MR5X","aez9yxciqp","LDk6fFNYIM","BpYhVlkMUA","45cIHZzJHW",
+"5Mg9rulk41","OxWIHC2Irc","sx5GlU3yw5","7Ow5CfcJOy","GSQwjFPfSE","EdBKc2DREs","lXFOBUl4a1","8cVD3zz4ZU","YOfrYDG4sT","MmsIozQt6Q",
+"uZPqg29QAz","jS1ajY1mC0","RpBQm24ARF","7Ow5ChYBCK","pv0i7tvdkD","5iGN5sqVrf","VerEA1LB1L","pFrrl9y4lw","JKWYRCdyBV","n8pJ9gtCA5",
+"uTacxlXFOB","D6rBys4786","piJSkRkQke","TwanoYf2Ec","B3qemKsjRK","YOfrYLDk6f","U3yw5qaofN","CNHmvgdQsS","7lUXZNo0Qb","9iGoTyEfy9",
+"Kr8ysgjUTu","aL6AJMaJQs","9XyT9hUTw7","5NammZUnqt","8TxD78FmFH","jfREu7ku1p","aL6AJZhwG1","MmKGJ0h1b1","jS1ajUmaEv","ciuWzRxrsm",
+"fFDrJoQ87r","FwEJzv1Hln","MezSWFLsph","ix74r0BmCy","BCxeCYf2Ec","WMiS32hEEU","gdQsSfcJOy","i7WMQPYBf4","S2DfuG1RhS","K20wK0Kyfs",
+"cQOnv0h1b1","L7cGczz4ZU","o8UydOxWIH","GWqqXTwano","aDGtSlj07Q","uLtKsJRJQB","lsQGodQ586","1j5L8FjHXR","hE1QlVjCZq","AmdQdAIYUu",
+"GXdoHFhtgl","d7vjMSs0Zu","2hEEUjiVBP","9XyT9d7vjM","0YAGH0ao3l","PYBf4ciuWz","gjUTudmoS7","Ul4a1Oz8yZ","OUqFMYh1hF","v2eC3jiVBP",
+"HRxd8uJScX","qQxHPpv0i7","VjCZqNOHsz","NcICAhUTw7","29QAztaOXK","zQt6QCK5W7","GXdoHsqVrf","jSjS3VBjhz","t98iWyluBx","0h1b1HzZT8",
+"a00b58cVD3","mX2GEblLA9","5NammWMiS3","4QMc9lsQGo","BGaQYLewvM","mz8gxvLsmS","jiVBPru4UG","VLTy69eoRc","hYBCKEOE1o","580YDECMvU",
+"4QMc9aDGtS","jiVBPSmGzv","7fKYUDLhzM","uvf7AMmsIo","AXpwEYf2Ec","s7MxkECMvU","guMb8UmaEv","5NammDQimp","ZJTXHJXljW","aFFss2DREs",
+"djsrvCK5W7","Yw2oUNcICA","24ARFpFrrl","U3yw5MK07Y","blLA9SjskQ","Fhtgldjsrv","cQOnvAOgEe","AXpwElXFOB","lH1ktWDVWJ","OxWIHFwEJz",
+"14FLRG1RhS","hYBCKLewvM","qQxHPrz7Ut","fLNg8Zv7z0","7X3uyYh1hF","gjUTuRsQUq","gtCA516lHc","DcpWBJJs5m","VNCPdQChxs","a00b5U3yw5",
+"euZA5lpF6W","No0QbI7p2a","3otm6FwEJz","Nxx9VxXTI4","VLTy67Ow5C","uJScXQClRL","3weIF8U2nU","rKDLJHlUbF","lweGycmXIX","blLA9XyPZN",
+"tuDyS3weIF","5VZjS24ARF","uupzk1LB1L","lm0pDVBjhz","d85a9Ss0Zu","U3yw548cHL","i3pyd5drc6","ZuDtDs7Mxk","W7cTsKsjRK","kZANmguMb8",
+"FNYIMs7Mxk","AOgEeThjNn","azIWpiqv4k","ECMvUwiHrZ","fFDrJFLsph","WmadAFVMxo","GWqqXS2Dfu","HlUbFb29RJ","ThjNnjfREu","iwzGkRsQUq",
+"dpe1vs4786","24ARF9y4lw","Nxx9VuZPqg","HfyNQulk41","HlUbFaez9y","lweGyprNT6","SjskQyofH3","8TxD7lkMUA","zqH0WzQt6Q","B3qemlpF6W",
+"S77LHwDajX","GXdoH7Ow5C","yofH35Namm","qaofNWPmlx","IjTwPx3LDe","5NammcQOnv","VIlwPni2v1","HzZT8cShY2","8cVD3RBhp0","5Drn0fLNg8",
+"Q6LixCIShG","v2eC30BmCy","9XyT929QAz","OUqFMcShY2","2DREsni2v1","k85AeRsQUq","qaofNAgJHQ","1LB1LJ2mQi","yToGWatef2","AOgEeeuZA5",
+"faHirPb1pa","2ZHdkXflUq","JIqXiuQIcz","lCMxyqaofN","NcICANo0Qb","0KyfsJIqXi","O3iyQEdBKc","Yw2oUHfyNQ","AgJHQuJScX","gtCA5suY4x",
+"yToGWsqVrf","qUJMd14FLR","4QMc9wiHrZ","C2IrcFxX9q","lm0pD9y4lw","hUTw7d85a9","tvdkDK20wK","pv0i7DcpWB","kZANmMkgy8","WmadAFjHXR",
+"lkMUAksJby","fcJOyChuy3","dmoS70PktI","Q6LixVprf2","tlILtaL6AJ","iqv4klj07Q","oQ87rhe9IA","M6qcG5Drn0","mX2GEGSQwj","NAFuwNo0Qb",
+"CdyBVn1pmO","e6e4zKZamH","AOgEeJJs5m","MK07YY1mC0","nnP8oGXdoH","NcICAlweGy","JXljWfaHir","aez9yQ6Lix","hi5X78RCUA","dQ586aez9y",
+"e6e4zFxX9q","NhXduAIYUu","WreyPYh1hF","gtCA5uJScX","rz7UtQssNC","Cp3mZLbRTH","rKDLJs7Mxk","7fsYMFcWrW","L7cGcUmaEv","5IhmGs7Mxk",
+"suY4xGv3Fq","uJScXXyPZN","n8pJ90ao3l","JJs5mFNYIM","JJs5mb29RJ","XyPZN2Nslm","0KyfsZzJHW","i7WMQblLA9","FLsph4W0Tl","CdyBVHfyNQ",
+"0h1b17fKYU","aDGtSSbRYy","wDajXRmDcr","AgJHQyToGW","Yw2oUWaWsv","AIYUuwDajX","s4786a00b5","POUYSNxx9V","Uvlv4lH1kt","soy9t5VZjS",
+"SjskQkZANm","Q6LixnFqik","CIShGMmKGJ","IBe8ki7WMQ","BGaQYZv7z0","2NslmpT8wu","TwanoFNYIM","NhXdusuY4x","uJScXdpe1v","Chuy3gjUTu",
+"2DREsyluBx","GWqqXGrDg7","24ARFHRxd8","tlILtlViBv","IKxdLWaim6","dpe1vNOHsz","L7cGcMaJQs","lViBv64s8N","SWfouMGlTF","uN6r34dEz6",
+"W7cTsSmGzv","Kr8yshUTw7","Vprf2ni2v1","ogLgce6e4z","gf8rIEoToP","lXFOBBbwgA","nlaBylXFOB","AmdQdblLA9","CNHmvzbIYY","8FmFHQbxXc",
+"NOHszhUTw7","cL0aEuoStw","lsQGom4bxU","nlaByFPfSE","uN6r3fqypy","I7p2an8pJ9","pmeCdv1Hln","zmLYDni2v1","LDk6foQ87r","FjHXRMkgy8",
+"In3NS1LB1L","BCxeCIKxdL","Ta8f6tl72W","yToGWTXQ0Z","IRh48RzaZA","gIYvEQ6hMC","tl72WLbRTH","SbRYyiKqhr","S77LHi3pyd","uupzkCdyBV",
+"jS1ajThjNn","s4786AIYUu","FLsphMkgy8","0PktIQnJ1S","L7cGcOz8yZ","MezSWW3VFH","jeskSlXFOB","2DREsGv3Fq","uLtKsi7WMQ","MezSWpvgjS",
+"XflUqQ6hMC","G1RhS7fKYU","VBjhz7lUXZ","BCxeCNcICA","vLsmSSs0Zu","vkCHHpAhR1","rz7UtzmLYD","jeskS0ao3l","CdyBVsqVrf","taOXKJXljW",
+"2DREsKZamH","RsQUqZv7z0","Yf2EcvkCHH","4QMc9HlUbF","qUJMdk85Ae","7Ow5CIKxdL","fFDrJOz8yZ","faHirGSQwj","Y1mC0ZJTXH","WDVWJtAOsr",
+"DLhzMNOHsz","zmLYDYjB9t","IKxdLbrhlQ","uoStwlCMxy","RBhp0ZJTXH","In3NS2ZHdk","tAOsr1j5L8","lViBvciuWz","WMiS3Vprf2","CqqaD1v5hH",
+"t98iWGXdoH","W7cTsMaJQs","2ZHdkatef2","D6rByRsQUq","CxVEfiwzGk","8xEKz45cIH","HRxd8aFFss","MmsIon1pmO","RxrsmEOE1o","ZJTXHAXpwE",
+"ydG8U0BmCy","GWqqXuZPqg","zFgtBlj07Q","faHirtlILt","m4bxUtuDyS","618Diy94nw","IBe8klXFOB","vkCHHO3iyQ","Chuy3azIWp","AIYUu2DREs",
+"07n1c7hyVv","nFqikfLNg8","FwEJzAOgEe","wiHrZBbwgA","8cVD3bZLvS","CqqaDCxVEf","uupzkuvf7A","hUTw7FPfSE","Y1mC0WPmlx","lj07Qb29RJ",
+"aez9yU3yw5","hYBCKUl4a1","FjHXRn1pmO","pT8wuNAFuw","JKWYRYf2Ec","uTacxuN6r3","o8UydY1mC0","9rlg9lH1kt","9rlg90Wr5y","xReecBpYhV",
+"55rfBuAWyp","mX2GERBhp0","Zv7z09iGoT","StlDJ0Kyfs","tlILtx3LDe","Yh1hFaDGtS","WmadAo8Uyd","tlILtVNCPd","lweGyO3iyQ","Cfgr3EOE1o",
+"0YAGHoVQp6","2DREsn1pmO","qUJMdsuY4x","Ss0Zusx5Gl","8U2nUzmLYD","ZzJHWdjsrv","xReecjtn0X","AXpwEIKxdL","o8UydStlDJ","pT8wuaDGtS",
+"7X3uyaDGtS","WmadAdhSuH","pFrrl4dEz6","uTacxMmsIo","WmadA8RCUA","okgRi07n1c","HlUbFDz1R3","i3pyduZPqg","hYBCK2TRI7","Vprf2XyPZN",
+"zqH0WAgJHQ","YjB9tqQxHP","9GXkXpFrrl","POUYSuLtKs","L7cGcGWqqX","7lUXZhE1Ql","zmLYDzqH0W","jzUqRMkgy8","S2DfuOUqFM","WMiS3d7vjM",
+"SmGzveuZA5","nFqikEoToP","hSSvQW7cTs","ix74rSbRYy","lViBvfaHir","QChxsa00b5","8FmFH2ZHdk","BbwgAaDGtS","HfyNQ0Wr5y","YOfrY0ao3l",
+"M3zXL0PktI","IKxdLIKxdL","7ku1puZPqg","9eoRcC2Irc","K20wKVIlwP","RpBQmQ6Lix","LDk6fo8Uyd","AIYUuydG8U","lweGyhYBCK","B3qemn1pmO",
+"dQ586UmaEv","Ta8f6ksJby","MK07YRxrsm","FNYIMZv7z0","d85a9TCgPp","ZUnqt5Namm","yvOMIGWqqX","QworuW3VFH","Chuy31LB1L","WaWsvFjHXR",
+"2hEEU16lHc","kB5nPBbwgA","xXTI4iB08l","mX2GErz7Ut","yvOMI5Drn0","B3qemQ6hMC","9eoRctuDyS","BbwgAMezSW","Mm8siFPfSE","FNYIM9y4lw",
+"FhtglgdQsS","jeskSQworu","VjCZqG1RhS","Gv3FqVjCZq","guMb8BGaQY","YjB9t4W0Tl","vOqCE64s8N","5NammECMvU","Mm8sizz4ZU","1v5hHiB08l",
+"M6qcGbZLvS","ZhwG1O3iyQ","uvf7AcmXIX","ECMvUuZPqg","gtCA5FcWrW","k85AezbIYY","uPX7Gs7Mxk","hE1QlQYxC0","BGaQYh1zcH","CIShGnnP8o",
+"In3NS9eoRc","YjB9tG1RhS","MaJQsFcWrW","RACujHzZT8","IRh48OUqFM","KASQ8NcICA","9GXkXcL0aE","i3pydVerEA","9iGoTQ6hMC","nlaByYjB9t",
+"RkQke0MR5X","lCMxyK4GS8","07n1cnlaBy","iwzGkW3VFH","WaWsvUl4a1","cQOnvrKDLJ","lViBvK20wK","okgRi5VZjS","okgRiKASQ8","FwEJzlViBv",
+"Cp3mZoVQp6","FwEJzrhl0J","Dz1R3djsrv","DcpWBQworu","jS1ajXflUq","lm0pDQ6Lix","5nmWvUvlv4","FhtglSWfou","zz4ZUokgRi","lViBv2DREs",
+"5iGN5D6rBy","Vprf2FLsph","0Wr5ylpF6W","5VZjSlpF6W","5iGN5QWxoT","rhl0JQ6hMC","8TxD7n8pJ9","B3qemydG8U","PYBf4VLTy6","ru4UG5IhmG",
+"YOfrY0MR5X","rz7UtY1mC0","FxX9qOz8yZ","FNYIMoGu6x","tlILtzFgtB","0MR5XguMb8","mz8gxpAhR1","7Ow5CRsQUq","QbxXciqv4k","WMiS32TRI7",
+"DLhzMlCMxy","a00b5xXTI4","y94nwXyPZN","brhlQW3VFH","8cVD3CNHmv","7Ow5CAgJHQ","QssNCmz8gx","bZLvSguMb8","zQt6QFNYIM","cShY2Nxx9V",
+"qaofN48cHL","aFFsstlILt","MmKGJQYxC0","FGzgpl83Ud","BCxeCSs0Zu","XflUqlXFOB","BbwgAuTacx","D6rBy1v5hH","Fhtgl24ARF","tuDySi3pyd",
+"pFrrlrKDLJ","F6PT22Nslm","SmGzv0ao3l","MezSW6AFT0","qUJMdWaWsv","oGu6x0Wr5y","h1zcHFnPFB","s93MlGv3Fq","s7MxkuLtKs","5VZjSxXTI4",
+"2hEEUjSjS3","t59lRrKDLJ","LewvMjeskS","BpYhVzz4ZU","1v5hHfFDrJ","OxWIHzFgtB","16lHcVBjhz","FxX9qBCxeC","55rfBlsQGo","24ARFMmKGJ",
+"48cHLF6PT2","W3VFHEoToP","atef2JJs5m","7fsYMW3VFH","QWxoTk85Ae","yofH3Q6hMC","6AFT0Uvlv4","ZhwG1pFrrl","s7Mxk9iGoT","okgRiOz8yZ",
+"BCxeCzbIYY","O3iyQ9y4lw","qQxHPpAhR1","0YAGHprNT6","W3VFHBbwgA","Q6LixaDGtS","OUYuFydG8U","aL6AJ8RCUA","J2mQijeskS","G1RhSpiJSk",
+"580YDUmaEv","2TRI75Namm","ru4UG4QMc9","lm0pDpAhR1","BpYhVPOUYS","QssNCcShY2","xReeczFgtB","yToGWcmXIX","2TRI7NAFuw","RzaZARmDcr",
+"J2mQiFNYIM","8hJdtNxx9V","aL6AJgf8rI","HfyNQI7p2a","NcICAblLA9","l83UdtlILt","pFrrllm0pD","Y1mC0hYBCK","lkMUANxx9V","VBjhz7X3uy",
+"zmLYDHRxd8","xciqpru4UG","IRh48Mkgy8","7X3uynnP8o","CqqaDs7Mxk","Yw2oUSmGzv","rz7UtpmeCd","lkMUAIjTwP","tl72W5nmWv","lCMxyIjTwP",
+"zQt6QYw2oU","jSjS3QClRL","IRh482Nslm","IKxdLogLgc","MK07YQbxXc","7fsYMkZANm","0MR5XFnPFB","zY1GYZ4I1v","5ZaEzRxrsm","prNT6iqv4k",
+"o8UydVjCZq","POUYSgjUTu","DLhzMTXQ0Z","ksJbyZuDtD","uvf7Afqypy","1j5L8qaofN","VLTy6VjCZq","POUYSIKxdL","Z4I1vX6Pin","zQt6QuZPqg",
+"IBe8kWaim6","TCgPp29QAz","guMb8CxVEf","8hJdtNAFuw","uupzkuJScX","JJs5mydG8U","Mkgy8lH1kt","CqqaDGv3Fq","uAWyp55rfB","oQ87rfcwDa",
+"FxX9qaFFss","WreyPYOfrY","d85a9fcwDa","i7WMQ3otm6","FVMxo8xEKz","rz7Ut5drc6","HRxd8okgRi","zmLYDx3LDe","lweGywiHrZ","ix74rfmIK1",
+"hE1QlHfyNQ","24ARFNAFuw","hYBCKHfyNQ","brhlQ7Ow5C","gdQsS7fsYM","ogLgcKr8ys","nnP8ovOqCE","xReecBbwgA","WmadAl83Ud","Twano6AFT0",
+"wDajXB3qem","uoStwGrDg7","14FLRSWfou","hSSvQJKWYR","hUTw7mX2GE","CxVEffcwDa","VLTy6K4GS8","S2Dfuk85Ae","Mkgy8CqqaD","lCMxyZhwG1",
+"StlDJEdBKc","2Nslm9GXkX","Kr8ys3weIF","hUTw77Ow5C","2NslmLDk6f","ZUnqttjQxs","45cIHBbwgA","aDGtSPb1pa","HlUbFYh1hF","M3zXL9rlg9",
+"yEfy9POUYS","4QMc9LDk6f","Cp3mZulk41","8hJdtMmKGJ","aDGtSksJby","JRJQBiwzGk","zFgtBLewvM","StlDJaez9y","ECMvUNhXdu","nFqikpT8wu",
+"5NammfmIK1","gf8rI8U2nU","Ta8f6uTacx","sx5GlyvOMI","FVMxoKZamH","oVQp6I7p2a","DLhzMLDk6f","SWfouUvlv4","l83UdLewvM","CIShGM3zXL",
+"ZhwG1RACuj","9iGoTOz8yZ","55rfBX6Pin","8xEKzAOgEe","Twano9GXkX","atef2BCxeC","Rxrsm5VZjS","5IhmGMojnP","VLTy6sx5Gl","L7cGcK4GS8",
+"EOE1on1pmO","4dEz6djsrv","iKqhrUmaEv","dpe1vogLgc","AkKTkfaHir","45cIHSWfou","5ZaEzW3VFH","ZhwG1vOqCE","RsQUqh1zcH","lpF6WZ4I1v",
+"yEfy9NhXdu","ksJby7fKYU","Y1mC0jSjS3","pFrrlfmIK1","DG4sT64s8N","QWxoTGWqqX","0MR5XjiVBP","2Yz7EFjHXR","9rlg9L7cGc","gdQsSVIlwP",
+"sx5Gl5drc6","CxVEfIRh48","lj07Qrhl0J","rKDLJmX2GE","IjTwPRpBQm","UmaEvK4GS8","iKqhr0Wr5y","FLsphX6Pin","uZPqgLewvM","zQt6QUvlv4",
+"kZANms4786","XyPZNQworu","9rlg9WDVWJ","Gv3Fq2hEEU","d85a9WDVWJ","Yw2oUMGlTF","azIWpFxX9q","VIlwP6AFT0","mz8gxMK07Y","i7WMQVNCPd",
+"ZJTXHeuZA5","GWqqXUvlv4","tlILtwDajX","uoStw5Mg9r","lpF6WDLhzM","ix74rZhwG1","29QAzaL6AJ","BpYhVv2eC3","aDGtSRsQUq","RACujkZANm",
+"hUTw7ZJTXH","xXTI4NAFuw","Cp3mZKASQ8","JXljW1v5hH","8TxD7jSjS3","VBjhzQ6hMC","wiHrZyvOMI","L7cGcm4bxU","1LB1LXflUq","Dz1R39GXkX",
+"5Mg9rWaim6","Mm8siQ6Lix","5Mg9rQClRL","Oz8yZgtCA5","JKWYRa00b5","2ZHdkVprf2","1j5L8Waim6","2Yz7EI7p2a","t98iWpv0i7","DcpWBThjNn",
+"2TRI7DG4sT","lpF6WpAhR1","2Yz7E8U2nU","euZA5POUYS","s7Mxk8RCUA","7fKYUjiVBP","zFgtBjfREu","WreyPWmadA","taOXKNcICA","9rlg9aFFss",
+"jtn0XJkzUn","9y4lwn1pmO","kZANmtl72W","dQ586okgRi","Chuy3pv0i7","LDk6f9GXkX","8FmFHFLsph","WaWsvnnP8o","ydG8U0Wr5y","jeskSAkKTk",
+"VerEAWreyP","CxVEfMK07Y","n8pJ9t98iW","jzUqRNcICA","Chuy3soy9t","n8pJ9QnJ1S","AgJHQRkQke","16lHcwiHrZ","QYxC0o8Uyd","cQOnvbZLvS",
+"MK07YOUqFM","aez9ylweGy","x3LDe5Namm","lweGyzHF1q","pT8wuOz8yZ","ulk415ZaEz","Dz1R3tuDyS","lj07QFnPFB","tl72Wfqypy","fmIK1cL0aE",
+"FGzgp5Drn0","9eoRcGXdoH","SbRYy5IhmG","zHF1qhi5X7","G1RhSJkzUn","HzZT8iB08l","8RCUAlweGy","I7p2aVerEA","W3VFH2hEEU","YjB9tOUYuF",
+"W7cTsqQxHP","1j5L8SmGzv","lj07QWDVWJ","Z4I1vMezSW","BFkb89GXkX","v1HlnhE1Ql","DLhzMLewvM","FwEJzfmIK1","1LB1LqaofN","0h1b1lj07Q",
+"dmoS7UmaEv","7fsYMpWiOs","CK5W7uTacx","RkQkezmLYD","cmXIXZUnqt","jzUqRwDajX","s4786uLtKs","k85AetuDyS","VNCPdJ2mQi","VjCZqJKWYR",
+"YOfrYX6Pin","618DikB5nP","cShY2WmadA","9y4lwpv0i7","brhlQazIWp","KASQ8J2mQi","VjCZq3otm6","QYxC0WreyP","jiVBPdQ586","ydG8UzmLYD",
+"WaWsvQnJ1S","RBhp0cL0aE","NOHsz7fKYU","gdQsS0MR5X","NAFuws7Mxk","d85a929QAz","hE1QlAXpwE","7fKYUwDajX","y94nwazIWp","zbIYYCqqaD",
+"YjB9t8hJdt","suY4xDz1R3","FwEJz7fKYU","5drc6VBjhz","Yh1hF2Yz7E","9rlg929QAz","kB5nPTwano","lpF6Wni2v1","iqv4kZzJHW","pFrrl8TxD7",
+"lj07QiKqhr","ZzJHWMaJQs","Oz8yZlweGy","2ZHdkxXTI4","uTacxogLgc","Cfgr3uAWyp","i7WMQ0h1b1","cL0aE2Nslm","6AFT0prNT6","xXTI4a00b5",
+"Kr8ysFVMxo","In3NSNxx9V","o8Uyd9GXkX","qUJMdZJTXH","cL0aE7Ow5C","b29RJOUYuF","PYBf4v2eC3","jfREuAkKTk","5IhmGlpF6W","07n1c8TxD7",
+"BCxeCtjQxs","NcICA0BmCy","gtCA57fKYU","8TxD7okgRi","zY1GYYOfrY","FNYIMNAFuw","faHirSbRYy","MmsIowDajX","2DREsn8pJ9","LDk6f8U2nU",
+"Mkgy8zqH0W","ECMvUuPX7G","OxWIHtjQxs","WDVWJ4QMc9","FVMxo7fKYU","lXFOBVBjhz","WaWsvHRxd8","gjUTuBpYhV","9GXkX0BmCy","Ul4a1iKqhr",
+"NhXdublLA9","Pb1pabgJAz","LbRTHFLsph","lm0pDFVMxo","t59lRtl72W","Dz1R3vOqCE","ksJbyix74r","s93Ml7X3uy","uN6r3QYxC0","64s8NCIShG",
+"WreyPB3qem","JkzUnnlaBy","Mm8si8hJdt","BGaQYAgJHQ","WreyPX6Pin","SjskQhUTw7","Oz8yZAgJHQ","LbRTHfmIK1","2Yz7EUlU3M","cmXIXvLsmS",
+"LDk6fCdyBV","uN6r3VBjhz","WreyP7lUXZ","xciqpVprf2","x3LDeD6rBy","i7WMQhE1Ql","Cfgr3VLTy6","tvdkDiKqhr","jzUqRRzaZA","C2IrcaFFss",
+"lCMxyjSjS3","oGu6xWDVWJ","K20wK9eoRc","zbIYYuPX7G","t59lRix74r","nnP8oDcpWB","FxX9qbgJAz","1j5L8OUqFM","OHaBzbrhlQ","FFDuijiVBP",
+"cmXIXFwEJz","wiHrZru4UG","soy9tGv3Fq","taOXKs4786","CxVEfeuZA5","zz4ZUQChxs","yEfy9x3LDe","PYBf40h1b1","tjQxsUvlv4","pT8wuChuy3",
+"0PktI0h1b1","B3qemfcwDa","2Nslm5drc6","9eoRcXyPZN","dhSuHQworu","b29RJtAOsr","QClRLblLA9","vkCHHCIShG","VerEAnlaBy","zFgtB7Ow5C",
+"K20wK1LB1L","SbRYyiqv4k","wDajXPYBf4","mX2GETwano","bgJAzk85Ae","jiVBPtjQxs","FVMxoC2Irc","Ss0ZuCp3mZ","sx5GlVLTy6","Qworutl72W",
+"k85AeQ6Lix","5Drn0Cp3mZ","0h1b1DQimp","uTacxpWiOs","X6PinguMb8","qQxHPuLtKs","FjHXRNcICA","0h1b1v8yFN","7lUXZcmXIX","O3iyQ9rlg9",
+"6q6L9UlU3M","OUqFMbrhlQ","k85AeXyPZN","cShY2uJScX","DcpWBokgRi","SmGzvYOfrY","sx5GlyofH3","aDGtSsx5Gl","guMb864s8N","DcpWBvOqCE",
+"uN6r3QbxXc","4dEz6euZA5","KZamHFhtgl","n1pmOpv0i7","Nxx9V8xEKz","lCMxyBFkb8","KZamHYOfrY","P6bcgMkgy8","AgJHQZuDtD","dpe1v8RCUA",
+"GXdoHFcWrW","nFqikUlU3M","8U2nUiB08l","prNT6i7WMQ","MmKGJSbRYy","HlUbF6q6L9","S77LHJIqXi","618Dini2v1","2ZHdkQ6hMC","zHF1qCxVEf",
+"uAWypChuy3","tAOsrdmoS7","o8UydmX2GE","iqv4k5VZjS","QYxC0vkCHH","MojnPt59lR","64s8N0h1b1","ZzJHWtaOXK","MojnPHzZT8","oVQp6FLsph",
+"GWqqXZv7z0","jiVBPCNHmv","WreyPQ6hMC","ZzJHW4dEz6","prNT68TxD7","SmGzvBCxeC","8hJdtv1Hln","BCxeCMaJQs","jeskSlpF6W","2TRI7sx5Gl",
+"Fhtgl0BmCy","fmIK1BCxeC","fcwDaJRJQB","suY4xnFqik","vkCHHFGzgp","Gv3Fqs93Ml","BFkb87fKYU","ciuWz8hJdt","3otm6EdBKc","b29RJvkCHH",
+"piJSklCMxy","hSSvQlweGy","hE1QlAgJHQ","Mkgy8cL0aE","MmKGJGrDg7","t98iWdmoS7","NcICAkZANm","RpBQml83Ud","hUTw7FjHXR","VLTy6CxVEf",
+"FhtgltAOsr","nlaBy7lUXZ","RpBQmWMiS3","FPfSElsQGo","qaofNU3yw5","PYBf4CxVEf","JkzUn5drc6","DG4sTZ4I1v","8xEKzeuZA5","Z4I1v4QMc9",
+"S77LH2DREs","jSjS3C2Irc","KASQ8Uvlv4","iwzGkW7cTs","07n1cgtCA5","ThjNnVNCPd","Mkgy8RzaZA","FwEJzWMiS3","2Nslm4dEz6","GWqqXksJby",
+"ZUnqtTXQ0Z","FGzgp1LB1L","iB08l64s8N","Yf2EcJIqXi","jS1ajguMb8","tlILtO3iyQ","zz4ZUsuY4x","2TRI7KZamH","dhSuH0Kyfs","4QMc9Yw2oU",
+"S77LHMm8si","EoToPCIShG","FLsphuTacx","pT8wuQ6hMC","t98iWni2v1","kB5nPt98iW","oVQp6Qworu","MmsIoiwzGk","GrDg7HfyNQ","he9IArhl0J",
+"EdBKcAmdQd","tuDySxXTI4","n1pmOaez9y","i3pydGWqqX","prNT6FwEJz","lXFOBoQ87r","JKWYR55rfB","pT8wuCNHmv","xciqp0MR5X","9GXkX4dEz6",
+"zQt6QBGaQY","WPmlxrhl0J","zz4ZUMaJQs","ThjNnydG8U","bgJAzUlU3M","yluBxSWfou","TwanoD6rBy","POUYSqQxHP","jSjS3gIYvE","7ku1pCp3mZ",
+"9GXkXFVMxo","lCMxyFwEJz","fFDrJDLhzM","k85Ae5IhmG","euZA50h1b1","fqypyazIWp","vkCHHVjCZq","07n1c4W0Tl","cmXIXl83Ud","gtCA5POUYS",
+"uoStw0BmCy","P6bcgFcWrW","0BmCyIKxdL","t98iWv1Hln","JkzUnGXdoH","jS1aj2Nslm","2hEEUW3VFH","hYBCKiwzGk","HfyNQZhwG1","UmaEv5Namm",
+"soy9tjiVBP","uAWypjzUqR","Yf2EcDQimp","M3zXLIRh48","MK07Y9iGoT","AIYUuAIYUu","rhl0J6AFT0","lH1ktFwEJz","i3pydP6bcg","iB08l8U2nU",
+"ZuDtD6AFT0","Cp3mZVprf2","QClRLJJs5m","MmsIonnP8o","MmKGJiqv4k","Yw2oUJJs5m","24ARF2hEEU","F6PT2IRh48","cmXIX5VZjS","LDk6fJJs5m",
+"LewvM7X3uy","cL0aElH1kt","55rfBRxrsm","Zv7z08FmFH","IRh48v8yFN","ksJby7fsYM","9y4lwfcJOy","pFrrlatef2","0Wr5ysuY4x","FFDuinnP8o",
+"JJs5mAkKTk","OUqFM5ZaEz","ogLgcs7Mxk","qQxHPydG8U","BFkb8s4786","rz7UtHP433","n1pmOFNYIM","7Ow5CJIqXi","gf8rIjS1aj","9GXkXru4UG",
+"VNCPddhSuH","yluBxBGaQY","GXdoH0BmCy","9rlg9CNHmv","pFrrls4786","ix74rFLsph","lweGyo8Uyd","MmKGJKr8ys","zHF1qZzJHW","0h1b1BbwgA",
+"pWiOsRkQke","J2mQiciuWz","5VZjSfFDrJ","JIqXiQssNC","a00b5fcJOy","Mkgy8Kr8ys","QClRLWDVWJ","W7cTsS77LH","Pb1pat59lR","MGlTFQYxC0",
+"soy9tMK07Y","suY4xOxWIH","nFqikiwzGk","CdyBVzQt6Q","PYBf4IBe8k","7X3uyt98iW","7X3uyKr8ys","i3pydfFDrJ","NhXduYw2oU","MezSWWDVWJ",
+"YjB9tNcICA","5Drn0e6e4z","0Wr5yxciqp","cmXIX9rlg9","uAWypk85Ae","QssNCFhtgl","pvgjS48cHL","1v5hHI7p2a","StlDJLewvM","zHF1qrz7Ut",
+"ciuWzkB5nP","5IhmGgdQsS","8hJdtni2v1","KZamHDz1R3","azIWppFrrl","YOfrYNhXdu","3otm6d85a9","GXdoHZUnqt","M3zXLZJTXH","ReKEWbgJAz",
+"EoToPqUJMd","MGlTFzbIYY","QWxoTIBe8k","FjHXR2hEEU","VNCPd4W0Tl","WreyPGrDg7","MmKGJMmKGJ","K4GS8yofH3","ksJby3weIF","y94nwogLgc",
+"IBe8kZuDtD","soy9tFNYIM","ZzJHWBbwgA","ThjNn8RCUA","vkCHH7Ow5C","uoStwZJTXH","QssNCRzaZA","fmIK15drc6","QnJ1Si3pyd","tjQxsqQxHP",
+"W3VFHGSQwj","vLsmSyvOMI","VIlwP2ZHdk","FcWrWIn3NS","Cfgr3Uvlv4","Yf2EcYf2Ec","gIYvEs4786","brhlQlj07Q","MaJQsAgJHQ","a00b5HRxd8",
+"4QMc9MaJQs","v1HlnFwEJz","64s8NVjCZq","ThjNnlj07Q","taOXKjS1aj","suY4xjtn0X","D6rByQnJ1S","CK5W77X3uy","QbxXcFVMxo","jzUqR5Namm",
+"VIlwPFcWrW","5Mg9rs93Ml","uvf7A2Nslm","QYxC0uQIcz","ZhwG1Ul4a1","k85AeWMiS3","n8pJ90h1b1","AIYUuo8Uyd","8xEKzuAWyp","zbIYYQbxXc",
+"aDGtSCIShG","GXdoHxciqp","dQ586vOqCE","hSSvQ580YD","RACuj5ZaEz","4QMc9ZhwG1","55rfBogLgc","Zv7z0uAWyp","U3yw5Yw2oU","uPX7GJIqXi",
+"zHF1qd7vjM","FxX9qjS1aj","M6qcGTa8f6","mX2GEiwzGk","ZUnqtRpBQm","he9IA580YD","s4786VLTy6","uoStwRBhp0","okgRiJIqXi","1v5hHgtCA5",
+"VLTy6uvf7A","Y1mC0UmaEv","prNT6Y1mC0","ru4UGB3qem","AXpwE7X3uy","8U2nUD6rBy","WMiS3JkzUn","b29RJl83Ud","KZamHpT8wu","AIYUuokgRi",
+"48cHLXflUq","BGaQYBCxeC","QYxC0Q6hMC","nFqikG1RhS","tjQxsn1pmO","8U2nUKr8ys","cQOnv7lUXZ","d85a9VNCPd","okgRilkMUA","b29RJd7vjM",
+"M6qcGOHaBz","uoStwtaOXK","NcICAMaJQs","hi5X7lm0pD","NAFuwDG4sT","pFrrlK20wK","K20wK5nmWv","Ul4a1UlU3M","7X3uy9rlg9","M6qcG4dEz6",
+"NhXduFjHXR","AIYUuJJs5m","uoStwJ2mQi","zHF1qHzZT8","MaJQsuupzk","blLA9NcICA","pAhR1M3zXL","DG4sT0BmCy","S77LHGv3Fq","WDVWJ5iGN5",
+"QnJ1SgIYvE","hi5X7CNHmv","Kr8ysiwzGk","55rfBpv0i7","rhl0JpFrrl","zqH0Wl83Ud","Dz1R3VIlwP","MezSWWMiS3","uoStwv1Hln","I7p2a8U2nU",
+"F6PT2pWiOs","fqypyL7cGc","580YDuAWyp","Yw2oUl83Ud","k85Ae2hEEU","iB08ltaOXK","fFDrJiqv4k","n8pJ9KASQ8","lm0pDs7Mxk","pFrrlzFgtB",
+"IjTwPVprf2","16lHcgjUTu","In3NSfqypy","bgJAzfqypy","ZuDtDpFrrl","DLhzMs93Ml","580YD3weIF","WMiS3oGu6x","EdBKclXFOB","FNYIM2hEEU",
+"GWqqX9iGoT","NcICAdQ586","jfREupvgjS","WDVWJQ6Lix","ZzJHWNcICA","oGu6xZ4I1v","WPmlxbrhlQ","C2IrcjiVBP","s4786lm0pD","PYBf4RpBQm",
+"KZamHdhSuH","In3NS8hJdt","sqVrfMezSW","Rxrsm0BmCy","uTacxVLTy6","nlaByaDGtS","9iGoTtjQxs","P6bcgyluBx","gf8rI7fKYU","0YAGH8RCUA",
+"ECMvUs7Mxk","EdBKcLDk6f","Waim6l83Ud","SmGzvQworu","CIShGiKqhr","0Wr5ysx5Gl","UlU3MCqqaD","x3LDeFcWrW","jiVBP5Drn0","SbRYyxciqp",
+"QbxXcpv0i7","lweGyaez9y","VIlwPjS1aj","WaWsvSbRYy","yofH3FVMxo","JJs5mjtn0X","RxrsmZJTXH","UmaEvS2Dfu","mz8gxYf2Ec","9GXkXpvgjS",
+"blLA9qUJMd","Fhtgl3weIF","0Kyfs7ku1p","cShY27fsYM","RBhp0BpYhV","1j5L8m4bxU","HfyNQ7fKYU","B3qemzqH0W","fFDrJGrDg7","zQt6QUlU3M",
+"45cIHQChxs","hE1QlpWiOs","cmXIX7hyVv","Cfgr3SmGzv","2Yz7EP6bcg","wDajXn8pJ9","bgJAz14FLR","v1Hlnm4bxU","M6qcG0h1b1","Mkgy8lpF6W",
+"AIYUutl72W","5iGN5W7cTs","fLNg8Pb1pa","pvgjSbZLvS","LbRTHTXQ0Z","dpe1vMGlTF","rKDLJVIlwP","s7MxkfcwDa","gf8rIdmoS7","bZLvSOz8yZ",
+"U3yw5VNCPd","lXFOBJRJQB","HfyNQjS1aj","DG4sTB3qem","y94nwx3LDe","uJScXHlUbF","uAWypsuY4x","QYxC0ZUnqt","QworuZ4I1v","2ZHdkLewvM",
+"Cfgr3J2mQi","GXdoHpT8wu","hYBCK9XyT9","JRJQB9iGoT","hE1QlK4GS8","NOHsze6e4z","48cHLDLhzM","Mkgy8uJScX","l83Ud5Mg9r","7ku1pFNYIM",
+"hUTw7xciqp","WmadArhl0J","QssNCAmdQd","D6rBypvgjS","ksJby4QMc9","zbIYYLDk6f","aDGtSMK07Y","wDajXaFFss","he9IANxx9V","0PktItuDyS",
+"Ss0ZuReKEW","gjUTuyvOMI","StlDJIn3NS","K4GS829QAz","ciuWzrKDLJ","uQIczQworu","DG4sTd85a9","pT8wuGWqqX","5NammC2Irc","Waim6I7p2a",
+"s7Mxk5Drn0","zFgtBuvf7A","Yf2Eczz4ZU","StlDJsx5Gl","0YAGH07n1c","fqypycL0aE","RmDcr16lHc","9eoRcvLsmS","mz8gxiqv4k","JJs5m5ZaEz",
+"I7p2aMezSW","zHF1qlXFOB","DG4sTCqqaD","t98iWZUnqt","9eoRcRACuj","vLsmSAgJHQ","BGaQYFhtgl","he9IAAIYUu","gIYvENxx9V","lXFOBdmoS7",
+"SjskQTXQ0Z","TwanoChuy3","BCxeCHzZT8","pmeCdulk41","yvOMITCgPp","FVMxoYf2Ec","VjCZqblLA9","dQ586pvgjS","Yf2EcIBe8k","gf8rIVIlwP",
+"No0Qb4QMc9","tuDySuvf7A","s93MltvdkD","v2eC3aez9y","CdyBVpvgjS","8FmFHwiHrZ","CIShG8hJdt","8FmFHM6qcG","FFDuiYOfrY","O3iyQgIYvE",
+"ZhwG1uN6r3","MmKGJZ4I1v","dmoS7W7cTs","Y1mC0Uvlv4","hi5X7No0Qb","taOXKuJScX","JXljWlj07Q","7lUXZvkCHH","aFFssWaim6","HlUbFUvlv4",
+"lCMxyuoStw","bZLvSD6rBy","pv0i7cmXIX","GXdoHMaJQs","mX2GEwiHrZ","BbwgA0BmCy","J2mQi07n1c","07n1cFwEJz","nlaByBCxeC","5Drn0AmdQd",
+"WreyPUlU3M","I7p2a8TxD7","QClRLRxrsm","pFrrl5iGN5","J2mQiiwzGk","iB08lVerEA","MmKGJEdBKc","JKWYRDQimp","CxVEfbZLvS","mz8gxzHF1q",
+"FNYIMyluBx","AmdQdxciqp","oQ87rYOfrY","7fKYUQnJ1S","HRxd8HlUbF","uZPqgoVQp6","gf8rIZUnqt","Ul4a1he9IA","5Namm4QMc9","pAhR1RzaZA",
+"M6qcGGv3Fq","Gv3FqMojnP","tAOsrNAFuw","CIShGWaim6","07n1cZ4I1v","Z4I1vZUnqt","0MR5XlkMUA","hE1QluJScX","AmdQdAXpwE","HzZT855rfB",
+"K20wK7lUXZ","QWxoTjfREu","8FmFHRkQke","aFFsskB5nP","In3NStjQxs","IBe8kaez9y","jzUqRGWqqX","HfyNQk85Ae","M6qcGLDk6f","FxX9qRmDcr",
+"VerEAcL0aE","ydG8UOxWIH","4W0TllpF6W","CqqaDfLNg8","dhSuHcmXIX","7hyVvRkQke","kB5nPAXpwE","qUJMdCqqaD","v8yFNvOqCE","azIWpCfgr3",
+"sx5GloQ87r","QnJ1S14FLR","jzUqRogLgc","aL6AJGSQwj","vLsmSReKEW","pmeCdgf8rI","wiHrZOUYuF","euZA5GSQwj","OUYuFUl4a1","XyPZNK4GS8",
+"uTacxHP433","gf8rIfcwDa","FNYIM0PktI","AXpwEM6qcG","pv0i7fLNg8","fLNg8kZANm","ZJTXH7fKYU","uJScXRzaZA","RmDcri3pyd","guMb81v5hH",
+"Zv7z0iqv4k","lXFOByluBx","lkMUAZhwG1","uPX7GAmdQd","IRh48K4GS8","he9IAgf8rI","v8yFNWPmlx","jeskSs93Ml","n8pJ9brhlQ","2hEEUFGzgp",
+"L7cGcCfgr3","9y4lwhi5X7","GrDg7zQt6Q","HfyNQPYBf4","4QMc9TXQ0Z","t59lRbgJAz","I7p2aSmGzv","3weIFFGzgp","618DiM3zXL","lpF6WLbRTH",
+"jtn0Xtl72W","0ao3lStlDJ","6q6L9xReec","7X3uypT8wu","pvgjS8RCUA","SmGzvJJs5m","8U2nUciuWz","uupzkhE1Ql","5iGN5o8Uyd","JKWYRQbxXc",
+"0ao3lRsQUq","SWfouNAFuw","fcwDa6q6L9","Y1mC0n1pmO","TCgPpi7WMQ","FjHXR2DREs","jtn0XdhSuH","07n1cpvgjS","guMb8TXQ0Z","fcwDaMkgy8",
+"FwEJz8xEKz","POUYSi3pyd","s93MlhSSvQ","GXdoHblLA9","xciqp5VZjS","s7MxkydG8U","yvOMI7ku1p","gf8rIQnJ1S","45cIHQnJ1S","n8pJ9No0Qb",
+"P6bcg1j5L8","BFkb8Mkgy8","CNHmvHfyNQ","EdBKcSWfou","lCMxyhe9IA","5nmWvyluBx","Q6LixiKqhr","FhtglAgJHQ","qUJMdYw2oU","KASQ8FLsph",
+"HRxd8xciqp","SWfouWaWsv","lCMxylweGy","zY1GYhUTw7","580YD0ao3l","tAOsrv2eC3","he9IA2Yz7E","WPmlxCIShG","NcICAd85a9","OUqFM9iGoT",
+"7Ow5CuJScX","0PktIRxrsm","pWiOsIKxdL","BCxeCwiHrZ","F6PT2soy9t","Uvlv4Chuy3","29QAze6e4z","GSQwj64s8N","2Yz7EMojnP","0Wr5yru4UG",
+"FVMxoFjHXR","blLA9wiHrZ","GrDg7Dz1R3","jzUqRdhSuH","K20wKjfREu","tuDyS2TRI7","L7cGclXFOB","vOqCEAOgEe","tl72Wt59lR","kB5nPQChxs",
+"YOfrYaFFss","5Namm2Yz7E","SmGzvFGzgp","ECMvUYOfrY","uQIczkB5nP","dpe1vDcpWB","lCMxyb29RJ","AIYUu9rlg9","tvdkDeuZA5","8U2nUsuY4x",
+"MojnP16lHc","JRJQBzY1GY","kB5nPxReec","b29RJ0MR5X","GWqqX8cVD3","QnJ1SWPmlx","tvdkDzQt6Q","zbIYYsqVrf","faHiraFFss","8FmFHokgRi",
+"6q6L9sx5Gl","QssNCChuy3","s7Mxkv8yFN","iqv4kI7p2a","Cfgr3FGzgp","yToGW45cIH","1LB1LciuWz","gtCA59y4lw","C2IrcBFkb8","IBe8kF6PT2",
+"BbwgAv1Hln","CNHmvLbRTH","EdBKc580YD","zQt6Q0h1b1","pv0i72Yz7E","sx5GlydG8U","vLsmS4QMc9","Chuy34W0Tl","kZANmCfgr3","ogLgcpiJSk",
+"5IhmGlweGy","hE1QljS1aj","yluBxRsQUq","DcpWBhe9IA","5NammpT8wu","s93MlCxVEf","DG4sTF6PT2","XflUqXyPZN","azIWpCNHmv","7X3uyVjCZq",
+"atef2YOfrY","FjHXRbZLvS","JXljWNxx9V","5Drn0HP433","Oz8yZ2ZHdk","BCxeCFGzgp","8TxD7fLNg8","pAhR1y94nw","jeskSi7WMQ","FxX9qfaHir",
+"Chuy3m4bxU","cL0aEJ2mQi","s7MxkuTacx","sx5GlDQimp","fcJOy7lUXZ","O3iyQru4UG","8xEKzSs0Zu","Gv3FqnnP8o","Vprf27hyVv","hSSvQa00b5",
+"ThjNnxXTI4","M6qcGXflUq","gdQsSuJScX","v1HlnS77LH","Yh1hFDz1R3","8U2nUoVQp6","hi5X7K4GS8","WMiS3GXdoH","TXQ0Z0Kyfs","9y4lwgtCA5",
+"9y4lwtvdkD","7lUXZX6Pin","NOHszsx5Gl","soy9tJIqXi","7ku1pyEfy9","TXQ0Z9GXkX","S77LHQworu","v2eC37hyVv","XflUqt59lR","GrDg7QYxC0",
+"4W0Tli7WMQ","P6bcgni2v1","dQ58655rfB","16lHcUmaEv","v2eC3RBhp0","NcICArz7Ut","b29RJVNCPd","5Nammrz7Ut","vLsmSlCMxy","uLtKshi5X7",
+"FxX9qTwano","sx5Glni2v1","580YD1LB1L","StlDJVerEA","0PktI1LB1L","5nmWvF6PT2","gIYvERkQke","VNCPdCxVEf","AIYUuMmKGJ","0YAGHnnP8o",
+"ydG8UsqVrf","QssNC8RCUA","WmadABCxeC","SbRYyuLtKs","uTacxuLtKs","ZuDtDyEfy9","taOXKVBjhz","hi5X7dQ586","uZPqgKASQ8","RzaZArhl0J",
+"yvOMII7p2a","sqVrfaez9y","ogLgcEOE1o","Chuy3YOfrY","B3qemsuY4x","Twano0Wr5y","MojnPzY1GY","ix74rfqypy","a00b5kB5nP","OHaBzs93Ml",
+"IRh48IBe8k","s93MlB3qem","uoStwciuWz","0KyfstaOXK","s93MlIRh48","jtn0XpT8wu","5ZaEzIBe8k","5VZjSlsQGo","Mkgy8iB08l","d7vjM3weIF",
+"CNHmvoQ87r","tjQxsoGu6x","fcJOy6q6L9","d85a9iB08l","MezSWGSQwj","OHaBzGv3Fq","qUJMdjS1aj","dpe1vnlaBy","lpF6WFwEJz","In3NSNo0Qb",
+"ydG8UOUYuF","uN6r3NOHsz","n8pJ9RzaZA","SbRYyo8Uyd","DQimps93Ml","KsjRKIn3NS","hUTw77X3uy","brhlQqaofN","ThjNntvdkD","vOqCEJIqXi",
+"MK07Yn8pJ9","QbxXcQChxs","ZhwG1WreyP","Cfgr3hUTw7","2hEEUzmLYD","9y4lwjeskS","ZzJHWTCgPp","POUYSXyPZN","5iGN5FGzgp","DcpWBB3qem",
+"JRJQByEfy9","lViBvRBhp0","atef2QClRL","Kr8ysuvf7A","jeskSJXljW","Z4I1vhE1Ql","RkQkeDG4sT","Chuy3ThjNn","FGzgp9rlg9","he9IAMm8si",
+"618DiuAWyp","yofH3FwEJz","24ARFxReec","sqVrfRxrsm","Waim6ZuDtD","5VZjSFFDui","nlaBytl72W","LDk6fguMb8","LDk6f4QMc9","jfREuDG4sT",
+"JkzUnhe9IA","5nmWvv8yFN","soy9tfLNg8","MmsIoFcWrW","Gv3FqKZamH","5nmWvSjskQ","zY1GYMojnP","iwzGkMezSW","2Nslm5Drn0","UmaEvdQ586",
+"14FLRTa8f6","ru4UGTa8f6","FcWrWEdBKc","gjUTuAkKTk","cL0aEW3VFH","8hJdtlkMUA","J2mQiJkzUn","KZamH4QMc9","Mkgy8ix74r","2Yz7En8pJ9",
+"aez9yQbxXc","VIlwPDQimp","iwzGkMGlTF","YjB9t5Drn0","580YDHRxd8","GWqqXfcJOy","55rfBlm0pD","6q6L9In3NS","S2Dfuatef2","y94nwWPmlx",
+"8xEKzOUqFM","OHaBzt98iW","WMiS39eoRc","IRh48WaWsv","ydG8UZ4I1v","3otm6TCgPp","RBhp0e6e4z","KASQ87hyVv","RxrsmECMvU","Oz8yZn1pmO",
+"XyPZNJRJQB","5IhmGmX2GE","2NslmgtCA5","2ZHdkokgRi","Chuy3NhXdu","0Wr5yAOgEe","ru4UGguMb8","CqqaDdhSuH","RzaZAFGzgp","dhSuHhi5X7",
+"W3VFHLbRTH","ogLgcsoy9t","pWiOs9rlg9","IRh4824ARF","a00b5fqypy","b29RJzbIYY","lsQGocQOnv","zbIYYwDajX","JRJQBMGlTF","IjTwP5ZaEz",
+"soy9tRpBQm","FxX9qZv7z0","W7cTsQYxC0","pFrrlpT8wu","RpBQm2hEEU","2TRI7ReKEW","i7WMQtjQxs","Gv3Fqlj07Q","Ss0ZuciuWz","5iGN5uoStw",
+"7fsYMMezSW","euZA5ni2v1","2NslmtjQxs","0MR5XS2Dfu","AmdQduLtKs","FVMxoAIYUu","EoToPuQIcz","x3LDezz4ZU","jfREuMGlTF","fmIK10Wr5y",
+"dhSuHtjQxs","HfyNQFFDui","64s8NWmadA","ni2v1nnP8o","cShY2Uvlv4","Oz8yZQChxs","B3qemxciqp","7X3uy0h1b1","07n1crz7Ut","a00b5JKWYR",
+"zFgtBFFDui","9XyT9WaWsv","RBhp0FVMxo","atef2B3qem","RzaZAjS1aj","RpBQmiqv4k","S2DfuqaofN","tl72Wk85Ae","euZA5VIlwP","LewvMjtn0X",
+"RxrsmdQ586","0KyfsgjUTu","ogLgcQ6Lix","M3zXLECMvU","5Drn0MK07Y","x3LDe3otm6","C2IrcCdyBV","wDajXIBe8k","d7vjMFLsph","hE1Qlni2v1",
+"rz7UtuAWyp","OUYuFgdQsS","IBe8kl83Ud","580YDQ6hMC","Zv7z0ogLgc","uvf7A8U2nU","QClRL55rfB","cShY2rhl0J","Vprf2iKqhr","HfyNQ9GXkX",
+"5nmWvrKDLJ","suY4xGrDg7","VNCPdv2eC3","5drc6b29RJ","UlU3M14FLR","7fsYMG1RhS","8FmFHni2v1","Kr8ysgIYvE","vOqCESWfou","EoToPRBhp0",
+"gIYvEi7WMQ","9GXkXXyPZN","lweGyRzaZA","Q6Lix7lUXZ","C2IrcGSQwj","Twano5ZaEz","1LB1LSbRYy","VNCPdQ6Lix","dpe1vjzUqR","wDajXlkMUA",
+"FFDui1j5L8","6AFT0a00b5","DcpWB9rlg9","CK5W7NcICA","gjUTuIRh48","Z4I1vjS1aj","gIYvEVBjhz","djsrv9GXkX","zHF1qaL6AJ","5Mg9r5VZjS",
+"lm0pDYf2Ec","RACujlj07Q","CqqaDogLgc","e6e4zbgJAz","WMiS3Ta8f6","HRxd8Cfgr3","W7cTsHlUbF","RzaZAvLsmS","fmIK10h1b1","7hyVvcShY2",
+"bZLvSIjTwP","jiVBPblLA9","EoToPzmLYD","5drc6M6qcG","jzUqRfcJOy","ru4UG6AFT0","AOgEeOHaBz","Oz8yZ2TRI7","8FmFH6q6L9","Waim616lHc",
+"JIqXiTCgPp","e6e4zFFDui","QWxoTOxWIH","m4bxUlsQGo","UmaEvNhXdu","24ARFGXdoH","bZLvSMmKGJ","ThjNns93Ml","AmdQduupzk","64s8NMmsIo",
+"9y4lwWMiS3","ksJby0ao3l","Y1mC016lHc","Yh1hFTXQ0Z","8RCUAaFFss","07n1cCNHmv","fLNg8WmadA","CK5W7qQxHP","yvOMI1j5L8","yofH3XyPZN",
+"XflUqxciqp","NAFuwJJs5m","t98iWgdQsS","W3VFH8U2nU","4W0TlB3qem","TXQ0ZUl4a1","Yw2oUix74r","pFrrlWaWsv","yluBxzY1GY","VNCPdxXTI4",
+"ix74rIKxdL","FLsphfqypy","2hEEU0Kyfs","blLA9OUYuF","s7MxkB3qem","QbxXcZuDtD","2hEEUtvdkD","hSSvQOHaBz","zbIYYatef2","7hyVvzHF1q",
+"RzaZAjiVBP","29QAzCqqaD","RBhp0FcWrW","9eoRcI7p2a","lXFOBciuWz","lsQGolViBv","tvdkD24ARF","Q6LixaFFss","atef2aez9y","7ku1phYBCK",
+"vOqCEnlaBy","cL0aEECMvU","BGaQYtl72W","zHF1qVprf2","5Mg9rMkgy8","jSjS3KASQ8","uupzkSmGzv","FGzgp55rfB","In3NSfLNg8","QClRLVIlwP",
+"tl72WJ2mQi","aDGtS0BmCy","WaWsvUvlv4","faHir5VZjS","Cfgr3MGlTF","JIqXihi5X7","Ta8f6iKqhr","AOgEe8hJdt","Zv7z0hSSvQ","tlILtF6PT2",
+"HlUbFVNCPd","lpF6WL7cGc","8FmFHsuY4x","pT8wub29RJ","sx5GlcmXIX","i7WMQhe9IA","FVMxoWmadA","fmIK1s4786","QYxC0euZA5","QChxsk85Ae",
+"CK5W7k85Ae","hE1Ql9iGoT","hSSvQEoToP","oVQp6NOHsz","zFgtBlXFOB","pAhR1RACuj","RsQUqJ2mQi","aDGtS64s8N","7hyVvvkCHH","ThjNnlCMxy",
+"ECMvUGXdoH","QnJ1SlH1kt","lH1ktrz7Ut","CIShGfqypy","tvdkDHP433","Yh1hFLewvM","uupzkFLsph","5Mg9rNo0Qb","sx5GllkMUA","Cfgr3CxVEf",
+"Z4I1ve6e4z","MojnPzmLYD","DG4sTuAWyp","7hyVvYh1hF","Yh1hFPOUYS","jzUqRChuy3","MmsIoQClRL","lm0pDdQ586","cmXIXNo0Qb","Q6hMCMmKGJ",
+"NhXdujSjS3","vLsmSogLgc","iwzGkZzJHW","pWiOsIBe8k","zQt6QhE1Ql","hi5X7uoStw","MezSWMojnP","qQxHPzQt6Q","uoStwydG8U","HP433pAhR1",
+"CK5W7ydG8U","9XyT9Kr8ys","fFDrJ8cVD3","VBjhzNAFuw","SmGzv2hEEU","zFgtBCIShG","BpYhVcL0aE","lpF6WQYxC0","8xEKz7hyVv","Z4I1vpmeCd",
+"pWiOsyvOMI","QYxC0Yf2Ec","pWiOst98iW","48cHLaL6AJ","lH1ktfqypy","0h1b1jiVBP","atef2jeskS","OxWIHuPX7G","tvdkDThjNn","gf8rI5Drn0",
+"YOfrYK20wK","EdBKcSs0Zu","M6qcGW3VFH","Nxx9Vy94nw","YOfrYTwano","nFqikcmXIX","rhl0J7lUXZ","cShY2F6PT2","9GXkXZhwG1","ydG8U48cHL",
+"MGlTFcQOnv","P6bcgQChxs","JRJQBd7vjM","29QAzRACuj","xciqpRxrsm","oGu6x0PktI","CIShGv2eC3","faHirJXljW","07n1cJJs5m","BFkb8AkKTk",
+"ciuWzVIlwP","AkKTkZv7z0","6AFT05drc6","14FLRokgRi","jSjS3KsjRK","okgRi7fsYM","FNYIMpAhR1","QnJ1SUmaEv","n8pJ9S2Dfu","dQ5864W0Tl",
+"nlaByvkCHH","Kr8ysDG4sT","Pb1pa8TxD7","ECMvUK20wK","QnJ1SGXdoH","BFkb8l83Ud","CqqaDDG4sT","48cHLulk41","hi5X78U2nU","DQimp5VZjS",
+"cmXIXBbwgA","a00b5FxX9q","m4bxUDz1R3","Uvlv4LbRTH","aez9yFLsph","8TxD7hSSvQ","GXdoHfcwDa","jtn0XVprf2","RxrsmFjHXR","lkMUAtl72W",
+"uTacxMezSW","vOqCENcICA","FjHXRgf8rI","P6bcgTa8f6","1j5L8C2Irc","Q6LixK20wK","14FLRdpe1v","ulk41CNHmv","SmGzvn1pmO","IKxdLCqqaD",
+"BGaQYPb1pa","W7cTsyofH3","aez9yogLgc","G1RhSfcwDa","zFgtBn8pJ9","ECMvU9iGoT","TXQ0ZMezSW","8xEKzIBe8k","4dEz6NhXdu","uQIczsx5Gl",
+"PYBf4ydG8U","Cfgr3bZLvS","he9IAECMvU","tl72WuoStw","AgJHQYOfrY","vOqCEJXljW","IjTwPzHF1q","pAhR1jiVBP","vOqCErKDLJ","No0QbeuZA5",
+"I7p2aQbxXc","AmdQd24ARF","qQxHPxXTI4","aDGtSKASQ8","okgRi7Ow5C","atef2WreyP","45cIHGWqqX","LDk6flpF6W","CqqaDFGzgp","FjHXRcmXIX",
+"hSSvQ1LB1L","RsQUqzFgtB","zY1GYK20wK","MmsIoMojnP","rhl0J3weIF","zbIYYMK07Y","uLtKsciuWz","uupzkrKDLJ","BGaQYokgRi","RBhp05nmWv",
+"5iGN5zmLYD","0Wr5yZv7z0","xciqpprNT6","Yh1hF07n1c","d85a9hYBCK","GrDg75ZaEz","MmKGJvkCHH","YOfrY9XyT9","HP433618Di","7fsYMwDajX",
+"sqVrf1j5L8","o8Uydi3pyd","blLA9U3yw5","8U2nUzQt6Q","55rfB4W0Tl","m4bxUfqypy","jS1ajuZPqg","rhl0JoVQp6","WmadAaFFss","EoToPYw2oU",
+"AOgEeDLhzM","6AFT0iwzGk","FcWrWv8yFN","faHirKASQ8","4dEz6FGzgp","RsQUqIKxdL","pmeCdTwano","RzaZAi3pyd","3otm6Kr8ys","v8yFNokgRi",
+"POUYSZUnqt","FVMxoZuDtD","48cHLRmDcr","uTacxs4786","AOgEe7Ow5C","n1pmO14FLR","24ARFn8pJ9","hE1Ql5Namm","3otm6Fhtgl","gjUTusoy9t",
+"HP433YOfrY","uvf7A8hJdt","cmXIXxReec","4QMc9Pb1pa","pFrrlWPmlx","5Namms93Ml","cShY2piJSk","MojnPK4GS8","SmGzvuAWyp","Yf2EcnnP8o",
+"tlILtaDGtS","fFDrJ7hyVv","JkzUnZUnqt","sx5Gl2hEEU","VerEAIKxdL","EOE1oXflUq","48cHLlm0pD","tAOsrx3LDe","5drc6HRxd8","jS1aj8hJdt",
+"9y4lwRACuj","Ta8f6OUqFM","O3iyQMm8si","RkQkeBpYhV","IKxdLuJScX","7hyVvOz8yZ","gjUTuzbIYY","8U2nUoQ87r","Yw2oUuAWyp","U3yw5pT8wu",
+"i3pydjeskS","No0Qb4dEz6","ix74rDcpWB","KASQ8ZzJHW","8U2nUo8Uyd","ix74raL6AJ","WDVWJFGzgp","lViBvmz8gx","0h1b1zY1GY","jSjS3vLsmS",
+"uJScXCNHmv","2DREsUlU3M","2TRI7zHF1q","ydG8Un8pJ9","Ss0Zu7Ow5C","5ZaEzJIqXi","580YD8FmFH","n1pmOo8Uyd","DcpWBdhSuH","HfyNQjzUqR",
+"0BmCyuvf7A","QWxoT580YD","lXFOB6q6L9","9XyT9Gv3Fq","5VZjScmXIX","lsQGoTa8f6","pmeCd9GXkX","XyPZN8hJdt","wiHrZpAhR1","7fsYMWreyP",
+"OxWIHkZANm","lj07QHlUbF","jSjS3hUTw7","aez9yK20wK","9eoRcdQ586","KASQ8fmIK1","8xEKzVLTy6","2TRI7RkQke","yToGWfcwDa","jfREuQnJ1S",
+"Zv7z0RzaZA","7X3uyIKxdL","3otm6dpe1v","HlUbFVBjhz","FPfSEzmLYD","DG4sTQWxoT","djsrvkZANm","CxVEffaHir","In3NSix74r","uJScXLewvM",
+"SmGzv29QAz","IjTwP0YAGH","TCgPpm4bxU","RpBQmuupzk","Zv7z00Kyfs","5Drn0FPfSE","m4bxUoQ87r","lpF6Wlj07Q","7Ow5CzQt6Q","FVMxoK4GS8",
+"uvf7Axciqp","mz8gxEOE1o","vkCHH9eoRc","9GXkXHzZT8","8FmFHxciqp","jiVBPjtn0X","WPmlxjtn0X","dQ586y94nw","djsrvW7cTs","YOfrYpiJSk",
+"zHF1q9y4lw","BCxeCWMiS3","0h1b1BCxeC","Ss0Zurhl0J","aL6AJDz1R3","8FmFHSs0Zu","No0QbqQxHP","Yh1hFv8yFN","HRxd8x3LDe","OUqFMBFkb8",
+"xciqpaL6AJ","NhXdulCMxy","ZUnqtwDajX","m4bxUQ6Lix","7hyVv0PktI","ZhwG1RkQke","lkMUAuPX7G","4W0Tl7lUXZ","lweGyBGaQY","0KyfsnFqik",
+"6q6L9yofH3","HlUbF55rfB","brhlQ48cHL","8hJdtdhSuH","bgJAz6q6L9","sqVrfzbIYY","Ta8f6YOfrY","oQ87riKqhr","9rlg9pmeCd","8RCUA5VZjS",
+"6AFT0lweGy","fqypyI7p2a","tvdkDHzZT8","l83UdzFgtB","48cHLpiJSk","RzaZApAhR1","jeskSYf2Ec","lweGy5nmWv","a00b5WMiS3","uAWypLbRTH",
+"hSSvQlm0pD","Vprf2QYxC0","ZhwG1uvf7A","zbIYY1LB1L","djsrvrKDLJ","fmIK1ru4UG","wDajX2Nslm","RzaZAQ6Lix","4QMc9pAhR1","t59lR9XyT9",
+"zqH0Wdjsrv","O3iyQv2eC3","d7vjMzQt6Q","he9IAvLsmS","nFqikSjskQ","iwzGkWreyP","VBjhzrKDLJ","cmXIXgdQsS","gdQsSyvOMI","7lUXZatef2",
+"0ao3l0Kyfs","l83Udjtn0X","Kr8yslm0pD","5ZaEzyToGW","TCgPpFLsph","2Nslms4786","v8yFNJIqXi","BGaQYxReec","uPX7G0PktI","P6bcg14FLR",
+"WreyPydG8U","BFkb84QMc9","m4bxUSWfou","OxWIHcL0aE","WaWsv0BmCy","FjHXR580YD","M6qcG2DREs","rKDLJtl72W","jzUqRP6bcg","xReecIRh48",
+"dmoS7UlU3M","wiHrZ55rfB","cL0aEvkCHH","guMb8Yw2oU","guMb8ZJTXH","3otm6Twano","SmGzvlViBv","blLA9fLNg8","he9IAJRJQB","JJs5m29QAz",
+"K4GS8RACuj","NhXdu7hyVv","fLNg8aDGtS","Twanov1Hln","5Drn0NAFuw","9y4lwFLsph","MaJQsJKWYR","nlaByMmsIo","DcpWBI7p2a","0Kyfs8FmFH",
+"1j5L8ZUnqt","24ARFni2v1","Y1mC0ni2v1","aFFssDcpWB","0ao3lBCxeC","QbxXcWMiS3","8U2nUhi5X7","2hEEU5VZjS","bgJAz7Ow5C","IjTwPiB08l",
+"1j5L8gf8rI","qUJMdv1Hln","WreyPYw2oU","xXTI4jfREu","48cHLdmoS7","55rfBn1pmO","LDk6fWreyP","TCgPpprNT6","uAWypU3yw5","MGlTFBbwgA",
+"7ku1p8cVD3","JKWYRM6qcG","ThjNn8TxD7","0YAGHzz4ZU","nlaBy5drc6","VLTy6nnP8o","zQt6Qy94nw","POUYSQ6hMC","HRxd8oVQp6","lsQGoFxX9q",
+"Q6LixOxWIH","W7cTslpF6W","LewvMsqVrf","0BmCyUvlv4","fmIK1h1zcH","CNHmvThjNn","Z4I1vtAOsr","NOHszs7Mxk","5drc6Mkgy8","oGu6xRsQUq",
+"M3zXL55rfB","v1Hln2DREs","lViBv7X3uy","ogLgc7Ow5C","xReecYjB9t","v2eC3pT8wu","G1RhSsqVrf","MaJQs8xEKz","bZLvSpFrrl","VerEA5Mg9r",
+"AkKTkYh1hF","0h1b1CqqaD","W3VFHyofH3","yofH38TxD7","EdBKcIRh48","jSjS3oVQp6","rKDLJlkMUA","0PktIMojnP","gtCA5qUJMd","OUqFMCxVEf",
+"rhl0JtAOsr","FPfSEpT8wu","s4786FxX9q","AkKTkXflUq","SmGzvBpYhV","29QAzKZamH","a00b5fmIK1","mz8gxv8yFN","atef27Ow5C","AkKTkgIYvE",
+"tjQxsYOfrY","XyPZNPb1pa","b29RJiqv4k","JJs5mI7p2a","IjTwPgjUTu","GWqqXXyPZN","FNYIMUvlv4","WreyPaFFss","VjCZqa00b5","RxrsmSjskQ",
+"16lHclCMxy","nFqikW3VFH","uTacx45cIH","2hEEUyvOMI","OHaBzNhXdu","Fhtgl5Mg9r","pWiOsyToGW","fcJOyY1mC0","DQimpqaofN","QYxC0rz7Ut",
+"C2IrcBpYhV","2DREsvkCHH","dmoS7EOE1o","FhtglSs0Zu","ThjNnqaofN","OHaBzfaHir","No0QbGv3Fq","zFgtBgf8rI","n8pJ9zz4ZU","TwanolH1kt",
+"lkMUAbZLvS","OUYuF14FLR","oGu6x4QMc9","xXTI4BGaQY","8hJdtvkCHH","DcpWBK4GS8","618Di8FmFH","IKxdLpv0i7","6AFT0djsrv","jfREugjUTu",
+"prNT6WreyP","s7MxkLDk6f","FwEJzmz8gx","EOE1oi7WMQ","5iGN5OHaBz","2ZHdk5iGN5","7fsYMReKEW","29QAzFwEJz","1j5L8DG4sT","KsjRKXyPZN",
+"VNCPdUlU3M","QworuXflUq","8hJdtpT8wu","ciuWzTCgPp","D6rByDcpWB","0PktI0BmCy","e6e4zyofH3","cL0aEaFFss","uAWypCqqaD","tAOsrjfREu",
+"lViBvPYBf4","gf8rI2ZHdk","v1HlneuZA5","M6qcGrKDLJ","ReKEWlCMxy","TCgPpgIYvE","lCMxyS2Dfu","l83UdjeskS","kB5nPaFFss","Yw2oUzbIYY",
+"8FmFHTwano","3otm6pvgjS","8FmFHIn3NS","ZhwG1SmGzv","JXljW7Ow5C","uQIczVerEA","FFDuiWmadA","IRh48HRxd8","GWqqXjtn0X","O3iyQNOHsz",
+"7fsYM0MR5X","5ZaEzYOfrY","hSSvQjtn0X","v8yFNgjUTu","MK07Y6q6L9","hE1QlTa8f6","JKWYR2hEEU","07n1cU3yw5","suY4xQClRL","StlDJHlUbF",
+"jS1ajTCgPp","uZPqgRsQUq","Y1mC0Chuy3","y94nwdhSuH","jS1ajOHaBz","s93MlAOgEe","VBjhzNOHsz","VNCPdTa8f6","W7cTs9GXkX","07n1cRxrsm",
+"RsQUqLDk6f","zFgtBOxWIH","d7vjM8RCUA","0ao3lFNYIM","JRJQBlj07Q","8RCUACp3mZ","oGu6x0MR5X","taOXK0Wr5y","5drc6NhXdu","l83Udru4UG",
+"SmGzv5Namm","qaofNZzJHW","iB08lzbIYY","lpF6Wl83Ud","lsQGoix74r","tvdkDWaWsv","zHF1qOz8yZ","dpe1vHlUbF","16lHc2Nslm","xciqpF6PT2",
+"v1HlncL0aE","lXFOBguMb8","7fsYMB3qem","qUJMdzY1GY","uvf7AkZANm","lkMUAzFgtB","JRJQBy94nw","BpYhVRpBQm","FhtglM6qcG","okgRizz4ZU",
+"cL0aE9iGoT","ix74rGWqqX","FwEJzCqqaD","uupzklpF6W","yEfy9pv0i7","07n1cuQIcz","zQt6QMK07Y","fFDrJxXTI4","uJScX7X3uy","2NslmhSSvQ",
+"h1zcHX6Pin","fmIK1MaJQs","xReecWaim6","qUJMdBpYhV","m4bxUHRxd8","fFDrJlViBv","djsrvvOqCE","J2mQiRxrsm","2hEEUZuDtD","G1RhSZUnqt",
+"1LB1LdhSuH","Ss0ZuZuDtD","ZUnqtulk41","CdyBVXyPZN","S2Dfu580YD","uN6r3I7p2a","U3yw5WaWsv","2ZHdkRkQke","LewvMnlaBy","FVMxoJkzUn",
+"AmdQduvf7A","okgRiRzaZA","6q6L9YOfrY","bgJAzogLgc","VerEA9y4lw","fcJOy8FmFH","n1pmOs93Ml","aL6AJvLsmS","QbxXcn1pmO","cShY2aL6AJ",
+"ZzJHW64s8N","iqv4kFLsph","zbIYYt59lR","aez9yAkKTk","1LB1Llm0pD","Chuy3pvgjS","iwzGklm0pD","hSSvQcShY2","Vprf2ZzJHW","VNCPdJkzUn",
+"Mkgy87fsYM","FjHXR55rfB","RpBQmaez9y","prNT6ulk41","lkMUAQClRL","9rlg9SjskQ","RkQkesqVrf","EoToPJkzUn","Q6hMCZUnqt","taOXK4W0Tl",
+"I7p2aD6rBy","5ZaEzokgRi","wiHrZAXpwE","OUYuF5Mg9r","Dz1R3Qworu","4dEz6FVMxo","xciqphSSvQ","lj07QVNCPd","2TRI7No0Qb","K4GS8yEfy9",
+"h1zcHQnJ1S","qUJMdwiHrZ","i3pydZuDtD","wDajXBCxeC","i7WMQBbwgA","SbRYy4W0Tl","JKWYR8RCUA","HlUbFtaOXK","sqVrflm0pD","iB08lsqVrf",
+"tlILt16lHc","cmXIXVLTy6","YOfrYLewvM","cmXIXbrhlQ","a00b5l83Ud","FFDuiyEfy9","Q6hMCB3qem","tl72WjSjS3","0KyfsECMvU","0h1b1oQ87r",
+"zQt6Q7lUXZ","Fhtglv8yFN","jtn0XdQ586","1LB1LQChxs","Uvlv4Qworu","LDk6fCp3mZ","AgJHQFNYIM","0BmCyDz1R3","pFrrllpF6W","ZhwG1JkzUn",
+"QbxXcrz7Ut","JkzUnk85Ae","4QMc95ZaEz","b29RJ14FLR","6AFT0bgJAz","vLsmSJ2mQi","iqv4kRzaZA","9eoRcnnP8o","uupzkqQxHP","vkCHHfcJOy",
+"Chuy3y94nw","7lUXZ3otm6","yToGWm4bxU","VBjhzZzJHW","dhSuHuoStw","L7cGcBpYhV","aFFssFPfSE","FxX9q55rfB","LDk6fi7WMQ","9eoRc580YD",
+"v2eC35Drn0","FVMxozmLYD","jiVBPvLsmS","y94nwjfREu","zQt6QQworu","YOfrYW3VFH","gf8rI6AFT0","WaWsvtAOsr","cShY2lH1kt","s93MlciuWz",
+"S77LHBGaQY","cmXIXhYBCK","5iGN5bZLvS","S77LHiwzGk","1v5hH7hyVv","cmXIX2Nslm","pFrrlI7p2a","uupzkMK07Y","TXQ0ZKr8ys","Dz1R3soy9t",
+"fmIK1uPX7G","uN6r3lm0pD","VLTy6gjUTu","WmadAQworu","1LB1LxXTI4","yluBxJKWYR","AIYUuJkzUn","gdQsSEoToP","WMiS3K4GS8","4W0TlIBe8k",
+"9rlg9brhlQ","Ss0Zuzz4ZU","48cHL2Nslm","iqv4kYOfrY","Vprf2Oz8yZ","0PktIQYxC0","45cIHjiVBP","pFrrl8U2nU","uTacx5Drn0","Waim6JRJQB",
+"piJSkYjB9t","FNYIMzFgtB","s93MlG1RhS","IKxdL5Drn0","HlUbFlViBv","14FLRRmDcr","POUYSfFDrJ","hi5X70MR5X","JXljWCdyBV","W3VFHuZPqg",
+"L7cGcJKWYR","I7p2apFrrl","k85AeMmsIo","VBjhzlViBv","ZUnqtatef2","SbRYylj07Q","KASQ8QWxoT","mX2GEQbxXc","e6e4zhYBCK","4W0TlGSQwj",
+"G1RhSulk41","C2IrcGrDg7","faHirZv7z0","fcJOylXFOB","faHir29QAz","IjTwPOxWIH","jfREuuvf7A","iwzGk55rfB","jSjS3MezSW","KsjRKaez9y",
+"yToGWVprf2","cQOnvvLsmS","0h1b1LbRTH","5Drn0QChxs","xReecfcJOy","WaWsvksJby","h1zcHK20wK","hE1Ql9rlg9","bgJAzHzZT8","1v5hH0h1b1",
+"vLsmSQssNC","Waim6ix74r","n1pmOIKxdL","v1HlnMezSW","1v5hHjSjS3","jeskSZv7z0","9iGoTYh1hF","5Mg9ruPX7G","fcwDaCIShG","QnJ1SzY1GY",
+"PYBf4uoStw","ZUnqtsoy9t","8TxD7W7cTs","wiHrZGv3Fq","jzUqRguMb8","O3iyQatef2","M3zXLt98iW","blLA9No0Qb","JJs5mUlU3M","GSQwjgf8rI",
+"8hJdtWPmlx","OUYuFFnPFB","Waim6AkKTk","vkCHHeuZA5","2TRI7DQimp","AkKTkOxWIH","K4GS82Nslm","rhl0Ji3pyd","48cHLQnJ1S","s7MxkciuWz",
+"ZhwG1ZhwG1","CqqaDbgJAz","Cfgr3WPmlx","jeskSix74r","7lUXZbrhlQ","C2Irc3otm6","HfyNQUlU3M","pvgjSlsQGo","DG4sTZuDtD","8hJdtQ6Lix",
+"IKxdLOUYuF","rKDLJGSQwj","dhSuH64s8N","5VZjSDLhzM","4dEz6fFDrJ","MojnPHfyNQ","JkzUnfcwDa","EdBKc0h1b1","yToGW0h1b1","xciqptlILt",
+"P6bcg5Mg9r","GSQwjReKEW","Qworu0YAGH","oVQp6IBe8k","2NslmDG4sT","uupzkFVMxo","2Yz7EPOUYS","NOHszB3qem","v2eC3Q6Lix","lsQGouN6r3",
+"jS1ajSmGzv","djsrvFcWrW","7lUXZs93Ml","K4GS8djsrv","55rfBMK07Y","sx5GlEOE1o","lViBvSWfou","ZhwG1HfyNQ","I7p2a618Di","hSSvQJXljW",
+"7fKYUNOHsz","FFDuiIjTwP","lXFOBVerEA","ZzJHWtlILt","5drc6zmLYD","L7cGcgjUTu","PYBf4HlUbF","580YDjtn0X","MK07YjfREu","ogLgcS2Dfu",
+"FxX9qVIlwP","CdyBVVprf2","FNYIMSWfou","pAhR1tuDyS","W7cTsRmDcr","SjskQqUJMd","brhlQ9XyT9","soy9tBbwgA","lViBvJkzUn","Z4I1vWPmlx",
+"zY1GYRBhp0","cmXIXsqVrf","45cIHBFkb8","9y4lw7lUXZ","iqv4kTCgPp","7fKYUksJby","0h1b1D6rBy","nnP8oyToGW","Chuy3QYxC0","v1HlnBGaQY",
+"3weIFUvlv4","55rfB9iGoT","1j5L8jtn0X","RkQkeXyPZN","7hyVvFjHXR","45cIH64s8N","IKxdLDz1R3","PYBf4EdBKc","pT8wuFjHXR","jfREuBCxeC",
+"VerEAsx5Gl","gjUTubrhlQ","0PktIuAWyp","29QAzjzUqR","fFDrJbrhlQ","okgRi9XyT9","ulk412hEEU","yofH3gf8rI","JKWYRAkKTk","9y4lwZUnqt",
+"uoStw0PktI","xciqpWMiS3","x3LDexReec","wDajXHRxd8","nnP8oJJs5m","JJs5mEOE1o","X6PingtCA5","Waim60YAGH","uN6r3OxWIH","VBjhz5nmWv",
+"cL0aEFVMxo","pWiOsPb1pa","GWqqXuAWyp","LewvMiKqhr","Mm8siCp3mZ","Cp3mZOUqFM","mz8gxD6rBy","ogLgc0BmCy","No0Qbru4UG","Ss0ZuMm8si",
+"7lUXZgdQsS","AkKTkIRh48","BbwgAOUYuF","BbwgAyluBx","dpe1vNo0Qb","xReecZhwG1","BCxeCNAFuw","AIYUu8hJdt","C2IrcNAFuw","gf8rICNHmv",
+"RxrsmSbRYy","RzaZAcShY2","X6Pinrhl0J","64s8NJXljW","DLhzMLbRTH","2DREsjeskS","tuDyS9XyT9","MaJQsGWqqX","v2eC3FnPFB","mz8gx9y4lw",
+"pmeCdtl72W","rz7UtLbRTH","jiVBPS2Dfu","9y4lwYOfrY","0ao3lYf2Ec","9rlg9Cp3mZ","o8UydNcICA","BCxeCru4UG","ydG8UiKqhr","MGlTFKASQ8",
+"blLA9POUYS","HlUbFD6rBy","580YDQssNC","t59lRVerEA","7fKYUzY1GY","faHirEoToP","0BmCylsQGo","5Mg9rFnPFB","KZamHC2Irc","Ul4a1xciqp",
+"rKDLJQnJ1S","ZzJHWDcpWB","zmLYDl83Ud","zbIYYhSSvQ","tAOsrJXljW","yEfy9i3pyd","NhXduNOHsz","o8Uyd4W0Tl","taOXKTXQ0Z","HlUbFKr8ys",
+"Mkgy8ReKEW","MK07YXflUq","t98iWQ6hMC","LewvM8FmFH","djsrvM3zXL","uvf7A29QAz","Dz1R3zbIYY","zz4ZUFFDui","FnPFBMojnP","uvf7AIn3NS",
+"ogLgcJKWYR","pT8wun8pJ9","6AFT05iGN5","2hEEUh1zcH","guMb8Pb1pa","jeskSKsjRK","sqVrf1LB1L","pv0i7Mm8si","5Drn0OUqFM","U3yw5OxWIH",
+"DcpWBfcwDa","FGzgpWPmlx","0BmCypiJSk","fcwDa8TxD7","0BmCyJkzUn","oVQp6AIYUu","Y1mC0StlDJ","nnP8o4dEz6","hUTw7soy9t","7ku1p7fsYM",
+"VIlwP2TRI7","8hJdtFNYIM","vOqCEcmXIX","nnP8oMm8si","BpYhVbZLvS","RmDcruQIcz","ZhwG1lweGy","24ARF2Nslm","JKWYROz8yZ","vOqCEFnPFB",
+"oVQp6qaofN","F6PT2qaofN","K20wKhSSvQ","v1HlnFLsph","vLsmSjSjS3","rhl0Jn1pmO","D6rByCqqaD","faHirGv3Fq","55rfBkB5nP","S77LHNo0Qb",
+"5ZaEzwDajX","7fKYUOUYuF","RkQkekZANm","Zv7z0JJs5m","B3qemzz4ZU","Gv3Fqgf8rI","yofH3WPmlx","0ao3lMojnP","pWiOsQnJ1S","vLsmSi3pyd",
+"KsjRKs93Ml","7hyVv2hEEU","ZuDtDaL6AJ","dhSuHgdQsS","m4bxUW7cTs","hYBCKxXTI4","YOfrY0h1b1","atef2Qworu","tlILtjtn0X","Nxx9VQworu",
+"QWxoT1j5L8","lkMUA5VZjS","QWxoTjzUqR","taOXKJKWYR","TwanoZuDtD","5NammRkQke","dpe1vjtn0X","0BmCyPYBf4","jfREuQChxs","6AFT0mX2GE",
+"RkQkeFNYIM","sx5Gl5Drn0","NOHsz14FLR","h1zcHdQ586","ZzJHWvkCHH","XyPZNCNHmv","QChxslj07Q","soy9tXyPZN","FxX9qCNHmv","BbwgAUl4a1",
+"AmdQdZ4I1v","ciuWzs7Mxk","Pb1paFPfSE","S2DfuCdyBV","RBhp08TxD7","9eoRchE1Ql","WmadAIBe8k","NcICAQnJ1S","EdBKcVBjhz","TCgPpQChxs",
+"StlDJ07n1c","7Ow5CNAFuw","GrDg79iGoT","s93MlcL0aE","5IhmGRACuj","BGaQY5ZaEz","xciqp5Mg9r","he9IAix74r","okgRiYw2oU","uAWypQClRL",
+"3otm6dmoS7","1j5L8ru4UG","0BmCyt98iW","FnPFBVBjhz","Z4I1vrhl0J","uvf7AMaJQs","Kr8ysGv3Fq","GSQwjFjHXR","t98iWW7cTs","RzaZAxXTI4",
+"KASQ89XyT9","aL6AJBbwgA","he9IAUvlv4","lm0pDokgRi","Dz1R34QMc9","OHaBzEdBKc","618DiBbwgA","oGu6xP6bcg","WmadAFhtgl","O3iyQG1RhS",
+"tAOsrRmDcr","OUYuFeuZA5","v8yFNIn3NS","vkCHH8xEKz","gf8rIXyPZN","6q6L9pv0i7","pAhR1RpBQm","RmDcrpiJSk","1LB1LVBjhz","48cHLOxWIH",
+"Vprf2DcpWB","FNYIMWPmlx","uTacxQClRL","9y4lwgdQsS","Q6Lix48cHL","oVQp6s4786","ciuWzdjsrv","fcwDasqVrf","zmLYDs7Mxk","lH1ktl83Ud",
+"QClRLKsjRK","4QMc9BbwgA","lpF6WVNCPd","AgJHQblLA9","sqVrf24ARF","tlILtpmeCd","AgJHQ16lHc","SbRYy5Drn0","y94nw45cIH","16lHc7ku1p",
+"Qworu5ZaEz","v8yFN1v5hH","azIWp5iGN5","0h1b1fFDrJ","No0QbyluBx","QbxXcHlUbF","5drc6IBe8k","07n1cpmeCd","JXljWs7Mxk","7lUXZNOHsz",
+"MGlTFD6rBy","IjTwPCfgr3","VerEAzQt6Q","BCxeCgIYvE","JKWYRBCxeC","dmoS7mz8gx","IRh48Ss0Zu","jSjS3oQ87r","QbxXcsx5Gl","Pb1paMmsIo",
+"FjHXRtAOsr","aDGtS0ao3l","SjskQX6Pin","tl72WQbxXc","AmdQdHfyNQ","cQOnv5nmWv","atef2uAWyp","rhl0J8cVD3","4dEz69eoRc","i3pydIBe8k",
+"uPX7GfcwDa","3otm6hYBCK","cL0aE8FmFH","CxVEfQworu","nnP8ofmIK1","yEfy9gIYvE","fcJOytvdkD","UmaEv2Nslm","5IhmGfcJOy","lpF6WiwzGk",
+"zmLYDJXljW","FFDui618Di","M3zXLm4bxU","gIYvEokgRi","NOHszkZANm","5drc6kZANm","SWfouTwano","8cVD3zFgtB","tuDySAOgEe","2NslmNcICA",
+"QYxC0Nxx9V","14FLRm4bxU","P6bcgv8yFN","XyPZNs93Ml","oQ87rQChxs","gdQsS8cVD3","vkCHHKsjRK","tl72WzQt6Q","QssNC7fsYM","5ZaEz0ao3l",
+"dpe1vUlU3M","QChxsOUYuF","ZzJHWn8pJ9","cL0aEwDajX","bgJAzpvgjS","QssNCxXTI4","QnJ1SfLNg8","tjQxst59lR","AXpwExXTI4","taOXKHP433",
+"ydG8U9iGoT","dmoS7Qworu","pT8wugdQsS","ECMvUbZLvS","brhlQnlaBy","Gv3FqLewvM","i7WMQ2hEEU","X6PinblLA9","aL6AJYf2Ec","aez9yW7cTs",
+"kB5nP8cVD3","9rlg9Pb1pa","dhSuHgf8rI","QClRLuoStw","D6rByGWqqX","jtn0XPb1pa","lweGyRkQke","pFrrlNhXdu","faHireuZA5","D6rBy4QMc9",
+"RzaZADQimp","gf8rIOxWIH","fFDrJPOUYS","Gv3Fqi7WMQ","TCgPpRmDcr","0YAGHgdQsS","rKDLJa00b5","4dEz60PktI","d85a9tuDyS","gtCA5zQt6Q",
+"P6bcg3weIF","IKxdLZUnqt","pFrrlQworu","8U2nUJJs5m","W3VFHZv7z0","0BmCy24ARF","JJs5mSWfou","soy9tO3iyQ","RkQkeQssNC","uvf7AvkCHH",
+"580YDyofH3","No0QbFhtgl","G1RhSa00b5","VLTy6FGzgp","U3yw5kB5nP","d7vjMtaOXK","XflUqSs0Zu","Ul4a1djsrv","prNT6BFkb8","FLsphFxX9q",
+"jtn0X2ZHdk","OHaBzi7WMQ","JJs5m0PktI","ZJTXHMGlTF","5iGN50YAGH","yluBxBCxeC","pFrrl3weIF","CqqaDHRxd8","580YDLDk6f","yvOMI07n1c",
+"bgJAzXflUq","Kr8ys45cIH","IRh48I7p2a","5Mg9rPYBf4","lkMUAtuDyS","AIYUul83Ud","IBe8knlaBy","pvgjSfqypy","DLhzM2Nslm","n1pmOFhtgl",
+"TwanoNxx9V","9GXkXl83Ud","Kr8ys0MR5X","W7cTsn1pmO","pv0i7blLA9","suY4xMm8si","FFDuiIKxdL","nlaByVerEA","qUJMds93Ml","2Yz7EzHF1q",
+"VBjhzGrDg7","I7p2aksJby","n1pmOsqVrf","8hJdtRsQUq","FwEJzJJs5m","s7Mxkzz4ZU","VNCPdkB5nP","14FLRdQ586","k85AevkCHH","ydG8UlViBv",
+"J2mQis4786","d7vjMF6PT2","NcICAAkKTk","SWfoufcwDa","Cfgr3uPX7G","ni2v1ZzJHW","EoToPNxx9V","StlDJh1zcH","UmaEvlkMUA","tvdkDni2v1",
+"cL0aESjskQ","cL0aECIShG","uoStwdjsrv","Vprf20h1b1","vLsmSFFDui","2Yz7EEdBKc","pvgjSgf8rI","K4GS8iwzGk","suY4xuN6r3","14FLRQbxXc",
+"yofH3fmIK1","hUTw7QYxC0","Chuy3MojnP","ru4UGMojnP","oVQp6iqv4k","DcpWBkZANm","t59lRe6e4z","MK07YMezSW","aDGtSdjsrv","y94nwuAWyp",
+"J2mQiMmKGJ","JkzUn55rfB","JRJQBrz7Ut","6AFT0TCgPp","OUqFMjtn0X","ni2v1Ul4a1","LewvMLbRTH","QClRLdpe1v","VLTy6Uvlv4","6AFT0sx5Gl",
+"UlU3MsuY4x","0KyfsEoToP","MezSW8RCUA","GXdoHkZANm","580YDyToGW","lsQGoTwano","atef2n8pJ9","aez9yJkzUn","Z4I1v8FmFH","K4GS8ZzJHW",
+"euZA5yToGW","Yh1hF1v5hH","OxWIHNOHsz","jtn0XYw2oU","I7p2aTa8f6","rKDLJ8RCUA","ECMvUD6rBy","64s8NX6Pin","Z4I1vBbwgA","BbwgA5ZaEz",
+"jSjS3wDajX","lweGyNhXdu","ReKEW5Drn0","NcICAKr8ys","4QMc9zqH0W","pv0i7SWfou","s4786xReec","D6rByRkQke","mX2GEdhSuH","W3VFHmz8gx",
+"FxX9qYOfrY","8hJdttjQxs","9GXkXEdBKc","3weIFgtCA5","Vprf2jtn0X","8TxD7FxX9q","7Ow5C9iGoT","ZzJHWZJTXH","WPmlx5VZjS","yEfy9zY1GY",
+"U3yw5ZJTXH","UlU3M5IhmG","wiHrZjfREu","DLhzMyEfy9","uoStwWmadA","gdQsSlj07Q","pAhR114FLR","HP433ksJby","iB08l7fsYM","U3yw5CqqaD",
+"EdBKc8U2nU","tlILtydG8U","pmeCdjiVBP","HzZT8xciqp","Nxx9V5Mg9r","5drc60Kyfs","M3zXL0h1b1","tlILtOHaBz","zQt6QQ6Lix","EdBKc7X3uy",
+"QClRL0BmCy","QWxoTt98iW","8RCUA07n1c","YOfrYQYxC0","RsQUqWmadA","ksJbyQbxXc","GrDg7jSjS3","ydG8UQ6hMC","iqv4kn8pJ9","DcpWBBCxeC",
+"tAOsrrhl0J","J2mQid7vjM","CIShGzbIYY","M6qcGVNCPd","qaofNVerEA","MGlTF5iGN5","UmaEvuvf7A","zqH0WCp3mZ","Q6Lix8hJdt","MmKGJFhtgl",
+"soy9tIBe8k","X6PintaOXK","DQimpoVQp6","Y1mC0fFDrJ","3otm6MaJQs","CNHmvd85a9","aez9yJIqXi","StlDJvLsmS","PYBf4ni2v1","GSQwjaFFss",
+"DG4sT0YAGH","FcWrWUlU3M","0BmCyJ2mQi","RpBQmPOUYS","sqVrf0PktI","1LB1L0BmCy","i3pydlj07Q","FNYIM55rfB","0ao3li3pyd","ZuDtDStlDJ",
+"GSQwjQWxoT","8xEKzuupzk","618DiQnJ1S","iwzGkS2Dfu","fcJOyOUqFM","2DREsFjHXR","ZuDtDPYBf4","CqqaDlm0pD","JJs5ms4786","PYBf4yToGW",
+"fmIK1VBjhz","Qworuuvf7A","SmGzvrhl0J","WDVWJwDajX","s93MlFNYIM","djsrvjiVBP","i7WMQRmDcr","24ARFLewvM","5iGN5lj07Q","mX2GELewvM",
+"I7p2a64s8N","nFqik5ZaEz","8xEKzECMvU","2TRI7okgRi","pT8wu7ku1p","hE1QluoStw","Twanoe6e4z","48cHLQ6Lix","sx5GlMojnP","Q6hMCRzaZA",
+"ZzJHWBpYhV","HfyNQnFqik","b29RJx3LDe","kB5nPhE1Ql","5iGN5fqypy","O3iyQs4786","IBe8kbrhlQ","nFqikWPmlx","UmaEvl83Ud","dpe1vtaOXK",
+"I7p2aCp3mZ","MmKGJGSQwj","NAFuwWPmlx","Gv3FqNAFuw","azIWpydG8U","VjCZqpv0i7","FxX9qoVQp6","DQimpTCgPp","rhl0JnnP8o","Dz1R34dEz6",
+"NcICA618Di","brhlQNAFuw","IBe8kUmaEv","nFqikCfgr3","4dEz6zY1GY","FxX9qRsQUq","EOE1ouTacx","fFDrJRACuj","In3NSlm0pD","OHaBzlkMUA",
+"rKDLJoGu6x","ZuDtDS2Dfu","fmIK1uvf7A","QChxsgjUTu","WPmlxL7cGc","OUqFMk85Ae","4W0TlStlDJ","fmIK1Z4I1v","jeskSaL6AJ","s93MlsqVrf",
+"rz7UtMGlTF","AmdQdpmeCd","wiHrZI7p2a","uLtKsdhSuH","Mkgy87ku1p","QClRLQ6hMC","K20wK7hyVv","5iGN5jS1aj","uZPqgJKWYR","YjB9tsqVrf",
+"24ARFd85a9","CNHmvbgJAz","gdQsSn1pmO","WmadAXyPZN","ni2v1LewvM","48cHLRBhp0","6AFT0Q6hMC","0ao3l9GXkX","IKxdL29QAz","vLsmScL0aE",
+"vkCHHTa8f6","NcICAIjTwP","MmKGJfLNg8","cShY2okgRi","Dz1R3No0Qb","W3VFHQ6hMC","LbRTHo8Uyd","OHaBzAOgEe","x3LDe9y4lw","BGaQYKsjRK",
+"zmLYD5ZaEz","nnP8ogdQsS","PYBf4ix74r","7ku1pt98iW","XflUqKASQ8","pmeCd9y4lw","VBjhzMGlTF","wiHrZzmLYD","i7WMQIBe8k","hSSvQIKxdL",
+"JKWYRC2Irc","KsjRKCfgr3","pmeCdGrDg7","24ARFCNHmv","0MR5XlViBv","8U2nUZ4I1v","Y1mC06AFT0","0MR5XHRxd8","iwzGkoVQp6","16lHckZANm",
+"yToGWnlaBy","BFkb81j5L8","KASQ8GrDg7","rhl0JkZANm","WaWsv9y4lw","yEfy98U2nU","W3VFHMK07Y","AXpwEru4UG","XyPZNh1zcH","pvgjSMm8si",
+"pvgjSLbRTH","QChxs8U2nU","1v5hHCIShG","FcWrWRzaZA","FxX9qwDajX","OUqFM0h1b1","WaWsvoVQp6","YjB9tgIYvE","6AFT0618Di","QbxXcl83Ud",
+"IjTwPNhXdu","B3qemWMiS3","dQ5868cVD3","prNT6yluBx","v8yFNTXQ0Z","t98iWt59lR","1j5L87Ow5C","fqypyIjTwP","3weIFaez9y","BbwgAYjB9t",
+"EoToPjiVBP","BCxeCTwano","0YAGHjtn0X","xXTI4o8Uyd","RxrsmaL6AJ","KASQ8QYxC0","uupzkIjTwP","5NammNAFuw","Cfgr3Waim6","QssNCQworu",
+"Twano9eoRc","tl72WblLA9","KASQ8ydG8U","Ta8f6tlILt","azIWpFwEJz","tjQxscL0aE","UlU3MNOHsz","5Nammy94nw","a00b5Zv7z0","RkQkeGXdoH",
+"kZANmGv3Fq","LbRTHuPX7G","Uvlv4n1pmO","YjB9tuN6r3","tlILtuQIcz","tAOsrsoy9t","S77LHtvdkD","8FmFHZv7z0","mz8gx1j5L8","JIqXi64s8N",
+"8xEKz55rfB","aFFssVprf2","nnP8ogIYvE","0BmCyMaJQs","ZuDtDazIWp","Yh1hFtjQxs","7fsYMa00b5","o8Uyd0Kyfs","29QAzZv7z0","fqypydmoS7",
+"CK5W7fLNg8","5iGN5aFFss","ReKEWTa8f6","SmGzvCxVEf","n8pJ9pmeCd","TwanoHRxd8","jiVBPn8pJ9","OUYuFP6bcg","guMb8jzUqR","pv0i79GXkX",
+"oQ87rW7cTs","y94nwdQ586","XyPZNRBhp0","ZJTXH3otm6","d7vjMdpe1v","he9IAqQxHP","rKDLJaDGtS","lH1ktvOqCE","k85AeMezSW","Vprf20ao3l",
+"CK5W7atef2","QChxsMojnP","S2Dfuy94nw","QChxsDG4sT","Cfgr3XyPZN","ni2v1MGlTF","qUJMduupzk","mX2GEVprf2","OUYuFtl72W","FLsphd7vjM",
+"FwEJzAXpwE","8hJdtlCMxy","FNYIM2DREs","9GXkX45cIH","VNCPdIBe8k","ThjNny94nw","FhtglZzJHW","F6PT2taOXK","zHF1qpv0i7","14FLRJKWYR",
+"FnPFBsx5Gl","5ZaEzVjCZq","wDajXQClRL","oQ87r4W0Tl","2NslmoVQp6","SWfouRkQke","aL6AJiB08l","xXTI4nlaBy","h1zcHW7cTs","Chuy3JXljW",
+"RBhp0UmaEv","cL0aEgdQsS","zY1GY7fsYM","fFDrJDcpWB","QWxoTuvf7A","8hJdt4dEz6","QssNCy94nw","qUJMdPb1pa","Yf2EcNo0Qb","HlUbFEOE1o",
+"RxrsmFwEJz","mz8gxQssNC","HlUbFP6bcg","PYBf4nFqik","SjskQKr8ys","cQOnvS77LH","3otm6Yf2Ec","ZhwG1zY1GY","Q6LixciuWz","WMiS3MGlTF",
+"RkQkev1Hln","ni2v1KZamH","atef2HRxd8","taOXKUl4a1","mX2GEm4bxU","ZUnqtzY1GY","dQ586Uvlv4","lXFOB9XyT9","atef2uupzk","0KyfsK20wK",
+"CIShGuQIcz","iwzGkJkzUn","Yh1hFix74r","CK5W7Uvlv4","FLsphyvOMI","jfREu9eoRc","jSjS3zmLYD","nnP8omz8gx","0h1b1tjQxs","i7WMQwiHrZ",
+"7fKYU2TRI7","0MR5Xh1zcH","8cVD35drc6","jfREuRACuj","n1pmOYh1hF","M3zXLFhtgl","7ku1pVBjhz","7ku1pMGlTF","AIYUu2Yz7E","K20wKzQt6Q",
+"Ul4a1taOXK","nnP8oBpYhV","zHF1qECMvU","HRxd8Ta8f6","F6PT2J2mQi","YOfrYOUqFM","2NslmRACuj","FcWrWyofH3","IjTwPUmaEv","FGzgpUlU3M",
+"SjskQs7Mxk","HfyNQ8U2nU","0PktIyofH3","8U2nUmz8gx","i7WMQ5Mg9r","yluBxW3VFH","14FLR9eoRc","5iGN5uZPqg","Ul4a1rKDLJ","v1HlnnFqik",
+"5drc6zz4ZU","DG4sTRmDcr","n8pJ9MaJQs","yofH3nFqik","nlaBySbRYy","tAOsrSWfou","0PktIjzUqR","QbxXc0MR5X","VBjhzWPmlx","IBe8khE1Ql",
+"MojnPFGzgp","TXQ0Z16lHc","WDVWJLDk6f","aDGtStjQxs","FnPFBEdBKc","BFkb8X6Pin","a00b57Ow5C","5Drn0pv0i7","WPmlxQssNC","FhtglU3yw5",
+"VIlwPWPmlx","5VZjStuDyS","NcICAHP433","lweGytlILt","FVMxoyEfy9","RzaZAJRJQB","YjB9tChuy3","djsrvAOgEe","WMiS3JIqXi","Nxx9VQYxC0",
+"Yh1hFUlU3M","gIYvEtaOXK","tl72W7X3uy","OUYuFY1mC0","TCgPpoVQp6","ZzJHWhi5X7","SbRYy9y4lw","3weIFDQimp","JIqXiM3zXL","n1pmOOxWIH",
+"BpYhVCxVEf","VjCZqyEfy9","WmadAFxX9q","FjHXRoVQp6","HP433fFDrJ","s4786v8yFN","Ul4a11LB1L","W7cTsJKWYR","FjHXRgjUTu","2TRI7uvf7A",
+"UlU3MKASQ8","W3VFHThjNn","VjCZqOz8yZ","zFgtB8xEKz","GrDg7ciuWz","dhSuHpFrrl","TwanoLbRTH","e6e4zlweGy","RmDcrQClRL","i7WMQJXljW",
+"uZPqgF6PT2","8FmFHMojnP","NAFuwvLsmS","ogLgc0Kyfs","Nxx9VDLhzM","y94nwQWxoT","k85Ae2TRI7","LDk6fMkgy8","BCxeCZJTXH","CxVEfCK5W7",
+"e6e4ztjQxs","Oz8yZjSjS3","FcWrWZhwG1","7Ow5CMGlTF","580YDoVQp6","HzZT8CdyBV","iB08lpAhR1","qUJMdWmadA","J2mQi6q6L9","MmsIoCxVEf",
+"aL6AJgjUTu","lViBv5drc6","cShY2v1Hln","Kr8ysguMb8","zqH0WECMvU","Q6hMChSSvQ","EdBKcs4786","dhSuHpmeCd","5ZaEzNcICA","B3qemM3zXL",
+"ulk41oQ87r","uoStwsoy9t","7fKYU1LB1L","HlUbFdpe1v","b29RJ4QMc9","DLhzMDG4sT","C2IrcSs0Zu","WaWsv7hyVv","wDajXlj07Q","M6qcGHRxd8",
+"gf8rIFFDui","uupzkxXTI4","1j5L8xciqp","qUJMdMkgy8","4QMc9HzZT8","lm0pD2hEEU","WMiS3QbxXc","VerEAMGlTF","jiVBPzFgtB","piJSkt59lR",
+"prNT6ECMvU","jeskSFwEJz","v1Hlniqv4k","Nxx9V0MR5X","l83UdtaOXK","QworuKsjRK","64s8Ns4786","FVMxo8TxD7","2Nslm618Di","yluBxlCMxy",
+"cL0aE24ARF","KsjRKDcpWB","RxrsmQYxC0","2TRI7ydG8U","oQ87rZUnqt","2Yz7E4W0Tl","Yh1hFoQ87r","SmGzvuQIcz","5ZaEzuAWyp","ZJTXHcL0aE",
+"0h1b1HlUbF","4QMc9JIqXi","D6rByyofH3","AXpwE3otm6","48cHLMm8si","5Drn0CqqaD","t59lRLDk6f","DQimpdjsrv","ThjNnDz1R3","fmIK1LbRTH",
+"faHirn1pmO","ydG8Upv0i7","CqqaDDcpWB","QChxs618Di","9eoRcLewvM","xXTI4uTacx","ZJTXHpAhR1","Zv7z0IjTwP","RpBQmyvOMI","VLTy6iB08l",
+"pT8wuEoToP","Rxrsm29QAz","aFFssUmaEv","sx5GllViBv","MGlTFhUTw7","k85Ae2Nslm","VBjhz9y4lw","SmGzvlweGy","RpBQmAIYUu","jzUqRD6rBy",
+"pvgjShe9IA","tl72WRxrsm","pWiOsYw2oU","zmLYDMGlTF","xXTI4lm0pD","0ao3lOz8yZ","EOE1oNcICA","b29RJtaOXK","16lHci3pyd","VLTy6oQ87r",
+"1j5L8Q6hMC","kB5nPlweGy","AIYUuRzaZA","D6rByazIWp","EOE1oFcWrW","uLtKsmz8gx","StlDJlweGy","JkzUnb29RJ","uPX7Gv2eC3","rhl0JNAFuw",
+"vLsmSlweGy","No0QbMmKGJ","ReKEWQ6hMC","aFFss8hJdt","cQOnvVBjhz","2TRI7ECMvU","LDk6f2Yz7E","vLsmSfFDrJ","StlDJSmGzv","yluBxU3yw5",
+"ThjNnCp3mZ","UlU3MSbRYy","HzZT8yvOMI","1LB1LGSQwj","yToGWlweGy","4W0TlQ6hMC","EOE1oEOE1o","W3VFH7fsYM","QYxC0xXTI4","RpBQmzY1GY",
+"0BmCyRzaZA","xXTI4I7p2a","IBe8kMmKGJ","EoToPv8yFN","Yf2EccL0aE","yluBxFFDui","v2eC3gIYvE","RACujNxx9V","WDVWJhUTw7","0MR5XPYBf4",
+"tlILtgtCA5","ZhwG1uJScX","QClRLiwzGk","CIShG9GXkX","580YDpT8wu","rhl0Js4786","FwEJzNo0Qb","DLhzM8FmFH","2NslmqaofN","EOE1o48cHL",
+"7X3uyCIShG","IKxdLMmsIo","fqypyO3iyQ","EoToPOz8yZ","yofH3azIWp","EoToPPOUYS","DQimpMm8si","GXdoH5iGN5","uupzkXyPZN","djsrvECMvU",
+"jzUqRpFrrl","rhl0JIBe8k","dmoS77lUXZ","0Wr5ys93Ml","DcpWBMkgy8","9iGoTAmdQd","8xEKz0PktI","djsrvhe9IA","uTacxKZamH","HRxd8uN6r3",
+"0MR5XM6qcG","gf8rIyEfy9","piJSkEdBKc","IBe8kZv7z0","BCxeCTa8f6","QYxC0iwzGk","k85AeCfgr3","blLA9WDVWJ","Uvlv4nnP8o","1j5L8Uvlv4",
+"Uvlv448cHL","JIqXidQ586","1v5hHHzZT8","X6PinIKxdL","aFFss5IhmG","UlU3MFPfSE","atef2RzaZA","Zv7z0zbIYY","jS1ajTwano","LDk6fhYBCK",
+"zQt6Q5ZaEz","o8UydzmLYD","29QAzl83Ud","BpYhVpAhR1","W3VFHHRxd8","jtn0X8cVD3","GWqqXP6bcg","48cHL3otm6","J2mQiBbwgA","L7cGcQClRL",
+"GrDg7zz4ZU","9y4lwJ2mQi","cQOnvWMiS3","tuDySdQ586","0MR5Xs4786","1j5L8a00b5","ogLgcCqqaD","lH1kt16lHc","IKxdL618Di","QYxC0s7Mxk",
+"HfyNQQnJ1S","RmDcr8RCUA","KZamHrz7Ut","tvdkDMK07Y","prNT6rhl0J","5IhmG4QMc9","O3iyQ8U2nU","yEfy9C2Irc","8RCUA9XyT9","9GXkXI7p2a",
+"wDajXAgJHQ","No0QboQ87r","sqVrfIn3NS","e6e4zqQxHP","8RCUAzQt6Q","v1HlnDLhzM","lkMUAru4UG","VIlwPYh1hF","OUYuFIKxdL","cmXIX8RCUA",
+"StlDJBFkb8","RpBQmpFrrl","mz8gxsoy9t","a00b5m4bxU","ZzJHWFhtgl","OUqFM5iGN5","FVMxoGv3Fq","o8Uydt59lR","sqVrfQworu","pFrrlUlU3M",
+"cL0aEAOgEe","pv0i7dpe1v","7X3uyBpYhV","WPmlx0ao3l","uTacxFjHXR","uN6r3KZamH","gtCA5CK5W7","HfyNQNhXdu","t98iWFGzgp","Cfgr3yluBx",
+"wiHrZuoStw","ciuWzVNCPd","ThjNnmX2GE","h1zcHhi5X7","GSQwjSbRYy","14FLRpWiOs","uvf7AjeskS","aFFssuoStw","ciuWzQChxs","BGaQYWreyP",
+"t59lR4QMc9","lweGyjzUqR","HlUbFVprf2","ulk41aDGtS","2TRI7rz7Ut","7lUXZOHaBz","8RCUAsuY4x","HfyNQDz1R3","xciqpaFFss","ZhwG145cIH",
+"2NslmZJTXH","s4786MmsIo","ZhwG1cL0aE","L7cGcpv0i7","qaofNzY1GY","7lUXZhYBCK","No0QbnnP8o","prNT6hSSvQ","FPfSErz7Ut","RBhp0wiHrZ",
+"BbwgAs7Mxk","HlUbFuupzk","1v5hHdmoS7","jtn0Xatef2","Yf2EcRzaZA","I7p2a9y4lw","sqVrfFhtgl","lCMxyYOfrY","Pb1pamz8gx","5nmWv5Drn0",
+"6q6L9xciqp","ZuDtDZv7z0","zmLYDP6bcg","lkMUA9GXkX","wiHrZyofH3","CqqaDQworu","YOfrYxciqp","7fsYMZ4I1v","pT8wu6q6L9","P6bcglH1kt",
+"KsjRKfqypy","yluBxWaim6","MGlTF2DREs","0YAGH0Kyfs","fFDrJgIYvE","gjUTuM6qcG","HzZT8hSSvQ","uTacxn1pmO","KZamHbZLvS","guMb8xXTI4",
+"WMiS3guMb8","oGu6xEdBKc","lkMUANcICA","Mkgy8bZLvS","6AFT00PktI","S2DfuKsjRK","24ARFjzUqR","FjHXRl83Ud","faHirFVMxo","KsjRKOHaBz",
+"ogLgcprNT6","XyPZN4dEz6","fqypysqVrf","0ao3logLgc","3weIFYw2oU","ydG8UW3VFH","ix74rdmoS7","8xEKzMkgy8","i3pyd7hyVv","ReKEWlViBv",
+"J2mQiYf2Ec","euZA5Y1mC0","ix74rpiJSk","2Yz7EfcwDa","No0QboVQp6","s93MlAgJHQ","ru4UG9XyT9","UlU3M7lUXZ","Rxrsm48cHL","RsQUqFwEJz",
+"VLTy66q6L9","aez9yFxX9q","55rfBuJScX","PYBf4zbIYY","fcJOyAmdQd","Waim624ARF","tuDySvOqCE","48cHLtvdkD","l83Uda00b5","W7cTsDG4sT",
+"4W0TlfFDrJ","xXTI4QnJ1S","Q6hMCTwano","LewvMkB5nP","TwanoAIYUu","vOqCEdhSuH","jiVBP8TxD7","rKDLJFhtgl","In3NStlILt","QbxXcIRh48",
+"618Di9rlg9","TXQ0ZyofH3","TXQ0Z8U2nU","RzaZAOz8yZ","No0QbuPX7G","0BmCyCp3mZ","pv0i7TXQ0Z","bZLvSMojnP","MojnPsx5Gl","Nxx9Vv8yFN",
+"1j5L8CqqaD","WMiS364s8N","VBjhzC2Irc","VerEAD6rBy","s7Mxkx3LDe","brhlQFcWrW","aez9yLbRTH","W7cTsrKDLJ","mX2GESbRYy","WDVWJVjCZq",
+"B3qemLbRTH","iKqhrru4UG","QYxC0lsQGo","8TxD7IRh48","ReKEWtuDyS","0BmCy0h1b1","tl72W48cHL","GWqqXhYBCK","MmsIo7fsYM","vkCHHFLsph",
+"64s8NtAOsr","djsrvFVMxo","y94nwK20wK","ReKEWyvOMI","FwEJzCfgr3","UmaEvsx5Gl","d7vjMzz4ZU","GSQwjL7cGc","jtn0X9rlg9","Cfgr3fcJOy",
+"x3LDeFNYIM","uoStwzFgtB","DcpWBtaOXK","suY4xYw2oU","Ta8f6d7vjM","1v5hHZJTXH","d85a9OUYuF","VjCZqMaJQs","X6PinBGaQY","UlU3MbrhlQ",
+"5IhmGEOE1o","tuDyS0ao3l","hUTw7Oz8yZ","POUYSpiJSk","ZJTXHoQ87r","vOqCEQbxXc","S77LHtjQxs","OUqFMjzUqR","fqypy2DREs","6q6L9Ul4a1",
+"sx5GlQYxC0","ydG8U5Namm","8RCUAYw2oU","8RCUAPb1pa","55rfBKr8ys","7X3uyo8Uyd","W3VFHKr8ys","Mm8sigIYvE","Cfgr3rKDLJ","y94nw5ZaEz",
+"pT8wuru4UG","TCgPpO3iyQ","0h1b1VLTy6","kZANmOz8yZ","TCgPpU3yw5","8U2nUsqVrf","SbRYy0MR5X","Rxrsm8xEKz","nFqikRpBQm","8U2nUVjCZq",
+"8FmFHQYxC0","s93MluoStw","9GXkXVLTy6","BCxeCtAOsr","jtn0XCNHmv","J2mQijfREu","4W0TlMaJQs","BCxeC8cVD3","mX2GEiqv4k","aFFssfqypy",
+"brhlQuoStw","lpF6WtAOsr","ECMvU5Drn0","tjQxsokgRi","K4GS8JRJQB","uN6r3lpF6W","fFDrJCdyBV","OHaBzzz4ZU","t98iWCfgr3","0BmCyLbRTH",
+"lH1ktzQt6Q","AgJHQFFDui","pmeCd7fsYM","4dEz6ydG8U","pAhR1atef2","TXQ0ZhUTw7","zqH0Wv8yFN","MGlTFlCMxy","VNCPdprNT6","cQOnvgdQsS",
+"m4bxU7X3uy","jS1ajqUJMd","rz7UtEdBKc","RzaZAgf8rI","BCxeCjeskS","FxX9qpT8wu","s7Mxk4QMc9","16lHchi5X7","okgRiAIYUu","o8Uydn8pJ9",
+"guMb8faHir","QClRLzz4ZU","0PktIzmLYD","JkzUnwiHrZ","AmdQdF6PT2","nlaByuJScX","uTacxiKqhr","s7MxkEdBKc","sx5GlDcpWB","WreyPCdyBV",
+"AOgEerKDLJ","ix74rlH1kt","IKxdLEOE1o","ThjNn0YAGH","tAOsrQssNC","RsQUq1LB1L","lkMUAPYBf4","YOfrYzmLYD","uLtKsQ6Lix","Chuy3lpF6W",
+"RACujh1zcH","W3VFHlj07Q","Pb1paSbRYy","oGu6xjiVBP","QssNCQWxoT","ogLgcwiHrZ","aDGtSUl4a1","AkKTkix74r","7lUXZrKDLJ","WPmlxVBjhz",
+"Y1mC06q6L9","S77LHlViBv","lCMxytvdkD","2hEEU3weIF","iKqhrNAFuw","ZUnqt5Drn0","jiVBPXflUq","ciuWzbZLvS","GrDg7hE1Ql","StlDJpiJSk",
+"4QMc9CdyBV","piJSkHP433","MaJQsFhtgl","zFgtBix74r","Ta8f60Wr5y","WmadA7fsYM","UlU3M0ao3l","GXdoHzqH0W","ZuDtDQbxXc","FVMxoWaWsv",
+"aL6AJTXQ0Z","OxWIH9iGoT","8RCUAoQ87r","tlILtnnP8o","nFqikHP433","cShY2XyPZN","J2mQiMkgy8","6AFT0soy9t","he9IAK4GS8","JIqXi24ARF",
+"VIlwPkZANm","SjskQkB5nP","NOHszMm8si","UmaEvaL6AJ","9eoRcJXljW","hSSvQ618Di","FGzgpG1RhS","d85a9soy9t","S2DfuMaJQs","okgRiZhwG1",
+"Vprf2StlDJ","ciuWzdpe1v","FPfSEtlILt","P6bcgoVQp6","fmIK1Y1mC0","lH1ktv8yFN","lkMUAhYBCK","v2eC3NhXdu","GSQwjcL0aE","OUqFMStlDJ",
+"fFDrJe6e4z","yofH3x3LDe","yToGWlH1kt","CK5W7brhlQ","2hEEUFFDui","QChxsBCxeC","Ss0Zu07n1c","uupzk7X3uy","uTacxThjNn","W3VFHMezSW",
+"hE1QloGu6x","blLA9DcpWB","hSSvQ5ZaEz","okgRiyEfy9","CxVEfQYxC0","SjskQgIYvE","pv0i7jtn0X","jiVBPF6PT2","Q6hMCK20wK","yToGWnnP8o",
+"8hJdtguMb8","zQt6Q24ARF","Yf2EcCNHmv","aDGtSMojnP","07n1cMkgy8","2ZHdkECMvU","nFqikWaim6","soy9taFFss","JKWYRi3pyd","wiHrZfcJOy",
+"kB5nPGSQwj","fcJOyxXTI4","5drc6AmdQd","ZuDtDKZamH","QbxXcAmdQd","lkMUALbRTH","Q6Lix24ARF","Chuy3uvf7A","uTacx0h1b1","Ul4a1SjskQ",
+"4QMc9FNYIM","JJs5mBbwgA","RACuj8U2nU","cQOnvyToGW","t59lRThjNn","iqv4kKsjRK","KASQ8lsQGo","CIShGDQimp","tl72WGWqqX","No0Qbo8Uyd",
+"618DijzUqR","4dEz607n1c","2hEEUDG4sT","Oz8yZguMb8","7lUXZZJTXH","BGaQYtaOXK","euZA5SjskQ","Pb1pa5nmWv","POUYSlH1kt","5nmWviwzGk",
+"HRxd8NAFuw","1LB1Lb29RJ","kZANm0PktI","NOHsztvdkD","ZJTXHyToGW","Yf2Ec8TxD7","5NammJIqXi","b29RJCp3mZ","IjTwPzz4ZU","UlU3MyToGW",
+"ReKEWzbIYY","kB5nP5VZjS","ZhwG1jS1aj","t98iWpWiOs","UlU3M8cVD3","a00b5Dz1R3","QWxoTFFDui","8U2nUHRxd8","NAFuweuZA5","Waim67X3uy",
+"6q6L9Mkgy8","JKWYRSmGzv","uvf7Ai3pyd","CIShGxXTI4","8U2nUP6bcg","5Drn0lm0pD","b29RJydG8U","ZUnqtTCgPp","Mm8sivOqCE","Yw2oUVprf2",
+"FxX9qd85a9","RzaZAydG8U","8xEKzQ6hMC","FnPFBWaim6","JRJQB0Wr5y","JKWYR2Nslm","1j5L8CNHmv","azIWpNo0Qb","Q6hMC5VZjS","IBe8kOz8yZ",
+"FPfSEn8pJ9","29QAz5Drn0","VBjhzaDGtS","4W0TliB08l","jfREuB3qem","VNCPdYh1hF","0PktIlweGy","XflUqMGlTF","kB5nPGv3Fq","l83UdoGu6x",
+"AgJHQoVQp6","rz7UtjfREu","l83UdFjHXR","5VZjS4W0Tl","XflUquvf7A","QChxs1j5L8","oGu6xjSjS3","qQxHPRzaZA","zQt6QuoStw","Oz8yZRkQke",
+"vLsmSxciqp","HRxd80Kyfs","MK07Y2ZHdk","HfyNQVprf2","Waim69y4lw","piJSkCNHmv","ECMvUaDGtS","cQOnvnnP8o","JIqXiS2Dfu","JkzUnv2eC3",
+"8TxD7StlDJ","guMb8SjskQ","dQ5861j5L8","5IhmGDz1R3","POUYSCfgr3","dmoS7ix74r","zHF1qpvgjS","9iGoTX6Pin","hSSvQbrhlQ","Yw2oUW3VFH",
+"EdBKcECMvU","lkMUAx3LDe","Fhtgll83Ud","14FLR64s8N","qQxHP9y4lw","uQIczhYBCK","fmIK1DG4sT","HRxd8MojnP","CqqaDokgRi","WPmlx5Mg9r",
+"s93MlwiHrZ","LDk6fyvOMI","QClRL8hJdt","Yf2Ec5VZjS","piJSkNo0Qb","YOfrYo8Uyd","bZLvSZuDtD","Ta8f6VLTy6","0ao3lbgJAz","45cIHVjCZq",
+"fqypyRkQke","0h1b16AFT0","soy9toGu6x","hSSvQnFqik","hE1QlQ6hMC","AOgEeuZPqg","sqVrfZUnqt","gdQsSuTacx","7ku1pAXpwE","n8pJ9y94nw",
+"5ZaEzyofH3","SjskQNo0Qb","StlDJ64s8N","0ao3lFFDui","JRJQBd85a9","HzZT8ni2v1","Ss0ZuwDajX","guMb8a00b5","GXdoHEOE1o","4dEz6tjQxs",
+"BCxeCFwEJz","Pb1pao8Uyd","e6e4zd7vjM","GSQwj2Yz7E","QbxXcPb1pa","DLhzM8TxD7","prNT6EoToP","DQimpAXpwE","VIlwPoGu6x","WaWsv9iGoT",
+"BbwgADG4sT","TCgPps93Ml","uoStwXyPZN","MGlTF0PktI","zqH0WS2Dfu","BCxeClCMxy","ni2v1qQxHP","K4GS8vkCHH","Gv3Fqhe9IA","dhSuHfmIK1",
+"pvgjSjeskS","7lUXZFVMxo","Pb1pa7fKYU","tuDySdjsrv","zbIYY64s8N","ru4UG7hyVv","OUYuF5Namm","P6bcgGWqqX","Mkgy8QChxs","wDajXtlILt",
+"uAWypQworu","mX2GEM3zXL","C2IrcogLgc","K20wKAIYUu","rz7UtKr8ys","qUJMdpvgjS","yofH3k85Ae","zmLYDn8pJ9","JXljWM3zXL","AgJHQpT8wu",
+"6AFT0D6rBy","SbRYyBGaQY","0MR5XfaHir","pFrrlIRh48","s4786StlDJ","WmadA7lUXZ","uQIczQYxC0","WreyPRsQUq","e6e4zGv3Fq","pvgjSulk41",
+"vLsmSYf2Ec","faHiruJScX","X6PingIYvE","gtCA5FPfSE","soy9tuZPqg","lCMxypAhR1","pmeCd7X3uy","5IhmGy94nw","fLNg8MaJQs","fLNg8rhl0J",
+"QssNCn1pmO","zmLYD9XyT9","ReKEWJkzUn","L7cGcThjNn","Q6LixydG8U","e6e4zhUTw7","lj07QRkQke","euZA5tlILt","2Yz7E0YAGH","9GXkXn8pJ9",
+"ix74rP6bcg","iB08lDQimp","rz7UtnlaBy","Qworut59lR","yvOMIJRJQB","jiVBPatef2","aL6AJksJby","yluBx2hEEU","Kr8ysJ2mQi","UlU3MMmKGJ",
+"KASQ8y94nw","d85a91j5L8","WDVWJpmeCd","0Wr5yF6PT2","S77LHFnPFB","BbwgA2hEEU","uoStwtuDyS","BbwgAdmoS7","Ta8f6BpYhV","ni2v1No0Qb",
+"hi5X7Yf2Ec","fmIK1FGzgp","LewvM580YD","lkMUA580YD","jS1ajZ4I1v","vkCHHuZPqg","VLTy6zY1GY","GrDg7L7cGc","yvOMIhSSvQ","FxX9qKsjRK",
+"Waim65nmWv","IKxdLdmoS7","Q6Lix14FLR","Ul4a1Twano","cL0aEFhtgl","FGzgpOHaBz","S2DfupFrrl","oQ87rFVMxo","16lHcsuY4x","mz8gxGSQwj",
+"FwEJzkB5nP","EOE1orKDLJ","jSjS3nFqik","sqVrfMojnP","0ao3lDG4sT","fcwDaW3VFH","KASQ8FjHXR","zHF1qnFqik","ciuWzGWqqX","8TxD7C2Irc",
+"i3pydfLNg8","FhtglKZamH","8cVD30Wr5y","djsrviqv4k","vLsmS8hJdt","8cVD3tjQxs","GSQwjjiVBP","B3qemZuDtD","soy9tJXljW","pT8wuCIShG",
+"hE1QlU3yw5","pvgjSI7p2a","AmdQdZUnqt","jSjS3nnP8o","9eoRcprNT6","m4bxU5IhmG","ZhwG1S77LH","EoToPFGzgp","FPfSEOxWIH","zY1GYvLsmS",
+"x3LDeNhXdu","xReecMm8si","qQxHPuPX7G","GrDg7ZuDtD","AOgEeBbwgA","Rxrsm16lHc","y94nwGSQwj","LDk6frz7Ut","brhlQKASQ8","gf8rIAOgEe",
+"lkMUAsx5Gl","F6PT2TXQ0Z","iwzGk0PktI","8RCUAFVMxo","MaJQsMkgy8","2DREsuTacx","JJs5mjzUqR","9XyT9KsjRK","QworuqaofN","vOqCES77LH",
+"KsjRK9GXkX","AkKTkMmsIo","4W0TlQWxoT","48cHLtAOsr","1j5L8Kr8ys","prNT6IjTwP","TCgPplsQGo","7X3uyEOE1o","ECMvUSmGzv","07n1c1j5L8",
+"4dEz6TCgPp","Yw2oU8hJdt","TCgPplm0pD","kZANmsqVrf","lj07Q9GXkX","NOHszh1zcH","F6PT2BbwgA","Cp3mZ14FLR","1v5hHM3zXL","v2eC3nlaBy",
+"4QMc9AIYUu","dmoS7gf8rI","Pb1pa2Yz7E","8U2nUqQxHP","uupzktjQxs","HlUbF0YAGH","Q6Lix2Nslm","C2IrcEoToP","CIShG24ARF","oGu6xRACuj",
+"nlaByfaHir","aL6AJPOUYS","jS1ajtaOXK","oGu6xyvOMI","FxX9qCIShG","tlILt618Di","5nmWvpT8wu","dQ586M3zXL","IjTwP4QMc9","zbIYYuoStw",
+"Cfgr3UmaEv","HlUbF2Nslm","Q6Lixhe9IA","bZLvSoGu6x","SbRYydpe1v","StlDJMojnP","OUYuFuAWyp","QnJ1S16lHc","Dz1R3MmKGJ","8xEKzZhwG1",
+"VerEAo8Uyd","9GXkXBbwgA","QssNCLDk6f","FGzgphUTw7","fcJOy64s8N","Oz8yZWaWsv","pT8wuRxrsm","lsQGozmLYD","mz8gxKASQ8","fqypy580YD",
+"8FmFHJRJQB","AXpwEEoToP","dQ586FLsph","8U2nUAXpwE","MGlTFFhtgl","iB08lprNT6","YOfrYI7p2a","MK07YwDajX","dpe1vAmdQd","sqVrf7ku1p",
+"a00b55nmWv","Chuy3JRJQB","lkMUAIKxdL","Kr8ysSmGzv","pv0i7lj07Q","zY1GYnnP8o","3weIFDG4sT","vLsmSk85Ae","uoStwFjHXR","24ARFgf8rI",
+"3otm6Yw2oU","prNT6WPmlx","aFFssPYBf4","jtn0XMmsIo","ECMvUtuDyS","Chuy3VLTy6","G1RhS0PktI","ru4UGzbIYY","oVQp6CdyBV","JIqXipFrrl",
+"uAWypRzaZA","ru4UGQWxoT","s7MxkYf2Ec","Oz8yZQssNC","faHirIBe8k","DLhzM0PktI","hE1Ql4dEz6","TwanoPOUYS","9rlg9DG4sT","uvf7AuJScX",
+"FcWrWhYBCK","MaJQsbgJAz","8FmFHJkzUn","tvdkDiwzGk","0BmCyh1zcH","iqv4kNhXdu","lXFOBWaWsv","zFgtBzFgtB","Q6LixgtCA5","Nxx9VjSjS3",
+"ZuDtD14FLR","ZUnqtjS1aj","KZamH5Mg9r","djsrv0YAGH","0PktIpmeCd","0Wr5yuupzk","lkMUATXQ0Z","tl72Wru4UG","piJSkqUJMd","lj07Qzz4ZU",
+"Cp3mZhi5X7","3weIFRkQke","RsQUq5Namm","brhlQMezSW","uupzkd85a9","AOgEe5ZaEz","VjCZqCIShG","tuDySNOHsz","uQIczZuDtD","n1pmOS77LH",
+"uvf7A0Wr5y","6AFT07hyVv","Zv7z0o8Uyd","2DREsoVQp6","uQIczMK07Y","NcICAn1pmO","GrDg7i3pyd","ni2v1jS1aj","8U2nUZzJHW","Chuy30BmCy",
+"cL0aEuAWyp","5Drn0TCgPp","ydG8U8hJdt","WreyPTwano","he9IADQimp","gjUTuMezSW","LewvM0MR5X","7hyVvydG8U","t59lRulk41","No0QbQbxXc",
+"CK5W7l83Ud","QChxs7X3uy","gf8rIUvlv4","QnJ1SWreyP","SjskQyToGW","pmeCdn8pJ9","ZzJHWFPfSE","14FLRsqVrf","0PktI64s8N","HP433BFkb8",
+"RBhp0aL6AJ","AmdQdv1Hln","55rfBxReec","gtCA5v1Hln","0ao3lI7p2a","pAhR1x3LDe","6AFT0lCMxy","RzaZASjskQ","oGu6xprNT6","WDVWJAIYUu",
+"OUqFMS2Dfu","gIYvEzz4ZU","a00b5EoToP","uLtKsmX2GE","gf8rI9GXkX","BCxeC2hEEU","ZUnqt0ao3l","yluBxs93Ml","KsjRK7fsYM","MK07Y7X3uy",
+"RBhp007n1c","JXljWWmadA","oVQp6D6rBy","LDk6fP6bcg","kB5nPGXdoH","O3iyQsoy9t","FjHXRksJby","s93MlVjCZq","L7cGcprNT6","4QMc9zHF1q",
+"hYBCKaL6AJ","faHirIRh48","U3yw5jfREu","UlU3MK4GS8","LewvMt98iW","W7cTsYh1hF","4QMc95VZjS","RpBQmm4bxU","hSSvQpT8wu","n8pJ9wiHrZ",
+"nFqikiKqhr","Cfgr3v8yFN","FxX9ql83Ud","W7cTsCfgr3","MGlTFcShY2","55rfBfcJOy","QChxsblLA9","MezSWcQOnv","GrDg7FwEJz","mz8gxZuDtD",
+"5drc6xReec","kZANmtuDyS","MojnPAkKTk","kB5nPv8yFN","HzZT848cHL","fqypyFPfSE","ZhwG1tlILt","Pb1paZv7z0","ZJTXHtuDyS","gtCA5Ta8f6",
+"In3NSfmIK1","h1zcHVIlwP","JRJQBm4bxU","h1zcH8RCUA","GSQwjUvlv4","uPX7GCNHmv","45cIHulk41","bgJAzv2eC3","zHF1qS2Dfu","QworuMaJQs",
+"S77LH07n1c","dQ586uLtKs","NhXduWDVWJ","9iGoTo8Uyd","Oz8yZWaim6","uAWypaL6AJ","Vprf2piJSk","pWiOs5VZjS","dQ586JRJQB","FFDuiaez9y",
+"AIYUu580YD","Vprf2fqypy","ru4UGVIlwP","BCxeCn1pmO","b29RJ0ao3l","hE1Ql29QAz","S2DfuNo0Qb","uZPqgru4UG","StlDJzbIYY","P6bcgJIqXi",
+"rhl0J618Di","WPmlxe6e4z","lm0pDjS1aj","hUTw7hSSvQ","QworugIYvE","v2eC3tuDyS","8hJdtQworu","EoToPFxX9q","7X3uyCxVEf","n8pJ9Y1mC0",
+"NhXdudpe1v","zbIYYZv7z0","uvf7A5IhmG","8hJdtaL6AJ","n8pJ9prNT6","K4GS8ix74r","hSSvQ55rfB","OUqFMRACuj","TXQ0ZfmIK1","YOfrYYh1hF",
+"hE1QluPX7G","CdyBVuAWyp","pv0i7pv0i7","29QAzd85a9","VNCPdDQimp","l83Ud0MR5X","9GXkXKr8ys","o8UydzQt6Q","MmKGJHfyNQ","oQ87rAXpwE",
+"0PktIzz4ZU","AkKTkgf8rI","5iGN5vkCHH","0Wr5yWreyP","nFqikUvlv4","ulk41lweGy","In3NSBCxeC","YjB9tOHaBz","pT8wupAhR1","fcwDajzUqR",
+"FhtglMGlTF","B3qemjS1aj","zmLYD5iGN5","GXdoHpvgjS","LewvM5Namm","iwzGkQWxoT","VerEAs93Ml","hSSvQaL6AJ","vOqCEpvgjS","7X3uyYOfrY",
+"nnP8ofaHir","Yh1hFhe9IA","fcJOyjtn0X","iB08l2Yz7E","cShY2Chuy3","5VZjStAOsr","lViBvulk41","xReecRBhp0","wDajXJ2mQi","sx5Glix74r",
+"OHaBz8xEKz","IRh48Twano","nnP8o8xEKz","OUYuFoVQp6","4QMc9fcwDa","i7WMQZhwG1","Y1mC0NAFuw","SWfouFFDui","pv0i7uN6r3","b29RJBFkb8",
+"lsQGobgJAz","5drc6ZUnqt","KASQ8FGzgp","FjHXRlH1kt","hSSvQQbxXc","uQIczlXFOB","MmsIoOUqFM","tlILtgIYvE","b29RJpv0i7","dQ5863weIF",
+"5iGN53otm6","EdBKcNcICA","iB08luJScX","9GXkX1LB1L","7fsYMrz7Ut","pvgjSrz7Ut","0h1b1RmDcr","Ss0ZufLNg8","W7cTslj07Q","sx5GlM6qcG",
+"CxVEfTwano","Q6LixvkCHH","BCxeCs7Mxk","WDVWJiwzGk","h1zcHNhXdu","nFqikblLA9","s93MlhYBCK","n8pJ9dQ586","XyPZNJIqXi","07n1c0Kyfs",
+"aez9yJRJQB","v8yFN48cHL","i3pydyofH3","TXQ0ZyToGW","vOqCEVLTy6","FVMxopFrrl","guMb8lm0pD","MojnP8cVD3","WDVWJaFFss","ksJbyuTacx",
+"aez9yaez9y","VLTy6C2Irc","FnPFBMkgy8","9rlg9SbRYy","5Mg9rnnP8o","U3yw5VjCZq","euZA5yofH3","pvgjSs4786","7fKYUxReec","618DiQClRL",
+"9eoRc64s8N","qUJMdpWiOs","Dz1R3cmXIX","StlDJWMiS3","JIqXi5Drn0","0MR5XogLgc","lCMxyAXpwE","zmLYDuZPqg","uZPqgCdyBV","okgRiGrDg7",
+"iB08lZv7z0","cShY2i7WMQ","29QAz1v5hH","ogLgcuLtKs","M3zXLlkMUA","AgJHQqUJMd","SbRYy8cVD3","FLsphAmdQd","lsQGoxXTI4","VNCPdVerEA",
+"zQt6Qdpe1v","4W0TljzUqR","DQimpzqH0W","HP433qUJMd","lweGyQWxoT","LDk6f0Kyfs","07n1cTCgPp","5NammpWiOs","9GXkXCxVEf","s7MxklkMUA",
+"9iGoT5drc6","atef2guMb8","faHir4W0Tl","Cfgr3i3pyd","xciqpiqv4k","e6e4zI7p2a","ECMvUDQimp","580YDWmadA","jS1aj2TRI7","J2mQiatef2",
+"he9IAMmKGJ","CxVEfVprf2","POUYSokgRi","d7vjMlj07Q","xciqpgdQsS","s4786cQOnv","U3yw5bgJAz","pv0i7vOqCE","B3qembrhlQ","JXljWix74r",
+"ni2v1zmLYD","ZhwG1ZzJHW","MGlTFxciqp","8U2nUZUnqt","QWxoTzz4ZU","dQ586nlaBy","B3qemEOE1o","LewvMAkKTk","Uvlv4SjskQ","WaWsvx3LDe",
+"9GXkXZuDtD","6AFT00MR5X","jS1ajK20wK","7fKYUcmXIX","lj07QWreyP","PYBf4yEfy9","SmGzvFPfSE","oVQp6PYBf4","ReKEWK4GS8","8xEKzyvOMI",
+"ZzJHWDQimp","OHaBz2ZHdk","C2IrcNhXdu","YOfrYt59lR","MaJQsrKDLJ","QnJ1SWDVWJ","KASQ8ECMvU","6q6L9lXFOB","jiVBPyofH3","B3qemC2Irc",
+"StlDJIBe8k","qaofNNo0Qb","h1zcHQChxs","gdQsSKASQ8","QworuZhwG1","FjHXRB3qem","AgJHQhSSvQ","QChxspmeCd","M6qcGAkKTk","fLNg8AkKTk",
+"okgRiMaJQs","ZJTXHuQIcz","DQimpUmaEv","8FmFHaDGtS","QnJ1SRsQUq","1j5L8zbIYY","QChxsSjskQ","QClRL0MR5X","Mkgy8tuDyS","UmaEvgf8rI",
+"ogLgcv2eC3","0ao3li7WMQ","0BmCyfcwDa","hYBCKt98iW","rz7UtJXljW","O3iyQIBe8k","1v5hHlweGy","XyPZNaez9y","ReKEWm4bxU","Fhtgls7Mxk",
+"6AFT0nnP8o","In3NSatef2","v8yFNWmadA","DLhzMZv7z0","RACujRmDcr","faHirfqypy","k85AejSjS3","Mm8si2Nslm","7hyVvZ4I1v","gtCA5ksJby",
+"P6bcgnnP8o","8U2nU8xEKz","2TRI7UlU3M","F6PT29y4lw","mX2GEv8yFN","ulk41pT8wu","bZLvSsoy9t","ZUnqtYf2Ec","zbIYY8xEKz","tAOsrZhwG1",
+"gtCA5taOXK","piJSkulk41","Waim6zz4ZU","OUYuF8hJdt","dhSuHXflUq","lCMxyfaHir","WreyPd7vjM","6AFT0GSQwj","3weIFulk41","fcwDaJ2mQi",
+"2ZHdkt98iW","1LB1L7hyVv","3weIFt98iW","brhlQdjsrv","MezSWGXdoH","lpF6WuQIcz","pvgjS5nmWv","DG4sTZUnqt","ksJbyIRh48","UmaEvjSjS3",
+"BCxeCrz7Ut","GWqqX55rfB","HP433W7cTs","MaJQsxXTI4","Cp3mZ9iGoT","CIShG64s8N","d7vjMRxrsm","KsjRKWPmlx","W7cTsYw2oU","ydG8UdmoS7",
+"L7cGcDLhzM","8U2nUThjNn","wDajXzz4ZU","ulk415iGN5","5iGN5UmaEv","8TxD7JkzUn","7X3uybZLvS","Mm8sit59lR","FcWrWOHaBz","ZUnqth1zcH",
+"WMiS3GWqqX","jSjS3hi5X7","MojnPjiVBP","8xEKzuN6r3","K4GS8tlILt","pAhR1uN6r3","RxrsmGrDg7","WmadAyofH3","ZzJHW5iGN5","v1HlnzQt6Q",
+"9XyT9dQ586","k85Ae07n1c","RkQkezFgtB","jfREu0BmCy","v1HlntlILt","7X3uyMaJQs","QworuRzaZA","MK07YaDGtS","9eoRcWDVWJ","gIYvEMK07Y",
+"5IhmGNhXdu","ZzJHWBGaQY","ReKEWAOgEe","55rfBQ6Lix","M6qcGix74r","aez9y5ZaEz","07n1csuY4x","5ZaEzaDGtS","2ZHdkjzUqR","0PktIIKxdL",
+"d7vjMWmadA","fcwDa5Drn0","k85AeXflUq","GSQwjFVMxo","Yw2oUNOHsz","IjTwPRxrsm","tjQxs7hyVv","GrDg7lkMUA","FPfSE2Nslm","uQIczGSQwj",
+"x3LDerhl0J","O3iyQ0Wr5y","QssNCyluBx","rhl0JyToGW","7fsYMW7cTs","CK5W7blLA9","StlDJiB08l","azIWp14FLR","jSjS35ZaEz","brhlQt59lR",
+"RmDcrMaJQs","QYxC0oVQp6","6q6L9StlDJ","2hEEUXyPZN","HfyNQlpF6W","WmadAfqypy","5nmWv8U2nU","OHaBzksJby","VIlwPK20wK","uLtKsaDGtS",
+"blLA9b29RJ","Cfgr3Yh1hF","FLsph2TRI7","tl72Wsx5Gl","jS1ajbZLvS","RpBQmzbIYY","oVQp6cQOnv","G1RhSfcJOy","P6bcgWaWsv","DLhzMZzJHW",
+"zFgtBlpF6W","xReecazIWp","1v5hHCK5W7","mz8gxFnPFB","Oz8yZfFDrJ","9XyT9Cfgr3","FxX9qUmaEv","IjTwPL7cGc","Zv7z00MR5X","JJs5mzFgtB",
+"580YDFxX9q","azIWpaFFss","Nxx9VQ6hMC","FcWrWo8Uyd","FwEJzuTacx","v2eC3d7vjM","PYBf4WmadA","k85AetlILt","RsQUq2DREs","aDGtSTCgPp",
+"jiVBPpv0i7","8U2nUwiHrZ","qaofNDLhzM","mz8gxtlILt","he9IAcShY2","MmsIoEdBKc","gdQsSRmDcr","mX2GE9y4lw","MK07YFVMxo","zqH0WRzaZA",
+"lj07QP6bcg","uZPqgQ6hMC","WreyPokgRi","S2DfutAOsr","7X3uyNhXdu","GrDg7KZamH","W3VFHcmXIX","QClRLnlaBy","HlUbFS77LH","lViBvIBe8k",
+"S77LHBCxeC","RmDcrChuy3","hi5X7XyPZN","RpBQm0PktI","Yh1hFRkQke","D6rBygf8rI","lCMxy7fKYU","uJScXi7WMQ","k85AebgJAz","sqVrfuLtKs",
+"qQxHPHP433","KASQ8pvgjS","ni2v1pmeCd","Q6hMCEOE1o","gjUTuP6bcg","Yw2oUS77LH","ZzJHWhUTw7","O3iyQOHaBz","AgJHQKASQ8","lViBvWaWsv",
+"StlDJlj07Q","8TxD70Kyfs","DG4sTuLtKs","L7cGcAkKTk","C2Irce6e4z","BGaQYM3zXL","MmKGJtAOsr","lj07QBGaQY","hYBCKuAWyp","GXdoHK20wK",
+"QssNClViBv","YOfrY0BmCy","qaofNECMvU","5IhmGdpe1v","LewvMQbxXc","Ss0ZuXyPZN","HzZT8BbwgA","Mkgy8StlDJ","jzUqRHlUbF","ReKEWCdyBV",
+"9iGoTlViBv","2hEEUCK5W7","Mm8siCNHmv","JkzUntuDyS","fcJOyRBhp0","Vprf2kB5nP","euZA5QWxoT","ydG8UYf2Ec","0h1b1RACuj","uZPqgjiVBP",
+"uTacxlkMUA","KZamHPYBf4","FLsphVBjhz","Mkgy8azIWp","LewvM6AFT0","SmGzvcShY2","5Drn0suY4x","JRJQBpiJSk","oQ87r2hEEU","QbxXcL7cGc",
+"CNHmvTa8f6","OHaBzuJScX","SjskQpAhR1","IKxdLS2Dfu","M6qcGGrDg7","14FLR7lUXZ","d85a9yToGW","CK5W7Kr8ys","i3pydtvdkD","iKqhrQClRL",
+"8RCUAF6PT2","tjQxsS2Dfu","cmXIXZJTXH","No0QbGrDg7","mz8gxJ2mQi","Ss0Zudjsrv","zFgtBSmGzv","JIqXiOxWIH","TCgPpCxVEf","Mkgy8JIqXi",
+"aFFss6q6L9","cShY2zqH0W","jzUqRB3qem","qUJMdiwzGk","sx5GlgIYvE","Cfgr3pT8wu","7ku1pfmIK1","pAhR1ZUnqt","lkMUAogLgc","HP433RzaZA",
+"kB5nPTCgPp","djsrvNxx9V","8hJdtBFkb8","pT8wuRsQUq","QworuHzZT8","MK07Yt59lR","x3LDeUl4a1","1LB1L2TRI7","CdyBVt59lR","CNHmv4W0Tl",
+"G1RhShYBCK","5ZaEzWreyP","Gv3Fqt98iW","WreyPjiVBP","prNT6Zv7z0","euZA5CxVEf","Kr8ysQ6hMC","LewvMzz4ZU","W3VFHzz4ZU","Vprf2uupzk",
+"RACuj5Mg9r","okgRi0ao3l","rhl0Jmz8gx","prNT6HP433","FcWrWuvf7A","CqqaDlXFOB","v1HlnbrhlQ","NOHszfqypy","oVQp6SjskQ","W7cTskB5nP",
+"lweGys93Ml","Ta8f6IBe8k","bgJAzaez9y","OUqFMK20wK","FNYIMChuy3","MmsIoMezSW","atef2P6bcg","yToGWECMvU","0Wr5y0MR5X","Z4I1vzqH0W",
+"JKWYRF6PT2","cQOnvfmIK1","LDk6fzY1GY","FcWrWDG4sT","h1zcHfaHir","yluBxfcwDa","EoToPMmsIo","9iGoTUlU3M","kB5nPgjUTu","48cHLiwzGk",
+"UlU3MBpYhV","CK5W7JKWYR","4dEz60YAGH","9eoRc0PktI","KASQ8qaofN","faHirFcWrW","618DihYBCK","7fsYMQ6hMC","ZuDtDY1mC0","sqVrfpiJSk",
+"MojnPFnPFB","S2DfuvOqCE","ru4UGt98iW","guMb8fFDrJ","AkKTkUlU3M","P6bcgChuy3","0BmCyFPfSE","lweGyMGlTF","618DiYh1hF","VLTy6gIYvE",
+"Yh1hFZ4I1v","NhXdulweGy","rz7UtCdyBV","lm0pDqaofN","pT8wuhi5X7","RACujUmaEv","dhSuHB3qem","TwanoUmaEv","zz4ZUM3zXL","WmadAHfyNQ",
+"Cp3mZbrhlQ","Chuy3RBhp0","tjQxs29QAz","No0QbNOHsz","7fKYUqaofN","RpBQmBbwgA","sqVrfaFFss","LDk6fWaim6","Pb1pa7fsYM","lsQGooQ87r",
+"nFqikZ4I1v","B3qemEdBKc","NOHsz3otm6","a00b58FmFH","rhl0JlCMxy","GrDg7P6bcg","29QAzzQt6Q","QssNCwDajX","jS1ajlH1kt","v8yFNvkCHH",
+"v2eC3W7cTs","D6rByO3iyQ","G1RhSCqqaD","euZA59eoRc","pFrrlPYBf4","IRh48jfREu","uQIczVjCZq","aDGtSnFqik","JXljWeuZA5","nlaBycL0aE",
+"xXTI4GWqqX","Q6LixWreyP","2Yz7El83Ud","okgRizbIYY","sqVrfvLsmS","MmsIolpF6W","QworueuZA5","3weIFcQOnv","d7vjMs93Ml","Twanol83Ud",
+"14FLRKASQ8","DQimpuoStw","0YAGHO3iyQ","QClRLO3iyQ","s7MxkoQ87r","HzZT8WPmlx","9eoRcCp3mZ","ciuWzKZamH","OxWIHGrDg7","Oz8yZ618Di",
+"IKxdLY1mC0","K4GS8MGlTF","fFDrJZ4I1v","l83UdOUqFM","HP433yEfy9","Qworu5iGN5","cQOnvnlaBy","Waim6uQIcz","29QAzDLhzM","FwEJzi7WMQ",
+"Nxx9VyofH3","cShY29iGoT","2NslmFNYIM","TCgPpnFqik","soy9t24ARF","07n1cG1RhS","U3yw5xciqp","yluBxlpF6W","Oz8yZJ2mQi","GrDg7W7cTs",
+"iqv4kVjCZq","7ku1pfLNg8","o8UydBpYhV","1j5L8atef2","TXQ0ZRzaZA","M6qcGdmoS7","8TxD7yofH3","pFrrlwiHrZ","CNHmvqUJMd","1LB1L2ZHdk",
+"RBhp0lsQGo","Mkgy8lj07Q","1v5hHoVQp6","FhtglUvlv4","SWfouqUJMd","07n1clsQGo","ogLgcuupzk","6q6L98FmFH","U3yw5RkQke","v8yFNFPfSE",
+"0h1b164s8N","6AFT0S2Dfu","UmaEv7lUXZ","x3LDeZzJHW","9XyT9QYxC0","VjCZqlsQGo","JIqXiOUqFM","lj07QHzZT8","AmdQdsx5Gl","J2mQilkMUA",
+"XflUqFPfSE","jtn0XxXTI4","VjCZqciuWz","dQ5865Mg9r","l83Udi7WMQ","wiHrZdmoS7","W3VFHb29RJ","tuDySFGzgp","07n1cyEfy9","D6rBy0h1b1",
+"prNT6bZLvS","9GXkXjSjS3","atef2Twano","7hyVvThjNn","JRJQBMaJQs","ru4UG8U2nU","vLsmSuQIcz","gdQsSAmdQd","MmKGJQbxXc","uoStwxReec",
+"MGlTFdmoS7","v8yFNuupzk","Vprf2Kr8ys","8TxD7jS1aj","gdQsSQworu","2TRI7Qworu","Mkgy8OxWIH","XyPZNHlUbF","0BmCyGv3Fq","QssNCBFkb8",
+"J2mQiNAFuw","AOgEeRkQke","JXljWsx5Gl","m4bxUIRh48","MmKGJdhSuH","x3LDeMmsIo","C2IrcFPfSE","NcICA2TRI7","lsQGo5nmWv","WPmlxzQt6Q",
+"jSjS3BFkb8","zqH0W2DREs","RkQkeYjB9t","M6qcG2Nslm","8RCUAaL6AJ","s4786K20wK","FjHXRdhSuH","24ARFgjUTu","Nxx9VNcICA","M6qcG07n1c",
+"MaJQsPYBf4","ZzJHWdhSuH","W3VFHDcpWB","taOXKtlILt","GWqqXF6PT2","TXQ0Zzz4ZU","Ta8f6LewvM","s7MxkLewvM","SWfous93Ml","dhSuHDcpWB",
+"rz7UtM6qcG","I7p2aqQxHP","uJScXoQ87r","e6e4zB3qem","taOXKuZPqg","ogLgcMaJQs","djsrvIRh48","Yw2oUn8pJ9","48cHL8RCUA","Vprf2tjQxs",
+"No0QbYjB9t","taOXKx3LDe","dpe1vsuY4x","soy9td85a9","ZuDtDMezSW","LbRTH2Nslm","IKxdLRsQUq","kB5nPOz8yZ","jeskSFPfSE","pAhR1vkCHH",
+"48cHL5nmWv","v1HlnxXTI4","RsQUqcmXIX","5ZaEzJJs5m","14FLRDQimp","0BmCyQnJ1S","ksJbyaez9y","RsQUqv2eC3","M3zXLpiJSk","16lHc0ao3l",
+"JIqXi5IhmG","Nxx9V0BmCy","CdyBVUl4a1","jS1ajJIqXi","LDk6fBFkb8","5IhmGnFqik","HfyNQlweGy","JJs5mt59lR","sqVrf5VZjS","XflUqM6qcG",
+"lH1ktt59lR","45cIHblLA9","jS1ajpWiOs","1j5L8ECMvU","uoStwiwzGk","GSQwjmz8gx","Uvlv4gtCA5","rKDLJCp3mZ","gtCA5jzUqR","G1RhSD6rBy",
+"fcJOySWfou","9eoRcMaJQs","Gv3FqxReec","7lUXZ4dEz6","iB08latef2","uTacxs93Ml","JRJQBpv0i7","rhl0JZ4I1v","2DREs5IhmG","07n1coGu6x",
+"Ss0ZuEdBKc","OxWIHpFrrl","MaJQspWiOs","RkQkeTXQ0Z","pvgjSFjHXR","hYBCKThjNn","uJScXPb1pa","ZJTXHSs0Zu","v2eC3DG4sT","FGzgpjtn0X",
+"MaJQsi7WMQ","0KyfsAmdQd","JkzUn9rlg9","dmoS7FwEJz","jfREucmXIX","h1zcHpFrrl","3otm6NcICA","ZuDtD5drc6","jzUqRatef2","QssNCtl72W",
+"RmDcrbZLvS","QYxC0XyPZN","tl72WHRxd8","AgJHQfaHir","zbIYYMaJQs","ZUnqtVprf2","RmDcrCp3mZ","SjskQv2eC3","RzaZACqqaD","jeskSQWxoT",
+"QworuJXljW","qQxHPSWfou","lm0pDJXljW","tl72W2hEEU","jzUqRhe9IA","taOXKuQIcz","sx5GlNcICA","FjHXRuN6r3","yToGW0MR5X","HzZT8Qworu",
+"uN6r3M6qcG","618DiLbRTH","CNHmvAmdQd","6q6L9VjCZq","7hyVvTwano","iB08llsQGo","8RCUABFkb8","DG4sTRACuj","gf8rIGWqqX","Zv7z06q6L9",
+"U3yw54dEz6","jeskSyofH3","IKxdLBCxeC","xXTI4CNHmv","CdyBVpAhR1","ReKEWOz8yZ","e6e4zuoStw","azIWpgtCA5","dmoS7aDGtS","GSQwjkB5nP",
+"EdBKcCNHmv","24ARFblLA9","45cIHciuWz","lj07Q0ao3l","pv0i7VjCZq","6AFT0cmXIX","oQ87r1LB1L","FwEJzZzJHW","55rfBa00b5","IjTwPP6bcg",
+"CK5W7CK5W7","ZhwG1dQ586","i3pyd16lHc","zY1GYMK07Y","QbxXcOHaBz","WDVWJZv7z0","uN6r3ZzJHW","m4bxUcQOnv","fcJOy9GXkX","VNCPdQ6hMC",
+"PYBf4zFgtB","i3pydb29RJ","FnPFBBCxeC","5IhmGdjsrv","GXdoHsx5Gl","blLA9IKxdL","mz8gxbZLvS","0KyfsQClRL","jS1aj7Ow5C","a00b5MGlTF",
+"Zv7z0lsQGo","9y4lwl83Ud","MezSWMezSW","ReKEWn1pmO","uTacx8U2nU","2Nslm1LB1L","uPX7GC2Irc","OxWIH8U2nU","VBjhztAOsr","fqypyMm8si",
+"aDGtSJKWYR","QworuNhXdu","k85AesuY4x","uQIczyluBx","MezSWgtCA5","bZLvSQworu","CxVEfO3iyQ","GSQwjzz4ZU","aFFssWaWsv","FPfSEF6PT2",
+"JkzUnjiVBP","WDVWJzmLYD","FhtglLbRTH","RmDcrjtn0X","1j5L8No0Qb","8xEKzGv3Fq","IBe8kFhtgl","6AFT0CK5W7","5nmWv0PktI","bZLvStjQxs",
+"48cHLMaJQs","VNCPdSjskQ","M6qcGa00b5","VLTy6OxWIH","guMb8ix74r","KsjRKX6Pin","4dEz6VIlwP","sqVrfxXTI4","S2DfuKZamH","jtn0X5Drn0",
+"48cHLhe9IA","wDajX8FmFH","RzaZAbZLvS","qUJMdh1zcH","QChxsY1mC0","yToGWgjUTu","LbRTHBbwgA","b29RJLewvM","dpe1vhUTw7","RBhp0FwEJz",
+"WPmlxdhSuH","ulk41KASQ8","UmaEvEOE1o","v1HlnqaofN","iKqhr9eoRc","2NslmzY1GY","QworuGv3Fq","Ul4a1v1Hln","EOE1oOxWIH","RmDcrIn3NS",
+"i7WMQ8cVD3","0Wr5yjSjS3","0Wr5y9rlg9","a00b5M3zXL","ru4UGM3zXL","POUYSCdyBV","5Drn0lj07Q","i3pydyvOMI","JKWYR16lHc","9XyT99y4lw",
+"VIlwPMm8si","lm0pDo8Uyd","Q6LixQ6Lix","a00b5iwzGk","Vprf2jzUqR","pWiOsfcwDa","t59lRMK07Y","tl72WuLtKs","9rlg9iB08l","HfyNQciuWz",
+"9XyT9qaofN","gtCA5JXljW","48cHLpWiOs","Q6LixqaofN","RxrsmnnP8o","yofH3Ta8f6","uPX7GSjskQ","ydG8Ui7WMQ","lViBvK4GS8","Waim6tl72W",
+"Twano8U2nU","zmLYDiB08l","0KyfsRzaZA","UlU3MU3yw5","3otm69rlg9","VjCZqzqH0W","IBe8kcmXIX","brhlQoQ87r","Mm8siAXpwE","MmsIo3weIF",
+"kZANmFwEJz","8TxD7QYxC0","PYBf4VerEA","zQt6QOUYuF","ulk41fmIK1","0Wr5yQnJ1S","jeskS580YD","lH1ktQWxoT","0ao3lyEfy9","14FLREoToP",
+"yofH3RACuj","fFDrJxReec","8U2nUZJTXH","i3pydoQ87r","RkQkegIYvE","LewvM7fKYU","IKxdL3otm6","s4786RmDcr","uN6r3Dz1R3","VBjhzdpe1v",
+"gjUTuS77LH","MK07Y48cHL","Waim6tjQxs","aez9yNxx9V","suY4xK20wK","FGzgpUl4a1","2DREss7Mxk","lXFOBKr8ys","0PktIAOgEe","NOHszRzaZA",
+"3weIFWaim6","pv0i7lkMUA","tuDySMm8si","M6qcGwDajX","Cp3mZzqH0W","45cIHQ6Lix","aez9yTa8f6","FFDuizmLYD","piJSkOz8yZ","AgJHQlViBv",
+"ogLgcU3yw5","RmDcrJkzUn","EdBKcQWxoT","oGu6xfcJOy","Z4I1vjiVBP","KZamHhUTw7","8TxD7HRxd8","4QMc9CxVEf","tlILt8hJdt","gf8rIC2Irc",
+"tjQxs6q6L9","gdQsSjS1aj","RBhp0Y1mC0","1LB1LnnP8o","ReKEWn8pJ9","xReecMojnP","MmsIoEoToP","bgJAz2Yz7E","POUYSCK5W7","EdBKcwDajX",
+"yluBxxciqp","HzZT88cVD3","lH1ktlj07Q","ZJTXHd85a9","RBhp00ao3l","d85a93otm6","prNT6zbIYY","6q6L9ni2v1","pFrrlDLhzM","3otm6soy9t",
+"tAOsrzFgtB","5VZjS5ZaEz","jSjS3MK07Y","14FLRTCgPp","1v5hHK20wK","0KyfsAgJHQ","9y4lwpFrrl","Ta8f645cIH","mz8gxhSSvQ","rz7UtSs0Zu",
+"FwEJzLbRTH","HfyNQU3yw5","prNT645cIH","fmIK164s8N","lj07Q3otm6","xciqpDG4sT","AmdQdK4GS8","ogLgcVerEA","ZJTXH2ZHdk","9iGoTHfyNQ",
+"QClRLcShY2","MK07Yzz4ZU","m4bxUC2Irc","CqqaDAXpwE","lm0pD8cVD3","wDajXoQ87r","BGaQYThjNn","JIqXiW7cTs","WMiS31LB1L","n1pmO5VZjS",
+"1LB1LL7cGc","okgRixciqp","FPfSE6AFT0","CK5W7EoToP","pmeCdpvgjS","ciuWzHfyNQ","PYBf4xXTI4","9iGoT7lUXZ","n1pmO8cVD3","2DREsThjNn",
+"RBhp0Uvlv4","MmsIoL7cGc","zFgtBkZANm","FnPFBCp3mZ","2TRI75ZaEz","xciqpgf8rI","HfyNQO3iyQ","xXTI4zmLYD","ZzJHWuPX7G","mz8gxYh1hF",
+"cL0aEjSjS3","QbxXc2TRI7","hi5X7ydG8U","gtCA5yofH3","WaWsvpv0i7","kB5nPMaJQs","zFgtBlkMUA","uJScXFGzgp","AOgEeZ4I1v","16lHcxXTI4",
+"zFgtBFGzgp","zQt6Q45cIH","EdBKcYh1hF","W3VFHQnJ1S","uQIcz9eoRc","fcwDaReKEW","S77LHHlUbF","W7cTsCIShG","7fsYMUmaEv","K4GS8nFqik",
+"B3qemcmXIX","sx5GlNxx9V","LbRTHIBe8k","sx5GlQbxXc","cmXIXGrDg7","jSjS3GXdoH","SmGzvBFkb8","gIYvE9y4lw","pAhR1uoStw","cShY2cShY2",
+"JkzUnHfyNQ","2Nslmjtn0X","Zv7z0ksJby","tjQxsLDk6f","piJSk7hyVv","16lHcFjHXR","Q6LixQChxs","VBjhzRACuj","5IhmGChuy3","5Mg9rNOHsz",
+"QChxsMezSW","nlaBypFrrl","jiVBPnnP8o","gdQsSs7Mxk","sqVrfD6rBy","Yf2Ecd7vjM","5Mg9ruAWyp","bgJAzs93Ml","rKDLJsqVrf","Mkgy8VerEA",
+"DQimpogLgc","lpF6WRxrsm","I7p2a24ARF","YOfrYHzZT8","16lHcaDGtS","i7WMQNo0Qb","F6PT2K4GS8","0BmCyQClRL","hSSvQb29RJ","yEfy92Nslm",
+"CdyBV5IhmG","ogLgcpAhR1","nFqikn8pJ9","m4bxUyofH3","4dEz67fsYM","qQxHPs4786","OxWIHM6qcG","OUYuFW3VFH","29QAzpvgjS","aDGtS2Nslm",
+"pFrrlcQOnv","QWxoTDLhzM","iB08lHlUbF","8FmFHuQIcz","lCMxyLDk6f","Rxrsmi3pyd","TXQ0ZVerEA","hSSvQhYBCK","WDVWJDG4sT","MmKGJQnJ1S",
+"guMb8h1zcH","azIWp9GXkX","cShY2x3LDe","jzUqRlj07Q","aL6AJUl4a1","0h1b1LewvM","M3zXLv1Hln","xXTI4Mkgy8","64s8NoVQp6","MezSWsoy9t",
+"45cIHsqVrf","1LB1LHfyNQ","pAhR1GSQwj","ZhwG1qaofN","uoStwZUnqt","RzaZA64s8N","G1RhSe6e4z","5Drn0gIYvE","0KyfsVjCZq","prNT6LewvM",
+"Yf2Ec0YAGH","0BmCy1j5L8","BbwgAO3iyQ","Yw2oU3weIF","WmadAsoy9t","RkQketl72W","EOE1o4QMc9","MmsIoIRh48","NcICAuPX7G","pvgjS0ao3l",
+"IRh48Kr8ys","JRJQBJIqXi","RxrsmMojnP","RzaZA9GXkX","45cIHjeskS","8FmFH64s8N","qUJMdblLA9","POUYSJXljW","PYBf4fLNg8","tvdkDtvdkD",
+"iqv4kXflUq","tjQxs5VZjS","9iGoT8RCUA","KsjRKpFrrl","lweGyfFDrJ","KASQ8XyPZN","bZLvS2TRI7","BpYhVCIShG","DG4sTLDk6f","C2Irc5Namm",
+"JIqXimX2GE","s93MllCMxy","lsQGojzUqR","xReecAXpwE","n8pJ9lj07Q","tAOsruZPqg","fLNg8ZhwG1","OxWIHxReec","Mm8sis93Ml","ZUnqtjiVBP",
+"iB08laFFss","dQ58614FLR","K20wK07n1c","VIlwPbgJAz","580YD8RCUA","I7p2anFqik","dQ5865iGN5","TXQ0ZzY1GY","taOXKYh1hF","JKWYRx3LDe",
+"QClRL9eoRc","ksJbyB3qem","0ao3ld7vjM","DcpWBjiVBP","jS1ajlj07Q","prNT6DLhzM","AgJHQguMb8","oVQp6fcJOy","D6rBydQ586","oGu6xVNCPd",
+"7fsYMZUnqt","4QMc9W3VFH","Kr8ys1LB1L","580YDuupzk","pT8wuNo0Qb","Y1mC0BbwgA","QWxoT7hyVv","djsrvv8yFN","RBhp045cIH","TwanolCMxy",
+"QYxC0MmsIo","I7p2avkCHH","Q6Lixl83Ud","4dEz655rfB","tlILtXyPZN","POUYSdQ586","IjTwPulk41","CNHmvCxVEf","1j5L8mX2GE","3otm6AIYUu",
+"lm0pDXyPZN","BGaQYyEfy9","0BmCySmGzv","nFqikfcwDa","he9IA2TRI7","jtn0X9GXkX","TwanoqUJMd","DG4sTtl72W","DcpWBS77LH","lViBvzqH0W",
+"vOqCEDLhzM","LDk6fXyPZN","MaJQsOUYuF","x3LDezmLYD","9rlg9uQIcz","YjB9tDLhzM","MojnP9iGoT","lweGyRsQUq","0PktIxReec","StlDJHRxd8",
+"FLsphBpYhV","e6e4z2hEEU","I7p2ayEfy9","lXFOBi7WMQ","UlU3MReKEW","HRxd8ThjNn","guMb8HzZT8","Oz8yZk85Ae","HRxd87ku1p","W7cTsWMiS3",
+"PYBf44dEz6","JKWYRBFkb8","FLsphix74r","ydG8UFhtgl","yofH3jiVBP","KsjRKReKEW","e6e4zogLgc","qUJMdsqVrf","48cHLFnPFB","RkQkefLNg8",
+"lsQGolj07Q","8U2nUiqv4k","OxWIHK4GS8","S2DfuCK5W7","VLTy6HlUbF","JkzUngjUTu","0KyfscShY2","HP433xReec","FNYIMa00b5","VLTy6lsQGo",
+"lj07QQChxs","yToGWCqqaD","iwzGk9eoRc","hYBCKcShY2","WaWsvvOqCE","RxrsmGv3Fq","HfyNQvkCHH","cL0aEB3qem","Dz1R3Q6hMC","gf8rII7p2a",
+"d85a9yluBx","Yf2Eciqv4k","8TxD7lH1kt","MK07YaL6AJ","3otm67hyVv","QnJ1SVprf2","dpe1vWmadA","dpe1vTa8f6","lm0pD5nmWv","LDk6ffcJOy",
+"ZuDtD1v5hH","uZPqguvf7A","ZuDtDzbIYY","JIqXijeskS","WreyPZv7z0","WaWsv16lHc","QssNCRBhp0","8cVD3yofH3","oQ87rnnP8o","VjCZqh1zcH",
+"uPX7GyofH3","CqqaDcmXIX","mX2GEpv0i7","yofH3lViBv","tlILtSjskQ","QbxXcs93Ml","X6Pin5Mg9r","K20wKCp3mZ","Waim6O3iyQ","RsQUqwiHrZ",
+"lViBvD6rBy","QChxshi5X7","MK07YzFgtB","gjUTuwDajX","NhXdu7fsYM","kZANmqaofN","uLtKsAgJHQ","FwEJzIKxdL","qaofN0h1b1","nFqikS2Dfu",
+"S77LHqaofN","sx5Gl8xEKz","fLNg87hyVv","x3LDeEdBKc","HzZT8Kr8ys","KsjRKLDk6f","FwEJzMK07Y","uZPqgjtn0X","9eoRct59lR","xReecK20wK",
+"VIlwPOxWIH","FNYIMuN6r3","NOHszwDajX","aFFssLewvM","7ku1pGv3Fq","M6qcGZuDtD","FLsphOUqFM","8FmFHi3pyd","soy9tWPmlx","fmIK1SmGzv",
+"Q6LixL7cGc","Zv7z0pWiOs","M6qcGGWqqX","hUTw79rlg9","t98iWgjUTu","JIqXi8TxD7","SWfou1LB1L","In3NSYw2oU","gdQsSVNCPd","QWxoTNo0Qb",
+"aFFsssx5Gl","uJScXYjB9t","hYBCKIKxdL","i3pyd4QMc9","ciuWzFjHXR","CNHmvfaHir","Yw2oUdpe1v","KASQ8nlaBy","guMb8dmoS7","AOgEebgJAz",
+"EOE1o1LB1L","07n1cTa8f6","DcpWBcmXIX","CdyBVMojnP","9GXkXXflUq","FnPFByvOMI","faHirQbxXc","07n1c8xEKz","5VZjSMojnP","ciuWz29QAz",
+"GSQwjMGlTF","tl72W7fKYU","1j5L8Ss0Zu","hUTw7K20wK","JRJQBbZLvS","aDGtSK20wK","8xEKzix74r","Fhtgli3pyd","6AFT0F6PT2","yToGWt59lR",
+"a00b5CK5W7","1j5L8AOgEe","VBjhzrhl0J","C2IrcoQ87r","blLA9t98iW","BGaQY6q6L9","2Yz7EaFFss","guMb8RkQke","4QMc98RCUA","StlDJRsQUq",
+"NOHsz07n1c","VerEAogLgc","7fKYUHRxd8","tuDySiwzGk","cQOnvsx5Gl","FGzgpFxX9q","nnP8oAmdQd","oQ87riwzGk","iwzGk9iGoT","hE1Ql618Di",
+"0KyfsfFDrJ","CqqaDpmeCd","lsQGoydG8U","uPX7GzFgtB","e6e4z1LB1L","gjUTud85a9","i3pydwDajX","TXQ0ZHlUbF","LbRTH5ZaEz","Kr8ysuPX7G",
+"5ZaEz48cHL","IjTwPtuDyS","VIlwPW3VFH","t98iWU3yw5","dQ5868U2nU","jtn0XUlU3M","JKWYRIn3NS","uN6r3LbRTH","DcpWBguMb8","k85AePOUYS",
+"5IhmG0Kyfs","3otm6W3VFH","aL6AJIn3NS","9rlg9MGlTF","bgJAzZzJHW","lkMUAGv3Fq","brhlQNOHsz","JkzUnBFkb8","RpBQmVjCZq","CxVEf9rlg9",
+"TXQ0ZJIqXi","oVQp6M6qcG","wDajX5ZaEz","CdyBVM6qcG","s93MlBGaQY","NAFuwn8pJ9","BGaQYEdBKc","Ss0Zu7hyVv","EoToP5iGN5","aez9ycShY2",
+"MojnPoQ87r","i7WMQNcICA","tuDySgf8rI","aez9yNOHsz","uvf7AzmLYD","PYBf4jtn0X","Mm8si8FmFH","cShY2lXFOB","uPX7Gi3pyd","tl72WZhwG1",
+"JJs5mWDVWJ","FxX9qDG4sT","bZLvSjzUqR","lkMUAtvdkD","sx5GlWaim6","AkKTktlILt","b29RJAmdQd","jzUqRtAOsr","RpBQmnlaBy","bgJAzx3LDe",
+"VerEAAXpwE","hYBCKuJScX","jiVBPFLsph","fFDrJHfyNQ","WreyP0YAGH","tl72WStlDJ","jtn0XjeskS","HP433taOXK","s93Mlv8yFN","ru4UGCfgr3",
+"3otm6faHir","WPmlxm4bxU","ZJTXHHRxd8","0Wr5yuLtKs","lCMxyBGaQY","Vprf2d7vjM","pWiOsChuy3","EdBKc2TRI7","9XyT9QnJ1S","i7WMQMojnP",
+"atef2t59lR","aDGtSZzJHW","cShY2iwzGk","m4bxUzbIYY","POUYSpT8wu","M3zXL29QAz","Pb1pa0h1b1","F6PT2nlaBy","jS1ajZzJHW","aL6AJkB5nP",
+"07n1cciuWz","tuDySrKDLJ","DQimpCqqaD","LbRTHdQ586","Cp3mZMm8si","0YAGHKr8ys","VjCZqn1pmO","CqqaDru4UG","Ul4a1AmdQd","7fsYMwiHrZ",
+"y94nwZJTXH","zFgtBMm8si","8U2nUUlU3M","QChxsQYxC0","9eoRcKZamH","ksJbyRkQke","Q6LixoVQp6","VLTy6StlDJ","07n1co8Uyd","oGu6xAIYUu",
+"5IhmG8FmFH","YjB9tcQOnv","580YDPb1pa","9GXkXtaOXK","MojnPzz4ZU","uJScXiB08l","WaWsvhYBCK","GSQwjDQimp","djsrv2DREs","Mkgy8jzUqR",
+"2Yz7EsqVrf","CqqaD9rlg9","OHaBzsqVrf","jfREuJIqXi","uoStwRmDcr","kB5nPTXQ0Z","Vprf20YAGH","7lUXZyluBx","LbRTH0BmCy","14FLRd85a9",
+"FjHXRhe9IA","4W0TlfmIK1","kB5nPG1RhS","X6PinXyPZN","4dEz6NcICA","W7cTsGWqqX","5Mg9r2DREs","MaJQsuLtKs","uQIczS77LH","CdyBVru4UG",
+"pmeCdv2eC3","WPmlxqUJMd","CdyBVhi5X7","AIYUuvOqCE","LDk6fC2Irc","4W0Tln8pJ9","AkKTka00b5","5Mg9rIn3NS","d85a9uLtKs","ZuDtDpmeCd",
+"Twano1j5L8","uAWyp8xEKz","8U2nUaL6AJ","WaWsvHfyNQ","MaJQsL7cGc","Waim6lm0pD","AXpwEwDajX","BGaQYUmaEv","yofH3RBhp0","FnPFBoQ87r",
+"ydG8UFxX9q","W7cTs4W0Tl","IKxdLaez9y","h1zcHqaofN","AIYUukB5nP","HfyNQvLsmS","5drc6MmKGJ","FNYIM0Wr5y","pvgjSXflUq","8TxD7Ul4a1",
+"WmadAjeskS","0KyfsbrhlQ","n1pmOiwzGk","3otm6KASQ8","v1Hln55rfB","sx5Gl55rfB","VNCPdtlILt","Pb1paNhXdu","MK07YfFDrJ","n1pmOBpYhV",
+"0h1b1I7p2a","FPfSEDG4sT","S77LHMGlTF","M3zXLDLhzM","hE1QltjQxs","ulk41zQt6Q","7lUXZNxx9V","Zv7z0TXQ0Z","QChxsAmdQd","pAhR1hYBCK",
+"fLNg8iwzGk","l83Ud9rlg9","jS1aj9y4lw","XflUql83Ud","WDVWJpvgjS","RsQUqrhl0J","2ZHdk9eoRc","G1RhS3otm6","azIWpQChxs","CNHmvhUTw7",
+"RxrsmDG4sT","8FmFHQChxs","i7WMQ24ARF","Uvlv40ao3l","K4GS8aFFss","guMb8qUJMd","uTacxOHaBz","QworuI7p2a","MmKGJyToGW","qQxHP9XyT9",
+"QnJ1SazIWp","LDk6f7X3uy","5VZjS2Nslm","GrDg7a00b5","d85a9J2mQi","ZhwG1L7cGc","uTacxWaim6","vLsmSGSQwj","Y1mC04QMc9","lCMxyQ6hMC",
+"pAhR1pWiOs","FxX9qru4UG","GWqqXVBjhz","MmsIoW7cTs","2NslmHfyNQ","Ta8f6e6e4z","Ul4a1gf8rI","XyPZNZ4I1v","blLA955rfB","NAFuw8FmFH",
+"D6rBypAhR1","vOqCEGWqqX","uoStwTa8f6","HfyNQi7WMQ","5nmWvBFkb8","JJs5msuY4x","QworunlaBy","Cfgr3TCgPp","aL6AJZuDtD","07n1crKDLJ",
+"FwEJzYw2oU","guMb8618Di","GrDg7hSSvQ","fcJOyQnJ1S","S77LHjfREu","FnPFBn1pmO","d7vjMRzaZA","Mkgy8x3LDe","BCxeCWreyP","fmIK1QnJ1S",
+"G1RhSFcWrW","tuDySVLTy6","cQOnvd7vjM","uPX7GuoStw","UmaEvHP433","Vprf2C2Irc","lH1ktCfgr3","lXFOBOUYuF","jeskSlViBv","gtCA5MK07Y",
+"pvgjSi3pyd","uZPqgWMiS3","OUYuF7fKYU","OUYuFEoToP","BpYhVWMiS3","14FLRfcwDa","pAhR1fcJOy","he9IACNHmv","ECMvUjS1aj","IRh48mX2GE",
+"HRxd8qaofN","dpe1vzmLYD","h1zcHTXQ0Z","yEfy9xXTI4","ZUnqtjfREu","7hyVvKASQ8","GSQwj7X3uy","0ao3l8hJdt","JXljWXflUq","U3yw5fqypy",
+"ciuWz8FmFH","lj07QStlDJ","5ZaEz5ZaEz","i7WMQIRh48","9eoRczqH0W","NcICAAIYUu","gIYvExReec","7lUXZ2TRI7","HzZT8RsQUq","HlUbF7X3uy",
+"nnP8oOxWIH","iwzGkhSSvQ","8FmFHjSjS3","o8UydBCxeC","LewvMXflUq","7Ow5CpiJSk","D6rByFNYIM","FwEJzo8Uyd","9rlg91j5L8","xReecoVQp6",
+"sqVrf9eoRc","9eoRc0BmCy","HlUbFJ2mQi","t59lRhUTw7","atef2qQxHP","ix74rECMvU","B3qemjtn0X","bZLvSB3qem","x3LDekZANm","iB08l7hyVv",
+"MmsIoFPfSE","BCxeCyofH3","HlUbFJkzUn","uZPqgo8Uyd","DG4sTxXTI4","NAFuw9GXkX","ogLgcX6Pin","ulk41VjCZq","lXFOBPOUYS","Yh1hFCK5W7",
+"jzUqRG1RhS","mz8gx580YD","FVMxoVIlwP","NOHszDz1R3","XyPZNGv3Fq","QYxC0P6bcg","uZPqg5VZjS","5iGN5pAhR1","QClRLJ2mQi","uQIczZJTXH",
+"BFkb8yluBx","Cp3mZHP433","zFgtBhE1Ql","AgJHQReKEW","Ul4a1Vprf2","16lHclH1kt","tuDySFhtgl","In3NSWaWsv","QworuU3yw5","lj07Qy94nw",
+"4W0TlGXdoH","v2eC30Kyfs","guMb8TCgPp","5drc64dEz6","KZamHpv0i7","WMiS3VjCZq","jfREulViBv","3otm6No0Qb","SWfouksJby","ReKEWBpYhV",
+"9rlg9OHaBz","WPmlxBGaQY","M6qcGlpF6W","29QAzh1zcH","iwzGkdmoS7","v2eC3UlU3M","jfREuZzJHW","NAFuwBbwgA","suY4x55rfB","bZLvSmX2GE",
+"SjskQru4UG","e6e4zRsQUq","GrDg7MaJQs","7fKYUChuy3","Ss0ZuprNT6","WPmlxcmXIX","ciuWzYw2oU","ReKEWfaHir","rz7Ut5ZaEz","a00b5gIYvE",
+"JIqXicmXIX","CNHmvGSQwj","0h1b1JkzUn","IKxdLru4UG","sqVrfbgJAz","RxrsmkZANm","Gv3Fq7ku1p","JXljWOUqFM","Yw2oU580YD","faHirJJs5m",
+"FFDuiLDk6f","7fKYUjtn0X","fcJOyMK07Y","0BmCyNOHsz","4QMc9YOfrY","oQ87rRkQke","Zv7z0lH1kt","tuDyS8FmFH","0Wr5ypWiOs","ReKEW7fsYM",
+"iKqhrWmadA","Ul4a1TCgPp","qQxHPnnP8o","t98iWMezSW","xReeclCMxy","uoStwOHaBz","X6PinGSQwj","uJScXBpYhV","rhl0JqQxHP","D6rByzqH0W",
+"xciqp7Ow5C","iKqhrlViBv","hE1QlFLsph","hi5X78hJdt","Mm8siuTacx","zz4ZUQnJ1S","IjTwPpFrrl","Ss0ZuokgRi","b29RJeuZA5","pWiOssuY4x",
+"X6PinVIlwP","QYxC05IhmG","fFDrJD6rBy","RmDcrt59lR","UmaEv64s8N","MmKGJ5nmWv","b29RJ0BmCy","d7vjM7hyVv","Pb1pawiHrZ","euZA5jtn0X",
+"rz7UtNo0Qb","fLNg8IKxdL","NAFuwReKEW","cShY2WMiS3","zFgtBfqypy","HRxd8rz7Ut","3weIFnnP8o","nFqik0PktI","64s8N2ZHdk","Zv7z0zz4ZU",
+"VLTy62ZHdk","lsQGoJKWYR","QWxoTQ6hMC","hSSvQNxx9V","7lUXZwDajX","FGzgpaL6AJ","IjTwPTXQ0Z","lsQGozHF1q","Oz8yZaL6AJ","VNCPdMkgy8",
+"CK5W7F6PT2","ydG8Uiqv4k","RxrsmSs0Zu","7fsYMPb1pa","WmadAgtCA5","2hEEUv8yFN","jeskSFhtgl","sx5GlSjskQ","KsjRKHzZT8","618DiL7cGc",
+"CIShGpT8wu","uAWypHlUbF","PYBf4tuDyS","14FLR5IhmG","GSQwjbrhlQ","ciuWzReKEW","14FLRwDajX","WPmlxgtCA5","O3iyQZhwG1","7Ow5CuoStw",
+"RkQke0BmCy","dQ586KASQ8","ZUnqtX6Pin","OxWIHMmKGJ","IjTwPQWxoT","sqVrfcQOnv","4dEz6zmLYD","fmIK1BGaQY","aFFssNhXdu","pmeCdFNYIM",
+"zz4ZUwDajX","zbIYY7Ow5C","WaWsvyluBx","lCMxyjtn0X","VerEACIShG","dpe1vn8pJ9","oVQp607n1c","pv0i7SbRYy","oGu6xWaWsv","Z4I1vjfREu",
+"RpBQm9y4lw","ZhwG1y94nw","sx5Glzz4ZU","VNCPdLbRTH","AmdQdwDajX","OHaBzIn3NS","l83UdcShY2","VBjhzlH1kt","WMiS3TCgPp","yvOMI6AFT0",
+"t59lRYw2oU","9GXkXReKEW","okgRihE1Ql","FNYIMcQOnv","MojnPBpYhV","ciuWzdQ586","zQt6QZJTXH","zqH0WqQxHP","AXpwE48cHL","he9IAYf2Ec",
+"9eoRcyvOMI","AIYUuaFFss","y94nwtvdkD","HP433BpYhV","pWiOsRxrsm","FVMxo5ZaEz","AmdQd5iGN5","S2DfutlILt","Ul4a1DcpWB","Q6LixSs0Zu",
+"9y4lwU3yw5","oVQp6nFqik","W3VFHMm8si","JIqXiHlUbF","zQt6QXflUq","QWxoTru4UG","In3NSfcwDa","nFqik9XyT9","QbxXcvLsmS","QssNCRsQUq",
+"ksJbyjSjS3","gtCA5yToGW","ciuWz7X3uy","Yh1hFM6qcG","lweGyMezSW","dQ586QYxC0","Gv3FqgIYvE","FnPFBYf2Ec","xXTI4pv0i7","MmKGJQClRL",
+"lCMxyCfgr3","NhXduatef2","AIYUuOxWIH","BGaQYm4bxU","mX2GES77LH","RsQUquoStw","JkzUnvLsmS","blLA9MGlTF","MmKGJOxWIH","zFgtBAOgEe",
+"euZA5yEfy9","cmXIXpWiOs","S77LHMaJQs","qUJMdJRJQB","oQ87rfaHir","0h1b1uvf7A","GSQwj5nmWv","0MR5XTCgPp","t98iWMGlTF","WPmlxsx5Gl",
+"kZANm1LB1L","IjTwP0Kyfs","rz7UtfcwDa","ulk41wiHrZ","Cfgr3ThjNn","qQxHPFLsph","B3qemhE1Ql","tlILtlj07Q","DQimp2hEEU","TCgPpRpBQm",
+"07n1czbIYY","QWxoTJKWYR","NcICAiKqhr","8TxD74dEz6","tuDySiB08l","VBjhz8TxD7","pT8wu2Nslm","SjskQuPX7G","TwanoUl4a1","5drc6fFDrJ",
+"lXFOBwiHrZ","qaofNIBe8k","uN6r3k85Ae","CqqaD9iGoT","8hJdtlH1kt","fmIK16q6L9","xciqpS77LH","WMiS3fcJOy","7ku1plXFOB","m4bxUZuDtD",
+"ZzJHW6AFT0","sqVrfRzaZA","aFFssjtn0X","Pb1paNOHsz","kB5nPFnPFB","DQimppAhR1","7ku1piwzGk","jSjS3AOgEe","b29RJRkQke","CxVEfzQt6Q",
+"aDGtSokgRi","I7p2aQworu","7X3uyfFDrJ","gjUTuqaofN","WMiS3W3VFH","bgJAzIn3NS","14FLRoQ87r","XyPZNNOHsz","CIShGhi5X7","IKxdLMezSW",
+"5VZjSOz8yZ","qQxHP0Kyfs","bZLvSXflUq","0h1b1CNHmv","AXpwEFhtgl","oQ87rDQimp","DcpWBOxWIH","pAhR1Fhtgl","QbxXcfcwDa","hYBCKbZLvS",
+"fLNg8AgJHQ","GWqqX0PktI","K20wKsoy9t","PYBf429QAz","FwEJzGSQwj","4W0TlWMiS3","Oz8yZe6e4z","iqv4kW7cTs","QChxspT8wu","64s8NAkKTk",
+"ZuDtDYOfrY","QworucL0aE","RBhp0nFqik","3weIFjtn0X","CIShGDLhzM","9iGoT29QAz","M6qcGQYxC0","MaJQsjS1aj","tuDySOz8yZ","t98iWuoStw",
+"cL0aEWPmlx","djsrvtvdkD","CdyBVaL6AJ","8RCUAG1RhS","JkzUn8hJdt","UlU3M6q6L9","jfREulH1kt","sx5Gl0MR5X","9eoRcoGu6x","JRJQBRxrsm",
+"FLsph5IhmG","fcwDaP6bcg","aFFsso8Uyd","blLA9Mkgy8","0MR5XuJScX","2hEEURsQUq","kZANm0YAGH","zFgtBoVQp6","AkKTkCfgr3","ix74r5Mg9r",
+"Yw2oUM6qcG","AXpwExciqp","Ul4a1FFDui","5Mg9rUmaEv","AkKTkWaWsv","LewvMSmGzv","faHirVLTy6","ZhwG1uLtKs","0PktIBCxeC","Oz8yZzHF1q",
+"oVQp6S77LH","NAFuwRsQUq","brhlQChuy3","W3VFHDG4sT","v2eC3JKWYR","uupzkkB5nP","VLTy6pWiOs","WMiS37fsYM","rhl0J0h1b1","FLsphiwzGk",
+"9rlg9B3qem","M3zXLlsQGo","djsrvYw2oU","vLsmSC2Irc","TCgPplCMxy","oGu6xDcpWB","Kr8ysuLtKs","zz4ZUL7cGc","CdyBV7fKYU","FGzgp0h1b1",
+"6AFT0kZANm","WPmlxeuZA5","9XyT9Ss0Zu","YOfrYokgRi","Y1mC0gf8rI","gtCA5gjUTu","pmeCdrhl0J","o8UydEOE1o","uZPqgOUqFM","7X3uygf8rI",
+"9iGoTjSjS3","sqVrfThjNn","ZJTXHqQxHP","zQt6QPb1pa","Yw2oUJ2mQi","WmadAQssNC","Uvlv4VjCZq","uAWypyvOMI","WmadAlweGy","RzaZAFnPFB",
+"hYBCKrhl0J","Qworuv8yFN","ciuWzIjTwP","Waim6rz7Ut","HzZT8I7p2a","uN6r3QnJ1S","SbRYycShY2","v2eC3uupzk","8TxD7BpYhV","jSjS3l83Ud",
+"QChxsDLhzM","djsrvuN6r3","kZANmBpYhV","MojnPrKDLJ","iqv4k14FLR","WaWsv1LB1L","uvf7AbZLvS","QChxsqQxHP","CqqaDqaofN","WmadA6AFT0",
+"NOHszoGu6x","n8pJ9RmDcr","9iGoT14FLR","S77LHHfyNQ","yvOMIKr8ys","kZANm1j5L8","FnPFBuupzk","FxX9qIRh48","24ARFXyPZN","rKDLJrKDLJ",
+"LbRTHmX2GE","ZzJHW8TxD7","tjQxsRzaZA","pFrrl9GXkX","YOfrYciuWz","dQ586QClRL","Mm8siBGaQY","OUqFMRBhp0","TCgPpOxWIH","5NammWmadA",
+"soy9tMmsIo","wDajX5IhmG","FhtglZuDtD","EdBKcix74r","iB08lYh1hF","EoToPyluBx","ksJby7Ow5C","tl72WNcICA","JRJQBtAOsr","AmdQd580YD",
+"ogLgc7fsYM","kB5nPPOUYS","HzZT8gIYvE","1LB1LQnJ1S","VNCPdoVQp6","5iGN5SmGzv","2Nslm0PktI","he9IAOxWIH","lm0pDtAOsr","lpF6WIRh48",
+"qaofNlm0pD","2ZHdka00b5","QClRLNcICA","ix74rqUJMd","LewvMhe9IA","b29RJiB08l","zHF1qjS1aj","oGu6xG1RhS","8cVD3vkCHH","Nxx9VJRJQB",
+"e6e4zVjCZq","cQOnv9GXkX","yEfy9Cfgr3","m4bxUhSSvQ","Cfgr3ydG8U","IKxdLhUTw7","Q6hMCVIlwP","OUqFM6q6L9","fqypye6e4z","t59lRB3qem",
+"M3zXLIjTwP","zY1GYG1RhS","Yw2oUzFgtB","9GXkXDz1R3","iwzGkwDajX","VLTy6cmXIX","Ta8f6B3qem","Waim6euZA5","gdQsSW3VFH","yluBx5Namm",
+"2Yz7EPYBf4","F6PT2azIWp","jeskSlm0pD","Mm8siTwano","DQimphi5X7","OxWIHZ4I1v","FwEJz9eoRc","FGzgpEoToP","KASQ8hSSvQ","piJSkkZANm",
+"UlU3MAkKTk","FxX9qNcICA","atef26AFT0","Cp3mZNhXdu","Yf2EcciuWz","X6PinlH1kt","W3VFH5Namm","Chuy3s4786","uoStw618Di","guMb8Waim6",
+"Z4I1vWDVWJ","uoStwUl4a1","Cfgr35IhmG","MaJQsJIqXi","jSjS37fKYU","Nxx9VReKEW","ix74rt98iW","6q6L9FNYIM","tAOsrECMvU","ZzJHWJkzUn",
+"0MR5X24ARF","WmadAWaWsv","FhtglK20wK","Yf2EcWaWsv","StlDJoGu6x","EOE1oWaim6","In3NSI7p2a","uQIcz0Wr5y","UmaEvcmXIX","oGu6xZuDtD",
+"l83UdKsjRK","55rfBCdyBV","hUTw7MezSW","P6bcgFFDui","8TxD7prNT6","5iGN58cVD3","uPX7GYh1hF","iB08lDcpWB","rz7UtQ6Lix","piJSk7ku1p",
+"o8UyddQ586","uoStwpWiOs","wDajXAOgEe","hE1QlciuWz","K4GS8uPX7G","BFkb8RzaZA","Uvlv464s8N","AmdQdZzJHW","StlDJzHF1q","DLhzMAgJHQ",
+"VIlwPFjHXR","qQxHPiKqhr","pv0i7ulk41","sx5GlPYBf4","P6bcgo8Uyd","ix74r2Yz7E","lj07QAmdQd","WPmlxAIYUu","ZhwG1hi5X7","ZuDtDDz1R3",
+"O3iyQuPX7G","ZuDtDMaJQs","4dEz65Drn0","jeskS48cHL","SbRYyn8pJ9","uupzkK4GS8","he9IA8RCUA","AOgEes7Mxk","DcpWBLewvM","lpF6WNAFuw",
+"XflUqtl72W","pFrrlRkQke","3otm6GrDg7","s7MxkRsQUq","1v5hH45cIH","Y1mC0fqypy","ix74rAkKTk","CK5W7HP433","lsQGoFcWrW","vLsmSjiVBP",
+"45cIHfqypy","euZA5uAWyp","9rlg99XyT9","Vprf28U2nU","qUJMdHP433","RmDcr8TxD7","0YAGHsx5Gl","IBe8kyluBx","JkzUnjzUqR","MmKGJksJby",
+"DcpWB9iGoT","ZhwG1VBjhz","jeskSG1RhS","qaofN0ao3l","aDGtSn8pJ9","cQOnvZv7z0","cQOnvhUTw7","0Kyfs5Namm","aez9yjSjS3","GXdoHYh1hF",
+"48cHLhSSvQ","Y1mC0FVMxo","Q6hMCtuDyS","8xEKzwDajX","fmIK1580YD","nlaBywDajX","yvOMINAFuw","oGu6xAgJHQ","i3pydCp3mZ","uvf7AZv7z0",
+"0MR5XZUnqt","n8pJ9lweGy","pWiOs0BmCy","48cHL7lUXZ","3otm6i7WMQ","8xEKzNo0Qb","TXQ0Z8cVD3","fcwDaQnJ1S","HP433ciuWz","jS1ajRmDcr",
+"euZA5taOXK","580YDNcICA","K20wKa00b5","IKxdLGXdoH","HlUbFjeskS","jeskSBbwgA","i7WMQyluBx","QClRLTCgPp","yvOMIFcWrW","uLtKs0PktI",
+"7ku1pb29RJ","K4GS8QChxs","SjskQcmXIX","P6bcgi3pyd","wiHrZtjQxs","t59lRsx5Gl","48cHL7ku1p","618DijeskS","14FLRgf8rI","CxVEfCqqaD",
+"BpYhVKsjRK","lj07Q2Nslm","ZzJHWwiHrZ","aL6AJjiVBP","Kr8ysDLhzM","Nxx9VQWxoT","hE1QlVNCPd","cShY2MaJQs","Q6LixChuy3","nlaByVLTy6",
+"l83UdnlaBy","FNYIMjS1aj","MK07YS77LH","6AFT0aDGtS","7X3uy6AFT0","WDVWJTCgPp","RpBQmBpYhV","yEfy9zz4ZU","3weIFOUYuF","2hEEUFhtgl",
+"uupzk3weIF","WMiS3Nxx9V","BpYhVprNT6","vLsmSzbIYY","gf8rIRpBQm","0h1b1i3pyd","1v5hHyvOMI","AmdQduPX7G","soy9the9IA","dQ586J2mQi",
+"24ARFJIqXi","azIWpThjNn","azIWpQYxC0","t59lRFcWrW","aDGtShe9IA","jtn0XgtCA5","lj07Qix74r","aDGtSciuWz","taOXKZuDtD","d85a9Nxx9V",
+"taOXKMK07Y","8cVD355rfB","wiHrZW7cTs","Kr8ysNhXdu","iqv4k8U2nU","7X3uyzbIYY","IjTwP7fsYM","OxWIHdjsrv","8hJdthUTw7","DG4sT1v5hH",
+"jSjS3QWxoT","In3NSaFFss","Ul4a1iqv4k","aL6AJ1LB1L","S77LHDLhzM","4dEz69rlg9","FGzgpQssNC","Q6hMCXyPZN","qUJMdlj07Q","Twano5drc6",
+"Q6LixNxx9V","XyPZNuupzk","t98iWzmLYD","AgJHQO3iyQ","hUTw7JXljW","vLsmS55rfB","vLsmSrKDLJ","pWiOsUmaEv","G1RhSs7Mxk","ZuDtDsoy9t",
+"rhl0JnlaBy","jS1ajzY1GY","8TxD7y94nw","Oz8yZ5Drn0","faHiroGu6x","Q6LixWDVWJ","cmXIX64s8N","uLtKsXyPZN","h1zcHtjQxs","2TRI7jtn0X",
+"Cfgr3WreyP","y94nwbZLvS","oGu6xSs0Zu","VerEAtl72W","ZhwG19iGoT","atef2fFDrJ","lkMUAvkCHH","brhlQW7cTs","IjTwPi3pyd","0YAGHpWiOs",
+"XyPZN0YAGH","uLtKsyEfy9","TCgPpAgJHQ","Qworuzz4ZU","bZLvSWmadA","yofH3mz8gx","1j5L8BbwgA","uZPqgBbwgA","mz8gxUvlv4","lXFOBzY1GY",
+"HlUbFQChxs","lm0pDUvlv4","RmDcrk85Ae","CqqaDiqv4k","GWqqXUlU3M","aez9yjtn0X","uoStw7lUXZ","FLsphZJTXH","gf8rIOUqFM","blLA9v1Hln",
+"azIWpCK5W7","QbxXcI7p2a","DQimp9eoRc","MezSW5VZjS","IRh48Ul4a1","0ao3liB08l","vkCHHVNCPd","n8pJ9ydG8U","GrDg79XyT9","DcpWBvkCHH",
+"JkzUnyluBx","Qworusx5Gl","WaWsvVLTy6","WaWsv2ZHdk","lsQGov2eC3","UmaEv24ARF","6AFT0uAWyp","tAOsrCIShG","rhl0JvOqCE","WDVWJDLhzM",
+"SbRYyNhXdu","gf8rIEOE1o","t59lRMm8si","dhSuHlm0pD","14FLRQ6Lix","iwzGkAXpwE","bZLvS1j5L8","cL0aEPOUYS","7ku1p9rlg9","BFkb8MGlTF",
+"gf8rI9eoRc","cShY2jeskS","mz8gxGWqqX","zqH0WlXFOB","ReKEWVjCZq","gdQsSUlU3M","2hEEUsqVrf","MmKGJRkQke","LbRTHMmKGJ","pAhR19GXkX",
+"AkKTkNo0Qb","FcWrW7fKYU","FcWrWfmIK1","fcJOyIKxdL","JKWYRokgRi","2NslmBpYhV","jzUqRJKWYR","8TxD7Q6hMC","yluBxMmsIo","zQt6QuLtKs",
+"zqH0WMmKGJ","NhXdugf8rI","x3LDeGSQwj","LDk6fB3qem","vkCHHS2Dfu","SbRYywiHrZ","8hJdt2hEEU","K20wK3weIF","rhl0JWmadA","580YDQChxs",
+"618DiJ2mQi","hUTw7fmIK1","yofH3zFgtB","AkKTktaOXK","suY4xaez9y","oVQp6MGlTF","JIqXiKsjRK","lH1kt8xEKz","a00b5CxVEf","KZamHvkCHH",
+"MmsIoKsjRK","qaofNpmeCd","KASQ8v2eC3","piJSkSmGzv","gf8rIe6e4z","7X3uyFxX9q","vOqCEuTacx","v1HlnKr8ys","VIlwPXyPZN","aFFssHlUbF",
+"Gv3FqZUnqt","BFkb8QChxs","7X3uyVBjhz","KZamHtaOXK","ReKEWWMiS3","X6PinazIWp","zbIYY580YD","Cfgr3o8Uyd","1v5hHYh1hF","PYBf4CK5W7",
+"9eoRcFPfSE","uN6r3lViBv","tjQxsyofH3","Yf2EcMkgy8","Dz1R3VerEA","EoToPZuDtD","CK5W78xEKz","piJSkNcICA","WDVWJ0PktI","FVMxoTCgPp",
+"djsrv0Kyfs","lH1kthE1Ql","rKDLJdhSuH","MmsIoS77LH","v2eC39rlg9","vOqCE5drc6","jzUqRd85a9","HlUbF8TxD7","LDk6fni2v1","jS1ajhYBCK",
+"SmGzvix74r","fcwDa2ZHdk","8FmFHGXdoH","DcpWBxReec","GrDg7Y1mC0","7fsYMqQxHP","jSjS3DcpWB","Uvlv4FwEJz","8cVD32Yz7E","zHF1q5iGN5",
+"ReKEWSs0Zu","7fKYUTXQ0Z","LewvMcL0aE","RpBQmx3LDe","uAWyphSSvQ","Gv3FqtvdkD","gjUTuaDGtS","2hEEURACuj","zY1GYuvf7A","JJs5mv2eC3",
+"Q6LixSbRYy","M3zXLWMiS3","lXFOBlCMxy","HP433dpe1v","jiVBPWMiS3","FwEJz2Nslm","0YAGHKASQ8","ZzJHW5drc6","yEfy95Drn0","uvf7AQ6Lix",
+"bgJAzGrDg7","sx5GlSbRYy","CqqaDhe9IA","FcWrWcShY2","lkMUAaFFss","Oz8yZEOE1o","Kr8ysAmdQd","RzaZAZUnqt","DcpWB14FLR","AkKTkZ4I1v",
+"24ARF9iGoT","5nmWvuTacx","wiHrZrhl0J","K20wKQYxC0","W3VFHMkgy8","1v5hHIKxdL","In3NSxReec","gf8rIpFrrl","fFDrJFNYIM","uPX7G9iGoT",
+"sqVrfxReec","suY4x7Ow5C","JJs5mL7cGc","jeskSD6rBy","nnP8od85a9","x3LDenFqik","M6qcGU3yw5","4dEz6vkCHH","soy9tni2v1","zz4ZUVIlwP",
+"hYBCKYh1hF","LbRTHlj07Q","HRxd8jeskS","fLNg8FjHXR","kB5nPfaHir","gtCA5BbwgA","n1pmOydG8U","s4786In3NS","t59lR3otm6","8hJdtuJScX",
+"a00b5dQ586","pAhR1SjskQ","iqv4klH1kt","QbxXcjzUqR","xciqpyluBx","fLNg8B3qem","ZhwG12DREs","EdBKclCMxy","dmoS7POUYS","lH1ktFPfSE",
+"3otm6yluBx","OUYuFF6PT2","WDVWJNhXdu","GSQwjLDk6f","FjHXRwiHrZ","7Ow5C618Di","3weIFFPfSE","DQimp29QAz","CK5W748cHL","suY4xzFgtB",
+"MaJQsbZLvS","1v5hHCxVEf","WDVWJDz1R3","he9IAcQOnv","SbRYyTa8f6","uJScX8TxD7","FcWrWFcWrW","BFkb8Q6hMC","djsrvksJby","LewvMO3iyQ",
+"lkMUAcmXIX","prNT6K20wK","LDk6fpAhR1","qQxHP8cVD3","9y4lwWPmlx","iwzGkL7cGc","tl72WOz8yZ","uPX7GMm8si","KsjRKFhtgl","2Yz7E8TxD7",
+"jS1ajXyPZN","zFgtBvLsmS","RpBQmNcICA","rz7UtO3iyQ","xXTI4XyPZN","lCMxyCK5W7","BpYhVIRh48","pWiOs8U2nU","QworuFPfSE","S2DfuB3qem",
+"fqypyv1Hln","FcWrW4QMc9","hYBCKSjskQ","fqypyX6Pin","tuDySGv3Fq","aFFss9XyT9","JXljWMaJQs","ulk41uvf7A","uZPqgTwano","BbwgAqQxHP",
+"okgRiVprf2","StlDJ8cVD3","fFDrJsoy9t","oVQp6pmeCd","Ta8f6EoToP","nFqikDcpWB","45cIHsx5Gl","AOgEeYh1hF","Ta8f6SbRYy","lweGydQ586",
+"zmLYDprNT6","QClRLni2v1","WPmlxRBhp0","JKWYRDcpWB","RpBQmKsjRK","lkMUAhe9IA","yEfy9y94nw","iKqhrQ6Lix","k85Ae5VZjS","B3qemCIShG",
+"uQIczjSjS3","djsrvJ2mQi","qUJMdaFFss","AkKTkpmeCd","FVMxo0YAGH","YOfrYsx5Gl","ydG8UazIWp","atef2mX2GE","mX2GEfcJOy","ulk41CqqaD",
+"5IhmG9eoRc","WMiS3XflUq","K20wKd85a9","jeskS8TxD7","UlU3MaL6AJ","0KyfshYBCK","CdyBVd85a9","guMb8QYxC0","ZzJHWBCxeC","zmLYDfaHir",
+"tuDySK4GS8","64s8Nb29RJ","48cHLi7WMQ","FNYIM5Mg9r","U3yw5tl72W","NAFuwIRh48","d7vjMhi5X7","5IhmGaFFss","i3pyd8TxD7","cQOnvO3iyQ",
+"EOE1o2Yz7E","pvgjSzHF1q","guMb8ECMvU","Q6LixTwano","4W0TlMm8si","s93Mldpe1v","blLA9blLA9","bZLvSAOgEe","gtCA5ogLgc","LDk6fatef2",
+"EOE1ouoStw","I7p2azbIYY","prNT6kZANm","K20wKfqypy","OUYuF1j5L8","HP433DG4sT","ulk41EoToP","UlU3MUl4a1","CqqaDvkCHH","tvdkDe6e4z",
+"8TxD7wiHrZ","lXFOBQChxs","Mm8siNo0Qb","cQOnvRACuj","nlaByJJs5m","djsrvKsjRK","dQ5867lUXZ","pAhR1fmIK1","Ul4a1pWiOs","5Mg9rSWfou",
+"yEfy9uLtKs","G1RhSciuWz","lViBvFVMxo","KZamHrhl0J","1j5L8EdBKc","uJScXLbRTH","618DinFqik","BGaQY8hJdt","GSQwjTCgPp","3otm6lkMUA",
+"2hEEUgdQsS","djsrvgdQsS","I7p2aQnJ1S","BCxeC9rlg9","X6Pint98iW","0Kyfs5VZjS","uPX7GSbRYy","t59lRfmIK1","RpBQme6e4z","vOqCEi7WMQ",
+"uAWypCK5W7","Zv7z0MaJQs","uvf7AK20wK","rKDLJ0MR5X","QnJ1St98iW","8cVD3HzZT8","64s8NQworu","LDk6fSmGzv","n8pJ9LewvM","pWiOs9XyT9",
+"0BmCy2hEEU","WMiS3lXFOB","WaWsvVBjhz","uLtKs8RCUA","L7cGcuAWyp","jiVBPECMvU","euZA5QbxXc","CNHmvKASQ8","HzZT8n1pmO","P6bcgazIWp",
+"DcpWBtjQxs","RBhp0gdQsS","pmeCdgjUTu","zFgtBjiVBP","7hyVv9eoRc","a00b5qUJMd","618DiS2Dfu","1v5hHBpYhV","580YDpv0i7","oVQp6Ul4a1",
+"8TxD764s8N","Nxx9VpT8wu","OUYuFdhSuH","0MR5XMmKGJ","d7vjMThjNn","14FLRD6rBy","yofH30ao3l","Pb1paoQ87r","AmdQdXyPZN","oVQp6aez9y",
+"14FLRyToGW","5Mg9rMmKGJ","OHaBz07n1c","k85Ae8U2nU","1j5L8aDGtS","ZuDtDCxVEf","No0QbDQimp","KASQ8Chuy3","NcICAoGu6x","pFrrlZUnqt",
+"FjHXRpT8wu","8cVD3ix74r","OUYuFcQOnv","FwEJz0ao3l","nlaByHfyNQ","EOE1ozz4ZU","XyPZNhe9IA","QbxXcm4bxU","lCMxyfqypy","gjUTufcJOy",
+"Waim6MaJQs","K4GS8yToGW","7ku1p48cHL","uAWypEoToP","8xEKzdQ586","xReecOxWIH","sqVrf0ao3l","ECMvUWaWsv","YOfrYvOqCE","WreyPlViBv",
+"sx5GlP6bcg","uAWyp5drc6","DG4sTgIYvE","5VZjSECMvU","brhlQlkMUA","OUYuFMkgy8","Ta8f6jzUqR","8U2nUZhwG1","qaofNaez9y","5iGN5aDGtS",
+"Chuy3OxWIH","BFkb8iqv4k","Gv3Fqd85a9","2hEEUyofH3","7lUXZ6q6L9","DcpWBJRJQB","v8yFN8U2nU","VLTy6i3pyd","GrDg7lViBv","3otm65drc6",
+"SWfou618Di","Vprf27fsYM","aDGtSHP433","vLsmSJKWYR","0h1b1Cfgr3","16lHcNcICA","B3qem64s8N","gdQsSlCMxy","CNHmvTCgPp","b29RJO3iyQ",
+"ZhwG1fqypy","Waim6Yh1hF","X6PinHRxd8","2DREsS2Dfu","xciqpO3iyQ","O3iyQfcJOy","iB08lCdyBV","o8Uyd0h1b1","yofH35iGN5","QssNCgf8rI",
+"BbwgAFVMxo","ZJTXHNOHsz","ydG8UbZLvS","WMiS345cIH","UmaEv5iGN5","aez9yMmKGJ","brhlQyToGW","pv0i7WaWsv","QworuqUJMd","vkCHHgtCA5",
+"lpF6W6AFT0","0BmCysx5Gl","CIShGyluBx","iB08llH1kt","J2mQiyToGW","IBe8k1v5hH","0KyfsQChxs","yvOMIKZamH","14FLRciuWz","uupzkWaim6",
+"NOHszQClRL","nnP8oNo0Qb","Q6LixRkQke","lViBvzz4ZU","Yf2EcSWfou","MGlTFdQ586","ZhwG11j5L8","ogLgcBCxeC","ZuDtDhe9IA","8RCUAM6qcG",
+"4W0Tlo8Uyd","yToGWIKxdL","FFDui45cIH","sx5GlfcJOy","yvOMIOz8yZ","JkzUnHP433","BbwgAogLgc","ZUnqt8xEKz","ulk41ix74r","pWiOsjtn0X",
+"d85a9VLTy6","zQt6QMm8si","8TxD7zFgtB","64s8NZ4I1v","okgRiMkgy8","ksJbyfmIK1","8hJdtk85Ae","aez9yNhXdu","SmGzvM3zXL","uN6r3SWfou",
+"ni2v1C2Irc","PYBf40Wr5y","0MR5XKASQ8","6q6L9ZuDtD","SmGzvCfgr3","CqqaDuTacx","ZuDtDUl4a1","zHF1q55rfB","yvOMIGv3Fq","ni2v1WmadA",
+"O3iyQQWxoT","In3NSYOfrY","v2eC3MezSW","0MR5X0Wr5y","6AFT05Mg9r","lj07QtaOXK","U3yw53weIF","s93MlDG4sT","s93MlyToGW","Ss0ZuWPmlx",
+"AmdQdHP433","NcICAmz8gx","DQimpWaWsv","GSQwjWaWsv","HRxd8uAWyp","GWqqX8FmFH","DcpWB2ZHdk","Qworu2hEEU","d7vjMguMb8","lH1ktlsQGo",
+"nFqikGSQwj","oQ87rfmIK1","taOXKlXFOB","jSjS3HP433","AXpwE0h1b1","ksJby2DREs","StlDJ0ao3l","he9IA2hEEU","24ARF3weIF","WDVWJuPX7G",
+"uZPqgdjsrv","YOfrYRACuj","0BmCy5drc6","P6bcgSmGzv","kZANmtvdkD","qaofNgtCA5","LewvMRmDcr","IRh48a00b5","OUYuFn1pmO","hE1Qlaez9y",
+"QworusuY4x","K4GS85IhmG","2TRI7OHaBz","Q6hMCIn3NS","2ZHdksuY4x","pAhR1pFrrl","9eoRc7fsYM","MezSWaFFss","Chuy30Wr5y","4QMc9OUqFM",
+"TCgPpuN6r3","C2Irc45cIH","fcJOyWDVWJ","ECMvUydG8U","7ku1p7X3uy","RkQke6AFT0","yToGWtlILt","lm0pDSjskQ","taOXKnlaBy","cQOnv7Ow5C",
+"yofH3oGu6x","pAhR1iwzGk","Vprf2lsQGo","QClRLlkMUA","1LB1LFcWrW","CxVEfWDVWJ","i3pydfaHir","M6qcGsqVrf","iqv4kRpBQm","yvOMILbRTH",
+"AXpwEHlUbF","G1RhSGWqqX","9eoRc1v5hH","ix74rCqqaD","Nxx9VSmGzv","EoToPW7cTs","gtCA52Yz7E","vOqCEPYBf4","5ZaEzuoStw","2TRI7618Di",
+"uZPqgjzUqR","yToGWazIWp","0BmCygf8rI","B3qemDG4sT","t98iW7fKYU","Pb1pa29QAz","ZzJHWxciqp","RsQUq3weIF","he9IAKZamH","cL0aENhXdu",
+"1j5L8CdyBV","8cVD39eoRc","7fsYMQworu","TCgPpyToGW","WmadAtl72W","JJs5mwDajX","RkQke3otm6","1v5hHSWfou","mz8gxh1zcH","FVMxo7ku1p",
+"8xEKzo8Uyd","uZPqghUTw7","BbwgAgf8rI","lViBvd7vjM","vkCHH8cVD3","Ss0ZuG1RhS","brhlQzFgtB","DcpWBjzUqR","8RCUAuQIcz","QChxskZANm",
+"45cIHQClRL","he9IAJIqXi","Ul4a1aL6AJ","piJSkMmsIo","B3qemUvlv4","kB5nPJIqXi","W3VFHP6bcg","uQIczTXQ0Z","P6bcgblLA9","CxVEfksJby",
+"1j5L8S77LH","fcwDav2eC3","dmoS7d85a9","pWiOsuJScX","lj07QLDk6f","uvf7AOUYuF","S2DfuhE1Ql","Cp3mZpvgjS","QbxXcbgJAz","8cVD3iwzGk",
+"No0QbX6Pin","UmaEvDz1R3","lsQGotAOsr","ru4UGKZamH","tuDySUvlv4","O3iyQ0BmCy","qQxHPhSSvQ","KASQ87X3uy","EOE1oFhtgl","wiHrZ618Di",
+"aDGtSWaWsv","v1HlngtCA5","blLA95VZjS","7fKYUaFFss","lsQGoRpBQm","VjCZqqQxHP","B3qem0h1b1","In3NSVBjhz","Ul4a1RACuj","IBe8kru4UG",
+"ksJby5drc6","F6PT2uupzk","wDajXcmXIX","W7cTs6q6L9","v2eC3xciqp","EoToPZ4I1v","LDk6fsuY4x","K20wKW7cTs","o8Uydsx5Gl","F6PT2uvf7A",
+"Gv3FqfcJOy","0Wr5yTa8f6","d7vjMWMiS3","DcpWBsuY4x","Nxx9VZUnqt","In3NSXflUq","K20wKiKqhr","4QMc9FxX9q","VBjhzCxVEf","v8yFNxReec",
+"ru4UGlpF6W","In3NSOz8yZ","pvgjSVBjhz","yofH3i3pyd","Vprf2uLtKs","BbwgA1v5hH","uLtKsYf2Ec","BCxeCksJby","S2Dfut98iW","faHirgtCA5",
+"n1pmO5ZaEz","DG4sTxciqp","lm0pD9XyT9","LewvMtjQxs","euZA5UlU3M","iKqhrK20wK","0PktIv2eC3","nnP8oqQxHP","Cfgr3x3LDe","8xEKzOz8yZ",
+"JkzUnHRxd8","lpF6Whe9IA","3otm6o8Uyd","29QAz14FLR","QYxC0D6rBy","lm0pDfqypy","DG4sTGXdoH","blLA95Drn0","2ZHdkeuZA5","ZzJHWfcwDa",
+"0h1b1suY4x","0MR5XFhtgl","wDajXMm8si","8hJdtK20wK","VerEAWaWsv","gtCA5EdBKc","VerEAFLsph","aL6AJ0YAGH","suY4xMaJQs","CdyBVFjHXR",
+"Z4I1vzHF1q","taOXKCdyBV","wDajXAkKTk","WMiS3KZamH","rhl0JxXTI4","QWxoT1LB1L","d7vjMYh1hF","xXTI4UmaEv","ni2v1t59lR","piJSkn8pJ9",
+"blLA9hUTw7","X6PinDQimp","FVMxoWaim6","nnP8oyluBx","IBe8k4W0Tl","hE1QlWaim6","oVQp6SmGzv","QnJ1SKASQ8","2NslmNOHsz","lsQGoGXdoH",
+"AIYUufFDrJ","618DikZANm","n8pJ9LDk6f","yvOMIfLNg8","NcICAv8yFN","Ss0ZuYw2oU","zmLYDokgRi","8xEKzyEfy9","jtn0X5drc6","b29RJuAWyp",
+"UmaEvWDVWJ","In3NSrz7Ut","SjskQuJScX","GWqqX7fKYU","qQxHPlweGy","m4bxUWaWsv","RmDcrni2v1","0KyfsNAFuw","JXljWAkKTk","Mm8sii7WMQ",
+"cmXIXZv7z0","No0QbEoToP","LewvM8TxD7","QWxoTgjUTu","Q6hMCQssNC","Ta8f6StlDJ","HRxd8CdyBV","W7cTsTwano","HRxd8tjQxs","uQIcz9GXkX",
+"blLA9HzZT8","MojnPYOfrY","StlDJ7fsYM","OUYuF0MR5X","lm0pDJ2mQi","8TxD7MGlTF","iqv4kDcpWB","lpF6WgtCA5","euZA5gtCA5","VjCZq8hJdt",
+"bgJAzMGlTF","5VZjSLewvM","dhSuHQbxXc","dmoS729QAz","iqv4kF6PT2","Yf2EcjS1aj","lXFOBRsQUq","Pb1paAXpwE","o8Uyd48cHL","IKxdLsx5Gl",
+"CK5W74W0Tl","GWqqXM3zXL","2DREsyofH3","FNYIMuJScX","aDGtSqQxHP","lkMUAv8yFN","HP433dhSuH","AXpwEix74r","zY1GY580YD","DG4sTIn3NS",
+"IBe8k9y4lw","he9IASbRYy","EOE1oulk41","fmIK14QMc9","rKDLJpmeCd","he9IANo0Qb","RBhp0wDajX","djsrvFPfSE","0BmCyJKWYR","b29RJQYxC0",
+"aez9ygf8rI","CK5W7JIqXi","VjCZqFGzgp","WDVWJtaOXK","2TRI7K4GS8","e6e4zOUqFM","Yw2oUrKDLJ","nFqikzbIYY","jSjS3ciuWz","2Nslm5Mg9r",
+"Cp3mZm4bxU","5iGN5Cp3mZ","M3zXLbgJAz","lj07Qatef2","4QMc9IKxdL","guMb8wDajX","lH1ktaFFss","YOfrY0Kyfs","xciqpuPX7G","Mkgy8brhlQ",
+"FcWrWm4bxU","gjUTuv1Hln","ZzJHWbZLvS","pFrrlZ4I1v","atef2lpF6W","KASQ8Waim6","v8yFNEOE1o","lXFOBWmadA","ZhwG1FNYIM","4W0TluTacx",
+"9XyT9WreyP","8RCUASbRYy","CxVEfHfyNQ","FGzgp2Yz7E","aL6AJulk41","fcJOylweGy","Ss0ZulH1kt","JIqXiFcWrW","i3pydS77LH","Mm8si5nmWv",
+"5VZjSpT8wu","OxWIHGv3Fq","FFDui5ZaEz","5IhmGjfREu","3weIF0ao3l","RpBQmtuDyS","OUYuFCfgr3","24ARFWmadA","EdBKcAkKTk","dmoS7ZuDtD",
+"0BmCypv0i7","ksJby6AFT0","soy9tt59lR","WreyPAgJHQ","FFDuiYh1hF","9XyT9djsrv","mX2GEUl4a1","2ZHdkiB08l","M6qcGFPfSE","RkQkeM3zXL",
+"wDajXKsjRK","AXpwEFcWrW","QbxXcqQxHP","No0QbAXpwE","9XyT9uJScX","QnJ1S6q6L9","ciuWz0YAGH","UlU3MBbwgA","2Yz7EU3yw5","5ZaEzMojnP",
+"ECMvU5ZaEz","TwanoEOE1o","2hEEUQworu","DQimphe9IA","JJs5m8TxD7","EoToP2Yz7E","s4786hE1Ql","JJs5mIKxdL","cL0aE4W0Tl","FGzgpm4bxU",
+"vOqCEMmKGJ","QbxXcFcWrW","BbwgACfgr3","vkCHHQClRL","taOXK2Yz7E","ZuDtD4QMc9","9y4lwrz7Ut","Waim65Mg9r","xciqpGSQwj","OxWIHx3LDe",
+"1j5L8FxX9q","okgRiv1Hln","FNYIMo8Uyd","QssNCVNCPd","5Mg9rqQxHP","m4bxUDG4sT","55rfBn8pJ9","XflUqM3zXL","O3iyQL7cGc","S2DfuprNT6",
+"cShY2uN6r3","uupzkZuDtD","MGlTF0h1b1","0PktITwano","8U2nUHlUbF","jtn0XsqVrf","G1RhSOxWIH","S2Dfuhi5X7","iB08lQWxoT","0BmCyjiVBP",
+"JJs5m5Namm","4W0Tlaez9y","yofH3HRxd8","hi5X7k85Ae","zmLYDWreyP","JXljWCxVEf","8xEKzF6PT2","2hEEUMaJQs","X6PinoQ87r","iwzGkNxx9V",
+"zQt6QJKWYR","wiHrZ0Wr5y","FNYIMGrDg7","QssNCWMiS3","C2IrcOHaBz","rKDLJ8cVD3","i3pydeuZA5","nnP8oaDGtS","AgJHQlkMUA","lXFOBhi5X7",
+"fmIK1ZhwG1","ZuDtDvOqCE","CqqaD5Mg9r","xXTI4t98iW","fFDrJYf2Ec","xciqpbrhlQ","iKqhrtvdkD","azIWp4dEz6","ZzJHW3otm6","24ARFVprf2",
+"0KyfsprNT6","pAhR1FxX9q","aez9yQYxC0","y94nw9eoRc","Cp3mZChuy3","jeskSMmsIo","LDk6fL7cGc","NcICAuZPqg","jiVBPKsjRK","QWxoTlsQGo",
+"zbIYYRACuj","L7cGcn1pmO","lXFOBGSQwj","UlU3MZhwG1","UmaEv3otm6","9XyT9fcwDa","L7cGcl83Ud","azIWpd7vjM","3weIFJKWYR","JIqXiv2eC3",
+"Q6hMCdhSuH","5Drn0FxX9q","cQOnvlViBv","pWiOs1j5L8","HzZT8jSjS3","AOgEeQYxC0","FPfSEPYBf4","iKqhryofH3","ydG8UWreyP","blLA9QWxoT",
+"FhtglVIlwP","bZLvS580YD","MmKGJcmXIX","uN6r3b29RJ","5iGN57lUXZ","8hJdt8xEKz","bgJAzzmLYD","K20wK2hEEU","MmKGJFnPFB","iqv4kulk41",
+"48cHL0MR5X","C2IrcUl4a1","pT8wuZ4I1v","1j5L8oVQp6","GXdoHVjCZq","FFDuiKsjRK","he9IAo8Uyd","HP433IKxdL","Dz1R3tlILt","IBe8kYh1hF",
+"TwanoNo0Qb","DQimpU3yw5","tAOsr0MR5X","d7vjM2ZHdk","GXdoHYOfrY","CIShGVBjhz","Uvlv4aez9y","NOHszaDGtS","s4786x3LDe","G1RhSZhwG1",
+"NcICAjiVBP","1v5hHQbxXc","EOE1o0BmCy","FnPFByluBx","TwanoeuZA5","FFDui9GXkX","2NslmxReec","QbxXc1j5L8","oVQp6OUqFM","t98iWlm0pD",
+"Yh1hFpiJSk","zY1GY9rlg9","8hJdtXyPZN","5Drn0s4786","kZANm3otm6","TCgPpv8yFN","5VZjSVLTy6","euZA5MmsIo","QworuvkCHH","BbwgA9y4lw",
+"EOE1oFnPFB","LewvMDz1R3","B3qemb29RJ","fFDrJWaWsv","7Ow5Cuupzk","AmdQddhSuH","pv0i7v1Hln","2TRI7MK07Y","J2mQiy94nw","Twanoiqv4k",
+"8U2nU1j5L8","ksJbyU3yw5","O3iyQ6AFT0","blLA93otm6","BbwgA0ao3l","y94nwVjCZq","tvdkDMm8si","FjHXRyEfy9","rz7UtHlUbF","hYBCKgf8rI",
+"tvdkDNxx9V","oVQp65Drn0","prNT62DREs","nnP8oU3yw5","IjTwP7Ow5C","C2Irct98iW","Vprf2D6rBy","FwEJz5IhmG","FGzgp5ZaEz","t98iWM6qcG",
+"h1zcHAXpwE","C2IrcVjCZq","zHF1q3weIF","SWfouOUqFM","QbxXcFNYIM","d85a99y4lw","vLsmSWmadA","uJScXlViBv","yofH3lXFOB","6q6L9M3zXL",
+"VjCZq9y4lw","UmaEvW3VFH","9iGoTulk41","piJSkECMvU","zbIYYkZANm","HlUbF9y4lw","K4GS82Yz7E","uZPqghi5X7","hUTw7guMb8","J2mQizbIYY",
+"U3yw5d7vjM","3weIFL7cGc","JIqXiwiHrZ","ulk41lCMxy","FPfSEaL6AJ","48cHLU3yw5","580YDd85a9","5Mg9rCp3mZ","ThjNnMaJQs","oQ87rDLhzM",
+"qQxHPWaWsv","29QAzwDajX","QYxC0KsjRK","S2Dfus93Ml","L7cGc618Di","NAFuwHRxd8","0KyfstvdkD","8U2nUlCMxy","yvOMI1v5hH","QClRLCdyBV",
+"I7p2acShY2","AXpwEaDGtS","8cVD3FcWrW","RzaZAVerEA","HRxd8FVMxo","Q6hMCpv0i7","XflUqix74r","pv0i7k85Ae","oQ87rL7cGc","Cfgr3mX2GE",
+"xciqpZJTXH","vLsmSzY1GY","Qworufqypy","MezSWQ6hMC","0h1b1CxVEf","TCgPpLewvM","P6bcgSbRYy","BbwgAzmLYD","zz4ZUgjUTu","ksJbylCMxy",
+"ZuDtDDcpWB","jS1aj3weIF","Q6LixFLsph","t98iWTa8f6","16lHcRmDcr","euZA5LbRTH","hE1QlkB5nP","TwanoVIlwP","HzZT8Ss0Zu","RACujZUnqt",
+"DLhzMqUJMd","gjUTuZ4I1v","jeskSpvgjS","K20wKqaofN","VLTy6cL0aE","sqVrf07n1c","k85AefLNg8","ZzJHWuAWyp","8hJdtZJTXH","ThjNnrz7Ut",
+"TXQ0Zv8yFN","Dz1R3XyPZN","8hJdtZzJHW","pv0i7lweGy","AgJHQTa8f6","uN6r30h1b1","QChxsBFkb8","xReecRACuj","VLTy6QYxC0","OUqFM07n1c",
+"JJs5mni2v1","iKqhrGSQwj","AXpwEv8yFN","B3qemguMb8","Dz1R3BbwgA","RkQke16lHc","IKxdLgdQsS","SWfou7X3uy","MezSWjS1aj","QClRLciuWz",
+"ZJTXHdhSuH","HzZT8qQxHP","8hJdtY1mC0","WmadAYf2Ec","hi5X7M6qcG","HlUbFkB5nP","suY4xoVQp6","JXljWRzaZA","5VZjSOxWIH","ZJTXHtl72W",
+"580YDFGzgp","he9IAKsjRK","vLsmSChuy3","ZJTXH4W0Tl","lCMxyMezSW","8U2nUTCgPp","iKqhrrhl0J","OxWIHNhXdu","K20wKB3qem","pmeCd7lUXZ",
+"hE1QlxXTI4","uQIczZhwG1","Mm8sitaOXK","iqv4kfFDrJ","0Wr5y1j5L8","QChxsjS1aj","AkKTkVBjhz","QbxXc64s8N","e6e4zF6PT2","8RCUAuZPqg",
+"yluBxEdBKc","soy9tHfyNQ","uvf7ApvgjS","iB08l9GXkX","djsrvdQ586","lj07QQworu","4dEz65VZjS","29QAz7fKYU","JKWYR8TxD7","IRh48uLtKs",
+"euZA5EdBKc","dhSuHEOE1o","ogLgc1v5hH","48cHLuN6r3","RBhp0o8Uyd","FVMxotuDyS","8cVD3W7cTs","cmXIXFVMxo","qQxHPCIShG","Q6hMClsQGo",
+"2hEEUiqv4k","zbIYY24ARF","uupzkDz1R3","jeskSMaJQs","hSSvQcQOnv","ogLgcb29RJ","azIWpjzUqR","JIqXiRpBQm","RmDcrfcJOy","lpF6WlkMUA",
+"n8pJ945cIH","vLsmSIBe8k","VBjhz0BmCy","rhl0JRsQUq","uupzkCxVEf","QworuCNHmv","k85AeMmKGJ","SWfouJKWYR","Y1mC0AIYUu","lViBvLDk6f",
+"7Ow5CjeskS","5iGN5xReec","7ku1pdjsrv","aL6AJCK5W7","AmdQd8xEKz","2ZHdkNo0Qb","fcwDataOXK","qUJMdOz8yZ","fmIK1zbIYY","zFgtB2Nslm",
+"5ZaEzB3qem","WMiS3QYxC0","RpBQm0ao3l","Yw2oUru4UG","uvf7AazIWp","FcWrWlsQGo","1v5hH2DREs","n1pmOpmeCd","vOqCEFjHXR","RmDcrQChxs",
+"RpBQmatef2","JXljWIRh48","x3LDe8RCUA","yluBxfcJOy","zbIYYcShY2","WmadAiKqhr","7hyVvRmDcr","Oz8yZt59lR","kB5nPQ6Lix","mz8gx55rfB",
+"ydG8UEdBKc","lViBvpWiOs","lj07Qaez9y","tuDySO3iyQ","16lHc3weIF","Q6Lixm4bxU","jzUqRokgRi","pvgjSPYBf4","oQ87rMK07Y","gf8rI4dEz6",
+"m4bxUYh1hF","RBhp0fcJOy","8TxD7h1zcH","RmDcruZPqg","1LB1L1j5L8","jzUqRHRxd8","d7vjMi3pyd","DG4sTAOgEe","LewvMC2Irc","uLtKspv0i7",
+"Zv7z0fmIK1","M3zXLh1zcH","6q6L9WmadA","uTacxFwEJz","jzUqR7hyVv","FhtgluLtKs","3weIF2Nslm","nFqikRsQUq","QssNCt98iW","nnP8ojzUqR",
+"QnJ1S7fsYM","CqqaDuQIcz","suY4xciuWz","nlaByCK5W7","29QAzxciqp","l83UdRmDcr","UmaEvBCxeC","mz8gxCNHmv","cmXIXpFrrl","HzZT8pvgjS",
+"jiVBP5iGN5","gjUTuogLgc","AgJHQAOgEe","SbRYyPYBf4","pWiOszz4ZU","8xEKzQClRL","RACujtjQxs","x3LDeatef2","wDajXCdyBV","HRxd87fsYM",
+"Ss0ZuGv3Fq","MGlTFQ6Lix","zQt6QAIYUu","xciqpuLtKs","In3NS8TxD7","e6e4zFwEJz","Z4I1vt98iW","EoToPsqVrf","n1pmOUmaEv","0KyfsPYBf4",
+"FPfSEni2v1","GXdoHv1Hln","ksJby3otm6","XyPZNQ6hMC","7fKYUv8yFN","dmoS7sx5Gl","X6PineuZA5","U3yw5Q6Lix","FGzgp1v5hH","0Kyfs8hJdt",
+"W7cTsNxx9V","he9IAuoStw","Gv3Fq2ZHdk","ReKEWcL0aE","gf8rIgIYvE","uoStwLDk6f","NOHsz0ao3l","ZJTXHogLgc","Nxx9VLDk6f","lCMxydjsrv",
+"BCxeCfLNg8","ogLgcvkCHH","4QMc9wDajX","fLNg8djsrv","dpe1vSjskQ","ECMvUIKxdL","tvdkDlweGy","GXdoH2ZHdk","WPmlxy94nw","9iGoTcShY2",
+"LewvM07n1c","LbRTHhe9IA","1v5hHD6rBy","zbIYYaL6AJ","Chuy3XyPZN","nFqikJJs5m","gf8rIlViBv","uZPqghSSvQ","d85a95nmWv","WMiS3blLA9",
+"ECMvUl83Ud","BGaQYK4GS8","0YAGHrKDLJ","FLsphRsQUq","7Ow5CnnP8o","nlaBygf8rI","Dz1R3pWiOs","VjCZqVLTy6","9GXkXG1RhS","RBhp0Oz8yZ",
+"uoStwKASQ8","IKxdLzFgtB","piJSkrKDLJ","ZJTXHjSjS3","v1HlnCp3mZ","KASQ8AIYUu","FLsphMmsIo","guMb8uTacx","bgJAzX6Pin","ZJTXHzQt6Q",
+"uLtKsCIShG","Yw2oUUlU3M","tlILtd85a9","zz4ZUlm0pD","aez9ykZANm","cmXIXRACuj","Kr8yspvgjS","hE1QlJKWYR","pT8wuBCxeC","F6PT2ulk41",
+"lj07Qjtn0X","WmadA2TRI7","he9IAXflUq","0Wr5y0Kyfs","5Namm6AFT0","jtn0XyToGW","m4bxUe6e4z","Rxrsm7hyVv","i7WMQUvlv4","EoToPUvlv4",
+"4dEz6GSQwj","CxVEf7Ow5C","dmoS7soy9t","DcpWBpiJSk","lH1ktt98iW","Q6hMCDQimp","55rfBQWxoT","brhlQcQOnv","s4786DQimp","o8UydIRh48",
+"MmsIoQnJ1S","W7cTsFcWrW","pWiOshi5X7","LbRTHEoToP","B3qemnlaBy","8xEKz5VZjS","KASQ8n8pJ9","OHaBzChuy3","DQimpdmoS7","CdyBVIKxdL",
+"TXQ0ZlViBv","iqv4kChuy3","FhtgluAWyp","Yf2EcuZPqg","t59lRHRxd8","cL0aEe6e4z","P6bcgFNYIM","tjQxsWMiS3","lkMUA0Kyfs","Mkgy8Z4I1v",
+"tjQxs2ZHdk","7hyVvfqypy","64s8NMojnP","55rfBzFgtB","k85Ae0Kyfs","l83UdLbRTH","Pb1paPYBf4","Chuy3UmaEv","2Yz7EgjUTu","2Nslmv2eC3",
+"i7WMQa00b5","aL6AJHlUbF","MojnPWaim6","Fhtgluupzk","S77LHni2v1","9rlg98U2nU","cL0aEsqVrf","ZhwG1zFgtB","lm0pDFLsph","uN6r3618Di",
+"CxVEfzFgtB","EOE1o8FmFH","aL6AJhE1Ql","ni2v1Twano","Y1mC0bgJAz","SWfou2DREs","Yw2oUtlILt","iqv4k2TRI7","pmeCdt59lR","WaWsvKASQ8",
+"pFrrln8pJ9","StlDJThjNn","JkzUnprNT6","3weIFaL6AJ","bZLvSMmsIo","hSSvQbZLvS","K4GS8fcwDa","RmDcrJ2mQi","7X3uy07n1c","WreyP5Namm",
+"cmXIXgf8rI","Yf2EcWPmlx","dhSuHvLsmS","2NslmkB5nP","FjHXR2Yz7E","FGzgphE1Ql","5VZjSkB5nP","mX2GEQYxC0","OxWIHJ2mQi","9iGoTO3iyQ",
+"Mm8sil83Ud","MaJQsCdyBV","ZzJHW0Wr5y","2Yz7EY1mC0","TwanoFGzgp","iB08l7ku1p","tAOsrCdyBV","FFDuiFjHXR","Q6LixUlU3M","bgJAz0Kyfs",
+"WreyPlkMUA","uvf7AL7cGc","2hEEUHzZT8","KZamHReKEW","1j5L8uQIcz","Uvlv4Yh1hF","AmdQdJIqXi","gdQsSUmaEv","Nxx9V8FmFH","7hyVv24ARF",
+"9XyT9Yw2oU","atef2sx5Gl","8cVD3BCxeC","RACujJKWYR","prNT6pvgjS","0MR5XDG4sT","k85AeQ6hMC","2TRI7G1RhS","m4bxUUl4a1","iwzGkcmXIX",
+"O3iyQfcwDa","pAhR1Cp3mZ","hUTw7dhSuH","zbIYYcmXIX","iwzGkUmaEv","piJSkuQIcz","uLtKsLDk6f","EOE1oYh1hF","fLNg8gjUTu","zbIYYKr8ys",
+"lm0pD2Nslm","RsQUqZUnqt","8TxD72Nslm","aFFsszbIYY","W3VFHpT8wu","faHirThjNn","wiHrZGSQwj","1j5L8aL6AJ","gdQsSWMiS3","cL0aEoQ87r",
+"qQxHPWMiS3","VLTy6n8pJ9","QClRL7fsYM","BGaQYJJs5m","tl72WVLTy6","lH1ktbgJAz","EdBKcRmDcr","YjB9the9IA","QWxoTh1zcH","SjskQ1LB1L",
+"prNT6h1zcH","4dEz6pT8wu","djsrvpWiOs","zqH0W14FLR","hi5X7i3pyd","mX2GE2ZHdk","CdyBViB08l","8TxD7Qworu","jSjS3faHir","QChxsG1RhS",
+"AmdQdAkKTk","8TxD7tjQxs","XyPZN45cIH","lj07Qa00b5","CIShG5iGN5","qQxHPyluBx","5VZjS7X3uy","v2eC3580YD","QYxC0uN6r3","bgJAz8FmFH",
+"QworuPYBf4","uZPqgCqqaD","Pb1pahi5X7","yluBx24ARF","iqv4kQYxC0","K20wKtjQxs","t59lRXflUq","Dz1R3zHF1q","0PktIPOUYS","FcWrWRmDcr",
+"0YAGHydG8U","zFgtBtAOsr","WMiS3RsQUq","AgJHQZUnqt","8FmFHCNHmv","JXljWUvlv4","hYBCKZzJHW","AOgEeazIWp","l83UdbgJAz","rKDLJ1LB1L",
+"aFFssG1RhS","0KyfsVerEA","45cIHMmKGJ","OxWIH4dEz6","suY4xVBjhz","IKxdLix74r","suY4xsuY4x","JJs5m9XyT9","oQ87rBbwgA","SWfounlaBy",
+"yvOMIBGaQY","qaofNFNYIM","nlaByD6rBy","5iGN5Qworu","zmLYDqaofN","OUYuFuJScX","i3pydPb1pa","7Ow5C3weIF","iB08ldjsrv","suY4xKZamH",
+"Oz8yZ7fKYU","gf8rI5drc6","d7vjMJJs5m","UmaEvzbIYY","NcICAWDVWJ","2Nslm8cVD3","QworuD6rBy","MaJQsK20wK","0YAGHzmLYD","6q6L9CdyBV",
+"lXFOBe6e4z","0h1b1580YD","9rlg9yvOMI","5Mg9rxReec","xXTI4hi5X7","YOfrYFNYIM","iwzGkn8pJ9","uN6r3K4GS8","uN6r3G1RhS","tAOsr3otm6",
+"8U2nUSs0Zu","zY1GY9XyT9","F6PT2Ta8f6","VerEAlViBv","aL6AJzz4ZU","IRh48Vprf2","uZPqgn8pJ9","9iGoTlH1kt","ZuDtDVprf2","K20wKP6bcg",
+"Ta8f6uQIcz","FLsphSWfou","iwzGkydG8U","HP4335ZaEz","1v5hHVBjhz","suY4x8hJdt","TCgPpjiVBP","6AFT0Yh1hF","kB5nPpvgjS","DQimpn1pmO",
+"SmGzvoGu6x","rhl0JMmKGJ","ZJTXHru4UG","ulk41zY1GY","dhSuHjtn0X","Ta8f6AmdQd","GWqqXEoToP","x3LDe0ao3l","FxX9q64s8N","5nmWv0Wr5y",
+"2DREsfcwDa","O3iyQHP433","VLTy6ZuDtD","Q6hMCgf8rI","Yf2Ecx3LDe","gtCA5KASQ8","14FLRlj07Q","Y1mC0MK07Y","jfREuWDVWJ","i7WMQAXpwE",
+"uAWypuJScX","kZANmh1zcH","NOHszS77LH","Ul4a1JRJQB","Vprf29GXkX","pFrrlRxrsm","FcWrWTa8f6","y94nwpiJSk","gdQsSKr8ys","M6qcGpv0i7",
+"cQOnvogLgc","RACujWaim6","t59lRNo0Qb","SmGzvyofH3","lpF6WtjQxs","zmLYDsqVrf","2TRI7uPX7G","YjB9tVprf2","9rlg9X6Pin","POUYSM3zXL",
+"sx5Glhi5X7","oQ87rTa8f6","gdQsSYh1hF","lXFOBlH1kt","W3VFHFVMxo","8TxD7Fhtgl","Mm8siJKWYR","uN6r3DG4sT","OUqFM5VZjS","pmeCd5Drn0",
+"Yh1hFlj07Q","bgJAz9iGoT","QworuJJs5m","brhlQhi5X7","FnPFBqaofN","1j5L8he9IA","okgRidhSuH","FLsph45cIH","JRJQBjS1aj","zY1GY0h1b1",
+"s7MxkaL6AJ","v1HlnpT8wu","fcJOyRxrsm","14FLRK4GS8","FPfSEdjsrv","jiVBP8xEKz","yluBxZuDtD","5drc629QAz","jfREuFjHXR","WreyP2Yz7E",
+"2Yz7EOUYuF","DcpWBhUTw7","FLsphblLA9","taOXKv2eC3","Cfgr3ciuWz","iB08lI7p2a","5nmWvCNHmv","Uvlv4tvdkD","iB08lyEfy9","7hyVvW7cTs",
+"4W0TltaOXK","pv0i7e6e4z","Yf2EcQYxC0","SmGzvk85Ae","uvf7ABpYhV","GXdoHBbwgA","5IhmGWreyP","uLtKs0Wr5y","jS1ajdpe1v","Q6hMCydG8U",
+"uZPqgUl4a1","iKqhrMGlTF","k85Ae6q6L9","prNT6Waim6","CxVEfFwEJz","DQimpPYBf4","WPmlxfmIK1","RzaZAFjHXR","jSjS3ThjNn","GSQwjCqqaD",
+"TwanoO3iyQ","hYBCK4dEz6","RACujtaOXK","rhl0JDz1R3","VBjhzvOqCE","NcICAjtn0X","soy9toVQp6","L7cGcIBe8k","atef2WaWsv","vkCHHpFrrl",
+"ZhwG1WMiS3","s7Mxk5iGN5","JIqXiVIlwP","ksJbyFnPFB","45cIHWMiS3","RBhp0jtn0X","okgRitjQxs","FcWrWuAWyp","AmdQdh1zcH","7X3uyS2Dfu",
+"fFDrJiKqhr","iqv4k5IhmG","iwzGk0BmCy","U3yw5hi5X7","JRJQB9eoRc","tlILtd7vjM","Cp3mZ2TRI7","jzUqR6q6L9","dQ586x3LDe","uupzkfcJOy",
+"pWiOs0ao3l","VLTy6LewvM","W3VFH0YAGH","BGaQYt59lR","TCgPplXFOB","kZANmtaOXK","tuDySD6rBy","y94nwThjNn","8hJdtQClRL","zHF1q9iGoT",
+"8xEKz6AFT0","fFDrJMm8si","QbxXcatef2","D6rByoQ87r","cmXIXi3pyd","cShY2dpe1v","uoStwvOqCE","iB08ljtn0X","PYBf4AIYUu","FPfSEdmoS7",
+"GXdoHfLNg8","ZuDtDFhtgl","JIqXiuTacx","MK07YvLsmS","atef2iKqhr","kZANmSWfou","1v5hHDz1R3","SmGzv48cHL","2TRI7x3LDe","oVQp6uZPqg",
+"aDGtSZ4I1v","uN6r3YjB9t","MaJQstjQxs","5Drn07fKYU","ciuWzRBhp0","ZhwG1YOfrY","4W0TlGWqqX","atef2QnJ1S","hSSvQ3otm6","l83UdsuY4x",
+"RzaZAS2Dfu","VLTy63weIF","b29RJX6Pin","gjUTu2DREs","FVMxomX2GE","oQ87rHlUbF","8hJdt6AFT0","NOHszy94nw","0h1b1lm0pD","y94nwTa8f6",
+"RsQUqNcICA","Vprf2W3VFH","YOfrYtjQxs","ZhwG1GXdoH","JJs5mVIlwP","5VZjSL7cGc","fFDrJTwano","SmGzv0BmCy","uupzkNhXdu","ZUnqtcL0aE",
+"xciqpKASQ8","QChxsv1Hln","lj07QeuZA5","lViBv2TRI7","JIqXiC2Irc","ix74rk85Ae","6q6L9HlUbF","2NslmaL6AJ","2hEEUzz4ZU","Waim6RzaZA",
+"WaWsvsoy9t","EdBKcfcJOy","W7cTsrz7Ut","JkzUnRmDcr","ReKEWqaofN","Zv7z0KASQ8","euZA5okgRi","9iGoTJIqXi","n8pJ9XyPZN","FGzgp5IhmG",
+"FPfSERzaZA","uupzkVprf2","zQt6QprNT6","JKWYRMm8si","nnP8oxReec","55rfB2Nslm","pv0i70Kyfs","RpBQmn8pJ9","lm0pDprNT6","48cHLfcwDa",
+"StlDJO3iyQ","FFDuiSs0Zu","KZamHRsQUq","NhXduNo0Qb","FPfSELDk6f","ThjNn618Di","tlILt7ku1p","FnPFBcmXIX","Zv7z0zmLYD","jiVBPlpF6W",
+"bZLvSFVMxo","I7p2ablLA9","lpF6WAgJHQ","2hEEU618Di","ZhwG18U2nU","jiVBPAIYUu","qaofN7Ow5C","nFqik0MR5X","lweGyoGu6x","lViBvgdQsS",
+"8xEKzWmadA","UmaEvmX2GE","MK07Y0PktI","i3pydL7cGc","b29RJWmadA","fcJOycShY2","5Mg9rjSjS3","KsjRKs4786","i3pydUvlv4","pvgjSQChxs",
+"64s8N4W0Tl","MK07YGXdoH","FxX9qFLsph","ReKEWiB08l","uZPqg580YD","fcJOyn1pmO","Zv7z0dhSuH","yEfy9e6e4z","zmLYDZJTXH","fcJOyk85Ae",
+"RxrsmfmIK1","cShY2HzZT8","QworuDcpWB","LewvMRBhp0","lCMxybZLvS","uvf7AiwzGk","lm0pDuoStw","blLA99y4lw","HfyNQv8yFN","v2eC3FNYIM",
+"WMiS3JJs5m","qaofN8RCUA","DLhzMAXpwE","e6e4zUlU3M","atef2aFFss","iqv4kZUnqt","jzUqRb29RJ","IBe8kzqH0W","ZuDtDTa8f6","RkQkeThjNn",
+"jSjS32hEEU","HlUbFFwEJz","i3pydTXQ0Z","IjTwPbrhlQ","uZPqgHzZT8","yToGWFFDui","lm0pDMm8si","2DREsiqv4k","F6PT27X3uy","i3pyd48cHL",
+"0MR5Xt98iW","IKxdL5IhmG","vkCHHvkCHH","AIYUuXyPZN","pAhR1YOfrY","0ao3lfFDrJ","Q6LixAkKTk","OHaBz6q6L9","lH1ktnnP8o","he9IA0PktI",
+"XyPZNOxWIH","aFFssO3iyQ","C2Irc0Kyfs","8hJdtazIWp","OxWIHMkgy8","14FLRtjQxs","Cp3mZfcJOy","iB08lFNYIM","BCxeCjzUqR","sx5GlBFkb8",
+"5IhmGt59lR","9XyT9Q6hMC","Uvlv4M6qcG","yvOMIJXljW","2NslmFhtgl","uZPqgiwzGk","AkKTkJIqXi","b29RJgjUTu","b29RJGSQwj","OxWIHZv7z0",
+"RsQUqciuWz","i7WMQYf2Ec","uPX7GyvOMI","QWxoTTXQ0Z","ThjNnKr8ys","MaJQsaL6AJ","jiVBPFxX9q","jzUqRqaofN","lweGywDajX","ogLgcatef2",
+"CK5W7cL0aE","4W0Tl07n1c","MojnPtvdkD","GrDg7nnP8o","b29RJ0PktI","WreyPhYBCK","9eoRcjzUqR","atef2U3yw5","J2mQiuZPqg","ThjNnUlU3M",
+"48cHLNo0Qb","DQimpJXljW","lsQGoXyPZN","ogLgcIKxdL","CxVEffLNg8","HzZT8AIYUu","uJScXMojnP","U3yw5F6PT2","PYBf4ru4UG","dQ586dhSuH",
+"ulk41i3pyd","VerEA3weIF","ZJTXHJJs5m","8RCUAStlDJ","Y1mC0FLsph","9eoRcFFDui","WaWsvFcWrW","VIlwPcL0aE","SmGzvWaWsv","UmaEvokgRi",
+"QbxXcy94nw","VjCZqtAOsr","wiHrZogLgc","CIShGQ6hMC","JXljWtuDyS","hi5X7xReec","580YDXyPZN","CxVEfdjsrv","DcpWBCK5W7","580YDSs0Zu",
+"LewvM9y4lw","jSjS3FFDui","FNYIM7Ow5C","i3pydoVQp6","Vprf2dpe1v","vLsmSRsQUq","uoStwoQ87r","9iGoT64s8N","K20wKuAWyp","tuDySpWiOs",
+"yofH37hyVv","HfyNQ4QMc9","WreyPMaJQs","NOHszrhl0J","Z4I1vl83Ud","CxVEf2DREs","Ss0ZuFFDui","nnP8oZJTXH","580YDtvdkD","16lHc7fsYM",
+"wiHrZGrDg7","wDajX3otm6","tl72WL7cGc","8RCUAVjCZq","jeskShi5X7","pmeCd2Yz7E","jeskS9GXkX","Dz1R3azIWp","Waim6YjB9t","a00b56AFT0",
+"DLhzMlsQGo","3weIFOxWIH","GSQwjMaJQs","QWxoTcmXIX","ZuDtDJRJQB","KASQ8nnP8o","MGlTF7ku1p","4W0TlAgJHQ","IjTwPuLtKs","cmXIXQ6Lix",
+"VjCZqCdyBV","suY4x5iGN5","WreyPyluBx","RBhp05Mg9r","lkMUAHP433","C2IrcW3VFH","AXpwElj07Q","FFDui0h1b1","vOqCEGv3Fq","e6e4zdmoS7",
+"BCxeCW3VFH","lweGyfcJOy","HlUbFNxx9V","FxX9qfqypy","zY1GYt59lR","HlUbFZJTXH","uvf7AOUqFM","djsrvcQOnv","rKDLJ0h1b1","hUTw7U3yw5",
+"0ao3lCdyBV","n1pmOCK5W7","ru4UGpvgjS","JXljWd85a9","7X3uy2hEEU","n8pJ9zY1GY","rz7UtazIWp","JRJQBWMiS3","DLhzMYh1hF","zQt6Qd85a9",
+"sx5GlsqVrf","CqqaDaDGtS","gIYvEIn3NS","lXFOBn1pmO","ulk41jSjS3","VerEAgjUTu","wDajXd85a9","RkQkeUvlv4","J2mQiYw2oU","euZA5iKqhr",
+"Kr8ysIRh48","zz4ZU0h1b1","7Ow5CDLhzM","pAhR1IKxdL","MojnP7lUXZ","Gv3FqUl4a1","IjTwPVBjhz","EOE1ogIYvE","ECMvUsqVrf","gtCA5wDajX",
+"oQ87rJJs5m","2ZHdk8TxD7","zz4ZUatef2","X6PinPOUYS","DLhzMa00b5","UmaEvn8pJ9","S2Dfuv1Hln","fmIK1faHir","C2IrcfmIK1","TCgPpfFDrJ",
+"fmIK1e6e4z","9XyT9zHF1q","9iGoTTXQ0Z","azIWphUTw7","djsrvaez9y","vkCHHGXdoH","v1HlnBCxeC","0ao3lHzZT8","NhXdu0MR5X","iqv4kMaJQs",
+"qQxHPLewvM","Q6LixWPmlx","FnPFBNAFuw","M6qcGd7vjM","cQOnv3weIF","IRh48uPX7G","nFqikZuDtD","VBjhzulk41","JkzUnzbIYY","jzUqRwiHrZ",
+"MojnPuoStw","8FmFHHlUbF","M3zXL9eoRc","No0QbaL6AJ","jS1ajFcWrW","RkQkeQClRL","ksJbywDajX","o8UydjfREu","FNYIMHRxd8","W3VFHru4UG",
+"aFFssMojnP","FGzgpMm8si","WDVWJRmDcr","9eoRcMojnP","KASQ8OUqFM","fFDrJydG8U","ix74riwzGk","No0QbSWfou","L7cGcI7p2a","0PktIGXdoH",
+"uAWypMojnP","oGu6xVerEA","X6PinZuDtD","aL6AJQssNC","tjQxsLewvM","FnPFBwiHrZ","9y4lwZJTXH","hSSvQF6PT2","64s8NgtCA5","Q6hMCnnP8o",
+"K4GS8kB5nP","0YAGH7fKYU","1v5hH14FLR","k85Aeru4UG","64s8N16lHc","4QMc9bgJAz","8FmFHZuDtD","618Dit98iW","3otm6JIqXi","QChxsL7cGc",
+"fmIK1zz4ZU","mX2GEAXpwE","M3zXLChuy3","J2mQi2Yz7E","VNCPdB3qem","Mm8siHlUbF","zmLYDCfgr3","7Ow5CuN6r3","2hEEUU3yw5","tlILtRsQUq",
+"uJScX14FLR","euZA5vOqCE","IKxdLZhwG1","uPX7GBbwgA","hSSvQZUnqt","Waim6NhXdu","5nmWvmX2GE","No0QbJIqXi","ECMvUgIYvE","CdyBVRmDcr",
+"FLsphRBhp0","NhXduMmKGJ","B3qemFwEJz","FjHXR0YAGH","RmDcrVNCPd","zmLYDazIWp","5drc6ThjNn","MaJQsGrDg7","0YAGHd7vjM","uPX7GKr8ys",
+"Ul4a15Namm","tl72W5iGN5","2DREsksJby","WMiS3FwEJz","jzUqRkB5nP","xReecB3qem","ZzJHWs7Mxk","CNHmv07n1c","29QAzhYBCK","iwzGkblLA9",
+"dQ586Y1mC0","5IhmGyEfy9","WaWsvChuy3","CqqaDTwano","Yh1hF7hyVv","s7MxkjfREu","RzaZAWDVWJ","NhXduO3iyQ","NcICA0ao3l","oGu6xuTacx",
+"0h1b10Wr5y","WDVWJyofH3","x3LDeQssNC","vOqCEv1Hln","yToGW0Wr5y","2NslmjfREu","9iGoTgIYvE","AIYUuuAWyp","ksJbyfqypy","iB08l3weIF",
+"RxrsmvOqCE","2NslmvOqCE","7fKYUokgRi","wDajXb29RJ","0Wr5yeuZA5","EOE1odjsrv","OHaBzru4UG","yEfy9qQxHP","ulk41fcwDa","pAhR1AgJHQ",
+"QworufLNg8","0h1b1EoToP","FFDuiatef2","m4bxUwDajX","fmIK1SbRYy","WmadATwano","yofH3JIqXi","SWfou45cIH","djsrvs4786","0KyfsW7cTs",
+"RmDcruupzk","7lUXZFFDui","OxWIHqUJMd","RkQket98iW","KZamHVprf2","SbRYyUl4a1","FwEJz0Kyfs","mz8gxCIShG","W3VFHVLTy6","6AFT0JIqXi",
+"DcpWBpFrrl","ECMvUXflUq","faHirZ4I1v","BCxeC618Di","RsQUq48cHL","RkQkesx5Gl","uoStw8TxD7","NOHsznFqik","U3yw5NhXdu","uQIczLDk6f",
+"WmadAtjQxs","lpF6WFcWrW","b29RJStlDJ","7X3uyqUJMd","HRxd8Oz8yZ","9iGoTdpe1v","UmaEvFhtgl","hE1Qlt98iW","brhlQOxWIH","uTacxk85Ae",
+"4dEz6uvf7A","EOE1otl72W","8FmFHI7p2a","QChxsNxx9V","MaJQs7Ow5C","AgJHQVNCPd","07n1cX6Pin","Zv7z0UmaEv","cQOnv7ku1p","2ZHdkuupzk",
+"HlUbFfFDrJ","VIlwPM3zXL","h1zcHHRxd8","Mkgy8t98iW","ZUnqtQnJ1S","Gv3FqU3yw5","QWxoTFxX9q","ThjNnsuY4x","mX2GE9rlg9","4QMc9DG4sT",
+"4W0TluN6r3","fmIK1iKqhr","ksJbypFrrl","Uvlv4blLA9","a00b5No0Qb","xReecpiJSk","IjTwPfaHir","s7MxkdQ586","J2mQipvgjS","W7cTsKr8ys",
+"tvdkDyofH3","QYxC0AkKTk","d85a9Cfgr3","yToGWFGzgp","B3qemAgJHQ","a00b5e6e4z","hYBCKGWqqX","0YAGHcQOnv","jS1ajatef2","2NslmCNHmv",
+"W3VFHFPfSE","DLhzMAmdQd","d7vjMMkgy8","7ku1pB3qem","ksJby7hyVv","Vprf2fFDrJ","he9IAW3VFH","OUYuFEdBKc","WPmlx0BmCy","QworuzmLYD",
+"tuDySHRxd8","2ZHdkogLgc","d7vjMVIlwP","blLA9uN6r3","S2Dfue6e4z","QYxC0pFrrl","aez9ylj07Q","uLtKs14FLR","t98iWgIYvE","Ul4a19XyT9",
+"jtn0Xrhl0J","CIShGJKWYR","jfREuQworu","pAhR1K4GS8","uJScXpAhR1","Gv3FqYh1hF","lsQGohe9IA","s7MxkM3zXL","0YAGHOxWIH","MmsIotvdkD",
+"aDGtSuvf7A","ECMvUpiJSk","FFDuiBFkb8","YjB9t24ARF","euZA50PktI","1LB1LX6Pin","0PktIvOqCE","QnJ1S0PktI","Chuy3cmXIX","5nmWvRkQke",
+"oQ87r8TxD7","QssNCuPX7G","1v5hH9iGoT","pFrrlyofH3","RmDcrDQimp","BGaQYMaJQs","euZA5wiHrZ","RxrsmYf2Ec","U3yw5s4786","X6PinoGu6x",
+"BbwgAFNYIM","1j5L8YOfrY","MGlTFTCgPp","VNCPdEOE1o","VBjhzAmdQd","S2DfujeskS","n8pJ9MGlTF","pWiOskZANm","BCxeCtvdkD","SjskQUl4a1",
+"Cp3mZrKDLJ","azIWpEoToP","fmIK1NcICA","0BmCylkMUA","jzUqRIBe8k","GSQwjFcWrW","7fsYMS2Dfu","RmDcrVjCZq","pvgjSjS1aj","Cfgr3NhXdu",
+"AkKTkiwzGk","GrDg7618Di","azIWpDG4sT","ydG8UydG8U","CK5W7U3yw5","I7p2afLNg8","sx5GlfaHir","Yw2oU45cIH","Z4I1vdmoS7","LbRTH2hEEU",
+"pT8wuwDajX","lCMxyuTacx","wDajXcQOnv","D6rByAXpwE","uLtKsatef2","RxrsmFFDui","uupzkHfyNQ","uJScX5nmWv","DLhzMuN6r3","EoToPhE1Ql",
+"n8pJ9uN6r3","In3NSdjsrv","n8pJ9djsrv","kB5nP2TRI7","yofH3uN6r3","YOfrYFnPFB","FNYIMWaim6","v2eC3suY4x","qUJMdWMiS3","MGlTFFNYIM",
+"GSQwjprNT6","OUqFMMm8si","zY1GYQnJ1S","gjUTuix74r","In3NSRzaZA","pmeCd2ZHdk","mz8gxaDGtS","OxWIHlViBv","l83Udo8Uyd","2TRI7guMb8",
+"XflUq2hEEU","2TRI72ZHdk","9rlg9okgRi","3weIFZhwG1","CdyBVcmXIX","euZA5No0Qb","RkQkeqUJMd","OHaBzvOqCE","qUJMdgf8rI","JRJQBHP433",
+"OxWIHtaOXK","FNYIM1j5L8","RzaZAIn3NS","tl72WhE1Ql","pmeCdpT8wu","YjB9tzmLYD","aDGtS29QAz","24ARF7X3uy","NhXduwiHrZ","hSSvQDG4sT",
+"uPX7GaDGtS","Oz8yZhE1Ql","CqqaDuJScX","zY1GY48cHL","580YDKASQ8","NOHszQ6Lix","d7vjMDz1R3","LewvMqQxHP","mz8gxM3zXL","5NammFNYIM",
+"Waim6Yf2Ec","HRxd8fcwDa","HzZT8o8Uyd","yEfy9UlU3M","uN6r3tAOsr","WPmlxuPX7G","ru4UGIBe8k","soy9tFPfSE","UmaEvKASQ8","GrDg7LewvM",
+"MK07Y4dEz6","S2DfuMmKGJ","AkKTk4W0Tl","oQ87rJkzUn","y94nwiwzGk","JJs5mP6bcg","vLsmSQnJ1S","9rlg9WPmlx","AkKTk9XyT9","pv0i7POUYS",
+"Vprf2hi5X7","3otm6gjUTu","VIlwPMmsIo","8FmFHMmsIo","d85a9Ta8f6","v1HlnaL6AJ","W3VFHjS1aj","WDVWJEdBKc","uAWypuLtKs","NhXdu2Yz7E",
+"YjB9tDz1R3","MmsIoY1mC0","ksJbyRACuj","taOXKblLA9","fmIK1dQ586","QWxoTWaWsv","n1pmOcmXIX","xReeciKqhr","Zv7z01LB1L","BFkb8Chuy3",
+"i7WMQFjHXR","5ZaEzvkCHH","oGu6xYjB9t","Waim6JJs5m","RBhp05Drn0","pFrrlBpYhV","faHirlpF6W","ru4UGh1zcH","6AFT07ku1p","VerEA45cIH",
+"Y1mC0Ss0Zu","FGzgpOz8yZ","POUYSRzaZA","ZUnqtuLtKs","SjskQd85a9","9rlg9jeskS","0ao3lLDk6f","ksJbyni2v1","Zv7z0MmsIo","ulk41POUYS",
+"Vprf2MezSW","Ul4a1v8yFN","rKDLJNOHsz","MK07YCxVEf","cQOnvReKEW","lkMUA5IhmG","YjB9tQYxC0","d85a9fmIK1","atef2XflUq","L7cGczbIYY",
+"gtCA5yvOMI","aFFsspv0i7","soy9t3weIF","JRJQB5IhmG","oQ87r5IhmG","uQIczaL6AJ","sqVrftaOXK","KsjRKGSQwj","NAFuwDLhzM","ReKEWWreyP",
+"FGzgplsQGo","Yh1hF0MR5X","yToGWOUqFM","EOE1o6AFT0","nnP8oksJby","CIShG2Yz7E","5nmWvgf8rI","ReKEWni2v1","azIWpjiVBP","jS1ajQChxs",
+"SbRYy0ao3l","NOHszqUJMd","fFDrJ0h1b1","5Drn0ThjNn","OUqFMIKxdL","pT8wu7hyVv","2DREsIjTwP","djsrvzY1GY","uZPqgFnPFB","1j5L8x3LDe",
+"Q6LixogLgc","GSQwjyEfy9","y94nwI7p2a","8cVD3QChxs","45cIHDG4sT","tjQxsvkCHH","Ta8f6FcWrW","6q6L9POUYS","I7p2aFGzgp","i7WMQHfyNQ",
+"MmKGJVerEA","b29RJOHaBz","fmIK1Twano","GrDg7vOqCE","qQxHPjzUqR","fcJOyulk41","PYBf4Yf2Ec","hUTw7S77LH","5ZaEzQClRL","0ao3l07n1c",
+"fcwDa2hEEU","d7vjMGv3Fq","MGlTFuLtKs","3otm6CNHmv","vkCHHmX2GE","VLTy6zFgtB","NOHszcQOnv","fmIK1iwzGk","jeskSQClRL","zQt6QgtCA5",
+"Ul4a1tlILt","xciqpX6Pin","9eoRcUvlv4","BGaQYiqv4k","X6PinlkMUA","azIWpvOqCE","t98iWOHaBz","v1HlnQWxoT","8xEKzK20wK","CIShGK20wK",
+"55rfBJXljW","Uvlv4ydG8U","BFkb8fFDrJ","kB5nPMezSW","uJScXzHF1q","5ZaEzSbRYy","FjHXRjiVBP","fcJOyLewvM","EoToPuZPqg","QYxC0ydG8U",
+"EOE1oKsjRK","TXQ0Zsoy9t","gdQsSkB5nP","gjUTugjUTu","9GXkXiKqhr","v8yFNb29RJ","16lHcZzJHW","BFkb85Namm","5ZaEzoQ87r","W7cTsMGlTF",
+"cL0aEhSSvQ","0YAGHQClRL","bgJAz5Mg9r","jSjS3S2Dfu","IRh48QChxs","lXFOBOHaBz","taOXKwiHrZ","iB08lHfyNQ","4QMc9aFFss","StlDJXyPZN",
+"oGu6xF6PT2","2hEEUdQ586","FFDuiciuWz","YOfrYbrhlQ","pvgjSOxWIH","OUYuFDz1R3","LewvMReKEW","J2mQiLewvM","lpF6Wv8yFN","prNT6jtn0X",
+"W3VFHVprf2","BCxeCOUYuF","QChxs9XyT9","FLsph14FLR","lj07QD6rBy","OHaBzPb1pa","Yf2Ec0PktI","CdyBV8xEKz","qUJMdlweGy","OUqFMrKDLJ",
+"9GXkX5Mg9r","2TRI7AOgEe","B3qemIKxdL","L7cGcazIWp","MezSW07n1c","azIWpHfyNQ","4dEz6jSjS3","9XyT9POUYS","tuDySaDGtS","qaofNazIWp",
+"C2Irc29QAz","zqH0WAXpwE","tAOsrS77LH","FGzgp2Nslm","VerEAbrhlQ","zbIYYtlILt","PYBf4G1RhS","uZPqgtl72W","o8Uydmz8gx","uN6r3xReec",
+"AgJHQazIWp","JRJQBVerEA","I7p2admoS7","RACujuupzk","iB08llXFOB","Ta8f6C2Irc","yEfy9gtCA5","Q6hMCaFFss","qUJMdpAhR1","ogLgcydG8U",
+"jSjS35Mg9r","SbRYyFVMxo","MK07YFwEJz","LewvMblLA9","iwzGkNhXdu","h1zcHFFDui","45cIH9rlg9","RkQkeWreyP","FjHXR5Mg9r","jfREuzQt6Q",
+"2hEEUQClRL","VLTy65ZaEz","QbxXcFnPFB","n8pJ99eoRc","MezSWDG4sT","AgJHQ07n1c","o8Uydzz4ZU","Mm8siOUqFM","RmDcrzmLYD","580YDUvlv4",
+"UlU3MQ6Lix","pWiOstvdkD","ogLgc6q6L9","P6bcgJRJQB","GXdoHDQimp","5Mg9rpAhR1","24ARFQYxC0","hSSvQhUTw7","rz7UtuLtKs","RpBQmW3VFH",
+"gdQsSMGlTF","ZhwG1ZUnqt","m4bxUkB5nP","XyPZNnnP8o","zFgtBsoy9t","C2IrcThjNn","Q6hMCfcwDa","0Wr5yJIqXi","VNCPdAkKTk","NAFuwlsQGo",
+"pWiOsBpYhV","16lHcECMvU","BCxeCoQ87r","zQt6QGrDg7","pvgjS8U2nU","prNT6CK5W7","M3zXLxXTI4","zqH0WuoStw","fcwDayluBx","ReKEWblLA9",
+"ZhwG1zqH0W","Yf2EcChuy3","X6PinFcWrW","4QMc9LewvM","qQxHPuupzk","hUTw7YOfrY","aFFssfFDrJ","Y1mC0FPfSE","X6Pin7X3uy","4W0TlSs0Zu",
+"bZLvSuQIcz","rKDLJZ4I1v","BpYhVW7cTs","HzZT8Yh1hF","DLhzM7fKYU","IRh48RpBQm","hSSvQBGaQY","Pb1paWmadA","IRh48blLA9","M6qcGJIqXi",
+"vOqCE5ZaEz","PYBf4Ss0Zu","BFkb8jzUqR","XyPZNwDajX","GXdoHRBhp0","bZLvSKZamH","aFFssaez9y","taOXKF6PT2","7ku1pnFqik","EOE1oVBjhz",
+"xXTI4dhSuH","3weIFBCxeC","2TRI7RsQUq","RxrsmOxWIH","K4GS8HlUbF","MojnPuN6r3","8FmFHpAhR1","HzZT8vLsmS","kZANmzFgtB","5drc6B3qem",
+"vkCHH24ARF","MmsIoyluBx","n8pJ9CIShG","tuDyS5Drn0","BCxeCo8Uyd","dQ586WDVWJ","QnJ1SM6qcG","dhSuHfaHir","14FLR29QAz","5drc6Gv3Fq",
+"0PktIdjsrv","TCgPplpF6W","Gv3FqM6qcG","3weIFHRxd8","1v5hHPYBf4","oQ87rCxVEf","uQIczk85Ae","RzaZAeuZA5","7hyVvHfyNQ","ThjNnQYxC0",
+"uTacxVerEA","gIYvE7hyVv","qaofNC2Irc","mX2GEMaJQs","iB08lNOHsz","OHaBzDcpWB","FcWrWWMiS3","DG4sTSWfou","yluBxjtn0X","QnJ1SpvgjS",
+"blLA92Yz7E","2ZHdklpF6W","k85AeSjskQ","Ta8f67ku1p","FhtglRmDcr","2ZHdkRzaZA","uJScXlsQGo","l83UdKZamH","SmGzv1j5L8","HzZT8gjUTu",
+"xReecgtCA5","d85a9piJSk","M6qcGFnPFB","X6Pin9eoRc","64s8NWaim6","dQ586uZPqg","L7cGcLDk6f","POUYSRBhp0","lpF6Watef2","6q6L9Rxrsm",
+"HlUbFjiVBP","2hEEU4dEz6","Qworu5nmWv","s4786fLNg8","YjB9tmX2GE","CxVEflpF6W","5drc6VIlwP","7hyVvMezSW","SjskQbrhlQ","5drc6kB5nP",
+"uupzkAkKTk","uTacx3weIF","b29RJDG4sT","Yh1hFulk41","QWxoTWaim6","YOfrYtlILt","5ZaEzZv7z0","VerEAyluBx","tAOsrMK07Y","ksJby0YAGH",
+"jiVBPvOqCE","uTacxECMvU","0Wr5yFGzgp","jfREu6q6L9","S2DfuX6Pin","FNYIMDG4sT","55rfBMGlTF","RpBQm4dEz6","QworuWMiS3","KsjRK07n1c",
+"zFgtBNxx9V","HfyNQK20wK","hSSvQqUJMd","yofH3pvgjS","lkMUABFkb8","ThjNnuQIcz","a00b5v2eC3","1j5L8Ul4a1","5VZjSWaWsv","JJs5m0MR5X",
+"atef2Nxx9V","5Mg9r3weIF","MGlTFuAWyp","5iGN5BFkb8","lCMxyEoToP","bZLvSWPmlx","07n1cDLhzM","CNHmv3weIF","Z4I1vksJby","HRxd8KZamH",
+"Ta8f6MK07Y","No0QbIjTwP","AgJHQIRh48","zFgtBP6bcg","Vprf2VjCZq","mX2GEv2eC3","AkKTk6q6L9","64s8NcQOnv","uJScXFVMxo","fqypy24ARF",
+"RkQkeMmKGJ","55rfB24ARF","hSSvQ8hJdt","uN6r3Pb1pa","wiHrZbZLvS","zHF1qy94nw","0PktIZhwG1","5VZjSWaim6","cShY2I7p2a","qUJMdFwEJz",
+"2ZHdkCp3mZ","QYxC0ThjNn","RzaZAwDajX","yToGWSWfou","o8UydcL0aE","pFrrld7vjM","POUYSsoy9t","lH1ktWaim6","QClRLyToGW","uQIczlkMUA",
+"FcWrWCIShG","iwzGkAIYUu","JKWYRhi5X7","W7cTsS2Dfu","BGaQYW3VFH","uZPqgGSQwj","tuDySW7cTs","JKWYRnnP8o","2NslmRBhp0","4dEz6HRxd8",
+"0BmCyBGaQY","jiVBPguMb8","GrDg7FcWrW","Zv7z0WreyP","618Di9iGoT","Nxx9VTwano","SbRYygIYvE","SWfouzFgtB","In3NSgIYvE","pFrrlxXTI4",
+"CNHmvuvf7A","YOfrYjS1aj","mX2GEReKEW","I7p2aKASQ8","TXQ0ZBbwgA","blLA9TXQ0Z","YjB9tzQt6Q","5drc6EoToP","QbxXcBbwgA","QYxC0IRh48",
+"h1zcHoGu6x","dhSuHv2eC3","vkCHH45cIH","nFqikdjsrv","9eoRcY1mC0","G1RhS4W0Tl","9rlg907n1c","MmsIoCp3mZ","2Yz7EeuZA5","MaJQsYf2Ec",
+"FLsphNOHsz","uupzkRkQke","yofH3gtCA5","KZamHQssNC","UlU3MHlUbF","MK07YFhtgl","ThjNnhYBCK","Zv7z0oGu6x","BpYhVtjQxs","9GXkXhe9IA",
+"K20wK0YAGH","lViBviwzGk","IBe8kKsjRK","QChxs0MR5X","ZuDtDpAhR1","blLA9PYBf4","ru4UG16lHc","aDGtS16lHc","ksJbyydG8U","RpBQmpAhR1",
+"prNT6ydG8U","29QAzJkzUn","aDGtShUTw7","7hyVvZuDtD","LDk6fFwEJz","IjTwPtjQxs","4W0TlNOHsz","Pb1pafqypy","n1pmOHP433","s4786DcpWB",
+"ni2v1ix74r","QClRLlCMxy","LbRTHZv7z0","nnP8oI7p2a","oGu6xpT8wu","tvdkDcmXIX","HRxd8sx5Gl","3weIF6AFT0","nFqikF6PT2","0PktIlH1kt",
+"yluBxaDGtS","NcICAFPfSE","xciqpOxWIH","0YAGHGv3Fq","P6bcgJ2mQi","MaJQs8U2nU","JIqXiFxX9q","8xEKzFwEJz","5nmWvciuWz","Ta8f6Y1mC0",
+"7Ow5CWPmlx","lkMUACdyBV","7ku1pWPmlx","1v5hHpWiOs","dmoS7MezSW","ksJbyRmDcr","vOqCEkZANm","QworuWaWsv","euZA5nFqik","tjQxsGrDg7",
+"U3yw5gdQsS","ZUnqt29QAz","nlaBy9iGoT","QnJ1SXyPZN","iKqhrt59lR","yToGWjeskS","v1Hlnv8yFN","lm0pDRpBQm","zQt6QCfgr3","t59lRfcJOy",
+"CIShG0MR5X","uTacxUlU3M","3weIFfaHir","MmsIoCNHmv","cShY2OUqFM","guMb8YOfrY","8cVD37lUXZ","Zv7z0yEfy9","1v5hHDQimp","iwzGklCMxy",
+"3otm6UmaEv","jiVBPIKxdL","QbxXc07n1c","Q6LixRzaZA","gf8rIM3zXL","rhl0JDLhzM","8FmFHGSQwj","EOE1oRACuj","Gv3Fqdpe1v","Ta8f65iGN5",
+"MojnPVLTy6","Cfgr33weIF","3otm6prNT6","29QAzOHaBz","sx5GlFcWrW","I7p2aTwano","fFDrJZv7z0","C2Irc6q6L9","brhlQ0MR5X","DQimpVIlwP",
+"djsrvpAhR1","5Drn0KsjRK","atef2Waim6","HRxd8Ul4a1","LDk6fOz8yZ","jS1ajIn3NS","Oz8yZxXTI4","L7cGcRmDcr","i7WMQfmIK1","sqVrfNhXdu",
+"JRJQBS77LH","9y4lwYf2Ec","8TxD7gtCA5","zbIYYlsQGo","TXQ0ZCdyBV","ydG8UguMb8","KZamHgdQsS","kZANmHlUbF","K4GS8Chuy3","ZJTXHuupzk",
+"MojnP5iGN5","tvdkDRkQke","piJSkPOUYS","n8pJ99y4lw","P6bcg8xEKz","uupzkgIYvE","wDajXVLTy6","YOfrYv8yFN","K4GS8soy9t","rKDLJzQt6Q",
+"14FLRuQIcz","nlaByRACuj","FLsphcmXIX","zFgtBuQIcz","JKWYR9y4lw","Mkgy8QClRL","Kr8ysNAFuw","VerEANhXdu","B3qemNcICA","5ZaEzCNHmv",
+"JKWYRhYBCK","POUYSNAFuw","Chuy3MezSW","Cfgr314FLR","FjHXRStlDJ","tuDySMezSW","nFqikM6qcG","he9IARkQke","7lUXZYOfrY","Vprf2jeskS",
+"JRJQBMkgy8","NOHszlsQGo","IRh482hEEU","QWxoTWreyP","ECMvUnFqik","mX2GEBGaQY","OUqFMkZANm","zY1GY7Ow5C","P6bcgO3iyQ","jzUqRQbxXc",
+"iKqhrAmdQd","cL0aE0Wr5y","In3NSQWxoT","oGu6xlpF6W","No0QbUlU3M","IRh487X3uy","sx5GlAgJHQ","QnJ1SuN6r3","AXpwE618Di","GWqqX0MR5X",
+"QnJ1SHfyNQ","mz8gxpFrrl","tjQxsX6Pin","NcICAjfREu","lViBvHfyNQ","EoToPMojnP","cL0aElkMUA","7X3uyX6Pin","yToGWjiVBP","i7WMQoVQp6",
+"ZhwG1WPmlx","qaofNxXTI4","dmoS7Nxx9V","vkCHHIjTwP","GrDg7M3zXL","cShY2fFDrJ","v2eC3jSjS3","KsjRKaL6AJ","rz7UtSjskQ","2ZHdkJ2mQi",
+"t98iWOxWIH","S77LHbZLvS","EoToPZzJHW","tuDySXflUq","ix74rlXFOB","tjQxsYh1hF","y94nwPb1pa","TXQ0ZG1RhS","he9IAfLNg8","48cHLi3pyd",
+"MaJQsiqv4k","580YD5Drn0","wDajXTXQ0Z","tlILtogLgc","9eoRcjfREu","rhl0Jlj07Q","7hyVvWaim6","CK5W7ksJby","Kr8ysFjHXR","hE1QlfcwDa",
+"W7cTsReKEW","VNCPdxciqp","Chuy3xciqp","ThjNnSjskQ","JRJQBJXljW","uN6r3guMb8","JXljWQssNC","LbRTH0PktI","o8Uydni2v1","fLNg8qQxHP",
+"xciqp5IhmG","tuDySbZLvS","s7Mxk5VZjS","ZzJHWlCMxy","MojnPDcpWB","VNCPd8hJdt","sx5GlSWfou","Dz1R3WreyP","faHir2TRI7","7Ow5C0BmCy",
+"wiHrZFwEJz","wiHrZIKxdL","No0Qby94nw","8U2nUHP433","gjUTuThjNn","qUJMdGSQwj","rKDLJVNCPd","0ao3lMmKGJ","0Wr5y5drc6","I7p2aBpYhV",
+"CqqaDEoToP","pAhR1yluBx","RpBQm0MR5X","GXdoHcmXIX","5IhmGSWfou","lCMxyv8yFN","CdyBV7ku1p","AkKTk1j5L8","jSjS36q6L9","6q6L97fsYM",
+"HlUbFYOfrY","RkQken1pmO","VIlwPcmXIX","uN6r3Mm8si","BpYhVHfyNQ","lXFOB1v5hH","BpYhVfcJOy","qaofNoQ87r","rz7Ut8xEKz","t98iWDLhzM",
+"UmaEvt98iW","JRJQBnnP8o","In3NSpT8wu","S77LHsoy9t","WPmlxM6qcG","xciqpmX2GE","suY4xMGlTF","2NslmjSjS3","Gv3Fq2Yz7E","aFFssokgRi",
+"yluBxW7cTs","8cVD3sx5Gl","pT8wuHzZT8","euZA5hi5X7","OUqFM2TRI7","WMiS3Oz8yZ","0ao3lQWxoT","b29RJSbRYy","1j5L8FGzgp","MGlTFgjUTu",
+"Yh1hF5drc6","bZLvSlViBv","618Di8hJdt","2Yz7EQ6hMC","v2eC3i7WMQ","prNT65VZjS","OHaBzDLhzM","Yh1hFlsQGo","4W0TlvOqCE","Chuy3prNT6",
+"RkQke4W0Tl","pv0i7O3iyQ","7hyVvcL0aE","7fKYUSWfou","uupzkRsQUq","FxX9q9y4lw","nlaByqQxHP","VBjhzRxrsm","FFDuizY1GY","LbRTHaDGtS",
+"vkCHH5iGN5","lweGysqVrf","QssNCjtn0X","VBjhzL7cGc","qQxHPOHaBz","IKxdLkZANm","5IhmGYOfrY","0Wr5yCNHmv","TXQ0ZxReec","G1RhS4QMc9",
+"b29RJMkgy8","VLTy6aez9y","lH1ktBFkb8","lweGySs0Zu","oGu6xYh1hF","uJScXtlILt","Zv7z04QMc9","yluBxtvdkD","618DiZ4I1v","NAFuw2ZHdk",
+"BGaQYAXpwE","oGu6xsuY4x","Z4I1v2hEEU","pFrrlVNCPd","TXQ0Zo8Uyd","HP433GXdoH","EdBKceuZA5","FNYIMv2eC3","ZhwG1LewvM","VerEAFNYIM",
+"kB5nPtaOXK","POUYSYw2oU","MezSWmz8gx","45cIHFhtgl","MezSWtl72W","QWxoTMm8si","jiVBPs4786","Yf2Ec2hEEU","YjB9tS77LH","i7WMQFLsph",
+"5nmWvxciqp","uupzkyluBx","hi5X7rhl0J","aFFssTXQ0Z","Y1mC0EoToP","zbIYY6q6L9","S2DfuIRh48","gf8rI14FLR","ydG8U2TRI7","JKWYRciuWz",
+"QssNCIjTwP","Chuy37lUXZ","ZhwG1AXpwE","uvf7AhE1Ql","07n1cwDajX","GrDg7hYBCK","v1HlnECMvU","Q6hMC5Namm","kB5nP5iGN5","16lHc580YD",
+"RmDcrMGlTF","YOfrYgIYvE","4dEz6fLNg8","dhSuHYw2oU","9iGoT45cIH","FcWrWSWfou","v1HlnVNCPd","SmGzvOHaBz","vOqCETXQ0Z","lpF6Wuupzk",
+"M3zXL7lUXZ","m4bxUYOfrY","CxVEfcmXIX","0PktIXyPZN","7lUXZbgJAz","blLA9pvgjS","W7cTs64s8N","hUTw78hJdt","Qworu2Yz7E","lm0pD1LB1L",
+"n1pmOSs0Zu","K4GS8qQxHP","In3NS618Di","he9IAQClRL","Vprf2K20wK","Yh1hFlXFOB","64s8Npv0i7","dpe1vqUJMd","JKWYRksJby","kB5nPXflUq",
+"Chuy3uPX7G","jS1ajjfREu","0Wr5yqUJMd","No0QbQWxoT","e6e4zQ6Lix","QYxC0W3VFH","nnP8oW3VFH","EOE1ovOqCE","5VZjSLbRTH","KASQ8VIlwP",
+"MK07Y8hJdt","F6PT2guMb8","piJSkFcWrW","16lHcCdyBV","hE1Qlzz4ZU","Chuy37fsYM","Gv3FqWPmlx","h1zcHStlDJ","QYxC0Y1mC0","Cp3mZgtCA5",
+"suY4xuvf7A","5Drn0n1pmO","uN6r37fKYU","uTacxI7p2a","3otm6CK5W7","Zv7z0h1zcH","xXTI4JRJQB","WPmlxMmsIo","cShY214FLR","hSSvQv1Hln",
+"qUJMdFcWrW","Yh1hFC2Irc","yofH3uZPqg","RACujOHaBz","kB5nPlXFOB","W7cTsW3VFH","L7cGcFxX9q","BGaQYAOgEe","KASQ84dEz6","Oz8yZ7X3uy",
+"brhlQl83Ud","QChxsFVMxo","1LB1L8RCUA","n1pmOcShY2","VjCZq55rfB","pWiOsJkzUn","Yw2oUtAOsr","QworudmoS7","7X3uywDajX","Twanolj07Q",
+"Cp3mZLewvM","PYBf4tjQxs","FnPFBAmdQd","24ARFIjTwP","iqv4kPYBf4","tlILtEoToP","D6rByJ2mQi","EdBKcydG8U","UlU3MGXdoH","JIqXiP6bcg",
+"lViBvtAOsr","FhtglQ6hMC","cmXIXdjsrv","Zv7z0kB5nP","FPfSEEoToP","CqqaDuAWyp","Zv7z0v8yFN","MmsIofaHir","DcpWB07n1c","ulk41CdyBV",
+"DQimp16lHc","JRJQBUl4a1","QnJ1SprNT6","NAFuwAXpwE","l83UdCdyBV","Dz1R3xReec","kZANmM6qcG","StlDJSjskQ","nnP8oYf2Ec","mX2GEI7p2a",
+"gtCA5Fhtgl","Cfgr3KsjRK","2DREsCK5W7","EoToPYh1hF","0MR5XfcwDa","pvgjS3weIF","2TRI75Drn0","YOfrYk85Ae","jeskS14FLR","oVQp63weIF",
+"8RCUAeuZA5","JRJQBVprf2","jzUqRGSQwj","s7MxkUvlv4","ReKEWBCxeC","B3qemGv3Fq","uupzkzY1GY","14FLRFwEJz","lweGyB3qem","pAhR1ZzJHW",
+"m4bxUNo0Qb","uupzkUlU3M","VjCZqsx5Gl","AmdQdW3VFH","qQxHPlCMxy","7Ow5Crz7Ut","hSSvQiB08l","cL0aEFjHXR","dQ586GWqqX","fmIK1No0Qb",
+"Q6LixrKDLJ","2hEEUDcpWB","EoToPCNHmv","2ZHdkuTacx","6q6L9iwzGk","NcICAVNCPd","Nxx9Vmz8gx","ix74rQYxC0","0ao3l5drc6","Nxx9VEdBKc",
+"Yh1hF8hJdt","1j5L8pv0i7","1j5L8taOXK","7fKYUSs0Zu","t98iWF6PT2","Y1mC0gIYvE","SjskQ0YAGH","ZuDtD0YAGH","45cIHqQxHP","yvOMIChuy3",
+"uvf7Ab29RJ","tlILtyToGW","dhSuHs7Mxk","d7vjM7fKYU","9rlg9SmGzv","uZPqgVerEA","tl72Wi3pyd","fmIK1pmeCd","v8yFN5iGN5","Kr8ysRzaZA",
+"FnPFB2Nslm","IBe8k0ao3l","16lHcUlU3M","9XyT9aFFss","zz4ZUzQt6Q","IjTwP8FmFH","uTacxRmDcr","BCxeCzY1GY","8xEKzs93Ml","GXdoHRACuj",
+"k85AeZv7z0","GWqqXuoStw","MGlTFMmsIo","7lUXZGrDg7","lViBvMK07Y","FwEJzqQxHP","K20wKoGu6x","14FLRS77LH","Q6Lix7ku1p","9y4lwP6bcg",
+"Uvlv4qQxHP","he9IAs93Ml","G1RhSbgJAz","yvOMIMojnP","AmdQd8hJdt","QYxC0AgJHQ","d7vjMCIShG","7fKYUJIqXi","K20wKKr8ys","jeskSbrhlQ",
+"SWfoudhSuH","W3VFHQssNC","9GXkXiB08l","Waim6sqVrf","FFDuiEOE1o","HlUbFSjskQ","J2mQiyvOMI","fqypyDG4sT","K4GS89XyT9","K20wK0Wr5y",
+"OxWIHru4UG","lXFOB16lHc","faHirCNHmv","WDVWJrhl0J","L7cGcWaim6","uQIczWreyP","5nmWvJRJQB","48cHLb29RJ","lViBvVBjhz","Zv7z0StlDJ",
+"C2IrcTwano","t98iWY1mC0","SWfoulm0pD","8TxD7CIShG","HRxd8lm0pD","FjHXR1j5L8","JIqXi9rlg9","BGaQYHzZT8","d85a9Mm8si","Uvlv4Kr8ys",
+"gf8rIlm0pD","YOfrYgtCA5","JJs5mHzZT8","tvdkDRzaZA","SbRYyvOqCE","tuDyS5drc6","2hEEUBbwgA","VLTy6rhl0J","xXTI4lsQGo","pvgjSb29RJ",
+"5nmWv7fsYM","v8yFNciuWz","8RCUAvOqCE","aFFssxciqp","fqypyF6PT2","7hyVvZJTXH","45cIHWDVWJ","FNYIMD6rBy","tuDySSjskQ","fcJOy7ku1p",
+"DG4sTsqVrf","piJSkVLTy6","dpe1vhYBCK","ZUnqtIn3NS","h1zcHyofH3","VLTy6Y1mC0","n1pmOogLgc","sx5GlCfgr3","QnJ1SGv3Fq","he9IAxReec",
+"sx5Gl9iGoT","FnPFBe6e4z","ZzJHW2Nslm","7X3uy0PktI","VNCPdjiVBP","tuDySuQIcz","5NammiB08l","GWqqXHP433","hYBCK4QMc9","fLNg8hSSvQ",
+"Pb1paaDGtS","ni2v12hEEU","X6PinjS1aj","24ARFxciqp","2Yz7Euupzk","P6bcgF6PT2","MmsIoYf2Ec","BpYhVYjB9t","9eoRcuQIcz","7ku1pK4GS8",
+"1v5hHuAWyp","k85AeOUYuF","iKqhrNOHsz","ydG8UOHaBz","ogLgcHzZT8","WreyPix74r","zbIYYfcJOy","MGlTFRpBQm","L7cGcyvOMI","GrDg70h1b1",
+"Dz1R3OxWIH","JRJQB3weIF","L7cGcRzaZA","iwzGkcQOnv","5VZjSsqVrf","n1pmORxrsm","Yw2oUSbRYy","FNYIMW3VFH","Uvlv4MojnP","3weIFs4786",
+"gtCA5pvgjS","8U2nUru4UG","jSjS3O3iyQ","iqv4k580YD","MK07YprNT6","45cIHuvf7A","lm0pDBGaQY","djsrvG1RhS","7fsYMYh1hF","FjHXRYw2oU",
+"9GXkXKsjRK","wDajXZUnqt","UlU3Ms4786","MezSWS77LH","yToGWgIYvE","BCxeClsQGo","azIWpKr8ys","lCMxyGSQwj","5iGN54dEz6","i7WMQuLtKs",
+"WMiS38TxD7","ZzJHWJ2mQi","No0Qb2Yz7E","bgJAzyEfy9","m4bxUmX2GE","kB5nP5nmWv","FnPFBrz7Ut","RzaZASbRYy","VjCZqHfyNQ","W7cTsuN6r3",
+"KsjRKjeskS","lsQGo8U2nU","OUYuFb29RJ","lCMxyqQxHP","JkzUnWPmlx","tvdkDjSjS3","U3yw5euZA5","VerEATa8f6","mz8gxuTacx","K4GS8FxX9q",
+"uvf7Ay94nw","6q6L9Y1mC0","5Drn0yEfy9","h1zcHjfREu","ydG8UMkgy8","atef2CxVEf","Zv7z0ydG8U","MaJQs55rfB","hi5X7RzaZA","djsrvSjskQ",
+"FLsphtjQxs","RACujrz7Ut","d85a9nFqik","Yh1hFoGu6x","jSjS3ZhwG1","YjB9t9iGoT","GrDg7lsQGo","JXljWAIYUu","dpe1v1v5hH","ZzJHWY1mC0",
+"IRh48s7Mxk","I7p2aZv7z0","i7WMQsqVrf","zqH0WKr8ys","8RCUAY1mC0","hUTw7RACuj","RkQketuDyS","G1RhSIKxdL","EdBKcBCxeC","ReKEWThjNn",
+"4W0TlEoToP","0BmCygtCA5","9rlg9uPX7G","RmDcrbgJAz","OHaBzCxVEf","TXQ0ZQworu","QbxXcgtCA5","vkCHHpmeCd","WreyPPb1pa","hi5X7hi5X7",
+"tlILtkB5nP","MezSWQYxC0","qUJMdK20wK","h1zcHatef2","CK5W7NOHsz","OUqFMciuWz","X6PinNOHsz","7Ow5ChUTw7","pAhR1ciuWz","K4GS8uoStw",
+"0BmCygdQsS","O3iyQ24ARF","RzaZARBhp0","zQt6QkB5nP","NcICAIRh48","CIShGW3VFH","JRJQBL7cGc","4dEz6oVQp6","XflUqNAFuw","W7cTsmX2GE",
+"7fKYU9y4lw","atef2o8Uyd","FxX9qWPmlx","5IhmGlkMUA","lweGyrz7Ut","7Ow5Cfqypy","RACujgtCA5","45cIHQssNC","zFgtBNo0Qb","jfREut59lR",
+"JRJQB4dEz6","xXTI4D6rBy","Z4I1vRpBQm","Mkgy8xXTI4","64s8N9GXkX","4QMc9jtn0X","0PktICp3mZ","9eoRcEdBKc","lViBvn1pmO","zmLYDNhXdu",
+"sx5GlD6rBy","4QMc9RpBQm","2ZHdkSbRYy","QChxspv0i7","TwanozFgtB","0PktIRmDcr","MaJQsaFFss","POUYSpvgjS","AIYUupFrrl","In3NSUmaEv",
+"jSjS3RBhp0","FcWrWs7Mxk","bZLvShSSvQ","7Ow5CcShY2","5IhmGFVMxo","s4786gdQsS","IjTwPFNYIM","pWiOsuLtKs","S77LHtlILt","2ZHdkWPmlx",
+"aez9y8xEKz","lH1ktzY1GY","OxWIHHRxd8","FLsphgf8rI","lweGy4dEz6","4dEz6pAhR1","uTacxQssNC","KsjRKRsQUq","GWqqXzbIYY","JKWYRuPX7G",
+"yofH3s4786","Q6LixG1RhS","GSQwjtlILt","ix74r2Nslm","tvdkDMojnP","tvdkDix74r","tvdkDKsjRK","FnPFBL7cGc","QnJ1SyluBx","AIYUugf8rI",
+"hSSvQOUqFM","Mkgy81v5hH","RsQUqix74r","FcWrW5Mg9r","5Nammfqypy","4QMc9BpYhV","dQ586F6PT2","nnP8odpe1v","zQt6QRkQke","tAOsrVerEA",
+"aDGtSFFDui","0BmCyatef2","oVQp6ZUnqt","WaWsvi3pyd","pT8wuqUJMd","piJSkJKWYR","SbRYyi3pyd","hSSvQPYBf4","yluBxCxVEf","ThjNnuN6r3",
+"0h1b1MmsIo","O3iyQlH1kt","FPfSEv1Hln","ReKEW8TxD7","wiHrZYh1hF","v2eC3Uvlv4","Uvlv4QssNC","tAOsrSs0Zu","FxX9qJIqXi","9eoRcNhXdu",
+"JRJQBsqVrf","5drc6uupzk","JkzUnsx5Gl","RmDcrnlaBy","FGzgptlILt","WDVWJL7cGc","i7WMQlViBv","O3iyQaDGtS","MGlTF4W0Tl","jS1ajWDVWJ",
+"piJSkAOgEe","5Mg9r580YD","5iGN5FnPFB","prNT6yEfy9","dmoS7aL6AJ","FLsphRkQke","cL0aEBbwgA","2TRI7zY1GY","ZJTXHQChxs","1v5hH1j5L8",
+"JRJQB8FmFH","bZLvSyvOMI","guMb8FLsph","POUYS07n1c","cL0aEhYBCK","7Ow5CMmKGJ","0ao3l4QMc9","i7WMQpv0i7","cShY2EoToP","45cIHwDajX",
+"FcWrWlCMxy","Waim6IKxdL","TXQ0ZuAWyp","RkQkeAIYUu","kB5nPiKqhr","FVMxohi5X7","fcJOyM6qcG","dmoS7ECMvU","n1pmOwiHrZ","ZUnqtkZANm",
+"CxVEfFGzgp","Chuy3okgRi","W3VFH1LB1L","VIlwPrz7Ut","0h1b1blLA9","Mkgy8MGlTF","1j5L8bZLvS","bZLvS45cIH","618DiIjTwP","ksJbyjzUqR",
+"FPfSElm0pD","IKxdL0Wr5y","pT8wu5Drn0","Dz1R3zQt6Q","NAFuwmz8gx","FFDuiMK07Y","WaWsvYjB9t","8hJdtGXdoH","cShY2mX2GE","he9IAuQIcz",
+"oVQp6tlILt","G1RhS1v5hH","kZANmni2v1","9GXkXuPX7G","suY4xx3LDe","x3LDe45cIH","tjQxs9iGoT","UlU3MChuy3","zz4ZU07n1c","S2DfuTXQ0Z",
+"4dEz6gIYvE","M6qcGnlaBy","2NslmIBe8k","nnP8oQ6hMC","ulk41cmXIX","RBhp0Yf2Ec","iKqhrDLhzM","sx5Gln8pJ9","zHF1quoStw","IBe8kCqqaD",
+"IjTwPGSQwj","OUqFMbZLvS","SmGzvsoy9t","qQxHPdmoS7","S2DfuFcWrW","QWxoTW3VFH","45cIHaez9y","0Wr5yNo0Qb","uZPqgbrhlQ","B3qemazIWp",
+"pAhR1HRxd8","I7p2a8xEKz","MGlTFGrDg7","ZUnqtJRJQB","hi5X75Namm","FjHXRQbxXc","dmoS7brhlQ","hE1QloVQp6","azIWpa00b5","WPmlxBbwgA",
+"zqH0WGv3Fq","Mkgy89XyT9","ru4UGJIqXi","yToGW1j5L8","ThjNn07n1c","x3LDeaDGtS","AIYUuyEfy9","G1RhStlILt","FLsph6AFT0","SmGzvyluBx",
+"s4786GXdoH","n1pmOtuDyS","pv0i7s4786","bgJAzCqqaD","Uvlv4KsjRK","ix74ryvOMI","MmsIo5IhmG","MmKGJsqVrf","i7WMQyvOMI","b29RJ1LB1L",
+"24ARFAgJHQ","YjB9tcShY2","OUqFMQYxC0","Ul4a1VNCPd","14FLRBGaQY","BbwgADz1R3","DcpWBlH1kt","suY4xe6e4z","gf8rIulk41","FPfSEuN6r3",
+"VBjhz16lHc","07n1cXyPZN","0ao3l0YAGH","s47867fsYM","7lUXZv1Hln","prNT67X3uy","uupzkMkgy8","JXljWUlU3M","Z4I1vyluBx","AIYUuWaWsv",
+"Yh1hF7lUXZ","nlaByyvOMI","Q6hMCvkCHH","KsjRKulk41","zbIYYCNHmv","LbRTH7X3uy","QChxsHlUbF","07n1chYBCK","qQxHPyofH3","lkMUAzbIYY",
+"JXljW0BmCy","5Mg9r7fsYM","xciqpVBjhz","DcpWBOHaBz","fmIK1CK5W7","7fKYUlkMUA","SmGzvciuWz","cQOnvAmdQd","Ul4a1rz7Ut","fcwDagdQsS",
+"cmXIXjfREu","HfyNQ9y4lw","QnJ1SC2Irc","hYBCKFLsph","BpYhVChuy3","UmaEvlViBv","5nmWvydG8U","hYBCKuQIcz","atef2RsQUq","MojnP55rfB",
+"yEfy9pFrrl","VjCZqcL0aE","LewvMVerEA","blLA9aez9y","lm0pDfmIK1","1v5hHVjCZq","AgJHQK20wK","lViBvF6PT2","P6bcggf8rI","Dz1R3KASQ8",
+"n1pmOzmLYD","hUTw7Rxrsm","Ta8f6v8yFN","dhSuHMezSW","vkCHHAkKTk","M6qcGFFDui","Oz8yZvLsmS","yofH3SmGzv","1LB1LlCMxy","7Ow5C8U2nU",
+"rz7UtjSjS3","TXQ0Z5ZaEz","IBe8k29QAz","AgJHQUvlv4","dQ586MK07Y","MmsIo7ku1p","W7cTsECMvU","O3iyQVBjhz","VjCZqfLNg8","FVMxodpe1v",
+"rhl0JFNYIM","FxX9qQWxoT","ydG8UCqqaD","HP433UmaEv","2ZHdk9XyT9","IjTwPAgJHQ","2DREs5ZaEz","zQt6QiwzGk","blLA9ZhwG1","IBe8kydG8U",
+"JRJQBuN6r3","RACujfmIK1","zqH0Wdpe1v","5Mg9rMaJQs","TwanoBGaQY","jzUqRtlILt","mz8gxF6PT2","k85AeEdBKc","Mkgy8o8Uyd","WmadAtvdkD",
+"a00b5uQIcz","IRh48faHir","m4bxUCp3mZ","djsrvNOHsz","faHirDcpWB","fmIK1zFgtB","GXdoHRxrsm","mz8gxv2eC3","v1HlnqQxHP","t98iW0h1b1",
+"brhlQh1zcH","8U2nURkQke","48cHLFNYIM","MojnPtaOXK","5NammWPmlx","7fKYU4QMc9","xXTI4Chuy3","jzUqRhUTw7","xXTI4RACuj","ogLgcm4bxU",
+"6q6L9aDGtS","Waim68hJdt","QWxoTBpYhV","cQOnvsuY4x","ThjNnDG4sT","ZzJHWcmXIX","lpF6WGXdoH","FwEJzKASQ8","he9IAVjCZq","zz4ZUd85a9",
+"dmoS7x3LDe","ReKEWHRxd8","CNHmvYjB9t","DLhzMKr8ys","S2Dfuix74r","ciuWz2ZHdk","ksJbyNOHsz","9rlg9Q6hMC","jfREuwDajX","9y4lwGrDg7",
+"RxrsmxReec","sx5GlWmadA","0ao3lx3LDe","lXFOBjfREu","KZamHD6rBy","RkQkeEdBKc","Chuy3JkzUn","ZUnqtCqqaD","SWfouaDGtS","SWfouMkgy8",
+"qaofNksJby","UlU3MFVMxo","h1zcHfmIK1","B3qemSWfou","0MR5Xulk41","lH1ktdQ586","B3qemuZPqg","8TxD7Vprf2","4QMc9UlU3M","faHirjzUqR",
+"i3pyd9eoRc","tlILtvLsmS","lsQGooGu6x","ECMvU5IhmG","BCxeCI7p2a","b29RJprNT6","1j5L8euZA5","M3zXLzbIYY","MmsIokB5nP","tuDySxReec",
+"CqqaD5nmWv","FLsphk85Ae","NAFuwni2v1","zY1GYv2eC3","DcpWB5drc6","VLTy6xXTI4","ECMvUY1mC0","fcwDa5VZjS","LbRTH4dEz6","FLsphUlU3M",
+"Gv3FqUlU3M","atef2AmdQd","piJSkChuy3","EOE1od7vjM","lm0pDuTacx","KsjRKjzUqR","Cp3mZYjB9t","PYBf45iGN5","yEfy9blLA9","zqH0W0MR5X",
+"2TRI7pWiOs","5iGN5zHF1q","QClRLaDGtS","MmsIozFgtB","CqqaD48cHL","RsQUqJJs5m","9XyT9Uvlv4","aDGtSZuDtD","DcpWBuLtKs","L7cGc9XyT9",
+"jtn0Xb29RJ","ni2v1qaofN","yluBxJRJQB","JRJQBRsQUq","StlDJl83Ud","Vprf2a00b5","atef2KASQ8","7Ow5CS2Dfu","AOgEeF6PT2","aez9y6q6L9",
+"ulk41uLtKs","5Drn0aDGtS","0MR5XnnP8o","Z4I1vFnPFB","ZhwG1QWxoT","1v5hHQ6Lix","64s8NuAWyp","JkzUnlViBv","JkzUnRkQke","cL0aEguMb8",
+"NAFuwqaofN","U3yw52Yz7E","RBhp0JkzUn","K4GS8d85a9","JIqXiWMiS3","0h1b19GXkX","MaJQs1LB1L","OUYuF7lUXZ","UlU3M16lHc","29QAz0h1b1",
+"ZuDtDhUTw7","P6bcgK20wK","S77LHlkMUA","1j5L8jS1aj","55rfBEOE1o","0Wr5yuAWyp","fqypyQssNC","In3NSZzJHW","DG4sTlViBv","NOHszAOgEe",
+"6AFT0K4GS8","Q6hMCdpe1v","tuDySfLNg8","9iGoTVNCPd","vkCHHxXTI4","h1zcHblLA9","s93Ml5Drn0","QWxoTlH1kt","QYxC0hi5X7","JkzUnECMvU",
+"hE1QlaL6AJ","mz8gxfcJOy","5drc69y4lw","D6rByOUqFM","1v5hHlsQGo","uvf7AYjB9t","Dz1R3AOgEe","P6bcglm0pD","lXFOBWDVWJ","7fsYMuupzk",
+"lpF6W580YD","pmeCd6q6L9","lkMUAM6qcG","uAWypGXdoH","lj07Q48cHL","bZLvS5Namm","uAWypzHF1q","e6e4z0ao3l","BFkb855rfB","4dEz6YOfrY",
+"NOHszuTacx","ReKEWZzJHW","mX2GEAIYUu","k85Aei3pyd","pv0i7ni2v1","VBjhzgIYvE","HRxd89y4lw","ulk410YAGH","jtn0X1LB1L","tvdkDKr8ys",
+"WaWsvhUTw7","rhl0J07n1c","dmoS7faHir","X6Pin5iGN5","ulk415IhmG","uoStwfqypy","h1zcHFwEJz","6q6L9Zv7z0","gdQsS07n1c","yToGWjSjS3",
+"Vprf248cHL","S77LHRsQUq","GrDg7QClRL","K20wKNAFuw","vkCHH8TxD7","StlDJDLhzM","07n1cpAhR1","FNYIMVjCZq","CxVEfS2Dfu","9iGoTyvOMI",
+"ciuWzhUTw7","9XyT9uvf7A","dmoS7suY4x","7hyVvaDGtS","RpBQmgtCA5","hYBCK5drc6","BbwgAuPX7G","OUYuFnnP8o","5Drn0kB5nP","5IhmGlCMxy",
+"vOqCEi3pyd","lCMxysuY4x","No0QbU3yw5","ogLgclXFOB","i3pydSmGzv","vOqCElpF6W","IKxdL5ZaEz","TXQ0ZvOqCE","iqv4kDz1R3","5iGN55iGN5",
+"ZuDtDOz8yZ","3weIFVjCZq","Yw2oUEOE1o","iwzGkJRJQB","fFDrJuJScX","oGu6xI7p2a","CNHmvQbxXc","ksJbyMmKGJ","VBjhzJJs5m","9iGoTOHaBz",
+"sx5GlFnPFB","fcJOyNo0Qb","hYBCKgtCA5","gdQsSTa8f6","FxX9qGSQwj","jfREuJRJQB","tl72Wuvf7A","pv0i7MaJQs","Q6hMC8hJdt","EdBKcxReec",
+"nlaBytuDyS","7hyVvIn3NS","MmKGJblLA9","wiHrZn1pmO","2hEEUlm0pD","jS1aj1LB1L","FVMxooGu6x","mz8gxdpe1v","JkzUnMm8si","W7cTsyToGW",
+"4QMc9jS1aj","d85a9tvdkD","s93MlJRJQB","9GXkXlCMxy","gjUTu8U2nU","ZUnqt4QMc9","fLNg8ZuDtD","zmLYDJ2mQi","7ku1ptuDyS","X6PinNhXdu",
+"jiVBP64s8N","fLNg8DQimp","L7cGcyluBx","jfREu4QMc9","fLNg8tuDyS","dmoS7FcWrW","Oz8yZdjsrv","FnPFBfLNg8","9iGoTMaJQs","iwzGk4QMc9",
+"mX2GEPOUYS","b29RJgdQsS","piJSkpiJSk","uAWypOz8yZ","WreyP7Ow5C","NhXduoVQp6","YOfrYStlDJ","wiHrZNo0Qb","2Yz7EtjQxs","9rlg9EOE1o",
+"AIYUuCIShG","YjB9tAOgEe","6q6L9BGaQY","EdBKcWaWsv","2ZHdkBCxeC","Z4I1vogLgc","SWfouM6qcG","Kr8ysHzZT8","uZPqgRBhp0","YjB9t2Yz7E",
+"MezSWbgJAz","uZPqguPX7G","hYBCKJJs5m","jSjS3pAhR1","0YAGHVerEA","zHF1qW3VFH","4QMc9jeskS","fcJOy14FLR","v2eC329QAz","7ku1paL6AJ",
+"jfREuuupzk","5nmWvlpF6W","YOfrYWaWsv","pAhR1DLhzM","mX2GEpmeCd","7hyVvqaofN","Q6Lixatef2","9rlg9I7p2a","Uvlv4WaWsv","MGlTFzFgtB",
+"qQxHPWreyP","AkKTkhE1Ql","16lHclj07Q","7X3uy9GXkX","EoToP7Ow5C","vLsmSGXdoH","MK07YYjB9t","B3qemvLsmS","DQimpgf8rI","ZuDtDQnJ1S",
+"ReKEWoQ87r","Twano45cIH","uQIczzmLYD","Z4I1v8hJdt","hi5X70Kyfs","Ss0ZulCMxy","ydG8USmGzv","tvdkDQYxC0","fFDrJFGzgp","FwEJzlsQGo",
+"Yw2oUWmadA","uN6r3dhSuH","Dz1R3suY4x","HP433KsjRK","BbwgAtvdkD","taOXKAgJHQ","Yw2oUSjskQ","taOXKy94nw","MmKGJhE1Ql","0BmCyRmDcr",
+"zHF1qSmGzv","ThjNnm4bxU","v8yFN580YD","FwEJzatef2","9XyT9iKqhr","jfREuX6Pin","HlUbFUmaEv","0PktIvkCHH","uvf7AEOE1o","HfyNQjtn0X",
+"EOE1o7hyVv","KZamHpvgjS","Pb1paJKWYR","yluBxzFgtB","MGlTFRxrsm","BGaQY5drc6","ZuDtDoGu6x","hYBCKQYxC0","d7vjMjfREu","S77LHpT8wu",
+"Yh1hFfmIK1","hE1Ql0MR5X","1v5hHfcwDa","ulk41Waim6","Z4I1vFVMxo","FGzgpFLsph","WmadA0YAGH","d85a9ni2v1","RzaZAaDGtS","QChxspiJSk",
+"FxX9qHP433","iKqhr7lUXZ","s93MlNo0Qb","GSQwjuQIcz","vLsmS14FLR","2TRI7qUJMd","VjCZqL7cGc","8xEKzBbwgA","Rxrsm2ZHdk","M3zXLHlUbF",
+"9XyT9e6e4z","FxX9qP6bcg","taOXKRzaZA","Zv7z00ao3l","Y1mC0ulk41","0Wr5yVprf2","Q6hMC0BmCy","vLsmShi5X7","5nmWvuLtKs","pFrrluN6r3",
+"kZANmEoToP","2ZHdkzY1GY","Zv7z0XyPZN","S2DfuwiHrZ","FxX9qaDGtS","QssNC0MR5X","7lUXZ8RCUA","618Diuvf7A","oVQp6uQIcz","lXFOBQYxC0",
+"kB5nPYf2Ec","SWfouZ4I1v","Vprf2lXFOB","lm0pDcQOnv","F6PT2RmDcr","O3iyQ2hEEU","ru4UGuupzk","WPmlxtuDyS","RpBQm2DREs","9XyT9tAOsr",
+"FFDuiv1Hln","5Mg9rDLhzM","Ta8f6DG4sT","NhXduKASQ8","VIlwPeuZA5","I7p2aM3zXL","QssNCXyPZN","pWiOs0h1b1","1LB1LEoToP","oVQp6POUYS",
+"5Namm5Drn0","okgRirz7Ut","F6PT2QnJ1S","dQ586Waim6","29QAzlH1kt","ogLgcsx5Gl","lweGyni2v1","pAhR18FmFH","B3qemd7vjM","DLhzM3weIF",
+"rKDLJcQOnv","QbxXcpFrrl","NhXdunFqik","KsjRKyvOMI","CdyBVF6PT2","ZUnqtrz7Ut","S2DfuWaim6","BpYhVRzaZA","1j5L8nFqik","KZamHDG4sT",
+"iwzGkGWqqX","NhXdugtCA5","ZUnqtYOfrY","hUTw7618Di","IBe8kaDGtS","Yf2EcVIlwP","lCMxyBCxeC","X6PinbgJAz","OxWIHQworu","WMiS3QChxs",
+"0BmCyMkgy8","ECMvUlH1kt","dhSuH14FLR","ogLgcWreyP","16lHc0PktI","NOHszWPmlx","UmaEv7fsYM","8TxD79GXkX","580YDSbRYy","CIShG7hyVv",
+"C2IrcaDGtS","fmIK1D6rBy","XyPZNyluBx","azIWplsQGo","pAhR1kB5nP","FPfSEHlUbF","hi5X7i7WMQ","VBjhzGXdoH","Dz1R3IjTwP","wDajX2ZHdk",
+"QYxC0zY1GY","WPmlx5nmWv","soy9tIjTwP","Waim6vLsmS","zQt6QOUqFM","hYBCKuLtKs","sx5Gld85a9","MaJQsBGaQY","fcJOyOxWIH","vLsmSIn3NS",
+"RBhp0zz4ZU","wiHrZVBjhz","KZamHK20wK","Yh1hFHfyNQ","pmeCdWaWsv","RmDcrdjsrv","6AFT0AXpwE","ix74rpWiOs","CIShGpWiOs","dmoS7HP433",
+"bgJAznlaBy","h1zcHzFgtB","EdBKcuoStw","zz4ZUuupzk","Yh1hFaez9y","W3VFH6AFT0","EdBKcFVMxo","8TxD70ao3l","Yf2Ecb29RJ","Gv3FqvkCHH",
+"TXQ0Z0YAGH","4dEz6Vprf2","rz7UtM3zXL","NhXdupT8wu","64s8NjzUqR","fcwDat98iW","0MR5XoGu6x","mz8gxZv7z0","iqv4kFVMxo","Q6Lixe6e4z",
+"48cHLuTacx","uupzkVIlwP","CK5W7rKDLJ","ru4UGGrDg7","zbIYYa00b5","VjCZq6q6L9","AmdQd9eoRc","29QAzQWxoT","In3NSqaofN","OUYuFdQ586",
+"WreyP0BmCy","OHaBzWmadA","FNYIMKASQ8","618DiC2Irc","Vprf25VZjS","d85a9taOXK","Fhtgl7lUXZ","nFqikpWiOs","lkMUAhE1Ql","FLsph9y4lw",
+"WPmlxZUnqt","zQt6QFjHXR","CIShGe6e4z","DG4sTrKDLJ","AmdQdbrhlQ","JKWYRpWiOs","xciqpB3qem","KsjRKJ2mQi","azIWpgjUTu","ZhwG1AmdQd",
+"l83Udpv0i7","NAFuw14FLR","uN6r3HP433","a00b5RkQke","EoToPhe9IA","45cIHVerEA","fFDrJjzUqR","7hyVvIKxdL","DQimpIn3NS","8FmFHReKEW",
+"VIlwPv2eC3","Yw2oUAkKTk","TXQ0ZNAFuw","6AFT0uoStw","AmdQdtlILt","HzZT87ku1p","b29RJWaim6","CNHmvsqVrf","uQIcz16lHc","0BmCyBpYhV",
+"MK07YlH1kt","LbRTHokgRi","IRh48jtn0X","GSQwjVBjhz","DQimpJRJQB","rz7UtZJTXH","hSSvQblLA9","L7cGcjfREu","8FmFHdQ586","GSQwjU3yw5",
+"Cp3mZv2eC3","5iGN5ZJTXH","Yw2oUv2eC3","atef2nnP8o","cmXIX5Mg9r","MojnPxReec","MaJQsQChxs","RBhp0VLTy6","soy9tNo0Qb","ReKEWpAhR1",
+"9y4lwfLNg8","0MR5X0h1b1","Cp3mZuZPqg","he9IA0YAGH","m4bxUGXdoH","i7WMQd7vjM","cShY2Mm8si","he9IAzbIYY","VNCPdNAFuw","oGu6xlm0pD",
+"WaWsvQChxs","FwEJzRBhp0","QClRLJRJQB","J2mQifqypy","s7MxkogLgc","No0QbZ4I1v","yluBxOUqFM","7fKYUAmdQd","FPfSE2Yz7E","t98iWKsjRK",
+"9XyT9tlILt","8hJdt9XyT9","aez9yd85a9","BGaQYX6Pin","nlaByB3qem","uQIczjfREu","zz4ZUpT8wu","v8yFN6q6L9","pv0i7KsjRK","guMb8t98iW",
+"CxVEf2ZHdk","EdBKcXflUq","qUJMdfcwDa","B3qemQssNC","iwzGktl72W","yvOMIBbwgA","SWfouCqqaD","y94nwdjsrv","2DREsaL6AJ","tvdkD2Yz7E",
+"HlUbFRxrsm","KZamHMaJQs","J2mQipv0i7","7hyVvtAOsr","YjB9t0BmCy","0BmCyWaim6","Nxx9V0ao3l","QbxXcnlaBy","zFgtBlCMxy","zQt6QKZamH",
+"0Wr5yi7WMQ","aez9yv8yFN","EdBKca00b5","VIlwP2Nslm","vkCHHIKxdL","mX2GEzFgtB","QssNCyEfy9","FLsphFPfSE","rKDLJYOfrY","5IhmGm4bxU",
+"9GXkXblLA9","fmIK1QssNC","Gv3Fq0Wr5y","CNHmvFNYIM","dQ586xReec","tAOsrHRxd8","dpe1vPb1pa","Chuy3QClRL","Ta8f6L7cGc","yvOMICqqaD",
+"14FLR2Nslm","xciqptaOXK","SbRYysx5Gl","TwanopiJSk","oVQp6k85Ae","5Drn0ru4UG","sqVrfSs0Zu","jS1ajHRxd8","vOqCEgf8rI","3otm6ZUnqt",
+"ZhwG15ZaEz","FLsphi7WMQ","fcJOyyEfy9","s7MxkQWxoT","prNT6mz8gx","7X3uydQ586","ru4UGLewvM","uJScXzqH0W","Pb1paU3yw5","W3VFHlweGy",
+"lweGyQClRL","NAFuwEdBKc","vOqCEsoy9t","ru4UGXflUq","Cp3mZOHaBz","iKqhr0PktI","KZamHCdyBV","SjskQ24ARF","pWiOsMmsIo","ReKEWQYxC0",
+"K4GS8rhl0J","tuDyS8cVD3","JkzUnUvlv4","l83UdIBe8k","D6rBybrhlQ","0MR5XF6PT2","6AFT0CqqaD","uupzkCqqaD","pWiOsZUnqt","2DREst59lR",
+"m4bxUsx5Gl","0Wr5y16lHc","i7WMQ5ZaEz","fLNg87lUXZ","gtCA54dEz6","RxrsmCxVEf","ThjNn5IhmG","lH1ktRpBQm","rhl0JRxrsm","uN6r3gf8rI",
+"0Wr5yuN6r3","EoToP9rlg9","WmadACp3mZ","EdBKccShY2","BGaQYQ6Lix","BGaQYprNT6","45cIHOUYuF","kZANme6e4z","FFDuiU3yw5","3weIFIBe8k",
+"lj07QPb1pa","B3qemuvf7A","uoStw0Kyfs","AOgEeG1RhS","0h1b1cmXIX","yvOMIcShY2","9y4lwix74r","jS1ajhe9IA","Yf2EcBpYhV","iKqhr2TRI7",
+"HfyNQXyPZN","lkMUAdhSuH","D6rByxciqp","gf8rIMkgy8","FLsphokgRi","VLTy6Gv3Fq","jSjS38cVD3","8RCUAUvlv4","7X3uyAIYUu","JkzUnCIShG",
+"AkKTk8RCUA","NhXduBFkb8","gIYvE2ZHdk","LewvMgjUTu","jzUqRv1Hln","YOfrYGWqqX","TCgPp5Mg9r","Yh1hFS77LH","FwEJz9GXkX","64s8NAOgEe",
+"brhlQguMb8","48cHLYjB9t","lkMUATa8f6","JKWYRix74r","ksJbyVIlwP","piJSkpT8wu","5VZjSIBe8k","9GXkXs4786","fLNg8s93Ml","Yw2oUkZANm",
+"VIlwP0MR5X","XflUqFwEJz","azIWpru4UG","M6qcG0PktI","2TRI7IBe8k","OUYuFJ2mQi","U3yw5yvOMI","wiHrZ24ARF","2hEEU5Namm","Mkgy8piJSk",
+"a00b5C2Irc","guMb82hEEU","CK5W7FNYIM","Mm8sisqVrf","9iGoTlj07Q","FwEJzF6PT2","Kr8ysNOHsz","qaofNuJScX","yvOMIMK07Y","t59lRL7cGc",
+"0PktIDLhzM","pT8wu4W0Tl","fcwDao8Uyd","Mkgy8U3yw5","8hJdtxciqp","n8pJ9hYBCK","DQimpK20wK","CNHmvGWqqX","16lHc5Drn0","LewvMHlUbF",
+"KASQ8MmsIo","Waim6fcwDa","07n1c16lHc","tuDySFFDui","nlaBy5ZaEz","i7WMQrz7Ut","jzUqRtvdkD","vLsmSU3yw5","v1HlnsuY4x","WaWsvhSSvQ",
+"580YDgf8rI","b29RJ9eoRc","OxWIHYh1hF","No0QbFLsph","gtCA5xReec","FLsphuAWyp","uoStwvLsmS","tvdkDfcwDa","a00b5HlUbF","iqv4kZ4I1v",
+"yvOMIWaim6","CdyBVuvf7A","taOXKFjHXR","HlUbFtjQxs","lkMUAvLsmS","JJs5m07n1c","suY4xprNT6","lm0pD64s8N","GWqqXZ4I1v","pAhR1lweGy",
+"FNYIMgdQsS","xReeciqv4k","ru4UGn1pmO","5ZaEzMK07Y","2TRI7HfyNQ","Nxx9VlViBv","uZPqglCMxy","7hyVvGrDg7","MojnPru4UG","GSQwj618Di",
+"ZuDtD8RCUA","48cHLfaHir","jfREuSWfou","rz7UtOz8yZ","2TRI7FLsph","pvgjSuZPqg","fFDrJMojnP","8hJdtM6qcG","iB08lG1RhS","t98iWOUqFM",
+"RBhp0ydG8U","IBe8ktl72W","OUYuFJIqXi","2Yz7E2ZHdk","2DREsRACuj","I7p2agtCA5","wiHrZ1j5L8","n1pmOMm8si","BbwgAuLtKs","2NslmhE1Ql",
+"Zv7z0Chuy3","QbxXcXyPZN","ciuWzd85a9","lH1ktxciqp","jS1ajNAFuw","OUqFMhYBCK","Ul4a1BpYhV","2ZHdkxReec","D6rByEOE1o","TXQ0ZWPmlx",
+"DQimpGXdoH","VjCZqtl72W","CNHmv5iGN5","blLA9Uvlv4","AXpwE5Namm","EOE1o580YD","k85AeLewvM","BFkb8wiHrZ","FhtglRACuj","0h1b1HfyNQ",
+"WPmlxxXTI4","rhl0JOxWIH","EdBKcW3VFH","FNYIMhSSvQ","24ARFtjQxs","HP433guMb8","Kr8ysQworu","7Ow5CMojnP","8cVD3XflUq","uoStwa00b5",
+"XflUqdpe1v","ZzJHWv2eC3","uupzkTXQ0Z","xReec29QAz","uAWypTXQ0Z","O3iyQ1LB1L","vOqCERkQke","y94nwl83Ud","t98iWzHF1q","JKWYRWaWsv",
+"qQxHP7Ow5C","AmdQdG1RhS","PYBf4IjTwP","5nmWvhE1Ql","pAhR1NOHsz","Zv7z0Mkgy8","NcICAn8pJ9","5iGN5In3NS","FLsphuLtKs","dpe1vsoy9t",
+"gtCA5lpF6W","MmsIo5Drn0","QClRL3weIF","jS1aj9rlg9","cL0aEyEfy9","AkKTkG1RhS","faHirS2Dfu","Pb1paVprf2","ThjNnNo0Qb","nnP8oFPfSE",
+"5iGN5uvf7A","djsrvnFqik","0PktICIShG","FNYIM8U2nU","CNHmvRACuj","yToGWSs0Zu","7hyVvgf8rI","xXTI4CqqaD","fFDrJ45cIH","W7cTs8TxD7",
+"K20wK8FmFH","RxrsmoVQp6","I7p2aLewvM","8TxD7uTacx","zmLYDBpYhV","iqv4kGWqqX","oQ87ri3pyd","OHaBz1v5hH","45cIHEOE1o","AOgEeIRh48",
+"ZhwG1nFqik","K20wKpiJSk","fqypyZJTXH","JIqXiJ2mQi","5drc6Z4I1v","CNHmvQYxC0","tuDySChuy3","ulk41xXTI4","m4bxUYf2Ec","uTacxL7cGc",
+"Nxx9VFwEJz","SjskQGSQwj","ni2v1yEfy9","F6PT2xReec","5Mg9rGWqqX","LDk6fNOHsz","fLNg8JRJQB","dpe1vVprf2","CNHmv9GXkX","kZANmU3yw5",
+"FPfSEYh1hF","iqv4k29QAz","aL6AJWaim6","0KyfspT8wu","NcICAo8Uyd","oQ87rhE1Ql","ZhwG1SbRYy","m4bxU5ZaEz","atef2YjB9t","VerEAIn3NS",
+"BCxeCd7vjM","i7WMQ3weIF","RkQkeYh1hF","fLNg807n1c","ThjNn5drc6","tuDyS5Namm","F6PT2RACuj","8hJdtlViBv","XflUqBbwgA","SmGzv24ARF",
+"uQIczgdQsS","YOfrYHfyNQ","5VZjSguMb8","e6e4zyluBx","yofH3Y1mC0","uTacxVIlwP","jSjS3LDk6f","0MR5XC2Irc","bZLvSJJs5m","EoToPjS1aj",
+"zY1GYSmGzv","RACujYf2Ec","jfREuMm8si","euZA5Kr8ys","S77LHKr8ys","7Ow5CyvOMI","8RCUAJRJQB","QssNC4W0Tl","dpe1vMK07Y","GWqqXhUTw7",
+"QChxsogLgc","M6qcGogLgc","tjQxs7X3uy","FNYIM8xEKz","Kr8ysoVQp6","QChxs2TRI7","zHF1qSjskQ","1v5hHdhSuH","FVMxo2Nslm","UmaEvuJScX",
+"aDGtSReKEW","FnPFBIn3NS","Dz1R3blLA9","oQ87rtuDyS","OUqFMGrDg7","4QMc9FwEJz","zQt6QQChxs","4dEz6iB08l","Mm8si2DREs","GWqqXix74r",
+"M6qcGcmXIX","uupzk1v5hH","Yh1hFn1pmO","mz8gxCdyBV","YOfrY7lUXZ","YjB9tYOfrY","yofH3Twano","JJs5mKASQ8","iwzGkru4UG","FFDuituDyS",
+"GrDg7gf8rI","qaofNjeskS","4dEz68cVD3","lCMxyy94nw","RpBQmogLgc","taOXKMGlTF","lweGy5Drn0","MaJQsVBjhz","cmXIXFnPFB","3otm6LbRTH",
+"FwEJzpT8wu","VLTy6t98iW","VBjhzs7Mxk","zHF1qv8yFN","1LB1LS2Dfu","0PktIokgRi","SbRYybgJAz","jfREugdQsS","zqH0WpvgjS","FGzgp4QMc9",
+"9iGoTeuZA5","WPmlxVNCPd","XflUqGrDg7","FFDuiFLsph","prNT6GWqqX","J2mQik85Ae","7hyVvtlILt","GSQwjh1zcH","S2DfuqQxHP","RBhp0ix74r",
+"2DREsIRh48","uZPqgG1RhS","5drc61j5L8","Yh1hFpFrrl","RACujuPX7G","W3VFHTXQ0Z","Oz8yZ07n1c","FNYIMkB5nP","16lHcC2Irc","VIlwPJJs5m",
+"dpe1vix74r","ZUnqtjeskS","jS1ajt98iW","jSjS3FNYIM","tvdkDsx5Gl","QWxoTogLgc","n1pmOlkMUA","Ss0ZuVBjhz","SWfouQ6Lix","iKqhr9iGoT",
+"LDk6fhe9IA","Ss0ZuuPX7G","POUYSTwano","yvOMIpvgjS","FjHXRzHF1q","pv0i7zHF1q","RkQkeFnPFB","FjHXR2Nslm","soy9tZ4I1v","B3qema00b5",
+"tlILtRkQke","AOgEeZv7z0","uN6r3IRh48","Uvlv4RkQke","FxX9qVNCPd","29QAzThjNn","s4786blLA9","5Nammv2eC3","XflUq8xEKz","D6rBygtCA5",
+"W3VFH4QMc9","yofH3Q6Lix","cL0aEfmIK1","uupzkX6Pin","oVQp6ni2v1","VNCPdJJs5m","FcWrWokgRi","Z4I1vhYBCK","Dz1R3StlDJ","AXpwEIn3NS",
+"Zv7z0cL0aE","0Wr5yS2Dfu","rhl0JcQOnv","FFDuiOUYuF","DQimp0h1b1","tuDyS5Mg9r","Vprf2Zv7z0","yToGW14FLR","tuDyS14FLR","QChxsvLsmS",
+"29QAzo8Uyd","uN6r3RBhp0","djsrvoGu6x","1LB1LyluBx","Q6LixQ6hMC","RACujCp3mZ","rz7Ut6q6L9","blLA9FPfSE","brhlQs7Mxk","VjCZqAIYUu",
+"QbxXcHfyNQ","M3zXLlCMxy","pT8wuhe9IA","7hyVvVerEA","7hyVvdmoS7","jfREuPOUYS","Cfgr36q6L9","DcpWBUlU3M","U3yw5zmLYD","7X3uylsQGo",
+"MojnPkZANm","m4bxU9rlg9","yToGWokgRi","CxVEfKsjRK","Ta8f67hyVv","3weIFMmKGJ","IjTwPEdBKc","ksJbypiJSk","FVMxozQt6Q","5drc6C2Irc",
+"618Di5drc6","s7Mxk7fsYM","fqypyuJScX","MojnPYw2oU","ogLgc8U2nU","QYxC0FwEJz","pmeCd6AFT0","ru4UGlj07Q","5drc68U2nU","cmXIXVIlwP",
+"e6e4zxXTI4","uAWypguMb8","SjskQNOHsz","pT8wum4bxU","J2mQiThjNn","RsQUqRBhp0","soy9t16lHc","iKqhrIn3NS","pWiOsJIqXi","9GXkXaez9y",
+"ix74r0Kyfs","SmGzvNAFuw","AmdQdUvlv4","prNT67fsYM","Ta8f6J2mQi","FFDuiguMb8","Yh1hF5nmWv","AXpwE7hyVv","8xEKzrhl0J","L7cGcQYxC0",
+"K4GS8FnPFB","cmXIXa00b5","fcJOy2Yz7E","6AFT0cQOnv","iB08lpiJSk","QChxsZuDtD","7fsYMRmDcr","IRh48618Di","uZPqgVNCPd","DG4sTFjHXR",
+"UlU3MguMb8","atef2Pb1pa","azIWpTXQ0Z","2TRI7vLsmS","RzaZAReKEW","Uvlv4euZA5","YjB9tNhXdu","AgJHQzqH0W","RzaZACdyBV","iB08lSjskQ",
+"7lUXZpv0i7","VIlwPS2Dfu","8xEKz07n1c","3otm6suY4x","vkCHHlH1kt","FjHXRTwano","HlUbFsoy9t","5nmWvix74r","uJScXOUYuF","45cIHOHaBz",
+"POUYSEOE1o","Pb1padhSuH","TCgPpOUYuF","Cfgr3wDajX","pv0i7JRJQB","WPmlxQbxXc","7Ow5CCIShG","5iGN58U2nU","pv0i7EoToP","vOqCEkB5nP",
+"fFDrJulk41","RmDcrCfgr3","Qworue6e4z","Twanoaez9y","zmLYDru4UG","aDGtS4QMc9","0YAGH6AFT0","tlILt0ao3l","pAhR1FFDui","0Wr5yuoStw",
+"NAFuw5IhmG","ThjNnlH1kt","s7MxkMGlTF","o8UydGXdoH","EOE1oFxX9q","DG4sTzFgtB","rKDLJd85a9","sqVrfhSSvQ","55rfBOxWIH","Dz1R3D6rBy",
+"zHF1ql83Ud","azIWpwDajX","No0QblsQGo","M3zXLi3pyd","fmIK1CdyBV","b29RJReKEW","1j5L8jzUqR","rKDLJJXljW","ogLgcMGlTF","BpYhVJ2mQi",
+"UlU3MTXQ0Z","IRh482Yz7E","VIlwPWMiS3","pT8wulweGy","8TxD7FwEJz","ReKEWaez9y","45cIHLDk6f","W7cTsfcwDa","4QMc9ThjNn","cL0aEo8Uyd",
+"Pb1paHlUbF","FGzgpSWfou","U3yw5ix74r","uoStwhE1Ql","UlU3MBGaQY","s4786SjskQ","aDGtSi7WMQ","VBjhzGWqqX","POUYSaL6AJ","dhSuHqaofN",
+"Gv3Fq0BmCy","nlaByG1RhS","nFqikSWfou","yofH3CNHmv","CIShGECMvU","FnPFBChuy3","3weIF1v5hH","FLsphMezSW","n8pJ9QssNC","n1pmOTXQ0Z",
+"14FLR14FLR","ZUnqtl83Ud","P6bcgFLsph","IKxdLjfREu","48cHLyluBx","i7WMQ2ZHdk","I7p2aoQ87r","v1HlnK4GS8","WmadAfLNg8","n8pJ94dEz6",
+"t59lR5drc6","OUqFMhE1Ql","Yw2oUG1RhS","0YAGHtvdkD","MmKGJEoToP","uLtKsvkCHH","8xEKzydG8U","ni2v10h1b1","BGaQYZhwG1","JJs5mZUnqt",
+"vLsmS1v5hH","PYBf4JJs5m","zqH0WYh1hF","S2DfupAhR1","CNHmvJXljW","FhtglC2Irc","gdQsSRBhp0","6q6L9dhSuH","fLNg8SmGzv","n8pJ9tjQxs",
+"Mm8sin8pJ9","0ao3lwDajX","CIShGaFFss","PYBf4tl72W","Yw2oUY1mC0","POUYS2Nslm","9rlg9FnPFB","xReecxXTI4","pWiOszFgtB","xciqpiB08l",
+"Oz8yZ4QMc9","RmDcra00b5","fLNg8AmdQd","X6PinEOE1o","D6rByrz7Ut","HlUbFtAOsr","pT8wu618Di","S2DfuZJTXH","gf8rI5VZjS","F6PT2EOE1o",
+"tlILtzQt6Q","Q6hMCOUYuF","Twano64s8N","K20wKPYBf4","2TRI7AIYUu","ix74rS2Dfu","dpe1vL7cGc","pv0i7GrDg7","Cp3mZzQt6Q","ydG8UQYxC0",
+"v1Hln3weIF","AXpwEciuWz","3weIFWDVWJ","t59lRAgJHQ","5iGN5Z4I1v","s4786Pb1pa","piJSkxXTI4","pT8wuciuWz","AgJHQVIlwP","IKxdLjS1aj",
+"vOqCEFhtgl","2NslmhUTw7","lCMxyhE1Ql","K4GS8Kr8ys","16lHcMm8si","uLtKskB5nP","yToGWdpe1v","taOXKiwzGk","VLTy6NAFuw","5IhmGAmdQd",
+"6q6L99eoRc","Pb1paatef2","WPmlxydG8U","StlDJ2Yz7E","iKqhrFhtgl","7X3uyJkzUn","n1pmO7Ow5C","HfyNQx3LDe","ZhwG13otm6","TwanoSmGzv",
+"F6PT2HfyNQ","UlU3MhE1Ql","UlU3MdQ586","FVMxoksJby","Gv3FqEOE1o","DcpWBYOfrY","rhl0J0Kyfs","o8UydIKxdL","ni2v1yvOMI","he9IAlViBv",
+"BFkb89y4lw","FLsphThjNn","7Ow5Cy94nw","bgJAz0Wr5y","CxVEflkMUA","0KyfsydG8U","FPfSEzHF1q","8U2nU8TxD7","tvdkDHlUbF","MmsIo5iGN5",
+"uvf7AC2Irc","XyPZNQ6Lix","rhl0JPYBf4","Chuy30Kyfs","KsjRKP6bcg","i3pyd9GXkX","aL6AJRzaZA","lpF6WyToGW","L7cGcEdBKc","RsQUqQChxs",
+"7Ow5CdQ586","uoStwdpe1v","3otm64dEz6","ciuWztvdkD","Cfgr3d85a9","M3zXLRxrsm","qQxHP8hJdt","IjTwP2Yz7E","MaJQsuZPqg","ECMvUdmoS7",
+"Kr8yszQt6Q","AIYUui3pyd","ZzJHWzmLYD","J2mQilsQGo","Yw2oUgtCA5","7fKYUI7p2a","7lUXZmX2GE","mz8gxRxrsm","vkCHHUl4a1","djsrvlweGy",
+"QWxoTNxx9V","DG4sT5Mg9r","ReKEW07n1c","MojnPAOgEe","jeskSRACuj","oVQp66AFT0","8xEKzzqH0W","FnPFBuPX7G","FxX9qBGaQY","DcpWB0Kyfs",
+"Mm8siyofH3","tAOsr0BmCy","TwanoYjB9t","oQ87rOxWIH","pv0i7xXTI4","jiVBPlsQGo","5nmWvZUnqt","7hyVvReKEW","YOfrYix74r","QChxsP6bcg",
+"v2eC3mz8gx","kZANmcmXIX","n1pmOqaofN","gtCA5VjCZq","aDGtSJ2mQi","n8pJ9uupzk","8TxD7WPmlx","SbRYyRpBQm","vOqCEYh1hF","hSSvQtjQxs",
+"bZLvSQWxoT","WMiS3ogLgc","5drc6RpBQm","8xEKzVerEA","v2eC324ARF","a00b5QClRL","8TxD7JKWYR","lH1ktlkMUA","Nxx9V4QMc9","LbRTHJXljW",
+"HfyNQpmeCd","W3VFHJJs5m","yofH3fLNg8","aez9y2ZHdk","ThjNn7fsYM","zqH0WzbIYY","0h1b1i7WMQ","l83UdFnPFB","DcpWBUmaEv","fcJOyMmKGJ",
+"0h1b1OHaBz","nnP8oyofH3","0PktI8RCUA","xReecjSjS3","ZJTXHHzZT8","Oz8yZyEfy9","suY4xZhwG1","iwzGklsQGo","FFDuiB3qem","RACujQssNC",
+"AIYUuSWfou","8xEKz8hJdt","Z4I1vaez9y","55rfBs4786","Ss0Zupv0i7","K4GS8618Di","C2Ircuupzk","jiVBPcQOnv","uJScX5VZjS","ix74r0h1b1",
+"JIqXigtCA5","d85a9G1RhS","Z4I1v2Yz7E","b29RJC2Irc","7fsYMh1zcH","CK5W7P6bcg","aDGtSdpe1v","QChxsmX2GE","W3VFHgIYvE","fLNg8yluBx",
+"pWiOsWDVWJ","VIlwPGWqqX","Nxx9Vdpe1v","CK5W7HRxd8","ksJbyQChxs","hUTw7blLA9","i3pydlXFOB","NOHszAXpwE","o8UydfcwDa","AkKTkRzaZA",
+"45cIHFVMxo","hSSvQDQimp","lm0pDrhl0J","rz7Utdjsrv","45cIHS77LH","K20wKJIqXi","v2eC3soy9t","0MR5XK20wK","pT8wudhSuH","2Yz7ELDk6f",
+"DQimpcShY2","xXTI4wDajX","D6rBy9iGoT","F6PT2KZamH","0Kyfs7X3uy","07n1cHP433","1j5L8aFFss","M6qcGuAWyp","NOHszOUYuF","AmdQdoVQp6",
+"S2DfumX2GE","KZamH8FmFH","TXQ0ZiwzGk","lj07QblLA9","lj07Q1LB1L","QClRLL7cGc","iB08lVNCPd","aFFssQ6hMC","BGaQYZUnqt","QClRLdmoS7",
+"ZhwG1brhlQ","BbwgAW7cTs","QnJ1StaOXK","uvf7AdhSuH","2hEEUwDajX","HP4333weIF","AXpwEcmXIX","Twanoh1zcH","NcICA9eoRc","VjCZqm4bxU",
+"s93MlJXljW","d85a9xXTI4","Yf2EcoQ87r","euZA5AIYUu","DG4sTs4786","yofH3HzZT8","vOqCEgdQsS","GXdoHgtCA5","8U2nUhSSvQ","VjCZqLewvM",
+"5ZaEzx3LDe","GXdoHMmKGJ","QClRLoVQp6","W7cTszbIYY","9y4lwIjTwP","S2DfuAIYUu","I7p2aatef2","ydG8UDLhzM","hSSvQBbwgA","0KyfsMm8si",
+"AOgEeNcICA","gjUTu4QMc9","Uvlv4S2Dfu","7X3uyMm8si","uPX7GTwano","euZA5MGlTF","ogLgcpvgjS","m4bxUQWxoT","piJSkaez9y","yofH3GXdoH",
+"6AFT07lUXZ","lweGyiB08l","kB5nPD6rBy","9eoRcyofH3","XflUqyEfy9","ZhwG1Yf2Ec","n1pmOnnP8o","FLsphOxWIH","qUJMdCK5W7","MojnPCfgr3",
+"i7WMQ0YAGH","h1zcH0Wr5y","jtn0X8U2nU","LewvMtAOsr","FLsphvOqCE","MmKGJzY1GY","7fsYMs93Ml","lweGytl72W","0PktIqUJMd","UmaEv1j5L8",
+"wiHrZCqqaD","DG4sTNxx9V","VLTy6HfyNQ","rhl0JOUYuF","h1zcHzmLYD","nnP8oRmDcr","DLhzMYf2Ec","ECMvUb29RJ","DQimpS2Dfu","azIWpkZANm",
+"wiHrZi3pyd","QChxshe9IA","v8yFNcShY2","piJSkjtn0X","45cIHWreyP","Uvlv4DLhzM","NhXduSmGzv","DQimpuN6r3","9eoRcPYBf4","tAOsrlH1kt",
+"gjUTuDcpWB","Mkgy8JkzUn","7X3uyuQIcz","2NslmF6PT2","gtCA5jtn0X","Nxx9VCK5W7","5NammHzZT8","ulk41CxVEf","RsQUqnnP8o","uN6r3pvgjS",
+"BpYhVCqqaD","Cfgr3yToGW","VNCPdKr8ys","ZUnqthSSvQ","8FmFHZzJHW","brhlQDQimp","HlUbF14FLR","8RCUAni2v1","hUTw7jtn0X","IjTwPuZPqg",
+"qQxHPzz4ZU","he9IAQssNC","t59lR2DREs","2TRI75IhmG","8hJdt2Nslm","YOfrYBFkb8","X6PinVjCZq","jeskSeuZA5","sqVrfVIlwP","0h1b1U3yw5",
+"VBjhz24ARF","Mkgy8WaWsv","HzZT84W0Tl","pv0i7euZA5","ix74rQworu","AOgEewiHrZ","XyPZNtAOsr","lCMxyn8pJ9","zY1GYCqqaD","FGzgpulk41",
+"WMiS3UmaEv","mX2GEWPmlx","ECMvU580YD","gIYvEcQOnv","pT8wuQnJ1S","yluBxsqVrf","I7p2auupzk","48cHL5Drn0","EoToPAmdQd","7X3uyChuy3",
+"vLsmSksJby","m4bxUjSjS3","Ul4a1iwzGk","guMb807n1c","pmeCdmX2GE","oQ87rEoToP","AgJHQd7vjM","MK07YRpBQm","uLtKsECMvU","VNCPdbgJAz",
+"VNCPdBGaQY","DLhzMCxVEf","B3qemfmIK1","CNHmvtvdkD","7Ow5CbgJAz","HzZT8v2eC3","45cIH0MR5X","GrDg7ru4UG","gdQsSaL6AJ","vOqCEKsjRK",
+"MaJQsuTacx","CNHmv2hEEU","IjTwPvLsmS","NAFuwsqVrf","yEfy9VNCPd","0YAGHQYxC0","nlaBy7hyVv","vkCHHDcpWB","WDVWJjfREu","BpYhVFLsph",
+"14FLR2ZHdk","ECMvUJJs5m","zmLYDO3iyQ","vOqCEydG8U","oVQp6lH1kt","D6rByZJTXH","VIlwPS77LH","9y4lwfFDrJ","XflUq48cHL","5Mg9rtjQxs",
+"CxVEfBGaQY","uN6r3hUTw7","Vprf2Cp3mZ","14FLRYh1hF","ZUnqt7hyVv","s4786n8pJ9","8xEKz7Ow5C","AmdQdzY1GY","6AFT0CdyBV","taOXKoGu6x",
+"HRxd8cmXIX","B3qemv8yFN","zY1GYDG4sT","jfREu4dEz6","hSSvQ8FmFH","VjCZqUl4a1","55rfBfFDrJ","suY4x580YD","pmeCdHfyNQ","jtn0XMK07Y",
+"pv0i7guMb8","pvgjSAkKTk","XyPZNnlaBy","zqH0WfcJOy","ix74r0Wr5y","In3NSM6qcG","b29RJY1mC0","oGu6xaFFss","ECMvUVjCZq","8cVD3cQOnv",
+"48cHLBpYhV","FNYIMuoStw","CK5W7ix74r","v1HlniKqhr","WreyPRzaZA","UmaEvMaJQs","pWiOs1LB1L","xciqpxReec","IRh48FxX9q","C2Irc5Mg9r",
+"fmIK1jzUqR","fFDrJTXQ0Z","yEfy9cQOnv","yEfy9k85Ae","X6PinW7cTs","GWqqXQWxoT","CxVEfDLhzM","FxX9qUlU3M","WreyPWMiS3","jSjS3jiVBP",
+"ZUnqtKr8ys","X6Pin55rfB","gf8rIpT8wu","Nxx9VXyPZN","tlILtdQ586","7fsYMjSjS3","x3LDeDcpWB","ru4UGokgRi","zFgtBkB5nP","1j5L8JXljW",
+"CK5W7hE1Ql","Nxx9Vdjsrv","BpYhVIBe8k","TCgPpjtn0X","xXTI4hSSvQ","hUTw7s93Ml","Ss0ZuMK07Y","Q6hMCgtCA5","AgJHQ5drc6","D6rByP6bcg",
+"jzUqRtl72W","blLA9UlU3M","FhtglCxVEf","jiVBPX6Pin","I7p2ahSSvQ","Waim6OUqFM","h1zcHuAWyp","48cHL8FmFH","Yw2oU7fsYM","ksJbyGWqqX",
+"n8pJ9FcWrW","hi5X7yofH3","aDGtSv2eC3","ThjNnfqypy","aFFssCqqaD","AmdQdYjB9t","LDk6ftvdkD","RpBQmPb1pa","v2eC3VerEA","dpe1v2DREs",
+"aez9yaDGtS","0ao3lmz8gx","VIlwPZuDtD","Y1mC0Cp3mZ","taOXKqUJMd","fmIK1cQOnv","aFFssblLA9","CNHmvxReec","0PktIPYBf4","BCxeCi3pyd",
+"Ul4a1RpBQm","fmIK1x3LDe","aez9y7fsYM","FGzgpK20wK","J2mQi7fKYU","K20wKwiHrZ","ru4UG55rfB","lsQGoQYxC0","aDGtSUlU3M","X6Pinuupzk",
+"Ul4a1l83Ud","zbIYYOUYuF","FnPFBMezSW","y94nwaez9y","L7cGcn8pJ9","n8pJ916lHc","WmadArz7Ut","UmaEvJkzUn","kZANmxReec","ZhwG1oVQp6",
+"Nxx9VfLNg8","ZUnqtFxX9q","i3pydXyPZN","ksJbyD6rBy","ZJTXHhe9IA","VBjhzB3qem","VerEA7lUXZ","3otm6O3iyQ","XflUqs93Ml","nnP8oJKWYR",
+"MK07YJKWYR","jSjS38RCUA","MaJQs7fKYU","C2IrcYw2oU","fLNg88cVD3","hYBCKpWiOs","BFkb8he9IA","tvdkDbrhlQ","lm0pDb29RJ","QChxsSWfou",
+"lm0pDfcwDa","d85a9lViBv","5Drn0okgRi","lH1ktRmDcr","3weIFThjNn","HP433JJs5m","x3LDe2hEEU","Chuy3Fhtgl","OUYuFtlILt","2DREsSmGzv",
+"5IhmGCdyBV","KASQ8mX2GE","5Drn07fsYM","y94nw5nmWv","uTacxprNT6","NcICA4W0Tl","2ZHdk1j5L8","tl72WhUTw7","lsQGowDajX","sx5GltaOXK",
+"rKDLJgIYvE","U3yw51j5L8","XyPZNIKxdL","vOqCEzmLYD","8hJdtn8pJ9","uTacxazIWp","VLTy6CIShG","C2IrclsQGo","xciqpFcWrW","dQ586oQ87r",
+"CIShGlweGy","RsQUqvOqCE","7ku1pMaJQs","VIlwP5iGN5","JJs5mB3qem","uZPqgW7cTs","hSSvQLewvM","EoToPksJby","5Drn016lHc","StlDJmX2GE",
+"tuDySkZANm","BGaQY5Drn0","pAhR1prNT6","9XyT9OxWIH","I7p2ahe9IA","k85AeqUJMd","vkCHH9GXkX","iB08lSWfou","pmeCd5Mg9r","mX2GErhl0J",
+"7fsYMQClRL","7ku1p64s8N","cmXIXW3VFH","YjB9tfcwDa","Gv3Fqe6e4z","hYBCKyToGW","Twano8cVD3","ZuDtDQChxs","lkMUA8cVD3","sqVrfguMb8",
+"Ta8f69y4lw","pvgjS2Yz7E","9rlg9blLA9","atef2LewvM","vkCHHJRJQB","yvOMIGSQwj","cL0aEhi5X7","v1Hln5IhmG","rKDLJ9XyT9","aDGtSzHF1q",
+"Mkgy8In3NS","Twanohi5X7","yEfy9ThjNn","3weIFn8pJ9","hi5X7FnPFB","ulk4114FLR","x3LDeWPmlx","GrDg7xXTI4","9y4lwaDGtS","blLA9Twano",
+"VBjhzv2eC3","lweGyxReec","jSjS3uupzk","8xEKzFnPFB","iqv4klkMUA","KsjRKBFkb8","OxWIHyToGW","bgJAzguMb8","Yf2EcK4GS8","Kr8yszz4ZU",
+"QssNC6q6L9","8hJdtC2Irc","O3iyQzbIYY","dpe1vzqH0W","ZJTXHUlU3M","L7cGclm0pD","l83UdFPfSE","FPfSEDQimp","pv0i73otm6","IKxdLgf8rI",
+"DG4sTIKxdL","MmsIoaFFss","piJSkJkzUn","Uvlv4VNCPd","LewvMCqqaD","nlaBygtCA5","yluBxdQ586","K4GS8Ss0Zu","9rlg9Cfgr3","cQOnv8cVD3",
+"POUYSQssNC","YjB9t2DREs","fcJOytlILt","SbRYyxXTI4","QWxoTKr8ys","16lHcFFDui","qaofNMm8si","EdBKcpv0i7","JJs5mlViBv","lpF6WQChxs",
+"5ZaEzU3yw5","ru4UGP6bcg","B3qemZJTXH","bgJAznnP8o","Fhtglb29RJ","aL6AJi3pyd","RpBQm55rfB","prNT6iB08l","MmsIoO3iyQ","bZLvSuZPqg",
+"y94nwEOE1o","lm0pDNcICA","45cIH7hyVv","yEfy91v5hH","xXTI4VBjhz","5Namm5iGN5","fmIK1ni2v1","lsQGolm0pD","QChxsFjHXR","i7WMQAIYUu",
+"45cIHtAOsr","XflUqIjTwP","Chuy3zqH0W","14FLRrKDLJ","Ul4a1xXTI4","uZPqgsuY4x","CK5W75iGN5","Gv3Fq0ao3l","7X3uy8hJdt","b29RJpvgjS",
+"RkQkefaHir","PYBf4fmIK1","BGaQYCqqaD","okgRiM3zXL","QChxsFnPFB","5NammqaofN","pFrrlCdyBV","5VZjSDz1R3","fqypyTwano","45cIHNxx9V",
+"VerEAoVQp6","aDGtSs4786","hUTw7WPmlx","5VZjSo8Uyd","brhlQVLTy6","JRJQB3otm6","4QMc9AgJHQ","v8yFNUl4a1","AIYUugjUTu","X6PinFhtgl",
+"8cVD3NAFuw","29QAzFPfSE","9XyT9DcpWB","B3qemvkCHH","16lHcsqVrf","s93MltlILt","ix74rSWfou","0BmCyRsQUq","a00b5SjskQ","GSQwjZhwG1",
+"nlaByAXpwE","ix74r29QAz","580YDVLTy6","rKDLJeuZA5","PYBf4M3zXL","yvOMIoVQp6","1LB1LZ4I1v","fcwDaOUqFM","7fKYU55rfB","oQ87r7X3uy",
+"bgJAzQ6Lix","wDajXM6qcG","UlU3MzbIYY","pWiOsuQIcz","vOqCE580YD","OHaBz6AFT0","piJSkW3VFH","Oz8yZDQimp","s4786sqVrf","KASQ8AgJHQ",
+"DcpWBQWxoT","v2eC3FPfSE","2Yz7EwDajX","MaJQsYw2oU","nFqikogLgc","MGlTFfcJOy","kB5nPZzJHW","MmsIofLNg8","vkCHHzbIYY","Pb1paRBhp0",
+"FhtglY1mC0","XflUqQssNC","uJScXvOqCE","pmeCdBCxeC","uQIcz9y4lw","GrDg70ao3l","n1pmOP6bcg","07n1cv1Hln","guMb87fsYM","FPfSE8hJdt",
+"6q6L9uvf7A","t59lRMaJQs","Z4I1vReKEW","OHaBz29QAz","l83UdvOqCE","QChxsgIYvE","X6Pine6e4z","VerEAiKqhr","WPmlxhSSvQ","hi5X7n1pmO",
+"7hyVvB3qem","Mm8si6q6L9","7fKYU8cVD3","d7vjMzHF1q","BpYhVi3pyd","iKqhrECMvU","M6qcGS77LH","8xEKzksJby","cQOnv5drc6","VBjhzblLA9",
+"YjB9t3otm6","Dz1R3MGlTF","POUYS8RCUA","GrDg7uPX7G","s7MxkiwzGk","ZzJHWb29RJ","2TRI7SbRYy","IjTwPt59lR","hSSvQVIlwP","fLNg845cIH",
+"9y4lwBFkb8","nnP8o5ZaEz","0BmCy7lUXZ","CNHmvqQxHP","xXTI42TRI7","FFDuiiB08l","HlUbFuN6r3","VLTy67lUXZ","okgRi2ZHdk","fmIK1jtn0X",
+"Nxx9Vi7WMQ","CNHmv5VZjS","tAOsrpv0i7","OUqFMQChxs","tl72WgjUTu","1v5hHOxWIH","kZANmVBjhz","vOqCE5Drn0","n8pJ9LbRTH","2hEEUpFrrl",
+"I7p2ad7vjM","FPfSEWDVWJ","FLsphkB5nP","Cp3mZo8Uyd","C2IrcYjB9t","9GXkXChuy3","v1HlnjS1aj","soy9ttl72W","djsrvGv3Fq","KASQ8zY1GY",
+"fFDrJ5nmWv","LDk6f64s8N","7hyVvY1mC0","QWxoTIjTwP","ECMvUL7cGc","s4786hi5X7","s7MxkCK5W7","WreyPHfyNQ","8cVD3U3yw5","Q6hMCRBhp0",
+"EOE1ok85Ae","bZLvSCxVEf","B3qemBGaQY","fcwDauLtKs","uTacxBbwgA","vOqCE5VZjS","StlDJrhl0J","FPfSE0h1b1","mX2GEGrDg7","FxX9qt59lR",
+"MezSW7X3uy","v2eC3MojnP","lsQGojS1aj","CdyBVix74r","iKqhrAXpwE","oGu6xOUYuF","L7cGcKr8ys","2ZHdkJXljW","QnJ1SuLtKs","mX2GE45cIH",
+"lweGyyEfy9","M3zXLOxWIH","LDk6fWaWsv","U3yw5Vprf2","5Mg9rAmdQd","WreyPprNT6","FcWrWlm0pD","W3VFHlViBv","prNT6QYxC0","uvf7A5iGN5",
+"9y4lwGSQwj","lpF6WZUnqt","yvOMI55rfB","hi5X7yToGW","VjCZqzz4ZU","LewvMEOE1o","jiVBPSWfou","iqv4kfaHir","UmaEvuPX7G","O3iyQuvf7A",
+"ThjNnl83Ud","B3qemokgRi","iKqhrmX2GE","K4GS8TXQ0Z","sqVrfOUYuF","BFkb8BCxeC","fmIK1KASQ8","8U2nUWMiS3","d7vjMvLsmS","VerEAxciqp",
+"s93Ml9XyT9","pv0i7taOXK","zmLYDcQOnv","KZamH29QAz","qaofNRBhp0","HzZT8fmIK1","AOgEe1j5L8","brhlQ7hyVv","P6bcgIRh48","24ARFe6e4z",
+"0KyfsS2Dfu","5nmWvx3LDe","ciuWzt98iW","aL6AJrz7Ut","xXTI4FwEJz","HRxd8Cp3mZ","29QAzd7vjM","sx5Gl0PktI","0h1b1S2Dfu","7fKYUK20wK",
+"2TRI7ZzJHW","OxWIHHlUbF","mz8gxSjskQ","Yw2oUCNHmv","nnP8o2hEEU","JJs5m5nmWv","9eoRc4QMc9","6q6L9G1RhS","7ku1pWreyP","pFrrlFFDui",
+"pT8wuMK07Y","zqH0WM6qcG","s7MxkiKqhr","EOE1oLDk6f","5Namm4W0Tl","7lUXZFGzgp","Z4I1vMkgy8","HlUbFblLA9","TXQ0ZHRxd8","JKWYRpFrrl",
+"Waim6uTacx","DLhzMCqqaD","nnP8oQYxC0","ECMvUzFgtB","yvOMI2TRI7","1v5hHjiVBP","QWxoT2ZHdk","iB08lqQxHP","J2mQiuvf7A","5drc6Qworu",
+"HRxd88xEKz","euZA5RkQke","WPmlxhi5X7","ru4UGS77LH","MmsIozbIYY","v1HlnB3qem","X6PincL0aE","9GXkXzmLYD","J2mQiPYBf4","cmXIX2DREs",
+"NAFuwpvgjS","jS1ajk85Ae","EdBKcdQ586","RsQUq0BmCy","gf8rI2TRI7","cL0aE64s8N","rKDLJlm0pD","WDVWJokgRi","LDk6fGrDg7","d7vjMtlILt",
+"sqVrfY1mC0","U3yw5gtCA5","7Ow5CWaim6","uJScXQbxXc","580YDL7cGc","iKqhrOxWIH","K20wKuQIcz","tuDySZhwG1","Oz8yZqaofN","zmLYDpT8wu",
+"ZhwG1Fhtgl","BpYhVgdQsS","uvf7AGrDg7","s7MxkEoToP","FxX9qSbRYy","aFFsscmXIX","K20wKIn3NS","Pb1pakB5nP","FPfSEWaWsv","zz4ZUdmoS7",
+"NAFuwy94nw","W7cTsJXljW","Waim6GSQwj","2hEEUVprf2","cQOnvfqypy","jfREuSbRYy","pWiOs9y4lw","NAFuwyluBx","hE1QlcL0aE","I7p2a2Yz7E",
+"0BmCylj07Q","pT8wuuupzk","VNCPdzz4ZU","RBhp0nnP8o","blLA9VIlwP","Cfgr3pv0i7","RxrsmWreyP","9GXkXbZLvS","h1zcHKZamH","jS1aj1j5L8",
+"Gv3FqciuWz","ksJbyokgRi","5Mg9r7hyVv","JkzUnThjNn","VIlwPVBjhz","8RCUAWreyP","lH1ktOUqFM","IRh48DLhzM","d85a9CdyBV","Cfgr3BFkb8",
+"dmoS7ZUnqt","NhXdu580YD","9eoRc8hJdt","CNHmvsx5Gl","WPmlx4W0Tl","Nxx9VBFkb8","K20wKVLTy6","O3iyQ0PktI","G1RhS0BmCy","vOqCEVprf2",
+"5IhmGksJby","GXdoHuQIcz","ZUnqtvkCHH","gtCA5l83Ud","vLsmSsuY4x","QWxoTi3pyd","MojnPMmsIo","AOgEeZhwG1","0Wr5y2Yz7E","suY4xvLsmS",
+"gtCA58xEKz","BpYhV0YAGH","n1pmOcQOnv","guMb8VIlwP","jS1ajI7p2a","fmIK1In3NS","0BmCyVNCPd","VLTy6CdyBV","CNHmvWaim6","8RCUAsqVrf",
+"IBe8kYOfrY","BCxeCbgJAz","t59lRy94nw","Dz1R38U2nU","OUYuFKASQ8","aez9yYOfrY","0YAGHGSQwj","dmoS7uoStw","v2eC35Mg9r","zQt6Qiqv4k",
+"M6qcGReKEW","48cHLC2Irc","n8pJ9sqVrf","e6e4zi3pyd","i3pydRBhp0","ZUnqtgtCA5","ZhwG1YjB9t","Pb1pav8yFN","ulk41djsrv","Nxx9VaFFss",
+"GSQwjJKWYR","OHaBzm4bxU","8hJdtksJby","Yw2oUlXFOB","fcJOyWaim6","JKWYRFVMxo","lpF6WbZLvS","9eoRcoVQp6","Gv3Fqy94nw","9GXkXsoy9t",
+"azIWpZhwG1","Cp3mZGv3Fq","zqH0WpWiOs","BCxeCsuY4x","he9IARACuj","sqVrfK20wK","TXQ0Zpv0i7","dmoS79iGoT","CNHmvJkzUn","uZPqgGWqqX",
+"iqv4kY1mC0","ReKEWNo0Qb","VBjhzKsjRK","JkzUnRxrsm","cmXIXWreyP","NhXdudQ586","djsrvSmGzv","HzZT8ciuWz","9y4lwECMvU","0Wr5yL7cGc",
+"gIYvEzFgtB","b29RJ7hyVv","zY1GYIBe8k","S2DfuLbRTH","s4786nFqik","gjUTuFjHXR","Ul4a1IKxdL","7lUXZo8Uyd","5Drn064s8N","s93MlVLTy6",
+"xXTI4uZPqg","7lUXZiKqhr","VLTy6GWqqX","rhl0JlpF6W","oQ87rFFDui","QWxoTAmdQd","RxrsmfaHir","FLsphksJby","lViBvNAFuw","wDajXFPfSE",
+"yvOMInlaBy","BGaQY2Yz7E","Ul4a1AOgEe","Chuy3lkMUA","5Drn0JRJQB","AXpwElViBv","ulk41gdQsS","Ta8f6BGaQY","W7cTsOxWIH","bgJAzJ2mQi",
+"pWiOsGXdoH","LbRTHkZANm","IjTwPaFFss","7ku1p7lUXZ","FNYIMUl4a1","GSQwjBFkb8","pT8wuoVQp6","Ul4a114FLR","hSSvQdhSuH","o8UydvOqCE",
+"wiHrZgjUTu","nnP8oAOgEe","VLTy6x3LDe","uTacxFcWrW","Q6LixMmsIo","DLhzMIBe8k","8U2nUYh1hF","YOfrYazIWp","uTacxcShY2","ksJbyprNT6",
+"No0Qbh1zcH","FGzgpgdQsS","ydG8UFNYIM","uAWypWaim6","F6PT21j5L8","Zv7z0tl72W","5NammyofH3","lpF6WwDajX","NcICAGXdoH","RpBQmqUJMd",
+"WMiS3SjskQ","FLsphHfyNQ","l83Ud2Yz7E","l83UdIKxdL","l83UdXflUq","CIShGFPfSE","5IhmGrz7Ut","tjQxsdmoS7","xReec8FmFH","CxVEfBbwgA",
+"gIYvElm0pD","suY4xaDGtS","iqv4kM3zXL","t98iWSmGzv","ZUnqtguMb8","CqqaD8FmFH","Ul4a1sqVrf","OUqFMMmKGJ","0PktIs4786","uPX7GDz1R3",
+"jiVBP2hEEU","Yh1hFSmGzv","lViBvCqqaD","fFDrJ2Nslm","OxWIHhE1Ql","he9IAM6qcG","Waim60Kyfs","2NslmGWqqX","v1Hln7fKYU","PYBf4euZA5",
+"RkQke9XyT9","8cVD3ZJTXH","IRh48wiHrZ","2Nslm8hJdt","FwEJzStlDJ","yToGWEoToP","iKqhrhi5X7","tAOsrLDk6f","oGu6xGrDg7","FVMxo7Ow5C",
+"yvOMIRxrsm","IKxdL1LB1L","580YDRpBQm","3weIFVIlwP","D6rBygjUTu","Gv3FqMmsIo","d7vjMW7cTs","C2IrcL7cGc","jSjS3jtn0X","b29RJNcICA",
+"PYBf4uAWyp","580YDv8yFN","fLNg8Ul4a1","48cHLRkQke","dQ586brhlQ","4QMc9Kr8ys","LewvMS77LH","Waim6JIqXi","Cp3mZHRxd8","VIlwPY1mC0",
+"CxVEftlILt","i3pydNhXdu","KZamHi7WMQ","JKWYRVjCZq","GXdoHpmeCd","aez9yQWxoT","U3yw5QWxoT","Uvlv45iGN5","OHaBzmX2GE","CqqaDIn3NS",
+"J2mQiFcWrW","4W0TlYw2oU","vOqCE29QAz","B3qemIRh48","iB08lNAFuw","soy9tQ6Lix","pmeCdhSSvQ","IRh48pv0i7","gjUTuW7cTs","2DREszz4ZU",
+"lm0pDzFgtB","VIlwPKZamH","Waim6jtn0X","nlaByK20wK","YOfrY7ku1p","QbxXcRACuj","HP433iKqhr","djsrvPYBf4","hE1QlblLA9","X6PinWMiS3",
+"taOXK7X3uy","jfREuHfyNQ","9GXkX7Ow5C","HfyNQPOUYS","brhlQm4bxU","SjskQ5ZaEz","azIWpoQ87r","LDk6fiB08l","s7MxkNxx9V","4W0TlReKEW",
+"4W0Tl9rlg9","GrDg77X3uy","Mkgy85Mg9r","CIShGIRh48","NhXdu2TRI7","4dEz6F6PT2","YOfrY3weIF","AIYUuYh1hF","uJScXX6Pin","ZJTXHhUTw7",
+"JKWYRX6Pin","GXdoH48cHL","JIqXiTXQ0Z","blLA9HlUbF","CxVEfChuy3","vOqCEprNT6","qUJMdNhXdu","VLTy6S77LH","l83UduZPqg","lkMUAyluBx",
+"e6e4zP6bcg","zFgtBY1mC0","Vprf2uvf7A","PYBf4MGlTF","K4GS8Twano","2hEEU2Yz7E","atef2JIqXi","MmsIoRzaZA","DQimp7Ow5C","KsjRK45cIH",
+"3weIFX6Pin","SjskQk85Ae","FxX9qVprf2","K20wK2DREs","FGzgpuLtKs","iwzGk6AFT0","POUYSd7vjM","5drc6ZuDtD","2TRI764s8N","NhXduzz4ZU",
+"xReecokgRi","YjB9tJkzUn","NOHsz5ZaEz","DLhzMaFFss","o8UydG1RhS","s93MliKqhr","lCMxyRxrsm","M6qcG24ARF","MmKGJpT8wu","OUYuF5drc6",
+"VLTy66AFT0","FVMxo2DREs","uZPqg2ZHdk","vLsmS64s8N","VIlwPHP433","wiHrZJRJQB","ZhwG1OHaBz","9y4lwWreyP","JJs5mDG4sT","IBe8kMkgy8",
+"HRxd8W7cTs","zz4ZUgIYvE","tjQxsM3zXL","XflUqOxWIH","Oz8yZPYBf4","pFrrlOz8yZ","jfREu9iGoT","lH1ktiKqhr","FhtgltaOXK","zqH0WIBe8k",
+"lweGyoVQp6","ulk41NAFuw","Ta8f6G1RhS","580YDpvgjS","7X3uy0YAGH","NOHszWMiS3","MK07YfaHir","FwEJzUvlv4","Oz8yZRmDcr","WPmlxqaofN",
+"fFDrJHRxd8","bZLvSv2eC3","Cp3mZmX2GE","YjB9tv8yFN","5ZaEz4QMc9","cmXIX0PktI","VIlwPVLTy6","FLsphMm8si","RpBQmdhSuH","CdyBVdpe1v",
+"oGu6x7fsYM","soy9tReKEW","KZamHFLsph","EdBKc7fsYM","xReecZzJHW","ZJTXHTwano","5iGN529QAz","qaofNd85a9","oQ87r3otm6","9XyT916lHc",
+"WaWsvJJs5m","gdQsSqQxHP","HP4339eoRc","45cIHRsQUq","wiHrZksJby","WaWsvfFDrJ","CNHmva00b5","t59lR16lHc","ZJTXHStlDJ","RmDcr7Ow5C",
+"LbRTHzz4ZU","5nmWvs93Ml","bgJAzNAFuw","In3NSMezSW","JXljWEOE1o","GrDg7i7WMQ","Gv3FqCp3mZ","LDk6fb29RJ","aL6AJzqH0W","FGzgpiwzGk",
+"VjCZq9eoRc","faHirKr8ys","i7WMQLDk6f","SbRYydhSuH","gtCA5uQIcz","2Nslmk85Ae","cL0aEulk41","vLsmSsx5Gl","hE1QlxReec","qUJMdpmeCd",
+"zHF1qDG4sT","RpBQmuN6r3","JKWYR24ARF","oQ87ruJScX","8FmFHyofH3","aez9ycmXIX","8cVD3tlILt","QYxC0DG4sT","NhXdua00b5","lsQGoaFFss",
+"5Mg9r0PktI","MmsIoaL6AJ","JXljWUl4a1","2DREsvLsmS","48cHLnFqik","jiVBPZuDtD","jtn0XYf2Ec","zbIYY0PktI","fFDrJRxrsm","vLsmSrz7Ut",
+"v2eC3kZANm","mz8gx7lUXZ","tjQxsNhXdu","JKWYRMmsIo","SWfouzY1GY","ECMvUMezSW","VerEA5Namm","In3NStaOXK","Mm8siMkgy8","Yw2oUuQIcz",
+"6q6L9Cp3mZ","RpBQm618Di","ZhwG1CqqaD","AXpwE2Yz7E","07n1cCK5W7","WaWsvn8pJ9","gtCA5YOfrY","LDk6fdpe1v","Chuy3tuDyS","1j5L88xEKz",
+"ulk41kB5nP","QClRL8RCUA","fFDrJBbwgA","gf8rIn1pmO","Ss0ZuoVQp6","GrDg7rKDLJ","nlaBy6AFT0","4W0TlKr8ys","ReKEWYOfrY","prNT6nlaBy",
+"CdyBVaDGtS","RmDcrVLTy6","soy9tVLTy6","0h1b19iGoT","ECMvUYw2oU","dQ586Pb1pa","i3pydB3qem","AXpwEzqH0W","Gv3Fq7Ow5C","16lHcP6bcg",
+"ReKEWjS1aj","CqqaDP6bcg","MojnPvLsmS","CxVEfjeskS","5Drn0fqypy","U3yw5UlU3M","CK5W7fqypy","P6bcgzz4ZU","Gv3FqAOgEe","QYxC0rKDLJ",
+"Qworu0ao3l","MGlTFjtn0X","euZA5HlUbF","zmLYD0MR5X","KsjRKFxX9q","UlU3MRpBQm","SWfouI7p2a","suY4xvkCHH","tAOsrzmLYD","soy9tsoy9t",
+"brhlQS77LH","VBjhzlpF6W","ECMvUM3zXL","zmLYDDG4sT","uLtKsVjCZq","gIYvEiqv4k","tAOsrSmGzv","BFkb8fcJOy","k85AeCxVEf","3weIFhUTw7",
+"5Mg9r6q6L9","3otm6W7cTs","ciuWz1j5L8","16lHcRBhp0","NcICAHRxd8","0YAGHi3pyd","sqVrfni2v1","n1pmOBCxeC","LewvMQnJ1S","cQOnvzbIYY",
+"iB08lChuy3","gIYvE2DREs","ulk41ZhwG1","RkQkee6e4z","okgRiG1RhS","tAOsrb29RJ","yofH38hJdt","ksJbyIjTwP","t59lR580YD","lsQGopv0i7",
+"Ta8f67lUXZ","sx5GlogLgc","Cp3mZcmXIX","BFkb8vOqCE","0KyfsVLTy6","9XyT9BpYhV","Mm8si7hyVv","Vprf2HP433","LewvM5Drn0","5NammMmsIo",
+"gf8rIYh1hF","EoToPdhSuH","HzZT8LbRTH","4W0TlOUqFM","CK5W7SjskQ","HP433nlaBy","29QAzjS1aj","LDk6fGXdoH","qUJMdfmIK1","oQ87ry94nw",
+"Vprf2Yh1hF","SmGzvDG4sT","pT8wufFDrJ","ZhwG1dhSuH","ogLgc5IhmG","l83UdVjCZq","IBe8kqaofN","pFrrl2TRI7","azIWp9XyT9","wiHrZcmXIX",
+"v8yFNNxx9V","RxrsmdhSuH","QssNCnnP8o","2NslmWaWsv","oVQp6ReKEW","U3yw5zY1GY","oQ87rcQOnv","Ul4a18cVD3","DLhzMlXFOB","StlDJguMb8",
+"5Mg9r2hEEU","9iGoTM3zXL","VjCZqJXljW","7lUXZRzaZA","HRxd8ZzJHW","QChxsRmDcr","faHirxciqp","uN6r3UmaEv","AXpwEGWqqX","soy9tI7p2a",
+"RACujuQIcz","SWfouhe9IA","xXTI4OxWIH","DG4sTWaim6","MaJQsZUnqt","9iGoTs7Mxk","07n1cd85a9","QnJ1S7ku1p","WPmlxJIqXi","B3qemFnPFB",
+"LDk6fs7Mxk","0BmCydpe1v","14FLRQChxs","m4bxUFFDui","zbIYYyofH3","tuDySru4UG","RpBQm0Kyfs","CK5W7jS1aj","0ao3lK20wK","4W0TlFjHXR",
+"DLhzMokgRi","7ku1pzbIYY","lweGy7ku1p","gdQsSNcICA","NOHszfcwDa","0Kyfs5drc6","OHaBzEoToP","uZPqgfFDrJ","OHaBzuAWyp","M3zXLLbRTH",
+"UlU3MNAFuw","pmeCd3otm6","wDajXK4GS8","prNT6zqH0W","gIYvEEdBKc","J2mQiECMvU","S77LHjS1aj","v8yFNPb1pa","rKDLJ3weIF","lj07QRsQUq",
+"SjskQW7cTs","x3LDeix74r","Waim6zqH0W","b29RJ5iGN5","VjCZqB3qem","jS1ajCfgr3","tAOsrZuDtD","0Wr5yOUqFM","zY1GYFjHXR","9eoRcBCxeC",
+"ksJbyMaJQs","ix74rnnP8o","pWiOsCNHmv","0Wr5y8hJdt","Oz8yZcL0aE","a00b5Cp3mZ","SmGzvxciqp","e6e4zzHF1q","e6e4z2ZHdk","sqVrf9y4lw",
+"ulk41v8yFN","RkQkeXflUq","lweGyQChxs","FnPFB0Kyfs","lXFOBOUqFM","S2DfuokgRi","XflUqFhtgl","cL0aEFLsph","xReecprNT6","d7vjMB3qem",
+"yvOMIM6qcG","8RCUAOxWIH","M3zXLQbxXc","2TRI75nmWv","ECMvUi7WMQ","14FLRZ4I1v","dmoS7LDk6f","ZJTXH7fsYM","0YAGHt98iW","UlU3McL0aE",
+"RmDcr6q6L9","prNT6jS1aj","D6rByKr8ys","cL0aEAmdQd","5iGN5xXTI4","pAhR10ao3l","uN6r364s8N","jfREuzY1GY","CqqaDsqVrf","pAhR1IBe8k",
+"JXljWuupzk","RmDcruvf7A","AkKTk24ARF","7Ow5Cjtn0X","Pb1paulk41","aDGtS8TxD7","0BmCyqaofN","faHirnnP8o","FLsphJRJQB","vOqCE1LB1L",
+"KsjRKSWfou","fcJOya00b5","7Ow5C8xEKz","jeskSUvlv4","sx5GlMezSW","YjB9tCNHmv","dpe1vReKEW","2NslmAOgEe","RBhp0xReec","hi5X7OHaBz",
+"kZANmAkKTk","FFDuio8Uyd","AIYUuoVQp6","xReeciwzGk","yofH3EdBKc","8RCUAuJScX","yofH3a00b5","8RCUADcpWB","Uvlv4bgJAz","VLTy6vOqCE",
+"jSjS3kB5nP","FcWrWQnJ1S","faHirBbwgA","1LB1LcL0aE","tAOsrRkQke","wiHrZhUTw7","Nxx9VCxVEf","zFgtBfaHir","hE1QlS77LH","0KyfsTCgPp",
+"GXdoH7fsYM","kZANmWDVWJ","9y4lwMK07Y","7Ow5CkB5nP","OHaBzzQt6Q","ZuDtDfLNg8","OxWIHNcICA","BFkb8Waim6","0YAGHiwzGk","580YDlH1kt",
+"ReKEW14FLR","9eoRc29QAz","WPmlxQ6Lix","atef2kB5nP","nlaByfLNg8","fcwDalj07Q","azIWpB3qem","TXQ0ZZUnqt","IjTwPrKDLJ","KsjRKlpF6W",
+"G1RhSFGzgp","lm0pDZhwG1","OUYuFyvOMI","RkQkel83Ud","Uvlv45Mg9r","JkzUntvdkD","kZANmBFkb8","8cVD3WaWsv","1v5hHsx5Gl","Cp3mZ6AFT0",
+"s47861LB1L","NhXduKr8ys","m4bxU14FLR","UmaEv2DREs","zFgtB0Wr5y","jtn0XM3zXL","i7WMQ7fsYM","dhSuHM3zXL","yluBxMezSW","tjQxsv8yFN",
+"b29RJ0Kyfs","dhSuH2TRI7","IBe8k6q6L9","Pb1paAIYUu","0PktIlCMxy","pWiOsZuDtD","e6e4zY1mC0","QWxoTFGzgp","5NammpiJSk","2Yz7EqUJMd",
+"7hyVvKsjRK","BbwgAjtn0X","OUqFMzFgtB","RxrsmpFrrl","Zv7z0Uvlv4","2NslmRpBQm","VerEAUvlv4","FxX9qokgRi","VjCZqQClRL","QYxC0EoToP",
+"NcICAECMvU","okgRiX6Pin","MojnPzFgtB","OUYuFU3yw5","HlUbFfcJOy","fmIK1fmIK1","yEfy9qaofN","Z4I1vlm0pD","Q6LixfcwDa","QssNCSmGzv",
+"VjCZqix74r","WMiS39rlg9","KASQ8EOE1o","RACujNcICA","XyPZNChuy3","zqH0WgdQsS","MmKGJyofH3","okgRieuZA5","uoStwOUqFM","FjHXRatef2",
+"cL0aEQnJ1S","oVQp6OUYuF","v1Hlnv1Hln","fcwDa29QAz","uQIczqaofN","v2eC3AkKTk","WMiS3EOE1o","JIqXi9iGoT","GWqqXDz1R3","s4786JKWYR",
+"cmXIXpAhR1","BpYhV07n1c","m4bxUBCxeC","45cIHyvOMI","piJSkuAWyp","HRxd8rhl0J","5VZjSKr8ys","zqH0WWreyP","yvOMIQClRL","DcpWBQClRL",
+"MK07YxReec","0BmCy9rlg9","wDajXxciqp","uN6r3nFqik","qaofNFnPFB","jiVBPHfyNQ","4W0Tl9iGoT","P6bcg8TxD7","ECMvUNOHsz","lXFOBsuY4x",
+"L7cGc9eoRc","07n1cKsjRK","2DREspFrrl","NAFuwwDajX","16lHc8cVD3","Pb1palCMxy","euZA5djsrv","F6PT2oQ87r","O3iyQOUqFM","IKxdLcQOnv",
+"HRxd8Ss0Zu","atef26q6L9","5iGN5taOXK","fFDrJOUqFM","QbxXcBCxeC","S77LHtAOsr","SWfouF6PT2","JKWYR5VZjS","Ta8f6tjQxs","oGu6x618Di",
+"iB08l6q6L9","ReKEWECMvU","0ao3lcQOnv","AIYUupv0i7","uAWyp9iGoT","b29RJB3qem","wiHrZokgRi","h1zcHIn3NS","bgJAzVNCPd","BbwgAXyPZN",
+"CNHmvMK07Y","uPX7G9y4lw","Gv3Fqn1pmO","lXFOBWPmlx","DLhzMhUTw7","zQt6QPOUYS","JKWYRJXljW","9eoRc07n1c","Pb1paGSQwj","X6PinUlU3M",
+"I7p2a2hEEU","XflUq5drc6","d85a9fqypy","fcwDalViBv","vLsmSStlDJ","lweGygjUTu","dhSuHBGaQY","FNYIMy94nw","6q6L97X3uy","l83UdCNHmv",
+"tuDySuupzk","yluBxFnPFB","gjUTuXyPZN","9eoRclm0pD","0PktIuPX7G","kZANmoGu6x","MmKGJW3VFH","ix74rtaOXK","oGu6xlXFOB","vLsmSVNCPd",
+"dhSuHRzaZA","WaWsvoGu6x","HfyNQjeskS","Yh1hFn8pJ9","PYBf4Zv7z0","2hEEUWaim6","ZhwG1AgJHQ","KsjRKTwano","MGlTFoQ87r","hE1QlJJs5m",
+"MaJQsBpYhV","14FLRprNT6","uvf7AG1RhS","M6qcGRACuj","dmoS7CNHmv","ECMvUoVQp6","L7cGc4W0Tl","DQimpdpe1v","RBhp01j5L8","Vprf2hUTw7",
+"VLTy6pvgjS","5Mg9rVprf2","OUYuF8TxD7","O3iyQuTacx","MojnPzqH0W","uQIczzz4ZU","d7vjM0MR5X","soy9t0YAGH","SjskQ29QAz","KsjRKtjQxs",
+"Nxx9Vrhl0J","okgRioGu6x","ZUnqtuPX7G","oVQp6FPfSE","oGu6xix74r","KsjRKni2v1","TXQ0ZZ4I1v","5drc6sqVrf","0MR5XVLTy6","FPfSElXFOB",
+"MezSWeuZA5","s7Mxk7hyVv","GrDg7SjskQ","CNHmv0BmCy","P6bcg2ZHdk","XflUqpT8wu","Ss0Zu5drc6","wDajXYw2oU","lXFOBDz1R3","ciuWzuZPqg",
+"tlILttjQxs","QworuNo0Qb","v8yFN9eoRc","s47860BmCy","v1Hln6q6L9","0BmCyP6bcg","TwanoMaJQs","RzaZAyToGW","tl72WUlU3M","24ARFbrhlQ",
+"hYBCKSbRYy","Ss0ZuVprf2","mz8gxECMvU","atef2Yh1hF","VLTy6MK07Y","Q6LixFxX9q","JKWYRWPmlx","h1zcHRmDcr","VjCZqsoy9t","FxX9qnlaBy",
+"8hJdtuLtKs","POUYSVBjhz","FcWrWlkMUA","IRh48pFrrl","BpYhVPb1pa","9rlg9GSQwj","TwanoOHaBz","o8UyduQIcz","ciuWzOHaBz","BCxeC4W0Tl",
+"rhl0JY1mC0","RACujlm0pD","o8UydydG8U","AgJHQX6Pin","HzZT80YAGH","CK5W7gf8rI","Yf2EcHzZT8","h1zcHRBhp0","pAhR1nlaBy","mX2GEeuZA5",
+"ksJbyWMiS3","SjskQDcpWB","Yw2oUdQ586","5NammogLgc","W3VFHFGzgp","ru4UGazIWp","KZamH64s8N","8U2nUpT8wu","U3yw5Qworu","0YAGH8cVD3",
+"TCgPpd7vjM","yToGWZJTXH","X6Pin48cHL","HzZT8brhlQ","KsjRKK4GS8","NAFuwxciqp","k85AeQnJ1S","zQt6QeuZA5","In3NS0h1b1","uN6r3JRJQB",
+"FFDuiFVMxo","9y4lwuQIcz","kZANmzHF1q","dpe1vJKWYR","64s8NVLTy6","1j5L8Cfgr3","gIYvEAgJHQ","M6qcG580YD","ix74rVerEA","64s8NUvlv4",
+"7hyVvgdQsS","WDVWJAkKTk","9y4lwhYBCK","VBjhz1LB1L","MezSWblLA9","StlDJZhwG1","x3LDeiKqhr","0MR5XGv3Fq","QClRLGXdoH","FLsph8cVD3",
+"C2IrcP6bcg","NAFuwPb1pa","mX2GEiKqhr","uvf7AGWqqX","SWfouy94nw","LbRTHEdBKc","pmeCdix74r","Waim6pWiOs","FNYIMMGlTF","C2IrcfaHir",
+"0ao3lEOE1o","aL6AJCdyBV","2ZHdkYh1hF","hUTw7CIShG","M3zXLSs0Zu","jS1ajYjB9t","GWqqXVNCPd","Yf2EcFcWrW","0BmCytaOXK","Q6hMCMm8si",
+"RsQUq8TxD7","FLsph9iGoT","BGaQYJRJQB","QssNC5Drn0","k85AeW3VFH","SWfoujS1aj","cQOnvDQimp","pAhR1rz7Ut","zmLYDjtn0X","iB08lazIWp",
+"d85a948cHL","xXTI4VjCZq","8hJdtP6bcg","pT8wuDG4sT","hSSvQ4QMc9","cmXIXQClRL","Vprf2ciuWz","16lHctAOsr","CxVEfTa8f6","yluBxVBjhz",
+"lj07QNOHsz","FcWrWGWqqX","Uvlv4uN6r3","soy9tB3qem","JkzUn5Mg9r","2hEEUcShY2","WPmlxogLgc","WMiS3lm0pD","t59lRhe9IA","ZuDtD4dEz6",
+"IRh48QbxXc","TCgPpCdyBV","Pb1paxXTI4","cShY2BCxeC","lweGyGWqqX","Q6hMC4W0Tl","0ao3ltjQxs","IRh48TXQ0Z","QssNCqQxHP","jtn0XIjTwP",
+"a00b5QssNC","8U2nU4QMc9","NOHszv8yFN","5NammzQt6Q","RmDcry94nw","StlDJCxVEf","uQIczFPfSE","mz8gxNcICA","dpe1vLewvM","FLsphNxx9V",
+"ogLgcZzJHW","dmoS7S77LH","7lUXZyEfy9","uoStwXflUq","J2mQi64s8N","ogLgclweGy","Nxx9VHfyNQ","FxX9qWmadA","okgRiU3yw5","wDajXXflUq",
+"RzaZAZv7z0","Cfgr3mz8gx","aez9yk85Ae","kB5nPAOgEe","hSSvQ9y4lw","iwzGkZ4I1v","4W0Tllm0pD","9rlg9Yh1hF","pT8wuIjTwP","Cfgr3TXQ0Z",
+"6q6L9hi5X7","CK5W7AXpwE","2ZHdk7Ow5C","soy9tYw2oU","D6rByzmLYD","GSQwjuvf7A","MezSWRxrsm","5nmWvd7vjM","IRh48YOfrY","5Mg9rDcpWB",
+"zFgtBdQ586","tuDySMojnP","5VZjSVIlwP","YjB9t1v5hH","GWqqXxciqp","JkzUnDz1R3","xReecVprf2","S77LHjeskS","UlU3MRBhp0","Kr8ysJIqXi",
+"fLNg8sqVrf","bZLvSjSjS3","MK07Yb29RJ","nlaByCp3mZ","FcWrWZuDtD","tl72WYw2oU","SWfoulpF6W","MGlTFC2Irc","0BmCyt59lR","pvgjS4W0Tl",
+"M6qcGy94nw","8hJdt1v5hH","BbwgAyEfy9","0MR5XdQ586","zQt6QtjQxs","IBe8kIBe8k","FFDuiSbRYy","QChxsNOHsz","vLsmSUmaEv","ulk41pmeCd",
+"7Ow5Catef2","tvdkDuTacx","gf8rIChuy3","ulk41ReKEW","tvdkDjzUqR","NOHszYjB9t","hi5X7atef2","nnP8oAIYUu","14FLRChuy3","3weIFNhXdu",
+"QYxC055rfB","FhtglyofH3","sx5GllpF6W","C2IrcIRh48","qaofNWmadA","UlU3MzY1GY","9eoRcIRh48","MmsIo8cVD3","hYBCK7hyVv","M3zXLhYBCK",
+"2DREskB5nP","nnP8oatef2","GSQwjZuDtD","soy9ts93Ml","U3yw5IKxdL","uLtKscmXIX","8xEKzVjCZq","5Drn0Q6hMC","GXdoHKZamH","lj07QChuy3",
+"jiVBPHlUbF","CqqaDMojnP","JkzUnuJScX","29QAzBbwgA","9iGoTb29RJ","ZzJHWK20wK","Z4I1v6q6L9","uAWypPYBf4","xReecBFkb8","iwzGkD6rBy",
+"DQimpmz8gx","ZuDtD8cVD3","iwzGkuZPqg","hYBCKhYBCK","xXTI4DcpWB","n8pJ9gdQsS","FnPFBguMb8","JJs5mhYBCK","fcwDaMm8si","JIqXi2Nslm",
+"Uvlv4IjTwP","QssNCEOE1o","t98iWiwzGk","JXljW29QAz","uN6r3s4786","YOfrYMGlTF","M3zXLksJby","AOgEeQWxoT","W7cTspvgjS","uAWypksJby",
+"HRxd8FLsph","BCxeC580YD","fqypyStlDJ","HlUbF1j5L8","M6qcGtl72W","2DREspT8wu","gIYvEAmdQd","k85Ael83Ud","8U2nUQYxC0","cmXIXTa8f6",
+"zQt6Qzz4ZU","RBhp0Zv7z0","14FLRfLNg8","7fKYUQ6hMC","kZANmCK5W7","DG4sTpT8wu","d85a9faHir","ni2v1pv0i7","he9IAJXljW","W7cTswDajX",
+"IRh4807n1c","aez9yRxrsm","9rlg95Mg9r","bZLvSlkMUA","FNYIMDz1R3","Vprf214FLR","lpF6WyluBx","Z4I1vlViBv","BFkb8U3yw5","jfREuQClRL",
+"jtn0XSjskQ","Uvlv4QbxXc","Uvlv4NOHsz","QbxXc7Ow5C","yvOMIsuY4x","AXpwEtuDyS","zmLYD8RCUA","BFkb8m4bxU","uPX7GuAWyp","FjHXRWPmlx",
+"Uvlv4D6rBy","No0QbCK5W7","NcICAazIWp","RBhp04QMc9","FVMxofcwDa","taOXK6q6L9","l83UdpiJSk","FLsph8xEKz","dQ5867fsYM","Cfgr3P6bcg",
+"KASQ8W3VFH","xXTI4t59lR","cmXIXU3yw5","yEfy9ECMvU","xReecsqVrf","BCxeC64s8N","MGlTF0BmCy","n1pmO1LB1L","HP4339y4lw","SWfouDQimp",
+"lkMUARACuj","RkQkewiHrZ","1v5hHfLNg8","14FLRwiHrZ","pWiOsAXpwE","Ta8f6JJs5m","zQt6Qsoy9t","Kr8ysPb1pa","pWiOsMK07Y","tjQxsQssNC",
+"LbRTHK4GS8","VerEAoGu6x","jfREu5VZjS","OUqFMe6e4z","FGzgpBbwgA","ksJbyksJby","RpBQmSmGzv","HP433ECMvU","i7WMQOUYuF","ZhwG1TXQ0Z",
+"2DREslViBv","JJs5mSjskQ","16lHc7Ow5C","cQOnvJKWYR","SmGzvTwano","EdBKcoVQp6","1LB1Luupzk","FVMxoo8Uyd","ZhwG1ru4UG","MmsIouLtKs",
+"SmGzvatef2","Cp3mZxciqp","DcpWBYjB9t","StlDJzY1GY","lm0pDEdBKc","2Yz7EFLsph","wiHrZPb1pa","0PktI5Mg9r","SbRYyFhtgl","FPfSE1v5hH",
+"ZhwG10h1b1","FGzgpHRxd8","pvgjSh1zcH","QChxsB3qem","rz7UtGXdoH","bZLvSi3pyd","aDGtSni2v1","WreyPFVMxo","iqv4kHRxd8","K4GS8RBhp0",
+"kZANmTwano","qQxHP1LB1L","K4GS8Oz8yZ","JKWYRkB5nP","IjTwPVerEA","lpF6WMK07Y","XflUqS2Dfu","QWxoTWmadA","Kr8ysL7cGc","lsQGoZUnqt",
+"gf8rIRmDcr","RsQUq5IhmG","k85AeWDVWJ","MmKGJcQOnv","DG4sTv1Hln","MGlTFHzZT8","blLA9ECMvU","580YD1j5L8","4W0TlVIlwP","Ss0ZuyEfy9",
+"AXpwEy94nw","tAOsr7fKYU","P6bcgMmsIo","J2mQiIRh48","8TxD7LbRTH","FcWrWzz4ZU","lkMUAsqVrf","RkQkeCK5W7","9iGoT6q6L9","tvdkDChuy3",
+"azIWpHzZT8","aDGtSZhwG1","jfREulXFOB","No0QbJJs5m","VIlwPAXpwE","yEfy9cShY2","Ul4a1TXQ0Z","KZamH7fKYU","8xEKz24ARF","dQ586BbwgA",
+"NOHszuvf7A","cQOnvni2v1","NAFuwDz1R3","5Mg9rksJby","s4786EOE1o","CxVEf0PktI","ZzJHWuTacx","OUYuFvOqCE","SmGzvQYxC0","tuDyS0MR5X",
+"lsQGoRmDcr","OHaBzpmeCd","55rfB2TRI7","yToGWM6qcG","xReecSs0Zu","9y4lw55rfB","DLhzMNxx9V","K4GS8FLsph","jiVBPTCgPp","uJScXtvdkD",
+"wDajXJXljW","nlaByjfREu","AmdQdWMiS3","P6bcgZ4I1v","OxWIHYjB9t","ydG8UMK07Y","BGaQYFxX9q","55rfB0BmCy","soy9tuAWyp","W7cTsxReec",
+"rhl0JzqH0W","48cHLTCgPp","EOE1oOUqFM","wiHrZZv7z0","QYxC0Mm8si","cQOnvQChxs","CIShG6AFT0","FVMxoNhXdu","K20wKx3LDe","uAWypFcWrW",
+"hUTw7NhXdu","zY1GYPOUYS","Y1mC0MaJQs","Kr8ysn8pJ9","IjTwPAmdQd","TXQ0ZuoStw","rz7UtEoToP","2DREsBFkb8","fmIK1zQt6Q","o8UydhE1Ql",
+"VNCPdnnP8o","i7WMQlm0pD","Z4I1vlpF6W","FVMxoMkgy8","pv0i7QbxXc","6q6L9BpYhV","jfREueuZA5","QnJ1S64s8N","16lHcnlaBy","0KyfsEdBKc",
+"8xEKzgf8rI","MmKGJBGaQY","Mm8sitAOsr","KASQ87fsYM","ZuDtD2DREs","Y1mC0PYBf4","4QMc9Oz8yZ","tAOsr8FmFH","Mm8si4QMc9","OxWIH24ARF",
+"PYBf4lH1kt","m4bxU7ku1p","Twano7X3uy","ZzJHWCqqaD","yvOMIhe9IA","gf8rIpAhR1","zY1GYSjskQ","JIqXi7ku1p","lkMUAChuy3","xReecpmeCd",
+"618DiOUYuF","tlILtMkgy8","NOHszW3VFH","ulk418cVD3","e6e4ztuDyS","lXFOBRACuj","FPfSEi3pyd","dhSuHfcwDa","QClRLBGaQY","djsrvjtn0X",
+"i7WMQ0PktI","8hJdtpv0i7","IBe8kqUJMd","lweGyVerEA","5iGN5piJSk","Cp3mZsoy9t","iKqhrVIlwP","07n1c5Mg9r","TXQ0ZK4GS8","Vprf2yToGW",
+"GrDg7CdyBV","Zv7z0FPfSE","IBe8kZhwG1","uvf7ADz1R3","Zv7z0Dz1R3","QnJ1SguMb8","JkzUnpAhR1","KZamHQClRL","Pb1paZJTXH","ru4UG3weIF",
+"Q6LixjSjS3","iKqhrZ4I1v","618Di24ARF","RsQUq0YAGH","SWfougdQsS","CNHmvtAOsr","VNCPdAIYUu","W3VFH5drc6","6q6L9FLsph","RBhp0jSjS3",
+"zmLYD7hyVv","CNHmvvkCHH","rz7UtPYBf4","iB08lSbRYy","Oz8yZuZPqg","lpF6W8FmFH","Q6hMCIBe8k","45cIHlsQGo","FLsph29QAz","2hEEUhYBCK",
+"iKqhr0BmCy","SjskQOUqFM","ix74rBpYhV","k85Aei7WMQ","XyPZNsqVrf","tl72WYOfrY","zY1GYUl4a1","DcpWBMK07Y","WmadAm4bxU","lCMxyv2eC3",
+"TCgPpSbRYy","jeskS8U2nU","k85Aexciqp","tAOsrYOfrY","5ZaEzYf2Ec","uJScXpFrrl","QbxXcK4GS8","Kr8ystjQxs","5iGN5KZamH","hE1QlReKEW",
+"WPmlxyofH3","24ARF8RCUA","tvdkDjS1aj","cQOnv45cIH","5drc6Ta8f6","2Yz7EC2Irc","Z4I1vMmsIo","Kr8ysnlaBy","ReKEWfLNg8","9iGoTJ2mQi",
+"IKxdLFGzgp","S77LHqUJMd","BFkb8KsjRK","WmadAjfREu","GWqqXDG4sT","soy9tCNHmv","DG4sTMkgy8","M3zXLtvdkD","lCMxyDz1R3","Kr8ysyvOMI",
+"cShY2fqypy","M6qcGKsjRK","cShY2Mkgy8","fFDrJKr8ys","8cVD3bgJAz","v1Hln5iGN5","yToGWJJs5m","O3iyQuLtKs","6q6L9d7vjM","oQ87rMezSW",
+"nlaBycmXIX","lweGy0PktI","0MR5XyofH3","JJs5mmX2GE","W7cTsQClRL","FFDuiOUqFM","d7vjMlViBv","W3VFHuvf7A","rKDLJvOqCE","VIlwPMaJQs",
+"aDGtSaL6AJ","blLA90YAGH","KZamHHlUbF","24ARFhYBCK","zz4ZUWaim6","CdyBVFwEJz","MaJQsv2eC3","ogLgcXyPZN","uAWypd85a9","taOXKDz1R3",
+"48cHL7fKYU","tAOsrEOE1o","UlU3Md85a9","oGu6x2ZHdk","Cfgr3ogLgc","VBjhzlkMUA","QYxC0CdyBV","FcWrWOUqFM","jtn0XThjNn","POUYSsuY4x",
+"PYBf4UmaEv","Y1mC0RsQUq","DG4sTiB08l","fcwDaKsjRK","ZzJHW9GXkX","M6qcGKr8ys","uN6r30Kyfs","mz8gx9rlg9","pWiOsTCgPp","5NammIKxdL",
+"zQt6QWPmlx","WaWsvECMvU","hSSvQxReec","Chuy3MGlTF","OxWIHCIShG","1v5hHMmsIo","jSjS3lkMUA","zqH0WuAWyp","jS1ajF6PT2","v1HlnlViBv",
+"5nmWvfaHir","IjTwPoQ87r","lViBvo8Uyd","MmKGJx3LDe","FNYIMZzJHW","rhl0Jrhl0J","x3LDey94nw","lViBvcQOnv","RzaZAFVMxo","Z4I1vt59lR",
+"QClRL1v5hH","BFkb80ao3l","NOHszVerEA","AOgEeBFkb8","W7cTsIn3NS","qQxHPd85a9","jfREuVLTy6","piJSkhE1Ql","vLsmSdhSuH","5nmWvzmLYD",
+"G1RhSyluBx","pFrrl8hJdt","yEfy9zHF1q","FcWrWpmeCd","pFrrl0YAGH","uLtKsbgJAz","PYBf4hE1Ql","7fsYMWMiS3","VIlwP6q6L9","L7cGctaOXK",
+"FjHXRy94nw","MmKGJAmdQd","ZUnqtyofH3","QnJ1S5Namm","QWxoTpWiOs","nlaByLbRTH","b29RJHRxd8","zmLYDi3pyd","m4bxUMm8si","cQOnvpT8wu",
+"dQ586X6Pin","t59lRQ6hMC","VBjhz5ZaEz","EOE1o9y4lw","hi5X7yvOMI","nnP8oGSQwj","8xEKz5drc6","RmDcrtjQxs","Yf2EcWaim6","lpF6WMkgy8",
+"KZamHuN6r3","QworuvOqCE","e6e4zfaHir","ciuWzTa8f6","7fsYMRpBQm","suY4xjfREu","CIShGYjB9t","MGlTFlkMUA","24ARFNo0Qb","y94nwIKxdL",
+"v2eC3ksJby","GSQwjzFgtB","5VZjSuZPqg","8cVD3kB5nP","YOfrYsoy9t","EOE1o4dEz6","VLTy6lViBv","55rfBBpYhV","FwEJzSmGzv","2TRI7y94nw",
+"t59lRM6qcG","hYBCKqaofN","oGu6xfcwDa","suY4xO3iyQ","8RCUALewvM","jS1aj8RCUA","K4GS8K20wK","GrDg7DLhzM","4QMc9GWqqX","AgJHQW3VFH",
+"Waim6BpYhV","hYBCK0MR5X","5VZjSYjB9t","Q6hMCs7Mxk","UmaEv5VZjS","wiHrZsqVrf","KASQ8e6e4z","faHirFnPFB","QChxsulk41","jSjS3CqqaD",
+"lXFOBM6qcG","sqVrf7lUXZ","tl72WcQOnv","1LB1LFGzgp","DQimpFLsph","580YDS77LH","ix74rHP433","WaWsvuLtKs","HzZT8rKDLJ","lXFOB2DREs",
+"cQOnvMojnP","3otm69GXkX","SmGzvhYBCK","SjskQvkCHH","2Yz7EGrDg7","8xEKzZuDtD","Pb1paDcpWB","blLA9k85Ae","FNYIMuvf7A","kB5nPCqqaD",
+"8TxD7iB08l","i7WMQiKqhr","kB5nPcQOnv","Q6hMCFPfSE","QnJ1S6AFT0","b29RJ24ARF","TXQ0ZlkMUA","wiHrZpT8wu","uJScXIBe8k","AkKTkqQxHP",
+"BFkb8fmIK1","EdBKcgtCA5","0ao3lBGaQY","ZJTXHsqVrf","8hJdt9eoRc","U3yw5FcWrW","fmIK1QYxC0","POUYSZJTXH","QClRLJXljW","jeskSoGu6x",
+"okgRiWDVWJ","GrDg7dQ586","IKxdLsuY4x","v1HlnD6rBy","vkCHHJkzUn","tvdkD8hJdt","tvdkDl83Ud","IjTwP3otm6","LDk6fblLA9","tjQxsMmKGJ",
+"vOqCEoVQp6","8RCUAnlaBy","AIYUuQnJ1S","7lUXZFxX9q","2NslmblLA9","s7MxkbrhlQ","uvf7AgtCA5","5NammGWqqX","AmdQdyofH3","uN6r3Twano",
+"tjQxsCK5W7","ni2v1faHir","zz4ZUpWiOs","4W0TlRkQke","9GXkXB3qem","oGu6xMmsIo","0Wr5yaDGtS","O3iyQMojnP","faHirJKWYR","cmXIXv2eC3",
+"tAOsrzHF1q","CK5W7tl72W","WaWsv9GXkX","azIWpQClRL","7fsYMFPfSE","pFrrlt98iW","pmeCdokgRi","uJScXazIWp","guMb89XyT9","pvgjSM6qcG",
+"x3LDeS77LH","uAWyph1zcH","In3NSWMiS3","Q6hMClkMUA","JKWYRn1pmO","5Mg9rYf2Ec","lpF6WD6rBy","07n1cNAFuw","JRJQBydG8U","tl72WWMiS3",
+"yToGWmz8gx","ZUnqtP6bcg","4dEz67X3uy","CNHmvD6rBy","WaWsvEdBKc","StlDJhUTw7","FFDuiFNYIM","MaJQsFVMxo","ZhwG1OxWIH","YjB9t9rlg9",
+"Uvlv42Nslm","O3iyQs7Mxk","Cfgr3dpe1v","LDk6fK4GS8","kB5nPCNHmv","zFgtBRkQke","lweGyuLtKs","yToGW3weIF","fmIK1XyPZN","UlU3MGrDg7",
+"hYBCKVNCPd","i3pydkZANm","9eoRcfaHir","LbRTHvkCHH","HzZT8aDGtS","suY4xMojnP","BCxeC2Nslm","tAOsrjtn0X","S77LHzz4ZU","faHir48cHL",
+"d7vjMIn3NS","0BmCyCIShG","dmoS7vLsmS","DLhzMuJScX","U3yw5blLA9","uupzkl83Ud","0MR5XFcWrW","Cfgr33otm6","lkMUAMezSW","1v5hHWaim6",
+"64s8NprNT6","lm0pD5IhmG","RkQkeAkKTk","0MR5XksJby","iqv4kmz8gx","oVQp63otm6","K20wKxReec","Mkgy8No0Qb","5VZjSWPmlx","48cHLgdQsS",
+"soy9tFLsph","MmKGJPOUYS","9rlg9zFgtB","6AFT0MezSW","9y4lw8RCUA","VerEADcpWB","DcpWBOUqFM","d7vjMzqH0W","YOfrYm4bxU","jzUqRM3zXL",
+"2TRI70Kyfs","gIYvEb29RJ","uJScX8RCUA","7Ow5COz8yZ","CdyBVB3qem","e6e4zKASQ8","ZJTXH8RCUA","RBhp0pv0i7","sx5GlhYBCK","24ARFCqqaD",
+"BpYhVqUJMd","0ao3lW3VFH","EdBKcJKWYR","7X3uyhE1Ql","rz7Ut8hJdt","16lHc9XyT9","64s8NW7cTs","2Yz7EpAhR1","yvOMIFNYIM","iwzGkFcWrW",
+"KsjRKS77LH","hE1Ql8U2nU","Vprf2uAWyp","FGzgpgf8rI","EOE1opvgjS","RmDcrVIlwP","TXQ0ZfaHir","fqypyaL6AJ","t59lRHP433","a00b5FcWrW",
+"SjskQo8Uyd","Zv7z0RkQke","64s8Nlm0pD","ZuDtDgdQsS","2Yz7E9GXkX","Yw2oUiKqhr","UlU3MAIYUu","cShY2tjQxs","0ao3lYw2oU","d85a9ZuDtD",
+"RxrsmAIYUu","MK07YBpYhV","OHaBz8TxD7","qUJMdMm8si","Gv3FqgdQsS","16lHcWaim6","Mkgy8b29RJ","djsrvlXFOB","qUJMddjsrv","yToGWZzJHW",
+"oQ87rksJby","TXQ0Z0BmCy","dQ5860h1b1","Yf2EcjfREu","Yh1hFDLhzM","lXFOBEdBKc","yEfy9Yw2oU","tAOsriwzGk","ZuDtD5VZjS","uJScXZhwG1",
+"Waim6bgJAz","RzaZAaL6AJ","guMb86AFT0","JkzUnyofH3","atef2piJSk","TXQ0ZIKxdL","5IhmGOz8yZ","zbIYYQworu","VjCZqDz1R3","uJScXMK07Y",
+"B3qem4dEz6","5nmWvdhSuH","mX2GEnnP8o","Nxx9VjzUqR","NOHszS2Dfu","hYBCKuN6r3","1v5hHRACuj","FjHXRDz1R3","lm0pD7lUXZ","QYxC0lm0pD",
+"yToGW7fsYM","Pb1paFjHXR","QClRLWaWsv","8RCUANxx9V","8RCUAXflUq","CqqaD7hyVv","s4786m4bxU","FGzgpzz4ZU","Chuy3GXdoH","m4bxUdQ586",
+"d85a9gIYvE","yToGW6q6L9","uJScX5drc6","PYBf4pWiOs","WmadAAmdQd","FhtglLewvM","djsrvlH1kt","QssNCn8pJ9","nFqikECMvU","L7cGcVNCPd",
+"xReec8TxD7","6AFT0euZA5","ECMvUzz4ZU","MojnP0MR5X","taOXK5IhmG","xXTI4pT8wu","AIYUuLbRTH","GXdoHFxX9q","2DREsfLNg8","tuDySyEfy9",
+"ogLgcQYxC0","AgJHQ64s8N","JKWYRoGu6x","soy9to8Uyd","Y1mC0zHF1q","J2mQidjsrv","M6qcGdpe1v","Waim6CxVEf","zz4ZUzY1GY","5IhmGcShY2",
+"G1RhSRkQke","blLA945cIH","jiVBPgf8rI","OUqFMM3zXL","9GXkXni2v1","azIWpOHaBz","FNYIMQnJ1S","Ul4a12DREs","VBjhzzmLYD","Ss0ZuQ6hMC",
+"FhtglSjskQ","OUYuF4QMc9","BbwgApT8wu","ZzJHWsx5Gl","Vprf2fcJOy","Mkgy8MojnP","zz4ZUpAhR1","d7vjMlkMUA","HfyNQiqv4k","StlDJprNT6",
+"iB08lGv3Fq","1j5L8vLsmS","RkQke5drc6","oVQp6MmKGJ","LbRTH1v5hH","yofH3WaWsv","PYBf4aez9y","2Yz7Esoy9t","s7MxkAmdQd","zQt6QtlILt",
+"P6bcguupzk","v2eC3LewvM","7fsYMokgRi","gdQsSzz4ZU","NhXduuAWyp","Ta8f6taOXK","uupzkYf2Ec","JXljWJkzUn","MGlTFprNT6","rz7UtS2Dfu",
+"kZANmRpBQm","EdBKcQChxs","K20wKuPX7G","lCMxyru4UG","MGlTFuvf7A","HP433M6qcG","euZA5SmGzv","No0Qbxciqp","2TRI70ao3l","Mm8siDQimp",
+"SbRYyNcICA","azIWpi3pyd","xXTI45IhmG","WreyPEdBKc","NhXdulj07Q","4dEz6VerEA","KZamHy94nw","WDVWJ5Mg9r","nnP8oeuZA5","8TxD7taOXK",
+"Uvlv4Ul4a1","y94nw8FmFH","I7p2apT8wu","RBhp0MmsIo","uN6r3Cfgr3","QYxC0TCgPp","pv0i79y4lw","Y1mC0uAWyp","jtn0X5iGN5","QYxC0Yh1hF",
+"cL0aEWreyP","3otm6jSjS3","4W0TlIRh48","7hyVv29QAz","zQt6QFFDui","5drc6lXFOB","Oz8yZi3pyd","gf8rIPb1pa","zY1GY5Drn0","8xEKzD6rBy",
+"tlILtLbRTH","5nmWvUlU3M","29QAztvdkD","Dz1R3YOfrY","Ta8f6l83Ud","RxrsmZzJHW","b29RJJIqXi","s93Mlni2v1","0h1b1pAhR1","gf8rIciuWz",
+"pT8wu8hJdt","WmadAa00b5","vLsmSJXljW","2ZHdk5VZjS","QWxoTrhl0J","Cfgr3uZPqg","ni2v12DREs","BGaQYOUqFM","e6e4zsx5Gl","F6PT2jzUqR",
+"MmsIoTwano","jS1ajkB5nP","UmaEvThjNn","iqv4kZhwG1","ni2v1uAWyp","16lHcHzZT8","Ta8f6jiVBP","m4bxUCIShG","2Yz7Ejtn0X","qUJMdStlDJ",
+"iB08l16lHc","KsjRKnFqik","l83UduAWyp","LewvMd85a9","vOqCECfgr3","WDVWJCIShG","Vprf2wDajX","4QMc9yluBx","MK07YzQt6Q","MGlTFqUJMd",
+"SjskQlweGy","DLhzMzz4ZU","FwEJzrz7Ut","iKqhrAIYUu","5Mg9rCdyBV","NhXdub29RJ","FLsph2Nslm","Q6LixFFDui","3weIFe6e4z","lkMUAVIlwP",
+"618DiQworu","OxWIHy94nw","he9IA9XyT9","tvdkDTCgPp","FxX9qa00b5","WreyPK20wK","QChxsxciqp","SjskQVjCZq","6q6L9jtn0X","RBhp0TCgPp",
+"K20wKBpYhV","WDVWJRBhp0","0ao3lcShY2","6q6L9VNCPd","fcwDa3otm6","RsQUqFFDui","soy9tqaofN","RBhp0yofH3","lweGyguMb8","1j5L87ku1p",
+"uoStwLewvM","7fsYMyofH3","wiHrZix74r","FwEJzwiHrZ","JIqXiB3qem","ZUnqtJKWYR","NAFuwa00b5","2ZHdkZzJHW","xReecPOUYS","K20wKyToGW",
+"uZPqgBGaQY","AgJHQ0MR5X","Uvlv47lUXZ","4QMc9i3pyd","MmKGJ618Di","soy9tbgJAz","nnP8oTwano","0YAGHNo0Qb","J2mQiNhXdu","brhlQsx5Gl",
+"ru4UGZ4I1v","9y4lwtaOXK","MK07YD6rBy","azIWpoVQp6","rKDLJWDVWJ","XyPZNGXdoH","5NammLewvM","FGzgpyvOMI","RmDcrrKDLJ","Waim6K20wK",
+"AgJHQJJs5m","4dEz6o8Uyd","iqv4kIKxdL","CqqaDIjTwP","aL6AJAkKTk","KASQ82ZHdk","JKWYRcL0aE","ciuWzb29RJ","AIYUulj07Q","DcpWBzFgtB",
+"MK07YW3VFH","KsjRKIKxdL","POUYSjtn0X","WmadALbRTH","C2IrczQt6Q","qaofNk85Ae","NAFuwoVQp6","mX2GEdmoS7","8hJdtwDajX","4QMc9Fhtgl",
+"ru4UG07n1c","d7vjMx3LDe","ECMvUyEfy9","MmKGJZJTXH","iwzGkDz1R3","580YDhE1Ql","M3zXLhe9IA","tuDySHlUbF","4QMc9v1Hln","atef2tvdkD",
+"fqypyFwEJz","GWqqX9GXkX","uZPqgJIqXi","yvOMId7vjM","xciqpYjB9t","lH1ktMkgy8","i3pydVLTy6","C2IrcUmaEv","tAOsrzQt6Q","FhtglGSQwj",
+"B3qemStlDJ","XyPZNnFqik","4W0TlMmKGJ","Oz8yZhe9IA","DcpWBWreyP","K20wK7ku1p","8RCUAAkKTk","prNT6uN6r3","s7Mxklj07Q","AXpwEDQimp",
+"fmIK1qUJMd","J2mQiFjHXR","B3qemulk41","uPX7GM6qcG","uPX7GprNT6","VIlwP0PktI","5ZaEzWmadA","7fKYUG1RhS","zmLYDlViBv","AkKTkuTacx",
+"tjQxs4QMc9","BGaQYgtCA5","dQ586wDajX","U3yw5FwEJz","StlDJv2eC3","PYBf40Kyfs","mX2GEkZANm","In3NSStlDJ","CIShGlsQGo","qUJMdpFrrl",
+"jSjS3X6Pin","IKxdLLDk6f","8FmFHfcwDa","xciqpkB5nP","qUJMd2hEEU","1j5L8fqypy","uPX7GtuDyS","WPmlxAgJHQ","MezSWn1pmO","5drc6y94nw",
+"t59lRiwzGk","7fsYMFwEJz","8FmFHUvlv4","VerEAazIWp","m4bxUWDVWJ","VerEAFnPFB","P6bcg16lHc","AXpwE3weIF","5Drn0yToGW","Waim6VIlwP",
+"K20wKVerEA","3weIFMGlTF","OHaBzFFDui","JKWYRfcwDa","dQ586yvOMI","MK07Yatef2","bZLvSaDGtS","taOXKYw2oU","WMiS3AIYUu","iwzGkzqH0W",
+"Waim6Q6hMC","AgJHQn1pmO","NhXduuoStw","zY1GYVNCPd","7fKYUC2Irc","C2Irc618Di","Nxx9VuoStw","W7cTsv8yFN","fcwDaZhwG1","ZUnqty94nw",
+"suY4xSmGzv","MaJQsJJs5m","i3pydRpBQm","0MR5XK4GS8","uoStwFnPFB","UlU3MNo0Qb","nlaBy8cVD3","8RCUAjtn0X","StlDJa00b5","Q6LixMmKGJ",
+"TXQ0ZRBhp0","pWiOstuDyS","M6qcGM6qcG","2DREshi5X7","8RCUAPYBf4","WMiS3iB08l","v1HlnMmsIo","uupzkYw2oU","AXpwEJJs5m","uupzklweGy",
+"tl72Wgf8rI","lkMUADcpWB","kZANmIjTwP","ZzJHWogLgc","lH1ktqaofN","2DREs2Nslm","pvgjSOUqFM","yvOMIlViBv","pAhR1BGaQY","aFFssvOqCE",
+"FNYIMqUJMd","0KyfsMaJQs","2ZHdklsQGo","Q6LixGXdoH","yvOMIgjUTu","7Ow5CyofH3","lm0pDgIYvE","HRxd8NcICA","L7cGccQOnv","uoStwcQOnv",
+"soy9tru4UG","i7WMQFcWrW","v2eC3K4GS8","ReKEW2hEEU","GSQwjzHF1q","MaJQs2Yz7E","4dEz6GrDg7","U3yw5Rxrsm","yluBxyToGW","Ul4a15nmWv",
+"uLtKsZUnqt","5nmWvprNT6","gdQsSNo0Qb","FPfSEUvlv4","FGzgpydG8U","ni2v1Q6Lix","9XyT9NhXdu","ZUnqtuAWyp","Yf2EcZUnqt","nFqikatef2",
+"FnPFBZzJHW","DcpWBatef2","Ta8f69XyT9","NAFuwpT8wu","jiVBPLDk6f","RpBQmtvdkD","6q6L99rlg9","8cVD3L7cGc","B3qem6q6L9","Nxx9VzqH0W",
+"uLtKsRxrsm","yluBxb29RJ","48cHLcL0aE","uAWyp5IhmG","jS1aj7hyVv","2ZHdkfFDrJ","XyPZNBFkb8","zz4ZUhE1Ql","BpYhVZJTXH","8RCUAZUnqt",
+"n1pmOru4UG","3weIFRsQUq","s4786QChxs","e6e4zpFrrl","BbwgAlH1kt","yofH3zbIYY","Ss0Zulm0pD","Ss0ZuSs0Zu","WMiS3bgJAz","TCgPpQnJ1S",
+"MGlTFG1RhS","UmaEvcShY2","Dz1R31v5hH","tl72WHlUbF","WreyPAXpwE","FjHXRRmDcr","Mm8silweGy","8hJdtRBhp0","OUYuFvkCHH","d7vjMt59lR",
+"lH1ktMmsIo","0Wr5yWMiS3","StlDJkB5nP","uQIczSmGzv","RkQkeBGaQY","FcWrWD6rBy","MGlTFLbRTH","JJs5mRmDcr","5ZaEzMaJQs","a00b55IhmG",
+"4dEz6JRJQB","DQimpDLhzM","Cfgr3iB08l","jtn0XzqH0W","t98iWHRxd8","Mkgy8qaofN","HzZT8uQIcz","DLhzMix74r","l83UdOz8yZ","IBe8kgjUTu",
+"hi5X7Nxx9V","XflUqCIShG","yvOMINOHsz","iB08lAXpwE","a00b50PktI","0h1b1BFkb8","yToGWF6PT2","5drc6LDk6f","XyPZNjfREu","NhXduUl4a1",
+"MGlTF7X3uy","ydG8UtlILt","7X3uy8TxD7","fLNg8gdQsS","2Nslm9eoRc","uLtKsVNCPd","HzZT8YjB9t","i7WMQ5Namm","x3LDelm0pD","RBhp0n8pJ9",
+"14FLRMK07Y","VjCZqpT8wu","Z4I1vVNCPd","FwEJzlweGy","pWiOsk85Ae","ni2v1blLA9","14FLRGXdoH","8RCUA0MR5X","U3yw5wiHrZ","gdQsSSjskQ",
+"7X3uyCqqaD","oGu6xOHaBz","SjskQaDGtS","fqypyBpYhV","atef2gIYvE","NcICA9rlg9","RpBQmNAFuw","rKDLJ4W0Tl","qQxHPOxWIH","jzUqRnFqik",
+"4dEz6MezSW","8hJdtjzUqR","hUTw7NcICA","UlU3M7Ow5C","B3qem5nmWv","ReKEWaDGtS","Dz1R3MezSW","jS1ajo8Uyd","VjCZqJkzUn","8TxD7i7WMQ",
+"2ZHdkdmoS7","mX2GE48cHL","1LB1LprNT6","iB08lPOUYS","lXFOBXyPZN","24ARFWaim6","0Kyfsi7WMQ","ZuDtDzz4ZU","QYxC0WPmlx","M3zXLyluBx",
+"FwEJz4QMc9","NcICAB3qem","S2DfuQ6hMC","2ZHdktjQxs","k85AeSmGzv","NAFuwtaOXK","16lHco8Uyd","n1pmOW7cTs","jiVBPzHF1q","uTacxtaOXK",
+"Oz8yZC2Irc","mX2GE8U2nU","cQOnvMGlTF","JJs5mMmsIo","VerEAWPmlx","pv0i7In3NS","QworufaHir","ThjNnNxx9V","dhSuHUmaEv","UmaEvJ2mQi",
+"fFDrJ1j5L8","FNYIM07n1c","pAhR1SbRYy","aL6AJFVMxo","Yf2Eca00b5","ZJTXHl83Ud","hSSvQlpF6W","K4GS8WmadA","PYBf4BbwgA","mX2GEfqypy",
+"RsQUqZhwG1","nlaByRmDcr","7fsYM5Drn0","QClRLAkKTk","QbxXc5ZaEz","vkCHHEdBKc","fqypy9eoRc","Q6LixFGzgp","jzUqROUqFM","1j5L8LbRTH",
+"ZuDtD6q6L9","LbRTHUlU3M","KASQ8M3zXL","CNHmvCK5W7","Kr8ysKZamH","ksJbyO3iyQ","WDVWJCNHmv","8hJdtTa8f6","HP433cShY2","aez9y9eoRc",
+"KASQ87fKYU","8hJdthSSvQ","MojnPuPX7G","Mm8siZhwG1","yEfy9VjCZq","8U2nUuTacx","k85AeuZPqg","CNHmvs4786","oGu6xXyPZN","In3NSQYxC0",
+"BbwgAuoStw","8U2nUWreyP","X6Pini7WMQ","wDajXjzUqR","VLTy6s7Mxk","iwzGkvOqCE","ogLgcuJScX","HlUbFKASQ8","LDk6ftl72W","Q6Lix7Ow5C",
+"suY4x4dEz6","uoStw16lHc","SbRYynnP8o","b29RJFhtgl","M6qcGY1mC0","LewvMRsQUq","OUYuFQChxs","HfyNQKASQ8","0h1b1ksJby","azIWpFLsph",
+"UmaEv7fKYU","07n1cSjskQ","NhXduOxWIH","U3yw5BpYhV","5Drn0qaofN","TwanoBFkb8","aL6AJjzUqR","okgRixXTI4","aez9yLDk6f","JJs5mAgJHQ",
+"C2IrcCK5W7","WDVWJKZamH","yofH3faHir","iqv4kMmKGJ","Yw2oUECMvU","ulk41fqypy","DLhzMZUnqt","S77LHFGzgp","QssNC48cHL","IRh48tl72W",
+"HfyNQgIYvE","vLsmSgtCA5","FPfSEvLsmS","pAhR12DREs","QworuReKEW","Q6LixqQxHP","yEfy9vOqCE","qUJMdrz7Ut","ydG8UZUnqt","5nmWvFFDui",
+"FNYIMcmXIX","v8yFNnlaBy","uupzk7fKYU","RACuj9iGoT","LbRTHAOgEe","Pb1paQYxC0","BbwgAatef2","POUYSgf8rI","8FmFHC2Irc","FjHXROUqFM",
+"CNHmvZhwG1","5Namm0Wr5y","55rfBL7cGc","HP4331j5L8","fcwDawiHrZ","BFkb8lXFOB","jzUqRCdyBV","qUJMduAWyp","QssNCpWiOs","n8pJ9xXTI4",
+"QYxC0aDGtS","zFgtBMaJQs","0MR5XRxrsm","DLhzMuLtKs","BbwgAmX2GE","s93MluLtKs","Y1mC0zbIYY","0KyfsJkzUn","euZA5e6e4z","piJSk9rlg9",
+"QChxsVNCPd","MaJQs8FmFH","KZamHNcICA","9rlg9Fhtgl","gjUTusqVrf","pWiOsv2eC3","lpF6W8RCUA","GXdoHuvf7A","k85AeQYxC0","K20wK55rfB",
+"zqH0WuZPqg","4W0TlvLsmS","NAFuwt98iW","U3yw5PYBf4","uJScXrKDLJ","W7cTs9y4lw","0ao3lVBjhz","hi5X7tuDyS","4dEz6TXQ0Z","OUqFMfqypy",
+"zmLYDWPmlx","suY4xlm0pD","wDajXdpe1v","o8UydkZANm","9eoRctaOXK","JJs5mC2Irc","he9IAhe9IA","5drc6blLA9","jSjS3WMiS3","pvgjSWMiS3",
+"blLA9EoToP","CIShGCp3mZ","RsQUqsqVrf","FxX9qYh1hF","8U2nUgtCA5","CK5W70YAGH","VjCZqRBhp0","zY1GY9GXkX","SjskQ7hyVv","hUTw7BFkb8",
+"2Yz7EKASQ8","oQ87rQ6Lix","VBjhzUl4a1","iKqhrY1mC0","cmXIXK20wK","D6rBy2Yz7E","Zv7z0BFkb8","WDVWJbgJAz","YjB9tEOE1o","4dEz6CxVEf",
+"VIlwPCxVEf","gtCA5piJSk","SjskQlViBv","atef2ix74r","Cfgr3aL6AJ","VjCZqX6Pin","580YDcQOnv","cQOnvyofH3","MGlTFlXFOB","s7MxkU3yw5",
+"fcwDaZzJHW","VNCPddmoS7","M3zXLjS1aj","oVQp6Zv7z0","9y4lwUl4a1","djsrvciuWz","CNHmvWreyP","FhtglWreyP","ni2v1cL0aE","EdBKcCfgr3",
+"W3VFHblLA9","guMb8RpBQm","5NammtlILt","AIYUuhYBCK","WreyPpmeCd","1v5hH0Wr5y","B3qemuupzk","oQ87rzY1GY","0ao3lMaJQs","580YDs93Ml",
+"G1RhS0Kyfs","0MR5XEoToP","EoToPStlDJ","wiHrZy94nw","fqypyMojnP","FjHXRuupzk","CdyBVCK5W7","55rfBNxx9V","faHir6AFT0","ydG8U8RCUA",
+"blLA9RpBQm","euZA5Qworu","5drc6yofH3","tuDySCqqaD","taOXKQ6hMC","07n1culk41","AXpwEOz8yZ","7ku1phi5X7","HRxd8RkQke","kZANm5VZjS",
+"P6bcgMmKGJ","kZANmRzaZA","cShY2SWfou","pFrrlECMvU","24ARFFVMxo","1v5hHRsQUq","O3iyQ7fsYM","MmKGJGv3Fq","fFDrJYOfrY","SmGzvuJScX",
+"nFqikFVMxo","TwanoCp3mZ","tAOsr7ku1p","NcICAmX2GE","BbwgAThjNn","Oz8yZjtn0X","Yh1hFvOqCE","taOXKIjTwP","m4bxUvOqCE","FGzgp9GXkX",
+"WDVWJZhwG1","2TRI7rKDLJ","RzaZAhi5X7","EOE1oBCxeC","uZPqgqUJMd","HlUbFCfgr3","GXdoHKASQ8","TCgPpfcwDa","qUJMdQ6hMC","Mm8si9XyT9",
+"lsQGoIKxdL","uQIczFwEJz","TwanopT8wu","9y4lwqQxHP","Gv3FqsqVrf","QbxXcRxrsm","ulk41SWfou","JKWYRFLsph","SmGzvThjNn","taOXKOz8yZ",
+"1j5L85Drn0","iwzGkEOE1o","FcWrWFxX9q","AIYUuQbxXc","dQ586NcICA","y94nwd85a9","n1pmOfmIK1","m4bxUogLgc","Y1mC0RkQke","LDk6fO3iyQ",
+"NcICAv1Hln","In3NSRsQUq","euZA5KASQ8","X6PinC2Irc","JRJQBtaOXK","FwEJzjS1aj","xciqpdhSuH","5Mg9rni2v1","45cIHuTacx","tAOsr9rlg9",
+"i7WMQBpYhV","tuDySzY1GY","F6PT2nnP8o","ogLgcpT8wu","RACujtl72W","SbRYyRkQke","vkCHHyToGW","ydG8UGv3Fq","lH1ktOxWIH","zbIYYv8yFN",
+"lCMxyQClRL","uPX7GgIYvE","lXFOBK20wK","h1zcHfFDrJ","LbRTHpAhR1","XflUq0Wr5y","0KyfsNo0Qb","LDk6fAIYUu","618DigjUTu","CK5W7zY1GY",
+"zz4ZUAgJHQ","qaofNuPX7G","29QAzNhXdu","7ku1puJScX","FFDui5Mg9r","oQ87rqaofN","M3zXLwDajX","uJScXdhSuH","VBjhzChuy3","OUYuFUvlv4",
+"iqv4kyEfy9","5NammlweGy","nFqikJXljW","OUqFM64s8N","MmsIoqaofN","64s8Ne6e4z","IjTwPFLsph","piJSkksJby","0Wr5yD6rBy","No0QbLewvM",
+"SWfouNhXdu","pAhR1wDajX","VerEA618Di","HfyNQQssNC","zY1GYJ2mQi","29QAzhUTw7","9iGoTh1zcH","qUJMddhSuH","Q6hMC07n1c","YOfrYECMvU",
+"K4GS8HzZT8","qQxHPoQ87r","VIlwPYOfrY","iB08lXflUq","jiVBP0BmCy","M3zXLgIYvE","U3yw5OUYuF","P6bcgGXdoH","Ul4a1pT8wu","nlaBys4786",
+"l83UdqQxHP","5VZjSyluBx","gtCA5xXTI4","7Ow5Cmz8gx","JKWYRYjB9t","CIShGix74r","piJSkPb1pa","Nxx9VPOUYS","CxVEfFxX9q","AXpwEbrhlQ",
+"JIqXiuvf7A","B3qem8hJdt","CqqaDeuZA5","iKqhrYf2Ec","ru4UGWDVWJ","8hJdtQnJ1S","AXpwEiqv4k","5ZaEzJXljW","0BmCyzFgtB","jzUqRfcwDa",
+"HfyNQxXTI4","zFgtB5nmWv","zqH0Wrhl0J","StlDJLbRTH","JRJQBHRxd8","TwanoqQxHP","SWfoukB5nP","dmoS7NAFuw","Fhtglix74r","AmdQdVBjhz",
+"iqv4ktl72W","tvdkDulk41","lpF6WfaHir","gf8rIAgJHQ","FnPFBjfREu","v1HlnHP433","U3yw5ksJby","ThjNnMm8si","vkCHHkB5nP","Ta8f6HlUbF",
+"5NammSs0Zu","hSSvQHP433","tlILtAmdQd","M6qcGnnP8o","b29RJuJScX","vkCHH48cHL","aez9yix74r","2ZHdkKr8ys","yofH3Zv7z0","uTacxSjskQ",
+"hYBCKVIlwP","BbwgApWiOs","LbRTHt98iW","07n1c5VZjS","TCgPpYw2oU","pT8wuaez9y","JJs5mIBe8k","Zv7z0soy9t","oGu6xFcWrW","nnP8oyvOMI",
+"29QAzVLTy6","faHircShY2","ZJTXH2Nslm","IRh48suY4x","S77LHjSjS3","Kr8ysZuDtD","gtCA5Yf2Ec","WPmlx4dEz6","ciuWz2hEEU","AmdQdQssNC",
+"4W0TlU3yw5","rKDLJ2DREs","tvdkDpT8wu","he9IAMojnP","lj07Q7X3uy","RsQUqOUYuF","cShY2K20wK","GWqqXtl72W","Zv7z0yToGW","RBhp0IjTwP",
+"djsrvokgRi","FPfSE16lHc","7fsYMF6PT2","gf8rIFNYIM","a00b5sqVrf","B3qemUl4a1","uoStwAgJHQ","jiVBP1LB1L","Z4I1vHfyNQ","tuDySFwEJz",
+"8U2nUFVMxo","ZJTXHfmIK1","oVQp6Twano","jS1aj8cVD3","hUTw7QbxXc","2hEEUsx5Gl","D6rByAOgEe","zQt6Quvf7A","NAFuws4786","lXFOB618Di",
+"5iGN5AOgEe","cQOnvFnPFB","FjHXRjSjS3","VNCPdv1Hln","ogLgc45cIH","8hJdtfcJOy","bgJAzs4786","IjTwPokgRi","qaofNRACuj","QssNCb29RJ",
+"WaWsvlweGy","4W0TlVjCZq","vkCHHoQ87r","JKWYRVerEA","7Ow5CuPX7G","Mm8sitlILt","9iGoTtAOsr","vkCHHFFDui","blLA9F6PT2","MaJQsnFqik",
+"Cp3mZ2Yz7E","Dz1R3FPfSE","WreyP2DREs","KsjRKK20wK","IRh48iKqhr","t98iWGSQwj","4QMc9ni2v1","GSQwjru4UG","qaofNru4UG","vOqCEFFDui",
+"kB5nPni2v1","v1HlnM6qcG","2hEEU1j5L8","SmGzvOUqFM","No0QbW7cTs","SWfouSbRYy","wiHrZnFqik","QWxoTOUqFM","gIYvEMGlTF","Oz8yZnnP8o",
+"FcWrW1LB1L","Kr8ystaOXK","24ARFRxrsm","fqypyhSSvQ","CdyBVSjskQ","0KyfsDLhzM","RzaZAfqypy","FGzgp8hJdt","atef2ZJTXH","lCMxyYw2oU",
+"hE1Ql9y4lw","jiVBPYw2oU","MaJQsCIShG","48cHLFVMxo","0h1b1uQIcz","zFgtBLbRTH","AgJHQMojnP","NhXdu0YAGH","IKxdL5drc6","ReKEWU3yw5",
+"ksJbyCK5W7","aFFssMK07Y","OHaBzpAhR1","lpF6Wm4bxU","uJScXQssNC","OUYuFpFrrl","5ZaEz6AFT0","he9IApmeCd","FhtglqQxHP","l83UdRpBQm",
+"ReKEWHlUbF","StlDJvkCHH","bgJAzy94nw","SWfouM3zXL","oQ87rIRh48","WaWsvIn3NS","lj07Q45cIH","580YD3otm6","8TxD77fKYU","RACujfFDrJ",
+"Y1mC0jiVBP","IBe8k2hEEU","W7cTsMkgy8","MK07Y9rlg9","FhtglIBe8k","cShY20BmCy","7ku1pnlaBy","5ZaEzPYBf4","i7WMQ0BmCy","Ul4a1b29RJ",
+"Uvlv4oGu6x","AXpwE5drc6","uoStwQClRL","y94nw29QAz","7X3uyBGaQY","Gv3FqfcwDa","gdQsSpmeCd","HfyNQ0ao3l","0KyfsDG4sT","uTacxSWfou",
+"aFFssi7WMQ","SWfouuAWyp","FNYIMi7WMQ","ZzJHWNAFuw","LDk6frhl0J","qUJMd7fsYM","FVMxoaL6AJ","wDajXReKEW","DQimpGSQwj","aDGtS45cIH",
+"pmeCdFPfSE","bZLvSuoStw","2DREsSs0Zu","2DREs5iGN5","JRJQBprNT6","9eoRc9y4lw","NcICAtl72W","QssNC1j5L8","lm0pDZJTXH","Yh1hFGXdoH",
+"tvdkDaL6AJ","Y1mC0LewvM","tlILtCqqaD","he9IAt59lR","sqVrfjtn0X","FNYIMfmIK1","Y1mC0d7vjM","M3zXLGWqqX","RsQUqoVQp6","v1HlngIYvE",
+"IjTwPxXTI4","pWiOsFnPFB","lsQGoIRh48","5drc6cmXIX","FwEJzFnPFB","RBhp0RsQUq","4QMc9sqVrf","HRxd8dhSuH","5drc6jtn0X","RkQkex3LDe",
+"pv0i71LB1L","9XyT9Yf2Ec","1v5hHMK07Y","i7WMQRACuj","gf8rIhUTw7","zQt6Q8U2nU","AXpwEYh1hF","GrDg7ZhwG1","5ZaEzi7WMQ","yToGW8xEKz",
+"Dz1R3rKDLJ","xXTI4In3NS","vLsmSNhXdu","HlUbFTXQ0Z","okgRiHP433","fqypylm0pD","5IhmGRkQke","KASQ8OHaBz","JkzUnQChxs","Waim6gIYvE",
+"fFDrJlm0pD","oVQp6wDajX","kB5nPK4GS8","M6qcGzY1GY","Cfgr3lH1kt","JIqXiIBe8k","7ku1pkZANm","ni2v1lH1kt","ZJTXHJ2mQi","Yf2EcGXdoH",
+"VerEAGv3Fq","Mkgy8i7WMQ","5VZjSaDGtS","lViBvJJs5m","NAFuwS2Dfu","m4bxUkZANm","9rlg9jiVBP","RmDcrC2Irc","tl72W0Kyfs","tlILt7fsYM",
+"zqH0WVNCPd","9rlg9VIlwP","zHF1q618Di","W3VFHksJby","Dz1R3FcWrW","lViBv5VZjS","vOqCEyvOMI","G1RhSLbRTH","HlUbFWDVWJ","s4786SbRYy",
+"jtn0XpFrrl","dhSuHv1Hln","0YAGHWreyP","16lHcPOUYS","7Ow5Ca00b5","RsQUqfaHir","Z4I1vZv7z0","kB5nPblLA9","FxX9qs4786","e6e4zcQOnv",
+"IKxdLWPmlx","K4GS8Yh1hF","8hJdtJXljW","W3VFHtvdkD","WMiS3gf8rI","WMiS35IhmG","euZA5CK5W7","OxWIHHfyNQ","8RCUAVprf2","Z4I1vFxX9q",
+"CK5W7fmIK1","YOfrYpT8wu","48cHLjeskS","QssNCoQ87r","B3qemBbwgA","1v5hHqQxHP","DcpWB64s8N","xReecix74r","WMiS3VBjhz","JJs5mzbIYY",
+"pvgjSJIqXi","tlILtlXFOB","zFgtByofH3","Gv3Fqlm0pD","fcJOyRzaZA","lViBvLewvM","guMb8HRxd8","JkzUnlweGy","7lUXZtaOXK","K20wKrhl0J",
+"fcwDaZUnqt","xReecLewvM","FnPFBvOqCE","WMiS37lUXZ","e6e4zm4bxU","y94nwRsQUq","yluBxUl4a1","m4bxUaDGtS","FVMxos4786","uLtKshe9IA",
+"2ZHdks7Mxk","48cHL45cIH","KsjRKU3yw5","GWqqXokgRi","QbxXctuDyS","lj07QU3yw5","9y4lwaL6AJ","MmsIoHP433","gtCA5CdyBV","Q6hMC0ao3l",
+"fcwDaG1RhS","hi5X7JXljW","IjTwPIn3NS","WaWsv2TRI7","JXljWfLNg8","Yw2oUtvdkD","gIYvEnlaBy","uAWyprKDLJ","Kr8ysNo0Qb","cL0aEcShY2",
+"HfyNQB3qem","xXTI4v8yFN","Yf2Ec4dEz6","9y4lwOxWIH","i3pydfcwDa","n1pmO0Wr5y","UmaEvvkCHH","9eoRcLDk6f","45cIHCqqaD","s93MlYf2Ec",
+"IBe8k7fKYU","Fhtgl0Kyfs","ksJbyiwzGk","RmDcrlViBv","M3zXL0Kyfs","5NammO3iyQ","FNYIM5drc6","5VZjSn8pJ9","y94nwDcpWB","PYBf4CqqaD",
+"fcJOyRkQke","bZLvSnnP8o","JKWYRU3yw5","ThjNnvLsmS","uJScXCIShG","1j5L8B3qem","Yf2EccmXIX","JkzUngtCA5","VLTy6FxX9q","HP433v2eC3",
+"2NslmyvOMI","fLNg8FnPFB","4W0TluQIcz","U3yw5uoStw","o8UydyluBx","zbIYYFwEJz","DG4sTHP433","zQt6Q7Ow5C","48cHLuvf7A","kZANm9iGoT",
+"RpBQmaFFss","B3qem9eoRc","uLtKslViBv","oVQp6BpYhV","SWfouCIShG","0Wr5ytl72W","0PktIx3LDe","yofH307n1c","euZA56AFT0","RsQUquupzk",
+"ZJTXHcmXIX","8cVD3pFrrl","LDk6ffmIK1","EdBKcChuy3","JkzUnNo0Qb","AXpwE5IhmG","hE1QlpmeCd","fcwDahE1Ql","tl72WprNT6","Uvlv45VZjS",
+"hUTw7prNT6","tvdkDoVQp6","OUqFMuvf7A","o8UydVprf2","SWfoupT8wu","RkQkeZ4I1v","s4786he9IA","pAhR18cVD3","Twanoix74r","P6bcgNo0Qb",
+"uvf7AFxX9q","uvf7AJIqXi","piJSklViBv","rz7Uts93Ml","TCgPp48cHL","NcICAFnPFB","iwzGkqUJMd","LbRTH9rlg9","7ku1patef2","I7p2azqH0W",
+"o8UydFnPFB","lj07QWaWsv","L7cGcYOfrY","EdBKchYBCK","4W0Tlsx5Gl","7X3uyhi5X7","kB5nPWPmlx","gf8rICqqaD","8hJdt48cHL","M3zXLWmadA",
+"CdyBVPOUYS","CK5W7okgRi","0YAGHbgJAz","sx5GlxXTI4","FcWrWlj07Q","CxVEfJIqXi","WreyPDLhzM","dmoS7dpe1v","taOXKNhXdu","NOHszguMb8",
+"yofH3Ul4a1","NcICAPb1pa","jSjS3uTacx","SmGzvNcICA","TXQ0Z7lUXZ","48cHLCfgr3","ThjNnJKWYR","euZA5rKDLJ","ThjNni7WMQ","dpe1vCqqaD",
+"iKqhrAgJHQ","NcICAlH1kt","14FLRRpBQm","soy9ta00b5","ThjNnzHF1q","oVQp61v5hH","OUqFMvLsmS","dhSuH8RCUA","JJs5mHP433","rz7UtL7cGc",
+"b29RJs7Mxk","uZPqgWaim6","uJScXbZLvS","8TxD7qUJMd","iwzGkuLtKs","7fKYUFhtgl","RsQUq5Drn0","W7cTslkMUA","jfREuyEfy9","CdyBVsoy9t",
+"pv0i7wDajX","Mm8siSbRYy","oVQp6B3qem","hE1QlTwano","t59lRdhSuH","s4786QbxXc","lpF6WGWqqX","v2eC3ni2v1","EoToPi7WMQ","dQ586MojnP",
+"CK5W77lUXZ","Yf2EclViBv","MGlTFUvlv4","7Ow5CP6bcg","fcwDazHF1q","D6rByZ4I1v","yvOMITXQ0Z","CNHmv6AFT0","9iGoTHlUbF","NOHszHfyNQ",
+"EoToPL7cGc","OxWIHQChxs","taOXKni2v1","mz8gxpWiOs","uAWypJKWYR","xReectAOsr","W7cTsZuDtD","48cHLJRJQB","FjHXR2ZHdk","1LB1LfmIK1",
+"2ZHdk0BmCy","QWxoT6AFT0","Yw2oUlkMUA","Uvlv4s7Mxk","nFqikoGu6x","FcWrWSbRYy","jSjS3Vprf2","atef2d85a9","ECMvUFPfSE","IKxdLlXFOB",
+"JKWYRjtn0X","8hJdt2TRI7","oQ87rgf8rI","JkzUnMK07Y","8FmFHQ6Lix","LewvM55rfB","guMb8Chuy3","5Drn0GrDg7","9rlg90YAGH","GrDg714FLR",
+"GSQwj3weIF","n8pJ9580YD","nlaByt98iW","2NslmXyPZN","yToGWlj07Q","NAFuw6AFT0","mX2GEQChxs","xReeclpF6W","suY4xFPfSE","AkKTk5iGN5",
+"Ta8f6AkKTk","jSjS3wiHrZ","8FmFHy94nw","5Drn00ao3l","XflUqMkgy8","TCgPp14FLR","9rlg97Ow5C","5iGN5euZA5","gjUTuFcWrW","S77LH8RCUA",
+"Ul4a1fcJOy","QworuS77LH","yvOMIuJScX","IKxdLNOHsz","Yw2oURpBQm","ZJTXH2hEEU","aL6AJ7ku1p","lH1ktoGu6x","QYxC0M6qcG","fcJOygf8rI",
+"DLhzMlpF6W","D6rBywiHrZ","VerEAReKEW","WreyPv8yFN","45cIHbZLvS","lXFOBjSjS3","PYBf4LbRTH","16lHcVjCZq","WDVWJdpe1v","nnP8oTa8f6",
+"Pb1pa4dEz6","K20wKZJTXH","yvOMIBFkb8","HP433HP433","FFDuigf8rI","FNYIMAIYUu","Zv7z0uvf7A","ECMvUCdyBV","WDVWJMmsIo","NOHszd7vjM",
+"hUTw7fLNg8","W3VFH2DREs","EdBKcbZLvS","5NammCNHmv","9y4lwaFFss","ix74rFNYIM","AgJHQuTacx","8hJdtjtn0X","QssNCMmsIo","HzZT8wiHrZ",
+"LewvMAgJHQ","FVMxo7lUXZ","x3LDepT8wu","AgJHQU3yw5","Yf2EcyvOMI","64s8NJkzUn","7fsYMuZPqg","rKDLJfcJOy","OUYuFDQimp","0ao3lKASQ8",
+"Gv3FqguMb8","2NslmS2Dfu","UlU3MYf2Ec","a00b5vOqCE","okgRiuQIcz","yofH3Fhtgl","M6qcGIn3NS","piJSkyEfy9","X6PinVBjhz","DQimpBFkb8",
+"FjHXRHP433","aL6AJdhSuH","uLtKsP6bcg","HzZT8Oz8yZ","RACujn8pJ9","cShY24W0Tl","0MR5Xd7vjM","KASQ8RACuj","MaJQs7lUXZ","Yf2Ech1zcH",
+"taOXKyofH3","nnP8oSmGzv","2DREs5Namm","UlU3MVprf2","KsjRK7X3uy","ZhwG1GrDg7","ogLgc4dEz6","8FmFHWPmlx","LewvMPYBf4","9GXkX6AFT0",
+"Zv7z0prNT6","tAOsrQClRL","oGu6xJRJQB","QYxC0AmdQd","DG4sTFVMxo","a00b5Rxrsm","8FmFHRmDcr","QbxXc9y4lw","7hyVv580YD","7lUXZQ6hMC",
+"he9IATwano","I7p2aECMvU","HRxd8ZUnqt","Q6hMCBGaQY","TXQ0Zv1Hln","qUJMdMaJQs","1v5hH5drc6","L7cGcuPX7G","pAhR1X6Pin","VIlwPFxX9q",
+"BCxeCt98iW","0PktIzqH0W","S2DfuDQimp","7Ow5C8TxD7","iB08l2hEEU","WDVWJLbRTH","O3iyQOxWIH","In3NSMkgy8","YjB9tAmdQd","IKxdLVNCPd",
+"h1zcH9y4lw","MGlTFaez9y","WaWsvydG8U","nFqikokgRi","zQt6QuQIcz","ulk41vLsmS","FLsphcShY2","OUYuFzqH0W","JRJQBYh1hF","CIShG4dEz6",
+"WmadATCgPp","fqypyNhXdu","SWfou07n1c","zz4ZUhYBCK","0PktIblLA9","CK5W7YOfrY","lXFOBHRxd8","JXljWjtn0X","BCxeCECMvU","oGu6x1j5L8",
+"FGzgpyofH3","bZLvS2ZHdk","i7WMQazIWp","m4bxUVNCPd","SmGzvgtCA5","prNT6y94nw","guMb8uupzk","2ZHdkzHF1q","CqqaD45cIH","Yh1hF0ao3l",
+"kB5nP16lHc","Dz1R3l83Ud","aFFssF6PT2","VjCZqoQ87r","mz8gx6q6L9","4W0Tl5Namm","24ARF7fKYU","e6e4zn1pmO","StlDJmz8gx","9rlg9djsrv",
+"SbRYyZJTXH","7X3uyfqypy","618DiP6bcg","zbIYYkB5nP","Ul4a1In3NS","m4bxUeuZA5","HfyNQNxx9V","uupzkWreyP","pvgjSxReec","oVQp6K20wK",
+"djsrvQWxoT","FjHXRZUnqt","2ZHdknlaBy","In3NSCdyBV","DcpWBe6e4z","hE1Ql8xEKz","ogLgc8TxD7","he9IAsuY4x","9XyT9pvgjS","zmLYD55rfB",
+"29QAzzHF1q","7lUXZuTacx","pv0i7J2mQi","uJScX7ku1p","9GXkXyToGW","t59lRTa8f6","HRxd8n1pmO","7Ow5CpWiOs","NhXduTwano","ZzJHWJJs5m",
+"RkQkeRkQke","rhl0JBCxeC","JXljW618Di","AmdQdJ2mQi","8TxD716lHc","EoToPKr8ys","Ul4a17X3uy","ni2v1ulk41","HlUbFIKxdL","QClRLatef2",
+"bZLvSb29RJ","sqVrfh1zcH","piJSkgdQsS","29QAzC2Irc","FNYIMFwEJz","GXdoHLewvM","KASQ8uTacx","D6rBykB5nP","lweGy64s8N","FwEJzZhwG1",
+"Cfgr3zbIYY","U3yw52hEEU","SjskQpvgjS","mX2GEHP433","2Yz7E5VZjS","ReKEWQChxs","QWxoTfLNg8","lm0pDAmdQd","v8yFNStlDJ","VIlwPgIYvE",
+"Mkgy8pAhR1","gdQsS5ZaEz","bZLvSKr8ys","jSjS3Cfgr3","atef28xEKz","yToGWQChxs","pAhR1NhXdu","bZLvSYh1hF","IRh48rhl0J","FjHXRKASQ8",
+"G1RhS2TRI7","MojnPzQt6Q","hUTw70h1b1","ECMvUECMvU","0MR5XcShY2","FjHXRPOUYS","GSQwjRzaZA","lsQGoNxx9V","GXdoHGWqqX","SWfouFPfSE",
+"QssNCpv0i7","7Ow5C5iGN5","aDGtS0YAGH","NOHszfLNg8","GXdoHP6bcg","RxrsmK4GS8","BGaQYuAWyp","CqqaDrz7Ut","29QAzuZPqg","ni2v1RmDcr",
+"ZzJHWhYBCK","K4GS8zQt6Q","gjUTuuQIcz","bZLvSh1zcH","FGzgpcShY2","I7p2aIRh48","pv0i7CdyBV","1LB1LMm8si","GSQwjnFqik","PYBf40YAGH",
+"lj07QtvdkD","ksJbyCfgr3","ulk417fsYM","uPX7GdQ586","DG4sTW7cTs","29QAzqQxHP","FwEJz55rfB","POUYS0ao3l","LewvMt59lR","WreyP4QMc9",
+"oGu6xzbIYY","45cIHtl72W","RsQUq7hyVv","MezSW8cVD3","qQxHPpmeCd","ru4UGtuDyS","14FLRyluBx","uQIczLbRTH","Nxx9V7ku1p","v8yFNjtn0X",
+"uvf7AUlU3M","MaJQsJ2mQi","jzUqRpmeCd","Ss0ZuFNYIM","FNYIML7cGc","yvOMIoGu6x","AIYUuTa8f6","64s8NjSjS3","uQIczVLTy6","LbRTHZhwG1",
+"t59lROUYuF","euZA5ReKEW","Yw2oUuTacx","Kr8ysWPmlx","SbRYyW3VFH","CxVEf7lUXZ","OUqFMMezSW","tjQxsXflUq","Nxx9VKsjRK","Q6LixCp3mZ",
+"Yh1hFZJTXH","cL0aERACuj","0MR5XVNCPd","zHF1qmX2GE","nnP8o9rlg9","hUTw7lXFOB","64s8Ns7Mxk","S2DfuQ6Lix","5drc6BbwgA","tuDySaL6AJ",
+"FGzgpD6rBy","HP4330BmCy","cQOnvYh1hF","uJScXMmsIo","k85AeJJs5m","oGu6xAkKTk","he9IAjSjS3","W3VFH5Mg9r","t59lRStlDJ","K20wKfmIK1",
+"5Drn0Rxrsm","RsQUqFxX9q","XyPZNW3VFH","lCMxyd85a9","RzaZAlpF6W","kZANmtAOsr","W3VFHOUqFM","16lHcrz7Ut","2Yz7EhUTw7","iwzGkt59lR",
+"9iGoThSSvQ","0ao3lFhtgl","d7vjMKASQ8","24ARFiwzGk","nlaBypiJSk","yvOMI8TxD7","ECMvUFLsph","a00b5IRh48","FVMxo6q6L9","fcJOyIn3NS",
+"WMiS3jtn0X","KASQ8o8Uyd","0Kyfst98iW","Nxx9VAkKTk","cQOnvm4bxU","wDajXOHaBz","fcwDaru4UG","b29RJogLgc","v8yFNogLgc","QnJ1S2TRI7",
+"MezSWtaOXK","nFqikRBhp0","P6bcglpF6W","4dEz6jtn0X","UmaEvqUJMd","djsrvWaim6","RsQUqUl4a1","t59lR9GXkX","uLtKsJ2mQi","Uvlv4lCMxy",
+"cmXIXfqypy","0YAGHlH1kt","iwzGkUlU3M","OHaBzbgJAz","dmoS7I7p2a","ZJTXH5Drn0","JKWYROxWIH","2ZHdkP6bcg","jfREus93Ml","he9IAwDajX",
+"v1HlnksJby","uQIczyToGW","wiHrZs7Mxk","YOfrYpAhR1","b29RJ9iGoT","OHaBz0BmCy","ciuWzfLNg8","dhSuHRmDcr","RxrsmChuy3","QChxsQ6hMC",
+"gtCA5FVMxo","uZPqgpFrrl","cQOnvpFrrl","Ta8f6NOHsz","iKqhrn1pmO","VerEAfmIK1","ZzJHWjeskS","9GXkX9rlg9","0h1b1yofH3","Zv7z014FLR",
+"G1RhSBpYhV","K20wKhYBCK","pT8wuFxX9q","KZamHQworu","KASQ864s8N","HlUbFHP433","rKDLJDG4sT","tlILt45cIH","JKWYRjS1aj","hYBCKYOfrY",
+"9eoRcfcJOy","FcWrWYh1hF","ZUnqtJXljW","qaofNBCxeC","nlaByHzZT8","ru4UGMkgy8","1j5L8MK07Y","In3NSn1pmO","HzZT8fqypy","oVQp6VerEA",
+"NOHszK20wK","nnP8oHlUbF","X6PintuDyS","W7cTsIKxdL","Q6LixxXTI4","nnP8oVjCZq","Pb1pai7WMQ","k85AeoVQp6","5IhmGMGlTF","4QMc9uZPqg",
+"W3VFH9rlg9","ksJbyt59lR","QChxsokgRi","ZJTXHv1Hln","GSQwjK4GS8","iqv4kC2Irc","DQimp64s8N","7X3uyOUqFM","7fsYMtaOXK","Cp3mZzbIYY",
+"JRJQBD6rBy","hE1QlokgRi","l83UdjzUqR","JJs5mZv7z0","dmoS7OUqFM","bZLvSGXdoH","5nmWv5iGN5","0BmCyVBjhz","xReeclH1kt","5Drn0TXQ0Z",
+"nFqikIBe8k","jtn0XSmGzv","uTacx16lHc","HP433kB5nP","FhtglyEfy9","e6e4zSWfou","WreyPnFqik","uupzkdjsrv","qQxHPVLTy6","W3VFH8hJdt",
+"kB5nPZ4I1v","I7p2aGrDg7","jSjS3Cp3mZ","VBjhzBFkb8","ogLgcW7cTs","tvdkDZv7z0","FwEJz580YD","jeskSciuWz","yluBxEoToP","FLsphpWiOs",
+"7Ow5CAmdQd","MmsIojSjS3","QbxXcs4786","uZPqguoStw","FNYIMStlDJ","2DREsyvOMI","prNT6jfREu","QYxC0No0Qb","Cfgr3ZJTXH","pWiOsVNCPd",
+"8hJdtChuy3","bZLvSlH1kt","Fhtglx3LDe","9eoRclsQGo","BFkb8pAhR1","Dz1R35VZjS","2TRI72Nslm","07n1cQChxs","Uvlv4P6bcg","AkKTkjSjS3",
+"ReKEWL7cGc","fmIK1bZLvS","AXpwEgdQsS","uTacxQworu","QChxszQt6Q","aL6AJKsjRK","K20wKWaWsv","rz7UtRxrsm","AgJHQFnPFB","guMb8KsjRK",
+"lkMUAyToGW","AIYUu8FmFH","jSjS3pWiOs","hi5X7SmGzv","GXdoHgjUTu","ogLgcS77LH","Uvlv4djsrv","nFqikXflUq","hi5X7oGu6x","Nxx9Vs4786",
+"aez9yn1pmO","GWqqXrz7Ut","ZhwG1aez9y","BGaQYkZANm","Q6hMCW3VFH","Yh1hFrKDLJ","M3zXLPOUYS","lCMxyOxWIH","0PktIMaJQs","a00b5vkCHH",
+"Oz8yZfqypy","hi5X7FwEJz","gtCA5ECMvU","5VZjS9XyT9","bgJAz5ZaEz","oQ87rMaJQs","yofH3SjskQ","KZamHEoToP","S2Dfufqypy","kZANm2Yz7E",
+"MGlTFgtCA5","0MR5Xdjsrv","4dEz6h1zcH","Kr8ysU3yw5","uZPqg0PktI","S2DfuzqH0W","OUYuFsx5Gl","QChxsRsQUq","7X3uyFNYIM","AXpwEhi5X7",
+"v2eC3b29RJ","DLhzM1v5hH","mX2GEWMiS3","iKqhr29QAz","Yw2oUP6bcg","iB08lMK07Y","hUTw75iGN5","d7vjM6q6L9","NAFuwStlDJ","AXpwE580YD",
+"RACujprNT6","Q6hMCSmGzv","dQ586MmKGJ","24ARFY1mC0","VIlwPLewvM","uN6r3Mkgy8","Cfgr3IBe8k","tjQxspWiOs","NOHszhe9IA","k85Aedjsrv",
+"nlaByxciqp","lj07QuLtKs","xReecatef2","VjCZqKsjRK","Yf2EclH1kt","hi5X7okgRi","AkKTkK20wK","7hyVvMmsIo","0YAGHatef2","POUYSfcwDa",
+"VBjhz64s8N","uPX7GFFDui","Yh1hFQbxXc","hE1QlyvOMI","uTacxBpYhV","CIShGyToGW","D6rByQClRL","2Yz7EcShY2","zHF1qgjUTu","W7cTsJkzUn",
+"16lHcIn3NS","JJs5mdQ586","gdQsSDQimp","BCxeCwDajX","t98iWvkCHH","gIYvEqQxHP","OUqFMguMb8","5iGN5lCMxy","GSQwjPYBf4","WreyPFcWrW",
+"GrDg7pT8wu","jfREuHRxd8","Qworu45cIH","YjB9tatef2","VNCPdBbwgA","s4786MmKGJ","lm0pDi3pyd","rKDLJjzUqR","YOfrYjSjS3","7X3uyTCgPp",
+"5ZaEzuvf7A","5ZaEzFhtgl","Mkgy8DLhzM","cQOnvTwano","POUYSAOgEe","okgRilweGy","LbRTHNxx9V","2TRI7lViBv","BCxeCuTacx","i3pydwiHrZ",
+"7lUXZHRxd8","Q6Lixv2eC3","hi5X72ZHdk","v1HlnC2Irc","prNT6WaWsv","BFkb8v1Hln","JIqXiF6PT2","lm0pDNhXdu","JXljWF6PT2","ThjNnIBe8k",
+"2TRI7Uvlv4","bgJAztjQxs","0Wr5yIn3NS","5ZaEzC2Irc","zbIYYPOUYS","jS1ajWaim6","atef22ZHdk","JJs5mtjQxs","s93Ml7fKYU","MK07Y0MR5X",
+"AOgEegIYvE","hE1QlRACuj","uTacxIKxdL","uJScXSWfou","ksJbyWDVWJ","jfREu9XyT9","FwEJzcmXIX","55rfBokgRi","uQIczNAFuw","TCgPpMaJQs",
+"ru4UGG1RhS","pT8wuzz4ZU","6AFT0pAhR1","8RCUAHlUbF","5VZjSJXljW","PYBf4Dz1R3","jfREuoVQp6","P6bcghSSvQ","QClRLI7p2a","5NammFVMxo",
+"In3NSGSQwj","0PktIt59lR","Yw2oU1v5hH","1v5hHVNCPd","JXljWK20wK","CK5W7Pb1pa","i7WMQgIYvE","EOE1oBGaQY","jeskSVjCZq","uAWypK4GS8",
+"yofH3QnJ1S","29QAz0PktI","rKDLJStlDJ","n1pmOM6qcG","lCMxyFcWrW","aFFss9eoRc","QnJ1SuAWyp","uLtKsdjsrv","7hyVvUmaEv","Y1mC0cQOnv",
+"3otm6xReec","3otm655rfB","HfyNQECMvU","Mm8siX6Pin","jiVBPi7WMQ","xReecfLNg8","IjTwPFFDui","Chuy3zz4ZU","pWiOskB5nP","PYBf45Namm",
+"d7vjMFhtgl","yEfy9QnJ1S","lsQGotjQxs","gtCA5dpe1v","VBjhzyEfy9","9y4lwkB5nP","1v5hHuupzk","7X3uyyToGW","5drc6RmDcr","DG4sTfFDrJ",
+"F6PT2iKqhr","QChxs5ZaEz","EOE1o618Di","AOgEedQ586","FNYIMdhSuH","bgJAz9XyT9","Cfgr3hi5X7","fqypy8RCUA","GrDg7AmdQd","L7cGcVLTy6",
+"BbwgAWaWsv","pmeCdLDk6f","hE1QlGrDg7","M6qcGEoToP","DQimpuupzk","POUYSRACuj","SbRYy55rfB","AXpwEogLgc","VerEAi3pyd","cShY2Ss0Zu",
+"a00b5RsQUq","a00b5piJSk","bgJAzcmXIX","5ZaEze6e4z","s4786L7cGc","5iGN5b29RJ","hi5X79rlg9","qaofNYOfrY","cL0aE07n1c","ix74rjiVBP",
+"NOHsz4QMc9","v1Hln0Wr5y","LbRTHGrDg7","l83UdRBhp0","WMiS32Nslm","AmdQdhYBCK","pWiOspT8wu","7X3uyUl4a1","FVMxov2eC3","2Yz7EEOE1o",
+"ydG8Uru4UG","QWxoTU3yw5","zHF1qix74r","jS1ajogLgc","vOqCESjskQ","pv0i7X6Pin","FPfSE5Namm","vLsmSL7cGc","soy9txciqp","pWiOs5iGN5",
+"FwEJzBpYhV","y94nwtaOXK","fcJOy8xEKz","EdBKc14FLR","5Mg9rRmDcr","FhtglzmLYD","v2eC3s4786","bZLvSmz8gx","wiHrZbrhlQ","JXljWIKxdL",
+"zHF1qzQt6Q","MGlTFW7cTs","EOE1ojzUqR","9iGoTx3LDe","tlILtCp3mZ","FcWrWpWiOs","CNHmvRBhp0","tjQxsFjHXR","Dz1R3IBe8k","VerEAQssNC",
+"nnP8oQ6Lix","CqqaDDQimp","U3yw5uQIcz","sx5Gl5VZjS","LbRTHcShY2","B3qemgjUTu","yluBxYf2Ec","Dz1R35Drn0","b29RJ7Ow5C","yvOMIM3zXL",
+"VBjhzCfgr3","mz8gxBpYhV","KASQ814FLR","FLsph5Namm","HfyNQRsQUq","n1pmONhXdu","QClRL580YD","QworupFrrl","Yf2Ec2DREs","5nmWvaez9y",
+"SbRYyAOgEe","FwEJzNhXdu","fcJOyrKDLJ","MezSWNAFuw","VNCPdWaWsv","iqv4kLDk6f","IRh48GrDg7","Rxrsm3otm6","k85AeRpBQm","K4GS8ZJTXH",
+"BCxeCBbwgA","m4bxUMmKGJ","zQt6QMojnP","8TxD7W3VFH","uoStwhSSvQ","K4GS855rfB","dQ586pT8wu","s93MlJJs5m","AOgEeJKWYR","5Mg9rsx5Gl",
+"s93MlSs0Zu","OxWIHVNCPd","ZuDtDokgRi","ZuDtDmz8gx","0Wr5yVerEA","t59lR0PktI","W7cTsNhXdu","55rfB3otm6","9y4lw7ku1p","FNYIMlm0pD",
+"MmsIoVLTy6","t98iWJKWYR","hi5X7v8yFN","FPfSEWPmlx","Mm8siS77LH","Vprf2MmKGJ","BGaQYK20wK","AmdQdhi5X7","QChxsYf2Ec","GXdoHKr8ys",
+"FjHXRJIqXi","ogLgc5VZjS","ReKEWyluBx","4dEz6ni2v1","bgJAzb29RJ","Yf2EcbZLvS","ogLgcQClRL","RzaZACNHmv","0YAGHZUnqt","WreyPb29RJ",
+"M3zXLd85a9","PYBf45Drn0","BpYhVAXpwE","jfREu1j5L8","pFrrls7Mxk","6AFT0IRh48","LewvM4QMc9","BpYhVEoToP","okgRiGSQwj","JRJQB48cHL",
+"lH1ktFnPFB","iqv4kNOHsz","YjB9tni2v1","NhXduCfgr3","B3qem7hyVv","FjHXRs4786","OxWIHrKDLJ","Cp3mZuQIcz","7lUXZAXpwE","kB5nPIn3NS",
+"s7Mxkxciqp","FNYIMUmaEv","GXdoHlpF6W","JIqXi2Yz7E","ogLgcWPmlx","v2eC3t59lR","RpBQmrz7Ut","ReKEWrz7Ut","BGaQYZzJHW","AkKTkzz4ZU",
+"OHaBzDQimp","1j5L8uPX7G","7X3uyqaofN","2NslmdQ586","xciqpjS1aj","pAhR18xEKz","jiVBPWaWsv","RsQUq2TRI7","cQOnvrhl0J","5VZjS8hJdt",
+"e6e4z8U2nU","FFDuia00b5","O3iyQciuWz","580YDMaJQs","CxVEfzz4ZU","5Drn0HlUbF","uupzkRzaZA","ogLgc9eoRc","ni2v1K4GS8","RzaZAFwEJz",
+"D6rByMmsIo","jiVBP7ku1p","MezSWuZPqg","i7WMQCdyBV","JIqXiCxVEf","v1HlnzbIYY","0ao3l7ku1p","580YDt98iW","DQimpy94nw","K4GS8ZuDtD",
+"XyPZNUmaEv","rhl0JSmGzv","VNCPd8cVD3","ECMvUIRh48","618DioVQp6","O3iyQvLsmS","2Yz7EiB08l","zbIYYsoy9t","pT8wu45cIH","v1HlntaOXK",
+"soy9t2DREs","RpBQmSWfou","soy9tMm8si","jzUqR580YD","lXFOBQnJ1S","zY1GYQWxoT","FLsphfFDrJ","DcpWBQYxC0","BCxeCCIShG","rz7UtFLsph",
+"FLsphAXpwE","RxrsmJXljW","J2mQiTCgPp","9iGoT7fsYM","VIlwPRACuj","8TxD7qQxHP","BpYhVrhl0J","SbRYyK4GS8","JKWYRhe9IA","guMb8atef2",
+"14FLRYw2oU","FLsphReKEW","soy9tlXFOB","LewvMGWqqX","zz4ZUlpF6W","SmGzvdjsrv","ZhwG1aDGtS","zbIYYDz1R3","9GXkXM6qcG","LDk6ft59lR",
+"5VZjSgtCA5","Yf2EcOUqFM","HRxd8fqypy","rhl0JDQimp","uJScX580YD","piJSkFFDui","d85a99eoRc","suY4xLbRTH","RsQUqG1RhS","jS1ajD6rBy",
+"yToGWv8yFN","yEfy9ZUnqt","EoToP4QMc9","lpF6WqUJMd","7fsYM8cVD3","MaJQsHfyNQ","b29RJ7fsYM","rz7UtjiVBP","8TxD77fsYM","VNCPdgtCA5",
+"fFDrJPYBf4","IjTwP2hEEU","16lHcTa8f6","CNHmvJRJQB","QChxsfcJOy","0YAGH5IhmG","KsjRK7hyVv","MGlTFydG8U","bgJAzcShY2","In3NS0PktI",
+"580YDyEfy9","brhlQlweGy","s93MlhE1Ql","ThjNncQOnv","PYBf4QssNC","x3LDeS2Dfu","16lHcoGu6x","No0QbFPfSE","oGu6xSbRYy","d7vjMiKqhr",
+"gtCA54W0Tl","Oz8yZs7Mxk","5drc6dpe1v","GWqqXEdBKc","sx5GlokgRi","64s8NqQxHP","iKqhrJXljW","6AFT0pFrrl","iwzGkqaofN","k85Aex3LDe",
+"ZUnqt7fsYM","MezSWP6bcg","aFFssbgJAz","blLA9ZzJHW","GWqqX7Ow5C","tvdkDBFkb8","wDajXS77LH","d7vjM4QMc9","yofH3B3qem","Vprf2gIYvE",
+"VerEAdQ586","Chuy3l83Ud","FGzgpTwano","F6PT2tl72W","lCMxyKZamH","C2Irc7fKYU","xciqp0h1b1","Uvlv4fqypy","2TRI7VLTy6","gtCA5ZJTXH",
+"xReecv8yFN","zQt6Qt98iW","brhlQVNCPd","MaJQsyluBx","0BmCyzmLYD","JXljWgIYvE","i3pydkB5nP","IjTwPzY1GY","MezSWFwEJz","Z4I1v24ARF",
+"RpBQmhe9IA","CqqaDKr8ys","GWqqX0YAGH","dpe1viB08l","POUYSK20wK","v8yFNVNCPd","S77LHAIYUu","OHaBzjzUqR","jSjS3vOqCE","jeskSgjUTu",
+"ThjNno8Uyd","jzUqR3otm6","07n1c9rlg9","3weIF2Yz7E","vOqCEyToGW","6AFT0NcICA","Nxx9Vt59lR","vOqCEl83Ud","C2Ircxciqp","RpBQmLDk6f",
+"ZhwG1mX2GE","OUqFMix74r","s93Ml8U2nU","QYxC0gIYvE","W7cTs7fsYM","s7Mxkni2v1","GWqqX0BmCy","rKDLJpiJSk","wiHrZkZANm","Uvlv4HlUbF",
+"iKqhrkZANm","Oz8yZHRxd8","CxVEfrz7Ut","MGlTFmz8gx","zHF1qa00b5","JJs5mcmXIX","oVQp6DQimp","EdBKc3weIF","QworuFnPFB","B3qemiKqhr",
+"0MR5XUvlv4","VBjhzxXTI4","8TxD748cHL","Cfgr3GSQwj","55rfBIn3NS","IjTwPhe9IA","ZJTXH5Mg9r","o8UydFVMxo","B3qem618Di","YOfrY2TRI7",
+"PYBf46q6L9","o8UydFxX9q","ReKEWwiHrZ","Nxx9V1j5L8","ZUnqthUTw7","i7WMQ1j5L8","1j5L8IBe8k","he9IAiwzGk","Ul4a1WDVWJ","aez9yaFFss",
+"Yw2oUdjsrv","x3LDe8hJdt","D6rByyToGW","4QMc9rhl0J","48cHLlkMUA","zqH0WyluBx","prNT6ni2v1","qaofNGWqqX","lViBvQworu","WMiS3cmXIX",
+"jzUqRy94nw","07n1cbrhlQ","dmoS7JXljW","J2mQiZuDtD","2Yz7E8RCUA","uLtKsM6qcG","1LB1LuPX7G","tlILtjeskS","AmdQdKZamH","9rlg97hyVv",
+"AkKTkGWqqX","WmadA8TxD7","zHF1quLtKs","aFFssECMvU","oVQp6GrDg7","mz8gx5Drn0","MaJQsdhSuH","soy9tfqypy","ZuDtDgf8rI","rz7Utt59lR",
+"2TRI7v8yFN","FhtgltuDyS","ThjNnZzJHW","3weIFIjTwP","FPfSEx3LDe","9GXkXlpF6W","hUTw7qUJMd","9y4lwZv7z0","ZJTXHReKEW","tuDySOUqFM",
+"4W0TlzHF1q","VerEAQYxC0","jtn0XfaHir","euZA5WPmlx","brhlQIRh48","S2DfuBCxeC","dhSuHFhtgl","ZzJHWuLtKs","JRJQBnFqik","WPmlxYh1hF",
+"fmIK1Yw2oU","NhXduReKEW","djsrvQ6hMC","lH1kt9iGoT","ix74rKASQ8","1j5L8L7cGc","BFkb8cShY2","iKqhriwzGk","v8yFNAmdQd","oVQp6lCMxy",
+"brhlQFnPFB","24ARFjSjS3","euZA57fsYM","TCgPp64s8N","CIShGVNCPd","lsQGosqVrf","EOE1ojeskS","zHF1qhYBCK","Cfgr3b29RJ","oVQp6Waim6",
+"xciqptvdkD","euZA5I7p2a","okgRitlILt","Zv7z0dmoS7","xXTI41j5L8","29QAz07n1c","LDk6ffFDrJ","okgRiMK07Y","Kr8ysRkQke","uLtKszY1GY",
+"5drc65nmWv","Ss0ZuAgJHQ","4dEz6J2mQi","45cIHEdBKc","bgJAzdmoS7","gjUTuOUqFM","D6rBytlILt","M3zXLuAWyp","WMiS3yEfy9","2Yz7EuQIcz",
+"L7cGcaL6AJ","FNYIMTwano","5Drn0xReec","FGzgp0MR5X","I7p2aQWxoT","AIYUuuupzk","fLNg8L7cGc","JkzUny94nw","M6qcGCNHmv","EOE1oEdBKc",
+"lj07QoVQp6","ZuDtDpiJSk","Ul4a10h1b1","MojnPL7cGc","Pb1paMaJQs","No0Qb5drc6","pvgjSHfyNQ","gdQsSyToGW","v2eC3vkCHH","9y4lwLewvM",
+"xciqpRkQke","JkzUnCdyBV","GSQwjEOE1o","zY1GYWPmlx","Q6LixTa8f6","jfREupiJSk","lViBvVprf2","OUqFMHzZT8","tjQxslj07Q","okgRiSmGzv",
+"qQxHPECMvU","QWxoTUvlv4","taOXKprNT6","iqv4k0h1b1","24ARFOxWIH","jeskSnFqik","5drc6TCgPp","taOXKFFDui","l83Udn1pmO","pvgjSoVQp6",
+"618Di7Ow5C","RpBQmDQimp","QbxXcNcICA","3otm6QbxXc","uN6r3rz7Ut","7fsYMtuDyS","MK07YhUTw7","4W0Tl7Ow5C","8U2nUazIWp","VLTy6lkMUA",
+"tjQxs5Namm","TXQ0Z8FmFH","yluBxfFDrJ","lm0pDCxVEf","0h1b1QssNC","Uvlv4RsQUq","xReec2Yz7E","tlILtECMvU","Z4I1vBFkb8","ZzJHWtl72W",
+"YjB9t5Namm","5IhmGbgJAz","iqv4kQClRL","HzZT8No0Qb","BpYhV7fKYU","DcpWBVjCZq","8hJdt9rlg9","MezSWt59lR","pWiOs0MR5X","OHaBzxXTI4",
+"P6bcg9GXkX","SWfouVIlwP","6AFT0L7cGc","XyPZNMGlTF","DQimpW3VFH","uTacxdmoS7","NcICAlj07Q","atef2Chuy3","1j5L8RsQUq","s93MlQssNC",
+"uZPqgk85Ae","xXTI4xciqp","SjskQNhXdu","No0QbfLNg8","uQIczlweGy","QYxC0Gv3Fq","fcJOytAOsr","gdQsSjzUqR","QssNCuAWyp","t98iWDz1R3",
+"B3qemyvOMI","blLA9RACuj","29QAzYOfrY","vOqCExXTI4","9XyT9F6PT2","Dz1R3C2Irc","nnP8oTXQ0Z","CK5W7Rxrsm","s7MxkStlDJ","Ss0ZuvLsmS",
+"QYxC0StlDJ","tAOsr29QAz","MmKGJVLTy6","VIlwP0Kyfs","qQxHPh1zcH","MezSW9GXkX","Zv7z0gtCA5","NhXduuvf7A","1v5hHUvlv4","Ta8f69eoRc",
+"lH1ktmX2GE","FxX9qv1Hln","pFrrlFwEJz","RACujOxWIH","IRh48jeskS","I7p2abZLvS","sx5GlnnP8o","l83UdlsQGo","Mkgy8soy9t","d85a90PktI",
+"AgJHQgf8rI","lCMxymz8gx","iwzGk2TRI7","6q6L9UmaEv","v1HlnJ2mQi","FLsphFcWrW","jzUqRSbRYy","3otm6iKqhr","Gv3FquPX7G","vLsmSFLsph",
+"QChxso8Uyd","dpe1vblLA9","24ARFlkMUA","5ZaEzhSSvQ","zz4ZULbRTH","zz4ZUfcJOy","cQOnvFxX9q","x3LDeprNT6","MaJQssx5Gl","sx5GlKZamH",
+"jzUqRuJScX","MezSWo8Uyd","6AFT0GrDg7","BpYhVYf2Ec","lCMxyAOgEe","wDajXFNYIM","W7cTsTXQ0Z","1v5hHkB5nP","KZamHW7cTs","QssNCm4bxU",
+"K20wKQWxoT","nFqikoQ87r","LDk6fOHaBz","JkzUnQ6Lix","uQIcz64s8N","fcJOyVerEA","JIqXi0Wr5y","0h1b1SWfou","No0QbtaOXK","pmeCd0PktI",
+"GrDg7kB5nP","cShY2MezSW","hi5X7DcpWB","3otm6FVMxo","SjskQJJs5m","U3yw58hJdt","lj07Q3weIF","RxrsmgdQsS","guMb8WaWsv","zmLYDKASQ8",
+"gjUTuGSQwj","n8pJ9B3qem","0ao3lnFqik","NcICA4QMc9","WmadA2DREs","s478648cHL","IRh483weIF","JRJQBksJby","v8yFNOUYuF","WreyPChuy3",
+"U3yw5TXQ0Z","bgJAziqv4k","qUJMd9rlg9","9eoRcD6rBy","FPfSEjzUqR","LbRTHBpYhV","nFqik5Drn0","VLTy6WreyP","8xEKzJRJQB","CIShGtuDyS",
+"rKDLJuN6r3","No0Qbs93Ml","QworuQssNC","0PktInlaBy","yluBxpiJSk","zHF1qMkgy8","Vprf2JkzUn","cQOnvKsjRK","7X3uy8RCUA","uJScXmX2GE",
+"taOXKmz8gx","yluBx9GXkX","HRxd8ix74r","FLsphhSSvQ","0h1b19y4lw","VjCZqMojnP","Fhtgl2hEEU","LewvMuQIcz","Dz1R3uLtKs","4W0TljSjS3",
+"tlILtWPmlx","rhl0JAmdQd","C2Irc5IhmG","ThjNnFxX9q","h1zcHBCxeC","jS1ajZhwG1","Zv7z0RsQUq","AOgEezbIYY","WaWsv0YAGH","tjQxs8FmFH",
+"xciqpFwEJz","AOgEejS1aj","618DiCIShG","1v5hHzQt6Q","4QMc9fcJOy","s4786X6Pin","Q6hMCM6qcG","FcWrWQssNC","ydG8UDQimp","HfyNQ14FLR",
+"5NammtvdkD","5iGN5s93Ml","iB08lEOE1o","ThjNn5Namm","MGlTFuZPqg","55rfByofH3","qUJMdtvdkD","8xEKzh1zcH","o8UydXyPZN","i7WMQFVMxo",
+"tAOsrl83Ud","xXTI4RsQUq","atef2EOE1o","JkzUn1v5hH","RBhp05IhmG","gf8rIFGzgp","OxWIH9GXkX","zFgtBS2Dfu","AgJHQ6q6L9","aFFss5iGN5",
+"QWxoTgf8rI","l83Ud9y4lw","vLsmSOHaBz","KsjRKpv0i7","BFkb8Oz8yZ","0MR5XW3VFH","5VZjS8xEKz","v2eC3ZJTXH","ydG8UeuZA5","BpYhVuAWyp",
+"POUYSCqqaD","7X3uy24ARF","JKWYR5drc6","AgJHQSs0Zu","1LB1LMmKGJ","ECMvU5iGN5","nFqikMojnP","Y1mC0NcICA","HlUbFzFgtB","5Mg9rOxWIH",
+"QworuZzJHW","AIYUudQ586","lsQGoJXljW","9GXkXaL6AJ","dQ586RmDcr","0PktIpFrrl","uvf7AIBe8k","0YAGHD6rBy","JXljWdmoS7","wDajXMmKGJ",
+"LDk6fxReec","B3qemqUJMd","oGu6xFLsph","FLsphh1zcH","zqH0WS77LH","BbwgARzaZA","iwzGkVLTy6","07n1caDGtS","8U2nU8FmFH","ru4UGrhl0J",
+"OUYuFBCxeC","Ss0Zu8TxD7","kZANmsuY4x","7fsYM24ARF","RpBQmwDajX","0BmCyLewvM","jfREuWMiS3","0MR5Xk85Ae","5iGN5Ul4a1","RsQUqjzUqR",
+"0h1b1he9IA","GWqqXOUqFM","WaWsvdhSuH","gIYvEtAOsr","ksJbyFGzgp","5nmWvlViBv","VjCZqgIYvE","zbIYYGXdoH","zQt6Qatef2","lm0pDfaHir",
+"Q6hMCLDk6f","s4786DLhzM","UlU3MprNT6","FFDuirKDLJ","aL6AJ618Di","fmIK1ulk41","JXljWqQxHP","Ul4a1EOE1o","dpe1vxReec","mX2GEgf8rI",
+"Pb1paGXdoH","CqqaDUl4a1","5Mg9rQnJ1S","xciqpuTacx","SbRYyQWxoT","lpF6WNo0Qb","7hyVvv8yFN","MaJQsTa8f6","i3pyd0MR5X","ReKEWpmeCd",
+"ReKEWWaim6","Yf2EcNxx9V","SmGzvUvlv4","S2Dfu2ZHdk","9GXkX0h1b1","l83UdVprf2","DcpWBiKqhr","tuDyS16lHc","uvf7ABFkb8","Kr8ysaFFss",
+"VjCZqJ2mQi","FhtglTCgPp","SWfouRxrsm","QClRLRkQke","RsQUqWDVWJ","s93MluZPqg","JIqXiFjHXR","fcwDaWDVWJ","okgRi24ARF","Gv3Fq7X3uy",
+"14FLRJRJQB","yofH3JJs5m","6q6L9LDk6f","t98iWRmDcr","StlDJG1RhS","gjUTudpe1v","uTacxlpF6W","JkzUnUl4a1","ThjNnWreyP","gIYvEKZamH",
+"NAFuw7fsYM","jeskSuZPqg","hUTw72TRI7","XflUqnlaBy","rhl0JNo0Qb","O3iyQSmGzv","I7p2aWaWsv","qaofNEOE1o","piJSkG1RhS","FxX9qiKqhr",
+"CIShGtl72W","AOgEeguMb8","Chuy3XflUq","X6PinQworu","M6qcGzbIYY","Nxx9VB3qem","zQt6Q0Wr5y","qUJMdiqv4k","hE1QlWPmlx","RzaZAe6e4z",
+"ksJbyThjNn","Z4I1v1j5L8","ru4UGDLhzM","W3VFHkZANm","Z4I1v2TRI7","5Drn0lsQGo","Ta8f6Vprf2","lpF6W8xEKz","dpe1vDLhzM","YOfrYRkQke",
+"Q6LixMezSW","v1Hlnatef2","ru4UGZhwG1","oVQp6M3zXL","pAhR1tlILt","hi5X7tlILt","0Wr5ybrhlQ","qQxHP9rlg9","x3LDeQnJ1S","qUJMdGXdoH",
+"Waim6DcpWB","RBhp0mX2GE","aL6AJWPmlx","uZPqg7fKYU","FxX9qQ6Lix","TXQ0Zb29RJ","soy9tTwano","aL6AJe6e4z","gIYvEjS1aj","aFFssiB08l",
+"Q6hMCCIShG","FhtgllViBv","OUqFM8hJdt","oGu6xBCxeC","8xEKz48cHL","6q6L95iGN5","S77LH1j5L8","vkCHHcmXIX","b29RJPOUYS","7lUXZVNCPd",
+"kZANmgf8rI","xciqpSs0Zu","NOHsz5VZjS","cL0aEv2eC3","7fsYMlCMxy","dQ586Vprf2","XyPZNuZPqg","QbxXcReKEW","vkCHHDG4sT","2Yz7EyToGW",
+"IBe8k8RCUA","16lHcBGaQY","ZuDtDqQxHP","M3zXL2ZHdk","jiVBPbgJAz","qQxHPk85Ae","2ZHdkKsjRK","Waim6VBjhz","7fKYULDk6f","CNHmvBCxeC",
+"8cVD3aDGtS","D6rByVjCZq","n1pmORpBQm","zmLYD618Di","bgJAzdQ586","HP433suY4x","ReKEWy94nw","2hEEUMezSW","GrDg7MezSW","iB08lTCgPp",
+"BbwgAqUJMd","64s8Nlj07Q","jfREuuPX7G","wiHrZuJScX","lkMUAlXFOB","QClRLy94nw","M3zXLNhXdu","8cVD3SbRYy","5nmWvlsQGo","zz4ZU618Di",
+"hE1QlvkCHH","7X3uyxReec","djsrvblLA9","yluBxHP433","cL0aE2Yz7E","mz8gxtAOsr","QWxoTQClRL","DcpWBC2Irc","4QMc9hYBCK","MaJQsAXpwE",
+"gjUTuVBjhz","QYxC0suY4x","IBe8kfFDrJ","ciuWzCxVEf","D6rByYf2Ec","m4bxUVLTy6","uupzk7lUXZ","Yh1hF8FmFH","4QMc924ARF","jSjS3PYBf4",
+"5Drn05iGN5","zmLYDSjskQ","K20wKciuWz","M6qcGs93Ml","y94nwfcJOy","HP433RsQUq","kZANm8U2nU","45cIHjS1aj","TCgPpzbIYY","xciqpIKxdL",
+"8cVD3yEfy9","C2Irc9eoRc","vkCHHFjHXR","kZANmxciqp","HfyNQeuZA5","FjHXRsqVrf","mz8gx07n1c","6AFT07X3uy","Waim6CIShG","qUJMdPOUYS",
+"MK07YeuZA5","oQ87r580YD","HP4336AFT0","v2eC3xReec","gIYvEzqH0W","ThjNn9XyT9","t59lRlCMxy","tuDySlsQGo","Ss0ZuaDGtS","uLtKsjS1aj",
+"BbwgAK20wK","VBjhzDcpWB","zHF1qfFDrJ","MmKGJBbwgA","VBjhzVIlwP","jzUqRzqH0W","lj07QlkMUA","gIYvECfgr3","Gv3FqoQ87r","aDGtSGXdoH",
+"x3LDezbIYY","pT8wuzbIYY","CdyBV0BmCy","MmsIoydG8U","Uvlv4aL6AJ","BpYhV2TRI7","aDGtStlILt","lViBvksJby","CNHmvi7WMQ","VNCPd7hyVv",
+"5drc63otm6","9eoRcNAFuw","HfyNQni2v1","ZhwG1DQimp","iwzGkgjUTu","FNYIM4dEz6","dQ586VNCPd","RkQkeK4GS8","uoStwW7cTs","8TxD7v1Hln",
+"5ZaEzfqypy","6AFT0fFDrJ","v1HlnpmeCd","5Mg9rWPmlx","6AFT0iKqhr","8RCUAWDVWJ","fqypyHP433","hE1QlDLhzM","FPfSETXQ0Z","6q6L93otm6",
+"07n1ccL0aE","Cfgr3y94nw","zbIYYEOE1o","Chuy3WaWsv","5NammMmKGJ","AOgEepWiOs","07n1cqQxHP","Nxx9VuJScX","RBhp0rhl0J","BGaQYEOE1o",
+"3otm6Dz1R3","WMiS31j5L8","C2IrcD6rBy","piJSkAmdQd","o8UydkB5nP","Ul4a1DG4sT","zmLYDNo0Qb","IBe8kogLgc","i3pydAOgEe","vOqCEOUYuF",
+"8RCUAS2Dfu","jiVBP07n1c","fcwDaokgRi","ru4UG64s8N","MezSWtvdkD","55rfBFcWrW","tvdkDWreyP","618DiazIWp","xXTI4DLhzM","5drc6tjQxs",
+"0Wr5y9y4lw","HzZT85Drn0","Gv3FqrKDLJ","pWiOscQOnv","No0Qb5nmWv","cQOnvgtCA5","RBhp0Ul4a1","jSjS3QssNC","HzZT8nFqik","FcWrWLDk6f",
+"HlUbFAXpwE","jfREu8U2nU","v1HlnXflUq","8xEKzMmKGJ","DcpWBsqVrf","v2eC3TCgPp","nnP8oix74r","UlU3MECMvU","S77LHy94nw","Ss0Zurz7Ut",
+"t59lRsqVrf","HfyNQZUnqt","soy9tn8pJ9","YjB9tRmDcr","uJScXHRxd8","JkzUnStlDJ","Vprf2uTacx","PYBf4lsQGo","okgRiuN6r3","s93MlZzJHW",
+"vLsmSRpBQm","FNYIMix74r","OHaBziqv4k","aL6AJRpBQm","J2mQiVIlwP","s4786euZA5","48cHLgIYvE","uupzkFcWrW","hi5X7piJSk","vLsmSW7cTs",
+"NcICAwDajX","tlILt8FmFH","YOfrYIKxdL","Mkgy86q6L9","faHirQ6hMC","ZJTXHVIlwP","oVQp6AkKTk","9y4lw45cIH","aL6AJ2TRI7","WPmlxsoy9t",
+"Mkgy8WMiS3","tuDyS7Ow5C","7fKYUyvOMI","U3yw5Cfgr3","JXljWFLsph","GXdoHY1mC0","aFFssFxX9q","OHaBzk85Ae","RmDcrX6Pin","2DREsogLgc",
+"7ku1plViBv","XflUqjiVBP","ZuDtDtvdkD","C2IrchE1Ql","azIWpTCgPp","rz7Ut9XyT9","IBe8ktuDyS","gf8rIsoy9t","ZhwG1GWqqX","gtCA5oVQp6",
+"IjTwPB3qem","StlDJF6PT2","bZLvS2Yz7E","VjCZqlpF6W","m4bxUgtCA5","nlaBy16lHc","rz7UtpT8wu","2hEEUDz1R3","jS1ajydG8U","YOfrYrz7Ut",
+"FVMxopT8wu","uZPqgoGu6x","cL0aE2ZHdk","WaWsvO3iyQ","lkMUAFxX9q","J2mQiS77LH","n8pJ9BbwgA","FNYIMoVQp6","Uvlv4BbwgA","oVQp645cIH",
+"soy9tBpYhV","L7cGcZzJHW","0BmCyXflUq","FwEJzMmKGJ","EoToP5Drn0","cmXIXfcJOy","ix74rdjsrv","7lUXZJKWYR","YOfrYF6PT2","pmeCdNhXdu",
+"rKDLJF6PT2","3weIFzmLYD","pT8wuuAWyp","tvdkDBpYhV","CxVEfwiHrZ","pFrrlzHF1q","n8pJ929QAz","ciuWzs4786","HfyNQmz8gx","K4GS8Waim6",
+"qQxHPBFkb8","FhtglksJby","uJScXD6rBy","CK5W7MK07Y","xXTI4QbxXc","LDk6fcmXIX","9y4lwRsQUq","pv0i70PktI","wDajXRxrsm","AkKTkZhwG1",
+"atef207n1c","suY4xhYBCK","djsrvyluBx","P6bcgOxWIH","DG4sTJ2mQi","9GXkXazIWp","CIShGqUJMd","fmIK12hEEU","AgJHQFhtgl","K20wKRzaZA",
+"EdBKcS77LH","Oz8yZQ6hMC","iwzGkazIWp","W7cTspAhR1","n1pmOrKDLJ","0BmCy9eoRc","2DREss93Ml","b29RJYjB9t","faHirvLsmS","Yw2oU4W0Tl",
+"ZJTXHUmaEv","zqH0Wy94nw","uoStwy94nw","GXdoHSWfou","2DREsX6Pin","PYBf4lpF6W","TCgPpfmIK1","uvf7Auvf7A","zY1GY8hJdt","FxX9qKr8ys",
+"WmadAxciqp","uPX7Gh1zcH","pAhR1DQimp","FcWrWguMb8","IjTwPMezSW","9eoRc5Drn0","ulk41VBjhz","X6PinVerEA","hi5X7WaWsv","OxWIHiKqhr",
+"UmaEvpWiOs","rhl0JgjUTu","QWxoTbgJAz","tAOsrWmadA","O3iyQMezSW","8FmFH2Yz7E","uQIczn1pmO","lkMUApv0i7","JIqXiBbwgA","ReKEWd85a9",
+"FhtglQbxXc","Zv7z0K4GS8","2ZHdk7ku1p","J2mQi0ao3l","NcICAFxX9q","uvf7AStlDJ","azIWpvkCHH","ksJbyFjHXR","guMb8FNYIM","BbwgAQ6hMC",
+"lpF6WksJby","AgJHQF6PT2","qaofNFhtgl","vLsmS5iGN5","RACuj6AFT0","RACujjSjS3","d85a9I7p2a","cQOnvzqH0W","9rlg9BCxeC","J2mQiWaim6",
+"hUTw7G1RhS","CNHmvpv0i7","BGaQYSmGzv","9iGoTL7cGc","zY1GYRzaZA","FnPFBnnP8o","7X3uyRsQUq","5drc6QnJ1S","tuDySSmGzv","MGlTF8hJdt",
+"nFqiklH1kt","aL6AJ8FmFH","uN6r3sx5Gl","0BmCy1v5hH","vOqCE7lUXZ","Cp3mZFjHXR","rz7UtvLsmS","e6e4zMGlTF","FVMxoblLA9","cQOnvmz8gx",
+"07n1cdQ586","HfyNQDcpWB","LbRTHaez9y","yofH32DREs","OHaBz5nmWv","prNT6aDGtS","F6PT2UmaEv","QYxC0AXpwE","YOfrYRzaZA","Zv7z055rfB",
+"m4bxUDQimp","WreyPNOHsz","Ss0ZuWMiS3","taOXKL7cGc","3otm6zY1GY","DQimpMkgy8","0h1b1brhlQ","rz7Ut6AFT0","a00b5Nxx9V","0YAGHtaOXK",
+"SmGzv9iGoT","QChxsF6PT2","aL6AJrhl0J","nlaBybZLvS","OxWIHMm8si","VjCZqpmeCd","TXQ0ZDcpWB","taOXKd85a9","FnPFBQ6hMC","Nxx9VtAOsr",
+"RBhp0BFkb8","JJs5mQChxs","Dz1R3P6bcg","C2Ircv8yFN","618DiblLA9","7hyVvQClRL","6AFT0ix74r","TXQ0ZlXFOB","7X3uynlaBy","No0QbcmXIX",
+"FNYIM5nmWv","ix74rblLA9","Mkgy82Yz7E","gIYvEtjQxs","aDGtSlkMUA","VjCZqqUJMd","FVMxoL7cGc","k85AeBCxeC","Yw2oUcQOnv","0h1b1Waim6",
+"iB08lPb1pa","iB08lZhwG1","ciuWzrz7Ut","9rlg9Nxx9V","Pb1paFGzgp","8xEKzNcICA","Pb1pahE1Ql","lH1ktiqv4k","LewvM7hyVv","K20wKni2v1",
+"Z4I1v8RCUA","i7WMQNOHsz","faHirNxx9V","KsjRK16lHc","b29RJTXQ0Z","5iGN5Pb1pa","Y1mC0HP433","KZamHuTacx","VIlwPsoy9t","dpe1v2Yz7E",
+"y94nwrKDLJ","m4bxUBGaQY","Oz8yZQYxC0","pmeCdbrhlQ","okgRibZLvS","EoToPv2eC3","FPfSEMK07Y","yofH3Z4I1v","QnJ1SChuy3","Cfgr3BCxeC",
+"lweGyPYBf4","IBe8knnP8o","sqVrfvOqCE","jfREuUmaEv","atef2l83Ud","he9IAYw2oU","KZamHuJScX","cShY2FLsph","i3pydNAFuw","lXFOBdhSuH",
+"55rfBatef2","ReKEWNAFuw","L7cGcciuWz","CNHmv5Namm","LewvMAOgEe","CK5W7CqqaD","dmoS7xXTI4","ksJbyn1pmO","n8pJ9F6PT2","2hEEUFwEJz",
+"xciqpBFkb8","MmKGJmz8gx","MaJQsIBe8k","aDGtSuN6r3","LDk6fYw2oU","tjQxsY1mC0","FPfSEJKWYR","BbwgAy94nw","580YDsqVrf","StlDJ5nmWv",
+"ogLgcRACuj","mz8gx2ZHdk","aFFssuJScX","DG4sTfcwDa","OUYuFVerEA","VIlwPrhl0J","QWxoTCNHmv","d7vjMdQ586","he9IACxVEf","OUqFMa00b5",
+"wDajXlweGy","nFqikb29RJ","blLA9fqypy","2DREsaFFss","dhSuHFFDui","nnP8olpF6W","ciuWzIKxdL","S77LHCfgr3","CIShGgIYvE","P6bcguPX7G",
+"brhlQCfgr3","5NammeuZA5","Dz1R3ZzJHW","RxrsmStlDJ","n8pJ9pvgjS","BGaQYrKDLJ","14FLR0Wr5y","x3LDe5Mg9r","NhXduOHaBz","JRJQBLewvM",
+"uJScXjS1aj","pvgjSSWfou","pv0i7FLsph","Mkgy8aFFss","Chuy39iGoT","kZANmzz4ZU","0MR5X7ku1p","QWxoT7X3uy","WmadAlpF6W","fcJOyGSQwj",
+"EdBKcDz1R3","CqqaDzbIYY","AIYUu6AFT0","fLNg8vkCHH","CdyBViwzGk","rKDLJCqqaD","gIYvEHzZT8","gtCA5tl72W","Cp3mZ6q6L9","faHir2Yz7E",
+"M6qcGwiHrZ","pWiOs5nmWv","fcwDaK20wK","fcJOymX2GE","S2DfuuoStw","tlILtI7p2a","14FLRd7vjM","StlDJWmadA","WMiS34QMc9","1j5L8lsQGo",
+"0YAGH9rlg9","RsQUqUvlv4","yEfy9ZhwG1","DQimpNxx9V","64s8NXyPZN","taOXKtjQxs","KASQ80MR5X","5drc6d7vjM","W7cTsJ2mQi","Mm8siK20wK",
+"nlaBynnP8o","BbwgA2ZHdk","pWiOsaL6AJ","xXTI4FPfSE","HzZT8ix74r","QYxC0CqqaD","cShY2a00b5","FnPFBpv0i7","fqypygtCA5","gjUTu45cIH",
+"64s8N0YAGH","9eoRcuAWyp","IBe8kRzaZA","NOHsz7fsYM","suY4xQWxoT","MaJQsXyPZN","C2IrcIKxdL","BGaQYjS1aj","oGu6xBFkb8","1j5L8cL0aE",
+"4W0TljeskS","t59lRFVMxo","hi5X7QYxC0","zFgtBJ2mQi","tl72WCxVEf","t98iWlXFOB","aL6AJQworu","JJs5mk85Ae","I7p2aFxX9q","zY1GYfFDrJ",
+"IBe8kY1mC0","CNHmv9rlg9","MmsIoUmaEv","U3yw5RzaZA","9iGoTa00b5","DcpWBgIYvE","zHF1qAXpwE","TCgPpS77LH","VIlwPpAhR1","aDGtSM3zXL",
+"zY1GYbZLvS","RxrsmpvgjS","Yh1hFlweGy","GXdoHrKDLJ","a00b5580YD","yofH316lHc","xXTI4AgJHQ","5VZjSlXFOB","ogLgclH1kt","UmaEvG1RhS",
+"0MR5Xm4bxU","atef2suY4x","t98iWAIYUu","2ZHdknFqik","VLTy664s8N","yEfy9pvgjS","uJScXK4GS8","pFrrlMmKGJ","FVMxos93Ml","LbRTHCp3mZ",
+"No0Qbfqypy","IjTwPtl72W","5nmWvazIWp","Ta8f6FNYIM","t59lR8TxD7","Y1mC0aez9y","L7cGcRBhp0","AXpwEStlDJ","aDGtSEdBKc","WMiS3JXljW",
+"Chuy3gIYvE","taOXKCfgr3","0YAGHCIShG","5NammhSSvQ","zY1GYtuDyS","POUYScQOnv","2NslmEoToP","mX2GEhi5X7","uJScX3weIF","DQimp7lUXZ",
+"Ta8f6dhSuH","TCgPpcL0aE","k85AepT8wu","oGu6xJKWYR","Kr8yslkMUA","cmXIXnlaBy","AOgEea00b5","EoToPI7p2a","yofH3RsQUq","P6bcgWaim6",
+"QbxXc5nmWv","CK5W72DREs","5Drn07X3uy","taOXKUlU3M","FxX9q5Namm","3otm6fqypy","ZhwG15drc6","oVQp67Ow5C","jeskSFjHXR","7hyVvAIYUu",
+"0YAGHS77LH","HfyNQJkzUn","5VZjSG1RhS","I7p2aHfyNQ","CK5W7fFDrJ","AmdQdvLsmS","HlUbF4QMc9","W3VFHYf2Ec","2NslmTXQ0Z","GXdoHpv0i7",
+"DQimphSSvQ","taOXKlCMxy","LewvM45cIH","AkKTkWmadA","7hyVvBFkb8","G1RhSVjCZq","gjUTuciuWz","HlUbF7lUXZ","Z4I1vcQOnv","HfyNQyvOMI",
+"oGu6x3otm6","RzaZAMK07Y","dpe1vMojnP","9iGoTqQxHP","jSjS3s93Ml","07n1cQWxoT","jzUqR1v5hH","tAOsrhE1Ql","zqH0WaDGtS","Waim6OUYuF",
+"F6PT2v8yFN","2Yz7E580YD","v1HlnWDVWJ","WaWsvn1pmO","Uvlv4Mm8si","GSQwj8TxD7","vOqCEuoStw","7fsYMfcJOy","qQxHPJRJQB","C2IrcpAhR1",
+"AXpwEulk41","atef2PYBf4","v2eC38U2nU","uLtKscQOnv","vOqCEs93Ml","FNYIM2Yz7E","lpF6W2hEEU","JRJQB6AFT0","RmDcrsoy9t","pv0i7CxVEf",
+"9GXkXPYBf4","hSSvQuJScX","uLtKsM3zXL","ru4UGCdyBV","ThjNnvOqCE","WDVWJCp3mZ","Ta8f6vkCHH","n1pmO5Mg9r","CxVEfyvOMI","XyPZNRxrsm",
+"4dEz6s4786","KZamHwiHrZ","M6qcGTwano","0YAGHbrhlQ","uvf7AWPmlx","x3LDeGXdoH","ThjNn4W0Tl","aDGtS9y4lw","AkKTklj07Q","uZPqgv2eC3",
+"HfyNQoQ87r","sx5GlCdyBV","s93MlVprf2","cShY2lsQGo","9XyT948cHL","Gv3FqlweGy","yToGW0PktI","rKDLJkZANm","M6qcG1LB1L","fFDrJQnJ1S",
+"5Mg9rJJs5m","qaofN16lHc","VIlwP0BmCy","0Kyfsl83Ud","qUJMdKsjRK","SWfouQworu","guMb8YjB9t","VerEAuLtKs","Dz1R3K4GS8","FFDuiqaofN",
+"P6bcgpvgjS","64s8NQbxXc","8TxD714FLR","8TxD7bZLvS","W7cTsStlDJ","ni2v1hUTw7","yToGW64s8N","zbIYYWaim6","ZhwG1faHir","SjskQpv0i7",
+"ThjNnQnJ1S","aFFssa00b5","lj07QVIlwP","5VZjSDG4sT","FxX9qBbwgA","prNT6ksJby","tAOsrgjUTu","OxWIHAIYUu","FhtglprNT6","ZJTXHzmLYD",
+"FwEJzuAWyp","ReKEWuupzk","Kr8ysM3zXL","zbIYYCIShG","iqv4k45cIH","hYBCKyEfy9","4QMc9yEfy9","yvOMIjeskS","d7vjMuPX7G","9eoRclpF6W",
+"0h1b1QnJ1S","uPX7GsqVrf","Waim6suY4x","8hJdtIRh48","14FLRThjNn","X6Pin0Kyfs","brhlQEOE1o","XyPZNDLhzM","JRJQBZUnqt","F6PT2i7WMQ",
+"NhXduMezSW","XyPZNoVQp6","uupzk0YAGH","vLsmSciuWz","uJScXB3qem","HRxd8aDGtS","0PktIwDajX","7fKYUYjB9t","CK5W7Qworu","n1pmO2Yz7E",
+"iB08lNxx9V","BpYhV5iGN5","t98iW0MR5X","EOE1oMm8si","t59lR8hJdt","zQt6QnlaBy","24ARFgtCA5","DG4sTFFDui","5NammoVQp6","9rlg9StlDJ",
+"WmadAgdQsS","tl72W7ku1p","KASQ8uPX7G","LbRTH7fsYM","vOqCE7Ow5C","RBhp0WMiS3","X6Pin8FmFH","Pb1paP6bcg","RpBQmCp3mZ","i3pydW7cTs",
+"JKWYRZJTXH","jSjS3suY4x","v2eC3JJs5m","BpYhVhYBCK","cQOnvGv3Fq","o8UydeuZA5","iKqhrRpBQm","jfREumX2GE","BFkb8UlU3M","GSQwj5IhmG",
+"JXljW3weIF","zQt6QMkgy8","wDajXv2eC3","ni2v1EOE1o","W3VFH9XyT9","2Yz7EiwzGk","cL0aEdpe1v","yEfy9s7Mxk","x3LDeECMvU","FnPFBuvf7A",
+"I7p2aYjB9t","FGzgpPOUYS","h1zcH64s8N","suY4xd7vjM","580YDn1pmO","he9IAZJTXH","AIYUuiB08l","0ao3lRBhp0","d85a9vLsmS","ReKEWdhSuH",
+"wiHrZPOUYS","NOHszOHaBz","rz7UtIBe8k","okgRiDG4sT","ECMvUi3pyd","RzaZAv1Hln","3otm6v2eC3","LDk6fFjHXR","tAOsrBFkb8","7fsYMJkzUn",
+"tvdkD9rlg9","0h1b1lkMUA","jeskSyToGW","8xEKzThjNn","hUTw79GXkX","iB08lgtCA5","i7WMQgtCA5","SjskQ9iGoT","hi5X7tAOsr","24ARFHfyNQ",
+"QbxXcdjsrv","QworuMkgy8","aL6AJ07n1c","45cIHpiJSk","DQimpEoToP","UmaEvXflUq","azIWpQssNC","aL6AJZ4I1v","uLtKsFGzgp","VBjhz9rlg9",
+"hE1QlCK5W7","FnPFBt98iW","4dEz69iGoT","yluBxn8pJ9","5IhmGJKWYR","MmsIoZUnqt","AgJHQs4786","55rfBWaim6","Oz8yZd7vjM","t59lRECMvU",
+"jSjS38TxD7","nFqikQChxs","SjskQjiVBP","ulk4148cHL","Z4I1vsqVrf","1LB1L2hEEU","uupzk1j5L8","MK07YWaim6","ni2v15VZjS","ksJby6q6L9",
+"zQt6QFLsph","POUYSRmDcr","rz7Utxciqp","JIqXitvdkD","v1HlnZUnqt","n8pJ9AgJHQ","9rlg95iGN5","8cVD3ru4UG","FFDui8TxD7","xciqpv1Hln",
+"faHirl83Ud","y94nwOUYuF","L7cGcxciqp","5iGN5IKxdL","1LB1LVprf2","U3yw5Oz8yZ","WPmlxFNYIM","TCgPp4dEz6","580YDIjTwP","7fsYMCxVEf",
+"VjCZqxReec","cmXIXhe9IA","yEfy9OHaBz","yToGWs4786","Ta8f68xEKz","iwzGklViBv","mz8gxjS1aj","OxWIHfFDrJ","RmDcrRxrsm","okgRiQChxs",
+"s93MlPYBf4","29QAzFcWrW","2DREss4786","JJs5mpAhR1","WreyPqQxHP","GSQwjrKDLJ","StlDJ7fKYU","HfyNQRxrsm","v1HlnZ4I1v","Gv3FqJ2mQi",
+"Z4I1v618Di","e6e4zIRh48","NhXduL7cGc","CdyBVnFqik","NAFuw8TxD7","oVQp6IjTwP","jfREunFqik","fFDrJt98iW","uTacxoGu6x","KsjRK8U2nU",
+"6q6L9soy9t","uJScXru4UG","tuDyStuDyS","2NslmoQ87r","UmaEvhe9IA","PYBf4ReKEW","0MR5X2Yz7E","nlaByMaJQs","5NammYOfrY","fFDrJjfREu",
+"uPX7G8RCUA","b29RJ7X3uy","zz4ZUPYBf4","QbxXctlILt","3weIFeuZA5","MezSWVBjhz","TXQ0ZJJs5m","FPfSEU3yw5","MojnPQWxoT","TCgPptAOsr",
+"7fKYUCIShG","AIYUuDLhzM","9rlg9d85a9","RkQke45cIH","piJSkKr8ys","NcICAFVMxo","bgJAzEOE1o","iB08l48cHL","yEfy9cL0aE","jfREubrhlQ",
+"n8pJ9fLNg8","VIlwPIKxdL","F6PT2CNHmv","tuDySogLgc","azIWpnnP8o","vLsmS7fKYU","tvdkDHfyNQ","taOXKOUYuF","JRJQBfmIK1","QYxC02Yz7E",
+"K20wKYf2Ec","WDVWJ5IhmG","TwanoYOfrY","Q6hMCECMvU","ZUnqtzQt6Q","WaWsv7fsYM","Kr8ysQnJ1S","5ZaEzK20wK","Yf2Eci7WMQ","SjskQJ2mQi",
+"dQ586rz7Ut","xXTI42DREs","soy9tZUnqt","S2DfuStlDJ","a00b5iB08l","FwEJzLDk6f","fcwDaThjNn","MezSWIKxdL","0Kyfsatef2","OHaBzwDajX",
+"i3pyd618Di","h1zcHDcpWB","ksJbyaDGtS","S77LHaL6AJ","9y4lwBGaQY","D6rBy6q6L9","lsQGopWiOs","fFDrJXflUq","SbRYypWiOs","2Yz7EEoToP",
+"5Mg9r7fKYU","StlDJaDGtS","yToGWAXpwE","djsrvpvgjS","2Yz7EWreyP","IKxdLuTacx","fLNg84W0Tl","atef2LbRTH","7hyVvJkzUn","qQxHPjS1aj",
+"fcwDatAOsr","Yw2oUK4GS8","W7cTs2DREs","ksJbyVprf2","VIlwPcShY2","HlUbF5nmWv","OUqFMsqVrf","NAFuwSmGzv","Chuy3AXpwE","t59lRyToGW",
+"Q6hMCWPmlx","QChxs7Ow5C","d7vjMQYxC0","aez9yVprf2","kZANmuJScX","CK5W7kB5nP","AmdQdfqypy","TCgPpaez9y","hSSvQn8pJ9","tl72WS2Dfu",
+"BFkb8qQxHP","B3qemCqqaD","6q6L9tlILt","qaofNprNT6","tl72WfcwDa","v1HlnaFFss","UmaEvwiHrZ","CK5W7BGaQY","SbRYy5ZaEz","1LB1Ln8pJ9",
+"uupzkpvgjS","HRxd8JkzUn","0MR5XKsjRK","uoStwlsQGo","Yf2EcwDajX","ulk41oVQp6","LbRTHAXpwE","d85a95VZjS","jSjS3ru4UG","azIWp5Namm",
+"Ta8f6hi5X7","S2DfuNAFuw","7fsYMAgJHQ","FGzgpEOE1o","atef2SmGzv","LewvMhi5X7","8U2nUlweGy","i3pydD6rBy","C2IrcMkgy8","0BmCyZ4I1v",
+"oVQp6Cp3mZ","0BmCyCK5W7","ciuWzZJTXH","M6qcGBFkb8","dQ586v1Hln","iwzGk48cHL","8cVD3C2Irc","MmKGJSWfou","8U2nUFLsph","2NslmMGlTF",
+"FcWrWNOHsz","nnP8ot59lR","taOXKfLNg8","v2eC348cHL","rhl0JZv7z0","uupzkEoToP","qQxHPbrhlQ","rz7UtJKWYR","2Yz7E8cVD3","yvOMItlILt",
+"Cp3mZVNCPd","t98iWaFFss","I7p2ajfREu","NAFuw16lHc","sqVrf8hJdt","AmdQdn8pJ9","LewvMfaHir","IjTwPnFqik","cShY2BGaQY","iKqhrHzZT8",
+"suY4xECMvU","Mm8siTa8f6","2ZHdkuZPqg","K20wKfFDrJ","07n1cgjUTu","cShY2MojnP","ZUnqtW7cTs","ReKEWFnPFB","uupzkY1mC0","55rfBRzaZA",
+"lkMUA7X3uy","AOgEeHfyNQ","qUJMdyvOMI","0YAGHkZANm","5NammPb1pa","euZA5fFDrJ","7ku1p9GXkX","kZANmdpe1v","2hEEUnlaBy","NAFuwZ4I1v",
+"8FmFHatef2","iqv4kNcICA","bZLvSdpe1v","a00b5he9IA","0h1b1Dz1R3","0ao3lHfyNQ","xXTI416lHc","v1HlnFxX9q","7fsYMGSQwj","CIShGrKDLJ",
+"L7cGcU3yw5","RsQUqQbxXc","6AFT0Ul4a1","HRxd8lpF6W","fLNg8HP433","QChxs5VZjS","24ARF0BmCy","HP433Vprf2","LbRTHazIWp","9eoRcn8pJ9",
+"LbRTHtvdkD","fqypy14FLR","CNHmvpFrrl","DcpWB8U2nU","iqv4k6AFT0","OUYuFFLsph","lXFOBYjB9t","t59lRVNCPd","piJSkDcpWB","pFrrlMaJQs",
+"fFDrJ4QMc9","6AFT0VerEA","Nxx9VOxWIH","HfyNQlViBv","NOHsz5Drn0","RBhp00PktI","jeskSuvf7A","XflUqWDVWJ","MojnPQClRL","IjTwPl83Ud",
+"FNYIMprNT6","rKDLJjtn0X","5nmWvguMb8","qQxHPHlUbF","GrDg7ksJby","BpYhVjeskS","zz4ZUs4786","fLNg80PktI","14FLRpmeCd","IRh48Waim6",
+"MezSW16lHc","faHirrKDLJ","cShY2KASQ8","C2IrcsqVrf","F6PT2W7cTs","piJSk07n1c","QbxXcIjTwP","tjQxsHfyNQ","cmXIXlweGy","2TRI7CNHmv",
+"vOqCEcQOnv","FxX9qrhl0J","6AFT0fcwDa","soy9tIKxdL","9iGoTvLsmS","3otm62Yz7E","29QAzCfgr3","aFFssHP433","jeskSSWfou","t98iWv8yFN",
+"uTacxi3pyd","BFkb8Rxrsm","8RCUAiqv4k","0PktI16lHc","5iGN5jiVBP","x3LDeTCgPp","bZLvS1v5hH","6q6L9F6PT2","QbxXcW7cTs","RmDcrVerEA",
+"QbxXcvkCHH","kZANmfqypy","M3zXL45cIH","fcJOyUlU3M","GWqqXb29RJ","4QMc99rlg9","lXFOBni2v1","8RCUAbgJAz","zbIYYpvgjS","EoToPt59lR",
+"CIShGMaJQs","48cHLUvlv4","hi5X7zFgtB","iqv4kYh1hF","lCMxyni2v1","kZANmKsjRK","lXFOBpvgjS","QChxstuDyS","3weIF2hEEU","gf8rIjtn0X",
+"tjQxsK20wK","B3qemsqVrf","t98iWK4GS8","pT8wuI7p2a","MmsIouQIcz","s4786QYxC0","jtn0X7lUXZ","uJScXO3iyQ","7hyVvuN6r3","XflUq7fsYM",
+"OHaBzXyPZN","mz8gxKsjRK","Uvlv4uoStw","GSQwjb29RJ","qQxHPqQxHP","9y4lw9XyT9","d85a9MK07Y","4dEz6Gv3Fq","X6PinQWxoT","pv0i76q6L9",
+"GWqqXW3VFH","t98iW0Wr5y","LDk6flViBv","b29RJNhXdu","cShY28RCUA","LbRTHFjHXR","IjTwP2ZHdk","QWxoThYBCK","BFkb8ksJby","Gv3Fq2TRI7",
+"sx5GlFwEJz","0ao3lPb1pa","fmIK1ECMvU","3otm67fsYM","mX2GE5iGN5","gf8rIaez9y","jSjS3ReKEW","JKWYRGWqqX","MmsIo5Mg9r","yvOMIiKqhr",
+"jtn0XlH1kt","oVQp6tl72W","YOfrYy94nw","nFqikB3qem","Waim6uAWyp","SWfoupiJSk","AkKTkVerEA","nlaBy2Nslm","qaofNb29RJ","CNHmvVjCZq",
+"JXljW6q6L9","QYxC0JRJQB","8cVD3y94nw","16lHcv8yFN","L7cGcIRh48","Ta8f63weIF","pvgjSChuy3","KZamHd85a9","Pb1paMmKGJ","y94nwpvgjS",
+"FVMxoa00b5","FwEJzBGaQY","FcWrWzmLYD","StlDJogLgc","WmadAb29RJ","euZA5VBjhz","OxWIHFnPFB","TwanofcJOy","UmaEv1LB1L","zmLYD16lHc",
+"B3qemhi5X7","FwEJzJIqXi","hUTw7ZuDtD","FcWrWlweGy","mz8gxSmGzv","uQIczd85a9","J2mQiFFDui","iwzGktlILt","lXFOBpT8wu","HlUbF0Kyfs",
+"HzZT8RBhp0","zmLYD0BmCy","BbwgAru4UG","8cVD38cVD3","8RCUANAFuw","h1zcH5VZjS","euZA5AXpwE","OUqFMlj07Q","UmaEvhE1Ql","7fsYMuvf7A",
+"RmDcrG1RhS","oQ87rNOHsz","5VZjS8TxD7","pWiOsYOfrY","AkKTkX6Pin","48cHL5ZaEz","VBjhzEoToP","SbRYy64s8N","7fsYMlViBv","yluBxnnP8o",
+"LewvM5iGN5","uAWypOUqFM","tvdkDD6rBy","pmeCdhi5X7","29QAzRzaZA","CNHmvuPX7G","16lHcgdQsS","UlU3MQnJ1S","3weIF4dEz6","MGlTFdhSuH",
+"XyPZNZUnqt","SbRYyVBjhz","Yh1hFdQ586","RzaZALewvM","5ZaEzFjHXR","d7vjM580YD","sqVrfWmadA","x3LDegIYvE","RACujpAhR1","kB5nPQworu",
+"faHiroVQp6","uPX7GuPX7G","OUYuFaL6AJ","BGaQY07n1c","FFDuirhl0J","dpe1vjS1aj","AOgEeni2v1","EOE1oFLsph","2Yz7EWDVWJ","FNYIMtAOsr",
+"Y1mC0MmKGJ","2hEEUAIYUu","I7p2abrhlQ","soy9t5ZaEz","uvf7AfLNg8","yluBxO3iyQ","2Yz7ENOHsz","x3LDe2Yz7E","RpBQms4786","Mm8siqaofN",
+"7X3uyd7vjM","GrDg7blLA9","e6e4zgtCA5","djsrvRkQke","4dEz6RkQke","dmoS79GXkX","IRh489rlg9","No0QbWPmlx","BpYhVzbIYY","Rxrsm9y4lw",
+"y94nw8xEKz","MaJQsRpBQm","ZhwG1Q6hMC","AXpwE5Mg9r","AkKTkY1mC0","OUYuFYOfrY","ni2v1ZhwG1","D6rByjtn0X","580YDvLsmS","uJScX4W0Tl",
+"0ao3lMm8si","ni2v1iKqhr","jtn0X8hJdt","uAWypbrhlQ","jtn0X2Yz7E","qaofNfqypy","wiHrZTa8f6","07n1cZv7z0","KZamHt59lR","lm0pDQClRL",
+"Uvlv4FPfSE","iB08lReKEW","9eoRcyEfy9","wDajXUvlv4","lsQGo5Mg9r","n1pmObgJAz","IjTwPguMb8","AIYUulkMUA","3otm664s8N","QChxsECMvU",
+"VIlwPlH1kt","FnPFBlpF6W","55rfBCxVEf","SmGzv6q6L9","C2Irc16lHc","QnJ1SCIShG","QworuKASQ8","cL0aEv1Hln","Cp3mZtvdkD","8xEKzoQ87r",
+"In3NS1j5L8","24ARFpWiOs","l83UdwiHrZ","5ZaEz8U2nU","MezSWAgJHQ","2hEEUgjUTu","AOgEepFrrl","gIYvE0BmCy","e6e4zt98iW","azIWptAOsr",
+"hUTw7FNYIM","WDVWJ55rfB","ZJTXHZzJHW","uN6r3kZANm","MezSWmX2GE","Q6LixK4GS8","K4GS8KZamH","DLhzMaL6AJ","QssNCazIWp","d85a9X6Pin",
+"piJSkaDGtS","gIYvEpT8wu","uoStwWDVWJ","2TRI70Wr5y","lj07Q9eoRc","W3VFHxXTI4","dQ586ThjNn","2DREsMK07Y","Z4I1v7fsYM","vOqCEuPX7G",
+"cmXIXtAOsr","l83UdCp3mZ","t98iWydG8U","sx5Gld7vjM","Kr8yshe9IA","5Mg9rXyPZN","jtn0XWPmlx","uTacx0BmCy","Zv7z0Z4I1v","v2eC3zHF1q",
+"CxVEfnlaBy","QClRLm4bxU","pv0i7LDk6f","rhl0JhSSvQ","uAWyps4786","iB08lpv0i7","9XyT9BFkb8","7fKYUHP433","pWiOs4QMc9","RACuj5nmWv",
+"WaWsvCxVEf","KZamHvOqCE","MaJQsjfREu","n1pmOF6PT2","ZzJHWdQ586","SWfoulXFOB","9rlg9oGu6x","JIqXicShY2","KZamHdjsrv","fmIK1K4GS8",
+"Z4I1vyvOMI","RpBQmjSjS3","RBhp0okgRi","GWqqXXflUq","QbxXcAkKTk","CK5W7B3qem","piJSkjS1aj","Pb1pav2eC3","7fsYMvkCHH","m4bxUQnJ1S",
+"MmsIoP6bcg","Pb1papiJSk","CdyBVbrhlQ","fcJOypWiOs","DLhzMStlDJ","lweGyReKEW","8xEKzkB5nP","RxrsmlsQGo","K20wKv8yFN","yvOMI4W0Tl",
+"6q6L9pvgjS","yvOMIyToGW","BCxeCUvlv4","h1zcHQworu","JKWYRYw2oU","LDk6fjiVBP","Dz1R3HRxd8","AOgEeh1zcH","LDk6fRxrsm","8FmFHRpBQm",
+"uoStwKsjRK","hi5X7fLNg8","8FmFHgf8rI","mX2GEFhtgl","jtn0XjSjS3","blLA9StlDJ","55rfB3weIF","x3LDeO3iyQ","RpBQmX6Pin","EdBKcP6bcg",
+"ni2v17hyVv","qaofNFwEJz","Ul4a1uPX7G","Y1mC0Yh1hF","0h1b1Yw2oU","QClRL1LB1L","NOHszQnJ1S","aDGtS2ZHdk","8cVD32Nslm","1v5hH1LB1L",
+"hYBCKiqv4k","yEfy9v8yFN","QssNCcL0aE","hi5X7s4786","2NslmWMiS3","FPfSEpWiOs","pvgjSFVMxo","LDk6fPYBf4","pvgjS8cVD3","tjQxsL7cGc",
+"OxWIHRzaZA","EdBKczQt6Q","VBjhzuvf7A","8hJdtW3VFH","Ss0ZuW3VFH","7ku1p29QAz","uoStwqUJMd","8xEKzzY1GY","yvOMItuDyS","kZANmMmsIo",
+"xReecfmIK1","o8UydQworu","xciqpzz4ZU","7X3uyIn3NS","RBhp0GSQwj","lXFOB0h1b1","jzUqRpT8wu","HlUbFKZamH","h1zcHgIYvE","cmXIXJXljW",
+"6AFT0zmLYD","Q6hMCzHF1q","5iGN5B3qem","Dz1R3NAFuw","TCgPpChuy3","0PktIydG8U","soy9t45cIH","fqypyjSjS3","2DREssoy9t","Z4I1vQYxC0",
+"9GXkXTXQ0Z","NcICAQYxC0","yofH3Rxrsm","MmsIoIKxdL","dpe1v4dEz6","sx5GlQWxoT","GrDg78RCUA","2DREsD6rBy","Waim6QWxoT","yEfy9HzZT8",
+"VerEAlpF6W","I7p2aUlU3M","FGzgpFhtgl","tAOsrFhtgl","HP43348cHL","lsQGoLewvM","M6qcGDLhzM","S77LHFVMxo","bgJAzTXQ0Z","mX2GEuPX7G",
+"n8pJ9Uvlv4","F6PT2yvOMI","RmDcrGXdoH","WmadAEOE1o","XyPZNQClRL","29QAzokgRi","pv0i7kZANm","Yf2Ec7ku1p","KASQ8fcwDa","jzUqRaDGtS",
+"nFqik14FLR","Pb1palweGy","AIYUuOz8yZ","64s8NlsQGo","5drc6v2eC3","0KyfsNOHsz","OHaBzlXFOB","JJs5mdhSuH","3weIFdpe1v","pT8wudQ586",
+"8U2nUOUYuF","4QMc9lweGy","jS1ajJJs5m","0YAGHKsjRK","FVMxolj07Q","FwEJz5iGN5","Kr8ysThjNn","FFDuiJKWYR","ZJTXHQWxoT","7ku1pIBe8k",
+"he9IA7hyVv","WDVWJpiJSk","Yw2oU24ARF","d85a9Kr8ys","FLsphHP433","LbRTHpv0i7","AIYUuI7p2a","iqv4kEOE1o","y94nwW7cTs","6q6L9P6bcg",
+"pAhR1BFkb8","djsrvt59lR","NcICA4dEz6","5Mg9r6AFT0","d85a9580YD","X6Pin4QMc9","pmeCdy94nw","MGlTFfcwDa","RBhp0jzUqR","618DiFFDui",
+"W3VFH7hyVv","hYBCKGv3Fq","8cVD3nFqik","qUJMdTCgPp","64s8NkZANm","FjHXR29QAz","rz7UttlILt","YjB9trz7Ut","IRh48guMb8","Kr8ysHlUbF",
+"Cp3mZQworu","8U2nUSWfou","e6e4zHRxd8","GrDg7HP433","fmIK1TCgPp","gdQsSLewvM","prNT6soy9t","FLsphe6e4z","d7vjMQworu","qUJMdNOHsz",
+"uoStw07n1c","WPmlxrKDLJ","0MR5XQWxoT","ogLgcF6PT2","kB5nP7Ow5C","JKWYRMojnP","t59lRdjsrv","RkQkeatef2","DcpWBG1RhS","atef2BGaQY",
+"YjB9tsuY4x","BFkb8nFqik","aFFssgjUTu","dhSuH5IhmG","s7MxkvLsmS","Dz1R3Waim6","xReecfqypy","tl72WMmsIo","7hyVvGv3Fq","i7WMQD6rBy",
+"VIlwPpFrrl","vkCHHHlUbF","M3zXL5ZaEz","3otm607n1c","G1RhSgtCA5","U3yw58TxD7","Chuy3xReec","P6bcgy94nw","7fKYUQ6Lix","TwanoJIqXi",
+"lCMxyGrDg7","Kr8ys9eoRc","JXljWwiHrZ","h1zcHM6qcG","QssNCKZamH","FPfSEXflUq","FhtglhE1Ql","LewvMW3VFH","dhSuHlCMxy","SmGzvsuY4x",
+"WPmlxPb1pa","QbxXcCfgr3","a00b5prNT6","Rxrsm6AFT0","d85a9bZLvS","QClRLlXFOB","k85AeFhtgl","FNYIMb29RJ","Y1mC0S77LH","pv0i7W3VFH",
+"5iGN5S77LH","3weIFTwano","XyPZNprNT6","hSSvQMmsIo","3weIFGv3Fq","rhl0JLewvM","QChxsUvlv4","RsQUqpv0i7","FcWrWzY1GY","hUTw7uvf7A",
+"0MR5X580YD","2ZHdk7lUXZ","GrDg7v2eC3","8FmFHlweGy","QworudQ586","5Mg9ruLtKs","0Wr5y0BmCy","CqqaDt59lR","k85Ae5Mg9r","RxrsmRxrsm",
+"wiHrZpvgjS","soy9tUlU3M","Y1mC0qQxHP","TXQ0Z1LB1L","Zv7z0XflUq","AkKTkDQimp","pAhR1QWxoT","yEfy9okgRi","cQOnv2TRI7","d7vjMIBe8k",
+"HRxd8MmKGJ","brhlQP6bcg","b29RJi7WMQ","oVQp6rz7Ut","uTacxqUJMd","uAWypBFkb8","DLhzMbZLvS","MK07YJRJQB","gjUTuv2eC3","G1RhSx3LDe",
+"618DiFNYIM","FPfSEnlaBy","No0QbY1mC0","5Mg9rzQt6Q","MezSWPOUYS","9rlg90ao3l","lj07Q5nmWv","3weIFY1mC0","GrDg7fqypy","VNCPda00b5",
+"zY1GY0MR5X","QChxs9GXkX","4dEz6fqypy","cQOnv3otm6","AXpwElm0pD","FhtglwiHrZ","h1zcHn1pmO","7ku1pOz8yZ","bZLvSzbIYY","tl72WQnJ1S",
+"64s8NU3yw5","djsrv8TxD7","O3iyQFGzgp","UlU3Mi3pyd","vkCHHIn3NS","CNHmvYOfrY","hSSvQuupzk","lsQGoOUqFM","P6bcgciuWz","QssNCAkKTk",
+"tlILt6q6L9","Waim6taOXK","azIWpzY1GY","tl72W2ZHdk","fLNg8iKqhr","X6PinyEfy9","AXpwE2DREs","Pb1paVBjhz","ZzJHWydG8U","9iGoTNOHsz",
+"ksJbyFNYIM","hYBCKguMb8","9GXkXAgJHQ","RsQUqM3zXL","HlUbF0Wr5y","hE1QlIjTwP","IjTwP2TRI7","x3LDecShY2","5ZaEzQWxoT","VNCPdWPmlx",
+"m4bxUzY1GY","jiVBPxciqp","AIYUuEOE1o","cL0aEMezSW","dpe1vFjHXR","jtn0XSs0Zu","07n1ct59lR","XyPZN9y4lw","lsQGokZANm","Dz1R3OUYuF",
+"MGlTFsoy9t","tlILt5drc6","TXQ0ZPOUYS","7lUXZsx5Gl","BFkb8HfyNQ","sx5Gl8TxD7","Ss0ZuCqqaD","9y4lw24ARF","soy9trKDLJ","hi5X7S2Dfu",
+"uPX7G48cHL","IRh48MaJQs","C2Irc9y4lw","J2mQiSbRYy","lsQGolCMxy","SjskQMezSW","Cfgr3IjTwP","s4786Chuy3","D6rByWaim6","iwzGkzQt6Q",
+"oQ87rI7p2a","CxVEfokgRi","CK5W7OxWIH","Q6hMC2DREs","iwzGk3otm6","ZUnqtO3iyQ","7X3uytuDyS","fcJOysuY4x","SbRYyqaofN","55rfBFPfSE",
+"ogLgccQOnv","gjUTuReKEW","yluBxVprf2","iB08llj07Q","zQt6QuJScX","VLTy6WDVWJ","hi5X7AmdQd","X6PinX6Pin","QClRL4dEz6","B3qemtvdkD",
+"jeskSW3VFH","FPfSE7Ow5C","uupzkjeskS","MezSWEOE1o","QssNCoVQp6","M6qcG618Di","MaJQs48cHL","nnP8oS2Dfu","DG4sTCNHmv","QYxC0jzUqR",
+"K20wKEOE1o","KsjRKrKDLJ","IjTwPuN6r3","lViBvHRxd8","y94nwVprf2","hYBCKhE1Ql","IKxdLHzZT8","KsjRKM6qcG","yofH348cHL","BCxeC8hJdt",
+"lXFOBFhtgl","Kr8ysGSQwj","QYxC0DcpWB","9eoRc5ZaEz","AmdQdFNYIM","SWfousoy9t","rKDLJ8xEKz","FjHXR2TRI7","Gv3FquZPqg","xReecrKDLJ",
+"jiVBP6q6L9","wiHrZJ2mQi","xciqpG1RhS","FVMxouQIcz","prNT6zY1GY","oQ87rK20wK","pmeCdv8yFN","guMb8MojnP","iKqhr8RCUA","zmLYDcmXIX",
+"zqH0WWmadA","HfyNQzFgtB","OxWIH8RCUA","OUYuFCIShG","zFgtB5iGN5","OUYuFaez9y","FxX9q4W0Tl","45cIHVLTy6","HzZT8B3qem","gIYvEmz8gx",
+"Vprf2oVQp6","uLtKsJkzUn","Pb1paHzZT8","v2eC3Pb1pa","tjQxsChuy3","5drc6zFgtB","oQ87rTCgPp","MmsIo5drc6","uQIczThjNn","t98iWn1pmO",
+"h1zcHGv3Fq","RACujbZLvS","F6PT2OxWIH","PYBf4580YD","X6Pin8xEKz","uLtKs0BmCy","xXTI4yvOMI","t98iWs7Mxk","BCxeC0ao3l","BGaQYI7p2a",
+"JIqXiazIWp","pWiOsNcICA","KsjRK9rlg9","v8yFNatef2","qQxHP5Drn0","gjUTuzQt6Q","FPfSEpiJSk","oVQp6Mm8si","X6PinYf2Ec","LbRTHoQ87r",
+"64s8NIjTwP","Z4I1vpT8wu","uoStwRxrsm","Q6hMCMezSW","JRJQBv1Hln","soy9tlweGy","HP433lH1kt","ECMvUfqypy","RxrsmAOgEe","Mm8siAkKTk",
+"9GXkXGSQwj","QbxXcRmDcr","uPX7GkB5nP","GrDg71v5hH","29QAzNo0Qb","CqqaDFcWrW","QssNCjfREu","lj07Q07n1c","pv0i7hi5X7","gf8rIQbxXc",
+"y94nwQssNC","i3pydSbRYy","QWxoTwDajX","P6bcgQ6Lix","UlU3M5VZjS","IjTwPhYBCK","l83UdChuy3","d7vjMVNCPd","uvf7A5Namm","ni2v1VBjhz",
+"W3VFHzFgtB","qaofNNhXdu","Yw2oUi3pyd","GrDg75Mg9r","MmsIoWDVWJ","64s8Nm4bxU","5drc6tl72W","zHF1qOHaBz","1j5L8fcJOy","4W0Tl14FLR",
+"P6bcgdQ586","Gv3FqdhSuH","gf8rIyofH3","Nxx9VGv3Fq","GXdoH9iGoT","UlU3MiwzGk","uJScXa00b5","7ku1poVQp6","xciqpKZamH","cL0aE5IhmG",
+"Yh1hFLbRTH","xReeclViBv","e6e4zFVMxo","D6rByOxWIH","F6PT2G1RhS","FFDuib29RJ","o8UydVLTy6","FLsph2hEEU","uTacxOUqFM","POUYSazIWp",
+"ZhwG17hyVv","uupzkSbRYy","5Mg9rFNYIM","7X3uy7fsYM","o8Uyd16lHc","aDGtSMGlTF","4W0TlFxX9q","S2DfuuJScX","HlUbFiB08l","JRJQBtlILt",
+"MGlTFhi5X7","hYBCKJ2mQi","ThjNnnlaBy","fcwDaHlUbF","FnPFBdjsrv","Mkgy8BFkb8","hi5X7cShY2","blLA9I7p2a","CdyBVyToGW","6q6L9jiVBP",
+"suY4xJKWYR","hUTw7brhlQ","618Div1Hln","lj07Q0h1b1","NcICAfmIK1","cL0aE8hJdt","JKWYRzmLYD","Yf2EcRpBQm","MaJQsxReec","lH1ktQworu",
+"tjQxsnnP8o","DLhzMsx5Gl","D6rBylsQGo","gdQsSv8yFN","9eoRcNcICA","Qworu3weIF","okgRiECMvU","pv0i7yToGW","ydG8UCK5W7","16lHcRkQke",
+"iKqhrdhSuH","vLsmSDLhzM","yEfy9MojnP","v8yFNJ2mQi","W3VFHk85Ae","7fsYMMojnP","AmdQdy94nw","uPX7GMojnP","aL6AJatef2","oQ87rfFDrJ",
+"BbwgAM3zXL","yEfy9jS1aj","mz8gxoVQp6","VerEAaez9y","uoStwYf2Ec","Vprf2yluBx","5NammcShY2","0ao3laez9y","Zv7z0MezSW","fcwDaCK5W7",
+"MmsIoAIYUu","AIYUusqVrf","FxX9qWaWsv","gIYvEJXljW","6AFT0dhSuH","1v5hHLbRTH","IjTwPAIYUu","1j5L8y94nw","5IhmGIKxdL","5iGN5gf8rI",
+"S77LHd7vjM","ZUnqt0h1b1","EoToPOUqFM","d7vjMnFqik","1j5L8oQ87r","wDajXIjTwP","RpBQmJIqXi","AIYUuHRxd8","jSjS3qUJMd","StlDJ4dEz6",
+"jfREuMezSW","uvf7AXyPZN","IKxdLS77LH","5VZjSfcJOy","zY1GYs4786","ulk41sqVrf","vOqCElCMxy","Vprf2CqqaD","EoToPpT8wu","UlU3Mjtn0X",
+"5VZjS14FLR","48cHLBCxeC","29QAzyluBx","AkKTkyluBx","5VZjStlILt","7ku1puN6r3","uQIczmz8gx","soy9tVNCPd","yluBx3weIF","y94nw0BmCy",
+"QClRLXflUq","K4GS8zz4ZU","zQt6Q7hyVv","tvdkDpAhR1","ksJbyrz7Ut","uN6r3vkCHH","e6e4zJIqXi","Vprf28TxD7","FjHXRS2Dfu","XflUqpiJSk",
+"GWqqXBFkb8","IRh48t98iW","ZuDtDn8pJ9","tuDySlCMxy","BbwgAWaim6","aL6AJ64s8N","BGaQYhYBCK","0h1b1aL6AJ","zz4ZUK4GS8","FVMxoprNT6",
+"tlILtQbxXc","BGaQYqUJMd","Zv7z0VLTy6","VIlwPwDajX","qaofN8TxD7","RpBQmAkKTk","iKqhraez9y","CNHmvOz8yZ","CdyBVjeskS","hi5X7soy9t",
+"cL0aEEOE1o","BCxeCyEfy9","soy9tcmXIX","QnJ1Ss4786","EdBKcGXdoH","In3NSQworu","7fKYUKASQ8","pT8wuNxx9V","uQIcz9iGoT","jeskSRmDcr",
+"zHF1q7X3uy","Z4I1vB3qem","a00b55drc6","7Ow5C1j5L8","2hEEUmX2GE","OxWIHxciqp","vkCHHMmKGJ","Dz1R3zmLYD","7X3uy7lUXZ","PYBf424ARF",
+"lkMUAJXljW","v2eC3pmeCd","Gv3FqWaim6","qaofNL7cGc","SbRYyb29RJ","sx5GlQ6Lix","0BmCyOz8yZ","Cfgr3suY4x","AXpwEYOfrY","OUYuF0YAGH",
+"fLNg8FVMxo","n1pmOUlU3M","Twanodpe1v","OUqFMvkCHH","uupzkIBe8k","4QMc9h1zcH","qaofNi3pyd","lkMUANOHsz","QClRLGv3Fq","EdBKcsqVrf",
+"zqH0WSWfou","KZamHkB5nP","0YAGH8FmFH","zz4ZUjtn0X","L7cGcNo0Qb","MojnPtl72W","VjCZqAgJHQ","K4GS8jS1aj","3weIFrhl0J","he9IAJ2mQi",
+"Z4I1vcL0aE","prNT6x3LDe","cL0aECdyBV","ZuDtDyluBx","yvOMIReKEW","BpYhV5Namm","yluBxPb1pa","aL6AJbgJAz","AOgEei3pyd","BpYhV16lHc",
+"AIYUuuN6r3","hUTw78RCUA","guMb8kZANm","9iGoTqaofN","8U2nUVLTy6","EOE1o07n1c","fmIK1RBhp0","pv0i7fFDrJ","jSjS3MmsIo","he9IAL7cGc",
+"CIShGfaHir","rz7Ut7ku1p","jiVBP45cIH","YOfrYWDVWJ","HP433t98iW","e6e4zgdQsS","cQOnvuLtKs","zz4ZUMmKGJ","hi5X7AOgEe","cQOnvv2eC3",
+"AXpwE9rlg9","X6PinO3iyQ","bZLvSLewvM","Oz8yZmz8gx","F6PT25IhmG","AmdQdYOfrY","48cHLy94nw","gjUTujiVBP","aL6AJ5nmWv","GWqqXVerEA",
+"yofH37X3uy","JXljWMkgy8","he9IA7fKYU","sqVrfvkCHH","NAFuw5Namm","8xEKzCdyBV","WaWsvzY1GY","C2IrclpF6W","O3iyQSjskQ","VLTy6BCxeC",
+"X6PinWaWsv","djsrvGXdoH","45cIHfLNg8","XyPZNlj07Q","X6PinQYxC0","CxVEf9eoRc","3otm6fcwDa","9y4lwQChxs","uJScXogLgc","s93Mlmz8gx",
+"2DREsprNT6","MezSWiKqhr","3otm629QAz","LbRTHIjTwP","tjQxsVprf2","i3pydOHaBz","0MR5XpiJSk","SbRYyWPmlx","55rfBk85Ae","6q6L9XyPZN",
+"SmGzvHP433","WPmlx5IhmG","EdBKcStlDJ","n1pmO0YAGH","wiHrZ9rlg9","hUTw7In3NS","5Nammv1Hln","Ul4a1ni2v1","VBjhzqUJMd","0BmCyn8pJ9",
+"lViBvwiHrZ","hi5X7t98iW","RkQkeuLtKs","QworuyEfy9","MK07Yo8Uyd","K4GS85nmWv","yToGWbZLvS","RpBQmVLTy6","xXTI4Pb1pa","zQt6QW3VFH",
+"ECMvUDG4sT","Chuy35Namm","8hJdtOUYuF","faHirtaOXK","M3zXLAXpwE","vOqCEtjQxs","soy9tMojnP","b29RJtvdkD","Uvlv4gf8rI","Cfgr348cHL",
+"MmKGJulk41","yToGWW7cTs","DcpWBpWiOs","oQ87r5Namm","YjB9t1LB1L","zbIYYNo0Qb","P6bcg48cHL","RpBQmPYBf4","07n1cS77LH","aDGtSB3qem",
+"Nxx9VqaofN","0KyfslXFOB","2hEEUQYxC0","AOgEeCqqaD","C2IrcvkCHH","jeskSCfgr3","JRJQBSjskQ","nFqikiqv4k","ECMvU7Ow5C","MezSWqUJMd",
+"4dEz6XflUq","Ul4a11j5L8","ydG8UPb1pa","29QAzAmdQd","0MR5XpAhR1","dhSuH2DREs","gf8rICK5W7","EdBKcCdyBV","In3NSK4GS8","FhtglpmeCd",
+"24ARFFxX9q","XflUq580YD","I7p2aqUJMd","IjTwP07n1c","SjskQQChxs","uN6r3RpBQm","Zv7z0HRxd8","W3VFHogLgc","lweGypFrrl","gtCA5i7WMQ",
+"7Ow5C5Namm","k85Aedpe1v","JXljWRkQke","Ta8f6TCgPp","Vprf24QMc9","0YAGHChuy3","d85a9qUJMd","FNYIMfqypy","P6bcgPYBf4","Yf2EcaDGtS",
+"7Ow5CpT8wu","uAWypzQt6Q","QYxC0RkQke","FxX9q0Wr5y","t98iWYOfrY","Pb1paqUJMd","RkQkeSmGzv","uAWypVprf2","QWxoTRxrsm","nFqik9rlg9",
+"2DREsMmsIo","6q6L9TCgPp","suY4xtuDyS","S77LHJRJQB","BFkb8hE1Ql","d85a9cmXIX","uQIczIn3NS","QClRLIjTwP","t59lR2Yz7E","TCgPpt98iW",
+"GSQwjx3LDe","s93MluTacx","MmsIo07n1c","0h1b1GrDg7","5iGN5zQt6Q","uN6r3FjHXR","WPmlxi7WMQ","aFFssSbRYy","OUqFM2Yz7E","FwEJzvOqCE",
+"tAOsrMezSW","HlUbFX6Pin","lCMxyO3iyQ","0h1b1SmGzv","BGaQYkB5nP","ZUnqt6q6L9","xciqp55rfB","VjCZqBFkb8","OHaBz5iGN5","iwzGkQssNC",
+"atef2ogLgc","Yw2oU7X3uy","9y4lwt98iW","aFFssIjTwP","9XyT9jS1aj","24ARFOUYuF","6AFT0QbxXc","tAOsrQChxs","aFFssFGzgp","O3iyQThjNn",
+"LewvMzqH0W","IjTwP9eoRc","cQOnv8TxD7","ix74rZzJHW","PYBf4pmeCd","RpBQm6AFT0","S2DfuVNCPd","ydG8U14FLR","FPfSE5Mg9r","djsrvoVQp6",
+"dhSuHpv0i7","hSSvQjfREu","hSSvQK20wK","ciuWzW7cTs","WreyPZJTXH","IKxdL4W0Tl","StlDJSs0Zu","mX2GEpT8wu","OUYuFzQt6Q","POUYS580YD",
+"QClRLLDk6f","9y4lwxReec","FwEJzazIWp","WDVWJRxrsm","WmadAgjUTu","zQt6QY1mC0","RACujGWqqX","OHaBzMK07Y","fLNg8DcpWB","FcWrWWaim6",
+"QClRLlweGy","QnJ1SmX2GE","RzaZA7lUXZ","mX2GECxVEf","VerEAOUYuF","fqypyfLNg8","BbwgA8RCUA","ZhwG107n1c","VerEAuQIcz","FPfSEFPfSE",
+"QssNCksJby","Yh1hFBFkb8","KZamHAgJHQ","qaofNCIShG","RmDcrZhwG1","uN6r3KsjRK","gtCA5WreyP","dQ586ciuWz","iqv4kwiHrZ","WreyP5VZjS",
+"zY1GYqaofN","lkMUAxReec","RsQUqW3VFH","FjHXR618Di","zFgtBAXpwE","FxX9qLewvM","t98iWb29RJ","GXdoHG1RhS","rKDLJtaOXK","bgJAzd7vjM",
+"RxrsmogLgc","0PktIyluBx","5NammAmdQd","UlU3MlweGy","JKWYRlm0pD","9GXkXvLsmS","VjCZqQWxoT","oVQp6wiHrZ","xciqpCfgr3","Yh1hFciuWz",
+"d7vjM8hJdt","KsjRKpAhR1","i3pydjSjS3","dpe1vyluBx","In3NSiqv4k","2DREs8TxD7","uoStw4dEz6","OHaBzd85a9","M3zXLtuDyS","0Kyfs5nmWv",
+"uJScXY1mC0","a00b55Namm","zmLYDmz8gx","S77LHTwano","tjQxsjeskS","jiVBP0PktI","bZLvS29QAz","8RCUA24ARF","qQxHPNhXdu","RpBQmcmXIX",
+"9GXkXrKDLJ","7fsYM9y4lw","GWqqXvkCHH","VLTy6LbRTH","rhl0JHRxd8","FxX9qo8Uyd","brhlQIn3NS","3weIFvLsmS","64s8NB3qem","3otm6hSSvQ",
+"9iGoTZhwG1","2Yz7EIjTwP","prNT6aL6AJ","1LB1LAgJHQ","16lHc0BmCy","zHF1qS77LH","rhl0JfFDrJ","v8yFNAXpwE","In3NS0MR5X","WmadAiwzGk",
+"OHaBzRkQke","X6Pin5ZaEz","CqqaDoQ87r","zqH0WuTacx","0KyfsFcWrW","s93MlNcICA","lj07QuoStw","n8pJ9aDGtS","dhSuHtaOXK","RzaZAk85Ae",
+"5Mg9re6e4z","MmKGJHRxd8","dQ586cShY2","EdBKcuTacx","Yf2EcyofH3","zY1GYaFFss","NhXdu1j5L8","55rfBiqv4k","29QAzReKEW","9XyT9tvdkD",
+"gjUTuEdBKc","Ss0ZudhSuH","v2eC3hE1Ql","QChxsFLsph","oQ87rU3yw5","29QAz24ARF","i3pyd3weIF","zHF1qm4bxU","QbxXcEoToP","SWfouRsQUq",
+"ydG8UlXFOB","tuDySulk41","CK5W75Namm","LDk6fyluBx","tlILt580YD","gjUTuRmDcr","AOgEedhSuH","FVMxo24ARF","k85Aet98iW","8RCUAFGzgp",
+"MmsIo7fKYU","fcJOyMGlTF","mX2GElCMxy","07n1cK20wK","FPfSEix74r","hE1Qls93Ml","AgJHQiwzGk","FjHXRKsjRK","xXTI47X3uy","LbRTH8FmFH",
+"Q6LixGSQwj","tvdkDVLTy6","0ao3lZJTXH","7ku1pzHF1q","HfyNQ64s8N","RsQUqSjskQ","TCgPpbrhlQ","qQxHPpvgjS","lweGyQnJ1S","ogLgcxciqp",
+"MezSWzmLYD","vOqCE3otm6","FwEJzIn3NS","4W0Tl0ao3l","JRJQB8TxD7","a00b5fcwDa","dQ586bZLvS","Q6hMClj07Q","xciqpjtn0X","07n1c4QMc9",
+"580YDSmGzv","gIYvElXFOB","LDk6f0PktI","gtCA5ix74r","No0QbTXQ0Z","pmeCdJKWYR","iKqhr5Drn0","Pb1pat98iW","Zv7z0fcJOy","4QMc9e6e4z",
+"OHaBzK20wK","JIqXiwDajX","HzZT8m4bxU","ksJby07n1c","wiHrZZJTXH","KZamHhYBCK","LbRTHWaim6","CK5W7BFkb8","7X3uyZuDtD","blLA9uPX7G",
+"lweGy0YAGH","8FmFHPb1pa","vkCHHUvlv4","yToGWydG8U","iB08luAWyp","CK5W7Mm8si","FxX9qgjUTu","5ZaEzGSQwj","o8Uyd6q6L9","uTacxbZLvS",
+"e6e4znFqik","UlU3M5drc6","FnPFBS77LH","fFDrJP6bcg","bZLvSnlaBy","Mm8sicShY2","zY1GYvOqCE","NOHsz9y4lw","MGlTFaFFss","S2DfuXyPZN",
+"EoToPi3pyd","64s8Nni2v1","fmIK18xEKz","0YAGHfmIK1","8cVD3v2eC3","sqVrfHRxd8","cmXIXCqqaD","jSjS3yToGW","LbRTH07n1c","fqypybgJAz",
+"CK5W7zz4ZU","1v5hHCfgr3","HRxd8FnPFB","JIqXivkCHH","WreyPP6bcg","7fKYUiwzGk","3weIFtjQxs","WMiS3HP433","tjQxsQClRL","uQIcztaOXK",
+"JKWYRDLhzM","GXdoHyvOMI","tlILtIjTwP","GWqqXHlUbF","fcJOyIjTwP","RmDcrStlDJ","8cVD32hEEU","RpBQm8xEKz","fFDrJcQOnv","ZuDtDjSjS3",
+"pvgjSMkgy8","5iGN5L7cGc","aDGtSoQ87r","XflUqlm0pD","ZUnqtJIqXi","QworugdQsS","VerEAJ2mQi","rhl0JZuDtD","J2mQiaDGtS","C2IrcSmGzv",
+"hi5X7OUqFM","K20wKtuDyS","pT8wuQWxoT","s4786FFDui","jiVBPM3zXL","ECMvUnlaBy","atef2HlUbF","Mm8siZuDtD","l83UdKASQ8","fFDrJpmeCd",
+"hi5X7BFkb8","8cVD30h1b1","2DREsd7vjM","QssNC5iGN5","L7cGct98iW","wDajXmz8gx","8TxD7LDk6f","3weIFJRJQB","BGaQYNo0Qb","VNCPdWDVWJ",
+"WaWsvJKWYR","SjskQlsQGo","FNYIMhE1Ql","0Wr5yCK5W7","MGlTFvLsmS","3weIFlH1kt","SmGzvCp3mZ","fLNg8fcJOy","taOXK55rfB","QChxsNAFuw",
+"Chuy3aDGtS","ix74rwDajX","6AFT0uJScX","Nxx9VvkCHH","OUqFMaL6AJ","5NammCp3mZ","HzZT81v5hH","FLsphv1Hln","zqH0WKASQ8","8TxD7I7p2a",
+"QChxsS77LH","XflUqpmeCd","euZA50BmCy","OHaBzThjNn","K4GS8DG4sT","B3qemoVQp6","lCMxyMm8si","iB08l3otm6","5nmWvru4UG","S77LHCqqaD",
+"W7cTsMezSW","GrDg74dEz6","zQt6QIKxdL","QClRLdhSuH","ciuWzZv7z0","MGlTFfqypy","zqH0WpmeCd","7hyVvnnP8o","HP433ZUnqt","hSSvQS77LH",
+"d85a9MojnP","uTacxhe9IA","v2eC3mX2GE","No0QbpAhR1","e6e4zS2Dfu","Nxx9VMGlTF","TXQ0ZNo0Qb","l83Udi3pyd","LewvMUl4a1","KZamHzHF1q",
+"618DifFDrJ","i7WMQGWqqX","1LB1LmX2GE","2ZHdkhSSvQ","X6Pino8Uyd","7fKYUEoToP","AmdQd5IhmG","4W0TlIjTwP","ni2v18RCUA","5IhmGuLtKs",
+"9GXkXThjNn","7fKYU0PktI","Yh1hF3weIF","uQIcz5Mg9r","CK5W7uQIcz","iwzGkHzZT8","zbIYYJIqXi","ydG8UPOUYS","fFDrJYjB9t","4QMc9Y1mC0",
+"faHirjtn0X","zFgtB4W0Tl","tuDySCfgr3","i3pydqQxHP","0MR5Xix74r","WmadA0Wr5y","oGu6xwiHrZ","CqqaDzFgtB","5Mg9rFxX9q","zFgtB07n1c",
+"K4GS8cmXIX","QYxC0LewvM","ix74ruupzk","HzZT8vkCHH","s93Mlb29RJ","tvdkDXyPZN","uAWypuQIcz","SWfou8U2nU","KsjRKKASQ8","RmDcrWreyP",
+"I7p2ajiVBP","TXQ0ZHfyNQ","Yw2oUJXljW","2Yz7Ezz4ZU","tjQxsFNYIM","o8UydBGaQY","EoToPDLhzM","lXFOBcShY2","e6e4zEdBKc","4dEz68U2nU",
+"ZJTXH0BmCy","5Mg9rGrDg7","9iGoTUl4a1","yToGWzz4ZU","s4786d85a9","0MR5XhUTw7","CK5W7azIWp","MGlTF7fKYU","d7vjMS2Dfu","Nxx9Vd7vjM",
+"prNT6AkKTk","HRxd8gf8rI","EoToPHlUbF","580YD0Kyfs","l83UdCxVEf","XflUq0YAGH","QClRLFLsph","wiHrZh1zcH","Ul4a1xReec","W3VFHHP433",
+"oVQp6ThjNn","UmaEv0Kyfs","hYBCKPOUYS","FVMxohSSvQ","GXdoHD6rBy","qaofNnnP8o","euZA5fqypy","FPfSEfcwDa","GrDg7guMb8","x3LDe5IhmG",
+"9XyT9ThjNn","U3yw5qUJMd","HfyNQ7Ow5C","jiVBPMK07Y","JkzUnZzJHW","ydG8UbgJAz","0ao3lpAhR1","lCMxywiHrZ","aFFss8RCUA","Yh1hFVjCZq",
+"Y1mC0618Di","CqqaDK20wK","zqH0Wo8Uyd","uvf7ALDk6f","X6PincShY2","24ARFprNT6","djsrvRpBQm","tAOsrm4bxU","faHiruvf7A","X6PinZJTXH",
+"Q6hMC9iGoT","1v5hHQClRL","WreyPG1RhS","uupzk5IhmG","FjHXRqQxHP","CxVEf5Drn0","v8yFNWaWsv","azIWpx3LDe","cShY2SmGzv","hUTw7LbRTH",
+"Ss0Zu9y4lw","azIWpcQOnv","RBhp0Twano","HRxd82DREs","ydG8UVjCZq","1LB1LcmXIX","tuDyS0PktI","K20wKuTacx","i7WMQ4dEz6","zY1GY5nmWv",
+"MaJQsvkCHH","55rfBDG4sT","rz7Ut55rfB","okgRi5ZaEz","FFDui7ku1p","i3pydBGaQY","Waim60MR5X","8cVD3FxX9q","9XyT9HzZT8","fcJOy5VZjS",
+"FVMxoVLTy6","DQimpqUJMd","jeskSCqqaD","h1zcH9rlg9","b29RJVerEA","O3iyQD6rBy","ni2v1VjCZq","qUJMdX6Pin","KASQ8tuDyS","WaWsvs93Ml",
+"jzUqRjSjS3","7lUXZVLTy6","DcpWBSjskQ","8hJdtdpe1v","v8yFNYw2oU","8xEKz2ZHdk","VLTy607n1c","t59lRMkgy8","ru4UGlsQGo","TXQ0ZSWfou",
+"KASQ8jzUqR","OUYuFWaWsv","Chuy3Dz1R3","S2DfuVerEA","he9IAuZPqg","okgRi6AFT0","5IhmGK4GS8","5ZaEzlm0pD","FPfSEcL0aE","ZuDtDSbRYy",
+"AkKTkjzUqR","xXTI4y94nw","9GXkXfaHir","rKDLJOUqFM","t98iWYf2Ec","XflUqlH1kt","WreyPwDajX","UmaEvU3yw5","fmIK1okgRi","ReKEWcmXIX",
+"LbRTH580YD","hE1QlMm8si","iB08lDG4sT","lkMUAgIYvE","IjTwPFcWrW","uTacxZ4I1v","v8yFNlViBv","JkzUno8Uyd","oQ87rNhXdu","oGu6xNxx9V",
+"618DiGv3Fq","HzZT8ZuDtD","5ZaEzFxX9q","RxrsmIjTwP","GWqqXZJTXH","FwEJzZv7z0","ZUnqtkB5nP","n1pmOI7p2a","Y1mC0tAOsr","DQimpatef2",
+"o8UydwiHrZ","2Yz7EqaofN","dpe1vtAOsr","BbwgAx3LDe","WmadAReKEW","B3qemgdQsS","TCgPp8hJdt","pT8wunnP8o","hUTw7jSjS3","s7MxkWPmlx",
+"FGzgp5Namm","VerEAQChxs","lCMxySWfou","29QAzPb1pa","16lHcRzaZA","Dz1R3tjQxs","uJScXjzUqR","SbRYy9iGoT","tl72Wjtn0X","hi5X7YjB9t",
+"a00b5a00b5","uTacxrz7Ut","Q6LixMojnP","s93MllkMUA","QbxXcF6PT2","JJs5mUmaEv","cShY2QClRL","CNHmvciuWz","9eoRc5IhmG","5nmWvHlUbF",
+"gIYvERACuj","5ZaEzRsQUq","ECMvUbrhlQ","7fKYUWreyP","m4bxUnlaBy","lCMxyzY1GY","pT8wu5iGN5","5Nammru4UG","FGzgpXflUq","lsQGo55rfB",
+"jzUqRlweGy","lweGyzY1GY","MojnPY1mC0","qUJMdzHF1q","lpF6WZzJHW","3weIFGWqqX","G1RhSAmdQd","DG4sTLewvM","FPfSEyToGW","MaJQsECMvU",
+"2TRI7S2Dfu","uAWypW3VFH","AXpwEYjB9t","K20wK0h1b1","pAhR1cQOnv","ZJTXHZhwG1","s93Mlpv0i7","a00b5cQOnv","Qworum4bxU","taOXKDG4sT",
+"fLNg8XflUq","gdQsSTwano","L7cGcVerEA","uN6r35VZjS","oGu6xL7cGc","uN6r3uoStw","zz4ZU16lHc","8cVD3KZamH","RmDcrThjNn","d7vjMvOqCE",
+"s4786RpBQm","HzZT8oQ87r","tjQxsFnPFB","suY4xUl4a1","BCxeCBFkb8","RmDcrsqVrf","s4786KsjRK","uAWypzbIYY","pmeCdwDajX","n8pJ9fcJOy",
+"ksJbyPYBf4","QClRL1j5L8","cShY2TXQ0Z","aL6AJ1v5hH","rhl0JfcwDa","jtn0Xpv0i7","s93Mlaez9y","48cHLguMb8","faHiruAWyp","pvgjS45cIH",
+"PYBf4FjHXR","0YAGHxReec","M6qcGAOgEe","0h1b1pT8wu","GWqqXi7WMQ","yofH3VNCPd","AkKTkfcwDa","yEfy96q6L9","48cHLQ6hMC","SjskQS77LH",
+"bgJAzn8pJ9","vLsmSTa8f6","JRJQBUlU3M","e6e4zGWqqX","aez9ytvdkD","Ta8f6o8Uyd","tjQxsuLtKs","DG4sTpmeCd","6AFT0uvf7A","FNYIMt98iW",
+"2NslmwDajX","pAhR1ix74r","9y4lwxXTI4","x3LDeJXljW","GWqqX2TRI7","kB5nPzmLYD","soy9td7vjM","NAFuw2hEEU","zY1GYFNYIM","9iGoTQClRL",
+"RpBQm7hyVv","HP433WPmlx","FPfSEVNCPd","hUTw7okgRi","Ta8f65VZjS","tjQxsKsjRK","DQimpaDGtS","CdyBVe6e4z","JkzUnYw2oU","StlDJn1pmO",
+"ix74rulk41","FFDuiaL6AJ","618DilweGy","fcJOyK4GS8","QworuFGzgp","v1HlnuN6r3","QssNCSjskQ","hi5X7IjTwP","IBe8kv1Hln","VLTy6ni2v1",
+"7ku1pJXljW","HP433vOqCE","ni2v1uLtKs","gdQsS29QAz","5ZaEzZJTXH","zFgtBYjB9t","n8pJ9l83Ud","tl72WK20wK","6q6L9hE1Ql","FnPFBCdyBV",
+"BFkb8FFDui","zY1GY2TRI7","iB08lZ4I1v","uupzkb29RJ","qaofNQChxs","euZA5HzZT8","NAFuwLewvM","suY4xThjNn","7lUXZ48cHL","0Wr5yUmaEv",
+"nnP8ofLNg8","vOqCEdmoS7","Gv3FqyEfy9","FGzgpzY1GY","fmIK1lpF6W","In3NSWreyP","l83UdjfREu","7lUXZvLsmS","tl72WMGlTF","e6e4zk85Ae",
+"8cVD3LDk6f","EOE1ogjUTu","Cp3mZmz8gx","ni2v1I7p2a","ZzJHWyofH3","pFrrlzQt6Q","lpF6WjfREu","C2IrcokgRi","BGaQYU3yw5","bZLvSlsQGo",
+"l83Ud8RCUA","MK07Y8TxD7","soy9tgIYvE","jeskStjQxs","VIlwP7fKYU","ReKEWuQIcz","3weIFyofH3","dQ586YOfrY","4W0Tld85a9","Gv3FquQIcz",
+"GXdoHYjB9t","aDGtSKZamH","0KyfsTa8f6","FnPFBs7Mxk","ZJTXHkZANm","NcICAfaHir","QWxoT7fKYU","fFDrJSjskQ","dhSuHyofH3","xXTI4DG4sT",
+"qUJMd0ao3l","vOqCEEdBKc","SmGzvoQ87r","lkMUAnlaBy","dpe1vVLTy6","U3yw5iB08l","FhtglHRxd8","Q6hMCKASQ8","tAOsrC2Irc","dhSuH1v5hH",
+"tuDyS7ku1p","P6bcgAIYUu","i3pydv8yFN","OHaBzcmXIX","8TxD7e6e4z","djsrvYf2Ec","LewvMRzaZA","0KyfsQ6hMC","JkzUnrhl0J","uLtKs7X3uy",
+"IKxdLiB08l","gdQsSCK5W7","1j5L8d7vjM","7X3uyuAWyp","lH1ktd85a9","fcwDaVBjhz","5Mg9rWDVWJ","UlU3MPOUYS","AkKTk0h1b1","CdyBV5Drn0",
+"6q6L97hyVv","14FLRMm8si","d85a9QbxXc","gtCA5dQ586","VjCZqQ6hMC","e6e4zuN6r3","0Wr5yZhwG1","U3yw52ZHdk","QChxsfmIK1","3weIFF6PT2",
+"iB08le6e4z","Dz1R3ZJTXH","aL6AJsoy9t","9y4lwlCMxy","rz7Ut16lHc","4dEz6piJSk","NhXducmXIX","hUTw7SbRYy","bgJAzlsQGo","G1RhS64s8N",
+"DQimpuTacx","5VZjStaOXK","cQOnvx3LDe","azIWpdmoS7","VLTy6EoToP","2NslmhYBCK","1v5hHRkQke","pmeCdru4UG","rz7UtXyPZN","AIYUu2hEEU",
+"RzaZAM3zXL","x3LDeaFFss","Yw2oUAmdQd","azIWpFcWrW","gIYvE7fsYM","9iGoTReKEW","xReecSmGzv","v1HlnIn3NS","9eoRcrz7Ut","Vprf2v2eC3",
+"EoToPFcWrW","zz4ZUbgJAz","QClRLYjB9t","NhXdudjsrv","7fsYM6AFT0","hE1Qlk85Ae","b29RJ580YD","oVQp6pAhR1","0BmCyblLA9","Vprf25Mg9r",
+"PYBf4Uvlv4","2hEEUtaOXK","Ul4a1zY1GY","EOE1o7ku1p","Yh1hFtuDyS","16lHcU3yw5","CqqaDLewvM","tl72Ws7Mxk","RBhp0atef2","XflUqnFqik",
+"tjQxsJIqXi","CK5W7Zv7z0","5NammDLhzM","YjB9t07n1c","W7cTslCMxy","0Wr5ysqVrf","CIShGfcJOy","kB5nPKASQ8","48cHLlH1kt","CNHmvVIlwP",
+"cL0aEni2v1","brhlQIjTwP","QClRLBbwgA","RpBQmVerEA","aFFsshe9IA","s93Ml0PktI","QClRL618Di","pFrrl7X3uy","NOHsz8FmFH","s93Ml2TRI7",
+"2ZHdk55rfB","Rxrsmb29RJ","bgJAzlj07Q","iwzGkrhl0J","jtn0Xni2v1","qQxHPuvf7A","F6PT2mz8gx","ru4UGSmGzv","uQIcz2hEEU","FNYIMZJTXH",
+"uAWypfqypy","C2Irc2hEEU","Yf2EcOUYuF","bgJAzjtn0X","5Drn0tvdkD","zbIYY16lHc","POUYSQClRL","qaofNgdQsS","WreyPhUTw7","FjHXRiKqhr",
+"MmKGJuTacx","LDk6fzFgtB","16lHcKZamH","uPX7GWaim6","uQIczs7Mxk","VLTy6AOgEe","K20wKbgJAz","AgJHQtl72W","jSjS3he9IA","y94nwWmadA",
+"QbxXcC2Irc","DQimppT8wu","zbIYY9eoRc","t98iW7lUXZ","s4786gtCA5","ulk41EOE1o","No0Qbulk41","IjTwPCxVEf","3weIFa00b5","DLhzMoVQp6",
+"SbRYydmoS7","8U2nUBbwgA","v8yFN8cVD3","hYBCKFjHXR","Nxx9Vlm0pD","e6e4z8xEKz","cL0aENcICA","RxrsmD6rBy","S77LHdjsrv","RsQUqv8yFN",
+"lCMxy4dEz6","2Yz7EyluBx","D6rBygIYvE","lj07QvkCHH","AmdQd8TxD7","uvf7Arhl0J","iwzGkTXQ0Z","WmadAoVQp6","7X3uyPOUYS","Yw2oUoGu6x",
+"8U2nUlkMUA","wiHrZMkgy8","KZamHaFFss","taOXK5Namm","Nxx9VYjB9t","zHF1qJXljW","lXFOB7X3uy","AmdQdt59lR","J2mQiJJs5m","7fsYM5ZaEz",
+"SjskQGrDg7","RsQUqXflUq","8hJdt0ao3l","2Yz7Ev1Hln","5NammzY1GY","Oz8yZbrhlQ","Cfgr3cQOnv","SjskQ3otm6","5drc6RBhp0","EdBKc0Wr5y",
+"WreyPJJs5m","0PktI5iGN5","7fKYUECMvU","ZuDtDlkMUA","pT8wupv0i7","VjCZq24ARF","KZamHY1mC0","iKqhr8cVD3","29QAzsx5Gl","0MR5XCIShG",
+"uupzklsQGo","RACujJJs5m","jzUqR8xEKz","3weIFW7cTs","ZUnqtlH1kt","piJSkEOE1o","sqVrfjzUqR","Chuy3lH1kt","9y4lwfaHir","jzUqR7X3uy",
+"4dEz6No0Qb","SmGzvSbRYy","AXpwEaL6AJ","vkCHHmz8gx","n8pJ9SmGzv","9XyT9iqv4k","24ARFEoToP","fFDrJpvgjS","tuDySBbwgA","ZUnqtfcwDa",
+"o8UydFhtgl","Cp3mZUvlv4","uJScXjSjS3","t98iW5Namm","QnJ1SAOgEe","BbwgAfqypy","U3yw5Fhtgl","b29RJMezSW","he9IAEoToP","LewvM5VZjS",
+"Dz1R3VNCPd","2DREsbrhlQ","Kr8ys0BmCy","DcpWB8TxD7","qaofNpiJSk","0MR5Xsx5Gl","xXTI4atef2","v1HlnAOgEe","VBjhzoGu6x","uupzkIn3NS",
+"uN6r3ZhwG1","fLNg8IRh48","qaofNwDajX","pv0i7QssNC","BFkb8NhXdu","45cIHRzaZA","Z4I1vd85a9","Cfgr3tuDyS","ZUnqt45cIH","580YDTa8f6",
+"qQxHPn8pJ9","lj07QfLNg8","guMb8pFrrl","zz4ZUBGaQY","UlU3MpWiOs","1j5L8I7p2a","W3VFHGv3Fq","qQxHPyEfy9","WDVWJYOfrY","CxVEfgIYvE",
+"lpF6W4W0Tl","7hyVvb29RJ","IBe8kbZLvS","xReec580YD","1LB1LbrhlQ","FPfSEVLTy6","9GXkXJXljW","yluBxpT8wu","RkQkeh1zcH","7hyVvprNT6",
+"0ao3lhSSvQ","CxVEfsoy9t","0KyfsFhtgl","3otm6GWqqX","ZuDtDiwzGk","X6Pinv8yFN","S2DfuW7cTs","b29RJWaWsv","3weIF5nmWv","yToGWMaJQs",
+"FNYIM3otm6","RBhp0NcICA","xReec9GXkX","IKxdLoQ87r","6q6L9TXQ0Z","ru4UG5Mg9r","HlUbFLbRTH","CIShGpiJSk","nlaBytvdkD","ThjNnTwano",
+"Dz1R3POUYS","NcICAdmoS7","uAWypQWxoT","GSQwj5Namm","JIqXiuPX7G","pT8wuVLTy6","cQOnvECMvU","P6bcgFwEJz","wDajXuLtKs","IBe8kuJScX",
+"vOqCEG1RhS","WaWsvBGaQY","gdQsSQbxXc","iqv4kpT8wu","rhl0JECMvU","lViBvvOqCE","OHaBzoGu6x","s93MlmX2GE","I7p2a8RCUA","faHirK4GS8",
+"SbRYyY1mC0","618DiFcWrW","EdBKcDcpWB","BpYhVWPmlx","pmeCduAWyp","prNT6In3NS","iKqhrwiHrZ","SjskQpWiOs","2NslmEOE1o","cmXIXlpF6W",
+"s93Mli3pyd","lXFOBcL0aE","djsrv0MR5X","v8yFNfFDrJ","LbRTHvLsmS","9y4lwCK5W7","zz4ZUFwEJz","QChxsReKEW","zFgtBsuY4x","tvdkDnlaBy",
+"TCgPprz7Ut","RsQUquZPqg","tuDySnFqik","QWxoTCqqaD","RmDcrt98iW","7X3uykZANm","Ta8f6In3NS","B3qemlm0pD","sqVrfYjB9t","YOfrYs93Ml",
+"DQimpuZPqg","zQt6Q16lHc","hi5X7iqv4k","i3pydYf2Ec","zQt6Q8cVD3","i3pydWmadA","5Drn0S77LH","OHaBz9rlg9","5Mg9rVerEA","ix74rMojnP",
+"he9IApFrrl","HlUbF6AFT0","xciqpqUJMd","2TRI7v2eC3","iB08lM6qcG","7hyVvuAWyp","HP433MmsIo","16lHcMezSW","In3NSogLgc","pT8wuU3yw5",
+"7fsYMDQimp","xciqp8xEKz","qQxHPxReec","1j5L8RzaZA","FLsphJkzUn","2hEEUWMiS3","HP4335Drn0","yEfy9Yh1hF","RmDcrPYBf4","azIWpv8yFN",
+"3weIFHP433","dQ5865nmWv","2Yz7EogLgc","fLNg89XyT9","7fKYUGXdoH","TCgPpEoToP","oGu6xlViBv","HfyNQtuDyS","Ta8f6ni2v1","cL0aEGrDg7",
+"Pb1paFnPFB","ReKEWmz8gx","vkCHH5ZaEz","RpBQmRsQUq","WmadAydG8U","8TxD7uQIcz","NhXduD6rBy","suY4xa00b5","5ZaEzKZamH","WDVWJm4bxU",
+"NcICACIShG","QYxC0zqH0W","Pb1paZ4I1v","cShY26q6L9","guMb8BCxeC","he9IAFnPFB","bZLvS5ZaEz","Dz1R3jeskS","16lHcjeskS","ThjNngf8rI",
+"ydG8U0PktI","ni2v10YAGH","gf8rI8FmFH","blLA9BGaQY","nnP8o5drc6","Yh1hFUvlv4","580YDSWfou","gjUTunFqik","QClRLl83Ud","ogLgcpv0i7",
+"Ul4a1UmaEv","2ZHdkOz8yZ","5Mg9rqaofN","Pb1pa2ZHdk","DLhzMOxWIH","yToGWaDGtS","5drc65iGN5","BCxeC8FmFH","oGu6xd7vjM","h1zcH5drc6",
+"okgRiIKxdL","XyPZN5Mg9r","fLNg8Uvlv4","Cfgr3618Di","ni2v1FLsph","FcWrWSs0Zu","K20wKYw2oU","8cVD3Mm8si","Q6LixSmGzv","jeskS8hJdt",
+"AXpwEyEfy9","ECMvUQWxoT","OUqFMIn3NS","ECMvUZzJHW","uPX7Ga00b5","VNCPdeuZA5","NOHsz1LB1L","PYBf4lweGy","P6bcgkZANm","guMb8VerEA",
+"ogLgc3weIF","yvOMI2ZHdk","Mm8siReKEW","CK5W73weIF","0Wr5yv2eC3","BFkb88xEKz","dhSuH0ao3l","FFDuilkMUA","X6Pin2hEEU","BFkb8sx5Gl",
+"EOE1olpF6W","aez9yyToGW","2NslmJJs5m","zbIYYSWfou","ru4UGF6PT2","TwanofmIK1","aFFssRBhp0","M6qcGfcJOy","fqypyfmIK1","Ss0Zuuvf7A",
+"QworuJKWYR","FNYIMogLgc","rz7Ut7fKYU","Ss0ZufcwDa","k85AexXTI4","nnP8obgJAz","Cp3mZlH1kt","AIYUuCqqaD","gtCA5dhSuH","7X3uyD6rBy",
+"LDk6fXflUq","FPfSEHP433","580YDF6PT2","55rfBjeskS","DG4sTFNYIM","vkCHH0h1b1","gIYvEOUqFM","yluBxZ4I1v","fcwDa45cIH","taOXKX6Pin",
+"64s8N14FLR","pT8wu0BmCy","Uvlv4pv0i7","bZLvSgf8rI","i3pydpv0i7","blLA9gIYvE","8xEKzC2Irc","FxX9q5IhmG","CqqaDMezSW","i7WMQpmeCd",
+"lH1ktfmIK1","VBjhzRpBQm","7Ow5CQ6hMC","2ZHdkMojnP","OUqFMC2Irc","v8yFNQssNC","fqypy45cIH","v8yFNni2v1","blLA9C2Irc","piJSkvOqCE",
+"d85a9QYxC0","YjB9thYBCK","7lUXZtl72W","DcpWBv2eC3","cL0aEpmeCd","BFkb8djsrv","s93Ml0YAGH","oVQp6AXpwE","QWxoTEdBKc","OUYuFh1zcH",
+"G1RhSvLsmS","ZhwG1JJs5m","wiHrZkB5nP","ECMvUQssNC","Ul4a1KASQ8","BFkb85iGN5","FxX9qM3zXL","l83UdI7p2a","MmKGJZuDtD","hUTw7UlU3M",
+"WmadAO3iyQ","b29RJ5Mg9r","uoStw0Wr5y","2ZHdkVjCZq","djsrv9XyT9","zY1GYk85Ae","BCxeCMkgy8","CK5W7fcwDa","kZANmjfREu","qQxHPBbwgA",
+"n1pmOGWqqX","Y1mC0taOXK","K4GS8OUqFM","HfyNQFjHXR","ZJTXHGv3Fq","qUJMd5Mg9r","WDVWJ0BmCy","SWfouiwzGk","piJSkix74r","4QMc9v8yFN",
+"ix74r7ku1p","vLsmSFnPFB","iqv4k9XyT9","UmaEvtuDyS","ni2v116lHc","SjskQThjNn","s93MlGWqqX","nlaByMmKGJ","hi5X7Cp3mZ","uN6r38xEKz",
+"n8pJ90YAGH","hSSvQChuy3","Cfgr3PYBf4","yvOMIPb1pa","NAFuwFLsph","KZamHuupzk","mz8gx1LB1L","QChxs8xEKz","pv0i7fmIK1","EoToPVIlwP",
+"atef2uoStw","hYBCKlH1kt","RzaZAprNT6","uAWypIBe8k","M3zXLpvgjS","h1zcHaFFss","RBhp0uAWyp","n1pmOSWfou","Zv7z0Cfgr3","GWqqXOz8yZ",
+"MezSWJRJQB","RsQUqWMiS3","MezSWEoToP","mX2GEiB08l","cmXIXtjQxs","IRh48LDk6f","s93Ml5ZaEz","wDajXQssNC","BGaQYDcpWB","jtn0XjS1aj",
+"JkzUnEOE1o","HzZT8MmKGJ","B3qemzbIYY","UmaEvJJs5m","K4GS8POUYS","IRh485Drn0","4dEz6cQOnv","GXdoHqaofN","ReKEWQworu","pvgjS0Wr5y",
+"K20wKtaOXK","cQOnvMK07Y","Oz8yZKZamH","yvOMIMaJQs","iqv4kGSQwj","3otm67fKYU","0Kyfs7lUXZ","0ao3l2TRI7","24ARFuPX7G","9rlg9FGzgp",
+"MaJQsMaJQs","Z4I1vS77LH","WaWsvsuY4x","aDGtS5IhmG","Z4I1v0Kyfs","jiVBPtAOsr","Zv7z0VBjhz","RBhp0uLtKs","iwzGkzY1GY","VIlwPWDVWJ",
+"dQ586Mkgy8","5ZaEzAIYUu","uAWypP6bcg","zbIYY0ao3l","IRh48Chuy3","hE1Ql7Ow5C","CxVEfydG8U","cL0aE2hEEU","ru4UGWmadA","s4786brhlQ",
+"7Ow5CCdyBV","hYBCK1v5hH","2DREsG1RhS","ksJbyLewvM","GWqqX2Nslm","POUYSSWfou","64s8N2Yz7E","zQt6QS77LH","bgJAzaDGtS","WaWsvnFqik",
+"UmaEvhi5X7","brhlQY1mC0","jtn0X9iGoT","24ARFG1RhS","HRxd82hEEU","0KyfskZANm","Yw2oUMkgy8","rz7UtJkzUn","piJSkv1Hln","NcICALbRTH",
+"rhl0JVerEA","tlILtBbwgA","ZUnqtAkKTk","WPmlxMaJQs","fqypyQClRL","AOgEeuN6r3","d7vjMK20wK","9y4lwQClRL","TCgPpI7p2a","WmadA5iGN5",
+"xReecG1RhS","FPfSEjeskS","ThjNnLbRTH","WaWsvpAhR1","WPmlxh1zcH","HfyNQhe9IA","FwEJzyofH3","S77LHC2Irc","580YDiqv4k","jzUqRFxX9q",
+"In3NSECMvU","qaofN5nmWv","OHaBzlViBv","QClRLQ6Lix","5Mg9rdjsrv","vkCHH2hEEU","S77LHIjTwP","o8UydZv7z0","t98iWjS1aj","FwEJzeuZA5",
+"fmIK1BpYhV","mz8gxfmIK1","Gv3FqY1mC0","AXpwEFFDui","Q6hMC0YAGH","7hyVvM3zXL","StlDJMK07Y","lj07Q8cVD3","6AFT0IjTwP","s93MlUlU3M",
+"CqqaDazIWp","SWfoudQ586","BbwgAWPmlx","FwEJz4W0Tl","5VZjSwiHrZ","F6PT2FVMxo","KZamHi3pyd","OHaBzWreyP","ogLgcRmDcr","RkQkeRBhp0",
+"pAhR1v1Hln","O3iyQhE1Ql","zbIYYWaWsv","tjQxsHzZT8","0YAGHni2v1","azIWppv0i7","lCMxyZUnqt","HRxd8PYBf4","JRJQBjSjS3","OUqFMFcWrW",
+"Z4I1vm4bxU","tAOsroGu6x","LewvMxciqp","55rfBFVMxo","FGzgpuupzk","0MR5XGrDg7","I7p2ao8Uyd","yvOMIDQimp","AXpwEBpYhV","dpe1v29QAz",
+"HzZT8QWxoT","GrDg7zqH0W","Waim6FNYIM","1v5hH5nmWv","XyPZN5nmWv","JRJQBEoToP","WMiS3VIlwP","SWfouD6rBy","lj07Q7hyVv","nlaByFVMxo",
+"n8pJ9h1zcH","AOgEeCK5W7","Cp3mZIRh48","TCgPphe9IA","RmDcriwzGk","SjskQI7p2a","Ta8f6okgRi","In3NS8xEKz","zz4ZU55rfB","PYBf48xEKz",
+"No0QbDcpWB","JRJQBaFFss","IjTwPjeskS","yofH3e6e4z","xciqpLewvM","zFgtBpvgjS","rhl0JbgJAz","uJScXvkCHH","uN6r3Fhtgl","5NammqQxHP",
+"AIYUuiwzGk","jiVBPGWqqX","iqv4kXyPZN","0PktIJJs5m","WreyPNo0Qb","9XyT9Q6Lix","rz7UtEOE1o","Gv3FqCNHmv","DQimpprNT6","sx5GlEoToP",
+"EdBKcazIWp","2NslmkZANm","MmsIoCfgr3","rz7Uty94nw","uvf7AOHaBz","8TxD7he9IA","AIYUusx5Gl","CK5W73otm6","Y1mC0KZamH","he9IARsQUq",
+"6q6L9yvOMI","tl72WFNYIM","8hJdtYh1hF","lkMUAFjHXR","hSSvQWaWsv","OHaBzlCMxy","FGzgplweGy","ZhwG1FnPFB","S77LHUmaEv","CxVEfUvlv4",
+"8TxD7atef2","In3NSZJTXH","9y4lwSjskQ","VerEA6q6L9","Gv3FqFxX9q","NhXduYOfrY","qQxHP7X3uy","jeskSAIYUu","TXQ0ZF6PT2","FPfSEjiVBP",
+"QWxoT8TxD7","uupzkAIYUu","FPfSENo0Qb","Y1mC0prNT6","uZPqgv8yFN","RACuj5iGN5","v2eC3HzZT8","7Ow5CCNHmv","2TRI75iGN5","rhl0JYw2oU",
+"WmadAuN6r3","BpYhVC2Irc","uQIczgjUTu","s7MxkqUJMd","UlU3MvLsmS","5Namm7hyVv","48cHLNcICA","FGzgplj07Q","FLsphaL6AJ","ydG8UNo0Qb",
+"aez9yBbwgA","64s8NydG8U","s7MxkpAhR1","YjB9tHRxd8","Pb1patuDyS","0KyfsMezSW","DcpWBuN6r3","cShY2Cfgr3","azIWpG1RhS","Oz8yZiKqhr",
+"C2Irc4dEz6","uoStwCdyBV","0Wr5yguMb8","Yw2oUJIqXi","In3NSv8yFN","FPfSEblLA9","X6PinCxVEf","pAhR1pvgjS","48cHLogLgc","ulk41blLA9",
+"NhXdu29QAz","bgJAzjeskS","9GXkXe6e4z","v1HlnVerEA","45cIHAOgEe","qUJMdSs0Zu","FwEJzbgJAz","s93Ml5Mg9r","UlU3MZUnqt","EdBKcyToGW",
+"pmeCdhE1Ql","BbwgAsx5Gl","EoToP9y4lw","5IhmGfFDrJ","618DiQYxC0","i7WMQRpBQm","JRJQB55rfB","L7cGcTa8f6","y94nwJ2mQi","guMb88RCUA",
+"8cVD3Y1mC0","NcICA5VZjS","AIYUuDz1R3","580YD618Di","2Yz7EhSSvQ","Yw2oU6q6L9","fqypyNxx9V","dQ586rhl0J","S77LHsuY4x","EOE1oRkQke",
+"B3qemaFFss","ni2v1FNYIM","zqH0WfcwDa","5VZjS5nmWv","4QMc9qQxHP","pv0i7SmGzv","he9IAzFgtB","lweGyZJTXH","KZamHzQt6Q","dQ586yofH3",
+"suY4x16lHc","qUJMdVprf2","RACujAXpwE","lViBvIn3NS","GrDg7he9IA","dmoS7hUTw7","5ZaEzWDVWJ","yvOMIIjTwP","WDVWJZJTXH","n1pmOiB08l",
+"VLTy6vkCHH","7Ow5C9XyT9","WmadAMK07Y","pmeCdhYBCK","UlU3MMmsIo","JRJQBP6bcg","LDk6faL6AJ","djsrvhi5X7","mz8gxOHaBz","gjUTu8FmFH",
+"zHF1q5ZaEz","xReecNhXdu","ZuDtD618Di","sqVrfWaim6","HRxd82TRI7","5drc6pFrrl","ZJTXHaDGtS","7lUXZuJScX","bgJAzVerEA","zHF1qWDVWJ",
+"7Ow5CGrDg7","vOqCElj07Q","zbIYYfcwDa","QWxoTzFgtB","P6bcgv2eC3","G1RhSuvf7A","fFDrJQChxs","h1zcHD6rBy","xXTI4cL0aE","Yh1hFKsjRK",
+"JJs5muQIcz","MK07YZuDtD","BGaQY2hEEU","FVMxolweGy","dmoS7Zv7z0","s7MxkuZPqg","zHF1qpT8wu","CdyBVlm0pD","i3pydokgRi","OUqFMCIShG",
+"RpBQmVNCPd","7hyVvWaWsv","QbxXculk41","ciuWzpT8wu","C2IrcPb1pa","FNYIMReKEW","v2eC3D6rBy","v2eC3Yf2Ec","RmDcr55rfB","OxWIHAXpwE",
+"0PktIs7Mxk","ZJTXHMm8si","AOgEek85Ae","piJSkVerEA","HfyNQEOE1o","hYBCK2Yz7E","RpBQmtl72W","ksJbyjiVBP","MojnP6q6L9","WDVWJUmaEv",
+"0MR5XYOfrY","jtn0XFjHXR","No0QbRpBQm","uoStwPOUYS","uLtKs7lUXZ","POUYSpAhR1","RBhp0faHir","JIqXi7Ow5C","uLtKs5VZjS","AOgEe2hEEU",
+"W3VFHn1pmO","fcJOy1v5hH","bZLvSEOE1o","jzUqRQChxs","tlILtFnPFB","mX2GEStlDJ","RxrsmIRh48","1j5L8aez9y","FLsphjiVBP","QbxXcSWfou",
+"SmGzvprNT6","HzZT8U3yw5","yvOMIEOE1o","8cVD37ku1p","K4GS8M6qcG","J2mQiP6bcg","P6bcgW3VFH","nnP8o2TRI7","5drc6ZJTXH","MGlTFNhXdu",
+"lsQGoWMiS3","In3NSWmadA","pWiOsGv3Fq","24ARF0h1b1","piJSk5Drn0","VIlwPtlILt","iKqhrW3VFH","Yw2oU2ZHdk","nnP8oMezSW","07n1cVNCPd",
+"pT8wuSjskQ","OxWIHfaHir","wDajXLewvM","QChxsl83Ud","DLhzM0Kyfs","l83UdZzJHW","0ao3lNxx9V","bgJAzcQOnv","FnPFB618Di","EdBKcs93Ml",
+"oGu6xHRxd8","7Ow5ClweGy","FxX9qVBjhz","2TRI7d85a9","BbwgAzqH0W","aFFssydG8U","y94nwk85Ae","JKWYRpAhR1","zz4ZUJXljW","AXpwEaFFss",
+"FFDuiSWfou","ZhwG18xEKz","ciuWzQ6Lix","XflUqdQ586","t98iWQ6Lix","S2DfuGSQwj","ECMvUFFDui","RsQUq2Yz7E","5Mg9roGu6x","K20wKo8Uyd",
+"JRJQB7ku1p","zQt6QDz1R3","h1zcHzbIYY","YOfrYVjCZq","TCgPprhl0J","nlaByHRxd8","LDk6fY1mC0","oVQp6HRxd8","C2IrcydG8U","pvgjSBFkb8",
+"tuDySlViBv","yvOMIaFFss","Ss0ZuhYBCK","29QAzvOqCE","SWfouZJTXH","4W0Tl2hEEU","WreyPjSjS3","Zv7z0cQOnv","JJs5mJRJQB","v8yFNB3qem",
+"P6bcgzbIYY","WMiS37hyVv","v1HlnJkzUn","bZLvSjtn0X","FFDuiy94nw","VNCPdIKxdL","QnJ1SIjTwP","pvgjSMezSW","djsrvzQt6Q","VIlwPKASQ8",
+"CdyBVoVQp6","KASQ8YjB9t","5ZaEzrKDLJ","Yw2oUiB08l","JRJQBGrDg7","MmsIoNo0Qb","zz4ZUNOHsz","Oz8yZfcwDa","x3LDehSSvQ","jfREun8pJ9",
+"VNCPdpFrrl","AIYUu5drc6","FLsphs7Mxk","nlaByfcwDa","atef2CqqaD","No0QbCp3mZ","IRh48CxVEf","jfREuTXQ0Z","AIYUuGv3Fq","oVQp6sx5Gl",
+"sqVrfLDk6f","n1pmODLhzM","FcWrWJKWYR","P6bcgThjNn","GrDg7PYBf4","sx5GltuDyS","55rfBcShY2","uTacx0PktI","xciqppFrrl","MojnPPb1pa",
+"cShY2lj07Q","7fsYMCK5W7","7fsYMhYBCK","fFDrJwiHrZ","lViBvKASQ8","5NammFPfSE","DG4sTEoToP","7lUXZ6AFT0","Z4I1voVQp6","B3qemD6rBy",
+"s93MlSmGzv","B3qemHfyNQ","xReecyEfy9","v2eC3CNHmv","8hJdtAmdQd","soy9tQ6hMC","KsjRK0YAGH","29QAzbrhlQ","aez9yzHF1q","IjTwPfcwDa",
+"ZJTXHXflUq","1LB1LjzUqR","i3pydzQt6Q","2NslmAmdQd","VLTy6OHaBz","9eoRchUTw7","9eoRc8cVD3","WDVWJguMb8","vOqCEDz1R3","nlaBy5IhmG",
+"VNCPdlj07Q","O3iyQhSSvQ","tAOsroQ87r","lXFOBP6bcg","JKWYRFGzgp","Cfgr3CK5W7","FLsphGWqqX","lCMxy1v5hH","TCgPpBbwgA","4W0Tli3pyd",
+"FFDuiSmGzv","uAWypTCgPp","L7cGcd85a9","Waim6U3yw5","M6qcGksJby","AXpwE8cVD3","OUqFM7X3uy","Dz1R3DQimp","CK5W7lkMUA","lViBvsx5Gl",
+"2Yz7EKsjRK","KASQ8Y1mC0","K20wKMkgy8","y94nwQ6hMC","uQIczuZPqg","xXTI4zHF1q","7hyVvru4UG","FGzgpRACuj","lXFOBCK5W7","uLtKsD6rBy",
+"5Drn0JXljW","ThjNnZhwG1","580YDksJby","8xEKznnP8o","pWiOs2TRI7","l83UdJkzUn","Pb1pa8cVD3","KsjRKpiJSk","Q6LixAIYUu","9rlg9y94nw",
+"K20wKulk41","EoToP9XyT9","OUqFMaez9y","ciuWzkZANm","vkCHHrKDLJ","HfyNQoVQp6","S2Dfudjsrv","IRh48BFkb8","K20wKk85Ae","v8yFNQbxXc",
+"YjB9tlweGy","guMb8hi5X7","ix74rrKDLJ","9rlg9NcICA","lViBv2Nslm","lCMxyRACuj","nnP8oaez9y","7hyVvBCxeC","FLsphQworu","FNYIMatef2",
+"ZJTXHYh1hF","F6PT28TxD7","lCMxyvOqCE","45cIHFGzgp","jtn0XblLA9","NAFuw7lUXZ","uQIczl83Ud","mz8gx0ao3l","UmaEv5drc6","MK07Y5IhmG",
+"pv0i7nFqik","SmGzvNOHsz","5VZjSEdBKc","ru4UGTCgPp","pmeCdhUTw7","taOXKQ6Lix","s4786fmIK1","WMiS3RACuj","uLtKsDLhzM","vLsmSyEfy9",
+"tAOsrdQ586","TCgPpCp3mZ","S77LH5IhmG","fcwDa1j5L8","0PktIxXTI4","xReecm4bxU","0h1b1qaofN","fFDrJNOHsz","MmKGJfqypy","kZANmgdQsS",
+"HlUbF3otm6","i7WMQn8pJ9","Yh1hF4QMc9","uZPqgIn3NS","7Ow5Ck85Ae","y94nwhE1Ql","hE1QlazIWp","ni2v1StlDJ","Oz8yZi7WMQ","5iGN5O3iyQ",
+"zqH0W2TRI7","TwanofFDrJ","cmXIXBCxeC","cmXIX24ARF","zFgtBrhl0J","zY1GYD6rBy","Oz8yZThjNn","VLTy6TCgPp","QYxC0ZhwG1","QworuQ6hMC",
+"b29RJJRJQB","ksJbyUvlv4","0ao3lzFgtB","FVMxo0ao3l","IKxdL64s8N","Yf2EcAgJHQ","dQ586dmoS7","VjCZqSbRYy","ogLgczHF1q","KZamHCfgr3",
+"lViBv7fsYM","xciqp0Kyfs","yEfy9ZuDtD","s7Mxk9rlg9","1LB1LOxWIH","5nmWv7lUXZ","d85a9dpe1v","soy9tbZLvS","ogLgc7lUXZ","K20wKpvgjS",
+"he9IA0BmCy","ogLgc4W0Tl","X6PinuQIcz","BGaQY29QAz","DG4sT8FmFH","IKxdLCIShG","nFqikNhXdu","fqypylpF6W","29QAz2TRI7","580YDlj07Q",
+"iKqhrh1zcH","1v5hHxXTI4","wDajXIKxdL","CqqaDfmIK1","dpe1vcmXIX","OUYuFaFFss","4dEz6VBjhz","RkQkeZuDtD","AkKTkhSSvQ","CNHmvMojnP",
+"1LB1LC2Irc","Yw2oUs93Ml","SbRYyI7p2a","tAOsriB08l","Ss0ZuVjCZq","soy9tuN6r3","lH1ktjS1aj","gdQsSRACuj","CdyBVulk41","In3NSEoToP",
+"GSQwjS2Dfu","ulk41No0Qb","ogLgcgIYvE","1v5hHTXQ0Z","OUYuFW7cTs","55rfBs93Ml","ru4UGUl4a1","45cIH5nmWv","lH1ktkZANm","vLsmSnnP8o",
+"WaWsvCfgr3","POUYS7lUXZ","K4GS8ulk41","AmdQdcL0aE","OUqFMHP433","0BmCyuoStw","gtCA5guMb8","zmLYDhe9IA","5IhmGTCgPp","JKWYRPOUYS",
+"Uvlv4l83Ud","ydG8UjzUqR","8TxD7hYBCK","qQxHPK4GS8","UmaEvZv7z0","s4786lCMxy","2TRI7zqH0W","7lUXZ5iGN5","ZJTXHCp3mZ","v8yFN0BmCy",
+"pT8wuBpYhV","Cp3mZMezSW","5ZaEzKsjRK","zz4ZUoQ87r","RBhp0F6PT2","StlDJd85a9","Vprf2S2Dfu","iKqhrd85a9","MezSWlViBv","9iGoTBFkb8",
+"bgJAzJRJQB","X6Pin7fsYM","n1pmOFwEJz","XflUqhe9IA","ogLgcgf8rI","FhtglRsQUq","uN6r3soy9t","tlILttAOsr","Z4I1vlH1kt","ThjNnS2Dfu",
+"07n1czFgtB","l83UdX6Pin","hUTw7OUYuF","Oz8yZXflUq","U3yw57Ow5C","CIShGcQOnv","uQIczsuY4x","Pb1papWiOs","AXpwE9XyT9","nFqikBpYhV",
+"7fsYMJKWYR","IjTwPAOgEe","CNHmvb29RJ","aDGtSjtn0X","rKDLJoVQp6","G1RhSfLNg8","Yw2oUMojnP","IBe8kW3VFH","IKxdLpWiOs","2Yz7EMaJQs",
+"8TxD7RmDcr","k85Ae8cVD3","24ARFChuy3","cShY2gjUTu","BFkb87hyVv","Yh1hFCNHmv","ksJby14FLR","Chuy3fcwDa","faHirNcICA","VjCZq8xEKz",
+"KsjRKkZANm","2hEEUfFDrJ","tvdkDfcJOy","3otm6tl72W","NhXdus4786","i3pydHfyNQ","b29RJK4GS8","G1RhSL7cGc","FLsphZ4I1v","P6bcgpAhR1",
+"8cVD3AXpwE","AkKTkM6qcG","BbwgAF6PT2","9XyT9FjHXR","zmLYDjS1aj","CK5W7HlUbF","JkzUnJJs5m","VNCPdlm0pD","5Nammi7WMQ","4QMc91LB1L",
+"DG4sTlm0pD","oGu6xoQ87r","RpBQmv8yFN","GSQwj29QAz","brhlQZ4I1v","45cIHDz1R3","jiVBPZUnqt","TwanoVerEA","JXljW14FLR","W3VFHpmeCd",
+"ydG8UdhSuH","uN6r3uJScX","VIlwP0ao3l","MaJQsKr8ys","8hJdtRxrsm","tuDyS0YAGH","vLsmStl72W","s4786y94nw","29QAzWaWsv","HP433QnJ1S",
+"S2DfuFLsph","s93MlCK5W7","zqH0WYf2Ec","9XyT9xXTI4","he9IAbrhlQ","vLsmSRmDcr","jfREuECMvU","Mm8siMK07Y","8cVD3lpF6W","DQimpYf2Ec",
+"gIYvEKsjRK","zqH0WD6rBy","cQOnv8FmFH","zmLYDEoToP","WMiS3TXQ0Z","dQ586atef2","0PktIm4bxU","In3NSFcWrW","29QAzMK07Y","s47862DREs",
+"14FLRzFgtB","vOqCEP6bcg","LDk6fpWiOs","IRh487hyVv","W7cTs2hEEU","e6e4zhi5X7","24ARF2TRI7","guMb8v2eC3","SjskQ8FmFH","4W0TlM6qcG",
+"yluBxv8yFN","SmGzvdpe1v","brhlQiwzGk","ReKEWqUJMd","IBe8kuvf7A","JkzUnjeskS","RmDcrh1zcH","KASQ8Gv3Fq","7ku1pCfgr3","lsQGo1LB1L",
+"lm0pDFxX9q","LDk6fLbRTH","CIShGEdBKc","07n1c7ku1p","gjUTuOUYuF","CqqaDdQ586","fmIK11LB1L","iqv4kQbxXc","cQOnvCqqaD","uJScXAgJHQ",
+"ZhwG1uAWyp","Waim6jeskS","6q6L94W0Tl","AkKTk2DREs","LewvMMmKGJ","RBhp0StlDJ","cmXIXS2Dfu","HRxd8Fhtgl","FjHXRTXQ0Z","pmeCdaez9y",
+"FnPFBBFkb8","F6PT27Ow5C","JkzUnksJby","OHaBz1LB1L","7hyVvblLA9","QChxsxReec","xciqprhl0J","ogLgcJIqXi","JXljWbrhlQ","WDVWJyvOMI",
+"WreyPM6qcG","a00b5mX2GE","fFDrJ0MR5X","ZuDtDWMiS3","zHF1quPX7G","Ul4a1zz4ZU","jtn0XReKEW","W7cTsMojnP","XflUqB3qem","JJs5m6AFT0",
+"3otm6JkzUn","TCgPppvgjS","uN6r3Oz8yZ","uTacxQ6hMC","QbxXc3otm6","RsQUqt98iW","uupzkh1zcH","Gv3FqhYBCK","yToGWqQxHP","4QMc9azIWp",
+"580YD0MR5X","CqqaDMm8si","jiVBPAkKTk","SmGzvDcpWB","Y1mC0X6Pin","ReKEWbrhlQ","taOXKfcJOy","5NammCdyBV","BpYhVbgJAz","oVQp6Vprf2",
+"d85a9VIlwP","7fKYUMmsIo","RBhp0v2eC3","L7cGctjQxs","3otm6v1Hln","cL0aEb29RJ","FFDuiJRJQB","VerEA1v5hH","OxWIHMojnP","SWfout59lR",
+"wiHrZhSSvQ","vLsmSvLsmS","hi5X7lXFOB","Cfgr3QbxXc","oVQp6U3yw5","55rfBFnPFB","GSQwjd7vjM","F6PT2FGzgp","aez9y7fKYU","ciuWz5nmWv",
+"8TxD72ZHdk","VLTy6MezSW","BFkb8taOXK","AXpwECK5W7","Ul4a1QssNC","lViBvuAWyp","Zv7z0iwzGk","wiHrZgIYvE","MezSWxReec","07n1cUlU3M",
+"sqVrfVLTy6","Vprf2pvgjS","IRh48No0Qb","BCxeCciuWz","HfyNQfmIK1","Mkgy8iKqhr","azIWpBCxeC","No0QbTCgPp","KsjRKeuZA5","TXQ0Z1v5hH",
+"KZamHQWxoT","o8UydOz8yZ","Rxrsm2Nslm","LDk6fpFrrl","aFFsslsQGo","cL0aE1LB1L","7X3uyGv3Fq","DcpWBulk41","FnPFBKASQ8","LewvMZhwG1",
+"2DREsWmadA","IBe8kRxrsm","zbIYYmz8gx","iqv4kqQxHP","Yw2oU8TxD7","WreyPn8pJ9","Ul4a1CK5W7","lCMxyAmdQd","ThjNnjeskS","WMiS3rKDLJ",
+"Gv3FqZhwG1","SbRYy48cHL","fmIK1DLhzM","8RCUAVIlwP","FnPFB45cIH","UmaEvNcICA","618Diru4UG","KZamHWmadA","EdBKcFPfSE","WreyPVerEA",
+"UmaEv7ku1p","JJs5mv8yFN","U3yw5taOXK","MezSWlsQGo","Ul4a10PktI","lweGyUl4a1","pFrrlCxVEf","3weIFCdyBV","FcWrWFNYIM","CIShGjS1aj",
+"QWxoToGu6x","DcpWBiB08l","LewvM1v5hH","CIShGPb1pa","UmaEvBGaQY","zY1GYwDajX","IBe8kgIYvE","cShY2pAhR1","aL6AJGWqqX","14FLRW3VFH",
+"FFDuiblLA9","lj07QAIYUu","LewvMtl72W","jtn0XlpF6W","BCxeCzQt6Q","4QMc99eoRc","7lUXZB3qem","CNHmvogLgc","x3LDe0BmCy","lweGyKASQ8",
+"QbxXcNo0Qb","6q6L945cIH","JkzUnC2Irc","7hyVvyluBx","dpe1vlsQGo","v1HlnSbRYy","U3yw5VIlwP","lCMxyksJby","vLsmSo8Uyd","ciuWzP6bcg",
+"0ao3l5Namm","uvf7AsuY4x","m4bxUnFqik","hSSvQogLgc","a00b5WreyP","aFFssdQ586","AmdQdpWiOs","45cIHPb1pa","xReecCIShG","5Drn04W0Tl",
+"UlU3M9eoRc","tlILtPYBf4","9iGoTiKqhr","zmLYDzHF1q","s93MlBpYhV","uvf7AECMvU","BGaQYjiVBP","qaofN5Namm","dhSuHVBjhz","bZLvSYf2Ec",
+"Mm8siVprf2","NhXduJXljW","P6bcgMK07Y","uJScX9iGoT","soy9tzz4ZU","ydG8URkQke","uAWypoQ87r","ReKEWtvdkD","07n1cD6rBy","gIYvEuJScX",
+"8cVD3GrDg7","S77LHaez9y","W3VFHJKWYR","s7MxkMm8si","YOfrYOUYuF","m4bxUbgJAz","oGu6xDz1R3","Pb1pahYBCK","y94nwMkgy8","GXdoH8U2nU",
+"Gv3FqtuDyS","W7cTswiHrZ","6AFT05Namm","29QAz4W0Tl","OUqFMXyPZN","8U2nUlj07Q","MmKGJ8FmFH","lweGyC2Irc","v2eC3Kr8ys","IKxdLuAWyp",
+"nFqikgf8rI","wiHrZa00b5","4W0TlMojnP","LbRTH5Drn0","Y1mC0IRh48","55rfB0h1b1","he9IAzY1GY","SWfouHRxd8","AkKTkBGaQY","HzZT829QAz",
+"lViBvThjNn","VNCPdv8yFN","uN6r3MmKGJ","F6PT2qQxHP","gdQsSDLhzM","uoStw9rlg9","wDajXjSjS3","qaofNogLgc","0BmCycL0aE","LDk6fNo0Qb",
+"fcJOyPb1pa","fcwDacShY2","vkCHHK4GS8","FwEJzhSSvQ","wiHrZAkKTk","brhlQL7cGc","JIqXisx5Gl","Ul4a1yvOMI","HzZT8CIShG","uPX7GFcWrW",
+"D6rByYh1hF","2DREstaOXK","5VZjSQnJ1S","Mm8si1v5hH","lkMUAYw2oU","WreyP3weIF","No0Qbrhl0J","Q6hMCBFkb8","cmXIXiwzGk","Yf2EcnFqik",
+"AXpwEcL0aE","wiHrZF6PT2","LDk6fM6qcG","jS1ajcmXIX","2Yz7EHP433","pWiOslj07Q","okgRi0YAGH","wiHrZaDGtS","gtCA5sqVrf","5drc64QMc9",
+"0PktI5Namm","pvgjSjzUqR","Nxx9VAmdQd","HfyNQo8Uyd","KASQ8blLA9","MmKGJUl4a1","4QMc9UmaEv","EdBKc5drc6","bZLvSAgJHQ","aDGtSW3VFH",
+"XyPZNNhXdu","Q6LixW7cTs","rhl0JXyPZN","StlDJ5Mg9r","suY4xFnPFB","F6PT2QbxXc","kB5nPThjNn","rhl0J9rlg9","sx5GlJIqXi","9y4lwPb1pa",
+"zFgtB9GXkX","FnPFB5VZjS","VNCPdpv0i7","WmadAHP433","x3LDeokgRi","uLtKsChuy3","uQIczRBhp0","pAhR1lViBv","pAhR1ThjNn","QChxsQChxs",
+"a00b5wDajX","StlDJMm8si","QWxoTVprf2","zbIYY7lUXZ","Mm8siazIWp","lsQGoGSQwj","AgJHQFPfSE","JKWYRpiJSk","StlDJCp3mZ","rKDLJ580YD",
+"uupzkKASQ8","uZPqgEdBKc","Chuy3gtCA5","5NammfcwDa","xReecAOgEe","fLNg8Oz8yZ","RzaZAjfREu","t98iWSWfou","RkQkeO3iyQ","7X3uyjS1aj",
+"ECMvULewvM","jfREuJKWYR","GrDg72DREs","CxVEfoVQp6","ix74rFPfSE","5drc6FxX9q","9iGoTzHF1q","0BmCyjSjS3","JkzUn7hyVv","FxX9qdhSuH",
+"SbRYyMezSW","lj07QFcWrW","CqqaDW3VFH","lkMUA5nmWv","AgJHQQssNC","5NammyEfy9","Qworu5drc6","AOgEefmIK1","P6bcg5Namm","QWxoTJ2mQi",
+"Uvlv4guMb8","Ul4a1Rxrsm","EdBKcGrDg7","aDGtS2hEEU","taOXK0PktI","iqv4kuLtKs","yEfy924ARF","Y1mC0yEfy9","jzUqRxciqp","2TRI7uupzk",
+"0PktIfcwDa","GrDg707n1c","lweGy4QMc9","dpe1vRpBQm","SmGzvmX2GE","LbRTHWMiS3","FLsphv2eC3","yofH3In3NS","y94nwyluBx","Vprf2ogLgc",
+"5nmWvgdQsS","Dz1R3k85Ae","24ARF7Ow5C","rhl0JLbRTH","wiHrZVNCPd","uupzk2TRI7","kZANmMojnP","ZJTXHRBhp0","GXdoHogLgc","8RCUAfmIK1",
+"tvdkDJIqXi","9rlg9i3pyd","fcwDazz4ZU","s7MxkYh1hF","jS1ajjtn0X","PYBf4prNT6","29QAz64s8N","he9IAS77LH","zmLYDVBjhz","HfyNQbZLvS",
+"aFFssW3VFH","ThjNnM6qcG","D6rByGv3Fq","ulk41M6qcG","WMiS3cL0aE","TXQ0ZQClRL","O3iyQQClRL","JKWYRqUJMd","Dz1R3WaWsv","L7cGcatef2",
+"d85a9NAFuw","9GXkXFGzgp","DLhzMM6qcG","lXFOB07n1c","9rlg9b29RJ","XyPZN24ARF","JJs5mm4bxU","29QAzatef2","MojnPguMb8","suY4xOz8yZ",
+"lViBv9y4lw","AIYUuLDk6f","J2mQiAIYUu","DcpWBo8Uyd","he9IABGaQY","lCMxyiqv4k","soy9t0PktI","BGaQY4W0Tl","h1zcHlkMUA","RBhp0rz7Ut",
+"gtCA50ao3l","gtCA55Drn0","TwanogtCA5","RsQUqKr8ys","5IhmGYf2Ec","EdBKcni2v1","ZuDtD0PktI","sx5GlTa8f6","RpBQmo8Uyd","tuDySAkKTk",
+"5iGN5CIShG","BGaQYsqVrf","IjTwPRmDcr","ciuWz9GXkX","FGzgpvkCHH","fmIK15Namm","i3pydVjCZq","MmsIo618Di","8xEKzciuWz","WreyPx3LDe",
+"S77LHpFrrl","FVMxo2TRI7","gf8rIQClRL","X6PinDcpWB","RxrsmS77LH","EdBKc2ZHdk","gIYvEgdQsS","qQxHPNOHsz","uQIczciuWz","K20wK7X3uy",
+"Z4I1vzQt6Q","vLsmSMmsIo","yofH3ZUnqt","yofH31v5hH","FLsphECMvU","FnPFBFhtgl","azIWpguMb8","G1RhSiqv4k","Cp3mZyvOMI","2TRI7Chuy3",
+"okgRi7fKYU","yvOMIUvlv4","5ZaEz7X3uy","O3iyQhe9IA","UmaEvQbxXc","Zv7z0faHir","K4GS8jzUqR","d7vjM0BmCy","b29RJyluBx","IRh483otm6",
+"yvOMI0BmCy","ReKEWQWxoT","jeskSZhwG1","HfyNQTa8f6","0Kyfsn8pJ9","s4786FVMxo","tAOsrRpBQm","ru4UGGWqqX","LewvMpmeCd","7Ow5CiwzGk",
+"6AFT0OHaBz","n8pJ9Ta8f6","lsQGoNAFuw","dhSuH0BmCy","2hEEUXflUq","WMiS35nmWv","6q6L9KsjRK","mX2GEFNYIM","8RCUA5ZaEz","HlUbFMmKGJ",
+"2DREst98iW","v1Hlna00b5","5drc6VNCPd","RxrsmpWiOs","B3qemcQOnv","Mm8siKr8ys","yofH32ZHdk","v8yFNW7cTs","UlU3McQOnv","K4GS8iqv4k",
+"v2eC3guMb8","Waim6Dz1R3","SjskQYf2Ec","bgJAz0BmCy","OHaBzjiVBP","HRxd8TXQ0Z","b29RJPYBf4","piJSkJJs5m","mX2GEcL0aE","FGzgp2DREs",
+"MK07YfcwDa","faHiroQ87r","FcWrW8TxD7","tlILtVerEA","8FmFHiqv4k","OUYuFVjCZq","tlILtMGlTF","24ARFOz8yZ","8FmFHQ6hMC","okgRiFLsph",
+"b29RJ618Di","faHirBCxeC","fFDrJTa8f6","FGzgp8cVD3","nFqik8FmFH","RACujVNCPd","B3qemuLtKs","RpBQmxciqp","gdQsSpiJSk","8RCUA9rlg9",
+"GWqqX1v5hH","l83UdiKqhr","5Mg9rl83Ud","TwanoQ6hMC","K4GS8pv0i7","48cHLyEfy9","i7WMQrKDLJ","IRh48Ta8f6","sx5GlI7p2a","4dEz629QAz",
+"6q6L95IhmG","RACujDcpWB","WmadAStlDJ","Mm8siVNCPd","Ta8f6Fhtgl","RsQUqqQxHP","FnPFBQbxXc","0ao3l2Yz7E","7fsYMKr8ys","3weIF7X3uy",
+"azIWptuDyS","m4bxUazIWp","soy9tVprf2","VLTy6iKqhr","Z4I1vFjHXR","0MR5XNcICA","580YD8hJdt","MaJQsI7p2a","mz8gxfqypy","aL6AJpiJSk",
+"Pb1paDLhzM","7Ow5CU3yw5","uJScXiKqhr","5IhmG45cIH","ru4UG580YD","S77LHoQ87r","RkQkeOxWIH","uJScXlkMUA","0KyfsAXpwE","qUJMdUvlv4",
+"OHaBzYh1hF","ciuWzX6Pin","FwEJzL7cGc","i3pydsuY4x","zFgtBuoStw","QWxoTyluBx","uN6r3Cp3mZ","QWxoTM6qcG","pvgjS16lHc","v2eC3Yw2oU",
+"Gv3FqVBjhz","Y1mC0AgJHQ","3otm6618Di","1LB1Lfqypy","TCgPp7Ow5C","1v5hHVIlwP","CNHmvfcwDa","JRJQBv2eC3","lXFOBulk41","0BmCyy94nw",
+"LewvM9GXkX","rz7Uts4786","7fKYUZzJHW","vkCHHHfyNQ","PYBf4gf8rI","iqv4kt98iW","ulk41s93Ml","v2eC3gtCA5","kB5nPRzaZA","ThjNnUl4a1",
+"0KyfsJXljW","brhlQpAhR1","Waim6gjUTu","WDVWJVIlwP","Chuy3jfREu","b29RJuQIcz","v8yFNFhtgl","Yh1hF5VZjS","cL0aEfcJOy","CK5W7TXQ0Z",
+"OxWIHb29RJ","m4bxUzFgtB","GWqqXAmdQd","o8Uyd0BmCy","t98iWTXQ0Z","NcICA1LB1L","MmsIo580YD","kB5nPECMvU","LbRTHtuDyS","t59lRlm0pD",
+"CqqaDQClRL","cmXIXLewvM","KZamHpWiOs","S2DfuGv3Fq","W3VFHiB08l","vOqCEqaofN","v1Hlnfqypy","iB08laez9y","ThjNnIjTwP","uAWypgdQsS",
+"StlDJtlILt","zmLYDReKEW","9iGoTzY1GY","tAOsrTXQ0Z","JRJQBAIYUu","618Die6e4z","FjHXRzFgtB","aL6AJ9iGoT","FPfSEoVQp6","RACujK20wK",
+"uZPqglj07Q","he9IAlm0pD","gIYvESWfou","HfyNQKsjRK","GrDg7AXpwE","1LB1L48cHL","CdyBVs7Mxk","IjTwPHRxd8","euZA5SbRYy","ulk41jtn0X",
+"HzZT85drc6","RACujTCgPp","a00b5RpBQm","EoToPFFDui","iB08lRkQke","tvdkDUlU3M","MezSWFhtgl","iqv4k7Ow5C","9y4lwNcICA","Zv7z007n1c",
+"v2eC3lH1kt","LbRTH8xEKz","0MR5XgjUTu","WDVWJhYBCK","zmLYDfcwDa","OUYuFnlaBy","BGaQYqQxHP","CxVEfIKxdL","t59lRhSSvQ","ksJbyFPfSE",
+"cL0aEQClRL","6q6L93weIF","RmDcrjzUqR","FFDuisuY4x","gf8rIJRJQB","fLNg87X3uy","PYBf4i7WMQ","Waim67fKYU","xReecMaJQs","S77LHv1Hln",
+"8xEKzlXFOB","0MR5XVjCZq","Yw2oU5IhmG","AXpwEBbwgA","hUTw7MK07Y","5nmWvDLhzM","CIShGIn3NS","kB5nPAmdQd","ix74r5IhmG","ksJbyhUTw7",
+"xciqpnnP8o","9y4lwHfyNQ","2ZHdkVBjhz","Yw2oUwDajX","t98iWcShY2","QworuOz8yZ","Uvlv48TxD7","euZA5StlDJ","VIlwP5nmWv","S2DfuFPfSE",
+"sqVrfXyPZN","W7cTsFFDui","QClRLP6bcg","brhlQRpBQm","Z4I1vjzUqR","oVQp6Yh1hF","zqH0WO3iyQ","RkQke7lUXZ","JIqXizmLYD","S2DfuHRxd8",
+"5VZjSMaJQs","MaJQsMmKGJ","i7WMQCIShG","Cfgr3WMiS3","0Wr5y9eoRc","5nmWvRmDcr","WreyPyofH3","ogLgclsQGo","yvOMI48cHL","uPX7G4QMc9",
+"16lHculk41","2NslmuQIcz","lViBvfcJOy","dhSuHQWxoT","QChxsx3LDe","FGzgpMmsIo","AIYUun8pJ9","Pb1papT8wu","SbRYyWaim6","Twanot98iW",
+"i7WMQECMvU","he9IAFjHXR","0BmCyoGu6x","n1pmOhE1Ql","PYBf4Mkgy8","LbRTHjiVBP","dpe1voGu6x","4W0TlJXljW","FjHXRaL6AJ","K20wKvOqCE",
+"qaofNgjUTu","3otm6AkKTk","M3zXLKASQ8","RBhp02ZHdk","hE1Ql45cIH","pv0i7l83Ud","lweGyi3pyd","Cfgr3pWiOs","lXFOBK4GS8","8U2nUiwzGk",
+"S2DfuWaWsv","pFrrlpFrrl","AXpwEnFqik","qaofN7ku1p","n8pJ9fmIK1","uoStw7X3uy","JKWYRNo0Qb","bZLvSdjsrv","tAOsrcShY2","VerEA4W0Tl",
+"fqypyFcWrW","VNCPdfcJOy","FFDuiogLgc","uJScXix74r","FNYIMh1zcH","2hEEUv1Hln","POUYSOz8yZ","HRxd8MaJQs","TXQ0ZRmDcr","NAFuwS77LH",
+"9XyT9Ul4a1","okgRini2v1","cQOnv9XyT9","Oz8yZZhwG1","pmeCdlH1kt","RmDcrCxVEf","RACujZ4I1v","CNHmviqv4k","KASQ88xEKz","dQ586AXpwE",
+"2ZHdktl72W","qaofNi7WMQ","suY4x618Di","zFgtBDLhzM","ydG8UzHF1q","e6e4zuvf7A","he9IAk85Ae","14FLRB3qem","M3zXL6q6L9","KZamHjiVBP",
+"zY1GYru4UG","ogLgcgjUTu","wiHrZK20wK","v8yFNtl72W","CqqaDnFqik","NAFuwFwEJz","JJs5mrKDLJ","MmKGJgIYvE","XflUqo8Uyd","AmdQd1v5hH",
+"oQ87rKsjRK","UmaEv6AFT0","i7WMQfFDrJ","4dEz6BFkb8","n1pmOUvlv4","Zv7z0mX2GE","5Mg9r9y4lw","C2IrcyvOMI","WmadAt98iW","uAWyp2TRI7",
+"GrDg7I7p2a","iKqhrFFDui","Uvlv4NhXdu","uupzkuLtKs","QChxs8TxD7","aDGtSFVMxo","WmadAuPX7G","TwanouPX7G","ECMvUhUTw7","k85AeFjHXR",
+"Y1mC0t59lR","dmoS7jSjS3","mz8gxQChxs","qUJMdZzJHW","2TRI7d7vjM","RACujQYxC0","FVMxoSmGzv","Rxrsm55rfB","YjB9ttAOsr","lweGyW3VFH",
+"v8yFNt59lR","29QAz2hEEU","MezSW0PktI","y94nwpmeCd","ZzJHWK4GS8","k85AeHRxd8","fLNg8LbRTH","3otm6StlDJ","n1pmO2DREs","MezSWCp3mZ",
+"VjCZqv2eC3","2hEEUtlILt","7fKYU9XyT9","jSjS3hSSvQ","G1RhSfaHir","Q6LixYjB9t","7fsYMKASQ8","o8UydAOgEe","zFgtBgtCA5","pv0i74dEz6",
+"9XyT9qUJMd","POUYSUmaEv","J2mQivOqCE","cQOnv2Yz7E","uupzkhSSvQ","618Dib29RJ","LDk6f5VZjS","Yf2EcuAWyp","ulk41lj07Q","GXdoH7X3uy",
+"5nmWvuvf7A","YOfrY8RCUA","vLsmSmX2GE","2TRI7CdyBV","jeskSFcWrW","fcwDaLDk6f","55rfBQbxXc","nnP8opFrrl","jSjS36AFT0","vOqCE8xEKz",
+"Vprf28cVD3","ZhwG1DG4sT","Kr8ysrKDLJ","TXQ0ZnFqik","azIWpKZamH","8TxD7mX2GE","VerEAS2Dfu","ogLgcCIShG","MGlTFh1zcH","CxVEfyEfy9",
+"RpBQmkZANm","okgRiQYxC0","SWfouCp3mZ","uPX7Gfqypy","ZuDtDJKWYR","29QAzzqH0W","ZJTXHFFDui","o8UydvkCHH","5drc6NAFuw","uoStw8FmFH",
+"v2eC3v8yFN","v8yFNydG8U","WaWsvtaOXK","X6Pin07n1c","fcwDaPb1pa","gf8rIgf8rI","Cp3mZhe9IA","2DREsI7p2a","8RCUAUl4a1","DLhzMIRh48",
+"7lUXZpAhR1","WreyPfaHir","MGlTFOHaBz","BbwgANo0Qb","Yf2Ec1j5L8","hUTw7580YD","fcwDa4QMc9","HfyNQ9rlg9","s7Mxk8xEKz","WmadAJkzUn",
+"MaJQsrhl0J","zFgtBEOE1o","n1pmOfcJOy","Q6hMCt59lR","NAFuw5ZaEz","QYxC0YOfrY","CdyBVO3iyQ","P6bcgOz8yZ","NOHszn8pJ9","45cIHMaJQs",
+"hYBCK5iGN5","pWiOsOxWIH","uQIczW3VFH","Mm8siLewvM","3otm6VBjhz","lweGyzbIYY","aez9yzQt6Q","jSjS3rhl0J","cShY2yToGW","KZamH0PktI",
+"1LB1LVNCPd","48cHLyofH3","xReecoQ87r","2TRI7dhSuH","blLA9ulk41","QnJ1SNxx9V","vOqCEHlUbF","QClRLoQ87r","CIShGZhwG1","uZPqgpiJSk",
+"o8Uydy94nw","QWxoTZJTXH","BFkb87lUXZ","jS1ajn8pJ9","Pb1payEfy9","Ul4a10ao3l","BFkb8uN6r3","Gv3FqiB08l","prNT6YjB9t","hYBCKcQOnv",
+"9y4lwtjQxs","euZA5lm0pD","FcWrWjfREu","Z4I1vEOE1o","OHaBzrhl0J","8FmFHtuDyS","xReecS2Dfu","OxWIHjzUqR","ksJbyBpYhV","gIYvE5Drn0",
+"ru4UGHlUbF","v1HlnlXFOB","F6PT2BGaQY","lViBvt98iW","cShY2O3iyQ","7fsYMzY1GY","zFgtB3weIF","uZPqgM3zXL","s4786Gv3Fq","qQxHPlpF6W",
+"azIWpXflUq","gf8rINxx9V","K4GS8dmoS7","NAFuw8U2nU","Q6hMCni2v1","5Drn0m4bxU","7X3uyrz7Ut","piJSkt98iW","zY1GY2ZHdk","bZLvSCqqaD",
+"ZzJHWjzUqR","CdyBVCxVEf","HfyNQNAFuw","5Namm5drc6","CqqaDVjCZq","HzZT8uoStw","uJScXPOUYS","G1RhSWMiS3","lj07QIjTwP","fcwDayToGW",
+"DG4sTpAhR1","Chuy3AgJHQ","LbRTHLbRTH","kZANmBCxeC","FhtglVLTy6","6AFT0Yf2Ec","fcwDaS2Dfu","hYBCKEdBKc","VNCPdpvgjS","7lUXZoGu6x",
+"RBhp0Rxrsm","7Ow5CCfgr3","8hJdtqQxHP","Q6Lix8FmFH","cQOnvRpBQm","9iGoTi7WMQ","WMiS3jiVBP","BGaQYTa8f6","QssNCbrhlQ","VBjhzW7cTs",
+"DQimpiwzGk","pv0i7B3qem","v1HlnEOE1o","ru4UGFLsph","RsQUqJXljW","rhl0JuoStw","No0QbUmaEv","cQOnvtvdkD","n8pJ9vkCHH","AmdQdS77LH",
+"uvf7A2Yz7E","uTacx5Namm","MezSWRkQke","CNHmvMaJQs","v2eC37fsYM","VjCZqWPmlx","FnPFBWMiS3","OUYuFatef2","FPfSEQClRL","nFqik0h1b1",
+"okgRiCqqaD","Gv3Fq2Nslm","zbIYYtvdkD","t59lRWaim6","pmeCdciuWz","S2DfutjQxs","HlUbFMm8si","hi5X7ulk41","8TxD7ciuWz","qaofNa00b5",
+"BFkb8AXpwE","lj07QTCgPp","WPmlxSbRYy","dQ586mX2GE","Y1mC0ciuWz","tAOsrGWqqX","ulk41suY4x","blLA9P6bcg","ciuWzMK07Y","NcICAfcJOy",
+"SbRYyRACuj","AkKTkVjCZq","t98iWtvdkD","aDGtSWmadA","DcpWBZhwG1","zbIYYjzUqR","ydG8U1j5L8","UmaEvyofH3","uN6r3atef2","gjUTu7fKYU",
+"8FmFHuJScX","JIqXiRkQke","JKWYRuvf7A","djsrv9iGoT","ru4UGnFqik","Waim6Pb1pa","CdyBVzmLYD","taOXKcQOnv","2Yz7ETa8f6","JRJQBrKDLJ",
+"brhlQHzZT8","fmIK145cIH","LbRTHsuY4x","yofH3JXljW","t98iWyvOMI","taOXKzFgtB","JKWYR7ku1p","uoStwZhwG1","n1pmO9rlg9","7lUXZRsQUq",
+"SbRYyydG8U","S77LHZUnqt","SmGzvoVQp6","jeskSt59lR","xXTI4pmeCd","4QMc9uTacx","GXdoHlkMUA","zz4ZUI7p2a","0PktIG1RhS","kZANmfLNg8",
+"cmXIX7lUXZ","9y4lwCp3mZ","jzUqRaFFss","VNCPdcQOnv","GrDg7VIlwP","6AFT0rKDLJ","ZUnqtuTacx","M6qcGxXTI4","YjB9tCfgr3","ciuWz4W0Tl",
+"5IhmGJJs5m","I7p2a0PktI","Dz1R3yEfy9","aez9yK4GS8","rz7Uta00b5","4dEz6Waim6","pWiOs7fKYU","TwanoDz1R3","AgJHQMmsIo","VIlwPRkQke",
+"ru4UGQworu","F6PT2ix74r","ni2v1AkKTk","XflUqCK5W7","2hEEUix74r","W7cTsRACuj","i7WMQtvdkD","zQt6QWreyP","5drc6HP433","ZUnqtYjB9t",
+"Y1mC0VjCZq","7X3uy4QMc9","brhlQ2TRI7","TwanoXyPZN","WaWsvWmadA","zmLYD5Mg9r","v1Hlni7WMQ","lj07QlpF6W","uTacxgtCA5","8TxD77Ow5C",
+"xXTI4iKqhr","K20wKYjB9t","sqVrfjiVBP","IKxdLpvgjS","BpYhVHzZT8","n1pmOlj07Q","HfyNQMojnP","C2Irc55rfB","oGu6x5VZjS","brhlQru4UG",
+"FwEJzlm0pD","BbwgAjeskS","b29RJRBhp0","2ZHdkaL6AJ","uvf7Av2eC3","UlU3MzqH0W","MGlTFWmadA","ydG8UWmadA","BpYhVm4bxU","RmDcrOUqFM",
+"5Mg9rNxx9V","nlaBy5VZjS","JJs5m580YD","DG4sTbrhlQ","hi5X7EoToP","QClRL8xEKz","618DilsQGo","Pb1paD6rBy","Ul4a1SbRYy","RsQUq7ku1p",
+"oQ87rlViBv","KsjRKMGlTF","0Wr5yRkQke","taOXKtvdkD","gf8rIQYxC0","kZANmMK07Y","Q6LixuLtKs","VNCPdvOqCE","AOgEejSjS3","vLsmS2ZHdk",
+"xciqpt98iW","VNCPdZv7z0","OxWIHZJTXH","M3zXL64s8N","24ARFMK07Y","WPmlxC2Irc","5drc6Oz8yZ","bZLvS0MR5X","Yh1hFJRJQB","s7Mxk7fKYU",
+"rhl0JwiHrZ","k85AegjUTu","gjUTuHfyNQ","FcWrW7ku1p","8FmFHQworu","5nmWvHzZT8","7hyVviwzGk","aFFssmX2GE","d7vjM9rlg9","2DREsuLtKs",
+"IRh48yofH3","IBe8kGSQwj","GXdoHjiVBP","5Nammuvf7A","BGaQYjtn0X","Yw2oU8RCUA","2TRI7vkCHH","tjQxsk85Ae","tjQxsCp3mZ","IjTwPJXljW",
+"48cHLFLsph","b29RJ16lHc","JRJQBs4786","KZamHAmdQd","YOfrYJIqXi","ZzJHWWDVWJ","EdBKcKr8ys","QClRLCIShG","X6PinAgJHQ","y94nwG1RhS",
+"FNYIM2ZHdk","gdQsSFGzgp","jeskS618Di","OxWIHKsjRK","mX2GEHRxd8","5NammdmoS7","nnP8oFxX9q","tuDyS7lUXZ","prNT6e6e4z","tlILt1LB1L",
+"No0Qbn1pmO","mX2GEFjHXR","8TxD7U3yw5","Pb1pasuY4x","2Yz7E0Wr5y","7fsYM45cIH","kB5nPxXTI4","rhl0J1v5hH","lm0pD8U2nU","yEfy9SjskQ",
+"LbRTHRsQUq","NcICAtAOsr","VerEARzaZA","RBhp0FLsph","ogLgcuZPqg","FnPFByEfy9","WPmlxjSjS3","cmXIXPOUYS","zHF1qCIShG","s7Mxk5IhmG",
+"wDajXqUJMd","hE1QlFcWrW","WmadAfcwDa","oQ87rZhwG1","yluBxLbRTH","s4786pFrrl","gjUTuxXTI4","S77LHlH1kt","Twanorhl0J","OxWIHIn3NS",
+"XyPZNjS1aj","cmXIXqQxHP","zmLYDe6e4z","KASQ8aL6AJ","Kr8ysjtn0X","IBe8ke6e4z","pT8wuOHaBz","jtn0XpmeCd","X6PinFPfSE","LewvMnFqik",
+"gjUTuL7cGc","uupzk0MR5X","ix74ryofH3","ReKEWTXQ0Z","d85a9Oz8yZ","QnJ1SSjskQ","9eoRcZuDtD","ZuDtDTCgPp","TwanoNOHsz","XflUqFNYIM",
+"YjB9tBCxeC","QWxoTatef2","suY4xFNYIM","FNYIM9eoRc","0Kyfs2Nslm","hYBCKoGu6x","8xEKzyToGW","n1pmOuJScX","lkMUAFhtgl","aL6AJWMiS3",
+"lsQGoyEfy9","NhXduuN6r3","XyPZN2TRI7","ZhwG1lsQGo","RkQkeGv3Fq","ciuWziqv4k","tAOsra00b5","Zv7z0FFDui","suY4x7X3uy","o8Uyd2Yz7E",
+"OHaBztlILt","a00b5FLsph","VIlwPt98iW","0Wr5y55rfB","mX2GEFcWrW","IBe8kt98iW","s4786fFDrJ","NhXduIjTwP","OxWIH0PktI","MojnP5Mg9r",
+"7ku1pJKWYR","jtn0XHlUbF","zHF1qfmIK1","FxX9qfcwDa","taOXKIBe8k","d7vjM55rfB","NhXduEdBKc","7X3uy2DREs","9iGoTfLNg8","b29RJEOE1o",
+"hSSvQKsjRK","fqypyxReec","JKWYROUqFM","faHirydG8U","gjUTuTwano","GrDg7VNCPd","JJs5mpT8wu","FVMxo4QMc9","LDk6fkB5nP","5iGN5uN6r3",
+"KsjRKTa8f6","ydG8UYw2oU","jiVBPnFqik","SbRYytjQxs","S2DfuZhwG1","DG4sTtAOsr","FVMxoEoToP","uTacxFFDui","LewvMvkCHH","ogLgcqQxHP",
+"6AFT08TxD7","zz4ZUzbIYY","SbRYygf8rI","tuDySCdyBV","GrDg7Nxx9V","XyPZNtvdkD","tl72W55rfB","W7cTsQnJ1S","prNT6FGzgp","nnP8oM6qcG",
+"nFqikWDVWJ","i7WMQFxX9q","QWxoTmz8gx","lpF6WQ6Lix","DG4sTmX2GE","lXFOBuLtKs","6AFT0nlaBy","VBjhzJkzUn","NOHszK4GS8","tuDyS4QMc9",
+"FPfSEzFgtB","cL0aEfcwDa","soy9tfcJOy","tuDySrz7Ut","Ul4a1iB08l","P6bcge6e4z","D6rByPb1pa","O3iyQix74r","618DiOHaBz","tjQxsQbxXc",
+"gdQsS5iGN5","vkCHHBpYhV","zQt6QJRJQB","Yh1hF5iGN5","gIYvE0YAGH","fcwDaXflUq","tuDySIRh48","7X3uyVprf2","fcJOyFnPFB","qaofN14FLR",
+"StlDJLDk6f","dQ586VIlwP","HRxd8d85a9","RBhp0AmdQd","Ss0ZuZv7z0","Chuy3CK5W7","b29RJKsjRK","pv0i7AOgEe","5ZaEzWaWsv","jfREutvdkD",
+"aDGtS4W0Tl","UlU3MMm8si","0YAGHEoToP","sx5GlnFqik","xXTI4sqVrf","StlDJVNCPd","GSQwjgtCA5","PYBf48U2nU","I7p2axciqp","FLsph9XyT9",
+"2DREsxciqp","pAhR1zQt6Q","iwzGkZUnqt","5drc6NOHsz","bgJAzIRh48","yofH3D6rBy","W3VFHpv0i7","5NammQssNC","zz4ZU2DREs","aDGtSGv3Fq",
+"VBjhzFPfSE","2TRI7jiVBP","SmGzvFNYIM","ciuWzL7cGc","QworuzqH0W","Cfgr3RBhp0","hUTw7ReKEW","yofH3h1zcH","4dEz6618Di","fqypyBFkb8",
+"FLsph64s8N","K20wKNxx9V","RxrsmLDk6f","s93Ml2hEEU","8xEKzXyPZN","piJSkhSSvQ","6q6L907n1c","lCMxy8cVD3","o8UydL7cGc","qQxHPtjQxs",
+"SmGzvHfyNQ","07n1cblLA9","2hEEUMm8si","HP433fLNg8","RACujBGaQY","FNYIMSmGzv","FVMxofFDrJ","8xEKzhe9IA","x3LDeAOgEe","Yf2Ec7fsYM",
+"yvOMI24ARF","x3LDeRzaZA","gf8rIMK07Y","HlUbFbgJAz","s4786uAWyp","2hEEUO3iyQ","SWfouuZPqg","9y4lwcmXIX","55rfBCIShG","m4bxUOHaBz",
+"K20wKGSQwj","WreyPlCMxy","3weIFNOHsz","JJs5maez9y","AXpwETwano","YjB9tQWxoT","DLhzMzmLYD","rhl0Jhe9IA","2DREsAOgEe","QnJ1SRBhp0",
+"tlILtVIlwP","ksJbyQworu","fcJOypvgjS","pWiOsgdQsS","WMiS3i7WMQ","MezSWqaofN","0Wr5yY1mC0","aez9ySs0Zu","AIYUufaHir","jS1ajLbRTH",
+"DG4sTazIWp","pmeCdrz7Ut","2NslmFPfSE","lkMUAi3pyd","HlUbFgtCA5","QssNC1v5hH","cL0aEx3LDe","2DREsFhtgl","Waim62Yz7E","SbRYyXflUq",
+"5Drn0zFgtB","TCgPpsx5Gl","lCMxyuQIcz","m4bxUbrhlQ","CdyBVjfREu","iqv4kIBe8k","jiVBPRBhp0","QworulkMUA","uAWypMmKGJ","4dEz6WPmlx",
+"kZANmy94nw","RACujcL0aE","VIlwPK4GS8","XflUqzQt6Q","QYxC0580YD","uupzk8TxD7","lm0pDCdyBV","KZamHzbIYY","0KyfsFVMxo","MojnPaez9y",
+"Vprf2jiVBP","Dz1R38cVD3","pWiOsFFDui","RkQkeo8Uyd","v8yFNnFqik","t59lRgjUTu","7X3uyMmsIo","TwanovkCHH","gtCA5XflUq","MaJQsYjB9t",
+"soy9tlj07Q","ThjNntaOXK","8TxD7euZA5","8cVD3jS1aj","GXdoHJkzUn","zbIYYoGu6x","Z4I1vRzaZA","wiHrZFFDui","cmXIXi7WMQ","5Nammjtn0X",
+"pvgjSlweGy","TwanoSbRYy","Yf2EcFPfSE","1v5hHcmXIX","MmKGJqaofN","2Yz7ESjskQ","WMiS3YOfrY","5nmWvX6Pin","WDVWJYjB9t","55rfB1v5hH",
+"k85AeuoStw","uN6r3VIlwP","RmDcrcL0aE","Qworun8pJ9","gdQsStlILt","uupzkciuWz","OUYuFMm8si","K4GS8gdQsS","Zv7z0fcwDa","NOHszzmLYD",
+"POUYS5VZjS","h1zcHM3zXL","jiVBPOz8yZ","7fKYUdjsrv","prNT6cShY2","pAhR1tl72W","Zv7z07X3uy","WDVWJb29RJ","OUYuFhE1Ql","RBhp0lCMxy",
+"AgJHQWmadA","9rlg9fqypy","pAhR1MK07Y","lweGysoy9t","618Di2hEEU","DLhzMxciqp","hSSvQaDGtS","ulk41BCxeC","e6e4zAgJHQ","Waim65Drn0",
+"FxX9qReKEW","0MR5XOHaBz","s7MxkzY1GY","jeskSDQimp","DcpWBpT8wu","Gv3FqAmdQd","prNT6QssNC","brhlQRBhp0","2ZHdkWaim6","B3qemCfgr3",
+"lj07QhSSvQ","0PktIS77LH","fmIK1jfREu","oGu6xlkMUA","Nxx9VEOE1o","ni2v1euZA5","pAhR13weIF","vOqCElm0pD","v8yFNI7p2a","2ZHdkdjsrv",
+"BCxeC0YAGH","rKDLJoQ87r","TCgPpIBe8k","GWqqXiwzGk","O3iyQCIShG","yvOMI3weIF","RBhp05ZaEz","S2Dfu5Drn0","8U2nU3otm6","0ao3lru4UG",
+"pmeCdlsQGo","2DREshUTw7","24ARFAOgEe","TCgPpX6Pin","Cp3mZZ4I1v","MK07YVIlwP","L7cGcOxWIH","tAOsrv1Hln","zQt6QZUnqt","Yw2oUKASQ8",
+"gjUTuYOfrY","RkQkeQbxXc","qUJMdQChxs","hE1QlqUJMd","BbwgAFcWrW","lViBvpiJSk","ZJTXHydG8U","MaJQsWaim6","Rxrsm14FLR","uZPqgs93Ml",
+"WPmlxSmGzv","y94nwGv3Fq","qQxHPG1RhS","YjB9t0Kyfs","oQ87ruPX7G","hi5X716lHc","BpYhV2DREs","0YAGHZ4I1v","5ZaEzGXdoH","cL0aEpWiOs",
+"0MR5XBFkb8","IRh48zY1GY","yToGW5ZaEz","FPfSE29QAz","DLhzMMezSW","IKxdLOHaBz","FLsphB3qem","iwzGkM3zXL","7lUXZRBhp0","UmaEv4W0Tl",
+"MK07YiwzGk","G1RhSjfREu","pWiOs618Di","S77LHqQxHP","jzUqRhi5X7","e6e4z7lUXZ","5Namm0h1b1","dQ586ogLgc","RxrsmM3zXL","P6bcgqaofN",
+"n8pJ9vOqCE","PYBf4dhSuH","J2mQiZhwG1","O3iyQTCgPp","azIWpRACuj","oVQp6oGu6x","RBhp0Ss0Zu","0MR5XLbRTH","gdQsS5nmWv","4QMc9fmIK1",
+"No0QbECMvU","uZPqg2Yz7E","ni2v12Nslm","BCxeCQnJ1S","MmsIoAmdQd","lweGybgJAz","piJSkAkKTk","7X3uyxXTI4","fFDrJ3weIF","BFkb8cmXIX",
+"kZANmaFFss","RACuji7WMQ","0YAGH3otm6","QnJ1SsuY4x","yluBxQworu","FhtglX6Pin","v1HlnReKEW","FhtglChuy3","uLtKss93Ml","8RCUACdyBV",
+"CIShGpmeCd","GSQwjJkzUn","5IhmGVjCZq","4W0TlvkCHH","iB08lJ2mQi","9XyT9CxVEf","jfREufcwDa","16lHcfFDrJ","QworuprNT6","M3zXLAgJHQ",
+"uJScX8xEKz","8cVD38hJdt","QworuTXQ0Z","RBhp048cHL","FnPFBXflUq","X6PinOz8yZ","YOfrYpmeCd","5Drn0zHF1q","8hJdtK4GS8","Mm8si5ZaEz",
+"b29RJuPX7G","jfREufaHir","djsrvtaOXK","I7p2aCqqaD","sqVrfqQxHP","tlILtjfREu","Yf2EclXFOB","nFqikpv0i7","ThjNnfcwDa","W3VFHni2v1",
+"rz7Utlj07Q","F6PT2FnPFB","TwanoF6PT2","8cVD3G1RhS","3otm6fcJOy","xReecLbRTH","fqypyYf2Ec","9XyT9BCxeC","BFkb8DcpWB","pWiOsVLTy6",
+"VBjhzVprf2","8U2nU55rfB","FxX9qjeskS","brhlQtuDyS","Uvlv4rhl0J","zqH0WVjCZq","xReeci7WMQ","CNHmvUl4a1","45cIH0Wr5y","Y1mC0uPX7G",
+"Q6LixBGaQY","zz4ZUBbwgA","pvgjSBpYhV","jeskSVprf2","RpBQmkB5nP","cShY2J2mQi","0h1b11j5L8","Nxx9VQ6Lix","yluBx2Nslm","pAhR1xciqp",
+"h1zcHzY1GY","24ARFQWxoT","SmGzvpmeCd","PYBf45IhmG","y94nwzHF1q","KZamHBbwgA","ydG8ULDk6f","0KyfsRxrsm","ZUnqtFPfSE","AmdQdzmLYD",
+"ZUnqtHzZT8","5nmWvOxWIH","fmIK1Pb1pa","QChxspWiOs","fmIK1M6qcG","ZJTXHYjB9t","K4GS84QMc9","s4786pAhR1","45cIHK4GS8","EoToP2hEEU",
+"In3NSIn3NS","o8Uydd7vjM","1v5hHokgRi","zFgtBCdyBV","NOHszzQt6Q","RmDcr9iGoT","pmeCdqUJMd","KsjRKG1RhS","zqH0WLewvM","ru4UGKASQ8",
+"No0QbMGlTF","BbwgAksJby","RkQkeYw2oU","MojnPPYBf4","pv0i7azIWp","5Mg9rt98iW","5IhmGZUnqt","WDVWJEOE1o","2TRI724ARF","ix74rQWxoT",
+"MmKGJSmGzv","yluBxAIYUu","FwEJzzqH0W","VjCZqiwzGk","8RCUAqQxHP","2TRI7o8Uyd","7X3uy5drc6","yluBxksJby","NAFuwuN6r3","Vprf2ECMvU",
+"yEfy9OUYuF","rKDLJ7X3uy","Mkgy8Dz1R3","FwEJzHzZT8","RACujqUJMd","0MR5XQ6hMC","AgJHQru4UG","2TRI755rfB","0KyfsfLNg8","jSjS3DG4sT",
+"Pb1pagjUTu","0YAGHrz7Ut","NcICA5nmWv","jS1ajrhl0J","ru4UGAkKTk","5drc6bZLvS","3otm6FPfSE","6AFT0Y1mC0","JJs5m0Wr5y","JkzUnDG4sT",
+"RBhp0LbRTH","WreyPQ6Lix","HfyNQ16lHc","MaJQsogLgc","fFDrJFFDui","zmLYDdQ586","gtCA5ZhwG1","ReKEW9rlg9","5Drn0JJs5m","K20wKQ6hMC",
+"Zv7z0YjB9t","2NslmSWfou","VIlwPs93Ml","v1HlnGv3Fq","QClRLjtn0X","Ul4a1Q6Lix","t59lRAIYUu","I7p2a7Ow5C","Z4I1vYw2oU","Oz8yZ16lHc",
+"zz4ZU6AFT0","BbwgAMmKGJ","cmXIXVprf2","nFqikJIqXi","QClRLMmKGJ","DQimpfcwDa","i3pydcL0aE","LewvMBCxeC","VNCPdzY1GY","zFgtBpv0i7",
+"TXQ0Zxciqp","9GXkX0YAGH","B3qemQ6Lix","FPfSEdhSuH","FVMxoh1zcH","MmsIotaOXK","zQt6QtvdkD","faHirC2Irc","blLA9lweGy","580YDBpYhV",
+"aL6AJLbRTH","fqypyQworu","5Drn0NhXdu","uJScX9eoRc","cL0aEJkzUn","zbIYYeuZA5","atef24dEz6","Zv7z0lweGy","cL0aEt98iW","lCMxyyToGW",
+"WDVWJW3VFH","Z4I1v0MR5X","L7cGc7fKYU","pFrrlv2eC3","BFkb8CqqaD","RxrsmVIlwP","Vprf2RzaZA","SmGzv5Drn0","45cIHUlU3M","VIlwPaez9y",
+"Ss0ZuzFgtB","24ARFMaJQs","iwzGkdpe1v","hi5X7VerEA","pmeCd1v5hH","4QMc9xciqp","fmIK1Gv3Fq","RmDcrF6PT2","BbwgA7lUXZ","24ARFazIWp",
+"cmXIXlH1kt","uPX7G5ZaEz","K4GS8qUJMd","FxX9qZzJHW","djsrvogLgc","KASQ8v8yFN","F6PT2AXpwE","MmKGJlXFOB","2ZHdklweGy","aL6AJx3LDe",
+"xXTI40MR5X","WPmlxK20wK","RmDcrn8pJ9","RmDcr5VZjS","DG4sTYw2oU","Ul4a1lH1kt","48cHLNhXdu","blLA9M6qcG","UlU3MvOqCE","xXTI4suY4x",
+"bZLvSFNYIM","WPmlxSWfou","9XyT9euZA5","uupzkqaofN","QbxXcWaWsv","FxX9q45cIH","ZzJHWGXdoH","TXQ0Zni2v1","K20wKpmeCd","7ku1p0h1b1",
+"IBe8kNcICA","vOqCE0Wr5y","1LB1LydG8U","SjskQTa8f6","07n1cQbxXc","aL6AJJkzUn","FjHXRpAhR1","i7WMQCfgr3","Y1mC0TXQ0Z","fqypy5iGN5",
+"zqH0WiB08l","QWxoTEOE1o","Dz1R3NOHsz","XflUqgIYvE","Ul4a1WPmlx","SmGzvjiVBP","dmoS7XyPZN","oVQp6e6e4z","zQt6QaFFss","DLhzMn8pJ9",
+"580YDCxVEf","JXljWpvgjS","S2DfujzUqR","rKDLJYjB9t","YOfrYxReec","4dEz62DREs","MmKGJ4QMc9","9rlg9fLNg8","3weIFFNYIM","Pb1paKr8ys",
+"Chuy3RkQke","vOqCEKASQ8","Nxx9VksJby","9XyT9IRh48","i7WMQK20wK","P6bcgFGzgp","d7vjMgIYvE","1LB1LMaJQs","RzaZArz7Ut","ciuWz7lUXZ",
+"NhXdutAOsr","OHaBzxciqp","NOHsznlaBy","FcWrWAXpwE","OHaBzS2Dfu","7hyVvQworu","FVMxoOxWIH","tuDySTa8f6","rKDLJAkKTk","0Wr5yVIlwP",
+"jSjS3gdQsS","kZANmd85a9","7Ow5C0Kyfs","K4GS8Y1mC0","07n1cHzZT8","ksJbyxReec","NAFuwThjNn","14FLRIRh48","hYBCKfmIK1","4QMc9zQt6Q",
+"t59lR9iGoT","29QAz3weIF","GrDg7FNYIM","9eoRcDcpWB","0MR5XlpF6W","TCgPpgdQsS","uQIczpAhR1","JIqXi2hEEU","vkCHHNAFuw","blLA9i7WMQ",
+"0h1b1ZUnqt","YOfrYdQ586","wDajXtaOXK","a00b5BbwgA","5Drn0M3zXL","Yf2EcYw2oU","gjUTu7X3uy","HzZT8EoToP","IBe8klpF6W","QYxC0Oz8yZ",
+"Cp3mZNAFuw","yToGWhUTw7","2NslmY1mC0","lj07Qxciqp","FPfSEuQIcz","LewvMn8pJ9","ZUnqtoVQp6","5nmWvni2v1","zz4ZUJkzUn","0Wr5yni2v1",
+"FLsph618Di","Pb1paaez9y","GXdoHciuWz","tl72WfaHir","sx5GlG1RhS","Nxx9V4W0Tl","JKWYRSjskQ","ksJbyazIWp","lViBvlkMUA","HlUbFRmDcr",
+"L7cGcReKEW","0PktIVNCPd","F6PT2Uvlv4","uJScXDcpWB","5iGN5M3zXL","uoStwuTacx","guMb8No0Qb","Cfgr3VIlwP","O3iyQjiVBP","n1pmOBbwgA",
+"RBhp055rfB","soy9tzqH0W","RmDcrRsQUq","QnJ1S9XyT9","Waim68U2nU","zz4ZUPOUYS","POUYSlCMxy","uupzkwDajX","7fsYM9rlg9","a00b5OHaBz",
+"tlILt0h1b1","5Mg9rGXdoH","7lUXZJXljW","16lHcIKxdL","QWxoTzQt6Q","UlU3Mv1Hln","y94nwkB5nP","ydG8UlweGy","6q6L9n8pJ9","xXTI4bZLvS",
+"HlUbFPb1pa","BFkb8hYBCK","n1pmOdQ586","MojnPiqv4k","OUqFMOUYuF","v2eC3k85Ae","i3pydCK5W7","Z4I1vulk41","WmadAyvOMI","2Yz7EokgRi",
+"0ao3l9eoRc","yToGWRsQUq","X6PinuoStw","yvOMIWMiS3","HfyNQvOqCE","45cIHD6rBy","MmKGJCdyBV","qaofNhE1Ql","ulk41FVMxo","nFqikQ6hMC",
+"7X3uyRzaZA","24ARFhUTw7","QworujiVBP","F6PT2lsQGo","yToGW7hyVv","gdQsSzqH0W","uupzkNAFuw","cQOnvlpF6W","5Drn0fcwDa","sqVrfgjUTu",
+"zQt6QfcwDa","pWiOsXyPZN","FjHXRuJScX","ZzJHWpFrrl","2DREsO3iyQ","FcWrWpT8wu","cL0aE55rfB","7X3uyWDVWJ","zHF1qTwano","n8pJ9yofH3",
+"PYBf4aFFss","GrDg7sx5Gl","Ul4a1GSQwj","FPfSEYf2Ec","Mkgy8WDVWJ","RpBQmazIWp","AXpwE4W0Tl","lsQGoyluBx","Y1mC0jtn0X","QClRLCfgr3",
+"faHir618Di","X6Pin8RCUA","VIlwPgtCA5","taOXKrKDLJ","RzaZA29QAz","5nmWv4QMc9","NcICAaFFss","tvdkD5Mg9r","3otm65nmWv","o8UyduZPqg",
+"RzaZA1j5L8","zbIYY14FLR","WDVWJUlU3M","soy9t5Mg9r","0PktIJRJQB","hi5X7JIqXi","zqH0WokgRi","hYBCKnlaBy","dmoS7NOHsz","24ARFFcWrW",
+"MaJQs3otm6","ix74rDG4sT","UmaEvdjsrv","jS1ajHfyNQ","DcpWBECMvU","BFkb8VBjhz","rz7UtOUYuF","fLNg8JKWYR","piJSkZhwG1","Z4I1vWmadA",
+"uAWyp8FmFH","J2mQiW3VFH","t59lRXyPZN","4dEz6D6rBy","AgJHQ7X3uy","zQt6Q48cHL","QWxoT5Drn0","nnP8oHP433","y94nwWDVWJ","FxX9qOHaBz",
+"uPX7GVerEA","jSjS3mX2GE","7X3uyY1mC0","JkzUnVjCZq","AXpwEBGaQY","45cIHokgRi","e6e4zzFgtB","mz8gxGXdoH","WDVWJZuDtD","JkzUn9y4lw",
+"OUYuFlweGy","cL0aEGv3Fq","RpBQmRxrsm","t59lRPYBf4","0KyfsfaHir","U3yw5Mkgy8","MaJQsWMiS3","MmsIoD6rBy","29QAz8RCUA","2Nslmsoy9t",
+"KASQ8uQIcz","2TRI7WaWsv","sqVrfIRh48","fmIK15Mg9r","uQIczrz7Ut","B3qempWiOs","VerEAjzUqR","2TRI73weIF","uoStwprNT6","In3NS8FmFH",
+"9XyT97ku1p","nnP8oYOfrY","WMiS3lH1kt","G1RhSBbwgA","HfyNQRzaZA","lCMxyRzaZA","qaofNStlDJ","2NslmKsjRK","I7p2aBCxeC","cShY2jfREu",
+"lH1ktCxVEf","cQOnvzFgtB","MezSWZuDtD","ZUnqtL7cGc","Z4I1vjeskS","vLsmSn1pmO","07n1cxReec","0Wr5y1v5hH","taOXKiqv4k","29QAzUlU3M",
+"G1RhSuJScX","JRJQBuvf7A","1j5L8StlDJ","uLtKsJKWYR","9y4lwzY1GY","JXljWGXdoH","OHaBzfcwDa","aez9yG1RhS","fFDrJYh1hF","prNT68cVD3",
+"B3qemVBjhz","yluBxjzUqR","0Wr5yQYxC0","NOHszRACuj","fcJOyaez9y","IRh48RsQUq","QWxoTMkgy8","uLtKsvOqCE","QChxs8hJdt","16lHcJKWYR",
+"xciqpd7vjM","5VZjSWmadA","Ss0ZuRsQUq","iB08lTa8f6","prNT6U3yw5","lCMxy3weIF","1j5L8AXpwE","jeskSHRxd8","0h1b10BmCy","WMiS3MezSW",
+"uQIcz8cVD3","euZA50Kyfs","XyPZNCp3mZ","BbwgANhXdu","dpe1vCp3mZ","GWqqXv8yFN","FNYIM5ZaEz","6q6L9aFFss","ECMvUHfyNQ","FLsphMK07Y",
+"NAFuwo8Uyd","faHirMkgy8","yEfy9Y1mC0","piJSks93Ml","ECMvU9GXkX","MezSWGrDg7","x3LDeFVMxo","h1zcHCdyBV","MGlTFMezSW","HRxd8v8yFN",
+"uPX7GbZLvS","Waim6xXTI4","3otm6iqv4k","2NslmzQt6Q","tuDyScShY2","ksJby8cVD3","3weIF8RCUA","7fKYU5Namm","uZPqgvkCHH","ulk41cL0aE",
+"QssNC0h1b1","rz7UtBGaQY","07n1clm0pD","gjUTuy94nw","rKDLJSs0Zu","6q6L9RkQke","618DiEOE1o","0BmCyhSSvQ","aFFss4W0Tl","Cfgr3FLsph",
+"MGlTFCdyBV","e6e4z2Yz7E","0PktIsuY4x","d7vjMZJTXH","W3VFHcQOnv","blLA9lj07Q","ThjNnRACuj","hYBCK7Ow5C","DG4sTfcJOy","lsQGos7Mxk",
+"9rlg9MmKGJ","WmadA1v5hH","uvf7ApT8wu","5ZaEzFwEJz","zHF1qDz1R3","UlU3MLDk6f","7ku1pY1mC0","pWiOspFrrl","AkKTkcmXIX","WPmlxksJby",
+"2hEEUi7WMQ","64s8NHRxd8","MmKGJfmIK1","JIqXiMmsIo","iB08ltuDyS","SbRYyKr8ys","OUYuFfcwDa","EdBKcNOHsz","ZuDtDogLgc","FcWrW2hEEU",
+"0PktIgf8rI","XflUq8RCUA","gIYvEtlILt","GXdoHe6e4z","OxWIH5Drn0","0PktISbRYy","BpYhVlj07Q","RpBQmb29RJ","yEfy9lXFOB","a00b5ZUnqt",
+"aDGtSh1zcH","FGzgpfcwDa","BGaQYIn3NS","piJSkrhl0J","tjQxs0YAGH","uvf7AuoStw","sx5GlDG4sT","aez9yazIWp","uQIczbZLvS","Z4I1vQChxs",
+"BFkb8atef2","uoStwChuy3","uJScXKsjRK","EOE1oChuy3","1j5L8RmDcr","oQ87rBCxeC","uLtKsF6PT2","n8pJ9Twano","WaWsvyEfy9","4dEz6JJs5m",
+"QbxXcRpBQm","8xEKzpv0i7","zY1GYuoStw","m4bxUZv7z0","TwanoKsjRK","48cHLGv3Fq","64s8N580YD","RACujxXTI4","WDVWJxXTI4","yluBxpAhR1",
+"9y4lwtl72W","nnP8o0Kyfs","14FLRMezSW","PYBf4qQxHP","Uvlv4yluBx","1v5hHJRJQB","5Nammb29RJ","pmeCdVLTy6","FPfSEQWxoT","Oz8yZpmeCd",
+"8U2nUuAWyp","8TxD7MK07Y","1j5L8rz7Ut","07n1czQt6Q","MmKGJl83Ud","AkKTkrz7Ut","s93MlLDk6f","MmKGJjSjS3","sqVrfZv7z0","uvf7AzY1GY",
+"IRh48gtCA5","1j5L8v2eC3","i3pydM3zXL","ulk41QnJ1S","jS1ajgtCA5","1v5hHFLsph","SbRYy14FLR","EoToPrKDLJ","euZA5lViBv","4dEz6pvgjS",
+"D6rBy5VZjS","hYBCK5IhmG","RmDcrydG8U","LewvMuupzk","2TRI72Yz7E","tjQxs5IhmG","Nxx9VW3VFH","3otm6b29RJ","pFrrllkMUA","BFkb8tAOsr",
+"wiHrZcQOnv","pWiOsZ4I1v","lXFOB2Yz7E","PYBf4IRh48","prNT6WDVWJ","XflUqSmGzv","JJs5mCK5W7","Cp3mZn1pmO","bgJAzC2Irc","TCgPp6q6L9",
+"cmXIXUlU3M","gf8rIMm8si","BbwgAkB5nP","QClRLoGu6x","uvf7ACdyBV","7fsYMMmKGJ","LDk6fdmoS7","VjCZqReKEW","EOE1oxReec","L7cGcM3zXL",
+"v2eC3X6Pin","X6PinxReec","HlUbFiwzGk","jeskSKASQ8","xciqptl72W","Nxx9VIBe8k","1v5hH8hJdt","qaofNrz7Ut","HfyNQLbRTH","5IhmGdhSuH",
+"9iGoTCNHmv","kB5nPAgJHQ","0YAGHIBe8k","rhl0JJKWYR","AgJHQWaWsv","pvgjSlCMxy","0Wr5yKsjRK","uN6r38hJdt","CK5W7D6rBy","QYxC0Ss0Zu",
+"jeskSdQ586","7Ow5C580YD","Q6Lixn8pJ9","2NslmBCxeC","J2mQiCK5W7","KZamHLbRTH","rz7UtokgRi","GrDg72TRI7","nnP8oCxVEf","t59lRvLsmS",
+"suY4xCdyBV","RBhp0U3yw5","lsQGoJIqXi","KASQ8jS1aj","gf8rIxReec","iqv4ks7Mxk","zz4ZUZ4I1v","55rfBhe9IA","L7cGc0PktI","F6PT2uTacx",
+"9rlg9n8pJ9","hYBCKix74r","TCgPpaFFss","BFkb87Ow5C","1v5hH7ku1p","jSjS3tvdkD","6AFT0v1Hln","KsjRKksJby","GXdoHQClRL","v2eC35ZaEz",
+"pvgjSO3iyQ","AkKTkZzJHW","v8yFN1LB1L","ThjNnAOgEe","v8yFNL7cGc","XflUqcQOnv","Yw2oU9eoRc","MK07YpvgjS","lH1kt618Di","ru4UGyEfy9",
+"POUYS8FmFH","NOHszlkMUA","cQOnv5iGN5","tAOsrOHaBz","StlDJ5Namm","AIYUu7X3uy","618DijiVBP","0Wr5yNAFuw","yEfy9prNT6","In3NSL7cGc",
+"CNHmvzFgtB","tjQxsCdyBV","djsrvdhSuH","BbwgAgjUTu","tAOsrJRJQB","HzZT8WaWsv","mz8gxmX2GE","kB5nPNhXdu","WMiS3yvOMI","5IhmGK20wK",
+"uZPqgulk41","atef2TXQ0Z","Rxrsm8hJdt","zmLYDVerEA","dmoS7d7vjM","5VZjSO3iyQ","WMiS3FxX9q","faHirTwano","Waim6fqypy","d85a964s8N",
+"aez9yCK5W7","QClRLTa8f6","fcJOyGXdoH","fFDrJFVMxo","8xEKziqv4k","Zv7z0kZANm","xReec5ZaEz","TCgPprKDLJ","o8Uyd0ao3l","djsrvUvlv4",
+"2hEEUzHF1q","OUqFM4W0Tl","B3qemAmdQd","WaWsvIRh48","uLtKs9rlg9","B3qemv2eC3","xReecciuWz","5drc6pv0i7","NcICAFNYIM","ZuDtDQ6hMC",
+"FFDuixReec","1v5hHRBhp0","Kr8ysQChxs","S77LHblLA9","uQIcz0YAGH","dpe1v7fKYU","JRJQBk85Ae","AmdQdYw2oU","7fKYUi7WMQ","RzaZASWfou",
+"fqypynFqik","QssNCC2Irc","gf8rIi3pyd","lj07Qm4bxU","O3iyQkB5nP","qUJMdfcJOy","v8yFNrhl0J","kZANm8FmFH","POUYSpv0i7","BGaQYCxVEf",
+"jeskS6AFT0","FFDuiZzJHW","0h1b1AkKTk","ZUnqteuZA5","2Yz7EtaOXK","M6qcGFGzgp","yluBxqQxHP","aDGtSF6PT2","UmaEvJRJQB","vLsmSydG8U",
+"POUYSOUYuF","618DiVIlwP","Zv7z0M3zXL","t98iWFNYIM","No0QbWaim6","ReKEWRxrsm","Uvlv42hEEU","Pb1pa8hJdt","FLsphnlaBy","zqH0WnnP8o",
+"5Namm07n1c","zbIYYuZPqg","v2eC3CqqaD","cShY2lweGy","J2mQi8hJdt","4W0Tl7ku1p","ciuWzNcICA","AOgEeMK07Y","BFkb8uZPqg","euZA5guMb8",
+"5VZjSaez9y","RmDcrzbIYY","sx5Gl3weIF","bgJAz1v5hH","gIYvEjSjS3","SWfouAkKTk","mz8gxoQ87r","tuDySjSjS3","HlUbFZUnqt","bZLvSRzaZA",
+"s7MxkOUYuF","tjQxs2Yz7E","MmKGJY1mC0","AgJHQXflUq","suY4xRxrsm","tjQxsTXQ0Z","07n1cEOE1o","hE1Ql14FLR","faHirjS1aj","tAOsrd85a9",
+"uZPqg9eoRc","i7WMQuZPqg","4QMc9NhXdu","ZzJHWFnPFB","MK07YksJby","8cVD3euZA5","K20wKZhwG1","dQ586WmadA","8U2nUzbIYY","3otm68U2nU",
+"618Di7fKYU","pFrrlk85Ae","pAhR12Nslm","hYBCKbrhlQ","YjB9t48cHL","FnPFBX6Pin","EOE1oydG8U","I7p2aYh1hF","SbRYyd85a9","azIWpYw2oU",
+"EoToPQworu","Pb1pax3LDe","WPmlxWPmlx","VLTy6FNYIM","fqypy9iGoT","F6PT2jfREu","ni2v155rfB","wiHrZVLTy6","lm0pDdhSuH","a00b5b29RJ",
+"Q6LixRpBQm","qUJMdFxX9q","cL0aEzmLYD","F6PT2uPX7G","EdBKcF6PT2","F6PT2IjTwP","EOE1oksJby","8U2nUydG8U","a00b564s8N","cmXIXReKEW",
+"G1RhSJXljW","lm0pDpWiOs","rz7Utd85a9","jSjS32Yz7E","rhl0Jrz7Ut","cQOnvn1pmO","4dEz6yToGW","hSSvQyvOMI","MmsIo16lHc","618DiprNT6",
+"S77LH3otm6","RzaZA618Di","MezSWC2Irc","MmsIotuDyS","prNT6pmeCd","TCgPpuoStw","RxrsmWPmlx","Vprf26AFT0","CqqaDSjskQ","FjHXRSs0Zu",
+"DcpWBWDVWJ","2DREso8Uyd","LbRTHoVQp6","FnPFB7fsYM","Kr8ys14FLR","guMb8HlUbF","zHF1qdmoS7","DLhzMjSjS3","cQOnvpiJSk","tvdkDIRh48",
+"prNT6d85a9","pT8wuAOgEe","29QAzlweGy","sqVrfQnJ1S","FxX9qsuY4x","QssNClCMxy","O3iyQvkCHH","pT8wurz7Ut","TwanoKASQ8","9XyT9JKWYR",
+"L7cGcK20wK","hUTw7qaofN","hYBCKBGaQY","d7vjM0Kyfs","qQxHP07n1c","CdyBVgjUTu","8TxD7GSQwj","he9IA8xEKz","hSSvQ0Kyfs","GrDg7ulk41",
+"uupzkrz7Ut","jeskSSmGzv","WMiS35Mg9r","8TxD7pmeCd","fcwDasuY4x","2hEEUfaHir","lsQGoMojnP","zQt6QFGzgp","QWxoTB3qem","GXdoHl83Ud",
+"UlU3MuZPqg","FjHXR7fsYM","piJSkwDajX","yEfy9TXQ0Z","uN6r3vOqCE","guMb89eoRc","Yw2oUVNCPd","ECMvUs4786","1v5hHk85Ae","8TxD7GXdoH",
+"ZuDtDBpYhV","UmaEvzHF1q","HP433atef2","0PktI2DREs","Yh1hF7fsYM","07n1cvkCHH","vkCHHfcwDa","rz7UtuPX7G","UmaEvjzUqR","Ss0ZuiB08l",
+"KsjRKNo0Qb","B3qemFVMxo","qaofNPOUYS","oQ87rWreyP","OHaBzgtCA5","VjCZq16lHc","yofH3CqqaD","nlaByWaWsv","U3yw5No0Qb","In3NSDz1R3",
+"MmKGJb29RJ","ZzJHWprNT6","hYBCKyluBx","JIqXiHzZT8","L7cGcJkzUn","Pb1paVLTy6","VBjhzDLhzM","jSjS31v5hH","Qworu7ku1p","fcJOyStlDJ",
+"NOHszJKWYR","CxVEf5ZaEz","1j5L8s7Mxk","WmadAfmIK1","7ku1psuY4x","uupzkOHaBz","FFDuiMaJQs","8hJdtMaJQs","s7MxkFGzgp","I7p2aguMb8",
+"jtn0XuTacx","GXdoHvOqCE","7lUXZZ4I1v","6q6L9zbIYY","qaofNRxrsm","JJs5muJScX","8xEKzSbRYy","XyPZNuN6r3","POUYSjeskS","SbRYyDQimp",
+"MmsIoYw2oU","8TxD7uoStw","Oz8yZv2eC3","jiVBPs7Mxk","fqypy1LB1L","5ZaEz8cVD3","jSjS3Twano","MGlTFCIShG","fLNg89rlg9","h1zcHVerEA",
+"9XyT92Nslm","lm0pD2DREs","e6e4zrKDLJ","zQt6QB3qem","BpYhVLbRTH","zQt6QzmLYD","HzZT8LewvM","jeskSblLA9","0MR5X7fKYU","9eoRcwDajX",
+"uN6r3580YD","hYBCKCNHmv","JJs5mUvlv4","brhlQd85a9","uJScX0MR5X","tjQxsaDGtS","k85AelsQGo","OUqFMrhl0J","F6PT2NAFuw","29QAzNcICA",
+"MezSWs4786","7Ow5CCK5W7","5iGN5m4bxU","faHir580YD","GrDg7qQxHP","h1zcHZuDtD","LbRTHRpBQm","fcJOyMkgy8","9GXkXatef2","m4bxUM6qcG",
+"FwEJztuDyS","t59lRgdQsS","AmdQdFcWrW","NhXdulm0pD","ydG8UWaim6","VLTy6bgJAz","t98iWhUTw7","euZA5Chuy3","7lUXZ8cVD3","QYxC0pT8wu",
+"L7cGcXyPZN","qaofNuLtKs","QbxXcAOgEe","3otm65Mg9r","9XyT9JkzUn","GrDg7MmsIo","cL0aEJIqXi","euZA5S2Dfu","atef2lweGy","VjCZqtvdkD",
+"blLA9Z4I1v","2ZHdkni2v1","zQt6QNxx9V","iKqhr8TxD7","ix74rd7vjM","VerEA5drc6","xXTI4QssNC","hYBCKOxWIH","y94nw9iGoT","iB08li3pyd",
+"DG4sTbZLvS","8xEKz7fsYM","gIYvE16lHc","RpBQmWPmlx","t59lRlpF6W","2hEEU64s8N","DcpWB0MR5X","9iGoTF6PT2","9y4lwdmoS7","2ZHdkZuDtD",
+"K20wKVprf2","580YDtuDyS","IKxdLbZLvS","7ku1pt59lR","OxWIHTwano","JKWYRChuy3","VerEAWaim6","FNYIMFLsph","Ta8f6HzZT8","5iGN5sx5Gl",
+"3otm6cmXIX","LDk6f9iGoT","RkQkeF6PT2","n1pmOHfyNQ","QnJ1SCqqaD","DLhzM9XyT9","MGlTFS77LH","DQimpRBhp0","hYBCKNAFuw","KsjRKcQOnv",
+"blLA9piJSk","pT8wuAmdQd","RBhp0KsjRK","hE1Qlx3LDe","4QMc948cHL","9y4lwb29RJ","fqypyaFFss","2Yz7EAXpwE","bgJAzBbwgA","0PktIaFFss",
+"wDajXWMiS3","7hyVvpv0i7","OUYuF618Di","dQ586lpF6W","5drc6ciuWz","lsQGo48cHL","ru4UGRkQke","Uvlv4cShY2","U3yw5aFFss","3otm6OxWIH",
+"5nmWvuoStw","MmsIoJIqXi","jtn0XydG8U","KZamHdmoS7","cmXIXgIYvE","atef2uvf7A","7ku1pIKxdL","XflUqzqH0W","taOXK4QMc9","14FLRfFDrJ",
+"jiVBPfmIK1","fmIK1fFDrJ","FFDui14FLR","TwanojSjS3","okgRiNOHsz","jSjS3Q6hMC","kZANmPb1pa","M6qcGQbxXc","MK07YbZLvS","7ku1pHRxd8",
+"VjCZqYOfrY","Y1mC0RBhp0","ciuWzRzaZA","S2DfuHP433","MezSW6q6L9","tAOsrpAhR1","D6rByF6PT2","JIqXiprNT6","VBjhzzqH0W","tjQxslsQGo",
+"Gv3FqjiVBP","BGaQYtjQxs","7fsYM3weIF","oQ87ruN6r3","jfREu8RCUA","Mkgy85iGN5","2ZHdkyofH3","lXFOBjzUqR","aDGtS7X3uy","5VZjSYw2oU",
+"qaofN9eoRc","s93MlL7cGc","t59lR45cIH","Z4I1vOUqFM","5nmWvMezSW","K20wKv2eC3","QWxoT3otm6","9XyT9lXFOB","S2DfudQ586","Cp3mZMkgy8",
+"jeskSCNHmv","7Ow5CSjskQ","yEfy9atef2","5ZaEzpv0i7","LewvM2DREs","SmGzvAgJHQ","AkKTkn1pmO","24ARFTCgPp","JJs5mWaim6","nFqik2ZHdk",
+"RpBQmUl4a1","5drc6vLsmS","Q6LixRACuj","Waim6IjTwP","pT8wujS1aj","24ARFGWqqX","GWqqXRBhp0","ciuWzguMb8","Rxrsm7fKYU","nlaBy7fKYU",
+"SbRYyUmaEv","ZJTXH0ao3l","i7WMQWreyP","oVQp6nnP8o","suY4xydG8U","hYBCKcL0aE","WMiS3KASQ8","lpF6WvLsmS","Nxx9V2TRI7","hYBCKrKDLJ",
+"hYBCKFhtgl","gjUTuKr8ys","uN6r3DQimp","v1HlnlH1kt","FVMxoOUYuF","QYxC0k85Ae","In3NSRBhp0","aL6AJRsQUq","pWiOs9eoRc","Zv7z0HzZT8",
+"8TxD7EOE1o","QChxsFGzgp","hi5X7qaofN","vkCHHokgRi","MaJQs7hyVv","yvOMIAXpwE","Nxx9VvOqCE","QbxXcZhwG1","JRJQBFjHXR","bZLvScL0aE",
+"ciuWzCdyBV","2DREsqaofN","5Drn0DG4sT","jzUqRzFgtB","CK5W7pFrrl","jS1aj9XyT9","14FLRPYBf4","zbIYYIn3NS","TwanoIBe8k","tlILtl83Ud",
+"RACujMmsIo","Ss0ZuAOgEe","Chuy35VZjS","TwanoMK07Y","he9IAkZANm","ZhwG12Nslm","6q6L9guMb8","Yf2EcO3iyQ","OxWIHlH1kt","uTacx8RCUA",
+"48cHLSjskQ","sqVrfLewvM","PYBf4n8pJ9","14FLRpiJSk","XyPZNyofH3","yvOMIHRxd8","KZamHMezSW","SbRYy9GXkX","kB5nP4dEz6","SjskQCxVEf",
+"9eoRcGrDg7","cShY2Cp3mZ","7ku1pNo0Qb","FnPFBnlaBy","7fsYMFFDui","FLsphoGu6x","tvdkDa00b5","IBe8kni2v1","lXFOBSbRYy","HlUbFqQxHP",
+"UmaEvcQOnv","pT8wuVprf2","2DREsBpYhV","HzZT8RmDcr","VLTy6okgRi","FhtglJRJQB","LewvM8cVD3","7ku1ph1zcH","tAOsr2hEEU","euZA5UmaEv",
+"soy9tiqv4k","zqH0WHRxd8","rhl0JQYxC0","aez9yCxVEf","5nmWvmz8gx","Q6LixECMvU","NOHsz0BmCy","XyPZNlsQGo","pWiOsTwano","Ul4a1ix74r",
+"RxrsmfLNg8","yEfy9rz7Ut","oGu6xiqv4k","8xEKzX6Pin","QYxC0VIlwP","atef2S2Dfu","pAhR1QssNC","sqVrfGSQwj","JKWYRv2eC3","9GXkXvkCHH",
+"Ul4a1OUqFM","OxWIHO3iyQ","O3iyQFnPFB","0MR5Xv1Hln","OxWIHVjCZq","he9IA07n1c","n1pmOksJby","D6rByChuy3","wiHrZfaHir","dQ586WreyP",
+"Gv3FqNcICA","CqqaDkZANm","pmeCdsx5Gl","iwzGkReKEW","Mm8siRmDcr","jzUqRi7WMQ","WaWsvSWfou","StlDJX6Pin","euZA5RBhp0","IBe8kFGzgp",
+"7ku1pLDk6f","5Mg9rChuy3","FNYIMVIlwP","NcICAVBjhz","VBjhzYf2Ec","KASQ8djsrv","zqH0WEdBKc","Pb1paBCxeC","uZPqgbZLvS","jtn0XfLNg8",
+"zQt6QC2Irc","0Kyfs16lHc","AkKTkStlDJ","ZuDtDgtCA5","JJs5myToGW","5Drn0EOE1o","lH1ktGXdoH","dpe1v2Nslm","yofH3cmXIX","CNHmvqaofN",
+"16lHcZUnqt","wDajXdhSuH","cQOnvThjNn","lkMUABpYhV","L7cGc07n1c","v2eC3fmIK1","lH1kt24ARF","S77LHfLNg8","2Yz7EuJScX","nlaByFcWrW",
+"FLsphuN6r3","ix74rCp3mZ","2hEEU7fKYU","lH1ktVLTy6","v8yFNRzaZA","yEfy9CNHmv","yEfy9UmaEv","QYxC0zHF1q","QClRLJKWYR","OHaBzO3iyQ",
+"SWfouJXljW","DG4sTO3iyQ","i3pydiwzGk","VjCZqcmXIX","aDGtSoGu6x","Q6LixStlDJ","s93MlYOfrY","DG4sTdjsrv","VjCZq0PktI","SmGzvI7p2a",
+"jtn0XJ2mQi","okgRiAOgEe","GSQwj8U2nU","nlaByciuWz","M6qcGYOfrY","tAOsr1v5hH","dmoS78cVD3","ZUnqtTa8f6","Cfgr3vkCHH","nnP8orKDLJ",
+"618DijfREu","nnP8oStlDJ","nlaByyluBx","yofH3SWfou","5drc62Yz7E","uQIczYh1hF","GSQwjZ4I1v","D6rByFGzgp","dQ586lXFOB","WaWsvMGlTF",
+"RkQke24ARF","0MR5XzmLYD","D6rBynFqik","yofH3pT8wu","ydG8UZhwG1","5Mg9rrz7Ut","gtCA55iGN5","Pb1paru4UG","QChxsbrhlQ","TXQ0ZUmaEv",
+"lH1ktRBhp0","CIShGuPX7G","mz8gxokgRi","0PktICK5W7","djsrvF6PT2","FLsphxciqp","RBhp0zFgtB","zmLYDChuy3","VIlwPlj07Q","Gv3FqHP433",
+"hUTw7Yf2Ec","jtn0Xru4UG","yofH3YjB9t","U3yw5a00b5","dpe1vHRxd8","hUTw7Dz1R3","FhtglkZANm","Ta8f6vLsmS","he9IAtuDyS","2hEEUa00b5",
+"ReKEWSWfou","U3yw5KASQ8","16lHclXFOB","ThjNnuAWyp","M6qcG0ao3l","RpBQmECMvU","AgJHQIKxdL","SjskQTwano","B3qemLDk6f","Pb1pa5IhmG",
+"24ARFwDajX","xXTI4Ss0Zu","EOE1oHzZT8","QssNCBbwgA","fcwDaW7cTs","GSQwjt59lR","fcJOyFwEJz","5iGN58FmFH","16lHczFgtB","B3qem8xEKz",
+"LewvMpAhR1","tvdkDv8yFN","7X3uyuN6r3","Chuy3jSjS3","tAOsr0PktI","9GXkXNhXdu","gdQsSYOfrY","5Drn0d7vjM","vLsmS1LB1L","ni2v1dmoS7",
+"rKDLJMmKGJ","5ZaEzJ2mQi","2ZHdkvLsmS","X6PinQssNC","d85a94W0Tl","blLA9CIShG","FVMxo0MR5X","SjskQlm0pD","5IhmGix74r","FFDuiCqqaD",
+"fmIK1qQxHP","S2Dfujtn0X","Kr8ysFGzgp","Gv3FqJRJQB","55rfBKASQ8","FLsphlm0pD","3otm6jtn0X","9GXkXJJs5m","6q6L9he9IA","0Wr5ypvgjS",
+"FLsph0Kyfs","QbxXctjQxs","y94nwyofH3","piJSkk85Ae","lsQGoUvlv4","55rfBd85a9","HzZT8Mm8si","zmLYD0ao3l","zHF1quAWyp","Q6hMCEdBKc",
+"jiVBPaez9y","7Ow5CYf2Ec","F6PT2sx5Gl","tAOsrCfgr3","Pb1paksJby","2hEEU0YAGH","uAWypAgJHQ","tvdkDAgJHQ","tl72W8hJdt","lkMUACfgr3",
+"d7vjMo8Uyd","hYBCKHP433","oVQp6Q6hMC","suY4xQworu","BGaQYjzUqR","QClRLgIYvE","BCxeCDG4sT","FFDuiAXpwE","l83UddhSuH","5Mg9rwiHrZ",
+"tvdkDBGaQY","Y1mC08FmFH","0YAGHYjB9t","3weIFblLA9","VBjhzRBhp0","Ul4a1n8pJ9","WaWsvZhwG1","a00b5618Di","iKqhrSWfou","o8Uydfqypy",
+"CK5W764s8N","rKDLJJKWYR","XflUqn8pJ9","5iGN50BmCy","tAOsrHP433","0ao3lQClRL","fFDrJsuY4x","QssNC8hJdt","QbxXc5IhmG","HzZT8D6rBy",
+"NAFuwulk41","GXdoHIBe8k","2hEEUpvgjS","8FmFHfqypy","o8UydlH1kt","5Mg9rfcwDa","lweGysx5Gl","CK5W7GWqqX","lweGyMmKGJ","ydG8US2Dfu",
+"7ku1pSmGzv","FPfSEgf8rI","618DizY1GY","618DiEoToP","tlILtQnJ1S","9eoRc1j5L8","qQxHPaL6AJ","Cfgr3W3VFH","oQ87rS2Dfu","Cfgr30MR5X",
+"rhl0JMGlTF","Cp3mZsqVrf","RmDcrOz8yZ","pmeCdPYBf4","pvgjSTa8f6","5iGN516lHc","MmKGJRBhp0","S2DfuQbxXc","YOfrYhYBCK","24ARF0YAGH",
+"b29RJQClRL","Ta8f6pFrrl","pT8wu3weIF","uoStwJJs5m","L7cGcSmGzv","uvf7AZzJHW","hYBCKC2Irc","jeskSuJScX","ECMvUulk41","n8pJ9ogLgc",
+"No0QbDLhzM","rKDLJPYBf4","gf8rIv2eC3","i3pyds4786","ECMvUGWqqX","FnPFBjzUqR","kB5nPzbIYY","oQ87rd85a9","14FLRFxX9q","1LB1LkB5nP",
+"GrDg7BCxeC","0ao3lGWqqX","fFDrJv2eC3","gdQsSPYBf4","uN6r3ciuWz","bZLvSn8pJ9","CK5W7Waim6","KZamHuPX7G","lViBvfLNg8","FLsphQ6hMC",
+"PYBf4ECMvU","nnP8on1pmO","AkKTkhYBCK","x3LDe24ARF","Yh1hFD6rBy","okgRiGv3Fq","0Wr5yHfyNQ","gjUTu3weIF","GXdoHQ6Lix","tvdkDgf8rI",
+"HlUbFsqVrf","9rlg9C2Irc","C2IrceuZA5","aez9ynlaBy","M6qcGoGu6x","IRh48ciuWz","SmGzvs7Mxk","faHirRsQUq","16lHcFPfSE","rhl0JuPX7G",
+"618Didjsrv","EOE1oZJTXH","OxWIHtlILt","tlILtlsQGo","zz4ZU5IhmG","jiVBP7hyVv","tuDySSbRYy","3weIFG1RhS","BCxeCQworu","RxrsmuAWyp",
+"BFkb8oVQp6","pv0i7pWiOs","0BmCyo8Uyd","W3VFHUvlv4","FVMxoMojnP","iKqhrxciqp","4QMc9gtCA5","Cp3mZZuDtD","MaJQsO3iyQ","Cfgr3zmLYD",
+"uTacxIBe8k","DcpWBZzJHW","ciuWzfcwDa","fcwDauTacx","k85AeDQimp","zqH0WbrhlQ","pAhR10MR5X","8cVD3ZuDtD","5NammaL6AJ","uupzkWaWsv",
+"2TRI7dpe1v","euZA5azIWp","fLNg8dpe1v","oGu6xtaOXK","CxVEfRpBQm","14FLRSjskQ","dpe1v64s8N","2NslmlH1kt","dpe1v0BmCy","bgJAzJJs5m",
+"i7WMQ7ku1p","GSQwjMezSW","C2IrcgjUTu","tjQxswiHrZ","SjskQsuY4x","K4GS8zmLYD","MaJQsCK5W7","QssNCgdQsS","lH1ktFNYIM","gIYvEYf2Ec",
+"ReKEW7hyVv","TXQ0Zdjsrv","sqVrfqaofN","IRh48qUJMd","Yh1hFW3VFH","xciqp2Yz7E","lj07QoQ87r","atef2x3LDe","0MR5XQworu","AgJHQe6e4z",
+"CqqaDtAOsr","uvf7Ahi5X7","FjHXRcQOnv","Mkgy8F6PT2","5nmWvGXdoH","fqypypv0i7","lsQGoI7p2a","jzUqR2TRI7","W3VFHStlDJ","iB08lCfgr3",
+"d7vjMprNT6","POUYSiwzGk","RkQkeD6rBy","QnJ1S5iGN5","qUJMdkB5nP","uTacxdQ586","BCxeCOz8yZ","RpBQm7fKYU","jzUqR8RCUA","CdyBV0ao3l",
+"ogLgcdmoS7","7X3uyQ6hMC","y94nwNo0Qb","5Drn0l83Ud","kZANmZhwG1","cmXIXRpBQm","S2DfuQnJ1S","RpBQm1j5L8","sqVrfBpYhV","DQimpMojnP",
+"hYBCKjfREu","uZPqghYBCK","HfyNQWmadA","suY4xBCxeC","Chuy3rhl0J","7X3uyCdyBV","gIYvEVIlwP","QWxoTvOqCE","cQOnvFjHXR","UlU3ML7cGc",
+"P6bcgUl4a1","9XyT9zFgtB","3otm6uoStw","ECMvUZJTXH","XflUq618Di","RkQke5ZaEz","JIqXi6AFT0","7ku1pU3yw5","yofH3J2mQi","9y4lwQWxoT",
+"1v5hH8xEKz","FcWrWuupzk","QnJ1S580YD","uAWypaFFss","Yw2oU2TRI7","lsQGojSjS3","S77LHru4UG","fcwDaRzaZA","hYBCKjiVBP","hUTw73weIF",
+"FPfSEX6Pin","9GXkXW3VFH","lsQGo2ZHdk","pWiOspmeCd","oVQp6WPmlx","7hyVvzQt6Q","ZJTXHk85Ae","K4GS8DLhzM","FxX9qTXQ0Z","pT8wuZUnqt",
+"WPmlxQYxC0","s7MxkuQIcz","Yw2oUhi5X7","GWqqXReKEW","tlILtZzJHW","fLNg8suY4x","QnJ1Ssx5Gl","UmaEvyEfy9","DQimp4dEz6","iKqhrI7p2a",
+"Ul4a1jfREu","oVQp6nlaBy","xReec7fsYM","yvOMIaez9y","AkKTk4dEz6","fLNg8KZamH","0Wr5yB3qem","In3NScL0aE","3weIFJIqXi","sqVrf7fKYU",
+"5NammpvgjS","ciuWzFcWrW","lCMxys4786","gdQsSRzaZA","FwEJzEdBKc","tlILt5ZaEz","zz4ZUxXTI4","hi5X724ARF","0ao3l5Drn0","hi5X7TXQ0Z",
+"VerEAAkKTk","xReec2hEEU","Chuy348cHL","aDGtS5drc6","jfREu5Drn0","7ku1ps93Ml","L7cGcsx5Gl","MezSW580YD","gdQsSatef2","uupzkdmoS7",
+"FGzgpzHF1q","zQt6QSmGzv","hE1QlBCxeC","CxVEflsQGo","JKWYRUvlv4","uJScX4QMc9","2Yz7E5Mg9r","BCxeCWDVWJ","JkzUnVIlwP","JIqXiDLhzM",
+"Ss0ZuCxVEf","wiHrZjtn0X","55rfBix74r","Y1mC0CqqaD","CdyBVzFgtB","s93Mlhi5X7","7hyVvuQIcz","uoStwKZamH","Kr8ys0Wr5y","cQOnvUl4a1",
+"n8pJ9pWiOs","5drc67Ow5C","5nmWv6q6L9","v8yFNbZLvS","2hEEUfqypy","sqVrfpvgjS","l83UdCIShG","LbRTHMaJQs","aFFssxReec","YOfrYi7WMQ",
+"kZANm0BmCy","tvdkD07n1c","rhl0JtlILt","KASQ8L7cGc","vLsmSfcJOy","2DREsCNHmv","DLhzMMojnP","580YDDz1R3","faHirt59lR","tvdkDYjB9t",
+"HP433gIYvE","s7MxkgdQsS","8RCUAd85a9","B3qemuQIcz","VjCZqyluBx","C2IrccShY2","ZJTXH0MR5X","aL6AJ5ZaEz","faHirXyPZN","CxVEfRsQUq",
+"0MR5X9GXkX","WaWsvNo0Qb","qaofNFLsph","oQ87rjtn0X","ZUnqtCdyBV","Dz1R3CK5W7","1LB1LQ6Lix","yToGW48cHL","GWqqXJXljW","PYBf4NAFuw",
+"TXQ0ZWmadA","VIlwPtjQxs","zHF1qzHF1q","5IhmG5ZaEz","lsQGopiJSk","gtCA5hYBCK","7ku1p07n1c","ni2v1VNCPd","BpYhV45cIH","PYBf4BGaQY",
+"fFDrJIBe8k","azIWpMK07Y","lj07QydG8U","jiVBPPYBf4","Kr8ysSjskQ","VNCPdVBjhz","k85Aepv0i7","2TRI7X6Pin","4dEz6hYBCK","a00b5jtn0X",
+"WPmlxMkgy8","VLTy6jS1aj","AkKTk2ZHdk","Mm8siRzaZA","W7cTsCxVEf","OUYuFtjQxs","soy9tsqVrf","D6rBypT8wu","24ARFzz4ZU","TXQ0Z5IhmG",
+"I7p2afFDrJ","bgJAzhUTw7","Y1mC00BmCy","Kr8ys0YAGH","7hyVvGXdoH","nFqikzFgtB","I7p2aYOfrY","MezSW7fsYM","NAFuwd85a9","WmadAjS1aj",
+"d7vjMIRh48","rhl0JyofH3","VLTy6tjQxs","0BmCy8TxD7","5VZjSF6PT2","Yh1hFJIqXi","WmadAWDVWJ","uZPqgSs0Zu","O3iyQQworu","RpBQmyluBx",
+"pT8wuvOqCE","CdyBVfaHir","EoToPG1RhS","o8UydNOHsz","0BmCyjzUqR","EOE1o45cIH","8FmFHtAOsr","HlUbFbZLvS","No0QbpT8wu","pvgjSt98iW",
+"ZhwG1cQOnv","8U2nUl83Ud","piJSkFxX9q","7Ow5COUqFM","M3zXLQworu","NAFuwUmaEv","5IhmGrhl0J","GSQwjJXljW","DQimpzY1GY","9y4lw7X3uy",
+"jeskSo8Uyd","IRh48QnJ1S","Yh1hF0BmCy","ECMvUOUqFM","0YAGH0PktI","48cHLHzZT8","piJSkYf2Ec","fcwDa5drc6","jfREuCfgr3","pv0i7S77LH",
+"6AFT02hEEU","7hyVv5drc6","SWfou2Nslm","BbwgAvkCHH","HP433euZA5","Y1mC0Oz8yZ","OUqFMYw2oU","cmXIXjtn0X","FjHXRt59lR","jtn0XguMb8",
+"kB5nPYjB9t","okgRiy94nw","SmGzvi7WMQ","FLsphlj07Q","W3VFHe6e4z","EOE1osuY4x","VBjhzcShY2","0KyfsDz1R3","gjUTuQYxC0","8RCUAcmXIX",
+"2Yz7Ee6e4z","HRxd8ksJby","5iGN57hyVv","DG4sTZhwG1","FLsphCNHmv","hSSvQL7cGc","BGaQYMezSW","KZamHRxrsm","hUTw7kB5nP","2Nslmatef2",
+"IRh48nnP8o","gjUTu5ZaEz","uAWyplXFOB","M3zXLEdBKc","NcICAaL6AJ","TXQ0ZM3zXL","GXdoH29QAz","8TxD7Dz1R3","cShY2oQ87r","CIShG0BmCy",
+"AmdQdzFgtB","KZamHgf8rI","NhXduVLTy6","RBhp0VjCZq","m4bxU5iGN5","t59lRaL6AJ","Q6hMCWaWsv","i7WMQX6Pin","iKqhrxReec","AgJHQzY1GY",
+"yEfy9yluBx","45cIHyToGW","yvOMIguMb8","1j5L8618Di","NhXduU3yw5","lj07Q580YD","XyPZNt59lR","QClRLvOqCE","cmXIXWaWsv","Vprf2OxWIH",
+"dmoS7CK5W7","1LB1L45cIH","GrDg7BbwgA","29QAzlCMxy","zFgtBgIYvE","No0QbuAWyp","VerEAPYBf4","ni2v1PYBf4","qaofN3otm6","SbRYyzmLYD",
+"jfREuW7cTs","iKqhrQWxoT","rhl0JMezSW","AOgEeJRJQB","1LB1LyofH3","Z4I1vNhXdu","2TRI7ciuWz","1v5hH7lUXZ","fmIK1ZuDtD","a00b5MojnP",
+"8RCUAEoToP","WPmlxI7p2a","fmIK1W7cTs","5Drn0zmLYD","FPfSEFxX9q","lsQGoQChxs","MK07YkZANm","JKWYR0MR5X","QnJ1Sni2v1","CdyBVG1RhS",
+"aFFssv1Hln","ZUnqtuN6r3","ogLgcGv3Fq","euZA5Mkgy8","OUYuFMGlTF","hUTw7CxVEf","QYxC06q6L9","djsrvPb1pa","0MR5XWaWsv","t98iWlViBv",
+"5iGN545cIH","YjB9tUlU3M","XflUq5Namm","gtCA5Dz1R3","P6bcgZzJHW","GXdoHWPmlx","TCgPpqaofN","Yf2EcYjB9t","BpYhVfaHir","RBhp0JXljW",
+"ru4UGNo0Qb","UlU3M0Wr5y","uN6r3x3LDe","b29RJsqVrf","jtn0XlViBv","zqH0WRACuj","IjTwPCNHmv","CIShGsuY4x","SmGzv2ZHdk","IBe8kD6rBy",
+"JkzUn4QMc9","7fsYMi7WMQ","CdyBVChuy3","ECMvUPYBf4","VjCZq5Mg9r","qaofNuAWyp","8FmFHDQimp","lkMUAa00b5","1v5hHzmLYD","YjB9tAgJHQ",
+"NcICAJIqXi","FhtglHfyNQ","RxrsmMmKGJ","cmXIXFPfSE","SmGzvIBe8k","hE1Qla00b5","gdQsSXflUq","GrDg7t98iW","vkCHH6AFT0","5NammbZLvS",
+"gdQsSAgJHQ","ksJbyOHaBz","lH1ktmz8gx","1LB1LuN6r3","ix74rx3LDe","tlILtZ4I1v","OHaBzBbwgA","MK07YNo0Qb","5Mg9rNcICA","9rlg9sx5Gl",
+"DG4sTVjCZq","fmIK1lj07Q","MmKGJWaWsv","SmGzv7X3uy","ZhwG1t98iW","D6rByCIShG","WaWsvHP433","TXQ0Z24ARF","7fsYMlsQGo","OxWIHIjTwP",
+"7Ow5C5nmWv","6q6L9RzaZA","RsQUqtuDyS","BpYhV2Nslm","BGaQY7Ow5C","RsQUqaDGtS","3weIF45cIH","FjHXRQssNC","bZLvSzHF1q","pWiOsCqqaD",
+"WDVWJ07n1c","RmDcrfcwDa","gdQsS48cHL","6q6L9LbRTH","CIShGJkzUn","CdyBVYf2Ec","WmadA64s8N","rhl0Jsx5Gl","OHaBzFGzgp","XflUqTa8f6",
+"fLNg8euZA5","W7cTs5iGN5","MK07YHfyNQ","No0QbzHF1q","0h1b15Mg9r","Waim6Mkgy8","ZJTXHguMb8","lsQGoVprf2","s93Mld85a9","yToGWdQ586",
+"3weIFix74r","tl72WW7cTs","BFkb8RmDcr","dmoS7s93Ml","2TRI7uTacx","VBjhzjSjS3","tlILt8RCUA","jtn0XFhtgl","he9IAru4UG","0BmCyJJs5m",
+"FwEJz5drc6","jtn0X16lHc","RpBQmsqVrf","4QMc9uQIcz","dmoS7VNCPd","29QAz9GXkX","uQIczd7vjM","U3yw5t59lR","uvf7AaFFss","gjUTuWDVWJ",
+"FGzgphe9IA","2ZHdkTwano","sx5GlBCxeC","oVQp6jiVBP","pFrrlEoToP","dmoS7YOfrY","zFgtBPYBf4","b29RJBbwgA","IKxdLsqVrf","J2mQiAkKTk",
+"ECMvUyvOMI","UlU3MVjCZq","EOE1oECMvU","rhl0J9y4lw","P6bcgQ6hMC","NAFuwY1mC0","5nmWvTCgPp","NOHsz1j5L8","KZamHJ2mQi","ulk4145cIH",
+"QbxXczqH0W","GWqqXSjskQ","ulk41FFDui","rKDLJ5iGN5","okgRin1pmO","qUJMdokgRi","tl72W9XyT9","J2mQiXyPZN","3weIFCxVEf","PYBf41LB1L",
+"zqH0WCK5W7","piJSkAXpwE","AIYUuNAFuw","5nmWv48cHL","MGlTFyEfy9","faHir07n1c","0Kyfs0Kyfs","okgRiFFDui","iwzGkuoStw","7hyVvO3iyQ",
+"2NslmaDGtS","Cp3mZFnPFB","Waim6tAOsr","x3LDelH1kt","ZJTXHNAFuw","uN6r3FnPFB","CdyBVQnJ1S","EoToPRkQke","2Yz7Etl72W","FVMxogjUTu",
+"GrDg7K4GS8","5iGN5KASQ8","Vprf2yvOMI","AXpwEvOqCE","GWqqXqQxHP","MGlTFpWiOs","MmsIoOUYuF","0BmCyni2v1","uvf7AVjCZq","0Wr5yMojnP",
+"oQ87rnFqik","XflUqBGaQY","pv0i7oQ87r","IRh48W3VFH","2ZHdkFLsph","Dz1R3RACuj","cL0aEcQOnv","IjTwPLewvM","7fKYUIBe8k","uN6r3Nxx9V",
+"AgJHQWDVWJ","t59lRM3zXL","0KyfsgIYvE","s4786VjCZq","1LB1L5drc6","faHirUl4a1","DG4sTUlU3M","2TRI77X3uy","a00b5hSSvQ","jzUqR24ARF",
+"aL6AJ0MR5X","SbRYyS2Dfu","Cfgr3qUJMd","8RCUADQimp","t59lRCdyBV","uvf7ACIShG","DLhzMlH1kt","tl72Wv1Hln","KZamHNo0Qb","uN6r3cShY2",
+"faHirECMvU","CxVEfUl4a1","MmsIoPYBf4","IRh48Oz8yZ","Uvlv4MGlTF","9iGoT4dEz6","QWxoT9XyT9","MGlTFKr8ys","brhlQU3yw5","BCxeCMK07Y",
+"v1Hln9GXkX","jeskS7fsYM","Cp3mZpmeCd","45cIHFwEJz","MojnPJRJQB","piJSk2Nslm","ZuDtDatef2","Oz8yZCdyBV","ksJbyciuWz","9rlg91LB1L",
+"8FmFHFxX9q","s7MxktlILt","rKDLJMm8si","qQxHPTCgPp","fmIK1jiVBP","tvdkDZhwG1","i7WMQcQOnv","8RCUAazIWp","uoStwQ6hMC","BpYhVpWiOs",
+"X6PinQbxXc","fqypy07n1c","ksJbynlaBy","IBe8krhl0J","kB5nPC2Irc","lXFOBZJTXH","VIlwP2Yz7E","sx5GlPb1pa","4W0TlhUTw7","vkCHHZv7z0",
+"zmLYDOUYuF","LbRTHVprf2","HRxd89GXkX","l83Ud7ku1p","1v5hHru4UG","yluBxWPmlx","OHaBzpv0i7","SjskQatef2","dmoS7MK07Y","OHaBzSWfou",
+"hYBCKwDajX","RACujnnP8o","BFkb8n1pmO","RBhp0X6Pin","v1Hlndjsrv","LewvMZuDtD","8U2nUxXTI4","Ss0ZuYf2Ec","FPfSEulk41","Ul4a1cShY2",
+"YOfrYv1Hln","dQ586gIYvE","v8yFNfqypy","ECMvUatef2","uTacx8hJdt","iwzGkFwEJz","jSjS3CK5W7","uTacx5VZjS","XflUqZv7z0","580YDFnPFB",
+"uN6r3FcWrW","AXpwEQworu","MaJQsIn3NS","FLsphI7p2a","ciuWzFFDui","8RCUAi7WMQ","9GXkXMaJQs","hSSvQMezSW","FLsphwDajX","fcJOyQbxXc",
+"BCxeC0Wr5y","hUTw7oVQp6","MaJQsv8yFN","8FmFHZJTXH","RmDcr0ao3l","UlU3MtuDyS","6q6L9b29RJ","v2eC37Ow5C","Ul4a1HfyNQ","QChxs2hEEU",
+"2ZHdk7fKYU","jtn0XWDVWJ","NAFuw3weIF","2ZHdkguMb8","ReKEWgjUTu","JIqXiG1RhS","tlILtpT8wu","XflUqHlUbF","HfyNQAkKTk","580YDx3LDe",
+"1j5L8FcWrW","9rlg9lsQGo","ru4UGFFDui","ix74rRmDcr","55rfBZuDtD","oQ87rStlDJ","k85Aev8yFN","pFrrlfaHir","lkMUAK20wK","24ARFBbwgA",
+"MK07Y5nmWv","3otm6tuDyS","FPfSEP6bcg","NOHszuQIcz","RACujt98iW","DG4sTzmLYD","ZUnqtXyPZN","lViBvUmaEv","FNYIMTa8f6","HzZT8FjHXR",
+"WmadARsQUq","1LB1Lt59lR","b29RJaez9y","ThjNnIRh48","J2mQiMGlTF","EdBKctl72W","MezSW0BmCy","7ku1ppiJSk","aDGtSlXFOB","VjCZqokgRi",
+"hE1QlgIYvE","jfREuZuDtD","BCxeC1LB1L","tvdkDo8Uyd","ThjNnP6bcg","FLsphn1pmO","tlILtrhl0J","zFgtBsx5Gl","tAOsr4W0Tl","yToGW6AFT0",
+"uLtKsY1mC0","DQimpLDk6f","v1HlnX6Pin","jiVBPP6bcg","zz4ZU7fsYM","7hyVvAXpwE","azIWpuupzk","zmLYDbgJAz","7hyVvU3yw5","1j5L8yvOMI",
+"UlU3MhSSvQ","Ul4a1HlUbF","zHF1qZuDtD","Rxrsm5IhmG","LewvMuPX7G","RsQUqMkgy8","QChxs7lUXZ","AOgEeulk41","dmoS7OxWIH","2NslmvkCHH",
+"l83UdFLsph","h1zcHOUqFM","8TxD77ku1p","vLsmS2Yz7E","s7MxkLbRTH","HRxd8hUTw7","O3iyQ8FmFH","jiVBPKZamH","WMiS3aez9y","QnJ1SCp3mZ",
+"Cfgr3sqVrf","pv0i748cHL","RpBQmRACuj","lViBvlXFOB","7fKYUpmeCd","5drc6gtCA5","QworuBbwgA","16lHcyToGW","s4786SmGzv","ix74r9y4lw",
+"nFqiklkMUA","YjB9trhl0J","qUJMdDQimp","qQxHPQClRL","55rfBK20wK","IRh48S77LH","jtn0X9y4lw","yluBx2ZHdk","VBjhztvdkD","cmXIXuQIcz",
+"VLTy6lH1kt","55rfB5Drn0","e6e4zciuWz","xReecJXljW","CxVEfpAhR1","Chuy3FGzgp","TXQ0ZCK5W7","EOE1owiHrZ","qUJMdfFDrJ","3weIFWPmlx",
+"h1zcH6q6L9","sx5GlZJTXH","3otm6VerEA","JkzUncL0aE","9y4lwjiVBP","KASQ8DQimp","fmIK1d7vjM","ZJTXHRsQUq","Q6hMC9y4lw","SmGzvGXdoH",
+"fqypyOHaBz","J2mQiiKqhr","JRJQBRkQke","fcJOy0Kyfs","WmadA7fKYU","mX2GEuTacx","14FLRCfgr3","Waim6hSSvQ","v2eC3jzUqR","Yh1hFQChxs",
+"8hJdtEoToP","CK5W707n1c","IjTwPHfyNQ","b29RJIRh48","LbRTHJRJQB","DG4sT9XyT9","0PktIFxX9q","Ul4a15Mg9r","a00b51j5L8","jS1ajBpYhV",
+"POUYSL7cGc","lsQGoFhtgl","Vprf2gdQsS","zbIYYTa8f6","cShY2LewvM","zbIYYuAWyp","Gv3Fq29QAz","uoStwEOE1o","WmadAkZANm","7fKYUrKDLJ",
+"zz4ZUguMb8","d85a9GrDg7","NAFuwPYBf4","aDGtS8xEKz","dhSuHQ6Lix","FVMxouZPqg","VNCPdtjQxs","Yw2oUFLsph","cmXIXCp3mZ","GrDg7n8pJ9",
+"azIWpSmGzv","FxX9qiqv4k","Kr8ysVNCPd","64s8Na00b5","OUYuFuN6r3","TXQ0ZDLhzM","oVQp6hi5X7","KZamHlH1kt","580YDFcWrW","LbRTH1j5L8",
+"K20wKtl72W","64s8NW3VFH","AIYUubgJAz","s4786ECMvU","G1RhSmz8gx","xXTI4lweGy","zHF1qsuY4x","1LB1LBFkb8","mX2GEDG4sT","ThjNnaL6AJ",
+"SmGzvMm8si","AmdQdCxVEf","DQimpF6PT2","2Yz7EOxWIH","45cIHhe9IA","tjQxshYBCK","lm0pDoVQp6","48cHLDcpWB","AkKTkQClRL","y94nw4dEz6",
+"8RCUASjskQ","gtCA5SbRYy","uupzkFNYIM","5Nammk85Ae","t59lR7ku1p","JKWYRD6rBy","1LB1LMK07Y","MGlTFAkKTk","uN6r3RmDcr","OUYuFzmLYD",
+"Vprf2AOgEe","QWxoT48cHL","VBjhzni2v1","Mkgy80Wr5y","vLsmSIjTwP","0h1b1zQt6Q","2NslmX6Pin","ix74rDz1R3","NOHszru4UG","OUqFMkB5nP",
+"S2DfuECMvU","K4GS8rKDLJ","jeskShYBCK","JJs5mLDk6f","GSQwjUl4a1","yluBxRxrsm","vkCHHt59lR","uQIcz5iGN5","HfyNQ0BmCy","IBe8kDz1R3",
+"okgRiSs0Zu","S77LHEoToP","yToGWVLTy6","FhtglNOHsz","Kr8yslj07Q","xReecQnJ1S","W3VFH8TxD7","4QMc9BGaQY","YOfrYAOgEe","LbRTH5iGN5",
+"WMiS3v1Hln","KsjRK7fKYU","aDGtSFLsph","AkKTkprNT6","rKDLJRxrsm","HlUbFydG8U","ZJTXHgdQsS","CqqaDCIShG","gtCA5AkKTk","4dEz6GXdoH",
+"oGu6xpAhR1","ThjNnRxrsm","dmoS7618Di","0YAGHi7WMQ","QClRLsoy9t","v1Hlnhi5X7","580YDNo0Qb","lpF6WsuY4x","S77LHfqypy","lH1ktGSQwj",
+"DLhzMVLTy6","uN6r3yEfy9","Yf2EcGSQwj","bZLvShi5X7","5iGN5jzUqR","lpF6WkB5nP","D6rByokgRi","hSSvQD6rBy","yluBxX6Pin","CIShGoQ87r",
+"euZA5ksJby","8hJdtDQimp","5ZaEz5Drn0","RmDcrm4bxU","s7Mxk5ZaEz","Chuy3S77LH","v2eC3zbIYY","ZuDtD3weIF","fFDrJK20wK","9iGoTUmaEv",
+"07n1cmz8gx","piJSkNxx9V","QbxXcuPX7G","P6bcgKr8ys","FNYIMdpe1v","4W0TlK20wK","yvOMIFnPFB","gtCA5lCMxy","QbxXc5Namm","lXFOBgf8rI",
+"xXTI4uAWyp","FnPFBAXpwE","n1pmOxXTI4","cL0aEzY1GY","MGlTFTXQ0Z","G1RhSydG8U","tlILtGSQwj","fLNg8lH1kt","mX2GEuJScX","kZANmdQ586",
+"vOqCEulk41","cShY2gIYvE","lj07QVerEA","XyPZNTa8f6","Ta8f6xciqp","prNT6tjQxs","IKxdLGv3Fq","FFDuit98iW","SmGzvY1mC0","RmDcrIBe8k",
+"FxX9qfFDrJ","m4bxUiqv4k","gf8rIKASQ8","aDGtSGSQwj","QWxoTtvdkD","Oz8yZ9iGoT","jtn0XJIqXi","5VZjSQYxC0","I7p2a2Nslm","MGlTFWaim6",
+"0BmCylCMxy","hYBCKuPX7G","fLNg8zY1GY","zz4ZUlweGy","prNT6HRxd8","14FLRMGlTF","POUYS48cHL","GWqqXBGaQY","sx5GlqUJMd","XyPZNv2eC3",
+"BGaQYQYxC0","C2Ircdjsrv","v8yFNVLTy6","RmDcrx3LDe","piJSkPYBf4","gIYvEfcJOy","6q6L9gf8rI","he9IAaFFss","Yw2oUiwzGk","n8pJ9Vprf2",
+"lH1kt0BmCy","wiHrZYjB9t","k85AepiJSk","GSQwjWMiS3","QWxoT9eoRc","gIYvEqaofN","VNCPdOUqFM","yvOMIL7cGc","C2IrcnlaBy","48cHL8U2nU",
+"kB5nPogLgc","2hEEUpAhR1","MK07Y8FmFH","nlaByuLtKs","MGlTFciuWz","8cVD3jiVBP","oGu6xCNHmv","hi5X7s93Ml","MaJQsDcpWB","nnP8ol83Ud",
+"P6bcg8RCUA","pT8wulXFOB","FLsph0YAGH","ReKEWcShY2","GWqqXBCxeC","JIqXizQt6Q","TCgPpbZLvS","CK5W7bgJAz","lsQGoXflUq","NcICAhi5X7",
+"YjB9tKsjRK","gtCA5zqH0W","OHaBzvLsmS","EdBKcoQ87r","dhSuHIn3NS","soy9tK20wK","aDGtSD6rBy","LewvMMaJQs","euZA5GXdoH","P6bcgEOE1o",
+"l83UdxXTI4","tuDySMmKGJ","Ta8f6pv0i7","NcICAWPmlx","9GXkXMGlTF","jtn0XQworu","Dz1R3AmdQd","uLtKsI7p2a","aL6AJBpYhV","Ul4a1Qworu",
+"29QAzRpBQm","FGzgp618Di","5Mg9rHzZT8","S77LHdmoS7","hSSvQuLtKs","9iGoTIjTwP","cmXIXP6bcg","QnJ1S8hJdt","EdBKc3otm6","lViBvhE1Ql",
+"pT8wuD6rBy","dhSuHAgJHQ","oQ87rx3LDe","C2Ircrhl0J","CxVEfMGlTF","Pb1pazY1GY","zqH0WciuWz","gtCA5618Di","d7vjMjeskS","0h1b1NcICA",
+"e6e4zBFkb8","zQt6QcShY2","b29RJgf8rI","CxVEfNAFuw","Y1mC0mX2GE","XyPZNGWqqX","TCgPpuupzk","NAFuw48cHL","zFgtBdhSuH","ECMvUHRxd8",
+"7Ow5CKZamH","JXljWYOfrY","bZLvSOUYuF","fFDrJ0Wr5y","iB08lF6PT2","VNCPdKsjRK","uN6r3qaofN","ciuWzyToGW","suY4xlj07Q","1v5hHprNT6",
+"piJSkCp3mZ","iB08ljzUqR","tuDyS4dEz6","kZANm8cVD3","jSjS3FnPFB","uAWypJXljW","l83Udy94nw","BGaQYMkgy8","lweGy5ZaEz","lpF6W5nmWv",
+"14FLRsuY4x","BpYhVfLNg8","dhSuHHzZT8","B3qem0Kyfs","POUYSjS1aj","vOqCEs4786","MaJQs8hJdt","2Yz7EuZPqg","IRh48lH1kt","EoToP0YAGH",
+"m4bxUtvdkD","DG4sT5IhmG","piJSk2Yz7E","wiHrZThjNn","XyPZNVLTy6","lsQGogf8rI","YOfrYM3zXL","QChxsRkQke","RBhp03weIF","jSjS3uvf7A",
+"b29RJIBe8k","ZJTXHNcICA","U3yw5hYBCK","jtn0XUmaEv","HfyNQNOHsz","C2IrcdmoS7","FcWrWTwano","OxWIHfcJOy","piJSkmX2GE","24ARFKASQ8",
+"AkKTkuoStw","29QAzGWqqX","azIWpFVMxo","jfREuMmsIo","CNHmvTXQ0Z","KZamH1j5L8","soy9tkZANm","tjQxsfLNg8","HzZT8Yw2oU","jtn0XDG4sT",
+"FNYIMQClRL","KASQ88FmFH","wDajXMGlTF","W3VFHoQ87r","8TxD7YjB9t","a00b5uPX7G","GrDg7Ta8f6","zQt6QQYxC0","gjUTuru4UG","iqv4k7fKYU",
+"b29RJS2Dfu","RsQUqRsQUq","Z4I1veuZA5","FGzgppvgjS","oQ87rUmaEv","lkMUAoGu6x","9iGoT9y4lw","ReKEWru4UG","oQ87r6q6L9","aDGtSfqypy",
+"Chuy3n1pmO","S2Dfu64s8N","qUJMdHzZT8","yEfy9JkzUn","QClRLFwEJz","BbwgAIKxdL","AkKTkECMvU","BbwgA7hyVv","MezSWLewvM","zY1GYJJs5m",
+"MGlTFJJs5m","GXdoHguMb8","7ku1pNcICA","5Drn05ZaEz","RBhp0uvf7A","YOfrYuupzk","CxVEfjS1aj","NOHszlj07Q","SjskQRACuj","RBhp0FxX9q",
+"lCMxyokgRi","5Mg9ruN6r3","IKxdLJIqXi","BpYhVGv3Fq","hUTw7zFgtB","FPfSEy94nw","48cHLtjQxs","tuDySAIYUu","FLsphCIShG","K20wKdjsrv",
+"IRh48OUYuF","uupzkpiJSk","8FmFHBpYhV","ZuDtDdhSuH","ZuDtDzQt6Q","rhl0Jh1zcH","ECMvUcQOnv","piJSk2hEEU","P6bcgAgJHQ","yEfy9P6bcg",
+"Uvlv42Yz7E","1LB1L4W0Tl","rz7UttuDyS","gdQsSl83Ud","Cfgr3QClRL","TwanozY1GY","J2mQioQ87r","piJSkAIYUu","jtn0XDQimp","FFDuiFhtgl",
+"SjskQ2DREs","uQIczFjHXR","CqqaDfaHir","SWfouZv7z0","UmaEvyvOMI","AgJHQ9XyT9","ReKEWF6PT2","55rfBcQOnv","i3pydi3pyd","8RCUASmGzv",
+"7ku1pWaim6","2Yz7EYw2oU","JJs5mFcWrW","CdyBVjS1aj","pmeCd0ao3l","DcpWBogLgc","W7cTs45cIH","WDVWJFwEJz","VBjhzAXpwE","gdQsSm4bxU",
+"QbxXc7X3uy","618DiTCgPp","oQ87rMkgy8","VIlwP64s8N","YOfrYAIYUu","FNYIMO3iyQ","3otm6dQ586","5ZaEz9XyT9","1LB1LDLhzM","QbxXcBFkb8",
+"s7MxkDLhzM","uLtKsDz1R3","soy9tW3VFH","b29RJ4W0Tl","C2IrcUlU3M","kB5nPlj07Q","KsjRKyEfy9","jeskSl83Ud","bgJAzOxWIH","5Drn0Chuy3",
+"S77LHl83Ud","IKxdL3weIF","FcWrWsoy9t","tjQxsVLTy6","VjCZqAkKTk","e6e4z48cHL","JIqXiVprf2","Ta8f6uJScX","JKWYRAgJHQ","0ao3lyToGW",
+"Q6LixlViBv","FhtglyvOMI","s7MxkoVQp6","faHir3otm6","tvdkDvOqCE","M3zXLJJs5m","OUYuFRACuj","AgJHQ4W0Tl","HP433gf8rI","5Drn0euZA5",
+"Yw2oUGWqqX","nlaBy14FLR","MojnP48cHL","UlU3MYw2oU","fqypy0h1b1","euZA5brhlQ","lXFOBtuDyS","8TxD7tAOsr","NhXduGrDg7","sqVrfpWiOs",
+"fcwDapWiOs","MmKGJDG4sT","MK07YXyPZN","6q6L90Kyfs","JkzUnOHaBz","uN6r3WDVWJ","WPmlxgIYvE","FjHXRk85Ae","FjHXRgIYvE","i3pydRxrsm",
+"sx5GlK4GS8","atef2RkQke","ZJTXHO3iyQ","K20wKlH1kt","POUYSzbIYY","RmDcrGSQwj","oGu6xTCgPp","taOXKCIShG","dmoS7BCxeC","NAFuwhYBCK",
+"soy9tRsQUq","5iGN5oVQp6","HfyNQAmdQd","uTacx4W0Tl","0YAGHoQ87r","dmoS7QnJ1S","55rfBRsQUq","JIqXi1LB1L","EOE1oIBe8k","jiVBPqQxHP",
+"Yh1hF29QAz","0PktIwiHrZ","MGlTFDz1R3","pWiOsd7vjM","suY4xSs0Zu","QChxsQ6Lix","nFqikQnJ1S","XflUqHfyNQ","AXpwEJIqXi","xciqpdpe1v",
+"b29RJiKqhr","n8pJ9IjTwP","2Yz7EjeskS","ulk41y94nw","LbRTHyluBx","mX2GE24ARF","CdyBV8FmFH","i3pyddQ586","WPmlxK4GS8","a00b5QChxs",
+"k85AedmoS7","16lHc14FLR","kZANmhE1Ql","RkQkey94nw","64s8NyofH3","FwEJzPb1pa","Mkgy8taOXK","cShY2ulk41","lH1kte6e4z","uLtKsfmIK1",
+"lXFOBZzJHW","hSSvQ9GXkX","L7cGccL0aE","pWiOsFGzgp","RzaZAgtCA5","CqqaDn1pmO","oQ87riqv4k","MaJQs580YD","suY4xNAFuw","zz4ZUTXQ0Z",
+"HP433FFDui","Qworuhi5X7","fcwDaFFDui","JXljW8hJdt","dpe1vy94nw","WDVWJChuy3","UlU3MjiVBP","0YAGHVNCPd","s93MlKZamH","BbwgA7fsYM",
+"D6rByLewvM","euZA5dmoS7","WPmlx7fsYM","n8pJ9lCMxy","yToGWMmKGJ","FFDui4dEz6","uZPqgYjB9t","lm0pDciuWz","gIYvEHfyNQ","b29RJcShY2",
+"lCMxyuLtKs","fLNg8zFgtB","uAWypVNCPd","jtn0XK20wK","16lHcFnPFB","fFDrJDQimp","OUqFMn8pJ9","Oz8yZYf2Ec","okgRiFPfSE","hUTw7Qworu",
+"StlDJW3VFH","b29RJJJs5m","jSjS3SWfou","MaJQsYh1hF","tuDySlXFOB","gf8rIqaofN","JIqXiCfgr3","ciuWztaOXK","Dz1R38RCUA","FPfSEGWqqX",
+"JXljWYw2oU","WreyPGv3Fq","HP433s93Ml","5NammMGlTF","ZJTXHAmdQd","qQxHPTa8f6","cQOnvXflUq","0MR5XokgRi","Mm8siRsQUq","5drc67hyVv",
+"B3qemOHaBz","WaWsvdjsrv","AmdQdMezSW","aez9y8RCUA","Y1mC0EOE1o","ZuDtDzmLYD","HP433bgJAz","ECMvUAkKTk","1LB1L0Wr5y","F6PT255rfB",
+"uN6r3pWiOs","VLTy6580YD","2hEEUBCxeC","WaWsvHlUbF","BCxeCB3qem","BpYhVFhtgl","prNT6guMb8","1v5hHs93Ml","5Mg9rUlU3M","SbRYyn1pmO",
+"W3VFHpvgjS","jiVBPD6rBy","Uvlv4dQ586","Gv3FqnFqik","U3yw5M3zXL","jzUqRFjHXR","v8yFNBCxeC","aez9yMmsIo","JKWYRblLA9","oGu6xPOUYS",
+"cQOnvs93Ml","W7cTsmz8gx","64s8NTwano","9y4lwQ6Lix","iwzGkNo0Qb","hE1Ql16lHc","iKqhrlsQGo","HP433zY1GY","xXTI4gdQsS","jfREuCdyBV",
+"taOXKW3VFH","zz4ZU9rlg9","Ss0ZuIBe8k","8FmFHD6rBy","uJScXwiHrZ","vkCHHblLA9","uJScXpiJSk","FNYIMM6qcG","hE1Ql580YD","WDVWJnnP8o",
+"7fsYMKsjRK","WPmlxuAWyp","yvOMIGXdoH","MGlTFUmaEv","dpe1v4QMc9","ni2v1VerEA","fcJOyQWxoT","dhSuHdmoS7","AIYUuRpBQm","DG4sTDcpWB",
+"VIlwP9eoRc","aDGtSm4bxU","MaJQsC2Irc","d85a9Q6Lix","nnP8oCNHmv","Nxx9V7Ow5C","b29RJ07n1c","uZPqgZv7z0","zqH0WksJby","618Di16lHc",
+"aL6AJVerEA","fmIK1uZPqg","55rfBdmoS7","uTacxydG8U","5ZaEzn8pJ9","0YAGHaFFss","3weIFReKEW","FFDuiChuy3","DQimplH1kt","VIlwPqaofN",
+"dhSuH55rfB","hi5X7hUTw7","vOqCEQ6Lix","yToGW2Yz7E","s93MloGu6x","Pb1palm0pD","pmeCd7ku1p","jeskSzqH0W","lViBvhYBCK","VerEAa00b5",
+"8TxD7lsQGo","QWxoTNcICA","J2mQiMezSW","TXQ0ZaFFss","hYBCKKASQ8","ZJTXHoVQp6","euZA5RsQUq","5ZaEzVerEA","ReKEWHP433","45cIHB3qem",
+"dhSuHdjsrv","Uvlv4SmGzv","jfREu45cIH","m4bxUuN6r3","FNYIMNxx9V","aez9ylXFOB","14FLRksJby","POUYSGXdoH","VjCZqDcpWB","GXdoHBFkb8",
+"pFrrlFjHXR","okgRiJKWYR","piJSk9y4lw","FjHXRS77LH","MmsIociuWz","NhXdusqVrf","RzaZAWPmlx","YOfrYdhSuH","prNT6KZamH","KASQ8iqv4k",
+"faHiruQIcz","oGu6xtjQxs","nlaByiKqhr","TXQ0ZlweGy","lXFOB14FLR","b29RJ2hEEU","JKWYRPb1pa","HP433QWxoT","cQOnvpmeCd","ksJbyGv3Fq",
+"pFrrlfcwDa","fcJOyOUYuF","d85a9tjQxs","7hyVvUvlv4","fqypyhE1Ql","VBjhzazIWp","v1HlncShY2","FhtgltlILt","LewvMzmLYD","uupzkGWqqX",
+"5iGN5l83Ud","VIlwPjeskS","Qworuhe9IA","NOHsznnP8o","n1pmOOz8yZ","zz4ZU8RCUA","s4786uJScX","rhl0J45cIH","DcpWBjfREu","XyPZNFwEJz",
+"t98iWChuy3","aDGtSTXQ0Z","AXpwEBCxeC","StlDJgdQsS","IjTwP0BmCy","tuDyStaOXK","vLsmS9y4lw","RACujgjUTu","9eoRc8RCUA","s478607n1c",
+"RzaZAtl72W","WreyPEoToP","qUJMdzmLYD","n8pJ97fsYM","MezSWCNHmv","5IhmGHlUbF","07n1c1LB1L","d7vjM9eoRc","MmKGJJ2mQi","RACujWmadA",
+"F6PT2uAWyp","jeskSqUJMd","BFkb8qUJMd","5Drn0ECMvU","uLtKs3otm6","QWxoT5IhmG","RsQUq16lHc","OHaBzMezSW","i7WMQVLTy6","cQOnvCxVEf",
+"M6qcGDG4sT","nlaByQworu","OxWIHVBjhz","Uvlv4rz7Ut","LewvMQClRL","JIqXiLewvM","Vprf2Yw2oU","45cIHrz7Ut","GSQwjS77LH","Mm8situDyS",
+"iKqhrChuy3","MezSW5Mg9r","oVQp6ECMvU","VIlwPZzJHW","No0QbfaHir","bgJAzL7cGc","RsQUqAOgEe","lm0pDyToGW","BpYhVTa8f6","azIWpoGu6x",
+"7X3uyiwzGk","2ZHdklj07Q","uZPqgXflUq","1j5L845cIH","EdBKcZJTXH","lpF6WDcpWB","8hJdtFPfSE","GSQwj8cVD3","IKxdL8RCUA","v8yFNEoToP",
+"Uvlv4RzaZA","7fsYMLewvM","KZamHsqVrf","HfyNQfcwDa","CxVEfEdBKc","C2IrcECMvU","cQOnv0BmCy","ciuWzQssNC","9y4lwsuY4x","d7vjMBpYhV",
+"bgJAzn1pmO","ZzJHWvOqCE","B3qemNhXdu","DcpWBNo0Qb","uAWypru4UG","RxrsmJRJQB","aez9yO3iyQ","RpBQmbgJAz","1v5hHsoy9t","faHirAmdQd",
+"3weIFQ6hMC","HlUbF5iGN5","AgJHQ8U2nU","hYBCKd85a9","RkQkejiVBP","QWxoTsuY4x","4W0Tluupzk","Mkgy8Cfgr3","tl72WtlILt","2TRI7s4786",
+"FVMxoSs0Zu","lweGyUlU3M","Chuy3EOE1o","mX2GEru4UG","CIShGHfyNQ","TXQ0Zrhl0J","580YDBbwgA","D6rByjzUqR","aL6AJSjskQ","4QMc9O3iyQ",
+"45cIH48cHL","24ARFpAhR1","MojnPQ6hMC","UlU3MyEfy9","rhl0JzHF1q","X6PintAOsr","QssNCnlaBy","uoStwG1RhS","xciqpCdyBV","Chuy3yToGW",
+"J2mQixciqp","n1pmOiKqhr","B3qemB3qem","YjB9tI7p2a","S77LHLbRTH","qQxHPiqv4k","iwzGkAOgEe","iB08lLewvM","djsrvxXTI4","uvf7A7X3uy",
+"kZANm5Drn0","iKqhrUlU3M","2hEEU9XyT9","JRJQBlsQGo","UlU3MK20wK","CxVEfJXljW","n1pmOvkCHH","8FmFHKr8ys","rhl0JKsjRK","zHF1q2ZHdk",
+"lweGyJkzUn","0KyfsuZPqg","faHirkB5nP","HRxd8618Di","AXpwEx3LDe","DQimps4786","kZANmG1RhS","vkCHHuupzk","dhSuHzmLYD","TwanoZJTXH",
+"2DREs7fsYM","JJs5mfmIK1","14FLRn8pJ9","M6qcG5drc6","UmaEv5Drn0","vkCHHXyPZN","8xEKzhE1Ql","SjskQ5Namm","a00b5EdBKc","ciuWzJRJQB",
+"dhSuHtvdkD","ni2v1gjUTu","7Ow5CFLsph","fqypyciuWz","ThjNn5nmWv","S77LHGrDg7","kB5nPmX2GE","KASQ8Cfgr3","m4bxUv8yFN","VIlwPgf8rI",
+"oQ87rVerEA","zY1GYokgRi","M6qcGI7p2a","uJScXsqVrf","oVQp6GXdoH","cmXIXx3LDe","uTacxdpe1v","C2IrcAOgEe","In3NSuQIcz","5ZaEzChuy3",
+"TXQ0ZhE1Ql","RsQUqPOUYS","Chuy3IKxdL","MaJQsTCgPp","Q6LixIKxdL","Cfgr3faHir","prNT616lHc","Q6Lix5nmWv","8cVD3No0Qb","9XyT9DG4sT",
+"5VZjSfaHir","Z4I1vQbxXc","tuDyShE1Ql","azIWpiKqhr","atef2VNCPd","Kr8yseuZA5","DcpWBxciqp","8RCUAyToGW","CxVEfaFFss","Ss0ZuuN6r3",
+"uJScXn1pmO","VjCZqnFqik","h1zcHnFqik","HlUbFEdBKc","CxVEfZuDtD","8FmFHd7vjM","YjB9ts93Ml","v8yFN5drc6","D6rByvLsmS","pFrrlIKxdL",
+"D6rByHlUbF","uZPqgtAOsr","zmLYDuLtKs","kB5nPQssNC","ydG8UksJby","hE1QlfaHir","BpYhVyToGW","0ao3ljSjS3","OHaBzFnPFB","JIqXizY1GY",
+"Kr8yskZANm","4QMc92Nslm","0h1b1FnPFB","ZUnqtJJs5m","zmLYDiqv4k","I7p2asqVrf","7hyVvStlDJ","fFDrJfLNg8","Yh1hFuJScX","1j5L89y4lw",
+"EdBKcQClRL","RpBQmWaim6","xXTI4yEfy9","HlUbF8U2nU","XyPZNYjB9t","vLsmSG1RhS","MGlTFBpYhV","uAWypSs0Zu","RmDcrRmDcr","lweGy2TRI7",
+"BCxeCqUJMd","dhSuH3otm6","1v5hHrz7Ut","8FmFH9GXkX","lj07QSs0Zu","Zv7z029QAz","KASQ8pFrrl","2DREsvOqCE","LewvMCfgr3","FnPFBgtCA5",
+"blLA9lpF6W","tlILtStlDJ","qQxHPNxx9V","MojnPW3VFH","QChxsqaofN","Mm8siMm8si","9eoRcMkgy8","jtn0Xuupzk","rKDLJMK07Y","rKDLJJ2mQi",
+"5VZjSCfgr3","jzUqRRkQke","4dEz6gjUTu","FVMxolkMUA","v2eC3tlILt","0PktI5ZaEz","lH1ktcQOnv","Yf2EcFGzgp","8FmFHuLtKs","taOXKBGaQY",
+"BpYhVFxX9q","PYBf4a00b5","hSSvQ14FLR","Vprf2pv0i7","618DigIYvE","blLA9FLsph","0ao3lxReec","AmdQdU3yw5","K20wKzmLYD","KsjRKMkgy8",
+"ThjNnJJs5m","J2mQivLsmS","AOgEeRpBQm","blLA92Nslm","SbRYyThjNn","gjUTuC2Irc","P6bcgm4bxU","piJSk5drc6","okgRi0MR5X","2NslmYf2Ec",
+"lm0pDlpF6W","n8pJ90BmCy","jSjS3WreyP","aez9ybrhlQ","HRxd8uvf7A","ydG8UJRJQB","gdQsSCfgr3","pWiOshE1Ql","iwzGkKr8ys","DQimpWreyP",
+"oVQp6hUTw7","M6qcGQworu","FPfSEBpYhV","J2mQi9XyT9","lXFOBGv3Fq","MaJQsPb1pa","FxX9qGrDg7","gtCA55IhmG","Kr8ysy94nw","pT8wu6AFT0",
+"tAOsrRBhp0","yofH3uAWyp","C2IrccmXIX","JkzUnZuDtD","8FmFHVIlwP","jS1ajv1Hln","6q6L9ReKEW","YOfrYWaim6","pFrrljzUqR","uPX7G1j5L8",
+"0YAGHa00b5","580YDfFDrJ","hYBCK0Wr5y","Mm8siKsjRK","FcWrWUmaEv","zY1GYpvgjS","iB08l8TxD7","24ARFGrDg7","5NammI7p2a","GWqqXjiVBP",
+"XflUqJRJQB","CqqaDsoy9t","DG4sTGrDg7","zFgtBSjskQ","24ARFjfREu","FGzgpKr8ys","gf8rIvkCHH","OUYuFSjskQ","618DiQ6hMC","7Ow5CUl4a1",
+"zY1GYECMvU","qaofNlj07Q","oGu6xhe9IA","XyPZN5iGN5","M3zXLMkgy8","CdyBV9iGoT","vOqCE8TxD7","YjB9tfmIK1","Oz8yZBGaQY","F6PT2KsjRK",
+"StlDJZzJHW","5VZjSTCgPp","zFgtBbgJAz","EoToPTa8f6","guMb8cmXIX","QbxXcVNCPd","aFFssn1pmO","ZhwG1tvdkD","3weIFgf8rI","brhlQbZLvS",
+"fmIK1MK07Y","XflUqRzaZA","iKqhrkB5nP","lXFOB7hyVv","nlaBy1v5hH","tAOsrGrDg7","FVMxoRACuj","5drc6FFDui","L7cGcDQimp","pvgjS4dEz6",
+"JKWYRm4bxU","Cp3mZt98iW","dmoS7RpBQm","4dEz6lj07Q","cQOnvyEfy9","CxVEfaez9y","VIlwPulk41","5ZaEzNxx9V","SbRYyCfgr3","0BmCyv2eC3",
+"ni2v1d7vjM","CNHmvydG8U","BFkb8rKDLJ","3otm6NhXdu","JRJQBh1zcH","DG4sTAgJHQ","zz4ZUAmdQd","9rlg95ZaEz","zFgtBgdQsS","RzaZA24ARF",
+"55rfBFLsph","AkKTkJJs5m","RpBQmCIShG","5ZaEz2hEEU","o8UydpT8wu","uTacx1LB1L","JXljW0Kyfs","gf8rIYw2oU","s7Mxk5nmWv","PYBf4jSjS3",
+"K4GS87ku1p","OxWIH07n1c","WmadAW7cTs","ogLgcokgRi","5IhmGoGu6x","blLA9Cfgr3","prNT6DG4sT","jSjS3ZUnqt","ru4UG2DREs","bZLvSksJby",
+"RpBQm6q6L9","C2IrczmLYD","QnJ1S7fKYU","CIShG0Wr5y","F6PT2LbRTH","ZJTXHfcJOy","aDGtSprNT6","9y4lwjtn0X","uoStwnFqik","ix74rB3qem",
+"Cfgr30BmCy","P6bcgqUJMd","t98iWblLA9","S77LHulk41","ogLgc4QMc9","AIYUu29QAz","Vprf2ulk41","lweGyogLgc","okgRiMezSW","aDGtSDQimp",
+"64s8NbZLvS","dhSuHfLNg8","ix74riB08l","4dEz6P6bcg","cL0aEMm8si","dhSuHiwzGk","QWxoTv8yFN","hi5X7ZUnqt","55rfBW3VFH","d7vjM8U2nU",
+"LDk6ffqypy","AmdQdhe9IA","ru4UGv1Hln","9eoRcMmsIo","No0QbNxx9V","O3iyQzQt6Q","pmeCd9eoRc","qaofN07n1c","AIYUuFNYIM","8cVD3fqypy",
+"VIlwPdhSuH","FhtglMmKGJ","I7p2aUvlv4","QChxsK4GS8","SWfou1j5L8","kB5nP0PktI","WPmlxuTacx","cQOnvMmKGJ","fLNg8MezSW","0BmCyVIlwP",
+"kZANmiKqhr","o8Uyd5drc6","U3yw50YAGH","9rlg92Nslm","W7cTsiB08l","uN6r307n1c","uupzkNxx9V","07n1caL6AJ","IjTwPK20wK","VIlwP7ku1p",
+"mz8gxCp3mZ","Gv3FqTa8f6","iKqhrKASQ8","Vprf2s93Ml","4QMc9uPX7G","FjHXRhUTw7","xciqpSWfou","BbwgAQbxXc","v2eC3QYxC0","QClRLJIqXi",
+"d85a9uPX7G","SmGzvMojnP","VBjhzi7WMQ","Dz1R324ARF","d7vjMSbRYy","0BmCybrhlQ","5Drn02Yz7E","3otm6lViBv","PYBf4Mm8si","FcWrWBGaQY",
+"WmadAxReec","Yw2oU5iGN5","Yh1hFAgJHQ","hE1Ql0BmCy","5Mg9rzmLYD","OUqFMAgJHQ","AIYUuv2eC3","FnPFBuN6r3","RmDcrHlUbF","OHaBz48cHL",
+"m4bxUS2Dfu","hUTw7F6PT2","XflUqKr8ys","PYBf4MojnP","Ta8f60PktI","RzaZAuvf7A","tvdkD9XyT9","JJs5mSbRYy","uoStwgIYvE","P6bcgSs0Zu",
+"yvOMIpFrrl","JIqXiThjNn","5iGN5tAOsr","8TxD7brhlQ","vOqCEzFgtB","zY1GYd7vjM","vLsmSjS1aj","ReKEWGrDg7","I7p2aY1mC0","B3qemWaim6",
+"618DiuN6r3","VIlwPyEfy9","8xEKzzz4ZU","XyPZNEOE1o","QnJ1SYOfrY","JKWYRuAWyp","dhSuHU3yw5","24ARF3otm6","7fKYUlCMxy","Q6LixY1mC0",
+"UmaEvKZamH","fqypyuPX7G","QbxXcGrDg7","3weIFzFgtB","hYBCKYf2Ec","k85AepFrrl","OxWIH64s8N","tAOsrOxWIH","6AFT0FLsph","QbxXcb29RJ",
+"5iGN5Ta8f6","d7vjMhE1Ql","lkMUATwano","4QMc97ku1p","l83Ud5iGN5","IRh48CdyBV","lH1kt0PktI","Gv3FqKsjRK","jiVBPRkQke","BCxeCLewvM",
+"pFrrlW3VFH","Waim6CNHmv","aFFss1LB1L","xXTI4he9IA","S77LHh1zcH","VjCZquJScX","Z4I1vs7Mxk","UmaEvF6PT2","JXljWGWqqX","KsjRKCIShG",
+"m4bxUcmXIX","pWiOsm4bxU","cmXIXF6PT2","Dz1R3fmIK1","Z4I1vF6PT2","b29RJdjsrv","FcWrWXyPZN","3otm6QWxoT","e6e4zzbIYY","HfyNQFhtgl",
+"RzaZAa00b5","8cVD3M6qcG","zbIYYYh1hF","Gv3FqlpF6W","FnPFB5iGN5","dpe1vS77LH","4QMc9RmDcr","VerEAW3VFH","Uvlv4t98iW","wiHrZTXQ0Z",
+"JkzUnAXpwE","piJSkuLtKs","vOqCEhYBCK","4QMc9gjUTu","WreyPDG4sT","n8pJ9FjHXR","m4bxUqQxHP","i3pyd2ZHdk","jS1ajK4GS8","8FmFHhE1Ql",
+"FNYIMuPX7G","brhlQlH1kt","fFDrJbZLvS","0YAGH7lUXZ","vOqCEpmeCd","FGzgpfFDrJ","gjUTuChuy3","pWiOsVIlwP","Ss0ZuB3qem","JkzUn8U2nU",
+"mz8gx7X3uy","dmoS7ydG8U","LewvMBpYhV","hi5X7GSQwj","CdyBVwDajX","ZhwG1Twano","FnPFBhe9IA","5Nammgf8rI","IRh48yluBx","cQOnv8hJdt",
+"8U2nU5IhmG","h1zcHdpe1v","FPfSEzbIYY","7hyVvRBhp0","h1zcH9iGoT","1LB1LdmoS7","lkMUABCxeC","CqqaDgdQsS","mX2GEFxX9q","Gv3Fqn8pJ9",
+"ciuWzJ2mQi","SjskQVprf2","5IhmGpiJSk","9XyT9NOHsz","Y1mC0zFgtB","m4bxUxXTI4","HzZT8IRh48","F6PT2StlDJ","GrDg78hJdt","CIShGs4786",
+"Cp3mZJRJQB","d7vjMQ6hMC","gf8rIS77LH","7lUXZChuy3","i7WMQ5VZjS","zz4ZUciuWz","4dEz6AIYUu","618DiqaofN","8hJdtsuY4x","FcWrW0Kyfs",
+"RpBQmAOgEe","FFDuiNo0Qb","v1HlnYw2oU","tlILt8xEKz","580YDZzJHW","QworuCp3mZ","Z4I1vIRh48","MGlTFCNHmv","ThjNnjtn0X","ZUnqtv2eC3",
+"iKqhr5ZaEz","7hyVvChuy3","Vprf2uoStw","64s8NwiHrZ","d85a9lm0pD","5NammaFFss","0Wr5yCp3mZ","VNCPdQYxC0","29QAzcL0aE","s7MxkBGaQY",
+"lH1ktZv7z0","he9IAs7Mxk","sx5GlFLsph","14FLRFVMxo","2Yz7ECNHmv","cmXIXtlILt","ZJTXHZUnqt","zY1GYpT8wu","0BmCyfLNg8","580YDqUJMd",
+"uZPqgyvOMI","RsQUqdpe1v","VIlwPIRh48","MK07Y5Drn0","zHF1qCp3mZ","16lHcSmGzv","lm0pDBbwgA","JIqXi8xEKz","a00b5ZzJHW","FnPFBlXFOB",
+"5NammfcJOy","YOfrYJJs5m","0KyfsHlUbF","i7WMQ45cIH","J2mQid85a9","uupzk5nmWv","FVMxoSWfou","4QMc9FjHXR","TwanoTCgPp","euZA5zbIYY",
+"h1zcH2ZHdk","D6rBy9eoRc","Gv3Fquvf7A","nFqikO3iyQ","DLhzMsuY4x","I7p2asoy9t","QworuWDVWJ","Ta8f6QWxoT","t98iWtuDyS","MmKGJbZLvS",
+"dhSuHwDajX","rz7Utd7vjM","uvf7A9eoRc","I7p2av2eC3","Q6hMCFFDui","UlU3M8hJdt","SbRYyogLgc","iB08l0MR5X","tjQxsGWqqX","QYxC0dmoS7",
+"L7cGcYw2oU","7X3uylH1kt","vOqCERmDcr","aFFssVBjhz","OUYuFWreyP","BGaQYjfREu","t59lRZhwG1","RmDcrHP433","IKxdLcmXIX","hE1QlmX2GE",
+"JIqXi5VZjS","Zv7z05iGN5","oQ87rhUTw7","aDGtSlpF6W","t59lRWreyP","pmeCdI7p2a","C2IrcAkKTk","sqVrfIKxdL","55rfBlkMUA","hi5X7oVQp6",
+"hE1QlyofH3","WreyPmX2GE","AmdQdDG4sT","fcwDaEoToP","ZJTXHatef2","WMiS3iKqhr","AkKTkQssNC","nnP8ocQOnv","IKxdLPOUYS","SmGzvpvgjS",
+"FVMxoXflUq","AIYUuPYBf4","cmXIXO3iyQ","cmXIXjSjS3","07n1cCxVEf","hE1QlJXljW","iwzGkKZamH","MaJQsXflUq","8RCUAnFqik","y94nwKASQ8",
+"jfREuQbxXc","8hJdtCfgr3","1j5L8OHaBz","lkMUAXyPZN","cQOnvVLTy6","e6e4zaDGtS","uAWypFGzgp","QworupiJSk","blLA9jS1aj","fFDrJuPX7G",
+"KASQ8WreyP","fcJOyQClRL","9iGoT7Ow5C","TXQ0Z0h1b1","yEfy9yvOMI","FjHXRGv3Fq","jfREuzFgtB","lm0pDEOE1o","RsQUqjiVBP","l83Udh1zcH",
+"4QMc929QAz","Cfgr3zFgtB","BpYhVrz7Ut","zY1GYXflUq","VNCPdRzaZA","2ZHdkDQimp","Mm8siyvOMI","MGlTFHRxd8","KASQ8fFDrJ","JKWYRHP433",
+"FnPFBHzZT8","0ao3lpmeCd","vkCHHFPfSE","CK5W7Gv3Fq","0Wr5yMaJQs","AIYUucQOnv","618DiuJScX","lH1ktIn3NS","8FmFH0Kyfs","soy9tpmeCd",
+"IKxdLYjB9t","GSQwjqQxHP","StlDJNcICA","X6PinFVMxo","QChxs4QMc9","JXljW8RCUA","9rlg9ix74r","zbIYYd7vjM","ogLgczY1GY","3weIFDcpWB",
+"XyPZN2hEEU","KsjRKuLtKs","aez9yciuWz","zz4ZU8xEKz","MmsIo9rlg9","uupzkRxrsm","Q6Lix618Di","b29RJYh1hF","Zv7z0AmdQd","bZLvS9GXkX",
+"uupzk4dEz6","SjskQrhl0J","QnJ1SUl4a1","yofH3O3iyQ","gjUTu55rfB","CqqaD4W0Tl","tuDySiKqhr","9rlg9NOHsz","ciuWzZzJHW","5Mg9rIjTwP",
+"5IhmGdmoS7","IBe8kmz8gx","0h1b1K4GS8","fqypyuZPqg","okgRik85Ae","YOfrYM6qcG","ciuWzQWxoT","48cHLZJTXH","1v5hHbrhlQ","uLtKsfaHir",
+"ogLgcfFDrJ","RmDcruPX7G","TXQ0ZoGu6x","tlILtGXdoH","VIlwPjfREu","sqVrfGWqqX","oQ87r9XyT9","BGaQYl83Ud","KASQ8JRJQB","SjskQx3LDe",
+"CqqaDh1zcH","NAFuwtuDyS","JJs5mJXljW","K4GS8lkMUA","5VZjS2Yz7E","9iGoTwDajX","atef2FNYIM","5Namm8xEKz","GWqqXlm0pD","IRh486q6L9",
+"zFgtB64s8N","JJs5mtlILt","QYxC0cShY2","fFDrJyofH3","lViBvXflUq","CNHmv1j5L8","UmaEvHfyNQ","I7p2a4QMc9","a00b5Q6hMC","VNCPduZPqg",
+"JKWYRb29RJ","v1HlnZzJHW","ECMvUhSSvQ","cShY2vLsmS","lCMxyi3pyd","MmKGJOUqFM","blLA92TRI7","7ku1pRsQUq","mz8gxfLNg8","IjTwPCdyBV",
+"CqqaD8hJdt","I7p2avOqCE","OUYuFa00b5","Yw2oU8cVD3","HRxd8FFDui","ECMvUThjNn","s93MlgjUTu","lH1ktprNT6","AIYUuVBjhz","ZJTXHUl4a1",
+"pmeCdJkzUn","9rlg9d7vjM","Nxx9Vzz4ZU","rz7Ut7Ow5C","Chuy37fKYU","7Ow5CaDGtS","uvf7AFNYIM","Gv3FqOxWIH","D6rByh1zcH","HlUbFXyPZN",
+"d7vjMD6rBy","TCgPplkMUA","M6qcG3weIF","POUYSydG8U","uPX7Giqv4k","uN6r3jzUqR","GSQwjhE1Ql","LewvMogLgc","ix74rpmeCd","fqypyl83Ud",
+"2hEEUk85Ae","OxWIHpAhR1","8xEKzRACuj","AkKTkyvOMI","Cfgr3ZuDtD","gf8rIZJTXH","Cfgr3fqypy","Oz8yZ2hEEU","uLtKsGXdoH","ZuDtD9XyT9",
+"ZUnqtcShY2","jiVBPPOUYS","IKxdLJ2mQi","5Mg9rv8yFN","7fKYUl83Ud","8FmFHYf2Ec","Kr8ysAgJHQ","5drc6pmeCd","uLtKsFVMxo","2ZHdkfcJOy",
+"brhlQAIYUu","a00b5ogLgc","LbRTHxXTI4","FVMxo8U2nU","KZamH8cVD3","AOgEe24ARF","fLNg82Nslm","IBe8kECMvU","oQ87rMojnP","lweGyYh1hF",
+"uLtKsWMiS3","cQOnvvOqCE","DcpWBeuZA5","VNCPdUl4a1","rhl0J24ARF","fcwDav1Hln","gf8rISmGzv","brhlQix74r","4W0TlTCgPp","mz8gxAmdQd",
+"K4GS8pmeCd","UlU3MoQ87r","i3pyd7ku1p","580YDlViBv","5VZjSKsjRK","cShY2jzUqR","cQOnvX6Pin","WreyPzFgtB","MaJQslm0pD","m4bxUqaofN",
+"o8UydSbRYy","sx5GlmX2GE","iqv4kCNHmv","nnP8oQChxs","bgJAzqUJMd","guMb8dQ586","rz7UtzY1GY","DQimpuPX7G","FPfSEIBe8k","YjB9tK20wK",
+"cL0aE5drc6","C2Ircdpe1v","AXpwE16lHc","5drc6ru4UG","aL6AJSbRYy","jzUqRAgJHQ","ThjNnM3zXL","a00b5Yf2Ec","ni2v1e6e4z","pvgjSRpBQm",
+"0PktIazIWp","faHirCdyBV","JkzUnFnPFB","VerEAn8pJ9","5nmWvFnPFB","piJSkC2Irc","QssNCFnPFB","uLtKsuoStw","HRxd84W0Tl","QClRLSbRYy",
+"8FmFHdmoS7","64s8N07n1c","Waim6ZhwG1","64s8NRsQUq","lj07QKsjRK","S2DfueuZA5","t59lRZv7z0","No0QbGSQwj","6q6L9NhXdu","5ZaEzI7p2a",
+"7fKYUFPfSE","M3zXLxReec","n8pJ9pAhR1","RzaZAQnJ1S","7hyVvRzaZA","9rlg9m4bxU","BCxeC4QMc9","4W0Tl8xEKz","uZPqgJJs5m","45cIHbrhlQ",
+"Ta8f6CNHmv","pAhR1taOXK","0BmCyMezSW","Vprf2RkQke","m4bxUs93Ml","jSjS38hJdt","StlDJJkzUn","qQxHPiwzGk","jtn0XNo0Qb","IjTwPCIShG",
+"pvgjSQWxoT","24ARFsoy9t","RBhp0jiVBP","hE1QlZJTXH","Gv3Fqsx5Gl","1j5L8VLTy6","CIShGfcwDa","gtCA5VNCPd","7Ow5CW7cTs","yluBxOxWIH",
+"FFDuiqUJMd","QYxC0jfREu","k85AeCNHmv","yluBxogLgc","55rfBlpF6W","Cfgr3tl72W","CqqaDXflUq","MojnPdpe1v","nlaByZv7z0","fFDrJ0YAGH",
+"tAOsrhi5X7","WreyPni2v1","fmIK129QAz","ix74r64s8N","HfyNQ0h1b1","5drc6FPfSE","pmeCd7Ow5C","ksJbywiHrZ","lCMxygjUTu","VNCPdReKEW",
+"9iGoT5Drn0","gf8rIgtCA5","LewvMYjB9t","gtCA5GXdoH","9iGoTdQ586","6AFT0KsjRK","euZA5kZANm","QnJ1S1LB1L","yvOMIxReec","JJs5muoStw",
+"618DiwDajX","Yf2EcEoToP","dmoS7iKqhr","14FLRNhXdu","wDajXfqypy","n1pmO3weIF","o8UydaFFss","Uvlv4ZJTXH","29QAzfcJOy","MK07YQYxC0",
+"O3iyQ4W0Tl","lCMxyMmsIo","OUYuFRzaZA","aL6AJblLA9","OUYuFVprf2","lsQGoW7cTs","8cVD3EdBKc","MojnPtAOsr","HlUbFni2v1","L7cGcsoy9t",
+"jSjS3taOXK","FLsphuvf7A","BFkb8JXljW","s7Mxk7lUXZ","rhl0J1j5L8","mz8gxtaOXK","VIlwPMGlTF","5VZjSSjskQ","MGlTFMkgy8","IKxdL0YAGH",
+"guMb8suY4x","qaofNydG8U","C2Irc580YD","07n1cnnP8o","VjCZqSjskQ","In3NSpFrrl","SbRYyMkgy8","o8Uyduupzk","yofH3EoToP","GSQwjjfREu",
+"NOHszUlU3M","I7p2acQOnv","nlaByRxrsm","I7p2afqypy","BCxeCmX2GE","Kr8ysPOUYS","8FmFHWMiS3","vkCHHuTacx","h1zcHJJs5m","DQimpFhtgl",
+"M6qcGpmeCd","piJSk8U2nU","9eoRcK20wK","KsjRKlm0pD","t98iW0BmCy","blLA9AkKTk","taOXKKASQ8","MaJQshi5X7","6AFT0BbwgA","Ta8f6yvOMI",
+"07n1chE1Ql","oVQp65iGN5","mz8gxRmDcr","CqqaD29QAz","FjHXRK20wK","I7p2aHRxd8","FPfSElViBv","LbRTHh1zcH","DLhzMt59lR","W7cTszmLYD",
+"8U2nU24ARF","9XyT9580YD","CIShGFFDui","RACujKsjRK","fcwDax3LDe","Mkgy85VZjS","jiVBP7fsYM","VNCPd5ZaEz","9eoRcMK07Y","v8yFNoVQp6",
+"oVQp6pv0i7","KASQ8h1zcH","iKqhrpvgjS","UmaEvprNT6","wDajXAmdQd","FFDuiAgJHQ","zbIYYFPfSE","48cHLaFFss","FwEJzBCxeC","0KyfsblLA9",
+"tuDyS5nmWv","In3NSPb1pa","xciqplj07Q","X6PinzbIYY","AXpwEd7vjM","RsQUqnlaBy","AOgEe9rlg9","GrDg7lH1kt","O3iyQQChxs","Yw2oU48cHL",
+"X6Pink85Ae","yToGWyvOMI","4dEz62Nslm","0KyfsjzUqR","ydG8UiwzGk","NhXduVjCZq","0Wr5yfqypy","GSQwjoGu6x","suY4xdpe1v","XyPZN580YD",
+"iKqhrl83Ud","64s8NpiJSk","uTacx7Ow5C","16lHctaOXK","AmdQdRxrsm","jfREuMmKGJ","oVQp6ZuDtD","WDVWJFLsph","14FLRK20wK","atef2ThjNn",
+"QClRLQYxC0","xciqpWaim6","VjCZqzFgtB","0ao3lM6qcG","qQxHPUl4a1","FnPFBxXTI4","6q6L9I7p2a","dmoS7oQ87r","CxVEfL7cGc","G1RhSY1mC0",
+"fFDrJIn3NS","xReecrhl0J","piJSkQYxC0","64s8N7Ow5C","nFqikRxrsm","nnP8oFFDui","P6bcg7Ow5C","QssNCuvf7A","okgRi9y4lw","DG4sTWaWsv",
+"cmXIXbZLvS","IBe8kFxX9q","Oz8yZFFDui","oQ87rVNCPd","n1pmOhYBCK","LewvMfLNg8","0ao3lUlU3M","i7WMQt98iW","RmDcrjiVBP","CxVEfxReec",
+"CdyBVhE1Ql","tlILtDQimp","M6qcG0Kyfs","tl72WNo0Qb","AkKTkMmKGJ","xXTI4d85a9","48cHLCxVEf","29QAzuLtKs","8cVD3Z4I1v","iB08lVLTy6",
+"K4GS8BGaQY","QbxXcCxVEf","jS1ajzbIYY","RzaZAHlUbF","d85a9s4786","Nxx9VzmLYD","zY1GYl83Ud","MK07YVLTy6","yluBxQWxoT","vLsmSAkKTk",
+"KZamHvLsmS","iwzGkv1Hln","WDVWJCqqaD","8xEKzWPmlx","OUqFMLewvM","618Di0Kyfs","JIqXilm0pD","s7MxkThjNn","JkzUnulk41","djsrvd85a9",
+"tjQxsyluBx","7fKYUnFqik","piJSk9iGoT","Mm8siRpBQm","MmsIo8U2nU","DQimpfmIK1","ni2v1DLhzM","0PktIQworu","45cIHd7vjM","7fKYU8U2nU",
+"QssNCjSjS3","AmdQd0ao3l","FwEJzn1pmO","xReecCNHmv","jtn0Xi3pyd","RACujsx5Gl","oGu6xFxX9q","oGu6xStlDJ","7fKYUjS1aj","JIqXiNOHsz",
+"Q6LixjzUqR","suY4x5Drn0","AgJHQ5Namm","ogLgc16lHc","uAWyphYBCK","Z4I1vguMb8","kZANmtlILt","EOE1o5IhmG","AgJHQWaim6","2ZHdkMK07Y",
+"uQIcz55rfB","POUYSO3iyQ","VLTy6FjHXR","7fKYU29QAz","lViBv6q6L9","OxWIHjS1aj","Y1mC0GXdoH","WaWsvMmsIo","S2DfuNOHsz","CNHmvt59lR",
+"aFFss2hEEU","fmIK1Cfgr3","Ul4a1BGaQY","uN6r324ARF","yEfy9vLsmS","IBe8k45cIH","pT8wu9eoRc","zmLYD1v5hH","Y1mC0UlU3M","jfREulkMUA",
+"In3NSuvf7A","jiVBP4dEz6","YjB9tl83Ud","WmadADLhzM","9iGoTAOgEe","lpF6WJKWYR","4W0TlpWiOs","DG4sTvOqCE","qaofNWaWsv","HfyNQJRJQB",
+"XyPZNSWfou","lm0pD7fsYM","AIYUuX6Pin","SWfourz7Ut","tvdkDZuDtD","9GXkXSjskQ","okgRih1zcH","fFDrJuQIcz","vkCHHlCMxy","5IhmGgjUTu",
+"zY1GYAgJHQ","DG4sTOUYuF","fmIK1iqv4k","FwEJz5Mg9r","i3pydOUYuF","zmLYDyluBx","Mkgy8AXpwE","e6e4z5Namm","blLA95IhmG","zFgtBlH1kt",
+"WmadASmGzv","GSQwjIjTwP","Uvlv4HzZT8","jtn0XcQOnv","0Wr5yzFgtB","1j5L8P6bcg","sx5GluPX7G","JXljW64s8N","FLsph2ZHdk","NhXduyofH3",
+"l83UdxReec","d85a9v8yFN","i7WMQjfREu","5drc6he9IA","tlILtnlaBy","7fKYUIn3NS","ZuDtDRzaZA","d85a945cIH","hSSvQ9rlg9","n1pmOJIqXi",
+"BFkb8v2eC3","Yw2oUKsjRK","5IhmG5iGN5","14FLRiB08l","FGzgpUmaEv","v1HlnpWiOs","qaofNyvOMI","uLtKs4W0Tl","QClRLFVMxo","aez9yydG8U",
+"GrDg7mX2GE","POUYSdhSuH","ix74rbrhlQ","soy9tjS1aj","2NslmksJby","2ZHdkB3qem","2ZHdkbZLvS","pFrrlWMiS3","fFDrJJ2mQi","J2mQiJRJQB",
+"nlaByydG8U","nlaByYOfrY","atef2UlU3M","5Mg9rprNT6","7fKYUFjHXR","MK07Y5Mg9r","gjUTuDQimp","lpF6W7ku1p","JRJQBFFDui","RkQkeSWfou",
+"n8pJ9GSQwj","fFDrJ5drc6","uvf7AS2Dfu","uPX7GCp3mZ","uvf7A3otm6","oVQp6Chuy3","5ZaEzCqqaD","2DREs0BmCy","TwanoiKqhr","zFgtBoGu6x",
+"tl72WnnP8o","nnP8ooGu6x","J2mQiQChxs","RmDcrd7vjM","hi5X7ZJTXH","lkMUA2hEEU","aDGtSgdQsS","Pb1pauoStw","CNHmvFGzgp","WreyPVNCPd",
+"VIlwPlweGy","dhSuHprNT6","lpF6WWMiS3","t98iWmX2GE","L7cGcmX2GE","CqqaDnlaBy","mz8gx5nmWv","lCMxyQbxXc","MmsIoWreyP","WmadAAgJHQ",
+"OHaBzAgJHQ","Z4I1vM3zXL","ciuWz9iGoT","lsQGoOz8yZ","tjQxsv2eC3","okgRiRACuj","EOE1oVjCZq","7fKYUi3pyd","vkCHHChuy3","djsrvhUTw7",
+"b29RJRACuj","y94nwFjHXR","OUqFMfcJOy","atef2taOXK","JkzUnmX2GE","IRh48jSjS3","gIYvEW3VFH","uTacxzqH0W","4QMc945cIH","2NslmOUqFM",
+"FnPFBQ6Lix","RpBQmGrDg7","e6e4zFnPFB","5ZaEzStlDJ","gdQsS8FmFH","FFDuiStlDJ","2ZHdkAgJHQ","Dz1R3uPX7G","580YDYf2Ec","NAFuwpAhR1",
+"LDk6fU3yw5","a00b55VZjS","jfREu1LB1L","NAFuwYw2oU","W3VFHWDVWJ","RsQUqxXTI4","1v5hHJJs5m","No0QbReKEW","55rfBuoStw","G1RhS14FLR",
+"UmaEvv8yFN","F6PT2DQimp","ksJbygjUTu","Dz1R32hEEU","aez9ywDajX","HP4335drc6","tAOsrs93Ml","iB08lMmsIo","LDk6fwiHrZ","M3zXLjiVBP",
+"Chuy39eoRc","cL0aEHRxd8","x3LDedQ586","xciqps93Ml","ksJbyCdyBV","TXQ0ZOHaBz","G1RhSKASQ8","2DREsUl4a1","d7vjMjSjS3","X6PinLewvM",
+"a00b5azIWp","0MR5XSjskQ","IjTwP64s8N","uLtKsix74r","J2mQiIjTwP","h1zcHxXTI4","IKxdLMK07Y","m4bxUVprf2","14FLRPOUYS","RsQUqs4786",
+"OxWIHZUnqt","iqv4k5ZaEz","sqVrffLNg8","MK07YAmdQd","dpe1vd7vjM","tl72Wlm0pD","aDGtSvLsmS","0ao3lKZamH","lViBvCxVEf","guMb8MmKGJ",
+"2DREsVprf2","fmIK1ogLgc","55rfBbZLvS","Yf2EcThjNn","ECMvUlViBv","VjCZqChuy3","WaWsvMmKGJ","cShY2Oz8yZ","CqqaD5VZjS","DcpWBOUYuF",
+"jSjS30h1b1","618Diaez9y","jiVBPBpYhV","jiVBPo8Uyd","O3iyQjtn0X","S77LH6AFT0","Uvlv4tuDyS","hE1Ql5drc6","AkKTkLbRTH","rhl0JVLTy6",
+"vOqCEiKqhr","cL0aEZ4I1v","lXFOB8xEKz","Chuy3In3NS","LbRTHFVMxo","RkQkeSs0Zu","WDVWJfFDrJ","fLNg8S2Dfu","YOfrYvkCHH","DLhzM6q6L9",
+"MmsIoJRJQB","e6e4z1v5hH","MaJQs618Di","xciqpFnPFB","yofH3Pb1pa","1j5L8SbRYy","IRh48RBhp0","Vprf2taOXK","guMb8nlaBy","U3yw52Nslm",
+"jtn0XOz8yZ","zbIYYJKWYR","rz7UtWaWsv","fqypy6AFT0","wiHrZNAFuw","2hEEUM6qcG","WMiS3azIWp","jtn0XRpBQm","HP433fcJOy","zz4ZUcmXIX",
+"Y1mC0Mm8si","NhXdu7fKYU","HlUbFW3VFH","0ao3lThjNn","pmeCduQIcz","ydG8UCp3mZ","MaJQsBbwgA","s47864QMc9","J2mQiOUqFM","blLA914FLR",
+"G1RhSs4786","5ZaEzFnPFB","Waim6AXpwE","NAFuwb29RJ","VNCPdYjB9t","ZhwG1lm0pD","yluBxRmDcr","FxX9qlViBv","45cIHiqv4k","0ao3lpv0i7",
+"3weIFSWfou","BGaQY8RCUA","d85a9WPmlx","4W0Tl2TRI7","ciuWzcShY2","Yh1hFNcICA","oQ87rKZamH","0ao3lYh1hF","Pb1paThjNn","iB08l8xEKz",
+"vOqCEBFkb8","AXpwEZhwG1","W7cTsAmdQd","pFrrl0Wr5y","8hJdtWreyP","RmDcrs4786","K20wKTa8f6","VjCZq7ku1p","jiVBPlkMUA","uN6r35Mg9r",
+"zmLYDb29RJ","WaWsvRACuj","PYBf48RCUA","b29RJe6e4z","hi5X78FmFH","TXQ0ZydG8U","Gv3FqbrhlQ","s93MlRkQke","wiHrZ29QAz","qaofNjtn0X",
+"RkQkeni2v1","ulk410PktI","v1HlnwiHrZ","taOXK2TRI7","EOE1oJXljW","DQimpAkKTk","QbxXc7hyVv","o8UydcmXIX","lpF6Wrz7Ut","lsQGoPYBf4",
+"Cp3mZTwano","9GXkXDG4sT","VLTy69y4lw","WmadAatef2","DLhzMpT8wu","Uvlv4WMiS3","FPfSEAgJHQ","t98iW2Nslm","4W0Tl5VZjS","SmGzvCIShG",
+"SmGzvv2eC3","RACujX6Pin","jS1aj4dEz6","ReKEWFVMxo","ECMvUJKWYR","RzaZAChuy3","s93Mlix74r","cmXIXOxWIH","o8UydOUqFM","ni2v1VIlwP",
+"QworuQWxoT","RmDcryofH3","KASQ8okgRi","RBhp0fqypy","MojnPbZLvS","fFDrJHlUbF","3weIFlViBv","yluBx0h1b1","zmLYDgIYvE","Yw2oUYw2oU",
+"uQIczWaWsv","2TRI7OUqFM","uAWypb29RJ","CqqaDsuY4x","aFFssAgJHQ","OUYuFbrhlQ","JXljWaL6AJ","NhXduiB08l","FcWrWgIYvE","0KyfsRsQUq",
+"tvdkDWmadA","blLA9fmIK1","qQxHPoVQp6","zbIYYDQimp","rz7UtAkKTk","e6e4zgjUTu","ulk41jzUqR","Mm8sio8Uyd","guMb84W0Tl","FjHXRYh1hF",
+"h1zcHGWqqX","hi5X7rz7Ut","cmXIXKZamH","vLsmSuupzk","G1RhSBGaQY","o8Uyd2hEEU","gIYvEBbwgA","v8yFN8xEKz","aez9ySjskQ","mz8gx8U2nU",
+"7ku1p8FmFH","taOXKvLsmS","yToGW0BmCy","cL0aEAkKTk","gtCA5iKqhr","SmGzvYjB9t","64s8NjS1aj","F6PT2IKxdL","euZA5HfyNQ","jzUqRFwEJz",
+"IBe8kvkCHH","zmLYDrhl0J","KsjRKpT8wu","8FmFHDz1R3","y94nw3otm6","580YD0h1b1","MGlTFx3LDe","B3qemhUTw7","JXljWv1Hln","HfyNQ45cIH",
+"DG4sTM6qcG","tjQxsCqqaD","0Wr5y2hEEU","he9IAokgRi","TwanocL0aE","9eoRcSmGzv","lH1ktVprf2","YjB9t6AFT0","W7cTsIjTwP","azIWp6AFT0",
+"D6rBy9rlg9","GSQwj0Wr5y","nlaByd85a9","hYBCKjS1aj","x3LDemz8gx","qQxHPFNYIM","hUTw7FwEJz","pmeCdRxrsm","gtCA5a00b5","QYxC0qUJMd",
+"S2DfuYjB9t","yluBxFGzgp","Gv3FqDz1R3","iB08lmX2GE","9GXkX5nmWv","yvOMI0Kyfs","IjTwPt98iW","9eoRcM3zXL","WDVWJ29QAz","1j5L8xReec",
+"ix74r0YAGH","55rfBRpBQm","aFFssKsjRK","cmXIXsx5Gl","qQxHPAXpwE","RkQkepmeCd","24ARF8cVD3","aFFssRkQke","0h1b148cHL","tvdkDM6qcG",
+"7ku1pW3VFH","Q6hMCRsQUq","azIWpX6Pin","uPX7Guupzk","yvOMIJ2mQi","Ta8f6MaJQs","Uvlv4iwzGk","m4bxUNcICA","J2mQiokgRi","HfyNQhUTw7",
+"IBe8kWPmlx","hYBCKOUqFM","fqypyKsjRK","LewvMGXdoH","i3pydzmLYD","FVMxoO3iyQ","uPX7GAOgEe","ZUnqtyEfy9","BGaQY4QMc9","MGlTF5ZaEz",
+"JkzUnlpF6W","ru4UG5Namm","OHaBzTwano","vLsmSaez9y","U3yw5QClRL","he9IAeuZA5","AkKTkogLgc","uTacxzbIYY","F6PT2n1pmO","7X3uyuZPqg",
+"7Ow5CuAWyp","3otm6Yh1hF","qaofN2Nslm","v1Hln5ZaEz","Uvlv4brhlQ","CK5W7lH1kt","jzUqRaez9y","Yw2oUciuWz","4dEz67Ow5C","hi5X7CK5W7",
+"uLtKs5drc6","ZUnqtjzUqR","45cIH1v5hH","8cVD3prNT6","AkKTkfLNg8","FFDuiyluBx","Mm8sijeskS","FPfSExXTI4","pvgjSFhtgl","dQ586SbRYy",
+"t59lRrz7Ut","tAOsr5iGN5","uoStwMojnP","rhl0JJXljW","piJSkHlUbF","PYBf44W0Tl","QWxoTJJs5m","NcICAZhwG1","Ul4a1FwEJz","7ku1pqUJMd",
+"BGaQYfmIK1","HzZT8KsjRK","yofH3oQ87r","aDGtSiB08l","MezSWcmXIX","ksJbyogLgc","jzUqRPb1pa","lsQGox3LDe","MmKGJ8TxD7","LewvM7Ow5C",
+"qQxHP7lUXZ","8U2nUJRJQB","FLsphuoStw","Mm8sioVQp6","FhtglKsjRK","VLTy6fcwDa","jtn0XOUqFM","RBhp0fcwDa","XflUqoGu6x","C2IrcxXTI4",
+"s7Mxkpv0i7","64s8NWDVWJ","gtCA5K20wK","9y4lwuZPqg","FFDuitlILt","2hEEUK20wK","MmsIoHzZT8","vLsmSFPfSE","J2mQiKASQ8","iB08lPYBf4",
+"dmoS70ao3l","tjQxsl83Ud","5iGN5hSSvQ","OHaBzCK5W7","FxX9qyToGW","dhSuHQChxs","yofH3bZLvS","piJSk3weIF","Yh1hFGv3Fq","pv0i7ydG8U",
+"AOgEeAkKTk","cL0aEGSQwj","lXFOBS77LH","POUYS45cIH","ni2v1RBhp0","7hyVvkB5nP","MezSWrKDLJ","zbIYYfmIK1","OUYuFIn3NS","sqVrf580YD",
+"uQIczFLsph","tl72WMojnP","Dz1R3dhSuH","ulk41C2Irc","sqVrfYf2Ec","jSjS31j5L8","lpF6WlViBv","pWiOsulk41","Rxrsm3weIF","zQt6Q3otm6",
+"Nxx9Viqv4k","h1zcH7hyVv","FwEJzRsQUq","JkzUnLDk6f","5VZjSAgJHQ","8RCUAMmKGJ","QworuGWqqX","ydG8UB3qem","hi5X7pvgjS","RmDcrXflUq",
+"nnP8ouJScX","vkCHHKASQ8","TXQ0ZNcICA","AmdQd3otm6","aez9yqaofN","oVQp6EoToP","qaofNqQxHP","9GXkX5drc6","0ao3ls93Ml","djsrvpT8wu",
+"9iGoTogLgc","5NammVerEA","zz4ZUWPmlx","mX2GEuvf7A","TCgPpIKxdL","azIWpO3iyQ","RzaZAn8pJ9","uvf7AuN6r3","G1RhSRACuj","MK07YrKDLJ",
+"Yh1hFogLgc","P6bcgrz7Ut","cQOnvaDGtS","nnP8otjQxs","WreyPOUqFM","Cfgr3brhlQ","6q6L90MR5X","uTacx5iGN5","FLsphzbIYY","tuDySzFgtB",
+"d7vjMpvgjS","jSjS3iKqhr","B3qemkB5nP","0Wr5yhYBCK","jzUqRix74r","OUqFMmz8gx","GWqqXAIYUu","ydG8U4W0Tl","lpF6Wlm0pD","8TxD7VNCPd",
+"fFDrJGWqqX","Waim6ksJby","pv0i7o8Uyd","fFDrJd7vjM","he9IAF6PT2","tlILtaFFss","lXFOB3otm6","FPfSEpAhR1","RBhp01v5hH","QworuNcICA",
+"YOfrYtl72W","DQimplViBv","tjQxsZzJHW","CdyBVb29RJ","a00b5t59lR","VLTy68hJdt","5nmWvIjTwP","uAWypFnPFB","NhXdu5ZaEz","fcwDaIKxdL",
+"Zv7z0CNHmv","4dEz6ru4UG","hYBCKuupzk","zbIYYYf2Ec","hSSvQEOE1o","pmeCdWreyP","s93MlRmDcr","zFgtBNhXdu","AgJHQCqqaD","soy9tZhwG1",
+"lsQGo0PktI","0Wr5yDcpWB","6AFT0QWxoT","VLTy6yToGW","uJScXGrDg7","iB08lFPfSE","FPfSE0MR5X","AXpwEs7Mxk","iwzGkWDVWJ","0BmCyDQimp",
+"BbwgA3weIF","2DREsMmKGJ","MezSWW7cTs","i3pydYh1hF","X6PinCqqaD","jzUqRMGlTF","azIWpIjTwP","JIqXizbIYY","4QMc96q6L9","FGzgpdpe1v",
+"aez9yhE1Ql","580YDQClRL","AgJHQ7ku1p","DLhzM0Wr5y","5nmWvCK5W7","cShY2he9IA","1j5L80BmCy","RsQUqFcWrW","Vprf2Z4I1v","5drc6VerEA",
+"guMb8zz4ZU","dQ586jfREu","h1zcHDQimp","n8pJ9HlUbF","fqypyoGu6x","Ta8f614FLR","wiHrZW3VFH","DcpWB0h1b1","uZPqgFNYIM","jfREuBbwgA",
+"5VZjSCIShG","tuDySRmDcr","5nmWvSbRYy","MojnPgIYvE","ZhwG155rfB","s93Ml5Namm","FVMxo2hEEU","K4GS8UmaEv","mz8gxU3yw5","EOE1otvdkD",
+"NAFuwtvdkD","ix74r0MR5X","blLA9ciuWz","fmIK1WmadA","n1pmOtAOsr","9eoRcfmIK1","MGlTFaL6AJ","pT8wuQYxC0","BCxeCDQimp","pvgjSCK5W7",
+"7fKYU16lHc","2Yz7ETCgPp","d7vjMcQOnv","JkzUnh1zcH","Zv7z0Oz8yZ","JkzUnIRh48","jiVBPwiHrZ","IBe8kpmeCd","SmGzv618Di","0ao3l8RCUA",
+"5drc68cVD3","Nxx9VRzaZA","zFgtBQ6Lix","lViBve6e4z","07n1cpWiOs","LewvMOUYuF","5Drn0kZANm","FFDui24ARF","9rlg9aL6AJ","9iGoT2Nslm",
+"SbRYylH1kt","No0QblCMxy","Chuy3n8pJ9","SjskQOHaBz","5Namm4dEz6","kZANmulk41","MGlTFCp3mZ","pWiOsfqypy","EoToPdpe1v","lj07QCxVEf",
+"0BmCylH1kt","IjTwPlViBv","M3zXLDQimp","StlDJsqVrf","8xEKzGSQwj","pWiOsvLsmS","fFDrJ7X3uy","Yf2Ec5ZaEz","fmIK1VerEA","gtCA5Cp3mZ",
+"Kr8ys2Nslm","5IhmGlm0pD","tlILtUlU3M","YjB9tsx5Gl","gIYvEFhtgl","qUJMd2Nslm","HfyNQNo0Qb","yluBx5drc6","Mkgy8lViBv","pFrrlhE1Ql",
+"zbIYYCp3mZ","X6Pint59lR","gf8rIdhSuH","uvf7AqUJMd","5nmWv8FmFH","YOfrY7fKYU","QbxXcHP433","e6e4z5nmWv","dmoS7zbIYY","qaofNJIqXi",
+"4dEz6qUJMd","7hyVvOxWIH","pmeCdfLNg8","C2IrcB3qem","Zv7z0FnPFB","djsrveuZA5","4QMc97X3uy","okgRi2TRI7","bZLvSSWfou","atef2pT8wu",
+"MezSWe6e4z","iwzGkIKxdL","QnJ1SfcwDa","dQ586Oz8yZ","DG4sTQClRL","K4GS8GXdoH","iqv4kdQ586","IRh48euZA5","Mkgy8POUYS","JKWYRFNYIM",
+"yToGWRxrsm","AXpwEThjNn","7fsYMIjTwP","BGaQYuLtKs","I7p2aJKWYR","s7MxkNhXdu","hYBCKn8pJ9","0ao3lWPmlx","VjCZqIjTwP","6q6L9WPmlx",
+"vkCHHMezSW","MaJQsyEfy9","8TxD7gdQsS","C2IrcFLsph","MmsIobrhlQ","HfyNQl83Ud","AIYUuWPmlx","EdBKczz4ZU","QnJ1SciuWz","iKqhrb29RJ",
+"Q6LixpWiOs","WMiS3Yf2Ec","RkQkevLsmS","7Ow5C7X3uy","WmadAGXdoH","iqv4k0YAGH","RACujSjskQ","ZzJHWYh1hF","Chuy3YjB9t","7ku1puPX7G",
+"2Yz7E4QMc9","5NammFcWrW","uPX7GRACuj","zHF1qqQxHP","FVMxouAWyp","euZA5LDk6f","KASQ8l83Ud","zHF1qdjsrv","ix74rcL0aE","AmdQdpiJSk",
+"qaofNzbIYY","EOE1oaez9y","Zv7z0ix74r","WMiS3jzUqR","qaofNB3qem","tuDySJRJQB","LewvMgtCA5","VjCZqQworu","POUYSfqypy","8RCUAv8yFN",
+"4W0TlLDk6f","lXFOB5Namm","GrDg7RACuj","24ARFjiVBP","v8yFNKr8ys","SjskQyEfy9","618DiUl4a1","uTacxuTacx","i7WMQeuZA5","piJSksoy9t",
+"nFqika00b5","pAhR1xReec","5NammAXpwE","bZLvSyToGW","yluBxSmGzv","NhXduazIWp","xciqpokgRi","W3VFH5IhmG","rz7UtuN6r3","5iGN5HfyNQ",
+"nlaBy9eoRc","JKWYRkZANm","pAhR1zY1GY","yvOMImX2GE","16lHcOUYuF","Ta8f6qUJMd","Pb1pasoy9t","ru4UGksJby","zY1GYdjsrv","24ARFU3yw5",
+"XflUquN6r3","jtn0XokgRi","ni2v1GSQwj","yvOMItaOXK","QWxoThSSvQ","rKDLJ2Nslm","cmXIXfFDrJ","i7WMQzY1GY","SmGzvVLTy6","QClRLwiHrZ",
+"lXFOBVIlwP","OUqFMYjB9t","FnPFBDQimp","yvOMIlweGy","DcpWB5nmWv","5Drn0ulk41","Cp3mZyluBx","HlUbFv2eC3","SWfouMaJQs","s7MxklViBv",
+"16lHcbgJAz","Zv7z0v1Hln","i3pydTCgPp","JkzUnjfREu","4dEz6taOXK","ThjNnxciqp","gf8rIqUJMd","W3VFHSbRYy","WDVWJMkgy8","DcpWB5ZaEz",
+"QYxC00BmCy","ReKEWWaWsv","VLTy6GXdoH","WreyPJkzUn","XflUqKsjRK","cQOnvFNYIM","blLA97hyVv","OUYuFix74r","Q6hMClCMxy","n8pJ9FGzgp",
+"PYBf4BCxeC","9rlg9tlILt","hYBCKvOqCE","tvdkDF6PT2","dpe1vaFFss","wiHrZ2hEEU","pv0i7t98iW","Oz8yZfmIK1","WMiS32DREs","5iGN5yluBx",
+"jS1ajuLtKs","kB5nPBFkb8","jiVBP5IhmG","RxrsmTCgPp","FVMxobgJAz","U3yw5RsQUq","rz7UtksJby","JJs5m8hJdt","pT8wu0YAGH","Q6hMCd85a9",
+"5Namm9y4lw","D6rBytl72W","DcpWBlpF6W","7Ow5CECMvU","ZJTXHjtn0X","lj07QIRh48","LewvMuLtKs","QYxC0RBhp0","JRJQBQWxoT","Chuy3X6Pin",
+"prNT6UlU3M","TCgPpZ4I1v","aDGtS5Drn0","EOE1oSs0Zu","tjQxsv1Hln","FnPFBaL6AJ","nnP8oSbRYy","NcICAZuDtD","Waim6vOqCE","mX2GEL7cGc",
+"cShY2KZamH","Pb1pauupzk","RkQkecmXIX","ZuDtDD6rBy","IBe8kaFFss","9iGoTn8pJ9","ReKEW9GXkX","VLTy6NOHsz","s7MxkMezSW","5ZaEzFGzgp",
+"FnPFBtuDyS","JIqXihYBCK","Oz8yZOUYuF","SjskQhe9IA","cL0aEtAOsr","lViBvVLTy6","5Drn0MmsIo","jfREulpF6W","b29RJHfyNQ","xReecb29RJ",
+"o8UydpvgjS","a00b5GSQwj","dQ5866q6L9","yluBxDz1R3","uupzk5Mg9r","vkCHHFcWrW","zmLYDBCxeC","2Yz7EOUqFM","AmdQdCqqaD","RzaZAqUJMd",
+"3weIFhE1Ql","atef2s7Mxk","VIlwPhSSvQ","djsrvMm8si","8hJdttl72W","0Wr5yDLhzM","Chuy3piJSk","5nmWvC2Irc","mz8gxMezSW","JJs5mQYxC0",
+"16lHcni2v1","MmKGJS2Dfu","iqv4kFcWrW","Mkgy8s7Mxk","t98iWKr8ys","580YDRxrsm","v1Hlngf8rI","0Wr5yJRJQB","jfREuCK5W7","QssNCF6PT2",
+"cShY2AOgEe","0PktI0Kyfs","K20wK5IhmG","ZuDtDRmDcr","QYxC0K20wK","wiHrZulk41","SWfouv8yFN","tAOsrk85Ae","CK5W7fcJOy","GSQwj0PktI",
+"RkQkeyvOMI","AOgEeMmsIo","zbIYYvLsmS","v2eC3DQimp","he9IA5Mg9r","SjskQJXljW","lm0pD0h1b1","MmKGJnnP8o","5Mg9raL6AJ","VNCPdlkMUA",
+"7X3uyI7p2a","FLspht59lR","XyPZN3otm6","n8pJ9hUTw7","Nxx9VGrDg7","BbwgAHRxd8","xReecEOE1o","Q6hMCjtn0X","guMb8EOE1o","DQimpMezSW",
+"ydG8U3otm6","dpe1v4W0Tl","QssNC9rlg9","VIlwPZ4I1v","IjTwPksJby","LDk6fCNHmv","S2DfutuDyS","uupzkGSQwj","45cIHatef2","pWiOsS77LH",
+"1LB1LTa8f6","UmaEvSs0Zu","VLTy62TRI7","s7MxkaFFss","gjUTuQClRL","SbRYyCNHmv","QnJ1S618Di","L7cGcvkCHH","FxX9q5nmWv","Ul4a1fqypy",
+"cQOnvuN6r3","FLsph1v5hH","l83UdazIWp","hYBCKZuDtD","6q6L9pWiOs","Kr8ystlILt","hYBCKsqVrf","qUJMdtuDyS","hE1QlS2Dfu","FLsphjzUqR",
+"IKxdLiKqhr","uPX7GMGlTF","J2mQilm0pD","zHF1qHP433","AgJHQtuDyS","yvOMIsoy9t","Cp3mZFxX9q","DLhzMRxrsm","t98iWpiJSk","AIYUuzbIYY",
+"QYxC06AFT0","lpF6WDQimp","MmKGJ8U2nU","M6qcG9iGoT","Y1mC0oVQp6","YOfrYW7cTs","F6PT2h1zcH","qaofNVIlwP","kB5nPQbxXc","BbwgAm4bxU",
+"vkCHHksJby","jiVBPJRJQB","K20wK8cVD3","HzZT8BFkb8","ZUnqtAmdQd","1j5L8nnP8o","U3yw5vkCHH","FFDuiOHaBz","45cIHKr8ys","7ku1p3otm6",
+"xciqpBCxeC","HzZT8QnJ1S","pv0i7hYBCK","jfREu7fKYU","uPX7Gs4786","xXTI4nnP8o","nnP8oy94nw","zqH0WUvlv4","UmaEv9eoRc","WPmlx4QMc9",
+"ogLgc0h1b1","AkKTkI7p2a","EOE1oAOgEe","J2mQiFVMxo","IRh48he9IA","EdBKcMaJQs","EOE1o9rlg9","HfyNQLDk6f","pWiOsuAWyp","FPfSEeuZA5",
+"gf8rIv8yFN","DQimpSs0Zu","IBe8k5iGN5","zHF1q5Namm","AmdQdlkMUA","14FLRAXpwE","lCMxyTXQ0Z","CK5W7ThjNn","VBjhzn8pJ9","aez9y0h1b1",
+"8FmFHyToGW","jeskSBpYhV","GrDg7ogLgc","faHirQssNC","y94nwM6qcG","ZhwG1OUYuF","suY4x8FmFH","fcwDatjQxs","dQ586piJSk","iwzGks93Ml",
+"jS1ajECMvU","IRh48x3LDe","kZANmd7vjM","zbIYYFNYIM","Waim6i3pyd","FFDuiThjNn","vLsmSGv3Fq","pvgjS3otm6","8RCUAuupzk","cQOnv618Di",
+"tuDySuZPqg","fqypyjeskS","3weIFU3yw5","FjHXRWDVWJ","VjCZqW3VFH","pmeCdk85Ae","jS1ajDLhzM","X6PinW3VFH","KZamHX6Pin","Yw2oUThjNn",
+"WmadAU3yw5","55rfBrKDLJ","5iGN5RpBQm","Q6hMCix74r","jzUqRlViBv","5IhmG7hyVv","iqv4kx3LDe","kB5nPn1pmO","7ku1pi7WMQ","Gv3FqvLsmS",
+"7fsYMNo0Qb","a00b5i3pyd","OHaBzoVQp6","WmadAUmaEv","DQimpsoy9t","MezSWoGu6x","qQxHPfLNg8","MaJQseuZA5","fcwDaFcWrW","DQimpZhwG1",
+"m4bxUU3yw5","Yw2oUPOUYS","WmadA0PktI","jSjS3fLNg8","gf8rIgjUTu","tAOsruQIcz","24ARFK20wK","2Nslmy94nw","ciuWzfqypy","uJScXhe9IA",
+"AkKTkSmGzv","SWfouCK5W7","FNYIMK4GS8","euZA5zqH0W","pvgjS5Mg9r","fmIK1LDk6f","DQimpXflUq","9XyT93weIF","rz7Ut0BmCy","pT8wuQssNC",
+"uZPqgLbRTH","0YAGHgf8rI","FcWrWmz8gx","gIYvEFNYIM","0MR5XhYBCK","LbRTHQworu","ciuWzvOqCE","ZJTXHuN6r3","suY4xWDVWJ","uTacxzHF1q",
+"ZJTXHiqv4k","uLtKsB3qem","WaWsvWaim6","ZJTXH2TRI7","M3zXLAmdQd","VNCPdlH1kt","hE1QlcmXIX","64s8N8xEKz","atef2StlDJ","ydG8Uv1Hln",
+"QbxXcAIYUu","aDGtSCfgr3","S2DfuuPX7G","tl72WGv3Fq","FNYIMMm8si","s7Mxk45cIH","tjQxsHP433","VIlwPQWxoT","l83Ud2hEEU","14FLRCp3mZ",
+"soy9tQYxC0","bZLvSgtCA5","IRh488U2nU","580YDD6rBy","7ku1pqaofN","JXljWJIqXi","29QAzWPmlx","uPX7GDQimp","k85Ae2DREs","4QMc9vOqCE",
+"RzaZAguMb8","9iGoTuTacx","tvdkDOUYuF","yluBxAgJHQ","Waim6L7cGc","zHF1qWaim6","ru4UG5drc6","blLA9Waim6","gjUTu48cHL","07n1cMm8si",
+"o8UydQChxs","yEfy9XflUq","MezSWulk41","9rlg9CdyBV","jeskSMmKGJ","dpe1v8cVD3","hUTw7zbIYY","QbxXcUlU3M","U3yw5CNHmv","QChxsv2eC3",
+"CqqaDuupzk","sqVrf16lHc","Pb1pahe9IA","VIlwP4dEz6","uupzkcShY2","NOHszG1RhS","GrDg7tl72W","cShY2MGlTF","AmdQds93Ml","cQOnvNxx9V",
+"OUYuFMezSW","rKDLJjiVBP","jtn0XHfyNQ","tAOsrIKxdL","v8yFNIRh48","VNCPd07n1c","OHaBzKr8ys","Fhtgl6AFT0","Yw2oU2Nslm","fmIK1hYBCK",
+"CxVEfgdQsS","HP433S77LH","fLNg8CNHmv","POUYSfLNg8","l83Udv2eC3","No0QbvLsmS","45cIHFPfSE","HfyNQY1mC0","yluBxHlUbF","pAhR1hUTw7",
+"tl72WKZamH","RzaZAOUqFM","AXpwEJXljW","ogLgciqv4k","8hJdtokgRi","jS1ajUvlv4","vkCHHaL6AJ","zQt6QFnPFB","iqv4kRxrsm","cmXIXpmeCd",
+"iqv4kUmaEv","07n1clXFOB","Z4I1vW3VFH","7lUXZ4QMc9","aFFssZhwG1","jzUqRpWiOs","HzZT8oVQp6","NOHszLewvM","fFDrJrKDLJ","Q6LixlXFOB",
+"QbxXcbrhlQ","hE1QlYh1hF","VLTy614FLR","uJScXaez9y","IjTwPtlILt","9rlg9Yf2Ec","t98iWyToGW","zFgtBQnJ1S","U3yw5uN6r3","h1zcHtvdkD",
+"ECMvUJRJQB","pT8wusuY4x","yToGWIBe8k","zY1GYWreyP","fFDrJs7Mxk","kZANmHRxd8","EdBKc4dEz6","XflUq4QMc9","tlILtW3VFH","dQ586jSjS3",
+"JXljWfmIK1","lkMUAFwEJz","RkQkeFxX9q","IRh4814FLR","WPmlxjS1aj","0ao3lL7cGc","2Nslm9y4lw","WMiS3XyPZN","F6PT2tjQxs","BbwgAvLsmS",
+"7X3uywiHrZ","0YAGHVBjhz","dpe1vOUqFM","okgRiiB08l","4QMc9M6qcG","guMb8l83Ud","3weIFAgJHQ","FcWrWPOUYS","StlDJCfgr3","tAOsrZ4I1v",
+"ix74rMkgy8","Zv7z0PYBf4","4QMc95Namm","yToGWy94nw","GSQwjcShY2","zz4ZU8hJdt","FPfSEjSjS3","OxWIHMezSW","hYBCKh1zcH","CIShGDz1R3",
+"QnJ1SLDk6f","sx5GldQ586","FLsphW3VFH","k85AeqaofN","O3iyQbgJAz","2ZHdkzmLYD","FwEJzpv0i7","AkKTkuJScX","48cHLSWfou","WDVWJReKEW",
+"ulk41WDVWJ","K4GS8WaWsv","48cHLblLA9","ru4UGPb1pa","IRh48ru4UG","prNT6MojnP","WaWsv8hJdt","9iGoTYOfrY","wDajXazIWp","Waim6uLtKs",
+"d7vjM1j5L8","s4786FnPFB","5ZaEz29QAz","uQIczQ6Lix","29QAzJKWYR","2ZHdk6AFT0","0YAGHJkzUn","MGlTFVIlwP","zY1GYbgJAz","ZzJHWazIWp",
+"FGzgpW7cTs","tAOsrB3qem","5Namm48cHL","GSQwjtjQxs","JXljWNOHsz","RkQkeCfgr3","djsrvK4GS8","tjQxsUmaEv","7X3uyRACuj","Chuy30YAGH",
+"lweGyQworu","jfREu64s8N","JkzUnBCxeC","soy9tRkQke","LewvM6q6L9","kB5nPl83Ud","BFkb8GSQwj","jtn0XNOHsz","pmeCdqaofN","hi5X7TCgPp",
+"CNHmvGXdoH","ZuDtDVLTy6","QChxs0Kyfs","gIYvE2Nslm","16lHcfcwDa","0ao3l2ZHdk","5Mg9rRsQUq","qaofN5drc6","AIYUu4QMc9","FLsph5iGN5",
+"wiHrZAmdQd","oGu6x5iGN5","5iGN52TRI7","m4bxUXyPZN","2Yz7EzqH0W","GrDg7xciqp","dQ586K20wK","CdyBV2DREs","pv0i755rfB","5Mg9rTwano",
+"IBe8kuQIcz","FjHXRlCMxy","xciqpx3LDe","lweGyuAWyp","FVMxo48cHL","uvf7AI7p2a","1v5hHXflUq","Yh1hF5IhmG","GWqqXWaWsv","tAOsrmz8gx",
+"BbwgACNHmv","CxVEfPb1pa","d7vjMxReec","9y4lwVNCPd","29QAz2ZHdk","3otm6IjTwP","n1pmOqUJMd","HRxd80PktI","FnPFBd85a9","Chuy3CqqaD",
+"24ARFJRJQB","v2eC3FxX9q","WmadAYjB9t","yvOMICIShG","kB5nPuoStw","bZLvSfcwDa","580YDO3iyQ","WPmlx7fKYU","xReecFPfSE","OHaBzpT8wu",
+"ni2v10Kyfs","LDk6fDz1R3","lj07QmX2GE","B3qemYOfrY","8U2nUQ6Lix","OUqFMTwano","mX2GEZUnqt","0MR5Xx3LDe","Pb1paRACuj","zQt6Q9eoRc",
+"ThjNns4786","vLsmSDcpWB","FnPFB7hyVv","iwzGkOUYuF","5VZjSIn3NS","Yw2oUpmeCd","k85AeuLtKs","WDVWJFNYIM","sqVrfkZANm","uLtKsSWfou",
+"zmLYDWaWsv","azIWpMaJQs","I7p2alViBv","BCxeCJJs5m","ksJbyJJs5m","JXljW8TxD7","Nxx9V5iGN5","NhXdu3weIF","RmDcrAOgEe","jeskS5Drn0",
+"aDGtS2DREs","uZPqgPOUYS","Z4I1v5Namm","S2DfuFhtgl","bZLvS5iGN5","FVMxoX6Pin","AOgEegtCA5","wiHrZWaWsv","5iGN5HP433","PYBf4Oz8yZ",
+"1v5hHKsjRK","jiVBPFGzgp","2TRI7AkKTk","P6bcgt98iW","CK5W7UmaEv","EoToPCxVEf","1j5L8piJSk","NAFuw8hJdt","lm0pDzmLYD","wDajXMezSW",
+"AXpwEuAWyp","RACujQbxXc","9XyT9yluBx","yofH3WreyP","sx5GlM3zXL","cShY2vOqCE","JkzUnRACuj","RmDcrfaHir","Fhtglpv0i7","7hyVvguMb8",
+"48cHLoGu6x","RACujLbRTH","x3LDefaHir","7fKYUprNT6","MaJQsAmdQd","U3yw5HP433","uJScXQWxoT","M3zXLdpe1v","v1HlnF6PT2","Mm8siyToGW",
+"fFDrJHzZT8","QChxsU3yw5","2Yz7EDG4sT","i7WMQIKxdL","guMb8sqVrf","9GXkXRmDcr","In3NSdmoS7","FcWrWZUnqt","8cVD3NOHsz","24ARFCK5W7",
+"ix74rIBe8k","yvOMIpWiOs","fcJOyzHF1q","2TRI7B3qem","t98iWYjB9t","POUYSoQ87r","prNT6d7vjM","POUYS0Wr5y","uoStwRkQke","xXTI4L7cGc",
+"Z4I1vAIYUu","Y1mC0Ul4a1","wiHrZpmeCd","DG4sT9iGoT","5Mg9rCK5W7","s7MxkjS1aj","9GXkX64s8N","wiHrZRzaZA","M3zXL7fKYU","dmoS72ZHdk",
+"WPmlxuJScX","StlDJlCMxy","FGzgp0Kyfs","dQ586BFkb8","gdQsSn8pJ9","X6PinJIqXi","IRh48UmaEv","ZhwG1iKqhr","Rxrsmatef2","ThjNnpWiOs",
+"VerEAuupzk","uZPqg7fsYM","k85AeNhXdu","cShY2Fhtgl","JIqXiOUYuF","YjB9tyvOMI","NhXduv2eC3","dmoS7LewvM","gtCA5EoToP","iqv4kMGlTF",
+"k85AeyEfy9","S77LH7fsYM","QYxC0zFgtB","2hEEUqaofN","Dz1R3aez9y","0BmCyEdBKc","Nxx9VKr8ys","lH1ktuN6r3","lm0pDGSQwj","OHaBzOz8yZ",
+"DLhzMgdQsS","yofH3ix74r","4QMc9s93Ml","FNYIMZ4I1v","dQ5860Kyfs","LDk6fSWfou","2TRI7Rxrsm","HP433AgJHQ","lj07QJIqXi","ksJbyxciqp",
+"jzUqRh1zcH","Yf2EcMm8si","rKDLJChuy3","yToGWXyPZN","uvf7AuTacx","ulk412DREs","yvOMIlj07Q","nnP8oJRJQB","C2IrcZ4I1v","Chuy3hUTw7",
+"ni2v1pFrrl","RkQkepvgjS","xciqpiwzGk","8xEKzCNHmv","5IhmGv1Hln","gtCA5zHF1q","EdBKcb29RJ","2hEEUhi5X7","gIYvENcICA","Oz8yZFLsph",
+"FVMxoNAFuw","IRh48F6PT2","UlU3MzFgtB","uZPqgzFgtB","lpF6WJJs5m","i7WMQVjCZq","Waim69XyT9","JRJQBIBe8k","d85a9OxWIH","kB5nPcShY2",
+"NhXduuupzk","yEfy9Zv7z0","FhtgldmoS7","BCxeCuPX7G","RpBQmv2eC3","2TRI7FNYIM","KZamHXyPZN","POUYSDLhzM","Cfgr3yEfy9","BGaQY5Mg9r",
+"OUqFMTXQ0Z","s7Mxk3otm6","4dEz6bgJAz","JkzUnwDajX","9GXkXFhtgl","FcWrWlpF6W","gdQsSe6e4z","RBhp0CqqaD","wDajX14FLR","IjTwPMK07Y",
+"U3yw5KsjRK","RsQUqGrDg7","9GXkXL7cGc","YjB9tWaim6","TXQ0Zd85a9","Waim6JXljW","Y1mC0WaWsv","y94nwM3zXL","YOfrYFhtgl","8FmFHd85a9",
+"yEfy9lkMUA","WDVWJGrDg7","sx5Gl7fsYM","7hyVv2Nslm","dQ5869rlg9","s93MlQYxC0","0YAGHh1zcH","yToGWzbIYY","NOHszksJby","AIYUuFjHXR",
+"uupzkRACuj","4W0TlxXTI4","Zv7z0aL6AJ","GWqqXjzUqR","45cIHZv7z0","GSQwjWDVWJ","lj07QzY1GY","ECMvU5VZjS","zz4ZUa00b5","VLTy6prNT6",
+"xXTI4n8pJ9","O3iyQRpBQm","CIShGtjQxs","U3yw5nnP8o","IBe8klm0pD","sqVrfrhl0J","FnPFBlm0pD","RpBQmzQt6Q","yEfy9LDk6f","ciuWzCIShG",
+"24ARF8FmFH","ni2v1jiVBP","lViBvCIShG","uAWypAIYUu","Ss0ZugdQsS","2DREs0ao3l","BbwgAIBe8k","D6rBy07n1c","LDk6fjzUqR","W3VFHs4786",
+"fcJOy5Mg9r","o8UydSmGzv","48cHLgjUTu","F6PT2ZzJHW","v2eC38xEKz","ZzJHWPb1pa","zz4ZUCIShG","WaWsvuQIcz","ru4UGsx5Gl","yvOMINxx9V",
+"DcpWBuoStw","ulk41LDk6f","6q6L9No0Qb","Vprf2uZPqg","45cIHogLgc","ix74reuZA5","nlaByJ2mQi","3weIF9iGoT","FcWrWY1mC0","S77LH0PktI",
+"QbxXc5Drn0","FGzgpQWxoT","tlILt48cHL","x3LDehi5X7","gf8rIPOUYS","zY1GYoGu6x","1v5hHjzUqR","UlU3Muupzk","blLA9d7vjM","YjB9tdhSuH",
+"lpF6WB3qem","wiHrZ8FmFH","uAWypfaHir","uZPqgFjHXR","hi5X7nlaBy","uoStwZzJHW","prNT62TRI7","Ss0ZugIYvE","Kr8yss4786","gf8rIUmaEv",
+"oQ87rdmoS7","0PktIk85Ae","Yw2oU16lHc","BCxeCCdyBV","pFrrljiVBP","i7WMQvOqCE","JRJQBfcJOy","cmXIXm4bxU","FjHXRF6PT2","LbRTHOUYuF",
+"Zv7z0n8pJ9","lsQGo64s8N","gjUTuSjskQ","Pb1paaL6AJ","FLsph8RCUA","07n1c5Drn0","7fsYMlm0pD","JIqXiMaJQs","pT8wuS77LH","8xEKzsoy9t",
+"LDk6fHP433","tjQxsD6rBy","In3NSdQ586","FjHXRQ6hMC","zqH0WFVMxo","4dEz6Zv7z0","O3iyQZ4I1v","In3NS29QAz","4QMc90BmCy","CNHmvuJScX",
+"v1HlnJRJQB","zbIYY1j5L8","TCgPpb29RJ","RmDcrmz8gx","vkCHH7lUXZ","Vprf20BmCy","7Ow5CNo0Qb","gdQsS14FLR","Zv7z0pmeCd","suY4xaL6AJ",
+"n1pmOuZPqg","RzaZAlCMxy","1LB1LZuDtD","iKqhrOUqFM","3otm6rKDLJ","uZPqgVprf2","Dz1R3rhl0J","taOXKUmaEv","J2mQiC2Irc","zFgtBIBe8k",
+"faHirD6rBy","lm0pDJkzUn","e6e4zZuDtD","ix74rXflUq","gIYvEQ6Lix","9eoRcFjHXR","XflUqwiHrZ","dpe1vk85Ae","lj07QQ6hMC","ReKEWokgRi",
+"580YDkZANm","ogLgc9rlg9","zz4ZUfmIK1","ZzJHWAkKTk","VLTy6DcpWB","Twano2ZHdk","hUTw7ThjNn","WDVWJIjTwP","EdBKc5Namm","JRJQBkB5nP",
+"S77LH24ARF","WreyPJIqXi","4QMc9FnPFB","TCgPpG1RhS","9XyT9iwzGk","sqVrf64s8N","jfREuBpYhV","55rfBMmsIo","uTacxQ6Lix","FcWrWQClRL",
+"14FLRuAWyp","8xEKzY1mC0","QWxoTiqv4k","BGaQYJIqXi","k85AeHP433","yofH31j5L8","OUYuFd85a9","UlU3M7X3uy","dpe1vuoStw","Qworua00b5",
+"uQIcznlaBy","lsQGoAOgEe","16lHcJkzUn","K20wKi7WMQ","zQt6QMGlTF","0YAGH9XyT9","nFqikAgJHQ","blLA9hE1Ql","bZLvSjiVBP","zmLYDxXTI4",
+"pFrrlGrDg7","qaofNzHF1q","Zv7z0AkKTk","StlDJZJTXH","pvgjSfaHir","8RCUAd7vjM","5Mg9rTXQ0Z","xReecNo0Qb","JJs5mYw2oU","CqqaDMaJQs",
+"GXdoHuN6r3","D6rByguMb8","ZzJHWzQt6Q","Y1mC09XyT9","GrDg7jiVBP","W7cTs07n1c","F6PT2oGu6x","bZLvS0Wr5y","tvdkDWPmlx","OxWIH7fsYM",
+"blLA9iKqhr","3weIFQssNC","cmXIXpT8wu","AgJHQQWxoT","6q6L92ZHdk","0h1b1guMb8","kB5nPcmXIX","16lHcDQimp","he9IALewvM","0KyfsKr8ys",
+"pWiOsCp3mZ","RmDcr9GXkX","07n1cGv3Fq","Dz1R3pT8wu","9y4lwHP433","uZPqgpmeCd","0KyfsGWqqX","SmGzvb29RJ","Ul4a145cIH","5VZjSjS1aj",
+"k85AerKDLJ","No0QbZJTXH","9y4lwdpe1v","dmoS7MmsIo","2Yz7Euvf7A","5Drn0ksJby","SbRYyMmsIo","WMiS3Qworu","I7p2aVBjhz","sqVrfBbwgA",
+"lj07QxReec","1LB1LRsQUq","hE1QlAIYUu","cL0aEYw2oU","GSQwjyofH3","okgRilH1kt","jS1ajGWqqX","5drc6J2mQi","DG4sTx3LDe","2Nslmo8Uyd",
+"MezSWrhl0J","n8pJ9SWfou","2hEEUYOfrY","lpF6WxXTI4","0Wr5yrhl0J","WDVWJ0MR5X","2DREstAOsr","kB5nPNxx9V","VjCZqs7Mxk","lCMxyCxVEf",
+"yofH3Dz1R3","J2mQirKDLJ","zHF1qxciqp","e6e4zWreyP","AIYUuTCgPp","soy9taDGtS","Vprf2K4GS8","s7MxkZhwG1","Waim6OHaBz","b29RJksJby",
+"fcJOyCp3mZ","fLNg8nlaBy","ni2v1OxWIH","ZuDtDkB5nP","aDGtSQWxoT","1v5hHuLtKs","aDGtSbZLvS","y94nwAkKTk","Vprf2JRJQB","7fKYUbgJAz",
+"UlU3MWaim6","vOqCEtl72W","v8yFNSWfou","rz7Ut2DREs","uTacxFLsph","CIShGVjCZq","zmLYDQworu","pmeCds93Ml","X6PiniKqhr","gjUTuTCgPp",
+"zHF1qzbIYY","euZA5gIYvE","Yf2EcY1mC0","VLTy6RBhp0","MK07YtlILt","Pb1pazQt6Q","lpF6WlH1kt","gdQsSZuDtD","iwzGkTa8f6","fLNg8MmsIo",
+"ydG8UK4GS8","FxX9qi7WMQ","t59lRTwano","J2mQicShY2","aDGtSEOE1o","rhl0JMojnP","aL6AJ8xEKz","XyPZN0BmCy","JXljWtvdkD","pvgjSUl4a1",
+"d85a9aFFss","Gv3FqD6rBy","VLTy6P6bcg","lsQGo618Di","PYBf4h1zcH","2Yz7Ei3pyd","2ZHdkrhl0J","lm0pDLbRTH","jSjS3tuDyS","7X3uyZ4I1v",
+"hE1QlnlaBy","ZUnqtQssNC","CNHmvOUqFM","HzZT8NcICA","uQIczazIWp","fFDrJRpBQm","uZPqgChuy3","WreyP48cHL","XflUqTXQ0Z","Ul4a116lHc",
+"HzZT8a00b5","ThjNnhSSvQ","n8pJ95VZjS","6AFT0ulk41","CqqaDPOUYS","LewvM9iGoT","LbRTHlH1kt","5drc6yvOMI","VBjhzuLtKs","iqv4kjzUqR",
+"DLhzMChuy3","KZamH24ARF","brhlQb29RJ","AkKTkv1Hln","7fsYMNOHsz","nFqikHlUbF","gf8rItAOsr","lXFOBRmDcr","2TRI7DcpWB","5iGN5Mm8si",
+"48cHLzHF1q","JJs5m14FLR","580YDiKqhr","FjHXRhi5X7","EOE1ouupzk","faHire6e4z","TCgPpt59lR","sqVrf0h1b1","WmadAKr8ys","QWxoTxciqp",
+"he9IAVLTy6","KZamHuZPqg","AXpwEdpe1v","7fsYMxciqp","IjTwPpT8wu","SWfouAgJHQ","hi5X7n8pJ9","pv0i7Waim6","MGlTFZzJHW","AIYUujzUqR",
+"sqVrf9XyT9","RpBQmMkgy8","DG4sTyToGW","MmKGJaez9y","lweGy55rfB","Waim6StlDJ","NcICAwiHrZ","YOfrY4dEz6","QYxC0GrDg7","sqVrfgIYvE",
+"uAWypZJTXH","lXFOBCdyBV","djsrvMK07Y","O3iyQjeskS","FxX9qxReec","CqqaDTa8f6","DcpWBsoy9t","xReecZv7z0","s93Ml14FLR","d85a9pWiOs",
+"m4bxUokgRi","P6bcgJXljW","Waim6TXQ0Z","gjUTuWaWsv","fcwDaRpBQm","FGzgpAXpwE","NcICAiB08l","MK07YStlDJ","F6PT2rz7Ut","QssNCYjB9t",
+"OxWIHZuDtD","iKqhrGWqqX","tjQxsW3VFH","QssNCYh1hF","pv0i7MmKGJ","zbIYYTwano","ZuDtDblLA9","lCMxyrKDLJ","fLNg8dhSuH","QClRLtAOsr",
+"TwanoogLgc","Dz1R3b29RJ","ZJTXHgIYvE","OUYuFKr8ys","DG4sTfqypy","F6PT2fcJOy","aDGtSYf2Ec","FVMxoZzJHW","Mm8sitjQxs","CIShGXyPZN",
+"8hJdtxXTI4","aez9y8cVD3","ksJbyDz1R3","618DiReKEW","qQxHPhi5X7","14FLReuZA5","zz4ZUMm8si","24ARFv2eC3","24ARFtvdkD","Pb1paydG8U",
+"y94nwWaim6","5Drn0n8pJ9","yToGWBCxeC","qaofNIn3NS","GXdoH5Namm","fFDrJsx5Gl","s7MxkGSQwj","fqypy5Drn0","qUJMdix74r","Ul4a1dpe1v",
+"HRxd8djsrv","lsQGoNOHsz","5Drn0ix74r","FVMxo5iGN5","d7vjMatef2","29QAzQYxC0","QworuNAFuw","Mkgy8jS1aj","7fKYUt59lR","Uvlv4K20wK",
+"brhlQrhl0J","okgRihYBCK","TwanoHzZT8","dpe1vNcICA","aDGtSy94nw","AkKTkKZamH","x3LDevOqCE","UmaEvUmaEv","ru4UG0ao3l","FhtglAkKTk",
+"zHF1qgtCA5","qQxHPYOfrY","JkzUnhUTw7","JKWYRMmKGJ","WPmlx1j5L8","WMiS3ZJTXH","ciuWz5ZaEz","OUYuFguMb8","8TxD75IhmG","Uvlv4t59lR",
+"s93Mln1pmO","WreyPHzZT8","AmdQds7Mxk","piJSkKZamH","nFqikVIlwP","n8pJ90PktI","0h1b1AIYUu","M3zXLpWiOs","Pb1paW3VFH","jfREuWPmlx",
+"AgJHQni2v1","FPfSEfaHir","Nxx9VsuY4x","n1pmOWaWsv","lpF6W7hyVv","FNYIM29QAz","AOgEevkCHH","he9IAdQ586","7fsYMhSSvQ","16lHcRxrsm",
+"pvgjSLewvM","7X3uyuvf7A","Ss0Zu7fKYU","W7cTss4786","n8pJ9tl72W","K20wK2Nslm","JkzUnn8pJ9","FGzgpEdBKc","O3iyQFjHXR","VerEAhi5X7",
+"oVQp6djsrv","WreyPMGlTF","ZhwG1pAhR1","XflUqoVQp6","yToGWL7cGc","Ul4a18xEKz","b29RJwiHrZ","pT8wuhE1Ql","uQIczxciqp","DLhzMFNYIM",
+"dpe1vgf8rI","zY1GYCfgr3","m4bxUZUnqt","ZzJHWFcWrW","oQ87rFNYIM","YOfrYFGzgp","nnP8oM3zXL","Yf2EcXyPZN","FjHXRpmeCd","9iGoTOUqFM",
+"ogLgcSbRYy","zmLYDlkMUA","BbwgAOUqFM","MojnPcL0aE","blLA9dmoS7","2NslmpvgjS","MGlTFVBjhz","cShY2BpYhV","45cIHjtn0X","PYBf4zHF1q",
+"uJScXnnP8o","FhtglNxx9V","zFgtBuN6r3","uoStwk85Ae","tAOsrP6bcg","XyPZNTwano","CdyBV4dEz6","tuDySFPfSE","lweGyZuDtD","dpe1vmX2GE",
+"LDk6fogLgc","dhSuHHlUbF","dpe1v55rfB","Waim60PktI","PYBf4OUqFM","8xEKzOxWIH","ydG8UL7cGc","YjB9toQ87r","cShY229QAz","uvf7AZuDtD",
+"aL6AJrKDLJ","uLtKsKASQ8","FNYIM5VZjS","fcJOyzFgtB","0h1b1Ta8f6","MaJQsmz8gx","24ARFXflUq","aDGtSZUnqt","uN6r3SjskQ","DLhzMdpe1v",
+"uLtKsuJScX","YjB9tXflUq","jSjS3Waim6","pv0i7rKDLJ","LewvMAIYUu","RpBQmChuy3","yEfy99rlg9","zqH0WGrDg7","Gv3FqpFrrl","jzUqRt98iW",
+"7lUXZkZANm","StlDJAIYUu","2TRI7RzaZA","16lHcPb1pa","RACujUl4a1","cQOnvVerEA","EdBKcfFDrJ","euZA5faHir","8U2nU9iGoT","EdBKczqH0W",
+"EdBKcHlUbF","CqqaDK4GS8","Gv3FquAWyp","07n1chUTw7","In3NSEdBKc","1j5L8MGlTF","LewvMgdQsS","uLtKsTa8f6","UmaEvyToGW","sqVrfIjTwP",
+"LbRTHQ6hMC","zY1GYrhl0J","OHaBzNxx9V","JIqXiVLTy6","Rxrsm0MR5X","m4bxUoGu6x","ciuWzv8yFN","FnPFBix74r","fcwDaLbRTH","GSQwjMkgy8",
+"W3VFHuupzk","Zv7z08hJdt","d85a98xEKz","FLsphJ2mQi","VNCPdQssNC","2ZHdkZv7z0","wDajXpFrrl","OUYuFulk41","fcJOyAXpwE","P6bcgtl72W",
+"xXTI4djsrv","0PktIJkzUn","Mm8si2Yz7E","d7vjMGWqqX","In3NSYh1hF","RsQUqfcJOy","HlUbF5IhmG","FwEJz45cIH","RsQUqGWqqX","I7p2aFnPFB",
+"QworubrhlQ","8hJdtNhXdu","JRJQBfLNg8","lkMUASmGzv","7fKYUZhwG1","Q6LixJJs5m","hi5X7zHF1q","Yh1hFsqVrf","YOfrYlViBv","Mm8si5Namm",
+"HfyNQQ6Lix","t98iW55rfB","RBhp0580YD","pWiOsxXTI4","lViBvs93Ml","TwanoFVMxo","AgJHQt98iW","JIqXiSWfou","azIWpUvlv4","gIYvEk85Ae",
+"BCxeCjiVBP","GSQwj5ZaEz","DLhzMdjsrv","jfREuPb1pa","yofH3uvf7A","ThjNnCfgr3","IKxdL2ZHdk","pT8wufLNg8","JJs5mAIYUu","QYxC0AOgEe",
+"GWqqX8hJdt","9iGoTfcJOy","cL0aE580YD","he9IAyluBx","IjTwPS2Dfu","5VZjSydG8U","nlaByCxVEf","aL6AJ9y4lw","5ZaEz0h1b1","BGaQYWmadA",
+"5Drn0MGlTF","MaJQsNOHsz","Mm8si0BmCy","v8yFNRBhp0","mz8gxVIlwP","gtCA5UlU3M","rKDLJqQxHP","0h1b1ZzJHW","oQ87rHfyNQ","Q6LixOUYuF",
+"Gv3Fq8TxD7","fmIK1CNHmv","k85AeMm8si","iKqhrfFDrJ","YjB9tPYBf4","1v5hHThjNn","pmeCd2Nslm","mX2GEix74r","MezSW5nmWv","6q6L9azIWp",
+"v1HlnoGu6x","FjHXR6q6L9","RmDcrJRJQB","14FLR7Ow5C","DcpWBMmKGJ","lj07Q2ZHdk","fqypyK20wK","KASQ8BFkb8","oQ87r14FLR","5Drn0POUYS",
+"a00b5d85a9","L7cGcd7vjM","v2eC3aDGtS","v1HlnCfgr3","BFkb8RACuj","dQ586cmXIX","0h1b1MezSW","P6bcg6q6L9","Dz1R3iKqhr","qUJMd7lUXZ",
+"7fKYUVjCZq","8RCUA9GXkX","WPmlxB3qem","WPmlxPOUYS","XflUqfLNg8","e6e4zCK5W7","XyPZNFNYIM","G1RhSSbRYy","2ZHdkv1Hln","Gv3FqdmoS7",
+"I7p2a0YAGH","AmdQdWaWsv","8TxD7lm0pD","pmeCdogLgc","FjHXRU3yw5","Mkgy8MezSW","tvdkD7ku1p","C2Ircd85a9","x3LDe8cVD3","StlDJazIWp",
+"4QMc98hJdt","lweGypAhR1","XyPZNZJTXH","JXljWhYBCK","yToGWOUYuF","fFDrJW7cTs","aez9yiwzGk","zqH0WL7cGc","RBhp014FLR","jtn0XzQt6Q",
+"vkCHH7hyVv","gjUTuv8yFN","TXQ0Z9iGoT","HRxd8ZJTXH","atef2v1Hln","AXpwE64s8N","W3VFHF6PT2","jzUqRJXljW","ni2v1POUYS","fcwDaWMiS3",
+"4QMc9VjCZq","tjQxsnlaBy","nnP8ohE1Ql","lH1ktvLsmS","s7MxklweGy","O3iyQ64s8N","Vprf229QAz","ZuDtDtlILt","U3yw5aez9y","GrDg7CxVEf",
+"FGzgp6q6L9","4W0TllkMUA","Mkgy8SmGzv","CIShGDG4sT","9GXkXNxx9V","ReKEWKASQ8","WDVWJGSQwj","suY4xCxVEf","QbxXcjeskS","Y1mC0pv0i7",
+"rz7UttjQxs","RzaZAFLsph","uvf7AFcWrW","cQOnvYOfrY","yluBxNOHsz","EdBKcdpe1v","NcICA16lHc","xXTI4Fhtgl","okgRiksJby","jzUqRkZANm",
+"iB08lHRxd8","fFDrJFnPFB","dmoS7t59lR","Mkgy8pmeCd","WPmlxfFDrJ","HzZT8k85Ae","WDVWJfaHir","pmeCdCIShG","FcWrWsqVrf","7lUXZYw2oU",
+"StlDJjeskS","ZhwG1Pb1pa","RsQUqIjTwP","o8UydjiVBP","7X3uyJJs5m","pmeCd4dEz6","sqVrfDG4sT","GXdoHVIlwP","nFqikFGzgp","dpe1vl83Ud",
+"S2Dfu07n1c","NcICArhl0J","pv0i7Cfgr3","Oz8yZyvOMI","Ul4a1P6bcg","DcpWBSWfou","aL6AJ4QMc9","HlUbFlweGy","StlDJ2hEEU","Yw2oUsqVrf",
+"cmXIXAgJHQ","IKxdLb29RJ","wiHrZhE1Ql","8RCUARzaZA","lCMxySjskQ","uQIczAIYUu","5Mg9ruZPqg","Ta8f6SjskQ","SmGzvni2v1","2hEEUYh1hF",
+"KsjRK64s8N","blLA9uAWyp","BGaQYlH1kt","ni2v1fLNg8","3weIFsx5Gl","tvdkDBCxeC","W7cTs3otm6","RmDcrvLsmS","vkCHHDz1R3","ZUnqte6e4z",
+"AmdQdVLTy6","MmsIoBCxeC","s7MxkgtCA5","5Mg9rB3qem","JKWYRuZPqg","9XyT9lkMUA","Dz1R3lkMUA","CxVEf4QMc9","e6e4z64s8N","W7cTs7Ow5C",
+"Z4I1v3otm6","AOgEe5Drn0","MmsIoUlU3M","9rlg9v8yFN","iB08l4W0Tl","8TxD79eoRc","Ul4a1Yh1hF","SmGzv2Yz7E","BbwgACp3mZ","gtCA5lViBv",
+"2Yz7Erz7Ut","F6PT22DREs","ZuDtDAmdQd","IBe8kHP433","5Mg9rL7cGc","WDVWJNo0Qb","tjQxsOxWIH","3otm6SmGzv","GrDg7lweGy","AmdQdqUJMd",
+"U3yw5BGaQY","JRJQBatef2","Ul4a1M6qcG","ksJbyK20wK","b29RJAkKTk","9GXkXSWfou","0PktI9eoRc","45cIHUmaEv","Mkgy8oGu6x","Q6hMCS77LH",
+"7hyVvJXljW","pAhR1CdyBV","Pb1paGv3Fq","JXljWpmeCd","Ta8f6zY1GY","guMb8F6PT2","GWqqXa00b5","F6PT2rhl0J","QChxsO3iyQ","bZLvSCNHmv",
+"uN6r3wiHrZ","I7p2aogLgc","suY4xW7cTs","lj07QMezSW","Vprf2lm0pD","n8pJ9gf8rI","Pb1pa4W0Tl","lj07QyToGW","ThjNn48cHL","BpYhV7X3uy",
+"pmeCd16lHc","Vprf2BbwgA","fcwDaOz8yZ","W7cTsHfyNQ","v2eC3djsrv","vkCHHuvf7A","8cVD3MK07Y","ZuDtDPb1pa","JIqXit98iW","cShY2LbRTH",
+"iKqhr618Di","zz4ZUjfREu","LDk6fHzZT8","zz4ZUKr8ys","B3qemCNHmv","ECMvURACuj","dhSuHZuDtD","oVQp6EOE1o","DG4sTHfyNQ","7hyVvQnJ1S",
+"JJs5m0Kyfs","MK07YP6bcg","2TRI79y4lw","pWiOspAhR1","zY1GYuN6r3","nFqikh1zcH","vkCHH5Mg9r","MojnPReKEW","zHF1qW7cTs","nnP8ocmXIX",
+"taOXKfFDrJ","I7p2aDQimp","YOfrYfcwDa","fLNg8pv0i7","k85AeAgJHQ","CK5W7m4bxU","OHaBzlweGy","jSjS3IRh48","fcwDaIjTwP","Zv7z0RACuj",
+"v8yFNulk41","7Ow5CzmLYD","CK5W7uAWyp","x3LDeTwano","zbIYY7X3uy","Cp3mZZzJHW","7ku1pSWfou","cQOnvCp3mZ","Ul4a1BCxeC","kZANmQClRL",
+"7fsYMTXQ0Z","hE1QlgdQsS","0YAGHzbIYY","MojnPlpF6W","U3yw5Twano","JXljWhi5X7","MmKGJZUnqt","WDVWJY1mC0","uPX7GgdQsS","JXljWYjB9t",
+"MK07YbgJAz","8U2nUGXdoH","GXdoHWaWsv","WaWsvbZLvS","UmaEvb29RJ","lViBvzbIYY","t98iWSjskQ","Yf2EcRxrsm","VerEAXyPZN","jtn0XlCMxy",
+"S77LHfaHir","prNT6FVMxo","jzUqR7fsYM","pAhR1KASQ8","zHF1qRACuj","X6PinFGzgp","8xEKzFjHXR","5iGN50Wr5y","fLNg8uupzk","VNCPdnlaBy",
+"iKqhrSbRYy","brhlQYjB9t","sx5GlSmGzv","GrDg7wDajX","1LB1L5Namm","iKqhr7fKYU","ZuDtDb29RJ","kZANmDcpWB","gtCA5jeskS","cmXIXtl72W",
+"Waim6MojnP","ZJTXHblLA9","qUJMdBGaQY","WMiS35iGN5","l83UdTa8f6","5Drn0yvOMI","pT8wu2hEEU","BpYhVFNYIM","Pb1paCdyBV","LbRTHLDk6f",
+"kZANmAOgEe","uJScXokgRi","AIYUuhi5X7","x3LDeNcICA","tlILtix74r","SmGzvuvf7A","RxrsmGWqqX","W7cTsJIqXi","Ta8f6vOqCE","vOqCETwano",
+"RmDcrVBjhz","FwEJzOHaBz","DG4sT3weIF","GXdoHjtn0X","qUJMdpiJSk","YjB9tKr8ys","piJSkfqypy","lsQGo16lHc","jeskS29QAz","ZJTXHlH1kt",
+"EOE1onlaBy","ulk41tlILt","SjskQazIWp","BGaQYaL6AJ","xXTI4h1zcH","tAOsrI7p2a","bZLvS2Nslm","Y1mC0Dz1R3","QWxoTtlILt","64s8NSbRYy",
+"07n1cVjCZq","8cVD39y4lw","MezSWuTacx","D6rBylweGy","POUYSP6bcg","ix74rCNHmv","zFgtBHRxd8","jtn0X8TxD7","OxWIH8FmFH","9eoRcBbwgA",
+"jtn0XS77LH","lj07QguMb8","DQimpDQimp","jzUqRQWxoT","Gv3FqfFDrJ","ulk412Nslm","8RCUAMojnP","TwanoYw2oU","lXFOBMmsIo","HP433ThjNn",
+"Twano14FLR","JXljWOUYuF","OxWIH4W0Tl","F6PT2uLtKs","9iGoT0h1b1","fmIK18TxD7","U3yw59GXkX","W7cTstl72W","ogLgcksJby","VIlwP580YD",
+"GXdoHChuy3","LDk6fK20wK","WPmlx2Yz7E","i7WMQOHaBz","EdBKcI7p2a","blLA9FwEJz","DcpWBtl72W","AOgEeyToGW","F6PT2OUqFM","zbIYYlXFOB",
+"jS1ajv8yFN","y94nwQChxs","faHir7Ow5C","5nmWvOUYuF","ni2v1BCxeC","aFFssaFFss","QbxXcdpe1v","yofH3LbRTH","uN6r3W7cTs","aez9ytAOsr",
+"MezSWkZANm","nlaByfmIK1","Vprf2L7cGc","n1pmOXflUq","0ao3lNhXdu","GWqqXvLsmS","m4bxUjtn0X","hi5X7iKqhr","48cHLatef2","lpF6WLDk6f",
+"Oz8yZzFgtB","16lHc64s8N","wDajXzbIYY","9rlg9HlUbF","FcWrWzbIYY","FcWrW618Di","Q6LixP6bcg","tl72WxReec","ciuWzFPfSE","AOgEeksJby",
+"iwzGkfLNg8","ciuWzpv0i7","AgJHQ9iGoT","SmGzv8TxD7","Q6LixdmoS7","prNT6uPX7G","In3NS5drc6","YOfrYHP433","CK5W7v8yFN","Uvlv46q6L9",
+"FPfSEbZLvS","QssNCjiVBP","rz7UtfFDrJ","v1HlnBFkb8","bgJAzd85a9","FjHXRM6qcG","Yf2EcaL6AJ","Ta8f6Ul4a1","MaJQszz4ZU","lCMxy7ku1p",
+"580YDKsjRK","ciuWzUlU3M","HRxd8AmdQd","uoStwNhXdu","580YDuQIcz","jfREusuY4x","KASQ8CdyBV","aDGtSIRh48","2hEEUS77LH","5drc6Yw2oU",
+"EdBKcxciqp","zbIYY0BmCy","C2Irche9IA","azIWpfmIK1","suY4xbrhlQ","EOE1oW7cTs","6AFT0lm0pD","cQOnvGSQwj","Kr8ysEdBKc","JRJQBCdyBV",
+"blLA9jSjS3","8FmFHX6Pin","618DiFGzgp","OUqFMFGzgp","HlUbFuvf7A","B3qemjSjS3","gtCA5s4786","jSjS3WDVWJ","n8pJ9euZA5","FjHXRlpF6W",
+"Rxrsmjtn0X","MaJQsFFDui","Dz1R3zY1GY","OHaBz7Ow5C","zz4ZUJ2mQi","YOfrYJ2mQi","1LB1Llj07Q","2hEEUjS1aj","8FmFHMaJQs","O3iyQ5ZaEz",
+"J2mQikB5nP","O3iyQYh1hF","n8pJ9ni2v1","WDVWJ9GXkX","45cIHIBe8k","dQ586EoToP","tjQxs14FLR","TCgPpQYxC0","VIlwPUmaEv","UlU3M8RCUA",
+"Dz1R3cQOnv","aFFssSWfou","wDajX64s8N","euZA5ZhwG1","VIlwP0YAGH","aL6AJHzZT8","BGaQY7X3uy","zbIYYM3zXL","D6rBylCMxy","0KyfsYh1hF",
+"OUYuFLDk6f","gjUTu7hyVv","PYBf4FxX9q","0Kyfs5Mg9r","Yh1hFHzZT8","IRh48Z4I1v","wDajX4QMc9","Mm8siIjTwP","MmKGJMaJQs","aez9yF6PT2",
+"zmLYDRmDcr","jS1ajQ6hMC","BCxeCgf8rI","Ta8f6yToGW","rz7Utn8pJ9","kZANmpT8wu","M6qcGQssNC","QnJ1SQClRL","CqqaDvLsmS","fmIK1MGlTF",
+"D6rByReKEW","bZLvS3otm6","uZPqgIjTwP","VLTy6Ta8f6","9eoRcPOUYS","DcpWBZuDtD","VNCPddpe1v","KsjRKhe9IA","wiHrZFjHXR","W7cTs5Mg9r",
+"GXdoH2TRI7","tlILtFjHXR","uQIczAmdQd","CNHmvdhSuH","IKxdL9iGoT","Uvlv4F6PT2","55rfBWreyP","o8UydK4GS8","RkQke5Mg9r","gtCA5y94nw",
+"8cVD3Gv3Fq","Kr8yspT8wu","jfREuhYBCK","iwzGkuAWyp","6q6L9atef2","HRxd8SbRYy","yofH3CdyBV","Qworu9rlg9","s47869y4lw","FVMxoi7WMQ",
+"QClRLs93Ml","ReKEWRpBQm","VLTy6fmIK1","hE1QlpiJSk","7fsYMZv7z0","0YAGHfLNg8","Y1mC0QChxs","RpBQmEoToP","IBe8k5Namm","UlU3M1v5hH",
+"UmaEvyluBx","RkQke2hEEU","JKWYR9rlg9","d85a9LewvM","tlILtC2Irc","QClRL3otm6","GSQwj5iGN5","e6e4zChuy3","8hJdtCp3mZ","Cp3mZNxx9V",
+"AgJHQ8TxD7","Mkgy8fLNg8","StlDJGv3Fq","Kr8yst98iW","8xEKz5IhmG","QYxC0hE1Ql","zFgtBVprf2","gIYvEeuZA5","taOXKMkgy8","GSQwjD6rBy",
+"Mm8siC2Irc","zqH0W48cHL","Q6LixzHF1q","i3pyds93Ml","Vprf25nmWv","aL6AJ7lUXZ","pvgjSvkCHH","WmadAZUnqt","Ul4a1azIWp","GSQwjGrDg7",
+"e6e4zuQIcz","EdBKce6e4z","580YD1v5hH","yToGW7lUXZ","WmadAzQt6Q","45cIHnFqik","DLhzMv1Hln","JKWYRL7cGc","rz7UtdQ586","YjB9tuoStw",
+"Gv3Fq5VZjS","7hyVvuLtKs","5Mg9rmX2GE","taOXKQnJ1S","blLA95Mg9r","JXljWDLhzM","wiHrZmz8gx","M3zXLzHF1q","GWqqXB3qem","45cIHXflUq",
+"CdyBVRpBQm","IRh48B3qem","2hEEUhSSvQ","HzZT80Wr5y","pmeCdHlUbF","lm0pDtuDyS","lCMxyMK07Y","O3iyQyofH3","aFFssv8yFN","vLsmScQOnv",
+"sqVrfl83Ud","Nxx9VNxx9V","mz8gxcmXIX","ZhwG15Mg9r","OUYuF48cHL","lViBvZzJHW","I7p2aNo0Qb","S77LHv2eC3","Z4I1vTCgPp","2NslmIRh48",
+"Chuy30MR5X","16lHceuZA5","uZPqg7X3uy","Nxx9VUl4a1","ogLgcI7p2a","9rlg99eoRc","bZLvSjfREu","rKDLJyEfy9","hYBCKCIShG","ZhwG1SWfou",
+"QChxsNhXdu","WaWsvNhXdu","AkKTklsQGo","ZJTXHuTacx","gjUTuO3iyQ","SmGzvECMvU","2TRI7AgJHQ","cL0aEfqypy","yvOMIhYBCK","FGzgpxciqp",
+"Mkgy8CK5W7","ZuDtDJkzUn","ydG8Ut98iW","JRJQBOz8yZ","uTacxcQOnv","16lHc4W0Tl","U3yw50PktI","3weIFKASQ8","pFrrlKsjRK","2DREsSbRYy",
+"1LB1L5Drn0","4W0TlJkzUn","uQIcz0h1b1","xciqpD6rBy","tAOsrFwEJz","6AFT0IBe8k","K20wKNo0Qb","dhSuHrKDLJ","uLtKs9XyT9","lH1ktpFrrl",
+"NhXduStlDJ","OxWIH7fKYU","EdBKcv1Hln","lH1ktVerEA","GSQwj5VZjS","4dEz6d85a9","5Drn0aez9y","KsjRKPOUYS","zY1GYNo0Qb","BbwgAtAOsr",
+"hi5X7guMb8","euZA5m4bxU","LDk6f29QAz","JXljWjzUqR","2Yz7EnlaBy","ksJby7X3uy","n8pJ9RsQUq","lkMUAblLA9","NhXduoQ87r","7fKYUNhXdu",
+"lj07QM3zXL","Kr8ysD6rBy","RmDcrKASQ8","K20wKOHaBz","O3iyQFLsph","DLhzMlm0pD","7ku1pDz1R3","Fhtgl618Di","9y4lwKZamH","azIWpn1pmO",
+"Q6LixM3zXL","yEfy93weIF","soy9tS77LH","ru4UGpiJSk","45cIHEoToP","mX2GEQworu","hUTw75Mg9r","FLsphwiHrZ","S2DfuyEfy9","6AFT0KZamH",
+"NAFuw0Kyfs","blLA9ogLgc","m4bxUfFDrJ","y94nwIRh48","ThjNnZJTXH","soy9t5IhmG","JXljWfFDrJ","EOE1oYw2oU","QbxXcoGu6x","yToGW9iGoT",
+"BFkb8fLNg8","jzUqRECMvU","8xEKzNxx9V","jzUqRoGu6x","618DiCK5W7","1LB1LNOHsz","8RCUAL7cGc","tAOsrY1mC0","1v5hHOUYuF","IBe8kCp3mZ",
+"nlaByfqypy","7fKYU9eoRc","B3qemL7cGc","QWxoTDQimp","CIShGZUnqt","jtn0XpAhR1","Q6LixKASQ8","AmdQdgf8rI","618Div2eC3","45cIH3weIF",
+"qaofNHRxd8","b29RJlH1kt","BbwgAZzJHW","9XyT9CdyBV","vkCHHY1mC0","uoStw2ZHdk","L7cGcJIqXi","iB08l0Kyfs","Q6hMCJIqXi","CIShGzFgtB",
+"Rxrsmuupzk","2NslmuLtKs","x3LDeBbwgA","lpF6WRBhp0","JkzUnHzZT8","AkKTkkB5nP","oQ87rqUJMd","brhlQRkQke","FwEJz8U2nU","FPfSEuupzk",
+"QnJ1SSWfou","yEfy9S2Dfu","sx5GlEdBKc","GXdoHiqv4k","8RCUA8TxD7","ECMvUDLhzM","5Mg9r29QAz","gIYvEAXpwE","0h1b1DG4sT","uoStwFwEJz",
+"oVQp6n1pmO","VBjhzSWfou","SWfouW3VFH","DG4sTS2Dfu","mz8gxni2v1","UmaEv8xEKz","ru4UGbrhlQ","taOXKCqqaD","ECMvUAgJHQ","RkQkehYBCK",
+"8FmFHNAFuw","y94nwm4bxU","uTacxPOUYS","GSQwjdjsrv","MojnPsuY4x","v1HlnqUJMd","HlUbFK20wK","Q6hMCTa8f6","gf8rIWmadA","sqVrfL7cGc",
+"EdBKckZANm","PYBf4oGu6x","zz4ZUVerEA","FNYIMlpF6W","e6e4zAXpwE","d7vjMzY1GY","n8pJ9yEfy9","ix74re6e4z","Cp3mZ9y4lw","D6rByZv7z0",
+"s93MlZJTXH","qUJMdlViBv","gIYvESjskQ","oQ87rRzaZA","LbRTHPb1pa","QChxsmz8gx","uAWypKZamH","Ul4a1jSjS3","lsQGo4QMc9","HzZT8Cfgr3",
+"FnPFB3weIF","v1HlnMmKGJ","In3NS9XyT9","HfyNQX6Pin","kB5nP2DREs","Nxx9VydG8U","dmoS7lj07Q","0PktId7vjM","NOHszSs0Zu","dmoS74W0Tl",
+"BGaQY0h1b1","WPmlxxciqp","lj07QzFgtB","64s8NJ2mQi","0ao3lFVMxo","Z4I1vYf2Ec","FGzgpjfREu","Mm8siZzJHW","wiHrZ8U2nU","Nxx9VZzJHW",
+"FxX9qlweGy","FxX9qpWiOs","UlU3MMojnP","ZzJHW580YD","t98iWAkKTk","ogLgckB5nP","l83UdWmadA","d7vjMKZamH","HzZT8Waim6","W3VFHUl4a1",
+"YjB9tRACuj","Z4I1vAmdQd","48cHL64s8N","CdyBV7Ow5C","uoStwMmKGJ","tAOsrydG8U","cL0aE9y4lw","TCgPpIRh48","ThjNnjS1aj","QYxC05Drn0",
+"rhl0Jzz4ZU","ZzJHWnlaBy","Uvlv4zFgtB","AXpwEQYxC0","Ul4a1aez9y","iqv4k0Wr5y","hSSvQSmGzv","d7vjM2TRI7","4QMc9dpe1v","QYxC0kB5nP",
+"EOE1o8hJdt","JIqXiuupzk","zQt6QqUJMd","euZA5zz4ZU","UmaEvSWfou","QWxoTksJby","xXTI4d7vjM","bgJAzru4UG","S2Dfus7Mxk","F6PT2TCgPp",
+"L7cGcgdQsS","5VZjSPOUYS","Waim6aez9y","e6e4z0Wr5y","gIYvEReKEW","ZUnqtrhl0J","s4786IBe8k","uN6r35Drn0","RkQke1j5L8","lH1ktAOgEe",
+"ECMvUuoStw","uoStwFhtgl","VLTy6Pb1pa","fcJOyReKEW","BbwgAQChxs","0ao3lzqH0W","QworuQ6Lix","b29RJThjNn","Yw2oUQClRL","AIYUuMm8si",
+"MojnPWPmlx","nnP8o0ao3l","uPX7GMaJQs","5nmWvxXTI4","oQ87r7lUXZ","Y1mC0uN6r3","oQ87rDcpWB","ThjNns7Mxk","P6bcgXyPZN","aDGtSQbxXc",
+"OHaBzQYxC0","TCgPpfcJOy","Mm8siv1Hln","uAWypzqH0W","7fKYUlm0pD","M3zXLtjQxs","CNHmvsoy9t","zY1GYRpBQm","XflUqulk41","lm0pDFFDui",
+"fmIK1JIqXi","QYxC0ksJby","6q6L9uLtKs","lsQGo1v5hH","yvOMIyluBx","NhXdu8cVD3","ni2v1lweGy","P6bcg0Kyfs","8FmFHGWqqX","tlILtFVMxo",
+"dQ5866AFT0","zHF1qtjQxs","bZLvSAmdQd","ni2v1pAhR1","5nmWvAmdQd","qQxHPcShY2","1j5L8FFDui","RkQketlILt","EdBKc2hEEU","zz4ZUpiJSk",
+"lkMUAFPfSE","5nmWvQnJ1S","CdyBVJRJQB","VNCPdiqv4k","gIYvEbZLvS","vLsmSO3iyQ","0KyfsQWxoT","RACujMm8si","pmeCdZJTXH","b29RJ2ZHdk",
+"14FLR7fKYU","B3qemJJs5m","e6e4zYf2Ec","2hEEUs93Ml","oQ87rRmDcr","e6e4z6q6L9","iB08lvOqCE","azIWpl83Ud","aDGtSAOgEe","Yf2Eci3pyd",
+"6AFT0yvOMI","ksJbys4786","ZuDtD9iGoT","16lHc5Mg9r","CK5W7iKqhr","zY1GYuTacx","3weIF64s8N","KsjRKuN6r3","lj07QMK07Y","fLNg8n8pJ9",
+"gf8rItjQxs","1v5hHZv7z0","CNHmvZuDtD","CIShGyvOMI","SjskQtjQxs","64s8NRmDcr","S2DfuJXljW","lkMUAZuDtD","qQxHPni2v1","y94nwQ6Lix",
+"Yh1hFlm0pD","k85Aes93Ml","jeskS2TRI7","i7WMQFwEJz","CqqaD7ku1p","EOE1o4W0Tl","VLTy6ReKEW","n8pJ9QWxoT","uLtKsOz8yZ","9rlg95Drn0",
+"Nxx9VS77LH","piJSkSWfou","CNHmvRzaZA","X6Pin580YD","IBe8k7X3uy","AmdQdQworu","MmsIo2Nslm","FhtglPOUYS","mz8gxWmadA","xciqp9iGoT",
+"xXTI4tlILt","l83UdnFqik","kB5nPxciqp","kB5nPgtCA5","faHiri7WMQ","ZzJHWuJScX","i3pydLbRTH","QssNC4dEz6","AgJHQG1RhS","MmKGJtlILt",
+"9eoRcWaim6","aFFssRmDcr","hSSvQ64s8N","5VZjSQssNC","LewvM4W0Tl","iKqhr3weIF","HzZT8zqH0W","5Drn0lkMUA","ThjNnUvlv4","4QMc92DREs",
+"uoStwuQIcz","FGzgpgIYvE","JXljWzY1GY","DG4sTQChxs","S2DfuMK07Y","QbxXcKr8ys","l83UdPOUYS","lweGy2hEEU","DQimpt98iW","NOHszFxX9q",
+"9y4lwFhtgl","POUYSiB08l","ksJbyyEfy9","7lUXZlViBv","Ul4a1k85Ae","dpe1vqQxHP","Oz8yZMm8si","S77LH0Kyfs","CNHmvtaOXK","MK07YFGzgp",
+"ZUnqtFjHXR","618DixXTI4","TXQ0Z5Drn0","1LB1LvOqCE","jzUqRVprf2","Pb1paOUqFM","K4GS8wiHrZ","G1RhSFLsph","mz8gx4QMc9","UlU3MokgRi",
+"7fKYUBpYhV","lViBv0h1b1","AIYUuW3VFH","5ZaEzblLA9","NhXduWreyP","tuDyS24ARF","JRJQBDG4sT","zFgtBzHF1q","NAFuwjS1aj","64s8Naez9y",
+"WMiS3xReec","taOXKFwEJz","yToGWFhtgl","0YAGH9GXkX","lpF6W2TRI7","OxWIHThjNn","QnJ1STXQ0Z","EdBKcFhtgl","zY1GYn8pJ9","0ao3lLewvM",
+"fqypyGSQwj","pAhR1dmoS7","sx5Gl5IhmG","HfyNQEoToP","jiVBPEoToP","K20wKIBe8k","M3zXLX6Pin","OHaBzK4GS8","14FLRJ2mQi","lXFOB9rlg9",
+"MGlTFvOqCE","suY4xzmLYD","0Wr5yiqv4k","d7vjMO3iyQ","LDk6fQnJ1S","b29RJEdBKc","GWqqXcL0aE","guMb8euZA5","prNT6yvOMI","wDajXWaWsv",
+"F6PT22ZHdk","bZLvSNcICA","xXTI4QWxoT","8TxD7cShY2","n8pJ9S77LH","vOqCEpFrrl","hE1QlQnJ1S","0YAGHVjCZq","SjskQHP433","uQIczCqqaD",
+"o8UyduPX7G","hE1QlTCgPp","VNCPd6q6L9","yluBxo8Uyd","v2eC3jeskS","MmsIocmXIX","ZzJHWs4786","5Drn0JKWYR","KASQ8pWiOs","Zv7z0L7cGc",
+"xXTI4YOfrY","LbRTHVjCZq","RpBQmO3iyQ","AkKTkni2v1","FNYIMYjB9t","6AFT0VjCZq","k85AeRkQke","gtCA59XyT9","ulk411LB1L","vkCHHFwEJz",
+"In3NSlXFOB","Z4I1vSmGzv","24ARFzqH0W","RpBQmQChxs","Y1mC0fcwDa","S2DfuvLsmS","EoToPFhtgl","YOfrY5nmWv","StlDJDG4sT","580YD4QMc9",
+"uvf7ASbRYy","xReecvOqCE","OxWIHOUYuF","uTacxatef2","ogLgctlILt","vkCHHWMiS3","29QAzv8yFN","VNCPd8xEKz","FFDuiJJs5m","h1zcHO3iyQ",
+"SjskQ5IhmG","AXpwE7Ow5C","iwzGkm4bxU","OUqFMZUnqt","nlaByHlUbF","Waim6oGu6x","JXljWyEfy9","mz8gxtuDyS","M3zXLEOE1o","taOXKAmdQd",
+"3weIFkB5nP","QWxoTRzaZA","zHF1qQYxC0","h1zcHaL6AJ","zmLYDtlILt","2NslmsqVrf","he9IAMaJQs","Fhtgl5iGN5","bZLvSK4GS8","GWqqX2Yz7E",
+"sx5Glpv0i7","oVQp6mX2GE","d7vjMgjUTu","7X3uyjSjS3","ThjNnn8pJ9","StlDJFPfSE","HP433RpBQm","iKqhrnlaBy","xReec7ku1p","tvdkDoQ87r",
+"55rfBlCMxy","D6rByHzZT8","e6e4zCfgr3","jS1ajS77LH","NhXduM6qcG","zbIYYvkCHH","m4bxUGWqqX","5nmWvpWiOs","OUqFMv8yFN","s4786Kr8ys",
+"cShY2FNYIM","QworuQworu","MaJQshUTw7","CqqaDEOE1o","prNT6MmsIo","O3iyQblLA9","2hEEUb29RJ","HfyNQnnP8o","FGzgpdjsrv","SmGzvpWiOs",
+"jtn0XYh1hF","iB08lMm8si","QClRLAgJHQ","7Ow5CL7cGc","l83UdpvgjS","WDVWJ2Yz7E","HzZT8dhSuH","tjQxsDcpWB","pv0i7lsQGo","yToGWHRxd8",
+"n8pJ9Rxrsm","YOfrYD6rBy","cQOnvWreyP","8FmFH5iGN5","LDk6fQChxs","l83UdReKEW","Mm8siEdBKc","JkzUnFhtgl","2Yz7ERBhp0","WaWsvlkMUA",
+"QbxXcguMb8","6AFT08xEKz","TXQ0ZLbRTH","8cVD3Fhtgl","bgJAz24ARF","JIqXiQClRL","WPmlxjeskS","S2DfusqVrf","Ta8f6RsQUq","t98iWuJScX",
+"KASQ8jtn0X","FxX9qe6e4z","FLsphs93Ml","zmLYDpvgjS","ECMvUjiVBP","d85a97lUXZ","FGzgpDQimp","FxX9qprNT6","dpe1vVBjhz","yEfy9brhlQ",
+"7fsYMQWxoT","Q6hMC0MR5X","FNYIMXflUq","ydG8UQChxs","uN6r3AXpwE","atef2i3pyd","QYxC0TXQ0Z","yToGWyluBx","RACujnlaBy","5nmWv9iGoT",
+"xReeca00b5","FnPFBUmaEv","RmDcrZUnqt","GWqqXMGlTF","8xEKzNhXdu","W7cTsgjUTu","hUTw74W0Tl","F6PT2djsrv","2ZHdkulk41","lViBvY1mC0",
+"pAhR1DG4sT","pAhR1DcpWB","8cVD3dmoS7","8hJdtvLsmS","3weIFiKqhr","l83Udrz7Ut","Cp3mZSs0Zu","HzZT8jS1aj","SWfouNOHsz","XyPZNYf2Ec",
+"MmKGJjzUqR","0Wr5ye6e4z","mX2GERsQUq","yToGWO3iyQ","2ZHdkGrDg7","RsQUqIBe8k","dhSuHtuDyS","BGaQYpiJSk","pvgjSzbIYY","suY4xEOE1o",
+"WPmlxatef2","kZANmpFrrl","64s8NMkgy8","l83UdL7cGc","Ul4a1bZLvS","mX2GEmz8gx","zz4ZUuoStw","U3yw5DG4sT","dmoS70Wr5y","RpBQmmX2GE",
+"tuDySdhSuH","dQ586RkQke","s7MxkJXljW","azIWpFjHXR","ZzJHW0Kyfs","cmXIX3otm6","Cfgr3LbRTH","5nmWvLbRTH","5nmWvzqH0W","pAhR1dQ586",
+"uJScXMkgy8","gf8rIW7cTs","suY4xfLNg8","GSQwjW3VFH","aDGtSGrDg7","9iGoThUTw7","OUYuFsuY4x","OHaBz7fsYM","JXljWIjTwP","piJSkokgRi",
+"pvgjS5Drn0","RzaZApvgjS","blLA9s7Mxk","2TRI7fLNg8","JIqXiZhwG1","gf8rITCgPp","DG4sTXflUq","QworuYjB9t","dQ5864QMc9","ReKEWpvgjS",
+"fmIK1Oz8yZ","Cfgr3lCMxy","TXQ0ZMmKGJ","IKxdLZuDtD","gdQsSOUqFM","3weIFrKDLJ","C2IrcS77LH","8TxD7d85a9","FVMxo5IhmG","IRh48azIWp",
+"wiHrZSs0Zu","7fKYUd7vjM","fcJOyCNHmv","tAOsrK20wK","BpYhVpvgjS","x3LDeo8Uyd","3weIFDLhzM","5Drn0tjQxs","Q6hMC48cHL","AmdQdM3zXL",
+"BpYhV3weIF","Oz8yZNOHsz","taOXKlkMUA","NcICApWiOs","S2Dfun1pmO","MK07Y5iGN5","uPX7GAkKTk","8U2nUk85Ae","SWfoulH1kt","ix74rfFDrJ",
+"tl72W1LB1L","JIqXiOHaBz","pvgjSyluBx","4W0TlWmadA","aDGtSO3iyQ","lXFOBn8pJ9","FcWrWFwEJz","jeskSazIWp","ru4UGD6rBy","jS1ajKASQ8",
+"sx5GlDLhzM","ZhwG1S2Dfu","sx5GlQnJ1S","taOXKix74r","sqVrfMkgy8","FwEJzyvOMI","fmIK1uJScX","zqH0WoGu6x","WPmlxdpe1v","uZPqgMGlTF",
+"AOgEevLsmS","Q6LixyluBx","HfyNQ5iGN5","W3VFHuPX7G","2Yz7EFFDui","fqypyn1pmO","Mkgy8UlU3M","EoToPo8Uyd","vOqCEYf2Ec","t59lRFxX9q",
+"uAWypdpe1v","Yw2oUQbxXc","SbRYyAkKTk","oGu6xfaHir","lH1ktogLgc","yEfy9DG4sT","Nxx9VQssNC","djsrvDG4sT","X6Pin0BmCy","RxrsmM6qcG",
+"580YD0Wr5y","yluBxB3qem","8FmFHo8Uyd","8FmFH8hJdt","yEfy9tl72W","OUqFMd85a9","n1pmOGv3Fq","JkzUn8xEKz","VjCZqDG4sT","VIlwP7fsYM",
+"VNCPd3otm6","lpF6WQbxXc","nnP8o0YAGH","SbRYyfcwDa","HfyNQrKDLJ","CIShGL7cGc","RzaZAcQOnv","HlUbFzHF1q","StlDJGWqqX","IjTwPSbRYy",
+"jzUqRDG4sT","I7p2aru4UG","h1zcHCp3mZ","BGaQYKZamH","b29RJ55rfB","0MR5X07n1c","HRxd80YAGH","FNYIM4QMc9","xXTI4blLA9","1LB1LLbRTH",
+"n1pmOIjTwP","DLhzMpvgjS","iqv4kKZamH","IRh48ThjNn","wiHrZzY1GY","OUYuFDLhzM","kB5nPpT8wu","AmdQdWDVWJ","lsQGoi3pyd","FGzgpVjCZq",
+"8FmFH9iGoT","DcpWBL7cGc","gtCA5aez9y","kB5nPJKWYR","Yh1hFEdBKc","TXQ0ZUvlv4","Zv7z0JKWYR","OUYuFOz8yZ","lkMUAgtCA5","gjUTuNxx9V",
+"s93MlzmLYD","Kr8ysni2v1","DcpWBksJby","1LB1LEOE1o","OHaBzZzJHW","nlaByxXTI4","jS1ajHP433","2NslmMK07Y","ksJbybrhlQ","uoStwzqH0W",
+"tl72WzbIYY","vLsmSCp3mZ","uN6r3taOXK","dhSuHpvgjS","tlILt07n1c","8xEKzStlDJ","FNYIMzz4ZU","qUJMdK4GS8","WPmlxuoStw","HRxd8qQxHP",
+"HP433x3LDe","YjB9tQChxs","faHirYf2Ec","1j5L8Y1mC0","v8yFNx3LDe","taOXKpvgjS","DLhzMUlU3M","HRxd8fLNg8","iqv4kZJTXH","0KyfslCMxy",
+"I7p2a2ZHdk","aL6AJjeskS","ix74rDLhzM","uupzk2DREs","k85AezHF1q","XyPZN8TxD7","RmDcrTa8f6","hSSvQM3zXL","P6bcglj07Q","yluBxK20wK",
+"5IhmGbZLvS","9rlg9gf8rI","5drc6s7Mxk","ZzJHWjS1aj","Gv3FqkB5nP","WreyPv1Hln","VIlwPStlDJ","ZhwG1POUYS","iwzGkgf8rI","MGlTFt59lR",
+"S2DfuPYBf4","5Drn00YAGH","WPmlxFLsph","Q6hMCo8Uyd","zFgtBReKEW","MK07YC2Irc","aL6AJUmaEv","8TxD71LB1L","WMiS3Ul4a1","gIYvE55rfB",
+"Pb1pa580YD","gf8rI24ARF","FwEJzv2eC3","FLspheuZA5","uN6r3OHaBz","8cVD3POUYS","wDajXTa8f6","tuDySKASQ8","d7vjMuTacx","pv0i7WMiS3",
+"M6qcGZUnqt","lkMUAHfyNQ","0YAGHK20wK","lsQGo9y4lw","WPmlxpmeCd","dhSuHs4786","2NslmYh1hF","TwanoJJs5m","P6bcg5iGN5","DcpWBpmeCd",
+"K4GS8gtCA5","ulk41e6e4z","ydG8Uhe9IA","ogLgc9y4lw","BbwgA2DREs","2hEEUUlU3M","HfyNQfFDrJ","jS1aj24ARF","5VZjSdhSuH","i3pydJKWYR",
+"POUYSMaJQs","Oz8yZpAhR1","MmsIoCdyBV","JkzUnMojnP","ni2v1ru4UG","QYxC0iKqhr","Mm8sizFgtB","rKDLJlCMxy","FVMxo618Di","3otm6wiHrZ",
+"Mkgy824ARF","oGu6xYw2oU","W3VFHlCMxy","RkQkeuupzk","gf8rIFVMxo","iKqhr8hJdt","ix74rHfyNQ","GWqqXgIYvE","55rfBvLsmS","5NammKr8ys",
+"guMb87Ow5C","pWiOs2Nslm","64s8N9XyT9","4W0TlciuWz","WPmlxfcwDa","8FmFHuAWyp","gjUTupiJSk","tvdkDdhSuH","RpBQmDLhzM","IjTwPe6e4z",
+"Cfgr3sx5Gl","K20wKydG8U","lj07QpvgjS","RBhp0hE1Ql","fcwDaB3qem","uvf7AMGlTF","Cfgr3KASQ8","EdBKcjtn0X","kZANmMmKGJ","oQ87ryofH3",
+"oQ87rJKWYR","tAOsratef2","uAWyp4dEz6","FxX9qIBe8k","uoStwn8pJ9","jiVBPjzUqR","bgJAzJXljW","ulk41lkMUA","MmsIoDQimp","GXdoHTwano",
+"lsQGosoy9t","uLtKsru4UG","GWqqXl83Ud","JJs5mW7cTs","gf8rIbgJAz","W3VFHFxX9q","ZhwG1aL6AJ","oQ87rS77LH","7fsYMDcpWB","pFrrlOHaBz",
+"EoToPzFgtB","ZUnqtSWfou","fLNg83weIF","tlILtThjNn","SbRYy5iGN5","RmDcrIRh48","zqH0W5drc6","9y4lwuTacx","AkKTk64s8N","aFFssguMb8",
+"jfREuMkgy8","2DREsYh1hF","rhl0JjS1aj","zmLYDECMvU","RpBQm4QMc9","qQxHP5Namm","yEfy9FFDui","QnJ1SLbRTH","mX2GEKASQ8","cmXIXogLgc",
+"tvdkDlXFOB","CqqaDwiHrZ","pmeCdU3yw5","7X3uyVIlwP","8FmFHpFrrl","HP433Oz8yZ","mz8gxWMiS3","BFkb8hSSvQ","VerEAx3LDe","7ku1pMkgy8",
+"5drc6lCMxy","8cVD3OUqFM","v1HlnIKxdL","FFDuiRmDcr","NcICAgdQsS","Pb1pannP8o","a00b5zQt6Q","NcICAJKWYR","d85a9hi5X7","MK07Y5drc6",
+"hYBCKWMiS3","UlU3MpAhR1","HfyNQoGu6x","fLNg8IjTwP","ogLgcJkzUn","aDGtSd85a9","I7p2aDcpWB","OHaBzdjsrv","Dz1R3gtCA5","FNYIMxXTI4",
+"dQ586ECMvU","8xEKzS2Dfu","dpe1v7X3uy","fcJOyAIYUu","Chuy3FcWrW","07n1chi5X7","U3yw5QssNC","4dEz6QnJ1S","cmXIX5iGN5","tlILti7WMQ",
+"yEfy9W7cTs","14FLR5Drn0","fqypyVLTy6","OxWIH5nmWv","jiVBP3otm6","WmadAMkgy8","QbxXcFGzgp","n1pmONxx9V","euZA5h1zcH","zz4ZUK20wK",
+"v8yFNrz7Ut","WreyPcShY2","D6rByTCgPp","sx5GlCK5W7","0YAGHdmoS7","lj07Quupzk","t98iWy94nw","J2mQi55rfB","I7p2aFVMxo","v1HlnuQIcz",
+"8TxD7x3LDe","BCxeChE1Ql","iqv4kbZLvS","xReecnnP8o","cmXIXfmIK1","PYBf4SWfou","QClRL5Namm","NOHszni2v1","i3pydM6qcG","s4786P6bcg",
+"gIYvECIShG","29QAzAgJHQ","LbRTHQWxoT","9XyT9SWfou","FNYIMWmadA","L7cGcG1RhS","8U2nURmDcr","lsQGoMmsIo","5drc6WreyP","hUTw7IRh48",
+"K20wKZv7z0","ciuWzECMvU","QClRLpAhR1","ZuDtD48cHL","J2mQiS2Dfu","QWxoTokgRi","48cHLciuWz","ciuWz7ku1p","PYBf4dmoS7","cShY2wDajX",
+"MaJQsCNHmv","29QAz4QMc9","yluBxuAWyp","kB5nPW3VFH","B3qemv1Hln","AXpwEOUqFM","K4GS8GWqqX","e6e4zWaim6","xReecfFDrJ","yvOMIrhl0J",
+"d7vjMJkzUn","s93MlDz1R3","0Wr5ytvdkD","x3LDetvdkD","cQOnvBpYhV","MK07YUl4a1","55rfBFFDui","faHirdQ586","oGu6x7Ow5C","x3LDeoVQp6",
+"pmeCdAIYUu","Zv7z0zFgtB","faHirhYBCK","S2DfuzFgtB","BpYhVdjsrv","lj07Q5ZaEz","Nxx9Vx3LDe","MmKGJ0PktI","x3LDeF6PT2","GWqqXe6e4z",
+"uAWypLDk6f","J2mQipT8wu","hE1QlVIlwP","WaWsviqv4k","HzZT8NhXdu","IRh48CNHmv","UmaEvblLA9","07n1cMojnP","FnPFBtvdkD","8TxD7CdyBV",
+"24ARFZ4I1v","WMiS3okgRi","qaofN3weIF","yluBxfLNg8","Z4I1vKASQ8","dQ586BGaQY","FwEJzGrDg7","8FmFHuN6r3","fLNg89eoRc","LDk6ftAOsr",
+"lH1ktoVQp6","48cHLoQ87r","AOgEeUmaEv","HfyNQ2DREs","Kr8ys9GXkX","4QMc9IjTwP","YjB9t2TRI7","vLsmSRACuj","9iGoTQYxC0","IBe8klj07Q",
+"fLNg88TxD7","v8yFNuoStw","IBe8kblLA9","rKDLJaL6AJ","bgJAzNhXdu","14FLR6q6L9","RsQUqhE1Ql","fcJOyHP433","he9IAReKEW","AmdQdb29RJ",
+"xciqpMezSW","fqypyZhwG1","9GXkXU3yw5","tjQxsyEfy9","SmGzvcL0aE","GXdoHNo0Qb","uvf7An1pmO","Nxx9VAIYUu","gdQsS6q6L9","jtn0XQ6hMC",
+"VBjhzG1RhS","M6qcGni2v1","WaWsvgf8rI","SWfouuQIcz","gjUTuJKWYR","29QAzKsjRK","0h1b1lweGy","aL6AJtaOXK","Ta8f62DREs","B3qemTCgPp",
+"FFDui1LB1L","MezSWOxWIH","ulk41lpF6W","5nmWv7ku1p","7hyVvh1zcH","Mkgy8uvf7A","Q6LixzmLYD","nFqikEdBKc","s7Mxko8Uyd","No0QbRBhp0",
+"i7WMQtaOXK","5iGN5iwzGk","POUYSuvf7A","Nxx9VzFgtB","fcJOyru4UG","n1pmOEOE1o","Fhtgl4dEz6","CqqaDYw2oU","DLhzMulk41","ZzJHWt59lR",
+"zz4ZUIKxdL","lH1ktDz1R3","guMb8yEfy9","5ZaEz8hJdt","M6qcGl83Ud","uQIczuupzk","580YDtAOsr","okgRilXFOB","M6qcGazIWp","LbRTHVBjhz",
+"pWiOsZzJHW","v8yFNjeskS","qQxHPnFqik","OHaBzhUTw7","NOHsz618Di","uvf7ArKDLJ","yvOMI3otm6","Yf2Ec0ao3l","2TRI7m4bxU","HfyNQWPmlx",
+"DLhzMtuDyS","OUqFMblLA9","K20wKdpe1v","L7cGcSs0Zu","prNT6uQIcz","iqv4kqUJMd","NcICAtlILt","i7WMQxXTI4","cL0aEBFkb8","2Yz7EQYxC0",
+"TXQ0ZIjTwP","P6bcgTCgPp","uPX7GeuZA5","sqVrfhE1Ql","CdyBV3weIF","64s8N9iGoT","MGlTFRkQke","9eoRccL0aE","WPmlxQ6hMC","2hEEUSbRYy",
+"zz4ZUyToGW","ZzJHWFLsph","uupzkDQimp","W7cTst59lR","UlU3MOUYuF","4W0TlpiJSk","8hJdtDLhzM","lpF6Ws93Ml","pv0i7AIYUu","FwEJzQssNC",
+"OUqFMCfgr3","QbxXcDcpWB","0KyfsWmadA","yluBx7hyVv","lj07Qx3LDe","xReecuJScX","lweGyCqqaD","Ta8f6fFDrJ","tAOsrlXFOB","48cHL29QAz",
+"618DizHF1q","brhlQCK5W7","pvgjStlILt","pv0i7U3yw5","CK5W7lCMxy","580YDo8Uyd","sx5GlzQt6Q","h1zcHJIqXi","TXQ0ZogLgc","uAWypXyPZN",
+"2DREswiHrZ","vLsmSFxX9q","lViBv8hJdt","Waim64dEz6","Ss0ZuJkzUn","zmLYDjfREu","lsQGozFgtB","i7WMQMezSW","JXljWfcwDa","dmoS7i7WMQ",
+"2DREsIBe8k","zY1GYzmLYD","BGaQYcQOnv","RxrsmYjB9t","t59lRjtn0X","S2Dfuaez9y","tjQxsQChxs","xReec4dEz6","4dEz6pFrrl","dQ5868RCUA",
+"RBhp0UlU3M","v2eC3EoToP","Yf2EcqUJMd","iqv4kGXdoH","azIWpzHF1q","jSjS3No0Qb","x3LDe8xEKz","IBe8kCNHmv","4W0Tlix74r","suY4xYf2Ec",
+"n8pJ9sx5Gl","jfREuCp3mZ","Uvlv4ECMvU","MGlTFPYBf4","ZUnqtgjUTu","Yw2oUIRh48","pv0i7d7vjM","o8UydEoToP","SmGzvfFDrJ","kB5nPoGu6x",
+"5VZjSZv7z0","oGu6xzz4ZU","rKDLJciuWz","24ARFiKqhr","64s8Nh1zcH","nlaBysoy9t","AkKTkNhXdu","Dz1R3tl72W","vLsmSZv7z0","VLTy6POUYS",
+"7X3uya00b5","8xEKzO3iyQ","W3VFHtuDyS","Q6hMCI7p2a","jfREuokgRi","24ARFFjHXR","RzaZAuupzk","iwzGkVNCPd","wDajX8xEKz","ZUnqtNo0Qb",
+"vkCHHs93Ml","iqv4kzFgtB","AkKTkjtn0X","9eoRcQYxC0","i3pydJRJQB","WreyPtAOsr","fcJOyjiVBP","k85AeVjCZq","v2eC3cShY2","zFgtBCNHmv",
+"rhl0JReKEW","Yh1hFd85a9","s93MlfmIK1","Pb1pataOXK","qUJMdGWqqX","5VZjSMm8si","S77LHrhl0J","i7WMQb29RJ","WDVWJi3pyd","qUJMdL7cGc",
+"No0Qbi7WMQ","9XyT9OUYuF","piJSkpvgjS","AXpwEi7WMQ","Y1mC0AXpwE","QWxoTECMvU","h1zcHQbxXc","64s8NhYBCK","5Drn02TRI7","sx5GlJJs5m",
+"FPfSEcmXIX","9y4lwuAWyp","djsrvVjCZq","OUqFMqQxHP","29QAzuoStw","iB08lYOfrY","LbRTHZuDtD","WreyP8hJdt","S77LHprNT6","8hJdtPOUYS",
+"cQOnvS2Dfu","e6e4zoVQp6","OUYuF64s8N","fLNg8uPX7G","Qworu8cVD3","K20wK0ao3l","FxX9qkB5nP","0h1b145cIH","CIShGksJby","WPmlxDLhzM",
+"5Nammmz8gx","n1pmOjtn0X","xXTI4jS1aj","pvgjSBGaQY","EoToPaez9y","vLsmSgIYvE","2ZHdk9rlg9","Uvlv45Namm","QWxoTn8pJ9","GrDg77hyVv",
+"Q6hMC8TxD7","2NslmokgRi","14FLRGrDg7","In3NSLDk6f","n8pJ9zHF1q","iwzGkQ6Lix","ThjNnB3qem","0Wr5yAIYUu","zmLYDzQt6Q","DLhzMaez9y",
+"ciuWzbrhlQ","lweGy24ARF","2hEEUOHaBz","HfyNQFxX9q","gdQsSgdQsS","GrDg7HlUbF","X6PinOUqFM","dpe1vlViBv","UlU3M45cIH","S2Dfu29QAz",
+"GSQwjuZPqg","m4bxUuJScX","9iGoT4QMc9","XflUqZuDtD","W7cTsIRh48","v1HlnFPfSE","WreyPsoy9t","Ta8f6bZLvS","xReecru4UG","7fsYMiwzGk",
+"8TxD7dQ586","aez9y24ARF","MaJQsl83Ud","RkQke64s8N","Gv3FquJScX","No0QbO3iyQ","9iGoTRBhp0","prNT6yofH3","5NammuJScX","Ss0Zu580YD",
+"azIWpRsQUq","Gv3FqqUJMd","ZJTXHCNHmv","VjCZqS77LH","fqypyVjCZq","o8UydECMvU","FhtglvLsmS","gIYvEdmoS7","D6rByiB08l","SmGzv64s8N",
+"hSSvQZuDtD","WDVWJvLsmS","07n1cWaim6","ZhwG1uQIcz","0ao3lTa8f6","3otm6euZA5","580YDuLtKs","Yf2EcC2Irc","POUYS4dEz6","CxVEflXFOB",
+"2TRI7iKqhr","pmeCdlj07Q","CqqaD9XyT9","W3VFHfcJOy","m4bxUfmIK1","ydG8UNOHsz","MmsIoWmadA","HlUbFCIShG","s4786AgJHQ","2NslmzmLYD",
+"8hJdtiB08l","nnP8oFcWrW","0BmCykZANm","t98iWRxrsm","P6bcgkB5nP","OHaBzFLsph","Y1mC00MR5X","cQOnvzz4ZU","aez9yGSQwj","BpYhViwzGk",
+"9eoRcLbRTH","WDVWJ580YD","tl72Wni2v1","POUYSyluBx","fcJOy07n1c","7lUXZoVQp6","lkMUALewvM","RkQkeyEfy9","7hyVvgjUTu","zbIYYFhtgl",
+"NhXduMaJQs","4dEz6oGu6x","0ao3lOUYuF","wiHrZ5IhmG","BbwgA7fKYU","uZPqgZuDtD","JIqXilXFOB","AkKTkMkgy8","yToGWkB5nP","BFkb8ulk41",
+"s7MxkFPfSE","HlUbFwDajX","IBe8kFVMxo","ZUnqtx3LDe","8hJdtHP433","StlDJ14FLR","2TRI7FFDui","nlaByjtn0X","Q6Lixni2v1","I7p2a0Wr5y",
+"Zv7z0Rxrsm","U3yw5jtn0X","o8UydNAFuw","Y1mC0lweGy","0MR5Xzz4ZU","lCMxy5Mg9r","EoToPIBe8k","iqv4k0PktI","ix74rZuDtD","WPmlxx3LDe",
+"brhlQZUnqt","bgJAzgtCA5","8xEKzlweGy","tuDyS4W0Tl","WmadAMm8si","IRh48SbRYy","soy9t9XyT9","9XyT9atef2","pFrrllXFOB","Twano5Drn0",
+"L7cGcC2Irc","9GXkXv2eC3","RpBQmRkQke","guMb8rKDLJ","0YAGH2Nslm","oGu6xjeskS","X6Pinlm0pD","XflUqYh1hF","FxX9qQClRL","LbRTHsx5Gl",
+"o8UydPYBf4","yluBxCp3mZ","3otm6BGaQY","7lUXZWmadA","JXljWJRJQB","mz8gxFNYIM","tl72WpAhR1","guMb8Fhtgl","Pb1pa0Kyfs","IjTwPzmLYD",
+"5nmWvtaOXK","9rlg9Zv7z0","SWfouJkzUn","JJs5mprNT6","vkCHHkZANm","zHF1qXflUq","t59lRReKEW","dmoS7XflUq","pv0i7t59lR","IBe8kCdyBV",
+"MmKGJ55rfB","uN6r3a00b5","In3NSsqVrf","d85a9uZPqg","No0QbxReec","nFqikW7cTs","WDVWJlj07Q","RmDcrcmXIX","POUYSHRxd8","618Di4W0Tl",
+"AgJHQtjQxs","I7p2aGWqqX","k85Aejtn0X","J2mQiB3qem","C2IrcYh1hF","8xEKzP6bcg","Oz8yZSjskQ","zFgtBDz1R3","Zv7z0DG4sT","Cfgr3Oz8yZ",
+"ZzJHWQYxC0","i7WMQ8U2nU","OHaBzBGaQY","uLtKsLbRTH","FFDuiFGzgp","7fKYU5VZjS","1j5L8lViBv","lViBv1v5hH","tAOsr7X3uy","4W0TluPX7G",
+"v8yFNGv3Fq","IRh48VNCPd","8RCUApmeCd","RACujpvgjS","5nmWvThjNn","Z4I1vYjB9t","WmadA5drc6","sqVrftlILt","VNCPdZJTXH","uPX7GIKxdL",
+"pT8wuGv3Fq","QssNCfqypy","uTacxFxX9q","FhtglzbIYY","FnPFB0BmCy","blLA9FVMxo","MK07Ytl72W","zY1GYM6qcG","7lUXZd7vjM","5NammgdQsS",
+"hSSvQMm8si","FcWrWJRJQB","QWxoTUmaEv","kZANmFNYIM","G1RhSQworu","i3pydMmsIo","jS1ajpv0i7","8U2nUFPfSE","qaofNK20wK","2TRI7JJs5m",
+"MmKGJwDajX","jeskSFVMxo","SmGzvVprf2","AgJHQuQIcz","BFkb8Uvlv4","t98iWPb1pa","4W0Tlpv0i7","FcWrWaez9y","TwanojeskS","zmLYD14FLR",
+"M3zXLUvlv4","ni2v1lsQGo","U3yw5yEfy9","W3VFHuJScX","lCMxy2hEEU","8TxD7lweGy","FGzgpPYBf4","djsrvLewvM","S77LH2hEEU","UmaEvt59lR",
+"8cVD3JKWYR","suY4xt98iW","lXFOBaDGtS","oQ87rWDVWJ","vOqCEa00b5","EOE1okZANm","soy9tuLtKs","5IhmGzmLYD","GSQwjiKqhr","MGlTFOUqFM",
+"5iGN59eoRc","fcwDaGv3Fq","S77LH0h1b1","9iGoTYw2oU","pT8wuh1zcH","0Kyfs5Drn0","W7cTsFVMxo","IRh48WMiS3","J2mQi5Drn0","pvgjSwiHrZ",
+"Q6LixMm8si","cShY2t59lR","Cp3mZhSSvQ","uoStwQssNC","LDk6fBCxeC","lkMUAHlUbF","ZJTXHs4786","pAhR1FGzgp","KASQ8MmKGJ","nlaBy1j5L8",
+"AmdQdvOqCE","Cfgr3G1RhS","QClRLb29RJ","Uvlv4Oz8yZ","1j5L8BpYhV","gdQsSGv3Fq","6q6L9piJSk","dpe1vYh1hF","O3iyQZUnqt","O3iyQoGu6x",
+"pFrrltAOsr","AIYUuWmadA","5iGN5Chuy3","he9IAQ6hMC","pAhR1soy9t","07n1ci7WMQ","GXdoH4dEz6","Z4I1vIBe8k","sqVrfRpBQm","I7p2aMojnP",
+"dhSuHxXTI4","gdQsSkZANm","NOHszlpF6W","lkMUAlH1kt","5Drn0W7cTs","0h1b1RpBQm","pFrrls93Ml","Uvlv4DQimp","6q6L914FLR","LewvMD6rBy",
+"DG4sTBGaQY","tl72WvkCHH","uPX7GCIShG","JRJQBfqypy","7Ow5CRkQke","iB08lRpBQm","KsjRKhi5X7","AOgEeFhtgl","7lUXZiqv4k","5drc6cL0aE",
+"blLA9WPmlx","No0Qb2hEEU","5Mg9rcQOnv","TCgPpThjNn","SWfouOxWIH","QbxXcGXdoH","7fKYUAkKTk","FLsph1LB1L","64s8NBCxeC","8U2nUIBe8k",
+"Waim6D6rBy","OHaBzYw2oU","5VZjSqQxHP","FLsphYh1hF","ZhwG1jzUqR","s93Mls4786","TCgPpRBhp0","StlDJ0Wr5y","oGu6xQClRL","MojnPWmadA",
+"jeskSi3pyd","oGu6xaL6AJ","ksJbydQ586","CxVEfmz8gx","618DiYjB9t","ru4UG0h1b1","suY4xAmdQd","zz4ZUKASQ8","M3zXLwiHrZ","taOXKxReec",
+"Nxx9V2hEEU","FNYIMpFrrl","AXpwEDz1R3","GWqqXd7vjM","POUYSLewvM","POUYSB3qem","64s8NpAhR1","RACujdhSuH","RxrsmLewvM","RBhp0JKWYR",
+"okgRilsQGo","lkMUATCgPp","gf8rIDcpWB","W7cTsFwEJz","Q6hMCQ6hMC","MojnPpFrrl","SWfouMmsIo","ZUnqtrKDLJ","FhtgljfREu","jtn0Xgf8rI",
+"1j5L84dEz6","Uvlv4i7WMQ","bZLvSokgRi","gIYvEFnPFB","EoToPjSjS3","POUYSBCxeC","lpF6Wn8pJ9","RACujMmKGJ","CIShGh1zcH","FPfSENhXdu",
+"9eoRc5nmWv","XflUqS77LH","LbRTHWaWsv","tuDySJKWYR","AmdQdIjTwP","64s8N7hyVv","cL0aETXQ0Z","uupzkC2Irc","SWfout98iW","cL0aEaL6AJ",
+"tvdkDsqVrf","5drc6uAWyp","i7WMQQworu","X6PinzFgtB","Mm8siRBhp0","lViBvCK5W7","O3iyQv1Hln","hYBCK618Di","0h1b17X3uy","rKDLJuoStw",
+"0YAGHTa8f6","cL0aERBhp0","CxVEfU3yw5","64s8NyluBx","QssNC580YD","HzZT8lViBv","QnJ1SvLsmS","piJSkpAhR1","ru4UGSbRYy","e6e4zatef2",
+"BpYhVZUnqt","1j5L8tAOsr","zqH0WOz8yZ","VBjhz0Kyfs","QbxXcQ6hMC","rKDLJhE1Ql","JKWYRFcWrW","t98iWMm8si","oVQp68cVD3","djsrv1LB1L",
+"VBjhzWMiS3","jSjS3XyPZN","XflUqhE1Ql","IjTwPLbRTH","GWqqXOUYuF","J2mQio8Uyd","9rlg9l83Ud","55rfBBCxeC","UlU3MOz8yZ","1j5L8Cp3mZ",
+"HP433pT8wu","uAWyp64s8N","QworuMGlTF","iKqhratef2","FwEJzVprf2","euZA5EoToP","EoToPv1Hln","Nxx9VVBjhz","FGzgpnnP8o","BFkb8JKWYR",
+"jiVBPI7p2a","B3qem1j5L8","ogLgcqUJMd","uN6r3e6e4z","rz7UtcShY2","bgJAzCIShG","pmeCdWMiS3","qUJMdKASQ8","3otm6bZLvS","bZLvSUmaEv",
+"lm0pDuJScX","fqypy2Yz7E","ni2v1xReec","FLsphTCgPp","zz4ZU48cHL","2hEEUy94nw","4dEz6vOqCE","L7cGc14FLR","yvOMI64s8N","OUYuFfLNg8",
+"7lUXZYjB9t","atef2lsQGo","C2Irc7Ow5C","4QMc9piJSk","uvf7AQChxs","I7p2apmeCd","uQIczgf8rI","FFDuilXFOB","WreyPm4bxU","piJSkVBjhz",
+"mX2GEUvlv4","uZPqg9rlg9","G1RhStl72W","S77LHk85Ae","DG4sT580YD","IBe8kQClRL","pWiOsM6qcG","Nxx9VSWfou","ksJbyStlDJ","lm0pDFNYIM",
+"hE1QlyToGW","Pb1pa0BmCy","zz4ZUGWqqX","S2DfuWreyP","sx5GlFVMxo","AOgEeM6qcG","Dz1R3iqv4k","AXpwEzz4ZU","zQt6Quupzk","48cHLUlU3M",
+"ulk41GXdoH","Ss0ZuAmdQd","VLTy68cVD3","LewvMJJs5m","SbRYyyluBx","QworuuPX7G","SWfouyluBx","RkQkeQ6Lix","Q6Lix2DREs","JRJQBDcpWB",
+"7fsYM9XyT9","K20wKh1zcH","n1pmOv1Hln","pWiOsAmdQd","MmsIoqUJMd","hUTw7AmdQd","okgRiatef2","dhSuHh1zcH","xReecY1mC0","suY4xsx5Gl",
+"Q6LixcL0aE","CK5W7aez9y","fmIK1EoToP","UmaEvk85Ae","iqv4kDQimp","GSQwjVNCPd","jtn0XCK5W7","FxX9qjiVBP","YjB9tTa8f6","7fKYUB3qem",
+"nlaByChuy3","5ZaEzIjTwP","1LB1LsqVrf","xReec5nmWv","9GXkXtAOsr","FwEJzAgJHQ","gjUTu0PktI","CIShGmz8gx","pmeCdS2Dfu","blLA9lkMUA",
+"K20wKqQxHP","FNYIMPOUYS","7ku1pOHaBz","tl72WfmIK1","4dEz6AgJHQ","WMiS3n1pmO","FcWrWIjTwP","AmdQdfcwDa","uLtKslCMxy","9y4lwpAhR1",
+"I7p2a8hJdt","ogLgcjzUqR","wDajXDLhzM","t98iW4QMc9","jfREuPYBf4","1j5L8jeskS","In3NSNcICA","o8UydMezSW","DG4sTJIqXi","VjCZq45cIH",
+"ReKEWiqv4k","OxWIHZhwG1","6q6L9MmsIo","n1pmOVIlwP","3weIF5iGN5","ulk41azIWp","24ARFVLTy6","FcWrWYf2Ec","lCMxyThjNn","dQ586v8yFN",
+"aFFssvkCHH","dmoS7kZANm","lViBvFhtgl","7fsYMn1pmO","aez9yGrDg7","4dEz61LB1L","NOHszStlDJ","tvdkDv2eC3","oQ87rcL0aE","wiHrZWmadA",
+"zmLYDLbRTH","dmoS7b29RJ","sqVrfMaJQs","wDajXStlDJ","2Yz7EPb1pa","NcICA5Drn0","hYBCKQworu","BCxeCCp3mZ","CIShGNOHsz","JRJQBSWfou",
+"0ao3l16lHc","suY4xtvdkD","8TxD7uAWyp","yofH3uTacx","MezSWsuY4x","AIYUuru4UG","0PktIFLsph","Waim65IhmG","OHaBznlaBy","VLTy6L7cGc",
+"JJs5m7fsYM","ZzJHWuN6r3","cQOnvHfyNQ","e6e4zFcWrW","dhSuHRBhp0","Yh1hFtl72W","Cp3mZjzUqR","5Mg9rwDajX","5ZaEzG1RhS","IKxdLrz7Ut",
+"lXFOB3weIF","Nxx9Vb29RJ","uoStw4QMc9","5IhmGgtCA5","dmoS7dmoS7","djsrv1j5L8","8TxD7azIWp","5nmWvqUJMd","Yw2oUWDVWJ","WDVWJprNT6",
+"IKxdL7hyVv","WPmlxgjUTu","KZamHUl4a1","t98iWqQxHP","KsjRK5drc6","pWiOsxReec","4QMc9fFDrJ","SbRYyrhl0J","L7cGcQssNC","pWiOsqQxHP",
+"yEfy9JXljW","tlILtSWfou","gIYvEdpe1v","K4GS8zbIYY","6AFT0AkKTk","ECMvUkZANm","VBjhzaFFss","EoToP8xEKz","O3iyQQ6hMC","DLhzM7lUXZ",
+"0ao3l9iGoT","AgJHQfLNg8","v1HlnWreyP","lj07Q4dEz6","StlDJyEfy9","S77LH5ZaEz","2TRI7W7cTs","brhlQBCxeC","xReecMmKGJ","K20wKuvf7A",
+"tl72WNOHsz","Z4I1v9GXkX","FFDuiP6bcg","0PktIrz7Ut","RpBQmZ4I1v","EOE1oBbwgA","FLsphTa8f6","gdQsS9XyT9","qUJMdcmXIX","n8pJ9uTacx",
+"EoToPlweGy","oQ87rRpBQm","iB08lWmadA","EOE1oUmaEv","GrDg7pvgjS","AmdQdlXFOB","5VZjSfmIK1","5VZjSjSjS3","16lHcYOfrY","SbRYyQnJ1S",
+"FFDuit59lR","lm0pDRzaZA","vOqCE0ao3l","SbRYy7fsYM","JXljWNAFuw","7fsYM0ao3l","IKxdLuZPqg","gjUTuYw2oU","GXdoHoVQp6","blLA9nnP8o",
+"lm0pDiKqhr","HzZT8pmeCd","pmeCdAXpwE","SmGzvzz4ZU","uvf7ASs0Zu","fqypy48cHL","PYBf4uJScX","k85AeCIShG","5Mg9rdhSuH","vOqCEhSSvQ",
+"ix74r9rlg9","In3NS4W0Tl","9rlg9WmadA","zFgtBHfyNQ","azIWpdjsrv","Twano3weIF","VNCPdVIlwP","KsjRK9XyT9","hSSvQ0MR5X","FVMxouoStw",
+"cL0aEgIYvE","zQt6Qdjsrv","QssNClj07Q","5ZaEzyEfy9","MaJQsFnPFB","KsjRKtlILt","DQimpnlaBy","FVMxoIjTwP","OUqFMqUJMd","yToGWYw2oU",
+"24ARF07n1c","U3yw5MmKGJ","7Ow5CThjNn","azIWpXyPZN","VerEA9rlg9","okgRi4QMc9","lm0pD8TxD7","MmKGJJKWYR","gf8rI580YD","9eoRcxReec",
+"hE1Ql3otm6","DQimplj07Q","lpF6WJXljW","07n1cfmIK1","JIqXiS77LH","OUqFMuPX7G","POUYSChuy3","FLsphVLTy6","W3VFHHfyNQ","zmLYDwiHrZ",
+"2hEEUuN6r3","xXTI4lpF6W","0ao3lbZLvS","AIYUuNcICA","pWiOsVjCZq","VLTy6jtn0X","2hEEUFjHXR","8U2nU0BmCy","Cp3mZ8hJdt","7Ow5CTwano",
+"JkzUnjtn0X","In3NSMojnP","7Ow5CRACuj","RzaZAZuDtD","IKxdLatef2","pmeCdYw2oU","64s8NjeskS","GXdoHFVMxo","14FLRCqqaD","29QAzciuWz",
+"nnP8oXflUq","HzZT8rz7Ut","hUTw7aDGtS","bZLvSLDk6f","CxVEfxXTI4","2ZHdkSWfou","Ss0ZuS77LH","ogLgcuAWyp","lkMUAECMvU","zqH0WpFrrl",
+"djsrvuJScX","7ku1pEoToP","Ss0ZutaOXK","sx5GlpvgjS","ReKEWUl4a1","d7vjM5Namm","fLNg8RpBQm","uupzk5ZaEz","gIYvELbRTH","kB5nPmz8gx",
+"FcWrW9y4lw","zqH0WcQOnv","jeskSmz8gx","uLtKslj07Q","1LB1LyToGW","h1zcHs7Mxk","gdQsSEdBKc","uAWyp2hEEU","nlaByS77LH","WDVWJk85Ae",
+"SmGzvCqqaD","SjskQ5Drn0","Oz8yZuTacx","QChxsRACuj","uQIczYOfrY","tl72WjzUqR","5VZjS1j5L8","yToGWJIqXi","580YDkB5nP","GWqqX7hyVv",
+"Cfgr3yvOMI","AXpwEnnP8o","VNCPdTCgPp","GSQwjlweGy","AXpwEpiJSk","kZANmhe9IA","QClRLZuDtD","B3qemS77LH","0h1b1pWiOs","tuDySk85Ae",
+"ix74r7X3uy","7hyVvhSSvQ","2ZHdk29QAz","he9IAVerEA","zQt6Qe6e4z","9GXkXogLgc","jfREuy94nw","oQ87rCK5W7","oGu6xDLhzM","uPX7GlCMxy",
+"mz8gxeuZA5","KZamHguMb8","bZLvSs7Mxk","hUTw7W7cTs","U3yw5RmDcr","NcICAlpF6W","PYBf49eoRc","hE1QlhE1Ql","8cVD35Drn0","9GXkXMezSW",
+"FjHXRUvlv4","d85a93weIF","hE1QlQ6Lix","v1HlnMGlTF","xciqplXFOB","L7cGc5ZaEz","FwEJzGXdoH","GXdoH9eoRc","zmLYDsx5Gl","x3LDeDG4sT",
+"0YAGHhe9IA","VIlwP8RCUA","y94nwsoy9t","iwzGkVprf2","Yf2EcpFrrl","3otm6piJSk","BCxeCStlDJ","2ZHdkfaHir","JJs5m618Di","Chuy3Q6Lix",
+"Yh1hFhi5X7","VIlwPhYBCK","LewvMK20wK","FLsphazIWp","uupzkMGlTF","2ZHdk14FLR","14FLRoGu6x","5drc6FwEJz","rhl0JkB5nP","aFFssNxx9V",
+"5ZaEzAmdQd","zFgtBCqqaD","AIYUuIBe8k","ksJbycShY2","RmDcr7fKYU","AkKTk0Wr5y","Dz1R30Kyfs","bgJAzQClRL","QYxC0In3NS","1LB1LPOUYS",
+"gIYvEECMvU","7lUXZ0Wr5y","faHirYw2oU","Gv3FqogLgc","Ss0ZuQYxC0","vOqCEF6PT2","IRh48TCgPp","3weIFo8Uyd","cQOnvh1zcH","zY1GYYf2Ec",
+"StlDJeuZA5","0Wr5yRzaZA","lkMUArKDLJ","vkCHHAOgEe","HP4330PktI","7Ow5C0ao3l","zY1GYKZamH","No0QbQClRL","LewvMfmIK1","ix74ruPX7G",
+"SjskQDG4sT","rz7UtoQ87r","4dEz6ogLgc","dQ586I7p2a","9GXkXhE1Ql","tl72WMm8si","Zv7z0Q6Lix","FPfSEFjHXR","hE1Qlgf8rI","yvOMICK5W7",
+"uQIczOUqFM","FnPFBkZANm","azIWp8hJdt","HRxd8EOE1o","580YDW3VFH","iKqhrtlILt","yvOMIOUqFM","d85a9Vprf2","oVQp6gf8rI","0KyfsuLtKs",
+"lm0pDkB5nP","KsjRKZzJHW","U3yw5pvgjS","IRh48JkzUn","nnP8ooQ87r","jfREurKDLJ","RzaZAuAWyp","FFDuiIBe8k","RsQUqDQimp","NcICA7X3uy",
+"AIYUuzHF1q","mX2GE1LB1L","Dz1R3Twano","a00b58RCUA","2TRI7XyPZN","djsrvRBhp0","NhXdutaOXK","vkCHHAXpwE","7ku1p0MR5X","lViBvjeskS",
+"lm0pDhUTw7","jiVBPBCxeC","POUYSSjskQ","JJs5mpvgjS","QYxC09XyT9","5IhmG2TRI7","tl72WVIlwP","RxrsmNhXdu","jtn0XAXpwE","n8pJ9VBjhz",
+"Vprf2QbxXc","Pb1pa9XyT9","nFqikrKDLJ","5VZjS9GXkX","HRxd8t59lR","WPmlxrz7Ut","bgJAzWPmlx","QnJ1SFhtgl","soy9tSbRYy","qQxHPv1Hln",
+"SbRYy2DREs","OUYuFPYBf4","nFqikcL0aE","FwEJzFLsph","OHaBzhe9IA","k85AeEoToP","m4bxUTwano","07n1c5Namm","zFgtBQssNC","ZhwG1ogLgc",
+"RkQkeciuWz","IBe8kuLtKs","BpYhV8cVD3","DQimpHfyNQ","RsQUqSs0Zu","iB08lyofH3","WPmlx5Namm","aDGtS48cHL","FFDuifcJOy","6AFT07Ow5C",
+"uLtKsv8yFN","XyPZNVerEA","2hEEUQWxoT","OUqFM8FmFH","P6bcgtuDyS","OUYuFpAhR1","FFDuiv2eC3","zY1GYjfREu","9XyT9wiHrZ","7ku1pBbwgA",
+"29QAzQssNC","WaWsvpT8wu","LDk6fDcpWB","ECMvUIn3NS","JRJQBlweGy","uJScXWMiS3","faHir0MR5X","WreyPWPmlx","iB08lguMb8","lkMUAL7cGc",
+"EdBKcS2Dfu","GrDg7vkCHH","HlUbFSs0Zu","aL6AJVBjhz","55rfBrhl0J","AXpwEnlaBy","h1zcH7X3uy","iqv4kWMiS3","3weIFb29RJ","fcJOy2hEEU",
+"LbRTH9y4lw","3otm6BpYhV","VerEAQ6hMC","k85Ae7ku1p","Mm8sixReec","SmGzvSs0Zu","hUTw77lUXZ","uQIczVNCPd","uPX7Ghe9IA","6q6L9Vprf2",
+"G1RhSF6PT2","7fsYMni2v1","GrDg7HRxd8","yvOMItjQxs","nlaBy07n1c","7lUXZYf2Ec","BbwgA6AFT0","FVMxozFgtB","uZPqgy94nw","dpe1vAkKTk",
+"O3iyQb29RJ","9GXkXuoStw","QClRL45cIH","KsjRKuvf7A","NOHszlweGy","2Yz7E7lUXZ","Y1mC0pT8wu","6q6L9jSjS3","BCxeClH1kt","O3iyQnFqik",
+"UlU3M2Yz7E","U3yw5POUYS","wiHrZtAOsr","lsQGo1j5L8","okgRiZuDtD","0BmCyCqqaD","EOE1ot59lR","4W0Tl6q6L9","F6PT2ECMvU","8cVD3nlaBy",
+"iwzGklXFOB","nlaByrz7Ut","pvgjSfmIK1","ulk41x3LDe","ZJTXHpWiOs","jiVBPfqypy","zHF1qBGaQY","7X3uy0Wr5y","QnJ1SNo0Qb","9y4lwSs0Zu",
+"IRh48gdQsS","iqv4kdjsrv","t59lRBpYhV","XflUqcShY2","lCMxy580YD","XflUqguMb8","StlDJb29RJ","b29RJ7fKYU","kB5nPfcJOy","nlaBy7fsYM",
+"ix74rmz8gx","blLA99eoRc","lXFOBtl72W","RACujYjB9t","AkKTk0YAGH","kB5nPhUTw7","FcWrWpFrrl","vOqCEUvlv4","EdBKc8RCUA","I7p2ahUTw7",
+"AmdQdVNCPd","TCgPpECMvU","RBhp0DLhzM","cmXIXtaOXK","FFDuibrhlQ","zHF1qFNYIM","zHF1qQWxoT","JRJQB07n1c","dmoS7FnPFB","TCgPpWPmlx",
+"DLhzMUl4a1","lViBvVerEA","GSQwjpmeCd","hYBCKIn3NS","VjCZqDQimp","EoToPfFDrJ","Cp3mZuupzk","8xEKzuJScX","VNCPd9GXkX","OUqFM8U2nU",
+"2hEEUX6Pin","jtn0X0Wr5y","2TRI75Mg9r","oQ87rrz7Ut","16lHc2Yz7E","7Ow5CokgRi","azIWpuQIcz","U3yw5ni2v1","n8pJ9HRxd8","7ku1p7fKYU",
+"2Yz7E2hEEU","FNYIMpiJSk","o8Uyd2Nslm","zQt6Qn8pJ9","mX2GEZhwG1","64s8Nt59lR","B3qem2Yz7E","Mkgy8uQIcz","No0QbHfyNQ","aez9ydQ586",
+"Yf2EcKZamH","zFgtBulk41","KZamHciuWz","gdQsSCdyBV","lViBvuvf7A","Chuy3KZamH","WPmlxMGlTF","tjQxs0Kyfs","FhtgluJScX","cmXIXC2Irc",
+"DQimpIjTwP","fqypyuoStw","azIWpfcJOy","GSQwjuAWyp","zY1GYatef2","S2DfuWPmlx","4W0TlI7p2a","3weIFcL0aE","XflUq7ku1p","taOXKdmoS7",
+"DQimpNOHsz","i3pydcShY2","uZPqgzqH0W","VIlwPRsQUq","0YAGHmz8gx","lsQGoEdBKc","8cVD3xReec","nnP8o5Mg9r","QssNCuZPqg","FhtglAmdQd",
+"jiVBPgtCA5","0PktIYjB9t","yToGWDQimp","55rfBQ6hMC","fLNg8MK07Y","hSSvQZJTXH","TCgPpVBjhz","zY1GYy94nw","O3iyQbrhlQ","WaWsvFLsph",
+"Q6LixvOqCE","QbxXcydG8U","vLsmSWaim6","9XyT9sqVrf","Pb1paTa8f6","dmoS7QChxs","pmeCdGSQwj","NAFuwguMb8","XyPZNdQ586","8cVD3BGaQY",
+"7lUXZlweGy","PYBf4mz8gx","PYBf4In3NS","S2DfuNhXdu","guMb8Kr8ys","iB08loGu6x","4W0Tl2Yz7E","oGu6xFVMxo","dhSuH0h1b1","gdQsSWreyP",
+"POUYSs4786","ksJbyRxrsm","uTacx2DREs","uPX7GZhwG1","HfyNQDLhzM","fFDrJ0Kyfs","zbIYY8RCUA","ECMvUuQIcz","0ao3l9XyT9","ni2v1gf8rI",
+"Mkgy8ECMvU","Z4I1vJkzUn","AXpwEKASQ8","LewvMpFrrl","rKDLJprNT6","EdBKcv8yFN","cShY2l83Ud","zmLYDuupzk","7hyVvzFgtB","Waim6dQ586",
+"uQIczUlU3M","7lUXZhSSvQ","zmLYDfFDrJ","d7vjM1v5hH","BpYhVix74r","7fKYUpWiOs","L7cGchSSvQ","UmaEvYjB9t","2hEEULewvM","FxX9qzQt6Q",
+"8xEKz2hEEU","piJSkRpBQm","TwanoReKEW","OUqFMyToGW","zQt6QcQOnv","Mm8si1LB1L","9GXkXhSSvQ","rz7UthYBCK","7hyVv0ao3l","JIqXiKZamH",
+"DcpWB1j5L8","BCxeChYBCK","lsQGouPX7G","KASQ8MaJQs","qUJMdJKWYR","FhtglS77LH","SmGzviqv4k","S77LHQWxoT","P6bcgCfgr3","Twanon8pJ9",
+"hUTw7EoToP","kZANmtjQxs","Ss0ZuNcICA","5nmWvLDk6f","VjCZqlViBv","lXFOBxciqp","7fKYUpiJSk","djsrvD6rBy","4QMc9FcWrW","BFkb89iGoT",
+"okgRilj07Q","EOE1oEoToP","2Yz7Ex3LDe","0YAGHNxx9V","FnPFBZuDtD","l83UdYOfrY","XflUqvkCHH","okgRi8hJdt","azIWpjtn0X","WmadAQWxoT",
+"F6PT2cQOnv","DQimpTXQ0Z","pWiOsLDk6f","FGzgpJJs5m","2NslmfaHir","ksJbybZLvS","VerEAqQxHP","yEfy9d85a9","vOqCEFVMxo","tlILtFwEJz",
+"5NammHP433","b29RJYw2oU","BGaQYMK07Y","8U2nUQClRL","atef2ZuDtD","tjQxsRACuj","zbIYYECMvU","UmaEvoQ87r","QssNCzQt6Q","lkMUApT8wu",
+"No0QbtjQxs","8FmFH0YAGH","RsQUqoQ87r","Mkgy814FLR","djsrvMmsIo","MmsIoFwEJz","i7WMQhYBCK","9y4lwL7cGc","ciuWz2DREs","pWiOs2DREs",
+"RkQkeokgRi","0KyfswDajX","M3zXLVIlwP","64s8NmX2GE","fmIK1DcpWB","1v5hHcShY2","Yf2EcgjUTu","5Drn0CNHmv","618DiYOfrY","RxrsmydG8U",
+"fLNg8VLTy6","Yf2EcTa8f6","Cfgr3MK07Y","QWxoTAkKTk","fcwDam4bxU","5NammZhwG1","iB08l4QMc9","ECMvUMmKGJ","EdBKcsuY4x","Gv3Fqatef2",
+"QssNCmX2GE","s7Mxkfqypy","KZamH9XyT9","TwanolsQGo","0YAGH45cIH","d7vjMulk41","7fKYUzFgtB","2NslmUlU3M","uQIczHlUbF","lj07QNAFuw",
+"ThjNnzmLYD","RpBQmNhXdu","DQimpHRxd8","0MR5X9iGoT","MK07YnlaBy","7lUXZZhwG1","KZamHAIYUu","1LB1LFNYIM","WmadA618Di","jiVBPOxWIH",
+"bZLvSDQimp","GWqqXJ2mQi","KASQ8K20wK","Ta8f6FGzgp","WaWsvVprf2","KsjRKqaofN","XflUqm4bxU","7ku1ppv0i7","zHF1qUmaEv","FxX9qy94nw",
+"gtCA5BGaQY","e6e4zCNHmv","zFgtBrz7Ut","ru4UGFPfSE","uupzk5VZjS","soy9tblLA9","9eoRcPb1pa","X6Pinh1zcH","5nmWvStlDJ","kZANmGWqqX",
+"uN6r3m4bxU","ThjNnSmGzv","guMb8tlILt","vkCHHZUnqt","cShY2EOE1o","FPfSE45cIH","nFqikyEfy9","ni2v1zz4ZU","8FmFHuvf7A","2hEEUECMvU",
+"7X3uyxciqp","9XyT9FLsph","n8pJ9UlU3M","euZA5rhl0J","9y4lwuLtKs","Gv3FqJJs5m","BCxeCGrDg7","EoToPKZamH","45cIHaL6AJ","14FLROHaBz",
+"Ta8f6DLhzM","uLtKsCqqaD","sx5GlUvlv4","vOqCEiB08l","b29RJsx5Gl","KASQ8atef2","KsjRKCdyBV","m4bxU24ARF","lH1ktNOHsz","QbxXceuZA5",
+"IjTwP16lHc","CIShG9rlg9","SWfouG1RhS","AmdQdVIlwP","6AFT0v2eC3","b29RJMGlTF","8TxD7No0Qb","ZzJHWFFDui","jiVBPJKWYR","5ZaEz7ku1p",
+"1LB1LjfREu","XyPZNfFDrJ","FGzgpJXljW","StlDJFwEJz","Fhtgl1j5L8","rhl0JTwano","QssNCStlDJ","29QAzgf8rI","v8yFN07n1c","O3iyQ2TRI7",
+"hE1QllCMxy","o8UydXflUq","ZJTXHW3VFH","uPX7GW7cTs","SWfouPOUYS","pAhR1LbRTH","AOgEetvdkD","WDVWJBGaQY","zbIYYh1zcH","HzZT8X6Pin",
+"jzUqRiB08l","ZhwG1lCMxy","dhSuHVerEA","okgRiDQimp","qaofNTwano","5Nammatef2","GXdoHRpBQm","3weIF9GXkX","cmXIX5IhmG","mz8gxBGaQY",
+"RmDcrxXTI4","JRJQBXyPZN","0Wr5y5iGN5","Dz1R33otm6","DG4sTCIShG","pFrrlazIWp","FLspho8Uyd","tvdkDTXQ0Z","SbRYyk85Ae","t59lRlweGy",
+"0ao3lyluBx","Yh1hFSbRYy","8cVD3VBjhz","vOqCELewvM","K4GS8W3VFH","FPfSERkQke","580YD7Ow5C","5iGN5ksJby","SjskQ7ku1p","M6qcGHlUbF",
+"iqv4ksqVrf","2DREs4dEz6","aDGtSOUYuF","580YDFPfSE","S77LH55rfB","euZA5l83Ud","Nxx9VuPX7G","IBe8kuN6r3","9eoRcgIYvE","kZANmNo0Qb",
+"U3yw5wDajX","ksJbyAgJHQ","UmaEvTwano","TCgPp24ARF","m4bxUAIYUu","0h1b1ECMvU","StlDJMmsIo","dpe1vhe9IA","zFgtBVLTy6","MojnPHRxd8",
+"yToGW8TxD7","h1zcHFhtgl","KZamHlweGy","Cfgr3s4786","QnJ1S5IhmG","nnP8ohi5X7","kZANm6q6L9","ru4UGfaHir","uN6r3AmdQd","07n1cIjTwP",
+"taOXKGSQwj","NAFuwLbRTH","5iGN5hUTw7","lCMxy45cIH","mX2GEokgRi","FcWrWGv3Fq","lm0pDvOqCE","okgRiWPmlx","pmeCdEoToP","2NslmAkKTk",
+"ulk411j5L8","taOXKzY1GY","v8yFNFLsph","5ZaEzZUnqt","3weIFru4UG","SWfouzQt6Q","vkCHHtvdkD","fLNg8BGaQY","iqv4kcShY2","618Di4dEz6",
+"lCMxyK20wK","14FLRs93Ml","fFDrJvOqCE","5iGN5vLsmS","9y4lwO3iyQ","KZamH55rfB","KASQ8s7Mxk","fqypys7Mxk","zz4ZUtAOsr","zmLYDCxVEf",
+"OHaBzQClRL","S77LHB3qem","cL0aEqaofN","hUTw7hYBCK","Cfgr3AXpwE","lpF6WChuy3","L7cGcbrhlQ","RpBQmfcJOy","SmGzvSjskQ","D6rByThjNn",
+"GXdoHUmaEv","M3zXLuPX7G","s93Mlm4bxU","YjB9t8xEKz","s93Mliqv4k","Chuy3faHir","NOHszjiVBP","vOqCEfqypy","4dEz6d7vjM","okgRiqaofN",
+"Cp3mZ7fKYU","7Ow5Cd7vjM","h1zcHogLgc","h1zcH9XyT9","Chuy37Ow5C","2Yz7EpvgjS","tvdkDOUqFM","tuDySjfREu","n8pJ9RpBQm","lCMxyQChxs",
+"FGzgpECMvU","9rlg9iqv4k","ix74rWMiS3","gtCA5QClRL","QbxXct98iW","blLA9LbRTH","ZuDtDLbRTH","4W0TlBCxeC","jtn0Xhe9IA","RzaZA3otm6",
+"ni2v1MaJQs","gjUTuQssNC","3weIFprNT6","9XyT9s93Ml","2ZHdkpvgjS","wiHrZQClRL","AOgEe8cVD3","hUTw7cL0aE","uupzk5Namm","e6e4zcL0aE",
+"Pb1paYf2Ec","I7p2aJ2mQi","Ta8f6QChxs","Dz1R3lViBv","gjUTun8pJ9","FPfSEguMb8","BbwgA9iGoT","45cIH0BmCy","GXdoH5VZjS","Cfgr3pmeCd",
+"x3LDeGWqqX","xXTI4Yw2oU","TCgPpYf2Ec","yEfy9U3yw5","FVMxonFqik","SWfouzmLYD","VBjhziqv4k","aez9yQssNC","GrDg7DG4sT","ni2v1AIYUu",
+"BbwgA14FLR","Yw2oUpWiOs","07n1c0Wr5y","FLsphZv7z0","v8yFNQClRL","tlILtsuY4x","StlDJM6qcG","EdBKc8FmFH","G1RhSRmDcr","EOE1o8cVD3",
+"NAFuwCK5W7","ECMvU2Nslm","PYBf4hYBCK","D6rBynnP8o","CxVEfFVMxo","s93Ml1v5hH","FnPFBFPfSE","FxX9qZUnqt","cShY20h1b1","XflUqlCMxy",
+"0PktIRzaZA","Mm8sipFrrl","kB5nPuLtKs","M6qcGAgJHQ","Z4I1vZ4I1v","e6e4z9rlg9","zqH0WQnJ1S","X6PinTa8f6","24ARFFFDui","uPX7Gru4UG",
+"FcWrWdQ586","AkKTkP6bcg","lH1ktru4UG","29QAzZJTXH","he9IAv1Hln","M3zXLfLNg8","8U2nUfLNg8","suY4xlXFOB","JkzUnix74r","v8yFNQnJ1S",
+"tvdkDlsQGo","e6e4zix74r","h1zcHAgJHQ","RkQkerhl0J","jtn0X1v5hH","Q6hMCM3zXL","CNHmvHRxd8","VNCPdtaOXK","SbRYyQssNC","VNCPd7fKYU",
+"24ARFuLtKs","9y4lwpWiOs","v2eC3dQ586","YOfrYZhwG1","MK07YNcICA","0KyfsAOgEe","W3VFH8xEKz","S77LHNOHsz","zQt6Qv1Hln","tvdkDuPX7G",
+"RzaZAVIlwP","5VZjSUlU3M","XyPZNzHF1q","dhSuHSbRYy","gjUTuKASQ8","Ul4a1OxWIH","RsQUqmz8gx","0ao3loVQp6","cL0aEDz1R3","DcpWBxXTI4",
+"Uvlv4B3qem","Oz8yZ29QAz","ix74rn8pJ9","BFkb8Y1mC0","sx5GlqaofN","jiVBPjeskS","fLNg8d7vjM","VBjhzCqqaD","aez9ysuY4x","EdBKc5Mg9r",
+"e6e4zfFDrJ","MezSWPb1pa","he9IAG1RhS","RACujStlDJ","nnP8oO3iyQ","fFDrJ7fKYU","WDVWJmX2GE","NcICAIn3NS","DQimp3weIF","bZLvSIn3NS",
+"1LB1LHP433","bZLvSJRJQB","6q6L98TxD7","8RCUAqaofN","uoStwn1pmO","uTacx0Kyfs","7fsYMDG4sT","vLsmSpFrrl","iB08lWreyP","2ZHdkjtn0X",
+"gtCA5ThjNn","Oz8yZ9y4lw","ru4UGEdBKc","qaofNcL0aE","2hEEUDQimp","8FmFHb29RJ","yofH329QAz","MojnPpmeCd","CK5W7FFDui","WMiS3MmKGJ",
+"Ta8f6NhXdu","EdBKcTa8f6","5nmWvgtCA5","55rfBwDajX","sx5Gls4786","pAhR1OUYuF","No0QbF6PT2","5Mg9rblLA9","pAhR1GWqqX","ru4UGSs0Zu",
+"8TxD7guMb8","Mm8si64s8N","HP433s4786","ECMvUiwzGk","Gv3FqBpYhV","vkCHHBGaQY","1j5L8iwzGk","tl72WaFFss","yToGWAOgEe","IKxdLv8yFN",
+"jSjS3nlaBy","In3NSGv3Fq","4QMc9uAWyp","NAFuwNhXdu","okgRie6e4z","KZamHfLNg8","LbRTH3otm6","mX2GETXQ0Z","4dEz6QChxs","RACujxReec",
+"CdyBVUlU3M","VLTy648cHL","hE1Qll83Ud","tlILtTa8f6","VjCZqdjsrv","ReKEW0PktI","VBjhz4W0Tl","6q6L9FnPFB","cmXIXCNHmv","Dz1R38TxD7",
+"xXTI4aDGtS","5IhmG2DREs","dQ586wiHrZ","mX2GEC2Irc","Y1mC048cHL","QChxs9iGoT","ulk41soy9t","QChxsUlU3M","0h1b155rfB","M3zXLuZPqg",
+"IBe8ktvdkD","Nxx9VBGaQY","SmGzvlpF6W","UmaEvHRxd8","14FLRjtn0X","JRJQBUmaEv","Oz8yZuPX7G","kB5nPX6Pin","9y4lw9eoRc","0YAGHGXdoH",
+"l83UdjiVBP","hYBCK9y4lw","NhXduWmadA","Qworu1LB1L","blLA9NOHsz","U3yw57X3uy","lkMUAe6e4z","mX2GEDz1R3","WreyPgf8rI","VerEA64s8N",
+"lj07Qfqypy","8xEKzvLsmS","Yh1hFeuZA5","O3iyQpv0i7","yofH3dQ586","ogLgcB3qem","D6rByRzaZA","uN6r3NAFuw","Yw2oUksJby","uQIczJIqXi",
+"ru4UGtl72W","i3pyddmoS7","hYBCKFGzgp","Chuy307n1c","CdyBVEOE1o","zY1GYEOE1o","qQxHPWDVWJ","6AFT0WPmlx","F6PT2MaJQs","618DifaHir",
+"FjHXRuLtKs","JRJQBF6PT2","mz8gxTCgPp","FjHXRCp3mZ","VLTy6NhXdu","RkQkeiB08l","5iGN5gjUTu","9rlg9POUYS","Q6hMClm0pD","6q6L98RCUA",
+"l83UdiwzGk","BGaQYfFDrJ","7fsYMSmGzv","uvf7ATa8f6","4QMc9aL6AJ","CIShGEoToP","TCgPpJ2mQi","FwEJzFGzgp","QWxoTdmoS7","2Yz7ExXTI4",
+"n1pmO55rfB","dhSuHi3pyd","zz4ZUAIYUu","FnPFB07n1c","ydG8UJXljW","qaofNRzaZA","ThjNnIn3NS","d85a9h1zcH","tjQxsb29RJ","pAhR10PktI",
+"ZzJHWRmDcr","sx5GllweGy","xciqpxXTI4","4dEz6mz8gx","blLA9VLTy6","fmIK12TRI7","azIWpOUYuF","tjQxs9y4lw","GrDg78xEKz","fFDrJcmXIX",
+"gdQsScL0aE","yEfy9FVMxo","suY4xy94nw","qUJMdlkMUA","RkQkeHfyNQ","pvgjSNAFuw","Yf2EcWDVWJ","ksJbyZhwG1","lsQGorhl0J","LewvMRACuj",
+"lXFOBOz8yZ","t59lRnnP8o","RsQUqL7cGc","FPfSENAFuw","fcJOyP6bcg","nFqikNcICA","zbIYYy94nw","hUTw7GWqqX","Mkgy8MaJQs","kZANmDLhzM",
+"gIYvEzHF1q","ru4UG9rlg9","0h1b1BGaQY","HlUbF9rlg9","uLtKsBGaQY","WmadAMezSW","zz4ZUe6e4z","618DizbIYY","HlUbFlkMUA","d7vjMk85Ae",
+"v2eC3M3zXL","2Yz7EpiJSk","jtn0XxReec","6AFT0IKxdL","8U2nUuupzk","7fsYMlj07Q","POUYSbrhlQ","lViBvwDajX","dhSuHIKxdL","StlDJIjTwP",
+"Fhtgl07n1c","blLA9Y1mC0","tl72WgtCA5","0h1b1jfREu","yluBx14FLR","n8pJ9oGu6x","Gv3FqYw2oU","rhl0JbZLvS","5ZaEzru4UG","SjskQQnJ1S",
+"gdQsStl72W","e6e4zpWiOs","dpe1vStlDJ","C2IrcbZLvS","bgJAz6AFT0","GSQwjeuZA5","guMb8DcpWB","aL6AJ7X3uy","BbwgAlkMUA","2hEEURxrsm",
+"2NslmHlUbF","taOXKwDajX","KsjRKoQ87r","UmaEvtjQxs","zFgtBHP433","4W0Tluvf7A","5IhmGhi5X7","NAFuw4QMc9","8U2nURBhp0","Vprf20PktI",
+"CqqaD2TRI7","cQOnvDcpWB","NAFuwFxX9q","yofH3QssNC","Zv7z0s7Mxk","QWxoTcShY2","prNT6uoStw","64s8N9rlg9","IKxdLOz8yZ","iKqhruupzk",
+"AXpwEpvgjS","zz4ZUvOqCE","QssNCiB08l","FwEJzQWxoT","gIYvEG1RhS","M3zXLFjHXR","RmDcrs7Mxk","MmsIo48cHL","ydG8UoVQp6","lXFOB8RCUA",
+"ciuWz5Drn0","2ZHdkjiVBP","J2mQifcJOy","BbwgA5VZjS","CIShGRxrsm","FcWrWChuy3","Dz1R3618Di","3weIFfFDrJ","UlU3Mi7WMQ","zY1GYC2Irc",
+"mz8gxEoToP","9XyT9GWqqX","BpYhVRxrsm","FNYIMulk41","uAWyppT8wu","IjTwPRACuj","DLhzMgIYvE","5ZaEz618Di","QClRL2Yz7E","VBjhzZhwG1",
+"VNCPdDcpWB","cmXIXyToGW","16lHcQbxXc","uJScX5IhmG","AIYUu9y4lw","AXpwEZzJHW","J2mQiuoStw","oQ87rMmKGJ","NhXduZuDtD","9XyT9zqH0W",
+"YOfrYcL0aE","5Drn0Yw2oU","C2Irc3weIF","cmXIXAIYUu","dmoS7fLNg8","EOE1ooVQp6","yEfy9K20wK","KsjRKsqVrf","HfyNQMmsIo","JkzUnI7p2a",
+"jS1ajNhXdu","FGzgpbZLvS","F6PT2tlILt","5ZaEzlweGy","FnPFBfmIK1","uupzkazIWp","azIWpM3zXL","pv0i7uJScX","zQt6QQ6hMC","CIShGVIlwP",
+"lweGynFqik","Ul4a1QbxXc","WmadAzbIYY","tlILtPb1pa","tuDySblLA9","yEfy9he9IA","nFqik3otm6","lViBvyEfy9","K4GS87hyVv","v1Hln9eoRc",
+"2Yz7EDLhzM","IKxdLGrDg7","Nxx9Vulk41","VNCPdMojnP","tvdkDlj07Q","Q6LixZuDtD","JIqXisqVrf","zz4ZUuQIcz","W7cTsblLA9","7lUXZogLgc",
+"Mm8siaFFss","FFDuin1pmO","wiHrZQworu","MK07Y9XyT9","zFgtBQworu","xXTI4NOHsz","m4bxUMGlTF","sx5GlRsQUq","RmDcr24ARF","pv0i7aDGtS",
+"JJs5mMaJQs","zz4ZUuvf7A","nnP8oFLsph","24ARFYh1hF","580YDbZLvS","5VZjSReKEW","uZPqgxXTI4","5nmWve6e4z","GSQwjSWfou","jzUqRAmdQd",
+"AXpwEzmLYD","55rfBEdBKc","QssNC5ZaEz","okgRiK20wK","580YDfaHir","4W0TlY1mC0","VIlwPt59lR","k85AeG1RhS","7lUXZWaWsv","StlDJksJby",
+"lCMxyFLsph","4QMc9cmXIX","POUYSxReec","b29RJtuDyS","kB5nPo8Uyd","No0QbBpYhV","Pb1palj07Q","7lUXZnlaBy","ZzJHWcShY2","DG4sTHlUbF",
+"mz8gxn1pmO","fcwDai3pyd","AkKTk5Mg9r","FPfSE8TxD7","VLTy6hE1Ql","WreyP16lHc","suY4xF6PT2","RmDcrDG4sT","cL0aEJXljW","M6qcGQWxoT",
+"gdQsScShY2","RsQUqyToGW","i7WMQtAOsr","CqqaDHfyNQ","azIWpuvf7A","GXdoHhUTw7","MezSWpWiOs","uLtKsRpBQm","UlU3Muvf7A","GrDg7GWqqX",
+"QYxC0VjCZq","KsjRK580YD","3weIFpWiOs","NhXduOUYuF","ciuWzsuY4x","EdBKcD6rBy","8RCUAVerEA","0h1b1s93Ml","prNT6HlUbF","zmLYDFPfSE",
+"0Wr5ytAOsr","GXdoHsoy9t","zmLYDK20wK","IKxdLnnP8o","0ao3lGSQwj","4QMc9J2mQi","oGu6xQ6Lix","ECMvU14FLR","2DREsOHaBz","blLA9Dz1R3",
+"6AFT0Kr8ys","yEfy9S77LH","OxWIHEoToP","9iGoT9GXkX","RmDcrHRxd8","rhl0JQworu","W7cTstuDyS","dmoS7bgJAz","pvgjSAIYUu","iKqhrogLgc",
+"aFFss1j5L8","L7cGc8TxD7","t98iWVLTy6","lm0pDn8pJ9","8U2nUUvlv4","iB08l5iGN5","EoToPiB08l","gjUTuYf2Ec","G1RhSzqH0W","O3iyQk85Ae",
+"55rfBGv3Fq","LDk6f07n1c","jeskSJIqXi","14FLR3weIF","K4GS8X6Pin","14FLRyvOMI","Q6hMCMojnP","P6bcg9rlg9","jtn0XbgJAz","lViBv0YAGH",
+"IRh48YjB9t","tjQxsqaofN","Pb1paI7p2a","Yf2EcfFDrJ","3weIFQChxs","DG4sTMmsIo","Y1mC0sx5Gl","tuDySdmoS7","OHaBz8U2nU","5VZjS5VZjS",
+"ogLgcNo0Qb","bZLvSFcWrW","lViBvVNCPd","JRJQBuQIcz","zFgtBtvdkD","5IhmGNxx9V","soy9tBCxeC","Fhtglt98iW","KsjRKzY1GY","oVQp6dpe1v",
+"cmXIXHfyNQ","faHir5Drn0","OxWIH29QAz","aDGtSgf8rI","oQ87rhSSvQ","8xEKzHlUbF","a00b5lsQGo","uZPqgEOE1o","4dEz62hEEU","NAFuwi7WMQ",
+"FhtglCIShG","pv0i7VNCPd","lsQGofaHir","piJSkxciqp","MK07Yru4UG","In3NShi5X7","y94nwJRJQB","qQxHPOUqFM","QClRLhUTw7","yvOMIlsQGo",
+"tl72WFnPFB","BpYhV8U2nU","yluBxUlU3M","6q6L9jeskS","nlaByFGzgp","Ul4a10Wr5y","7X3uyazIWp","AkKTkBpYhV","AXpwEAIYUu","cQOnvUmaEv",
+"cShY2gdQsS","3otm6LewvM","EdBKcciuWz","FPfSE9XyT9","rz7UtQYxC0","M3zXLfcwDa","kZANmfcwDa","nlaBys93Ml","TXQ0ZuN6r3","CK5W7uPX7G",
+"Uvlv4he9IA","BFkb8zz4ZU","MK07YuoStw","zqH0WtlILt","FNYIM580YD","8TxD7BFkb8","fLNg8QnJ1S","yToGWK4GS8","2TRI7zbIYY","tvdkDt98iW",
+"Zv7z0jtn0X","cQOnvnFqik","1LB1Lt98iW","RkQkeUl4a1","d85a9F6PT2","zmLYD3otm6","3weIFni2v1","W3VFHi3pyd","1v5hHnlaBy","b29RJs4786",
+"FLsphlViBv","DLhzMksJby","ZzJHWlm0pD","Yw2oUNxx9V","YjB9t0h1b1","2DREs24ARF","bZLvSVNCPd","fLNg8NhXdu","IRh48FcWrW","Waim6lkMUA",
+"2ZHdktvdkD","2Yz7E9rlg9","SjskQtaOXK","QYxC0vLsmS","8hJdtrhl0J","IjTwPyvOMI","rKDLJs93Ml","XflUqMmKGJ","XyPZNsuY4x","48cHLksJby",
+"F6PT25Drn0","W7cTs29QAz","EOE1oFwEJz","FNYIMm4bxU","IBe8kCIShG","IBe8kFjHXR","zQt6QIjTwP","BbwgAMmsIo","VIlwP7lUXZ","vLsmS2TRI7",
+"580YDzmLYD","brhlQJIqXi","IBe8kksJby","bgJAzsx5Gl","C2IrcuLtKs","5ZaEzUlU3M","9GXkX2Yz7E","5drc6v8yFN","ydG8UW7cTs","tvdkD9eoRc",
+"Vprf2he9IA","QClRLmX2GE","0YAGHnFqik","GSQwj8hJdt","GSQwj2hEEU","cShY2BbwgA","oQ87rblLA9","16lHc7hyVv","JIqXipT8wu","KsjRKjSjS3",
+"8RCUAIjTwP","piJSktAOsr","AIYUulCMxy","0Wr5y8U2nU","zQt6QVjCZq","Waim65ZaEz","QChxsBpYhV","d85a9XflUq","8hJdtBpYhV","AmdQdpvgjS",
+"5IhmGJXljW","fLNg8VIlwP","dmoS72Nslm","FwEJzHP433","pAhR1pAhR1","yofH3vLsmS","KZamH8TxD7","uZPqgQworu","qQxHPTXQ0Z","qQxHPW3VFH",
+"8xEKztAOsr","Fhtglo8Uyd","8FmFHkB5nP","atef2VerEA","dhSuHWreyP","VjCZq0h1b1","OHaBzzHF1q","DG4sThUTw7","cShY2VBjhz","X6Pin5IhmG",
+"k85AecmXIX","vLsmSNxx9V","KZamHAXpwE","OUYuF9GXkX","NcICANAFuw","cShY2D6rBy","sqVrft98iW","DcpWBVerEA","dmoS7vkCHH","CIShG9y4lw",
+"IBe8kpiJSk","vkCHHGrDg7","sqVrf8xEKz","n1pmOrz7Ut","VerEAWDVWJ","0h1b1HP433","atef28cVD3","iB08lMaJQs","SmGzv7hyVv","TwanoOz8yZ",
+"euZA5M3zXL","5Mg9rjS1aj","pFrrlgdQsS","dpe1vRBhp0","o8Uyd8RCUA","8U2nUAmdQd","vOqCEQnJ1S","iwzGkZJTXH","ydG8UVLTy6","O3iyQGWqqX",
+"PYBf4rz7Ut","QssNCG1RhS","GWqqXatef2","GWqqX14FLR","Twano2TRI7","MmKGJFVMxo","GSQwjSs0Zu","Kr8yszY1GY","G1RhSJJs5m","xXTI4Zv7z0",
+"AOgEe9GXkX","YjB9tWPmlx","yofH3VjCZq","Vprf2IKxdL","07n1c0h1b1","uoStwX6Pin","P6bcgZUnqt","yEfy9Fhtgl","Yh1hFRACuj","8U2nUfFDrJ",
+"0h1b1uJScX","o8UydAIYUu","5Drn0jtn0X","yofH35drc6","AkKTkIn3NS","hi5X7oQ87r","aFFss9iGoT","WDVWJfcJOy","uJScXMGlTF","euZA55iGN5",
+"ogLgchYBCK","soy9t14FLR","RmDcr1v5hH","MmsIotlILt","0ao3lgdQsS","Zv7z0ECMvU","VerEAIBe8k","07n1cni2v1","RxrsmxXTI4","zbIYYprNT6",
+"ZJTXH0Kyfs","yEfy9Oz8yZ","W3VFHJXljW","brhlQ5IhmG","X6PinpFrrl","CNHmvrz7Ut","Oz8yZ1LB1L","azIWpFGzgp","FVMxoMmsIo","lsQGo6q6L9",
+"h1zcHaDGtS","lpF6WzHF1q","jSjS3ECMvU","618Dizz4ZU","RpBQmfFDrJ","zHF1qAgJHQ","M6qcGAIYUu","X6PinzY1GY","14FLRGv3Fq","VIlwP8hJdt",
+"RpBQmfmIK1","VLTy60MR5X","blLA9sx5Gl","rKDLJyofH3","v8yFNaL6AJ","uQIcz7Ow5C","pvgjShSSvQ","pvgjSDcpWB","F6PT2pFrrl","8U2nUfqypy",
+"POUYSPOUYS","Oz8yZ0MR5X","ix74rzbIYY","fLNg8GrDg7","guMb8B3qem","MaJQskB5nP","iB08ls7Mxk","DLhzM5Drn0","qaofNUvlv4","P6bcgWreyP",
+"3weIFRpBQm","uupzkAmdQd","9y4lw0h1b1","lweGy9y4lw","y94nwMK07Y","jfREuFFDui","hSSvQJIqXi","Q6hMCsqVrf","aFFss14FLR","aDGtSmz8gx",
+"ZhwG19rlg9","AgJHQZ4I1v","hSSvQgIYvE","SbRYyWDVWJ","StlDJ8RCUA","prNT66AFT0","uLtKsSmGzv","iKqhrMezSW","rKDLJiqv4k","mX2GE1j5L8",
+"45cIHHP433","KsjRKChuy3","lCMxyKr8ys","LDk6fxciqp","14FLRStlDJ","IjTwPjtn0X","SbRYy29QAz","L7cGc3otm6","G1RhSW3VFH","0YAGHsuY4x",
+"s93MlnlaBy","nFqiklCMxy","EOE1oDQimp","soy9tIn3NS","x3LDeZ4I1v","8FmFHblLA9","0h1b1nlaBy","vkCHHRBhp0","LbRTHP6bcg","xciqpThjNn",
+"MmKGJogLgc","FLsphn8pJ9","d85a9aez9y","xciqpfmIK1","guMb8XflUq","Y1mC0LDk6f","9eoRchSSvQ","QssNCDcpWB","IBe8kJXljW","d7vjMjiVBP",
+"MezSWFGzgp","Yh1hF48cHL","uLtKsuAWyp","lXFOBGXdoH","VIlwPfcwDa","HfyNQgf8rI","8cVD3ciuWz","5Drn0taOXK","DG4sTdhSuH","9GXkXcShY2",
+"MezSWNcICA","ThjNnQChxs","YOfrYpWiOs","5IhmGBCxeC","S2DfuPb1pa","KASQ8IKxdL","9y4lwIn3NS","5Drn0uQIcz","BFkb8nlaBy","uQIczRkQke",
+"Oz8yZoVQp6","hi5X75Drn0","3weIFjzUqR","pT8wuGXdoH","CIShG8xEKz","Nxx9VQnJ1S","jS1ajP6bcg","HfyNQF6PT2","Zv7z04W0Tl","YjB9tHlUbF",
+"RsQUqulk41","5VZjSYf2Ec","uupzkWDVWJ","yvOMI8xEKz","2ZHdks4786","zY1GY8FmFH","7lUXZ618Di","8U2nUrhl0J","pFrrli3pyd","Yh1hFB3qem",
+"0BmCydhSuH","a00b5Ss0Zu","J2mQiv2eC3","d7vjMWaWsv","djsrvtjQxs","9y4lwGv3Fq","jS1ajMK07Y","S77LHsqVrf","OUqFMYOfrY","3otm6iB08l",
+"Nxx9V45cIH","vLsmS8RCUA","55rfB8RCUA","BGaQYNhXdu","FNYIMJJs5m","7ku1plsQGo","NOHszVNCPd","LbRTH2TRI7","Yw2oUUmaEv","gdQsS0ao3l",
+"ogLgcAOgEe","FjHXRazIWp","uLtKsoVQp6","SjskQuQIcz","zQt6Qulk41","Fhtgl1v5hH","lViBvXyPZN","a00b5MezSW","KZamHo8Uyd","kB5nPuvf7A",
+"NhXduFFDui","7fsYMnlaBy","FjHXR8TxD7","580YD5Mg9r","HzZT8OUqFM","29QAzDcpWB","oQ87rtlILt","v8yFNpFrrl","Kr8ysDQimp","brhlQjeskS",
+"v2eC34dEz6","d85a94dEz6","AXpwEguMb8","okgRitaOXK","fFDrJReKEW","he9IAM3zXL","Uvlv4DcpWB","0BmCy3otm6","rhl0JZUnqt","5Mg9rru4UG",
+"bZLvSQ6Lix","uJScXRsQUq","Ss0ZugjUTu","C2IrcM3zXL","atef2QssNC","Kr8yscmXIX","S77LHnlaBy","lViBvEoToP","hSSvQvOqCE","BGaQY580YD",
+"okgRipvgjS","yvOMIZzJHW","580YD5nmWv","SmGzvd7vjM","16lHcSjskQ","ZuDtDBGaQY","hSSvQGXdoH","QYxC0uupzk","2TRI70PktI","jfREuzbIYY",
+"L7cGcBbwgA","cQOnvsqVrf","2Yz7EZhwG1","pAhR1Kr8ys","8cVD3cmXIX","I7p2aoGu6x","JKWYRdmoS7","5drc6No0Qb","DcpWBjSjS3","uN6r31j5L8",
+"GSQwjMmsIo","4W0TlcL0aE","8TxD7qaofN","K20wKChuy3","K4GS8tvdkD","IBe8kHRxd8","Ul4a16q6L9","RkQkeMmsIo","uN6r3azIWp","he9IACK5W7",
+"Q6hMCUl4a1","0BmCyhUTw7","5Drn00h1b1","O3iyQ29QAz","ZhwG1XyPZN","he9IAzmLYD","VIlwPUl4a1","zFgtBs93Ml","uoStwtvdkD","x3LDeJRJQB",
+"yToGWaez9y","TwanoFLsph","hUTw7bgJAz","WaWsv8RCUA","07n1czz4ZU","AIYUuZuDtD","ZJTXHOUYuF","F6PT2NcICA","lH1ktaez9y","QYxC0lweGy",
+"IKxdLhYBCK","h1zcHuvf7A","WaWsvPb1pa","FGzgpNAFuw","gIYvEv1Hln","iqv4kpvgjS","euZA5iB08l","x3LDeIBe8k","pmeCdTCgPp","yofH3GrDg7",
+"MezSWjSjS3","ix74rqaofN","RkQkedhSuH","K20wKNOHsz","KsjRKprNT6","1j5L8IjTwP","BFkb82Nslm","0h1b1WPmlx","fcJOyVLTy6","0h1b15Drn0",
+"FhtglRpBQm","VBjhzkZANm","FwEJz64s8N","5IhmGMm8si","64s8NRBhp0","taOXKdpe1v","1v5hHi3pyd","HRxd8h1zcH","ogLgc55rfB","s93Ml4W0Tl",
+"e6e4zMm8si","dmoS7euZA5","zFgtBogLgc","pvgjSnFqik","HzZT8hUTw7","dhSuHVprf2","cL0aE5Drn0","jeskS6q6L9","RACujDLhzM","tuDySYf2Ec",
+"d85a95Namm","ulk41v1Hln","I7p2azHF1q","4W0Tl2ZHdk","D6rByoVQp6","qQxHPhUTw7","FFDuiYw2oU","x3LDe0PktI","K4GS8t59lR","EOE1okB5nP",
+"5drc6i7WMQ","Ta8f6Q6Lix","mz8gxJkzUn","Gv3FqNo0Qb","BGaQY3weIF","5NammB3qem","lj07QgtCA5","h1zcHIBe8k","h1zcH24ARF","5Mg9rcL0aE",
+"X6Pinfqypy","Mm8siVBjhz","iB08loVQp6","0h1b11LB1L","HfyNQyToGW","oGu6xv8yFN","pmeCdzQt6Q","uJScX0h1b1","AIYUuRBhp0","AIYUuCdyBV",
+"ciuWzuvf7A","hYBCKsoy9t","D6rBy48cHL","MK07YoVQp6","oGu6x9eoRc","lj07QFNYIM","gjUTuK20wK","euZA5ECMvU","ni2v1oGu6x","2NslmqUJMd",
+"1v5hHcL0aE","suY4xokgRi","14FLRlweGy","jtn0XEdBKc","prNT6LbRTH","OUqFMVprf2","LewvMSjskQ","XyPZNFVMxo","In3NSUvlv4","W7cTsLDk6f",
+"nnP8oJXljW","7hyVvhe9IA","Uvlv4jzUqR","C2IrcHzZT8","64s8NaDGtS","OUqFMwiHrZ","Gv3Fq9iGoT","lXFOBIjTwP","brhlQuN6r3","WDVWJ6q6L9",
+"uPX7G6AFT0","FLsphvkCHH","hUTw7SmGzv","tlILtZv7z0","LewvMsx5Gl","0BmCyaL6AJ","uN6r3fFDrJ","9iGoTqUJMd","FFDuiFxX9q","taOXKU3yw5",
+"JRJQBPb1pa","Yf2Ec5drc6","RzaZAEoToP","djsrvzHF1q","k85AeprNT6","FwEJzYh1hF","UlU3MAXpwE","lm0pD3weIF","GWqqX5Namm","qUJMd5ZaEz",
+"EdBKcC2Irc","ZUnqtFFDui","StlDJHP433","uQIczaez9y","7X3uyQnJ1S","DcpWBJXljW","WreyP1LB1L","OHaBz9XyT9","HlUbFPYBf4","v8yFNMaJQs",
+"8xEKzDG4sT","jS1ajL7cGc","GrDg7dmoS7","8hJdta00b5","blLA9GrDg7","SjskQqaofN","0KyfslH1kt","uoStwK20wK","FjHXRe6e4z","BbwgAAgJHQ",
+"UlU3M07n1c","Gv3FqnlaBy","B3qemyToGW","GXdoHW3VFH","L7cGcZ4I1v","FcWrWFnPFB","6q6L9zY1GY","jfREujzUqR","I7p2aStlDJ","0PktIFcWrW",
+"WaWsvAmdQd","S77LHvLsmS","K20wKStlDJ","C2IrcFGzgp","SWfou6q6L9","W3VFHn8pJ9","NhXdu24ARF","9GXkX7X3uy","IjTwPjSjS3","QChxsd7vjM",
+"ogLgcbrhlQ","8hJdtbrhlQ","4W0TlydG8U","W7cTsX6Pin","QbxXcciuWz","yvOMIciuWz","azIWpciuWz","9rlg9QWxoT","POUYSa00b5","ZJTXHmX2GE",
+"vkCHHVIlwP","OUYuFDcpWB","kB5nPtjQxs","5IhmGeuZA5","9eoRcaez9y","rhl0JD6rBy","EOE1oprNT6","lj07Q5Namm","XyPZN618Di","UmaEvM3zXL",
+"k85AetjQxs","fmIK14W0Tl","d7vjMzbIYY","FcWrWtjQxs","gtCA5cShY2","7X3uy0ao3l","EoToPIn3NS","DG4sTKsjRK","GWqqX0ao3l","2ZHdkKASQ8",
+"WaWsvJRJQB","0PktIzQt6Q","EoToP0PktI","qaofNLDk6f","GXdoH14FLR","pmeCdOz8yZ","2DREsK20wK","vOqCEzbIYY","Yw2oUprNT6","zz4ZUCfgr3",
+"2NslmD6rBy","8U2nUksJby","ReKEW0Wr5y","uJScXvLsmS","FLsphd85a9","14FLR0BmCy","lXFOBIBe8k","zHF1q45cIH","L7cGcFLsph","0YAGHqUJMd",
+"In3NSt98iW","MojnPZhwG1","yluBxwDajX","uPX7GFPfSE","jiVBPJ2mQi","F6PT2UlU3M","zQt6QDLhzM","4dEz62Yz7E","DLhzMK4GS8","t59lRoGu6x",
+"WreyPLbRTH","K20wK5VZjS","8xEKzb29RJ","LbRTHDLhzM","jS1ajb29RJ","nlaBy24ARF","pWiOsl83Ud","MmsIouAWyp","VLTy6ydG8U","tAOsrni2v1",
+"8FmFHtvdkD","Qworuo8Uyd","5Drn0iKqhr","6q6L9gtCA5","lpF6WGrDg7","fcJOytaOXK","hYBCKSWfou","1LB1LWPmlx","GXdoHF6PT2","n8pJ9taOXK",
+"brhlQ0h1b1","QClRL16lHc","LDk6fG1RhS","bZLvSP6bcg","d85a9iKqhr","16lHcMojnP","gtCA5No0Qb","xciqpuoStw","VBjhza00b5","uupzkUmaEv",
+"Kr8ysK20wK","wDajXCfgr3","AgJHQjSjS3","7fKYU0Wr5y","v1HlnfFDrJ","atef27fsYM","1j5L8o8Uyd","lH1ktEOE1o","s7MxkmX2GE","sqVrffcJOy",
+"euZA5D6rBy","fcwDaYOfrY","GrDg7Twano","ZUnqtCK5W7","kB5nPKZamH","Q6LixsqVrf","VLTy6gf8rI","cL0aE3otm6","VerEApmeCd","Dz1R3uAWyp",
+"StlDJuTacx","TCgPpQClRL","lj07QhUTw7","lXFOB0YAGH","GrDg7S2Dfu","TXQ0ZpFrrl","ZUnqtKsjRK","rz7Utt98iW","e6e4zvkCHH","lkMUAJ2mQi",
+"dhSuHOHaBz","WDVWJVLTy6","SmGzve6e4z","2TRI7ZJTXH","O3iyQMkgy8","m4bxU8TxD7","prNT6Dz1R3","Cfgr3m4bxU","HRxd8MmsIo","9GXkXEOE1o",
+"5Mg9rNAFuw","uQIczOxWIH","nnP8oWaWsv","Q6hMCv8yFN","Chuy3WmadA","0KyfszqH0W","pmeCdXyPZN","sqVrfprNT6","VBjhzydG8U","QssNC8xEKz",
+"pFrrljtn0X","pAhR1OUqFM","S77LHXflUq","5iGN51v5hH","S2DfuQChxs","4W0TlDQimp","fmIK1Q6Lix","aez9yZuDtD","guMb8SmGzv","fcJOyMmsIo",
+"AOgEeFLsph","HzZT8MmsIo","Waim6blLA9","uLtKsSbRYy","Z4I1vKsjRK","uZPqgoQ87r","lH1ktfcwDa","bgJAzXyPZN","RzaZAuLtKs","2DREs1LB1L",
+"gdQsSZv7z0","UmaEvpT8wu","aL6AJDcpWB","45cIHzY1GY","EoToP9iGoT","mX2GEjSjS3","M6qcG6q6L9","pWiOsb29RJ","MGlTFTa8f6","sqVrf8RCUA",
+"xXTI45ZaEz","J2mQiSs0Zu","lCMxyI7p2a","sx5GlgtCA5","pv0i7EdBKc","SmGzvvLsmS","9iGoTRzaZA","45cIHpv0i7","zbIYYZ4I1v","XflUqZhwG1",
+"7X3uy8xEKz","piJSke6e4z","OxWIHokgRi","BbwgATXQ0Z","HfyNQjiVBP","HfyNQqQxHP","POUYSWreyP","okgRiJkzUn","x3LDeFPfSE","ciuWzMkgy8",
+"4QMc97fKYU","yofH3ThjNn","jSjS3sx5Gl","qQxHPblLA9","cmXIXjiVBP","uPX7Gl83Ud","8cVD3Waim6","D6rByFwEJz","P6bcgMojnP","s7MxkFjHXR",
+"gdQsS7fKYU","KASQ8yToGW","EOE1o9GXkX","kB5nPy94nw","MK07YsuY4x","JXljWAgJHQ","VjCZqQ6Lix","lm0pDMaJQs","IRh48LbRTH","cQOnv6q6L9",
+"yEfy91LB1L","bgJAzCK5W7","iB08lhUTw7","t98iWS2Dfu","Y1mC0GWqqX","ksJbynFqik","fFDrJbgJAz","cmXIXSbRYy","ECMvUWDVWJ","mz8gxVLTy6",
+"9rlg97lUXZ","soy9t9rlg9","24ARFru4UG","ReKEWlH1kt","zY1GYCK5W7","ZuDtDdmoS7","o8Uydulk41","ReKEWkB5nP","oGu6xNhXdu","Cfgr38cVD3",
+"LbRTHhUTw7","pT8wu580YD","lm0pDdmoS7","8TxD7zHF1q","v2eC3VNCPd","0h1b1lsQGo","QChxscmXIX","0h1b1BpYhV","zbIYY7hyVv","SmGzvhe9IA",
+"jS1ajPb1pa","Ta8f6HRxd8","0Kyfs7Ow5C","QworuzHF1q","ulk41dmoS7","5nmWvlkMUA","Cfgr3iKqhr","QnJ1S0Wr5y","y94nwSs0Zu","07n1cVprf2",
+"OUYuFNxx9V","iqv4kBpYhV","618Ditl72W","uvf7A0BmCy","5Drn05drc6","PYBf4M6qcG","JXljWs93Ml","J2mQizqH0W","CNHmvIKxdL","RsQUqrz7Ut",
+"nFqik29QAz","8cVD37fKYU","55rfBy94nw","5Drn0jfREu","xReecReKEW","n8pJ9ZzJHW","9rlg9JJs5m","MmKGJo8Uyd","Kr8ys16lHc","yToGWJkzUn",
+"AXpwEZuDtD","iwzGk0Wr5y","I7p2apiJSk","MojnPSbRYy","Ul4a1RzaZA","9rlg9RACuj","L7cGciqv4k","7X3uyzY1GY","EOE1ov2eC3","yofH3dmoS7",
+"zFgtBuJScX","BpYhVzQt6Q","jSjS3RpBQm","KsjRKD6rBy","Cfgr3RACuj","5iGN5MmKGJ","7fKYU0h1b1","EOE1oqaofN","2ZHdkM3zXL","SbRYyRxrsm",
+"fLNg8WPmlx","gjUTuzY1GY","vOqCEgtCA5","hUTw7jS1aj","K20wKJXljW","xXTI4zQt6Q","VLTy6e6e4z","y94nwvOqCE","xXTI4brhlQ","618DiDQimp",
+"IKxdLlkMUA","ZJTXHVprf2","ECMvUWPmlx","tlILtxciqp","jzUqRJJs5m","l83UdbZLvS","JXljWrKDLJ","DLhzMFnPFB","GXdoHNcICA","fcJOy9iGoT",
+"IBe8k3weIF","WaWsvQworu","QWxoTVNCPd","uZPqgCxVEf","VerEA5ZaEz","2hEEUNcICA","lViBvL7cGc","KZamHaDGtS","Chuy3SWfou","K4GS8lpF6W",
+"7X3uyhSSvQ","atef2azIWp","6q6L9W7cTs","sx5GlX6Pin","UlU3MrKDLJ","jS1ajW7cTs","PYBf4Nxx9V","pT8wuzQt6Q","8hJdt3weIF","yEfy9uAWyp",
+"VBjhzYw2oU","pv0i7No0Qb","x3LDes93Ml","fLNg8BFkb8","xciqpRsQUq","29QAzFVMxo","4dEz6W7cTs","ZzJHWlXFOB","XflUqn1pmO","gtCA5LewvM",
+"M3zXL5VZjS","iKqhrAOgEe","VBjhzKZamH","MojnPMkgy8","AmdQdiB08l","W3VFHtjQxs","cQOnvF6PT2","CqqaDCdyBV","8cVD3v8yFN","VjCZqYf2Ec",
+"oVQp6fcwDa","RmDcrksJby","JKWYRCK5W7","lXFOBatef2","pvgjSZUnqt","FnPFBKZamH","9rlg92TRI7","JIqXiPYBf4","JIqXiqaofN","JRJQBdhSuH",
+"i3pydtAOsr","he9IAMkgy8","3weIFLbRTH","aL6AJJJs5m","JKWYRpvgjS","tAOsrNhXdu","BpYhVuupzk","S77LHyluBx","xXTI4JJs5m","uN6r3uvf7A",
+"pv0i78TxD7","ZuDtDksJby","VerEAXflUq","14FLR5iGN5","bZLvS618Di","fcJOyQworu","Pb1paAmdQd","ni2v1SmGzv","Ul4a1580YD","ogLgc2Yz7E",
+"CqqaDt98iW","aL6AJl83Ud","pT8wulj07Q","HlUbFM3zXL","okgRiYf2Ec","pvgjSqaofN","Chuy3fmIK1","lkMUAIBe8k","45cIHZUnqt","5Mg9reuZA5",
+"gtCA5i3pyd","QYxC0yofH3","NcICA5ZaEz","xReec0MR5X","tuDySGWqqX","HlUbFSmGzv","jtn0XKASQ8","0BmCyMm8si","uvf7AMm8si","k85AeVIlwP",
+"RzaZAxReec","QClRL2DREs","FwEJzAmdQd","pT8wulsQGo","0BmCypmeCd","zFgtBI7p2a","PYBf41j5L8","5Mg9rOz8yZ","lCMxyUlU3M","6q6L9C2Irc",
+"d7vjMy94nw","bZLvSG1RhS","faHir8cVD3","lCMxyGXdoH","cL0aEWMiS3","Gv3FqTXQ0Z","7ku1p9eoRc","gIYvEd7vjM","2TRI7Q6hMC","uAWypF6PT2",
+"MmKGJQssNC","Ul4a1RsQUq","kZANmSbRYy","ZzJHWiB08l","9GXkXjfREu","YOfrY8hJdt","faHirHRxd8","QWxoTdpe1v","tl72WlCMxy","ZzJHWStlDJ",
+"iwzGkk85Ae","uZPqgblLA9","0MR5XjSjS3","55rfBCfgr3","7X3uytl72W","Waim6yvOMI","KZamH7fsYM","0ao3l9rlg9","IjTwPdmoS7","pmeCdJXljW",
+"k85AeP6bcg","uupzk14FLR","pvgjSt59lR","fcJOyciuWz","qQxHPzqH0W","jSjS3t98iW","DLhzMAIYUu","fLNg8jiVBP","i3pyduN6r3","iKqhruZPqg",
+"cmXIXDQimp","2NslmQbxXc","tjQxsRxrsm","h1zcHbrhlQ","lpF6WxReec","5nmWvyvOMI","uQIczRmDcr","5Mg9rQ6hMC","iB08lFhtgl","SjskQfqypy",
+"S77LHStlDJ","0BmCyWreyP","euZA5aDGtS","MGlTF8TxD7","3otm6AXpwE","y94nwxReec","HlUbFLewvM","pmeCdCfgr3","CxVEfY1mC0","atef2OUYuF",
+"FwEJzbZLvS","EoToPgIYvE","580YD48cHL","ulk417lUXZ","RACuj0Kyfs","7ku1plm0pD","o8Uyddpe1v","POUYSLDk6f","hUTw7uQIcz","FjHXRbgJAz",
+"WPmlxa00b5","KZamHMK07Y","lj07QGXdoH","BpYhVWaim6","OxWIHyvOMI","Uvlv4mX2GE","K4GS8Dz1R3","okgRiHfyNQ","mz8gxTwano","iwzGkjSjS3",
+"Z4I1vNo0Qb","guMb8HP433","pFrrlRsQUq","yEfy9jeskS","45cIHHfyNQ","AkKTkTXQ0Z","WreyP5Mg9r","lm0pDru4UG","KsjRKUl4a1","D6rByuupzk",
+"5ZaEz7hyVv","s93MlfcJOy","9y4lwJkzUn","Waim6EdBKc","v8yFNFFDui","K20wKlViBv","dhSuHAIYUu","pT8wuIn3NS","nFqikhe9IA","lpF6W0BmCy",
+"Yh1hFhSSvQ","GWqqXyEfy9","lj07Qmz8gx","cShY2ciuWz","4QMc9taOXK","bgJAzAgJHQ","DG4sTMGlTF","5Mg9rQworu","vLsmSOUYuF","8FmFHfcJOy",
+"AmdQdsqVrf","8FmFHUmaEv","qUJMdRpBQm","KZamH9GXkX","atef2nlaBy","TwanoDG4sT","0h1b1QWxoT","24ARFydG8U","uTacxJJs5m","OxWIHCp3mZ",
+"qQxHP580YD","jeskSCp3mZ","1v5hHLewvM","AIYUufLNg8","0PktIuupzk","okgRiFxX9q","WreyPHlUbF","fLNg8piJSk","lm0pDzHF1q","AIYUudmoS7",
+"Pb1pan8pJ9","FPfSEmz8gx","pFrrloGu6x","ThjNnPb1pa","yvOMIjiVBP","QYxC0MojnP","pvgjSMojnP","lm0pDlm0pD","UmaEvIRh48","fqypyy94nw",
+"DQimpZ4I1v","nlaBy5iGN5","tAOsrn1pmO","k85AeCqqaD","pmeCduJScX","JXljW4QMc9","RkQkeQYxC0","sqVrfM3zXL","DG4sTSjskQ","CK5W7zHF1q",
+"0Wr5yGWqqX","CqqaDOUqFM","yofH3uupzk","NAFuwblLA9","DG4sTRsQUq","KZamHfaHir","OxWIHzHF1q","Gv3FqRzaZA","wDajX9iGoT","2hEEUIKxdL",
+"ZUnqtD6rBy","nnP8odhSuH","WDVWJ9rlg9","zqH0WZzJHW","kZANmB3qem","uvf7A1v5hH","9XyT964s8N","MmsIo24ARF","DQimpB3qem","WmadAlsQGo",
+"cQOnvgf8rI","jfREuWaWsv","zFgtB9XyT9","sqVrfWaWsv","SbRYyfLNg8","VNCPdd85a9","MmsIo6q6L9","GSQwjgIYvE","yluBxkZANm","wDajX45cIH",
+"wiHrZ5Mg9r","nnP8o0h1b1","sx5GlVerEA","MmKGJtl72W","uZPqg45cIH","jiVBPl83Ud","suY4xv8yFN","QssNCdhSuH","8FmFHUl4a1","brhlQkZANm",
+"UmaEvTXQ0Z","k85Ae24ARF","xciqpfFDrJ","tjQxsWaWsv","aFFss45cIH","pmeCd5nmWv","Cfgr3gtCA5","KsjRKJJs5m","dQ5860YAGH","sx5Gluupzk",
+"618Di8TxD7","55rfBv8yFN","zmLYD9y4lw","azIWpOz8yZ","TCgPpK20wK","FNYIMokgRi","KASQ8faHir","HfyNQ8RCUA","iB08lEdBKc","a00b5qaofN",
+"In3NSGXdoH","rhl0JdhSuH","jtn0XQnJ1S","nlaBy8RCUA","IjTwPYOfrY","kB5nPBGaQY","mX2GEaDGtS","YjB9th1zcH","a00b5UmaEv","5drc6POUYS",
+"5iGN5lXFOB","pWiOs5Mg9r","tAOsrBbwgA","0BmCyx3LDe","tvdkDDz1R3","64s8NDz1R3","JJs5mNcICA","uJScXLDk6f","h1zcHs4786","UlU3MMGlTF",
+"07n1cuvf7A","TCgPpQWxoT","Nxx9VzY1GY","JKWYRru4UG","XflUq9GXkX","uPX7GkZANm","Zv7z01v5hH","FPfSEOz8yZ","zmLYD6AFT0","45cIHYjB9t",
+"zHF1qBpYhV","wiHrZ8cVD3","NAFuwi3pyd","9y4lwnlaBy","JJs5muPX7G","48cHLFGzgp","d85a97hyVv","ulk41WMiS3","JRJQBTwano","C2IrcnnP8o",
+"RACujxciqp","K4GS88TxD7","blLA9FFDui","yvOMIY1mC0","07n1cAkKTk","DQimpjeskS","iKqhrYh1hF","XflUq7Ow5C","Dz1R3X6Pin","48cHLbrhlQ",
+"ECMvUru4UG","blLA9DG4sT","djsrv48cHL","EOE1oVLTy6","jfREugtCA5","zqH0W8FmFH","VLTy6MmsIo","fcJOyh1zcH","OUqFMSjskQ","lkMUAkB5nP",
+"s4786IKxdL","MezSWIRh48","Mm8sidhSuH","RpBQmFVMxo","uoStwGv3Fq","2TRI7mz8gx","pmeCdhe9IA","IBe8k2TRI7","No0Qbmz8gx","aDGtSHRxd8",
+"jSjS37lUXZ","aDGtSMezSW","8RCUARkQke","gjUTuLDk6f","ECMvUrz7Ut","HzZT8QbxXc","0ao3lKsjRK","BGaQYgIYvE","jeskSwDajX","PYBf4s7Mxk",
+"suY4xJRJQB","0MR5XUl4a1","Zv7z0AIYUu","ydG8Uix74r","U3yw5cL0aE","aez9yzmLYD","QssNCJ2mQi","vLsmSFNYIM","piJSkQ6Lix","RmDcrUmaEv",
+"sqVrfFGzgp","uJScXGv3Fq","7hyVvJKWYR","xXTI49rlg9","BCxeC24ARF","kZANmbZLvS","14FLRCK5W7","jS1ajRkQke","lXFOBbgJAz","Cp3mZ7Ow5C",
+"mz8gxYjB9t","4W0TllXFOB","CK5W7faHir","2ZHdkNAFuw","lXFOBlweGy","uJScXP6bcg","AkKTkpiJSk","9XyT92Yz7E","618Di6AFT0","O3iyQJRJQB",
+"CIShGtlILt","NcICAzz4ZU","B3qemHP433","AIYUu4W0Tl","Ss0ZurKDLJ","fFDrJ8RCUA","5IhmG2ZHdk","9XyT9WDVWJ","2TRI7nFqik","HzZT8MaJQs",
+"Yw2oUkB5nP","kB5nPWDVWJ","lpF6W4dEz6","KsjRK2ZHdk","yvOMIuZPqg","soy9tCdyBV","EOE1os7Mxk","8U2nUpv0i7","LewvMiwzGk","0ao3lNo0Qb",
+"9iGoTLDk6f","JKWYRVBjhz","5nmWvS77LH","oVQp69rlg9","s7MxkCp3mZ","iB08lJkzUn","y94nwCqqaD","QbxXc16lHc","ydG8UIKxdL","jiVBP55rfB",
+"9rlg9No0Qb","9XyT9HfyNQ","uZPqgaez9y","aez9yZhwG1","8hJdt4W0Tl","SbRYy5drc6","POUYSd85a9","lpF6W9GXkX","jS1aj29QAz","B3qempFrrl",
+"VIlwP45cIH","zbIYYFVMxo","ZJTXHG1RhS","AgJHQDz1R3","Pb1pamX2GE","ZzJHWVBjhz","s93MlX6Pin","gf8rId85a9","8FmFHCK5W7","fmIK1VIlwP",
+"gjUTueuZA5","U3yw5GSQwj","lpF6WK20wK","7lUXZTa8f6","b29RJ5VZjS","zmLYDdmoS7","6AFT0Cp3mZ","7lUXZ7ku1p","lkMUAjeskS","piJSkfcJOy",
+"taOXKfaHir","ReKEWEoToP","OxWIHJJs5m","fqypyAkKTk","2Yz7ENxx9V","gf8rI07n1c","CdyBVJKWYR","JKWYRI7p2a","ECMvUFjHXR","S2DfuUl4a1",
+"AXpwE6AFT0","gjUTutlILt","5iGN50Kyfs","rhl0JfLNg8","CqqaDS77LH","t59lR6AFT0","ydG8UGXdoH","prNT6Mm8si","OxWIH0YAGH","RpBQmFxX9q",
+"O3iyQRACuj","o8UydtlILt","MmKGJ29QAz","WDVWJksJby","6q6L9FcWrW","S2DfuL7cGc","8hJdt0Wr5y","YjB9ttaOXK","RxrsmyluBx","tAOsrvkCHH",
+"9rlg9tl72W","hE1QluTacx","fcwDaFPfSE","GSQwjhe9IA","OUYuFpmeCd","jfREuZhwG1","pWiOsL7cGc","W3VFHdQ586","ulk41Gv3Fq","gf8rIhe9IA",
+"ciuWzzz4ZU","jSjS3v2eC3","StlDJfqypy","pmeCdjtn0X","jiVBPAgJHQ","NAFuwBFkb8","S77LH2ZHdk","ix74rFjHXR","iwzGkUl4a1","VIlwPEdBKc",
+"Vprf2WreyP","0h1b1FFDui","BGaQYEoToP","wiHrZxReec","oGu6xwDajX","MGlTFksJby","tl72W618Di","4QMc9RsQUq","fcJOyfLNg8","QYxC0uAWyp",
+"faHir5IhmG","5iGN5618Di","s4786jfREu","hE1Ql9GXkX","8RCUACfgr3","uvf7AZUnqt","ydG8UxReec","Ul4a1tAOsr","K4GS8s93Ml","5iGN5ZzJHW",
+"OUqFMru4UG","SmGzvuoStw","hE1QlK20wK","v1HlnStlDJ","lXFOBM3zXL","JkzUnJ2mQi","StlDJFFDui","i7WMQLewvM","1v5hHFVMxo","he9IAd85a9",
+"qQxHPlm0pD","pmeCdOHaBz","hUTw7RmDcr","JRJQBKZamH","jeskSEoToP","14FLRe6e4z","F6PT22Yz7E","lpF6WAIYUu","uoStw8xEKz","taOXK16lHc",
+"JXljWCp3mZ","Chuy3tAOsr","zbIYY5iGN5","t98iWcmXIX","zz4ZUQClRL","5nmWv5IhmG","9y4lwh1zcH","9XyT9VNCPd","FcWrWuJScX","9GXkXfcwDa",
+"7Ow5CYw2oU","OHaBzF6PT2","uJScX2DREs","DG4sTCfgr3","F6PT2uN6r3","o8UydKZamH","Mkgy8MmKGJ","xXTI4faHir","KZamHyofH3","5Mg9rJ2mQi",
+"ksJbyzqH0W","uLtKsGSQwj","rhl0Juupzk","x3LDe7X3uy","Ss0ZuFnPFB","IjTwPtaOXK","HlUbFguMb8","wiHrZZhwG1","yvOMIfmIK1","ksJbyCp3mZ",
+"VNCPd9XyT9","jS1ajPYBf4","JRJQBCIShG","d7vjM0ao3l","DG4sT2hEEU","Rxrsm0PktI","RxrsmZv7z0","piJSky94nw","7lUXZQWxoT","hi5X7ZzJHW",
+"9XyT9i3pyd","DLhzMZ4I1v","S2Dfutl72W","Ss0ZublLA9","K4GS8HP433","pv0i7hUTw7","Oz8yZDcpWB","lH1kt9GXkX","gf8rIpv0i7","hUTw7lCMxy",
+"Chuy3ogLgc","piJSkYw2oU","hYBCKmz8gx","4QMc9y94nw","0MR5X4QMc9","iwzGkuupzk","pFrrle6e4z","KASQ8VLTy6","BFkb8uupzk","ZhwG1jtn0X",
+"Cp3mZgdQsS","oQ87rOUqFM","24ARFyofH3","n8pJ9K20wK","9eoRcuvf7A","BFkb86AFT0","F6PT2VjCZq","IRh48GSQwj","8hJdt2Yz7E","VerEAMmKGJ",
+"3weIFuLtKs","16lHcW3VFH","RpBQmuQIcz","fcwDaFVMxo","bgJAzWreyP","fqypyD6rBy","uN6r3X6Pin","NAFuwZJTXH","uPX7GMK07Y","n1pmO3otm6",
+"fqypya00b5","MaJQss7Mxk","hUTw79XyT9","WPmlxgf8rI","hUTw7MGlTF","uTacxMojnP","8xEKzFLsph","RxrsmMaJQs","StlDJbZLvS","1v5hHl83Ud",
+"ru4UGtvdkD","fLNg8Cp3mZ","9GXkXoGu6x","IjTwPhSSvQ","tl72WQClRL","blLA9uLtKs","ZhwG1tuDyS","Yh1hFxciqp","IBe8kiB08l","8FmFHjiVBP",
+"lsQGo7lUXZ","vkCHHzqH0W","dhSuH8TxD7","7ku1p2TRI7","GrDg7pWiOs","Dz1R3FjHXR","AgJHQLewvM","zQt6QvLsmS","zz4ZUn1pmO","LDk6flH1kt",
+"mz8gxSWfou","0MR5XbrhlQ","Cp3mZHzZT8","5ZaEzb29RJ","8TxD707n1c","GWqqX6q6L9","NhXduXyPZN","s478616lHc","v8yFNZv7z0","tvdkDgtCA5",
+"ZUnqtS2Dfu","NhXduCp3mZ","TwanoAgJHQ","TXQ0Z7hyVv","SmGzvzmLYD","taOXKtuDyS","IjTwPWaWsv","FnPFBKsjRK","JRJQBix74r","MmKGJzqH0W",
+"HRxd8hE1Ql","zQt6QAkKTk","OxWIH0ao3l","d7vjM7X3uy","zY1GYfaHir","s47865nmWv","55rfBjiVBP","faHirCfgr3","JIqXiYf2Ec","djsrvStlDJ",
+"S2DfuiwzGk","0MR5X9XyT9","h1zcHv8yFN","WDVWJVerEA","BCxeCuQIcz","IKxdLGWqqX","FnPFBdpe1v","Yh1hFHlUbF","uupzkQbxXc","t59lRRBhp0",
+"yToGWZUnqt","uPX7GlpF6W","gjUTuZv7z0","BbwgAEoToP","ogLgc0PktI","W7cTsSs0Zu","6AFT0QChxs","ReKEWv1Hln","nlaByLewvM","d7vjMwiHrZ",
+"8hJdtJIqXi","fmIK1zqH0W","IKxdLtuDyS","MaJQsnlaBy","618Di9eoRc","POUYSG1RhS","vLsmStlILt","HRxd8azIWp","XyPZNUl4a1","Oz8yZTCgPp",
+"vkCHHWPmlx","SjskQ7X3uy","gIYvE8cVD3","gf8rIx3LDe","WDVWJQClRL","xXTI4C2Irc","taOXKrz7Ut","EdBKclj07Q","iqv4kL7cGc","07n1cazIWp",
+"JXljWJXljW","2Yz7Em4bxU","K4GS8IKxdL","Ul4a1VerEA","M6qcG9y4lw","ZhwG1gIYvE","oGu6x2hEEU","0Wr5yZ4I1v","m4bxUpvgjS","8U2nUkB5nP",
+"kB5nPFcWrW","JkzUnFVMxo","jfREuRpBQm","s4786guMb8","QChxsEdBKc","rz7UtW7cTs","B3qemeuZA5","rKDLJqUJMd","5iGN5cmXIX","24ARF4W0Tl",
+"tl72Wt98iW","LbRTHM3zXL","dQ586ydG8U","RkQkesoy9t","Mm8siDLhzM","8FmFHJ2mQi","CNHmvQChxs","gf8rI8hJdt","aFFssnnP8o","dhSuHhE1Ql",
+"9XyT9lsQGo","P6bcgK4GS8","Yw2oUZv7z0","Chuy316lHc","Ta8f6yluBx","YOfrYaL6AJ","WmadAWMiS3","FwEJzwDajX","CNHmvAOgEe","FcWrWtl72W",
+"IjTwPU3yw5","RpBQmJ2mQi","2DREsYf2Ec","yluBxWMiS3","DG4sTDQimp","S77LHkB5nP","uQIcz8U2nU","FLsphDQimp","RACuj9rlg9","oQ87rlH1kt",
+"YjB9tPb1pa","QnJ1S0ao3l","ciuWzlViBv","Mm8siIn3NS","RACujReKEW","uupzkzz4ZU","jfREulsQGo","vLsmS2DREs","7ku1pJRJQB","hE1QlUvlv4",
+"DcpWBhSSvQ","D6rByFFDui","jeskS2DREs","JIqXis7Mxk","07n1cKZamH","0PktIFGzgp","RmDcr2hEEU","iqv4kyluBx","x3LDeHzZT8","7X3uyC2Irc",
+"l83Udhe9IA","tvdkDVBjhz","gf8rITa8f6","DLhzM0MR5X","ulk41LbRTH","Pb1paS77LH","jiVBPrhl0J","ix74rJ2mQi","L7cGcZuDtD","xciqpTa8f6",
+"ni2v11j5L8","QYxC0SjskQ","In3NSdpe1v","pWiOsdhSuH","ydG8UPYBf4","ix74rGXdoH","pvgjSF6PT2","QnJ1S8xEKz","e6e4zOHaBz","brhlQKZamH",
+"B3qemIn3NS","7ku1pRkQke","0PktINcICA","ReKEW5iGN5","RxrsmqQxHP","ni2v1Yh1hF","AXpwEDG4sT","vOqCEe6e4z","L7cGcjS1aj","Pb1paZuDtD",
+"KsjRKLewvM","ZuDtDoQ87r","EoToPLDk6f","djsrvGrDg7","a00b5wiHrZ","EOE1o2Nslm","wiHrZ7hyVv","IjTwPYw2oU","hSSvQZhwG1","0ao3lFnPFB",
+"guMb80PktI","IRh48ydG8U","qQxHPZhwG1","yvOMIeuZA5","t59lRxReec","JXljWECMvU","XyPZNl83Ud","IKxdL6q6L9","yvOMIatef2","pvgjSiwzGk",
+"iKqhrsqVrf","55rfBsoy9t","CdyBVMaJQs","Zv7z0B3qem","5Mg9rCxVEf","VNCPdni2v1","zqH0Wni2v1","ZhwG1oGu6x","pmeCdVIlwP","WmadAdmoS7",
+"Ss0ZuqQxHP","6AFT0uPX7G","2TRI78U2nU","Waim6HfyNQ","gf8rIvOqCE","kZANm8TxD7","CNHmvVerEA","jSjS3Yw2oU","suY4x0MR5X","iwzGkiwzGk",
+"J2mQia00b5","AmdQdtl72W","BCxeCcShY2","VBjhzfcwDa","7X3uyeuZA5","X6Pinrz7Ut","n1pmOfFDrJ","CdyBVfLNg8","ogLgcogLgc","pvgjSWreyP",
+"pFrrlyvOMI","CK5W7K20wK","s93Ml3otm6","FPfSE8xEKz","2ZHdkhE1Ql","Oz8yZB3qem","AOgEeAOgEe","y94nwD6rBy","OHaBzt59lR","FwEJzm4bxU",
+"07n1cQ6Lix","2DREs9XyT9","Yh1hF8TxD7","9y4lw580YD","suY4xn8pJ9","No0QbsuY4x","fcwDaUvlv4","RzaZA5IhmG","MmsIoiB08l","5Drn08U2nU",
+"Yh1hFbrhlQ","lXFOB55rfB","XyPZN7X3uy","ydG8UEoToP","IBe8kOxWIH","soy9tuQIcz","8FmFH0ao3l","pmeCdvLsmS","cmXIXqaofN","lweGyv8yFN",
+"0ao3lzHF1q","CdyBVPb1pa","UlU3MwDajX","ZuDtDZhwG1","qaofNUlU3M","GXdoHlH1kt","CdyBVeuZA5","L7cGcoVQp6","8xEKz8xEKz","VNCPdQnJ1S",
+"AOgEe2ZHdk","ciuWzh1zcH","s93MllpF6W","07n1cfFDrJ","MmsIoC2Irc","ciuWzUvlv4","iKqhrFPfSE","7ku1p8TxD7","MojnPoVQp6","TCgPpvLsmS",
+"rz7UtAXpwE","gf8rIK20wK","QWxoTYjB9t","TwanoxXTI4","kZANmmX2GE","618DiiKqhr","AkKTk5Drn0","PYBf42ZHdk","JJs5myluBx","0MR5XlsQGo",
+"IRh481v5hH","Vprf2FnPFB","5Mg9ryluBx","v8yFNMK07Y","lCMxyWaim6","580YDHzZT8","Ss0ZuZhwG1","n8pJ99GXkX","AmdQdulk41","JkzUnQbxXc",
+"fmIK1Ss0Zu","GWqqXnlaBy","azIWpulk41","djsrvbZLvS","n1pmO8TxD7","M3zXLnnP8o","DQimppvgjS","atef2rhl0J","tvdkD7Ow5C","CxVEffFDrJ",
+"Rxrsme6e4z","7ku1po8Uyd","uZPqgciuWz","BFkb8J2mQi","KASQ8lj07Q","uTacx5Mg9r","Chuy3DG4sT","BbwgAtjQxs","pFrrl618Di","0h1b1atef2",
+"2Nslm7lUXZ","G1RhShSSvQ","CK5W7iwzGk","xciqpk85Ae","S77LH0Wr5y","UlU3M48cHL","fcJOylkMUA","brhlQZv7z0","POUYSYf2Ec","b29RJxReec",
+"580YDru4UG","jeskSGXdoH","jSjS3VIlwP","IRh48fLNg8","yToGWIn3NS","AIYUuJ2mQi","uAWypOxWIH","tl72WwDajX","KsjRKFwEJz","MK07YnnP8o",
+"S2DfuCxVEf","QssNCciuWz","djsrvEdBKc","Mm8si5iGN5","JJs5mhi5X7","29QAzQ6hMC","EoToPSbRYy","v2eC3iB08l","Chuy3Cfgr3","iwzGklweGy",
+"NAFuwHP433","NhXduCNHmv","Q6hMCVerEA","7X3uyMK07Y","okgRihSSvQ","WPmlxKASQ8","L7cGc7ku1p","nlaByt59lR","HfyNQtjQxs","6AFT0U3yw5",
+"2Nslm7fsYM","BFkb8gf8rI","s93MlxXTI4","GWqqX8xEKz","iqv4k2hEEU","hi5X7BGaQY","K20wK64s8N","LbRTHG1RhS","djsrvpmeCd","LewvMHP433",
+"hE1QlOUqFM","CdyBV5drc6","qQxHPVprf2","L7cGc7lUXZ","OUqFM9GXkX","LbRTHRACuj","wDajXdQ586","gf8rINhXdu","Ss0Zu14FLR","JKWYRn8pJ9",
+"QChxsFFDui","SWfoufLNg8","SmGzvRkQke","RBhp0brhlQ","e6e4z4QMc9","QnJ1SP6bcg","5nmWvv1Hln","bZLvSRBhp0","OxWIHUvlv4","AXpwEoVQp6",
+"8hJdtJkzUn","FPfSEgjUTu","d7vjMAmdQd","UmaEvRkQke","nlaBy0Wr5y","2DREs9eoRc","5VZjSmz8gx","16lHc9y4lw","JRJQBCxVEf","ReKEW2Yz7E",
+"ulk414QMc9","VIlwPhUTw7","FPfSEm4bxU","wDajXprNT6","1LB1LlsQGo","1j5L82ZHdk","C2IrciB08l","GrDg7NhXdu","EdBKcFFDui","RBhp0K20wK",
+"aL6AJOz8yZ","HRxd8JRJQB","7Ow5CydG8U","iqv4kSWfou","VNCPdFcWrW","16lHc7lUXZ","7fsYM5Namm","8cVD3uN6r3","iwzGk8hJdt","FPfSEZv7z0",
+"DG4sT5Drn0","BCxeCsoy9t","sqVrfa00b5","QYxC0zmLYD","JIqXi4W0Tl","8xEKzB3qem","ix74r2hEEU","16lHcm4bxU","kB5nPfcwDa","IjTwPjfREu",
+"CqqaDzQt6Q","5Namm6q6L9","QnJ1SMkgy8","m4bxUY1mC0","EOE1oRzaZA","QbxXcpiJSk","uTacx64s8N","vkCHHUlU3M","iwzGkpT8wu","m4bxUksJby",
+"Nxx9VU3yw5","NcICAbZLvS","e6e4zyvOMI","CNHmvU3yw5","aDGtSFxX9q","GSQwjZzJHW","GXdoHkB5nP","QYxC0POUYS","yvOMI5Mg9r","rhl0JsqVrf",
+"K4GS8MezSW","0KyfsnnP8o","DG4sTzQt6Q","JRJQBlkMUA","m4bxUjiVBP","Mkgy8ZuDtD","Uvlv4Yf2Ec","7fKYUuoStw","yEfy9lj07Q","jtn0Xd85a9",
+"2DREsQChxs","JJs5mOUYuF","QnJ1SblLA9","CdyBVZhwG1","OUYuFPOUYS","5IhmGS77LH","rhl0JtjQxs","dmoS7dhSuH","aez9y9XyT9","WPmlxMojnP",
+"pAhR1d7vjM","5Mg9ryofH3","5Drn0BpYhV","WPmlxVIlwP","K20wKI7p2a","YOfrY1v5hH","iKqhrpv0i7","tlILtHRxd8","2TRI7vOqCE","5nmWv8xEKz",
+"ZUnqtn8pJ9","oQ87rXyPZN","prNT6Pb1pa","9XyT9zbIYY","Rxrsmlj07Q","NOHszCqqaD","29QAzSWfou","HRxd8prNT6","sx5GlECMvU","W7cTst98iW",
+"uvf7AdmoS7","5nmWvEoToP","RBhp0n1pmO","b29RJguMb8","5Drn0mX2GE","AmdQdk85Ae","iB08l9y4lw","F6PT2FLsph","EdBKcRkQke","2Yz7EYf2Ec",
+"lH1ktlViBv","iKqhrHlUbF","brhlQzHF1q","4QMc9DQimp","s93MlhUTw7","OUqFM1v5hH","FLsphRmDcr","MojnPprNT6","vLsmSfaHir","n8pJ9lsQGo",
+"Cp3mZCfgr3","5drc6YOfrY","tlILtkZANm","Cfgr3lsQGo","BCxeCcQOnv","yofH3vkCHH","qUJMdZ4I1v","fmIK10PktI","VBjhzlsQGo","W7cTs8RCUA",
+"GrDg7ix74r","KASQ8iKqhr","iqv4katef2","kB5nPNcICA","uTacx9iGoT","hi5X7LDk6f","0BmCyIRh48","X6PinFwEJz","MaJQs0Kyfs","Ta8f6VNCPd",
+"FFDuiZuDtD","jS1ajfaHir","bgJAzokgRi","rKDLJtlILt","Nxx9VguMb8","wiHrZd85a9","okgRi9GXkX","580YDQWxoT","DQimpZv7z0","2DREsHfyNQ",
+"AXpwEuJScX","ydG8UK20wK","G1RhSZJTXH","tjQxsAmdQd","taOXK1j5L8","wDajXxXTI4","e6e4zzz4ZU","Zv7z0GrDg7","2NslmcmXIX","5Drn0XflUq",
+"VIlwPmz8gx","DG4sTFhtgl","UlU3MBFkb8","hSSvQGWqqX","lsQGoYh1hF","07n1cBbwgA","VLTy6WmadA","uupzkO3iyQ","0ao3l14FLR","FLsphFVMxo",
+"6AFT0WDVWJ","ZUnqtuupzk","BFkb85Mg9r","nFqikK20wK","9iGoTMezSW","XyPZNiwzGk","faHirBFkb8","CIShGnFqik","Yh1hFMmKGJ","ZuDtDfcwDa",
+"BCxeCGXdoH","S77LHFcWrW","piJSka00b5","jS1ajyToGW","uJScXHP433","h1zcH8hJdt","v1HlnxReec","O3iyQNcICA","FxX9qhi5X7","Pb1pawDajX",
+"aez9ylm0pD","2Yz7ENcICA","pFrrlsx5Gl","0PktI9GXkX","Z4I1vPYBf4","kB5nPWreyP","2NslmCp3mZ","P6bcgs4786","lViBvqQxHP","7hyVvtl72W",
+"jS1ajGXdoH","YjB9t0Wr5y","atef2Gv3Fq","yEfy9xciqp","XyPZNgIYvE","2ZHdkMkgy8","zz4ZU3weIF","2ZHdkFnPFB","VNCPdqQxHP","atef2hSSvQ",
+"QssNC7Ow5C","Nxx9VK4GS8","k85AeKASQ8","0PktIuLtKs","7X3uy14FLR","BGaQYVNCPd","7fKYUiB08l","ogLgcCfgr3","pvgjSK20wK","ZUnqtsx5Gl",
+"pAhR1lm0pD","48cHLWDVWJ","n1pmOtaOXK","Waim68cVD3","lj07QFFDui","bZLvSa00b5","O3iyQtlILt","e6e4zrhl0J","64s8NNhXdu","O3iyQ8cVD3",
+"dmoS7AOgEe","tjQxsuoStw","o8UydJ2mQi","1v5hH2Nslm","y94nw2TRI7","FwEJzgf8rI","qaofNY1mC0","gdQsSCNHmv","2TRI7TXQ0Z","W7cTs9rlg9",
+"FhtglyToGW","pmeCdK20wK","VNCPdJXljW","BFkb8fqypy","ZhwG1618Di","0KyfsYf2Ec","8cVD3hi5X7","BpYhV3otm6","he9IARBhp0","5Mg9rJIqXi",
+"HRxd8JJs5m","uvf7AuPX7G","5IhmGQ6hMC","LDk6fMaJQs","xXTI4B3qem","FxX9qv2eC3","xXTI4Qworu","oQ87rnlaBy","lCMxyFhtgl","Zv7z0jS1aj",
+"cL0aEW7cTs","2TRI7Oz8yZ","Uvlv4Cp3mZ","uTacxG1RhS","aL6AJQnJ1S","uQIczCIShG","oGu6xbgJAz","2NslmEdBKc","KASQ8sqVrf","Twano618Di",
+"QworuVNCPd","FNYIMydG8U","EOE1o5Drn0","64s8NPYBf4","POUYScmXIX","atef2RpBQm","yEfy9h1zcH","hYBCK1j5L8","e6e4zYw2oU","FhtglSbRYy",
+"jS1ajwDajX","gjUTuHRxd8","NhXdu2ZHdk","AkKTkkZANm","24ARFWPmlx","aez9yrhl0J","JKWYRZ4I1v","1v5hHuN6r3","UmaEvFwEJz","KASQ85ZaEz",
+"L7cGctl72W","Z4I1vzbIYY","RpBQmaDGtS","QbxXcTXQ0Z","suY4xL7cGc","fqypyYw2oU","CIShGRkQke","vkCHHVLTy6","VIlwPqQxHP","uPX7G64s8N",
+"vOqCEaez9y","zz4ZUBFkb8","ThjNndjsrv","EoToPmz8gx","WreyPo8Uyd","FPfSENxx9V","QworuFFDui","pvgjS5drc6","yvOMIMkgy8","lkMUANAFuw",
+"DG4sTdmoS7","M6qcGECMvU","JXljWBFkb8","WMiS30Wr5y","Ta8f6pmeCd","kZANmo8Uyd","J2mQiChuy3","OUYuFfFDrJ","WaWsviKqhr","lpF6WYh1hF",
+"8hJdtECMvU","SjskQuvf7A","Yh1hFxXTI4","brhlQydG8U","7fsYMfFDrJ","vOqCEAIYUu","jeskSF6PT2","QChxsm4bxU","qQxHPGv3Fq","aDGtSWPmlx",
+"vLsmSgf8rI","4QMc99y4lw","QChxss7Mxk","DG4sTuupzk","zqH0WVBjhz","aL6AJKASQ8","zqH0W29QAz","jS1aj618Di","618DiRmDcr","zHF1q4QMc9",
+"bgJAzQYxC0","e6e4zfqypy","5VZjSS77LH","FPfSE3weIF","G1RhSIjTwP","K4GS8RkQke","8U2nUgdQsS","SbRYyTCgPp","7Ow5C2TRI7","lXFOBbrhlQ",
+"pAhR12TRI7","WmadAv2eC3","TwanoQWxoT","M3zXLyEfy9","7lUXZMaJQs","t59lRLewvM","nFqiksuY4x","7lUXZaFFss","pmeCdtlILt","Q6LixDQimp",
+"Z4I1vxXTI4","Rxrsmm4bxU","FVMxoe6e4z","FcWrWiqv4k","4W0TlzQt6Q","hE1QlLbRTH","n1pmOHzZT8","W7cTsPYBf4","TCgPpZuDtD","8TxD7tlILt",
+"uN6r3AOgEe","AOgEelXFOB","ogLgc24ARF","XyPZNZzJHW","1v5hHVLTy6","iqv4kzmLYD","lsQGoBGaQY","2Yz7EUl4a1","MezSWfmIK1","FGzgpiqv4k",
+"tl72W6q6L9","Chuy3IjTwP","jS1ajazIWp","Cp3mZlj07Q","KASQ8VNCPd","ZhwG1MmKGJ","BpYhVjtn0X","6AFT0Ta8f6","ZJTXHjiVBP","gdQsS0PktI",
+"D6rByVLTy6","tvdkD14FLR","5Mg9rx3LDe","aDGtSXyPZN","DQimp2ZHdk","m4bxUKsjRK","0Wr5yjeskS","7lUXZXyPZN","e6e4zs93Ml","7lUXZ8hJdt",
+"pWiOst59lR","k85Ae2ZHdk","DLhzMoGu6x","suY4xMK07Y","HlUbFiKqhr","JkzUnt59lR","uAWypd7vjM","1v5hHjeskS","t59lRW3VFH","5iGN5fcwDa",
+"580YD7fsYM","2DREsDQimp","8FmFHWaWsv","MezSWn8pJ9","KASQ8ni2v1","1v5hHKZamH","5drc6mz8gx","L7cGcfcwDa","55rfBJIqXi","TwanoqaofN",
+"0KyfsFxX9q","OUYuFD6rBy","7Ow5CksJby","VBjhzGv3Fq","TXQ0Zhe9IA","bZLvSWreyP","ZhwG1fcwDa","atef2e6e4z","7lUXZVBjhz","U3yw5lViBv",
+"Ss0ZuFVMxo","ZzJHWyluBx","guMb85ZaEz","BCxeCVjCZq","uvf7AzFgtB","5iGN5lm0pD","xXTI47Ow5C","AOgEexXTI4","piJSkAgJHQ","No0QbyvOMI",
+"ZhwG19y4lw","jSjS3dmoS7","v8yFNHfyNQ","8hJdtGWqqX","Uvlv4jtn0X","BbwgASjskQ","L7cGcZhwG1","jzUqRWmadA","VIlwPtvdkD","StlDJAkKTk",
+"WreyPru4UG","W3VFH5nmWv","PYBf4RBhp0","5iGN5iB08l","MGlTF9XyT9","SbRYypmeCd","Gv3FqJXljW","U3yw58xEKz","PYBf4Vprf2","S77LHpAhR1",
+"MK07YChuy3","2ZHdkuJScX","7X3uym4bxU","yEfy9FxX9q","ThjNniB08l","he9IApT8wu","kZANmfmIK1","BGaQYBbwgA","BGaQYRkQke","he9IAlXFOB",
+"IBe8kgf8rI","fcJOyLDk6f","VLTy65drc6","Yf2Ecv8yFN","F6PT25nmWv","h1zcHSWfou","CqqaDBGaQY","5IhmGxXTI4","hE1QlydG8U","FnPFBzqH0W",
+"MmKGJ5Namm","RmDcrYw2oU","uPX7GzqH0W","l83UdNxx9V","ECMvUpvgjS","HlUbFNAFuw","ThjNnDcpWB","bZLvSNOHsz","pFrrlQssNC","m4bxUlkMUA",
+"jzUqR07n1c","mX2GEMm8si","cmXIXlXFOB","jiVBPksJby","ECMvUv8yFN","jzUqRblLA9","KZamH0Kyfs","IjTwPQbxXc","lweGyJXljW","W7cTsjS1aj",
+"Vprf2rhl0J","h1zcH4QMc9","14FLRFjHXR","8cVD32TRI7","HzZT8StlDJ","9eoRck85Ae","618DiSjskQ","lXFOBJJs5m","gdQsSChuy3","WreyPHRxd8",
+"0h1b1n1pmO","jtn0XuJScX","FxX9qWaim6","uQIczGWqqX","HfyNQiKqhr","07n1cyvOMI","7fsYMcQOnv","LbRTHl83Ud","faHirUmaEv","MaJQscL0aE",
+"BCxeCYjB9t","QssNCNcICA","0Wr5y14FLR","ThjNnjzUqR","MezSWNxx9V","WDVWJcmXIX","aFFss5VZjS","a00b55Mg9r","ZJTXHVNCPd","lCMxyiKqhr",
+"0BmCyAgJHQ","0Wr5yIRh48","FPfSEDcpWB","5NammUvlv4","pv0i7TCgPp","16lHcGWqqX","lXFOBb29RJ","zqH0W5Namm","oVQp6o8Uyd","8xEKzMmsIo",
+"ogLgczbIYY","AOgEeKASQ8","C2IrcStlDJ","Yw2oUCfgr3","qUJMd5iGN5","yluBxyEfy9","Pb1parKDLJ","2ZHdkmz8gx","atef2QChxs","x3LDeYw2oU",
+"hSSvQThjNn","oGu6xPb1pa","yEfy9vkCHH","rhl0JsuY4x","pT8wucQOnv","okgRicL0aE","WaWsvuvf7A","6AFT0ZJTXH","TXQ0ZWDVWJ","IRh48uupzk",
+"ni2v1IjTwP","uAWypxReec","Chuy3uoStw","64s8NM3zXL","5Mg9rU3yw5","LDk6fzbIYY","Yf2EcM6qcG","2NslmUvlv4","x3LDeThjNn","F6PT2fqypy",
+"2hEEUCdyBV","618Di1j5L8","CxVEfWreyP","ZJTXHLewvM","zQt6QHzZT8","MK07Y29QAz","cShY2fLNg8","9eoRcMmKGJ","UmaEvi3pyd","OHaBzU3yw5",
+"WMiS3b29RJ","yofH3pmeCd","5NammMm8si","fmIK1atef2","ZJTXHIjTwP","GSQwjRACuj","FGzgpJIqXi","wDajXgtCA5","W3VFHvOqCE","FLsphChuy3",
+"d85a9wDajX","prNT6VNCPd","Ss0ZuNAFuw","gIYvEl83Ud","y94nw618Di","rz7UttAOsr","BFkb8Twano","brhlQxciqp","9rlg9rKDLJ","uoStw3weIF",
+"FjHXRrz7Ut","RpBQmhi5X7","CdyBVEdBKc","LbRTHjSjS3","JKWYRjSjS3","jS1ajQ6Lix","BGaQYOxWIH","7hyVv1v5hH","45cIHtjQxs","CdyBVDG4sT",
+"RzaZApWiOs","ThjNnTCgPp","ru4UG7fsYM","sqVrfnlaBy","FjHXRRkQke","QWxoTvkCHH","0h1b1xciqp","Pb1paix74r","dpe1vgdQsS","i7WMQCNHmv",
+"8RCUAFFDui","suY4xxciqp","hUTw7o8Uyd","5drc6G1RhS","Fhtgljtn0X","YOfrYY1mC0","i3pydGv3Fq","hE1Qlhe9IA","CqqaDQ6hMC","GSQwjCdyBV",
+"ZJTXHRmDcr","P6bcg2DREs","DLhzMThjNn","Ta8f6GrDg7","Cfgr3Dz1R3","zz4ZUyEfy9","uAWypni2v1","cShY27hyVv","lm0pDyvOMI","VerEAd7vjM",
+"GWqqXulk41","Chuy3TXQ0Z","uoStwO3iyQ","StlDJblLA9","pv0i7qQxHP","7ku1pUvlv4","dQ5869y4lw","WDVWJ2Nslm","zHF1qfaHir","qaofNRsQUq",
+"s93Mllj07Q","azIWphSSvQ","C2Irc0YAGH","9y4lwFGzgp","RkQkeRxrsm","JRJQBLDk6f","zQt6QJIqXi","4dEz6lpF6W","0ao3l5VZjS","b29RJaFFss",
+"lViBv8RCUA","FLsphYf2Ec","M3zXLBFkb8","MmKGJaFFss","WPmlx7ku1p","bgJAzVBjhz","VjCZqtaOXK","DQimpG1RhS","EdBKcBpYhV","TXQ0ZuJScX",
+"VBjhzy94nw","WPmlx14FLR","d7vjMkZANm","faHirX6Pin","atef2L7cGc","fLNg8FGzgp","HzZT8zY1GY","55rfBDQimp","M6qcGaFFss","l83UdS2Dfu",
+"7hyVvMGlTF","faHir0BmCy","5nmWvb29RJ","gIYvEU3yw5","dpe1vQbxXc","GrDg7xReec","W7cTsOUYuF","IRh48BpYhV","FNYIMCdyBV","x3LDeJJs5m",
+"tjQxsBFkb8","OxWIHRmDcr","blLA9uJScX","29QAzoVQp6","QnJ1So8Uyd","he9IAuN6r3","UmaEvtvdkD","PYBf4DcpWB","OxWIHpmeCd","45cIH1j5L8",
+"pWiOsjS1aj","8xEKzlpF6W","qaofNaDGtS","nlaByJkzUn","FFDuivkCHH","FxX9qix74r","2hEEUtjQxs","24ARF8U2nU","SbRYyhUTw7","Ul4a16AFT0",
+"lpF6WNOHsz","JKWYRfFDrJ","iqv4kBCxeC","hi5X7Mkgy8","xXTI45iGN5","S77LH9y4lw","ZJTXHGSQwj","zz4ZUOUqFM","Waim6rhl0J","64s8N7lUXZ",
+"UmaEv2ZHdk","zHF1qTa8f6","cQOnvlsQGo","MmsIoECMvU","lXFOB0Kyfs","45cIHSmGzv","S77LHzY1GY","ydG8Uuvf7A","0YAGHpvgjS","JJs5mlH1kt",
+"qaofNlH1kt","QworujSjS3","uvf7AMezSW","guMb8DLhzM","y94nw1LB1L","bgJAzPYBf4","7hyVv5IhmG","8RCUAP6bcg","ulk41WmadA","ksJbyvkCHH",
+"RACujlViBv","JRJQBNAFuw","d85a9Twano","7ku1pWmadA","Yf2EcKsjRK","bZLvShE1Ql","aDGtSjiVBP","AgJHQiKqhr","48cHLLDk6f","jfREuIjTwP",
+"UmaEvfFDrJ","9eoRcIn3NS","ThjNnCdyBV","Mm8siJ2mQi","AOgEe7ku1p","DcpWBzqH0W","bgJAzGXdoH","6q6L9EoToP","HRxd8gdQsS","zHF1qJJs5m",
+"JJs5m48cHL","3weIFOz8yZ","v2eC3UmaEv","ReKEWzQt6Q","QworuwiHrZ","DLhzMHfyNQ","AIYUuS77LH","SWfoujtn0X","RzaZA2Yz7E","7ku1p2ZHdk",
+"l83UdUl4a1","cShY22TRI7","W3VFHpFrrl","Rxrsms4786","55rfBFhtgl","8U2nUjzUqR","5Drn0VBjhz","atef2i7WMQ","uAWypUmaEv","ulk418TxD7",
+"lViBv5IhmG","XflUqDz1R3","48cHLsqVrf","FLsphZzJHW","JJs5m2DREs","xReecMezSW","LewvMeuZA5","uPX7GNxx9V","5ZaEzgdQsS","fFDrJQClRL",
+"cShY2L7cGc","SbRYyYf2Ec","JJs5mlXFOB","m4bxUciuWz","IRh489y4lw","taOXK5iGN5","dQ586ZJTXH","ReKEWlj07Q","rz7UtIKxdL","hi5X7he9IA",
+"lViBviqv4k","t59lRzHF1q","JJs5moQ87r","CqqaDD6rBy","4QMc9VLTy6","oGu6xEoToP","zY1GY5iGN5","HzZT81j5L8","G1RhSnlaBy","VBjhzOxWIH",
+"EdBKcZv7z0","FGzgpuZPqg","aFFssKASQ8","GrDg7ydG8U","ZUnqt7X3uy","fqypyEOE1o","X6PinB3qem","ReKEWydG8U","4QMc9zbIYY","O3iyQIRh48",
+"0PktIAkKTk","ZUnqtWaWsv","9iGoTSbRYy","0PktIyToGW","AmdQdxReec","Ss0Zu9rlg9","0Kyfsv2eC3","SbRYyIRh48","JIqXilweGy","B3qemNxx9V",
+"t59lRJRJQB","oVQp6soy9t","K20wKRsQUq","CNHmvuN6r3","a00b52Yz7E","IRh484dEz6","MGlTFbgJAz","FPfSE2hEEU","JRJQBuAWyp","o8UydU3yw5",
+"MmsIohi5X7","MaJQs9y4lw","zqH0WvOqCE","3otm6he9IA","TCgPpxReec","XflUqiKqhr","Yf2EcogLgc","uJScXh1zcH","Yh1hFQWxoT","lH1ktAIYUu",
+"l83UdzbIYY","Dz1R3SWfou","n8pJ9jiVBP","Z4I1vydG8U","UlU3Ml83Ud","ni2v16q6L9","DG4sTpiJSk","yvOMIRpBQm","7lUXZ5Mg9r","iwzGkGrDg7",
+"IRh48oVQp6","Mm8siSjskQ","64s8Nix74r","Oz8yZuQIcz","P6bcgQYxC0","HRxd848cHL","tjQxss93Ml","lsQGoFLsph","jfREuzHF1q","s93Ml7lUXZ",
+"F6PT2SjskQ","QYxC0sx5Gl","QssNCCxVEf","55rfBZzJHW","suY4xbgJAz","9eoRcHlUbF","DG4sTkB5nP","Ss0ZuDz1R3","ReKEWdmoS7","7fKYU580YD",
+"9XyT9uPX7G","45cIHcmXIX","2hEEUZJTXH","5Mg9r7lUXZ","dQ586FnPFB","hi5X7hSSvQ","8FmFH7lUXZ","n8pJ98cVD3","I7p2aI7p2a","5Mg9rsqVrf",
+"2NslmnlaBy","guMb8IRh48","WMiS3QnJ1S","TCgPpBCxeC","jfREuxciqp","Yf2Ec7lUXZ","i3pyd7fKYU","lpF6Whi5X7","MojnPulk41","9rlg9uupzk",
+"Zv7z0In3NS","Dz1R37fKYU","CxVEfuTacx","AkKTkaFFss","fqypyUlU3M","uvf7AYf2Ec","v1HlnlweGy","gtCA5AmdQd","FnPFBJJs5m","MGlTFJkzUn",
+"EOE1oMmsIo","Mkgy8jSjS3","wiHrZaFFss","BpYhVF6PT2","djsrvyvOMI","7Ow5Cgf8rI","IRh48ulk41","pFrrlEOE1o","HRxd8lsQGo","2NslmvLsmS",
+"Vprf2kZANm","jiVBPW7cTs","S77LHhE1Ql","8FmFHB3qem","taOXKjSjS3","0ao3lNOHsz","oQ87r0Kyfs","Vprf2sqVrf","QbxXcDQimp","XyPZN5VZjS",
+"dQ586aDGtS","HfyNQWMiS3","UmaEvRpBQm","pv0i7LbRTH","5iGN5VNCPd","YOfrYCNHmv","piJSkcShY2","ni2v1YOfrY","X6PinxXTI4","MaJQsRkQke",
+"zqH0WQYxC0","iqv4khSSvQ","euZA5JkzUn","6AFT014FLR","B3qem1LB1L","Dz1R3wiHrZ","aDGtS9rlg9","ZJTXHPb1pa","JJs5mU3yw5","AgJHQgdQsS",
+"zz4ZUlkMUA","iKqhrGrDg7","HRxd8CK5W7","HRxd8s93Ml","FPfSEQssNC","yToGWtl72W","RzaZAVNCPd","GrDg7VLTy6","faHirlCMxy","5Mg9ry94nw",
+"tAOsrCqqaD","PYBf4FNYIM","VNCPdnFqik","C2IrcfcJOy","1v5hHAmdQd","soy9tAkKTk","Nxx9VEoToP","0PktI29QAz","tjQxsmz8gx","bZLvSRxrsm",
+"Yw2oUNAFuw","n1pmOX6Pin","O3iyQv8yFN","lCMxyhi5X7","14FLR5nmWv","yToGW4W0Tl","euZA5wDajX","uZPqgFGzgp","XyPZNIRh48","Mm8siEOE1o",
+"lm0pDO3iyQ","POUYSD6rBy","DLhzMBbwgA","rz7UtIjTwP","ZhwG1mz8gx","uAWypn1pmO","0Wr5yn1pmO","SWfouSWfou","b29RJQnJ1S","jS1ajd85a9",
+"FnPFBFjHXR","iwzGkCp3mZ","xciqpoGu6x","BbwgAFwEJz","uoStwpAhR1","ulk41o8Uyd","BGaQYwDajX","pT8wuix74r","618Di9GXkX","sx5GlZ4I1v",
+"YOfrYNAFuw","t59lRP6bcg","t59lR48cHL","QWxoTyToGW","aL6AJlViBv","atef22Yz7E","AkKTkksJby","lm0pDxReec","dmoS74QMc9","zqH0W6q6L9",
+"SbRYyVLTy6","B3qemBFkb8","6AFT0lH1kt","soy9tJJs5m","GrDg7Pb1pa","iwzGkyToGW","7lUXZMezSW","dmoS7AIYUu","LbRTHY1mC0","FLsphiqv4k",
+"uN6r3fcwDa","2TRI7RmDcr","l83Udni2v1","lXFOBrKDLJ","v1HlnSWfou","jeskSru4UG","FPfSEtl72W","VIlwP8U2nU","JKWYRcShY2","d85a9IBe8k",
+"ciuWzDLhzM","CqqaDMK07Y","d7vjMzFgtB","6AFT0WmadA","vkCHHEoToP","Ss0ZuDLhzM","3otm6qaofN","CK5W7AOgEe","WaWsvhe9IA","Mm8siRkQke",
+"d85a90MR5X","G1RhSDG4sT","0h1b1FGzgp","F6PT2GrDg7","rz7UtF6PT2","jeskSHlUbF","WDVWJS77LH","WDVWJQ6hMC","qUJMdnFqik","zqH0WIjTwP",
+"ydG8UfcwDa","2NslmgdQsS","xciqpiKqhr","TwanolweGy","6q6L9Dz1R3","4W0Tla00b5","BGaQYksJby","kZANmyofH3","i3pyd24ARF","EOE1ojtn0X",
+"45cIHIjTwP","Waim6Oz8yZ","RACujRkQke","K20wKMojnP","oQ87r5ZaEz","0Wr5yvOqCE","RxrsmKr8ys","zbIYYThjNn","7Ow5CPOUYS","BbwgAFjHXR",
+"9y4lwgf8rI","y94nwt59lR","Kr8ysjeskS","ZhwG1MojnP","0h1b12TRI7","X6PinfLNg8","Mm8siulk41","v2eC30PktI","8xEKzru4UG","M6qcGaez9y",
+"QChxsHfyNQ","AOgEexciqp","FGzgpQ6Lix","tlILtYf2Ec","QChxs64s8N","EdBKcdmoS7","ksJbyJ2mQi","zmLYD5Drn0","IKxdLM3zXL","gtCA5mz8gx",
+"xReec7fKYU","iwzGkFnPFB","PYBf4hUTw7","y94nwaFFss","v1HlnEoToP","RsQUq3otm6","1v5hHvLsmS","D6rByb29RJ","YOfrYAkKTk","07n1cfqypy",
+"WDVWJStlDJ","ZhwG1Zv7z0","i3pydlViBv","OHaBzQnJ1S","WreyPrz7Ut","S2DfugdQsS","Ta8f6m4bxU","AXpwEfFDrJ","W7cTspWiOs","n8pJ92DREs",
+"OxWIHXflUq","qQxHP8xEKz","VNCPdFGzgp","n1pmO0MR5X","M6qcGZzJHW","Kr8ys7fsYM","wiHrZChuy3","Y1mC0GSQwj","AkKTktl72W","dQ586euZA5",
+"lj07Q1v5hH","pv0i7NhXdu","MojnPl83Ud","k85AeTa8f6","uAWypAOgEe","45cIHThjNn","TwanosqVrf","DcpWBD6rBy","ydG8UI7p2a","5VZjSsx5Gl",
+"ZzJHWiKqhr","atef2DQimp","WMiS3aDGtS","J2mQizY1GY","tjQxsF6PT2","uoStwIn3NS","580YDMK07Y","WaWsvyToGW","uLtKsZhwG1","CNHmvdQ586",
+"AkKTk5IhmG","16lHcF6PT2","yToGWfFDrJ","BFkb8uPX7G","29QAzxXTI4","SWfouNcICA","0h1b1hUTw7","sqVrfyEfy9","Pb1pa5ZaEz","5Drn0O3iyQ",
+"RkQkepT8wu","VLTy6ksJby","9GXkX8U2nU","K20wKNhXdu","aez9yYw2oU","Dz1R3jS1aj","lsQGolXFOB","FwEJzuN6r3","5NammuoStw","VBjhzkB5nP",
+"uN6r3CIShG","lH1ktzFgtB","2NslmiKqhr","hSSvQcmXIX","ni2v10Wr5y","RpBQmQYxC0","nFqikxXTI4","t59lRkZANm","Chuy3t98iW","Nxx9VCIShG",
+"aL6AJzFgtB","OUqFMoVQp6","OxWIHmX2GE","ZhwG129QAz","ZJTXHRpBQm","TXQ0Zd7vjM","gf8rI8RCUA","16lHcvOqCE","3otm6lweGy","0BmCyFjHXR",
+"UmaEvW7cTs","pWiOsWmadA","RxrsmzQt6Q","s7MxklsQGo","FVMxogtCA5","9XyT9uAWyp","pvgjSazIWp","TCgPpCIShG","pvgjSd7vjM","QClRL0ao3l",
+"rKDLJlH1kt","i7WMQ4W0Tl","bgJAzF6PT2","yluBxDcpWB","zQt6Q2Yz7E","VjCZqt59lR","zFgtB8FmFH","HP433QChxs","bZLvSGrDg7","uJScXdQ586",
+"jzUqRKZamH","FwEJzPOUYS","qQxHPyToGW","sqVrf8TxD7","MojnP9XyT9","RACujoQ87r","uoStw9XyT9","s47863otm6","5nmWvPb1pa","lweGyhe9IA",
+"55rfBpiJSk","YOfrYAXpwE","Y1mC0VerEA","hUTw7iKqhr","LbRTHTCgPp","7X3uyuJScX","DQimpDz1R3","lsQGohSSvQ","fcwDaGSQwj","WDVWJcL0aE",
+"KZamHRACuj","a00b5lH1kt","Vprf2tl72W","LDk6fSbRYy","hE1QldhSuH","t59lRhE1Ql","0ao3lazIWp","lH1ktblLA9","VjCZqwiHrZ","4W0Tl3otm6",
+"4W0TlVerEA","JIqXilj07Q","zqH0WCNHmv","KZamHZv7z0","5drc6P6bcg","aFFssuZPqg","hUTw7pWiOs","yToGWpvgjS","cQOnvJJs5m","7ku1pfaHir",
+"5Mg9r16lHc","3otm6S77LH","Mm8sibZLvS","tvdkDWDVWJ","TCgPpcShY2","Mkgy8uAWyp","W7cTsQ6Lix","tuDySK20wK","sx5GlCxVEf","v2eC3pAhR1",
+"d85a9JKWYR","5IhmGDcpWB","fcwDaTwano","Yh1hFnlaBy","8hJdtWmadA","Qworu618Di","uvf7ABGaQY","0h1b1lH1kt","TwanojfREu","lm0pDJRJQB",
+"OxWIHiqv4k","xciqpcmXIX","iqv4kFwEJz","x3LDev8yFN","tvdkDt59lR","0PktIKZamH","tjQxsNxx9V","5nmWvQ6hMC","D6rBytvdkD","IBe8kM3zXL",
+"o8UydBbwgA","F6PT2lpF6W","K4GS8jSjS3","5nmWvP6bcg","euZA5OUYuF","cL0aEC2Irc","QbxXcDLhzM","FwEJz07n1c","0MR5XLDk6f","qQxHPprNT6",
+"9iGoTNAFuw","VBjhzVBjhz","NOHszcmXIX","aDGtSbgJAz","GSQwjzQt6Q","SWfouNo0Qb","wDajXVprf2","OUqFMdQ586","faHirru4UG","uAWypRkQke",
+"zFgtBpAhR1","7lUXZ55rfB","8TxD7QbxXc","Dz1R3Fhtgl","x3LDed85a9","DLhzMFGzgp","55rfBdjsrv","7fKYUVNCPd","nFqikuQIcz","rz7UtnFqik",
+"h1zcHydG8U","yvOMIzbIYY","M6qcGXyPZN","uLtKsqUJMd","oQ87rlj07Q","hYBCKL7cGc","BCxeChe9IA","EoToPqaofN","i3pydFVMxo","WaWsvpvgjS",
+"POUYSuJScX","OxWIHprNT6","i3pydG1RhS","D6rByuTacx","tvdkDhSSvQ","FnPFBlH1kt","y94nwJKWYR","Ta8f655rfB","jtn0XZJTXH","IBe8ktaOXK",
+"prNT6NhXdu","iqv4kuTacx","o8UydpFrrl","P6bcgFPfSE","uoStwuvf7A","Mm8si3otm6","QnJ1SgjUTu","qaofN0PktI","hYBCKfcwDa","FFDuiYf2Ec",
+"64s8NChuy3","sqVrfsoy9t","gIYvEpmeCd","uPX7GbgJAz","POUYShYBCK","TCgPpLDk6f","HlUbFciuWz","IBe8kJJs5m","Uvlv4pT8wu","MojnPydG8U",
+"zQt6Q0BmCy","MmKGJkB5nP","OUqFM55rfB","8cVD3HRxd8","7Ow5CC2Irc","Yw2oUjeskS","aL6AJOxWIH","LDk6fqaofN","pmeCdCdyBV","QWxoTC2Irc",
+"ZJTXH3weIF","BbwgA5Namm","a00b5BGaQY","1v5hHQ6hMC","EOE1os93Ml","55rfBAOgEe","VNCPds7Mxk","9y4lwwiHrZ","kB5nPRkQke","Mm8siaez9y",
+"ZuDtDGSQwj","LewvMm4bxU","sqVrfuN6r3","GSQwjThjNn","fcwDaUmaEv","9GXkXlj07Q","yofH3pFrrl","yofH37lUXZ","Rxrsm7lUXZ","cQOnvlweGy",
+"okgRi16lHc","QworugjUTu","QChxsVLTy6","suY4xfcwDa","ogLgc2hEEU","3otm67lUXZ","zFgtBNAFuw","9XyT9KASQ8","gjUTucmXIX","YjB9tt59lR",
+"Yw2oUpv0i7","VNCPd8U2nU","AXpwEVBjhz","RpBQmyEfy9","Q6hMCS2Dfu","ZzJHWZuDtD","I7p2a7hyVv","gIYvEJIqXi","B3qemhSSvQ","ZuDtDK20wK",
+"MmsIoVjCZq","HzZT8xReec","he9IA0ao3l","K4GS8L7cGc","580YD29QAz","HfyNQpFrrl","QworuogLgc","BpYhV2hEEU","guMb8gIYvE","AkKTkpWiOs",
+"CK5W7FLsph","PYBf4qaofN","LewvMoQ87r","JkzUnpiJSk","MmKGJazIWp","fcJOySjskQ","v8yFNUlU3M","Ta8f6y94nw","9y4lwnFqik","jeskSy94nw",
+"EOE1oNo0Qb","qaofNKZamH","k85AeY1mC0","FVMxo9GXkX","CK5W7gtCA5","fcJOyHzZT8","8RCUAAgJHQ","dpe1v618Di","64s8NS2Dfu","M6qcGlj07Q",
+"C2IrcRzaZA","QbxXcKASQ8","RmDcrQssNC","BCxeCi7WMQ","HlUbFJIqXi","NhXduhe9IA","yluBxoVQp6","cmXIXZ4I1v","pFrrlcL0aE","I7p2axReec",
+"tlILtyofH3","qaofNvOqCE","cShY2JRJQB","lm0pDWaWsv","uupzkQworu","m4bxUD6rBy","wDajXYf2Ec","AmdQdKsjRK","FwEJz3weIF","prNT6EOE1o",
+"IKxdLd85a9","Ul4a1Yf2Ec","7fsYMmX2GE","W3VFHWPmlx","UlU3M0Kyfs","RACujVLTy6","8cVD3ogLgc","ru4UGAOgEe","Cp3mZi3pyd","FPfSEVBjhz",
+"iqv4ko8Uyd","HzZT89XyT9","AkKTk4QMc9","VNCPdfaHir","Nxx9VNOHsz","4dEz6tAOsr","RkQkezqH0W","pvgjSFnPFB","0BmCyMojnP","Vprf2HlUbF",
+"gIYvEguMb8","VerEAm4bxU","KZamHDLhzM","JkzUnZhwG1","wiHrZuPX7G","lXFOBkB5nP","XflUq16lHc","5ZaEz2ZHdk","vkCHH1v5hH","0YAGHQ6hMC",
+"ru4UGHfyNQ","BCxeCUmaEv","3weIFcmXIX","RxrsmuLtKs","brhlQBGaQY","rz7UtuTacx","1LB1LEdBKc","YOfrYCqqaD","ThjNnguMb8","lsQGoHRxd8",
+"n8pJ9uoStw","KsjRKWreyP","Gv3Fq6q6L9","rz7UtRACuj","mX2GEHlUbF","EOE1oXyPZN","hYBCKQChxs","DG4sTprNT6","rKDLJOHaBz","fcwDanlaBy",
+"iB08lpFrrl","cShY2vkCHH","bZLvShe9IA","VNCPdFLsph","K20wKqUJMd","lm0pDIn3NS","d7vjMs4786","LbRTHaFFss","jSjS3blLA9","i7WMQv1Hln",
+"48cHLJJs5m","yluBxd7vjM","lViBvi3pyd","s4786FNYIM","F6PT2C2Irc","AkKTkRmDcr","uAWypQssNC","WMiS3FGzgp","nFqikFnPFB","IBe8kGWqqX",
+"RzaZAkZANm","zbIYYVNCPd","iwzGkulk41","uN6r3ECMvU","WmadAUl4a1","uAWyppiJSk","MaJQsgjUTu","7X3uyNAFuw","8hJdtHlUbF","tl72W5VZjS",
+"RxrsmbgJAz","XflUqQChxs","D6rByIjTwP","lXFOB8hJdt","KZamHYw2oU","HP433uJScX","Cp3mZ1v5hH","U3yw5JKWYR","nnP8oRpBQm","ydG8UtaOXK",
+"2ZHdkK4GS8","xciqpzHF1q","OUYuFMmKGJ","B3qemGrDg7","zbIYYVerEA","LewvMFwEJz","uTacxCdyBV","ksJbyblLA9","iqv4kuN6r3","FVMxorKDLJ",
+"K4GS8NcICA","d85a955rfB","suY4xfcJOy","yluBxAmdQd","atef2pFrrl","ni2v1dpe1v","zz4ZUW7cTs","Ss0ZuMmsIo","0KyfsSbRYy","azIWpIn3NS",
+"oQ87rP6bcg","pvgjSJJs5m","DG4sT5ZaEz","xciqpulk41","ZzJHWThjNn","s93Ml2Nslm","s7MxkvkCHH","TXQ0ZGXdoH","AOgEezz4ZU","FcWrW2Yz7E",
+"ReKEWVIlwP","RsQUqQClRL","vLsmSs93Ml","dQ586Yh1hF","bgJAzqaofN","2ZHdkpAhR1","vkCHHuQIcz","lXFOBxXTI4","ksJbyEdBKc","Dz1R3DG4sT",
+"RBhp0gjUTu","ni2v1bZLvS","fcwDaFGzgp","MK07YyEfy9","RBhp0IRh48","uPX7GQnJ1S","vkCHHM6qcG","guMb829QAz","DQimpuLtKs","BFkb8QssNC",
+"lpF6WWPmlx","xciqpaez9y","kZANmvOqCE","lViBvuTacx","qUJMdQYxC0","MojnPJJs5m","SbRYy0Wr5y","9eoRczmLYD","MmKGJ4W0Tl","iwzGk5nmWv",
+"RACujx3LDe","D6rBysqVrf","uQIczkZANm","fcwDaRmDcr","tAOsrzbIYY","QWxoT3weIF","t98iWFFDui","TCgPpDQimp","3otm6ru4UG","v1Hln8hJdt",
+"pWiOsyEfy9","faHir9iGoT","5IhmGQbxXc","RkQke0PktI","X6PinNAFuw","8xEKzSmGzv","ogLgcTwano","QClRLYOfrY","M6qcGGXdoH","vLsmSQbxXc",
+"Q6hMCcL0aE","9y4lwZhwG1","TCgPpjzUqR","SmGzvKASQ8","BGaQYMmsIo","ksJbyVLTy6","4dEz6nlaBy","piJSkTXQ0Z","EoToPEdBKc","lH1ktsqVrf",
+"suY4xvOqCE","6q6L9OHaBz","uvf7AUvlv4","K4GS8CxVEf","Cp3mZJKWYR","BCxeCJ2mQi","zFgtBJIqXi","m4bxUCdyBV","pAhR1ru4UG","0BmCyI7p2a",
+"Nxx9VtaOXK","zz4ZUWmadA","IjTwPgdQsS","FwEJzuPX7G","WDVWJTa8f6","Oz8yZ0YAGH","oVQp6tAOsr","cmXIXiB08l","FFDuiS2Dfu","ECMvU8cVD3",
+"wDajXRACuj","FVMxoru4UG","pAhR1BpYhV","JKWYRNAFuw","vOqCElkMUA","lkMUAYf2Ec","ydG8UaFFss","oVQp6uJScX","y94nwmz8gx","Yw2oUdmoS7",
+"uN6r3JkzUn","tjQxsmX2GE","580YDpWiOs","0Wr5yPYBf4","6AFT07fsYM","QbxXcfqypy","jiVBPJJs5m","blLA9sqVrf","1LB1Ls4786","9XyT9prNT6",
+"atef2s4786","rhl0JpWiOs","RsQUq6AFT0","tAOsruoStw","POUYSm4bxU","IKxdLx3LDe","ZzJHWFjHXR","4W0TlwiHrZ","GXdoHxXTI4","5iGN5Waim6",
+"OUqFMydG8U","Twano7lUXZ","BpYhVblLA9","a00b59y4lw","EoToPK4GS8","bgJAzU3yw5","ECMvUprNT6","Nxx9VFjHXR","ulk413weIF","FcWrWuTacx",
+"0h1b1Yf2Ec","pmeCdeuZA5","Vprf27ku1p","JkzUnvOqCE","618DiTa8f6","48cHLni2v1","AIYUuVNCPd","8RCUAOUqFM","djsrvaDGtS","tjQxsFVMxo",
+"BpYhVvLsmS","L7cGck85Ae","m4bxUi7WMQ","Yh1hFSjskQ","oQ87rydG8U","5NammvkCHH","PYBf4GWqqX","JKWYRPYBf4","lXFOBpAhR1","cL0aE9XyT9",
+"zqH0W4QMc9","ZuDtDQClRL","DG4sTaez9y","RkQkeG1RhS","fcwDauZPqg","s93MlqaofN","VIlwPU3yw5","4W0Tl1j5L8","EoToPXflUq","s93MlFjHXR",
+"YjB9tJRJQB","pvgjShE1Ql","kB5nPJkzUn","AkKTk6AFT0","OxWIHaL6AJ","vLsmScmXIX","uAWypfLNg8","CK5W7jfREu","Yf2EcbrhlQ","BbwgAaL6AJ",
+"S77LHVNCPd","SWfoufaHir","fcwDa4dEz6","pFrrlgIYvE","fmIK1yEfy9","FcWrWX6Pin","hUTw74dEz6","gtCA5tjQxs","fcwDaksJby","euZA51v5hH",
+"nlaBytlILt","8U2nUdhSuH","BCxeCjS1aj","K4GS8Yf2Ec","tvdkDhUTw7","hYBCK0YAGH","QChxs4W0Tl","pmeCdni2v1","AgJHQrKDLJ","ZhwG1NcICA",
+"4W0Tl4QMc9","Dz1R3M3zXL","WmadAVprf2","n1pmOx3LDe","Chuy3zY1GY","jzUqRKr8ys","Ta8f6i7WMQ","64s8NKsjRK","HzZT84dEz6","BFkb8MezSW",
+"ru4UGtlILt","9eoRct98iW","lkMUAG1RhS","GSQwjStlDJ","9iGoTXyPZN","Chuy36AFT0","EoToPkZANm","55rfBRmDcr","kB5nPuTacx","6q6L9IKxdL",
+"XflUqD6rBy","h1zcHChuy3","M3zXLaez9y","VNCPdtvdkD","NAFuwv8yFN","jiVBPYjB9t","EOE1otAOsr","fcJOyblLA9","0PktIIn3NS","uPX7Go8Uyd",
+"VBjhz5drc6","FNYIMPb1pa","VLTy62Nslm","MGlTF3weIF","ZUnqtpWiOs","X6Pin0Wr5y","pT8wuKZamH","TXQ0ZAIYUu","0BmCyVprf2","uAWyp7Ow5C",
+"FPfSE5VZjS","F6PT2ru4UG","B3qemwDajX","blLA9t59lR","5ZaEzQssNC","64s8NO3iyQ","zQt6Q9XyT9","FnPFB5ZaEz","9GXkXpv0i7","UmaEvjtn0X",
+"Q6hMCX6Pin","jSjS3I7p2a","Cfgr3L7cGc","Ta8f6gIYvE","EoToPyofH3","ulk41FcWrW","lXFOB5ZaEz","B3qemPYBf4","TCgPp07n1c","9XyT9No0Qb",
+"6q6L9FPfSE","tjQxsazIWp","zFgtBWMiS3","SjskQQbxXc","b29RJRsQUq","jzUqRd7vjM","9XyT90Wr5y","M3zXL3otm6","MK07YBbwgA","JXljWoGu6x",
+"Cfgr3VjCZq","9eoRcQChxs","7fsYM8TxD7","xXTI4AIYUu","VBjhziwzGk","uoStwWMiS3","7X3uyZUnqt","ciuWzChuy3","hE1Qln1pmO","taOXKAXpwE",
+"JXljWChuy3","jtn0XOHaBz","oGu6xk85Ae","uPX7GU3yw5","MK07Y5Namm","uoStwJKWYR","pWiOsdpe1v","Dz1R3S2Dfu","CK5W7jeskS","dhSuHuTacx",
+"YjB9ttuDyS","J2mQi4W0Tl","Oz8yZRACuj","jiVBPFhtgl","d7vjMsx5Gl","tuDySXyPZN","Chuy3lViBv","FLsphrz7Ut","8U2nUprNT6","Q6hMCPb1pa",
+"ZuDtDlm0pD","gtCA5OUqFM","9XyT9YjB9t","JkzUn7ku1p","IjTwPZUnqt","7hyVvlm0pD","KZamHUmaEv","7Ow5C07n1c","JKWYRBbwgA","IRh48SmGzv",
+"tl72Whi5X7","G1RhSxReec","VLTy6azIWp","FxX9q1LB1L","VjCZqWmadA","5Drn0uLtKs","tlILtTwano","ni2v1n8pJ9","MezSWCqqaD","CIShGCqqaD",
+"vLsmSprNT6","2ZHdkQ6Lix","5Mg9roQ87r","KsjRKydG8U","fmIK1ReKEW","K20wK9y4lw","K4GS8hUTw7","7X3uyzHF1q","0ao3l8cVD3","sqVrfgdQsS",
+"FjHXRJKWYR","i7WMQK4GS8","K4GS89iGoT","gf8rIbrhlQ","uPX7GRxrsm","uZPqg4QMc9","rz7UtVLTy6","6AFT0P6bcg","pFrrlKr8ys","hYBCKe6e4z",
+"580YDGrDg7","lXFOByToGW","d85a98hJdt","XflUqK20wK","3weIFRzaZA","DLhzM0YAGH","dhSuHjSjS3","AOgEeCp3mZ","fcwDaDz1R3","KsjRKAkKTk",
+"0ao3l5ZaEz","bgJAzjfREu","i3pydHzZT8","0PktIWaim6","Yf2EcOz8yZ","WaWsvlH1kt","Pb1paX6Pin","rz7UtkB5nP","lm0pDpT8wu","taOXKuTacx",
+"DLhzM7X3uy","SWfou7fKYU","XyPZNJ2mQi","5Mg9rS2Dfu","UmaEvVerEA","hSSvQB3qem","s4786soy9t","qQxHPStlDJ","48cHLxXTI4","NhXdu9iGoT",
+"Gv3FqxXTI4","gdQsSqaofN","0h1b1faHir","5Nammix74r","bZLvSL7cGc","ni2v1fmIK1","fLNg8s7Mxk","FPfSEi7WMQ","vOqCEMmsIo","8RCUAIn3NS",
+"BFkb8KASQ8","XflUqIn3NS","kB5nPpWiOs","3weIFRxrsm","6AFT0jeskS","Ul4a1BbwgA","s478655rfB","OUYuF7ku1p","No0Qb9GXkX","e6e4z4W0Tl",
+"VLTy6wDajX","s4786jtn0X","zmLYDk85Ae","cShY2yluBx","5IhmG1j5L8","tAOsrwDajX","JXljW0YAGH","Uvlv4HRxd8","jeskSpAhR1","nlaBy6q6L9",
+"FcWrWs93Ml","VIlwPguMb8","Z4I1vBCxeC","KASQ8C2Irc","Waim6Qworu","n1pmOsoy9t","gf8rIvLsmS","MK07YFNYIM","8FmFHeuZA5","No0Qb5iGN5",
+"d7vjMsoy9t","Cfgr3atef2","WMiS3HzZT8","xciqpLDk6f","HlUbFI7p2a","W7cTsIBe8k","P6bcg2Nslm","DG4sTzHF1q","djsrvRACuj","StlDJhe9IA",
+"oQ87rwDajX","8FmFHsx5Gl","BCxeCFxX9q","HP433uLtKs","Chuy3Z4I1v","2hEEUIRh48","MezSWzFgtB","I7p2aFwEJz","RpBQmFPfSE","CdyBVIRh48",
+"5Nammzz4ZU","sqVrfJ2mQi","L7cGcuvf7A","P6bcguvf7A","oQ87r7Ow5C","vLsmS5Namm","pFrrlzbIYY","yluBxtlILt","AgJHQQChxs","yluBxY1mC0",
+"FLsphO3iyQ","yvOMI5nmWv","8RCUAuN6r3","tl72WjiVBP","lCMxyCIShG","jS1ajMGlTF","FVMxopWiOs","GWqqXQChxs","0MR5XYh1hF","MmKGJzFgtB",
+"48cHLOz8yZ","dhSuHGSQwj","BCxeCs4786","hSSvQzY1GY","Cp3mZO3iyQ","NAFuwuJScX","7hyVvWDVWJ","CdyBVFFDui","tjQxsKZamH","DLhzMbgJAz",
+"Cfgr3zHF1q","rz7UtYw2oU","StlDJJXljW","faHirVBjhz","RBhp0KASQ8","ydG8UBpYhV","0MR5XStlDJ","POUYSn8pJ9","580YDiwzGk","tvdkDTwano",
+"gtCA5iB08l","Oz8yZ8cVD3","hE1QllH1kt","y94nw55rfB","StlDJuZPqg","hE1QllsQGo","dpe1vRzaZA","FGzgptjQxs","W7cTsWaim6","dhSuHVIlwP",
+"ThjNn2DREs","JKWYRmz8gx","hE1Qld7vjM","zmLYDFcWrW","GrDg7taOXK","prNT6faHir","FhtglfcwDa","1j5L8BFkb8","29QAzLDk6f","YjB9tfaHir",
+"0PktIeuZA5","14FLRbrhlQ","QssNCThjNn","pFrrlbgJAz","h1zcH3otm6","Chuy3VerEA","gIYvEyEfy9","vOqCE618Di","dhSuHk85Ae","5iGN5YjB9t",
+"kZANm9eoRc","nFqikQworu","3otm6YOfrY","KASQ8UlU3M","POUYSpFrrl","QssNCfFDrJ","tlILtVjCZq","5ZaEzZzJHW","v8yFN16lHc","7X3uy4W0Tl",
+"lViBvDLhzM","Dz1R36q6L9","5iGN5Zv7z0","JXljWWaWsv","uN6r30MR5X","GXdoH5drc6","0ao3luZPqg","jfREuKsjRK","ZUnqtJ2mQi","y94nwP6bcg",
+"KsjRKQworu","Oz8yZhSSvQ","kB5nPFNYIM","aFFssnlaBy","AkKTkFnPFB","Ss0ZuU3yw5","FhtgldQ586","tvdkDFhtgl","QYxC045cIH","QbxXcSs0Zu",
+"uupzkVerEA","LbRTH5Mg9r","VjCZqVjCZq","O3iyQxXTI4","jeskSuoStw","XyPZNJkzUn","zqH0WjfREu","4QMc9JJs5m","jtn0X9XyT9","NhXdu5VZjS",
+"IRh488xEKz","m4bxUQYxC0","jtn0XX6Pin","lm0pD7hyVv","rz7UtQWxoT","5nmWv7hyVv","uupzkQYxC0","Rxrsmru4UG","Ss0ZuRACuj","dmoS7RACuj",
+"CK5W7ZzJHW","kB5nP07n1c","t98iWVjCZq","k85AeyofH3","euZA5qUJMd","JJs5mQnJ1S","16lHcJXljW","55rfBkZANm","i7WMQEoToP","KsjRKWmadA",
+"piJSkQssNC","0MR5XzbIYY","0PktI8TxD7","qQxHPVNCPd","8xEKzfFDrJ","DLhzMRzaZA","RkQkeKr8ys","JIqXifaHir","FPfSE07n1c","8TxD7hUTw7",
+"lkMUApiJSk","X6Pin8U2nU","XyPZNMmKGJ","ksJbySWfou","i3pydaez9y","Mkgy8sx5Gl","Z4I1vlweGy","16lHcnFqik","euZA58xEKz","64s8NcmXIX",
+"2DREsFxX9q","AXpwEOHaBz","AgJHQ2Nslm","yluBxpmeCd","8xEKzMaJQs","ksJbyguMb8","gtCA5FjHXR","t98iWJRJQB","GXdoHrhl0J","9eoRcF6PT2",
+"jeskSXyPZN","Y1mC0okgRi","zY1GY6q6L9","d7vjMMaJQs","t59lRogLgc","580YDFhtgl","UmaEvKsjRK","Cp3mZ618Di","nFqikuAWyp","uTacxzFgtB",
+"Chuy3WreyP","LewvMCNHmv","FwEJzWmadA","CK5W724ARF","DcpWBa00b5","No0QbRxrsm","0Kyfs3weIF","ThjNnReKEW","lH1ktLewvM","bgJAzkZANm",
+"iqv4kuJScX","yofH33weIF","In3NSS77LH","lj07QZJTXH","C2IrcQbxXc","a00b5FVMxo","0h1b1s4786","CNHmvgIYvE","TXQ0ZvLsmS","yluBxuZPqg",
+"Z4I1v2Nslm","zQt6QKr8ys","nFqikFNYIM","uN6r3lH1kt","yofH3FNYIM","wiHrZ7ku1p","okgRiaDGtS","1v5hHVerEA","ksJbypv0i7","aL6AJTwano",
+"DG4sTQ6Lix","v8yFNmz8gx","iB08lIKxdL","mX2GEuLtKs","ciuWzPYBf4","6q6L9K4GS8","LbRTHMm8si","ZhwG1iwzGk","pvgjSprNT6","CdyBV0YAGH",
+"uoStw8RCUA","Ss0ZuvkCHH","Ss0ZuQnJ1S","bZLvSgjUTu","BbwgAM6qcG","iwzGkECMvU","8hJdtX6Pin","lsQGoaez9y","bgJAzzFgtB","yvOMIJJs5m",
+"X6Pinpv0i7","IjTwP55rfB","s7MxkX6Pin","PYBf4X6Pin","VLTy6LDk6f","fLNg8lXFOB","uZPqgStlDJ","AIYUuNo0Qb","Yh1hFCp3mZ","tl72WFxX9q",
+"hi5X7UmaEv","ulk41s4786","lCMxyjfREu","B3qemMmsIo","nFqikpFrrl","nnP8oIRh48","5NammP6bcg","taOXKt98iW","wDajXQ6hMC","nnP8oWreyP",
+"U3yw5nFqik","kB5nPIBe8k","MezSWWmadA","s93MlTwano","dhSuHWPmlx","In3NScmXIX","4QMc9RzaZA","uTacxZuDtD","rKDLJQClRL","RzaZAgdQsS",
+"yEfy9bZLvS","BCxeCrKDLJ","l83UdcL0aE","8FmFHjzUqR","hE1Ql64s8N","b29RJfmIK1","1v5hHqUJMd","uN6r3ZJTXH","KsjRKuQIcz","1v5hHfqypy",
+"5ZaEzdQ586","nlaBybrhlQ","8xEKzgjUTu","cQOnvulk41","24ARF1v5hH","2DREsazIWp","2DREstjQxs","FGzgpxReec","DG4sTFwEJz","HzZT8uN6r3",
+"ogLgcCp3mZ","W7cTszY1GY","0BmCyzqH0W","BFkb8M6qcG","lViBvtlILt","WDVWJvOqCE","AOgEeQssNC","zY1GYaez9y","tlILtk85Ae","9y4lwStlDJ",
+"5ZaEz580YD","mz8gxsqVrf","GXdoH7lUXZ","EdBKc1v5hH","ReKEWHzZT8","aDGtSvOqCE","brhlQFPfSE","7X3uyb29RJ","4W0TlAOgEe","fFDrJh1zcH",
+"rKDLJGv3Fq","0BmCytl72W","s93Mld7vjM","i3pydJkzUn","FwEJzGv3Fq","1j5L8n1pmO","CdyBVFGzgp","EOE1ocQOnv","No0QbUvlv4","uPX7G8hJdt",
+"uupzk7fsYM","RkQkeuJScX","Uvlv48hJdt","jiVBPRxrsm","48cHLs4786","jzUqRuAWyp","24ARFrKDLJ","v2eC3In3NS","AkKTkMezSW","zQt6QThjNn",
+"ZuDtDbZLvS","okgRiOxWIH","s93MlQChxs","atef2nFqik","v2eC3AIYUu","uZPqgxciqp","h1zcHEdBKc","bZLvSC2Irc","o8Uyda00b5","0YAGHzqH0W",
+"Kr8ysd7vjM","cShY2n8pJ9","0BmCysqVrf","dhSuHRsQUq","TCgPpuTacx","POUYSDz1R3","jiVBPNxx9V","Cp3mZbgJAz","lj07QVBjhz","9XyT9n1pmO",
+"S77LH4QMc9","zbIYYtaOXK","BCxeC2DREs","WMiS3Pb1pa","mz8gxbrhlQ","pAhR1sx5Gl","fcJOydmoS7","KASQ84W0Tl","lpF6Wjtn0X","EoToPyEfy9",
+"S2DfuaDGtS","brhlQSs0Zu","gdQsSpWiOs","ZUnqtDLhzM","zbIYYCxVEf","8RCUAs4786","O3iyQdhSuH","ydG8UBFkb8","iB08liB08l","i7WMQlCMxy",
+"C2IrcQ6Lix","lH1ktkB5nP","ydG8URACuj","BbwgAb29RJ","BbwgA2Yz7E","MK07Yx3LDe","ksJbyl83Ud","NhXdu618Di","guMb8zbIYY","Ta8f6DcpWB",
+"580YDaez9y","W3VFHYjB9t","uvf7AX6Pin","CK5W7nnP8o","mz8gx7hyVv","VLTy6uLtKs","aDGtS5nmWv","8hJdts4786","29QAzyEfy9","HRxd8EdBKc",
+"5VZjSxReec","5iGN5i7WMQ","JRJQBNcICA","zmLYDY1mC0","D6rByFPfSE","Q6LixI7p2a","RBhp0uoStw","Q6LixuPX7G","fLNg8In3NS","ru4UGuoStw",
+"tl72WKASQ8","brhlQ8TxD7","GXdoHd7vjM","Y1mC0SjskQ","4QMc9hUTw7","cQOnvB3qem","AOgEelCMxy","yEfy95iGN5","TXQ0Zs4786","No0Qb9y4lw",
+"VerEAs7Mxk","I7p2ayvOMI","Zv7z0ZUnqt","okgRihe9IA","ogLgcG1RhS","uAWypIRh48","7Ow5C9eoRc","RsQUqVprf2","faHirh1zcH","wDajXFjHXR",
+"OUqFMlViBv","ogLgcn1pmO","d7vjMgf8rI","iB08l5Drn0","CNHmvQWxoT","IKxdLP6bcg","djsrvVerEA","XflUqpv0i7","e6e4zThjNn","yofH3uoStw",
+"Mkgy8Oz8yZ","aez9ydpe1v","xReeceuZA5","lkMUAuZPqg","uLtKs9iGoT","7lUXZJIqXi","zQt6QSs0Zu","sx5GlMGlTF","s93Mly94nw","CNHmvFjHXR",
+"9XyT9ksJby","618Dijtn0X","tAOsrgIYvE","S2Dfu2Nslm","uZPqgNcICA","Yh1hFjS1aj","Chuy3lCMxy","RzaZAG1RhS","4dEz6AkKTk","zHF1qReKEW",
+"pT8wu07n1c","LewvMyToGW","iKqhryToGW","uLtKsUl4a1","ReKEWv8yFN","KASQ8qUJMd","iB08l8cVD3","uN6r3WreyP","4dEz645cIH","lj07QCfgr3",
+"jzUqRbrhlQ","lweGyVLTy6","m4bxU9iGoT","OHaBz2Nslm","dQ586WaWsv","h1zcHyvOMI","JRJQBfaHir","JIqXiiqv4k","NOHszcShY2","t98iW07n1c",
+"VBjhzQworu","7hyVv5ZaEz","soy9tuoStw","RpBQmuJScX","Waim6J2mQi","okgRid7vjM","AmdQdQClRL","azIWpsqVrf","guMb85iGN5","0YAGHRpBQm",
+"FxX9q7lUXZ","IRh4864s8N","NAFuw7hyVv","S77LHLewvM","zbIYYQYxC0","blLA9FjHXR","SjskQSmGzv","jSjS3yluBx","iqv4kOUYuF","D6rByRmDcr",
+"7Ow5CYOfrY","JRJQBFnPFB","Q6hMCGXdoH","jeskShUTw7","uLtKsxciqp","zQt6QyToGW","No0QbZzJHW","JkzUn580YD","Kr8ysciuWz","uTacxt98iW",
+"cQOnvlj07Q","y94nw4QMc9","EdBKc9GXkX","9eoRc2TRI7","Yw2oU2DREs","uupzkVBjhz","qaofNbZLvS","O3iyQvOqCE","pvgjSRkQke","618Diiqv4k",
+"zQt6QgIYvE","y94nwguMb8","gdQsSuN6r3","Zv7z05ZaEz","FcWrW1v5hH","rhl0JS77LH","bgJAzix74r","MaJQsRxrsm","zY1GYMmsIo","Mkgy8v1Hln",
+"hi5X72Yz7E","FcWrWDLhzM","RmDcro8Uyd","zmLYDhi5X7","zHF1q0YAGH","X6PinsuY4x","dpe1vZzJHW","h1zcHCNHmv","ru4UGjS1aj","KASQ8Rxrsm",
+"wDajXjfREu","ECMvUlXFOB","MK07Y7lUXZ","zQt6QQssNC","KASQ89iGoT","TCgPpAXpwE","BGaQYzY1GY","8RCUAFhtgl","7lUXZOxWIH","sx5GljS1aj",
+"MGlTFFcWrW","K4GS8lXFOB","gdQsSMK07Y","8cVD3zmLYD","IRh48AgJHQ","fqypyM3zXL","ix74rRxrsm","VerEA0Wr5y","O3iyQh1zcH","VerEACfgr3",
+"VBjhzxReec","GXdoH2DREs","oGu6xl83Ud","CNHmvpvgjS","uTacxEdBKc","qQxHPVerEA","uN6r30Wr5y","8RCUABbwgA","Ss0Zu1v5hH","ThjNn55rfB",
+"dQ586uAWyp","OxWIHgIYvE","MmKGJWPmlx","ksJby0h1b1","lViBvuQIcz","O3iyQIn3NS","t59lRSs0Zu","mX2GEYw2oU","rKDLJQworu","rKDLJCdyBV",
+"jiVBPfcJOy","zz4ZUgf8rI","yToGWAmdQd","okgRikB5nP","0Wr5ytlILt","JkzUnBpYhV","qUJMdAkKTk","Vprf2aez9y","9y4lwEdBKc","lsQGoRACuj",
+"5drc6FcWrW","lsQGoiB08l","Mkgy8qUJMd","Q6Lix8xEKz","DcpWBs4786","cShY2uoStw","S2DfuCqqaD","zz4ZULewvM","tjQxs5Drn0","n8pJ95nmWv",
+"dmoS7WmadA","FGzgp2TRI7","P6bcglViBv","Yf2Ecv2eC3","CqqaDSWfou","d85a9gtCA5","5ZaEz55rfB","a00b5nFqik","aL6AJJIqXi","K20wKJ2mQi",
+"9iGoT1j5L8","gtCA50PktI","Oz8yZFwEJz","lH1ktgjUTu","ReKEWRsQUq","RACujFPfSE","EOE1oAXpwE","NhXduoGu6x","9y4lw0BmCy","IRh48FjHXR",
+"fcwDaSjskQ","xReecsx5Gl","iKqhr6q6L9","Oz8yZaDGtS","SjskQAXpwE","n8pJ9e6e4z","rhl0JjeskS","7lUXZ9GXkX","7hyVvjzUqR","jeskSjzUqR",
+"KASQ8TXQ0Z","Cp3mZGrDg7","hUTw7Yw2oU","uupzkCK5W7","45cIHhSSvQ","RACuj2ZHdk","IjTwP4W0Tl","M3zXLi7WMQ","2ZHdkYOfrY","BFkb8QClRL",
+"v1HlnZJTXH","lweGyyvOMI","580YD2hEEU","hE1QltuDyS","MaJQs2TRI7","v2eC3yofH3","BCxeCYh1hF","tl72WbrhlQ","tuDyS8xEKz","4dEz6vLsmS",
+"W3VFHOxWIH","OUYuFkB5nP","7fsYMGXdoH","Kr8ysd85a9","cmXIXzHF1q","pWiOsEOE1o","cL0aEv8yFN","SbRYyx3LDe","hUTw75Namm","FNYIMk85Ae",
+"mX2GE4QMc9","ZJTXHMkgy8","rhl0Jfqypy","uoStwQnJ1S","4QMc9I7p2a","U3yw5RpBQm","FFDuioQ87r","gdQsSoGu6x","GWqqX9eoRc","2NslmgIYvE",
+"CK5W7y94nw","ru4UGhUTw7","WreyPPOUYS","gIYvEvkCHH","X6PinydG8U","brhlQTwano","fqypyZ4I1v","lpF6WIjTwP","7fKYUdQ586","JIqXi07n1c",
+"mX2GE5Drn0","3otm648cHL","OUqFM2Nslm","QClRL0h1b1","a00b5dmoS7","Chuy3tl72W","HRxd8HzZT8","n1pmOpFrrl","Yw2oUo8Uyd","5ZaEzd7vjM",
+"tvdkDTa8f6","ZJTXHY1mC0","5ZaEzbgJAz","6q6L9FVMxo","AmdQd48cHL","fLNg8m4bxU","Nxx9VkZANm","EdBKciwzGk","GSQwjuupzk","d7vjMrz7Ut",
+"RpBQmlsQGo","StlDJpT8wu","Mm8si3weIF","jiVBPpiJSk","2Nslm2Yz7E","cmXIXiKqhr","RsQUqn1pmO","SWfoujfREu","KASQ8TCgPp","e6e4zdjsrv",
+"lkMUAVprf2","nnP8oMojnP","VBjhzb29RJ","QssNCS2Dfu","lj07QZhwG1","iB08lQworu","aL6AJU3yw5","piJSkWPmlx","o8Uyd14FLR","hi5X7Gv3Fq",
+"EdBKcUlU3M","6AFT0FVMxo","dhSuH8xEKz","GrDg7WMiS3","pv0i7FcWrW","IKxdLJXljW","uoStwjfREu","IjTwPlpF6W","07n1clj07Q","S77LHCIShG",
+"yvOMI8hJdt","CNHmvOHaBz","h1zcHd7vjM","B3qemWDVWJ","D6rByiKqhr","qQxHPaFFss","lCMxyGv3Fq","GSQwj4dEz6","IBe8ks93Ml","Q6hMCMaJQs",
+"0MR5XL7cGc","ni2v1jzUqR","AXpwEfqypy","HfyNQWDVWJ","1LB1L3otm6","Cp3mZpFrrl","DLhzMKASQ8","W3VFHRxrsm","DcpWBuTacx","BbwgAGXdoH",
+"5nmWvhUTw7","0BmCyXyPZN","0h1b1Fhtgl","cShY2qUJMd","CK5W7Mkgy8","MezSWjfREu","64s8NTXQ0Z","a00b59GXkX","AOgEejeskS","qUJMdOUqFM",
+"jSjS3gtCA5","uoStwpv0i7","580YDrKDLJ","PYBf4bZLvS","xReecEoToP","StlDJSbRYy","1j5L8J2mQi","EOE1oSWfou","pFrrl0Kyfs","NcICANhXdu",
+"EoToPAgJHQ","faHir0Kyfs","xReec9XyT9","7lUXZzqH0W","Oz8yZ6AFT0","5Drn0LDk6f","DQimpM6qcG","qQxHPNo0Qb","KASQ8NAFuw","uQIczFFDui",
+"5NammRsQUq","UlU3MM6qcG","GrDg7StlDJ","v2eC3nnP8o","KZamHWaim6","Yw2oUfaHir","fqypyMGlTF","D6rByjSjS3","8hJdt2DREs","SWfouGSQwj",
+"4QMc9PYBf4","CxVEfUmaEv","pWiOsUl4a1","O3iyQWaWsv","FnPFBVprf2","ECMvUZv7z0","LewvM0BmCy","fmIK148cHL","2TRI77ku1p","vOqCESmGzv",
+"FFDui7Ow5C","vkCHHMaJQs","mX2GEpiJSk","tl72WAgJHQ","dQ586K4GS8","iqv4klpF6W","2TRI7JkzUn","2hEEUtl72W","d7vjMSjskQ","uZPqgNAFuw",
+"VjCZq14FLR","O3iyQNxx9V","JkzUnNhXdu","ZuDtD8U2nU","5Mg9r1j5L8","W3VFHjeskS","t59lRDcpWB","FVMxocL0aE","LewvMpv0i7","ksJbySmGzv",
+"ksJbydhSuH","lm0pDx3LDe","XyPZNhYBCK","v2eC3sx5Gl","5VZjS64s8N","OUYuFuoStw","ogLgcUmaEv","RACujbgJAz","5iGN5okgRi","zbIYYzqH0W",
+"JKWYRo8Uyd","zFgtBwDajX","b29RJWDVWJ","Gv3FqFVMxo","HP433uZPqg","CK5W7he9IA","0YAGHSbRYy","taOXKSWfou","tl72WFLsph","S2DfuUvlv4",
+"0Kyfs14FLR","ogLgchUTw7","jeskSpWiOs","xciqp29QAz","J2mQiMm8si","CqqaDtaOXK","AmdQd1LB1L","2ZHdkC2Irc","SjskQKsjRK","2TRI7jfREu",
+"Oz8yZ64s8N","OHaBzAmdQd","pvgjSW3VFH","ZJTXHt98iW","9XyT9O3iyQ","CIShGYf2Ec","h1zcHSs0Zu","rhl0JHfyNQ","64s8NdQ586","Nxx9VNo0Qb",
+"aL6AJtjQxs","SbRYytlILt","OUYuFRBhp0","tvdkDn8pJ9","a00b5WaWsv","U3yw5GrDg7","rKDLJIBe8k","uLtKsIBe8k","fFDrJuZPqg","JkzUnQnJ1S",
+"FhtgliKqhr","RBhp0tjQxs","djsrvOxWIH","SbRYyuZPqg","vOqCEpiJSk","fmIK1mX2GE","t59lRtvdkD","GrDg7SbRYy","IRh48FGzgp","Waim6ru4UG",
+"ZhwG1JXljW","guMb8I7p2a","gIYvErKDLJ","yToGWK20wK","xXTI4iqv4k","djsrvS77LH","yluBxPYBf4","UlU3MQssNC","WreyPCIShG","Ss0Zub29RJ",
+"s93MlK4GS8","yluBxnlaBy","8FmFHaFFss","5drc6hE1Ql","soy9tb29RJ","WMiS3AmdQd","MaJQslCMxy","2TRI7ZhwG1","Gv3FqLDk6f","Waim6WaWsv",
+"2TRI7fcJOy","7X3uys7Mxk","xXTI40Wr5y","F6PT2I7p2a","8hJdtxReec","iKqhruAWyp","29QAzQnJ1S","HlUbFlpF6W","lCMxypvgjS","FxX9qiB08l",
+"jeskS7fKYU","vkCHHtjQxs","faHirBGaQY","48cHLYf2Ec","oQ87rJRJQB","TCgPp8xEKz","lCMxygtCA5","sx5Gl24ARF","i3pydydG8U","pFrrlNAFuw",
+"fmIK12Yz7E","n1pmOazIWp","5VZjSFwEJz","HRxd8yvOMI","5Mg9rMojnP","lweGyIjTwP","JKWYRtuDyS","8FmFHlj07Q","n8pJ9n1pmO","nnP8oZhwG1",
+"jeskSiwzGk","Gv3FqP6bcg","6AFT0Mkgy8","MK07YyToGW","hUTw7O3iyQ","fLNg8EOE1o","W3VFHM6qcG","aez9ydmoS7","fmIK19XyT9","BpYhV9iGoT",
+"OUqFMpT8wu","5Drn0uAWyp","prNT6jiVBP","07n1cOUqFM","VjCZqv8yFN","NcICAcQOnv","F6PT2Cp3mZ","OUYuFZhwG1","iqv4krKDLJ","XflUqatef2",
+"SmGzvyToGW","RsQUquAWyp","Cfgr37fsYM","8hJdt5Mg9r","xReeco8Uyd","fcJOyBpYhV","lm0pDStlDJ","FNYIMAgJHQ","P6bcggtCA5","yToGWpWiOs",
+"L7cGc0MR5X","9iGoT0Wr5y","t98iWs4786","Waim6i7WMQ","2Yz7Egf8rI","yEfy9DLhzM","Mm8sihe9IA","Cfgr3oQ87r","Y1mC02hEEU","Rxrsm580YD",
+"BCxeCNOHsz","HfyNQgtCA5","Y1mC0I7p2a","n1pmOjiVBP","JKWYRiB08l","RsQUqfcwDa","48cHLChuy3","QworuGSQwj","Z4I1vXflUq","07n1cuPX7G",
+"ni2v1LbRTH","rhl0JoGu6x","MojnP9y4lw","RzaZACK5W7","lViBvokgRi","MK07YVjCZq","guMb8M6qcG","G1RhSnFqik","cShY29rlg9","yofH3xXTI4",
+"tl72W5drc6","JRJQBOUYuF","JRJQBuPX7G","FnPFBzY1GY","BbwgAt59lR","pAhR14dEz6","xReecM3zXL","5IhmGsx5Gl","CNHmv7ku1p","7ku1pwiHrZ",
+"lXFOBiB08l","euZA5zY1GY","KsjRKVIlwP","aFFssjeskS","aL6AJIRh48","S2DfuEOE1o","GrDg77ku1p","B3qemThjNn","StlDJS77LH","pmeCdiKqhr",
+"fFDrJRmDcr","i7WMQkZANm","hYBCKtuDyS","oGu6xQWxoT","580YDStlDJ","x3LDe14FLR","Yh1hFjiVBP","lH1ktIKxdL","TwanoOUYuF","P6bcglsQGo",
+"2NslmPOUYS","9eoRcuTacx","Oz8yZbgJAz","uZPqgYw2oU","RsQUqQworu","djsrvChuy3","jS1ajjS1aj","CxVEfdpe1v","cmXIXChuy3","WPmlxKZamH",
+"Cp3mZpT8wu","Ul4a148cHL","lweGyLbRTH","5Drn0SWfou","uAWypDLhzM","FNYIMfcwDa","lkMUA0BmCy","lweGydjsrv","dpe1vBbwgA","NcICAOHaBz",
+"0h1b1DLhzM","GSQwjuLtKs","oQ87rgtCA5","CqqaDZzJHW","ZuDtDhi5X7","pvgjSJkzUn","IBe8kS77LH","uZPqgi7WMQ","EdBKcAIYUu","8FmFHk85Ae",
+"CqqaDhi5X7","Ul4a1h1zcH","FLsphVprf2","Ta8f6PYBf4","G1RhSK20wK","nnP8oGrDg7","2NslmFjHXR","zHF1qeuZA5","RBhp0jS1aj","fmIK1BFkb8",
+"fcwDa64s8N","64s8NuZPqg","pFrrlVBjhz","hi5X7ru4UG","FNYIMBpYhV","WreyPOHaBz","0Wr5ykB5nP","1j5L8zz4ZU","zqH0WYOfrY","ZuDtDWmadA",
+"BFkb81LB1L","OUqFM5Mg9r","2ZHdkDG4sT","OUqFM5IhmG","2NslmlkMUA","zHF1q5nmWv","OUqFMh1zcH","Yf2EcOHaBz","48cHLzY1GY","brhlQlsQGo",
+"K20wKCqqaD","oGu6x64s8N","8hJdtQ6hMC","a00b5aFFss","8hJdtd7vjM","7lUXZYh1hF","JRJQBvOqCE","he9IA7Ow5C","5ZaEzAXpwE","ix74rMm8si",
+"AmdQd8FmFH","l83Udmz8gx","VBjhz9iGoT","m4bxUFPfSE","L7cGcXflUq","piJSkI7p2a","G1RhSW7cTs","AOgEeoVQp6","5iGN5Dz1R3","oQ87rChuy3",
+"kZANmrKDLJ","14FLR0ao3l","ZuDtD7Ow5C","d7vjM5ZaEz","U3yw5jS1aj","gIYvE2TRI7","gdQsS7X3uy","qUJMdM3zXL","lH1ktB3qem","HlUbFC2Irc",
+"FcWrWYw2oU","blLA9xciqp","s7Mxk580YD","9GXkX2ZHdk","Dz1R3QYxC0","8xEKzEoToP","zbIYY7fKYU","NhXduFGzgp","KsjRKxReec","dpe1vfmIK1",
+"WmadAIn3NS","7hyVvjS1aj","OxWIHFFDui","Waim6GrDg7","aDGtSxXTI4","KsjRK1v5hH","4W0TlZJTXH","jzUqRL7cGc","GSQwjm4bxU","ZUnqt2Nslm",
+"RmDcr14FLR","pWiOsaez9y","0h1b1fcwDa","n8pJ96AFT0","JJs5mLewvM","48cHLJIqXi","S77LHuTacx","uPX7GEdBKc","s7MxkK4GS8","tuDySI7p2a",
+"OxWIHsqVrf","QnJ1SThjNn","9rlg9MojnP","1v5hHFFDui","hi5X79y4lw","Kr8yshE1Ql","J2mQiulk41","MGlTF4dEz6","No0QbBFkb8","QChxsMmKGJ",
+"t59lRi7WMQ","uvf7A24ARF","ksJby8TxD7","rz7UtpWiOs","cmXIX5Drn0","VIlwPuvf7A","piJSkQ6hMC","MGlTFuTacx","StlDJ55rfB","ZUnqtpmeCd",
+"oQ87rdQ586","LewvMTXQ0Z","mz8gxReKEW","Ss0ZuFxX9q","MaJQshYBCK","blLA9uvf7A","POUYS5Namm","tlILtCxVEf","WmadAhi5X7","ogLgcNOHsz",
+"pT8wuQ6Lix","hYBCKQnJ1S","KASQ8RsQUq","5IhmG7X3uy","uLtKsVLTy6","gdQsSydG8U","O3iyQUl4a1","euZA5lH1kt","jtn0XUl4a1","n1pmOyvOMI",
+"FLsphsuY4x","RkQkebZLvS","618Di3otm6","DQimpokgRi","OxWIHCNHmv","FFDui0Kyfs","nlaByNOHsz","ZuDtDd85a9","MaJQsJkzUn","uvf7AvOqCE",
+"CIShG55rfB","yToGW5VZjS","gjUTuyluBx","VNCPdCIShG","s7Mxk0BmCy","8cVD3WmadA","v8yFNo8Uyd","9iGoTKASQ8","Yh1hFDQimp","gdQsS5drc6",
+"WreyPfmIK1","POUYSFNYIM","JkzUn4W0Tl","v2eC3Twano","lj07QlH1kt","AOgEeqUJMd","bgJAzlXFOB","8RCUA8FmFH","FGzgpnlaBy","mz8gxFxX9q",
+"8TxD7uvf7A","8xEKzOUYuF","CK5W7MGlTF","9y4lwRBhp0","ni2v1ni2v1","oGu6x0ao3l","8xEKzi7WMQ","AkKTk0PktI","he9IAogLgc","zqH0WMGlTF",
+"07n1cHlUbF","atef2Mkgy8","618DiMK07Y","v2eC3fqypy","14FLR6AFT0","Q6hMCiqv4k","In3NS45cIH","LDk6fuN6r3","JJs5mHRxd8","bgJAzM6qcG",
+"dmoS7Z4I1v","Q6hMC2ZHdk","POUYSgtCA5","Cp3mZjiVBP","tjQxszbIYY","aez9yECMvU","uPX7GYjB9t","0MR5XOUYuF","MezSW4QMc9","zmLYDXflUq",
+"QYxC0LDk6f","rKDLJ7Ow5C","ogLgcWaim6","5iGN5lsQGo","ix74rBCxeC","QworuYOfrY","HfyNQtAOsr","lj07Qt59lR","v1HlnSmGzv","OxWIHW7cTs",
+"RkQke2DREs","I7p2a1LB1L","5NammNxx9V","oVQp6Mkgy8","Kr8ysiB08l","FGzgpO3iyQ","Yf2Ec8FmFH","8FmFH8TxD7","pWiOsMGlTF","LDk6fvkCHH",
+"i3pydThjNn","BGaQYKASQ8","yEfy95IhmG","VerEAKsjRK","FVMxoLewvM","xciqp8hJdt","2Nslmv1Hln","KASQ82Nslm","qQxHPvOqCE","5IhmGiB08l",
+"IBe8kxReec","K4GS81LB1L","s7MxkAOgEe","AgJHQAgJHQ","3weIFAOgEe","In3NSAmdQd","NhXdurz7Ut","pvgjSeuZA5","XflUqjSjS3","lm0pDWmadA",
+"MaJQsS2Dfu","QWxoTMojnP","Waim629QAz","HzZT8In3NS","s4786D6rBy","nlaBy9rlg9","2DREsQWxoT","16lHclweGy","ECMvU0PktI","Uvlv4FLsph",
+"CxVEfCdyBV","mz8gxDz1R3","8hJdt07n1c","XyPZNhUTw7","okgRizQt6Q","nnP8oF6PT2","WmadA48cHL","gtCA5ciuWz","y94nwZuDtD","CqqaDWmadA",
+"zY1GY0YAGH","mz8gxwiHrZ","POUYSWmadA","2hEEU0h1b1","5IhmGSmGzv","mz8gxgtCA5","VIlwPyofH3","MK07YLbRTH","o8UydMGlTF","ix74ra00b5",
+"ReKEWatef2","qaofNqaofN","oVQp6faHir","WPmlxCp3mZ","L7cGcbZLvS","zmLYD9GXkX","fLNg8mX2GE","uJScXuLtKs","2hEEUGXdoH","PYBf4yofH3",
+"StlDJXflUq","vkCHHOUYuF","fqypy7Ow5C","lm0pDCfgr3","FFDui55rfB","GXdoHMkgy8","v1HlncQOnv","gIYvEVprf2","zbIYYaFFss","Mkgy8KsjRK",
+"Yf2Eche9IA","AXpwEqQxHP","wDajXOUqFM","LDk6fW3VFH","G1RhSQWxoT","uZPqgOUYuF","618DiChuy3","dmoS73weIF","pvgjSiKqhr","SjskQpiJSk",
+"G1RhSM3zXL","Uvlv4U3yw5","yToGWbgJAz","IRh48QssNC","fcwDaHzZT8","VBjhzP6bcg","rhl0JIn3NS","IBe8koVQp6","Ss0ZuAkKTk","KsjRK5VZjS",
+"iqv4k5Namm","SmGzvn8pJ9","suY4x24ARF","CIShGQworu","JRJQBtvdkD","Uvlv4CK5W7","fcJOysoy9t","FhtglW3VFH","5ZaEz0Wr5y","B3qemSjskQ",
+"Gv3FqEdBKc","tlILtCdyBV","CxVEfvkCHH","nnP8oSWfou","K4GS8P6bcg","0KyfsgtCA5","ydG8UjeskS","t59lRaDGtS","zz4ZUZhwG1","9eoRc4W0Tl",
+"6AFT0uupzk","GWqqXyluBx","6q6L916lHc","vLsmSuLtKs","0BmCyeuZA5","S2Dfu8hJdt","XyPZNMK07Y","dhSuH5Drn0","ZJTXHS2Dfu","rz7Ut3otm6",
+"oQ87rY1mC0","aFFssAmdQd","i7WMQGXdoH","VNCPdCp3mZ","P6bcgB3qem","Oz8yZ0Wr5y","fLNg8i7WMQ","FwEJzxciqp","Ta8f6EOE1o","4QMc9oGu6x",
+"i3pydSWfou","VjCZqYjB9t","BFkb8aFFss","sx5Glrhl0J","FcWrWCdyBV","MojnPyluBx","zHF1qokgRi","zFgtBDQimp","OxWIHWPmlx","FhtglVprf2",
+"Oz8yZNhXdu","618Dix3LDe","AgJHQSjskQ","S77LHxReec","faHirzHF1q","I7p2aAkKTk","29QAz0YAGH","VBjhzdjsrv","C2IrcMezSW","FVMxoUvlv4",
+"fLNg8O3iyQ","6q6L9jzUqR","Ta8f6lj07Q","DcpWBwDajX","5nmWvgjUTu","IRh48pAhR1","KZamHsuY4x","Q6LixFjHXR","x3LDeCdyBV","iqv4kG1RhS",
+"iqv4kAOgEe","HlUbF48cHL","n1pmOvOqCE","Yh1hFZUnqt","8U2nUHfyNQ","zbIYYG1RhS","h1zcHpWiOs","FFDuicL0aE","aez9y5IhmG","uQIczatef2",
+"wDajXVjCZq","gf8rIjzUqR","5drc68TxD7","ciuWzHRxd8","x3LDepmeCd","5nmWviB08l","5iGN50MR5X","uvf7At98iW","5nmWvHRxd8","atef2hE1Ql",
+"GrDg7D6rBy","7Ow5CCp3mZ","azIWpm4bxU","5Namm5IhmG","MmKGJECMvU","xciqpe6e4z","i7WMQogLgc","ZzJHWKZamH","14FLRpvgjS","9y4lwYw2oU",
+"CNHmv29QAz","tlILtsx5Gl","taOXKeuZA5","618DiNo0Qb","JIqXiIRh48","Ta8f69rlg9","Uvlv4JJs5m","X6PinVNCPd","x3LDex3LDe","AOgEeOUqFM",
+"pv0i74W0Tl","faHircL0aE","NhXduI7p2a","pWiOsv8yFN","mX2GE2Yz7E","d85a9zz4ZU","7Ow5Cru4UG","7hyVv2TRI7","7ku1p45cIH","fqypyd85a9",
+"FcWrWOz8yZ","taOXKS77LH","RmDcr5IhmG","jeskS5Namm","Y1mC07ku1p","piJSk5IhmG","5iGN5QbxXc","In3NSXyPZN","QssNCOz8yZ","uPX7GWaWsv",
+"ThjNnCK5W7","ECMvUtl72W","m4bxUzmLYD","K20wKRpBQm","SjskQIKxdL","580YDmX2GE","QYxC0OUYuF","S77LHuN6r3","EdBKcL7cGc","7ku1pZzJHW",
+"fcwDaRxrsm","ZUnqthe9IA","zFgtBVerEA","FGzgpAIYUu","POUYSzqH0W","5ZaEzh1zcH","OUqFMQworu","Q6Lixx3LDe","2TRI7faHir","6AFT0dmoS7",
+"Cfgr3Cp3mZ","ru4UGTXQ0Z","Yw2oUB3qem","4W0Tl8U2nU","Gv3FqOHaBz","7hyVv8hJdt","dpe1vFwEJz","s93MlgIYvE","9GXkX7lUXZ","AkKTkJXljW",
+"ZuDtDSmGzv","0ao3lgtCA5","fmIK1gdQsS","EoToPSjskQ","5VZjSRpBQm","3weIFKZamH","8hJdt5nmWv","jSjS3RmDcr","tAOsrbZLvS","2Nslma00b5",
+"CdyBVnnP8o","D6rByrhl0J","0PktI9rlg9","uQIcz1v5hH","IjTwPpmeCd","JXljWaDGtS","7fsYMhi5X7","CxVEfm4bxU","MezSWBCxeC","soy9tQClRL",
+"M3zXLsx5Gl","J2mQilViBv","Dz1R3h1zcH","uvf7Aa00b5","aFFssRxrsm","WPmlxOUYuF","nnP8otlILt","tAOsryToGW","3weIFBbwgA","F6PT2Kr8ys",
+"sqVrf5Drn0","cQOnvfaHir","VjCZqTXQ0Z","hYBCKokgRi","h1zcHix74r","PYBf4QbxXc","DG4sT1j5L8","ogLgc5ZaEz","Y1mC02Yz7E","Yf2EcDG4sT",
+"Ss0Zu8xEKz","vOqCEZzJHW","2DREsokgRi","Ul4a1zmLYD","h1zcHjtn0X","GWqqX0Wr5y","2Yz7EdmoS7","rz7UtQnJ1S","Dz1R3qUJMd","Oz8yZVBjhz",
+"bgJAzFPfSE","JJs5mvOqCE","Cfgr3pFrrl","lXFOBNcICA","Kr8ysi3pyd","jS1ajFPfSE","yluBx4QMc9","NcICAlkMUA","dQ586QnJ1S","lXFOB1LB1L",
+"AXpwEJRJQB","5Mg9rYw2oU","ogLgcMezSW","L7cGclkMUA","zqH0WvLsmS","0h1b1aez9y","L7cGccmXIX","Zv7z0UlU3M","618DilpF6W","8cVD3FLsph",
+"pWiOssx5Gl","t98iWWaWsv","MojnPksJby","lj07QdmoS7","tuDySiqv4k","2Yz7EoQ87r","nlaBy0Kyfs","WaWsvazIWp","oQ87rb29RJ","djsrvNAFuw",
+"4dEz6U3yw5","7Ow5CEOE1o","OUqFMIRh48","W7cTsVLTy6","hSSvQTa8f6","UmaEvlj07Q","zqH0WQbxXc","Vprf2Fhtgl","BGaQY8U2nU","07n1cQworu",
+"FxX9qmX2GE","1v5hHNxx9V","WreyPl83Ud","4QMc9Twano","6q6L9XflUq","8cVD30YAGH","8xEKzReKEW","sqVrfoGu6x","fmIK1AXpwE","FjHXRBFkb8",
+"Cfgr3azIWp","IBe8k7lUXZ","vLsmSuvf7A","Zv7z0GSQwj","JJs5mAOgEe","K4GS88xEKz","IBe8kWaWsv","t59lR0Kyfs","fcJOykB5nP","UlU3MCIShG",
+"lXFOBd7vjM","ReKEWzmLYD","bZLvSxReec","G1RhSMaJQs","Mm8siS2Dfu","OUqFM4dEz6","yvOMIOxWIH","RpBQmd7vjM","guMb8ydG8U","OUYuF5ZaEz",
+"WMiS3y94nw","vOqCEIKxdL","0Wr5y580YD","14FLRYf2Ec","LbRTHtjQxs","QnJ1SlweGy","pv0i7FxX9q","8TxD7tvdkD","ulk41WPmlx","MaJQstAOsr",
+"RxrsmIBe8k","CxVEfjzUqR","TCgPpksJby","7lUXZS2Dfu","OHaBzxReec","yEfy9pmeCd","ciuWzyluBx","ThjNn0MR5X","JkzUnFPfSE","TCgPpCfgr3",
+"7Ow5ClViBv","0ao3lTXQ0Z","LbRTHuupzk","G1RhSksJby","TwanoM6qcG","0ao3liwzGk","2DREsaez9y","oVQp6euZA5","UmaEvZUnqt","YOfrY2ZHdk",
+"okgRiulk41","nlaByzmLYD","IKxdLqUJMd","FnPFBk85Ae","TCgPpZv7z0","azIWppmeCd","vkCHH9iGoT","zqH0WKsjRK","0h1b1fmIK1","qQxHP5Mg9r",
+"4dEz6qaofN","pmeCdpAhR1","uoStwW3VFH","aez9y618Di","lsQGoL7cGc","vkCHHn1pmO","JRJQBxXTI4","4dEz6LewvM","EOE1oVNCPd","nFqiksx5Gl",
+"BFkb8WmadA","7ku1pjfREu","Zv7z03otm6","9XyT9AOgEe","P6bcgsuY4x","RsQUqF6PT2","5Mg9rM3zXL","fcwDaRkQke","tvdkDFcWrW","5iGN5ulk41",
+"9iGoT55rfB","uQIczCdyBV","x3LDeZhwG1","oQ87ruAWyp","ReKEWS77LH","lH1ktgf8rI","Dz1R3FVMxo","gjUTunlaBy","EdBKc9eoRc","pvgjSEdBKc",
+"Pb1pacShY2","Q6hMCY1mC0","fcwDa7Ow5C","v2eC3fcJOy","wiHrZ2Nslm","2ZHdkbgJAz","n8pJ9ix74r","EdBKcUmaEv","fqypyzQt6Q","jS1ajBGaQY",
+"2ZHdkFFDui","uAWypQChxs","HRxd8Twano","yvOMIyofH3","v8yFNBpYhV","kZANmt59lR","VjCZqW7cTs","JIqXiEOE1o","MezSWU3yw5","lsQGoRxrsm",
+"FwEJzKZamH","RkQkeQWxoT","RsQUqsoy9t","zHF1qqaofN","29QAzfLNg8","KsjRKEdBKc","7X3uyO3iyQ","SmGzv9eoRc","580YDzHF1q","OxWIHTCgPp",
+"jS1ajhSSvQ","8U2nU5ZaEz","Q6hMCt98iW","ZuDtDEdBKc","prNT6SmGzv","SWfouLbRTH","7lUXZ0YAGH","U3yw5zHF1q","4QMc9OUYuF","FPfSEuJScX",
+"AkKTkUmaEv","WaWsv5VZjS","0PktIoVQp6","blLA9RzaZA","s93MlVIlwP","ZuDtDuTacx","n1pmODG4sT","gtCA5C2Irc","ZhwG1XflUq","wiHrZNhXdu",
+"5iGN5AIYUu","0KyfsCqqaD","ThjNnk85Ae","gdQsSQClRL","AgJHQ0Wr5y","5ZaEz64s8N","FxX9qs93Ml","lH1ktYOfrY","zqH0WjiVBP","cShY2y94nw",
+"ZJTXHCIShG","kB5nPzQt6Q","NAFuwRkQke","aL6AJCNHmv","rKDLJNo0Qb","n8pJ9jfREu","uTacxfmIK1","HfyNQcL0aE","VIlwP2DREs","4W0TlrKDLJ",
+"sqVrfHP433","azIWpRmDcr","7fKYUxciqp","lH1ktAmdQd","Oz8yZciuWz","JJs5mWMiS3","NhXdutl72W","RxrsmZuDtD","bgJAzuAWyp","pAhR1POUYS",
+"SmGzvFFDui","BbwgAoVQp6","RzaZAd85a9","JkzUn4dEz6","5VZjSGv3Fq","qaofN55rfB","IjTwPb29RJ","5nmWvjfREu","mX2GEmX2GE","JIqXiZuDtD",
+"VerEAjtn0X","vLsmSHRxd8","iB08lS2Dfu","pvgjSogLgc","4W0Tl9y4lw","Oz8yZTXQ0Z","AkKTkFcWrW","s4786HfyNQ","pvgjSHlUbF","FwEJzFPfSE",
+"v8yFN6AFT0","zbIYYP6bcg","7lUXZuPX7G","MK07YdQ586","gIYvEF6PT2","3weIFpiJSk","O3iyQcmXIX","aFFssaDGtS","580YDl83Ud","9GXkXyEfy9",
+"uN6r3iqv4k","RmDcrS77LH","s93MlfFDrJ","QClRLGWqqX","J2mQini2v1","GWqqXWMiS3","NAFuwsoy9t","0MR5XWPmlx","o8UydrKDLJ","xXTI4POUYS",
+"fcJOyyToGW","qQxHPCdyBV","FFDui64s8N","yofH31LB1L","SmGzvVjCZq","NAFuw07n1c","v1Hlnxciqp","JIqXiFFDui","AmdQdCp3mZ","CIShGdQ586",
+"RkQkeYOfrY","UmaEv8TxD7","Z4I1vGSQwj","ECMvUGSQwj","IRh489iGoT","uTacxZhwG1","7hyVv7hyVv","16lHcd85a9","uN6r3RACuj","AOgEelkMUA",
+"2ZHdk9y4lw","I7p2aazIWp","t59lR5Drn0","FVMxoBbwgA","MK07YciuWz","Oz8yZ8FmFH","kB5nPZUnqt","9iGoTZUnqt","pWiOsuvf7A","pv0i7MojnP",
+"BCxeCtuDyS","DcpWB5Drn0","TCgPpMezSW","dQ586sx5Gl","QClRLHRxd8","HzZT88TxD7","a00b52DREs","9y4lwru4UG","580YDhe9IA","0h1b1Oz8yZ",
+"Dz1R3hSSvQ","MaJQscQOnv","FnPFB0ao3l","s4786fcJOy","48cHLokgRi","1j5L8ksJby","ZUnqtZzJHW","cmXIXWaim6","Waim6fLNg8","UmaEvatef2",
+"MGlTFI7p2a","v2eC3aL6AJ","J2mQitAOsr","lCMxy618Di","uupzkFFDui","zY1GYS77LH","P6bcgZhwG1","bZLvSUl4a1","d7vjM0Wr5y","lweGyvkCHH",
+"FNYIMJIqXi","5VZjSokgRi","gf8rILDk6f","sqVrfrz7Ut","aDGtSuLtKs","MezSWJ2mQi","rKDLJVerEA","he9IA24ARF","blLA9d85a9","ZzJHW7fsYM",
+"Nxx9VMkgy8","ydG8UzQt6Q","M3zXLe6e4z","uJScXTXQ0Z","WreyPReKEW","9rlg9RmDcr","s4786AkKTk","4QMc9d7vjM","MGlTFJXljW","sx5GlDz1R3",
+"tjQxs5Mg9r","guMb8tl72W","PYBf4aL6AJ","3weIFGXdoH","s93MlC2Irc","hi5X7MK07Y","Ta8f6AIYUu","XyPZNM6qcG","6AFT0zY1GY","EOE1ov8yFN",
+"pFrrlx3LDe","In3NSCK5W7","2Yz7EThjNn","7Ow5CRzaZA","OxWIHcmXIX","580YDcShY2","AOgEev2eC3","m4bxU0ao3l","HfyNQ29QAz","JkzUnDcpWB",
+"gtCA5CqqaD","6AFT0yToGW","ix74rCdyBV","yToGWx3LDe","2NslmaFFss","O3iyQt98iW","64s8NfmIK1","9y4lwyToGW","64s8NK20wK","oQ87rfLNg8",
+"FcWrW0PktI","n8pJ9lpF6W","UlU3M8TxD7","5Drn0tlILt","kZANmgtCA5","FwEJzoGu6x","JkzUnRpBQm","24ARFtl72W","cShY28cVD3","SWfouzqH0W",
+"wDajX3weIF","RkQke8hJdt","DcpWBWaim6","X6PinbZLvS","jeskSaFFss","6AFT0bZLvS","yluBxDG4sT","2hEEUuTacx","RpBQmguMb8","Yw2oUaez9y",
+"RmDcrhYBCK","4QMc9NAFuw","cQOnvW3VFH","ni2v1v1Hln","OUYuFhe9IA","AIYUuLewvM","t98iWEdBKc","rz7UtlweGy","hE1QlAkKTk","7fKYUO3iyQ",
+"AXpwE07n1c","FLsphhe9IA","NOHszsuY4x","Waim6XflUq","JRJQBuTacx","he9IAnnP8o","zmLYDvLsmS","F6PT2CqqaD","U3yw55Drn0","CqqaDTXQ0Z",
+"ydG8UhSSvQ","Yf2Ecjtn0X","ThjNn5Mg9r","xReecrz7Ut","prNT6OHaBz","h1zcHi3pyd","2Yz7EIKxdL","yluBx5VZjS","K20wKix74r","nFqikksJby",
+"0BmCyCNHmv","XflUqSjskQ","cmXIXhUTw7","jtn0XWaWsv","YjB9tFLsph","HfyNQIKxdL","AIYUue6e4z","24ARF0ao3l","W7cTsjiVBP","4dEz6ciuWz",
+"KASQ8618Di","CK5W7cShY2","RsQUqyluBx","Vprf2Cfgr3","FPfSEpFrrl","P6bcgnlaBy","VIlwPy94nw","uJScXcShY2","hSSvQfaHir","d7vjMa00b5",
+"Ul4a1s7Mxk","JXljWtAOsr","ix74rXyPZN","MmsIohSSvQ","5iGN5JkzUn","Ta8f6rKDLJ","AXpwEMm8si","XyPZNfqypy","uZPqg5Namm","vLsmS5IhmG",
+"mX2GEVerEA","AgJHQ1LB1L","5Namm29QAz","CxVEfWMiS3","azIWpLbRTH","ZuDtDFjHXR","Z4I1vZuDtD","pv0i7n1pmO","14FLRGSQwj","Cfgr38xEKz",
+"n1pmOzHF1q","wDajX9y4lw","s7MxkNOHsz","W7cTstjQxs","MezSWUl4a1","yvOMI7hyVv","MojnPW7cTs","Rxrsmaez9y","cQOnvpWiOs","TwanoStlDJ",
+"WmadAqQxHP","Cp3mZdmoS7","VjCZqgtCA5","ZuDtDZ4I1v","lweGy5Namm","zqH0WIRh48","fqypyWMiS3","AmdQd5VZjS","4dEz6VjCZq","dpe1vh1zcH",
+"Mm8sisuY4x","oVQp68TxD7","LbRTHWreyP","Ss0ZutjQxs","uoStwzz4ZU","WreyPFGzgp","8TxD7Ss0Zu","ZuDtD07n1c","s7MxkUlU3M","NAFuw8cVD3",
+"Ss0Zu3weIF","Mkgy80ao3l","ZzJHWF6PT2","FPfSExReec","JIqXitAOsr","In3NSwDajX","Mm8sicL0aE","ni2v1JRJQB","bZLvSyEfy9","hE1Ql2Nslm",
+"RkQke55rfB","FjHXRwDajX","X6Pinn8pJ9","lm0pD6AFT0","ZUnqtIRh48","DG4sTqUJMd","pv0i7DLhzM","HzZT85nmWv","5NammQ6Lix","v1HlnRkQke",
+"cQOnvuTacx","zz4ZUW3VFH","MezSWv8yFN","8cVD32ZHdk","ZuDtDHlUbF","8xEKzdmoS7","i3pydCxVEf","s4786h1zcH","dQ586CK5W7","uvf7AWaim6",
+"zY1GYWDVWJ","ECMvU4dEz6","tjQxsZ4I1v","VBjhznFqik","cShY2tAOsr","8RCUAGSQwj","h1zcHsqVrf","v1HlnUmaEv","IBe8kMezSW","rz7UtZuDtD",
+"BFkb8SjskQ","e6e4zKsjRK","9eoRcTa8f6","7ku1pix74r","Mkgy8IjTwP","qUJMd8FmFH","VNCPdrKDLJ","TCgPp5IhmG","Cp3mZ5VZjS","yToGW8FmFH",
+"e6e4zSs0Zu","Fhtgl2TRI7","XflUq0MR5X","pvgjS6AFT0","LewvML7cGc","MojnPChuy3","07n1cGrDg7","oQ87rFwEJz","rz7UtbrhlQ","nlaByfFDrJ",
+"9GXkXHRxd8","AkKTko8Uyd","WPmlxulk41","m4bxUfcJOy","xciqp7lUXZ","5Drn03otm6","0Wr5yLewvM","0Wr5yuQIcz","dQ586pv0i7","M6qcGbrhlQ",
+"QbxXcgjUTu","OUqFMNxx9V","zHF1qjiVBP","7X3uyiB08l","aFFss9rlg9","kZANmDz1R3","9y4lwtAOsr","MGlTFDLhzM","uvf7Agf8rI","MaJQsM3zXL",
+"K20wKBGaQY","SWfoui7WMQ","x3LDe2TRI7","d85a9B3qem","FcWrW9iGoT","D6rByOHaBz","YOfrYpvgjS","3otm6sx5Gl","OUYuFv2eC3","y94nwL7cGc",
+"QssNCMGlTF","2Yz7E5nmWv","Q6hMChYBCK","OUqFMB3qem","uLtKsReKEW","jfREu5Mg9r","NcICA0Kyfs","J2mQiQbxXc","uLtKspFrrl","pvgjSYOfrY",
+"RBhp07fKYU","dmoS75drc6","HzZT84QMc9","pAhR1U3yw5","4dEz68FmFH","qUJMdGv3Fq","vkCHHyvOMI","d7vjM7Ow5C","S77LHatef2","OxWIHFxX9q",
+"IKxdLWmadA","taOXKyluBx","mX2GEsx5Gl","JKWYRuupzk","ix74rhE1Ql","suY4xK4GS8","sx5GlcL0aE","mz8gx48cHL","CxVEfW7cTs","RkQkes4786",
+"Ul4a1WreyP","S77LHGSQwj","ni2v1s7Mxk","K4GS8NAFuw","0h1b1OUYuF","Ss0ZuFjHXR","ECMvU5Namm","ReKEWFxX9q","LDk6fDG4sT","FnPFByToGW",
+"soy9tUvlv4","VLTy6Cfgr3","EOE1oyluBx","LewvM9eoRc","brhlQDz1R3","Ta8f6HfyNQ","cmXIXY1mC0","5Drn0AkKTk","JIqXiMGlTF","9GXkXi3pyd",
+"HlUbFFxX9q","9GXkXVBjhz","oGu6xY1mC0","G1RhSpFrrl","FPfSEECMvU","EdBKcfLNg8","tAOsrYjB9t","mz8gx0PktI","HlUbFUlU3M","PYBf4iB08l",
+"rKDLJGrDg7","GXdoHDz1R3","uPX7GM3zXL","5ZaEzUmaEv","Kr8ysAOgEe","tuDySGSQwj","KZamH5ZaEz","TXQ0Za00b5","QWxoTyEfy9","jS1aj45cIH",
+"uTacxblLA9","oVQp60PktI","7fKYUfaHir","Yf2Ec14FLR","tl72WqQxHP","WmadAtlILt","GXdoHa00b5","guMb8JJs5m","3weIF580YD","hE1QlhYBCK",
+"pv0i7FFDui","6q6L9NAFuw","7X3uyOz8yZ","GrDg7s93Ml","CqqaDfcJOy","n8pJ9x3LDe","WMiS32Yz7E","rKDLJUl4a1","brhlQJXljW","hi5X7sx5Gl",
+"JRJQBQnJ1S","8cVD3jeskS","F6PT2zFgtB","07n1cNhXdu","0MR5XTwano","1LB1L5VZjS","IBe8klsQGo","BFkb8jfREu","RACujCNHmv","sx5GloGu6x",
+"m4bxUqUJMd","DcpWBRmDcr","TCgPpFPfSE","YOfrYfcJOy","UmaEvVjCZq","M6qcGpT8wu","pAhR1v8yFN","BbwgAAkKTk","OxWIHd85a9","b29RJmX2GE",
+"yofH3taOXK","AmdQdNo0Qb","oVQp6i7WMQ","dQ586ix74r","rz7UtVerEA","i3pyd9y4lw","lpF6WSWfou","ix74rRzaZA","8hJdttlILt","07n1cDz1R3",
+"JJs5msoy9t","FwEJzVLTy6","uAWypCNHmv","s93MlpT8wu","blLA9Ss0Zu","vLsmSd7vjM","M6qcGciuWz","NAFuwpFrrl","dpe1vF6PT2","s93MlvkCHH",
+"v1HlnKZamH","7fsYMOxWIH","0Wr5ySbRYy","h1zcH2Yz7E","pWiOsnFqik","aez9y5nmWv","d7vjM2DREs","Pb1pazbIYY","64s8N5Mg9r","5NammZ4I1v",
+"Vprf2k85Ae","MmsIo8FmFH","bgJAzNo0Qb","FGzgpcmXIX","e6e4zzY1GY","618DiXflUq","Fhtgl580YD","pmeCdfaHir","yvOMIG1RhS","QYxC0pAhR1",
+"48cHLtuDyS","lXFOBuvf7A","EOE1oL7cGc","2ZHdkKZamH","n1pmO6q6L9","uAWypAkKTk","BGaQYwiHrZ","uTacxNOHsz","RpBQmsx5Gl","VBjhzhE1Ql",
+"atef2iB08l","FVMxotl72W","ydG8U7lUXZ","5nmWvWaWsv","he9IABpYhV","h1zcHIKxdL","jzUqRazIWp","cQOnvKASQ8","lH1ktUl4a1","d85a9SWfou",
+"AOgEeGSQwj","POUYSTa8f6","TXQ0ZCqqaD","QChxs3otm6","azIWp8cVD3","3otm6aL6AJ","TXQ0ZPb1pa","rz7UtKASQ8","QssNCgtCA5","he9IALDk6f",
+"pFrrllCMxy","m4bxU8cVD3","2hEEUB3qem","U3yw5WreyP","iqv4ksuY4x","FxX9qlsQGo","oGu6x5Mg9r","ReKEWStlDJ","lm0pDJKWYR","GXdoHFjHXR",
+"SWfou0Kyfs","wDajXP6bcg","OUqFMFPfSE","wDajX6AFT0","24ARFd7vjM","WDVWJCxVEf","Y1mC0e6e4z","B3qem9XyT9","nFqikVjCZq","2NslmDQimp",
+"bZLvSQ6hMC","ZuDtDNAFuw","JJs5mqQxHP","gf8rIQWxoT","5IhmG07n1c","Fhtgl55rfB","e6e4zX6Pin","IRh48wDajX","oQ87rK4GS8","7ku1ps7Mxk",
+"uJScXcmXIX","HzZT8dQ586","SjskQydG8U","5iGN5guMb8","9iGoTyofH3","4W0TlMGlTF","WaWsvS77LH","DcpWBuPX7G","UmaEvuLtKs","NOHszlCMxy",
+"uupzk9eoRc","AmdQdNhXdu","aez9ytuDyS","ThjNnt59lR","zHF1qblLA9","ZzJHWBFkb8","Ul4a1RmDcr","a00b5In3NS","QworuDQimp","HRxd8tvdkD",
+"7hyVvNOHsz","EdBKctaOXK","rz7UtECMvU","y94nwhe9IA","HlUbFFPfSE","MK07YuTacx","guMb8tvdkD","AOgEei7WMQ","9y4lwZ4I1v","WreyPGSQwj",
+"9rlg9HRxd8","AmdQdWPmlx","lweGyYjB9t","QClRLDz1R3","uTacxRACuj","FGzgpLbRTH","4dEz616lHc","DLhzMFhtgl","pFrrlVprf2","tuDySqQxHP",
+"OxWIH7hyVv","aDGtSIBe8k","Mm8siFVMxo","QnJ1Sfqypy","GWqqXFcWrW","7lUXZ1v5hH","I7p2asx5Gl","lkMUAuupzk","ZuDtDNxx9V","JJs5mMm8si",
+"pvgjSFwEJz","zHF1qUl4a1","m4bxUJRJQB","MaJQsoQ87r","5Namm8TxD7","CqqaDIRh48","zFgtBtaOXK","6q6L9Nxx9V","lj07QsuY4x","rKDLJFGzgp",
+"okgRiru4UG","5nmWveuZA5","MmsIorKDLJ","suY4x8xEKz","RsQUqjSjS3","K4GS86AFT0","Waim6BbwgA","QnJ1ShYBCK","RpBQm2Yz7E","6q6L9s7Mxk",
+"XyPZNeuZA5","i3pyd1LB1L","YOfrYSs0Zu","1j5L8kB5nP","JXljW2ZHdk","0Wr5yfLNg8","QChxsbZLvS","8FmFHVprf2","BGaQYDLhzM","ThjNntjQxs",
+"618DihE1Ql","yToGWNOHsz","9GXkXS2Dfu","2Yz7ECqqaD","gIYvEK20wK","d7vjMhYBCK","jfREuDcpWB","VLTy6CqqaD","k85Ae8RCUA","vLsmS5Drn0",
+"BbwgAcmXIX","9rlg9hi5X7","WPmlxWDVWJ","HP433yluBx","y94nwDG4sT","3otm6GSQwj","OUqFM7Ow5C","ix74rDQimp","FNYIMEoToP","MmsIoK20wK",
+"8TxD7djsrv","FhtgllsQGo","pv0i7Rxrsm","ECMvUPb1pa","jS1ajiqv4k","Y1mC03otm6","xReec2DREs","RxrsmuJScX","DQimpzHF1q","X6PinAOgEe",
+"3weIFtvdkD","vLsmSazIWp","RkQkeEoToP","9eoRc8TxD7","5IhmGUmaEv","OxWIHguMb8","SWfouQbxXc","v2eC3cL0aE","VerEA2Yz7E","8U2nUtuDyS",
+"VjCZqMmKGJ","Q6hMCIRh48","fFDrJCfgr3","7fKYUJRJQB","JkzUnZv7z0","hi5X7RmDcr","RACujtuDyS","No0QbCIShG","Ul4a1gIYvE","Z4I1vgf8rI",
+"CqqaDXyPZN","QssNCjS1aj","fLNg8okgRi","JRJQBQworu","iwzGkd85a9","580YD8cVD3","In3NSyofH3","Cfgr3GXdoH","XflUquQIcz","7Ow5CpFrrl",
+"v2eC38RCUA","dhSuH2hEEU","rz7UtIn3NS","VerEAv2eC3","0YAGH4W0Tl","tl72WyToGW","pAhR1Ul4a1","xciqpi7WMQ","Y1mC0QWxoT","IKxdLjSjS3",
+"Ss0ZuuLtKs","Uvlv4XyPZN","gjUTuhe9IA","Q6hMCtaOXK","sx5GlpiJSk","okgRiNcICA","WMiS3Yw2oU","zFgtB1j5L8","lpF6WmX2GE","fLNg8P6bcg",
+"fcwDa9y4lw","618Dihi5X7","e6e4zTa8f6","uPX7GlXFOB","vkCHHoVQp6","DLhzMXflUq","F6PT2M6qcG","brhlQmz8gx","dQ586JkzUn","suY4xzqH0W",
+"hYBCK4W0Tl","JkzUnOz8yZ","QnJ1Satef2","QnJ1SksJby","uTacxJXljW","FwEJzlXFOB","3weIFYf2Ec","bgJAz2hEEU","QnJ1SDLhzM","jS1ajjSjS3",
+"fFDrJtvdkD","W7cTsDLhzM","6AFT0J2mQi","6q6L9cQOnv","KASQ8D6rBy","uAWyplCMxy","VIlwPfFDrJ","64s8NFhtgl","WPmlxnFqik","RBhp0zY1GY",
+"WreyP0PktI","kZANmECMvU","vLsmSzQt6Q","Mm8sirhl0J","HRxd8yofH3","l83UdKr8ys","ksJby0BmCy","yluBxix74r","vOqCEBbwgA","gtCA5YjB9t",
+"WaWsvJ2mQi","Zv7z0n1pmO","l83Udv8yFN","Ta8f60ao3l","ZzJHW1j5L8","yofH3jSjS3","k85AegIYvE","BbwgAtlILt","fcJOyMm8si","Yw2oUGv3Fq",
+"9eoRcvOqCE","BFkb80YAGH","FNYIMAkKTk","lkMUADLhzM","sqVrfSjskQ","Yw2oUDG4sT","azIWprhl0J","VLTy6nFqik","jSjS3CIShG","DLhzMAkKTk",
+"k85AejfREu","uZPqgjSjS3","zmLYDgjUTu","Pb1paUmaEv","i7WMQiB08l","YOfrYJKWYR","8RCUAdpe1v","CIShGCxVEf","CK5W7mz8gx","BCxeC48cHL",
+"7fKYURBhp0","e6e4zUmaEv","7fsYM1LB1L","e6e4zG1RhS","cmXIXzY1GY","kZANmMm8si","AXpwEVIlwP","nnP8o2ZHdk","ZhwG1580YD","Mm8siBFkb8",
+"tuDySMkgy8","sqVrfYw2oU","cmXIXNOHsz","tl72WK4GS8","0BmCyWDVWJ","lH1ktlweGy","0YAGHRxrsm","X6Pinmz8gx","MojnPs93Ml","zmLYDUlU3M",
+"ru4UGuJScX","KZamHwDajX","EOE1ofFDrJ","JRJQBBCxeC","kZANm48cHL","WaWsvBpYhV","yEfy98hJdt","jtn0XzbIYY","8U2nUNxx9V","uoStw45cIH",
+"Mkgy8JJs5m","580YDUl4a1","4dEz6Yf2Ec","zQt6QLbRTH","5IhmG0Wr5y","45cIHtuDyS","UmaEv3weIF","RBhp024ARF","sx5Gl1LB1L","xReec07n1c",
+"e6e4zHlUbF","S77LHmz8gx","tuDySRsQUq","iwzGkpAhR1","5IhmG8TxD7","sqVrfOxWIH","5drc6Kr8ys","7lUXZIjTwP","FwEJznnP8o","EOE1ouQIcz",
+"Ss0Zu1j5L8","FLsphqaofN","UmaEvuTacx","he9IAVBjhz","8cVD3oGu6x","euZA5ulk41","I7p2aulk41","AmdQd618Di","rz7UtCqqaD","AgJHQIjTwP",
+"JIqXilH1kt","he9IAydG8U","o8UydWaim6","JXljWGSQwj","fFDrJzQt6Q","pvgjSpAhR1","hi5X7FxX9q","O3iyQyluBx","MezSWKASQ8","I7p2arhl0J",
+"mz8gx8RCUA","2Yz7EGXdoH","OHaBzsuY4x","i3pyddjsrv","XyPZNix74r","djsrv9rlg9","brhlQG1RhS","prNT6pAhR1","guMb8WDVWJ","HP433hE1Ql",
+"2ZHdk8cVD3","HRxd8uoStw","D6rBy1LB1L","nFqikVBjhz","In3NSuN6r3","QssNCs7Mxk","uvf7Auupzk","WaWsvLewvM","Ta8f6ZUnqt","kZANmazIWp",
+"xXTI4yluBx","AXpwEReKEW","G1RhSaez9y","VIlwPm4bxU","5drc6OxWIH","KZamHKr8ys","t98iWSs0Zu","DLhzMBCxeC","rz7UtrKDLJ","ReKEWrhl0J",
+"zQt6QiKqhr","FxX9qW7cTs","DG4sT45cIH","uTacxwiHrZ","EoToP07n1c","MmKGJDcpWB","ZuDtDt59lR","VBjhztl72W","2DREsVLTy6","FxX9q7X3uy",
+"o8UydblLA9","uTacxCp3mZ","QworuMK07Y","uZPqgGv3Fq","4W0Tls7Mxk","hYBCKAkKTk","gtCA5Q6hMC","nlaByrKDLJ","lkMUArz7Ut","9XyT9RBhp0",
+"ZJTXHnFqik","OUqFMpAhR1","tlILtK20wK","Yf2EcjSjS3","FPfSEiwzGk","5Drn00PktI","J2mQiqaofN","JJs5m5drc6","0MR5XJKWYR","jeskSQssNC",
+"CxVEfVjCZq","CNHmvxXTI4","hi5X7GWqqX","blLA9rKDLJ","rKDLJtjQxs","lsQGoyvOMI","RACujUlU3M","7hyVv8TxD7","djsrvWmadA","x3LDeGrDg7",
+"IRh48yToGW","VLTy6XflUq","Dz1R35drc6","EdBKcqQxHP","jeskS9eoRc","soy9t0MR5X","zY1GYLbRTH","QworuIjTwP","Y1mC0lCMxy","1v5hHRzaZA",
+"gdQsSFhtgl","DLhzM9rlg9","Gv3Fqv1Hln","FnPFBJ2mQi","7lUXZt98iW","Ul4a1YjB9t","lXFOBt98iW","gf8rIFhtgl","fcJOy7fKYU","618Dipv0i7",
+"2hEEUJ2mQi","iqv4kMezSW","K20wKEdBKc","OUqFMI7p2a","MezSWciuWz","RpBQmlweGy","fqypygdQsS","HRxd8SjskQ","MaJQsKsjRK","FGzgpMkgy8",
+"5Namms7Mxk","lH1ktNhXdu","K4GS8ReKEW","yEfy9yToGW","ReKEWMK07Y","JKWYRJRJQB","lpF6WAmdQd","hSSvQTXQ0Z","uZPqgVjCZq","yToGWDG4sT",
+"xciqphi5X7","iqv4k7hyVv","ogLgcRsQUq","W3VFH9eoRc","29QAz5nmWv","s7MxkZuDtD","uZPqg16lHc","d85a9Fhtgl","WPmlxQClRL","oVQp6RBhp0",
+"Y1mC0brhlQ","ni2v1WaWsv","qQxHPNcICA","ix74r4W0Tl","fcwDaYw2oU","WDVWJ618Di","0Wr5yHRxd8","2ZHdkuLtKs","zY1GYQ6hMC","ECMvUTwano",
+"zQt6QwDajX","QClRLpFrrl","cShY2JkzUn","aL6AJ16lHc","faHirOxWIH","LewvMrKDLJ","nlaByYh1hF","QssNC9y4lw","XyPZND6rBy","zHF1qY1mC0",
+"uN6r3QWxoT","Rxrsm24ARF","hi5X7Zv7z0","lj07QSWfou","FjHXROxWIH","pFrrlK4GS8","D6rBys93Ml","atef25nmWv","8TxD7SbRYy","VBjhzx3LDe",
+"OxWIHGSQwj","cL0aEsx5Gl","QChxsrz7Ut","xReecGrDg7","h1zcHtuDyS","64s8NlCMxy","5ZaEzIKxdL","ni2v1taOXK","iKqhrlkMUA","RxrsmuN6r3",
+"Q6LixThjNn","LDk6fjS1aj","uPX7GQChxs","cQOnvBFkb8","ReKEWYh1hF","l83UdjS1aj","n8pJ9o8Uyd","ZzJHWYjB9t","uvf7AXflUq","blLA9DQimp",
+"tAOsrKsjRK","9eoRcAmdQd","uAWypNAFuw","StlDJy94nw","KsjRKI7p2a","yluBxCK5W7","FNYIMQworu","cShY2RmDcr","POUYStAOsr","0Kyfs2hEEU",
+"pvgjSpmeCd","Q6hMC7hyVv","yofH3FFDui","07n1cjfREu","cmXIX14FLR","ZJTXHe6e4z","lCMxy8TxD7","NcICAFGzgp","618DiW7cTs","1v5hHvOqCE",
+"WmadAZuDtD","lkMUAs7Mxk","fmIK15iGN5","VLTy68FmFH","8TxD7pAhR1","2TRI7ksJby","euZA5v2eC3","KASQ8hUTw7","7fsYMlweGy","iqv4kgjUTu",
+"yluBxhE1Ql","Chuy39y4lw","WMiS3ReKEW","yluBxRkQke","55rfBKZamH","suY4xIBe8k","oGu6xt98iW","0Wr5yAkKTk","djsrvFGzgp","KsjRKEOE1o",
+"48cHLK20wK","16lHcI7p2a","xReec9eoRc","zmLYDF6PT2","0Wr5ypiJSk","euZA5pvgjS","0MR5Xy94nw","Zv7z0JXljW","8cVD3M3zXL","IRh48sqVrf",
+"uQIczM6qcG","5drc6ZzJHW","dhSuHDG4sT","29QAzazIWp","CxVEfuvf7A","hi5X7In3NS","Yf2EcAOgEe","HP433NAFuw","VLTy6l83Ud","nnP8oni2v1",
+"suY4xiqv4k","dQ586QssNC","iKqhrJIqXi","tvdkD7lUXZ","VNCPd7lUXZ","TCgPpRsQUq","Oz8yZuupzk","blLA9dhSuH","0MR5Xaez9y","VIlwPX6Pin",
+"Yh1hFX6Pin","ogLgcoQ87r","Ta8f68FmFH","Q6hMCJKWYR","3weIFlweGy","TXQ0ZeuZA5","cL0aEjiVBP","M6qcGguMb8","taOXKYf2Ec","W7cTscQOnv",
+"ogLgc618Di","Y1mC0Q6Lix","U3yw5YjB9t","RBhp0oGu6x","v1HlnTa8f6","5IhmGMkgy8","yEfy9fcwDa","azIWpL7cGc","fFDrJogLgc","StlDJvOqCE",
+"lXFOBs4786","FLsph9eoRc","JkzUnlXFOB","7fsYMaL6AJ","4QMc9pT8wu","jtn0X8RCUA","JkzUn0Kyfs","s93MlRBhp0","EOE1oRsQUq","t98iWJkzUn",
+"lweGyqUJMd","CIShGiwzGk","hYBCKG1RhS","VIlwP5drc6","FhtglnFqik","hYBCK8FmFH","gIYvEtl72W","cQOnvzY1GY","vOqCEDQimp","X6PinlXFOB",
+"ZUnqtdQ586","cL0aEd85a9","ReKEWVprf2","7Ow5CQworu","7Ow5CBCxeC","lCMxyJkzUn","ogLgck85Ae","uTacxzmLYD","G1RhSNhXdu","i3pydGrDg7",
+"WreyP0MR5X","Chuy3Uvlv4","6AFT0tjQxs","lj07QFwEJz","VLTy6bZLvS","dQ586RBhp0","FnPFBdmoS7","9iGoT1LB1L","fcJOyAkKTk","64s8NIn3NS",
+"RzaZAS77LH","xciqppAhR1","Gv3Fq1v5hH","In3NSuoStw","piJSkzqH0W","pmeCdiqv4k","48cHLVNCPd","zqH0Wfqypy","yluBxtaOXK","FxX9qfcJOy",
+"tvdkDs93Ml","gtCA5WaWsv","pFrrlNOHsz","MGlTF7hyVv","zHF1qFFDui","2hEEUStlDJ","OUYuF2hEEU","FPfSEMmsIo","zY1GYuupzk","atef2vLsmS",
+"v8yFNaFFss","jzUqRMojnP","FLsphfcJOy","OxWIHazIWp","7Ow5C7lUXZ","FjHXRfcwDa","6q6L9WDVWJ","WMiS3taOXK","v2eC3BbwgA","8TxD7a00b5",
+"xciqpDQimp","Ss0Zu1LB1L","WPmlxMezSW","d7vjMuN6r3","7hyVvfFDrJ","soy9tWaWsv","IjTwPqaofN","i3pydnFqik","iwzGkokgRi","4dEz6aFFss",
+"Mm8si5Drn0","4QMc9QChxs","Uvlv4ZhwG1","RACujdpe1v","0MR5XIn3NS","7lUXZHP433","he9IAQYxC0","dQ586uQIcz","dQ586o8Uyd","WmadAlm0pD",
+"iKqhrBGaQY","SbRYyrKDLJ","DQimpAIYUu","y94nwFhtgl","JIqXiiB08l","LDk6fIBe8k","l83UdGrDg7","uPX7G5IhmG","dmoS71v5hH","Kr8ys8FmFH",
+"t98iWsoy9t","0BmCyZzJHW","m4bxUO3iyQ","nlaBypT8wu","55rfByluBx","WaWsvLDk6f","Mm8siM3zXL","hUTw7IBe8k","DLhzMx3LDe","EdBKcjSjS3",
+"m4bxUUlU3M","AXpwEtjQxs","GWqqX48cHL","9rlg9kB5nP","55rfBPb1pa","oGu6xa00b5","jiVBP9rlg9","uN6r3suY4x","0MR5XRmDcr","618DiVNCPd",
+"uvf7AaDGtS","6q6L9B3qem","W7cTsC2Irc","lpF6WFjHXR","dhSuHlkMUA","IKxdLYf2Ec","tjQxs8TxD7","kB5nPVprf2","JIqXi4dEz6","StlDJTXQ0Z",
+"oVQp6dmoS7","FNYIMRkQke","9iGoTChuy3","lj07Qk85Ae","MezSWGv3Fq","Pb1paNAFuw","BbwgAprNT6","4QMc98FmFH","uAWypIn3NS","D6rByiwzGk",
+"d85a98U2nU","RkQkepv0i7","0Wr5yM6qcG","PYBf4cmXIX","0PktI5drc6","D6rByEoToP","kB5nPMkgy8","2TRI7U3yw5","Dz1R3FnPFB","CdyBVGrDg7",
+"i3pydCfgr3","1LB1L9y4lw","8RCUAZ4I1v","MmKGJcShY2","KASQ8vLsmS","iKqhrciuWz","RpBQmU3yw5","lsQGoSmGzv","9iGoTIBe8k","ru4UGKr8ys",
+"s4786bgJAz","5VZjS2DREs","AkKTkQYxC0","5IhmGjeskS","qQxHPChuy3","MK07YOz8yZ","I7p2aG1RhS","kZANmru4UG","SbRYyRBhp0","uQIczcShY2",
+"7Ow5CIBe8k","Waim6ZUnqt","jS1ajDG4sT","yvOMI9rlg9","SmGzvh1zcH","yEfy9CIShG","DLhzM7hyVv","LbRTHRkQke","LewvM7lUXZ","he9IAAgJHQ",
+"nFqikFxX9q","JXljWFcWrW","Y1mC0XflUq","EdBKcpAhR1","VNCPdYw2oU","jSjS37fsYM","DG4sTeuZA5","Ta8f6VBjhz","SmGzvLbRTH","4W0Tl5Mg9r",
+"VerEAHzZT8","DLhzMd7vjM","jSjS3YOfrY","WmadAqUJMd","YjB9tKASQ8","Qworusoy9t","No0QbChuy3","VBjhzLewvM","J2mQipWiOs","fmIK1YOfrY",
+"In3NSZv7z0","UmaEvYOfrY","gIYvEuQIcz","RzaZAPOUYS","618DiHzZT8","gdQsSI7p2a","Ul4a1AkKTk","5Mg9rAkKTk","CqqaDSbRYy","TXQ0Zsx5Gl",
+"2ZHdkRsQUq","8TxD7WMiS3","7ku1pWDVWJ","I7p2aMK07Y","W7cTsK20wK","ydG8UgjUTu","ksJbyYw2oU","GSQwjGWqqX","WPmlx8TxD7","48cHLDG4sT",
+"vkCHHRzaZA","hE1QlcShY2","oGu6xGv3Fq","t98iWAOgEe","uTacxQnJ1S","d85a9uQIcz","hSSvQv2eC3","P6bcgBbwgA","CIShGTwano","AXpwEsx5Gl",
+"gtCA5tlILt","iwzGk8U2nU","rhl0JYf2Ec","RzaZA4dEz6","ZzJHWC2Irc","CxVEfk85Ae","iB08lzz4ZU","DcpWBLbRTH","U3yw5FVMxo","Mm8siJkzUn",
+"FnPFB5drc6","LewvMPOUYS","9XyT9XflUq","4QMc9guMb8","he9IADG4sT","vLsmSQ6hMC","pAhR1KZamH","m4bxU0PktI","d7vjM9XyT9","NOHszuN6r3",
+"5iGN5ECMvU","PYBf4MezSW","sx5Gl29QAz","DG4sTbgJAz","fcwDa0YAGH","In3NSHP433","gdQsSGSQwj","MK07Ye6e4z","yluBxI7p2a","AXpwEFwEJz",
+"zHF1qVerEA","1v5hHoGu6x","dhSuHPOUYS","s7MxkqQxHP","fqypy7X3uy","soy9tGSQwj","QChxs2Nslm","AgJHQWPmlx","2TRI7SjskQ","SjskQdmoS7",
+"Yf2EcMaJQs","SjskQRsQUq","dhSuHFjHXR","Q6LixpvgjS","W7cTs0Wr5y","HP4334dEz6","zFgtBMkgy8","TXQ0Zmz8gx","9iGoTsoy9t","qQxHPuJScX",
+"AkKTkKsjRK","kZANmn1pmO","6q6L9qQxHP","ydG8UjiVBP","fmIK1RkQke","aL6AJs93Ml","0MR5Xo8Uyd","hSSvQQChxs","CK5W7MmKGJ","pv0i78xEKz",
+"FjHXR0Kyfs","fLNg8Y1mC0","29QAzkZANm","ZuDtDi3pyd","ogLgcUlU3M","hSSvQs93Ml","pv0i7nlaBy","X6PinReKEW","wDajXGrDg7","CxVEf24ARF",
+"cmXIXbgJAz","HfyNQgdQsS","QssNCQbxXc","HlUbFTCgPp","yEfy95Mg9r","Ta8f6djsrv","zz4ZU8TxD7","0KyfsCdyBV","1j5L8tuDyS","RsQUqtvdkD",
+"prNT6lweGy","okgRiFjHXR","lViBvcL0aE","zmLYDZv7z0","wDajXi3pyd","fmIK1n1pmO","QYxC0gtCA5","FxX9qBpYhV","zbIYYrz7Ut","AmdQd4W0Tl",
+"tl72Wl83Ud","lj07Q8hJdt","SjskQKASQ8","ReKEWMojnP","pvgjSo8Uyd","AIYUuCxVEf","WreyPWaWsv","brhlQoGu6x","7fKYUjzUqR","vkCHHThjNn",
+"zmLYDgtCA5","Q6hMC7fsYM","o8UydUlU3M","cL0aElm0pD","fmIK1AmdQd","gIYvExciqp","UmaEvFFDui","Mkgy8D6rBy","lXFOB5iGN5","2Yz7EaDGtS",
+"7ku1pv1Hln","v1HlnUlU3M","OUYuFt59lR","8cVD38FmFH","YOfrYguMb8","K20wKHzZT8","yofH3tAOsr","gtCA5NhXdu","kB5nP3weIF","Ul4a1MezSW",
+"1LB1LFLsph","U3yw5hUTw7","s93Mluupzk","POUYSVIlwP","FcWrWWPmlx","WDVWJh1zcH","Nxx9VcL0aE","cmXIXQworu","JkzUnGWqqX","oQ87r16lHc",
+"lweGyOUqFM","RBhp0VerEA","iKqhrP6bcg","tAOsri7WMQ","lweGyvLsmS","jS1aj7lUXZ","5Mg9rdmoS7","Yf2Ec45cIH","uZPqg0h1b1","WMiS3WPmlx",
+"soy9twiHrZ","BGaQYydG8U","zmLYDydG8U","hE1QlQbxXc","uJScX5ZaEz","lkMUAW3VFH","OUqFMpmeCd","oVQp6FcWrW","xciqpogLgc","suY4x5Mg9r",
+"0MR5X9rlg9","QYxC0MGlTF","lweGygdQsS","QworuGrDg7","mz8gxzmLYD","jfREu8xEKz","bZLvSaez9y","OUqFM48cHL","i3pydgf8rI","CqqaDMkgy8",
+"5Drn0sqVrf","QWxoTHzZT8","55rfB55rfB","he9IABbwgA","Ta8f6fcwDa","FhtgleuZA5","oQ87rjSjS3","SWfouciuWz","v8yFNlXFOB","5VZjS9rlg9",
+"VIlwPpiJSk","MojnP0ao3l","16lHcNOHsz","Yw2oUqaofN","OHaBzVNCPd","In3NSD6rBy","M3zXLzz4ZU","wDajXFwEJz","OUqFMhUTw7","Mm8siWaWsv",
+"3otm6B3qem","gtCA5xciqp","QWxoTlm0pD","JKWYRTwano","fmIK1fLNg8","bgJAzRkQke","Zv7z0HfyNQ","zz4ZU4W0Tl","D6rByJkzUn","ru4UGMezSW",
+"yluBxDLhzM","5Nammni2v1","Uvlv4OUqFM","jSjS3lm0pD","Cfgr3RmDcr","i3pydFNYIM","5nmWvK4GS8","aFFss29QAz","RzaZAFPfSE","CxVEfHzZT8",
+"7fsYM0Wr5y","dQ586Ul4a1","Cfgr32hEEU","2Nslmhi5X7","StlDJ48cHL","uvf7ApAhR1","DQimpydG8U","uupzkCp3mZ","Zv7z07fsYM","07n1cNxx9V",
+"MmsIo0MR5X","S2DfucShY2","AIYUuM6qcG","RBhp0gf8rI","3weIFzz4ZU","Q6Lixi7WMQ","zFgtB8TxD7","RpBQm7ku1p","fmIK1L7cGc","gtCA5Z4I1v",
+"GXdoHPYBf4","ru4UGvOqCE","hYBCKVBjhz","prNT6I7p2a","FcWrW8U2nU","1v5hHCp3mZ","8xEKzhUTw7","aFFss5ZaEz","Waim68FmFH","Mkgy8S2Dfu",
+"JIqXi0ao3l","v1Hln1j5L8","gdQsSThjNn","MmsIogIYvE","he9IAWaim6","qaofN8cVD3","s7MxkW3VFH","fLNg8pT8wu","ni2v14QMc9","pmeCdHzZT8",
+"8FmFHRsQUq","HzZT8taOXK","Pb1pa3weIF","Fhtgl14FLR","gjUTul83Ud","zFgtBTCgPp","ru4UGS2Dfu","Zv7z08TxD7","BCxeCm4bxU","6AFT0suY4x",
+"tuDySKZamH","14FLRyEfy9","CIShGBFkb8","AOgEe4dEz6","ECMvU0ao3l","X6Pinhe9IA","16lHcxReec","uoStwtjQxs","aFFsslm0pD","k85AeB3qem",
+"07n1cFhtgl","zFgtBRsQUq","W3VFHpiJSk","Qworuv1Hln","rKDLJn8pJ9","7X3uy5ZaEz","OHaBzD6rBy","jS1aj9eoRc","S77LH0ao3l","BbwgAciuWz",
+"Mkgy8DcpWB","pv0i77ku1p","yofH3P6bcg","SbRYyFcWrW","e6e4zcmXIX","cL0aEU3yw5","Vprf2ZhwG1","6AFT0l83Ud","d7vjMXyPZN","ulk41uPX7G",
+"yEfy9FjHXR","uQIczMGlTF","v2eC32TRI7","24ARFfqypy","9eoRcAXpwE","WreyPjS1aj","n8pJ9Z4I1v","29QAztl72W","zY1GYAmdQd","JJs5m5VZjS"
+] } }
+}
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//sorted-queue?durable='true'",
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_numberOfMessages": 200000,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//sorted-queue?durable='true'",
+ "_numberOfMessages": 200000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "queue-type:simple-queue";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//simple-queue?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//simple-queue?durable='true'",
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_numberOfMessages": 200000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//simple-queue?durable='true'",
+ "_numberOfMessages": 200000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ {
+ "_name": "queue-type:priority-queue";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//priority-queue?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-priorities": 10
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "priority": {"@def": "range", "_lower": 0, "_upper": 9, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//priority-queue?durable='true'",
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_numberOfMessages": 20000,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//priority-queue?durable='true'",
+ "_numberOfMessages": 20000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/java/perftests/etc/testdefs/standard/QueuesWithSelectors.json b/java/perftests/etc/testdefs/standard/QueuesWithSelectors.json
new file mode 100644
index 0000000000..2e8175c602
--- /dev/null
+++ b/java/perftests/etc/testdefs/standard/QueuesWithSelectors.json
@@ -0,0 +1,2036 @@
+{
+ "_tests":[
+ {
+ "_name": "Queues with selectors: 1 consumer - 1 producer - non overlapping - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": 1 }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Queues with selectors: 2 consumers - 1 producer - non overlapping - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 2, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 200000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=2"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Queues with selectors: 5 consumers - 1 producer - non overlapping - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 5, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 500000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=2"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=5"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Queues with selectors: 10 consumers - 1 producer - non overlapping - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 10, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=2"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=5"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=6"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=7"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=8"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=9"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=10"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Queues with selectors: 2 consumers - 1 producer - overlapping 50% - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 76800000,
+ "x-qpid-flow-resume-capacity": 51200000
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 4, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 100000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =1 or id= 2 or id= 3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =2 or id= 3 or id= 4"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Queues with selectors: 5 consumers - 1 producer - overlapping 50% - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 307200000,
+ "x-qpid-flow-resume-capacity": 256000000
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 10, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 500000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 50000,
+ "_selector": "id =1 or id=2 or id= 10"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 50000,
+ "_selector": "id =2 or id=3 or id= 4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 50000,
+ "_selector": "id =4 or id= 5 or id= 6"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 50000,
+ "_selector": "id =6 or id= 7 or id =8"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 50000,
+ "_selector": "id =8 or id =9 or id =10"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Queues with selectors: 10 consumers - 1 producer - overlapping 50% - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 307200000,
+ "x-qpid-flow-resume-capacity": 25600000
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 20, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 500000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =1 or id =2 or id =3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =2 or id =3 or id= 4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =5 or id=6 or id =7"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =6 or id =7 or id =8"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =9 or id = 10 or id = 11"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =10 or id = 11 or id =12"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id = 13 or id = 14 or id =15"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id = 14 or id =15 or id =16"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =17 or id =18 or id= 19"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id = 18 or id = 19 or id =20"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+{
+ "_name": "Queues with selectors: 1 consumer - 1 producer - non overlapping - NON_PERSISTENT ",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors?durable='false'",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": 1 }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Queues with selectors: 2 consumers - 1 producer - non overlapping - NON_PERSISTENT ",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors?durable='false'",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 2, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 200000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=2"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Queues with selectors: 5 consumers - 1 producer - non overlapping - NON_PERSISTENT ",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors?durable='false'",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 5, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 500000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=2"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=5"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Queues with selectors: 10 consumers - 1 producer - non overlapping - NON_PERSISTENT ",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors?durable='false'",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 10, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=2"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=5"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=6"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=7"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=8"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=9"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=10"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Queues with selectors: 2 consumers - 1 producer - overlapping selectors 50% - NON_PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-overlapping",
+ "_attributes":
+ {
+ "x-qpid-capacity": 61440000,
+ "x-qpid-flow-resume-capacity": 51200000
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 4, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 200000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =1 or id= 2 or id= 3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =2 or id= 3 or id= 4"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Queues with selectors: 5 consumers - 1 producer - overlapping selectors 50% - NON_PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-overlapping",
+ "_attributes":
+ {
+ "x-qpid-capacity": 307200000,
+ "x-qpid-flow-resume-capacity": 256000000
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 10, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 500000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 50000,
+ "_selector": "id =1 or id=2 or id= 10"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 50000,
+ "_selector": "id =2 or id=3 or id= 4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 50000,
+ "_selector": "id =4 or id= 5 or id= 6"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 50000,
+ "_selector": "id =6 or id= 7 or id =8"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 50000,
+ "_selector": "id =8 or id =9 or id =10"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Queues with selectors: 10 consumers - 1 producer - overlapping selectors 50% - NON_PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-overlapping",
+ "_attributes":
+ {
+ "x-qpid-capacity": 307200000,
+ "x-qpid-flow-resume-capacity": 25600000
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 20, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 500000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =1 or id =2 or id =3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =2 or id =3 or id= 4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =5 or id=6 or id =7"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =6 or id =7 or id =8"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =9 or id = 10 or id = 11"
+
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =10 or id = 11 or id =12"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id = 13 or id = 14 or id =15"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id = 14 or id =15 or id =16"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =17 or id =18 or id= 19"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id = 18 or id = 19 or id =20"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/java/perftests/etc/testdefs/standard/VaryingNumberOfParticipants.json b/java/perftests/etc/testdefs/standard/VaryingNumberOfParticipants.json
new file mode 100644
index 0000000000..6cf67cbbf0
--- /dev/null
+++ b/java/perftests/etc/testdefs/standard/VaryingNumberOfParticipants.json
@@ -0,0 +1,2981 @@
+{
+ "_tests":[
+ {
+ "_name": "Varying number of participants: 1 consumer - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Varying number of participants: 2 consumers - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Varying number of participants: 5 consumers - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 1 consumer - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 2 consumers - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 5 consumers - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 1 consumer - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 2 consumers - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Varying number of participants: 5 consumers - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 1 consumer - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 2 consumers - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Varying number of participants: 5 consumers - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/java/perftests/example/PQBT-AA-Qpid-01.json b/java/perftests/example/PQBT-AA-Qpid-01.json
new file mode 100644
index 0000000000..28cb4fa410
--- /dev/null
+++ b/java/perftests/example/PQBT-AA-Qpid-01.json
@@ -0,0 +1,795 @@
+{
+ "_tests":[
+ {
+ "_name": "PQBT-AA-Qpid-01";
+ "_description": "16 clients, one 1P 1C each. Persistent, Auto-Ack, 10 minutes";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue1?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue2?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue3?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue4?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue5?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue6?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue7?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue8?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue9?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue10?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue11?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue12?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue13?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue14?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue15?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue16?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "client1",
+ "_connections":[
+ {
+ "_name": "pconnection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue1?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue1?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client2",
+ "_connections":[
+ {
+ "_name": "pconnection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//testQueue2?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//testQueue2?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client3",
+ "_connections":[
+ {
+ "_name": "pconnection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//testQueue3?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//testQueue3?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client4",
+ "_connections":[
+ {
+ "_name": "pconnection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//testQueue4?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//testQueue4?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client5",
+ "_connections":[
+ {
+ "_name": "pconnection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//testQueue5?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//testQueue5?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client6",
+ "_connections":[
+ {
+ "_name": "pconnection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//testQueue6?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//testQueue6?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client7",
+ "_connections":[
+ {
+ "_name": "pconnection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//testQueue7?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//testQueue7?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client8",
+ "_connections":[
+ {
+ "_name": "pconnection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//testQueue8?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//testQueue8?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client9",
+ "_connections":[
+ {
+ "_name": "pconnection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//testQueue9?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//testQueue9?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client10",
+ "_connections":[
+ {
+ "_name": "pconnection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//testQueue10?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//testQueue10?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client11",
+ "_connections":[
+ {
+ "_name": "pconnection11",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession11",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer11",
+ "_destinationName": "direct://amq.direct//testQueue11?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection11",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession11",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer11",
+ "_destinationName": "direct://amq.direct//testQueue11?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client12",
+ "_connections":[
+ {
+ "_name": "pconnection12",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession12",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer12",
+ "_destinationName": "direct://amq.direct//testQueue12?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection12",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession12",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer12",
+ "_destinationName": "direct://amq.direct//testQueue12?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client13",
+ "_connections":[
+ {
+ "_name": "pconnection13",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession13",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer13",
+ "_destinationName": "direct://amq.direct//testQueue13?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection13",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession13",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer13",
+ "_destinationName": "direct://amq.direct//testQueue13?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client14",
+ "_connections":[
+ {
+ "_name": "pconnection14",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession14",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer14",
+ "_destinationName": "direct://amq.direct//testQueue14?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection14",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession14",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer14",
+ "_destinationName": "direct://amq.direct//testQueue14?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client15",
+ "_connections":[
+ {
+ "_name": "pconnection15",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession15",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer15",
+ "_destinationName": "direct://amq.direct//testQueue15?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection15",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession15",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer15",
+ "_destinationName": "direct://amq.direct//testQueue15?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client16",
+ "_connections":[
+ {
+ "_name": "pconnection16",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession16",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer16",
+ "_destinationName": "direct://amq.direct//testQueue16?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection16",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession16",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer16",
+ "_destinationName": "direct://amq.direct//testQueue16?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+}
diff --git a/java/perftests/example/TQBT-TX-Qpid-01.json b/java/perftests/example/TQBT-TX-Qpid-01.json
new file mode 100644
index 0000000000..eea8666fa4
--- /dev/null
+++ b/java/perftests/example/TQBT-TX-Qpid-01.json
@@ -0,0 +1,843 @@
+{
+ "_tests":[
+ {
+ "_name": "TQBT-TX-Qpid-01";
+ "_description": "16 clients, one 1P 1C each. Non-Persistent, Transactional publisher batch 1, Transactional consumer batch 1000, 10 minutes";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue1",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue2",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue3",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue4",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue5",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue6",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue7",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue8",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue9",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue10",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue11",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue12",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue13",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue14",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue15",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue16",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "client1",
+ "_connections":[
+ {
+ "_name": "pconnection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession1",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue1",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession1",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue1",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client2",
+ "_connections":[
+ {
+ "_name": "pconnection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession2",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//testQueue2",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession2",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//testQueue2",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client3",
+ "_connections":[
+ {
+ "_name": "pconnection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession3",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//testQueue3",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession3",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//testQueue3",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client4",
+ "_connections":[
+ {
+ "_name": "pconnection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession4",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//testQueue4",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession4",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//testQueue4",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client5",
+ "_connections":[
+ {
+ "_name": "pconnection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession5",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//testQueue5",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession5",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//testQueue5",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client6",
+ "_connections":[
+ {
+ "_name": "pconnection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession6",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//testQueue6",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession6",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//testQueue6",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client7",
+ "_connections":[
+ {
+ "_name": "pconnection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession7",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//testQueue7",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession7",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//testQueue7",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client8",
+ "_connections":[
+ {
+ "_name": "pconnection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession8",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//testQueue8",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession8",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//testQueue8",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client9",
+ "_connections":[
+ {
+ "_name": "pconnection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession9",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//testQueue9",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession9",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//testQueue9",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client10",
+ "_connections":[
+ {
+ "_name": "pconnection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession10",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//testQueue10",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession10",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//testQueue10",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client11",
+ "_connections":[
+ {
+ "_name": "pconnection11",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession11",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer11",
+ "_destinationName": "direct://amq.direct//testQueue11",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection11",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession11",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer11",
+ "_destinationName": "direct://amq.direct//testQueue11",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client12",
+ "_connections":[
+ {
+ "_name": "pconnection12",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession12",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer12",
+ "_destinationName": "direct://amq.direct//testQueue12",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection12",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession12",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer12",
+ "_destinationName": "direct://amq.direct//testQueue12",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client13",
+ "_connections":[
+ {
+ "_name": "pconnection13",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession13",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer13",
+ "_destinationName": "direct://amq.direct//testQueue13",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection13",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession13",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer13",
+ "_destinationName": "direct://amq.direct//testQueue13",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client14",
+ "_connections":[
+ {
+ "_name": "pconnection14",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession14",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer14",
+ "_destinationName": "direct://amq.direct//testQueue14",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection14",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession14",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer14",
+ "_destinationName": "direct://amq.direct//testQueue14",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client15",
+ "_connections":[
+ {
+ "_name": "pconnection15",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession15",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer15",
+ "_destinationName": "direct://amq.direct//testQueue15",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection15",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession15",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer15",
+ "_destinationName": "direct://amq.direct//testQueue15",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client16",
+ "_connections":[
+ {
+ "_name": "pconnection16",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession16",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer16",
+ "_destinationName": "direct://amq.direct//testQueue16",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection16",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession16",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer16",
+ "_destinationName": "direct://amq.direct//testQueue16",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+}
diff --git a/java/perftests/example/brokerconfig/log4j.xml b/java/perftests/example/brokerconfig/log4j.xml
new file mode 100644
index 0000000000..7dbb1bc87d
--- /dev/null
+++ b/java/perftests/example/brokerconfig/log4j.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ --><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="null" threshold="null">
+ <appender class="org.apache.log4j.QpidCompositeRollingAppender" name="ArchivingFileAppender">
+ <!-- Ensure that logs always have the DatePattern appended to the filename.
+ DEFAULT IF NOT CONFIGURED: true -->
+ <param name="StaticLogFileName" value="true"/>
+ <param name="file" value="${QPID_WORK}/log/${logprefix}qpid${logsuffix}.log"/>
+ <!-- Style of rolling to use, by:
+ File Size(1)
+ Date(2)
+ Both(3)
+
+ When Date (or Both) is enabled then the value of DatePattern will determine
+ when the new file is made. e.g. a DatePattern of "'.'yyyy-MM-dd-HH-mm"
+ which includes minutes will cause a new backup file to be made every minute.
+
+ DEFAULT IF NOT CONFIGURED: 3 -->
+ <param name="RollingStyle" value="1"/>
+ <!-- Set the count direction:
+ Negative numbers mean backups are numbered <latest>, .0, .1, .2,..., .n
+ 0 means backup is DatePattern stamped and followed with a Positive number
+ if the DatePattern stamp clashes with other existing backups.
+ Positive numbers mean backups are numbered 0, 1, 2, ..., n, <latest>
+
+ DEFAULT IF NOT CONFIGURED: -1 -->
+ <param name="CountDirection" value="0"/>
+ <!-- Maximum File Size:
+ DEFAULT IF NOT CONFIGURED: 10MB -->
+ <param name="MaxFileSize" value="1MB"/>
+ <!-- Date Pattern:
+ DEFAULT IF NOT CONFIGURED: "'.'yyyy-MM-dd" -->
+ <param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm"/>
+ <!-- Maximum number of backup files:
+ 0 means no backups
+ -1 means infinite backups
+
+ DEFAULT IF NOT CONFIGURED: 0 -->
+ <param name="MaxSizeRollBackups" value="-1"/>
+ <!-- Compress(gzip) the backup files to the backup location:
+ DEFAULT IF NOT CONFIGURED: FALSE -->
+ <param name="CompressBackupFiles" value="true"/>
+ <!-- Compress the backup files using a second thread:
+ DEFAULT IF NOT CONFIGURED: FALSE -->
+ <param name="CompressAsync" value="true"/>
+ <!-- Backup Location:
+ DEFAULT IF NOT CONFIGURED: same dir as log file -->
+ <param name="backupFilesToPath" value="${QPID_WORK}/backup/log"/>
+
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d %-5p [%t] (%F:%L) - %m%n"/>
+ </layout>
+ </appender>
+
+ <appender class="org.apache.log4j.FileAppender" name="FileAppender">
+ <param name="File" value="${QPID_WORK}/log/${logprefix}qpid${logsuffix}.log"/>
+ <param name="Append" value="false"/>
+
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d %-5p [%t] (%F:%L) - %m%n"/>
+ </layout>
+ </appender>
+
+ <appender class="org.apache.log4j.ConsoleAppender" name="STDOUT">
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d %-5p [%t] (%F:%L) - %m%n"/>
+ </layout>
+ </appender>
+
+ <category additivity="true" name="org.apache.qpid.server.queue.AMQQueueMBean">
+ <priority value="info"/>
+ </category>
+
+ <!-- Provide warnings to standard output -->
+ <category additivity="true" name="org.apache.qpid">
+ <priority value="warn"/>
+ </category>
+
+ <!-- Enable info messages for the status-logging hierarchy -->
+ <logger additivity="true" name="qpid.message">
+ <level value="info"/>
+ </logger>
+
+
+
+ <!-- Examples of additional logging settings -->
+ <!-- Used to generate extra debug. See debug.log4j.xml -->
+
+ <!--<category additivity="true" name="org.apache.qpid.server.store">
+ <priority value="debug"/>
+ </category-->
+
+ <!-- Set the commons logging that the XML parser uses to WARN, it is very chatty at debug -->
+ <logger name="org.apache.commons">
+ <level value="WARN"/>
+ </logger>
+
+ <!-- Log all info events to file -->
+ <root>
+ <priority value="info"/>
+ <appender-ref ref="FileAppender"/>
+ <!--appender-ref ref="ArchivingFileAppender"/-->
+ </root>
+
+</log4j:configuration>
diff --git a/java/perftests/example/brokerconfig/passwd b/java/perftests/example/brokerconfig/passwd
new file mode 100644
index 0000000000..99f0f05c6a
--- /dev/null
+++ b/java/perftests/example/brokerconfig/passwd
@@ -0,0 +1,23 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+guest:guest
+client:guest
+server:guest
+admin:admin
+
diff --git a/java/perftests/example/brokerconfig/virtualhosts.xml b/java/perftests/example/brokerconfig/virtualhosts.xml
new file mode 100644
index 0000000000..b0dbc89833
--- /dev/null
+++ b/java/perftests/example/brokerconfig/virtualhosts.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ -->
+<virtualhosts>
+ <default>test</default>
+
+ <virtualhost>
+ <name>test</name>
+ <test>
+ <store>
+ <!-- class>org.apache.qpid.server.store.MemoryMessageStore</class -->
+
+ <class>org.apache.qpid.server.store.berkeleydb.BDBMessageStore</class>
+ <environment-path>/home/V510279/dev/qpid/qpid/java/build/work/bdbstore/test-store</environment-path>
+ </store>
+
+ <queues>
+ <minimumAlertRepeatGap>30000</minimumAlertRepeatGap>
+ <maximumMessageCount>50</maximumMessageCount>
+ <queue>
+ <name>queue</name>
+ <queue>
+ <exchange>amq.direct</exchange>
+ <maximumQueueDepth>4235264</maximumQueueDepth>
+ <!-- 4Mb -->
+ <maximumMessageSize>2117632</maximumMessageSize>
+ <!-- 2Mb -->
+ <maximumMessageAge>600000</maximumMessageAge>
+ <!-- 10 mins -->
+ </queue>
+ </queue>
+ <queue>
+ <name>ping</name>
+ <ping>
+ <exchange>amq.direct</exchange>
+ <maximumQueueDepth>4235264</maximumQueueDepth>
+ <!-- 4Mb -->
+ <maximumMessageSize>2117632</maximumMessageSize>
+ <!-- 2Mb -->
+ <maximumMessageAge>600000</maximumMessageAge>
+ <!-- 10 mins -->
+ </ping>
+ </queue>
+ </queues>
+ </test>
+ </virtualhost>
+</virtualhosts>
+
+
diff --git a/java/perftests/example/config-one-test.json b/java/perftests/example/config-one-test.json
new file mode 100644
index 0000000000..8f4e577d49
--- /dev/null
+++ b/java/perftests/example/config-one-test.json
@@ -0,0 +1,55 @@
+{
+ "_tests":[
+ {
+ "_name": "One producer to one consumer";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 5000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 5000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+}
diff --git a/java/perftests/example/config-stress-testing-manyp-c1-with-psfc.json b/java/perftests/example/config-stress-testing-manyp-c1-with-psfc.json
new file mode 100644
index 0000000000..42c0f4a155
--- /dev/null
+++ b/java/perftests/example/config-stress-testing-manyp-c1-with-psfc.json
@@ -0,0 +1,162 @@
+{
+ "_tests":[
+ {
+ "_name": "Many producers to one consumer w/producer flow-control";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue",
+ "_attributes":
+ {
+ "comment": "does not work yet - configure in virtualhost.xml",
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient1",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1,
+ "_messageSize": 10000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "producingClient2",
+ "_connections":[
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1,
+ "_messageSize": 10000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "producingClient3",
+ "_connections":[
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1,
+ "_messageSize": 10000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "producingClient4",
+ "_connections":[
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1,
+ "_messageSize": 10000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "producingClient5",
+ "_connections":[
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": "1",
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1,
+ "_messageSize": 10000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 5000000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/java/perftests/example/config-stress-testing.json b/java/perftests/example/config-stress-testing.json
new file mode 100644
index 0000000000..f6029b848d
--- /dev/null
+++ b/java/perftests/example/config-stress-testing.json
@@ -0,0 +1,84 @@
+{
+ "_tests":[
+ {
+ "_name": "One producer to one consumer";
+ "_iterations":[
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+}
diff --git a/java/perftests/example/config-two-tests.json b/java/perftests/example/config-two-tests.json
new file mode 100644
index 0000000000..79d305b100
--- /dev/null
+++ b/java/perftests/example/config-two-tests.json
@@ -0,0 +1,117 @@
+{
+ "_tests":[
+ {
+ "_name": "One producer to one consumer";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 5000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 5000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "One producer to two consumers";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 5000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 2500
+ }
+ ]
+ },
+ {
+ "_sessionName": "session2",
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 2500
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+}
diff --git a/java/perftests/example/log4j-client.properties b/java/perftests/example/log4j-client.properties
new file mode 100644
index 0000000000..b724cbf5f2
--- /dev/null
+++ b/java/perftests/example/log4j-client.properties
@@ -0,0 +1,29 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+log4j.rootLogger=ERROR,console
+
+log4j.logger.org.apache.qpid=WARN
+log4j.logger.org.apache.qpid.disttest=INFO
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.Threshold=all
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+
+log4j.appender.console.layout.ConversionPattern=%d %p [%c{1}] %m%n
+
diff --git a/java/perftests/example/log4j.properties b/java/perftests/example/log4j.properties
new file mode 100644
index 0000000000..8af70ebef2
--- /dev/null
+++ b/java/perftests/example/log4j.properties
@@ -0,0 +1,35 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+log4j.rootLogger=ERROR,console,fileApp
+
+log4j.logger.org.apache.qpid=WARN
+log4j.logger.org.apache.qpid.disttest=INFO
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.Threshold=all
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+
+log4j.appender.console.layout.ConversionPattern=%d %p [%c{1}] %m%n
+
+log4j.appender.fileApp=org.apache.log4j.FileAppender
+log4j.appender.fileApp.file=perftests.log
+log4j.appender.fileApp.Threshold=info
+log4j.appender.fileApp.append=false
+log4j.appender.fileApp.layout=org.apache.log4j.PatternLayout
+log4j.appender.fileApp.layout.ConversionPattern=%d %p [%c{1}] %m%n \ No newline at end of file
diff --git a/java/perftests/example/perftests-jndi.properties b/java/perftests/example/perftests-jndi.properties
new file mode 100644
index 0000000000..8ad0decaad
--- /dev/null
+++ b/java/perftests/example/perftests-jndi.properties
@@ -0,0 +1,26 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# this file is used for running system tests of the performance test framework,
+# (i.e. not for running the performance tests themselves!)
+
+java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+
+# use QpidBrokerTestCase's default port
+connectionfactory.connectionfactory = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
+
+destination.controllerqueue = direct://amq.direct//controllerqueue
diff --git a/java/perftests/example/run-client.sh b/java/perftests/example/run-client.sh
new file mode 100755
index 0000000000..ad158529b6
--- /dev/null
+++ b/java/perftests/example/run-client.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+java -cp ".:${QPID_HOME}/lib/*" -Dlog4j.configuration=log4j-client.properties -Dqpid.dest_syntax=BURL org.apache.qpid.disttest.ClientRunner jndi-config=perftests-jndi.properties
diff --git a/java/perftests/example/run.sh b/java/perftests/example/run.sh
new file mode 100755
index 0000000000..cb68c52853
--- /dev/null
+++ b/java/perftests/example/run.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+java -cp ".:${QPID_HOME}/lib/*" -Dqpid.dest_syntax=BURL org.apache.qpid.disttest.ControllerRunner jndi-config=perftests-jndi.properties test-config=$1 distributed=false
+
diff --git a/java/perftests/generate-scripts b/java/perftests/generate-scripts
deleted file mode 100644
index 3d12cc13c3..0000000000
--- a/java/perftests/generate-scripts
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/env python
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-import os, sys, mllib
-
-template = """#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-if [ -z "$QPID_HOME" ]; then
- export QPID_HOME=$(dirname $(dirname $(dirname $(readlink -f $0))))
- export PATH=${PATH}:${QPID_HOME}/bin
-fi
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-# Set classpath to include Qpid jar with all required jars in manifest
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java \
- JAVA_VM=-server \
- JAVA_MEM=-Xmx1024m \
- QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Xms256m -Dlog4j.configuration=file://${QPID_HOME}/etc/perftests.log4j -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn org.apache.qpid.junit.extensions.TKTestRunner %s ${ARGS}
-"""
-
-doc = mllib.xml_parse(sys.argv[1])
-dir = sys.argv[2]
-for s in doc.query["scripts/script"]:
- file = open(os.path.join(dir, "%s.sh" % s["@name"]), "w")
- file.write(template % s.text())
- file.close()
diff --git a/java/perftests/jar-with-dependencies.xml b/java/perftests/jar-with-dependencies.xml
deleted file mode 100644
index bbbbd3788e..0000000000
--- a/java/perftests/jar-with-dependencies.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- -
- http://www.apache.org/licenses/LICENSE-2.0
- -
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<!-- This is an assembly descriptor that produces a distribution that contains all the
- dependencies, with a manifest only jar that references them, required to run the
- tests of a maven project.
--->
-<assembly>
- <id>all-test-deps</id>
- <formats>
- <format>tar.gz</format>
- <format>zip</format>
- </formats>
- <includeBaseDirectory>false</includeBaseDirectory>
- <dependencySets>
- <dependencySet>
- <outputDirectory>/</outputDirectory>
- <unpack>false</unpack>
- <scope>test</scope>
- </dependencySet>
- </dependencySets>
- <fileSets>
- <fileSet>
- <directory>target/classes</directory>
- <outputDirectory></outputDirectory>
- </fileSet>
- <fileSet>
- <directory>target/test-classes</directory>
- <outputDirectory></outputDirectory>
- </fileSet>
-
- <!-- Include all the test scripts, both generated and hand-written. -->
- <fileSet>
- <directory>target</directory>
- <outputDirectory></outputDirectory>
- <includes>
- <include>*.sh</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>etc/scripts</directory>
- <outputDirectory></outputDirectory>
- <includes>
- <include>*.sh</include>
- </includes>
- </fileSet>
-
- <!-- Include all jndi configurations needed to run the tests. -->
- <fileSet>
- <directory>etc/jndi</directory>
- <outputDirectory></outputDirectory>
- <includes>
- <include>*.properties</include>
- </includes>
- </fileSet>
-
- <!-- Include the build artifact. -->
- <fileSet>
- <directory>target</directory>
- <outputDirectory></outputDirectory>
- <includes>
- <include>qpid-perftests-1.0-incubating-M2-SNAPSHOT.jar</include>
- </includes>
- </fileSet>
-
- <!-- Include the manifest with classpath jar. -->
- <fileSet>
- <directory>target</directory>
- <outputDirectory></outputDirectory>
- <includes>
- <include>qpid-perftests-${qpid.version}.jar</include>
- </includes>
- </fileSet>
-
- </fileSets>
-</assembly>
diff --git a/java/perftests/scripts.xml b/java/perftests/scripts.xml
deleted file mode 100644
index 9a5163c598..0000000000
--- a/java/perftests/scripts.xml
+++ /dev/null
@@ -1,328 +0,0 @@
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
- - or more contributor license agreements. See the NOTICE file
- - distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
- -->
-
-<scripts>
- <!-- Single pings. These can be scaled up by overriding the parameters when calling the test script. -->
- <script name="Ping-Once">-n Ping-Once -s[1] -r 1 -t testPingOk -o . org.apache.qpid.ping.PingTestPerf</script>
- <script name="Ping-Once-Async">-n Ping-Once-Async -s[1] -r 1 -t testAsyncPingOk -o . org.apache.qpid.ping.PingAsyncTestPerf</script>
- <script name="Ping-Latency">-n Ping-Latency -s[1000] -d10S -t testPingLatency -o . org.apache.qpid.ping.PingLatencyTestPerf rate=100 batchSize=100</script>
-
- <!-- More example Tests. These are examples to exercise all the features of the test harness. Can scale up with option overrides. -->
- <script name="Ping-Tx">-n Ping-Tx -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf transacted=true</script>
- <script name="Ping-Size">-n Ping-Size -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf messageSize=512</script>
- <script name="Ping-Concurrent">-n Ping-Concurrent -s[100] -c [4] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf</script>
- <script name="Ping-Many-Queues">-n Ping-Many-Queues -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf destinationCount=4</script>
- <script name="Ping-Duration">-n Ping-Duration -s[100] -d10S -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf</script>
- <script name="Ping-Rate">-n Ping-Rate -s[100] -d10S -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf rate=500</script>
- <script name="Ping-PubSub">-n Ping-PubSub -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true</script>
- <script name="Ping-Many-Topics">-n Ping-Many-Topics -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true destinationCount=4</script>
- <script name="Ping-Persistent">-n Ping-Persistent -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true</script>
- <script name="Ping-Batch-Logging">-n Ping-Batch-Logging -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf batchSize=10</script>
- <script name="Ping-Failover-Before-Send">-n Ping-Failover-Before-Send -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf commitBatchSize=10 failBeforeSend=true</script>
- <script name="Ping-Failover-After-Send">-n Ping-Failover-After-Send -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf commitBatchSize=10 failAfterSend=true</script>
- <script name="Ping-Failover-Before-Commit">-n Ping-Failover-Before-Commit -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf commitBatchSize=10 failBeforeCommit=true</script>
- <script name="Ping-Failover-After-Commit">-n Ping-Failover-After-Commit -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf commitBatchSize=10 failAfterCommit=true</script>
-
- <!--
- ***** If editing below, please use a non line wrapping mode and keep in columns, makes it easier to check for consistent
- ***** parameter setting accross all of the tests.
- -->
-
- <!--
- Reliability tests. The longer these tests can be run, the better.
- Tests 01 and 02 run for a short time. Use these to get an idea of the expected throughput.
- Tests 03 to 08 test all ack modes, transient/persistent, p2p/pubsub. There are 24 tests in total running for 1 hour each.
- This can be shortened or lengthened for the desired burn-in test time.
- -->
- <script name="TQR-Qpid-01">-n TQR-Qpid-01 -d1M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TQR-Qpid-02">-n TQR-Qpid-02 -d1M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-01">-n TTR-Qpid-01 -d1M -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-02">-n TTR-Qpid-02 -d1M -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-01">-n PQR-Qpid-01 -d1M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-02">-n PQR-Qpid-02 -d1M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-01">-n PTR-Qpid-01 -d1M -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-02">-n PTR-Qpid-02 -d1M -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
-
- <script name="TQR-Qpid-03-TX">-n TQR-Qpid-03 -d1H -s[10000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TQR-Qpid-04-AUTOACK">-n TQR-Qpid-04 -d1H -s[10000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TQR-Qpid-05-CLIENTACK">-n TQR-Qpid-05 -d1H -s[10000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=2 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TQR-Qpid-06-DUPSOKACK">-n TQR-Qpid-06 -d1H -s[10000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=3 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TQR-Qpid-07-NOACK">-n TQR-Qpid-07 -d1H -s[10000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=257 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TQR-Qpid-08-PREACK">-n TQR-Qpid-08 -d1H -s[10000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=258 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
-
- <script name="TTR-Qpid-03-TX">-n TTR-Qpid-03 -d1H -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-04-AUTOACK">-n TTR-Qpid-04 -d1H -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-05-CLIENTACK">-n TTR-Qpid-05 -d1H -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=2 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-06-DUPSOKACK">-n TTR-Qpid-06 -d1H -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=3 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-07-NOACK">-n TTR-Qpid-07 -d1H -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=257 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-08-PREACK">-n TTR-Qpid-08 -d1H -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=258 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
-
- <script name="PQR-Qpid-03-TX">-n PQR-Qpid-03 -d1H -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-04-AUTOACK">-n PQR-Qpid-04 -d1H -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-05-CLIENTACK">-n PQR-Qpid-05 -d1H -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=2 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-06-DUPSOKACK">-n PQR-Qpid-06 -d1H -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=3 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-07-NOACK">-n PQR-Qpid-07 -d1H -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=257 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-08-PREACK">-n PQR-Qpid-08 -d1H -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=258 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
-
- <script name="PTR-Qpid-03-TX">-n PTR-Qpid-03 -d1H -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-04-AUTOACK">-n PTR-Qpid-04 -d1H -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-05-CLIENTACK">-n PTR-Qpid-05 -d1H -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=2 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-06-DUPSOKACK">-n PTR-Qpid-06 -d1H -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=3 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-07-NOACK">-n PTR-Qpid-07 -d1H -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=257 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-08-PREACK">-n PTR-Qpid-08 -d1H -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=258 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
-
- <!-- Performance Tests. -->
-
- <!-- Transient, P2P Tests -->
- <!-- Concurrency Tests : What are the effects of increasing consumers from 1...30 consumers -->
- <script name="TQCT-Qpid-01">-n TQCT-Qpid-01 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=2000 maxPending=2000000 </script>
- <script name="TQCT-Qpid-02">-n TQCT-Qpid-02 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=2000 maxPending=2000000 </script>
- <!-- Latency Tests : What are the effects on latency of increasing consumers from 1...30 consumers -->
- <script name="TQCL-Qpid-01">-n TQCL-Qpid-01 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=2000 maxPending=2000000 </script>
- <script name="TQCL-Qpid-02">-n TQCL-Qpid-02 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=2000 maxPending=2000000 </script>
-
- <!-- <script name="TQC-Qpid-05">-n TQC-Qpid-05 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
- <!-- <script name="TQC-Qpid-06">-n TQC-Qpid-06 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
-
-
- <!-- Message Size Tests : Tests sending message from 512b upto 1M with Point to Point messaging -->
- <script name="TQM-Qpid-01-512b">-n TQM-Qpid-01-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-02-512b">-n TQM-Qpid-02-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-01-1K">-n TQM-Qpid-01-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-02-1K">-n TQM-Qpid-02-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-01-5K">-n TQM-Qpid-01-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-02-5K">-n TQM-Qpid-02-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-01-10K">-n TQM-Qpid-01-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-02-10K">-n TQM-Qpid-02-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-01-50K">-n TQM-Qpid-01-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-02-50K">-n TQM-Qpid-02-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-01-100K">-n TQM-Qpid-01-100K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-02-100K">-n TQM-Qpid-02-100K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-01-500K">-n TQM-Qpid-01-500K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-02-500K">-n TQM-Qpid-02-500K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-01-1M">-n TQM-Qpid-01-1M -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1048576 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-02-1M">-n TQM-Qpid-02-1M -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1048576 destinationCount=1 rate=0 maxPending=100000000</script>
-
- <!-- Transient, Pub/Sub Tests -->
- <!-- Concurrency Tests : What are the effects of increasing consumers from 1...30 consumers -->
- <script name="TTCT-Qpid-01">-n TTCT-Qpid-01 -d1M -s[10] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=40 maxPending=2000000 </script>
- <script name="TTCT-Qpid-02">-n TTCT-Qpid-02 -d1M -s[10] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=40 maxPending=2000000 </script>
- <!-- Latency Tests : What are the effects on latency of increasing consumers from 1...30 consumers -->
- <script name="TTCL-Qpid-01">-n TTCL-Qpid-01 -d1M -s[10] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=40 maxPending=2000000 </script>
- <script name="TTCL-Qpid-02">-n TTCL-Qpid-02 -d1M -s[10] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=40 maxPending=2000000 </script>
-
- <!-- <script name="TTC-Qpid-05">-n TTC-Qpid-05 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
- <!-- <script name="TTC-Qpid-06">-n TTC-Qpid-06 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
-
- <!-- Message Size Tests : Tests sending message from 512b upto 1M with Point to Point messaging -->
- <script name="TTM-Qpid-01-512b">-n TTM-Qpid-01-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-02-512b">-n TTM-Qpid-02-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-01-1K">-n TTM-Qpid-01-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-02-1K">-n TTM-Qpid-02-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-01-5K">-n TTM-Qpid-01-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-02-5K">-n TTM-Qpid-02-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-01-10K">-n TTM-Qpid-01-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-02-10K">-n TTM-Qpid-02-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-01-50K">-n TTM-Qpid-01-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-02-50K">-n TTM-Qpid-02-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-01-100K">-n TTM-Qpid-01-100K -d10M -s[40] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-02-100K">-n TTM-Qpid-02-100K -d10M -s[40] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-01-500K">-n TTM-Qpid-01-500K -d10M -s[8] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-02-500K">-n TTM-Qpid-02-500K -d10M -s[8] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-01-1M">-n TTM-Qpid-01-1M -d10M -s[4] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1048576 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-02-1M">-n TTM-Qpid-02-1M -d10M -s[4] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1048476 destinationCount=1 rate=0 maxPending=20000000</script>
-
- <!-- Persistent, P2P Tests -->
- <!-- Concurrency Tests : What are the effects of increasing consumers from 1...30 consumers -->
- <script name="PQCT-Qpid-01">-n PQCT-Qpid-01 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=600 maxPending=2000000 </script>
- <script name="PQCT-Qpid-02">-n PQCT-Qpid-02 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=100 maxPending=2000000 </script>
- <!-- Latency Tests : What are the effects on latency of increasing consumers from 1...30 consumers -->
- <script name="PQCL-Qpid-01">-n PQCL-Qpid-01 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=600 maxPending=2000000 </script>
- <script name="PQCL-Qpid-02">-n PQCL-Qpid-02 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=100 maxPending=2000000 </script>
-
- <!-- <script name="PQC-Qpid-05">-n PQC-Qpid-05 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
- <!-- <script name="PQC-Qpid-06">-n PQC-Qpid-06 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
-
- <!-- Message Size Tests : Tests sending message from 512b upto 1M with Point to Point messaging -->
- <script name="PQM-Qpid-01-512b">-n PQM-Qpid-01-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-02-512b">-n PQM-Qpid-02-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-01-1K">-n PQM-Qpid-01-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-02-1K">-n PQM-Qpid-02-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-01-5K">-n PQM-Qpid-01-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-02-5K">-n PQM-Qpid-02-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-01-10K">-n PQM-Qpid-01-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-02-10K">-n PQM-Qpid-02-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-01-50K">-n PQM-Qpid-01-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-02-50K">-n PQM-Qpid-02-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-01-100K">-n PQM-Qpid-01-100K -d10M -s[40] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-02-100K">-n PQM-Qpid-02-100K -d10M -s[40] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-01-500K">-n PQM-Qpid-01-500K -d10M -s[8] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-02-500K">-n PQM-Qpid-02-500K -d10M -s[8] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-01-1M">-n PQM-Qpid-01-1M -d10M -s[4] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1048576 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-02-1M">-n PQM-Qpid-02-1M -d10M -s[4] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1048576 destinationCount=1 rate=0 maxPending=20000000</script>
-
- <!-- Persistent, Pub/Sub Tests -->
- <script name="PTCT-Qpid-01">-n PTCT-Qpid-01 -d1M -s[1] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=1 maxPending=2000000 </script>
- <script name="PTCT-Qpid-02">-n PTCT-Qpid-02 -d1M -s[1] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=1 maxPending=2000000 </script>
- <script name="PTCL-Qpid-01">-n PTCL-Qpid-01 -d1M -s[1] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=1 maxPending=2000000 </script>
- <script name="PTCL-Qpid-02">-n PTCL-Qpid-02 -d1M -s[1] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=1 maxPending=2000000 </script>
-
- <!-- <script name="PTC-Qpid-05">-n PTC-Qpid-05 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
- <!-- <script name="PTC-Qpid-06">-n PTC-Qpid-06 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
-
- <script name="PTM-Qpid-01-512b">-n PTM-Qpid-01-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-02-512b">-n PTM-Qpid-02-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-01-1K">-n PTM-Qpid-01-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-02-1K">-n PTM-Qpid-02-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-01-5K">-n PTM-Qpid-01-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-02-5K">-n PTM-Qpid-02-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-01-10K">-n PTM-Qpid-01-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-02-10K">-n PTM-Qpid-02-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-01-50K">-n PTM-Qpid-01-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-02-50K">-n PTM-Qpid-02-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-01-100K">-n PTM-Qpid-01-100K -d10M -s[40] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-02-100K">-n PTM-Qpid-02-100K -d10M -s[40] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-01-500K">-n PTM-Qpid-01-500K -d10M -s[8] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-02-500K">-n PTM-Qpid-02-500K -d10M -s[8] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-01-1M">-n PTM-Qpid-01-1M -d10M -s[4] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1048576 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-02-1M">-n PTM-Qpid-02-1M -d10M -s[4] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1048476 destinationCount=1 rate=0 maxPending=20000000</script>
-
- <!-- Benchmarking tests. -->
- <!-- Throughput. -->
- <script name="TQBT-TX-Qpid-01">-n TQBT-TX-Qpid-01 -d10M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQBT-AA-Qpid-01">-n TQBT-AA-Qpid-01 -d10M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQBT-NA-Qpid-01">-n TQBT-NA-Qpid-01 -d10M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTBT-TX-Qpid-01">-n TTBT-TX-Qpid-01 -d10M -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=true consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTBT-AA-Qpid-01">-n TTBT-AA-Qpid-01 -d10M -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTBT-NA-Qpid-01">-n TTBT-NA-Qpid-01 -d10M -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
-
- <script name="PQBT-TX-Qpid-01">-n PQBT-TX-Qpid-01 -d10M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQBT-AA-Qpid-01">-n PQBT-AA-Qpid-01 -d10M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTBT-TX-Qpid-01">-n PTBT-TX-Qpid-01 -d10M -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=true consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTBT-AA-Qpid-01">-n PTBT-AA-Qpid-01 -d10M -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
-
- <!-- Benchmark Latency testing-->
- <!-- Job Queueing. 1:10 -->
- <script name="TQBL-AA-Qpid-02-01">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=1000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-02">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=2000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-03">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=3000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-04">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=4000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-05">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=5000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-06">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=6000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-07">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=7000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-08">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=8000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-09">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=9000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-10">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=10000 maxPending=2000000 </script>
-
- <script name="PQBL-AA-Qpid-02-01">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=100 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-02">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=200 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-03">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=300 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-04">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=400 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-05">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=500 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-06">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=600 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-07">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=700 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-08">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=800 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-09">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=900 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-10">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=1000 maxPending=2000000 </script>
-
- <!-- Broadcast of small sized time critical messages. Lowish rates. Transient/Persistent. 1:100, auto ack. -->
- <script name="TTBL-AA-Qpid-03-01">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=200 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-02">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=400 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-03">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=600 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-04">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=800 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-05">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1000 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-06">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1200 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-07">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1400 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-08">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1600 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-09">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1800 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-10">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=2000 maxPending=2000000 </script>
-
- <script name="PTBL-AA-Qpid-03-01">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=10 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-02">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=20 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-03">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=30 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-04">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=40 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-05">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=50 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-06">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=60 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-07">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=70 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-08">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=80 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-09">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=90 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-10">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=100 maxPending=2000000 </script>
-
- <!-- Broadcast of medium sized time critical messages. Lowish rates. Transient/Persistent. 1:100, auto ack. -->
- <script name="TTBL-AA-Qpid-04-01">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=100 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-02">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=200 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-03">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=300 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-04">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=400 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-05">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=500 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-06">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=600 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-07">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=700 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-08">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=800 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-09">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=900 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-10">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=1000 maxPending=2000000 </script>
-
- <script name="PTBL-AA-Qpid-04-01">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=10 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-02">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=20 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-03">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=30 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-04">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=40 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-05">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=50 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-06">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=60 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-07">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=70 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-08">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=80 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-09">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=90 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-10">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=100 maxPending=2000000 </script>
-
- <!-- Low-latency broadcast of time sensitive events. Transient, no_ack. -->
- <script name="TTBL-NA-Qpid-05-01">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=400 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-02">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=800 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-03">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1200 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-04">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1600 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-05">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=2000 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-06">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=2400 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-07">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=2800 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-08">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=3200 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-09">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=3600 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-10">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=4000 maxPending=2000000 </script>
-
- <!-- Low-latency broadcast of medium sized time sensitive events. Transient, no_ack. -->
- <script name="TTBL-NA-Qpid-06-01">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=100 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-02">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=200 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-03">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=300 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-04">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=400 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-05">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=500 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-06">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=600 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-07">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=700 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-08">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=800 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-09">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=900 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-10">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=1000 maxPending=2000000 </script>
-
- <!-- Failover Tests. -->
- <script name="FT-Qpid-01">-n FT-Qpid-01 -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf messageSize=256 batchSize=10000 transacted=true properties=failovertest.properties failBeforeSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-02">-n FT-Qpid-02 -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf messageSize=256 batchSize=10000 transacted=true properties=failovertest.properties failAfterSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-03">-n FT-Qpid-03 -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf messageSize=256 batchSize=1000 transacted=true properties=failovertest.properties failAfterCommit=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-04">-n FT-Qpid-04 -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf messageSize=256 batchSize=1000 properties=failovertest.properties transacted=false failBeforeSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-05">-n FT-Qpid-05 -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf messageSize=256 batchSize=1000 properties=failovertest.properties transacted=false failAfterSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-01-P">-n FT-Qpid-01-P -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true messageSize=256 batchSize=1000 transacted=true properties=failovertest.properties failBeforeSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-02-P">-n FT-Qpid-02-P -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true messageSize=256 batchSize=1000 transacted=true properties=failovertest.properties failAfterSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-03-P">-n FT-Qpid-03-P -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true messageSize=256 batchSize=1000 transacted=true properties=failovertest.properties failAfterCommit=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-04-P">-n FT-Qpid-04-P -s[250] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true messageSize=256 batchSize=1000 properties=failovertest.properties transacted=false failBeforeSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-05-P">-n FT-Qpid-05-P -s[250] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true messageSize=256 batchSize=1000 properties=failovertest.properties transacted=false failAfterSend=true -o $QPID_WORK/results</script>
-
-</scripts>
diff --git a/java/perftests/src/main/java/org/apache/qpid/client/message/TestMessageFactory.java b/java/perftests/src/main/java/org/apache/qpid/client/message/TestMessageFactory.java
deleted file mode 100644
index d94ca5592b..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/client/message/TestMessageFactory.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.client.message;
-
-import javax.jms.JMSException;
-import javax.jms.Session;
-import javax.jms.ObjectMessage;
-import javax.jms.StreamMessage;
-import javax.jms.BytesMessage;
-import javax.jms.TextMessage;
-import javax.jms.DeliveryMode;
-import javax.jms.Destination;
-
-public class TestMessageFactory
-{
- private static final String MESSAGE_DATA_BYTES = "-message payload-message paylaod-message payload-message paylaod";
-
- public static TextMessage newTextMessage(Session session, int size) throws JMSException
- {
- return session.createTextMessage(createMessagePayload(size));
- }
-
- public static TextMessage newJMSTextMessage(Session session, int size, String encoding) throws JMSException
- {
-
- TextMessage message = session.createTextMessage();
- message.clearBody();
- message.setText(createMessagePayload(size));
- return message;
- }
-
- public static BytesMessage newBytesMessage(Session session, int size) throws JMSException
- {
- BytesMessage message = session.createBytesMessage();
- message.writeUTF(createMessagePayload(size));
- return message;
- }
-
- public static StreamMessage newStreamMessage(Session session, int size) throws JMSException
- {
- StreamMessage message = session.createStreamMessage();
- message.writeString(createMessagePayload(size));
- return message;
- }
-
- public static ObjectMessage newObjectMessage(Session session, int size) throws JMSException
- {
- if (size == 0)
- {
- return session.createObjectMessage();
- }
- else
- {
- return session.createObjectMessage(createMessagePayload(size));
- }
- }
-
- /**
- * Creates an ObjectMessage with given size and sets the JMS properties (JMSReplyTo and DeliveryMode)
- * @param session
- * @param replyDestination
- * @param size
- * @param persistent
- * @return the new ObjectMessage
- * @throws JMSException
- */
- public static ObjectMessage newObjectMessage(Session session, Destination replyDestination, int size, boolean persistent) throws JMSException
- {
- ObjectMessage msg = newObjectMessage(session, size);
-
- // Set the messages persistent delivery flag.
- msg.setJMSDeliveryMode(persistent ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT);
-
- // Ensure that the temporary reply queue is set as the reply to destination for the message.
- if (replyDestination != null)
- {
- msg.setJMSReplyTo(replyDestination);
- }
-
- return msg;
- }
-
- public static String createMessagePayload(int size)
- {
- StringBuffer buf = new StringBuffer(size);
- int count = 0;
- while (count <= (size - MESSAGE_DATA_BYTES.length()))
- {
- buf.append(MESSAGE_DATA_BYTES);
- count += MESSAGE_DATA_BYTES.length();
- }
- if (count < size)
- {
- buf.append(MESSAGE_DATA_BYTES, 0, size - count);
- }
-
- return buf.toString();
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/config/AMQConnectionFactoryInitialiser.java b/java/perftests/src/main/java/org/apache/qpid/config/AMQConnectionFactoryInitialiser.java
deleted file mode 100644
index 76fd318625..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/config/AMQConnectionFactoryInitialiser.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.config;
-
-import org.apache.qpid.client.AMQConnectionFactory;
-import org.apache.qpid.client.AMQConnectionURL;
-import org.apache.qpid.config.ConnectionFactoryInitialiser;
-import org.apache.qpid.config.ConnectorConfig;
-import org.apache.qpid.jms.ConnectionURL;
-import org.apache.qpid.url.URLSyntaxException;
-
-import javax.jms.ConnectionFactory;
-
-class AMQConnectionFactoryInitialiser implements ConnectionFactoryInitialiser
-{
- public ConnectionFactory getFactory(ConnectorConfig config)
- {
- try
- {
- final ConnectionURL connectionUrl = new AMQConnectionURL(ConnectionURL.AMQ_PROTOCOL +
- "://guest:guest@/test_path?brokerlist='tcp://" + config.getHost() + ":" + config.getPort() + "'");
- return new AMQConnectionFactory(connectionUrl);
- }
- catch (URLSyntaxException e)
- {
- throw new RuntimeException("Problem building URL", e);
- }
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/config/AbstractConfig.java b/java/perftests/src/main/java/org/apache/qpid/config/AbstractConfig.java
deleted file mode 100644
index 14db74438f..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/config/AbstractConfig.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.config;
-
-public abstract class AbstractConfig
-{
- public boolean setOptions(String[] argv)
- {
- try
- {
- for(int i = 0; i < argv.length - 1; i += 2)
- {
- String key = argv[i];
- String value = argv[i+1];
- setOption(key, value);
- }
- return true;
- }
- catch(Exception e)
- {
- System.out.println(e.getMessage());
- }
- return false;
- }
-
- protected int parseInt(String msg, String i)
- {
- try
- {
- return Integer.parseInt(i);
- }
- catch(NumberFormatException e)
- {
- throw new RuntimeException(msg + ": " + i, e);
- }
- }
-
- protected long parseLong(String msg, String i)
- {
- try
- {
- return Long.parseLong(i);
- }
- catch(NumberFormatException e)
- {
- throw new RuntimeException(msg + ": " + i, e);
- }
- }
-
- public abstract void setOption(String key, String value);
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/config/ConnectionFactoryInitialiser.java b/java/perftests/src/main/java/org/apache/qpid/config/ConnectionFactoryInitialiser.java
deleted file mode 100644
index a9984eb09a..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/config/ConnectionFactoryInitialiser.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.config;
-
-import javax.jms.ConnectionFactory;
-import javax.jms.JMSException;
-
-public interface ConnectionFactoryInitialiser
-{
- public ConnectionFactory getFactory(ConnectorConfig config) throws JMSException;
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/config/Connector.java b/java/perftests/src/main/java/org/apache/qpid/config/Connector.java
deleted file mode 100644
index 81541a3260..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/config/Connector.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.config;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-
-public class Connector
-{
- public Connection createConnection(ConnectorConfig config) throws Exception
- {
- return getConnectionFactory(config).createConnection();
- }
-
- ConnectionFactory getConnectionFactory(ConnectorConfig config) throws Exception
- {
- String factory = config.getFactory();
- if(factory == null)
- {
- factory = AMQConnectionFactoryInitialiser.class.getName();
- }
- System.out.println("Using " + factory);
- return ((ConnectionFactoryInitialiser) Class.forName(factory).newInstance()).getFactory(config);
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/config/ConnectorConfig.java b/java/perftests/src/main/java/org/apache/qpid/config/ConnectorConfig.java
deleted file mode 100644
index b120ed3f12..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/config/ConnectorConfig.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.config;
-
-public interface ConnectorConfig
-{
- public String getHost();
- public int getPort();
- public String getFactory();
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/config/JBossConnectionFactoryInitialiser.java b/java/perftests/src/main/java/org/apache/qpid/config/JBossConnectionFactoryInitialiser.java
deleted file mode 100644
index a0248a8f79..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/config/JBossConnectionFactoryInitialiser.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.config;
-
-import org.apache.qpid.config.ConnectionFactoryInitialiser;
-import org.apache.qpid.config.ConnectorConfig;
-import org.apache.qpid.client.JMSAMQException;
-
-import javax.jms.ConnectionFactory;
-import javax.jms.JMSException;
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-import javax.management.MBeanException;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import javax.naming.NameNotFoundException;
-import java.util.Hashtable;
-
-public class JBossConnectionFactoryInitialiser implements ConnectionFactoryInitialiser
-{
- public ConnectionFactory getFactory(ConnectorConfig config) throws JMSException
- {
- ConnectionFactory cf = null;
- InitialContext ic = null;
- Hashtable ht = new Hashtable();
- ht.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
- String jbossHost = System.getProperty("jboss.host", "eqd-lxamq01");
- String jbossPort = System.getProperty("jboss.port", "1099");
- ht.put(InitialContext.PROVIDER_URL, "jnp://" + jbossHost + ":" + jbossPort);
- ht.put(InitialContext.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
-
- try
- {
- ic = new InitialContext(ht);
- if (!doesDestinationExist("topictest.messages", ic))
- {
- deployTopic("topictest.messages", ic);
- }
- if (!doesDestinationExist("topictest.control", ic))
- {
- deployTopic("topictest.control", ic);
- }
-
- cf = (ConnectionFactory) ic.lookup("/ConnectionFactory");
- return cf;
- }
- catch (NamingException e)
- {
- throw new JMSAMQException("Unable to lookup object: " + e, e);
- }
- catch (Exception e)
- {
- throw new JMSAMQException("Error creating topic: " + e, e);
- }
- }
-
- private boolean doesDestinationExist(String name, InitialContext ic) throws Exception
- {
- try
- {
- ic.lookup("/" + name);
- }
- catch (NameNotFoundException e)
- {
- return false;
- }
- return true;
- }
-
- private void deployTopic(String name, InitialContext ic) throws Exception
- {
- MBeanServerConnection mBeanServer = lookupMBeanServerProxy(ic);
-
- ObjectName serverObjectName = new ObjectName("jboss.messaging:service=ServerPeer");
-
- String jndiName = "/" + name;
- try
- {
- mBeanServer.invoke(serverObjectName, "createTopic",
- new Object[]{name, jndiName},
- new String[]{"java.lang.String", "java.lang.String"});
- }
- catch (MBeanException e)
- {
- System.err.println("Error: " + e);
- System.err.println("Cause: " + e.getCause());
- }
- }
-
- private MBeanServerConnection lookupMBeanServerProxy(InitialContext ic) throws NamingException
- {
- return (MBeanServerConnection) ic.lookup("jmx/invoker/RMIAdaptor");
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/AbstractRunner.java b/java/perftests/src/main/java/org/apache/qpid/disttest/AbstractRunner.java
new file mode 100644
index 0000000000..9e865010f8
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/AbstractRunner.java
@@ -0,0 +1,74 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import java.io.FileInputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+
+public class AbstractRunner
+{
+ public static final String JNDI_CONFIG_PROP = "jndi-config";
+ public static final String JNDI_CONFIG_DEFAULT = "perftests-jndi.properties";
+
+ private Map<String,String> _cliOptions = new HashMap<String, String>();
+ {
+ getCliOptions().put(JNDI_CONFIG_PROP, JNDI_CONFIG_DEFAULT);
+ }
+
+ protected Context getContext()
+ {
+ Context context = null;
+
+ try
+ {
+ final Properties properties = new Properties();
+ properties.load(new FileInputStream(getJndiConfig()));
+ context = new InitialContext(properties);
+ }
+ catch (Exception e)
+ {
+ throw new DistributedTestException("Exception while loading JNDI properties", e);
+ }
+
+ return context;
+ }
+
+ public void parseArgumentsIntoConfig(String[] args)
+ {
+ ArgumentParser argumentParser = new ArgumentParser();
+ argumentParser.parseArgumentsIntoConfig(getCliOptions(), args);
+ }
+
+ protected String getJndiConfig()
+ {
+ return getCliOptions().get(AbstractRunner.JNDI_CONFIG_PROP);
+ }
+
+ protected Map<String,String> getCliOptions()
+ {
+ return _cliOptions;
+ }
+} \ No newline at end of file
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/ArgumentParser.java b/java/perftests/src/main/java/org/apache/qpid/disttest/ArgumentParser.java
new file mode 100644
index 0000000000..8c1f8675e3
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/ArgumentParser.java
@@ -0,0 +1,44 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import java.util.Map;
+
+public class ArgumentParser
+{
+ public void parseArgumentsIntoConfig(Map<String, String> initialValues, String[] args)
+ {
+ for(String arg: args)
+ {
+ String[] splitArg = arg.split("=");
+ if(splitArg.length != 2)
+ {
+ throw new IllegalArgumentException("arguments must have format <name>=<value>: " + arg);
+ }
+
+ if(initialValues.put(splitArg[0], splitArg[1]) == null)
+ {
+ throw new IllegalArgumentException("not a valid configuration property: " + arg);
+ }
+ }
+
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/ClientRunner.java b/java/perftests/src/main/java/org/apache/qpid/disttest/ClientRunner.java
new file mode 100644
index 0000000000..9c2f4a3d95
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/ClientRunner.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ClientRunner extends AbstractRunner
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ClientRunner.class);
+
+ public static final String NUM_OF_CLIENTS_PROP = "number-of-clients";
+
+ public static final String NUM_OF_CLIENTS_DEFAULT = "1";
+
+ public ClientRunner()
+ {
+ getCliOptions().put(NUM_OF_CLIENTS_PROP, NUM_OF_CLIENTS_DEFAULT);
+ }
+
+ public static void main(String[] args)
+ {
+ ClientRunner runner = new ClientRunner();
+ runner.parseArgumentsIntoConfig(args);
+ runner.runClients();
+ }
+
+ public void setJndiPropertiesFileLocation(String jndiConfigFileLocation)
+ {
+ getCliOptions().put(JNDI_CONFIG_PROP, jndiConfigFileLocation);
+ }
+
+ /**
+ * Run the clients in the background
+ */
+ public void runClients()
+ {
+ int numClients = Integer.parseInt(getCliOptions().get(NUM_OF_CLIENTS_PROP));
+
+ Context context = getContext();
+
+ for(int i = 1; i <= numClients; i++)
+ {
+ createBackgroundClient(context);
+ }
+ }
+
+ private void createBackgroundClient(Context context)
+ {
+ try
+ {
+ final Client client = new Client(new ClientJmsDelegate(context));
+
+ final Thread clientThread = new Thread(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ LOGGER.info("Starting client " + client.getClientName());
+ client.start();
+ client.waitUntilStopped();
+ LOGGER.info("Stopped client " + client.getClientName());
+ }
+ });
+ clientThread.start();
+ }
+ catch (NamingException e)
+ {
+ throw new DistributedTestException("Exception while creating client instance", e);
+ }
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java b/java/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java
new file mode 100644
index 0000000000..aa9c582bf8
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java
@@ -0,0 +1,238 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.naming.Context;
+
+import org.apache.qpid.disttest.controller.Controller;
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+import org.apache.qpid.disttest.controller.config.Config;
+import org.apache.qpid.disttest.controller.config.ConfigReader;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.results.aggregation.Aggregator;
+import org.apache.qpid.disttest.results.formatting.CSVFormater;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ControllerRunner extends AbstractRunner
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ControllerRunner.class);
+
+ public static final String TEST_CONFIG_PROP = "test-config";
+ public static final String DISTRIBUTED_PROP = "distributed";
+ public static final String OUTPUT_DIR_PROP = "outputdir";
+
+ private static final String TEST_CONFIG_DEFAULT = "perftests-config.json";
+ private static final String DISTRIBUTED_DEFAULT = "false";
+ private static final String OUTPUT_DIR_DEFAULT = ".";
+
+ private final Aggregator _aggregator = new Aggregator();
+
+
+ public ControllerRunner()
+ {
+ getCliOptions().put(TEST_CONFIG_PROP, TEST_CONFIG_DEFAULT);
+ getCliOptions().put(DISTRIBUTED_PROP, DISTRIBUTED_DEFAULT);
+ getCliOptions().put(OUTPUT_DIR_PROP, OUTPUT_DIR_DEFAULT);
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ ControllerRunner runner = new ControllerRunner();
+ runner.parseArgumentsIntoConfig(args);
+ runner.runController();
+ }
+
+ public void runController() throws Exception
+ {
+ Context context = getContext();
+
+ ControllerJmsDelegate jmsDelegate = new ControllerJmsDelegate(context);
+
+ try
+ {
+ runTests(jmsDelegate);
+ }
+ finally
+ {
+ jmsDelegate.closeConnections();
+ }
+ }
+
+ private void runTests(ControllerJmsDelegate jmsDelegate)
+ {
+ Controller controller = new Controller(jmsDelegate, DistributedTestConstants.REGISTRATION_TIMEOUT, DistributedTestConstants.COMMAND_RESPONSE_TIMEOUT);
+
+ final List<String> testConfigFiles = getTestConfigFiles();
+ createClientsIfNotDistributed(testConfigFiles);
+
+ try
+ {
+ for (String testConfigFile : testConfigFiles)
+ {
+ final Config testConfig = buildTestConfigFrom(testConfigFile);
+ controller.setConfig(testConfig);
+
+ controller.awaitClientRegistrations();
+
+ LOGGER.info("Running test : " + testConfigFile);
+ runTest(controller, testConfigFile);
+ }
+ }
+ finally
+ {
+ controller.stopAllRegisteredClients();
+ }
+
+ }
+
+ private void runTest(Controller controller, String testConfigFile)
+ {
+ final Config testConfig = buildTestConfigFrom(testConfigFile);
+ controller.setConfig(testConfig);
+
+ ResultsForAllTests rawResultsForAllTests = controller.runAllTests();
+ ResultsForAllTests resultsForAllTests = _aggregator.aggregateResults(rawResultsForAllTests);
+
+ final String outputFile = generateOutputCsvNameFrom(testConfigFile);
+ writeResultsToFile(resultsForAllTests, outputFile);
+ }
+
+ private void createClientsIfNotDistributed(final List<String> testConfigFiles)
+ {
+ if(!isDistributed())
+ {
+ int maxNumberOfClients = 0;
+ for (String testConfigFile : testConfigFiles)
+ {
+ final Config testConfig = buildTestConfigFrom(testConfigFile);
+ final int numClients = testConfig.getTotalNumberOfClients();
+ maxNumberOfClients = Math.max(numClients, maxNumberOfClients);
+ }
+
+ //we must create the required test clients, running in single-jvm mode
+ for (int i = 1; i <= maxNumberOfClients; i++)
+ {
+ ClientRunner clientRunner = new ClientRunner();
+ clientRunner.setJndiPropertiesFileLocation(getJndiConfig());
+ clientRunner.runClients();
+ }
+ }
+ }
+
+ private void writeResultsToFile(ResultsForAllTests resultsForAllTests, String outputFile)
+ {
+ FileWriter writer = null;
+ try
+ {
+ final String outputCsv = new CSVFormater().format(resultsForAllTests);
+ writer = new FileWriter(outputFile);
+ writer.write(outputCsv);
+ LOGGER.info("Wrote " + resultsForAllTests.getTestResults().size() + " test result(s) to output file " + outputFile);
+ }
+ catch (IOException e)
+ {
+ throw new DistributedTestException("Unable to write output file " + outputFile, e);
+ }
+ finally
+ {
+ if (writer != null)
+ {
+ try
+ {
+ writer.close();
+ }
+ catch (IOException e)
+ {
+ LOGGER.error("Failed to close stream for file " + outputFile, e);
+ }
+ }
+ }
+ }
+
+ private String generateOutputCsvNameFrom(String testConfigFile)
+ {
+ final String filenameOnlyWithExtension = new File(testConfigFile).getName();
+ final String cvsFile = filenameOnlyWithExtension.replaceFirst(".?\\w*$", ".csv");
+ final String outputDir = String.valueOf(getCliOptions().get(ControllerRunner.OUTPUT_DIR_PROP));
+
+ return new File(outputDir, cvsFile).getAbsolutePath();
+ }
+
+ private List<String> getTestConfigFiles()
+ {
+ final List<String> testConfigFile = new ArrayList<String>();
+ final File configFileOrDirectory = new File(getCliOptions().get(ControllerRunner.TEST_CONFIG_PROP));
+
+ if (configFileOrDirectory.isDirectory())
+ {
+ final String[] configFiles = configFileOrDirectory.list(new FilenameFilter()
+ {
+ @Override
+ public boolean accept(File dir, String name)
+ {
+ return new File(dir, name).isFile() && name.endsWith(".json");
+ }
+ });
+
+ for (String configFile : configFiles)
+ {
+ testConfigFile.add(new File(configFileOrDirectory, configFile).getAbsolutePath());
+ }
+ }
+ else
+ {
+ testConfigFile.add(configFileOrDirectory.getAbsolutePath());
+ }
+
+ return testConfigFile;
+ }
+
+ private Config buildTestConfigFrom(String testConfigFile)
+ {
+ ConfigReader configReader = new ConfigReader();
+ Config testConfig;
+ try
+ {
+ testConfig = configReader.getConfigFromFile(testConfigFile);
+ }
+ catch (FileNotFoundException e)
+ {
+ throw new DistributedTestException("Exception while loading test config from " + testConfigFile, e);
+ }
+ return testConfig;
+ }
+
+ private boolean isDistributed()
+ {
+ return Boolean.valueOf(getCliOptions().get(ControllerRunner.DISTRIBUTED_PROP));
+ }
+
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestConstants.java b/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestConstants.java
new file mode 100644
index 0000000000..c4892edca9
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestConstants.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+public abstract class DistributedTestConstants
+{
+ public static final String PERF_TEST_PROPERTIES_FILE = "perftests.properties";
+
+ public static final String MSG_COMMAND_PROPERTY = "COMMAND";
+ public static final String MSG_JSON_PROPERTY = "JSON";
+
+ public static final long REGISTRATION_TIMEOUT = 60000;
+ public static final long COMMAND_RESPONSE_TIMEOUT = 10000;
+
+ public static final String CONTROLLER_QUEUE_JNDI_NAME = "controllerqueue";
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestException.java b/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestException.java
new file mode 100644
index 0000000000..d1d24dcfff
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestException.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import org.apache.qpid.disttest.message.Command;
+
+public class DistributedTestException extends RuntimeException
+{
+ private static final long serialVersionUID = 1L;
+ private final Command causeCommand;
+
+ public DistributedTestException(final String message)
+ {
+ this(message, (Command) null);
+ }
+
+ public DistributedTestException(final Throwable cause)
+ {
+ this(cause, null);
+ }
+
+ public DistributedTestException(final String message, final Throwable cause)
+ {
+ this(message, cause, null);
+ }
+
+ public DistributedTestException(final String message, final Command commandCause)
+ {
+ super(message);
+ causeCommand = commandCause;
+ }
+
+ public DistributedTestException(final Throwable cause, final Command commandCause)
+ {
+ super(cause);
+ causeCommand = commandCause;
+ }
+
+ public DistributedTestException(final String message, final Throwable cause, final Command commandCause)
+ {
+ super(message, cause);
+ causeCommand = commandCause;
+ }
+
+ public Command getCauseCommand()
+ {
+ return causeCommand;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/Visitor.java b/java/perftests/src/main/java/org/apache/qpid/disttest/Visitor.java
new file mode 100644
index 0000000000..52dad9aa4d
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/Visitor.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * A variation of the visitor pattern that uses reflection to call the correct
+ * visit method. By convention, subclasses should provide public
+ * <pre>visit(SpecificClass)</pre> methods.
+ */
+public abstract class Visitor
+{
+
+ private static final String VISITOR_METHOD_NAME = "visit";
+
+ public void visit(Object targetObject)
+ {
+ Class<? extends Object> targetObjectClass = targetObject.getClass();
+ final Method method = findVisitMethodForTargetObjectClass(targetObjectClass);
+ invokeVisitMethod(targetObject, method);
+ }
+
+ private Method findVisitMethodForTargetObjectClass(
+ Class<? extends Object> targetObjectClass)
+ {
+ final Method method;
+ try
+ {
+ method = getClass().getDeclaredMethod(VISITOR_METHOD_NAME, targetObjectClass);
+ }
+ catch (Exception e)
+ {
+ throw new DistributedTestException("Failed to find method " + VISITOR_METHOD_NAME + " on object of class " + targetObjectClass, e);
+ }
+ return method;
+ }
+
+ private void invokeVisitMethod(Object targetObject, final Method method)
+ {
+ try
+ {
+ method.invoke(this, targetObject);
+ }
+ catch (IllegalArgumentException e)
+ {
+ throw new DistributedTestException(e);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new DistributedTestException(e);
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new DistributedTestException(e.getCause());
+ }
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/Client.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/Client.java
new file mode 100644
index 0000000000..1d2d862301
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/Client.java
@@ -0,0 +1,208 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.naming.NamingException;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.Visitor;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.Response;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Client
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(Client.class);
+
+ private final ClientJmsDelegate _clientJmsDelegate;
+
+ private final CountDownLatch _latch = new CountDownLatch(1);
+ private Visitor _visitor;
+ private final AtomicReference<ClientState> _state;
+ private ParticipantExecutorRegistry _participantRegistry = new ParticipantExecutorRegistry();
+
+ public Client(final ClientJmsDelegate delegate) throws NamingException
+ {
+ _clientJmsDelegate = delegate;
+ _state = new AtomicReference<ClientState>(ClientState.CREATED);
+ _visitor = new ClientCommandVisitor(this, _clientJmsDelegate);
+ }
+
+ /**
+ * Register with the controller
+ */
+ public void start()
+ {
+ _clientJmsDelegate.setInstructionListener(this);
+ _clientJmsDelegate.sendRegistrationMessage();
+ _state.set(ClientState.READY);
+ }
+
+ public void stop()
+ {
+ _state.set(ClientState.STOPPED);
+ _latch.countDown();
+ }
+
+ public void addParticipantExecutor(final ParticipantExecutor participant)
+ {
+ _participantRegistry.add(participant);
+ }
+
+ public void waitUntilStopped()
+ {
+ waitUntilStopped(0);
+ }
+
+ public void waitUntilStopped(final long timeout)
+ {
+ try
+ {
+ if (timeout == 0)
+ {
+ _latch.await();
+ }
+ else
+ {
+ _latch.await(timeout, TimeUnit.MILLISECONDS);
+ }
+ }
+ catch (final InterruptedException ie)
+ {
+ Thread.currentThread().interrupt();
+ }
+
+ _clientJmsDelegate.destroy();
+ }
+
+ public void processInstruction(final Command command)
+ {
+ if (LOGGER.isInfoEnabled())
+ {
+ LOGGER.info("Client " + getClientName() + " received command: " + command);
+ }
+ String responseMessage = null;
+ try
+ {
+ command.accept(_visitor);
+ }
+ catch (final Exception e)
+ {
+ LOGGER.error("Error processing instruction", e);
+ responseMessage = e.getMessage();
+ }
+ finally
+ {
+ _clientJmsDelegate.sendResponseMessage(new Response(_clientJmsDelegate.getClientName(), command.getType(), responseMessage));
+ }
+ }
+
+ public ClientState getState()
+ {
+ return _state.get();
+ }
+
+ public String getClientName()
+ {
+ return _clientJmsDelegate.getClientName();
+ }
+
+ public void setClientCommandVisitor(final ClientCommandVisitor visitor)
+ {
+ _visitor = visitor;
+ }
+
+ public void startTest()
+ {
+ if (_state.compareAndSet(ClientState.READY, ClientState.RUNNING_TEST))
+ {
+ try
+ {
+ _clientJmsDelegate.startConnections();
+ for (final ParticipantExecutor executor : _participantRegistry.executors())
+ {
+ executor.start(this);
+ }
+ }
+ catch (final Exception e)
+ {
+ try
+ {
+ tearDownTest();
+ }
+ catch (final Exception e2)
+ {
+ // ignore
+ }
+ throw new DistributedTestException("Error starting test: " + _clientJmsDelegate.getClientName(), e);
+ }
+ }
+ else
+ {
+ throw new DistributedTestException("Client '" + _clientJmsDelegate.getClientName()
+ + "' is not in READY state:" + _state.get());
+ }
+ }
+
+ public void tearDownTest()
+ {
+ if (_state.compareAndSet(ClientState.RUNNING_TEST, ClientState.READY))
+ {
+ LOGGER.info("Tearing down test on client: " + _clientJmsDelegate.getClientName());
+
+ _clientJmsDelegate.closeTestConnections();
+ }
+ else
+ {
+ throw new DistributedTestException("Client '" + _clientJmsDelegate.getClientName() + "' is not in RUNNING_TEST state! Ignoring tearDownTest");
+ }
+
+
+ _participantRegistry.clear();
+ }
+
+ public void sendResults(ParticipantResult testResult)
+ {
+ _clientJmsDelegate.sendResponseMessage(testResult);
+ LOGGER.info("Sent test results " + testResult);
+ }
+
+ @Override
+ public String toString()
+ {
+ return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
+ .append("clientJmsDelegate", _clientJmsDelegate).toString();
+ }
+
+ void setParticipantRegistry(ParticipantExecutorRegistry participantRegistry)
+ {
+ _participantRegistry = participantRegistry;
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientCommandVisitor.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientCommandVisitor.java
new file mode 100644
index 0000000000..791897323e
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientCommandVisitor.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import org.apache.qpid.disttest.Visitor;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+import org.apache.qpid.disttest.message.StartTestCommand;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.apache.qpid.disttest.message.TearDownTestCommand;
+
+public class ClientCommandVisitor extends Visitor
+{
+ private final Client _client;
+ private final ClientJmsDelegate _clientJmsDelegate;
+
+ public ClientCommandVisitor(final Client client, final ClientJmsDelegate clientJmsDelegate)
+ {
+ super();
+ _client = client;
+ _clientJmsDelegate = clientJmsDelegate;
+ }
+
+ public void visit(final StopClientCommand command)
+ {
+ _client.stop();
+ }
+
+ public void visit(final NoOpCommand command)
+ {
+ // no-op
+ }
+
+ public void visit(final CreateConnectionCommand command)
+ {
+ _clientJmsDelegate.createConnection(command);
+ }
+
+ public void visit(final CreateSessionCommand command)
+ {
+ _clientJmsDelegate.createSession(command);
+ }
+
+ public void visit(final CreateProducerCommand command)
+ {
+
+ final ProducerParticipant participant = new ProducerParticipant(_clientJmsDelegate, command);
+ _clientJmsDelegate.createProducer(command);
+ final ParticipantExecutor executor = new ParticipantExecutor(participant);
+ _client.addParticipantExecutor(executor);
+ }
+
+ public void visit(final CreateConsumerCommand command)
+ {
+ final ConsumerParticipant participant = new ConsumerParticipant(_clientJmsDelegate, command);
+ _clientJmsDelegate.createConsumer(command);
+ final ParticipantExecutor executor = new ParticipantExecutor(participant);
+ _client.addParticipantExecutor(executor);
+ }
+
+ public void visit(final StartTestCommand command)
+ {
+ _client.startTest();
+ }
+
+ public void visit(final TearDownTestCommand command)
+ {
+ _client.tearDownTest();
+ }
+
+ public void visit(final CreateMessageProviderCommand command)
+ {
+ _clientJmsDelegate.createMessageProvider(command);
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientState.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientState.java
new file mode 100644
index 0000000000..c88c0a6c86
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientState.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+public enum ClientState
+{
+ CREATED, READY, STOPPED, RUNNING_TEST;
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/ConsumerParticipant.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ConsumerParticipant.java
new file mode 100644
index 0000000000..1b5e8276c2
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ConsumerParticipant.java
@@ -0,0 +1,251 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+
+import java.util.Date;
+import java.util.NavigableSet;
+import java.util.concurrent.ConcurrentSkipListSet;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.jms.Message;
+import javax.jms.MessageListener;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ConsumerParticipant implements Participant
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ConsumerParticipant.class);
+
+ private final AtomicInteger _totalNumberOfMessagesReceived = new AtomicInteger(0);
+ private final NavigableSet<Integer> _allConsumedPayloadSizes = new ConcurrentSkipListSet<Integer>();
+ private final AtomicLong _totalPayloadSizeOfAllMessagesReceived = new AtomicLong(0);
+ private final CountDownLatch _asyncRunHasFinished = new CountDownLatch(1);
+ private final ClientJmsDelegate _jmsDelegate;
+ private final CreateConsumerCommand _command;
+ private final ParticipantResultFactory _resultFactory;
+
+ private long _startTime;
+
+ private volatile Exception _asyncMessageListenerException;
+
+ public ConsumerParticipant(final ClientJmsDelegate delegate, final CreateConsumerCommand command)
+ {
+ _jmsDelegate = delegate;
+ _command = command;
+ _resultFactory = new ParticipantResultFactory();
+ }
+
+ @Override
+ public ParticipantResult doIt(String registeredClientName) throws Exception
+ {
+ final Date start = new Date();
+ final int acknowledgeMode = _jmsDelegate.getAcknowledgeMode(_command.getSessionName());
+
+ if (_command.getMaximumDuration() == 0 && _command.getNumberOfMessages() == 0)
+ {
+ throw new DistributedTestException("number of messages and duration cannot both be zero");
+ }
+
+ if (_command.isSynchronous())
+ {
+ synchronousRun();
+ }
+ else
+ {
+ _jmsDelegate.registerListener(_command.getParticipantName(), new MessageListener(){
+
+ @Override
+ public void onMessage(Message message)
+ {
+ processAsynchMessage(message);
+ }
+
+ });
+
+ waitUntilMsgListenerHasFinished();
+ rethrowAnyAsyncMessageListenerException();
+ }
+
+ Date end = new Date();
+ int numberOfMessagesSent = _totalNumberOfMessagesReceived.get();
+ long totalPayloadSize = _totalPayloadSizeOfAllMessagesReceived.get();
+ int payloadSize = getPayloadSizeForResultIfConstantOrZeroOtherwise(_allConsumedPayloadSizes);
+
+ ConsumerParticipantResult result = _resultFactory.createForConsumer(
+ getName(),
+ registeredClientName,
+ _command,
+ acknowledgeMode,
+ numberOfMessagesSent,
+ payloadSize,
+ totalPayloadSize,
+ start, end);
+
+ return result;
+ }
+
+ private void synchronousRun()
+ {
+ LOGGER.debug("entered synchronousRun: " + this);
+
+ _startTime = System.currentTimeMillis();
+
+ Message message = null;
+
+ do
+ {
+ message = _jmsDelegate.consumeMessage(_command.getParticipantName(),
+ _command.getReceiveTimeout());
+ } while (processMessage(message));
+ }
+
+ /**
+ * @return whether to continue running (ie returns false if the message quota has been reached)
+ */
+ private boolean processMessage(Message message)
+ {
+ int messageCount = _totalNumberOfMessagesReceived.incrementAndGet();
+ if (LOGGER.isTraceEnabled())
+ {
+ LOGGER.trace("message " + messageCount + " received by " + this);
+ }
+ int messagePayloadSize = _jmsDelegate.calculatePayloadSizeFrom(message);
+ _allConsumedPayloadSizes.add(messagePayloadSize);
+ _totalPayloadSizeOfAllMessagesReceived.addAndGet(messagePayloadSize);
+
+ boolean batchEnabled = _command.getBatchSize() > 0;
+ boolean batchComplete = batchEnabled && messageCount % _command.getBatchSize() == 0;
+
+ if (!batchEnabled || batchComplete)
+ {
+ if (LOGGER.isTraceEnabled() && batchEnabled)
+ {
+ LOGGER.trace("Committing: batch size " + _command.getBatchSize() );
+ }
+ _jmsDelegate.commitOrAcknowledgeMessage(message, _command.getSessionName());
+ }
+
+ boolean reachedExpectedNumberOfMessages = _command.getNumberOfMessages() > 0 && messageCount >= _command.getNumberOfMessages();
+ boolean reachedMaximumDuration = _command.getMaximumDuration() > 0 && System.currentTimeMillis() - _startTime >= _command.getMaximumDuration();
+ boolean finishedConsuming = reachedExpectedNumberOfMessages || reachedMaximumDuration;
+
+ if (finishedConsuming)
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("message " + messageCount
+ + " reachedExpectedNumberOfMessages " + reachedExpectedNumberOfMessages
+ + " reachedMaximumDuration " + reachedMaximumDuration);
+ }
+
+ if (batchEnabled && !batchComplete)
+ {
+ if (LOGGER.isTraceEnabled())
+ {
+ LOGGER.trace("Committing: batch size " + _command.getBatchSize() );
+ }
+
+ // commit/acknowledge remaining messages if necessary
+ _jmsDelegate.commitOrAcknowledgeMessage(message, _command.getSessionName());
+ }
+ return false;
+ }
+
+ return true;
+ }
+
+
+ /**
+ * Intended to be called from a {@link MessageListener}. Updates {@link #_asyncRunHasFinished} if
+ * no more messages should be processed, causing {@link #doIt(String)} to exit.
+ */
+ public void processAsynchMessage(Message message)
+ {
+ boolean continueRunning = true;
+ try
+ {
+ if (_startTime == 0)
+ {
+ // reset counter and start time on receiving of first message
+ _startTime = System.currentTimeMillis();
+ }
+
+ continueRunning = processMessage(message);
+ }
+ catch (Exception e)
+ {
+ LOGGER.error("Error occured consuming message " + _totalNumberOfMessagesReceived, e);
+ continueRunning = false;
+ _asyncMessageListenerException = e;
+ }
+
+ if(!continueRunning)
+ {
+ _asyncRunHasFinished.countDown();
+ }
+ }
+
+ @Override
+ public void releaseResources()
+ {
+ _jmsDelegate.closeTestConsumer(_command.getParticipantName());
+ }
+
+ private int getPayloadSizeForResultIfConstantOrZeroOtherwise(NavigableSet<Integer> allSizes)
+ {
+ return allSizes.size() == 1 ? _allConsumedPayloadSizes.first() : 0;
+ }
+
+ private void rethrowAnyAsyncMessageListenerException()
+ {
+ if (_asyncMessageListenerException != null)
+ {
+ throw new DistributedTestException(_asyncMessageListenerException);
+ }
+ }
+
+ private void waitUntilMsgListenerHasFinished() throws Exception
+ {
+ LOGGER.debug("waiting until message listener has finished for " + this);
+ _asyncRunHasFinished.await();
+ LOGGER.debug("Message listener has finished for " + this);
+ }
+
+ @Override
+ public String getName()
+ {
+ return _command.getParticipantName();
+ }
+
+ @Override
+ public String toString()
+ {
+ return "ConsumerParticipant [_command=" + _command + ", _startTime=" + _startTime + "]";
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/MessageProvider.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/MessageProvider.java
new file mode 100644
index 0000000000..2dcf8940b6
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/MessageProvider.java
@@ -0,0 +1,212 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.Future;
+import java.util.concurrent.FutureTask;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+
+public class MessageProvider
+{
+ public static final String TTL = "ttl";
+
+ public static final String DELIVERY_MODE = "deliveryMode";
+
+ public static final String PRIORITY = "priority";
+
+ public static final String[] STANDARD_JMS_PROPERTIES = { "correlationID", DELIVERY_MODE,
+ "expiration", "messageID", PRIORITY, "redelivered", "replyTo", "timestamp", "type", TTL };
+
+ private Map<String, PropertyValue> _messageProperties;
+ private ConcurrentMap<Integer, Future<String>> _payloads;
+
+ public MessageProvider(Map<String, PropertyValue> messageProperties)
+ {
+ _messageProperties = messageProperties;
+ _payloads = new ConcurrentHashMap<Integer, Future<String>>();
+ }
+
+ public Message nextMessage(Session session, CreateProducerCommand command) throws JMSException
+ {
+ Message message = createTextMessage(session, command);
+ setMessageProperties(message);
+ return message;
+ }
+
+ public boolean isPropertySet(String name)
+ {
+ return _messageProperties != null && _messageProperties.containsKey(name);
+ }
+
+ public void setMessageProperties(Message message) throws JMSException
+ {
+ if (_messageProperties != null)
+ {
+ for (Entry<String, PropertyValue> entry : _messageProperties.entrySet())
+ {
+ String propertyName = entry.getKey();
+ Object propertyValue = entry.getValue().getValue();
+ if (isStandardProperty(propertyName))
+ {
+ setStandardProperty(message, propertyName, propertyValue);
+ }
+ else
+ {
+ setCustomProperty(message, propertyName, propertyValue);
+ }
+ }
+ }
+ }
+
+ protected void setCustomProperty(Message message, String propertyName, Object propertyValue) throws JMSException
+ {
+ if (propertyValue instanceof Integer)
+ {
+ message.setIntProperty(propertyName, ((Integer) propertyValue).intValue());
+ }
+ else if (propertyValue instanceof Long)
+ {
+ message.setLongProperty(propertyName, ((Long) propertyValue).longValue());
+ }
+ else if (propertyValue instanceof Boolean)
+ {
+ message.setBooleanProperty(propertyName, ((Boolean) propertyValue).booleanValue());
+ }
+ else if (propertyValue instanceof Byte)
+ {
+ message.setByteProperty(propertyName, ((Byte) propertyValue).byteValue());
+ }
+ else if (propertyValue instanceof Double)
+ {
+ message.setDoubleProperty(propertyName, ((Double) propertyValue).doubleValue());
+ }
+ else if (propertyValue instanceof Float)
+ {
+ message.setFloatProperty(propertyName, ((Float) propertyValue).floatValue());
+ }
+ else if (propertyValue instanceof Short)
+ {
+ message.setShortProperty(propertyName, ((Short) propertyValue).shortValue());
+ }
+ else if (propertyValue instanceof String)
+ {
+ message.setStringProperty(propertyName, (String) propertyValue);
+ }
+ else
+ {
+ message.setObjectProperty(propertyName, propertyValue);
+ }
+ }
+
+ protected void setStandardProperty(Message message, String property, Object propertyValue) throws JMSException
+ {
+ String propertyName = "JMS" + StringUtils.capitalize(property);
+ try
+ {
+ BeanUtils.setProperty(message, propertyName, propertyValue);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new DistributedTestException("Unable to set property " + propertyName + " :" + e.getMessage(), e);
+ }
+ catch (InvocationTargetException e)
+ {
+ if (e.getCause() instanceof JMSException)
+ {
+ throw ((JMSException) e.getCause());
+ }
+ else
+ {
+ throw new DistributedTestException("Unable to set property " + propertyName + " :" + e.getMessage(), e);
+ }
+ }
+ }
+
+ protected boolean isStandardProperty(String propertyName)
+ {
+ for (int i = 0; i < STANDARD_JMS_PROPERTIES.length; i++)
+ {
+ if (propertyName.equals(STANDARD_JMS_PROPERTIES[i]))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected Message createTextMessage(Session ssn, final CreateProducerCommand command) throws JMSException
+ {
+ String payload = getMessagePayload(command);
+ TextMessage msg = ssn.createTextMessage();
+ msg.setText(payload);
+ return msg;
+ }
+
+ protected String getMessagePayload(final CreateProducerCommand command)
+ {
+ FutureTask<String> createTextFuture = new FutureTask<String>(new Callable<String>()
+ {
+ @Override
+ public String call() throws Exception
+ {
+ return StringUtils.repeat("a", command.getMessageSize());
+ }
+ });
+
+ Future<String> future = _payloads.putIfAbsent(command.getMessageSize(), createTextFuture);
+ if (future == null)
+ {
+ createTextFuture.run();
+ future = createTextFuture;
+ }
+ String payload = null;
+ try
+ {
+ payload = future.get();
+ }
+ catch (Exception e)
+ {
+ throw new DistributedTestException("Unable to create message payload :" + e.getMessage(), e);
+ }
+ return payload;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "MessageProvider [_messageProperties=" + _messageProperties + "]";
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/Participant.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/Participant.java
new file mode 100644
index 0000000000..941ec90565
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/Participant.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+
+public interface Participant
+{
+ ParticipantResult doIt(String registeredClientName) throws Exception;
+
+ void releaseResources();
+
+ String getName();
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutor.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutor.java
new file mode 100644
index 0000000000..d5e307d50f
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutor.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ParticipantExecutor
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantExecutor.class);
+
+ private static final ExecutorService SHARED_UNBOUNDED_THREAD_POOL = Executors.newCachedThreadPool(new DaemonThreadFactory());
+
+ private Executor _executor = SHARED_UNBOUNDED_THREAD_POOL;
+
+ private Client _client;
+
+ private final Participant _participant;
+
+ private final ParticipantResultFactory _factory;
+
+ public ParticipantExecutor(Participant participant)
+ {
+ _participant = participant;
+ _factory = new ParticipantResultFactory();
+ }
+
+ /**
+ * Schedules the test participant to be run in a background thread.
+ */
+ public void start(Client client)
+ {
+ _client = client;
+
+ LOGGER.info("Starting test participant in background thread: " + this);
+ _executor.execute(new ParticipantRunnable());
+ }
+
+ public String getParticipantName()
+ {
+ return _participant.getName();
+ }
+
+ void setExecutor(Executor executor)
+ {
+ _executor = executor;
+ }
+
+ private class ParticipantRunnable implements Runnable
+ {
+ @Override
+ public final void run()
+ {
+ Thread currentThread = Thread.currentThread();
+ final String initialThreadName = currentThread.getName();
+ currentThread.setName(initialThreadName + "-" + getParticipantName());
+
+ try
+ {
+ runParticipantAndSendResults();
+ }
+ finally
+ {
+ currentThread.setName(initialThreadName);
+ }
+ }
+
+ private void runParticipantAndSendResults()
+ {
+ ParticipantResult result = null;
+ try
+ {
+ if (LOGGER.isInfoEnabled())
+ {
+ LOGGER.info("About to run participant " + _participant);
+ }
+ result = _participant.doIt(_client.getClientName());
+ }
+ catch (Throwable t)
+ {
+ String errorMessage = "Unhandled error: " + t.getMessage();
+ LOGGER.error(errorMessage, t);
+ result = _factory.createForError(_participant.getName(), _client.getClientName(), errorMessage);
+ }
+ finally
+ {
+ _client.sendResults(result);
+ _participant.releaseResources();
+ }
+ }
+ }
+
+ private static final class DaemonThreadFactory implements ThreadFactory
+ {
+ @Override
+ public Thread newThread(Runnable r)
+ {
+ Thread thread = new Thread(r);
+ thread.setDaemon(true);
+ return thread;
+ }
+ }
+
+ @Override
+ public String toString()
+ {
+ return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
+ .append("participantName", getParticipantName())
+ .append("client", _client)
+ .toString();
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutorRegistry.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutorRegistry.java
new file mode 100644
index 0000000000..3d9780e640
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutorRegistry.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public class ParticipantExecutorRegistry
+{
+ private final Set<ParticipantExecutor> _participantExecutors = Collections.synchronizedSet(new HashSet<ParticipantExecutor>());
+
+ public void add(ParticipantExecutor participantExecutor)
+ {
+ _participantExecutors.add(participantExecutor);
+ }
+
+ public void clear()
+ {
+ _participantExecutors.clear();
+ }
+
+ public Collection<ParticipantExecutor> executors()
+ {
+ return Collections.unmodifiableSet(_participantExecutors);
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantResultFactory.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantResultFactory.java
new file mode 100644
index 0000000000..7f6b96b87c
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantResultFactory.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import java.util.Date;
+
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateParticpantCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+
+public class ParticipantResultFactory
+{
+ public ConsumerParticipantResult createForConsumer(String participantName, String clientRegisteredName, CreateConsumerCommand command, int acknowledgeMode, int numberOfMessagesReceived, int payloadSize, long totalPayloadReceived, Date start, Date end)
+ {
+ ConsumerParticipantResult consumerParticipantResult = new ConsumerParticipantResult();
+
+ setTestProperties(consumerParticipantResult, command, participantName, clientRegisteredName, acknowledgeMode);
+ setTestResultProperties(consumerParticipantResult, numberOfMessagesReceived, payloadSize, totalPayloadReceived, start, end);
+
+ consumerParticipantResult.setTopic(command.isTopic());
+ consumerParticipantResult.setDurableSubscription(command.isDurableSubscription());
+ consumerParticipantResult.setBrowsingSubscription(command.isBrowsingSubscription());
+ consumerParticipantResult.setSelector(command.getSelector() != null);
+ consumerParticipantResult.setNoLocal(command.isNoLocal());
+ consumerParticipantResult.setSynchronousConsumer(command.isSynchronous());
+ consumerParticipantResult.setTotalNumberOfConsumers(1);
+ consumerParticipantResult.setTotalNumberOfProducers(0);
+
+ return consumerParticipantResult;
+ }
+
+ public ProducerParticipantResult createForProducer(String participantName, String clientRegisteredName, CreateProducerCommand command, int acknowledgeMode, int numberOfMessagesSent, int payloadSize, long totalPayloadSent, Date start, Date end)
+ {
+ final ProducerParticipantResult producerParticipantResult = new ProducerParticipantResult();
+
+ producerParticipantResult.setStartDelay(command.getStartDelay());
+ producerParticipantResult.setDeliveryMode(command.getDeliveryMode());
+ producerParticipantResult.setPriority(command.getPriority());
+ producerParticipantResult.setInterval(command.getInterval());
+ producerParticipantResult.setTimeToLive(command.getTimeToLive());
+ producerParticipantResult.setTotalNumberOfConsumers(0);
+ producerParticipantResult.setTotalNumberOfProducers(1);
+
+
+ setTestProperties(producerParticipantResult, command, participantName, clientRegisteredName, acknowledgeMode);
+
+ setTestResultProperties(producerParticipantResult, numberOfMessagesSent, payloadSize, totalPayloadSent, start, end);
+
+ return producerParticipantResult;
+ }
+
+ private void setTestResultProperties(final ParticipantResult participantResult, int numberOfMessagesSent, int payloadSize, long totalPayloadReceived, Date start, Date end)
+ {
+ participantResult.setNumberOfMessagesProcessed(numberOfMessagesSent);
+ participantResult.setPayloadSize(payloadSize);
+ participantResult.setTotalPayloadProcessed(totalPayloadReceived);
+ participantResult.setStartDate(start);
+ participantResult.setEndDate(end);
+ }
+
+ private void setTestProperties(final ParticipantResult participantResult, CreateParticpantCommand command, String participantName, String clientRegisteredName, int acknowledgeMode)
+ {
+ participantResult.setParticipantName(participantName);
+ participantResult.setRegisteredClientName(clientRegisteredName);
+ participantResult.setBatchSize(command.getBatchSize());
+ participantResult.setMaximumDuration(command.getMaximumDuration());
+ participantResult.setAcknowledgeMode(acknowledgeMode);
+
+ }
+
+ public ParticipantResult createForError(String participantName, String clientRegisteredName, String errorMessage)
+ {
+ ParticipantResult result = new ParticipantResult();
+ result.setParticipantName(participantName);
+ result.setRegisteredClientName(clientRegisteredName);
+ result.setErrorMessage(errorMessage);
+
+ return result;
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/ProducerParticipant.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ProducerParticipant.java
new file mode 100644
index 0000000000..bcad81b4aa
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/ProducerParticipant.java
@@ -0,0 +1,174 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import java.util.Date;
+import java.util.NavigableSet;
+import java.util.TreeSet;
+
+import javax.jms.Message;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ProducerParticipant implements Participant
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProducerParticipant.class);
+
+ private final ClientJmsDelegate _jmsDelegate;
+
+ private final CreateProducerCommand _command;
+
+ private ParticipantResultFactory _resultFactory;
+
+ public ProducerParticipant(final ClientJmsDelegate jmsDelegate, final CreateProducerCommand command)
+ {
+ _jmsDelegate = jmsDelegate;
+ _command = command;
+ _resultFactory = new ParticipantResultFactory();
+ }
+
+ @Override
+ public ParticipantResult doIt(String registeredClientName) throws Exception
+ {
+ if (_command.getMaximumDuration() == 0 && _command.getNumberOfMessages() == 0)
+ {
+ throw new DistributedTestException("number of messages and duration cannot both be zero");
+ }
+
+ int acknowledgeMode = _jmsDelegate.getAcknowledgeMode(_command.getSessionName());
+
+ long expectedDuration = _command.getMaximumDuration() - _command.getStartDelay();
+
+ doSleepForStartDelay();
+
+ final long startTime = System.currentTimeMillis();
+
+ Message lastPublishedMessage = null;
+ int numberOfMessagesSent = 0;
+ long totalPayloadSizeOfAllMessagesSent = 0;
+ NavigableSet<Integer> allProducedPayloadSizes = new TreeSet<Integer>();
+
+ while (true)
+ {
+ numberOfMessagesSent++;
+
+ lastPublishedMessage = _jmsDelegate.sendNextMessage(_command);
+
+ int lastPayloadSize = _jmsDelegate.calculatePayloadSizeFrom(lastPublishedMessage);
+ totalPayloadSizeOfAllMessagesSent += lastPayloadSize;
+ allProducedPayloadSizes.add(lastPayloadSize);
+
+ if (LOGGER.isTraceEnabled())
+ {
+ LOGGER.trace("message " + numberOfMessagesSent + " sent by " + this);
+ }
+
+ final boolean batchLimitReached = _command.getBatchSize() <= 0
+ || numberOfMessagesSent % _command.getBatchSize() == 0;
+
+ if (batchLimitReached)
+ {
+ if (LOGGER.isTraceEnabled() && _command.getBatchSize() > 0)
+ {
+ LOGGER.trace("Committing: batch size " + _command.getBatchSize() );
+ }
+ _jmsDelegate.commitOrAcknowledgeMessage(lastPublishedMessage, _command.getSessionName());
+
+ if (_command.getInterval() > 0)
+ {
+ // sleep for given time
+ Thread.sleep(_command.getInterval());
+ }
+ }
+
+ if (_command.getNumberOfMessages() > 0 && numberOfMessagesSent >= _command.getNumberOfMessages()
+ || expectedDuration > 0 && System.currentTimeMillis() - startTime >= expectedDuration)
+ {
+ break;
+ }
+ }
+
+ // commit the remaining batch messages
+ if (_command.getBatchSize() > 0 && numberOfMessagesSent % _command.getBatchSize() != 0)
+ {
+ if (LOGGER.isTraceEnabled())
+ {
+ LOGGER.trace("Committing: batch size " + _command.getBatchSize() );
+ }
+ _jmsDelegate.commitOrAcknowledgeMessage(lastPublishedMessage, _command.getSessionName());
+ }
+
+ Date start = new Date(startTime);
+ Date end = new Date();
+ int payloadSize = getPayloadSizeForResultIfConstantOrZeroOtherwise(allProducedPayloadSizes);
+
+ return _resultFactory.createForProducer(
+ getName(),
+ registeredClientName,
+ _command,
+ acknowledgeMode,
+ numberOfMessagesSent,
+ payloadSize, totalPayloadSizeOfAllMessagesSent, start, end);
+ }
+
+ private int getPayloadSizeForResultIfConstantOrZeroOtherwise(NavigableSet<Integer> allPayloadSizes)
+ {
+ return allPayloadSizes.size() == 1 ? allPayloadSizes.first() : 0;
+ }
+
+ private void doSleepForStartDelay()
+ {
+ if (_command.getStartDelay() > 0)
+ {
+ // start delay is specified. Sleeping...
+ try
+ {
+ Thread.sleep(_command.getStartDelay());
+ }
+ catch (final InterruptedException e)
+ {
+ Thread.currentThread().interrupt();
+ }
+ }
+ }
+
+ @Override
+ public void releaseResources()
+ {
+ _jmsDelegate.closeTestProducer(_command.getParticipantName());
+ }
+
+ @Override
+ public String getName()
+ {
+ return _command.getParticipantName();
+ }
+
+ @Override
+ public String toString()
+ {
+ return "ProducerParticipant [command=" + _command + "]";
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertySupport.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertySupport.java
new file mode 100644
index 0000000000..a49ebf756e
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertySupport.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+/**
+ * Provides support to generate message property values.
+ */
+public abstract class GeneratedPropertySupport implements GeneratedPropertyValue
+{
+ private Object _lastValue;
+
+ public GeneratedPropertySupport()
+ {
+ super();
+ _lastValue = null;
+ }
+
+ @Override
+ public Object getValue()
+ {
+ Object result = nextValue();
+ result = evaluate(result);
+ synchronized(this)
+ {
+ _lastValue = result;
+ }
+ return result;
+ }
+
+ protected Object evaluate(Object result)
+ {
+ while (result instanceof PropertyValue)
+ {
+ result = ((PropertyValue)result).getValue();
+ }
+ return result;
+ }
+
+ public abstract Object nextValue();
+
+ public synchronized Object getLastValue()
+ {
+ return _lastValue;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "GeneratedPropertyValue [value=" + getLastValue() + ", @def=" + getDefinition() + "]";
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertyValue.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertyValue.java
new file mode 100644
index 0000000000..39c093fac5
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertyValue.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+/**
+ * Provides operations to generate message property values.
+ */
+public interface GeneratedPropertyValue extends PropertyValue
+{
+ public String getDefinition();
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/ListPropertyValue.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/ListPropertyValue.java
new file mode 100644
index 0000000000..4444351976
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/ListPropertyValue.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Provides property values from the underlining list of items.
+ */
+public class ListPropertyValue extends GeneratedPropertySupport
+{
+ public static final String DEF_VALUE = "list";
+ private List<PropertyValue> _items;
+ private boolean _cyclic;
+ private int _currentIndex;
+
+ public ListPropertyValue()
+ {
+ super();
+ _cyclic = true;
+ _currentIndex = 0;
+ _items = new ArrayList<PropertyValue>();
+ }
+
+ public synchronized void setItems(List<PropertyValue> items)
+ {
+ _items = new ArrayList<PropertyValue>(items);
+ }
+
+ public synchronized List<PropertyValue> getItems()
+ {
+ return Collections.unmodifiableList(_items);
+ }
+
+ public synchronized void setCyclic(boolean cyclic)
+ {
+ _cyclic = cyclic;
+ }
+
+ public synchronized boolean isCyclic()
+ {
+ return _cyclic;
+ }
+
+ @Override
+ public synchronized Object nextValue()
+ {
+ if (_currentIndex >= _items.size())
+ {
+ if (_cyclic)
+ {
+ _currentIndex = 0;
+ }
+ else
+ {
+ _currentIndex = _items.size() -1;
+ }
+ }
+ Object nextValue = _items.get(_currentIndex);
+ _currentIndex++;
+ return nextValue;
+ }
+
+ @Override
+ public String getDefinition()
+ {
+ return DEF_VALUE;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + _currentIndex;
+ result = prime * result + (_cyclic ? 1231 : 1237);
+ result = prime * result + ((_items == null) ? 0 : _items.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null || !(obj instanceof ListPropertyValue))
+ {
+ return false;
+ }
+ ListPropertyValue other = (ListPropertyValue) obj;
+ if (_cyclic != other._cyclic)
+ {
+ return false;
+ }
+ if (_items == null && other._items != null)
+ {
+ return false;
+ }
+ return _items.equals(other._items);
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/NumericGeneratedPropertySupport.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/NumericGeneratedPropertySupport.java
new file mode 100644
index 0000000000..e0ae137c35
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/NumericGeneratedPropertySupport.java
@@ -0,0 +1,179 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import java.util.Arrays;
+
+/**
+ * Provides support for numeric generators with lower and upper boundaries.
+ */
+public abstract class NumericGeneratedPropertySupport extends GeneratedPropertySupport
+{
+ public static final Class<?>[] SUPPORTED_TYPES = { double.class, float.class, int.class, long.class, short.class,
+ byte.class };
+
+ private String _type;
+ private double _upper;
+ private double _lower;
+
+
+ public NumericGeneratedPropertySupport()
+ {
+ super();
+ _type = SUPPORTED_TYPES[0].getName();
+ _upper = Double.MAX_VALUE;
+ _lower = 0.0;
+ }
+
+ public synchronized String getType()
+ {
+ return _type;
+ }
+
+ public synchronized double getUpper()
+ {
+ return _upper;
+ }
+
+ public synchronized double getLower()
+ {
+ return _lower;
+ }
+
+ public synchronized void setUpper(double upper)
+ {
+ _upper = upper;
+ }
+
+ public synchronized void setLower(double lower)
+ {
+ _lower = lower;
+ }
+
+ public synchronized void setType(String type)
+ {
+ _type = toClass(type).getName();
+ }
+
+ protected Class<?> toClass(String type)
+ {
+ Class<?> t = null;
+ for (int i = 0; i < SUPPORTED_TYPES.length; i++)
+ {
+ if (SUPPORTED_TYPES[i].getName().equals(type))
+ {
+ t = SUPPORTED_TYPES[i];
+ break;
+ }
+ }
+ if (t == null)
+ {
+ throw new IllegalArgumentException("Type " + type + " is not supported: "
+ + Arrays.toString(SUPPORTED_TYPES));
+ }
+ return t;
+ }
+
+ @Override
+ public Object nextValue()
+ {
+ double result = nextDouble();
+ return doubleToNumber(result, toClass(_type));
+ }
+
+ protected Number doubleToNumber(double value, Class<?> targetType)
+ {
+ Number result = null;
+ if (targetType == double.class)
+ {
+ result = new Double(value);
+ }
+ else if (targetType == float.class)
+ {
+ result = new Float(value);
+ }
+ else if (targetType == int.class)
+ {
+ result = new Integer((int) value);
+ }
+ else if (targetType == long.class)
+ {
+ result = new Long((long) value);
+ }
+ else if (targetType == short.class)
+ {
+ result = new Short((short) value);
+ }
+ else if (targetType == byte.class)
+ {
+ result = new Byte((byte) value);
+ }
+ else
+ {
+ throw new IllegalArgumentException("Type " + targetType + " is not supported: "
+ + Arrays.toString(SUPPORTED_TYPES));
+ }
+ return result;
+ }
+
+ protected abstract double nextDouble();
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = super.hashCode();
+ long temp;
+ temp = Double.doubleToLongBits(_lower);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ result = prime * result + ((_type == null) ? 0 : _type.hashCode());
+ temp = Double.doubleToLongBits(_upper);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null || !(obj instanceof NumericGeneratedPropertySupport))
+ {
+ return false;
+ }
+ NumericGeneratedPropertySupport other = (NumericGeneratedPropertySupport) obj;
+ if (Double.doubleToLongBits(_lower) != Double.doubleToLongBits(other._lower)
+ || Double.doubleToLongBits(_upper) != Double.doubleToLongBits(other._upper))
+ {
+ return false;
+ }
+ if (_type == null && other._type != null)
+ {
+ return false;
+ }
+ else if (!_type.equals(other._type))
+ {
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValue.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValue.java
new file mode 100644
index 0000000000..97adc0cee1
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValue.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+/**
+ * Provides operations to get a message property value.
+ */
+public interface PropertyValue
+{
+ public Object getValue();
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValueFactory.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValueFactory.java
new file mode 100644
index 0000000000..fa44b2da1e
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValueFactory.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.qpid.disttest.DistributedTestException;
+
+/**
+ * Creates property value instances using given alias (type) value.
+ */
+public class PropertyValueFactory
+{
+ public PropertyValue createPropertyValue(String type)
+ {
+ try
+ {
+ return (PropertyValue)getPropertyValueClass(type).newInstance();
+ }
+ catch(Exception e)
+ {
+ throw new DistributedTestException("Unable to create a generator for a type:" + type, e);
+ }
+ }
+
+ public Class<?> getPropertyValueClass(String type) throws ClassNotFoundException
+ {
+ String className = "org.apache.qpid.disttest.client.property." + StringUtils.capitalize(type) + "PropertyValue";
+ return Class.forName(className);
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RandomPropertyValue.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RandomPropertyValue.java
new file mode 100644
index 0000000000..4f44a4bca8
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RandomPropertyValue.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+/**
+ * Generates random property values in a given lower and upper boundaries.
+ */
+public class RandomPropertyValue extends NumericGeneratedPropertySupport
+{
+ public static final String DEF_VALUE = "random";
+
+ public RandomPropertyValue()
+ {
+ super();
+ }
+
+ @Override
+ protected double nextDouble()
+ {
+ double lower = getLower();
+ double upper = getUpper();
+ return lower + Math.random() * (upper - lower);
+ }
+
+ @Override
+ public String getDefinition()
+ {
+ return DEF_VALUE;
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RangePropertyValue.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RangePropertyValue.java
new file mode 100644
index 0000000000..3aca4d4bca
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RangePropertyValue.java
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+/**
+ * Generates property values from a range with given lower and upper boundaries.
+ */
+public class RangePropertyValue extends NumericGeneratedPropertySupport
+{
+ public static final String DEF_VALUE = "range";
+ private double _step;
+ private double _currentValue;
+ private boolean _cyclic;
+
+ public RangePropertyValue()
+ {
+ super();
+ _cyclic = true;
+ _currentValue = 0.0;
+ _step = 1.0;
+ }
+
+ public synchronized double getStep()
+ {
+ return _step;
+ }
+
+ public synchronized boolean isCyclic()
+ {
+ return _cyclic;
+ }
+
+ public synchronized void setCyclic(boolean cyclic)
+ {
+ _cyclic = cyclic;
+ }
+
+ public synchronized void setStep(double step)
+ {
+ _step = step;
+ }
+
+ @Override
+ public synchronized double nextDouble()
+ {
+ double result = 0.0;
+ double lower = getLower();
+ double upper = getUpper();
+ if (_currentValue < lower)
+ {
+ _currentValue = lower;
+ }
+ else if (_currentValue > upper)
+ {
+ if (_cyclic)
+ {
+ _currentValue = lower;
+ }
+ else
+ {
+ _currentValue = upper;
+ }
+ }
+ result = _currentValue;
+ _currentValue += _step;
+ return result;
+ }
+
+ @Override
+ public String getDefinition()
+ {
+ return DEF_VALUE;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = super.hashCode();
+ long temp;
+ temp = Double.doubleToLongBits(_currentValue);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ result = prime * result + (_cyclic ? 1231 : 1237);
+ temp = Double.doubleToLongBits(_step);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (!(obj instanceof RangePropertyValue))
+ {
+ return false;
+ }
+ if (!super.equals(obj))
+ {
+ return false;
+ }
+ RangePropertyValue other = (RangePropertyValue) obj;
+ if (Double.doubleToLongBits(_currentValue) != Double.doubleToLongBits(other._currentValue)
+ || Double.doubleToLongBits(_step) != Double.doubleToLongBits(other._step) || _cyclic != other._cyclic)
+ {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/SimplePropertyValue.java b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/SimplePropertyValue.java
new file mode 100644
index 0000000000..9141e68656
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/SimplePropertyValue.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+/**
+ * Simple property value holder for a constant properties.
+ */
+public class SimplePropertyValue implements PropertyValue
+{
+ private Object _value;
+
+ public SimplePropertyValue()
+ {
+ super();
+ }
+
+ public SimplePropertyValue(Object value)
+ {
+ super();
+ this._value = value;
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return _value;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "SimplePropertyValue [value=" + _value + "]";
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((_value == null) ? 0 : _value.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass())
+ {
+ return false;
+ }
+ SimplePropertyValue other = (SimplePropertyValue) obj;
+ if (_value == null && other._value != null)
+ {
+ return false;
+ }
+ return _value.equals(other._value);
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ClientRegistry.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ClientRegistry.java
new file mode 100644
index 0000000000..eaccb54f0e
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ClientRegistry.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.ConcurrentSkipListSet;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ClientRegistry
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ClientRegistry.class);
+
+ private final Set<String> _registeredClientNames = new ConcurrentSkipListSet<String>();
+
+ private final Object _lock = new Object();
+
+ public void registerClient(String clientName)
+ {
+ final boolean alreadyContainsClient = !_registeredClientNames.add(clientName);
+ if (alreadyContainsClient)
+ {
+ throw new DistributedTestException("Duplicate client name " + clientName);
+ }
+
+ notifyAllWaiters();
+
+ if (LOGGER.isInfoEnabled())
+ {
+ LOGGER.info("Client registered: " + clientName);
+ }
+ }
+
+
+ public Collection<String> getClients()
+ {
+ return Collections.unmodifiableSet(_registeredClientNames);
+ }
+
+ public int awaitClients(int numberOfClientsToAwait, long timeout)
+ {
+ final long endTime = System.currentTimeMillis() + timeout;
+
+ int numberOfClientsAbsent = numberOfClientsToAwait - _registeredClientNames.size();
+ long remainingTimeout = endTime - System.currentTimeMillis();
+
+ while(numberOfClientsAbsent > 0 && remainingTimeout > 0)
+ {
+ synchronized (_lock)
+ {
+ try
+ {
+ _lock.wait(remainingTimeout);
+ }
+ catch (InterruptedException e)
+ {
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ numberOfClientsAbsent = numberOfClientsToAwait - _registeredClientNames.size();
+ remainingTimeout = endTime - System.currentTimeMillis();
+ }
+
+ return numberOfClientsAbsent < 0 ? 0 : numberOfClientsAbsent;
+ }
+
+ private void notifyAllWaiters()
+ {
+ synchronized (_lock)
+ {
+ _lock.notifyAll();
+ }
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandForClient.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandForClient.java
new file mode 100644
index 0000000000..6c0c253807
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandForClient.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller;
+
+import org.apache.qpid.disttest.message.Command;
+
+public class CommandForClient
+{
+ private String _clientName;
+ private Command _command;
+
+ public CommandForClient(String clientName, Command command)
+ {
+ _clientName = clientName;
+ _command = command;
+ }
+
+ public String getClientName()
+ {
+ return _clientName;
+ }
+
+ public Command getCommand()
+ {
+ return _command;
+ }
+
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandListener.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandListener.java
new file mode 100644
index 0000000000..e2f40bebe8
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandListener.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller;
+
+import org.apache.qpid.disttest.message.Command;
+
+public interface CommandListener
+{
+
+ public abstract void processCommand(Command command);
+
+ public boolean supports(Command command);
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/Controller.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/Controller.java
new file mode 100644
index 0000000000..7c935065f0
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/Controller.java
@@ -0,0 +1,228 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.Collection;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.config.Config;
+import org.apache.qpid.disttest.controller.config.TestInstance;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Controller
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(Controller.class);
+
+ private final long _registrationTimeout;
+ private final long _commandResponseTimeout;
+
+ private final ControllerJmsDelegate _jmsDelegate;
+
+ private volatile CountDownLatch _stopClientsResponseLatch = null;
+
+ private Config _config;
+ private TestRunnerFactory _testRunnerFactory;
+ private ClientRegistry _clientRegistry;
+
+ private long _testResultTimeout = TestRunner.WAIT_FOREVER;
+
+ public Controller(final ControllerJmsDelegate jmsDelegate, long registrationTimeout, long commandResponseTimeout)
+ {
+ _jmsDelegate = jmsDelegate;
+ _registrationTimeout = registrationTimeout;
+ _commandResponseTimeout = commandResponseTimeout;
+ _testRunnerFactory = new TestRunnerFactory();
+ _clientRegistry = new ClientRegistry();
+
+ _jmsDelegate.addCommandListener(new RegisterClientCommandListener());
+ _jmsDelegate.addCommandListener(new StopClientResponseListener());
+ _jmsDelegate.start();
+ }
+
+ public void setConfig(Config config)
+ {
+ _config = config;
+ validateConfiguration();
+ }
+
+ public void awaitClientRegistrations()
+ {
+ LOGGER.info("Awaiting client registrations");
+
+ final int numberOfAbsentClients = _clientRegistry.awaitClients(_config.getTotalNumberOfClients(), _registrationTimeout);
+ if (numberOfAbsentClients > 0)
+ {
+ String formattedMessage = String.format("Timed out waiting for registrations. Expecting %d more registrations", numberOfAbsentClients);
+ throw new DistributedTestException(formattedMessage);
+ }
+
+ }
+
+ private void validateConfiguration()
+ {
+ if (_config == null || _config.getTotalNumberOfClients() == 0)
+ {
+ throw new DistributedTestException("No controller config or no clients specified in test config");
+ }
+ }
+
+ private void awaitLatch(CountDownLatch latch, long timeout, String messageWithOneDecimalPlaceholder)
+ {
+ try
+ {
+ final boolean countedDownOK = latch.await(timeout, TimeUnit.MILLISECONDS);
+ if (!countedDownOK)
+ {
+ final long latchCount = latch.getCount();
+ String formattedMessage = String.format(messageWithOneDecimalPlaceholder, latchCount);
+ throw new DistributedTestException(formattedMessage);
+ }
+ }
+ catch (final InterruptedException e)
+ {
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ public void registerClient(final RegisterClientCommand registrationCommand)
+ {
+ final String clientName = registrationCommand.getClientName();
+
+ _jmsDelegate.registerClient(registrationCommand);
+ _clientRegistry.registerClient(clientName);
+ }
+
+ void processStopClientResponse(final Response response)
+ {
+ // TODO clientRegistry should expose a deregisterClient
+ _stopClientsResponseLatch.countDown();
+ if (response.hasError())
+ {
+ LOGGER.error("Client " + response.getRegisteredClientName() + " reported exception in response to command : " +
+ response.getErrorMessage());
+ }
+ }
+
+ public void stopAllRegisteredClients()
+ {
+ Collection<String> registeredClients = _clientRegistry.getClients();
+
+ LOGGER.info("Stopping all clients");
+ _stopClientsResponseLatch = new CountDownLatch(registeredClients.size());
+ Command command = new StopClientCommand();
+ for (final String clientName : registeredClients)
+ {
+ _jmsDelegate.sendCommandToClient(clientName, command);
+ }
+
+ awaitLatch(_stopClientsResponseLatch, _commandResponseTimeout, "Timed out waiting for stop command responses. Expecting %d more responses.");
+
+ LOGGER.info("Stopped all clients");
+ }
+
+
+ public ResultsForAllTests runAllTests()
+ {
+ LOGGER.info("Running all tests");
+
+ ResultsForAllTests resultsForAllTests = new ResultsForAllTests();
+
+ for (TestInstance testInstance : _config.getTests())
+ {
+
+ ParticipatingClients participatingClients = new ParticipatingClients(_clientRegistry, testInstance.getClientNames());
+
+ LOGGER.info("Running test " + testInstance + ". Participating clients: " + participatingClients.getRegisteredNames());
+ TestRunner runner = _testRunnerFactory.createTestRunner(participatingClients,
+ testInstance,
+ _jmsDelegate,
+ _commandResponseTimeout,
+ _testResultTimeout);
+
+ TestResult testResult = runner.run();
+ LOGGER.info("Finished test " + testInstance);
+
+ resultsForAllTests.add(testResult);
+ }
+
+ return resultsForAllTests;
+ }
+
+ private final class StopClientResponseListener implements CommandListener
+ {
+ @Override
+ public boolean supports(Command command)
+ {
+ return command.getType() == CommandType.RESPONSE && ((Response)command).getInReplyToCommandType() == CommandType.STOP_CLIENT;
+ }
+
+ @Override
+ public void processCommand(Command command)
+ {
+ processStopClientResponse((Response)command);
+ }
+ }
+
+ private final class RegisterClientCommandListener implements
+ CommandListener
+ {
+ @Override
+ public boolean supports(Command command)
+ {
+ return command.getType() == CommandType.REGISTER_CLIENT;
+ }
+
+ @Override
+ public void processCommand(Command command)
+ {
+ registerClient((RegisterClientCommand)command);
+ }
+ }
+
+ public void setTestResultTimeout(final long testResultTimeout)
+ {
+ _testResultTimeout = testResultTimeout;
+
+ }
+
+ void setClientRegistry(ClientRegistry clientRegistry)
+ {
+ _clientRegistry = clientRegistry;
+
+ }
+
+ void setTestRunnerFactory(TestRunnerFactory factory)
+ {
+ if (factory == null)
+ {
+ throw new IllegalArgumentException("TestRunnerFactory cannot be null!");
+ }
+ _testRunnerFactory = factory;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ParticipatingClients.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ParticipatingClients.java
new file mode 100644
index 0000000000..077d628697
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ParticipatingClients.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.TreeSet;
+
+import org.apache.commons.collections.BidiMap;
+import org.apache.commons.collections.bidimap.DualHashBidiMap;
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+
+public class ParticipatingClients
+{
+ private final BidiMap _configuredToRegisteredNameMap;
+
+ public ParticipatingClients(ClientRegistry clientRegistry, List<String> configuredClientNamesForTest)
+ {
+ _configuredToRegisteredNameMap = mapConfiguredToRegisteredClientNames(configuredClientNamesForTest, clientRegistry);
+ }
+
+ public String getRegisteredNameFromConfiguredName(String clientConfiguredName)
+ {
+ String registeredClientName = (String) _configuredToRegisteredNameMap.get(clientConfiguredName);
+ if (registeredClientName == null)
+ {
+ throw new IllegalArgumentException("Unrecognised client configured name " + clientConfiguredName
+ + " Mapping is " + _configuredToRegisteredNameMap);
+ }
+ return registeredClientName;
+ }
+
+ public String getConfiguredNameFromRegisteredName(String registeredClientName)
+ {
+ String clientConfiguredName = (String) _configuredToRegisteredNameMap.getKey(registeredClientName);
+ if (clientConfiguredName == null)
+ {
+ throw new IllegalArgumentException("Unrecognised client registered name " + registeredClientName
+ + " Mapping is " + _configuredToRegisteredNameMap);
+ }
+
+ return clientConfiguredName;
+ }
+
+ private BidiMap mapConfiguredToRegisteredClientNames(List<String> configuredClientNamesForTest, ClientRegistry clientRegistry)
+ {
+ BidiMap configuredToRegisteredNameMap = new DualHashBidiMap();
+
+ TreeSet<String> registeredClients = new TreeSet<String>(clientRegistry.getClients());
+ for (String configuredClientName : configuredClientNamesForTest)
+ {
+ String allocatedClientName = registeredClients.pollFirst();
+ if (allocatedClientName == null)
+ {
+ throw new IllegalArgumentException("Too few clients in registry " + clientRegistry + " configured clients " + configuredClientNamesForTest);
+ }
+ configuredToRegisteredNameMap.put(configuredClientName, allocatedClientName);
+ }
+
+ return configuredToRegisteredNameMap;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Collection<String> getRegisteredNames()
+ {
+ return _configuredToRegisteredNameMap.values();
+ }
+
+ @Override
+ public String toString()
+ {
+ return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
+ .append("configuredToRegisteredNameMap", _configuredToRegisteredNameMap).toString();
+ }
+
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ResultsForAllTests.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ResultsForAllTests.java
new file mode 100644
index 0000000000..6c5ff3450c
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ResultsForAllTests.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.qpid.disttest.results.aggregation.ITestResult;
+
+public class ResultsForAllTests
+{
+ private List<ITestResult> _results = new ArrayList<ITestResult>();
+ private boolean _hasErrors;
+
+ public List<ITestResult> getTestResults()
+ {
+ return _results;
+ }
+
+ public void add(ITestResult testResult)
+ {
+ _results.add(testResult);
+ if(testResult.hasErrors())
+ {
+ _hasErrors = true;
+ }
+ }
+
+ public boolean hasErrors()
+ {
+ return _hasErrors;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestResult.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestResult.java
new file mode 100644
index 0000000000..756c641532
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestResult.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.ITestResult;
+
+public class TestResult implements ITestResult
+{
+ private final SortedSet<ParticipantResult> _participantResults = Collections.synchronizedSortedSet(
+ new TreeSet<ParticipantResult>(ParticipantResult.PARTICIPANT_NAME_COMPARATOR));
+
+ private boolean _hasErrors;
+ private String _name;
+
+ public TestResult(String name)
+ {
+ _name = name;
+ }
+
+ @Override
+ public List<ParticipantResult> getParticipantResults()
+ {
+ List<ParticipantResult> list = new ArrayList<ParticipantResult>(_participantResults);
+ return Collections.unmodifiableList(list);
+ }
+
+ public void addParticipantResult(ParticipantResult participantResult)
+ {
+ _participantResults.add(participantResult);
+ if(participantResult.hasError())
+ {
+ _hasErrors = true;
+ }
+ }
+
+ @Override
+ public boolean hasErrors()
+ {
+ return _hasErrors;
+ }
+
+ @Override
+ public String getName()
+ {
+ return _name;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunner.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunner.java
new file mode 100644
index 0000000000..30595269b3
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunner.java
@@ -0,0 +1,342 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.config.QueueConfig;
+import org.apache.qpid.disttest.controller.config.TestInstance;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StartTestCommand;
+import org.apache.qpid.disttest.message.TearDownTestCommand;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TestRunner
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(TestRunner.class);
+
+ private static final long PARTICIPANT_RESULTS_LOG_INTERVAL = 60000;
+ public static final long WAIT_FOREVER = -1;
+
+ private final long _commandResponseTimeout;
+
+ private final Set<CommandType> _setOfResponsesToExpect = Collections.synchronizedSet(new HashSet<CommandType>());
+
+ private final ParticipatingClients _participatingClients;
+
+ private final TestInstance _testInstance;
+ private ControllerJmsDelegate _jmsDelegate;
+
+ private volatile CountDownLatch _commandResponseLatch = null;
+ private final CountDownLatch _testResultsLatch;
+ private final TestResult _testResult;
+
+ /** Length of time to await test results or {@value #WAIT_FOREVER} */
+ private final long _testResultTimeout;
+
+ private Thread _removeQueuesShutdownHook = new Thread()
+ {
+ @Override
+ public void run()
+ {
+ LOGGER.info("Shutdown intercepted: deleting test queues");
+ try
+ {
+ deleteQueues();
+ }
+ catch (Throwable t)
+ {
+ LOGGER.error("Failed to delete test queues during shutdown", t);
+ }
+ }
+ };
+
+ public TestRunner(ParticipatingClients participatingClients, TestInstance testInstance, ControllerJmsDelegate jmsDelegate, long commandResponseTimeout, long testResultTimeout)
+ {
+ _participatingClients = participatingClients;
+ _testInstance = testInstance;
+ _jmsDelegate = jmsDelegate;
+ _commandResponseTimeout = commandResponseTimeout;
+ _testResultsLatch = new CountDownLatch(testInstance.getTotalNumberOfParticipants());
+ _testResultTimeout = testResultTimeout;
+ _testResult = new TestResult(testInstance.getName());
+ }
+
+ public TestResult run()
+ {
+ final ParticipantResultListener participantResultListener = new ParticipantResultListener();
+ TestCommandResponseListener testCommandResponseListener = new TestCommandResponseListener();
+
+ try
+ {
+ _jmsDelegate.addCommandListener(testCommandResponseListener);
+ _jmsDelegate.addCommandListener(participantResultListener);
+
+ runParts();
+
+ return _testResult;
+ }
+ finally
+ {
+ _jmsDelegate.removeCommandListener(participantResultListener);
+ _jmsDelegate.removeCommandListener(testCommandResponseListener);
+ }
+ }
+
+ private void runParts()
+ {
+ boolean queuesCreated = false;
+
+ try
+ {
+ createQueues();
+ queuesCreated = true;
+ Runtime.getRuntime().addShutdownHook(_removeQueuesShutdownHook);
+
+ sendTestSetupCommands();
+ awaitCommandResponses();
+ sendCommandToParticipatingClients(new StartTestCommand());
+ awaitCommandResponses();
+
+ awaitTestResults();
+
+ sendCommandToParticipatingClients(new TearDownTestCommand());
+ awaitCommandResponses();
+ }
+ finally
+ {
+
+ if (queuesCreated)
+ {
+ deleteQueues();
+ }
+
+ Runtime.getRuntime().removeShutdownHook(_removeQueuesShutdownHook);
+
+ }
+ }
+
+ void createQueues()
+ {
+ List<QueueConfig> queues = _testInstance.getQueues();
+ if (!queues.isEmpty())
+ {
+ _jmsDelegate.createQueues(queues);
+ }
+ }
+
+ void sendTestSetupCommands()
+ {
+ List<CommandForClient> commandsForAllClients = _testInstance.createCommands();
+ final int numberOfCommandsToSend = commandsForAllClients.size();
+ _commandResponseLatch = new CountDownLatch(numberOfCommandsToSend);
+
+ LOGGER.debug("About to send {} command(s)", numberOfCommandsToSend);
+
+ for (CommandForClient commandForClient : commandsForAllClients)
+ {
+ String configuredClientName = commandForClient.getClientName();
+ String registeredClientName = _participatingClients.getRegisteredNameFromConfiguredName(configuredClientName);
+
+ Command command = commandForClient.getCommand();
+
+ LOGGER.debug("Sending command : {} ", command);
+
+ sendCommandInternal(registeredClientName, command);
+ }
+ }
+
+ void awaitCommandResponses()
+ {
+ awaitLatch(_commandResponseLatch, _commandResponseTimeout, "Timed out waiting for command responses. Expecting %d more responses.");
+ }
+
+
+ void processCommandResponse(final Response response)
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Received response for command " + response);
+ }
+
+ _commandResponseLatch.countDown();
+ checkForResponseError(response);
+ }
+
+
+ void awaitTestResults()
+ {
+ long timeout = _testResultTimeout;
+ DistributedTestException lastException = null;
+
+ boolean waitForever = _testResultTimeout == WAIT_FOREVER;
+ final long interval = waitForever ? PARTICIPANT_RESULTS_LOG_INTERVAL : Math.min(PARTICIPANT_RESULTS_LOG_INTERVAL, _testResultTimeout);
+
+ while(_testResultsLatch.getCount() > 0 && (waitForever || timeout > 0))
+ {
+ try
+ {
+ awaitLatch(_testResultsLatch, interval, "Waiting for participant results... Expecting %d more responses.");
+ }
+ catch (DistributedTestException e)
+ {
+ lastException = e;
+ LOGGER.info(e.getMessage());
+ }
+
+ if (!waitForever)
+ {
+ timeout =- interval;
+ }
+ }
+
+ if (_testResultsLatch.getCount() > 0)
+ {
+ throw lastException;
+ }
+ }
+
+ void deleteQueues()
+ {
+ List<QueueConfig> queues = _testInstance.getQueues();
+ if (!queues.isEmpty())
+ {
+ _jmsDelegate.deleteQueues(queues);
+ }
+ }
+
+ void sendCommandToParticipatingClients(final Command command)
+ {
+ Collection<String> participatingRegisteredClients = _participatingClients.getRegisteredNames();
+ final int numberOfClients = participatingRegisteredClients.size();
+ _commandResponseLatch = new CountDownLatch(numberOfClients);
+
+ LOGGER.debug("About to send command {} to {} clients", command, numberOfClients);
+
+ for (final String clientName : participatingRegisteredClients)
+ {
+ LOGGER.debug("Sending command : {} ", command);
+ sendCommandInternal(clientName, command);
+ }
+ }
+
+ public void processParticipantResult(ParticipantResult result)
+ {
+ setOriginalTestDetailsOn(result);
+
+ _testResult.addParticipantResult(result);
+ LOGGER.info("Received result " + result);
+
+ _testResultsLatch.countDown();
+ checkForResponseError(result);
+ }
+
+ private void setOriginalTestDetailsOn(ParticipantResult result)
+ {
+ // Client knows neither the configured client name nor test name
+ String registeredClientName = result.getRegisteredClientName();
+ String configuredClient = _participatingClients.getConfiguredNameFromRegisteredName(registeredClientName);
+
+ result.setConfiguredClientName(configuredClient);
+ result.setTestName(_testInstance.getName());
+ result.setIterationNumber(_testInstance.getIterationNumber());
+ }
+
+ private void sendCommandInternal(String registeredClientName, Command command)
+ {
+ _setOfResponsesToExpect.add(command.getType());
+ _jmsDelegate.sendCommandToClient(registeredClientName, command);
+ }
+
+ private void awaitLatch(CountDownLatch latch, long timeout, String messageWithOneDecimalPlaceholder)
+ {
+ try
+ {
+ final boolean countedDownOK = latch.await(timeout, TimeUnit.MILLISECONDS);
+ if (!countedDownOK)
+ {
+ final long latchCount = latch.getCount();
+ String formattedMessage = String.format(messageWithOneDecimalPlaceholder, latchCount);
+ throw new DistributedTestException(formattedMessage);
+ }
+ }
+ catch (final InterruptedException e)
+ {
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ private void checkForResponseError(final Response response)
+ {
+ if (response.hasError())
+ {
+ LOGGER.error("Client " + response.getRegisteredClientName() + " reported error " + response);
+ }
+ }
+
+ final class ParticipantResultListener implements CommandListener
+ {
+ @Override
+ public boolean supports(Command command)
+ {
+ return command instanceof ParticipantResult;
+ }
+
+ @Override
+ public void processCommand(Command command)
+ {
+ processParticipantResult((ParticipantResult) command);
+
+ }
+ }
+
+ final class TestCommandResponseListener implements CommandListener
+ {
+ @Override
+ public void processCommand(Command command)
+ {
+ processCommandResponse((Response)command);
+ }
+
+ @Override
+ public boolean supports(Command command)
+ {
+ CommandType type = command.getType();
+ if (type == CommandType.RESPONSE)
+ {
+ Response response = (Response)command;
+ return _setOfResponsesToExpect.contains(response.getInReplyToCommandType());
+ }
+ return false;
+ }
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunnerFactory.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunnerFactory.java
new file mode 100644
index 0000000000..bf0e5afb9c
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunnerFactory.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller;
+
+import org.apache.qpid.disttest.controller.config.TestInstance;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+
+public class TestRunnerFactory
+{
+ public TestRunner createTestRunner(ParticipatingClients participatingClients, TestInstance testInstance, ControllerJmsDelegate jmsDelegate, long commandResponseTimeout, long testResultTimeout)
+ {
+ return new TestRunner(participatingClients, testInstance, jmsDelegate, commandResponseTimeout, testResultTimeout);
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ClientConfig.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ClientConfig.java
new file mode 100644
index 0000000000..4353a85cd3
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ClientConfig.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.qpid.disttest.controller.CommandForClient;
+import org.apache.qpid.disttest.message.Command;
+
+public class ClientConfig
+{
+ /*
+ * TODO add this field when repeating groups of clients need to be used. Talk to Phil and Keith!
+ * private int _instances;
+ */
+
+ private List<ConnectionConfig> _connections;
+ private List<MessageProviderConfig> _messageProviders;
+ private String _name;
+
+ public ClientConfig()
+ {
+ _name = null;
+ _connections = Collections.emptyList();
+ _messageProviders = Collections.emptyList();
+ }
+
+ public ClientConfig(String name, ConnectionConfig... connections)
+ {
+ this(name, Arrays.asList(connections), null);
+ }
+
+ public ClientConfig(String name, List<ConnectionConfig> connections, List<MessageProviderConfig> messageProviders)
+ {
+ _name = name;
+ _connections = connections;
+ if (messageProviders == null)
+ {
+ _messageProviders = Collections.emptyList();
+ }
+ else
+ {
+ _messageProviders = messageProviders;
+ }
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public List<ConnectionConfig> getConnections()
+ {
+ return Collections.unmodifiableList(_connections);
+ }
+
+ public List<CommandForClient> createCommands()
+ {
+ List<CommandForClient> commandsForClient = new ArrayList<CommandForClient>();
+
+ for (MessageProviderConfig messageProvider : _messageProviders)
+ {
+ Command command = messageProvider.createCommand();
+ commandsForClient.add(new CommandForClient(_name, command));
+ }
+ for (ConnectionConfig connection : _connections)
+ {
+ List<Command> commands = connection.createCommands();
+ for (Command command : commands)
+ {
+ commandsForClient.add(new CommandForClient(_name, command));
+ }
+ }
+ return commandsForClient;
+ }
+
+ public int getTotalNumberOfParticipants()
+ {
+ int numOfParticipants = 0;
+ for (ConnectionConfig connection : _connections)
+ {
+ numOfParticipants = numOfParticipants + connection.getTotalNumberOfParticipants();
+ }
+ return numOfParticipants;
+ }
+
+ public List<MessageProviderConfig> getMessageProviders()
+ {
+ return Collections.unmodifiableList(_messageProviders);
+ }
+
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/Config.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/Config.java
new file mode 100644
index 0000000000..fe56137276
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/Config.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class Config
+{
+ private List<TestConfig> _tests;
+
+ public Config()
+ {
+ super();
+ _tests = Collections.emptyList();
+ }
+
+ public Config(TestConfig... tests)
+ {
+ _tests = Arrays.asList(tests);
+ }
+
+ public List<TestInstance> getTests()
+ {
+ List<TestInstance> testInstances = new ArrayList<TestInstance>();
+ for (TestConfig testConfig : _tests)
+ {
+ int iterationNumber = 0;
+
+ List<IterationValue> iterationValues = testConfig.getIterationValues();
+ if(iterationValues.isEmpty())
+ {
+ testInstances.add(new TestInstance(testConfig));
+ }
+ else
+ {
+ for (IterationValue iterationValue : iterationValues)
+ {
+ testInstances.add(new TestInstance(testConfig, iterationNumber, iterationValue));
+ iterationNumber++;
+ }
+ }
+ }
+
+ return Collections.unmodifiableList(testInstances);
+ }
+
+ List<TestConfig> getTestConfigs()
+ {
+ return Collections.unmodifiableList(_tests);
+ }
+
+ public int getTotalNumberOfClients()
+ {
+ int numberOfClients = 0;
+ for (TestConfig testConfig : _tests)
+ {
+ numberOfClients = Math.max(testConfig.getTotalNumberOfClients(), numberOfClients);
+ }
+ return numberOfClients;
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConfigReader.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConfigReader.java
new file mode 100644
index 0000000000..6288b42eac
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConfigReader.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.Reader;
+
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.json.PropertyValueAdapter;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+public class ConfigReader
+{
+
+ public Config getConfigFromFile(String fileName) throws FileNotFoundException
+ {
+ FileReader reader = new FileReader(fileName);
+
+ Config config = readConfig(reader);
+ return config;
+ }
+
+ public Config readConfig(Reader reader)
+ {
+ Gson gson = new GsonBuilder()
+ .registerTypeAdapter(PropertyValue.class, new PropertyValueAdapter())
+ .create();
+ Config config = gson.fromJson(reader, Config.class);
+ return config;
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConnectionConfig.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConnectionConfig.java
new file mode 100644
index 0000000000..e2cc31e21e
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConnectionConfig.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+
+public class ConnectionConfig
+{
+ private String _name;
+ private List<SessionConfig> _sessions;
+ private String _factory;
+
+ // For Gson
+ public ConnectionConfig()
+ {
+ super();
+ _sessions = Collections.emptyList();
+ }
+
+ public ConnectionConfig(String name, String factory, SessionConfig... sessions)
+ {
+ super();
+ _name = name;
+ _factory = factory;
+ _sessions = Arrays.asList(sessions);
+
+ }
+
+ public List<SessionConfig> getSessions()
+ {
+ return Collections.unmodifiableList(_sessions);
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public List<Command> createCommands()
+ {
+ List<Command> commands = new ArrayList<Command>();
+ commands.add(createCommand());
+ for (SessionConfig sessionConfig : _sessions)
+ {
+ commands.addAll(sessionConfig.createCommands(_name));
+ }
+ return commands;
+ }
+
+ private CreateConnectionCommand createCommand()
+ {
+ CreateConnectionCommand command = new CreateConnectionCommand();
+ command.setConnectionName(_name);
+ command.setConnectionFactoryName(_factory);
+ return command;
+ }
+
+ public int getTotalNumberOfParticipants()
+ {
+ int numOfParticipants = 0;
+
+ for (SessionConfig sessionConfig : _sessions)
+ {
+ numOfParticipants = numOfParticipants + sessionConfig.getTotalNumberOfParticipants();
+ }
+ return numOfParticipants;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConsumerConfig.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConsumerConfig.java
new file mode 100644
index 0000000000..ed47e02667
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConsumerConfig.java
@@ -0,0 +1,65 @@
+package org.apache.qpid.disttest.controller.config;
+
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+
+public class ConsumerConfig extends ParticipantConfig
+{
+ private boolean _isTopic;
+ private boolean _isDurableSubscription;
+ private boolean _isBrowsingSubscription;
+ private String _selector;
+ private boolean _noLocal;
+ private boolean _synchronous;
+
+ // For Gson
+ public ConsumerConfig()
+ {
+ _isTopic = false;
+ _isDurableSubscription = false;
+ _isBrowsingSubscription = false;
+ _selector = null;
+ _noLocal = false;
+ _synchronous = true;
+ }
+
+ public ConsumerConfig(
+ String consumerName,
+ String destinationName,
+ long numberOfMessages,
+ int batchSize,
+ long maximumDuration,
+ boolean isTopic,
+ boolean isDurableSubscription,
+ boolean isBrowsingSubscription,
+ String selector,
+ boolean noLocal,
+ boolean synchronous)
+ {
+ super(consumerName, destinationName, numberOfMessages, batchSize, maximumDuration);
+
+ _isTopic = isTopic;
+ _isDurableSubscription = isDurableSubscription;
+ _isBrowsingSubscription = isBrowsingSubscription;
+ _selector = selector;
+ _noLocal = noLocal;
+ _synchronous = synchronous;
+ }
+
+ public CreateConsumerCommand createCommand(String sessionName)
+ {
+ CreateConsumerCommand createConsumerCommand = new CreateConsumerCommand();
+
+ setParticipantProperties(createConsumerCommand);
+
+ createConsumerCommand.setSessionName(sessionName);
+ createConsumerCommand.setTopic(_isTopic);
+ createConsumerCommand.setDurableSubscription(_isDurableSubscription);
+ createConsumerCommand.setBrowsingSubscription(_isBrowsingSubscription);
+ createConsumerCommand.setSelector(_selector);
+ createConsumerCommand.setNoLocal(_noLocal);
+ createConsumerCommand.setSynchronous(_synchronous);
+
+ return createConsumerCommand;
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/IterationValue.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/IterationValue.java
new file mode 100644
index 0000000000..ef953a5d07
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/IterationValue.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.beanutils.BeanUtilsBean;
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.apache.qpid.disttest.message.Command;
+
+public class IterationValue
+{
+ private final Map<String, String> _iterationPropertyValuesWithUnderscores;
+
+ public IterationValue(Map<String, String> iterationMap)
+ {
+ _iterationPropertyValuesWithUnderscores = iterationMap;
+ }
+
+ public IterationValue()
+ {
+ _iterationPropertyValuesWithUnderscores = Collections.emptyMap();
+ }
+
+ public Map<String, String> getIterationPropertyValuesWithUnderscores()
+ {
+ return _iterationPropertyValuesWithUnderscores;
+ }
+
+ public void applyToCommand(Command command)
+ {
+ try
+ {
+ Map<String, String> withoutUnderscoresToMatchCommandPropertyNames = getIterationPropertyValuesWithoutUnderscores();
+ BeanUtilsBean.getInstance().copyProperties(command, withoutUnderscoresToMatchCommandPropertyNames);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new RuntimeException("Couldn't copy properties from iteration " + this + " to " + command, e);
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new RuntimeException("Couldn't copy properties from iteration " + this + " to " + command, e);
+ }
+ }
+
+ private Map<String, String> getIterationPropertyValuesWithoutUnderscores()
+ {
+ Map<String, String> iterationPropertyValues = new HashMap<String, String>();
+ for (String propertyNameWithUnderscore : _iterationPropertyValuesWithUnderscores.keySet())
+ {
+ String propertyName = propertyNameWithUnderscore.replaceFirst("_", "");
+ String propertyValue = _iterationPropertyValuesWithUnderscores.get(propertyNameWithUnderscore);
+
+ iterationPropertyValues.put(propertyName, propertyValue);
+ }
+ return iterationPropertyValues;
+ }
+
+ @Override
+ public String toString()
+ {
+ return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("iterationMap", _iterationPropertyValuesWithUnderscores).toString();
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/MessageProviderConfig.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/MessageProviderConfig.java
new file mode 100644
index 0000000000..318ec7f045
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/MessageProviderConfig.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.Map;
+
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+
+public class MessageProviderConfig
+{
+ private String _name;
+ private Map<String, PropertyValue> _messageProperties;
+
+ public MessageProviderConfig()
+ {
+ super();
+ }
+
+ public MessageProviderConfig(String name, Map<String, PropertyValue> messageProperties)
+ {
+ super();
+ _name = name;
+ _messageProperties = messageProperties;
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public Map<String, PropertyValue> getMessageProperties()
+ {
+ return _messageProperties;
+ }
+
+ public CreateMessageProviderCommand createCommand()
+ {
+ CreateMessageProviderCommand command = new CreateMessageProviderCommand();
+ command.setProviderName(_name);
+ command.setMessageProperties(_messageProperties);
+ return command;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ParticipantConfig.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ParticipantConfig.java
new file mode 100644
index 0000000000..31037a3038
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ParticipantConfig.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import org.apache.qpid.disttest.message.CreateParticpantCommand;
+
+public abstract class ParticipantConfig
+{
+ private String _destinationName;
+ private long _numberOfMessages;
+ private String _name;
+ private int _batchSize;
+ private long _maximumDuration;
+
+ // For GSON
+ public ParticipantConfig()
+ {
+ _name = null;
+ _destinationName = null;
+ _numberOfMessages = 0;
+ _batchSize = 0;
+ _maximumDuration = 0;
+ }
+
+ public ParticipantConfig(
+ String name,
+ String destinationName,
+ long numberOfMessages,
+ int batchSize,
+ long maximumDuration)
+ {
+ _name = name;
+ _destinationName = destinationName;
+ _numberOfMessages = numberOfMessages;
+ _batchSize = batchSize;
+ _maximumDuration = maximumDuration;
+ }
+
+ protected void setParticipantProperties(CreateParticpantCommand createParticipantCommand)
+ {
+ createParticipantCommand.setParticipantName(_name);
+ createParticipantCommand.setDestinationName(_destinationName);
+ createParticipantCommand.setNumberOfMessages(_numberOfMessages);
+ createParticipantCommand.setBatchSize(_batchSize);
+ createParticipantCommand.setMaximumDuration(_maximumDuration);
+ }
+
+} \ No newline at end of file
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ProducerConfig.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ProducerConfig.java
new file mode 100644
index 0000000000..7806528a8c
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ProducerConfig.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import javax.jms.Message;
+
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+
+public class ProducerConfig extends ParticipantConfig
+{
+ private int _deliveryMode;
+ private int _messageSize;
+ private int _priority;
+ private long _timeToLive;
+ private long _interval;
+ private long _startDelay;
+ private String _messageProviderName;
+
+ // For Gson
+ public ProducerConfig()
+ {
+ _deliveryMode = Message.DEFAULT_DELIVERY_MODE;
+ _messageSize = 0;
+ _priority = Message.DEFAULT_PRIORITY;
+ _timeToLive = Message.DEFAULT_TIME_TO_LIVE;
+ _interval = 0;
+ _startDelay = 0;
+ _messageProviderName = null;
+ }
+
+ public ProducerConfig(
+ String producerName,
+ String destinationName,
+ long numberOfMessages,
+ int batchSize,
+ long maximumDuration,
+ int deliveryMode,
+ int messageSize,
+ int priority,
+ long timeToLive,
+ long interval,
+ long startDelay,
+ String messageProviderName)
+ {
+ super(producerName, destinationName, numberOfMessages, batchSize, maximumDuration);
+
+ _deliveryMode = deliveryMode;
+ _messageSize = messageSize;
+ _priority = priority;
+ _timeToLive = timeToLive;
+ _interval = interval;
+ _startDelay = startDelay;
+ _messageProviderName = messageProviderName;
+ }
+
+ public CreateProducerCommand createCommand(String sessionName)
+ {
+ CreateProducerCommand command = new CreateProducerCommand();
+
+ setParticipantProperties(command);
+
+ command.setSessionName(sessionName);
+ command.setDeliveryMode(_deliveryMode);
+ command.setMessageSize(_messageSize);
+ command.setPriority(_priority);
+ command.setTimeToLive(_timeToLive);
+ command.setInterval(_interval);
+ command.setStartDelay(_startDelay);
+ command.setMessageProviderName(_messageProviderName);
+
+ return command;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/QueueConfig.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/QueueConfig.java
new file mode 100644
index 0000000000..cffc2b7c50
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/QueueConfig.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.commons.lang.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+
+public class QueueConfig
+{
+ private String _name;
+ private boolean _durable;
+ private Map<String, Object> _attributes;
+
+ public QueueConfig()
+ {
+ super();
+ _attributes = Collections.emptyMap();
+ }
+
+ public QueueConfig(String name, boolean durable, Map<String, Object> attributes)
+ {
+ super();
+ this._name = name;
+ this._durable = durable;
+ this._attributes = attributes;
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ // TODO x-qpid-capacity and x-qpid-flow-resume-capacity need to be typed as numeric but we currrently
+ // pass these as a string.
+ public Map<String, Object> getAttributes()
+ {
+ return _attributes;
+ }
+
+ public boolean isDurable()
+ {
+ return _durable;
+ }
+
+ @Override
+ public String toString()
+ {
+ return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/SessionConfig.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/SessionConfig.java
new file mode 100644
index 0000000000..12372e5391
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/SessionConfig.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+
+public class SessionConfig
+{
+ private static final List<ProducerConfig> EMPTY_PRODUCER_LIST = Collections.emptyList();
+ private static final List<ConsumerConfig> EMPTY_CONSUMER_LIST = Collections.emptyList();
+
+ private int _acknowledgeMode;
+ private String _sessionName;
+ private List<ProducerConfig> _producers;
+ private List<ConsumerConfig> _consumers;
+
+ // For Gson
+ public SessionConfig()
+ {
+ this(null, Session.SESSION_TRANSACTED, EMPTY_CONSUMER_LIST, EMPTY_PRODUCER_LIST);
+ }
+
+ public SessionConfig(String sessionName, int acknowledgeMode, ProducerConfig...producers)
+ {
+ this(sessionName, acknowledgeMode, EMPTY_CONSUMER_LIST, Arrays.asList(producers));
+ }
+
+ public SessionConfig(String sessionName, int acknowledgeMode, ConsumerConfig... consumers)
+ {
+ this(sessionName, acknowledgeMode, Arrays.asList(consumers), EMPTY_PRODUCER_LIST);
+ }
+
+ public SessionConfig(String sessionName, int acknowledgeMode, List<ConsumerConfig> consumers, List<ProducerConfig> producers)
+ {
+ _sessionName = sessionName;
+ _acknowledgeMode = acknowledgeMode;
+ _consumers = consumers;
+ _producers = producers;
+ }
+
+ public int getAcknowledgeMode()
+ {
+ return _acknowledgeMode;
+ }
+
+ public String getSessionName()
+ {
+ return _sessionName;
+ }
+
+ public List<ProducerConfig> getProducers()
+ {
+ return Collections.unmodifiableList(_producers);
+ }
+
+ public List<ConsumerConfig> getConsumers()
+ {
+ return Collections.unmodifiableList(_consumers);
+ }
+
+ public List<Command> createCommands(String connectionName)
+ {
+ List<Command> commands = new ArrayList<Command>();
+ commands.add(createCommand(connectionName));
+ for (ProducerConfig producer : _producers)
+ {
+ commands.add(producer.createCommand(_sessionName));
+ }
+ for (ConsumerConfig consumer : _consumers)
+ {
+ commands.add(consumer.createCommand(_sessionName));
+ }
+ return commands;
+ }
+
+ private CreateSessionCommand createCommand(String connectionName)
+ {
+ CreateSessionCommand command = new CreateSessionCommand();
+ command.setAcknowledgeMode(_acknowledgeMode);
+ command.setConnectionName(connectionName);
+ command.setSessionName(_sessionName);
+ return command;
+ }
+
+ public int getTotalNumberOfParticipants()
+ {
+ return _producers.size() + _consumers.size();
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestConfig.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestConfig.java
new file mode 100644
index 0000000000..2bb5f1b289
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestConfig.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.qpid.disttest.controller.CommandForClient;
+
+public class TestConfig
+{
+ private final String _name;
+
+ private final List<ClientConfig> _clients;
+
+ private final List<QueueConfig> _queues;
+
+ private final List<Map<String, String>> _iterations;
+
+ public TestConfig()
+ {
+ _clients = Collections.emptyList();
+ _queues = Collections.emptyList();
+ _name = null;
+ _iterations = Collections.emptyList();
+ }
+
+ public TestConfig(String name, ClientConfig[] clients, QueueConfig[] queues)
+ {
+ _clients = Arrays.asList(clients);
+ _queues = Arrays.asList(queues);
+ _name = name;
+ _iterations = Collections.emptyList();
+ }
+
+ public List<String> getClientNames()
+ {
+ List<String> clientNames = new ArrayList<String>();
+ for (ClientConfig clientConfig : _clients)
+ {
+ clientNames.add(clientConfig.getName());
+ }
+ return clientNames;
+ }
+
+ public int getTotalNumberOfClients()
+ {
+ return _clients.size();
+ }
+
+ public int getTotalNumberOfParticipants()
+ {
+ int numOfParticipants = 0;
+ for (ClientConfig client : _clients)
+ {
+ numOfParticipants = numOfParticipants + client.getTotalNumberOfParticipants();
+ }
+ return numOfParticipants;
+ }
+
+ public List<CommandForClient> createCommands()
+ {
+ List<CommandForClient> commandsForClients = new ArrayList<CommandForClient>();
+ for (ClientConfig client : _clients)
+ {
+ commandsForClients.addAll(client.createCommands());
+ }
+
+ return Collections.unmodifiableList(commandsForClients);
+ }
+
+ public List<QueueConfig> getQueues()
+ {
+ return Collections.unmodifiableList(_queues);
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public List<IterationValue> getIterationValues()
+ {
+ List<IterationValue> iterationValues = new ArrayList<IterationValue>();
+ for (Map<String, String> iterationMap : _iterations)
+ {
+ iterationValues.add(new IterationValue(iterationMap));
+ }
+
+ return iterationValues;
+ }
+
+ public List<ClientConfig> getClients()
+ {
+ return Collections.unmodifiableList(_clients);
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestInstance.java b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestInstance.java
new file mode 100644
index 0000000000..9f555ef4da
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestInstance.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.apache.qpid.disttest.controller.CommandForClient;
+import org.apache.qpid.disttest.message.Command;
+
+public class TestInstance
+{
+ private static final IterationValue EMPTY_ITERATION_VALUES = new IterationValue();
+
+ private TestConfig _testConfig;
+ private IterationValue _iterationValue;
+ private int _iterationNumber;
+
+ public TestInstance(TestConfig testConfig, int iterationNumber, IterationValue iterationValue)
+ {
+ _testConfig = testConfig;
+ _iterationNumber = iterationNumber;
+ _iterationValue = iterationValue;
+ }
+
+ public TestInstance(TestConfig testConfig)
+ {
+ this(testConfig, 0, EMPTY_ITERATION_VALUES);
+ }
+
+ public List<CommandForClient> createCommands()
+ {
+ List<CommandForClient> commands = _testConfig.createCommands();
+ List<CommandForClient> newCommands = new ArrayList<CommandForClient>(commands.size());
+
+ for (CommandForClient commandForClient : commands)
+ {
+ String clientName = commandForClient.getClientName();
+ Command command = commandForClient.getCommand();
+
+ _iterationValue.applyToCommand(command);
+
+ newCommands.add(new CommandForClient(clientName, command));
+ }
+
+ return newCommands;
+
+ }
+
+ public String getName()
+ {
+ return _testConfig.getName();
+ }
+
+ public int getIterationNumber()
+ {
+ return _iterationNumber;
+ }
+
+ public int getTotalNumberOfParticipants()
+ {
+ return _testConfig.getTotalNumberOfParticipants();
+ }
+
+ public List<QueueConfig> getQueues()
+ {
+ return _testConfig.getQueues();
+ }
+
+ public List<String> getClientNames()
+ {
+ return _testConfig.getClientNames();
+ }
+
+ @Override
+ public String toString()
+ {
+ return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
+ .append("testName", getName())
+ .append("iterationNumber", _iterationNumber)
+ .toString();
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ClientJmsDelegate.java b/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ClientJmsDelegate.java
new file mode 100644
index 0000000000..d68fc86a0e
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ClientJmsDelegate.java
@@ -0,0 +1,592 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.jms;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.DeliveryMode;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.Context;
+import javax.naming.NamingException;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.apache.qpid.disttest.DistributedTestConstants;
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.client.MessageProvider;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ClientJmsDelegate
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ClientJmsDelegate.class);
+
+ private final Context _context;
+ private final Destination _controllerQueue;
+ private final Connection _controllerConnection;
+ private final Session _controllerSession;
+ private final MessageProducer _controlQueueProducer;
+
+ private final String _clientName;
+ private Queue _instructionQueue;
+
+ private Map<String, Connection> _testConnections;
+ private Map<String, Session> _testSessions;
+ private Map<String, MessageProducer> _testProducers;
+ private Map<String, MessageConsumer> _testConsumers;
+ private Map<String, MessageProvider> _testMessageProviders;
+
+ private final MessageProvider _defaultMessageProvider;
+
+ public ClientJmsDelegate(final Context context)
+ {
+ try
+ {
+ _context = context;
+ final ConnectionFactory connectionFactory = (ConnectionFactory) _context.lookup("connectionfactory");
+ _controllerConnection = connectionFactory.createConnection();
+ _controllerConnection.start();
+ _controllerQueue = (Destination) context.lookup(DistributedTestConstants.CONTROLLER_QUEUE_JNDI_NAME);
+ _controllerSession = _controllerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _controlQueueProducer = _controllerSession.createProducer(_controllerQueue);
+ _clientName = UUID.randomUUID().toString();
+ _testConnections = new HashMap<String, Connection>();
+ _testSessions = new HashMap<String, Session>();
+ _testProducers = new HashMap<String, MessageProducer>();
+ _testConsumers = new HashMap<String, MessageConsumer>();
+ _testMessageProviders = new HashMap<String, MessageProvider>();
+ _defaultMessageProvider = new MessageProvider(null);
+ }
+ catch (final NamingException ne)
+ {
+ throw new DistributedTestException("Unable to create client jms delegate", ne);
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to create client jms delegate", jmse);
+ }
+ }
+
+ public void setInstructionListener(final Client client)
+ {
+ try
+ {
+ _instructionQueue = _controllerSession.createTemporaryQueue();
+ final MessageConsumer instructionConsumer = _controllerSession.createConsumer(_instructionQueue);
+ instructionConsumer.setMessageListener(new MessageListener()
+ {
+ @Override
+ public void onMessage(final Message message)
+ {
+ client.processInstruction(JmsMessageAdaptor.messageToCommand(message));
+ }
+ });
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to setup instruction listener", jmse);
+ }
+ }
+
+ public void sendRegistrationMessage()
+ {
+ Command command;
+ try
+ {
+ command = new RegisterClientCommand(_clientName, _instructionQueue.getQueueName());
+ }
+ catch (final JMSException e)
+ {
+ throw new DistributedTestException(e);
+ }
+ sendCommand(command);
+ }
+
+ public void sendResponseMessage(final Response responseMessage)
+ {
+ sendCommand(responseMessage);
+ }
+
+ private void sendCommand(final Command command)
+ {
+ try
+ {
+ final Message message = JmsMessageAdaptor.commandToMessage(_controllerSession, command);
+ _controlQueueProducer.send(message);
+ LOGGER.debug("Sent message for " + command.getType() + ". message id: " + message.getJMSMessageID());
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to send command: " + command, jmse);
+ }
+ }
+
+ public void createConnection(final CreateConnectionCommand command)
+ {
+ try
+ {
+ final ConnectionFactory connectionFactory = (ConnectionFactory) _context.lookup(command
+ .getConnectionFactoryName());
+ final Connection newConnection = connectionFactory.createConnection();
+ addConnection(command.getConnectionName(), newConnection);
+ }
+ catch (final NamingException ne)
+ {
+ throw new DistributedTestException("Unable to lookup factoryName: " + command.getConnectionFactoryName(),
+ ne);
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to create connection: " + command.getConnectionName()
+ + " (using factory name: " + command.getConnectionFactoryName() + ")", jmse);
+ }
+ }
+
+ public void createSession(final CreateSessionCommand command)
+ {
+ try
+ {
+ final Connection connection = _testConnections.get(command.getConnectionName());
+ if (connection == null)
+ {
+ throw new DistributedTestException("No test connection found called: " + command.getConnectionName(),
+ command);
+ }
+ final boolean transacted = command.getAcknowledgeMode() == Session.SESSION_TRANSACTED;
+
+ final Session newSession = connection.createSession(transacted, command.getAcknowledgeMode());
+ LOGGER.info("Created session " + command.getSessionName() + " with transacted = " + newSession.getTransacted() + " and acknowledgeMode = " + newSession.getAcknowledgeMode());
+
+ addSession(command.getSessionName(), newSession);
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to create new session: " + command, jmse);
+ }
+ }
+
+ public void createProducer(final CreateProducerCommand command)
+ {
+ try
+ {
+ final Session session = _testSessions.get(command.getSessionName());
+ if (session == null)
+ {
+ throw new DistributedTestException("No test session found called: " + command.getSessionName(), command);
+ }
+ final Destination destination = session.createQueue(command.getDestinationName());
+ final MessageProducer jmsProducer = session.createProducer(destination);
+ if (command.getPriority() != -1)
+ {
+ jmsProducer.setPriority(command.getPriority());
+ }
+ if (command.getTimeToLive() > 0)
+ {
+ jmsProducer.setTimeToLive(command.getTimeToLive());
+ }
+
+ if (command.getDeliveryMode() == DeliveryMode.NON_PERSISTENT
+ || command.getDeliveryMode() == DeliveryMode.PERSISTENT)
+ {
+ jmsProducer.setDeliveryMode(command.getDeliveryMode());
+ }
+
+ addProducer(command.getParticipantName(), jmsProducer);
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to create new producer: " + command, jmse);
+ }
+
+ }
+
+ public void createConsumer(final CreateConsumerCommand command)
+ {
+ try
+ {
+ final Session session = _testSessions.get(command.getSessionName());
+ if (session == null)
+ {
+ throw new DistributedTestException("No test session found called: " + command.getSessionName(), command);
+ }
+ final Destination destination = command.isTopic() ? session.createTopic(command.getDestinationName())
+ : session.createQueue(command.getDestinationName());
+ final MessageConsumer jmsConsumer = session.createConsumer(destination, command.getSelector());
+
+ _testConsumers.put(command.getParticipantName(), jmsConsumer);
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to create new consumer: " + command, jmse);
+ }
+ }
+
+ /**
+ * destroy the client. Don't call from the Dispatcher thread.
+ */
+ public void destroy()
+ {
+ try
+ {
+ // Stopping the connection allows in-flight onMessage calls to
+ // finish.
+ _controllerConnection.stop();
+
+ if (_controllerSession != null)
+ {
+ _controllerSession.close();
+ }
+ if (_controllerConnection != null)
+ {
+ _controllerConnection.close();
+ }
+
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to destroy cleanly", jmse);
+ }
+ }
+
+ public Destination getControllerQueue()
+ {
+ return _controllerQueue;
+ }
+
+ public String getClientName()
+ {
+ return _clientName;
+ }
+
+ public int getNoOfTestConnections()
+ {
+ return _testConnections.size();
+ }
+
+ public int getNoOfTestSessions()
+ {
+ return _testSessions.size();
+ }
+
+ public int getNoOfTestProducers()
+ {
+ return _testProducers.size();
+ }
+
+ public int getNoOfTestConsumers()
+ {
+ return _testConsumers.size();
+ }
+
+ public void startConnections()
+ {
+ // start connections for consumers
+ // it would be better if we could track consumer connections and start
+ // only those
+ if (!_testConsumers.isEmpty())
+ {
+ for (final Map.Entry<String, Connection> entry : _testConnections.entrySet())
+ {
+ final Connection connection = entry.getValue();
+ try
+ {
+ connection.start();
+ }
+ catch (final JMSException e)
+ {
+ throw new DistributedTestException("Failed to start connection '" + entry.getKey() + "' :"
+ + e.getLocalizedMessage());
+ }
+ }
+ }
+ }
+
+ public void commitOrAcknowledgeMessage(final Message message, final String sessionName)
+ {
+ try
+ {
+ final Session session = _testSessions.get(sessionName);
+ if (session.getTransacted())
+ {
+ session.commit();
+ }
+ else if (message != null && session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE)
+ {
+ message.acknowledge();
+ }
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to commit or acknowledge message on session: " +
+ sessionName, jmse);
+ }
+ }
+
+ public int getAcknowledgeMode(final String sessionName)
+ {
+ try
+ {
+ final Session session = _testSessions.get(sessionName);
+ return session.getAcknowledgeMode();
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to determine acknowledgement mode for session: " +
+ sessionName, jmse);
+ }
+ }
+
+ public Message sendNextMessage(final CreateProducerCommand command)
+ {
+ Message sentMessage = null;
+ MessageProvider messageProvider = _testMessageProviders.get(command.getMessageProviderName());
+ if (messageProvider == null)
+ {
+ messageProvider = _defaultMessageProvider;
+ }
+
+ final Session session = _testSessions.get(command.getSessionName());
+ final MessageProducer producer = _testProducers.get(command.getParticipantName());
+ try
+ {
+ sentMessage = messageProvider.nextMessage(session, command);
+ int deliveryMode = producer.getDeliveryMode();
+ int priority = producer.getPriority();
+ long ttl = producer.getTimeToLive();
+ if (messageProvider.isPropertySet(MessageProvider.PRIORITY))
+ {
+ priority = sentMessage.getJMSPriority();
+ }
+ if (messageProvider.isPropertySet(MessageProvider.DELIVERY_MODE))
+ {
+ deliveryMode = sentMessage.getJMSDeliveryMode();
+ }
+ if (messageProvider.isPropertySet(MessageProvider.TTL))
+ {
+ ttl = sentMessage.getLongProperty(MessageProvider.TTL);
+ }
+ producer.send(sentMessage, deliveryMode, priority, ttl);
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to create and send message with producer: " +
+ command.getParticipantName() + " on session: " + command.getSessionName(), jmse);
+ }
+ return sentMessage;
+ }
+
+ protected void addSession(final String sessionName, final Session newSession)
+ {
+ _testSessions.put(sessionName, newSession);
+ }
+
+ protected void addConnection(final String connectionName, final Connection newConnection)
+ {
+ _testConnections.put(connectionName, newConnection);
+ }
+
+ protected void addProducer(final String producerName, final MessageProducer jmsProducer)
+ {
+ _testProducers.put(producerName, jmsProducer);
+ }
+
+ public Message consumeMessage(String consumerName, long receiveInterval)
+ {
+ Message consumedMessage = null;
+ MessageConsumer consumer = _testConsumers.get(consumerName);
+ try
+ {
+ consumedMessage = consumer.receive(receiveInterval);
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Unable to consume message with consumer: " + consumerName, e);
+ }
+ return consumedMessage;
+ }
+
+ public void registerListener(String consumerName, MessageListener messageListener)
+ {
+ MessageConsumer consumer = _testConsumers.get(consumerName);
+ try
+ {
+ consumer.setMessageListener(messageListener);
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Unable to register message listener with consumer: " + consumerName, e);
+ }
+ }
+
+ public void rollbackOrRecover(String sessionName)
+ {
+ try
+ {
+ final Session session = _testSessions.get(sessionName);
+ if (session.getTransacted())
+ {
+ session.rollback();
+ }
+ else if (session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE)
+ {
+ session.recover();
+ }
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to rollback or recover on session: " +
+ sessionName, jmse);
+ }
+ }
+
+ public void releaseMessage(String sessionName)
+ {
+ try
+ {
+ final Session session = _testSessions.get(sessionName);
+ if (session.getTransacted())
+ {
+ session.rollback();
+ }
+ else
+ {
+ session.recover();
+ }
+ }
+ catch (final JMSException jmse)
+ {
+ LOGGER.warn("Unable to rollback or recover on session: " + sessionName, jmse);
+ }
+ }
+
+ @Override
+ public String toString()
+ {
+ return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("clientName", _clientName).toString();
+ }
+
+ public void closeTestConnections()
+ {
+ StringBuilder jmsErrorMessages = new StringBuilder();
+ int failedCloseCounter = 0;
+ for (final Map.Entry<String, Connection> entry : _testConnections.entrySet())
+ {
+ final Connection connection = entry.getValue();
+ try
+ {
+ connection.close();
+ }
+ catch (final JMSException e)
+ {
+ LOGGER.error("Failed to close connection '" + entry.getKey() + "' :" + e.getLocalizedMessage(), e);
+ failedCloseCounter++;
+ if (jmsErrorMessages.length() > 0)
+ {
+ jmsErrorMessages.append('\n');
+ }
+ jmsErrorMessages.append(e.getMessage());
+ }
+ }
+ _testConnections.clear();
+ _testSessions.clear();
+ _testProducers.clear();
+ _testConsumers.clear();
+ if (failedCloseCounter > 0)
+ {
+ throw new DistributedTestException("Close failed for " + failedCloseCounter + " connection(s) with the following errors: " + jmsErrorMessages.toString());
+ }
+ }
+
+ public void closeTestConsumer(String consumerName)
+ {
+ MessageConsumer consumer = _testConsumers.get(consumerName);
+ if (consumer != null)
+ {
+ try
+ {
+ consumer.close();
+ LOGGER.info("Closed test consumer " + consumerName);
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Failed to close consumer: " + consumerName, e);
+ }
+ }
+ }
+
+ public void closeTestProducer(String producerName)
+ {
+ MessageProducer producer = _testProducers.get(producerName);
+ if (producer != null)
+ {
+ try
+ {
+ producer.close();
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Failed to close producer: " + producerName, e);
+ }
+ }
+ }
+
+ public int calculatePayloadSizeFrom(Message message)
+ {
+ try
+ {
+ if (message != null && message instanceof TextMessage)
+ {
+ return ((TextMessage) message).getText().getBytes().length;
+ }
+ // TODO support other message types
+ return 0;
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Unable to determine the payload size for message " + message, e);
+ }
+ }
+
+ public void createMessageProvider(CreateMessageProviderCommand command)
+ {
+ _testMessageProviders.put(command.getProviderName(), new MessageProvider(command.getMessageProperties()));
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ControllerJmsDelegate.java b/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ControllerJmsDelegate.java
new file mode 100644
index 0000000000..69da409be5
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ControllerJmsDelegate.java
@@ -0,0 +1,210 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.jms;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.naming.Context;
+import javax.naming.NamingException;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.CommandListener;
+import org.apache.qpid.disttest.controller.config.QueueConfig;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ControllerJmsDelegate
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ControllerJmsDelegate.class);
+
+ private final Map<String, Destination> _clientNameToQueueMap = new ConcurrentHashMap<String, Destination>();
+ private final Connection _connection;
+ private final Destination _controllerQueue;
+ private final Session _session;
+ private final QueueCreator _queueCreator;
+
+ private List<CommandListener> _commandListeners = new CopyOnWriteArrayList<CommandListener>();
+
+ public ControllerJmsDelegate(final Context context) throws NamingException, JMSException
+ {
+ final ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("connectionfactory");
+ _connection = connectionFactory.createConnection();
+ _connection.start();
+ _controllerQueue = (Destination) context.lookup("controllerqueue");
+ _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _queueCreator = new QpidQueueCreator();
+ }
+
+ public void start()
+ {
+ try
+ {
+ final MessageConsumer consumer = _session.createConsumer(_controllerQueue);
+ consumer.setMessageListener(new MessageListener()
+ {
+ @Override
+ public void onMessage(final Message message)
+ {
+ try
+ {
+ String jmsMessageID = message.getJMSMessageID();
+ LOGGER.debug("Received message " + jmsMessageID);
+
+ final Command command = JmsMessageAdaptor.messageToCommand(message);
+ LOGGER.debug("Converted message " + jmsMessageID + " into command: " + command);
+
+ processCommandWithFirstSupportingListener(command);
+ LOGGER.debug("Finished processing command for message " + jmsMessageID);
+ }
+ catch (Throwable t)
+ {
+ LOGGER.error("Can't handle JMS message", t);
+ }
+ }
+ });
+ }
+ catch (final JMSException e)
+ {
+ throw new DistributedTestException(e);
+ }
+ }
+
+ /** ensures connections are closed, otherwise the JVM may be prevented from terminating */
+ public void closeConnections()
+ {
+ try
+ {
+ _session.close();
+ }
+ catch (JMSException e)
+ {
+ LOGGER.error("Unable to close session", e);
+ }
+
+ try
+ {
+ _connection.stop();
+ }
+ catch (JMSException e)
+ {
+ LOGGER.error("Unable to stop connection", e);
+ }
+
+ try
+ {
+ _connection.close();
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Unable to close connection", e);
+ }
+ }
+
+ public void registerClient(final RegisterClientCommand command)
+ {
+ final String clientName = command.getClientName();
+ final Destination clientIntructionQueue = createDestinationFromString(command.getClientQueueName());
+ _clientNameToQueueMap.put(clientName, clientIntructionQueue);
+ }
+
+ public void sendCommandToClient(final String clientName, final Command command)
+ {
+ final Destination clientQueue = _clientNameToQueueMap.get(clientName);
+ if (clientQueue == null)
+ {
+ throw new DistributedTestException("Client name " + clientName + " not known. I know about: "
+ + _clientNameToQueueMap.keySet());
+ }
+
+ try
+ {
+ final MessageProducer producer = _session.createProducer(clientQueue);
+ final Message message = JmsMessageAdaptor.commandToMessage(_session, command);
+
+ producer.send(message);
+ }
+ catch (final JMSException e)
+ {
+ throw new DistributedTestException(e);
+ }
+ }
+
+ private void processCommandWithFirstSupportingListener(Command command)
+ {
+ for (CommandListener listener : _commandListeners)
+ {
+ if (listener.supports(command))
+ {
+ listener.processCommand(command);
+ return;
+ }
+ }
+
+ throw new IllegalStateException("There is no registered listener to process command " + command);
+ }
+
+ private Destination createDestinationFromString(final String clientQueueName)
+ {
+ Destination clientIntructionQueue;
+ try
+ {
+ clientIntructionQueue = _session.createQueue(clientQueueName);
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Unable to create Destination from " + clientQueueName);
+ }
+ return clientIntructionQueue;
+ }
+
+ public void createQueues(List<QueueConfig> queues)
+ {
+ _queueCreator.createQueues(_session, queues);
+ }
+
+ public void deleteQueues(List<QueueConfig> queues)
+ {
+ _queueCreator.deleteQueues(_session, queues);
+ }
+
+ public void addCommandListener(CommandListener commandListener)
+ {
+ _commandListeners.add(commandListener);
+ }
+
+ public void removeCommandListener(CommandListener commandListener)
+ {
+ _commandListeners.remove(commandListener);
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/jms/JmsMessageAdaptor.java b/java/perftests/src/main/java/org/apache/qpid/disttest/jms/JmsMessageAdaptor.java
new file mode 100644
index 0000000000..c9dba21a74
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/jms/JmsMessageAdaptor.java
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.jms;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.DistributedTestConstants;
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.json.JsonHandler;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.CreateResponderCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StartTestCommand;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.apache.qpid.disttest.message.TearDownTestCommand;
+
+public class JmsMessageAdaptor
+{
+ public static Message commandToMessage(final Session session, final Command command)
+ {
+ Message jmsMessage = null;
+ try
+ {
+ jmsMessage = session.createMessage();
+ jmsMessage.setStringProperty(DistributedTestConstants.MSG_COMMAND_PROPERTY, command.getType().name());
+ final JsonHandler jsonHandler = new JsonHandler();
+ jmsMessage.setStringProperty(DistributedTestConstants.MSG_JSON_PROPERTY, jsonHandler.marshall(command));
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to convert command " + command + " to JMS Message", jmse);
+ }
+
+ return jmsMessage;
+ }
+
+ public static Command messageToCommand(final Message jmsMessage)
+ {
+ Command command = null;
+ try
+ {
+ final CommandType commandType = CommandType.valueOf(jmsMessage
+ .getStringProperty(DistributedTestConstants.MSG_COMMAND_PROPERTY));
+ final JsonHandler jsonHandler = new JsonHandler();
+ command = jsonHandler.unmarshall(jmsMessage.getStringProperty(DistributedTestConstants.MSG_JSON_PROPERTY),
+ getCommandClassFromType(commandType));
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to convert JMS message " + jmsMessage + " to command object",
+ jmse);
+ }
+ return command;
+ }
+
+ static Class<? extends Command> getCommandClassFromType(final CommandType type)
+ {
+ switch (type)
+ {
+ case CREATE_CONNECTION:
+ return CreateConnectionCommand.class;
+ case CREATE_SESSION:
+ return CreateSessionCommand.class;
+ case CREATE_PRODUCER:
+ return CreateProducerCommand.class;
+ case CREATE_CONSUMER:
+ return CreateConsumerCommand.class;
+ case CREATE_RESPONDER:
+ return CreateResponderCommand.class;
+ case NO_OP:
+ return NoOpCommand.class;
+ case REGISTER_CLIENT:
+ return RegisterClientCommand.class;
+ case STOP_CLIENT:
+ return StopClientCommand.class;
+ case RESPONSE:
+ return Response.class;
+ case START_TEST:
+ return StartTestCommand.class;
+ case TEAR_DOWN_TEST:
+ return TearDownTestCommand.class;
+ case PARTICIPANT_RESULT:
+ return ParticipantResult.class;
+ case CONSUMER_PARTICIPANT_RESULT:
+ return ConsumerParticipantResult.class;
+ case PRODUCER_PARTICIPANT_RESULT:
+ return ProducerParticipantResult.class;
+ case CREATE_MESSAGE_PROVIDER:
+ return CreateMessageProviderCommand.class;
+ default:
+ throw new DistributedTestException("No class defined for type: " + type);
+ }
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QpidQueueCreator.java b/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QpidQueueCreator.java
new file mode 100644
index 0000000000..912ce54495
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QpidQueueCreator.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.jms;
+
+import java.util.List;
+
+import javax.jms.Session;
+
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.client.AMQSession;
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.config.QueueConfig;
+import org.apache.qpid.framing.FieldTable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class QpidQueueCreator implements QueueCreator
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(QpidQueueCreator.class);
+
+ private static final FieldTable EMPTY_QUEUE_BIND_ARGUMENTS = new FieldTable();
+
+ @Override
+ public void createQueues(Session session, List<QueueConfig> configs)
+ {
+ AMQSession<?, ?> amqSession = (AMQSession<?, ?>)session;
+ for (QueueConfig queueConfig : configs)
+ {
+ createQueue(amqSession, queueConfig);
+ }
+ }
+
+ @Override
+ public void deleteQueues(Session session, List<QueueConfig> configs)
+ {
+ AMQSession<?, ?> amqSession = (AMQSession<?, ?>)session;
+ for (QueueConfig queueConfig : configs)
+ {
+ deleteQueue(amqSession, queueConfig);
+ }
+ }
+
+ private void createQueue(AMQSession<?, ?> session, QueueConfig queueConfig)
+ {
+ try
+ {
+ AMQDestination destination = (AMQDestination) session.createQueue(queueConfig.getName());
+ boolean autoDelete = false;
+ boolean exclusive = false;
+ session.createQueue(destination.getAMQQueueName(), autoDelete,
+ queueConfig.isDurable(), exclusive, queueConfig.getAttributes());
+ session.bindQueue(destination.getAMQQueueName(), destination.getRoutingKey(),
+ EMPTY_QUEUE_BIND_ARGUMENTS, destination.getExchangeName(),
+ destination, autoDelete);
+
+ LOGGER.info("Created queue " + queueConfig);
+ }
+ catch (Exception e)
+ {
+ throw new DistributedTestException("Failed to create queue:" + queueConfig, e);
+ }
+ }
+
+ private void deleteQueue(AMQSession<?, ?> session, QueueConfig queueConfig)
+ {
+ try
+ {
+ // The Qpid AMQSession API currently makes the #deleteQueue method protected and the
+ // raw protocol method public. This should be changed then we should switch the below to
+ // use #deleteQueue.
+ AMQDestination destination = (AMQDestination) session.createQueue(queueConfig.getName());
+ session.sendQueueDelete(destination.getAMQQueueName());
+ LOGGER.info("Deleted queue " + queueConfig.getName());
+ }
+ catch (Exception e)
+ {
+ throw new DistributedTestException("Failed to delete queue:" + queueConfig.getName(), e);
+ }
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QueueCreator.java b/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QueueCreator.java
new file mode 100644
index 0000000000..0947dd53cb
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QueueCreator.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.jms;
+
+import java.util.List;
+
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.controller.config.QueueConfig;
+
+public interface QueueCreator
+{
+ public void createQueues(final Session session, final List<QueueConfig> configs);
+ public void deleteQueues(final Session session, final List<QueueConfig> configs);
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/json/JsonHandler.java b/java/perftests/src/main/java/org/apache/qpid/disttest/json/JsonHandler.java
new file mode 100644
index 0000000000..8e50cd4f11
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/json/JsonHandler.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.json;
+
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.message.Command;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+public class JsonHandler
+{
+ private final Gson _gson = new GsonBuilder()
+ .registerTypeAdapter(PropertyValue.class, new PropertyValueAdapter())
+ .create();
+
+ public <T extends Command> T unmarshall(final String jsonParams, final Class<T> clazz)
+ {
+ return _gson.fromJson(jsonParams, clazz);
+ }
+
+ public <T extends Command> String marshall(final T command)
+ {
+ return _gson.toJson(command);
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/json/PropertyValueAdapter.java b/java/perftests/src/main/java/org/apache/qpid/disttest/json/PropertyValueAdapter.java
new file mode 100644
index 0000000000..94f712e652
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/json/PropertyValueAdapter.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.json;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.qpid.disttest.client.property.GeneratedPropertyValue;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.client.property.PropertyValueFactory;
+import org.apache.qpid.disttest.client.property.SimplePropertyValue;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+
+public class PropertyValueAdapter implements JsonDeserializer<PropertyValue>, JsonSerializer<PropertyValue>
+{
+ private static final String DEF_FIELD = "@def";
+ private PropertyValueFactory _factory = new PropertyValueFactory();
+
+ @Override
+ public PropertyValue deserialize(JsonElement json, Type type, JsonDeserializationContext context)
+ throws JsonParseException
+ {
+ if (json.isJsonNull())
+ {
+ return null;
+ }
+ else if (json.isJsonPrimitive())
+ {
+ Object result = null;
+ JsonPrimitive primitive = json.getAsJsonPrimitive();
+ if (primitive.isString())
+ {
+ result = primitive.getAsString();
+ }
+ else if (primitive.isNumber())
+ {
+ String asString = primitive.getAsString();
+ if (asString.indexOf('.') != -1 || asString.indexOf('e') != -1)
+ {
+ result = primitive.getAsDouble();
+ }
+ else
+ {
+ result = primitive.getAsLong();
+ }
+ }
+ else if (primitive.isBoolean())
+ {
+ result = primitive.getAsBoolean();
+ }
+ else
+ {
+ throw new JsonParseException("Unsupported primitive value " + primitive);
+ }
+ return new SimplePropertyValue(result);
+ }
+ else if (json.isJsonArray())
+ {
+ JsonArray array = json.getAsJsonArray();
+ List<Object> result = new ArrayList<Object>(array.size());
+ for (JsonElement element : array)
+ {
+ result.add(context.deserialize(element, Object.class));
+ }
+ return new SimplePropertyValue(result);
+ }
+ else if (json.isJsonObject())
+ {
+ JsonObject object = json.getAsJsonObject();
+ JsonElement defElement = object.getAsJsonPrimitive(DEF_FIELD);
+ Class<?> classInstance = null;
+ if (defElement != null)
+ {
+ try
+ {
+ classInstance = _factory.getPropertyValueClass(defElement.getAsString());
+ }
+ catch (ClassNotFoundException e)
+ {
+ // ignore
+ }
+ }
+ if (classInstance == null)
+ {
+ Map<String, Object> result = new HashMap<String, Object>();
+ for (Map.Entry<String, JsonElement> entry : object.entrySet())
+ {
+ Object value = context.deserialize(entry.getValue(), Object.class);
+ result.put(entry.getKey(), value);
+ }
+ return new SimplePropertyValue(result);
+ }
+ else
+ {
+ return context.deserialize(json, classInstance);
+ }
+ }
+ else
+ {
+ throw new JsonParseException("Unsupported JSON type " + json);
+ }
+ }
+
+ @Override
+ public JsonElement serialize(PropertyValue src, Type typeOfSrc, JsonSerializationContext context)
+ {
+ if (src instanceof GeneratedPropertyValue)
+ {
+ JsonObject object = (JsonObject) context.serialize(src, Object.class);
+ object.addProperty(DEF_FIELD, ((GeneratedPropertyValue) src).getDefinition());
+ return object;
+ }
+ else
+ {
+ return context.serialize(src.getValue(), Object.class);
+ }
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/Command.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/Command.java
new file mode 100644
index 0000000000..86b4d0e439
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/Command.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+
+import org.apache.commons.lang.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.apache.qpid.disttest.Visitor;
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.controller.Controller;
+
+/**
+ * A command sent between the {@link Controller} and a {@link Client}
+ */
+public abstract class Command
+{
+ private final CommandType type;
+
+ public Command(final CommandType type)
+ {
+ this.type = type;
+ }
+
+ public CommandType getType()
+ {
+ return type;
+ }
+
+ public void accept(Visitor visitor)
+ {
+ visitor.visit(this);
+ }
+
+ @Override
+ public String toString()
+ {
+ return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/CommandType.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CommandType.java
new file mode 100644
index 0000000000..b04cbdaba1
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CommandType.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public enum CommandType
+{
+ CREATE_CONNECTION,
+ CREATE_CONSUMER,
+ CREATE_PRODUCER,
+ CREATE_RESPONDER,
+ CREATE_SESSION,
+ NO_OP,
+ REGISTER_CLIENT,
+ RESPONSE,
+ START_TEST,
+ STOP_CLIENT,
+ TEAR_DOWN_TEST,
+ PARTICIPANT_RESULT,
+ CONSUMER_PARTICIPANT_RESULT,
+ PRODUCER_PARTICIPANT_RESULT,
+ CREATE_MESSAGE_PROVIDER
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/ConsumerParticipantResult.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/ConsumerParticipantResult.java
new file mode 100644
index 0000000000..f92e3ea538
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/ConsumerParticipantResult.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_BROWSIING_SUBSCRIPTION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_DURABLE_SUBSCRIPTION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_NO_LOCAL;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_SELECTOR;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_SYNCHRONOUS_CONSUMER;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_TOPIC;
+
+public class ConsumerParticipantResult extends ParticipantResult
+{
+ private boolean _topic;
+ private boolean _durableSubscription;
+ private boolean _browsingSubscription;
+ private boolean _selector;
+ private boolean _noLocal;
+ private boolean _synchronousConsumer;
+
+ public ConsumerParticipantResult()
+ {
+ super(CommandType.CONSUMER_PARTICIPANT_RESULT);
+ }
+
+ public ConsumerParticipantResult(String participantName)
+ {
+ this();
+ setParticipantName(participantName);
+ }
+
+ @OutputAttribute(attribute=IS_DURABLE_SUBSCRIPTION)
+ public boolean isDurableSubscription()
+ {
+ return _durableSubscription;
+ }
+
+ public void setDurableSubscription(boolean durable)
+ {
+ _durableSubscription = durable;
+ }
+
+
+ @OutputAttribute(attribute=IS_BROWSIING_SUBSCRIPTION)
+ public boolean isBrowsingSubscription()
+ {
+ return _browsingSubscription;
+ }
+
+ public void setBrowsingSubscription(boolean browsingSubscription)
+ {
+ _browsingSubscription = browsingSubscription;
+ }
+
+
+ @OutputAttribute(attribute=IS_SELECTOR)
+ public boolean isSelector()
+ {
+ return _selector;
+ }
+
+ public void setSelector(boolean selector)
+ {
+ _selector = selector;
+ }
+
+
+ @OutputAttribute(attribute=IS_NO_LOCAL)
+ public boolean isNoLocal()
+ {
+ return _noLocal;
+
+ }
+
+ public void setNoLocal(boolean noLocal)
+ {
+ _noLocal = noLocal;
+ }
+
+ @OutputAttribute(attribute=IS_SYNCHRONOUS_CONSUMER)
+ public boolean isSynchronousConsumer()
+ {
+ return _synchronousConsumer;
+ }
+
+ public void setSynchronousConsumer(boolean synchronousConsumer)
+ {
+ _synchronousConsumer = synchronousConsumer;
+ }
+
+
+ public void setTopic(boolean isTopic)
+ {
+ _topic = isTopic;
+ }
+
+ @OutputAttribute(attribute=IS_TOPIC)
+ public boolean isTopic()
+ {
+ return _topic;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConnectionCommand.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConnectionCommand.java
new file mode 100644
index 0000000000..c5a96e9a94
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConnectionCommand.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class CreateConnectionCommand extends Command
+{
+ private String _connectionName;
+ private String _connectionFactoryName;
+
+ public CreateConnectionCommand()
+ {
+ super(CommandType.CREATE_CONNECTION);
+ }
+
+ public CreateConnectionCommand(String connectionName, String connectionFactoryName)
+ {
+ super(CommandType.CREATE_CONNECTION);
+ _connectionName = connectionName;
+ _connectionFactoryName = connectionFactoryName;
+ }
+
+ public void setConnectionName(final String connectionName)
+ {
+ this._connectionName = connectionName;
+ }
+
+ public String getConnectionName()
+ {
+ return _connectionName;
+ }
+
+ public void setConnectionFactoryName(final String connectionFactoryName)
+ {
+ this._connectionFactoryName = connectionFactoryName;
+ }
+
+ public String getConnectionFactoryName()
+ {
+ return _connectionFactoryName;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConsumerCommand.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConsumerCommand.java
new file mode 100644
index 0000000000..678e428f94
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConsumerCommand.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class CreateConsumerCommand extends CreateParticpantCommand
+{
+ private boolean _isTopic;
+ private boolean _isDurableSubscription;
+ private boolean _isBrowsingSubscription;
+ private String _selector;
+ private boolean _noLocal;
+ private boolean _synchronous;
+ private long _receiveTimeout = 5000;
+
+
+ public CreateConsumerCommand()
+ {
+ super(CommandType.CREATE_CONSUMER);
+ }
+
+ public boolean isDurableSubscription()
+ {
+ return _isDurableSubscription;
+ }
+
+ public void setDurableSubscription(final boolean isDurableSubscription)
+ {
+ this._isDurableSubscription = isDurableSubscription;
+ }
+
+ public boolean isBrowsingSubscription()
+ {
+ return _isBrowsingSubscription;
+ }
+
+ public void setBrowsingSubscription(final boolean isBrowsingSubscription)
+ {
+ _isBrowsingSubscription = isBrowsingSubscription;
+ }
+
+ public String getSelector()
+ {
+ return _selector;
+ }
+
+ public void setSelector(final String selector)
+ {
+ this._selector = selector;
+ }
+
+ public boolean isNoLocal()
+ {
+ return _noLocal;
+ }
+
+ public void setNoLocal(final boolean noLocal)
+ {
+ this._noLocal = noLocal;
+ }
+
+ public boolean isTopic()
+ {
+ return _isTopic;
+ }
+
+ public void setTopic(boolean isTopic)
+ {
+ this._isTopic = isTopic;
+ }
+
+ public boolean isSynchronous()
+ {
+ return _synchronous;
+ }
+
+ public void setSynchronous(boolean synchronous)
+ {
+ _synchronous = synchronous;
+ }
+
+ public void setReceiveTimeout(long receiveTimeout)
+ {
+ _receiveTimeout = receiveTimeout;
+
+ }
+
+ public long getReceiveTimeout()
+ {
+ return _receiveTimeout;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateMessageProviderCommand.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateMessageProviderCommand.java
new file mode 100644
index 0000000000..3f30fdd96a
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateMessageProviderCommand.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import java.util.Map;
+
+import org.apache.qpid.disttest.client.property.PropertyValue;
+
+public class CreateMessageProviderCommand extends Command
+{
+ private String _providerName;
+ private Map<String, PropertyValue> _messageProperties;
+
+ public CreateMessageProviderCommand()
+ {
+ super(CommandType.CREATE_MESSAGE_PROVIDER);
+ }
+
+ public String getProviderName()
+ {
+ return _providerName;
+ }
+
+ public void setProviderName(String providerName)
+ {
+ this._providerName = providerName;
+ }
+
+ public Map<String, PropertyValue> getMessageProperties()
+ {
+ return _messageProperties;
+ }
+
+ public void setMessageProperties(Map<String, PropertyValue> messageProperties)
+ {
+ this._messageProperties = messageProperties;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateParticpantCommand.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateParticpantCommand.java
new file mode 100644
index 0000000000..b1caa6ef75
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateParticpantCommand.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+public abstract class CreateParticpantCommand extends Command
+{
+ private String _participantName;
+ private String _sessionName;
+ private String _destinationName;
+ private long _numberOfMessages;
+ private int _batchSize;
+ private long _maximumDuration;
+
+ public CreateParticpantCommand(CommandType type)
+ {
+ super(type);
+ }
+
+ public String getParticipantName()
+ {
+ return _participantName;
+ }
+
+ public void setParticipantName(final String participantName)
+ {
+ _participantName = participantName;
+ }
+
+ public String getSessionName()
+ {
+ return _sessionName;
+ }
+
+ public void setSessionName(final String sessionName)
+ {
+ _sessionName = sessionName;
+ }
+
+ public String getDestinationName()
+ {
+ return _destinationName;
+ }
+
+ public void setDestinationName(final String destinationName)
+ {
+ _destinationName = destinationName;
+ }
+
+ public long getNumberOfMessages()
+ {
+ return _numberOfMessages;
+ }
+
+ public void setNumberOfMessages(final long numberOfMessages)
+ {
+ _numberOfMessages = numberOfMessages;
+ }
+
+ public int getBatchSize()
+ {
+ return _batchSize;
+ }
+
+ public void setBatchSize(int batchSize)
+ {
+ _batchSize = batchSize;
+ }
+
+ public long getMaximumDuration()
+ {
+ return _maximumDuration;
+ }
+
+ public void setMaximumDuration(long maximumDuration)
+ {
+ _maximumDuration = maximumDuration;
+ }
+
+ @Override
+ public String toString()
+ {
+ return ToStringBuilder.reflectionToString(this);
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateProducerCommand.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateProducerCommand.java
new file mode 100644
index 0000000000..69dfe1ff5a
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateProducerCommand.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class CreateProducerCommand extends CreateParticpantCommand
+{
+ private int _deliveryMode;
+ private int _messageSize;
+ private int _priority;
+ private long _timeToLive;
+ private long _interval;
+ private long _startDelay;
+ private String _messageProviderName;
+
+ public CreateProducerCommand()
+ {
+ super(CommandType.CREATE_PRODUCER);
+ }
+
+ public int getMessageSize()
+ {
+ return _messageSize;
+ }
+
+ public void setMessageSize(final int messageSize)
+ {
+ this._messageSize = messageSize;
+ }
+
+ public int getPriority()
+ {
+ return _priority;
+ }
+
+ public void setPriority(final int priority)
+ {
+ this._priority = priority;
+ }
+
+ public int getDeliveryMode()
+ {
+ return _deliveryMode;
+ }
+
+ public void setDeliveryMode(final int deliveryMode)
+ {
+ this._deliveryMode = deliveryMode;
+ }
+
+ public long getTimeToLive()
+ {
+ return _timeToLive;
+ }
+
+ public void setTimeToLive(final long timeToLive)
+ {
+ this._timeToLive = timeToLive;
+ }
+
+ public long getInterval()
+ {
+ return _interval;
+ }
+
+ public void setInterval(long interval)
+ {
+ this._interval = interval;
+ }
+
+ public long getStartDelay()
+ {
+ return _startDelay;
+ }
+
+ public void setStartDelay(long startDelay)
+ {
+ this._startDelay = startDelay;
+ }
+
+ public String getMessageProviderName()
+ {
+ return _messageProviderName;
+ }
+
+ public void setMessageProviderName(String messageProviderName)
+ {
+ this._messageProviderName = messageProviderName;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateResponderCommand.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateResponderCommand.java
new file mode 100644
index 0000000000..85a2b5e548
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateResponderCommand.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class CreateResponderCommand extends Command
+{
+ public CreateResponderCommand()
+ {
+ super(CommandType.CREATE_RESPONDER);
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateSessionCommand.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateSessionCommand.java
new file mode 100644
index 0000000000..f6f59c26af
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateSessionCommand.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class CreateSessionCommand extends Command
+{
+ private String sessionName;
+ private String connectionName;
+ private int acknowledgeMode;
+
+ public CreateSessionCommand()
+ {
+ super(CommandType.CREATE_SESSION);
+ }
+
+ public String getSessionName()
+ {
+ return sessionName;
+ }
+
+ public void setSessionName(final String sessionName)
+ {
+ this.sessionName = sessionName;
+ }
+
+ public String getConnectionName()
+ {
+ return connectionName;
+ }
+
+ public void setConnectionName(final String connectionName)
+ {
+ this.connectionName = connectionName;
+ }
+
+ public int getAcknowledgeMode()
+ {
+ return acknowledgeMode;
+ }
+
+ public void setAcknowledgeMode(final int acknowledgeMode)
+ {
+ this.acknowledgeMode = acknowledgeMode;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/NoOpCommand.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/NoOpCommand.java
new file mode 100644
index 0000000000..1cdaf00163
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/NoOpCommand.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+
+public class NoOpCommand extends Command
+{
+ public NoOpCommand()
+ {
+ super(CommandType.NO_OP);
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/OutputAttribute.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/OutputAttribute.java
new file mode 100644
index 0000000000..b912eaa1cb
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/OutputAttribute.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+/**
+ * Marks an attribute of {@link ParticipantResult} that should be written to the test output file.
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface OutputAttribute
+{
+ ParticipantAttribute attribute();
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttribute.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttribute.java
new file mode 100644
index 0000000000..ccc7c0d9fb
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttribute.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import org.apache.qpid.disttest.client.Participant;
+
+/**
+ * Meta-date representing the attributes of {@link Participant} that we write to the test output file.
+ *
+ * Order of declaration is currently important - it determines they order they appear in the output.
+ *
+ * @see OutputAttribute
+ */
+public enum ParticipantAttribute
+{
+ TEST_NAME("testName"),
+ ITERATION_NUMBER("iterationNumber"),
+ CONFIGURED_CLIENT_NAME("clientName"),
+ PARTICIPANT_NAME("participantName"),
+ NUMBER_OF_MESSAGES_PROCESSED("numberOfMessages"),
+ PAYLOAD_SIZE("payloadSizeB"),
+ PRIORITY("priority"),
+ TIME_TO_LIVE("timeToLiveMs"),
+ ACKNOWLEDGE_MODE("acknowledgeMode"),
+ DELIVERY_MODE("deliveryMode"),
+ BATCH_SIZE("batchSize"),
+ MAXIMUM_DURATION("maximumDurationMs"),
+ PRODUCER_START_DELAY("producerStartDelayMs"),
+ PRODUCER_INTERVAL("producerIntervalMs"),
+ IS_TOPIC("isTopic"),
+ IS_DURABLE_SUBSCRIPTION("isDurableSubscription"),
+ IS_BROWSIING_SUBSCRIPTION("isBrowsingSubscription"),
+ IS_SELECTOR("isSelector"),
+ IS_NO_LOCAL("isNoLocal"),
+ IS_SYNCHRONOUS_CONSUMER("isSynchronousConsumer"),
+ TOTAL_NUMBER_OF_CONSUMERS("totalNumberOfConsumers"),
+ TOTAL_NUMBER_OF_PRODUCERS("totalNumberOfProducers"),
+ TOTAL_PAYLOAD_PROCESSED("totalPayloadProcessedB"),
+ THROUGHPUT("throughputKbPerS"),
+ TIME_TAKEN("timeTakenMs"),
+ ERROR_MESSAGE("errorMessage");
+
+ private String _displayName;
+
+ ParticipantAttribute(String displayName)
+ {
+ _displayName = displayName;
+ }
+
+ public String getDisplayName()
+ {
+ return _displayName;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttributeExtractor.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttributeExtractor.java
new file mode 100644
index 0000000000..95a19ceefc
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttributeExtractor.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import java.beans.PropertyDescriptor;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.beanutils.PropertyUtils;
+
+
+public class ParticipantAttributeExtractor
+{
+ public static Map<ParticipantAttribute, Object> getAttributes(Object targetObject)
+ {
+ Map<ParticipantAttribute, Object> attributes = new HashMap<ParticipantAttribute, Object>();
+
+
+ PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(targetObject);
+ for (PropertyDescriptor propertyDescriptor : descriptors)
+ {
+ final Method readMethod = getPropertyReadMethod(targetObject, propertyDescriptor);
+
+ for (Annotation annotation : readMethod.getDeclaredAnnotations())
+ {
+ if (annotation instanceof OutputAttribute)
+ {
+ OutputAttribute outputAttribute = (OutputAttribute) annotation;
+
+ Object value = getPropertyValue(targetObject, propertyDescriptor.getName());
+ attributes.put(outputAttribute.attribute(), value);
+ }
+ }
+ }
+
+ return attributes;
+ }
+
+ public static Method getPropertyReadMethod(Object targetObject, PropertyDescriptor propertyDescriptor)
+ {
+ final Method readMethod = propertyDescriptor.getReadMethod();
+
+ if (readMethod == null)
+ {
+ throw new RuntimeException("No read method for property " + propertyDescriptor.getName() + " on " + targetObject);
+ }
+ return readMethod;
+ }
+
+ public static Object getPropertyValue(Object targetObject, String propertyName)
+ {
+ try
+ {
+ return PropertyUtils.getProperty(targetObject, propertyName);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new RuntimeException("Couldn't get value of property " + propertyName + " from " + targetObject, e);
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new RuntimeException("Couldn't get value of property " + propertyName + " from " + targetObject, e);
+ }
+ catch (NoSuchMethodException e)
+ {
+ throw new RuntimeException("Couldn't get value of property " + propertyName + " from " + targetObject, e);
+ }
+
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantResult.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantResult.java
new file mode 100644
index 0000000000..a6d3d91bae
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantResult.java
@@ -0,0 +1,272 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import static org.apache.qpid.disttest.message.ParticipantAttribute.BATCH_SIZE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.CONFIGURED_CLIENT_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.ITERATION_NUMBER;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.MAXIMUM_DURATION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PAYLOAD_SIZE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.NUMBER_OF_MESSAGES_PROCESSED;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.THROUGHPUT;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PARTICIPANT_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TEST_NAME;
+
+import java.util.Comparator;
+import java.util.Date;
+import java.util.Map;
+
+public class ParticipantResult extends Response
+{
+ private String _testName;
+ private String _participantName;
+ private int _iterationNumber;
+
+ private long _startInMillis;
+ private long _endInMillis;
+ private int _batchSize;
+ private long _maximumDuration;
+
+ private String _configuredClientName;
+
+ private long _numberOfMessagesProcessed;
+ private long _totalPayloadProcessed;
+ private int _payloadSize;
+ private double _throughput;
+
+ private int _totalNumberOfConsumers;
+ private int _totalNumberOfProducers;
+
+ // As Session.SESSION_TRANSACTED is 0, we use value -1 so we can distinguish the case where an aggregated result
+ // summarizes results from participants using different session acknowledge modes.
+ private int _acknowledgeMode = -1;
+
+ public static final Comparator<? super ParticipantResult> PARTICIPANT_NAME_COMPARATOR = new Comparator<ParticipantResult>()
+ {
+ @Override
+ public int compare(ParticipantResult participantResult1, ParticipantResult participantResult2)
+ {
+ return participantResult1.getParticipantName().compareTo(participantResult2.getParticipantName());
+ }
+ };
+
+ public ParticipantResult()
+ {
+ this(CommandType.PARTICIPANT_RESULT);
+ }
+
+ public ParticipantResult(CommandType commandType)
+ {
+ super(commandType);
+ }
+
+ public ParticipantResult(String participantName)
+ {
+ this();
+ setParticipantName(participantName);
+ }
+
+ @OutputAttribute(attribute=TEST_NAME)
+ public String getTestName()
+ {
+ return _testName;
+ }
+
+ public void setTestName(String testName)
+ {
+ _testName = testName;
+ }
+
+ @OutputAttribute(attribute=ITERATION_NUMBER)
+ public int getIterationNumber()
+ {
+ return _iterationNumber;
+ }
+
+ public void setIterationNumber(int iterationNumber)
+ {
+ _iterationNumber = iterationNumber;
+ }
+
+ public void setStartDate(Date start)
+ {
+ _startInMillis = start.getTime();
+ }
+
+ public void setEndDate(Date end)
+ {
+ _endInMillis = end.getTime();
+ }
+
+ public Date getStartDate()
+ {
+ return new Date(_startInMillis);
+ }
+
+ public Date getEndDate()
+ {
+ return new Date(_endInMillis);
+ }
+
+
+ public long getStartInMillis()
+ {
+ return _startInMillis;
+ }
+
+ public long getEndInMillis()
+ {
+ return _endInMillis;
+ }
+
+
+ @OutputAttribute(attribute=PARTICIPANT_NAME)
+ public String getParticipantName()
+ {
+ return _participantName;
+ }
+
+
+ public void setParticipantName(String participantName)
+ {
+ _participantName = participantName;
+ }
+
+ @OutputAttribute(attribute=ParticipantAttribute.TIME_TAKEN)
+ public long getTimeTaken()
+ {
+ return _endInMillis - _startInMillis;
+ }
+
+ @OutputAttribute(attribute=CONFIGURED_CLIENT_NAME)
+ public String getConfiguredClientName()
+ {
+ return _configuredClientName;
+ }
+
+ public void setConfiguredClientName(String configuredClientName)
+ {
+ _configuredClientName = configuredClientName;
+ }
+
+ @OutputAttribute(attribute=NUMBER_OF_MESSAGES_PROCESSED)
+ public long getNumberOfMessagesProcessed()
+ {
+ return _numberOfMessagesProcessed;
+ }
+
+ public void setNumberOfMessagesProcessed(long numberOfMessagesProcessed)
+ {
+ _numberOfMessagesProcessed = numberOfMessagesProcessed;
+ }
+
+ @OutputAttribute(attribute=ParticipantAttribute.TOTAL_PAYLOAD_PROCESSED)
+ public long getTotalPayloadProcessed()
+ {
+ return _totalPayloadProcessed;
+ }
+
+ @OutputAttribute(attribute = PAYLOAD_SIZE)
+ public int getPayloadSize()
+ {
+ return _payloadSize;
+ }
+
+ public void setPayloadSize(int payloadSize)
+ {
+ _payloadSize = payloadSize;
+ }
+
+ public void setTotalPayloadProcessed(long totalPayloadProcessed)
+ {
+ _totalPayloadProcessed = totalPayloadProcessed;
+ }
+
+ public Map<ParticipantAttribute, Object> getAttributes()
+ {
+ return ParticipantAttributeExtractor.getAttributes(this);
+ }
+
+ public void setBatchSize(int batchSize)
+ {
+ _batchSize = batchSize;
+ }
+
+ @OutputAttribute(attribute=BATCH_SIZE)
+ public int getBatchSize()
+ {
+ return _batchSize;
+ }
+
+ public void setMaximumDuration(long maximumDuration)
+ {
+ _maximumDuration = maximumDuration;
+ }
+
+ @OutputAttribute(attribute=MAXIMUM_DURATION)
+ public long getMaximumDuration()
+ {
+ return _maximumDuration;
+ }
+
+ @OutputAttribute(attribute=THROUGHPUT)
+ public double getThroughput()
+ {
+ return _throughput;
+ }
+
+ public void setThroughput(double throughput)
+ {
+ _throughput = throughput;
+ }
+
+ public void setTotalNumberOfConsumers(int totalNumberOfConsumers)
+ {
+ _totalNumberOfConsumers = totalNumberOfConsumers;
+ }
+
+ @OutputAttribute(attribute=ParticipantAttribute.TOTAL_NUMBER_OF_CONSUMERS)
+ public int getTotalNumberOfConsumers()
+ {
+ return _totalNumberOfConsumers;
+ }
+
+ public void setTotalNumberOfProducers(int totalNumberOfProducers)
+ {
+ _totalNumberOfProducers = totalNumberOfProducers;
+ }
+
+ @OutputAttribute(attribute=ParticipantAttribute.TOTAL_NUMBER_OF_PRODUCERS)
+ public int getTotalNumberOfProducers()
+ {
+ return _totalNumberOfProducers;
+ }
+
+ @OutputAttribute(attribute=ParticipantAttribute.ACKNOWLEDGE_MODE)
+ public int getAcknowledgeMode()
+ {
+ return _acknowledgeMode;
+ }
+
+ public void setAcknowledgeMode(int acknowledgeMode)
+ {
+ _acknowledgeMode = acknowledgeMode;
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/ProducerParticipantResult.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/ProducerParticipantResult.java
new file mode 100644
index 0000000000..766c90eec8
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/ProducerParticipantResult.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import static org.apache.qpid.disttest.message.ParticipantAttribute.DELIVERY_MODE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRIORITY;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRODUCER_INTERVAL;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRODUCER_START_DELAY;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TIME_TO_LIVE;
+
+public class ProducerParticipantResult extends ParticipantResult
+{
+ private int _priority;
+ private long _timeToLive;
+ private long _startDelay;
+ private long _interval;
+ private int _deliveryMode;
+ public ProducerParticipantResult()
+ {
+ super(CommandType.PRODUCER_PARTICIPANT_RESULT);
+ }
+
+ public ProducerParticipantResult(String participantName)
+ {
+ this();
+ setParticipantName(participantName);
+ }
+
+ @OutputAttribute(attribute=PRIORITY)
+ public int getPriority()
+ {
+ return _priority;
+ }
+
+ public void setPriority(int priority)
+ {
+ _priority = priority;
+ }
+
+ @OutputAttribute(attribute=TIME_TO_LIVE)
+ public long getTimeToLive()
+ {
+ return _timeToLive;
+ }
+
+ public void setTimeToLive(long timeToLive)
+ {
+ _timeToLive = timeToLive;
+ }
+
+ @OutputAttribute(attribute=PRODUCER_START_DELAY)
+ public long getStartDelay()
+ {
+ return _startDelay;
+ }
+
+ public void setStartDelay(long startDelay)
+ {
+ _startDelay = startDelay;
+ }
+
+ @OutputAttribute(attribute=PRODUCER_INTERVAL)
+ public long getInterval()
+ {
+ return _interval;
+ }
+
+ public void setInterval(long producerInterval)
+ {
+ _interval = producerInterval;
+ }
+
+ @OutputAttribute(attribute=DELIVERY_MODE)
+ public int getDeliveryMode()
+ {
+ return _deliveryMode;
+ }
+
+ public void setDeliveryMode(int deliveryMode)
+ {
+ this._deliveryMode = deliveryMode;
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/RegisterClientCommand.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/RegisterClientCommand.java
new file mode 100644
index 0000000000..af880a37d9
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/RegisterClientCommand.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class RegisterClientCommand extends Command
+{
+ private final String _clientName;
+ private final String _clientQueueName;
+
+ public RegisterClientCommand(final String clientName, final String clientQueueName)
+ {
+ super(CommandType.REGISTER_CLIENT);
+ _clientName = clientName;
+ _clientQueueName = clientQueueName;
+ }
+
+ public String getClientName()
+ {
+ return _clientName;
+ }
+
+ public String getClientQueueName()
+ {
+ return _clientQueueName;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/Response.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/Response.java
new file mode 100644
index 0000000000..aac056efcb
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/Response.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+
+public class Response extends Command
+{
+ protected String _registeredClientName;
+ protected String _errorMessage;
+ private CommandType _inReplyToCommandType;
+
+ public Response(final String registeredclientName, final CommandType inReplyToCommandType, final String errorMessage)
+ {
+ super(CommandType.RESPONSE);
+ _registeredClientName = registeredclientName;
+ _errorMessage = errorMessage;
+ _inReplyToCommandType = inReplyToCommandType;
+ }
+
+ public Response(String clientName, CommandType inReplyToCommandType)
+ {
+ this(clientName, inReplyToCommandType, null);
+ }
+
+ /**
+ * Provided so that subclasses can call super(commandType)
+ */
+ protected Response(CommandType commandType)
+ {
+ super(commandType);
+ }
+
+ public String getRegisteredClientName()
+ {
+ return _registeredClientName;
+ }
+
+ public void setRegisteredClientName(String registeredClientName)
+ {
+ _registeredClientName = registeredClientName;
+ }
+
+ @OutputAttribute(attribute=ParticipantAttribute.ERROR_MESSAGE)
+ public String getErrorMessage()
+ {
+ return _errorMessage;
+ }
+
+ public void setErrorMessage(String errorMessage)
+ {
+ _errorMessage = errorMessage;
+ }
+
+ public boolean hasError()
+ {
+ return _errorMessage != null;
+ }
+
+ public CommandType getInReplyToCommandType()
+ {
+ return _inReplyToCommandType;
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/StartTestCommand.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/StartTestCommand.java
new file mode 100644
index 0000000000..4a53697ecd
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/StartTestCommand.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+public class StartTestCommand extends Command
+{
+
+ public StartTestCommand()
+ {
+ super(CommandType.START_TEST);
+ }
+
+} \ No newline at end of file
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/StopClientCommand.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/StopClientCommand.java
new file mode 100644
index 0000000000..08758aaa69
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/StopClientCommand.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class StopClientCommand extends Command
+{
+ public StopClientCommand()
+ {
+ super(CommandType.STOP_CLIENT);
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/message/TearDownTestCommand.java b/java/perftests/src/main/java/org/apache/qpid/disttest/message/TearDownTestCommand.java
new file mode 100644
index 0000000000..6b1367d4f9
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/message/TearDownTestCommand.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+public class TearDownTestCommand extends Command
+{
+
+ public TearDownTestCommand()
+ {
+ super(CommandType.TEAR_DOWN_TEST);
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/AggregatedTestResult.java b/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/AggregatedTestResult.java
new file mode 100644
index 0000000000..5e6da2e65b
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/AggregatedTestResult.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+
+public class AggregatedTestResult implements ITestResult
+{
+ private ParticipantResult _allParticipantResult;
+ private ParticipantResult _allConsumerParticipantResult;
+ private ParticipantResult _allProducerParticipantResult;
+ private final ITestResult _originalTestResult;
+
+ public AggregatedTestResult(ITestResult originalTestResult)
+ {
+ _originalTestResult = originalTestResult;
+ }
+
+ /**
+ * Returns the result where {@link ParticipantResult#getNumberOfMessagesProcessed()}
+ * is the total number of messages consumed during the test, and {@link ParticipantResult#getTimeTaken()}
+ * is the time between the start of the first producer and the end of the last consumer to finish.
+ */
+ public ParticipantResult getAllParticipantResult()
+ {
+ return _allParticipantResult;
+ }
+
+ public void setAllParticipantResult(ParticipantResult allParticipantResult)
+ {
+ _allParticipantResult = allParticipantResult;
+ }
+
+ public ParticipantResult getAllConsumerParticipantResult()
+ {
+ return _allConsumerParticipantResult;
+ }
+ public void setAllConsumerParticipantResult(ParticipantResult allConsumerParticipantResult)
+ {
+ _allConsumerParticipantResult = allConsumerParticipantResult;
+ }
+ public ParticipantResult getAllProducerParticipantResult()
+ {
+ return _allProducerParticipantResult;
+ }
+ public void setAllProducerParticipantResult(ParticipantResult allProducerParticipantResult)
+ {
+ _allProducerParticipantResult = allProducerParticipantResult;
+ }
+
+ // TODO should weaken to Collection
+ @Override
+ public List<ParticipantResult> getParticipantResults()
+ {
+ List<ParticipantResult> allParticipantResults = new ArrayList<ParticipantResult>(_originalTestResult.getParticipantResults());
+
+ allParticipantResults.add(_allConsumerParticipantResult);
+ allParticipantResults.add(_allProducerParticipantResult);
+ allParticipantResults.add(_allParticipantResult);
+
+ return allParticipantResults;
+ }
+
+ @Override
+ public boolean hasErrors()
+ {
+ return _originalTestResult.hasErrors();
+ }
+
+ @Override
+ public String getName()
+ {
+ return _originalTestResult.getName();
+ }
+
+
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/Aggregator.java b/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/Aggregator.java
new file mode 100644
index 0000000000..cde30d36e5
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/Aggregator.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+
+public class Aggregator
+{
+
+ private TestResultAggregator _testResultAggregator = new TestResultAggregator();
+
+ public ResultsForAllTests aggregateResults(ResultsForAllTests rawResultsForAllTests)
+ {
+
+ ResultsForAllTests aggregatedResultsForAllTests = new ResultsForAllTests();
+
+
+ for (ITestResult testResult : rawResultsForAllTests.getTestResults())
+ {
+ AggregatedTestResult aggregateTestResult = _testResultAggregator.aggregateTestResult(testResult);
+ aggregatedResultsForAllTests.add(aggregateTestResult);
+ }
+
+
+ return aggregatedResultsForAllTests;
+ }
+
+ void setTestResultAggregator(TestResultAggregator testResultAggregator)
+ {
+ _testResultAggregator = testResultAggregator;
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ITestResult.java b/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ITestResult.java
new file mode 100644
index 0000000000..3f9cdff69d
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ITestResult.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import java.util.List;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+
+// TODO rename me!!
+public interface ITestResult
+{
+
+ // TODO should weaken to Collection
+ List<ParticipantResult> getParticipantResults();
+
+ boolean hasErrors();
+
+ String getName();
+
+} \ No newline at end of file
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregator.java b/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregator.java
new file mode 100644
index 0000000000..207d0131eb
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregator.java
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import java.util.Date;
+import java.util.NavigableSet;
+import java.util.TreeSet;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+
+public class ParticipantResultAggregator
+{
+ private final String _aggregatedResultName;
+ private final Class<? extends ParticipantResult> _targetClass;
+
+ private long _minStartDate = Long.MAX_VALUE;
+ private long _maxEndDate = 0;
+ private long _numberOfMessagesProcessed = 0;
+ private long _totalPayloadProcessed = 0;
+
+ private int _totalNumberOfConsumers = 0;
+ private int _totalNumberOfProducers = 0;
+
+ private NavigableSet<Integer> _encounteredPayloadSizes = new TreeSet<Integer>();
+ private NavigableSet<Integer> _encounteredIterationNumbers = new TreeSet<Integer>();
+ private NavigableSet<Integer> _encounteredBatchSizes = new TreeSet<Integer>();
+ private NavigableSet<Integer> _encounteredAcknowledgeMode = new TreeSet<Integer>();
+ private NavigableSet<String> _encountedTestNames = new TreeSet<String>();
+
+ public ParticipantResultAggregator(Class<? extends ParticipantResult> targetClass, String aggregateResultName)
+ {
+ _aggregatedResultName = aggregateResultName;
+ _targetClass = targetClass;
+ }
+
+ public void aggregate(ParticipantResult result)
+ {
+ if (isAggregatable(result))
+ {
+ rollupConstantAttributes(result);
+ computeVariableAttributes(result);
+ }
+ }
+
+ public ParticipantResult getAggregatedResult()
+ {
+ ParticipantResult aggregatedResult = new ParticipantResult(_aggregatedResultName);
+
+ setRolledUpConstantAttributes(aggregatedResult);
+ setComputedVariableAttributes(aggregatedResult);
+
+ return aggregatedResult;
+ }
+
+ private boolean isAggregatable(ParticipantResult result)
+ {
+ return _targetClass.isAssignableFrom(result.getClass());
+ }
+
+ private void computeVariableAttributes(ParticipantResult result)
+ {
+ _numberOfMessagesProcessed += result.getNumberOfMessagesProcessed();
+ _totalPayloadProcessed += result.getTotalPayloadProcessed();
+ _totalNumberOfConsumers += result.getTotalNumberOfConsumers();
+ _totalNumberOfProducers += result.getTotalNumberOfProducers();
+ _minStartDate = Math.min(_minStartDate, result.getStartInMillis());
+ _maxEndDate = Math.max(_maxEndDate, result.getEndInMillis());
+ }
+
+ private void rollupConstantAttributes(ParticipantResult result)
+ {
+ if (result.getTestName() != null)
+ {
+ _encountedTestNames.add(result.getTestName());
+ }
+ _encounteredPayloadSizes.add(result.getPayloadSize());
+ _encounteredIterationNumbers.add(result.getIterationNumber());
+ _encounteredBatchSizes.add(result.getBatchSize());
+ _encounteredAcknowledgeMode.add(result.getAcknowledgeMode());
+ }
+
+ private void setComputedVariableAttributes(ParticipantResult aggregatedResult)
+ {
+ aggregatedResult.setNumberOfMessagesProcessed(_numberOfMessagesProcessed);
+ aggregatedResult.setTotalPayloadProcessed(_totalPayloadProcessed);
+ aggregatedResult.setTotalNumberOfConsumers(_totalNumberOfConsumers);
+ aggregatedResult.setTotalNumberOfProducers(_totalNumberOfProducers);
+ aggregatedResult.setStartDate(new Date(_minStartDate));
+ aggregatedResult.setEndDate(new Date(_maxEndDate));
+ aggregatedResult.setThroughput(calculateThroughputInKiloBytesPerSecond());
+ }
+
+ private void setRolledUpConstantAttributes(ParticipantResult aggregatedResult)
+ {
+ if (_encounteredIterationNumbers.size() == 1)
+ {
+ aggregatedResult.setIterationNumber( _encounteredIterationNumbers.first());
+ }
+ if (_encounteredPayloadSizes.size() == 1)
+ {
+ aggregatedResult.setPayloadSize(_encounteredPayloadSizes.first());
+ }
+ if (_encountedTestNames.size() == 1)
+ {
+ aggregatedResult.setTestName(_encountedTestNames.first());
+ }
+ if (_encounteredBatchSizes.size() == 1)
+ {
+ aggregatedResult.setBatchSize(_encounteredBatchSizes.first());
+ }
+ if (_encounteredAcknowledgeMode.size() == 1)
+ {
+ aggregatedResult.setAcknowledgeMode(_encounteredAcknowledgeMode.first());
+ }
+ }
+
+ private double calculateThroughputInKiloBytesPerSecond()
+ {
+ double durationInMillis = _maxEndDate - _minStartDate;
+ double durationInSeconds = durationInMillis / 1000;
+ double totalPayloadProcessedInKiloBytes = ((double)_totalPayloadProcessed) / 1024;
+
+ return totalPayloadProcessedInKiloBytes/durationInSeconds;
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregator.java b/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregator.java
new file mode 100644
index 0000000000..5934e0e997
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregator.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+
+public class TestResultAggregator
+{
+ static final String AGGREGATED_ERROR_MESSAGE = "One or more participants reported errors.";
+ public static final String ALL_PARTICIPANTS_NAME = "All";
+ public static final String ALL_PRODUCER_PARTICIPANTS_NAME = "All Producers";
+ public static final String ALL_CONSUMER_PARTICIPANTS_NAME = "All Consumers";
+
+ public AggregatedTestResult aggregateTestResult(ITestResult originalTestResult)
+ {
+ ParticipantResultAggregator consumerResultAggregator = new ParticipantResultAggregator(ConsumerParticipantResult.class,
+ ALL_CONSUMER_PARTICIPANTS_NAME);
+ ParticipantResultAggregator producerResultAggregator = new ParticipantResultAggregator(ProducerParticipantResult.class,
+ ALL_PRODUCER_PARTICIPANTS_NAME);
+ ParticipantResultAggregator aggregatedResultsAggregator = new ParticipantResultAggregator(ParticipantResult.class,
+ ALL_PARTICIPANTS_NAME);
+
+ boolean hasError = aggregateOriginalResults(originalTestResult,
+ consumerResultAggregator,
+ producerResultAggregator);
+
+ ParticipantResult aggregatedProducerResult = producerResultAggregator.getAggregatedResult();
+ ParticipantResult aggregaredConsumerResult = consumerResultAggregator.getAggregatedResult();
+
+ ParticipantResult aggregatedAllResult = aggregateAggregatedResults(
+ aggregatedResultsAggregator, aggregatedProducerResult,
+ aggregaredConsumerResult);
+
+ applyNonAggregateablesToAll(aggregatedAllResult,
+ aggregatedProducerResult, aggregaredConsumerResult);
+
+ AggregatedTestResult newTestResult = new AggregatedTestResult(originalTestResult);
+ newTestResult.setAllProducerParticipantResult(aggregatedProducerResult);
+ newTestResult.setAllConsumerParticipantResult(aggregaredConsumerResult);
+ newTestResult.setAllParticipantResult(aggregatedAllResult);
+
+ if (hasError)
+ {
+ aggregatedAllResult.setErrorMessage(TestResultAggregator.AGGREGATED_ERROR_MESSAGE);
+ }
+
+ return newTestResult;
+ }
+
+ private ParticipantResult aggregateAggregatedResults(
+ ParticipantResultAggregator aggregatedResultsAggregator,
+ ParticipantResult aggregatedProducerResult,
+ ParticipantResult aggregaredConsumerResult)
+ {
+ aggregatedResultsAggregator.aggregate(aggregatedProducerResult);
+ aggregatedResultsAggregator.aggregate(aggregaredConsumerResult);
+ ParticipantResult aggregatedAllResult = aggregatedResultsAggregator.getAggregatedResult();
+ return aggregatedAllResult;
+ }
+
+ private boolean aggregateOriginalResults(ITestResult originalTestResult,
+ ParticipantResultAggregator consumerParticipantResultAggregator,
+ ParticipantResultAggregator producerParticipantResultAggregator)
+ {
+ boolean hasError = false;
+ for (ParticipantResult result : originalTestResult.getParticipantResults())
+ {
+ consumerParticipantResultAggregator.aggregate(result);
+ producerParticipantResultAggregator.aggregate(result);
+
+ if (result.hasError())
+ {
+ hasError = true;
+ }
+ }
+ return hasError;
+ }
+
+ private void applyNonAggregateablesToAll(ParticipantResult aggregatedAllResult, ParticipantResult aggregatedProducerResult, ParticipantResult aggregatedConsumerResult)
+ {
+ aggregatedAllResult.setStartDate(aggregatedProducerResult.getStartDate());
+ aggregatedAllResult.setEndDate(aggregatedConsumerResult.getEndDate());
+
+ aggregatedAllResult.setNumberOfMessagesProcessed(aggregatedConsumerResult.getNumberOfMessagesProcessed());
+ aggregatedAllResult.setTotalPayloadProcessed(aggregatedConsumerResult.getTotalPayloadProcessed());
+ aggregatedAllResult.setThroughput(aggregatedConsumerResult.getThroughput());
+ }
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVFormater.java b/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVFormater.java
new file mode 100644
index 0000000000..52e53ca624
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVFormater.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.formatting;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+import org.apache.qpid.disttest.message.ParticipantAttribute;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.ITestResult;
+
+/**
+ * produces CSV output using the ordered enums in {@link ParticipantAttribute}
+ */
+public class CSVFormater
+{
+ public String format(ResultsForAllTests results)
+ {
+ StringBuilder builder = new StringBuilder();
+
+ builder.append(header());
+
+ List<ITestResult> testResults = results.getTestResults();
+
+ for (ITestResult testResult : testResults)
+ {
+
+ List<ParticipantResult> participantResults = new ArrayList<ParticipantResult>(testResult.getParticipantResults());
+ Collections.sort(participantResults, new CSVOrderParticipantResultComparator());
+
+ for (ParticipantResult participantResult : participantResults)
+ {
+ Map<ParticipantAttribute, Object> attributes = participantResult.getAttributes();
+ builder.append(row(attributes));
+ }
+ }
+
+ return builder.toString();
+ }
+
+ /**
+ * return a row, including a newline character at the end
+ */
+ private String row(Map<ParticipantAttribute, Object> attributeValueMap)
+ {
+ List<Object> attributeValues = new ArrayList<Object>();
+ for (ParticipantAttribute attribute : ParticipantAttribute.values())
+ {
+ attributeValues.add(attributeValueMap.get(attribute));
+ }
+
+ String row = StringUtils.join(attributeValues.toArray(), ",");
+ return row + "\n";
+ }
+
+ /** return the header row, including a newline at the end */
+ private String header()
+ {
+ List<String> displayNames = new ArrayList<String>();
+ for (ParticipantAttribute attribute : ParticipantAttribute.values())
+ {
+ displayNames.add(attribute.getDisplayName());
+ }
+
+ String header = StringUtils.join(displayNames.toArray(), ",");
+ return header + "\n";
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparator.java b/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparator.java
new file mode 100644
index 0000000000..0e1fbbc3c6
--- /dev/null
+++ b/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparator.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.formatting;
+
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang.builder.CompareToBuilder;
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+
+public class CSVOrderParticipantResultComparator implements Comparator<ParticipantResult>
+{
+ // TODO yuk
+ private static final Map<Class<? extends ParticipantResult>, Integer> TYPE_CODES = new HashMap<Class<? extends ParticipantResult>, Integer>();
+ static {
+ TYPE_CODES.put(ProducerParticipantResult.class, 0);
+ TYPE_CODES.put(ConsumerParticipantResult.class, 1);
+ TYPE_CODES.put(ParticipantResult.class, 2);
+ }
+
+ @Override
+ public int compare(ParticipantResult left, ParticipantResult right)
+ {
+ return new CompareToBuilder()
+ .append(getTypeCode(left), getTypeCode(right))
+ .append(left.getParticipantName(), right.getParticipantName())
+ .toComparison();
+ }
+
+
+ private int getTypeCode(ParticipantResult participantResult)
+ {
+ return TYPE_CODES.get(participantResult.getClass());
+ }
+
+}
diff --git a/java/perftests/src/main/java/org/apache/qpid/oldtopic/Config.java b/java/perftests/src/main/java/org/apache/qpid/oldtopic/Config.java
deleted file mode 100644
index 5b6169ed2d..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/oldtopic/Config.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.oldtopic;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.config.ConnectorConfig;
-import org.apache.qpid.config.ConnectionFactoryInitialiser;
-import org.apache.qpid.config.Connector;
-import org.apache.qpid.config.AbstractConfig;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-
-class Config extends AbstractConfig implements ConnectorConfig
-{
-
- private String host = "localhost";
- private int port = 5672;
- private String factory = null;
-
- private int payload = 256;
- private int messages = 1000;
- private int clients = 1;
- private int batch = 1;
- private long delay = 1;
- private int warmup;
- private int ackMode= AMQSession.NO_ACKNOWLEDGE;
- private String clientId;
- private String subscriptionId;
- private boolean persistent;
-
- public Config()
- {
- }
-
- int getAckMode()
- {
- return ackMode;
- }
-
- void setPayload(int payload)
- {
- this.payload = payload;
- }
-
- int getPayload()
- {
- return payload;
- }
-
- void setClients(int clients)
- {
- this.clients = clients;
- }
-
- int getClients()
- {
- return clients;
- }
-
- void setMessages(int messages)
- {
- this.messages = messages;
- }
-
- int getMessages()
- {
- return messages;
- }
-
- public String getHost()
- {
- return host;
- }
-
- public void setHost(String host)
- {
- this.host = host;
- }
-
- public int getPort()
- {
- return port;
- }
-
- public String getFactory()
- {
- return factory;
- }
-
- public void setPort(int port)
- {
- this.port = port;
- }
-
- int getBatch()
- {
- return batch;
- }
-
- void setBatch(int batch)
- {
- this.batch = batch;
- }
-
- int getWarmup()
- {
- return warmup;
- }
-
- void setWarmup(int warmup)
- {
- this.warmup = warmup;
- }
-
- public long getDelay()
- {
- return delay;
- }
-
- public void setDelay(long delay)
- {
- this.delay = delay;
- }
-
- String getClientId()
- {
- return clientId;
- }
-
- String getSubscriptionId()
- {
- return subscriptionId;
- }
-
- boolean usePersistentMessages()
- {
- return persistent;
- }
-
- public void setOption(String key, String value)
- {
- if("-host".equalsIgnoreCase(key))
- {
- setHost(value);
- }
- else if("-port".equalsIgnoreCase(key))
- {
- try
- {
- setPort(Integer.parseInt(value));
- }
- catch(NumberFormatException e)
- {
- throw new RuntimeException("Bad port number: " + value);
- }
- }
- else if("-payload".equalsIgnoreCase(key))
- {
- setPayload(parseInt("Bad payload size", value));
- }
- else if("-messages".equalsIgnoreCase(key))
- {
- setMessages(parseInt("Bad message count", value));
- }
- else if("-clients".equalsIgnoreCase(key))
- {
- setClients(parseInt("Bad client count", value));
- }
- else if("-batch".equalsIgnoreCase(key))
- {
- setBatch(parseInt("Bad batch count", value));
- }
- else if("-delay".equalsIgnoreCase(key))
- {
- setDelay(parseLong("Bad batch delay", value));
- }
- else if("-warmup".equalsIgnoreCase(key))
- {
- setWarmup(parseInt("Bad warmup count", value));
- }
- else if("-ack".equalsIgnoreCase(key))
- {
- ackMode = parseInt("Bad ack mode", value);
- }
- else if("-factory".equalsIgnoreCase(key))
- {
- factory = value;
- }
- else if("-clientId".equalsIgnoreCase(key))
- {
- clientId = value;
- }
- else if("-subscriptionId".equalsIgnoreCase(key))
- {
- subscriptionId = value;
- }
- else if("-persistent".equalsIgnoreCase(key))
- {
- persistent = "true".equalsIgnoreCase(value);
- }
- else
- {
- System.out.println("Ignoring unrecognised option: " + key);
- }
- }
-
- static String getAckModeDescription(int ackMode)
- {
- switch(ackMode)
- {
- case AMQSession.NO_ACKNOWLEDGE: return "NO_ACKNOWLEDGE";
- case AMQSession.AUTO_ACKNOWLEDGE: return "AUTO_ACKNOWLEDGE";
- case AMQSession.CLIENT_ACKNOWLEDGE: return "CLIENT_ACKNOWLEDGE";
- case AMQSession.DUPS_OK_ACKNOWLEDGE: return "DUPS_OK_ACKNOWELDGE";
- case AMQSession.PRE_ACKNOWLEDGE: return "PRE_ACKNOWLEDGE";
- }
- return "AckMode=" + ackMode;
- }
-
- public Connection createConnection() throws Exception
- {
- return new Connector().createConnection(this);
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/oldtopic/Listener.java b/java/perftests/src/main/java/org/apache/qpid/oldtopic/Listener.java
deleted file mode 100644
index 4732782d4c..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/oldtopic/Listener.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.oldtopic;
-import org.apache.log4j.*;
-import javax.jms.Connection;
-import javax.jms.Message;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-public class Listener implements MessageListener
-{
- private final Connection _connection;
- private final MessageProducer _controller;
- private final javax.jms.Session _session;
- private final MessageFactory _factory;
- private boolean init;
- private int count;
- private long start;
-
- Listener(Connection connection, int ackMode) throws Exception
- {
- this(connection, ackMode, null);
- }
-
- Listener(Connection connection, int ackMode, String name) throws Exception
- {
- _connection = connection;
- _session = connection.createSession(false, ackMode);
- _factory = new MessageFactory(_session);
-
- //register for events
- if(name == null)
- {
- _factory.createTopicConsumer().setMessageListener(this);
- }
- else
- {
- _factory.createDurableTopicConsumer(name).setMessageListener(this);
- }
-
- _connection.start();
-
- _controller = _factory.createControlPublisher();
- System.out.println("Waiting for messages " +
- Config.getAckModeDescription(ackMode)
- + (name == null ? "" : " (subscribed with name " + name + " and client id " + connection.getClientID() + ")")
- + "...");
-
- }
-
- private void shutdown()
- {
- try
- {
- _session.close();
- _connection.stop();
- _connection.close();
- }
- catch(Exception e)
- {
- e.printStackTrace(System.out);
- }
- }
-
- private void report()
- {
- try
- {
- String msg = getReport();
- _controller.send(_factory.createReportResponseMessage(msg));
- System.out.println("Sent report: " + msg);
- }
- catch(Exception e)
- {
- e.printStackTrace(System.out);
- }
- }
-
- private String getReport()
- {
- long time = (System.currentTimeMillis() - start);
- return "Received " + count + " in " + time + "ms";
- }
-
- public void onMessage(Message message)
- {
- if(!init)
- {
- start = System.currentTimeMillis();
- count = 0;
- init = true;
- }
-
- if(_factory.isShutdown(message))
- {
- shutdown();
- }
- else if(_factory.isReport(message))
- {
- //send a report:
- report();
- init = false;
- }
- else if (++count % 100 == 0)
- {
- System.out.println("Received " + count + " messages.");
- }
- }
-
- public static void main(String[] argv) throws Exception
- {
- Config config = new Config();
- config.setOptions(argv);
-
- Connection con = config.createConnection();
- if(config.getClientId() != null)
- {
- con.setClientID(config.getClientId());
- }
- new Listener(con, config.getAckMode(), config.getSubscriptionId());
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/oldtopic/MessageFactory.java b/java/perftests/src/main/java/org/apache/qpid/oldtopic/MessageFactory.java
deleted file mode 100644
index b2fbeb7e35..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/oldtopic/MessageFactory.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.oldtopic;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.client.AMQTopic;
-
-import javax.jms.*;
-
-/**
- */
-class MessageFactory
-{
- private static final char[] DATA = "abcdefghijklmnopqrstuvwxyz".toCharArray();
-
- private final Session _session;
- private final Topic _topic;
- private final Topic _control;
- private final byte[] _payload;
-
-
- MessageFactory(Session session) throws JMSException
- {
- this(session, 256);
- }
-
- MessageFactory(Session session, int size) throws JMSException
- {
- _session = session;
-/* if(session instanceof AMQSession)
- {
- _topic = new AMQTopic("topictest.messages");
- _control = new AMQTopic("topictest.control");
- }
- else*/
- {
- _topic = session.createTopic("topictest.messages");
- _control = session.createTopic("topictest.control");
- }
- _payload = new byte[size];
-
- for(int i = 0; i < size; i++)
- {
- _payload[i] = (byte) DATA[i % DATA.length];
- }
- }
-
- Topic getTopic()
- {
- return _topic;
- }
-
- Message createEventMessage() throws JMSException
- {
- BytesMessage msg = _session.createBytesMessage();
- msg.writeBytes(_payload);
- return msg;
- }
-
- Message createShutdownMessage() throws JMSException
- {
- return _session.createTextMessage("SHUTDOWN");
- }
-
- Message createReportRequestMessage() throws JMSException
- {
- return _session.createTextMessage("REPORT");
- }
-
- Message createReportResponseMessage(String msg) throws JMSException
- {
- return _session.createTextMessage(msg);
- }
-
- boolean isShutdown(Message m)
- {
- return checkText(m, "SHUTDOWN");
- }
-
- boolean isReport(Message m)
- {
- return checkText(m, "REPORT");
- }
-
- Object getReport(Message m)
- {
- try
- {
- return ((TextMessage) m).getText();
- }
- catch (JMSException e)
- {
- e.printStackTrace(System.out);
- return e.toString();
- }
- }
-
- MessageConsumer createTopicConsumer() throws Exception
- {
- return _session.createConsumer(_topic);
- }
-
- MessageConsumer createDurableTopicConsumer(String name) throws Exception
- {
- return _session.createDurableSubscriber(_topic, name);
- }
-
- MessageConsumer createControlConsumer() throws Exception
- {
- return _session.createConsumer(_control);
- }
-
- MessageProducer createTopicPublisher() throws Exception
- {
- return _session.createProducer(_topic);
- }
-
- MessageProducer createControlPublisher() throws Exception
- {
- return _session.createProducer(_control);
- }
-
- private static boolean checkText(Message m, String s)
- {
- try
- {
- return m instanceof TextMessage && ((TextMessage) m).getText().equals(s);
- }
- catch (JMSException e)
- {
- e.printStackTrace(System.out);
- return false;
- }
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/oldtopic/Publisher.java b/java/perftests/src/main/java/org/apache/qpid/oldtopic/Publisher.java
deleted file mode 100644
index 841fcc63ad..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/oldtopic/Publisher.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.oldtopic;
-
-import javax.jms.*;
-
-public class Publisher implements MessageListener
-{
- private final Object _lock = new Object();
- private final Connection _connection;
- private final Session _session;
- private final MessageFactory _factory;
- private final MessageProducer _publisher;
- private int _count;
-
- Publisher(Connection connection, int size, int ackMode, boolean persistent) throws Exception
- {
- _connection = connection;
- _session = _connection.createSession(false, ackMode);
- _factory = new MessageFactory(_session, size);
- _publisher = _factory.createTopicPublisher();
- _publisher.setDeliveryMode(persistent ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT);
- System.out.println("Publishing " + (persistent ? "persistent" : "non-persistent") + " messages of " + size + " bytes, " + Config.getAckModeDescription(ackMode) + ".");
- }
-
- private void test(Config config) throws Exception
- {
- test(config.getBatch(), config.getDelay(), config.getMessages(), config.getClients(), config.getWarmup());
- }
-
- private void test(int batches, long delay, int msgCount, int consumerCount, int warmup) throws Exception
- {
- _factory.createControlConsumer().setMessageListener(this);
- _connection.start();
-
- if(warmup > 0)
- {
- System.out.println("Runing warmup (" + warmup + " msgs)");
- long time = batch(warmup, consumerCount);
- System.out.println("Warmup completed in " + time + "ms");
- }
-
- long[] times = new long[batches];
- for(int i = 0; i < batches; i++)
- {
- if(i > 0)
- {
- Thread.sleep(delay*1000);
- }
- times[i] = batch(msgCount, consumerCount);
- System.out.println("Batch " + (i+1) + " of " + batches + " completed in " + times[i] + " ms.");
- }
-
- long min = min(times);
- long max = max(times);
- System.out.println("min: " + min + ", max: " + max + " avg: " + avg(times, min, max));
-
- //request shutdown
- _publisher.send(_factory.createShutdownMessage());
-
- _connection.stop();
- _connection.close();
- }
-
- private long batch(int msgCount, int consumerCount) throws Exception
- {
- _count = consumerCount;
- long start = System.currentTimeMillis();
- publish(msgCount);
- waitForCompletion(consumerCount);
- return System.currentTimeMillis() - start;
- }
-
- private void publish(int count) throws Exception
- {
-
- //send events
- for (int i = 0; i < count; i++)
- {
- _publisher.send(_factory.createEventMessage());
- if ((i + 1) % 100 == 0)
- {
- System.out.println("Sent " + (i + 1) + " messages");
- }
- }
-
- //request report
- _publisher.send(_factory.createReportRequestMessage());
- }
-
- private void waitForCompletion(int consumers) throws Exception
- {
- System.out.println("Waiting for completion...");
- synchronized (_lock)
- {
- while (_count > 0)
- {
- _lock.wait();
- }
- }
- }
-
-
- public void onMessage(Message message)
- {
- System.out.println("Received report " + _factory.getReport(message) + " " + --_count + " remaining");
- if (_count == 0)
- {
- synchronized (_lock)
- {
- _lock.notify();
- }
- }
- }
-
- static long min(long[] times)
- {
- long min = times.length > 0 ? times[0] : 0;
- for(int i = 0; i < times.length; i++)
- {
- min = Math.min(min, times[i]);
- }
- return min;
- }
-
- static long max(long[] times)
- {
- long max = times.length > 0 ? times[0] : 0;
- for(int i = 0; i < times.length; i++)
- {
- max = Math.max(max, times[i]);
- }
- return max;
- }
-
- static long avg(long[] times, long min, long max)
- {
- long sum = 0;
- for(int i = 0; i < times.length; i++)
- {
- sum += times[i];
- }
- sum -= min;
- sum -= max;
-
- return (sum / (times.length - 2));
- }
-
- public static void main(String[] argv) throws Exception
- {
- Config config = new Config();
- config.setOptions(argv);
-
- Connection con = config.createConnection();
- int size = config.getPayload();
- int ackMode = config.getAckMode();
- boolean persistent = config.usePersistentMessages();
- new Publisher(con, size, ackMode, persistent).test(config);
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/ping/PingAsyncTestPerf.java b/java/perftests/src/main/java/org/apache/qpid/ping/PingAsyncTestPerf.java
deleted file mode 100644
index b55dac45c7..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/ping/PingAsyncTestPerf.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.ping;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.requestreply.PingPongProducer;
-
-import org.apache.qpid.junit.extensions.TimingController;
-import org.apache.qpid.junit.extensions.TimingControllerAware;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * PingAsyncTestPerf is a performance test that outputs multiple timings from its test method, using the timing controller
- * interface supplied by the test runner from a seperate listener thread. It differs from the {@link PingTestPerf} test
- * that it extends because it can output timings as replies are received, rather than waiting until all expected replies
- * are received. This is less 'blocky' than the tests in {@link PingTestPerf}, and provides a truer simulation of sending
- * and recieving clients working asynchronously.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><td> Responsibilities <th> Collaborations
- * <tr><td> Send many ping messages and output timings asynchronously on batches received.
- * </table>
- */
-public class PingAsyncTestPerf extends PingTestPerf implements TimingControllerAware
-{
- private static Logger _logger = Logger.getLogger(PingAsyncTestPerf.class);
-
- /** Holds the name of the property to get the test results logging batch size. */
- public static final String TEST_RESULTS_BATCH_SIZE_PROPNAME = "batchSize";
-
- /** Holds the default test results logging batch size. */
- public static final int TEST_RESULTS_BATCH_SIZE_DEFAULT = 1000;
-
- /** Used to hold the timing controller passed from the test runner. */
- private TimingController _timingController;
-
- /** Used to generate unique correlation ids for each test run. */
- private AtomicLong corellationIdGenerator = new AtomicLong();
-
- /** Holds test specifics by correlation id. This consists of the expected number of messages and the timing controler. */
- private Map<String, PerCorrelationId> perCorrelationIds =
- Collections.synchronizedMap(new HashMap<String, PerCorrelationId>());
-
- /** Holds the batched results listener, that does logging on batch boundaries. */
- private BatchedResultsListener batchedResultsListener = null;
-
- /**
- * Creates a new asynchronous ping performance test with the specified name.
- *
- * @param name The test name.
- */
- public PingAsyncTestPerf(String name)
- {
- super(name);
-
- // Sets up the test parameters with defaults.
- testParameters.setPropertyIfNull(TEST_RESULTS_BATCH_SIZE_PROPNAME,
- Integer.toString(TEST_RESULTS_BATCH_SIZE_DEFAULT));
- }
-
- /**
- * Compile all the tests into a test suite.
- * @return The test suite to run. Should only contain testAsyncPingOk method.
- */
- public static Test suite()
- {
- // Build a new test suite
- TestSuite suite = new TestSuite("Ping Performance Tests");
-
- // Run performance tests in read committed mode.
- suite.addTest(new PingAsyncTestPerf("testAsyncPingOk"));
-
- return suite;
- }
-
- /**
- * Accepts a timing controller from the test runner.
- *
- * @param timingController The timing controller to register mutliple timings with.
- */
- public void setTimingController(TimingController timingController)
- {
- _timingController = timingController;
- }
-
- /**
- * Gets the timing controller passed in by the test runner.
- *
- * @return The timing controller passed in by the test runner.
- */
- public TimingController getTimingController()
- {
- return _timingController;
- }
-
- /**
- * Sends the specified number of pings, asynchronously outputs timings on every batch boundary, and waits until
- * all replies have been received or a time out occurs before exiting this method.
- *
- * @param numPings The number of pings to send.
- * @throws Exception pass all errors out to the test harness
- */
- public void testAsyncPingOk(int numPings) throws Exception
- {
- // _logger.debug("public void testAsyncPingOk(int numPings): called");
-
- // get prefill count to update the expected count
- int preFill = testParameters.getPropertyAsInteger(PingPongProducer.PREFILL_PROPNAME);
-
- // Ensure that at least one ping was requeusted.
- if (numPings + preFill == 0)
- {
- _logger.error("Number of pings requested was zero.");
- fail("Number of pings requested was zero.");
- }
-
- // Get the per thread test setup to run the test through.
- PerThreadSetup perThreadSetup = threadSetup.get();
- PingClient pingClient = perThreadSetup._pingClient;
-
- // Advance the correlation id of messages to send, to make it unique for this run.
- perThreadSetup._correlationId = Long.toString(corellationIdGenerator.incrementAndGet());
- // String messageCorrelationId = perThreadSetup._correlationId;
- // _logger.debug("messageCorrelationId = " + messageCorrelationId);
-
-
- // Initialize the count and timing controller for the new correlation id.
- // This perCorrelationId is only used for controlling the test.
- // The PingClient itself uses its own perCorrelationId see in PingPongProducer
- PerCorrelationId perCorrelationId = new PerCorrelationId();
- TimingController tc = getTimingController().getControllerForCurrentThread();
- perCorrelationId._tc = tc;
- perCorrelationId._expectedCount = pingClient.getExpectedNumPings(numPings + preFill);
- perCorrelationIds.put(perThreadSetup._correlationId, perCorrelationId);
-
- // Must be called before pingAndWaitForReply to setup the CorrelationID.
- // This is required because pingClient.start() will start all client threads
- // This means that the CorrelationID must be registered before hand.
- pingClient.setupCorrelationID(perThreadSetup._correlationId, perCorrelationId._expectedCount);
-
- // Start the client connection if:
- // 1) we are not in a SEND_ONLY test.
- // 2) if we have not yet started client because messages are sitting on broker.
- // This is either due to a preFill or a consume only test.
- if (!testParameters.getPropertyAsBoolean(PingPongProducer.SEND_ONLY_PROPNAME) &&
- (preFill > 0 || testParameters.getPropertyAsBoolean(PingPongProducer.CONSUME_ONLY_PROPNAME)))
- {
- pingClient.start();
- }
-
- // Send the requested number of messages, and wait until they have all been received.
- long timeout = Long.parseLong(testParameters.getProperty(PingPongProducer.TIMEOUT_PROPNAME));
- int numReplies = pingClient.pingAndWaitForReply(null, numPings , preFill, timeout, perThreadSetup._correlationId);
-
- // Check that all the replies were received and log a fail if they were not.
- if (numReplies < perCorrelationId._expectedCount)
- {
- System.out.println("##### " + numReplies + "replies, expected " + perCorrelationId._expectedCount + " #####");
- perCorrelationId._tc.completeTest(false, numPings - perCorrelationId._expectedCount);
- }
-
- // Remove the expected count and timing controller for the message correlation id, to ensure they are cleaned up.
- perCorrelationIds.remove(perThreadSetup._correlationId);
- }
-
- /**
- * Performs test fixture creation on a per thread basis. This will only be called once for each test thread.
- */
- public void threadSetUp()
- {
- _logger.debug("public void threadSetUp(): called");
-
- try
- {
- // Call the set up method in the super class. This creates a PingClient pinger.
- super.threadSetUp();
-
- // Create the chained message listener, only if it has not already been created. This is set up with the
- // batch size property, to tell it what batch size to output results on. A synchronized block is used to
- // ensure that only one thread creates this.
- synchronized (this)
- {
- if (batchedResultsListener == null)
- {
- int batchSize = Integer.parseInt(testParameters.getProperty(TEST_RESULTS_BATCH_SIZE_PROPNAME));
- batchedResultsListener = new BatchedResultsListener(batchSize);
- }
- }
-
- // Get the set up that the super class created.
- PerThreadSetup perThreadSetup = threadSetup.get();
-
- // Register the chained message listener on the pinger to do its asynchronous test timings from.
- perThreadSetup._pingClient.setChainedMessageListener(batchedResultsListener);
- }
- catch (Exception e)
- {
- _logger.warn("There was an exception during per thread setup.", e);
- }
- }
-
- /**
- * BatchedResultsListener is a {@link PingPongProducer.ChainedMessageListener} that can be attached to the
- * pinger, in order to receive notifications about every message received and the number remaining to be
- * received. Whenever the number remaining crosses a batch size boundary this results listener outputs
- * a test timing for the actual number of messages received in the current batch.
- */
- private class BatchedResultsListener implements PingPongProducer.ChainedMessageListener
- {
- /** The test results logging batch size. */
- int _batchSize;
-
- /** The latency recoreded for the batch */
- private long _batchLatency = 0;
-
- /**
- * Creates a results listener on the specified batch size.
- *
- * @param batchSize The batch size to use.
- */
- public BatchedResultsListener(int batchSize)
- {
- _batchSize = batchSize;
- }
-
- /**
- * This callback method is called from all of the pingers that this test creates. It uses the correlation id
- * from the message to identify the timing controller for the test thread that was responsible for sending those
- * messages.
- *
- * @param message The message.
- * @param remainingCount The count of messages remaining to be received with a particular correlation id.
- *
- * @throws JMSException Any underlying JMSException is allowed to fall through.
- */
- public void onMessage(Message message, int remainingCount, long latency) throws JMSException
- {
- // Record the latency for the whole batch
- _batchLatency += latency;
- // Check if a batch boundary has been crossed.
- if ((remainingCount % _batchSize) == 0)
- {
- // Extract the correlation id from the message.
- String correlationId = message.getJMSCorrelationID();
-
- /*_logger.debug("public void onMessage(Message message, int remainingCount = " + remainingCount
- + "): called on batch boundary for message id: " + correlationId + " with thread id: "
- + Thread.currentThread().getId());*/
-
- // Get the details for the correlation id and check that they are not null. They can become null
- // if a test times out.
- PerCorrelationId perCorrelationId = perCorrelationIds.get(correlationId);
- if (perCorrelationId != null)
- {
- // Get the timing controller and expected count for this correlation id.
- TimingController tc = perCorrelationId._tc;
- int expected = perCorrelationId._expectedCount;
-
- // Calculate how many messages were actually received in the last batch. This will be the batch size
- // except where the number expected is not a multiple of the batch size and this is the first remaining
- // count to cross a batch size boundary, in which case it will be the number expected modulo the batch
- // size.
- int receivedInBatch = ((expected - remainingCount) < _batchSize) ? (expected % _batchSize) : _batchSize;
-
- // Register a test result for the correlation id.
- try
- {
- // Record the total latency for the batch.
- // if batchSize=1 then this will just be the message latency
- tc.completeTest(true, receivedInBatch, null, _batchSize == 1 ? latency : _batchLatency);
- // Reset latency
- _batchLatency = 0;
- }
- catch (InterruptedException e)
- {
- // Ignore this. It means the test runner wants to stop as soon as possible.
- _logger.warn("Got InterruptedException.", e);
- }
- }
- // Else ignore, test timed out. Should log a fail here?
- }
- }
- }
-
- /**
- * Holds state specific to each correlation id, needed to output test results. This consists of the count of
- * the total expected number of messages, and the timing controller for the thread sending those message ids.
- */
- private static class PerCorrelationId
- {
- public int _expectedCount;
- public TimingController _tc;
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/ping/PingClient.java b/java/perftests/src/main/java/org/apache/qpid/ping/PingClient.java
deleted file mode 100644
index dcfc67d4fc..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/ping/PingClient.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.ping;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.requestreply.PingPongProducer;
-
-import javax.jms.Destination;
-
-import java.util.List;
-import java.util.Properties;
-
-/**
- * PingClient is a {@link PingPongProducer} that does not need a {@link org.apache.qpid.requestreply.PingPongBouncer}
- * to send replies to its pings. It simply listens to its own ping destinations, rather than seperate reply queues.
- * It is an all in one ping client, that produces and consumes its own pings.
- *
- * <p/>The constructor increments a count of the number of ping clients created. It is assumed that where many
- * are created they will all be run in parallel and be active in sending and consuming pings at the same time.
- * If the unique destinations flag is not set and a pub/sub ping cycle is being run, this means that they will all hear
- * pings sent by each other. The expected number of pings received will therefore be multiplied up by the number of
- * active ping clients. The {@link #getConsumersPerDestination()} method is used to supply this multiplier under these
- * conditions.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create a ping producer that listens to its own pings <td> {@link PingPongProducer}
- * <tr><td> Count the number of ping producers and produce multiplier for scaling up messages expected over topic pings.
- * </table>
- */
-public class PingClient extends PingPongProducer
-{
- /** Used for debugging. */
- private final Logger log = Logger.getLogger(PingClient.class);
-
- /** Used to count the number of ping clients created. */
- private static int _pingClientCount;
-
- /**
- * Creates a ping producer with the specified parameters, of which there are many. See the class level comments
- * for {@link PingPongProducer} for details. This constructor creates a connection to the broker and creates
- * producer and consumer sessions on it, to send and recieve its pings and replies on.
- *
- * @param overrides Properties containing any desired overrides to the defaults.
- *
- * @throws Exception Any exceptions are allowed to fall through.
- */
- public PingClient(Properties overrides) throws Exception
- {
- super(overrides);
-
- _pingClientCount++;
- }
-
- /**
- * Returns the ping destinations themselves as the reply destinations for this pinger to listen to. This has the
- * effect of making this pinger listen to its own pings.
- *
- * @return The ping destinations.
- */
- public List<Destination> getReplyDestinations()
- {
- return _pingDestinations;
- }
-
- /**
- * Supplies the multiplier for the number of ping clients that will hear each ping when doing pub/sub pinging.
- *
- * @return The scaling up of the number of expected pub/sub pings.
- */
- public int getConsumersPerDestination()
- {
- log.debug("public int getConsumersPerDestination(): called");
-
- if (_isUnique)
- {
- log.debug(_noOfConsumers + " consumer per destination.");
-
- return _noOfConsumers;
- }
- else
- {
- log.debug((_pingClientCount * _noOfConsumers) + " consumers per destination.");
-
- return _pingClientCount * _noOfConsumers;
- }
- }
-
- public int getClientCount()
- {
- return _pingClientCount;
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/ping/PingDurableClient.java b/java/perftests/src/main/java/org/apache/qpid/ping/PingDurableClient.java
deleted file mode 100644
index a15897c82b..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/ping/PingDurableClient.java
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.ping;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.requestreply.PingPongProducer;
-import org.apache.qpid.util.CommandLineParser;
-
-import org.apache.qpid.junit.extensions.util.MathUtils;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-import javax.jms.*;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.List;
-import java.util.Properties;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * PingDurableClient is a variation of the {@link PingPongProducer} ping tool. Instead of sending its pings and
- * receiving replies to them at the same time, this tool sends pings until it is signalled by some 'event' to stop
- * sending. It then waits for another signal before it re-opens a fresh connection and attempts to receive all of the
- * pings that it has succesfully sent. It is intended to be an interactive test that lets a user experiment with
- * failure conditions when using durable messaging.
- *
- * <p/>The events that can stop it from sending are input from the user on the console, failure of its connection to
- * the broker, completion of sending a specified number of messages, or expiry of a specified duration. In all cases
- * it will do its best to clean up and close the connection before opening a fresh connection to receive the pings
- * with.
- *
- * <p/>The event to re-connect and attempt to recieve the pings is input from the user on the console.
- *
- * <p/>This ping client inherits the configuration properties of its parent class ({@link PingPongProducer}) and
- * additionally accepts the following parameters:
- *
- * <p/><table><caption>Parameters</caption>
- * <tr><th> Parameter <th> Default <th> Comments
- * <tr><td> numMessages <td> 100 <td> The total number of messages to send.
- * <tr><td> numMessagesToAction <td> -1 <td> The number of messages to send before taking a custom 'action'.
- * <tr><td> duration <td> 30S <td> The length of time to ping for. (Format dDhHmMsS, for d days, h hours,
- * m minutes and s seconds).
- * </table>
- *
- * <p/>This ping client also overrides some of the defaults of its parent class, to provide a reasonable set up
- * when no parameters are specified.
- *
- * <p/><table><caption>Parameters</caption>
- * <tr><th> Parameter <th> Default <th> Comments
- * <tr><td> uniqueDests <td> false <td> Prevents destination names being timestamped.
- * <tr><td> transacted <td> true <td> Only makes sense to test with transactions.
- * <tr><td> persistent <td> true <td> Only makes sense to test persistent.
- * <tr><td> durableDests <td> true <td> Should use durable queues with persistent messages.
- * <tr><td> commitBatchSize <td> 10
- * <tr><td> rate <td> 20 <td> Total default test time is 5 seconds.
- * </table>
- *
- * <p/>When a number of messages or duration is specified, this ping client will ping until the first of those limits
- * is reached. Reaching the limit will be interpreted as the first signal to stop sending, and the ping client will
- * wait for the second signal before receiving its pings.
- *
- * <p/>This class provides a mechanism for extensions to add arbitrary actions, after a particular number of messages
- * have been sent. When the number of messages equal the value set in the 'numMessagesToAction' property is method,
- * the {@link #takeAction} method is called. By default this does nothing, but extensions of this class can provide
- * custom behaviour with alternative implementations of this method (for example taking a backup).
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Send and receive pings.
- * <tr><td> Accept user input to signal stop sending.
- * <tr><td> Accept user input to signal start receiving.
- * <tr><td> Provide feedback on pings sent versus pings received.
- * <tr><td> Provide extension point for arbitrary action on a particular message count.
- * </table>
- */
-public class PingDurableClient extends PingPongProducer implements ExceptionListener
-{
- private static final Logger log = Logger.getLogger(PingDurableClient.class);
-
- public static final String NUM_MESSAGES_PROPNAME = "numMessages";
- public static final String NUM_MESSAGES_DEFAULT = "100";
- public static final String DURATION_PROPNAME = "duration";
- public static final String DURATION_DEFAULT = "30S";
- public static final String NUM_MESSAGES_TO_ACTION_PROPNAME = "numMessagesToAction";
- public static final String NUM_MESSAGES_TO_ACTION_DEFAULT = "-1";
-
- /** The maximum length of time to wait whilst receiving pings before assuming that no more are coming. */
- private static final long TIME_OUT = 3000;
-
- static
- {
- defaults.setProperty(NUM_MESSAGES_PROPNAME, NUM_MESSAGES_DEFAULT);
- defaults.setProperty(DURATION_PROPNAME, DURATION_DEFAULT);
- defaults.setProperty(UNIQUE_DESTS_PROPNAME, "false");
- defaults.setProperty(TRANSACTED_PROPNAME, "true");
- defaults.setProperty(PERSISTENT_MODE_PROPNAME, "true");
- defaults.setProperty(TX_BATCH_SIZE_PROPNAME, "10");
- defaults.setProperty(RATE_PROPNAME, "20");
- defaults.setProperty(DURABLE_DESTS_PROPNAME, "true");
- defaults.setProperty(NUM_MESSAGES_TO_ACTION_PROPNAME, NUM_MESSAGES_TO_ACTION_DEFAULT);
- }
-
- /** Specifies the number of pings to send, if larger than 0. 0 means send until told to stop. */
- private int numMessages;
-
- /** Holds the number of messages to send before taking triggering the action. */
- private int numMessagesToAction;
-
- /** Sepcifies how long to ping for, if larger than 0. 0 means send until told to stop. */
- private long duration;
-
- /** Used to indciate that this application should terminate. Set by the shutdown hook. */
- private boolean terminate = false;
-
- /**
- * @throws Exception Any exceptions are allowed to fall through.
- */
- public PingDurableClient(Properties overrides) throws Exception
- {
- super(overrides);
- log.debug("public PingDurableClient(Properties overrides = " + overrides + "): called");
-
- // Extract the additional configuration parameters.
- ParsedProperties properties = new ParsedProperties(defaults);
- properties.putAll(overrides);
-
- numMessages = properties.getPropertyAsInteger(NUM_MESSAGES_PROPNAME);
- String durationSpec = properties.getProperty(DURATION_PROPNAME);
- numMessagesToAction = properties.getPropertyAsInteger(NUM_MESSAGES_TO_ACTION_PROPNAME);
-
- if (durationSpec != null)
- {
- duration = MathUtils.parseDuration(durationSpec) * 1000000;
- }
- }
-
- /**
- * Starts the ping/wait/receive process.
- *
- * @param args The command line arguments.
- */
- public static void main(String[] args)
- {
- try
- {
- // Create a ping producer overriding its defaults with all options passed on the command line.
- Properties options =
- CommandLineParser.processCommandLine(args, new CommandLineParser(new String[][] {}), System.getProperties());
- PingDurableClient pingProducer = new PingDurableClient(options);
-
- // Create a shutdown hook to terminate the ping-pong producer.
- Runtime.getRuntime().addShutdownHook(pingProducer.getShutdownHook());
-
- // Ensure that the ping pong producer is registered to listen for exceptions on the connection too.
- // pingProducer.getConnection().setExceptionListener(pingProducer);
-
- // Run the test procedure.
- int sent = pingProducer.send();
- pingProducer.closeConnection();
- pingProducer.waitForUser("Press return to begin receiving the pings.");
- pingProducer.receive(sent);
-
- System.exit(0);
- }
- catch (Exception e)
- {
- System.err.println(e.getMessage());
- log.error("Top level handler caught execption.", e);
- System.exit(1);
- }
- }
-
- /**
- * Performs the main test procedure implemented by this ping client. See the class level comment for details.
- */
- protected int send() throws Exception
- {
- log.debug("public void sendWaitReceive(): called");
-
- log.debug("duration = " + duration);
- log.debug("numMessages = " + numMessages);
-
- if (duration > 0)
- {
- System.out.println("Sending for up to " + (duration / 1000000000f) + " seconds.");
- }
-
- if (_rate > 0)
- {
- System.out.println("Sending at " + _rate + " messages per second.");
- }
-
- if (numMessages > 0)
- {
- System.out.println("Sending up to " + numMessages + " messages.");
- }
-
- // Establish the connection and the message producer.
- establishConnection(true, false);
- _connection.start();
-
- Message message = getTestMessage(getReplyDestinations().get(0), _messageSize, _persistent);
-
- // Send pings until a terminating condition is received.
- boolean endCondition = false;
- int messagesSent = 0;
- int messagesCommitted = 0;
- int messagesNotCommitted = 0;
- long start = System.nanoTime();
-
- // Clear console in.
- clearConsole();
-
- while (!endCondition)
- {
- boolean committed = false;
-
- try
- {
- committed = sendMessage(messagesSent, message) && _transacted;
-
- messagesSent++;
- messagesNotCommitted++;
-
- // Keep count of the number of messsages currently committed and pending commit.
- if (committed)
- {
- log.debug("Adding " + messagesNotCommitted + " messages to the committed count.");
- messagesCommitted += messagesNotCommitted;
- messagesNotCommitted = 0;
-
- System.out.println("Commited: " + messagesCommitted);
- }
- }
- catch (JMSException e)
- {
- log.debug("Got JMSException whilst sending.");
- _publish = false;
- }
-
- // Perform the arbitrary action if the number of messages sent has reached the right number.
- if (messagesSent == numMessagesToAction)
- {
- System.out.println("At action point, Messages sent = " + messagesSent + ", Messages Committed = "
- + messagesCommitted + ", Messages not Committed = " + messagesNotCommitted);
- takeAction();
- }
-
- // Determine if the end condition has been met, based on the number of messages, time passed, errors on
- // the connection or user input.
- long now = System.nanoTime();
-
- if ((duration != 0) && ((now - start) > duration))
- {
- System.out.println("Send halted because duration expired.");
- endCondition = true;
- }
- else if ((numMessages != 0) && (messagesSent >= numMessages))
- {
- System.out.println("Send halted because # messages completed.");
- endCondition = true;
- }
- else if (System.in.available() > 0)
- {
- System.out.println("Send halted by user input.");
- endCondition = true;
-
- clearConsole();
- }
- else if (!_publish)
- {
- System.out.println("Send halted by error on the connection.");
- endCondition = true;
- }
- }
-
- log.debug("messagesSent = " + messagesSent);
- log.debug("messagesCommitted = " + messagesCommitted);
- log.debug("messagesNotCommitted = " + messagesNotCommitted);
-
- System.out.println("Messages sent: " + messagesSent + ", Messages Committed = " + messagesCommitted
- + ", Messages not Committed = " + messagesNotCommitted);
-
- return messagesSent;
- }
-
- protected void closeConnection()
- {
- // Clean up the connection.
- try
- {
- close();
- }
- catch (JMSException e)
- {
- log.debug("There was an error whilst closing the connection: " + e, e);
- System.out.println("There was an error whilst closing the connection.");
-
- // Ignore as did best could manage to clean up.
- }
- }
-
- protected void receive(int messagesSent) throws Exception
- {
- // Re-establish the connection and the message consumer.
- _queueJVMSequenceID = new AtomicInteger();
- _queueSharedID = new AtomicInteger();
-
- establishConnection(false, true);
- _consumer[0].setMessageListener(null);
- _consumerConnection[0].start();
-
- // Try to receive all of the pings that were successfully sent.
- int messagesReceived = 0;
- boolean endCondition = false;
-
- while (!endCondition)
- {
- // Message received = _consumer.receiveNoWait();
- Message received = _consumer[0].receive(TIME_OUT);
- log.debug("received = " + received);
-
- if (received != null)
- {
- messagesReceived++;
- }
-
- // Determine if the end condition has been met, based on the number of messages and time passed since last
- // receiving a message.
- if (received == null)
- {
- System.out.println("Timed out.");
- endCondition = true;
- }
- else if (messagesReceived >= messagesSent)
- {
- System.out.println("Got all messages.");
- endCondition = true;
- }
- }
-
- // Ensure messages received are committed.
- if (_consTransacted)
- {
- try
- {
- _consumerSession[0].commit();
- System.out.println("Committed for all messages received.");
- }
- catch (JMSException e)
- {
- log.debug("Error during commit: " + e, e);
- System.out.println("Error during commit.");
- try
- {
- _consumerSession[0].rollback();
- System.out.println("Rolled back on all messages received.");
- }
- catch (JMSException e2)
- {
- log.debug("Error during rollback: " + e, e);
- System.out.println("Error on roll back of all messages received.");
- }
-
- }
- }
-
- log.debug("messagesReceived = " + messagesReceived);
-
- System.out.println("Messages received: " + messagesReceived);
-
- // Clean up the connection.
- close();
- }
-
- /**
- * Clears any pending input from the console.
- */
- private void clearConsole()
- {
- try
- {
- BufferedReader bis = new BufferedReader(new InputStreamReader(System.in));
-
- // System.in.skip(System.in.available());
- while (bis.ready())
- {
- bis.readLine();
- }
- }
- catch (IOException e)
- { }
- }
-
- /**
- * Returns the ping destinations themselves as the reply destinations for this pinger to listen to. This has the
- * effect of making this pinger listen to its own pings.
- *
- * @return The ping destinations.
- */
- public List<Destination> getReplyDestinations()
- {
- return _pingDestinations;
- }
-
- /**
- * Gets a shutdown hook that will cleanly shut this down when it is running the ping loop. This can be registered with
- * the runtime system as a shutdown hook. This shutdown hook sets an additional terminate flag, compared with the
- * shutdown hook in {@link PingPongProducer}, because the publish flag is used to indicate that sending or receiving
- * message should stop, not that the application should termiante.
- *
- * @return A shutdown hook for the ping loop.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- stop();
- terminate = true;
- }
- });
- }
-
- /**
- * Performs an aribtrary action once the 'numMesagesToAction' count is reached on sending messages. This default
- * implementation does nothing.
- */
- public void takeAction()
- { }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/ping/PingLatencyTestPerf.java b/java/perftests/src/main/java/org/apache/qpid/ping/PingLatencyTestPerf.java
deleted file mode 100644
index 5ba4004c56..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/ping/PingLatencyTestPerf.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.ping;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.requestreply.PingPongProducer;
-
-import org.apache.qpid.junit.extensions.TimingController;
-import org.apache.qpid.junit.extensions.TimingControllerAware;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * PingLatencyTestPerf is a performance test that outputs multiple timings from its test method, using the timing
- * controller interface supplied by the test runner from a seperate listener thread. It outputs round trip timings for
- * individual ping messages rather than for how long a complete batch of messages took to process. It also differs from
- * the {@link PingTestPerf} test that it extends because it can output timings as replies are received, rather than
- * waiting until all expected replies are received.
- *
- * <p/>This test does not output timings for every single ping message, as when running at high volume, writing the test
- * log for a vast number of messages would slow the testing down. Instead samples ping latency occasionally. The
- * frequency of ping sampling is set using the {@link #TEST_RESULTS_BATCH_SIZE_PROPNAME} property, to override the
- * default of every {@link #DEFAULT_TEST_RESULTS_BATCH_SIZE}.
- *
- * <p/>The size parameter logged for each individual ping is set to the size of the batch of messages that the
- * individual timed ping was taken from, rather than 1 for a single message. This is so that the total throughput
- * (messages / time) can be calculated in order to examine the relationship between throughput and latency.
- *
- * <p/><table id="crc"><caption>CRC Card</caption> <tr><td> Responsibilities <th> Collaborations <tr><td> Send many ping
- * messages and output timings for sampled individual pings. </table>
- */
-public class PingLatencyTestPerf extends PingTestPerf implements TimingControllerAware
-{
- private static Logger _logger = Logger.getLogger(PingLatencyTestPerf.class);
-
- /** Holds the name of the property to get the test results logging batch size. */
- public static final String TEST_RESULTS_BATCH_SIZE_PROPNAME = "batchSize";
-
- /** Holds the default test results logging batch size. */
- public static final int DEFAULT_TEST_RESULTS_BATCH_SIZE = 1000;
-
- /** Used to hold the timing controller passed from the test runner. */
- private TimingController _timingController;
-
- /** Used to generate unique correlation ids for each test run. */
- private AtomicLong corellationIdGenerator = new AtomicLong();
-
- /**
- * Holds test specifics by correlation id. This consists of the expected number of messages and the timing
- * controler.
- */
- private Map<String, PerCorrelationId> perCorrelationIds =
- Collections.synchronizedMap(new HashMap<String, PerCorrelationId>());
-
- /** Holds the batched results listener, that does logging on batch boundaries. */
- private BatchedResultsListener batchedResultsListener = null;
-
- /**
- * Creates a new asynchronous ping performance test with the specified name.
- *
- * @param name The test name.
- */
- public PingLatencyTestPerf(String name)
- {
- super(name);
-
- // Sets up the test parameters with defaults.
- ParsedProperties.setSysPropertyIfNull(TEST_RESULTS_BATCH_SIZE_PROPNAME,
- Integer.toString(DEFAULT_TEST_RESULTS_BATCH_SIZE));
- }
-
- /** Compile all the tests into a test suite. */
- public static Test suite()
- {
- // Build a new test suite
- TestSuite suite = new TestSuite("Ping Latency Tests");
-
- // Run performance tests in read committed mode.
- suite.addTest(new PingLatencyTestPerf("testPingLatency"));
-
- return suite;
- }
-
- /**
- * Accepts a timing controller from the test runner.
- *
- * @param timingController The timing controller to register mutliple timings with.
- */
- public void setTimingController(TimingController timingController)
- {
- _timingController = timingController;
- }
-
- /**
- * Gets the timing controller passed in by the test runner.
- *
- * @return The timing controller passed in by the test runner.
- */
- public TimingController getTimingController()
- {
- return _timingController;
- }
-
- /**
- * Sends the specified number of pings, asynchronously outputs timings on every batch boundary, and waits until all
- * replies have been received or a time out occurs before exiting this method.
- *
- * @param numPings The number of pings to send.
- */
- public void testPingLatency(int numPings) throws Exception
- {
- _logger.debug("public void testPingLatency(int numPings): called");
-
- // Ensure that at least one ping was requeusted.
- if (numPings == 0)
- {
- _logger.error("Number of pings requested was zero.");
- }
-
- // Get the per thread test setup to run the test through.
- PerThreadSetup perThreadSetup = threadSetup.get();
- PingClient pingClient = perThreadSetup._pingClient;
-
- // Advance the correlation id of messages to send, to make it unique for this run.
- String messageCorrelationId = Long.toString(corellationIdGenerator.incrementAndGet());
- _logger.debug("messageCorrelationId = " + messageCorrelationId);
-
- // Initialize the count and timing controller for the new correlation id.
- PerCorrelationId perCorrelationId = new PerCorrelationId();
- TimingController tc = getTimingController().getControllerForCurrentThread();
- perCorrelationId._tc = tc;
- perCorrelationId._expectedCount = numPings;
- perCorrelationIds.put(messageCorrelationId, perCorrelationId);
-
- // Attach the chained message listener to the ping producer to listen asynchronously for the replies to these
- // messages.
- pingClient.setChainedMessageListener(batchedResultsListener);
-
- // Generate a sample message of the specified size.
- Message msg =
- pingClient.getTestMessage(perThreadSetup._pingClient.getReplyDestinations().get(0),
- testParameters.getPropertyAsInteger(PingPongProducer.MESSAGE_SIZE_PROPNAME),
- testParameters.getPropertyAsBoolean(PingPongProducer.PERSISTENT_MODE_PROPNAME));
-
- // Send the requested number of messages, and wait until they have all been received.
- long timeout = Long.parseLong(testParameters.getProperty(PingPongProducer.TIMEOUT_PROPNAME));
- int numReplies = pingClient.pingAndWaitForReply(msg, numPings, timeout, null);
-
- // Check that all the replies were received and log a fail if they were not.
- if (numReplies < numPings)
- {
- tc.completeTest(false, 0);
- }
-
- // Remove the chained message listener from the ping producer.
- pingClient.removeChainedMessageListener();
-
- // Remove the expected count and timing controller for the message correlation id, to ensure they are cleaned up.
- perCorrelationIds.remove(messageCorrelationId);
- }
-
- /** Performs test fixture creation on a per thread basis. This will only be called once for each test thread. */
- public void threadSetUp()
- {
- _logger.debug("public void threadSetUp(): called");
-
- try
- {
- // Call the set up method in the super class. This creates a PingClient pinger.
- super.threadSetUp();
-
- // Create the chained message listener, only if it has not already been created. This is set up with the
- // batch size property, to tell it what batch size to output results on. A synchronized block is used to
- // ensure that only one thread creates this.
- synchronized (this)
- {
- if (batchedResultsListener == null)
- {
- int batchSize = Integer.parseInt(testParameters.getProperty(TEST_RESULTS_BATCH_SIZE_PROPNAME));
- batchedResultsListener = new BatchedResultsListener(batchSize);
- }
- }
-
- // Get the set up that the super class created.
- PerThreadSetup perThreadSetup = threadSetup.get();
-
- // Register the chained message listener on the pinger to do its asynchronous test timings from.
- perThreadSetup._pingClient.setChainedMessageListener(batchedResultsListener);
- }
- catch (Exception e)
- {
- _logger.warn("There was an exception during per thread setup.", e);
- }
- }
-
- /**
- * BatchedResultsListener is a {@link org.apache.qpid.requestreply.PingPongProducer.ChainedMessageListener} that can
- * be attached to the pinger, in order to receive notifications about every message received and the number
- * remaining to be received. Whenever the number remaining crosses a batch size boundary this results listener
- * outputs a test timing for the actual number of messages received in the current batch.
- */
- private class BatchedResultsListener implements PingPongProducer.ChainedMessageListener
- {
- /** The test results logging batch size. */
- int _batchSize;
- private boolean _strictAMQP;
-
- /**
- * Creates a results listener on the specified batch size.
- *
- * @param batchSize The batch size to use.
- */
- public BatchedResultsListener(int batchSize)
- {
- _batchSize = batchSize;
- _strictAMQP =
- Boolean.parseBoolean(System.getProperties().getProperty(AMQSession.STRICT_AMQP,
- AMQSession.STRICT_AMQP_DEFAULT));
- }
-
- /**
- * This callback method is called from all of the pingers that this test creates. It uses the correlation id
- * from the message to identify the timing controller for the test thread that was responsible for sending those
- * messages.
- *
- * @param message The message.
- * @param remainingCount The count of messages remaining to be received with a particular correlation id.
- *
- * @throws javax.jms.JMSException Any underlying JMSException is allowed to fall through.
- */
- public void onMessage(Message message, int remainingCount, long latency) throws JMSException
- {
- _logger.debug("public void onMessage(Message message, int remainingCount = " + remainingCount + "): called");
-
- // Check if a batch boundary has been crossed.
- if ((remainingCount % _batchSize) == 0)
- {
- // Extract the correlation id from the message.
- String correlationId = message.getJMSCorrelationID();
-
- // Get the details for the correlation id and check that they are not null. They can become null
- // if a test times out.
- PerCorrelationId perCorrelationId = perCorrelationIds.get(correlationId);
- if (perCorrelationId != null)
- {
- // Get the timing controller and expected count for this correlation id.
- TimingController tc = perCorrelationId._tc;
- int expected = perCorrelationId._expectedCount;
-
- // Calculate how many messages were actually received in the last batch. This will be the batch size
- // except where the number expected is not a multiple of the batch size and this is the first remaining
- // count to cross a batch size boundary, in which case it will be the number expected modulo the batch
- // size.
- int receivedInBatch = ((expected - remainingCount) < _batchSize) ? (expected % _batchSize) : _batchSize;
-
- // Register a test result for the correlation id.
- try
- {
- tc.completeTest(true, receivedInBatch, latency);
- }
- catch (InterruptedException e)
- {
- // Ignore this. It means the test runner wants to stop as soon as possible.
- _logger.warn("Got InterruptedException.", e);
- }
- }
- // Else ignore, test timed out. Should log a fail here?
- }
- }
- }
-
- /**
- * Holds state specific to each correlation id, needed to output test results. This consists of the count of the
- * total expected number of messages, and the timing controller for the thread sending those message ids.
- */
- private static class PerCorrelationId
- {
- public int _expectedCount;
- public TimingController _tc;
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/ping/PingSendOnlyClient.java b/java/perftests/src/main/java/org/apache/qpid/ping/PingSendOnlyClient.java
deleted file mode 100644
index 2fe852af77..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/ping/PingSendOnlyClient.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.ping;
-
-import java.util.Properties;
-
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.ObjectMessage;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.client.message.TestMessageFactory;
-import org.apache.qpid.util.CommandLineParser;
-
-/**
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * </table>
- */
-public class PingSendOnlyClient extends PingDurableClient
-{
- private static final Logger log = Logger.getLogger(PingSendOnlyClient.class);
-
- public PingSendOnlyClient(Properties overrides) throws Exception
- {
- super(overrides);
- }
-
- /**
- * Starts the ping/wait/receive process.
- *
- * @param args The command line arguments.
- */
- public static void main(String[] args)
- {
- try
- {
- // Create a ping producer overriding its defaults with all options passed on the command line.
- Properties options = CommandLineParser.processCommandLine(args, new CommandLineParser(new String[][] {}), System.getProperties());
- PingSendOnlyClient pingProducer = new PingSendOnlyClient(options);
-
- // Create a shutdown hook to terminate the ping-pong producer.
- Runtime.getRuntime().addShutdownHook(pingProducer.getShutdownHook());
-
- // Ensure that the ping pong producer is registered to listen for exceptions on the connection too.
- // pingProducer.getConnection().setExceptionListener(pingProducer);
-
- // Run the test procedure.
- pingProducer.send();
- pingProducer.waitForUser("Press return to close connection and quit.");
- pingProducer.closeConnection();
-
- System.exit(0);
- }
- catch (Exception e)
- {
- System.err.println(e.getMessage());
- log.error("Top level handler caught execption.", e);
- System.exit(1);
- }
- }
-
- public Message getTestMessage(Destination replyQueue, int messageSize, boolean persistent) throws JMSException
- {
- Message msg = TestMessageFactory.newTextMessage(_producerSession, messageSize);
-
- // Timestamp the message in nanoseconds.
- msg.setLongProperty(MESSAGE_TIMESTAMP_PROPNAME, System.nanoTime());
-
- return msg;
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/ping/PingTestPerf.java b/java/perftests/src/main/java/org/apache/qpid/ping/PingTestPerf.java
deleted file mode 100644
index cf16abc596..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/ping/PingTestPerf.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.ping;
-
-import junit.framework.Assert;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.requestreply.PingPongProducer;
-
-import org.apache.qpid.junit.extensions.AsymptoticTestCase;
-import org.apache.qpid.junit.extensions.TestThreadAware;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-
-import javax.jms.*;
-
-/**
- * PingTestPerf is a ping test, that has been written with the intention of being scaled up to run many times
- * simultaneously to simluate many clients/producers/connections.
- *
- * <p/>A single run of the test using the default JUnit test runner will result in the sending and timing of a single
- * full round trip ping. This test may be scaled up using a suitable JUnit test runner.
- *
- * <p/>The setup/teardown cycle establishes a connection to a broker and sets up a queue to send ping messages to and a
- * temporary queue for replies. This setup is only established once for all the test repeats/threads that may be run,
- * except if the connection is lost in which case an attempt to re-establish the setup is made.
- *
- * <p/>The test cycle is: Connects to a queue, creates a temporary queue, creates messages containing a property that
- * is the name of the temporary queue, fires off a message on the original queue and waits for a response on the
- * temporary queue.
- *
- * <p/>Configurable test properties: message size, transacted or not, persistent or not. Broker connection details.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * </table>
- */
-public class PingTestPerf extends AsymptoticTestCase implements TestThreadAware
-{
- private static Logger _logger = Logger.getLogger(PingTestPerf.class);
-
- /** Thread local to hold the per-thread test setup fields. */
- ThreadLocal<PerThreadSetup> threadSetup = new ThreadLocal<PerThreadSetup>();
-
- /** Holds a property reader to extract the test parameters from. */
- protected ParsedProperties testParameters =
- TestContextProperties.getInstance(PingPongProducer.defaults /*System.getProperties()*/);
-
- public PingTestPerf(String name)
- {
- super(name);
-
- _logger.debug("testParameters = " + testParameters);
- }
-
- /**
- * Compile all the tests into a test suite.
- * @return The test method testPingOk.
- */
- public static Test suite()
- {
- // Build a new test suite
- TestSuite suite = new TestSuite("Ping Performance Tests");
-
- // Run performance tests in read committed mode.
- suite.addTest(new PingTestPerf("testPingOk"));
-
- return suite;
- }
-
- public void testPingOk(int numPings) throws Exception
- {
- if (numPings == 0)
- {
- Assert.fail("Number of pings requested was zero.");
- }
-
- // Get the per thread test setup to run the test through.
- PerThreadSetup perThreadSetup = threadSetup.get();
-
- if (perThreadSetup == null)
- {
- Assert.fail("Could not get per thread test setup, it was null.");
- }
-
- // Generate a sample message. This message is already time stamped and has its reply-to destination set.
- Message msg =
- perThreadSetup._pingClient.getTestMessage(perThreadSetup._pingClient.getReplyDestinations().get(0),
- testParameters.getPropertyAsInteger(PingPongProducer.MESSAGE_SIZE_PROPNAME),
- testParameters.getPropertyAsBoolean(PingPongProducer.PERSISTENT_MODE_PROPNAME));
-
- // start the test
- long timeout = Long.parseLong(testParameters.getProperty(PingPongProducer.TIMEOUT_PROPNAME));
- int numReplies = perThreadSetup._pingClient.pingAndWaitForReply(msg, numPings, timeout, null);
-
- // Fail the test if the timeout was exceeded.
- if (numReplies != perThreadSetup._pingClient.getExpectedNumPings(numPings))
- {
- Assert.fail("The ping timed out after " + timeout + " ms. Messages Sent = " + numPings + ", MessagesReceived = "
- + numReplies);
- }
- }
-
- /** Performs test fixture creation on a per thread basis. This will only be called once for each test thread. */
- public void threadSetUp()
- {
- _logger.debug("public void threadSetUp(): called");
-
- try
- {
- PerThreadSetup perThreadSetup = new PerThreadSetup();
-
- // This is synchronized because there is a race condition, which causes one connection to sleep if
- // all threads try to create connection concurrently.
- synchronized (this)
- {
- // Establish a client to ping a Destination and listen the reply back from same Destination
- perThreadSetup._pingClient = new PingClient(testParameters);
- perThreadSetup._pingClient.establishConnection(true, true);
- }
-
- // Attach the per-thread set to the thread.
- threadSetup.set(perThreadSetup);
- }
- catch (Exception e)
- {
- _logger.warn("There was an exception during per thread setup.", e);
- }
- }
-
- /**
- * Called after all threads have completed their setup.
- */
- public void postThreadSetUp()
- {
- _logger.debug("public void postThreadSetUp(): called");
-
- PerThreadSetup perThreadSetup = threadSetup.get();
- // Prefill the broker unless we are in consume only mode.
- int preFill = testParameters.getPropertyAsInteger(PingPongProducer.PREFILL_PROPNAME);
- if (!testParameters.getPropertyAsBoolean(PingPongProducer.CONSUME_ONLY_PROPNAME) && preFill > 0)
- {
- try
- {
- // Manually set the correlation ID to 1. This is not ideal but it is the
- // value that the main test loop will use.
- perThreadSetup._pingClient.pingNoWaitForReply(null, preFill, String.valueOf(perThreadSetup._pingClient.getClientCount()));
-
- // Note with a large preFill and non-tx session the messages will be
- // rapidly pushed in to the mina buffers. OOM's are a real risk here.
- // Should perhaps consider using a TX session for the prefill.
-
- long delayBeforeConsume = testParameters.getPropertyAsLong(PingPongProducer.DELAY_BEFORE_CONSUME_PROPNAME);
-
- // Only delay if we are
- // not doing send only
- // and we have consumers
- // and a delayBeforeConsume
- if (!(testParameters.getPropertyAsBoolean(PingPongProducer.SEND_ONLY_PROPNAME))
- && (testParameters.getPropertyAsInteger(PingPongProducer.NUM_CONSUMERS_PROPNAME) > 0)
- && delayBeforeConsume > 0)
- {
-
- boolean verbose = testParameters.getPropertyAsBoolean(PingPongProducer.VERBOSE_PROPNAME);
- // Only do logging if in verbose mode.
- if (verbose)
- {
- if (delayBeforeConsume > 60000)
- {
- long minutes = delayBeforeConsume / 60000;
- long seconds = (delayBeforeConsume - (minutes * 60000)) / 1000;
- long ms = delayBeforeConsume - (minutes * 60000) - (seconds * 1000);
- _logger.info("Delaying for " + minutes + "m " + seconds + "s " + ms + "ms before starting test.");
- }
- else
- {
- _logger.info("Delaying for " + delayBeforeConsume + "ms before starting test.");
- }
- }
-
- Thread.sleep(delayBeforeConsume);
-
- if (verbose)
- {
- _logger.info("Starting Test.");
- }
- }
-
- // We can't start the client's here as the test client has not yet been configured to receieve messages.
- // only when the test method is executed will the correlationID map be set up and ready to consume
- // the messages we have sent here.
- }
- catch (Exception e)
- {
- _logger.warn("There was an exception during per thread setup.", e);
- }
- }
- else //Only start the consumer if we are not preFilling.
- {
- // Start the consumers, unless we have data on the broker
- // already this is signified by being in consume_only, we will
- // start the clients after setting up the correlation IDs.
- // We should also not start the clients if we are in Send only
- if (!testParameters.getPropertyAsBoolean(PingPongProducer.CONSUME_ONLY_PROPNAME) &&
- !(testParameters.getPropertyAsBoolean(PingPongProducer.SEND_ONLY_PROPNAME)))
- {
- // Start the client connection
- try
- {
- perThreadSetup._pingClient.start();
- }
- catch (JMSException e)
- {
- e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
- }
- }
- }
- }
-
- /**
- * Performs test fixture clean
- */
- public void threadTearDown()
- {
- _logger.debug("public void threadTearDown(): called");
-
- try
- {
- // Get the per thread test fixture.
- PerThreadSetup perThreadSetup = threadSetup.get();
-
- // Close the pingers so that it cleans up its connection cleanly.
- synchronized (this)
- {
- if ((perThreadSetup != null) && (perThreadSetup._pingClient != null))
- {
- perThreadSetup._pingClient.close();
- }
- }
- }
- catch (JMSException e)
- {
- _logger.warn("There was an exception during per thread tear down.");
- }
- finally
- {
- // Ensure the per thread fixture is reclaimed.
- threadSetup.remove();
- }
- }
-
- protected static class PerThreadSetup
- {
- /**
- * Holds the test ping client.
- */
- protected PingClient _pingClient;
- protected String _correlationId;
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongBouncer.java b/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongBouncer.java
deleted file mode 100644
index 8e010ccf07..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongBouncer.java
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.requestreply;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import javax.jms.*;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.client.AMQConnection;
-import org.apache.qpid.client.AMQQueue;
-import org.apache.qpid.client.AMQTopic;
-import org.apache.qpid.jms.ConnectionListener;
-import org.apache.qpid.jms.Session;
-import org.apache.qpid.topic.Config;
-import org.apache.qpid.exchange.ExchangeDefaults;
-
-/**
- * PingPongBouncer is a message listener the bounces back messages to their reply to destination. This is used to return
- * ping messages generated by {@link org.apache.qpid.requestreply.PingPongProducer} but could be used for other purposes
- * too.
- *
- * <p/>The correlation id from the received message is extracted, and placed into the reply as the correlation id. Messages
- * are bounced back to their reply-to destination. The original sender of the message has the option to use either a unique
- * temporary queue or the correlation id to correlate the original message to the reply.
- *
- * <p/>There is a verbose mode flag which causes information about each ping to be output to the console
- * (info level logging, so usually console). This can be helpfull to check the bounce backs are happening but should
- * be disabled for real timing tests as writing to the console will slow things down.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Bounce back messages to their reply to destination.
- * <tr><td> Provide command line invocation to start the bounce back on a configurable broker url.
- * </table>
- *
- * @todo Replace the command line parsing with a neater tool.
- *
- * @todo Make verbose accept a number of messages, only prints to console every X messages.
- */
-public class PingPongBouncer implements MessageListener
-{
- private static final Logger _logger = Logger.getLogger(PingPongBouncer.class);
-
- /** The default prefetch size for the message consumer. */
- private static final int PREFETCH = 1;
-
- /** The default no local flag for the message consumer. */
- private static final boolean NO_LOCAL = true;
-
- private static final String DEFAULT_DESTINATION_NAME = "ping";
-
- /** The default exclusive flag for the message consumer. */
- private static final boolean EXCLUSIVE = false;
-
- /** A convenient formatter to use when time stamping output. */
- protected static final SimpleDateFormat timestampFormatter = new SimpleDateFormat("hh:mm:ss:SS");
-
- /** Used to indicate that the reply generator should log timing info to the console (logger info level). */
- private boolean _verbose = false;
-
- /** Determines whether this bounce back client bounces back messages persistently. */
- private boolean _persistent = false;
-
- private Destination _consumerDestination;
-
- /** Keeps track of the response destination of the previous message for the last reply to producer cache. */
- private Destination _lastResponseDest;
-
- /** The producer for sending replies with. */
- private MessageProducer _replyProducer;
-
- /** The consumer controlSession. */
- private Session _consumerSession;
-
- /** The producer controlSession. */
- private Session _producerSession;
-
- /** Holds the connection to the broker. */
- private AMQConnection _connection;
-
- /** Flag used to indicate if this is a point to point or pub/sub ping client. */
- private boolean _isPubSub = false;
-
- /**
- * This flag is used to indicate that the user should be prompted to kill a broker, in order to test
- * failover, immediately before committing a transaction.
- */
- protected boolean _failBeforeCommit = false;
-
- /**
- * This flag is used to indicate that the user should be prompted to a kill a broker, in order to test
- * failover, immediate after committing a transaction.
- */
- protected boolean _failAfterCommit = false;
-
- /**
- * Creates a PingPongBouncer on the specified producer and consumer sessions.
- *
- * @param brokerDetails The addresses of the brokers to connect to.
- * @param username The broker username.
- * @param password The broker password.
- * @param virtualpath The virtual host name within the broker.
- * @param destinationName The name of the queue to receive pings on
- * (or root of the queue name where many queues are generated).
- * @param persistent A flag to indicate that persistent message should be used.
- * @param transacted A flag to indicate that pings should be sent within transactions.
- * @param selector A message selector to filter received pings with.
- * @param verbose A flag to indicate that message timings should be sent to the console.
- *
- * @throws Exception All underlying exceptions allowed to fall through. This is only test code...
- */
- public PingPongBouncer(String brokerDetails, String username, String password, String virtualpath,
- String destinationName, boolean persistent, boolean transacted, String selector, boolean verbose,
- boolean pubsub) throws Exception
- {
- // Create a client id to uniquely identify this client.
- InetAddress address = InetAddress.getLocalHost();
- String clientId = address.getHostName() + System.currentTimeMillis();
- _verbose = verbose;
- _persistent = persistent;
- setPubSub(pubsub);
- // Connect to the broker.
- setConnection(new AMQConnection(brokerDetails, username, password, clientId, virtualpath));
- _logger.info("Connected with URL:" + getConnection().toURL());
-
- // Set up the failover notifier.
- getConnection().setConnectionListener(new FailoverNotifier());
-
- // Create a controlSession to listen for messages on and one to send replies on, transactional depending on the
- // command line option.
- _consumerSession = (Session) getConnection().createSession(transacted, Session.AUTO_ACKNOWLEDGE);
- _producerSession = (Session) getConnection().createSession(transacted, Session.AUTO_ACKNOWLEDGE);
-
- // Create the queue to listen for message on.
- createConsumerDestination(destinationName);
- MessageConsumer consumer =
- _consumerSession.createConsumer(_consumerDestination, PREFETCH, NO_LOCAL, EXCLUSIVE, selector);
-
- // Create a producer for the replies, without a default destination.
- _replyProducer = _producerSession.createProducer(null);
- _replyProducer.setDisableMessageTimestamp(true);
- _replyProducer.setDeliveryMode(_persistent ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT);
-
- // Set this up to listen for messages on the queue.
- consumer.setMessageListener(this);
- }
-
- /**
- * Starts a stand alone ping-pong client running in verbose mode.
- *
- * @param args
- */
- public static void main(String[] args) throws Exception
- {
- System.out.println("Starting...");
-
- // Display help on the command line.
- if (args.length == 0)
- {
- _logger.info("Running test with default values...");
- //usage();
- //System.exit(0);
- }
-
- // Extract all command line parameters.
- Config config = new Config();
- config.setOptions(args);
- String brokerDetails = config.getHost() + ":" + config.getPort();
- String virtualpath = "test";
- String destinationName = config.getDestination();
- if (destinationName == null)
- {
- destinationName = DEFAULT_DESTINATION_NAME;
- }
-
- String selector = config.getSelector();
- boolean transacted = config.isTransacted();
- boolean persistent = config.usePersistentMessages();
- boolean pubsub = config.isPubSub();
- boolean verbose = true;
-
- //String selector = null;
-
- // Instantiate the ping pong client with the command line options and start it running.
- PingPongBouncer pingBouncer =
- new PingPongBouncer(brokerDetails, "guest", "guest", virtualpath, destinationName, persistent, transacted,
- selector, verbose, pubsub);
- pingBouncer.getConnection().start();
-
- System.out.println("Waiting...");
- }
-
- private static void usage()
- {
- System.err.println("Usage: PingPongBouncer \n" + "-host : broker host\n" + "-port : broker port\n"
- + "-destinationname : queue/topic name\n" + "-transacted : (true/false). Default is false\n"
- + "-persistent : (true/false). Default is false\n"
- + "-pubsub : (true/false). Default is false\n" + "-selector : selector string\n");
- }
-
- /**
- * This is a callback method that is notified of all messages for which this has been registered as a message
- * listener on a message consumer. It sends a reply (pong) to all messages it receieves on the reply to
- * destination of the message.
- *
- * @param message The message that triggered this callback.
- */
- public void onMessage(Message message)
- {
- try
- {
- String messageCorrelationId = message.getJMSCorrelationID();
- if (_verbose)
- {
- _logger.info(timestampFormatter.format(new Date()) + ": Got ping with correlation id, "
- + messageCorrelationId);
- }
-
- // Get the reply to destination from the message and check it is set.
- Destination responseDest = message.getJMSReplyTo();
-
- if (responseDest == null)
- {
- _logger.debug("Cannot send reply because reply-to destination is null.");
-
- return;
- }
-
- // Spew out some timing information if verbose mode is on.
- if (_verbose)
- {
- Long timestamp = message.getLongProperty("timestamp");
-
- if (timestamp != null)
- {
- long diff = System.currentTimeMillis() - timestamp;
- _logger.info("Time to bounce point: " + diff);
- }
- }
-
- // Correlate the reply to the original.
- message.setJMSCorrelationID(messageCorrelationId);
-
- // Send the receieved message as the pong reply.
- _replyProducer.send(responseDest, message);
-
- if (_verbose)
- {
- _logger.info(timestampFormatter.format(new Date()) + ": Sent reply with correlation id, "
- + messageCorrelationId);
- }
-
- // Commit the transaction if running in transactional mode.
- commitTx(_producerSession);
- }
- catch (JMSException e)
- {
- _logger.debug("There was a JMSException: " + e.getMessage(), e);
- }
- }
-
- /**
- * Gets the underlying connection that this ping client is running on.
- *
- * @return The underlying connection that this ping client is running on.
- */
- public AMQConnection getConnection()
- {
- return _connection;
- }
-
- /**
- * Sets the connection that this ping client is using.
- *
- * @param connection The ping connection.
- */
- public void setConnection(AMQConnection connection)
- {
- this._connection = connection;
- }
-
- /**
- * Sets or clears the pub/sub flag to indiciate whether this client is pinging a queue or a topic.
- *
- * @param pubsub <tt>true</tt> if this client is pinging a topic, <tt>false</tt> if it is pinging a queue.
- */
- public void setPubSub(boolean pubsub)
- {
- _isPubSub = pubsub;
- }
-
- /**
- * Checks whether this client is a p2p or pub/sub ping client.
- *
- * @return <tt>true</tt> if this client is pinging a topic, <tt>false</tt> if it is pinging a queue.
- */
- public boolean isPubSub()
- {
- return _isPubSub;
- }
-
- /**
- * Convenience method to commit the transaction on the specified controlSession. If the controlSession to commit on is not
- * a transactional controlSession, this method does nothing.
- *
- * <p/>If the {@link #_failBeforeCommit} flag is set, this will prompt the user to kill the broker before the
- * commit is applied. If the {@link #_failAfterCommit} flag is set, this will prompt the user to kill the broker
- * after the commit is applied.
- *
- * @throws javax.jms.JMSException If the commit fails and then the rollback fails.
- */
- protected void commitTx(Session session) throws JMSException
- {
- if (session.getTransacted())
- {
- try
- {
- if (_failBeforeCommit)
- {
- _logger.debug("Failing Before Commit");
- doFailover();
- }
-
- session.commit();
-
- if (_failAfterCommit)
- {
- _logger.debug("Failing After Commit");
- doFailover();
- }
-
- _logger.debug("Session Commited.");
- }
- catch (JMSException e)
- {
- _logger.trace("JMSException on commit:" + e.getMessage(), e);
-
- try
- {
- session.rollback();
- _logger.debug("Message rolled back.");
- }
- catch (JMSException jmse)
- {
- _logger.trace("JMSE on rollback:" + jmse.getMessage(), jmse);
-
- // Both commit and rollback failed. Throw the rollback exception.
- throw jmse;
- }
- }
- }
- }
-
- /**
- * Prompts the user to terminate the named broker, in order to test failover functionality. This method will block
- * until the user supplied some input on the terminal.
- *
- * @param broker The name of the broker to terminate.
- */
- protected void doFailover(String broker)
- {
- System.out.println("Kill Broker " + broker + " now.");
- try
- {
- System.in.read();
- }
- catch (IOException e)
- { }
-
- System.out.println("Continuing.");
- }
-
- /**
- * Prompts the user to terminate the broker, in order to test failover functionality. This method will block
- * until the user supplied some input on the terminal.
- */
- protected void doFailover()
- {
- System.out.println("Kill Broker now.");
- try
- {
- System.in.read();
- }
- catch (IOException e)
- { }
-
- System.out.println("Continuing.");
-
- }
-
- private void createConsumerDestination(String name)
- {
- if (isPubSub())
- {
- _consumerDestination = new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, name);
- }
- else
- {
- _consumerDestination = new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME, name);
- }
- }
-
- /**
- * A connection listener that logs out any failover complete events. Could do more interesting things with this
- * at some point...
- */
- public static class FailoverNotifier implements ConnectionListener
- {
- public void bytesSent(long count)
- { }
-
- public void bytesReceived(long count)
- { }
-
- public boolean preFailover(boolean redirect)
- {
- return true;
- }
-
- public boolean preResubscribe()
- {
- return true;
- }
-
- public void failoverComplete()
- {
- _logger.info("App got failover complete callback.");
- }
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongProducer.java b/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongProducer.java
deleted file mode 100644
index 639b0c72ba..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongProducer.java
+++ /dev/null
@@ -1,1818 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.requestreply;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.NDC;
-
-import org.apache.qpid.test.framework.TestUtils;
-
-import org.apache.qpid.junit.extensions.BatchedThrottle;
-import org.apache.qpid.junit.extensions.Throttle;
-import org.apache.qpid.junit.extensions.util.CommandLineParser;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-import javax.jms.*;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-
-import java.io.*;
-import java.net.InetAddress;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * PingPongProducer is a client that sends test messages, and waits for replies to these messages. The replies may
- * either be generated by another client (see {@link PingPongBouncer}, or an extension of it may be used that listens
- * to its own messages and does not send replies (see {@link org.apache.qpid.ping.PingClient}). The intention of ping
- * pong producer is that it is a swiss-army knife test client that makes almost every aspect of its behaviour
- * configurable.
- *
- * <p/>The pings are sent with a reply-to field set to a single temporary queue, which is the same for all pings. This
- * means that this class has to do some work to correlate pings with pongs; it expectes the original message correlation
- * id in the ping to be bounced back in the reply correlation id.
- *
- * <p/>This ping tool accepts a vast number of configuration options, all of which are passed in to the constructor. It
- * can ping topics or queues; ping multiple destinations; do persistent pings; send messages of any size; do pings within
- * transactions; control the number of pings to send in each transaction; limit its sending rate; and perform failover
- * testing. A complete list of accepted parameters, default values and comments on their usage is provided here:
- *
- * <p/><table><caption>Parameters</caption>
- * <tr><th> Parameter <th> Default <th> Comments
- * <tr><td> messageSize <td> 0 <td> Message size in bytes. Not including any headers.
- * <tr><td> destinationName <td> ping <td> The root name to use to generate destination names to ping.
- * <tr><td> persistent <td> false <td> Determines whether peristent delivery is used.
- * <tr><td> transacted <td> false <td> Determines whether messages are sent/received in transactions.
- * <tr><td> broker <td> tcp://localhost:5672 <td> Determines the broker to connect to.
- * <tr><td> virtualHost <td> test <td> Determines the virtual host to send all ping over.
- * <tr><td> rate <td> 0 <td> The maximum rate (in hertz) to send messages at. 0 means no limit.
- * <tr><td> verbose <td> false <td> The verbose flag for debugging. Prints to console on every message.
- * <tr><td> pubsub <td> false <td> Whether to ping topics or queues. Uses p2p by default.
- * <tr><td> failAfterCommit <td> false <td> Whether to prompt user to kill broker after a commit batch.
- * <tr><td> failBeforeCommit <td> false <td> Whether to prompt user to kill broker before a commit batch.
- * <tr><td> failAfterSend <td> false <td> Whether to prompt user to kill broker after a send.
- * <tr><td> failBeforeSend <td> false <td> Whether to prompt user to kill broker before a send.
- * <tr><td> failOnce <td> true <td> Whether to prompt for failover only once.
- * <tr><td> username <td> guest <td> The username to access the broker with.
- * <tr><td> password <td> guest <td> The password to access the broker with.
- * <tr><td> selector <td> null <td> Not used. Defines a message selector to filter pings with.
- * <tr><td> destinationCount <td> 1 <td> The number of destinations to send pings to.
- * <tr><td> numConsumers <td> 1 <td> The number of consumers on each destination.
- * <tr><td> timeout <td> 30000 <td> In milliseconds. The timeout to stop waiting for replies.
- * <tr><td> commitBatchSize <td> 1 <td> The number of messages per transaction in transactional mode.
- * <tr><td> uniqueDests <td> true <td> Whether each receivers only listens to one ping destination or all.
- * <tr><td> durableDests <td> false <td> Whether or not durable destinations are used.
- * <tr><td> ackMode <td> AUTO_ACK <td> The message acknowledgement mode. Possible values are:
- * 0 - SESSION_TRANSACTED
- * 1 - AUTO_ACKNOWLEDGE
- * 2 - CLIENT_ACKNOWLEDGE
- * 3 - DUPS_OK_ACKNOWLEDGE
- * 257 - NO_ACKNOWLEDGE
- * 258 - PRE_ACKNOWLEDGE
- * <tr><td> consTransacted <td> false <td> Whether or not consumers use transactions. Defaults to the same value
- * as the 'transacted' option if not seperately defined.
- * <tr><td> consAckMode <td> AUTO_ACK <td> The message acknowledgement mode for consumers. Defaults to the same
- * value as 'ackMode' if not seperately defined.
- * <tr><td> maxPending <td> 0 <td> The maximum size in bytes, of messages sent but not yet received.
- * Limits the volume of messages currently buffered on the client
- * or broker. Can help scale test clients by limiting amount of buffered
- * data to avoid out of memory errors.
- * </table>
- *
- * <p/>This implements the Runnable interface with a run method that implements an infinite ping loop. The ping loop
- * does all its work through helper methods, so that code wishing to run a ping-pong cycle is not forced to do so by
- * starting a new thread. The command line invocation does take advantage of this ping loop. A shutdown hook is also
- * registered to terminate the ping-pong loop cleanly.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a ping and wait for all responses cycle.
- * <tr><td> Provide command line invocation to loop the ping cycle on a configurable broker url.
- * </table>
- *
- * @todo Use read/write lock in the onmessage, not for reading writing but to make use of a shared and exlcusive lock pair.
- * Obtain read lock on all messages, before decrementing the message count. At the end of the on message method add a
- * block that obtains the write lock for the very last message, releases any waiting producer. Means that the last
- * message waits until all other messages have been handled before releasing producers but allows messages to be
- * processed concurrently, unlike the current synchronized block.
- */
-public class PingPongProducer implements Runnable, ExceptionListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(PingPongProducer.class);
-
- /** Holds the name of the property to determine whether of not client id is overridden at connection time. */
- public static final String OVERRIDE_CLIENT_ID_PROPNAME = "overrideClientId";
-
- /** Holds the default value of the override client id flag. */
- public static final String OVERRIDE_CLIENT_ID_DEAFULT = "false";
-
- /** Holds the name of the property to define the JNDI factory name with. */
- public static final String FACTORY_NAME_PROPNAME = "factoryName";
-
- /** Holds the default JNDI name of the connection factory. */
- public static final String FACTORY_NAME_DEAFULT = "local";
-
- /** Holds the name of the property to set the JNDI initial context properties with. */
- public static final String FILE_PROPERTIES_PROPNAME = "properties";
-
- /** Holds the default file name of the JNDI initial context properties. */
- public static final String FILE_PROPERTIES_DEAFULT = "perftests.properties";
-
- /** Holds the name of the property to get the test message size from. */
- public static final String MESSAGE_SIZE_PROPNAME = "messageSize";
-
- /** Used to set up a default message size. */
- public static final int MESSAGE_SIZE_DEAFULT = 0;
-
- /** Holds the name of the property to get the ping queue name from. */
- public static final String PING_QUEUE_NAME_PROPNAME = "destinationName";
-
- /** Holds the name of the default destination to send pings on. */
- public static final String PING_QUEUE_NAME_DEFAULT = "ping";
-
- /** Holds the name of the property to get the queue name postfix from. */
- public static final String QUEUE_NAME_POSTFIX_PROPNAME = "queueNamePostfix";
-
- /** Holds the default queue name postfix value. */
- public static final String QUEUE_NAME_POSTFIX_DEFAULT = "";
-
- /** Holds the name of the property to get the test delivery mode from. */
- public static final String PERSISTENT_MODE_PROPNAME = "persistent";
-
- /** Holds the message delivery mode to use for the test. */
- public static final boolean PERSISTENT_MODE_DEFAULT = false;
-
- /** Holds the name of the property to get the test transactional mode from. */
- public static final String TRANSACTED_PROPNAME = "transacted";
-
- /** Holds the transactional mode to use for the test. */
- public static final boolean TRANSACTED_DEFAULT = false;
-
- /** Holds the name of the property to get the test consumer transacted mode from. */
- public static final String CONSUMER_TRANSACTED_PROPNAME = "consTransacted";
-
- /** Holds the consumer transactional mode default setting. */
- public static final boolean CONSUMER_TRANSACTED_DEFAULT = false;
-
- /** Holds the name of the property to get the test broker url from. */
- public static final String BROKER_PROPNAME = "broker";
-
- /** Holds the default broker url for the test. */
- public static final String BROKER_DEFAULT = "tcp://localhost:5672";
-
- /** Holds the name of the property to get the test broker virtual path. */
- public static final String VIRTUAL_HOST_PROPNAME = "virtualHost";
-
- /** Holds the default virtual path for the test. */
- public static final String VIRTUAL_HOST_DEFAULT = "";
-
- /** Holds the name of the property to get the message rate from. */
- public static final String RATE_PROPNAME = "rate";
-
- /** Defines the default rate (in pings per second) to send pings at. 0 means as fast as possible, no restriction. */
- public static final int RATE_DEFAULT = 0;
-
- /** Holds the name of the property to get the verbose mode proeprty from. */
- public static final String VERBOSE_PROPNAME = "verbose";
-
- /** Holds the default verbose mode. */
- public static final boolean VERBOSE_DEFAULT = false;
-
- /** Holds the name of the property to get the p2p or pub/sub messaging mode from. */
- public static final String PUBSUB_PROPNAME = "pubsub";
-
- /** Holds the pub/sub mode default, true means ping a topic, false means ping a queue. */
- public static final boolean PUBSUB_DEFAULT = false;
-
- /** Holds the name of the property to get the fail after commit flag from. */
- public static final String FAIL_AFTER_COMMIT_PROPNAME = "failAfterCommit";
-
- /** Holds the default failover after commit test flag. */
- public static final boolean FAIL_AFTER_COMMIT_DEFAULT = false;
-
- /** Holds the name of the proeprty to get the fail before commit flag from. */
- public static final String FAIL_BEFORE_COMMIT_PROPNAME = "failBeforeCommit";
-
- /** Holds the default failover before commit test flag. */
- public static final boolean FAIL_BEFORE_COMMIT_DEFAULT = false;
-
- /** Holds the name of the proeprty to get the fail after send flag from. */
- public static final String FAIL_AFTER_SEND_PROPNAME = "failAfterSend";
-
- /** Holds the default failover after send test flag. */
- public static final boolean FAIL_AFTER_SEND_DEFAULT = false;
-
- /** Holds the name of the property to get the fail before send flag from. */
- public static final String FAIL_BEFORE_SEND_PROPNAME = "failBeforeSend";
-
- /** Holds the default failover before send test flag. */
- public static final boolean FAIL_BEFORE_SEND_DEFAULT = false;
-
- /** Holds the name of the property to get the fail once flag from. */
- public static final String FAIL_ONCE_PROPNAME = "failOnce";
-
- /** The default failover once flag, true means only do one failover, false means failover on every commit cycle. */
- public static final boolean FAIL_ONCE_DEFAULT = true;
-
- /** Holds the name of the property to get the broker access username from. */
- public static final String USERNAME_PROPNAME = "username";
-
- /** Holds the default broker log on username. */
- public static final String USERNAME_DEFAULT = "guest";
-
- /** Holds the name of the property to get the broker access password from. */
- public static final String PASSWORD_PROPNAME = "password";
-
- /** Holds the default broker log on password. */
- public static final String PASSWORD_DEFAULT = "guest";
-
- /** Holds the name of the proeprty to get the. */
- public static final String SELECTOR_PROPNAME = "selector";
-
- /** Holds the default message selector. */
- public static final String SELECTOR_DEFAULT = "";
-
- /** Holds the name of the property to get the destination count from. */
- public static final String DESTINATION_COUNT_PROPNAME = "destinationCount";
-
- /** Defines the default number of destinations to ping. */
- public static final int DESTINATION_COUNT_DEFAULT = 1;
-
- /** Holds the name of the property to get the number of consumers per destination from. */
- public static final String NUM_CONSUMERS_PROPNAME = "numConsumers";
-
- /** Defines the default number consumers per destination. */
- public static final int NUM_CONSUMERS_DEFAULT = 1;
-
- /** Holds the name of the property to get the waiting timeout for response messages. */
- public static final String TIMEOUT_PROPNAME = "timeout";
-
- /** Default time to wait before assuming that a ping has timed out. */
- public static final long TIMEOUT_DEFAULT = 30000;
-
- /** Holds the name of the property to get the commit batch size from. */
- public static final String TX_BATCH_SIZE_PROPNAME = "commitBatchSize";
-
- /** Defines the default number of pings to send in each transaction when running transactionally. */
- public static final int TX_BATCH_SIZE_DEFAULT = 1;
-
- /** Holds the name of the property to get the unique destinations flag from. */
- public static final String UNIQUE_DESTS_PROPNAME = "uniqueDests";
-
- /** Defines the default value for the unique destinations property. */
- public static final boolean UNIQUE_DESTS_DEFAULT = true;
-
- /** Holds the name of the property to get the durable destinations flag from. */
- public static final String DURABLE_DESTS_PROPNAME = "durableDests";
-
- /** Defines the default value of the durable destinations flag. */
- public static final boolean DURABLE_DESTS_DEFAULT = false;
-
- /** Holds the name of the proeprty to get the message acknowledgement mode from. */
- public static final String ACK_MODE_PROPNAME = "ackMode";
-
- /** Defines the default message acknowledgement mode. */
- public static final int ACK_MODE_DEFAULT = Session.AUTO_ACKNOWLEDGE;
-
- /** Holds the name of the property to get the consumers message acknowledgement mode from. */
- public static final String CONSUMER_ACK_MODE_PROPNAME = "consAckMode";
-
- /** Defines the default consumers message acknowledgement mode. */
- public static final int CONSUMER_ACK_MODE_DEFAULT = Session.AUTO_ACKNOWLEDGE;
-
- /** Holds the name of the property to get the maximum pending message size setting from. */
- public static final String MAX_PENDING_PROPNAME = "maxPending";
-
- /** Defines the default value for the maximum pending message size setting. 0 means no limit. */
- public static final int MAX_PENDING_DEFAULT = 0;
-
- /** Defines the default prefetch size to use when consuming messages. */
- public static final int PREFETCH_DEFAULT = 100;
-
- /** Defines the default value of the no local flag to use when consuming messages. */
- public static final boolean NO_LOCAL_DEFAULT = false;
-
- /** Defines the default value of the exclusive flag to use when consuming messages. */
- public static final boolean EXCLUSIVE_DEFAULT = false;
-
- /** Holds the name of the property to store nanosecond timestamps in ping messages with. */
- public static final String MESSAGE_TIMESTAMP_PROPNAME = "timestamp";
-
- /** Holds the name of the property to get the number of message to prefill the broker with before starting the main test. */
- public static final String PREFILL_PROPNAME = "preFill";
-
- /** Defines the default value for the number of messages to prefill. 0,default, no messages. */
- public static final int PREFILL_DEFAULT = 0;
-
- /** Holds the name of the property to get the delay to wait in ms before starting the main test after having prefilled. */
- public static final String DELAY_BEFORE_CONSUME_PROPNAME = "delayBeforeConsume";
-
- /** Defines the default value for delay in ms to wait before starting thet test run. 0,default, no delay. */
- public static final long DELAY_BEFORE_CONSUME = 0;
-
- /** Holds the name of the property to get when no messasges should be sent. */
- public static final String CONSUME_ONLY_PROPNAME = "consumeOnly";
-
- /** Defines the default value of the consumeOnly flag to use when publishing messages is not desired. */
- public static final boolean CONSUME_ONLY_DEFAULT = false;
-
- /** Holds the name of the property to get when no messasges should be sent. */
- public static final String SEND_ONLY_PROPNAME = "sendOnly";
-
- /** Defines the default value of the consumeOnly flag to use when publishing messages is not desired. */
- public static final boolean SEND_ONLY_DEFAULT = false;
-
- /** Holds the default configuration properties. */
- public static ParsedProperties defaults = new ParsedProperties();
-
- static
- {
- defaults.setPropertyIfNull(OVERRIDE_CLIENT_ID_PROPNAME, OVERRIDE_CLIENT_ID_DEAFULT);
- defaults.setPropertyIfNull(FILE_PROPERTIES_PROPNAME, FILE_PROPERTIES_DEAFULT);
- defaults.setPropertyIfNull(FACTORY_NAME_PROPNAME, FACTORY_NAME_DEAFULT);
- defaults.setPropertyIfNull(BROKER_PROPNAME, BROKER_DEFAULT);
- defaults.setPropertyIfNull(USERNAME_PROPNAME, USERNAME_DEFAULT);
- defaults.setPropertyIfNull(PASSWORD_PROPNAME, PASSWORD_DEFAULT);
- defaults.setPropertyIfNull(VIRTUAL_HOST_PROPNAME, VIRTUAL_HOST_DEFAULT);
- defaults.setPropertyIfNull(PING_QUEUE_NAME_PROPNAME, PING_QUEUE_NAME_DEFAULT);
- defaults.setPropertyIfNull(QUEUE_NAME_POSTFIX_PROPNAME, QUEUE_NAME_POSTFIX_DEFAULT);
- defaults.setPropertyIfNull(SELECTOR_PROPNAME, SELECTOR_DEFAULT);
- defaults.setPropertyIfNull(TRANSACTED_PROPNAME, TRANSACTED_DEFAULT);
- defaults.setPropertyIfNull(CONSUMER_TRANSACTED_PROPNAME, CONSUMER_TRANSACTED_DEFAULT);
- defaults.setPropertyIfNull(PERSISTENT_MODE_PROPNAME, PERSISTENT_MODE_DEFAULT);
- defaults.setPropertyIfNull(ACK_MODE_PROPNAME, ACK_MODE_DEFAULT);
- defaults.setPropertyIfNull(CONSUMER_ACK_MODE_PROPNAME, CONSUMER_ACK_MODE_DEFAULT);
- defaults.setPropertyIfNull(MESSAGE_SIZE_PROPNAME, MESSAGE_SIZE_DEAFULT);
- defaults.setPropertyIfNull(VERBOSE_PROPNAME, VERBOSE_DEFAULT);
- defaults.setPropertyIfNull(PUBSUB_PROPNAME, PUBSUB_DEFAULT);
- defaults.setPropertyIfNull(UNIQUE_DESTS_PROPNAME, UNIQUE_DESTS_DEFAULT);
- defaults.setPropertyIfNull(DURABLE_DESTS_PROPNAME, DURABLE_DESTS_DEFAULT);
- defaults.setPropertyIfNull(FAIL_BEFORE_COMMIT_PROPNAME, FAIL_BEFORE_COMMIT_DEFAULT);
- defaults.setPropertyIfNull(FAIL_AFTER_COMMIT_PROPNAME, FAIL_AFTER_COMMIT_DEFAULT);
- defaults.setPropertyIfNull(FAIL_BEFORE_SEND_PROPNAME, FAIL_BEFORE_SEND_DEFAULT);
- defaults.setPropertyIfNull(FAIL_AFTER_SEND_PROPNAME, FAIL_AFTER_SEND_DEFAULT);
- defaults.setPropertyIfNull(FAIL_ONCE_PROPNAME, FAIL_ONCE_DEFAULT);
- defaults.setPropertyIfNull(TX_BATCH_SIZE_PROPNAME, TX_BATCH_SIZE_DEFAULT);
- defaults.setPropertyIfNull(DESTINATION_COUNT_PROPNAME, DESTINATION_COUNT_DEFAULT);
- defaults.setPropertyIfNull(NUM_CONSUMERS_PROPNAME, NUM_CONSUMERS_DEFAULT);
- defaults.setPropertyIfNull(RATE_PROPNAME, RATE_DEFAULT);
- defaults.setPropertyIfNull(TIMEOUT_PROPNAME, TIMEOUT_DEFAULT);
- defaults.setPropertyIfNull(MAX_PENDING_PROPNAME, MAX_PENDING_DEFAULT);
- defaults.setPropertyIfNull(PREFILL_PROPNAME, PREFILL_DEFAULT);
- defaults.setPropertyIfNull(DELAY_BEFORE_CONSUME_PROPNAME, DELAY_BEFORE_CONSUME);
- defaults.setPropertyIfNull(CONSUME_ONLY_PROPNAME, CONSUME_ONLY_DEFAULT);
- defaults.setPropertyIfNull(SEND_ONLY_PROPNAME, SEND_ONLY_DEFAULT);
- }
-
- /** Allows setting of client ID on the connection, rather than through the connection URL. */
- protected boolean _overrideClientId;
-
- /** Holds the JNDI name of the JMS connection factory. */
- protected String _factoryName;
-
- /** Holds the name of the properties file to configure JNDI with. */
- protected String _fileProperties;
-
- /** Holds the broker url. */
- protected String _brokerDetails;
-
- /** Holds the username to access the broker with. */
- protected String _username;
-
- /** Holds the password to access the broker with. */
- protected String _password;
-
- /** Holds the virtual host on the broker to run the tests through. */
- protected String _virtualpath;
-
- /** Holds the root name from which to generate test destination names. */
- protected String _destinationName;
-
- /** Holds the default queue name postfix value. */
- protected String _queueNamePostfix;
-
- /** Holds the message selector to filter the pings with. */
- protected String _selector;
-
- /** Holds the producers transactional mode flag. */
- protected boolean _transacted;
-
- /** Holds the consumers transactional mode flag. */
- protected boolean _consTransacted;
-
- /** Determines whether this producer sends persistent messages. */
- protected boolean _persistent;
-
- /** Holds the acknowledgement mode used for the producers. */
- protected int _ackMode;
-
- /** Holds the acknowledgement mode setting for the consumers. */
- protected int _consAckMode;
-
- /** Determines what size of messages this producer sends. */
- protected int _messageSize;
-
- /** Used to indicate that the ping loop should print out whenever it pings. */
- protected boolean _verbose;
-
- /** Flag used to indicate if this is a point to point or pub/sub ping client. */
- protected boolean _isPubSub;
-
- /** Flag used to indicate if the destinations should be unique client. */
- protected boolean _isUnique;
-
- /** Flag used to indicate that durable destination should be used. */
- protected boolean _isDurable;
-
- /** Flag used to indicate that the user should be prompted to terminate a broker, to test failover before a commit. */
- protected boolean _failBeforeCommit;
-
- /** Flag used to indicate that the user should be prompted to terminate a broker, to test failover after a commit. */
- protected boolean _failAfterCommit;
-
- /** Flag used to indicate that the user should be prompted to terminate a broker, to test failover before a send. */
- protected boolean _failBeforeSend;
-
- /** Flag used to indicate that the user should be prompted to terminate a broker, to test failover after a send. */
- protected boolean _failAfterSend;
-
- /** Flag used to indicate that failover prompting should only be done on the first commit, not on every commit. */
- protected boolean _failOnce;
-
- /** Holds the number of sends that should be performed in every transaction when using transactions. */
- protected int _txBatchSize;
-
- /** Holds the number of destinations to ping. */
- protected int _noOfDestinations;
-
- /** Holds the number of consumers per destination. */
- protected int _noOfConsumers;
-
- private int[] _consumerBatchCounts;
-
- /** Holds the maximum send rate in herz. */
- protected int _rate;
-
- /**
- * Holds the size of the maximum amount of pending data that the client should buffer, sending is suspended
- * if this limit is breached.
- */
- protected int _maxPendingSize;
-
- /**
- * Holds the number of messages to send during the setup phase, before the clients start consuming.
- */
- private Integer _preFill;
-
- /**
- * Holds the time in ms to wait after preFilling before starting thet test.
- */
- private Long _delayBeforeConsume;
-
- /**
- * Holds a boolean value of wither this test should just consume, i.e. skips
- * sending messages, but still expects to receive the specified number.
- */
- private boolean _consumeOnly;
-
- /**
- * Holds a boolean value of wither this test should just send, i.e. skips
- * consuming messages, but still creates clients just doesn't start them.
- */
- private boolean _sendOnly;
-
-
- /** A source for providing sequential unique correlation ids. These will be unique within the same JVM. */
- private static AtomicLong _correlationIdGenerator = new AtomicLong(0L);
-
- /** A source for providing sequential unqiue ids for instances of this class to be identifed with. */
- private static AtomicInteger _instanceIdGenerator = new AtomicInteger(0);
-
- /** Holds this instances unique id. */
- private int instanceId;
-
- /**
- * Holds a map from message ids to latches on which threads wait for replies. This map is shared accross multiple
- * ping producers on the same JVM.
- */
- private static Map<String, PerCorrelationId> perCorrelationIds =
- Collections.synchronizedMap(new HashMap<String, PerCorrelationId>());
-
- /** A convenient formatter to use when time stamping output. */
- protected static final DateFormat timestampFormatter = new SimpleDateFormat("hh:mm:ss:SS");
-
- /** Holds the connection for the message producer. */
- protected Connection _connection;
-
- /** Holds the consumer connections. */
- protected Connection[] _consumerConnection;
-
- /** Holds the controlSession on which ping replies are received. */
- protected Session[] _consumerSession;
-
- /** Holds the producer controlSession, needed to create ping messages. */
- protected Session _producerSession;
-
- /** Holds the destination where the response messages will arrive. */
- protected Destination _replyDestination;
-
- /** Holds the set of destinations that this ping producer pings. */
- protected List<Destination> _pingDestinations;
-
- /** Used to restrict the sending rate to a specified limit. */
- protected Throttle _rateLimiter;
-
- /** Holds a message listener that this message listener chains all its messages to. */
- protected ChainedMessageListener _chainedMessageListener = null;
-
- /**
- * This id generator is used to generate ids to append to the queue name to ensure that queues can be unique when
- * creating multiple ping producers in the same JVM.
- */
- protected static AtomicInteger _queueJVMSequenceID = new AtomicInteger();
-
- /**
- * This id generator is used to generates ids that are only unique within this pinger. Creating multiple pingers
- * on the same JVM using this id generator will allow them to ping on the same queues.
- */
- protected AtomicInteger _queueSharedID = new AtomicInteger();
-
- /** Used to tell the ping loop when to terminate, it only runs while this is true. */
- protected boolean _publish = true;
-
- /** Holds the message producer to send the pings through. */
- protected MessageProducer _producer;
-
- /** Holds the message consumer to receive the ping replies through. */
- protected MessageConsumer[] _consumer;
-
- /** The prompt to display when asking the user to kill the broker for failover testing. */
- private static final String KILL_BROKER_PROMPT = "Kill broker now, then press Return.";
-
- /** Holds the name for this test client to be identified to the broker with. */
- private String _clientID;
-
- /** Keeps count of the total messages sent purely for debugging purposes. */
- private static AtomicInteger numSent = new AtomicInteger();
-
- /**
- * Holds a monitor which is used to synchronize sender and receivers threads, where the sender has elected
- * to wait until the number of unreceived message is reduced before continuing to send. This monitor is a
- * fair SynchronousQueue becuase that provides fair scheduling, to ensure that all producer threads get an
- * equal chance to produce messages.
- */
- static final SynchronousQueue _sendPauseMonitor = new SynchronousQueue(true);
-
- /** Keeps a count of the number of message currently sent but not received. */
- static AtomicInteger _unreceived = new AtomicInteger(0);
-
- /**
- * Creates a ping producer with the specified parameters, of which there are many. See the class level comments
- * for details. This constructor creates a connection to the broker and creates producer and consumer sessions on
- * it, to send and recieve its pings and replies on.
- *
- * @param overrides Properties containing any desired overrides to the defaults.
- *
- * @throws Exception Any exceptions are allowed to fall through.
- */
- public PingPongProducer(Properties overrides) throws Exception
- {
- // log.debug("public PingPongProducer(Properties overrides = " + overrides + "): called");
- instanceId = _instanceIdGenerator.getAndIncrement();
-
- // Create a set of parsed properties from the defaults overriden by the passed in values.
- ParsedProperties properties = new ParsedProperties(defaults);
- properties.putAll(overrides);
-
- // Extract the configuration properties to set the pinger up with.
- _overrideClientId = properties.getPropertyAsBoolean(OVERRIDE_CLIENT_ID_PROPNAME);
- _factoryName = properties.getProperty(FACTORY_NAME_PROPNAME);
- _fileProperties = properties.getProperty(FILE_PROPERTIES_PROPNAME);
- _brokerDetails = properties.getProperty(BROKER_PROPNAME);
- _username = properties.getProperty(USERNAME_PROPNAME);
- _password = properties.getProperty(PASSWORD_PROPNAME);
- _virtualpath = properties.getProperty(VIRTUAL_HOST_PROPNAME);
- _destinationName = properties.getProperty(PING_QUEUE_NAME_PROPNAME);
- _queueNamePostfix = properties.getProperty(QUEUE_NAME_POSTFIX_PROPNAME);
- _selector = properties.getProperty(SELECTOR_PROPNAME);
- _transacted = properties.getPropertyAsBoolean(TRANSACTED_PROPNAME);
- _consTransacted = properties.getPropertyAsBoolean(CONSUMER_TRANSACTED_PROPNAME);
- _persistent = properties.getPropertyAsBoolean(PERSISTENT_MODE_PROPNAME);
- _messageSize = properties.getPropertyAsInteger(MESSAGE_SIZE_PROPNAME);
- _verbose = properties.getPropertyAsBoolean(VERBOSE_PROPNAME);
- _failAfterCommit = properties.getPropertyAsBoolean(FAIL_AFTER_COMMIT_PROPNAME);
- _failBeforeCommit = properties.getPropertyAsBoolean(FAIL_BEFORE_COMMIT_PROPNAME);
- _failAfterSend = properties.getPropertyAsBoolean(FAIL_AFTER_SEND_PROPNAME);
- _failBeforeSend = properties.getPropertyAsBoolean(FAIL_BEFORE_SEND_PROPNAME);
- _failOnce = properties.getPropertyAsBoolean(FAIL_ONCE_PROPNAME);
- _txBatchSize = properties.getPropertyAsInteger(TX_BATCH_SIZE_PROPNAME);
- _noOfDestinations = properties.getPropertyAsInteger(DESTINATION_COUNT_PROPNAME);
- _noOfConsumers = properties.getPropertyAsInteger(NUM_CONSUMERS_PROPNAME);
- _consumerBatchCounts = new int[_noOfConsumers];
- _rate = properties.getPropertyAsInteger(RATE_PROPNAME);
- _isPubSub = properties.getPropertyAsBoolean(PUBSUB_PROPNAME);
- _isUnique = properties.getPropertyAsBoolean(UNIQUE_DESTS_PROPNAME);
- _isDurable = properties.getPropertyAsBoolean(DURABLE_DESTS_PROPNAME);
- _ackMode = _transacted ? 0 : properties.getPropertyAsInteger(ACK_MODE_PROPNAME);
- _consAckMode = _consTransacted ? 0 : properties.getPropertyAsInteger(CONSUMER_ACK_MODE_PROPNAME);
- _maxPendingSize = properties.getPropertyAsInteger(MAX_PENDING_PROPNAME);
- _preFill = properties.getPropertyAsInteger(PREFILL_PROPNAME);
- _delayBeforeConsume = properties.getPropertyAsLong(DELAY_BEFORE_CONSUME_PROPNAME);
- _consumeOnly = properties.getPropertyAsBoolean(CONSUME_ONLY_PROPNAME);
- _sendOnly = properties.getPropertyAsBoolean(SEND_ONLY_PROPNAME);
-
- // Check that one or more destinations were specified.
- if (_noOfDestinations < 1)
- {
- throw new IllegalArgumentException("There must be at least one destination.");
- }
-
- // Set up a throttle to control the send rate, if a rate > 0 is specified.
- if (_rate > 0)
- {
- _rateLimiter = new BatchedThrottle();
- _rateLimiter.setRate(_rate);
- }
-
- // Create the connection and message producers/consumers.
- // establishConnection(true, true);
- }
-
- /**
- * Establishes a connection to the broker and creates message consumers and producers based on the parameters
- * that this ping client was created with.
- *
- * @param producer Flag to indicate whether or not the producer should be set up.
- * @param consumer Flag to indicate whether or not the consumers should be set up.
- *
- * @throws Exception Any exceptions are allowed to fall through.
- */
- public void establishConnection(boolean producer, boolean consumer) throws Exception
- {
- // log.debug("public void establishConnection(): called");
-
- // Generate a unique identifying name for this client, based on it ip address and the current time.
- InetAddress address = InetAddress.getLocalHost();
- // _clientID = address.getHostName() + System.currentTimeMillis();
- _clientID = "perftest_" + instanceId;
-
- // Create a connection to the broker.
- createConnection(_clientID);
-
- // Create transactional or non-transactional sessions, based on the command line arguments.
- _producerSession = _connection.createSession(_transacted, _ackMode);
-
- _consumerSession = new Session[_noOfConsumers];
-
- for (int i = 0; i < _noOfConsumers; i++)
- {
- _consumerSession[i] = _consumerConnection[i].createSession(_consTransacted, _consAckMode);
- }
-
- // Create the destinations to send pings to and receive replies from.
- if (_noOfConsumers > 0)
- {
- _replyDestination = _consumerSession[0].createTemporaryQueue();
- }
- createPingDestinations(_noOfDestinations, _selector, _destinationName, _isUnique, _isDurable);
-
- // Create the message producer only if instructed to.
- if (producer)
- {
- createProducer();
- }
-
- // Create the message consumer only if instructed to.
- if (consumer)
- {
- createReplyConsumers(getReplyDestinations(), _selector);
- }
- }
-
- /**
- * Establishes a connection to the broker, based on the configuration parameters that this ping client was
- * created with.
- *
- * @param clientID The clients identifier.
- *
- * @throws JMSException Underlying exceptions allowed to fall through.
- * @throws NamingException Underlying exceptions allowed to fall through.
- * @throws IOException Underlying exceptions allowed to fall through.
- */
- protected void createConnection(String clientID) throws JMSException, NamingException, IOException
- {
- // _log.debug("protected void createConnection(String clientID = " + clientID + "): called");
-
- // _log.debug("Creating a connection for the message producer.");
- File propsFile = new File(_fileProperties);
- InputStream is = new FileInputStream(propsFile);
- Properties properties = new Properties();
- properties.load(is);
-
- Context context = new InitialContext(properties);
- ConnectionFactory factory = (ConnectionFactory) context.lookup(_factoryName);
- _connection = factory.createConnection(_username, _password);
-
- if (_overrideClientId)
- {
- _connection.setClientID(clientID);
- }
-
- // _log.debug("Creating " + _noOfConsumers + " connections for the consumers.");
-
- _consumerConnection = new Connection[_noOfConsumers];
-
- for (int i = 0; i < _noOfConsumers; i++)
- {
- _consumerConnection[i] = factory.createConnection(_username, _password);
- // _consumerConnection[i].setClientID(clientID);
- }
- }
-
- /**
- * Starts a ping-pong loop running from the command line. The bounce back client {@link PingPongBouncer} also needs
- * to be started to bounce the pings back again.
- *
- * @param args The command line arguments.
- */
- public static void main(String[] args)
- {
- try
- {
- Properties options =
- CommandLineParser.processCommandLine(args, new CommandLineParser(new String[][] {}), System.getProperties());
-
- // Create a ping producer overriding its defaults with all options passed on the command line.
- PingPongProducer pingProducer = new PingPongProducer(options);
- pingProducer.establishConnection(true, true);
-
- // Start the ping producers dispatch thread running.
- pingProducer._connection.start();
-
- // Create a shutdown hook to terminate the ping-pong producer.
- Runtime.getRuntime().addShutdownHook(pingProducer.getShutdownHook());
-
- // Ensure that the ping pong producer is registered to listen for exceptions on the connection too.
- pingProducer._connection.setExceptionListener(pingProducer);
-
- // Create the ping loop thread and run it until it is terminated by the shutdown hook or exception.
- Thread pingThread = new Thread(pingProducer);
- pingThread.run();
- pingThread.join();
- }
- catch (Exception e)
- {
- System.err.println(e.getMessage());
- log.error("Top level handler caught execption.", e);
- System.exit(1);
- }
- }
-
- /**
- * Convenience method for a short pause.
- *
- * @param sleepTime The time in milliseconds to pause for.
- */
- public static void pause(long sleepTime)
- {
- if (sleepTime > 0)
- {
- try
- {
- Thread.sleep(sleepTime);
- }
- catch (InterruptedException ie)
- { }
- }
- }
-
- /**
- * Gets all the reply destinations (to listen for replies on). In this case this will just be the single reply to
- * destination of this pinger.
- *
- * @return The single reply to destination of this pinger, wrapped in a list.
- */
- public List<Destination> getReplyDestinations()
- {
- // log.debug("public List<Destination> getReplyDestinations(): called");
-
- List<Destination> replyDestinations = new ArrayList<Destination>();
- replyDestinations.add(_replyDestination);
-
- // log.debug("replyDestinations = " + replyDestinations);
-
- return replyDestinations;
- }
-
- /**
- * Creates the producer to send the pings on. This is created without a default destination. Its persistent delivery
- * flag is set accoring the ping producer creation options.
- *
- * @throws JMSException Any JMSExceptions are allowed to fall through.
- */
- public void createProducer() throws JMSException
- {
- // log.debug("public void createProducer(): called");
-
- _producer = (MessageProducer) _producerSession.createProducer(null);
- _producer.setDeliveryMode(_persistent ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT);
-
- // log.debug("Created producer for " + (_persistent ? "persistent" : "non-persistent") + " messages.");
- }
-
- /**
- * Creates consumers for the specified number of destinations. The destinations themselves are also created by this
- * method.
- *
- * @param noOfDestinations The number of destinations to create consumers for.
- * @param selector The message selector to filter the consumers with.
- * @param rootName The root of the name, or actual name if only one is being created.
- * @param unique <tt>true</tt> to make the destinations unique to this pinger, <tt>false</tt> to share the
- * numbering with all pingers on the same JVM.
- * @param durable If the destinations are durable topics.
- *
- * @throws JMSException Any JMSExceptions are allowed to fall through.
- */
- public void createPingDestinations(int noOfDestinations, String selector, String rootName, boolean unique,
- boolean durable) throws JMSException
- {
- /*log.debug("public void createPingDestinations(int noOfDestinations = " + noOfDestinations + ", String selector = "
- + selector + ", String rootName = " + rootName + ", boolean unique = " + unique + ", boolean durable = "
- + durable + "): called");*/
-
- _pingDestinations = new ArrayList<Destination>();
-
- // Create the desired number of ping destinations and consumers for them.
- // log.debug("Creating " + noOfDestinations + " destinations to ping.");
-
- for (int i = 0; i < noOfDestinations; i++)
- {
- Destination destination;
- String id;
-
- // Generate an id, unique within this pinger or to the whole JVM depending on the unique flag.
- if (unique)
- {
- // log.debug("Creating unique destinations.");
- id = "_" + _queueJVMSequenceID.incrementAndGet() + "_" + _connection.getClientID();
- }
- else
- {
- // log.debug("Creating shared destinations.");
- id = "_" + _queueSharedID.incrementAndGet();
- }
-
- // Check if this is a pub/sub pinger, in which case create topics.
- if (_isPubSub)
- {
- destination = _producerSession.createTopic(rootName + id);
- // log.debug("Created non-durable topic " + destination);
-
- if (durable)
- {
- _producerSession.createDurableSubscriber((Topic) destination, _connection.getClientID());
- }
- }
- // Otherwise this is a p2p pinger, in which case create queues.
- else
- {
- destination = _producerSession.createQueue(rootName + id + _queueNamePostfix);
- // log.debug("Created queue " + destination);
- }
-
- // Keep the destination.
- _pingDestinations.add(destination);
- }
- }
-
- /**
- * Creates consumers for the specified destinations and registers this pinger to listen to their messages.
- *
- * @param destinations The destinations to listen to.
- * @param selector A selector to filter the messages with.
- *
- * @throws javax.jms.JMSException Any JMSExceptions are allowed to fall through.
- */
- public void createReplyConsumers(Collection<Destination> destinations, String selector) throws JMSException
- {
- /*log.debug("public void createReplyConsumers(Collection<Destination> destinations = " + destinations
- + ", String selector = " + selector + "): called");*/
-
- log.debug("There are " + destinations.size() + " destinations.");
- log.debug("Creating " + _noOfConsumers + " consumers on each destination.");
- log.debug("Total number of consumers is: " + (destinations.size() * _noOfConsumers));
-
- for (Destination destination : destinations)
- {
- _consumer = new MessageConsumer[_noOfConsumers];
-
- // If we don't have consumers then ensure we have created the
- // destination.
- if (_noOfConsumers == 0)
- {
- _producerSession.createConsumer(destination, selector,
- NO_LOCAL_DEFAULT).close();
- }
-
- for (int i = 0; i < _noOfConsumers; i++)
- {
- // Create a consumer for the destination and set this pinger to listen to its messages.
- _consumer[i] = _consumerSession[i].createConsumer(destination, selector, NO_LOCAL_DEFAULT);
-
- final int consumerNo = i;
-
- _consumer[i].setMessageListener(new MessageListener()
- {
- public void onMessage(Message message)
- {
- onMessageWithConsumerNo(message, consumerNo);
- }
- });
-
- log.debug("Set consumer " + i + " to listen to replies sent to destination: " + destination);
- }
- }
- }
-
- /**
- * Stores the received message in the replies map, then resets the boolean latch that a thread waiting for a
- * correlating reply may be waiting on. This is only done if the reply has a correlation id that is expected in the
- * replies map.
- *
- * @param message The received message.
- * @param consumerNo The consumer number within this test pinger instance.
- */
- public void onMessageWithConsumerNo(Message message, int consumerNo)
- {
- // log.debug("public void onMessageWithConsumerNo(Message message, int consumerNo = " + consumerNo + "): called");
- try
- {
- long now = System.nanoTime();
- long timestamp = getTimestamp(message);
- long pingTime = now - timestamp;
-
- // NDC.push("id" + instanceId + "/cons" + consumerNo);
-
- // Extract the messages correlation id.
- String correlationID = message.getJMSCorrelationID();
- // log.debug("correlationID = " + correlationID);
-
- // int num = message.getIntProperty("MSG_NUM");
- // log.info("Message " + num + " received.");
-
- boolean isRedelivered = message.getJMSRedelivered();
- // log.debug("isRedelivered = " + isRedelivered);
-
- if (!isRedelivered)
- {
- // Countdown on the traffic light if there is one for the matching correlation id.
- PerCorrelationId perCorrelationId = perCorrelationIds.get(correlationID);
-
- if (perCorrelationId != null)
- {
- CountDownLatch trafficLight = perCorrelationId.trafficLight;
-
- // Restart the timeout timer on every message.
- perCorrelationId.timeOutStart = System.nanoTime();
-
- // log.debug("Reply was expected, decrementing the latch for the id, " + correlationID);
-
- // Release waiting senders if there are some and using maxPending limit.
- if ((_maxPendingSize > 0))
- {
- // Decrement the count of sent but not yet received messages.
- int unreceived = _unreceived.decrementAndGet();
- int unreceivedSize =
- (unreceived * ((_messageSize == 0) ? 1 : _messageSize))
- / (_isPubSub ? getConsumersPerDestination() : 1);
-
- // log.debug("unreceived = " + unreceived);
- // log.debug("unreceivedSize = " + unreceivedSize);
-
- // synchronized (_sendPauseMonitor)
- // {
- if (unreceivedSize < _maxPendingSize)
- {
- _sendPauseMonitor.poll();
- }
- // }
- }
-
- // Decrement the countdown latch. Before this point, it is possible that two threads might enter this
- // method simultanesouly with the same correlation id. Decrementing the latch in a synchronized block
- // ensures that each thread will get a unique value for the remaining messages.
- long trueCount;
- long remainingCount;
-
- synchronized (trafficLight)
- {
- trafficLight.countDown();
-
- trueCount = trafficLight.getCount();
- remainingCount = trueCount - 1;
-
- if (++_consumerBatchCounts[consumerNo] == _txBatchSize)
- {
- _consumerBatchCounts[consumerNo] = 0;
- if (_consAckMode == 2)
- {
- // log.debug("Doing client ack for consumer " + consumerNo + ".");
- message.acknowledge();
- }
- else
- {
- // log.debug("Trying commit for consumer " + consumerNo + ".");
- commitTx(_consumerSession[consumerNo]);
- // log.info("Tx committed on consumer " + consumerNo);
- }
- }
-
- // Forward the message and remaining count to any interested chained message listener.
- if (_chainedMessageListener != null)
- {
- _chainedMessageListener.onMessage(message, (int) remainingCount, pingTime);
- }
-
- // Check if this is the last message, in which case release any waiting producers. This is done
- // after the transaction has been committed and any listeners notified.
- if (trueCount == 1)
- {
- trafficLight.countDown();
- }
- }
- }
- else
- {
- log.warn(consumerNo + " Got unexpected message with correlationId: " + correlationID);
- log.warn(consumerNo + " Map contains:" + perCorrelationIds.entrySet());
- }
- }
- else
- {
- log.warn("Got redelivered message, ignoring.");
- }
- }
- catch (Exception e)
- {
- log.warn("There was a Exception: " + e.getMessage(), e);
- }
- finally
- {
- // log.debug("public void onMessageWithConsumerNo(Message message, int consumerNo): ending");
- // NDC.clear();
- }
- }
-
- public void setupCorrelationID(String correlationId, int expectedCount)
- {
- PerCorrelationId perCorrelationId = new PerCorrelationId();
-
- // Create a count down latch to count the number of replies with. This is created before the messages are
- // sent so that the replies cannot be received before the count down is created.
- // One is added to this, so that the last reply becomes a special case. The special case is that the
- // chained message listener must be called before this sender can be unblocked, but that decrementing the
- // countdown needs to be done before the chained listener can be called.
- perCorrelationId.trafficLight = new CountDownLatch(expectedCount + 1);
-
- perCorrelationIds.put(correlationId, perCorrelationId);
- }
-
-
- /**
- * Sends the specified number of ping message and then waits for all correlating replies. If the wait times out
- * before a reply arrives, then a null reply is returned from this method. This method allows the caller to specify
- * the correlation id.
- *
- * Can be augmented through a pre-fill property (PingPongProducer.PREFILL_PROPNAME) that will populate the destination
- * with a set number of messages so the total pings sent and therefore expected will be PREFILL + numPings.
- *
- * If pre-fill is specified then the consumers will start paused to allow the prefilling to occur.
- *
- * @param message The message to send. If this is null, one is generated.
- * @param numPings The number of ping messages to send.
- * @param timeout The timeout in milliseconds.
- * @param messageCorrelationId The message correlation id. If this is null, one is generated.
- *
- * @return The number of replies received. This may be less than the number sent if the timeout terminated the wait
- * for all prematurely. If we are running in noConsumer=0 so send only mode then it will return the no msgs sent.
- *
- * @throws JMSException All underlying JMSExceptions are allowed to fall through.
- * @throws InterruptedException When interrupted by a timeout
- */
- public int pingAndWaitForReply(Message message, int numPings, long timeout, String messageCorrelationId)
- throws JMSException, InterruptedException
- {
- return pingAndWaitForReply(message, numPings, 0, timeout, messageCorrelationId);
- }
-
- public int pingAndWaitForReply(Message message, int numPings, int preFill, long timeout, String messageCorrelationId)
- throws JMSException, InterruptedException
- {
- /*log.debug("public int pingAndWaitForReply(Message message, int numPings = " + numPings + ", long timeout = "
- + timeout + ", String messageCorrelationId = " + messageCorrelationId + "): called");*/
-
- int totalPingsRequested = numPings + preFill;
-
- // Generate a unique correlation id to put on the messages before sending them, if one was not specified.
- if (messageCorrelationId == null)
- {
- messageCorrelationId = Long.toString(_correlationIdGenerator.incrementAndGet());
-
- setupCorrelationID(messageCorrelationId, getExpectedNumPings(totalPingsRequested));
- }
-
- try
- {
- // NDC.push("prod");
-
- PerCorrelationId perCorrelationId = perCorrelationIds.get(messageCorrelationId);
-
- // Set up the current time as the start time for pinging on the correlation id. This is used to determine
- // timeouts.
- perCorrelationId.timeOutStart = System.nanoTime();
-
- // Send the specifed number of messages for this test
- pingNoWaitForReply(message, numPings, messageCorrelationId);
-
- boolean timedOut;
- boolean allMessagesReceived;
- int numReplies;
-
- // We don't have a consumer so don't try and wait for the messages.
- // this does mean that if the producerSession is !TXed then we may
- // get to exit before all msgs have been received.
- //
- // Return the number of requested messages, this will let the test
- // report a pass.
- if (_noOfConsumers == 0 || _sendOnly)
- {
- return getExpectedNumPings(totalPingsRequested);
- }
-
- do
- {
- // Block the current thread until replies to all the messages are received, or it times out.
- perCorrelationId.trafficLight.await(timeout, TimeUnit.MILLISECONDS);
-
- // Work out how many replies were receieved.
- numReplies = getExpectedNumPings(totalPingsRequested) - (int) perCorrelationId.trafficLight.getCount();
-
- allMessagesReceived = numReplies == getExpectedNumPings(totalPingsRequested);
-
- // log.debug("numReplies = " + numReplies);
- // log.debug("allMessagesReceived = " + allMessagesReceived);
-
- // Recheck the timeout condition.
- long now = System.nanoTime();
- long lastMessageReceievedAt = perCorrelationId.timeOutStart;
- timedOut = (now - lastMessageReceievedAt) > (timeout * 1000000);
-
- // log.debug("now = " + now);
- // log.debug("lastMessageReceievedAt = " + lastMessageReceievedAt);
- }
- while (!timedOut && !allMessagesReceived);
-
- if ((numReplies < getExpectedNumPings(totalPingsRequested)) && _verbose)
- {
- log.info("Timed out (" + timeout + " ms) before all replies received on id, " + messageCorrelationId);
- }
- else if (_verbose)
- {
- log.info("Got all replies on id, " + messageCorrelationId);
- }
-
- // commitTx(_consumerSession);
-
- // log.debug("public int pingAndWaitForReply(Message message, int numPings, long timeout): ending");
-
- return numReplies;
- }
- // Ensure that the message countdown latch is always removed from the reply map. The reply map is long lived,
- // so will be a memory leak if this is not done.
- finally
- {
- // NDC.pop();
- perCorrelationIds.remove(messageCorrelationId);
- }
- }
-
- /**
- * Sends the specified number of ping messages and does not wait for correlating replies.
- *
- * @param message The message to send.
- * @param numPings The number of pings to send.
- * @param messageCorrelationId A correlation id to place on all messages sent.
- *
- * @throws JMSException All underlying JMSExceptions are allowed to fall through.
- */
- public void pingNoWaitForReply(Message message, int numPings, String messageCorrelationId) throws JMSException
- {
- /*log.debug("public void pingNoWaitForReply(Message message, int numPings = " + numPings
- + ", String messageCorrelationId = " + messageCorrelationId + "): called");*/
-
- // If we are runnning a consumeOnly test then don't send any messages
- if (_consumeOnly)
- {
- return;
- }
-
- if (message == null)
- {
- message = getTestMessage(getReplyDestinations().get(0), _messageSize, _persistent);
- }
-
- message.setJMSCorrelationID(messageCorrelationId);
-
- // Set up a committed flag to detect uncommitted messages at the end of the send loop. This may occurr if the
- // transaction batch size is not a factor of the number of pings. In which case an extra commit at the end is
- // needed.
- boolean committed = false;
-
- // Send all of the ping messages.
- for (int i = 0; i < numPings; i++)
- {
- // Re-timestamp the message.
- // message.setLongProperty(MESSAGE_TIMESTAMP_PROPNAME, System.nanoTime());
-
- // Send the message, passing in the message count.
- committed = sendMessage(i, message);
-
- // Spew out per message timings on every message sonly in verbose mode.
- /*if (_verbose)
- {
- log.info(timestampFormatter.format(new Date()) + ": Pinged at with correlation id, " + messageCorrelationId);
- }*/
- }
-
- // Call commit if the send loop finished before reaching a batch size boundary so there may still be uncommitted messages.
- if (!committed)
- {
- commitTx(_producerSession);
- }
- }
-
- /**
- * Sends the sepcified message, applies rate limiting and possibly commits the current transaction. The count of
- * messages sent so far must be specified and is used to round robin the ping destinations (where there are more
- * than one), and to determine if the transaction batch size has been reached and the sent messages should be
- * committed.
- *
- * @param i The count of messages sent so far in a loop of multiple calls to this send method.
- * @param message The message to send.
- *
- * @return <tt>true</tt> if the messages were committed, <tt>false</tt> otherwise.
- *
- * @throws JMSException All underlyiung JMSExceptions are allowed to fall through.
- */
- protected boolean sendMessage(int i, Message message) throws JMSException
- {
- try
- {
- NDC.push("id" + instanceId + "/prod");
-
- // log.debug("protected boolean sendMessage(int i = " + i + ", Message message): called");
- // log.debug("_txBatchSize = " + _txBatchSize);
-
- // Round robin the destinations as the messages are sent.
- Destination destination = _pingDestinations.get(i % _pingDestinations.size());
-
- // Prompt the user to kill the broker when doing failover testing.
- _failBeforeSend = waitForUserToPromptOnFailure(_failBeforeSend);
-
- // Get the test setup for the correlation id.
- String correlationID = message.getJMSCorrelationID();
- PerCorrelationId perCorrelationId = perCorrelationIds.get(correlationID);
-
- // If necessary, wait until the max pending message size comes within its limit.
- if (_maxPendingSize > 0)
- {
- synchronized (_sendPauseMonitor)
- {
- // Used to keep track of the number of times that send has to wait.
- int numWaits = 0;
-
- // The maximum number of waits before the test gives up and fails. This has been chosen to correspond with
- // the test timeout.
- int waitLimit = (int) (TIMEOUT_DEFAULT / 10000);
-
- while (true)
- {
- // Get the size estimate of sent but not yet received messages.
- int unreceived = _unreceived.get();
- int unreceivedSize =
- (unreceived * ((_messageSize == 0) ? 1 : _messageSize))
- / (_isPubSub ? getConsumersPerDestination() : 1);
-
- // log.debug("unreceived = " + unreceived);
- // log.debug("unreceivedSize = " + unreceivedSize);
- // log.debug("_maxPendingSize = " + _maxPendingSize);
-
- if (unreceivedSize > _maxPendingSize)
- {
- // log.debug("unreceived size estimate over limit = " + unreceivedSize);
-
- // Fail the test if the send has had to wait more than the maximum allowed number of times.
- if (numWaits > waitLimit)
- {
- String errorMessage =
- "Send has had to wait for the unreceivedSize (" + unreceivedSize
- + ") to come below the maxPendingSize (" + _maxPendingSize + ") more that " + waitLimit
- + " times.";
- log.warn(errorMessage);
- throw new RuntimeException(errorMessage);
- }
-
- // Wait on the send pause barrier for the limit to be re-established.
- try
- {
- long start = System.nanoTime();
- // _sendPauseMonitor.wait(10000);
- _sendPauseMonitor.offer(new Object(), 10000, TimeUnit.MILLISECONDS);
- long end = System.nanoTime();
-
- // Count the wait only if it was for > 99% of the requested wait time.
- if (((float) (end - start) / (float) (10000 * 1000000L)) > 0.99)
- {
- numWaits++;
- }
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted status
- Thread.currentThread().interrupt();
- throw new RuntimeException(e);
- }
- }
- else
- {
- break;
- }
- }
- }
- }
-
- // Send the message either to its round robin destination, or its default destination.
- // int num = numSent.incrementAndGet();
- // message.setIntProperty("MSG_NUM", num);
- setTimestamp(message);
-
- if (destination == null)
- {
- _producer.send(message);
- }
- else
- {
- _producer.send(destination, message);
- }
-
- // Increase the unreceived size, this may actually happen after the message is received.
- // The unreceived size is incremented by the number of consumers that will get a copy of the message,
- // in pub/sub mode.
- if (_maxPendingSize > 0)
- {
- int newUnreceivedCount = _unreceived.addAndGet(_isPubSub ? getConsumersPerDestination() : 1);
- // log.debug("newUnreceivedCount = " + newUnreceivedCount);
- }
-
- // Apply message rate throttling if a rate limit has been set up.
- if (_rateLimiter != null)
- {
- _rateLimiter.throttle();
- }
-
- // Call commit every time the commit batch size is reached.
- boolean committed = false;
-
- // Commit on every transaction batch size boundary. Here i + 1 is the count of actual messages sent.
- if (((i + 1) % _txBatchSize) == 0)
- {
- // log.debug("Trying commit on producer session.");
- committed = commitTx(_producerSession);
- }
-
- return committed;
- }
- finally
- {
- NDC.clear();
- }
- }
-
- /**
- * If the specified fail flag is set, this method waits for the user to cause a failure and then indicate to the
- * test that the failure has occurred, before the method returns.
- *
- * @param failFlag The fail flag to test.
- *
- * @return The new value for the fail flag. If the {@link #_failOnce} flag is set, then each fail flag is only
- * used once, then reset.
- */
- private boolean waitForUserToPromptOnFailure(boolean failFlag)
- {
- if (failFlag)
- {
- if (_failOnce)
- {
- failFlag = false;
- }
-
- // log.debug("Failing Before Send");
- waitForUser(KILL_BROKER_PROMPT);
- }
-
- return failFlag;
- }
-
- /**
- * Implements a single iteration of the ping loop. This sends the number of pings specified by the transaction batch
- * size property, and waits for replies to all of them. Any errors cause the publish flag to be cleared, which will
- * terminate the pinger.
- */
- public void pingLoop()
- {
- try
- {
- // Generate a sample message and time stamp it.
- Message msg = getTestMessage(_replyDestination, _messageSize, _persistent);
- // setTimestamp(msg);
-
- // Send the message and wait for a reply.
- pingAndWaitForReply(msg, TX_BATCH_SIZE_DEFAULT, TIMEOUT_DEFAULT, null);
- }
- catch (JMSException e)
- {
- _publish = false;
- // log.debug("There was a JMSException: " + e.getMessage(), e);
- }
- catch (InterruptedException e)
- {
- _publish = false;
- // log.debug("There was an interruption: " + e.getMessage(), e);
- }
- }
-
- /**
- * Sets a chained message listener. The message listener on this pinger, chains all its messages to the one set
- * here.
- *
- * @param messageListener The chained message listener.
- */
- public void setChainedMessageListener(ChainedMessageListener messageListener)
- {
- _chainedMessageListener = messageListener;
- }
-
- /** Removes any chained message listeners from this pinger. */
- public void removeChainedMessageListener()
- {
- _chainedMessageListener = null;
- }
-
- /**
- * Generates a test message of the specified size, with the specified reply-to destination and persistence flag.
- *
- * @param replyQueue The reply-to destination for the message.
- * @param messageSize The desired size of the message in bytes.
- * @param persistent <tt>true</tt> if the message should use persistent delivery, <tt>false</tt> otherwise.
- *
- * @return A freshly generated test message.
- *
- * @throws javax.jms.JMSException All underlying JMSException are allowed to fall through.
- */
- public Message getTestMessage(Destination replyQueue, int messageSize, boolean persistent) throws JMSException
- {
- // return TestMessageFactory.newObjectMessage(_producerSession, replyQueue, messageSize, persistent);
- return TestUtils.createTestMessageOfSize(_producerSession, messageSize);
- }
-
- /**
- * Sets the current time in nanoseconds as the timestamp on the message.
- *
- * @param msg The message to timestamp.
- *
- * @throws JMSException Any JMSExceptions are allowed to fall through.
- */
- protected void setTimestamp(Message msg) throws JMSException
- {
- /*if (((AMQSession)_producerSession).isStrictAMQP())
- {
- ((AMQMessage)msg).setTimestampProperty(new AMQShortString(MESSAGE_TIMESTAMP_PROPNAME), System.nanoTime());
- }
- else
- {*/
- msg.setLongProperty(MESSAGE_TIMESTAMP_PROPNAME, System.nanoTime());
- // }
- }
-
- /**
- * Extracts the nanosecond timestamp from a message.
- *
- * @param msg The message to extract the time stamp from.
- *
- * @return The timestamp in nanos.
- *
- * @throws JMSException Any JMSExceptions are allowed to fall through.
- */
- protected long getTimestamp(Message msg) throws JMSException
- {
- /*if (((AMQSession)_producerSession).isStrictAMQP())
- {
- Long value = ((AMQMessage)msg).getTimestampProperty(new AMQShortString(MESSAGE_TIMESTAMP_PROPNAME));
-
- return (value == null) ? 0L : value;
- }
- else
- {*/
- return msg.getLongProperty(PingPongProducer.MESSAGE_TIMESTAMP_PROPNAME);
- // }
- }
-
- /**
- * Stops the ping loop by clearing the publish flag. The current loop will complete when it notices that this flag
- * has been cleared.
- */
- public void stop()
- {
- _publish = false;
- }
-
- /**
- * Starts the producer and consumer connections.
- *
- * @throws JMSException Any JMSExceptions are allowed to fall through.
- */
- public void start() throws JMSException
- {
- // log.debug("public void start(): called");
-
- _connection.start();
- // log.debug("Producer started.");
-
- for (int i = 0; i < _noOfConsumers; i++)
- {
- _consumerConnection[i].start();
- // log.debug("Consumer " + i + " started.");
- }
- }
-
- /** Implements a ping loop that repeatedly pings until the publish flag becomes false. */
- public void run()
- {
- // Keep running until the publish flag is cleared.
- while (_publish)
- {
- pingLoop();
- }
- }
-
- /**
- * Callback method, implementing ExceptionListener. This should be registered to listen for exceptions on the
- * connection, this clears the publish flag which in turn will halt the ping loop.
- *
- * @param e The exception that triggered this callback method.
- */
- public void onException(JMSException e)
- {
- // log.debug("public void onException(JMSException e = " + e + "): called", e);
- _publish = false;
- }
-
- /**
- * Gets a shutdown hook that will cleanly shut this down when it is running the ping loop. This can be registered
- * with the runtime system as a shutdown hook.
- *
- * @return A shutdown hook for the ping loop.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- stop();
- }
- });
- }
-
- /**
- * Closes all of the producer and consumer connections.
- *
- * @throws JMSException All JMSException are allowed to fall through.
- */
- public void close() throws JMSException
- {
- // log.debug("public void close(): called");
-
- try
- {
- if (_connection != null)
- {
- // log.debug("Before close producer connection.");
- _connection.close();
- // log.debug("Closed producer connection.");
- }
-
- for (int i = 0; i < _noOfConsumers; i++)
- {
- if (_consumerConnection[i] != null)
- {
- // log.debug("Before close consumer connection " + i + ".");
- _consumerConnection[i].close();
- // log.debug("Closed consumer connection " + i + ".");
- }
- }
- }
- finally
- {
- _connection = null;
- _producerSession = null;
- _consumerSession = null;
- _consumerConnection = null;
- _producer = null;
- _consumer = null;
- _pingDestinations = null;
- _replyDestination = null;
- }
- }
-
- /**
- * Convenience method to commit the transaction on the specified controlSession. If the controlSession to commit on is not a
- * transactional controlSession, this method does nothing (unless the failover after send flag is set).
- *
- * <p/>If the {@link #_failAfterSend} flag is set, this will prompt the user to kill the broker before the commit is
- * applied. This flag applies whether the pinger is transactional or not.
- *
- * <p/>If the {@link #_failBeforeCommit} flag is set, this will prompt the user to kill the broker before the commit
- * is applied. If the {@link #_failAfterCommit} flag is set, this will prompt the user to kill the broker after the
- * commit is applied. These flags will only apply if using a transactional pinger.
- *
- * @param session The controlSession to commit
- *
- * @return <tt>true</tt> if the controlSession was committed, <tt>false</tt> if it was not.
- *
- * @throws javax.jms.JMSException If the commit fails and then the rollback fails.
- *
- * @todo Consider moving the fail after send logic into the send method. It is confusing to have it in this commit
- * method, because commits only apply to transactional pingers, but fail after send applied to transactional and
- * non-transactional alike.
- */
- protected boolean commitTx(Session session) throws JMSException
- {
- // log.debug("protected void commitTx(Session session): called");
-
- boolean committed = false;
-
- _failAfterSend = waitForUserToPromptOnFailure(_failAfterSend);
-
- if (session.getTransacted())
- {
- // log.debug("Session is transacted.");
-
- try
- {
- _failBeforeCommit = waitForUserToPromptOnFailure(_failBeforeCommit);
-
- long start = System.nanoTime();
- session.commit();
- committed = true;
- // log.debug("Time taken to commit :" + ((System.nanoTime() - start) / 1000000f) + " ms");
-
- _failAfterCommit = waitForUserToPromptOnFailure(_failAfterCommit);
-
- // log.debug("Session Commited.");
- }
- catch (JMSException e)
- {
- // log.debug("JMSException on commit:" + e.getMessage(), e);
-
- try
- {
- session.rollback();
- // log.debug("Message rolled back.");
- }
- catch (JMSException jmse)
- {
- // log.debug("JMSE on rollback:" + jmse.getMessage(), jmse);
-
- // Both commit and rollback failed. Throw the rollback exception.
- throw jmse;
- }
- }
- }
-
- return committed;
- }
-
- /**
- * Outputs a prompt to the console and waits for the user to press return.
- *
- * @param prompt The prompt to display on the console.
- */
- public void waitForUser(String prompt)
- {
- System.out.println(prompt);
-
- try
- {
- System.in.read();
- }
- catch (IOException e)
- {
- // Ignored.
- }
-
- System.out.println("Continuing.");
- }
-
- /**
- * Gets the number of consumers that are listening to each destination in the test.
- *
- * @return int The number of consumers subscribing to each topic.
- */
- public int getConsumersPerDestination()
- {
- return _noOfConsumers;
- }
-
- /**
- * Calculates how many pings are expected to be received for the given number sent.
- *
- * Note : that if you have set noConsumers to 0 then this will also return 0
- * in the case of PubSub testing. This is correct as without consumers there
- * will be no-one to receive the sent messages so they will be unable to respond.
- *
- * @param numpings The number of pings that will be sent.
- *
- * @return The number that should be received, for the test to pass.
- */
- public int getExpectedNumPings(int numpings)
- {
- // Wow, I'm freaking sorry about this return here...
- return ((_failAfterSend || _failBeforeCommit) ? numpings - 1: numpings) *
- (_isPubSub ? getConsumersPerDestination() : 1);
- }
-
- /**
- * Defines a chained message listener interface that can be attached to this pinger. Whenever this pinger's {@link
- * PingPongProducer#onMessageWithConsumerNo} method is called, the chained listener set through the {@link
- * PingPongProducer#setChainedMessageListener} method is passed the message, and the remaining expected count of
- * messages with that correlation id.
- *
- * <p/>Provided only one pinger is producing messages with that correlation id, the chained listener will always be
- * given unique message counts. It will always be called while the producer waiting for all messages to arrive is
- * still blocked.
- */
- public static interface ChainedMessageListener
- {
- /**
- * Notifies interested listeners about message arrival and important test stats, the number of messages
- * remaining in the test, and the messages send timestamp.
- *
- * @param message The newly arrived message.
- * @param remainingCount The number of messages left to complete the test.
- * @param latency The nanosecond latency of the message.
- *
- * @throws JMSException Any JMS exceptions is allowed to fall through.
- */
- public void onMessage(Message message, int remainingCount, long latency) throws JMSException;
- }
-
- /**
- * Holds information on each correlation id. The countdown latch, the current timeout timer... More stuff to be
- * added to this: read/write lock to make onMessage more concurrent as described in class header comment.
- */
- protected static class PerCorrelationId
- {
- /** Holds a countdown on number of expected messages. */
- CountDownLatch trafficLight;
-
- /** Holds the last timestamp that the timeout was reset to. */
- Long timeOutStart;
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongTestPerf.java b/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongTestPerf.java
deleted file mode 100644
index 009254c612..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongTestPerf.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.requestreply;
-
-import junit.framework.Assert;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.AsymptoticTestCase;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-
-import javax.jms.*;
-
-/**
- * PingPongTestPerf is a full round trip ping test, that has been written with the intention of being scaled up to run
- * many times simultaneously to simluate many clients/producer/connections. A full round trip ping sends a message from
- * a producer to a conumer, then the consumer replies to the message on a temporary queue.
- *
- * <p/>A single run of the test using the default JUnit test runner will result in the sending and timing of the number
- * of pings specified by the test size and time how long it takes for all of these to complete. This test may be scaled
- * up using a suitable JUnit test runner. See {@link org.apache.qpid.junit.extensions.TKTestRunner} for more
- * information on how to do this.
- *
- * <p/>The setup/teardown cycle establishes a connection to a broker and sets up a queue to send ping messages to and a
- * temporary queue for replies. This setup is only established once for all the test repeats, but each test threads
- * gets its own connection/producer/consumer, this is only re-established if the connection is lost.
- *
- * <p/>The test cycle is: Connects to a queue, creates a temporary queue, creates messages containing a property that
- * is the name of the temporary queue, fires off many messages on the original queue and waits for them all to come
- * back on the temporary queue.
- *
- * <p/>Configurable test properties: message size, transacted or not, persistent or not. Broker connection details.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * </table>
- */
-public class PingPongTestPerf extends AsymptoticTestCase
-{
- private static Logger _logger = Logger.getLogger(PingPongTestPerf.class);
-
- /** Thread local to hold the per-thread test setup fields. */
- ThreadLocal<PerThreadSetup> threadSetup = new ThreadLocal<PerThreadSetup>();
-
- // Set up a property reader to extract the test parameters from. Once ContextualProperties is available in
- // the project dependencies, use it to get property overrides for configurable tests and to notify the test runner
- // of the test parameters to log with the results. It also providers some basic type parsing convenience methods.
- // private Properties testParameters = System.getProperties();
- private ParsedProperties testParameters =
- TestContextProperties.getInstance(PingPongProducer.defaults /*System.getProperties()*/);
-
- public PingPongTestPerf(String name)
- {
- super(name);
-
- _logger.debug(testParameters);
-
- // Sets up the test parameters with defaults.
- /*testParameters.setPropertyIfNull(PingPongProducer.TX_BATCH_SIZE_PROPNAME,
- Integer.toString(PingPongProducer.TX_BATCH_SIZE_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.MESSAGE_SIZE_PROPNAME,
- Integer.toString(PingPongProducer.MESSAGE_SIZE_DEAFULT));
- testParameters.setPropertyIfNull(PingPongProducer.PING_QUEUE_NAME_PROPNAME,
- PingPongProducer.PING_QUEUE_NAME_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.PERSISTENT_MODE_PROPNAME,
- Boolean.toString(PingPongProducer.PERSISTENT_MODE_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.TRANSACTED_PROPNAME,
- Boolean.toString(PingPongProducer.TRANSACTED_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.BROKER_PROPNAME, PingPongProducer.BROKER_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.USERNAME_PROPNAME, PingPongProducer.USERNAME_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.PASSWORD_PROPNAME, PingPongProducer.PASSWORD_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.VIRTUAL_HOST_PROPNAME, PingPongProducer.VIRTUAL_HOST_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.VERBOSE_PROPNAME,
- Boolean.toString(PingPongProducer.VERBOSE_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.RATE_PROPNAME, Integer.toString(PingPongProducer.RATE_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.PUBSUB_PROPNAME,
- Boolean.toString(PingPongProducer.PUBSUB_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.TX_BATCH_SIZE_PROPNAME,
- Integer.toString(PingPongProducer.TX_BATCH_SIZE_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.TIMEOUT_PROPNAME, Long.toString(PingPongProducer.TIMEOUT_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.DESTINATION_COUNT_PROPNAME,
- Integer.toString(PingPongProducer.DESTINATION_COUNT_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.FAIL_AFTER_COMMIT_PROPNAME,
- PingPongProducer.FAIL_AFTER_COMMIT_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.FAIL_BEFORE_COMMIT_PROPNAME,
- PingPongProducer.FAIL_BEFORE_COMMIT_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.FAIL_AFTER_SEND_PROPNAME,
- PingPongProducer.FAIL_AFTER_SEND_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.FAIL_BEFORE_SEND_PROPNAME,
- PingPongProducer.FAIL_BEFORE_SEND_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.FAIL_ONCE_PROPNAME, PingPongProducer.FAIL_ONCE_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.UNIQUE_DESTS_PROPNAME,
- Boolean.toString(PingPongProducer.UNIQUE_DESTS_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.ACK_MODE_PROPNAME,
- Integer.toString(PingPongProducer.ACK_MODE_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.PAUSE_AFTER_BATCH_PROPNAME,
- PingPongProducer.PAUSE_AFTER_BATCH_DEFAULT);*/
- }
-
- /**
- * Compile all the tests into a test suite.
- */
- public static Test suite()
- {
- // Build a new test suite
- TestSuite suite = new TestSuite("Ping-Pong Performance Tests");
-
- // Run performance tests in read committed mode.
- suite.addTest(new PingPongTestPerf("testPingPongOk"));
-
- return suite;
- }
-
- private static void setSystemPropertyIfNull(String propName, String propValue)
- {
- if (System.getProperty(propName) == null)
- {
- System.setProperty(propName, propValue);
- }
- }
-
- public void testPingPongOk(int numPings) throws Exception
- {
- // Get the per thread test setup to run the test through.
- PerThreadSetup perThreadSetup = threadSetup.get();
-
- // Generate a sample message. This message is already time stamped and has its reply-to destination set.
- Message msg =
- perThreadSetup._testPingProducer.getTestMessage(perThreadSetup._testPingProducer.getReplyDestinations().get(0),
- testParameters.getPropertyAsInteger(PingPongProducer.MESSAGE_SIZE_PROPNAME),
- testParameters.getPropertyAsBoolean(PingPongProducer.PERSISTENT_MODE_PROPNAME));
-
- // Send the message and wait for a reply.
- int numReplies =
- perThreadSetup._testPingProducer.pingAndWaitForReply(msg, numPings, PingPongProducer.TIMEOUT_DEFAULT, null);
-
- // Fail the test if the timeout was exceeded.
- if (numReplies != numPings)
- {
- Assert.fail("The ping timed out, got " + numReplies + " out of " + numPings);
- }
- }
-
- /**
- * Performs test fixture creation on a per thread basis. This will only be called once for each test thread.
- */
- public void threadSetUp()
- {
- try
- {
- PerThreadSetup perThreadSetup = new PerThreadSetup();
-
- // Extract the test set up paramaeters.
- String brokerDetails = testParameters.getProperty(PingPongProducer.BROKER_PROPNAME);
- String username = testParameters.getProperty(PingPongProducer.USERNAME_PROPNAME);
- String password = testParameters.getProperty(PingPongProducer.PASSWORD_PROPNAME);
- String virtualPath = testParameters.getProperty(PingPongProducer.VIRTUAL_HOST_PROPNAME);
- String destinationName = testParameters.getProperty(PingPongProducer.PING_QUEUE_NAME_PROPNAME);
- boolean persistent = testParameters.getPropertyAsBoolean(PingPongProducer.PERSISTENT_MODE_PROPNAME);
- boolean transacted = testParameters.getPropertyAsBoolean(PingPongProducer.TRANSACTED_PROPNAME);
- String selector = testParameters.getProperty(PingPongProducer.SELECTOR_PROPNAME);
- boolean verbose = testParameters.getPropertyAsBoolean(PingPongProducer.VERBOSE_PROPNAME);
- boolean pubsub = testParameters.getPropertyAsBoolean(PingPongProducer.PUBSUB_PROPNAME);
-
- synchronized (this)
- {
- // Establish a bounce back client on the ping queue to bounce back the pings.
- perThreadSetup._testPingBouncer =
- new PingPongBouncer(brokerDetails, username, password, virtualPath, destinationName, persistent,
- transacted, selector, verbose, pubsub);
-
- // Start the connections for client and producer running.
- perThreadSetup._testPingBouncer.getConnection().start();
-
- // Establish a ping-pong client on the ping queue to send the pings and receive replies with.
- perThreadSetup._testPingProducer = new PingPongProducer(testParameters);
- perThreadSetup._testPingProducer.establishConnection(true, true);
- perThreadSetup._testPingProducer.start();
- }
-
- // Attach the per-thread set to the thread.
- threadSetup.set(perThreadSetup);
- }
- catch (Exception e)
- {
- _logger.warn("There was an exception during per thread setup.", e);
- }
- }
-
- /**
- * Performs test fixture clean
- */
- public void threadTearDown()
- {
- _logger.debug("public void threadTearDown(): called");
-
- try
- {
- // Get the per thread test fixture.
- PerThreadSetup perThreadSetup = threadSetup.get();
-
- // Close the pingers so that it cleans up its connection cleanly.
- synchronized (this)
- {
- perThreadSetup._testPingProducer.close();
- // perThreadSetup._testPingBouncer.close();
- }
-
- // Ensure the per thread fixture is reclaimed.
- threadSetup.remove();
- }
- catch (JMSException e)
- {
- _logger.warn("There was an exception during per thread tear down.");
- }
- }
-
- protected static class PerThreadSetup
- {
- /**
- * Holds the test ping-pong producer.
- */
- private PingPongProducer _testPingProducer;
-
- /**
- * Holds the test ping client.
- */
- private PingPongBouncer _testPingBouncer;
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/topic/Config.java b/java/perftests/src/main/java/org/apache/qpid/topic/Config.java
deleted file mode 100644
index d5c0979399..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/topic/Config.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.topic;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.config.ConnectorConfig;
-import org.apache.qpid.config.Connector;
-import org.apache.qpid.config.AbstractConfig;
-
-import javax.jms.Connection;
-
-public class Config extends AbstractConfig implements ConnectorConfig
-{
-
- private String host = "localhost";
- private int port = 5672;
- private String factory = null;
-
- private int payload = 256;
- private int messages = 1000;
- private int clients = 1;
- private int batch = 1;
- private long delay = 1;
- private int warmup;
- private int ackMode= AMQSession.NO_ACKNOWLEDGE;
- private String clientId;
- private String subscriptionId;
- private String selector;
- private String destinationName;
- private boolean persistent;
- private boolean transacted;
- private int destinationsCount;
- private int batchSize;
- private int rate;
- private boolean ispubsub;
- private long timeout;
-
- public Config()
- {
- }
-
- public int getAckMode()
- {
- return ackMode;
- }
-
- public void setPayload(int payload)
- {
- this.payload = payload;
- }
-
- public int getPayload()
- {
- return payload;
- }
-
- void setClients(int clients)
- {
- this.clients = clients;
- }
-
- int getClients()
- {
- return clients;
- }
-
- void setMessages(int messages)
- {
- this.messages = messages;
- }
-
- public int getMessages()
- {
- return messages;
- }
-
- public int getBatchSize()
- {
- return batchSize;
- }
-
- public int getRate()
- {
- return rate;
- }
-
- public int getDestinationsCount()
- {
- return destinationsCount;
- }
-
- public String getHost()
- {
- return host;
- }
-
- public void setHost(String host)
- {
- this.host = host;
- }
-
- public int getPort()
- {
- return port;
- }
-
- public String getFactory()
- {
- return factory;
- }
-
- public void setPort(int port)
- {
- this.port = port;
- }
-
- int getBatch()
- {
- return batch;
- }
-
- void setBatch(int batch)
- {
- this.batch = batch;
- }
-
- int getWarmup()
- {
- return warmup;
- }
-
- void setWarmup(int warmup)
- {
- this.warmup = warmup;
- }
-
- public long getDelay()
- {
- return delay;
- }
-
- public void setDelay(long delay)
- {
- this.delay = delay;
- }
-
- public long getTimeout()
- {
- return timeout;
- }
-
- public void setTimeout(long time)
- {
- this.timeout = time;
- }
-
- public String getClientId()
- {
- return clientId;
- }
-
- public String getSubscriptionId()
- {
- return subscriptionId;
- }
-
- public String getSelector()
- {
- return selector;
- }
-
- public String getDestination()
- {
- return destinationName;
- }
-
- public boolean usePersistentMessages()
- {
- return persistent;
- }
-
- public boolean isTransacted()
- {
- return transacted;
- }
-
- public boolean isPubSub()
- {
- return ispubsub;
- }
-
- public void setOption(String key, String value)
- {
- if("-host".equalsIgnoreCase(key))
- {
- setHost(value);
- }
- else if("-port".equalsIgnoreCase(key))
- {
- try
- {
- setPort(Integer.parseInt(value));
- }
- catch(NumberFormatException e)
- {
- throw new RuntimeException("Bad port number: " + value, e);
- }
- }
- else if("-payload".equalsIgnoreCase(key))
- {
- setPayload(parseInt("Bad payload size", value));
- }
- else if("-messages".equalsIgnoreCase(key))
- {
- setMessages(parseInt("Bad message count", value));
- }
- else if("-clients".equalsIgnoreCase(key))
- {
- setClients(parseInt("Bad client count", value));
- }
- else if("-batch".equalsIgnoreCase(key))
- {
- setBatch(parseInt("Bad batch count", value));
- }
- else if("-delay".equalsIgnoreCase(key))
- {
- setDelay(parseLong("Bad batch delay", value));
- }
- else if("-warmup".equalsIgnoreCase(key))
- {
- setWarmup(parseInt("Bad warmup count", value));
- }
- else if("-ack".equalsIgnoreCase(key))
- {
- ackMode = parseInt("Bad ack mode", value);
- }
- else if("-factory".equalsIgnoreCase(key))
- {
- factory = value;
- }
- else if("-clientId".equalsIgnoreCase(key))
- {
- clientId = value;
- }
- else if("-subscriptionId".equalsIgnoreCase(key))
- {
- subscriptionId = value;
- }
- else if("-persistent".equalsIgnoreCase(key))
- {
- persistent = "true".equalsIgnoreCase(value);
- }
- else if("-transacted".equalsIgnoreCase(key))
- {
- transacted = "true".equalsIgnoreCase(value);
- }
- else if ("-destinationscount".equalsIgnoreCase(key))
- {
- destinationsCount = parseInt("Bad destinations count", value);
- }
- else if ("-batchsize".equalsIgnoreCase(key))
- {
- batchSize = parseInt("Bad batch size", value);
- }
- else if ("-rate".equalsIgnoreCase(key))
- {
- rate = parseInt("MEssage rate", value);
- }
- else if("-pubsub".equalsIgnoreCase(key))
- {
- ispubsub = "true".equalsIgnoreCase(value);
- }
- else if("-selector".equalsIgnoreCase(key))
- {
- selector = value;
- }
- else if("-destinationname".equalsIgnoreCase(key))
- {
- destinationName = value;
- }
- else if("-timeout".equalsIgnoreCase(key))
- {
- setTimeout(parseLong("Bad timeout data", value));
- }
- else
- {
- System.out.println("Ignoring unrecognised option: " + key);
- }
- }
-
- static String getAckModeDescription(int ackMode)
- {
- switch(ackMode)
- {
- case AMQSession.NO_ACKNOWLEDGE: return "NO_ACKNOWLEDGE";
- case AMQSession.AUTO_ACKNOWLEDGE: return "AUTO_ACKNOWLEDGE";
- case AMQSession.CLIENT_ACKNOWLEDGE: return "CLIENT_ACKNOWLEDGE";
- case AMQSession.DUPS_OK_ACKNOWLEDGE: return "DUPS_OK_ACKNOWELDGE";
- case AMQSession.PRE_ACKNOWLEDGE: return "PRE_ACKNOWLEDGE";
- }
- return "AckMode=" + ackMode;
- }
-
- public Connection createConnection() throws Exception
- {
- return new Connector().createConnection(this);
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/topic/Listener.java b/java/perftests/src/main/java/org/apache/qpid/topic/Listener.java
deleted file mode 100644
index 6dcea42bfe..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/topic/Listener.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.topic;
-
-import java.util.Random;
-
-import javax.jms.*;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.NDC;
-
-import org.apache.qpid.client.AMQConnection;
-import org.apache.qpid.client.AMQQueue;
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.client.AMQTopic;
-import org.apache.qpid.exchange.ExchangeDefaults;
-
-/**
- * This class has not kept up to date with the topic_listener in the cpp tests. It should provide identical behaviour for
- * cross testing the java and cpp clients.
- *
- * <p/>How the cpp topic_publisher operates:
- * It publishes text messages to the default topic exchange, on virtual host "/test", on the topic "topic_control", for
- * the specified number of test messages to be sent.
- * It publishes a report request message (on same topic), with the header text field "TYPE", value "REPORT_REQUEST",
- * optionally within a transaction, and waits for the specified number of consumers to reply to this request. The
- * listeners should reply to this message on a queue named "response", on virtual host "/test", with some sort of message
- * about the number of messages received and how long it took, although the publisher never looks at the message content.
- * The publisher then send a message (on the same topic), with the header text field "TYPE", value "TERMINATION_REQUEST",
- * which the listener should close its connection and terminate upon receipt of.
- *
- * @todo I've added lots of field table types in the report message, just to check if the other end can decode them
- * correctly. Not really the right place to test this, so remove them from
- * {@link #createReportResponseMessage(String)} once a better test exists.
- */
-public class Listener implements MessageListener
-{
- private static Logger log = Logger.getLogger(Listener.class);
-
- public static final String CONTROL_TOPIC = "topic_control";
- public static final String RESPONSE_QUEUE = "response";
-
- private final Topic _topic;
- //private final Topic _control;
-
- private final Queue _response;
-
- /** Holds the connection to listen on. */
- private final Connection _connection;
-
- /** Holds the producer to send control messages on. */
- private final MessageProducer _controller;
-
- /** Holds the JMS session. */
- private final javax.jms.Session _session;
-
- /** Holds a flag to indicate that a timer has begun on the first message. Reset when report is sent. */
- private boolean init;
-
- /** Holds the count of messages received by this listener. */
- private int count;
-
- /** Used to hold the start time of the first message. */
- private long start;
- private static String clientId;
-
- Listener(Connection connection, int ackMode, String name) throws Exception
- {
- log.debug("Listener(Connection connection = " + connection + ", int ackMode = " + ackMode + ", String name = " + name
- + "): called");
-
- _connection = connection;
- _session = connection.createSession(false, ackMode);
-
- if (_session instanceof AMQSession)
- {
- _topic = new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, CONTROL_TOPIC);
- //_control = new AMQTopic(CONTROL_TOPIC);
- _response = new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME, RESPONSE_QUEUE);
- }
- else
- {
- _topic = _session.createTopic(CONTROL_TOPIC);
- //_control = _session.createTopic(CONTROL_TOPIC);
- _response = _session.createQueue(RESPONSE_QUEUE);
- }
-
- //register for events
- if (name == null)
- {
- log.debug("Calling _factory.createTopicConsumer().setMessageListener(this)");
- createTopicConsumer().setMessageListener(this);
- }
- else
- {
- log.debug("Calling createDurableTopicConsumer(name).setMessageListener(this)");
- createDurableTopicConsumer(name).setMessageListener(this);
- }
-
- _connection.start();
-
- _controller = createControlPublisher();
- System.out.println("Waiting for messages " + Config.getAckModeDescription(ackMode)
- +
- ((name == null)
- ? "" : (" (subscribed with name " + name + " and client id " + connection.getClientID() + ")"))
- + "...");
- }
-
- public static void main(String[] argv) throws Exception
- {
- clientId = "Listener-" + System.currentTimeMillis();
-
- NDC.push(clientId);
-
- Config config = new Config();
- config.setOptions(argv);
-
- //Connection con = config.createConnection();
- Connection con =
- new AMQConnection("amqp://guest:guest@testid/test?brokerlist='" + config.getHost() + ":" + config.getPort()
- + "'");
-
- if (config.getClientId() != null)
- {
- con.setClientID(config.getClientId());
- }
-
- new Listener(con, config.getAckMode(), config.getSubscriptionId());
-
- NDC.pop();
- NDC.remove();
- }
-
- /**
- * Checks whether or not a text field on a message has the specified value.
- *
- * @param m The message to check.
- * @param fieldName The name of the field to check.
- * @param value The expected value of the field to compare with.
- *
- * @return <tt>true</tt>If the specified field has the specified value, <tt>fals</tt> otherwise.
- *
- * @throws JMSException Any JMSExceptions are allowed to fall through.
- */
- private static boolean checkTextField(Message m, String fieldName, String value) throws JMSException
- {
- log.debug("private static boolean checkTextField(Message m = " + m + ", String fieldName = " + fieldName
- + ", String value = " + value + "): called");
-
- String comp = m.getStringProperty(fieldName);
- log.debug("comp = " + comp);
-
- boolean result = (comp != null) && comp.equals(value);
- log.debug("result = " + result);
-
- return result;
- }
-
- public void onMessage(Message message)
- {
- NDC.push(clientId);
-
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- if (!init)
- {
- start = System.nanoTime() / 1000000;
- count = 0;
- init = true;
- }
-
- try
- {
- if (isShutdown(message))
- {
- log.debug("Got a shutdown message.");
- shutdown();
- }
- else if (isReport(message))
- {
- log.debug("Got a report request message.");
-
- // Send the report.
- report();
- init = false;
- }
- }
- catch (JMSException e)
- {
- log.warn("There was a JMSException during onMessage.", e);
- }
- finally
- {
- NDC.pop();
- }
- }
-
- Message createReportResponseMessage(String msg) throws JMSException
- {
- Message message = _session.createTextMessage(msg);
-
- // Shove some more field table type in the message just to see if the other end can handle it.
- message.setBooleanProperty("BOOLEAN", true);
- message.setByteProperty("BYTE", (byte) 5);
- message.setDoubleProperty("DOUBLE", Math.PI);
- message.setFloatProperty("FLOAT", 1.0f);
- message.setIntProperty("INT", 1);
- message.setShortProperty("SHORT", (short) 1);
- message.setLongProperty("LONG", (long) 1827361278);
- message.setStringProperty("STRING", "hello");
-
- return message;
- }
-
- boolean isShutdown(Message m) throws JMSException
- {
- boolean result = checkTextField(m, "TYPE", "TERMINATION_REQUEST");
-
- //log.debug("isShutdown = " + result);
-
- return result;
- }
-
- boolean isReport(Message m) throws JMSException
- {
- boolean result = checkTextField(m, "TYPE", "REPORT_REQUEST");
-
- //log.debug("isReport = " + result);
-
- return result;
- }
-
- MessageConsumer createTopicConsumer() throws Exception
- {
- return _session.createConsumer(_topic);
- }
-
- MessageConsumer createDurableTopicConsumer(String name) throws Exception
- {
- return _session.createDurableSubscriber(_topic, name);
- }
-
- MessageProducer createControlPublisher() throws Exception
- {
- return _session.createProducer(_response);
- }
-
- private void shutdown()
- {
- try
- {
- _session.close();
- _connection.stop();
- _connection.close();
- }
- catch (Exception e)
- {
- e.printStackTrace(System.out);
- }
- }
-
- private void report()
- {
- log.debug("private void report(): called");
-
- try
- {
- String msg = getReport();
- _controller.send(createReportResponseMessage(msg));
- log.debug("Sent report: " + msg);
- }
- catch (Exception e)
- {
- e.printStackTrace(System.out);
- }
- }
-
- private String getReport()
- {
- long time = ((System.nanoTime() / 1000000) - start);
-
- return "Received " + count + " in " + time + "ms";
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/topic/MessageFactory.java b/java/perftests/src/main/java/org/apache/qpid/topic/MessageFactory.java
deleted file mode 100644
index 4efdc1cb56..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/topic/MessageFactory.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.topic;
-
-import javax.jms.*;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.client.AMQTopic;
-import org.apache.qpid.exchange.ExchangeDefaults;
-
-/**
- */
-class MessageFactory
-{
- private static final char[] DATA = "abcdefghijklmnopqrstuvwxyz".toCharArray();
-
- private final Session _session;
- private final Topic _topic;
- private final Topic _control;
- private final byte[] _payload;
-
- MessageFactory(Session session) throws JMSException
- {
- this(session, 256);
- }
-
- MessageFactory(Session session, int size) throws JMSException
- {
- _session = session;
- if (session instanceof AMQSession)
- {
- _topic = new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, "topic_control");
- _control = new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, "topictest.control");
- }
- else
- {
- _topic = session.createTopic("topic_control");
- _control = session.createTopic("topictest.control");
- }
-
- _payload = new byte[size];
-
- for (int i = 0; i < size; i++)
- {
- _payload[i] = (byte) DATA[i % DATA.length];
- }
- }
-
- private static boolean checkText(Message m, String s)
- {
- try
- {
- return (m instanceof TextMessage) && ((TextMessage) m).getText().equals(s);
- }
- catch (JMSException e)
- {
- e.printStackTrace(System.out);
-
- return false;
- }
- }
-
- Topic getTopic()
- {
- return _topic;
- }
-
- Message createEventMessage() throws JMSException
- {
- BytesMessage msg = _session.createBytesMessage();
- msg.writeBytes(_payload);
-
- return msg;
- }
-
- Message createShutdownMessage() throws JMSException
- {
- return _session.createTextMessage("SHUTDOWN");
- }
-
- Message createReportRequestMessage() throws JMSException
- {
- return _session.createTextMessage("REPORT");
- }
-
- Message createReportResponseMessage(String msg) throws JMSException
- {
- return _session.createTextMessage(msg);
- }
-
- boolean isShutdown(Message m)
- {
- return checkText(m, "SHUTDOWN");
- }
-
- boolean isReport(Message m)
- {
- return checkText(m, "REPORT");
- }
-
- Object getReport(Message m)
- {
- try
- {
- return ((TextMessage) m).getText();
- }
- catch (JMSException e)
- {
- e.printStackTrace(System.out);
-
- return e.toString();
- }
- }
-
- MessageConsumer createTopicConsumer() throws Exception
- {
- return _session.createConsumer(_topic);
- }
-
- MessageConsumer createDurableTopicConsumer(String name) throws Exception
- {
- return _session.createDurableSubscriber(_topic, name);
- }
-
- MessageConsumer createControlConsumer() throws Exception
- {
- return _session.createConsumer(_control);
- }
-
- MessageProducer createTopicPublisher() throws Exception
- {
- return _session.createProducer(_topic);
- }
-
- MessageProducer createControlPublisher() throws Exception
- {
- return _session.createProducer(_control);
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/topic/Publisher.java b/java/perftests/src/main/java/org/apache/qpid/topic/Publisher.java
deleted file mode 100644
index c3b19b558a..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/topic/Publisher.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.topic;
-
-import javax.jms.*;
-
-public class Publisher implements MessageListener
-{
- private final Object _lock = new Object();
- private final Connection _connection;
- private final Session _session;
- private final MessageFactory _factory;
- private final MessageProducer _publisher;
- private int _count;
-
- Publisher(Connection connection, int size, int ackMode, boolean persistent) throws Exception
- {
- _connection = connection;
- _session = _connection.createSession(false, ackMode);
- _factory = new MessageFactory(_session, size);
- _publisher = _factory.createTopicPublisher();
- _publisher.setDeliveryMode(persistent ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT);
- System.out.println("Publishing " + (persistent ? "persistent" : "non-persistent") + " messages of " + size + " bytes, " + Config.getAckModeDescription(ackMode) + ".");
- }
-
- private void test(Config config) throws Exception
- {
- test(config.getBatch(), config.getDelay(), config.getMessages(), config.getClients(), config.getWarmup());
- }
-
- private void test(int batches, long delay, int msgCount, int consumerCount, int warmup) throws Exception
- {
- _factory.createControlConsumer().setMessageListener(this);
- _connection.start();
-
- if (warmup > 0)
- {
- System.out.println("Runing warmup (" + warmup + " msgs)");
- long time = batch(warmup, consumerCount);
- System.out.println("Warmup completed in " + time + "ms");
- }
-
- long[] times = new long[batches];
- for (int i = 0; i < batches; i++)
- {
- if (i > 0)
- {
- Thread.sleep(delay * 1000);
- }
- times[i] = batch(msgCount, consumerCount);
- System.out.println("Batch " + (i + 1) + " of " + batches + " completed in " + times[i] + " ms.");
- }
-
- long min = min(times);
- long max = max(times);
- System.out.println("min: " + min + ", max: " + max + " avg: " + avg(times, min, max));
-
- //request shutdown
- _publisher.send(_factory.createShutdownMessage());
-
- _connection.stop();
- _connection.close();
- }
-
- private long batch(int msgCount, int consumerCount) throws Exception
- {
- _count = consumerCount;
- long start = System.currentTimeMillis();
- publish(msgCount);
- waitForCompletion(consumerCount);
- return System.currentTimeMillis() - start;
- }
-
- private void publish(int count) throws Exception
- {
-
- //send events
- for (int i = 0; i < count; i++)
- {
- _publisher.send(_factory.createEventMessage());
- if ((i + 1) % 100 == 0)
- {
- System.out.println("Sent " + (i + 1) + " messages");
- }
- }
-
- //request report
- _publisher.send(_factory.createReportRequestMessage());
- }
-
- private void waitForCompletion(int consumers) throws Exception
- {
- System.out.println("Waiting for completion...");
- synchronized (_lock)
- {
- while (_count > 0)
- {
- _lock.wait();
- }
- }
- }
-
-
- public void onMessage(Message message)
- {
- System.out.println("Received report " + _factory.getReport(message) + " " + --_count + " remaining");
- if (_count == 0)
- {
- synchronized (_lock)
- {
- _lock.notify();
- }
- }
- }
-
- static long min(long[] times)
- {
- long min = times.length > 0 ? times[0] : 0;
- for (int i = 0; i < times.length; i++)
- {
- min = Math.min(min, times[i]);
- }
- return min;
- }
-
- static long max(long[] times)
- {
- long max = times.length > 0 ? times[0] : 0;
- for (int i = 0; i < times.length; i++)
- {
- max = Math.max(max, times[i]);
- }
- return max;
- }
-
- static long avg(long[] times, long min, long max)
- {
- long sum = 0;
- for (int i = 0; i < times.length; i++)
- {
- sum += times[i];
- }
-
- int adjustment = 0;
-
- // Remove min and max if we have run enough batches.
- if (times.length > 2)
- {
- sum -= min;
- sum -= max;
- adjustment = 2;
- }
-
- return (sum / (times.length - adjustment));
- }
-
- public static void main(String[] argv) throws Exception
- {
- Config config = new Config();
- config.setOptions(argv);
-
- Connection con = config.createConnection();
- int size = config.getPayload();
- int ackMode = config.getAckMode();
- boolean persistent = config.usePersistentMessages();
- new Publisher(con, size, ackMode, persistent).test(config);
- }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/topic/TopicWithSelectorsTransientVolumeTest.java b/java/perftests/src/main/java/org/apache/qpid/topic/TopicWithSelectorsTransientVolumeTest.java
deleted file mode 100644
index 1d6ec07bb0..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/topic/TopicWithSelectorsTransientVolumeTest.java
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.topic;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import javax.jms.BytesMessage;
-import javax.jms.DeliveryMode;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-import javax.jms.Topic;
-import javax.jms.TopicConnection;
-import javax.jms.TopicPublisher;
-import javax.jms.TopicSession;
-import javax.jms.TopicSubscriber;
-import javax.naming.NamingException;
-
-import org.apache.qpid.AMQException;
-import org.apache.qpid.client.AMQQueue;
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.client.AMQTopic;
-import org.apache.qpid.exchange.ExchangeDefaults;
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
-public class TopicWithSelectorsTransientVolumeTest extends QpidBrokerTestCase
-{
- private static final int NUM_MSG_PER_ITERATION = 50;//must be a multiple of 10
- private static final int NUM_ITERATIONS = 1000;
-
- private static final int NUM_CONSUMERS = 50;
- private static final int MSG_SIZE = 1024;
- private static final byte[] BYTE_ARRAY = new byte[MSG_SIZE];
-
- private ArrayList<MyMessageSubscriber> _subscribers = new ArrayList<MyMessageSubscriber>();
- private HashMap<String,Long> _queueMsgCounts = new HashMap<String,Long>();
-
- private final static Object _lock=new Object();
- private boolean _producerFailed;
- private static int _finishedCount;
- private static int _failedCount;
-
- protected void setUp() throws Exception
- {
- super.setUp();
- init();
- }
-
- protected void tearDown() throws Exception
- {
- super.tearDown();
- }
-
- private void init()
- {
- _finishedCount = 0;
- _failedCount = 0;
- _producerFailed = false;
- _subscribers.clear();
- _queueMsgCounts.clear();
- }
-
-
- private Message createMessage(Session session) throws JMSException
- {
- BytesMessage message = session.createBytesMessage();
- message.writeBytes(BYTE_ARRAY);
-
- return message;
- }
-
- /**
- * 1 Topic with 50 subscribers using a selector, and 1 producer sending 50,000 1K messages with 90% selector success ratio.
- */
- public void test50SubscribersWith90PercentMatched() throws Exception
- {
- Topic topic = new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, "test50ConsumersWith10PercentUnmatched");
-
- System.out.println("Creating consumers");
-
- MyMessageSubscriber sub;
-
- for(int i=1; i <= NUM_CONSUMERS; i++)
- {
- sub = new MyMessageSubscriber(topic, "consumer" + i, ((9 * NUM_MSG_PER_ITERATION * NUM_ITERATIONS) / 10));
- _subscribers.add(sub);
- }
-
- System.out.println("Starting consumers");
- for(MyMessageSubscriber s: _subscribers)
- {
- Thread consumer = new Thread(s);
- consumer.start();
- }
-
- System.out.println("Creating producer");
- MyMessageProducer prod = new MyMessageProducer(topic);
-
- long startTime = System.currentTimeMillis();
-
- System.out.println("Starting producer");
- Thread producer = new Thread(prod);
- producer.start();
-
-
- // Wait for all the messageConsumers to have finished or failed
- synchronized (_lock)
- {
- while (_finishedCount + _failedCount < NUM_CONSUMERS)
- {
- try
- {
- _lock.wait();
- }
- catch (InterruptedException e)
- {
- //ignore
- }
- }
- }
-
- long endTime = System.currentTimeMillis();
- System.out.println("Elapsed time for messaging: " + (endTime-startTime) + "ms");
-
- assertFalse("Producer failed to send all messages", _producerFailed);
-
- //check if all messages received by consumers, or if there were failures
- if (_finishedCount != NUM_CONSUMERS)
- {
- fail(_failedCount + " consumers did not recieve all their expected messages");
- }
-
- //check if all queue depths were 0
- for(String consumer: _queueMsgCounts.keySet())
- {
- long depth = _queueMsgCounts.get(consumer);
- assertEquals(consumer + " subscription queue msg count was not 0", 0, depth);
- }
-
- }
-
- private class MyMessageProducer implements Runnable
- {
- private TopicConnection _connection;
- private TopicSession _session;
- private TopicPublisher _messagePublisher;
-
- public MyMessageProducer(Topic topic) throws JMSException, NamingException
- {
- _connection = (TopicConnection) getConnection();
- _session = (TopicSession) _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- _messagePublisher = _session.createPublisher(topic);
- }
-
- public void run()
- {
- try
- {
- for(int iter = 0; iter < NUM_ITERATIONS; iter++)
- {
- int i = 0;
-
- //send 90% matching messages
- for (; i < (9 * NUM_MSG_PER_ITERATION)/10; i++)
- {
- Message message = createMessage(_session);
- message.setStringProperty("testprop", "true");
-
- _messagePublisher.publish(message, DeliveryMode.NON_PERSISTENT,
- Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE);
-
- Thread.yield();
- }
-
- //send remaining 10% non-matching messages
- for (; i < NUM_MSG_PER_ITERATION; i++)
- {
- Message message = _session.createMessage();
- message.setStringProperty("testprop", "false");
-
- _messagePublisher.publish(message, DeliveryMode.NON_PERSISTENT,
- Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE);
-
- Thread.yield();
- }
- }
-
- }
- catch (Exception exp)
- {
- System.out.println("producer: caught an exception, probably exiting before all messages sent");
- exp.printStackTrace();
- synchronized (_lock)
- {
- _producerFailed=true;
- _lock.notifyAll();
- }
- }
- }
- }
-
-
- private class MyMessageSubscriber implements Runnable
- {
- /* The topic this subscriber is subscribing to */
- private Topic _topic;
- private String _consumerName;
- private int _outstandingMsgCount;
- private TopicConnection _connection;
- private TopicSession _session;
- private TopicSubscriber _durSub;
-
- public MyMessageSubscriber(Topic topic, String consumerName, int messageCount) throws JMSException, NamingException
- {
- _outstandingMsgCount = messageCount;
- _topic=topic;
- _consumerName = consumerName;
- _connection = (TopicConnection) getConnection();
- _session = (TopicSession) _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- _durSub = _session.createDurableSubscriber(_topic, _consumerName,"testprop='true'", false);
- _connection.start();
- }
-
- public void run()
- {
-
- boolean failed = false;
- do
- {
- Message m = null;
- try
- {
- m = _durSub.receive(10000);
- }
- catch (JMSException exp)
- {
- System.out.println(_consumerName + ": caught an exception handling a received message");
- exp.printStackTrace();
-
- failed = true;
- break;
- }
-
- Thread.yield();
-
- _outstandingMsgCount--;
-
- if(_outstandingMsgCount % 500 == 0)
- {
- System.out.println(_consumerName + ": outstanding message count: " + _outstandingMsgCount);
- }
-
- if(m == null)
- {
- if(_outstandingMsgCount != 0)
- {
- failed = true;
- }
- break;
- }
- }
- while(_outstandingMsgCount > 0);
-
- System.out.println(_consumerName + ": outstanding message count: " + _outstandingMsgCount);
-
- try
- {
- AMQQueue subcriptionQueue = new AMQQueue(ExchangeDefaults.TOPIC_EXCHANGE_NAME,"clientid" + ":" + _consumerName);
-
- ((AMQSession)_session).sync();
- Long depth = ((AMQSession)_session).getQueueDepth(subcriptionQueue);
- _queueMsgCounts.put(_consumerName, depth);
-
- System.out.println(_consumerName + ": completion queue msg count: " + depth);
- }
- catch (AMQException exp)
- {
- System.out.println(_consumerName + ": caught an exception determining completion queue depth");
- exp.printStackTrace();
- }
- finally
- {
- try
- {
- _session.unsubscribe(_consumerName);
- }
- catch (JMSException e)
- {
- System.out.println(_consumerName + ": caught an exception whilst unsubscribing");
- e.printStackTrace();
- }
- }
-
- synchronized (_lock)
- {
- if (_outstandingMsgCount == 0 && !failed)
- {
- _finishedCount++;
- System.out.println(_consumerName + ": finished");
- }
- else
- {
- _failedCount++;
- System.out.println(_consumerName + ": failed");
- }
- _lock.notifyAll();
- }
-
- }
- }
-
- //helper method to allow easily running against an external standalone broker
-// public static void main(String[] args) throws Exception
-// {
-// System.setProperty("broker.config", "/dev/null");
-// System.setProperty("broker", "external");
-// System.setProperty("java.naming.factory.initial", "org.apache.qpid.jndi.PropertiesFileInitialContextFactory");
-// System.setProperty("java.naming.provider.url", "test-profiles/test-provider.properties");
-//
-// TopicWithSelectorsTransientVolumeTest test = new TopicWithSelectorsTransientVolumeTest();
-// test.init();
-// test.test50SubscribersWith90PercentMatched();
-// test.tearDown();
-// }
-}
diff --git a/java/perftests/src/main/java/org/apache/qpid/topic/topicselectors.properties b/java/perftests/src/main/java/org/apache/qpid/topic/topicselectors.properties
deleted file mode 100644
index 1f572af58a..0000000000
--- a/java/perftests/src/main/java/org/apache/qpid/topic/topicselectors.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
-
-
-# register some connection factories
-# connectionfactory.[jndiname] = [ConnectionURL]
-connectionfactory.default = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672' \ No newline at end of file
diff --git a/java/perftests/src/main/resources/perftests.properties b/java/perftests/src/main/resources/perftests.properties
new file mode 100644
index 0000000000..d8823f9dc5
--- /dev/null
+++ b/java/perftests/src/main/resources/perftests.properties
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+
+connectionfactory.connectionfactory = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/ArgumentParserTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/ArgumentParserTest.java
new file mode 100644
index 0000000000..3be82627fe
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/ArgumentParserTest.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public class ArgumentParserTest extends QpidTestCase
+{
+ private static final String TEST_CONFIG_FILENAME = "ControllerRunnerTest-test-config-filename.json";
+ private static final String JNDI_CONFIG_FILENAME = "ControllerRunnerTest-jndi-config-filename.properties";
+ private static final String DISTRIBUTED_MODE = "true";
+
+ public static final String TEST_CONFIG_PROP = "test-config";
+ public static final String JNDI_CONFIG_PROP = "jndi-config";
+ public static final String DISTRIBUTED_PROP = "distributed";
+
+ public static final String TEST_CONFIG_DEFAULT = "perftests-config.json";
+ public static final String JNDI_CONFIG_DEFAULT = "perftests-jndi.properties";
+ public static final String DISTRIBUTED_DEFAULT = "false";
+
+ private Map<String,String> _options = new HashMap<String, String>();
+
+ private ArgumentParser _parser;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _parser = new ArgumentParser();
+
+ _options.clear();
+ _options.put(TEST_CONFIG_PROP, TEST_CONFIG_DEFAULT);
+ _options.put(JNDI_CONFIG_PROP, JNDI_CONFIG_DEFAULT);
+ _options.put(DISTRIBUTED_PROP, DISTRIBUTED_DEFAULT);
+ }
+
+ public void testInvalidArguments()
+ {
+ String[] args = new String[]{"nonExistentConfigProperty" + "=" + TEST_CONFIG_FILENAME};
+
+ try
+ {
+ _parser.parseArgumentsIntoConfig(_options, args);
+ fail("expected exception to be thrown due to provision of a non existent config property");
+ }
+ catch(IllegalArgumentException e)
+ {
+ //expected
+ }
+ }
+
+ public void testDefaultConfigValues()
+ {
+ String[] args = new String[0];
+
+ _parser.parseArgumentsIntoConfig(_options, args);
+
+ assertEquals("unexpected config value", TEST_CONFIG_DEFAULT, _options.get(TEST_CONFIG_PROP));
+ assertEquals("unexpected config value", JNDI_CONFIG_DEFAULT, _options.get(JNDI_CONFIG_PROP));
+ assertEquals("unexpected config value", DISTRIBUTED_DEFAULT, _options.get(DISTRIBUTED_PROP));
+ }
+
+ public void testConfigurationParsingOverridesDefault() throws Exception
+ {
+ String[] args = new String[]{TEST_CONFIG_PROP + "=" + TEST_CONFIG_FILENAME,
+ JNDI_CONFIG_PROP + "=" + JNDI_CONFIG_FILENAME,
+ DISTRIBUTED_PROP + "=" + DISTRIBUTED_MODE};
+
+ _parser.parseArgumentsIntoConfig(_options, args);
+
+ assertEquals("unexpected config value", TEST_CONFIG_FILENAME, _options.get(TEST_CONFIG_PROP));
+ assertEquals("unexpected config value", JNDI_CONFIG_FILENAME, _options.get(JNDI_CONFIG_PROP));
+ assertEquals("unexpected config value", DISTRIBUTED_MODE, _options.get(DISTRIBUTED_PROP));
+ assertFalse("override value was the same as the default", DISTRIBUTED_MODE.equalsIgnoreCase(_options.get(DISTRIBUTED_DEFAULT)));
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/ConfigFileHelper.java b/java/perftests/src/test/java/org/apache/qpid/disttest/ConfigFileHelper.java
new file mode 100644
index 0000000000..12ba3b56ad
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/ConfigFileHelper.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+import org.apache.qpid.disttest.controller.config.Config;
+import org.apache.qpid.disttest.controller.config.ConfigReader;
+
+public class ConfigFileHelper
+{
+ public static Reader getConfigFileReader(Class<?> testClass, String resourceName)
+ {
+ InputStream inputStream = testClass.getResourceAsStream(resourceName);
+ if(inputStream == null)
+ {
+ throw new RuntimeException("Can't find resource " + resourceName + " using classloader of class " + testClass);
+ }
+ Reader reader = new InputStreamReader(inputStream);
+ return reader;
+ }
+
+ public static Config getConfigFromResource(Class<?> testClass, String resourceName)
+ {
+ ConfigReader configReader = new ConfigReader();
+ Config config = configReader.readConfig(getConfigFileReader(testClass, resourceName));
+ return config;
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/VisitorTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/VisitorTest.java
new file mode 100644
index 0000000000..320e7d8c9d
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/VisitorTest.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.Command;
+
+
+public class VisitorTest extends TestCase
+{
+
+ public void testStringVisited() throws Exception
+ {
+ Object argument = new String();
+
+ TestVisitor visitor = new TestVisitor();
+ visitor.visit(argument);
+
+ assertSame(argument, visitor._string);
+ }
+
+ public void testCommandVisited() throws Exception
+ {
+ Object argument = new TestCommand();
+
+ TestVisitor visitor = new TestVisitor();
+ visitor.visit(argument);
+
+ assertSame(argument, visitor._testCommand);
+ }
+
+ public void testNoVisitIntegerImplementatiom() throws Exception
+ {
+ Integer argument = Integer.valueOf(1);
+
+ TestVisitor visitor = new TestVisitor();
+
+ try
+ {
+ visitor.visit(argument);
+ fail("Exception not thrown");
+ }
+ catch (DistributedTestException e)
+ {
+ assertNotNull(e.getCause());
+ assertEquals(NoSuchMethodException.class, e.getCause().getClass());
+ }
+ }
+
+ class TestVisitor extends Visitor
+ {
+ String _string = null;
+ TestCommand _testCommand = null;
+
+ public void visit(String string)
+ {
+ _string = string;
+ }
+
+ public void visit(TestCommand command)
+ {
+ _testCommand = command;
+ }
+ }
+
+ class TestCommand extends Command
+ {
+
+ public TestCommand()
+ {
+ super(null);
+ }
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientCommandVisitorTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientCommandVisitorTest.java
new file mode 100644
index 0000000000..4a82f6719f
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientCommandVisitorTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+import org.apache.qpid.disttest.message.StartTestCommand;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.apache.qpid.disttest.message.TearDownTestCommand;
+
+public class ClientCommandVisitorTest extends TestCase
+{
+ private Client _client;
+ private ClientCommandVisitor _visitor;
+ private ClientJmsDelegate _delegate;
+
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _client = mock(Client.class);
+ _delegate = mock(ClientJmsDelegate.class);
+ _visitor = new ClientCommandVisitor(_client, _delegate);
+ }
+
+ public void testStopClient()
+ {
+ StopClientCommand command = new StopClientCommand();
+ _visitor.visit(command);
+ verify(_client).stop();
+ }
+
+ public void testCreateConnection() throws Exception
+ {
+ final CreateConnectionCommand command = new CreateConnectionCommand();
+ _visitor.visit(command);
+ verify(_delegate).createConnection(command);
+ }
+
+ public void testCreateSession() throws Exception
+ {
+ final CreateSessionCommand command = new CreateSessionCommand();
+ _visitor.visit(command);
+ verify(_delegate).createSession(command);
+ }
+
+ public void testCreateProducer() throws Exception
+ {
+ final CreateProducerCommand command = new CreateProducerCommand();
+ _visitor.visit(command);
+ verify(_delegate).createProducer(command);
+ }
+
+ public void testCreateConsumer() throws Exception
+ {
+ final CreateConsumerCommand command = new CreateConsumerCommand();
+ _visitor.visit(command);
+ verify(_delegate).createConsumer(command);
+ }
+
+ public void testStartTest() throws Exception
+ {
+ final StartTestCommand command = new StartTestCommand();
+ _visitor.visit(command);
+ verify(_client).startTest();
+ }
+
+ public void testStopTest() throws Exception
+ {
+ final TearDownTestCommand stopCommand = new TearDownTestCommand();
+ _visitor.visit(stopCommand);
+ verify(_client).tearDownTest();
+ }
+
+ public void testCreateMessageProvider() throws Exception
+ {
+ final CreateMessageProviderCommand command = new CreateMessageProviderCommand();
+ command.setProviderName("test");
+ _visitor.visit(command);
+ verify(_delegate).createMessageProvider(command);
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientTest.java
new file mode 100644
index 0000000000..198baa6ef4
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientTest.java
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Collections;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.mockito.InOrder;
+import org.mockito.Mockito;
+
+public class ClientTest extends TestCase
+{
+ private Client _client;
+ private ClientJmsDelegate _delegate;
+ private ClientCommandVisitor _visitor;
+ private ParticipantExecutor _participant;
+ private ParticipantExecutorRegistry _participantRegistry;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _delegate = mock(ClientJmsDelegate.class);
+ _visitor = mock(ClientCommandVisitor.class);
+ _client = new Client(_delegate);
+ _client.setClientCommandVisitor(_visitor);
+ _participant = mock(ParticipantExecutor.class);
+ when(_participant.getParticipantName()).thenReturn("testParticipantMock");
+
+ _participantRegistry = mock(ParticipantExecutorRegistry.class);
+ when(_participantRegistry.executors()).thenReturn(Collections.singletonList(_participant));
+ _client.setParticipantRegistry(_participantRegistry);
+ }
+
+ public void testInitialState() throws Exception
+ {
+ assertEquals("Expected client to be in CREATED state", ClientState.CREATED, _client.getState());
+ }
+
+ public void testStart() throws Exception
+ {
+ _client.start();
+ final InOrder inOrder = inOrder(_delegate);
+ inOrder.verify(_delegate).setInstructionListener(_client);
+ inOrder.verify(_delegate).sendRegistrationMessage();
+ assertEquals("Expected client to be in STARTED state", ClientState.READY, _client.getState());
+ }
+
+ public void testStopClient() throws Exception
+ {
+ _client.stop();
+
+ assertEquals("Expected client to be in STOPPED state", ClientState.STOPPED, _client.getState());
+ }
+
+ public void testProcessInstructionVisitsCommandAndResponds() throws Exception
+ {
+ // has to be declared to be of supertype Command otherwise Mockito verify()
+ // refers to wrong method
+ final Command command = new StopClientCommand();
+ _client.processInstruction(command);
+
+ verify(_visitor).visit(command);
+ verify(_delegate).sendResponseMessage(isA(Response.class));
+ }
+
+ public void testWaitUntilStopped() throws Exception
+ {
+ stopClientLater(500);
+ _client.waitUntilStopped(1000);
+ verify(_delegate).destroy();
+ }
+
+ public void testStartTest() throws Exception
+ {
+ _client.start();
+ _client.addParticipantExecutor(_participant);
+
+ verify(_participantRegistry).add(_participant);
+
+ _client.startTest();
+
+ InOrder inOrder = Mockito.inOrder(_delegate, _participant);
+ inOrder.verify(_delegate).startConnections();
+ inOrder.verify(_participant).start(_client);
+ }
+
+ public void testTearDownTest() throws Exception
+ {
+ // before we can tear down the test the client needs to be in the "running test" state, which requires a participant
+ _client.start();
+ _client.addParticipantExecutor(_participant);
+ _client.startTest();
+
+ _client.tearDownTest();
+
+ verify(_delegate).closeTestConnections();
+
+ verify(_participantRegistry).clear();
+ }
+
+ public void testResults() throws Exception
+ {
+ ParticipantResult testResult = mock(ParticipantResult.class);
+ _client.sendResults(testResult);
+ verify(_delegate).sendResponseMessage(testResult);
+ }
+
+ private void stopClientLater(long delay)
+ {
+ doLater(new TimerTask()
+ {
+ @Override
+ public void run()
+ {
+ _client.stop();
+ }
+
+ }, delay);
+ }
+
+ private void doLater(TimerTask task, long delayInMillis)
+ {
+ Timer timer = new Timer();
+ timer.schedule(task, delayInMillis);
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/ConsumerParticipantTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ConsumerParticipantTest.java
new file mode 100644
index 0000000000..ff7cfd2b41
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ConsumerParticipantTest.java
@@ -0,0 +1,180 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import static org.apache.qpid.disttest.client.ParticipantTestHelper.assertExpectedConsumerResults;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import javax.jms.Message;
+import javax.jms.Session;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.mockito.InOrder;
+
+public class ConsumerParticipantTest extends TestCase
+{
+ private static final String SESSION_NAME1 = "SESSION1";
+ private static final String PARTICIPANT_NAME1 = "PARTICIPANT_NAME1";
+ private static final long RECEIVE_TIMEOUT = 100;
+ private static final String CLIENT_NAME = "CLIENT_NAME";
+ private static final int PAYLOAD_SIZE_PER_MESSAGE = 1024;
+
+ private final Message _mockMessage = mock(Message.class);
+ private final CreateConsumerCommand _command = new CreateConsumerCommand();
+ private ClientJmsDelegate _delegate;
+ private ConsumerParticipant _consumerParticipant;
+ private InOrder _inOrder;
+
+ /** used to check start/end time of results */
+ private long _testStartTime;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _delegate = mock(ClientJmsDelegate.class);
+ _inOrder = inOrder(_delegate);
+
+ _command.setSessionName(SESSION_NAME1);
+ _command.setParticipantName(PARTICIPANT_NAME1);
+ _command.setSynchronous(true);
+ _command.setReceiveTimeout(RECEIVE_TIMEOUT);
+
+ _consumerParticipant = new ConsumerParticipant(_delegate, _command);
+
+ when(_delegate.consumeMessage(PARTICIPANT_NAME1, RECEIVE_TIMEOUT)).thenReturn(_mockMessage);
+ when(_delegate.calculatePayloadSizeFrom(_mockMessage)).thenReturn(PAYLOAD_SIZE_PER_MESSAGE);
+ when(_delegate.getAcknowledgeMode(SESSION_NAME1)).thenReturn(Session.CLIENT_ACKNOWLEDGE);
+
+ _testStartTime = System.currentTimeMillis();
+ }
+
+ public void testNoMessagesToReceive() throws Exception
+ {
+ _command.setNumberOfMessages(0);
+ _command.setMaximumDuration(0);
+
+ try
+ {
+ _consumerParticipant.doIt(CLIENT_NAME);
+ fail("Exception not thrown");
+ }
+ catch(DistributedTestException e)
+ {
+ // PASS
+ assertEquals("number of messages and duration cannot both be zero", e.getMessage());
+
+ }
+
+ verify(_delegate, never()).consumeMessage(anyString(), anyLong());
+ }
+
+ public void testReceiveOneMessageSynch() throws Exception
+ {
+ int numberOfMessages = 1;
+ long totalPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * numberOfMessages;
+ _command.setNumberOfMessages(numberOfMessages);
+
+ ParticipantResult result = _consumerParticipant.doIt(CLIENT_NAME);
+
+ assertExpectedConsumerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.CLIENT_ACKNOWLEDGE, null, numberOfMessages, PAYLOAD_SIZE_PER_MESSAGE, totalPayloadSize, null);
+
+ _inOrder.verify(_delegate).consumeMessage(PARTICIPANT_NAME1, RECEIVE_TIMEOUT);
+ _inOrder.verify(_delegate).calculatePayloadSizeFrom(_mockMessage);
+ _inOrder.verify(_delegate).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testReceiveMessagesForDurationSynch() throws Exception
+ {
+ long duration = 100;
+ _command.setMaximumDuration(duration);
+
+ ParticipantResult result = _consumerParticipant.doIt(CLIENT_NAME);
+
+ assertExpectedConsumerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.CLIENT_ACKNOWLEDGE, null, null, PAYLOAD_SIZE_PER_MESSAGE, null, duration);
+
+ verify(_delegate, atLeastOnce()).consumeMessage(PARTICIPANT_NAME1, RECEIVE_TIMEOUT);
+ verify(_delegate, atLeastOnce()).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, atLeastOnce()).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testReceiveMessagesBatchedSynch() throws Exception
+ {
+ int numberOfMessages = 10;
+ final int batchSize = 3;
+ long totalPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * numberOfMessages;
+ _command.setNumberOfMessages(numberOfMessages);
+ _command.setBatchSize(batchSize);
+
+ ParticipantResult result = _consumerParticipant.doIt(CLIENT_NAME);
+
+ assertExpectedConsumerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.CLIENT_ACKNOWLEDGE, batchSize, numberOfMessages, PAYLOAD_SIZE_PER_MESSAGE, totalPayloadSize, null);
+
+ verify(_delegate, times(numberOfMessages)).consumeMessage(PARTICIPANT_NAME1, RECEIVE_TIMEOUT);
+ verify(_delegate, times(numberOfMessages)).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, times(4)).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testReceiveMessagesWithVaryingPayloadSize() throws Exception
+ {
+ int numberOfMessages = 3;
+
+ int firstPayloadSize = PAYLOAD_SIZE_PER_MESSAGE;
+ int secondPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * 2;
+ int thirdPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * 4;
+
+ _command.setNumberOfMessages(numberOfMessages);
+
+ when(_delegate.calculatePayloadSizeFrom(_mockMessage)).thenReturn(firstPayloadSize, secondPayloadSize, thirdPayloadSize);
+
+ ParticipantResult result = _consumerParticipant.doIt(CLIENT_NAME);
+
+ final int expectedPayloadResultPayloadSize = 0;
+ final long totalPayloadSize = firstPayloadSize + secondPayloadSize + thirdPayloadSize;
+ assertExpectedConsumerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.CLIENT_ACKNOWLEDGE, null, numberOfMessages, expectedPayloadResultPayloadSize, totalPayloadSize, null);
+
+ verify(_delegate, times(numberOfMessages)).consumeMessage(PARTICIPANT_NAME1, RECEIVE_TIMEOUT);
+ verify(_delegate, times(numberOfMessages)).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, times(numberOfMessages)).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testReleaseResources()
+ {
+ _consumerParticipant.releaseResources();
+ verify(_delegate).closeTestConsumer(PARTICIPANT_NAME1);
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/MessageProviderTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/MessageProviderTest.java
new file mode 100644
index 0000000000..ffc3733eb7
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/MessageProviderTest.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.jms.Message;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.client.property.ListPropertyValue;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.client.property.SimplePropertyValue;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+
+public class MessageProviderTest extends TestCase
+{
+ private Session _session;
+ private TextMessage _message;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _session = mock(Session.class);
+ _message = mock(TextMessage.class);
+ when(_session.createTextMessage(isA(String.class))).thenReturn(_message);
+ when(_session.createTextMessage()).thenReturn(_message);
+ }
+
+ public void testGetMessagePayload() throws Exception
+ {
+ MessageProvider messageProvider = new MessageProvider(null)
+ {
+ public String getMessagePayload(CreateProducerCommand command)
+ {
+ return super.getMessagePayload(command);
+ }
+ };
+ CreateProducerCommand command = new CreateProducerCommand();
+ command.setMessageSize(100);
+ String payloadValue = messageProvider.getMessagePayload(command);
+ assertNotNull("Mesage payload should not be null", payloadValue);
+ assertEquals("Unexpected payload size", 100, payloadValue.length());
+ }
+
+ public void testNextMessage() throws Exception
+ {
+ MessageProvider messageProvider = new MessageProvider(null);
+ CreateProducerCommand command = new CreateProducerCommand();
+ command.setMessageSize(100);
+ Message message = messageProvider.nextMessage(_session, command);
+ assertNotNull("Mesage should be returned", message);
+ verify(_message, atLeastOnce()).setText(isA(String.class));
+ }
+
+ public void testNextMessageWithProperties() throws Exception
+ {
+ Map<String, PropertyValue> properties = new HashMap<String, PropertyValue>();
+ properties.put("test1", new SimplePropertyValue("testValue1"));
+ properties.put("test2", new SimplePropertyValue(new Integer(1)));
+ properties.put("priority", new SimplePropertyValue(new Integer(2)));
+ List<PropertyValue> listItems = new ArrayList<PropertyValue>();
+ listItems.add(new SimplePropertyValue(new Double(2.0)));
+ ListPropertyValue list = new ListPropertyValue();
+ list.setItems(listItems);
+ properties.put("test3", list);
+
+ MessageProvider messageProvider = new MessageProvider(properties);
+ CreateProducerCommand command = new CreateProducerCommand();
+ command.setMessageSize(100);
+ Message message = messageProvider.nextMessage(_session, command);
+ assertNotNull("Mesage should be returned", message);
+ verify(_message, atLeastOnce()).setText(isA(String.class));
+ verify(_message, atLeastOnce()).setJMSPriority(2);
+ verify(_message, atLeastOnce()).setStringProperty("test1", "testValue1");
+ verify(_message, atLeastOnce()).setIntProperty("test2", 1);
+ verify(_message, atLeastOnce()).setDoubleProperty("test3", 2.0);
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantExecutorTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantExecutorTest.java
new file mode 100644
index 0000000000..f30e4664ff
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantExecutorTest.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.disttest.client;
+
+import static org.mockito.Matchers.argThat;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.mockito.ArgumentMatcher;
+import org.mockito.InOrder;
+
+public class ParticipantExecutorTest extends TestCase
+{
+ private static final ResultHasError HAS_ERROR = new ResultHasError();
+ private static final String CLIENT_NAME = "CLIENT_NAME";
+ private static final String PARTICIPANT_NAME = "PARTICIPANT_NAME";
+ private ParticipantExecutor _participantExecutor = null;
+ private Client _client = null;
+ private Participant _participant = null;
+ private ParticipantResult _mockResult;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _client = mock(Client.class);
+ when(_client.getClientName()).thenReturn(CLIENT_NAME);
+ _participant = mock(Participant.class);
+
+ _participantExecutor = new ParticipantExecutor(_participant);
+ _participantExecutor.setExecutor(new SynchronousExecutor());
+
+ _mockResult = mock(ParticipantResult.class);
+ }
+
+ public void testStart() throws Exception
+ {
+ when(_participant.doIt(CLIENT_NAME)).thenReturn(_mockResult);
+
+ _participantExecutor.start(_client);
+
+ InOrder inOrder = inOrder(_participant, _client);
+
+ inOrder.verify(_participant).doIt(CLIENT_NAME);
+ inOrder.verify(_client).sendResults(_mockResult);
+ inOrder.verify(_participant).releaseResources();
+ }
+
+ public void testParticipantThrowsException() throws Exception
+ {
+ when(_participant.doIt(CLIENT_NAME)).thenThrow(DistributedTestException.class);
+
+ _participantExecutor.start(_client);
+
+ InOrder inOrder = inOrder(_participant, _client);
+
+ inOrder.verify(_participant).doIt(CLIENT_NAME);
+ inOrder.verify(_client).sendResults(argThat(HAS_ERROR));
+ inOrder.verify(_participant).releaseResources();
+ }
+
+ public void testThreadNameAndDaemonness() throws Exception
+ {
+
+ ThreadPropertyReportingParticipant participant = new ThreadPropertyReportingParticipant(PARTICIPANT_NAME);
+ _participantExecutor = new ParticipantExecutor(participant);
+
+ _participantExecutor.start(_client);
+ participant.awaitExecution();
+
+ assertTrue("Participant should be run in a thread named after it", participant.threadWasCalled().endsWith(PARTICIPANT_NAME));
+ assertTrue("Executor should use daemon threads to avoid them preventing JVM termination", participant.wasDaemon());
+ }
+
+ private static final class ThreadPropertyReportingParticipant implements Participant
+ {
+ private final String _participantName;
+ private final CountDownLatch _participantExecuted = new CountDownLatch(1);
+ private String _threadName;
+ private boolean _daemon;
+
+ public ThreadPropertyReportingParticipant(String participantName)
+ {
+ _participantName = participantName;
+ }
+
+ public String threadWasCalled()
+ {
+ return _threadName;
+ }
+
+ public boolean wasDaemon()
+ {
+ return _daemon;
+ }
+
+ @Override
+ public void releaseResources()
+ {
+ }
+
+ @Override
+ public String getName()
+ {
+ return _participantName;
+ }
+
+ @Override
+ public ParticipantResult doIt(String registeredClientName) throws Exception
+ {
+ Thread currentThread = Thread.currentThread();
+ _threadName = currentThread.getName();
+ _daemon = currentThread.isDaemon();
+
+ _participantExecuted.countDown();
+
+ return null; // unused
+ }
+
+ public void awaitExecution()
+ {
+ boolean success = false;
+ try
+ {
+ success = _participantExecuted.await(5, TimeUnit.SECONDS);
+ }
+ catch (InterruptedException e)
+ {
+ Thread.currentThread().interrupt();
+ }
+
+ assertTrue("Participant not executed", success);
+ }
+ }
+
+ /** avoids our unit test needing to use multiple threads */
+ private final class SynchronousExecutor implements Executor
+ {
+ @Override
+ public void execute(Runnable command)
+ {
+ command.run();
+ }
+ }
+
+ private static class ResultHasError extends ArgumentMatcher<ParticipantResult>
+ {
+ @Override
+ public boolean matches(Object argument)
+ {
+ ParticipantResult result = (ParticipantResult) argument;
+ return result.hasError();
+ }
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantRegistryTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantRegistryTest.java
new file mode 100644
index 0000000000..bd0d5a39c8
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantRegistryTest.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import static org.mockito.Mockito.mock;
+import junit.framework.TestCase;
+
+public class ParticipantRegistryTest extends TestCase
+{
+ private ParticipantExecutorRegistry _participantRegistry = new ParticipantExecutorRegistry();
+
+ private ParticipantExecutor _testParticipant1 = mock(ParticipantExecutor.class);
+ private ParticipantExecutor _testParticipant2 = mock(ParticipantExecutor.class);
+
+ public void testAdd()
+ {
+ assertTrue(_participantRegistry.executors().isEmpty());
+
+ _participantRegistry.add(_testParticipant1);
+
+ assertTrue(_participantRegistry.executors().contains(_testParticipant1));
+
+ _participantRegistry.add(_testParticipant2);
+
+ assertTrue(_participantRegistry.executors().contains(_testParticipant2));
+ }
+
+ public void testClear()
+ {
+ _participantRegistry.add(_testParticipant1);
+
+ assertEquals(1, _participantRegistry.executors().size());
+
+ _participantRegistry.clear();
+
+ assertTrue(_participantRegistry.executors().isEmpty());
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantResultFactoryTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantResultFactoryTest.java
new file mode 100644
index 0000000000..3b21834a5c
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantResultFactoryTest.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import java.util.Date;
+
+import javax.jms.DeliveryMode;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateParticpantCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+
+public class ParticipantResultFactoryTest extends TestCase
+{
+ private static final String PARTICIPANT_NAME = "participantName";
+ private static final String REGISTERED_CLIENT_NAME = "registeredClientName";
+
+ private static final int BATCH_SIZE = 10;
+ private static final long MAXIMUM_DURATION = 500;
+ private static final int NUMBER_OF_MESSAGES_PROCESSED = 100;
+ private static final long TIME_TAKEN = 100;
+ private static final long TOTAL_PAYLOAD_PROCESSED = 200;
+ private static final int PAYLOAD_SIZE = 300;
+
+ private static final Date START = new Date(0);
+ private static final Date END = new Date(START.getTime() + TIME_TAKEN);
+
+ private ParticipantResultFactory _participantResultFactory;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _participantResultFactory = new ParticipantResultFactory();
+ }
+
+ public void testCreateForProducer()
+ {
+ CreateProducerCommand command = new CreateProducerCommand();
+ setCommonCommandFields(command);
+
+ long producerStartDelay = 30;
+ command.setStartDelay(producerStartDelay);
+
+ int deliveryMode = DeliveryMode.PERSISTENT;
+ command.setDeliveryMode(deliveryMode);
+
+ int priority = 5;
+ command.setPriority(priority);
+
+ long producerInterval = 50;
+ command.setInterval(producerInterval);
+
+ long timeToLive = 60;
+ command.setTimeToLive(timeToLive);
+
+ int totalNumberOfConsumers = 0;
+ int totalNumberOfProducers = 1;
+
+ int acknowledgeMode = 1;
+
+ ProducerParticipantResult result = _participantResultFactory.createForProducer(PARTICIPANT_NAME,
+ REGISTERED_CLIENT_NAME,
+ command,
+ acknowledgeMode,
+ NUMBER_OF_MESSAGES_PROCESSED,
+ PAYLOAD_SIZE,
+ TOTAL_PAYLOAD_PROCESSED,
+ START, END);
+
+ assertCommonResultProperties(result);
+
+ assertEquals(deliveryMode, result.getDeliveryMode());
+ assertEquals(acknowledgeMode, result.getAcknowledgeMode());
+ assertEquals(priority, result.getPriority());
+ assertEquals(producerInterval, result.getInterval());
+ assertEquals(producerStartDelay, result.getStartDelay());
+ assertEquals(timeToLive, result.getTimeToLive());
+ assertEquals(totalNumberOfConsumers, result.getTotalNumberOfConsumers());
+ assertEquals(totalNumberOfProducers, result.getTotalNumberOfProducers());
+ }
+
+ public void testCreateForConsumer()
+ {
+ CreateConsumerCommand command = new CreateConsumerCommand();
+ setCommonCommandFields(command);
+
+ boolean topic = true;
+ command.setTopic(topic);
+
+ boolean durable = true;
+ command.setDurableSubscription(durable);
+
+ boolean browsingSubscription = false;
+ command.setBrowsingSubscription(browsingSubscription);
+
+ String selector = "selector";
+ boolean isSelector = true;
+ command.setSelector(selector);
+
+ boolean noLocal = false;
+ command.setNoLocal(noLocal);
+
+ boolean synchronousConsumer = true;
+ command.setSynchronous(synchronousConsumer);
+
+ int totalNumberOfConsumers = 1;
+ int totalNumberOfProducers = 0;
+
+ int acknowledgeMode = 2;
+
+ ConsumerParticipantResult result = _participantResultFactory.createForConsumer(PARTICIPANT_NAME,
+ REGISTERED_CLIENT_NAME,
+ command,
+ acknowledgeMode,
+ NUMBER_OF_MESSAGES_PROCESSED,
+ PAYLOAD_SIZE,
+ TOTAL_PAYLOAD_PROCESSED,
+ START, END);
+
+ assertCommonResultProperties(result);
+
+ assertEquals(topic, result.isTopic());
+ assertEquals(durable, result.isDurableSubscription());
+ assertEquals(browsingSubscription, result.isBrowsingSubscription());
+ assertEquals(isSelector, result.isSelector());
+ assertEquals(noLocal, result.isNoLocal());
+ assertEquals(synchronousConsumer, result.isSynchronousConsumer());
+ assertEquals(totalNumberOfConsumers, result.getTotalNumberOfConsumers());
+ assertEquals(totalNumberOfProducers, result.getTotalNumberOfProducers());
+ }
+
+ public void testCreateForError()
+ {
+ String errorMessage = "error";
+ ParticipantResult result = _participantResultFactory.createForError(PARTICIPANT_NAME, REGISTERED_CLIENT_NAME, errorMessage);
+ assertEquals(PARTICIPANT_NAME, result.getParticipantName());
+ assertEquals(REGISTERED_CLIENT_NAME, result.getRegisteredClientName());
+ }
+
+
+ private void setCommonCommandFields(CreateParticpantCommand command)
+ {
+ command.setBatchSize(BATCH_SIZE);
+ command.setMaximumDuration(MAXIMUM_DURATION);
+ }
+
+
+ private void assertCommonResultProperties(ParticipantResult result)
+ {
+ assertEquals(PARTICIPANT_NAME, result.getParticipantName());
+ assertEquals(REGISTERED_CLIENT_NAME, result.getRegisteredClientName());
+ assertEquals(BATCH_SIZE, result.getBatchSize());
+ assertEquals(MAXIMUM_DURATION, result.getMaximumDuration());
+ assertEquals(TIME_TAKEN, result.getTimeTaken());
+ assertEquals(NUMBER_OF_MESSAGES_PROCESSED, result.getNumberOfMessagesProcessed());
+ assertEquals(TOTAL_PAYLOAD_PROCESSED, result.getTotalPayloadProcessed());
+ assertEquals(PAYLOAD_SIZE, result.getPayloadSize());
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantTestHelper.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantTestHelper.java
new file mode 100644
index 0000000000..a013cb0a06
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantTestHelper.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+
+public class ParticipantTestHelper
+{
+
+ public static void assertAtLeast(String message, final long minimumExpected, final long actual)
+ {
+ assertTrue(message + " " + actual, actual >= minimumExpected);
+ }
+
+ public static void assertExpectedConsumerResults(ParticipantResult result, String participantName, String registeredClientName, long expectedTestStartTime, int expectedAcknowledgeMode, Integer expectedBatchSize, Integer expectedNumberOfMessages, Integer expectedPayloadSize, Long expectedTotalPayloadProcessed, Long expectedMinimumExpectedDuration)
+ {
+ assertExpectedResults(result, participantName, registeredClientName, expectedTestStartTime,
+ expectedAcknowledgeMode, expectedBatchSize, expectedNumberOfMessages, expectedPayloadSize, expectedTotalPayloadProcessed, expectedMinimumExpectedDuration);
+ assertEquals("Unexpected number of consumers", 1, result.getTotalNumberOfConsumers());
+ assertEquals("Unexpected number of producers", 0, result.getTotalNumberOfProducers());
+ }
+
+ public static void assertExpectedProducerResults(ParticipantResult result, String participantName, String registeredClientName, long expectedTestStartTime, int expectedAcknowledgeMode, Integer expectedBatchSize, Integer expectedNumberOfMessages, Integer expectedPayloadSize, Long expectedTotalPayloadProcessed, Long expectedMinimumExpectedDuration)
+ {
+ assertExpectedResults(result, participantName, registeredClientName, expectedTestStartTime, expectedAcknowledgeMode, expectedBatchSize, expectedNumberOfMessages, expectedPayloadSize, expectedTotalPayloadProcessed, expectedMinimumExpectedDuration);
+ assertEquals("Unexpected number of producers", 1, result.getTotalNumberOfProducers());
+ assertEquals("Unexpected number of consumers", 0, result.getTotalNumberOfConsumers());
+ }
+
+ private static void assertExpectedResults(ParticipantResult result, String participantName, String registeredClientName, long expectedTestStartTime, int expectedAcknowledgeMode, Integer expectedBatchSize, Integer expectedNumberOfMessages, Integer expectedPayloadSize, Long expectedTotalPayloadProcessed, Long expectedMinimumExpectedDuration)
+ {
+ assertFalse(result.hasError());
+
+ assertEquals("unexpected participant name", participantName, result.getParticipantName());
+ assertEquals("unexpected client name", registeredClientName, result.getRegisteredClientName());
+
+ assertAtLeast("start time of result is too low", expectedTestStartTime, result.getStartInMillis());
+ assertAtLeast("end time of result should be after start time", result.getStartInMillis(), result.getEndInMillis());
+
+ assertEquals("unexpected acknowledge mode", expectedAcknowledgeMode, result.getAcknowledgeMode());
+
+ if(expectedNumberOfMessages != null)
+ {
+ assertEquals("unexpected number of messages", expectedNumberOfMessages.intValue(), result.getNumberOfMessagesProcessed());
+ }
+ if(expectedBatchSize != null)
+ {
+ assertEquals("unexpected batch size", expectedBatchSize.intValue(), result.getBatchSize());
+ }
+ if (expectedPayloadSize != null)
+ {
+ assertEquals("unexpected payload size", expectedPayloadSize.intValue(), result.getPayloadSize());
+ }
+ if (expectedTotalPayloadProcessed != null)
+ {
+ assertEquals("unexpected total payload processed", expectedTotalPayloadProcessed.longValue(), result.getTotalPayloadProcessed());
+ }
+ if(expectedMinimumExpectedDuration != null)
+ {
+ assertAtLeast("participant did not take a sufficient length of time.", expectedMinimumExpectedDuration, result.getTimeTaken());
+ }
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/ProducerParticipantTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ProducerParticipantTest.java
new file mode 100644
index 0000000000..cf05623e8f
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/ProducerParticipantTest.java
@@ -0,0 +1,219 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import static org.apache.qpid.disttest.client.ParticipantTestHelper.assertExpectedProducerResults;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import javax.jms.DeliveryMode;
+import javax.jms.Message;
+import javax.jms.Session;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.mockito.InOrder;
+
+public class ProducerParticipantTest extends TestCase
+{
+ private ProducerParticipant _producer;
+
+ private static final String SESSION_NAME1 = "SESSION1";
+ private static final String PARTICIPANT_NAME1 = "PARTICIPANT_NAME1";
+
+ private static final String CLIENT_NAME = "CLIENT_NAME";
+ private static final int PAYLOAD_SIZE_PER_MESSAGE = 1024;
+
+
+ private final Message _mockMessage = mock(Message.class);
+ private final CreateProducerCommand _command = new CreateProducerCommand();
+ private ClientJmsDelegate _delegate;
+ private InOrder _inOrder;
+
+ /** used to check start/end time of results */
+ private long _testStartTime;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _delegate = mock(ClientJmsDelegate.class);
+ _inOrder = inOrder(_delegate);
+
+ _command.setSessionName(SESSION_NAME1);
+ _command.setParticipantName(PARTICIPANT_NAME1);
+
+ when(_delegate.sendNextMessage(isA(CreateProducerCommand.class))).thenReturn(_mockMessage);
+ when(_delegate.calculatePayloadSizeFrom(_mockMessage)).thenReturn(PAYLOAD_SIZE_PER_MESSAGE);
+ when(_delegate.getAcknowledgeMode(SESSION_NAME1)).thenReturn(Session.AUTO_ACKNOWLEDGE);
+
+ _producer = new ProducerParticipant(_delegate, _command);
+
+ _testStartTime = System.currentTimeMillis();
+ }
+
+ public void testStartDelay() throws Exception
+ {
+ final long delay = 100;
+ int numberOfMessages = 1;
+ long totalPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * numberOfMessages;
+
+ _command.setStartDelay(delay);
+ _command.setNumberOfMessages(numberOfMessages);
+
+ ParticipantResult result = _producer.doIt(CLIENT_NAME);
+
+ long expectedPublishedStartTime = _testStartTime + delay;
+ assertExpectedProducerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, expectedPublishedStartTime, Session.AUTO_ACKNOWLEDGE, null, numberOfMessages, PAYLOAD_SIZE_PER_MESSAGE, totalPayloadSize, null);
+ }
+
+
+ public void testNoMessagesToSend() throws Exception
+ {
+ _command.setNumberOfMessages(0);
+ _command.setMaximumDuration(0);
+
+ try
+ {
+ _producer.doIt(CLIENT_NAME);
+ fail("Exception not thrown");
+ }
+ catch (DistributedTestException e)
+ {
+ // PASS
+ assertEquals("number of messages and duration cannot both be zero", e.getMessage());
+ }
+ }
+
+ public void testOneMessageToSend() throws Exception
+ {
+ int batchSize = 1;
+ int numberOfMessages = 1;
+ long totalPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * numberOfMessages;
+ int deliveryMode = DeliveryMode.PERSISTENT;
+
+ _command.setNumberOfMessages(numberOfMessages);
+ _command.setBatchSize(batchSize);
+ _command.setDeliveryMode(deliveryMode);
+
+ ParticipantResult result = (ParticipantResult) _producer.doIt(CLIENT_NAME);
+ assertExpectedProducerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.AUTO_ACKNOWLEDGE, null, numberOfMessages, PAYLOAD_SIZE_PER_MESSAGE, totalPayloadSize, null);
+
+ _inOrder.verify(_delegate).sendNextMessage(isA(CreateProducerCommand.class));
+ _inOrder.verify(_delegate).calculatePayloadSizeFrom(_mockMessage);
+ _inOrder.verify(_delegate).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+
+ }
+
+ public void testSendMessagesForDuration() throws Exception
+ {
+ final long duration = 100;
+ _command.setMaximumDuration(duration);
+
+ ParticipantResult result = _producer.doIt(CLIENT_NAME);
+ assertExpectedProducerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.AUTO_ACKNOWLEDGE, null, null, PAYLOAD_SIZE_PER_MESSAGE, null, duration);
+
+ verify(_delegate, atLeastOnce()).sendNextMessage(isA(CreateProducerCommand.class));
+ verify(_delegate, atLeastOnce()).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, atLeastOnce()).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testSendMessageBatches() throws Exception
+ {
+ final int batchSize = 3;
+ final int numberOfMessages = 10;
+ final int expectedNumberOfCommits = 4; // one for each batch of 3 messages, plus one more at the end of the test for the tenth msg.
+ long totalPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * numberOfMessages;
+
+ _command.setNumberOfMessages(numberOfMessages);
+ _command.setBatchSize(batchSize);
+
+ ParticipantResult result = _producer.doIt(CLIENT_NAME);
+ assertExpectedProducerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.AUTO_ACKNOWLEDGE, batchSize, numberOfMessages, PAYLOAD_SIZE_PER_MESSAGE, totalPayloadSize, null);
+
+ verify(_delegate, times(numberOfMessages)).sendNextMessage(isA(CreateProducerCommand.class));
+ verify(_delegate, times(numberOfMessages)).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, times(expectedNumberOfCommits)).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testSendMessageWithPublishInterval() throws Exception
+ {
+ final int batchSize = 3;
+ final long publishInterval = 100;
+ int numberOfMessages = 10;
+ long totalPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * numberOfMessages;
+
+ final long expectedTimeToRunTest = batchSize * publishInterval;
+
+ _command.setNumberOfMessages(numberOfMessages);
+ _command.setBatchSize(batchSize);
+ _command.setInterval(publishInterval);
+
+ ParticipantResult result = _producer.doIt(CLIENT_NAME);
+ assertExpectedProducerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.AUTO_ACKNOWLEDGE, null, numberOfMessages, null, totalPayloadSize, expectedTimeToRunTest);
+
+ verify(_delegate, times(numberOfMessages)).sendNextMessage(isA(CreateProducerCommand.class));
+ verify(_delegate, times(numberOfMessages)).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, times(4)).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testSendMessageWithVaryingPayloadSize() throws Exception
+ {
+ int numberOfMessages = 3;
+
+ int firstPayloadSize = PAYLOAD_SIZE_PER_MESSAGE;
+ int secondPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * 2;
+ int thirdPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * 4;
+
+ final long totalPayloadSize = firstPayloadSize + secondPayloadSize + thirdPayloadSize;
+
+ when(_delegate.calculatePayloadSizeFrom(_mockMessage)).thenReturn(firstPayloadSize, secondPayloadSize, thirdPayloadSize);
+
+ _command.setNumberOfMessages(numberOfMessages);
+
+ ParticipantResult result = _producer.doIt(CLIENT_NAME);
+
+ final int expectedPayloadResultPayloadSize = 0;
+ assertExpectedProducerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.AUTO_ACKNOWLEDGE, null, numberOfMessages, expectedPayloadResultPayloadSize, totalPayloadSize, null);
+
+ verify(_delegate, times(numberOfMessages)).sendNextMessage(isA(CreateProducerCommand.class));
+ verify(_delegate, times(numberOfMessages)).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, times(numberOfMessages)).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testReleaseResources()
+ {
+ _producer.releaseResources();
+ verify(_delegate).closeTestProducer(PARTICIPANT_NAME1);
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/ListPropertyValueTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/ListPropertyValueTest.java
new file mode 100644
index 0000000000..75a634ba54
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/ListPropertyValueTest.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.client.property.ListPropertyValue;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.client.property.SimplePropertyValue;
+
+public class ListPropertyValueTest extends TestCase
+{
+ private ListPropertyValue _generator;
+ private List<PropertyValue> _items;
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _generator = new ListPropertyValue();
+ _items = new ArrayList<PropertyValue>();
+ _items.add(new SimplePropertyValue(new Integer(1)));
+ _items.add(new SimplePropertyValue(new Double(2.1)));
+ _items.add(new SimplePropertyValue(new Boolean(true)));
+ ListPropertyValue innerList = new ListPropertyValue();
+ List<PropertyValue> innerListItems = new ArrayList<PropertyValue>();
+ innerListItems.add(new SimplePropertyValue("test"));
+ innerListItems.add(new SimplePropertyValue(new Integer(2)));
+ innerList.setItems(innerListItems);
+ _items.add(innerList);
+ _generator.setItems(_items);
+ }
+
+ public void testGetItems()
+ {
+ List<? extends Object> items = _generator.getItems();
+ assertEquals("Unexpected list items", _items, items);
+ }
+
+ public void testGetValue()
+ {
+ for (int i = 0; i < 2; i++)
+ {
+ assertEquals("Unexpected first item", new Integer(1), _generator.getValue());
+ assertEquals("Unexpected second item", new Double(2.1), _generator.getValue());
+ assertEquals("Unexpected third item", new Boolean(true), _generator.getValue());
+ if (i == 0)
+ {
+ assertEquals("Unexpected forth item", "test", _generator.getValue());
+ }
+ else
+ {
+ assertEquals("Unexpected forth item", new Integer(2), _generator.getValue());
+ }
+ }
+ }
+
+ public void testNonCyclicGetValue()
+ {
+ _generator.setCyclic(false);
+ assertFalse("Generator should not be cyclic", _generator.isCyclic());
+ assertEquals("Unexpected first item", new Integer(1), _generator.getValue());
+ assertEquals("Unexpected second item", new Double(2.1), _generator.getValue());
+ assertEquals("Unexpected third item", new Boolean(true), _generator.getValue());
+ assertEquals("Unexpected forth item", "test", _generator.getValue());
+ assertEquals("Unexpected fifth item", new Integer(2), _generator.getValue());
+ assertEquals("Unexpected sixs item", "test", _generator.getValue());
+ assertEquals("Unexpected sevens item", new Integer(2), _generator.getValue());
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/PropertyValueFactoryTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/PropertyValueFactoryTest.java
new file mode 100644
index 0000000000..2d560163c2
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/PropertyValueFactoryTest.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import junit.framework.TestCase;
+
+public class PropertyValueFactoryTest extends TestCase
+{
+ private PropertyValueFactory _factory;
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _factory = new PropertyValueFactory();
+ }
+
+ public void testCreateListPropertyValue()
+ {
+ PropertyValue propertyValue = _factory.createPropertyValue("list");
+ assertNotNull("List generator is not created", propertyValue);
+ assertTrue("Unexpected type of list generator", propertyValue instanceof ListPropertyValue);
+ }
+
+ public void testCreateRangePropertyValue()
+ {
+ PropertyValue propertyValue = _factory.createPropertyValue("range");
+ assertNotNull("Range generator is not created", propertyValue);
+ assertTrue("Unexpected type of range generator", propertyValue instanceof RangePropertyValue);
+ }
+
+ public void testCreateRandomPropertyValue()
+ {
+ PropertyValue propertyValue = _factory.createPropertyValue("random");
+ assertNotNull("Random generator is not created", propertyValue);
+ assertTrue("Unexpected type of range generator", propertyValue instanceof RandomPropertyValue);
+ }
+
+ public void testCreateSimplePropertyValue()
+ {
+ PropertyValue propertyValue = _factory.createPropertyValue("simple");
+ assertNotNull("Simple property value is not created", propertyValue);
+ assertTrue("Unexpected type of property value", propertyValue instanceof SimplePropertyValue);
+ }
+
+ public void testCreateNonExistingPropertyValue()
+ {
+ try
+ {
+ _factory.createPropertyValue("nonExisting");
+ fail("Non existing property value should not be created");
+ }
+ catch (Exception e)
+ {
+ // pass
+ }
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RandomPropertyValueTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RandomPropertyValueTest.java
new file mode 100644
index 0000000000..bd5de3e370
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RandomPropertyValueTest.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import org.apache.qpid.disttest.client.property.RandomPropertyValue;
+
+import junit.framework.TestCase;
+
+public class RandomPropertyValueTest extends TestCase
+{
+ private RandomPropertyValue _generator;
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _generator = new RandomPropertyValue();
+ _generator.setUpper(20.0);
+ _generator.setLower(10.0);
+ _generator.setType("double");
+ }
+
+ public void testGetters()
+ {
+ assertEquals("Unexpected upper boundary", new Double(20.0), _generator.getUpper());
+ assertEquals("Unexpected lower boundary", new Double(10.0), _generator.getLower());
+ assertEquals("Unexpected type", "double", _generator.getType());
+ }
+
+ public void testGetValue()
+ {
+ Object value = _generator.getValue();
+ assertTrue("Unexpected type", value instanceof Double);
+ assertTrue("Unexpected value", ((Double) value).doubleValue() >= 10.0
+ && ((Double) value).doubleValue() <= 20.0);
+ }
+
+ public void testGetValueInt()
+ {
+ _generator.setType("int");
+ Object value = _generator.getValue();
+ assertTrue("Unexpected type", value instanceof Integer);
+ assertTrue("Unexpected value", ((Integer) value).intValue() >= 10 && ((Integer) value).intValue() <= 20);
+ }
+
+ public void testGetValueLong()
+ {
+ _generator.setType("long");
+ Object value = _generator.getValue();
+ assertTrue("Unexpected type", value instanceof Long);
+ assertTrue("Unexpected value", ((Long) value).longValue() >= 10 && ((Long) value).longValue() <= 20);
+ }
+
+ public void testGetValueFloat()
+ {
+ _generator.setType("float");
+ Object value = _generator.getValue();
+ assertTrue("Unexpected type", value instanceof Float);
+ assertTrue("Unexpected value", ((Float) value).floatValue() >= 10.0 && ((Float) value).floatValue() <= 20.0);
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RangePropertyValueTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RangePropertyValueTest.java
new file mode 100644
index 0000000000..91791c9d55
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RangePropertyValueTest.java
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import org.apache.qpid.disttest.client.property.RangePropertyValue;
+
+import junit.framework.TestCase;
+
+public class RangePropertyValueTest extends TestCase
+{
+ private RangePropertyValue _generator;
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _generator = new RangePropertyValue();
+ _generator.setUpper(10.0);
+ _generator.setLower(0.0);
+ _generator.setStep(2.0);
+ _generator.setType("double");
+ }
+
+ public void testGetters()
+ {
+ assertEquals("Unexpected upper boundary", new Double(10.0), _generator.getUpper());
+ assertEquals("Unexpected lower boundary", new Double(0.0), _generator.getLower());
+ assertEquals("Unexpected step", new Double(2.0), _generator.getStep());
+ assertEquals("Unexpected type", "double", _generator.getType());
+ assertTrue("Unexpected cyclic", _generator.isCyclic());
+ }
+
+ public void testGetValue()
+ {
+ double[] expected = { 0.0, 2.0, 4.0, 6.0, 8.0, 10.0 };
+ for (int j = 0; j < 2; j++)
+ {
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Double);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ }
+ }
+
+ public void testGetValueNonCyclic()
+ {
+ _generator.setCyclic(false);
+ double[] expected = { 0.0, 2.0, 4.0, 6.0, 8.0, 10.0 };
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Double);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertEquals("Unexpected value ", expected[expected.length - 1], value);
+ }
+ }
+
+ public void testGetValueInt()
+ {
+ _generator.setType("int");
+ int[] expected = { 0, 2, 4, 6, 8, 10 };
+ for (int j = 0; j < 2; j++)
+ {
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Integer);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ }
+ }
+
+ public void testGetValueByte()
+ {
+ _generator.setType("byte");
+ byte[] expected = { 0, 2, 4, 6, 8, 10 };
+ for (int j = 0; j < 2; j++)
+ {
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Byte);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ }
+ }
+
+ public void testGetValueLong()
+ {
+ _generator.setType("long");
+ long[] expected = { 0, 2, 4, 6, 8, 10 };
+ for (int j = 0; j < 2; j++)
+ {
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Long);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ }
+ }
+
+ public void testGetValueShort()
+ {
+ _generator.setType("short");
+ short[] expected = { 0, 2, 4, 6, 8, 10 };
+ for (int j = 0; j < 2; j++)
+ {
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Short);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ }
+ }
+
+ public void testGetValueFloat()
+ {
+ _generator.setType("float");
+ float[] expected = { 0.0f, 2.0f, 4.0f, 6.0f, 8.0f, 10.0f };
+ for (int j = 0; j < 2; j++)
+ {
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Float);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ }
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/SimplePropertyValueTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/SimplePropertyValueTest.java
new file mode 100644
index 0000000000..a347d866c7
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/SimplePropertyValueTest.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import junit.framework.TestCase;
+
+public class SimplePropertyValueTest extends TestCase
+{
+ public void testGetValue()
+ {
+ SimplePropertyValue value = new SimplePropertyValue(new Integer(1));
+ assertEquals("Unexpected value", new Integer(1), value.getValue());
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ClientRegistryTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ClientRegistryTest.java
new file mode 100644
index 0000000000..cc969e1ef2
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ClientRegistryTest.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.DistributedTestException;
+
+public class ClientRegistryTest extends TestCase
+{
+ private static final String CLIENT1_REGISTERED_NAME = "CLIENT1_REGISTERED_NAME";
+ private static final String CLIENT2_REGISTERED_NAME = "CLIENT2_REGISTERED_NAME";
+ private static final int AWAIT_DELAY = 100;
+
+ private ClientRegistry _clientRegistry = new ClientRegistry();
+
+ public void testRegisterClient()
+ {
+ assertEquals(0, _clientRegistry.getClients().size());
+
+ _clientRegistry.registerClient(CLIENT1_REGISTERED_NAME);
+ assertEquals(1, _clientRegistry.getClients().size());
+
+ }
+
+ public void testRejectsDuplicateClientNames()
+ {
+ _clientRegistry.registerClient(CLIENT1_REGISTERED_NAME);
+ try
+ {
+ _clientRegistry.registerClient(CLIENT1_REGISTERED_NAME);
+ fail("Should have thrown an exception");
+ }
+ catch (final DistributedTestException e)
+ {
+ // pass
+ }
+ }
+
+ public void testAwaitOneClientWhenClientNotRegistered()
+ {
+ int numberOfClientsAbsent = _clientRegistry.awaitClients(1, AWAIT_DELAY);
+ assertEquals(1, numberOfClientsAbsent);
+ }
+
+ public void testAwaitOneClientWhenClientAlreadyRegistered()
+ {
+ _clientRegistry.registerClient(CLIENT1_REGISTERED_NAME);
+
+ int numberOfClientsAbsent = _clientRegistry.awaitClients(1, AWAIT_DELAY);
+ assertEquals(0, numberOfClientsAbsent);
+ }
+
+ public void testAwaitTwoClientWhenClientRegistersWhilstWaiting()
+ {
+ _clientRegistry.registerClient(CLIENT1_REGISTERED_NAME);
+ registerClientLater(CLIENT2_REGISTERED_NAME, 50);
+
+ int numberOfClientsAbsent = _clientRegistry.awaitClients(2, AWAIT_DELAY);
+ assertEquals(0, numberOfClientsAbsent);
+ }
+
+ private void registerClientLater(final String clientName, long delayInMillis)
+ {
+ doLater(new TimerTask()
+ {
+ @Override
+ public void run()
+ {
+ _clientRegistry.registerClient(clientName);
+ }
+ }, delayInMillis);
+ }
+
+ private void doLater(TimerTask task, long delayInMillis)
+ {
+ Timer timer = new Timer();
+ timer.schedule(task, delayInMillis);
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ControllerTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ControllerTest.java
new file mode 100644
index 0000000000..bc58ea41c5
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ControllerTest.java
@@ -0,0 +1,198 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.config.Config;
+import org.apache.qpid.disttest.controller.config.TestInstance;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.apache.qpid.disttest.results.aggregation.ITestResult;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+public class ControllerTest extends TestCase
+{
+ private static final String CLIENT1_REGISTERED_NAME = "client-uid1";
+
+ private static final long COMMAND_RESPONSE_TIMEOUT = 1000;
+ private static final long REGISTRATION_TIMEOUT = 1000;
+
+ private Controller _controller;
+ private ControllerJmsDelegate _respondingJmsDelegate;
+ private TestRunner _testRunner;
+ private ClientRegistry _clientRegistry;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _respondingJmsDelegate = mock(ControllerJmsDelegate.class);
+ _controller = new Controller(_respondingJmsDelegate, REGISTRATION_TIMEOUT, COMMAND_RESPONSE_TIMEOUT);
+ _testRunner = mock(TestRunner.class);
+ _clientRegistry = mock(ClientRegistry.class);
+
+ Config configWithOneClient = createMockConfig(1);
+ _controller.setConfig(configWithOneClient);
+ _controller.setClientRegistry(_clientRegistry);
+ _controller.setTestRunnerFactory(createTestFactoryReturningMock());
+
+ doAnswer(new Answer<Void>()
+ {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable
+ {
+ final String clientName = (String)invocation.getArguments()[0];
+ final Command command = (Command)invocation.getArguments()[1];
+ _controller.processStopClientResponse(new Response(clientName, command.getType()));
+ return null;
+ }
+ }).when(_respondingJmsDelegate).sendCommandToClient(anyString(), isA(Command.class));
+ }
+
+
+ public void testControllerRejectsEmptyConfiguration()
+ {
+ Config configWithZeroClients = createMockConfig(0);
+
+ try
+ {
+ _controller.setConfig(configWithZeroClients);
+ fail("Exception not thrown");
+ }
+ catch (DistributedTestException e)
+ {
+ // PASS
+ }
+ }
+
+ public void testControllerReceivesTwoExpectedClientRegistrations()
+ {
+ Config configWithTwoClients = createMockConfig(2);
+ _controller.setConfig(configWithTwoClients);
+ when(_clientRegistry.awaitClients(2, REGISTRATION_TIMEOUT)).thenReturn(0);
+
+ _controller.awaitClientRegistrations();
+ }
+
+ public void testControllerDoesntReceiveAnyRegistrations()
+ {
+ when(_clientRegistry.awaitClients(1, REGISTRATION_TIMEOUT)).thenReturn(1);
+
+ try
+ {
+ _controller.awaitClientRegistrations();
+ fail("Exception not thrown");
+ }
+ catch (DistributedTestException e)
+ {
+ // PASS
+ }
+ }
+
+ public void testRegisterClient()
+ {
+ RegisterClientCommand command = new RegisterClientCommand(CLIENT1_REGISTERED_NAME, "dummy");
+ _controller.registerClient(command);
+
+ verify(_clientRegistry).registerClient(CLIENT1_REGISTERED_NAME);
+ verify(_respondingJmsDelegate).registerClient(command);
+
+ }
+
+ public void testControllerSendsClientStopCommandToClient()
+ {
+ when(_clientRegistry.getClients()).thenReturn(Collections.singleton(CLIENT1_REGISTERED_NAME));
+
+ _controller.stopAllRegisteredClients();
+
+ verify(_respondingJmsDelegate).sendCommandToClient(eq(CLIENT1_REGISTERED_NAME), isA(StopClientCommand.class));
+ }
+
+ public void testRunAllTests()
+ {
+ Config config = createSimpleConfig();
+ _controller.setConfig(config);
+
+ TestResult testResult = new TestResult("test1");
+
+ when(_testRunner.run()).thenReturn(testResult);
+
+ ResultsForAllTests results = _controller.runAllTests();
+
+ List<ITestResult> testResults = results.getTestResults();
+ assertEquals(1, testResults.size());
+ assertSame(testResult, testResults.get(0));
+
+ verify(_testRunner).run();
+ }
+
+ private Config createSimpleConfig()
+ {
+ Config config = mock(Config.class);
+ TestInstance testInstance = mock(TestInstance.class);
+
+ List<TestInstance> testInstances = Arrays.asList(testInstance);
+
+ when(config.getTests()).thenReturn(testInstances);
+ when(config.getTotalNumberOfClients()).thenReturn(1); // necessary otherwise controller rejects "invalid" config
+
+ return config;
+ }
+
+ private Config createMockConfig(int numberOfClients)
+ {
+ Config config = mock(Config.class);
+ when(config.getTotalNumberOfClients()).thenReturn(numberOfClients);
+ return config;
+ }
+
+ private TestRunnerFactory createTestFactoryReturningMock()
+ {
+ TestRunnerFactory testRunnerFactory = mock(TestRunnerFactory.class);
+
+ when(testRunnerFactory.createTestRunner(
+ isA(ParticipatingClients.class),
+ isA(TestInstance.class),
+ isA(ControllerJmsDelegate.class),
+ isA(Long.class),
+ isA(Long.class)))
+ .thenReturn(_testRunner);
+
+ return testRunnerFactory;
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ParticipatingClientsTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ParticipatingClientsTest.java
new file mode 100644
index 0000000000..284db38f44
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ParticipatingClientsTest.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+public class ParticipatingClientsTest extends TestCase
+{
+ private static final String CLIENT1_CONFIGURED_NAME = "CLIENT1_CONFIGURED_NAME";
+ private static final String CLIENT2_CONFIGURED_NAME = "CLIENT2_CONFIGURED_NAME";
+
+ private static final String CLIENT1_REGISTERED_NAME = "CLIENT1_REGISTERED_NAME";
+ private static final String CLIENT2_REGISTERED_NAME = "CLIENT2_REGISTERED_NAME";
+ private static final String CLIENT3_REGISTERED_NAME = "CLIENT3_REGISTERED_NAME";
+ private ClientRegistry _clientRegistry;
+ private List<String> _configuredClientNamesForTest;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _clientRegistry = mock(ClientRegistry.class);
+ }
+
+ public void testTooFewRegisteredClientsForTest()
+ {
+ _configuredClientNamesForTest = Arrays.asList(CLIENT1_CONFIGURED_NAME, CLIENT2_CONFIGURED_NAME);
+ when(_clientRegistry.getClients()).thenReturn(Arrays.asList(CLIENT1_REGISTERED_NAME));
+
+ try
+ {
+ new ParticipatingClients(_clientRegistry, _configuredClientNamesForTest);
+ fail("Exception not thrown");
+ }
+ catch (IllegalArgumentException e)
+ {
+ // PASS
+ }
+
+ }
+
+
+ public void testSelectOneClientFromPoolOfOne()
+ {
+ _configuredClientNamesForTest = Arrays.asList(CLIENT1_CONFIGURED_NAME);
+ when(_clientRegistry.getClients()).thenReturn(Arrays.asList(CLIENT1_REGISTERED_NAME));
+
+ ParticipatingClients clients = new ParticipatingClients(_clientRegistry, _configuredClientNamesForTest);
+ assertBothWays(clients, CLIENT1_REGISTERED_NAME, CLIENT1_CONFIGURED_NAME);
+ }
+
+ public void testSelectTwoClientFromPoolOfMany()
+ {
+ _configuredClientNamesForTest = Arrays.asList(CLIENT1_CONFIGURED_NAME, CLIENT2_CONFIGURED_NAME);
+ when(_clientRegistry.getClients()).thenReturn(Arrays.asList(CLIENT1_REGISTERED_NAME, CLIENT2_REGISTERED_NAME, CLIENT3_REGISTERED_NAME));
+
+ ParticipatingClients clients = new ParticipatingClients(_clientRegistry, _configuredClientNamesForTest);
+
+ assertBothWays(clients, CLIENT1_REGISTERED_NAME, CLIENT1_CONFIGURED_NAME);
+ assertBothWays(clients, CLIENT2_REGISTERED_NAME, CLIENT2_CONFIGURED_NAME);
+ }
+
+ public void testGetUnrecognisedConfiguredName()
+ {
+ _configuredClientNamesForTest = Arrays.asList(CLIENT1_CONFIGURED_NAME);
+ when(_clientRegistry.getClients()).thenReturn(Arrays.asList(CLIENT1_REGISTERED_NAME));
+
+ ParticipatingClients clients = new ParticipatingClients(_clientRegistry, _configuredClientNamesForTest);
+
+ testUnrecognisedClientConfiguredName(clients, "unknown");
+ testUnrecognisedClientRegisteredName(clients, "unknown");
+ }
+
+ public void testGetRegisteredClientNames()
+ {
+ _configuredClientNamesForTest = Arrays.asList(CLIENT1_CONFIGURED_NAME);
+ List<String> registeredNames = Arrays.asList(CLIENT1_REGISTERED_NAME);
+ when(_clientRegistry.getClients()).thenReturn(registeredNames);
+
+ ParticipatingClients clients = new ParticipatingClients(_clientRegistry, _configuredClientNamesForTest);
+
+ Collection<String> registeredParticipatingNames = clients.getRegisteredNames();
+ assertEquals(1, registeredParticipatingNames.size());
+ assertTrue(registeredParticipatingNames.contains(CLIENT1_REGISTERED_NAME));
+ }
+
+ private void testUnrecognisedClientConfiguredName(ParticipatingClients clients, String unrecognisedClientConfiguredName)
+ {
+ try
+ {
+ clients.getRegisteredNameFromConfiguredName(unrecognisedClientConfiguredName);
+ fail("Exception not thrown");
+ }
+ catch (IllegalArgumentException e)
+ {
+ // PASS
+ }
+ }
+
+ private void testUnrecognisedClientRegisteredName(ParticipatingClients clients, String unrecognisedClientRegisteredName)
+ {
+ try
+ {
+ clients.getConfiguredNameFromRegisteredName(unrecognisedClientRegisteredName);
+ fail("Exception not thrown");
+ }
+ catch (IllegalArgumentException e)
+ {
+ // PASS
+ }
+ }
+
+ private void assertBothWays(ParticipatingClients clients, String registeredName, String configuredName)
+ {
+ assertEquals(registeredName, clients.getRegisteredNameFromConfiguredName(configuredName));
+ assertEquals(configuredName, clients.getConfiguredNameFromRegisteredName(registeredName));
+ }
+
+
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/TestRunnerTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/TestRunnerTest.java
new file mode 100644
index 0000000000..983da299b9
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/TestRunnerTest.java
@@ -0,0 +1,253 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.config.QueueConfig;
+import org.apache.qpid.disttest.controller.config.TestInstance;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StartTestCommand;
+import org.apache.qpid.disttest.message.TearDownTestCommand;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+public class TestRunnerTest extends TestCase
+{
+ private static final String TEST_NAME = "TEST_NAME";
+ private static final String PARTICIPANT_NAME = "TEST_PARTICIPANT_NAME";
+ private static final int ITERATION_NUMBER = 1;
+
+ private static final String CLIENT1_REGISTERED_NAME = "client-uid1";
+ private static final String CLIENT1_CONFIGURED_NAME = "client1";
+
+ private static final long COMMAND_RESPONSE_TIMEOUT = 1000;
+ private static final long TEST_RESULT_TIMEOUT = 2000;
+ private static final long DELAY = 100;
+
+ private TestRunner _testRunner;
+ private TestInstance _testInstance;
+ private ControllerJmsDelegate _respondingJmsDelegate;
+ private ParticipatingClients _participatingClients;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _respondingJmsDelegate = mock(ControllerJmsDelegate.class);
+
+ _participatingClients = mock(ParticipatingClients.class);
+ when(_participatingClients.getRegisteredNameFromConfiguredName(CLIENT1_CONFIGURED_NAME)).thenReturn(CLIENT1_REGISTERED_NAME);
+ when(_participatingClients.getConfiguredNameFromRegisteredName(CLIENT1_REGISTERED_NAME)).thenReturn(CLIENT1_CONFIGURED_NAME);
+ when(_participatingClients.getRegisteredNames()).thenReturn(Collections.singleton(CLIENT1_REGISTERED_NAME));
+
+ doAnswer(new Answer<Void>()
+ {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable
+ {
+ final String clientName = (String)invocation.getArguments()[0];
+ final Command command = (Command)invocation.getArguments()[1];
+ _testRunner.processCommandResponse(new Response(clientName, command.getType()));
+ return null;
+ }
+ }).when(_respondingJmsDelegate).sendCommandToClient(anyString(), isA(Command.class));
+ }
+
+ public void testSendConnectionCommandToClient()
+ {
+ _testInstance = createTestInstanceWithConnection();
+
+ _testRunner = new TestRunner(_participatingClients, _testInstance , _respondingJmsDelegate, COMMAND_RESPONSE_TIMEOUT, TEST_RESULT_TIMEOUT);
+ _testRunner.sendTestSetupCommands();
+
+ verify(_respondingJmsDelegate).sendCommandToClient(eq(CLIENT1_REGISTERED_NAME), isA(CreateConnectionCommand.class));
+ }
+
+ public void testSendCommandToAllParticipatingClients()
+ {
+ _testRunner = new TestRunner(_participatingClients, mock(TestInstance.class), _respondingJmsDelegate, COMMAND_RESPONSE_TIMEOUT, TEST_RESULT_TIMEOUT);
+
+ StartTestCommand startTestCommand = new StartTestCommand();
+ _testRunner.sendCommandToParticipatingClients(startTestCommand);
+
+ verify(_respondingJmsDelegate).sendCommandToClient(CLIENT1_REGISTERED_NAME, startTestCommand);
+ }
+
+ public void testWaitsForCommandResponses()
+ {
+ _testInstance = createTestInstanceWithConnection();
+ _testRunner = new TestRunner(_participatingClients, _testInstance , _respondingJmsDelegate, COMMAND_RESPONSE_TIMEOUT, TEST_RESULT_TIMEOUT);
+
+ _testRunner.sendTestSetupCommands();
+
+ _testRunner.awaitCommandResponses();
+ }
+
+ public void testClientFailsToSendCommandResponseWithinTimeout()
+ {
+ ControllerJmsDelegate jmsDelegate = mock(ControllerJmsDelegate.class);
+
+ _testInstance = createTestInstanceWithConnection();
+ _testRunner = new TestRunner(_participatingClients, _testInstance , jmsDelegate, COMMAND_RESPONSE_TIMEOUT, TEST_RESULT_TIMEOUT);
+
+ _testRunner.sendTestSetupCommands();
+ // we don't call sendCommandResponseLater so controller should time out
+
+ try
+ {
+ _testRunner.awaitCommandResponses();
+ fail("Exception not thrown");
+ }
+ catch (DistributedTestException e)
+ {
+ // PASS
+ }
+ }
+
+ public void testCreateAndDeleteQueues()
+ {
+ _testInstance = mock(TestInstance.class);
+ List<QueueConfig> queues = mock(List.class);
+ when(_testInstance.getQueues()).thenReturn(queues);
+
+ _testRunner = new TestRunner(_participatingClients, _testInstance, _respondingJmsDelegate, COMMAND_RESPONSE_TIMEOUT, TEST_RESULT_TIMEOUT);
+
+ _testRunner.createQueues();
+ verify(_respondingJmsDelegate).createQueues(queues);
+
+ _testRunner.deleteQueues();
+ verify(_respondingJmsDelegate).deleteQueues(queues);
+ }
+
+ public void testRun()
+ {
+ _testInstance = createTestInstanceWithOneParticipant();
+ _testRunner = new TestRunner(_participatingClients, _testInstance , _respondingJmsDelegate, COMMAND_RESPONSE_TIMEOUT, TEST_RESULT_TIMEOUT);
+
+ ParticipantResult incomingParticipantResult = new ParticipantResult(PARTICIPANT_NAME);
+ incomingParticipantResult.setRegisteredClientName(CLIENT1_REGISTERED_NAME);
+ sendTestResultsLater(_testRunner, incomingParticipantResult);
+
+ TestResult results = _testRunner.run();
+
+ verify(_respondingJmsDelegate).addCommandListener(isA(TestRunner.TestCommandResponseListener.class));
+ verify(_respondingJmsDelegate).addCommandListener(isA(TestRunner.ParticipantResultListener.class));
+
+ verify(_respondingJmsDelegate).createQueues(isA(List.class));
+
+ verify(_respondingJmsDelegate).sendCommandToClient(eq(CLIENT1_REGISTERED_NAME), isA(StartTestCommand.class));
+ verify(_respondingJmsDelegate).sendCommandToClient(eq(CLIENT1_REGISTERED_NAME), isA(NoOpCommand.class));
+ verify(_respondingJmsDelegate).sendCommandToClient(eq(CLIENT1_REGISTERED_NAME), isA(TearDownTestCommand.class));
+
+ verify(_respondingJmsDelegate).deleteQueues(isA(List.class));
+
+ verify(_respondingJmsDelegate).removeCommandListener(isA(TestRunner.ParticipantResultListener.class));
+ verify(_respondingJmsDelegate).removeCommandListener(isA(TestRunner.TestCommandResponseListener.class));
+
+ List<ParticipantResult> participantResults = results.getParticipantResults();
+ assertEquals(1, participantResults.size());
+ ParticipantResult resultingParticipantResult = participantResults.get(0);
+
+ assertResultHasCorrectTestDetails(resultingParticipantResult);
+ }
+
+ private void assertResultHasCorrectTestDetails(ParticipantResult resultingParticipantResult)
+ {
+ assertEquals("Test runner should have set configured name when it received participant results",
+ CLIENT1_CONFIGURED_NAME, resultingParticipantResult.getConfiguredClientName());
+ assertEquals("Test runner should have set test name when it received participant results",
+ TEST_NAME, resultingParticipantResult.getTestName());
+ assertEquals("Test runner should have set test iteration number when it received participant results",
+ ITERATION_NUMBER, resultingParticipantResult.getIterationNumber());
+ }
+
+
+ private TestInstance createTestInstanceWithOneParticipant()
+ {
+ TestInstance testInstance = mock(TestInstance.class);
+
+ List<CommandForClient> commands = Arrays.asList(
+ new CommandForClient(CLIENT1_CONFIGURED_NAME, new NoOpCommand()));
+
+ when(testInstance.createCommands()).thenReturn(commands);
+
+ when(testInstance.getTotalNumberOfParticipants()).thenReturn(1);
+
+ when(testInstance.getName()).thenReturn(TEST_NAME);
+
+ List<QueueConfig> queues = mock(List.class);
+ when(testInstance.getQueues()).thenReturn(queues);
+
+ when(testInstance.getIterationNumber()).thenReturn(ITERATION_NUMBER);
+
+ return testInstance;
+ }
+
+ private TestInstance createTestInstanceWithConnection()
+ {
+ TestInstance testInstance = mock(TestInstance.class);
+
+ List<CommandForClient> commands = Arrays.asList(
+ new CommandForClient(CLIENT1_CONFIGURED_NAME, new CreateConnectionCommand("conn1", "factory")));
+
+ when(testInstance.createCommands()).thenReturn(commands);
+
+ return testInstance;
+ }
+
+ private void sendTestResultsLater(final TestRunner runner, final ParticipantResult result)
+ {
+ doLater(new TimerTask()
+ {
+ @Override
+ public void run()
+ {
+ runner.processParticipantResult(result);
+ }
+ }, DELAY);
+ }
+
+ private void doLater(TimerTask task, long delayInMillis)
+ {
+ Timer timer = new Timer();
+ timer.schedule(task, delayInMillis);
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ClientConfigTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ClientConfigTest.java
new file mode 100644
index 0000000000..d4af439dea
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ClientConfigTest.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.apache.qpid.disttest.controller.config.ConfigTestUtils.assertCommandForClient;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.client.property.SimplePropertyValue;
+import org.apache.qpid.disttest.controller.CommandForClient;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+
+public class ClientConfigTest extends TestCase
+{
+ private static final String CLIENT1 = "client1";
+
+ public void testClientConfigHasZeroArgConstructorForGson()
+ {
+ ClientConfig c = new ClientConfig();
+ assertNotNull(c);
+ }
+
+ public void testCreateCommands()
+ {
+ ClientConfig clientConfig = createClientConfigWithConnectionConfigReturningChildCommands();
+
+ List<CommandForClient> commands = clientConfig.createCommands();
+ assertEquals(2, commands.size());
+
+ assertCommandForClient(commands, 0, CLIENT1, NoOpCommand.class);
+ assertCommandForClient(commands, 1, CLIENT1, NoOpCommand.class);
+ }
+
+ public void testCreateCommandsForMessageProvider()
+ {
+ ClientConfig clientConfig = createClientConfigWithMessageProviderConfigReturningCommands();
+
+ List<CommandForClient> commands = clientConfig.createCommands();
+ assertEquals(1, commands.size());
+
+ assertCommandForClient(commands, 0, CLIENT1, CreateMessageProviderCommand.class);
+ }
+
+ public void testGetTotalNumberOfParticipants()
+ {
+ ClientConfig clientConfig = createClientConfigWithTwoParticipants();
+ assertEquals(2, clientConfig.getTotalNumberOfParticipants());
+ }
+
+ private ClientConfig createClientConfigWithConnectionConfigReturningChildCommands()
+ {
+ ConnectionConfig connectionConfig = mock(ConnectionConfig.class);
+
+ List<Command> commands = Arrays.asList((Command)new NoOpCommand(), (Command)new NoOpCommand());
+ when(connectionConfig.createCommands()).thenReturn(commands);
+
+ return new ClientConfig(CLIENT1, connectionConfig);
+ }
+
+ private ClientConfig createClientConfigWithMessageProviderConfigReturningCommands()
+ {
+ Map<String, PropertyValue> messageProperties = new HashMap<String, PropertyValue>();
+ messageProperties.put("test", new SimplePropertyValue("testValue"));
+ MessageProviderConfig config = new MessageProviderConfig("test", messageProperties);
+
+ List<MessageProviderConfig> providerConfigs = new ArrayList<MessageProviderConfig>();
+ providerConfigs.add(config);
+
+ return new ClientConfig(CLIENT1, new ArrayList<ConnectionConfig>(), providerConfigs);
+ }
+
+ private ClientConfig createClientConfigWithTwoParticipants()
+ {
+ ConnectionConfig connectionConfig1 = mock(ConnectionConfig.class);
+ ConnectionConfig connectionConfig2 = mock(ConnectionConfig.class);
+
+ when(connectionConfig1.getTotalNumberOfParticipants()).thenReturn(1);
+ when(connectionConfig2.getTotalNumberOfParticipants()).thenReturn(1);
+
+ ClientConfig clientConfig = new ClientConfig(CLIENT1, connectionConfig1, connectionConfig2);
+ return clientConfig;
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigReaderTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigReaderTest.java
new file mode 100644
index 0000000000..af9ec28db0
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigReaderTest.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.io.Reader;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.ConfigFileHelper;
+import org.apache.qpid.disttest.client.MessageProvider;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.controller.CommandForClient;
+
+public class ConfigReaderTest extends TestCase
+{
+ private Config _config;
+
+ @Override
+ protected void setUp()
+ {
+ ConfigReader configReader = new ConfigReader();
+ Reader reader = ConfigFileHelper.getConfigFileReader(getClass(), "sampleConfig.json");
+ _config = configReader.readConfig(reader);
+ }
+
+ public void testReadTest()
+ {
+ List<TestConfig> tests = _config.getTestConfigs();
+ assertEquals("Unexpected number of tests", 2, tests.size());
+ TestConfig test1Config = tests.get(0);
+ assertNotNull("Test 1 configuration is expected", test1Config);
+ assertEquals("Unexpected test name", "Test 1", test1Config.getName());
+
+ TestConfig test2Config = tests.get(1);
+ assertNotNull("Test 2 configuration is expected", test2Config);
+ }
+
+ public void testReadsTestWithQueues()
+ {
+ TestConfig test1Config = _config.getTestConfigs().get(0);
+ List<QueueConfig> queues = test1Config.getQueues();
+ assertEquals("Unexpected number of queues", 2, queues.size());
+ QueueConfig queue1Config = queues.get(0);
+ assertNotNull("Expected queue 1 config", queue1Config);
+ assertEquals("Unexpected queue name", "Json-Queue-Name", queue1Config.getName());
+ assertTrue("Unexpected attributes", queue1Config.getAttributes().isEmpty());
+ assertFalse("Unexpected durable", queue1Config.isDurable());
+
+ QueueConfig queue2Config = queues.get(1);
+ assertNotNull("Expected queue 2 config", queue2Config);
+ assertEquals("Unexpected queue name", "Json Queue Name 2", queue2Config.getName());
+ assertTrue("Unexpected durable", queue2Config.isDurable());
+ Map<String, Object> attributes = queue2Config.getAttributes();
+ assertNotNull("Expected attributes", attributes);
+ assertFalse("Attributes are not loaded", attributes.isEmpty());
+ assertEquals("Unexpected number of attributes", 1, attributes.size());
+ assertEquals("Unexpected attribute 'x-qpid-priorities' value", 10,
+ ((Number)attributes.get("x-qpid-priorities")).intValue());
+ }
+
+ public void testReadsTestWithIterations()
+ {
+ TestConfig testConfig = _config.getTestConfigs().get(0);
+ List<IterationValue> iterationValues = testConfig.getIterationValues();
+ assertEquals("Unexpected number of iterations", 2, iterationValues.size());
+
+ IterationValue iteration1 = iterationValues.get(0);
+
+ String messageSizeProperty = "_messageSize";
+
+ assertEquals("Unexpected value for property " + messageSizeProperty,
+ "100",
+ iteration1.getIterationPropertyValuesWithUnderscores().get(messageSizeProperty));
+ }
+
+ public void testReadsMessageProviders()
+ {
+ TestConfig testConfig = _config.getTestConfigs().get(0);
+ ClientConfig cleintConfig = testConfig.getClients().get(0);
+ List<MessageProviderConfig> configs = cleintConfig.getMessageProviders();
+ assertNotNull("Message provider configs should not be null", configs);
+ assertEquals("Unexpected number of message providers", 1, configs.size());
+ MessageProviderConfig messageProvider = configs.get(0);
+ assertNotNull("Message provider config should not be null", messageProvider);
+ assertEquals("Unexpected provider name", "testProvider1", messageProvider.getName());
+ Map<String, PropertyValue> properties = messageProvider.getMessageProperties();
+ assertNotNull("Message properties should not be null", properties);
+ assertEquals("Unexpected number of message properties", 3, properties.size());
+ assertNotNull("test property is not found", properties.get("test"));
+ assertNotNull("priority property is not found", properties.get("priority"));
+ assertNotNull("id property is not found", properties.get("id"));
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTest.java
new file mode 100644
index 0000000000..88750b9737
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+public class ConfigTest extends TestCase
+{
+ public void testGetTestsForTestWithIteratingMessageSizes()
+ {
+ Config config = createConfigWithIteratingMessageSizes();
+ List<TestInstance> testConfigs = config.getTests();
+
+ assertEquals("should have a test config for each message size", 2, testConfigs.size());
+
+ TestInstance instance0 = testConfigs.get(0);
+ assertEquals(0, instance0.getIterationNumber());
+
+ TestInstance instance1 = testConfigs.get(1);
+ assertEquals(1, instance1.getIterationNumber());
+ }
+
+ private Config createConfigWithIteratingMessageSizes()
+ {
+ TestConfig testConfig = mock(TestConfig.class);
+
+ when(testConfig.getIterationValues()).thenReturn(Arrays.asList(new IterationValue(),new IterationValue()));
+
+ Config config = new Config(testConfig);
+
+ return config;
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTestUtils.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTestUtils.java
new file mode 100644
index 0000000000..ce5f92724f
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTestUtils.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+
+import java.util.List;
+
+import org.apache.qpid.disttest.controller.CommandForClient;
+import org.apache.qpid.disttest.message.Command;
+
+public class ConfigTestUtils
+{
+ public static <C extends Command> void assertCommandForClient(final List<CommandForClient> commandsForClients, final int index, final String expectedRegisteredClientName, final Class<C> expectedCommandClass)
+ {
+ final CommandForClient commandForClient = commandsForClients.get(index);
+ assertEquals(expectedRegisteredClientName, commandForClient.getClientName());
+ final Command command = commandForClient.getCommand();
+ assertTrue("Command " + index + " is of class " + command.getClass() + " but expecting " + expectedCommandClass,
+ expectedCommandClass.isAssignableFrom(command.getClass()));
+ }
+
+ public static <C extends Command> void assertCommandEquals(final List<Command> commands, final int index, final Class<C> expectedCommandClass)
+ {
+ @SuppressWarnings("unchecked")
+ C command = (C) getCommand(commands, index); //explicit cast added to get round oracle compiler bug (id 6302954)
+ assertTrue("Command " + index + " is of class " + command.getClass() + " but expecting " + expectedCommandClass,
+ expectedCommandClass.isAssignableFrom(command.getClass()));
+ }
+
+ public static <C extends Command> C getCommand(final List<Command> commands, final int index)
+ {
+ @SuppressWarnings("unchecked")
+ C command = (C) commands.get(index);
+ return command;
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConnectionConfigTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConnectionConfigTest.java
new file mode 100644
index 0000000000..7c839ed462
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConnectionConfigTest.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.apache.qpid.disttest.controller.config.ConfigTestUtils.assertCommandEquals;
+import static org.apache.qpid.disttest.controller.config.ConfigTestUtils.getCommand;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+
+public class ConnectionConfigTest extends TestCase
+{
+ private static final String CONNECTION_FACTORY_NAME = "ConnectionFactoryName";
+ private static final String CONNECTION_NAME = "ConnectionName";
+
+ public void testConnectionConfigHasZeroArgConstructorForGson()
+ {
+ ConnectionConfig c = new ConnectionConfig();
+ assertNotNull(c);
+ }
+
+ public void testCreateCommandsForConnectionAndChildren()
+ {
+ ConnectionConfig connectionConfig = createConnectionConfigWithChildCommands();
+
+ List<Command> commands = connectionConfig.createCommands();
+ assertEquals(3, commands.size());
+
+ assertCommandEquals(commands, 0, CreateConnectionCommand.class);
+ assertCommandEquals(commands, 1, NoOpCommand.class);
+ assertCommandEquals(commands, 2, NoOpCommand.class);
+
+ CreateConnectionCommand createConnectionCommand = getCommand(commands, 0);
+ assertEquals(CONNECTION_NAME, createConnectionCommand.getConnectionName());
+ assertEquals(CONNECTION_FACTORY_NAME, createConnectionCommand.getConnectionFactoryName());
+ }
+
+ public void testGetTotalNumberOfParticipants()
+ {
+ ConnectionConfig connectionConfig = createConnectionConfigWithTwoParticipants();
+ assertEquals(2, connectionConfig.getTotalNumberOfParticipants());
+ }
+
+ private ConnectionConfig createConnectionConfigWithTwoParticipants()
+ {
+ SessionConfig sessionConfig1 = mock(SessionConfig.class);
+ SessionConfig sessionConfig2 = mock(SessionConfig.class);
+
+ when(sessionConfig1.getTotalNumberOfParticipants()).thenReturn(1);
+ when(sessionConfig2.getTotalNumberOfParticipants()).thenReturn(1);
+
+ ConnectionConfig connectionConfig = new ConnectionConfig(CONNECTION_NAME, CONNECTION_FACTORY_NAME, sessionConfig1, sessionConfig2);
+
+ return connectionConfig;
+ }
+
+ private ConnectionConfig createConnectionConfigWithChildCommands()
+ {
+ SessionConfig sessionConfig = mock(SessionConfig.class);
+
+ NoOpCommand cmd1 = mock(NoOpCommand.class);
+ NoOpCommand cmd2 = mock(NoOpCommand.class);
+ List<Command> commands = Arrays.asList((Command)cmd1, (Command)cmd2);
+ when(sessionConfig.createCommands(CONNECTION_NAME)).thenReturn(commands);
+
+ return new ConnectionConfig(CONNECTION_NAME, CONNECTION_FACTORY_NAME, sessionConfig);
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConsumerConfigTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConsumerConfigTest.java
new file mode 100644
index 0000000000..c011ff4711
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConsumerConfigTest.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+
+public class ConsumerConfigTest extends TestCase
+{
+ public void testConsumerHasZeroArgConstructorForGson()
+ {
+ ConsumerConfig c = new ConsumerConfig();
+ assertNotNull(c);
+ }
+
+ public void testCreateConsumerCommand()
+ {
+ boolean isTopic = true;
+ boolean isDurableSubscription = true;
+ boolean isBrowsingSubscription = true;
+ boolean noLocal = true;
+ long numberOfMessages = 100;
+ String consumerName = "consumerName";
+ String sessionName = "sessionName";
+ String destinationName = "destinationName";
+ String selector = "selector";
+ int batchSize = 10;;
+ long maximumDuration = 50;
+ boolean isSynchronousNonDefault = false;
+
+ ConsumerConfig consumerConfig = new ConsumerConfig(
+ consumerName,
+ destinationName,
+ numberOfMessages,
+ batchSize,
+ maximumDuration,
+ isTopic,
+ isDurableSubscription,
+ isBrowsingSubscription,
+ selector,
+ noLocal,
+ isSynchronousNonDefault);
+
+ CreateConsumerCommand createConsumerCommand = consumerConfig.createCommand(sessionName);
+
+ assertEquals(sessionName, createConsumerCommand.getSessionName());
+ assertEquals(consumerName, createConsumerCommand.getParticipantName());
+ assertEquals(destinationName, createConsumerCommand.getDestinationName());
+ assertEquals(numberOfMessages, createConsumerCommand.getNumberOfMessages());
+ assertEquals(batchSize, createConsumerCommand.getBatchSize());
+ assertEquals(maximumDuration, createConsumerCommand.getMaximumDuration());
+
+ assertEquals(isTopic, createConsumerCommand.isTopic());
+ assertEquals(isDurableSubscription, createConsumerCommand.isDurableSubscription());
+ assertEquals(isBrowsingSubscription, createConsumerCommand.isBrowsingSubscription());
+ assertEquals(selector, createConsumerCommand.getSelector());
+ assertEquals(noLocal, createConsumerCommand.isNoLocal());
+ assertEquals(isSynchronousNonDefault, createConsumerCommand.isSynchronous());
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/IterationValueTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/IterationValueTest.java
new file mode 100644
index 0000000000..7998eae37e
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/IterationValueTest.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+import java.util.Collections;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+
+public class IterationValueTest extends TestCase
+{
+ private static final int MESSAGE_SIZE = 10;
+
+ private CreateProducerCommand _createProducerCommand;
+ private CreateConsumerCommand _createConsumerCommand;
+ private Map<String, String> _iterationValueMap;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _createProducerCommand = mock(CreateProducerCommand.class);
+ _createConsumerCommand = mock(CreateConsumerCommand.class);
+
+ _iterationValueMap = Collections.singletonMap("_messageSize", String.valueOf(MESSAGE_SIZE));
+ }
+
+ public void testApplyPopulatedIterationValueToCommandWithMatchingProperties() throws Exception
+ {
+ IterationValue iterationValue = new IterationValue(_iterationValueMap);
+
+ iterationValue.applyToCommand(_createProducerCommand);
+
+ verify(_createProducerCommand).setMessageSize(MESSAGE_SIZE);
+ }
+
+ public void testApplyPopulatedIterationValueToCommandWithoutMatchingProperties() throws Exception
+ {
+ IterationValue iterationValue = new IterationValue(_iterationValueMap);
+
+ iterationValue.applyToCommand(_createConsumerCommand);
+
+ verifyZeroInteractions(_createConsumerCommand);
+ }
+
+ public void testApplyUnpopulatedIterationValueToCommand() throws Exception
+ {
+ IterationValue iterationValue = new IterationValue();
+
+ iterationValue.applyToCommand(_createProducerCommand);
+
+ verifyZeroInteractions(_createProducerCommand);
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/MessageProviderConfigTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/MessageProviderConfigTest.java
new file mode 100644
index 0000000000..a3b367a4b4
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/MessageProviderConfigTest.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.client.property.SimplePropertyValue;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+
+public class MessageProviderConfigTest extends TestCase
+{
+ public void testCreateCommandsForMessageProvider()
+ {
+ Map<String, PropertyValue> messageProperties = new HashMap<String, PropertyValue>();
+ messageProperties.put("test", new SimplePropertyValue("testValue"));
+ MessageProviderConfig config = new MessageProviderConfig("test", messageProperties);
+ CreateMessageProviderCommand command = config.createCommand();
+ assertNotNull("Command should not be null", command);
+ assertNotNull("Unexpected name", command.getProviderName());
+ assertEquals("Unexpected properties", messageProperties, command.getMessageProperties());
+ }
+
+ public void testMessageProviderConfig()
+ {
+ Map<String, PropertyValue> messageProperties = new HashMap<String, PropertyValue>();
+ messageProperties.put("test", new SimplePropertyValue("testValue"));
+ MessageProviderConfig config = new MessageProviderConfig("test", messageProperties);
+ assertEquals("Unexpected name", "test", config.getName());
+ assertEquals("Unexpected properties", messageProperties, config.getMessageProperties());
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ProducerConfigTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ProducerConfigTest.java
new file mode 100644
index 0000000000..b9e591f113
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ProducerConfigTest.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import javax.jms.DeliveryMode;
+import javax.jms.Message;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+
+public class ProducerConfigTest extends TestCase
+{
+ public void testProducerHasZeroArgConstructorForGson()
+ {
+ ProducerConfig p = new ProducerConfig();
+ assertNotNull(p);
+ }
+
+ public void testConfigProvidesJmsDefaults()
+ {
+ CreateProducerCommand p = new ProducerConfig().createCommand("session1");
+ assertEquals(Message.DEFAULT_DELIVERY_MODE, p.getDeliveryMode());
+ assertEquals(Message.DEFAULT_PRIORITY, p.getPriority());
+ assertEquals(Message.DEFAULT_TIME_TO_LIVE, p.getTimeToLive());
+ }
+
+ public void testCreateProducerCommand()
+ {
+ String destination = "url:/destination";
+ int messageSize = 1000;
+ int numberOfMessages = 10;
+ int priority = 4;
+ long timeToLive = 10000;
+ int batchSize = 5;
+ long interval = 60;
+ long maximumDuration = 70;
+ long startDelay = 80;
+ String providerName = "testProvider1";
+
+ ProducerConfig producerConfig = new ProducerConfig(
+ "producer1",
+ destination,
+ numberOfMessages,
+ batchSize,
+ maximumDuration,
+ DeliveryMode.NON_PERSISTENT,
+ messageSize,
+ priority,
+ timeToLive,
+ interval,
+ startDelay,
+ providerName);
+
+ CreateProducerCommand command = producerConfig.createCommand("session1");
+
+ assertEquals("session1", command.getSessionName());
+ assertEquals("producer1", command.getParticipantName());
+ assertEquals(destination, command.getDestinationName());
+ assertEquals(numberOfMessages, command.getNumberOfMessages());
+ assertEquals(batchSize, command.getBatchSize());
+ assertEquals(maximumDuration, command.getMaximumDuration());
+
+ assertEquals(DeliveryMode.NON_PERSISTENT, command.getDeliveryMode());
+ assertEquals(messageSize, command.getMessageSize());
+ assertEquals(priority, command.getPriority());
+ assertEquals(timeToLive, command.getTimeToLive());
+ assertEquals(interval, command.getInterval());
+ assertEquals(startDelay, command.getStartDelay());
+ assertEquals(providerName, command.getMessageProviderName());
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/SessionConfigTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/SessionConfigTest.java
new file mode 100644
index 0000000000..8775e4064d
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/SessionConfigTest.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.apache.qpid.disttest.controller.config.ConfigTestUtils.assertCommandEquals;
+import static org.apache.qpid.disttest.controller.config.ConfigTestUtils.getCommand;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.jms.Session;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+
+public class SessionConfigTest extends TestCase
+{
+ private static final String CONNECTION_NAME = "conn1";
+ private static final String SESSION = "session1";
+
+ public void testSessionHasZeroArgConstructorForGson()
+ {
+ SessionConfig s = new SessionConfig();
+ assertNotNull(s);
+ }
+
+ public void testCreateCommandsForSessionAndChildren()
+ {
+ SessionConfig sessionConfig = createSessionConfigWithChildCommands();
+
+ List<Command> commands = sessionConfig.createCommands(CONNECTION_NAME);
+ assertEquals(3, commands.size());
+
+ assertCommandEquals(commands, 0, CreateSessionCommand.class);
+ assertCommandEquals(commands, 1, CreateProducerCommand.class);
+ assertCommandEquals(commands, 2, CreateConsumerCommand.class);
+
+ CreateSessionCommand createSessionCommand = getCommand(commands, 0);
+ assertEquals(Session.AUTO_ACKNOWLEDGE, createSessionCommand.getAcknowledgeMode());
+ assertEquals(SESSION, createSessionCommand.getSessionName());
+ assertEquals(CONNECTION_NAME, createSessionCommand.getConnectionName());
+ }
+
+ public void testGetTotalNumberOfParticipants()
+ {
+ SessionConfig sessionConfig = createSessionConfigWithOneConsumerAndOneProducer();
+ assertEquals(2, sessionConfig.getTotalNumberOfParticipants());
+ }
+
+ private SessionConfig createSessionConfigWithOneConsumerAndOneProducer()
+ {
+ return createSessionConfigWithChildCommands();
+ }
+
+ private SessionConfig createSessionConfigWithChildCommands()
+ {
+ ProducerConfig producerConfig = mock(ProducerConfig.class);
+ ConsumerConfig consumerConfig = mock(ConsumerConfig.class);
+
+ when(producerConfig.createCommand(SESSION)).thenReturn(mock(CreateProducerCommand.class));
+ when(consumerConfig.createCommand(SESSION)).thenReturn(mock(CreateConsumerCommand.class));
+
+ return new SessionConfig(SESSION,
+ Session.AUTO_ACKNOWLEDGE,
+ Collections.singletonList(consumerConfig),
+ Collections.singletonList(producerConfig));
+ }
+
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestConfigTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestConfigTest.java
new file mode 100644
index 0000000000..1212a57606
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestConfigTest.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.apache.qpid.disttest.controller.config.ConfigTestUtils.assertCommandForClient;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.controller.CommandForClient;
+import org.apache.qpid.disttest.message.NoOpCommand;
+
+public class TestConfigTest extends TestCase
+{
+ private static final QueueConfig[] EMPTY_QUEUES_ARRAY = new QueueConfig[0];
+ private static final String CLIENT1 = "client1";
+ private static final String CLIENT2 = "client2";
+ private static final String TEST1 = "test1";
+
+ public void testConfigHasZeroArgConstructorForGson()
+ {
+ TestConfig c = new TestConfig();
+ assertNotNull(c);
+ }
+
+ public void testCreateCommandsForClient()
+ {
+ TestConfig config = createTestConfigWithClientConfigReturningChildCommands();
+
+ List<CommandForClient> commandsForClients = config.createCommands();
+ assertEquals("Unexpected number of commands for client", 3, commandsForClients.size());
+
+ assertCommandForClient(commandsForClients, 0, CLIENT1, NoOpCommand.class);
+ assertCommandForClient(commandsForClients, 1, CLIENT1, NoOpCommand.class);
+ assertCommandForClient(commandsForClients, 2, CLIENT2, NoOpCommand.class);
+ }
+
+ public void testGetClientNames()
+ {
+ TestConfig config = createTestConfigWithTwoClients();
+
+ assertEquals(2, config.getClientNames().size());
+ }
+
+ public void testGetTotalNumberOfClients()
+ {
+ TestConfig config = createTestConfigWithTwoClients();
+ assertEquals(2, config.getTotalNumberOfClients());
+ }
+
+ public void testGetTotalNumberOfParticipants()
+ {
+ TestConfig config = createTestConfigWithTwoClients();
+ assertEquals(2, config.getTotalNumberOfParticipants());
+ }
+
+ private TestConfig createTestConfigWithClientConfigReturningChildCommands()
+ {
+ ClientConfig clientConfig1 = createClientConfigReturningCommands(CLIENT1, 2);
+ ClientConfig clientConfig2 = createClientConfigReturningCommands(CLIENT2, 1);
+
+ TestConfig config = new TestConfig(TEST1, new ClientConfig[] { clientConfig1, clientConfig2 }, EMPTY_QUEUES_ARRAY);
+ return config;
+ }
+
+ private ClientConfig createClientConfigReturningCommands(final String clientName, int numberOfCommands)
+ {
+ ClientConfig clientConfig = mock(ClientConfig.class);
+
+ List<CommandForClient> commandList = new ArrayList<CommandForClient>();
+
+ for (int i = 1 ; i <= numberOfCommands; i++)
+ {
+ commandList.add(new CommandForClient(clientName, new NoOpCommand()));
+ }
+
+ when(clientConfig.createCommands()).thenReturn(commandList);
+ return clientConfig;
+ }
+
+ private TestConfig createTestConfigWithTwoClients()
+ {
+ ClientConfig clientConfig1 = mock(ClientConfig.class);
+ ClientConfig clientConfig2 = mock(ClientConfig.class);
+
+ when(clientConfig1.getTotalNumberOfParticipants()).thenReturn(1);
+ when(clientConfig2.getTotalNumberOfParticipants()).thenReturn(1);
+
+ TestConfig config = new TestConfig(TEST1, new ClientConfig[] { clientConfig1, clientConfig2 }, EMPTY_QUEUES_ARRAY);
+ return config;
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestInstanceTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestInstanceTest.java
new file mode 100644
index 0000000000..928fbe58cf
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestInstanceTest.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.controller.CommandForClient;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+
+public class TestInstanceTest extends TestCase
+{
+ private static final String CLIENT_NAME = "CLIENT_NAME";
+ private static final int ITERATION_NUMBER = 0;
+
+ private NoOpCommand _noOpCommand;
+ private CreateProducerCommand _createProducerCommand;
+ private CreateConsumerCommand _createConsumerCommand;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _noOpCommand = mock(NoOpCommand.class);
+ _createProducerCommand = mock(CreateProducerCommand.class);
+ _createConsumerCommand = mock(CreateConsumerCommand.class);
+ }
+
+ public void testCreateCommandsWithIterationValues()
+ {
+ IterationValue iterationValue = mock(IterationValue.class);
+
+ TestConfig config = createTestConfig();
+
+ TestInstance testInstance = new TestInstance(config, ITERATION_NUMBER, iterationValue);
+
+ List<CommandForClient> commandsForClients = testInstance.createCommands();
+ assertEquals("Unexpected number of commands for client", 3, commandsForClients.size());
+
+ verify(iterationValue).applyToCommand(_noOpCommand);
+ verify(iterationValue).applyToCommand(_createProducerCommand);
+ verify(iterationValue).applyToCommand(_createConsumerCommand);
+ }
+
+ public void testCreateCommandsWithoutIterationValues()
+ {
+ TestConfig config = createTestConfig();
+ TestInstance testInstance = new TestInstance(config);
+
+ List<CommandForClient> commandsForClients = testInstance.createCommands();
+ assertEquals("Unexpected number of commands for client", 3, commandsForClients.size());
+ }
+
+ public void testGetConfiguredClientNames()
+ {
+ TestConfig testConfig = mock(TestConfig.class);
+ when(testConfig.getClientNames()).thenReturn(Collections.singletonList(CLIENT_NAME));
+ TestInstance testInstance = new TestInstance(testConfig);
+
+ List<String> clientNames = testInstance.getClientNames();
+ assertEquals(1, clientNames.size());
+ assertEquals(CLIENT_NAME, clientNames.get(0));
+ }
+
+ private TestConfig createTestConfig()
+ {
+ CommandForClient commandForClient1 = new CommandForClient(CLIENT_NAME, _noOpCommand);
+ CommandForClient commandForClient2 = new CommandForClient(CLIENT_NAME, _createProducerCommand);
+ CommandForClient commandForClient3 = new CommandForClient(CLIENT_NAME, _createConsumerCommand);
+
+ TestConfig config = mock(TestConfig.class);
+ when(config.createCommands()).thenReturn(Arrays.asList(commandForClient1, commandForClient2, commandForClient3));
+
+ return config;
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/sampleConfig.json b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/sampleConfig.json
new file mode 100644
index 0000000000..9e1168129b
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/sampleConfig.json
@@ -0,0 +1,72 @@
+{
+ "_tests": [
+ {
+ "_name": "Test 1",
+ "_queues": [
+ {
+ "_name": "Json-Queue-Name",
+ "_durable": false,
+ "_attributes": {}
+ },
+ {
+ "_name": "Json Queue Name 2",
+ "_durable": true,
+ "_attributes": {
+ "x-qpid-priorities": 10.0
+ }
+ }
+ ],
+ "_iterations": [
+ {
+ "_messageSize": 100,
+ "_numberOfMessages": 10
+ },
+ {
+ "_messageSize": 200,
+ "_numberOfMessages": 5
+ }
+ ],
+ "_clients": [
+ {
+ "_connections": [
+ {
+ "_name": "connection1",
+ "_sessions": []
+ }
+ ];
+ "_messageProviders":[
+ {
+ "_name": "testProvider1";
+ "_messageProperties": {
+ "priority": {"@def": "list"; "_items": [1,2,3,4,4]};
+ "id": {"@def": "random"; "_upper": 10};
+ "test": "test-value"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Test 2",
+ "_queues": [
+ {
+ "_name": "Json-Queue-Name",
+ "_durable": false,
+ "_attributes": {}
+ }
+ ],
+ "_iterations": [],
+ "_clients": [
+ {
+ "_connections": [
+ {
+ "_name": "connection1",
+ "_sessions": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/jms/JmsMessageAdaptorTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/jms/JmsMessageAdaptorTest.java
new file mode 100644
index 0000000000..ab0f52263b
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/jms/JmsMessageAdaptorTest.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.jms;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+
+public class JmsMessageAdaptorTest extends TestCase
+{
+
+ public void testCheckAllCommandTypes()
+ {
+ for (CommandType commandType : CommandType.values())
+ {
+ Class<? extends Command> clazz = JmsMessageAdaptor.getCommandClassFromType(commandType);
+ assertNotNull(clazz);
+
+ }
+
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/message/JsonHandlerTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/message/JsonHandlerTest.java
new file mode 100644
index 0000000000..4a56fff8fe
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/message/JsonHandlerTest.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.qpid.disttest.client.property.ListPropertyValue;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.json.JsonHandler;
+
+public class JsonHandlerTest extends TestCase
+{
+ private JsonHandler _jsonHandler = null;
+ private SendChristmasCards _testCommand = null;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _jsonHandler = new JsonHandler();
+
+ _testCommand = new SendChristmasCards(CommandType.START_TEST, Collections.singletonMap(SendChristmasCards.CardType.FUNNY, 5));
+ _testCommand.persons = Arrays.asList(new Person("Phil"), new Person("Andrew"));
+ }
+
+ public void testMarshallUnmarshall() throws Exception
+ {
+ final String jsonString = _jsonHandler.marshall(_testCommand);
+
+ final SendChristmasCards unmarshalledCommand = _jsonHandler.unmarshall(jsonString, SendChristmasCards.class);
+
+ assertEquals("Unmarshalled command should be equal to the original object", _testCommand, unmarshalledCommand);
+ }
+
+ public void testGeneratorDesrialization()
+ {
+ String json = "{_messageProperties: {test: 1; generator: {'@def': 'list'; _cyclic: false; _items: ['first', " +
+ "{'@def': 'range'; _upper:10; '_type':'int'}]}}}";
+ final TestCommand unmarshalledCommand = _jsonHandler.unmarshall(json, TestCommand.class);
+ Map<String, PropertyValue> properties = unmarshalledCommand.getMessageProperties();
+ assertNotNull("Properties should not be null", properties);
+ assertFalse("Properties should not be empty", properties.isEmpty());
+ assertEquals("Unexpected properties size", 2, properties.size());
+ PropertyValue testProperty = properties.get("test");
+ assertNotNull("Unexpected property test", testProperty);
+ assertTrue("Unexpected property test", testProperty.getValue() instanceof Number);
+ assertEquals("Unexpected property value", 1, ((Number)testProperty.getValue()).intValue());
+ Object generatorObject = properties.get("generator");
+ assertTrue("Unexpected generator object", generatorObject instanceof ListPropertyValue);
+ PropertyValue generator = (PropertyValue)generatorObject;
+ assertEquals("Unexpected generator value", "first", generator.getValue());
+ for (int i = 0; i < 10; i++)
+ {
+ assertEquals("Unexpected generator value", new Integer(i), generator.getValue());
+ }
+ String newJson =_jsonHandler.marshall(unmarshalledCommand);
+ final TestCommand newUnmarshalledCommand = _jsonHandler.unmarshall(newJson, TestCommand.class);
+ assertEquals("Unmarshalled command should be equal to the original object", unmarshalledCommand, newUnmarshalledCommand);
+ }
+
+ /**
+ * A {@link Command} designed to exercise {@link JsonHandler}, e.g does it handle a map of enums?.
+ *
+ * This class is non-private to avoid auto-deletion of "unused" fields/methods
+ */
+ static class SendChristmasCards extends Command
+ {
+ enum CardType {FUNNY, TRADITIONAL}
+
+ private Map<CardType, Integer> _cardTypes;
+ private List<Person> persons;
+
+ public SendChristmasCards(final CommandType type, Map<CardType, Integer> cardTypes)
+ {
+ super(type);
+ _cardTypes = cardTypes;
+ }
+
+ public Map<CardType, Integer> getCardTypes()
+ {
+ return _cardTypes;
+ }
+
+ public List<Person> getPersons()
+ {
+ return persons;
+ }
+
+ @Override
+ public boolean equals(final Object obj)
+ {
+ return EqualsBuilder.reflectionEquals(this, obj);
+ }
+ }
+
+ /**
+ * This class is non-private to avoid auto-deletion of "unused" fields/methods
+ */
+ static class Person
+ {
+ private String _firstName;
+
+ public Person(final String firstName)
+ {
+ _firstName = firstName;
+ }
+
+ public String getFirstName()
+ {
+ return _firstName;
+ }
+
+ @Override
+ public boolean equals(final Object obj)
+ {
+ return EqualsBuilder.reflectionEquals(this, obj);
+ }
+
+ }
+
+ /**
+ * Yet another test class
+ */
+ static class TestCommand extends Command
+ {
+
+ private Map<String, PropertyValue> _messageProperties;
+
+ public TestCommand(CommandType type)
+ {
+ super(type);
+ }
+
+ public Map<String, PropertyValue> getMessageProperties()
+ {
+ return _messageProperties;
+ }
+
+ public void setMessageProperties(Map<String, PropertyValue> _messageProperties)
+ {
+ this._messageProperties = _messageProperties;
+ }
+
+ @Override
+ public boolean equals(final Object obj)
+ {
+ if (obj == null || !(obj instanceof TestCommand))
+ {
+ return false;
+ }
+ TestCommand other = (TestCommand)obj;
+ if (_messageProperties == null && other._messageProperties != null )
+ {
+ return false;
+ }
+ return _messageProperties.equals(other._messageProperties);
+ }
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/message/ParticipantResultTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/message/ParticipantResultTest.java
new file mode 100644
index 0000000000..12731c06f4
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/message/ParticipantResultTest.java
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import static org.apache.qpid.disttest.message.ParticipantAttribute.*;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.CONFIGURED_CLIENT_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.DELIVERY_MODE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.ERROR_MESSAGE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_BROWSIING_SUBSCRIPTION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_DURABLE_SUBSCRIPTION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_NO_LOCAL;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_SELECTOR;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_SYNCHRONOUS_CONSUMER;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_TOPIC;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.ITERATION_NUMBER;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.MAXIMUM_DURATION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PAYLOAD_SIZE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.NUMBER_OF_MESSAGES_PROCESSED;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PARTICIPANT_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRIORITY;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRODUCER_INTERVAL;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRODUCER_START_DELAY;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TEST_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TIME_TAKEN;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TIME_TO_LIVE;
+
+import java.util.Date;
+
+import javax.jms.DeliveryMode;
+
+import junit.framework.TestCase;
+
+public class ParticipantResultTest extends TestCase
+{
+
+ public void testSharedParticipantResultAttributes() throws Exception
+ {
+ final String participantName = "PARTICIPANT_NAME1";
+ final String testName = "TEST_NAME1";
+ String clientConfiguredName = "CLIENT_CONFIGURED_NAME";
+ String errorMessage = "errorMessage";
+ int iterationNumber = 1;
+
+ ParticipantResult result = new ParticipantResult();
+
+ long numberOfMessages = 500;
+ long timeTaken = 30;
+ int batchSize = 10;
+
+ long startTime = System.currentTimeMillis();
+ long endTime = startTime + timeTaken;
+ long maximumDuration = 1000;
+
+ int totalNumberOfConsumers = 1;
+ int totalNumberOfProducers = 1;
+
+ int acknowledgeMode = 1;
+
+ result.setParticipantName(participantName);
+ result.setTestName(testName);
+ result.setIterationNumber(iterationNumber);
+ result.setConfiguredClientName(clientConfiguredName);
+
+ result.setAcknowledgeMode(acknowledgeMode);
+ result.setNumberOfMessagesProcessed(numberOfMessages);
+ result.setConfiguredClientName(clientConfiguredName);
+ result.setBatchSize(batchSize);
+
+ result.setStartDate(new Date(startTime));
+ result.setEndDate(new Date(endTime));
+ result.setMaximumDuration(maximumDuration);
+
+ result.setTotalNumberOfConsumers(totalNumberOfConsumers);
+ result.setTotalNumberOfProducers(totalNumberOfProducers);
+
+ result.setErrorMessage(errorMessage);
+
+ assertEquals(participantName, result.getAttributes().get(PARTICIPANT_NAME));
+ assertEquals(testName, result.getAttributes().get(TEST_NAME));
+ assertEquals(iterationNumber, result.getAttributes().get(ITERATION_NUMBER));
+ assertEquals(clientConfiguredName, result.getAttributes().get(CONFIGURED_CLIENT_NAME));
+ assertEquals(numberOfMessages, result.getAttributes().get(NUMBER_OF_MESSAGES_PROCESSED));
+ assertEquals(timeTaken, result.getAttributes().get(TIME_TAKEN));
+ assertEquals(timeTaken, result.getAttributes().get(TIME_TAKEN));
+ assertEquals(timeTaken, result.getAttributes().get(TIME_TAKEN));
+ assertEquals(batchSize, result.getAttributes().get(BATCH_SIZE));
+ assertEquals(maximumDuration, result.getAttributes().get(MAXIMUM_DURATION));
+ assertEquals(totalNumberOfConsumers, result.getAttributes().get(TOTAL_NUMBER_OF_CONSUMERS));
+ assertEquals(totalNumberOfProducers, result.getAttributes().get(TOTAL_NUMBER_OF_PRODUCERS));
+ assertEquals(acknowledgeMode, result.getAttributes().get(ACKNOWLEDGE_MODE));
+ assertEquals(errorMessage, result.getAttributes().get(ERROR_MESSAGE));
+ }
+
+ public void testConsumerParticipantResultAttributes() throws Exception
+ {
+ ConsumerParticipantResult result = new ConsumerParticipantResult();
+
+ boolean topic = true;
+ boolean durable = true;
+ boolean browsingSubscription = false;
+ boolean selector = true;
+ boolean noLocal = false;
+ boolean synchronousConsumer = true;
+
+ result.setTopic(topic);
+ result.setDurableSubscription(durable);
+ result.setBrowsingSubscription(browsingSubscription);
+ result.setSelector(selector);
+ result.setNoLocal(noLocal);
+ result.setSynchronousConsumer(synchronousConsumer);
+
+ assertEquals(topic, result.getAttributes().get(IS_TOPIC));
+ assertEquals(durable, result.getAttributes().get(IS_DURABLE_SUBSCRIPTION));
+ assertEquals(browsingSubscription, result.getAttributes().get(IS_BROWSIING_SUBSCRIPTION));
+ assertEquals(selector, result.getAttributes().get(IS_SELECTOR));
+ assertEquals(noLocal, result.getAttributes().get(IS_NO_LOCAL));
+ assertEquals(synchronousConsumer, result.getAttributes().get(IS_SYNCHRONOUS_CONSUMER));
+ }
+
+ public void testProducerParticipantResultAttributes() throws Exception
+ {
+ ProducerParticipantResult result = new ProducerParticipantResult();
+
+ int priority = 2;
+ long timeToLive = 30;
+ long producerStartDelay = 40;
+ long producerInterval = 50;
+ int messageSize = 60;
+ int deliveryMode = DeliveryMode.PERSISTENT;
+
+ result.setPriority(priority);
+ result.setTimeToLive(timeToLive);
+ result.setStartDelay(producerStartDelay);
+ result.setInterval(producerInterval);
+ result.setPayloadSize(messageSize);
+ result.setDeliveryMode(deliveryMode);
+
+
+ assertEquals(priority, result.getAttributes().get(PRIORITY));
+ assertEquals(timeToLive, result.getAttributes().get(TIME_TO_LIVE));
+ assertEquals(producerStartDelay, result.getAttributes().get(PRODUCER_START_DELAY));
+ assertEquals(producerInterval, result.getAttributes().get(PRODUCER_INTERVAL));
+ assertEquals(messageSize, result.getAttributes().get(PAYLOAD_SIZE));
+ assertEquals(deliveryMode, result.getAttributes().get(DELIVERY_MODE));
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/AggregatorTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/AggregatorTest.java
new file mode 100644
index 0000000000..393837b4d5
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/AggregatorTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+
+public class AggregatorTest extends TestCase
+{
+ private Aggregator _aggregator = new Aggregator();
+ private TestResultAggregator _testResultAggregator = mock(TestResultAggregator.class);
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _aggregator.setTestResultAggregator(_testResultAggregator);
+ }
+
+ public void testAggregrateManyTestResults() throws Exception
+ {
+ ResultsForAllTests resultsForAllTests = mock(ResultsForAllTests.class);
+ ITestResult testResult1 = mock(ITestResult.class);
+ ITestResult testResult2 = mock(ITestResult.class);
+
+ when(resultsForAllTests.getTestResults()).thenReturn(Arrays.asList(testResult1, testResult2));
+ when(_testResultAggregator.aggregateTestResult(testResult1)).thenReturn(mock(AggregatedTestResult.class));
+ when(_testResultAggregator.aggregateTestResult(testResult2)).thenReturn(mock(AggregatedTestResult.class));
+
+ ResultsForAllTests aggregatedResultsForAllTests = _aggregator.aggregateResults(resultsForAllTests);
+ assertEquals(2, aggregatedResultsForAllTests.getTestResults().size());
+
+ verify(_testResultAggregator).aggregateTestResult(testResult1);
+ verify(_testResultAggregator).aggregateTestResult(testResult2);
+
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregatorTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregatorTest.java
new file mode 100644
index 0000000000..72743be1d1
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregatorTest.java
@@ -0,0 +1,272 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import java.util.Date;
+
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.ParticipantResultAggregator;
+
+import junit.framework.TestCase;
+
+public class ParticipantResultAggregatorTest extends TestCase
+{
+ private ParticipantResultAggregator _aggregator = new ParticipantResultAggregator(ParticipantResult.class, AGGREGATED_RESULT_NAME);
+
+ private static final String TEST_NAME = "TEST_NAME";
+ private static final String AGGREGATED_RESULT_NAME = "AGGREGATED_RESULT_NAME";
+ private static final int TEST_ITERATION_NUMBER = 1;
+
+ private static final long PARTICIPANT1_STARTDATE = 50;
+ private static final long PARTICIPANT1_ENDDATE = 20000;
+ private static final long PARTICIPANT1_TOTAL_PROCESSED = 1024;
+
+ private static final long PARTICIPANT2_STARTDATE = 100;
+ private static final long PARTICIPANT2_ENDDATE = 21000;
+ private static final long PARTICIPANT2_TOTAL_PROCESSED = 2048;
+
+ private static final long OVERALL_PROCESSED = PARTICIPANT1_TOTAL_PROCESSED + PARTICIPANT2_TOTAL_PROCESSED;
+ private static final double OVERALL_TIMETAKEN = PARTICIPANT2_ENDDATE - PARTICIPANT1_STARTDATE;
+
+ private static final double EXPECTED_AGGREGATED_ALL_THROUGHPUT = ((OVERALL_PROCESSED)/1024)/((OVERALL_TIMETAKEN)/1000);
+
+ public void testStartAndEndDateForOneParticipantResult()
+ {
+ ParticipantResult result = new ParticipantResult();
+ result.setStartDate(new Date(PARTICIPANT1_STARTDATE));
+ result.setEndDate(new Date(PARTICIPANT1_ENDDATE));
+
+ _aggregator.aggregate(result);
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(PARTICIPANT1_STARTDATE, aggregratedResult.getStartInMillis());
+ assertEquals(PARTICIPANT1_ENDDATE, aggregratedResult.getEndInMillis());
+ }
+
+ public void testStartAndEndDateForTwoParticipantResults()
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setStartDate(new Date(PARTICIPANT1_STARTDATE));
+ result1.setEndDate(new Date(PARTICIPANT1_ENDDATE));
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setStartDate(new Date(PARTICIPANT2_STARTDATE));
+ result2.setEndDate(new Date(PARTICIPANT2_ENDDATE));
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(PARTICIPANT1_STARTDATE, aggregratedResult.getStartInMillis());
+ assertEquals(PARTICIPANT2_ENDDATE, aggregratedResult.getEndInMillis());
+ }
+
+ public void testComputeNumberOfMessagesProcessed()
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setNumberOfMessagesProcessed(10);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setNumberOfMessagesProcessed(15);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(25, aggregratedResult.getNumberOfMessagesProcessed());
+ }
+
+ public void testComputeTotalPayloadProcessed()
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setTotalPayloadProcessed(PARTICIPANT1_TOTAL_PROCESSED);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setTotalPayloadProcessed(PARTICIPANT2_TOTAL_PROCESSED);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(OVERALL_PROCESSED, aggregratedResult.getTotalPayloadProcessed());
+ }
+
+ public void testComputeThroughput()
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setStartDate(new Date(PARTICIPANT1_STARTDATE));
+ result1.setEndDate(new Date(PARTICIPANT1_ENDDATE));
+ result1.setTotalPayloadProcessed(PARTICIPANT1_TOTAL_PROCESSED);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setStartDate(new Date(PARTICIPANT2_STARTDATE));
+ result2.setEndDate(new Date(PARTICIPANT2_ENDDATE));
+ result2.setTotalPayloadProcessed(PARTICIPANT2_TOTAL_PROCESSED);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(EXPECTED_AGGREGATED_ALL_THROUGHPUT, aggregratedResult.getThroughput(), 0.1);
+ }
+
+ public void testConstantTestNameAndIterationNumberRolledUp() throws Exception
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setTestName(TEST_NAME);
+ result1.setIterationNumber(TEST_ITERATION_NUMBER);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setTestName(TEST_NAME);
+ result2.setIterationNumber(TEST_ITERATION_NUMBER);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(TEST_ITERATION_NUMBER, aggregratedResult.getIterationNumber());
+ assertEquals(TEST_NAME, aggregratedResult.getTestName());
+ }
+
+ public void testConstantPayloadSizesRolledUp() throws Exception
+ {
+ final int payloadSize = 1024;
+
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setPayloadSize(payloadSize);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setPayloadSize(payloadSize);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(payloadSize, aggregratedResult.getPayloadSize());
+ }
+
+ public void testDifferingPayloadSizesNotRolledUp() throws Exception
+ {
+ final int payload1Size = 1024;
+ final int payload2Size = 2048;
+
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setPayloadSize(payload1Size);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setPayloadSize(payload2Size);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(0, aggregratedResult.getPayloadSize());
+ }
+
+ public void testConstantBatchSizesRolledUp() throws Exception
+ {
+ final int batchSize = 10;
+
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setBatchSize(batchSize);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setBatchSize(batchSize);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(batchSize, aggregratedResult.getBatchSize());
+ }
+
+ public void testDifferingBatchSizesNotRolledUp() throws Exception
+ {
+ final int batch1Size = 10;
+ final int batch2Size = 20;
+
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setBatchSize(batch1Size);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setBatchSize(batch2Size);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(0, aggregratedResult.getBatchSize());
+ }
+
+ public void testConstantAcknowledgeModesRolledUp() throws Exception
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setAcknowledgeMode(Session.DUPS_OK_ACKNOWLEDGE);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setAcknowledgeMode(Session.DUPS_OK_ACKNOWLEDGE);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(Session.DUPS_OK_ACKNOWLEDGE, aggregratedResult.getAcknowledgeMode());
+ }
+
+ public void testDifferingAcknowledgeModesNotRolledUp() throws Exception
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setBatchSize(Session.AUTO_ACKNOWLEDGE);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setBatchSize(Session.SESSION_TRANSACTED);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(-1, aggregratedResult.getAcknowledgeMode());
+ }
+
+ public void testSumNumberOfConsumerAndProducers() throws Exception
+ {
+ final int expectedNumberOfProducers = 1;
+ final int expectedNumberOfConsumers = 2;
+
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setTotalNumberOfConsumers(1);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setTotalNumberOfConsumers(1);
+
+ ParticipantResult result3 = new ParticipantResult();
+ result2.setTotalNumberOfProducers(1);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+ _aggregator.aggregate(result3);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(expectedNumberOfConsumers, aggregratedResult.getTotalNumberOfConsumers());
+ assertEquals(expectedNumberOfProducers, aggregratedResult.getTotalNumberOfProducers());
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregatorTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregatorTest.java
new file mode 100644
index 0000000000..a803120cc6
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregatorTest.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.controller.TestResult;
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.AggregatedTestResult;
+import org.apache.qpid.disttest.results.aggregation.TestResultAggregator;
+
+public class TestResultAggregatorTest extends TestCase
+{
+
+ private static final String TEST1_NAME = "TEST1_NAME";
+ private static final int TEST1_ITERATION_NUMBER = 1;
+
+
+ private static final String CONSUMER_PARTICIPANT_NAME1 = "CONSUMER_PARTICIPANT_NAME1";
+ private static final String CONSUMER_PARTICIPANT_NAME2 = "CONSUMER_PARTICIPANT_NAME2";
+
+ private static final String PRODUCER_PARTICIPANT_NAME = "PRODUCER_PARTICIPANT_NAME";
+
+
+ private static final long CONSUMER1_STARTDATE = 50;
+ private static final long CONSUMER1_ENDDATE = 20000;
+
+ private static final long CONSUMER2_STARTDATE = 100;
+ private static final long CONSUMER2_ENDDATE = 21000;
+
+ private static final long PRODUCER_STARTDATE = 0;
+ private static final long PRODUCER_ENDDATE = 19000;
+
+ private static final long NUMBER_OF_MESSAGES_PROCESSED_PER_CONSUMER = 50;
+ private static final long NUMBER_OF_MESSAGES_CONSUMED_IN_TOTAL = NUMBER_OF_MESSAGES_PROCESSED_PER_CONSUMER * 2;
+ private static final long NUMBER_OF_MESSAGES_PRODUCED = NUMBER_OF_MESSAGES_PROCESSED_PER_CONSUMER * 2;
+
+ private static final int PAYLOAD_SIZE = 1024;
+ private static final long TOTAL_PAYLOAD_PROCESSED_PER_CONSUMER = NUMBER_OF_MESSAGES_PROCESSED_PER_CONSUMER * PAYLOAD_SIZE;
+ private static final long TOTAL_PAYLOAD_PRODUCED_IN_TOTAL = TOTAL_PAYLOAD_PROCESSED_PER_CONSUMER * 2;
+
+ private static final int EXPECTED_NUMBER_OF_AGGREGATED_RESULTS = 3;
+
+ private static final int BATCH_SIZE = 3;
+
+ private TestResultAggregator _aggregator = new TestResultAggregator();
+
+ public void testAggregateResultsForTwoConsumerAndOneProducer() throws Exception
+ {
+ TestResult originalTestResult = createResultsFromTest();
+
+ int numberOfOriginalParticipantResults = originalTestResult.getParticipantResults().size();
+ int expectedNumberOfResults = numberOfOriginalParticipantResults + EXPECTED_NUMBER_OF_AGGREGATED_RESULTS;
+
+ AggregatedTestResult aggregatedTestResult = _aggregator.aggregateTestResult(originalTestResult);
+
+ aggregatedTestResult.getAllConsumerParticipantResult().getTotalPayloadProcessed();
+ assertEquals(expectedNumberOfResults, aggregatedTestResult.getParticipantResults().size());
+
+ assertMinimalAggregatedResults(
+ aggregatedTestResult.getAllConsumerParticipantResult(),
+ TEST1_NAME, TEST1_ITERATION_NUMBER,
+ BATCH_SIZE, NUMBER_OF_MESSAGES_CONSUMED_IN_TOTAL, 2, 0);
+
+ assertMinimalAggregatedResults(
+ aggregatedTestResult.getAllProducerParticipantResult(),
+ TEST1_NAME, TEST1_ITERATION_NUMBER,
+ BATCH_SIZE, NUMBER_OF_MESSAGES_PRODUCED, 0, 1);
+
+ assertMinimalAggregatedResults(
+ aggregatedTestResult.getAllParticipantResult(),
+ TEST1_NAME, TEST1_ITERATION_NUMBER,
+ BATCH_SIZE, NUMBER_OF_MESSAGES_CONSUMED_IN_TOTAL, 2, 1);
+ }
+
+ public void testAggregateResultsWhenParticipantErrored()
+ {
+ ParticipantResult failedParticipantResult = new ParticipantResult();
+ failedParticipantResult.setParticipantName(PRODUCER_PARTICIPANT_NAME);
+ failedParticipantResult.setErrorMessage("error");
+ TestResult result = new TestResult(TEST1_NAME);
+ result.addParticipantResult(failedParticipantResult);
+
+ AggregatedTestResult aggregatedTestResult = _aggregator.aggregateTestResult(result);
+ assertEquals(TestResultAggregator.AGGREGATED_ERROR_MESSAGE, aggregatedTestResult.getAllParticipantResult().getErrorMessage());
+ }
+
+ private void assertMinimalAggregatedResults(ParticipantResult result, String expectedTestName, int expectedIterationNumber, int expectedBatchSize, long expectedNumberOfMessagesProcessed, int expectedTotalNumberOfConsumers, int expectedTotalNumberOfProducers)
+ {
+ assertEquals("Unexpected test name in " + result.getParticipantName(), expectedTestName, result.getTestName());
+ assertEquals("Unexpected iteration number in " + result.getParticipantName(), expectedIterationNumber, result.getIterationNumber());
+ assertEquals("Unexpected batch size " + result.getParticipantName(), expectedBatchSize, result.getBatchSize());
+ assertEquals("Unexpected number of messages processed in " + result.getParticipantName(), expectedNumberOfMessagesProcessed, result.getNumberOfMessagesProcessed());
+ assertEquals("Unexpected total number of consumers " + result.getParticipantName(), expectedTotalNumberOfConsumers, result.getTotalNumberOfConsumers());
+ assertEquals("Unexpected total number of producers " + result.getParticipantName(), expectedTotalNumberOfProducers, result.getTotalNumberOfProducers());
+ }
+
+ private TestResult createResultsFromTest()
+ {
+ TestResult testResult = new TestResult(TEST1_NAME);
+
+ ConsumerParticipantResult consumerResult1 = new ConsumerParticipantResult();
+ setPropertiesOn(consumerResult1, TEST1_NAME, TEST1_ITERATION_NUMBER, CONSUMER_PARTICIPANT_NAME1, NUMBER_OF_MESSAGES_PROCESSED_PER_CONSUMER, BATCH_SIZE, PAYLOAD_SIZE, TOTAL_PAYLOAD_PROCESSED_PER_CONSUMER, CONSUMER1_STARTDATE, CONSUMER1_ENDDATE, 1, 0);
+ testResult.addParticipantResult(consumerResult1);
+
+ ConsumerParticipantResult consumerResult2 = new ConsumerParticipantResult();
+ setPropertiesOn(consumerResult2, TEST1_NAME, TEST1_ITERATION_NUMBER, CONSUMER_PARTICIPANT_NAME2, NUMBER_OF_MESSAGES_PROCESSED_PER_CONSUMER, BATCH_SIZE, PAYLOAD_SIZE, TOTAL_PAYLOAD_PROCESSED_PER_CONSUMER, CONSUMER2_STARTDATE, CONSUMER2_ENDDATE, 1, 0);
+ testResult.addParticipantResult(consumerResult2);
+
+ ParticipantResult producerResult = new ProducerParticipantResult();
+ setPropertiesOn(producerResult, TEST1_NAME, TEST1_ITERATION_NUMBER, PRODUCER_PARTICIPANT_NAME, NUMBER_OF_MESSAGES_PRODUCED, BATCH_SIZE, PAYLOAD_SIZE, TOTAL_PAYLOAD_PRODUCED_IN_TOTAL, PRODUCER_STARTDATE, PRODUCER_ENDDATE, 0, 1);
+ testResult.addParticipantResult(producerResult);
+
+ return testResult;
+ }
+
+ private void setPropertiesOn(ParticipantResult participantResult, String testName, int iterationNumber, String participantName, long numberOfMessagesProcessed, int batchSize, int payloadSize, long totalPayloadProcessed, long start, long end, int totalNumberOfConsumers, int totalNumberOfProducers)
+ {
+ participantResult.setParticipantName(participantName);
+ participantResult.setTestName(testName);
+ participantResult.setIterationNumber(iterationNumber);
+ participantResult.setTotalNumberOfConsumers(totalNumberOfConsumers);
+ participantResult.setTotalNumberOfProducers(totalNumberOfProducers);
+
+ participantResult.setNumberOfMessagesProcessed(numberOfMessagesProcessed);
+ participantResult.setPayloadSize(payloadSize);
+ participantResult.setTotalPayloadProcessed(totalPayloadProcessed);
+ participantResult.setStartDate(new Date(start));
+ participantResult.setEndDate(new Date(end));
+ participantResult.setBatchSize(batchSize);
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVFormaterTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVFormaterTest.java
new file mode 100644
index 0000000000..088746d8cd
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVFormaterTest.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.formatting;
+
+import static org.apache.qpid.disttest.message.ParticipantAttribute.BATCH_SIZE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.CONFIGURED_CLIENT_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.*;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.ERROR_MESSAGE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_BROWSIING_SUBSCRIPTION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_DURABLE_SUBSCRIPTION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_NO_LOCAL;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_SELECTOR;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_SYNCHRONOUS_CONSUMER;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_TOPIC;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.ITERATION_NUMBER;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.MAXIMUM_DURATION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.NUMBER_OF_MESSAGES_PROCESSED;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PARTICIPANT_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PAYLOAD_SIZE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRIORITY;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRODUCER_INTERVAL;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRODUCER_START_DELAY;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TEST_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.THROUGHPUT;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TIME_TAKEN;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TIME_TO_LIVE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TOTAL_NUMBER_OF_CONSUMERS;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TOTAL_NUMBER_OF_PRODUCERS;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TOTAL_PAYLOAD_PROCESSED;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+import org.apache.qpid.disttest.controller.TestResult;
+import org.apache.qpid.disttest.message.ParticipantAttribute;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.qmf.QMFProperty.AccessCode;
+
+public class CSVFormaterTest extends TestCase
+{
+ private static final String TEST1 = "TEST1";
+ private static final String PARTICIPANT = "PARTICIPANT";
+ private static final String CONFIGURED_CLIENT1 = "CONFIGURED_CLIENT1";
+
+ private CSVFormater _formatter = new CSVFormater();
+
+ public void testResultsFileWithWithOneRow() throws Exception
+ {
+ ParticipantResult participantResult = mock(ParticipantResult.class);
+ Map<ParticipantAttribute, Object> participantAttributes = getParticipantAttributes();
+
+ when(participantResult.getAttributes()).thenReturn(participantAttributes);
+ when(participantResult.getParticipantName()).thenReturn(PARTICIPANT);
+
+ TestResult testResult = new TestResult(TEST1);
+ testResult.addParticipantResult(participantResult);
+
+ ResultsForAllTests resultsForAllTests = new ResultsForAllTests();
+ resultsForAllTests.add(testResult);
+
+ String output = _formatter.format(resultsForAllTests);
+
+ String expectedOutput = readCsvOutputFileAsString("expectedOutput.csv");
+
+ assertEquals(expectedOutput, output);
+ }
+
+ private Map<ParticipantAttribute, Object> getParticipantAttributes()
+ {
+ Map<ParticipantAttribute, Object> participantAttributes = new HashMap<ParticipantAttribute, Object>();
+
+ participantAttributes.put(TEST_NAME, TEST1);
+ participantAttributes.put(ITERATION_NUMBER, 0);
+ participantAttributes.put(CONFIGURED_CLIENT_NAME, CONFIGURED_CLIENT1);
+ participantAttributes.put(PARTICIPANT_NAME, PARTICIPANT);
+ participantAttributes.put(NUMBER_OF_MESSAGES_PROCESSED, 0);
+ participantAttributes.put(PAYLOAD_SIZE, 1);
+ participantAttributes.put(PRIORITY, 2);
+ participantAttributes.put(TIME_TO_LIVE, 3);
+ participantAttributes.put(ACKNOWLEDGE_MODE, 4);
+ participantAttributes.put(DELIVERY_MODE, 5);
+ participantAttributes.put(BATCH_SIZE, 6);
+ participantAttributes.put(MAXIMUM_DURATION, 7);
+ participantAttributes.put(PRODUCER_START_DELAY, 8);
+ participantAttributes.put(PRODUCER_INTERVAL, 9);
+ participantAttributes.put(IS_TOPIC, true);
+ participantAttributes.put(IS_DURABLE_SUBSCRIPTION, false);
+ participantAttributes.put(IS_BROWSIING_SUBSCRIPTION, true);
+ participantAttributes.put(IS_SELECTOR, false);
+ participantAttributes.put(IS_NO_LOCAL, true);
+ participantAttributes.put(IS_SYNCHRONOUS_CONSUMER, false);
+ participantAttributes.put(TOTAL_NUMBER_OF_CONSUMERS, 1);
+ participantAttributes.put(TOTAL_NUMBER_OF_PRODUCERS, 2);
+ participantAttributes.put(TOTAL_PAYLOAD_PROCESSED, 1024);
+ participantAttributes.put(THROUGHPUT, 2048);
+ participantAttributes.put(TIME_TAKEN, 1000);
+ participantAttributes.put(ERROR_MESSAGE, "error");
+
+ return participantAttributes;
+ }
+
+ private String readCsvOutputFileAsString(String filename) throws Exception
+ {
+ InputStream is = getClass().getResourceAsStream(filename);
+ assertNotNull(is);
+
+ StringBuilder output = new StringBuilder();
+
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+ String line = null;
+ while((line = br.readLine()) != null)
+ {
+ output.append(line);
+ output.append("\n");
+ }
+
+ return output.toString();
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparatorTest.java b/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparatorTest.java
new file mode 100644
index 0000000000..6cec4b5245
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparatorTest.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.formatting;
+
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.TestResultAggregator;
+import org.apache.qpid.disttest.results.formatting.CSVOrderParticipantResultComparator;
+
+public class CSVOrderParticipantResultComparatorTest extends TestCase
+{
+ CSVOrderParticipantResultComparator _comparator = new CSVOrderParticipantResultComparator();
+
+ public void testOrderedConsumerParticipants() throws Exception
+ {
+ assertCompare(
+ new ConsumerParticipantResult("apple"),
+ new ConsumerParticipantResult("banana"));
+
+ }
+ public void testProducerPrecedesConsumerParticipants() throws Exception
+ {
+ assertCompare(
+ new ProducerParticipantResult(),
+ new ConsumerParticipantResult());
+ }
+
+ public void testProducerPrecedesAllProducersResult()
+ {
+ assertCompare(
+ new ProducerParticipantResult("participantName"),
+ new ParticipantResult(TestResultAggregator.ALL_PRODUCER_PARTICIPANTS_NAME));
+ }
+
+ public void testConsumerPrecedesAllConsumersResult()
+ {
+ assertCompare(
+ new ConsumerParticipantResult("participantName"),
+ new ParticipantResult(TestResultAggregator.ALL_CONSUMER_PARTICIPANTS_NAME));
+ }
+
+ public void testAllParticipantsPrecedesAllConsumersResult()
+ {
+ assertCompare(
+ new ParticipantResult(TestResultAggregator.ALL_PARTICIPANTS_NAME),
+ new ParticipantResult(TestResultAggregator.ALL_CONSUMER_PARTICIPANTS_NAME));
+ }
+
+ public void testAllParticipantsPrecedesAllProducersResult()
+ {
+ assertCompare(
+ new ParticipantResult(TestResultAggregator.ALL_PARTICIPANTS_NAME),
+ new ParticipantResult(TestResultAggregator.ALL_PRODUCER_PARTICIPANTS_NAME));
+ }
+
+ private void assertCompare(ParticipantResult smaller, ParticipantResult bigger)
+ {
+ assertEquals("Expected " + smaller + " to 'equal' itself",
+ 0,
+ _comparator.compare(smaller, smaller));
+
+ String failureMsg = "Expected " + smaller + " to be smaller than " + bigger;
+
+ assertTrue(failureMsg, _comparator.compare(smaller, bigger) < 0);
+ assertTrue(failureMsg, _comparator.compare(bigger, smaller) > 0);
+ }
+
+}
+// <ParticipantResult>
diff --git a/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/expectedOutput.csv b/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/expectedOutput.csv
new file mode 100644
index 0000000000..cfffb1e549
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/expectedOutput.csv
@@ -0,0 +1,2 @@
+testName,iterationNumber,clientName,participantName,numberOfMessages,payloadSizeB,priority,timeToLiveMs,acknowledgeMode,deliveryMode,batchSize,maximumDurationMs,producerStartDelayMs,producerIntervalMs,isTopic,isDurableSubscription,isBrowsingSubscription,isSelector,isNoLocal,isSynchronousConsumer,totalNumberOfConsumers,totalNumberOfProducers,totalPayloadProcessedB,throughputKbPerS,timeTakenMs,errorMessage
+TEST1,0,CONFIGURED_CLIENT1,PARTICIPANT,0,1,2,3,4,5,6,7,8,9,true,false,true,false,true,false,1,2,1024,2048,1000,error \ No newline at end of file
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/DistributedTestSystemTestBase.java b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/DistributedTestSystemTestBase.java
new file mode 100644
index 0000000000..96daf64526
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/DistributedTestSystemTestBase.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.systest.disttest;
+
+import java.util.Properties;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.JMSException;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.apache.qpid.test.utils.QpidBrokerTestCase;
+
+public class DistributedTestSystemTestBase extends QpidBrokerTestCase
+{
+ protected Context _context;
+
+ protected Connection _connection;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ final Properties properties = new Properties();
+ properties.load(DistributedTestSystemTestBase.class.getResourceAsStream("perftests.systests.properties"));
+ _context = new InitialContext(properties);
+
+ _connection = getConnection();
+ _connection.start();
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ // no need to close connections - this is done by superclass
+
+ super.tearDown();
+ }
+
+ public Context getContext()
+ {
+ return _context;
+ }
+
+ @Override
+ public Connection getConnection() throws JMSException, NamingException
+ {
+ final ConnectionFactory connectionFactory = (ConnectionFactory) _context.lookup("connectionfactory");
+ final Connection connection = connectionFactory.createConnection();
+ _connections.add(connection);
+ return connection;
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/QpidQueueCreatorTest.java b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/QpidQueueCreatorTest.java
new file mode 100644
index 0000000000..784e43469e
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/QpidQueueCreatorTest.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.systest.disttest;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.jms.Connection;
+import javax.jms.Session;
+
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.client.AMQSession;
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.config.QueueConfig;
+import org.apache.qpid.disttest.jms.QpidQueueCreator;
+
+public class QpidQueueCreatorTest extends DistributedTestSystemTestBase
+{
+ private static final Map<String, Object> EMPTY_ATTRIBUTES = Collections.emptyMap();
+
+ private QpidQueueCreator _creator;
+ private Session _session;
+ private List<QueueConfig> _configs;
+ private String _queueName;
+
+ @Override
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ Connection connection = getConnection();
+ _session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _creator = new QpidQueueCreator();
+ _configs = new ArrayList<QueueConfig>();
+ _queueName = "direct://amq.direct//" + getTestQueueName();
+ }
+
+ public void testCreateQueueWithoutAttributes() throws Exception
+ {
+ _configs.add(new QueueConfig(_queueName, true, EMPTY_ATTRIBUTES));
+
+ assertQueueBound(_queueName, false);
+
+ _creator.createQueues(_session, _configs);
+
+ assertQueueBound(_queueName, true);
+ }
+
+ public void testCreateWithAttributes() throws Exception
+ {
+ Map<String, Object> attributes = new HashMap<String, Object>();
+ attributes.put("x-qpid-priorities", Integer.valueOf(5));
+ _configs.add(new QueueConfig(_queueName, true, attributes));
+
+ assertQueueBound(_queueName, false);
+
+ _creator.createQueues(_session, _configs);
+
+ assertQueueBound(_queueName, true);
+ }
+
+ public void testDeleteQueues() throws Exception
+ {
+ _configs.add(new QueueConfig(_queueName, true, EMPTY_ATTRIBUTES));
+
+ assertQueueBound(_queueName, false);
+
+ _creator.createQueues(_session, _configs);
+ assertQueueBound(_queueName, true);
+
+ _creator.deleteQueues(_session, _configs);
+ assertQueueBound(_queueName, false);
+ }
+
+ public void testDeleteQueueThatDoesNotExist() throws Exception
+ {
+ String queueThatDoesNotExist = _queueName;
+ List<QueueConfig> configs = new ArrayList<QueueConfig>();
+ Map<String, Object> attributes = Collections.emptyMap();
+ configs.add(new QueueConfig(queueThatDoesNotExist, true, attributes));
+
+ try
+ {
+ _creator.deleteQueues(_session, configs);
+ fail("Exception not thrown");
+ }
+ catch (DistributedTestException e)
+ {
+ // PASS
+ }
+ }
+
+ private void assertQueueBound(String queueName, boolean isBound) throws Exception
+ {
+ AMQDestination destination = (AMQDestination)_session.createQueue(queueName);
+ assertEquals("Queue is not in expected bound state", isBound, ((AMQSession<?, ?>)_session).isQueueBound(destination));
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/SystemTestConstants.java b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/SystemTestConstants.java
new file mode 100644
index 0000000000..808b428bc9
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/SystemTestConstants.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.systest.disttest;
+
+public abstract class SystemTestConstants
+{
+ public static final long REGISTRATION_TIMEOUT = 5000;
+ public static final long COMMAND_RESPONSE_TIMEOUT = 10000;
+ public static final long TEST_RESULT_TIMEOUT = 5000;
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/BasicDistributedClientTest.java b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/BasicDistributedClientTest.java
new file mode 100644
index 0000000000..d599bdc5c4
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/BasicDistributedClientTest.java
@@ -0,0 +1,186 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.systest.disttest.clientonly;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.client.ClientState;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.jms.JmsMessageAdaptor;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+
+public class BasicDistributedClientTest extends DistributedTestSystemTestBase
+{
+ private Session _session = null;
+ private MessageProducer _clientQueueProducer;
+ private Client _client;
+ private ControllerQueue _controllerQueue;
+ private ClientJmsDelegate _clientJmsDelegate = null;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _controllerQueue = new ControllerQueue(_connection, _context);
+ _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+ _clientJmsDelegate = new ClientJmsDelegate(_context);
+ _client = new Client(_clientJmsDelegate);
+ _client.start();
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ try
+ {
+ _controllerQueue.close();
+ if (_session != null)
+ {
+ _session.close();
+ }
+ }
+ finally
+ {
+ super.tearDown();
+ }
+ }
+
+ public void testClientSendsRegistrationMessage() throws Exception
+ {
+ final RegisterClientCommand regClientCommand = _controllerQueue.getNext();
+
+ assertNotNull("Client must have a non-null name", regClientCommand.getClientName());
+ assertEquals("Unexpected client name", _clientJmsDelegate.getClientName(), regClientCommand.getClientName());
+ assertNotNull("Client queue name should not be null", regClientCommand.getClientQueueName());
+ }
+
+ public void testClientSendsCommandResponses() throws Exception
+ {
+ final RegisterClientCommand registrationCommand = _controllerQueue.getNext();
+ createClientQueueProducer(registrationCommand);
+
+ sendCommandToClient(new NoOpCommand());
+
+ final Response responseCommand = _controllerQueue.getNext();
+ assertEquals("Incorrect client message type", CommandType.RESPONSE, responseCommand.getType());
+ }
+
+ public void testClientCanBeStoppedViaCommand() throws Exception
+ {
+ assertEquals("Expected client to be in STARTED state", ClientState.READY, _client.getState());
+
+ final RegisterClientCommand registrationCommand = _controllerQueue.getNext();
+ createClientQueueProducer(registrationCommand);
+
+ final Command stopClientCommand = new StopClientCommand();
+ sendCommandToClient(stopClientCommand);
+
+ _client.waitUntilStopped(1000);
+
+ Response response = _controllerQueue.getNext();
+ assertNotNull(response);
+ assertFalse("response shouldn't contain error", response.hasError());
+
+ assertEquals("Expected client to be in STOPPED state", ClientState.STOPPED, _client.getState());
+ }
+
+ public void testClientCanCreateTestConnection() throws Exception
+ {
+ assertEquals("Unexpected number of test connections", 0, _clientJmsDelegate.getNoOfTestConnections());
+
+ final RegisterClientCommand registration = _controllerQueue.getNext();
+ createClientQueueProducer(registration);
+
+ final CreateConnectionCommand createConnectionCommand = new CreateConnectionCommand();
+ createConnectionCommand.setConnectionName("newTestConnection");
+ createConnectionCommand.setConnectionFactoryName("connectionfactory");
+
+ sendCommandToClient(createConnectionCommand);
+ Response response = _controllerQueue.getNext();
+
+ assertFalse("Response message should not have indicated an error", response.hasError());
+ assertEquals("Unexpected number of test connections", 1, _clientJmsDelegate.getNoOfTestConnections());
+ }
+
+ public void testClientCanCreateTestSession() throws Exception
+ {
+ assertEquals("Unexpected number of test sessions", 0, _clientJmsDelegate.getNoOfTestSessions());
+
+ final RegisterClientCommand registration = _controllerQueue.getNext();
+ createClientQueueProducer(registration);
+
+ final CreateConnectionCommand createConnectionCommand = new CreateConnectionCommand();
+ createConnectionCommand.setConnectionName("newTestConnection");
+ createConnectionCommand.setConnectionFactoryName("connectionfactory");
+
+ sendCommandToClient(createConnectionCommand);
+ Response response = _controllerQueue.getNext();
+ assertFalse("Response message should not have indicated an error", response.hasError());
+
+ final CreateSessionCommand createSessionCommand = new CreateSessionCommand();
+ createSessionCommand.setConnectionName("newTestConnection");
+ createSessionCommand.setSessionName("newTestSession");
+ createSessionCommand.setAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
+
+ sendCommandToClient(createSessionCommand);
+ response = _controllerQueue.getNext();
+
+ assertFalse("Response message should not have indicated an error", response.hasError());
+ assertEquals("Unexpected number of test sessions", 1, _clientJmsDelegate.getNoOfTestSessions());
+ }
+
+ private void sendCommandToClient(final Command command) throws JMSException
+ {
+ final Message message = JmsMessageAdaptor.commandToMessage(_session, command);
+ _clientQueueProducer.send(message);
+ }
+
+ private void createClientQueueProducer(
+ final RegisterClientCommand registration) throws JMSException
+ {
+ final Destination clientCommandQueue = createDestinationFromRegistration(registration);
+ _clientQueueProducer = _session.createProducer(clientCommandQueue);
+ }
+
+ private Queue createDestinationFromRegistration(
+ final RegisterClientCommand registrationCommand)
+ throws JMSException
+ {
+ String clientQueueName = registrationCommand.getClientQueueName();
+ assertNotNull("Null client queue in register message", clientQueueName);
+ return _session.createQueue(clientQueueName);
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ConsumerParticipantTest.java b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ConsumerParticipantTest.java
new file mode 100644
index 0000000000..a3c0430865
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ConsumerParticipantTest.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.systest.disttest.clientonly;
+
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.client.ConsumerParticipant;
+import org.apache.qpid.disttest.client.ParticipantExecutor;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+import org.apache.qpid.systest.disttest.clientonly.ProducerParticipantTest.TestClientJmsDelegate;
+
+public class ConsumerParticipantTest extends DistributedTestSystemTestBase
+{
+ private MessageProducer _producer;
+ private Session _session;
+ private TestClientJmsDelegate _delegate;
+ private Client _client;
+ private ControllerQueue _controllerQueue;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _controllerQueue = new ControllerQueue(_connection, _context);
+ _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _producer = _session.createProducer(getTestQueue());
+
+ _delegate = new TestClientJmsDelegate(getContext());
+ _client = new Client(_delegate);
+ }
+
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ _controllerQueue.close();
+ super.tearDown();
+ }
+
+ public void testConsumeNumberOfMessagesSynchronously() throws Exception
+ {
+ runTest(Session.AUTO_ACKNOWLEDGE, 10, 0, true);
+ }
+
+ public void testConsumeNumberOfMessagesAsynchronously() throws Exception
+ {
+ runTest(Session.AUTO_ACKNOWLEDGE, 10, 0, false);
+ }
+
+ public void testSelectors() throws Exception
+ {
+ final CreateConsumerCommand command = new CreateConsumerCommand();
+ command.setNumberOfMessages(10);
+ command.setSessionName("testSession");
+ command.setDestinationName(getTestQueueName());
+ command.setSelector("id=1");
+ Session session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+ _delegate.addConnection("name-does-not-matter", _connection);
+ _delegate.addSession(command.getSessionName(), session);
+
+ ConsumerParticipant consumerParticipant = new ConsumerParticipant(_delegate, command);
+ _delegate.createConsumer(command);
+
+ for (int i = 0; i < 20; i++)
+ {
+ Message message = _session.createMessage();
+ if (i % 2 == 0)
+ {
+ message.setIntProperty("id", 0);
+ }
+ else
+ {
+ message.setIntProperty("id", 1);
+ }
+ _producer.send(message);
+ }
+
+ new ParticipantExecutor(consumerParticipant).start(_client);
+
+ ParticipantResult results = _controllerQueue.getNext();
+ assertNotNull("No results message recieved", results);
+ assertEquals("Unexpected number of messages received", 10, results.getNumberOfMessagesProcessed());
+
+ Session testQueueConsumerSession = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ final MessageConsumer testQueueConsumer = testQueueConsumerSession.createConsumer(getTestQueue());
+ for (int i = 0; i < 10; i++)
+ {
+ Message message = testQueueConsumer.receive(2000);
+ assertNotNull("Message is not received: " + message, message);
+ assertEquals("Unexpected id value", 0, message.getIntProperty("id"));
+ }
+ Message message = testQueueConsumer.receive(2000);
+ assertNull("Unexpected message remaining on test queue: " + message, message);
+
+ _connection.stop();
+ }
+
+ protected void runTest(int acknowledgeMode, int numberOfMessages, int batchSize, boolean synchronous) throws Exception
+ {
+ final CreateConsumerCommand command = new CreateConsumerCommand();
+ command.setNumberOfMessages(numberOfMessages);
+ command.setBatchSize(batchSize);
+ command.setSessionName("testSession");
+ command.setDestinationName(getTestQueueName());
+ command.setSynchronous(synchronous);
+
+ Session session = _connection.createSession(Session.SESSION_TRANSACTED == acknowledgeMode, acknowledgeMode);
+
+ _delegate.addConnection("name-does-not-matter", _connection);
+ _delegate.addSession(command.getSessionName(), session);
+
+ ConsumerParticipant consumerParticipant = new ConsumerParticipant(_delegate, command);
+ _delegate.createConsumer(command);
+
+ for (int i = 0; i < numberOfMessages; i++)
+ {
+ _producer.send(_session.createMessage());
+ }
+
+ new ParticipantExecutor(consumerParticipant).start(_client);
+
+ ParticipantResult results = _controllerQueue.getNext();
+ assertNotNull("No results message recieved", results);
+
+ Session testQueueConsumerSession = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ final MessageConsumer testQueueConsumer = testQueueConsumerSession.createConsumer(getTestQueue());
+ Message message = testQueueConsumer.receive(2000);
+ assertNull("Unexpected message remaining on test queue: " + message, message);
+
+ _connection.stop();
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ControllerQueue.java b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ControllerQueue.java
new file mode 100644
index 0000000000..7f0c23eb38
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ControllerQueue.java
@@ -0,0 +1,90 @@
+package org.apache.qpid.systest.disttest.clientonly;
+
+import java.util.Map;
+
+import javax.jms.Connection;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.Session;
+import javax.naming.Context;
+
+import junit.framework.Assert;
+
+import org.apache.qpid.disttest.DistributedTestConstants;
+import org.apache.qpid.disttest.jms.JmsMessageAdaptor;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+
+/**
+ * Helper for unit tests to simplify access to the Controller Queue.
+ *
+ * Implicitly creates the queue, so you must create a {@link ControllerQueue} object before
+ * trying to use the underlying queue.
+ */
+public class ControllerQueue
+{
+ private MessageConsumer _controllerQueueMessageConsumer;
+ private Session _controllerQueueSession;
+
+ /**
+ * Implicitly creates the queue, so you must create a {@link ControllerQueue} object before
+ * trying to use the underlying queue.
+ *
+ * @param context used for looking up the controller queue {@link Destination}
+ */
+ public ControllerQueue(Connection connection, Context context) throws Exception
+ {
+ _controllerQueueSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ Destination controllerQueue = (Destination) context.lookup(DistributedTestConstants.CONTROLLER_QUEUE_JNDI_NAME);
+ _controllerQueueMessageConsumer = _controllerQueueSession.createConsumer(controllerQueue);
+ }
+
+ public <T extends Command> T getNext(long timeout) throws JMSException
+ {
+ final Message message = _controllerQueueMessageConsumer.receive(timeout);
+ if(message == null)
+ {
+ return null;
+ }
+
+ return (T) JmsMessageAdaptor.messageToCommand(message);
+ }
+
+ public void addNextResponse(Map<CommandType, Command> responses) throws JMSException
+ {
+ Command nextResponse = getNext();
+ responses.put(nextResponse.getType(), nextResponse);
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T extends Command> T getNext() throws JMSException
+ {
+ return (T)getNext(true);
+ }
+
+ public <T extends Command> T getNext(boolean assertMessageExists) throws JMSException
+ {
+ final Message message = _controllerQueueMessageConsumer.receive(1000);
+ if(assertMessageExists)
+ {
+ Assert.assertNotNull("No message received from control queue", message);
+ }
+
+ if(message == null)
+ {
+ return null;
+ }
+
+ T command = (T) JmsMessageAdaptor.messageToCommand(message);
+
+ return command;
+ }
+
+ public void close() throws Exception
+ {
+ _controllerQueueMessageConsumer.close();
+ _controllerQueueSession.close();
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/DistributedClientTest.java b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/DistributedClientTest.java
new file mode 100644
index 0000000000..4a872a7ee2
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/DistributedClientTest.java
@@ -0,0 +1,323 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.systest.disttest.clientonly;
+
+import static org.apache.qpid.disttest.client.ClientState.READY;
+import static org.apache.qpid.disttest.client.ClientState.RUNNING_TEST;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.client.ClientState;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.jms.JmsMessageAdaptor;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StartTestCommand;
+import org.apache.qpid.disttest.message.TearDownTestCommand;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+
+public class DistributedClientTest extends DistributedTestSystemTestBase
+{
+ private static final String TEST_CONSUMER = "newTestConsumer";
+ private static final String TEST_DESTINATION = "newDestination";
+ private static final String TEST_PRODUCER_NAME = "newTestProducer";
+ private static final String TEST_SESSION_NAME = "newTestSession";
+ private static final String TEST_CONNECTION_NAME = "newTestConnection";
+
+ private Session _session = null;
+ private MessageProducer _clientQueueProducer;
+ private Client _client;
+ private ControllerQueue _controllerQueue;
+ protected ClientJmsDelegate _clientJmsDelegate;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _controllerQueue = new ControllerQueue(_connection, _context);
+
+ _clientJmsDelegate = new ClientJmsDelegate(_context);
+ _client = new Client(_clientJmsDelegate);
+ _client.start();
+
+ final RegisterClientCommand registrationCommand = _controllerQueue.getNext();
+ createClientQueueProducer(registrationCommand);
+
+ createTestConnection(TEST_CONNECTION_NAME);
+ createTestSession(TEST_CONNECTION_NAME, TEST_SESSION_NAME);
+
+ assertEquals("Expected no test producers at start of test", 0, _clientJmsDelegate.getNoOfTestProducers());
+ assertEquals("Expected no test consumers at start of test", 0, _clientJmsDelegate.getNoOfTestConsumers());
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ try
+ {
+ _controllerQueue.close();
+ if (_session != null)
+ {
+ _session.close();
+ }
+ }
+ finally
+ {
+ super.tearDown();
+ }
+ }
+
+ public void testClientCanCreateTestProducer() throws Exception
+ {
+ assertEquals("Should initially have zero producers", 0, _clientJmsDelegate.getNoOfTestProducers());
+
+ createTestProducer(TEST_SESSION_NAME, TEST_PRODUCER_NAME, TEST_DESTINATION);
+
+ assertEquals("Should now have one test producer", 1, _clientJmsDelegate.getNoOfTestProducers());
+ }
+
+ public void testClientCanCreateTestConsumer() throws Exception
+ {
+ assertEquals("Should initially have no test consumers", 0, _clientJmsDelegate.getNoOfTestConsumers());
+
+ createTestConsumer(TEST_SESSION_NAME, TEST_CONSUMER, TEST_DESTINATION);
+
+ assertEquals("Should now have one test consumer", 1, _clientJmsDelegate.getNoOfTestConsumers());
+ }
+
+ public void testClientFailsToCreateSessionUsingInvalidConnection() throws Exception
+ {
+ int initialNoOfTestSessions = _clientJmsDelegate.getNoOfTestSessions();
+
+ createTestSession("nonExistentConnection", TEST_SESSION_NAME, false /* shouldSucceed */);
+
+ assertEquals("Number of test sessions should not have changed", initialNoOfTestSessions, _clientJmsDelegate.getNoOfTestSessions());
+ }
+
+ public void testClientFailsToCreateProducerUsingInvalidSession() throws Exception
+ {
+ int initialNoOfTestProducers = _clientJmsDelegate.getNoOfTestProducers();
+
+ createTestProducer("invalidSessionName", TEST_PRODUCER_NAME, TEST_DESTINATION, false /* shouldSucceed */);
+
+ assertEquals("Number of test producers should not have changed", initialNoOfTestProducers, _clientJmsDelegate.getNoOfTestProducers());
+ }
+
+ public void testClientFailsToCreateConsumerUsingInvalidSession() throws Exception
+ {
+ int initialNoOfTestConsumers = _clientJmsDelegate.getNoOfTestConsumers();
+
+ createTestConsumer("invalidSessionName", TEST_CONSUMER, TEST_DESTINATION, false /* shouldSucceed */);
+
+ assertEquals("Number of test consumers should not have changed", initialNoOfTestConsumers, _clientJmsDelegate.getNoOfTestConsumers());
+ }
+
+ public void testClientCanStartPerformingTests() throws Exception
+ {
+ createTestProducer(TEST_SESSION_NAME, TEST_PRODUCER_NAME, TEST_DESTINATION);
+
+ sendCommandToClient(new StartTestCommand());
+
+ validateStartTestResponseAndParticipantResults(CommandType.PRODUCER_PARTICIPANT_RESULT);
+
+ assertState(_client, RUNNING_TEST);
+ }
+
+ public void testParticipantsSendResults() throws JMSException
+ {
+ createTestProducer(TEST_SESSION_NAME, TEST_PRODUCER_NAME, TEST_DESTINATION);
+
+ sendCommandToClient(new StartTestCommand());
+
+ validateStartTestResponseAndParticipantResults(CommandType.PRODUCER_PARTICIPANT_RESULT);
+ }
+
+ /**
+ * Need to validate both of these responses together because their order is non-deterministic
+ * @param expectedParticipantResultCommandType TODO
+ */
+ private void validateStartTestResponseAndParticipantResults(CommandType expectedParticipantResultCommandType) throws JMSException
+ {
+ Map<CommandType, Command> responses = new HashMap<CommandType, Command>();
+ _controllerQueue.addNextResponse(responses);
+ _controllerQueue.addNextResponse(responses);
+
+ ParticipantResult results = (ParticipantResult) responses.get(expectedParticipantResultCommandType);
+ validateResponse(null, results, true);
+
+ Response startTestResponse = (Response) responses.get(CommandType.RESPONSE);
+ validateResponse(CommandType.START_TEST, startTestResponse, true);
+ }
+
+ public void testClientCannotStartPerformingTestsInNonReadyState() throws Exception
+ {
+ assertState(_client, READY);
+ sendCommandAndValidateResponse(new StartTestCommand(), true);
+ assertState(_client, RUNNING_TEST);
+
+ // Send another start test command
+ sendCommandAndValidateResponse(new StartTestCommand(), false /*should reject duplicate start command*/);
+ assertState(_client, RUNNING_TEST);
+ }
+
+ public void testNonRunningClientIsUnaffectedByStopTestCommand() throws Exception
+ {
+ assertState(_client, READY);
+
+ sendCommandAndValidateResponse(new TearDownTestCommand(), false);
+
+ assertState(_client, READY);
+ }
+
+ private void sendCommandToClient(final Command command) throws JMSException
+ {
+ final Message message = JmsMessageAdaptor.commandToMessage(_session, command);
+ _clientQueueProducer.send(message);
+ }
+
+ private void sendCommandAndValidateResponse(final Command command, boolean shouldSucceed) throws JMSException
+ {
+ sendCommandToClient(command);
+ Response response = _controllerQueue.getNext();
+ validateResponse(command.getType(), response, shouldSucceed);
+ }
+
+ private void sendCommandAndValidateResponse(final Command command) throws JMSException
+ {
+ sendCommandAndValidateResponse(command, true);
+ }
+
+ private void createTestConnection(String connectionName) throws Exception
+ {
+ int initialNumberOfConnections = _clientJmsDelegate.getNoOfTestConnections();
+
+ final CreateConnectionCommand createConnectionCommand = new CreateConnectionCommand();
+ createConnectionCommand.setConnectionName(connectionName);
+ createConnectionCommand.setConnectionFactoryName("connectionfactory");
+
+ sendCommandAndValidateResponse(createConnectionCommand);
+
+ int expectedNumberOfConnections = initialNumberOfConnections + 1;
+
+ assertEquals("unexpected number of test connections", expectedNumberOfConnections, _clientJmsDelegate.getNoOfTestConnections());
+ }
+
+ private void createTestSession(String connectionName, String sessionName, boolean shouldSucceed) throws Exception
+ {
+ int initialNumberOfSessions = _clientJmsDelegate.getNoOfTestSessions();
+
+ final CreateSessionCommand createSessionCommand = new CreateSessionCommand();
+ createSessionCommand.setConnectionName(connectionName);
+ createSessionCommand.setSessionName(sessionName);
+ createSessionCommand.setAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
+
+ sendCommandAndValidateResponse(createSessionCommand, shouldSucceed);
+
+ int expectedNumberOfSessions = initialNumberOfSessions + (shouldSucceed ? 1 : 0);
+
+ assertEquals("unexpected number of test sessions", expectedNumberOfSessions, _clientJmsDelegate.getNoOfTestSessions());
+ }
+
+ private void createTestSession(String connectionName, String sessionName) throws Exception
+ {
+ createTestSession(connectionName, sessionName, true);
+ }
+
+ private void createTestProducer(String sessionName, String producerName, String destinationName, boolean shouldSucceed) throws JMSException
+ {
+ final CreateProducerCommand createProducerCommand = new CreateProducerCommand();
+ createProducerCommand.setParticipantName(producerName);
+ createProducerCommand.setSessionName(sessionName);
+ createProducerCommand.setDestinationName(destinationName);
+ createProducerCommand.setNumberOfMessages(100);
+
+ sendCommandAndValidateResponse(createProducerCommand, shouldSucceed);
+ }
+
+ private void createTestProducer(String sessionName, String producerName, String destinationName) throws JMSException
+ {
+ createTestProducer(sessionName, producerName, destinationName, true);
+ }
+
+ private void createTestConsumer(String sessionName, String consumerName, String destinationName, boolean shouldSucceed) throws JMSException
+ {
+ final CreateConsumerCommand createConsumerCommand = new CreateConsumerCommand();
+ createConsumerCommand.setSessionName(sessionName);
+ createConsumerCommand.setDestinationName(destinationName);
+ createConsumerCommand.setParticipantName(consumerName);
+ createConsumerCommand.setNumberOfMessages(1);
+
+ sendCommandAndValidateResponse(createConsumerCommand, shouldSucceed);
+ }
+
+ private void createTestConsumer(String sessionName, String consumerName, String destinationName) throws JMSException
+ {
+ createTestConsumer(sessionName, consumerName, destinationName, true);
+ }
+
+ private void validateResponse(CommandType originatingCommandType, Response response, boolean shouldSucceed) throws JMSException
+ {
+ assertEquals("Response is a reply to the wrong command: " + response,
+ originatingCommandType,
+ response.getInReplyToCommandType());
+
+ boolean shouldHaveError = !shouldSucceed;
+ assertEquals("Response message " + response + " should have indicated hasError=" + shouldHaveError,
+ shouldHaveError,
+ response.hasError());
+ }
+
+ private void createClientQueueProducer(final RegisterClientCommand registration) throws JMSException
+ {
+ final Destination clientCommandQueue = createDestinationFromRegistration(registration);
+ _clientQueueProducer = _session.createProducer(clientCommandQueue);
+ }
+
+ private Queue createDestinationFromRegistration(final RegisterClientCommand registrationCommand) throws JMSException
+ {
+ String clientQueueName = registrationCommand.getClientQueueName();
+ assertNotNull("Null client queue in register message", clientQueueName);
+ return _session.createQueue(clientQueueName);
+ }
+
+ private static void assertState(Client client, ClientState expectedState)
+ {
+ ClientState clientState = client.getState();
+ assertEquals("Client should be in state: " + expectedState + " but is in state " + clientState, expectedState, clientState);
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/MessageProviderTest.java b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/MessageProviderTest.java
new file mode 100644
index 0000000000..dcbff6518b
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/MessageProviderTest.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.systest.disttest.clientonly;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jms.DeliveryMode;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import org.apache.qpid.disttest.client.MessageProvider;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.client.property.SimplePropertyValue;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+import org.apache.qpid.systest.disttest.clientonly.ProducerParticipantTest.TestClientJmsDelegate;
+
+public class MessageProviderTest extends DistributedTestSystemTestBase
+{
+ private MessageConsumer _consumer;
+ private Session _session;
+ private TestClientJmsDelegate _delegate;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _consumer = _session.createConsumer(getTestQueue());
+ _delegate = new TestClientJmsDelegate(getContext());
+ }
+
+ public void testMessageSize() throws Exception
+ {
+ runSizeTest(0);
+ runSizeTest(5);
+ runSizeTest(512);
+ }
+
+ public void runSizeTest(int size) throws Exception
+ {
+ CreateProducerCommand command = new CreateProducerCommand();
+ command.setMessageSize(size);
+ MessageProvider messageProvider = new MessageProvider(null);
+ Message message = messageProvider.nextMessage(_session, command);
+ assertNotNull("Message is not generated", message);
+ assertTrue("Wrong message type", message instanceof TextMessage);
+ TextMessage textMessage = (TextMessage)message;
+ String text = textMessage.getText();
+ assertNotNull("Message payload is not generated", text);
+ assertEquals("Message payload size is incorrect", size, text.length());
+ }
+
+ public void testCreateMessageProviderAndSendMessage() throws Exception
+ {
+ final CreateMessageProviderCommand messageProviderCommand = new CreateMessageProviderCommand();
+ messageProviderCommand.setProviderName("test1");
+ Map<String, PropertyValue> messageProperties = new HashMap<String, PropertyValue>();
+ messageProperties.put("test", new SimplePropertyValue("testValue"));
+ messageProperties.put("priority", new SimplePropertyValue(new Integer(9)));
+ messageProviderCommand.setMessageProperties(messageProperties);
+ _delegate.createMessageProvider(messageProviderCommand);
+
+ final CreateProducerCommand producerCommand = new CreateProducerCommand();
+ producerCommand.setNumberOfMessages(1);
+ producerCommand.setDeliveryMode(DeliveryMode.PERSISTENT);
+ producerCommand.setPriority(6);
+ producerCommand.setParticipantName("test");
+ producerCommand.setMessageSize(10);
+ producerCommand.setSessionName("testSession");
+ producerCommand.setDestinationName(getTestQueueName());
+ producerCommand.setMessageProviderName(messageProviderCommand.getProviderName());
+
+ Session session = _connection.createSession(true, Session.SESSION_TRANSACTED);
+ _delegate.addConnection("name-does-not-matter", _connection);
+ _delegate.addSession(producerCommand.getSessionName(), session);
+ _delegate.createProducer(producerCommand);
+
+ Message message = _delegate.sendNextMessage(producerCommand);
+ session.commit();
+ assertMessage(message);
+
+ _connection.start();
+ Message receivedMessage = _consumer.receive(1000l);
+ assertMessage(receivedMessage);
+ }
+
+ protected void assertMessage(Message message) throws JMSException
+ {
+ assertNotNull("Message should not be null", message);
+ assertEquals("Unexpected test property", "testValue", message.getStringProperty("test"));
+ assertEquals("Unexpected priority property", 9, message.getJMSPriority());
+ assertTrue("Unexpected message type", message instanceof TextMessage);
+ String text = ((TextMessage)message).getText();
+ assertNotNull("Message text should not be null", text);
+ assertNotNull("Unexpected message size ", text.length());
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ProducerParticipantTest.java b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ProducerParticipantTest.java
new file mode 100644
index 0000000000..54bb9efa98
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ProducerParticipantTest.java
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.systest.disttest.clientonly;
+
+import javax.jms.Connection;
+import javax.jms.DeliveryMode;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.Context;
+
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.client.ParticipantExecutor;
+import org.apache.qpid.disttest.client.ProducerParticipant;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+
+public class ProducerParticipantTest extends DistributedTestSystemTestBase
+{
+ private MessageConsumer _consumer;
+ private TestClientJmsDelegate _delegate;
+ private Client _client;
+ private ControllerQueue _controllerQueue;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _controllerQueue = new ControllerQueue(_connection, _context);
+ Session session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _consumer = session.createConsumer(getTestQueue());
+
+ _delegate = new TestClientJmsDelegate(getContext());
+ _client = new Client(_delegate);
+ }
+
+
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ _controllerQueue.close();
+ super.tearDown();
+ }
+
+
+
+ public void testProduceNumberOfMessages() throws Exception
+ {
+ runTest(Session.AUTO_ACKNOWLEDGE, 100, 10, 0, 0);
+ }
+
+ protected void runTest(int acknowledgeMode, int messageSize, int numberOfMessages, int batchSize, long publishInterval) throws Exception
+ {
+ final CreateProducerCommand command = new CreateProducerCommand();
+ command.setNumberOfMessages(numberOfMessages);
+ command.setDeliveryMode(DeliveryMode.PERSISTENT);
+ command.setParticipantName("test");
+ command.setMessageSize(messageSize);
+ command.setBatchSize(batchSize);
+ command.setInterval(publishInterval);
+ command.setSessionName("testSession");
+ command.setDestinationName(getTestQueueName());
+
+ Session session = _connection.createSession(Session.SESSION_TRANSACTED == acknowledgeMode, acknowledgeMode);
+
+ _delegate.addConnection("name-does-not-matter", _connection);
+ _delegate.addSession(command.getSessionName(), session);
+ _delegate.createProducer(command);
+
+ final ProducerParticipant producer = new ProducerParticipant(_delegate, command);
+
+ new ParticipantExecutor(producer).start(_client);
+
+ _connection.start();
+ for (int i = 0; i < numberOfMessages; i++)
+ {
+ final Message m = _consumer.receive(1000l);
+ assertNotNull("Expected message [" + i + "] is not received", m);
+ assertTrue("Unexpected message", m instanceof TextMessage);
+ }
+ Message m = _consumer.receive(500l);
+ assertNull("Unexpected message", m);
+
+ ParticipantResult results = _controllerQueue.getNext();
+
+ assertNotNull("no results", results);
+ assertFalse(results.getStartInMillis() == 0);
+ assertFalse(results.getEndInMillis() == 0);
+ }
+
+ static class TestClientJmsDelegate extends ClientJmsDelegate
+ {
+
+ public TestClientJmsDelegate(Context context)
+ {
+ super(context);
+ }
+
+ @Override
+ public void addSession(final String sessionName, final Session newSession)
+ {
+ super.addSession(sessionName, newSession);
+ }
+
+ @Override
+ public void addConnection(final String connectionName, final Connection newConnection)
+ {
+ super.addConnection(connectionName, newConnection);
+ }
+ }
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/ControllerAndClientTest.java b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/ControllerAndClientTest.java
new file mode 100644
index 0000000000..9fd90d3215
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/ControllerAndClientTest.java
@@ -0,0 +1,249 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.systest.disttest.controllerandclient;
+
+import static org.apache.qpid.systest.disttest.SystemTestConstants.COMMAND_RESPONSE_TIMEOUT;
+import static org.apache.qpid.systest.disttest.SystemTestConstants.REGISTRATION_TIMEOUT;
+import static org.apache.qpid.systest.disttest.SystemTestConstants.TEST_RESULT_TIMEOUT;
+
+import java.util.List;
+
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.naming.NamingException;
+
+import org.apache.qpid.disttest.ConfigFileHelper;
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.client.ClientState;
+import org.apache.qpid.disttest.controller.Controller;
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+import org.apache.qpid.disttest.controller.TestResult;
+import org.apache.qpid.disttest.controller.config.Config;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.ITestResult;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ControllerAndClientTest extends DistributedTestSystemTestBase
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ControllerAndClientTest.class);
+ private static final long CLIENT_BACKGROUND_THREAD_WAIT_TIME = 5000;
+
+ private Controller _controller;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _controller = new Controller(new ControllerJmsDelegate(_context), REGISTRATION_TIMEOUT, COMMAND_RESPONSE_TIMEOUT);
+ _controller.setTestResultTimeout(TEST_RESULT_TIMEOUT);
+ }
+
+ public void testProducerAndConsumerInSeparateClients() throws Exception
+ {
+ List<TestResult> resultList = runTestsForTwoClients("producerAndConsumerInSeparateClients.json", 1);
+
+ TestResult testResult1 = resultList.get(0);
+ assertEquals("Unexpected test name", "Test 1", testResult1.getName());
+ List<ParticipantResult> test1ParticipantResults = testResult1.getParticipantResults();
+ assertEquals("Unexpected number of participant results for test 1", 2, test1ParticipantResults.size());
+ assertParticipantNames(test1ParticipantResults, "participantConsumer1", "participantProducer1");
+ }
+
+ public void testProducerClient() throws Exception
+ {
+ Session session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ Queue queue = session.createQueue("producerClient");
+ MessageConsumer consumer = session.createConsumer(queue);
+
+ // queue is not declared in configuration
+ // controller is not able to clean it
+ // cleaning manually
+ while(consumer.receive(1000l) != null);
+
+ final Config config = ConfigFileHelper.getConfigFromResource(getClass(), "produceClient.json");
+ _controller.setConfig(config);
+ final Client client1 = new Client(new ClientJmsDelegate(_context));
+ final Thread client1Thread = createBackgroundClientThread(client1);
+ _controller.awaitClientRegistrations();
+
+ ResultsForAllTests results = _controller.runAllTests();
+ _controller.stopAllRegisteredClients();
+
+ assertClientThreadsShutdown(client1Thread);
+ assertClientsStopped(ClientState.STOPPED, client1);
+ assertFalse("Test should have no errors", results.hasErrors());
+ List<ITestResult> allTestResults = results.getTestResults();
+ assertEquals("Unexpected number of test results", 1, allTestResults.size());
+ ITestResult testResult1 = allTestResults.get(0);
+ assertEquals("Unexpected test name", "Test 1", testResult1.getName());
+ List<ParticipantResult> test1ParticipantResults = testResult1.getParticipantResults();
+ assertEquals("Unexpected number of participant results for test 1", 1, test1ParticipantResults.size());
+ assertParticipantNames(test1ParticipantResults, "participantProducer1");
+
+ // check message properties
+ for (int i=0; i< 10; i++)
+ {
+ Message message = consumer.receive(1000l);
+ assertNotNull("Message " + i + " is not received", message);
+ assertEquals("Unexpected priority", i, message.getJMSPriority());
+ assertEquals("Unexpected id", i, message.getIntProperty("id"));
+ assertEquals("Unexpected test", "test-value", message.getStringProperty("test"));
+ }
+ }
+
+ public void testProducerAndThreeConsumersInSeparateClients() throws Exception
+ {
+ List<TestResult> resultList = runTestsForTwoClients("producerAndThreeConsumersInSeparateClients.json", 1);
+
+ TestResult testResult1 = resultList.get(0);
+ List<ParticipantResult> test1ParticipantResults = testResult1.getParticipantResults();
+ assertEquals("Unexpected number of participant results for test", 4, test1ParticipantResults.size());
+
+ assertParticipantNames(test1ParticipantResults, "participantConsumer1", "participantConsumer2", "participantConsumer3", "participantProducer1");
+
+ ConsumerParticipantResult consumer1 = (ConsumerParticipantResult) test1ParticipantResults.get(0);
+ assertEquals(3, consumer1.getNumberOfMessagesProcessed());
+ assertEquals(true, consumer1.isSynchronousConsumer());
+
+ ProducerParticipantResult producer1 = (ProducerParticipantResult) test1ParticipantResults.get(3);
+ assertEquals(9, producer1.getNumberOfMessagesProcessed());
+ assertEquals(2, producer1.getBatchSize());
+ assertEquals(50, producer1.getInterval());
+ }
+
+ public void testIteratingFeature() throws Exception
+ {
+ List<TestResult> resultList = runTestsForTwoClients("iteratingFeature.json", 2);
+
+ assertTestResultMessageSize(resultList.get(0), 0, 100, 10);
+ assertTestResultMessageSize(resultList.get(1), 1, 200, 5);
+
+ }
+
+ private void assertTestResultMessageSize(TestResult testResult, int iterationNumber, int expectedMessageSize, int expectedNumberOfMessages)
+ {
+ List<ParticipantResult> test1ParticipantResults = testResult.getParticipantResults();
+ assertEquals("Unexpected number of participant results for test", 2, test1ParticipantResults.size());
+
+ ParticipantResult producer1 = (ParticipantResult) test1ParticipantResults.get(1);
+
+ assertEquals(expectedMessageSize, producer1.getPayloadSize());
+ assertEquals(iterationNumber, producer1.getIterationNumber());
+ }
+
+ public void testTwoTests() throws Exception
+ {
+ List<TestResult> resultList = runTestsForTwoClients("testWithTwoTests.json", 2);
+
+ assertEquals("Test 1", resultList.get(0).getName());
+ assertEquals("Test 2", resultList.get(1).getName());
+ }
+
+ private List<TestResult> runTestsForTwoClients(String jsonConfigFile, int expectedNumberOfTests) throws NamingException, InterruptedException
+ {
+ final Config config = ConfigFileHelper.getConfigFromResource(getClass(), jsonConfigFile);
+ _controller.setConfig(config);
+
+ final Client client1 = new Client(new ClientJmsDelegate(_context));
+ final Client client2 = new Client(new ClientJmsDelegate(_context));
+
+ final Thread client1Thread = createBackgroundClientThread(client1);
+ final Thread client2Thread = createBackgroundClientThread(client2);
+
+ _controller.awaitClientRegistrations();
+
+ ResultsForAllTests results = _controller.runAllTests();
+ _controller.stopAllRegisteredClients();
+
+ assertClientThreadsShutdown(client1Thread, client2Thread);
+ assertClientsStopped(ClientState.STOPPED, client1, client2);
+
+ assertFalse("Test should have no errors", results.hasErrors());
+
+ List<TestResult> allTestResults = (List)results.getTestResults();
+ assertEquals("Unexpected number of test results", expectedNumberOfTests, allTestResults.size());
+
+ return allTestResults;
+ }
+
+
+ private void assertParticipantNames(List<ParticipantResult> participants, String... expectedOrderedParticipantNames)
+ {
+ assertEquals("Size of list of expected participant names is different from actual", expectedOrderedParticipantNames.length, participants.size());
+
+ for (int i = 0; i < expectedOrderedParticipantNames.length; i++)
+ {
+ String expectedParticipantName = expectedOrderedParticipantNames[i];
+ ParticipantResult participant = participants.get(i);
+ assertEquals(expectedParticipantName, participant.getParticipantName());
+ }
+ }
+
+ private void assertClientsStopped(ClientState expectedState, final Client... clients)
+ {
+ for (Client client : clients)
+ {
+ assertEquals(client.getClientName() + " in unexpected state", expectedState, client.getState());
+ }
+ }
+
+ private void assertClientThreadsShutdown(final Thread... clientThreads)
+ throws InterruptedException
+ {
+ for (Thread clientThread : clientThreads)
+ {
+ clientThread.join(2000);
+ assertFalse(clientThread.getName() + " should have shutdown", clientThread.isAlive());
+ }
+ }
+
+ private Thread createBackgroundClientThread(final Client client) throws NamingException
+ {
+ final String clientThreadName = client.getClientName() + "-thread";
+ final Thread clientThread = new Thread(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ try
+ {
+ client.start();
+ client.waitUntilStopped(CLIENT_BACKGROUND_THREAD_WAIT_TIME);
+ }
+ finally
+ {
+ LOGGER.debug("Client thread {} finished", clientThreadName);
+ }
+ }
+ }, clientThreadName);
+ clientThread.start();
+ return clientThread;
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/iteratingFeature.json b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/iteratingFeature.json
new file mode 100644
index 0000000000..89123302b7
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/iteratingFeature.json
@@ -0,0 +1,63 @@
+{
+ "_tests":[
+ {
+ "_name": "Test iteration feature",
+ "_iterations":[
+ {
+ "_messageSize": 100,
+ "_numberOfMessages": 10
+ },
+ {
+ "_messageSize": 200,
+ "_numberOfMessages": 5
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer1",
+ "_destinationName": "direct://amq.direct//testQueue"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "participantConsumer1",
+ "_destinationName": "direct://amq.direct//testQueue"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+} \ No newline at end of file
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/produceClient.json b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/produceClient.json
new file mode 100644
index 0000000000..605e5cb585
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/produceClient.json
@@ -0,0 +1,41 @@
+{
+ "_tests":[
+ {
+ "_name": "Test 1";
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer1",
+ "_destinationName": "direct://amq.direct//producerClient",
+ "_numberOfMessages": 10;
+ "_messageProviderName": "testProvider1"
+ }
+ ]
+ }
+ ]
+ }
+ ];
+ "_messageProviders":[
+ {
+ "_name": "testProvider1";
+ "_messageProperties": {
+ "priority": {"@def": "list"; "_items": [0,1,2,3,4,5,6,7,8,9]};
+ "id": {"@def": "range"; "_upper": 10; "_type": "int"};
+ "test": "test-value"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndConsumerInSeparateClients.json b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndConsumerInSeparateClients.json
new file mode 100644
index 0000000000..8d210dce84
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndConsumerInSeparateClients.json
@@ -0,0 +1,55 @@
+{
+ "_tests":[
+ {
+ "_name": "Test 1";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "participantConsumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+} \ No newline at end of file
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndThreeConsumersInSeparateClients.json b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndThreeConsumersInSeparateClients.json
new file mode 100644
index 0000000000..f94c4f0ae0
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndThreeConsumersInSeparateClients.json
@@ -0,0 +1,77 @@
+{
+ "_tests":[
+ {
+ "_name": "ProducerAndThreeConsumersInSeparateClients";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 9,
+ "_batchSize": 2,
+ "_interval": 50
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "participantConsumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 3
+ }
+ ]
+ },
+ {
+ "_sessionName": "session2",
+ "_consumers": [
+ {
+ "_name": "participantConsumer2",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 3
+ }
+ ]
+ },
+ {
+ "_sessionName": "session3",
+ "_consumers": [
+ {
+ "_name": "participantConsumer3",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 3
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+} \ No newline at end of file
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/testWithTwoTests.json b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/testWithTwoTests.json
new file mode 100644
index 0000000000..4abd7f4feb
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/testWithTwoTests.json
@@ -0,0 +1,107 @@
+{
+ "_tests":[
+ {
+ "_name": "Test 1";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "participantconsumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Test 2";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue2"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer2",
+ "_destinationName": "direct://amq.direct//testQueue2",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "participantConsumer2",
+ "_destinationName": "direct://amq.direct//testQueue2",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+} \ No newline at end of file
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/DistributedControllerTest.java b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/DistributedControllerTest.java
new file mode 100644
index 0000000000..ad7f0e0682
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/DistributedControllerTest.java
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.systest.disttest.controlleronly;
+
+import static org.apache.qpid.systest.disttest.SystemTestConstants.COMMAND_RESPONSE_TIMEOUT;
+import static org.apache.qpid.systest.disttest.SystemTestConstants.REGISTRATION_TIMEOUT;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.jms.TemporaryQueue;
+
+import org.apache.qpid.disttest.ConfigFileHelper;
+import org.apache.qpid.disttest.controller.Controller;
+import org.apache.qpid.disttest.controller.config.Config;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.jms.JmsMessageAdaptor;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DistributedControllerTest extends DistributedTestSystemTestBase
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(DistributedControllerTest.class);
+
+ private static final String CLIENT1 = "client1";
+ private Controller _controller = null;
+ private Session _session = null;
+ private Connection _connection = null;
+ private Destination _controllerQueue = null;
+ private TemporaryQueue _clientQueue = null;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _controllerQueue = (Destination) _context.lookup("controllerqueue");
+
+ final ConnectionFactory connectionFactory = (ConnectionFactory) _context.lookup("connectionfactory");
+ _connection = connectionFactory.createConnection();
+ _connection.start();
+ _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _clientQueue = _session.createTemporaryQueue();
+
+ _controller = new Controller(new ControllerJmsDelegate(_context), REGISTRATION_TIMEOUT, COMMAND_RESPONSE_TIMEOUT);
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ try
+ {
+ if (_connection != null)
+ {
+ _connection.close();
+ }
+ }
+ finally
+ {
+ super.tearDown();
+ }
+ }
+
+ public void testControllerSendsOneCommandToSingleClient() throws Exception
+ {
+ Config config = ConfigFileHelper.getConfigFromResource(getClass(), "distributedControllerTest.json");
+ _controller.setConfig(config);
+
+ sendRegistration(CLIENT1);
+ _controller.awaitClientRegistrations();
+
+ final ArrayBlockingQueue<Command> commandList = new ArrayBlockingQueue<Command>(4);
+ final MessageConsumer clientConsumer = _session.createConsumer(_clientQueue);
+ final AtomicReference<Exception> listenerException = new AtomicReference<Exception>();
+ final MessageProducer producer = _session.createProducer(_controllerQueue);
+ clientConsumer.setMessageListener(new MessageListener()
+ {
+ @Override
+ public void onMessage(Message message)
+ {
+ try
+ {
+ Command command = JmsMessageAdaptor.messageToCommand(message);
+ LOGGER.debug("Test client received " + command);
+ commandList.add(command);
+ producer.send(JmsMessageAdaptor.commandToMessage(_session, new Response(CLIENT1, command.getType())));
+ }
+ catch(Exception e)
+ {
+ listenerException.set(e);
+ }
+ }
+ });
+
+ _controller.runAllTests();
+ assertCommandType(CommandType.CREATE_CONNECTION, commandList);
+ assertCommandType(CommandType.START_TEST, commandList);
+ assertCommandType(CommandType.TEAR_DOWN_TEST, commandList);
+
+ _controller.stopAllRegisteredClients();
+ assertCommandType(CommandType.STOP_CLIENT, commandList);
+ assertNull("Unexpected exception occured", listenerException.get());
+ Command command = commandList.poll(1l, TimeUnit.SECONDS);
+ assertNull("Unexpected command is received", command);
+ }
+
+ private void assertCommandType(CommandType expectedType, BlockingQueue<Command> commandList) throws InterruptedException
+ {
+ Command command = commandList.poll(1l, TimeUnit.SECONDS);
+ assertNotNull("Command of type " + expectedType + " is not received", command);
+ assertEquals("Unexpected command type", expectedType, command.getType());
+ }
+
+ private void sendRegistration(final String clientId) throws JMSException
+ {
+ final MessageProducer registrationProducer = _session.createProducer(_controllerQueue);
+
+ final Command command = new RegisterClientCommand(clientId, _clientQueue.getQueueName());
+ final Message registrationMessage = JmsMessageAdaptor.commandToMessage(_session, command);
+ registrationProducer.send(registrationMessage);
+ LOGGER.debug("sent registrationMessage: " + registrationMessage);
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/distributedControllerTest.json b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/distributedControllerTest.json
new file mode 100644
index 0000000000..b49603ef23
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/distributedControllerTest.json
@@ -0,0 +1,17 @@
+{
+ "_tests":[
+ {
+ "_name": "Test 1";
+ "_clients":[
+ {
+ "_name": "client1",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory"
+ }
+ ]
+ }
+ ]
+ }]
+} \ No newline at end of file
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/EndToEndTest.java b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/EndToEndTest.java
new file mode 100644
index 0000000000..63c9b42858
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/EndToEndTest.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.systest.disttest.endtoend;
+
+import static org.apache.qpid.disttest.AbstractRunner.JNDI_CONFIG_PROP;
+import static org.apache.qpid.disttest.ControllerRunner.OUTPUT_DIR_PROP;
+import static org.apache.qpid.disttest.ControllerRunner.TEST_CONFIG_PROP;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.qpid.disttest.ControllerRunner;
+import org.apache.qpid.disttest.message.ParticipantAttribute;
+import org.apache.qpid.disttest.results.aggregation.TestResultAggregator;
+import org.apache.qpid.test.utils.QpidBrokerTestCase;
+import org.apache.qpid.util.FileUtils;
+
+public class EndToEndTest extends QpidBrokerTestCase
+{
+ private ControllerRunner _runner;
+ private static final String TEST_CONFIG = "perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/endtoend.json";
+ private static final String JNDI_CONFIG_FILE = "perftests/src/test/java/org/apache/qpid/systest/disttest/perftests.systests.properties";
+
+ public void testRunner() throws Exception
+ {
+ File csvOutputDir = createTemporaryCsvDirectory();
+ assertTrue("CSV output dir must not exist",csvOutputDir.isDirectory());
+
+ final String[] args = new String[] {TEST_CONFIG_PROP + "=" + TEST_CONFIG,
+ JNDI_CONFIG_PROP + "=" + JNDI_CONFIG_FILE,
+ OUTPUT_DIR_PROP + "=" + csvOutputDir.getAbsolutePath()};
+ _runner = new ControllerRunner();
+ _runner.parseArgumentsIntoConfig(args);
+ _runner.runController();
+
+ File expectedCsvOutputFile = new File(csvOutputDir, "endtoend.csv");
+ assertTrue("CSV output file must exist", expectedCsvOutputFile.exists());
+ final String csvContents = FileUtils.readFileAsString(expectedCsvOutputFile);
+ final String[] csvLines = csvContents.split("\n");
+
+ int numberOfHeaders = 1;
+ int numberOfParticipants = 2;
+ int numberOfSummaries = 3;
+
+ int numberOfExpectedRows = numberOfHeaders + numberOfParticipants + numberOfSummaries;
+ assertEquals("Unexpected number of lines in CSV", numberOfExpectedRows, csvLines.length);
+
+ assertDataRowsHaveCorrectTestAndClientName("End To End 1", "producingClient", "participantProducer1", csvLines[1], 1);
+ assertDataRowsHaveCorrectTestAndClientName("End To End 1", "consumingClient", "participantConsumer1", csvLines[2], 1);
+
+ assertDataRowsHaveCorrectTestAndClientName("End To End 1", "", TestResultAggregator.ALL_PARTICIPANTS_NAME, csvLines[3], 1);
+ assertDataRowsHaveCorrectTestAndClientName("End To End 1", "", TestResultAggregator.ALL_CONSUMER_PARTICIPANTS_NAME, csvLines[4], 1);
+ assertDataRowsHaveCorrectTestAndClientName("End To End 1", "", TestResultAggregator.ALL_PRODUCER_PARTICIPANTS_NAME, csvLines[5], 1);
+
+ }
+
+ private void assertDataRowsHaveCorrectTestAndClientName(String testName, String clientName, String participantName, String csvLine, int expectedNumberOfMessagesProcessed)
+ {
+ final int DONT_STRIP_EMPTY_LAST_FIELD_FLAG = -1;
+ String[] cells = csvLine.split(",", DONT_STRIP_EMPTY_LAST_FIELD_FLAG);
+ // All attributes become cells in the CSV, so this will be true
+ assertEquals("Unexpected number of cells in CSV line " + csvLine, ParticipantAttribute.values().length, cells.length);
+ assertEquals("Unexpected test name in CSV line " + csvLine, testName, cells[0]);
+ assertEquals("Unexpected client name in CSV line " + csvLine, clientName, cells[2]);
+ assertEquals("Unexpected participant name in CSV line " + csvLine, participantName, cells[3]);
+ assertEquals("Unexpected number of messages processed in CSV line " + csvLine, String.valueOf(expectedNumberOfMessagesProcessed), cells[4]);
+
+ }
+
+ private File createTemporaryCsvDirectory() throws IOException
+ {
+ String tmpDir = System.getProperty("java.io.tmpdir");
+ File csvDir = new File(tmpDir, "csv");
+ csvDir.mkdir();
+ csvDir.deleteOnExit();
+ return csvDir;
+ }
+
+}
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/endtoend.json b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/endtoend.json
new file mode 100644
index 0000000000..1b7cc51265
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/endtoend.json
@@ -0,0 +1,65 @@
+{
+ "_tests":[
+ {
+ "_name": "End To End 1";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ];
+ "_messageProviders":[
+ {
+ "_name": "testProvider1";
+ "_messageProperties": {
+ "priority": {"@def": "list"; "_items": [1,2,3,4,4]};
+ "id": {"@def": "random"; "_upper": 10};
+ "test": "test-value"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "participantConsumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+} \ No newline at end of file
diff --git a/java/perftests/src/test/java/org/apache/qpid/systest/disttest/perftests.systests.properties b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/perftests.systests.properties
new file mode 100644
index 0000000000..b5d053227c
--- /dev/null
+++ b/java/perftests/src/test/java/org/apache/qpid/systest/disttest/perftests.systests.properties
@@ -0,0 +1,26 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# this file is used for running system tests of the performance test framework,
+# (i.e. not for running the performance tests themselves!)
+
+java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+
+# use QpidBrokerTestCase's default port
+connectionfactory.connectionfactory = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:15672'
+
+destination.controllerqueue = direct://amq.direct//controllerqueue
diff --git a/java/perftests/visualisation-jfc/build.xml b/java/perftests/visualisation-jfc/build.xml
new file mode 100644
index 0000000000..b838855e8b
--- /dev/null
+++ b/java/perftests/visualisation-jfc/build.xml
@@ -0,0 +1,142 @@
+<!--
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -->
+<project name="visualisation-jfc" default="build">
+ <property name="module.depends" value="common perftests" />
+ <property name="module.test.depends" value="test" />
+
+ <import file="../../module.xml" />
+
+
+ <!-- JFreeChart and JFreeCommon -->
+
+ <property name="jfree.lib.dir" value="${project.root}/lib/jfree" />
+ <property name="jfreechart.version" value="1.0.13" />
+ <property name="jfreecommon.version" value="1.0.16" />
+ <property name="jfreechart.download.url" value="http://repo1.maven.org/maven2/jfree/jfreechart/${jfreechart.version}/jfreechart-${jfreechart.version}.jar" />
+ <property name="jfreecommon.download.url" value="http://repo1.maven.org/maven2/jfree/jcommon/${jfreecommon.version}/jcommon-${jfreecommon.version}.jar" />
+ <property name="jfreechart.jar.file" value="${jfree.lib.dir}/jfreechart-${jfreechart.version}.jar" />
+ <property name="jfreecommon.jar.file" value="${jfree.lib.dir}/jfreecommon-${jfreecommon.version}.jar" />
+
+ <!-- CSVJDBC -->
+
+ <property name="csvjdbc.lib.dir" value="${project.root}/lib/csvjdbc" />
+ <property name="csvjdbc.version" value="1.0.8" />
+ <property name="csvjdbc.download.url" value="http://csvjdbc.sourceforge.net/maven2/net/sourceforge/csvjdbc/csvjdbc/${csvjdbc.version}/csvjdbc-${csvjdbc.version}.jar" />
+
+ <property name="csvjdbc.jar.file" value="${csvjdbc.lib.dir}/csvjdbc-${csvjdbc.version}.jar" />
+
+ <!--check whether the JFree jar is present, possibly after download-->
+ <target name="check-jfree-jars">
+ <condition property="jfree.available">
+ <and>
+ <available file="${jfreechart.jar.file}"/>
+ <available file="${jfreecommon.jar.file}"/>
+ </and>
+ </condition>
+ </target>
+
+ <!--echo that BDB is required if it isnt present, with associated licencing note-->
+ <target name="jfree-jar-required" depends="jfree-licence-note-optional" unless="jfree.available">
+ <echo>The JFreeChart library is required to use this optional module.
+
+The jar file may be downloaded by either:
+
+ Seperately running the following command from the qpid/java/perftests/visualisation-jfc dir: ant download-jfree
+
+ OR
+
+ Adding -Ddownload-jfree=true to your regular build command.</echo>
+ <fail>The JFreechart JARs were not found</fail>
+ </target>
+
+ <!--issue JFree licencing note if JFree isnt already present-->
+ <target name="jfree-licence-note-optional" depends="check-jfree-jars" unless="jfree.available">
+ <antcall target="jfree-licence-note"/>
+ </target>
+
+ <!--issue JFree licencing note-->
+ <target name="jfree-licence-note">
+ <echo>*NOTE* The JFreeChart and JFreeCommon libraries required by this optional module are licensed under the LGPL Licence, which is not compatible with the Apache Licence v2.0.
+
+For a copy of the LGPL Licence, please see:
+http://www.gnu.org/licenses/lgpl.html
+ </echo>
+ </target>
+
+ <target name="check-csvjdbc-jars">
+ <condition property="csvjdbc.available">
+ <available file="${csvjdbc.jar.file}"/>
+ </condition>
+ </target>
+
+ <!--check if an inline JFree download was requested with the build-->
+ <target name="checkjfree-request-props" if="download-jfree">
+ <antcall target="download-jfree"/>
+ </target>
+
+ <!--echo that CSVJDBC is required if it isnt present, with associated licencing note-->
+ <target name="csvjdbc-jar-required" depends="csvjdbc-licence-note-optional" unless="csvjdbc.available">
+ <echo>The CSVJDBC library is required to use this optional module.
+
+The jar file may be downloaded by either:
+
+ Seperately running the following command from the qpid/java/perftests/visualisation-jfc dir: ant download-csvjdbc
+
+ OR
+
+ Adding -Ddownload-csvjdbc=true to your regular build command.</echo>
+ <fail>The CSVJDBC JAR was not found</fail>
+ </target>
+
+ <!--issue CSVJDBC licencing note-->
+ <target name="csvjdbc-licence-note">
+ <echo>*NOTE* The CSVJDBC library required by this optional module is licensed under the LGPL Licence, which is not compatible with the Apache Licence v2.0.
+
+For a copy of the LGPL Licence, please see:
+http://www.gnu.org/licenses/lgpl.html
+ </echo>
+ </target>
+
+ <!--issue CSVJDBC licencing note if CSVJDBC isnt already present-->
+ <target name="csvjdbc-licence-note-optional" depends="check-csvjdbc-jars" unless="csvjdbc.available">
+ <antcall target="csvjdbc-licence-note"/>
+ </target>
+
+ <!--download JFree, with licencing note-->
+ <target name="download-jfree" depends="jfree-licence-note">
+ <mkdir dir="${jfree.lib.dir}"/>
+ <echo>Downloading JFreeChart</echo>
+ <get src="${jfreechart.download.url}" dest="${jfreechart.jar.file}" usetimestamp="true" />
+ <get src="${jfreecommon.download.url}" dest="${jfreecommon.jar.file}" usetimestamp="true" />
+ </target>
+
+ <target name="checkcsvjdbc-request-props" if="download-csvjdbc">
+ <antcall target="download-csvjdbc"/>
+ </target>
+
+ <target name="download-csvjdbc" depends="csvjdbc-licence-note">
+ <mkdir dir="${csvjdbc.lib.dir}"/>
+ <echo>Downloading csvjdbc</echo>
+ <get src="${csvjdbc.download.url}" dest="${csvjdbc.jar.file}" usetimestamp="true" />
+ </target>
+
+ <target name="build" depends="checkjfree-request-props, jfree-jar-required, checkcsvjdbc-request-props, csvjdbc-jar-required, module.build" />
+
+
+</project>
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartType.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartType.java
new file mode 100644
index 0000000000..2803f2d767
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartType.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting;
+
+public enum ChartType
+{
+ LINE, BAR
+
+}
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingException.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingException.java
new file mode 100644
index 0000000000..120a4dc750
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingException.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting;
+
+public class ChartingException extends RuntimeException
+{
+ private static final long serialVersionUID = 1L;
+
+ public ChartingException()
+ {
+ super();
+ }
+
+ public ChartingException(String message)
+ {
+ super(message);
+ }
+
+ public ChartingException(Throwable cause)
+ {
+ super(cause);
+ }
+
+ public ChartingException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
+
+}
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingUtil.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingUtil.java
new file mode 100644
index 0000000000..a149d1a097
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingUtil.java
@@ -0,0 +1,135 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.qpid.disttest.ArgumentParser;
+import org.apache.qpid.disttest.charting.chartbuilder.ChartBuilder;
+import org.apache.qpid.disttest.charting.chartbuilder.ChartBuilderFactory;
+import org.apache.qpid.disttest.charting.definition.ChartingDefinition;
+import org.apache.qpid.disttest.charting.definition.ChartingDefinitionCreator;
+import org.jfree.chart.ChartUtilities;
+import org.jfree.chart.JFreeChart;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ChartingUtil
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ChartingUtil.class);
+
+ public static final String OUTPUT_DIR_PROP = "outputdir";
+ public static final String OUTPUT_DIR_DEFAULT = ".";
+
+ public static final String CHART_DEFINITIONS_PROP = "chart-defs";
+ public static final String CHART_DEFINITIONS_DEFAULT = ".";
+
+ private Map<String,String> _cliOptions = new HashMap<String, String>();
+ {
+ _cliOptions.put(OUTPUT_DIR_PROP, OUTPUT_DIR_DEFAULT);
+ _cliOptions.put(CHART_DEFINITIONS_PROP, CHART_DEFINITIONS_DEFAULT);
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ try
+ {
+ LOGGER.debug("Starting charting");
+
+ ChartingUtil chartingUtil = new ChartingUtil();
+ chartingUtil.parseArgumentsIntoConfig(args);
+ chartingUtil.produceAllCharts();
+ }
+ finally
+ {
+ LOGGER.debug("Charting complete");
+ }
+ }
+
+ private void produceAllCharts()
+ {
+ final String chartingDefsDir = _cliOptions.get(CHART_DEFINITIONS_PROP);
+ List<ChartingDefinition> definitions = loadChartDefinitions(chartingDefsDir);
+
+ LOGGER.debug("There are {} chart(s) to produce", definitions.size());
+
+ for (ChartingDefinition chartingDefinition : definitions)
+ {
+ ChartBuilder chartBuilder = ChartBuilderFactory.createChartBuilder(chartingDefinition.getChartType());
+ JFreeChart chart = chartBuilder.buildChart(chartingDefinition);
+ writeChartToFileSystem(chart, chartingDefinition.getChartStemName());
+ }
+ }
+
+ private void writeChartToFileSystem(JFreeChart chart, String chartStemName)
+ {
+ OutputStream pngOutputStream = null;
+ try
+ {
+
+ File pngFile = new File(chartStemName + ".png");
+ pngOutputStream = new BufferedOutputStream(new FileOutputStream(pngFile));
+ ChartUtilities.writeChartAsPNG(pngOutputStream, chart, 600, 400, true, 0);
+ pngOutputStream.close();
+
+ LOGGER.debug("Written {} chart", pngFile);
+ }
+ catch (IOException e)
+ {
+ throw new ChartingException("Failed to create chart", e);
+ }
+ finally
+ {
+ if (pngOutputStream != null)
+ {
+ try
+ {
+ pngOutputStream.close();
+ }
+ catch (IOException e)
+ {
+ throw new ChartingException("Failed to create chart", e);
+ }
+ }
+ }
+ }
+
+ private List<ChartingDefinition> loadChartDefinitions(String chartingDefsDir)
+ {
+ ChartingDefinitionCreator chartingDefinitionLoader = new ChartingDefinitionCreator();
+ return chartingDefinitionLoader.createFromFileOrDirectory(chartingDefsDir);
+ }
+
+ private void parseArgumentsIntoConfig(String[] args)
+ {
+ ArgumentParser argumentParser = new ArgumentParser();
+ argumentParser.parseArgumentsIntoConfig(_cliOptions, args);
+ }
+
+
+}
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/BarChartBuilder.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/BarChartBuilder.java
new file mode 100644
index 0000000000..302263a604
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/BarChartBuilder.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.jfree.chart.ChartFactory;
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.data.category.DefaultCategoryDataset;
+
+public class BarChartBuilder extends DataSetBasedChartBuilder
+{
+
+ @Override
+ public JFreeChart createChartImpl(String title, String xAxisTitle,
+ String yAxisTitle, final DefaultCategoryDataset dataset, PlotOrientation plotOrientation,
+ boolean showLegend, boolean showToolTips, boolean showUrls)
+ {
+ JFreeChart chart = ChartFactory.createBarChart(title,
+ xAxisTitle,
+ yAxisTitle,
+ dataset,
+ plotOrientation,
+ showLegend,
+ showToolTips,
+ showUrls);
+ return chart;
+ }
+
+
+}
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilder.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilder.java
new file mode 100644
index 0000000000..c6f5ecc175
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilder.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.apache.qpid.disttest.charting.definition.ChartingDefinition;
+import org.jfree.chart.JFreeChart;
+
+public interface ChartBuilder
+{
+
+ public JFreeChart buildChart(ChartingDefinition chartingDefinition);
+
+}
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactory.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactory.java
new file mode 100644
index 0000000000..4c5d4fa09f
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactory.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.apache.qpid.disttest.charting.ChartType;
+
+public class ChartBuilderFactory
+{
+
+ public static ChartBuilder createChartBuilder(ChartType chartType)
+ {
+ switch (chartType)
+ {
+ case LINE:
+ return new LineChartBuilder();
+ case BAR:
+ return new BarChartBuilder();
+ default:
+ throw new IllegalArgumentException("Unknown chart type " + chartType);
+ }
+ }
+
+}
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataPointCallback.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataPointCallback.java
new file mode 100644
index 0000000000..a47df0e8af
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataPointCallback.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.apache.qpid.disttest.charting.definition.SeriesDefinition;
+
+public interface DataPointCallback
+{
+ public void addDataPointToSeries(SeriesDefinition seriesDefinition, Object xValue, Object yValue);
+}
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataSetBasedChartBuilder.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataSetBasedChartBuilder.java
new file mode 100644
index 0000000000..6e2491c883
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataSetBasedChartBuilder.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.apache.qpid.disttest.charting.definition.ChartingDefinition;
+import org.apache.qpid.disttest.charting.definition.SeriesDefinition;
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.axis.CategoryLabelPositions;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.data.category.DefaultCategoryDataset;
+
+public abstract class DataSetBasedChartBuilder implements ChartBuilder
+{
+ private static final CategoryLabelPositions LABEL_POSITION = CategoryLabelPositions.UP_45;
+ private static final PlotOrientation PLOT_ORIENTATION = PlotOrientation.VERTICAL;
+
+ @Override
+ public JFreeChart buildChart(ChartingDefinition chartingDefinition)
+ {
+ String title = chartingDefinition.getChartTitle();
+ String xAxisTitle = chartingDefinition.getXAxisTitle();
+ String yAxisTitle = chartingDefinition.getYAxisTitle();
+
+ final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
+
+ SeriesBuilder seriesBuilder = new SeriesBuilder(new DataPointCallback()
+ {
+ @Override
+ public void addDataPointToSeries(SeriesDefinition seriesDefinition,
+ Object xValue, Object yValue)
+ {
+ String x = (String) xValue;
+ double y = (Double) yValue;
+ dataset.addValue( y, seriesDefinition.getSeriesLegend(), x);
+ }
+ });
+
+ seriesBuilder.build(chartingDefinition.getSeries());
+
+ JFreeChart chart = createChartImpl(title, xAxisTitle, yAxisTitle,
+ dataset, PLOT_ORIENTATION, true, false, false);
+
+ chart.getCategoryPlot().getDomainAxis().setCategoryLabelPositions(LABEL_POSITION);
+
+ return chart;
+ }
+
+ public abstract JFreeChart createChartImpl(String title, String xAxisTitle,
+ String yAxisTitle, final DefaultCategoryDataset dataset, PlotOrientation plotOrientation,
+ boolean showLegend, boolean showToolTips, boolean showUrls);
+}
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/LineChartBuilder.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/LineChartBuilder.java
new file mode 100644
index 0000000000..697dfdcf3e
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/LineChartBuilder.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.jfree.chart.ChartFactory;
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.data.category.DefaultCategoryDataset;
+
+public class LineChartBuilder extends DataSetBasedChartBuilder
+{
+ @Override
+ public JFreeChart createChartImpl(String title, String xAxisTitle,
+ String yAxisTitle, final DefaultCategoryDataset dataset, PlotOrientation plotOrientation,
+ boolean showLegend, boolean showToolTips, boolean showUrls)
+ {
+ JFreeChart chart = ChartFactory.createLineChart(title,
+ xAxisTitle,
+ yAxisTitle,
+ dataset,
+ plotOrientation,
+ showLegend,
+ showToolTips,
+ showUrls);
+ return chart;
+ }
+
+}
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilder.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilder.java
new file mode 100644
index 0000000000..de717792db
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilder.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import java.io.File;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.qpid.disttest.charting.ChartingException;
+import org.apache.qpid.disttest.charting.definition.SeriesDefinition;
+
+public class SeriesBuilder
+{
+ static
+ {
+ registerCsvDriver();
+ }
+
+ private final DataPointCallback _dataPointCallback;
+
+ public SeriesBuilder(DataPointCallback dataPointCallback)
+ {
+ _dataPointCallback = dataPointCallback;
+ }
+
+ public void build(List<SeriesDefinition> seriesDefinitions)
+ {
+ for (Iterator<SeriesDefinition> iterator = seriesDefinitions.iterator(); iterator.hasNext();)
+ {
+ SeriesDefinition series = iterator.next();
+ buildDataSetForSingleSeries(series);
+ }
+ }
+
+ private void buildDataSetForSingleSeries(SeriesDefinition seriesDefinition)
+ {
+ Connection conn = null;
+ Statement stmt = null;
+ try
+ {
+ File seriesDir = getValidatedSeriesDirectory(seriesDefinition);
+
+ conn = DriverManager.getConnection("jdbc:relique:csv:" + seriesDir.getAbsolutePath());
+
+ final String seriesStatement = seriesDefinition.getSeriesStatement();
+
+ stmt = conn.createStatement();
+ ResultSet results = stmt.executeQuery(seriesStatement);
+
+ while (results.next())
+ {
+ Object xValue = results.getString(1);
+ Object yValue = results.getDouble(2);
+
+ _dataPointCallback.addDataPointToSeries(seriesDefinition, xValue, yValue);
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new ChartingException("Failed to create chart dataset", e);
+ }
+ finally
+ {
+ if (stmt != null)
+ {
+ try
+ {
+ stmt.close();
+ }
+ catch (SQLException e)
+ {
+ throw new RuntimeException("Failed to close statement", e);
+ }
+ }
+ if (conn != null)
+ {
+ try
+ {
+ conn.close();
+ }
+ catch (SQLException e)
+ {
+ throw new RuntimeException("Failed to close connection", e);
+ }
+ }
+ }
+ }
+
+ private File getValidatedSeriesDirectory(SeriesDefinition series)
+ {
+ File seriesDir = new File(series.getSeriesDirectory());
+ if (!seriesDir.isDirectory())
+ {
+ throw new ChartingException("seriesDirectory must be a directory : " + seriesDir);
+ }
+ return seriesDir;
+ }
+
+ private static void registerCsvDriver() throws ExceptionInInitializerError
+ {
+ try
+ {
+ Class.forName("org.relique.jdbc.csv.CsvDriver");
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new RuntimeException("Could not load CSV/JDBC driver", e);
+ }
+ }
+
+}
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinition.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinition.java
new file mode 100644
index 0000000000..82b59b6d6e
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinition.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.definition;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.qpid.disttest.charting.ChartType;
+
+public class ChartingDefinition
+{
+ private final String _chartStemName;
+ private final ChartType _chartType;
+ private final String _chartTitle;
+ private final String _xaxisTitle;
+ private final String _yaxisTitle;
+ private final List<SeriesDefinition> _seriesDefinitions;
+
+
+ public ChartingDefinition(final String chartStemName,
+ final ChartType chartType,
+ final String chartTitle,
+ final String xaxisTitle,
+ final String yaxisTitle, List<SeriesDefinition> seriesDefinitions)
+ {
+ _chartStemName = chartStemName;
+ _chartType = chartType;
+ _chartTitle = chartTitle;
+ _xaxisTitle = xaxisTitle;
+ _yaxisTitle = yaxisTitle;
+ _seriesDefinitions = seriesDefinitions;
+ }
+
+ public String getChartStemName()
+ {
+ return _chartStemName;
+ }
+
+ public String getChartTitle()
+ {
+ return _chartTitle;
+ }
+
+
+ public String getXAxisTitle()
+ {
+ return _xaxisTitle;
+ }
+
+
+ public String getYAxisTitle()
+ {
+ return _yaxisTitle;
+ }
+
+
+
+ public ChartType getChartType()
+ {
+ return _chartType;
+ }
+
+ public List<SeriesDefinition> getSeries()
+ {
+ return Collections.unmodifiableList(_seriesDefinitions);
+ }
+
+}
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreator.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreator.java
new file mode 100644
index 0000000000..8a3d313519
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreator.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.definition;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.qpid.disttest.charting.ChartType;
+import org.apache.qpid.disttest.charting.ChartingException;
+
+public class ChartingDefinitionCreator
+{
+ public static final String CHARTDEF_FILE_EXTENSION = ".chartdef";
+
+ public static final String CHART_TYPE_KEY = "chartType";
+ public static final String CHART_TITLE_KEY = "chartTitle";
+ public static final String XAXIS_TITLE_KEY = "xAxisTitle";
+ public static final String YAXIS_TITLE_KEY = "yAxisTitle";
+
+ private SeriesDefinitionCreator _seriesDefinitionCreator = new SeriesDefinitionCreator();
+
+ public List<ChartingDefinition> createFromFileOrDirectory(String chartingDefinitionFileOrDirectory)
+ {
+ List<ChartingDefinition> definitions = new ArrayList<ChartingDefinition>();
+
+ File fileOrDirectory = new File(chartingDefinitionFileOrDirectory);
+ if (fileOrDirectory.isDirectory())
+ {
+ File[] matchingFiles = fileOrDirectory.listFiles(new CHARTDEF_FILE_FILTER());
+
+ for (File file : matchingFiles)
+ {
+ final ChartingDefinition chartDefinition = createChartDefinition(file);
+ definitions.add(chartDefinition);
+ }
+ }
+ else
+ {
+ final ChartingDefinition chartDefinition = createChartDefinition(fileOrDirectory);
+ definitions.add(chartDefinition);
+ }
+
+ return definitions;
+ }
+
+ private ChartingDefinition createChartDefinition(File file)
+ {
+ Reader reader = null;
+ try
+ {
+ reader = new BufferedReader(new FileReader(file));
+ Properties props = new Properties();
+ props.load(reader);
+
+ final String chartStemName = getStemNameFrom(file);
+
+ final ChartType chartType = ChartType.valueOf(props.getProperty(CHART_TYPE_KEY));
+ final String chartTitle = props.getProperty(CHART_TITLE_KEY);
+ final String xAxisTitle = props.getProperty(XAXIS_TITLE_KEY);
+ final String yAxisTitle = props.getProperty(YAXIS_TITLE_KEY);
+
+ final List<SeriesDefinition> seriesDefinitions = createSeriesDefinitions(props);
+
+ final ChartingDefinition chartDefinition = new ChartingDefinition(chartStemName,
+ chartType,
+ chartTitle,
+ xAxisTitle,
+ yAxisTitle,
+ seriesDefinitions);
+ return chartDefinition;
+ }
+ catch (IOException e)
+ {
+ throw new ChartingException("Unable to open file " + file, e);
+ }
+ finally
+ {
+ if (reader != null)
+ {
+ try
+ {
+ reader.close();
+ }
+ catch (IOException e)
+ {
+ throw new ChartingException(e);
+ }
+ }
+ }
+
+ }
+
+ private String getStemNameFrom(File file)
+ {
+ final String nameWithExtension = file.getName();
+ final String nameWithoutExtensionPart = nameWithExtension.replaceAll("\\.[^\\.]*$", "");
+ return nameWithoutExtensionPart;
+ }
+
+ private List<SeriesDefinition> createSeriesDefinitions(Properties props)
+ {
+ return _seriesDefinitionCreator.createFromProperties(props);
+ }
+
+ private final class CHARTDEF_FILE_FILTER implements FileFilter
+ {
+ @Override
+ public boolean accept(File pathname)
+ {
+ return pathname.isFile() && pathname.getName().endsWith(CHARTDEF_FILE_EXTENSION);
+ }
+ }
+
+
+
+}
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinition.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinition.java
new file mode 100644
index 0000000000..a39e906957
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinition.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.definition;
+
+public class SeriesDefinition
+{
+ private final String _seriesStatement;
+ private final String _seriesLegend;
+ private final String _seriesDirectory;
+
+ public SeriesDefinition(String seriesStatement, String seriesLegend, String seriesDirectory)
+ {
+ _seriesStatement = seriesStatement;
+ _seriesLegend = seriesLegend;
+ _seriesDirectory = seriesDirectory;
+ }
+
+ public String getSeriesStatement()
+ {
+ return _seriesStatement;
+ }
+
+ public String getSeriesLegend()
+ {
+ return _seriesLegend;
+ }
+
+ public String getSeriesDirectory()
+ {
+ return _seriesDirectory;
+ }
+
+}
diff --git a/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreator.java b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreator.java
new file mode 100644
index 0000000000..fcc11807c8
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreator.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.definition;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.commons.lang.text.StrSubstitutor;
+
+public class SeriesDefinitionCreator
+{
+ public static final String SERIES_STATEMENT_KEY_FORMAT = "series.%d.statement";
+ public static final String SERIES_LEGEND_KEY_FORMAT = "series.%d.legend";
+ public static final String SERIES_DIRECTORY_KEY_FORMAT = "series.%d.dir";
+
+ public List<SeriesDefinition> createFromProperties(Properties properties)
+ {
+ final List<SeriesDefinition> seriesDefinitions = new ArrayList<SeriesDefinition>();
+
+ int index = 1;
+ boolean moreSeriesDefinitions = true;
+ while(moreSeriesDefinitions)
+ {
+ String seriesStatement = properties.getProperty(String.format(SERIES_STATEMENT_KEY_FORMAT, index));
+ String seriesLegend = properties.getProperty(String.format(SERIES_LEGEND_KEY_FORMAT, index));
+ String seriesDir = StrSubstitutor.replaceSystemProperties(properties.getProperty(String.format(SERIES_DIRECTORY_KEY_FORMAT, index)));
+
+ if (seriesStatement != null)
+ {
+ final SeriesDefinition seriesDefinition = new SeriesDefinition(seriesStatement, seriesLegend, seriesDir);
+ seriesDefinitions.add(seriesDefinition);
+ }
+ else
+ {
+ moreSeriesDefinitions = false;
+ }
+ index++;
+ }
+ return seriesDefinitions;
+ }
+
+}
diff --git a/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactoryTest.java b/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactoryTest.java
new file mode 100644
index 0000000000..bdbbc4a585
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactoryTest.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.apache.qpid.disttest.charting.ChartType;
+
+import junit.framework.TestCase;
+
+public class ChartBuilderFactoryTest extends TestCase
+{
+ public void testLineChart()
+ {
+ ChartBuilder builder = ChartBuilderFactory.createChartBuilder(ChartType.LINE);
+ assertTrue(builder instanceof LineChartBuilder);
+ }
+
+ public void testBarChart()
+ {
+ ChartBuilder builder = ChartBuilderFactory.createChartBuilder(ChartType.BAR);
+ assertTrue(builder instanceof BarChartBuilder);
+ }
+
+}
diff --git a/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilderTest.java b/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilderTest.java
new file mode 100644
index 0000000000..1b1c9969b3
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilderTest.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.PrintWriter;
+import java.util.Collections;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.charting.definition.SeriesDefinition;
+
+public class SeriesBuilderTest extends TestCase
+{
+ private static final String TEST_SERIES_1_SELECT_STATEMENT = "SELECT A, B FROM test";
+ private static final String TEST_SERIES_1_LEGEND = "SERIES_1_LEGEND";
+
+ private DataPointCallback _dataPointCallback = mock(DataPointCallback.class);
+ private SeriesBuilder _seriesBuilder = new SeriesBuilder(_dataPointCallback);
+
+ private File _testTempDir;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _testTempDir = createTestTemporaryDirectory();
+ }
+
+ public void testBuildOneSeries() throws Exception
+ {
+ createTestCsvIn(_testTempDir);
+ SeriesDefinition seriesDefinition = createTestSeriesDefinition();
+
+ _seriesBuilder.build(Collections.singletonList(seriesDefinition));
+
+ verify(_dataPointCallback).addDataPointToSeries(seriesDefinition, (Object)"elephant", (Object)2.0);
+ verify(_dataPointCallback).addDataPointToSeries(seriesDefinition, (Object)"lion", (Object)3.0);
+ verify(_dataPointCallback).addDataPointToSeries(seriesDefinition, (Object)"tiger", (Object)4.0);
+ }
+
+ private void createTestCsvIn(File testDir) throws Exception
+ {
+ File csv = new File(_testTempDir, "test.csv");
+
+ PrintWriter csvWriter = new PrintWriter(new BufferedWriter(new FileWriter(csv)));
+ csvWriter.println("A,B");
+ csvWriter.println("elephant,2");
+ csvWriter.println("lion,3");
+ csvWriter.println("tiger,4");
+ csvWriter.close();
+ }
+
+ private SeriesDefinition createTestSeriesDefinition()
+ {
+ SeriesDefinition definition = new SeriesDefinition(TEST_SERIES_1_SELECT_STATEMENT, TEST_SERIES_1_LEGEND, _testTempDir.getAbsolutePath());
+ return definition;
+ }
+
+ private File createTestTemporaryDirectory() throws Exception
+ {
+ File tmpDir = new File(System.getProperty("java.io.tmpdir"), "testdef" + System.nanoTime());
+ tmpDir.mkdirs();
+ tmpDir.deleteOnExit();
+ return tmpDir;
+ }
+
+}
diff --git a/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreatorTest.java b/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreatorTest.java
new file mode 100644
index 0000000000..80d1cc3d21
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreatorTest.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.definition;
+
+import static org.apache.qpid.disttest.charting.definition.ChartingDefinitionCreator.CHART_TITLE_KEY;
+import static org.apache.qpid.disttest.charting.definition.ChartingDefinitionCreator.CHART_TYPE_KEY;
+import static org.apache.qpid.disttest.charting.definition.ChartingDefinitionCreator.XAXIS_TITLE_KEY;
+import static org.apache.qpid.disttest.charting.definition.ChartingDefinitionCreator.YAXIS_TITLE_KEY;
+import static org.apache.qpid.disttest.charting.definition.SeriesDefinitionCreator.SERIES_STATEMENT_KEY_FORMAT;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.util.List;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.charting.ChartType;
+import org.apache.qpid.disttest.charting.ChartingException;
+
+public class ChartingDefinitionCreatorTest extends TestCase
+{
+ private static final String TEST_CHART_TITLE = "CHART_TITLE";
+ private static final String TEST_XAXIS_TITLE = "XAXIS_TITLE";
+ private static final String TEST_YAXIS_TITLE = "YAXIS_TITLE";
+ private static final ChartType TEST_CHART_TYPE = ChartType.LINE;
+
+ private static final String TEST_SERIES_SELECT_STATEMENT = "SERIES_SELECT_STATEMENT";
+
+ private ChartingDefinitionCreator _chartingDefinitionLoader = new ChartingDefinitionCreator();
+ private File _testTempDir;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _testTempDir = createTestTemporaryDirectory();
+ }
+
+ public void testLoadTwoDefinitionsFromDirectory() throws Exception
+ {
+ createTestDefinitionWithin(_testTempDir);
+ createTestDefinitionWithin(_testTempDir);
+
+ List<ChartingDefinition> definitions = _chartingDefinitionLoader.createFromFileOrDirectory(_testTempDir.getAbsolutePath());
+ assertEquals(2, definitions.size());
+ }
+
+ public void testLoadOneDefinitionFromFile() throws Exception
+ {
+ File testDefFile = createTestDefinitionWithin(_testTempDir);
+
+ List<ChartingDefinition> definitions = _chartingDefinitionLoader.createFromFileOrDirectory(testDefFile.getAbsolutePath());
+ assertEquals(1, definitions.size());
+
+ ChartingDefinition definition1 = definitions.get(0);
+ assertEquals(TEST_CHART_TITLE, definition1.getChartTitle());
+ }
+
+ public void testDefinitionsProperties() throws Exception
+ {
+ File testDefFile = createTestDefinitionWithin(_testTempDir);
+
+ List<ChartingDefinition> definitions = _chartingDefinitionLoader.createFromFileOrDirectory(testDefFile.getAbsolutePath());
+ assertEquals(1, definitions.size());
+
+ ChartingDefinition definition1 = definitions.get(0);
+ assertEquals(TEST_CHART_TITLE, definition1.getChartTitle());
+ assertEquals(TEST_XAXIS_TITLE, definition1.getXAxisTitle());
+ assertEquals(TEST_YAXIS_TITLE, definition1.getYAxisTitle());
+ assertEquals(TEST_CHART_TYPE, definition1.getChartType());
+
+ String stemOnly = testDefFile.getName().replaceFirst("\\.chartdef", "");
+ assertEquals(stemOnly, definition1.getChartStemName());
+
+ final List<SeriesDefinition> seriesDefinitions = definition1.getSeries();
+ assertEquals(1, seriesDefinitions.size());
+ SeriesDefinition seriesDefinition = seriesDefinitions.get(0);
+ assertEquals(TEST_SERIES_SELECT_STATEMENT, seriesDefinition.getSeriesStatement());
+ }
+
+ public void testDefinitionFileNotFound() throws Exception
+ {
+ File notFound = new File(_testTempDir,"notfound.chartdef");
+ assertFalse(notFound.exists());
+
+ try
+ {
+ _chartingDefinitionLoader.createFromFileOrDirectory(notFound.getAbsolutePath());
+ fail("Exception not thrown");
+ }
+ catch(ChartingException ce)
+ {
+ // PASS
+ }
+ }
+
+ private File createTestDefinitionWithin(File _testTempDir) throws Exception
+ {
+ final String testDefFileName = "test." + System.nanoTime() + ".chartdef";
+ File chartDef = new File(_testTempDir, testDefFileName);
+ chartDef.createNewFile();
+
+ Properties props = new Properties();
+ props.setProperty(CHART_TYPE_KEY, TEST_CHART_TYPE.name());
+ props.setProperty(CHART_TITLE_KEY, TEST_CHART_TITLE);
+ props.setProperty(XAXIS_TITLE_KEY, TEST_XAXIS_TITLE);
+ props.setProperty(YAXIS_TITLE_KEY, TEST_YAXIS_TITLE);
+
+ props.setProperty(String.format(SERIES_STATEMENT_KEY_FORMAT, 1), TEST_SERIES_SELECT_STATEMENT);
+
+ final FileWriter writer = new FileWriter(chartDef);
+ try
+ {
+ props.store(writer, "Test chart definition file");
+ }
+ finally
+ {
+ writer.close();
+ }
+
+ return chartDef;
+ }
+
+ private File createTestTemporaryDirectory() throws Exception
+ {
+ File tmpDir = new File(System.getProperty("java.io.tmpdir"), "testdef" + System.nanoTime());
+ tmpDir.mkdirs();
+ tmpDir.deleteOnExit();
+ return tmpDir;
+ }
+}
diff --git a/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreatorTest.java b/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreatorTest.java
new file mode 100644
index 0000000000..2187793c53
--- /dev/null
+++ b/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreatorTest.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.definition;
+
+import static org.apache.qpid.disttest.charting.definition.SeriesDefinitionCreator.SERIES_DIRECTORY_KEY_FORMAT;
+import static org.apache.qpid.disttest.charting.definition.SeriesDefinitionCreator.SERIES_LEGEND_KEY_FORMAT;
+import static org.apache.qpid.disttest.charting.definition.SeriesDefinitionCreator.SERIES_STATEMENT_KEY_FORMAT;
+
+import java.util.List;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+public class SeriesDefinitionCreatorTest extends TestCase
+{
+ private static final String TEST_SERIES_1_SELECT_STATEMENT = "SERIES_1_SELECT_STATEMENT";
+ private static final String TEST_SERIES_1_LEGEND = "SERIES_1_LEGEND";
+ private static final String TEST_SERIES_1_DIR = "SERIES_1_DIR";
+
+ private static final String TEST_SERIES_1_DIR_WITH_SYSPROP = "${java.io.tmpdir}/mydir";
+
+ private static final String TEST_SERIES_2_SELECT_STATEMENT = "SERIES_2_SELECT_STATEMENT";
+ private static final String TEST_SERIES_2_LEGEND = "SERIES_2_LEGEND";
+ private static final String TEST_SERIES_2_DIR = "SERIES_2_DIR";
+
+ private Properties _properties = new Properties();
+
+ private SeriesDefinitionCreator _seriesDefinitionLoader = new SeriesDefinitionCreator();
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ }
+
+ public void testOneSeriesDefinition() throws Exception
+ {
+ createTestProperties(1, TEST_SERIES_1_SELECT_STATEMENT, TEST_SERIES_1_LEGEND, TEST_SERIES_1_DIR);
+
+ List<SeriesDefinition> definitions = _seriesDefinitionLoader.createFromProperties(_properties);
+ assertEquals(1, definitions.size());
+
+ SeriesDefinition definition = definitions.get(0);
+ assertEquals(TEST_SERIES_1_SELECT_STATEMENT, definition.getSeriesStatement());
+ assertEquals(TEST_SERIES_1_LEGEND, definition.getSeriesLegend());
+ assertEquals(TEST_SERIES_1_DIR, definition.getSeriesDirectory());
+ }
+
+ public void testTwoSeriesDefinitions() throws Exception
+ {
+ createTestProperties(1, TEST_SERIES_1_SELECT_STATEMENT, TEST_SERIES_1_LEGEND, TEST_SERIES_1_DIR);
+ createTestProperties(2, TEST_SERIES_2_SELECT_STATEMENT, TEST_SERIES_2_LEGEND, TEST_SERIES_2_DIR);
+
+ List<SeriesDefinition> definitions = _seriesDefinitionLoader.createFromProperties(_properties);
+ assertEquals(2, definitions.size());
+
+ SeriesDefinition seriesDefinition1 = definitions.get(0);
+ assertEquals(TEST_SERIES_1_SELECT_STATEMENT, seriesDefinition1.getSeriesStatement());
+ assertEquals(TEST_SERIES_1_LEGEND, seriesDefinition1.getSeriesLegend());
+ assertEquals(TEST_SERIES_1_DIR, seriesDefinition1.getSeriesDirectory());
+
+ SeriesDefinition seriesDefinition2 = definitions.get(1);
+ assertEquals(TEST_SERIES_2_SELECT_STATEMENT, seriesDefinition2.getSeriesStatement());
+ assertEquals(TEST_SERIES_2_LEGEND, seriesDefinition2.getSeriesLegend());
+ assertEquals(TEST_SERIES_2_DIR, seriesDefinition2.getSeriesDirectory());
+ }
+
+ public void testNonSequentialSeriesDefinitionsIgnored() throws Exception
+ {
+ createTestProperties(1, TEST_SERIES_1_SELECT_STATEMENT, TEST_SERIES_1_LEGEND, TEST_SERIES_1_DIR);
+ createTestProperties(3, TEST_SERIES_2_SELECT_STATEMENT, TEST_SERIES_2_LEGEND, TEST_SERIES_2_DIR);
+
+ List<SeriesDefinition> definitions = _seriesDefinitionLoader.createFromProperties(_properties);
+ assertEquals(1, definitions.size());
+ }
+
+ public void testSeriesDirectorySubstitution() throws Exception
+ {
+ final String tmpDir = System.getProperty("java.io.tmpdir");
+ createTestProperties(1, TEST_SERIES_1_SELECT_STATEMENT, TEST_SERIES_1_LEGEND, TEST_SERIES_1_DIR_WITH_SYSPROP);
+
+ List<SeriesDefinition> definitions = _seriesDefinitionLoader.createFromProperties(_properties);
+ assertEquals(1, definitions.size());
+
+ SeriesDefinition seriesDefinition1 = definitions.get(0);
+ assertTrue(seriesDefinition1.getSeriesDirectory().startsWith(tmpDir));
+ }
+
+ private void createTestProperties(int index, String selectStatement, String seriesLegend, String seriesDir) throws Exception
+ {
+ _properties.setProperty(String.format(SERIES_STATEMENT_KEY_FORMAT, index), selectStatement);
+ _properties.setProperty(String.format(SERIES_LEGEND_KEY_FORMAT, index), seriesLegend);
+ _properties.setProperty(String.format(SERIES_DIRECTORY_KEY_FORMAT, index), seriesDir);
+ }
+
+}
diff --git a/java/systests/build.xml b/java/systests/build.xml
index fb2bae1d47..6adce705cd 100644
--- a/java/systests/build.xml
+++ b/java/systests/build.xml
@@ -7,9 +7,9 @@ nn - or more contributor license agreements. See the NOTICE file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- -
+ -
- http://www.apache.org/licenses/LICENSE-2.0
- -
+ -
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -27,7 +27,7 @@ nn - or more contributor license agreements. See the NOTICE file
</and>
</condition>
- <property name="module.depends" value="client management/common broker broker/test common common/test junit-toolkit ${systests.optional.depends}"/>
+ <property name="module.depends" value="client management/common broker broker/test common amqp-1-0-common common/test jca ${systests.optional.depends}"/>
<property name="module.test.src" location="src/main/java"/>
<property name="module.test.excludes"
value="**/DropInTest.java,**/TestClientControlledTest.java"/>
diff --git a/java/systests/etc/bin/testclients.sh b/java/systests/etc/bin/testclients.sh
deleted file mode 100755
index 002f3d98bb..0000000000
--- a/java/systests/etc/bin/testclients.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-for x in `seq 1 $1`;
-do
- java -cp qpid-integrationtests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar -Dlog4j.configuration=file:/home/rupert/qpid/trunk/qpid/java/etc/mylog4j.xml org.apache.qpid.test.framework.distributedtesting.TestClient -n java$x &
-done
diff --git a/java/systests/etc/virtualhosts-systests-bdb-settings.xml b/java/systests/etc/virtualhosts-systests-bdb-settings.xml
index ce16523f13..216046b40b 100644
--- a/java/systests/etc/virtualhosts-systests-bdb-settings.xml
+++ b/java/systests/etc/virtualhosts-systests-bdb-settings.xml
@@ -26,7 +26,7 @@
<name>localhost</name>
<localhost>
<store>
- <class>org.apache.qpid.server.store.berkeleydb.BDBMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory</factoryclass>
<environment-path>${work}/bdbstore/localhost-store</environment-path>
</store>
</localhost>
@@ -36,7 +36,7 @@
<name>development</name>
<development>
<store>
- <class>org.apache.qpid.server.store.berkeleydb.BDBMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory</factoryclass>
<environment-path>${work}/bdbstore/development-store</environment-path>
</store>
</development>
@@ -46,7 +46,7 @@
<name>test</name>
<test>
<store>
- <class>org.apache.qpid.server.store.berkeleydb.BDBMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory</factoryclass>
<environment-path>${work}/bdbstore/test-store</environment-path>
</store>
</test>
diff --git a/java/systests/etc/virtualhosts-systests-derby-settings.xml b/java/systests/etc/virtualhosts-systests-derby-settings.xml
index ed5ffbb1fd..d494768e91 100644
--- a/java/systests/etc/virtualhosts-systests-derby-settings.xml
+++ b/java/systests/etc/virtualhosts-systests-derby-settings.xml
@@ -26,7 +26,7 @@
<virtualhost>
<localhost>
<store>
- <class>org.apache.qpid.server.store.DerbyMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.derby.DerbyMessageStoreFactory</factoryclass>
<environment-path>${QPID_WORK}/derbyDB/localhost-store</environment-path>
</store>
</localhost>
@@ -35,8 +35,8 @@
<virtualhost>
<development>
<store>
- <class>org.apache.qpid.server.store.DerbyMessageStore</class>
- <environment-path>${QPID_WORK}/derbyDB/development-store</environment-path>
+ <factoryclass>org.apache.qpid.server.store.derby.DerbyMessageStoreFactory</factoryclass>
+ <environment-path>${QPID_WORK}/derbyDB/development-store</environment-path>
</store>
</development>
</virtualhost>
@@ -44,7 +44,7 @@
<virtualhost>
<test>
<store>
- <class>org.apache.qpid.server.store.DerbyMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.derby.DerbyMessageStoreFactory</factoryclass>
<environment-path>${QPID_WORK}/derbyDB/test-store</environment-path>
</store>
</test>
diff --git a/java/systests/etc/virtualhosts-systests-firewall-2.xml b/java/systests/etc/virtualhosts-systests-firewall-2.xml
index 20908e6eb4..f8e9fde8ca 100644
--- a/java/systests/etc/virtualhosts-systests-firewall-2.xml
+++ b/java/systests/etc/virtualhosts-systests-firewall-2.xml
@@ -26,7 +26,7 @@
<name>test</name>
<test>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
</store>
</test>
</virtualhost>
@@ -35,7 +35,7 @@
<name>test2</name>
<test2>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
</store>
<security>
<firewall default-action="deny">
diff --git a/java/systests/etc/virtualhosts-systests-firewall-3.xml b/java/systests/etc/virtualhosts-systests-firewall-3.xml
index 90377f345f..95db02672a 100644
--- a/java/systests/etc/virtualhosts-systests-firewall-3.xml
+++ b/java/systests/etc/virtualhosts-systests-firewall-3.xml
@@ -26,7 +26,7 @@
<name>test</name>
<test>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
</store>
</test>
</virtualhost>
@@ -35,7 +35,7 @@
<name>test2</name>
<test2>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
</store>
<security>
<firewall default-action="deny"/>
diff --git a/java/systests/src/main/java/org/apache/qpid/client/AsynchMessageListenerTest.java b/java/systests/src/main/java/org/apache/qpid/client/AsynchMessageListenerTest.java
new file mode 100644
index 0000000000..09402c140d
--- /dev/null
+++ b/java/systests/src/main/java/org/apache/qpid/client/AsynchMessageListenerTest.java
@@ -0,0 +1,362 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *
+ */
+package org.apache.qpid.client;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.jms.Connection;
+import javax.jms.ExceptionListener;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.Queue;
+import javax.jms.Session;
+
+import org.apache.qpid.test.utils.QpidBrokerTestCase;
+import org.apache.qpid.util.LogMonitor;
+
+/**
+ * Tests the behaviour of JMS asynchronous message listeners as provided by
+ * {@link MessageListener#onMessage(Message)}.
+ *
+ */
+public class AsynchMessageListenerTest extends QpidBrokerTestCase
+{
+ private static final int MSG_COUNT = 10;
+ private static final long AWAIT_MESSAGE_TIMEOUT = 2000;
+ private static final long AWAIT_MESSAGE_TIMEOUT_NEGATIVE = 250;
+ private final String _testQueueName = getTestQueueName();
+ private Connection _consumerConnection;
+ private Session _consumerSession;
+ private MessageConsumer _consumer;
+ private Queue _queue;
+
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _consumerConnection = getConnection();
+ _consumerConnection.start();
+ _consumerSession = _consumerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _queue = _consumerSession.createQueue(_testQueueName);
+ _consumer = _consumerSession.createConsumer(_queue);
+
+ // Populate queue
+ Connection producerConnection = getConnection();
+ Session producerSession = producerConnection.createSession(true, Session.SESSION_TRANSACTED);
+ sendMessage(producerSession, _queue, MSG_COUNT);
+ producerConnection.close();
+
+ }
+
+ public void testMessageListener() throws Exception
+ {
+ CountingMessageListener countingMessageListener = new CountingMessageListener(MSG_COUNT);
+ _consumer.setMessageListener(countingMessageListener);
+ countingMessageListener.awaitMessages(AWAIT_MESSAGE_TIMEOUT);
+
+ assertEquals("Unexpected number of outstanding messages", 0, countingMessageListener.getOutstandingCount());
+ }
+
+ public void testSynchronousReceiveFollowedByMessageListener() throws Exception
+ {
+ // Receive initial message synchronously
+ assertNotNull("Could not receive first message synchronously", _consumer.receive(AWAIT_MESSAGE_TIMEOUT) != null);
+ final int numberOfMessagesToReceiveByMessageListener = MSG_COUNT - 1;
+
+ // Consume remainder asynchronously
+ CountingMessageListener countingMessageListener = new CountingMessageListener(numberOfMessagesToReceiveByMessageListener);
+ _consumer.setMessageListener(countingMessageListener);
+ countingMessageListener.awaitMessages(AWAIT_MESSAGE_TIMEOUT);
+
+ assertEquals("Unexpected number of outstanding messages", 0, countingMessageListener.getOutstandingCount());
+ }
+
+ public void testMessageListenerSetDisallowsSynchronousReceive() throws Exception
+ {
+ CountingMessageListener countingMessageListener = new CountingMessageListener(MSG_COUNT);
+ _consumer.setMessageListener(countingMessageListener);
+
+ try
+ {
+ _consumer.receive();
+ fail("Exception not thrown");
+ }
+ catch (JMSException e)
+ {
+ // PASS
+ assertEquals("A listener has already been set.", e.getMessage());
+ }
+ }
+
+
+ public void testConnectionStopThenStart() throws Exception
+ {
+ int messageToReceivedBeforeConnectionStop = 2;
+ CountingMessageListener countingMessageListener = new CountingMessageListener(MSG_COUNT, messageToReceivedBeforeConnectionStop);
+
+ // Consume at least two messages
+ _consumer.setMessageListener(countingMessageListener);
+ countingMessageListener.awaitMessages(AWAIT_MESSAGE_TIMEOUT);
+
+ _consumerConnection.stop();
+
+ assertTrue("Too few messages received afer Connection#stop()", countingMessageListener.getReceivedCount() >= messageToReceivedBeforeConnectionStop);
+ countingMessageListener.resetLatch();
+
+ // Restart connection
+ _consumerConnection.start();
+
+ // Consume the remainder
+ countingMessageListener.awaitMessages(AWAIT_MESSAGE_TIMEOUT);
+
+ assertEquals("Unexpected number of outstanding messages", 0, countingMessageListener.getOutstandingCount());
+ }
+
+ public void testConnectionStopAndMessageListenerChange() throws Exception
+ {
+ int messageToReceivedBeforeConnectionStop = 2;
+ CountingMessageListener countingMessageListener1 = new CountingMessageListener(MSG_COUNT, messageToReceivedBeforeConnectionStop);
+
+ // Consume remainder asynchronously
+ _consumer.setMessageListener(countingMessageListener1);
+ countingMessageListener1.awaitMessages(AWAIT_MESSAGE_TIMEOUT);
+
+ _consumerConnection.stop();
+ assertTrue("Too few messages received afer Connection#stop()", countingMessageListener1.getReceivedCount() >= messageToReceivedBeforeConnectionStop);
+
+ CountingMessageListener countingMessageListener2 = new CountingMessageListener(countingMessageListener1.getOutstandingCount());
+
+ // Reset Message Listener
+ _consumer.setMessageListener(countingMessageListener2);
+
+ _consumerConnection.start();
+
+ // Consume the remainder
+ countingMessageListener2.awaitMessages(AWAIT_MESSAGE_TIMEOUT);
+
+ assertEquals("Unexpected number of outstanding messages", 0, countingMessageListener2.getOutstandingCount());
+
+ }
+
+ public void testConnectionStopHaltsDeliveryToListener() throws Exception
+ {
+ int messageToReceivedBeforeConnectionStop = 2;
+ CountingMessageListener countingMessageListener = new CountingMessageListener(MSG_COUNT, messageToReceivedBeforeConnectionStop);
+
+ // Consume at least two messages
+ _consumer.setMessageListener(countingMessageListener);
+ countingMessageListener.awaitMessages(AWAIT_MESSAGE_TIMEOUT);
+
+ _consumerConnection.stop();
+
+ // Connection should now be stopped and listener should receive no more
+ final int outstandingCountAtStop = countingMessageListener.getOutstandingCount();
+ countingMessageListener.resetLatch();
+ countingMessageListener.awaitMessages(AWAIT_MESSAGE_TIMEOUT_NEGATIVE);
+
+ assertEquals("Unexpected number of outstanding messages", outstandingCountAtStop, countingMessageListener.getOutstandingCount());
+ }
+
+ public void testSessionCloseHaltsDelivery() throws Exception
+ {
+ int messageToReceivedBeforeConnectionStop = 2;
+ CountingMessageListener countingMessageListener = new CountingMessageListener(MSG_COUNT, messageToReceivedBeforeConnectionStop);
+
+ // Consume at least two messages
+ _consumer.setMessageListener(countingMessageListener);
+ countingMessageListener.awaitMessages(AWAIT_MESSAGE_TIMEOUT);
+
+ _consumerSession.close();
+
+ // Once a session is closed, the listener should receive no more
+ final int outstandingCountAtClose = countingMessageListener.getOutstandingCount();
+ countingMessageListener.resetLatch();
+ countingMessageListener.awaitMessages(AWAIT_MESSAGE_TIMEOUT_NEGATIVE);
+
+ assertEquals("Unexpected number of outstanding messages", outstandingCountAtClose, countingMessageListener.getOutstandingCount());
+ }
+
+ public void testImmediatePrefetchWithMessageListener() throws Exception
+ {
+ // Close connection provided by setup so we can set IMMEDIATE_PREFETCH
+ _consumerConnection.close();
+ setTestClientSystemProperty(AMQSession.IMMEDIATE_PREFETCH, "true");
+
+ _consumerConnection = getConnection();
+ _consumerConnection.start();
+ _consumerSession = _consumerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _consumer = _consumerSession.createConsumer(_queue);
+ CountingMessageListener countingMessageListener = new CountingMessageListener(MSG_COUNT);
+ _consumer.setMessageListener(countingMessageListener);
+
+ countingMessageListener.awaitMessages(AWAIT_MESSAGE_TIMEOUT);
+
+ assertEquals("Unexpected number of messages received", MSG_COUNT, countingMessageListener.getReceivedCount());
+ }
+
+ public void testReceiveTwoConsumers() throws Exception
+ {
+ Session consumerSession2 = _consumerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageConsumer _consumer2 = consumerSession2.createConsumer(_queue);
+
+ CountingMessageListener countingMessageListener = new CountingMessageListener(MSG_COUNT);
+ _consumer.setMessageListener(countingMessageListener);
+ _consumer2.setMessageListener(countingMessageListener);
+
+ countingMessageListener.awaitMessages(AWAIT_MESSAGE_TIMEOUT);
+ assertEquals("Unexpected number of messages received", MSG_COUNT, countingMessageListener.getReceivedCount());
+ }
+
+ /**
+ * Tests the case where the message listener throws an java.lang.Error.
+ * TODO - a useful test?.
+ */
+ public void testMessageListenerThrowsError() throws Exception
+ {
+ int expectedMessages = 1; // The error will kill the dispatcher so only one message will be delivered.
+ final CountDownLatch awaitMessages = new CountDownLatch(expectedMessages);
+ final AtomicInteger receivedCount = new AtomicInteger(0);
+ final String javaLangErrorMessageText = "MessageListener failed with java.lang.Error";
+ CountingExceptionListener countingExceptionListener = new CountingExceptionListener();
+ _consumerConnection.setExceptionListener(countingExceptionListener);
+
+ _consumer.setMessageListener(new MessageListener()
+ {
+ @Override
+ public void onMessage(Message message)
+ {
+ try
+ {
+ throw new Error(javaLangErrorMessageText);
+ }
+ finally
+ {
+ receivedCount.incrementAndGet();
+ awaitMessages.countDown();
+ }
+ }
+ });
+
+ awaitMessages.await(AWAIT_MESSAGE_TIMEOUT, TimeUnit.MILLISECONDS);
+
+ assertEquals("Unexpected number of messages received", expectedMessages, receivedCount.get());
+ assertEquals("onException should NOT have been called", 0, countingExceptionListener.getErrorCount());
+
+ // Check that Error has been written to the application log.
+
+ LogMonitor _monitor = new LogMonitor(_outputFile);
+ assertTrue("The expected message not written to log file.",
+ _monitor.waitForMessage(javaLangErrorMessageText, LOGMONITOR_TIMEOUT));
+
+ if (_consumerConnection != null)
+ {
+ try
+ {
+ _consumerConnection.close();
+ }
+ catch (JMSException e)
+ {
+ // Ignore connection close errors for this test.
+ }
+ finally
+ {
+ _consumerConnection = null;
+ }
+ }
+ }
+
+ private final class CountingExceptionListener implements ExceptionListener
+ {
+ private final AtomicInteger _errorCount = new AtomicInteger();
+
+ @Override
+ public void onException(JMSException arg0)
+ {
+ _errorCount.incrementAndGet();
+ }
+
+ public int getErrorCount()
+ {
+ return _errorCount.intValue();
+ }
+ }
+
+ private final class CountingMessageListener implements MessageListener
+ {
+ private volatile CountDownLatch _awaitMessages;
+ private final AtomicInteger _receivedCount;
+ private final AtomicInteger _outstandingMessageCount;
+
+ public CountingMessageListener(final int totalExpectedMessageCount)
+ {
+ this(totalExpectedMessageCount, totalExpectedMessageCount);
+ }
+
+
+ public CountingMessageListener(int totalExpectedMessageCount, int numberOfMessagesToAwait)
+ {
+ _receivedCount = new AtomicInteger(0);
+ _outstandingMessageCount = new AtomicInteger(totalExpectedMessageCount);
+ _awaitMessages = new CountDownLatch(numberOfMessagesToAwait);
+ }
+
+ public int getOutstandingCount()
+ {
+ return _outstandingMessageCount.get();
+ }
+
+ public int getReceivedCount()
+ {
+ return _receivedCount.get();
+ }
+
+ public void resetLatch()
+ {
+ _awaitMessages = new CountDownLatch(_outstandingMessageCount.get());
+ }
+
+ @Override
+ public void onMessage(Message message)
+ {
+ _receivedCount.incrementAndGet();
+ _outstandingMessageCount.decrementAndGet();
+ _awaitMessages.countDown();
+ }
+
+ public boolean awaitMessages(long timeout)
+ {
+ try
+ {
+ return _awaitMessages.await(timeout, TimeUnit.MILLISECONDS);
+ }
+ catch (InterruptedException e)
+ {
+ Thread.currentThread().interrupt();
+ return false;
+ }
+ }
+ }
+
+}
diff --git a/java/systests/src/main/java/org/apache/qpid/client/DispatcherTest.java b/java/systests/src/main/java/org/apache/qpid/client/DispatcherTest.java
deleted file mode 100644
index 3537dd0533..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/client/DispatcherTest.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- *
- */
-package org.apache.qpid.client;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
-import javax.jms.Connection;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-import javax.jms.Queue;
-import javax.jms.Session;
-import javax.naming.Context;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * QPID-293 Setting MessageListener after connection has started can cause messages to be "lost" on a internal delivery queue
- * <p/>
- * The message delivery process:
- * Mina puts a message on _queue in AMQSession and the dispatcher thread take()s
- * from here and dispatches to the _consumers. If the _consumer doesn't have a message listener set at connection start
- * then messages are stored on _synchronousQueue (which needs to be > 1 to pass JMS TCK as multiple consumers on a
- * session can run in any order and a synchronous put/poll will block the dispatcher).
- * <p/>
- * When setting the message listener later the _synchronousQueue is just poll()'ed and the first message delivered
- * the remaining messages will be left on the queue and lost, subsequent messages on the session will arrive first.
- */
-public class DispatcherTest extends QpidBrokerTestCase
-{
- private static final Logger _logger = LoggerFactory.getLogger(DispatcherTest.class);
-
- private Context _context;
-
- private static final int MSG_COUNT = 6;
- private int _receivedCount = 0;
- private int _receivedCountWhileStopped = 0;
- private Connection _clientConnection, _producerConnection;
- private MessageConsumer _consumer;
- private MessageProducer _producer;
- private Session _clientSession, _producerSession;
-
- private final CountDownLatch _allFirstMessagesSent = new CountDownLatch(1); // all messages Sent Lock
- private final CountDownLatch _allSecondMessagesSent = new CountDownLatch(1); // all messages Sent Lock
-
- private volatile boolean _connectionStopped = false;
-
- protected void setUp() throws Exception
- {
- super.setUp();
-
- // Create Client 1
- _clientConnection = getConnection();
-
- _clientSession = _clientConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- Queue queue = _clientSession.createQueue(this.getClass().getName());
- _consumer = _clientSession.createConsumer(queue);
-
- // Create Producer
- _producerConnection = getConnection();
-
- _producerConnection.start();
-
- _producerSession = _producerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- _producer = _producerSession.createProducer(queue);
-
- for (int msg = 0; msg < MSG_COUNT; msg++)
- {
- _producer.send(_producerSession.createTextMessage("Message " + msg));
- }
- }
-
- protected void tearDown() throws Exception
- {
-
- _clientConnection.close();
-
- _producerConnection.close();
- super.tearDown();
- }
-
- public void testAsynchronousRecieve()
- {
- _logger.info("Test Start");
-
- assertTrue(!((AMQConnection) _clientConnection).started());
-
- // Set default Message Listener
- try
- {
- _consumer.setMessageListener(new MessageListener()
- {
- public void onMessage(Message message)
- {
- _logger.info("Client 1 ML 1 Received Message(" + _receivedCount + "):" + message);
-
- _receivedCount++;
-
- if (_receivedCount == MSG_COUNT)
- {
- _allFirstMessagesSent.countDown();
- }
-
- if (_connectionStopped)
- {
- _logger.info("Running with Message:" + _receivedCount);
- }
-
- if (_connectionStopped && (_allFirstMessagesSent.getCount() == 0))
- {
- _receivedCountWhileStopped++;
- }
-
- if (_allFirstMessagesSent.getCount() == 0)
- {
- if (_receivedCount == (MSG_COUNT * 2))
- {
- _allSecondMessagesSent.countDown();
- }
- }
- }
- });
-
- assertTrue("Connecion should not be started", !((AMQConnection) _clientConnection).started());
- _clientConnection.start();
- }
- catch (JMSException e)
- {
- _logger.error("Error Setting Default ML on consumer1");
- }
-
- try
- {
- _allFirstMessagesSent.await(1000, TimeUnit.MILLISECONDS);
- }
- catch (InterruptedException e)
- {
- // do nothing
- }
-
- try
- {
- assertTrue("Connecion should be started", ((AMQConnection) _clientConnection).started());
- _clientConnection.stop();
- _connectionStopped = true;
- }
- catch (JMSException e)
- {
- _logger.error("Error stopping connection");
- }
-
- try
- {
- _logger.error("Send additional messages");
-
- for (int msg = 0; msg < MSG_COUNT; msg++)
- {
- _producer.send(_producerSession.createTextMessage("Message " + msg));
- }
- }
- catch (JMSException e)
- {
- _logger.error("Unable to send additional messages", e);
- }
-
- try
- {
- Thread.sleep(1000);
- }
- catch (InterruptedException e)
- {
- // ignore
- }
-
- try
- {
- _logger.info("Restarting connection");
-
- _connectionStopped = false;
- _clientConnection.start();
- }
- catch (JMSException e)
- {
- _logger.error("Error Setting Better ML on consumer1", e);
- }
-
- _logger.info("Waiting upto 2 seconds for messages");
-
- try
- {
- _allSecondMessagesSent.await(1000, TimeUnit.MILLISECONDS);
- }
- catch (InterruptedException e)
- {
- // do nothing
- }
-
- assertEquals("Messages not received correctly", 0, _allFirstMessagesSent.getCount());
- assertEquals("Messages not received correctly", 0, _allSecondMessagesSent.getCount());
- assertEquals("Client didn't get all messages", MSG_COUNT * 2, _receivedCount);
- assertEquals("Messages received while stopped is not 0", 0, _receivedCountWhileStopped);
- }
-
- public static junit.framework.Test suite()
- {
- return new junit.framework.TestSuite(DispatcherTest.class);
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/client/MessageListenerMultiConsumerImmediatePrefetch.java b/java/systests/src/main/java/org/apache/qpid/client/MessageListenerMultiConsumerImmediatePrefetch.java
deleted file mode 100644
index 7461f6c200..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/client/MessageListenerMultiConsumerImmediatePrefetch.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- *
- */
-package org.apache.qpid.client;
-
-/**
- * QPID-293 Setting MessageListener after connection has started can cause messages to be "lost" on a internal delivery
- * queue <p/> The message delivery process: Mina puts a message on _queue in AMQSession and the dispatcher thread
- * take()s from here and dispatches to the _consumers. If the _consumer1 doesn't have a message listener set at
- * connection start then messages are stored on _synchronousQueue (which needs to be > 1 to pass JMS TCK as multiple
- * consumers on a session can run in any order and a synchronous put/poll will block the dispatcher). <p/> When setting
- * the message listener later the _synchronousQueue is just poll()'ed and the first message delivered the remaining
- * messages will be left on the queue and lost, subsequent messages on the session will arrive first.
- */
-public class MessageListenerMultiConsumerImmediatePrefetch extends MessageListenerMultiConsumerTest
-{
- protected void setUp() throws Exception
- {
- System.setProperty(AMQSession.IMMEDIATE_PREFETCH, "true");
- super.setUp();
- }
-
- public static junit.framework.Test suite()
- {
- return new junit.framework.TestSuite(MessageListenerMultiConsumerImmediatePrefetch.class);
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/client/MessageListenerMultiConsumerTest.java b/java/systests/src/main/java/org/apache/qpid/client/MessageListenerMultiConsumerTest.java
deleted file mode 100644
index 4fd10a0134..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/client/MessageListenerMultiConsumerTest.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- *
- */
-package org.apache.qpid.client;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
-import javax.jms.Connection;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-import javax.jms.Queue;
-import javax.jms.Session;
-import javax.naming.Context;
-import java.util.UUID;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * QPID-293 Setting MessageListener after connection has started can cause messages to be "lost" on a internal delivery
- * queue <p/> The message delivery process: Mina puts a message on _queue in AMQSession and the dispatcher thread
- * take()s from here and dispatches to the _consumers. If the _consumer1 doesn't have a message listener set at
- * connection start then messages are stored on _synchronousQueue (which needs to be > 1 to pass JMS TCK as multiple
- * consumers on a session can run in any order and a synchronous put/poll will block the dispatcher). <p/> When setting
- * the message listener later the _synchronousQueue is just poll()'ed and the first message delivered the remaining
- * messages will be left on the queue and lost, subsequent messages on the session will arrive first.
- */
-public class MessageListenerMultiConsumerTest extends QpidBrokerTestCase
-{
- private static final Logger _logger = LoggerFactory.getLogger(MessageListenerMultiConsumerTest.class);
-
- private Context _context;
-
- private static final int MSG_COUNT = 6;
- private int receivedCount1 = 0;
- private int receivedCount2 = 0;
- private Connection _clientConnection;
- private MessageConsumer _consumer1;
- private MessageConsumer _consumer2;
- private Session _clientSession1;
- private Queue _queue;
- private final CountDownLatch _allMessagesSent = new CountDownLatch(2); // all messages Sent Lock
- private static final String QUEUE_NAME = "queue" + UUID.randomUUID().toString();
-
- protected void setUp() throws Exception
- {
- super.setUp();
-
- // Create Client 1
- _clientConnection = getConnection("guest", "guest");
-
- _clientConnection.start();
-
- _clientSession1 = _clientConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- _queue =_clientSession1.createQueue(QUEUE_NAME);
-
- _consumer1 = _clientSession1.createConsumer(_queue);
-
- // Create Client 2
- Session clientSession2 = _clientConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- _consumer2 = clientSession2.createConsumer(_queue);
-
- // Create Producer
- Connection producerConnection = getConnection("guest", "guest");
-
- producerConnection.start();
-
- Session producerSession = producerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- MessageProducer producer = producerSession.createProducer(_queue);
-
- for (int msg = 0; msg < MSG_COUNT; msg++)
- {
- producer.send(producerSession.createTextMessage("Message " + msg));
- }
-
- producerConnection.close();
-
- }
-
- protected void tearDown() throws Exception
- {
- _clientConnection.close();
- super.tearDown();
- }
-
- public void testRecieveInterleaved() throws Exception
- {
- int msg = 0;
- int MAX_LOOPS = MSG_COUNT * 2;
- for (int loops = 0; (msg < MSG_COUNT) || (loops < MAX_LOOPS); loops++)
- {
-
- if (_consumer1.receive(1000) != null)
- {
- msg++;
- }
-
- if (_consumer2.receive(1000) != null)
- {
- msg++;
- }
- }
-
- assertEquals("Not all messages received.", MSG_COUNT, msg);
- }
-
- public void testAsynchronousRecieve() throws Exception
- {
- _consumer1.setMessageListener(new MessageListener()
- {
- public void onMessage(Message message)
- {
- _logger.info("Client 1 Received Message(" + receivedCount1 + "):" + message);
-
- receivedCount1++;
-
- if (receivedCount1 == (MSG_COUNT / 2))
- {
- _allMessagesSent.countDown();
- }
-
- }
- });
-
- _consumer2.setMessageListener(new MessageListener()
- {
- public void onMessage(Message message)
- {
- _logger.info("Client 2 Received Message(" + receivedCount2 + "):" + message);
-
- receivedCount2++;
- if (receivedCount2 == (MSG_COUNT / 2))
- {
- _allMessagesSent.countDown();
- }
- }
- });
-
- _logger.info("Waiting upto 2 seconds for messages");
-
- try
- {
- _allMessagesSent.await(4000, TimeUnit.MILLISECONDS);
- }
- catch (InterruptedException e)
- {
- // do nothing
- }
-
- assertEquals(MSG_COUNT, receivedCount1 + receivedCount2);
- }
-
- public void testRecieveC2Only() throws Exception
- {
- if (
- !Boolean.parseBoolean(
- System.getProperties().getProperty(AMQSession.IMMEDIATE_PREFETCH,
- AMQSession.IMMEDIATE_PREFETCH_DEFAULT)))
- {
- _logger.info("Performing Receive only on C2");
- for (int msg = 0; msg < MSG_COUNT; msg++)
- {
- assertTrue(MSG_COUNT + " msg should be received. Only received:" + msg, _consumer2.receive(1000) != null);
- }
- }
- }
-
- public void testRecieveBoth() throws Exception
- {
- if (
- !Boolean.parseBoolean(
- System.getProperties().getProperty(AMQSession.IMMEDIATE_PREFETCH,
- AMQSession.IMMEDIATE_PREFETCH_DEFAULT)))
- {
- _logger.info("Performing Receive only with two consumers on one session ");
-
- //Create a new consumer on session one that we don't use
- _clientSession1.createConsumer(_queue);
-
- int msg;
- for (msg = 0; msg < (MSG_COUNT / 2); msg++)
- {
-
- // Attempt to receive up to half the messages
- // The other half may have gone to the consumer above
- final Message message = _consumer1.receive(1000);
- if(message == null)
- {
- break;
- }
-
- }
-
- _consumer1.close();
- // This will close the unused consumer above.
- _clientSession1.close();
-
-
- // msg will now have recorded the number received on session 1
- // attempt to retrieve the rest on session 2
- for (; msg < MSG_COUNT ; msg++)
- {
- assertTrue("Failed at msg id" + msg, _consumer2.receive(1000) != null);
- }
-
- }
- else
- {
- _logger.info("Performing Receive only on both C1 and C2");
-
- for (int msg = 0; msg < (MSG_COUNT / 2); msg++)
- {
-
- assertTrue(_consumer1.receive(3000) != null);
- }
-
- for (int msg = 0; msg < (MSG_COUNT / 2); msg++)
- {
- assertTrue(_consumer2.receive(3000) != null);
- }
- }
- }
-
- public static junit.framework.Test suite()
- {
- return new junit.framework.TestSuite(MessageListenerMultiConsumerTest.class);
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/client/MessageListenerTest.java b/java/systests/src/main/java/org/apache/qpid/client/MessageListenerTest.java
deleted file mode 100644
index 142f301bd0..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/client/MessageListenerTest.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- *
- */
-package org.apache.qpid.client;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-import org.apache.qpid.util.LogMonitor;
-
-import javax.jms.Connection;
-import javax.jms.ExceptionListener;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-import javax.jms.Queue;
-import javax.jms.Session;
-import javax.naming.Context;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * QPID-293 Setting MessageListener after connection has started can cause messages to be "lost" on a internal delivery
- * queue <p/> The message delivery process: Mina puts a message on _queue in AMQSession and the dispatcher thread
- * take()s from here and dispatches to the _consumers. If the _consumer doesn't have a message listener set at
- * connection start then messages are stored on _synchronousQueue (which needs to be > 1 to pass JMS TCK as multiple
- * consumers on a session can run in any order and a synchronous put/poll will block the dispatcher). <p/> When setting
- * the message listener later the _synchronousQueue is just poll()'ed and the first message delivered the remaining
- * messages will be left on the queue and lost, subsequent messages on the session will arrive first.
- */
-public class MessageListenerTest extends QpidBrokerTestCase implements MessageListener, ExceptionListener
-{
- private static final Logger _logger = LoggerFactory.getLogger(MessageListenerTest.class);
-
- private Context _context;
-
- private static final int MSG_COUNT = 5;
- private int _receivedCount = 0;
- private int _errorCount = 0;
- private MessageConsumer _consumer;
- private Connection _clientConnection;
- private CountDownLatch _awaitMessages = new CountDownLatch(MSG_COUNT);
-
- protected void setUp() throws Exception
- {
- super.setUp();
-
- // Create Client
- _clientConnection = getConnection("guest", "guest");
-
- _clientConnection.start();
-
- Session clientSession = _clientConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- Queue queue =clientSession.createQueue("message-listener-test-queue");
-
- _consumer = clientSession.createConsumer(queue);
-
- // Create Producer
-
- Connection producerConnection = getConnection("guest", "guest");
-
- producerConnection.start();
-
- Session producerSession = producerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- MessageProducer producer = producerSession.createProducer(queue);
-
- for (int msg = 0; msg < MSG_COUNT; msg++)
- {
- producer.send(producerSession.createTextMessage("Message " + msg));
- }
-
- producerConnection.close();
-
- }
-
- protected void tearDown() throws Exception
- {
- if (_clientConnection != null)
- {
- _clientConnection.close();
- }
- super.tearDown();
- }
-
- public void testSynchronousReceive() throws Exception
- {
- for (int msg = 0; msg < MSG_COUNT; msg++)
- {
- assertTrue(_consumer.receive(2000) != null);
- }
- }
-
- public void testSynchronousReceiveNoWait() throws Exception
- {
- for (int msg = 0; msg < MSG_COUNT; msg++)
- {
- assertTrue("Failed to receive message " + msg, _consumer.receiveNoWait() != null);
- }
- }
-
- public void testAsynchronousReceive() throws Exception
- {
- _consumer.setMessageListener(this);
-
- _logger.info("Waiting 3 seconds for messages");
-
- try
- {
- _awaitMessages.await(3000, TimeUnit.MILLISECONDS);
- }
- catch (InterruptedException e)
- {
- // do nothing
- }
- // Should have received all async messages
- assertEquals(MSG_COUNT, _receivedCount);
-
- }
-
- public void testReceiveThenUseMessageListener() throws Exception
- {
- _logger.error("Test disabled as initial receive is not called first");
- // Perform initial receive to start connection
- assertTrue(_consumer.receive(2000) != null);
- _receivedCount++;
-
- // Sleep to ensure remaining 4 msgs end up on _synchronousQueue
- Thread.sleep(1000);
-
- // Set the message listener and wait for the messages to come in.
- _consumer.setMessageListener(this);
-
- _logger.info("Waiting 3 seconds for messages");
-
- try
- {
- _awaitMessages.await(3000, TimeUnit.MILLISECONDS);
- }
- catch (InterruptedException e)
- {
- // do nothing
- }
- // Should have received all async messages
- assertEquals(MSG_COUNT, _receivedCount);
-
- _clientConnection.close();
-
- Connection conn = getConnection("guest", "guest");
- Session clientSession = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
- Queue queue = clientSession.createQueue("message-listener-test-queue");
- MessageConsumer cons = clientSession.createConsumer(queue);
- conn.start();
-
- // check that the messages were actually dequeued
- assertTrue(cons.receive(2000) == null);
- }
-
- /**
- * Tests the case where the message listener throws an java.lang.Error.
- *
- */
- public void testMessageListenerThrowsError() throws Exception
- {
- final String javaLangErrorMessageText = "MessageListener failed with java.lang.Error";
- _clientConnection.setExceptionListener(this);
-
- _awaitMessages = new CountDownLatch(1);
-
- _consumer.setMessageListener(new MessageListener()
- {
- public void onMessage(Message message)
- {
- try
- {
- _logger.debug("onMessage called");
- _receivedCount++;
-
-
- throw new Error(javaLangErrorMessageText);
- }
- finally
- {
- _awaitMessages.countDown();
- }
- }
- });
-
-
- _logger.info("Waiting 3 seconds for message");
- _awaitMessages.await(3000, TimeUnit.MILLISECONDS);
-
- assertEquals("onMessage should have been called", 1, _receivedCount);
- assertEquals("onException should NOT have been called", 0, _errorCount);
-
- // Check that Error has been written to the application log.
-
- LogMonitor _monitor = new LogMonitor(_outputFile);
- assertTrue("The expected message not written to log file.",
- _monitor.waitForMessage(javaLangErrorMessageText, LOGMONITOR_TIMEOUT));
-
- if (_clientConnection != null)
- {
- try
- {
- _clientConnection.close();
- }
- catch (JMSException e)
- {
- // Ignore connection close errors for this test.
- }
- finally
- {
- _clientConnection = null;
- }
- }
- }
-
- public void onMessage(Message message)
- {
- _logger.info("Received Message(" + _receivedCount + "):" + message);
-
- _receivedCount++;
- _awaitMessages.countDown();
- }
-
- public void onException(JMSException e)
- {
- _logger.info("Exception received", e);
- _errorCount++;
- }
-
- public static junit.framework.Test suite()
- {
- return new junit.framework.TestSuite(MessageListenerTest.class);
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/client/ResetMessageListenerTest.java b/java/systests/src/main/java/org/apache/qpid/client/ResetMessageListenerTest.java
deleted file mode 100644
index 6ff6681c47..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/client/ResetMessageListenerTest.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- *
- */
-package org.apache.qpid.client;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
-import javax.jms.Connection;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-import javax.jms.Queue;
-import javax.jms.Session;
-import javax.jms.TextMessage;
-import javax.naming.Context;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * QPID-293 Setting MessageListener after connection has started can cause messages to be "lost" on a internal delivery
- * queue <p/> The message delivery process: Mina puts a message on _queue in AMQSession and the dispatcher thread
- * take()s from here and dispatches to the _consumers. If the _consumer1 doesn't have a message listener set at
- * connection start then messages are stored on _synchronousQueue (which needs to be > 1 to pass JMS TCK as multiple
- * consumers on a session can run in any order and a synchronous put/poll will block the dispatcher). <p/> When setting
- * the message listener later the _synchronousQueue is just poll()'ed and the first message delivered the remaining
- * messages will be left on the queue and lost, subsequent messages on the session will arrive first.
- */
-public class ResetMessageListenerTest extends QpidBrokerTestCase
-{
- private static final Logger _logger = LoggerFactory.getLogger(ResetMessageListenerTest.class);
-
- private Context _context;
-
- private static final int MSG_COUNT = 6;
- private Connection _clientConnection, _producerConnection;
- private MessageConsumer _consumer1;
- private MessageProducer _producer;
- private Session _clientSession, _producerSession;
-
- private final CountDownLatch _allFirstMessagesSent = new CountDownLatch(MSG_COUNT); // all messages Sent Lock
- private final CountDownLatch _allSecondMessagesSent = new CountDownLatch(MSG_COUNT); // all messages Sent Lock
-
- protected void setUp() throws Exception
- {
- super.setUp();
-
- _clientConnection = getConnection("guest", "guest");
- _clientConnection.start();
- // Create Client 1
-
- _clientSession = _clientConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- Queue queue = _clientSession.createQueue("reset-message-listener-test-queue");
-
- _consumer1 = _clientSession.createConsumer(queue);
-
- // Create Producer
- _producerConnection = getConnection("guest", "guest");
-
- _producerConnection.start();
-
- _producerSession = _producerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- _producer = _producerSession.createProducer(queue);
-
- TextMessage m = _producerSession.createTextMessage();
- m.setStringProperty("rank", "first");
- for (int msg = 0; msg < MSG_COUNT; msg++)
- {
- m.setText("Message " + msg);
- _producer.send(m);
- }
- }
-
- protected void tearDown() throws Exception
- {
- _clientConnection.close();
-
- super.tearDown();
- }
-
- public void testAsynchronousRecieve()
- {
-
- _logger.info("Test Start");
-
- try
- {
- _consumer1.setMessageListener(new MessageListener()
- {
- public void onMessage(Message message)
- {
- try
- {
- if (message.getStringProperty("rank").equals("first"))
- {
- _allFirstMessagesSent.countDown();
- }
- }
- catch (JMSException e)
- {
- e.printStackTrace();
- fail("error receiving message");
- }
- }
- });
- }
- catch (JMSException e)
- {
- _logger.error("Error Setting Default ML on consumer1");
- }
- try
- {
- assertTrue("Did not receive all first batch of messages",
- _allFirstMessagesSent.await(MSG_COUNT, TimeUnit.SECONDS));
- _logger.info("Received first batch of messages");
- }
- catch (InterruptedException e)
- {
- // do nothing
- }
-
- try
- {
- _clientConnection.stop();
- }
- catch (JMSException e)
- {
- _logger.error("Error stopping connection");
- }
-
- _logger.info("Reset Message Listener ");
- try
- {
- _consumer1.setMessageListener(new MessageListener()
- {
- public void onMessage(Message message)
- {
- try
- {
- if (message.getStringProperty("rank").equals("first"))
- {
- // Something ugly will happen, it'll probably kill the dispatcher
- fail("All first set of messages should have been received");
- }
- else
- {
- _allSecondMessagesSent.countDown();
- }
- }
- catch (JMSException e)
- {
- e.printStackTrace();
- // Something ugly will happen, it'll probably kill the dispatcher
- fail("error receiving message");
- }
- }
- });
-
- _clientConnection.start();
- }
- catch (javax.jms.IllegalStateException e)
- {
- _logger.error("Connection not stopped while setting ML", e);
- fail("Unable to change message listener:" + e.getCause());
- }
- catch (JMSException e)
- {
- _logger.error("Error Setting Better ML on consumer1", e);
- }
-
- try
- {
- _logger.info("Send additional messages");
- TextMessage m = _producerSession.createTextMessage();
- m.setStringProperty("rank", "second");
- for (int msg = 0; msg < MSG_COUNT; msg++)
- {
- m.setText("Message " + msg);
- _producer.send(m);
- }
- }
- catch (JMSException e)
- {
- _logger.error("Unable to send additional messages", e);
- }
-
- _logger.info("Waiting for messages");
-
- try
- {
- assertTrue(_allSecondMessagesSent.await(MSG_COUNT, TimeUnit.SECONDS));
- }
- catch (InterruptedException e)
- {
- // do nothing
- }
- assertEquals("First batch of messages not received correctly", 0, _allFirstMessagesSent.getCount());
- assertEquals("Second batch of messages not received correctly", 0, _allSecondMessagesSent.getCount());
- }
-
- public static junit.framework.Test suite()
- {
- return new junit.framework.TestSuite(ResetMessageListenerTest.class);
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/client/SessionCreateTest.java b/java/systests/src/main/java/org/apache/qpid/client/SessionCreateTest.java
index d7295b298e..08ed2258b2 100644
--- a/java/systests/src/main/java/org/apache/qpid/client/SessionCreateTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/client/SessionCreateTest.java
@@ -27,7 +27,6 @@ import org.apache.qpid.test.utils.QpidBrokerTestCase;
import javax.jms.Connection;
import javax.jms.Session;
-import javax.naming.Context;
/**
@@ -35,9 +34,7 @@ import javax.naming.Context;
*/
public class SessionCreateTest extends QpidBrokerTestCase
{
- private static final Logger _logger = LoggerFactory.getLogger(MessageListenerTest.class);
-
- private Context _context;
+ private static final Logger LOGGER = LoggerFactory.getLogger(SessionCreateTest.class);
private Connection _clientConnection;
protected int maxSessions = 65555;
@@ -54,7 +51,7 @@ public class SessionCreateTest extends QpidBrokerTestCase
Session sess = _clientConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
assertNotNull(sess);
sess.close();
- System.out.println("created session: " + i);
+ LOGGER.debug("created session: " + i);
}
_clientConnection.close();
diff --git a/java/systests/src/main/java/org/apache/qpid/client/SynchReceiveTest.java b/java/systests/src/main/java/org/apache/qpid/client/SynchReceiveTest.java
new file mode 100644
index 0000000000..bf147197e4
--- /dev/null
+++ b/java/systests/src/main/java/org/apache/qpid/client/SynchReceiveTest.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *
+ */
+package org.apache.qpid.client;
+
+import javax.jms.Connection;
+import javax.jms.MessageConsumer;
+import javax.jms.Queue;
+import javax.jms.Session;
+
+import org.apache.qpid.configuration.ClientProperties;
+import org.apache.qpid.test.utils.QpidBrokerTestCase;
+
+public class SynchReceiveTest extends QpidBrokerTestCase
+{
+ private static final long AWAIT_MESSAGE_TIMEOUT = 2000;
+ private static final long AWAIT_MESSAGE_TIMEOUT_NEGATIVE = 250;
+ private static final int MSG_COUNT = 10;
+ private final String _testQueueName = getTestQueueName();
+ private Connection _consumerConnection;
+ private Session _consumerSession;
+ private MessageConsumer _consumer;
+ private Queue _queue;
+
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _consumerConnection = getConnection();
+ _consumerConnection.start();
+ _consumerSession = _consumerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _queue = _consumerSession.createQueue(_testQueueName);
+ _consumer = _consumerSession.createConsumer(_queue);
+
+ // Populate queue
+ Connection producerConnection = getConnection();
+ Session producerSession = producerConnection.createSession(true, Session.SESSION_TRANSACTED);
+ sendMessage(producerSession, _queue, MSG_COUNT);
+ producerConnection.close();
+ }
+
+ public void testReceiveWithTimeout() throws Exception
+ {
+ for (int msg = 0; msg < MSG_COUNT; msg++)
+ {
+ assertNotNull("Expected message number " + msg, _consumer.receive(AWAIT_MESSAGE_TIMEOUT));
+ }
+
+ assertNull("Received too many messages", _consumer.receive(500));
+ }
+
+ public void testReceiveNoWait() throws Exception
+ {
+ for (int msg = 0; msg < MSG_COUNT; msg++)
+ {
+ assertNotNull("Expected message number " + msg, _consumer.receiveNoWait());
+ }
+
+ assertNull("Received too many messages", _consumer.receive(500));
+ }
+
+ public void testTwoConsumersInterleaved() throws Exception
+ {
+ //create a new connection with prefetch set to 1
+ _consumerConnection.close();
+ setTestClientSystemProperty(ClientProperties.MAX_PREFETCH_PROP_NAME, new Integer(1).toString());
+
+ _consumerConnection = getConnection();
+ _consumerConnection.start();
+ Session consumerSession1 = _consumerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageConsumer consumer1 = consumerSession1.createConsumer(_queue);
+
+ Session consumerSession2 = _consumerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageConsumer consumer2 = consumerSession2.createConsumer(_queue);
+
+ final int maxLoops = MSG_COUNT * 2;
+ int msg = 0;
+ int loops = 0;
+ while(msg < MSG_COUNT && loops < maxLoops)
+ {
+ if (consumer1.receive(AWAIT_MESSAGE_TIMEOUT) != null)
+ {
+ msg++;
+ }
+
+ if (consumer2.receive(AWAIT_MESSAGE_TIMEOUT) != null)
+ {
+ msg++;
+ }
+
+ loops++;
+ }
+
+ assertEquals("Not all messages received.", MSG_COUNT, msg);
+ assertNull("Received too many messages", consumer1.receive(AWAIT_MESSAGE_TIMEOUT_NEGATIVE));
+ assertNull("Received too many messages", consumer2.receive(AWAIT_MESSAGE_TIMEOUT_NEGATIVE));
+ }
+
+ public void testIdleSecondConsumer() throws Exception
+ {
+ Session idleSession = _consumerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ @SuppressWarnings("unused")
+ MessageConsumer idleConsumerOnSameQueue = idleSession.createConsumer(_queue);
+
+ // Since we don't call receive on the idle consumer, all messages will flow to other
+
+ for (int msg = 0; msg < MSG_COUNT; msg++)
+ {
+ assertNotNull("Expected message number " + msg, _consumer.receive(AWAIT_MESSAGE_TIMEOUT));
+ }
+
+ assertNull("Received too many messages", _consumer.receive(AWAIT_MESSAGE_TIMEOUT_NEGATIVE));
+ }
+
+
+}
diff --git a/java/systests/src/main/java/org/apache/qpid/client/redelivered/RedeliveredMessageTest.java b/java/systests/src/main/java/org/apache/qpid/client/redelivered/RedeliveredMessageTest.java
index cd74691035..0f12c8c7e6 100644
--- a/java/systests/src/main/java/org/apache/qpid/client/redelivered/RedeliveredMessageTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/client/redelivered/RedeliveredMessageTest.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.client.redelivered;
import org.apache.qpid.test.utils.QpidBrokerTestCase;
diff --git a/java/systests/src/main/java/org/apache/qpid/jms/xa/XAResourceTest.java b/java/systests/src/main/java/org/apache/qpid/jms/xa/XAResourceTest.java
index f337908134..ac29b72620 100644
--- a/java/systests/src/main/java/org/apache/qpid/jms/xa/XAResourceTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/jms/xa/XAResourceTest.java
@@ -43,7 +43,7 @@ public class XAResourceTest extends QpidBrokerTestCase
public void testIsSameRMSingleCF() throws Exception
{
XAConnectionFactory factory = getConnectionFactory(FACTORY_NAME);
- XAConnection conn = factory.createXAConnection();
+ XAConnection conn = factory.createXAConnection("guest","guest");
XASession session = conn.createXASession();
XAResource xaResource1 = session.getXAResource();
XAResource xaResource2 = session.getXAResource();
@@ -68,9 +68,9 @@ public class XAResourceTest extends QpidBrokerTestCase
XAConnectionFactory factory2 = new AMQConnectionFactory(url);
XAConnectionFactory factory3 = getConnectionFactory(ALT_FACTORY_NAME);
- XAConnection conn = factory.createXAConnection();
- XAConnection conn2 = factory2.createXAConnection();
- XAConnection conn3 = factory3.createXAConnection();
+ XAConnection conn = factory.createXAConnection("guest","guest");
+ XAConnection conn2 = factory2.createXAConnection("guest","guest");
+ XAConnection conn3 = factory3.createXAConnection("guest","guest");
XASession session = conn.createXASession();
XASession session2 = conn2.createXASession();
@@ -90,15 +90,6 @@ public class XAResourceTest extends QpidBrokerTestCase
}
@Override
- public void stopBroker(int port) throws Exception
- {
- if (isBrokerPresent(port))
- {
- super.stopBroker(port);
- }
- }
-
- @Override
public void tearDown() throws Exception
{
try
diff --git a/java/systests/src/main/java/org/apache/qpid/management/jmx/ManagedQueueMBeanTest.java b/java/systests/src/main/java/org/apache/qpid/management/jmx/ManagedQueueMBeanTest.java
index 0604955290..244e547e02 100644
--- a/java/systests/src/main/java/org/apache/qpid/management/jmx/ManagedQueueMBeanTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/management/jmx/ManagedQueueMBeanTest.java
@@ -20,6 +20,9 @@ package org.apache.qpid.management.jmx;
import org.apache.commons.lang.time.FastDateFormat;
+import org.apache.log4j.Logger;
+import org.apache.qpid.client.AMQSession;
+import org.apache.qpid.configuration.ClientProperties;
import org.apache.qpid.management.common.mbeans.ManagedQueue;
import org.apache.qpid.server.queue.AMQQueueMBean;
import org.apache.qpid.test.utils.JMXTestUtils;
@@ -27,15 +30,25 @@ import org.apache.qpid.test.utils.QpidBrokerTestCase;
import javax.jms.Connection;
import javax.jms.Destination;
+import javax.jms.JMSException;
import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
import javax.jms.Session;
-import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeData;
import javax.management.openmbean.TabularData;
+
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* Tests the JMX API for the Managed Queue.
@@ -43,17 +56,41 @@ import java.util.Map;
*/
public class ManagedQueueMBeanTest extends QpidBrokerTestCase
{
- /**
- * JMX helper.
- */
+ protected static final Logger LOGGER = Logger.getLogger(ManagedQueueMBeanTest.class);
+
private JMXTestUtils _jmxUtils;
+ private Connection _connection;
+ private Session _session;
+
+ private String _sourceQueueName;
+ private String _destinationQueueName;
+ private Destination _sourceQueue;
+ private Destination _destinationQueue;
+ private ManagedQueue _managedSourceQueue;
+ private ManagedQueue _managedDestinationQueue;
public void setUp() throws Exception
{
_jmxUtils = new JMXTestUtils(this);
_jmxUtils.setUp();
+
super.setUp();
+ _sourceQueueName = getTestQueueName() + "_src";
+ _destinationQueueName = getTestQueueName() + "_dest";
+
+ _connection = getConnection();
+ _connection.start();
+
+ _session = _connection.createSession(true, Session.SESSION_TRANSACTED);
+ _sourceQueue = _session.createQueue(_sourceQueueName);
+ _destinationQueue = _session.createQueue(_destinationQueueName);
+ createQueueOnBroker(_sourceQueue);
+ createQueueOnBroker(_destinationQueue);
+
_jmxUtils.open();
+
+ _managedSourceQueue = _jmxUtils.getManagedQueue(_sourceQueueName);
+ _managedDestinationQueue = _jmxUtils.getManagedQueue(_destinationQueueName);
}
public void tearDown() throws Exception
@@ -70,28 +107,18 @@ public class ManagedQueueMBeanTest extends QpidBrokerTestCase
*/
public void testViewSingleMessage() throws Exception
{
- final String queueName = getTestQueueName();
-
- // Create queue and send numMessages messages to it.
- final Connection con = getConnection();
- final Session session = con.createSession(true, Session.SESSION_TRANSACTED);
- final Destination dest = session.createQueue(queueName);
- session.createConsumer(dest).close(); // Create a consumer only to cause queue creation
-
- final List<Message> sentMessages = sendMessage(session, dest, 1);
+ final List<Message> sentMessages = sendMessage(_session, _sourceQueue, 1);
+ syncSession(_session);
final Message sentMessage = sentMessages.get(0);
- // Obtain the management interface.
- final ManagedQueue managedQueue = _jmxUtils.getManagedQueue(queueName);
- assertNotNull("ManagedQueue expected to be available", managedQueue);
- assertEquals("Unexpected queue depth", 1, managedQueue.getMessageCount().intValue());
+ assertEquals("Unexpected queue depth", 1, _managedSourceQueue.getMessageCount().intValue());
// Check the contents of the message
- final TabularData tab = managedQueue.viewMessages(1l, 1l);
+ final TabularData tab = _managedSourceQueue.viewMessages(1l, 1l);
assertEquals("Unexpected number of rows in table", 1, tab.size());
- final Iterator<CompositeDataSupport> rowItr = (Iterator<CompositeDataSupport>) tab.values().iterator();
+ final Iterator<CompositeData> rowItr = (Iterator<CompositeData>) tab.values().iterator();
- final CompositeDataSupport row1 = rowItr.next();
+ final CompositeData row1 = rowItr.next();
assertNotNull("Message should have AMQ message id", row1.get(ManagedQueue.MSG_AMQ_ID));
assertEquals("Unexpected queue position", 1l, row1.get(ManagedQueue.MSG_QUEUE_POS));
assertEquals("Unexpected redelivered flag", Boolean.FALSE, row1.get(ManagedQueue.MSG_REDELIVERED));
@@ -109,6 +136,184 @@ public class ManagedQueueMBeanTest extends QpidBrokerTestCase
}
/**
+ * Tests {@link ManagedQueue#moveMessages(long, long, String)} interface.
+ */
+ public void testMoveMessagesBetweenQueues() throws Exception
+ {
+ final int numberOfMessagesToSend = 10;
+
+ sendMessage(_session, _sourceQueue, numberOfMessagesToSend);
+ syncSession(_session);
+ assertEquals("Unexpected queue depth after send", numberOfMessagesToSend, _managedSourceQueue.getMessageCount().intValue());
+
+ List<Long> amqMessagesIds = getAMQMessageIdsOn(_managedSourceQueue, 1, numberOfMessagesToSend);
+
+ // Move first three messages to destination
+ long fromMessageId = amqMessagesIds.get(0);
+ long toMessageId = amqMessagesIds.get(2);
+ _managedSourceQueue.moveMessages(fromMessageId, toMessageId, _destinationQueueName);
+
+ assertEquals("Unexpected queue depth on destination queue after first move", 3, _managedDestinationQueue.getMessageCount().intValue());
+ assertEquals("Unexpected queue depth on source queue after first move", 7, _managedSourceQueue.getMessageCount().intValue());
+
+ // Now move a further two messages to destination
+ fromMessageId = amqMessagesIds.get(7);
+ toMessageId = amqMessagesIds.get(8);
+ _managedSourceQueue.moveMessages(fromMessageId, toMessageId, _destinationQueueName);
+ assertEquals("Unexpected queue depth on destination queue after second move", 5, _managedDestinationQueue.getMessageCount().intValue());
+ assertEquals("Unexpected queue depth on source queue after second move", 5, _managedSourceQueue.getMessageCount().intValue());
+
+ assertMessageIndicesOn(_destinationQueue, 0, 1, 2, 7, 8);
+ }
+
+ /**
+ * Tests {@link ManagedQueue#copyMessages(long, long, String)} interface.
+ */
+ public void testCopyMessagesBetweenQueues() throws Exception
+ {
+ final int numberOfMessagesToSend = 10;
+ sendMessage(_session, _sourceQueue, numberOfMessagesToSend);
+ syncSession(_session);
+ assertEquals("Unexpected queue depth after send", numberOfMessagesToSend, _managedSourceQueue.getMessageCount().intValue());
+
+ List<Long> amqMessagesIds = getAMQMessageIdsOn(_managedSourceQueue, 1, numberOfMessagesToSend);
+
+ // Copy first three messages to destination
+ long fromMessageId = amqMessagesIds.get(0);
+ long toMessageId = amqMessagesIds.get(2);
+ _managedSourceQueue.copyMessages(fromMessageId, toMessageId, _destinationQueueName);
+
+ assertEquals("Unexpected queue depth on destination queue after first copy", 3, _managedDestinationQueue.getMessageCount().intValue());
+ assertEquals("Unexpected queue depth on source queue after first copy", numberOfMessagesToSend, _managedSourceQueue.getMessageCount().intValue());
+
+ // Now copy a further two messages to destination
+ fromMessageId = amqMessagesIds.get(7);
+ toMessageId = amqMessagesIds.get(8);
+ _managedSourceQueue.copyMessages(fromMessageId, toMessageId, _destinationQueueName);
+ assertEquals("Unexpected queue depth on destination queue after second copy", 5, _managedDestinationQueue.getMessageCount().intValue());
+ assertEquals("Unexpected queue depth on source queue after second copy", numberOfMessagesToSend, _managedSourceQueue.getMessageCount().intValue());
+
+ assertMessageIndicesOn(_destinationQueue, 0, 1, 2, 7, 8);
+ }
+
+ public void testMoveMessagesBetweenQueuesWithActiveConsumerOnSourceQueue() throws Exception
+ {
+ setTestClientSystemProperty(ClientProperties.MAX_PREFETCH_PROP_NAME, new Integer(1).toString());
+ Connection asyncConnection = getConnection();
+ asyncConnection.start();
+
+ final int numberOfMessagesToSend = 50;
+ sendMessage(_session, _sourceQueue, numberOfMessagesToSend);
+ syncSession(_session);
+ assertEquals("Unexpected queue depth after send", numberOfMessagesToSend, _managedSourceQueue.getMessageCount().intValue());
+
+ List<Long> amqMessagesIds = getAMQMessageIdsOn(_managedSourceQueue, 1, numberOfMessagesToSend);
+
+ long fromMessageId = amqMessagesIds.get(0);
+ long toMessageId = amqMessagesIds.get(numberOfMessagesToSend - 1);
+
+ CountDownLatch consumerReadToHalfwayLatch = new CountDownLatch(numberOfMessagesToSend / 2);
+ AtomicInteger totalConsumed = new AtomicInteger(0);
+ startAsyncConsumerOn(_sourceQueue, asyncConnection, consumerReadToHalfwayLatch, totalConsumed);
+
+ boolean halfwayPointReached = consumerReadToHalfwayLatch.await(5000, TimeUnit.MILLISECONDS);
+ assertTrue("Did not read half of messages within time allowed", halfwayPointReached);
+
+ _managedSourceQueue.moveMessages(fromMessageId, toMessageId, _destinationQueueName);
+
+ asyncConnection.stop();
+
+ // The exact number of messages moved will be non deterministic, as the number of messages processed
+ // by the consumer cannot be predicited. There is also the possibility that a message can remain
+ // on the source queue. This situation will arise if a message has been acquired by the consumer, but not
+ // yet delivered to the client application (i.e. MessageListener#onMessage()) when the Connection#stop() occurs.
+ //
+ // The number of messages moved + the number consumed + any messages remaining on source should
+ // *always* be equal to the number we originally sent.
+
+ int numberOfMessagesReadByConsumer = totalConsumed.intValue();
+ int numberOfMessagesOnDestinationQueue = _managedDestinationQueue.getMessageCount().intValue();
+ int numberOfMessagesRemainingOnSourceQueue = _managedSourceQueue.getMessageCount().intValue();
+
+ LOGGER.debug("Async consumer read : " + numberOfMessagesReadByConsumer
+ + " Number of messages moved to destination : " + numberOfMessagesOnDestinationQueue
+ + " Number of messages remaining on source : " + numberOfMessagesRemainingOnSourceQueue);
+ assertEquals("Unexpected number of messages after move", numberOfMessagesToSend, numberOfMessagesReadByConsumer + numberOfMessagesOnDestinationQueue + numberOfMessagesRemainingOnSourceQueue);
+ }
+
+ public void testMoveMessagesBetweenQueuesWithActiveConsumerOnDestinationQueue() throws Exception
+ {
+ setTestClientSystemProperty(ClientProperties.MAX_PREFETCH_PROP_NAME, new Integer(1).toString());
+ Connection asyncConnection = getConnection();
+ asyncConnection.start();
+
+ final int numberOfMessagesToSend = 50;
+ sendMessage(_session, _sourceQueue, numberOfMessagesToSend);
+ syncSession(_session);
+ assertEquals("Unexpected queue depth after send", numberOfMessagesToSend, _managedSourceQueue.getMessageCount().intValue());
+
+ List<Long> amqMessagesIds = getAMQMessageIdsOn(_managedSourceQueue, 1, numberOfMessagesToSend);
+ long fromMessageId = amqMessagesIds.get(0);
+ long toMessageId = amqMessagesIds.get(numberOfMessagesToSend - 1);
+
+ AtomicInteger totalConsumed = new AtomicInteger(0);
+ CountDownLatch allMessagesConsumedLatch = new CountDownLatch(numberOfMessagesToSend);
+ startAsyncConsumerOn(_destinationQueue, asyncConnection, allMessagesConsumedLatch, totalConsumed);
+
+ _managedSourceQueue.moveMessages(fromMessageId, toMessageId, _destinationQueueName);
+
+ allMessagesConsumedLatch.await(5000, TimeUnit.MILLISECONDS);
+ assertEquals("Did not consume all messages from destination queue", numberOfMessagesToSend, totalConsumed.intValue());
+ }
+
+ private void startAsyncConsumerOn(Destination queue, Connection asyncConnection,
+ final CountDownLatch requiredNumberOfMessagesRead, final AtomicInteger totalConsumed) throws Exception
+ {
+ Session session = asyncConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageConsumer consumer = session.createConsumer(queue);
+ consumer.setMessageListener(new MessageListener()
+ {
+
+ @Override
+ public void onMessage(Message arg0)
+ {
+ totalConsumed.incrementAndGet();
+ requiredNumberOfMessagesRead.countDown();
+ }
+ });
+ }
+
+ private void assertMessageIndicesOn(Destination queue, int... expectedIndices) throws Exception
+ {
+ MessageConsumer consumer = _session.createConsumer(queue);
+
+ for (int i : expectedIndices)
+ {
+ Message message = consumer.receive(1000);
+ assertNotNull("Expected message with index " + i, message);
+ assertEquals("Expected message with index " + i, i, message.getIntProperty(INDEX));
+ }
+
+ assertNull("Unexpected message encountered", consumer.receive(1000));
+ }
+
+ private List<Long> getAMQMessageIdsOn(ManagedQueue managedQueue, long startIndex, long endIndex) throws Exception
+ {
+ final SortedSet<Long> messageIds = new TreeSet<Long>();
+
+ final TabularData tab = managedQueue.viewMessages(startIndex, endIndex);
+ final Iterator<CompositeData> rowItr = (Iterator<CompositeData>) tab.values().iterator();
+ while(rowItr.hasNext())
+ {
+ final CompositeData row = rowItr.next();
+ long amqMessageId = (Long)row.get(ManagedQueue.MSG_AMQ_ID);
+ messageIds.add(amqMessageId);
+ }
+
+ return new ArrayList<Long>(messageIds);
+ }
+
+ /**
*
* Utility method to convert array of Strings in the form x = y into a
* map with key/value x =&gt; y.
@@ -126,4 +331,15 @@ public class ManagedQueueMBeanTest extends QpidBrokerTestCase
}
return headerMap;
}
+
+ private void createQueueOnBroker(Destination destination) throws JMSException
+ {
+ _session.createConsumer(destination).close(); // Create a consumer only to cause queue creation
+ }
+
+ private void syncSession(Session session) throws Exception
+ {
+ ((AMQSession<?,?>)session).sync();
+ }
+
}
diff --git a/java/systests/src/main/java/org/apache/qpid/ra/QpidRAConnectionTest.java b/java/systests/src/main/java/org/apache/qpid/ra/QpidRAConnectionTest.java
new file mode 100644
index 0000000000..0ca90ac2ea
--- /dev/null
+++ b/java/systests/src/main/java/org/apache/qpid/ra/QpidRAConnectionTest.java
@@ -0,0 +1,89 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.ra;
+
+import org.apache.qpid.test.utils.QpidBrokerTestCase;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Message;
+import javax.jms.Session;
+
+import org.apache.qpid.ra.QpidRAConnectionFactoryImpl;
+import org.apache.qpid.ra.QpidRAManagedConnectionFactory;
+import org.apache.qpid.ra.QpidResourceAdapter;
+
+public class QpidRAConnectionTest extends QpidBrokerTestCase
+{
+ private static final String BROKER_PORT = "15672";
+
+ private static final String URL = "amqp://guest:guest@client/test?brokerlist='tcp://localhost:" + BROKER_PORT + "?sasl_mechs='PLAIN''";
+
+ public void testSessionCommitOnClosedConnectionThrowsException() throws Exception
+ {
+ QpidResourceAdapter ra = new QpidResourceAdapter();
+ QpidRAManagedConnectionFactory mcf = new QpidRAManagedConnectionFactory();
+ mcf.setConnectionURL(URL);
+ mcf.setResourceAdapter(ra);
+ ConnectionFactory cf = new QpidRAConnectionFactoryImpl(mcf, null);
+ Connection c = cf.createConnection();
+ Session s = c.createSession(true, Session.SESSION_TRANSACTED);
+ c.close();
+
+ try
+ {
+ s.commit();
+ fail("Exception should be thrown");
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ assertTrue(e instanceof javax.jms.IllegalStateException);
+ }
+
+ }
+
+ public void testMessageAck() throws Exception
+ {
+ QpidResourceAdapter ra = new QpidResourceAdapter();
+ QpidRAManagedConnectionFactory mcf = new QpidRAManagedConnectionFactory();
+ mcf.setConnectionURL(URL);
+ mcf.setResourceAdapter(ra);
+ ConnectionFactory cf = new QpidRAConnectionFactoryImpl(mcf, null);
+ Connection c = cf.createConnection();
+ Session s = c.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ Message m = s.createTextMessage();
+
+ try
+ {
+ m.acknowledge();
+ }
+ catch(Exception e)
+ {
+ fail("Acknowledge should not throw an exception");
+ }
+ finally
+ {
+ s.close();
+ c.close();
+ }
+ }
+}
diff --git a/java/systests/src/main/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java b/java/systests/src/main/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java
index c42bb3b1fa..0e3a658e32 100644
--- a/java/systests/src/main/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java
@@ -77,6 +77,7 @@ public class SupportedProtocolVersionsTest extends QpidBrokerTestCase
public void testDisabling010() throws Exception
{
//disable 0-10 support
+ setConfigurationProperty("connector.amqp10enabled", "false");
setConfigurationProperty("connector.amqp010enabled", "false");
super.setUp();
@@ -92,6 +93,7 @@ public class SupportedProtocolVersionsTest extends QpidBrokerTestCase
public void testDisabling091and010() throws Exception
{
//disable 0-91 and 0-10 support
+ setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP10ENABLED, "false");
setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP010ENABLED, "false");
setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP091ENABLED, "false");
@@ -111,6 +113,7 @@ public class SupportedProtocolVersionsTest extends QpidBrokerTestCase
setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP09ENABLED, "false");
setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP091ENABLED, "false");
setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP010ENABLED, "false");
+ setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP10ENABLED, "false");
super.setUp();
diff --git a/java/systests/src/main/java/org/apache/qpid/server/exchange/MessagingTestConfigProperties.java b/java/systests/src/main/java/org/apache/qpid/server/exchange/MessagingTestConfigProperties.java
deleted file mode 100644
index 4a92f04b30..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/server/exchange/MessagingTestConfigProperties.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.exchange;
-
-import org.apache.qpid.jms.Session;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-/**
- * MessagingTestConfigProperties defines a set of property names and default values for specifying a messaging topology,
- * and test parameters for running a messaging test over that topology. A Properties object holding some of these
- * properties, superimposed onto the defaults, is used to establish test topologies and control test behaviour.
- *
- * <p/>A complete list of the parameters, default values and comments on their usage is provided here:
- *
- * <p/><table><caption>Parameters</caption>
- * <tr><th> Parameter <th> Default <th> Comments
- * <tr><td> messageSize <td> 0 <td> Message size in bytes. Not including any headers.
- * <tr><td> destinationName <td> ping <td> The root name to use to generate destination names to ping.
- * <tr><td> persistent <td> false <td> Determines whether peristent delivery is used.
- * <tr><td> transacted <td> false <td> Determines whether messages are sent/received in transactions.
- * <tr><td> broker <td> tcp://localhost:5672 <td> Determines the broker to connect to.
- * <tr><td> virtualHost <td> test <td> Determines the virtual host to send all ping over.
- * <tr><td> rate <td> 0 <td> The maximum rate (in hertz) to send messages at. 0 means no limit.
- * <tr><td> verbose <td> false <td> The verbose flag for debugging. Prints to console on every message.
- * <tr><td> pubsub <td> false <td> Whether to ping topics or queues. Uses p2p by default.
- * <tr><td> username <td> guest <td> The username to access the broker with.
- * <tr><td> password <td> guest <td> The password to access the broker with.
- * <tr><td> selector <td> null <td> Not used. Defines a message selector to filter pings with.
- * <tr><td> destinationCount <td> 1 <td> The number of receivers listening to the pings.
- * <tr><td> timeout <td> 30000 <td> In milliseconds. The timeout to stop waiting for replies.
- * <tr><td> commitBatchSize <td> 1 <td> The number of messages per transaction in transactional mode.
- * <tr><td> uniqueDests <td> true <td> Whether each receiver only listens to one ping destination or all.
- * <tr><td> durableDests <td> false <td> Whether or not durable destinations are used.
- * <tr><td> ackMode <td> AUTO_ACK <td> The message acknowledgement mode. Possible values are:
- * 0 - SESSION_TRANSACTED
- * 1 - AUTO_ACKNOWLEDGE
- * 2 - CLIENT_ACKNOWLEDGE
- * 3 - DUPS_OK_ACKNOWLEDGE
- * 257 - NO_ACKNOWLEDGE
- * 258 - PRE_ACKNOWLEDGE
- * <tr><td> maxPending <td> 0 <td> The maximum size in bytes, of messages sent but not yet received.
- * Limits the volume of messages currently buffered on the client
- * or broker. Can help scale test clients by limiting amount of buffered
- * data to avoid out of memory errors.
- * </table>
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide the names and defaults of all test parameters.
- * </table>
- */
-public class MessagingTestConfigProperties
-{
- // ====================== Connection Properties ==================================
-
- /** Holds the name of the default connection configuration. */
- public static final String CONNECTION_NAME = "broker";
-
- /** Holds the name of the property to get the initial context factory name from. */
- public static final String INITIAL_CONTEXT_FACTORY_PROPNAME = "java.naming.factory.initial";
-
- /** Defines the class to use as the initial context factory by default. */
- public static final String INITIAL_CONTEXT_FACTORY_DEFAULT = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory";
-
- /** Holds the name of the default connection factory configuration property. */
- public static final String CONNECTION_PROPNAME = "connectionfactory.broker";
-
- /** Holds the name of the property to get the test broker url from. */
- public static final String BROKER_PROPNAME = "qpid.test.broker";
-
- /** Holds the name of the property to get the test broker virtual path. */
- public static final String VIRTUAL_HOST_PROPNAME = "virtualHost";
-
- /** Holds the default virtual path for the test. */
- public static final String VIRTUAL_HOST_DEFAULT = "";
-
- /** Holds the name of the property to get the broker access username from. */
- public static final String USERNAME_PROPNAME = "username";
-
- /** Holds the default broker log on username. */
- public static final String USERNAME_DEFAULT = "guest";
-
- /** Holds the name of the property to get the broker access password from. */
- public static final String PASSWORD_PROPNAME = "password";
-
- /** Holds the default broker log on password. */
- public static final String PASSWORD_DEFAULT = "guest";
-
- // ====================== Messaging Topology Properties ==========================
-
- /** Holds the name of the property to get the bind publisher procuder flag from. */
- public static final String PUBLISHER_PRODUCER_BIND_PROPNAME = "publisherProducerBind";
-
- /** Holds the default value of the publisher producer flag. */
- public static final boolean PUBLISHER_PRODUCER_BIND_DEFAULT = true;
-
- /** Holds the name of the property to get the bind publisher procuder flag from. */
- public static final String PUBLISHER_CONSUMER_BIND_PROPNAME = "publisherConsumerBind";
-
- /** Holds the default value of the publisher consumer flag. */
- public static final boolean PUBLISHER_CONSUMER_BIND_DEFAULT = false;
-
- /** Holds the name of the property to get the bind receiver procuder flag from. */
- public static final String RECEIVER_PRODUCER_BIND_PROPNAME = "receiverProducerBind";
-
- /** Holds the default value of the receiver producer flag. */
- public static final boolean RECEIVER_PRODUCER_BIND_DEFAULT = false;
-
- /** Holds the name of the property to get the bind receiver procuder flag from. */
- public static final String RECEIVER_CONSUMER_BIND_PROPNAME = "receiverConsumerBind";
-
- /** Holds the default value of the receiver consumer flag. */
- public static final boolean RECEIVER_CONSUMER_BIND_DEFAULT = true;
-
- /** Holds the name of the property to get the destination name root from. */
- public static final String SEND_DESTINATION_NAME_ROOT_PROPNAME = "sendDestinationRoot";
-
- /** Holds the root of the name of the default destination to send to. */
- public static final String SEND_DESTINATION_NAME_ROOT_DEFAULT = "sendTo";
-
- /** Holds the name of the property to get the destination name root from. */
- public static final String RECEIVE_DESTINATION_NAME_ROOT_PROPNAME = "receiveDestinationRoot";
-
- /** Holds the root of the name of the default destination to send to. */
- public static final String RECEIVE_DESTINATION_NAME_ROOT_DEFAULT = "receiveFrom";
-
- /** Holds the name of the proeprty to get the destination count from. */
- public static final String DESTINATION_COUNT_PROPNAME = "destinationCount";
-
- /** Defines the default number of destinations to ping. */
- public static final int DESTINATION_COUNT_DEFAULT = 1;
-
- /** Holds the name of the property to get the p2p or pub/sub messaging mode from. */
- public static final String PUBSUB_PROPNAME = "pubsub";
-
- /** Holds the pub/sub mode default, true means ping a topic, false means ping a queue. */
- public static final boolean PUBSUB_DEFAULT = false;
-
- // ====================== JMS Options and Flags =================================
-
- /** Holds the name of the property to get the test delivery mode from. */
- public static final String PERSISTENT_MODE_PROPNAME = "persistent";
-
- /** Holds the message delivery mode to use for the test. */
- public static final boolean PERSISTENT_MODE_DEFAULT = false;
-
- /** Holds the name of the property to get the test transactional mode from. */
- public static final String TRANSACTED_PROPNAME = "transacted";
-
- /** Holds the transactional mode to use for the test. */
- public static final boolean TRANSACTED_DEFAULT = false;
-
- /** Holds the name of the property to set the no local flag from. */
- public static final String NO_LOCAL_PROPNAME = "noLocal";
-
- /** Defines the default value of the no local flag to use when consuming messages. */
- public static final boolean NO_LOCAL_DEFAULT = false;
-
- /** Holds the name of the property to get the message acknowledgement mode from. */
- public static final String ACK_MODE_PROPNAME = "ackMode";
-
- /** Defines the default message acknowledgement mode. */
- public static final int ACK_MODE_DEFAULT = Session.AUTO_ACKNOWLEDGE;
-
- /** Holds the name of the property to get the durable subscriptions flag from, when doing pub/sub messaging. */
- public static final String DURABLE_SUBSCRIPTION_PROPNAME = "durableSubscription";
-
- /** Defines the default value of the durable subscriptions flag. */
- public static final boolean DURABLE_SUBSCRIPTION_DEFAULT = false;
-
- // ====================== Qpid Options and Flags ================================
-
- /** Holds the name of the property to set the exclusive flag from. */
- public static final String EXCLUSIVE_PROPNAME = "exclusive";
-
- /** Defines the default value of the exclusive flag to use when consuming messages. */
- public static final boolean EXCLUSIVE_DEFAULT = false;
-
- /** Holds the name of the property to set the immediate flag from. */
- public static final String IMMEDIATE_PROPNAME = "immediate";
-
- /** Defines the default value of the immediate flag to use when sending messages. */
- public static final boolean IMMEDIATE_DEFAULT = false;
-
- /** Holds the name of the property to set the mandatory flag from. */
- public static final String MANDATORY_PROPNAME = "mandatory";
-
- /** Defines the default value of the mandatory flag to use when sending messages. */
- public static final boolean MANDATORY_DEFAULT = false;
-
- /** Holds the name of the property to get the durable destinations flag from. */
- public static final String DURABLE_DESTS_PROPNAME = "durableDests";
-
- /** Default value for the durable destinations flag. */
- public static final boolean DURABLE_DESTS_DEFAULT = false;
-
- /** Holds the name of the proeprty to set the prefetch size from. */
- public static final String PREFECTH_PROPNAME = "prefetch";
-
- /** Defines the default prefetch size to use when consuming messages. */
- public static final int PREFETCH_DEFAULT = 100;
-
- // ====================== Common Test Parameters ================================
-
- /** Holds the name of the property to get the test message size from. */
- public static final String MESSAGE_SIZE_PROPNAME = "messageSize";
-
- /** Used to set up a default message size. */
- public static final int MESSAGE_SIZE_DEAFULT = 0;
-
- /** Holds the name of the property to get the message rate from. */
- public static final String RATE_PROPNAME = "rate";
-
- /** Defines the default rate (in pings per second) to send pings at. 0 means as fast as possible, no restriction. */
- public static final int RATE_DEFAULT = 0;
-
- /** Holds the name of the proeprty to get the. */
- public static final String SELECTOR_PROPNAME = "selector";
-
- /** Holds the default message selector. */
- public static final String SELECTOR_DEFAULT = "";
-
- /** Holds the name of the property to get the waiting timeout for response messages. */
- public static final String TIMEOUT_PROPNAME = "timeout";
-
- /** Default time to wait before assuming that a ping has timed out. */
- public static final long TIMEOUT_DEFAULT = 30000;
-
- /** Holds the name of the property to get the commit batch size from. */
- public static final String TX_BATCH_SIZE_PROPNAME = "commitBatchSize";
-
- /** Defines the default number of pings to send in each transaction when running transactionally. */
- public static final int TX_BATCH_SIZE_DEFAULT = 1;
-
- /** Holds the name of the property to set the maximum amount of pending message data for a producer to hold. */
- public static final String MAX_PENDING_PROPNAME = "maxPending";
-
- /** Defines the default maximum quantity of pending message data to allow producers to hold. */
- public static final int MAX_PENDING_DEFAULT = 0;
-
- /** Holds the name of the property to get the verbose mode proeprty from. */
- public static final String VERBOSE_PROPNAME = "verbose";
-
- /** Holds the default verbose mode. */
- public static final boolean VERBOSE_DEFAULT = false;
-
- /** Holds the default configuration properties. */
- public static ParsedProperties defaults = new ParsedProperties();
-
- static
- {
- defaults.setPropertyIfNull(INITIAL_CONTEXT_FACTORY_PROPNAME, INITIAL_CONTEXT_FACTORY_DEFAULT);
- defaults.setPropertyIfNull(MESSAGE_SIZE_PROPNAME, MESSAGE_SIZE_DEAFULT);
- defaults.setPropertyIfNull(PUBLISHER_PRODUCER_BIND_PROPNAME, PUBLISHER_PRODUCER_BIND_DEFAULT);
- defaults.setPropertyIfNull(PUBLISHER_CONSUMER_BIND_PROPNAME, PUBLISHER_CONSUMER_BIND_DEFAULT);
- defaults.setPropertyIfNull(RECEIVER_PRODUCER_BIND_PROPNAME, RECEIVER_PRODUCER_BIND_DEFAULT);
- defaults.setPropertyIfNull(RECEIVER_CONSUMER_BIND_PROPNAME, RECEIVER_CONSUMER_BIND_DEFAULT);
- defaults.setPropertyIfNull(SEND_DESTINATION_NAME_ROOT_PROPNAME, SEND_DESTINATION_NAME_ROOT_DEFAULT);
- defaults.setPropertyIfNull(RECEIVE_DESTINATION_NAME_ROOT_PROPNAME, RECEIVE_DESTINATION_NAME_ROOT_DEFAULT);
- defaults.setPropertyIfNull(PERSISTENT_MODE_PROPNAME, PERSISTENT_MODE_DEFAULT);
- defaults.setPropertyIfNull(TRANSACTED_PROPNAME, TRANSACTED_DEFAULT);
- defaults.setPropertyIfNull(VIRTUAL_HOST_PROPNAME, VIRTUAL_HOST_DEFAULT);
- defaults.setPropertyIfNull(RATE_PROPNAME, RATE_DEFAULT);
- defaults.setPropertyIfNull(VERBOSE_PROPNAME, VERBOSE_DEFAULT);
- defaults.setPropertyIfNull(PUBSUB_PROPNAME, PUBSUB_DEFAULT);
- defaults.setPropertyIfNull(USERNAME_PROPNAME, USERNAME_DEFAULT);
- defaults.setPropertyIfNull(PASSWORD_PROPNAME, PASSWORD_DEFAULT);
- defaults.setPropertyIfNull(SELECTOR_PROPNAME, SELECTOR_DEFAULT);
- defaults.setPropertyIfNull(DESTINATION_COUNT_PROPNAME, DESTINATION_COUNT_DEFAULT);
- defaults.setPropertyIfNull(TIMEOUT_PROPNAME, TIMEOUT_DEFAULT);
- defaults.setPropertyIfNull(TX_BATCH_SIZE_PROPNAME, TX_BATCH_SIZE_DEFAULT);
- defaults.setPropertyIfNull(DURABLE_DESTS_PROPNAME, DURABLE_DESTS_DEFAULT);
- defaults.setPropertyIfNull(ACK_MODE_PROPNAME, ACK_MODE_DEFAULT);
- defaults.setPropertyIfNull(DURABLE_SUBSCRIPTION_PROPNAME, DURABLE_SUBSCRIPTION_DEFAULT);
- defaults.setPropertyIfNull(MAX_PENDING_PROPNAME, MAX_PENDING_DEFAULT);
- defaults.setPropertyIfNull(PREFECTH_PROPNAME, PREFETCH_DEFAULT);
- defaults.setPropertyIfNull(NO_LOCAL_PROPNAME, NO_LOCAL_DEFAULT);
- defaults.setPropertyIfNull(EXCLUSIVE_PROPNAME, EXCLUSIVE_DEFAULT);
- defaults.setPropertyIfNull(IMMEDIATE_PROPNAME, IMMEDIATE_DEFAULT);
- defaults.setPropertyIfNull(MANDATORY_PROPNAME, MANDATORY_DEFAULT);
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/server/exchange/ReturnUnroutableMandatoryMessageTest.java b/java/systests/src/main/java/org/apache/qpid/server/exchange/ReturnUnroutableMandatoryMessageTest.java
index 2a1895d6c8..3d116f1b1b 100644
--- a/java/systests/src/main/java/org/apache/qpid/server/exchange/ReturnUnroutableMandatoryMessageTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/server/exchange/ReturnUnroutableMandatoryMessageTest.java
@@ -241,7 +241,7 @@ public class ReturnUnroutableMandatoryMessageTest extends QpidBrokerTestCase imp
con2.start();
MessageProducer nonMandatoryProducer = producerSession.createProducer(valid_topic, false, false);
- MessageProducer mandatoryProducer = producerSession.createProducer(invalid_topic);
+ MessageProducer mandatoryProducer = producerSession.createProducer(invalid_topic, false, true);
// First test - should be routed
_logger.info("Sending non-mandatory message");
diff --git a/java/systests/src/main/java/org/apache/qpid/server/logging/DerbyMessageStoreLoggingTest.java b/java/systests/src/main/java/org/apache/qpid/server/logging/DerbyMessageStoreLoggingTest.java
deleted file mode 100644
index e32edff692..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/server/logging/DerbyMessageStoreLoggingTest.java
+++ /dev/null
@@ -1,573 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.logging;
-
-import org.apache.qpid.server.configuration.ServerConfiguration;
-import org.apache.qpid.server.logging.subjects.AbstractTestLogSubject;
-
-import javax.jms.Connection;
-import javax.jms.Queue;
-import javax.jms.Session;
-import java.io.File;
-import java.util.List;
-
-/**
- * The MessageStore test suite validates that the follow log messages as
- * specified in the Functional Specification.
- *
- * This suite of tests validate that the MessageStore messages occur correctly
- * and according to the following format:
- *
- * MST-1001 : Created : <name>
- * MST-1003 : Closed
- *
- * NOTE: Only for Persistent Stores
- * MST-1002 : Store location : <path>
- * MST-1004 : Recovery Start [: <queue.name>]
- * MST-1005 : Recovered <count> messages for queue <queue.name>
- * MST-1006 : Recovery Complete [: <queue.name>]
- */
-public class DerbyMessageStoreLoggingTest extends MemoryMessageStoreLoggingTest
-{
-
- @Override
- public void setUp() throws Exception
- {
- super.setUp();
- // MemoryMessageStoreLoggingTest setUp itself does not call super.setUp
- //We call super.setUp but this will not start the broker as that is
- //part of the test case.
-
- // Load the default configuration file to get the list of defined vhosts
- ServerConfiguration configuration = new ServerConfiguration(new File(_configFile.getParent() + "/config.xml"));
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- // Make them all persistent i.e. Use DerbyMessageStore and
- // test that it logs correctly.
- for (String vhost : vhosts)
- {
- makeVirtualHostPersistent(vhost);
- }
- }
-
- /**
- * Description:
- * Persistent MessageStores will require space on disk to persist the data.
- * This value will be logged on startup after the MessageStore has been
- * created.
- * Input:
- * Default configuration
- * Output:
- *
- * <date> MST-1002 : Store location : <path>
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. This must occur after MST-1001
- */
- public void testMessageStoreStoreLocation() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- startBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1002");
-
- assertEquals("Each vhost did not close its store.", vhosts.size(), results.size());
-
- for (int index = 0; index < results.size(); index++)
- {
- String result = getLogMessage(results, index);;
-
- // getSlize will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // To get the store class used in the configuration we need to know
- // the virtualhost name, found above. AND
- // the index that the virtualhost is within the configuration.
- // we can retrive that from the vhosts list previously extracted.
- String fullStoreName = configuration.getConfig().getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class");
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertTrue("MST-1002 does not contain a store path" + getMessageString(result),
- getMessageString(result).length() > 0);
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
- }
- }
-
- /**
- * Description:
- * Persistent message stores may have state on disk that they must recover
- * during startup. As the MessageStore starts up it will report that it is
- * about to start the recovery process by logging MST-1004. This message
- * will always be logged for persistent MessageStores. If there is no data
- * to recover then there will be no subsequent recovery messages.
- * Input:
- * Default persistent configuration
- * Output:
- * <date> MST-1004 : Recovery Start
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. The MessageStore must have first logged a creation event.
- */
- public void testMessageStoreRecoveryStart() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- startBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1004");
-
- assertTrue("Each vhost did not close its store.", vhosts.size() <= results.size());
-
- for (int index = 0; index < results.size(); index++)
- {
- String result = getLogMessage(results, index);;
-
- if (getMessageString(result).contains("Recovery Start :"))
- {
- //Don't test queue start recoveries
- continue;
- }
-
- // getSlize will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // To get the store class used in the configuration we need to know
- // the virtualhost name, found above. AND
- // the index that the virtualhost is within the configuration.
- // we can retrive that from the vhosts list previously extracted.
- String fullStoreName = configuration.getConfig().getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class");
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertEquals("MST-1004 does have expected message", "Recovery Start",
- getMessageString(result));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
- }
- }
-
- /**
- * Description:
- * Once all persistent queues have been recovered and the MessageStore has completed all recovery it must logged that the recovery process has completed.
- * Input:
- * Default persistent configuration
- * Output:
- *
- * <date> MST-1006 : Recovery Complete
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. This is the last message from the MessageStore during startup.
- * 3. This must be proceeded by a MST-1006 Recovery Start.
- */
- public void testMessageStoreRecoveryComplete() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- startBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1006");
-
- assertTrue("Each vhost did not close its store.", vhosts.size() <= results.size());
-
- for (int index = 0; index < results.size(); index++)
- {
- String result = getLogMessage(results, index);
-
- if (getMessageString(result).contains("Recovery Complete :"))
- {
- //Don't test queue start recoveries
- continue;
- }
-
- // getSlize will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // To get the store class used in the configuration we need to know
- // the virtualhost name, found above. AND
- // the index that the virtualhost is within the configuration.
- // we can retrive that from the vhosts list previously extracted.
- String fullStoreName = configuration.getConfig().getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class");
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertEquals("MST-1006 does have expected message", "Recovery Complete",
- getMessageString(result));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
- }
- }
-
- /**
- * Description:
- * A persistent MessageStore may have data to recover from disk. The message store will use MST-1004 to report the start of recovery for a specific queue that it has previously persisted.
- * Input:
- * Default persistent configuration
- * Output:
- *
- * <date> MST-1004 : Recovery Start : <queue.name>
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. This must occur after the recovery start MST-1004 has been logged.
- */
- public void testMessageStoreQueueRecoveryStart() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- startBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1004 : Recovery Start :");
-
- // We are only looking for the default queue defined in local host being
- // recovered. If other tests have made queues in test then we want to
- // exclude them here.
- results = filterResultsByVirtualHost(results, "/localhost");
-
- assertEquals("Recovered test queue not found.", 1, results.size());
-
- String result = getLogMessage(results, 0);
-
- // getSlize will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // To get the store class used in the configuration we need to know
- // the virtualhost name, found above. AND
- // the index that the virtualhost is within the configuration.
- // we can retrive that from the vhosts list previously extracted.
- String fullStoreName = configuration.getConfig().getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class");
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertTrue("MST-1006 does end with queue 'test-queue':" + getMessageString(result),
- getMessageString(result).endsWith("test-queue"));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
-
- }
-
- /**
- * Description:
- * After the queue has been recovered the store will log that recovery has been completed. The MessageStore must not report further status about the recovery of this queue after this message. In addition every MST-1004 queue recovery start message must be matched with a MST-1006 recovery complete.
- * Input:
- * Default persistent configuration
- * Output:
- *
- * <date> MST-1006 : Recovery Complete : <queue.name>
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. This must occur after the queue recovery start MST-1004 has been logged.
- * 3. The queue.name is non-empty
- * 4. The queue.name correlates with a previous recovery start
- */
- public void testMessageStoreQueueRecoveryComplete() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- startBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1006 : Recovery Complete :");
-
- // We are only looking for the default queue defined in local host being
- // recovered. If other tests have made queues in test then we want to
- // exclude them here.
- results = filterResultsByVirtualHost(results, "/localhost");
-
- assertEquals("Recovered test queue not found.", 1, results.size());
-
- String result = getLogMessage(results, 0);
-
- // getSlize will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // To get the store class used in the configuration we need to know
- // the virtualhost name, found above. AND
- // the index that the virtualhost is within the configuration.
- // we can retrive that from the vhosts list previously extracted.
- String fullStoreName = configuration.getConfig().getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class");
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertTrue("MST-1006 does end with queue 'test-queue':" + getMessageString(result),
- getMessageString(result).endsWith("test-queue"));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
-
- results = findMatches("MST-1004 : Recovery Start : test-queue");
-
- assertEquals("MST-1004 for test-queue not found", 1, results.size());
- }
-
- /**
- * Description:
- * A persistent queue must be persisted so that on recovery it can be restored independently of any messages that may be stored on it. This test verifies that the MessageStore will log that it has recovered 0 messages for persistent queues that do not have any messages.
- * Input:
- *
- * 1. Default persistent configuration
- * 2. Persistent queue with no messages enqueued
- * Output:
- *
- * <date> MST-1005 : Recovered 0 messages for queue <queue.name>
- *
- * Validation Steps:
- * 3. The MST ID is correct
- * 4. This must occur after the queue recovery start MST-1004 has been logged.
- * 5. The count is 0
- * 6. 'messages' is correctly printed
- * 7. The queue.name is non-empty
- */
- public void testMessageStoreQueueRecoveryCountEmpty() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- String queueName = getTestQueueName();
-
- startBroker();
- Connection connetion = getConnection();
- Session session = connetion.createSession(false, Session.AUTO_ACKNOWLEDGE);
- Queue queue = session.createQueue("direct://amq.direct/" + queueName + "/" + queueName + "?durable='true'");
-
- session.createConsumer(queue).close();
-
- // Stop the broker so that we can test recovery
- stopBroker();
-
- int COUNT = 0;
- testDurableRecoveryCount(COUNT, queueName);
- }
-
- /**
- * Description:
- * On recovery all the persistent messages that are stored on disk must be returned to the queue. MST-1005 will report the number of messages that have been recovered from disk.
- * Input:
- *
- * 1. Default persistent configuration
- * 2. Persistent queue with multiple messages enqueued
- * Output:
- *
- * <date> MST-1005 : Recovered <count> messages for queue <queue.name>
- *
- * Validation Steps:
- * 3. The MST ID is correct
- * 4. This must occur after the queue recovery start MST-1004 has been logged.
- * 5. The count is > 1
- * 6. 'messages' is correctly printed
- * 7. The queue.name is non-empty
- */
- public void testMessageStoreQueueRecoveryCountPlural() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- String queueName = getTestQueueName();
-
- int COUNT = 10;
-
- testDurableRecoveryCount(COUNT, queueName);
- }
-
- /**
- * Send a set number of messages to a new durable queue, as specified. Then
- * restart the broker and validate that they are restored.
- *
- * @param COUNT - the count to send
- * @param queueName - the new queue name
- * @throws Exception - if a problem occured.
- */
- private void testDurableRecoveryCount(int COUNT, String queueName) throws Exception
- {
- startBroker();
- Connection connetion = getConnection();
- Session session = connetion.createSession(false, Session.AUTO_ACKNOWLEDGE);
- Queue queue = session.createQueue("direct://amq.direct/" + queueName + "/" + queueName + "?durable='true'");
-
- session.createConsumer(queue).close();
-
- sendMessage(session, queue, COUNT);
- try
- {
- connetion.close();
-
- stopBroker();
-
- // Clear our monitor
- _monitor.markDiscardPoint();
-
- startBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1004 : Recovery Start : " + queueName);
-
- assertEquals("Recovered test queue not found.", 1, results.size());
-
- String result = getLogMessage(results, 0);
-
- validateMessageID("MST-1004", result);
-
- assertTrue("MST-1004 does end with queue '" + queueName + "':" + getMessageString(result),
- getMessageString(result).endsWith(queueName));
-
- results = waitAndFindMatches("MST-1005");
-
- assertTrue("Insufficient MST-1005 logged.", results.size()>0);
-
- result = null;
-
- // If the first message is not our queue the second one will be
- for(String resultEntry : results)
- {
- // Look for first match and set that to result
- if (resultEntry.contains(queueName))
- {
- result = getLog(resultEntry);
- break;
- }
- }
-
- assertNotNull("MST-1005 entry for queue:" + queueName + ". Not found", result);
-
- // getSlize will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // To get the store class used in the configuration we need to know
- // the virtualhost name, found above. AND
- // the index that the virtualhost is within the configuration.
- // we can retrive that from the vhosts list previously extracted.
- String fullStoreName = configuration.getConfig().getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class");
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertTrue("MST-1005 does end with queue 'test-queue':" + getMessageString(result),
- getMessageString(result).endsWith(queueName));
-
- assertTrue("MST-1005 does end show correct count:" + getMessageString(result),
- getMessageString(result).contains("Recovered " + COUNT + " messages"));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
- }
- finally
- {
- //Ensure we attempt to drain the queue.
- assertEquals("Unable to drain queue", COUNT, drainQueue(queue));
- }
- }
-
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/server/logging/MemoryMessageStoreLoggingTest.java b/java/systests/src/main/java/org/apache/qpid/server/logging/MemoryMessageStoreLoggingTest.java
deleted file mode 100644
index e6e1196cc6..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/server/logging/MemoryMessageStoreLoggingTest.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
-*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*
-*/
-package org.apache.qpid.server.logging;
-
-import org.apache.qpid.server.configuration.ServerConfiguration;
-import org.apache.qpid.server.logging.subjects.AbstractTestLogSubject;
-import org.apache.qpid.util.LogMonitor;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * The MessageStore test suite validates that the follow log messages as
- * specified in the Functional Specification.
- *
- * This suite of tests validate that the MessageStore messages occur correctly
- * and according to the following format:
- *
- * MST-1001 : Created : <name>
- * MST-1003 : Closed
- *
- * NOTE: Only for Persistent Stores
- * MST-1002 : Store location : <path>
- * MST-1004 : Recovery Start [: <queue.name>]
- * MST-1005 : Recovered <count> messages for queue <queue.name>
- * MST-1006 : Recovery Complete [: <queue.name>]
- */
-public class MemoryMessageStoreLoggingTest extends AbstractTestLogging
-{
- protected static final String MESSAGES_STORE_PREFIX = "MST-";
-
- public void setUp() throws Exception
- {
- //We explicitly do not call super.setUp as starting up the broker is
- //part of the test case.
- // So we have to make the new Log Monitor here
-
- _monitor = new LogMonitor(_outputFile);
- }
-
- /**
- * Description:
- * During Virtualhost startup a MessageStore will be created. The first MST
- * message that must be logged is the MST-1001 MessageStore creation.
- * Input:
- * Default configuration
- * Output:
- * <date> MST-1001 : Created : <name>
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. The <name> is the correct MessageStore type as specified in the Default configuration
- *
- * @throws Exception caused by broker startup
- */
- public void testMessageStoreCreation() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- super.setUp();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- String log = getLogMessage(results, 0);
- //1
- assertEquals("MST-1001 is not the first MST message", "MST-1001", getMessageID(fromMessage(log)));
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1001");
-
- // Load VirtualHost list from file.
- List<String> vhosts = Arrays.asList(getServerConfig().getVirtualHosts());
-
- assertEquals("Each vhost did not create a store.", vhosts.size(), results.size());
-
- for (int index = 0; index < results.size(); index++)
- {
- String result = getLogMessage(results, index);
-
- // getSlice will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // Get the store class used in the configuration for the virtualhost.
- String fullStoreName = getServerConfig().getVirtualHostConfig(vhostName).getMessageStoreClass();
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertTrue("MST-1001 does not contains correct store name:"
- + storeName + ":" + result, getMessageString(result).endsWith(storeName));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
- }
- }
-
- /**
- * Description:
- * During shutdown the MessageStore will also cleanly close. When this has
- * completed a MST-1003 closed message will be logged. No further messages
- * from this MessageStore will be logged after this message.
- *
- * Input:
- * Default configuration
- * Output:
- * <date> MST-1003 : Closed
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. This is teh last log message from this MessageStore
- *
- * @throws Exception caused by broker startup
- */
- public void testMessageStoreClose() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- super.setUp();
-
- //Stop the broker so we get the close messages.
- stopBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = Arrays.asList(configuration.getVirtualHosts());
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1003");
-
- assertEquals("Each vhost did not close its store.", vhosts.size(), results.size());
-
- for (int index = 0; index < results.size(); index++)
- {
- String result = getLogMessage(results, index);
-
- // getSlice will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // Get the store class used in the configuration for the virtualhost.
- String fullStoreName = configuration.getVirtualHostConfig(vhostName).getMessageStoreClass();
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertEquals("MST-1003 does not close:",
- "Closed", getMessageString(result));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
- }
- }
-
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/server/logging/SubscriptionLoggingTest.java b/java/systests/src/main/java/org/apache/qpid/server/logging/SubscriptionLoggingTest.java
index ddcb96b4db..236202f323 100644
--- a/java/systests/src/main/java/org/apache/qpid/server/logging/SubscriptionLoggingTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/server/logging/SubscriptionLoggingTest.java
@@ -20,6 +20,7 @@
*/
package org.apache.qpid.server.logging;
+import javax.jms.QueueBrowser;
import junit.framework.AssertionFailedError;
import org.apache.qpid.client.AMQConnection;
@@ -166,8 +167,10 @@ public class SubscriptionLoggingTest extends AbstractTestLogging
*/
public void testSubscriptionCreateQueueBrowser() throws JMSException, IOException
{
- _session.createBrowser(_queue);
+ _connection.start();
+ QueueBrowser browser = _session.createBrowser(_queue);
+ browser.getEnumeration();
//Validate
//Ensure that we wait for the SUB log message
waitAndFindMatches("SUB-1001");
diff --git a/java/systests/src/main/java/org/apache/qpid/server/persistent/NoLocalAfterRecoveryTest.java b/java/systests/src/main/java/org/apache/qpid/server/persistent/NoLocalAfterRecoveryTest.java
index 2e259191aa..bcad59a1fa 100644
--- a/java/systests/src/main/java/org/apache/qpid/server/persistent/NoLocalAfterRecoveryTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/server/persistent/NoLocalAfterRecoveryTest.java
@@ -42,7 +42,7 @@ public class NoLocalAfterRecoveryTest extends QpidBrokerTestCase
protected final String MY_TOPIC_SUBSCRIPTION_NAME = this.getName();
protected static final int SEND_COUNT = 10;
- public void test() throws Exception
+ public void testNoLocalNotQueued() throws Exception
{
if(!isBrokerStorePersistent())
{
@@ -66,6 +66,8 @@ public class NoLocalAfterRecoveryTest extends QpidBrokerTestCase
// Check messages can be received as expected.
connection.start();
+ //As the no-local subscriber was on the same connection the messages were
+ //published on, tit will receive no messages as they will be discarded on the broker
List<Message> received = receiveMessage(noLocalSubscriber, SEND_COUNT);
assertEquals("No Local Subscriber Received messages", 0, received.size());
@@ -73,10 +75,12 @@ public class NoLocalAfterRecoveryTest extends QpidBrokerTestCase
assertEquals("Normal Subscriber Received no messages",
SEND_COUNT, received.size());
session.commit();
+
+ normalSubscriber.close();
connection.close();
- //We didn't receive the messages on the durable queue for the no-local subscriber
- //so they are still on the broker. Restart the broker, prompting their recovery.
+ //Ensure the no-local subscribers messages were discarded by restarting the broker
+ //and reconnecting to the subscription to ensure they were not recovered.
restartBroker();
Connection connection2 = getConnection();
@@ -89,12 +93,72 @@ public class NoLocalAfterRecoveryTest extends QpidBrokerTestCase
createDurableSubscriber(topic2, MY_TOPIC_SUBSCRIPTION_NAME + "-NoLocal",
null, true);
- // The NO-local subscriber should now get ALL the messages
- // as they are being consumed on a different connection to
- // the one that they were published on.
+ // The NO-local subscriber should not get any messages
+ received = receiveMessage(noLocalSubscriber2, SEND_COUNT);
+ session2.commit();
+ assertEquals("No Local Subscriber Received messages", 0, received.size());
+
+ noLocalSubscriber2.close();
+
+
+ }
+
+
+ public void testNonNoLocalQueued() throws Exception
+ {
+ if(!isBrokerStorePersistent())
+ {
+ fail("This test requires a broker with a persistent store");
+ }
+
+ Connection connection = getConnection();
+ Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
+ Topic topic = session.createTopic(MY_TOPIC_SUBSCRIPTION_NAME);
+
+ TopicSubscriber noLocalSubscriber =
+ session.createDurableSubscriber(topic, MY_TOPIC_SUBSCRIPTION_NAME + "-NoLocal", null, true);
+
+
+ sendMessage(session, topic, SEND_COUNT);
+
+ // Check messages can be received as expected.
+ connection.start();
+
+ List<Message> received = receiveMessage(noLocalSubscriber, SEND_COUNT);
+ assertEquals("No Local Subscriber Received messages", 0, received.size());
+
+
+
+ session.commit();
+
+ Connection connection3 = getConnection();
+ Session session3 = connection3.createSession(true, Session.SESSION_TRANSACTED);
+ sendMessage(session3, topic, SEND_COUNT);
+
+
+ connection.close();
+
+ //We didn't receive the messages on the durable queue for the no-local subscriber
+ //so they are still on the broker. Restart the broker, prompting their recovery.
+ restartBroker();
+
+ Connection connection2 = getConnection();
+ connection2.start();
+
+ Session session2 = connection2.createSession(true, Session.SESSION_TRANSACTED);
+ Topic topic2 = session2.createTopic(MY_TOPIC_SUBSCRIPTION_NAME);
+
+ TopicSubscriber noLocalSubscriber2 =
+ session2.createDurableSubscriber(topic2, MY_TOPIC_SUBSCRIPTION_NAME + "-NoLocal",null, true);
+
+ // The NO-local subscriber should receive messages sent from connection3
received = receiveMessage(noLocalSubscriber2, SEND_COUNT);
session2.commit();
- assertEquals("No Local Subscriber Received messages", SEND_COUNT, received.size());
+ assertEquals("No Local Subscriber did not receive expected messages", SEND_COUNT, received.size());
+
+ noLocalSubscriber2.close();
+
+
}
protected List<Message> receiveMessage(MessageConsumer messageConsumer,
diff --git a/java/systests/src/main/java/org/apache/qpid/server/queue/PriorityQueueTest.java b/java/systests/src/main/java/org/apache/qpid/server/queue/PriorityQueueTest.java
index 7cb58ff1ed..a6c9885568 100644
--- a/java/systests/src/main/java/org/apache/qpid/server/queue/PriorityQueueTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/server/queue/PriorityQueueTest.java
@@ -21,8 +21,10 @@
package org.apache.qpid.server.queue;
import org.apache.qpid.AMQException;
+import org.apache.qpid.client.AMQConnection;
import org.apache.qpid.client.AMQDestination;
import org.apache.qpid.client.AMQSession;
+import org.apache.qpid.configuration.ClientProperties;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.test.utils.QpidBrokerTestCase;
@@ -30,12 +32,15 @@ import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.naming.NamingException;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
public class PriorityQueueTest extends QpidBrokerTestCase
{
@@ -197,4 +202,99 @@ public class PriorityQueueTest extends QpidBrokerTestCase
return send;
}
+
+ /**
+ * Test that after sending an initial message with priority 0, it is able to be repeatedly reflected back to the queue using
+ * default priority and then consumed again, with separate transacted sessions with prefetch 1 for producer and consumer.
+ *
+ * Highlighted defect with PriorityQueues resolved in QPID-3927.
+ */
+ public void testMessageReflectionWithPriorityIncreaseOnTransactedSessionsWithPrefetch1() throws Exception
+ {
+ setTestClientSystemProperty(ClientProperties.MAX_PREFETCH_PROP_NAME, "1");
+ Connection conn = getConnection();
+ conn.start();
+ assertEquals("Prefetch not reset", 1, ((AMQConnection) conn).getMaxPrefetch());
+
+ final Session producerSess = conn.createSession(true, Session.SESSION_TRANSACTED);
+ final Session consumerSess = conn.createSession(true, Session.SESSION_TRANSACTED);
+
+ //declare a priority queue with 10 priorities
+ final Map<String,Object> arguments = new HashMap<String, Object>();
+ arguments.put("x-qpid-priorities",10);
+ ((AMQSession<?,?>) producerSess).createQueue(new AMQShortString(getTestQueueName()), false, true, false, arguments);
+
+ Queue queue = producerSess.createQueue(getTestQueueName());
+
+ //create the consumer, producer, add message listener
+ CountDownLatch latch = new CountDownLatch(5);
+ MessageConsumer cons = producerSess.createConsumer(queue);
+ MessageProducer producer = producerSess.createProducer(queue);
+
+ ReflectingMessageListener listener = new ReflectingMessageListener(producerSess,producer,consumerSess,latch);
+ cons.setMessageListener(listener);
+
+ //Send low priority 0 message to kick start the asynchronous reflection process
+ producer.setPriority(0);
+ producer.send(nextMessage(1, true, producerSess, producer));
+ producerSess.commit();
+
+ //wait for the reflection process to complete
+ assertTrue("Test process failed to complete in allowed time", latch.await(10, TimeUnit.SECONDS));
+ assertNull("Unexpected throwable encountered", listener.getThrown());
+ }
+
+ private static class ReflectingMessageListener implements MessageListener
+ {
+ private Session _prodSess;
+ private Session _consSess;
+ private CountDownLatch _latch;
+ private MessageProducer _prod;
+ private long _origCount;
+ private Throwable _lastThrown;
+
+ public ReflectingMessageListener(final Session prodSess, final MessageProducer prod,
+ final Session consSess, final CountDownLatch latch)
+ {
+ _latch = latch;
+ _origCount = _latch.getCount();
+ _prodSess = prodSess;
+ _consSess = consSess;
+ _prod = prod;
+ }
+
+ @Override
+ public void onMessage(final Message message)
+ {
+ try
+ {
+ _latch.countDown();
+ long msgNum = _origCount - _latch.getCount();
+ System.out.println("Received message " + msgNum + " with ID: " + message.getIntProperty("msg"));
+
+ if(_latch.getCount() > 0)
+ {
+ //reflect the message, updating its ID and using default priority
+ message.clearProperties();
+ message.setIntProperty("msg", (int) msgNum + 1);
+ _prod.setPriority(Message.DEFAULT_PRIORITY);
+ _prod.send(message);
+ _prodSess.commit();
+ }
+
+ //commit the consumer session to consume the message
+ _consSess.commit();
+ }
+ catch(Throwable t)
+ {
+ t.printStackTrace();
+ _lastThrown = t;
+ }
+ }
+
+ public Throwable getThrown()
+ {
+ return _lastThrown;
+ }
+ }
}
diff --git a/java/systests/src/main/java/org/apache/qpid/server/queue/ProducerFlowControlTest.java b/java/systests/src/main/java/org/apache/qpid/server/queue/ProducerFlowControlTest.java
index ad8c856a74..13053d02df 100644
--- a/java/systests/src/main/java/org/apache/qpid/server/queue/ProducerFlowControlTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/server/queue/ProducerFlowControlTest.java
@@ -357,13 +357,45 @@ public class ProducerFlowControlTest extends AbstractTestLogging
consumer.receive();
}
+ public void testQueueDeleteWithBlockedFlow() throws Exception
+ {
+ String queueName = getTestQueueName();
+ createAndBindQueueWithFlowControlEnabled(producerSession, queueName, 1000, 800, true, false);
+
+ producer = producerSession.createProducer(queue);
+
+ // try to send 5 messages (should block after 4)
+ sendMessagesAsync(producer, producerSession, 5, 50L);
+
+ Thread.sleep(5000);
+
+ assertEquals("Incorrect number of message sent before blocking", 4, _sentMessages.get());
+
+ // close blocked producer session and connection
+ producerConnection.close();
+
+ // delete queue with a consumer session
+ ((AMQSession<?,?>) consumerSession).sendQueueDelete(new AMQShortString(queueName));
+
+ consumer = consumerSession.createConsumer(queue);
+ consumerConnection.start();
+
+ Message message = consumer.receive(1000l);
+ assertNull("Unexpected message", message);
+ }
+
private void createAndBindQueueWithFlowControlEnabled(Session session, String queueName, int capacity, int resumeCapacity) throws Exception
{
+ createAndBindQueueWithFlowControlEnabled(session, queueName, capacity, resumeCapacity, false, true);
+ }
+
+ private void createAndBindQueueWithFlowControlEnabled(Session session, String queueName, int capacity, int resumeCapacity, boolean durable, boolean autoDelete) throws Exception
+ {
final Map<String,Object> arguments = new HashMap<String, Object>();
arguments.put("x-qpid-capacity",capacity);
arguments.put("x-qpid-flow-resume-capacity",resumeCapacity);
- ((AMQSession<?,?>) session).createQueue(new AMQShortString(queueName), true, false, false, arguments);
- queue = session.createQueue("direct://amq.direct/"+queueName+"/"+queueName+"?durable='false'&autodelete='true'");
+ ((AMQSession<?,?>) session).createQueue(new AMQShortString(queueName), autoDelete, durable, false, arguments);
+ queue = session.createQueue("direct://amq.direct/"+queueName+"/"+queueName+"?durable='" + durable + "'&autodelete='" + autoDelete + "'");
((AMQSession<?,?>) session).declareAndBind((AMQDestination)queue);
}
diff --git a/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java b/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java
index 54abb76b6d..f2d4a513be 100644
--- a/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java
+++ b/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java
@@ -26,10 +26,10 @@ import org.apache.log4j.Logger;
import org.apache.qpid.AMQStoreException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.binding.Binding;
import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.federation.Bridge;
import org.apache.qpid.server.federation.BrokerLink;
-import org.apache.qpid.server.logging.LogSubject;
import org.apache.qpid.server.message.EnqueableMessage;
import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.queue.AMQQueue;
@@ -38,7 +38,7 @@ import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Iterator;
-public class SlowMessageStore implements MessageStore, DurableConfigurationStore
+public class SlowMessageStore implements MessageStore
{
private static final Logger _logger = Logger.getLogger(SlowMessageStore.class);
private static final String DELAYS = "delays";
@@ -55,11 +55,8 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
public void configureConfigStore(String name,
ConfigurationRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception
+ Configuration config) throws Exception
{
- //To change body of implemented methods use File | Settings | File Templates.
-
_logger.info("Starting SlowMessageStore on Virtualhost:" + name);
Configuration delays = config.subset(DELAYS);
@@ -74,7 +71,7 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
if (messageStoreClass != null)
{
- Class clazz = Class.forName(messageStoreClass);
+ Class<?> clazz = Class.forName(messageStoreClass);
Object o = clazz.newInstance();
@@ -89,13 +86,14 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
_durableConfigurationStore = (DurableConfigurationStore)o;
}
}
- _durableConfigurationStore.configureConfigStore(name, recoveryHandler, config, logSubject);
+ _durableConfigurationStore.configureConfigStore(name, recoveryHandler, config);
}
private void configureDelays(Configuration config)
{
- Iterator delays = config.getKeys();
+ @SuppressWarnings("unchecked")
+ Iterator<String> delays = config.getKeys();
while (delays.hasNext())
{
@@ -160,11 +158,11 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
public void configureMessageStore(String name,
- MessageStoreRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception
+ MessageStoreRecoveryHandler messageRecoveryHandler,
+ TransactionLogRecoveryHandler tlogRecoveryHandler,
+ Configuration config) throws Exception
{
- _realStore.configureMessageStore(name, recoveryHandler, config, logSubject);
+ _realStore.configureMessageStore(name, messageRecoveryHandler, tlogRecoveryHandler, config);
}
public void close() throws Exception
@@ -194,17 +192,17 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
doPostDelay("removeExchange");
}
- public void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
+ public void bindQueue(Binding binding) throws AMQStoreException
{
doPreDelay("bindQueue");
- _durableConfigurationStore.bindQueue(exchange, routingKey, queue, args);
+ _durableConfigurationStore.bindQueue(binding);
doPostDelay("bindQueue");
}
- public void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
+ public void unbindQueue(Binding binding) throws AMQStoreException
{
doPreDelay("unbindQueue");
- _durableConfigurationStore.unbindQueue(exchange, routingKey, queue, args);
+ _durableConfigurationStore.unbindQueue(binding);
doPostDelay("unbindQueue");
}
@@ -227,14 +225,6 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
doPostDelay("removeQueue");
}
- public void configureTransactionLog(String name,
- TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration, LogSubject logSubject)
- throws Exception
- {
- _realStore.configureTransactionLog(name, recoveryHandler, storeConfiguration, logSubject);
- }
-
public Transaction newTransaction()
{
doPreDelay("beginTran");
@@ -313,6 +303,17 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
_underlying.abortTran();
doPostDelay("abortTran");
}
+
+ public void removeXid(long format, byte[] globalId, byte[] branchId) throws AMQStoreException
+ {
+ _underlying.removeXid(format, globalId, branchId);
+ }
+
+ public void recordXid(long format, byte[] globalId, byte[] branchId, Record[] enqueues, Record[] dequeues)
+ throws AMQStoreException
+ {
+ _underlying.recordXid(format, globalId, branchId, enqueues, dequeues);
+ }
}
public void updateQueue(AMQQueue queue) throws AMQStoreException
@@ -350,4 +351,23 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
_durableConfigurationStore.deleteBridge(bridge);
doPostDelay("deleteBridge");
}
+
+ @Override
+ public void activate() throws Exception
+ {
+ _realStore.activate();
+ }
+
+ @Override
+ public void addEventListener(EventListener eventListener, Event... events)
+ {
+ _realStore.addEventListener(eventListener, events);
+ }
+
+ @Override
+ public String getStoreLocation()
+ {
+ return _realStore.getStoreLocation();
+ }
+
}
diff --git a/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStoreFactory.java b/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStoreFactory.java
new file mode 100644
index 0000000000..6497a640d2
--- /dev/null
+++ b/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStoreFactory.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public class SlowMessageStoreFactory implements MessageStoreFactory
+{
+
+ @Override
+ public MessageStore createMessageStore()
+ {
+ return new SlowMessageStore();
+ }
+
+ @Override
+ public String getStoreClassName()
+ {
+ return SlowMessageStore.class.getSimpleName();
+ }
+
+}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/client/CancelTest.java b/java/systests/src/main/java/org/apache/qpid/test/client/CancelTest.java
deleted file mode 100644
index d95ad51e05..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/client/CancelTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.test.client;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
-import javax.jms.Connection;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Queue;
-import javax.jms.QueueBrowser;
-import javax.jms.Session;
-import java.util.Enumeration;
-
-public class CancelTest extends QpidBrokerTestCase
-{
- private static final Logger _logger = Logger.getLogger(CancelTest.class);
-
- private Connection _clientConnection;
- private Session _clientSession;
- private Queue _queue;
-
- public void setUp() throws Exception
- {
-
- super.setUp();
-
- _queue = (Queue) getInitialContext().lookup("queue");
-
- //Create Client
- _clientConnection = getConnection();
-
- _clientConnection.start();
-
- _clientSession = _clientConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- //Ensure _queue is created
- _clientSession.createConsumer(_queue).close();
- }
-
- /**
- * Simply
- * This test originally did not assert anything but was just checking
- * that a message could be browsed and consumed without throwing an exception.
- * It now checks that at least a message is browsed and that a message is received.
- */
- public void test() throws Exception
- {
- Connection producerConnection = getConnection();
-
- producerConnection.start();
-
- Session producerSession = producerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- MessageProducer producer = producerSession.createProducer(_queue);
- producer.send(producerSession.createTextMessage());
- producerConnection.close();
-
-
- QueueBrowser browser = _clientSession.createBrowser(_queue);
- Enumeration e = browser.getEnumeration();
-
- assertTrue(e.hasMoreElements());
-
- int i = 0;
- while (e.hasMoreElements())
- {
- e.nextElement();
- if(++i > 1)
- {
- fail("Two many elemnts to browse!");
- }
- }
-
- browser.close();
-
- MessageConsumer consumer = _clientSession.createConsumer(_queue);
- assertNotNull( consumer.receive(2000l) );
- consumer.close();
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/client/ImmediateAndMandatoryPublishingTest.java b/java/systests/src/main/java/org/apache/qpid/test/client/ImmediateAndMandatoryPublishingTest.java
index 484146b690..b746a5b09e 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/client/ImmediateAndMandatoryPublishingTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/client/ImmediateAndMandatoryPublishingTest.java
@@ -18,11 +18,9 @@
*/
package org.apache.qpid.test.client;
-import org.apache.qpid.client.AMQNoConsumersException;
-import org.apache.qpid.client.AMQNoRouteException;
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.TimeUnit;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.ExceptionListener;
@@ -32,9 +30,10 @@ import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.Topic;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.TimeUnit;
+import org.apache.qpid.client.AMQNoConsumersException;
+import org.apache.qpid.client.AMQNoRouteException;
+import org.apache.qpid.client.AMQSession;
+import org.apache.qpid.test.utils.QpidBrokerTestCase;
public class ImmediateAndMandatoryPublishingTest extends QpidBrokerTestCase implements ExceptionListener
{
@@ -202,7 +201,88 @@ public class ImmediateAndMandatoryPublishingTest extends QpidBrokerTestCase impl
return message;
}
- @Override
+ public void testMandatoryAndImmediateDefaults() throws JMSException, InterruptedException
+ {
+ Session session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+ // publish to non-existent queue - should get mandatory failure
+ MessageProducer producer = session.createProducer(session.createQueue(getTestQueueName()));
+ Message message = session.createMessage();
+ producer.send(message);
+
+ JMSException exception = _exceptions.poll(10, TimeUnit.SECONDS);
+ assertNotNull("JMSException is expected", exception);
+ AMQNoRouteException noRouteException = (AMQNoRouteException) exception.getLinkedException();
+ assertNotNull("AMQNoRouteException should be linked to JMSEXception", noRouteException);
+ Message bounceMessage = (Message) noRouteException.getUndeliveredMessage();
+ assertNotNull("Bounced Message is expected", bounceMessage);
+ assertEquals("Unexpected message is bounced", message.getJMSMessageID(), bounceMessage.getJMSMessageID());
+
+ producer = session.createProducer(null);
+ message = session.createMessage();
+ producer.send(session.createQueue(getTestQueueName()), message);
+
+ exception = _exceptions.poll(10, TimeUnit.SECONDS);
+ assertNotNull("JMSException is expected", exception);
+ noRouteException = (AMQNoRouteException) exception.getLinkedException();
+ assertNotNull("AMQNoRouteException should be linked to JMSEXception", noRouteException);
+ bounceMessage = (Message) noRouteException.getUndeliveredMessage();
+ assertNotNull("Bounced Message is expected", bounceMessage);
+ assertEquals("Unexpected message is bounced", message.getJMSMessageID(), bounceMessage.getJMSMessageID());
+
+
+ // publish to non-existent topic - should get no failure
+ producer = session.createProducer(session.createTopic(getTestQueueName()));
+ message = session.createMessage();
+ producer.send(message);
+
+ exception = _exceptions.poll(1, TimeUnit.SECONDS);
+ assertNull("Unexpected JMSException", exception);
+
+ producer = session.createProducer(null);
+ message = session.createMessage();
+ producer.send(session.createTopic(getTestQueueName()), message);
+
+ exception = _exceptions.poll(1, TimeUnit.SECONDS);
+ assertNull("Unexpected JMSException", exception);
+
+ session.close();
+ }
+
+ public void testMandatoryAndImmediateSystemProperties() throws JMSException, InterruptedException
+ {
+ setTestClientSystemProperty("qpid.default_mandatory","true");
+ Session session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+ // publish to non-existent topic - should get mandatory failure
+
+ MessageProducer producer = session.createProducer(session.createTopic(getTestQueueName()));
+ Message message = session.createMessage();
+ producer.send(message);
+
+ JMSException exception = _exceptions.poll(10, TimeUnit.SECONDS);
+ assertNotNull("JMSException is expected", exception);
+ AMQNoRouteException noRouteException = (AMQNoRouteException) exception.getLinkedException();
+ assertNotNull("AMQNoRouteException should be linked to JMSEXception", noRouteException);
+ Message bounceMessage = (Message) noRouteException.getUndeliveredMessage();
+ assertNotNull("Bounced Message is expected", bounceMessage);
+ assertEquals("Unexpected message is bounced", message.getJMSMessageID(), bounceMessage.getJMSMessageID());
+
+ // now set topic specific system property to false - should no longer get mandatory failure on new producer
+ setTestClientSystemProperty("qpid.default_mandatory_topic","false");
+ producer = session.createProducer(null);
+ message = session.createMessage();
+ producer.send(session.createTopic(getTestQueueName()), message);
+
+ exception = _exceptions.poll(1, TimeUnit.SECONDS);
+ if(exception != null)
+ {
+ exception.printStackTrace();
+ }
+ assertNull("Unexpected JMSException", exception);
+
+ }
+
public void onException(JMSException exception)
{
_exceptions.add(exception);
diff --git a/java/systests/src/main/java/org/apache/qpid/test/client/QueueBrowserAutoAckTest.java b/java/systests/src/main/java/org/apache/qpid/test/client/QueueBrowserAutoAckTest.java
index 7a4a45a2c8..6b6b4a7b3c 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/client/QueueBrowserAutoAckTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/client/QueueBrowserAutoAckTest.java
@@ -20,11 +20,7 @@
*/
package org.apache.qpid.test.client;
-import org.apache.qpid.AMQException;
-import org.apache.qpid.client.AMQDestination;
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
+import java.util.Enumeration;
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
@@ -35,7 +31,10 @@ import javax.jms.QueueBrowser;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.NamingException;
-import java.util.Enumeration;
+import org.apache.qpid.AMQException;
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.client.AMQSession;
+import org.apache.qpid.test.utils.QpidBrokerTestCase;
public class QueueBrowserAutoAckTest extends QpidBrokerTestCase
{
@@ -421,4 +420,21 @@ public class QueueBrowserAutoAckTest extends QpidBrokerTestCase
validate(messages);
}
+ public void testBrowsingWhileStopped() throws JMSException
+ {
+ _clientConnection.stop();
+
+ try
+ {
+ QueueBrowser browser = _clientSession.createBrowser(getTestQueue());
+ Enumeration messages = browser.getEnumeration();
+ fail("Expected exception when attempting to browse on a stopped connection did not occur");
+ }
+ catch(javax.jms.IllegalStateException e)
+ {
+ // pass
+ }
+
+ }
+
}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/client/timeouts/SyncWaitDelayTest.java b/java/systests/src/main/java/org/apache/qpid/test/client/timeouts/SyncWaitDelayTest.java
index ee81e7c372..91f5cb7770 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/client/timeouts/SyncWaitDelayTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/client/timeouts/SyncWaitDelayTest.java
@@ -54,7 +54,7 @@ public class SyncWaitDelayTest extends QpidBrokerTestCase
public void setUp() throws Exception
{
- setConfigurationProperty("virtualhosts.virtualhost." + VIRTUALHOST+".store.class", "org.apache.qpid.server.store.SlowMessageStore");
+ setConfigurationProperty("virtualhosts.virtualhost." + VIRTUALHOST+".store.factoryclass", "org.apache.qpid.server.store.SlowMessageStoreFactory");
setConfigurationProperty("virtualhosts.virtualhost." + VIRTUALHOST+".store.delays.commitTran.post", String.valueOf(POST_COMMIT_DELAY));
setConfigurationProperty("management.enabled", "false");
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/AMQPPublisher.java b/java/systests/src/main/java/org/apache/qpid/test/framework/AMQPPublisher.java
deleted file mode 100644
index 13465741bd..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/AMQPPublisher.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-/**
- * An AMQPPublisher represents the status of the publishing side of a test circuit that exposes AMQP specific features.
- * Its provides additional assertions not available through the plain JMS {@link Publisher} interface.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide assertion that the publishers received a no consumers error code on every message.
- * <tr><td> Provide assertion that the publishers received a no route error code on every message.
- * </table>
- */
-public interface AMQPPublisher extends Publisher
-{
- /**
- * Provides an assertion that the publisher got a no consumers exception on every message.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the publisher got a no consumers exception on every message.
- */
- Assertion noConsumersAssertion(ParsedProperties testProps);
-
- /**
- * Provides an assertion that the publisher got a no rout exception on every message.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the publisher got a no rout exception on every message.
- */
- Assertion noRouteAssertion(ParsedProperties testProps);
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/Assertion.java b/java/systests/src/main/java/org/apache/qpid/test/framework/Assertion.java
deleted file mode 100644
index 60d54f1f6f..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/Assertion.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * Assertion models an assertion on a test {@link Circuit}.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Indicate whether or not the assertion passes when applied.
- * </table>
- */
-public interface Assertion
-{
- /**
- * Applies the assertion.
- *
- * @return <tt>true</tt> if the assertion passes, <tt>false</tt> if it fails.
- */
- public boolean apply();
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/AssertionBase.java b/java/systests/src/main/java/org/apache/qpid/test/framework/AssertionBase.java
deleted file mode 100644
index 0bb4911d4c..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/AssertionBase.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * AssertionBase is a base class for implenmenting assertions. It provides a mechanism to store error messages, and
- * report all error messages when its {@link #toString()} method is called.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Collect error messages.
- * </table>
- */
-public abstract class AssertionBase implements Assertion
-{
- /** Holds the error messages. */
- List<String> errors = new LinkedList<String>();
-
- /**
- * Adds an error message to the assertion.
- *
- * @param error An error message to add to the assertion.
- */
- public void addError(String error)
- {
- errors.add(error);
- }
-
- /**
- * Prints all of the error messages in the assertion into a string.
- *
- * @return All of the error messages in the assertion as a string.
- */
- public String toString()
- {
- String result = "";
-
- for (String error : errors)
- {
- result += error;
- }
-
- return result;
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/BrokerLifecycleAware.java b/java/systests/src/main/java/org/apache/qpid/test/framework/BrokerLifecycleAware.java
deleted file mode 100644
index 41614f92fc..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/BrokerLifecycleAware.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * BrokerLifecycleAware is an awareness interface implemented by test cases that can run control the life-cycle of
- * the brokers on which they run. Its purpose is to expose additional instrumentation of brokers during testing, that
- * enables tests to use an automated failure mechanism to simulate broker failures, and to re-start failed brokers.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Indicate whether or not a test case is using an in-vm broker.
- * <tr><td> Track which in-vm broker is currently in use.
- * <tr><td> Accept setting of a failure mechanism. <td> {@link CauseFailure}.
- * </table>
- *
- * @todo Need to think about how to present the brokers through this interface. Thinking numbering the available
- * brokers from 1 will do. Then can kill 1 and assume failing onto 2. Restart 1 and kill 2 and fail back onto
- * 1 again?
- */
-public interface BrokerLifecycleAware
-{
- public void setInVmBrokers();
-
- /**
- * Indicates whether or not a test case is using in-vm brokers.
- *
- * @return <tt>true</tt> if the test is using in-vm brokers, <tt>false</tt> otherwise.
- */
- public boolean usingInVmBroker();
-
- /**
- * Sets the currently live in-vm broker.
- *
- * @param i The currently live in-vm broker.
- */
- public void setLiveBroker(int i);
-
- /**
- * Reports the currently live in-vm broker.
- *
- * @return The currently live in-vm broker.
- */
- public int getLiveBroker();
-
- /**
- * Accepts a failure mechanism.
- *
- * @param failureMechanism The failure mechanism.
- */
- public void setFailureMechanism(CauseFailure failureMechanism);
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailure.java b/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailure.java
deleted file mode 100644
index 9bdd5a72c5..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailure.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * CauseFailure provides a method to cause a failure in a messaging broker, usually used in conjunction with fail-over
- * or other failure mode testing. In some cases failures may be automated, for example by shutting down an in-vm broker,
- * or by sending a special control signal to a broker over a network connection. In other cases, it may be preferable
- * to ask a user interactively to cause a failure scenario, in which case an implementation may display a prompt or
- * dialog box asking for notification once the failure has been caused. The purpose of this interface is to abstract
- * the exact cause and nature of a failure out of failure test cases.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Cause messaging broker failure.
- * </table>
- */
-public interface CauseFailure
-{
- /**
- * Causes the active message broker to fail.
- */
- void causeFailure();
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailureUserPrompt.java b/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailureUserPrompt.java
deleted file mode 100644
index 118ddff48b..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailureUserPrompt.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import java.io.IOException;
-
-/**
- * Causes a message broker failure by interactively prompting the user to cause it.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Cause messaging broker failure.
- * </table>
- */
-public class CauseFailureUserPrompt implements CauseFailure
-{
- /**
- * Causes the active message broker to fail.
- */
- public void causeFailure()
- {
- waitForUser("Cause a broker failure now, then press Return.");
- }
-
- /**
- * Outputs a prompt to the console and waits for the user to press return.
- *
- * @param prompt The prompt to display on the console.
- */
- private void waitForUser(String prompt)
- {
- System.out.println(prompt);
-
- try
- {
- System.in.read();
- }
- catch (IOException e)
- {
- // Ignored.
- }
-
- System.out.println("Continuing.");
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/Circuit.java b/java/systests/src/main/java/org/apache/qpid/test/framework/Circuit.java
deleted file mode 100644
index 4f9ab1a273..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/Circuit.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import java.util.List;
-
-/**
- * A Circuit is the basic test unit against which test cases are to be written. A circuit consists of two 'ends', an
- * instigating 'publisher' end and a more passive 'receivers' end.
- *
- * <p/>Once created, the life-cycle of a circuit may be controlled by {@link #start()}ing it, or {@link #close()}ing it.
- * Once started, the circuit is ready to send messages over. Once closed the circuit can no longer be used.
- *
- * <p/>The state of the circuit may be taken with the {@link #check()} method, and asserted against by the
- * {@link #applyAssertions(java.util.List)} method.
- *
- * <p/>There is a default test procedure which may be performed against the circuit. The outline of this procedure is:
- *
- * <p/><pre>
- * Start the circuit.
- * Send test messages.
- * Request a status report.
- * Assert conditions on the publishing end of the circuit.
- * Assert conditions on the receiving end of the circuit.
- * Close the circuit.
- * Pass with no failed assertions or fail with a list of failed assertions.
- * </pre>
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Supply the publishing and receiving ends of a test messaging circuit.
- * <tr><td> Start the circuit running.
- * <tr><td> Close the circuit down.
- * <tr><td> Take a reading of the circuits state.
- * <tr><td> Apply assertions against the circuits state.
- * <tr><td> Send test messages over the circuit.
- * <tr><td> Perform the default test procedue on the circuit.
- * </table>
- */
-public interface Circuit
-{
- /**
- * Gets the interface on the publishing end of the circuit.
- *
- * @return The publishing end of the circuit.
- */
- public Publisher getPublisher();
-
- /**
- * Gets the interface on the receiving end of the circuit.
- *
- * @return The receiving end of the circuit.
- */
- public Receiver getReceiver();
-
- /**
- * Connects and starts the circuit. After this method is called the circuit is ready to send messages.
- */
- public void start();
-
- /**
- * Checks the test circuit. The effect of this is to gather the circuits state, for both ends of the circuit,
- * into a report, against which assertions may be checked.
- */
- public void check();
-
- /**
- * Closes the circuit. All associated resources are closed.
- */
- public void close();
-
- /**
- * Applied a list of assertions against the test circuit. The {@link #check()} method should be called before doing
- * this, to ensure that the circuit has gathered its state into a report to assert against.
- *
- * @param assertions The list of assertions to apply to the circuit.
- *
- * @return Any assertions that failed.
- */
- public List<Assertion> applyAssertions(List<Assertion> assertions);
-
- /**
- * Runs the default test procedure against the circuit, and checks that all of the specified assertions hold.
- *
- * @param numMessages The number of messages to send using the default test procedure.
- * @param assertions The list of assertions to apply.
- *
- * @return Any assertions that failed.
- */
- public List<Assertion> test(int numMessages, List<Assertion> assertions);
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEnd.java b/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEnd.java
deleted file mode 100644
index ffde385cfc..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEnd.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-/**
- * A CircuitEnd is a pair consisting of one message producer and one message consumer, that represents one end of a
- * test circuit. It is a standard unit of connectivity allowing a full-duplex conversation to be held, provided both
- * the consumer and producer are instantiated and configured.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide a message producer for sending messages.
- * <tr><td> Provide a message consumer for receiving messages.
- * </table>
- *
- * @todo Update the {@link org.apache.qpid.test.utils.ConversationFactory} so that it accepts these as the basic conversation
- * connection units.
- */
-public interface CircuitEnd
-{
- /**
- * Gets the message producer at this circuit end point.
- *
- * @return The message producer at with this circuit end point.
- */
- public MessageProducer getProducer();
-
- /**
- * Gets the message consumer at this circuit end point.
- *
- * @return The message consumer at this circuit end point.
- */
- public MessageConsumer getConsumer();
-
- /**
- * Send the specified message over the producer at this end point.
- *
- * @param message The message to send.
- *
- * @throws JMSException Any JMS exception occuring during the send is allowed to fall through.
- */
- public void send(Message message) throws JMSException;
-
- /**
- * Gets the JMS Session associated with this circuit end point.
- *
- * @return The JMS Session associated with this circuit end point.
- */
- public Session getSession();
-
- /**
- * Closes the message producers and consumers and the sessions, associated with this circuit end point.
- *
- * @throws JMSException Any JMSExceptions occurring during the close are allowed to fall through.
- */
- public void close() throws JMSException;
-
- /**
- * Returns the message monitor for reporting on received messages on this circuit end.
- *
- * @return The message monitor for this circuit end.
- */
- public MessageMonitor getMessageMonitor();
-
- /**
- * Returns the exception monitor for reporting on exceptions received on this circuit end.
- *
- * @return The exception monitor for this circuit end.
- */
- public ExceptionMonitor getExceptionMonitor();
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEndBase.java b/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEndBase.java
deleted file mode 100644
index 5730752eae..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEndBase.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-/**
- * A CircuitEndBase is a pair consisting of one message producer and one message consumer, that represents one end of a
- * test circuit. It is a standard unit of connectivity allowing a full-duplex conversation to be held, provided both
- * the consumer and producer are instantiated and configured.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide a message producer for sending messages.
- * <tr><td> Provide a message consumer for receiving messages.
- * </table>
- */
-public class CircuitEndBase implements CircuitEnd
-{
- /** Holds the single message producer. */
- MessageProducer producer;
-
- /** Holds the single message consumer. */
- MessageConsumer consumer;
-
- /** Holds the controlSession for the circuit end. */
- Session session;
-
- /** Holds the message monitor for the circuit end. */
- MessageMonitor messageMonitor;
-
- /** Holds the exception monitor for the circuit end. */
- ExceptionMonitor exceptionMonitor;
-
- /**
- * Creates a circuit end point on the specified producer, consumer and controlSession. Monitors are also configured
- * for messages and exceptions received by the circuit end.
- *
- * @param producer The message producer for the circuit end point.
- * @param consumer The message consumer for the circuit end point.
- * @param session The controlSession for the circuit end point.
- * @param messageMonitor The monitor to notify of all messages received by the circuit end.
- * @param exceptionMonitor The monitor to notify of all exceptions received by the circuit end.
- */
- public CircuitEndBase(MessageProducer producer, MessageConsumer consumer, Session session, MessageMonitor messageMonitor,
- ExceptionMonitor exceptionMonitor)
- {
- this.producer = producer;
- this.consumer = consumer;
- this.session = session;
-
- this.messageMonitor = messageMonitor;
- this.exceptionMonitor = exceptionMonitor;
- }
-
- /**
- * Gets the message producer at this circuit end point.
- *
- * @return The message producer at with this circuit end point.
- */
- public MessageProducer getProducer()
- {
- return producer;
- }
-
- /**
- * Gets the message consumer at this circuit end point.
- *
- * @return The message consumer at this circuit end point.
- */
- public MessageConsumer getConsumer()
- {
- return consumer;
- }
-
- /**
- * Send the specified message over the producer at this end point.
- *
- * @param message The message to send.
- * @throws javax.jms.JMSException Any JMS exception occuring during the send is allowed to fall through.
- */
- public void send(Message message) throws JMSException
- {
- producer.send(message);
- }
-
- /**
- * Gets the JMS Session associated with this circuit end point.
- *
- * @return The JMS Session associated with this circuit end point.
- */
- public Session getSession()
- {
- return session;
- }
-
- /**
- * Closes the message producers and consumers and the sessions, associated with this circuit end point.
- *
- * @throws javax.jms.JMSException Any JMSExceptions occurring during the close are allowed to fall through.
- */
- public void close() throws JMSException
- {
- if (producer != null)
- {
- producer.close();
- }
-
- if (consumer != null)
- {
- consumer.close();
- }
- }
-
- /**
- * Returns the message monitor for reporting on received messages on this circuit end.
- *
- * @return The message monitor for this circuit end.
- */
- public MessageMonitor getMessageMonitor()
- {
- return messageMonitor;
- }
-
- /**
- * Returns the exception monitor for reporting on exceptions received on this circuit end.
- *
- * @return The exception monitor for this circuit end.
- */
- public ExceptionMonitor getExceptionMonitor()
- {
- return exceptionMonitor;
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/DropInTest.java b/java/systests/src/main/java/org/apache/qpid/test/framework/DropInTest.java
deleted file mode 100644
index 78b5a72c1f..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/DropInTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-
-/**
- * A DropIn test is a test case that can accept late joining test clients into a running test. This can be usefull,
- * for interactive experimentation.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Accept late joining test clients.
- * </table>
- */
-public interface DropInTest
-{
- /**
- * Should accept a late joining client into a running test case. The client will be enlisted with a control message
- * with the 'CONTROL_TYPE' field set to the value 'LATEJOIN'. It should also provide values for the fields:
- *
- * <p/><table>
- * <tr><td> CLIENT_NAME <td> A unique name for the new client.
- * <tr><td> CLIENT_PRIVATE_CONTROL_KEY <td> The key for the route on which the client receives its control messages.
- * </table>
- *
- * @param message The late joiners join message.
- *
- * @throws JMSException Any JMS Exception are allowed to fall through, indicating that the join failed.
- */
- public void lateJoin(Message message) throws JMSException;
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/ExceptionMonitor.java b/java/systests/src/main/java/org/apache/qpid/test/framework/ExceptionMonitor.java
deleted file mode 100644
index afb7b5bc5b..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/ExceptionMonitor.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-
-import javax.jms.ExceptionListener;
-import javax.jms.JMSException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * An exception monitor, listens for JMS exception on a connection or consumer. It record all exceptions that it receives
- * and provides methods to test the number and type of exceptions received.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Record all exceptions received.
- * </table>
- */
-public class ExceptionMonitor implements ExceptionListener
-{
- /** Used for debugging. */
- private final Logger log = Logger.getLogger(ExceptionMonitor.class);
-
- /** Holds the received exceptions. */
- private List<Exception> exceptions = new ArrayList<Exception>();
-
- /**
- * Receives incoming exceptions.
- *
- * @param e The exception to record.
- */
- public synchronized void onException(JMSException e)
- {
- log.debug("public void onException(JMSException e): called", e);
-
- exceptions.add(e);
- }
-
- /**
- * Checks that no exceptions have been received.
- *
- * @return <tt>true</tt> if no exceptions have been received, <tt>false</tt> otherwise.
- */
- public synchronized boolean assertNoExceptions()
- {
- return exceptions.isEmpty();
- }
-
- /**
- * Checks that exactly one exception has been received.
- *
- * @return <tt>true</tt> if exactly one exception been received, <tt>false</tt> otherwise.
- */
- public synchronized boolean assertOneJMSException()
- {
- return exceptions.size() == 1;
- }
-
- /**
- * Checks that exactly one exception, with a linked cause of the specified type, has been received.
- *
- * @param aClass The type of the linked cause.
- *
- * @return <tt>true</tt> if exactly one exception, with a linked cause of the specified type, been received,
- * <tt>false</tt> otherwise.
- */
- public synchronized boolean assertOneJMSExceptionWithLinkedCause(Class aClass)
- {
- if (exceptions.size() == 1)
- {
- Exception e = exceptions.get(0);
-
- if (e instanceof JMSException)
- {
- JMSException jmse = (JMSException) e;
-
- Exception linkedCause = jmse.getLinkedException();
-
- if ((linkedCause != null) && aClass.isInstance(linkedCause))
- {
- return true;
- }
- }
- }
-
- return false;
- }
-
- /**
- * Checks that at least one exception of the the specified type, has been received.
- *
- * @param exceptionClass The type of the exception.
- *
- * @return <tt>true</tt> if at least one exception of the specified type has been received, <tt>false</tt> otherwise.
- */
- public synchronized boolean assertExceptionOfType(Class exceptionClass)
- {
- // Start by assuming that the exception has no been received.
- boolean passed = false;
-
- // Scan all the exceptions for a match.
- for (Exception e : exceptions)
- {
- if (exceptionClass.isInstance(e))
- {
- passed = true;
-
- break;
- }
- }
-
- return passed;
- }
-
- /**
- * Reports the number of exceptions held by this monitor.
- *
- * @return The number of exceptions held by this monitor.
- */
- public synchronized int size()
- {
- return exceptions.size();
- }
-
- /**
- * Clears the record of received exceptions.
- */
- public synchronized void reset()
- {
- exceptions = new ArrayList<Exception>();
- }
-
- /**
- * Provides a dump of the stack traces of all exceptions that this exception monitor was notified of. Mainly
- * use for debugging/test failure reporting purposes.
- *
- * @return A string containing a dump of the stack traces of all exceptions.
- */
- public synchronized String toString()
- {
- String result = "ExceptionMonitor: holds " + exceptions.size() + " exceptions.\n\n";
-
- for (Exception ex : exceptions)
- {
- result += getStackTrace(ex) + "\n";
- }
-
- return result;
- }
-
- /**
- * Prints an exception stack trace into a string.
- *
- * @param t The throwable to get the stack trace from.
- *
- * @return A string containing the throwables stack trace.
- */
- public static String getStackTrace(Throwable t)
- {
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw, true);
- t.printStackTrace(pw);
- pw.flush();
- sw.flush();
-
- return sw.toString();
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkBaseCase.java b/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkBaseCase.java
deleted file mode 100644
index ecbb710a6b..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkBaseCase.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.NDC;
-
-import org.apache.qpid.junit.extensions.SetupTaskAware;
-import org.apache.qpid.junit.extensions.SetupTaskHandler;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-import org.apache.qpid.test.framework.sequencers.CircuitFactory;
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * FrameworkBaseCase provides a starting point for writing test cases against the test framework. Its main purpose is
- * to provide some convenience methods for testing.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create and clean up in-vm brokers on every test case.
- * <tr><td> Produce lists of assertions from assertion creation calls.
- * <tr><td> Produce JUnit failures from assertion failures.
- * <tr><td> Convert failed assertions to error messages.
- * </table>
- */
-public class FrameworkBaseCase extends QpidBrokerTestCase implements FrameworkTestContext, SetupTaskAware,
- BrokerLifecycleAware
-{
- /** Used for debugging purposes. */
- private static final Logger log = Logger.getLogger(FrameworkBaseCase.class);
-
- private CircuitFactory circuitFactory = new LocalAMQPCircuitFactory();
-
- private ParsedProperties testProps;
-
- private SetupTaskHandler taskHandler = new SetupTaskHandler();
-
- private boolean isUsingInVM;
-
- private CauseFailure failureMechanism = new CauseFailureUserPrompt();
-
- /**
- * Creates a new test case with the specified name.
- *
- * @param name The test case name.
- */
- public FrameworkBaseCase(String name)
- {
- super(name);
- }
-
- /** Holds the test sequencer to create and run test circuits with. */ /**
- * Returns the test case sequencer that provides test circuit, and test sequence implementations. The sequencer
- * that this base case returns by default is suitable for running a test circuit with both circuit ends colocated
- * on the same JVM.
- *
- * @return The test case sequencer.
- */
- protected CircuitFactory getCircuitFactory()
- {
- return circuitFactory;
- }
-
- /**
- * Overrides the default test circuit factory. Test decorators can use this to supply distributed test sequencers or
- * other test circuit factory specializations.
- *
- * @param circuitFactory The new test circuit factory.
- */
- public void setCircuitFactory(CircuitFactory circuitFactory)
- {
- this.circuitFactory = circuitFactory;
- }
-
- /**
- * Reports the current test case name.
- *
- * @return The current test case name.
- */
- public TestCaseVector getTestCaseVector()
- {
- return new TestCaseVector(this.getName(), 0);
- }
-
- /**
- * Reports the current test case parameters.
- *
- * @return The current test case parameters.
- */
- public MessagingTestConfigProperties getTestParameters()
- {
- return new MessagingTestConfigProperties(testProps);
- }
-
- /**
- * Creates a list of assertions.
- *
- * @param asserts The assertions to compile in a list.
- *
- * @return A list of assertions.
- */
- protected List<Assertion> assertionList(Assertion... asserts)
- {
- List<Assertion> result = new ArrayList<Assertion>();
-
- for (Assertion assertion : asserts)
- {
- result.add(assertion);
- }
-
- return result;
- }
-
- /**
- * Generates a JUnit assertion exception (failure) if any assertions are passed into this method, also concatenating
- * all of the error messages in the assertions together to form an error message to diagnose the test failure with.
- *
- * @param asserts The list of failed assertions.
- */
- protected static void assertNoFailures(List<Assertion> asserts)
- {
- log.debug("protected void assertNoFailures(List<Assertion> asserts = " + asserts + "): called");
-
- // Check if there are no assertion failures, and return without doing anything if so.
- if ((asserts == null) || asserts.isEmpty())
- {
- return;
- }
-
- // Compile all of the assertion failure messages together.
- String errorMessage = assertionsToString(asserts);
-
- // Fail with the error message from all of the assertions.
- fail(errorMessage);
- }
-
- /**
- * Converts a list of failed assertions into an error message.
- *
- * @param asserts The failed assertions.
- *
- * @return The error message.
- */
- protected static String assertionsToString(List<Assertion> asserts)
- {
- String errorMessage = "";
-
- for (Assertion assertion : asserts)
- {
- errorMessage += assertion.toString() + "\n";
- }
-
- return errorMessage;
- }
-
- /**
- * Ensures that the in-vm broker is created and initialized.
- *
- * @throws Exception Any exceptions allowed to fall through and fail the test.
- */
- protected void setUp() throws Exception
- {
- super.setUp();
- NDC.push(getName());
-
- testProps = TestContextProperties.getInstance(MessagingTestConfigProperties.defaults);
- }
-
- /**
- * Ensures that the in-vm broker is cleaned up after each test run.
- */
- protected void tearDown()
- {
- NDC.pop();
-
- // Process all optional tear down tasks. This may include in-vm broker clean up, if a decorator has added it.
- taskHandler.runTearDownTasks();
- }
-
- /**
- * Adds the specified task to the tests setup.
- *
- * @param task The task to add to the tests setup.
- */
- public void chainSetupTask(Runnable task)
- {
- taskHandler.chainSetupTask(task);
- }
-
- /**
- * Adds the specified task to the tests tear down.
- *
- * @param task The task to add to the tests tear down.
- */
- public void chainTearDownTask(Runnable task)
- {
- taskHandler.chainTearDownTask(task);
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as known to the test
- * clients that will run the test. The purpose of this is to convert the JUnit method name into the correct test
- * case name to place into the test invite. For example the method "testP2P" might map onto the interop test case
- * name "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- *
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return methodName;
- }
-
- public void setInVmBrokers()
- {
- isUsingInVM = true;
- }
-
- /**
- * Indicates whether or not a test case is using in-vm brokers.
- *
- * @return <tt>true</tt> if the test is using in-vm brokers, <tt>false</tt> otherwise.
- */
- public boolean usingInVmBroker()
- {
- return isUsingInVM;
- }
-
- /**
- * Sets the currently live in-vm broker.
- *
- * @param i The currently live in-vm broker.
- */
- public void setLiveBroker(int i)
- { }
-
- /**
- * Reports the currently live in-vm broker.
- *
- * @return The currently live in-vm broker.
- */
- public int getLiveBroker()
- {
- return 0;
- }
-
- /**
- * Accepts a failure mechanism.
- *
- * @param failureMechanism The failure mechanism.
- */
- public void setFailureMechanism(CauseFailure failureMechanism)
- {
- this.failureMechanism = failureMechanism;
- }
-
- protected ParsedProperties getTestProps()
- {
- return testProps;
- }
-
- protected void setTestProps(ParsedProperties testProps)
- {
- this.testProps = testProps;
- }
-
- protected SetupTaskHandler getTaskHandler()
- {
- return taskHandler;
- }
-
- protected CauseFailure getFailureMechanism()
- {
- return failureMechanism;
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkTestContext.java b/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkTestContext.java
deleted file mode 100644
index 9a4668e86f..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkTestContext.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * A FrameworkTestContext provides context information to test code about the current test case being run; its name, its
- * parameters.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide the name of the current test case.
- * <tr><td> Provide the test parameters.
- * </table>
- */
-public interface FrameworkTestContext
-{
- /**
- * Reports the current test case name.
- *
- * @return The current test case name.
- */
- TestCaseVector getTestCaseVector();
-
- /**
- * Reports the current test case parameters.
- *
- * @return The current test case parameters.
- */
- MessagingTestConfigProperties getTestParameters();
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/LocalAMQPCircuitFactory.java b/java/systests/src/main/java/org/apache/qpid/test/framework/LocalAMQPCircuitFactory.java
deleted file mode 100644
index 899a808bdd..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/LocalAMQPCircuitFactory.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.localcircuit.LocalAMQPPublisherImpl;
-import org.apache.qpid.test.framework.localcircuit.LocalPublisherImpl;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-import javax.jms.Topic;
-
-/**
- * LocalAMQPCircuitFactory is a test sequencer that creates test circuits with publishing and receiving ends rooted
- * on the same JVM, allowing AMQP/Qpid specific options to be applied to the circuit.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a standard test procedure over a test circuit.
- * <tr><td> Construct test circuits appropriate to a tests context.
- * <tr><td> Construct test circuits the support AMQP specific options.
- * </table>
- */
-public class LocalAMQPCircuitFactory extends LocalCircuitFactory
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(LocalAMQPCircuitFactory.class);
-
- /**
- * Builds a circuit end suitable for the publishing side of a test circuit, from standard test parameters.
- *
- * @param connection The connection to build the circuit end on.
- * @param testProps The test parameters to configure the circuit end construction.
- * @param uniqueId A unique number to being numbering destinations from, to make this circuit unique.
- *
- * @return A circuit end suitable for the publishing side of a test circuit.
- *
- * @throws javax.jms.JMSException Any underlying JMSExceptions are allowed to fall through and fail the creation.
- */
- public CircuitEndBase createPublisherCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId)
- throws JMSException
- {
- log.debug(
- "public CircuitEndBase createPublisherCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId = "
- + uniqueId + "): called");
-
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps);
-
- Session session = connection.createSession(props.getPublisherTransacted(), props.getAckMode());
-
- Destination destination =
- props.getPubsub() ? session.createTopic(props.getSendDestinationNameRoot() + "_" + uniqueId)
- : session.createQueue(props.getSendDestinationNameRoot() + "_" + uniqueId);
-
- MessageProducer producer =
- props.getPublisherProducerBind()
- ? ((props.getImmediate() || props.getMandatory())
- ? ((AMQSession) session).createProducer(destination, props.getMandatory(), props.getImmediate())
- : session.createProducer(destination)) : null;
-
- MessageConsumer consumer =
- props.getPublisherConsumerBind()
- ? session.createConsumer(session.createQueue(props.getReceiveDestinationNameRoot() + "_" + uniqueId)) : null;
-
- MessageMonitor messageMonitor = new MessageMonitor();
-
- if (consumer != null)
- {
- consumer.setMessageListener(messageMonitor);
- }
-
- ExceptionMonitor exceptionMonitor = new ExceptionMonitor();
- connection.setExceptionListener(exceptionMonitor);
-
- if (!props.getPublisherConsumerActive() && (consumer != null))
- {
- consumer.close();
- }
-
- return new CircuitEndBase(producer, consumer, session, messageMonitor, exceptionMonitor);
- }
-
- /**
- * Builds a circuit end suitable for the receiving side of a test circuit, from standard test parameters.
- *
- * @param connection The connection to build the circuit end on.
- * @param testProps The test parameters to configure the circuit end construction.
- * @param uniqueId A unique number to being numbering destinations from, to make this circuit unique.
- *
- * @return A circuit end suitable for the receiving side of a test circuit.
- *
- * @throws JMSException Any underlying JMSExceptions are allowed to fall through and fail the creation.
- */
- public CircuitEndBase createReceiverCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId)
- throws JMSException
- {
- log.debug(
- "public CircuitEndBase createReceiverCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId = "
- + uniqueId + "): called");
-
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps);
-
- Session session = connection.createSession(props.getPublisherTransacted(), props.getAckMode());
-
- MessageProducer producer =
- props.getReceiverProducerBind()
- ? session.createProducer(session.createQueue(props.getReceiveDestinationNameRoot() + "_" + uniqueId)) : null;
-
- Destination destination =
- props.getPubsub() ? session.createTopic(props.getSendDestinationNameRoot() + "_" + uniqueId)
- : session.createQueue(props.getSendDestinationNameRoot() + "_" + uniqueId);
-
- MessageConsumer consumer =
- props.getReceiverConsumerBind()
- ? ((props.getDurableSubscription() && props.getPubsub())
- ? session.createDurableSubscriber((Topic) destination, "testsub") : session.createConsumer(destination))
- : null;
-
- MessageMonitor messageMonitor = new MessageMonitor();
-
- if (consumer != null)
- {
- consumer.setMessageListener(messageMonitor);
- }
-
- if (!props.getReceiverConsumerActive() && (consumer != null))
- {
- consumer.close();
- }
-
- return new CircuitEndBase(producer, consumer, session, messageMonitor, null);
- }
-
- /**
- * Creates a local {@link Publisher} from a {@link CircuitEnd}. The publisher implementation provides AMQP
- * specific assertion methods, for testing beyond JMS.
- *
- * @param publisherEnd The publishing circuit end.
- *
- * @return A {@link Receiver}.
- */
- protected LocalPublisherImpl createPublisherFromCircuitEnd(CircuitEndBase publisherEnd)
- {
- return new LocalAMQPPublisherImpl(publisherEnd);
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/LocalCircuitFactory.java b/java/systests/src/main/java/org/apache/qpid/test/framework/LocalCircuitFactory.java
deleted file mode 100644
index b8fd4cc7e7..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/LocalCircuitFactory.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.localcircuit.LocalCircuitImpl;
-import org.apache.qpid.test.framework.localcircuit.LocalPublisherImpl;
-import org.apache.qpid.test.framework.localcircuit.LocalReceiverImpl;
-import org.apache.qpid.test.framework.sequencers.CircuitFactory;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-import javax.jms.Topic;
-import java.util.List;
-import java.util.Properties;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * LocalCircuitFactory is a circuit factory that creates test circuits with publishing and receiving ends rooted
- * on the same JVM. The ends of the circuit are presented as {@link Publisher} and {@link Receiver} interfaces, which
- * in turn provide methods to apply assertions to the circuit. The creation of the circuit ends, and the presentation
- * of the ends as publisher/receiver interfaces, are designed to be overriden, so that circuits and assertions that
- * use messaging features not available in JMS can be written. This provides an extension point for writing tests
- * against proprietary features of JMS implementations.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a standard test procedure over a test circuit.
- * <tr><td> Construct test circuits appropriate to a tests context.
- * </table>
- */
-public class LocalCircuitFactory implements CircuitFactory
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(LocalCircuitFactory.class);
-
- /** Used to create unique destination names for each test. */
- protected static AtomicLong uniqueDestsId = new AtomicLong();
-
- /**
- * Holds a test coordinating conversation with the test clients. This should consist of assigning the test roles,
- * begining the test and gathering the test reports from the participants.
- *
- * @param testCircuit The test circuit.
- * @param assertions The list of assertions to apply to the test circuit.
- * @param testProperties The test case definition.
- */
- public void sequenceTest(Circuit testCircuit, List<Assertion> assertions, Properties testProperties)
- {
- if (testCircuit != null)
- {
- FrameworkBaseCase.assertNoFailures(testCircuit.test(1, assertions));
- }
- }
-
- /**
- * Creates a test circuit for the test, configered by the test parameters specified.
- *
- * @param testProperties The test parameters.
- *
- * @return A test circuit.
- */
- public Circuit createCircuit(Connection connection, ParsedProperties testProperties)
- {
- Circuit result;
-
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProperties);
-
- // Create a standard publisher/receivers test client pair on a shared connection, individual sessions.
- try
- {
- // Get a unique offset to append to destination names to make them unique to the connection.
- long uniqueId = uniqueDestsId.incrementAndGet();
-
- // Add the connection exception listener to assert on exception conditions with.
- // ExceptionMonitor exceptionMonitor = new ExceptionMonitor();
- // connection.setExceptionListener(exceptionMonitor);
-
- // Set up the publisher.
- CircuitEndBase publisherEnd = createPublisherCircuitEnd(connection, props, uniqueId);
-
- // Set up the receiver.
- CircuitEndBase receiverEnd = createReceiverCircuitEnd(connection, props, uniqueId);
-
- // Start listening for incoming messages.
- connection.start();
-
- // Package everything up.
- LocalPublisherImpl publisher = createPublisherFromCircuitEnd(publisherEnd);
- LocalReceiverImpl receiver = createReceiverFromCircuitEnd(receiverEnd);
-
- result = new LocalCircuitImpl(testProperties, publisher, receiver, connection, publisher.getExceptionMonitor());
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Could not create publisher/receivers pair due to a JMSException.", e);
- }
-
- return result;
- }
-
- /**
- * Creates a local {@link Receiver} from a {@link CircuitEnd}. Sub-classes may override this to provide more
- * specialized receivers if necessary.
- *
- * @param receiverEnd The receiving circuit end.
- *
- * @return A {@link Receiver}.
- */
- protected LocalReceiverImpl createReceiverFromCircuitEnd(CircuitEndBase receiverEnd)
- {
- return new LocalReceiverImpl(receiverEnd);
- }
-
- /**
- * Creates a local {@link Publisher} from a {@link CircuitEnd}. Sub-classes may override this to provide more
- * specialized receivers if necessary.
- *
- * @param publisherEnd The publishing circuit end.
- *
- * @return A {@link Receiver}.
- */
- protected LocalPublisherImpl createPublisherFromCircuitEnd(CircuitEndBase publisherEnd)
- {
- return new LocalPublisherImpl(publisherEnd);
- }
-
- /**
- * Builds a circuit end suitable for the publishing side of a test circuit, from standard test parameters.
- *
- * @param connection The connection to build the circuit end on.
- * @param testProps The test parameters to configure the circuit end construction.
- * @param uniqueId A unique number to being numbering destinations from, to make this circuit unique.
- *
- * @return A circuit end suitable for the publishing side of a test circuit.
- *
- * @throws JMSException Any underlying JMSExceptions are allowed to fall through and fail the creation.
- */
- public CircuitEndBase createPublisherCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId)
- throws JMSException
- {
- log.debug(
- "public CircuitEndBase createPublisherCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId = "
- + uniqueId + "): called");
-
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps);
-
- // Check that the test properties do not contain AMQP/Qpid specific settings, and fail if they do.
- if (props.getImmediate() || props.getMandatory())
- {
- throw new RuntimeException(
- "Cannot create a pure JMS circuit as the test properties require AMQP specific options.");
- }
-
- Session session = connection.createSession(props.getPublisherTransacted(), props.getAckMode());
-
- Destination destination =
- props.getPubsub() ? session.createTopic(props.getSendDestinationNameRoot() + "_" + uniqueId)
- : session.createQueue(props.getSendDestinationNameRoot() + "_" + uniqueId);
-
- MessageProducer producer = props.getPublisherProducerBind() ? session.createProducer(destination) : null;
-
- MessageConsumer consumer =
- props.getPublisherConsumerBind()
- ? session.createConsumer(session.createQueue(props.getReceiveDestinationNameRoot() + "_" + uniqueId)) : null;
-
- MessageMonitor messageMonitor = new MessageMonitor();
-
- if (consumer != null)
- {
- consumer.setMessageListener(messageMonitor);
- }
-
- ExceptionMonitor exceptionMonitor = new ExceptionMonitor();
- connection.setExceptionListener(exceptionMonitor);
-
- if (!props.getPublisherConsumerActive() && (consumer != null))
- {
- consumer.close();
- }
-
- return new CircuitEndBase(producer, consumer, session, messageMonitor, exceptionMonitor);
- }
-
- /**
- * Builds a circuit end suitable for the receiving side of a test circuit, from standard test parameters.
- *
- * @param connection The connection to build the circuit end on.
- * @param testProps The test parameters to configure the circuit end construction.
- * @param uniqueId A unique number to being numbering destinations from, to make this circuit unique.
- *
- * @return A circuit end suitable for the receiving side of a test circuit.
- *
- * @throws JMSException Any underlying JMSExceptions are allowed to fall through and fail the creation.
- */
- public CircuitEndBase createReceiverCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId)
- throws JMSException
- {
- log.debug(
- "public CircuitEndBase createReceiverCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId = "
- + uniqueId + "): called");
-
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps);
-
- // Check that the test properties do not contain AMQP/Qpid specific settings, and fail if they do.
- if (props.getImmediate() || props.getMandatory())
- {
- throw new RuntimeException(
- "Cannot create a pure JMS circuit as the test properties require AMQP specific options.");
- }
-
- Session session = connection.createSession(props.getPublisherTransacted(), props.getAckMode());
-
- MessageProducer producer =
- props.getReceiverProducerBind()
- ? session.createProducer(session.createQueue(props.getReceiveDestinationNameRoot() + "_" + uniqueId)) : null;
-
- Destination destination =
- props.getPubsub() ? session.createTopic(props.getSendDestinationNameRoot() + "_" + uniqueId)
- : session.createQueue(props.getSendDestinationNameRoot() + "_" + uniqueId);
-
- MessageConsumer consumer =
- props.getReceiverConsumerBind()
- ? ((props.getDurableSubscription() && props.getPubsub())
- ? session.createDurableSubscriber((Topic) destination, "testsub") : session.createConsumer(destination))
- : null;
-
- MessageMonitor messageMonitor = new MessageMonitor();
-
- if (consumer != null)
- {
- consumer.setMessageListener(messageMonitor);
- }
-
- if (!props.getReceiverConsumerActive() && (consumer != null))
- {
- consumer.close();
- }
-
- return new CircuitEndBase(producer, consumer, session, messageMonitor, null);
- }
-
- /**
- * Sets the sender test client to coordinate the test with.
- *
- * @param sender The contact details of the sending client in the test.
- */
- public void setSender(TestClientDetails sender)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Sets the receiving test client to coordinate the test with.
- *
- * @param receiver The contact details of the sending client in the test.
- */
- public void setReceiver(TestClientDetails receiver)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Supplies the sending test client.
- *
- * @return The sending test client.
- */
- public TestClientDetails getSender()
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Supplies the receiving test client.
- *
- * @return The receiving test client.
- */
- public List<TestClientDetails> getReceivers()
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Accepts the conversation factory over which to hold the test coordinating conversation.
- *
- * @param conversationFactory The conversation factory to coordinate the test over.
- */
- public void setConversationFactory(ConversationFactory conversationFactory)
- {
- throw new RuntimeException("Not implemented.");
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/MessageIdentityVector.java b/java/systests/src/main/java/org/apache/qpid/test/framework/MessageIdentityVector.java
deleted file mode 100644
index 397c4e9fbd..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/MessageIdentityVector.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * MessageIdentityVector provides a message identification scheme, that matches individual messages with test cases.
- * Test messages are being sent by a number of test clients, sending messages over a set of routes, and being received
- * by another set of test clients. Each test is itself, being run within a test cycle, of which there could be many. It
- * is the job of the test coordinator to request and receive reports from the available test clients, on what has been
- * sent, what has been received, and what errors may have occurred, and to reconcile this information against the
- * assertions being applied by the test case. In order to be able to figure out which messages belong to which test,
- * there needs to be an identification scheme, that the coordinator can use to correlate messages in senders and
- * receiver reports. Every message sent in a test can be associated with this information.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Identify a test case, a handling client id, a circuit end within the client, and a test cycle number.
- * </table>
- */
-public class MessageIdentityVector
-{
- /** Holds the test case vector component of the message identity vector. */
- private TestCaseVector testCaseVector;
-
- /** The unique client id. */
- private String clientId;
-
- /** The unique circuit end number within the client id. */
- private int circuitEndId;
-
- /**
- * Creates a new identity vector for test messages.
- *
- * @param testCase The name of the test case generating the messages.
- * @param clientId The unique id of the client implementing a circuit end that is handling the messages.
- * @param circuitEndId The unique id number of the circuit end within the client.
- * @param testCycleNumber The cycle iteration number of the test case.
- */
- public MessageIdentityVector(String testCase, String clientId, int circuitEndId, int testCycleNumber)
- {
- this.testCaseVector = new TestCaseVector(testCase, testCycleNumber);
- this.clientId = clientId;
- this.circuitEndId = circuitEndId;
- }
-
- /**
- * Reports the test case vector component of the message identity vector.
- *
- * @return The test case vector component of the message identity vector.
- */
- public TestCaseVector getTestCaseVector()
- {
- return testCaseVector;
- }
-
- /**
- * Reports the name of the test case.
- *
- * @return The name of the test case.
- */
- public String getTestCase()
- {
- return testCaseVector.getTestCase();
- }
-
- /**
- * Reports the test iteration cycle number within the test case.
- *
- * @return The test iteration cycle number within the test case.
- */
- public int getTestCycleNumber()
- {
- return testCaseVector.getTestCycleNumber();
- }
-
- /**
- * Resports the client id.
- *
- * @return The client id.
- */
- public String getClientId()
- {
- return clientId;
- }
-
- /**
- * Reports the circuit end number within the test client.
- *
- * @return The circuit end number within the test client.
- */
- public int getCircuitEndId()
- {
- return circuitEndId;
- }
-
- /**
- * Compares this identity vector with another for equality. All fields must match.
- *
- * @param o The identity vector to compare with.
- *
- * @return <tt>true</tt> if the identity vector is identical to this one by all fields, <tt>false</tt> otherwise.
- */
- public boolean equals(Object o)
- {
- if (this == o)
- {
- return true;
- }
-
- if ((o == null) || (getClass() != o.getClass()))
- {
- return false;
- }
-
- MessageIdentityVector that = (MessageIdentityVector) o;
-
- if (circuitEndId != that.circuitEndId)
- {
- return false;
- }
-
- if ((clientId != null) ? (!clientId.equals(that.clientId)) : (that.clientId != null))
- {
- return false;
- }
-
- if ((testCaseVector != null) ? (!testCaseVector.equals(that.testCaseVector)) : (that.testCaseVector != null))
- {
- return false;
- }
-
- return true;
- }
-
- /**
- * Computes a hash code for this identity vector based on all fields.
- *
- * @return A hash code for this identity vector based on all fields.
- */
- public int hashCode()
- {
- int result;
- result = ((testCaseVector != null) ? testCaseVector.hashCode() : 0);
- result = (31 * result) + ((clientId != null) ? clientId.hashCode() : 0);
- result = (31 * result) + circuitEndId;
-
- return result;
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/MessageMonitor.java b/java/systests/src/main/java/org/apache/qpid/test/framework/MessageMonitor.java
deleted file mode 100644
index 5265c0416f..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/MessageMonitor.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-
-import javax.jms.Message;
-import javax.jms.MessageListener;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * MessageMonitor is used to record information about messages received. This will provide methods to check various
- * properties, such as the type, number and content of messages received in order to verify the correct behaviour of
- * tests.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Count incoming messages.
- * <tr><td> Record time ellapsed since the arrival of the first message.
- * <tr><td> Reset all counts and timings.
- * </table>
- */
-public class MessageMonitor implements MessageListener
-{
- /** Used for debugging. */
- private final Logger log = Logger.getLogger(MessageMonitor.class);
-
- /** Holds the count of messages received since the last query. */
- protected AtomicInteger numMessages = new AtomicInteger();
-
- /** Holds the time of arrival of the first message. */
- protected Long firstMessageTime = null;
-
- /**
- * Handles received messages. Does Nothing.
- *
- * @param message The message. Ignored.
- */
- public void onMessage(Message message)
- {
- // log.debug("public void onMessage(Message message): called");
-
- numMessages.getAndIncrement();
- }
-
- /**
- * Gets the count of messages.
- *
- * @return The count of messages.
- */
- public int getNumMessage()
- {
- if (firstMessageTime == null)
- {
- firstMessageTime = System.nanoTime();
- }
-
- return numMessages.get();
- }
-
- /**
- * Gets the time elapsed since the first message arrived, in nanos, or zero if no messages have arrived yet.
- *
- * @return The time elapsed since the first message arrived, in nanos, or zero if no messages have arrived yet.
- */
- public long getTime()
- {
- if (firstMessageTime != null)
- {
- return System.nanoTime() - firstMessageTime;
- }
- else
- {
- return 0L;
- }
- }
-
- /**
- * Resets the message count and timer to zero.
- */
- public void reset()
- {
- numMessages.set(0);
- firstMessageTime = null;
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/MessagingTestConfigProperties.java b/java/systests/src/main/java/org/apache/qpid/test/framework/MessagingTestConfigProperties.java
deleted file mode 100644
index ceece2dae2..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/MessagingTestConfigProperties.java
+++ /dev/null
@@ -1,684 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-import javax.jms.Session;
-import java.util.Properties;
-
-/**
- * MessagingTestConfigProperties defines a set of property names and default values for specifying a messaging topology,
- * and test parameters for running a messaging test over that topology. A Properties object holding some of these
- * properties, superimposed onto the defaults, is used to establish test topologies and control test behaviour.
- *
- * <p/>A complete list of the parameters, default values and comments on their usage is provided here:
- *
- * <p/><table><caption>Parameters</caption>
- * <tr><th> Parameter <th> Default <th> Comments
- * <tr><td> messageSize <td> 0 <td> Message size in bytes. Not including any headers.
- * <tr><td> destinationName <td> ping <td> The root name to use to generate destination names to ping.
- * <tr><td> persistent <td> false <td> Determines whether peristent delivery is used.
- * <tr><td> transacted <td> false <td> Determines whether messages are sent/received in transactions.
- * <tr><td> broker <td> tcp://localhost:5672 <td> Determines the broker to connect to.
- * <tr><td> virtualHost <td> test <td> Determines the virtual host to send all ping over.
- * <tr><td> rate <td> 0 <td> The maximum rate (in hertz) to send messages at. 0 means no limit.
- * <tr><td> verbose <td> false <td> The verbose flag for debugging. Prints to console on every message.
- * <tr><td> pubsub <td> false <td> Whether to ping topics or queues. Uses p2p by default.
- * <tr><td> username <td> guest <td> The username to access the broker with.
- * <tr><td> password <td> guest <td> The password to access the broker with.
- * <tr><td> selector <td> null <td> Not used. Defines a message selector to filter pings with.
- * <tr><td> destinationCount <td> 1 <td> The number of receivers listening to the pings.
- * <tr><td> timeout <td> 30000 <td> In milliseconds. The timeout to stop waiting for replies.
- * <tr><td> commitBatchSize <td> 1 <td> The number of messages per transaction in transactional mode.
- * <tr><td> uniqueDests <td> true <td> Whether each receivers only listens to one ping destination or all.
- * <tr><td> durableDests <td> false <td> Whether or not durable destinations are used.
- * <tr><td> ackMode <td> AUTO_ACK <td> The message acknowledgement mode. Possible values are:
- * 0 - SESSION_TRANSACTED
- * 1 - AUTO_ACKNOWLEDGE
- * 2 - CLIENT_ACKNOWLEDGE
- * 3 - DUPS_OK_ACKNOWLEDGE
- * 257 - NO_ACKNOWLEDGE
- * 258 - PRE_ACKNOWLEDGE
- * <tr><td> maxPending <td> 0 <td> The maximum size in bytes, of messages sent but not yet received.
- * Limits the volume of messages currently buffered on the client
- * or broker. Can help scale test clients by limiting amount of buffered
- * data to avoid out of memory errors.
- * </table>
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide the names and defaults of all test parameters.
- * </table>
- *
- * @todo Put a type-safe wrapper around these properties, but continue to store the parameters as properties. This is
- * simply to ensure that it is a simple matter to serialize/deserialize string/string pairs onto messages.
- */
-public class MessagingTestConfigProperties extends ParsedProperties
-{
- // ====================== Connection Properties ==================================
-
- /** Holds the name of the default connection configuration. */
- public static final String CONNECTION_NAME = "broker";
-
- /** Holds the name of the property to get the initial context factory name from. */
- public static final String INITIAL_CONTEXT_FACTORY_PROPNAME = "java.naming.factory.initial";
-
- /** Defines the class to use as the initial context factory by default. */
- public static final String INITIAL_CONTEXT_FACTORY_DEFAULT = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory";
-
- /** Holds the name of the property to get the test broker url from. */
- public static final String BROKER_PROPNAME = "qpid.test.broker";
-
- /** Holds the default broker url for the test. */
- public static final String BROKER_DEFAULT = "vm://:1";
-
- /** Holds the name of the property to get the test broker virtual path. */
- public static final String VIRTUAL_HOST_PROPNAME = "virtualHost";
-
- /** Holds the default virtual path for the test. */
- public static final String VIRTUAL_HOST_DEFAULT = "test";
-
- /** Holds the name of the property to get the broker access username from. */
- public static final String USERNAME_PROPNAME = "username";
-
- /** Holds the default broker log on username. */
- public static final String USERNAME_DEFAULT = "guest";
-
- /** Holds the name of the property to get the broker access password from. */
- public static final String PASSWORD_PROPNAME = "password";
-
- /** Holds the default broker log on password. */
- public static final String PASSWORD_DEFAULT = "guest";
-
- // ====================== Messaging Topology Properties ==========================
-
- /** Holds the name of the property to get the bind publisher procuder flag from. */
- public static final String PUBLISHER_PRODUCER_BIND_PROPNAME = "publisherProducerBind";
-
- /** Holds the default value of the publisher producer flag. */
- public static final boolean PUBLISHER_PRODUCER_BIND_DEFAULT = true;
-
- /** Holds the name of the property to get the bind publisher procuder flag from. */
- public static final String PUBLISHER_CONSUMER_BIND_PROPNAME = "publisherConsumerBind";
-
- /** Holds the default value of the publisher consumer flag. */
- public static final boolean PUBLISHER_CONSUMER_BIND_DEFAULT = false;
-
- /** Holds the name of the property to get the bind receivers procuder flag from. */
- public static final String RECEIVER_PRODUCER_BIND_PROPNAME = "receiverProducerBind";
-
- /** Holds the default value of the receivers producer flag. */
- public static final boolean RECEIVER_PRODUCER_BIND_DEFAULT = false;
-
- /** Holds the name of the property to get the bind receivers procuder flag from. */
- public static final String RECEIVER_CONSUMER_BIND_PROPNAME = "receiverConsumerBind";
-
- /** Holds the default value of the receivers consumer flag. */
- public static final boolean RECEIVER_CONSUMER_BIND_DEFAULT = true;
-
- /** Holds the name of the property to get the publishers consumer active flag from. */
- public static final String PUBLISHER_CONSUMER_ACTIVE_PROPNAME = "publisherConsumerActive";
-
- /** Holds the default value of the publishers consumer active flag. */
- public static final boolean PUBLISHER_CONSUMER_ACTIVE_DEFAULT = true;
-
- /** Holds the name of the property to get the receivers consumer active flag from. */
- public static final String RECEIVER_CONSUMER_ACTIVE_PROPNAME = "receiverConsumerActive";
-
- /** Holds the default value of the receivers consumer active flag. */
- public static final boolean RECEIVER_CONSUMER_ACTIVE_DEFAULT = true;
-
- /** Holds the name of the property to get the destination name root from. */
- public static final String SEND_DESTINATION_NAME_ROOT_PROPNAME = "sendDestinationRoot";
-
- /** Holds the root of the name of the default destination to send to. */
- public static final String SEND_DESTINATION_NAME_ROOT_DEFAULT = "sendTo";
-
- /** Holds the name of the property to get the destination name root from. */
- public static final String RECEIVE_DESTINATION_NAME_ROOT_PROPNAME = "receiveDestinationRoot";
-
- /** Holds the root of the name of the default destination to send to. */
- public static final String RECEIVE_DESTINATION_NAME_ROOT_DEFAULT = "receiveFrom";
-
- /** Holds the name of the proeprty to get the destination count from. */
- public static final String DESTINATION_COUNT_PROPNAME = "destinationCount";
-
- /** Defines the default number of destinations to ping. */
- public static final int DESTINATION_COUNT_DEFAULT = 1;
-
- /** Holds the name of the property to get the p2p or pub/sub messaging mode from. */
- public static final String PUBSUB_PROPNAME = "pubsub";
-
- /** Holds the pub/sub mode default, true means ping a topic, false means ping a queue. */
- public static final boolean PUBSUB_DEFAULT = false;
-
- // ====================== JMS Options and Flags =================================
-
- /** Holds the name of the property to get the test delivery mode from. */
- public static final String PERSISTENT_MODE_PROPNAME = "persistent";
-
- /** Holds the message delivery mode to use for the test. */
- public static final boolean PERSISTENT_MODE_DEFAULT = false;
-
- /** Holds the name of the property to get the test transactional mode from. */
- public static final String TRANSACTED_PUBLISHER_PROPNAME = "transactedPublisher";
-
- /** Holds the transactional mode to use for the test. */
- public static final boolean TRANSACTED_PUBLISHER_DEFAULT = false;
-
- /** Holds the name of the property to get the test transactional mode from. */
- public static final String TRANSACTED_RECEIVER_PROPNAME = "transactedReceiver";
-
- /** Holds the transactional mode to use for the test. */
- public static final boolean TRANSACTED_RECEIVER_DEFAULT = false;
-
- /** Holds the name of the property to set the no local flag from. */
- public static final String NO_LOCAL_PROPNAME = "noLocal";
-
- /** Defines the default value of the no local flag to use when consuming messages. */
- public static final boolean NO_LOCAL_DEFAULT = false;
-
- /** Holds the name of the property to get the message acknowledgement mode from. */
- public static final String ACK_MODE_PROPNAME = "ackMode";
-
- /** Defines the default message acknowledgement mode. */
- public static final int ACK_MODE_DEFAULT = Session.AUTO_ACKNOWLEDGE;
-
- /** Holds the name of the property to get the durable subscriptions flag from, when doing pub/sub messaging. */
- public static final String DURABLE_SUBSCRIPTION_PROPNAME = "durableSubscription";
-
- /** Defines the default value of the durable subscriptions flag. */
- public static final boolean DURABLE_SUBSCRIPTION_DEFAULT = false;
-
- // ====================== Qpid/AMQP Options and Flags ================================
-
- /** Holds the name of the property to set the exclusive flag from. */
- public static final String EXCLUSIVE_PROPNAME = "exclusive";
-
- /** Defines the default value of the exclusive flag to use when consuming messages. */
- public static final boolean EXCLUSIVE_DEFAULT = false;
-
- /** Holds the name of the property to set the immediate flag from. */
- public static final String IMMEDIATE_PROPNAME = "immediate";
-
- /** Defines the default value of the immediate flag to use when sending messages. */
- public static final boolean IMMEDIATE_DEFAULT = false;
-
- /** Holds the name of the property to set the mandatory flag from. */
- public static final String MANDATORY_PROPNAME = "mandatory";
-
- /** Defines the default value of the mandatory flag to use when sending messages. */
- public static final boolean MANDATORY_DEFAULT = false;
-
- /** Holds the name of the property to get the durable destinations flag from. */
- public static final String DURABLE_DESTS_PROPNAME = "durableDests";
-
- /** Default value for the durable destinations flag. */
- public static final boolean DURABLE_DESTS_DEFAULT = false;
-
- /** Holds the name of the property to set the prefetch size from. */
- public static final String PREFETCH_PROPNAME = "prefetch";
-
- /** Defines the default prefetch size to use when consuming messages. */
- public static final int PREFETCH_DEFAULT = 100;
-
- // ====================== Common Test Parameters ================================
-
- /** Holds the name of the property to get the test message size from. */
- public static final String MESSAGE_SIZE_PROPNAME = "messageSize";
-
- /** Used to set up a default message size. */
- public static final int MESSAGE_SIZE_DEAFULT = 0;
-
- /** Holds the name of the property to get the message rate from. */
- public static final String RATE_PROPNAME = "rate";
-
- /** Defines the default rate (in pings per second) to send pings at. 0 means as fast as possible, no restriction. */
- public static final int RATE_DEFAULT = 0;
-
- /** Holds the name of the proeprty to get the. */
- public static final String SELECTOR_PROPNAME = "selector";
-
- /** Holds the default message selector. */
- public static final String SELECTOR_DEFAULT = "";
-
- /** Holds the name of the property to get the waiting timeout for response messages. */
- public static final String TIMEOUT_PROPNAME = "timeout";
-
- /** Default time to wait before assuming that a ping has timed out. */
- public static final long TIMEOUT_DEFAULT = 30000;
-
- /** Holds the name of the property to get the commit batch size from. */
- public static final String TX_BATCH_SIZE_PROPNAME = "commitBatchSize";
-
- /** Defines the default number of pings to send in each transaction when running transactionally. */
- public static final int TX_BATCH_SIZE_DEFAULT = 1;
-
- /** Holds the name of the property to set the maximum amount of pending message data for a producer to hold. */
- public static final String MAX_PENDING_PROPNAME = "maxPending";
-
- /** Defines the default maximum quantity of pending message data to allow producers to hold. */
- public static final int MAX_PENDING_DEFAULT = 0;
-
- /** Holds the name of the property to get the publisher rollback flag from. */
- public static final String ROLLBACK_PUBLISHER_PROPNAME = "rollbackPublisher";
-
- /** Holds the default publisher roll back setting. */
- public static final boolean ROLLBACK_PUBLISHER_DEFAULT = false;
-
- /** Holds the name of the property to get the publisher rollback flag from. */
- public static final String ROLLBACK_RECEIVER_PROPNAME = "rollbackReceiver";
-
- /** Holds the default publisher roll back setting. */
- public static final boolean ROLLBACK_RECEIVER_DEFAULT = false;
-
- // ====================== Options that control the bahviour of the test framework. =========================
-
- /** Holds the name of the property to get the behavioural mode of not applicable assertions. */
- public static final String NOT_APPLICABLE_ASSERTION_PROPNAME = "notApplicableAssertion";
-
- /** Holds the default behavioral mode of not applicable assertions, which is logging them as a warning. */
- public static final String NOT_APPLICABLE_ASSERTION_DEFAULT = "warn";
-
- /** Holds the name of the property to get the verbose mode proeprty from. */
- public static final String VERBOSE_PROPNAME = "verbose";
-
- /** Holds the default verbose mode. */
- public static final boolean VERBOSE_DEFAULT = false;
-
- /** Holds the default configuration properties. */
- public static ParsedProperties defaults = new ParsedProperties();
-
- static
- {
- defaults.setPropertyIfNull(INITIAL_CONTEXT_FACTORY_PROPNAME, INITIAL_CONTEXT_FACTORY_DEFAULT);
- defaults.setPropertyIfNull(BROKER_PROPNAME, BROKER_DEFAULT);
- defaults.setPropertyIfNull(VIRTUAL_HOST_PROPNAME, VIRTUAL_HOST_DEFAULT);
- defaults.setPropertyIfNull(USERNAME_PROPNAME, USERNAME_DEFAULT);
- defaults.setPropertyIfNull(PASSWORD_PROPNAME, PASSWORD_DEFAULT);
-
- defaults.setPropertyIfNull(PUBLISHER_PRODUCER_BIND_PROPNAME, PUBLISHER_PRODUCER_BIND_DEFAULT);
- defaults.setPropertyIfNull(PUBLISHER_CONSUMER_BIND_PROPNAME, PUBLISHER_CONSUMER_BIND_DEFAULT);
- defaults.setPropertyIfNull(RECEIVER_PRODUCER_BIND_PROPNAME, RECEIVER_PRODUCER_BIND_DEFAULT);
- defaults.setPropertyIfNull(RECEIVER_CONSUMER_BIND_PROPNAME, RECEIVER_CONSUMER_BIND_DEFAULT);
- defaults.setPropertyIfNull(PUBLISHER_CONSUMER_ACTIVE_PROPNAME, PUBLISHER_CONSUMER_ACTIVE_DEFAULT);
- defaults.setPropertyIfNull(RECEIVER_CONSUMER_ACTIVE_PROPNAME, RECEIVER_CONSUMER_ACTIVE_DEFAULT);
- defaults.setPropertyIfNull(SEND_DESTINATION_NAME_ROOT_PROPNAME, SEND_DESTINATION_NAME_ROOT_DEFAULT);
- defaults.setPropertyIfNull(RECEIVE_DESTINATION_NAME_ROOT_PROPNAME, RECEIVE_DESTINATION_NAME_ROOT_DEFAULT);
- defaults.setPropertyIfNull(DESTINATION_COUNT_PROPNAME, DESTINATION_COUNT_DEFAULT);
- defaults.setPropertyIfNull(PUBSUB_PROPNAME, PUBSUB_DEFAULT);
-
- defaults.setPropertyIfNull(PERSISTENT_MODE_PROPNAME, PERSISTENT_MODE_DEFAULT);
- defaults.setPropertyIfNull(TRANSACTED_PUBLISHER_PROPNAME, TRANSACTED_PUBLISHER_DEFAULT);
- defaults.setPropertyIfNull(TRANSACTED_RECEIVER_PROPNAME, TRANSACTED_RECEIVER_DEFAULT);
- defaults.setPropertyIfNull(NO_LOCAL_PROPNAME, NO_LOCAL_DEFAULT);
- defaults.setPropertyIfNull(ACK_MODE_PROPNAME, ACK_MODE_DEFAULT);
- defaults.setPropertyIfNull(DURABLE_SUBSCRIPTION_PROPNAME, DURABLE_SUBSCRIPTION_DEFAULT);
-
- defaults.setPropertyIfNull(EXCLUSIVE_PROPNAME, EXCLUSIVE_DEFAULT);
- defaults.setPropertyIfNull(IMMEDIATE_PROPNAME, IMMEDIATE_DEFAULT);
- defaults.setPropertyIfNull(MANDATORY_PROPNAME, MANDATORY_DEFAULT);
- defaults.setPropertyIfNull(DURABLE_DESTS_PROPNAME, DURABLE_DESTS_DEFAULT);
- defaults.setPropertyIfNull(PREFETCH_PROPNAME, PREFETCH_DEFAULT);
-
- defaults.setPropertyIfNull(MESSAGE_SIZE_PROPNAME, MESSAGE_SIZE_DEAFULT);
- defaults.setPropertyIfNull(RATE_PROPNAME, RATE_DEFAULT);
- defaults.setPropertyIfNull(SELECTOR_PROPNAME, SELECTOR_DEFAULT);
- defaults.setPropertyIfNull(TIMEOUT_PROPNAME, TIMEOUT_DEFAULT);
- defaults.setPropertyIfNull(TX_BATCH_SIZE_PROPNAME, TX_BATCH_SIZE_DEFAULT);
- defaults.setPropertyIfNull(MAX_PENDING_PROPNAME, MAX_PENDING_DEFAULT);
- defaults.setPropertyIfNull(ROLLBACK_PUBLISHER_PROPNAME, ROLLBACK_PUBLISHER_DEFAULT);
- defaults.setPropertyIfNull(ROLLBACK_RECEIVER_PROPNAME, ROLLBACK_RECEIVER_DEFAULT);
-
- defaults.setPropertyIfNull(NOT_APPLICABLE_ASSERTION_PROPNAME, NOT_APPLICABLE_ASSERTION_DEFAULT);
- defaults.setPropertyIfNull(VERBOSE_PROPNAME, VERBOSE_DEFAULT);
- }
-
- /**
- * Creates a test configuration based on the defaults.
- */
- public MessagingTestConfigProperties()
- {
- super(defaults);
- }
-
- /**
- * Creates a test configuration based on the supplied properties.
- *
- * @param properties The test configuration.
- */
- public MessagingTestConfigProperties(Properties properties)
- {
- super(properties);
- }
-
- /**
- * The size of test messages to send.
- *
- * @return The size of test messages to send.
- */
- public int getMessageSize()
- {
- return getPropertyAsInteger(MESSAGE_SIZE_PROPNAME);
- }
-
- /**
- * Flag to indicate that the publishing producer should be set up to publish to a destination.
- *
- * @return Flag to indicate that the publishing producer should be set up to publish to a destination.
- */
- public boolean getPublisherProducerBind()
- {
- return getPropertyAsBoolean(PUBLISHER_PRODUCER_BIND_PROPNAME);
- }
-
- /**
- * Flag to indicate that the publishing consumer should be set up to receive from a destination.
- *
- * @return Flag to indicate that the publishing consumer should be set up to receive from a destination.
- */
- public boolean getPublisherConsumerBind()
- {
- return getPropertyAsBoolean(PUBLISHER_CONSUMER_BIND_PROPNAME);
- }
-
- /**
- * Flag to indicate that the receiving producer should be set up to publish to a destination.
- *
- * @return Flag to indicate that the receiving producer should be set up to publish to a destination.
- */
- public boolean getReceiverProducerBind()
- {
- return getPropertyAsBoolean(RECEIVER_PRODUCER_BIND_PROPNAME);
- }
-
- /**
- * Flag to indicate that the receiving consumer should be set up to receive from a destination.
- *
- * @return Flag to indicate that the receiving consumer should be set up to receive from a destination.
- */
- public boolean getReceiverConsumerBind()
- {
- return getPropertyAsBoolean(RECEIVER_CONSUMER_BIND_PROPNAME);
- }
-
- /**
- * Flag to indicate that the publishing consumer should be created and actively listening.
- *
- * @return Flag to indicate that the publishing consumer should be created.
- */
- public boolean getPublisherConsumerActive()
- {
- return getPropertyAsBoolean(PUBLISHER_CONSUMER_ACTIVE_PROPNAME);
- }
-
- /**
- * Flag to indicate that the receiving consumers should be created and actively listening.
- *
- * @return Flag to indicate that the receiving consumers should be created and actively listening.
- */
- public boolean getReceiverConsumerActive()
- {
- return getPropertyAsBoolean(RECEIVER_CONSUMER_ACTIVE_PROPNAME);
- }
-
- /**
- * A root to create all test destination names from.
- *
- * @return A root to create all test destination names from.
- */
- public String getSendDestinationNameRoot()
- {
- return getProperty(SEND_DESTINATION_NAME_ROOT_PROPNAME);
- }
-
- /**
- * A root to create all receiving destination names from.
- *
- * @return A root to create all receiving destination names from.
- */
- public String getReceiveDestinationNameRoot()
- {
- return getProperty(RECEIVE_DESTINATION_NAME_ROOT_PROPNAME);
- }
-
- /**
- * Flag to indicate that persistent messages should be used.
- *
- * @return Flag to indicate that persistent messages should be used.
- */
- public boolean getPersistentMode()
- {
- return getPropertyAsBoolean(PERSISTENT_MODE_PROPNAME);
- }
-
- /**
- * Flag to indicate that transactional messages should be sent by the publisher.
- *
- * @return Flag to indicate that transactional messages should be sent by the publisher.
- */
- public boolean getPublisherTransacted()
- {
- return getPropertyAsBoolean(TRANSACTED_PUBLISHER_PROPNAME);
- }
-
- /**
- * Flag to indicate that transactional receives should be used by the receiver.
- *
- * @return Flag to indicate that transactional receives should be used by the receiver.
- */
- public boolean getReceiverTransacted()
- {
- return getPropertyAsBoolean(TRANSACTED_PUBLISHER_PROPNAME);
- }
-
- /**
- * The name of the virtual host to run all tests over.
- *
- * @return The name of the virtual host to run all tests over.
- */
- public String getVirtualHost()
- {
- return getProperty(VIRTUAL_HOST_PROPNAME);
- }
-
- /**
- * Limiting rate for each sender in messages per second, or zero for unlimited.
- *
- * @return Limiting rate for each sender in messages per second, or zero for unlimited.
- */
- public String getRate()
- {
- return getProperty(RATE_PROPNAME);
- }
-
- /**
- * Flag to indicate that test messages should be received publish/subscribe style by all receivers.
- *
- * @return Flag to indicate that test messages should be received publish/subscribe style by all receivers.
- */
- public boolean getPubsub()
- {
- return getPropertyAsBoolean(PUBSUB_PROPNAME);
- }
-
- /**
- * The username credentials to run tests with.
- *
- * @return The username credentials to run tests with.
- */
- public String getUsername()
- {
- return getProperty(USERNAME_PROPNAME);
- }
-
- /**
- * The password credentials to run tests with.
- *
- * @return The password credentials to run tests with.
- */
- public String getPassword()
- {
- return getProperty(PASSWORD_PROPNAME);
- }
-
- /**
- * The timeout duration to fail tests on, should they receive no messages within it.
- *
- * @return The timeout duration to fail tests on, should they receive no messages within it.
- */
- public long getTimeout()
- {
- return getPropertyAsLong(TIMEOUT_PROPNAME);
- }
-
- /**
- * The number of messages to batch into each transaction in transational tests.
- *
- * @return The number of messages to batch into each transaction in transational tests.
- */
- public int getTxBatchSize()
- {
- return getPropertyAsInteger(TX_BATCH_SIZE_PROPNAME);
- }
-
- /**
- * Flag to indicate that tests should use durable destinations.
- *
- * @return Flag to indicate that tests should use durable destinations.
- */
- public boolean getDurableDests()
- {
- return getPropertyAsBoolean(DURABLE_DESTS_PROPNAME);
- }
-
- /**
- * The ack mode for message receivers to use.
- *
- * @return The ack mode for message receivers to use.
- */
- public int getAckMode()
- {
- return getPropertyAsInteger(ACK_MODE_PROPNAME);
- }
-
- /**
- * Flag to indicate that tests should use durable subscriptions.
- *
- * @return Flag to indicate that tests should use durable subscriptions.
- */
- public boolean getDurableSubscription()
- {
- return getPropertyAsBoolean(DURABLE_SUBSCRIPTION_PROPNAME);
- }
-
- /**
- * The maximum amount of in-flight data, in bytes, that tests should send at any time.
- *
- * @return The maximum amount of in-flight data, in bytes, that tests should send at any time.
- */
- public int getMaxPending()
- {
- return getPropertyAsInteger(MAX_PENDING_PROPNAME);
- }
-
- /**
- * The size of the prefetch queue to use.
- *
- * @return The size of the prefetch queue to use.
- */
- public int getPrefetch()
- {
- return getPropertyAsInteger(PREFETCH_PROPNAME);
- }
-
- /**
- * Flag to indicate that subscriptions should be no-local.
- *
- * @return Flag to indicate that subscriptions should be no-local.
- */
- public boolean getNoLocal()
- {
- return getPropertyAsBoolean(NO_LOCAL_PROPNAME);
- }
-
- /**
- * Flag to indicate that subscriptions should be exclusive.
- *
- * @return Flag to indicate that subscriptions should be exclusive.
- */
- public boolean getExclusive()
- {
- return getPropertyAsBoolean(EXCLUSIVE_PROPNAME);
- }
-
- /**
- * Flag to indicate that messages must be delivered immediately.
- *
- * @return Flag to indicate that messages must be delivered immediately.
- */
- public boolean getImmediate()
- {
- return getPropertyAsBoolean(IMMEDIATE_PROPNAME);
- }
-
- /**
- * Flag to indicate that messages must be routable.
- *
- * @return Flag to indicate that messages must be routable.
- */
- public boolean getMandatory()
- {
- return getPropertyAsBoolean(MANDATORY_PROPNAME);
- }
-
- /**
- * Gets the value of a flag to indicate that the publisher should rollback all messages sent.
- *
- * @return A flag to indicate that the publisher should rollback all messages sent.
- */
- public boolean getRollbackPublisher()
- {
- return getPropertyAsBoolean(ROLLBACK_PUBLISHER_PROPNAME);
- }
-
- /**
- * Gets the value of a flag to indicate that the receiver should rollback all messages received, then receive them
- * again.
- *
- * @return A flag to indicate that the publisher should rollback all messages received.
- */
- public boolean getRollbackReceiver()
- {
- return getPropertyAsBoolean(ROLLBACK_RECEIVER_PROPNAME);
- }
-
- /**
- * Gets the behavioural mode of not applicable assertions. Should be one of 'quiet', 'warn' or 'fail'.
- *
- * @return The behavioural mode of not applicable assertions.
- */
- public String getNotApplicableAssertionMode()
- {
- return getProperty(NOT_APPLICABLE_ASSERTION_PROPNAME);
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/NotApplicableAssertion.java b/java/systests/src/main/java/org/apache/qpid/test/framework/NotApplicableAssertion.java
deleted file mode 100644
index 2a20be12d6..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/NotApplicableAssertion.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-/**
- * NotApplicableAssertion is a messaging assertion that can be used when an assertion requested by a test-case is not
- * applicable to the testing scenario. For example an assertion may relate to AMQP functionality, but a test case may be
- * being run over a non-AMQP JMS implementation, in which case the request to create the assertion may return this
- * instead of the proper assertion. The test framework is configurable to quietly drop these assertions, log them
- * as warnings to the console, or raise them as test failures.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Quitely pass.
- * <tr><td> Log a warning.
- * <tr><td> Raise a test failure.
- * </table>
- */
-public class NotApplicableAssertion implements Assertion
-{
- /** Used for logging to the console. */
- private static final Logger console = Logger.getLogger("CONSOLE." + NotApplicableAssertion.class.getName());
-
- /** The possible behavioural modes of this assertion. */
- private enum Mode
- {
- /** Quietly ignore the assertion by passing. */
- Quiet,
-
- /** Ignore the assertion by passing but log a warning about it. */
- Warn,
-
- /** Fail the assertion. */
- Fail;
- }
-
- /** The behavioural mode of the assertion. */
- private Mode mode;
-
- /**
- * Creates an assertion that is driven by the value of the 'notApplicableAssertion' property of the test
- * configuration. Its value should match one of 'quiet', 'warn' or 'fail' and if it does not it is automatically
- * read as 'fail'.
- *
- * @param testProperties The test configuration properties.
- */
- public NotApplicableAssertion(ParsedProperties testProperties)
- {
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProperties);
-
- String modeName = props.getNotApplicableAssertionMode();
-
- if ("quiet".equals(modeName))
- {
- mode = Mode.Quiet;
- }
- else if ("warn".equals(modeName))
- {
- mode = Mode.Warn;
- }
- else
- {
- mode = Mode.Fail;
- }
- }
-
- /**
- * Applies the assertion.
- *
- * @return <tt>true</tt> if the assertion passes, <tt>false</tt> if it fails.
- */
- public boolean apply()
- {
- switch (mode)
- {
- case Quiet:
- return true;
-
- case Warn:
- console.warn("Warning: Not applicable assertion being ignored.");
-
- return true;
-
- case Fail:
- default:
- return false;
- }
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/Publisher.java b/java/systests/src/main/java/org/apache/qpid/test/framework/Publisher.java
deleted file mode 100644
index 2c8be4f787..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/Publisher.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-/**
- * A Publisher represents the status of the publishing side of a test circuit. Its main purpose is to provide assertions
- * that can be applied to test the behaviour of the publishers.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide assertion that the publishers received no exceptions.
- * </table>
- *
- * @todo There are mixtures of AMQP and JMS assertions in this interface. Either keep them here, but quietly (or with a
- * warning or error) drop them from test cases where they are not relevant, or push them down into sub-classes.
- * I am tempted to go with the dropping/warning/error approach, that would imply that it makes sense to pull
- * the assertions back from AMQPPublisher to here.
- */
-public interface Publisher
-{
- // Assertions that are meaningfull to AMQP and to JMS.
-
- /**
- * Provides an assertion that the publisher encountered no exceptions.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the publisher encountered no exceptions.
- */
- public Assertion noExceptionsAssertion(ParsedProperties testProps);
-
- // Assertions that are meaningfull only to AMQP.
-
- /**
- * Provides an assertion that the AMQP channel was forcibly closed by an error condition.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the AMQP channel was forcibly closed by an error condition.
- */
- public Assertion channelClosedAssertion(ParsedProperties testProps);
-
- // Assertions that are meaningfull only to Java/JMS.
-
- /**
- * Provides an assertion that the publisher got a given exception during the test.
- *
- * @param testProps The test configuration properties.
- * @param exceptionClass The exception class to check for.
- *
- * @return An assertion that the publisher got a given exception during the test.
- */
- public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass);
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/Receiver.java b/java/systests/src/main/java/org/apache/qpid/test/framework/Receiver.java
deleted file mode 100644
index 19dc4d90e7..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/Receiver.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-/**
- * A Receiver is a {@link CircuitEnd} that represents the status of the receiving side of a test circuit. Its main
- * purpose is to provide assertions that can be applied to check the behaviour of the receivers.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide assertion that the receivers received no exceptions.
- * <tr><td> Provide assertion that the receivers received all test messages sent to it.
- * </table>
- *
- * @todo There are mixtures of AMQP and JMS assertions in this interface. Either keep them here, but quietly (or with a
- * warning or error) drop them from test cases where they are not relevant, or push them down into sub-classes.
- * I am tempted to go with the dropping/warning/error approach.
- */
-public interface Receiver
-{
- // Assertions that are meaningfull to AMQP and to JMS.
-
- /**
- * Provides an assertion that the receivers encountered no exceptions.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the receivers encountered no exceptions.
- */
- public Assertion noExceptionsAssertion(ParsedProperties testProps);
-
- /**
- * Provides an assertion that the receivers got all messages that were sent to it.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the receivers got all messages that were sent to it.
- */
- public Assertion allMessagesReceivedAssertion(ParsedProperties testProps);
-
- /**
- * Provides an assertion that the receivers got none of the messages that were sent to it.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the receivers got none of the messages that were sent to it.
- */
- public Assertion noMessagesReceivedAssertion(ParsedProperties testProps);
-
- // Assertions that are meaningfull only to AMQP.
-
- /**
- * Provides an assertion that the AMQP channel was forcibly closed by an error condition.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the AMQP channel was forcibly closed by an error condition.
- */
- public Assertion channelClosedAssertion(ParsedProperties testProps);
-
- // Assertions that are meaningfull only to Java/JMS.
-
- /**
- * Provides an assertion that the receiver got a given exception during the test.
- *
- * @param testProps The test configuration properties.
- * @param exceptionClass The exception class to check for.
- *
- * @return An assertion that the receiver got a given exception during the test.
- */
- public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass);
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/TestCaseVector.java b/java/systests/src/main/java/org/apache/qpid/test/framework/TestCaseVector.java
deleted file mode 100644
index ad1e70f6f7..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/TestCaseVector.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td>
- * </table>
- */
-public class TestCaseVector
-{
- /** The test case name. */
- private String testCase;
-
- /** The test cycle number within the test case. */
- private int testCycleNumber;
-
- public TestCaseVector(String testCase, int testCycleNumber)
- {
- this.testCase = testCase;
- this.testCycleNumber = testCycleNumber;
- }
-
- public String getTestCase()
- {
- return testCase;
- }
-
- public int getTestCycleNumber()
- {
- return testCycleNumber;
- }
-
- public boolean equals(Object o)
- {
- if (this == o)
- {
- return true;
- }
-
- if ((o == null) || (getClass() != o.getClass()))
- {
- return false;
- }
-
- TestCaseVector that = (TestCaseVector) o;
-
- if (testCycleNumber != that.testCycleNumber)
- {
- return false;
- }
-
- if ((testCase != null) ? (!testCase.equals(that.testCase)) : (that.testCase != null))
- {
- return false;
- }
-
- return true;
- }
-
- public int hashCode()
- {
- int result;
- result = ((testCase != null) ? testCase.hashCode() : 0);
- result = (31 * result) + testCycleNumber;
-
- return result;
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/TestClientDetails.java b/java/systests/src/main/java/org/apache/qpid/test/framework/TestClientDetails.java
deleted file mode 100644
index 7498f2b6b5..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/TestClientDetails.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * TestClientDetails is used to encapsulate information about an interop test client. It pairs together the unique
- * name of the client, and the route on which it listens to its control messages.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Record test clients control addresses together with their names.
- * </table>
- */
-public class TestClientDetails
-{
- /** The test clients name. */
- public String clientName;
-
- /* The test clients unique sequence number. Not currently used. */
-
- /** The routing key of the test clients control topic. */
- public String privateControlKey;
-
- /**
- * Two TestClientDetails are considered to be equal, iff they have the same client name.
- *
- * @param o The object to compare to.
- *
- * @return <tt>If the object to compare to is a TestClientDetails equal to this one, <tt>false</tt> otherwise.
- */
- public boolean equals(Object o)
- {
- if (this == o)
- {
- return true;
- }
-
- if (!(o instanceof TestClientDetails))
- {
- return false;
- }
-
- final TestClientDetails testClientDetails = (TestClientDetails) o;
-
- return !((clientName != null) ? (!clientName.equals(testClientDetails.clientName))
- : (testClientDetails.clientName != null));
- }
-
- /**
- * Computes a hash code compatible with the equals method; based on the client name alone.
- *
- * @return A hash code for this.
- */
- public int hashCode()
- {
- return ((clientName != null) ? clientName.hashCode() : 0);
- }
-
- /**
- * Outputs the client name and address details. Mostly used for debugging purposes.
- *
- * @return The client name and address.
- */
- public String toString()
- {
- return "TestClientDetails: [ clientName = " + clientName + ", privateControlKey = " + privateControlKey + " ]";
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/TestUtils.java b/java/systests/src/main/java/org/apache/qpid/test/framework/TestUtils.java
deleted file mode 100644
index 919faa4754..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/TestUtils.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-import static org.apache.qpid.test.framework.MessagingTestConfigProperties.BROKER_PROPNAME;
-import static org.apache.qpid.test.framework.MessagingTestConfigProperties.CONNECTION_NAME;
-import static org.apache.qpid.test.framework.MessagingTestConfigProperties.PASSWORD_PROPNAME;
-import static org.apache.qpid.test.framework.MessagingTestConfigProperties.USERNAME_PROPNAME;
-import static org.apache.qpid.test.framework.MessagingTestConfigProperties.VIRTUAL_HOST_PROPNAME;
-
-import javax.jms.BytesMessage;
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import java.util.Map;
-
-/**
- * TestUtils provides static helper methods that are usefull for writing tests against QPid.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create connections from test properties. <td> {@link MessagingTestConfigProperties}
- * <tr><td> Create test messages.
- * <tr><td> Inject a short pause in a test.
- * <tr><td> Serialize properties into a message.
- * </table>
- */
-public class TestUtils
-{
- /** Used for debugging. */
- private static Logger log = Logger.getLogger(TestUtils.class);
-
- /** Some dummy data to stuff all test messages with. */
- private static final byte[] MESSAGE_DATA_BYTES =
- "Test Message -- Test Message -- Test Message -- Test Message -- Test Message -- Test Message -- Test Message -- "
- .getBytes();
-
- /**
- * Establishes a JMS connection using a set of properties and qpids built in JNDI implementation. This is a simple
- * convenience method for code that does not anticipate handling connection failures. All exceptions that indicate
- * that the connection has failed, are wrapped as rutime exceptions, presumably handled by a top level failure
- * handler.
- *
- * <p/>This utility makes use of the following test parameters from {@link MessagingTestConfigProperties} to control
- * the connection creation:
- *
- * <p/><table>
- * <tr><td> {@link MessagingTestConfigProperties#USERNAME_PROPNAME} <td> The username.
- * <tr><td> {@link MessagingTestConfigProperties#PASSWORD_PROPNAME} <td> The password.
- * <tr><td> {@link MessagingTestConfigProperties#VIRTUAL_HOST_PROPNAME} <td> The virtual host name.
- * <tr><td> {@link MessagingTestConfigProperties#BROKER_PROPNAME} <td> The broker URL.
- * <tr><td> {@link MessagingTestConfigProperties#CONNECTION_NAME} <td> The broker name in the initial context.
- *
- * @param messagingProps Connection properties as defined in {@link MessagingTestConfigProperties}.
- *
- * @return A JMS conneciton.
- */
- public static Connection createConnection(ParsedProperties messagingProps)
- {
- log.debug("public static Connection createConnection(ParsedProperties messagingProps = " + messagingProps
- + "): called");
-
- try
- {
- // Extract the configured connection properties from the test configuration.
- String conUsername = messagingProps.getProperty(USERNAME_PROPNAME);
- String conPassword = messagingProps.getProperty(PASSWORD_PROPNAME);
- String virtualHost = messagingProps.getProperty(VIRTUAL_HOST_PROPNAME);
- String brokerUrl = messagingProps.getProperty(BROKER_PROPNAME);
-
- // Create the broker connection url.
- String connectionString =
- "amqp://" + conUsername + ":" + conPassword + "@clientid/" + ((virtualHost != null) ? virtualHost : "")
- + "?brokerlist='" + brokerUrl + "'";
-
- // Create properties to create the initial context from, and inject the connection factory configuration
- // for the defined connection name into it.
- messagingProps.setProperty("connectionfactory." + CONNECTION_NAME, connectionString);
-
- Context ctx = new InitialContext(messagingProps);
-
- ConnectionFactory cf = (ConnectionFactory) ctx.lookup(CONNECTION_NAME);
-
- return cf.createConnection();
- }
- catch (NamingException e)
- {
- throw new RuntimeException("Got JNDI NamingException whilst looking up the connection factory.", e);
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Could not establish connection due to JMSException.", e);
- }
- }
-
- /**
- * Creates a test message of the specified size, on the given JMS session.
- *
- * @param session The JMS session.
- * @param size The size of the message in bytes.
- *
- * @return A bytes message, of the specified size, filled with dummy data.
- *
- * @throws JMSException Any underlying JMSExceptions are allowed to fall through.
- */
- public static Message createTestMessageOfSize(Session session, int size) throws JMSException
- {
- BytesMessage message = session.createBytesMessage();
-
- if (size > 0)
- {
- int div = size / MESSAGE_DATA_BYTES.length;
- int mod = size % MESSAGE_DATA_BYTES.length;
-
- for (int i = 0; i < div; i++)
- {
- message.writeBytes(MESSAGE_DATA_BYTES);
- }
-
- if (mod != 0)
- {
- message.writeBytes(MESSAGE_DATA_BYTES, 0, mod);
- }
- }
-
- return message;
- }
-
- /**
- * Pauses for the specified length of time. In the event of failing to pause for at least that length of time
- * due to interuption of the thread, a RutimeException is raised to indicate the failure. The interupted status
- * of the thread is restores in that case. This method should only be used when it is expected that the pause
- * will be succesfull, for example in test code that relies on inejecting a pause.
- *
- * @param t The minimum time to pause for in milliseconds.
- */
- public static void pause(long t)
- {
- try
- {
- Thread.sleep(t);
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted status
- Thread.currentThread().interrupt();
-
- throw new RuntimeException("Failed to generate the requested pause length.", e);
- }
- }
-
- /**
- * Sets properties of different types on a JMS Message.
- *
- * @param message The message to set properties on.
- * @param properties The property name/value pairs to set.
- *
- * @throws javax.jms.JMSException All underlying JMSExceptions are allowed to fall through.
- *
- * @todo Move this helper method somewhere else. For example, TestUtils.
- */
- public static void setPropertiesOnMessage(Message message, Map<Object, Object> properties) throws JMSException
- {
- for (Map.Entry<Object, Object> entry : properties.entrySet())
- {
- String name = entry.getKey().toString();
- Object value = entry.getValue();
-
- message.setObjectProperty(name, value);
- }
- }
-}
-
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchFailureException.java b/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchFailureException.java
deleted file mode 100644
index 00cc2d8966..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchFailureException.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.clocksynch;
-
-/**
- * ClockSynchFailureException represents failure of a {@link ClockSynchronizer} to achieve synchronization. For example,
- * this could be because a reference signal is not available, or because a desired accurracy cannot be attained.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Represent failure to achieve synchronization.
- * </table>
- */
-public class ClockSynchFailureException extends Exception
-{
- /**
- * Creates a clock synch failure exception.
- *
- * @param message The detail message (which is saved for later retrieval by the {@link #getMessage()} method).
- * @param cause The cause (which is saved for later retrieval by the {@link #getCause()} method). (A <tt>null</tt>
- * value is permitted, and indicates that the cause is nonexistent or unknown.)
- */
- public ClockSynchFailureException(String message, Throwable cause)
- {
- super(message, cause);
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchThread.java b/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchThread.java
deleted file mode 100644
index 3d4c4f7d12..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchThread.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.clocksynch;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.ShutdownHookable;
-import org.apache.qpid.junit.extensions.Throttle;
-
-/**
- * ClockSynchThread is a convenient utility for running a thread that periodically synchronizes the clock against
- * a reference. Supply it with a {@link ClockSynchronizer} and a {@link Throttle} and it will continually keep the
- * clock up-to-date at a rate determined by the throttle.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Continually sychronize the clock at a throttled rate.
- * </table>
- */
-public class ClockSynchThread extends Thread implements ShutdownHookable
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(ClockSynchThread.class);
-
- /** Holds the clock syncher for the synch thread. */
- private ClockSynchronizer clockSyncher;
-
- /** Holds the throttle to limit the synch rate. */
- private Throttle throttle;
-
- /** Flag to indicate that the periodic clock syncher should keep running. */
- boolean doSynch = true;
-
- /**
- * Creates a clock synchronizer thread from a clock synchronizer and a throttle.
- *
- * @param syncher The clock synchronizer.
- * @param throttle The throttle.
- */
- public ClockSynchThread(ClockSynchronizer syncher, Throttle throttle)
- {
- this.clockSyncher = syncher;
- this.throttle = throttle;
- }
-
- /**
- * Terminates the synchronization thread.
- */
- public void terminate()
- {
- doSynch = false;
- }
-
- /**
- * Continually updates the clock, until {@link #terminate()} is called.
- */
- public void run()
- {
- while (doSynch)
- {
- // Perform a clock clockSynch.
- try
- {
- // Wait controlled by the throttle before doing the next synch.
- throttle.throttle();
-
- clockSyncher.synch();
- log.debug("Clock synched, delta = " + clockSyncher.getDelta() + ", epsilon = " + clockSyncher.getEpsilon()
- + ".");
- }
- // Terminate the synch thread if the synchronization cannot be achieved.
- catch (ClockSynchFailureException e)
- {
- log.debug("Cannot synchronize the clock (reference service may be down). Terminating the synch thread.");
- doSynch = false;
- }
- }
- }
-
- /**
- * Gets the clock synchronizer that is kept continually up to date.
- *
- * @return The clock synchronizer that is kept continually up to date.
- */
- public ClockSynchronizer getClockSyncher()
- {
- return clockSyncher;
- }
-
- /**
- * Supplies a shutdown hook, that terminates the synching thread.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- doSynch = false;
- }
- });
- }
-}
-
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchronizer.java b/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchronizer.java
deleted file mode 100644
index a92c551bc2..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchronizer.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.clocksynch;
-
-/**
- * ClockSynchronizer provides an interface through which two nodes may synchronize their clocks. It is expected that one
- * node will act as the reference clock, to which no delta need be applied, and the other node will act as the slave,
- * and which must apply a delta to its local clock to get a clock synchronized with the reference.
- *
- * <p/>The slave side will initiate the computation of a clock delta by calling the {@link #synch} method. This method
- * will not return until the delta has been computed, at which point there is a method to return its value, as well as
- * an estimate of the likely error (usually one standard deviation), in the synchronization. For convenience there is a
- * {@link #nanoTime} method to return the value of System.nanoTime() with the delta added in.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Trigger a clock synchronization.
- * <tr><td> Compute a clock delta to apply to the local clock.
- * <tr><td> Estimate the error in the synchronzation.
- * </table>
- */
-public interface ClockSynchronizer
-{
- /**
- * The slave side should call this to copute a clock delta with the reference.
- *
- * @throws ClockSynchFailureException If synchronization cannot be achieved.
- */
- public void synch() throws ClockSynchFailureException;
-
- /**
- * Gets the clock delta in nano seconds.
- *
- * @return The clock delta in nano seconds.
- */
- public long getDelta();
-
- /**
- * Gets an estimate of the clock error in nan seconds.
- *
- * @return An estimate of the clock error in nan seconds.
- */
- public long getEpsilon();
-
- /**
- * Gets the local clock time with any computed delta added in.
- *
- * @return The local clock time with any computed delta added in.
- */
- public long nanoTime();
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/LocalClockSynchronizer.java b/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/LocalClockSynchronizer.java
deleted file mode 100644
index f448d5f23c..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/LocalClockSynchronizer.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.clocksynch;
-
-/**
- * LocalClockSynchronizer is a fake {@link ClockSynchronizer} that simply calls System.nanoTime(). It exists so that
- * the same tests can be run distributed or locally, taking timings against the ClockSynchronizer interface without
- * being aware of how they are being run.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the local clock with no delta.
- * </table>
- */
-public class LocalClockSynchronizer implements ClockSynchronizer
-{
- /**
- * The slave side should call this to copute a clock delta with the reference.
- *
- * @throws org.apache.qpid.test.framework.clocksynch.ClockSynchFailureException
- * If synchronization cannot be achieved.
- */
- public void synch() throws ClockSynchFailureException
- { }
-
- /**
- * Gets the clock delta in nano seconds.
- *
- * @return The clock delta in nano seconds.
- */
- public long getDelta()
- {
- return 0L;
- }
-
- /**
- * Gets an estimate of the clock error in nan seconds.
- *
- * @return An estimate of the clock error in nan seconds.
- */
- public long getEpsilon()
- {
- return 0L;
- }
-
- /**
- * Gets the local clock time with any computed delta added in.
- *
- * @return The local clock time with any computed delta added in.
- */
- public long nanoTime()
- {
- return System.nanoTime();
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockReference.java b/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockReference.java
deleted file mode 100644
index 8ee8d82636..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockReference.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.clocksynch;
-
-import org.apache.qpid.junit.extensions.ShutdownHookable;
-
-import java.io.IOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.SocketException;
-import java.net.SocketTimeoutException;
-import java.nio.ByteBuffer;
-
-/**
- * UDPClockReference supplies a refernce clock signal (generated from System.nanoTime()).
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply a reference clock signal.
- * </table>
- *
- * @todo Port hard coded. Make configurable.
- *
- * @todo Errors rethrown as runtimes, or silently terminate the service. Could add better error handling if needed.
- */
-public class UDPClockReference implements Runnable, ShutdownHookable
-{
- /** Used for debugging. */
- // private static final Logger log = Logger.getLogger(UDPClockReference.class);
-
- /** Defines the timeout to use when polling the socket for time requests. */
- private static final int TIMEOUT = 200;
-
- /** Defines the port to run the clock reference on. */
- public static final int REFERENCE_PORT = 4444;
-
- /** Holds the socket to receive clock reference requests on. */
- protected DatagramSocket socket = null;
-
- /** Flag used to indicate that the time server should keep running. Set to false to terminate. */
- protected boolean publish = true;
-
- /**
- * Creates a clock reference service on the standard port.
- */
- public UDPClockReference()
- {
- try
- {
- socket = new DatagramSocket(REFERENCE_PORT);
- socket.setSoTimeout(TIMEOUT);
- }
- catch (SocketException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Implements the run loop for this reference time server. This waits for incoming time requests, and replies to
- * any, with a message with the local time stamp in it. Periodically (controlled by {@link #TIMEOUT}), the run
- * loop will check if the {@link #publish} flag has been cleared, and terminate the reference time service if so.
- */
- public void run()
- {
- byte[] buf = new byte[256];
- ByteBuffer bbuf = ByteBuffer.wrap(buf);
-
- while (publish)
- {
- try
- {
- // Wait for a reference time request.
- DatagramPacket packet = new DatagramPacket(buf, buf.length);
- boolean timedOut = false;
-
- try
- {
- socket.receive(packet);
- }
- catch (SocketTimeoutException e)
- {
- timedOut = true;
- }
-
- if (!timedOut)
- {
- // Work out from the received packet, where to reply to.
- InetAddress address = packet.getAddress();
- int port = packet.getPort();
-
- // Respond to the time request by sending back the local clock as the reference time.
- bbuf.putLong(System.nanoTime());
- bbuf.flip();
- packet = new DatagramPacket(bbuf.array(), bbuf.capacity(), address, port);
-
- socket.send(packet);
- }
- }
- catch (IOException e)
- {
- publish = false;
- }
- }
-
- socket.close();
- }
-
- /**
- * Supplies a shutdown hook.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- publish = false;
- }
- });
- }
-
- /**
- * For testing purposes. Runs a reference clock on the default port.
- *
- * @param args None.
- */
- public static void main(String[] args)
- {
- try
- {
- // Create the clock reference service.
- UDPClockReference clock = new UDPClockReference();
-
- // Set up a shutdown hook for it.
- Runtime.getRuntime().addShutdownHook(clock.getShutdownHook());
-
- // Start the service.
- clock.run();
- }
- catch (Exception e)
- {
- e.printStackTrace();
- System.exit(1);
- }
- }
-}
-
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockSynchronizer.java b/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockSynchronizer.java
deleted file mode 100644
index 226c84611d..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockSynchronizer.java
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.clocksynch;
-
-import org.apache.qpid.junit.extensions.util.CommandLineParser;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-import java.io.IOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.SocketException;
-import java.net.SocketTimeoutException;
-import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-
-/**
- * UDPClockSynchronizer is a {@link ClockSynchronizer} that sends pings as UDP datagrams, and uses the following simple
- * algorithm to perform clock synchronization:
- *
- * <ol>
- * <li>Slave initiates synchronization with a Reference clock.</li>
- * <li>Slave stamps current local time on a "time request" message and sends to the Reference.</li>
- * <li>Upon receipt by Reference, Reference stamps Reference-time and returns.</li>
- * <li>Upon receipt by Slave, Slave subtracts current time from sent time and divides by two to compute latency. It
- * subtracts current time from Reference time to determine Slave-Reference time delta and adds in the
- * half-latency to get the correct clock delta.</li>
- * <li>The first result is immediately used to update the clock since it will get the local clock into at least
- * the right ballpark.</li>
- * <li>The Slave repeats steps 2 through 4, 15 more times.</li>
- * <li>The results of the packet receipts are accumulated and sorted in lowest-latency to highest-latency order. The
- * median latency is determined by picking the mid-point sample from this ordered list.</li>
- * <li>All samples outside 1 standard-deviation from the median are discarded and the remaining samples
- * are averaged using an arithmetic mean.</li>
- * </ol>
- *
- * <p/>The use of UDP datagrams, instead of TCP based communication eliminates the hidden delays that TCP can introduce,
- * as it can transparently re-order or re-send packets, or introduce delays as packets are naggled.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Trigger a clock synchronziation.
- * <tr><td> Compute a clock delta to apply to the local clock.
- * <tr><td> Estimate the error in the synchronzation.
- * </table>
- */
-public class UDPClockSynchronizer implements ClockSynchronizer
-{
- /** Used for debugging. */
- // private static final Logger log = Logger.getLogger(UDPClockSynchronizer.class);
-
- /** Defines the timeout to use when waiting for responses to time requests. */
- private static final int TIMEOUT = 50;
-
- /** The clock delta. */
- private long delta = 0L;
-
- /** Holds an estimate of the clock error relative to the reference clock. */
- private long epsilon = 0L;
-
- /** Holds the address of the reference clock. */
- private InetAddress referenceAddress;
-
- /** Holds the socket to communicate with the reference service over. */
- private DatagramSocket socket;
-
- /** Used to control the shutdown in the main test loop. */
- private static boolean doSynch = true;
-
- /**
- * Creates a clock synchronizer against the specified address for the reference.
- *
- * @param address The address of the reference service.
- */
- public UDPClockSynchronizer(String address)
- {
- try
- {
- referenceAddress = InetAddress.getByName(address);
- }
- catch (UnknownHostException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * The slave side should call this to compute a clock delta with the reference.
- *
- * @throws ClockSynchFailureException If synchronization cannot be achieved, due to unavailability of the reference
- * time service.
- */
- public void synch() throws ClockSynchFailureException
- {
- try
- {
- socket = new DatagramSocket();
- socket.setSoTimeout(TIMEOUT);
-
- // Synchronize on a single ping, to get the clock into the right ball-park.
- synch(1);
-
- // Synchronize on 15 pings.
- synch(15);
-
- // And again, for greater accuracy, on 31.
- synch(31);
-
- socket.close();
- }
- catch (SocketException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Updates the synchronization delta by performing the specified number of reference clock requests.
- *
- * @param n The number of reference clock request cycles to perform.
- *
- * @throws ClockSynchFailureException If synchronization cannot be achieved, due to unavailability of the reference
- * time service.
- */
- protected void synch(int n) throws ClockSynchFailureException
- {
- // log.debug("protected void synch(int n = " + n + "): called");
-
- // Create an array of deltas by performing n reference pings.
- long[] delta = new long[n];
-
- for (int i = 0; i < n; i++)
- {
- delta[i] = ping();
- }
-
- // Reject any deltas that are larger than 1 s.d. above the median.
- long median = median(delta);
- long sd = standardDeviation(delta);
-
- // log.debug("median = " + median);
- // log.debug("sd = " + sd);
-
- long[] tempDeltas = new long[n];
- int count = 0;
-
- for (int i = 0; i < n; i++)
- {
- if ((delta[i] <= (median + sd)) && (delta[i] >= (median - sd)))
- {
- tempDeltas[count] = delta[i];
- count++;
- }
- else
- {
- // log.debug("Rejected: " + delta[i]);
- }
- }
-
- System.arraycopy(tempDeltas, 0, delta, 0, count);
-
- // Estimate the delta as the mean of the remaining deltas.
- this.delta += mean(delta);
-
- // Estimate the error as the standard deviation of the remaining deltas.
- this.epsilon = standardDeviation(delta);
-
- // log.debug("this.delta = " + this.delta);
- // log.debug("this.epsilon = " + this.epsilon);
- }
-
- /**
- * Performs a single reference clock request cycle and returns the estimated delta relative to the local clock.
- * This is computed as the half-latency of the requst cycle, plus the reference clock, minus the local clock.
- *
- * @return The estimated clock delta.
- *
- * @throws ClockSynchFailureException If the reference service is not responding.
- */
- protected long ping() throws ClockSynchFailureException
- {
- // log.debug("protected long ping(): called");
-
- try
- {
- byte[] buf = new byte[256];
-
- boolean timedOut = false;
- long start = 0L;
- long refTime = 0L;
- long localTime = 0L;
- long latency = 0L;
- int failCount = 0;
-
- // Keep trying the ping until it gets a response, or 10 tries in a row all time out.
- do
- {
- // Start timing the request latency.
- start = nanoTime();
-
- // Get the reference time.
- DatagramPacket packet =
- new DatagramPacket(buf, buf.length, referenceAddress, UDPClockReference.REFERENCE_PORT);
- socket.send(packet);
- packet = new DatagramPacket(buf, buf.length);
-
- timedOut = false;
-
- try
- {
- socket.receive(packet);
- }
- catch (SocketTimeoutException e)
- {
- timedOut = true;
- failCount++;
-
- continue;
- }
-
- ByteBuffer bbuf = ByteBuffer.wrap(packet.getData());
- refTime = bbuf.getLong();
-
- // Stop timing the request latency.
- localTime = nanoTime();
- latency = localTime - start;
-
- // log.debug("refTime = " + refTime);
- // log.debug("localTime = " + localTime);
- // log.debug("start = " + start);
- // log.debug("latency = " + latency);
- // log.debug("delta = " + ((latency / 2) + (refTime - localTime)));
-
- }
- while (timedOut && (failCount < 10));
-
- // Fail completely if the fail count is too high.
- if (failCount >= 10)
- {
- throw new ClockSynchFailureException("Clock reference not responding.", null);
- }
-
- // Estimate delta as (ref clock + half-latency) - local clock.
- return (latency / 2) + (refTime - localTime);
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Gets the clock delta in nano seconds.
- *
- * @return The clock delta in nano seconds.
- */
- public long getDelta()
- {
- return delta;
- }
-
- /**
- * Gets an estimate of the clock error in nan seconds.
- *
- * @return An estimate of the clock error in nan seconds.
- */
- public long getEpsilon()
- {
- return epsilon;
- }
-
- /**
- * Gets the local clock time with any computed delta added in.
- *
- * @return The local clock time with any computed delta added in.
- */
- public long nanoTime()
- {
- return System.nanoTime() + delta;
- }
-
- /**
- * Computes the median of a series of values.
- *
- * @param values The values.
- *
- * @return The median.
- */
- public static long median(long[] values)
- {
- // log.debug("public static long median(long[] values = " + Arrays.toString(values) + "): called");
-
- long median;
-
- // Order the list of values.
- long[] orderedValues = new long[values.length];
- System.arraycopy(values, 0, orderedValues, 0, values.length);
- Arrays.sort(orderedValues);
-
- // Check if the median is computed from a pair of middle value.
- if ((orderedValues.length % 2) == 0)
- {
- int middle = orderedValues.length / 2;
-
- median = (orderedValues[middle] + orderedValues[middle - 1]) / 2;
- }
- // The median is computed from a single middle value.
- else
- {
- median = orderedValues[orderedValues.length / 2];
- }
-
- // log.debug("median = " + median);
-
- return median;
- }
-
- /**
- * Computes the mean of a series of values.
- *
- * @param values The values.
- *
- * @return The mean.
- */
- public static long mean(long[] values)
- {
- // log.debug("public static long mean(long[] values = " + Arrays.toString(values) + "): called");
-
- long total = 0L;
-
- for (long value : values)
- {
- total += value;
- }
-
- long mean = total / values.length;
-
- // log.debug("mean = " + mean);
-
- return mean;
- }
-
- /**
- * Computes the variance of series of values.
- *
- * @param values The values.
- *
- * @return The variance of the values.
- */
- public static long variance(long[] values)
- {
- // log.debug("public static long variance(long[] values = " + Arrays.toString(values) + "): called");
-
- long mean = mean(values);
-
- long totalVariance = 0;
-
- for (long value : values)
- {
- long diff = (value - mean);
- totalVariance += diff * diff;
- }
-
- long variance = totalVariance / values.length;
-
- // log.debug("variance = " + variance);
-
- return variance;
- }
-
- /**
- * Computes the standard deviation of a series of values.
- *
- * @param values The values.
- *
- * @return The standard deviation.
- */
- public static long standardDeviation(long[] values)
- {
- // log.debug("public static long standardDeviation(long[] values = " + Arrays.toString(values) + "): called");
-
- long sd = Double.valueOf(Math.sqrt(variance(values))).longValue();
-
- // log.debug("sd = " + sd);
-
- return sd;
- }
-
- /**
- * For testing purposes. Supply address of reference clock as arg 1.
- *
- * @param args Address of reference clock as arg 1.
- */
- public static void main(String[] args)
- {
- ParsedProperties options =
- new ParsedProperties(CommandLineParser.processCommandLine(args,
- new CommandLineParser(
- new String[][]
- {
- { "1", "Address of clock reference service.", "address", "true" }
- }), System.getProperties()));
-
- String address = options.getProperty("1");
-
- // Create a clock synchronizer.
- UDPClockSynchronizer clockSyncher = new UDPClockSynchronizer(address);
-
- // Set up a shutdown hook for it.
- Runtime.getRuntime().addShutdownHook(new Thread(new Runnable()
- {
- public void run()
- {
- doSynch = false;
- }
- }));
-
- // Repeat the clock synching until the user kills the progam.
- while (doSynch)
- {
- // Perform a clock clockSynch.
- try
- {
- clockSyncher.synch();
-
- // Print out the clock delta and estimate of the error.
- System.out.println("Delta = " + clockSyncher.getDelta());
- System.out.println("Epsilon = " + clockSyncher.getEpsilon());
-
- try
- {
- Thread.sleep(250);
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted status and terminate the loop.
- Thread.currentThread().interrupt();
- doSynch = false;
- }
- }
- // Terminate if the reference time service is unavailable.
- catch (ClockSynchFailureException e)
- {
- doSynch = false;
- }
- }
- }
-}
-
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedCircuitImpl.java b/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedCircuitImpl.java
deleted file mode 100644
index 6c950fc307..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedCircuitImpl.java
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedcircuit;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.TimingController;
-import org.apache.qpid.junit.extensions.TimingControllerAware;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Circuit;
-import org.apache.qpid.test.framework.Publisher;
-import org.apache.qpid.test.framework.Receiver;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * DistributedCircuitImpl is a distributed implementation of the test {@link Circuit}. Many publishers and receivers
- * accross multiple machines may be combined to form a single test circuit. The test circuit extracts reports from
- * all of its publishers and receivers, and applies its assertions to these reports.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the publishing and receiving ends of a test messaging circuit.
- * <tr><td> Start the circuit running.
- * <tr><td> Close the circuit down.
- * <tr><td> Take a reading of the circuits state.
- * <tr><td> Apply assertions against the circuits state.
- * <tr><td> Send test messages over the circuit.
- * <tr><td> Perform the default test procedue on the circuit.
- * </table>
- *
- * @todo There is a short pause after receiving sender reports before asking for receiver reports, because receivers may
- * not have finished receiving all their test messages before the report request arrives. This is going to be a
- * problem for taking test timings and needs to be eliminiated. Suggested solution: have receiver send back reports
- * asynchronously, on test batch size boundaries, and do so automatically rather than having to have the report
- * request sent to them. Number each test run, or otherwise uniquely identify it, when a receiver does not get
- * any more messages on a test run for more than a timeout, it can assume the test is complete and send a final
- * report. On the coordinator end a future will need to be created to wait for all final reports to come in, and
- * to register results and timings for the test. This must work in such a way that a new test cycle can be started
- * without waiting for the results of the old one to come in.
- *
- * @todo Add in setting of timing controller, from timing aware test cases.
- */
-public class DistributedCircuitImpl implements Circuit, TimingControllerAware
-{
- /** Used for debugging purposes. */
- private static final Logger log = Logger.getLogger(DistributedCircuitImpl.class);
-
- /** Holds the conversation factory over which to coordinate the test. */
- protected ConversationFactory conversationFactory;
-
- /** Holds the controlSession over which to hold the control conversation. */
- protected Session controlSession;
-
- /** Holds the sender nodes in the test circuit. */
- protected List<TestClientDetails> senders;
-
- /** Holds the receiver nodes in the test circuit. */
- protected List<TestClientDetails> receivers;
-
- /** Holds the sender control conversations. */
- protected ConversationFactory.Conversation[] senderConversation;
-
- /** Holds the receiver control conversations. */
- protected ConversationFactory.Conversation[] receiverConversation;
-
- /** Holds the control topics for the senders in the test circuit. */
- protected Destination[] senderControlTopic;
-
- /** Holds the control topics for the receivers in the test circuit. */
- protected Destination[] receiverControlTopic;
-
- /** Holds the number of messages to send per test run. */
- protected int numMessages;
-
- /**
- * Holds the timing controller for the circuit. This is used to log test times asynchronously, when reciever nodes
- * return their reports after senders have completed a test case.
- */
- TimingController timingController;
-
- /**
- * Creates a distributed test circuit on the specified senders and receivers.
- *
- * @param session The controlSession for all control conversations.
- * @param senders The senders.
- * @param receivers The receivers.
- * @param senderConversation A control conversation with the senders.
- * @param receiverConversation A control conversation with the receivers.
- * @param senderControlTopic The senders control topic.
- * @param receiverControlTopic The receivers control topic.
- */
- protected DistributedCircuitImpl(Session session, List<TestClientDetails> senders, List<TestClientDetails> receivers,
- ConversationFactory.Conversation[] senderConversation, ConversationFactory.Conversation[] receiverConversation,
- Destination[] senderControlTopic, Destination[] receiverControlTopic)
- {
- this.controlSession = session;
- this.senders = senders;
- this.receivers = receivers;
- this.senderConversation = senderConversation;
- this.receiverConversation = receiverConversation;
- this.senderControlTopic = senderControlTopic;
- this.receiverControlTopic = receiverControlTopic;
- }
-
- /**
- * Creates a distributed test circuit from the specified test parameters, on the senders and receivers
- * given.
- *
- * @param testProps The test parameters.
- * @param senders The sender ends in the test circuit.
- * @param receivers The receiver ends in the test circuit.
- * @param conversationFactory A conversation factory for creating the control conversations with senders and receivers.
- *
- * @return A connected and ready to start, test circuit.
- */
- public static Circuit createCircuit(ParsedProperties testProps, List<TestClientDetails> senders,
- List<TestClientDetails> receivers, ConversationFactory conversationFactory)
- {
- log.debug("public static Circuit createCircuit(ParsedProperties testProps, List<TestClientDetails> senders, "
- + " List<TestClientDetails> receivers, ConversationFactory conversationFactory)");
-
- try
- {
- Session session = conversationFactory.getSession();
-
- // Create control conversations with each of the senders.
- ConversationFactory.Conversation[] senderConversation = new ConversationFactory.Conversation[senders.size()];
- Destination[] senderControlTopic = new Destination[senders.size()];
-
- for (int i = 0; i < senders.size(); i++)
- {
- TestClientDetails sender = senders.get(i);
-
- senderControlTopic[i] = session.createTopic(sender.privateControlKey);
- senderConversation[i] = conversationFactory.startConversation();
- }
-
- log.debug("Sender conversations created.");
-
- // Create control conversations with each of the receivers.
- ConversationFactory.Conversation[] receiverConversation = new ConversationFactory.Conversation[receivers.size()];
- Destination[] receiverControlTopic = new Destination[receivers.size()];
-
- for (int i = 0; i < receivers.size(); i++)
- {
- TestClientDetails receiver = receivers.get(i);
-
- receiverControlTopic[i] = session.createTopic(receiver.privateControlKey);
- receiverConversation[i] = conversationFactory.startConversation();
- }
-
- log.debug("Receiver conversations created.");
-
- // Assign the sender role to each of the sending test clients.
- for (int i = 0; i < senders.size(); i++)
- {
- TestClientDetails sender = senders.get(i);
-
- Message assignSender = conversationFactory.getSession().createMessage();
- TestUtils.setPropertiesOnMessage(assignSender, testProps);
- assignSender.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE");
- assignSender.setStringProperty("ROLE", "SENDER");
-
- senderConversation[i].send(senderControlTopic[i], assignSender);
- }
-
- log.debug("Sender role assignments sent.");
-
- // Assign the receivers role to each of the receiving test clients.
- for (int i = 0; i < receivers.size(); i++)
- {
- TestClientDetails receiver = receivers.get(i);
-
- Message assignReceiver = session.createMessage();
- TestUtils.setPropertiesOnMessage(assignReceiver, testProps);
- assignReceiver.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE");
- assignReceiver.setStringProperty("ROLE", "RECEIVER");
-
- receiverConversation[i].send(receiverControlTopic[i], assignReceiver);
- }
-
- log.debug("Receiver role assignments sent.");
-
- // Wait for the senders and receivers to confirm their roles.
- for (int i = 0; i < senders.size(); i++)
- {
- senderConversation[i].receive();
- }
-
- log.debug("Got all sender role confirmations");
-
- for (int i = 0; i < receivers.size(); i++)
- {
- receiverConversation[i].receive();
- }
-
- log.debug("Got all receiver role confirmations");
-
- // Package everything up as a circuit.
- return new DistributedCircuitImpl(session, senders, receivers, senderConversation, receiverConversation,
- senderControlTopic, receiverControlTopic);
- }
- catch (JMSException e)
- {
- throw new RuntimeException("JMSException not handled.");
- }
- }
-
- /**
- * Used by tests cases that can supply a {@link org.apache.qpid.junit.extensions.TimingController} to set the
- * controller on an aware test.
- *
- * @param controller The timing controller.
- */
- public void setTimingController(TimingController controller)
- {
- this.timingController = controller;
- }
-
- /**
- * Gets the interface on the publishing end of the circuit.
- *
- * @return The publishing end of the circuit.
- */
- public Publisher getPublisher()
- {
- throw new RuntimeException("Not Implemented.");
- }
-
- /**
- * Gets the interface on the receiving end of the circuit.
- *
- * @return The receiving end of the circuit.
- */
- public Receiver getReceiver()
- {
- throw new RuntimeException("Not Implemented.");
- }
-
- /**
- * Connects and starts the circuit. After this method is called the circuit is ready to send messages.
- */
- public void start()
- {
- log.debug("public void start(): called");
-
- try
- {
- // Start the test on each of the senders.
- Message start = controlSession.createMessage();
- start.setStringProperty("CONTROL_TYPE", "START");
- start.setIntProperty("MESSAGE_COUNT", numMessages);
-
- for (int i = 0; i < senders.size(); i++)
- {
- senderConversation[i].send(senderControlTopic[i], start);
- }
-
- log.debug("All senders told to start their tests.");
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Unhandled JMSException.", e);
- }
- }
-
- /**
- * Checks the test circuit. The effect of this is to gather the circuits state, for both ends of the circuit,
- * into a report, against which assertions may be checked.
- *
- * @todo Replace the asynch receiver report thread with a choice of direct or asynch executor, so that asynch
- * or synch logging of test timings is optional. Also need to provide an onMessage method that is capable
- * of receiving timing reports that receivers will generate during an ongoing test, on the test sample
- * size boundaries. The message timing logging code should be factored out as a common method that can
- * be called in response to the final report responses, or the onMessage method. Another alternative is
- * to abandon the final report request altogether and just use the onMessage method? I think the two
- * differ though, as the final report is used to apply assertions, and the ongoing report is just for
- * periodic timing results... In which case, maybe there needs to be a way for the onMessage method
- * to process just some of the incoming messages, and forward the rest on to the conversion helper, as
- * a sort of pre-conversation helper filter? Make conversation expose its onMessage method (it should
- * already) and allow another delivery thread to filter the incoming messages to the conversation.
- */
- public void check()
- {
- log.debug("public void check(): called");
-
- try
- {
- // Wait for all the test senders to return their reports.
- for (int i = 0; i < senders.size(); i++)
- {
- Message senderReport = senderConversation[i].receive();
- log.debug("Sender " + senderReport.getStringProperty("CLIENT_NAME") + " reports message count: "
- + senderReport.getIntProperty("MESSAGE_COUNT"));
- log.debug("Sender " + senderReport.getStringProperty("CLIENT_NAME") + " reports message time: "
- + senderReport.getLongProperty("TEST_TIME"));
- }
-
- log.debug("Got all sender test reports.");
-
- // Apply sender assertions to pass/fail the tests.
-
- // Inject a short pause to give the receivers time to finish receiving their test messages.
- TestUtils.pause(500);
-
- // Ask the receivers for their reports.
- Message statusRequest = controlSession.createMessage();
- statusRequest.setStringProperty("CONTROL_TYPE", "STATUS_REQUEST");
-
- for (int i = 0; i < receivers.size(); i++)
- {
- receiverConversation[i].send(receiverControlTopic[i], statusRequest);
- }
-
- log.debug("All receiver test reports requested.");
-
- // Wait for all receiver reports to come in, but do so asynchronously.
- Runnable gatherAllReceiverReports =
- new Runnable()
- {
- public void run()
- {
- try
- {
- // Wait for all the receivers to send their reports.
- for (int i = 0; i < receivers.size(); i++)
- {
- Message receiverReport = receiverConversation[i].receive();
-
- String clientName = receiverReport.getStringProperty("CLIENT_NAME");
- int messageCount = receiverReport.getIntProperty("MESSAGE_COUNT");
- long testTime = receiverReport.getLongProperty("TEST_TIME");
-
- log.debug("Receiver " + clientName + " reports message count: " + messageCount);
- log.debug("Receiver " + receiverReport.getStringProperty("CLIENT_NAME")
- + " reports message time: " + testTime);
-
- // Apply receiver assertions to pass/fail the tests.
-
- // Log the test timings on the asynchronous test timing controller.
- /*try
- {
- timingController.completeTest(true, messageCount, testTime);
- }
- // The timing controll can throw InterruptedException is the current test is to be
- // interrupted.
- catch (InterruptedException e)
- {
- e.printStackTrace();
- }*/
- }
-
- log.debug("All receiver test reports received.");
- }
- catch (JMSException e)
- {
- throw new RuntimeException(e);
- }
- }
- };
-
- Thread receiverReportsThread = new Thread(gatherAllReceiverReports);
- receiverReportsThread.start();
-
- // return new Message[] { senderReport, receiverReport };
-
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Unhandled JMSException.", e);
- }
- }
-
- /**
- * Closes the circuit. All associated resources are closed.
- */
- public void close()
- {
- log.debug("public void close(): called");
-
- // End the current test on all senders and receivers.
- }
-
- /**
- * Applies a list of assertions against the test circuit. The {@link #check()} method should be called before doing
- * this, to ensure that the circuit has gathered its state into a report to assert against.
- *
- * @param assertions The list of assertions to apply.
- *
- * @return Any assertions that failed.
- */
- public List<Assertion> applyAssertions(List<Assertion> assertions)
- {
- log.debug("public List<Assertion> applyAssertions(List<Assertion> assertions = " + assertions + "): called");
-
- List<Assertion> failures = new LinkedList<Assertion>();
-
- for (Assertion assertion : assertions)
- {
- if (!assertion.apply())
- {
- failures.add(assertion);
- }
- }
-
- return failures;
- }
-
- /**
- * Runs the default test procedure against the circuit, and checks that all of the specified assertions hold.
- *
- * @param numMessages The number of messages to send using the default test procedure.
- * @param assertions The list of assertions to apply.
- *
- * @return Any assertions that failed.
- *
- * @todo From check onwards needs to be handled as a future. The future must call back onto the test case to
- * report results asynchronously.
- */
- public List<Assertion> test(int numMessages, List<Assertion> assertions)
- {
- log.debug("public List<Assertion> test(int numMessages = " + numMessages + ", List<Assertion> assertions = "
- + assertions + "): called");
-
- // Keep the number of messages to send per test run, where the send method can reference it.
- this.numMessages = numMessages;
-
- // Start the test running on all sender circuit ends.
- start();
-
- // Request status reports to be handed in.
- check();
-
- // Assert conditions on the publishing end of the circuit.
- // Assert conditions on the receiving end of the circuit.
- List<Assertion> failures = applyAssertions(assertions);
-
- // Close the circuit ending the current test case.
- close();
-
- // Pass with no failed assertions or fail with a list of failed assertions.
- return failures;
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedPublisherImpl.java b/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedPublisherImpl.java
deleted file mode 100644
index 130e908b0e..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedPublisherImpl.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedcircuit;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Publisher;
-
-/**
- * DistributedPublisherImpl represents the status of the publishing side of a test circuit. Its main purpose is to
- * provide assertions that can be applied to verify the behaviour of a non-local publisher.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide assertion that the publishers received no exceptions.
- * <tr><td> Provide assertion that the publishers received a no consumers error code on every message.
- * <tr><td> Provide assertion that the publishers received a no route error code on every message.
- * </table>
- */
-public class DistributedPublisherImpl implements Publisher
-{
- /**
- * Provides an assertion that the publisher encountered no exceptions.
- *
- * @return An assertion that the publisher encountered no exceptions.
- * @param testProps
- */
- public Assertion noExceptionsAssertion(ParsedProperties testProps)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the publisher got a no consumers exception on every message.
- *
- * @return An assertion that the publisher got a no consumers exception on every message.
- */
- public Assertion noConsumersAssertion()
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the publisher got a no rout exception on every message.
- *
- * @return An assertion that the publisher got a no rout exception on every message.
- */
- public Assertion noRouteAssertion()
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the AMQP channel was forcibly closed by an error condition.
- *
- * @param testProps The test configuration properties.
- * @return An assertion that the AMQP channel was forcibly closed by an error condition.
- */
- public Assertion channelClosedAssertion(ParsedProperties testProps)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the publisher got a given exception during the test.
- *
- * @param testProps The test configuration properties.
- * @param exceptionClass The exception class to check for.
- * @return An assertion that the publisher got a given exception during the test.
- */
- public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass)
- {
- throw new RuntimeException("Not implemented.");
- }
-}
-
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedReceiverImpl.java b/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedReceiverImpl.java
deleted file mode 100644
index 4b801e7b66..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedReceiverImpl.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedcircuit;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Receiver;
-
-/**
- * DistributedReceiverImpl represents the status of the receiving side of a test circuit. Its main purpose is to
- * provide assertions that can be applied to verify the behaviour of a non-local receiver.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide assertion that the receivers received no exceptions.
- * <tr><td> Provide assertion that the receivers received all test messages sent to it.
- * </table>
- */
-public class DistributedReceiverImpl implements Receiver
-{
- /**
- * Provides an assertion that the receivers encountered no exceptions.
- *
- * @return An assertion that the receivers encountered no exceptions.
- * @param testProps
- */
- public Assertion noExceptionsAssertion(ParsedProperties testProps)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the receivers got all messages that were sent to it.
- *
- * @return An assertion that the receivers got all messages that were sent to it.
- * @param testProps
- */
- public Assertion allMessagesReceivedAssertion(ParsedProperties testProps)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the receivers got none of the messages that were sent to it.
- *
- * @return An assertion that the receivers got none of the messages that were sent to it.
- * @param testProps
- */
- public Assertion noMessagesReceivedAssertion(ParsedProperties testProps)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the AMQP channel was forcibly closed by an error condition.
- *
- * @param testProps The test configuration properties.
- * @return An assertion that the AMQP channel was forcibly closed by an error condition.
- */
- public Assertion channelClosedAssertion(ParsedProperties testProps)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the receiver got a given exception during the test.
- *
- * @param testProps
- *@param exceptionClass The exception class to check for. @return An assertion that the receiver got a given exception during the test.
- */
- public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass)
- {
- throw new RuntimeException("Not implemented.");
- }
-}
-
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/TestClientCircuitEnd.java b/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/TestClientCircuitEnd.java
deleted file mode 100644
index 09bcf24da5..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/TestClientCircuitEnd.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedcircuit;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-import org.apache.qpid.test.framework.CircuitEnd;
-import org.apache.qpid.test.framework.ExceptionMonitor;
-import org.apache.qpid.test.framework.LocalCircuitFactory;
-import org.apache.qpid.test.framework.MessageMonitor;
-import org.apache.qpid.test.framework.MessagingTestConfigProperties;
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedtesting.TestClientControlledTest;
-
-import javax.jms.Connection;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-/**
- * A TestClientCircuitEnd is a {@link CircuitEnd} that may be controlled from a
- * {@link org.apache.qpid.test.framework.distributedtesting.TestClient}, and that forms a single publishing or
- * receiving end point in a distributed test {@link org.apache.qpid.test.framework.Circuit}.
- *
- * <p/>When operating in the SENDER role, this circuit end is capable of acting as part of the default circuit test
- * procedure (described in the class comment for {@link org.apache.qpid.test.framework.Circuit}). That is, it will
- * send the number of test messages required, using the test configuration parameters given in the test invite, and
- * return a report on its activities to the circuit controller.
- *
- * <p/>When operation in the RECEIVER role, this circuit end acts as part of the default circuit test procedure. It will
- * receive test messages, on the setup specified in the test configuration parameters, and keep count of the messages
- * received, and time taken to receive them. When requested by the circuit controller to provide a report, it will
- * return this report of its activities.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a message producer for sending messages.
- * <td> {@link CircuitEnd}, {@link LocalCircuitFactory}, {@link TestUtils}
- * <tr><td> Provide a message consumer for receiving messages.
- * <td> {@link CircuitEnd}, {@link LocalCircuitFactory}, {@link TestUtils}
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters. <td> {@link MessagingTestConfigProperties}
- * <tr><td> Adapt to assigned roles. <td> {@link TestClientControlledTest.Roles}
- * <tr><td> Perform test case actions. <td> {@link MessageMonitor}
- * <tr><td> Generate test reports. <td> {@link MessageMonitor}
- * </table>
- */
-public class TestClientCircuitEnd implements CircuitEnd, TestClientControlledTest
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestClientCircuitEnd.class);
-
- /** Holds the test parameters. */
- ParsedProperties testProps;
-
- /** The number of test messages to send. */
- private int numMessages;
-
- /** The role to be played by the test. */
- private Roles role;
-
- /** The connection to send the test messages on. */
- private Connection connection;
-
- /** Holds the circuit end for this test. */
- CircuitEnd circuitEnd;
-
- /**
- * Holds a message monitor for this circuit end, either the monitor on the consumer when in RECEIVER more, or
- * a monitor updated on every message sent, when acting as a SENDER.
- */
- MessageMonitor messageMonitor;
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- return "DEFAULT_CIRCUIT_TEST";
- }
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException
- {
- log.debug("public boolean acceptInvite(Message inviteMessage): called");
-
- // Populate the test parameters from the invitation.
- testProps = TestContextProperties.getInstance(MessagingTestConfigProperties.defaults);
-
- for (Object key : testProps.keySet())
- {
- String propName = (String) key;
-
- // If the test parameters is overridden by the invitation, use it instead.
- String inviteValue = inviteMessage.getStringProperty(propName);
-
- if (inviteValue != null)
- {
- testProps.setProperty(propName, inviteValue);
- log.debug("Test invite supplied override to " + propName + " of " + inviteValue);
- }
-
- }
-
- // Accept the invitation.
- return true;
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role, Message assignRoleMessage): called");
-
- // Take note of the role to be played.
- this.role = role;
-
- // Extract and retain the test parameters.
- numMessages = 1; // assignRoleMessage.getIntProperty("NUM_MESSAGES");
-
- // Connect using the test parameters.
- connection = TestUtils.createConnection(testProps);
-
- // Create a circuit end that matches the assigned role and test parameters.
- LocalCircuitFactory circuitFactory = new LocalCircuitFactory();
-
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a message producer if so.
- case SENDER:
-
- // Set up the publisher.
- circuitEnd = circuitFactory.createPublisherCircuitEnd(connection, testProps, 0L);
-
- // Create a custom message monitor that will be updated on every message sent.
- messageMonitor = new MessageMonitor();
-
- break;
-
- // Otherwise the receivers role is being assigned, so set this up to listen for messages.
- case RECEIVER:
-
- // Set up the receiver.
- circuitEnd = circuitFactory.createReceiverCircuitEnd(connection, testProps, 0L);
-
- // Use the message monitor from the consumer for stats.
- messageMonitor = getMessageMonitor();
-
- break;
- }
-
- // Reset all messaging stats for the report.
- messageMonitor.reset();
-
- connection.start();
- }
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- *
- * @todo Add round robin on destinations where multiple destinations being used.
- *
- * @todo Add rate limiting when rate limit specified on publishers.
- *
- * @todo Add Max pending message size protection. The receiver will have to send back some acks once in a while,
- * to notify the publisher that its messages are being consumed. This makes the safety valve harder to
- * implement than in the single VM case. For example, if the limit is 1000 messages, might want to get back
- * an ack every 500, to notify the publisher that it can keep sending. What about pub/sub tests? Will it be
- * necessary to wait for an ack from every receiver? This will have the effect of rate limiting to slow
- * consumers too.
- *
- * @todo Add commits on every commit batch size boundary.
- */
- public void start(int numMessages) throws JMSException
- {
- log.debug("public void start(): called");
-
- // If in the SENDER role, send the specified number of test messages to the circuit destinations.
- if (role.equals(Roles.SENDER))
- {
- Message testMessage = getSession().createMessage();
-
- for (int i = 0; i < numMessages; i++)
- {
- getProducer().send(testMessage);
-
- // Increment the message count and timings.
- messageMonitor.onMessage(testMessage);
- }
- }
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- Message report = session.createMessage();
- report.setStringProperty("CONTROL_TYPE", "REPORT");
-
- // Add the count of messages sent/received to the report.
- report.setIntProperty("MESSAGE_COUNT", messageMonitor.getNumMessage());
-
- // Add the time to send/receive messages to the report.
- report.setLongProperty("TEST_TIME", messageMonitor.getTime());
-
- // Add any exceptions detected to the report.
-
- return report;
- }
-
- /**
- * Gets the message producer at this circuit end point.
- *
- * @return The message producer at with this circuit end point.
- */
- public MessageProducer getProducer()
- {
- return circuitEnd.getProducer();
- }
-
- /**
- * Gets the message consumer at this circuit end point.
- *
- * @return The message consumer at this circuit end point.
- */
- public MessageConsumer getConsumer()
- {
- return circuitEnd.getConsumer();
- }
-
- /**
- * Send the specified message over the producer at this end point.
- *
- * @param message The message to send.
- *
- * @throws JMSException Any JMS exception occuring during the send is allowed to fall through.
- */
- public void send(Message message) throws JMSException
- {
- // Send the message on the circuit ends producer.
- circuitEnd.send(message);
- }
-
- /**
- * Gets the JMS Session associated with this circuit end point.
- *
- * @return The JMS Session associated with this circuit end point.
- */
- public Session getSession()
- {
- return circuitEnd.getSession();
- }
-
- /**
- * Closes the message producers and consumers and the sessions, associated with this circuit end point.
- *
- * @throws JMSException Any JMSExceptions occurring during the close are allowed to fall through.
- */
- public void close() throws JMSException
- {
- // Close the producer and consumer.
- circuitEnd.close();
- }
-
- /**
- * Returns the message monitor for reporting on received messages on this circuit end.
- *
- * @return The message monitor for this circuit end.
- */
- public MessageMonitor getMessageMonitor()
- {
- return circuitEnd.getMessageMonitor();
- }
-
- /**
- * Returns the exception monitor for reporting on exceptions received on this circuit end.
- *
- * @return The exception monitor for this circuit end.
- */
- public ExceptionMonitor getExceptionMonitor()
- {
- return circuitEnd.getExceptionMonitor();
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/Coordinator.java b/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/Coordinator.java
deleted file mode 100644
index e07b141cb5..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/Coordinator.java
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-import org.apache.log4j.Logger;
-import org.apache.log4j.NDC;
-
-import org.apache.qpid.junit.extensions.TKTestRunner;
-import org.apache.qpid.junit.extensions.WrappedSuiteTestDecorator;
-import org.apache.qpid.junit.extensions.util.CommandLineParser;
-import org.apache.qpid.junit.extensions.util.MathUtils;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-import org.apache.qpid.test.framework.MessagingTestConfigProperties;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.clocksynch.UDPClockReference;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.LinkedBlockingQueue;
-
-/**
- * <p/>Implements the coordinator client described in the interop testing specification
- * (http://cwiki.apache.org/confluence/display/qpid/Interop+Testing+Specification). This coordinator is built on
- * top of the JUnit testing framework.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Find out what test clients are available. <td> {@link ConversationFactory}
- * <tr><td> Decorate available tests to run on all available clients. <td> {@link DistributedTestDecorator}
- * <tr><td> Attach XML test result logger.
- * <tr><td> Terminate the interop testing framework.
- * </table>
- *
- * @todo Should accumulate failures over all tests, and return with success or fail code based on all results. May need
- * to write a special TestResult to do this properly. At the moment only the last one used will be tested for
- * errors, as the start method creates a fresh one for each test case run.
- */
-public class Coordinator extends TKTestRunner
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(Coordinator.class);
-
- /** Used for reporting to the console. */
- private static final Logger console = Logger.getLogger("CONSOLE");
-
- /** Defines the possible distributed test engines available to run coordinated test cases with. */
- public enum TestEngine
- {
- /** Specifies the interop test engine. This tests all available clients in pairs. */
- INTEROP,
-
- /** Specifies the fanout test engine. This sets up one publisher role, and many reciever roles. */
- FANOUT
- }
-
- /**
- * Holds the test context properties that provides the default test parameters, plus command line overrides.
- * This is initialized with the default test parameters, to which command line overrides may be applied.
- */
- protected static ParsedProperties testContextProperties =
- TestContextProperties.getInstance(MessagingTestConfigProperties.defaults);
-
- /** Holds the URL of the broker to coordinate the tests on. */
- protected String brokerUrl;
-
- /** Holds the virtual host to coordinate the tests on. If <tt>null</tt>, then the default virtual host is used. */
- protected String virtualHost;
-
- /** Holds the list of all clients that enlisted, when the compulsory invite was issued. */
- protected Set<TestClientDetails> enlistedClients = new HashSet<TestClientDetails>();
-
- /** Holds the conversation helper for the control conversation. */
- protected ConversationFactory conversationFactory;
-
- /** Holds the connection that the coordinating messages are sent over. */
- protected Connection connection;
-
- /** Holds the path of the directory to output test results too, if one is defined. */
- protected String reportDir;
-
- /** Holds the coordinating test engine type to run the tests through. */
- protected TestEngine engine;
-
- /** Flag that indicates that all test clients should be terminated upon completion of the test cases. */
- protected boolean terminate;
-
- /**
- * Creates an interop test coordinator on the specified broker and virtual host.
- *
- * @param repetitions The number of times to repeat the test, or test batch size.
- * @param duration The length of time to run the tests for. -1 means no duration has been set.
- * @param threads The concurrency levels to ramp up to.
- * @param delay A delay in milliseconds between test runs.
- * @param params The sets of 'size' parameters to pass to test.
- * @param testCaseName The name of the test case to run.
- * @param reportDir The directory to output the test results to.
- * @param runName The name of the test run; used to name the output file.
- * @param verbose Whether to print comments during test run.
- * @param brokerUrl The URL of the broker to connect to.
- * @param virtualHost The virtual host to run all tests on. Optional, may be <tt>null</tt>.
- * @param engine The distributed test engine type to run the tests with.
- * @param terminate <tt>true</tt> if test client nodes should be terminated at the end of the tests.
- * @param csv <tt>true</tt> if the CSV results listener should be attached.
- * @param xml <tt>true</tt> if the XML results listener should be attached.
- * @param decoratorFactories List of factories for user specified decorators.
- */
- public Coordinator(Integer repetitions, Long duration, int[] threads, int delay, int[] params, String testCaseName,
- String reportDir, String runName, boolean verbose, String brokerUrl, String virtualHost, TestEngine engine,
- boolean terminate, boolean csv, boolean xml, List<TestDecoratorFactory> decoratorFactories)
- {
- super(repetitions, duration, threads, delay, params, testCaseName, reportDir, runName, csv, xml, decoratorFactories);
-
- log.debug("public Coordinator(Integer repetitions = " + repetitions + " , Long duration = " + duration
- + ", int[] threads = " + Arrays.toString(threads) + ", int delay = " + delay + ", int[] params = "
- + Arrays.toString(params) + ", String testCaseName = " + testCaseName + ", String reportDir = " + reportDir
- + ", String runName = " + runName + ", boolean verbose = " + verbose + ", String brokerUrl = " + brokerUrl
- + ", String virtualHost =" + virtualHost + ", TestEngine engine = " + engine + ", boolean terminate = "
- + terminate + ", boolean csv = " + csv + ", boolean xml = " + xml + "): called");
-
- // Retain the connection parameters.
- this.brokerUrl = brokerUrl;
- this.virtualHost = virtualHost;
- this.reportDir = reportDir;
- this.engine = engine;
- this.terminate = terminate;
- }
-
- /**
- * The entry point for the interop test coordinator. This client accepts the following command line arguments:
- *
- * <p/><table>
- * <tr><td> -b <td> The broker URL. <td> Mandatory.
- * <tr><td> -h <td> The virtual host. <td> Optional.
- * <tr><td> -o <td> The directory to output test results to. <td> Optional.
- * <tr><td> -e <td> The type of test distribution engine to use. <td> Optional. One of: interop, fanout.
- * <tr><td> ... <td> Free arguments. The distributed test cases to run.
- * <td> Mandatory. At least one must be defined.
- * <tr><td> name=value <td> Trailing argument define name/value pairs. Added to the test contenxt properties.
- * <td> Optional.
- * </table>
- *
- * @param args The command line arguments.
- */
- public static void main(String[] args)
- {
- NDC.push("coordinator");
- log.debug("public static void main(String[] args = " + Arrays.toString(args) + "): called");
- console.info("Qpid Distributed Test Coordinator.");
-
- // Override the default broker url to be localhost:5672.
- testContextProperties.setProperty(MessagingTestConfigProperties.BROKER_PROPNAME, "tcp://localhost:5672");
-
- try
- {
- // Use the command line parser to evaluate the command line with standard handling behaviour (print errors
- // and usage then exist if there are errors).
- // Any options and trailing name=value pairs are also injected into the test context properties object,
- // to override any defaults that may have been set up.
- ParsedProperties options =
- new ParsedProperties(CommandLineParser.processCommandLine(args,
- new CommandLineParser(
- new String[][]
- {
- { "b", "The broker URL.", "broker", "false" },
- { "h", "The virtual host to use.", "virtual host", "false" },
- { "o", "The name of the directory to output test timings to.", "dir", "false" },
- {
- "e", "The test execution engine to use. Default is interop.", "engine", "interop",
- "^interop$|^fanout$", "true"
- },
- { "t", "Terminate test clients on completion of tests.", null, "false" },
- { "-csv", "Output test results in CSV format.", null, "false" },
- { "-xml", "Output test results in XML format.", null, "false" },
- {
- "-trefaddr", "To specify an alternative to hostname for time singal reference.",
- "address", "false"
- },
- {
- "c", "The number of tests to run concurrently.", "num", "false",
- MathUtils.SEQUENCE_REGEXP
- },
- { "r", "The number of times to repeat each test.", "num", "false" },
- {
- "d", "The length of time to run the tests for.", "duration", "false",
- MathUtils.DURATION_REGEXP
- },
- {
- "f", "The maximum rate to call the tests at.", "frequency", "false",
- "^([1-9][0-9]*)/([1-9][0-9]*)$"
- },
- { "s", "The size parameter to run tests with.", "size", "false", MathUtils.SEQUENCE_REGEXP },
- { "v", "Verbose mode.", null, "false" },
- { "n", "A name for this test run, used to name the output file.", "name", "true" },
- {
- "X:decorators", "A list of additional test decorators to wrap the tests in.",
- "\"class.name[:class.name]*\"", "false"
- }
- }), testContextProperties));
-
- // Extract the command line options.
- String brokerUrl = options.getProperty("b");
- String virtualHost = options.getProperty("h");
- String reportDir = options.getProperty("o");
- reportDir = (reportDir == null) ? "." : reportDir;
- String testEngine = options.getProperty("e");
- TestEngine engine = "fanout".equals(testEngine) ? TestEngine.FANOUT : TestEngine.INTEROP;
- boolean terminate = options.getPropertyAsBoolean("t");
- boolean csvResults = options.getPropertyAsBoolean("-csv");
- boolean xmlResults = options.getPropertyAsBoolean("-xml");
- String threadsString = options.getProperty("c");
- Integer repetitions = options.getPropertyAsInteger("r");
- String durationString = options.getProperty("d");
- String paramsString = options.getProperty("s");
- boolean verbose = options.getPropertyAsBoolean("v");
- String testRunName = options.getProperty("n");
- String decorators = options.getProperty("X:decorators");
-
- int[] threads = (threadsString == null) ? null : MathUtils.parseSequence(threadsString);
- int[] params = (paramsString == null) ? null : MathUtils.parseSequence(paramsString);
- Long duration = (durationString == null) ? null : MathUtils.parseDuration(durationString);
-
- // If broker or virtual host settings were specified as command line options, override the defaults in the
- // test context properties with them.
-
- // Collection all of the test cases to be run.
- Collection<Class<? extends FrameworkBaseCase>> testCaseClasses =
- new ArrayList<Class<? extends FrameworkBaseCase>>();
-
- // Create a list of test decorator factories for use specified decorators to be applied.
- List<TestDecoratorFactory> decoratorFactories = parseDecorators(decorators);
-
- // Scan for available test cases using a classpath scanner.
- // ClasspathScanner.getMatches(DistributedTestCase.class, "^Test.*", true);
-
- // Hard code the test classes till the classpath scanner is fixed.
- // Collections.addAll(testCaseClasses, InteropTestCase1DummyRun.class, InteropTestCase2BasicP2P.class,
- // InteropTestCase3BasicPubSub.class);
-
- // Parse all of the free arguments as test cases to run.
- for (int i = 1; true; i++)
- {
- String nextFreeArg = options.getProperty(Integer.toString(i));
-
- // Terminate the loop once all free arguments have been consumed.
- if (nextFreeArg == null)
- {
- break;
- }
-
- try
- {
- Class nextClass = Class.forName(nextFreeArg);
-
- if (FrameworkBaseCase.class.isAssignableFrom(nextClass))
- {
- testCaseClasses.add(nextClass);
- console.info("Found distributed test case: " + nextFreeArg);
- }
- }
- catch (ClassNotFoundException e)
- {
- console.info("Unable to instantiate the test case: " + nextFreeArg + ".");
- }
- }
-
- // Check that some test classes were actually found.
- if (testCaseClasses.isEmpty())
- {
- throw new RuntimeException(
- "No test cases implementing FrameworkBaseCase were specified on the command line.");
- }
-
- // Extract the names of all the test classes, to pass to the start method.
- int i = 0;
- String[] testClassNames = new String[testCaseClasses.size()];
-
- for (Class testClass : testCaseClasses)
- {
- testClassNames[i++] = testClass.getName();
- }
-
- // Create a coordinator and begin its test procedure.
- Coordinator coordinator =
- new Coordinator(repetitions, duration, threads, 0, params, null, reportDir, testRunName, verbose, brokerUrl,
- virtualHost, engine, terminate, csvResults, xmlResults, decoratorFactories);
-
- TestResult testResult = coordinator.start(testClassNames);
-
- // Return different error codes, depending on whether or not there were test failures.
- if (testResult.failureCount() > 0)
- {
- System.exit(FAILURE_EXIT);
- }
- else
- {
- System.exit(SUCCESS_EXIT);
- }
- }
- catch (Exception e)
- {
- log.debug("Top level handler caught execption.", e);
- console.info(e.getMessage());
- e.printStackTrace();
- System.exit(EXCEPTION_EXIT);
- }
- }
-
- /**
- * Starts all of the test classes to be run by this coordinator.
- *
- * @param testClassNames An array of all the coordinating test case implementations.
- *
- * @return A JUnit TestResult to run the tests with.
- *
- * @throws Exception Any underlying exceptions are allowed to fall through, and fail the test process.
- */
- public TestResult start(String[] testClassNames) throws Exception
- {
- log.debug("public TestResult start(String[] testClassNames = " + Arrays.toString(testClassNames) + ": called");
-
- // Connect to the broker.
- connection = TestUtils.createConnection(TestContextProperties.getInstance());
- Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- Destination controlTopic = session.createTopic("iop.control");
- Destination responseQueue = session.createQueue("coordinator");
-
- conversationFactory = new ConversationFactory(connection, responseQueue, LinkedBlockingQueue.class);
- ConversationFactory.Conversation conversation = conversationFactory.startConversation();
-
- connection.start();
-
- // Broadcast the compulsory invitation to find out what clients are available to test.
- Message invite = session.createMessage();
- invite.setStringProperty("CONTROL_TYPE", "INVITE");
- invite.setJMSReplyTo(responseQueue);
-
- conversation.send(controlTopic, invite);
-
- // Wait for a short time, to give test clients an opportunity to reply to the invitation.
- Collection<Message> enlists = conversation.receiveAll(0, 500);
- enlistedClients = extractEnlists(enlists);
-
- for (TestClientDetails client : enlistedClients)
- {
- log.debug("Got enlisted test client: " + client);
- console.info("Test node " + client.clientName + " available.");
- }
-
- // Start the clock reference service running.
- UDPClockReference clockReference = new UDPClockReference();
- Thread clockRefThread = new Thread(clockReference);
- registerShutdownHook(clockReference);
- clockRefThread.start();
-
- // Broadcast to all clients to synchronize their clocks against the coordinators clock reference.
- Message clockSynchRequest = session.createMessage();
- clockSynchRequest.setStringProperty("CONTROL_TYPE", "CLOCK_SYNCH");
-
- String localAddress = InetAddress.getByName(InetAddress.getLocalHost().getHostName()).getHostAddress();
- clockSynchRequest.setStringProperty("ADDRESS", localAddress);
-
- conversation.send(controlTopic, clockSynchRequest);
-
- // Run the test in the suite using JUnit.
- TestResult result = null;
-
- for (String testClassName : testClassNames)
- {
- // Record the current test class, so that the test results can be output to a file incorporating this name.
- this.currentTestClassName = testClassName;
-
- result = super.start(new String[] { testClassName });
- }
-
- // At this point in time, all tests have completed. Broadcast the shutdown message, if the termination option
- // was set on the command line.
- if (terminate)
- {
- Message terminate = session.createMessage();
- terminate.setStringProperty("CONTROL_TYPE", "TERMINATE");
-
- conversation.send(controlTopic, terminate);
- }
-
- return result;
- }
-
- /**
- * For a collection of enlist messages, this method pulls out of the client details for the enlisting clients.
- *
- * @param enlists The enlist messages.
- *
- * @return A set of enlisting clients, extracted from the enlist messages.
- *
- * @throws JMSException Any underlying JMSException is allowed to fall through.
- */
- public static Set<TestClientDetails> extractEnlists(Collection<Message> enlists) throws JMSException
- {
- log.debug("public static Set<TestClientDetails> extractEnlists(Collection<Message> enlists = " + enlists
- + "): called");
-
- Set<TestClientDetails> enlistedClients = new HashSet<TestClientDetails>();
-
- // Retain the list of all available clients.
- for (Message enlist : enlists)
- {
- TestClientDetails clientDetails = new TestClientDetails();
- clientDetails.clientName = enlist.getStringProperty("CLIENT_NAME");
- clientDetails.privateControlKey = enlist.getStringProperty("CLIENT_PRIVATE_CONTROL_KEY");
-
- String replyType = enlist.getStringProperty("CONTROL_TYPE");
-
- if ("ENLIST".equals(replyType))
- {
- enlistedClients.add(clientDetails);
- }
- else if ("DECLINE".equals(replyType))
- {
- log.debug("Test client " + clientDetails.clientName + " declined the invite.");
- }
- else
- {
- log.warn("Got an unknown reply type, " + replyType + ", to the invite.");
- }
- }
-
- return enlistedClients;
- }
-
- /**
- * Runs a test or suite of tests, using the super class implemenation. This method wraps the test to be run
- * in any test decorators needed to add in the coordinators ability to invite test clients to participate in
- * tests.
- *
- * @param test The test to run.
- * @param wait Undocumented. Nothing in the JUnit javadocs to say what this is for.
- *
- * @return The results of the test run.
- */
- public TestResult doRun(Test test, boolean wait)
- {
- log.debug("public TestResult doRun(Test \"" + test + "\", boolean " + wait + "): called");
-
- // Wrap all tests in the test suite with WrappedSuiteTestDecorators. This is quite ugly and a bit baffling,
- // but the reason it is done is because the JUnit implementation of TestDecorator has some bugs in it.
- WrappedSuiteTestDecorator targetTest = null;
-
- if (test instanceof TestSuite)
- {
- log.debug("targetTest is a TestSuite");
-
- TestSuite suite = (TestSuite)test;
-
- int numTests = suite.countTestCases();
- log.debug("There are " + numTests + " in the suite.");
-
- for (int i = 0; i < numTests; i++)
- {
- Test nextTest = suite.testAt(i);
- log.debug("suite.testAt(" + i + ") = " + nextTest);
-
- if (nextTest instanceof FrameworkBaseCase)
- {
- log.debug("nextTest is a FrameworkBaseCase");
- }
- }
-
- targetTest = new WrappedSuiteTestDecorator(suite);
- log.debug("Wrapped with a WrappedSuiteTestDecorator.");
- }
-
- // Apply any optional user specified decorators.
- targetTest = applyOptionalUserDecorators(targetTest);
-
- // Wrap the tests in a suitable distributed test decorator, to perform the invite/test cycle.
- targetTest = newTestDecorator(targetTest, enlistedClients, conversationFactory, connection);
-
- // TestSuite suite = new TestSuite();
- // suite.addTest(targetTest);
-
- // Wrap the tests in a scaled test decorator to them them as a 'batch' in one thread.
- // targetTest = new ScaledTestDecorator(targetTest, new int[] { 1 });
-
- return super.doRun(targetTest, wait);
- }
-
- /**
- * Creates a wrapped test decorator, that is capable of inviting enlisted clients to participate in a specified
- * test. This is the test engine that sets up the roles and sequences a distributed test case.
- *
- * @param targetTest The test decorator to wrap.
- * @param enlistedClients The enlisted clients available to run the test.
- * @param conversationFactory The conversation factory used to build conversation helper over the specified connection.
- * @param connection The connection to talk to the enlisted clients over.
- *
- * @return An invititing test decorator, that invites all the enlisted clients to participate in tests, in pairs.
- */
- protected DistributedTestDecorator newTestDecorator(WrappedSuiteTestDecorator targetTest,
- Set<TestClientDetails> enlistedClients, ConversationFactory conversationFactory, Connection connection)
- {
- switch (engine)
- {
- case FANOUT:
- return new FanOutTestDecorator(targetTest, enlistedClients, conversationFactory, connection);
- case INTEROP:
- default:
- return new InteropTestDecorator(targetTest, enlistedClients, conversationFactory, connection);
- }
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/DistributedTestDecorator.java b/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/DistributedTestDecorator.java
deleted file mode 100644
index 49a01d3127..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/DistributedTestDecorator.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import junit.framework.TestResult;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.WrappedSuiteTestDecorator;
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.sequencers.CircuitFactory;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import java.util.Collection;
-import java.util.Set;
-
-/**
- * DistributedTestDecorator is a base class for writing test decorators that invite test clients to participate in
- * distributed test cases. It provides a helper method, {@link #signupClients}, that broadcasts an invitation and
- * returns the set of test clients that are available to particiapte in the test.
- *
- * <p/>When used to wrap a {@link FrameworkBaseCase} test, it replaces the default {@link CircuitFactory} implementations
- * with a suitable circuit factory for distributed tests. Concrete implementations can use this to configure the sending
- * and receiving roles on the test.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Broadcast test invitations and collect enlists. <td> {@link ConversationFactory}.
- * </table>
- */
-public abstract class DistributedTestDecorator extends WrappedSuiteTestDecorator
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(DistributedTestDecorator.class);
-
- /** Holds the contact information for all test clients that are available and that may take part in the test. */
- Set<TestClientDetails> allClients;
-
- /** Holds the conversation helper for the control level conversation for coordinating the test through. */
- ConversationFactory conversationFactory;
-
- /** Holds the connection that the control conversation is held over. */
- Connection connection;
-
- /** Holds the underlying test suite that this decorator wraps. */
- WrappedSuiteTestDecorator testSuite;
-
- /** Holds the control topic, on which test invitations are broadcast. */
- protected Destination controlTopic;
-
- /**
- * Creates a wrapped suite test decorator from another one.
- *
- * @param suite The test suite.
- * @param availableClients The list of all clients that responded to the compulsory invite.
- * @param controlConversation The conversation helper for the control level, test coordination conversation.
- * @param controlConnection The connection that the coordination messages are sent over.
- */
- public DistributedTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> availableClients,
- ConversationFactory controlConversation, Connection controlConnection)
- {
- super(suite);
-
- log.debug("public DistributedTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> allClients = "
- + availableClients + ", ConversationHelper controlConversation = " + controlConversation + "): called");
-
- testSuite = suite;
- allClients = availableClients;
- conversationFactory = controlConversation;
- connection = controlConnection;
-
- // Set up the test control topic.
- try
- {
- controlTopic = conversationFactory.getSession().createTopic("iop.control");
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Unable to create the coordinating control topic to broadcast test invites on.", e);
- }
- }
-
- /**
- * Should run all of the tests in the wrapped test suite.
- *
- * @param testResult The the results object to monitor the test results with.
- */
- public abstract void run(TestResult testResult);
-
- /**
- * Should provide the distributed test sequencer to pass to {@link org.apache.qpid.test.framework.FrameworkBaseCase}
- * tests.
- *
- * @return A distributed test sequencer.
- */
- public abstract CircuitFactory getTestSequencer();
-
- /**
- * Broadcasts an invitation to participate in a coordinating test case to find out what clients are available to
- * run the test case.
- *
- * @param coordTest The coordinating test case to broadcast an inviate for.
- *
- * @return A set of test clients that accepted the invitation.
- */
- protected Set<TestClientDetails> signupClients(FrameworkBaseCase coordTest)
- {
- // Broadcast the invitation to find out what clients are available to test.
- Set<TestClientDetails> enlists;
- try
- {
- Message invite = conversationFactory.getSession().createMessage();
-
- ConversationFactory.Conversation conversation = conversationFactory.startConversation();
-
- invite.setStringProperty("CONTROL_TYPE", "INVITE");
- invite.setStringProperty("TEST_NAME", coordTest.getTestCaseNameForTestMethod(coordTest.getName()));
-
- conversation.send(controlTopic, invite);
-
- // Wait for a short time, to give test clients an opportunity to reply to the invitation.
- Collection<Message> replies = conversation.receiveAll(allClients.size(), 500);
- enlists = Coordinator.extractEnlists(replies);
- }
- catch (JMSException e)
- {
- throw new RuntimeException("There was a JMSException during the invite/enlist conversation.", e);
- }
-
- return enlists;
- }
-
- /**
- * Prints a string summarizing this test decorator, mainly for debugging purposes.
- *
- * @return String representation for debugging purposes.
- */
- public String toString()
- {
- return "DistributedTestDecorator: [ testSuite = " + testSuite + " ]";
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/FanOutTestDecorator.java b/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/FanOutTestDecorator.java
deleted file mode 100644
index 809bb1dd2f..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/FanOutTestDecorator.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.WrappedSuiteTestDecorator;
-import org.apache.qpid.test.framework.DropInTest;
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.sequencers.CircuitFactory;
-import org.apache.qpid.test.framework.sequencers.FanOutCircuitFactory;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageListener;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * FanOutTestDecorator is an {@link DistributedTestDecorator} that runs one test client in the sender role, and the remainder
- * in the receivers role. It also has the capability to listen for new test cases joining the test beyond the initial start
- * point. This feature can be usefull when experimenting with adding more load, in the form of more test clients, to assess
- * its impact on a running test.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Execute coordinated test cases. <td> {@link FrameworkBaseCase}
- * <tr><td> Accept test clients joining a running test.
- * </table>
- */
-public class FanOutTestDecorator extends DistributedTestDecorator implements MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(FanOutTestDecorator.class);
-
- /** Holds the currently running test case. */
- private FrameworkBaseCase currentTest = null;
-
- /**
- * Creates a wrapped suite test decorator from another one.
- *
- * @param suite The test suite.
- * @param availableClients The list of all clients that responded to the compulsory invite.
- * @param controlConversation The conversation helper for the control level, test coordination conversation.
- * @param controlConnection The connection that the coordination messages are sent over.
- */
- public FanOutTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> availableClients,
- ConversationFactory controlConversation, Connection controlConnection)
- {
- super(suite, availableClients, controlConversation, controlConnection);
-
- log.debug("public DistributedTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> allClients = "
- + availableClients + ", ConversationHelper controlConversation = " + controlConversation + "): called");
-
- testSuite = suite;
- allClients = availableClients;
- conversationFactory = controlConversation;
- connection = controlConnection;
-
- // Sign available clients up to the test.
- for (Test test : getAllUnderlyingTests())
- {
- FrameworkBaseCase coordTest = (FrameworkBaseCase) test;
-
- // Get all of the clients able to participate in the test.
- Set<TestClientDetails> enlists = signupClients(coordTest);
-
- // Check that there were some clients available.
- if (enlists.size() == 0)
- {
- throw new RuntimeException("No clients to test with");
- }
-
- // Create a distributed test circuit factory for the test.
- CircuitFactory circuitFactory = getTestSequencer();
-
- // Set up the first client in the sender role, and the remainder in the receivers role.
- Iterator<TestClientDetails> clients = enlists.iterator();
- circuitFactory.setSender(clients.next());
-
- while (clients.hasNext())
- {
- // Set the sending and receiving client details on the test case.
- circuitFactory.setReceiver(clients.next());
- }
-
- // Pass down the connection to hold the coordinating conversation over.
- circuitFactory.setConversationFactory(conversationFactory);
-
- // If the current test case is a drop-in test, set it up as the currently running test for late joiners to
- // add in to. Otherwise the current test field is set to null, to indicate that late joiners are not allowed.
- currentTest = (coordTest instanceof DropInTest) ? coordTest : null;
-
- // Execute the test case.
- coordTest.setCircuitFactory(circuitFactory);
- }
- }
-
- /**
- * Broadcasts a test invitation and accepts enlists from participating clients. The wrapped test cases are run
- * with one test client in the sender role, and the remaining test clients in the receiving role.
- *
- * <p/>Any JMSExceptions during the invite/enlist conversation will be allowed to fall through as runtime
- * exceptions, resulting in the non-completion of the test run.
- *
- * @param testResult The the results object to monitor the test results with.
- *
- * @todo Better error recovery for failure of the invite/enlist conversation could be added.
- */
- public void run(TestResult testResult)
- {
- log.debug("public void run(TestResult testResult): called");
-
- // Listen for late joiners on the control topic.
- try
- {
- conversationFactory.getSession().createConsumer(controlTopic).setMessageListener(this);
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Unable to set up the message listener on the control topic.", e);
- }
-
- // Run all of the test cases in the test suite.
- /*for (Test test : getAllUnderlyingTests())
- {
- FrameworkBaseCase coordTest = (FrameworkBaseCase) test;
-
- // Get all of the clients able to participate in the test.
- Set<TestClientDetails> enlists = signupClients(coordTest);
-
- // Check that there were some clients available.
- if (enlists.size() == 0)
- {
- throw new RuntimeException("No clients to test with");
- }
-
- // Create a distributed test circuit factory for the test.
- CircuitFactory circuitFactory = getTestSequencer();
-
- // Set up the first client in the sender role, and the remainder in the receivers role.
- Iterator<TestClientDetails> clients = enlists.iterator();
- circuitFactory.setSender(clients.next());
-
- while (clients.hasNext())
- {
- // Set the sending and receiving client details on the test case.
- circuitFactory.setReceiver(clients.next());
- }
-
- // Pass down the connection to hold the coordinating conversation over.
- circuitFactory.setConversationFactory(conversationFactory);
-
- // If the current test case is a drop-in test, set it up as the currently running test for late joiners to
- // add in to. Otherwise the current test field is set to null, to indicate that late joiners are not allowed.
- currentTest = (coordTest instanceof DropInTest) ? coordTest : null;
-
- // Execute the test case.
- coordTest.setCircuitFactory(circuitFactory);
- }*/
-
- // Run all of the test cases in the test suite.
- for (Test test : getAllUnderlyingTests())
- {
- FrameworkBaseCase coordTest = (FrameworkBaseCase) test;
-
- coordTest.run(testResult);
-
- currentTest = null;
- }
- }
-
- /**
- * Should provide the distributed test sequencer to pass to {@link org.apache.qpid.test.framework.FrameworkBaseCase}
- * tests.
- *
- * @return A distributed test sequencer.
- */
- public CircuitFactory getTestSequencer()
- {
- return new FanOutCircuitFactory();
- }
-
- /**
- * Listens to incoming messages on the control topic. If the messages are 'join' messages, signalling a new
- * test client wishing to join the current test, then the new client will be added to the current test in the
- * receivers role.
- *
- * @param message The incoming control message.
- */
- public void onMessage(Message message)
- {
- try
- {
- // Check if the message is from a test client attempting to join a running test, and join it to the current
- // test case if so.
- if (message.getStringProperty("CONTROL_TYPE").equals("JOIN") && (currentTest != null))
- {
- ((DropInTest) currentTest).lateJoin(message);
- }
- }
- // There is not a lot can be done with this error, so it is deliberately ignored.
- catch (JMSException e)
- {
- log.debug("Unable to process message:" + message);
- }
- }
-
- /**
- * Prints a string summarizing this test decorator, mainly for debugging purposes.
- *
- * @return String representation for debugging purposes.
- */
- public String toString()
- {
- return "FanOutTestDecorator: [ testSuite = " + testSuite + " ]";
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/InteropTestDecorator.java b/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/InteropTestDecorator.java
deleted file mode 100644
index dd5007090b..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/InteropTestDecorator.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.WrappedSuiteTestDecorator;
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.sequencers.CircuitFactory;
-import org.apache.qpid.test.framework.sequencers.InteropCircuitFactory;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * DistributedTestDecorator is a test decorator, written to implement the interop test specification. Given a list
- * of enlisted test clients, that are available to run interop tests, this decorator invites them to participate
- * in each test in the wrapped test suite. Amongst all the clients that respond to the invite, all pairs are formed,
- * and each pairing (in both directions, but excluding the reflexive pairings) is split into a sender and receivers
- * role and a test case run between them. Any enlisted combinations that do not accept a test invite are automatically
- * failed.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Broadcast test invitations and collect enlists. <td> {@link org.apache.qpid.test.utils.ConversationFactory}.
- * <tr><td> Output test failures for clients unwilling to run the test case. <td> {@link Coordinator}
- * <tr><td> Execute distributed test cases. <td> {@link FrameworkBaseCase}
- * <tr><td> Fail non-participating pairings. <td> {@link OptOutTestCase}
- * </table>
- */
-public class InteropTestDecorator extends DistributedTestDecorator
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(InteropTestDecorator.class);
-
- /**
- * Creates a wrapped suite test decorator from another one.
- *
- * @param suite The test suite.
- * @param availableClients The list of all clients that responded to the compulsory invite.
- * @param controlConversation The conversation helper for the control level, test coordination conversation.
- * @param controlConnection The connection that the coordination messages are sent over.
- */
- public InteropTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> availableClients,
- ConversationFactory controlConversation, Connection controlConnection)
- {
- super(suite, availableClients, controlConversation, controlConnection);
- }
-
- /**
- * Broadcasts a test invitation and accetps enlisting from participating clients. The wrapped test case is
- * then repeated for every combination of test clients (provided the wrapped test case extends
- * {@link FrameworkBaseCase}.
- *
- * <p/>Any JMSExceptions during the invite/enlist conversation will be allowed to fall through as runtime exceptions,
- * resulting in the non-completion of the test run.
- *
- * @todo Better error recovery for failure of the invite/enlist conversation could be added.
- *
- * @param testResult The the results object to monitor the test results with.
- */
- public void run(TestResult testResult)
- {
- log.debug("public void run(TestResult testResult): called");
-
- Collection<Test> tests = testSuite.getAllUnderlyingTests();
-
- for (Test test : getAllUnderlyingTests())
- {
- FrameworkBaseCase coordTest = (FrameworkBaseCase) test;
-
- // Broadcast the invitation to find out what clients are available to test.
- Set<TestClientDetails> enlists = signupClients(coordTest);
-
- // Compare the list of willing clients to the list of all available.
- Set<TestClientDetails> optOuts = new HashSet<TestClientDetails>(allClients);
- optOuts.removeAll(enlists);
-
- // Output test failures for clients that will not particpate in the test.
- Set<List<TestClientDetails>> failPairs = allPairs(optOuts, allClients);
-
- for (List<TestClientDetails> failPair : failPairs)
- {
- // Create a distributed test circuit factory for the test.
- CircuitFactory circuitFactory = getTestSequencer();
-
- // Create an automatic failure test for the opted out test pair.
- FrameworkBaseCase failTest = new OptOutTestCase("testOptOut");
- circuitFactory.setSender(failPair.get(0));
- circuitFactory.setReceiver(failPair.get(1));
- failTest.setCircuitFactory(circuitFactory);
-
- failTest.run(testResult);
- }
-
- // Loop over all combinations of clients, willing to run the test.
- Set<List<TestClientDetails>> enlistedPairs = allPairs(enlists, enlists);
-
- for (List<TestClientDetails> enlistedPair : enlistedPairs)
- {
- // Create a distributed test circuit factory for the test.
- CircuitFactory circuitFactory = getTestSequencer();
-
- // Set the sending and receiving client details on the test circuitFactory.
- circuitFactory.setSender(enlistedPair.get(0));
- circuitFactory.setReceiver(enlistedPair.get(1));
-
- // Pass down the connection to hold the coordination conversation over.
- circuitFactory.setConversationFactory(conversationFactory);
-
- // Execute the test case.
- coordTest.setCircuitFactory(circuitFactory);
- coordTest.run(testResult);
- }
- }
- }
-
- /**
- * Should provide the distributed test sequencer to pass to {@link org.apache.qpid.test.framework.FrameworkBaseCase}
- * tests.
- *
- * @return A distributed test sequencer.
- */
- public CircuitFactory getTestSequencer()
- {
- return new InteropCircuitFactory();
- }
-
- /**
- * Produces all pairs of combinations of elements from two sets. The ordering of the elements in the pair is
- * important, that is the pair <l, r> is distinct from <r, l>; both pairs are generated. For any element, i, in
- * both the left and right sets, the reflexive pair <i, i> is not generated.
- *
- * @param left The left set.
- * @param right The right set.
- * @param <E> The type of the content of the pairs.
- *
- * @return All pairs formed from the permutations of all elements of the left and right sets.
- */
- private <E> Set<List<E>> allPairs(Set<E> left, Set<E> right)
- {
- log.debug("private <E> Set<List<E>> allPairs(Set<E> left = " + left + ", Set<E> right = " + right + "): called");
-
- Set<List<E>> results = new HashSet<List<E>>();
-
- // Form all pairs from left to right.
- // Form all pairs from right to left.
- for (E le : left)
- {
- for (E re : right)
- {
- if (!le.equals(re))
- {
- results.add(new Pair<E>(le, re));
- results.add(new Pair<E>(re, le));
- }
- }
- }
-
- log.debug("results = " + results);
-
- return results;
- }
-
- /**
- * A simple implementation of a pair, using a list.
- */
- private class Pair<T> extends ArrayList<T>
- {
- /**
- * Creates a new pair of elements.
- *
- * @param first The first element.
- * @param second The second element.
- */
- public Pair(T first, T second)
- {
- super();
- super.add(first);
- super.add(second);
- }
- }
-}
-
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/OptOutTestCase.java b/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/OptOutTestCase.java
deleted file mode 100644
index 229c6a34da..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/OptOutTestCase.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-import org.apache.qpid.test.framework.sequencers.CircuitFactory;
-
-/**
- * An OptOutTestCase is a test case that automatically fails. It is used when a list of test clients has been generated
- * from a compulsory invite, but only some of those clients have responded to a specific test case invite. The clients
- * that did not respond, may automatically be given a fail for some tests.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Fail the test with a suitable reason.
- * </table>
- */
-public class OptOutTestCase extends FrameworkBaseCase
-{
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public OptOutTestCase(String name)
- {
- super(name);
- }
-
- /** Generates an appropriate test failure assertion. */
- public void testOptOut()
- {
- CircuitFactory circuitFactory = getCircuitFactory();
-
- fail("One of " + circuitFactory.getSender() + " and " + getCircuitFactory().getReceivers()
- + " opted out of the test.");
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as defined in the
- * interop testing specification. For example the method "testP2P" might map onto the interop test case name
- * "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "OptOutTest";
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClient.java b/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClient.java
deleted file mode 100644
index f9b8cbb898..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClient.java
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.NDC;
-
-import org.apache.qpid.junit.extensions.SleepThrottle;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-import org.apache.qpid.test.framework.MessagingTestConfigProperties;
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.clocksynch.ClockSynchThread;
-import org.apache.qpid.test.framework.clocksynch.UDPClockSynchronizer;
-import org.apache.qpid.test.utils.ReflectionUtils;
-import org.apache.qpid.test.utils.ReflectionUtilsException;
-
-import javax.jms.Connection;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-import javax.jms.Topic;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Implements a test client as described in the interop testing spec
- * (http://cwiki.apache.org/confluence/display/qpid/Interop+Testing+Specification). A test client is an agent that
- * reacts to control message sequences send by the test {@link Coordinator}.
- *
- * <p/><table><caption>Messages Handled by TestClient</caption>
- * <tr><th> Message <th> Action
- * <tr><td> Invite(compulsory) <td> Reply with Enlist.
- * <tr><td> Invite(test case) <td> Reply with Enlist if test case available.
- * <tr><td> AssignRole(test case) <td> Reply with Accept Role if matches an enlisted test. Keep test parameters.
- * <tr><td> Start <td> Send test messages defined by test parameters. Send report on messages sent.
- * <tr><td> Status Request <td> Send report on messages received.
- * <tr><td> Terminate <td> Terminate the test client.
- * <tr><td> ClockSynch <td> Synch clock against the supplied UDP address.
- * </table>
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Handle all incoming control messages. <td> {@link TestClientControlledTest}
- * <tr><td> Configure and look up test cases by name. <td> {@link TestClientControlledTest}
- * </table>
- */
-public class TestClient implements MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestClient.class);
-
- /** Used for reporting to the console. */
- private static final Logger console = Logger.getLogger("CONSOLE");
-
- /** Holds the default identifying name of the test client. */
- public static final String CLIENT_NAME = "java";
-
- /**
- * Holds the test context properties that provides the default test parameters, plus command line overrides.
- * This is initialized with the default test parameters, to which command line overrides may be applied.
- */
- public static ParsedProperties testContextProperties =
- TestContextProperties.getInstance(MessagingTestConfigProperties.defaults);
-
- /** Holds all the test cases loaded from the classpath. */
- Map<String, TestClientControlledTest> testCases = new HashMap<String, TestClientControlledTest>();
-
- /** Holds the test case currently being run by this client. */
- protected TestClientControlledTest currentTestCase;
-
- /** Holds the connection to the broker that the test is being coordinated on. */
- protected Connection connection;
-
- /** Holds the message producer to hold the test coordination over. */
- protected MessageProducer producer;
-
- /** Holds the JMS controlSession for the test coordination. */
- protected Session session;
-
- /** Holds the name of this client, with a default value. */
- protected String clientName = CLIENT_NAME;
-
- /** This flag indicates that the test client should attempt to join the currently running test case on start up. */
- protected boolean join;
-
- /** Holds the clock synchronizer for the test node. */
- ClockSynchThread clockSynchThread;
-
- /**
- * Creates a new interop test client, listenting to the specified broker and virtual host, with the specified client
- * identifying name.
- *
- * @param pBrokerUrl The url of the broker to connect to.
- * @param pVirtualHost The virtual host to conect to.
- * @param clientName The client name to use.
- * @param join Flag to indicate that this client should attempt to join running tests.
- */
- public TestClient(String pBrokerUrl, String pVirtualHost, String clientName, boolean join)
- {
- log.debug("public TestClient(String pBrokerUrl = " + pBrokerUrl + ", String pVirtualHost = " + pVirtualHost
- + ", String clientName = " + clientName + ", boolean join = " + join + "): called");
-
- // Retain the connection parameters.
- this.clientName = clientName;
- this.join = join;
-
- // Save properies from command line to defaults
- if (pBrokerUrl != null)
- {
- testContextProperties.setProperty(MessagingTestConfigProperties.BROKER_PROPNAME, pBrokerUrl);
- }
- if (pVirtualHost != null)
- {
- testContextProperties.setProperty(MessagingTestConfigProperties.VIRTUAL_HOST_PROPNAME, pVirtualHost);
- }
- }
-
- /**
- * The entry point for the interop test coordinator. This client accepts the following command line arguments:
- *
- * <p/><table>
- * <tr><td> -b <td> The broker URL. <td> Optional.
- * <tr><td> -h <td> The virtual host. <td> Optional.
- * <tr><td> -n <td> The test client name. <td> Optional.
- * <tr><td> name=value <td> Trailing argument define name/value pairs. Added to system properties. <td> Optional.
- * </table>
- *
- * @param args The command line arguments.
- */
- public static void main(String[] args)
- {
- log.debug("public static void main(String[] args = " + Arrays.toString(args) + "): called");
- console.info("Qpid Distributed Test Client.");
-
- // Override the default broker url to be localhost:5672.
- testContextProperties.setProperty(MessagingTestConfigProperties.BROKER_PROPNAME, "tcp://localhost:5672");
-
- // Use the command line parser to evaluate the command line with standard handling behaviour (print errors
- // and usage then exist if there are errors).
- // Any options and trailing name=value pairs are also injected into the test context properties object,
- // to override any defaults that may have been set up.
- ParsedProperties options =
- new ParsedProperties(org.apache.qpid.junit.extensions.util.CommandLineParser.processCommandLine(args,
- new org.apache.qpid.junit.extensions.util.CommandLineParser(
- new String[][]
- {
- { "b", "The broker URL.", "broker", "false" },
- { "h", "The virtual host to use.", "virtual host", "false" },
- { "o", "The name of the directory to output test timings to.", "dir", "false" },
- { "n", "The name of the test client.", "name", "false" },
- { "j", "Join this test client to running test.", "false" }
- }), testContextProperties));
-
- // Extract the command line options.
- String brokerUrl = options.getProperty("b");
- String virtualHost = options.getProperty("h");
- String clientName = options.getProperty("n");
- clientName = (clientName == null) ? CLIENT_NAME : clientName;
- boolean join = options.getPropertyAsBoolean("j");
-
- // To distinguish logging output set up an NDC on the client name.
- NDC.push(clientName);
-
- // Create a test client and start it running.
- TestClient client = new TestClient(brokerUrl, virtualHost, clientName, join);
-
- // Use a class path scanner to find all the interop test case implementations.
- // Hard code the test classes till the classpath scanner is fixed.
- Collection<Class<? extends TestClientControlledTest>> testCaseClasses =
- new ArrayList<Class<? extends TestClientControlledTest>>();
- // ClasspathScanner.getMatches(TestClientControlledTest.class, "^TestCase.*", true);
- testCaseClasses.addAll(loadTestCases("org.apache.qpid.interop.clienttestcases.TestCase1DummyRun",
- "org.apache.qpid.interop.clienttestcases.TestCase2BasicP2P",
- "org.apache.qpid.interop.clienttestcases.TestCase3BasicPubSub",
- "org.apache.qpid.interop.clienttestcases.TestCase4P2PMessageSize",
- "org.apache.qpid.interop.clienttestcases.TestCase5PubSubMessageSize",
- "org.apache.qpid.test.framework.distributedcircuit.TestClientCircuitEnd"));
-
- try
- {
- client.start(testCaseClasses);
- }
- catch (Exception e)
- {
- log.error("The test client was unable to start.", e);
- console.info(e.getMessage());
- System.exit(1);
- }
- }
-
- /**
- * Parses a list of class names, and loads them if they are available on the class path.
- *
- * @param classNames The names of the classes to load.
- *
- * @return A list of the loaded test case classes.
- */
- public static List<Class<? extends TestClientControlledTest>> loadTestCases(String... classNames)
- {
- List<Class<? extends TestClientControlledTest>> testCases =
- new LinkedList<Class<? extends TestClientControlledTest>>();
-
- for (String className : classNames)
- {
- try
- {
- Class<?> cls = ReflectionUtils.forName(className);
- testCases.add((Class<? extends TestClientControlledTest>) cls);
- }
- catch (ReflectionUtilsException e)
- {
- // Ignore, class could not be found, so test not available.
- console.warn("Requested class " + className + " cannot be found, ignoring it.");
- }
- catch (ClassCastException e)
- {
- // Ignore, class was not of correct type to be a test case.
- console.warn("Requested class " + className + " is not an instance of TestClientControlledTest.");
- }
- }
-
- return testCases;
- }
-
- /**
- * Starts the interop test client running. This causes it to start listening for incoming test invites.
- *
- * @param testCaseClasses The classes of the available test cases. The test case names from these are used to
- * matchin incoming test invites against.
- *
- * @throws JMSException Any underlying JMSExceptions are allowed to fall through.
- */
- protected void start(Collection<Class<? extends TestClientControlledTest>> testCaseClasses) throws JMSException
- {
- log.debug("protected void start(Collection<Class<? extends TestClientControlledTest>> testCaseClasses = "
- + testCaseClasses + "): called");
-
- // Create all the test case implementations and index them by the test names.
- for (Class<? extends TestClientControlledTest> nextClass : testCaseClasses)
- {
- try
- {
- TestClientControlledTest testCase = nextClass.newInstance();
- testCases.put(testCase.getName(), testCase);
- }
- catch (InstantiationException e)
- {
- log.warn("Could not instantiate test case class: " + nextClass.getName(), e);
- // Ignored.
- }
- catch (IllegalAccessException e)
- {
- log.warn("Could not instantiate test case class due to illegal access: " + nextClass.getName(), e);
- // Ignored.
- }
- }
-
- // Open a connection to communicate with the coordinator on.
- connection = TestUtils.createConnection(testContextProperties);
- session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- // Set this up to listen for control messages.
- Topic privateControlTopic = session.createTopic("iop.control." + clientName);
- MessageConsumer consumer = session.createConsumer(privateControlTopic);
- consumer.setMessageListener(this);
-
- Topic controlTopic = session.createTopic("iop.control");
- MessageConsumer consumer2 = session.createConsumer(controlTopic);
- consumer2.setMessageListener(this);
-
- // Create a producer to send replies with.
- producer = session.createProducer(null);
-
- // If the join flag was set, then broadcast a join message to notify the coordinator that a new test client
- // is available to join the current test case, if it supports it. This message may be ignored, or it may result
- // in this test client receiving a test invite.
- if (join)
- {
- Message joinMessage = session.createMessage();
-
- joinMessage.setStringProperty("CONTROL_TYPE", "JOIN");
- joinMessage.setStringProperty("CLIENT_NAME", clientName);
- joinMessage.setStringProperty("CLIENT_PRIVATE_CONTROL_KEY", "iop.control." + clientName);
- producer.send(controlTopic, joinMessage);
- }
-
- // Start listening for incoming control messages.
- connection.start();
- }
-
- /**
- * Handles all incoming control messages.
- *
- * @param message The incoming message.
- */
- public void onMessage(Message message)
- {
- NDC.push(clientName);
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- try
- {
- String controlType = message.getStringProperty("CONTROL_TYPE");
- String testName = message.getStringProperty("TEST_NAME");
-
- log.debug("Received control of type '" + controlType + "' for the test '" + testName + "'");
-
- // Check if the message is a test invite.
- if ("INVITE".equals(controlType))
- {
- // Flag used to indicate that an enlist should be sent. Only enlist to compulsory invites or invites
- // for which test cases exist.
- boolean enlist = false;
-
- if (testName != null)
- {
- log.debug("Got an invite to test: " + testName);
-
- // Check if the requested test case is available.
- TestClientControlledTest testCase = testCases.get(testName);
-
- if (testCase != null)
- {
- log.debug("Found implementing class for test '" + testName + "', enlisting for it.");
-
- // Check if the test case will accept the invitation.
- enlist = testCase.acceptInvite(message);
-
- log.debug("The test case "
- + (enlist ? " accepted the invite, enlisting for it."
- : " did not accept the invite, not enlisting."));
-
- // Make the requested test case the current test case.
- currentTestCase = testCase;
- }
- else
- {
- log.debug("Received an invite to the test '" + testName + "' but this test is not known.");
- }
- }
- else
- {
- log.debug("Got a compulsory invite, enlisting for it.");
-
- enlist = true;
- }
-
- if (enlist)
- {
- // Reply with the client name in an Enlist message.
- Message enlistMessage = session.createMessage();
- enlistMessage.setStringProperty("CONTROL_TYPE", "ENLIST");
- enlistMessage.setStringProperty("CLIENT_NAME", clientName);
- enlistMessage.setStringProperty("CLIENT_PRIVATE_CONTROL_KEY", "iop.control." + clientName);
- enlistMessage.setJMSCorrelationID(message.getJMSCorrelationID());
-
- log.debug("Sending enlist message '" + enlistMessage.getJMSMessageID() + "' to " + message.getJMSReplyTo());
-
- producer.send(message.getJMSReplyTo(), enlistMessage);
- }
- else
- {
- // Reply with the client name in an Decline message.
- Message enlistMessage = session.createMessage();
- enlistMessage.setStringProperty("CONTROL_TYPE", "DECLINE");
- enlistMessage.setStringProperty("CLIENT_NAME", clientName);
- enlistMessage.setStringProperty("CLIENT_PRIVATE_CONTROL_KEY", "iop.control." + clientName);
- enlistMessage.setJMSCorrelationID(message.getJMSCorrelationID());
-
- log.debug("Sending decline message '" + enlistMessage.getJMSMessageID() + "' to " + message.getJMSReplyTo());
-
- producer.send(message.getJMSReplyTo(), enlistMessage);
- }
- }
- else if ("ASSIGN_ROLE".equals(controlType))
- {
- // Assign the role to the current test case.
- String roleName = message.getStringProperty("ROLE");
-
- log.debug("Got a role assignment to role: " + roleName);
-
- TestClientControlledTest.Roles role = Enum.valueOf(TestClientControlledTest.Roles.class, roleName);
-
- currentTestCase.assignRole(role, message);
-
- // Reply by accepting the role in an Accept Role message.
- Message acceptRoleMessage = session.createMessage();
- acceptRoleMessage.setStringProperty("CLIENT_NAME", clientName);
- acceptRoleMessage.setStringProperty("CONTROL_TYPE", "ACCEPT_ROLE");
- acceptRoleMessage.setJMSCorrelationID(message.getJMSCorrelationID());
-
- log.debug("Sending accept role message '" + acceptRoleMessage.getJMSMessageID() + "' to " + message.getJMSReplyTo());
-
- producer.send(message.getJMSReplyTo(), acceptRoleMessage);
- }
- else if ("START".equals(controlType) || "STATUS_REQUEST".equals(controlType))
- {
- if ("START".equals(controlType))
- {
- log.debug("Got a start notification.");
-
- // Extract the number of test messages to send from the start notification.
- int numMessages;
-
- try
- {
- numMessages = message.getIntProperty("MESSAGE_COUNT");
- }
- catch (NumberFormatException e)
- {
- // If the number of messages is not specified, use the default of one.
- numMessages = 1;
- }
-
- // Start the current test case.
- currentTestCase.start(numMessages);
- }
- else
- {
- log.debug("Got a status request.");
- }
-
- // Generate the report from the test case and reply with it as a Report message.
- Message reportMessage = currentTestCase.getReport(session);
- reportMessage.setStringProperty("CLIENT_NAME", clientName);
- reportMessage.setStringProperty("CONTROL_TYPE", "REPORT");
- reportMessage.setJMSCorrelationID(message.getJMSCorrelationID());
-
- log.debug("Sending report message '" + reportMessage.getJMSMessageID() + "' to " + message.getJMSReplyTo());
-
- producer.send(message.getJMSReplyTo(), reportMessage);
- }
- else if ("TERMINATE".equals(controlType))
- {
- console.info("Received termination instruction from coordinator.");
-
- // Is a cleaner shutdown needed?
- connection.close();
- System.exit(0);
- }
- else if ("CLOCK_SYNCH".equals(controlType))
- {
- log.debug("Received clock synch command.");
- String address = message.getStringProperty("ADDRESS");
-
- log.debug("address = " + address);
-
- // Re-create (if necessary) and start the clock synch thread to synch the clock every ten seconds.
- if (clockSynchThread != null)
- {
- clockSynchThread.terminate();
- }
-
- SleepThrottle throttle = new SleepThrottle();
- throttle.setRate(0.1f);
-
- clockSynchThread = new ClockSynchThread(new UDPClockSynchronizer(address), throttle);
- clockSynchThread.start();
- }
- else
- {
- // Log a warning about this but otherwise ignore it.
- log.warn("Got an unknown control message, controlType = " + controlType + ", message = " + message);
- }
- }
- catch (JMSException e)
- {
- // Log a warning about this, but otherwise ignore it.
- log.warn("Got JMSException whilst handling message: " + message, e);
- }
- // Log any runtimes that fall through this message handler. These are fatal errors for the test client.
- catch (RuntimeException e)
- {
- log.error("The test client message handler got an unhandled exception: ", e);
- console.info("The message handler got an unhandled exception, terminating the test client.");
- System.exit(1);
- }
- finally
- {
- NDC.pop();
- }
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClientControlledTest.java b/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClientControlledTest.java
deleted file mode 100644
index 2e64c9ca2d..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClientControlledTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-
-/**
- * TestClientControlledTest provides an interface that classes implementing test cases to run on a {@link TestClient}
- * node can use. Implementations must be Java beans, that is, to provide a default constructor and to implement the
- * {@link #getName} method.
- *
- * <p/>The methods specified in this interface are called when the {@link TestClient} receives control instructions to
- * apply to the test. There are control instructions to present the test case with the test invite, so that it may
- * choose whether or not to participate in the test, assign the test to play the sender or receiver role, start the
- * test and obtain the test status report.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Perform test case actions.
- * <tr><td> Generate test reports.
- * </table>
- */
-public interface TestClientControlledTest
-{
- /** Defines the possible test case roles that an interop test case can take on. */
- public enum Roles
- {
- /** Specifies the sender role. */
- SENDER,
-
- /** Specifies the receivers role. */
- RECEIVER
- }
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName();
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- *
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException;
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException;
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void start(int numMessages) throws JMSException;
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException;
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/listeners/XMLTestListener.java b/java/systests/src/main/java/org/apache/qpid/test/framework/listeners/XMLTestListener.java
deleted file mode 100644
index ad2c196adb..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/listeners/XMLTestListener.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.listeners;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.ShutdownHookable;
-import org.apache.qpid.junit.extensions.listeners.TKTestListener;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Listens for test results for a named test and outputs these in the standard JUnit XML format to the specified
- * writer.
- *
- * <p/>The API for this listener accepts notifications about different aspects of a tests results through different
- * methods, so some assumption needs to be made as to which test result a notification refers to. For example
- * {@link #startTest} will be called, then possibly {@link #timing} will be called, even though the test instance is
- * passed in both cases, it is not enough to distinguish a particular run of the test, as the test case instance may
- * be being shared between multiple threads, or being run a repeated number of times, and can therfore be re-used
- * between calls. The listeners make the assumption that, for every test, a unique thread will call {@link #startTest}
- * and {@link #endTest} to delimit each test. All calls to set test parameters, timings, state and so on, will occur
- * between the start and end and will be given with the same thread id as the start and end, so the thread id provides
- * a unqiue value to identify a particular test run against.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Listen to test lifecycle notifications.
- * <tr><td> Listen to test errors and failures.
- * <tr><td> Listen to test timings.
- * <tr><td> Listen to test memory usages.
- * <tr><td> Listen to parameterized test parameters.
- * <tr><th> Responsibilities
- * </table>
- *
- * @todo Merge this class with CSV test listener, making the collection of results common to both, and only factoring
- * out the results printing code into sub-classes. Provide a simple XML results formatter with the same format as
- * the ant XML formatter, and a more structured one for outputing results with timings and summaries from
- * performance tests.
- */
-public class XMLTestListener implements TKTestListener, ShutdownHookable
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(XMLTestListener.class);
-
- /** The results file writer. */
- protected Writer writer;
-
- /** Holds the results for individual tests. */
- // protected Map<Result, Result> results = new LinkedHashMap<Result, Result>();
- // protected List<Result> results = new ArrayList<Result>();
-
- /**
- * Map for holding results on a per thread basis as they come in. A ThreadLocal is not used as sometimes an
- * explicit thread id must be used, where notifications come from different threads than the ones that called
- * the test method.
- */
- Map<Long, Result> threadLocalResults = Collections.synchronizedMap(new LinkedHashMap<Long, Result>());
-
- /**
- * Holds results for tests that have ended. Transferring these results here from the per-thread results map, means
- * that the thread id is freed for the thread to generate more results.
- */
- List<Result> results = new ArrayList<Result>();
-
- /** Holds the overall error count. */
- protected int errors = 0;
-
- /** Holds the overall failure count. */
- protected int failures = 0;
-
- /** Holds the overall tests run count. */
- protected int runs = 0;
-
- /** Holds the name of the class that tests are being run for. */
- String testClassName;
-
- /**
- * Creates a new XML results output listener that writes to the specified location.
- *
- * @param writer The location to write results to.
- * @param testClassName The name of the test class to include in the test results.
- */
- public XMLTestListener(Writer writer, String testClassName)
- {
- log.debug("public XMLTestListener(Writer writer, String testClassName = " + testClassName + "): called");
-
- this.writer = writer;
- this.testClassName = testClassName;
- }
-
- /**
- * Resets the test results to the default state of time zero, memory usage zero, parameter zero, test passed.
- *
- * @param test The test to resest any results for.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void reset(Test test, Long threadId)
- {
- log.debug("public void reset(Test test = " + test + ", Long threadId = " + threadId + "): called");
-
- XMLTestListener.Result r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.error = null;
- r.failure = null;
-
- }
-
- /**
- * Notification that a test started.
- *
- * @param test The test that started.
- */
- public void startTest(Test test)
- {
- log.debug("public void startTest(Test test = " + test + "): called");
-
- Result newResult = new Result(test.getClass().getName(), ((TestCase) test).getName());
-
- // Initialize the thread local test results.
- threadLocalResults.put(Thread.currentThread().getId(), newResult);
- runs++;
- }
-
- /**
- * Should be called every time a test completes with the run time of that test.
- *
- * @param test The name of the test.
- * @param nanos The run time of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing(Test test, long nanos, Long threadId)
- { }
-
- /**
- * Optionally called every time a test completes with the second timing test.
- *
- * @param test The name of the test.
- * @param nanos The second timing information of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing2(Test test, Long nanos, Long threadId)
- { }
-
- /**
- * Should be called every time a test completed with the amount of memory used before and after the test was run.
- *
- * @param test The test which memory was measured for.
- * @param memStart The total JVM memory used before the test was run.
- * @param memEnd The total JVM memory used after the test was run.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void memoryUsed(Test test, long memStart, long memEnd, Long threadId)
- { }
-
- /**
- * Should be called every time a parameterized test completed with the int value of its test parameter.
- *
- * @param test The test which memory was measured for.
- * @param parameter The int parameter value.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void parameterValue(Test test, int parameter, Long threadId)
- { }
-
- /**
- * Should be called every time a test completes with the current number of test threads running.
- *
- * @param test The test for which the measurement is being generated.
- * @param threads The number of tests being run concurrently.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void concurrencyLevel(Test test, int threads, Long threadId)
- { }
-
- /**
- * Notifies listeners of the tests read/set properties.
- *
- * @param properties The tests read/set properties.
- */
- public void properties(Properties properties)
- { }
-
- /**
- * Notification that a test ended.
- *
- * @param test The test that ended.
- */
- public void endTest(Test test)
- {
- log.debug("public void endTest(Test test = " + test + "): called");
-
- // Move complete test results into the completed tests list.
- Result r = threadLocalResults.get(Thread.currentThread().getId());
- results.add(r);
-
- // Clear all the test results for the thread.
- threadLocalResults.remove(Thread.currentThread().getId());
- }
-
- /**
- * Called when a test completes. Success, failure and errors. This method should be used when registering an
- * end test from a different thread than the one that started the test.
- *
- * @param test The test which completed.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void endTest(Test test, Long threadId)
- {
- log.debug("public void endTest(Test test = " + test + ", Long threadId = " + threadId + "): called");
-
- // Move complete test results into the completed tests list.
- Result r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
- results.add(r);
-
- // Clear all the test results for the thread.
- threadLocalResults.remove(Thread.currentThread().getId());
- }
-
- /**
- * An error occurred.
- *
- * @param test The test in which the error occurred.
- * @param t The throwable that resulted from the error.
- */
- public void addError(Test test, Throwable t)
- {
- log.debug("public void addError(Test test = " + test + ", Throwable t = " + t + "): called");
-
- Result r = threadLocalResults.get(Thread.currentThread().getId());
- r.error = t;
- errors++;
- }
-
- /**
- * A failure occurred.
- *
- * @param test The test in which the failure occurred.
- * @param t The JUnit assertions that led to the failure.
- */
- public void addFailure(Test test, AssertionFailedError t)
- {
- log.debug("public void addFailure(Test test = " + test + ", AssertionFailedError t = " + t + "): called");
-
- Result r = threadLocalResults.get(Thread.currentThread().getId());
- r.failure = t;
- failures++;
- }
-
- /**
- * Called when a test completes to mark it as a test fail. This method should be used when registering a
- * failure from a different thread than the one that started the test.
- *
- * @param test The test which failed.
- * @param e The assertion that failed the test.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void addFailure(Test test, AssertionFailedError e, Long threadId)
- {
- log.debug("public void addFailure(Test test, AssertionFailedError e, Long threadId): called");
-
- Result r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
- r.failure = e;
- failures++;
- }
-
- /**
- * Notifies listeners of the start of a complete run of tests.
- */
- public void startBatch()
- {
- log.debug("public void startBatch(): called");
-
- // Reset all results counts.
- threadLocalResults = Collections.synchronizedMap(new HashMap<Long, Result>());
- errors = 0;
- failures = 0;
- runs = 0;
-
- // Write out the file header.
- try
- {
- writer.write("<?xml version=\"1.0\" ?>\n");
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write the test results.", e);
- }
- }
-
- /**
- * Notifies listeners of the end of a complete run of tests.
- *
- * @param parameters The optional test parameters to log out with the batch results.
- */
- public void endBatch(Properties parameters)
- {
- log.debug("public void endBatch(Properties parameters = " + parameters + "): called");
-
- // Write out the results.
- try
- {
- // writer.write("<?xml version=\"1.0\" ?>\n");
- writer.write("<testsuite errors=\"" + errors + "\" failures=\"" + failures + "\" tests=\"" + runs + "\" name=\""
- + testClassName + "\">\n");
-
- for (Result result : results)
- {
- writer.write(" <testcase classname=\"" + result.testClass + "\" name=\"" + result.testName + "\">\n");
-
- if (result.error != null)
- {
- writer.write(" <error type=\"" + result.error.getClass() + "\">");
- result.error.printStackTrace(new PrintWriter(writer));
- writer.write(" </error>");
- }
- else if (result.failure != null)
- {
- writer.write(" <failure type=\"" + result.failure.getClass() + "\">");
- result.failure.printStackTrace(new PrintWriter(writer));
- writer.write(" </failure>");
- }
-
- writer.write(" </testcase>\n");
- }
-
- writer.write("</testsuite>\n");
- writer.flush();
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write the test results.", e);
- }
- }
-
- /**
- * Supplies the shutdown hook.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- log.debug("XMLTestListener::ShutdownHook: called");
- }
- });
- }
-
- /**
- * Used to capture the results of a particular test run.
- */
- protected static class Result
- {
- /** Holds the name of the test class. */
- public String testClass;
-
- /** Holds the name of the test method. */
- public String testName;
-
- /** Holds the exception that caused error in this test. */
- public Throwable error;
-
- /** Holds the assertion exception that caused failure in this test. */
- public AssertionFailedError failure;
-
- /**
- * Creates a placeholder for the results of a test.
- *
- * @param testClass The test class.
- * @param testName The name of the test that was run.
- */
- public Result(String testClass, String testName)
- {
- this.testClass = testClass;
- this.testName = testName;
- }
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalAMQPPublisherImpl.java b/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalAMQPPublisherImpl.java
deleted file mode 100644
index 6a0e8cba4b..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalAMQPPublisherImpl.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.localcircuit;
-
-import org.apache.qpid.client.AMQNoConsumersException;
-import org.apache.qpid.client.AMQNoRouteException;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.AMQPPublisher;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.AssertionBase;
-import org.apache.qpid.test.framework.CircuitEndBase;
-import org.apache.qpid.test.framework.ExceptionMonitor;
-import org.apache.qpid.test.framework.MessageMonitor;
-
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-/**
- * LocalAMQPPublisherImpl is an extension of {@link LocalPublisherImpl} that adds AMQP specific features. Specifically
- * extra assertions for AMQP features not available through generic JMS.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td>
- * </table>
- */
-public class LocalAMQPPublisherImpl extends LocalPublisherImpl implements AMQPPublisher
-{
- /**
- * Creates a circuit end point on the specified producer, consumer and controlSession. Monitors are also configured
- * for messages and exceptions received by the circuit end.
- *
- * @param producer The message producer for the circuit end point.
- * @param consumer The message consumer for the circuit end point.
- * @param session The controlSession for the circuit end point.
- * @param messageMonitor The monitor to notify of all messages received by the circuit end.
- * @param exceptionMonitor The monitor to notify of all exceptions received by the circuit end.
- */
- public LocalAMQPPublisherImpl(MessageProducer producer, MessageConsumer consumer, Session session,
- MessageMonitor messageMonitor, ExceptionMonitor exceptionMonitor)
- {
- super(producer, consumer, session, messageMonitor, exceptionMonitor);
- }
-
- /**
- * Creates a circuit end point from the producer, consumer and controlSession in a circuit end base implementation.
- *
- * @param end The circuit end base implementation to take producers and consumers from.
- */
- public LocalAMQPPublisherImpl(CircuitEndBase end)
- {
- super(end);
- }
-
- /**
- * Provides an assertion that the publisher got a no consumers exception on every message.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the publisher got a no consumers exception on every message.
- */
- public Assertion noConsumersAssertion(ParsedProperties testProps)
- {
- return new AssertionBase()
- {
- public boolean apply()
- {
- boolean passed = true;
- ExceptionMonitor connectionExceptionMonitor = circuit.getConnectionExceptionMonitor();
-
- if (!connectionExceptionMonitor.assertOneJMSExceptionWithLinkedCause(AMQNoConsumersException.class))
- {
- passed = false;
-
- addError("Was expecting linked exception type " + AMQNoConsumersException.class.getName()
- + " on the connection.\n");
- addError((connectionExceptionMonitor.size() > 0)
- ? ("Actually got the following exceptions on the connection, " + connectionExceptionMonitor)
- : "Got no exceptions on the connection.");
- }
-
- return passed;
- }
- };
- }
-
- /**
- * Provides an assertion that the publisher got a no rout exception on every message.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the publisher got a no rout exception on every message.
- */
- public Assertion noRouteAssertion(ParsedProperties testProps)
- {
- return new AssertionBase()
- {
- public boolean apply()
- {
- boolean passed = true;
- ExceptionMonitor connectionExceptionMonitor = circuit.getConnectionExceptionMonitor();
-
- if (!connectionExceptionMonitor.assertOneJMSExceptionWithLinkedCause(AMQNoRouteException.class))
- {
- passed = false;
-
- addError("Was expecting linked exception type " + AMQNoRouteException.class.getName()
- + " on the connection.\n");
- addError((connectionExceptionMonitor.size() > 0)
- ? ("Actually got the following exceptions on the connection, " + connectionExceptionMonitor)
- : "Got no exceptions on the connection.");
- }
-
- return passed;
- }
- };
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalCircuitImpl.java b/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalCircuitImpl.java
deleted file mode 100644
index dc9ee0ac28..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalCircuitImpl.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.localcircuit;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Circuit;
-import org.apache.qpid.test.framework.CircuitEnd;
-import org.apache.qpid.test.framework.ExceptionMonitor;
-import org.apache.qpid.test.framework.MessagingTestConfigProperties;
-import org.apache.qpid.test.framework.Publisher;
-import org.apache.qpid.test.framework.Receiver;
-import org.apache.qpid.test.framework.TestUtils;
-
-import javax.jms.Connection;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * LocalCircuitImpl provides an implementation of the test circuit. This is a local only circuit implementation that
- * supports a single producer/consumer on each end of the circuit, with both ends of the circuit on the same JVM.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the publishing and receiving ends of a test messaging circuit.
- * <td> {@link LocalPublisherImpl}, {@link LocalReceiverImpl}
- * <tr><td> Start the circuit running.
- * <tr><td> Close the circuit down.
- * <tr><td> Take a reading of the circuits state.
- * <tr><td> Apply assertions against the circuits state. <td> {@link Assertion}
- * <tr><td> Send test messages over the circuit.
- * <tr><td> Perform the default test procedure on the circuit.
- * <tr><td> Provide access to connection and controlSession exception monitors. <td> {@link ExceptionMonitor}
- * </table>
- */
-public class LocalCircuitImpl implements Circuit
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(LocalCircuitImpl.class);
-
- /** Holds the test configuration for the circuit. */
- private ParsedProperties testProps;
-
- /** Holds the publishing end of the circuit. */
- private LocalPublisherImpl publisher;
-
- /** Holds the receiving end of the circuit. */
- private LocalReceiverImpl receiver;
-
- /** Holds the connection for the publishing end of the circuit. */
- private Connection connection;
-
- /** Holds the exception listener for the connection on the publishing end of the circuit. */
- private ExceptionMonitor connectionExceptionMonitor;
-
- /** Holds the exception listener for the controlSession on the publishing end of the circuit. */
- private ExceptionMonitor exceptionMonitor;
-
- /**
- * Creates a test circuit using the specified test parameters. The publisher, receivers, connection and
- * connection monitor must already have been created, to assemble the circuit.
- *
- * @param testProps The test parameters.
- * @param publisher The test publisher.
- * @param receiver The test receivers.
- * @param connection The connection.
- * @param connectionExceptionMonitor The connection exception monitor.
- */
- public LocalCircuitImpl(ParsedProperties testProps, LocalPublisherImpl publisher, LocalReceiverImpl receiver,
- Connection connection, ExceptionMonitor connectionExceptionMonitor)
- {
- this.testProps = testProps;
- this.publisher = publisher;
- this.receiver = receiver;
- this.connection = connection;
- this.connectionExceptionMonitor = connectionExceptionMonitor;
- this.exceptionMonitor = new ExceptionMonitor();
-
- // Set this as the parent circuit on the publisher and receivers.
- publisher.setCircuit(this);
- receiver.setCircuit(this);
- }
-
- /**
- * Gets the interface on the publishing end of the circuit.
- *
- * @return The publishing end of the circuit.
- */
- public Publisher getPublisher()
- {
- return publisher;
- }
-
- /**
- * Gets the local publishing circuit end, for direct manipulation.
- *
- * @return The local publishing circuit end.
- */
- public CircuitEnd getLocalPublisherCircuitEnd()
- {
- return publisher;
- }
-
- /**
- * Gets the interface on the receiving end of the circuit.
- *
- * @return The receiving end of the circuit.
- */
- public Receiver getReceiver()
- {
- return receiver;
- }
-
- /**
- * Gets the local receiving circuit end, for direct manipulation.
- *
- * @return The local receiving circuit end.
- */
- public CircuitEnd getLocalReceiverCircuitEnd()
- {
- return receiver;
- }
-
- /**
- * Checks the test circuit. The effect of this is to gather the circuits state, for both ends of the circuit,
- * into a report, against which assertions may be checked.
- */
- public void check()
- { }
-
- /**
- * Applied a list of assertions against the test circuit. The {@link #check()} method should be called before doing
- * this, to ensure that the circuit has gathered its state into a report to assert against.
- *
- * @param assertions The list of assertions to apply.
- * @return Any assertions that failed.
- */
- public List<Assertion> applyAssertions(List<Assertion> assertions)
- {
- List<Assertion> failures = new LinkedList<Assertion>();
-
- for (Assertion assertion : assertions)
- {
- if (!assertion.apply())
- {
- failures.add(assertion);
- }
- }
-
- return failures;
- }
-
- /**
- * Connects and starts the circuit. After this method is called the circuit is ready to send messages.
- */
- public void start()
- { }
-
- /**
- * Closes the circuit. All associated resources are closed.
- */
- public void close()
- {
- try
- {
- publisher.close();
- receiver.close();
- connection.close();
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Got JMSException during close:" + e.getMessage(), e);
- }
- }
-
- /**
- * Sends a message on the test circuit. The exact nature of the message sent is controlled by the test parameters.
- */
- protected void send()
- {
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps);
-
- boolean transactional = props.getPublisherTransacted();
- boolean rollback = props.getRollbackPublisher();
-
- // Send a message through the publisher and log any exceptions raised.
- try
- {
- CircuitEnd end = getLocalPublisherCircuitEnd();
-
- end.send(createTestMessage(end));
-
- if (rollback)
- {
- end.getSession().rollback();
- }
- else if (transactional)
- {
- end.getSession().commit();
- }
- }
- catch (JMSException e)
- {
- exceptionMonitor.onException(e);
- }
- }
-
- /**
- * Runs the default test procedure against the circuit, and checks that all of the specified assertions hold. The
- * outline of the default test procedure is:
- *
- * <p/><pre>
- * Start the circuit.
- * Send test messages.
- * Request a status report.
- * Assert conditions on the publishing end of the circuit.
- * Assert conditions on the receiving end of the circuit.
- * Close the circuit.
- * Pass with no failed assertions or fail with a list of failed assertions.
- * </pre>
- *
- * @param numMessages The number of messages to send using the default test procedure.
- * @param assertions The list of assertions to apply.
- * @return Any assertions that failed.
- */
- public List<Assertion> test(int numMessages, List<Assertion> assertions)
- {
- // Start the test circuit.
- start();
-
- // Send the requested number of test messages.
- for (int i = 0; i < numMessages; i++)
- {
- send();
- }
-
- // Inject a short pause to allow time for exceptions to come back asynchronously.
- TestUtils.pause(500L);
-
- // Request a status report.
- check();
-
- // Clean up the publisher/receivers/controlSession/connections.
- close();
-
- // Apply all of the requested assertions, keeping record of any that fail.
- List<Assertion> failures = applyAssertions(assertions);
-
- // Return any failed assertions to the caller.
- return failures;
- }
-
- /**
- * Creates a message with the properties defined as per the test parameters.
- *
- * @param client The circuit end to create the message on.
- *
- * @return The test message.
- *
- * @throws JMSException Any JMSException occurring during creation of the message is allowed to fall through.
- */
- private Message createTestMessage(CircuitEnd client) throws JMSException
- {
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps);
-
- return TestUtils.createTestMessageOfSize(client.getSession(), props.getMessageSize());
- }
-
- /**
- * Gets the exception monitor for the publishing ends connection.
- *
- * @return The exception monitor for the publishing ends connection.
- */
- public ExceptionMonitor getConnectionExceptionMonitor()
- {
- return connectionExceptionMonitor;
- }
-
- /**
- * Gets the exception monitor for the publishing ends controlSession.
- *
- * @return The exception monitor for the publishing ends controlSession.
- */
- public ExceptionMonitor getExceptionMonitor()
- {
- return exceptionMonitor;
- }
-}
-
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalPublisherImpl.java b/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalPublisherImpl.java
deleted file mode 100644
index 9920be003a..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalPublisherImpl.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.localcircuit;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.AssertionBase;
-import org.apache.qpid.test.framework.CircuitEnd;
-import org.apache.qpid.test.framework.CircuitEndBase;
-import org.apache.qpid.test.framework.ExceptionMonitor;
-import org.apache.qpid.test.framework.MessageMonitor;
-import org.apache.qpid.test.framework.NotApplicableAssertion;
-import org.apache.qpid.test.framework.Publisher;
-
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-/**
- * Provides an implementation of the {@link Publisher} interface and wraps a single message producer and consumer on
- * a single controlSession, as a {@link CircuitEnd}. A local publisher also acts as a circuit end, because for a locally
- * located circuit the assertions may be applied directly, there does not need to be any inter-process messaging
- * between the publisher and its single circuit end, in order to ascertain its status.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a message producer for sending messages.
- * <tr><td> Provide a message consumer for receiving messages.
- * <tr><td> Provide assertion that the publisher received no exceptions.
- * <tr><td> Provide assertion that the publisher received a no consumers error code.
- * <tr><td> Provide assertion that the publisher received a no route error code.
- * </table>
- */
-public class LocalPublisherImpl extends CircuitEndBase implements Publisher
-{
- /** Holds a reference to the containing circuit. */
- protected LocalCircuitImpl circuit;
-
- /**
- * Creates a circuit end point on the specified producer, consumer and controlSession. Monitors are also configured
- * for messages and exceptions received by the circuit end.
- *
- * @param producer The message producer for the circuit end point.
- * @param consumer The message consumer for the circuit end point.
- * @param session The controlSession for the circuit end point.
- * @param messageMonitor The monitor to notify of all messages received by the circuit end.
- * @param exceptionMonitor The monitor to notify of all exceptions received by the circuit end.
- */
- public LocalPublisherImpl(MessageProducer producer, MessageConsumer consumer, Session session,
- MessageMonitor messageMonitor, ExceptionMonitor exceptionMonitor)
- {
- super(producer, consumer, session, messageMonitor, exceptionMonitor);
- }
-
- /**
- * Creates a circuit end point from the producer, consumer and controlSession in a circuit end base implementation.
- *
- * @param end The circuit end base implementation to take producers and consumers from.
- */
- public LocalPublisherImpl(CircuitEndBase end)
- {
- super(end.getProducer(), end.getConsumer(), end.getSession(), end.getMessageMonitor(), end.getExceptionMonitor());
- }
-
- /**
- * Provides an assertion that the publisher encountered no exceptions.
- *
- * @param testProps
- *
- * @return An assertion that the publisher encountered no exceptions.
- */
- public Assertion noExceptionsAssertion(ParsedProperties testProps)
- {
- return new AssertionBase()
- {
- public boolean apply()
- {
- boolean passed = true;
- ExceptionMonitor sessionExceptionMonitor = circuit.getExceptionMonitor();
- ExceptionMonitor connectionExceptionMonitor = circuit.getConnectionExceptionMonitor();
-
- if (!connectionExceptionMonitor.assertNoExceptions())
- {
- passed = false;
-
- addError("Was expecting no exceptions.\n");
- addError("Got the following exceptions on the connection, "
- + circuit.getConnectionExceptionMonitor());
- }
-
- if (!sessionExceptionMonitor.assertNoExceptions())
- {
- passed = false;
-
- addError("Was expecting no exceptions.\n");
- addError("Got the following exceptions on the producer, " + circuit.getExceptionMonitor());
- }
-
- return passed;
- }
- };
- }
-
- /**
- * Provides an assertion that the AMQP channel was forcibly closed by an error condition.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the AMQP channel was forcibly closed by an error condition.
- */
- public Assertion channelClosedAssertion(ParsedProperties testProps)
- {
- return new NotApplicableAssertion(testProps);
- }
-
- /**
- * Provides an assertion that the publisher got a given exception during the test.
- *
- * @param testProps The test configuration properties.
- * @param exceptionClass The exception class to check for.
- *
- * @return An assertion that the publisher got a given exception during the test.
- */
- public Assertion exceptionAssertion(ParsedProperties testProps, final Class<? extends Exception> exceptionClass)
- {
- return new AssertionBase()
- {
- public boolean apply()
- {
- boolean passed = true;
- ExceptionMonitor connectionExceptionMonitor = circuit.getConnectionExceptionMonitor();
-
- if (!connectionExceptionMonitor.assertExceptionOfType(exceptionClass))
- {
- passed = false;
-
- addError("Was expecting linked exception type " + exceptionClass.getName()
- + " on the connection.\n");
- addError((connectionExceptionMonitor.size() > 0)
- ? ("Actually got the following exceptions on the connection, " + connectionExceptionMonitor)
- : "Got no exceptions on the connection.");
- }
-
- return passed;
- }
- };
- }
-
- /**
- * Sets the contianing circuit.
- *
- * @param circuit The containing circuit.
- */
- public void setCircuit(LocalCircuitImpl circuit)
- {
- this.circuit = circuit;
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalReceiverImpl.java b/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalReceiverImpl.java
deleted file mode 100644
index bb242faf90..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalReceiverImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.localcircuit;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.CircuitEnd;
-import org.apache.qpid.test.framework.CircuitEndBase;
-import org.apache.qpid.test.framework.ExceptionMonitor;
-import org.apache.qpid.test.framework.MessageMonitor;
-import org.apache.qpid.test.framework.NotApplicableAssertion;
-import org.apache.qpid.test.framework.Receiver;
-
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-/**
- * Provides an implementation of the {@link Receiver} interface that wraps a single message producer and consumer on
- * a single controlSession, as a {@link CircuitEnd}. A local receiver also acts as a circuit end, because for a locally
- * located circuit the assertions may be applied directly, there does not need to be any inter process messaging
- * between the publisher and its single circuit end, in order to ascertain its status.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a message producer for sending messages.
- * <tr><td> Provide a message consumer for receiving messages.
- * <tr><td> Provide assertion that the receivers received no exceptions.
- * <tr><td> Provide assertion that the receivers received all test messages sent to it.
- * </table>
- */
-public class LocalReceiverImpl extends CircuitEndBase implements Receiver
-{
- /** Holds a reference to the containing circuit. */
- private LocalCircuitImpl circuit;
-
- /**
- * Creates a circuit end point on the specified producer, consumer and controlSession. Monitors are also configured
- * for messages and exceptions received by the circuit end.
- *
- * @param producer The message producer for the circuit end point.
- * @param consumer The message consumer for the circuit end point.
- * @param session The controlSession for the circuit end point.
- * @param messageMonitor The monitor to notify of all messages received by the circuit end.
- * @param exceptionMonitor The monitor to notify of all exceptions received by the circuit end.
- */
- public LocalReceiverImpl(MessageProducer producer, MessageConsumer consumer, Session session,
- MessageMonitor messageMonitor, ExceptionMonitor exceptionMonitor)
- {
- super(producer, consumer, session, messageMonitor, exceptionMonitor);
- }
-
- /**
- * Creates a circuit end point from the producer, consumer and controlSession in a circuit end base implementation.
- *
- * @param end The circuit end base implementation to take producers and consumers from.
- */
- public LocalReceiverImpl(CircuitEndBase end)
- {
- super(end.getProducer(), end.getConsumer(), end.getSession(), end.getMessageMonitor(), end.getExceptionMonitor());
- }
-
- /**
- * Provides an assertion that the receivers encountered no exceptions.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the receivers encountered no exceptions.
- */
- public Assertion noExceptionsAssertion(ParsedProperties testProps)
- {
- return new NotApplicableAssertion(testProps);
- }
-
- /**
- * Provides an assertion that the AMQP channel was forcibly closed by an error condition.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the AMQP channel was forcibly closed by an error condition.
- */
- public Assertion channelClosedAssertion(ParsedProperties testProps)
- {
- return new NotApplicableAssertion(testProps);
- }
-
- /**
- * Provides an assertion that the receivers got all messages that were sent to it.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the receivers got all messages that were sent to it.
- */
- public Assertion allMessagesReceivedAssertion(ParsedProperties testProps)
- {
- return new NotApplicableAssertion(testProps);
- }
-
- /**
- * Provides an assertion that the receivers got none of the messages that were sent to it.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the receivers got none of the messages that were sent to it.
- */
- public Assertion noMessagesReceivedAssertion(ParsedProperties testProps)
- {
- return new NotApplicableAssertion(testProps);
- }
-
- /**
- * Provides an assertion that the receiver got a given exception during the test.
- *
- * @param testProps The test configuration properties.
- * @param exceptionClass The exception class to check for. @return An assertion that the receiver got a given exception during the test.
- */
- public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass)
- {
- return new NotApplicableAssertion(testProps);
- }
-
- /**
- * Sets the contianing circuit.
- *
- * @param circuit The containing circuit.
- */
- public void setCircuit(LocalCircuitImpl circuit)
- {
- this.circuit = circuit;
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/package.html b/java/systests/src/main/java/org/apache/qpid/test/framework/package.html
deleted file mode 100644
index ac4e30d312..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/package.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<html>
-<body>
-<p/>A framework for testing Qpid, built around a standard 'test circuit' design. The idea behind this framework is the
-use of a test circuit which is configured by a set of test parameters, that may be projected onto a topology of
-test nodes, with tests scripted to run over test circuits, making as few assumptions as possible about the underlying
-topology. The standardization of the design, whilst limiting in some respectes, allows a large variety of test
-scenarios to be written with minimal amounts of coding.
-
-<p/>The standard consruction block for a test, is a test circuit. This consists of a publisher, and a receiver. The
-publisher and receiver may reside on the same machine, or may be distributed. Will use a standard set of properties to
-define the desired circuit topology.
-
-<p/>Tests are always to be controlled from the publishing side only. The receiving end of the circuit is to be exposed
-to the test code through an interface, that abstracts as much as possible the receiving end of the test. The interface
-exposes a set of 'assertions' that may be applied to the receiving end of the test circuit.
-
-<p/>In the case where the receiving end of the circuit resides on the same JVM, the assertions will call the receivers
-code locally. Where the receiving end is distributed accross one or more machines, the assertions will be applied to a
-test report gethered from all of the receivers. Test code will be written to the assertions making as few assumptions
-as possible about the exact test topology.
-</body>
-</html>
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/BaseCircuitFactory.java b/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/BaseCircuitFactory.java
deleted file mode 100644
index bd27fc3d90..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/BaseCircuitFactory.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.sequencers;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.Circuit;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * BaseCircuitFactory provides some functionality common to all {@link CircuitFactory}s, such as the details of
- * all {@link org.apache.qpid.test.framework.distributedtesting.TestClient}s that make up the end-points of
- * the circuits that the factory creates, and an active {@link ConversationFactory} that can be used to generate
- * control conversations with those circuit end-points.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Hold the details of the sending and receiving end-points to create circuits from.
- * <tr><td> Provide a conversation factory to create control conversations with the end-points.
- * </table>
- */
-public abstract class BaseCircuitFactory implements CircuitFactory
-{
-
- /** Used for debugging. */
- private final Logger log = Logger.getLogger(BaseCircuitFactory.class);
-
- /** Holds the contact details for the sending test client. */
- protected TestClientDetails sender;
-
- /** Holds the contact details for the receving test client. */
- protected List<TestClientDetails> receivers = new LinkedList<TestClientDetails>();
-
- /** Holds the conversation factory over which to coordinate the test. */
- protected ConversationFactory conversationFactory;
-
- /**
- * Creates a test circuit for the test, configered by the test parameters specified.
- *
- * @param testProperties The test parameters.
- * @return A test circuit.
- */
- public Circuit createCircuit(Properties testProperties)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Sets the sender test client to coordinate the test with.
- *
- * @param sender The contact details of the sending client in the test.
- */
- public void setSender(TestClientDetails sender)
- {
- log.debug("public void setSender(TestClientDetails sender = " + sender + "): called");
-
- this.sender = sender;
- }
-
- /**
- * Sets the receiving test client to coordinate the test with.
- *
- * @param receiver The contact details of the sending client in the test.
- */
- public void setReceiver(TestClientDetails receiver)
- {
- log.debug("public void setReceiver(TestClientDetails receivers = " + receiver + "): called");
-
- this.receivers.add(receiver);
- }
-
- /**
- * Supplies the sending test client.
- *
- * @return The sending test client.
- */
- public TestClientDetails getSender()
- {
- return sender;
- }
-
- /**
- * Supplies the receiving test client.
- *
- * @return The receiving test client.
- */
- public List<TestClientDetails> getReceivers()
- {
- return receivers;
- }
-
- /**
- * Accepts the conversation factory over which to hold the test coordinating conversation.
- *
- * @param conversationFactory The conversation factory to coordinate the test over.
- */
- public void setConversationFactory(ConversationFactory conversationFactory)
- {
- this.conversationFactory = conversationFactory;
- }
-
- /**
- * Provides the conversation factory for providing the distributed test sequencing conversations over the test
- * connection.
- *
- * @return The conversation factory to create test sequencing conversations with.
- */
- public ConversationFactory getConversationFactory()
- {
- return conversationFactory;
- }
-}
-
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/CircuitFactory.java b/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/CircuitFactory.java
deleted file mode 100644
index 9b5d40fd48..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/CircuitFactory.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.sequencers;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Circuit;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * A CircuitFactory is responsibile for creating test circuits appropriate to the context that a test case is
- * running in, and providing an implementation of a standard test procedure over a test circuit.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide a standard test procedure over a test circuit.
- * <tr><td> Construct test circuits appropriate to a tests context.
- * </table>
- */
-public interface CircuitFactory
-{
- /**
- * Holds a test coordinating conversation with the test clients. This should consist of assigning the test roles,
- * begining the test, gathering the test reports from the participants, and checking for assertion failures against
- * the test reports.
- *
- * @param testCircuit The test circuit.
- * @param assertions The list of assertions to apply to the test circuit.
- * @param testProperties The test case definition.
- *
- * @deprecated Use test circuits and Circuit.test instead.
- */
- public void sequenceTest(Circuit testCircuit, List<Assertion> assertions, Properties testProperties);
-
- /**
- * Creates a test circuit for the test, configered by the test parameters specified.
- *
- * @param testProperties The test parameters.
- *
- * @return A test circuit.
- */
- public Circuit createCircuit(Connection connection, ParsedProperties testProperties);
-
- /**
- * Sets the sender test client to coordinate the test with.
- *
- * @param sender The contact details of the sending client in the test.
- */
- public void setSender(TestClientDetails sender);
-
- /**
- * Sets the receiving test client to coordinate the test with.
- *
- * @param receiver The contact details of the sending client in the test.
- */
- public void setReceiver(TestClientDetails receiver);
-
- /**
- * Supplies the sending test client.
- *
- * @return The sending test client.
- */
- public TestClientDetails getSender();
-
- /**
- * Supplies the receiving test client.
- *
- * @return The receiving test client.
- */
- public List<TestClientDetails> getReceivers();
-
- /**
- * Accepts the conversation factory over which to hold the test coordinating conversation.
- *
- * @param conversationFactory The conversation factory to coordinate the test over.
- */
- public void setConversationFactory(ConversationFactory conversationFactory);
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/FanOutCircuitFactory.java b/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/FanOutCircuitFactory.java
deleted file mode 100644
index 833f5fb674..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/FanOutCircuitFactory.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.sequencers;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Circuit;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedcircuit.DistributedCircuitImpl;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * FanOutCircuitFactory is a circuit factory that creates distributed test circuits. Given a set of participating
- * test client nodes, it assigns one node to the SENDER role and the remainder to the RECEIVER role.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create distributed circuits from one to many test nodes, for fanout style testing.
- * </table>
- *
- * @todo Adapt this to be an n*m topology circuit factory. Need to add circuit topology definitions to the test
- * parameters. Place n senders onto the available test clients, and m receivers. Where n or m is larger than
- * the available nodes, start stacking multiple test clients on each node. There will also be an option that
- * indicates whether nodes can play both roles, and how many nodes out of all available may be assigned to
- * each role.
- *
- * @todo The createCircuit methods on this and InteropCircuitFactory are going to be identical. This is because the
- * partitioning into senders and receivers is already done by the test decorators. Either eliminate these factories
- * as unnesesary, or move the partitioning functionality into the factories, in which case the test decorators
- * can probably be merged or eliminated. There is confusion over the placement of responsibilities between the
- * factories and the test decorators... although the test decorators may well do more than just circuit creation
- * in the future. For example, there may have to be a special decorator for test repetition that does one circuit
- * creation, but the runs many tests over it, in which case the handling of responsibilities becomes clearer.
- */
-public class FanOutCircuitFactory extends BaseCircuitFactory
-{
- /** Used for debugging. */
- private Logger log = Logger.getLogger(FanOutCircuitFactory.class);
-
- /**
- * Creates a test circuit for the test, configered by the test parameters specified.
- *
- * @param testProperties The test parameters.
- * @return A test circuit.
- */
- public Circuit createCircuit(Connection connection, ParsedProperties testProperties)
- {
- log.debug("public Circuit createCircuit(ParsedProperties testProperties): called");
-
- List<TestClientDetails> senders = new LinkedList<TestClientDetails>();
- senders.add(getSender());
- List<TestClientDetails> receivers = getReceivers();
- ConversationFactory conversationFactory = getConversationFactory();
-
- return DistributedCircuitImpl.createCircuit(testProperties, senders, receivers, conversationFactory);
- }
-
- /**
- * Holds a test coordinating conversation with the test clients. This should consist of assigning the test roles,
- * begining the test, gathering the test reports from the participants, and checking for assertion failures against
- * the test reports.
- *
- * @param testCircuit The test circuit.
- * @param assertions The list of assertions to apply to the test circuit.
- * @param testProperties The test case definition.
- *
- * @deprecated Scheduled for removal once existing tests converted over to use test circuits.
- */
- public void sequenceTest(Circuit testCircuit, List<Assertion> assertions, Properties testProperties)
- {
- log.debug("protected Message[] sequenceTest(Object... testProperties = " + testProperties + "): called");
-
- TestClientDetails sender = getSender();
- List<TestClientDetails> receivers = getReceivers();
- ConversationFactory conversationFactory = getConversationFactory();
-
- try
- {
- // Create a conversation on the sender clients private control route.
- Session session = conversationFactory.getSession();
- Destination senderControlTopic = session.createTopic(sender.privateControlKey);
- ConversationFactory.Conversation senderConversation = conversationFactory.startConversation();
-
- // Assign the sender role to the sending test client.
- Message assignSender = conversationFactory.getSession().createMessage();
- TestUtils.setPropertiesOnMessage(assignSender, testProperties);
- assignSender.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE");
- assignSender.setStringProperty("ROLE", "SENDER");
- assignSender.setStringProperty("CLIENT_NAME", "Sustained_SENDER");
-
- senderConversation.send(senderControlTopic, assignSender);
-
- // Wait for the sender to confirm its role.
- senderConversation.receive();
-
- // Assign the receivers roles.
- for (TestClientDetails receiver : receivers)
- {
- assignReceiverRole(receiver, testProperties, true);
- }
-
- // Start the test on the sender.
- Message start = session.createMessage();
- start.setStringProperty("CONTROL_TYPE", "START");
-
- senderConversation.send(senderControlTopic, start);
-
- // Wait for the test sender to return its report.
- Message senderReport = senderConversation.receive();
- TestUtils.pause(500);
-
- // Ask the receivers for their reports.
- Message statusRequest = session.createMessage();
- statusRequest.setStringProperty("CONTROL_TYPE", "STATUS_REQUEST");
-
- // Gather the reports from all of the receiving clients.
-
- // Return all of the test reports, the senders report first.
- // return new Message[] { senderReport };
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Unhandled JMSException.");
- }
- }
-
- /**
- * Assigns the receivers role to the specified test client that is to act as a receivers during the test. This method
- * does not always wait for the receiving clients to confirm their role assignments. This is because this method
- * may be called from an 'onMessage' method, when a client is joining the test at a later point in time, and it
- * is not possible to do a synchronous receive during an 'onMessage' method. There is a flag to indicate whether
- * or not to wait for role confirmations.
- *
- * @param receiver The test client to assign the receivers role to.
- * @param testProperties The test parameters.
- * @param confirm Indicates whether role confirmation should be waited for.
- *
- * @throws JMSException Any JMSExceptions occurring during the conversation are allowed to fall through.
- *
- * @deprecated Scheduled for removal once existing tests converted over to use test circuits.
- */
- protected void assignReceiverRole(TestClientDetails receiver, Properties testProperties, boolean confirm)
- throws JMSException
- {
- log.info("assignReceiverRole(TestClientDetails receivers = " + receiver + ", Map<String, Object> testProperties = "
- + testProperties + "): called");
-
- ConversationFactory conversationFactory = getConversationFactory();
-
- // Create a conversation with the receiving test client.
- Session session = conversationFactory.getSession();
- Destination receiverControlTopic = session.createTopic(receiver.privateControlKey);
- ConversationFactory.Conversation receiverConversation = conversationFactory.startConversation();
-
- // Assign the receivers role to the receiving client.
- Message assignReceiver = session.createMessage();
- TestUtils.setPropertiesOnMessage(assignReceiver, testProperties);
- assignReceiver.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE");
- assignReceiver.setStringProperty("ROLE", "RECEIVER");
- assignReceiver.setStringProperty("CLIENT_NAME", receiver.clientName);
-
- receiverConversation.send(receiverControlTopic, assignReceiver);
-
- // Wait for the role confirmation to come back.
- if (confirm)
- {
- receiverConversation.receive();
- }
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/InteropCircuitFactory.java b/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/InteropCircuitFactory.java
deleted file mode 100644
index a4c6888d68..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/InteropCircuitFactory.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.sequencers;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Circuit;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedcircuit.DistributedCircuitImpl;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * InteropCircuitFactory is a circuit factory that creates distributed test circuits. Given a set of participating
- * test client nodes, it assigns one node to the SENDER role and one the RECEIVER role.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create distributed circuits from pairs of test nodes, for interop style testing.
- * </table>
- *
- * @todo The partitioning of a set of nodes into sender and receiver roles is actually done by the interop test
- * decorator. See the todo comment in FanOutCircuitFactory about merging the factories with the decorators, or
- * more carefully dividing up responsibilities between them.
- *
- * @todo The squenceTest code is deprecated, but currently still used by the interop tests. It will be removed once it
- * have been fully replaced by the default test procedure.
- */
-public class InteropCircuitFactory extends BaseCircuitFactory
-{
- /** Used for debugging. */
- private Logger log = Logger.getLogger(InteropCircuitFactory.class);
-
- /**
- * Creates a test circuit for the test, configered by the test parameters specified.
- *
- * @param testProperties The test parameters.
- * @return A test circuit.
- */
- public Circuit createCircuit(Connection connection, ParsedProperties testProperties)
- {
- log.debug("public Circuit createCircuit(ParsedProperties testProperties): called");
-
- List<TestClientDetails> senders = new LinkedList<TestClientDetails>();
- senders.add(getSender());
- List<TestClientDetails> receivers = getReceivers();
- ConversationFactory conversationFactory = getConversationFactory();
-
- return DistributedCircuitImpl.createCircuit(testProperties, senders, receivers, conversationFactory);
- }
-
- /**
- * Holds a test coordinating conversation with the test clients. This should consist of assigning the test roles,
- * begining the test, gathering the test reports from the participants, and checking for assertion failures against
- * the test reports.
- *
- * @param testCircuit The test circuit.
- * @param assertions The list of assertions to apply to the test circuit.
- * @param testProperties The test case definition.
- */
- public void sequenceTest(Circuit testCircuit, List<Assertion> assertions, Properties testProperties)
- {
- log.debug("protected Message[] sequenceTest(Object... testProperties = " + testProperties + "): called");
-
- TestClientDetails sender = getSender();
- List<TestClientDetails> receivers = getReceivers();
- ConversationFactory conversationFactory = getConversationFactory();
-
- try
- {
- Session session = conversationFactory.getSession();
- Destination senderControlTopic = session.createTopic(sender.privateControlKey);
- Destination receiverControlTopic = session.createTopic(receivers.get(0).privateControlKey);
-
- ConversationFactory.Conversation senderConversation = conversationFactory.startConversation();
- ConversationFactory.Conversation receiverConversation = conversationFactory.startConversation();
-
- Message assignSender = conversationFactory.getSession().createMessage();
- TestUtils.setPropertiesOnMessage(assignSender, testProperties);
- assignSender.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE");
- assignSender.setStringProperty("ROLE", "SENDER");
-
- senderConversation.send(senderControlTopic, assignSender);
-
- // Assign the receivers role the receiving client.
- Message assignReceiver = session.createMessage();
- TestUtils.setPropertiesOnMessage(assignReceiver, testProperties);
- assignReceiver.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE");
- assignReceiver.setStringProperty("ROLE", "RECEIVER");
-
- receiverConversation.send(receiverControlTopic, assignReceiver);
-
- // Wait for the senders and receivers to confirm their roles.
- senderConversation.receive();
- receiverConversation.receive();
-
- // Start the test.
- Message start = session.createMessage();
- start.setStringProperty("CONTROL_TYPE", "START");
-
- senderConversation.send(senderControlTopic, start);
-
- // Wait for the test sender to return its report.
- Message senderReport = senderConversation.receive();
- TestUtils.pause(500);
-
- // Ask the receivers for its report.
- Message statusRequest = session.createMessage();
- statusRequest.setStringProperty("CONTROL_TYPE", "STATUS_REQUEST");
-
- receiverConversation.send(receiverControlTopic, statusRequest);
-
- // Wait for the receivers to send its report.
- Message receiverReport = receiverConversation.receive();
-
- // return new Message[] { senderReport, receiverReport };
-
- // Apply assertions.
- }
- catch (JMSException e)
- {
- throw new RuntimeException("JMSException not handled.");
- }
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/unit/ack/AcknowledgeTest.java b/java/systests/src/main/java/org/apache/qpid/test/unit/ack/AcknowledgeTest.java
index 707c4b6a47..841d0ea4ba 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/unit/ack/AcknowledgeTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/unit/ack/AcknowledgeTest.java
@@ -56,7 +56,6 @@ public class AcknowledgeTest extends QpidBrokerTestCase
_queue = getTestQueue();
- _logger.info("AT: setup");
//Create Producer put some messages on the queue
_connection = getConnection();
}
@@ -70,13 +69,10 @@ public class AcknowledgeTest extends QpidBrokerTestCase
// These should all end up being prefetched by session
sendMessage(_consumerSession, _queue, 1);
- if(!transacted)
- {
- ((AMQSession)_consumerSession).sync();
- }
+ syncIfNotTransacted(transacted);
assertEquals("Wrong number of messages on queue", 1,
- ((AMQSession) _consumerSession).getQueueDepth((AMQDestination) _queue));
+ ((AMQSession<?,?>) _consumerSession).getQueueDepth((AMQDestination) _queue));
}
/**
@@ -114,6 +110,7 @@ public class AcknowledgeTest extends QpidBrokerTestCase
{
//Send the next message
_producer.send(createNextMessage(_consumerSession, count));
+ syncIfNotTransacted(transacted);
}
doAcknowlegement(msg);
@@ -128,7 +125,7 @@ public class AcknowledgeTest extends QpidBrokerTestCase
}
assertEquals("Wrong number of messages on queue", 0,
- ((AMQSession) _consumerSession).getQueueDepth((AMQDestination) _queue));
+ ((AMQSession<?,?>) _consumerSession).getQueueDepth((AMQDestination) _queue));
}
/**
@@ -181,4 +178,11 @@ public class AcknowledgeTest extends QpidBrokerTestCase
testAcking(false, AMQSession.PRE_ACKNOWLEDGE);
}
+ private void syncIfNotTransacted(boolean transacted) throws Exception
+ {
+ if(!transacted)
+ {
+ ((AMQSession<?,?>)_consumerSession).sync();
+ }
+ }
}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/unit/basic/BytesMessageTest.java b/java/systests/src/main/java/org/apache/qpid/test/unit/basic/BytesMessageTest.java
index 8afc3f6997..a121b39a56 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/unit/basic/BytesMessageTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/unit/basic/BytesMessageTest.java
@@ -36,6 +36,7 @@ import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
+import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageNotReadableException;
import javax.jms.MessageNotWriteableException;
@@ -278,4 +279,46 @@ public class BytesMessageTest extends QpidBrokerTestCase implements MessageListe
test._count = count;
test.test();
}
+
+ public void testModificationAfterSend() throws Exception
+ {
+ Connection connection = getConnection();
+ Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ BytesMessage jmsMsg = session.createBytesMessage();
+ Destination destination = getTestQueue();
+
+ /* Set the constant message contents. */
+
+ jmsMsg.setStringProperty("foo", "test");
+
+ /* Pre-populate the message body buffer to the target size. */
+ byte[] jmsMsgBodyBuffer = new byte[1024];
+
+ connection.start();
+
+ /* Send messages. */
+ MessageProducer producer = session.createProducer(destination);
+
+ MessageConsumer consumer = session.createConsumer(destination);
+
+ for(int writtenMsgCount = 0; writtenMsgCount < 10; writtenMsgCount++)
+ {
+ /* Set the per send message contents. */
+ jmsMsgBodyBuffer[0] = (byte) writtenMsgCount;
+ jmsMsg.writeBytes(jmsMsgBodyBuffer, 0, jmsMsgBodyBuffer.length);
+ /** Try to write a message. */
+ producer.send(jmsMsg);
+ }
+
+
+ for(int writtenMsgCount = 0; writtenMsgCount < 10; writtenMsgCount++)
+ {
+ BytesMessage recvdMsg = (BytesMessage) consumer.receive(1000L);
+ assertNotNull("Expected to receive message " + writtenMsgCount + " but did not", recvdMsg);
+ assertEquals("Message "+writtenMsgCount+" not of expected size", (long) ((writtenMsgCount + 1)*1024),
+ recvdMsg.getBodyLength());
+
+ }
+ }
+
}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/unit/basic/ReceiveTest.java b/java/systests/src/main/java/org/apache/qpid/test/unit/basic/ReceiveTest.java
deleted file mode 100644
index c764eda799..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/unit/basic/ReceiveTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.unit.basic;
-
-import org.apache.qpid.client.AMQConnection;
-import org.apache.qpid.client.AMQDestination;
-import org.apache.qpid.client.AMQQueue;
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-
-public class ReceiveTest extends QpidBrokerTestCase
-{
- private AMQConnection _connection;
- private AMQDestination _destination;
- private AMQSession _session;
- private MessageConsumer _consumer;
-
- protected void setUp() throws Exception
- {
- super.setUp();
- init((AMQConnection) getConnection("guest", "guest"));
- }
-
- protected void tearDown() throws Exception
- {
- super.tearDown();
- }
-
- private void init(AMQConnection connection) throws Exception
- {
- init(connection, new AMQQueue(connection,"ReceiveTest", true));
- }
-
- private void init(AMQConnection connection, AMQDestination destination) throws Exception
- {
- _connection = connection;
- _destination = destination;
- _session = (AMQSession) connection.createSession(true, AMQSession.NO_ACKNOWLEDGE);
- _consumer = _session.createConsumer(_destination);
- _connection.start();
- }
-
- public void test() throws Exception
- {
- Message m = _consumer.receive(5000);
- assertNull("should not have received a message", m);
- _connection.close();
- }
-
-
- public static junit.framework.Test suite()
- {
- // TODO: note that this test doesn't use the VMBrokerSetup
- // test helper class to create and tear down its
- // VMBroker. This is because the main() above seems to
- // indicate that it's also used outside of the surefire test
- // framework. If it isn't, then this test should also be
- // changed to use VMBrokerSetup here.
- return new junit.framework.TestSuite(ReceiveTest.class);
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/BrokerClosesClientConnectionTest.java b/java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/BrokerClosesClientConnectionTest.java
index 6b83929258..5b3bca7033 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/BrokerClosesClientConnectionTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/BrokerClosesClientConnectionTest.java
@@ -25,6 +25,7 @@ import java.util.concurrent.TimeUnit;
import org.apache.qpid.AMQConnectionClosedException;
import org.apache.qpid.AMQDisconnectedException;
+import org.apache.qpid.client.AMQConnection;
import org.apache.qpid.management.jmx.ManagedConnectionMBeanTest;
import org.apache.qpid.test.utils.QpidBrokerTestCase;
import org.apache.qpid.transport.ConnectionException;
@@ -62,10 +63,13 @@ public class BrokerClosesClientConnectionTest extends QpidBrokerTestCase
{
final Class<? extends Exception> expectedLinkedException = isBroker010() ? ConnectionException.class : AMQConnectionClosedException.class;
+ assertConnectionOpen();
+
stopBroker();
JMSException exception = _recordingExceptionListener.awaitException(10000);
assertConnectionCloseWasReported(exception, expectedLinkedException);
+ assertConnectionClosed();
ensureCanCloseWithoutException();
}
@@ -79,10 +83,13 @@ public class BrokerClosesClientConnectionTest extends QpidBrokerTestCase
return;
}
+ assertConnectionOpen();
+
killBroker();
JMSException exception = _recordingExceptionListener.awaitException(10000);
assertConnectionCloseWasReported(exception, expectedLinkedException);
+ assertConnectionClosed();
ensureCanCloseWithoutException();
}
@@ -107,6 +114,16 @@ public class BrokerClosesClientConnectionTest extends QpidBrokerTestCase
assertEquals("Unexpected linked exception", linkedExceptionClass, exception.getLinkedException().getClass());
}
+ private void assertConnectionClosed()
+ {
+ assertTrue("Connection should be marked as closed", ((AMQConnection)_connection).isClosed());
+ }
+
+ private void assertConnectionOpen()
+ {
+ assertFalse("Connection should not be marked as closed", ((AMQConnection)_connection).isClosed());
+ }
+
private final class RecordingExceptionListener implements ExceptionListener
{
private final CountDownLatch _exceptionReceivedLatch = new CountDownLatch(1);
diff --git a/java/systests/src/main/java/org/apache/qpid/test/unit/close/CloseBeforeAckTest.java b/java/systests/src/main/java/org/apache/qpid/test/unit/close/CloseBeforeAckTest.java
deleted file mode 100644
index 4da9a1db29..0000000000
--- a/java/systests/src/main/java/org/apache/qpid/test/unit/close/CloseBeforeAckTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.unit.close;
-
-import junit.framework.Assert;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.qpid.junit.concurrency.TestRunnable;
-import org.apache.qpid.junit.concurrency.ThreadTestCoordinator;
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
-import javax.jms.Connection;
-import javax.jms.Message;
-import javax.jms.MessageListener;
-import javax.jms.Session;
-
-/**
- * This test forces the situation where a session is closed whilst a message consumer is still in its onMessage method.
- * Running in AUTO_ACK mode, the close call ought to wait until the onMessage method completes, and the ack is sent
- * before closing the connection.
- *
- * <p><table id="crc"><caption>CRC Card</caption> <tr><th> Responsibilities <th> Collaborations <tr><td> Check that
- * closing a connection whilst handling a message, blocks till completion of the handler. </table>
- */
-public class CloseBeforeAckTest extends QpidBrokerTestCase
-{
- private static final Logger log = LoggerFactory.getLogger(CloseBeforeAckTest.class);
-
- private Connection connection;
- private Session session;
- public static final String TEST_QUEUE_NAME = "TestQueue";
- private int TEST_COUNT = 25;
-
- class TestThread1 extends TestRunnable implements MessageListener
- {
- public void runWithExceptions() throws Exception
- {
- // Set this up to listen for message on the test session.
- session.createConsumer(session.createQueue(TEST_QUEUE_NAME)).setMessageListener(this);
- }
-
- public void onMessage(Message message)
- {
- // Give thread 2 permission to close the session.
- allow(new int[] { 1 });
-
- // Wait until thread 2 has closed the connection, or is blocked waiting for this to complete.
- waitFor(new int[] { 1 }, true);
- }
- }
-
- private TestThread1 testThread1 = new TestThread1();
-
- private TestRunnable testThread2 =
- new TestRunnable()
- {
- public void runWithExceptions() throws Exception
- {
- // Send a message to be picked up by thread 1.
- session.createProducer(null).send(session.createQueue(TEST_QUEUE_NAME),
- session.createTextMessage("Hi there thread 1!"));
-
- // Wait for thread 1 to pick up the message and give permission to continue.
- waitFor(new int[] { 0 }, false);
-
- // Close the connection.
- session.close();
-
- // Allow thread 1 to continue to completion, if it is erronously still waiting.
- allow(new int[] { 1 });
- }
- };
-
- public void testCloseBeforeAutoAck_QPID_397() throws Exception
- {
- // Create a session in auto acknowledge mode. This problem shows up in auto acknowledge if the client acks
- // message at the end of the onMessage method, after a close has been sent.
- session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- ThreadTestCoordinator tt = new ThreadTestCoordinator(2);
-
- tt.addTestThread(testThread1, 0);
- tt.addTestThread(testThread2, 1);
- tt.setDeadlockTimeout(500);
- tt.run();
-
- String errorMessage = tt.joinAndRetrieveMessages();
-
- // Print any error messages or exceptions.
- log.debug(errorMessage);
-
- if (!tt.getExceptions().isEmpty())
- {
- for (Exception e : tt.getExceptions())
- {
- log.debug("Exception thrown during test thread: ", e);
- }
- }
-
- Assert.assertTrue(errorMessage, "".equals(errorMessage));
- }
-
- public void closeBeforeAutoAckManyTimes() throws Exception
- {
- for (int i = 0; i < TEST_COUNT; i++)
- {
- testCloseBeforeAutoAck_QPID_397();
- }
- }
-
- protected void setUp() throws Exception
- {
- super.setUp();
- connection = getConnection("guest", "guest");
- }
-
- protected void tearDown() throws Exception
- {
- super.tearDown();
- }
-}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/unit/close/MessageConsumerCloseTest.java b/java/systests/src/main/java/org/apache/qpid/test/unit/close/MessageConsumerCloseTest.java
new file mode 100644
index 0000000000..df32bd7858
--- /dev/null
+++ b/java/systests/src/main/java/org/apache/qpid/test/unit/close/MessageConsumerCloseTest.java
@@ -0,0 +1,77 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.test.unit.close;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.jms.Connection;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.Session;
+
+import org.apache.qpid.test.utils.QpidBrokerTestCase;
+
+public class MessageConsumerCloseTest extends QpidBrokerTestCase
+{
+ Exception _exception;
+
+ public void testConsumerCloseAndSessionRollback() throws Exception
+ {
+ Connection connection = getConnection();
+ final CountDownLatch receiveLatch = new CountDownLatch(1);
+ final Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
+ Destination destination = getTestQueue();
+ MessageConsumer consumer = session.createConsumer(destination);
+ sendMessage(session, destination, 2);
+ connection.start();
+ consumer.setMessageListener(new MessageListener()
+ {
+ @Override
+ public void onMessage(Message message)
+ {
+ try
+ {
+ receiveLatch.countDown();
+ session.rollback();
+ }
+ catch (JMSException e)
+ {
+ _exception = e;
+ }
+ }
+ });
+ boolean messageReceived = receiveLatch.await(1l, TimeUnit.SECONDS);
+ consumer.close();
+
+ assertNull("Exception occured on rollback:" + _exception, _exception);
+ assertTrue("Message is not received", messageReceived);
+
+ consumer = session.createConsumer(destination);
+ Message message1 = consumer.receive(1000l);
+ assertNotNull("message1 is not received", message1);
+ Message message2 = consumer.receive(1000l);
+ assertNotNull("message2 is not received", message2);
+ }
+}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/unit/ct/DurableSubscriberTest.java b/java/systests/src/main/java/org/apache/qpid/test/unit/ct/DurableSubscriberTest.java
index 77627e2782..c292c718bb 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/unit/ct/DurableSubscriberTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/unit/ct/DurableSubscriberTest.java
@@ -379,7 +379,7 @@ public class DurableSubscriberTest extends QpidBrokerTestCase
// Create durable subscriber that matches A
TopicSubscriber subA = session.createDurableSubscriber(topic,
- "testResubscribeWithChangedSelector",
+ "testResubscribeWithChangedSelectorAndRestart",
"Match = True", false);
// Send 1 matching message and 1 non-matching message
@@ -397,8 +397,8 @@ public class DurableSubscriberTest extends QpidBrokerTestCase
((TextMessage) rMsg).getText());
// Queue has no messages left
- AMQQueue subQueueTmp = new AMQQueue("amq.topic", "clientid" + ":" + "testResubscribeWithChangedSelectorAndRestart");
- assertEquals("Msg count should be 0", 0, ((AMQSession<?, ?>) session).getQueueDepth(subQueueTmp));
+ AMQQueue subQueue = new AMQQueue("amq.topic", "clientid" + ":" + "testResubscribeWithChangedSelectorAndRestart");
+ assertEquals("Msg count should be 0", 0, ((AMQSession<?, ?>) session).getQueueDepth(subQueue, true));
rMsg = subA.receive(1000);
assertNull(rMsg);
@@ -423,8 +423,7 @@ public class DurableSubscriberTest extends QpidBrokerTestCase
//verify no messages are now present on the queue as changing selector should have issued
//an unsubscribe and thus deleted the previous durable backing queue for the subscription.
//check the dur sub's underlying queue now has msg count 0
- AMQQueue subQueue = new AMQQueue("amq.topic", "clientid" + ":" + "testResubscribeWithChangedSelectorAndRestart");
- assertEquals("Msg count should be 0", 0, ((AMQSession<?, ?>) session).getQueueDepth(subQueue));
+ assertEquals("Msg count should be 0", 0, ((AMQSession<?, ?>) session).getQueueDepth(subQueue, true));
// Check that new messages are received properly
msg = session.createTextMessage("testResubscribeWithChangedSelectorAndRestart1");
@@ -444,8 +443,8 @@ public class DurableSubscriberTest extends QpidBrokerTestCase
assertNull(rMsg);
//check the dur sub's underlying queue now has msg count 0
- subQueue = new AMQQueue("amq.topic", "clientid" + ":" + "testResubscribeWithChangedSelectorAndRestart");
- assertEquals("Msg count should be 0", 0, ((AMQSession<?, ?>) session).getQueueDepth(subQueue));
+ assertEquals("Msg count should be 0", 0, ((AMQSession<?, ?>) session).getQueueDepth(subQueue, true));
+ conn.close();
//now restart the server
try
@@ -467,8 +466,7 @@ public class DurableSubscriberTest extends QpidBrokerTestCase
//verify no messages now present on the queue after we restart the broker
//check the dur sub's underlying queue now has msg count 0
- subQueue = new AMQQueue("amq.topic", "clientid" + ":" + "testResubscribeWithChangedSelectorAndRestart");
- assertEquals("Msg count should be 0", 0, ((AMQSession<?, ?>) session).getQueueDepth(subQueue));
+ assertEquals("Msg count should be 0", 0, ((AMQSession<?, ?>) session).getQueueDepth(subQueue, true));
// Reconnect with new selector that matches B
TopicSubscriber subC = session.createDurableSubscriber(topic,
@@ -484,8 +482,7 @@ public class DurableSubscriberTest extends QpidBrokerTestCase
producer.send(msg);
//check the dur sub's underlying queue now has msg count 1
- subQueue = new AMQQueue("amq.topic", "clientid" + ":" + "testResubscribeWithChangedSelectorAndRestart");
- assertEquals("Msg count should be 1", 1, ((AMQSession<?, ?>) session).getQueueDepth(subQueue));
+ assertEquals("Msg count should be 1", 1, ((AMQSession<?, ?>) session).getQueueDepth(subQueue, true));
rMsg = subC.receive(1000);
assertNotNull(rMsg);
diff --git a/java/systests/src/main/java/org/apache/qpid/test/unit/topic/DurableSubscriptionTest.java b/java/systests/src/main/java/org/apache/qpid/test/unit/topic/DurableSubscriptionTest.java
index 40c78284da..a07e531b98 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/unit/topic/DurableSubscriptionTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/unit/topic/DurableSubscriptionTest.java
@@ -147,7 +147,7 @@ public class DurableSubscriptionTest extends QpidBrokerTestCase
((AMQSession<?, ?>) session2).sync();
- if(isJavaBroker() && isExternalBroker())
+ if(isJavaBroker())
{
//Verify that the queue was deleted by querying for its JMX MBean
_jmxc = JMXConnnectionFactory.getJMXConnection(5000, "127.0.0.1",
diff --git a/java/systests/src/main/java/org/apache/qpid/test/unit/transacted/TransactionTimeoutTest.java b/java/systests/src/main/java/org/apache/qpid/test/unit/transacted/TransactionTimeoutTest.java
index f554b0089e..cc76d89a67 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/unit/transacted/TransactionTimeoutTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/unit/transacted/TransactionTimeoutTest.java
@@ -20,6 +20,12 @@
*/
package org.apache.qpid.test.unit.transacted;
+import javax.jms.DeliveryMode;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+
/**
* This tests the behaviour of transactional sessions when the {@code transactionTimeout} configuration
* is set for a virtual host.
@@ -305,4 +311,33 @@ public class TransactionTimeoutTest extends TransactionTimeoutTestCase
monitor(0, 0);
}
+
+ /**
+ * Tests that sending an unroutable persistent message does not result in a long running store transaction [warning].
+ */
+ public void testTransactionCommittedOnNonRoutableQueuePersistentMessage() throws Exception
+ {
+ checkTransactionCommittedOnNonRoutableQueueMessage(DeliveryMode.PERSISTENT);
+ }
+
+ /**
+ * Tests that sending an unroutable transient message does not result in a long running store transaction [warning].
+ */
+ public void testTransactionCommittedOnNonRoutableQueueTransientMessage() throws Exception
+ {
+ checkTransactionCommittedOnNonRoutableQueueMessage(DeliveryMode.NON_PERSISTENT);
+ }
+
+ private void checkTransactionCommittedOnNonRoutableQueueMessage(int deliveryMode) throws JMSException, Exception
+ {
+ Queue nonExisting = _psession.createQueue(getTestQueueName() + System.currentTimeMillis());
+ MessageProducer producer = _psession.createProducer(nonExisting);
+ Message message = _psession.createMessage();
+ producer.send(message, deliveryMode, Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE);
+ _psession.commit();
+
+ // give time to house keeping thread to log messages
+ sleep(3f);
+ monitor(0, 0);
+ }
}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/unit/xa/FaultTest.java b/java/systests/src/main/java/org/apache/qpid/test/unit/xa/FaultTest.java
index 86ba5c2cb7..e940a73bbb 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/unit/xa/FaultTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/unit/xa/FaultTest.java
@@ -118,7 +118,7 @@ public class FaultTest extends AbstractXATestCase
_queueFactory = getConnectionFactory();
_xaqueueConnection = _queueFactory.createXAQueueConnection("guest", "guest");
XAQueueSession session = _xaqueueConnection.createXAQueueSession();
- _queueConnection = _queueFactory.createQueueConnection();
+ _queueConnection = _queueFactory.createQueueConnection("guest","guest");
_nonXASession = _queueConnection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
init(session, _queue);
}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/unit/xa/QueueTest.java b/java/systests/src/main/java/org/apache/qpid/test/unit/xa/QueueTest.java
index eb19504dec..3fbe76323a 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/unit/xa/QueueTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/unit/xa/QueueTest.java
@@ -162,11 +162,12 @@ public class QueueTest extends AbstractXATestCase
// create a standard session
try
{
- _queueConnection = _queueFactory.createQueueConnection();
+ _queueConnection = _queueFactory.createQueueConnection("guest", "guest");
_nonXASession = _queueConnection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
}
catch (JMSException e)
{
+ e.printStackTrace();
fail("cannot create queue session: " + e.getMessage());
}
init(session, _queue);
@@ -638,7 +639,8 @@ public class QueueTest extends AbstractXATestCase
TextMessage message1 = (TextMessage) nonXAConsumer.receive(1000);
if (message1 != null)
{
- fail("The queue is not empty! ");
+
+ fail("The queue is not empty! " + message1.getLongProperty(_sequenceNumberPropertyName));
}
}
catch (JMSException e)
diff --git a/java/systests/src/main/java/org/apache/qpid/test/unit/xa/TopicTest.java b/java/systests/src/main/java/org/apache/qpid/test/unit/xa/TopicTest.java
index 3a6d573205..d955979ad6 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/unit/xa/TopicTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/unit/xa/TopicTest.java
@@ -18,6 +18,7 @@
package org.apache.qpid.test.unit.xa;
import junit.framework.TestSuite;
+import org.apache.qpid.configuration.ClientProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -25,6 +26,8 @@ import javax.jms.*;
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
+import java.util.HashSet;
+import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
/**
@@ -103,7 +106,7 @@ public class TopicTest extends AbstractXATestCase
}
catch (Exception e)
{
- fail("Exception thrown when cleaning standard connection: " + e.getStackTrace());
+ fail("Exception thrown when cleaning standard connection: " + e);
}
}
super.tearDown();
@@ -116,6 +119,7 @@ public class TopicTest extends AbstractXATestCase
{
if (!isBroker08())
{
+ setTestClientSystemProperty(ClientProperties.MAX_PREFETCH_PROP_NAME, "1");
// lookup test queue
try
{
@@ -650,7 +654,12 @@ public class TopicTest extends AbstractXATestCase
{
message = (TextMessage) xaDurSub.receive(1000);
- _logger.debug(" received message: " + message.getLongProperty(_sequenceNumberPropertyName));
+
+ if(message != null)
+ {
+ _logger.debug(" received message: " + message.getLongProperty(_sequenceNumberPropertyName));
+ }
+
if (message == null)
{
fail("no message received! expected: " + i);
@@ -882,35 +891,40 @@ public class TopicTest extends AbstractXATestCase
// receive 3 message within tx1: 3, 4 and 7
_xaResource.start(xid1, XAResource.TMRESUME);
// receive messages 3, 4 and 7
+ Set<Long> expected = new HashSet<Long>();
+ expected.add(3L);
+ expected.add(4L);
+ expected.add(7L);
message = (TextMessage) xaDurSub.receive(1000);
if (message == null)
{
- fail("no message received! expected: " + 3);
+ fail("no message received! expected one of: " + expected);
}
- else if (message.getLongProperty(_sequenceNumberPropertyName) != 3)
+ else if (!expected.remove(message.getLongProperty(_sequenceNumberPropertyName)))
{
fail("wrong sequence number: " + message
- .getLongProperty(_sequenceNumberPropertyName) + " 3 was expected");
+ .getLongProperty(_sequenceNumberPropertyName) + " expected one from " + expected);
}
message = (TextMessage) xaDurSub.receive(1000);
if (message == null)
{
- fail("no message received! expected: " + 4);
+ fail("no message received! expected one of: " + expected);
}
- else if (message.getLongProperty(_sequenceNumberPropertyName) != 4)
+ else if (!expected.remove(message.getLongProperty(_sequenceNumberPropertyName)))
{
+
fail("wrong sequence number: " + message
- .getLongProperty(_sequenceNumberPropertyName) + " 4 was expected");
+ .getLongProperty(_sequenceNumberPropertyName) + " expected one from " + expected);
}
message = (TextMessage) xaDurSub.receive(1000);
if (message == null)
{
- fail("no message received! expected: " + 7);
+ fail("no message received! expected one of: " + expected);
}
- else if (message.getLongProperty(_sequenceNumberPropertyName) != 7)
+ else if (!expected.remove(message.getLongProperty(_sequenceNumberPropertyName)))
{
fail("wrong sequence number: " + message
- .getLongProperty(_sequenceNumberPropertyName) + " 7 was expected");
+ .getLongProperty(_sequenceNumberPropertyName) + " expected one from " + expected);
}
}
catch (Exception e)
@@ -936,8 +950,18 @@ public class TopicTest extends AbstractXATestCase
try
{
- // consume messages 1 - 4
- //----- start xid1
+ // consume messages: could be any from (1 - 4, 7-10)
+ //----- start xid4
+ Set<Long> expected = new HashSet<Long>();
+ Set<Long> xid4msgs = new HashSet<Long>();
+ for(long l = 1; l <= 4l; l++)
+ {
+ expected.add(l);
+ }
+ for(long l = 7; l <= 10l; l++)
+ {
+ expected.add(l);
+ }
_xaResource.start(xid4, XAResource.TMNOFLAGS);
for (int i = 1; i <= 4; i++)
{
@@ -946,9 +970,14 @@ public class TopicTest extends AbstractXATestCase
{
fail("no message received! expected: " + i);
}
- else if (message.getLongProperty(_sequenceNumberPropertyName) != i)
+
+ long seqNo = message.getLongProperty(_sequenceNumberPropertyName);
+ xid4msgs.add(seqNo);
+
+ if (!expected.remove(seqNo))
{
- fail("wrong sequence number: " + message.getLongProperty(_sequenceNumberPropertyName));
+ fail("wrong sequence number: " + seqNo +
+ " expected one from " + expected);
}
}
_xaResource.end(xid4, XAResource.TMSUSPEND);
@@ -961,15 +990,17 @@ public class TopicTest extends AbstractXATestCase
{
fail("no message received! expected: " + i);
}
- else if (message.getLongProperty(_sequenceNumberPropertyName) != i)
+ else if (!expected.remove(message.getLongProperty(_sequenceNumberPropertyName)))
{
- fail("wrong sequence number: " + message.getLongProperty(_sequenceNumberPropertyName));
+ fail("wrong sequence number: " + message.getLongProperty(_sequenceNumberPropertyName)
+ + " expected one from " + expected);
}
}
_xaResource.end(xid5, XAResource.TMSUSPEND);
// abort tx4
_xaResource.prepare(xid4);
_xaResource.rollback(xid4);
+ expected.addAll(xid4msgs);
// consume messages 1-4 with tx5
_xaResource.start(xid5, XAResource.TMRESUME);
for (int i = 1; i <= 4; i++)
@@ -979,13 +1010,15 @@ public class TopicTest extends AbstractXATestCase
{
fail("no message received! expected: " + i);
}
- else if (message.getLongProperty(_sequenceNumberPropertyName) != i)
+ else if (!expected.remove(message.getLongProperty(_sequenceNumberPropertyName)))
{
- fail("wrong sequence number: " + message.getLongProperty(_sequenceNumberPropertyName));
+ fail("wrong sequence number: " + message.getLongProperty(_sequenceNumberPropertyName)
+ + " expected one from " + expected);
}
}
_xaResource.end(xid5, XAResource.TMSUSPEND);
// commit tx5
+
_xaResource.prepare(xid5);
_xaResource.commit(xid5, false);
}
@@ -1602,6 +1635,7 @@ public class TopicTest extends AbstractXATestCase
}
_xaResource.end(xid2, XAResource.TMSUCCESS);
_xaResource.commit(xid2, true);
+ _session.close();
}
catch (Exception e)
{
diff --git a/java/systests/src/main/java/org/apache/qpid/test/utils/JMXTestUtils.java b/java/systests/src/main/java/org/apache/qpid/test/utils/JMXTestUtils.java
index 2b7c3f2664..d9c259c389 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/utils/JMXTestUtils.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/utils/JMXTestUtils.java
@@ -329,7 +329,11 @@ public class JMXTestUtils
public boolean isManagedObjectExist(String query)
{
return !queryObjects(query).isEmpty();
+ }
+ public int getNumberOfObjects(String query)
+ {
+ return queryObjects(query).size();
}
public <T> T getManagedObject(Class<T> managedClass, ObjectName objectName)
@@ -430,8 +434,7 @@ public class JMXTestUtils
}
/**
- * Returns the Set of ObjectNames returned by the broker for the given query,
- * or null if there is problem while performing the query.
+ * Returns the Set of ObjectNames returned by the broker for the given query.
*/
private Set<ObjectName> queryObjects(String query)
{
@@ -441,8 +444,7 @@ public class JMXTestUtils
}
catch (Exception e)
{
- e.printStackTrace();
- return null;
+ throw new RuntimeException("Error using query: " + query, e);
}
}
}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java b/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
index 32c6094adb..c070fb4de0 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
@@ -35,7 +35,8 @@ import org.apache.qpid.server.BrokerOptions;
import org.apache.qpid.server.ProtocolExclusion;
import org.apache.qpid.server.configuration.ServerConfiguration;
import org.apache.qpid.server.protocol.AmqpProtocolVersion;
-import org.apache.qpid.server.store.DerbyMessageStore;
+import org.apache.qpid.server.store.MessageStoreConstants;
+import org.apache.qpid.server.store.derby.DerbyMessageStoreFactory;
import org.apache.qpid.url.URLSyntaxException;
import org.apache.qpid.util.FileUtils;
import org.apache.qpid.util.LogMonitor;
@@ -63,9 +64,12 @@ import java.io.PrintStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
@@ -195,6 +199,7 @@ public class QpidBrokerTestCase extends QpidTestCase
return QpidBrokerTestCase._logger;
}
+ @Override
public void runBare() throws Throwable
{
String qname = getClass().getName() + "." + getName();
@@ -243,14 +248,7 @@ public class QpidBrokerTestCase extends QpidTestCase
}
finally
{
- try
- {
- stopBroker();
- }
- catch (Exception e)
- {
- _logger.error("exception stopping broker", e);
- }
+ stopAllBrokers();
// reset properties used in the test
revertSystemProperties();
@@ -634,12 +632,21 @@ public class QpidBrokerTestCase extends QpidTestCase
}
}
- public void stopBroker() throws Exception
+ public void stopBroker()
{
stopBroker(0);
}
- public void stopBroker(int port) throws Exception
+ public void stopAllBrokers()
+ {
+ Set<Integer> runningBrokerPorts = new HashSet<Integer>(getBrokerPortNumbers());
+ for (int brokerPortNumber : runningBrokerPorts)
+ {
+ stopBroker(brokerPortNumber);
+ }
+ }
+
+ public void stopBroker(int port)
{
if (isBrokerPresent(port))
{
@@ -651,12 +658,12 @@ public class QpidBrokerTestCase extends QpidTestCase
}
}
- public void killBroker() throws Exception
+ public void killBroker()
{
killBroker(0);
}
- public void killBroker(int port) throws Exception
+ public void killBroker(int port)
{
if (isBrokerPresent(port))
{
@@ -668,7 +675,7 @@ public class QpidBrokerTestCase extends QpidTestCase
}
}
- public boolean isBrokerPresent(int port) throws Exception
+ public boolean isBrokerPresent(int port)
{
port = getPort(port);
@@ -681,6 +688,11 @@ public class QpidBrokerTestCase extends QpidTestCase
return _brokers.get(port);
}
+ public Set<Integer> getBrokerPortNumbers()
+ {
+ return new HashSet<Integer>(_brokers.keySet());
+ }
+
/**
* Attempt to set the Java Broker to use the BDBMessageStore for persistence
* Falling back to the DerbyMessageStore if
@@ -693,22 +705,22 @@ public class QpidBrokerTestCase extends QpidTestCase
protected void makeVirtualHostPersistent(String virtualhost)
throws ConfigurationException, IOException
{
- Class<?> storeClass = null;
+ Class<?> storeFactoryClass = null;
try
{
// Try and lookup the BDB class
- storeClass = Class.forName("org.apache.qpid.server.store.berkeleydb.BDBMessageStore");
+ storeFactoryClass = Class.forName("org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory");
}
catch (ClassNotFoundException e)
{
// No BDB store, we'll use Derby instead.
- storeClass = DerbyMessageStore.class;
+ storeFactoryClass = DerbyMessageStoreFactory.class;
}
- setConfigurationProperty("virtualhosts.virtualhost." + virtualhost + ".store.class",
- storeClass.getName());
- setConfigurationProperty("virtualhosts.virtualhost." + virtualhost + ".store." + DerbyMessageStore.ENVIRONMENT_PATH_PROPERTY,
+ setConfigurationProperty("virtualhosts.virtualhost." + virtualhost + ".store.factoryclass",
+ storeFactoryClass.getName());
+ setConfigurationProperty("virtualhosts.virtualhost." + virtualhost + ".store." + MessageStoreConstants.ENVIRONMENT_PATH_PROPERTY,
"${QPID_WORK}/" + virtualhost);
}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java b/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java
index 50b1ea7cea..787fc164d5 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java
@@ -114,7 +114,7 @@ public class SpawnedBrokerHolder implements BrokerHolder
}
catch (ReflectionUtilsException e)
{
- LOGGER.warn("Could not get pid for process, Broker process shutdown will be ungraceful");
+ LOGGER.warn("Could not get pid for process, Broker process shutdown will be graceful");
}
}
return null;
diff --git a/java/test-profiles/CPPExcludes b/java/test-profiles/CPPExcludes
index 14671f97af..1943049a7b 100755
--- a/java/test-profiles/CPPExcludes
+++ b/java/test-profiles/CPPExcludes
@@ -24,7 +24,6 @@ org.apache.qpid.test.client.destination.AddressBasedDestinationTest#testCreateEx
org.apache.qpid.test.client.destination.AddressBasedDestinationTest#testDeleteOptions
org.apache.qpid.test.unit.client.channelclose.ChannelCloseTest#*
-org.apache.qpid.client.ResetMessageListenerTest#*
// Those tests are testing 0.8 specific semantics
org.apache.qpid.test.client.ImmediateAndMandatoryPublishingTest#*
@@ -92,6 +91,7 @@ org.apache.qpid.server.store.MessageStoreTest#testQueuePersistence
org.apache.qpid.server.store.MessageStoreTest#testDurableQueueRemoval
org.apache.qpid.server.store.MessageStoreTest#testExchangePersistence
org.apache.qpid.server.store.MessageStoreTest#testDurableExchangeRemoval
+org.apache.qpid.server.store.DurableConfigurationStoreTest#*
// CPP Broker does not follow the same Logging convention as the Java broker
org.apache.qpid.server.BrokerStartupTest#*
@@ -169,3 +169,11 @@ org.apache.qpid.server.message.MessageProtocolConversionTest#*
// passwd script is a Java Broker specific command line tool
org.apache.qpid.scripts.QpidPasswdTest#*
+
+// QPID-3604: Immediate Prefetch no longer supported by 0-10
+org.apache.qpid.client.AsynchMessageListenerTest#testImmediatePrefetchWithMessageListener
+
+// QPID-3936: Exclude Performance Test Framework tests
+org.apache.qpid.systest.disttest.*
+org.apache.qpid.disttest.*
+
diff --git a/java/test-profiles/CPPPrefetchExcludes b/java/test-profiles/CPPPrefetchExcludes
index 7ef52f89c7..9b4d69cebd 100644
--- a/java/test-profiles/CPPPrefetchExcludes
+++ b/java/test-profiles/CPPPrefetchExcludes
@@ -18,6 +18,6 @@
//
// those tests should be run with prefetch off
-org.apache.qpid.client.MessageListenerMultiConsumerTest#testRecieveC2Only
-org.apache.qpid.client.MessageListenerMultiConsumerTest#testRecieveBoth
+org.apache.qpid.client.SynchReceiveTest#testTwoConsumersInterleaved
+org.apache.qpid.client.SynchReceiveTest#testIdleSecondConsumer
org.apache.qpid.test.unit.xa.TopicTest#testMigrateDurableSubscriber
diff --git a/java/test-profiles/Excludes b/java/test-profiles/Excludes
index 8cad91ef2d..c0532e0b97 100644
--- a/java/test-profiles/Excludes
+++ b/java/test-profiles/Excludes
@@ -29,7 +29,5 @@ org.apache.qpid.server.logging.MemoryMessageStoreLoggingTest#testMessageStoreClo
// QPID-3424 : Test fails to start external broker due to Derby Exception.
org.apache.qpid.server.logging.DerbyMessageStoreLoggingTest#*
-// QPID-2418 : The queue backing the dur sub is not currently deleted at subscription change, so the test will fail.
-org.apache.qpid.test.unit.ct.DurableSubscriberTest#testResubscribeWithChangedSelectorAndRestart
-
org.apache.qpid.client.ssl.SSLTest#testVerifyLocalHostLocalDomain
+
diff --git a/java/test-profiles/Java010Excludes b/java/test-profiles/Java010Excludes
index ac6ac8ae1c..90df1cee81 100755
--- a/java/test-profiles/Java010Excludes
+++ b/java/test-profiles/Java010Excludes
@@ -54,3 +54,6 @@ org.apache.qpid.test.client.destination.AddressBasedDestinationTest#testSessionC
org.apache.qpid.test.client.timeouts.SyncWaitTimeoutDelayTest#*
org.apache.qpid.test.client.timeouts.SyncWaitDelayTest#*
+// QPID-3604: Immediate Prefetch no longer supported by 0-10
+org.apache.qpid.client.AsynchMessageListenerTest#testImmediatePrefetchWithMessageListener
+
diff --git a/java/test-profiles/JavaBDBExcludes b/java/test-profiles/JavaBDBExcludes
index 3fac01cb6d..0750beb339 100644
--- a/java/test-profiles/JavaBDBExcludes
+++ b/java/test-profiles/JavaBDBExcludes
@@ -20,3 +20,4 @@
//This test is subclassed within the bdbstore module to enable it to run and
//also add some bdb-specific tests. It is excluded to prevent running twice.
org.apache.qpid.server.store.MessageStoreTest#*
+org.apache.qpid.server.store.DurableConfigurationStoreTest#*
diff --git a/java/test-profiles/JavaDerbyExcludes b/java/test-profiles/JavaDerbyExcludes
index 931a0b0ddb..7ea00680c1 100644
--- a/java/test-profiles/JavaDerbyExcludes
+++ b/java/test-profiles/JavaDerbyExcludes
@@ -17,6 +17,4 @@
// under the License.
//
-org.apache.qpid.server.store.berkeleydb.BDBMessageStoreTest#*
-org.apache.qpid.server.store.berkeleydb.BDBUpgradeTest#*
-org.apache.qpid.server.store.berkeleydb.BDBBackupTest#*
+org.apache.qpid.server.store.berkeleydb.*
diff --git a/java/test-profiles/JavaExcludes b/java/test-profiles/JavaExcludes
index e123d02918..9741eed2e9 100644
--- a/java/test-profiles/JavaExcludes
+++ b/java/test-profiles/JavaExcludes
@@ -28,11 +28,9 @@ org.apache.qpid.test.client.queue.QueuePolicyTest#testRejectPolicy
//Moved from JavaStandaloneExcludes when it was removed
///////////////////////////////////////////////////////
-//XA functionality is not fully implemented yet
-org.apache.qpid.jms.xa.XAResourceTest#*
-
//The Java broker doesnt support client auth
org.apache.qpid.client.ssl.SSLTest#testMultipleCertsInSingleStore
//QPID-3605 Durable subscriber with no-local true receives messages on re-connection
org.apache.qpid.test.unit.topic.DurableSubscriptionTest#testNoLocalMessagesNotDeliveredAfterReconnection
+
diff --git a/java/test-profiles/JavaPre010Excludes b/java/test-profiles/JavaPre010Excludes
index ada22638be..18320646ee 100644
--- a/java/test-profiles/JavaPre010Excludes
+++ b/java/test-profiles/JavaPre010Excludes
@@ -26,10 +26,6 @@ org.apache.qpid.test.client.message.JMSDestinationTest#testReceiveResend
org.apache.qpid.server.message.MessageProtocolConversionTest#*
org.apache.qpid.server.SupportedProtocolVersionsTest#*
-
-// QPID-2478 test fails when run against broker using 0-8/9
-org.apache.qpid.test.client.message.JMSDestinationTest#testGetDestinationWithCustomExchange
-
// The new addressing based syntax is not supported for AMQP 0-8/0-9 versions
org.apache.qpid.client.failover.AddressBasedFailoverBehaviourTest#*
org.apache.qpid.test.client.destination.AddressBasedDestinationTest#*
@@ -40,7 +36,7 @@ org.apache.qpid.server.queue.AddressBasedSortedQueueTest#*
// Those tests are written against the 0.10 path
org.apache.qpid.test.unit.message.UTF8Test#*
-org.apache.qpid.client.MessageListenerTest#testSynchronousReceiveNoWait
+org.apache.qpid.client.SynchReceiveTest#testReceiveNoWait
// Tests 0.10 client feature
org.apache.qpid.test.unit.client.connection.ConnectionTest#testUnsupportedSASLMechanism
@@ -61,3 +57,13 @@ org.apache.qpid.test.unit.client.temporaryqueue.TemporaryQueueTest#testTemporary
// QPID-3604 This fix is applied only to the 0-10 code, hence this test does not work for pre 0-10.
org.apache.qpid.client.prefetch.PrefetchBehaviourTest#testConnectionStop
+
+//XA functionality is not implemented in pre 0-10
+org.apache.qpid.jms.xa.XAResourceTest#*
+
+//Tests durable subscription selector verification behaviour that 0-8/0-9/0-9-1 cant provide
+org.apache.qpid.test.unit.ct.DurableSubscriberTest#testResubscribeWithChangedSelectorAndRestart
+
+// JCA system tests require XA support (should look to see if we can reduce scope of excludes here)
+org.apache.qpid.ra.QpidRAConnectionTest#*
+
diff --git a/java/test-profiles/JavaTransientExcludes b/java/test-profiles/JavaTransientExcludes
index 7cc541c8b9..eb4c1f814d 100644
--- a/java/test-profiles/JavaTransientExcludes
+++ b/java/test-profiles/JavaTransientExcludes
@@ -24,6 +24,13 @@ org.apache.qpid.test.unit.ack.ClientAcknowledgeTest#testClientAckWithLargeFlushe
org.apache.qpid.test.unit.ct.DurableSubscriberTest#*
+org.apache.qpid.test.unit.xa.QueueTest#testRecover
+org.apache.qpid.test.unit.xa.QueueTest#testSendAndRecover
+org.apache.qpid.test.unit.xa.TopicTest#testMultiMessagesDurSubCrash
+org.apache.qpid.test.unit.xa.TopicTest#testDurSubCrash
+org.apache.qpid.test.unit.xa.TopicTest#testRecover
+
+
org.apache.qpid.server.store.MessageStoreTest#testMessagePersistence
org.apache.qpid.server.store.MessageStoreTest#testMessageRemoval
org.apache.qpid.server.store.MessageStoreTest#testBindingPersistence
@@ -33,6 +40,6 @@ org.apache.qpid.server.store.MessageStoreTest#testDurableQueueRemoval
org.apache.qpid.server.store.MessageStoreTest#testExchangePersistence
org.apache.qpid.server.store.MessageStoreTest#testDurableExchangeRemoval
-org.apache.qpid.server.store.berkeleydb.BDBMessageStoreTest#*
-org.apache.qpid.server.store.berkeleydb.BDBUpgradeTest#*
-org.apache.qpid.server.store.berkeleydb.BDBBackupTest#*
+org.apache.qpid.server.store.berkeleydb.*
+
+org.apache.qpid.server.store.DurableConfigurationStoreTest#* \ No newline at end of file
diff --git a/java/test-profiles/java-bdb-spawn.0-10.testprofile b/java/test-profiles/java-bdb-spawn.0-10.testprofile
index cba348b67f..2cef1fd53e 100644
--- a/java/test-profiles/java-bdb-spawn.0-10.testprofile
+++ b/java/test-profiles/java-bdb-spawn.0-10.testprofile
@@ -23,7 +23,7 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT -c @CONFIG_FILE -l test-
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
profile.excludes=JavaExcludes JavaPersistentExcludes Java010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/java/test-profiles/java-bdb-spawn.0-8.testprofile b/java/test-profiles/java-bdb-spawn.0-8.testprofile
index f9837cc4f3..62c9385835 100644
--- a/java/test-profiles/java-bdb-spawn.0-8.testprofile
+++ b/java/test-profiles/java-bdb-spawn.0-8.testprofile
@@ -23,11 +23,11 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
-profile.excludes=JavaExcludes JavaPersistentExcludes JavaPre010Excludes JavaBDBExcludes
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
+profile.excludes=JavaExcludes JavaPersistentExcludes XAExcludes JavaPre010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
broker.version=v0_8
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
diff --git a/java/test-profiles/java-bdb-spawn.0-9-1.testprofile b/java/test-profiles/java-bdb-spawn.0-9-1.testprofile
index b04fea21b6..cfc2a12dde 100644
--- a/java/test-profiles/java-bdb-spawn.0-9-1.testprofile
+++ b/java/test-profiles/java-bdb-spawn.0-9-1.testprofile
@@ -23,11 +23,11 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
-profile.excludes=JavaExcludes JavaPersistentExcludes JavaPre010Excludes JavaBDBExcludes
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
+profile.excludes=JavaExcludes JavaPersistentExcludes XAExcludes JavaPre010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT
broker.version=v0_9_1
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
diff --git a/java/test-profiles/java-bdb-spawn.0-9.testprofile b/java/test-profiles/java-bdb-spawn.0-9.testprofile
index 03082b6f19..9cfa25eb9a 100644
--- a/java/test-profiles/java-bdb-spawn.0-9.testprofile
+++ b/java/test-profiles/java-bdb-spawn.0-9.testprofile
@@ -23,11 +23,11 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
-profile.excludes=JavaExcludes JavaPersistentExcludes JavaPre010Excludes JavaBDBExcludes
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
+profile.excludes=JavaExcludes JavaPersistentExcludes XAExcludes JavaPre010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
broker.version=v0_9
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
diff --git a/java/test-profiles/java-bdb.0-10.testprofile b/java/test-profiles/java-bdb.0-10.testprofile
index 3ef93a68cb..4ac4c3baf2 100644
--- a/java/test-profiles/java-bdb.0-10.testprofile
+++ b/java/test-profiles/java-bdb.0-10.testprofile
@@ -24,7 +24,7 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT -c @CONFIG_FILE -l test-
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
profile.excludes=JavaExcludes JavaPersistentExcludes Java010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/java/test-profiles/java-bdb.0-8.testprofile b/java/test-profiles/java-bdb.0-8.testprofile
index ba6cc0fa80..76c3ea0b72 100644
--- a/java/test-profiles/java-bdb.0-8.testprofile
+++ b/java/test-profiles/java-bdb.0-8.testprofile
@@ -24,11 +24,11 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
-profile.excludes=JavaExcludes JavaPersistentExcludes JavaPre010Excludes JavaBDBExcludes
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
+profile.excludes=JavaExcludes JavaPersistentExcludes XAExcludes JavaPre010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
broker.version=v0_8
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
diff --git a/java/test-profiles/java-bdb.0-9-1.testprofile b/java/test-profiles/java-bdb.0-9-1.testprofile
index 101d38f4b9..afc5f7bfd1 100644
--- a/java/test-profiles/java-bdb.0-9-1.testprofile
+++ b/java/test-profiles/java-bdb.0-9-1.testprofile
@@ -24,11 +24,11 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
-profile.excludes=JavaExcludes JavaPersistentExcludes JavaPre010Excludes JavaBDBExcludes
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
+profile.excludes=JavaExcludes JavaPersistentExcludes XAExcludes JavaPre010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT
broker.version=v0_9_1
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
diff --git a/java/test-profiles/java-bdb.0-9.testprofile b/java/test-profiles/java-bdb.0-9.testprofile
index daa61253bb..76bde0defc 100644
--- a/java/test-profiles/java-bdb.0-9.testprofile
+++ b/java/test-profiles/java-bdb.0-9.testprofile
@@ -24,11 +24,11 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
-profile.excludes=JavaExcludes JavaPersistentExcludes JavaPre010Excludes JavaBDBExcludes
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
+profile.excludes=JavaExcludes JavaPersistentExcludes XAExcludes JavaPre010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
broker.version=v0_9
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
diff --git a/java/test-profiles/java-dby-spawn.0-10.testprofile b/java/test-profiles/java-dby-spawn.0-10.testprofile
index 5bd6f330d5..3b57dca346 100644
--- a/java/test-profiles/java-dby-spawn.0-10.testprofile
+++ b/java/test-profiles/java-dby-spawn.0-10.testprofile
@@ -23,7 +23,7 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT -c @CONFIG_FILE -l test-
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
profile.excludes=JavaPersistentExcludes JavaDerbyExcludes Java010Excludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/java/test-profiles/java-dby-spawn.0-8.testprofile b/java/test-profiles/java-dby-spawn.0-8.testprofile
index c186207f6a..9d421f706e 100644
--- a/java/test-profiles/java-dby-spawn.0-8.testprofile
+++ b/java/test-profiles/java-dby-spawn.0-8.testprofile
@@ -23,9 +23,9 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
-profile.excludes=JavaPersistentExcludes JavaDerbyExcludes JavaPre010Excludes
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
+profile.excludes=JavaPersistentExcludes JavaDerbyExcludes XAExcludes JavaPre010Excludes
broker.clean.between.tests=true
broker.persistent=true
#
diff --git a/java/test-profiles/java-dby-spawn.0-9-1.testprofile b/java/test-profiles/java-dby-spawn.0-9-1.testprofile
index e7212d30f8..3038dd324e 100644
--- a/java/test-profiles/java-dby-spawn.0-9-1.testprofile
+++ b/java/test-profiles/java-dby-spawn.0-9-1.testprofile
@@ -23,9 +23,9 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
-profile.excludes=JavaPersistentExcludes JavaDerbyExcludes JavaPre010Excludes
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
+profile.excludes=JavaPersistentExcludes JavaDerbyExcludes XAExcludes JavaPre010Excludes
broker.clean.between.tests=true
broker.persistent=true
#
diff --git a/java/test-profiles/java-dby-spawn.0-9.testprofile b/java/test-profiles/java-dby-spawn.0-9.testprofile
index bd5df9ee82..6007105097 100644
--- a/java/test-profiles/java-dby-spawn.0-9.testprofile
+++ b/java/test-profiles/java-dby-spawn.0-9.testprofile
@@ -23,9 +23,9 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
-profile.excludes=JavaPersistentExcludes JavaDerbyExcludes JavaPre010Excludes
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
+profile.excludes=JavaPersistentExcludes JavaDerbyExcludes XAExcludes JavaPre010Excludes
broker.clean.between.tests=true
broker.persistent=true
#
diff --git a/java/test-profiles/java-dby.0-10.testprofile b/java/test-profiles/java-dby.0-10.testprofile
index 9c23d18f45..51f6c4ca6f 100644
--- a/java/test-profiles/java-dby.0-10.testprofile
+++ b/java/test-profiles/java-dby.0-10.testprofile
@@ -24,7 +24,7 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT -c @CONFIG_FILE -l test-
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
profile.excludes=JavaPersistentExcludes JavaDerbyExcludes Java010Excludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/java/test-profiles/java-dby.0-8.testprofile b/java/test-profiles/java-dby.0-8.testprofile
index e4e00c70c2..c841c69922 100644
--- a/java/test-profiles/java-dby.0-8.testprofile
+++ b/java/test-profiles/java-dby.0-8.testprofile
@@ -24,9 +24,9 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
-profile.excludes=JavaPersistentExcludes JavaDerbyExcludes JavaPre010Excludes
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
+profile.excludes=JavaPersistentExcludes JavaDerbyExcludes XAExcludes JavaPre010Excludes
broker.clean.between.tests=true
broker.persistent=true
#
diff --git a/java/test-profiles/java-dby.0-9-1.testprofile b/java/test-profiles/java-dby.0-9-1.testprofile
index 83f43d8dbf..fa01010d52 100644
--- a/java/test-profiles/java-dby.0-9-1.testprofile
+++ b/java/test-profiles/java-dby.0-9-1.testprofile
@@ -24,9 +24,9 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
-profile.excludes=JavaPersistentExcludes JavaDerbyExcludes JavaPre010Excludes
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
+profile.excludes=JavaPersistentExcludes JavaDerbyExcludes XAExcludes JavaPre010Excludes
broker.clean.between.tests=true
broker.persistent=true
#
diff --git a/java/test-profiles/java-dby.0-9.testprofile b/java/test-profiles/java-dby.0-9.testprofile
index b6d1840f9f..d343185591 100644
--- a/java/test-profiles/java-dby.0-9.testprofile
+++ b/java/test-profiles/java-dby.0-9.testprofile
@@ -24,9 +24,9 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
-profile.excludes=JavaPersistentExcludes JavaDerbyExcludes JavaPre010Excludes
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
+profile.excludes=JavaPersistentExcludes JavaDerbyExcludes XAExcludes JavaPre010Excludes
broker.clean.between.tests=true
broker.persistent=true
#
diff --git a/java/test-profiles/java-mms-spawn.0-8.testprofile b/java/test-profiles/java-mms-spawn.0-8.testprofile
index e46823c3f1..1b6b6f28a3 100644
--- a/java/test-profiles/java-mms-spawn.0-8.testprofile
+++ b/java/test-profiles/java-mms-spawn.0-8.testprofile
@@ -22,9 +22,9 @@ broker.type=spawned
broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FILE -l test-profiles/log4j-test.xml
broker.ready=BRK-1004
broker.stopped=Exception
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
#
#qpid.amqp.version=0-8
-profile.excludes=JavaTransientExcludes JavaPre010Excludes
+profile.excludes=JavaTransientExcludes XAExcludes JavaPre010Excludes
diff --git a/java/test-profiles/java-mms-spawn.0-9-1.testprofile b/java/test-profiles/java-mms-spawn.0-9-1.testprofile
index 05b1f89452..e87ae2b204 100644
--- a/java/test-profiles/java-mms-spawn.0-9-1.testprofile
+++ b/java/test-profiles/java-mms-spawn.0-9-1.testprofile
@@ -22,9 +22,9 @@ broker.type=spawned
broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FILE -l test-profiles/log4j-test.xml
broker.ready=BRK-1004
broker.stopped=Exception
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
#
#qpid.amqp.version=0-91
-profile.excludes=JavaTransientExcludes JavaPre010Excludes
+profile.excludes=JavaTransientExcludes XAExcludes JavaPre010Excludes
diff --git a/java/test-profiles/java-mms-spawn.0-9.testprofile b/java/test-profiles/java-mms-spawn.0-9.testprofile
index d53a9f42ad..2a9430242e 100644
--- a/java/test-profiles/java-mms-spawn.0-9.testprofile
+++ b/java/test-profiles/java-mms-spawn.0-9.testprofile
@@ -22,9 +22,9 @@ broker.type=spawned
broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FILE -l test-profiles/log4j-test.xml
broker.ready=BRK-1004
broker.stopped=Exception
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
#
#qpid.amqp.version=0-9
-profile.excludes=JavaTransientExcludes JavaPre010Excludes
+profile.excludes=JavaTransientExcludes XAExcludes JavaPre010Excludes
diff --git a/java/test-profiles/java-mms.0-8.testprofile b/java/test-profiles/java-mms.0-8.testprofile
index 02723ab180..1f02a49b28 100644
--- a/java/test-profiles/java-mms.0-8.testprofile
+++ b/java/test-profiles/java-mms.0-8.testprofile
@@ -23,9 +23,9 @@ broker.type=internal
broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FILE -l test-profiles/log4j-test.xml
broker.ready=BRK-1004
broker.stopped=Exception
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
#
#qpid.amqp.version=0-8
-profile.excludes=JavaTransientExcludes JavaPre010Excludes
+profile.excludes=JavaTransientExcludes XAExcludes JavaPre010Excludes
diff --git a/java/test-profiles/java-mms.0-9-1.testprofile b/java/test-profiles/java-mms.0-9-1.testprofile
index 37efa097bb..ae707f025d 100644
--- a/java/test-profiles/java-mms.0-9-1.testprofile
+++ b/java/test-profiles/java-mms.0-9-1.testprofile
@@ -23,9 +23,9 @@ broker.type=internal
broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FILE -l test-profiles/log4j-test.xml
broker.ready=BRK-1004
broker.stopped=Exception
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
#
#qpid.amqp.version=0-91
-profile.excludes=JavaTransientExcludes JavaPre010Excludes
+profile.excludes=JavaTransientExcludes XAExcludes JavaPre010Excludes
diff --git a/java/test-profiles/java-mms.0-9.testprofile b/java/test-profiles/java-mms.0-9.testprofile
index 36ee470e09..8f372299ea 100644
--- a/java/test-profiles/java-mms.0-9.testprofile
+++ b/java/test-profiles/java-mms.0-9.testprofile
@@ -23,9 +23,9 @@ broker.type=internal
broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FILE -l test-profiles/log4j-test.xml
broker.ready=BRK-1004
broker.stopped=Exception
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
#
#qpid.amqp.version=0-9
-profile.excludes=JavaTransientExcludes JavaPre010Excludes
+profile.excludes=JavaTransientExcludes XAExcludes JavaPre010Excludes
diff --git a/java/test-profiles/python_tests/Java010PythonExcludes b/java/test-profiles/python_tests/Java010PythonExcludes
index 52afb66890..13f9d5484e 100644
--- a/java/test-profiles/python_tests/Java010PythonExcludes
+++ b/java/test-profiles/python_tests/Java010PythonExcludes
@@ -19,15 +19,14 @@
###### Feature not supported in Java Broker ######
-#The broker does not support DTX
-qpid_tests.broker_0_10.dtx.*
-
-#The broker does not support message groups
-qpid_tests.broker_0_10.msg_groups.*
-
#The broker does not have the appropriate QMF support
qpid_tests.broker_0_10.management.*
qpid_tests.broker_0_10.stats.BrokerStatsTests.*
+qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_default_group_id
+qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_move_*
+qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_purge_*
+qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_query
+qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_reroute
#The broker does not use the same threshold alerting system (or the QMF support needed for the tests)
qpid_tests.broker_0_10.threshold.*
@@ -51,14 +50,12 @@ qpid_tests.broker_0_10.message.MessageTests.test_ack
qpid_tests.broker_0_10.message.MessageTests.test_acquire
qpid_tests.broker_0_10.message.MessageTests.test_acquire_with_no_accept_and_credit_flow
-#QPID-3588 Java broker sets expiration and doesnt pass TTL on to consumer
-qpid.tests.messaging.message.MessageEchoTests.testProperties
-
-#QPID-3589 Difference in exception text message causes test to fail
-qpid.tests.messaging.endpoints.AddressTests.testDeleteSpecial
-
-#QPID-3590 Java broker does not support null value for routing key
-qpid.tests.messaging.endpoints.SessionTests.testDoubleCommit
+qpid_tests.broker_0_10.dtx.DtxTests.test_forget_xid_on_completion
+qpid_tests.broker_0_10.dtx.DtxTests.test_implicit_end
+qpid_tests.broker_0_10.dtx.DtxTests.test_simple_commit
+qpid_tests.broker_0_10.dtx.DtxTests.test_simple_prepare_commit
+qpid_tests.broker_0_10.dtx.DtxTests.test_simple_prepare_rollback
+qpid_tests.broker_0_10.dtx.DtxTests.test_simple_rollback
###### Java Broker defects ######
@@ -70,37 +67,3 @@ qpid_tests.broker_0_10.message.MessageTests.test_window_flow_bytes
#QPID-3605 Durable subscriber with no-local true receives messages on re-connection
qpid_tests.broker_0_10.message.MessageTests.test_no_local_awkward
-#QPID-3594 exclusive queues problem
-qpid_tests.broker_0_10.queue.QueueTests.test_declare_exclusive
-
-#QPID-3477: Java broker does not handle rejection code specified in test
-qpid.tests.messaging.endpoints.SessionTests.testReject
-
-#QPID-3595 Alternate Exchanges support requires work to be spec compliant.
-qpid_tests.broker_0_10.alternate_exchange.AlternateExchangeTests.test_delete_while_used_by_queue
-qpid_tests.broker_0_10.alternate_exchange.AlternateExchangeTests.test_modify_existing_exchange_alternate
-qpid_tests.broker_0_10.alternate_exchange.AlternateExchangeTests.test_queue_autodelete
-qpid_tests.broker_0_10.alternate_exchange.AlternateExchangeTests.test_queue_delete
-qpid_tests.broker_0_10.alternate_exchange.AlternateExchangeTests.test_queue_delete_loop
-qpid_tests.broker_0_10.alternate_exchange.AlternateExchangeTests.test_queue_delete_no_match
-qpid_tests.broker_0_10.alternate_exchange.AlternateExchangeTests.test_reject_no_match
-qpid_tests.broker_0_10.alternate_exchange.AlternateExchangeTests.test_add_alternate_to_exchange
-qpid_tests.broker_0_10.new_api.GeneralTests.test_qpid_3481_acquired_to_alt_exchange
-
-#QPID-3596 Broker does not validate for reserved exchange names on create/bind.
-qpid_tests.broker_0_10.exchange.DeclareMethodExchangeFieldReservedRuleTests.*
-
-#QPID-3597 Headers exchange issues
-qpid_tests.broker_0_10.exchange.HeadersExchangeTests.*
-qpid_tests.broker_0_10.queue.QueueTests.test_unbind_headers
-qpid_tests.broker_0_10.exchange.RecommendedTypesRuleTests.testHeaders
-qpid_tests.broker_0_10.exchange.RequiredInstancesRuleTests.testAmqMatch
-qpid_tests.broker_0_10.query.QueryTests.test_exchange_bound_header
-
-#QPID-3598 Fanout exchange issues
-qpid_tests.broker_0_10.query.QueryTests.test_exchange_bound_fanout
-
-#QPID-3599 Tests fail due to differences in expected message Redelivered status
-qpid.tests.messaging.endpoints.SessionTests.testCommitAck
-qpid.tests.messaging.endpoints.SessionTests.testRelease
-qpid.tests.messaging.endpoints.SessionTests.testRollback
diff --git a/java/test-profiles/testprofile.defaults b/java/test-profiles/testprofile.defaults
index bd2faa7915..2c3c92e922 100644
--- a/java/test-profiles/testprofile.defaults
+++ b/java/test-profiles/testprofile.defaults
@@ -21,7 +21,7 @@ java.naming.provider.url=${test.profiles}/test-provider.properties
broker.ready=Listening on TCP
broker.config=build/etc/config-systests.xml
-messagestore.class.name=org.apache.qpid.server.store.MemoryMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.MemoryMessageStoreFactory
broker.protocol.excludes=
broker.persistent=false
@@ -47,7 +47,7 @@ test.port.alt.ssl=25671
test.exclude=true
profile.excludes=
-test.excludes=Excludes XAExcludes JavaExcludes ${profile}.excludes ${profile.excludes}
+test.excludes=Excludes JavaExcludes ${profile}.excludes ${profile.excludes}
test.mem=512M
test=*Test
haltonfailure=no
diff --git a/java/testkit/README.txt b/java/testkit/README.txt
deleted file mode 100644
index df7996f471..0000000000
--- a/java/testkit/README.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Introduction
-============
-
-The Test kit for the JMS client is based on a multi-broker python framework.
-So far it could only be used with the c++ broker.
-
diff --git a/java/testkit/bin/run_soak_client.sh b/java/testkit/bin/run_soak_client.sh
deleted file mode 100644
index ea1721d988..0000000000
--- a/java/testkit/bin/run_soak_client.sh
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# This is a sample script for a soak test on
-# linux environment.
-# This will start n of Producers processors and record their CPU and memory stats.
-# Also the Producer out will be saved to a file as well.
-
-if [ "$JAR_PATH" = "" ] ; then
- echo "ERROR: Please set JAR_PATH to point to the Qpid libraries ...."
- exit 1
-fi
-
-#1 PID, $2 freq, $3 count
-calc_stats(){
-
-for (( i = 0 ; i <= $3; i++ ))
- do
- cpu=`ps auxw | grep $1 | grep -v 'grep' | awk '{print $3}'`
- mem=`pmap $1 | grep total | grep -v 'grep' | awk '{print substr($2,0,length($2)-1)}'`
- echo $i","$mem","$cpu
- sleep $2
- cpu="0.0"
- mem="0"
- done
- kill -9 $1
-}
-
-# Num of producer processors to start
-num=$1
-# Log frequency in seconds
-log_freq=$2
-# Num of iterations
-log_iter=$3
-
-class_name=$4
-log_file_name=`echo $class_name | cut -d. -f6`
-
-# The total time for the test is determined by the
-# log_freq * log_iter.
-
-shift 4
-CLASSPATH=`find $JAR_PATH -name '*.jar' | tr '\n' ":"`
-
-JVM_ARGS="-Xmx1500M $@"
-echo "Starting $log_file_name with the following params $JVM_ARGS"
-
-for (( c = 1 ; c <= $num; c++ ))
-do
- $JAVA_HOME/bin/java $JVM_ARGS -cp $CLASSPATH $class_name > ${log_file_name}_${c}.log &
- pid=`jobs -l %% | awk '{print $2}'`
- calc_stats $pid $log_freq $log_iter > ${log_file_name}_process_${c}.log &
-done
diff --git a/java/testkit/bin/soak_report.sh b/java/testkit/bin/soak_report.sh
deleted file mode 100644
index 9da8bfa234..0000000000
--- a/java/testkit/bin/soak_report.sh
+++ /dev/null
@@ -1,161 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Sample script to run a soak test with MultiThreadedProducer/Consumer.
-# You need to provide the log freq and no of iterations
-# Ex to run 10 hours and collect 1 second samples
-# soak_report.sh 1 36000
-
-# This script assumes that a suitable broker instance is started.
-
-log_freq=$1
-log_iter=$2
-shift 2
-JVM_ARGS=$@
-
-if [ "$QPID_TEST_HOME" = "" ] ; then
- echo "ERROR: Please set QPID_TEST_HOME ...."
- exit 1
-fi
-
-print_rates()
-{
- cat $1 | awk '{
- FS = ",";
- count = 0;
- total_latency = 0;
- min_latency = 9223372036854775807;
- max_latency = 0;
-
- total_tp = 0;
- min_tp = 50000;
- max_tp = 0;
-
- while ((getline) == 1)
- {
- total_latency = total_latency + $3
- total_tp = total_tp + $2
-
- if ($3 > 0)
- {
- min_latency = (($3 < min_latency) ? $3 : min_latency);
- max_latency = (($3 > max_latency) ? $3 : max_latency);
- }
- if ($2 > 0)
- {
- min_tp = (($2 < min_tp) ? $2 : min_tp);
- max_tp = (($2 > max_tp) ? $2 : max_tp);
- }
-
- count = count + 1
- }
-
- print "Avg Latency (ms) : " total_latency/count
- print "Max Latency (ms) : " max_latency
- print "Min Latency (ms) : " min_latency
-
- print ""
- print "Avg Throughput (msg/sec) : " total_tp/count
- print "Max Throughput (msg/sec) : " max_tp
- print "Min Throughput (msg/sec) : " min_tp
-
- print ""
- print "Total Iteratons " count
-
- }'
-}
-
-print_system_stats()
-{
- cat $1 | awk '{
- FS = ",";
- count = 0;
- total_memory = 0;
- min_memory = 9223372036854775807;
- max_memory = 0;
-
- total_cp = 0;
- min_cp = 50000;
- max_cp = 0;
-
- while ((getline) == 1)
- {
- total_memory = total_memory + $2
- total_cp = total_cp + $3
-
- if ($2 > 0)
- {
- min_memory = (($2 < min_memory) ? $2 : min_memory);
- max_memory = (($2 > max_memory) ? $2 : max_memory);
- }
- if ($3 > 0)
- {
- min_cp = (($3 < min_cp) ? $3 : min_cp);
- max_cp = (($3 > max_cp) ? $3 : max_cp);
- }
-
- count = count + 1
- }
-
- print "Avg Memory (MB) : " total_memory/(count*1024)
- print "Max Memory (MB) : " max_memory/1024
- print "Min Memory (MB) : " min_memory/1024
-
- print ""
- print "Avg CPU : " total_cp/count
- print "Max CPU : " max_cp
- print "Min CPU : " min_cp
-
- print ""
- print "Total Iteratons " count
-
- }'
-}
-
-
-cleanup()
-{
- kill -9 `ps aux | grep java | grep soak | awk '{ print $2 }'`
-}
-
-print_results()
-{
- printf "\n======================================================= \n"
- print_rates MultiThreadedConsumer_1.log
- printf "\nConsumer process stats "
- printf "\n----------------------- \n"
- print_system_stats MultiThreadedConsumer_process_1.log
- printf "\nProducer process stats "
- printf "\n----------------------- \n"
- print_system_stats MultiThreadedProducer_process_1.log
- printf "\n------------------------------------------------------- \n"
-}
-
-trap cleanup EXIT
-
-# runs a single instance of the MultiThreadedConsumer and MultiThreadedProducer
-sh $QPID_TEST_HOME/bin/run_soak_client.sh 1 $log_freq $log_iter org.apache.qpid.testkit.soak.MultiThreadedConsumer $JVM_ARGS
-sh $QPID_TEST_HOME/bin/run_soak_client.sh 1 $log_freq $log_iter org.apache.qpid.testkit.soak.MultiThreadedProducer $JVM_ARGS
-
-sleep_time=$((log_freq * log_iter))
-echo "sleep time : " $sleep_time
-sleep $((log_freq * log_iter))
-
-print_results
diff --git a/java/testkit/build.xml b/java/testkit/build.xml
deleted file mode 100644
index 80a3373379..0000000000
--- a/java/testkit/build.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
- - or more contributor license agreements. See the NOTICE file
- - distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
- -->
-<project name="Test Kit" default="build">
-
- <property name="module.depends" value="client common tools"/>
-
- <import file="../module.xml"/>
-
-</project>
diff --git a/java/testkit/src/main/java/org/apache/qpid/testkit/soak/ResourceLeakTest.java b/java/testkit/src/main/java/org/apache/qpid/testkit/soak/ResourceLeakTest.java
deleted file mode 100644
index c240ecdf2e..0000000000
--- a/java/testkit/src/main/java/org/apache/qpid/testkit/soak/ResourceLeakTest.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.testkit.soak;
-
-
-import java.util.Random;
-
-import javax.jms.BytesMessage;
-import javax.jms.Destination;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-import org.apache.qpid.client.AMQConnection;
-import org.apache.qpid.client.AMQQueue;
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.client.BasicMessageConsumer;
-import org.apache.qpid.client.BasicMessageProducer;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.testkit.TestLauncher;
-import org.apache.qpid.thread.Threading;
-
-/**
- * Test Description
- * ================
- * This test will open x number of connections where each
- * connection will create a session and a producer/consumer pair,
- * and then a randomly selected set of connections (about 1/4th)
- * will send a configurable no of messages and try to receive them.
- * It will then sleep for configurable time interval and
- * tear down the connections/sessions/consumers.
- * It will then repeat the process again until the test is stopped.
- *
- * Purpose of the test
- * ===================
- * To find if the broker has leaks when cleaning resources.
- * To find if the client has leaks with resources.
- */
-public class ResourceLeakTest extends TestLauncher
-{
- /* protected long connection_idle_time = 5000;
- protected Random rand = new Random();
-
- public ResourceLeakTest()
- {
- super();
- }
-
- public void test()
- {
- try
- {
-
- AMQConnection[] cons = new AMQConnection[connection_count];
- Session[] sessions = new Session[connection_count];
- MessageConsumer[] msgCons = new MessageConsumer[connection_count];
- MessageProducer [] msgProds = new MessageProducer[connection_count];
-
- while (true)
- {
- for (int i = 0; i < connection_count; i++)
- {
- AMQConnection con = new AMQConnection(url);
- con.start();
- cons[i] = con;
- Session ssn = con.createSession(false, Session.AUTO_ACKNOWLEDGE);
- sessions[i] = ssn;
- Destination dest = new AMQQueue(new AMQShortString(exchange_name),
- new AMQShortString(routing_key + i),
- new AMQShortString(queue_name + i),
- true, //exclusive
- true // auto delete
- );
- MessageConsumer msgCon = ssn.createConsumer(dest);
- msgCons[i] = msgCon;
- MessageProducer msgProd = ssn.createProducer(dest);
- msgProds[i] = msgProd;
- }
-
- // Select some connections randomly and send/recv messages
- // Exercise around quarter of the connections
- for (int i=0; i < connection_count/4; i++)
- {
- int k = rand.nextInt(connection_count);
-
- BytesMessage msg = sessions[k].createBytesMessage();
- msg.writeBytes("Test Msg".getBytes());
-
- for (int j = 0; j < msg_count;j++)
- {
- msgProds[k].send(msg);
- }
-
- int j = 0;
- while (j < msg_count)
- {
- msgCons[k].receive();
- j++;
- }
- }
- System.out.println(df.format(System.currentTimeMillis()));
- Thread.sleep(connection_idle_time);
-
- try
- {
- for (int i = 0; i < connection_count; i++)
- {
- if (!((BasicMessageConsumer)msgCons[i]).isClosed())
- {
- msgCons[i].close();
- }
-
- if (!((BasicMessageProducer)msgProds[i]).isClosed())
- {
- msgProds[i].close();
- }
-
- if (!((AMQSession)sessions[i]).isClosed())
- {
- sessions[i].close();
- }
- if (!((AMQConnection)cons[i]).isClosed())
- {
- cons[i].close();
- }
- }
- }
- catch (Exception e)
- {
- handleError(e,"Exception closing resources");
- }
- }
- }
- catch (Exception e)
- {
- handleError(e,"Exception in setting up the test");
- }
-
- }
-
- public static void main(String[] args)
- {
- final ResourceLeakTest test = new ResourceLeakTest();
- Runnable r = new Runnable(){
- public void run()
- {
- test.test();
- }
- };
-
- Thread t;
- try
- {
- t = Threading.getThreadFactory().createThread(r);
- }
- catch(Exception e)
- {
- throw new Error("Error creating test thread",e);
- }
- }*/
-
-}
diff --git a/java/tools/bin/perf-report b/java/tools/bin/jms-quick-perf-report
index 7de3f2b602..7de3f2b602 100755
--- a/java/tools/bin/perf-report
+++ b/java/tools/bin/jms-quick-perf-report
diff --git a/java/tools/bin/controller b/java/tools/bin/mercury-controller
index fab8614039..fab8614039 100644
--- a/java/tools/bin/controller
+++ b/java/tools/bin/mercury-controller
diff --git a/java/tools/bin/start-consumers b/java/tools/bin/mercury-start-consumers
index c71fc0c21f..c71fc0c21f 100644
--- a/java/tools/bin/start-consumers
+++ b/java/tools/bin/mercury-start-consumers
diff --git a/java/tools/bin/start-producers b/java/tools/bin/mercury-start-producers
index 7ba0286f7c..7ba0286f7c 100644
--- a/java/tools/bin/start-producers
+++ b/java/tools/bin/mercury-start-producers
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/Clock.java b/java/tools/src/main/java/org/apache/qpid/tools/Clock.java
index 979d2ef76f..4e79dd62a8 100644
--- a/java/tools/src/main/java/org/apache/qpid/tools/Clock.java
+++ b/java/tools/src/main/java/org/apache/qpid/tools/Clock.java
@@ -27,6 +27,8 @@ package org.apache.qpid.tools;
public class Clock
{
+ public final static long SEC = 60000;
+
private static Precision precision;
private static long offset = -1; // in nano secs
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/JVMArgConfiguration.java b/java/tools/src/main/java/org/apache/qpid/tools/JVMArgConfiguration.java
new file mode 100644
index 0000000000..c6abdf6c84
--- /dev/null
+++ b/java/tools/src/main/java/org/apache/qpid/tools/JVMArgConfiguration.java
@@ -0,0 +1,411 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.text.DecimalFormat;
+
+import javax.jms.Connection;
+import javax.jms.Session;
+
+import org.apache.qpid.client.AMQConnection;
+
+public class JVMArgConfiguration implements TestConfiguration
+{
+ /*
+ * By default the connection URL is used.
+ * This allows a user to easily specify a fully fledged URL any given property.
+ * Ex. SSL parameters
+ *
+ * By providing a host & port allows a user to simply override the URL.
+ * This allows to create multiple clients in test scripts easily,
+ * without having to deal with the long URL format.
+ */
+ private String url = "amqp://guest:guest@clientid/testpath?brokerlist='tcp://localhost:5672'";
+
+ private String host = "";
+
+ private int port = -1;
+
+ private String address = "queue; {create : always}";
+
+ private int msg_size = 1024;
+
+ private int random_msg_size_start_from = 1;
+
+ private boolean cacheMessage = false;
+
+ private boolean disableMessageID = false;
+
+ private boolean disableTimestamp = false;
+
+ private boolean durable = false;
+
+ private int transaction_size = 0;
+
+ private int ack_mode = Session.AUTO_ACKNOWLEDGE;
+
+ private int msg_count = 10;
+
+ private int warmup_count = 1;
+
+ private boolean random_msg_size = false;
+
+ private String msgType = "bytes";
+
+ private boolean printStdDev = false;
+
+ private int sendRate = 0;
+
+ private boolean externalController = false;
+
+ private boolean useUniqueDest = false; // useful when using multiple connections.
+
+ private int ackFrequency = 100;
+
+ private DecimalFormat df = new DecimalFormat("###.##");
+
+ private int reportEvery = 0;
+
+ private boolean isReportTotal = false;
+
+ private boolean isReportHeader = true;
+
+ private boolean isReportLatency = false;
+
+ private int sendEOS = 0;
+
+ private int connectionCount = 1;
+
+ private int rollbackFrequency = 0;
+
+ private boolean printHeaders;
+
+ public JVMArgConfiguration()
+ {
+
+ url = System.getProperty("url",url);
+ host = System.getProperty("host","");
+ port = Integer.getInteger("port", -1);
+ address = System.getProperty("address",address);
+
+ msg_size = Integer.getInteger("msg-size", 1024);
+ cacheMessage = Boolean.getBoolean("cache-msg");
+ disableMessageID = Boolean.getBoolean("disable-message-id");
+ disableTimestamp = Boolean.getBoolean("disable-timestamp");
+ durable = Boolean.getBoolean("durable");
+ transaction_size = Integer.getInteger("tx",1000);
+ ack_mode = Integer.getInteger("ack-mode",Session.AUTO_ACKNOWLEDGE);
+ msg_count = Integer.getInteger("msg-count",msg_count);
+ warmup_count = Integer.getInteger("warmup-count",warmup_count);
+ random_msg_size = Boolean.getBoolean("random-msg-size");
+ msgType = System.getProperty("msg-type","bytes");
+ printStdDev = Boolean.getBoolean("print-std-dev");
+ sendRate = Integer.getInteger("rate",0);
+ externalController = Boolean.getBoolean("ext-controller");
+ useUniqueDest = Boolean.getBoolean("use-unique-dest");
+ random_msg_size_start_from = Integer.getInteger("random-msg-size-start-from", 1);
+ reportEvery = Integer.getInteger("report-every");
+ isReportTotal = Boolean.getBoolean("report-total");
+ isReportHeader = (System.getProperty("report-header") == null) ? true : Boolean.getBoolean("report-header");
+ isReportLatency = Boolean.getBoolean("report-latency");
+ sendEOS = Integer.getInteger("send-eos");
+ connectionCount = Integer.getInteger("con_count",1);
+ ackFrequency = Integer.getInteger("ack-frequency");
+ rollbackFrequency = Integer.getInteger("rollback-frequency");
+ printHeaders = Boolean.getBoolean("print-headers");
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getUrl()
+ */
+ @Override
+ public String getUrl()
+ {
+ return url;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getHost()
+ */
+ @Override
+ public String getHost()
+ {
+ return host;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getPort()
+ */
+ @Override
+ public int getPort()
+ {
+ return port;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getAddress()
+ */
+ @Override
+ public String getAddress()
+ {
+ return address;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getAckMode()
+ */
+ @Override
+ public int getAckMode()
+ {
+ return ack_mode;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getMsgCount()
+ */
+ @Override
+ public int getMsgCount()
+ {
+ return msg_count;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getMsgSize()
+ */
+ @Override
+ public int getMsgSize()
+ {
+ return msg_size;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getRandomMsgSizeStartFrom()
+ */
+ @Override
+ public int getRandomMsgSizeStartFrom()
+ {
+ return random_msg_size_start_from;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isDurable()
+ */
+ @Override
+ public boolean isDurable()
+ {
+ return durable;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isTransacted()
+ */
+ @Override
+ public boolean isTransacted()
+ {
+ return transaction_size > 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getTransactionSize()
+ */
+ @Override
+ public int getTransactionSize()
+ {
+ return transaction_size;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getWarmupCount()
+ */
+ @Override
+ public int getWarmupCount()
+ {
+ return warmup_count;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isCacheMessage()
+ */
+ @Override
+ public boolean isCacheMessage()
+ {
+ return cacheMessage;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isDisableMessageID()
+ */
+ @Override
+ public boolean isDisableMessageID()
+ {
+ return disableMessageID;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isDisableTimestamp()
+ */
+ @Override
+ public boolean isDisableTimestamp()
+ {
+ return disableTimestamp;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isRandomMsgSize()
+ */
+ @Override
+ public boolean isRandomMsgSize()
+ {
+ return random_msg_size;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getMessageType()
+ */
+ @Override
+ public String getMessageType()
+ {
+ return msgType;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isPrintStdDev()
+ */
+ @Override
+ public boolean isPrintStdDev()
+ {
+ return printStdDev;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getSendRate()
+ */
+ @Override
+ public int getSendRate()
+ {
+ return sendRate;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isExternalController()
+ */
+ @Override
+ public boolean isExternalController()
+ {
+ return externalController;
+ }
+
+ public void setAddress(String addr)
+ {
+ address = addr;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isUseUniqueDests()
+ */
+ @Override
+ public boolean isUseUniqueDests()
+ {
+ return useUniqueDest;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getAckFrequency()
+ */
+ @Override
+ public int getAckFrequency()
+ {
+ return ackFrequency;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#createConnection()
+ */
+ @Override
+ public Connection createConnection() throws Exception
+ {
+ if (getHost().equals("") || getPort() == -1)
+ {
+ return new AMQConnection(getUrl());
+ }
+ else
+ {
+ return new AMQConnection(getHost(),getPort(),"guest","guest","test","test");
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getDecimalFormat()
+ */
+ @Override
+ public DecimalFormat getDecimalFormat()
+ {
+ return df;
+ }
+
+ @Override
+ public int reportEvery()
+ {
+ return reportEvery;
+ }
+
+ @Override
+ public boolean isReportTotal()
+ {
+ return isReportTotal;
+ }
+
+ @Override
+ public boolean isReportHeader()
+ {
+ return isReportHeader;
+ }
+
+ @Override
+ public boolean isReportLatency()
+ {
+ return isReportLatency;
+ }
+
+ @Override
+ public int getSendEOS()
+ {
+ return sendEOS;
+ }
+
+ @Override
+ public int getConnectionCount()
+ {
+ return connectionCount;
+ }
+
+ @Override
+ public int getRollbackFrequency()
+ {
+ return rollbackFrequency;
+ }
+
+ @Override
+ public boolean isPrintHeaders()
+ {
+ return printHeaders;
+ }
+}
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/LatencyTest.java b/java/tools/src/main/java/org/apache/qpid/tools/LatencyTest.java
deleted file mode 100644
index 16149d17c9..0000000000
--- a/java/tools/src/main/java/org/apache/qpid/tools/LatencyTest.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.tools;
-
-import java.io.FileOutputStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import javax.jms.BytesMessage;
-import javax.jms.DeliveryMode;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-import javax.jms.TextMessage;
-
-import org.apache.qpid.thread.Threading;
-
-/**
- * Latency test sends an x number of messages in warmup mode and wait for a confirmation
- * from the consumer that it has successfully consumed them and ready to start the
- * test. It will start sending y number of messages and each message will contain a time
- * stamp. This will be used at the receiving end to measure the latency.
- *
- * It is important to have a sufficiently large number for the warmup count to
- * ensure the system is in steady state before the test is started.
- *
- * If you plan to plot the latencies then msg_count should be a smaller number (ex 500 or 1000)
- * You also need to specify a file name using -Dfile=/home/rajith/latency.log.1
- *
- * The idea is to get a latency sample for the system once it achieves steady state.
- *
- */
-
-public class LatencyTest extends PerfBase implements MessageListener
-{
- private MessageProducer producer;
- private MessageConsumer consumer;
- private Message msg;
- private byte[] payload;
- private long maxLatency = 0;
- private long minLatency = Long.MAX_VALUE;
- private long totalLatency = 0; // to calculate avg latency.
- private int rcvdMsgCount = 0;
- private double stdDev = 0;
- private double avgLatency = 0;
- private boolean warmup_mode = true;
- private boolean transacted = false;
- private int transSize = 0;
-
- private final List<Long> latencies;
- private final Lock lock = new ReentrantLock();
- private final Condition warmedUp;
- private final Condition testCompleted;
-
- public LatencyTest()
- {
- super("");
- warmedUp = lock.newCondition();
- testCompleted = lock.newCondition();
- // Storing the following two for efficiency
- transacted = params.isTransacted();
- transSize = params.getTransactionSize();
- latencies = new ArrayList <Long>(params.getMsgCount());
- }
-
- public void setUp() throws Exception
- {
- super.setUp();
- consumer = session.createConsumer(dest);
- consumer.setMessageListener(this);
-
- // if message caching is enabled we pre create the message
- // else we pre create the payload
- if (params.isCacheMessage())
- {
- msg = MessageFactory.createBytesMessage(session, params.getMsgSize());
- msg.setJMSDeliveryMode(params.isDurable()?
- DeliveryMode.PERSISTENT :
- DeliveryMode.NON_PERSISTENT
- );
- }
- else
- {
- payload = MessageFactory.createMessagePayload(params.getMsgSize()).getBytes();
- }
-
- producer = session.createProducer(dest);
- producer.setDisableMessageID(params.isDisableMessageID());
- producer.setDisableMessageTimestamp(params.isDisableTimestamp());
- }
-
- protected Message getNextMessage() throws Exception
- {
- if (params.isCacheMessage())
- {
- return msg;
- }
- else
- {
- msg = session.createBytesMessage();
- ((BytesMessage)msg).writeBytes(payload);
- return msg;
- }
- }
-
- public void warmup()throws Exception
- {
- System.out.println("Warming up......");
- int count = params.getWarmupCount();
- for (int i=0; i < count; i++)
- {
- producer.send(getNextMessage());
- }
- Message msg = session.createTextMessage("End");
- producer.send(msg);
-
- if (params.isTransacted())
- {
- session.commit();
- }
-
- try
- {
- lock.lock();
- warmedUp.await();
- }
- finally
- {
- lock.unlock();
- }
- }
-
- public void onMessage(Message msg)
- {
- try
- {
- if (msg instanceof TextMessage && ((TextMessage)msg).getText().equals("End"))
- {
- if (warmup_mode)
- {
- warmup_mode = false;
- try
- {
- lock.lock();
- warmedUp.signal();
- }
- finally
- {
- lock.unlock();
- }
- }
- else
- {
- computeStats();
- }
- }
- else if (!warmup_mode)
- {
- long time = System.currentTimeMillis();
- rcvdMsgCount ++;
-
- if (transacted && (rcvdMsgCount % transSize == 0))
- {
- session.commit();
- }
-
- long latency = time - msg.getJMSTimestamp();
- latencies.add(latency);
- totalLatency = totalLatency + latency;
- }
-
- }
- catch(Exception e)
- {
- handleError(e,"Error when receiving messages");
- }
-
- }
-
- private void computeStats()
- {
- avgLatency = (double)totalLatency/(double)rcvdMsgCount;
- double sigma = 0;
-
- for (long latency: latencies)
- {
- maxLatency = Math.max(maxLatency, latency);
- minLatency = Math.min(minLatency, latency);
- sigma = sigma + Math.pow(latency - avgLatency,2);
- }
-
- stdDev = Math.sqrt(sigma/(rcvdMsgCount -1));
-
- try
- {
- lock.lock();
- testCompleted.signal();
- }
- finally
- {
- lock.unlock();
- }
- }
-
- public void writeToFile() throws Exception
- {
- String fileName = System.getProperty("file");
- PrintWriter writer = new PrintWriter(new FileOutputStream(fileName));
- for (long latency: latencies)
- {
- writer.println(String.valueOf(latency));
- }
- writer.flush();
- writer.close();
- }
-
- public void printToConsole()
- {
- System.out.println(new StringBuilder("Total Msgs Received : ").append(rcvdMsgCount).toString());
- System.out.println(new StringBuilder("Standard Deviation : ").
- append(df.format(stdDev)).
- append(" ms").toString());
- System.out.println(new StringBuilder("Avg Latency : ").
- append(df.format(avgLatency)).
- append(" ms").toString());
- System.out.println(new StringBuilder("Min Latency : ").
- append(minLatency).
- append(" ms").toString());
- System.out.println(new StringBuilder("Max Latency : ").
- append(maxLatency).
- append(" ms").toString());
- System.out.println("Completed the test......\n");
- }
-
- public void startTest() throws Exception
- {
- System.out.println("Starting test......");
- int count = params.getMsgCount();
-
- for(int i=0; i < count; i++ )
- {
- Message msg = getNextMessage();
- msg.setJMSTimestamp(System.currentTimeMillis());
- producer.send(msg);
- if ( transacted && ((i+1) % transSize == 0))
- {
- session.commit();
- }
- }
- Message msg = session.createTextMessage("End");
- producer.send(msg);
- if (params.isTransacted())
- {
- session.commit();
- }
- }
-
- public void tearDown() throws Exception
- {
- try
- {
- lock.lock();
- testCompleted.await();
- }
- finally
- {
- lock.unlock();
- }
-
- producer.close();
- consumer.close();
- session.close();
- con.close();
- }
-
- public void test()
- {
- try
- {
- setUp();
- warmup();
- startTest();
- tearDown();
- }
- catch(Exception e)
- {
- handleError(e,"Error when running test");
- }
- }
-
-
- public static void main(String[] args)
- {
- final LatencyTest latencyTest = new LatencyTest();
- Runnable r = new Runnable()
- {
- public void run()
- {
- latencyTest.test();
- latencyTest.printToConsole();
- if (System.getProperty("file") != null)
- {
- try
- {
- latencyTest.writeToFile();
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- }
- }
- };
-
- Thread t;
- try
- {
- t = Threading.getThreadFactory().createThread(r);
- }
- catch(Exception e)
- {
- throw new Error("Error creating latency test thread",e);
- }
- t.start();
- }
-}
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/MercuryBase.java b/java/tools/src/main/java/org/apache/qpid/tools/MercuryBase.java
new file mode 100644
index 0000000000..097b021b3e
--- /dev/null
+++ b/java/tools/src/main/java/org/apache/qpid/tools/MercuryBase.java
@@ -0,0 +1,191 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.net.InetAddress;
+import java.util.UUID;
+
+import javax.jms.Connection;
+import javax.jms.Destination;
+import javax.jms.MapMessage;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+
+import org.apache.qpid.client.AMQAnyDestination;
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.client.AMQSession_0_10;
+import org.apache.qpid.messaging.Address;
+import org.apache.qpid.tools.TestConfiguration.MessageType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MercuryBase
+{
+ private static final Logger _logger = LoggerFactory.getLogger(MercuryBase.class);
+
+ public final static String CODE = "CODE";
+ public final static String ID = "ID";
+ public final static String REPLY_ADDR = "REPLY_ADDR";
+ public final static String MAX_LATENCY = "MAX_LATENCY";
+ public final static String MIN_LATENCY = "MIN_LATENCY";
+ public final static String AVG_LATENCY = "AVG_LATENCY";
+ public final static String STD_DEV = "STD_DEV";
+ public final static String CONS_RATE = "CONS_RATE";
+ public final static String PROD_RATE = "PROD_RATE";
+ public final static String MSG_COUNT = "MSG_COUNT";
+ public final static String TIMESTAMP = "Timestamp";
+
+ String CONTROLLER_ADDR = System.getProperty("CONT_ADDR","CONTROLLER;{create: always, node:{x-declare:{auto-delete:true}}}");
+
+ TestConfiguration config;
+ Connection con;
+ Session session;
+ Session controllerSession;
+ Destination dest;
+ Destination myControlQueue;
+ Destination controllerQueue;
+ String id;
+ String myControlQueueAddr;
+
+ MessageProducer sendToController;
+ MessageConsumer receiveFromController;
+ String prefix = "";
+
+ enum OPCode
+ {
+ REGISTER_CONSUMER, REGISTER_PRODUCER,
+ PRODUCER_STARTWARMUP, CONSUMER_STARTWARMUP,
+ CONSUMER_READY, PRODUCER_READY,
+ PRODUCER_START,
+ RECEIVED_END_MSG, CONSUMER_STOP,
+ RECEIVED_PRODUCER_STATS, RECEIVED_CONSUMER_STATS,
+ CONTINUE_TEST, STOP_TEST
+ };
+
+ MessageType msgType = MessageType.BYTES;
+
+ public MercuryBase(TestConfiguration config,String prefix)
+ {
+ this.config = config;
+ String host = "";
+ try
+ {
+ host = InetAddress.getLocalHost().getHostName();
+ }
+ catch (Exception e)
+ {
+ }
+ id = host + "-" + UUID.randomUUID().toString();
+ this.prefix = prefix;
+ this.myControlQueueAddr = id + ";{create: always}";
+ }
+
+ public void setUp() throws Exception
+ {
+ con = config.createConnection();
+ con.start();
+
+ controllerSession = con.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+ dest = createDestination();
+ controllerQueue = AMQDestination.createDestination(CONTROLLER_ADDR);
+ myControlQueue = session.createQueue(myControlQueueAddr);
+ msgType = MessageType.getType(config.getMessageType());
+ _logger.debug("Using " + msgType + " messages");
+
+ sendToController = controllerSession.createProducer(controllerQueue);
+ receiveFromController = controllerSession.createConsumer(myControlQueue);
+ }
+
+ private Destination createDestination() throws Exception
+ {
+ if (config.isUseUniqueDests())
+ {
+ _logger.debug("Prefix : " + prefix);
+ Address addr = Address.parse(config.getAddress());
+ AMQDestination temp = (AMQDestination) AMQDestination.createDestination(config.getAddress());
+ int type = ((AMQSession_0_10)session).resolveAddressType(temp);
+
+ if ( type == AMQDestination.TOPIC_TYPE)
+ {
+ addr = new Address(addr.getName(),addr.getSubject() + "." + prefix,addr.getOptions());
+ System.out.println("Setting subject : " + addr);
+ }
+ else
+ {
+ addr = new Address(addr.getName() + "_" + prefix,addr.getSubject(),addr.getOptions());
+ System.out.println("Setting name : " + addr);
+ }
+
+ return AMQDestination.createDestination(addr.toString());
+ }
+ else
+ {
+ return AMQDestination.createDestination(config.getAddress());
+ }
+ }
+
+ public synchronized void sendMessageToController(MapMessage m) throws Exception
+ {
+ m.setString(ID, id);
+ m.setString(REPLY_ADDR,myControlQueueAddr);
+ sendToController.send(m);
+ }
+
+ public void receiveFromController(OPCode expected) throws Exception
+ {
+ MapMessage m = (MapMessage)receiveFromController.receive();
+ OPCode code = OPCode.values()[m.getInt(CODE)];
+ _logger.debug("Received Code : " + code);
+ if (expected != code)
+ {
+ throw new Exception("Expected OPCode : " + expected + " but received : " + code);
+ }
+
+ }
+
+ public boolean continueTest() throws Exception
+ {
+ MapMessage m = (MapMessage)receiveFromController.receive();
+ OPCode code = OPCode.values()[m.getInt(CODE)];
+ _logger.debug("Received Code : " + code);
+ return (code == OPCode.CONTINUE_TEST);
+ }
+
+ public void tearDown() throws Exception
+ {
+ session.close();
+ controllerSession.close();
+ con.close();
+ }
+
+ public void handleError(Exception e,String msg)
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.append(msg);
+ sb.append(" ");
+ sb.append(e.getMessage());
+ System.err.println(sb.toString());
+ e.printStackTrace();
+ }
+}
+
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/MercuryConsumerController.java b/java/tools/src/main/java/org/apache/qpid/tools/MercuryConsumerController.java
new file mode 100644
index 0000000000..b35adc45d6
--- /dev/null
+++ b/java/tools/src/main/java/org/apache/qpid/tools/MercuryConsumerController.java
@@ -0,0 +1,231 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.util.concurrent.CountDownLatch;
+
+import javax.jms.MapMessage;
+
+import org.apache.qpid.thread.Threading;
+import org.apache.qpid.tools.report.MercuryReporter;
+import org.apache.qpid.tools.report.MercuryReporter.MercuryThroughputAndLatency;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * PerfConsumer will receive x no of messages in warmup mode.
+ * Once it receives the Start message it will then signal the PerfProducer.
+ * It will start recording stats from the first message it receives after
+ * the warmup mode is done.
+ *
+ * The following calculations are done.
+ * The important numbers to look at is
+ * a) Avg Latency
+ * b) System throughput.
+ *
+ * Latency.
+ * =========
+ * Currently this test is written with the assumption that either
+ * a) The Perf Producer and Consumer are on the same machine
+ * b) They are on separate machines that have their time synced via a Time Server
+ *
+ * In order to calculate latency the producer inserts a timestamp
+ * when the message is sent. The consumer will note the current time the message is
+ * received and will calculate the latency as follows
+ * latency = rcvdTime - msg.getJMSTimestamp()
+ *
+ * Through out the test it will keep track of the max and min latency to show the
+ * variance in latencies.
+ *
+ * Avg latency is measured by adding all latencies and dividing by the total msgs.
+ *
+ * Throughput
+ * ===========
+ * Consumer rate is calculated as
+ * rcvdMsgCount/(rcvdTime - startTime)
+ *
+ * Note that the testStartTime referes to when the producer sent the first message
+ * and startTime is when the consumer first received a message.
+ *
+ * rcvdTime keeps track of when the last message is received.
+ *
+ * All throughput rates are given as msg/sec so the rates are multiplied by 1000.
+ *
+ */
+
+public class MercuryConsumerController extends MercuryBase
+{
+ private static final Logger _logger = LoggerFactory.getLogger(MercuryConsumerController.class);
+ MercuryReporter reporter;
+ TestConfiguration config;
+ QpidReceive receiver;
+
+ public MercuryConsumerController(TestConfiguration config, MercuryReporter reporter, String prefix)
+ {
+ super(config,prefix);
+ this.reporter = reporter;
+ if (_logger.isInfoEnabled())
+ {
+ _logger.info("Consumer ID : " + id);
+ }
+ }
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ receiver = new QpidReceive(reporter,config, con,dest);
+ receiver.setUp();
+ MapMessage m = controllerSession.createMapMessage();
+ m.setInt(CODE, OPCode.REGISTER_CONSUMER.ordinal());
+ sendMessageToController(m);
+ }
+
+ public void warmup()throws Exception
+ {
+ receiveFromController(OPCode.CONSUMER_STARTWARMUP);
+ receiver.waitforCompletion(config.getWarmupCount());
+
+ // It's more realistic for the consumer to signal this.
+ MapMessage m1 = controllerSession.createMapMessage();
+ m1.setInt(CODE, OPCode.PRODUCER_READY.ordinal());
+ sendMessageToController(m1);
+
+ MapMessage m2 = controllerSession.createMapMessage();
+ m2.setInt(CODE, OPCode.CONSUMER_READY.ordinal());
+ sendMessageToController(m2);
+ }
+
+ public void runReceiver() throws Exception
+ {
+ if (_logger.isInfoEnabled())
+ {
+ _logger.info("Consumer: " + id + " Starting iteration......" + "\n");
+ }
+ resetCounters();
+ receiver.waitforCompletion(config.getMsgCount());
+ MapMessage m = controllerSession.createMapMessage();
+ m.setInt(CODE, OPCode.RECEIVED_END_MSG.ordinal());
+ sendMessageToController(m);
+ }
+
+ public void resetCounters()
+ {
+ reporter.clear();
+ }
+
+ public void sendResults() throws Exception
+ {
+ receiveFromController(OPCode.CONSUMER_STOP);
+ reporter.report();
+
+ MapMessage m = controllerSession.createMapMessage();
+ m.setInt(CODE, OPCode.RECEIVED_CONSUMER_STATS.ordinal());
+ m.setDouble(AVG_LATENCY, reporter.getAvgLatency());
+ m.setDouble(MIN_LATENCY, reporter.getMinLatency());
+ m.setDouble(MAX_LATENCY, reporter.getMaxLatency());
+ m.setDouble(STD_DEV, reporter.getStdDev());
+ m.setDouble(CONS_RATE, reporter.getRate());
+ m.setLong(MSG_COUNT, reporter.getSampleSize());
+ sendMessageToController(m);
+
+ reporter.log(new StringBuilder("Total Msgs Received : ").append(reporter.getSampleSize()).toString());
+ reporter.log(new StringBuilder("Consumer rate : ").
+ append(config.getDecimalFormat().format(reporter.getRate())).
+ append(" msg/sec").toString());
+ reporter.log(new StringBuilder("Avg Latency : ").
+ append(config.getDecimalFormat().format(reporter.getAvgLatency())).
+ append(" ms").toString());
+ reporter.log(new StringBuilder("Min Latency : ").
+ append(config.getDecimalFormat().format(reporter.getMinLatency())).
+ append(" ms").toString());
+ reporter.log(new StringBuilder("Max Latency : ").
+ append(config.getDecimalFormat().format(reporter.getMaxLatency())).
+ append(" ms").toString());
+ if (config.isPrintStdDev())
+ {
+ reporter.log(new StringBuilder("Std Dev : ").
+ append(reporter.getStdDev()).toString());
+ }
+ }
+
+ public void run()
+ {
+ try
+ {
+ setUp();
+ warmup();
+ boolean nextIteration = true;
+ while (nextIteration)
+ {
+ System.out.println("=========================================================\n");
+ System.out.println("Consumer: " + id + " starting a new iteration ......\n");
+ runReceiver();
+ sendResults();
+ nextIteration = continueTest();
+ }
+ tearDown();
+ }
+ catch(Exception e)
+ {
+ handleError(e,"Error when running test");
+ }
+ }
+
+ @Override
+ public void tearDown() throws Exception
+ {
+ super.tearDown();
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ TestConfiguration config = new JVMArgConfiguration();
+ MercuryReporter reporter= new MercuryReporter(MercuryThroughputAndLatency.class,System.out,10,true);
+ String scriptId = (args.length == 1) ? args[0] : "";
+ int conCount = config.getConnectionCount();
+ final CountDownLatch testCompleted = new CountDownLatch(conCount);
+ for (int i=0; i < conCount; i++)
+ {
+ final MercuryConsumerController cons = new MercuryConsumerController(config, reporter, scriptId + i);
+ Runnable r = new Runnable()
+ {
+ public void run()
+ {
+ cons.run();
+ testCompleted.countDown();
+ }
+ };
+
+ Thread t;
+ try
+ {
+ t = Threading.getThreadFactory().createThread(r);
+ }
+ catch(Exception e)
+ {
+ throw new Error("Error creating consumer thread",e);
+ }
+ t.start();
+ }
+ testCompleted.await();
+ reporter.log("Consumers have completed the test......\n");
+ }
+} \ No newline at end of file
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/MercuryProducerController.java b/java/tools/src/main/java/org/apache/qpid/tools/MercuryProducerController.java
new file mode 100644
index 0000000000..02377bb853
--- /dev/null
+++ b/java/tools/src/main/java/org/apache/qpid/tools/MercuryProducerController.java
@@ -0,0 +1,210 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.util.concurrent.CountDownLatch;
+
+import javax.jms.MapMessage;
+
+import org.apache.qpid.thread.Threading;
+import org.apache.qpid.tools.report.MercuryReporter;
+import org.apache.qpid.tools.report.MercuryReporter.MercuryThroughput;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * PerfProducer sends an x no of messages in warmup mode and wait for a confirmation
+ * from the consumer that it has successfully consumed them and ready to start the
+ * test. It will start sending y no of messages and each message will contain a time
+ * stamp. This will be used at the receiving end to measure the latency.
+ *
+ * This is done with the assumption that both consumer and producer are running on
+ * the same machine or different machines which have time synced using a time server.
+ *
+ * This test also calculates the producer rate as follows.
+ * rate = msg_count/(time_before_sending_msgs - time_after_sending_msgs)
+ *
+ * All throughput rates are given as msg/sec so the rates are multiplied by 1000.
+ *
+ * Rajith - Producer rate is not an accurate perf metric IMO.
+ * It is heavily inlfuenced by any in memory buffering.
+ * System throughput and latencies calculated by the PerfConsumer are more realistic
+ * numbers.
+ *
+ * Answer by rajith : I agree about in memory buffering affecting rates. But Based on test runs
+ * I have done so far, it seems quite useful to compute the producer rate as it gives an
+ * indication of how the system behaves. For ex if there is a gap between producer and consumer rates
+ * you could clearly see the higher latencies and when producer and consumer rates are very close,
+ * latency is good.
+ *
+ */
+public class MercuryProducerController extends MercuryBase
+{
+ private static final Logger _logger = LoggerFactory.getLogger(MercuryProducerController.class);
+ MercuryReporter reporter;
+ QpidSend sender;
+
+ public MercuryProducerController(TestConfiguration config, MercuryReporter reporter, String prefix)
+ {
+ super(config,prefix);
+ this.reporter = reporter;
+ System.out.println("Producer ID : " + id);
+ }
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ sender = new QpidSend(reporter,config, con,dest);
+ sender.setUp();
+ MapMessage m = controllerSession.createMapMessage();
+ m.setInt(CODE, OPCode.REGISTER_PRODUCER.ordinal());
+ sendMessageToController(m);
+ }
+
+ public void warmup()throws Exception
+ {
+ receiveFromController(OPCode.PRODUCER_STARTWARMUP);
+ if (_logger.isInfoEnabled())
+ {
+ _logger.info("Producer: " + id + " Warming up......");
+ }
+ sender.send(config.getWarmupCount());
+ sender.sendEndMessage();
+ }
+
+ public void runSender() throws Exception
+ {
+ resetCounters();
+ receiveFromController(OPCode.PRODUCER_START);
+ sender.send(config.getMsgCount());
+ }
+
+ public void resetCounters()
+ {
+ sender.resetCounters();
+ }
+
+ public void sendResults() throws Exception
+ {
+ MapMessage msg = controllerSession.createMapMessage();
+ msg.setInt(CODE, OPCode.RECEIVED_PRODUCER_STATS.ordinal());
+ msg.setDouble(PROD_RATE, reporter.getRate());
+ sendMessageToController(msg);
+ reporter.log(new StringBuilder("Producer rate: ").
+ append(config.getDecimalFormat().format(reporter.getRate())).
+ append(" msg/sec").
+ toString());
+ }
+
+ @Override
+ public void tearDown() throws Exception
+ {
+ sender.tearDown();
+ super.tearDown();
+ }
+
+ public void run()
+ {
+ try
+ {
+ setUp();
+ warmup();
+ boolean nextIteration = true;
+ while (nextIteration)
+ {
+ if(_logger.isInfoEnabled())
+ {
+ _logger.info("=========================================================\n");
+ _logger.info("Producer: " + id + " starting a new iteration ......\n");
+ }
+ runSender();
+ sendResults();
+ nextIteration = continueTest();
+ }
+ tearDown();
+ }
+ catch(Exception e)
+ {
+ handleError(e,"Error when running test");
+ }
+ }
+
+ public void startControllerIfNeeded()
+ {
+ if (!config.isExternalController())
+ {
+ final MercuryTestController controller = new MercuryTestController(config);
+ Runnable r = new Runnable()
+ {
+ public void run()
+ {
+ controller.run();
+ }
+ };
+
+ Thread t;
+ try
+ {
+ t = Threading.getThreadFactory().createThread(r);
+ }
+ catch(Exception e)
+ {
+ throw new Error("Error creating controller thread",e);
+ }
+ t.start();
+ }
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ TestConfiguration config = new JVMArgConfiguration();
+ MercuryReporter reporter= new MercuryReporter(MercuryThroughput.class,System.out,10,true);
+ String scriptId = (args.length == 1) ? args[0] : "";
+ int conCount = config.getConnectionCount();
+ final CountDownLatch testCompleted = new CountDownLatch(conCount);
+ for (int i=0; i < conCount; i++)
+ {
+ final MercuryProducerController prod = new MercuryProducerController(config, reporter, scriptId + i);
+ prod.startControllerIfNeeded();
+ Runnable r = new Runnable()
+ {
+ public void run()
+ {
+ prod.run();
+ testCompleted.countDown();
+ }
+ };
+
+ Thread t;
+ try
+ {
+ t = Threading.getThreadFactory().createThread(r);
+ }
+ catch(Exception e)
+ {
+ throw new Error("Error creating producer thread",e);
+ }
+ t.start();
+ }
+ testCompleted.await();
+ reporter.log("Producers have completed the test......");
+ }
+} \ No newline at end of file
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/MercuryTestController.java b/java/tools/src/main/java/org/apache/qpid/tools/MercuryTestController.java
new file mode 100644
index 0000000000..8c66a1e44d
--- /dev/null
+++ b/java/tools/src/main/java/org/apache/qpid/tools/MercuryTestController.java
@@ -0,0 +1,450 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.io.FileWriter;
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CountDownLatch;
+
+import javax.jms.MapMessage;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.MessageProducer;
+
+import org.apache.qpid.client.message.AMQPEncodedMapMessage;
+import org.apache.qpid.tools.report.Reporter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The Controller coordinates a test run between a number
+ * of producers and consumers, configured via -Dprod_count and -Dcons_count.
+ *
+ * It waits till all the producers and consumers have registered and then
+ * conducts a warmup run. Once all consumers and producers have completed
+ * the warmup run and is ready, it will conduct the actual test run and
+ * collect all stats from the participants and calculates the system
+ * throughput, the avg/min/max for producer rates, consumer rates and latency.
+ *
+ * These stats are then printed to std out.
+ * The Controller also prints events to std out to give a running account
+ * of the test run in progress. Ex registering of participants, starting warmup ..etc.
+ * This allows a scripting tool to monitor the progress.
+ *
+ * The Controller can be run in two modes.
+ * 1. A single test run (default) where it just runs until the message count specified
+ * for the producers via -Dmsg_count is sent and received.
+ *
+ * 2. Time based, configured via -Dduration=x, where x is in mins.
+ * In this mode, the Controller repeatedly cycles through the tests (after an initial
+ * warmup run) until the desired time is reached. If a test run is in progress
+ * and the time is up, it will allow the run the complete.
+ *
+ * After each iteration, the stats will be printed out in csv format to a separate log file.
+ * System throughput is calculated as follows
+ * totalMsgCount/(totalTestTime)
+ */
+public class MercuryTestController extends MercuryBase implements MessageListener
+{
+ private static final Logger _logger = LoggerFactory.getLogger(MercuryProducerController.class);
+
+ enum TestMode { SINGLE_RUN, TIME_BASED };
+
+ TestMode testMode = TestMode.SINGLE_RUN;
+
+ long totalTestTime;
+
+ private double avgSystemLatency = 0.0;
+ private double minSystemLatency = Double.MAX_VALUE;
+ private double maxSystemLatency = 0;
+ private double avgSystemLatencyStdDev = 0.0;
+
+ private double avgSystemConsRate = 0.0;
+ private double maxSystemConsRate = 0.0;
+ private double minSystemConsRate = Double.MAX_VALUE;
+
+ private double avgSystemProdRate = 0.0;
+ private double maxSystemProdRate = 0.0;
+ private double minSystemProdRate = Double.MAX_VALUE;
+
+ private long totalMsgCount = 0;
+ private double totalSystemThroughput = 0.0;
+
+ private int consumerCount = Integer.getInteger("cons_count", 1);
+ private int producerCount = Integer.getInteger("prod_count", 1);
+ private int duration = Integer.getInteger("duration", -1); // in mins
+ private Map<String,MapMessage> consumers;
+ private Map<String,MapMessage> producers;
+
+ private CountDownLatch consRegistered;
+ private CountDownLatch prodRegistered;
+ private CountDownLatch consReady;
+ private CountDownLatch prodReady;
+ private CountDownLatch receivedEndMsg;
+ private CountDownLatch receivedConsStats;
+ private CountDownLatch receivedProdStats;
+
+ private MessageConsumer consumer;
+ private boolean printStdDev = false;
+ private FileWriter writer;
+ private Reporter report;
+
+ public MercuryTestController(TestConfiguration config)
+ {
+ super(config,"");
+
+ consumers = new ConcurrentHashMap<String,MapMessage>(consumerCount);
+ producers = new ConcurrentHashMap<String,MapMessage>(producerCount);
+
+ consRegistered = new CountDownLatch(consumerCount);
+ prodRegistered = new CountDownLatch(producerCount);
+ consReady = new CountDownLatch(consumerCount);
+ prodReady = new CountDownLatch(producerCount);
+ printStdDev = config.isPrintStdDev();
+ testMode = (duration == -1) ? TestMode.SINGLE_RUN : TestMode.TIME_BASED;
+ }
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ if (testMode == TestMode.TIME_BASED)
+ {
+ writer = new FileWriter("stats-csv.log");
+ }
+ consumer = controllerSession.createConsumer(controllerQueue);
+ report.log("\nController: " + producerCount + " producers are expected");
+ report.log("Controller: " + consumerCount + " consumers are expected \n");
+ consumer.setMessageListener(this);
+ consRegistered.await();
+ prodRegistered.await();
+ report.log("\nController: All producers and consumers have registered......\n");
+ }
+
+ public void warmup() throws Exception
+ {
+ report.log("Controller initiating warm up sequence......");
+ sendMessageToNodes(OPCode.CONSUMER_STARTWARMUP,consumers.values());
+ sendMessageToNodes(OPCode.PRODUCER_STARTWARMUP,producers.values());
+ prodReady.await();
+ consReady.await();
+ report.log("\nController : All producers and consumers are ready to start the test......\n");
+ }
+
+ public void startTest() throws Exception
+ {
+ resetCounters();
+ report.log("\nController Starting test......");
+ long start = Clock.getTime();
+ sendMessageToNodes(OPCode.PRODUCER_START,producers.values());
+ receivedEndMsg.await();
+ totalTestTime = Clock.getTime() - start;
+ sendMessageToNodes(OPCode.CONSUMER_STOP,consumers.values());
+ receivedProdStats.await();
+ receivedConsStats.await();
+ }
+
+ public void resetCounters()
+ {
+ minSystemLatency = Double.MAX_VALUE;
+ maxSystemLatency = 0;
+ maxSystemConsRate = 0.0;
+ minSystemConsRate = Double.MAX_VALUE;
+ maxSystemProdRate = 0.0;
+ minSystemProdRate = Double.MAX_VALUE;
+
+ totalMsgCount = 0;
+
+ receivedConsStats = new CountDownLatch(consumerCount);
+ receivedProdStats = new CountDownLatch(producerCount);
+ receivedEndMsg = new CountDownLatch(producerCount);
+ }
+
+ public void calcStats() throws Exception
+ {
+ double totLatency = 0.0;
+ double totStdDev = 0.0;
+ double totalConsRate = 0.0;
+ double totalProdRate = 0.0;
+
+ MapMessage conStat = null; // for error handling
+ try
+ {
+ for (MapMessage m: consumers.values())
+ {
+ conStat = m;
+ minSystemLatency = Math.min(minSystemLatency,m.getDouble(MIN_LATENCY));
+ maxSystemLatency = Math.max(maxSystemLatency,m.getDouble(MAX_LATENCY));
+ totLatency = totLatency + m.getDouble(AVG_LATENCY);
+ totStdDev = totStdDev + m.getDouble(STD_DEV);
+
+ minSystemConsRate = Math.min(minSystemConsRate,m.getDouble(CONS_RATE));
+ maxSystemConsRate = Math.max(maxSystemConsRate,m.getDouble(CONS_RATE));
+ totalConsRate = totalConsRate + m.getDouble(CONS_RATE);
+
+ totalMsgCount = totalMsgCount + m.getLong(MSG_COUNT);
+ }
+ }
+ catch(Exception e)
+ {
+ System.err.println("Error calculating stats from Consumer : " + conStat);
+ }
+
+
+ MapMessage prodStat = null; // for error handling
+ try
+ {
+ for (MapMessage m: producers.values())
+ {
+ prodStat = m;
+ minSystemProdRate = Math.min(minSystemProdRate,m.getDouble(PROD_RATE));
+ maxSystemProdRate = Math.max(maxSystemProdRate,m.getDouble(PROD_RATE));
+ totalProdRate = totalProdRate + m.getDouble(PROD_RATE);
+ }
+ }
+ catch(Exception e)
+ {
+ System.err.println("Error calculating stats from Producer : " + conStat);
+ }
+
+ avgSystemLatency = totLatency/consumers.size();
+ avgSystemLatencyStdDev = totStdDev/consumers.size();
+ avgSystemConsRate = totalConsRate/consumers.size();
+ avgSystemProdRate = totalProdRate/producers.size();
+
+ report.log("Total test time : " + totalTestTime + " in " + Clock.getPrecision());
+
+ totalSystemThroughput = (totalMsgCount*Clock.convertToSecs()/totalTestTime);
+ }
+
+ public void printResults() throws Exception
+ {
+ report.log(new StringBuilder("Total Msgs Received : ").append(totalMsgCount).toString());
+ report.log(new StringBuilder("System Throughput : ").
+ append(config.getDecimalFormat().format(totalSystemThroughput)).
+ append(" msg/sec").toString());
+ report.log(new StringBuilder("Avg Consumer rate : ").
+ append(config.getDecimalFormat().format(avgSystemConsRate)).
+ append(" msg/sec").toString());
+ report.log(new StringBuilder("Min Consumer rate : ").
+ append(config.getDecimalFormat().format(minSystemConsRate)).
+ append(" msg/sec").toString());
+ report.log(new StringBuilder("Max Consumer rate : ").
+ append(config.getDecimalFormat().format(maxSystemConsRate)).
+ append(" msg/sec").toString());
+
+ report.log(new StringBuilder("Avg Producer rate : ").
+ append(config.getDecimalFormat().format(avgSystemProdRate)).
+ append(" msg/sec").toString());
+ report.log(new StringBuilder("Min Producer rate : ").
+ append(config.getDecimalFormat().format(minSystemProdRate)).
+ append(" msg/sec").toString());
+ report.log(new StringBuilder("Max Producer rate : ").
+ append(config.getDecimalFormat().format(maxSystemProdRate)).
+ append(" msg/sec").toString());
+
+ report.log(new StringBuilder("Avg System Latency : ").
+ append(config.getDecimalFormat().format(avgSystemLatency)).
+ append(" ms").toString());
+ report.log(new StringBuilder("Min System Latency : ").
+ append(config.getDecimalFormat().format(minSystemLatency)).
+ append(" ms").toString());
+ report.log(new StringBuilder("Max System Latency : ").
+ append(config.getDecimalFormat().format(maxSystemLatency)).
+ append(" ms").toString());
+ if (printStdDev)
+ {
+ report.log(new StringBuilder("Avg System Std Dev : ").
+ append(avgSystemLatencyStdDev).toString());
+ }
+ }
+
+ private synchronized void sendMessageToNodes(OPCode code,Collection<MapMessage> nodes) throws Exception
+ {
+ report.log("\nController: Sending code " + code);
+ MessageProducer tmpProd = controllerSession.createProducer(null);
+ MapMessage msg = controllerSession.createMapMessage();
+ msg.setInt(CODE, code.ordinal());
+ for (MapMessage node : nodes)
+ {
+ if (node.getString(REPLY_ADDR) == null)
+ {
+ report.log("REPLY_ADDR is null " + node);
+ }
+ else
+ {
+ report.log("Controller: Sending " + code + " to " + node.getString(REPLY_ADDR));
+ }
+ tmpProd.send(controllerSession.createQueue(node.getString(REPLY_ADDR)), msg);
+ }
+ }
+
+ public void onMessage(Message msg)
+ {
+ try
+ {
+ MapMessage m = (MapMessage)msg;
+ OPCode code = OPCode.values()[m.getInt(CODE)];
+
+ report.log("\n---------Controller Received Code : " + code);
+ report.log("---------Data : " + ((AMQPEncodedMapMessage)m).getMap());
+
+ switch (code)
+ {
+ case REGISTER_CONSUMER :
+ if (consRegistered.getCount() == 0)
+ {
+ report.log("Warning : Expected number of consumers have already registered," +
+ "ignoring extra consumer");
+ break;
+ }
+ consumers.put(m.getString(ID),m);
+ consRegistered.countDown();
+ break;
+
+ case REGISTER_PRODUCER :
+ if (prodRegistered.getCount() == 0)
+ {
+ report.log("Warning : Expected number of producers have already registered," +
+ "ignoring extra producer");
+ break;
+ }
+ producers.put(m.getString(ID),m);
+ prodRegistered.countDown();
+ break;
+
+ case CONSUMER_READY :
+ consReady.countDown();
+ break;
+
+ case PRODUCER_READY :
+ prodReady.countDown();
+ break;
+
+ case RECEIVED_END_MSG :
+ receivedEndMsg.countDown();
+ break;
+
+ case RECEIVED_CONSUMER_STATS :
+ consumers.put(m.getString(ID),m);
+ receivedConsStats.countDown();
+ break;
+
+ case RECEIVED_PRODUCER_STATS :
+ producers.put(m.getString(ID),m);
+ receivedProdStats.countDown();
+ break;
+
+ default:
+ throw new Exception("Invalid OPCode " + code);
+ }
+ }
+ catch (Exception e)
+ {
+ handleError(e,"Error when receiving messages " + msg);
+ }
+ }
+
+ public void run()
+ {
+ try
+ {
+ setUp();
+ warmup();
+ if (testMode == TestMode.SINGLE_RUN)
+ {
+ startTest();
+ calcStats();
+ printResults();
+ }
+ else
+ {
+ long startTime = Clock.getTime();
+ long timeLimit = duration * 60 * 1000; // duration is in mins.
+ boolean nextIteration = true;
+ while (nextIteration)
+ {
+ startTest();
+ calcStats();
+ writeStatsToFile();
+ if (Clock.getTime() - startTime < timeLimit)
+ {
+ sendMessageToNodes(OPCode.CONTINUE_TEST,consumers.values());
+ sendMessageToNodes(OPCode.CONTINUE_TEST,producers.values());
+ nextIteration = true;
+ }
+ else
+ {
+ nextIteration = false;
+ }
+ }
+ }
+ tearDown();
+
+ }
+ catch(Exception e)
+ {
+ handleError(e,"Error when running test");
+ }
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ report.log("Controller: Completed the test......\n");
+ if (testMode == TestMode.TIME_BASED)
+ {
+ writer.close();
+ }
+ sendMessageToNodes(OPCode.STOP_TEST,consumers.values());
+ sendMessageToNodes(OPCode.STOP_TEST,producers.values());
+ super.tearDown();
+ }
+
+ public void writeStatsToFile() throws Exception
+ {
+ writer.append(String.valueOf(totalMsgCount)).append(",");
+ writer.append(config.getDecimalFormat().format(totalSystemThroughput)).append(",");
+ writer.append(config.getDecimalFormat().format(avgSystemConsRate)).append(",");
+ writer.append(config.getDecimalFormat().format(minSystemConsRate)).append(",");
+ writer.append(config.getDecimalFormat().format(maxSystemConsRate)).append(",");
+ writer.append(config.getDecimalFormat().format(avgSystemProdRate)).append(",");
+ writer.append(config.getDecimalFormat().format(minSystemProdRate)).append(",");
+ writer.append(config.getDecimalFormat().format(maxSystemProdRate)).append(",");
+ writer.append(config.getDecimalFormat().format(avgSystemLatency)).append(",");
+ writer.append(config.getDecimalFormat().format(minSystemLatency)).append(",");
+ writer.append(config.getDecimalFormat().format(maxSystemLatency));
+ if (printStdDev)
+ {
+ writer.append(",").append(String.valueOf(avgSystemLatencyStdDev));
+ }
+ writer.append("\n");
+ writer.flush();
+ }
+
+ public static void main(String[] args)
+ {
+ TestConfiguration config = new JVMArgConfiguration();
+ MercuryTestController controller = new MercuryTestController(config);
+ controller.run();
+ }
+}
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/PerfBase.java b/java/tools/src/main/java/org/apache/qpid/tools/PerfBase.java
deleted file mode 100644
index 121e94cea1..0000000000
--- a/java/tools/src/main/java/org/apache/qpid/tools/PerfBase.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.tools;
-
-import java.net.InetAddress;
-import java.text.DecimalFormat;
-import java.util.UUID;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.MapMessage;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-import org.apache.qpid.client.AMQAnyDestination;
-import org.apache.qpid.client.AMQConnection;
-import org.apache.qpid.client.AMQDestination;
-import org.apache.qpid.client.AMQSession_0_10;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.messaging.Address;
-
-public class PerfBase
-{
- public final static String CODE = "CODE";
- public final static String ID = "ID";
- public final static String REPLY_ADDR = "REPLY_ADDR";
- public final static String MAX_LATENCY = "MAX_LATENCY";
- public final static String MIN_LATENCY = "MIN_LATENCY";
- public final static String AVG_LATENCY = "AVG_LATENCY";
- public final static String STD_DEV = "STD_DEV";
- public final static String CONS_RATE = "CONS_RATE";
- public final static String PROD_RATE = "PROD_RATE";
- public final static String MSG_COUNT = "MSG_COUNT";
- public final static String TIMESTAMP = "Timestamp";
-
- String CONTROLLER_ADDR = System.getProperty("CONT_ADDR","CONTROLLER;{create: always, node:{x-declare:{auto-delete:true}}}");
-
- TestParams params;
- Connection con;
- Session session;
- Session controllerSession;
- Destination dest;
- Destination myControlQueue;
- Destination controllerQueue;
- DecimalFormat df = new DecimalFormat("###.##");
- String id;
- String myControlQueueAddr;
-
- MessageProducer sendToController;
- MessageConsumer receiveFromController;
- String prefix = "";
-
- enum OPCode {
- REGISTER_CONSUMER, REGISTER_PRODUCER,
- PRODUCER_STARTWARMUP, CONSUMER_STARTWARMUP,
- CONSUMER_READY, PRODUCER_READY,
- PRODUCER_START,
- RECEIVED_END_MSG, CONSUMER_STOP,
- RECEIVED_PRODUCER_STATS, RECEIVED_CONSUMER_STATS,
- CONTINUE_TEST, STOP_TEST
- };
-
- enum MessageType {
- BYTES, TEXT, MAP, OBJECT;
-
- public static MessageType getType(String s) throws Exception
- {
- if ("text".equalsIgnoreCase(s))
- {
- return TEXT;
- }
- else if ("bytes".equalsIgnoreCase(s))
- {
- return BYTES;
- }
- /*else if ("map".equalsIgnoreCase(s))
- {
- return MAP;
- }
- else if ("object".equalsIgnoreCase(s))
- {
- return OBJECT;
- }*/
- else
- {
- throw new Exception("Unsupported message type");
- }
- }
- };
-
- MessageType msgType = MessageType.BYTES;
-
- public PerfBase(String prefix)
- {
- params = new TestParams();
- String host = "";
- try
- {
- host = InetAddress.getLocalHost().getHostName();
- }
- catch (Exception e)
- {
- }
- id = host + "-" + UUID.randomUUID().toString();
- this.prefix = prefix;
- this.myControlQueueAddr = id + ";{create: always}";
- }
-
- public void setUp() throws Exception
- {
- if (params.getHost().equals("") || params.getPort() == -1)
- {
- con = new AMQConnection(params.getUrl());
- }
- else
- {
- con = new AMQConnection(params.getHost(),params.getPort(),"guest","guest","test","test");
- }
- con.start();
- session = con.createSession(params.isTransacted(),
- params.isTransacted()? Session.SESSION_TRANSACTED:params.getAckMode());
-
- controllerSession = con.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- dest = createDestination();
- controllerQueue = new AMQAnyDestination(CONTROLLER_ADDR);
- myControlQueue = session.createQueue(myControlQueueAddr);
- msgType = MessageType.getType(params.getMessageType());
- System.out.println("Using " + msgType + " messages");
-
- sendToController = controllerSession.createProducer(controllerQueue);
- receiveFromController = controllerSession.createConsumer(myControlQueue);
- }
-
- private Destination createDestination() throws Exception
- {
- if (params.isUseUniqueDests())
- {
- System.out.println("Prefix : " + prefix);
- Address addr = Address.parse(params.getAddress());
- AMQAnyDestination temp = new AMQAnyDestination(params.getAddress());
- int type = ((AMQSession_0_10)session).resolveAddressType(temp);
-
- if ( type == AMQDestination.TOPIC_TYPE)
- {
- addr = new Address(addr.getName(),addr.getSubject() + "." + prefix,addr.getOptions());
- System.out.println("Setting subject : " + addr);
- }
- else
- {
- addr = new Address(addr.getName() + "_" + prefix,addr.getSubject(),addr.getOptions());
- System.out.println("Setting name : " + addr);
- }
-
- return new AMQAnyDestination(addr);
- }
- else
- {
- return new AMQAnyDestination(params.getAddress());
- }
- }
-
- public synchronized void sendMessageToController(MapMessage m) throws Exception
- {
- m.setString(ID, id);
- m.setString(REPLY_ADDR,myControlQueueAddr);
- sendToController.send(m);
- }
-
- public void receiveFromController(OPCode expected) throws Exception
- {
- MapMessage m = (MapMessage)receiveFromController.receive();
- OPCode code = OPCode.values()[m.getInt(CODE)];
- System.out.println("Received Code : " + code);
- if (expected != code)
- {
- throw new Exception("Expected OPCode : " + expected + " but received : " + code);
- }
-
- }
-
- public boolean continueTest() throws Exception
- {
- MapMessage m = (MapMessage)receiveFromController.receive();
- OPCode code = OPCode.values()[m.getInt(CODE)];
- System.out.println("Received Code : " + code);
- return (code == OPCode.CONTINUE_TEST);
- }
-
- public void tearDown() throws Exception
- {
- session.close();
- controllerSession.close();
- con.close();
- }
-
- public void handleError(Exception e,String msg)
- {
- StringBuilder sb = new StringBuilder();
- sb.append(msg);
- sb.append(" ");
- sb.append(e.getMessage());
- System.err.println(sb.toString());
- e.printStackTrace();
- }
-}
-
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/PerfConsumer.java b/java/tools/src/main/java/org/apache/qpid/tools/PerfConsumer.java
deleted file mode 100644
index b63892bb51..0000000000
--- a/java/tools/src/main/java/org/apache/qpid/tools/PerfConsumer.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.tools;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-
-import javax.jms.MapMessage;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.TextMessage;
-
-import org.apache.qpid.client.AMQDestination;
-import org.apache.qpid.thread.Threading;
-
-/**
- * PerfConsumer will receive x no of messages in warmup mode.
- * Once it receives the Start message it will then signal the PerfProducer.
- * It will start recording stats from the first message it receives after
- * the warmup mode is done.
- *
- * The following calculations are done.
- * The important numbers to look at is
- * a) Avg Latency
- * b) System throughput.
- *
- * Latency.
- * =========
- * Currently this test is written with the assumption that either
- * a) The Perf Producer and Consumer are on the same machine
- * b) They are on separate machines that have their time synced via a Time Server
- *
- * In order to calculate latency the producer inserts a timestamp
- * when the message is sent. The consumer will note the current time the message is
- * received and will calculate the latency as follows
- * latency = rcvdTime - msg.getJMSTimestamp()
- *
- * Through out the test it will keep track of the max and min latency to show the
- * variance in latencies.
- *
- * Avg latency is measured by adding all latencies and dividing by the total msgs.
- *
- * Throughput
- * ===========
- * Consumer rate is calculated as
- * rcvdMsgCount/(rcvdTime - startTime)
- *
- * Note that the testStartTime referes to when the producer sent the first message
- * and startTime is when the consumer first received a message.
- *
- * rcvdTime keeps track of when the last message is received.
- *
- * All throughput rates are given as msg/sec so the rates are multiplied by 1000.
- *
- */
-
-public class PerfConsumer extends PerfBase implements MessageListener
-{
- MessageConsumer consumer;
- long maxLatency = 0;
- long minLatency = Long.MAX_VALUE;
- long totalLatency = 0; // to calculate avg latency.
- int rcvdMsgCount = 0;
- long startTime = 0; // to measure consumer throughput
- long rcvdTime = 0;
- boolean transacted = false;
- int transSize = 0;
-
- boolean printStdDev = false;
- List<Long> sample;
-
- final Object lock = new Object();
-
- public PerfConsumer(String prefix)
- {
- super(prefix);
- System.out.println("Consumer ID : " + id);
- }
-
- public void setUp() throws Exception
- {
- super.setUp();
- consumer = session.createConsumer(dest);
- System.out.println("Consumer: " + id + " Receiving messages from : " + ((AMQDestination)dest).getQueueName() + "\n");
-
- // Storing the following two for efficiency
- transacted = params.isTransacted();
- transSize = params.getTransactionSize();
- printStdDev = params.isPrintStdDev();
- MapMessage m = controllerSession.createMapMessage();
- m.setInt(CODE, OPCode.REGISTER_CONSUMER.ordinal());
- sendMessageToController(m);
- }
-
- public void warmup()throws Exception
- {
- receiveFromController(OPCode.CONSUMER_STARTWARMUP);
- Message msg = consumer.receive();
- // This is to ensure we drain the queue before we start the actual test.
- while ( msg != null)
- {
- if (msg.getBooleanProperty("End") == true)
- {
- // It's more realistic for the consumer to signal this.
- MapMessage m = controllerSession.createMapMessage();
- m.setInt(CODE, OPCode.PRODUCER_READY.ordinal());
- sendMessageToController(m);
- }
- msg = consumer.receive(1000);
- }
-
- if (params.isTransacted())
- {
- session.commit();
- }
-
- MapMessage m = controllerSession.createMapMessage();
- m.setInt(CODE, OPCode.CONSUMER_READY.ordinal());
- sendMessageToController(m);
- consumer.setMessageListener(this);
- }
-
- public void startTest() throws Exception
- {
- System.out.println("Consumer: " + id + " Starting test......" + "\n");
- resetCounters();
- }
-
- public void resetCounters()
- {
- rcvdMsgCount = 0;
- maxLatency = 0;
- minLatency = Long.MAX_VALUE;
- totalLatency = 0;
- if (printStdDev)
- {
- sample = null;
- sample = new ArrayList<Long>(params.getMsgCount());
- }
- }
-
- public void sendResults() throws Exception
- {
- receiveFromController(OPCode.CONSUMER_STOP);
-
- double avgLatency = (double)totalLatency/(double)rcvdMsgCount;
- double consRate = (double)rcvdMsgCount*Clock.convertToSecs()/(double)(rcvdTime - startTime);
- double stdDev = 0.0;
- if (printStdDev)
- {
- stdDev = calculateStdDev(avgLatency);
- }
- MapMessage m = controllerSession.createMapMessage();
- m.setInt(CODE, OPCode.RECEIVED_CONSUMER_STATS.ordinal());
- m.setDouble(AVG_LATENCY, avgLatency/Clock.convertToMiliSecs());
- m.setDouble(MIN_LATENCY,minLatency/Clock.convertToMiliSecs());
- m.setDouble(MAX_LATENCY,maxLatency/Clock.convertToMiliSecs());
- m.setDouble(STD_DEV, stdDev/Clock.convertToMiliSecs());
- m.setDouble(CONS_RATE, consRate);
- m.setLong(MSG_COUNT, rcvdMsgCount);
- sendMessageToController(m);
-
- System.out.println(new StringBuilder("Total Msgs Received : ").append(rcvdMsgCount).toString());
- System.out.println(new StringBuilder("Consumer rate : ").
- append(df.format(consRate)).
- append(" msg/sec").toString());
- System.out.println(new StringBuilder("Avg Latency : ").
- append(df.format(avgLatency/Clock.convertToMiliSecs())).
- append(" ms").toString());
- System.out.println(new StringBuilder("Min Latency : ").
- append(df.format(minLatency/Clock.convertToMiliSecs())).
- append(" ms").toString());
- System.out.println(new StringBuilder("Max Latency : ").
- append(df.format(maxLatency/Clock.convertToMiliSecs())).
- append(" ms").toString());
- if (printStdDev)
- {
- System.out.println(new StringBuilder("Std Dev : ").
- append(stdDev/Clock.convertToMiliSecs()).toString());
- }
- }
-
- public double calculateStdDev(double mean)
- {
- double v = 0;
- for (double latency: sample)
- {
- v = v + Math.pow((latency-mean), 2);
- }
- v = v/sample.size();
- return Math.round(Math.sqrt(v));
- }
-
- public void onMessage(Message msg)
- {
- try
- {
- // To figure out the decoding overhead of text
- if (msgType == MessageType.TEXT)
- {
- ((TextMessage)msg).getText();
- }
-
- if (msg.getBooleanProperty("End"))
- {
- MapMessage m = controllerSession.createMapMessage();
- m.setInt(CODE, OPCode.RECEIVED_END_MSG.ordinal());
- sendMessageToController(m);
- }
- else
- {
- rcvdTime = Clock.getTime();
- rcvdMsgCount ++;
-
- if (rcvdMsgCount == 1)
- {
- startTime = rcvdTime;
- }
-
- if (transacted && (rcvdMsgCount % transSize == 0))
- {
- session.commit();
- }
-
- long latency = rcvdTime - msg.getLongProperty(TIMESTAMP);
- maxLatency = Math.max(maxLatency, latency);
- minLatency = Math.min(minLatency, latency);
- totalLatency = totalLatency + latency;
- if (printStdDev)
- {
- sample.add(latency);
- }
- }
-
- }
- catch(Exception e)
- {
- handleError(e,"Error when receiving messages");
- }
-
- }
-
- public void run()
- {
- try
- {
- setUp();
- warmup();
- boolean nextIteration = true;
- while (nextIteration)
- {
- System.out.println("=========================================================\n");
- System.out.println("Consumer: " + id + " starting a new iteration ......\n");
- startTest();
- sendResults();
- nextIteration = continueTest();
- }
- tearDown();
- }
- catch(Exception e)
- {
- handleError(e,"Error when running test");
- }
- }
-
- @Override
- public void tearDown() throws Exception
- {
- super.tearDown();
- }
-
- public static void main(String[] args) throws InterruptedException
- {
- String scriptId = (args.length == 1) ? args[0] : "";
- int conCount = Integer.getInteger("con_count",1);
- final CountDownLatch testCompleted = new CountDownLatch(conCount);
- for (int i=0; i < conCount; i++)
- {
-
- final PerfConsumer cons = new PerfConsumer(scriptId + i);
- Runnable r = new Runnable()
- {
- public void run()
- {
- cons.run();
- testCompleted.countDown();
- }
- };
-
- Thread t;
- try
- {
- t = Threading.getThreadFactory().createThread(r);
- }
- catch(Exception e)
- {
- throw new Error("Error creating consumer thread",e);
- }
- t.start();
-
- }
- testCompleted.await();
- System.out.println("Consumers have completed the test......\n");
- }
-} \ No newline at end of file
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/PerfProducer.java b/java/tools/src/main/java/org/apache/qpid/tools/PerfProducer.java
deleted file mode 100644
index ac6129ab68..0000000000
--- a/java/tools/src/main/java/org/apache/qpid/tools/PerfProducer.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.tools;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.CountDownLatch;
-
-import javax.jms.BytesMessage;
-import javax.jms.DeliveryMode;
-import javax.jms.MapMessage;
-import javax.jms.Message;
-import javax.jms.MessageProducer;
-
-import org.apache.qpid.client.AMQDestination;
-import org.apache.qpid.thread.Threading;
-
-/**
- * PerfProducer sends an x no of messages in warmup mode and wait for a confirmation
- * from the consumer that it has successfully consumed them and ready to start the
- * test. It will start sending y no of messages and each message will contain a time
- * stamp. This will be used at the receiving end to measure the latency.
- *
- * This is done with the assumption that both consumer and producer are running on
- * the same machine or different machines which have time synced using a time server.
- *
- * This test also calculates the producer rate as follows.
- * rate = msg_count/(time_before_sending_msgs - time_after_sending_msgs)
- *
- * All throughput rates are given as msg/sec so the rates are multiplied by 1000.
- *
- * Rajith - Producer rate is not an accurate perf metric IMO.
- * It is heavily inlfuenced by any in memory buffering.
- * System throughput and latencies calculated by the PerfConsumer are more realistic
- * numbers.
- *
- * Answer by rajith : I agree about in memory buffering affecting rates. But Based on test runs
- * I have done so far, it seems quite useful to compute the producer rate as it gives an
- * indication of how the system behaves. For ex if there is a gap between producer and consumer rates
- * you could clearly see the higher latencies and when producer and consumer rates are very close,
- * latency is good.
- *
- */
-public class PerfProducer extends PerfBase
-{
- private static long SEC = 60000;
-
- MessageProducer producer;
- Message msg;
- Object payload;
- List<Object> payloads;
- boolean cacheMsg = false;
- boolean randomMsgSize = false;
- boolean durable = false;
- Random random;
- int msgSizeRange = 1024;
- boolean rateLimitProducer = false;
- double rateFactor = 0.4;
- double rate = 0.0;
-
- public PerfProducer(String prefix)
- {
- super(prefix);
- System.out.println("Producer ID : " + id);
- }
-
- public void setUp() throws Exception
- {
- super.setUp();
- durable = params.isDurable();
- rateLimitProducer = params.getRate() > 0 ? true : false;
- if (rateLimitProducer)
- {
- System.out.println("The test will attempt to limit the producer to " + params.getRate() + " msg/sec");
- }
-
- // if message caching is enabled we pre create the message
- // else we pre create the payload
- if (params.isCacheMessage())
- {
- cacheMsg = true;
- msg = createMessage(createPayload(params.getMsgSize()));
- msg.setJMSDeliveryMode(durable?
- DeliveryMode.PERSISTENT :
- DeliveryMode.NON_PERSISTENT
- );
- }
- else if (params.isRandomMsgSize())
- {
- random = new Random(20080921);
- randomMsgSize = true;
- msgSizeRange = params.getMsgSize();
- payloads = new ArrayList<Object>(msgSizeRange);
-
- for (int i=0; i < msgSizeRange; i++)
- {
- payloads.add(createPayload(i));
- }
- }
- else
- {
- payload = createPayload(params.getMsgSize());
- }
-
- producer = session.createProducer(dest);
- System.out.println("Producer: " + id + " Sending messages to: " + ((AMQDestination)dest).getQueueName());
- producer.setDisableMessageID(params.isDisableMessageID());
- producer.setDisableMessageTimestamp(params.isDisableTimestamp());
-
- MapMessage m = controllerSession.createMapMessage();
- m.setInt(CODE, OPCode.REGISTER_PRODUCER.ordinal());
- sendMessageToController(m);
- }
-
- Object createPayload(int size)
- {
- if (msgType == MessageType.TEXT)
- {
- return MessageFactory.createMessagePayload(size);
- }
- else
- {
- return MessageFactory.createMessagePayload(size).getBytes();
- }
- }
-
- Message createMessage(Object payload) throws Exception
- {
- if (msgType == MessageType.TEXT)
- {
- return session.createTextMessage((String)payload);
- }
- else
- {
- BytesMessage m = session.createBytesMessage();
- m.writeBytes((byte[])payload);
- return m;
- }
- }
-
- protected Message getNextMessage() throws Exception
- {
- if (cacheMsg)
- {
- return msg;
- }
- else
- {
- Message m;
-
- if (!randomMsgSize)
- {
- m = createMessage(payload);
- }
- else
- {
- m = createMessage(payloads.get(random.nextInt(msgSizeRange)));
- }
- m.setJMSDeliveryMode(durable?
- DeliveryMode.PERSISTENT :
- DeliveryMode.NON_PERSISTENT
- );
- return m;
- }
- }
-
- public void warmup()throws Exception
- {
- receiveFromController(OPCode.PRODUCER_STARTWARMUP);
- System.out.println("Producer: " + id + " Warming up......");
-
- for (int i=0; i < params.getWarmupCount() -1; i++)
- {
- producer.send(getNextMessage());
- }
- sendEndMessage();
-
- if (params.isTransacted())
- {
- session.commit();
- }
- }
-
- public void startTest() throws Exception
- {
- resetCounters();
- receiveFromController(OPCode.PRODUCER_START);
- int count = params.getMsgCount();
- boolean transacted = params.isTransacted();
- int tranSize = params.getTransactionSize();
-
- long limit = (long)(params.getRate() * rateFactor); // in msecs
- long timeLimit = (long)(SEC * rateFactor); // in msecs
-
- long start = Clock.getTime(); // defaults to nano secs
- long interval = start;
- for(int i=0; i < count; i++ )
- {
- Message msg = getNextMessage();
- msg.setLongProperty(TIMESTAMP, Clock.getTime());
- producer.send(msg);
- if ( transacted && ((i+1) % tranSize == 0))
- {
- session.commit();
- }
-
- if (rateLimitProducer && i%limit == 0)
- {
- long elapsed = (Clock.getTime() - interval)*Clock.convertToMiliSecs(); // in msecs
- if (elapsed < timeLimit)
- {
- Thread.sleep(elapsed);
- }
- interval = Clock.getTime();
-
- }
- }
- sendEndMessage();
- if ( transacted)
- {
- session.commit();
- }
- long time = Clock.getTime() - start;
- rate = (double)count*Clock.convertToSecs()/(double)time;
- System.out.println(new StringBuilder("Producer rate: ").
- append(df.format(rate)).
- append(" msg/sec").
- toString());
- }
-
- public void resetCounters()
- {
-
- }
-
- public void sendEndMessage() throws Exception
- {
- Message msg = session.createMessage();
- msg.setBooleanProperty("End", true);
- producer.send(msg);
- }
-
- public void sendResults() throws Exception
- {
- MapMessage msg = controllerSession.createMapMessage();
- msg.setInt(CODE, OPCode.RECEIVED_PRODUCER_STATS.ordinal());
- msg.setDouble(PROD_RATE, rate);
- sendMessageToController(msg);
- }
-
- @Override
- public void tearDown() throws Exception
- {
- super.tearDown();
- }
-
- public void run()
- {
- try
- {
- setUp();
- warmup();
- boolean nextIteration = true;
- while (nextIteration)
- {
- System.out.println("=========================================================\n");
- System.out.println("Producer: " + id + " starting a new iteration ......\n");
- startTest();
- sendResults();
- nextIteration = continueTest();
- }
- tearDown();
- }
- catch(Exception e)
- {
- handleError(e,"Error when running test");
- }
- }
-
- public void startControllerIfNeeded()
- {
- if (!params.isExternalController())
- {
- final PerfTestController controller = new PerfTestController();
- Runnable r = new Runnable()
- {
- public void run()
- {
- controller.run();
- }
- };
-
- Thread t;
- try
- {
- t = Threading.getThreadFactory().createThread(r);
- }
- catch(Exception e)
- {
- throw new Error("Error creating controller thread",e);
- }
- t.start();
- }
- }
-
-
- public static void main(String[] args) throws InterruptedException
- {
- String scriptId = (args.length == 1) ? args[0] : "";
- int conCount = Integer.getInteger("con_count",1);
- final CountDownLatch testCompleted = new CountDownLatch(conCount);
- for (int i=0; i < conCount; i++)
- {
- final PerfProducer prod = new PerfProducer(scriptId + i);
- prod.startControllerIfNeeded();
- Runnable r = new Runnable()
- {
- public void run()
- {
- prod.run();
- testCompleted.countDown();
- }
- };
-
- Thread t;
- try
- {
- t = Threading.getThreadFactory().createThread(r);
- }
- catch(Exception e)
- {
- throw new Error("Error creating producer thread",e);
- }
- t.start();
- }
- testCompleted.await();
- System.out.println("Producers have completed the test......");
- }
-} \ No newline at end of file
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/PerfTestController.java b/java/tools/src/main/java/org/apache/qpid/tools/PerfTestController.java
deleted file mode 100644
index 5fca1fa4bd..0000000000
--- a/java/tools/src/main/java/org/apache/qpid/tools/PerfTestController.java
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.tools;
-
-import java.io.FileWriter;
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CountDownLatch;
-
-import javax.jms.MapMessage;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-
-import org.apache.qpid.client.message.AMQPEncodedMapMessage;
-
-/**
- * The Controller coordinates a test run between a number
- * of producers and consumers, configured via -Dprod_count and -Dcons_count.
- *
- * It waits till all the producers and consumers have registered and then
- * conducts a warmup run. Once all consumers and producers have completed
- * the warmup run and is ready, it will conduct the actual test run and
- * collect all stats from the participants and calculates the system
- * throughput, the avg/min/max for producer rates, consumer rates and latency.
- *
- * These stats are then printed to std out.
- * The Controller also prints events to std out to give a running account
- * of the test run in progress. Ex registering of participants, starting warmup ..etc.
- * This allows a scripting tool to monitor the progress.
- *
- * The Controller can be run in two modes.
- * 1. A single test run (default) where it just runs until the message count specified
- * for the producers via -Dmsg_count is sent and received.
- *
- * 2. Time based, configured via -Dduration=x, where x is in mins.
- * In this mode, the Controller repeatedly cycles through the tests (after an initial
- * warmup run) until the desired time is reached. If a test run is in progress
- * and the time is up, it will allow the run the complete.
- *
- * After each iteration, the stats will be printed out in csv format to a separate log file.
- * System throughput is calculated as follows
- * totalMsgCount/(totalTestTime)
- */
-public class PerfTestController extends PerfBase implements MessageListener
-{
- enum TestMode { SINGLE_RUN, TIME_BASED };
-
- TestMode testMode = TestMode.SINGLE_RUN;
-
- long totalTestTime;
-
- private double avgSystemLatency = 0.0;
- private double minSystemLatency = Double.MAX_VALUE;
- private double maxSystemLatency = 0;
- private double avgSystemLatencyStdDev = 0.0;
-
- private double avgSystemConsRate = 0.0;
- private double maxSystemConsRate = 0.0;
- private double minSystemConsRate = Double.MAX_VALUE;
-
- private double avgSystemProdRate = 0.0;
- private double maxSystemProdRate = 0.0;
- private double minSystemProdRate = Double.MAX_VALUE;
-
- private long totalMsgCount = 0;
- private double totalSystemThroughput = 0.0;
-
- private int consumerCount = Integer.getInteger("cons_count", 1);
- private int producerCount = Integer.getInteger("prod_count", 1);
- private int duration = Integer.getInteger("duration", -1); // in mins
- private Map<String,MapMessage> consumers;
- private Map<String,MapMessage> producers;
-
- private CountDownLatch consRegistered;
- private CountDownLatch prodRegistered;
- private CountDownLatch consReady;
- private CountDownLatch prodReady;
- private CountDownLatch receivedEndMsg;
- private CountDownLatch receivedConsStats;
- private CountDownLatch receivedProdStats;
-
- private MessageConsumer consumer;
- private boolean printStdDev = false;
- FileWriter writer;
-
- public PerfTestController()
- {
- super("");
- consumers = new ConcurrentHashMap<String,MapMessage>(consumerCount);
- producers = new ConcurrentHashMap<String,MapMessage>(producerCount);
-
- consRegistered = new CountDownLatch(consumerCount);
- prodRegistered = new CountDownLatch(producerCount);
- consReady = new CountDownLatch(consumerCount);
- prodReady = new CountDownLatch(producerCount);
- printStdDev = params.isPrintStdDev();
- testMode = (duration == -1) ? TestMode.SINGLE_RUN : TestMode.TIME_BASED;
- }
-
- public void setUp() throws Exception
- {
- super.setUp();
- if (testMode == TestMode.TIME_BASED)
- {
- writer = new FileWriter("stats-csv.log");
- }
- consumer = controllerSession.createConsumer(controllerQueue);
- System.out.println("\nController: " + producerCount + " producers are expected");
- System.out.println("Controller: " + consumerCount + " consumers are expected \n");
- consumer.setMessageListener(this);
- consRegistered.await();
- prodRegistered.await();
- System.out.println("\nController: All producers and consumers have registered......\n");
- }
-
- public void warmup() throws Exception
- {
- System.out.println("Controller initiating warm up sequence......");
- sendMessageToNodes(OPCode.CONSUMER_STARTWARMUP,consumers.values());
- sendMessageToNodes(OPCode.PRODUCER_STARTWARMUP,producers.values());
- prodReady.await();
- consReady.await();
- System.out.println("\nController : All producers and consumers are ready to start the test......\n");
- }
-
- public void startTest() throws Exception
- {
- resetCounters();
- System.out.println("\nController Starting test......");
- long start = Clock.getTime();
- sendMessageToNodes(OPCode.PRODUCER_START,producers.values());
- receivedEndMsg.await();
- totalTestTime = Clock.getTime() - start;
- sendMessageToNodes(OPCode.CONSUMER_STOP,consumers.values());
- receivedProdStats.await();
- receivedConsStats.await();
- }
-
- public void resetCounters()
- {
- minSystemLatency = Double.MAX_VALUE;
- maxSystemLatency = 0;
- maxSystemConsRate = 0.0;
- minSystemConsRate = Double.MAX_VALUE;
- maxSystemProdRate = 0.0;
- minSystemProdRate = Double.MAX_VALUE;
-
- totalMsgCount = 0;
-
- receivedConsStats = new CountDownLatch(consumerCount);
- receivedProdStats = new CountDownLatch(producerCount);
- receivedEndMsg = new CountDownLatch(producerCount);
- }
-
- public void calcStats() throws Exception
- {
- double totLatency = 0.0;
- double totStdDev = 0.0;
- double totalConsRate = 0.0;
- double totalProdRate = 0.0;
-
- MapMessage conStat = null; // for error handling
- try
- {
- for (MapMessage m: consumers.values())
- {
- conStat = m;
- minSystemLatency = Math.min(minSystemLatency,m.getDouble(MIN_LATENCY));
- maxSystemLatency = Math.max(maxSystemLatency,m.getDouble(MAX_LATENCY));
- totLatency = totLatency + m.getDouble(AVG_LATENCY);
- totStdDev = totStdDev + m.getDouble(STD_DEV);
-
- minSystemConsRate = Math.min(minSystemConsRate,m.getDouble(CONS_RATE));
- maxSystemConsRate = Math.max(maxSystemConsRate,m.getDouble(CONS_RATE));
- totalConsRate = totalConsRate + m.getDouble(CONS_RATE);
-
- totalMsgCount = totalMsgCount + m.getLong(MSG_COUNT);
- }
- }
- catch(Exception e)
- {
- System.out.println("Error calculating stats from Consumer : " + conStat);
- }
-
-
- MapMessage prodStat = null; // for error handling
- try
- {
- for (MapMessage m: producers.values())
- {
- prodStat = m;
- minSystemProdRate = Math.min(minSystemProdRate,m.getDouble(PROD_RATE));
- maxSystemProdRate = Math.max(maxSystemProdRate,m.getDouble(PROD_RATE));
- totalProdRate = totalProdRate + m.getDouble(PROD_RATE);
- }
- }
- catch(Exception e)
- {
- System.out.println("Error calculating stats from Producer : " + conStat);
- }
-
- avgSystemLatency = totLatency/consumers.size();
- avgSystemLatencyStdDev = totStdDev/consumers.size();
- avgSystemConsRate = totalConsRate/consumers.size();
- avgSystemProdRate = totalProdRate/producers.size();
-
- System.out.println("Total test time : " + totalTestTime + " in " + Clock.getPrecision());
-
- totalSystemThroughput = (totalMsgCount*Clock.convertToSecs()/totalTestTime);
- }
-
- public void printResults() throws Exception
- {
- System.out.println(new StringBuilder("Total Msgs Received : ").append(totalMsgCount).toString());
- System.out.println(new StringBuilder("System Throughput : ").
- append(df.format(totalSystemThroughput)).
- append(" msg/sec").toString());
- System.out.println(new StringBuilder("Avg Consumer rate : ").
- append(df.format(avgSystemConsRate)).
- append(" msg/sec").toString());
- System.out.println(new StringBuilder("Min Consumer rate : ").
- append(df.format(minSystemConsRate)).
- append(" msg/sec").toString());
- System.out.println(new StringBuilder("Max Consumer rate : ").
- append(df.format(maxSystemConsRate)).
- append(" msg/sec").toString());
-
- System.out.println(new StringBuilder("Avg Producer rate : ").
- append(df.format(avgSystemProdRate)).
- append(" msg/sec").toString());
- System.out.println(new StringBuilder("Min Producer rate : ").
- append(df.format(minSystemProdRate)).
- append(" msg/sec").toString());
- System.out.println(new StringBuilder("Max Producer rate : ").
- append(df.format(maxSystemProdRate)).
- append(" msg/sec").toString());
-
- System.out.println(new StringBuilder("Avg System Latency : ").
- append(df.format(avgSystemLatency)).
- append(" ms").toString());
- System.out.println(new StringBuilder("Min System Latency : ").
- append(df.format(minSystemLatency)).
- append(" ms").toString());
- System.out.println(new StringBuilder("Max System Latency : ").
- append(df.format(maxSystemLatency)).
- append(" ms").toString());
- if (printStdDev)
- {
- System.out.println(new StringBuilder("Avg System Std Dev : ").
- append(avgSystemLatencyStdDev));
- }
- }
-
- private synchronized void sendMessageToNodes(OPCode code,Collection<MapMessage> nodes) throws Exception
- {
- System.out.println("\nController: Sending code " + code);
- MessageProducer tmpProd = controllerSession.createProducer(null);
- MapMessage msg = controllerSession.createMapMessage();
- msg.setInt(CODE, code.ordinal());
- for (MapMessage node : nodes)
- {
- if (node.getString(REPLY_ADDR) == null)
- {
- System.out.println("REPLY_ADDR is null " + node);
- }
- else
- {
- System.out.println("Controller: Sending " + code + " to " + node.getString(REPLY_ADDR));
- }
- tmpProd.send(controllerSession.createQueue(node.getString(REPLY_ADDR)), msg);
- }
- }
-
- public void onMessage(Message msg)
- {
- try
- {
- MapMessage m = (MapMessage)msg;
- OPCode code = OPCode.values()[m.getInt(CODE)];
-
- System.out.println("\n---------Controller Received Code : " + code);
- System.out.println("---------Data : " + ((AMQPEncodedMapMessage)m).getMap());
-
- switch (code)
- {
- case REGISTER_CONSUMER :
- if (consRegistered.getCount() == 0)
- {
- System.out.println("Warning : Expected number of consumers have already registered," +
- "ignoring extra consumer");
- break;
- }
- consumers.put(m.getString(ID),m);
- consRegistered.countDown();
- break;
-
- case REGISTER_PRODUCER :
- if (prodRegistered.getCount() == 0)
- {
- System.out.println("Warning : Expected number of producers have already registered," +
- "ignoring extra producer");
- break;
- }
- producers.put(m.getString(ID),m);
- prodRegistered.countDown();
- break;
-
- case CONSUMER_READY :
- consReady.countDown();
- break;
-
- case PRODUCER_READY :
- prodReady.countDown();
- break;
-
- case RECEIVED_END_MSG :
- receivedEndMsg.countDown();
- break;
-
- case RECEIVED_CONSUMER_STATS :
- consumers.put(m.getString(ID),m);
- receivedConsStats.countDown();
- break;
-
- case RECEIVED_PRODUCER_STATS :
- producers.put(m.getString(ID),m);
- receivedProdStats.countDown();
- break;
-
- default:
- throw new Exception("Invalid OPCode " + code);
- }
- }
- catch (Exception e)
- {
- handleError(e,"Error when receiving messages " + msg);
- }
- }
-
- public void run()
- {
- try
- {
- setUp();
- warmup();
- if (testMode == TestMode.SINGLE_RUN)
- {
- startTest();
- calcStats();
- printResults();
- }
- else
- {
- long startTime = Clock.getTime();
- long timeLimit = duration * 60 * 1000; // duration is in mins.
- boolean nextIteration = true;
- while (nextIteration)
- {
- startTest();
- calcStats();
- writeStatsToFile();
- if (Clock.getTime() - startTime < timeLimit)
- {
- sendMessageToNodes(OPCode.CONTINUE_TEST,consumers.values());
- sendMessageToNodes(OPCode.CONTINUE_TEST,producers.values());
- nextIteration = true;
- }
- else
- {
- nextIteration = false;
- }
- }
- }
- tearDown();
-
- }
- catch(Exception e)
- {
- handleError(e,"Error when running test");
- }
- }
-
- @Override
- public void tearDown() throws Exception {
- System.out.println("Controller: Completed the test......\n");
- if (testMode == TestMode.TIME_BASED)
- {
- writer.close();
- }
- sendMessageToNodes(OPCode.STOP_TEST,consumers.values());
- sendMessageToNodes(OPCode.STOP_TEST,producers.values());
- super.tearDown();
- }
-
- public void writeStatsToFile() throws Exception
- {
- writer.append(String.valueOf(totalMsgCount)).append(",");
- writer.append(df.format(totalSystemThroughput)).append(",");
- writer.append(df.format(avgSystemConsRate)).append(",");
- writer.append(df.format(minSystemConsRate)).append(",");
- writer.append(df.format(maxSystemConsRate)).append(",");
- writer.append(df.format(avgSystemProdRate)).append(",");
- writer.append(df.format(minSystemProdRate)).append(",");
- writer.append(df.format(maxSystemProdRate)).append(",");
- writer.append(df.format(avgSystemLatency)).append(",");
- writer.append(df.format(minSystemLatency)).append(",");
- writer.append(df.format(maxSystemLatency));
- if (printStdDev)
- {
- writer.append(",").append(String.valueOf(avgSystemLatencyStdDev));
- }
- writer.append("\n");
- writer.flush();
- }
-
- public static void main(String[] args)
- {
- PerfTestController controller = new PerfTestController();
- controller.run();
- }
-}
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/QpidReceive.java b/java/tools/src/main/java/org/apache/qpid/tools/QpidReceive.java
new file mode 100644
index 0000000000..02f011f1b9
--- /dev/null
+++ b/java/tools/src/main/java/org/apache/qpid/tools/QpidReceive.java
@@ -0,0 +1,181 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.util.UUID;
+import java.util.concurrent.CountDownLatch;
+
+import javax.jms.Connection;
+import javax.jms.Destination;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.tools.TestConfiguration.MessageType;
+import org.apache.qpid.tools.report.BasicReporter;
+import org.apache.qpid.tools.report.Reporter;
+import org.apache.qpid.tools.report.Statistics.Throughput;
+import org.apache.qpid.tools.report.Statistics.ThroughputAndLatency;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class QpidReceive implements MessageListener
+{
+ private static final Logger _logger = LoggerFactory.getLogger(QpidSend.class);
+ private final CountDownLatch testCompleted = new CountDownLatch(1);
+
+ private Connection con;
+ private Session session;
+ private Destination dest;
+ private MessageConsumer consumer;
+ private boolean transacted = false;
+ private boolean isRollback = false;
+ private int txSize = 0;
+ private int rollbackFrequency = 0;
+ private int ackFrequency = 0;
+ private int expected = 0;
+ private int received = 0;
+ private Reporter report;
+ private TestConfiguration config;
+
+ public QpidReceive(Reporter report, TestConfiguration config, Connection con, Destination dest)
+ {
+ this(report,config, con, dest, UUID.randomUUID().toString());
+ }
+
+ public QpidReceive(Reporter report, TestConfiguration config, Connection con, Destination dest, String prefix)
+ {
+ //System.out.println("Producer ID : " + id);
+ this.report = report;
+ this.config = config;
+ this.con = con;
+ this.dest = dest;
+ }
+
+ public void setUp() throws Exception
+ {
+ if (config.isTransacted())
+ {
+ session = con.createSession(true, Session.SESSION_TRANSACTED);
+ }
+ else if (config.getAckFrequency() > 0)
+ {
+ session = con.createSession(false, Session.DUPS_OK_ACKNOWLEDGE);
+ }
+ else
+ {
+ session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ }
+ consumer = session.createConsumer(dest);
+ consumer.setMessageListener(this);
+ System.out.println("Consumer: " + /*id +*/ " Receiving messages from : " + ((AMQDestination)dest).getAddressName() + "\n");
+
+ transacted = config.isTransacted();
+ txSize = config.getTransactionSize();
+ isRollback = config.getRollbackFrequency() > 0;
+ rollbackFrequency = config.getRollbackFrequency();
+ ackFrequency = config.getAckFrequency();
+ }
+
+ public void resetCounters()
+ {
+ received = 0;
+ expected = 0;
+ report.clear();
+ }
+
+ public void onMessage(Message msg)
+ {
+ try
+ {
+ if (msg instanceof TextMessage &&
+ TestConfiguration.EOS.equals(((TextMessage)msg).getText()))
+ {
+ testCompleted.countDown();
+ return;
+ }
+
+ received++;
+ report.message(msg);
+
+ if (transacted && (received % txSize == 0))
+ {
+ if (isRollback && (received % rollbackFrequency == 0))
+ {
+ session.rollback();
+ }
+ else
+ {
+ session.commit();
+ }
+ }
+ else if (ackFrequency > 0)
+ {
+ msg.acknowledge();
+ }
+
+ if (expected >= received)
+ {
+ testCompleted.countDown();
+ }
+
+ }
+ catch(Exception e)
+ {
+ _logger.error("Error when receiving messages",e);
+ }
+
+ }
+
+ public void waitforCompletion(int expected) throws Exception
+ {
+ this.expected = expected;
+ testCompleted.await();
+ }
+
+ public void tearDown() throws Exception
+ {
+ session.close();
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ TestConfiguration config = new JVMArgConfiguration();
+ Reporter reporter = new BasicReporter(config.isReportLatency()? ThroughputAndLatency.class : Throughput.class,
+ System.out,
+ config.reportEvery(),
+ config.isReportHeader()
+ );
+ Destination dest = AMQDestination.createDestination(config.getAddress());
+ QpidReceive receiver = new QpidReceive(reporter,config, config.createConnection(),dest);
+ receiver.setUp();
+ receiver.waitforCompletion(config.getMsgCount());
+ if (config.isReportTotal())
+ {
+ reporter.report();
+ }
+ receiver.tearDown();
+ }
+
+}
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/QpidSend.java b/java/tools/src/main/java/org/apache/qpid/tools/QpidSend.java
new file mode 100644
index 0000000000..c058b83d41
--- /dev/null
+++ b/java/tools/src/main/java/org/apache/qpid/tools/QpidSend.java
@@ -0,0 +1,291 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.UUID;
+
+import javax.jms.BytesMessage;
+import javax.jms.Connection;
+import javax.jms.DeliveryMode;
+import javax.jms.Destination;
+import javax.jms.Message;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.tools.TestConfiguration.MessageType;
+import org.apache.qpid.tools.report.BasicReporter;
+import org.apache.qpid.tools.report.Reporter;
+import org.apache.qpid.tools.report.Statistics.Throughput;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class QpidSend
+{
+ private Connection con;
+ private Session session;
+ private Destination dest;
+ private MessageProducer producer;
+ private MessageType msgType;
+ private Message msg;
+ private Object payload;
+ private List<Object> payloads;
+ private boolean cacheMsg = false;
+ private boolean randomMsgSize = false;
+ private boolean durable = false;
+ private Random random;
+ private int msgSizeRange = 1024;
+ private int totalMsgCount = 0;
+ private boolean rateLimitProducer = false;
+ private boolean transacted = false;
+ private int txSize = 0;
+
+ private static final Logger _logger = LoggerFactory.getLogger(QpidSend.class);
+ Reporter report;
+ TestConfiguration config;
+
+ public QpidSend(Reporter report, TestConfiguration config, Connection con, Destination dest)
+ {
+ this(report,config, con, dest, UUID.randomUUID().toString());
+ }
+
+ public QpidSend(Reporter report, TestConfiguration config, Connection con, Destination dest, String prefix)
+ {
+ //System.out.println("Producer ID : " + id);
+ this.report = report;
+ this.config = config;
+ this.con = con;
+ this.dest = dest;
+ }
+
+ public void setUp() throws Exception
+ {
+ if (config.isTransacted())
+ {
+ session = con.createSession(true, Session.SESSION_TRANSACTED);
+ }
+ else
+ {
+ session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ }
+
+ durable = config.isDurable();
+ rateLimitProducer = config.getSendRate() > 0 ? true : false;
+ if (_logger.isDebugEnabled() && rateLimitProducer)
+ {
+ System.out.println("The test will attempt to limit the producer to " + config.getSendRate() + " msg/sec");
+ }
+
+ transacted = config.isTransacted();
+ txSize = config.getTransactionSize();
+
+ msgType = MessageType.getType(config.getMessageType());
+ // if message caching is enabled we pre create the message
+ // else we pre create the payload
+ if (config.isCacheMessage())
+ {
+ cacheMsg = true;
+ msg = createMessage(createPayload(config.getMsgSize()));
+ msg.setJMSDeliveryMode(durable?
+ DeliveryMode.PERSISTENT :
+ DeliveryMode.NON_PERSISTENT
+ );
+ }
+ else if (config.isRandomMsgSize())
+ {
+ random = new Random(20080921);
+ randomMsgSize = true;
+ msgSizeRange = config.getMsgSize();
+ payloads = new ArrayList<Object>(msgSizeRange);
+
+ for (int i=0; i < msgSizeRange; i++)
+ {
+ payloads.add(createPayload(i));
+ }
+ }
+ else
+ {
+ payload = createPayload(config.getMsgSize());
+ }
+
+ producer = session.createProducer(dest);
+ if (_logger.isDebugEnabled())
+ {
+ System.out.println("Producer: " + /*id +*/ " Sending messages to: " + ((AMQDestination)dest).getAddressName());
+ }
+ producer.setDisableMessageID(config.isDisableMessageID());
+ producer.setDisableMessageTimestamp(config.isDisableTimestamp());
+ }
+
+ Object createPayload(int size)
+ {
+ if (msgType == MessageType.TEXT)
+ {
+ return MessageFactory.createMessagePayload(size);
+ }
+ else
+ {
+ return MessageFactory.createMessagePayload(size).getBytes();
+ }
+ }
+
+ Message createMessage(Object payload) throws Exception
+ {
+ if (msgType == MessageType.TEXT)
+ {
+ return session.createTextMessage((String)payload);
+ }
+ else
+ {
+ BytesMessage m = session.createBytesMessage();
+ m.writeBytes((byte[])payload);
+ return m;
+ }
+ }
+
+ protected Message getNextMessage() throws Exception
+ {
+ if (cacheMsg)
+ {
+ return msg;
+ }
+ else
+ {
+ Message m;
+
+ if (!randomMsgSize)
+ {
+ m = createMessage(payload);
+ }
+ else
+ {
+ m = createMessage(payloads.get(random.nextInt(msgSizeRange)));
+ }
+ m.setJMSDeliveryMode(durable?
+ DeliveryMode.PERSISTENT :
+ DeliveryMode.NON_PERSISTENT
+ );
+ return m;
+ }
+ }
+
+ public void commit() throws Exception
+ {
+ session.commit();
+ }
+
+ public void send() throws Exception
+ {
+ send(config.getMsgCount());
+ }
+
+ public void send(int count) throws Exception
+ {
+ int sendRate = config.getSendRate();
+ if (rateLimitProducer)
+ {
+ int iterations = count/sendRate;
+ int remainder = count%sendRate;
+ for (int i=0; i < iterations; i++)
+ {
+ long iterationStart = Clock.getTime();
+ sendMessages(sendRate);
+ long elapsed = (Clock.getTime() - iterationStart)*Clock.convertToMiliSecs();
+ long diff = Clock.SEC - elapsed;
+ if (diff > 0)
+ {
+ // We have sent more messages in a sec than specified by the rate.
+ Thread.sleep(diff);
+ }
+ }
+ sendMessages(remainder);
+ }
+ else
+ {
+ sendMessages(count);
+ }
+ }
+
+ private void sendMessages(int count) throws Exception
+ {
+ boolean isTimestamp = config.isReportLatency();
+ for(int i=0; i < count; i++ )
+ {
+ Message msg = getNextMessage();
+ if (isTimestamp)
+ {
+ msg.setLongProperty(TestConfiguration.TIMESTAMP, Clock.getTime());
+ }
+ producer.send(msg);
+ report.message(msg);
+ totalMsgCount++;
+
+ if ( transacted && ((totalMsgCount) % txSize == 0))
+ {
+ session.commit();
+ }
+ }
+ }
+
+ public void resetCounters()
+ {
+ totalMsgCount = 0;
+ report.clear();
+ }
+
+ public void sendEndMessage() throws Exception
+ {
+ Message msg = session.createMessage();
+ msg.setBooleanProperty(TestConfiguration.EOS, true);
+ producer.send(msg);
+ }
+
+ public void tearDown() throws Exception
+ {
+ session.close();
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ TestConfiguration config = new JVMArgConfiguration();
+ Reporter reporter = new BasicReporter(Throughput.class,
+ System.out,
+ config.reportEvery(),
+ config.isReportHeader()
+ );
+ Destination dest = AMQDestination.createDestination(config.getAddress());
+ QpidSend sender = new QpidSend(reporter,config, config.createConnection(),dest);
+ sender.setUp();
+ sender.send();
+ if (config.getSendEOS() > 0)
+ {
+ sender.sendEndMessage();
+ }
+ if (config.isReportTotal())
+ {
+ reporter.report();
+ }
+ sender.tearDown();
+ }
+}
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/TestConfiguration.java b/java/tools/src/main/java/org/apache/qpid/tools/TestConfiguration.java
new file mode 100644
index 0000000000..7f7df0e5e6
--- /dev/null
+++ b/java/tools/src/main/java/org/apache/qpid/tools/TestConfiguration.java
@@ -0,0 +1,126 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.text.DecimalFormat;
+
+import javax.jms.Connection;
+
+public interface TestConfiguration
+{
+ enum MessageType {
+ BYTES, TEXT, MAP, OBJECT;
+
+ public static MessageType getType(String s) throws Exception
+ {
+ if ("text".equalsIgnoreCase(s))
+ {
+ return TEXT;
+ }
+ else if ("bytes".equalsIgnoreCase(s))
+ {
+ return BYTES;
+ }
+ /*else if ("map".equalsIgnoreCase(s))
+ {
+ return MAP;
+ }
+ else if ("object".equalsIgnoreCase(s))
+ {
+ return OBJECT;
+ }*/
+ else
+ {
+ throw new Exception("Unsupported message type");
+ }
+ }
+ };
+
+ public final static String TIMESTAMP = "ts";
+
+ public final static String EOS = "eos";
+
+ public final static String SEQUENCE_NUMBER = "sn";
+
+ public String getUrl();
+
+ public String getHost();
+
+ public int getPort();
+
+ public String getAddress();
+
+ public int getAckMode();
+
+ public int getMsgCount();
+
+ public int getMsgSize();
+
+ public int getRandomMsgSizeStartFrom();
+
+ public boolean isDurable();
+
+ public boolean isTransacted();
+
+ public int getTransactionSize();
+
+ public int getWarmupCount();
+
+ public boolean isCacheMessage();
+
+ public boolean isDisableMessageID();
+
+ public boolean isDisableTimestamp();
+
+ public boolean isRandomMsgSize();
+
+ public String getMessageType();
+
+ public boolean isPrintStdDev();
+
+ public int getSendRate();
+
+ public boolean isExternalController();
+
+ public boolean isUseUniqueDests();
+
+ public int getAckFrequency();
+
+ public Connection createConnection() throws Exception;
+
+ public DecimalFormat getDecimalFormat();
+
+ public int reportEvery();
+
+ public boolean isReportTotal();
+
+ public boolean isReportHeader();
+
+ public boolean isReportLatency();
+
+ public int getSendEOS();
+
+ public int getConnectionCount();
+
+ public int getRollbackFrequency();
+
+ public boolean isPrintHeaders();
+} \ No newline at end of file
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/TestParams.java b/java/tools/src/main/java/org/apache/qpid/tools/TestParams.java
deleted file mode 100644
index d73be0181b..0000000000
--- a/java/tools/src/main/java/org/apache/qpid/tools/TestParams.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.tools;
-
-import javax.jms.Session;
-
-public class TestParams
-{
- /*
- * By default the connection URL is used.
- * This allows a user to easily specify a fully fledged URL any given property.
- * Ex. SSL parameters
- *
- * By providing a host & port allows a user to simply override the URL.
- * This allows to create multiple clients in test scripts easily,
- * without having to deal with the long URL format.
- */
- private String url = "amqp://guest:guest@clientid/testpath?brokerlist='tcp://localhost:5672'";
-
- private String host = "";
-
- private int port = -1;
-
- private String address = "queue; {create : always}";
-
- private int msg_size = 1024;
-
- private int random_msg_size_start_from = 1;
-
- private boolean cacheMessage = false;
-
- private boolean disableMessageID = false;
-
- private boolean disableTimestamp = false;
-
- private boolean durable = false;
-
- private boolean transacted = false;
-
- private int transaction_size = 1000;
-
- private int ack_mode = Session.AUTO_ACKNOWLEDGE;
-
- private int msg_count = 10;
-
- private int warmup_count = 1;
-
- private boolean random_msg_size = false;
-
- private String msgType = "bytes";
-
- private boolean printStdDev = false;
-
- private long rate = -1;
-
- private boolean externalController = false;
-
- private boolean useUniqueDest = false; // useful when using multiple connections.
-
- public TestParams()
- {
-
- url = System.getProperty("url",url);
- host = System.getProperty("host","");
- port = Integer.getInteger("port", -1);
- address = System.getProperty("address",address);
-
- msg_size = Integer.getInteger("msg_size", 1024);
- cacheMessage = Boolean.getBoolean("cache_msg");
- disableMessageID = Boolean.getBoolean("disableMessageID");
- disableTimestamp = Boolean.getBoolean("disableTimestamp");
- durable = Boolean.getBoolean("durable");
- transacted = Boolean.getBoolean("transacted");
- transaction_size = Integer.getInteger("trans_size",1000);
- ack_mode = Integer.getInteger("ack_mode",Session.AUTO_ACKNOWLEDGE);
- msg_count = Integer.getInteger("msg_count",msg_count);
- warmup_count = Integer.getInteger("warmup_count",warmup_count);
- random_msg_size = Boolean.getBoolean("random_msg_size");
- msgType = System.getProperty("msg_type","bytes");
- printStdDev = Boolean.getBoolean("print_std_dev");
- rate = Long.getLong("rate",-1);
- externalController = Boolean.getBoolean("ext_controller");
- useUniqueDest = Boolean.getBoolean("use_unique_dest");
- random_msg_size_start_from = Integer.getInteger("random_msg_size_start_from", 1);
- }
-
- public String getUrl()
- {
- return url;
- }
-
- public String getHost()
- {
- return host;
- }
-
- public int getPort()
- {
- return port;
- }
-
- public String getAddress()
- {
- return address;
- }
-
- public int getAckMode()
- {
- return ack_mode;
- }
-
- public int getMsgCount()
- {
- return msg_count;
- }
-
- public int getMsgSize()
- {
- return msg_size;
- }
-
- public int getRandomMsgSizeStartFrom()
- {
- return random_msg_size_start_from;
- }
-
- public boolean isDurable()
- {
- return durable;
- }
-
- public boolean isTransacted()
- {
- return transacted;
- }
-
- public int getTransactionSize()
- {
- return transaction_size;
- }
-
- public int getWarmupCount()
- {
- return warmup_count;
- }
-
- public boolean isCacheMessage()
- {
- return cacheMessage;
- }
-
- public boolean isDisableMessageID()
- {
- return disableMessageID;
- }
-
- public boolean isDisableTimestamp()
- {
- return disableTimestamp;
- }
-
- public boolean isRandomMsgSize()
- {
- return random_msg_size;
- }
-
- public String getMessageType()
- {
- return msgType;
- }
-
- public boolean isPrintStdDev()
- {
- return printStdDev;
- }
-
- public long getRate()
- {
- return rate;
- }
-
- public boolean isExternalController()
- {
- return externalController;
- }
-
- public void setAddress(String addr)
- {
- address = addr;
- }
-
- public boolean isUseUniqueDests()
- {
- return useUniqueDest;
- }
-}
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/report/BasicReporter.java b/java/tools/src/main/java/org/apache/qpid/tools/report/BasicReporter.java
new file mode 100644
index 0000000000..a9896c1d4e
--- /dev/null
+++ b/java/tools/src/main/java/org/apache/qpid/tools/report/BasicReporter.java
@@ -0,0 +1,113 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools.report;
+
+import java.io.PrintStream;
+import java.lang.reflect.Constructor;
+
+import javax.jms.Message;
+
+public class BasicReporter implements Reporter
+{
+ PrintStream out;
+ int batchSize = 0;
+ int batchCount = 0;
+ boolean headerPrinted = false;
+ protected Statistics overall;
+ Statistics batch;
+ Constructor<? extends Statistics> statCtor;
+
+ public BasicReporter(Class<? extends Statistics> clazz, PrintStream out,
+ int batchSize, boolean printHeader) throws Exception
+ {
+ this.out = out;
+ this.batchSize = batchSize;
+ this.headerPrinted = !printHeader;
+ statCtor = clazz.getConstructor();
+ overall = statCtor.newInstance();
+ if (batchSize > 0)
+ {
+ batch = statCtor.newInstance();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.report.Reporter#message(javax.jms.Message)
+ */
+ @Override
+ public void message(Message msg)
+ {
+ overall.message(msg);
+ if (batchSize > 0)
+ {
+ batch.message(msg);
+ if (++batchCount == batchSize)
+ {
+ if (!headerPrinted)
+ {
+ header();
+ }
+ batch.report(out);
+ batch.clear();
+ batchCount = 0;
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.report.Reporter#report()
+ */
+ @Override
+ public void report()
+ {
+ if (!headerPrinted)
+ {
+ header();
+ }
+ overall.report(out);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.report.Reporter#header()
+ */
+ @Override
+ public void header()
+ {
+ headerPrinted = true;
+ overall.header(out);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.report.Reporter#log()
+ */
+ @Override
+ public void log(String s)
+ {
+ // NOOP
+ }
+
+ @Override
+ public void clear()
+ {
+ batch.clear();
+ overall.clear();
+ }
+}
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/report/MercuryReporter.java b/java/tools/src/main/java/org/apache/qpid/tools/report/MercuryReporter.java
new file mode 100644
index 0000000000..e9bf7100c1
--- /dev/null
+++ b/java/tools/src/main/java/org/apache/qpid/tools/report/MercuryReporter.java
@@ -0,0 +1,167 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools.report;
+
+import java.io.PrintStream;
+
+import org.apache.qpid.tools.report.Statistics.Throughput;
+import org.apache.qpid.tools.report.Statistics.ThroughputAndLatency;
+
+public class MercuryReporter extends BasicReporter
+{
+ MercuryStatistics stats;
+
+ public MercuryReporter(Class<? extends MercuryStatistics> clazz, PrintStream out,
+ int batchSize, boolean printHeader) throws Exception
+ {
+ super(clazz, out, batchSize, printHeader);
+ stats = (MercuryStatistics)overall;
+ }
+
+ public double getRate()
+ {
+ return stats.getRate();
+ }
+
+ public double getAvgLatency()
+ {
+ return stats.getAvgLatency();
+ }
+
+ public double getStdDev()
+ {
+ return stats.getStdDev();
+ }
+
+ public double getMinLatency()
+ {
+ return stats.getMinLatency();
+ }
+
+ public double getMaxLatency()
+ {
+ return stats.getMaxLatency();
+ }
+
+ public int getSampleSize()
+ {
+ return stats.getSampleSize();
+ }
+
+ public interface MercuryStatistics extends Statistics
+ {
+ public double getRate();
+ public long getMinLatency();
+ public long getMaxLatency();
+ public double getAvgLatency();
+ public double getStdDev();
+ public int getSampleSize();
+ }
+
+ public static class MercuryThroughput extends Throughput implements MercuryStatistics
+ {
+ double rate = 0;
+
+ @Override
+ public void report(PrintStream out)
+ {
+ long elapsed = System.currentTimeMillis() - start;
+ rate = (double)messages/(double)elapsed;
+ }
+
+ @Override
+ public void clear()
+ {
+ super.clear();
+ rate = 0;
+ }
+
+ public double getRate()
+ {
+ return rate;
+ }
+
+ public int getSampleSize()
+ {
+ return messages;
+ }
+
+ public long getMinLatency() { return 0; }
+ public long getMaxLatency() { return 0; }
+ public double getAvgLatency(){ return 0; }
+ public double getStdDev(){ return 0; }
+
+ }
+
+ public static class MercuryThroughputAndLatency extends ThroughputAndLatency implements MercuryStatistics
+ {
+ double rate = 0;
+ double avgLatency = 0;
+ double stdDev;
+
+ @Override
+ public void report(PrintStream out)
+ {
+ long elapsed = System.currentTimeMillis() - start;
+ rate = (double)messages/(double)elapsed;
+ avgLatency = totalLatency/(double)sampleCount;
+ }
+
+ @Override
+ public void clear()
+ {
+ super.clear();
+ rate = 0;
+ avgLatency = 0;
+ }
+
+ public double getRate()
+ {
+ return rate;
+ }
+
+ public long getMinLatency()
+ {
+ return minLatency;
+ }
+
+ public long getMaxLatency()
+ {
+ return maxLatency;
+ }
+
+ public double getAvgLatency()
+ {
+ return avgLatency;
+ }
+
+ public double getStdDev()
+ {
+ return stdDev;
+ }
+
+ public int getSampleSize()
+ {
+ return messages;
+ }
+ }
+
+}
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/report/Reporter.java b/java/tools/src/main/java/org/apache/qpid/tools/report/Reporter.java
new file mode 100644
index 0000000000..5e481458be
--- /dev/null
+++ b/java/tools/src/main/java/org/apache/qpid/tools/report/Reporter.java
@@ -0,0 +1,40 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools.report;
+
+import javax.jms.Message;
+
+public interface Reporter
+{
+
+ public void message(Message msg);
+
+ public void report();
+
+ public void header();
+
+ // Will be used by some reporters to print statements which are greped by
+ // scripts. Example see java/tools/bin/perf-report
+ public void log(String s);
+
+ public void clear();
+
+} \ No newline at end of file
diff --git a/java/tools/src/main/java/org/apache/qpid/tools/report/Statistics.java b/java/tools/src/main/java/org/apache/qpid/tools/report/Statistics.java
new file mode 100644
index 0000000000..73efd1f1e0
--- /dev/null
+++ b/java/tools/src/main/java/org/apache/qpid/tools/report/Statistics.java
@@ -0,0 +1,139 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools.report;
+
+import java.io.PrintStream;
+import java.text.DecimalFormat;
+
+import javax.jms.Message;
+
+public interface Statistics
+{
+ public void message(Message msg);
+ public void report(PrintStream out);
+ public void header(PrintStream out);
+ public void clear();
+
+ static class Throughput implements Statistics
+ {
+ DecimalFormat df = new DecimalFormat("###.##");
+ int messages = 0;
+ long start = 0;
+ boolean started = false;
+
+ @Override
+ public void message(Message msg)
+ {
+ ++messages;
+ if (!started)
+ {
+ start = System.currentTimeMillis();
+ started = true;
+ }
+ }
+
+ @Override
+ public void report(PrintStream out)
+ {
+ long elapsed = System.currentTimeMillis() - start;
+ out.print(df.format((double)messages/(double)elapsed));
+ }
+
+ @Override
+ public void header(PrintStream out)
+ {
+ out.print("tp(m/s)");
+ }
+
+ public void clear()
+ {
+ messages = 0;
+ start = 0;
+ started = false;
+ }
+ }
+
+ static class ThroughputAndLatency extends Throughput
+ {
+ long minLatency = Long.MAX_VALUE;
+ long maxLatency = Long.MIN_VALUE;
+ double totalLatency = 0;
+ int sampleCount = 0;
+
+ @Override
+ public void message(Message msg)
+ {
+ super.message(msg);
+ try
+ {
+ long ts = msg.getLongProperty("ts");
+ long latency = System.currentTimeMillis() - ts;
+ minLatency = Math.min(latency, minLatency);
+ maxLatency = Math.min(latency, maxLatency);
+ totalLatency = totalLatency + latency;
+ sampleCount++;
+ }
+ catch(Exception e)
+ {
+ System.out.println("Error calculating latency");
+ }
+ }
+
+ @Override
+ public void report(PrintStream out)
+ {
+ super.report(out);
+ double avgLatency = totalLatency/(double)sampleCount;
+ out.append('\t')
+ .append(String.valueOf(minLatency))
+ .append('\t')
+ .append(String.valueOf(maxLatency))
+ .append('\t')
+ .append(df.format(avgLatency));
+
+ out.flush();
+ }
+
+ @Override
+ public void header(PrintStream out)
+ {
+ super.header(out);
+ out.append('\t')
+ .append("l-min")
+ .append('\t')
+ .append("l-max")
+ .append('\t')
+ .append("l-avg");
+
+ out.flush();
+ }
+
+ public void clear()
+ {
+ super.clear();
+ minLatency = 0;
+ maxLatency = 0;
+ totalLatency = 0;
+ sampleCount = 0;
+ }
+ }
+
+}
diff --git a/packaging/windows/INSTALL_NOTES.html b/packaging/windows/INSTALL_NOTES.html
index ad57eb8a36..9442b5a5c0 100644
--- a/packaging/windows/INSTALL_NOTES.html
+++ b/packaging/windows/INSTALL_NOTES.html
@@ -1,11 +1,11 @@
<html>
<head>
-<title>Apache Qpid C++ 0.15 Installation Notes</title>
+<title>Apache Qpid C++ 0.17 Installation Notes</title>
</head>
<body>
-<H1>Apache Qpid C++ 0.15 Installation Notes</H1>
+<H1>Apache Qpid C++ 0.17 Installation Notes</H1>
-<p>Thank you for installing Apache Qpid version 0.15 for Windows.
+<p>Thank you for installing Apache Qpid version 0.17 for Windows.
If the requisite features were installed, you can now run a broker,
use the example programs, and design your own messaging programs while
reading the Qpid C++ API reference documentation.</p>
@@ -83,7 +83,7 @@ default; therefore, to gain support for durable items the persistence plugin
must be loaded into the broker. This can be done using the
<code>--load-module</code> option to load the needed plugins. For example:
<pre>
-cd "C:\Program Files\Apache\qpidc-0.15"
+cd "C:\Program Files\Apache\qpidc-0.17"
qpidd.exe --load-module plugins\broker\store.dll --load-module plugins\broker\msclfs_store.dll
</pre>
The <code>--load-module</code> option can also take a full path. The option
diff --git a/packaging/windows/installer.proj b/packaging/windows/installer.proj
index 5a3f1e0201..699981cea0 100644
--- a/packaging/windows/installer.proj
+++ b/packaging/windows/installer.proj
@@ -32,7 +32,7 @@
<source_root>$(MSBuildProjectDirectory)\..\..</source_root>
<staging_dir>$(MSBuildProjectDirectory)\stage</staging_dir>
<bits Condition="'$(bits)' == ''">32</bits>
- <qpid_version>0.14</qpid_version>
+ <qpid_version>0.17</qpid_version>
<OutputName>qpidc</OutputName>
<OutputType>Package</OutputType>
<WixToolPath>C:\Program Files (x86)\Windows Installer XML v3.5\bin</WixToolPath>
diff --git a/python/qpid/connection.py b/python/qpid/connection.py
index f2c83d113c..66e1cb49be 100644
--- a/python/qpid/connection.py
+++ b/python/qpid/connection.py
@@ -170,6 +170,10 @@ class Connection(Framer):
if not status:
self.detach_all()
break
+ # When we do not use SSL transport, we get periodic
+ # spurious timeout events on the socket. When using SSL,
+ # these events show up as timeout *errors*. Both should be
+ # ignored unless we have aborted.
except socket.timeout:
if self.aborted():
self.close_code = (None, "connection timed out")
@@ -178,9 +182,12 @@ class Connection(Framer):
else:
continue
except socket.error, e:
- self.close_code = (None, str(e))
- self.detach_all()
- break
+ if self.aborted() or str(e) != "The read operation timed out":
+ self.close_code = (None, str(e))
+ self.detach_all()
+ break
+ else:
+ continue
frame_dec.write(data)
seg_dec.write(*frame_dec.read())
op_dec.write(*seg_dec.read())
diff --git a/python/qpid/messaging/driver.py b/python/qpid/messaging/driver.py
index 0358659111..3cb62d75c9 100644
--- a/python/qpid/messaging/driver.py
+++ b/python/qpid/messaging/driver.py
@@ -226,7 +226,11 @@ class LinkIn:
def do_link(self, sst, rcv, _rcv, type, subtype, action):
link_opts = _rcv.options.get("link", {})
- reliability = link_opts.get("reliability", "at-least-once")
+ if type == "topic":
+ default_reliability = "unreliable"
+ else:
+ default_reliability = "at-least-once"
+ reliability = link_opts.get("reliability", default_reliability)
declare = link_opts.get("x-declare", {})
subscribe = link_opts.get("x-subscribe", {})
acq_mode = acquire_mode.pre_acquired
diff --git a/python/qpid/testlib.py b/python/qpid/testlib.py
index 1da53b3378..f9796982f5 100644
--- a/python/qpid/testlib.py
+++ b/python/qpid/testlib.py
@@ -29,6 +29,9 @@ from qpid.message import Message
from qpid.harness import Skipped
from qpid.exceptions import VersionError
+import qpid.messaging
+from qpidtoollibs import BrokerAgent
+
class TestBase(unittest.TestCase):
"""Base class for Qpid test cases.
@@ -193,6 +196,15 @@ class TestBase010(unittest.TestCase):
self.qmf = qmf.console.Session(handler)
self.qmf_broker = self.qmf.addBroker(str(self.broker))
+ def startBrokerAccess(self):
+ """
+ New-style management access to the broker. Can be used in lieu of startQmf.
+ """
+ if 'broker_conn' not in self.__dict__:
+ self.broker_conn = qpid.messaging.Connection(str(self.broker))
+ self.broker_conn.open()
+ self.broker_access = BrokerAgent(self.broker_conn)
+
def connect(self, host=None, port=None):
url = self.broker
if url.scheme == URL.AMQPS:
diff --git a/python/qpid/tests/messaging/endpoints.py b/python/qpid/tests/messaging/endpoints.py
index db5ec03df2..62deacd0bd 100644
--- a/python/qpid/tests/messaging/endpoints.py
+++ b/python/qpid/tests/messaging/endpoints.py
@@ -524,7 +524,7 @@ class SessionTests(Base):
self.ssn.acknowledge(echos[0])
self.ssn.acknowledge(echos[1], Disposition(REJECTED))
self.ssn.acknowledge(echos[2],
- Disposition(REJECTED, code=3, text="test-reject"))
+ Disposition(REJECTED, code=0, text="test-reject"))
self.drain(rej, expected=msgs[1:])
self.ssn.acknowledge()
@@ -632,9 +632,9 @@ class SessionTests(Base):
def testDoubleCommit(self):
ssn = self.conn.session(transactional=True)
- snd = ssn.sender("amq.direct")
- rcv = ssn.receiver("amq.direct")
- msgs = [self.message("testDoubleCommit", i) for i in range(3)]
+ snd = ssn.sender("amq.direct/doubleCommit")
+ rcv = ssn.receiver("amq.direct/doubleCommit")
+ msgs = [self.message("testDoubleCommit", i, subject="doubleCommit") for i in range(3)]
for m in msgs:
snd.send(m)
ssn.commit()
@@ -1038,7 +1038,7 @@ class AddressTests(Base):
snd.close()
assert False, "successfully deleted amq.topic"
except SessionError, e:
- assert "Cannot delete default exchange" in str(e)
+ assert e.code == 530
# XXX: need to figure out close after error
self.conn._remove_session(self.ssn)
diff --git a/python/setup.py b/python/setup.py
index a0717ece1b..225ee44b91 100755
--- a/python/setup.py
+++ b/python/setup.py
@@ -298,7 +298,7 @@ class install_lib(_install_lib):
return outfiles + extra
setup(name="qpid-python",
- version="0.15",
+ version="0.17",
author="Apache Qpid",
author_email="dev@qpid.apache.org",
packages=["mllib", "qpid", "qpid.messaging", "qpid.tests",
diff --git a/specs/amqp.xsl b/specs/amqp.xsl
new file mode 100644
index 0000000000..afe3bd5e65
--- /dev/null
+++ b/specs/amqp.xsl
@@ -0,0 +1,534 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+<xsl:output indent="no"/>
+ <xsl:template match="node()[name()='amqp']">
+
+<html>
+ <head>
+ <title>AMQP <xsl:call-template name="initCap"><xsl:with-param name="input" select="@name"/></xsl:call-template></title>
+ <style type="text/css">
+ body {
+ margin: 2em;
+ padding: 1em;
+ font-family: "DejaVu LGC Sans", "Bitstream Vera Sans", arial, helvetica, sans-serif;
+ }
+
+ h2 {
+ font-size: 1.25em;
+ color: #339;
+ }
+
+ h2 a {
+ color: #339;
+ }
+
+ h3 {
+ font-size: 1em;
+ position: relative;
+ left: -0.5em;
+ }
+
+ h4 {
+ font-size: 1em;
+ position: relative;
+ left: -0.5em;
+ }
+
+ h1 a, h3 a, h4 a {
+ color: #000;
+ }
+
+ a {
+ text-decoration: none;
+ color: #66f;
+ }
+
+ a.anchor {
+ color: #000;
+ }
+
+ a.toc {
+ float: right;
+ }
+
+ table {
+ border-collapse: collapse;
+ margin: 1em 1em;
+ }
+
+ dt {
+ font-weight: bold;
+ }
+
+ dt:after {
+ content: ":";
+ }
+
+ div.toc {
+ border: 1px solid #ccc;
+ padding: 1em;
+ }
+
+ table.toc {
+ margin: 0;
+ }
+
+ table.pre {
+ background: #eee;
+ border: 1px solid #ccc;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ table.pre td {
+ font-family: Courier, monospace;
+ white-space: pre;
+ padding: 0em 2em;
+ }
+
+ table.definition {
+ width: 100%;
+ }
+
+ table.signature {
+ background: #eee;
+ border: 1px solid #ccc;
+ width: 100%;
+ }
+
+ table.signature td {
+ font-family: monospace;
+ white-space: pre;
+ padding: 1em;
+ }
+
+ table.composite {
+ width: 100%;
+ }
+
+ td.field {
+ padding: 0.5em 2em;
+ }
+
+ div.section {
+ padding: 0 0 0 1em;
+ }
+
+ div.doc {
+ padding: 0 0 1em 0;
+ }
+
+ table.composite div.doc {
+ padding: 0;
+ }
+
+ table.error {
+ width: 100%;
+ margin: 0;
+ }
+
+ table.error tr:last-child td {
+ padding: 0 0 0 1em;
+ }
+
+ .todo:before {
+ content: "TODO: ";
+ font-weight: bold;
+ color: red;
+ }
+
+ .todo {
+ font-variant: small-caps;
+ font-weight: bold;
+ color: red;
+ }
+ </style>
+ </head>
+ <body>
+ <h1>AMQP <xsl:call-template name="initCap"><xsl:with-param name="input" select="@name"/></xsl:call-template></h1>
+
+ <xsl:if test="descendant-or-self::node()[name()='section']"><xsl:call-template name="toc"/></xsl:if>
+ <xsl:apply-templates mode="spec" select="."/>
+ </body>
+</html>
+ </xsl:template>
+
+ <!-- Table of Contents -->
+
+ <xsl:template name="toc">
+ <h2><a name="toc">Table of Contents</a></h2>
+ <div class="toc">
+ <table class="toc" summary="Table of Contents">
+ <xsl:apply-templates mode="toc" select="."/>
+ </table>
+ </div>
+ </xsl:template>
+
+ <xsl:template mode="toc" match="node()[name()='section']">
+ <xsl:variable name="title"><xsl:choose>
+ <xsl:when test="@title"><xsl:value-of select="@title"/></xsl:when>
+ <xsl:otherwise><xsl:call-template name="initCapWords"><xsl:with-param name="input" select="translate(@name,'-',' ')"/></xsl:call-template></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="ref">#section-<xsl:value-of select="@name"/></xsl:variable>
+ <xsl:variable name="section-number"><xsl:value-of select="count(preceding-sibling::node()[name()='section'])+1"/></xsl:variable>
+ <tr><td><xsl:value-of select="$section-number"/><xsl:text> </xsl:text><xsl:element name="a"><xsl:attribute name="href"><xsl:value-of select="$ref"/></xsl:attribute><xsl:value-of select="$title"/></xsl:element></td><td><xsl:value-of select="@label"/></td></tr>
+ <xsl:apply-templates mode="toc" select="node()[name()='type' or name()='definition' or ( name()='doc' and attribute::node()[name()='title']!='')]"/>
+ </xsl:template>
+
+ <xsl:template mode="toc" match="node()[name()='doc' and attribute::node()[name()='title']]">
+ <xsl:variable name="ref">#doc-<xsl:choose><xsl:when test="@name"><xsl:value-of select="@name"/></xsl:when><xsl:otherwise><xsl:value-of select="generate-id(.)"/></xsl:otherwise></xsl:choose></xsl:variable>
+ <xsl:variable name="section-number"><xsl:apply-templates mode="doc-number" select="."/></xsl:variable>
+ <tr><td><xsl:text>&#160;&#160;&#160;&#160;&#160;&#160;</xsl:text><xsl:value-of select="$section-number"/><xsl:text> </xsl:text><xsl:element name="a"><xsl:attribute name="href"><xsl:value-of select="$ref"/></xsl:attribute><xsl:value-of select="@title"/></xsl:element></td><td><xsl:value-of select="@label"/></td></tr>
+ </xsl:template>
+
+ <xsl:template mode="toc" match="node()[name()='type' or name()='definition']">
+ <xsl:variable name="ref">#<xsl:value-of select="name()"/>-<xsl:value-of select="@name"/></xsl:variable>
+ <xsl:variable name="section-number"><xsl:apply-templates mode="type-number" select="."/></xsl:variable>
+ <tr><td><xsl:text>&#160;&#160;&#160;&#160;&#160;&#160;</xsl:text><xsl:if test="contains(substring-after($section-number,'.'),'.')"><xsl:text>&#160;&#160;&#160;&#160;&#160;&#160;</xsl:text></xsl:if><xsl:value-of select="$section-number"/><xsl:text> </xsl:text><xsl:element name="a"><xsl:attribute name="href"><xsl:value-of select="$ref"/></xsl:attribute><xsl:call-template name="initCapWords"><xsl:with-param name="input" select="translate(@name,'-',' ')"/></xsl:call-template></xsl:element></td><td><xsl:value-of select="@label"/></td></tr>
+ </xsl:template>
+
+ <!-- Sections -->
+
+ <xsl:template match="node()[name()='section']" mode="spec">
+ <xsl:variable name="title"><xsl:choose>
+ <xsl:when test="@title"><xsl:value-of select="@title"/></xsl:when>
+ <xsl:otherwise><xsl:call-template name="initCapWords"><xsl:with-param name="input" select="translate(@name,'-',' ')"/></xsl:call-template></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <h2><a class="toc" href="#toc"><xsl:text>&#8592;</xsl:text></a> <xsl:apply-templates mode="section-number" select="."/><xsl:text> </xsl:text><xsl:element name="a"><xsl:attribute name="name">section-<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="$title"/></xsl:element></h2>
+ <div class="section">
+ <xsl:apply-templates mode="spec" select="*"/>
+ </div>
+ </xsl:template>
+
+ <!-- docs -->
+ <xsl:template match="node()[name()='doc']" mode="spec">
+ <xsl:choose>
+ <xsl:when test="ancestor::node()[name() = 'doc']">
+ <xsl:if test="@title">
+ <h4><a class="toc" href="#toc"><xsl:text>&#8592;</xsl:text></a><xsl:element name="a"><xsl:attribute name="name">doc-<xsl:choose><xsl:when test="@name"><xsl:value-of select="@name"/></xsl:when><xsl:otherwise><xsl:value-of select="generate-id(.)"/></xsl:otherwise></xsl:choose></xsl:attribute><xsl:call-template name="initCapWords"><xsl:with-param name="input" select="translate(@title,'-',' ')"></xsl:with-param></xsl:call-template></xsl:element></h4>
+ </xsl:if>
+ <xsl:apply-templates mode="spec" select="*|comment()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="@title">
+ <h3><a class="toc" href="#toc"><xsl:text>&#8592;</xsl:text></a> <xsl:apply-templates mode="doc-number" select="."/><xsl:text> </xsl:text><xsl:element name="a"><xsl:attribute name="name">doc-<xsl:choose><xsl:when test="@name"><xsl:value-of select="@name"/></xsl:when><xsl:otherwise><xsl:value-of select="generate-id(.)"/></xsl:otherwise></xsl:choose></xsl:attribute><xsl:call-template name="initCapWords"><xsl:with-param name="input" select="translate(@title,'-',' ')"></xsl:with-param></xsl:call-template></xsl:element></h3>
+ </xsl:if>
+ <div class="doc">
+ <xsl:apply-templates mode="spec" select="*|comment()"/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- picture -->
+
+ <xsl:template match="node()[name()='picture']" mode="spec">
+ <xsl:element name="table"><xsl:attribute name="class">pre</xsl:attribute><xsl:if test="@title"><xsl:attribute name="summary"><xsl:value-of select="@title"/></xsl:attribute></xsl:if>
+ <xsl:if test="@title"><caption><xsl:value-of select="@title"/></caption></xsl:if>
+<tr><td>
+<xsl:apply-templates select="*|text()" mode="spec"/>
+</td></tr></xsl:element>
+ </xsl:template>
+
+ <!-- xref -->
+<xsl:template match="node()[name()='xref']" mode="spec">
+ <xsl:variable name="ref" select="@name"/>
+ <xsl:choose>
+ <!-- section xref -->
+ <xsl:when test="@type='section' or ancestor-or-self::node()/descendant-or-self::node()[name()='section' and @name=$ref]">
+ <xsl:element name="a"><xsl:attribute name="href">#section-<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@name"/></xsl:element>
+ </xsl:when>
+ <!-- type xref -->
+ <xsl:when test="@type='type' or ancestor-or-self::node()/descendant-or-self::node()[name()='type' and @name=$ref]">
+ <xsl:element name="a"><xsl:attribute name="href">#type-<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@name"/></xsl:element>
+ </xsl:when>
+ <!-- doc xref -->
+ <xsl:when test="@type='doc' or ancestor-or-self::node()/descendant-or-self::node()[name()='doc' and @name=$ref]">
+ <xsl:element name="a"><xsl:attribute name="href">#doc-<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@name"/></xsl:element>
+ </xsl:when>
+ <xsl:when test="@type='amqp'">
+ <xsl:element name="a"><xsl:attribute name="href"><xsl:value-of select="@name"/>.xml</xsl:attribute><xsl:call-template name="initCap"><xsl:with-param name="input"><xsl:value-of select="@name"/></xsl:with-param></xsl:call-template></xsl:element>
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="@name"/></xsl:otherwise>
+ </xsl:choose>
+
+
+
+</xsl:template>
+
+ <!-- todo -->
+ <xsl:template match="node()[name()='todo']" mode="spec"><span class="todo"><xsl:apply-templates select="*|text()" mode="spec"/></span></xsl:template>
+
+ <!-- primitive type -->
+ <xsl:template match="node()[name()='type' and @class='primitive']" mode="spec">
+ <h3><a class="toc" href="#toc"><xsl:text>&#8592;</xsl:text></a> <xsl:apply-templates mode="type-number" select="."/><xsl:text> </xsl:text> <xsl:element name="a"><xsl:attribute name="name">type-<xsl:value-of select="@name"/></xsl:attribute><xsl:call-template name="initCap"><xsl:with-param name="input" select="@name"/></xsl:call-template></xsl:element></h3>
+ <xsl:apply-templates select="." mode="type-signature"/>
+ <xsl:element name="table"><xsl:attribute name="class">signature</xsl:attribute><xsl:attribute name="summary"><xsl:value-of select="@label"/></xsl:attribute>
+ <tr><td><b><xsl:value-of select="@name"/></b>: <xsl:value-of select="@label"/></td></tr>
+ </xsl:element>
+
+ <b>Encodings:</b>
+ <xsl:element name="table"><xsl:attribute name="class">composite</xsl:attribute><xsl:attribute name="summary"><xsl:value-of select="@label"/></xsl:attribute>
+ <xsl:apply-templates select="node()[name()='encoding']" mode="spec"/>
+ </xsl:element>
+ </xsl:template>
+
+
+
+ <!-- composite type -->
+ <xsl:template match="node()[name()='type' and @class='composite']" mode="spec">
+ <h3><a class="toc" href="#toc"><xsl:text>&#8592;</xsl:text></a> <xsl:apply-templates mode="type-number" select="."/><xsl:text> </xsl:text> <xsl:element name="a"><xsl:attribute name="name">type-<xsl:value-of select="@name"/></xsl:attribute><xsl:call-template name="initCapWords"><xsl:with-param name="input" select="translate(@name,'-',' ')"></xsl:with-param></xsl:call-template></xsl:element></h3>
+ <xsl:apply-templates select="." mode="type-signature"/>
+ <xsl:apply-templates select="node()[name()='doc']" mode="spec"/>
+ <xsl:element name="table"><xsl:attribute name="class">composite</xsl:attribute><xsl:attribute name="summary"><xsl:value-of select="@name"/> fields</xsl:attribute>
+ <xsl:for-each select="node()[name()='field']">
+ <tr><td><b><xsl:value-of select="@name"/></b></td><td><i><xsl:value-of select="@label"/></i></td><td><xsl:choose>
+ <xsl:when test="@mandatory">mandatory</xsl:when>
+ <xsl:otherwise>optional</xsl:otherwise>
+ </xsl:choose><xsl:text> </xsl:text><xsl:call-template name="genTypeXref"><xsl:with-param name="type" select="@type"/></xsl:call-template><xsl:if test="@multiple">[]</xsl:if></td></tr>
+ <tr><td class="field" colspan="2"><xsl:apply-templates select="node()[name()='doc' or name()='error']" mode="spec"/></td></tr>
+ </xsl:for-each>
+ </xsl:element>
+ </xsl:template>
+
+ <!-- restricted type -->
+ <xsl:template match="node()[name()='type' and @class='restricted']" mode="spec">
+ <xsl:variable name="name"><xsl:value-of select="@name"/></xsl:variable>
+ <h3><a class="toc" href="#toc"><xsl:text>&#8592;</xsl:text></a> <xsl:apply-templates mode="type-number" select="."/><xsl:text> </xsl:text> <xsl:element name="a"><xsl:attribute name="name">type-<xsl:value-of select="@name"/></xsl:attribute><xsl:call-template name="initCapWords"><xsl:with-param name="input" select="translate(@name,'-',' ')"></xsl:with-param></xsl:call-template></xsl:element></h3>
+ <xsl:apply-templates select="." mode="type-signature"/>
+ <xsl:apply-templates select="node()[name()='doc']" mode="spec"/>
+ <xsl:element name="table"><xsl:attribute name="class">composite</xsl:attribute><xsl:attribute name="summary">possible values</xsl:attribute>
+ <xsl:for-each select="node()[name()='choice']">
+ <tr><td><b><xsl:element name="a"><xsl:attribute name="class">anchor</xsl:attribute><xsl:attribute name="name">choice-<xsl:value-of select="$name"/>-<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@name"/></xsl:element></b></td><td></td><td><xsl:value-of select="@value"/></td></tr>
+ <tr><td class="field" colspan="2"><xsl:apply-templates select="node()[name()='doc' or name()='error']" mode="spec"/></td></tr>
+ </xsl:for-each>
+ </xsl:element>
+ </xsl:template>
+
+ <!-- type signature -->
+ <xsl:template match="node()[name()='type']" mode="type-signature">
+ <table class="signature" summary="@(label)"><tr>
+<td>&#60;type<xsl:if test="@name"><xsl:text> </xsl:text>name="<xsl:value-of select="@name"/>"</xsl:if><xsl:if test="@class"><xsl:text> </xsl:text>class="<xsl:value-of select="@class"/>"</xsl:if><xsl:if test="@source"><xsl:text> </xsl:text>source="<xsl:value-of select="@source"/>"</xsl:if><xsl:if test="@provides"><xsl:text> </xsl:text>provides="<xsl:value-of select="@provides"/>"</xsl:if><xsl:if test="not( node()[name() = 'field' or name() = 'choice' or name() = 'descriptor'])">/</xsl:if>&#62;<xsl:if test="node()[name() = 'field' or name() = 'choice' or name() = 'descriptor']">
+<xsl:apply-templates select="node()[name()='field' or name()='choice' or name()='descriptor']" mode="type-signature"/><xsl:text>
+&#60;/type&#62;</xsl:text>
+</xsl:if>
+ </td></tr></table>
+ </xsl:template>
+
+ <xsl:template match="node()[name()='descriptor']" mode="type-signature">
+<xsl:text>
+ </xsl:text>&#60;descriptor<xsl:if test="@name"><xsl:text> </xsl:text>name="<xsl:value-of select="@name"/>"</xsl:if><xsl:if test="@code"><xsl:text> </xsl:text>code="<xsl:value-of select="@code"/>"</xsl:if><xsl:text>/&#62;</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="node()[name()='choice']" mode="type-signature">
+<xsl:text>
+ </xsl:text>&#60;choice<xsl:for-each select="attribute::node()[name() != 'label']"><xsl:text> </xsl:text><xsl:value-of select="name()"/>="<xsl:value-of select="."/>"</xsl:for-each><xsl:text>/&#62;</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="node()[name()='field']" mode="type-signature">
+<xsl:text>
+ </xsl:text>&#60;field<xsl:for-each select="attribute::node()[name() != 'label']"><xsl:text> </xsl:text><xsl:value-of select="name()"/>="<xsl:value-of select="."/>"</xsl:for-each><xsl:if test="not( node()[name()='error'] )"><xsl:text>/</xsl:text></xsl:if>&#62;<xsl:if test="node()[name()='error']">
+<xsl:apply-templates mode="type-signature" select="node()[name()='error']"/><xsl:text>
+ &#60;/field&#62;</xsl:text></xsl:if>
+ </xsl:template>
+
+ <xsl:template match="node()[name()='error']" mode="type-signature">
+<xsl:text>
+ </xsl:text>&#60;error<xsl:for-each select="attribute::node()[name() != 'label']"><xsl:text> </xsl:text><xsl:value-of select="name()"/>="<xsl:value-of select="."/>"</xsl:for-each><xsl:text>/&#62;</xsl:text>
+ </xsl:template>
+
+
+ <!-- encoding -->
+ <xsl:template match="node()[name()='encoding']" mode="spec">
+ <tr><td><b><xsl:value-of select="@name"/></b></td><td><i><xsl:value-of select="@label"/></i></td><td>code <xsl:value-of select="@code"/>: <xsl:choose>
+ <xsl:when test="@category='fixed'">fixed-width, <xsl:value-of select="@width"/> byte value</xsl:when>
+ <xsl:otherwise>variable-width, <xsl:value-of select="@width"/> byte size</xsl:otherwise>
+ </xsl:choose></td></tr>
+ <tr><td class="field" colspan="3"><xsl:apply-templates select="node()[name()='doc']" mode="spec"/></td></tr>
+
+ </xsl:template>
+
+
+ <!-- TypeListTable comment -->
+ <xsl:template match="comment()[self::comment()='TypeListTable']" mode="spec">
+ <table class="" summary="Primitive Types">
+ <xsl:for-each select="//descendant-or-self::node()[name()='type']">
+ <tr><td><xsl:element name="a"><xsl:attribute name="href">#type-<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@name"/></xsl:element></td><td><xsl:value-of select="@label"/></td></tr>
+ </xsl:for-each>
+ </table>
+ </xsl:template>
+
+ <!-- EncodingListTable comment -->
+ <xsl:template match="comment()[self::comment()='EncodingListTable']" mode="spec">
+ <table class="" summary="Primitive Type Encodings">
+ <tr><th>Type</th><th>Encoding</th><th>Code</th><th>Category</th><th>Description</th></tr>
+ <xsl:for-each select="//descendant-or-self::node()[name()='type']">
+ <xsl:variable name="type" select="@name"/>
+ <xsl:for-each select="node()[name()='encoding']">
+ <tr>
+ <td><xsl:element name="a"><xsl:attribute name="href">#type-<xsl:value-of select="$type"/></xsl:attribute><xsl:value-of select="$type"/></xsl:element></td>
+ <td><xsl:value-of select="@name"/></td>
+ <td><xsl:value-of select="@code"/></td>
+ <td><xsl:value-of select="@category"/>/<xsl:value-of select="@width"/></td>
+ <td><xsl:value-of select="@label"/></td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:template>
+
+
+ <!-- text -->
+
+ <xsl:template match="text()" mode="spec"><xsl:value-of select="."/></xsl:template>
+
+ <!-- error -->
+
+ <xsl:template match="node()[name()='error']" mode="spec">
+ <table class="error" summary="">
+ <tr>
+ <td><b><xsl:value-of select="@name"/> error:</b> </td>
+
+ <td align="right"><xsl:element name="a"><xsl:attribute name="href"><xsl:call-template name="genErrorXref"><xsl:with-param name="type" select="@value"/></xsl:call-template></xsl:attribute><xsl:value-of select="@value"/></xsl:element></td>
+ </tr>
+ <tr><td colspan="2"><xsl:apply-templates select="node()[name()='doc']" mode="spec"/></td></tr>
+ </table>
+ </xsl:template>
+
+ <!-- definition -->
+
+ <xsl:template mode="spec" match="node()[name()='definition']">
+ <h3><a class="toc" href="#toc"><xsl:text>&#8592;</xsl:text></a> <xsl:apply-templates mode="type-number" select="."/><xsl:text> </xsl:text> <xsl:element name="a"><xsl:attribute name="name">definition-<xsl:value-of select="@name"/></xsl:attribute><xsl:call-template name="initCap"><xsl:with-param name="input" select="@name"/></xsl:call-template></xsl:element></h3>
+
+ <xsl:element name="table"><xsl:attribute name="class">signature</xsl:attribute><xsl:attribute name="summary"><xsl:value-of select="@label"/></xsl:attribute>
+ <tr>
+ <td><xsl:value-of select="@name"/>: <xsl:value-of select="@label"/></td>
+ <td align="right"><xsl:value-of select="@value"/></td>
+ </tr>
+ </xsl:element>
+ <xsl:apply-templates mode="spec" select="node()[name()='doc']"/>
+ </xsl:template>
+
+ <!-- pass through tags -->
+
+ <xsl:template match="node()[name() = 'p']" mode="spec">
+ <xsl:element name="p"><xsl:if test="@title"><xsl:attribute name="title"><xsl:value-of select="@title"/></xsl:attribute></xsl:if><xsl:apply-templates mode="spec" select="*|text()"/></xsl:element>
+ </xsl:template>
+ <xsl:template match="node()[name() = 'i']" mode="spec">
+ <xsl:element name="i"><xsl:if test="@title"><xsl:attribute name="title"><xsl:value-of select="@title"/></xsl:attribute></xsl:if><xsl:apply-templates mode="spec" select="*|text()"/></xsl:element>
+ </xsl:template>
+ <xsl:template match="node()[name() = 'term']" mode="spec">
+ <xsl:element name="i"><xsl:if test="@title"><xsl:attribute name="title"><xsl:value-of select="@title"/></xsl:attribute></xsl:if><xsl:apply-templates mode="spec" select="*|text()"/></xsl:element>
+ </xsl:template>
+ <xsl:template match="node()[name() = 'b']" mode="spec">
+ <xsl:element name="b"><xsl:if test="@title"><xsl:attribute name="title"><xsl:value-of select="@title"/></xsl:attribute></xsl:if><xsl:apply-templates mode="spec" select="*|text()"/></xsl:element>
+ </xsl:template>
+ <xsl:template match="node()[name() = 'ol']" mode="spec">
+ <xsl:element name="ol"><xsl:if test="@title"><xsl:attribute name="title"><xsl:value-of select="@title"/></xsl:attribute></xsl:if><xsl:apply-templates mode="spec" select="*|text()"/></xsl:element>
+ </xsl:template>
+ <xsl:template match="node()[name() = 'ul']" mode="spec">
+ <xsl:element name="ul"><xsl:if test="@title"><xsl:attribute name="title"><xsl:value-of select="@title"/></xsl:attribute></xsl:if><xsl:apply-templates mode="spec" select="*|text()"/></xsl:element>
+ </xsl:template>
+ <xsl:template match="node()[name() = 'li']" mode="spec">
+ <xsl:element name="li"><xsl:if test="@title"><xsl:attribute name="title"><xsl:value-of select="@title"/></xsl:attribute></xsl:if><xsl:apply-templates mode="spec" select="*|text()"/></xsl:element>
+ </xsl:template>
+ <xsl:template match="node()[name() = 'dl']" mode="spec">
+ <xsl:element name="dl"><xsl:if test="@title"><xsl:attribute name="title"><xsl:value-of select="@title"/></xsl:attribute></xsl:if><xsl:apply-templates mode="spec" select="*|text()"/></xsl:element>
+ </xsl:template>
+ <xsl:template match="node()[name() = 'dt']" mode="spec">
+ <xsl:element name="dt"><xsl:if test="@title"><xsl:attribute name="title"><xsl:value-of select="@title"/></xsl:attribute></xsl:if><xsl:apply-templates mode="spec" select="*|text()"/></xsl:element>
+ </xsl:template>
+ <xsl:template match="node()[name() = 'dd']" mode="spec">
+ <xsl:element name="dd"><xsl:if test="@title"><xsl:attribute name="title"><xsl:value-of select="@title"/></xsl:attribute></xsl:if><xsl:apply-templates mode="spec" select="*|text()"/></xsl:element>
+ </xsl:template>
+
+
+
+ <!-- Document specific utilities -->
+
+ <xsl:template mode="section-number" match="node()[name()='section']"><xsl:value-of select="count(preceding-sibling::node()[name()='section'])+1"/></xsl:template>
+ <xsl:template mode="doc-number" match="node()[name()='doc']"><xsl:apply-templates mode="section-number" select="ancestor::node()[name()='section']"/>.<xsl:value-of select="1+count(preceding-sibling::node()[name()='doc' and attribute::title])"/></xsl:template>
+ <xsl:template mode="type-number" match="node()[name()='type' or name()='definition']">
+ <xsl:choose>
+ <xsl:when test="count(preceding-sibling::node()[name()='doc' and attribute::title])>0">
+ <xsl:variable name="doc-node" select="preceding-sibling::node()[name()='doc' and attribute::title]"/>
+ <xsl:variable name="offset" select="count($doc-node/preceding-sibling::node()[name()='type' or name()='definition'])"></xsl:variable>
+ <xsl:apply-templates mode="section-number" select="ancestor::node()[name()='section']"/>.<xsl:value-of select="count(preceding-sibling::node()[name()='doc' and attribute::title])"/>.<xsl:value-of select="1+count(preceding-sibling::node()[name()='type' or name()='definition'])-$offset"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="section-number" select="ancestor::node()[name()='section']"/>.<xsl:value-of select="1+count(preceding-sibling::node()[name()='type' or name()='definition'])"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template name="genTypeXref">
+ <xsl:param name="type"/>
+ <xsl:choose>
+ <xsl:when test="$type='*'">*</xsl:when>
+ <xsl:otherwise><xsl:element name="a"><xsl:attribute name="href"><xsl:choose>
+ <xsl:when test="/ancestor-or-self::node()/descendant-or-self::node()[name()='type' and @name=$type]">#type-<xsl:value-of select="$type"/></xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="document('index.xml')/descendant-or-self::node()[name()='xref' and @type='amqp']">
+ <xsl:variable name="docname"><xsl:value-of select="@name"/>.xml</xsl:variable>
+ <xsl:if test="document($docname)/descendant-or-self::node()[name()='type' and @name=$type]"><xsl:value-of select="$docname"/>#type-<xsl:value-of select="$type"/></xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose></xsl:attribute><xsl:value-of select="$type"/></xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="genErrorXref">
+ <xsl:param name="type"/>
+ <xsl:choose>
+ <xsl:when test="/ancestor-or-self::node()/descendant-or-self::node()[name()='type' and @provides='error']/node()[name()='choice' and @name=$type]">#choice-<xsl:value-of select="/ancestor-or-self::node()/descendant-or-self::node()[name()='type' and @provides='error' and child::node()[name()='choice' and @name=$type]]/@name"/>-<xsl:value-of select="$type"/></xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="document('index.xml')/descendant-or-self::node()[name()='xref' and @type='amqp']">
+ <xsl:variable name="docname"><xsl:value-of select="@name"/>.xml</xsl:variable>
+ <xsl:if test="document($docname)/descendant-or-self::node()[name()='type' and @provides='error']/node()[name()='choice' and @name=$type]">
+ #choice-<xsl:value-of select="document($docname)/descendant-or-self::node()[name()='type' and @provides='error' and child::node()[name()='choice' and @name=$type]]/@name"/>-<xsl:value-of select="$type"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <!-- General Utilities -->
+
+ <xsl:template name="toUpper"><xsl:param name="input"/><xsl:value-of select="translate($input,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"></xsl:value-of></xsl:template>
+ <xsl:template name="toLower"><xsl:param name="input"/><xsl:value-of select="translate($input,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')"></xsl:value-of></xsl:template>
+ <xsl:template name="initCap"><xsl:param name="input"/><xsl:call-template name="toUpper"><xsl:with-param name="input" select="substring($input,1,1)"/></xsl:call-template><xsl:value-of select="substring($input,2)"/></xsl:template>
+ <xsl:template name="initCapWords">
+ <xsl:param name="input"/>
+ <xsl:choose>
+ <xsl:when test="contains($input,' ')">
+ <xsl:call-template name="initCap"><xsl:with-param name="input" select="substring-before($input, ' ')"/></xsl:call-template><xsl:text> </xsl:text><xsl:call-template name="initCapWords"><xsl:with-param name="input" select="substring-after($input, ' ')"/></xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="initCap"><xsl:with-param name="input" select="$input"/></xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/specs/apache-filters.xml b/specs/apache-filters.xml
new file mode 100644
index 0000000000..24e1d521e2
--- /dev/null
+++ b/specs/apache-filters.xml
@@ -0,0 +1,228 @@
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<!DOCTYPE amqp SYSTEM "amqp.dtd">
+<?xml-stylesheet type="text/xsl" href="amqp.xsl"?>
+
+<amqp name="apache-filters" label="Apache Proposed AMQP 1-0 Filters">
+ <section name="legacy-amqp" title="Legacy AMQP Exchange Binding Support">
+ <doc>
+ <p>
+ Versions of AMQP prior to 1.0 prescribed a model of Exchanges and Queues, where Queues were
+ bound to Exchanges with a binding key whose meaning depended upon the type of the Exchange.
+ In order to allow a consistent mechanism for addressing legacy AMQP Exchanges over AMQP 1.0
+ the following filter types are defined. Use of an Exchange as an address for a Source thus
+ can be seen as equivalent to constructing exclusive queues bound to an Exchange in legacy
+ AMQP versions.
+ </p>
+ <p>
+ Containers which support the filters that are defined in this section should advertise the
+ capability <term>APACHE.ORG:LEGACY_AMQP_EXCHANGE_FILTERS</term> in their connection
+ capabilities when sending the open performative, and MUST provide this capability on
+ sources supporting these filter types.
+ </p>
+ </doc>
+ <type class="restricted" name="legacy-amqp-direct-binding" source="string" provides="filter">
+ <descriptor name="apache.org:legacy-amqp-direct-binding:string"
+ code="0x0000468C:0x00000000"/>
+ <doc>
+ <p>
+ The legacy-amqp-direct-binding filter consists of a described string value. The filter
+ matches a message if and only if the described string value exactly matches the subject
+ field of the Properties section of the message being evaluated. If the message has no
+ Properties section, or if the subject field of the Properties section is not set, then
+ the legacy-amqp-direct-binding filter does not match.
+ </p>
+ </doc>
+ </type>
+
+ <type class="restricted" name="legacy-amqp-topic-binding" source="string" provides="filter">
+ <descriptor name="apache.org:legacy-amqp-topic-binding:string"
+ code="0x0000468C:0x00000001"/>
+ <doc>
+ <p>
+ The legacy-amqp-topic-binding filter consists of a described string value. The value
+ value described by the type is interpreted as a pattern to match against the subject
+ field of the Properties section of the message being evaluated.
+ </p>
+ <ul>
+ <li>The pattern is formed using zero or more tokens, with each token delimited by the
+ "." character. The tokens "#" and "*" have special meanings.</li>
+ <li>The token consisting of the single character "*" matches a single word in the
+ subject field.</li>
+ <li>The token consisting of the single character "#" matches zero or more words in the
+ subject field.</li>
+ </ul>
+ <p>
+ Thus the filter value "*.stock.#" would match the subjects "usd.stock" and
+ "eur.stock.db" but not "stock.nasdaq".
+ </p>
+ <p>
+ If the message has no Properties section, or if the subject field of the Properties
+ section is not set, then the legacy-amqp-topic-binding filter matches only if the value
+ of the filter is a single "#".
+ </p>
+ </doc>
+ </type>
+
+ <type class="restricted" name="legacy-amqp-headers-binding" source="map" provides="filter">
+ <descriptor name="apache.org:legacy-amqp-headers-binding:map" code="0x0000468C:0x00000002"/>
+ <doc>
+ <p>
+ The legacy-amqp-headers-binding filter consists of a described map value. The map
+ value described by the type is interpreted as a pattern to match against the
+ application-properties section of the message being evaluated. The map has the same
+ restriction as the application-properties section, namely that the keys of this are
+ restricted to be of type string (which excludes the possibility of a null key) and the
+ values are restricted to be of simple types only, that is, excluding map, list, and
+ array types.
+ </p>
+ <p>
+ The key "x-match" in the described map has special meaning. This key MUST map to the
+ symbolic value "any" or the symbolic value "all" within the described map. All other
+ keys which begin "x-" MUST be ignored by the source when evaluating. If the value for
+ "x-match" is "all" then all other valid key-value pairs in the map MUST match with an
+ entry with the same key in the application-properties section. If the value for
+ "x-match" is "any" then the filter will accept the message if at least one key-value
+ pair matches the equivalent key value pair in the application-properties section.
+ </p>
+ <p>
+ A key-value pair in the filter's map matches a key-value pair in the
+ application-properties section if the keys are identical (including the same type), or
+ if the value in the filter map for the key is null.
+ </p>
+ </doc>
+ </type>
+ </section>
+ <section name="jms" title="Java Message Service Support">
+
+ <doc>
+ <p>
+ The Java Message Service defines two types of filtering of messages: firstly the ability to
+ exclude from a subscription messages sent by the same connection, secondly a more general
+ filtering syntax known as "selectors" based on an SQL like syntax.
+ </p>
+ <p>
+ AMQP filter extensions through which these two types of
+ filtering may be achieved are defined below. Their use, though
+ motivated by support for JMS, is not restricted to JMS.
+ </p>
+ </doc>
+
+ <type class="composite" name="no-local-filter" source="list" provides="filter">
+ <descriptor name="apache.org:no-local-filter:list" code="0x0000468C:0x00000003"/>
+ <doc>
+ <p>
+ A message will be accepted by the simple-no-local-filter if and only if the message
+ was originally sent to the container of the source on a separate connection from that
+ which is currently receiving from the source.
+ </p>
+ <p>
+ Containers which support this filter should advertise the
+ capability <term>APACHE.ORG:NO_LOCAL</term> in their
+ connection capabilities when sending the open
+ performative, and MUST provide this capability on sources
+ supporting these filter types.
+ </p>
+ </doc>
+ </type>
+
+ <type class="restricted" name="selector-filter" provides="filter" source="string">
+ <descriptor name="apache.org:selector-filter:string" code="0x0000468C:0x00000004"/>
+ <doc>
+ <p>
+ The Java Message Service "selector" defines an SQL like
+ syntax for filtering messages. The selector filters based
+ on the values of "headers" and "properties". The
+ selector-filter uses the selector as defined by JMS but
+ with the names of JMS headers translated into their AMQP
+ equivalents. The defined JMS headers can be mapped to
+ equivalent fields within the AMQP message sections:
+ </p>
+<picture title="Mapping JMS Headers to AMQP fields">
+JMS Header Name | AMQP 1.0 Field
+==================|====================================================
+JMSCorrelationID | correlation-id field of properties section
+JMSDeliveryMode | durable field of header section
+JMSDestination | to field of the properties section
+JMSExpiration | absolute-expiry-time of properties section
+JMSMessageID | message-id of properties section
+JMSPriority | priority field of header section
+JMSRedelivered | delivery-count > 0 in header section
+JMSReplyTo | reply-to in properties section
+JMSTimestamp | creation-time of properties section
+JMSType | annotation jms-type in message-annotations section
+</picture>
+ <p>
+ When encoding the selector string on the wire, these JMS
+ header names should be translated to amqp.<i>field_name</i>
+ where <i>field_name</i> is the appropriate AMQP 1.0 field
+ named in the table above, with the hyphen replaced by an
+ underscore. For example, the selector: "JMSCorrelationID =
+ ’abc’ AND color = ’blue’ AND weight > 2500" would be
+ transferred over the wire as: "amqp.correlation_id = ’abc’
+ AND color = ’blue’ AND weight > 2500"
+ </p>
+ <p>
+ The "properties" of the JMS message are equivalent to the AMQP application-properties
+ section. Thus a reference to a property Foo in a message selector would be evaluated
+ as the value associated with the key "Foo" (if present) in the application-properties
+ section.
+ </p>
+ <p>
+ The operands of the JMS selector are defined in terms of the types available within JMS,
+ When evaluated against the application properties section, the values within that section
+ MUST be evaluated according to the following type mapping.
+ </p>
+<picture title="Mapping AMQP types to JMS types">
+AMQP Type | JMS Selector Type
+==================|===================
+null | null
+boolean | boolean
+ubyte | short
+ushort | int
+uint | long
+ulong | long
+byte | byte
+short | short
+int | int
+long | long
+float | float
+double | double
+decimal32 | double
+decimal64 | double
+decimal128 | double
+char | char
+timestamp | long
+uuid | byte[16]
+binary | byte[]
+string | String
+symbol | String
+</picture>
+ <p>
+ Containers which support this filter should advertise the
+ capability <term>APACHE.ORG:SELECTOR</term> in their
+ connection capabilities when sending the open
+ performative, and MUST provide this capability on sources
+ supporting these filter types.
+ </p>
+ </doc>
+ </type>
+ </section>
+</amqp>
diff --git a/specs/management-schema.xml b/specs/management-schema.xml
index c8d2b9cdcb..66e122b049 100644
--- a/specs/management-schema.xml
+++ b/specs/management-schema.xml
@@ -84,6 +84,7 @@
<property name="maxConns" type="uint16" access="RO" desc="Maximum allowed connections"/>
<property name="connBacklog" type="uint16" access="RO" desc="Connection backlog limit for listening socket"/>
<property name="stagingThreshold" type="uint32" access="RO" desc="Broker stages messages over this size to disk"/>
+ <property name="mgmtPublish" type="bool" access="RO" desc="Broker's management agent sends unsolicited data on the publish interval"/>
<property name="mgmtPubInterval" type="uint16" access="RW" unit="second" min="1" desc="Interval for management broadcasts"/>
<property name="version" type="sstr" access="RO" desc="Running software version"/>
<property name="dataDir" type="lstr" access="RO" optional="y" desc="Persistent configuration storage location"/>
@@ -124,8 +125,8 @@
<statistic name="abandonedViaAlt" type="count64" unit="message" desc="Messages routed to alternate exchange from a deleted queue"/>
<method name="echo" desc="Request a response to test the path to the management broker">
- <arg name="sequence" dir="IO" type="uint32" default="0"/>
- <arg name="body" dir="IO" type="lstr" default=""/>
+ <arg name="sequence" dir="IO" type="uint32"/>
+ <arg name="body" dir="IO" type="lstr"/>
</method>
<method name="connect" desc="Establish a connection to another broker">
@@ -142,7 +143,7 @@
<arg name="srcQueue" dir="I" type="sstr" desc="Source queue"/>
<arg name="destQueue" dir="I" type="sstr" desc="Destination queue"/>
<arg name="qty" dir="I" type="uint32" desc="# of messages to move. 0 means all messages"/>
- <arg name="filter" dir="I" type="map" default="{}" desc="if specified, move only those messages matching this filter"/>
+ <arg name="filter" dir="I" type="map" desc="if specified, move only those messages matching this filter"/>
</method>
<method name="setLogLevel" desc="Set the log level">
@@ -271,14 +272,14 @@
<method name="purge" desc="Discard all or some messages on a queue">
<arg name="request" dir="I" type="uint32" desc="0 for all messages or n>0 for n messages"/>
- <arg name="filter" dir="I" type="map" default="{}" desc="if specified, purge only those messages matching this filter"/>
+ <arg name="filter" dir="I" type="map" desc="if specified, purge only those messages matching this filter"/>
</method>
<method name="reroute" desc="Remove all or some messages on this queue and route them to an exchange">
<arg name="request" dir="I" type="uint32" desc="0 for all messages or n>0 for n messages"/>
<arg name="useAltExchange" dir="I" type="bool" desc="Iff true, use the queue's configured alternate exchange; iff false, use exchange named in the 'exchange' argument"/>
<arg name="exchange" dir="I" type="sstr" desc="Name of the exchange to route the messages through"/>
- <arg name="filter" dir="I" type="map" default="{}" desc="if specified, reroute only those messages matching this filter"/>
+ <arg name="filter" dir="I" type="map" desc="if specified, reroute only those messages matching this filter"/>
</method>
</class>
diff --git a/tests/setup.py b/tests/setup.py
index b8e952998d..36e7a0531a 100755
--- a/tests/setup.py
+++ b/tests/setup.py
@@ -20,7 +20,7 @@
from distutils.core import setup
setup(name="qpid-tests",
- version="0.15",
+ version="0.17",
author="Apache Qpid",
author_email="dev@qpid.apache.org",
packages=["qpid_tests", "qpid_tests.broker_0_10", "qpid_tests.broker_0_9",
diff --git a/tests/src/py/qpid_tests/broker_0_10/management.py b/tests/src/py/qpid_tests/broker_0_10/management.py
index 867210b11d..2dd2291b2e 100644
--- a/tests/src/py/qpid_tests/broker_0_10/management.py
+++ b/tests/src/py/qpid_tests/broker_0_10/management.py
@@ -24,8 +24,17 @@ from threading import Condition
from time import sleep
import qmf.console
import qpid.messaging
+from qpidtoollibs import BrokerAgent
class ManagementTest (TestBase010):
+
+ def setup_access(self):
+ if 'broker_agent' not in self.__dict__:
+ self.conn2 = qpid.messaging.Connection(self.broker)
+ self.conn2.open()
+ self.broker_agent = BrokerAgent(self.conn2)
+ return self.broker_agent
+
"""
Tests for the management hooks
"""
@@ -376,6 +385,30 @@ class ManagementTest (TestBase010):
# Cleanup
for e in ["A", "B"]: session.exchange_delete(exchange=e)
+ def test_reroute_invalid_alt_exchange(self):
+ """
+ Test that an error is returned for an attempt to reroute to
+ alternate exchange on a queue for which no such exchange has
+ been defined.
+ """
+ self.startQmf()
+ session = self.session
+ # create queue with no alt-exchange, and send a message to it
+ session.queue_declare(queue="q", exclusive=True, auto_delete=True)
+ props = session.delivery_properties(routing_key="q")
+ session.message_transfer(message=Message(props, "don't reroute me!"))
+
+ # attempt to reroute the message to alt-exchange
+ q = self.qmf.getObjects(_class="queue", name="q")[0]
+ result = q.reroute(1, True, "", {})
+ # verify the attempt fails...
+ self.assertEqual(result.status, 4) #invalid parameter
+
+ # ...and message is still on the queue
+ self.subscribe(destination="d", queue="q")
+ self.assertEqual("don't reroute me!", session.incoming("d").get(timeout=1).body)
+
+
def test_methods_async (self):
"""
"""
@@ -559,12 +592,18 @@ class ManagementTest (TestBase010):
"""
Test message in/out stats for connection
"""
- self.startQmf()
+ agent = self.setup_access()
conn = self.connect()
session = conn.session("stats-session")
#using qmf find named session and the corresponding connection:
- conn_qmf = self.qmf.getObjects(_class="session", name="stats-session")[0]._connectionRef_
+ conn_qmf = None
+ sessions = agent.getAllSessions()
+ for s in sessions:
+ if s.name == "stats-session":
+ conn_qmf = agent.getConnection(s.connectionRef)
+
+ assert(conn_qmf)
#send a message to a queue
session.queue_declare(queue="stats-q", exclusive=True, auto_delete=True)
diff --git a/tests/src/py/qpid_tests/broker_0_10/msg_groups.py b/tests/src/py/qpid_tests/broker_0_10/msg_groups.py
index 938d3b3ee2..ace7611a2f 100644
--- a/tests/src/py/qpid_tests/broker_0_10/msg_groups.py
+++ b/tests/src/py/qpid_tests/broker_0_10/msg_groups.py
@@ -193,6 +193,10 @@ class MultiConsumerMsgGroupTests(Base):
s2 = self.setup_session()
b1 = s2.receiver("msg-group-q; {mode: browse}", options={"capacity":0})
+ m2 = b1.fetch(0);
+ assert m2.properties['THE-GROUP'] == 'A'
+ assert m2.content['index'] == 0
+
# C1 should acquire A-0
m1 = c1.fetch(0);
@@ -202,10 +206,6 @@ class MultiConsumerMsgGroupTests(Base):
## Queue = A-0, B-1, A-2, b-3, C-4
## Owners= ^C1, ---, +C1, ---, ---
- m2 = b1.fetch(0);
- assert m2.properties['THE-GROUP'] == 'A'
- assert m2.content['index'] == 0
-
m2 = b1.fetch(0)
assert m2.properties['THE-GROUP'] == 'B'
assert m2.content['index'] == 1
@@ -1122,6 +1122,70 @@ class MultiConsumerMsgGroupTests(Base):
snd.close()
+ def test_ttl_expire(self):
+ """ Verify that expired (TTL) group messages are skipped correctly
+ """
+ snd = self.ssn.sender("msg-group-q; {create:always, delete:sender," +
+ " node: {x-declare: {arguments:" +
+ " {'qpid.group_header_key':'THE-GROUP'," +
+ "'qpid.shared_msg_group':1}}}}")
+
+ groups = ["A","B","C","A","B","C"]
+ messages = [Message(content={}, properties={"THE-GROUP": g}) for g in groups]
+ index = 0
+ for m in messages:
+ m.content['index'] = index
+ index += 1
+ if m.properties['THE-GROUP'] == 'B':
+ m.ttl = 1;
+ snd.send(m)
+
+ sleep(2) # let all B's expire
+
+ # create consumers on separate sessions: C1,C2
+ s1 = self.setup_session()
+ c1 = s1.receiver("msg-group-q", options={"capacity":0})
+ s2 = self.setup_session()
+ c2 = s2.receiver("msg-group-q", options={"capacity":0})
+
+ # C1 should acquire A-0, then C2 should acquire C-2, Group B should
+ # expire and never be fetched
+
+ m1 = c1.fetch(0);
+ assert m1.properties['THE-GROUP'] == 'A'
+ assert m1.content['index'] == 0
+
+ m2 = c2.fetch(0);
+ assert m2.properties['THE-GROUP'] == 'C'
+ assert m2.content['index'] == 2
+
+ m1 = c1.fetch(0);
+ assert m1.properties['THE-GROUP'] == 'A'
+ assert m1.content['index'] == 3
+
+ m2 = c2.fetch(0);
+ assert m2.properties['THE-GROUP'] == 'C'
+ assert m2.content['index'] == 5
+
+ # there should be no more left for either consumer
+ try:
+ mx = c1.fetch(0)
+ assert False # should never get here
+ except Empty:
+ pass
+ try:
+ mx = c2.fetch(0)
+ assert False # should never get here
+ except Empty:
+ pass
+
+ c1.session.acknowledge()
+ c2.session.acknowledge()
+ c1.close()
+ c2.close()
+ snd.close()
+
+
class StickyConsumerMsgGroupTests(Base):
"""
Tests for the behavior of sticky-consumer message groups. These tests
diff --git a/tests/src/py/qpid_tests/broker_0_10/new_api.py b/tests/src/py/qpid_tests/broker_0_10/new_api.py
index 0bbcf342bc..05c4815e57 100644
--- a/tests/src/py/qpid_tests/broker_0_10/new_api.py
+++ b/tests/src/py/qpid_tests/broker_0_10/new_api.py
@@ -57,7 +57,7 @@ class GeneralTests(Base):
sess2 = self.setup_session()
tx = sess1.sender("amq.direct/key")
- rx_main = sess1.receiver("amq.direct/key;{link:{x-declare:{alternate-exchange:'amq.fanout'}}}")
+ rx_main = sess1.receiver("amq.direct/key;{link:{reliability:at-least-once,x-declare:{alternate-exchange:'amq.fanout'}}}")
rx_alt = sess2.receiver("amq.fanout")
rx_alt.capacity = 10
@@ -74,7 +74,7 @@ class GeneralTests(Base):
self.assertEqual(rx_alt.available(), 0, "No messages should have been routed to the alt_exchange")
sess1.close()
-
+ sleep(1)
self.assertEqual(rx_alt.available(), 5, "All 5 messages should have been routed to the alt_exchange")
sess2.close()
@@ -108,6 +108,7 @@ class GeneralTests(Base):
# Close sess1; This will cause the queue to be deleted
sess1.close()
+ sleep(1)
self.assertEqual(rx_alt.available(), 2, "2 of the messages should have been routed to the alt_exchange")
# Close sess2; This will cause the acquired messages to be requeued and routed to the alternate
diff --git a/tools/setup.py b/tools/setup.py
index 925c20bee9..302c25502f 100755
--- a/tools/setup.py
+++ b/tools/setup.py
@@ -20,20 +20,21 @@
from distutils.core import setup
setup(name="qpid-tools",
- version="0.15",
+ version="0.17",
author="Apache Qpid",
author_email="dev@qpid.apache.org",
+ package_dir={'' : 'src/py'},
packages=["qpidtoollibs"],
- scripts=["qpid-cluster",
- "qpid-cluster-store",
- "qpid-config",
- "qpid-ha-status",
- "qpid-printevents",
- "qpid-queue-stats",
- "qpid-route",
- "qpid-stat",
- "qpid-tool",
- "qmf-tool"],
+ scripts=["src/py/qpid-cluster",
+ "src/py/qpid-cluster-store",
+ "src/py/qpid-config",
+ "src/py/qpid-ha",
+ "src/py/qpid-printevents",
+ "src/py/qpid-queue-stats",
+ "src/py/qpid-route",
+ "src/py/qpid-stat",
+ "src/py/qpid-tool",
+ "src/py/qmf-tool"],
url="http://qpid.apache.org/",
license="Apache Software License",
description="Diagnostic and management tools for Apache Qpid brokers.")
diff --git a/tools/src/py/qmf-tool b/tools/src/py/qmf-tool
index 8413ca2ca0..db51c96796 100755
--- a/tools/src/py/qmf-tool
+++ b/tools/src/py/qmf-tool
@@ -266,7 +266,7 @@ class QmfData:
self.conn_options = conn_options
self.qmf_options = qmf_options
self.agent_filter = '[]'
- self.connection = cqpid.Connection(self.url, self.conn_options)
+ self.connection = cqpid.Connection(self.url, **self.conn_options)
self.connection.open()
self.session = qmf2.ConsoleSession(self.connection, self.qmf_options)
self.session.setAgentFilter(self.agent_filter)
diff --git a/tools/src/py/qpid-config b/tools/src/py/qpid-config
index 0110c60aa2..1308df765d 100755
--- a/tools/src/py/qpid-config
+++ b/tools/src/py/qpid-config
@@ -18,12 +18,18 @@
# specific language governing permissions and limitations
# under the License.
#
+import pdb
import os
from optparse import OptionParser, OptionGroup, IndentedHelpFormatter
import sys
import locale
-from qmf.console import Session
+
+home = os.environ.get("QPID_TOOLS_HOME", os.path.normpath("/usr/share/qpid-tools"))
+sys.path.append(os.path.join(home, "python"))
+
+from qpid.messaging import Connection
+from qpidtoollibs import BrokerAgent
usage = """
Usage: qpid-config [OPTIONS]
@@ -36,15 +42,16 @@ Usage: qpid-config [OPTIONS]
qpid-config [OPTIONS] bind <exchange-name> <queue-name> [binding-key]
<for type xml> [-f -|filename]
<for type header> [all|any] k1=v1 [, k2=v2...]
- qpid-config [OPTIONS] unbind <exchange-name> <queue-name> [binding-key]"""
+ qpid-config [OPTIONS] unbind <exchange-name> <queue-name> [binding-key]
+ qpid-config [OPTIONS] reload-acl"""
description = """
Examples:
$ qpid-config add queue q
$ qpid-config add exchange direct d -a localhost:5672
-$ qpid-config exchanges -a 10.1.1.7:10000
-$ qpid-config queues -a guest/guest@broker-host:10000
+$ qpid-config exchanges -b 10.1.1.7:10000
+$ qpid-config queues -b guest/guest@broker-host:10000
Add Exchange <type> values:
@@ -55,7 +62,7 @@ Add Exchange <type> values:
xml XML Exchange - allows content filtering using an XQuery
-Queue Limit Actions
+Queue Limit Actions:
none (default) - Use broker's default policy
reject - Reject enqueued messages
@@ -63,12 +70,14 @@ Queue Limit Actions
ring - Replace oldest unacquired message with new
ring-strict - Replace oldest message, reject if oldest is acquired
-Queue Ordering Policies
+Replication levels:
- fifo (default) - First in, first out
- lvq - Last Value Queue ordering, allows queue browsing
- lvq-no-browse - Last Value Queue ordering, browsing clients may lose data"""
+ none - no replication
+ configuration - replicate queue and exchange existence and bindings, but not messages.
+ all - replicate configuration and messages
+"""
+REPLICATE_LEVELS= ["none", "configuration", "all"]
class Config:
def __init__(self):
@@ -77,8 +86,9 @@ class Config:
self._connTimeout = 10
self._ignoreDefault = False
self._altern_ex = None
- self._passive = False
self._durable = False
+ self._replicate = None
+ self._ha_admin = False
self._clusterDurable = False
self._if_empty = True
self._if_unused = True
@@ -87,8 +97,8 @@ class Config:
self._maxQueueSize = None
self._maxQueueCount = None
self._limitPolicy = None
- self._order = None
self._msgSequence = False
+ self._lvq_key = None
self._ive = False
self._eventGeneration = None
self._file = None
@@ -100,6 +110,7 @@ class Config:
self._msgGroupHeader = None
self._sharedMsgGroup = False
self._extra_arguments = []
+ self._start_replica = None
self._returnCode = 0
config = Config()
@@ -110,8 +121,7 @@ MAX_QUEUE_SIZE = "qpid.max_size"
MAX_QUEUE_COUNT = "qpid.max_count"
POLICY_TYPE = "qpid.policy_type"
CLUSTER_DURABLE = "qpid.persist_last_node"
-LVQ = "qpid.last_value_queue"
-LVQNB = "qpid.last_value_queue_no_browse"
+LVQ_KEY = "qpid.last_value_queue_key"
MSG_SEQUENCE = "qpid.msg_sequence"
IVE = "qpid.ive"
QUEUE_EVENT_GENERATION = "qpid.queue_event_generation"
@@ -121,14 +131,18 @@ FLOW_STOP_SIZE = "qpid.flow_stop_size"
FLOW_RESUME_SIZE = "qpid.flow_resume_size"
MSG_GROUP_HDR_KEY = "qpid.group_header_key"
SHARED_MSG_GROUP = "qpid.shared_msg_group"
+REPLICATE = "qpid.replicate"
#There are various arguments to declare that have specific program
#options in this utility. However there is now a generic mechanism for
#passing arguments as well. The SPECIAL_ARGS list contains the
#arguments for which there are specific program options defined
#i.e. the arguments for which there is special processing on add and
#list
-SPECIAL_ARGS=[FILECOUNT,FILESIZE,MAX_QUEUE_SIZE,MAX_QUEUE_COUNT,POLICY_TYPE,CLUSTER_DURABLE,LVQ,LVQNB,MSG_SEQUENCE,IVE,QUEUE_EVENT_GENERATION,FLOW_STOP_COUNT,FLOW_STOP_SIZE,FLOW_RESUME_SIZE,
- MSG_GROUP_HDR_KEY,SHARED_MSG_GROUP]
+SPECIAL_ARGS=[
+ FILECOUNT,FILESIZE,MAX_QUEUE_SIZE,MAX_QUEUE_COUNT,POLICY_TYPE,CLUSTER_DURABLE,
+ LVQ_KEY,MSG_SEQUENCE,IVE,QUEUE_EVENT_GENERATION,
+ FLOW_STOP_COUNT,FLOW_STOP_SIZE,FLOW_RESUME_SIZE,
+ MSG_GROUP_HDR_KEY,SHARED_MSG_GROUP,REPLICATE]
class JHelpFormatter(IndentedHelpFormatter):
"""Format usage and description without stripping newlines from usage strings
@@ -146,7 +160,7 @@ class JHelpFormatter(IndentedHelpFormatter):
def Usage():
print usage
- exit(-1)
+ sys.exit(-1)
def OptionsAndArguments(argv):
""" Set global variables for options, return arguments """
@@ -160,8 +174,8 @@ def OptionsAndArguments(argv):
group1 = OptionGroup(parser, "General Options")
group1.add_option("-t", "--timeout", action="store", type="int", default=10, metavar="<secs>", help="Maximum time to wait for broker connection (in seconds)")
- group1.add_option("-b", "--bindings", action="store_true", help="Show bindings in queue or exchange list")
- group1.add_option("-a", "--broker-addr", action="store", type="string", default="localhost:5672", metavar="<address>", help="Address of qpidd broker with syntax: [username/password@] hostname | ip-address [:<port>]")
+ group1.add_option("-r", "--recursive", action="store_true", help="Show bindings in queue or exchange list")
+ group1.add_option("-b", "--broker", action="store", type="string", default="localhost:5672", metavar="<address>", help="Address of qpidd broker with syntax: [username/password@] hostname | ip-address [:<port>]")
group1.add_option("--sasl-mechanism", action="store", type="string", metavar="<mech>", help="SASL mechanism for authentication (e.g. EXTERNAL, ANONYMOUS, PLAIN, CRAM-MD, DIGEST-MD5, GSSAPI). SASL automatically picks the most secure available mechanism - use this option to override.")
parser.add_option_group(group1)
@@ -171,8 +185,9 @@ def OptionsAndArguments(argv):
group2 = OptionGroup(parser, "Options for Adding Exchanges and Queues")
group2.add_option("--alternate-exchange", action="store", type="string", metavar="<aexname>", help="Name of the alternate-exchange for the new queue or exchange. Exchanges route messages to the alternate exchange if they are unable to route them elsewhere. Queues route messages to the alternate exchange if they are rejected by a subscriber or orphaned by queue deletion.")
- group2.add_option("--passive", "--dry-run", action="store_true", help="Do not actually add the exchange or queue, ensure that all parameters and permissions are correct and would allow it to be created.")
group2.add_option("--durable", action="store_true", help="The new queue or exchange is durable.")
+ group2.add_option("--replicate", action="store", metavar="<level>", help="Enable automatic replication in a HA cluster. <level> is 'none', 'configuration' or 'all').")
+ group2.add_option("--ha-admin", action="store_true", help="Allow connection to a HA backup broker.")
parser.add_option_group(group2)
group3 = OptionGroup(parser, "Options for Adding Queues")
@@ -182,7 +197,7 @@ def OptionsAndArguments(argv):
group3.add_option("--max-queue-size", action="store", type="int", metavar="<n>", help="Maximum in-memory queue size as bytes")
group3.add_option("--max-queue-count", action="store", type="int", metavar="<n>", help="Maximum in-memory queue size as a number of messages")
group3.add_option("--limit-policy", action="store", choices=["none", "reject", "flow-to-disk", "ring", "ring-strict"], metavar="<policy>", help="Action to take when queue limit is reached")
- group3.add_option("--order", action="store", choices=["fifo", "lvq", "lvq-no-browse"], metavar="<ordering>", help="Queue ordering policy")
+ group3.add_option("--lvq-key", action="store", metavar="<key>", help="Last Value Queue key")
group3.add_option("--generate-queue-events", action="store", type="int", metavar="<n>", help="If set to 1, every enqueue will generate an event that can be processed by registered listeners (e.g. for replication). If set to 2, events will be generated for enqueues and dequeues.")
group3.add_option("--flow-stop-size", action="store", type="int", metavar="<n>",
help="Turn on sender flow control when the number of queued bytes exceeds this value.")
@@ -198,6 +213,7 @@ def OptionsAndArguments(argv):
help="Allow message group consumption across multiple consumers.")
group3.add_option("--argument", dest="extra_arguments", action="append", default=[],
metavar="<NAME=VALUE>", help="Specify a key-value pair to add to queue arguments")
+ group3.add_option("--start-replica", metavar="<broker-url>", help="Start replication from the same-named queue at <broker-url>")
# no option for declaring an exclusive queue - which can only be used by the session that creates it.
parser.add_option_group(group3)
@@ -224,10 +240,10 @@ def OptionsAndArguments(argv):
except:
args = encArgs
- if opts.bindings:
+ if opts.recursive:
config._recursive = True
- if opts.broker_addr:
- config._host = opts.broker_addr
+ if opts.broker:
+ config._host = opts.broker
if opts.timeout is not None:
config._connTimeout = opts.timeout
if config._connTimeout == 0:
@@ -236,10 +252,13 @@ def OptionsAndArguments(argv):
config._ignoreDefault = True
if opts.alternate_exchange:
config._altern_ex = opts.alternate_exchange
- if opts.passive:
- config._passive = True
if opts.durable:
config._durable = True
+ if opts.replicate:
+ if not opts.replicate in REPLICATE_LEVELS:
+ raise Exception("Invalid replication level '%s', should be one of: %s" % (opts.replicate, ", ".join(REPLICATE_LEVELS)))
+ config._replicate = opts.replicate
+ if opts.ha_admin: config._ha_admin = True
if opts.cluster_durable:
config._clusterDurable = True
if opts.file:
@@ -254,10 +273,10 @@ def OptionsAndArguments(argv):
config._maxQueueCount = opts.max_queue_count
if opts.limit_policy:
config._limitPolicy = opts.limit_policy
- if opts.order:
- config._order = opts.order
if opts.sequence:
config._msgSequence = True
+ if opts.lvq_key:
+ config._lvq_key = opts.lvq_key
if opts.ive:
config._ive = True
if opts.generate_queue_events:
@@ -285,6 +304,8 @@ def OptionsAndArguments(argv):
config._sharedMsgGroup = True
if opts.extra_arguments:
config._extra_arguments = opts.extra_arguments
+ if opts.start_replica:
+ config._start_replica = opts.start_replica
return args
@@ -331,27 +352,24 @@ def snarf_header_args(args):
class BrokerManager:
def __init__(self):
self.brokerName = None
- self.qmf = None
+ self.conn = None
self.broker = None
- self.mechanism = None
def SetBroker(self, brokerUrl, mechanism):
self.url = brokerUrl
- self.qmf = Session()
- self.broker = self.qmf.addBroker(brokerUrl, config._connTimeout, mechanism)
- agents = self.qmf.getAgents()
- for a in agents:
- if a.getAgentBank() == '0':
- self.brokerAgent = a
+ client_properties={}
+ if config._ha_admin: client_properties["qpid.ha-admin"] = 1
+ self.conn = Connection.establish(self.url, sasl_mechanisms=mechanism, client_properties=client_properties)
+ self.broker = BrokerAgent(self.conn)
def Disconnect(self):
- if self.broker:
- self.qmf.delBroker(self.broker)
+ if self.conn:
+ self.conn.close()
def Overview(self):
- exchanges = self.qmf.getObjects(_class="exchange", _agent=self.brokerAgent)
- queues = self.qmf.getObjects(_class="queue", _agent=self.brokerAgent)
- print "Total Exchanges: %d" % len (exchanges)
+ exchanges = self.broker.getAllExchanges()
+ queues = self.broker.getAllQueues()
+ print "Total Exchanges: %d" % len(exchanges)
etype = {}
for ex in exchanges:
if ex.type not in etype:
@@ -362,16 +380,16 @@ class BrokerManager:
print "%15s: %d" % (typ, etype[typ])
print
- print " Total Queues: %d" % len (queues)
+ print " Total Queues: %d" % len(queues)
durable = 0
for queue in queues:
if queue.durable:
durable = durable + 1
print " durable: %d" % durable
- print " non-durable: %d" % (len (queues) - durable)
+ print " non-durable: %d" % (len(queues) - durable)
def ExchangeList(self, filter):
- exchanges = self.qmf.getObjects(_class="exchange", _agent=self.brokerAgent)
+ exchanges = self.broker.getAllExchanges()
caption1 = "Type "
caption2 = "Exchange Name"
maxNameLen = len(caption2)
@@ -398,22 +416,23 @@ class BrokerManager:
args = ex.arguments
if not args: args = {}
if ex.durable: print "--durable",
+ if REPLICATE in args: print "--replicate=%s" % args[REPLICATE],
if MSG_SEQUENCE in args and args[MSG_SEQUENCE] == 1: print "--sequence",
if IVE in args and args[IVE] == 1: print "--ive",
if ex.altExchange:
- print "--alternate-exchange=%s" % ex._altExchange_.name,
+ print "--alternate-exchange=%s" % ex.altExchange,
print
def ExchangeListRecurse(self, filter):
- exchanges = self.qmf.getObjects(_class="exchange", _agent=self.brokerAgent)
- bindings = self.qmf.getObjects(_class="binding", _agent=self.brokerAgent)
- queues = self.qmf.getObjects(_class="queue", _agent=self.brokerAgent)
+ exchanges = self.broker.getAllExchanges()
+ bindings = self.broker.getAllBindings()
+ queues = self.broker.getAllQueues()
for ex in exchanges:
if config._ignoreDefault and not ex.name: continue
if self.match(ex.name, filter):
print "Exchange '%s' (%s)" % (ex.name, ex.type)
for bind in bindings:
- if bind.exchangeRef == ex.getObjectId():
+ if bind.exchangeRef == ex.name:
qname = "<unknown>"
queue = self.findById(queues, bind.queueRef)
if queue != None:
@@ -425,7 +444,7 @@ class BrokerManager:
def QueueList(self, filter):
- queues = self.qmf.getObjects(_class="queue", _agent=self.brokerAgent)
+ queues = self.broker.getAllQueues()
caption = "Queue Name"
maxNameLen = len(caption)
found = False
@@ -450,6 +469,7 @@ class BrokerManager:
args = q.arguments
if not args: args = {}
if q.durable: print "--durable",
+ if REPLICATE in args: print "--replicate=%s" % args[REPLICATE],
if CLUSTER_DURABLE in args and args[CLUSTER_DURABLE] == 1: print "--cluster-durable",
if q.autoDelete: print "auto-del",
if q.exclusive: print "excl",
@@ -458,11 +478,10 @@ class BrokerManager:
if MAX_QUEUE_SIZE in args: print "--max-queue-size=%s" % args[MAX_QUEUE_SIZE],
if MAX_QUEUE_COUNT in args: print "--max-queue-count=%s" % args[MAX_QUEUE_COUNT],
if POLICY_TYPE in args: print "--limit-policy=%s" % args[POLICY_TYPE].replace("_", "-"),
- if LVQ in args and args[LVQ] == 1: print "--order lvq",
- if LVQNB in args and args[LVQNB] == 1: print "--order lvq-no-browse",
+ if LVQ_KEY in args: print "--lvq-key=%s" % args[LVQ_KEY],
if QUEUE_EVENT_GENERATION in args: print "--generate-queue-events=%s" % args[QUEUE_EVENT_GENERATION],
if q.altExchange:
- print "--alternate-exchange=%s" % q._altExchange_.name,
+ print "--alternate-exchange=%s" % q.altExchange,
if FLOW_STOP_SIZE in args: print "--flow-stop-size=%s" % args[FLOW_STOP_SIZE],
if FLOW_RESUME_SIZE in args: print "--flow-resume-size=%s" % args[FLOW_RESUME_SIZE],
if FLOW_STOP_COUNT in args: print "--flow-stop-count=%s" % args[FLOW_STOP_COUNT],
@@ -472,14 +491,14 @@ class BrokerManager:
print " ".join(["--argument %s=%s" % (k, v) for k,v in args.iteritems() if not k in SPECIAL_ARGS])
def QueueListRecurse(self, filter):
- exchanges = self.qmf.getObjects(_class="exchange", _agent=self.brokerAgent)
- bindings = self.qmf.getObjects(_class="binding", _agent=self.brokerAgent)
- queues = self.qmf.getObjects(_class="queue", _agent=self.brokerAgent)
+ exchanges = self.broker.getAllExchanges()
+ bindings = self.broker.getAllBindings()
+ queues = self.broker.getAllQueues()
for queue in queues:
if self.match(queue.name, filter):
print "Queue '%s'" % queue.name
for bind in bindings:
- if bind.queueRef == queue.getObjectId():
+ if bind.queueRef == queue.name:
ename = "<unknown>"
ex = self.findById(exchanges, bind.exchangeRef)
if ex != None:
@@ -508,16 +527,21 @@ class BrokerManager:
declArgs[MSG_SEQUENCE] = 1
if config._ive:
declArgs[IVE] = 1
- if config._altern_ex != None:
- self.broker.getAmqpSession().exchange_declare(exchange=ename, type=etype, alternate_exchange=config._altern_ex, passive=config._passive, durable=config._durable, arguments=declArgs)
- else:
- self.broker.getAmqpSession().exchange_declare(exchange=ename, type=etype, passive=config._passive, durable=config._durable, arguments=declArgs)
+ if config._altern_ex:
+ declArgs['alternate-exchange'] = config._altern_ex
+ if config._durable:
+ declArgs['durable'] = 1
+ if config._replicate:
+ declArgs[REPLICATE] = config._replicate
+ self.broker.addExchange(etype, ename, declArgs)
+
def DelExchange(self, args):
if len(args) < 1:
Usage()
ename = args[0]
- self.broker.getAmqpSession().exchange_delete(exchange=ename)
+ self.broker.delExchange(ename)
+
def AddQueue(self, args):
if len(args) < 1:
@@ -550,15 +574,10 @@ class BrokerManager:
elif config._limitPolicy == "ring-strict":
declArgs[POLICY_TYPE] = "ring_strict"
- if config._clusterDurable:
+ if config._clusterDurable:
declArgs[CLUSTER_DURABLE] = 1
- if config._order:
- if config._order == "fifo":
- pass
- elif config._order == "lvq":
- declArgs[LVQ] = 1
- elif config._order == "lvq-no-browse":
- declArgs[LVQNB] = 1
+ if config._lvq_key:
+ declArgs[LVQ_KEY] = config._lvq_key
if config._eventGeneration:
declArgs[QUEUE_EVENT_GENERATION] = config._eventGeneration
@@ -576,17 +595,21 @@ class BrokerManager:
if config._sharedMsgGroup:
declArgs[SHARED_MSG_GROUP] = 1
- if config._altern_ex != None:
- self.broker.getAmqpSession().queue_declare(queue=qname, alternate_exchange=config._altern_ex, passive=config._passive, durable=config._durable, arguments=declArgs)
- else:
- self.broker.getAmqpSession().queue_declare(queue=qname, passive=config._passive, durable=config._durable, arguments=declArgs)
-
+ if config._altern_ex:
+ declArgs['alternate-exchange'] = config._altern_ex
+ if config._durable:
+ declArgs['durable'] = 1
+ if config._replicate:
+ declArgs[REPLICATE] = config._replicate
+ self.broker.addQueue(qname, declArgs)
+ if config._start_replica: # Start replication
+ self.broker._method("replicate", {"broker":config._start_replica, "queue":qname}, "org.apache.qpid.ha:habroker:ha-broker")
def DelQueue(self, args):
if len(args) < 1:
Usage()
qname = args[0]
- self.broker.getAmqpSession().queue_delete(queue=qname, if_empty=config._if_empty, if_unused=config._if_unused)
+ self.broker.delQueue(qname)
def Bind(self, args):
@@ -599,7 +622,7 @@ class BrokerManager:
key = args[2]
# query the exchange to determine its type.
- res = self.broker.getAmqpSession().exchange_query(ename)
+ res = self.broker.getExchange(ename)
# type of the xchg determines the processing of the rest of
# argv. if it's an xml xchg, we want to find a file
@@ -608,7 +631,7 @@ class BrokerManager:
# map containing key/value pairs. if neither of those, extra
# args are ignored.
ok = True
- _args = None
+ _args = {}
if res.type == "xml":
# this checks/imports the -f arg
[ok, xquery] = snarf_xquery_args()
@@ -622,10 +645,7 @@ class BrokerManager:
if not ok:
sys.exit(1)
- self.broker.getAmqpSession().exchange_bind(queue=qname,
- exchange=ename,
- binding_key=key,
- arguments=_args)
+ self.broker.bind(ename, qname, key, _args)
def Unbind(self, args):
if len(args) < 2:
@@ -635,11 +655,20 @@ class BrokerManager:
key = ""
if len(args) > 2:
key = args[2]
- self.broker.getAmqpSession().exchange_unbind(queue=qname, exchange=ename, binding_key=key)
+ self.broker.unbind(ename, qname, key)
+
+ def ReloadAcl(self):
+ try:
+ self.broker.reloadAclFile()
+ except Exception, e:
+ if str(e).find('No object found') != -1:
+ print "Failed: ACL Module Not Loaded in Broker"
+ else:
+ raise
def findById(self, items, id):
for item in items:
- if item.getObjectId() == id:
+ if item.name == id:
return item
return None
@@ -697,6 +726,8 @@ def main(argv=None):
bm.Bind(args[1:])
elif cmd == "unbind":
bm.Unbind(args[1:])
+ elif cmd == "reload-acl":
+ bm.ReloadAcl()
else:
Usage()
except KeyboardInterrupt:
@@ -725,9 +756,9 @@ def main(argv=None):
if e.__class__.__name__ != "Timeout":
print "Failed: %s: %s" % (e.__class__.__name__, e)
return 1
-
return config._returnCode
+
if __name__ == "__main__":
sys.exit(main())
diff --git a/tools/src/py/qpid-ha b/tools/src/py/qpid-ha
new file mode 100755
index 0000000000..bd8040cfbe
--- /dev/null
+++ b/tools/src/py/qpid-ha
@@ -0,0 +1,153 @@
+#!/usr/bin/env python
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+import qmf.console, optparse, sys, time, os
+from qpid.management import managementChannel, managementClient
+from qpid.messaging import Connection
+from qpid.messaging import Message as QpidMessage
+from qpidtoollibs.broker import BrokerAgent
+try:
+ from uuid import uuid4
+except ImportError:
+ from qpid.datatypes import uuid4
+
+# QMF address for the HA broker object.
+HA_BROKER = "org.apache.qpid.ha:habroker:ha-broker"
+
+class Command:
+ commands = {}
+
+ def __init__(self, name, help, args=[]):
+ Command.commands[name] = self
+ self.name = name
+ self.args = args
+ usage="%s [options] %s\n\n%s"%(name, " ".join(args), help)
+ self.help = help
+ self.op=optparse.OptionParser(usage)
+ self.op.add_option("-b", "--broker", metavar="<url>", help="Connect to broker at <url>")
+
+ def execute(self):
+ opts, args = self.op.parse_args()
+ if len(args) != len(self.args)+1:
+ self.op.print_help()
+ raise Exception("Wrong number of arguments")
+ broker = opts.broker or "localhost:5672"
+ connection = Connection.establish(broker, client_properties={"qpid.ha-admin":1})
+ qmf_broker = BrokerAgent(connection)
+ ha_broker = qmf_broker.getHaBroker()
+ if not ha_broker: raise Exception("HA module is not loaded on broker at %s"%broker)
+ try: return self.do_execute(qmf_broker, ha_broker, opts, args)
+ finally: connection.close()
+
+ def do_execute(self, qmf_broker, opts, args):
+ raise Exception("Command '%s' is not yet implemented"%self.name)
+
+class PromoteCmd(Command):
+ def __init__(self):
+ Command.__init__(self, "promote","Promote broker from backup to primary")
+ def do_execute(self, qmf_broker, ha_broker, opts, args):
+ qmf_broker._method("promote", {}, HA_BROKER)
+PromoteCmd()
+
+class StatusCmd(Command):
+ def __init__(self):
+ Command.__init__(self, "status", "Print HA status")
+ self.op.add_option(
+ "--expect", type="string", metavar="<status>",
+ help="Don't print status but return 0 if it matches <status>, 1 otherwise")
+ def do_execute(self, qmf_broker, ha_broker, opts, args):
+ if opts.expect:
+ if opts.expect != ha_broker.status: return 1
+ else:
+ print ha_broker.status
+ return 0
+StatusCmd()
+
+class ReplicateCmd(Command):
+ def __init__(self):
+ Command.__init__(self, "replicate", "Set up replication from <queue> on <remote-broker> to <queue> on the current broker.", ["<queue>", "<remote-broker>"])
+ def do_execute(self, qmf_broker, ha_broker, opts, args):
+ qmf_broker._method("replicate", {"broker":args[1], "queue":args[2]}, HA_BROKER)
+ReplicateCmd()
+
+class SetCmd(Command):
+ def __init__(self):
+ Command.__init__(self, "set", "Set HA configuration settings")
+ def add(optname, metavar, type, help):
+ self.op.add_option(optname, metavar=metavar, type=type, help=help, action="store")
+ add("--brokers", "<url>", "string", "HA brokers use <url> to connect to each other")
+ add("--public-brokers", "<url>", "string", "Clients use <url> to connect to HA brokers")
+ add("--backups", "<n>", "int", "Expect <n> backups to be running"),
+
+ def do_execute(self, qmf_broker, ha_broker, opts, args):
+ if (opts.brokers): qmf_broker._method("setBrokers", {"url":opts.brokers}, HA_BROKER)
+ if (opts.public_brokers): qmf_broker._method("setPublicBrokers", {"url":opts.public_brokers}, HA_BROKER)
+ if (opts.backups): qmf_broker._method("setExpectedBackups", {"expectedBackups":opts.backups}, HA_BROKER)
+
+SetCmd()
+
+class QueryCmd(Command):
+ def __init__(self):
+ Command.__init__(self, "query", "Print HA configuration settings")
+
+ def do_execute(self, qmf_broker, ha_broker, opts, args):
+ hb = ha_broker
+ for x in [("Status:", hb.status),
+ ("Brokers URL:", hb.brokers),
+ ("Public URL:", hb.publicBrokers),
+ ("Expected Backups:", hb.expectedBackups),
+ ("Replicate: ", hb.replicateDefault)
+ ]:
+ print "%-20s %s"%(x[0], x[1])
+QueryCmd()
+
+def print_usage(prog):
+ print "usage: %s <command> [<arguments>]\n\nCommands are:\n"%prog
+ for name, command in Command.commands.iteritems():
+ help = command.help
+ print " %-12s %s."%(name, help.split(".")[0])
+ print "\nFor help with a command type: %s <command> --help\n"%prog
+
+def find_command(args):
+ """Find a command among the arguments and options"""
+ for arg in args:
+ if arg in Command.commands:
+ return Command.commands[arg]
+ return None
+
+def main(argv):
+ try:
+ args=argv[1:]
+ if args and args[0] == "--help-all":
+ for c in Command.commands.itervalues():
+ c.op.print_help(); print
+ return 1
+ command = find_command(args)
+ if not command:
+ print_usage(os.path.basename(argv[0]));
+ return 1;
+ if command.execute(): return 1
+ except Exception, e:
+ print e
+ return 1
+
+if __name__ == "__main__":
+ sys.exit(main(sys.argv))
diff --git a/tools/src/py/qpid-ha-tool b/tools/src/py/qpid-ha-tool
deleted file mode 100755
index 8e8107657c..0000000000
--- a/tools/src/py/qpid-ha-tool
+++ /dev/null
@@ -1,183 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-import qmf.console, optparse, sys
-from qpid.management import managementChannel, managementClient
-from qpid.messaging import Connection
-from qpid.messaging import Message as QpidMessage
-try:
- from uuid import uuid4
-except ImportError:
- from qpid.datatypes import uuid4
-
-# Utility for doing fast qmf2 operations on a broker.
-class QmfBroker(object):
- def __init__(self, conn):
- self.conn = conn
- self.sess = self.conn.session()
- self.reply_to = "qmf.default.topic/direct.%s;{node:{type:topic}, link:{x-declare:{auto-delete:True,exclusive:True}}}" % \
- str(uuid4())
- self.reply_rx = self.sess.receiver(self.reply_to)
- self.reply_rx.capacity = 10
- self.tx = self.sess.sender("qmf.default.direct/broker")
- self.next_correlator = 1
-
- def close(self):
- self.conn.close()
-
- def __repr__(self):
- return "Qpid Broker: %s" % self.url
-
- def _method(self, method, arguments, addr="org.apache.qpid.broker:broker:amqp-broker"):
- props = {'method' : 'request',
- 'qmf.opcode' : '_method_request',
- 'x-amqp-0-10.app-id' : 'qmf2'}
- correlator = str(self.next_correlator)
- self.next_correlator += 1
-
- content = {'_object_id' : {'_object_name' : addr},
- '_method_name' : method,
- '_arguments' : arguments}
-
- message = QpidMessage(content, reply_to=self.reply_to, correlation_id=correlator,
- properties=props, subject="broker")
- self.tx.send(message)
- response = self.reply_rx.fetch(10)
- if response.properties['qmf.opcode'] == '_exception':
- raise Exception("Exception from Agent: %r" % response.content['_values'])
- if response.properties['qmf.opcode'] != '_method_response':
- raise Exception("bad response: %r" % response.properties)
- return response.content['_arguments']
-
- def _sendRequest(self, opcode, content):
- props = {'method' : 'request',
- 'qmf.opcode' : opcode,
- 'x-amqp-0-10.app-id' : 'qmf2'}
- correlator = str(self.next_correlator)
- self.next_correlator += 1
- message = QpidMessage(content, reply_to=self.reply_to, correlation_id=correlator,
- properties=props, subject="broker")
- self.tx.send(message)
- return correlator
-
- def _doClassQuery(self, class_name):
- query = {'_what' : 'OBJECT',
- '_schema_id' : {'_class_name' : class_name}}
- correlator = self._sendRequest('_query_request', query)
- response = self.reply_rx.fetch(10)
- if response.properties['qmf.opcode'] != '_query_response':
- raise Exception("bad response")
- items = []
- done = False
- while not done:
- for item in response.content:
- items.append(item['_values'])
- if 'partial' in response.properties:
- response = self.reply_rx.fetch(10)
- else:
- done = True
- return items
-
- def _doNameQuery(self, class_name, object_name, package_name='org.apache.qpid.broker'):
- query = {'_what' : 'OBJECT',
- '_object_id' : {'_object_name' : "%s:%s:%s" % (package_name, class_name, object_name)}}
- correlator = self._sendRequest('_query_request', query)
- response = self.reply_rx.fetch(10)
- if response.properties['qmf.opcode'] != '_query_response':
- raise Exception("bad response")
- items = []
- done = False
- while not done:
- for item in response.content:
- items.append(item['_values'])
- if 'partial' in response.properties:
- response = self.reply_rx.fetch(10)
- else:
- done = True
- if len(items) == 1:
- return items[0]
- return None
-
- def _getAllBrokerObjects(self, cls):
- items = self._doClassQuery(cls.__name__.lower())
- objs = []
- for item in items:
- objs.append(cls(self, item))
- return objs
-
- def _getBrokerObject(self, cls, name):
- obj = self._doNameQuery(cls.__name__.lower(), name)
- if obj:
- return cls(self, obj)
- return None
-
-
-op=optparse.OptionParser(usage="Usage: %prog [options] [broker-address]")
-
-op.add_option("-p", "--promote", action="store_true",
- help="Promote a backup broker to become the primary.")
-op.add_option("-c", "--client-addresses", action="store", type="string",
- help="Set list of addresses used by clients to connect to the HA cluster.")
-op.add_option("-b", "--broker-addresses", action="store", type="string",
- help="Set list of addresses used by HA brokers to connect to each other.")
-op.add_option("-q", "--query", action="store_true",
- help="Show the current HA settings on the broker.")
-
-def get_ha_broker(qmf_broker):
- ha_brokers = qmf_broker._doClassQuery("habroker")
- if (not ha_brokers): raise Exception("Broker does not have HA enabled.")
- return ha_brokers[0]
-
-def main(argv):
- try:
- opts, args = op.parse_args(argv)
- if len(args) >1: broker = args[1]
- else: broker = "localhost:5672"
- conn = Connection.establish(broker, client_properties={"qpid.ha-admin":1})
- ha_broker = "org.apache.qpid.ha:habroker:ha-broker"
- try:
- qmf_broker = QmfBroker(conn)
- get_ha_broker(qmf_broker) # Verify that HA is enabled
- action=False
- if opts.promote:
- qmf_broker._method("promote", {}, ha_broker)
- action=True
- if opts.broker_addresses:
- qmf_broker._method('setBrokerAddresses', {'brokerAddresses':opts.broker_addresses}, ha_broker)
- action=True
- if opts.client_addresses:
- qmf_broker._method('setClientAddresses', {'clientAddresses':opts.client_addresses}, ha_broker)
- action=True
- if opts.query or not action:
- hb = get_ha_broker(qmf_broker)
- print "status=%s"%hb["status"]
- print "broker-addresses=%s"%hb["brokerAddresses"]
- print "client-addresses=%s"%hb["clientAddresses"]
- return 0
- finally:
- conn.close() # Avoid errors shutting down threads.
- except Exception, e:
- raise # FIXME aconway 2012-01-31:
- print e
- return 1
-
-if __name__ == "__main__":
- sys.exit(main(sys.argv))
diff --git a/tools/src/py/qpid-route b/tools/src/py/qpid-route
index f90416d7b0..0316c24322 100755
--- a/tools/src/py/qpid-route
+++ b/tools/src/py/qpid-route
@@ -62,6 +62,7 @@ class Config:
self._ack = 0
self._connTimeout = 10
self._client_sasl_mechanism = None
+ self._ha_admin = False
config = Config()
@@ -96,7 +97,7 @@ def OptionsAndArguments(argv):
parser.add_option("-t", "--transport", action="store", type="string", default="tcp", metavar="<transport>", help="Transport to use for links, defaults to tcp")
parser.add_option("--client-sasl-mechanism", action="store", type="string", metavar="<mech>", help="SASL mechanism for authentication (e.g. EXTERNAL, ANONYMOUS, PLAIN, CRAM-MD, DIGEST-MD5, GSSAPI). Used when the client connects to the destination broker (not for authentication between the source and destination brokers - that is specified using the [mechanisms] argument to 'add route'). SASL automatically picks the most secure available mechanism - use this option to override.")
-
+ parser.add_option("--ha-admin", action="store_true", help="Allow connection to a HA backup broker.")
opts, encArgs = parser.parse_args(args=argv)
try:
@@ -128,6 +129,9 @@ def OptionsAndArguments(argv):
if opts.transport:
config._transport = opts.transport
+ if opts.ha_admin:
+ config._ha_admin = True
+
if opts.ack:
config._ack = opts.ack
@@ -143,7 +147,9 @@ class RouteManager:
self.local = BrokerURL(localBroker)
self.remote = None
self.qmf = Session()
- self.broker = self.qmf.addBroker(localBroker, config._connTimeout, config._client_sasl_mechanism)
+ client_properties = {}
+ if config._ha_admin: client_properties["qpid.ha-admin"] = 1
+ self.broker = self.qmf.addBroker(localBroker, config._connTimeout, config._client_sasl_mechanism, client_properties=client_properties)
self.broker._waitForStable()
self.agent = self.broker.getBrokerAgent()
diff --git a/tools/src/py/qpid-stat b/tools/src/py/qpid-stat
index bb094554e6..5a816baf6e 100755
--- a/tools/src/py/qpid-stat
+++ b/tools/src/py/qpid-stat
@@ -30,8 +30,8 @@ from qpid.messaging import Connection
home = os.environ.get("QPID_TOOLS_HOME", os.path.normpath("/usr/share/qpid-tools"))
sys.path.append(os.path.join(home, "python"))
-from qpidtoollibs.broker import BrokerAgent
-from qpidtoollibs.disp import Display, Header, Sorter
+from qpidtoollibs import BrokerAgent
+from qpidtoollibs import Display, Header, Sorter, YN, Commas, TimeLong
class Config:
@@ -42,8 +42,8 @@ class Config:
self._limit = 50
self._increasing = False
self._sortcol = None
- self._details = None
self._sasl_mechanism = None
+ self._ha_admin = False
config = Config()
@@ -52,42 +52,45 @@ def OptionsAndArguments(argv):
global config
- parser = OptionParser(usage="usage: %prog [options] BROKER",
- description="Example: $ qpid-stat -q broker-host:10000")
+ parser = OptionParser(usage="usage: %prog [options] -[gcequm] [object-name]")
group1 = OptionGroup(parser, "General Options")
- group1.add_option("-t", "--timeout", action="store", type="int", default=10, metavar="<secs>", help="Maximum time to wait for broker connection (in seconds)")
- group1.add_option("--sasl-mechanism", action="store", type="string", metavar="<mech>", help="SASL mechanism for authentication (e.g. EXTERNAL, ANONYMOUS, PLAIN, CRAM-MD, DIGEST-MD5, GSSAPI). SASL automatically picks the most secure available mechanism - use this option to override.")
+ group1.add_option("-b", "--broker", action="store", type="string", default="localhost", metavar="<url>",
+ help="URL of the broker to query")
+ group1.add_option("-t", "--timeout", action="store", type="int", default=10, metavar="<secs>",
+ help="Maximum time to wait for broker connection (in seconds)")
+ group1.add_option("--sasl-mechanism", action="store", type="string", metavar="<mech>",
+ help="SASL mechanism for authentication (e.g. EXTERNAL, ANONYMOUS, PLAIN, CRAM-MD, DIGEST-MD5, GSSAPI). SASL automatically picks the most secure available mechanism - use this option to override.")
+ group1.add_option("--ha-admin", action="store_true", help="Allow connection to a HA backup broker.")
parser.add_option_group(group1)
group2 = OptionGroup(parser, "Display Options")
- group2.add_option("-b", "--broker", help="Show Brokers", action="store_const", const="b", dest="show")
- group2.add_option("-c", "--connections", help="Show Connections", action="store_const", const="c", dest="show")
- group2.add_option("-e", "--exchanges", help="Show Exchanges", action="store_const", const="e", dest="show")
- group2.add_option("-q", "--queues", help="Show Queues", action="store_const", const="q", dest="show")
- group2.add_option("-u", "--subscriptions", help="Show Subscriptions", action="store_const", const="u", dest="show")
- group2.add_option("-m", "--memory", help="Show Broker Memory Stats", action="store_const", const="m", dest="show")
+ group2.add_option("-g", "--general", help="Show General Broker Stats", action="store_const", const="g", dest="show")
+ group2.add_option("-c", "--connections", help="Show Connections", action="store_const", const="c", dest="show")
+ group2.add_option("-e", "--exchanges", help="Show Exchanges", action="store_const", const="e", dest="show")
+ group2.add_option("-q", "--queues", help="Show Queues", action="store_const", const="q", dest="show")
+ group2.add_option("-u", "--subscriptions", help="Show Subscriptions", action="store_const", const="u", dest="show")
+ group2.add_option("-m", "--memory", help="Show Broker Memory Stats", action="store_const", const="m", dest="show")
+ group2.add_option( "--acl", help="Show Access Control List Stats", action="store_const", const="acl", dest="show")
group2.add_option("-S", "--sort-by", metavar="<colname>", help="Sort by column name")
group2.add_option("-I", "--increasing", action="store_true", default=False, help="Sort by increasing value (default = decreasing)")
group2.add_option("-L", "--limit", type="int", default=50, metavar="<n>", help="Limit output to n rows")
- group2.add_option("-D", "--details", action="store", metavar="<name>", dest="detail", default=None, help="Display details on a single object.")
+
parser.add_option_group(group2)
opts, args = parser.parse_args(args=argv)
if not opts.show:
- parser.error("You must specify one of these options: -b, -c, -e, -q. or -u. For details, try $ qpid-stat --help")
+ parser.error("You must specify one of these options: -g, -c, -e, -q, -m, or -u. For details, try $ qpid-stat --help")
config._types = opts.show
config._sortcol = opts.sort_by
+ config._host = opts.broker
config._connTimeout = opts.timeout
config._increasing = opts.increasing
config._limit = opts.limit
config._sasl_mechanism = opts.sasl_mechanism
- config._detail = opts.detail
-
- if args:
- config._host = args[0]
+ config._ha_admin = opts.ha_admin
return args
@@ -118,24 +121,24 @@ class IpAddr:
class BrokerManager:
def __init__(self):
- self.brokerName = None
- self.connections = []
- self.brokers = []
- self.cluster = None
+ self.brokerName = None
+ self.connection = None
+ self.broker = None
+ self.cluster = None
def SetBroker(self, brokerUrl, mechanism):
self.url = brokerUrl
- self.connections.append(Connection(self.url, sasl_mechanism=mechanism))
- self.connections[0].open()
- self.brokers.append(BrokerAgent(self.connections[0]))
+ client_properties={}
+ if config._ha_admin: client_properties["qpid.ha-admin"] = 1
+ self.connection = Connection.establish(self.url, sasl_mechanisms=mechanism, client_properties=client_properties)
+ self.broker = BrokerAgent(self.connection)
def Disconnect(self):
""" Release any allocated brokers. Ignore any failures as the tool is
shutting down.
"""
try:
- for conn in self.connections:
- conn.close()
+ connection.close()
except:
pass
@@ -175,7 +178,7 @@ class BrokerManager:
hosts.append(bestUrl)
return hosts
- def displayBroker(self, subs):
+ def displayBroker(self):
disp = Display(prefix=" ")
heads = []
heads.append(Header('uptime', Header.DURATION))
@@ -184,7 +187,7 @@ class BrokerManager:
heads.append(Header('exchanges', Header.COMMAS))
heads.append(Header('queues', Header.COMMAS))
rows = []
- broker = self.brokers[0].getBroker()
+ broker = self.broker.getBroker()
connections = self.getConnectionMap()
sessions = self.getSessionMap()
exchanges = self.getExchangeMap()
@@ -229,7 +232,7 @@ class BrokerManager:
disp.formattedTable('Aggregate Broker Statistics:', heads, rows)
- def displayConn(self, subs):
+ def displayConn(self):
disp = Display(prefix=" ")
heads = []
heads.append(Header('client-addr'))
@@ -241,8 +244,8 @@ class BrokerManager:
heads.append(Header('msgIn', Header.KMG))
heads.append(Header('msgOut', Header.KMG))
rows = []
- connections = self.brokers[0].getAllConnections()
- broker = self.brokers[0].getBroker()
+ connections = self.broker.getAllConnections()
+ broker = self.broker.getBroker()
for conn in connections:
row = []
row.append(conn.address)
@@ -262,10 +265,10 @@ class BrokerManager:
dispRows = rows
disp.formattedTable(title, heads, dispRows)
- def displaySession(self, subs):
+ def displaySession(self):
disp = Display(prefix=" ")
- def displayExchange(self, subs):
+ def displayExchange(self):
disp = Display(prefix=" ")
heads = []
heads.append(Header("exchange"))
@@ -279,7 +282,7 @@ class BrokerManager:
heads.append(Header("byteOut", Header.KMG))
heads.append(Header("byteDrop", Header.KMG))
rows = []
- exchanges = self.brokers[0].getAllExchanges()
+ exchanges = self.broker.getAllExchanges()
for ex in exchanges:
row = []
row.append(ex.name)
@@ -301,7 +304,7 @@ class BrokerManager:
dispRows = rows
disp.formattedTable(title, heads, dispRows)
- def displayQueues(self, subs):
+ def displayQueues(self):
disp = Display(prefix=" ")
heads = []
heads.append(Header("queue"))
@@ -317,7 +320,7 @@ class BrokerManager:
heads.append(Header("cons", Header.KMG))
heads.append(Header("bind", Header.KMG))
rows = []
- queues = self.brokers[0].getAllQueues()
+ queues = self.broker.getAllQueues()
for q in queues:
row = []
row.append(q.name)
@@ -341,11 +344,67 @@ class BrokerManager:
dispRows = rows
disp.formattedTable(title, heads, dispRows)
- def displayQueue(self, subs):
+
+ def displayQueue(self, name):
+ queue = self.broker.getQueue(name)
+ if not queue:
+ print "Queue '%s' not found" % name
+ return
+
disp = Display(prefix=" ")
heads = []
+ heads.append(Header('Name'))
+ heads.append(Header('Durable', Header.YN))
+ heads.append(Header('AutoDelete', Header.YN))
+ heads.append(Header('Exclusive', Header.YN))
+ heads.append(Header('FlowStopped', Header.YN))
+ heads.append(Header('FlowStoppedCount', Header.COMMAS))
+ heads.append(Header('Consumers', Header.COMMAS))
+ heads.append(Header('Bindings', Header.COMMAS))
+ rows = []
+ rows.append([queue.name, queue.durable, queue.autoDelete, queue.exclusive,
+ queue.flowStopped, queue.flowStoppedCount,
+ queue.consumerCount, queue.bindingCount])
+ disp.formattedTable("Properties:", heads, rows)
+ print
+
+ heads = []
+ heads.append(Header('Property'))
+ heads.append(Header('Value'))
+ rows = []
+ rows.append(['arguments', queue.arguments])
+ rows.append(['alt-exchange', queue.altExchange])
+ disp.formattedTable("Optional Properties:", heads, rows)
+ print
- def displaySubscriptions(self, subs):
+ heads = []
+ heads.append(Header('Statistic'))
+ heads.append(Header('Messages', Header.COMMAS))
+ heads.append(Header('Bytes', Header.COMMAS))
+ rows = []
+ rows.append(['queue-depth', queue.msgDepth, queue.byteDepth])
+ rows.append(['total-enqueues', queue.msgTotalEnqueues, queue.byteTotalEnqueues])
+ rows.append(['total-dequeues', queue.msgTotalDequeues, queue.byteTotalDequeues])
+ rows.append(['persistent-enqueues', queue.msgPersistEnqueues, queue.bytePersistEnqueues])
+ rows.append(['persistent-dequeues', queue.msgPersistDequeues, queue.bytePersistDequeues])
+ rows.append(['transactional-enqueues', queue.msgTxnEnqueues, queue.byteTxnEnqueues])
+ rows.append(['transactional-dequeues', queue.msgTxnDequeues, queue.byteTxnDequeues])
+ rows.append(['flow-to-disk-depth', queue.msgFtdDepth, queue.byteFtdDepth])
+ rows.append(['flow-to-disk-enqueues', queue.msgFtdEnqueues, queue.byteFtdEnqueues])
+ rows.append(['flow-to-disk-dequeues', queue.msgFtdDequeues, queue.byteFtdDequeues])
+ rows.append(['acquires', queue.acquires, None])
+ rows.append(['releases', queue.releases, None])
+ rows.append(['discards-ttl-expired', queue.discardsTtl, None])
+ rows.append(['discards-limit-overflow', queue.discardsOverflow, None])
+ rows.append(['discards-ring-overflow', queue.discardsRing, None])
+ rows.append(['discards-lvq-replace', queue.discardsLvq, None])
+ rows.append(['discards-subscriber-reject', queue.discardsSubscriber, None])
+ rows.append(['discards-purged', queue.discardsPurge, None])
+ rows.append(['reroutes', queue.reroutes, None])
+ disp.formattedTable("Statistics:", heads, rows)
+
+
+ def displaySubscriptions(self):
disp = Display(prefix=" ")
heads = []
heads.append(Header("subscr"))
@@ -359,7 +418,7 @@ class BrokerManager:
heads.append(Header("creditMode"))
heads.append(Header("delivered", Header.KMG))
rows = []
- subscriptions = self.brokers[0].getAllSubscriptions()
+ subscriptions = self.broker.getAllSubscriptions()
sessions = self.getSessionMap()
connections = self.getConnectionMap()
for s in subscriptions:
@@ -388,59 +447,75 @@ class BrokerManager:
dispRows = rows
disp.formattedTable(title, heads, dispRows)
- def displayMemory(self, unused):
+ def displayMemory(self):
disp = Display(prefix=" ")
heads = [Header('Statistic'), Header('Value', Header.COMMAS)]
rows = []
- memory = self.brokers[0].getMemory()
+ memory = self.broker.getMemory()
for k,v in memory.values.items():
if k != 'name':
rows.append([k, v])
disp.formattedTable('Broker Memory Statistics:', heads, rows)
+ def displayAcl(self):
+ acl = self.broker.getAcl()
+ if not acl:
+ print "ACL Policy Module is not installed"
+ return
+ disp = Display(prefix=" ")
+ heads = [Header('Statistic'), Header('Value')]
+ rows = []
+ rows.append(['policy-file', acl.policyFile])
+ rows.append(['enforcing', YN(acl.enforcingAcl)])
+ rows.append(['has-transfer-acls', YN(acl.transferAcl)])
+ rows.append(['last-acl-load', TimeLong(acl.lastAclLoad)])
+ rows.append(['acl-denials', Commas(acl.aclDenyCount)])
+ disp.formattedTable('ACL Policy Statistics:', heads, rows)
+
def getExchangeMap(self):
- exchanges = self.brokers[0].getAllExchanges()
+ exchanges = self.broker.getAllExchanges()
emap = {}
for e in exchanges:
emap[e.name] = e
return emap
def getQueueMap(self):
- queues = self.brokers[0].getAllQueues()
+ queues = self.broker.getAllQueues()
qmap = {}
for q in queues:
qmap[q.name] = q
return qmap
def getSessionMap(self):
- sessions = self.brokers[0].getAllSessions()
+ sessions = self.broker.getAllSessions()
smap = {}
for s in sessions:
smap[s.name] = s
return smap
def getConnectionMap(self):
- connections = self.brokers[0].getAllConnections()
+ connections = self.broker.getAllConnections()
cmap = {}
for c in connections:
cmap[c.address] = c
return cmap
- def displayMain(self, main, subs):
- if main == 'b': self.displayBroker(subs)
- elif main == 'c': self.displayConn(subs)
- elif main == 's': self.displaySession(subs)
- elif main == 'e': self.displayExchange(subs)
+ def displayMain(self, names, main):
+ if main == 'g': self.displayBroker()
+ elif main == 'c': self.displayConn()
+ elif main == 's': self.displaySession()
+ elif main == 'e': self.displayExchange()
elif main == 'q':
- if config._detail:
- self.displayQueue(subs, config._detail)
+ if len(names) >= 1:
+ self.displayQueue(names[0])
else:
- self.displayQueues(subs)
- elif main == 'u': self.displaySubscriptions(subs)
- elif main == 'm': self.displayMemory(subs)
+ self.displayQueues()
+ elif main == 'u': self.displaySubscriptions()
+ elif main == 'm': self.displayMemory()
+ elif main == 'acl': self.displayAcl()
- def display(self):
- self.displayMain(config._types[0], config._types[1:])
+ def display(self, names):
+ self.displayMain(names, config._types)
def main(argv=None):
@@ -450,7 +525,7 @@ def main(argv=None):
try:
bm.SetBroker(config._host, config._sasl_mechanism)
- bm.display()
+ bm.display(args)
bm.Disconnect()
return 0
except KeyboardInterrupt:
diff --git a/tools/src/py/qpidtoollibs/__init__.py b/tools/src/py/qpidtoollibs/__init__.py
index 31d5a2ef58..2815bac22f 100644
--- a/tools/src/py/qpidtoollibs/__init__.py
+++ b/tools/src/py/qpidtoollibs/__init__.py
@@ -16,3 +16,7 @@
# specific language governing permissions and limitations
# under the License.
#
+
+from qpidtoollibs.broker import *
+from qpidtoollibs.disp import *
+
diff --git a/tools/src/py/qpidtoollibs/broker.py b/tools/src/py/qpidtoollibs/broker.py
index 6a380caf8d..0bae786306 100644
--- a/tools/src/py/qpidtoollibs/broker.py
+++ b/tools/src/py/qpidtoollibs/broker.py
@@ -24,6 +24,9 @@ except ImportError:
from qpid.datatypes import uuid4
class BrokerAgent(object):
+ """
+ Proxy for a manageable Qpid Broker - Invoke with an opened qpid.messaging.Connection.
+ """
def __init__(self, conn):
self.conn = conn
self.sess = self.conn.session()
@@ -35,6 +38,9 @@ class BrokerAgent(object):
self.next_correlator = 1
def close(self):
+ """
+ Close the proxy session. This will not affect the connection used in creating the object.
+ """
self.sess.close()
def _method(self, method, arguments, addr="org.apache.qpid.broker:broker:amqp-broker", timeout=10):
@@ -89,9 +95,8 @@ class BrokerAgent(object):
self.sess.acknowledge()
return items
- def _doNameQuery(self, class_name, object_name, package_name='org.apache.qpid.broker'):
- query = {'_what' : 'OBJECT',
- '_object_id' : {'_object_name' : "%s:%s:%s" % (package_name, class_name, object_name)}}
+ def _doNameQuery(self, object_id):
+ query = {'_what' : 'OBJECT', '_object_id' : {'_object_name' : object_id}}
correlator = self._sendRequest('_query_request', query)
response = self.reply_rx.fetch(10)
if response.properties['qmf.opcode'] != '_query_response':
@@ -116,65 +121,74 @@ class BrokerAgent(object):
for item in items:
objs.append(cls(self, item))
return objs
-
- def _getBrokerObject(self, cls, name):
- obj = self._doNameQuery(cls.__name__.lower(), name)
+
+ def _getBrokerObject(self, cls, oid):
+ obj = self._doNameQuery(oid)
if obj:
return cls(self, obj)
return None
- def getCluster(self):
- return self._getAllBrokerObjects(Cluster)
-
- def getBroker(self):
+ def _getSingleObject(self, cls):
#
# getAllBrokerObjects is used instead of getBrokerObject(Broker, 'amqp-broker') because
# of a bug that used to be in the broker whereby by-name queries did not return the
# object timestamps.
#
- brokers = self._getAllBrokerObjects(Broker)
- if brokers:
- return brokers[0]
+ objects = self._getAllBrokerObjects(cls)
+ if objects: return objects[0]
return None
- def getMemory(self):
- return self._getAllBrokerObjects(Memory)[0]
+ def getBroker(self):
+ """
+ Get the Broker object that contains broker-scope statistics and operations.
+ """
+ return self._getSingleObject(Broker)
+
+
+ def getCluster(self):
+ return self._getSingleObject(Cluster)
+
+ def getHaBroker(self):
+ return self._getSingleObject(HaBroker)
def getAllConnections(self):
return self._getAllBrokerObjects(Connection)
- def getConnection(self, name):
- return self._getBrokerObject(Connection, name)
+ def getConnection(self, oid):
+ return self._getBrokerObject(Connection, "org.apache.qpid.broker:connection:%s" % oid)
def getAllSessions(self):
return self._getAllBrokerObjects(Session)
- def getSession(self, name):
- return self._getBrokerObject(Session, name)
+ def getSession(self, oid):
+ return self._getBrokerObject(Session, "org.apache.qpid.broker:session:%s" % oid)
def getAllSubscriptions(self):
return self._getAllBrokerObjects(Subscription)
- def getSubscription(self, name):
- return self._getBrokerObject(Subscription, name)
+ def getSubscription(self, oid):
+ return self._getBrokerObject(Subscription, "org.apache.qpid.broker:subscription:%s" % oid)
def getAllExchanges(self):
return self._getAllBrokerObjects(Exchange)
def getExchange(self, name):
- return self._getBrokerObject(Exchange, name)
+ return self._getBrokerObject(Exchange, "org.apache.qpid.broker:exchange:%s" % name)
def getAllQueues(self):
return self._getAllBrokerObjects(Queue)
def getQueue(self, name):
- return self._getBrokerObject(Queue, name)
+ return self._getBrokerObject(Queue, "org.apache.qpid.broker:queue:%s" % name)
def getAllBindings(self):
return self._getAllBrokerObjects(Binding)
- def getBinding(self, exchange=None, queue=None):
- pass
+ def getAllLinks(self):
+ return self._getAllBrokerObjects(Link)
+
+ def getAcl(self):
+ return self._getSingleObject(Acl)
def echo(self, sequence, body):
"""Request a response to test the path to the management broker"""
@@ -204,23 +218,69 @@ class BrokerAgent(object):
"""Get the message timestamping configuration"""
pass
-# def addExchange(self, exchange_type, name, **kwargs):
-# pass
-
-# def delExchange(self, name):
-# pass
-
-# def addQueue(self, name, **kwargs):
-# pass
-
-# def delQueue(self, name):
-# pass
-
-# def bind(self, exchange, queue, key, **kwargs):
-# pass
-
-# def unbind(self, exchange, queue, key, **kwargs):
-# pass
+ def addExchange(self, exchange_type, name, options={}, **kwargs):
+ properties = {}
+ properties['exchange-type'] = exchange_type
+ for k,v in options.items():
+ properties[k] = v
+ for k,v in kwargs.items():
+ properties[k] = v
+ args = {'type': 'exchange',
+ 'name': name,
+ 'properties': properties,
+ 'strict': True}
+ self._method('create', args)
+
+ def delExchange(self, name):
+ args = {'type': 'exchange', 'name': name}
+ self._method('delete', args)
+
+ def addQueue(self, name, options={}, **kwargs):
+ properties = options
+ for k,v in kwargs.items():
+ properties[k] = v
+ args = {'type': 'queue',
+ 'name': name,
+ 'properties': properties,
+ 'strict': True}
+ self._method('create', args)
+
+ def delQueue(self, name):
+ args = {'type': 'queue', 'name': name}
+ self._method('delete', args)
+
+ def bind(self, exchange, queue, key, options={}, **kwargs):
+ properties = options
+ for k,v in kwargs.items():
+ properties[k] = v
+ args = {'type': 'binding',
+ 'name': "%s/%s/%s" % (exchange, queue, key),
+ 'properties': properties,
+ 'strict': True}
+ self._method('create', args)
+
+ def unbind(self, exchange, queue, key, **kwargs):
+ args = {'type': 'binding',
+ 'name': "%s/%s/%s" % (exchange, queue, key),
+ 'strict': True}
+ self._method('delete', args)
+
+ def reloadAclFile(self):
+ self._method('reloadACLFile', {}, "org.apache.qpid.acl:acl:org.apache.qpid.broker:broker:amqp-broker")
+
+ def acl_lookup(self, userName, action, aclObj, aclObjName, propMap):
+ args = {'userId': userName,
+ 'action': action,
+ 'object': aclObj,
+ 'objectName': aclObjName,
+ 'propertyMap': propMap}
+ return self._method('Lookup', args, "org.apache.qpid.acl:acl:org.apache.qpid.broker:broker:amqp-broker")
+
+ def acl_lookupPublish(self, userName, exchange, key):
+ args = {'userId': userName,
+ 'exchangeName': exchange,
+ 'routingKey': key}
+ return self._method('LookupPublish', args, "org.apache.qpid.acl:acl:org.apache.qpid.broker:broker:amqp-broker")
def create(self, _type, name, properties, strict):
"""Create an object of the specified type"""
@@ -230,9 +290,9 @@ class BrokerAgent(object):
"""Delete an object of the specified type"""
pass
- def query(self, _type, name):
+ def query(self, _type, oid):
"""Query the current state of an object"""
- return self._getBrokerObject(self, _type, name)
+ return self._getBrokerObject(self, _type, oid)
class BrokerObject(object):
@@ -255,6 +315,9 @@ class BrokerObject(object):
return full_name[colon+1:]
return value
+ def getObjectId(self):
+ return self.content['_object_id']['_object_name']
+
def getAttributes(self):
return self.values
@@ -271,7 +334,7 @@ class BrokerObject(object):
"""
Reload the property values from the agent.
"""
- refreshed = self.broker._getBrokerObject(self.__class__, self.name)
+ refreshed = self.broker._getBrokerObject(self.__class__, self.getObjectId())
if refreshed:
self.content = refreshed.content
self.values = self.content['_values']
@@ -282,6 +345,14 @@ class Broker(BrokerObject):
def __init__(self, broker, values):
BrokerObject.__init__(self, broker, values)
+class Cluster(BrokerObject):
+ def __init__(self, broker, values):
+ BrokerObject.__init__(self, broker, values)
+
+class HaBroker(BrokerObject):
+ def __init__(self, broker, values):
+ BrokerObject.__init__(self, broker, values)
+
class Memory(BrokerObject):
def __init__(self, broker, values):
BrokerObject.__init__(self, broker, values)
@@ -328,3 +399,10 @@ class Queue(BrokerObject):
self.broker._method("reroute", {'request':request,'useAltExchange':useAltExchange,'exchange':exchange,'filter':filter},
"org.apache.qpid.broker:queue:%s" % self.name)
+class Link(BrokerObject):
+ def __init__(self, broker, values):
+ BrokerObject.__init__(self, broker, values)
+
+class Acl(BrokerObject):
+ def __init__(self, broker, values):
+ BrokerObject.__init__(self, broker, values)
diff --git a/tools/src/py/qpidtoollibs/disp.py b/tools/src/py/qpidtoollibs/disp.py
index cb7d3da306..a0c77370a5 100644
--- a/tools/src/py/qpidtoollibs/disp.py
+++ b/tools/src/py/qpidtoollibs/disp.py
@@ -21,6 +21,31 @@
from time import strftime, gmtime
+def YN(val):
+ if val:
+ return 'Y'
+ return 'N'
+
+def Commas(value):
+ sval = str(value)
+ result = ""
+ while True:
+ if len(sval) == 0:
+ return result
+ left = sval[:-3]
+ right = sval[-3:]
+ result = right + result
+ if len(left) > 0:
+ result = ',' + result
+ sval = left
+
+def TimeLong(value):
+ return strftime("%c", gmtime(value / 1000000000))
+
+def TimeShort(value):
+ return strftime("%X", gmtime(value / 1000000000))
+
+
class Header:
""" """
NONE = 1
@@ -59,9 +84,9 @@ class Header:
return 'Y'
return ''
if self.format == Header.TIME_LONG:
- return strftime("%c", gmtime(value / 1000000000))
+ return TimeLong(value)
if self.format == Header.TIME_SHORT:
- return strftime("%X", gmtime(value / 1000000000))
+ return TimeShort(value)
if self.format == Header.DURATION:
if value < 0: value = 0
sec = value / 1000000000
@@ -78,17 +103,7 @@ class Header:
result += "%ds" % (sec % 60)
return result
if self.format == Header.COMMAS:
- sval = str(value)
- result = ""
- while True:
- if len(sval) == 0:
- return result
- left = sval[:-3]
- right = sval[-3:]
- result = right + result
- if len(left) > 0:
- result = ',' + result
- sval = left
+ return Commas(value)
except:
return "?"
diff --git a/wcf/src/Apache/Qpid/DtcPlugin/DtcPlugin.cpp b/wcf/src/Apache/Qpid/DtcPlugin/DtcPlugin.cpp
index 33d125e3c6..ec98289923 100644
--- a/wcf/src/Apache/Qpid/DtcPlugin/DtcPlugin.cpp
+++ b/wcf/src/Apache/Qpid/DtcPlugin/DtcPlugin.cpp
@@ -49,6 +49,7 @@
#include "qpid/client/AsyncSession.h"
#include "qpid/client/Connection.h"
+#include "qpid/framing/FieldValue.h"
#include <map>
@@ -472,13 +473,15 @@ INT ResourceManager::recover(XID *xids, long count, long flags) {
try {
// status if we can't talk to the broker
status = XAER_RMFAIL;
- std::vector<std::string> wireFormatXids;
DtxRecoverResult dtxrr = qpidSession.dtxRecover(true);
// status if we can't process the xids
status = XAER_RMERR;
- dtxrr.getInDoubt().collect(wireFormatXids);
+
+ std::vector<std::string> wireFormatXids(dtxrr.getInDoubt().size());
+ std::transform(dtxrr.getInDoubt().begin(), dtxrr.getInDoubt().end(), wireFormatXids.begin(), Array::get<std::string, Array::ValuePtr>);
+
size_t nXids = wireFormatXids.size();
if (nXids > 0) {